@gingkoo/pandora-metabase 1.0.0-alpha.1 → 1.0.0-alpha.10
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/README.md +20 -11
- package/lib/es/components/dialog/select-filter/index.d.ts +1 -0
- package/lib/es/components/dialog/select-join-column/index.d.ts +1 -0
- package/lib/es/components/modules/{group.d.ts → union.d.ts} +1 -1
- package/lib/es/components/popup.d.ts +8 -2
- package/lib/es/index.js +447 -201
- package/lib/es/index.js.map +1 -1
- package/lib/es/store/enum.d.ts +1 -1
- package/lib/es/store/types.d.ts +12 -16
- package/lib/es/types.d.ts +4 -2
- package/lib/es/utils/helper-dom.d.ts +4 -3
- package/lib/es/utils.d.ts +2 -0
- package/package.json +1 -1
package/lib/es/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @gingkoo/pandora-metabase v1.0.0-alpha.
|
|
2
|
+
* @gingkoo/pandora-metabase v1.0.0-alpha.10
|
|
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["
|
|
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 =
|
|
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
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
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.
|
|
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.
|
|
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
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
}
|
|
791
|
-
|
|
792
|
-
|
|
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: '
|
|
897
|
-
name: '
|
|
898
|
-
|
|
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
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
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
|
|
@@ -1011,9 +1147,9 @@ const useStore = () => {
|
|
|
1011
1147
|
if (data.length) {
|
|
1012
1148
|
let _metaList = data.map((item, groupIndex) => {
|
|
1013
1149
|
let newList = item.list?.map((v, i) => {
|
|
1150
|
+
let newMeta = cloneDeep(item.list);
|
|
1014
1151
|
// 设置右侧column
|
|
1015
1152
|
if (v.table2?.datasourceId && v.columns.length < 1) {
|
|
1016
|
-
let newMeta = v.slice();
|
|
1017
1153
|
fetchColumns(newMeta[i].table2, newMeta[i].table2.datasourceId, columns => {
|
|
1018
1154
|
if (v.isSubquery) {
|
|
1019
1155
|
let newColumns = [];
|
|
@@ -1031,7 +1167,6 @@ const useStore = () => {
|
|
|
1031
1167
|
}
|
|
1032
1168
|
// 设置column
|
|
1033
1169
|
if (v.table?.datasourceId && v.columns.length < 1) {
|
|
1034
|
-
let newMeta = v.slice();
|
|
1035
1170
|
fetchColumns(newMeta[i].table, newMeta[i].table.datasourceId, columns => {
|
|
1036
1171
|
if (v.isSubquery) {
|
|
1037
1172
|
let newColumns = [];
|
|
@@ -1054,7 +1189,8 @@ const useStore = () => {
|
|
|
1054
1189
|
return {
|
|
1055
1190
|
name: item.name || 'default',
|
|
1056
1191
|
list: newList.length < 1 ? defaultMetaList : newList,
|
|
1057
|
-
type: item.type || 'group'
|
|
1192
|
+
type: item.type || 'group',
|
|
1193
|
+
union: item.union
|
|
1058
1194
|
};
|
|
1059
1195
|
});
|
|
1060
1196
|
const validMetaKeys = _metaList.flatMap(group => group.list).map(v => Number(v.metaKey)).filter(num => !isNaN(num));
|
|
@@ -1077,8 +1213,8 @@ const useStore = () => {
|
|
|
1077
1213
|
tableUuid: '',
|
|
1078
1214
|
datasourceId: '',
|
|
1079
1215
|
datasourceName: '',
|
|
1080
|
-
|
|
1081
|
-
|
|
1216
|
+
fieldAlias: '',
|
|
1217
|
+
fieldUuid: ''
|
|
1082
1218
|
};
|
|
1083
1219
|
if (index === 1) {
|
|
1084
1220
|
table1 = {
|
|
@@ -1087,8 +1223,8 @@ const useStore = () => {
|
|
|
1087
1223
|
alias: mainTable.table.alias,
|
|
1088
1224
|
datasourceId: mainTable.table.datasourceId,
|
|
1089
1225
|
datasourceName: mainTable.table.datasourceName,
|
|
1090
|
-
|
|
1091
|
-
|
|
1226
|
+
fieldAlias: '',
|
|
1227
|
+
fieldUuid: ''
|
|
1092
1228
|
};
|
|
1093
1229
|
}
|
|
1094
1230
|
item = {
|
|
@@ -1103,8 +1239,8 @@ const useStore = () => {
|
|
|
1103
1239
|
tableUuid: '',
|
|
1104
1240
|
datasourceId: '',
|
|
1105
1241
|
datasourceName: '',
|
|
1106
|
-
|
|
1107
|
-
|
|
1242
|
+
fieldAlias: '',
|
|
1243
|
+
fieldUuid: ''
|
|
1108
1244
|
},
|
|
1109
1245
|
columns: [],
|
|
1110
1246
|
expressions: []
|
|
@@ -1162,7 +1298,7 @@ const useStore = () => {
|
|
|
1162
1298
|
}
|
|
1163
1299
|
};
|
|
1164
1300
|
}
|
|
1165
|
-
if (type === TypeEnum.
|
|
1301
|
+
if (type === TypeEnum.union) {
|
|
1166
1302
|
// 添加分组
|
|
1167
1303
|
let newMetaList = metaList.slice();
|
|
1168
1304
|
newMetaList.splice(groupIndex + 1, 0, defaultOperator, ...defaultMeta);
|
|
@@ -1331,7 +1467,8 @@ const useStore = () => {
|
|
|
1331
1467
|
_setShowSubquery,
|
|
1332
1468
|
constantList,
|
|
1333
1469
|
setConstantList,
|
|
1334
|
-
changeAlias
|
|
1470
|
+
changeAlias,
|
|
1471
|
+
popupContainer
|
|
1335
1472
|
};
|
|
1336
1473
|
};
|
|
1337
1474
|
|
|
@@ -1733,6 +1870,7 @@ const getComputedTranslate = obj => {
|
|
|
1733
1870
|
};
|
|
1734
1871
|
// 获取元素距离浏览器顶部的距离
|
|
1735
1872
|
const getElementTop = elem => {
|
|
1873
|
+
if (!elem) return 0;
|
|
1736
1874
|
let elemTop = elem.offsetTop;
|
|
1737
1875
|
let pElem = elem.offsetParent;
|
|
1738
1876
|
while (pElem != null) {
|
|
@@ -1746,6 +1884,7 @@ const getElementTop = elem => {
|
|
|
1746
1884
|
};
|
|
1747
1885
|
// 获取元素距离浏览器顶部的距离
|
|
1748
1886
|
const getElementLeft = elem => {
|
|
1887
|
+
if (!elem) return 0;
|
|
1749
1888
|
let elemLeft = elem.offsetLeft;
|
|
1750
1889
|
let pElem = elem.offsetParent;
|
|
1751
1890
|
while (pElem != null) {
|
|
@@ -1757,8 +1896,23 @@ const getElementLeft = elem => {
|
|
|
1757
1896
|
}
|
|
1758
1897
|
return elemLeft;
|
|
1759
1898
|
};
|
|
1760
|
-
|
|
1761
|
-
|
|
1899
|
+
// 获取元素可见范围内高度
|
|
1900
|
+
const getContainerVisibleHeight = container => {
|
|
1901
|
+
if (!container) return 0;
|
|
1902
|
+
const rect = container.getBoundingClientRect();
|
|
1903
|
+
const windowHeight = window.innerHeight || document.documentElement.clientHeight;
|
|
1904
|
+
// 元素顶部在视口上方 -> 不可见
|
|
1905
|
+
if (rect.bottom < 0) return 0;
|
|
1906
|
+
// 元素底部在视口下方 -> 不可见
|
|
1907
|
+
if (rect.top > windowHeight) return 0;
|
|
1908
|
+
// 可见区域的 top 和 bottom
|
|
1909
|
+
const visibleTop = Math.max(rect.top, 0);
|
|
1910
|
+
const visibleBottom = Math.min(rect.bottom, windowHeight);
|
|
1911
|
+
// 可见高度
|
|
1912
|
+
return visibleBottom - visibleTop;
|
|
1913
|
+
};
|
|
1914
|
+
const getScrollTop = elem => {
|
|
1915
|
+
return elem?.scrollTop || document.documentElement.scrollTop;
|
|
1762
1916
|
};
|
|
1763
1917
|
// 浏览器可视宽高
|
|
1764
1918
|
const getWindowSize = () => {
|
|
@@ -2237,7 +2391,7 @@ const List = [{
|
|
|
2237
2391
|
const RowLimit$1 = props => {
|
|
2238
2392
|
const {
|
|
2239
2393
|
meta,
|
|
2240
|
-
|
|
2394
|
+
union,
|
|
2241
2395
|
groupIndex
|
|
2242
2396
|
} = props;
|
|
2243
2397
|
const store = useStore$1();
|
|
@@ -2247,10 +2401,10 @@ const RowLimit$1 = props => {
|
|
|
2247
2401
|
node: e.currentTarget,
|
|
2248
2402
|
content: jsx(SelectList, {
|
|
2249
2403
|
list: List,
|
|
2250
|
-
value:
|
|
2404
|
+
value: union,
|
|
2251
2405
|
onChange: type => {
|
|
2252
2406
|
let newMeta = store.metaList.slice();
|
|
2253
|
-
newMeta[groupIndex].
|
|
2407
|
+
newMeta[groupIndex].union = type;
|
|
2254
2408
|
store._setMeta(newMeta);
|
|
2255
2409
|
store.setPopup({
|
|
2256
2410
|
visible: false
|
|
@@ -2273,7 +2427,7 @@ const RowLimit$1 = props => {
|
|
|
2273
2427
|
children: jsx("div", {
|
|
2274
2428
|
className: `Sqb-TableName`,
|
|
2275
2429
|
onClick: e => selectOperator(e),
|
|
2276
|
-
children:
|
|
2430
|
+
children: union
|
|
2277
2431
|
})
|
|
2278
2432
|
})
|
|
2279
2433
|
})]
|
|
@@ -3329,6 +3483,7 @@ function returnDocument(element) {
|
|
|
3329
3483
|
const outSpacing = 10;
|
|
3330
3484
|
function generateTrigger(PortalComponent) {
|
|
3331
3485
|
class Trigger extends React.Component {
|
|
3486
|
+
resizeObserver = null; // 显式声明 resizeObserver 属性
|
|
3332
3487
|
resetId = -1; // 监听窗口改变事件id 用于组件销毁的时候清除事件
|
|
3333
3488
|
static defaultProps = {
|
|
3334
3489
|
visible: false,
|
|
@@ -3343,11 +3498,39 @@ function generateTrigger(PortalComponent) {
|
|
|
3343
3498
|
this.resetId = winResetEvent.addEvent(this.didUpdate, this, 300);
|
|
3344
3499
|
this.props.container && this.props.container.addEventListener('scroll', this.didUpdate);
|
|
3345
3500
|
this.bindEvent();
|
|
3501
|
+
// 延迟绑定 ResizeObserver 到 ensure the element is ready
|
|
3502
|
+
this.initResizeObserver();
|
|
3503
|
+
}
|
|
3504
|
+
componentDidUpdate(prevProps) {
|
|
3505
|
+
// 如果 children 发生变化,重新初始化观察器
|
|
3506
|
+
if (prevProps.children !== this.props.children) {
|
|
3507
|
+
this.initResizeObserver();
|
|
3508
|
+
}
|
|
3346
3509
|
}
|
|
3347
3510
|
componentWillUnmount() {
|
|
3348
3511
|
winResetEvent.removeEvent(this.resetId);
|
|
3349
3512
|
this.props.container && this.props.container.removeEventListener('scroll', this.didUpdate);
|
|
3513
|
+
if (this.resizeObserver) {
|
|
3514
|
+
this.resizeObserver.disconnect();
|
|
3515
|
+
this.resizeObserver = null;
|
|
3516
|
+
}
|
|
3350
3517
|
}
|
|
3518
|
+
// children高度变化后,从新计算高度
|
|
3519
|
+
initResizeObserver = () => {
|
|
3520
|
+
const targetNode = this.ref.current;
|
|
3521
|
+
if (!targetNode) return;
|
|
3522
|
+
// 如果已经存在 ResizeObserver,先断开连接
|
|
3523
|
+
if (this.resizeObserver) {
|
|
3524
|
+
this.resizeObserver.disconnect();
|
|
3525
|
+
}
|
|
3526
|
+
// 初始化 ResizeObserver 并开始观察目标节点
|
|
3527
|
+
this.resizeObserver = new ResizeObserver(entries => {
|
|
3528
|
+
entries.forEach(entry => {
|
|
3529
|
+
this.didUpdate();
|
|
3530
|
+
});
|
|
3531
|
+
});
|
|
3532
|
+
this.resizeObserver.observe(targetNode);
|
|
3533
|
+
};
|
|
3351
3534
|
bindEvent = () => {
|
|
3352
3535
|
let that = this;
|
|
3353
3536
|
returnDocument().body.addEventListener('click', function (e) {
|
|
@@ -3365,7 +3548,7 @@ function generateTrigger(PortalComponent) {
|
|
|
3365
3548
|
this.props.visible && this.props.closable && this.props.hideVisible();
|
|
3366
3549
|
};
|
|
3367
3550
|
attachParent = popupContainer => {
|
|
3368
|
-
let mountNode = returnDocument().body;
|
|
3551
|
+
let mountNode = this.props.container || returnDocument().body;
|
|
3369
3552
|
mountNode.appendChild(popupContainer);
|
|
3370
3553
|
};
|
|
3371
3554
|
getCurrentNodePos = () => {
|
|
@@ -3374,8 +3557,9 @@ function generateTrigger(PortalComponent) {
|
|
|
3374
3557
|
container
|
|
3375
3558
|
} = this.props;
|
|
3376
3559
|
return {
|
|
3377
|
-
x: getElementLeft(node),
|
|
3378
|
-
y: getElementTop(node) - (container
|
|
3560
|
+
x: getElementLeft(node) - getElementLeft(container),
|
|
3561
|
+
y: getElementTop(node) - getElementTop(container),
|
|
3562
|
+
t: getElementTop(container),
|
|
3379
3563
|
h: node.offsetHeight
|
|
3380
3564
|
};
|
|
3381
3565
|
};
|
|
@@ -3418,19 +3602,21 @@ function generateTrigger(PortalComponent) {
|
|
|
3418
3602
|
didUpdate = () => {
|
|
3419
3603
|
if (!this.props.node) return false;
|
|
3420
3604
|
let {
|
|
3421
|
-
innerSpacing = 10
|
|
3605
|
+
innerSpacing = 10,
|
|
3606
|
+
container
|
|
3422
3607
|
} = this.props;
|
|
3423
3608
|
let pos = this.getCurrentNodePos();
|
|
3424
|
-
let posY = pos.y - getScrollTop();
|
|
3609
|
+
let posY = pos.y - getScrollTop(container);
|
|
3425
3610
|
if (!this.ref) return false;
|
|
3426
3611
|
let realHeight = this.ref?.current?.childNodes?.[0]?.offsetHeight || 0;
|
|
3427
3612
|
if (!realHeight) return false;
|
|
3428
3613
|
let {
|
|
3429
3614
|
height: winH
|
|
3430
3615
|
} = getWindowSize();
|
|
3431
|
-
let
|
|
3616
|
+
let containerH = getContainerVisibleHeight(container);
|
|
3617
|
+
let downH = (containerH || winH) - posY - pos.h; // 元素下面可用高度
|
|
3432
3618
|
let maxHeight = 0;
|
|
3433
|
-
let topHeight = getScrollTop();
|
|
3619
|
+
let topHeight = getScrollTop(container);
|
|
3434
3620
|
if (downH >= posY || realHeight <= downH - innerSpacing - outSpacing) {
|
|
3435
3621
|
// 下面比上面宽敞 或 下面足够放下所有 放下面
|
|
3436
3622
|
maxHeight = Math.min(realHeight, downH - innerSpacing - outSpacing);
|
|
@@ -3580,7 +3766,7 @@ const SelectColumn = ({
|
|
|
3580
3766
|
});
|
|
3581
3767
|
};
|
|
3582
3768
|
|
|
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
|
|
3769
|
+
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
3770
|
styleInject(css_248z$6);
|
|
3585
3771
|
|
|
3586
3772
|
const NUMBER_GROUP = [SQL_COLUMN_TYPE.FLOAT, SQL_COLUMN_TYPE.LONG, SQL_COLUMN_TYPE.CURRENCY];
|
|
@@ -3698,7 +3884,8 @@ const SelectJoinColumn = ({
|
|
|
3698
3884
|
})));
|
|
3699
3885
|
}
|
|
3700
3886
|
},
|
|
3701
|
-
children: jsxs("
|
|
3887
|
+
children: jsxs("div", {
|
|
3888
|
+
className: 'List-item',
|
|
3702
3889
|
children: [jsx("span", {
|
|
3703
3890
|
className: 'List-item-icon',
|
|
3704
3891
|
children: jsx(TableIcon, {})
|
|
@@ -3717,7 +3904,7 @@ const SelectJoinColumn = ({
|
|
|
3717
3904
|
})]
|
|
3718
3905
|
})
|
|
3719
3906
|
})
|
|
3720
|
-
}), open && jsxs(Fragment, {
|
|
3907
|
+
}), (open || isSummarize) && jsxs(Fragment, {
|
|
3721
3908
|
children: [!isSummarize && jsx("div", {
|
|
3722
3909
|
className: cx(`Sqb-List-section`),
|
|
3723
3910
|
children: jsxs("div", {
|
|
@@ -3790,8 +3977,8 @@ const SelectJoinColumn = ({
|
|
|
3790
3977
|
realName
|
|
3791
3978
|
});
|
|
3792
3979
|
},
|
|
3793
|
-
children: [jsxs("
|
|
3794
|
-
className: 'p-2',
|
|
3980
|
+
children: [jsxs("div", {
|
|
3981
|
+
className: 'p-2 List-item',
|
|
3795
3982
|
children: [jsx("span", {
|
|
3796
3983
|
className: 'List-item-icon',
|
|
3797
3984
|
children: IconMap[special_type || database_type] || jsx(LetterAaIcon, {})
|
|
@@ -3830,7 +4017,8 @@ const SelectFilterColumn = ({
|
|
|
3830
4017
|
value,
|
|
3831
4018
|
onChange,
|
|
3832
4019
|
didUpdate,
|
|
3833
|
-
isCustom: _isCustom = false
|
|
4020
|
+
isCustom: _isCustom = false,
|
|
4021
|
+
container: _container = null
|
|
3834
4022
|
}) => {
|
|
3835
4023
|
const [curColumn, setCurColumn] = useState(value);
|
|
3836
4024
|
const [condition, setCondition] = useState(value.condition);
|
|
@@ -4247,6 +4435,7 @@ const SelectFilterColumn = ({
|
|
|
4247
4435
|
store.setPopup2({
|
|
4248
4436
|
visible: true,
|
|
4249
4437
|
node: e.currentTarget,
|
|
4438
|
+
container: _container,
|
|
4250
4439
|
content: jsx(SelectList, {
|
|
4251
4440
|
value: valType,
|
|
4252
4441
|
list: store.constantList || [],
|
|
@@ -4269,6 +4458,7 @@ const SelectFilterColumn = ({
|
|
|
4269
4458
|
store.setPopup2({
|
|
4270
4459
|
visible: true,
|
|
4271
4460
|
node: e.currentTarget,
|
|
4461
|
+
container: _container,
|
|
4272
4462
|
content: jsx(SelectList, {
|
|
4273
4463
|
value: valType,
|
|
4274
4464
|
list: [{
|
|
@@ -4303,6 +4493,7 @@ const SelectFilterColumn = ({
|
|
|
4303
4493
|
store.setPopup2({
|
|
4304
4494
|
visible: true,
|
|
4305
4495
|
node: e.currentTarget,
|
|
4496
|
+
container: _container,
|
|
4306
4497
|
content: jsx(SelectJoinColumn, {
|
|
4307
4498
|
data: [..._data],
|
|
4308
4499
|
value: value,
|
|
@@ -5016,17 +5207,17 @@ const IconTypeMap = new Map([[TypeEnum.filter, {
|
|
|
5016
5207
|
name: __('SqlQueryBuilder.rowLimit'),
|
|
5017
5208
|
icon: jsx(RowLimitIcon, {}),
|
|
5018
5209
|
className: 'rowLimit'
|
|
5019
|
-
}], [TypeEnum.
|
|
5210
|
+
}], [TypeEnum.union, {
|
|
5020
5211
|
name: __('SqlQueryBuilder.union'),
|
|
5021
5212
|
icon: jsx(GroupIcon, {}),
|
|
5022
5213
|
className: 'union'
|
|
5023
5214
|
}]]);
|
|
5024
5215
|
// 前端展示的icon顺序 随便改不影响逻辑
|
|
5025
|
-
const DisplayOrder = [TypeEnum.filter, TypeEnum.summarize, TypeEnum.joinData, TypeEnum.permissionTable, TypeEnum.customColumn, TypeEnum.sort, TypeEnum.rowLimit, TypeEnum.
|
|
5216
|
+
const DisplayOrder = [TypeEnum.filter, TypeEnum.summarize, TypeEnum.joinData, TypeEnum.permissionTable, TypeEnum.customColumn, TypeEnum.sort, TypeEnum.rowLimit, TypeEnum.union];
|
|
5026
5217
|
// js逻辑顺序 正常顺序
|
|
5027
|
-
const OrderType = [TypeEnum.data, TypeEnum.joinData, TypeEnum.permissionTable, TypeEnum.customColumn, TypeEnum.filter, TypeEnum.summarize, TypeEnum.sort, TypeEnum.rowLimit, TypeEnum.
|
|
5218
|
+
const OrderType = [TypeEnum.data, TypeEnum.joinData, TypeEnum.permissionTable, TypeEnum.customColumn, TypeEnum.filter, TypeEnum.summarize, TypeEnum.sort, TypeEnum.rowLimit, TypeEnum.union];
|
|
5028
5219
|
// js逻辑顺序 聚合下面的顺序是这个样子
|
|
5029
|
-
const OrderNewType = [TypeEnum.sort, TypeEnum.rowLimit, TypeEnum.joinData, TypeEnum.permissionTable, TypeEnum.customColumn, TypeEnum.filter, TypeEnum.summarize, TypeEnum.
|
|
5220
|
+
const OrderNewType = [TypeEnum.sort, TypeEnum.rowLimit, TypeEnum.joinData, TypeEnum.permissionTable, TypeEnum.customColumn, TypeEnum.filter, TypeEnum.summarize, TypeEnum.union];
|
|
5030
5221
|
const metaIcon = (size, handleClick) => {
|
|
5031
5222
|
return ({
|
|
5032
5223
|
type
|
|
@@ -5131,7 +5322,7 @@ const findNextIcon = (store, props) => {
|
|
|
5131
5322
|
if (meta.table2.name) {
|
|
5132
5323
|
available = OrderType.slice(curLocation + 1);
|
|
5133
5324
|
} else {
|
|
5134
|
-
available = [TypeEnum.customColumn, TypeEnum.filter, TypeEnum.summarize, TypeEnum.
|
|
5325
|
+
available = [TypeEnum.customColumn, TypeEnum.filter, TypeEnum.summarize, TypeEnum.union];
|
|
5135
5326
|
}
|
|
5136
5327
|
} else {
|
|
5137
5328
|
if (isLast) {
|
|
@@ -5153,7 +5344,7 @@ const findNextIcon = (store, props) => {
|
|
|
5153
5344
|
if (meta.customColumn.length || ~joinIndex && prevList[joinIndex].table2.name) {
|
|
5154
5345
|
available = OrderType.slice(curLocation + 1);
|
|
5155
5346
|
} else {
|
|
5156
|
-
available = [TypeEnum.filter, TypeEnum.summarize, TypeEnum.
|
|
5347
|
+
available = [TypeEnum.filter, TypeEnum.summarize, TypeEnum.union];
|
|
5157
5348
|
}
|
|
5158
5349
|
} else {
|
|
5159
5350
|
if (isLast) {
|
|
@@ -5186,7 +5377,7 @@ const findNextIcon = (store, props) => {
|
|
|
5186
5377
|
if (isLast) {
|
|
5187
5378
|
if (!ExistAboveGroupBy) {
|
|
5188
5379
|
if (meta.group.length && !meta.by.length) ; else if (!meta.group.length && !meta.by.length) {
|
|
5189
|
-
available = [TypeEnum.sort, TypeEnum.rowLimit, TypeEnum.
|
|
5380
|
+
available = [TypeEnum.sort, TypeEnum.rowLimit, TypeEnum.union];
|
|
5190
5381
|
} else {
|
|
5191
5382
|
available = OrderNewType;
|
|
5192
5383
|
}
|
|
@@ -5389,7 +5580,7 @@ const TableData = props => {
|
|
|
5389
5580
|
}
|
|
5390
5581
|
})
|
|
5391
5582
|
}), selected ? `${meta.table.datasourceName}.${meta.table.name} ${meta.table?.alias ? `as ${meta.table?.alias}` : ''}` : __('SqlQueryBuilder.pickTable')]
|
|
5392
|
-
}), selected && store.showMainColumn && store.showFields && jsx("div", {
|
|
5583
|
+
}), selected && store.showMainColumn[groupIndex] && store.showFields && jsx("div", {
|
|
5393
5584
|
className: `Sqb-TableColumns`,
|
|
5394
5585
|
onClick: selectColumns,
|
|
5395
5586
|
children: __('SqlQueryBuilder.columns')
|
|
@@ -5404,6 +5595,33 @@ const TableData = props => {
|
|
|
5404
5595
|
};
|
|
5405
5596
|
|
|
5406
5597
|
const PrevResult$1 = 'Previous results';
|
|
5598
|
+
function setQuotes(_meta) {
|
|
5599
|
+
let newMeta = cloneDeep(_meta);
|
|
5600
|
+
newMeta.table1 = {
|
|
5601
|
+
...newMeta.table1,
|
|
5602
|
+
fieldAlias: newMeta.table1.fieldAlias || newMeta.table1.column,
|
|
5603
|
+
fieldUuid: newMeta.table1.fieldUuid || newMeta.table1.column_id,
|
|
5604
|
+
quotes: newMeta.table1.quotes || newMeta.table1.column
|
|
5605
|
+
};
|
|
5606
|
+
newMeta.table2 = {
|
|
5607
|
+
...newMeta.table2,
|
|
5608
|
+
fieldAlias: newMeta.table2.fieldAlias || newMeta.table2.column,
|
|
5609
|
+
fieldUuid: newMeta.table2.fieldUuid || newMeta.table2.column_id,
|
|
5610
|
+
quotes: newMeta.table2.quotes || newMeta.table2.column
|
|
5611
|
+
};
|
|
5612
|
+
newMeta.expressions = newMeta.expressions.map(v => {
|
|
5613
|
+
return {
|
|
5614
|
+
...v,
|
|
5615
|
+
left_fieldAlias: v.fieldAlias || v.left_column,
|
|
5616
|
+
left_fieldUuid: v.fieldUuid || v.left_column_id,
|
|
5617
|
+
left_quotes: v.left_quotes || v.left_column,
|
|
5618
|
+
right_fieldAlias: v.right_fieldAlias || v.right_column,
|
|
5619
|
+
right_fieldUuid: v.right_fieldUuid || v.right_column_id,
|
|
5620
|
+
right_quotes: v.right_quotes || v.right_column
|
|
5621
|
+
};
|
|
5622
|
+
});
|
|
5623
|
+
return newMeta;
|
|
5624
|
+
}
|
|
5407
5625
|
var FlagLocation;
|
|
5408
5626
|
(function (FlagLocation) {
|
|
5409
5627
|
FlagLocation["TABLE_1"] = "table1";
|
|
@@ -5411,8 +5629,8 @@ var FlagLocation;
|
|
|
5411
5629
|
})(FlagLocation || (FlagLocation = {}));
|
|
5412
5630
|
var ExpressionsEnum;
|
|
5413
5631
|
(function (ExpressionsEnum) {
|
|
5414
|
-
ExpressionsEnum["LEFT"] = "
|
|
5415
|
-
ExpressionsEnum["RIGHT"] = "
|
|
5632
|
+
ExpressionsEnum["LEFT"] = "left";
|
|
5633
|
+
ExpressionsEnum["RIGHT"] = "right";
|
|
5416
5634
|
})(ExpressionsEnum || (ExpressionsEnum = {}));
|
|
5417
5635
|
const JoinData = props => {
|
|
5418
5636
|
const {
|
|
@@ -5427,7 +5645,12 @@ const JoinData = props => {
|
|
|
5427
5645
|
let table1Selected = Boolean(meta.table1.name);
|
|
5428
5646
|
let table2Selected = Boolean(meta.table2.name);
|
|
5429
5647
|
let subQuerySelected = Boolean(meta.subquery?.[0]?.table?.name);
|
|
5430
|
-
let columnsSelected = meta.table1.
|
|
5648
|
+
let columnsSelected = meta.table1.quotes && meta.table2.quotes;
|
|
5649
|
+
useEffect(() => {
|
|
5650
|
+
let newMetaList = store.metaList[groupIndex].list.slice();
|
|
5651
|
+
newMetaList[index] = setQuotes(meta);
|
|
5652
|
+
store.setMeta(newMetaList, groupIndex);
|
|
5653
|
+
}, [metaKey]);
|
|
5431
5654
|
function selectColumns(e) {
|
|
5432
5655
|
let columns = meta.columns;
|
|
5433
5656
|
!meta.readonly && store.setPopup({
|
|
@@ -5496,8 +5719,9 @@ const JoinData = props => {
|
|
|
5496
5719
|
name: tableName,
|
|
5497
5720
|
tableUuid: data.tableUuid || uuidv4('table'),
|
|
5498
5721
|
alias,
|
|
5499
|
-
|
|
5500
|
-
|
|
5722
|
+
fieldAlias: '',
|
|
5723
|
+
fieldUuid: '',
|
|
5724
|
+
quotes: '',
|
|
5501
5725
|
datasourceId: data.datasourceId,
|
|
5502
5726
|
datasourceName: data.datasourceName
|
|
5503
5727
|
};
|
|
@@ -5540,8 +5764,9 @@ const JoinData = props => {
|
|
|
5540
5764
|
let type = node.getAttribute('v-data');
|
|
5541
5765
|
let data = [];
|
|
5542
5766
|
let value = {
|
|
5543
|
-
name: meta[type].
|
|
5544
|
-
|
|
5767
|
+
name: meta[type].quotes || meta[type].fieldAlias,
|
|
5768
|
+
quotes: meta[type].quotes,
|
|
5769
|
+
id: meta[type].fieldUuid,
|
|
5545
5770
|
table: meta[type].name,
|
|
5546
5771
|
tableId: meta[type].id,
|
|
5547
5772
|
fieldUuid: meta[type].fieldUuid || uuidv4('field'),
|
|
@@ -5659,11 +5884,21 @@ const JoinData = props => {
|
|
|
5659
5884
|
sql,
|
|
5660
5885
|
datasourceId,
|
|
5661
5886
|
datasourceName,
|
|
5662
|
-
id = ''
|
|
5887
|
+
id = '',
|
|
5888
|
+
fieldAlias = '',
|
|
5889
|
+
fieldUuid = '',
|
|
5890
|
+
quotes
|
|
5663
5891
|
} = record;
|
|
5664
5892
|
let newMeta = store.metaList[groupIndex].list.slice();
|
|
5665
|
-
|
|
5666
|
-
|
|
5893
|
+
if (alias === SummarizeAlias$1) {
|
|
5894
|
+
newMeta[index][type].fieldAlias = fieldAlias;
|
|
5895
|
+
newMeta[index][type].fieldUuid = fieldUuid;
|
|
5896
|
+
newMeta[index][type].quotes = quotes;
|
|
5897
|
+
} else {
|
|
5898
|
+
newMeta[index][type].fieldAlias = name;
|
|
5899
|
+
newMeta[index][type].fieldUuid = id;
|
|
5900
|
+
newMeta[index][type].quotes = name;
|
|
5901
|
+
}
|
|
5667
5902
|
if (type === FlagLocation.TABLE_1) {
|
|
5668
5903
|
if (newMeta[index][type].alias !== alias) {
|
|
5669
5904
|
newMeta[index][type].alias = alias;
|
|
@@ -5691,8 +5926,8 @@ const JoinData = props => {
|
|
|
5691
5926
|
let index = findIndex(store.metaList[groupIndex].list, meta);
|
|
5692
5927
|
let table_type = type === ExpressionsEnum.LEFT ? FlagLocation.TABLE_1 : FlagLocation.TABLE_2;
|
|
5693
5928
|
let value = {
|
|
5694
|
-
name: meta.expressions[_ind][type],
|
|
5695
|
-
id: meta.expressions[_ind][`${type}
|
|
5929
|
+
name: meta.expressions[_ind][`${type}_quotes`] || meta.expressions[_ind][`${type}_fieldAlias`],
|
|
5930
|
+
id: meta.expressions[_ind][`${type}_fieldUuid`],
|
|
5696
5931
|
table: meta[table_type].name,
|
|
5697
5932
|
fieldUuid: meta[table_type].fieldUuid || uuidv4('field'),
|
|
5698
5933
|
fieldAlias: meta[table_type].fieldAlias || '',
|
|
@@ -5817,11 +6052,23 @@ const JoinData = props => {
|
|
|
5817
6052
|
sql,
|
|
5818
6053
|
datasourceId,
|
|
5819
6054
|
datasourceName,
|
|
5820
|
-
id = ''
|
|
6055
|
+
id = '',
|
|
6056
|
+
fieldAlias,
|
|
6057
|
+
fieldUuid,
|
|
6058
|
+
quotes = ''
|
|
5821
6059
|
} = record;
|
|
5822
6060
|
let newMeta = store.metaList[groupIndex].list.slice();
|
|
5823
|
-
|
|
5824
|
-
|
|
6061
|
+
if (alias === SummarizeAlias$1) {
|
|
6062
|
+
newMeta[index].expressions[_ind][`${type}_fieldAlias`] = fieldAlias;
|
|
6063
|
+
newMeta[index].expressions[_ind][`${type}_fieldUuid`] = fieldUuid;
|
|
6064
|
+
newMeta[index].expressions[_ind][`${type}_quotes`] = quotes;
|
|
6065
|
+
} else {
|
|
6066
|
+
newMeta[index].expressions[_ind][`${type}_fieldAlias`] = name;
|
|
6067
|
+
newMeta[index].expressions[_ind][`${type}_fieldUuid`] = id;
|
|
6068
|
+
newMeta[index].expressions[_ind][`${type}_quotes`] = name;
|
|
6069
|
+
}
|
|
6070
|
+
// (newMeta[index] as MetaJoin).expressions[_ind][type] = name;
|
|
6071
|
+
// (newMeta[index] as MetaJoin).expressions[_ind][`${type}_id`] = id;
|
|
5825
6072
|
store.setMeta(newMeta, groupIndex);
|
|
5826
6073
|
store.setPopup({
|
|
5827
6074
|
visible: false
|
|
@@ -5903,10 +6150,11 @@ const JoinData = props => {
|
|
|
5903
6150
|
let oldList = cloneDeep(newMeta[index].subquery);
|
|
5904
6151
|
let _toolbar = subToolbar || toolbar;
|
|
5905
6152
|
_toolbar = _toolbar.filter(v => v !== 'group'); // 子查询不需要分组
|
|
6153
|
+
let zIndex = store.popupContainer.current ? getMaxZIndexInParents(store.popupContainer.current) : 0;
|
|
5906
6154
|
let o = Modal2.openModal({
|
|
5907
6155
|
title: __('SqlQueryBuilder.subquery'),
|
|
5908
6156
|
transparentMask: true,
|
|
5909
|
-
zIndex:
|
|
6157
|
+
zIndex: Number(zIndex),
|
|
5910
6158
|
content: jsx(Fragment, {
|
|
5911
6159
|
children: jsx(SqlVisionBuilder, {
|
|
5912
6160
|
...other,
|
|
@@ -5924,8 +6172,8 @@ const JoinData = props => {
|
|
|
5924
6172
|
newMeta[index].subquery = newList;
|
|
5925
6173
|
newMeta[index].table2 = {
|
|
5926
6174
|
...newList[0].table,
|
|
5927
|
-
|
|
5928
|
-
|
|
6175
|
+
fieldAlias: '',
|
|
6176
|
+
fieldUuid: ''
|
|
5929
6177
|
};
|
|
5930
6178
|
const items = getSubColumns(newList);
|
|
5931
6179
|
const newColumns = items.flatMap(item => item.columns);
|
|
@@ -5950,8 +6198,9 @@ const JoinData = props => {
|
|
|
5950
6198
|
let newMeta = store.metaList[groupIndex].list.slice();
|
|
5951
6199
|
newMeta[index].isSubquery = !newMeta[index].isSubquery;
|
|
5952
6200
|
newMeta[index].table2 = {
|
|
5953
|
-
|
|
5954
|
-
|
|
6201
|
+
quotes: '',
|
|
6202
|
+
fieldAlias: '',
|
|
6203
|
+
fieldUuid: '',
|
|
5955
6204
|
name: '',
|
|
5956
6205
|
// 表名
|
|
5957
6206
|
tableUuid: '',
|
|
@@ -6084,23 +6333,23 @@ const JoinData = props => {
|
|
|
6084
6333
|
children: "on"
|
|
6085
6334
|
}), jsx("div", {
|
|
6086
6335
|
className: cx(`Sqb-TableName`, {
|
|
6087
|
-
notSelected: !meta.table1.
|
|
6336
|
+
notSelected: !meta.table1.quotes
|
|
6088
6337
|
}),
|
|
6089
6338
|
"v-data": FlagLocation.TABLE_1,
|
|
6090
6339
|
onClick: selectJoinColumn,
|
|
6091
|
-
children: meta.table1.
|
|
6340
|
+
children: meta.table1.quotes ? meta.table1.quotes : __('SqlQueryBuilder.pickTable')
|
|
6092
6341
|
}), jsx("span", {
|
|
6093
6342
|
className: 'mr-2 text-gray-500',
|
|
6094
6343
|
children: "="
|
|
6095
6344
|
}), jsx("div", {
|
|
6096
6345
|
className: cx(`Sqb-TableName`, {
|
|
6097
|
-
notSelected: !meta.table2.
|
|
6346
|
+
notSelected: !meta.table2.quotes
|
|
6098
6347
|
}),
|
|
6099
6348
|
"v-data": FlagLocation.TABLE_2,
|
|
6100
6349
|
onClick: selectJoinColumn,
|
|
6101
|
-
children: meta.table2.
|
|
6350
|
+
children: meta.table2.quotes ? meta.table2.quotes : __('SqlQueryBuilder.pickTable')
|
|
6102
6351
|
})]
|
|
6103
|
-
}), meta.table1.
|
|
6352
|
+
}), meta.table1.fieldUuid && meta.table2.fieldUuid && meta.expressions?.map((v, i) => {
|
|
6104
6353
|
return jsxs("div", {
|
|
6105
6354
|
className: cx(`Sqb-where block`),
|
|
6106
6355
|
children: [jsx("span", {
|
|
@@ -6129,12 +6378,12 @@ const JoinData = props => {
|
|
|
6129
6378
|
children: v.left_constant ? v.left_constant : __('SqlQueryBuilder.pickConstant')
|
|
6130
6379
|
}), (!v.left_type || v.left_type === 'field') && jsx("div", {
|
|
6131
6380
|
className: cx(`Sqb-TableName`, {
|
|
6132
|
-
notSelected: !v.
|
|
6381
|
+
notSelected: !v.left_quotes
|
|
6133
6382
|
}),
|
|
6134
6383
|
"v-data": ExpressionsEnum.LEFT,
|
|
6135
6384
|
"v-index": i,
|
|
6136
6385
|
onClick: selectMoreJoinColumn,
|
|
6137
|
-
children: v.
|
|
6386
|
+
children: v.left_quotes ? v.left_quotes : __('SqlQueryBuilder.pickTable')
|
|
6138
6387
|
}), jsx(Tooltip, {
|
|
6139
6388
|
title: __('SqlQueryBuilder.switch'),
|
|
6140
6389
|
children: jsx(Button, {
|
|
@@ -6173,12 +6422,12 @@ const JoinData = props => {
|
|
|
6173
6422
|
children: v.right_constant ? v.right_constant : __('SqlQueryBuilder.pickConstant')
|
|
6174
6423
|
}), (!v.right_type || v.right_type === 'field') && jsx("div", {
|
|
6175
6424
|
className: cx(`Sqb-TableName`, {
|
|
6176
|
-
notSelected: !v.
|
|
6425
|
+
notSelected: !v.right_quotes
|
|
6177
6426
|
}),
|
|
6178
6427
|
"v-data": ExpressionsEnum.RIGHT,
|
|
6179
6428
|
"v-index": i,
|
|
6180
6429
|
onClick: selectMoreJoinColumn,
|
|
6181
|
-
children: v.
|
|
6430
|
+
children: v.right_quotes ? v.right_quotes : __('SqlQueryBuilder.pickTable')
|
|
6182
6431
|
}), jsx(Tooltip, {
|
|
6183
6432
|
title: __('SqlQueryBuilder.switch'),
|
|
6184
6433
|
children: jsx(Button, {
|
|
@@ -6204,14 +6453,15 @@ const JoinData = props => {
|
|
|
6204
6453
|
let newMeta = store.metaList[groupIndex].list.slice();
|
|
6205
6454
|
newMeta[index].expressions.splice(i + 1, 0, {
|
|
6206
6455
|
operator: 'and',
|
|
6207
|
-
|
|
6208
|
-
|
|
6456
|
+
left_fieldAlias: '',
|
|
6457
|
+
left_fieldUuid: '',
|
|
6458
|
+
left_quotes: '',
|
|
6209
6459
|
left_string: '',
|
|
6210
|
-
left_isString: false,
|
|
6211
6460
|
left_type: 'field',
|
|
6212
6461
|
left_constant: '',
|
|
6213
|
-
|
|
6214
|
-
|
|
6462
|
+
right_fieldAlias: '',
|
|
6463
|
+
right_fieldUuid: '',
|
|
6464
|
+
right_quotes: '',
|
|
6215
6465
|
right_string: '',
|
|
6216
6466
|
right_isString: false,
|
|
6217
6467
|
right_type: 'field',
|
|
@@ -6236,7 +6486,7 @@ const JoinData = props => {
|
|
|
6236
6486
|
})
|
|
6237
6487
|
})]
|
|
6238
6488
|
}, i);
|
|
6239
|
-
}), meta.table1.
|
|
6489
|
+
}), meta.table1.fieldUuid && meta.table2.fieldUuid && (meta.expressions?.length || 0) < 1 && jsx(Tooltip, {
|
|
6240
6490
|
title: __('SqlQueryBuilder.add'),
|
|
6241
6491
|
children: jsx(Button, {
|
|
6242
6492
|
disabled: meta.readonly,
|
|
@@ -6249,14 +6499,15 @@ const JoinData = props => {
|
|
|
6249
6499
|
let newMeta = store.metaList[groupIndex].list.slice();
|
|
6250
6500
|
newMeta[index].expressions = [{
|
|
6251
6501
|
operator: 'and',
|
|
6252
|
-
|
|
6253
|
-
|
|
6502
|
+
left_fieldAlias: '',
|
|
6503
|
+
left_fieldUuid: '',
|
|
6504
|
+
left_quotes: '',
|
|
6254
6505
|
left_string: '',
|
|
6255
|
-
left_isString: false,
|
|
6256
6506
|
left_type: 'field',
|
|
6257
6507
|
left_constant: '',
|
|
6258
|
-
|
|
6259
|
-
|
|
6508
|
+
right_fieldAlias: '',
|
|
6509
|
+
right_fieldUuid: '',
|
|
6510
|
+
right_quotes: '',
|
|
6260
6511
|
right_string: '',
|
|
6261
6512
|
right_isString: false,
|
|
6262
6513
|
right_constant: '',
|
|
@@ -6407,12 +6658,12 @@ const CaseEditor = props => {
|
|
|
6407
6658
|
onOk,
|
|
6408
6659
|
onCancel
|
|
6409
6660
|
} = props;
|
|
6410
|
-
const [popup, setPopup] = useState({
|
|
6411
|
-
visible: false
|
|
6412
|
-
}); // 弹框信息
|
|
6661
|
+
// const [popup, setPopup] = useState<PopupType>({ visible: false }); // 弹框信息
|
|
6413
6662
|
const [caseList, setCaseList] = useState(value.formulaList || []);
|
|
6414
6663
|
const [name, setName] = useState(value?.name || ''); // 表达式名字
|
|
6415
6664
|
const [ind, setInd] = useState(-1);
|
|
6665
|
+
const ref = useRef(null);
|
|
6666
|
+
const store = useStore$1();
|
|
6416
6667
|
const filterCase = useMemo(() => {
|
|
6417
6668
|
const hasCase = caseList.some(item => item.type === OptionsTypeEnum.OTHER && item.operator === 'case');
|
|
6418
6669
|
if (hasCase) {
|
|
@@ -6424,24 +6675,22 @@ const CaseEditor = props => {
|
|
|
6424
6675
|
const usable = useMemo(() => {
|
|
6425
6676
|
return Array.from(caseList).length > 0 && name;
|
|
6426
6677
|
}, [caseList, name]);
|
|
6427
|
-
const popupContent = useMemo(() => {
|
|
6428
|
-
|
|
6429
|
-
|
|
6430
|
-
|
|
6431
|
-
|
|
6432
|
-
if (!visible) return null;
|
|
6433
|
-
return content;
|
|
6434
|
-
}, [popup]);
|
|
6678
|
+
// const popupContent = useMemo(() => {
|
|
6679
|
+
// let { visible, content } = popup;
|
|
6680
|
+
// if (!visible) return null;
|
|
6681
|
+
// return content;
|
|
6682
|
+
// }, [popup]);
|
|
6435
6683
|
function closePopup() {
|
|
6436
|
-
setPopup({
|
|
6684
|
+
store.setPopup({
|
|
6437
6685
|
visible: false
|
|
6438
6686
|
});
|
|
6439
6687
|
}
|
|
6440
6688
|
// 字段
|
|
6441
6689
|
function handleField(e, i, val) {
|
|
6442
|
-
setPopup({
|
|
6690
|
+
store.setPopup({
|
|
6443
6691
|
visible: true,
|
|
6444
6692
|
node: e.currentTarget,
|
|
6693
|
+
container: ref.current,
|
|
6445
6694
|
content: jsx(SelectJoinColumn, {
|
|
6446
6695
|
data: data,
|
|
6447
6696
|
value: val,
|
|
@@ -6449,8 +6698,13 @@ const CaseEditor = props => {
|
|
|
6449
6698
|
isGroup: true,
|
|
6450
6699
|
// @ts-ignore
|
|
6451
6700
|
onGroup: data => {
|
|
6701
|
+
let _data = cloneDeep(data);
|
|
6702
|
+
if (_data.alias != SummarizeAlias$1) {
|
|
6703
|
+
_data.fieldAlias = _data.name;
|
|
6704
|
+
_data.fieldUuid = uuidv4('field');
|
|
6705
|
+
}
|
|
6452
6706
|
const _caseList = caseList.slice();
|
|
6453
|
-
_caseList[i].expression =
|
|
6707
|
+
_caseList[i].expression = _data;
|
|
6454
6708
|
setCaseList(_caseList);
|
|
6455
6709
|
closePopup();
|
|
6456
6710
|
}
|
|
@@ -6466,16 +6720,23 @@ const CaseEditor = props => {
|
|
|
6466
6720
|
};
|
|
6467
6721
|
// 表达式
|
|
6468
6722
|
function handleExpression(e, i, val) {
|
|
6469
|
-
setPopup({
|
|
6723
|
+
store.setPopup({
|
|
6470
6724
|
visible: true,
|
|
6471
6725
|
node: e.currentTarget,
|
|
6726
|
+
container: ref.current,
|
|
6472
6727
|
content: jsx(SelectFilter, {
|
|
6473
6728
|
isCustom: true,
|
|
6729
|
+
container: ref.current,
|
|
6474
6730
|
data: data,
|
|
6475
6731
|
value: val,
|
|
6476
6732
|
onChange: data => {
|
|
6733
|
+
let _data = cloneDeep(data);
|
|
6734
|
+
if (_data.alias != SummarizeAlias$1) {
|
|
6735
|
+
_data.fieldAlias = _data.name;
|
|
6736
|
+
_data.fieldUuid = uuidv4('field');
|
|
6737
|
+
}
|
|
6477
6738
|
const _caseList = caseList.slice();
|
|
6478
|
-
_caseList[i].expression =
|
|
6739
|
+
_caseList[i].expression = _data;
|
|
6479
6740
|
setCaseList(_caseList);
|
|
6480
6741
|
closePopup();
|
|
6481
6742
|
}
|
|
@@ -6518,8 +6779,7 @@ const CaseEditor = props => {
|
|
|
6518
6779
|
const _onOk = () => {
|
|
6519
6780
|
typeof onOk === 'function' && onOk?.({
|
|
6520
6781
|
name,
|
|
6521
|
-
formulaList: caseList
|
|
6522
|
-
formula: ''
|
|
6782
|
+
formulaList: caseList
|
|
6523
6783
|
});
|
|
6524
6784
|
};
|
|
6525
6785
|
// 分段
|
|
@@ -6667,6 +6927,7 @@ const CaseEditor = props => {
|
|
|
6667
6927
|
};
|
|
6668
6928
|
return jsxs("div", {
|
|
6669
6929
|
className: 'custom-box',
|
|
6930
|
+
ref: ref,
|
|
6670
6931
|
children: [jsx(VisualBox$1, {
|
|
6671
6932
|
children: jsx("div", {
|
|
6672
6933
|
className: `Sqb-item Sqb-case-editor mb-2 mt-2`,
|
|
@@ -6804,13 +7065,6 @@ const CaseEditor = props => {
|
|
|
6804
7065
|
})]
|
|
6805
7066
|
})
|
|
6806
7067
|
})
|
|
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
7068
|
}), jsx("div", {
|
|
6815
7069
|
className: `btns p-4`,
|
|
6816
7070
|
children: jsxs("div", {
|
|
@@ -6942,14 +7196,15 @@ const CustomColumn = props => {
|
|
|
6942
7196
|
}
|
|
6943
7197
|
return data;
|
|
6944
7198
|
}
|
|
6945
|
-
//
|
|
7199
|
+
// 自定义弹窗
|
|
6946
7200
|
const showSubQuery = (e, i) => {
|
|
6947
7201
|
let newMeta = store.metaList[groupIndex].list.slice();
|
|
6948
7202
|
const _value = newMeta[index].customColumn[i] || [];
|
|
7203
|
+
let zIndex = store.popupContainer.current ? getMaxZIndexInParents(store.popupContainer.current) : 0;
|
|
6949
7204
|
let o = Modal2.openModal({
|
|
6950
7205
|
title: __('SqlQueryBuilder.customExpression'),
|
|
6951
7206
|
transparentMask: true,
|
|
6952
|
-
zIndex:
|
|
7207
|
+
zIndex: Number(zIndex),
|
|
6953
7208
|
content: jsx(Fragment, {
|
|
6954
7209
|
children: jsx(Provider, {
|
|
6955
7210
|
value: store,
|
|
@@ -7209,7 +7464,7 @@ const Filter = props => {
|
|
|
7209
7464
|
let newMeta = store.metaList[groupIndex].list.slice();
|
|
7210
7465
|
let val = filter[i];
|
|
7211
7466
|
if (val.type === Filter_TypeEnum.NOT_EXISTS) {
|
|
7212
|
-
|
|
7467
|
+
showNotExists(i, '');
|
|
7213
7468
|
return;
|
|
7214
7469
|
}
|
|
7215
7470
|
let data = getColumns();
|
|
@@ -7308,10 +7563,10 @@ const Filter = props => {
|
|
|
7308
7563
|
newMeta[index].filter = [..._filter];
|
|
7309
7564
|
setInd(-1);
|
|
7310
7565
|
};
|
|
7311
|
-
//
|
|
7312
|
-
const
|
|
7566
|
+
// NotExists 窗口
|
|
7567
|
+
const showNotExists = (i, position) => {
|
|
7313
7568
|
const {
|
|
7314
|
-
|
|
7569
|
+
notExistsToolbar,
|
|
7315
7570
|
toolbar,
|
|
7316
7571
|
...other
|
|
7317
7572
|
} = store.preProps;
|
|
@@ -7319,12 +7574,13 @@ const Filter = props => {
|
|
|
7319
7574
|
let index = findIndex(store.metaList[groupIndex].list, meta);
|
|
7320
7575
|
let _value = position ? [] : newMeta[index].filter[i]?.subquery || [];
|
|
7321
7576
|
let oldList = position ? [] : cloneDeep(newMeta[index].filter[i]?.subquery || []);
|
|
7322
|
-
let _toolbar =
|
|
7577
|
+
let _toolbar = notExistsToolbar || toolbar;
|
|
7323
7578
|
_toolbar = _toolbar.filter(v => v !== 'group'); // 子查询不需要分组
|
|
7579
|
+
let zIndex = store.popupContainer.current ? getMaxZIndexInParents(store.popupContainer.current) : null;
|
|
7324
7580
|
let o = Modal2.openModal({
|
|
7325
7581
|
title: 'NOT EXISTS',
|
|
7326
7582
|
transparentMask: true,
|
|
7327
|
-
zIndex:
|
|
7583
|
+
zIndex: Number(zIndex),
|
|
7328
7584
|
content: jsx(Fragment, {
|
|
7329
7585
|
children: jsx(SqlVisionBuilder, {
|
|
7330
7586
|
...other,
|
|
@@ -7417,7 +7673,7 @@ const Filter = props => {
|
|
|
7417
7673
|
if (type === Filter_TypeEnum.EXPRESSION) {
|
|
7418
7674
|
handleAdd(_e);
|
|
7419
7675
|
} else if (type === Filter_TypeEnum.NOT_EXISTS) {
|
|
7420
|
-
|
|
7676
|
+
showNotExists(_index, _type);
|
|
7421
7677
|
}
|
|
7422
7678
|
}
|
|
7423
7679
|
})
|
|
@@ -7484,7 +7740,7 @@ const Filter = props => {
|
|
|
7484
7740
|
}, i) : jsxs("div", {
|
|
7485
7741
|
className: `Sqb-TableName purple-name`,
|
|
7486
7742
|
onClick: e => handleUpdate(e, i),
|
|
7487
|
-
children: [v.quotes, jsx("span", {
|
|
7743
|
+
children: [v.type === Filter_TypeEnum.NOT_EXISTS ? 'not exitis ( * )' : v.quotes, jsx("span", {
|
|
7488
7744
|
style: {
|
|
7489
7745
|
fontSize: 0
|
|
7490
7746
|
},
|
|
@@ -7660,7 +7916,7 @@ const GroupBy = props => {
|
|
|
7660
7916
|
newMeta[index].by.splice(i, 1, data);
|
|
7661
7917
|
// @ts-ignore
|
|
7662
7918
|
newMeta[index].by = newMeta[index].by.map(v => {
|
|
7663
|
-
const fieldAlias =
|
|
7919
|
+
const fieldAlias = `${v.alias}__${v.name}`;
|
|
7664
7920
|
return {
|
|
7665
7921
|
...v,
|
|
7666
7922
|
sql: `${v.alias}.${v.realName || v.name} AS ${fieldAlias}`,
|
|
@@ -7694,8 +7950,8 @@ const GroupBy = props => {
|
|
|
7694
7950
|
quotes: '',
|
|
7695
7951
|
datasourceId: '',
|
|
7696
7952
|
datasourceName: '',
|
|
7697
|
-
column: '',
|
|
7698
|
-
column_id: '',
|
|
7953
|
+
// column: '',
|
|
7954
|
+
// column_id: '',
|
|
7699
7955
|
summarizeType: MetaSummarize_Enum.BY
|
|
7700
7956
|
};
|
|
7701
7957
|
store.setPopup({
|
|
@@ -7712,7 +7968,7 @@ const GroupBy = props => {
|
|
|
7712
7968
|
newMeta[index].by.push(data);
|
|
7713
7969
|
// @ts-ignore
|
|
7714
7970
|
newMeta[index].by = newMeta[index].by.map(v => {
|
|
7715
|
-
const fieldAlias =
|
|
7971
|
+
const fieldAlias = `${v.alias}__${v.name}`;
|
|
7716
7972
|
return {
|
|
7717
7973
|
...v,
|
|
7718
7974
|
sql: `${v.alias}.${v.realName || v.name} AS ${fieldAlias}`,
|
|
@@ -7956,8 +8212,8 @@ const SelectIndex = props => {
|
|
|
7956
8212
|
quotes: '',
|
|
7957
8213
|
datasourceId: '',
|
|
7958
8214
|
datasourceName: '',
|
|
7959
|
-
column: '',
|
|
7960
|
-
column_id: '',
|
|
8215
|
+
// column: '',
|
|
8216
|
+
// column_id: '',
|
|
7961
8217
|
summarizeType: MetaSummarize_Enum.GROUP
|
|
7962
8218
|
};
|
|
7963
8219
|
store.setPopup({
|
|
@@ -8527,7 +8783,8 @@ const Metabase = props => {
|
|
|
8527
8783
|
} = props;
|
|
8528
8784
|
const store = useStore$1();
|
|
8529
8785
|
const [saveLoading, setSaveLoading] = useState(false);
|
|
8530
|
-
const popupContainer = useRef();
|
|
8786
|
+
// const popupContainer = useRef();
|
|
8787
|
+
// store.setPopupContainer(popupContainer);
|
|
8531
8788
|
const popupContent = useMemo(() => {
|
|
8532
8789
|
let {
|
|
8533
8790
|
visible,
|
|
@@ -8546,40 +8803,35 @@ const Metabase = props => {
|
|
|
8546
8803
|
}, [store.popupData2]);
|
|
8547
8804
|
const onSave = async () => {
|
|
8548
8805
|
let intercept = false; // 是否返回
|
|
8806
|
+
const _metaList = splitByUnion(store.metaList);
|
|
8549
8807
|
store.metaList.map(v => {
|
|
8550
|
-
if (v.type !== '
|
|
8808
|
+
if (v.type !== 'union' && !(v.list?.[0]).table.name) {
|
|
8551
8809
|
intercept = true;
|
|
8552
8810
|
return Toast.warning(__('data.pleaseSelectDataTable'));
|
|
8553
8811
|
}
|
|
8554
8812
|
});
|
|
8555
8813
|
if (saveLoading || intercept) return null;
|
|
8556
8814
|
setSaveLoading(true);
|
|
8557
|
-
|
|
8558
|
-
// 分组
|
|
8559
|
-
await onOk?.(store.metaList);
|
|
8560
|
-
} else {
|
|
8561
|
-
// 非分组
|
|
8562
|
-
await onOk?.(store.metaList[0].list);
|
|
8563
|
-
}
|
|
8815
|
+
await onOk?.(_metaList);
|
|
8564
8816
|
setSaveLoading(false);
|
|
8565
8817
|
};
|
|
8566
|
-
let zIndex = popupContainer.current ? getMaxZIndexInParents(popupContainer.current) : null;
|
|
8818
|
+
let zIndex = store.popupContainer.current ? getMaxZIndexInParents(store.popupContainer.current) : null;
|
|
8567
8819
|
return (
|
|
8568
8820
|
// @ts-ignore
|
|
8569
8821
|
jsx(VisualBox, {
|
|
8570
|
-
ref: popupContainer,
|
|
8822
|
+
ref: store.popupContainer,
|
|
8571
8823
|
children: jsxs("div", {
|
|
8572
8824
|
className: 'Sqb',
|
|
8573
8825
|
children: [store.metaList.map((v, index) => {
|
|
8574
|
-
if (v.type === '
|
|
8826
|
+
if (v.type === 'union' && v.union) {
|
|
8575
8827
|
return jsx("div", {
|
|
8576
8828
|
className: cx(`Sqb-list`),
|
|
8577
8829
|
children: jsx(RowLimit$1, {
|
|
8578
|
-
|
|
8830
|
+
union: v.union,
|
|
8579
8831
|
meta: v,
|
|
8580
8832
|
groupIndex: index
|
|
8581
8833
|
})
|
|
8582
|
-
}, '
|
|
8834
|
+
}, 'union' + index);
|
|
8583
8835
|
}
|
|
8584
8836
|
return jsx("div", {
|
|
8585
8837
|
className: cx(`Sqb-list`),
|
|
@@ -8604,8 +8856,8 @@ const Metabase = props => {
|
|
|
8604
8856
|
disabled: saveLoading,
|
|
8605
8857
|
onClick: onSave,
|
|
8606
8858
|
children: btnText || __('SqlQueryBuilder.visualize')
|
|
8607
|
-
}) : null, popupContainer.current && jsx(Popup, {
|
|
8608
|
-
container: popupContainer.current,
|
|
8859
|
+
}) : null, store.popupContainer.current && jsx(Popup, {
|
|
8860
|
+
container: store.popupData.container || store.popupContainer.current,
|
|
8609
8861
|
visible: store.popupData.visible,
|
|
8610
8862
|
node: store.popupData.node,
|
|
8611
8863
|
closable: store.popupClosable,
|
|
@@ -8616,8 +8868,8 @@ const Metabase = props => {
|
|
|
8616
8868
|
});
|
|
8617
8869
|
},
|
|
8618
8870
|
children: popupContent
|
|
8619
|
-
}), popupContainer.current && jsx(Popup, {
|
|
8620
|
-
container: popupContainer.current,
|
|
8871
|
+
}), store.popupContainer.current && jsx(Popup, {
|
|
8872
|
+
container: store.popupData2.container || store.popupContainer.current,
|
|
8621
8873
|
visible: store.popupData2.visible,
|
|
8622
8874
|
node: store.popupData2.node,
|
|
8623
8875
|
closable: store.popupClosable2,
|
|
@@ -8666,15 +8918,9 @@ const SqlVisionBuilder = /*#__PURE__*/React__default.forwardRef((props, ref) =>
|
|
|
8666
8918
|
store.setProps(props);
|
|
8667
8919
|
}, [props]);
|
|
8668
8920
|
useEffect(() => {
|
|
8669
|
-
|
|
8670
|
-
|
|
8671
|
-
|
|
8672
|
-
store.setPreData([{
|
|
8673
|
-
name: 'default',
|
|
8674
|
-
list: value
|
|
8675
|
-
}]);
|
|
8676
|
-
}
|
|
8677
|
-
}, [value, toolbar]);
|
|
8921
|
+
const _value = reassembleByUnion(value);
|
|
8922
|
+
store.setPreData(_value);
|
|
8923
|
+
}, [value]);
|
|
8678
8924
|
useEffect(() => {
|
|
8679
8925
|
store.setSourceList(sourceList);
|
|
8680
8926
|
}, [sourceList]);
|