@gingkoo/pandora-metabase 1.0.0-alpha.17 → 1.0.0-alpha.2
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 +11 -20
- package/lib/es/components/dialog/select-filter/index.d.ts +0 -1
- package/lib/es/components/dialog/select-join-column/index.d.ts +0 -1
- package/lib/es/components/modules/{union.d.ts → group.d.ts} +1 -1
- package/lib/es/components/popup.d.ts +2 -8
- package/lib/es/index.js +210 -493
- package/lib/es/index.js.map +1 -1
- package/lib/es/store/enum.d.ts +1 -1
- package/lib/es/store/types.d.ts +16 -14
- package/lib/es/types.d.ts +2 -4
- package/lib/es/utils/helper-dom.d.ts +3 -4
- package/lib/es/utils.d.ts +0 -2
- 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.2
|
|
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["group"] = "group";
|
|
93
93
|
})(TypeEnum || (TypeEnum = {}));
|
|
94
94
|
var JoinEnum;
|
|
95
95
|
(function (JoinEnum) {
|
|
@@ -278,6 +278,7 @@ const summarizeToSql = (arr, record) => {
|
|
|
278
278
|
condition,
|
|
279
279
|
alias,
|
|
280
280
|
name,
|
|
281
|
+
fieldAlias,
|
|
281
282
|
realName = ''
|
|
282
283
|
} = record;
|
|
283
284
|
let index = arr.indexOf(record);
|
|
@@ -338,7 +339,7 @@ const summarizeToSql = (arr, record) => {
|
|
|
338
339
|
count++;
|
|
339
340
|
}
|
|
340
341
|
});
|
|
341
|
-
as = as + (count ? '_' + (count + 1) : '');
|
|
342
|
+
as = fieldAlias || as + (count ? '_' + (count + 1) : '');
|
|
342
343
|
return {
|
|
343
344
|
sql: sql + ' AS ' + as,
|
|
344
345
|
fieldAlias: as
|
|
@@ -466,15 +467,15 @@ const handleNesting = data => {
|
|
|
466
467
|
if (customColumn && customColumn.customColumn.length) {
|
|
467
468
|
obj.customColumns = customColumn.customColumn.map(v => {
|
|
468
469
|
return {
|
|
469
|
-
alias: v.name
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
470
|
+
alias: v.name,
|
|
471
|
+
formula: v.formula.replace(/\[.*?\]/g, column => {
|
|
472
|
+
let str = column.substr(1, column.length - 2);
|
|
473
|
+
if (~str.indexOf('->')) {
|
|
474
|
+
let _str = str.replace(/ /g, '').split('->');
|
|
475
|
+
return `${_str[0]}.${_str[1]}`;
|
|
476
|
+
}
|
|
477
|
+
return str;
|
|
478
|
+
})
|
|
478
479
|
};
|
|
479
480
|
});
|
|
480
481
|
}
|
|
@@ -625,8 +626,9 @@ const getSubColumns = metaList => {
|
|
|
625
626
|
metaKey: -1,
|
|
626
627
|
type: TypeEnum.customColumn,
|
|
627
628
|
customColumn: [{
|
|
628
|
-
name: ''
|
|
629
|
-
//
|
|
629
|
+
name: '',
|
|
630
|
+
// 用户起的别名
|
|
631
|
+
formula: '' // 公式}];
|
|
630
632
|
}]
|
|
631
633
|
};
|
|
632
634
|
let {
|
|
@@ -648,7 +650,7 @@ const getSubColumns = metaList => {
|
|
|
648
650
|
return {
|
|
649
651
|
name_zh: v.quotes,
|
|
650
652
|
...v,
|
|
651
|
-
name: v.
|
|
653
|
+
name: v.quotes,
|
|
652
654
|
realName: v.sql?.split(' AS ')?.[1] || '',
|
|
653
655
|
// name_zh: '',
|
|
654
656
|
database_type: v?.database_type || SQL_COLUMN_TYPE.FLOAT,
|
|
@@ -662,7 +664,7 @@ const getSubColumns = metaList => {
|
|
|
662
664
|
return {
|
|
663
665
|
name_zh: v.quotes,
|
|
664
666
|
...v,
|
|
665
|
-
name: v.
|
|
667
|
+
name: v.quotes,
|
|
666
668
|
realName: v.sql?.split(' AS ')?.[1] || '',
|
|
667
669
|
// name_zh: '',
|
|
668
670
|
database_type: v?.database_type || SQL_COLUMN_TYPE.FLOAT,
|
|
@@ -730,15 +732,12 @@ const changeTableAlias = (list, curObj) => {
|
|
|
730
732
|
if (v.table1.tableUuid === tableUuid) {
|
|
731
733
|
v.table1.alias = alias;
|
|
732
734
|
}
|
|
733
|
-
if (v.table2.tableUuid === tableUuid) {
|
|
734
|
-
v.table2.alias = alias;
|
|
735
|
-
}
|
|
736
735
|
}
|
|
737
736
|
if (v.type === TypeEnum.customColumn) {
|
|
738
737
|
v.customColumn.map(item => {
|
|
739
738
|
item.formulaList?.map(formula => {
|
|
740
|
-
if (formula.
|
|
741
|
-
formula.
|
|
739
|
+
if (formula.tableUuid === tableUuid) {
|
|
740
|
+
formula.alias = alias;
|
|
742
741
|
}
|
|
743
742
|
});
|
|
744
743
|
});
|
|
@@ -776,40 +775,22 @@ const changeTableAlias = (list, curObj) => {
|
|
|
776
775
|
if (v.type === TypeEnum.filter) {
|
|
777
776
|
v.filter.map(item => {
|
|
778
777
|
if (item.tableUuid === tableUuid) {
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
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 = '';
|
|
778
|
+
if (item.alias === SummarizeAlias$1) {
|
|
779
|
+
//有groupBy 特殊处理
|
|
780
|
+
const {
|
|
781
|
+
prevGroupBy
|
|
782
|
+
} = getHelper(list, v);
|
|
783
|
+
let groupBy = prevGroupBy?.by.filter(v => v.fieldUuid === item.fieldUuid)[0] || prevGroupBy?.group.filter(v => v.fieldUuid === item.fieldUuid)[0] || null;
|
|
784
|
+
groupBy.alias = alias;
|
|
785
|
+
const sql = groupBy.sql;
|
|
786
|
+
if (groupBy) {
|
|
787
|
+
item.sql = sql;
|
|
788
|
+
item.groupSql = sql;
|
|
789
|
+
}
|
|
790
|
+
} else {
|
|
791
|
+
item.alias = alias;
|
|
792
|
+
item.sql = '';
|
|
793
|
+
}
|
|
813
794
|
}
|
|
814
795
|
});
|
|
815
796
|
}
|
|
@@ -824,30 +805,12 @@ const changeFieldAlias = (list, curObj) => {
|
|
|
824
805
|
const newList = cloneDeep(list);
|
|
825
806
|
newList.map(v => {
|
|
826
807
|
if (v.type === TypeEnum.data) ;
|
|
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
|
-
}
|
|
808
|
+
if (v.type === TypeEnum.joinData) ;
|
|
846
809
|
if (v.type === TypeEnum.customColumn) {
|
|
847
810
|
v.customColumn.map(item => {
|
|
848
811
|
item.formulaList?.map(formula => {
|
|
849
|
-
if (formula.
|
|
850
|
-
formula.
|
|
812
|
+
if (formula.fieldUuid === fieldUuid) {
|
|
813
|
+
formula.fieldAlias = fieldAlias;
|
|
851
814
|
}
|
|
852
815
|
});
|
|
853
816
|
});
|
|
@@ -901,110 +864,11 @@ const changeFieldAlias = (list, curObj) => {
|
|
|
901
864
|
}
|
|
902
865
|
}
|
|
903
866
|
}
|
|
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
|
-
}
|
|
921
867
|
});
|
|
922
868
|
}
|
|
923
869
|
});
|
|
924
870
|
return newList;
|
|
925
871
|
};
|
|
926
|
-
function splitByUnion(data) {
|
|
927
|
-
if (!data) return [];
|
|
928
|
-
const original = cloneDeep(data);
|
|
929
|
-
const result = [];
|
|
930
|
-
let i = 0;
|
|
931
|
-
while (i < original.length) {
|
|
932
|
-
const item = original[i];
|
|
933
|
-
if (item.type === 'group') {
|
|
934
|
-
// group.list 中每一项原样推入结果
|
|
935
|
-
for (const subItem of item.list) {
|
|
936
|
-
result.push(subItem);
|
|
937
|
-
}
|
|
938
|
-
i++;
|
|
939
|
-
} else if (item.type === 'union') {
|
|
940
|
-
const {
|
|
941
|
-
list,
|
|
942
|
-
...otehr
|
|
943
|
-
} = item;
|
|
944
|
-
// 查找下一个 group,并将其 list 转成 subquery
|
|
945
|
-
const nextItem = original[i + 1];
|
|
946
|
-
if (nextItem && nextItem.type === 'group') {
|
|
947
|
-
result.push({
|
|
948
|
-
...otehr,
|
|
949
|
-
subquery: nextItem.list.map(subItem => subItem)
|
|
950
|
-
});
|
|
951
|
-
i += 2;
|
|
952
|
-
} else {
|
|
953
|
-
result.push({
|
|
954
|
-
...otehr,
|
|
955
|
-
subquery: []
|
|
956
|
-
});
|
|
957
|
-
i++;
|
|
958
|
-
}
|
|
959
|
-
}
|
|
960
|
-
}
|
|
961
|
-
return result;
|
|
962
|
-
}
|
|
963
|
-
function reassembleByUnion(target = []) {
|
|
964
|
-
if (!target) return [];
|
|
965
|
-
const result = [];
|
|
966
|
-
let i = 0;
|
|
967
|
-
const len = target.length;
|
|
968
|
-
// 如果没有任何 union,直接放入一个 group.list
|
|
969
|
-
const hasUnion = target.some(item => item.type === 'union');
|
|
970
|
-
if (!hasUnion) {
|
|
971
|
-
return [{
|
|
972
|
-
type: 'group',
|
|
973
|
-
name: 'default',
|
|
974
|
-
list: [...target]
|
|
975
|
-
}];
|
|
976
|
-
}
|
|
977
|
-
// 否则正常处理
|
|
978
|
-
while (i < len) {
|
|
979
|
-
const item = target[i];
|
|
980
|
-
if (item.type !== 'union') {
|
|
981
|
-
// 收集连续非 union 的 item,统一放入一个 group.list
|
|
982
|
-
const groupList = [];
|
|
983
|
-
while (i < len && target[i].type !== 'union') {
|
|
984
|
-
groupList.push(target[i]);
|
|
985
|
-
i++;
|
|
986
|
-
}
|
|
987
|
-
result.push({
|
|
988
|
-
type: 'group',
|
|
989
|
-
name: 'default',
|
|
990
|
-
list: groupList
|
|
991
|
-
});
|
|
992
|
-
} else {
|
|
993
|
-
// 处理 union
|
|
994
|
-
result.push({
|
|
995
|
-
type: 'union',
|
|
996
|
-
name: 'union',
|
|
997
|
-
union: item.union ?? 'UNION',
|
|
998
|
-
list: []
|
|
999
|
-
});
|
|
1000
|
-
const subquery = item.subquery || [];
|
|
1001
|
-
const convertedSubquery = reassembleByUnion(subquery);
|
|
1002
|
-
result.push(...convertedSubquery);
|
|
1003
|
-
i++; // 跳过当前 union
|
|
1004
|
-
}
|
|
1005
|
-
}
|
|
1006
|
-
return result;
|
|
1007
|
-
}
|
|
1008
872
|
|
|
1009
873
|
let metaKey = 1;
|
|
1010
874
|
const SummarizeAlias = 'source';
|
|
@@ -1029,9 +893,9 @@ const useStore = () => {
|
|
|
1029
893
|
list: defaultMetaList
|
|
1030
894
|
}];
|
|
1031
895
|
const defaultOperator = {
|
|
1032
|
-
type: '
|
|
1033
|
-
name: '
|
|
1034
|
-
|
|
896
|
+
type: 'group',
|
|
897
|
+
name: 'group',
|
|
898
|
+
operator: UnionEnum.union,
|
|
1035
899
|
list: []
|
|
1036
900
|
};
|
|
1037
901
|
const [showFields, setShowFields] = useState(true); //显示字段
|
|
@@ -1057,8 +921,6 @@ const useStore = () => {
|
|
|
1057
921
|
}); //弹窗
|
|
1058
922
|
const [popupClosable, setClosable] = useState(true); //是否可关闭 如果弹框里面再弹框 则不可关闭
|
|
1059
923
|
const [popupClosable2, setClosable2] = useState(true); //是否可关闭 如果弹框里面再弹框 则不可关闭
|
|
1060
|
-
// 外层ref
|
|
1061
|
-
const popupContainer = useRef();
|
|
1062
924
|
// const [fetchDatasetFn, setFetchDatasetFn] = useState<(id: string) => Promise<any>>(
|
|
1063
925
|
// async () => {},
|
|
1064
926
|
// ); //fn
|
|
@@ -1076,18 +938,18 @@ const useStore = () => {
|
|
|
1076
938
|
};
|
|
1077
939
|
// 是否显示主表后面的字段按钮 (如果下面 没有聚合,或者选了聚合但是聚合里面没有选值的时候显示 主表字段按钮)
|
|
1078
940
|
const showMainColumn = useMemo(() => {
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
941
|
+
// 先将二维数组拍平为一维数组
|
|
942
|
+
const flatMetaList = metaList.flatMap(group => group.list);
|
|
943
|
+
// 过滤出所有汇总类型的项
|
|
944
|
+
const summarizeItems = flatMetaList.filter(v => v.type === TypeEnum.summarize);
|
|
945
|
+
// 如果没有汇总项,默认显示主列
|
|
946
|
+
if (summarizeItems.length === 0) {
|
|
947
|
+
return true;
|
|
948
|
+
}
|
|
949
|
+
// 如果只有一个汇总项,并且 group 和 by 都为空,则也显示主列
|
|
950
|
+
const onlyItem = summarizeItems[0];
|
|
951
|
+
const hasGroupOrBy = Array.isArray(onlyItem.group) && onlyItem.group.length > 0 || Array.isArray(onlyItem.by) && onlyItem.by.length > 0;
|
|
952
|
+
return !hasGroupOrBy;
|
|
1091
953
|
}, [metaList]);
|
|
1092
954
|
// const showMainColumn = useMemo(() => {
|
|
1093
955
|
// let summarizeList = metaList.filter((v) => v.type === TypeEnum.summarize);
|
|
@@ -1131,7 +993,7 @@ const useStore = () => {
|
|
|
1131
993
|
columns = await fetchColumnsFn.current(extra, datasourceId);
|
|
1132
994
|
setColumns(tableName, columns);
|
|
1133
995
|
}
|
|
1134
|
-
const _columns = columns
|
|
996
|
+
const _columns = columns.map(v => {
|
|
1135
997
|
return {
|
|
1136
998
|
...v,
|
|
1137
999
|
fieldUuid: v.fieldAlias || uuidv4('field')
|
|
@@ -1145,52 +1007,21 @@ const useStore = () => {
|
|
|
1145
1007
|
_setMeta(newMeta);
|
|
1146
1008
|
};
|
|
1147
1009
|
// 回显
|
|
1148
|
-
|
|
1149
|
-
const setQuotes = _meta => {
|
|
1150
|
-
let newMeta = cloneDeep(_meta);
|
|
1151
|
-
newMeta.table1 = {
|
|
1152
|
-
...newMeta.table1,
|
|
1153
|
-
fieldAlias: newMeta.table1.fieldAlias || newMeta.table1.column,
|
|
1154
|
-
fieldUuid: newMeta.table1.fieldUuid || newMeta.table1.column_id,
|
|
1155
|
-
quotes: newMeta.table1.quotes || newMeta.table1.column
|
|
1156
|
-
};
|
|
1157
|
-
newMeta.table2 = {
|
|
1158
|
-
...newMeta.table2,
|
|
1159
|
-
fieldAlias: newMeta.table2.fieldAlias || newMeta.table2.column,
|
|
1160
|
-
fieldUuid: newMeta.table2.fieldUuid || newMeta.table2.column_id,
|
|
1161
|
-
quotes: newMeta.table2.quotes || newMeta.table2.column
|
|
1162
|
-
};
|
|
1163
|
-
newMeta.expressions = newMeta.expressions?.map(v => {
|
|
1164
|
-
return {
|
|
1165
|
-
...v,
|
|
1166
|
-
left_fieldAlias: v.fieldAlias || v.left_column,
|
|
1167
|
-
left_fieldUuid: v.fieldUuid || v.left_column_id,
|
|
1168
|
-
left_quotes: v.left_quotes || v.left_column,
|
|
1169
|
-
right_fieldAlias: v.right_fieldAlias || v.right_column,
|
|
1170
|
-
right_fieldUuid: v.right_fieldUuid || v.right_column_id,
|
|
1171
|
-
right_quotes: v.right_quotes || v.right_column
|
|
1172
|
-
};
|
|
1173
|
-
});
|
|
1174
|
-
return newMeta;
|
|
1175
|
-
};
|
|
1176
|
-
const setPreData = data => {
|
|
1010
|
+
const setPreData = async data => {
|
|
1177
1011
|
if (data.length) {
|
|
1178
|
-
let _metaList = data
|
|
1012
|
+
let _metaList = data.map((item, groupIndex) => {
|
|
1179
1013
|
let newList = item.list?.map((v, i) => {
|
|
1180
|
-
let newMeta = item.list;
|
|
1014
|
+
let newMeta = cloneDeep(item.list);
|
|
1181
1015
|
// 设置右侧column
|
|
1182
1016
|
if (v.table2?.datasourceId && v.columns.length < 1) {
|
|
1183
|
-
fetchColumns(newMeta[i].table2, newMeta[i].table2.datasourceId,
|
|
1017
|
+
fetchColumns(newMeta[i].table2, newMeta[i].table2.datasourceId, columns => {
|
|
1184
1018
|
if (v.isSubquery) {
|
|
1185
1019
|
let newColumns = [];
|
|
1186
1020
|
const items = getSubColumns(v.subquery);
|
|
1187
|
-
newColumns = items
|
|
1188
|
-
newMeta[i].columns = newColumns
|
|
1021
|
+
newColumns = items.flatMap(item => item.columns);
|
|
1022
|
+
newMeta[i].columns = newColumns;
|
|
1189
1023
|
} else {
|
|
1190
|
-
newMeta[i].columns = columns
|
|
1191
|
-
}
|
|
1192
|
-
if (v.type === TypeEnum.joinData) {
|
|
1193
|
-
newMeta[i] = setQuotes(newMeta[i]);
|
|
1024
|
+
newMeta[i].columns = columns;
|
|
1194
1025
|
}
|
|
1195
1026
|
setMeta(newMeta, groupIndex);
|
|
1196
1027
|
});
|
|
@@ -1200,17 +1031,14 @@ const useStore = () => {
|
|
|
1200
1031
|
}
|
|
1201
1032
|
// 设置column
|
|
1202
1033
|
if (v.table?.datasourceId && v.columns.length < 1) {
|
|
1203
|
-
fetchColumns(newMeta[i].table, newMeta[i].table.datasourceId,
|
|
1034
|
+
fetchColumns(newMeta[i].table, newMeta[i].table.datasourceId, columns => {
|
|
1204
1035
|
if (v.isSubquery) {
|
|
1205
1036
|
let newColumns = [];
|
|
1206
1037
|
const items = getSubColumns(v.subquery);
|
|
1207
1038
|
newColumns = items.flatMap(item => item.columns);
|
|
1208
|
-
newMeta[i].columns = newColumns
|
|
1039
|
+
newMeta[i].columns = newColumns;
|
|
1209
1040
|
} else {
|
|
1210
|
-
newMeta[i].columns = columns
|
|
1211
|
-
}
|
|
1212
|
-
if (v.type === TypeEnum.joinData) {
|
|
1213
|
-
newMeta[i] = setQuotes(newMeta[i]);
|
|
1041
|
+
newMeta[i].columns = columns;
|
|
1214
1042
|
}
|
|
1215
1043
|
setMeta(newMeta, groupIndex);
|
|
1216
1044
|
});
|
|
@@ -1225,8 +1053,7 @@ const useStore = () => {
|
|
|
1225
1053
|
return {
|
|
1226
1054
|
name: item.name || 'default',
|
|
1227
1055
|
list: newList.length < 1 ? defaultMetaList : newList,
|
|
1228
|
-
type: item.type || 'group'
|
|
1229
|
-
union: item.union
|
|
1056
|
+
type: item.type || 'group'
|
|
1230
1057
|
};
|
|
1231
1058
|
});
|
|
1232
1059
|
const validMetaKeys = _metaList.flatMap(group => group.list).map(v => Number(v.metaKey)).filter(num => !isNaN(num));
|
|
@@ -1249,8 +1076,8 @@ const useStore = () => {
|
|
|
1249
1076
|
tableUuid: '',
|
|
1250
1077
|
datasourceId: '',
|
|
1251
1078
|
datasourceName: '',
|
|
1252
|
-
|
|
1253
|
-
|
|
1079
|
+
column: '',
|
|
1080
|
+
column_id: ''
|
|
1254
1081
|
};
|
|
1255
1082
|
if (index === 1) {
|
|
1256
1083
|
table1 = {
|
|
@@ -1259,8 +1086,8 @@ const useStore = () => {
|
|
|
1259
1086
|
alias: mainTable.table.alias,
|
|
1260
1087
|
datasourceId: mainTable.table.datasourceId,
|
|
1261
1088
|
datasourceName: mainTable.table.datasourceName,
|
|
1262
|
-
|
|
1263
|
-
|
|
1089
|
+
column: '',
|
|
1090
|
+
column_id: ''
|
|
1264
1091
|
};
|
|
1265
1092
|
}
|
|
1266
1093
|
item = {
|
|
@@ -1275,8 +1102,8 @@ const useStore = () => {
|
|
|
1275
1102
|
tableUuid: '',
|
|
1276
1103
|
datasourceId: '',
|
|
1277
1104
|
datasourceName: '',
|
|
1278
|
-
|
|
1279
|
-
|
|
1105
|
+
column: '',
|
|
1106
|
+
column_id: ''
|
|
1280
1107
|
},
|
|
1281
1108
|
columns: [],
|
|
1282
1109
|
expressions: []
|
|
@@ -1334,7 +1161,7 @@ const useStore = () => {
|
|
|
1334
1161
|
}
|
|
1335
1162
|
};
|
|
1336
1163
|
}
|
|
1337
|
-
if (type === TypeEnum.
|
|
1164
|
+
if (type === TypeEnum.group) {
|
|
1338
1165
|
// 添加分组
|
|
1339
1166
|
let newMetaList = metaList.slice();
|
|
1340
1167
|
newMetaList.splice(groupIndex + 1, 0, defaultOperator, ...defaultMeta);
|
|
@@ -1385,7 +1212,7 @@ const useStore = () => {
|
|
|
1385
1212
|
setMeta(_metaList, groupIndex);
|
|
1386
1213
|
};
|
|
1387
1214
|
const setColumns = (tableId, columns) => {
|
|
1388
|
-
const _columns = columns
|
|
1215
|
+
const _columns = columns.map(v => {
|
|
1389
1216
|
return {
|
|
1390
1217
|
...v,
|
|
1391
1218
|
fieldUuid: v.fieldUuid || uuidv4('field')
|
|
@@ -1503,8 +1330,7 @@ const useStore = () => {
|
|
|
1503
1330
|
_setShowSubquery,
|
|
1504
1331
|
constantList,
|
|
1505
1332
|
setConstantList,
|
|
1506
|
-
changeAlias
|
|
1507
|
-
popupContainer
|
|
1333
|
+
changeAlias
|
|
1508
1334
|
};
|
|
1509
1335
|
};
|
|
1510
1336
|
|
|
@@ -1906,7 +1732,6 @@ const getComputedTranslate = obj => {
|
|
|
1906
1732
|
};
|
|
1907
1733
|
// 获取元素距离浏览器顶部的距离
|
|
1908
1734
|
const getElementTop = elem => {
|
|
1909
|
-
if (!elem) return 0;
|
|
1910
1735
|
let elemTop = elem.offsetTop;
|
|
1911
1736
|
let pElem = elem.offsetParent;
|
|
1912
1737
|
while (pElem != null) {
|
|
@@ -1920,7 +1745,6 @@ const getElementTop = elem => {
|
|
|
1920
1745
|
};
|
|
1921
1746
|
// 获取元素距离浏览器顶部的距离
|
|
1922
1747
|
const getElementLeft = elem => {
|
|
1923
|
-
if (!elem) return 0;
|
|
1924
1748
|
let elemLeft = elem.offsetLeft;
|
|
1925
1749
|
let pElem = elem.offsetParent;
|
|
1926
1750
|
while (pElem != null) {
|
|
@@ -1932,23 +1756,8 @@ const getElementLeft = elem => {
|
|
|
1932
1756
|
}
|
|
1933
1757
|
return elemLeft;
|
|
1934
1758
|
};
|
|
1935
|
-
|
|
1936
|
-
|
|
1937
|
-
if (!container) return 0;
|
|
1938
|
-
const rect = container.getBoundingClientRect();
|
|
1939
|
-
const windowHeight = window.innerHeight || document.documentElement.clientHeight;
|
|
1940
|
-
// 元素顶部在视口上方 -> 不可见
|
|
1941
|
-
if (rect.bottom < 0) return 0;
|
|
1942
|
-
// 元素底部在视口下方 -> 不可见
|
|
1943
|
-
if (rect.top > windowHeight) return 0;
|
|
1944
|
-
// 可见区域的 top 和 bottom
|
|
1945
|
-
const visibleTop = Math.max(rect.top, 0);
|
|
1946
|
-
const visibleBottom = Math.min(rect.bottom, windowHeight);
|
|
1947
|
-
// 可见高度
|
|
1948
|
-
return visibleBottom - visibleTop;
|
|
1949
|
-
};
|
|
1950
|
-
const getScrollTop = elem => {
|
|
1951
|
-
return elem?.scrollTop || document.documentElement.scrollTop;
|
|
1759
|
+
const getScrollTop = () => {
|
|
1760
|
+
return document.documentElement.scrollTop;
|
|
1952
1761
|
};
|
|
1953
1762
|
// 浏览器可视宽高
|
|
1954
1763
|
const getWindowSize = () => {
|
|
@@ -2427,7 +2236,7 @@ const List = [{
|
|
|
2427
2236
|
const RowLimit$1 = props => {
|
|
2428
2237
|
const {
|
|
2429
2238
|
meta,
|
|
2430
|
-
|
|
2239
|
+
operator,
|
|
2431
2240
|
groupIndex
|
|
2432
2241
|
} = props;
|
|
2433
2242
|
const store = useStore$1();
|
|
@@ -2437,10 +2246,10 @@ const RowLimit$1 = props => {
|
|
|
2437
2246
|
node: e.currentTarget,
|
|
2438
2247
|
content: jsx(SelectList, {
|
|
2439
2248
|
list: List,
|
|
2440
|
-
value:
|
|
2249
|
+
value: operator,
|
|
2441
2250
|
onChange: type => {
|
|
2442
2251
|
let newMeta = store.metaList.slice();
|
|
2443
|
-
newMeta[groupIndex].
|
|
2252
|
+
newMeta[groupIndex].operator = type;
|
|
2444
2253
|
store._setMeta(newMeta);
|
|
2445
2254
|
store.setPopup({
|
|
2446
2255
|
visible: false
|
|
@@ -2463,7 +2272,7 @@ const RowLimit$1 = props => {
|
|
|
2463
2272
|
children: jsx("div", {
|
|
2464
2273
|
className: `Sqb-TableName`,
|
|
2465
2274
|
onClick: e => selectOperator(e),
|
|
2466
|
-
children:
|
|
2275
|
+
children: operator
|
|
2467
2276
|
})
|
|
2468
2277
|
})
|
|
2469
2278
|
})]
|
|
@@ -3519,7 +3328,6 @@ function returnDocument(element) {
|
|
|
3519
3328
|
const outSpacing = 10;
|
|
3520
3329
|
function generateTrigger(PortalComponent) {
|
|
3521
3330
|
class Trigger extends React.Component {
|
|
3522
|
-
resizeObserver = null; // 显式声明 resizeObserver 属性
|
|
3523
3331
|
resetId = -1; // 监听窗口改变事件id 用于组件销毁的时候清除事件
|
|
3524
3332
|
static defaultProps = {
|
|
3525
3333
|
visible: false,
|
|
@@ -3534,39 +3342,11 @@ function generateTrigger(PortalComponent) {
|
|
|
3534
3342
|
this.resetId = winResetEvent.addEvent(this.didUpdate, this, 300);
|
|
3535
3343
|
this.props.container && this.props.container.addEventListener('scroll', this.didUpdate);
|
|
3536
3344
|
this.bindEvent();
|
|
3537
|
-
// 延迟绑定 ResizeObserver 到 ensure the element is ready
|
|
3538
|
-
this.initResizeObserver();
|
|
3539
|
-
}
|
|
3540
|
-
componentDidUpdate(prevProps) {
|
|
3541
|
-
// 如果 children 发生变化,重新初始化观察器
|
|
3542
|
-
if (prevProps.children !== this.props.children) {
|
|
3543
|
-
this.initResizeObserver();
|
|
3544
|
-
}
|
|
3545
3345
|
}
|
|
3546
3346
|
componentWillUnmount() {
|
|
3547
3347
|
winResetEvent.removeEvent(this.resetId);
|
|
3548
3348
|
this.props.container && this.props.container.removeEventListener('scroll', this.didUpdate);
|
|
3549
|
-
if (this.resizeObserver) {
|
|
3550
|
-
this.resizeObserver.disconnect();
|
|
3551
|
-
this.resizeObserver = null;
|
|
3552
|
-
}
|
|
3553
3349
|
}
|
|
3554
|
-
// children高度变化后,从新计算高度
|
|
3555
|
-
initResizeObserver = () => {
|
|
3556
|
-
const targetNode = this.ref.current;
|
|
3557
|
-
if (!targetNode) return;
|
|
3558
|
-
// 如果已经存在 ResizeObserver,先断开连接
|
|
3559
|
-
if (this.resizeObserver) {
|
|
3560
|
-
this.resizeObserver.disconnect();
|
|
3561
|
-
}
|
|
3562
|
-
// 初始化 ResizeObserver 并开始观察目标节点
|
|
3563
|
-
this.resizeObserver = new ResizeObserver(entries => {
|
|
3564
|
-
entries.forEach(entry => {
|
|
3565
|
-
this.didUpdate();
|
|
3566
|
-
});
|
|
3567
|
-
});
|
|
3568
|
-
this.resizeObserver.observe(targetNode);
|
|
3569
|
-
};
|
|
3570
3350
|
bindEvent = () => {
|
|
3571
3351
|
let that = this;
|
|
3572
3352
|
returnDocument().body.addEventListener('click', function (e) {
|
|
@@ -3584,7 +3364,7 @@ function generateTrigger(PortalComponent) {
|
|
|
3584
3364
|
this.props.visible && this.props.closable && this.props.hideVisible();
|
|
3585
3365
|
};
|
|
3586
3366
|
attachParent = popupContainer => {
|
|
3587
|
-
let mountNode =
|
|
3367
|
+
let mountNode = returnDocument().body;
|
|
3588
3368
|
mountNode.appendChild(popupContainer);
|
|
3589
3369
|
};
|
|
3590
3370
|
getCurrentNodePos = () => {
|
|
@@ -3593,9 +3373,8 @@ function generateTrigger(PortalComponent) {
|
|
|
3593
3373
|
container
|
|
3594
3374
|
} = this.props;
|
|
3595
3375
|
return {
|
|
3596
|
-
x: getElementLeft(node)
|
|
3597
|
-
y: getElementTop(node) -
|
|
3598
|
-
t: getElementTop(container),
|
|
3376
|
+
x: getElementLeft(node),
|
|
3377
|
+
y: getElementTop(node) - (container?.scrollTop || 0),
|
|
3599
3378
|
h: node.offsetHeight
|
|
3600
3379
|
};
|
|
3601
3380
|
};
|
|
@@ -3638,21 +3417,19 @@ function generateTrigger(PortalComponent) {
|
|
|
3638
3417
|
didUpdate = () => {
|
|
3639
3418
|
if (!this.props.node) return false;
|
|
3640
3419
|
let {
|
|
3641
|
-
innerSpacing = 10
|
|
3642
|
-
container
|
|
3420
|
+
innerSpacing = 10
|
|
3643
3421
|
} = this.props;
|
|
3644
3422
|
let pos = this.getCurrentNodePos();
|
|
3645
|
-
let posY = pos.y - getScrollTop(
|
|
3423
|
+
let posY = pos.y - getScrollTop();
|
|
3646
3424
|
if (!this.ref) return false;
|
|
3647
3425
|
let realHeight = this.ref?.current?.childNodes?.[0]?.offsetHeight || 0;
|
|
3648
3426
|
if (!realHeight) return false;
|
|
3649
3427
|
let {
|
|
3650
3428
|
height: winH
|
|
3651
3429
|
} = getWindowSize();
|
|
3652
|
-
let
|
|
3653
|
-
let downH = (containerH || winH) - posY - pos.h; // 元素下面可用高度
|
|
3430
|
+
let downH = winH - posY - pos.h; // 元素下面可用高度
|
|
3654
3431
|
let maxHeight = 0;
|
|
3655
|
-
let topHeight = getScrollTop(
|
|
3432
|
+
let topHeight = getScrollTop();
|
|
3656
3433
|
if (downH >= posY || realHeight <= downH - innerSpacing - outSpacing) {
|
|
3657
3434
|
// 下面比上面宽敞 或 下面足够放下所有 放下面
|
|
3658
3435
|
maxHeight = Math.min(realHeight, downH - innerSpacing - outSpacing);
|
|
@@ -3802,7 +3579,7 @@ const SelectColumn = ({
|
|
|
3802
3579
|
});
|
|
3803
3580
|
};
|
|
3804
3581
|
|
|
3805
|
-
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
|
|
3582
|
+
var css_248z$6 = ".Sqb-SelectColumns--box {\n box-sizing: border-box;\n min-width: 1em;\n max-width: 500px;\n background-color: #ffffff;\n overflow: hidden;\n}\n.Sqb-SelectColumns--box .Sqb-List-item {\n display: flex;\n border-radius: 4px;\n margin-top: 2px;\n margin-bottom: 2px;\n}\n.Sqb-SelectColumns--box .Sqb-List-item a {\n flex: auto;\n cursor: pointer;\n display: flex;\n align-items: center;\n}\n.Sqb-SelectColumns--box .Sqb-List-item .List-item-icon {\n display: flex;\n align-items: center;\n color: #b8bbc3;\n}\n.Sqb-SelectColumns--box .Sqb-List-item .List-item-title {\n word-break: break-word;\n word-wrap: anywhere;\n color: #4c5773;\n margin-top: 0;\n margin-bottom: 0;\n font-size: 14px;\n}\n.Sqb-SelectColumns--box .Sqb-List-item .Field-extra {\n display: flex;\n align-items: center;\n padding: 0.5rem;\n cursor: pointer;\n border-left: 2px solid rgba(113, 114, 173, 0.1);\n color: rgba(255, 255, 255, 0.5);\n visibility: hidden;\n}\n.Sqb-SelectColumns--box .Sqb-List-item .Field-extra h4 {\n margin-bottom: 0;\n color: inherit;\n}\n.Sqb-SelectColumns--box .Sqb-List-item .Field-extra svg {\n color: #fff;\n margin-left: 0.5rem;\n}\n.Sqb-SelectColumns--box .Sqb-List-item .Field-extra:hover {\n color: #fff;\n}\n.Sqb-SelectColumns--box .Sqb-List-item:not(.disabled):hover,\n.Sqb-SelectColumns--box .Sqb-List-item.active {\n background-color: #509ee3;\n border-color: rgba(169, 137, 197, 0.2);\n}\n.Sqb-SelectColumns--box .Sqb-List-item:not(.disabled):hover .List-item-icon,\n.Sqb-SelectColumns--box .Sqb-List-item.active .List-item-icon {\n color: #fff !important;\n}\n.Sqb-SelectColumns--box .Sqb-List-item:not(.disabled):hover .List-item-title,\n.Sqb-SelectColumns--box .Sqb-List-item.active .List-item-title {\n color: #fff !important;\n}\n.Sqb-SelectColumns--box .Sqb-List-item:not(.disabled):hover .Field-extra,\n.Sqb-SelectColumns--box .Sqb-List-item.active .Field-extra {\n visibility: visible;\n}\n.Sqb-SelectColumns--box .Sqb-List-item.disabled .List-item-title {\n color: #949aab !important;\n}\n.Sqb-SelectColumns--box .Sqb-List-title {\n display: flex;\n border-radius: 4px;\n}\n.Sqb-SelectColumns--box .Sqb-List-title a {\n flex: auto;\n cursor: default;\n display: flex;\n align-items: center;\n color: #4c5773;\n overflow: hidden;\n}\n.Sqb-SelectColumns--box .Sqb-List-title .List-item-icon {\n display: flex;\n align-items: center;\n}\n.Sqb-SelectColumns--box .Sqb-List-title .List-item-title {\n word-break: break-word;\n word-wrap: anywhere;\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.Sqb-SelectColumns--box .Sqb-List-title .List-title-arrow {\n margin-left: auto;\n}\n.Sqb-SelectColumns--box .Sqb-List-title.active .List-item-icon {\n color: #509ee3;\n}\n.Sqb-SelectColumns--box .Sqb-List-title.shrink {\n cursor: pointer;\n}\n.Sqb-SelectColumns--box .Sqb-List-title.shrink a {\n cursor: pointer;\n}\n.Sqb-SelectColumns--box .Sqb-List-title.shrink:hover a {\n color: #509ee3;\n}\n.Sqb-SelectColumns--box .Sqb-List-title.shrink:hover a .List-item-title {\n color: #509ee3;\n}\n.Sqb-SelectColumns--box .Sqb-List-search {\n display: flex;\n align-items: center;\n flex: 1 0 auto;\n color: #b8bbc3;\n background-color: #fff;\n border: 1px solid #f0f0f0;\n font-size: 14px;\n}\n.Sqb-SelectColumns--box .Sqb-List-search span {\n line-height: 0;\n}\n.Sqb-SelectColumns--box .Sqb-List-search input {\n box-shadow: none;\n outline: 0;\n border: none !important;\n background: transparent;\n color: #4c5773;\n font-size: 1.12em;\n font-weight: 600;\n}\n.Sqb-SelectColumns--box .Sqb-List-search input::-webkit-input-placeholder {\n color: #b8bbc3;\n}\n.Sqb-SelectColumns--box .Sqb-List-search input::-ms-input-placeholder {\n color: #b8bbc3;\n}\n.Sqb-SelectColumns--box.greenGrass .Sqb-List-item:not(.disabled):hover,\n.Sqb-SelectColumns--box.greenGrass .Sqb-List-item.active {\n background-color: #88bf4d;\n}\n.Sqb-SelectColumns--box.greenGrass .Sqb-List-title.active .List-item-icon {\n color: #88bf4d;\n}\n.Sqb-SelectColumns--box.greenGrass .Sqb-List-title.shrink:hover a {\n color: #88bf4d;\n}\n.Sqb-SelectColumns--box.greenGrass .Sqb-List-title.shrink:hover a .List-item-title {\n color: #88bf4d;\n}\n.Sqb-SelectColumns--box.purple .Sqb-List-item:not(.disabled):hover,\n.Sqb-SelectColumns--box.purple .Sqb-List-item.active {\n background-color: #7172ad;\n}\n.Sqb-SelectColumns--box.purple .Sqb-List-title.active .List-item-icon {\n color: #7172ad;\n}\n.Sqb-SelectColumns--box.purple .Sqb-List-title.shrink:hover a {\n color: #7172ad;\n}\n.Sqb-SelectColumns--box.purple .Sqb-List-title.shrink:hover a .List-item-title {\n color: #7172ad;\n}\n.menu-list {\n border: none !important;\n}\n.menu-list .ant-menu-item:hover {\n color: #88bf4d !important;\n}\n.menu-list .ant-menu-item-selected {\n background-color: #88bf4d !important;\n color: #fff !important;\n border-radius: 4px !important;\n}\n";
|
|
3806
3583
|
styleInject(css_248z$6);
|
|
3807
3584
|
|
|
3808
3585
|
const NUMBER_GROUP = [SQL_COLUMN_TYPE.FLOAT, SQL_COLUMN_TYPE.LONG, SQL_COLUMN_TYPE.CURRENCY];
|
|
@@ -3920,8 +3697,7 @@ const SelectJoinColumn = ({
|
|
|
3920
3697
|
})));
|
|
3921
3698
|
}
|
|
3922
3699
|
},
|
|
3923
|
-
children: jsxs("
|
|
3924
|
-
className: 'List-item',
|
|
3700
|
+
children: jsxs("a", {
|
|
3925
3701
|
children: [jsx("span", {
|
|
3926
3702
|
className: 'List-item-icon',
|
|
3927
3703
|
children: jsx(TableIcon, {})
|
|
@@ -3940,7 +3716,7 @@ const SelectJoinColumn = ({
|
|
|
3940
3716
|
})]
|
|
3941
3717
|
})
|
|
3942
3718
|
})
|
|
3943
|
-
}),
|
|
3719
|
+
}), open && jsxs(Fragment, {
|
|
3944
3720
|
children: [!isSummarize && jsx("div", {
|
|
3945
3721
|
className: cx(`Sqb-List-section`),
|
|
3946
3722
|
children: jsxs("div", {
|
|
@@ -4013,8 +3789,8 @@ const SelectJoinColumn = ({
|
|
|
4013
3789
|
realName
|
|
4014
3790
|
});
|
|
4015
3791
|
},
|
|
4016
|
-
children: [jsxs("
|
|
4017
|
-
className: 'p-2
|
|
3792
|
+
children: [jsxs("a", {
|
|
3793
|
+
className: 'p-2',
|
|
4018
3794
|
children: [jsx("span", {
|
|
4019
3795
|
className: 'List-item-icon',
|
|
4020
3796
|
children: IconMap[special_type || database_type] || jsx(LetterAaIcon, {})
|
|
@@ -4053,8 +3829,7 @@ const SelectFilterColumn = ({
|
|
|
4053
3829
|
value,
|
|
4054
3830
|
onChange,
|
|
4055
3831
|
didUpdate,
|
|
4056
|
-
isCustom: _isCustom = false
|
|
4057
|
-
container: _container = null
|
|
3832
|
+
isCustom: _isCustom = false
|
|
4058
3833
|
}) => {
|
|
4059
3834
|
const [curColumn, setCurColumn] = useState(value);
|
|
4060
3835
|
const [condition, setCondition] = useState(value.condition);
|
|
@@ -4471,7 +4246,6 @@ const SelectFilterColumn = ({
|
|
|
4471
4246
|
store.setPopup2({
|
|
4472
4247
|
visible: true,
|
|
4473
4248
|
node: e.currentTarget,
|
|
4474
|
-
container: _container,
|
|
4475
4249
|
content: jsx(SelectList, {
|
|
4476
4250
|
value: valType,
|
|
4477
4251
|
list: store.constantList || [],
|
|
@@ -4494,7 +4268,6 @@ const SelectFilterColumn = ({
|
|
|
4494
4268
|
store.setPopup2({
|
|
4495
4269
|
visible: true,
|
|
4496
4270
|
node: e.currentTarget,
|
|
4497
|
-
container: _container,
|
|
4498
4271
|
content: jsx(SelectList, {
|
|
4499
4272
|
value: valType,
|
|
4500
4273
|
list: [{
|
|
@@ -4529,7 +4302,6 @@ const SelectFilterColumn = ({
|
|
|
4529
4302
|
store.setPopup2({
|
|
4530
4303
|
visible: true,
|
|
4531
4304
|
node: e.currentTarget,
|
|
4532
|
-
container: _container,
|
|
4533
4305
|
content: jsx(SelectJoinColumn, {
|
|
4534
4306
|
data: [..._data],
|
|
4535
4307
|
value: value,
|
|
@@ -5243,17 +5015,17 @@ const IconTypeMap = new Map([[TypeEnum.filter, {
|
|
|
5243
5015
|
name: __('SqlQueryBuilder.rowLimit'),
|
|
5244
5016
|
icon: jsx(RowLimitIcon, {}),
|
|
5245
5017
|
className: 'rowLimit'
|
|
5246
|
-
}], [TypeEnum.
|
|
5018
|
+
}], [TypeEnum.group, {
|
|
5247
5019
|
name: __('SqlQueryBuilder.union'),
|
|
5248
5020
|
icon: jsx(GroupIcon, {}),
|
|
5249
5021
|
className: 'union'
|
|
5250
5022
|
}]]);
|
|
5251
5023
|
// 前端展示的icon顺序 随便改不影响逻辑
|
|
5252
|
-
const DisplayOrder = [TypeEnum.filter, TypeEnum.summarize, TypeEnum.joinData, TypeEnum.permissionTable, TypeEnum.customColumn, TypeEnum.sort, TypeEnum.rowLimit, TypeEnum.
|
|
5024
|
+
const DisplayOrder = [TypeEnum.filter, TypeEnum.summarize, TypeEnum.joinData, TypeEnum.permissionTable, TypeEnum.customColumn, TypeEnum.sort, TypeEnum.rowLimit, TypeEnum.group];
|
|
5253
5025
|
// js逻辑顺序 正常顺序
|
|
5254
|
-
const OrderType = [TypeEnum.data, TypeEnum.joinData, TypeEnum.permissionTable, TypeEnum.customColumn, TypeEnum.filter, TypeEnum.summarize, TypeEnum.sort, TypeEnum.rowLimit, TypeEnum.
|
|
5026
|
+
const OrderType = [TypeEnum.data, TypeEnum.joinData, TypeEnum.permissionTable, TypeEnum.customColumn, TypeEnum.filter, TypeEnum.summarize, TypeEnum.sort, TypeEnum.rowLimit, TypeEnum.group];
|
|
5255
5027
|
// js逻辑顺序 聚合下面的顺序是这个样子
|
|
5256
|
-
const OrderNewType = [TypeEnum.sort, TypeEnum.rowLimit, TypeEnum.joinData, TypeEnum.permissionTable, TypeEnum.customColumn, TypeEnum.filter, TypeEnum.summarize, TypeEnum.
|
|
5028
|
+
const OrderNewType = [TypeEnum.sort, TypeEnum.rowLimit, TypeEnum.joinData, TypeEnum.permissionTable, TypeEnum.customColumn, TypeEnum.filter, TypeEnum.summarize, TypeEnum.group];
|
|
5257
5029
|
const metaIcon = (size, handleClick) => {
|
|
5258
5030
|
return ({
|
|
5259
5031
|
type
|
|
@@ -5358,7 +5130,7 @@ const findNextIcon = (store, props) => {
|
|
|
5358
5130
|
if (meta.table2.name) {
|
|
5359
5131
|
available = OrderType.slice(curLocation + 1);
|
|
5360
5132
|
} else {
|
|
5361
|
-
available = [TypeEnum.customColumn, TypeEnum.filter, TypeEnum.summarize, TypeEnum.
|
|
5133
|
+
available = [TypeEnum.customColumn, TypeEnum.filter, TypeEnum.summarize, TypeEnum.group];
|
|
5362
5134
|
}
|
|
5363
5135
|
} else {
|
|
5364
5136
|
if (isLast) {
|
|
@@ -5380,7 +5152,7 @@ const findNextIcon = (store, props) => {
|
|
|
5380
5152
|
if (meta.customColumn.length || ~joinIndex && prevList[joinIndex].table2.name) {
|
|
5381
5153
|
available = OrderType.slice(curLocation + 1);
|
|
5382
5154
|
} else {
|
|
5383
|
-
available = [TypeEnum.filter, TypeEnum.summarize, TypeEnum.
|
|
5155
|
+
available = [TypeEnum.filter, TypeEnum.summarize, TypeEnum.group];
|
|
5384
5156
|
}
|
|
5385
5157
|
} else {
|
|
5386
5158
|
if (isLast) {
|
|
@@ -5413,7 +5185,7 @@ const findNextIcon = (store, props) => {
|
|
|
5413
5185
|
if (isLast) {
|
|
5414
5186
|
if (!ExistAboveGroupBy) {
|
|
5415
5187
|
if (meta.group.length && !meta.by.length) ; else if (!meta.group.length && !meta.by.length) {
|
|
5416
|
-
available = [TypeEnum.sort, TypeEnum.rowLimit, TypeEnum.
|
|
5188
|
+
available = [TypeEnum.sort, TypeEnum.rowLimit, TypeEnum.group];
|
|
5417
5189
|
} else {
|
|
5418
5190
|
available = OrderNewType;
|
|
5419
5191
|
}
|
|
@@ -5616,7 +5388,7 @@ const TableData = props => {
|
|
|
5616
5388
|
}
|
|
5617
5389
|
})
|
|
5618
5390
|
}), selected ? `${meta.table.datasourceName}.${meta.table.name} ${meta.table?.alias ? `as ${meta.table?.alias}` : ''}` : __('SqlQueryBuilder.pickTable')]
|
|
5619
|
-
}), selected && store.showMainColumn
|
|
5391
|
+
}), selected && store.showMainColumn && store.showFields && jsx("div", {
|
|
5620
5392
|
className: `Sqb-TableColumns`,
|
|
5621
5393
|
onClick: selectColumns,
|
|
5622
5394
|
children: __('SqlQueryBuilder.columns')
|
|
@@ -5631,33 +5403,6 @@ const TableData = props => {
|
|
|
5631
5403
|
};
|
|
5632
5404
|
|
|
5633
5405
|
const PrevResult$1 = 'Previous results';
|
|
5634
|
-
function setQuotes(_meta) {
|
|
5635
|
-
let newMeta = cloneDeep(_meta);
|
|
5636
|
-
newMeta.table1 = {
|
|
5637
|
-
...newMeta.table1,
|
|
5638
|
-
fieldAlias: newMeta.table1.fieldAlias || newMeta.table1.column,
|
|
5639
|
-
fieldUuid: newMeta.table1.fieldUuid || newMeta.table1.column_id,
|
|
5640
|
-
quotes: newMeta.table1.quotes || newMeta.table1.column
|
|
5641
|
-
};
|
|
5642
|
-
newMeta.table2 = {
|
|
5643
|
-
...newMeta.table2,
|
|
5644
|
-
fieldAlias: newMeta.table2.fieldAlias || newMeta.table2.column,
|
|
5645
|
-
fieldUuid: newMeta.table2.fieldUuid || newMeta.table2.column_id,
|
|
5646
|
-
quotes: newMeta.table2.quotes || newMeta.table2.column
|
|
5647
|
-
};
|
|
5648
|
-
newMeta.expressions = newMeta.expressions?.map(v => {
|
|
5649
|
-
return {
|
|
5650
|
-
...v,
|
|
5651
|
-
left_fieldAlias: v.fieldAlias || v.left_column,
|
|
5652
|
-
left_fieldUuid: v.fieldUuid || v.left_column_id,
|
|
5653
|
-
left_quotes: v.left_quotes || v.left_column,
|
|
5654
|
-
right_fieldAlias: v.right_fieldAlias || v.right_column,
|
|
5655
|
-
right_fieldUuid: v.right_fieldUuid || v.right_column_id,
|
|
5656
|
-
right_quotes: v.right_quotes || v.right_column
|
|
5657
|
-
};
|
|
5658
|
-
});
|
|
5659
|
-
return newMeta;
|
|
5660
|
-
}
|
|
5661
5406
|
var FlagLocation;
|
|
5662
5407
|
(function (FlagLocation) {
|
|
5663
5408
|
FlagLocation["TABLE_1"] = "table1";
|
|
@@ -5665,8 +5410,8 @@ var FlagLocation;
|
|
|
5665
5410
|
})(FlagLocation || (FlagLocation = {}));
|
|
5666
5411
|
var ExpressionsEnum;
|
|
5667
5412
|
(function (ExpressionsEnum) {
|
|
5668
|
-
ExpressionsEnum["LEFT"] = "
|
|
5669
|
-
ExpressionsEnum["RIGHT"] = "
|
|
5413
|
+
ExpressionsEnum["LEFT"] = "left_column";
|
|
5414
|
+
ExpressionsEnum["RIGHT"] = "right_column";
|
|
5670
5415
|
})(ExpressionsEnum || (ExpressionsEnum = {}));
|
|
5671
5416
|
const JoinData = props => {
|
|
5672
5417
|
const {
|
|
@@ -5681,12 +5426,7 @@ const JoinData = props => {
|
|
|
5681
5426
|
let table1Selected = Boolean(meta.table1.name);
|
|
5682
5427
|
let table2Selected = Boolean(meta.table2.name);
|
|
5683
5428
|
let subQuerySelected = Boolean(meta.subquery?.[0]?.table?.name);
|
|
5684
|
-
let columnsSelected = meta.table1.
|
|
5685
|
-
useEffect(() => {
|
|
5686
|
-
let newMetaList = store.metaList[groupIndex].list.slice();
|
|
5687
|
-
newMetaList[index] = setQuotes(meta);
|
|
5688
|
-
store.setMeta(newMetaList, groupIndex);
|
|
5689
|
-
}, []);
|
|
5429
|
+
let columnsSelected = meta.table1.column && meta.table2.column;
|
|
5690
5430
|
function selectColumns(e) {
|
|
5691
5431
|
let columns = meta.columns;
|
|
5692
5432
|
!meta.readonly && store.setPopup({
|
|
@@ -5755,9 +5495,8 @@ const JoinData = props => {
|
|
|
5755
5495
|
name: tableName,
|
|
5756
5496
|
tableUuid: data.tableUuid || uuidv4('table'),
|
|
5757
5497
|
alias,
|
|
5758
|
-
|
|
5759
|
-
|
|
5760
|
-
quotes: '',
|
|
5498
|
+
column: '',
|
|
5499
|
+
column_id: '',
|
|
5761
5500
|
datasourceId: data.datasourceId,
|
|
5762
5501
|
datasourceName: data.datasourceName
|
|
5763
5502
|
};
|
|
@@ -5800,9 +5539,8 @@ const JoinData = props => {
|
|
|
5800
5539
|
let type = node.getAttribute('v-data');
|
|
5801
5540
|
let data = [];
|
|
5802
5541
|
let value = {
|
|
5803
|
-
name: meta[type].
|
|
5804
|
-
|
|
5805
|
-
id: meta[type].fieldUuid,
|
|
5542
|
+
name: meta[type].column,
|
|
5543
|
+
id: meta[type].column_id,
|
|
5806
5544
|
table: meta[type].name,
|
|
5807
5545
|
tableId: meta[type].id,
|
|
5808
5546
|
fieldUuid: meta[type].fieldUuid || uuidv4('field'),
|
|
@@ -5920,21 +5658,11 @@ const JoinData = props => {
|
|
|
5920
5658
|
sql,
|
|
5921
5659
|
datasourceId,
|
|
5922
5660
|
datasourceName,
|
|
5923
|
-
id = ''
|
|
5924
|
-
fieldAlias = '',
|
|
5925
|
-
fieldUuid = '',
|
|
5926
|
-
quotes
|
|
5661
|
+
id = ''
|
|
5927
5662
|
} = record;
|
|
5928
5663
|
let newMeta = store.metaList[groupIndex].list.slice();
|
|
5929
|
-
|
|
5930
|
-
|
|
5931
|
-
newMeta[index][type].fieldUuid = fieldUuid;
|
|
5932
|
-
newMeta[index][type].quotes = quotes;
|
|
5933
|
-
} else {
|
|
5934
|
-
newMeta[index][type].fieldAlias = name;
|
|
5935
|
-
newMeta[index][type].fieldUuid = id;
|
|
5936
|
-
newMeta[index][type].quotes = name;
|
|
5937
|
-
}
|
|
5664
|
+
newMeta[index][type].column = name;
|
|
5665
|
+
newMeta[index][type].column_id = id;
|
|
5938
5666
|
if (type === FlagLocation.TABLE_1) {
|
|
5939
5667
|
if (newMeta[index][type].alias !== alias) {
|
|
5940
5668
|
newMeta[index][type].alias = alias;
|
|
@@ -5962,8 +5690,8 @@ const JoinData = props => {
|
|
|
5962
5690
|
let index = findIndex(store.metaList[groupIndex].list, meta);
|
|
5963
5691
|
let table_type = type === ExpressionsEnum.LEFT ? FlagLocation.TABLE_1 : FlagLocation.TABLE_2;
|
|
5964
5692
|
let value = {
|
|
5965
|
-
name: meta.expressions[_ind][
|
|
5966
|
-
id: meta.expressions[_ind][`${type}
|
|
5693
|
+
name: meta.expressions[_ind][type],
|
|
5694
|
+
id: meta.expressions[_ind][`${type}_id`],
|
|
5967
5695
|
table: meta[table_type].name,
|
|
5968
5696
|
fieldUuid: meta[table_type].fieldUuid || uuidv4('field'),
|
|
5969
5697
|
fieldAlias: meta[table_type].fieldAlias || '',
|
|
@@ -6088,23 +5816,11 @@ const JoinData = props => {
|
|
|
6088
5816
|
sql,
|
|
6089
5817
|
datasourceId,
|
|
6090
5818
|
datasourceName,
|
|
6091
|
-
id = ''
|
|
6092
|
-
fieldAlias,
|
|
6093
|
-
fieldUuid,
|
|
6094
|
-
quotes = ''
|
|
5819
|
+
id = ''
|
|
6095
5820
|
} = record;
|
|
6096
5821
|
let newMeta = store.metaList[groupIndex].list.slice();
|
|
6097
|
-
|
|
6098
|
-
|
|
6099
|
-
newMeta[index].expressions[_ind][`${type}_fieldUuid`] = fieldUuid;
|
|
6100
|
-
newMeta[index].expressions[_ind][`${type}_quotes`] = quotes;
|
|
6101
|
-
} else {
|
|
6102
|
-
newMeta[index].expressions[_ind][`${type}_fieldAlias`] = name;
|
|
6103
|
-
newMeta[index].expressions[_ind][`${type}_fieldUuid`] = id;
|
|
6104
|
-
newMeta[index].expressions[_ind][`${type}_quotes`] = name;
|
|
6105
|
-
}
|
|
6106
|
-
// (newMeta[index] as MetaJoin).expressions[_ind][type] = name;
|
|
6107
|
-
// (newMeta[index] as MetaJoin).expressions[_ind][`${type}_id`] = id;
|
|
5822
|
+
newMeta[index].expressions[_ind][type] = name;
|
|
5823
|
+
newMeta[index].expressions[_ind][`${type}_id`] = id;
|
|
6108
5824
|
store.setMeta(newMeta, groupIndex);
|
|
6109
5825
|
store.setPopup({
|
|
6110
5826
|
visible: false
|
|
@@ -6186,11 +5902,10 @@ const JoinData = props => {
|
|
|
6186
5902
|
let oldList = cloneDeep(newMeta[index].subquery);
|
|
6187
5903
|
let _toolbar = subToolbar || toolbar;
|
|
6188
5904
|
_toolbar = _toolbar.filter(v => v !== 'group'); // 子查询不需要分组
|
|
6189
|
-
let zIndex = store.popupContainer.current ? getMaxZIndexInParents(store.popupContainer.current) : 0;
|
|
6190
5905
|
let o = Modal2.openModal({
|
|
6191
5906
|
title: __('SqlQueryBuilder.subquery'),
|
|
6192
5907
|
transparentMask: true,
|
|
6193
|
-
zIndex:
|
|
5908
|
+
zIndex: 200,
|
|
6194
5909
|
content: jsx(Fragment, {
|
|
6195
5910
|
children: jsx(SqlVisionBuilder, {
|
|
6196
5911
|
...other,
|
|
@@ -6208,8 +5923,8 @@ const JoinData = props => {
|
|
|
6208
5923
|
newMeta[index].subquery = newList;
|
|
6209
5924
|
newMeta[index].table2 = {
|
|
6210
5925
|
...newList[0].table,
|
|
6211
|
-
|
|
6212
|
-
|
|
5926
|
+
column: '',
|
|
5927
|
+
column_id: ''
|
|
6213
5928
|
};
|
|
6214
5929
|
const items = getSubColumns(newList);
|
|
6215
5930
|
const newColumns = items.flatMap(item => item.columns);
|
|
@@ -6234,9 +5949,8 @@ const JoinData = props => {
|
|
|
6234
5949
|
let newMeta = store.metaList[groupIndex].list.slice();
|
|
6235
5950
|
newMeta[index].isSubquery = !newMeta[index].isSubquery;
|
|
6236
5951
|
newMeta[index].table2 = {
|
|
6237
|
-
|
|
6238
|
-
|
|
6239
|
-
fieldUuid: '',
|
|
5952
|
+
column: '',
|
|
5953
|
+
column_id: '',
|
|
6240
5954
|
name: '',
|
|
6241
5955
|
// 表名
|
|
6242
5956
|
tableUuid: '',
|
|
@@ -6369,23 +6083,23 @@ const JoinData = props => {
|
|
|
6369
6083
|
children: "on"
|
|
6370
6084
|
}), jsx("div", {
|
|
6371
6085
|
className: cx(`Sqb-TableName`, {
|
|
6372
|
-
notSelected: !meta.table1.
|
|
6086
|
+
notSelected: !meta.table1.column
|
|
6373
6087
|
}),
|
|
6374
6088
|
"v-data": FlagLocation.TABLE_1,
|
|
6375
6089
|
onClick: selectJoinColumn,
|
|
6376
|
-
children: meta.table1.
|
|
6090
|
+
children: meta.table1.column ? meta.table1.column : __('SqlQueryBuilder.pickTable')
|
|
6377
6091
|
}), jsx("span", {
|
|
6378
6092
|
className: 'mr-2 text-gray-500',
|
|
6379
6093
|
children: "="
|
|
6380
6094
|
}), jsx("div", {
|
|
6381
6095
|
className: cx(`Sqb-TableName`, {
|
|
6382
|
-
notSelected: !meta.table2.
|
|
6096
|
+
notSelected: !meta.table2.column
|
|
6383
6097
|
}),
|
|
6384
6098
|
"v-data": FlagLocation.TABLE_2,
|
|
6385
6099
|
onClick: selectJoinColumn,
|
|
6386
|
-
children: meta.table2.
|
|
6100
|
+
children: meta.table2.column ? meta.table2.column : __('SqlQueryBuilder.pickTable')
|
|
6387
6101
|
})]
|
|
6388
|
-
}), meta.table1.
|
|
6102
|
+
}), meta.table1.column_id && meta.table2.column_id && meta.expressions?.map((v, i) => {
|
|
6389
6103
|
return jsxs("div", {
|
|
6390
6104
|
className: cx(`Sqb-where block`),
|
|
6391
6105
|
children: [jsx("span", {
|
|
@@ -6414,12 +6128,12 @@ const JoinData = props => {
|
|
|
6414
6128
|
children: v.left_constant ? v.left_constant : __('SqlQueryBuilder.pickConstant')
|
|
6415
6129
|
}), (!v.left_type || v.left_type === 'field') && jsx("div", {
|
|
6416
6130
|
className: cx(`Sqb-TableName`, {
|
|
6417
|
-
notSelected: !v.
|
|
6131
|
+
notSelected: !v.left_column
|
|
6418
6132
|
}),
|
|
6419
6133
|
"v-data": ExpressionsEnum.LEFT,
|
|
6420
6134
|
"v-index": i,
|
|
6421
6135
|
onClick: selectMoreJoinColumn,
|
|
6422
|
-
children: v.
|
|
6136
|
+
children: v.left_column ? v.left_column : __('SqlQueryBuilder.pickTable')
|
|
6423
6137
|
}), jsx(Tooltip, {
|
|
6424
6138
|
title: __('SqlQueryBuilder.switch'),
|
|
6425
6139
|
children: jsx(Button, {
|
|
@@ -6458,12 +6172,12 @@ const JoinData = props => {
|
|
|
6458
6172
|
children: v.right_constant ? v.right_constant : __('SqlQueryBuilder.pickConstant')
|
|
6459
6173
|
}), (!v.right_type || v.right_type === 'field') && jsx("div", {
|
|
6460
6174
|
className: cx(`Sqb-TableName`, {
|
|
6461
|
-
notSelected: !v.
|
|
6175
|
+
notSelected: !v.right_column
|
|
6462
6176
|
}),
|
|
6463
6177
|
"v-data": ExpressionsEnum.RIGHT,
|
|
6464
6178
|
"v-index": i,
|
|
6465
6179
|
onClick: selectMoreJoinColumn,
|
|
6466
|
-
children: v.
|
|
6180
|
+
children: v.right_column ? v.right_column : __('SqlQueryBuilder.pickTable')
|
|
6467
6181
|
}), jsx(Tooltip, {
|
|
6468
6182
|
title: __('SqlQueryBuilder.switch'),
|
|
6469
6183
|
children: jsx(Button, {
|
|
@@ -6489,15 +6203,14 @@ const JoinData = props => {
|
|
|
6489
6203
|
let newMeta = store.metaList[groupIndex].list.slice();
|
|
6490
6204
|
newMeta[index].expressions.splice(i + 1, 0, {
|
|
6491
6205
|
operator: 'and',
|
|
6492
|
-
|
|
6493
|
-
|
|
6494
|
-
left_quotes: '',
|
|
6206
|
+
left_column: '',
|
|
6207
|
+
left_column_id: '',
|
|
6495
6208
|
left_string: '',
|
|
6209
|
+
left_isString: false,
|
|
6496
6210
|
left_type: 'field',
|
|
6497
6211
|
left_constant: '',
|
|
6498
|
-
|
|
6499
|
-
|
|
6500
|
-
right_quotes: '',
|
|
6212
|
+
right_column: '',
|
|
6213
|
+
right_column_id: '',
|
|
6501
6214
|
right_string: '',
|
|
6502
6215
|
right_isString: false,
|
|
6503
6216
|
right_type: 'field',
|
|
@@ -6522,7 +6235,7 @@ const JoinData = props => {
|
|
|
6522
6235
|
})
|
|
6523
6236
|
})]
|
|
6524
6237
|
}, i);
|
|
6525
|
-
}), meta.table1.
|
|
6238
|
+
}), meta.table1.column_id && meta.table2.column_id && (meta.expressions?.length || 0) < 1 && jsx(Tooltip, {
|
|
6526
6239
|
title: __('SqlQueryBuilder.add'),
|
|
6527
6240
|
children: jsx(Button, {
|
|
6528
6241
|
disabled: meta.readonly,
|
|
@@ -6535,15 +6248,14 @@ const JoinData = props => {
|
|
|
6535
6248
|
let newMeta = store.metaList[groupIndex].list.slice();
|
|
6536
6249
|
newMeta[index].expressions = [{
|
|
6537
6250
|
operator: 'and',
|
|
6538
|
-
|
|
6539
|
-
|
|
6540
|
-
left_quotes: '',
|
|
6251
|
+
left_column: '',
|
|
6252
|
+
left_column_id: '',
|
|
6541
6253
|
left_string: '',
|
|
6254
|
+
left_isString: false,
|
|
6542
6255
|
left_type: 'field',
|
|
6543
6256
|
left_constant: '',
|
|
6544
|
-
|
|
6545
|
-
|
|
6546
|
-
right_quotes: '',
|
|
6257
|
+
right_column: '',
|
|
6258
|
+
right_column_id: '',
|
|
6547
6259
|
right_string: '',
|
|
6548
6260
|
right_isString: false,
|
|
6549
6261
|
right_constant: '',
|
|
@@ -6694,12 +6406,12 @@ const CaseEditor = props => {
|
|
|
6694
6406
|
onOk,
|
|
6695
6407
|
onCancel
|
|
6696
6408
|
} = props;
|
|
6697
|
-
|
|
6409
|
+
const [popup, setPopup] = useState({
|
|
6410
|
+
visible: false
|
|
6411
|
+
}); // 弹框信息
|
|
6698
6412
|
const [caseList, setCaseList] = useState(value.formulaList || []);
|
|
6699
6413
|
const [name, setName] = useState(value?.name || ''); // 表达式名字
|
|
6700
6414
|
const [ind, setInd] = useState(-1);
|
|
6701
|
-
const ref = useRef(null);
|
|
6702
|
-
const store = useStore$1();
|
|
6703
6415
|
const filterCase = useMemo(() => {
|
|
6704
6416
|
const hasCase = caseList.some(item => item.type === OptionsTypeEnum.OTHER && item.operator === 'case');
|
|
6705
6417
|
if (hasCase) {
|
|
@@ -6711,22 +6423,24 @@ const CaseEditor = props => {
|
|
|
6711
6423
|
const usable = useMemo(() => {
|
|
6712
6424
|
return Array.from(caseList).length > 0 && name;
|
|
6713
6425
|
}, [caseList, name]);
|
|
6714
|
-
|
|
6715
|
-
|
|
6716
|
-
|
|
6717
|
-
|
|
6718
|
-
|
|
6426
|
+
const popupContent = useMemo(() => {
|
|
6427
|
+
let {
|
|
6428
|
+
visible,
|
|
6429
|
+
content
|
|
6430
|
+
} = popup;
|
|
6431
|
+
if (!visible) return null;
|
|
6432
|
+
return content;
|
|
6433
|
+
}, [popup]);
|
|
6719
6434
|
function closePopup() {
|
|
6720
|
-
|
|
6435
|
+
setPopup({
|
|
6721
6436
|
visible: false
|
|
6722
6437
|
});
|
|
6723
6438
|
}
|
|
6724
6439
|
// 字段
|
|
6725
6440
|
function handleField(e, i, val) {
|
|
6726
|
-
|
|
6441
|
+
setPopup({
|
|
6727
6442
|
visible: true,
|
|
6728
6443
|
node: e.currentTarget,
|
|
6729
|
-
container: ref.current,
|
|
6730
6444
|
content: jsx(SelectJoinColumn, {
|
|
6731
6445
|
data: data,
|
|
6732
6446
|
value: val,
|
|
@@ -6734,13 +6448,8 @@ const CaseEditor = props => {
|
|
|
6734
6448
|
isGroup: true,
|
|
6735
6449
|
// @ts-ignore
|
|
6736
6450
|
onGroup: data => {
|
|
6737
|
-
let _data = cloneDeep(data);
|
|
6738
|
-
if (_data.alias != SummarizeAlias$1) {
|
|
6739
|
-
_data.fieldAlias = _data.name;
|
|
6740
|
-
_data.fieldUuid = uuidv4('field');
|
|
6741
|
-
}
|
|
6742
6451
|
const _caseList = caseList.slice();
|
|
6743
|
-
_caseList[i].expression =
|
|
6452
|
+
_caseList[i].expression = data;
|
|
6744
6453
|
setCaseList(_caseList);
|
|
6745
6454
|
closePopup();
|
|
6746
6455
|
}
|
|
@@ -6756,23 +6465,16 @@ const CaseEditor = props => {
|
|
|
6756
6465
|
};
|
|
6757
6466
|
// 表达式
|
|
6758
6467
|
function handleExpression(e, i, val) {
|
|
6759
|
-
|
|
6468
|
+
setPopup({
|
|
6760
6469
|
visible: true,
|
|
6761
6470
|
node: e.currentTarget,
|
|
6762
|
-
container: ref.current,
|
|
6763
6471
|
content: jsx(SelectFilter, {
|
|
6764
6472
|
isCustom: true,
|
|
6765
|
-
container: ref.current,
|
|
6766
6473
|
data: data,
|
|
6767
6474
|
value: val,
|
|
6768
6475
|
onChange: data => {
|
|
6769
|
-
let _data = cloneDeep(data);
|
|
6770
|
-
if (_data.alias != SummarizeAlias$1) {
|
|
6771
|
-
_data.fieldAlias = _data.name;
|
|
6772
|
-
_data.fieldUuid = uuidv4('field');
|
|
6773
|
-
}
|
|
6774
6476
|
const _caseList = caseList.slice();
|
|
6775
|
-
_caseList[i].expression =
|
|
6477
|
+
_caseList[i].expression = data;
|
|
6776
6478
|
setCaseList(_caseList);
|
|
6777
6479
|
closePopup();
|
|
6778
6480
|
}
|
|
@@ -6815,7 +6517,8 @@ const CaseEditor = props => {
|
|
|
6815
6517
|
const _onOk = () => {
|
|
6816
6518
|
typeof onOk === 'function' && onOk?.({
|
|
6817
6519
|
name,
|
|
6818
|
-
formulaList: caseList
|
|
6520
|
+
formulaList: caseList,
|
|
6521
|
+
formula: ''
|
|
6819
6522
|
});
|
|
6820
6523
|
};
|
|
6821
6524
|
// 分段
|
|
@@ -6963,7 +6666,6 @@ const CaseEditor = props => {
|
|
|
6963
6666
|
};
|
|
6964
6667
|
return jsxs("div", {
|
|
6965
6668
|
className: 'custom-box',
|
|
6966
|
-
ref: ref,
|
|
6967
6669
|
children: [jsx(VisualBox$1, {
|
|
6968
6670
|
children: jsx("div", {
|
|
6969
6671
|
className: `Sqb-item Sqb-case-editor mb-2 mt-2`,
|
|
@@ -7101,6 +6803,13 @@ const CaseEditor = props => {
|
|
|
7101
6803
|
})]
|
|
7102
6804
|
})
|
|
7103
6805
|
})
|
|
6806
|
+
}), jsx(Popup, {
|
|
6807
|
+
visible: popup.visible,
|
|
6808
|
+
closable: true,
|
|
6809
|
+
node: popup.node,
|
|
6810
|
+
innerSpacing: popup.innerSpacing,
|
|
6811
|
+
hideVisible: closePopup,
|
|
6812
|
+
children: popupContent
|
|
7104
6813
|
}), jsx("div", {
|
|
7105
6814
|
className: `btns p-4`,
|
|
7106
6815
|
children: jsxs("div", {
|
|
@@ -7232,15 +6941,14 @@ const CustomColumn = props => {
|
|
|
7232
6941
|
}
|
|
7233
6942
|
return data;
|
|
7234
6943
|
}
|
|
7235
|
-
//
|
|
6944
|
+
// 子查询弹窗
|
|
7236
6945
|
const showSubQuery = (e, i) => {
|
|
7237
6946
|
let newMeta = store.metaList[groupIndex].list.slice();
|
|
7238
6947
|
const _value = newMeta[index].customColumn[i] || [];
|
|
7239
|
-
let zIndex = store.popupContainer.current ? getMaxZIndexInParents(store.popupContainer.current) : 0;
|
|
7240
6948
|
let o = Modal2.openModal({
|
|
7241
6949
|
title: __('SqlQueryBuilder.customExpression'),
|
|
7242
6950
|
transparentMask: true,
|
|
7243
|
-
zIndex:
|
|
6951
|
+
zIndex: 200,
|
|
7244
6952
|
content: jsx(Fragment, {
|
|
7245
6953
|
children: jsx(Provider, {
|
|
7246
6954
|
value: store,
|
|
@@ -7500,7 +7208,7 @@ const Filter = props => {
|
|
|
7500
7208
|
let newMeta = store.metaList[groupIndex].list.slice();
|
|
7501
7209
|
let val = filter[i];
|
|
7502
7210
|
if (val.type === Filter_TypeEnum.NOT_EXISTS) {
|
|
7503
|
-
|
|
7211
|
+
showSubQuery(i, '');
|
|
7504
7212
|
return;
|
|
7505
7213
|
}
|
|
7506
7214
|
let data = getColumns();
|
|
@@ -7599,10 +7307,10 @@ const Filter = props => {
|
|
|
7599
7307
|
newMeta[index].filter = [..._filter];
|
|
7600
7308
|
setInd(-1);
|
|
7601
7309
|
};
|
|
7602
|
-
//
|
|
7603
|
-
const
|
|
7310
|
+
// 子查询弹窗
|
|
7311
|
+
const showSubQuery = (i, position) => {
|
|
7604
7312
|
const {
|
|
7605
|
-
|
|
7313
|
+
subToolbar,
|
|
7606
7314
|
toolbar,
|
|
7607
7315
|
...other
|
|
7608
7316
|
} = store.preProps;
|
|
@@ -7610,13 +7318,12 @@ const Filter = props => {
|
|
|
7610
7318
|
let index = findIndex(store.metaList[groupIndex].list, meta);
|
|
7611
7319
|
let _value = position ? [] : newMeta[index].filter[i]?.subquery || [];
|
|
7612
7320
|
let oldList = position ? [] : cloneDeep(newMeta[index].filter[i]?.subquery || []);
|
|
7613
|
-
let _toolbar =
|
|
7321
|
+
let _toolbar = subToolbar || toolbar;
|
|
7614
7322
|
_toolbar = _toolbar.filter(v => v !== 'group'); // 子查询不需要分组
|
|
7615
|
-
let zIndex = store.popupContainer.current ? getMaxZIndexInParents(store.popupContainer.current) : null;
|
|
7616
7323
|
let o = Modal2.openModal({
|
|
7617
7324
|
title: 'NOT EXISTS',
|
|
7618
7325
|
transparentMask: true,
|
|
7619
|
-
zIndex:
|
|
7326
|
+
zIndex: 200,
|
|
7620
7327
|
content: jsx(Fragment, {
|
|
7621
7328
|
children: jsx(SqlVisionBuilder, {
|
|
7622
7329
|
...other,
|
|
@@ -7709,7 +7416,7 @@ const Filter = props => {
|
|
|
7709
7416
|
if (type === Filter_TypeEnum.EXPRESSION) {
|
|
7710
7417
|
handleAdd(_e);
|
|
7711
7418
|
} else if (type === Filter_TypeEnum.NOT_EXISTS) {
|
|
7712
|
-
|
|
7419
|
+
showSubQuery(_index, _type);
|
|
7713
7420
|
}
|
|
7714
7421
|
}
|
|
7715
7422
|
})
|
|
@@ -7776,7 +7483,7 @@ const Filter = props => {
|
|
|
7776
7483
|
}, i) : jsxs("div", {
|
|
7777
7484
|
className: `Sqb-TableName purple-name`,
|
|
7778
7485
|
onClick: e => handleUpdate(e, i),
|
|
7779
|
-
children: [v.
|
|
7486
|
+
children: [v.quotes, jsx("span", {
|
|
7780
7487
|
style: {
|
|
7781
7488
|
fontSize: 0
|
|
7782
7489
|
},
|
|
@@ -7952,7 +7659,7 @@ const GroupBy = props => {
|
|
|
7952
7659
|
newMeta[index].by.splice(i, 1, data);
|
|
7953
7660
|
// @ts-ignore
|
|
7954
7661
|
newMeta[index].by = newMeta[index].by.map(v => {
|
|
7955
|
-
const fieldAlias = `${v.alias}__${v.name}`;
|
|
7662
|
+
const fieldAlias = v.fieldAlias || `${v.alias}__${v.name}`;
|
|
7956
7663
|
return {
|
|
7957
7664
|
...v,
|
|
7958
7665
|
sql: `${v.alias}.${v.realName || v.name} AS ${fieldAlias}`,
|
|
@@ -7986,8 +7693,8 @@ const GroupBy = props => {
|
|
|
7986
7693
|
quotes: '',
|
|
7987
7694
|
datasourceId: '',
|
|
7988
7695
|
datasourceName: '',
|
|
7989
|
-
|
|
7990
|
-
|
|
7696
|
+
column: '',
|
|
7697
|
+
column_id: '',
|
|
7991
7698
|
summarizeType: MetaSummarize_Enum.BY
|
|
7992
7699
|
};
|
|
7993
7700
|
store.setPopup({
|
|
@@ -8004,7 +7711,7 @@ const GroupBy = props => {
|
|
|
8004
7711
|
newMeta[index].by.push(data);
|
|
8005
7712
|
// @ts-ignore
|
|
8006
7713
|
newMeta[index].by = newMeta[index].by.map(v => {
|
|
8007
|
-
const fieldAlias = `${v.alias}__${v.name}`;
|
|
7714
|
+
const fieldAlias = v.fieldAlias || `${v.alias}__${v.name}`;
|
|
8008
7715
|
return {
|
|
8009
7716
|
...v,
|
|
8010
7717
|
sql: `${v.alias}.${v.realName || v.name} AS ${fieldAlias}`,
|
|
@@ -8248,8 +7955,8 @@ const SelectIndex = props => {
|
|
|
8248
7955
|
quotes: '',
|
|
8249
7956
|
datasourceId: '',
|
|
8250
7957
|
datasourceName: '',
|
|
8251
|
-
|
|
8252
|
-
|
|
7958
|
+
column: '',
|
|
7959
|
+
column_id: '',
|
|
8253
7960
|
summarizeType: MetaSummarize_Enum.GROUP
|
|
8254
7961
|
};
|
|
8255
7962
|
store.setPopup({
|
|
@@ -8819,8 +8526,7 @@ const Metabase = props => {
|
|
|
8819
8526
|
} = props;
|
|
8820
8527
|
const store = useStore$1();
|
|
8821
8528
|
const [saveLoading, setSaveLoading] = useState(false);
|
|
8822
|
-
|
|
8823
|
-
// store.setPopupContainer(popupContainer);
|
|
8529
|
+
const popupContainer = useRef();
|
|
8824
8530
|
const popupContent = useMemo(() => {
|
|
8825
8531
|
let {
|
|
8826
8532
|
visible,
|
|
@@ -8839,35 +8545,40 @@ const Metabase = props => {
|
|
|
8839
8545
|
}, [store.popupData2]);
|
|
8840
8546
|
const onSave = async () => {
|
|
8841
8547
|
let intercept = false; // 是否返回
|
|
8842
|
-
const _metaList = splitByUnion(store.metaList);
|
|
8843
8548
|
store.metaList.map(v => {
|
|
8844
|
-
if (v.type !== '
|
|
8549
|
+
if (v.type !== 'group' && !(v.list?.[0]).table.name) {
|
|
8845
8550
|
intercept = true;
|
|
8846
8551
|
return Toast.warning(__('data.pleaseSelectDataTable'));
|
|
8847
8552
|
}
|
|
8848
8553
|
});
|
|
8849
8554
|
if (saveLoading || intercept) return null;
|
|
8850
8555
|
setSaveLoading(true);
|
|
8851
|
-
|
|
8556
|
+
if (store.toolbar.includes('group')) {
|
|
8557
|
+
// 分组
|
|
8558
|
+
await onOk?.(store.metaList);
|
|
8559
|
+
} else {
|
|
8560
|
+
// 非分组
|
|
8561
|
+
await onOk?.(store.metaList[0].list);
|
|
8562
|
+
}
|
|
8852
8563
|
setSaveLoading(false);
|
|
8853
8564
|
};
|
|
8854
|
-
let zIndex =
|
|
8565
|
+
let zIndex = popupContainer.current ? getMaxZIndexInParents(popupContainer.current) : null;
|
|
8855
8566
|
return (
|
|
8856
8567
|
// @ts-ignore
|
|
8857
8568
|
jsx(VisualBox, {
|
|
8858
|
-
ref:
|
|
8569
|
+
ref: popupContainer,
|
|
8859
8570
|
children: jsxs("div", {
|
|
8860
8571
|
className: 'Sqb',
|
|
8861
8572
|
children: [store.metaList.map((v, index) => {
|
|
8862
|
-
if (v.type === '
|
|
8573
|
+
if (v.type === 'group' && v.operator) {
|
|
8863
8574
|
return jsx("div", {
|
|
8864
8575
|
className: cx(`Sqb-list`),
|
|
8865
8576
|
children: jsx(RowLimit$1, {
|
|
8866
|
-
|
|
8577
|
+
operator: v.operator,
|
|
8867
8578
|
meta: v,
|
|
8868
8579
|
groupIndex: index
|
|
8869
8580
|
})
|
|
8870
|
-
}, '
|
|
8581
|
+
}, 'group' + index);
|
|
8871
8582
|
}
|
|
8872
8583
|
return jsx("div", {
|
|
8873
8584
|
className: cx(`Sqb-list`),
|
|
@@ -8892,8 +8603,8 @@ const Metabase = props => {
|
|
|
8892
8603
|
disabled: saveLoading,
|
|
8893
8604
|
onClick: onSave,
|
|
8894
8605
|
children: btnText || __('SqlQueryBuilder.visualize')
|
|
8895
|
-
}) : null,
|
|
8896
|
-
container:
|
|
8606
|
+
}) : null, popupContainer.current && jsx(Popup, {
|
|
8607
|
+
container: popupContainer.current,
|
|
8897
8608
|
visible: store.popupData.visible,
|
|
8898
8609
|
node: store.popupData.node,
|
|
8899
8610
|
closable: store.popupClosable,
|
|
@@ -8904,8 +8615,8 @@ const Metabase = props => {
|
|
|
8904
8615
|
});
|
|
8905
8616
|
},
|
|
8906
8617
|
children: popupContent
|
|
8907
|
-
}),
|
|
8908
|
-
container:
|
|
8618
|
+
}), popupContainer.current && jsx(Popup, {
|
|
8619
|
+
container: popupContainer.current,
|
|
8909
8620
|
visible: store.popupData2.visible,
|
|
8910
8621
|
node: store.popupData2.node,
|
|
8911
8622
|
closable: store.popupClosable2,
|
|
@@ -8954,9 +8665,15 @@ const SqlVisionBuilder = /*#__PURE__*/React__default.forwardRef((props, ref) =>
|
|
|
8954
8665
|
store.setProps(props);
|
|
8955
8666
|
}, [props]);
|
|
8956
8667
|
useEffect(() => {
|
|
8957
|
-
|
|
8958
|
-
|
|
8959
|
-
|
|
8668
|
+
if (toolbar.includes('group')) {
|
|
8669
|
+
store.setPreData(value);
|
|
8670
|
+
} else {
|
|
8671
|
+
store.setPreData([{
|
|
8672
|
+
name: 'default',
|
|
8673
|
+
list: value
|
|
8674
|
+
}]);
|
|
8675
|
+
}
|
|
8676
|
+
}, [value, toolbar]);
|
|
8960
8677
|
useEffect(() => {
|
|
8961
8678
|
store.setSourceList(sourceList);
|
|
8962
8679
|
}, [sourceList]);
|