@gingkoo/pandora-metabase 1.0.0-alpha.1 → 1.0.0-alpha.11

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/lib/es/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @gingkoo/pandora-metabase v1.0.0-alpha.1
2
+ * @gingkoo/pandora-metabase v1.0.0-alpha.11
3
3
  */
4
4
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
5
5
  import * as React from 'react';
@@ -89,7 +89,7 @@ var TypeEnum;
89
89
  TypeEnum["summarize"] = "summarize";
90
90
  TypeEnum["sort"] = "sort";
91
91
  TypeEnum["rowLimit"] = "rowLimit";
92
- TypeEnum["group"] = "group";
92
+ TypeEnum["union"] = "union";
93
93
  })(TypeEnum || (TypeEnum = {}));
94
94
  var JoinEnum;
95
95
  (function (JoinEnum) {
@@ -278,7 +278,6 @@ const summarizeToSql = (arr, record) => {
278
278
  condition,
279
279
  alias,
280
280
  name,
281
- fieldAlias,
282
281
  realName = ''
283
282
  } = record;
284
283
  let index = arr.indexOf(record);
@@ -339,7 +338,7 @@ const summarizeToSql = (arr, record) => {
339
338
  count++;
340
339
  }
341
340
  });
342
- as = fieldAlias || as + (count ? '_' + (count + 1) : '');
341
+ as = as + (count ? '_' + (count + 1) : '');
343
342
  return {
344
343
  sql: sql + ' AS ' + as,
345
344
  fieldAlias: as
@@ -467,15 +466,15 @@ const handleNesting = data => {
467
466
  if (customColumn && customColumn.customColumn.length) {
468
467
  obj.customColumns = customColumn.customColumn.map(v => {
469
468
  return {
470
- alias: v.name,
471
- formula: v.formula.replace(/\[.*?\]/g, column => {
472
- let str = column.substr(1, column.length - 2);
473
- if (~str.indexOf('->')) {
474
- let _str = str.replace(/ /g, '').split('->');
475
- return `${_str[0]}.${_str[1]}`;
476
- }
477
- return str;
478
- })
469
+ alias: v.name
470
+ // formula: v.formula.replace(/\[.*?\]/g, (column: string): string => {
471
+ // let str = column.substr(1, column.length - 2);
472
+ // if (~str.indexOf('->')) {
473
+ // let _str = str.replace(/ /g, '').split('->');
474
+ // return `${_str[0]}.${_str[1]}`;
475
+ // }
476
+ // return str;
477
+ // }),
479
478
  };
480
479
  });
481
480
  }
@@ -626,9 +625,8 @@ const getSubColumns = metaList => {
626
625
  metaKey: -1,
627
626
  type: TypeEnum.customColumn,
628
627
  customColumn: [{
629
- name: '',
630
- // 用户起的别名
631
- formula: '' // 公式}];
628
+ name: '' // 用户起的别名
629
+ // formula: '', // 公式}];
632
630
  }]
633
631
  };
634
632
  let {
@@ -650,7 +648,7 @@ const getSubColumns = metaList => {
650
648
  return {
651
649
  name_zh: v.quotes,
652
650
  ...v,
653
- name: v.quotes,
651
+ name: v.fieldAlias,
654
652
  realName: v.sql?.split(' AS ')?.[1] || '',
655
653
  // name_zh: '',
656
654
  database_type: v?.database_type || SQL_COLUMN_TYPE.FLOAT,
@@ -664,7 +662,7 @@ const getSubColumns = metaList => {
664
662
  return {
665
663
  name_zh: v.quotes,
666
664
  ...v,
667
- name: v.quotes,
665
+ name: v.fieldAlias,
668
666
  realName: v.sql?.split(' AS ')?.[1] || '',
669
667
  // name_zh: '',
670
668
  database_type: v?.database_type || SQL_COLUMN_TYPE.FLOAT,
@@ -732,12 +730,15 @@ const changeTableAlias = (list, curObj) => {
732
730
  if (v.table1.tableUuid === tableUuid) {
733
731
  v.table1.alias = alias;
734
732
  }
733
+ if (v.table2.tableUuid === tableUuid) {
734
+ v.table2.alias = alias;
735
+ }
735
736
  }
736
737
  if (v.type === TypeEnum.customColumn) {
737
738
  v.customColumn.map(item => {
738
739
  item.formulaList?.map(formula => {
739
- if (formula.tableUuid === tableUuid) {
740
- formula.alias = alias;
740
+ if (formula.expression && formula.expression.tableUuid === tableUuid) {
741
+ formula.expression.alias = alias;
741
742
  }
742
743
  });
743
744
  });
@@ -775,22 +776,40 @@ const changeTableAlias = (list, curObj) => {
775
776
  if (v.type === TypeEnum.filter) {
776
777
  v.filter.map(item => {
777
778
  if (item.tableUuid === tableUuid) {
778
- if (item.alias === SummarizeAlias$1) {
779
- //有groupBy 特殊处理
780
- const {
781
- prevGroupBy
782
- } = getHelper(list, v);
783
- let groupBy = prevGroupBy?.by.filter(v => v.fieldUuid === item.fieldUuid)[0] || prevGroupBy?.group.filter(v => v.fieldUuid === item.fieldUuid)[0] || null;
784
- groupBy.alias = alias;
785
- const sql = groupBy.sql;
786
- if (groupBy) {
787
- item.sql = sql;
788
- item.groupSql = sql;
789
- }
790
- } else {
791
- item.alias = alias;
792
- item.sql = '';
793
- }
779
+ // if (item.alias === SummarizeAlias) {
780
+ // //有groupBy 特殊处理
781
+ // const { prevGroupBy } = getHelper(list, v);
782
+ // let groupBy: any =
783
+ // prevGroupBy?.by.filter((v) => v.fieldUuid === item.fieldUuid)[0] ||
784
+ // prevGroupBy?.group.filter((v) => v.fieldUuid === item.fieldUuid)[0] ||
785
+ // null;
786
+ // groupBy.alias = alias;
787
+ // const sql = groupBy.sql;
788
+ // if (groupBy) {
789
+ // item.sql = sql;
790
+ // item.groupSql = sql;
791
+ // }
792
+ // }
793
+ item.alias = alias;
794
+ item.sql = '';
795
+ }
796
+ if (item.table2 && item.table2.tableUuid === tableUuid) {
797
+ // if (item.table2.alias === SummarizeAlias) {
798
+ // //有groupBy 特殊处理
799
+ // const { prevGroupBy } = getHelper(list, v);
800
+ // let groupBy: any =
801
+ // prevGroupBy?.by.filter((v) => v.fieldUuid === item.table2?.fieldUuid)[0] ||
802
+ // prevGroupBy?.group.filter((v) => v.fieldUuid === item.table2?.fieldUuid)[0] ||
803
+ // null;
804
+ // groupBy.alias = alias;
805
+ // const sql = groupBy.sql;
806
+ // if (groupBy) {
807
+ // item.table2.sql = sql;
808
+ // item.table2.groupSql = sql;
809
+ // }
810
+ // }
811
+ item.table2.alias = alias;
812
+ item.table2.sql = '';
794
813
  }
795
814
  });
796
815
  }
@@ -805,12 +824,30 @@ const changeFieldAlias = (list, curObj) => {
805
824
  const newList = cloneDeep(list);
806
825
  newList.map(v => {
807
826
  if (v.type === TypeEnum.data) ;
808
- if (v.type === TypeEnum.joinData) ;
827
+ if (v.type === TypeEnum.joinData) {
828
+ if (v.table1.fieldUuid === fieldUuid) {
829
+ v.table1.fieldAlias = fieldAlias;
830
+ }
831
+ if (v.table2.fieldUuid === fieldUuid) {
832
+ v.table2.fieldAlias = fieldAlias;
833
+ }
834
+ v.expressions.map(column => {
835
+ if (column.left_fieldUuid === fieldUuid) {
836
+ column.left_fieldAlias = fieldAlias;
837
+ }
838
+ if (column.right_fieldUuid === fieldUuid) {
839
+ column.right_fieldAlias = fieldAlias;
840
+ }
841
+ });
842
+ // if (v.table1.tableUuid === tableUuid) {
843
+ // v.table1.alias = alias;
844
+ // }
845
+ }
809
846
  if (v.type === TypeEnum.customColumn) {
810
847
  v.customColumn.map(item => {
811
848
  item.formulaList?.map(formula => {
812
- if (formula.fieldUuid === fieldUuid) {
813
- formula.fieldAlias = fieldAlias;
849
+ if (formula.expression && formula.expression.fieldUuid === fieldUuid) {
850
+ formula.expression.fieldAlias = fieldAlias;
814
851
  }
815
852
  });
816
853
  });
@@ -864,11 +901,108 @@ const changeFieldAlias = (list, curObj) => {
864
901
  }
865
902
  }
866
903
  }
904
+ if (item.table2 && item.table2.fieldUuid === fieldUuid) {
905
+ item.table2.fieldAlias = fieldAlias;
906
+ // if (item.table2.alias === SummarizeAlias) {
907
+ // //有groupBy 特殊处理
908
+ // const { prevGroupBy } = getHelper(list, v);
909
+ // let groupBy: any =
910
+ // prevGroupBy?.by.filter((v) => v.fieldUuid === item.table2?.fieldUuid)[0] ||
911
+ // prevGroupBy?.group.filter((v) => v.fieldUuid === item.table2?.fieldUuid)[0] ||
912
+ // null;
913
+ // groupBy.fieldAlias = fieldAlias;
914
+ // const sql = groupBy.sql;
915
+ // if (groupBy) {
916
+ // item.table2.sql = sql;
917
+ // item.table2.groupSql = sql;
918
+ // }
919
+ // }
920
+ }
867
921
  });
868
922
  }
869
923
  });
870
924
  return newList;
871
925
  };
926
+ function splitByUnion(data) {
927
+ const original = cloneDeep(data);
928
+ const result = [];
929
+ let i = 0;
930
+ while (i < original.length) {
931
+ const item = original[i];
932
+ if (item.type === 'group') {
933
+ // group.list 中每一项原样推入结果
934
+ for (const subItem of item.list) {
935
+ result.push(subItem);
936
+ }
937
+ i++;
938
+ } else if (item.type === 'union') {
939
+ const {
940
+ list,
941
+ ...otehr
942
+ } = item;
943
+ // 查找下一个 group,并将其 list 转成 subquery
944
+ const nextItem = original[i + 1];
945
+ if (nextItem && nextItem.type === 'group') {
946
+ result.push({
947
+ ...otehr,
948
+ subquery: nextItem.list.map(subItem => subItem)
949
+ });
950
+ i += 2;
951
+ } else {
952
+ result.push({
953
+ ...otehr,
954
+ subquery: []
955
+ });
956
+ i++;
957
+ }
958
+ }
959
+ }
960
+ return result;
961
+ }
962
+ function reassembleByUnion(target) {
963
+ const result = [];
964
+ let i = 0;
965
+ const len = target.length;
966
+ // 如果没有任何 union,直接放入一个 group.list
967
+ const hasUnion = target.some(item => item.type === 'union');
968
+ if (!hasUnion) {
969
+ return [{
970
+ type: 'group',
971
+ name: 'default',
972
+ list: [...target]
973
+ }];
974
+ }
975
+ // 否则正常处理
976
+ while (i < len) {
977
+ const item = target[i];
978
+ if (item.type !== 'union') {
979
+ // 收集连续非 union 的 item,统一放入一个 group.list
980
+ const groupList = [];
981
+ while (i < len && target[i].type !== 'union') {
982
+ groupList.push(target[i]);
983
+ i++;
984
+ }
985
+ result.push({
986
+ type: 'group',
987
+ name: 'default',
988
+ list: groupList
989
+ });
990
+ } else {
991
+ // 处理 union
992
+ result.push({
993
+ type: 'union',
994
+ name: 'union',
995
+ union: item.union ?? 'UNION',
996
+ list: []
997
+ });
998
+ const subquery = item.subquery || [];
999
+ const convertedSubquery = reassembleByUnion(subquery);
1000
+ result.push(...convertedSubquery);
1001
+ i++; // 跳过当前 union
1002
+ }
1003
+ }
1004
+ return result;
1005
+ }
872
1006
 
873
1007
  let metaKey = 1;
874
1008
  const SummarizeAlias = 'source';
@@ -893,9 +1027,9 @@ const useStore = () => {
893
1027
  list: defaultMetaList
894
1028
  }];
895
1029
  const defaultOperator = {
896
- type: 'group',
897
- name: 'group',
898
- operator: UnionEnum.union,
1030
+ type: 'union',
1031
+ name: 'union',
1032
+ union: UnionEnum.union,
899
1033
  list: []
900
1034
  };
901
1035
  const [showFields, setShowFields] = useState(true); //显示字段
@@ -921,6 +1055,8 @@ const useStore = () => {
921
1055
  }); //弹窗
922
1056
  const [popupClosable, setClosable] = useState(true); //是否可关闭 如果弹框里面再弹框 则不可关闭
923
1057
  const [popupClosable2, setClosable2] = useState(true); //是否可关闭 如果弹框里面再弹框 则不可关闭
1058
+ // 外层ref
1059
+ const popupContainer = useRef();
924
1060
  // const [fetchDatasetFn, setFetchDatasetFn] = useState<(id: string) => Promise<any>>(
925
1061
  // async () => {},
926
1062
  // ); //fn
@@ -938,18 +1074,18 @@ const useStore = () => {
938
1074
  };
939
1075
  // 是否显示主表后面的字段按钮 (如果下面 没有聚合,或者选了聚合但是聚合里面没有选值的时候显示 主表字段按钮)
940
1076
  const showMainColumn = useMemo(() => {
941
- // 先将二维数组拍平为一维数组
942
- const flatMetaList = metaList.flatMap(group => group.list);
943
- // 过滤出所有汇总类型的项
944
- const summarizeItems = flatMetaList.filter(v => v.type === TypeEnum.summarize);
945
- // 如果没有汇总项,默认显示主列
946
- if (summarizeItems.length === 0) {
947
- return true;
948
- }
949
- // 如果只有一个汇总项,并且 group 和 by 都为空,则也显示主列
950
- const onlyItem = summarizeItems[0];
951
- const hasGroupOrBy = Array.isArray(onlyItem.group) && onlyItem.group.length > 0 || Array.isArray(onlyItem.by) && onlyItem.by.length > 0;
952
- return !hasGroupOrBy;
1077
+ return metaList.map((item, groupIndex) => {
1078
+ // 过滤出所有汇总类型的项
1079
+ const summarizeItems = item.list.filter(v => v.type === TypeEnum.summarize);
1080
+ // 如果没有汇总项,默认显示主列
1081
+ if (summarizeItems.length === 0) {
1082
+ return true;
1083
+ }
1084
+ // 如果只有一个汇总项,并且 group 和 by 都为空,则也显示主列
1085
+ const onlyItem = summarizeItems[0];
1086
+ const hasGroupOrBy = Array.isArray(onlyItem.group) && onlyItem.group.length > 0 || Array.isArray(onlyItem.by) && onlyItem.by.length > 0;
1087
+ return !hasGroupOrBy;
1088
+ });
953
1089
  }, [metaList]);
954
1090
  // const showMainColumn = useMemo(() => {
955
1091
  // let summarizeList = metaList.filter((v) => v.type === TypeEnum.summarize);
@@ -978,7 +1114,7 @@ const useStore = () => {
978
1114
  // 查询表字段
979
1115
  const fetchColumns = async (table, datasourceId, callback) => {
980
1116
  let {
981
- alias,
1117
+ alias = '',
982
1118
  datasourceName,
983
1119
  datasourceId: did,
984
1120
  // @ts-ignore
@@ -1007,14 +1143,48 @@ const useStore = () => {
1007
1143
  _setMeta(newMeta);
1008
1144
  };
1009
1145
  // 回显
1146
+ // 设置column
1147
+ const setQuotes = async _meta => {
1148
+ let newMeta = cloneDeep(_meta);
1149
+ newMeta.table1 = {
1150
+ ...newMeta.table1,
1151
+ fieldAlias: newMeta.table1.fieldAlias || newMeta.table1.column,
1152
+ fieldUuid: newMeta.table1.fieldUuid || newMeta.table1.column_id,
1153
+ quotes: newMeta.table1.quotes || newMeta.table1.column
1154
+ };
1155
+ newMeta.table2 = {
1156
+ ...newMeta.table2,
1157
+ fieldAlias: newMeta.table2.fieldAlias || newMeta.table2.column,
1158
+ fieldUuid: newMeta.table2.fieldUuid || newMeta.table2.column_id,
1159
+ quotes: newMeta.table2.quotes || newMeta.table2.column
1160
+ };
1161
+ newMeta.expressions = newMeta.expressions.map(v => {
1162
+ return {
1163
+ ...v,
1164
+ left_fieldAlias: v.fieldAlias || v.left_column,
1165
+ left_fieldUuid: v.fieldUuid || v.left_column_id,
1166
+ left_quotes: v.left_quotes || v.left_column,
1167
+ right_fieldAlias: v.right_fieldAlias || v.right_column,
1168
+ right_fieldUuid: v.right_fieldUuid || v.right_column_id,
1169
+ right_quotes: v.right_quotes || v.right_column
1170
+ };
1171
+ });
1172
+ return newMeta;
1173
+ };
1010
1174
  const setPreData = async data => {
1011
1175
  if (data.length) {
1012
1176
  let _metaList = data.map((item, groupIndex) => {
1013
- let newList = item.list?.map((v, i) => {
1177
+ let newList = item.list?.map(async (v, i) => {
1178
+ let newMeta = cloneDeep(item.list);
1179
+ let newV = cloneDeep(v);
1180
+ // 替换column
1181
+ if (newV.type === TypeEnum.joinData) {
1182
+ newMeta[i] = await setQuotes(newMeta[i]);
1183
+ setMeta(newMeta, groupIndex);
1184
+ }
1014
1185
  // 设置右侧column
1015
1186
  if (v.table2?.datasourceId && v.columns.length < 1) {
1016
- let newMeta = v.slice();
1017
- fetchColumns(newMeta[i].table2, newMeta[i].table2.datasourceId, columns => {
1187
+ await fetchColumns(newMeta[i].table2, newMeta[i].table2.datasourceId, columns => {
1018
1188
  if (v.isSubquery) {
1019
1189
  let newColumns = [];
1020
1190
  const items = getSubColumns(v.subquery);
@@ -1031,8 +1201,7 @@ const useStore = () => {
1031
1201
  }
1032
1202
  // 设置column
1033
1203
  if (v.table?.datasourceId && v.columns.length < 1) {
1034
- let newMeta = v.slice();
1035
- fetchColumns(newMeta[i].table, newMeta[i].table.datasourceId, columns => {
1204
+ await fetchColumns(newMeta[i].table, newMeta[i].table.datasourceId, columns => {
1036
1205
  if (v.isSubquery) {
1037
1206
  let newColumns = [];
1038
1207
  const items = getSubColumns(v.subquery);
@@ -1054,7 +1223,8 @@ const useStore = () => {
1054
1223
  return {
1055
1224
  name: item.name || 'default',
1056
1225
  list: newList.length < 1 ? defaultMetaList : newList,
1057
- type: item.type || 'group'
1226
+ type: item.type || 'group',
1227
+ union: item.union
1058
1228
  };
1059
1229
  });
1060
1230
  const validMetaKeys = _metaList.flatMap(group => group.list).map(v => Number(v.metaKey)).filter(num => !isNaN(num));
@@ -1077,8 +1247,8 @@ const useStore = () => {
1077
1247
  tableUuid: '',
1078
1248
  datasourceId: '',
1079
1249
  datasourceName: '',
1080
- column: '',
1081
- column_id: ''
1250
+ fieldAlias: '',
1251
+ fieldUuid: ''
1082
1252
  };
1083
1253
  if (index === 1) {
1084
1254
  table1 = {
@@ -1087,8 +1257,8 @@ const useStore = () => {
1087
1257
  alias: mainTable.table.alias,
1088
1258
  datasourceId: mainTable.table.datasourceId,
1089
1259
  datasourceName: mainTable.table.datasourceName,
1090
- column: '',
1091
- column_id: ''
1260
+ fieldAlias: '',
1261
+ fieldUuid: ''
1092
1262
  };
1093
1263
  }
1094
1264
  item = {
@@ -1103,8 +1273,8 @@ const useStore = () => {
1103
1273
  tableUuid: '',
1104
1274
  datasourceId: '',
1105
1275
  datasourceName: '',
1106
- column: '',
1107
- column_id: ''
1276
+ fieldAlias: '',
1277
+ fieldUuid: ''
1108
1278
  },
1109
1279
  columns: [],
1110
1280
  expressions: []
@@ -1162,7 +1332,7 @@ const useStore = () => {
1162
1332
  }
1163
1333
  };
1164
1334
  }
1165
- if (type === TypeEnum.group) {
1335
+ if (type === TypeEnum.union) {
1166
1336
  // 添加分组
1167
1337
  let newMetaList = metaList.slice();
1168
1338
  newMetaList.splice(groupIndex + 1, 0, defaultOperator, ...defaultMeta);
@@ -1331,7 +1501,8 @@ const useStore = () => {
1331
1501
  _setShowSubquery,
1332
1502
  constantList,
1333
1503
  setConstantList,
1334
- changeAlias
1504
+ changeAlias,
1505
+ popupContainer
1335
1506
  };
1336
1507
  };
1337
1508
 
@@ -1733,6 +1904,7 @@ const getComputedTranslate = obj => {
1733
1904
  };
1734
1905
  // 获取元素距离浏览器顶部的距离
1735
1906
  const getElementTop = elem => {
1907
+ if (!elem) return 0;
1736
1908
  let elemTop = elem.offsetTop;
1737
1909
  let pElem = elem.offsetParent;
1738
1910
  while (pElem != null) {
@@ -1746,6 +1918,7 @@ const getElementTop = elem => {
1746
1918
  };
1747
1919
  // 获取元素距离浏览器顶部的距离
1748
1920
  const getElementLeft = elem => {
1921
+ if (!elem) return 0;
1749
1922
  let elemLeft = elem.offsetLeft;
1750
1923
  let pElem = elem.offsetParent;
1751
1924
  while (pElem != null) {
@@ -1757,8 +1930,23 @@ const getElementLeft = elem => {
1757
1930
  }
1758
1931
  return elemLeft;
1759
1932
  };
1760
- const getScrollTop = () => {
1761
- return document.documentElement.scrollTop;
1933
+ // 获取元素可见范围内高度
1934
+ const getContainerVisibleHeight = container => {
1935
+ if (!container) return 0;
1936
+ const rect = container.getBoundingClientRect();
1937
+ const windowHeight = window.innerHeight || document.documentElement.clientHeight;
1938
+ // 元素顶部在视口上方 -> 不可见
1939
+ if (rect.bottom < 0) return 0;
1940
+ // 元素底部在视口下方 -> 不可见
1941
+ if (rect.top > windowHeight) return 0;
1942
+ // 可见区域的 top 和 bottom
1943
+ const visibleTop = Math.max(rect.top, 0);
1944
+ const visibleBottom = Math.min(rect.bottom, windowHeight);
1945
+ // 可见高度
1946
+ return visibleBottom - visibleTop;
1947
+ };
1948
+ const getScrollTop = elem => {
1949
+ return elem?.scrollTop || document.documentElement.scrollTop;
1762
1950
  };
1763
1951
  // 浏览器可视宽高
1764
1952
  const getWindowSize = () => {
@@ -2237,7 +2425,7 @@ const List = [{
2237
2425
  const RowLimit$1 = props => {
2238
2426
  const {
2239
2427
  meta,
2240
- operator,
2428
+ union,
2241
2429
  groupIndex
2242
2430
  } = props;
2243
2431
  const store = useStore$1();
@@ -2247,10 +2435,10 @@ const RowLimit$1 = props => {
2247
2435
  node: e.currentTarget,
2248
2436
  content: jsx(SelectList, {
2249
2437
  list: List,
2250
- value: operator,
2438
+ value: union,
2251
2439
  onChange: type => {
2252
2440
  let newMeta = store.metaList.slice();
2253
- newMeta[groupIndex].operator = type;
2441
+ newMeta[groupIndex].union = type;
2254
2442
  store._setMeta(newMeta);
2255
2443
  store.setPopup({
2256
2444
  visible: false
@@ -2273,7 +2461,7 @@ const RowLimit$1 = props => {
2273
2461
  children: jsx("div", {
2274
2462
  className: `Sqb-TableName`,
2275
2463
  onClick: e => selectOperator(e),
2276
- children: operator
2464
+ children: union
2277
2465
  })
2278
2466
  })
2279
2467
  })]
@@ -3329,6 +3517,7 @@ function returnDocument(element) {
3329
3517
  const outSpacing = 10;
3330
3518
  function generateTrigger(PortalComponent) {
3331
3519
  class Trigger extends React.Component {
3520
+ resizeObserver = null; // 显式声明 resizeObserver 属性
3332
3521
  resetId = -1; // 监听窗口改变事件id 用于组件销毁的时候清除事件
3333
3522
  static defaultProps = {
3334
3523
  visible: false,
@@ -3343,11 +3532,39 @@ function generateTrigger(PortalComponent) {
3343
3532
  this.resetId = winResetEvent.addEvent(this.didUpdate, this, 300);
3344
3533
  this.props.container && this.props.container.addEventListener('scroll', this.didUpdate);
3345
3534
  this.bindEvent();
3535
+ // 延迟绑定 ResizeObserver 到 ensure the element is ready
3536
+ this.initResizeObserver();
3537
+ }
3538
+ componentDidUpdate(prevProps) {
3539
+ // 如果 children 发生变化,重新初始化观察器
3540
+ if (prevProps.children !== this.props.children) {
3541
+ this.initResizeObserver();
3542
+ }
3346
3543
  }
3347
3544
  componentWillUnmount() {
3348
3545
  winResetEvent.removeEvent(this.resetId);
3349
3546
  this.props.container && this.props.container.removeEventListener('scroll', this.didUpdate);
3547
+ if (this.resizeObserver) {
3548
+ this.resizeObserver.disconnect();
3549
+ this.resizeObserver = null;
3550
+ }
3350
3551
  }
3552
+ // children高度变化后,从新计算高度
3553
+ initResizeObserver = () => {
3554
+ const targetNode = this.ref.current;
3555
+ if (!targetNode) return;
3556
+ // 如果已经存在 ResizeObserver,先断开连接
3557
+ if (this.resizeObserver) {
3558
+ this.resizeObserver.disconnect();
3559
+ }
3560
+ // 初始化 ResizeObserver 并开始观察目标节点
3561
+ this.resizeObserver = new ResizeObserver(entries => {
3562
+ entries.forEach(entry => {
3563
+ this.didUpdate();
3564
+ });
3565
+ });
3566
+ this.resizeObserver.observe(targetNode);
3567
+ };
3351
3568
  bindEvent = () => {
3352
3569
  let that = this;
3353
3570
  returnDocument().body.addEventListener('click', function (e) {
@@ -3365,7 +3582,7 @@ function generateTrigger(PortalComponent) {
3365
3582
  this.props.visible && this.props.closable && this.props.hideVisible();
3366
3583
  };
3367
3584
  attachParent = popupContainer => {
3368
- let mountNode = returnDocument().body;
3585
+ let mountNode = this.props.container || returnDocument().body;
3369
3586
  mountNode.appendChild(popupContainer);
3370
3587
  };
3371
3588
  getCurrentNodePos = () => {
@@ -3374,8 +3591,9 @@ function generateTrigger(PortalComponent) {
3374
3591
  container
3375
3592
  } = this.props;
3376
3593
  return {
3377
- x: getElementLeft(node),
3378
- y: getElementTop(node) - (container?.scrollTop || 0),
3594
+ x: getElementLeft(node) - getElementLeft(container),
3595
+ y: getElementTop(node) - getElementTop(container),
3596
+ t: getElementTop(container),
3379
3597
  h: node.offsetHeight
3380
3598
  };
3381
3599
  };
@@ -3418,19 +3636,21 @@ function generateTrigger(PortalComponent) {
3418
3636
  didUpdate = () => {
3419
3637
  if (!this.props.node) return false;
3420
3638
  let {
3421
- innerSpacing = 10
3639
+ innerSpacing = 10,
3640
+ container
3422
3641
  } = this.props;
3423
3642
  let pos = this.getCurrentNodePos();
3424
- let posY = pos.y - getScrollTop();
3643
+ let posY = pos.y - getScrollTop(container);
3425
3644
  if (!this.ref) return false;
3426
3645
  let realHeight = this.ref?.current?.childNodes?.[0]?.offsetHeight || 0;
3427
3646
  if (!realHeight) return false;
3428
3647
  let {
3429
3648
  height: winH
3430
3649
  } = getWindowSize();
3431
- let downH = winH - posY - pos.h; // 元素下面可用高度
3650
+ let containerH = getContainerVisibleHeight(container);
3651
+ let downH = (containerH || winH) - posY - pos.h; // 元素下面可用高度
3432
3652
  let maxHeight = 0;
3433
- let topHeight = getScrollTop();
3653
+ let topHeight = getScrollTop(container);
3434
3654
  if (downH >= posY || realHeight <= downH - innerSpacing - outSpacing) {
3435
3655
  // 下面比上面宽敞 或 下面足够放下所有 放下面
3436
3656
  maxHeight = Math.min(realHeight, downH - innerSpacing - outSpacing);
@@ -3580,7 +3800,7 @@ const SelectColumn = ({
3580
3800
  });
3581
3801
  };
3582
3802
 
3583
- var css_248z$6 = ".Sqb-SelectColumns--box {\n box-sizing: border-box;\n min-width: 1em;\n max-width: 500px;\n background-color: #ffffff;\n overflow: hidden;\n}\n.Sqb-SelectColumns--box .Sqb-List-item {\n display: flex;\n border-radius: 4px;\n margin-top: 2px;\n margin-bottom: 2px;\n}\n.Sqb-SelectColumns--box .Sqb-List-item a {\n flex: auto;\n cursor: pointer;\n display: flex;\n align-items: center;\n}\n.Sqb-SelectColumns--box .Sqb-List-item .List-item-icon {\n display: flex;\n align-items: center;\n color: #b8bbc3;\n}\n.Sqb-SelectColumns--box .Sqb-List-item .List-item-title {\n word-break: break-word;\n word-wrap: anywhere;\n color: #4c5773;\n margin-top: 0;\n margin-bottom: 0;\n font-size: 14px;\n}\n.Sqb-SelectColumns--box .Sqb-List-item .Field-extra {\n display: flex;\n align-items: center;\n padding: 0.5rem;\n cursor: pointer;\n border-left: 2px solid rgba(113, 114, 173, 0.1);\n color: rgba(255, 255, 255, 0.5);\n visibility: hidden;\n}\n.Sqb-SelectColumns--box .Sqb-List-item .Field-extra h4 {\n margin-bottom: 0;\n color: inherit;\n}\n.Sqb-SelectColumns--box .Sqb-List-item .Field-extra svg {\n color: #fff;\n margin-left: 0.5rem;\n}\n.Sqb-SelectColumns--box .Sqb-List-item .Field-extra:hover {\n color: #fff;\n}\n.Sqb-SelectColumns--box .Sqb-List-item:not(.disabled):hover,\n.Sqb-SelectColumns--box .Sqb-List-item.active {\n background-color: #509ee3;\n border-color: rgba(169, 137, 197, 0.2);\n}\n.Sqb-SelectColumns--box .Sqb-List-item:not(.disabled):hover .List-item-icon,\n.Sqb-SelectColumns--box .Sqb-List-item.active .List-item-icon {\n color: #fff !important;\n}\n.Sqb-SelectColumns--box .Sqb-List-item:not(.disabled):hover .List-item-title,\n.Sqb-SelectColumns--box .Sqb-List-item.active .List-item-title {\n color: #fff !important;\n}\n.Sqb-SelectColumns--box .Sqb-List-item:not(.disabled):hover .Field-extra,\n.Sqb-SelectColumns--box .Sqb-List-item.active .Field-extra {\n visibility: visible;\n}\n.Sqb-SelectColumns--box .Sqb-List-item.disabled .List-item-title {\n color: #949aab !important;\n}\n.Sqb-SelectColumns--box .Sqb-List-title {\n display: flex;\n border-radius: 4px;\n}\n.Sqb-SelectColumns--box .Sqb-List-title a {\n flex: auto;\n cursor: default;\n display: flex;\n align-items: center;\n color: #4c5773;\n overflow: hidden;\n}\n.Sqb-SelectColumns--box .Sqb-List-title .List-item-icon {\n display: flex;\n align-items: center;\n}\n.Sqb-SelectColumns--box .Sqb-List-title .List-item-title {\n word-break: break-word;\n word-wrap: anywhere;\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.Sqb-SelectColumns--box .Sqb-List-title .List-title-arrow {\n margin-left: auto;\n}\n.Sqb-SelectColumns--box .Sqb-List-title.active .List-item-icon {\n color: #509ee3;\n}\n.Sqb-SelectColumns--box .Sqb-List-title.shrink {\n cursor: pointer;\n}\n.Sqb-SelectColumns--box .Sqb-List-title.shrink a {\n cursor: pointer;\n}\n.Sqb-SelectColumns--box .Sqb-List-title.shrink:hover a {\n color: #509ee3;\n}\n.Sqb-SelectColumns--box .Sqb-List-title.shrink:hover a .List-item-title {\n color: #509ee3;\n}\n.Sqb-SelectColumns--box .Sqb-List-search {\n display: flex;\n align-items: center;\n flex: 1 0 auto;\n color: #b8bbc3;\n background-color: #fff;\n border: 1px solid #f0f0f0;\n font-size: 14px;\n}\n.Sqb-SelectColumns--box .Sqb-List-search span {\n line-height: 0;\n}\n.Sqb-SelectColumns--box .Sqb-List-search input {\n box-shadow: none;\n outline: 0;\n border: none !important;\n background: transparent;\n color: #4c5773;\n font-size: 1.12em;\n font-weight: 600;\n}\n.Sqb-SelectColumns--box .Sqb-List-search input::-webkit-input-placeholder {\n color: #b8bbc3;\n}\n.Sqb-SelectColumns--box .Sqb-List-search input::-ms-input-placeholder {\n color: #b8bbc3;\n}\n.Sqb-SelectColumns--box.greenGrass .Sqb-List-item:not(.disabled):hover,\n.Sqb-SelectColumns--box.greenGrass .Sqb-List-item.active {\n background-color: #88bf4d;\n}\n.Sqb-SelectColumns--box.greenGrass .Sqb-List-title.active .List-item-icon {\n color: #88bf4d;\n}\n.Sqb-SelectColumns--box.greenGrass .Sqb-List-title.shrink:hover a {\n color: #88bf4d;\n}\n.Sqb-SelectColumns--box.greenGrass .Sqb-List-title.shrink:hover a .List-item-title {\n color: #88bf4d;\n}\n.Sqb-SelectColumns--box.purple .Sqb-List-item:not(.disabled):hover,\n.Sqb-SelectColumns--box.purple .Sqb-List-item.active {\n background-color: #7172ad;\n}\n.Sqb-SelectColumns--box.purple .Sqb-List-title.active .List-item-icon {\n color: #7172ad;\n}\n.Sqb-SelectColumns--box.purple .Sqb-List-title.shrink:hover a {\n color: #7172ad;\n}\n.Sqb-SelectColumns--box.purple .Sqb-List-title.shrink:hover a .List-item-title {\n color: #7172ad;\n}\n.menu-list {\n border: none !important;\n}\n.menu-list .ant-menu-item:hover {\n color: #88bf4d !important;\n}\n.menu-list .ant-menu-item-selected {\n background-color: #88bf4d !important;\n color: #fff !important;\n border-radius: 4px !important;\n}\n";
3803
+ var css_248z$6 = ".Sqb-SelectColumns--box {\n box-sizing: border-box;\n min-width: 1em;\n max-width: 500px;\n background-color: #ffffff;\n overflow: hidden;\n}\n.Sqb-SelectColumns--box .Sqb-List-item {\n display: flex;\n border-radius: 4px;\n margin-top: 2px;\n margin-bottom: 2px;\n}\n.Sqb-SelectColumns--box .Sqb-List-item .List-item {\n flex: auto;\n cursor: pointer;\n display: flex;\n align-items: center;\n}\n.Sqb-SelectColumns--box .Sqb-List-item .List-item-icon {\n display: flex;\n align-items: center;\n color: #b8bbc3;\n}\n.Sqb-SelectColumns--box .Sqb-List-item .List-item-title {\n word-break: break-word;\n word-wrap: anywhere;\n color: #4c5773;\n margin-top: 0;\n margin-bottom: 0;\n font-size: 14px;\n}\n.Sqb-SelectColumns--box .Sqb-List-item .Field-extra {\n display: flex;\n align-items: center;\n padding: 0.5rem;\n cursor: pointer;\n border-left: 2px solid rgba(113, 114, 173, 0.1);\n color: rgba(255, 255, 255, 0.5);\n visibility: hidden;\n}\n.Sqb-SelectColumns--box .Sqb-List-item .Field-extra h4 {\n margin-bottom: 0;\n color: inherit;\n}\n.Sqb-SelectColumns--box .Sqb-List-item .Field-extra svg {\n color: #fff;\n margin-left: 0.5rem;\n}\n.Sqb-SelectColumns--box .Sqb-List-item .Field-extra:hover {\n color: #fff;\n}\n.Sqb-SelectColumns--box .Sqb-List-item:not(.disabled):hover,\n.Sqb-SelectColumns--box .Sqb-List-item.active {\n background-color: #509ee3;\n border-color: rgba(169, 137, 197, 0.2);\n}\n.Sqb-SelectColumns--box .Sqb-List-item:not(.disabled):hover .List-item-icon,\n.Sqb-SelectColumns--box .Sqb-List-item.active .List-item-icon {\n color: #fff !important;\n}\n.Sqb-SelectColumns--box .Sqb-List-item:not(.disabled):hover .List-item-title,\n.Sqb-SelectColumns--box .Sqb-List-item.active .List-item-title {\n color: #fff !important;\n}\n.Sqb-SelectColumns--box .Sqb-List-item:not(.disabled):hover .Field-extra,\n.Sqb-SelectColumns--box .Sqb-List-item.active .Field-extra {\n visibility: visible;\n}\n.Sqb-SelectColumns--box .Sqb-List-item.disabled .List-item-title {\n color: #949aab !important;\n}\n.Sqb-SelectColumns--box .Sqb-List-title {\n display: flex;\n border-radius: 4px;\n}\n.Sqb-SelectColumns--box .Sqb-List-title .List-item {\n flex: auto;\n cursor: pointer;\n display: flex;\n align-items: center;\n color: #4c5773;\n overflow: hidden;\n}\n.Sqb-SelectColumns--box .Sqb-List-title .List-item-icon {\n display: flex;\n align-items: center;\n}\n.Sqb-SelectColumns--box .Sqb-List-title .List-item-title {\n word-break: break-word;\n word-wrap: anywhere;\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.Sqb-SelectColumns--box .Sqb-List-title .List-title-arrow {\n margin-left: auto;\n}\n.Sqb-SelectColumns--box .Sqb-List-title.active .List-item-icon {\n color: #509ee3;\n}\n.Sqb-SelectColumns--box .Sqb-List-title.shrink {\n cursor: pointer;\n}\n.Sqb-SelectColumns--box .Sqb-List-title.shrink .List-item {\n cursor: pointer;\n}\n.Sqb-SelectColumns--box .Sqb-List-title.shrink:hover .List-item {\n color: #509ee3;\n}\n.Sqb-SelectColumns--box .Sqb-List-title.shrink:hover .List-item .List-item-title {\n color: #509ee3;\n}\n.Sqb-SelectColumns--box .Sqb-List-search {\n display: flex;\n align-items: center;\n flex: 1 0 auto;\n color: #b8bbc3;\n background-color: #fff;\n border: 1px solid #f0f0f0;\n font-size: 14px;\n}\n.Sqb-SelectColumns--box .Sqb-List-search span {\n line-height: 0;\n}\n.Sqb-SelectColumns--box .Sqb-List-search input {\n box-shadow: none;\n outline: 0;\n border: none !important;\n background: transparent;\n color: #4c5773;\n font-size: 1.12em;\n font-weight: 600;\n}\n.Sqb-SelectColumns--box .Sqb-List-search input::-webkit-input-placeholder {\n color: #b8bbc3;\n}\n.Sqb-SelectColumns--box .Sqb-List-search input::-ms-input-placeholder {\n color: #b8bbc3;\n}\n.Sqb-SelectColumns--box.greenGrass .Sqb-List-item:not(.disabled):hover,\n.Sqb-SelectColumns--box.greenGrass .Sqb-List-item.active {\n background-color: #88bf4d;\n}\n.Sqb-SelectColumns--box.greenGrass .Sqb-List-title.active .List-item-icon {\n color: #88bf4d;\n}\n.Sqb-SelectColumns--box.greenGrass .Sqb-List-title.shrink:hover a {\n color: #88bf4d;\n}\n.Sqb-SelectColumns--box.greenGrass .Sqb-List-title.shrink:hover a .List-item-title {\n color: #88bf4d;\n}\n.Sqb-SelectColumns--box.purple .Sqb-List-item:not(.disabled):hover,\n.Sqb-SelectColumns--box.purple .Sqb-List-item.active {\n background-color: #7172ad;\n}\n.Sqb-SelectColumns--box.purple .Sqb-List-title.active .List-item-icon {\n color: #7172ad;\n}\n.Sqb-SelectColumns--box.purple .Sqb-List-title.shrink:hover a {\n color: #7172ad;\n}\n.Sqb-SelectColumns--box.purple .Sqb-List-title.shrink:hover a .List-item-title {\n color: #7172ad;\n}\n.menu-list {\n border: none !important;\n}\n.menu-list .ant-menu-item:hover {\n color: #88bf4d !important;\n}\n.menu-list .ant-menu-item-selected {\n background-color: #88bf4d !important;\n color: #fff !important;\n border-radius: 4px !important;\n}\n";
3584
3804
  styleInject(css_248z$6);
3585
3805
 
3586
3806
  const NUMBER_GROUP = [SQL_COLUMN_TYPE.FLOAT, SQL_COLUMN_TYPE.LONG, SQL_COLUMN_TYPE.CURRENCY];
@@ -3698,7 +3918,8 @@ const SelectJoinColumn = ({
3698
3918
  })));
3699
3919
  }
3700
3920
  },
3701
- children: jsxs("a", {
3921
+ children: jsxs("div", {
3922
+ className: 'List-item',
3702
3923
  children: [jsx("span", {
3703
3924
  className: 'List-item-icon',
3704
3925
  children: jsx(TableIcon, {})
@@ -3717,7 +3938,7 @@ const SelectJoinColumn = ({
3717
3938
  })]
3718
3939
  })
3719
3940
  })
3720
- }), open && jsxs(Fragment, {
3941
+ }), (open || isSummarize) && jsxs(Fragment, {
3721
3942
  children: [!isSummarize && jsx("div", {
3722
3943
  className: cx(`Sqb-List-section`),
3723
3944
  children: jsxs("div", {
@@ -3790,8 +4011,8 @@ const SelectJoinColumn = ({
3790
4011
  realName
3791
4012
  });
3792
4013
  },
3793
- children: [jsxs("a", {
3794
- className: 'p-2',
4014
+ children: [jsxs("div", {
4015
+ className: 'p-2 List-item',
3795
4016
  children: [jsx("span", {
3796
4017
  className: 'List-item-icon',
3797
4018
  children: IconMap[special_type || database_type] || jsx(LetterAaIcon, {})
@@ -3830,7 +4051,8 @@ const SelectFilterColumn = ({
3830
4051
  value,
3831
4052
  onChange,
3832
4053
  didUpdate,
3833
- isCustom: _isCustom = false
4054
+ isCustom: _isCustom = false,
4055
+ container: _container = null
3834
4056
  }) => {
3835
4057
  const [curColumn, setCurColumn] = useState(value);
3836
4058
  const [condition, setCondition] = useState(value.condition);
@@ -4247,6 +4469,7 @@ const SelectFilterColumn = ({
4247
4469
  store.setPopup2({
4248
4470
  visible: true,
4249
4471
  node: e.currentTarget,
4472
+ container: _container,
4250
4473
  content: jsx(SelectList, {
4251
4474
  value: valType,
4252
4475
  list: store.constantList || [],
@@ -4269,6 +4492,7 @@ const SelectFilterColumn = ({
4269
4492
  store.setPopup2({
4270
4493
  visible: true,
4271
4494
  node: e.currentTarget,
4495
+ container: _container,
4272
4496
  content: jsx(SelectList, {
4273
4497
  value: valType,
4274
4498
  list: [{
@@ -4303,6 +4527,7 @@ const SelectFilterColumn = ({
4303
4527
  store.setPopup2({
4304
4528
  visible: true,
4305
4529
  node: e.currentTarget,
4530
+ container: _container,
4306
4531
  content: jsx(SelectJoinColumn, {
4307
4532
  data: [..._data],
4308
4533
  value: value,
@@ -5016,17 +5241,17 @@ const IconTypeMap = new Map([[TypeEnum.filter, {
5016
5241
  name: __('SqlQueryBuilder.rowLimit'),
5017
5242
  icon: jsx(RowLimitIcon, {}),
5018
5243
  className: 'rowLimit'
5019
- }], [TypeEnum.group, {
5244
+ }], [TypeEnum.union, {
5020
5245
  name: __('SqlQueryBuilder.union'),
5021
5246
  icon: jsx(GroupIcon, {}),
5022
5247
  className: 'union'
5023
5248
  }]]);
5024
5249
  // 前端展示的icon顺序 随便改不影响逻辑
5025
- const DisplayOrder = [TypeEnum.filter, TypeEnum.summarize, TypeEnum.joinData, TypeEnum.permissionTable, TypeEnum.customColumn, TypeEnum.sort, TypeEnum.rowLimit, TypeEnum.group];
5250
+ const DisplayOrder = [TypeEnum.filter, TypeEnum.summarize, TypeEnum.joinData, TypeEnum.permissionTable, TypeEnum.customColumn, TypeEnum.sort, TypeEnum.rowLimit, TypeEnum.union];
5026
5251
  // js逻辑顺序 正常顺序
5027
- const OrderType = [TypeEnum.data, TypeEnum.joinData, TypeEnum.permissionTable, TypeEnum.customColumn, TypeEnum.filter, TypeEnum.summarize, TypeEnum.sort, TypeEnum.rowLimit, TypeEnum.group];
5252
+ const OrderType = [TypeEnum.data, TypeEnum.joinData, TypeEnum.permissionTable, TypeEnum.customColumn, TypeEnum.filter, TypeEnum.summarize, TypeEnum.sort, TypeEnum.rowLimit, TypeEnum.union];
5028
5253
  // js逻辑顺序 聚合下面的顺序是这个样子
5029
- const OrderNewType = [TypeEnum.sort, TypeEnum.rowLimit, TypeEnum.joinData, TypeEnum.permissionTable, TypeEnum.customColumn, TypeEnum.filter, TypeEnum.summarize, TypeEnum.group];
5254
+ const OrderNewType = [TypeEnum.sort, TypeEnum.rowLimit, TypeEnum.joinData, TypeEnum.permissionTable, TypeEnum.customColumn, TypeEnum.filter, TypeEnum.summarize, TypeEnum.union];
5030
5255
  const metaIcon = (size, handleClick) => {
5031
5256
  return ({
5032
5257
  type
@@ -5131,7 +5356,7 @@ const findNextIcon = (store, props) => {
5131
5356
  if (meta.table2.name) {
5132
5357
  available = OrderType.slice(curLocation + 1);
5133
5358
  } else {
5134
- available = [TypeEnum.customColumn, TypeEnum.filter, TypeEnum.summarize, TypeEnum.group];
5359
+ available = [TypeEnum.customColumn, TypeEnum.filter, TypeEnum.summarize, TypeEnum.union];
5135
5360
  }
5136
5361
  } else {
5137
5362
  if (isLast) {
@@ -5153,7 +5378,7 @@ const findNextIcon = (store, props) => {
5153
5378
  if (meta.customColumn.length || ~joinIndex && prevList[joinIndex].table2.name) {
5154
5379
  available = OrderType.slice(curLocation + 1);
5155
5380
  } else {
5156
- available = [TypeEnum.filter, TypeEnum.summarize, TypeEnum.group];
5381
+ available = [TypeEnum.filter, TypeEnum.summarize, TypeEnum.union];
5157
5382
  }
5158
5383
  } else {
5159
5384
  if (isLast) {
@@ -5186,7 +5411,7 @@ const findNextIcon = (store, props) => {
5186
5411
  if (isLast) {
5187
5412
  if (!ExistAboveGroupBy) {
5188
5413
  if (meta.group.length && !meta.by.length) ; else if (!meta.group.length && !meta.by.length) {
5189
- available = [TypeEnum.sort, TypeEnum.rowLimit, TypeEnum.group];
5414
+ available = [TypeEnum.sort, TypeEnum.rowLimit, TypeEnum.union];
5190
5415
  } else {
5191
5416
  available = OrderNewType;
5192
5417
  }
@@ -5389,7 +5614,7 @@ const TableData = props => {
5389
5614
  }
5390
5615
  })
5391
5616
  }), selected ? `${meta.table.datasourceName}.${meta.table.name} ${meta.table?.alias ? `as ${meta.table?.alias}` : ''}` : __('SqlQueryBuilder.pickTable')]
5392
- }), selected && store.showMainColumn && store.showFields && jsx("div", {
5617
+ }), selected && store.showMainColumn[groupIndex] && store.showFields && jsx("div", {
5393
5618
  className: `Sqb-TableColumns`,
5394
5619
  onClick: selectColumns,
5395
5620
  children: __('SqlQueryBuilder.columns')
@@ -5411,8 +5636,8 @@ var FlagLocation;
5411
5636
  })(FlagLocation || (FlagLocation = {}));
5412
5637
  var ExpressionsEnum;
5413
5638
  (function (ExpressionsEnum) {
5414
- ExpressionsEnum["LEFT"] = "left_column";
5415
- ExpressionsEnum["RIGHT"] = "right_column";
5639
+ ExpressionsEnum["LEFT"] = "left";
5640
+ ExpressionsEnum["RIGHT"] = "right";
5416
5641
  })(ExpressionsEnum || (ExpressionsEnum = {}));
5417
5642
  const JoinData = props => {
5418
5643
  const {
@@ -5427,7 +5652,12 @@ const JoinData = props => {
5427
5652
  let table1Selected = Boolean(meta.table1.name);
5428
5653
  let table2Selected = Boolean(meta.table2.name);
5429
5654
  let subQuerySelected = Boolean(meta.subquery?.[0]?.table?.name);
5430
- let columnsSelected = meta.table1.column && meta.table2.column;
5655
+ let columnsSelected = meta.table1.quotes && meta.table2.quotes;
5656
+ // useEffect(() => {
5657
+ // let newMetaList = store.metaList[groupIndex].list.slice();
5658
+ // newMetaList[index] = setQuotes(meta);
5659
+ // store.setMeta(newMetaList, groupIndex);
5660
+ // }, [metaKey]);
5431
5661
  function selectColumns(e) {
5432
5662
  let columns = meta.columns;
5433
5663
  !meta.readonly && store.setPopup({
@@ -5496,8 +5726,9 @@ const JoinData = props => {
5496
5726
  name: tableName,
5497
5727
  tableUuid: data.tableUuid || uuidv4('table'),
5498
5728
  alias,
5499
- column: '',
5500
- column_id: '',
5729
+ fieldAlias: '',
5730
+ fieldUuid: '',
5731
+ quotes: '',
5501
5732
  datasourceId: data.datasourceId,
5502
5733
  datasourceName: data.datasourceName
5503
5734
  };
@@ -5540,8 +5771,9 @@ const JoinData = props => {
5540
5771
  let type = node.getAttribute('v-data');
5541
5772
  let data = [];
5542
5773
  let value = {
5543
- name: meta[type].column,
5544
- id: meta[type].column_id,
5774
+ name: meta[type].quotes || meta[type].fieldAlias,
5775
+ quotes: meta[type].quotes,
5776
+ id: meta[type].fieldUuid,
5545
5777
  table: meta[type].name,
5546
5778
  tableId: meta[type].id,
5547
5779
  fieldUuid: meta[type].fieldUuid || uuidv4('field'),
@@ -5659,11 +5891,21 @@ const JoinData = props => {
5659
5891
  sql,
5660
5892
  datasourceId,
5661
5893
  datasourceName,
5662
- id = ''
5894
+ id = '',
5895
+ fieldAlias = '',
5896
+ fieldUuid = '',
5897
+ quotes
5663
5898
  } = record;
5664
5899
  let newMeta = store.metaList[groupIndex].list.slice();
5665
- newMeta[index][type].column = name;
5666
- newMeta[index][type].column_id = id;
5900
+ if (alias === SummarizeAlias$1) {
5901
+ newMeta[index][type].fieldAlias = fieldAlias;
5902
+ newMeta[index][type].fieldUuid = fieldUuid;
5903
+ newMeta[index][type].quotes = quotes;
5904
+ } else {
5905
+ newMeta[index][type].fieldAlias = name;
5906
+ newMeta[index][type].fieldUuid = id;
5907
+ newMeta[index][type].quotes = name;
5908
+ }
5667
5909
  if (type === FlagLocation.TABLE_1) {
5668
5910
  if (newMeta[index][type].alias !== alias) {
5669
5911
  newMeta[index][type].alias = alias;
@@ -5691,8 +5933,8 @@ const JoinData = props => {
5691
5933
  let index = findIndex(store.metaList[groupIndex].list, meta);
5692
5934
  let table_type = type === ExpressionsEnum.LEFT ? FlagLocation.TABLE_1 : FlagLocation.TABLE_2;
5693
5935
  let value = {
5694
- name: meta.expressions[_ind][type],
5695
- id: meta.expressions[_ind][`${type}_id`],
5936
+ name: meta.expressions[_ind][`${type}_quotes`] || meta.expressions[_ind][`${type}_fieldAlias`],
5937
+ id: meta.expressions[_ind][`${type}_fieldUuid`],
5696
5938
  table: meta[table_type].name,
5697
5939
  fieldUuid: meta[table_type].fieldUuid || uuidv4('field'),
5698
5940
  fieldAlias: meta[table_type].fieldAlias || '',
@@ -5817,11 +6059,23 @@ const JoinData = props => {
5817
6059
  sql,
5818
6060
  datasourceId,
5819
6061
  datasourceName,
5820
- id = ''
6062
+ id = '',
6063
+ fieldAlias,
6064
+ fieldUuid,
6065
+ quotes = ''
5821
6066
  } = record;
5822
6067
  let newMeta = store.metaList[groupIndex].list.slice();
5823
- newMeta[index].expressions[_ind][type] = name;
5824
- newMeta[index].expressions[_ind][`${type}_id`] = id;
6068
+ if (alias === SummarizeAlias$1) {
6069
+ newMeta[index].expressions[_ind][`${type}_fieldAlias`] = fieldAlias;
6070
+ newMeta[index].expressions[_ind][`${type}_fieldUuid`] = fieldUuid;
6071
+ newMeta[index].expressions[_ind][`${type}_quotes`] = quotes;
6072
+ } else {
6073
+ newMeta[index].expressions[_ind][`${type}_fieldAlias`] = name;
6074
+ newMeta[index].expressions[_ind][`${type}_fieldUuid`] = id;
6075
+ newMeta[index].expressions[_ind][`${type}_quotes`] = name;
6076
+ }
6077
+ // (newMeta[index] as MetaJoin).expressions[_ind][type] = name;
6078
+ // (newMeta[index] as MetaJoin).expressions[_ind][`${type}_id`] = id;
5825
6079
  store.setMeta(newMeta, groupIndex);
5826
6080
  store.setPopup({
5827
6081
  visible: false
@@ -5903,10 +6157,11 @@ const JoinData = props => {
5903
6157
  let oldList = cloneDeep(newMeta[index].subquery);
5904
6158
  let _toolbar = subToolbar || toolbar;
5905
6159
  _toolbar = _toolbar.filter(v => v !== 'group'); // 子查询不需要分组
6160
+ let zIndex = store.popupContainer.current ? getMaxZIndexInParents(store.popupContainer.current) : 0;
5906
6161
  let o = Modal2.openModal({
5907
6162
  title: __('SqlQueryBuilder.subquery'),
5908
6163
  transparentMask: true,
5909
- zIndex: 200,
6164
+ zIndex: Number(zIndex),
5910
6165
  content: jsx(Fragment, {
5911
6166
  children: jsx(SqlVisionBuilder, {
5912
6167
  ...other,
@@ -5924,8 +6179,8 @@ const JoinData = props => {
5924
6179
  newMeta[index].subquery = newList;
5925
6180
  newMeta[index].table2 = {
5926
6181
  ...newList[0].table,
5927
- column: '',
5928
- column_id: ''
6182
+ fieldAlias: '',
6183
+ fieldUuid: ''
5929
6184
  };
5930
6185
  const items = getSubColumns(newList);
5931
6186
  const newColumns = items.flatMap(item => item.columns);
@@ -5950,8 +6205,9 @@ const JoinData = props => {
5950
6205
  let newMeta = store.metaList[groupIndex].list.slice();
5951
6206
  newMeta[index].isSubquery = !newMeta[index].isSubquery;
5952
6207
  newMeta[index].table2 = {
5953
- column: '',
5954
- column_id: '',
6208
+ quotes: '',
6209
+ fieldAlias: '',
6210
+ fieldUuid: '',
5955
6211
  name: '',
5956
6212
  // 表名
5957
6213
  tableUuid: '',
@@ -6084,23 +6340,23 @@ const JoinData = props => {
6084
6340
  children: "on"
6085
6341
  }), jsx("div", {
6086
6342
  className: cx(`Sqb-TableName`, {
6087
- notSelected: !meta.table1.column
6343
+ notSelected: !meta.table1.quotes
6088
6344
  }),
6089
6345
  "v-data": FlagLocation.TABLE_1,
6090
6346
  onClick: selectJoinColumn,
6091
- children: meta.table1.column ? meta.table1.column : __('SqlQueryBuilder.pickTable')
6347
+ children: meta.table1.quotes ? meta.table1.quotes : __('SqlQueryBuilder.pickTable')
6092
6348
  }), jsx("span", {
6093
6349
  className: 'mr-2 text-gray-500',
6094
6350
  children: "="
6095
6351
  }), jsx("div", {
6096
6352
  className: cx(`Sqb-TableName`, {
6097
- notSelected: !meta.table2.column
6353
+ notSelected: !meta.table2.quotes
6098
6354
  }),
6099
6355
  "v-data": FlagLocation.TABLE_2,
6100
6356
  onClick: selectJoinColumn,
6101
- children: meta.table2.column ? meta.table2.column : __('SqlQueryBuilder.pickTable')
6357
+ children: meta.table2.quotes ? meta.table2.quotes : __('SqlQueryBuilder.pickTable')
6102
6358
  })]
6103
- }), meta.table1.column_id && meta.table2.column_id && meta.expressions?.map((v, i) => {
6359
+ }), meta.table1.fieldUuid && meta.table2.fieldUuid && meta.expressions?.map((v, i) => {
6104
6360
  return jsxs("div", {
6105
6361
  className: cx(`Sqb-where block`),
6106
6362
  children: [jsx("span", {
@@ -6129,12 +6385,12 @@ const JoinData = props => {
6129
6385
  children: v.left_constant ? v.left_constant : __('SqlQueryBuilder.pickConstant')
6130
6386
  }), (!v.left_type || v.left_type === 'field') && jsx("div", {
6131
6387
  className: cx(`Sqb-TableName`, {
6132
- notSelected: !v.left_column
6388
+ notSelected: !v.left_quotes
6133
6389
  }),
6134
6390
  "v-data": ExpressionsEnum.LEFT,
6135
6391
  "v-index": i,
6136
6392
  onClick: selectMoreJoinColumn,
6137
- children: v.left_column ? v.left_column : __('SqlQueryBuilder.pickTable')
6393
+ children: v.left_quotes ? v.left_quotes : __('SqlQueryBuilder.pickTable')
6138
6394
  }), jsx(Tooltip, {
6139
6395
  title: __('SqlQueryBuilder.switch'),
6140
6396
  children: jsx(Button, {
@@ -6173,12 +6429,12 @@ const JoinData = props => {
6173
6429
  children: v.right_constant ? v.right_constant : __('SqlQueryBuilder.pickConstant')
6174
6430
  }), (!v.right_type || v.right_type === 'field') && jsx("div", {
6175
6431
  className: cx(`Sqb-TableName`, {
6176
- notSelected: !v.right_column
6432
+ notSelected: !v.right_quotes
6177
6433
  }),
6178
6434
  "v-data": ExpressionsEnum.RIGHT,
6179
6435
  "v-index": i,
6180
6436
  onClick: selectMoreJoinColumn,
6181
- children: v.right_column ? v.right_column : __('SqlQueryBuilder.pickTable')
6437
+ children: v.right_quotes ? v.right_quotes : __('SqlQueryBuilder.pickTable')
6182
6438
  }), jsx(Tooltip, {
6183
6439
  title: __('SqlQueryBuilder.switch'),
6184
6440
  children: jsx(Button, {
@@ -6204,14 +6460,15 @@ const JoinData = props => {
6204
6460
  let newMeta = store.metaList[groupIndex].list.slice();
6205
6461
  newMeta[index].expressions.splice(i + 1, 0, {
6206
6462
  operator: 'and',
6207
- left_column: '',
6208
- left_column_id: '',
6463
+ left_fieldAlias: '',
6464
+ left_fieldUuid: '',
6465
+ left_quotes: '',
6209
6466
  left_string: '',
6210
- left_isString: false,
6211
6467
  left_type: 'field',
6212
6468
  left_constant: '',
6213
- right_column: '',
6214
- right_column_id: '',
6469
+ right_fieldAlias: '',
6470
+ right_fieldUuid: '',
6471
+ right_quotes: '',
6215
6472
  right_string: '',
6216
6473
  right_isString: false,
6217
6474
  right_type: 'field',
@@ -6236,7 +6493,7 @@ const JoinData = props => {
6236
6493
  })
6237
6494
  })]
6238
6495
  }, i);
6239
- }), meta.table1.column_id && meta.table2.column_id && (meta.expressions?.length || 0) < 1 && jsx(Tooltip, {
6496
+ }), meta.table1.fieldUuid && meta.table2.fieldUuid && (meta.expressions?.length || 0) < 1 && jsx(Tooltip, {
6240
6497
  title: __('SqlQueryBuilder.add'),
6241
6498
  children: jsx(Button, {
6242
6499
  disabled: meta.readonly,
@@ -6249,14 +6506,15 @@ const JoinData = props => {
6249
6506
  let newMeta = store.metaList[groupIndex].list.slice();
6250
6507
  newMeta[index].expressions = [{
6251
6508
  operator: 'and',
6252
- left_column: '',
6253
- left_column_id: '',
6509
+ left_fieldAlias: '',
6510
+ left_fieldUuid: '',
6511
+ left_quotes: '',
6254
6512
  left_string: '',
6255
- left_isString: false,
6256
6513
  left_type: 'field',
6257
6514
  left_constant: '',
6258
- right_column: '',
6259
- right_column_id: '',
6515
+ right_fieldAlias: '',
6516
+ right_fieldUuid: '',
6517
+ right_quotes: '',
6260
6518
  right_string: '',
6261
6519
  right_isString: false,
6262
6520
  right_constant: '',
@@ -6407,12 +6665,12 @@ const CaseEditor = props => {
6407
6665
  onOk,
6408
6666
  onCancel
6409
6667
  } = props;
6410
- const [popup, setPopup] = useState({
6411
- visible: false
6412
- }); // 弹框信息
6668
+ // const [popup, setPopup] = useState<PopupType>({ visible: false }); // 弹框信息
6413
6669
  const [caseList, setCaseList] = useState(value.formulaList || []);
6414
6670
  const [name, setName] = useState(value?.name || ''); // 表达式名字
6415
6671
  const [ind, setInd] = useState(-1);
6672
+ const ref = useRef(null);
6673
+ const store = useStore$1();
6416
6674
  const filterCase = useMemo(() => {
6417
6675
  const hasCase = caseList.some(item => item.type === OptionsTypeEnum.OTHER && item.operator === 'case');
6418
6676
  if (hasCase) {
@@ -6424,24 +6682,22 @@ const CaseEditor = props => {
6424
6682
  const usable = useMemo(() => {
6425
6683
  return Array.from(caseList).length > 0 && name;
6426
6684
  }, [caseList, name]);
6427
- const popupContent = useMemo(() => {
6428
- let {
6429
- visible,
6430
- content
6431
- } = popup;
6432
- if (!visible) return null;
6433
- return content;
6434
- }, [popup]);
6685
+ // const popupContent = useMemo(() => {
6686
+ // let { visible, content } = popup;
6687
+ // if (!visible) return null;
6688
+ // return content;
6689
+ // }, [popup]);
6435
6690
  function closePopup() {
6436
- setPopup({
6691
+ store.setPopup({
6437
6692
  visible: false
6438
6693
  });
6439
6694
  }
6440
6695
  // 字段
6441
6696
  function handleField(e, i, val) {
6442
- setPopup({
6697
+ store.setPopup({
6443
6698
  visible: true,
6444
6699
  node: e.currentTarget,
6700
+ container: ref.current,
6445
6701
  content: jsx(SelectJoinColumn, {
6446
6702
  data: data,
6447
6703
  value: val,
@@ -6449,8 +6705,13 @@ const CaseEditor = props => {
6449
6705
  isGroup: true,
6450
6706
  // @ts-ignore
6451
6707
  onGroup: data => {
6708
+ let _data = cloneDeep(data);
6709
+ if (_data.alias != SummarizeAlias$1) {
6710
+ _data.fieldAlias = _data.name;
6711
+ _data.fieldUuid = uuidv4('field');
6712
+ }
6452
6713
  const _caseList = caseList.slice();
6453
- _caseList[i].expression = data;
6714
+ _caseList[i].expression = _data;
6454
6715
  setCaseList(_caseList);
6455
6716
  closePopup();
6456
6717
  }
@@ -6466,16 +6727,23 @@ const CaseEditor = props => {
6466
6727
  };
6467
6728
  // 表达式
6468
6729
  function handleExpression(e, i, val) {
6469
- setPopup({
6730
+ store.setPopup({
6470
6731
  visible: true,
6471
6732
  node: e.currentTarget,
6733
+ container: ref.current,
6472
6734
  content: jsx(SelectFilter, {
6473
6735
  isCustom: true,
6736
+ container: ref.current,
6474
6737
  data: data,
6475
6738
  value: val,
6476
6739
  onChange: data => {
6740
+ let _data = cloneDeep(data);
6741
+ if (_data.alias != SummarizeAlias$1) {
6742
+ _data.fieldAlias = _data.name;
6743
+ _data.fieldUuid = uuidv4('field');
6744
+ }
6477
6745
  const _caseList = caseList.slice();
6478
- _caseList[i].expression = data;
6746
+ _caseList[i].expression = _data;
6479
6747
  setCaseList(_caseList);
6480
6748
  closePopup();
6481
6749
  }
@@ -6518,8 +6786,7 @@ const CaseEditor = props => {
6518
6786
  const _onOk = () => {
6519
6787
  typeof onOk === 'function' && onOk?.({
6520
6788
  name,
6521
- formulaList: caseList,
6522
- formula: ''
6789
+ formulaList: caseList
6523
6790
  });
6524
6791
  };
6525
6792
  // 分段
@@ -6667,6 +6934,7 @@ const CaseEditor = props => {
6667
6934
  };
6668
6935
  return jsxs("div", {
6669
6936
  className: 'custom-box',
6937
+ ref: ref,
6670
6938
  children: [jsx(VisualBox$1, {
6671
6939
  children: jsx("div", {
6672
6940
  className: `Sqb-item Sqb-case-editor mb-2 mt-2`,
@@ -6804,13 +7072,6 @@ const CaseEditor = props => {
6804
7072
  })]
6805
7073
  })
6806
7074
  })
6807
- }), jsx(Popup, {
6808
- visible: popup.visible,
6809
- closable: true,
6810
- node: popup.node,
6811
- innerSpacing: popup.innerSpacing,
6812
- hideVisible: closePopup,
6813
- children: popupContent
6814
7075
  }), jsx("div", {
6815
7076
  className: `btns p-4`,
6816
7077
  children: jsxs("div", {
@@ -6942,14 +7203,15 @@ const CustomColumn = props => {
6942
7203
  }
6943
7204
  return data;
6944
7205
  }
6945
- // 子查询弹窗
7206
+ // 自定义弹窗
6946
7207
  const showSubQuery = (e, i) => {
6947
7208
  let newMeta = store.metaList[groupIndex].list.slice();
6948
7209
  const _value = newMeta[index].customColumn[i] || [];
7210
+ let zIndex = store.popupContainer.current ? getMaxZIndexInParents(store.popupContainer.current) : 0;
6949
7211
  let o = Modal2.openModal({
6950
7212
  title: __('SqlQueryBuilder.customExpression'),
6951
7213
  transparentMask: true,
6952
- zIndex: 200,
7214
+ zIndex: Number(zIndex),
6953
7215
  content: jsx(Fragment, {
6954
7216
  children: jsx(Provider, {
6955
7217
  value: store,
@@ -7209,7 +7471,7 @@ const Filter = props => {
7209
7471
  let newMeta = store.metaList[groupIndex].list.slice();
7210
7472
  let val = filter[i];
7211
7473
  if (val.type === Filter_TypeEnum.NOT_EXISTS) {
7212
- showSubQuery(i, '');
7474
+ showNotExists(i, '');
7213
7475
  return;
7214
7476
  }
7215
7477
  let data = getColumns();
@@ -7308,10 +7570,10 @@ const Filter = props => {
7308
7570
  newMeta[index].filter = [..._filter];
7309
7571
  setInd(-1);
7310
7572
  };
7311
- // 子查询弹窗
7312
- const showSubQuery = (i, position) => {
7573
+ // NotExists 窗口
7574
+ const showNotExists = (i, position) => {
7313
7575
  const {
7314
- subToolbar,
7576
+ notExistsToolbar,
7315
7577
  toolbar,
7316
7578
  ...other
7317
7579
  } = store.preProps;
@@ -7319,12 +7581,13 @@ const Filter = props => {
7319
7581
  let index = findIndex(store.metaList[groupIndex].list, meta);
7320
7582
  let _value = position ? [] : newMeta[index].filter[i]?.subquery || [];
7321
7583
  let oldList = position ? [] : cloneDeep(newMeta[index].filter[i]?.subquery || []);
7322
- let _toolbar = subToolbar || toolbar;
7584
+ let _toolbar = notExistsToolbar || toolbar;
7323
7585
  _toolbar = _toolbar.filter(v => v !== 'group'); // 子查询不需要分组
7586
+ let zIndex = store.popupContainer.current ? getMaxZIndexInParents(store.popupContainer.current) : null;
7324
7587
  let o = Modal2.openModal({
7325
7588
  title: 'NOT EXISTS',
7326
7589
  transparentMask: true,
7327
- zIndex: 200,
7590
+ zIndex: Number(zIndex),
7328
7591
  content: jsx(Fragment, {
7329
7592
  children: jsx(SqlVisionBuilder, {
7330
7593
  ...other,
@@ -7417,7 +7680,7 @@ const Filter = props => {
7417
7680
  if (type === Filter_TypeEnum.EXPRESSION) {
7418
7681
  handleAdd(_e);
7419
7682
  } else if (type === Filter_TypeEnum.NOT_EXISTS) {
7420
- showSubQuery(_index, _type);
7683
+ showNotExists(_index, _type);
7421
7684
  }
7422
7685
  }
7423
7686
  })
@@ -7484,7 +7747,7 @@ const Filter = props => {
7484
7747
  }, i) : jsxs("div", {
7485
7748
  className: `Sqb-TableName purple-name`,
7486
7749
  onClick: e => handleUpdate(e, i),
7487
- children: [v.quotes, jsx("span", {
7750
+ children: [v.type === Filter_TypeEnum.NOT_EXISTS ? 'not exitis ( * )' : v.quotes, jsx("span", {
7488
7751
  style: {
7489
7752
  fontSize: 0
7490
7753
  },
@@ -7660,7 +7923,7 @@ const GroupBy = props => {
7660
7923
  newMeta[index].by.splice(i, 1, data);
7661
7924
  // @ts-ignore
7662
7925
  newMeta[index].by = newMeta[index].by.map(v => {
7663
- const fieldAlias = v.fieldAlias || `${v.alias}__${v.name}`;
7926
+ const fieldAlias = `${v.alias}__${v.name}`;
7664
7927
  return {
7665
7928
  ...v,
7666
7929
  sql: `${v.alias}.${v.realName || v.name} AS ${fieldAlias}`,
@@ -7694,8 +7957,8 @@ const GroupBy = props => {
7694
7957
  quotes: '',
7695
7958
  datasourceId: '',
7696
7959
  datasourceName: '',
7697
- column: '',
7698
- column_id: '',
7960
+ // column: '',
7961
+ // column_id: '',
7699
7962
  summarizeType: MetaSummarize_Enum.BY
7700
7963
  };
7701
7964
  store.setPopup({
@@ -7712,7 +7975,7 @@ const GroupBy = props => {
7712
7975
  newMeta[index].by.push(data);
7713
7976
  // @ts-ignore
7714
7977
  newMeta[index].by = newMeta[index].by.map(v => {
7715
- const fieldAlias = v.fieldAlias || `${v.alias}__${v.name}`;
7978
+ const fieldAlias = `${v.alias}__${v.name}`;
7716
7979
  return {
7717
7980
  ...v,
7718
7981
  sql: `${v.alias}.${v.realName || v.name} AS ${fieldAlias}`,
@@ -7956,8 +8219,8 @@ const SelectIndex = props => {
7956
8219
  quotes: '',
7957
8220
  datasourceId: '',
7958
8221
  datasourceName: '',
7959
- column: '',
7960
- column_id: '',
8222
+ // column: '',
8223
+ // column_id: '',
7961
8224
  summarizeType: MetaSummarize_Enum.GROUP
7962
8225
  };
7963
8226
  store.setPopup({
@@ -8527,7 +8790,8 @@ const Metabase = props => {
8527
8790
  } = props;
8528
8791
  const store = useStore$1();
8529
8792
  const [saveLoading, setSaveLoading] = useState(false);
8530
- const popupContainer = useRef();
8793
+ // const popupContainer = useRef();
8794
+ // store.setPopupContainer(popupContainer);
8531
8795
  const popupContent = useMemo(() => {
8532
8796
  let {
8533
8797
  visible,
@@ -8546,40 +8810,35 @@ const Metabase = props => {
8546
8810
  }, [store.popupData2]);
8547
8811
  const onSave = async () => {
8548
8812
  let intercept = false; // 是否返回
8813
+ const _metaList = splitByUnion(store.metaList);
8549
8814
  store.metaList.map(v => {
8550
- if (v.type !== 'group' && !(v.list?.[0]).table.name) {
8815
+ if (v.type !== 'union' && !(v.list?.[0]).table.name) {
8551
8816
  intercept = true;
8552
8817
  return Toast.warning(__('data.pleaseSelectDataTable'));
8553
8818
  }
8554
8819
  });
8555
8820
  if (saveLoading || intercept) return null;
8556
8821
  setSaveLoading(true);
8557
- if (store.toolbar.includes('group')) {
8558
- // 分组
8559
- await onOk?.(store.metaList);
8560
- } else {
8561
- // 非分组
8562
- await onOk?.(store.metaList[0].list);
8563
- }
8822
+ await onOk?.(_metaList);
8564
8823
  setSaveLoading(false);
8565
8824
  };
8566
- let zIndex = popupContainer.current ? getMaxZIndexInParents(popupContainer.current) : null;
8825
+ let zIndex = store.popupContainer.current ? getMaxZIndexInParents(store.popupContainer.current) : null;
8567
8826
  return (
8568
8827
  // @ts-ignore
8569
8828
  jsx(VisualBox, {
8570
- ref: popupContainer,
8829
+ ref: store.popupContainer,
8571
8830
  children: jsxs("div", {
8572
8831
  className: 'Sqb',
8573
8832
  children: [store.metaList.map((v, index) => {
8574
- if (v.type === 'group' && v.operator) {
8833
+ if (v.type === 'union' && v.union) {
8575
8834
  return jsx("div", {
8576
8835
  className: cx(`Sqb-list`),
8577
8836
  children: jsx(RowLimit$1, {
8578
- operator: v.operator,
8837
+ union: v.union,
8579
8838
  meta: v,
8580
8839
  groupIndex: index
8581
8840
  })
8582
- }, 'group' + index);
8841
+ }, 'union' + index);
8583
8842
  }
8584
8843
  return jsx("div", {
8585
8844
  className: cx(`Sqb-list`),
@@ -8604,8 +8863,8 @@ const Metabase = props => {
8604
8863
  disabled: saveLoading,
8605
8864
  onClick: onSave,
8606
8865
  children: btnText || __('SqlQueryBuilder.visualize')
8607
- }) : null, popupContainer.current && jsx(Popup, {
8608
- container: popupContainer.current,
8866
+ }) : null, store.popupContainer.current && jsx(Popup, {
8867
+ container: store.popupData.container || store.popupContainer.current,
8609
8868
  visible: store.popupData.visible,
8610
8869
  node: store.popupData.node,
8611
8870
  closable: store.popupClosable,
@@ -8616,8 +8875,8 @@ const Metabase = props => {
8616
8875
  });
8617
8876
  },
8618
8877
  children: popupContent
8619
- }), popupContainer.current && jsx(Popup, {
8620
- container: popupContainer.current,
8878
+ }), store.popupContainer.current && jsx(Popup, {
8879
+ container: store.popupData2.container || store.popupContainer.current,
8621
8880
  visible: store.popupData2.visible,
8622
8881
  node: store.popupData2.node,
8623
8882
  closable: store.popupClosable2,
@@ -8666,15 +8925,9 @@ const SqlVisionBuilder = /*#__PURE__*/React__default.forwardRef((props, ref) =>
8666
8925
  store.setProps(props);
8667
8926
  }, [props]);
8668
8927
  useEffect(() => {
8669
- if (toolbar.includes('group')) {
8670
- store.setPreData(value);
8671
- } else {
8672
- store.setPreData([{
8673
- name: 'default',
8674
- list: value
8675
- }]);
8676
- }
8677
- }, [value, toolbar]);
8928
+ const _value = reassembleByUnion(value);
8929
+ store.setPreData(_value);
8930
+ }, [value]);
8678
8931
  useEffect(() => {
8679
8932
  store.setSourceList(sourceList);
8680
8933
  }, [sourceList]);