@gingkoo/pandora-metabase 1.0.0-alpha.18 → 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 +247 -470
- 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,56 +1007,21 @@ const useStore = () => {
|
|
|
1145
1007
|
_setMeta(newMeta);
|
|
1146
1008
|
};
|
|
1147
1009
|
// 回显
|
|
1148
|
-
|
|
1149
|
-
const setQuotes = newMeta => {
|
|
1150
|
-
newMeta.table1 = {
|
|
1151
|
-
...newMeta.table1,
|
|
1152
|
-
fieldAlias: newMeta.table1.fieldAlias || newMeta.table1.column,
|
|
1153
|
-
fieldUuid: newMeta.table1.fieldUuid || uuidv4('field'),
|
|
1154
|
-
quotes: newMeta.table1.quotes || newMeta.table1.column,
|
|
1155
|
-
tableUuid: newMeta.table1.tableUuid || uuidv4('table')
|
|
1156
|
-
};
|
|
1157
|
-
newMeta.table2 = {
|
|
1158
|
-
...newMeta.table2,
|
|
1159
|
-
fieldAlias: newMeta.table2.fieldAlias || newMeta.table2.column,
|
|
1160
|
-
fieldUuid: newMeta.table2.fieldUuid || uuidv4('field'),
|
|
1161
|
-
quotes: newMeta.table2.quotes || newMeta.table2.column,
|
|
1162
|
-
tableUuid: newMeta.table2.tableUuid || uuidv4('table')
|
|
1163
|
-
};
|
|
1164
|
-
newMeta.expressions = newMeta.expressions?.map(v => {
|
|
1165
|
-
return {
|
|
1166
|
-
...v,
|
|
1167
|
-
left_fieldAlias: v.fieldAlias || v.left_column,
|
|
1168
|
-
left_fieldUuid: v.fieldUuid || uuidv4('field'),
|
|
1169
|
-
left_quotes: v.left_quotes || v.left_column,
|
|
1170
|
-
right_fieldAlias: v.right_fieldAlias || v.right_column,
|
|
1171
|
-
right_fieldUuid: v.right_fieldUuid || uuidv4('field'),
|
|
1172
|
-
right_quotes: v.right_quotes || v.right_column
|
|
1173
|
-
};
|
|
1174
|
-
});
|
|
1175
|
-
return newMeta;
|
|
1176
|
-
};
|
|
1177
|
-
const setPreData = data => {
|
|
1010
|
+
const setPreData = async data => {
|
|
1178
1011
|
if (data.length) {
|
|
1179
|
-
let _metaList = data
|
|
1012
|
+
let _metaList = data.map((item, groupIndex) => {
|
|
1180
1013
|
let newList = item.list?.map((v, i) => {
|
|
1181
|
-
let newMeta = item.list;
|
|
1182
|
-
if (v.table) {
|
|
1183
|
-
v.table.tableUuid = v.table.tableUuid || uuidv4('table');
|
|
1184
|
-
}
|
|
1185
|
-
if (v.type === TypeEnum.joinData) {
|
|
1186
|
-
newMeta[i] = setQuotes(newMeta[i]);
|
|
1187
|
-
}
|
|
1014
|
+
let newMeta = cloneDeep(item.list);
|
|
1188
1015
|
// 设置右侧column
|
|
1189
1016
|
if (v.table2?.datasourceId && v.columns.length < 1) {
|
|
1190
|
-
fetchColumns(newMeta[i].table2, newMeta[i].table2.datasourceId,
|
|
1017
|
+
fetchColumns(newMeta[i].table2, newMeta[i].table2.datasourceId, columns => {
|
|
1191
1018
|
if (v.isSubquery) {
|
|
1192
1019
|
let newColumns = [];
|
|
1193
1020
|
const items = getSubColumns(v.subquery);
|
|
1194
|
-
newColumns = items
|
|
1195
|
-
newMeta[i].columns = newColumns
|
|
1021
|
+
newColumns = items.flatMap(item => item.columns);
|
|
1022
|
+
newMeta[i].columns = newColumns;
|
|
1196
1023
|
} else {
|
|
1197
|
-
newMeta[i].columns = columns
|
|
1024
|
+
newMeta[i].columns = columns;
|
|
1198
1025
|
}
|
|
1199
1026
|
setMeta(newMeta, groupIndex);
|
|
1200
1027
|
});
|
|
@@ -1204,18 +1031,15 @@ const useStore = () => {
|
|
|
1204
1031
|
}
|
|
1205
1032
|
// 设置column
|
|
1206
1033
|
if (v.table?.datasourceId && v.columns.length < 1) {
|
|
1207
|
-
fetchColumns(newMeta[i].table, newMeta[i].table.datasourceId,
|
|
1034
|
+
fetchColumns(newMeta[i].table, newMeta[i].table.datasourceId, columns => {
|
|
1208
1035
|
if (v.isSubquery) {
|
|
1209
1036
|
let newColumns = [];
|
|
1210
1037
|
const items = getSubColumns(v.subquery);
|
|
1211
1038
|
newColumns = items.flatMap(item => item.columns);
|
|
1212
|
-
newMeta[i].columns = newColumns
|
|
1039
|
+
newMeta[i].columns = newColumns;
|
|
1213
1040
|
} else {
|
|
1214
|
-
newMeta[i].columns = columns
|
|
1041
|
+
newMeta[i].columns = columns;
|
|
1215
1042
|
}
|
|
1216
|
-
// if (v.type === TypeEnum.joinData) {
|
|
1217
|
-
// newMeta[i] = setQuotes(newMeta[i]);
|
|
1218
|
-
// }
|
|
1219
1043
|
setMeta(newMeta, groupIndex);
|
|
1220
1044
|
});
|
|
1221
1045
|
return {
|
|
@@ -1229,8 +1053,7 @@ const useStore = () => {
|
|
|
1229
1053
|
return {
|
|
1230
1054
|
name: item.name || 'default',
|
|
1231
1055
|
list: newList.length < 1 ? defaultMetaList : newList,
|
|
1232
|
-
type: item.type || 'group'
|
|
1233
|
-
union: item.union
|
|
1056
|
+
type: item.type || 'group'
|
|
1234
1057
|
};
|
|
1235
1058
|
});
|
|
1236
1059
|
const validMetaKeys = _metaList.flatMap(group => group.list).map(v => Number(v.metaKey)).filter(num => !isNaN(num));
|
|
@@ -1253,8 +1076,8 @@ const useStore = () => {
|
|
|
1253
1076
|
tableUuid: '',
|
|
1254
1077
|
datasourceId: '',
|
|
1255
1078
|
datasourceName: '',
|
|
1256
|
-
|
|
1257
|
-
|
|
1079
|
+
column: '',
|
|
1080
|
+
column_id: ''
|
|
1258
1081
|
};
|
|
1259
1082
|
if (index === 1) {
|
|
1260
1083
|
table1 = {
|
|
@@ -1263,8 +1086,8 @@ const useStore = () => {
|
|
|
1263
1086
|
alias: mainTable.table.alias,
|
|
1264
1087
|
datasourceId: mainTable.table.datasourceId,
|
|
1265
1088
|
datasourceName: mainTable.table.datasourceName,
|
|
1266
|
-
|
|
1267
|
-
|
|
1089
|
+
column: '',
|
|
1090
|
+
column_id: ''
|
|
1268
1091
|
};
|
|
1269
1092
|
}
|
|
1270
1093
|
item = {
|
|
@@ -1279,8 +1102,8 @@ const useStore = () => {
|
|
|
1279
1102
|
tableUuid: '',
|
|
1280
1103
|
datasourceId: '',
|
|
1281
1104
|
datasourceName: '',
|
|
1282
|
-
|
|
1283
|
-
|
|
1105
|
+
column: '',
|
|
1106
|
+
column_id: ''
|
|
1284
1107
|
},
|
|
1285
1108
|
columns: [],
|
|
1286
1109
|
expressions: []
|
|
@@ -1338,7 +1161,7 @@ const useStore = () => {
|
|
|
1338
1161
|
}
|
|
1339
1162
|
};
|
|
1340
1163
|
}
|
|
1341
|
-
if (type === TypeEnum.
|
|
1164
|
+
if (type === TypeEnum.group) {
|
|
1342
1165
|
// 添加分组
|
|
1343
1166
|
let newMetaList = metaList.slice();
|
|
1344
1167
|
newMetaList.splice(groupIndex + 1, 0, defaultOperator, ...defaultMeta);
|
|
@@ -1389,7 +1212,7 @@ const useStore = () => {
|
|
|
1389
1212
|
setMeta(_metaList, groupIndex);
|
|
1390
1213
|
};
|
|
1391
1214
|
const setColumns = (tableId, columns) => {
|
|
1392
|
-
const _columns = columns
|
|
1215
|
+
const _columns = columns.map(v => {
|
|
1393
1216
|
return {
|
|
1394
1217
|
...v,
|
|
1395
1218
|
fieldUuid: v.fieldUuid || uuidv4('field')
|
|
@@ -1414,10 +1237,46 @@ const useStore = () => {
|
|
|
1414
1237
|
const getDataset = datasourceId => {
|
|
1415
1238
|
return _cacheSource2TableMap[datasourceId] || [];
|
|
1416
1239
|
};
|
|
1240
|
+
const changeAlias = (groupIndex, alias) => {
|
|
1241
|
+
let newMetaList = metaList.slice();
|
|
1242
|
+
const _list = newMetaList[groupIndex].list;
|
|
1243
|
+
if (_list.length > 0) {
|
|
1244
|
+
_list.forEach(item => {
|
|
1245
|
+
if (item.type === TypeEnum.joinData && item.table2.alias === alias) {
|
|
1246
|
+
item.table2.alias = alias;
|
|
1247
|
+
} else if (item.type === TypeEnum.data && item.table.alias === alias) {
|
|
1248
|
+
item.table.alias = alias;
|
|
1249
|
+
} else if (item.type === TypeEnum.filter) {
|
|
1250
|
+
//过滤器
|
|
1251
|
+
item.filter.forEach(filterItem => {
|
|
1252
|
+
if (filterItem.alias === alias) {
|
|
1253
|
+
filterItem.alias = alias;
|
|
1254
|
+
}
|
|
1255
|
+
});
|
|
1256
|
+
} else if (item.type === TypeEnum.summarize) {
|
|
1257
|
+
// 汇总
|
|
1258
|
+
item.alias = alias;
|
|
1259
|
+
item.by.forEach(byItem => {
|
|
1260
|
+
if (byItem.alias === alias) {
|
|
1261
|
+
byItem.alias = alias;
|
|
1262
|
+
}
|
|
1263
|
+
});
|
|
1264
|
+
item.group.forEach(groupItem => {
|
|
1265
|
+
if (groupItem.alias === alias) {
|
|
1266
|
+
groupItem.alias = alias;
|
|
1267
|
+
groupItem.sql = alias;
|
|
1268
|
+
}
|
|
1269
|
+
});
|
|
1270
|
+
}
|
|
1271
|
+
});
|
|
1272
|
+
newMetaList[groupIndex].list = _list;
|
|
1273
|
+
_setMeta(newMetaList);
|
|
1274
|
+
}
|
|
1275
|
+
};
|
|
1417
1276
|
const reset = () => {
|
|
1418
1277
|
// setSourceList([]);
|
|
1419
1278
|
_setMeta(defaultMeta);
|
|
1420
|
-
|
|
1279
|
+
setToolbar(defaultToolbar);
|
|
1421
1280
|
set_cacheSource2TableMap({});
|
|
1422
1281
|
set_cacheColumnsMap({});
|
|
1423
1282
|
};
|
|
@@ -1471,7 +1330,7 @@ const useStore = () => {
|
|
|
1471
1330
|
_setShowSubquery,
|
|
1472
1331
|
constantList,
|
|
1473
1332
|
setConstantList,
|
|
1474
|
-
|
|
1333
|
+
changeAlias
|
|
1475
1334
|
};
|
|
1476
1335
|
};
|
|
1477
1336
|
|
|
@@ -1873,7 +1732,6 @@ const getComputedTranslate = obj => {
|
|
|
1873
1732
|
};
|
|
1874
1733
|
// 获取元素距离浏览器顶部的距离
|
|
1875
1734
|
const getElementTop = elem => {
|
|
1876
|
-
if (!elem) return 0;
|
|
1877
1735
|
let elemTop = elem.offsetTop;
|
|
1878
1736
|
let pElem = elem.offsetParent;
|
|
1879
1737
|
while (pElem != null) {
|
|
@@ -1887,7 +1745,6 @@ const getElementTop = elem => {
|
|
|
1887
1745
|
};
|
|
1888
1746
|
// 获取元素距离浏览器顶部的距离
|
|
1889
1747
|
const getElementLeft = elem => {
|
|
1890
|
-
if (!elem) return 0;
|
|
1891
1748
|
let elemLeft = elem.offsetLeft;
|
|
1892
1749
|
let pElem = elem.offsetParent;
|
|
1893
1750
|
while (pElem != null) {
|
|
@@ -1899,23 +1756,8 @@ const getElementLeft = elem => {
|
|
|
1899
1756
|
}
|
|
1900
1757
|
return elemLeft;
|
|
1901
1758
|
};
|
|
1902
|
-
|
|
1903
|
-
|
|
1904
|
-
if (!container) return 0;
|
|
1905
|
-
const rect = container.getBoundingClientRect();
|
|
1906
|
-
const windowHeight = window.innerHeight || document.documentElement.clientHeight;
|
|
1907
|
-
// 元素顶部在视口上方 -> 不可见
|
|
1908
|
-
if (rect.bottom < 0) return 0;
|
|
1909
|
-
// 元素底部在视口下方 -> 不可见
|
|
1910
|
-
if (rect.top > windowHeight) return 0;
|
|
1911
|
-
// 可见区域的 top 和 bottom
|
|
1912
|
-
const visibleTop = Math.max(rect.top, 0);
|
|
1913
|
-
const visibleBottom = Math.min(rect.bottom, windowHeight);
|
|
1914
|
-
// 可见高度
|
|
1915
|
-
return visibleBottom - visibleTop;
|
|
1916
|
-
};
|
|
1917
|
-
const getScrollTop = elem => {
|
|
1918
|
-
return elem?.scrollTop || document.documentElement.scrollTop;
|
|
1759
|
+
const getScrollTop = () => {
|
|
1760
|
+
return document.documentElement.scrollTop;
|
|
1919
1761
|
};
|
|
1920
1762
|
// 浏览器可视宽高
|
|
1921
1763
|
const getWindowSize = () => {
|
|
@@ -2394,7 +2236,7 @@ const List = [{
|
|
|
2394
2236
|
const RowLimit$1 = props => {
|
|
2395
2237
|
const {
|
|
2396
2238
|
meta,
|
|
2397
|
-
|
|
2239
|
+
operator,
|
|
2398
2240
|
groupIndex
|
|
2399
2241
|
} = props;
|
|
2400
2242
|
const store = useStore$1();
|
|
@@ -2404,10 +2246,10 @@ const RowLimit$1 = props => {
|
|
|
2404
2246
|
node: e.currentTarget,
|
|
2405
2247
|
content: jsx(SelectList, {
|
|
2406
2248
|
list: List,
|
|
2407
|
-
value:
|
|
2249
|
+
value: operator,
|
|
2408
2250
|
onChange: type => {
|
|
2409
2251
|
let newMeta = store.metaList.slice();
|
|
2410
|
-
newMeta[groupIndex].
|
|
2252
|
+
newMeta[groupIndex].operator = type;
|
|
2411
2253
|
store._setMeta(newMeta);
|
|
2412
2254
|
store.setPopup({
|
|
2413
2255
|
visible: false
|
|
@@ -2430,7 +2272,7 @@ const RowLimit$1 = props => {
|
|
|
2430
2272
|
children: jsx("div", {
|
|
2431
2273
|
className: `Sqb-TableName`,
|
|
2432
2274
|
onClick: e => selectOperator(e),
|
|
2433
|
-
children:
|
|
2275
|
+
children: operator
|
|
2434
2276
|
})
|
|
2435
2277
|
})
|
|
2436
2278
|
})]
|
|
@@ -3486,7 +3328,6 @@ function returnDocument(element) {
|
|
|
3486
3328
|
const outSpacing = 10;
|
|
3487
3329
|
function generateTrigger(PortalComponent) {
|
|
3488
3330
|
class Trigger extends React.Component {
|
|
3489
|
-
resizeObserver = null; // 显式声明 resizeObserver 属性
|
|
3490
3331
|
resetId = -1; // 监听窗口改变事件id 用于组件销毁的时候清除事件
|
|
3491
3332
|
static defaultProps = {
|
|
3492
3333
|
visible: false,
|
|
@@ -3501,39 +3342,11 @@ function generateTrigger(PortalComponent) {
|
|
|
3501
3342
|
this.resetId = winResetEvent.addEvent(this.didUpdate, this, 300);
|
|
3502
3343
|
this.props.container && this.props.container.addEventListener('scroll', this.didUpdate);
|
|
3503
3344
|
this.bindEvent();
|
|
3504
|
-
// 延迟绑定 ResizeObserver 到 ensure the element is ready
|
|
3505
|
-
this.initResizeObserver();
|
|
3506
|
-
}
|
|
3507
|
-
componentDidUpdate(prevProps) {
|
|
3508
|
-
// 如果 children 发生变化,重新初始化观察器
|
|
3509
|
-
if (prevProps.children !== this.props.children) {
|
|
3510
|
-
this.initResizeObserver();
|
|
3511
|
-
}
|
|
3512
3345
|
}
|
|
3513
3346
|
componentWillUnmount() {
|
|
3514
3347
|
winResetEvent.removeEvent(this.resetId);
|
|
3515
3348
|
this.props.container && this.props.container.removeEventListener('scroll', this.didUpdate);
|
|
3516
|
-
if (this.resizeObserver) {
|
|
3517
|
-
this.resizeObserver.disconnect();
|
|
3518
|
-
this.resizeObserver = null;
|
|
3519
|
-
}
|
|
3520
3349
|
}
|
|
3521
|
-
// children高度变化后,从新计算高度
|
|
3522
|
-
initResizeObserver = () => {
|
|
3523
|
-
const targetNode = this.ref.current;
|
|
3524
|
-
if (!targetNode) return;
|
|
3525
|
-
// 如果已经存在 ResizeObserver,先断开连接
|
|
3526
|
-
if (this.resizeObserver) {
|
|
3527
|
-
this.resizeObserver.disconnect();
|
|
3528
|
-
}
|
|
3529
|
-
// 初始化 ResizeObserver 并开始观察目标节点
|
|
3530
|
-
this.resizeObserver = new ResizeObserver(entries => {
|
|
3531
|
-
entries.forEach(entry => {
|
|
3532
|
-
this.didUpdate();
|
|
3533
|
-
});
|
|
3534
|
-
});
|
|
3535
|
-
this.resizeObserver.observe(targetNode);
|
|
3536
|
-
};
|
|
3537
3350
|
bindEvent = () => {
|
|
3538
3351
|
let that = this;
|
|
3539
3352
|
returnDocument().body.addEventListener('click', function (e) {
|
|
@@ -3551,7 +3364,7 @@ function generateTrigger(PortalComponent) {
|
|
|
3551
3364
|
this.props.visible && this.props.closable && this.props.hideVisible();
|
|
3552
3365
|
};
|
|
3553
3366
|
attachParent = popupContainer => {
|
|
3554
|
-
let mountNode =
|
|
3367
|
+
let mountNode = returnDocument().body;
|
|
3555
3368
|
mountNode.appendChild(popupContainer);
|
|
3556
3369
|
};
|
|
3557
3370
|
getCurrentNodePos = () => {
|
|
@@ -3560,9 +3373,8 @@ function generateTrigger(PortalComponent) {
|
|
|
3560
3373
|
container
|
|
3561
3374
|
} = this.props;
|
|
3562
3375
|
return {
|
|
3563
|
-
x: getElementLeft(node)
|
|
3564
|
-
y: getElementTop(node) -
|
|
3565
|
-
t: getElementTop(container),
|
|
3376
|
+
x: getElementLeft(node),
|
|
3377
|
+
y: getElementTop(node) - (container?.scrollTop || 0),
|
|
3566
3378
|
h: node.offsetHeight
|
|
3567
3379
|
};
|
|
3568
3380
|
};
|
|
@@ -3605,21 +3417,19 @@ function generateTrigger(PortalComponent) {
|
|
|
3605
3417
|
didUpdate = () => {
|
|
3606
3418
|
if (!this.props.node) return false;
|
|
3607
3419
|
let {
|
|
3608
|
-
innerSpacing = 10
|
|
3609
|
-
container
|
|
3420
|
+
innerSpacing = 10
|
|
3610
3421
|
} = this.props;
|
|
3611
3422
|
let pos = this.getCurrentNodePos();
|
|
3612
|
-
let posY = pos.y - getScrollTop(
|
|
3423
|
+
let posY = pos.y - getScrollTop();
|
|
3613
3424
|
if (!this.ref) return false;
|
|
3614
3425
|
let realHeight = this.ref?.current?.childNodes?.[0]?.offsetHeight || 0;
|
|
3615
3426
|
if (!realHeight) return false;
|
|
3616
3427
|
let {
|
|
3617
3428
|
height: winH
|
|
3618
3429
|
} = getWindowSize();
|
|
3619
|
-
let
|
|
3620
|
-
let downH = (containerH || winH) - posY - pos.h; // 元素下面可用高度
|
|
3430
|
+
let downH = winH - posY - pos.h; // 元素下面可用高度
|
|
3621
3431
|
let maxHeight = 0;
|
|
3622
|
-
let topHeight = getScrollTop(
|
|
3432
|
+
let topHeight = getScrollTop();
|
|
3623
3433
|
if (downH >= posY || realHeight <= downH - innerSpacing - outSpacing) {
|
|
3624
3434
|
// 下面比上面宽敞 或 下面足够放下所有 放下面
|
|
3625
3435
|
maxHeight = Math.min(realHeight, downH - innerSpacing - outSpacing);
|
|
@@ -3769,7 +3579,7 @@ const SelectColumn = ({
|
|
|
3769
3579
|
});
|
|
3770
3580
|
};
|
|
3771
3581
|
|
|
3772
|
-
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";
|
|
3773
3583
|
styleInject(css_248z$6);
|
|
3774
3584
|
|
|
3775
3585
|
const NUMBER_GROUP = [SQL_COLUMN_TYPE.FLOAT, SQL_COLUMN_TYPE.LONG, SQL_COLUMN_TYPE.CURRENCY];
|
|
@@ -3887,8 +3697,7 @@ const SelectJoinColumn = ({
|
|
|
3887
3697
|
})));
|
|
3888
3698
|
}
|
|
3889
3699
|
},
|
|
3890
|
-
children: jsxs("
|
|
3891
|
-
className: 'List-item',
|
|
3700
|
+
children: jsxs("a", {
|
|
3892
3701
|
children: [jsx("span", {
|
|
3893
3702
|
className: 'List-item-icon',
|
|
3894
3703
|
children: jsx(TableIcon, {})
|
|
@@ -3907,7 +3716,7 @@ const SelectJoinColumn = ({
|
|
|
3907
3716
|
})]
|
|
3908
3717
|
})
|
|
3909
3718
|
})
|
|
3910
|
-
}),
|
|
3719
|
+
}), open && jsxs(Fragment, {
|
|
3911
3720
|
children: [!isSummarize && jsx("div", {
|
|
3912
3721
|
className: cx(`Sqb-List-section`),
|
|
3913
3722
|
children: jsxs("div", {
|
|
@@ -3980,8 +3789,8 @@ const SelectJoinColumn = ({
|
|
|
3980
3789
|
realName
|
|
3981
3790
|
});
|
|
3982
3791
|
},
|
|
3983
|
-
children: [jsxs("
|
|
3984
|
-
className: 'p-2
|
|
3792
|
+
children: [jsxs("a", {
|
|
3793
|
+
className: 'p-2',
|
|
3985
3794
|
children: [jsx("span", {
|
|
3986
3795
|
className: 'List-item-icon',
|
|
3987
3796
|
children: IconMap[special_type || database_type] || jsx(LetterAaIcon, {})
|
|
@@ -4020,8 +3829,7 @@ const SelectFilterColumn = ({
|
|
|
4020
3829
|
value,
|
|
4021
3830
|
onChange,
|
|
4022
3831
|
didUpdate,
|
|
4023
|
-
isCustom: _isCustom = false
|
|
4024
|
-
container: _container = null
|
|
3832
|
+
isCustom: _isCustom = false
|
|
4025
3833
|
}) => {
|
|
4026
3834
|
const [curColumn, setCurColumn] = useState(value);
|
|
4027
3835
|
const [condition, setCondition] = useState(value.condition);
|
|
@@ -4438,7 +4246,6 @@ const SelectFilterColumn = ({
|
|
|
4438
4246
|
store.setPopup2({
|
|
4439
4247
|
visible: true,
|
|
4440
4248
|
node: e.currentTarget,
|
|
4441
|
-
container: _container,
|
|
4442
4249
|
content: jsx(SelectList, {
|
|
4443
4250
|
value: valType,
|
|
4444
4251
|
list: store.constantList || [],
|
|
@@ -4461,7 +4268,6 @@ const SelectFilterColumn = ({
|
|
|
4461
4268
|
store.setPopup2({
|
|
4462
4269
|
visible: true,
|
|
4463
4270
|
node: e.currentTarget,
|
|
4464
|
-
container: _container,
|
|
4465
4271
|
content: jsx(SelectList, {
|
|
4466
4272
|
value: valType,
|
|
4467
4273
|
list: [{
|
|
@@ -4496,7 +4302,6 @@ const SelectFilterColumn = ({
|
|
|
4496
4302
|
store.setPopup2({
|
|
4497
4303
|
visible: true,
|
|
4498
4304
|
node: e.currentTarget,
|
|
4499
|
-
container: _container,
|
|
4500
4305
|
content: jsx(SelectJoinColumn, {
|
|
4501
4306
|
data: [..._data],
|
|
4502
4307
|
value: value,
|
|
@@ -5210,17 +5015,17 @@ const IconTypeMap = new Map([[TypeEnum.filter, {
|
|
|
5210
5015
|
name: __('SqlQueryBuilder.rowLimit'),
|
|
5211
5016
|
icon: jsx(RowLimitIcon, {}),
|
|
5212
5017
|
className: 'rowLimit'
|
|
5213
|
-
}], [TypeEnum.
|
|
5018
|
+
}], [TypeEnum.group, {
|
|
5214
5019
|
name: __('SqlQueryBuilder.union'),
|
|
5215
5020
|
icon: jsx(GroupIcon, {}),
|
|
5216
5021
|
className: 'union'
|
|
5217
5022
|
}]]);
|
|
5218
5023
|
// 前端展示的icon顺序 随便改不影响逻辑
|
|
5219
|
-
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];
|
|
5220
5025
|
// js逻辑顺序 正常顺序
|
|
5221
|
-
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];
|
|
5222
5027
|
// js逻辑顺序 聚合下面的顺序是这个样子
|
|
5223
|
-
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];
|
|
5224
5029
|
const metaIcon = (size, handleClick) => {
|
|
5225
5030
|
return ({
|
|
5226
5031
|
type
|
|
@@ -5325,7 +5130,7 @@ const findNextIcon = (store, props) => {
|
|
|
5325
5130
|
if (meta.table2.name) {
|
|
5326
5131
|
available = OrderType.slice(curLocation + 1);
|
|
5327
5132
|
} else {
|
|
5328
|
-
available = [TypeEnum.customColumn, TypeEnum.filter, TypeEnum.summarize, TypeEnum.
|
|
5133
|
+
available = [TypeEnum.customColumn, TypeEnum.filter, TypeEnum.summarize, TypeEnum.group];
|
|
5329
5134
|
}
|
|
5330
5135
|
} else {
|
|
5331
5136
|
if (isLast) {
|
|
@@ -5347,7 +5152,7 @@ const findNextIcon = (store, props) => {
|
|
|
5347
5152
|
if (meta.customColumn.length || ~joinIndex && prevList[joinIndex].table2.name) {
|
|
5348
5153
|
available = OrderType.slice(curLocation + 1);
|
|
5349
5154
|
} else {
|
|
5350
|
-
available = [TypeEnum.filter, TypeEnum.summarize, TypeEnum.
|
|
5155
|
+
available = [TypeEnum.filter, TypeEnum.summarize, TypeEnum.group];
|
|
5351
5156
|
}
|
|
5352
5157
|
} else {
|
|
5353
5158
|
if (isLast) {
|
|
@@ -5380,7 +5185,7 @@ const findNextIcon = (store, props) => {
|
|
|
5380
5185
|
if (isLast) {
|
|
5381
5186
|
if (!ExistAboveGroupBy) {
|
|
5382
5187
|
if (meta.group.length && !meta.by.length) ; else if (!meta.group.length && !meta.by.length) {
|
|
5383
|
-
available = [TypeEnum.sort, TypeEnum.rowLimit, TypeEnum.
|
|
5188
|
+
available = [TypeEnum.sort, TypeEnum.rowLimit, TypeEnum.group];
|
|
5384
5189
|
} else {
|
|
5385
5190
|
available = OrderNewType;
|
|
5386
5191
|
}
|
|
@@ -5583,7 +5388,7 @@ const TableData = props => {
|
|
|
5583
5388
|
}
|
|
5584
5389
|
})
|
|
5585
5390
|
}), selected ? `${meta.table.datasourceName}.${meta.table.name} ${meta.table?.alias ? `as ${meta.table?.alias}` : ''}` : __('SqlQueryBuilder.pickTable')]
|
|
5586
|
-
}), selected && store.showMainColumn
|
|
5391
|
+
}), selected && store.showMainColumn && store.showFields && jsx("div", {
|
|
5587
5392
|
className: `Sqb-TableColumns`,
|
|
5588
5393
|
onClick: selectColumns,
|
|
5589
5394
|
children: __('SqlQueryBuilder.columns')
|
|
@@ -5605,8 +5410,8 @@ var FlagLocation;
|
|
|
5605
5410
|
})(FlagLocation || (FlagLocation = {}));
|
|
5606
5411
|
var ExpressionsEnum;
|
|
5607
5412
|
(function (ExpressionsEnum) {
|
|
5608
|
-
ExpressionsEnum["LEFT"] = "
|
|
5609
|
-
ExpressionsEnum["RIGHT"] = "
|
|
5413
|
+
ExpressionsEnum["LEFT"] = "left_column";
|
|
5414
|
+
ExpressionsEnum["RIGHT"] = "right_column";
|
|
5610
5415
|
})(ExpressionsEnum || (ExpressionsEnum = {}));
|
|
5611
5416
|
const JoinData = props => {
|
|
5612
5417
|
const {
|
|
@@ -5621,12 +5426,7 @@ const JoinData = props => {
|
|
|
5621
5426
|
let table1Selected = Boolean(meta.table1.name);
|
|
5622
5427
|
let table2Selected = Boolean(meta.table2.name);
|
|
5623
5428
|
let subQuerySelected = Boolean(meta.subquery?.[0]?.table?.name);
|
|
5624
|
-
let columnsSelected = meta.table1.
|
|
5625
|
-
// useEffect(() => {
|
|
5626
|
-
// let newMetaList = store.metaList[groupIndex].list.slice();
|
|
5627
|
-
// newMetaList[index] = setQuotes(meta);
|
|
5628
|
-
// store.setMeta(newMetaList, groupIndex);
|
|
5629
|
-
// }, []);
|
|
5429
|
+
let columnsSelected = meta.table1.column && meta.table2.column;
|
|
5630
5430
|
function selectColumns(e) {
|
|
5631
5431
|
let columns = meta.columns;
|
|
5632
5432
|
!meta.readonly && store.setPopup({
|
|
@@ -5695,9 +5495,8 @@ const JoinData = props => {
|
|
|
5695
5495
|
name: tableName,
|
|
5696
5496
|
tableUuid: data.tableUuid || uuidv4('table'),
|
|
5697
5497
|
alias,
|
|
5698
|
-
|
|
5699
|
-
|
|
5700
|
-
quotes: '',
|
|
5498
|
+
column: '',
|
|
5499
|
+
column_id: '',
|
|
5701
5500
|
datasourceId: data.datasourceId,
|
|
5702
5501
|
datasourceName: data.datasourceName
|
|
5703
5502
|
};
|
|
@@ -5740,9 +5539,8 @@ const JoinData = props => {
|
|
|
5740
5539
|
let type = node.getAttribute('v-data');
|
|
5741
5540
|
let data = [];
|
|
5742
5541
|
let value = {
|
|
5743
|
-
name: meta[type].
|
|
5744
|
-
|
|
5745
|
-
id: meta[type].fieldUuid,
|
|
5542
|
+
name: meta[type].column,
|
|
5543
|
+
id: meta[type].column_id,
|
|
5746
5544
|
table: meta[type].name,
|
|
5747
5545
|
tableId: meta[type].id,
|
|
5748
5546
|
fieldUuid: meta[type].fieldUuid || uuidv4('field'),
|
|
@@ -5860,21 +5658,11 @@ const JoinData = props => {
|
|
|
5860
5658
|
sql,
|
|
5861
5659
|
datasourceId,
|
|
5862
5660
|
datasourceName,
|
|
5863
|
-
id = ''
|
|
5864
|
-
fieldAlias = '',
|
|
5865
|
-
fieldUuid = '',
|
|
5866
|
-
quotes
|
|
5661
|
+
id = ''
|
|
5867
5662
|
} = record;
|
|
5868
5663
|
let newMeta = store.metaList[groupIndex].list.slice();
|
|
5869
|
-
|
|
5870
|
-
|
|
5871
|
-
newMeta[index][type].fieldUuid = fieldUuid;
|
|
5872
|
-
newMeta[index][type].quotes = quotes;
|
|
5873
|
-
} else {
|
|
5874
|
-
newMeta[index][type].fieldAlias = name;
|
|
5875
|
-
newMeta[index][type].fieldUuid = id;
|
|
5876
|
-
newMeta[index][type].quotes = name;
|
|
5877
|
-
}
|
|
5664
|
+
newMeta[index][type].column = name;
|
|
5665
|
+
newMeta[index][type].column_id = id;
|
|
5878
5666
|
if (type === FlagLocation.TABLE_1) {
|
|
5879
5667
|
if (newMeta[index][type].alias !== alias) {
|
|
5880
5668
|
newMeta[index][type].alias = alias;
|
|
@@ -5902,8 +5690,8 @@ const JoinData = props => {
|
|
|
5902
5690
|
let index = findIndex(store.metaList[groupIndex].list, meta);
|
|
5903
5691
|
let table_type = type === ExpressionsEnum.LEFT ? FlagLocation.TABLE_1 : FlagLocation.TABLE_2;
|
|
5904
5692
|
let value = {
|
|
5905
|
-
name: meta.expressions[_ind][
|
|
5906
|
-
id: meta.expressions[_ind][`${type}
|
|
5693
|
+
name: meta.expressions[_ind][type],
|
|
5694
|
+
id: meta.expressions[_ind][`${type}_id`],
|
|
5907
5695
|
table: meta[table_type].name,
|
|
5908
5696
|
fieldUuid: meta[table_type].fieldUuid || uuidv4('field'),
|
|
5909
5697
|
fieldAlias: meta[table_type].fieldAlias || '',
|
|
@@ -6028,23 +5816,11 @@ const JoinData = props => {
|
|
|
6028
5816
|
sql,
|
|
6029
5817
|
datasourceId,
|
|
6030
5818
|
datasourceName,
|
|
6031
|
-
id = ''
|
|
6032
|
-
fieldAlias,
|
|
6033
|
-
fieldUuid,
|
|
6034
|
-
quotes = ''
|
|
5819
|
+
id = ''
|
|
6035
5820
|
} = record;
|
|
6036
5821
|
let newMeta = store.metaList[groupIndex].list.slice();
|
|
6037
|
-
|
|
6038
|
-
|
|
6039
|
-
newMeta[index].expressions[_ind][`${type}_fieldUuid`] = fieldUuid;
|
|
6040
|
-
newMeta[index].expressions[_ind][`${type}_quotes`] = quotes;
|
|
6041
|
-
} else {
|
|
6042
|
-
newMeta[index].expressions[_ind][`${type}_fieldAlias`] = name;
|
|
6043
|
-
newMeta[index].expressions[_ind][`${type}_fieldUuid`] = id;
|
|
6044
|
-
newMeta[index].expressions[_ind][`${type}_quotes`] = name;
|
|
6045
|
-
}
|
|
6046
|
-
// (newMeta[index] as MetaJoin).expressions[_ind][type] = name;
|
|
6047
|
-
// (newMeta[index] as MetaJoin).expressions[_ind][`${type}_id`] = id;
|
|
5822
|
+
newMeta[index].expressions[_ind][type] = name;
|
|
5823
|
+
newMeta[index].expressions[_ind][`${type}_id`] = id;
|
|
6048
5824
|
store.setMeta(newMeta, groupIndex);
|
|
6049
5825
|
store.setPopup({
|
|
6050
5826
|
visible: false
|
|
@@ -6126,11 +5902,10 @@ const JoinData = props => {
|
|
|
6126
5902
|
let oldList = cloneDeep(newMeta[index].subquery);
|
|
6127
5903
|
let _toolbar = subToolbar || toolbar;
|
|
6128
5904
|
_toolbar = _toolbar.filter(v => v !== 'group'); // 子查询不需要分组
|
|
6129
|
-
let zIndex = store.popupContainer.current ? getMaxZIndexInParents(store.popupContainer.current) : 0;
|
|
6130
5905
|
let o = Modal2.openModal({
|
|
6131
5906
|
title: __('SqlQueryBuilder.subquery'),
|
|
6132
5907
|
transparentMask: true,
|
|
6133
|
-
zIndex:
|
|
5908
|
+
zIndex: 200,
|
|
6134
5909
|
content: jsx(Fragment, {
|
|
6135
5910
|
children: jsx(SqlVisionBuilder, {
|
|
6136
5911
|
...other,
|
|
@@ -6148,8 +5923,8 @@ const JoinData = props => {
|
|
|
6148
5923
|
newMeta[index].subquery = newList;
|
|
6149
5924
|
newMeta[index].table2 = {
|
|
6150
5925
|
...newList[0].table,
|
|
6151
|
-
|
|
6152
|
-
|
|
5926
|
+
column: '',
|
|
5927
|
+
column_id: ''
|
|
6153
5928
|
};
|
|
6154
5929
|
const items = getSubColumns(newList);
|
|
6155
5930
|
const newColumns = items.flatMap(item => item.columns);
|
|
@@ -6174,9 +5949,8 @@ const JoinData = props => {
|
|
|
6174
5949
|
let newMeta = store.metaList[groupIndex].list.slice();
|
|
6175
5950
|
newMeta[index].isSubquery = !newMeta[index].isSubquery;
|
|
6176
5951
|
newMeta[index].table2 = {
|
|
6177
|
-
|
|
6178
|
-
|
|
6179
|
-
fieldUuid: '',
|
|
5952
|
+
column: '',
|
|
5953
|
+
column_id: '',
|
|
6180
5954
|
name: '',
|
|
6181
5955
|
// 表名
|
|
6182
5956
|
tableUuid: '',
|
|
@@ -6309,23 +6083,23 @@ const JoinData = props => {
|
|
|
6309
6083
|
children: "on"
|
|
6310
6084
|
}), jsx("div", {
|
|
6311
6085
|
className: cx(`Sqb-TableName`, {
|
|
6312
|
-
notSelected: !meta.table1.
|
|
6086
|
+
notSelected: !meta.table1.column
|
|
6313
6087
|
}),
|
|
6314
6088
|
"v-data": FlagLocation.TABLE_1,
|
|
6315
6089
|
onClick: selectJoinColumn,
|
|
6316
|
-
children: meta.table1.
|
|
6090
|
+
children: meta.table1.column ? meta.table1.column : __('SqlQueryBuilder.pickTable')
|
|
6317
6091
|
}), jsx("span", {
|
|
6318
6092
|
className: 'mr-2 text-gray-500',
|
|
6319
6093
|
children: "="
|
|
6320
6094
|
}), jsx("div", {
|
|
6321
6095
|
className: cx(`Sqb-TableName`, {
|
|
6322
|
-
notSelected: !meta.table2.
|
|
6096
|
+
notSelected: !meta.table2.column
|
|
6323
6097
|
}),
|
|
6324
6098
|
"v-data": FlagLocation.TABLE_2,
|
|
6325
6099
|
onClick: selectJoinColumn,
|
|
6326
|
-
children: meta.table2.
|
|
6100
|
+
children: meta.table2.column ? meta.table2.column : __('SqlQueryBuilder.pickTable')
|
|
6327
6101
|
})]
|
|
6328
|
-
}), meta.table1.
|
|
6102
|
+
}), meta.table1.column_id && meta.table2.column_id && meta.expressions?.map((v, i) => {
|
|
6329
6103
|
return jsxs("div", {
|
|
6330
6104
|
className: cx(`Sqb-where block`),
|
|
6331
6105
|
children: [jsx("span", {
|
|
@@ -6354,12 +6128,12 @@ const JoinData = props => {
|
|
|
6354
6128
|
children: v.left_constant ? v.left_constant : __('SqlQueryBuilder.pickConstant')
|
|
6355
6129
|
}), (!v.left_type || v.left_type === 'field') && jsx("div", {
|
|
6356
6130
|
className: cx(`Sqb-TableName`, {
|
|
6357
|
-
notSelected: !v.
|
|
6131
|
+
notSelected: !v.left_column
|
|
6358
6132
|
}),
|
|
6359
6133
|
"v-data": ExpressionsEnum.LEFT,
|
|
6360
6134
|
"v-index": i,
|
|
6361
6135
|
onClick: selectMoreJoinColumn,
|
|
6362
|
-
children: v.
|
|
6136
|
+
children: v.left_column ? v.left_column : __('SqlQueryBuilder.pickTable')
|
|
6363
6137
|
}), jsx(Tooltip, {
|
|
6364
6138
|
title: __('SqlQueryBuilder.switch'),
|
|
6365
6139
|
children: jsx(Button, {
|
|
@@ -6398,12 +6172,12 @@ const JoinData = props => {
|
|
|
6398
6172
|
children: v.right_constant ? v.right_constant : __('SqlQueryBuilder.pickConstant')
|
|
6399
6173
|
}), (!v.right_type || v.right_type === 'field') && jsx("div", {
|
|
6400
6174
|
className: cx(`Sqb-TableName`, {
|
|
6401
|
-
notSelected: !v.
|
|
6175
|
+
notSelected: !v.right_column
|
|
6402
6176
|
}),
|
|
6403
6177
|
"v-data": ExpressionsEnum.RIGHT,
|
|
6404
6178
|
"v-index": i,
|
|
6405
6179
|
onClick: selectMoreJoinColumn,
|
|
6406
|
-
children: v.
|
|
6180
|
+
children: v.right_column ? v.right_column : __('SqlQueryBuilder.pickTable')
|
|
6407
6181
|
}), jsx(Tooltip, {
|
|
6408
6182
|
title: __('SqlQueryBuilder.switch'),
|
|
6409
6183
|
children: jsx(Button, {
|
|
@@ -6429,15 +6203,14 @@ const JoinData = props => {
|
|
|
6429
6203
|
let newMeta = store.metaList[groupIndex].list.slice();
|
|
6430
6204
|
newMeta[index].expressions.splice(i + 1, 0, {
|
|
6431
6205
|
operator: 'and',
|
|
6432
|
-
|
|
6433
|
-
|
|
6434
|
-
left_quotes: '',
|
|
6206
|
+
left_column: '',
|
|
6207
|
+
left_column_id: '',
|
|
6435
6208
|
left_string: '',
|
|
6209
|
+
left_isString: false,
|
|
6436
6210
|
left_type: 'field',
|
|
6437
6211
|
left_constant: '',
|
|
6438
|
-
|
|
6439
|
-
|
|
6440
|
-
right_quotes: '',
|
|
6212
|
+
right_column: '',
|
|
6213
|
+
right_column_id: '',
|
|
6441
6214
|
right_string: '',
|
|
6442
6215
|
right_isString: false,
|
|
6443
6216
|
right_type: 'field',
|
|
@@ -6462,7 +6235,7 @@ const JoinData = props => {
|
|
|
6462
6235
|
})
|
|
6463
6236
|
})]
|
|
6464
6237
|
}, i);
|
|
6465
|
-
}), meta.table1.
|
|
6238
|
+
}), meta.table1.column_id && meta.table2.column_id && (meta.expressions?.length || 0) < 1 && jsx(Tooltip, {
|
|
6466
6239
|
title: __('SqlQueryBuilder.add'),
|
|
6467
6240
|
children: jsx(Button, {
|
|
6468
6241
|
disabled: meta.readonly,
|
|
@@ -6475,15 +6248,14 @@ const JoinData = props => {
|
|
|
6475
6248
|
let newMeta = store.metaList[groupIndex].list.slice();
|
|
6476
6249
|
newMeta[index].expressions = [{
|
|
6477
6250
|
operator: 'and',
|
|
6478
|
-
|
|
6479
|
-
|
|
6480
|
-
left_quotes: '',
|
|
6251
|
+
left_column: '',
|
|
6252
|
+
left_column_id: '',
|
|
6481
6253
|
left_string: '',
|
|
6254
|
+
left_isString: false,
|
|
6482
6255
|
left_type: 'field',
|
|
6483
6256
|
left_constant: '',
|
|
6484
|
-
|
|
6485
|
-
|
|
6486
|
-
right_quotes: '',
|
|
6257
|
+
right_column: '',
|
|
6258
|
+
right_column_id: '',
|
|
6487
6259
|
right_string: '',
|
|
6488
6260
|
right_isString: false,
|
|
6489
6261
|
right_constant: '',
|
|
@@ -6634,12 +6406,12 @@ const CaseEditor = props => {
|
|
|
6634
6406
|
onOk,
|
|
6635
6407
|
onCancel
|
|
6636
6408
|
} = props;
|
|
6637
|
-
|
|
6409
|
+
const [popup, setPopup] = useState({
|
|
6410
|
+
visible: false
|
|
6411
|
+
}); // 弹框信息
|
|
6638
6412
|
const [caseList, setCaseList] = useState(value.formulaList || []);
|
|
6639
6413
|
const [name, setName] = useState(value?.name || ''); // 表达式名字
|
|
6640
6414
|
const [ind, setInd] = useState(-1);
|
|
6641
|
-
const ref = useRef(null);
|
|
6642
|
-
const store = useStore$1();
|
|
6643
6415
|
const filterCase = useMemo(() => {
|
|
6644
6416
|
const hasCase = caseList.some(item => item.type === OptionsTypeEnum.OTHER && item.operator === 'case');
|
|
6645
6417
|
if (hasCase) {
|
|
@@ -6651,22 +6423,24 @@ const CaseEditor = props => {
|
|
|
6651
6423
|
const usable = useMemo(() => {
|
|
6652
6424
|
return Array.from(caseList).length > 0 && name;
|
|
6653
6425
|
}, [caseList, name]);
|
|
6654
|
-
|
|
6655
|
-
|
|
6656
|
-
|
|
6657
|
-
|
|
6658
|
-
|
|
6426
|
+
const popupContent = useMemo(() => {
|
|
6427
|
+
let {
|
|
6428
|
+
visible,
|
|
6429
|
+
content
|
|
6430
|
+
} = popup;
|
|
6431
|
+
if (!visible) return null;
|
|
6432
|
+
return content;
|
|
6433
|
+
}, [popup]);
|
|
6659
6434
|
function closePopup() {
|
|
6660
|
-
|
|
6435
|
+
setPopup({
|
|
6661
6436
|
visible: false
|
|
6662
6437
|
});
|
|
6663
6438
|
}
|
|
6664
6439
|
// 字段
|
|
6665
6440
|
function handleField(e, i, val) {
|
|
6666
|
-
|
|
6441
|
+
setPopup({
|
|
6667
6442
|
visible: true,
|
|
6668
6443
|
node: e.currentTarget,
|
|
6669
|
-
container: ref.current,
|
|
6670
6444
|
content: jsx(SelectJoinColumn, {
|
|
6671
6445
|
data: data,
|
|
6672
6446
|
value: val,
|
|
@@ -6674,13 +6448,8 @@ const CaseEditor = props => {
|
|
|
6674
6448
|
isGroup: true,
|
|
6675
6449
|
// @ts-ignore
|
|
6676
6450
|
onGroup: data => {
|
|
6677
|
-
let _data = cloneDeep(data);
|
|
6678
|
-
if (_data.alias != SummarizeAlias$1) {
|
|
6679
|
-
_data.fieldAlias = _data.name;
|
|
6680
|
-
_data.fieldUuid = uuidv4('field');
|
|
6681
|
-
}
|
|
6682
6451
|
const _caseList = caseList.slice();
|
|
6683
|
-
_caseList[i].expression =
|
|
6452
|
+
_caseList[i].expression = data;
|
|
6684
6453
|
setCaseList(_caseList);
|
|
6685
6454
|
closePopup();
|
|
6686
6455
|
}
|
|
@@ -6696,23 +6465,16 @@ const CaseEditor = props => {
|
|
|
6696
6465
|
};
|
|
6697
6466
|
// 表达式
|
|
6698
6467
|
function handleExpression(e, i, val) {
|
|
6699
|
-
|
|
6468
|
+
setPopup({
|
|
6700
6469
|
visible: true,
|
|
6701
6470
|
node: e.currentTarget,
|
|
6702
|
-
container: ref.current,
|
|
6703
6471
|
content: jsx(SelectFilter, {
|
|
6704
6472
|
isCustom: true,
|
|
6705
|
-
container: ref.current,
|
|
6706
6473
|
data: data,
|
|
6707
6474
|
value: val,
|
|
6708
6475
|
onChange: data => {
|
|
6709
|
-
let _data = cloneDeep(data);
|
|
6710
|
-
if (_data.alias != SummarizeAlias$1) {
|
|
6711
|
-
_data.fieldAlias = _data.name;
|
|
6712
|
-
_data.fieldUuid = uuidv4('field');
|
|
6713
|
-
}
|
|
6714
6476
|
const _caseList = caseList.slice();
|
|
6715
|
-
_caseList[i].expression =
|
|
6477
|
+
_caseList[i].expression = data;
|
|
6716
6478
|
setCaseList(_caseList);
|
|
6717
6479
|
closePopup();
|
|
6718
6480
|
}
|
|
@@ -6755,7 +6517,8 @@ const CaseEditor = props => {
|
|
|
6755
6517
|
const _onOk = () => {
|
|
6756
6518
|
typeof onOk === 'function' && onOk?.({
|
|
6757
6519
|
name,
|
|
6758
|
-
formulaList: caseList
|
|
6520
|
+
formulaList: caseList,
|
|
6521
|
+
formula: ''
|
|
6759
6522
|
});
|
|
6760
6523
|
};
|
|
6761
6524
|
// 分段
|
|
@@ -6903,7 +6666,6 @@ const CaseEditor = props => {
|
|
|
6903
6666
|
};
|
|
6904
6667
|
return jsxs("div", {
|
|
6905
6668
|
className: 'custom-box',
|
|
6906
|
-
ref: ref,
|
|
6907
6669
|
children: [jsx(VisualBox$1, {
|
|
6908
6670
|
children: jsx("div", {
|
|
6909
6671
|
className: `Sqb-item Sqb-case-editor mb-2 mt-2`,
|
|
@@ -7041,6 +6803,13 @@ const CaseEditor = props => {
|
|
|
7041
6803
|
})]
|
|
7042
6804
|
})
|
|
7043
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
|
|
7044
6813
|
}), jsx("div", {
|
|
7045
6814
|
className: `btns p-4`,
|
|
7046
6815
|
children: jsxs("div", {
|
|
@@ -7172,15 +6941,14 @@ const CustomColumn = props => {
|
|
|
7172
6941
|
}
|
|
7173
6942
|
return data;
|
|
7174
6943
|
}
|
|
7175
|
-
//
|
|
6944
|
+
// 子查询弹窗
|
|
7176
6945
|
const showSubQuery = (e, i) => {
|
|
7177
6946
|
let newMeta = store.metaList[groupIndex].list.slice();
|
|
7178
6947
|
const _value = newMeta[index].customColumn[i] || [];
|
|
7179
|
-
let zIndex = store.popupContainer.current ? getMaxZIndexInParents(store.popupContainer.current) : 0;
|
|
7180
6948
|
let o = Modal2.openModal({
|
|
7181
6949
|
title: __('SqlQueryBuilder.customExpression'),
|
|
7182
6950
|
transparentMask: true,
|
|
7183
|
-
zIndex:
|
|
6951
|
+
zIndex: 200,
|
|
7184
6952
|
content: jsx(Fragment, {
|
|
7185
6953
|
children: jsx(Provider, {
|
|
7186
6954
|
value: store,
|
|
@@ -7440,7 +7208,7 @@ const Filter = props => {
|
|
|
7440
7208
|
let newMeta = store.metaList[groupIndex].list.slice();
|
|
7441
7209
|
let val = filter[i];
|
|
7442
7210
|
if (val.type === Filter_TypeEnum.NOT_EXISTS) {
|
|
7443
|
-
|
|
7211
|
+
showSubQuery(i, '');
|
|
7444
7212
|
return;
|
|
7445
7213
|
}
|
|
7446
7214
|
let data = getColumns();
|
|
@@ -7539,10 +7307,10 @@ const Filter = props => {
|
|
|
7539
7307
|
newMeta[index].filter = [..._filter];
|
|
7540
7308
|
setInd(-1);
|
|
7541
7309
|
};
|
|
7542
|
-
//
|
|
7543
|
-
const
|
|
7310
|
+
// 子查询弹窗
|
|
7311
|
+
const showSubQuery = (i, position) => {
|
|
7544
7312
|
const {
|
|
7545
|
-
|
|
7313
|
+
subToolbar,
|
|
7546
7314
|
toolbar,
|
|
7547
7315
|
...other
|
|
7548
7316
|
} = store.preProps;
|
|
@@ -7550,13 +7318,12 @@ const Filter = props => {
|
|
|
7550
7318
|
let index = findIndex(store.metaList[groupIndex].list, meta);
|
|
7551
7319
|
let _value = position ? [] : newMeta[index].filter[i]?.subquery || [];
|
|
7552
7320
|
let oldList = position ? [] : cloneDeep(newMeta[index].filter[i]?.subquery || []);
|
|
7553
|
-
let _toolbar =
|
|
7321
|
+
let _toolbar = subToolbar || toolbar;
|
|
7554
7322
|
_toolbar = _toolbar.filter(v => v !== 'group'); // 子查询不需要分组
|
|
7555
|
-
let zIndex = store.popupContainer.current ? getMaxZIndexInParents(store.popupContainer.current) : null;
|
|
7556
7323
|
let o = Modal2.openModal({
|
|
7557
7324
|
title: 'NOT EXISTS',
|
|
7558
7325
|
transparentMask: true,
|
|
7559
|
-
zIndex:
|
|
7326
|
+
zIndex: 200,
|
|
7560
7327
|
content: jsx(Fragment, {
|
|
7561
7328
|
children: jsx(SqlVisionBuilder, {
|
|
7562
7329
|
...other,
|
|
@@ -7649,7 +7416,7 @@ const Filter = props => {
|
|
|
7649
7416
|
if (type === Filter_TypeEnum.EXPRESSION) {
|
|
7650
7417
|
handleAdd(_e);
|
|
7651
7418
|
} else if (type === Filter_TypeEnum.NOT_EXISTS) {
|
|
7652
|
-
|
|
7419
|
+
showSubQuery(_index, _type);
|
|
7653
7420
|
}
|
|
7654
7421
|
}
|
|
7655
7422
|
})
|
|
@@ -7716,7 +7483,7 @@ const Filter = props => {
|
|
|
7716
7483
|
}, i) : jsxs("div", {
|
|
7717
7484
|
className: `Sqb-TableName purple-name`,
|
|
7718
7485
|
onClick: e => handleUpdate(e, i),
|
|
7719
|
-
children: [v.
|
|
7486
|
+
children: [v.quotes, jsx("span", {
|
|
7720
7487
|
style: {
|
|
7721
7488
|
fontSize: 0
|
|
7722
7489
|
},
|
|
@@ -7892,7 +7659,7 @@ const GroupBy = props => {
|
|
|
7892
7659
|
newMeta[index].by.splice(i, 1, data);
|
|
7893
7660
|
// @ts-ignore
|
|
7894
7661
|
newMeta[index].by = newMeta[index].by.map(v => {
|
|
7895
|
-
const fieldAlias = `${v.alias}__${v.name}`;
|
|
7662
|
+
const fieldAlias = v.fieldAlias || `${v.alias}__${v.name}`;
|
|
7896
7663
|
return {
|
|
7897
7664
|
...v,
|
|
7898
7665
|
sql: `${v.alias}.${v.realName || v.name} AS ${fieldAlias}`,
|
|
@@ -7926,8 +7693,8 @@ const GroupBy = props => {
|
|
|
7926
7693
|
quotes: '',
|
|
7927
7694
|
datasourceId: '',
|
|
7928
7695
|
datasourceName: '',
|
|
7929
|
-
|
|
7930
|
-
|
|
7696
|
+
column: '',
|
|
7697
|
+
column_id: '',
|
|
7931
7698
|
summarizeType: MetaSummarize_Enum.BY
|
|
7932
7699
|
};
|
|
7933
7700
|
store.setPopup({
|
|
@@ -7944,7 +7711,7 @@ const GroupBy = props => {
|
|
|
7944
7711
|
newMeta[index].by.push(data);
|
|
7945
7712
|
// @ts-ignore
|
|
7946
7713
|
newMeta[index].by = newMeta[index].by.map(v => {
|
|
7947
|
-
const fieldAlias = `${v.alias}__${v.name}`;
|
|
7714
|
+
const fieldAlias = v.fieldAlias || `${v.alias}__${v.name}`;
|
|
7948
7715
|
return {
|
|
7949
7716
|
...v,
|
|
7950
7717
|
sql: `${v.alias}.${v.realName || v.name} AS ${fieldAlias}`,
|
|
@@ -8188,8 +7955,8 @@ const SelectIndex = props => {
|
|
|
8188
7955
|
quotes: '',
|
|
8189
7956
|
datasourceId: '',
|
|
8190
7957
|
datasourceName: '',
|
|
8191
|
-
|
|
8192
|
-
|
|
7958
|
+
column: '',
|
|
7959
|
+
column_id: '',
|
|
8193
7960
|
summarizeType: MetaSummarize_Enum.GROUP
|
|
8194
7961
|
};
|
|
8195
7962
|
store.setPopup({
|
|
@@ -8759,8 +8526,7 @@ const Metabase = props => {
|
|
|
8759
8526
|
} = props;
|
|
8760
8527
|
const store = useStore$1();
|
|
8761
8528
|
const [saveLoading, setSaveLoading] = useState(false);
|
|
8762
|
-
|
|
8763
|
-
// store.setPopupContainer(popupContainer);
|
|
8529
|
+
const popupContainer = useRef();
|
|
8764
8530
|
const popupContent = useMemo(() => {
|
|
8765
8531
|
let {
|
|
8766
8532
|
visible,
|
|
@@ -8779,35 +8545,40 @@ const Metabase = props => {
|
|
|
8779
8545
|
}, [store.popupData2]);
|
|
8780
8546
|
const onSave = async () => {
|
|
8781
8547
|
let intercept = false; // 是否返回
|
|
8782
|
-
const _metaList = splitByUnion(store.metaList);
|
|
8783
8548
|
store.metaList.map(v => {
|
|
8784
|
-
if (v.type !== '
|
|
8549
|
+
if (v.type !== 'group' && !(v.list?.[0]).table.name) {
|
|
8785
8550
|
intercept = true;
|
|
8786
8551
|
return Toast.warning(__('data.pleaseSelectDataTable'));
|
|
8787
8552
|
}
|
|
8788
8553
|
});
|
|
8789
8554
|
if (saveLoading || intercept) return null;
|
|
8790
8555
|
setSaveLoading(true);
|
|
8791
|
-
|
|
8556
|
+
if (store.toolbar.includes('group')) {
|
|
8557
|
+
// 分组
|
|
8558
|
+
await onOk?.(store.metaList);
|
|
8559
|
+
} else {
|
|
8560
|
+
// 非分组
|
|
8561
|
+
await onOk?.(store.metaList[0].list);
|
|
8562
|
+
}
|
|
8792
8563
|
setSaveLoading(false);
|
|
8793
8564
|
};
|
|
8794
|
-
let zIndex =
|
|
8565
|
+
let zIndex = popupContainer.current ? getMaxZIndexInParents(popupContainer.current) : null;
|
|
8795
8566
|
return (
|
|
8796
8567
|
// @ts-ignore
|
|
8797
8568
|
jsx(VisualBox, {
|
|
8798
|
-
ref:
|
|
8569
|
+
ref: popupContainer,
|
|
8799
8570
|
children: jsxs("div", {
|
|
8800
8571
|
className: 'Sqb',
|
|
8801
8572
|
children: [store.metaList.map((v, index) => {
|
|
8802
|
-
if (v.type === '
|
|
8573
|
+
if (v.type === 'group' && v.operator) {
|
|
8803
8574
|
return jsx("div", {
|
|
8804
8575
|
className: cx(`Sqb-list`),
|
|
8805
8576
|
children: jsx(RowLimit$1, {
|
|
8806
|
-
|
|
8577
|
+
operator: v.operator,
|
|
8807
8578
|
meta: v,
|
|
8808
8579
|
groupIndex: index
|
|
8809
8580
|
})
|
|
8810
|
-
}, '
|
|
8581
|
+
}, 'group' + index);
|
|
8811
8582
|
}
|
|
8812
8583
|
return jsx("div", {
|
|
8813
8584
|
className: cx(`Sqb-list`),
|
|
@@ -8832,8 +8603,8 @@ const Metabase = props => {
|
|
|
8832
8603
|
disabled: saveLoading,
|
|
8833
8604
|
onClick: onSave,
|
|
8834
8605
|
children: btnText || __('SqlQueryBuilder.visualize')
|
|
8835
|
-
}) : null,
|
|
8836
|
-
container:
|
|
8606
|
+
}) : null, popupContainer.current && jsx(Popup, {
|
|
8607
|
+
container: popupContainer.current,
|
|
8837
8608
|
visible: store.popupData.visible,
|
|
8838
8609
|
node: store.popupData.node,
|
|
8839
8610
|
closable: store.popupClosable,
|
|
@@ -8844,8 +8615,8 @@ const Metabase = props => {
|
|
|
8844
8615
|
});
|
|
8845
8616
|
},
|
|
8846
8617
|
children: popupContent
|
|
8847
|
-
}),
|
|
8848
|
-
container:
|
|
8618
|
+
}), popupContainer.current && jsx(Popup, {
|
|
8619
|
+
container: popupContainer.current,
|
|
8849
8620
|
visible: store.popupData2.visible,
|
|
8850
8621
|
node: store.popupData2.node,
|
|
8851
8622
|
closable: store.popupClosable2,
|
|
@@ -8894,9 +8665,15 @@ const SqlVisionBuilder = /*#__PURE__*/React__default.forwardRef((props, ref) =>
|
|
|
8894
8665
|
store.setProps(props);
|
|
8895
8666
|
}, [props]);
|
|
8896
8667
|
useEffect(() => {
|
|
8897
|
-
|
|
8898
|
-
|
|
8899
|
-
|
|
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]);
|
|
8900
8677
|
useEffect(() => {
|
|
8901
8678
|
store.setSourceList(sourceList);
|
|
8902
8679
|
}, [sourceList]);
|