@platox/pivot-table 0.0.52 → 0.0.54
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 +1 -0
- package/es/dashboard-workbench/components/add-module-btn/index.js +32 -4
- package/es/dashboard-workbench/components/add-module-btn/index.js.map +1 -1
- package/es/dashboard-workbench/components/add-module-modal/add-calendar-modal/index.js +1 -0
- package/es/dashboard-workbench/components/add-module-modal/add-calendar-modal/index.js.map +1 -1
- package/es/dashboard-workbench/components/global-filter-condition/index.js +11 -6
- package/es/dashboard-workbench/components/global-filter-condition/index.js.map +1 -1
- package/es/dashboard-workbench/icon/icon-Filter.d.ts +3 -0
- package/es/dashboard-workbench/icon/icon-Filter.js +17 -0
- package/es/dashboard-workbench/icon/icon-Filter.js.map +1 -0
- package/es/dashboard-workbench/index.js +8 -3
- package/es/dashboard-workbench/index.js.map +1 -1
- package/package.json +1 -1
- package/umd/pivot-table.umd.cjs +42 -42
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx, Fragment, jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useState } from "react";
|
|
3
|
-
import { Popover
|
|
3
|
+
import { Popover } from "antd";
|
|
4
4
|
import { useTranslation } from "react-i18next";
|
|
5
5
|
import SvgComponent from "../../icon/icon-chart-combination.js";
|
|
6
6
|
import IconBar from "../../icon/icon-bar.js";
|
|
@@ -10,11 +10,9 @@ import IconLine from "../../icon/icon-line.js";
|
|
|
10
10
|
import IconPie from "../../icon/icon-pie.js";
|
|
11
11
|
import IconStatistics from "../../icon/icon-statistics.js";
|
|
12
12
|
import IconStripBar from "../../icon/icon-strip-bar.js";
|
|
13
|
-
import { useChartTypeOption } from "../add-module-modal/add-chart-modal/config.js";
|
|
14
13
|
import { ChartType } from "../add-module-modal/add-chart-modal/interface.js";
|
|
15
14
|
const AddModuleBtn = ({ onOk }) => {
|
|
16
15
|
const { t } = useTranslation();
|
|
17
|
-
useChartTypeOption();
|
|
18
16
|
const navs = [
|
|
19
17
|
{
|
|
20
18
|
title: t("add.add1"),
|
|
@@ -96,11 +94,41 @@ const AddModuleBtn = ({ onOk }) => {
|
|
|
96
94
|
)) })
|
|
97
95
|
] }, key)) }),
|
|
98
96
|
trigger: "click",
|
|
99
|
-
children: /* @__PURE__ */ jsx(
|
|
97
|
+
children: /* @__PURE__ */ jsx("span", { children: /* @__PURE__ */ jsx(AddBtn, {}) })
|
|
100
98
|
}
|
|
101
99
|
) });
|
|
102
100
|
};
|
|
101
|
+
const AddBtn = () => {
|
|
102
|
+
return /* @__PURE__ */ jsx(
|
|
103
|
+
"div",
|
|
104
|
+
{
|
|
105
|
+
style: {
|
|
106
|
+
width: "1.5rem",
|
|
107
|
+
height: "1.5rem",
|
|
108
|
+
backgroundColor: "var(--brand)",
|
|
109
|
+
display: "flex",
|
|
110
|
+
alignItems: "center",
|
|
111
|
+
justifyContent: "center",
|
|
112
|
+
borderRadius: "9999px",
|
|
113
|
+
cursor: "pointer"
|
|
114
|
+
},
|
|
115
|
+
children: /* @__PURE__ */ jsx(
|
|
116
|
+
"div",
|
|
117
|
+
{
|
|
118
|
+
style: {
|
|
119
|
+
fontSize: "1.25rem",
|
|
120
|
+
color: "black",
|
|
121
|
+
lineHeight: "1.25rem",
|
|
122
|
+
marginTop: "-2px"
|
|
123
|
+
},
|
|
124
|
+
children: "+"
|
|
125
|
+
}
|
|
126
|
+
)
|
|
127
|
+
}
|
|
128
|
+
);
|
|
129
|
+
};
|
|
103
130
|
export {
|
|
131
|
+
AddBtn,
|
|
104
132
|
AddModuleBtn as default
|
|
105
133
|
};
|
|
106
134
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../packages/dashboard-workbench/components/add-module-btn/index.tsx"],"sourcesContent":["import { useState } from 'react'\nimport { Button, Popover } from 'antd'\nimport { useTranslation } from 'react-i18next'\nimport IconChartCombination from '@platox/pivot-table/icon/icon-chart-combination'\nimport IconBar from '../../icon/icon-bar'\nimport IconCalendar from '../../icon/icon-calendar'\nimport IconEditor from '../../icon/icon-editor'\nimport IconLine from '../../icon/icon-line'\nimport IconPie from '../../icon/icon-pie'\nimport IconStatistics from '../../icon/icon-statistics'\nimport IconStripBar from '../../icon/icon-strip-bar'\nimport { useChartTypeOption } from '../add-module-modal/add-chart-modal/config'\nimport { ChartType } from '../add-module-modal/add-chart-modal/interface'\n\nexport interface ModuleValueType {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n id?: any\n type?:\n | 'text'\n | 'statistics'\n | 'chart-bar'\n | 'chart-bar-pile'\n | 'chart-bar-percentage'\n | 'chart-line'\n | 'chart-line-smooth'\n | 'chart-strip-bar'\n | 'chart-strip-bar-pile'\n | 'chart-strip-bar-percentage'\n | 'chart-pie'\n | 'chart-pie-circular'\n | 'calendar'\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n customData?: any\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n customeStyle?: any\n}\n\ninterface AddModuleBtnProps {\n onOk?: (type: ModuleValueType['type']) => void\n}\n\nconst AddModuleBtn: React.FC<AddModuleBtnProps> = ({ onOk }) => {\n const { t } = useTranslation()\n\n const
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../packages/dashboard-workbench/components/add-module-btn/index.tsx"],"sourcesContent":["import { useState } from 'react'\nimport { Button, Popover } from 'antd'\nimport { useTranslation } from 'react-i18next'\nimport IconChartCombination from '@platox/pivot-table/icon/icon-chart-combination'\nimport IconBar from '../../icon/icon-bar'\nimport IconCalendar from '../../icon/icon-calendar'\nimport IconEditor from '../../icon/icon-editor'\nimport IconLine from '../../icon/icon-line'\nimport IconPie from '../../icon/icon-pie'\nimport IconStatistics from '../../icon/icon-statistics'\nimport IconStripBar from '../../icon/icon-strip-bar'\nimport { useChartTypeOption } from '../add-module-modal/add-chart-modal/config'\nimport { ChartType } from '../add-module-modal/add-chart-modal/interface'\n\nexport interface ModuleValueType {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n id?: any\n type?:\n | 'text'\n | 'statistics'\n | 'chart-bar'\n | 'chart-bar-pile'\n | 'chart-bar-percentage'\n | 'chart-line'\n | 'chart-line-smooth'\n | 'chart-strip-bar'\n | 'chart-strip-bar-pile'\n | 'chart-strip-bar-percentage'\n | 'chart-pie'\n | 'chart-pie-circular'\n | 'calendar'\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n customData?: any\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n customeStyle?: any\n}\n\ninterface AddModuleBtnProps {\n onOk?: (type: ModuleValueType['type']) => void\n}\n\nconst AddModuleBtn: React.FC<AddModuleBtnProps> = ({ onOk }) => {\n const { t } = useTranslation()\n\n const navs = [\n {\n title: t('add.add1'),\n child: [\n {\n title: t('add.add2'),\n type: 'chart-bar',\n icon: <IconBar />,\n },\n {\n title: t('add.add3'),\n type: 'chart-line',\n icon: <IconLine />,\n },\n {\n title: t('add.add4'),\n type: 'chart-pie',\n icon: <IconPie />,\n },\n {\n title: t('add.add5'),\n type: 'chart-strip-bar',\n icon: <IconStripBar />,\n },\n {\n title: t('add._add5'),\n type: ChartType['chartCombination'],\n icon: <IconChartCombination />,\n },\n ],\n },\n {\n title: t('add.add6'),\n child: [\n {\n title: t('add.add7'),\n type: 'statistics',\n icon: <IconStatistics />,\n },\n {\n title: t('add.add8'),\n type: 'text',\n icon: <IconEditor />,\n },\n {\n title: t('add.add9'),\n type: 'calendar',\n icon: <IconCalendar />,\n },\n ],\n },\n ]\n\n const [open, setOpen] = useState(false)\n const onAdd = (value: ModuleValueType['type']) => {\n setOpen(false)\n onOk?.(value)\n }\n\n return (\n <>\n <Popover\n placement=\"bottomRight\"\n open={open}\n onOpenChange={setOpen}\n content={\n <div className=\"pivot-table-modal box-widget-popover-item-container\">\n {navs.map((item, key) => (\n <div key={key} className=\"box-widget-popover-item-group\">\n <p className=\"box-widget-popover-item-group-header\">{item.title}</p>\n <div className=\"box-widget-popover-item-group-content\">\n {item.child.map((child, childKey) => (\n <div\n key={childKey}\n onClick={() => {\n onAdd(child.type as ModuleValueType['type'])\n }}\n className=\"box-widget-popover-item\"\n >\n <div className=\"img\">{child.icon}</div>\n <div className=\"title\">{child.title}</div>\n </div>\n ))}\n </div>\n </div>\n ))}\n </div>\n }\n trigger=\"click\"\n >\n <span>\n <AddBtn />\n </span>\n </Popover>\n </>\n )\n}\n\nexport default AddModuleBtn\n\n/* ============================== split =============================== */\n\nexport const AddBtn = () => {\n return (\n <div\n style={{\n width: '1.5rem',\n height: '1.5rem',\n backgroundColor: 'var(--brand)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: '9999px',\n cursor: 'pointer',\n }}\n >\n <div\n style={{\n fontSize: '1.25rem',\n color: 'black',\n lineHeight: '1.25rem',\n marginTop: '-2px',\n }}\n >\n +\n </div>\n </div>\n )\n}\n"],"names":["IconChartCombination"],"mappings":"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"}
|
|
@@ -34,6 +34,7 @@ const AddStatisticsModal = ({
|
|
|
34
34
|
title: /* @__PURE__ */ jsx(EditorHeader, { value: title, onChange: setTitle }),
|
|
35
35
|
footer: null,
|
|
36
36
|
open,
|
|
37
|
+
destroyOnClose: true,
|
|
37
38
|
onCancel: onClose,
|
|
38
39
|
closeIcon: /* @__PURE__ */ jsx(CloseOutlined, {}),
|
|
39
40
|
className: "ow-modal ow-modal-2",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../../packages/dashboard-workbench/components/add-module-modal/add-calendar-modal/index.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react'\nimport { Button, Modal } from 'antd'\nimport { CloseOutlined } from '@ant-design/icons'\nimport { useTranslation } from 'react-i18next'\nimport EditorHeader from '@platox/pivot-table/components/modal-editor-header'\nimport { EnumDataApi, ModuleDataApi } from '../../../types'\nimport { ModuleData } from '../../module-content'\nimport CalendarModule from '../../module-content/calendar-module'\nimport CustomData, { CalendarCustomeDataTypes } from './custome-data'\n\ninterface AddStatisticsModalProps {\n open: boolean\n onClose?: () => void\n onOk?: (data: Partial<ModuleData>) => void\n\n selectModuleData?: ModuleData\n moduleDataApi?: ModuleDataApi\n enumDataApi?: EnumDataApi\n}\n\nconst AddStatisticsModal: React.FC<AddStatisticsModalProps> = ({\n open,\n onClose,\n onOk,\n moduleDataApi,\n selectModuleData,\n enumDataApi,\n}) => {\n const { t } = useTranslation()\n const [customData, setCustomData] = useState<CalendarCustomeDataTypes>()\n\n useEffect(() => {\n if (selectModuleData) {\n setCustomData(selectModuleData?.customData)\n }\n }, [selectModuleData])\n\n /* ============================== split =============================== */\n const [title, setTitle] = useState<string>('')\n useEffect(() => {\n if (open) {\n setTitle(selectModuleData?.title ? selectModuleData?.title : t('calendarText'))\n }\n }, [open])\n\n return (\n <>\n <Modal\n width=\"65%\"\n title={<EditorHeader value={title} onChange={setTitle} />}\n footer={null}\n open={open}\n onCancel={onClose}\n closeIcon={<CloseOutlined />}\n className=\"ow-modal ow-modal-2\"\n >\n <div className=\"config-widget-dialog-container\">\n <div className=\"config-widget-dialog-content\">\n <div\n className=\"config-widget-dialog-preview\"\n style={{ borderRight: '1px solid #e0e0e0' }}\n >\n {open && <CalendarModule customData={customData} moduleDataApi={moduleDataApi} />}\n </div>\n </div>\n <div className=\"config-widget-dialog-panel\" style={{ borderLeft: 'none' }}>\n <div className=\"bitable-dashboard edit-panel-container\" style={{ paddingTop: '20px' }}>\n <CustomData\n enumDataApi={enumDataApi}\n selectModuleData={selectModuleData}\n onAllValuesChange={allVal => {\n setCustomData(allVal)\n }}\n />\n </div>\n <div className=\"button-container\">\n <Button\n type=\"primary\"\n onClick={() => {\n onOk?.({\n id: selectModuleData?.id,\n customData,\n title,\n })\n }}\n >\n {t('confirm')}\n </Button>\n </div>\n </div>\n </div>\n </Modal>\n </>\n )\n}\n\nexport default AddStatisticsModal\n"],"names":[],"mappings":";;;;;;;;AAoBA,MAAM,qBAAwD,CAAC;AAAA,EAC7D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACE,QAAA,EAAE,EAAE,IAAI,eAAe;AAC7B,QAAM,CAAC,YAAY,aAAa,IAAI,SAAmC;AAEvE,YAAU,MAAM;AACd,QAAI,kBAAkB;AACpB,oBAAc,qDAAkB,UAAU;AAAA,IAAA;AAAA,EAC5C,GACC,CAAC,gBAAgB,CAAC;AAGrB,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAiB,EAAE;AAC7C,YAAU,MAAM;AACd,QAAI,MAAM;AACR,gBAAS,qDAAkB,SAAQ,qDAAkB,QAAQ,EAAE,cAAc,CAAC;AAAA,IAAA;AAAA,EAChF,GACC,CAAC,IAAI,CAAC;AAET,SAEI,oBAAA,UAAA,EAAA,UAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAM;AAAA,MACN,OAAQ,oBAAA,cAAA,EAAa,OAAO,OAAO,UAAU,UAAU;AAAA,MACvD,QAAQ;AAAA,MACR;AAAA,MACA,UAAU;AAAA,MACV,+BAAY,eAAc,EAAA;AAAA,MAC1B,WAAU;AAAA,MAEV,UAAA,qBAAC,OAAI,EAAA,WAAU,kCACb,UAAA;AAAA,QAAC,oBAAA,OAAA,EAAI,WAAU,gCACb,UAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,aAAa,oBAAoB;AAAA,YAEzC,UAAQ,QAAA,oBAAC,gBAAe,EAAA,YAAwB,cAA8B,CAAA;AAAA,UAAA;AAAA,QAAA,GAEnF;AAAA,QACA,qBAAC,SAAI,WAAU,8BAA6B,OAAO,EAAE,YAAY,OAC/D,GAAA,UAAA;AAAA,UAAA,oBAAC,SAAI,WAAU,0CAAyC,OAAO,EAAE,YAAY,UAC3E,UAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC;AAAA,cACA;AAAA,cACA,mBAAmB,CAAU,WAAA;AAC3B,8BAAc,MAAM;AAAA,cAAA;AAAA,YACtB;AAAA,UAAA,GAEJ;AAAA,UACA,oBAAC,OAAI,EAAA,WAAU,oBACb,UAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,MAAM;AACN,6CAAA;AAAA,kBACL,IAAI,qDAAkB;AAAA,kBACtB;AAAA,kBACA;AAAA,gBAAA;AAAA,cAEJ;AAAA,cAEC,YAAE,SAAS;AAAA,YAAA;AAAA,UAAA,EAEhB,CAAA;AAAA,QAAA,EACF,CAAA;AAAA,MAAA,EACF,CAAA;AAAA,IAAA;AAAA,EAAA,GAEJ;AAEJ;"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../packages/dashboard-workbench/components/add-module-modal/add-calendar-modal/index.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react'\nimport { Button, Modal } from 'antd'\nimport { CloseOutlined } from '@ant-design/icons'\nimport { useTranslation } from 'react-i18next'\nimport EditorHeader from '@platox/pivot-table/components/modal-editor-header'\nimport { EnumDataApi, ModuleDataApi } from '../../../types'\nimport { ModuleData } from '../../module-content'\nimport CalendarModule from '../../module-content/calendar-module'\nimport CustomData, { CalendarCustomeDataTypes } from './custome-data'\n\ninterface AddStatisticsModalProps {\n open: boolean\n onClose?: () => void\n onOk?: (data: Partial<ModuleData>) => void\n\n selectModuleData?: ModuleData\n moduleDataApi?: ModuleDataApi\n enumDataApi?: EnumDataApi\n}\n\nconst AddStatisticsModal: React.FC<AddStatisticsModalProps> = ({\n open,\n onClose,\n onOk,\n moduleDataApi,\n selectModuleData,\n enumDataApi,\n}) => {\n const { t } = useTranslation()\n const [customData, setCustomData] = useState<CalendarCustomeDataTypes>()\n\n useEffect(() => {\n if (selectModuleData) {\n setCustomData(selectModuleData?.customData)\n }\n }, [selectModuleData])\n\n /* ============================== split =============================== */\n const [title, setTitle] = useState<string>('')\n useEffect(() => {\n if (open) {\n setTitle(selectModuleData?.title ? selectModuleData?.title : t('calendarText'))\n }\n }, [open])\n\n return (\n <>\n <Modal\n width=\"65%\"\n title={<EditorHeader value={title} onChange={setTitle} />}\n footer={null}\n open={open}\n destroyOnClose\n onCancel={onClose}\n closeIcon={<CloseOutlined />}\n className=\"ow-modal ow-modal-2\"\n >\n <div className=\"config-widget-dialog-container\">\n <div className=\"config-widget-dialog-content\">\n <div\n className=\"config-widget-dialog-preview\"\n style={{ borderRight: '1px solid #e0e0e0' }}\n >\n {open && <CalendarModule customData={customData} moduleDataApi={moduleDataApi} />}\n </div>\n </div>\n <div className=\"config-widget-dialog-panel\" style={{ borderLeft: 'none' }}>\n <div className=\"bitable-dashboard edit-panel-container\" style={{ paddingTop: '20px' }}>\n <CustomData\n enumDataApi={enumDataApi}\n selectModuleData={selectModuleData}\n onAllValuesChange={allVal => {\n setCustomData(allVal)\n }}\n />\n </div>\n <div className=\"button-container\">\n <Button\n type=\"primary\"\n onClick={() => {\n onOk?.({\n id: selectModuleData?.id,\n customData,\n title,\n })\n }}\n >\n {t('confirm')}\n </Button>\n </div>\n </div>\n </div>\n </Modal>\n </>\n )\n}\n\nexport default AddStatisticsModal\n"],"names":[],"mappings":";;;;;;;;AAoBA,MAAM,qBAAwD,CAAC;AAAA,EAC7D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACE,QAAA,EAAE,EAAE,IAAI,eAAe;AAC7B,QAAM,CAAC,YAAY,aAAa,IAAI,SAAmC;AAEvE,YAAU,MAAM;AACd,QAAI,kBAAkB;AACpB,oBAAc,qDAAkB,UAAU;AAAA,IAAA;AAAA,EAC5C,GACC,CAAC,gBAAgB,CAAC;AAGrB,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAiB,EAAE;AAC7C,YAAU,MAAM;AACd,QAAI,MAAM;AACR,gBAAS,qDAAkB,SAAQ,qDAAkB,QAAQ,EAAE,cAAc,CAAC;AAAA,IAAA;AAAA,EAChF,GACC,CAAC,IAAI,CAAC;AAET,SAEI,oBAAA,UAAA,EAAA,UAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAM;AAAA,MACN,OAAQ,oBAAA,cAAA,EAAa,OAAO,OAAO,UAAU,UAAU;AAAA,MACvD,QAAQ;AAAA,MACR;AAAA,MACA,gBAAc;AAAA,MACd,UAAU;AAAA,MACV,+BAAY,eAAc,EAAA;AAAA,MAC1B,WAAU;AAAA,MAEV,UAAA,qBAAC,OAAI,EAAA,WAAU,kCACb,UAAA;AAAA,QAAC,oBAAA,OAAA,EAAI,WAAU,gCACb,UAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,aAAa,oBAAoB;AAAA,YAEzC,UAAQ,QAAA,oBAAC,gBAAe,EAAA,YAAwB,cAA8B,CAAA;AAAA,UAAA;AAAA,QAAA,GAEnF;AAAA,QACA,qBAAC,SAAI,WAAU,8BAA6B,OAAO,EAAE,YAAY,OAC/D,GAAA,UAAA;AAAA,UAAA,oBAAC,SAAI,WAAU,0CAAyC,OAAO,EAAE,YAAY,UAC3E,UAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC;AAAA,cACA;AAAA,cACA,mBAAmB,CAAU,WAAA;AAC3B,8BAAc,MAAM;AAAA,cAAA;AAAA,YACtB;AAAA,UAAA,GAEJ;AAAA,UACA,oBAAC,OAAI,EAAA,WAAU,oBACb,UAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,MAAM;AACN,6CAAA;AAAA,kBACL,IAAI,qDAAkB;AAAA,kBACtB;AAAA,kBACA;AAAA,gBAAA;AAAA,cAEJ;AAAA,cAEC,YAAE,SAAS;AAAA,YAAA;AAAA,UAAA,EAEhB,CAAA;AAAA,QAAA,EACF,CAAA;AAAA,MAAA,EACF,CAAA;AAAA,IAAA;AAAA,EAAA,GAEJ;AAEJ;"}
|
|
@@ -2,11 +2,12 @@ import { jsx, jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { useState, useMemo, useEffect } from "react";
|
|
3
3
|
import clsx from "clsx";
|
|
4
4
|
import { Popover, Button, Select } from "antd";
|
|
5
|
-
import {
|
|
5
|
+
import { PlusOutlined } from "@ant-design/icons";
|
|
6
6
|
import { useTranslation } from "react-i18next";
|
|
7
7
|
import { useMemoizedFn } from "ahooks";
|
|
8
8
|
import { cloneDeep, isEqual } from "lodash-es";
|
|
9
9
|
import { useAppContext } from "../../context.js";
|
|
10
|
+
import SvgComponent from "../../icon/icon-Filter.js";
|
|
10
11
|
import { useConditionTypeOptions } from "../add-module-modal/components/condition-modal/config.js";
|
|
11
12
|
import { ConditionRowItem } from "./ConditionRowItem.js";
|
|
12
13
|
import styles from "./index.module.less.js";
|
|
@@ -74,11 +75,15 @@ const GlobalFilterCondition = (props) => {
|
|
|
74
75
|
trigger: "click",
|
|
75
76
|
open,
|
|
76
77
|
onOpenChange: setOpen,
|
|
77
|
-
children: /* @__PURE__ */
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
78
|
+
children: /* @__PURE__ */ jsx(
|
|
79
|
+
Button,
|
|
80
|
+
{
|
|
81
|
+
className: `!px-1 ${((globalFilterCondition == null ? void 0 : globalFilterCondition.length) ?? 0) > 0 ? "!bg-primary/10" : ""}`,
|
|
82
|
+
type: "text",
|
|
83
|
+
icon: /* @__PURE__ */ jsx(SvgComponent, {}),
|
|
84
|
+
children: t("globalfilter")
|
|
85
|
+
}
|
|
86
|
+
)
|
|
82
87
|
}
|
|
83
88
|
) })
|
|
84
89
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../packages/dashboard-workbench/components/global-filter-condition/index.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useState } from 'react'\nimport clsx from 'clsx'\nimport { Button, MenuProps, Popover, Select, Space } from 'antd'\nimport { FilterOutlined, PlusOutlined } from '@ant-design/icons'\nimport { useTranslation } from 'react-i18next'\nimport { useMemoizedFn } from 'ahooks'\nimport { cloneDeep, isEqual } from 'lodash-es'\nimport { useAppContext } from '@platox/pivot-table/context'\nimport { useConditionTypeOptions } from '../add-module-modal/components/condition-modal/config'\nimport ConditionRowItem from './ConditionRowItem'\nimport { FieldPickerDataSourceItem } from './FieldPicker'\nimport styles from './index.module.less'\nimport { ConditionBlockWrapper, ConditionListItemWrapper } from './interface'\nimport { Context, ContextProps, useContext } from './useContext'\nimport { getMergeId } from './util'\n\nconst componentName = 'global-filter-condition'\n\nconst Empty: unknown[] = []\n\n/* ============================== split =============================== */\n\nexport interface GlobalFilterConditionProps {\n className?: string\n style?: React.CSSProperties\n}\nexport const GlobalFilterCondition: React.FC<GlobalFilterConditionProps> = props => {\n const { className, style } = props\n\n const { t } = useTranslation()\n\n const { globalFilterCondition, setGlobalFilterCondition } = useAppContext()\n\n const [open, setOpen] = useState<boolean>(false)\n\n /* ============================== 整理数据 =============================== */\n const { globalData } = useAppContext()\n const { fieldPickerDataSource, flattenFieldMap } = useMemo(() => {\n let flattenFieldMap: ContextProps['flattenFieldMap'] = new Map()\n\n let fieldPickerDataSource = (globalData?.sourceData || []).map(item => {\n let children = (item?.fields || []).map(v => {\n let mergeId = getMergeId(item?.value, v?.value)\n\n // 记录mergeId对应的field和source\n flattenFieldMap.set(mergeId, {\n field: v,\n source: item,\n mergeId: mergeId,\n })\n\n return {\n key: mergeId,\n label: v?.label,\n }\n })\n\n return {\n key: item?.value,\n label: item?.label,\n children,\n popupClassName: styles['sub-popup'],\n }\n })\n\n return {\n fieldPickerDataSource: fieldPickerDataSource as unknown as FieldPickerDataSourceItem[],\n flattenFieldMap,\n }\n }, [globalData?.sourceData])\n\n return (\n <Context.Provider\n value={{\n fieldPickerDataSource: fieldPickerDataSource,\n flattenFieldMap: flattenFieldMap,\n }}\n >\n <div className={clsx(styles[`${componentName}`], className)} style={style}>\n <Popover\n content={\n <PopoverContent\n defaultValue={globalFilterCondition}\n onClose={(isOk, data) => {\n if (isOk) {\n setGlobalFilterCondition(data!)\n }\n setOpen(false)\n }}\n />\n }\n destroyTooltipOnHide\n placement=\"bottomRight\"\n trigger=\"click\"\n open={open}\n onOpenChange={setOpen}\n >\n <Button>\n <FilterOutlined />\n {t('globalfilter')}\n {(globalFilterCondition?.length ?? 0) > 0 ? `(${globalFilterCondition?.length})` : ''}\n </Button>\n </Popover>\n </div>\n </Context.Provider>\n )\n}\n\nGlobalFilterCondition.displayName = 'GlobalFilterCondition'\n\nexport default GlobalFilterCondition\n\n/* ============================== split =============================== */\n\nexport type PopoverContentProps = {\n defaultValue?: ConditionBlockWrapper[]\n onClose?: (isOk: boolean, data?: ConditionBlockWrapper[]) => void\n}\n\nexport const PopoverContent = (props: PopoverContentProps) => {\n const { defaultValue } = props\n\n const { t } = useTranslation()\n const fieldPickerDataSource = useContext().fieldPickerDataSource\n const conditionTypeOptions = useConditionTypeOptions()\n\n /* ============================== split =============================== */\n const [value = Empty as ConditionBlockWrapper[], setValue] = useState<ConditionBlockWrapper[]>([])\n\n useEffect(() => {\n if (defaultValue) {\n setValue(cloneDeep(defaultValue))\n }\n }, [defaultValue])\n\n /* ============================== 这是empty =============================== */\n const [emptyBlockList, setEmptyBlockList] = useState<ConditionListItemWrapper[]>([])\n\n const handleEmptyBlockListChange = (newItem: ConditionListItemWrapper) => {\n if (newItem?.field) {\n setValue(prev => {\n let ret = [...prev]\n let match = ret.find(item => item.dataSourceId === newItem.dataSourceId)\n if (match) {\n match.conditionList.push(newItem)\n return [...ret]\n } else {\n // 创建一个\n let newConditionBlockWrapper = {\n dataSourceId: newItem.dataSourceId,\n conditionType: 'all',\n conditionList: [newItem],\n } as ConditionBlockWrapper\n return [...ret, newConditionBlockWrapper]\n }\n })\n }\n }\n\n const handleAddEmptyBlock = () => {\n setEmptyBlockList([...emptyBlockList, {}])\n }\n\n /* ============================== split =============================== */\n const hasChange = useMemo(() => {\n return !isEqual(value, defaultValue)\n }, [value, defaultValue])\n\n const handleSubmit = useMemoizedFn(() => {\n props?.onClose?.(true, value)\n })\n\n return (\n <div className={clsx(styles[`${componentName}__popover`])}>\n <div\n style={{\n marginBottom: '10px',\n }}\n >\n {t('setFilterCondition')}\n </div>\n\n {value.map((item, index) => {\n let conditionList = item?.conditionList\n let dataSourceName = fieldPickerDataSource?.find(v => v.key === item?.dataSourceId)?.label\n\n return (\n <div className={clsx(styles[`${componentName}__block`])} key={item?.dataSourceId}>\n <div\n style={{\n marginBottom: '10px',\n display: 'flex',\n justifyContent: 'space-between',\n }}\n >\n <div>{dataSourceName}</div>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '5px',\n }}\n >\n {t('conformTo')}\n <Select\n style={{ width: '80px' }}\n options={conditionTypeOptions}\n value={item?.conditionType}\n onChange={v => {\n setValue(prev => {\n let ret = [...prev]\n ret[index].conditionType = v\n return ret\n })\n }}\n />\n {t('addCondition')}\n </div>\n </div>\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: '10px',\n }}\n >\n {conditionList.map((v, conditionIndex) => {\n return (\n <ConditionRowItem\n key={conditionIndex}\n value={v}\n onChange={newValue => {\n setValue(prev => {\n let ret = [...prev]\n let prevItem = ret[index].conditionList[conditionIndex]\n if (prevItem?.dataSourceId !== newValue?.dataSourceId) {\n // 数据源变化了 删除原来的\n ret[index].conditionList.splice(conditionIndex, 1)\n if (ret[index].conditionList.length === 0) {\n ret.splice(index, 1)\n }\n // 添加到新的数据源添\n let newItem = newValue\n let match = ret.find(item => item.dataSourceId === newItem.dataSourceId)\n if (match) {\n match.conditionList.push(newItem)\n return [...ret]\n } else {\n let newConditionBlockWrapper = {\n dataSourceId: newItem.dataSourceId,\n conditionType: 'all',\n conditionList: [newItem],\n } as ConditionBlockWrapper\n return [...ret, newConditionBlockWrapper]\n }\n } else {\n ret[index].conditionList[conditionIndex] = {\n ...prevItem,\n ...newValue,\n }\n }\n\n return ret\n })\n }}\n onDelete={() => {\n setValue(prev => {\n let ret = [...prev]\n ret[index].conditionList.splice(conditionIndex, 1)\n\n if (ret[index].conditionList.length === 0) {\n ret.splice(index, 1)\n }\n return ret\n })\n }}\n />\n )\n })}\n </div>\n </div>\n )\n })}\n\n {emptyBlockList.map((item, index) => {\n return (\n <div className={clsx(styles[`${componentName}__block`])} key={index}>\n <ConditionRowItem\n value={item}\n onChange={newValue => {\n handleEmptyBlockListChange(newValue)\n }}\n onDelete={() => {\n setEmptyBlockList(prev => {\n let ret = [...prev]\n ret.splice(index, 1)\n return ret\n })\n }}\n />\n </div>\n )\n })}\n\n <Button\n type=\"dashed\"\n block\n style={{\n marginBottom: '10px',\n }}\n icon={<PlusOutlined />}\n onClick={() => {\n handleAddEmptyBlock()\n }}\n >\n {t('addCondition')}\n </Button>\n\n <div\n style={{\n display: 'flex',\n justifyContent: 'flex-end',\n }}\n >\n <Button\n type=\"primary\"\n disabled={!hasChange}\n onClick={() => {\n handleSubmit()\n }}\n >\n {t('confirm')}\n </Button>\n </div>\n </div>\n )\n}\n"],"names":["flattenFieldMap","fieldPickerDataSource","item"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../packages/dashboard-workbench/components/global-filter-condition/index.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useState } from 'react'\nimport clsx from 'clsx'\nimport { Button, Popover, Select } from 'antd'\nimport { PlusOutlined } from '@ant-design/icons'\nimport { useTranslation } from 'react-i18next'\nimport { useMemoizedFn } from 'ahooks'\nimport { cloneDeep, isEqual } from 'lodash-es'\nimport { useAppContext } from '@platox/pivot-table/context'\nimport IconFilter from '@platox/pivot-table/icon/icon-Filter'\nimport { useConditionTypeOptions } from '../add-module-modal/components/condition-modal/config'\nimport ConditionRowItem from './ConditionRowItem'\nimport { FieldPickerDataSourceItem } from './FieldPicker'\nimport styles from './index.module.less'\nimport { ConditionBlockWrapper, ConditionListItemWrapper } from './interface'\nimport { Context, ContextProps, useContext } from './useContext'\nimport { getMergeId } from './util'\n\nconst componentName = 'global-filter-condition'\n\nconst Empty: unknown[] = []\n\n/* ============================== split =============================== */\n\nexport interface GlobalFilterConditionProps {\n className?: string\n style?: React.CSSProperties\n}\nexport const GlobalFilterCondition: React.FC<GlobalFilterConditionProps> = props => {\n const { className, style } = props\n\n const { t } = useTranslation()\n\n const { globalFilterCondition, setGlobalFilterCondition } = useAppContext()\n\n const [open, setOpen] = useState<boolean>(false)\n\n /* ============================== 整理数据 =============================== */\n const { globalData } = useAppContext()\n const { fieldPickerDataSource, flattenFieldMap } = useMemo(() => {\n let flattenFieldMap: ContextProps['flattenFieldMap'] = new Map()\n\n let fieldPickerDataSource = (globalData?.sourceData || []).map(item => {\n let children = (item?.fields || []).map(v => {\n let mergeId = getMergeId(item?.value, v?.value)\n\n // 记录mergeId对应的field和source\n flattenFieldMap.set(mergeId, {\n field: v,\n source: item,\n mergeId: mergeId,\n })\n\n return {\n key: mergeId,\n label: v?.label,\n }\n })\n\n return {\n key: item?.value,\n label: item?.label,\n children,\n popupClassName: styles['sub-popup'],\n }\n })\n\n return {\n fieldPickerDataSource: fieldPickerDataSource as unknown as FieldPickerDataSourceItem[],\n flattenFieldMap,\n }\n }, [globalData?.sourceData])\n\n return (\n <Context.Provider\n value={{\n fieldPickerDataSource: fieldPickerDataSource,\n flattenFieldMap: flattenFieldMap,\n }}\n >\n <div className={clsx(styles[`${componentName}`], className)} style={style}>\n <Popover\n content={\n <PopoverContent\n defaultValue={globalFilterCondition}\n onClose={(isOk, data) => {\n if (isOk) {\n setGlobalFilterCondition(data!)\n }\n setOpen(false)\n }}\n />\n }\n destroyTooltipOnHide\n placement=\"bottomRight\"\n trigger=\"click\"\n open={open}\n onOpenChange={setOpen}\n >\n <Button\n className={`!px-1 ${(globalFilterCondition?.length ?? 0) > 0 ? '!bg-primary/10' : ''}`}\n type=\"text\"\n icon={<IconFilter />}\n >\n {t('globalfilter')}\n {/* {t('common.filter')} */}\n </Button>\n </Popover>\n </div>\n </Context.Provider>\n )\n}\n\nGlobalFilterCondition.displayName = 'GlobalFilterCondition'\n\nexport default GlobalFilterCondition\n\n/* ============================== split =============================== */\n\nexport type PopoverContentProps = {\n defaultValue?: ConditionBlockWrapper[]\n onClose?: (isOk: boolean, data?: ConditionBlockWrapper[]) => void\n}\n\nexport const PopoverContent = (props: PopoverContentProps) => {\n const { defaultValue } = props\n\n const { t } = useTranslation()\n const fieldPickerDataSource = useContext().fieldPickerDataSource\n const conditionTypeOptions = useConditionTypeOptions()\n\n /* ============================== split =============================== */\n const [value = Empty as ConditionBlockWrapper[], setValue] = useState<ConditionBlockWrapper[]>([])\n\n useEffect(() => {\n if (defaultValue) {\n setValue(cloneDeep(defaultValue))\n }\n }, [defaultValue])\n\n /* ============================== 这是empty =============================== */\n const [emptyBlockList, setEmptyBlockList] = useState<ConditionListItemWrapper[]>([])\n\n const handleEmptyBlockListChange = (newItem: ConditionListItemWrapper) => {\n if (newItem?.field) {\n setValue(prev => {\n let ret = [...prev]\n let match = ret.find(item => item.dataSourceId === newItem.dataSourceId)\n if (match) {\n match.conditionList.push(newItem)\n return [...ret]\n } else {\n // 创建一个\n let newConditionBlockWrapper = {\n dataSourceId: newItem.dataSourceId,\n conditionType: 'all',\n conditionList: [newItem],\n } as ConditionBlockWrapper\n return [...ret, newConditionBlockWrapper]\n }\n })\n }\n }\n\n const handleAddEmptyBlock = () => {\n setEmptyBlockList([...emptyBlockList, {}])\n }\n\n /* ============================== split =============================== */\n const hasChange = useMemo(() => {\n return !isEqual(value, defaultValue)\n }, [value, defaultValue])\n\n const handleSubmit = useMemoizedFn(() => {\n props?.onClose?.(true, value)\n })\n\n return (\n <div className={clsx(styles[`${componentName}__popover`])}>\n <div\n style={{\n marginBottom: '10px',\n }}\n >\n {t('setFilterCondition')}\n </div>\n\n {value.map((item, index) => {\n let conditionList = item?.conditionList\n let dataSourceName = fieldPickerDataSource?.find(v => v.key === item?.dataSourceId)?.label\n\n return (\n <div className={clsx(styles[`${componentName}__block`])} key={item?.dataSourceId}>\n <div\n style={{\n marginBottom: '10px',\n display: 'flex',\n justifyContent: 'space-between',\n }}\n >\n <div>{dataSourceName}</div>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '5px',\n }}\n >\n {t('conformTo')}\n <Select\n style={{ width: '80px' }}\n options={conditionTypeOptions}\n value={item?.conditionType}\n onChange={v => {\n setValue(prev => {\n let ret = [...prev]\n ret[index].conditionType = v\n return ret\n })\n }}\n />\n {t('addCondition')}\n </div>\n </div>\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: '10px',\n }}\n >\n {conditionList.map((v, conditionIndex) => {\n return (\n <ConditionRowItem\n key={conditionIndex}\n value={v}\n onChange={newValue => {\n setValue(prev => {\n let ret = [...prev]\n let prevItem = ret[index].conditionList[conditionIndex]\n if (prevItem?.dataSourceId !== newValue?.dataSourceId) {\n // 数据源变化了 删除原来的\n ret[index].conditionList.splice(conditionIndex, 1)\n if (ret[index].conditionList.length === 0) {\n ret.splice(index, 1)\n }\n // 添加到新的数据源添\n let newItem = newValue\n let match = ret.find(item => item.dataSourceId === newItem.dataSourceId)\n if (match) {\n match.conditionList.push(newItem)\n return [...ret]\n } else {\n let newConditionBlockWrapper = {\n dataSourceId: newItem.dataSourceId,\n conditionType: 'all',\n conditionList: [newItem],\n } as ConditionBlockWrapper\n return [...ret, newConditionBlockWrapper]\n }\n } else {\n ret[index].conditionList[conditionIndex] = {\n ...prevItem,\n ...newValue,\n }\n }\n\n return ret\n })\n }}\n onDelete={() => {\n setValue(prev => {\n let ret = [...prev]\n ret[index].conditionList.splice(conditionIndex, 1)\n\n if (ret[index].conditionList.length === 0) {\n ret.splice(index, 1)\n }\n return ret\n })\n }}\n />\n )\n })}\n </div>\n </div>\n )\n })}\n\n {emptyBlockList.map((item, index) => {\n return (\n <div className={clsx(styles[`${componentName}__block`])} key={index}>\n <ConditionRowItem\n value={item}\n onChange={newValue => {\n handleEmptyBlockListChange(newValue)\n }}\n onDelete={() => {\n setEmptyBlockList(prev => {\n let ret = [...prev]\n ret.splice(index, 1)\n return ret\n })\n }}\n />\n </div>\n )\n })}\n\n <Button\n type=\"dashed\"\n block\n style={{\n marginBottom: '10px',\n }}\n icon={<PlusOutlined />}\n onClick={() => {\n handleAddEmptyBlock()\n }}\n >\n {t('addCondition')}\n </Button>\n\n <div\n style={{\n display: 'flex',\n justifyContent: 'flex-end',\n }}\n >\n <Button\n type=\"primary\"\n disabled={!hasChange}\n onClick={() => {\n handleSubmit()\n }}\n >\n {t('confirm')}\n </Button>\n </div>\n </div>\n )\n}\n"],"names":["flattenFieldMap","fieldPickerDataSource","IconFilter","item"],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
const SvgComponent = (props) => /* @__PURE__ */ jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", width: "1em", height: "1em", fill: "currentColor", ...props, children: [
|
|
3
|
+
/* @__PURE__ */ jsx("g", { clipPath: "url(#a)", children: /* @__PURE__ */ jsx(
|
|
4
|
+
"path",
|
|
5
|
+
{
|
|
6
|
+
fill: "#000",
|
|
7
|
+
fillRule: "evenodd",
|
|
8
|
+
d: "M3 2.666a.167.167 0 0 0-.166.167v1.634c0 .057.03.11.077.14l3.05 1.94c.336.215.54.586.54.985v4.634a.5.5 0 1 1-1 0V7.532c0-.057-.03-.11-.078-.14L2.374 5.45a1.167 1.167 0 0 1-.54-.984V2.833c0-.645.522-1.167 1.167-1.167h10c.644 0 1.166.522 1.166 1.167v1.634c0 .399-.204.77-.54.984l-3.05 1.94a.167.167 0 0 0-.076.141v6.3a.5.5 0 0 1-1 0v-6.3c0-.399.203-.77.54-.984l3.05-1.94a.167.167 0 0 0 .076-.141V2.833a.167.167 0 0 0-.166-.167H3Z",
|
|
9
|
+
clipRule: "evenodd"
|
|
10
|
+
}
|
|
11
|
+
) }),
|
|
12
|
+
/* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsx("clipPath", { id: "a", children: /* @__PURE__ */ jsx("path", { fill: "#fff", d: "M0 0h16v16H0z" }) }) })
|
|
13
|
+
] });
|
|
14
|
+
export {
|
|
15
|
+
SvgComponent as default
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=icon-Filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icon-Filter.js","sources":["../../../packages/dashboard-workbench/icon/icon-Filter.tsx"],"sourcesContent":["import * as React from 'react'\nimport { SVGProps } from 'react'\n\nconst SvgComponent = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" fill=\"currentColor\" {...props}>\n <g clipPath=\"url(#a)\">\n <path\n fill=\"#000\"\n fillRule=\"evenodd\"\n d=\"M3 2.666a.167.167 0 0 0-.166.167v1.634c0 .057.03.11.077.14l3.05 1.94c.336.215.54.586.54.985v4.634a.5.5 0 1 1-1 0V7.532c0-.057-.03-.11-.078-.14L2.374 5.45a1.167 1.167 0 0 1-.54-.984V2.833c0-.645.522-1.167 1.167-1.167h10c.644 0 1.166.522 1.166 1.167v1.634c0 .399-.204.77-.54.984l-3.05 1.94a.167.167 0 0 0-.076.141v6.3a.5.5 0 0 1-1 0v-6.3c0-.399.203-.77.54-.984l3.05-1.94a.167.167 0 0 0 .076-.141V2.833a.167.167 0 0 0-.166-.167H3Z\"\n clipRule=\"evenodd\"\n />\n </g>\n <defs>\n <clipPath id=\"a\">\n <path fill=\"#fff\" d=\"M0 0h16v16H0z\" />\n </clipPath>\n </defs>\n </svg>\n)\nexport default SvgComponent\n"],"names":[],"mappings":";AAGA,MAAM,eAAe,CAAC,UACpB,qBAAC,SAAI,OAAM,8BAA6B,OAAM,OAAM,QAAO,OAAM,MAAK,gBAAgB,GAAG,OACvF,UAAA;AAAA,EAAC,oBAAA,KAAA,EAAE,UAAS,WACV,UAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,UAAS;AAAA,MACT,GAAE;AAAA,MACF,UAAS;AAAA,IAAA;AAAA,EAAA,GAEb;AAAA,EACC,oBAAA,QAAA,EACC,UAAC,oBAAA,YAAA,EAAS,IAAG,KACX,UAAC,oBAAA,QAAA,EAAK,MAAK,QAAO,GAAE,gBAAA,CAAgB,GACtC,EACF,CAAA;AAAA,EACF,CAAA;"}
|
|
@@ -202,13 +202,18 @@ const DashboardWorkbench = ({
|
|
|
202
202
|
}
|
|
203
203
|
),
|
|
204
204
|
/* @__PURE__ */ jsx(
|
|
205
|
-
|
|
205
|
+
"div",
|
|
206
206
|
{
|
|
207
207
|
style: {
|
|
208
|
-
|
|
208
|
+
width: "1px",
|
|
209
|
+
height: "1rem",
|
|
210
|
+
backgroundColor: "rgba(217, 217, 217, 1)",
|
|
211
|
+
marginLeft: "12px",
|
|
212
|
+
marginRight: "4px"
|
|
209
213
|
}
|
|
210
214
|
}
|
|
211
|
-
)
|
|
215
|
+
),
|
|
216
|
+
/* @__PURE__ */ jsx(GlobalFilterCondition, {})
|
|
212
217
|
] }) }),
|
|
213
218
|
/* @__PURE__ */ jsx("div", { className: "bitable-block-dashboard__mount", children: /* @__PURE__ */ jsx("div", { className: "dashboard-container", children: /* @__PURE__ */ jsx(
|
|
214
219
|
"div",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../packages/dashboard-workbench/index.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport React, { useEffect, useMemo, useRef, useState } from 'react'\nimport { message, Modal } from 'antd'\nimport { ExclamationCircleOutlined } from '@ant-design/icons'\nimport { Layout, Responsive, WidthProvider } from 'react-grid-layout'\nimport { useTranslation } from 'react-i18next'\nimport { useControllableValue, useLatest, useLocalStorageState, useMemoizedFn } from 'ahooks'\nimport { omit, pick } from 'lodash-es'\nimport AddModuleBtn, { ModuleValueType } from './components/add-module-btn'\nimport AddCalendarModal from './components/add-module-modal/add-calendar-modal'\nimport AddChartModal from './components/add-module-modal/add-chart-modal'\nimport AddStatisticsModal from './components/add-module-modal/add-statistics-modal'\nimport { GlobalFilterCondition } from './components/global-filter-condition'\nimport { ConditionBlockWrapper } from './components/global-filter-condition/interface'\nimport ModuleContent, { ModuleData } from './components/module-content'\nimport ModuleHeader from './components/module-header'\nimport { AppContext } from './context'\nimport { EnumDataApi, ModuleConfigDataTypes, ModuleDataApi, SourceDataItem } from './types'\nimport { findChangedItems } from './utils'\nimport './lang/index'\nimport '/node_modules/react-grid-layout/css/styles.css'\nimport './styles/index.less'\n\nconst ResponsiveReactGridLayout = WidthProvider(Responsive)\n\ninterface DashboardWorkbenchProps {\n sourceData?: SourceDataItem[]\n moduleConfigData?: ModuleConfigDataTypes\n fieldMap?: Record<string, string>\n lang?: 'zh-CN' | 'en-US'\n moduleDataApi?: ModuleDataApi\n enumDataApi?: EnumDataApi\n onCreateModule?: (val: ModuleData) => Promise<{ data: ModuleData }>\n onUpdateModule?: (val: ModuleData) => Promise<{ data: ModuleData }>\n onDeleteModule?: (val: string) => Promise<{ data: ModuleData }>\n onLayoutChange?: (layout: Layout[]) => void\n className?: string\n cols?: { lg: number; md: number; sm: number; xs: number; xxs: number }\n rowHeight?: number\n}\n\nconst DashboardWorkbench: React.FC<DashboardWorkbenchProps> = ({\n moduleConfigData,\n moduleDataApi,\n enumDataApi,\n onCreateModule,\n onUpdateModule,\n onDeleteModule,\n className = 'layout',\n cols = { lg: 12, md: 12, sm: 12, xs: 12, xxs: 12 },\n rowHeight = 79,\n}) => {\n const { t } = useTranslation()\n\n /* ============================== modules =============================== */\n const [modules, setModules] = useState<ModuleData[] | undefined>([])\n const [activeId, setActiveId] = useState<ModuleData['id']>()\n\n useEffect(() => {\n setModules(\n moduleConfigData?.map(item => ({\n ...item,\n i: item.i ? item.i : item.id,\n })) || []\n )\n }, [moduleConfigData])\n\n const addModule = async (data: ModuleValueType) => {\n const wMultiple = data.type === 'calendar' ? 5 : 4\n const hMultiple = data.type === 'calendar' ? 5 : 3\n\n if (Array.isArray(modules) && data.type) {\n const newModuleData = {\n x: 0,\n y: 0,\n w: wMultiple,\n h: hMultiple,\n title: data.type.includes('chart') ? t('chartText') : title[data.type],\n ...data,\n type: data.type,\n }\n await onCreateModule?.(newModuleData).then((res: any) => {\n if (!res.success) {\n message.error(res.message)\n return\n }\n setModules([...modules, { ...newModuleData, i: res.data?.id, id: res.data?.id }])\n })\n }\n }\n\n // 单个\n const updateModule = async (id: ModuleData['id'], updatedProps: Partial<ModuleData>) => {\n if (modules?.length) {\n const oldData = modules.find(m => m.id === id)\n const updatedModule = {\n ...oldData!,\n ...updatedProps,\n }\n const modulesData = modules.map(m => (m.id === id ? updatedModule : m))\n setModules(modulesData)\n await onUpdateModule?.(updatedModule).then((res: any) => {\n if (!res.success) {\n message.error(res.message)\n return\n }\n })\n }\n }\n\n // 批量\n const updateModules = async (updatedItems: Partial<ModuleData>[]) => {\n if (!modules?.length || !updatedItems?.length) return\n const updatedModules = modules.map(module => {\n const update = updatedItems.find(item => item.id === module.id)\n return update ? { ...module, ...update } : module\n })\n setModules(updatedModules)\n try {\n for (const updatedItem of updatedItems) {\n const res: any = await onUpdateModule?.(updatedItem as ModuleData)\n if (!res?.success) {\n throw new Error(res?.message || `Failed to update module: ${updatedItem.id}`)\n }\n }\n } catch (error: any) {\n setModules(modules)\n message.error(error.message || 'Failed to update modules')\n }\n }\n\n const deleteModule = async (id: ModuleData['id']) => {\n if (modules?.length) {\n setModules(modules.filter(m => m.id !== id))\n await onDeleteModule?.(id || '')\n }\n }\n\n /* ============================== drag =============================== */\n\n const margins: [number, number] = [10, 10]\n const [rowWidth, setRowWidth] = useState(0)\n const [, setCurrentCols] = useState<number>(cols.lg)\n\n const [isDragOrResize, setIsDragOrResize] = useState(false)\n const [isDragOrResizeEnd, setIsDragOrResizeEnd] = useState(false)\n\n const onBreakpointChange = (_breakpoint: string, cols: number) => {\n setCurrentCols(cols)\n }\n\n const onDragResizeStop = (newLayout: Layout[]) => {\n const changedItems = findChangedItems(newLayout, modules as any)\n const newChangedItems = changedItems.map(item => {\n const module = modules?.find(module => module.i === item.i)\n return { ...module, ...item }\n })\n updateModules(newChangedItems)\n }\n\n const onDragStartOrEnd = (type: 'start' | 'end', newLayout?: Layout[]) => {\n if (type === 'start') {\n setIsDragOrResize(true)\n setIsDragOrResizeEnd(true)\n } else {\n setIsDragOrResize(false)\n setTimeout(() => {\n setIsDragOrResizeEnd(false)\n }, 500)\n onDragResizeStop(newLayout || [])\n }\n }\n\n /* ============================== split =============================== */\n const [selectModuleData, setSelectModuleData] = useState<ModuleData>()\n\n const [isShowAddStatisticsModal, setIsShowAddStatisticsModal] = useState<boolean>(false)\n const [isShowAddCalendarModal, setIsShowAddCalendarModal] = useState<boolean>(false)\n const [isShowAddChartModal, setIsShowAddChartModal] = useState<boolean>(false)\n\n const handleOpenCreateModal = (val: any) => {\n if (val === 'text') {\n const data = {\n type: val,\n customData: {\n title: t('text'),\n editor: [\n {\n type: 'paragraph',\n children: [\n {\n text: '',\n },\n ],\n },\n ],\n },\n }\n addModule(data)\n } else if (val === 'statistics') {\n setIsShowAddStatisticsModal(true)\n } else if (val === 'calendar') {\n setIsShowAddCalendarModal(true)\n } else if (val?.includes('chart')) {\n setIsShowAddChartModal(true)\n }\n\n setSelectModuleData({\n title: '',\n type: val,\n w: 0,\n h: 0,\n x: 0,\n y: 0,\n })\n }\n\n const commonModalProps = {\n moduleDataApi: moduleDataApi,\n enumDataApi: enumDataApi,\n selectModuleData: selectModuleData,\n }\n const handleModalSubmit = (data: Partial<ModuleData>) => {\n if (data.id) {\n updateModule(data.id, omit(data, 'id'))\n } else {\n addModule(data)\n }\n }\n /* ============================== split =============================== */\n const title: any = {\n text: t('pb.text'),\n calendar: t('calendarText'),\n statistics: t('chartText'),\n }\n\n return (\n <div className=\"pivot-table\">\n <div className=\"bitable-block-dashboard\">\n <div className=\"bitable-block-dashboard-toolbar bitable-toolbar\">\n <div className=\"bitable-block-dashboard-toolbar--left\">\n <AddModuleBtn\n onOk={val => {\n handleOpenCreateModal(val)\n }}\n />\n <GlobalFilterCondition\n style={{\n marginLeft: 10,\n }}\n />\n </div>\n </div>\n <div className=\"bitable-block-dashboard__mount\">\n <div className=\"dashboard-container\">\n <div\n className={`dashboard-content-container ${isDragOrResize ? 'isDragOrResize' : ''} ${\n isDragOrResizeEnd ? 'isDragOrResizeEnd' : ''\n }`}\n >\n <ResponsiveReactGridLayout\n onBreakpointChange={onBreakpointChange}\n className={className}\n compactType=\"vertical\"\n preventCollision={false}\n cols={cols}\n margin={margins}\n rowHeight={rowHeight}\n measureBeforeMount={false}\n draggableHandle=\".isCanDrag\"\n // draggableCancel=\".isNoCanDrag\"\n onWidthChange={(containerWidth, _margin, cols) => {\n setRowWidth(containerWidth / cols - 1)\n }}\n onDragStart={() => {\n onDragStartOrEnd('start')\n }}\n onDragStop={newLayout => {\n onDragStartOrEnd('end', newLayout)\n }}\n onResizeStart={() => {\n onDragStartOrEnd('start')\n }}\n onResizeStop={newLayout => {\n onDragStartOrEnd('end', newLayout)\n }}\n style={{\n backgroundSize: `${rowWidth}px ${rowHeight + margins[0]}px`,\n backgroundPosition: `${margins[0]}px ${margins[0]}px`,\n minHeight: '100vh',\n }}\n >\n {modules?.map(module => (\n <div\n className={`box-dashboard ${activeId === module.id ? 'active' : ''}`}\n onClick={() => {\n setActiveId(module.id)\n }}\n key={module.id}\n data-grid={{\n i: module.id,\n x: module.x || 0,\n y: module.y || 0, // puts it at the bottom\n w: module.w || 2,\n h: module.h || 2,\n minW: 2,\n minH: 2,\n }}\n >\n <ModuleHeader\n module={module}\n defaultValue={module.title}\n onChange={val =>\n updateModule(module.id, {\n title: val,\n })\n }\n onDropdownItem={key => {\n if (key === 'edit') {\n setActiveId(module.id)\n setSelectModuleData(module)\n if (module.type === 'statistics') {\n setIsShowAddStatisticsModal(true)\n }\n if (module.type?.includes('chart')) {\n setIsShowAddChartModal(true)\n }\n if (module.type === 'calendar') {\n setIsShowAddCalendarModal(true)\n }\n } else if (key === 'delete') {\n Modal.confirm({\n title: t('promptTitle'),\n icon: <ExclamationCircleOutlined />,\n content: t('promptContentDeleteComponents'),\n onOk() {\n deleteModule(module.id)\n },\n })\n } else if (key === 'copy') {\n const data = JSON.parse(JSON.stringify(module))\n delete data.id\n delete data.i\n addModule(data)\n }\n }}\n />\n\n <ModuleContent\n module={module}\n onUpdate={updateModule}\n moduleDataApi={moduleDataApi}\n activeId={activeId}\n onClick={() => {\n setActiveId(module.id)\n }}\n rowWidth={rowWidth}\n rowHeight={rowHeight}\n onEdit={() => {\n setActiveId(module.id)\n setSelectModuleData(module)\n if (module.type === 'statistics') {\n setIsShowAddStatisticsModal(true)\n }\n if (module.type?.includes('chart')) {\n setIsShowAddChartModal(true)\n }\n if (module.type === 'calendar') {\n setIsShowAddCalendarModal(true)\n }\n }}\n onDelete={() => {\n deleteModule(module.id)\n }}\n onCopy={() => {\n const data = JSON.parse(JSON.stringify(module))\n delete data.id\n delete data.i\n addModule(data)\n }}\n onStartDragOrResize={() => {\n setIsDragOrResize(true)\n }}\n onStopDragOrResize={() => {\n setIsDragOrResize(false)\n }}\n />\n </div>\n ))}\n </ResponsiveReactGridLayout>\n </div>\n </div>\n </div>\n </div>\n\n <AddStatisticsModal\n {...commonModalProps}\n open={isShowAddStatisticsModal}\n onClose={() => {\n setIsShowAddStatisticsModal(false)\n }}\n onOk={data => {\n handleModalSubmit({\n ...data,\n type: 'statistics',\n })\n setIsShowAddStatisticsModal(false)\n }}\n />\n\n <AddCalendarModal\n {...commonModalProps}\n open={isShowAddCalendarModal}\n onClose={() => {\n setIsShowAddCalendarModal(false)\n }}\n onOk={data => {\n handleModalSubmit({\n ...data,\n type: 'calendar',\n })\n setIsShowAddCalendarModal(false)\n }}\n />\n\n <AddChartModal\n {...commonModalProps}\n open={isShowAddChartModal}\n // open={true}\n onClose={() => {\n setIsShowAddChartModal(false)\n }}\n onOk={data => {\n handleModalSubmit(data)\n setIsShowAddChartModal(false)\n }}\n />\n </div>\n )\n}\n\n/* ============================== split =============================== */\n\nexport type { ConditionBlockWrapper }\nexport type GlobalProps = {\n globalFilterCondition: ConditionBlockWrapper[]\n onGlobalFilterConditionChange: (condition: ConditionBlockWrapper[]) => void\n\n formatCurrency: (val: number, decimalPlaces?: number) => string\n}\n\nconst Empty: unknown = []\n\nexport default React.memo((props: DashboardWorkbenchProps & GlobalProps) => {\n /* ============================== i18n =============================== */\n const { i18n } = useTranslation()\n useEffect(() => {\n i18n.changeLanguage(props?.lang || 'zh_CN')\n }, [i18n, props?.lang])\n\n const globalData = {\n fieldMap: props.fieldMap,\n sourceData: props?.sourceData,\n }\n\n const service = pick(props, [\n 'moduleDataApi',\n 'enumDataApi',\n 'onCreateModule',\n 'onUpdateModule',\n 'onDeleteModule',\n ])\n\n /* ============================== 全局筛选条件 =============================== */\n const [globalFilterCondition = Empty as ConditionBlockWrapper[], setGlobalFilterCondition] =\n useControllableValue<ConditionBlockWrapper[]>(props, {\n valuePropName: 'globalFilterCondition',\n trigger: 'onGlobalFilterConditionChange',\n })\n\n return (\n <AppContext.Provider\n value={{\n globalData,\n service,\n formatCurrency: props?.formatCurrency,\n globalFilterCondition,\n setGlobalFilterCondition: setGlobalFilterCondition as React.Dispatch<\n React.SetStateAction<ConditionBlockWrapper[]>\n >,\n }}\n >\n <DashboardWorkbench {...props} />\n </AppContext.Provider>\n )\n})\n"],"names":["cols","module","AddCalendarModal","AddChartModal"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../packages/dashboard-workbench/index.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport React, { useEffect, useMemo, useRef, useState } from 'react'\nimport { message, Modal } from 'antd'\nimport { ExclamationCircleOutlined } from '@ant-design/icons'\nimport { Layout, Responsive, WidthProvider } from 'react-grid-layout'\nimport { useTranslation } from 'react-i18next'\nimport { useControllableValue, useLatest, useLocalStorageState, useMemoizedFn } from 'ahooks'\nimport { omit, pick } from 'lodash-es'\nimport AddModuleBtn, { ModuleValueType } from './components/add-module-btn'\nimport AddCalendarModal from './components/add-module-modal/add-calendar-modal'\nimport AddChartModal from './components/add-module-modal/add-chart-modal'\nimport AddStatisticsModal from './components/add-module-modal/add-statistics-modal'\nimport { GlobalFilterCondition } from './components/global-filter-condition'\nimport { ConditionBlockWrapper } from './components/global-filter-condition/interface'\nimport ModuleContent, { ModuleData } from './components/module-content'\nimport ModuleHeader from './components/module-header'\nimport { AppContext } from './context'\nimport { EnumDataApi, ModuleConfigDataTypes, ModuleDataApi, SourceDataItem } from './types'\nimport { findChangedItems } from './utils'\nimport './lang/index'\nimport '/node_modules/react-grid-layout/css/styles.css'\nimport './styles/index.less'\n\nconst ResponsiveReactGridLayout = WidthProvider(Responsive)\n\ninterface DashboardWorkbenchProps {\n sourceData?: SourceDataItem[]\n moduleConfigData?: ModuleConfigDataTypes\n fieldMap?: Record<string, string>\n lang?: 'zh-CN' | 'en-US'\n moduleDataApi?: ModuleDataApi\n enumDataApi?: EnumDataApi\n onCreateModule?: (val: ModuleData) => Promise<{ data: ModuleData }>\n onUpdateModule?: (val: ModuleData) => Promise<{ data: ModuleData }>\n onDeleteModule?: (val: string) => Promise<{ data: ModuleData }>\n onLayoutChange?: (layout: Layout[]) => void\n className?: string\n cols?: { lg: number; md: number; sm: number; xs: number; xxs: number }\n rowHeight?: number\n}\n\nconst DashboardWorkbench: React.FC<DashboardWorkbenchProps> = ({\n moduleConfigData,\n moduleDataApi,\n enumDataApi,\n onCreateModule,\n onUpdateModule,\n onDeleteModule,\n className = 'layout',\n cols = { lg: 12, md: 12, sm: 12, xs: 12, xxs: 12 },\n rowHeight = 79,\n}) => {\n const { t } = useTranslation()\n\n /* ============================== modules =============================== */\n const [modules, setModules] = useState<ModuleData[] | undefined>([])\n const [activeId, setActiveId] = useState<ModuleData['id']>()\n\n useEffect(() => {\n setModules(\n moduleConfigData?.map(item => ({\n ...item,\n i: item.i ? item.i : item.id,\n })) || []\n )\n }, [moduleConfigData])\n\n const addModule = async (data: ModuleValueType) => {\n const wMultiple = data.type === 'calendar' ? 5 : 4\n const hMultiple = data.type === 'calendar' ? 5 : 3\n\n if (Array.isArray(modules) && data.type) {\n const newModuleData = {\n x: 0,\n y: 0,\n w: wMultiple,\n h: hMultiple,\n title: data.type.includes('chart') ? t('chartText') : title[data.type],\n ...data,\n type: data.type,\n }\n await onCreateModule?.(newModuleData).then((res: any) => {\n if (!res.success) {\n message.error(res.message)\n return\n }\n setModules([...modules, { ...newModuleData, i: res.data?.id, id: res.data?.id }])\n })\n }\n }\n\n // 单个\n const updateModule = async (id: ModuleData['id'], updatedProps: Partial<ModuleData>) => {\n if (modules?.length) {\n const oldData = modules.find(m => m.id === id)\n const updatedModule = {\n ...oldData!,\n ...updatedProps,\n }\n const modulesData = modules.map(m => (m.id === id ? updatedModule : m))\n setModules(modulesData)\n await onUpdateModule?.(updatedModule).then((res: any) => {\n if (!res.success) {\n message.error(res.message)\n return\n }\n })\n }\n }\n\n // 批量\n const updateModules = async (updatedItems: Partial<ModuleData>[]) => {\n if (!modules?.length || !updatedItems?.length) return\n const updatedModules = modules.map(module => {\n const update = updatedItems.find(item => item.id === module.id)\n return update ? { ...module, ...update } : module\n })\n setModules(updatedModules)\n try {\n for (const updatedItem of updatedItems) {\n const res: any = await onUpdateModule?.(updatedItem as ModuleData)\n if (!res?.success) {\n throw new Error(res?.message || `Failed to update module: ${updatedItem.id}`)\n }\n }\n } catch (error: any) {\n setModules(modules)\n message.error(error.message || 'Failed to update modules')\n }\n }\n\n const deleteModule = async (id: ModuleData['id']) => {\n if (modules?.length) {\n setModules(modules.filter(m => m.id !== id))\n await onDeleteModule?.(id || '')\n }\n }\n\n /* ============================== drag =============================== */\n\n const margins: [number, number] = [10, 10]\n const [rowWidth, setRowWidth] = useState(0)\n const [, setCurrentCols] = useState<number>(cols.lg)\n\n const [isDragOrResize, setIsDragOrResize] = useState(false)\n const [isDragOrResizeEnd, setIsDragOrResizeEnd] = useState(false)\n\n const onBreakpointChange = (_breakpoint: string, cols: number) => {\n setCurrentCols(cols)\n }\n\n const onDragResizeStop = (newLayout: Layout[]) => {\n const changedItems = findChangedItems(newLayout, modules as any)\n const newChangedItems = changedItems.map(item => {\n const module = modules?.find(module => module.i === item.i)\n return { ...module, ...item }\n })\n updateModules(newChangedItems)\n }\n\n const onDragStartOrEnd = (type: 'start' | 'end', newLayout?: Layout[]) => {\n if (type === 'start') {\n setIsDragOrResize(true)\n setIsDragOrResizeEnd(true)\n } else {\n setIsDragOrResize(false)\n setTimeout(() => {\n setIsDragOrResizeEnd(false)\n }, 500)\n onDragResizeStop(newLayout || [])\n }\n }\n\n /* ============================== split =============================== */\n const [selectModuleData, setSelectModuleData] = useState<ModuleData>()\n\n const [isShowAddStatisticsModal, setIsShowAddStatisticsModal] = useState<boolean>(false)\n const [isShowAddCalendarModal, setIsShowAddCalendarModal] = useState<boolean>(false)\n const [isShowAddChartModal, setIsShowAddChartModal] = useState<boolean>(false)\n\n const handleOpenCreateModal = (val: any) => {\n if (val === 'text') {\n const data = {\n type: val,\n customData: {\n title: t('text'),\n editor: [\n {\n type: 'paragraph',\n children: [\n {\n text: '',\n },\n ],\n },\n ],\n },\n }\n addModule(data)\n } else if (val === 'statistics') {\n setIsShowAddStatisticsModal(true)\n } else if (val === 'calendar') {\n setIsShowAddCalendarModal(true)\n } else if (val?.includes('chart')) {\n setIsShowAddChartModal(true)\n }\n\n setSelectModuleData({\n title: '',\n type: val,\n w: 0,\n h: 0,\n x: 0,\n y: 0,\n })\n }\n\n const commonModalProps = {\n moduleDataApi: moduleDataApi,\n enumDataApi: enumDataApi,\n selectModuleData: selectModuleData,\n }\n const handleModalSubmit = (data: Partial<ModuleData>) => {\n if (data.id) {\n updateModule(data.id, omit(data, 'id'))\n } else {\n addModule(data)\n }\n }\n /* ============================== split =============================== */\n const title: any = {\n text: t('pb.text'),\n calendar: t('calendarText'),\n statistics: t('chartText'),\n }\n\n return (\n <div className=\"pivot-table\">\n <div className=\"bitable-block-dashboard\">\n <div className=\"bitable-block-dashboard-toolbar bitable-toolbar\">\n <div className=\"bitable-block-dashboard-toolbar--left\">\n <AddModuleBtn\n onOk={val => {\n handleOpenCreateModal(val)\n }}\n />\n <div\n style={{\n width: '1px',\n height: '1rem',\n backgroundColor: 'rgba(217, 217, 217, 1)',\n marginLeft: '12px',\n marginRight: '4px',\n }}\n />\n <GlobalFilterCondition />\n </div>\n </div>\n <div className=\"bitable-block-dashboard__mount\">\n <div className=\"dashboard-container\">\n <div\n className={`dashboard-content-container ${isDragOrResize ? 'isDragOrResize' : ''} ${\n isDragOrResizeEnd ? 'isDragOrResizeEnd' : ''\n }`}\n >\n <ResponsiveReactGridLayout\n onBreakpointChange={onBreakpointChange}\n className={className}\n compactType=\"vertical\"\n preventCollision={false}\n cols={cols}\n margin={margins}\n rowHeight={rowHeight}\n measureBeforeMount={false}\n draggableHandle=\".isCanDrag\"\n // draggableCancel=\".isNoCanDrag\"\n onWidthChange={(containerWidth, _margin, cols) => {\n setRowWidth(containerWidth / cols - 1)\n }}\n onDragStart={() => {\n onDragStartOrEnd('start')\n }}\n onDragStop={newLayout => {\n onDragStartOrEnd('end', newLayout)\n }}\n onResizeStart={() => {\n onDragStartOrEnd('start')\n }}\n onResizeStop={newLayout => {\n onDragStartOrEnd('end', newLayout)\n }}\n style={{\n backgroundSize: `${rowWidth}px ${rowHeight + margins[0]}px`,\n backgroundPosition: `${margins[0]}px ${margins[0]}px`,\n minHeight: '100vh',\n }}\n >\n {modules?.map(module => (\n <div\n className={`box-dashboard ${activeId === module.id ? 'active' : ''}`}\n onClick={() => {\n setActiveId(module.id)\n }}\n key={module.id}\n data-grid={{\n i: module.id,\n x: module.x || 0,\n y: module.y || 0, // puts it at the bottom\n w: module.w || 2,\n h: module.h || 2,\n minW: 2,\n minH: 2,\n }}\n >\n <ModuleHeader\n module={module}\n defaultValue={module.title}\n onChange={val =>\n updateModule(module.id, {\n title: val,\n })\n }\n onDropdownItem={key => {\n if (key === 'edit') {\n setActiveId(module.id)\n setSelectModuleData(module)\n if (module.type === 'statistics') {\n setIsShowAddStatisticsModal(true)\n }\n if (module.type?.includes('chart')) {\n setIsShowAddChartModal(true)\n }\n if (module.type === 'calendar') {\n setIsShowAddCalendarModal(true)\n }\n } else if (key === 'delete') {\n Modal.confirm({\n title: t('promptTitle'),\n icon: <ExclamationCircleOutlined />,\n content: t('promptContentDeleteComponents'),\n onOk() {\n deleteModule(module.id)\n },\n })\n } else if (key === 'copy') {\n const data = JSON.parse(JSON.stringify(module))\n delete data.id\n delete data.i\n addModule(data)\n }\n }}\n />\n\n <ModuleContent\n module={module}\n onUpdate={updateModule}\n moduleDataApi={moduleDataApi}\n activeId={activeId}\n onClick={() => {\n setActiveId(module.id)\n }}\n rowWidth={rowWidth}\n rowHeight={rowHeight}\n onEdit={() => {\n setActiveId(module.id)\n setSelectModuleData(module)\n if (module.type === 'statistics') {\n setIsShowAddStatisticsModal(true)\n }\n if (module.type?.includes('chart')) {\n setIsShowAddChartModal(true)\n }\n if (module.type === 'calendar') {\n setIsShowAddCalendarModal(true)\n }\n }}\n onDelete={() => {\n deleteModule(module.id)\n }}\n onCopy={() => {\n const data = JSON.parse(JSON.stringify(module))\n delete data.id\n delete data.i\n addModule(data)\n }}\n onStartDragOrResize={() => {\n setIsDragOrResize(true)\n }}\n onStopDragOrResize={() => {\n setIsDragOrResize(false)\n }}\n />\n </div>\n ))}\n </ResponsiveReactGridLayout>\n </div>\n </div>\n </div>\n </div>\n\n <AddStatisticsModal\n {...commonModalProps}\n open={isShowAddStatisticsModal}\n onClose={() => {\n setIsShowAddStatisticsModal(false)\n }}\n onOk={data => {\n handleModalSubmit({\n ...data,\n type: 'statistics',\n })\n setIsShowAddStatisticsModal(false)\n }}\n />\n\n <AddCalendarModal\n {...commonModalProps}\n open={isShowAddCalendarModal}\n onClose={() => {\n setIsShowAddCalendarModal(false)\n }}\n onOk={data => {\n handleModalSubmit({\n ...data,\n type: 'calendar',\n })\n setIsShowAddCalendarModal(false)\n }}\n />\n\n <AddChartModal\n {...commonModalProps}\n open={isShowAddChartModal}\n // open={true}\n onClose={() => {\n setIsShowAddChartModal(false)\n }}\n onOk={data => {\n handleModalSubmit(data)\n setIsShowAddChartModal(false)\n }}\n />\n </div>\n )\n}\n\n/* ============================== split =============================== */\n\nexport type { ConditionBlockWrapper }\nexport type GlobalProps = {\n globalFilterCondition: ConditionBlockWrapper[]\n onGlobalFilterConditionChange: (condition: ConditionBlockWrapper[]) => void\n\n formatCurrency: (val: number, decimalPlaces?: number) => string\n}\n\nconst Empty: unknown = []\n\nexport default React.memo((props: DashboardWorkbenchProps & GlobalProps) => {\n /* ============================== i18n =============================== */\n const { i18n } = useTranslation()\n useEffect(() => {\n i18n.changeLanguage(props?.lang || 'zh_CN')\n }, [i18n, props?.lang])\n\n const globalData = {\n fieldMap: props.fieldMap,\n sourceData: props?.sourceData,\n }\n\n const service = pick(props, [\n 'moduleDataApi',\n 'enumDataApi',\n 'onCreateModule',\n 'onUpdateModule',\n 'onDeleteModule',\n ])\n\n /* ============================== 全局筛选条件 =============================== */\n const [globalFilterCondition = Empty as ConditionBlockWrapper[], setGlobalFilterCondition] =\n useControllableValue<ConditionBlockWrapper[]>(props, {\n valuePropName: 'globalFilterCondition',\n trigger: 'onGlobalFilterConditionChange',\n })\n\n return (\n <AppContext.Provider\n value={{\n globalData,\n service,\n formatCurrency: props?.formatCurrency,\n globalFilterCondition,\n setGlobalFilterCondition: setGlobalFilterCondition as React.Dispatch<\n React.SetStateAction<ConditionBlockWrapper[]>\n >,\n }}\n >\n <DashboardWorkbench {...props} />\n </AppContext.Provider>\n )\n})\n"],"names":["cols","module","AddCalendarModal","AddChartModal"],"mappings":"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"}
|