@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/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 +457 -204
- package/lib/es/index.js.map +1 -1
- package/lib/es/store/enum.d.ts +1 -1
- package/lib/es/store/types.d.ts +14 -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.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["
|
|
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
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1081
|
-
|
|
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
|
-
|
|
1091
|
-
|
|
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
|
-
|
|
1107
|
-
|
|
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.
|
|
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
|
-
|
|
1761
|
-
|
|
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
|
-
|
|
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:
|
|
2438
|
+
value: union,
|
|
2251
2439
|
onChange: type => {
|
|
2252
2440
|
let newMeta = store.metaList.slice();
|
|
2253
|
-
newMeta[groupIndex].
|
|
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:
|
|
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
|
|
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
|
|
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
|
|
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("
|
|
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("
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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"] = "
|
|
5415
|
-
ExpressionsEnum["RIGHT"] = "
|
|
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.
|
|
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
|
-
|
|
5500
|
-
|
|
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].
|
|
5544
|
-
|
|
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
|
-
|
|
5666
|
-
|
|
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}
|
|
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
|
-
|
|
5824
|
-
|
|
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:
|
|
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
|
-
|
|
5928
|
-
|
|
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
|
-
|
|
5954
|
-
|
|
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.
|
|
6343
|
+
notSelected: !meta.table1.quotes
|
|
6088
6344
|
}),
|
|
6089
6345
|
"v-data": FlagLocation.TABLE_1,
|
|
6090
6346
|
onClick: selectJoinColumn,
|
|
6091
|
-
children: meta.table1.
|
|
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.
|
|
6353
|
+
notSelected: !meta.table2.quotes
|
|
6098
6354
|
}),
|
|
6099
6355
|
"v-data": FlagLocation.TABLE_2,
|
|
6100
6356
|
onClick: selectJoinColumn,
|
|
6101
|
-
children: meta.table2.
|
|
6357
|
+
children: meta.table2.quotes ? meta.table2.quotes : __('SqlQueryBuilder.pickTable')
|
|
6102
6358
|
})]
|
|
6103
|
-
}), meta.table1.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
6208
|
-
|
|
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
|
-
|
|
6214
|
-
|
|
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.
|
|
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
|
-
|
|
6253
|
-
|
|
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
|
-
|
|
6259
|
-
|
|
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
|
-
|
|
6429
|
-
|
|
6430
|
-
|
|
6431
|
-
|
|
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 =
|
|
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 =
|
|
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:
|
|
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
|
-
|
|
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
|
|
7573
|
+
// NotExists 窗口
|
|
7574
|
+
const showNotExists = (i, position) => {
|
|
7313
7575
|
const {
|
|
7314
|
-
|
|
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 =
|
|
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:
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
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 !== '
|
|
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
|
-
|
|
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 === '
|
|
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
|
-
|
|
8837
|
+
union: v.union,
|
|
8579
8838
|
meta: v,
|
|
8580
8839
|
groupIndex: index
|
|
8581
8840
|
})
|
|
8582
|
-
}, '
|
|
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
|
-
|
|
8670
|
-
|
|
8671
|
-
|
|
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]);
|