@gingkoo/pandora-metabase 1.0.104 → 1.0.106

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.
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
7
  exports["default"] = exports.SummarizeAlias = void 0;
8
+ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/typeof"));
8
9
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/toConsumableArray"));
9
10
  var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/objectWithoutProperties"));
10
11
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
@@ -192,14 +193,18 @@ var useStore = function useStore() {
192
193
  _useState66 = (0, _slicedToArray2["default"])(_useState65, 2),
193
194
  isMetabaseCopy = _useState66[0],
194
195
  setIsMetabaseCopy = _useState66[1]; // 是否开启勾选组复制
195
- var _useState67 = (0, _react.useState)([]),
196
+ var _useState67 = (0, _react.useState)(false),
196
197
  _useState68 = (0, _slicedToArray2["default"])(_useState67, 2),
197
- existsError = _useState68[0],
198
- setExistsError = _useState68[1]; // exists 的错误字段
199
- var _useState69 = (0, _react.useState)(_storage["default"]._metabaseCopyModule || []),
198
+ joinAliasConflictCheck = _useState68[0],
199
+ setJoinAliasConflictCheck = _useState68[1]; // 是否开启关联别名冲突检测
200
+ var _useState69 = (0, _react.useState)([]),
200
201
  _useState70 = (0, _slicedToArray2["default"])(_useState69, 2),
201
- metabaseCopyModule = _useState70[0],
202
- setMetabaseCopyModule = _useState70[1]; // 复制的内容
202
+ existsError = _useState70[0],
203
+ setExistsError = _useState70[1]; // exists 的错误字段
204
+ var _useState71 = (0, _react.useState)(_storage["default"]._metabaseCopyModule || []),
205
+ _useState72 = (0, _slicedToArray2["default"])(_useState71, 2),
206
+ metabaseCopyModule = _useState72[0],
207
+ setMetabaseCopyModule = _useState72[1]; // 复制的内容
203
208
  var setFormulaTemplates = function setFormulaTemplates(data) {
204
209
  var newData = data === null || data === void 0 ? void 0 : data.map(function (v) {
205
210
  var children = v.children.map(function (vv) {
@@ -611,10 +616,102 @@ var useStore = function useStore() {
611
616
  _setMeta(defaultMeta);
612
617
  }
613
618
  };
614
- var getNewMeta = function getNewMeta(_type, index, groupIndex, obj) {
619
+ // 重新生成 UUID 的辅助函数
620
+ // 只修改 table2 中的 alias、tableUuid,expressions 中相等的 tableUuid 和 tableAlias 同步修改
621
+ var _regenerateUuid = function regenerateUuid(obj) {
622
+ var uuidMap = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
623
+ var aliasMap = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
624
+ var tableAliasMap = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
625
+ var existingAliases = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : [];
626
+ var originalTable2Uuid = arguments.length > 5 ? arguments[5] : undefined;
627
+ var
628
+ // 原始 table2 的 tableUuid,用于同步 expressions
629
+ newTable2Uuid = arguments.length > 6 ? arguments[6] : undefined;
630
+ var
631
+ // 新的 table2 的 tableUuid
632
+ originalTable2Alias = arguments.length > 7 ? arguments[7] : undefined;
633
+ if (!obj) return obj;
634
+ if (Array.isArray(obj)) {
635
+ return obj.map(function (item) {
636
+ return _regenerateUuid(item, uuidMap, aliasMap, tableAliasMap, existingAliases, originalTable2Uuid, newTable2Uuid, originalTable2Alias);
637
+ });
638
+ }
639
+ if ((0, _typeof2["default"])(obj) === 'object') {
640
+ var newObj = (0, _objectSpread2["default"])({}, obj);
641
+ // 处理 joinData 类型:只修改 table2 的 alias 和 tableUuid
642
+ if (newObj.type === 'joinData') {
643
+ if (newObj.table2) {
644
+ var table2 = (0, _objectSpread2["default"])({}, newObj.table2);
645
+ var originalAlias = table2.alias;
646
+ // 修改 table2.alias
647
+ if (table2.alias) {
648
+ if (!aliasMap[table2.alias]) {
649
+ table2.alias = (0, _helper.getAlias)(table2.alias, [], [], [].concat((0, _toConsumableArray2["default"])(Object.values(aliasMap)), (0, _toConsumableArray2["default"])(existingAliases)));
650
+ aliasMap[originalAlias] = table2.alias; // 用原始 alias 作为 key
651
+ } else {
652
+ table2.alias = aliasMap[table2.alias];
653
+ }
654
+ }
655
+ // 修改 table2.tableUuid
656
+ if (table2.tableUuid && !uuidMap[table2.tableUuid]) {
657
+ var originalUuid = table2.tableUuid;
658
+ var newUuid = (0, _helper.uuidv4)('table');
659
+ uuidMap[originalUuid] = newUuid;
660
+ table2.tableUuid = newUuid;
661
+ // 记录原始和新 tableUuid,用于 expressions 同步
662
+ originalTable2Uuid = originalUuid;
663
+ newTable2Uuid = newUuid;
664
+ } else if (uuidMap[table2.tableUuid]) {
665
+ table2.tableUuid = uuidMap[table2.tableUuid];
666
+ newTable2Uuid = table2.tableUuid;
667
+ }
668
+ // 记录原始 alias,用于 expressions 同步 tableAlias
669
+ if (originalAlias) {
670
+ originalTable2Alias = originalAlias;
671
+ }
672
+ newObj.table2 = table2;
673
+ }
674
+ }
675
+ // 处理 expressions 中 tableUuid 相等的情况
676
+ if (originalTable2Uuid && newTable2Uuid && newObj.tableUuid === originalTable2Uuid) {
677
+ newObj.tableUuid = newTable2Uuid;
678
+ // 如果 originalTable2Alias 存在,tableAlias 要跟修改后的 table2.alias 保持一致
679
+ if (originalTable2Alias && aliasMap[originalTable2Alias]) {
680
+ newObj.tableAlias = aliasMap[originalTable2Alias];
681
+ }
682
+ }
683
+ // 递归处理嵌套对象
684
+ if (newObj.filter) newObj.filter = _regenerateUuid(newObj.filter, uuidMap, aliasMap, tableAliasMap, existingAliases, originalTable2Uuid, newTable2Uuid, originalTable2Alias);
685
+ if (newObj.lhs) newObj.lhs = _regenerateUuid(newObj.lhs, uuidMap, aliasMap, tableAliasMap, existingAliases, originalTable2Uuid, newTable2Uuid, originalTable2Alias);
686
+ if (newObj.rhs) newObj.rhs = _regenerateUuid(newObj.rhs, uuidMap, aliasMap, tableAliasMap, existingAliases, originalTable2Uuid, newTable2Uuid, originalTable2Alias);
687
+ if (newObj.expressions) newObj.expressions = _regenerateUuid(newObj.expressions, uuidMap, aliasMap, tableAliasMap, existingAliases, originalTable2Uuid, newTable2Uuid, originalTable2Alias);
688
+ if (newObj.customColumn) newObj.customColumn = _regenerateUuid(newObj.customColumn, uuidMap, aliasMap, tableAliasMap, existingAliases, originalTable2Uuid, newTable2Uuid, originalTable2Alias);
689
+ if (newObj.group) newObj.group = _regenerateUuid(newObj.group, uuidMap, aliasMap, tableAliasMap, existingAliases, originalTable2Uuid, newTable2Uuid, originalTable2Alias);
690
+ if (newObj.by) newObj.by = _regenerateUuid(newObj.by, uuidMap, aliasMap, tableAliasMap, existingAliases, originalTable2Uuid, newTable2Uuid, originalTable2Alias);
691
+ if (newObj.columns) newObj.columns = _regenerateUuid(newObj.columns, uuidMap, aliasMap, tableAliasMap, existingAliases, originalTable2Uuid, newTable2Uuid, originalTable2Alias);
692
+ if (newObj.subquery) newObj.subquery = _regenerateUuid(newObj.subquery, uuidMap, aliasMap, tableAliasMap, existingAliases, originalTable2Uuid, newTable2Uuid, originalTable2Alias);
693
+ if (newObj.list) newObj.list = _regenerateUuid(newObj.list, uuidMap, aliasMap, tableAliasMap, existingAliases, originalTable2Uuid, newTable2Uuid, originalTable2Alias);
694
+ if (newObj.table) newObj.table = _regenerateUuid(newObj.table, uuidMap, aliasMap, tableAliasMap, existingAliases, originalTable2Uuid, newTable2Uuid, originalTable2Alias);
695
+ if (newObj.args) newObj.args = _regenerateUuid(newObj.args, uuidMap, aliasMap, tableAliasMap, existingAliases, originalTable2Uuid, newTable2Uuid, originalTable2Alias);
696
+ return newObj;
697
+ }
698
+ return obj;
699
+ };
700
+ var getNewMeta = function getNewMeta(_type, index, groupIndex, obj, uuidMap, aliasMap, tableAliasMap, existingAliases) {
615
701
  var type = _type || obj.type;
616
702
  var item = false;
617
703
  var newMeta = metaList[groupIndex].list.slice();
704
+ // 如果没有传入 existingAliases,从 metaList 中提取
705
+ if (!existingAliases && newMeta) {
706
+ existingAliases = newMeta === null || newMeta === void 0 ? void 0 : newMeta.map(function (v) {
707
+ var _v$table3, _v$table4;
708
+ if (v.type === _enum.TypeEnum.data) return (_v$table3 = v.table) === null || _v$table3 === void 0 ? void 0 : _v$table3.alias;
709
+ if (v.type === _enum.TypeEnum.joinData) return (_v$table4 = v.table2) === null || _v$table4 === void 0 ? void 0 : _v$table4.alias;
710
+ return undefined;
711
+ }).filter(function (alias) {
712
+ return Boolean(alias);
713
+ });
714
+ }
618
715
  var mainTable = newMeta[0];
619
716
  metaKey += 1;
620
717
  if (type === _enum.TypeEnum.joinData) {
@@ -724,28 +821,105 @@ var useStore = function useStore() {
724
821
  return false;
725
822
  }
726
823
  if (obj) {
727
- item = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, obj), {}, {
728
- metaKey: metaKey
729
- });
824
+ // 只对 joinData 类型调用 regenerateUuid
825
+ if (obj.type === _enum.TypeEnum.joinData) {
826
+ item = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, _regenerateUuid(obj, uuidMap || {}, aliasMap || {}, tableAliasMap || {}, existingAliases || [])), {}, {
827
+ metaKey: metaKey
828
+ });
829
+ } else {
830
+ item = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, obj), {}, {
831
+ metaKey: metaKey
832
+ });
833
+ }
730
834
  }
731
835
  return item;
732
836
  };
733
- var addMeta = function addMeta(type, index, groupIndex, obj) {
837
+ // 检查粘贴位置上下级的 table1 是否与被粘贴项的 table1 有相同的 alias
838
+ var checkTable1Conflict = function checkTable1Conflict(objList, index, groupIndex) {
839
+ var _metaList$groupIndex, _objList$;
840
+ if (!objList || objList.length === 0) return {
841
+ hasConflict: false
842
+ };
843
+ var groupList = ((_metaList$groupIndex = metaList[groupIndex]) === null || _metaList$groupIndex === void 0 ? void 0 : _metaList$groupIndex.list) || [];
844
+ // 获取被粘贴项的 table1 alias
845
+ var pastedTable1Alias = (_objList$ = objList[0]) === null || _objList$ === void 0 || (_objList$ = _objList$.table1) === null || _objList$ === void 0 ? void 0 : _objList$.alias;
846
+ if (!pastedTable1Alias) return {
847
+ hasConflict: false
848
+ };
849
+ // 检查上下级的 table1 和 table2 alias
850
+ var checkItem = function checkItem(item) {
851
+ if (!item) return undefined;
852
+ if (item.type === _enum.TypeEnum.joinData) {
853
+ var _item$table, _item$table2;
854
+ if (((_item$table = item.table1) === null || _item$table === void 0 ? void 0 : _item$table.alias) === pastedTable1Alias) return item.table1.alias;
855
+ if (((_item$table2 = item.table2) === null || _item$table2 === void 0 ? void 0 : _item$table2.alias) === pastedTable1Alias) return item.table2.alias;
856
+ }
857
+ if (item.type === _enum.TypeEnum.data) {
858
+ var _item$table3;
859
+ if (((_item$table3 = item.table) === null || _item$table3 === void 0 ? void 0 : _item$table3.alias) === pastedTable1Alias) return item.table.alias;
860
+ }
861
+ return undefined;
862
+ };
863
+ // 检查上邻(index - 1 位置)
864
+ var prevItem = groupList[index - 1];
865
+ var prevConflict = checkItem(prevItem);
866
+ if (prevConflict) {
867
+ return {
868
+ hasConflict: true,
869
+ conflictingAlias: pastedTable1Alias
870
+ };
871
+ }
872
+ // 检查下邻(index 位置,即被插入位置的原元素)
873
+ var nextItem = groupList[index];
874
+ var nextConflict = checkItem(nextItem);
875
+ if (nextConflict) {
876
+ return {
877
+ hasConflict: true,
878
+ conflictingAlias: pastedTable1Alias
879
+ };
880
+ }
881
+ return {
882
+ hasConflict: false
883
+ };
884
+ };
885
+ var addMeta = function addMeta(type, index, groupIndex, obj, onConflict) {
886
+ // 检查 table1 冲突(仅在启用配置时检测)
887
+ if (joinAliasConflictCheck && obj && obj.length > 0) {
888
+ var conflict = checkTable1Conflict(obj, index, groupIndex);
889
+ if (conflict.hasConflict && conflict.conflictingAlias && onConflict) {
890
+ onConflict(conflict.conflictingAlias);
891
+ return false;
892
+ }
893
+ }
734
894
  var newMeta = metaList[groupIndex].list.slice();
735
895
  var items = [];
896
+ // 创建共享的映射对象,确保循环调用时保持一致
897
+ var sharedUuidMap = {};
898
+ var sharedAliasMap = {};
899
+ var sharedTableAliasMap = {};
900
+ // 提取当前组中已存在的 alias
901
+ var existingAliases = newMeta === null || newMeta === void 0 ? void 0 : newMeta.map(function (v) {
902
+ var _v$table5, _v$table6;
903
+ if (v.type === _enum.TypeEnum.data) return (_v$table5 = v.table) === null || _v$table5 === void 0 ? void 0 : _v$table5.alias;
904
+ if (v.type === _enum.TypeEnum.joinData) return (_v$table6 = v.table2) === null || _v$table6 === void 0 ? void 0 : _v$table6.alias;
905
+ return undefined;
906
+ }).filter(function (alias) {
907
+ return Boolean(alias);
908
+ });
736
909
  if (obj) {
737
910
  items = obj.map(function (v) {
738
- return getNewMeta(type, index, groupIndex, v);
911
+ return getNewMeta(type, index, groupIndex, v, sharedUuidMap, sharedAliasMap, sharedTableAliasMap, existingAliases);
739
912
  });
740
913
  } else {
741
- items = [getNewMeta(type, index, groupIndex, obj)];
914
+ items = [getNewMeta(type, index, groupIndex, obj, sharedUuidMap, sharedAliasMap, sharedTableAliasMap, existingAliases)];
742
915
  }
743
916
  if (items[0] === false) {
744
- return;
917
+ return false;
745
918
  }
746
919
  // @ts-ignore
747
920
  newMeta.splice.apply(newMeta, [index, 0].concat((0, _toConsumableArray2["default"])(items)));
748
921
  setMeta(newMeta, groupIndex);
922
+ return true;
749
923
  };
750
924
  var delMeta = function delMeta(meta, groupIndex) {
751
925
  if (meta.type === 'group') {
@@ -914,7 +1088,9 @@ var useStore = function useStore() {
914
1088
  operatorList: operatorList,
915
1089
  setOperatorList: setOperatorList,
916
1090
  setExistsErrorFn: setExistsErrorFn,
917
- existsError: existsError
1091
+ existsError: existsError,
1092
+ joinAliasConflictCheck: joinAliasConflictCheck,
1093
+ setJoinAliasConflictCheck: setJoinAliasConflictCheck
918
1094
  };
919
1095
  };
920
1096
  var _default = exports["default"] = useStore;
package/lib/cjs/index.js CHANGED
@@ -81,6 +81,8 @@ var SqlVisionBuilder = _react["default"].forwardRef(function (props, ref) {
81
81
  moduleDiff = _props$moduleDiff === void 0 ? false : _props$moduleDiff,
82
82
  _props$moduleCopy = props.moduleCopy,
83
83
  moduleCopy = _props$moduleCopy === void 0 ? false : _props$moduleCopy,
84
+ _props$joinAliasConfl = props.joinAliasConflictCheck,
85
+ joinAliasConflictCheck = _props$joinAliasConfl === void 0 ? false : _props$joinAliasConfl,
84
86
  _props$operatorList = props.operatorList,
85
87
  operatorList = _props$operatorList === void 0 ? EMPTY_ARRAY : _props$operatorList;
86
88
  var store = (0, _useState["default"])();
@@ -125,8 +127,9 @@ var SqlVisionBuilder = _react["default"].forwardRef(function (props, ref) {
125
127
  store.setModuleDiff(moduleDiff);
126
128
  store.setIsSubquery(isSubquery);
127
129
  store.setModuleCopy(moduleCopy);
130
+ store.setJoinAliasConflictCheck(joinAliasConflictCheck);
128
131
  store.setOperatorList(operatorList || []);
129
- }, [showFields, fieldNameTpl, tableNameTpl, toolbar, showSubquery, subShowSubquery, constantList, formulaTemplates, ignoreGroupByType, filterCustomType, isExit, tableEnableAlias, fieldEnableAlias, groupByEnableAlias, isSelectFields, tableFlat, copyType, metabaseCopy, moduleDiff, isSubquery, moduleCopy, operatorList]);
132
+ }, [showFields, fieldNameTpl, tableNameTpl, toolbar, showSubquery, subShowSubquery, constantList, formulaTemplates, ignoreGroupByType, filterCustomType, isExit, tableEnableAlias, fieldEnableAlias, groupByEnableAlias, isSelectFields, tableFlat, copyType, metabaseCopy, moduleDiff, isSubquery, moduleCopy, joinAliasConflictCheck, operatorList]);
130
133
  _react["default"].useImperativeHandle(ref, function () {
131
134
  return {
132
135
  // setDatasource: (list) => {
@@ -107,10 +107,12 @@ export interface AtomsField {
107
107
  export interface AtomsInputString {
108
108
  val: string;
109
109
  type: AtomsTypeEnum.INPUT_STRING;
110
+ format?: string;
110
111
  }
111
112
  export interface AtomsInputStringList {
112
113
  val: string[];
113
114
  type: AtomsTypeEnum.INPUT_STRING_LIST;
115
+ format?: string;
114
116
  }
115
117
  export interface AtomsInputNumberList {
116
118
  val: number[];
@@ -52,6 +52,7 @@ export interface MetabaseProps {
52
52
  metabaseCopy?: boolean;
53
53
  moduleDiff?: boolean;
54
54
  moduleCopy?: boolean;
55
+ joinAliasConflictCheck?: boolean;
55
56
  getModuleDiffCode?: (obj: {
56
57
  oldCode: MetaListType;
57
58
  newCode: MetaListType;
@@ -16,5 +16,5 @@ export declare const replaceTpl: (inputString: string, values: {
16
16
  [key: string]: any;
17
17
  }) => string;
18
18
  export declare const uuidv4: (prefix?: string) => string;
19
- export declare const getAlias: (name: string | undefined, list: MetaListType[], columns?: any[]) => string;
19
+ export declare const getAlias: (name?: string, list?: MetaListType[], columns?: any[], extraAliases?: string[]) => string;
20
20
  export declare const mergeNameAlias: (name: string, alias: string, isEnable: boolean) => string;
@@ -140,15 +140,32 @@ var uuidv4 = exports.uuidv4 = function uuidv4() {
140
140
  };
141
141
  var getAlias = exports.getAlias = function getAlias() {
142
142
  var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
143
- var list = arguments.length > 1 ? arguments[1] : undefined;
143
+ var list = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
144
144
  var columns = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
145
+ var extraAliases = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];
145
146
  // 提取所有有效的 alias
146
- if (!list || list.length < 1) return name;
147
- // const baseOld = oldName?.split('_')[0] ?? '';
148
- // const baseNew = name?.split('_')[0] ?? '';
149
- // if (oldName && baseOld === baseNew) {
150
- // return oldName;
151
- // }
147
+ if (!list || list.length < 1) {
148
+ // 如果没有 list,只有 extraAliases,需要检查 extraAliases 中是否有冲突
149
+ if (extraAliases.length === 0) return name;
150
+ var _regex = new RegExp("^".concat(name, "_(\\d+)$"));
151
+ var _indexes = extraAliases.map(function (alias) {
152
+ var match = alias.match(_regex);
153
+ return match ? parseInt(match[1], 10) : 0;
154
+ }).filter(function (num) {
155
+ return num > 0;
156
+ });
157
+ var _hasPureName = extraAliases.includes(name);
158
+ if (_hasPureName) {
159
+ _indexes.push(1);
160
+ }
161
+ if (_indexes.length === 0) {
162
+ return name;
163
+ }
164
+ var _uniqueIndexes = (0, _toConsumableArray2["default"])(new Set(_indexes)).sort(function (a, b) {
165
+ return a - b;
166
+ });
167
+ return "".concat(name, "_").concat(Math.max.apply(Math, (0, _toConsumableArray2["default"])(_uniqueIndexes)) + 1);
168
+ }
152
169
  var aliass = list === null || list === void 0 ? void 0 : list.map(function (v) {
153
170
  if (v.type === _enum.TypeEnum.data) {
154
171
  var _v$table;
@@ -161,7 +178,7 @@ var getAlias = exports.getAlias = function getAlias() {
161
178
  return undefined;
162
179
  }).concat(columns.map(function (v) {
163
180
  return v.alias;
164
- })).filter(function (alias) {
181
+ })).concat(extraAliases).filter(function (alias) {
165
182
  return Boolean(alias);
166
183
  });
167
184
  // 收集所有 name_x 中的数字
@@ -0,0 +1,14 @@
1
+ import React from 'react';
2
+ interface DateRangeFormatPickerProps {
3
+ value?: string[];
4
+ format?: string;
5
+ onChange?: (val: string[], format?: string) => void;
6
+ }
7
+ export declare const DateRangeFormatPicker: React.FC<DateRangeFormatPickerProps>;
8
+ interface DateFormatPickerProps {
9
+ value?: string;
10
+ format?: string;
11
+ onChange?: (val: string, format?: string) => void;
12
+ }
13
+ export declare const DateFormatPicker: React.FC<DateFormatPickerProps>;
14
+ export {};
@@ -0,0 +1,211 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useState, useEffect } from 'react';
4
+ import { DatePicker, Select } from '@gingkoo/pandora';
5
+ import dayjs from 'dayjs';
6
+ var RangePicker = DatePicker.RangePicker,
7
+ YearPicker = DatePicker.YearPicker,
8
+ MonthPicker = DatePicker.MonthPicker;
9
+ var DATE_FORMAT_OPTIONS = [{
10
+ value: 'YYYY',
11
+ label: 'YYYY'
12
+ }, {
13
+ value: 'YYYY-MM',
14
+ label: 'YYYY-MM'
15
+ }, {
16
+ value: 'YYYY-MM-DD',
17
+ label: 'YYYY-MM-DD'
18
+ }, {
19
+ value: 'YYYY-MM-DD HH:mm',
20
+ label: 'YYYY-MM-DD HH:mm'
21
+ }, {
22
+ value: 'YYYY/MM',
23
+ label: 'YYYY/MM'
24
+ }, {
25
+ value: 'YYYY/MM/DD',
26
+ label: 'YYYY/MM/DD'
27
+ }, {
28
+ value: 'YYYY/MM/DD HH:mm',
29
+ label: 'YYYY/MM/DD HH:mm'
30
+ }];
31
+ var DEFAULT_FORMAT = 'YYYY-MM-DD HH:mm';
32
+ export var DateRangeFormatPicker = function DateRangeFormatPicker(_ref) {
33
+ var value = _ref.value,
34
+ format = _ref.format,
35
+ onChange = _ref.onChange;
36
+ var _useState = useState(format || DEFAULT_FORMAT),
37
+ _useState2 = _slicedToArray(_useState, 2),
38
+ currentFormat = _useState2[0],
39
+ setCurrentFormat = _useState2[1];
40
+ useEffect(function () {
41
+ if (format) {
42
+ setCurrentFormat(format);
43
+ }
44
+ }, [format]);
45
+ var showTime = currentFormat.includes('HH:mm');
46
+ // 根据格式确定 RangePicker 的 mode
47
+ var getRangePickerMode = function getRangePickerMode() {
48
+ if (currentFormat === 'YYYY') return 'year';
49
+ if (currentFormat === 'YYYY-MM' || currentFormat === 'YYYY/MM') return 'month';
50
+ return 'date';
51
+ };
52
+ var handleFormatChange = function handleFormatChange(newFormat) {
53
+ // 切换格式时,用新格式重新格式化当前值
54
+ if (value && value.length > 0) {
55
+ var formattedValues = value.map(function (v) {
56
+ if (!v) return '';
57
+ var parsed = dayjs(v);
58
+ if (!parsed.isValid()) return '';
59
+ return parsed.format(newFormat);
60
+ });
61
+ // 只调用 onChange,传递新格式化的值和新格式
62
+ onChange === null || onChange === void 0 || onChange(formattedValues, newFormat);
63
+ }
64
+ setCurrentFormat(newFormat);
65
+ };
66
+ // 将字符串数组转为 dayjs 对象数组,供 RangePicker 使用
67
+ var rangeValue = (value === null || value === void 0 ? void 0 : value.map(function (v) {
68
+ if (!v) return null;
69
+ // 尝试用当前格式解析,失败则用 dayjs 默认解析
70
+ var parsed = dayjs(v, currentFormat, true);
71
+ if (parsed.isValid()) return parsed;
72
+ // 尝试不用严格模式解析
73
+ var looseParsed = dayjs(v, currentFormat);
74
+ if (looseParsed.isValid()) return looseParsed;
75
+ // 最后尝试不指定格式
76
+ var anyParsed = dayjs(v);
77
+ return anyParsed.isValid() ? anyParsed : null;
78
+ })) || undefined;
79
+ var handleRangeChange = function handleRangeChange(date, dateString) {
80
+ // 确保日期值按 currentFormat 格式化
81
+ var formattedValues = (date === null || date === void 0 ? void 0 : date.map(function (d) {
82
+ if (!d || !dayjs(d).isValid()) return '';
83
+ return dayjs(d).format(currentFormat);
84
+ })) || dateString;
85
+ onChange === null || onChange === void 0 || onChange(formattedValues, currentFormat);
86
+ };
87
+ return _jsxs("div", {
88
+ style: {
89
+ display: 'flex',
90
+ gap: 4
91
+ },
92
+ children: [_jsx(Select, {
93
+ style: {
94
+ width: 120
95
+ },
96
+ value: currentFormat,
97
+ onChange: handleFormatChange,
98
+ children: DATE_FORMAT_OPTIONS.map(function (option) {
99
+ return _jsx(Select.Option, {
100
+ value: option.value,
101
+ children: option.label
102
+ }, option.value);
103
+ })
104
+ }), _jsx(RangePicker, {
105
+ value: rangeValue,
106
+ onChange: handleRangeChange,
107
+ style: {
108
+ flex: 1
109
+ },
110
+ format: currentFormat,
111
+ showTime: showTime,
112
+ mode: getRangePickerMode()
113
+ })]
114
+ });
115
+ };
116
+ export var DateFormatPicker = function DateFormatPicker(_ref2) {
117
+ var value = _ref2.value,
118
+ format = _ref2.format,
119
+ onChange = _ref2.onChange;
120
+ var _useState3 = useState(format || DEFAULT_FORMAT),
121
+ _useState4 = _slicedToArray(_useState3, 2),
122
+ currentFormat = _useState4[0],
123
+ setCurrentFormat = _useState4[1];
124
+ useEffect(function () {
125
+ if (format) {
126
+ setCurrentFormat(format);
127
+ }
128
+ }, [format]);
129
+ var showTime = currentFormat.includes('HH:mm');
130
+ var isYearOnly = currentFormat === 'YYYY';
131
+ var isMonthOnly = currentFormat === 'YYYY-MM' || currentFormat === 'YYYY/MM';
132
+ var handleFormatChange = function handleFormatChange(newFormat) {
133
+ // 切换格式时,用新格式重新格式化当前值
134
+ if (value) {
135
+ var parsed = dayjs(value);
136
+ if (parsed.isValid()) {
137
+ onChange === null || onChange === void 0 || onChange(parsed.format(newFormat), newFormat);
138
+ }
139
+ }
140
+ setCurrentFormat(newFormat);
141
+ };
142
+ // 将字符串转为 dayjs 对象,使用宽松解析
143
+ var dateValue = function () {
144
+ if (!value) return undefined;
145
+ var parsed = dayjs(value, currentFormat, true);
146
+ if (parsed.isValid()) return parsed;
147
+ var looseParsed = dayjs(value, currentFormat);
148
+ if (looseParsed.isValid()) return looseParsed;
149
+ var anyParsed = dayjs(value);
150
+ return anyParsed.isValid() ? anyParsed : undefined;
151
+ }();
152
+ var handleDateChange = function handleDateChange(dateString) {
153
+ onChange === null || onChange === void 0 || onChange(dateString, currentFormat);
154
+ };
155
+ var handleYearChange = function handleYearChange(dateString) {
156
+ onChange === null || onChange === void 0 || onChange(dateString, currentFormat);
157
+ };
158
+ var handleMonthChange = function handleMonthChange(dateString) {
159
+ onChange === null || onChange === void 0 || onChange(dateString, currentFormat);
160
+ };
161
+ // 根据格式渲染不同的选择器
162
+ var renderPicker = function renderPicker() {
163
+ if (isYearOnly) {
164
+ return _jsx(YearPicker, {
165
+ value: dateValue,
166
+ onChange: handleYearChange,
167
+ style: {
168
+ flex: 1
169
+ }
170
+ });
171
+ }
172
+ if (isMonthOnly) {
173
+ return _jsx(MonthPicker, {
174
+ value: dateValue,
175
+ onChange: handleMonthChange,
176
+ style: {
177
+ flex: 1
178
+ },
179
+ format: currentFormat
180
+ });
181
+ }
182
+ return _jsx(DatePicker, {
183
+ value: dateValue,
184
+ onChange: handleDateChange,
185
+ style: {
186
+ flex: 1
187
+ },
188
+ format: currentFormat,
189
+ showTime: showTime
190
+ });
191
+ };
192
+ return _jsxs("div", {
193
+ style: {
194
+ display: 'flex',
195
+ gap: 4
196
+ },
197
+ children: [_jsx(Select, {
198
+ style: {
199
+ width: 120
200
+ },
201
+ value: currentFormat,
202
+ onChange: handleFormatChange,
203
+ children: DATE_FORMAT_OPTIONS.map(function (option) {
204
+ return _jsx(Select.Option, {
205
+ value: option.value,
206
+ children: option.label
207
+ }, option.value);
208
+ })
209
+ }), renderPicker()]
210
+ });
211
+ };
@@ -0,0 +1,5 @@
1
+ export declare const DATE_FORMAT_OPTIONS: {
2
+ value: string;
3
+ label: string;
4
+ }[];
5
+ export declare const DEFAULT_DATE_FORMAT = "YYYY-MM-DD HH:mm";
@@ -0,0 +1,20 @@
1
+ export var DATE_FORMAT_OPTIONS = [{
2
+ value: 'YYYY-MM',
3
+ label: 'YYYY-MM'
4
+ }, {
5
+ value: 'YYYY-MM-DD',
6
+ label: 'YYYY-MM-DD'
7
+ }, {
8
+ value: 'YYYY-MM-DD HH:mm',
9
+ label: 'YYYY-MM-DD HH:mm'
10
+ }, {
11
+ value: 'YYYY/MM',
12
+ label: 'YYYY/MM'
13
+ }, {
14
+ value: 'YYYY/MM/DD',
15
+ label: 'YYYY/MM/DD'
16
+ }, {
17
+ value: 'YYYY/MM/DD HH:mm',
18
+ label: 'YYYY/MM/DD HH:mm'
19
+ }];
20
+ export var DEFAULT_DATE_FORMAT = 'YYYY-MM-DD HH:mm';