@gingkoo/pandora-metabase 1.0.149 → 1.0.151
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/components/dialog/select-table/index.js +22 -5
- package/lib/cjs/components/metabase/index.js +3 -2
- package/lib/cjs/components/right-click-menu.d.ts +1 -1
- package/lib/cjs/components/right-click-menu.js +48 -3
- package/lib/cjs/index.js +6 -5
- package/lib/es/components/dialog/select-table/index.js +22 -5
- package/lib/es/components/metabase/index.js +3 -2
- package/lib/es/components/right-click-menu.d.ts +1 -1
- package/lib/es/components/right-click-menu.js +49 -4
- package/lib/es/index.js +6 -5
- package/package.json +1 -1
|
@@ -22,6 +22,19 @@ var _Loading = _interopRequireDefault(require("../../../common/Loading"));
|
|
|
22
22
|
var _locale = require("../../../locale");
|
|
23
23
|
var _icons = require("../../icons");
|
|
24
24
|
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
|
|
25
|
+
var EMPTY_ARRAY = [];
|
|
26
|
+
function isStringArrayEqual(left, right) {
|
|
27
|
+
return left.length === right.length && left.every(function (item, index) {
|
|
28
|
+
return item === right[index];
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
function isSelectedTableTypesMapEqual(left, right) {
|
|
32
|
+
var leftKeys = Object.keys(left);
|
|
33
|
+
var rightKeys = Object.keys(right);
|
|
34
|
+
return isStringArrayEqual(leftKeys, rightKeys) && leftKeys.every(function (key) {
|
|
35
|
+
return isStringArrayEqual(left[key] || [], right[key] || []);
|
|
36
|
+
});
|
|
37
|
+
}
|
|
25
38
|
function focusWithoutScroll(input) {
|
|
26
39
|
if (!input) return;
|
|
27
40
|
setTimeout(function () {
|
|
@@ -78,9 +91,9 @@ function filterDatasourceTable(sourceTable, searchVal, selectedTableTypesMap) {
|
|
|
78
91
|
}
|
|
79
92
|
var SelectTable = function SelectTable(_ref) {
|
|
80
93
|
var _ref$data = _ref.data,
|
|
81
|
-
data = _ref$data === void 0 ?
|
|
94
|
+
data = _ref$data === void 0 ? EMPTY_ARRAY : _ref$data,
|
|
82
95
|
_ref$sourceTable = _ref.sourceTable,
|
|
83
|
-
sourceTable = _ref$sourceTable === void 0 ?
|
|
96
|
+
sourceTable = _ref$sourceTable === void 0 ? EMPTY_ARRAY : _ref$sourceTable,
|
|
84
97
|
value = _ref.value,
|
|
85
98
|
_ref$onChange = _ref.onChange,
|
|
86
99
|
onChange = _ref$onChange === void 0 ? function () {} : _ref$onChange,
|
|
@@ -188,21 +201,25 @@ var SelectTable = function SelectTable(_ref) {
|
|
|
188
201
|
}, [sourceTable, flatSearchVal, selectedFlatTableTypes]);
|
|
189
202
|
(0, _react.useEffect)(function () {
|
|
190
203
|
setSelectedTableTypes(function (prev) {
|
|
191
|
-
|
|
204
|
+
var next = prev.filter(function (v) {
|
|
192
205
|
return tableTypeOptions.includes(v);
|
|
193
206
|
});
|
|
207
|
+
return isStringArrayEqual(prev, next) ? prev : next;
|
|
194
208
|
});
|
|
195
209
|
}, [tableTypeOptions]);
|
|
196
210
|
(0, _react.useEffect)(function () {
|
|
197
211
|
setSelectedFlatTableTypes(function (prev) {
|
|
198
212
|
var next = Object.keys(flatTableTypeOptions).reduce(function (mo, datasourceId) {
|
|
199
213
|
var selected = prev[datasourceId] || [];
|
|
200
|
-
|
|
214
|
+
var nextSelected = selected.filter(function (v) {
|
|
201
215
|
return flatTableTypeOptions[datasourceId].includes(v);
|
|
202
216
|
});
|
|
217
|
+
if (nextSelected.length) {
|
|
218
|
+
mo[datasourceId] = nextSelected;
|
|
219
|
+
}
|
|
203
220
|
return mo;
|
|
204
221
|
}, {});
|
|
205
|
-
return next;
|
|
222
|
+
return isSelectedTableTypesMapEqual(prev, next) ? prev : next;
|
|
206
223
|
});
|
|
207
224
|
}, [flatTableTypeOptions]);
|
|
208
225
|
function onInput(e) {
|
|
@@ -29,6 +29,7 @@ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r
|
|
|
29
29
|
var VisualBox = _styledComponents["default"].div.attrs({
|
|
30
30
|
className: 'visual-box scroller'
|
|
31
31
|
})(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])([""])));
|
|
32
|
+
var EMPTY_ARRAY = [];
|
|
32
33
|
var Metabase = function Metabase(props) {
|
|
33
34
|
var _props$btnText = props.btnText,
|
|
34
35
|
btnText = _props$btnText === void 0 ? '' : _props$btnText,
|
|
@@ -39,7 +40,7 @@ var Metabase = function Metabase(props) {
|
|
|
39
40
|
moduleCopy = props.moduleCopy,
|
|
40
41
|
popupZIndex = props.popupZIndex,
|
|
41
42
|
_props$rightClickMenu = props.rightClickMenu,
|
|
42
|
-
rightClickMenu = _props$rightClickMenu === void 0 ?
|
|
43
|
+
rightClickMenu = _props$rightClickMenu === void 0 ? EMPTY_ARRAY : _props$rightClickMenu,
|
|
43
44
|
onRightClickMenuClick = props.onRightClickMenuClick;
|
|
44
45
|
var store = (0, _useProvider.useStore)();
|
|
45
46
|
var _useState = (0, _react.useState)(false),
|
|
@@ -158,7 +159,7 @@ var Metabase = function Metabase(props) {
|
|
|
158
159
|
};
|
|
159
160
|
}();
|
|
160
161
|
(0, _react.useEffect)(function () {
|
|
161
|
-
store.setRightClickMenu(rightClickMenu ||
|
|
162
|
+
store.setRightClickMenu(rightClickMenu || EMPTY_ARRAY);
|
|
162
163
|
store.setRightClickMenuClick(onRightClickMenuClick);
|
|
163
164
|
}, [rightClickMenu, onRightClickMenuClick]);
|
|
164
165
|
var copy = function copy() {
|
|
@@ -12,5 +12,5 @@ interface SqbRightClickMenuProps {
|
|
|
12
12
|
state?: RightClickMenuState | null;
|
|
13
13
|
setState?: (state: RightClickMenuState | null) => void;
|
|
14
14
|
}
|
|
15
|
-
declare const SqbRightClickMenu: ({ popupZIndex, state, setState }: SqbRightClickMenuProps) => React.
|
|
15
|
+
declare const SqbRightClickMenu: ({ popupZIndex, state, setState }: SqbRightClickMenuProps) => React.ReactPortal | null;
|
|
16
16
|
export default SqbRightClickMenu;
|
|
@@ -7,12 +7,15 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
7
7
|
exports.openSqbRightClickMenu = exports["default"] = void 0;
|
|
8
8
|
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
9
9
|
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/asyncToGenerator"));
|
|
10
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
|
|
10
11
|
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/typeof"));
|
|
11
12
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
12
13
|
var _react = require("react");
|
|
14
|
+
var _reactDom = _interopRequireDefault(require("react-dom"));
|
|
13
15
|
var _classnames = _interopRequireDefault(require("classnames"));
|
|
14
16
|
var _utils = require("../utils");
|
|
15
17
|
var _useProvider = require("../hooks/use-provider");
|
|
18
|
+
var MENU_VIEWPORT_GAP = 8;
|
|
16
19
|
var findRightClickTarget = function findRightClickTarget(target) {
|
|
17
20
|
var element = target instanceof HTMLElement ? target : null;
|
|
18
21
|
while (element) {
|
|
@@ -89,6 +92,18 @@ var SqbRightClickMenu = function SqbRightClickMenu(_ref) {
|
|
|
89
92
|
rightClickMenu = _store$rightClickMenu === void 0 ? [] : _store$rightClickMenu;
|
|
90
93
|
var rightClickMenuState = state === undefined ? store.rightClickMenuState : state;
|
|
91
94
|
var setRightClickMenuState = setState || store.setRightClickMenuState;
|
|
95
|
+
var menuRef = (0, _react.useRef)(null);
|
|
96
|
+
var _useState = (0, _react.useState)(null),
|
|
97
|
+
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
|
|
98
|
+
menuContainer = _useState2[0],
|
|
99
|
+
setMenuContainer = _useState2[1];
|
|
100
|
+
var _useState3 = (0, _react.useState)({
|
|
101
|
+
left: 0,
|
|
102
|
+
top: 0
|
|
103
|
+
}),
|
|
104
|
+
_useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
|
|
105
|
+
menuPosition = _useState4[0],
|
|
106
|
+
setMenuPosition = _useState4[1];
|
|
92
107
|
var handleRightClickMenuItem = function () {
|
|
93
108
|
var _ref2 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee(menuItem) {
|
|
94
109
|
var _store$getRightClickM2;
|
|
@@ -147,12 +162,40 @@ var SqbRightClickMenu = function SqbRightClickMenu(_ref) {
|
|
|
147
162
|
window.removeEventListener('resize', closeRightClickMenu);
|
|
148
163
|
};
|
|
149
164
|
}, [rightClickMenuState]);
|
|
165
|
+
(0, _react.useEffect)(function () {
|
|
166
|
+
if (!rightClickMenuState || typeof document === 'undefined') {
|
|
167
|
+
setMenuContainer(null);
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
var container = document.createElement('div');
|
|
171
|
+
container.setAttribute('data-sqb-right-click-menu-container', 'true');
|
|
172
|
+
document.body.appendChild(container);
|
|
173
|
+
setMenuContainer(container);
|
|
174
|
+
return function () {
|
|
175
|
+
if (document.body.contains(container)) {
|
|
176
|
+
document.body.removeChild(container);
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
}, [rightClickMenuState]);
|
|
180
|
+
(0, _react.useLayoutEffect)(function () {
|
|
181
|
+
if (!rightClickMenuState) return;
|
|
182
|
+
var menuElement = menuRef.current;
|
|
183
|
+
var menuWidth = (menuElement === null || menuElement === void 0 ? void 0 : menuElement.offsetWidth) || 0;
|
|
184
|
+
var menuHeight = (menuElement === null || menuElement === void 0 ? void 0 : menuElement.offsetHeight) || 0;
|
|
185
|
+
var maxLeft = Math.max(MENU_VIEWPORT_GAP, window.innerWidth - menuWidth - MENU_VIEWPORT_GAP);
|
|
186
|
+
var maxTop = Math.max(MENU_VIEWPORT_GAP, window.innerHeight - menuHeight - MENU_VIEWPORT_GAP);
|
|
187
|
+
setMenuPosition({
|
|
188
|
+
left: Math.min(Math.max(rightClickMenuState.x, MENU_VIEWPORT_GAP), maxLeft),
|
|
189
|
+
top: Math.min(Math.max(rightClickMenuState.y, MENU_VIEWPORT_GAP), maxTop)
|
|
190
|
+
});
|
|
191
|
+
}, [rightClickMenuState, rightClickMenu.length, menuContainer]);
|
|
150
192
|
if (!rightClickMenuState) return null;
|
|
151
|
-
|
|
193
|
+
var menuNode = (0, _jsxRuntime.jsx)("div", {
|
|
194
|
+
ref: menuRef,
|
|
152
195
|
className: 'Sqb-right-click-menu',
|
|
153
196
|
style: {
|
|
154
|
-
left:
|
|
155
|
-
top:
|
|
197
|
+
left: menuPosition.left,
|
|
198
|
+
top: menuPosition.top,
|
|
156
199
|
zIndex: popupZIndex ? popupZIndex + 10 : 9999
|
|
157
200
|
},
|
|
158
201
|
onClick: function onClick(event) {
|
|
@@ -175,5 +218,7 @@ var SqbRightClickMenu = function SqbRightClickMenu(_ref) {
|
|
|
175
218
|
}, menuItem.value);
|
|
176
219
|
})
|
|
177
220
|
});
|
|
221
|
+
if (!menuContainer) return null;
|
|
222
|
+
return _reactDom["default"].createPortal(menuNode, menuContainer);
|
|
178
223
|
};
|
|
179
224
|
var _default = exports["default"] = SqbRightClickMenu;
|
package/lib/cjs/index.js
CHANGED
|
@@ -20,6 +20,7 @@ var _utils = require("./utils");
|
|
|
20
20
|
var _cloneDeep = _interopRequireDefault(require("lodash/cloneDeep"));
|
|
21
21
|
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
|
|
22
22
|
var EMPTY_ARRAY = [];
|
|
23
|
+
var DEFAULT_TOOLBAR = ['filter', 'summarize', 'joinData', 'customColumn', 'sort', 'rowLimit'];
|
|
23
24
|
var SqlVisionBuilder = _react["default"].forwardRef(function (props, ref) {
|
|
24
25
|
var _props$loading = props.loading,
|
|
25
26
|
loading = _props$loading === void 0 ? false : _props$loading,
|
|
@@ -37,7 +38,7 @@ var SqlVisionBuilder = _react["default"].forwardRef(function (props, ref) {
|
|
|
37
38
|
_props$fieldNameTpl = props.fieldNameTpl,
|
|
38
39
|
fieldNameTpl = _props$fieldNameTpl === void 0 ? '${name}' : _props$fieldNameTpl,
|
|
39
40
|
_props$toolbar = props.toolbar,
|
|
40
|
-
toolbar = _props$toolbar === void 0 ?
|
|
41
|
+
toolbar = _props$toolbar === void 0 ? DEFAULT_TOOLBAR : _props$toolbar,
|
|
41
42
|
_props$value = props.value,
|
|
42
43
|
value = _props$value === void 0 ? EMPTY_ARRAY : _props$value,
|
|
43
44
|
_props$sourceList = props.sourceList,
|
|
@@ -120,8 +121,8 @@ var SqlVisionBuilder = _react["default"].forwardRef(function (props, ref) {
|
|
|
120
121
|
store.setToolbar(toolbar);
|
|
121
122
|
store.setShowSubquery(showSubquery);
|
|
122
123
|
store._setShowSubquery(subShowSubquery);
|
|
123
|
-
store.setConstantList(constantList ||
|
|
124
|
-
store.setFormulaTemplates(formulaTemplates ||
|
|
124
|
+
store.setConstantList(constantList || EMPTY_ARRAY);
|
|
125
|
+
store.setFormulaTemplates(formulaTemplates || EMPTY_ARRAY);
|
|
125
126
|
store.setIgnoreGroupByType(ignoreGroupByType);
|
|
126
127
|
store.setfilterCustomType(filterCustomType);
|
|
127
128
|
store.setIsExit(isExit);
|
|
@@ -130,7 +131,7 @@ var SqlVisionBuilder = _react["default"].forwardRef(function (props, ref) {
|
|
|
130
131
|
store.setGroupByEnableAlias(groupByEnableAlias);
|
|
131
132
|
store.setIsSelectFields(isSelectFields);
|
|
132
133
|
store.setTableFlat(tableFlat);
|
|
133
|
-
store.setCopyType(copyType ||
|
|
134
|
+
store.setCopyType(copyType || EMPTY_ARRAY);
|
|
134
135
|
store.setMetabaseCopy(metabaseCopy);
|
|
135
136
|
store.setModuleDiff(moduleDiff);
|
|
136
137
|
store.setShowFormulaSql(showFormulaSql);
|
|
@@ -139,7 +140,7 @@ var SqlVisionBuilder = _react["default"].forwardRef(function (props, ref) {
|
|
|
139
140
|
store.setIsSubquery(isSubquery);
|
|
140
141
|
store.setModuleCopy(moduleCopy);
|
|
141
142
|
store.setJoinAliasConflictCheck(joinAliasConflictCheck);
|
|
142
|
-
store.setOperatorList(operatorList ||
|
|
143
|
+
store.setOperatorList(operatorList || EMPTY_ARRAY);
|
|
143
144
|
}, [showFields, fieldNameTpl, tableNameTpl, toolbar, showSubquery, subShowSubquery, constantList, formulaTemplates, ignoreGroupByType, filterCustomType, isExit, tableEnableAlias, fieldEnableAlias, groupByEnableAlias, isSelectFields, tableFlat, copyType, metabaseCopy, moduleDiff, showFormulaSql, showFormulaDiff, matchBrackets, getFormulaSqlCode, getFormulaDiffCode, isSubquery, moduleCopy, joinAliasConflictCheck, operatorList]);
|
|
144
145
|
_react["default"].useImperativeHandle(ref, function () {
|
|
145
146
|
return {
|
|
@@ -14,6 +14,19 @@ import Loading from '../../../common/Loading';
|
|
|
14
14
|
import { __ } from '../../../locale';
|
|
15
15
|
import { replaceTpl } from '../../../utils/helper';
|
|
16
16
|
import { TableIcon, SearchIcon, DataSourceIcon, LeftArrowIcon } from '../../icons';
|
|
17
|
+
var EMPTY_ARRAY = [];
|
|
18
|
+
function isStringArrayEqual(left, right) {
|
|
19
|
+
return left.length === right.length && left.every(function (item, index) {
|
|
20
|
+
return item === right[index];
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
function isSelectedTableTypesMapEqual(left, right) {
|
|
24
|
+
var leftKeys = Object.keys(left);
|
|
25
|
+
var rightKeys = Object.keys(right);
|
|
26
|
+
return isStringArrayEqual(leftKeys, rightKeys) && leftKeys.every(function (key) {
|
|
27
|
+
return isStringArrayEqual(left[key] || [], right[key] || []);
|
|
28
|
+
});
|
|
29
|
+
}
|
|
17
30
|
function focusWithoutScroll(input) {
|
|
18
31
|
if (!input) return;
|
|
19
32
|
setTimeout(function () {
|
|
@@ -70,9 +83,9 @@ function filterDatasourceTable(sourceTable, searchVal, selectedTableTypesMap) {
|
|
|
70
83
|
}
|
|
71
84
|
var SelectTable = function SelectTable(_ref) {
|
|
72
85
|
var _ref$data = _ref.data,
|
|
73
|
-
data = _ref$data === void 0 ?
|
|
86
|
+
data = _ref$data === void 0 ? EMPTY_ARRAY : _ref$data,
|
|
74
87
|
_ref$sourceTable = _ref.sourceTable,
|
|
75
|
-
sourceTable = _ref$sourceTable === void 0 ?
|
|
88
|
+
sourceTable = _ref$sourceTable === void 0 ? EMPTY_ARRAY : _ref$sourceTable,
|
|
76
89
|
value = _ref.value,
|
|
77
90
|
_ref$onChange = _ref.onChange,
|
|
78
91
|
onChange = _ref$onChange === void 0 ? function () {} : _ref$onChange,
|
|
@@ -180,21 +193,25 @@ var SelectTable = function SelectTable(_ref) {
|
|
|
180
193
|
}, [sourceTable, flatSearchVal, selectedFlatTableTypes]);
|
|
181
194
|
useEffect(function () {
|
|
182
195
|
setSelectedTableTypes(function (prev) {
|
|
183
|
-
|
|
196
|
+
var next = prev.filter(function (v) {
|
|
184
197
|
return tableTypeOptions.includes(v);
|
|
185
198
|
});
|
|
199
|
+
return isStringArrayEqual(prev, next) ? prev : next;
|
|
186
200
|
});
|
|
187
201
|
}, [tableTypeOptions]);
|
|
188
202
|
useEffect(function () {
|
|
189
203
|
setSelectedFlatTableTypes(function (prev) {
|
|
190
204
|
var next = Object.keys(flatTableTypeOptions).reduce(function (mo, datasourceId) {
|
|
191
205
|
var selected = prev[datasourceId] || [];
|
|
192
|
-
|
|
206
|
+
var nextSelected = selected.filter(function (v) {
|
|
193
207
|
return flatTableTypeOptions[datasourceId].includes(v);
|
|
194
208
|
});
|
|
209
|
+
if (nextSelected.length) {
|
|
210
|
+
mo[datasourceId] = nextSelected;
|
|
211
|
+
}
|
|
195
212
|
return mo;
|
|
196
213
|
}, {});
|
|
197
|
-
return next;
|
|
214
|
+
return isSelectedTableTypesMapEqual(prev, next) ? prev : next;
|
|
198
215
|
});
|
|
199
216
|
}, [flatTableTypeOptions]);
|
|
200
217
|
function onInput(e) {
|
|
@@ -20,6 +20,7 @@ import SqbRightClickMenu, { openSqbRightClickMenu } from '../right-click-menu';
|
|
|
20
20
|
var VisualBox = Styled.div.attrs({
|
|
21
21
|
className: 'visual-box scroller'
|
|
22
22
|
})(_templateObject || (_templateObject = _taggedTemplateLiteral([""])));
|
|
23
|
+
var EMPTY_ARRAY = [];
|
|
23
24
|
var Metabase = function Metabase(props) {
|
|
24
25
|
var _props$btnText = props.btnText,
|
|
25
26
|
btnText = _props$btnText === void 0 ? '' : _props$btnText,
|
|
@@ -30,7 +31,7 @@ var Metabase = function Metabase(props) {
|
|
|
30
31
|
moduleCopy = props.moduleCopy,
|
|
31
32
|
popupZIndex = props.popupZIndex,
|
|
32
33
|
_props$rightClickMenu = props.rightClickMenu,
|
|
33
|
-
rightClickMenu = _props$rightClickMenu === void 0 ?
|
|
34
|
+
rightClickMenu = _props$rightClickMenu === void 0 ? EMPTY_ARRAY : _props$rightClickMenu,
|
|
34
35
|
onRightClickMenuClick = props.onRightClickMenuClick;
|
|
35
36
|
var store = useStore();
|
|
36
37
|
var _useState = useState(false),
|
|
@@ -149,7 +150,7 @@ var Metabase = function Metabase(props) {
|
|
|
149
150
|
};
|
|
150
151
|
}();
|
|
151
152
|
useEffect(function () {
|
|
152
|
-
store.setRightClickMenu(rightClickMenu ||
|
|
153
|
+
store.setRightClickMenu(rightClickMenu || EMPTY_ARRAY);
|
|
153
154
|
store.setRightClickMenuClick(onRightClickMenuClick);
|
|
154
155
|
}, [rightClickMenu, onRightClickMenuClick]);
|
|
155
156
|
var copy = function copy() {
|
|
@@ -12,5 +12,5 @@ interface SqbRightClickMenuProps {
|
|
|
12
12
|
state?: RightClickMenuState | null;
|
|
13
13
|
setState?: (state: RightClickMenuState | null) => void;
|
|
14
14
|
}
|
|
15
|
-
declare const SqbRightClickMenu: ({ popupZIndex, state, setState }: SqbRightClickMenuProps) => React.
|
|
15
|
+
declare const SqbRightClickMenu: ({ popupZIndex, state, setState }: SqbRightClickMenuProps) => React.ReactPortal | null;
|
|
16
16
|
export default SqbRightClickMenu;
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
|
|
2
|
+
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
2
3
|
import _typeof from "@babel/runtime/helpers/esm/typeof";
|
|
3
4
|
import _regeneratorRuntime from "@babel/runtime/regenerator";
|
|
4
5
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
5
|
-
import { useEffect } from 'react';
|
|
6
|
+
import { useEffect, useLayoutEffect, useRef, useState } from 'react';
|
|
7
|
+
import ReactDOM from 'react-dom';
|
|
6
8
|
import cx from 'classnames';
|
|
7
9
|
import { normalizeLegacySummarizeForSave, splitByUnion } from '../utils';
|
|
8
10
|
import { useStore } from '../hooks/use-provider';
|
|
11
|
+
var MENU_VIEWPORT_GAP = 8;
|
|
9
12
|
var findRightClickTarget = function findRightClickTarget(target) {
|
|
10
13
|
var element = target instanceof HTMLElement ? target : null;
|
|
11
14
|
while (element) {
|
|
@@ -82,6 +85,18 @@ var SqbRightClickMenu = function SqbRightClickMenu(_ref) {
|
|
|
82
85
|
rightClickMenu = _store$rightClickMenu === void 0 ? [] : _store$rightClickMenu;
|
|
83
86
|
var rightClickMenuState = state === undefined ? store.rightClickMenuState : state;
|
|
84
87
|
var setRightClickMenuState = setState || store.setRightClickMenuState;
|
|
88
|
+
var menuRef = useRef(null);
|
|
89
|
+
var _useState = useState(null),
|
|
90
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
91
|
+
menuContainer = _useState2[0],
|
|
92
|
+
setMenuContainer = _useState2[1];
|
|
93
|
+
var _useState3 = useState({
|
|
94
|
+
left: 0,
|
|
95
|
+
top: 0
|
|
96
|
+
}),
|
|
97
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
98
|
+
menuPosition = _useState4[0],
|
|
99
|
+
setMenuPosition = _useState4[1];
|
|
85
100
|
var handleRightClickMenuItem = function () {
|
|
86
101
|
var _ref2 = _asyncToGenerator(_regeneratorRuntime.mark(function _callee(menuItem) {
|
|
87
102
|
var _store$getRightClickM2;
|
|
@@ -140,12 +155,40 @@ var SqbRightClickMenu = function SqbRightClickMenu(_ref) {
|
|
|
140
155
|
window.removeEventListener('resize', closeRightClickMenu);
|
|
141
156
|
};
|
|
142
157
|
}, [rightClickMenuState]);
|
|
158
|
+
useEffect(function () {
|
|
159
|
+
if (!rightClickMenuState || typeof document === 'undefined') {
|
|
160
|
+
setMenuContainer(null);
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
var container = document.createElement('div');
|
|
164
|
+
container.setAttribute('data-sqb-right-click-menu-container', 'true');
|
|
165
|
+
document.body.appendChild(container);
|
|
166
|
+
setMenuContainer(container);
|
|
167
|
+
return function () {
|
|
168
|
+
if (document.body.contains(container)) {
|
|
169
|
+
document.body.removeChild(container);
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
}, [rightClickMenuState]);
|
|
173
|
+
useLayoutEffect(function () {
|
|
174
|
+
if (!rightClickMenuState) return;
|
|
175
|
+
var menuElement = menuRef.current;
|
|
176
|
+
var menuWidth = (menuElement === null || menuElement === void 0 ? void 0 : menuElement.offsetWidth) || 0;
|
|
177
|
+
var menuHeight = (menuElement === null || menuElement === void 0 ? void 0 : menuElement.offsetHeight) || 0;
|
|
178
|
+
var maxLeft = Math.max(MENU_VIEWPORT_GAP, window.innerWidth - menuWidth - MENU_VIEWPORT_GAP);
|
|
179
|
+
var maxTop = Math.max(MENU_VIEWPORT_GAP, window.innerHeight - menuHeight - MENU_VIEWPORT_GAP);
|
|
180
|
+
setMenuPosition({
|
|
181
|
+
left: Math.min(Math.max(rightClickMenuState.x, MENU_VIEWPORT_GAP), maxLeft),
|
|
182
|
+
top: Math.min(Math.max(rightClickMenuState.y, MENU_VIEWPORT_GAP), maxTop)
|
|
183
|
+
});
|
|
184
|
+
}, [rightClickMenuState, rightClickMenu.length, menuContainer]);
|
|
143
185
|
if (!rightClickMenuState) return null;
|
|
144
|
-
|
|
186
|
+
var menuNode = _jsx("div", {
|
|
187
|
+
ref: menuRef,
|
|
145
188
|
className: 'Sqb-right-click-menu',
|
|
146
189
|
style: {
|
|
147
|
-
left:
|
|
148
|
-
top:
|
|
190
|
+
left: menuPosition.left,
|
|
191
|
+
top: menuPosition.top,
|
|
149
192
|
zIndex: popupZIndex ? popupZIndex + 10 : 9999
|
|
150
193
|
},
|
|
151
194
|
onClick: function onClick(event) {
|
|
@@ -168,5 +211,7 @@ var SqbRightClickMenu = function SqbRightClickMenu(_ref) {
|
|
|
168
211
|
}, menuItem.value);
|
|
169
212
|
})
|
|
170
213
|
});
|
|
214
|
+
if (!menuContainer) return null;
|
|
215
|
+
return ReactDOM.createPortal(menuNode, menuContainer);
|
|
171
216
|
};
|
|
172
217
|
export default SqbRightClickMenu;
|
package/lib/es/index.js
CHANGED
|
@@ -11,6 +11,7 @@ import Metabase from './components/metabase';
|
|
|
11
11
|
import { reassembleByUnion, patchData, splitByUnion, normalizeLegacySummarizeForSave, normalizeAndOrStructure } from './utils';
|
|
12
12
|
import cloneDeep from 'lodash/cloneDeep';
|
|
13
13
|
var EMPTY_ARRAY = [];
|
|
14
|
+
var DEFAULT_TOOLBAR = ['filter', 'summarize', 'joinData', 'customColumn', 'sort', 'rowLimit'];
|
|
14
15
|
var SqlVisionBuilder = React.forwardRef(function (props, ref) {
|
|
15
16
|
var _props$loading = props.loading,
|
|
16
17
|
loading = _props$loading === void 0 ? false : _props$loading,
|
|
@@ -28,7 +29,7 @@ var SqlVisionBuilder = React.forwardRef(function (props, ref) {
|
|
|
28
29
|
_props$fieldNameTpl = props.fieldNameTpl,
|
|
29
30
|
fieldNameTpl = _props$fieldNameTpl === void 0 ? '${name}' : _props$fieldNameTpl,
|
|
30
31
|
_props$toolbar = props.toolbar,
|
|
31
|
-
toolbar = _props$toolbar === void 0 ?
|
|
32
|
+
toolbar = _props$toolbar === void 0 ? DEFAULT_TOOLBAR : _props$toolbar,
|
|
32
33
|
_props$value = props.value,
|
|
33
34
|
value = _props$value === void 0 ? EMPTY_ARRAY : _props$value,
|
|
34
35
|
_props$sourceList = props.sourceList,
|
|
@@ -111,8 +112,8 @@ var SqlVisionBuilder = React.forwardRef(function (props, ref) {
|
|
|
111
112
|
store.setToolbar(toolbar);
|
|
112
113
|
store.setShowSubquery(showSubquery);
|
|
113
114
|
store._setShowSubquery(subShowSubquery);
|
|
114
|
-
store.setConstantList(constantList ||
|
|
115
|
-
store.setFormulaTemplates(formulaTemplates ||
|
|
115
|
+
store.setConstantList(constantList || EMPTY_ARRAY);
|
|
116
|
+
store.setFormulaTemplates(formulaTemplates || EMPTY_ARRAY);
|
|
116
117
|
store.setIgnoreGroupByType(ignoreGroupByType);
|
|
117
118
|
store.setfilterCustomType(filterCustomType);
|
|
118
119
|
store.setIsExit(isExit);
|
|
@@ -121,7 +122,7 @@ var SqlVisionBuilder = React.forwardRef(function (props, ref) {
|
|
|
121
122
|
store.setGroupByEnableAlias(groupByEnableAlias);
|
|
122
123
|
store.setIsSelectFields(isSelectFields);
|
|
123
124
|
store.setTableFlat(tableFlat);
|
|
124
|
-
store.setCopyType(copyType ||
|
|
125
|
+
store.setCopyType(copyType || EMPTY_ARRAY);
|
|
125
126
|
store.setMetabaseCopy(metabaseCopy);
|
|
126
127
|
store.setModuleDiff(moduleDiff);
|
|
127
128
|
store.setShowFormulaSql(showFormulaSql);
|
|
@@ -130,7 +131,7 @@ var SqlVisionBuilder = React.forwardRef(function (props, ref) {
|
|
|
130
131
|
store.setIsSubquery(isSubquery);
|
|
131
132
|
store.setModuleCopy(moduleCopy);
|
|
132
133
|
store.setJoinAliasConflictCheck(joinAliasConflictCheck);
|
|
133
|
-
store.setOperatorList(operatorList ||
|
|
134
|
+
store.setOperatorList(operatorList || EMPTY_ARRAY);
|
|
134
135
|
}, [showFields, fieldNameTpl, tableNameTpl, toolbar, showSubquery, subShowSubquery, constantList, formulaTemplates, ignoreGroupByType, filterCustomType, isExit, tableEnableAlias, fieldEnableAlias, groupByEnableAlias, isSelectFields, tableFlat, copyType, metabaseCopy, moduleDiff, showFormulaSql, showFormulaDiff, matchBrackets, getFormulaSqlCode, getFormulaDiffCode, isSubquery, moduleCopy, joinAliasConflictCheck, operatorList]);
|
|
135
136
|
React.useImperativeHandle(ref, function () {
|
|
136
137
|
return {
|