@platox/pivot-table 0.0.32 → 0.0.34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/es/dashboard-workbench/components/add-module-btn/index.d.ts +11 -0
- package/es/dashboard-workbench/components/add-module-btn/index.js +97 -0
- package/es/dashboard-workbench/components/add-module-btn/index.js.map +1 -0
- package/es/dashboard-workbench/components/add-module-modal/add-calendar-modal/custome-data.d.ts +20 -0
- package/es/dashboard-workbench/components/add-module-modal/add-calendar-modal/custome-data.js +178 -0
- package/es/dashboard-workbench/components/add-module-modal/add-calendar-modal/custome-data.js.map +1 -0
- package/es/dashboard-workbench/components/add-module-modal/add-calendar-modal/index.d.ts +17 -0
- package/es/dashboard-workbench/components/add-module-modal/add-calendar-modal/index.js +91 -0
- package/es/dashboard-workbench/components/add-module-modal/add-calendar-modal/index.js.map +1 -0
- package/es/dashboard-workbench/components/add-module-modal/add-chart-modal/custome-data.d.ts +27 -0
- package/es/dashboard-workbench/components/add-module-modal/add-chart-modal/custome-data.js +328 -0
- package/es/dashboard-workbench/components/add-module-modal/add-chart-modal/custome-data.js.map +1 -0
- package/es/dashboard-workbench/components/add-module-modal/add-chart-modal/custome-styles.d.ts +15 -0
- package/es/dashboard-workbench/components/add-module-modal/add-chart-modal/custome-styles.js +58 -0
- package/es/dashboard-workbench/components/add-module-modal/add-chart-modal/custome-styles.js.map +1 -0
- package/es/dashboard-workbench/components/add-module-modal/add-chart-modal/index.d.ts +20 -0
- package/es/dashboard-workbench/components/add-module-modal/add-chart-modal/index.js +123 -0
- package/es/dashboard-workbench/components/add-module-modal/add-chart-modal/index.js.map +1 -0
- package/es/dashboard-workbench/components/add-module-modal/add-statistics-modal/custome-data.d.ts +20 -0
- package/es/dashboard-workbench/components/add-module-modal/add-statistics-modal/custome-data.js +180 -0
- package/es/dashboard-workbench/components/add-module-modal/add-statistics-modal/custome-data.js.map +1 -0
- package/es/dashboard-workbench/components/add-module-modal/add-statistics-modal/custome-styles.d.ts +13 -0
- package/es/dashboard-workbench/components/add-module-modal/add-statistics-modal/custome-styles.js +119 -0
- package/es/dashboard-workbench/components/add-module-modal/add-statistics-modal/custome-styles.js.map +1 -0
- package/es/dashboard-workbench/components/add-module-modal/add-statistics-modal/index.d.ts +19 -0
- package/es/dashboard-workbench/components/add-module-modal/add-statistics-modal/index.js +120 -0
- package/es/dashboard-workbench/components/add-module-modal/add-statistics-modal/index.js.map +1 -0
- package/es/dashboard-workbench/components/add-module-modal/components/condition-modal/debounce-select.d.ts +12 -0
- package/es/dashboard-workbench/components/add-module-modal/components/condition-modal/debounce-select.js +44 -0
- package/es/dashboard-workbench/components/add-module-modal/components/condition-modal/debounce-select.js.map +1 -0
- package/es/dashboard-workbench/components/add-module-modal/components/condition-modal/index.d.ts +21 -0
- package/es/dashboard-workbench/components/add-module-modal/components/condition-modal/index.js +510 -0
- package/es/dashboard-workbench/components/add-module-modal/components/condition-modal/index.js.map +1 -0
- package/es/dashboard-workbench/components/add-module-modal/components/condition-modal/utils.d.ts +25 -0
- package/es/dashboard-workbench/components/add-module-modal/components/select-color/index.d.ts +12 -0
- package/es/dashboard-workbench/components/add-module-modal/components/select-color/index.js +45 -0
- package/es/dashboard-workbench/components/add-module-modal/components/select-color/index.js.map +1 -0
- package/es/dashboard-workbench/components/module-content/calendar-module/index.d.ts +14 -0
- package/es/dashboard-workbench/components/module-content/calendar-module/index.js +231 -0
- package/es/dashboard-workbench/components/module-content/calendar-module/index.js.map +1 -0
- package/es/dashboard-workbench/components/module-content/chart-module/base-chart/index.d.ts +8 -0
- package/es/dashboard-workbench/components/module-content/chart-module/base-chart/index.js +62 -0
- package/es/dashboard-workbench/components/module-content/chart-module/base-chart/index.js.map +1 -0
- package/es/dashboard-workbench/components/module-content/chart-module/index.d.ts +14 -0
- package/es/dashboard-workbench/components/module-content/chart-module/index.js +384 -0
- package/es/dashboard-workbench/components/module-content/chart-module/index.js.map +1 -0
- package/es/dashboard-workbench/components/module-content/chart-module/utils.d.ts +9 -0
- package/es/dashboard-workbench/components/module-content/chart-module/utils.js +200 -0
- package/es/dashboard-workbench/components/module-content/chart-module/utils.js.map +1 -0
- package/es/dashboard-workbench/components/module-content/index.d.ts +31 -0
- package/es/dashboard-workbench/components/module-content/index.js +81 -0
- package/es/dashboard-workbench/components/module-content/index.js.map +1 -0
- package/es/dashboard-workbench/components/module-content/statistics-module/index.d.ts +15 -0
- package/es/dashboard-workbench/components/module-content/statistics-module/index.js +305 -0
- package/es/dashboard-workbench/components/module-content/statistics-module/index.js.map +1 -0
- package/es/dashboard-workbench/components/module-content/statistics-module/utils.d.ts +4 -0
- package/es/dashboard-workbench/components/module-content/statistics-module/utils.js +41 -0
- package/es/dashboard-workbench/components/module-content/statistics-module/utils.js.map +1 -0
- package/es/dashboard-workbench/components/module-content/text-module/editor/index.d.ts +7 -0
- package/es/dashboard-workbench/components/module-content/text-module/editor/index.js +224 -0
- package/es/dashboard-workbench/components/module-content/text-module/editor/index.js.map +1 -0
- package/es/dashboard-workbench/components/module-content/text-module/editor/useDebounce.d.ts +2 -0
- package/es/dashboard-workbench/components/module-content/text-module/editor/useDebounce.js +24 -0
- package/es/dashboard-workbench/components/module-content/text-module/editor/useDebounce.js.map +1 -0
- package/es/dashboard-workbench/components/module-content/text-module/index.d.ts +7 -0
- package/es/dashboard-workbench/components/module-content/text-module/index.js +11 -0
- package/es/dashboard-workbench/components/module-content/text-module/index.js.map +1 -0
- package/es/dashboard-workbench/components/module-content/utils.d.ts +15 -0
- package/es/dashboard-workbench/components/module-content/utils.js +113 -0
- package/es/dashboard-workbench/components/module-content/utils.js.map +1 -0
- package/es/dashboard-workbench/components/module-header/index.d.ts +12 -0
- package/es/dashboard-workbench/components/module-header/index.js +115 -0
- package/es/dashboard-workbench/components/module-header/index.js.map +1 -0
- package/es/dashboard-workbench/context.d.ts +16 -0
- package/es/dashboard-workbench/context.js +21 -0
- package/es/dashboard-workbench/context.js.map +1 -0
- package/es/dashboard-workbench/icon/icon-bar-percentage.d.ts +2 -0
- package/es/dashboard-workbench/icon/icon-bar-percentage.js +17 -0
- package/es/dashboard-workbench/icon/icon-bar-percentage.js.map +1 -0
- package/es/dashboard-workbench/icon/icon-bar-pile.d.ts +2 -0
- package/es/dashboard-workbench/icon/icon-bar-pile.js +17 -0
- package/es/dashboard-workbench/icon/icon-bar-pile.js.map +1 -0
- package/es/dashboard-workbench/icon/icon-bar.d.ts +2 -0
- package/es/dashboard-workbench/icon/icon-bar.js +13 -0
- package/es/dashboard-workbench/icon/icon-bar.js.map +1 -0
- package/es/dashboard-workbench/icon/icon-calendar.d.ts +2 -0
- package/es/dashboard-workbench/icon/icon-calendar.js +40 -0
- package/es/dashboard-workbench/icon/icon-calendar.js.map +1 -0
- package/es/dashboard-workbench/icon/icon-drag.d.ts +2 -0
- package/es/dashboard-workbench/icon/icon-drag.js +25 -0
- package/es/dashboard-workbench/icon/icon-drag.js.map +1 -0
- package/es/dashboard-workbench/icon/icon-editor.d.ts +2 -0
- package/es/dashboard-workbench/icon/icon-editor.js +40 -0
- package/es/dashboard-workbench/icon/icon-editor.js.map +1 -0
- package/es/dashboard-workbench/icon/icon-line-smooth.d.ts +2 -0
- package/es/dashboard-workbench/icon/icon-line-smooth.js +28 -0
- package/es/dashboard-workbench/icon/icon-line-smooth.js.map +1 -0
- package/es/dashboard-workbench/icon/icon-line.d.ts +2 -0
- package/es/dashboard-workbench/icon/icon-line.js +28 -0
- package/es/dashboard-workbench/icon/icon-line.js.map +1 -0
- package/es/dashboard-workbench/icon/icon-move.d.ts +2 -0
- package/es/dashboard-workbench/icon/icon-move.js +25 -0
- package/es/dashboard-workbench/icon/icon-move.js.map +1 -0
- package/es/dashboard-workbench/icon/icon-pie-circular.d.ts +2 -0
- package/es/dashboard-workbench/icon/icon-pie-circular.js +30 -0
- package/es/dashboard-workbench/icon/icon-pie-circular.js.map +1 -0
- package/es/dashboard-workbench/icon/icon-pie.d.ts +2 -0
- package/es/dashboard-workbench/icon/icon-pie.js +24 -0
- package/es/dashboard-workbench/icon/icon-pie.js.map +1 -0
- package/es/dashboard-workbench/icon/icon-statistics.d.ts +2 -0
- package/es/dashboard-workbench/icon/icon-statistics.js +37 -0
- package/es/dashboard-workbench/icon/icon-statistics.js.map +1 -0
- package/es/dashboard-workbench/icon/icon-strip-bar-percentage.d.ts +2 -0
- package/es/dashboard-workbench/icon/icon-strip-bar-percentage.js +105 -0
- package/es/dashboard-workbench/icon/icon-strip-bar-percentage.js.map +1 -0
- package/es/dashboard-workbench/icon/icon-strip-bar-pile.d.ts +2 -0
- package/es/dashboard-workbench/icon/icon-strip-bar-pile.js +105 -0
- package/es/dashboard-workbench/icon/icon-strip-bar-pile.js.map +1 -0
- package/es/dashboard-workbench/icon/icon-strip-bar.d.ts +2 -0
- package/es/dashboard-workbench/icon/icon-strip-bar.js +57 -0
- package/es/dashboard-workbench/icon/icon-strip-bar.js.map +1 -0
- package/es/dashboard-workbench/index.d.ts +33 -0
- package/es/dashboard-workbench/index.js +435 -0
- package/es/dashboard-workbench/index.js.map +1 -0
- package/es/dashboard-workbench/lang/en-US.d.ts +146 -0
- package/es/dashboard-workbench/lang/en-US.js +157 -0
- package/es/dashboard-workbench/lang/en-US.js.map +1 -0
- package/es/dashboard-workbench/lang/index.d.ts +2 -0
- package/es/dashboard-workbench/lang/index.js +25 -0
- package/es/dashboard-workbench/lang/index.js.map +1 -0
- package/es/dashboard-workbench/lang/zh-CN.d.ts +146 -0
- package/es/dashboard-workbench/lang/zh-CN.js +157 -0
- package/es/dashboard-workbench/lang/zh-CN.js.map +1 -0
- package/es/dashboard-workbench/types.d.ts +22 -0
- package/es/dashboard-workbench/utils/index.d.ts +9 -0
- package/es/dashboard-workbench/utils/index.js +30 -0
- package/es/dashboard-workbench/utils/index.js.map +1 -0
- package/es/index.d.ts +1 -0
- package/es/index.js +5 -0
- package/es/index.js.map +1 -0
- package/es/style.css +1 -0
- package/package.json +27 -24
- package/umd/pivot-table.umd.cjs +178 -0
- package/umd/style.css +1 -0
- package/index.d.ts +0 -98
- package/lib/index.js +0 -52233
- package/lib/index.umd.cjs +0 -178
- package/lib/style.css +0 -1
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useMemo, useRef, useEffect } from "react";
|
|
3
|
+
import { withReact, Slate, Editable, useSlate, useFocused } from "slate-react";
|
|
4
|
+
import { createEditor, Editor, Range, Transforms, Element as Element$1 } from "slate";
|
|
5
|
+
import { withHistory } from "slate-history";
|
|
6
|
+
import { BoldOutlined, ItalicOutlined, UnderlineOutlined, OrderedListOutlined, UnorderedListOutlined, AlignLeftOutlined, AlignCenterOutlined, AlignRightOutlined, ColumnWidthOutlined } from "@ant-design/icons";
|
|
7
|
+
import { Button } from "antd";
|
|
8
|
+
import ReactDOM from "react-dom";
|
|
9
|
+
import useDebounce from "./useDebounce.js";
|
|
10
|
+
import { useTranslation } from "react-i18next";
|
|
11
|
+
/* empty css */
|
|
12
|
+
const LIST_TYPES = ["numbered-list", "bulleted-list"];
|
|
13
|
+
const TEXT_ALIGN_TYPES = ["left", "center", "right", "justify"];
|
|
14
|
+
const Portal = ({ children }) => {
|
|
15
|
+
return typeof document === "object" ? ReactDOM.createPortal(children, document.body) : null;
|
|
16
|
+
};
|
|
17
|
+
const BoxEditor = ({ defaultValue, onChange }) => {
|
|
18
|
+
const { t } = useTranslation();
|
|
19
|
+
const renderElement = useCallback(
|
|
20
|
+
(props) => /* @__PURE__ */ jsx(Element, { ...props }),
|
|
21
|
+
[]
|
|
22
|
+
);
|
|
23
|
+
const renderLeaf = useCallback(
|
|
24
|
+
(props) => /* @__PURE__ */ jsx(Leaf, { ...props }),
|
|
25
|
+
[]
|
|
26
|
+
);
|
|
27
|
+
const editor = useMemo(() => withHistory(withReact(createEditor())), []);
|
|
28
|
+
const debouncedOnChange = useDebounce((val) => {
|
|
29
|
+
onChange == null ? void 0 : onChange(val);
|
|
30
|
+
}, 300);
|
|
31
|
+
return /* @__PURE__ */ jsx("div", { style: { width: "100%", height: "100%" }, children: /* @__PURE__ */ jsxs(Slate, { editor, initialValue: defaultValue, onChange: debouncedOnChange, children: [
|
|
32
|
+
/* @__PURE__ */ jsx(HoveringToolbar, {}),
|
|
33
|
+
/* @__PURE__ */ jsx(
|
|
34
|
+
Editable,
|
|
35
|
+
{
|
|
36
|
+
style: { width: "100%", height: "100%", outline: "none" },
|
|
37
|
+
className: "prose prose-sm",
|
|
38
|
+
renderElement,
|
|
39
|
+
renderLeaf,
|
|
40
|
+
spellCheck: true,
|
|
41
|
+
autoFocus: true,
|
|
42
|
+
placeholder: t("pleaseEnter"),
|
|
43
|
+
onDOMBeforeInput: (event) => {
|
|
44
|
+
switch (event.inputType) {
|
|
45
|
+
case "formatBold":
|
|
46
|
+
event.preventDefault();
|
|
47
|
+
return toggleMark(editor, "bold");
|
|
48
|
+
case "formatItalic":
|
|
49
|
+
event.preventDefault();
|
|
50
|
+
return toggleMark(editor, "italic");
|
|
51
|
+
case "formatUnderline":
|
|
52
|
+
event.preventDefault();
|
|
53
|
+
return toggleMark(editor, "underlined");
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
)
|
|
58
|
+
] }) });
|
|
59
|
+
};
|
|
60
|
+
const toggleBlock = (editor, format) => {
|
|
61
|
+
const isActive = isBlockActive(
|
|
62
|
+
editor,
|
|
63
|
+
format,
|
|
64
|
+
TEXT_ALIGN_TYPES.includes(format) ? "align" : "type"
|
|
65
|
+
);
|
|
66
|
+
const isList = LIST_TYPES.includes(format);
|
|
67
|
+
Transforms.unwrapNodes(editor, {
|
|
68
|
+
match: (n) => !Editor.isEditor(n) && Element$1.isElement(n) && LIST_TYPES.includes(n.type) && // 使用类型断言
|
|
69
|
+
!TEXT_ALIGN_TYPES.includes(format),
|
|
70
|
+
split: true
|
|
71
|
+
});
|
|
72
|
+
const newProperties = {};
|
|
73
|
+
if (TEXT_ALIGN_TYPES.includes(format)) {
|
|
74
|
+
newProperties.align = isActive ? void 0 : format;
|
|
75
|
+
} else {
|
|
76
|
+
newProperties.type = isActive ? "paragraph" : isList ? "list-item" : format;
|
|
77
|
+
}
|
|
78
|
+
Transforms.setNodes(editor, newProperties);
|
|
79
|
+
if (!isActive && isList) {
|
|
80
|
+
const block = { type: format, children: [] };
|
|
81
|
+
Transforms.wrapNodes(editor, block);
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
const toggleMark = (editor, format) => {
|
|
85
|
+
const isActive = isMarkActive(editor, format);
|
|
86
|
+
if (isActive) {
|
|
87
|
+
Editor.removeMark(editor, format);
|
|
88
|
+
} else {
|
|
89
|
+
Editor.addMark(editor, format, true);
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
const isBlockActive = (editor, format, blockType = "type") => {
|
|
93
|
+
const { selection } = editor;
|
|
94
|
+
if (!selection) return false;
|
|
95
|
+
const [match] = Array.from(
|
|
96
|
+
Editor.nodes(editor, {
|
|
97
|
+
at: Editor.unhangRange(editor, selection),
|
|
98
|
+
match: (n) => !Editor.isEditor(n) && Element$1.isElement(n) && n[blockType] === format
|
|
99
|
+
// 使用类型断言
|
|
100
|
+
})
|
|
101
|
+
);
|
|
102
|
+
return !!match;
|
|
103
|
+
};
|
|
104
|
+
const isMarkActive = (editor, format) => {
|
|
105
|
+
const marks = Editor.marks(editor);
|
|
106
|
+
return marks ? marks[format] === true : false;
|
|
107
|
+
};
|
|
108
|
+
const Element = ({
|
|
109
|
+
attributes,
|
|
110
|
+
children,
|
|
111
|
+
element
|
|
112
|
+
}) => {
|
|
113
|
+
const style = { textAlign: element.align };
|
|
114
|
+
switch (element.type) {
|
|
115
|
+
case "block-quote":
|
|
116
|
+
return /* @__PURE__ */ jsx("blockquote", { style, ...attributes, children });
|
|
117
|
+
case "bulleted-list":
|
|
118
|
+
return /* @__PURE__ */ jsx("ul", { style, ...attributes, children });
|
|
119
|
+
case "heading-one":
|
|
120
|
+
return /* @__PURE__ */ jsx("h1", { style, ...attributes, children });
|
|
121
|
+
case "heading-two":
|
|
122
|
+
return /* @__PURE__ */ jsx("h2", { style, ...attributes, children });
|
|
123
|
+
case "list-item":
|
|
124
|
+
return /* @__PURE__ */ jsx("li", { style, ...attributes, children });
|
|
125
|
+
case "numbered-list":
|
|
126
|
+
return /* @__PURE__ */ jsx("ol", { style, ...attributes, children });
|
|
127
|
+
default:
|
|
128
|
+
return /* @__PURE__ */ jsx("p", { style, ...attributes, children });
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
const Leaf = ({
|
|
132
|
+
attributes,
|
|
133
|
+
children,
|
|
134
|
+
leaf
|
|
135
|
+
}) => {
|
|
136
|
+
if (leaf.bold) {
|
|
137
|
+
children = /* @__PURE__ */ jsx("strong", { children });
|
|
138
|
+
}
|
|
139
|
+
if (leaf.code) {
|
|
140
|
+
children = /* @__PURE__ */ jsx("code", { children });
|
|
141
|
+
}
|
|
142
|
+
if (leaf.italic) {
|
|
143
|
+
children = /* @__PURE__ */ jsx("em", { children });
|
|
144
|
+
}
|
|
145
|
+
if (leaf.underline) {
|
|
146
|
+
children = /* @__PURE__ */ jsx("u", { children });
|
|
147
|
+
}
|
|
148
|
+
return /* @__PURE__ */ jsx("span", { ...attributes, children });
|
|
149
|
+
};
|
|
150
|
+
const HoveringToolbar = () => {
|
|
151
|
+
const ref = useRef(null);
|
|
152
|
+
const editor = useSlate();
|
|
153
|
+
const inFocus = useFocused();
|
|
154
|
+
useEffect(() => {
|
|
155
|
+
const el = ref.current;
|
|
156
|
+
const { selection } = editor;
|
|
157
|
+
if (!el) {
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
if (!selection || !inFocus || Range.isCollapsed(selection) || Editor.string(editor, selection) === "") {
|
|
161
|
+
el.removeAttribute("style");
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
const domSelection = window.getSelection();
|
|
165
|
+
const domRange = domSelection == null ? void 0 : domSelection.getRangeAt(0);
|
|
166
|
+
const rect = domRange == null ? void 0 : domRange.getBoundingClientRect();
|
|
167
|
+
el.style.opacity = "1";
|
|
168
|
+
if (rect) {
|
|
169
|
+
el.style.top = `${rect.top + window.pageYOffset - el.offsetHeight}px`;
|
|
170
|
+
el.style.left = `${rect.left + window.pageXOffset - el.offsetWidth / 2 + rect.width / 2}px`;
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
return /* @__PURE__ */ jsx(Portal, { children: /* @__PURE__ */ jsxs(
|
|
174
|
+
"div",
|
|
175
|
+
{
|
|
176
|
+
ref,
|
|
177
|
+
className: "editor-menu",
|
|
178
|
+
onMouseDown: (e) => {
|
|
179
|
+
e.preventDefault();
|
|
180
|
+
},
|
|
181
|
+
children: [
|
|
182
|
+
/* @__PURE__ */ jsx(FormatButton, { format: "bold", icon: /* @__PURE__ */ jsx(BoldOutlined, {}) }),
|
|
183
|
+
/* @__PURE__ */ jsx(FormatButton, { format: "italic", icon: /* @__PURE__ */ jsx(ItalicOutlined, {}) }),
|
|
184
|
+
/* @__PURE__ */ jsx(FormatButton, { format: "underline", icon: /* @__PURE__ */ jsx(UnderlineOutlined, {}) }),
|
|
185
|
+
/* @__PURE__ */ jsx(BlockButton, { format: "numbered-list", icon: /* @__PURE__ */ jsx(OrderedListOutlined, {}) }),
|
|
186
|
+
/* @__PURE__ */ jsx(BlockButton, { format: "bulleted-list", icon: /* @__PURE__ */ jsx(UnorderedListOutlined, {}) }),
|
|
187
|
+
/* @__PURE__ */ jsx(BlockButton, { format: "left", icon: /* @__PURE__ */ jsx(AlignLeftOutlined, {}) }),
|
|
188
|
+
/* @__PURE__ */ jsx(BlockButton, { format: "center", icon: /* @__PURE__ */ jsx(AlignCenterOutlined, {}) }),
|
|
189
|
+
/* @__PURE__ */ jsx(BlockButton, { format: "right", icon: /* @__PURE__ */ jsx(AlignRightOutlined, {}) }),
|
|
190
|
+
/* @__PURE__ */ jsx(BlockButton, { format: "justify", icon: /* @__PURE__ */ jsx(ColumnWidthOutlined, {}) })
|
|
191
|
+
]
|
|
192
|
+
}
|
|
193
|
+
) });
|
|
194
|
+
};
|
|
195
|
+
const FormatButton = ({ format, icon }) => {
|
|
196
|
+
const editor = useSlate();
|
|
197
|
+
return /* @__PURE__ */ jsx(
|
|
198
|
+
Button,
|
|
199
|
+
{
|
|
200
|
+
onClick: () => toggleMark(editor, format),
|
|
201
|
+
icon,
|
|
202
|
+
color: isMarkActive(editor, format) ? "primary" : "default",
|
|
203
|
+
variant: "text"
|
|
204
|
+
}
|
|
205
|
+
);
|
|
206
|
+
};
|
|
207
|
+
const BlockButton = ({ format, icon }) => {
|
|
208
|
+
const editor = useSlate();
|
|
209
|
+
return /* @__PURE__ */ jsx(
|
|
210
|
+
Button,
|
|
211
|
+
{
|
|
212
|
+
color: isBlockActive(editor, format, TEXT_ALIGN_TYPES.includes(format) ? "align" : "type") ? "primary" : "default",
|
|
213
|
+
icon,
|
|
214
|
+
variant: "text",
|
|
215
|
+
onClick: () => {
|
|
216
|
+
toggleBlock(editor, format);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
);
|
|
220
|
+
};
|
|
221
|
+
export {
|
|
222
|
+
BoxEditor as default
|
|
223
|
+
};
|
|
224
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../../packages/dashboard-workbench/components/module-content/text-module/editor/index.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport React, { useMemo, useRef, useEffect, ReactNode, useCallback } from 'react'\nimport { Slate, Editable, withReact, useSlate, useFocused } from 'slate-react'\nimport {\n Editor,\n createEditor,\n Transforms,\n Range,\n Element as SlateElement,\n BaseElement,\n} from 'slate'\nimport { withHistory } from 'slate-history'\nimport {\n AlignCenterOutlined,\n AlignLeftOutlined,\n AlignRightOutlined,\n BoldOutlined,\n ColumnWidthOutlined,\n ItalicOutlined,\n OrderedListOutlined,\n UnderlineOutlined,\n UnorderedListOutlined,\n} from '@ant-design/icons'\nimport { Button } from 'antd'\nimport ReactDOM from 'react-dom'\nimport { JSX } from 'react/jsx-runtime'\nimport useDebounce from './useDebounce'\nimport { useTranslation } from 'react-i18next'\nimport './prose.css'\n\ninterface CustomElement extends BaseElement {\n type: string // 你需要的类型\n align?: string // 如果你有对齐属性\n}\n\nconst LIST_TYPES = ['numbered-list', 'bulleted-list']\nconst TEXT_ALIGN_TYPES = ['left', 'center', 'right', 'justify']\n\nconst Portal = ({ children }: { children?: ReactNode }) => {\n return typeof document === 'object' ? ReactDOM.createPortal(children, document.body) : null\n}\n\ninterface FormatButtonProps {\n format: string\n\n icon: any\n}\n\ninterface EditorProps {\n defaultValue: any\n onChange: (val: unknown) => void\n}\n\nconst BoxEditor: React.FC<EditorProps> = ({ defaultValue, onChange }) => {\n const { t } = useTranslation()\n const renderElement = useCallback(\n (\n props: JSX.IntrinsicAttributes & {\n attributes: any\n children: any\n element: any\n }\n ) => <Element {...props} />,\n []\n )\n const renderLeaf = useCallback(\n (\n props: JSX.IntrinsicAttributes & {\n attributes: any\n children: any\n leaf: any\n }\n ) => <Leaf {...props} />,\n []\n )\n const editor = useMemo(() => withHistory(withReact(createEditor())), [])\n\n const debouncedOnChange = useDebounce((val: any) => {\n onChange?.(val)\n }, 300) // 300 毫秒的延迟\n\n return (\n <div style={{ width: '100%', height: '100%' }}>\n <Slate editor={editor} initialValue={defaultValue} onChange={debouncedOnChange}>\n <HoveringToolbar />\n <Editable\n style={{ width: '100%', height: '100%', outline: 'none' }}\n className=\"prose prose-sm\"\n renderElement={renderElement}\n renderLeaf={renderLeaf}\n spellCheck\n autoFocus\n placeholder={t('pleaseEnter')}\n onDOMBeforeInput={(event: InputEvent) => {\n switch (event.inputType) {\n case 'formatBold':\n event.preventDefault()\n return toggleMark(editor, 'bold')\n case 'formatItalic':\n event.preventDefault()\n return toggleMark(editor, 'italic')\n case 'formatUnderline':\n event.preventDefault()\n return toggleMark(editor, 'underlined')\n }\n }}\n />\n </Slate>\n </div>\n )\n}\n\n// 更新 toggleBlock 函数\nconst toggleBlock = (editor: Editor, format: string) => {\n const isActive = isBlockActive(\n editor,\n format,\n TEXT_ALIGN_TYPES.includes(format) ? 'align' : 'type'\n )\n const isList = LIST_TYPES.includes(format)\n\n Transforms.unwrapNodes(editor, {\n match: n =>\n !Editor.isEditor(n) &&\n SlateElement.isElement(n) &&\n LIST_TYPES.includes((n as CustomElement).type) && // 使用类型断言\n !TEXT_ALIGN_TYPES.includes(format),\n split: true,\n })\n\n const newProperties: Partial<CustomElement> = {}\n if (TEXT_ALIGN_TYPES.includes(format)) {\n newProperties.align = isActive ? undefined : format\n } else {\n newProperties.type = isActive ? 'paragraph' : isList ? 'list-item' : format\n }\n Transforms.setNodes<CustomElement>(editor, newProperties)\n\n if (!isActive && isList) {\n const block: CustomElement = { type: format, children: [] }\n Transforms.wrapNodes(editor, block)\n }\n}\n\nconst toggleMark = (editor: Editor, format: string) => {\n const isActive = isMarkActive(editor, format)\n\n if (isActive) {\n Editor.removeMark(editor, format)\n } else {\n Editor.addMark(editor, format, true)\n }\n}\n\n// 更新 isBlockActive 函数\nconst isBlockActive = (editor: Editor, format: string, blockType = 'type') => {\n const { selection } = editor\n if (!selection) return false\n\n const [match] = Array.from(\n Editor.nodes(editor, {\n at: Editor.unhangRange(editor, selection),\n match: n =>\n !Editor.isEditor(n) && SlateElement.isElement(n) && (n as any)[blockType] === format, // 使用类型断言\n })\n )\n\n return !!match\n}\n\nconst isMarkActive = (editor: Editor, format: string) => {\n const marks: any = Editor.marks(editor)\n return marks ? marks[format] === true : false\n}\n\nconst Element = ({\n attributes,\n children,\n element,\n}: {\n attributes: any\n\n children: any\n\n element: any\n}) => {\n const style = { textAlign: element.align }\n switch (element.type) {\n case 'block-quote':\n return (\n <blockquote style={style} {...attributes}>\n {children}\n </blockquote>\n )\n case 'bulleted-list':\n return (\n <ul style={style} {...attributes}>\n {children}\n </ul>\n )\n case 'heading-one':\n return (\n <h1 style={style} {...attributes}>\n {children}\n </h1>\n )\n case 'heading-two':\n return (\n <h2 style={style} {...attributes}>\n {children}\n </h2>\n )\n case 'list-item':\n return (\n <li style={style} {...attributes}>\n {children}\n </li>\n )\n case 'numbered-list':\n return (\n <ol style={style} {...attributes}>\n {children}\n </ol>\n )\n default:\n return (\n <p style={style} {...attributes}>\n {children}\n </p>\n )\n }\n}\n\nconst Leaf = ({\n attributes,\n children,\n leaf,\n}: {\n attributes: any\n\n children: any\n\n leaf: any\n}) => {\n if (leaf.bold) {\n children = <strong>{children}</strong>\n }\n\n if (leaf.code) {\n children = <code>{children}</code>\n }\n\n if (leaf.italic) {\n children = <em>{children}</em>\n }\n\n if (leaf.underline) {\n children = <u>{children}</u>\n }\n\n return <span {...attributes}>{children}</span>\n}\n\nconst HoveringToolbar = () => {\n const ref = useRef<HTMLDivElement>(null)\n const editor = useSlate()\n const inFocus = useFocused()\n\n useEffect(() => {\n const el = ref.current\n const { selection } = editor\n\n if (!el) {\n return\n }\n\n if (\n !selection ||\n !inFocus ||\n Range.isCollapsed(selection) ||\n Editor.string(editor, selection) === ''\n ) {\n el.removeAttribute('style')\n return\n }\n\n const domSelection = window.getSelection()\n const domRange = domSelection?.getRangeAt(0)\n const rect = domRange?.getBoundingClientRect()\n el.style.opacity = '1'\n if (rect) {\n el.style.top = `${rect.top + window.pageYOffset - el.offsetHeight}px`\n el.style.left = `${rect.left + window.pageXOffset - el.offsetWidth / 2 + rect.width / 2}px`\n }\n })\n\n return (\n <Portal>\n <div\n ref={ref}\n className=\"editor-menu\"\n onMouseDown={e => {\n // prevent toolbar from taking focus away from editor\n e.preventDefault()\n }}\n >\n <FormatButton format=\"bold\" icon={<BoldOutlined />} />\n <FormatButton format=\"italic\" icon={<ItalicOutlined />} />\n <FormatButton format=\"underline\" icon={<UnderlineOutlined />} />\n <BlockButton format=\"numbered-list\" icon={<OrderedListOutlined />} />\n <BlockButton format=\"bulleted-list\" icon={<UnorderedListOutlined />} />\n <BlockButton format=\"left\" icon={<AlignLeftOutlined />} />\n <BlockButton format=\"center\" icon={<AlignCenterOutlined />} />\n <BlockButton format=\"right\" icon={<AlignRightOutlined />} />\n <BlockButton format=\"justify\" icon={<ColumnWidthOutlined />} />\n </div>\n </Portal>\n )\n}\n\nconst FormatButton: React.FC<FormatButtonProps> = ({ format, icon }) => {\n const editor = useSlate()\n return (\n <Button\n onClick={() => toggleMark(editor, format)}\n icon={icon}\n color={isMarkActive(editor, format) ? 'primary' : 'default'}\n variant=\"text\"\n ></Button>\n )\n}\n\nconst BlockButton: React.FC<FormatButtonProps> = ({ format, icon }) => {\n const editor = useSlate()\n return (\n <Button\n color={\n isBlockActive(editor, format, TEXT_ALIGN_TYPES.includes(format) ? 'align' : 'type')\n ? 'primary'\n : 'default'\n }\n icon={icon}\n variant=\"text\"\n onClick={() => {\n toggleBlock(editor, format)\n }}\n ></Button>\n )\n}\n\nexport default BoxEditor\n"],"names":["SlateElement"],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { useRef, useEffect } from "react";
|
|
2
|
+
const useDebounce = (callback, delay) => {
|
|
3
|
+
const timeoutRef = useRef(null);
|
|
4
|
+
const debouncedCallback = (...args) => {
|
|
5
|
+
if (timeoutRef.current) {
|
|
6
|
+
clearTimeout(timeoutRef.current);
|
|
7
|
+
}
|
|
8
|
+
timeoutRef.current = setTimeout(() => {
|
|
9
|
+
callback(...args);
|
|
10
|
+
}, delay);
|
|
11
|
+
};
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
return () => {
|
|
14
|
+
if (timeoutRef.current) {
|
|
15
|
+
clearTimeout(timeoutRef.current);
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
}, []);
|
|
19
|
+
return debouncedCallback;
|
|
20
|
+
};
|
|
21
|
+
export {
|
|
22
|
+
useDebounce as default
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=useDebounce.js.map
|
package/es/dashboard-workbench/components/module-content/text-module/editor/useDebounce.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDebounce.js","sources":["../../../../../../packages/dashboard-workbench/components/module-content/text-module/editor/useDebounce.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { useEffect, useRef } from 'react'\n\nconst useDebounce = <T extends (...args: any[]) => void>(\n callback: T,\n delay: number\n): ((...args: Parameters<T>) => void) => {\n const timeoutRef = useRef<any | null>(null)\n\n const debouncedCallback = (...args: Parameters<T>) => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n timeoutRef.current = setTimeout(() => {\n callback(...args)\n }, delay)\n }\n\n useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n }\n }, [])\n\n return debouncedCallback\n}\n\nexport default useDebounce\n"],"names":[],"mappings":";AAGM,MAAA,cAAc,CAClB,UACA,UACuC;AACjC,QAAA,aAAa,OAAmB,IAAI;AAEpC,QAAA,oBAAoB,IAAI,SAAwB;AACpD,QAAI,WAAW,SAAS;AACtB,mBAAa,WAAW,OAAO;AAAA,IAAA;AAEtB,eAAA,UAAU,WAAW,MAAM;AACpC,eAAS,GAAG,IAAI;AAAA,OACf,KAAK;AAAA,EACV;AAEA,YAAU,MAAM;AACd,WAAO,MAAM;AACX,UAAI,WAAW,SAAS;AACtB,qBAAa,WAAW,OAAO;AAAA,MAAA;AAAA,IAEnC;AAAA,EACF,GAAG,EAAE;AAEE,SAAA;AACT;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import React from "react";
|
|
3
|
+
import BoxEditor from "./editor/index.js";
|
|
4
|
+
const TextModule = ({ defaultValue, onChange }) => {
|
|
5
|
+
return /* @__PURE__ */ jsx("div", { style: { width: "100%", height: "100%", overflowY: "auto", padding: "0 10px" }, children: /* @__PURE__ */ jsx(BoxEditor, { defaultValue, onChange }) });
|
|
6
|
+
};
|
|
7
|
+
const TextModule$1 = React.memo(TextModule);
|
|
8
|
+
export {
|
|
9
|
+
TextModule$1 as default
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../packages/dashboard-workbench/components/module-content/text-module/index.tsx"],"sourcesContent":["import React from 'react'\nimport Editor from './editor'\n\ninterface TextModuleProps {\n defaultValue: unknown\n onChange: (val: unknown) => void\n}\n\nconst TextModule: React.FC<TextModuleProps> = ({ defaultValue, onChange }) => {\n return (\n <div style={{ width: '100%', height: '100%', overflowY: 'auto', padding: '0 10px' }}>\n <Editor defaultValue={defaultValue} onChange={onChange} />\n </div>\n )\n}\n\nexport default React.memo(TextModule)\n"],"names":["Editor"],"mappings":";;;AAQA,MAAM,aAAwC,CAAC,EAAE,cAAc,eAAe;AAC5E,6BACG,OAAI,EAAA,OAAO,EAAE,OAAO,QAAQ,QAAQ,QAAQ,WAAW,QAAQ,SAAS,YACvE,8BAACA,WAAO,EAAA,cAA4B,SAAoB,CAAA,GAC1D;AAEJ;AAEA,MAAA,eAAe,MAAM,KAAK,UAAU;"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
type Condition = {
|
|
2
|
+
field: string;
|
|
3
|
+
condition: string;
|
|
4
|
+
val?: string | number;
|
|
5
|
+
val2?: string | number;
|
|
6
|
+
rdate?: any;
|
|
7
|
+
type?: any;
|
|
8
|
+
};
|
|
9
|
+
type ConditionType = 'all' | 'any';
|
|
10
|
+
export interface FilterData {
|
|
11
|
+
conditionList: Condition[];
|
|
12
|
+
conditionType: ConditionType;
|
|
13
|
+
}
|
|
14
|
+
export declare const mapConditionsToPostgrest: (filterData: FilterData) => string;
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import dayjs from "dayjs";
|
|
2
|
+
function getRDate({ rdate, u, field, value }) {
|
|
3
|
+
if (rdate) {
|
|
4
|
+
switch (rdate) {
|
|
5
|
+
case "exactdate":
|
|
6
|
+
return `${field}${u}eq.${value}`;
|
|
7
|
+
case "today":
|
|
8
|
+
return `${field}${u}eq.${dayjs().format("YYYY-MM-DD")}`;
|
|
9
|
+
case "yesterday":
|
|
10
|
+
return `${field}${u}eq.${dayjs().subtract(1, "day").format("YYYY-MM-DD")}`;
|
|
11
|
+
case "thisweek":
|
|
12
|
+
return `${field}${u}gte.${dayjs().startOf("week").add(1, "day").format("YYYY-MM-DD")}&${field}${u}lte.${dayjs().endOf("week").add(1, "day").format("YYYY-MM-DD")}`;
|
|
13
|
+
case "lastweek": {
|
|
14
|
+
const startOfLastWeek = dayjs().subtract(1, "week").startOf("week").add(1, "day");
|
|
15
|
+
const endOfLastWeek = dayjs().subtract(1, "week").endOf("week").add(1, "day");
|
|
16
|
+
return `${field}${u}gte.${startOfLastWeek.format(
|
|
17
|
+
"YYYY-MM-DD"
|
|
18
|
+
)}&${field}${u}lte.${endOfLastWeek.format("YYYY-MM-DD")}`;
|
|
19
|
+
}
|
|
20
|
+
case "thismonth":
|
|
21
|
+
return `${field}${u}gte.${dayjs().startOf("month").format("YYYY-MM-DD")}&${field}${u}lte.${dayjs().endOf("month").format("YYYY-MM-DD")}`;
|
|
22
|
+
case "lastmonth": {
|
|
23
|
+
const startOfLastMonth = dayjs().subtract(1, "month").startOf("month");
|
|
24
|
+
const endOfLastMonth = dayjs().subtract(1, "month").endOf("month");
|
|
25
|
+
return `${field}${u}gte.${startOfLastMonth.format(
|
|
26
|
+
"YYYY-MM-DD"
|
|
27
|
+
)}&${field}${u}lte.${endOfLastMonth.format("YYYY-MM-DD")}`;
|
|
28
|
+
}
|
|
29
|
+
case "last7days":
|
|
30
|
+
return `${field}${u}gte.${dayjs().subtract(7, "days").format("YYYY-MM-DD")}&${field}${u}lte.${dayjs().format("YYYY-MM-DD")}`;
|
|
31
|
+
case "last30days":
|
|
32
|
+
return `${field}${u}gte.${dayjs().subtract(30, "days").format("YYYY-MM-DD")}&${field}${u}lte.${dayjs().format("YYYY-MM-DD")}`;
|
|
33
|
+
default:
|
|
34
|
+
return "";
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
const mapConditionsToPostgrest = (filterData) => {
|
|
39
|
+
const { conditionList, conditionType = "all" } = filterData;
|
|
40
|
+
const u = conditionType === "all" ? "=" : ".";
|
|
41
|
+
const conditionStrings = conditionList.map((condition) => {
|
|
42
|
+
const { field, condition: cond, val, val2, rdate, type } = condition;
|
|
43
|
+
const value = (val == null ? void 0 : val.value) ? val == null ? void 0 : val.value : val;
|
|
44
|
+
switch (cond) {
|
|
45
|
+
case "=":
|
|
46
|
+
if (type !== "timestamp") {
|
|
47
|
+
return `${field}${u}eq.${value}`;
|
|
48
|
+
} else {
|
|
49
|
+
if (rdate === "exactdate") {
|
|
50
|
+
return `${field}${u}eq.${value}`;
|
|
51
|
+
} else {
|
|
52
|
+
return getRDate({ rdate, u, field, value });
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
case "!=":
|
|
56
|
+
return `${field}${u}neq.${value}`;
|
|
57
|
+
case "include":
|
|
58
|
+
return `${field}${u}cs.{${value}}`;
|
|
59
|
+
case "notinclude":
|
|
60
|
+
return `${field}${u}not.cs.{${value}}`;
|
|
61
|
+
case ">":
|
|
62
|
+
if (rdate === "today") {
|
|
63
|
+
return `${field}${u}gt.${(/* @__PURE__ */ new Date()).toISOString().split("T")[0]}`;
|
|
64
|
+
}
|
|
65
|
+
if (rdate === "yesterday") {
|
|
66
|
+
const yesterday = /* @__PURE__ */ new Date();
|
|
67
|
+
yesterday.setDate(yesterday.getDate() - 1);
|
|
68
|
+
return `${field}${u}gt.${yesterday.toISOString().split("T")[0]}`;
|
|
69
|
+
}
|
|
70
|
+
return `${field}${u}gt.${value}`;
|
|
71
|
+
case ">=":
|
|
72
|
+
return `${field}${u}gte.${value}`;
|
|
73
|
+
case "<":
|
|
74
|
+
if (rdate === "today") {
|
|
75
|
+
return `${field}${u}lt.${(/* @__PURE__ */ new Date()).toISOString().split("T")[0]}`;
|
|
76
|
+
}
|
|
77
|
+
if (rdate === "yesterday") {
|
|
78
|
+
const yesterday = /* @__PURE__ */ new Date();
|
|
79
|
+
yesterday.setDate(yesterday.getDate() - 1);
|
|
80
|
+
return `${field}${u}lt.${yesterday.toISOString().split("T")[0]}`;
|
|
81
|
+
}
|
|
82
|
+
return `${field}${u}lt.${value}`;
|
|
83
|
+
case "<=":
|
|
84
|
+
return `${field}${u}lte.${value}`;
|
|
85
|
+
case "contain":
|
|
86
|
+
if (value && val2) {
|
|
87
|
+
return `${field}${u}gte.${value},${field}.lte.${val2}`;
|
|
88
|
+
}
|
|
89
|
+
return "";
|
|
90
|
+
case "before":
|
|
91
|
+
return `${field}${u}lt.${value}`;
|
|
92
|
+
case "after":
|
|
93
|
+
return `${field}${u}gt.${value}`;
|
|
94
|
+
case "null":
|
|
95
|
+
return `${field}${u}is.null`;
|
|
96
|
+
case "notnull":
|
|
97
|
+
return `${field}${u}not.is.null`;
|
|
98
|
+
default:
|
|
99
|
+
return "";
|
|
100
|
+
}
|
|
101
|
+
}).filter(Boolean);
|
|
102
|
+
let joinedCondition;
|
|
103
|
+
if (conditionType === "all" || conditionStrings.length === 1) {
|
|
104
|
+
joinedCondition = conditionStrings.join("&");
|
|
105
|
+
} else {
|
|
106
|
+
joinedCondition = `or=(${conditionStrings.join(",")})`;
|
|
107
|
+
}
|
|
108
|
+
return joinedCondition;
|
|
109
|
+
};
|
|
110
|
+
export {
|
|
111
|
+
mapConditionsToPostgrest
|
|
112
|
+
};
|
|
113
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../../packages/dashboard-workbench/components/module-content/utils.ts"],"sourcesContent":["import dayjs from 'dayjs'\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\ntype Condition = {\n field: string\n condition: string\n val?: string | number\n val2?: string | number\n rdate?: any\n type?: any\n}\n\ntype ConditionType = 'all' | 'any'\n\nexport interface FilterData {\n conditionList: Condition[]\n conditionType: ConditionType\n}\n\nfunction getRDate({ rdate, u, field, value }: any) {\n if (rdate) {\n switch (rdate) {\n case 'exactdate':\n return `${field}${u}eq.${value}`\n case 'today':\n return `${field}${u}eq.${dayjs().format('YYYY-MM-DD')}`\n case 'yesterday':\n return `${field}${u}eq.${dayjs().subtract(1, 'day').format('YYYY-MM-DD')}`\n case 'thisweek':\n return `${field}${u}gte.${dayjs()\n .startOf('week')\n .add(1, 'day')\n .format('YYYY-MM-DD')}&${field}${u}lte.${dayjs()\n .endOf('week')\n .add(1, 'day')\n .format('YYYY-MM-DD')}`\n case 'lastweek': {\n const startOfLastWeek = dayjs().subtract(1, 'week').startOf('week').add(1, 'day')\n const endOfLastWeek = dayjs().subtract(1, 'week').endOf('week').add(1, 'day')\n return `${field}${u}gte.${startOfLastWeek.format(\n 'YYYY-MM-DD'\n )}&${field}${u}lte.${endOfLastWeek.format('YYYY-MM-DD')}`\n }\n case 'thismonth':\n return `${field}${u}gte.${dayjs()\n .startOf('month')\n .format('YYYY-MM-DD')}&${field}${u}lte.${dayjs().endOf('month').format('YYYY-MM-DD')}`\n case 'lastmonth': {\n const startOfLastMonth = dayjs().subtract(1, 'month').startOf('month')\n const endOfLastMonth = dayjs().subtract(1, 'month').endOf('month')\n return `${field}${u}gte.${startOfLastMonth.format(\n 'YYYY-MM-DD'\n )}&${field}${u}lte.${endOfLastMonth.format('YYYY-MM-DD')}`\n }\n case 'last7days':\n return `${field}${u}gte.${dayjs()\n .subtract(7, 'days')\n .format('YYYY-MM-DD')}&${field}${u}lte.${dayjs().format('YYYY-MM-DD')}`\n case 'last30days':\n return `${field}${u}gte.${dayjs()\n .subtract(30, 'days')\n .format('YYYY-MM-DD')}&${field}${u}lte.${dayjs().format('YYYY-MM-DD')}`\n default:\n return '' // 对于未支持的 rdate 值返回空字符串\n }\n }\n}\n\nexport const mapConditionsToPostgrest = (filterData: FilterData): string => {\n const { conditionList, conditionType = 'all' } = filterData\n const u = conditionType === 'all' ? '=' : '.' // 拼接逻辑\n const conditionStrings = conditionList\n .map(condition => {\n const { field, condition: cond, val, val2, rdate, type } = condition\n\n const value = (val as any)?.value ? (val as any)?.value : val\n switch (cond) {\n case '=':\n if (type !== 'timestamp') {\n return `${field}${u}eq.${value}`\n } else {\n if (rdate === 'exactdate') {\n return `${field}${u}eq.${value}`\n } else {\n return getRDate({ rdate, u, field, value })\n }\n }\n case '!=':\n return `${field}${u}neq.${value}`\n case 'include':\n return `${field}${u}cs.{${value}}` // 包含值\n case 'notinclude':\n return `${field}${u}not.cs.{${value}}` // 不包含值\n case '>':\n if (rdate === 'today') {\n return `${field}${u}gt.${new Date().toISOString().split('T')[0]}`\n }\n if (rdate === 'yesterday') {\n const yesterday = new Date()\n yesterday.setDate(yesterday.getDate() - 1)\n return `${field}${u}gt.${yesterday.toISOString().split('T')[0]}`\n }\n return `${field}${u}gt.${value}`\n case '>=':\n return `${field}${u}gte.${value}`\n case '<':\n if (rdate === 'today') {\n return `${field}${u}lt.${new Date().toISOString().split('T')[0]}`\n }\n if (rdate === 'yesterday') {\n const yesterday = new Date()\n yesterday.setDate(yesterday.getDate() - 1)\n return `${field}${u}lt.${yesterday.toISOString().split('T')[0]}`\n }\n return `${field}${u}lt.${value}`\n case '<=':\n return `${field}${u}lte.${value}`\n case 'contain':\n if (value && val2) {\n return `${field}${u}gte.${value},${field}.lte.${val2}`\n }\n return ''\n case 'before':\n return `${field}${u}lt.${value}`\n case 'after':\n return `${field}${u}gt.${value}`\n case 'null':\n return `${field}${u}is.null`\n case 'notnull':\n return `${field}${u}not.is.null`\n default:\n return ''\n }\n })\n .filter(Boolean) // 过滤掉空字符串\n\n let joinedCondition\n if (conditionType === 'all' || conditionStrings.length === 1) {\n joinedCondition = conditionStrings.join('&')\n } else {\n joinedCondition = `or=(${conditionStrings.join(',')})`\n }\n return joinedCondition\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ModuleData } from '../module-content';
|
|
2
|
+
import { default as React } from 'react';
|
|
3
|
+
interface ModuleHeaderProps {
|
|
4
|
+
defaultValue: string;
|
|
5
|
+
onChange?: (val: string) => void;
|
|
6
|
+
module: ModuleData;
|
|
7
|
+
onDropdownItem?: (key: string) => void;
|
|
8
|
+
onMouseDown?: () => void;
|
|
9
|
+
onMouseUp?: () => void;
|
|
10
|
+
}
|
|
11
|
+
declare const _default: React.NamedExoticComponent<ModuleHeaderProps>;
|
|
12
|
+
export default _default;
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Input, Dropdown } from "antd";
|
|
3
|
+
import React, { useState, useRef, useEffect } from "react";
|
|
4
|
+
import useDebounce from "../module-content/text-module/editor/useDebounce.js";
|
|
5
|
+
import { useTranslation } from "react-i18next";
|
|
6
|
+
import IconMove from "../../icon/icon-move.js";
|
|
7
|
+
import IconDrag from "../../icon/icon-drag.js";
|
|
8
|
+
const ModuleHeader = ({
|
|
9
|
+
defaultValue,
|
|
10
|
+
onChange,
|
|
11
|
+
module,
|
|
12
|
+
onDropdownItem,
|
|
13
|
+
onMouseDown,
|
|
14
|
+
onMouseUp
|
|
15
|
+
}) => {
|
|
16
|
+
const [isEdit, setIsEdit] = useState(false);
|
|
17
|
+
const [title, setTitle] = useState("");
|
|
18
|
+
const inputRef = useRef(null);
|
|
19
|
+
const debouncedOnChange = useDebounce((val) => {
|
|
20
|
+
onChange == null ? void 0 : onChange(val);
|
|
21
|
+
}, 300);
|
|
22
|
+
const { t } = useTranslation();
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
setTitle(title);
|
|
25
|
+
}, [defaultValue]);
|
|
26
|
+
const handleDblClick = () => {
|
|
27
|
+
var _a;
|
|
28
|
+
const inputElement = (_a = inputRef.current) == null ? void 0 : _a.input;
|
|
29
|
+
inputElement.select();
|
|
30
|
+
};
|
|
31
|
+
const handleEnterPress = (event) => {
|
|
32
|
+
if (event.key === "Enter") {
|
|
33
|
+
setIsEdit(false);
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
return /* @__PURE__ */ jsxs(
|
|
37
|
+
"div",
|
|
38
|
+
{
|
|
39
|
+
className: `layout-item-head isCanDrag`,
|
|
40
|
+
onMouseDown: () => {
|
|
41
|
+
onMouseDown == null ? void 0 : onMouseDown();
|
|
42
|
+
},
|
|
43
|
+
onMouseUp: () => {
|
|
44
|
+
onMouseUp == null ? void 0 : onMouseUp();
|
|
45
|
+
},
|
|
46
|
+
children: [
|
|
47
|
+
/* @__PURE__ */ jsxs("div", { className: "head-inner", children: [
|
|
48
|
+
/* @__PURE__ */ jsx("span", { className: "title", children: /* @__PURE__ */ jsx(
|
|
49
|
+
"span",
|
|
50
|
+
{
|
|
51
|
+
className: "title-child",
|
|
52
|
+
onDoubleClick: (e) => {
|
|
53
|
+
e.stopPropagation();
|
|
54
|
+
setIsEdit(true);
|
|
55
|
+
setTimeout(() => {
|
|
56
|
+
var _a;
|
|
57
|
+
(_a = inputRef.current) == null ? void 0 : _a.focus();
|
|
58
|
+
}, 100);
|
|
59
|
+
},
|
|
60
|
+
children: isEdit ? /* @__PURE__ */ jsx(
|
|
61
|
+
Input,
|
|
62
|
+
{
|
|
63
|
+
defaultValue,
|
|
64
|
+
onBlur: () => {
|
|
65
|
+
setIsEdit(false);
|
|
66
|
+
},
|
|
67
|
+
ref: inputRef,
|
|
68
|
+
onKeyDown: handleEnterPress,
|
|
69
|
+
onDoubleClick: handleDblClick,
|
|
70
|
+
onChange: (e) => {
|
|
71
|
+
setTitle(e.target.value);
|
|
72
|
+
debouncedOnChange(e.target.value);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
) : defaultValue
|
|
76
|
+
}
|
|
77
|
+
) }),
|
|
78
|
+
/* @__PURE__ */ jsx("div", { className: "menu-slot isNoCanDrag", children: /* @__PURE__ */ jsx(
|
|
79
|
+
Dropdown,
|
|
80
|
+
{
|
|
81
|
+
trigger: ["click"],
|
|
82
|
+
menu: {
|
|
83
|
+
items: [
|
|
84
|
+
module.type !== "text" ? {
|
|
85
|
+
label: t("configuration"),
|
|
86
|
+
key: "edit"
|
|
87
|
+
} : null,
|
|
88
|
+
{
|
|
89
|
+
label: t("copy"),
|
|
90
|
+
key: "copy"
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
key: "delete",
|
|
94
|
+
danger: true,
|
|
95
|
+
label: t("delete")
|
|
96
|
+
}
|
|
97
|
+
],
|
|
98
|
+
onClick: ({ key }) => {
|
|
99
|
+
onDropdownItem == null ? void 0 : onDropdownItem(key);
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
children: /* @__PURE__ */ jsx("button", { type: "button", className: "dashboard-grid-menu-button", children: /* @__PURE__ */ jsx("span", { className: "universe-icon", children: /* @__PURE__ */ jsx(IconMove, {}) }) })
|
|
103
|
+
}
|
|
104
|
+
) })
|
|
105
|
+
] }),
|
|
106
|
+
/* @__PURE__ */ jsx("div", { className: `drag isCanDrag`, children: /* @__PURE__ */ jsx("span", { className: "universe-icon drag-icon", children: /* @__PURE__ */ jsx(IconDrag, {}) }) })
|
|
107
|
+
]
|
|
108
|
+
}
|
|
109
|
+
);
|
|
110
|
+
};
|
|
111
|
+
const ModuleHeader$1 = React.memo(ModuleHeader);
|
|
112
|
+
export {
|
|
113
|
+
ModuleHeader$1 as default
|
|
114
|
+
};
|
|
115
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../packages/dashboard-workbench/components/module-header/index.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Dropdown, Input } from 'antd'\nimport { FC, useEffect, useRef, useState } from 'react'\nimport useDebounce from '../module-content/text-module/editor/useDebounce'\nimport { ModuleData } from '../module-content'\nimport { useTranslation } from 'react-i18next'\nimport IconMove from '../../icon/icon-move'\nimport IconDrag from '../../icon/icon-drag'\nimport React from 'react'\n\ninterface ModuleHeaderProps {\n defaultValue: string\n onChange?: (val: string) => void\n module: ModuleData\n onDropdownItem?: (key: string) => void\n onMouseDown?: () => void\n onMouseUp?: () => void\n}\n\nconst ModuleHeader: FC<ModuleHeaderProps> = ({\n defaultValue,\n onChange,\n module,\n onDropdownItem,\n onMouseDown,\n onMouseUp,\n}) => {\n const [isEdit, setIsEdit] = useState<boolean>(false)\n const [title, setTitle] = useState<string>('')\n const inputRef = useRef<any>(null)\n const debouncedOnChange = useDebounce(val => {\n onChange?.(val)\n }, 300) // 300 毫秒的延迟\n const { t } = useTranslation()\n\n useEffect(() => {\n setTitle(title)\n }, [defaultValue])\n\n const handleDblClick = () => {\n // 获取input DOM元素\n const inputElement = inputRef.current?.input\n // 双击事件发生在input元素上时,触发全选\n inputElement.select()\n }\n\n const handleEnterPress = (event: { key: string }) => {\n if (event.key === 'Enter') {\n setIsEdit(false)\n }\n }\n\n return (\n <div\n className={`layout-item-head isCanDrag`}\n onMouseDown={() => {\n onMouseDown?.()\n }}\n onMouseUp={() => {\n onMouseUp?.()\n }}\n >\n <div className=\"head-inner\">\n <span className=\"title\">\n <span\n className=\"title-child\"\n onDoubleClick={e => {\n e.stopPropagation()\n setIsEdit(true)\n setTimeout(() => {\n inputRef.current?.focus()\n }, 100)\n }}\n >\n {isEdit ? (\n <Input\n defaultValue={defaultValue}\n onBlur={() => {\n setIsEdit(false)\n }}\n ref={inputRef}\n onKeyDown={handleEnterPress}\n onDoubleClick={handleDblClick}\n onChange={e => {\n setTitle(e.target.value)\n debouncedOnChange(e.target.value)\n }}\n />\n ) : (\n defaultValue\n )}\n </span>\n </span>\n\n <div className=\"menu-slot isNoCanDrag\">\n <Dropdown\n trigger={['click']}\n menu={{\n items: [\n module.type !== 'text'\n ? {\n label: t('configuration'),\n key: 'edit',\n }\n : null,\n {\n label: t('copy'),\n key: 'copy',\n },\n {\n key: 'delete',\n danger: true,\n label: t('delete'),\n },\n ],\n onClick: ({ key }) => {\n onDropdownItem?.(key)\n },\n }}\n >\n <button type=\"button\" className=\"dashboard-grid-menu-button\">\n <span className=\"universe-icon\">\n <IconMove />\n </span>\n </button>\n </Dropdown>\n </div>\n </div>\n <div className={`drag isCanDrag`}>\n <span className=\"universe-icon drag-icon\">\n <IconDrag />\n </span>\n </div>\n </div>\n )\n}\n\nexport default React.memo(ModuleHeader)\n"],"names":[],"mappings":";;;;;;;AAmBA,MAAM,eAAsC,CAAC;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAkB,KAAK;AACnD,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAiB,EAAE;AACvC,QAAA,WAAW,OAAY,IAAI;AAC3B,QAAA,oBAAoB,YAAY,CAAO,QAAA;AAC3C,yCAAW;AAAA,KACV,GAAG;AACA,QAAA,EAAE,EAAE,IAAI,eAAe;AAE7B,YAAU,MAAM;AACd,aAAS,KAAK;AAAA,EAAA,GACb,CAAC,YAAY,CAAC;AAEjB,QAAM,iBAAiB,MAAM;;AAErB,UAAA,gBAAe,cAAS,YAAT,mBAAkB;AAEvC,iBAAa,OAAO;AAAA,EACtB;AAEM,QAAA,mBAAmB,CAAC,UAA2B;AAC/C,QAAA,MAAM,QAAQ,SAAS;AACzB,gBAAU,KAAK;AAAA,IAAA;AAAA,EAEnB;AAGE,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW;AAAA,MACX,aAAa,MAAM;AACH;AAAA,MAChB;AAAA,MACA,WAAW,MAAM;AACH;AAAA,MACd;AAAA,MAEA,UAAA;AAAA,QAAC,qBAAA,OAAA,EAAI,WAAU,cACb,UAAA;AAAA,UAAC,oBAAA,QAAA,EAAK,WAAU,SACd,UAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,eAAe,CAAK,MAAA;AAClB,kBAAE,gBAAgB;AAClB,0BAAU,IAAI;AACd,2BAAW,MAAM;;AACf,iCAAS,YAAT,mBAAkB;AAAA,mBACjB,GAAG;AAAA,cACR;AAAA,cAEC,UACC,SAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC;AAAA,kBACA,QAAQ,MAAM;AACZ,8BAAU,KAAK;AAAA,kBACjB;AAAA,kBACA,KAAK;AAAA,kBACL,WAAW;AAAA,kBACX,eAAe;AAAA,kBACf,UAAU,CAAK,MAAA;AACJ,6BAAA,EAAE,OAAO,KAAK;AACL,sCAAA,EAAE,OAAO,KAAK;AAAA,kBAAA;AAAA,gBAClC;AAAA,cAAA,IAGF;AAAA,YAAA;AAAA,UAAA,GAGN;AAAA,UAEA,oBAAC,OAAI,EAAA,WAAU,yBACb,UAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,SAAS,CAAC,OAAO;AAAA,cACjB,MAAM;AAAA,gBACJ,OAAO;AAAA,kBACL,OAAO,SAAS,SACZ;AAAA,oBACE,OAAO,EAAE,eAAe;AAAA,oBACxB,KAAK;AAAA,kBAAA,IAEP;AAAA,kBACJ;AAAA,oBACE,OAAO,EAAE,MAAM;AAAA,oBACf,KAAK;AAAA,kBACP;AAAA,kBACA;AAAA,oBACE,KAAK;AAAA,oBACL,QAAQ;AAAA,oBACR,OAAO,EAAE,QAAQ;AAAA,kBAAA;AAAA,gBAErB;AAAA,gBACA,SAAS,CAAC,EAAE,UAAU;AACpB,mEAAiB;AAAA,gBAAG;AAAA,cAExB;AAAA,cAEA,UAAC,oBAAA,UAAA,EAAO,MAAK,UAAS,WAAU,8BAC9B,UAAC,oBAAA,QAAA,EAAK,WAAU,iBACd,UAAC,oBAAA,UAAA,CAAA,CAAS,GACZ,EACF,CAAA;AAAA,YAAA;AAAA,UAAA,EAEJ,CAAA;AAAA,QAAA,GACF;AAAA,QACA,oBAAC,OAAI,EAAA,WAAW,kBACd,UAAA,oBAAC,QAAK,EAAA,WAAU,2BACd,UAAA,oBAAC,UAAS,CAAA,CAAA,EAAA,CACZ,EACF,CAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EACF;AAEJ;AAEA,MAAA,iBAAe,MAAM,KAAK,YAAY;"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { default as React, ReactNode } from 'react';
|
|
2
|
+
import { SourceDataTypes } from './types';
|
|
3
|
+
interface AppContextProps {
|
|
4
|
+
globalData?: {
|
|
5
|
+
fieldMap?: Record<string, string>;
|
|
6
|
+
sourceData?: SourceDataTypes[];
|
|
7
|
+
};
|
|
8
|
+
setGlobalData: (items?: AppContextProps['globalData']) => void;
|
|
9
|
+
}
|
|
10
|
+
interface AppProviderProps {
|
|
11
|
+
children: ReactNode;
|
|
12
|
+
initialData?: AppContextProps['globalData'];
|
|
13
|
+
}
|
|
14
|
+
export declare const AppProvider: React.FC<AppProviderProps>;
|
|
15
|
+
export declare const useAppContext: () => AppContextProps;
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { createContext, useState, useContext } from "react";
|
|
3
|
+
const AppContext = createContext(void 0);
|
|
4
|
+
const AppProvider = ({ children, initialData }) => {
|
|
5
|
+
const [globalData, setGlobalData] = useState(
|
|
6
|
+
initialData
|
|
7
|
+
);
|
|
8
|
+
return /* @__PURE__ */ jsx(AppContext.Provider, { value: { globalData, setGlobalData }, children });
|
|
9
|
+
};
|
|
10
|
+
const useAppContext = () => {
|
|
11
|
+
const context = useContext(AppContext);
|
|
12
|
+
if (!context) {
|
|
13
|
+
throw new Error("useAppContext must be used within an AppProvider");
|
|
14
|
+
}
|
|
15
|
+
return context;
|
|
16
|
+
};
|
|
17
|
+
export {
|
|
18
|
+
AppProvider,
|
|
19
|
+
useAppContext
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=context.js.map
|