@gingkoo/pandora-metabase 1.0.82 → 1.0.84

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.
Files changed (63) hide show
  1. package/lib/cjs/components/dialog/expression/index.js +1 -0
  2. package/lib/cjs/components/dialog/formula-list/index.js +137 -74
  3. package/lib/cjs/components/dialog/formula-list/index.less +13 -0
  4. package/lib/cjs/components/metabase/index.js +26 -4
  5. package/lib/cjs/components/metabase/index.less +32 -1
  6. package/lib/cjs/components/modules/components/header.d.ts +2 -0
  7. package/lib/cjs/components/modules/components/header.js +11 -6
  8. package/lib/cjs/components/modules/components/item-wrapper.d.ts +9 -0
  9. package/lib/cjs/components/modules/components/item-wrapper.js +45 -0
  10. package/lib/cjs/components/modules/components/meta-icon.d.ts +11 -0
  11. package/lib/cjs/components/modules/components/meta-icon.js +60 -12
  12. package/lib/cjs/components/modules/custom-column.js +34 -28
  13. package/lib/cjs/components/modules/filter.js +18 -12
  14. package/lib/cjs/components/modules/join-data.js +417 -411
  15. package/lib/cjs/components/modules/permission-table.js +17 -11
  16. package/lib/cjs/components/modules/row-limit.js +18 -12
  17. package/lib/cjs/components/modules/sort.js +33 -27
  18. package/lib/cjs/components/modules/summarize/index.js +26 -20
  19. package/lib/cjs/components/modules/table-data.js +137 -131
  20. package/lib/cjs/components/modules/union.js +14 -8
  21. package/lib/cjs/components/popup.d.ts +1 -0
  22. package/lib/cjs/components/popup.js +37 -4
  23. package/lib/cjs/hooks/use-state.js +44 -4
  24. package/lib/cjs/index.js +5 -2
  25. package/lib/cjs/locale/en.js +5 -3
  26. package/lib/cjs/locale/zh.js +5 -3
  27. package/lib/cjs/types.d.ts +1 -0
  28. package/lib/cjs/utils/storage.d.ts +1 -0
  29. package/lib/cjs/utils/storage.js +2 -1
  30. package/lib/cjs/utils.d.ts +6 -0
  31. package/lib/cjs/utils.js +23 -3
  32. package/lib/es/components/dialog/expression/index.js +1 -0
  33. package/lib/es/components/dialog/formula-list/index.js +137 -76
  34. package/lib/es/components/dialog/formula-list/index.less +13 -0
  35. package/lib/es/components/metabase/index.js +26 -4
  36. package/lib/es/components/metabase/index.less +32 -1
  37. package/lib/es/components/modules/components/header.d.ts +2 -0
  38. package/lib/es/components/modules/components/header.js +12 -7
  39. package/lib/es/components/modules/components/item-wrapper.d.ts +9 -0
  40. package/lib/es/components/modules/components/item-wrapper.js +38 -0
  41. package/lib/es/components/modules/components/meta-icon.d.ts +11 -0
  42. package/lib/es/components/modules/components/meta-icon.js +60 -14
  43. package/lib/es/components/modules/custom-column.js +34 -28
  44. package/lib/es/components/modules/filter.js +18 -12
  45. package/lib/es/components/modules/join-data.js +417 -411
  46. package/lib/es/components/modules/permission-table.js +17 -11
  47. package/lib/es/components/modules/row-limit.js +18 -12
  48. package/lib/es/components/modules/sort.js +33 -27
  49. package/lib/es/components/modules/summarize/index.js +26 -20
  50. package/lib/es/components/modules/table-data.js +137 -131
  51. package/lib/es/components/modules/union.js +14 -8
  52. package/lib/es/components/popup.d.ts +1 -0
  53. package/lib/es/components/popup.js +37 -4
  54. package/lib/es/hooks/use-state.js +44 -4
  55. package/lib/es/index.js +5 -2
  56. package/lib/es/locale/en.js +5 -3
  57. package/lib/es/locale/zh.js +5 -3
  58. package/lib/es/types.d.ts +1 -0
  59. package/lib/es/utils/storage.d.ts +1 -0
  60. package/lib/es/utils/storage.js +2 -1
  61. package/lib/es/utils.d.ts +6 -0
  62. package/lib/es/utils.js +21 -1
  63. package/package.json +1 -1
@@ -176,15 +176,24 @@ var TriggerInternal = /*#__PURE__*/function (_React$Component) {
176
176
  var _this$props = _this.props,
177
177
  node = _this$props.node,
178
178
  _this$props$innerSpac = _this$props.innerSpacing,
179
- innerSpacing = _this$props$innerSpac === void 0 ? 10 : _this$props$innerSpac;
179
+ innerSpacing = _this$props$innerSpac === void 0 ? 10 : _this$props$innerSpac,
180
+ _this$props$outSpacin = _this$props.outSpacing,
181
+ outSpacing = _this$props$outSpacin === void 0 ? 5 : _this$props$outSpacin;
182
+ // 假设 outSpacing 也是 props 或者常量,这里保持与你原代码一致,若未定义请确保其存在
183
+ // const outSpacing = this.props.outSpacing || 0;
180
184
  var rect = node.getBoundingClientRect();
185
+ // --- 垂直方向逻辑 (保持原样) ---
181
186
  var triggerTop = rect.top + window.scrollY;
182
- var triggerLeft = rect.left + window.scrollX;
187
+ var triggerLeft = rect.left + window.scrollX; // 基准左侧位置
183
188
  var triggerHeight = rect.height;
184
189
  var popupContent = _this.ref.current;
185
190
  var realHeight = popupContent.scrollHeight;
191
+ // 获取弹窗的实际宽度,用于水平碰撞检测
192
+ // 注意:此时 popupContent 可能还没有被渲染到最终位置,但 scrollWidth 通常能反映内容宽度
193
+ var realWidth = popupContent.scrollWidth;
186
194
  var _getWindowSize = (0, _helperDom.getWindowSize)(),
187
- viewportHeight = _getWindowSize.height;
195
+ viewportHeight = _getWindowSize.height,
196
+ viewportWidth = _getWindowSize.width;
188
197
  var spaceBelow = viewportHeight - rect.bottom;
189
198
  var spaceAbove = rect.top;
190
199
  var topPosition;
@@ -196,8 +205,32 @@ var TriggerInternal = /*#__PURE__*/function (_React$Component) {
196
205
  maxHeight = Math.min(realHeight, spaceAbove - innerSpacing - outSpacing);
197
206
  topPosition = triggerTop - innerSpacing - maxHeight;
198
207
  }
199
- _this.popupContainer.style.transform = "translate(".concat(triggerLeft, "px, ").concat(topPosition, "px)");
208
+ // --- 水平方向逻辑 (新增) ---
209
+ var leftPosition = triggerLeft;
210
+ // 1. 检查是否超出右侧边界
211
+ if (leftPosition + realWidth > viewportWidth) {
212
+ // 如果超出,尝试向左移动,使弹窗右边缘对齐屏幕右边缘
213
+ leftPosition = viewportWidth - realWidth;
214
+ }
215
+ // 2. 检查是否超出左侧边界 (兜底策略)
216
+ // 如果弹窗太宽,或者触发点太靠左导致上面的计算结果小于0
217
+ if (leftPosition < 0) {
218
+ leftPosition = 0;
219
+ // 可选:如果弹窗比屏幕还宽,你可能希望限制它的最大宽度为屏幕宽度
220
+ // 此时需要重新计算 realWidth 或者直接限制样式
221
+ // 这里我们通过 CSS 的 maxWidth 来配合,或者在这里强制限制 width
222
+ // 如果必须通过 JS 控制宽度:
223
+ // popupContent.style.width = `${viewportWidth}px`;
224
+ // leftPosition = 0;
225
+ }
226
+ // --- 应用样式 ---
227
+ // 使用 transform 进行定位
228
+ _this.popupContainer.style.transform = "translate(".concat(leftPosition, "px, ").concat(topPosition, "px)");
229
+ // 设置最大高度
200
230
  popupContent.style.maxHeight = "".concat(maxHeight, "px");
231
+ // 【重要】为了防止第2步中弹窗过宽超出屏幕,建议同时限制 popupContent 的最大宽度
232
+ // 这样即使 leftPosition=0,内容也不会撑破屏幕
233
+ popupContent.style.maxWidth = "".concat(viewportWidth - outSpacing * 2, "px");
201
234
  });
202
235
  _this.state = {
203
236
  popupRefreshKey: 1
@@ -15,6 +15,7 @@ var _react = require("react");
15
15
  var _helper = require("../utils/helper");
16
16
  var _enum = require("../store/enum");
17
17
  var _utils = require("../utils");
18
+ var _storage = _interopRequireDefault(require("../utils/storage"));
18
19
  var _cloneDeep = _interopRequireDefault(require("lodash/cloneDeep"));
19
20
  var _excluded = ["alias", "datasourceName", "datasourceId", "column"];
20
21
  var metaKey = 1;
@@ -178,6 +179,18 @@ var useStore = function useStore() {
178
179
  _useState60 = (0, _slicedToArray2["default"])(_useState59, 2),
179
180
  sourceData = _useState60[0],
180
181
  setSourceData = _useState60[1]; // 原始数据
182
+ var _useState61 = (0, _react.useState)(false),
183
+ _useState62 = (0, _slicedToArray2["default"])(_useState61, 2),
184
+ moduleCopy = _useState62[0],
185
+ setModuleCopy = _useState62[1]; // 是否开启模块复制功能
186
+ var _useState63 = (0, _react.useState)(false),
187
+ _useState64 = (0, _slicedToArray2["default"])(_useState63, 2),
188
+ isMetabaseCopy = _useState64[0],
189
+ setIsMetabaseCopy = _useState64[1]; // 是否开启勾选组复制
190
+ var _useState65 = (0, _react.useState)(_storage["default"]._metabaseCopyModule || []),
191
+ _useState66 = (0, _slicedToArray2["default"])(_useState65, 2),
192
+ metabaseCopyModule = _useState66[0],
193
+ setMetabaseCopyModule = _useState66[1]; // 复制的内容
181
194
  // 外层ref
182
195
  var popupContainer = (0, _react.useRef)();
183
196
  // const [fetchDatasetFn, setFetchDatasetFn] = useState<(id: string) => Promise<any>>(
@@ -544,9 +557,10 @@ var useStore = function useStore() {
544
557
  _setMeta(defaultMeta);
545
558
  }
546
559
  };
547
- var addMeta = function addMeta(type, index, groupIndex) {
560
+ var getNewMeta = function getNewMeta(_type, index, groupIndex, obj) {
561
+ var type = _type || obj.type;
562
+ var item = false;
548
563
  var newMeta = metaList[groupIndex].list.slice();
549
- var item;
550
564
  var mainTable = newMeta[0];
551
565
  metaKey += 1;
552
566
  if (type === _enum.TypeEnum.joinData) {
@@ -653,10 +667,30 @@ var useStore = function useStore() {
653
667
  var newMetaList = metaList.slice();
654
668
  newMetaList.splice.apply(newMetaList, [groupIndex + 1, 0, defaultOperator].concat(defaultMeta));
655
669
  _setMeta(newMetaList);
670
+ return false;
671
+ }
672
+ if (obj) {
673
+ item = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, obj), {}, {
674
+ metaKey: metaKey
675
+ });
676
+ }
677
+ return item;
678
+ };
679
+ var addMeta = function addMeta(type, index, groupIndex, obj) {
680
+ var newMeta = metaList[groupIndex].list.slice();
681
+ var items = [];
682
+ if (obj) {
683
+ items = obj.map(function (v) {
684
+ return getNewMeta(type, index, groupIndex, v);
685
+ });
686
+ } else {
687
+ items = [getNewMeta(type, index, groupIndex, obj)];
688
+ }
689
+ if (items[0] === false) {
656
690
  return;
657
691
  }
658
692
  // @ts-ignore
659
- newMeta.splice(index, 0, item);
693
+ newMeta.splice.apply(newMeta, [index, 0].concat((0, _toConsumableArray2["default"])(items)));
660
694
  setMeta(newMeta, groupIndex);
661
695
  };
662
696
  var delMeta = function delMeta(meta, groupIndex) {
@@ -816,7 +850,13 @@ var useStore = function useStore() {
816
850
  setFetchDiffFn: setFetchDiffFn,
817
851
  getModuleDiffCode: getModuleDiffCode,
818
852
  isSubquery: isSubquery,
819
- setIsSubquery: setIsSubquery
853
+ setIsSubquery: setIsSubquery,
854
+ moduleCopy: moduleCopy,
855
+ setModuleCopy: setModuleCopy,
856
+ metabaseCopyModule: metabaseCopyModule,
857
+ setMetabaseCopyModule: setMetabaseCopyModule,
858
+ isMetabaseCopy: isMetabaseCopy,
859
+ setIsMetabaseCopy: setIsMetabaseCopy
820
860
  };
821
861
  };
822
862
  var _default = exports["default"] = useStore;
package/lib/cjs/index.js CHANGED
@@ -76,7 +76,9 @@ var SqlVisionBuilder = _react["default"].forwardRef(function (props, ref) {
76
76
  _props$metabaseCopy = props.metabaseCopy,
77
77
  metabaseCopy = _props$metabaseCopy === void 0 ? false : _props$metabaseCopy,
78
78
  _props$moduleDiff = props.moduleDiff,
79
- moduleDiff = _props$moduleDiff === void 0 ? false : _props$moduleDiff;
79
+ moduleDiff = _props$moduleDiff === void 0 ? false : _props$moduleDiff,
80
+ _props$moduleCopy = props.moduleCopy,
81
+ moduleCopy = _props$moduleCopy === void 0 ? false : _props$moduleCopy;
80
82
  var store = (0, _useState["default"])();
81
83
  (0, _react.useEffect)(function () {
82
84
  getTables && store.setFetchDatasetFn(getTables);
@@ -117,7 +119,8 @@ var SqlVisionBuilder = _react["default"].forwardRef(function (props, ref) {
117
119
  store.setMetabaseCopy(metabaseCopy);
118
120
  store.setModuleDiff(moduleDiff);
119
121
  store.setIsSubquery(isSubquery);
120
- }, [showFields, fieldNameTpl, tableNameTpl, toolbar, showSubquery, subShowSubquery, constantList, formulaTemplates, ignoreGroupByType, filterCustomType, isExit, tableEnableAlias, fieldEnableAlias, groupByEnableAlias, isSelectFields, tableFlat, copyType, metabaseCopy, moduleDiff, isSubquery]);
122
+ store.setModuleCopy(moduleCopy);
123
+ }, [showFields, fieldNameTpl, tableNameTpl, toolbar, showSubquery, subShowSubquery, constantList, formulaTemplates, ignoreGroupByType, filterCustomType, isExit, tableEnableAlias, fieldEnableAlias, groupByEnableAlias, isSelectFields, tableFlat, copyType, metabaseCopy, moduleDiff, isSubquery, moduleCopy]);
121
124
  _react["default"].useImperativeHandle(ref, function () {
122
125
  return {
123
126
  // setDatasource: (list) => {
@@ -175,7 +175,9 @@ var _default = exports["default"] = (0, _index.register)('en', {
175
175
  'metabase.copySuccess': 'Copy success',
176
176
  'metabase.pasteSuccess': 'Paste success',
177
177
  'metabase.paste': 'Paste',
178
- 'customColumn.closeCopy': 'Close Copy',
179
- 'customColumn.openCopy': 'Open Copy',
180
- 'customColumn.copyAll': 'Copy All'
178
+ 'customColumn.closeCopy': 'Close Select',
179
+ 'customColumn.openCopy': 'Open Select',
180
+ 'customColumn.copyAll': 'Copy All',
181
+ 'customColumn.delSelect': 'Delete Selected',
182
+ 'customColumn.confirmDelete': 'Confirm delete selected?'
181
183
  });
@@ -175,7 +175,9 @@ var _default = exports["default"] = (0, _index.register)('zh', {
175
175
  'metabase.copySuccess': '复制成功',
176
176
  'metabase.pasteSuccess': '粘贴成功',
177
177
  'metabase.paste': '粘贴',
178
- 'customColumn.closeCopy': '关闭复制',
179
- 'customColumn.openCopy': '开启复制',
180
- 'customColumn.copyAll': '复制全部'
178
+ 'customColumn.closeCopy': '关闭勾选',
179
+ 'customColumn.openCopy': '开启勾选',
180
+ 'customColumn.copyAll': '复制全部',
181
+ 'customColumn.delSelect': '删除选中',
182
+ 'customColumn.confirmDelete': '确认删除选中?'
181
183
  });
@@ -51,6 +51,7 @@ export interface MetabaseProps {
51
51
  copyType?: (FormulaTypeEnum | string)[];
52
52
  metabaseCopy?: boolean;
53
53
  moduleDiff?: boolean;
54
+ moduleCopy?: boolean;
54
55
  getModuleDiffCode?: (obj: {
55
56
  oldCode: MetaListType;
56
57
  newCode: MetaListType;
@@ -11,6 +11,7 @@ interface StorageType {
11
11
  theme?: string;
12
12
  _metabaseCopy?: any[];
13
13
  _metabaseCopyItems?: any[];
14
+ _metabaseCopyModule?: any[];
14
15
  }
15
16
  /**
16
17
  * 便捷操作 localStorage & sessionStorage
@@ -45,7 +45,8 @@ var Cache = exports.Cache = /*#__PURE__*/function () {
45
45
  var storageMap = {
46
46
  theme: new Cache(Local, _storageKey.THEME),
47
47
  _metabaseCopy: new Cache(Local, '_metabaseCopy'),
48
- _metabaseCopyItems: new Cache(Local, '_metabaseCopyItems')
48
+ _metabaseCopyItems: new Cache(Local, '_metabaseCopyItems'),
49
+ _metabaseCopyModule: new Cache(Local, '_metabaseCopyModule')
49
50
  };
50
51
  function observer(obj, key) {
51
52
  Object.defineProperty(obj, key, {
@@ -12,6 +12,8 @@ interface HelperResultType {
12
12
  nextTypes: TypeEnum[];
13
13
  prevList: MetaListType[];
14
14
  nextList: MetaListType[];
15
+ prevItem: MetaListType;
16
+ nextItem: MetaListType;
15
17
  prevGroupBy: MetaSummarize | undefined;
16
18
  nextGroupBy: MetaSummarize | undefined;
17
19
  prevTables: {
@@ -30,4 +32,8 @@ export declare const buildSqlQuery: (data: MetaListType[] | undefined, type: str
30
32
  export declare const isError: (item: AtomsItem | AtomsItem[], data: DataType[]) => boolean;
31
33
  export declare const changeCopyField: (items: AtomsItem[], data: any[]) => AtomsItem[];
32
34
  export declare const changeExistsCopyField: (list: MetaListType[], data: any[]) => MetaListType[];
35
+ export declare const metaIsCheck: (data: any[], item: any) => boolean;
36
+ export declare const isCanPaste: (item: MetaListType | MetaListType[], options: {
37
+ nextTypes: string[];
38
+ }) => boolean;
33
39
  export {};
package/lib/cjs/utils.js CHANGED
@@ -4,9 +4,9 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.isError = exports.getSubColumns = exports.getMetaTabels = exports.getHelper = exports.getColumnsTables = exports.findMetaKey = exports.findIndex = exports.changeTableAlias = exports.changeFieldAlias = exports.changeExistsCopyField = exports.changeCopyField = exports.buildSqlQuery = void 0;
7
+ exports.isError = exports.isCanPaste = exports.getSubColumns = exports.getMetaTabels = exports.getHelper = exports.getColumnsTables = exports.findMetaKey = exports.findIndex = exports.changeTableAlias = exports.changeFieldAlias = exports.changeExistsCopyField = exports.changeCopyField = exports.buildSqlQuery = void 0;
8
8
  exports.isValidSQLAlias = isValidSQLAlias;
9
- exports.patchData = void 0;
9
+ exports.patchData = exports.metaIsCheck = void 0;
10
10
  exports.reassembleByUnion = reassembleByUnion;
11
11
  exports.splitByUnion = splitByUnion;
12
12
  var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/objectWithoutProperties"));
@@ -73,6 +73,10 @@ var getHelper = exports.getHelper = function getHelper(list, item) {
73
73
  var leftList = list.slice(0, curIndex);
74
74
  var rightList = list.slice(curIndex + 1);
75
75
  var topList = leftList; // 包含自己
76
+ // let prevType = list[curIndex - 1]?.type || '';
77
+ // let nextType = list[curIndex + 1]?.type || '';
78
+ var prevItem = list[curIndex - 1] || {};
79
+ var nextItem = list[curIndex + 1] || {};
76
80
  var ExistAboveGroupBy = false;
77
81
  var ExistBelowGroupBy = false;
78
82
  var prevTypes = [];
@@ -107,7 +111,9 @@ var getHelper = exports.getHelper = function getHelper(list, item) {
107
111
  nextList: nextList,
108
112
  prevGroupBy: prevGroupBy,
109
113
  nextGroupBy: nextGroupBy,
110
- prevTables: prevTables
114
+ prevTables: prevTables,
115
+ prevItem: prevItem,
116
+ nextItem: nextItem
111
117
  };
112
118
  };
113
119
  // 获取子查询的字段
@@ -896,4 +902,18 @@ var changeExistsCopyField = exports.changeExistsCopyField = function changeExist
896
902
  }
897
903
  return (0, _objectSpread6["default"])({}, v);
898
904
  })) || [];
905
+ };
906
+ var metaIsCheck = exports.metaIsCheck = function metaIsCheck(data, item) {
907
+ return (data === null || data === void 0 ? void 0 : data.filter(function (v) {
908
+ return v.metaKey == item.metaKey;
909
+ }).length) > 0;
910
+ };
911
+ var isCanPaste = exports.isCanPaste = function isCanPaste(item, options) {
912
+ if (Array.isArray(item)) {
913
+ return item.every(function (v) {
914
+ return options.nextTypes.includes(v.type);
915
+ });
916
+ }
917
+ var type = item.type;
918
+ return options.nextTypes.includes(type);
899
919
  };
@@ -540,6 +540,7 @@ var SelectFilterColumn = function SelectFilterColumn(_ref) {
540
540
  var options = firstVal ? firstVal.split(',') : [];
541
541
  return _jsx("div", {
542
542
  children: _jsx(Select, {
543
+ maxWidth: '500px',
543
544
  size: 'large',
544
545
  placeholder: "\u53EF\u8F93\u5165\u56DE\u8F66\u65B0\u589E\u4E0B\u62C9\u9009\u9879",
545
546
  allowCreate: true,
@@ -1,13 +1,15 @@
1
1
  import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
2
2
  import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
3
+ import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
3
4
  import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
4
5
  import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
5
6
  var _excluded = ["notExistsToolbar", "toolbar"],
6
7
  _excluded2 = ["subToolbar", "notExistsColumns", "showFields", "isExit", "toolbar"];
8
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
7
9
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
8
- import { useEffect, useState, useRef, forwardRef } from 'react';
10
+ import React, { useEffect, useState, useRef, forwardRef } from 'react';
9
11
  import './index.less';
10
- import { FieldString, FieldNumber } from '@gingkoo/pandora-icons';
12
+ import { FieldString, FieldNumber, FfPlus } from '@gingkoo/pandora-icons';
11
13
  import cx from 'classnames';
12
14
  // import './index.less';
13
15
  import Metabase from '../../../index';
@@ -15,7 +17,7 @@ import { __ } from '../../../locale';
15
17
  import isEqual from 'lodash/isEqual';
16
18
  import { AtomsTypeEnum, FormulaTypeEnum } from '../../../store/types';
17
19
  import { ColumnsPopupThemeEnum } from '../../../store/enum';
18
- import { Select, Input, Modal2, Modal, InputNumber, Radio, Space, Button, Checkbox } from '@gingkoo/pandora';
20
+ import { Select, Input, Modal2, Modal, InputNumber, Radio, Space, Button, Checkbox, Tooltip } from '@gingkoo/pandora';
19
21
  import cloneDeep from 'lodash/cloneDeep';
20
22
  import { buildSqlQuery, isError, changeCopyField } from '../../../utils';
21
23
  import Formula from '../formula';
@@ -309,12 +311,17 @@ var FormulaList = forwardRef(function (props, ref) {
309
311
  }
310
312
  // 粘贴到末尾并清除勾选
311
313
  function handlePaste() {
314
+ var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : -1;
312
315
  var _caseList = caseList.slice();
313
316
  // determine items to paste (selected items have priority)
314
317
  var itemsToPaste = storage._metabaseCopyItems || [];
315
318
  itemsToPaste = changeCopyField(itemsToPaste, data);
316
319
  if (itemsToPaste.length) {
317
- _caseList.push.apply(_caseList, _toConsumableArray(itemsToPaste));
320
+ if (index === -1) {
321
+ _caseList.push.apply(_caseList, _toConsumableArray(itemsToPaste));
322
+ } else {
323
+ _caseList.splice.apply(_caseList, [index, 0].concat(_toConsumableArray(itemsToPaste)));
324
+ }
318
325
  setCaseList(_caseList);
319
326
  }
320
327
  initPaste();
@@ -357,6 +364,38 @@ var FormulaList = forwardRef(function (props, ref) {
357
364
  setSelectedIndices(allIndices);
358
365
  setLocalItem(allIndices);
359
366
  };
367
+ var delSelect = function delSelect() {
368
+ Modal.confirm({
369
+ title: __('metabase.prompt'),
370
+ // 提示
371
+ content: __('customColumn.confirmDelete'),
372
+ // 确认删除吗
373
+ onOk: function () {
374
+ var _onOk = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
375
+ var _caseList;
376
+ return _regeneratorRuntime.wrap(function (_context) {
377
+ while (1) switch (_context.prev = _context.next) {
378
+ case 0:
379
+ _caseList = caseList.slice(); // 删除选中项,selectedIndices 已经是排序好的了
380
+ selectedIndices.forEach(function (i) {
381
+ _caseList.splice(i, 1);
382
+ });
383
+ setCaseList(_caseList);
384
+ initPaste();
385
+ case 1:
386
+ case "end":
387
+ return _context.stop();
388
+ }
389
+ }, _callee);
390
+ }));
391
+ function onOk() {
392
+ return _onOk.apply(this, arguments);
393
+ }
394
+ return onOk;
395
+ }(),
396
+ onCancel: function onCancel() {}
397
+ });
398
+ };
360
399
  // 开启关闭勾选,清除别的过滤器勾选
361
400
  var _setIsCheck = function _setIsCheck(val) {
362
401
  initPaste();
@@ -806,6 +845,21 @@ var FormulaList = forwardRef(function (props, ref) {
806
845
  });
807
846
  }
808
847
  };
848
+ var copyDom = function copyDom() {
849
+ var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : -1;
850
+ if (!isCopy || selectedIndices.length === 0 && checkedItemsCount === 0) return null;
851
+ return _jsx(Tooltip, {
852
+ title: "\u5728\u6B64\u5904\u7C98\u8D34(".concat(selectedIndices.length || checkedItemsCount, ")\u9879"),
853
+ children: _jsx(Button, {
854
+ className: cx(':Sqb-Filter-item-copy'),
855
+ onClick: function onClick() {
856
+ return handlePaste(index);
857
+ },
858
+ iconOnly: true,
859
+ icon: _jsx(FfPlus, {})
860
+ })
861
+ });
862
+ };
809
863
  return _jsx(_Fragment, {
810
864
  children: _jsxs("div", {
811
865
  className: "Sqb-NotebookCell",
@@ -831,70 +885,88 @@ var FormulaList = forwardRef(function (props, ref) {
831
885
  },
832
886
  primary: true,
833
887
  children: __('customColumn.copyAll')
834
- })]
835
- }), (_caseList2 = caseList) === null || _caseList2 === void 0 ? void 0 : _caseList2.map(function (v, i) {
836
- return _jsxs("div", {
837
- className: cx('Sqb-Filter-item', {
838
- hover: ind === i,
839
- 'item-fixed': v.fixed || false,
840
- 'item-selected': isCheck
841
- }),
842
- onMouseEnter: function onMouseEnter(e) {
843
- if (isCheck) return;
844
- setInd(i);
888
+ }), selectedIndices.length > 0 && _jsx(Button, {
889
+ primary: true,
890
+ danger: true,
891
+ size: 'small',
892
+ onClick: function onClick() {
893
+ return delSelect();
845
894
  },
846
- onMouseLeave: function onMouseLeave() {
847
- if (isCheck) return;
848
- setInd(-1);
895
+ children: __('customColumn.delSelect')
896
+ }), !isCheck && checkedItemsCount > 0 && _jsx(Button, {
897
+ primary: true,
898
+ warning: true,
899
+ size: 'small',
900
+ onClick: function onClick() {
901
+ return initPaste();
849
902
  },
850
- children: [selectOperator({
851
- triggerElement: function triggerElement() {
852
- return _jsx("div", {
853
- className: 'left-arrow',
854
- "v-index": i,
855
- "v-type": 'before',
856
- onClick: function onClick() {
857
- if (!selectedIndices.length) addOperator(AtomsTypeEnum.UNKNOWN, i, 'before');
858
- },
859
- children: _jsx("img", {
860
- src: arrow
861
- })
862
- });
863
- },
864
- ind: i,
865
- position: 'before',
866
- trigger: 'hover'
867
- }), v.type !== AtomsTypeEnum.UNKNOWN && _jsx(Checkbox, {
868
- className: 'item-check',
869
- checked: selectedIndices.includes(i),
870
- disabled: globalSelectionActive && globalSelectionOwner !== myInstanceIdRef.current,
871
- onChange: function onChange(e) {
872
- var _e$target$checked, _e$target;
873
- return toggleSelect(i, (_e$target$checked = e === null || e === void 0 || (_e$target = e.target) === null || _e$target === void 0 ? void 0 : _e$target.checked) !== null && _e$target$checked !== void 0 ? _e$target$checked : !selectedIndices.includes(i));
874
- }
875
- }), _jsx("div", {
876
- style: {
877
- pointerEvents: isCheck ? 'none' : 'auto'
903
+ children: "\u6E05\u9664\u590D\u5236"
904
+ })]
905
+ }), (_caseList2 = caseList) === null || _caseList2 === void 0 ? void 0 : _caseList2.map(function (v, i) {
906
+ return _jsxs(React.Fragment, {
907
+ children: [copyDom(i), _jsxs("div", {
908
+ className: cx('Sqb-Filter-item', {
909
+ hover: ind === i,
910
+ 'item-fixed': v.fixed || false,
911
+ 'item-selected': isCheck
912
+ }),
913
+ onMouseEnter: function onMouseEnter(e) {
914
+ if (isCheck) return;
915
+ setInd(i);
878
916
  },
879
- children: itemDom(v, i)
880
- }), selectOperator({
881
- triggerElement: function triggerElement(value) {
882
- return _jsx("div", {
883
- className: 'right-arrow',
884
- "v-index": i,
885
- "v-type": 'after',
886
- onClick: function onClick() {
887
- addOperator(AtomsTypeEnum.UNKNOWN, i, 'after');
888
- },
889
- children: _jsx("img", {
890
- src: arrow
891
- })
892
- });
917
+ onMouseLeave: function onMouseLeave() {
918
+ if (isCheck) return;
919
+ setInd(-1);
893
920
  },
894
- ind: i,
895
- position: 'after',
896
- trigger: 'hover'
897
- })]
921
+ children: [selectOperator({
922
+ triggerElement: function triggerElement() {
923
+ return _jsx("div", {
924
+ className: 'left-arrow',
925
+ "v-index": i,
926
+ "v-type": 'before',
927
+ onClick: function onClick() {
928
+ if (!selectedIndices.length) addOperator(AtomsTypeEnum.UNKNOWN, i, 'before');
929
+ },
930
+ children: _jsx("img", {
931
+ src: arrow
932
+ })
933
+ });
934
+ },
935
+ ind: i,
936
+ position: 'before',
937
+ trigger: 'hover'
938
+ }), v.type !== AtomsTypeEnum.UNKNOWN && _jsx(Checkbox, {
939
+ className: 'item-check',
940
+ checked: selectedIndices.includes(i),
941
+ disabled: globalSelectionActive && globalSelectionOwner !== myInstanceIdRef.current,
942
+ onChange: function onChange(e) {
943
+ var _e$target$checked, _e$target;
944
+ return toggleSelect(i, (_e$target$checked = e === null || e === void 0 || (_e$target = e.target) === null || _e$target === void 0 ? void 0 : _e$target.checked) !== null && _e$target$checked !== void 0 ? _e$target$checked : !selectedIndices.includes(i));
945
+ }
946
+ }), _jsx("div", {
947
+ style: {
948
+ pointerEvents: isCheck || store.isMetabaseCopy ? 'none' : 'auto'
949
+ },
950
+ children: itemDom(v, i)
951
+ }), selectOperator({
952
+ triggerElement: function triggerElement(value) {
953
+ return _jsx("div", {
954
+ className: 'right-arrow',
955
+ "v-index": i,
956
+ "v-type": 'after',
957
+ onClick: function onClick() {
958
+ addOperator(AtomsTypeEnum.UNKNOWN, i, 'after');
959
+ },
960
+ children: _jsx("img", {
961
+ src: arrow
962
+ })
963
+ });
964
+ },
965
+ ind: i,
966
+ position: 'after',
967
+ trigger: 'hover'
968
+ })]
969
+ }, i)]
898
970
  }, i);
899
971
  }), Array.from(caseList).length < 1 && selectOperator({
900
972
  triggerElement: function triggerElement() {
@@ -906,18 +978,7 @@ var FormulaList = forwardRef(function (props, ref) {
906
978
  ind: -1,
907
979
  position: 'add',
908
980
  trigger: 'click'
909
- }), isCopy && (selectedIndices.length > 0 || checkedItemsCount > 0) && selectOperator({
910
- triggerElement: function triggerElement(value) {
911
- return _jsxs("div", {
912
- className: cx("Sqb-TableName green-name"),
913
- onClick: handlePaste,
914
- children: ["\u7C98\u8D34(", selectedIndices.length || checkedItemsCount, ")\u9879"]
915
- });
916
- },
917
- ind: -1,
918
- position: 'add',
919
- trigger: 'click'
920
- }), showPreview && _jsx("div", {
981
+ }), copyDom(), showPreview && _jsx("div", {
921
982
  className: cx("mb-2 font-bold uppercase tracking-wider preview-box"),
922
983
  style: {
923
984
  fontSize: 12,
@@ -22,6 +22,19 @@
22
22
  }
23
23
  .Sqb-Filter-item {
24
24
  position: relative;
25
+ // &-copy {
26
+ // position: absolute;
27
+ // left: 0;
28
+ // top: 50%;
29
+ // z-index: 1;
30
+ // transform: translate(-100%, -50%);
31
+ // &.isEndCopy {
32
+ // position: relative;
33
+ // left: auto;
34
+ // top: auto;
35
+ // transform: none;
36
+ // }
37
+ // }
25
38
  &.item-selected {
26
39
  .item-check {
27
40
  display: block;
@@ -26,7 +26,8 @@ var Metabase = function Metabase(props) {
26
26
  _props$readonly = props.readonly,
27
27
  readonly = _props$readonly === void 0 ? false : _props$readonly,
28
28
  onOk = props.onOk,
29
- metabaseCopy = props.metabaseCopy;
29
+ metabaseCopy = props.metabaseCopy,
30
+ moduleCopy = props.moduleCopy;
30
31
  var store = useStore();
31
32
  var _useState = useState(false),
32
33
  _useState2 = _slicedToArray(_useState, 2),
@@ -131,8 +132,29 @@ var Metabase = function Metabase(props) {
131
132
  }();
132
133
  // 复制功能
133
134
  var copy = function copy() {
134
- return _jsx(Space, {
135
- children: metabaseCopy && _jsxs(_Fragment, {
135
+ return _jsxs(Space, {
136
+ children: [moduleCopy && _jsx(_Fragment, {
137
+ children: _jsx(Tooltip, {
138
+ title: '开启勾选后可勾选组进行复制,复制后可在其他地方粘贴使用',
139
+ children: _jsx(Button, {
140
+ size: 'small',
141
+ type: 'primary',
142
+ warning: store.isMetabaseCopy,
143
+ className: cx("Sqb-copy-btn ", {
144
+ 'primary-color': !store.isMetabaseCopy
145
+ }),
146
+ onClick: function onClick() {
147
+ // if (store.isMetabaseCopy) {
148
+ // storage._metabaseCopyModule = null;
149
+ // }
150
+ store.setIsMetabaseCopy(!store.isMetabaseCopy);
151
+ store.setMetabaseCopyModule([]);
152
+ storage._metabaseCopyModule = [];
153
+ },
154
+ children: store.isMetabaseCopy ? '清除勾选组复制' : '开启勾选组复制'
155
+ })
156
+ })
157
+ }), metabaseCopy && _jsxs(_Fragment, {
136
158
  children: [_jsx(Tooltip, {
137
159
  title: '点击复制当前配置,您可以在其他地方粘贴使用',
138
160
  children: _jsx(Button, {
@@ -169,7 +191,7 @@ var Metabase = function Metabase(props) {
169
191
  children: __('metabase.paste')
170
192
  })
171
193
  })]
172
- })
194
+ })]
173
195
  });
174
196
  };
175
197
  return (