@gingkoo/pandora-metabase 1.0.77 → 1.0.79
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/custom-editor/index.js +5 -0
- package/lib/cjs/components/dialog/formula-list/utils.js +39 -18
- package/lib/cjs/locale/en.js +3 -2
- package/lib/cjs/locale/zh.js +3 -2
- package/lib/es/components/dialog/custom-editor/index.js +6 -1
- package/lib/es/components/dialog/formula-list/utils.js +39 -18
- package/lib/es/locale/en.js +3 -2
- package/lib/es/locale/zh.js +3 -2
- package/package.json +1 -1
|
@@ -17,6 +17,7 @@ var _locale = require("../../../locale");
|
|
|
17
17
|
var _styledComponents = _interopRequireDefault(require("styled-components"));
|
|
18
18
|
var _types = require("../../../store/types");
|
|
19
19
|
var _pandora = require("@gingkoo/pandora");
|
|
20
|
+
var _utils2 = require("../../../utils");
|
|
20
21
|
var _templateObject; // import { getTemplate } from './utils';
|
|
21
22
|
// import { OptionsTypeEnum, customTypes, otherList, operatorList, functionList } from './enum';
|
|
22
23
|
var VisualBox = _styledComponents["default"].div.attrs({
|
|
@@ -48,6 +49,10 @@ var CaseEditor = function CaseEditor(props) {
|
|
|
48
49
|
};
|
|
49
50
|
// 确定
|
|
50
51
|
var _onOk = function _onOk() {
|
|
52
|
+
if (!(0, _utils2.isValidSQLAlias)(name)) {
|
|
53
|
+
_pandora.Toast.warning((0, _locale.__)('SqlQueryBuilder.nameForRules'));
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
51
56
|
typeof onOk === 'function' && (onOk === null || onOk === void 0 ? void 0 : onOk({
|
|
52
57
|
name: name,
|
|
53
58
|
formulaList: caseList
|
|
@@ -38,6 +38,12 @@ var insertTemplateAt = exports.insertTemplateAt = function insertTemplateAt(oldT
|
|
|
38
38
|
}, {
|
|
39
39
|
val: '',
|
|
40
40
|
type: _types.AtomsTypeEnum.UNKNOWN
|
|
41
|
+
}, {
|
|
42
|
+
val: 'else',
|
|
43
|
+
type: _types.AtomsTypeEnum.OPERATOR
|
|
44
|
+
}, {
|
|
45
|
+
val: '',
|
|
46
|
+
type: _types.AtomsTypeEnum.UNKNOWN
|
|
41
47
|
}, {
|
|
42
48
|
val: 'end',
|
|
43
49
|
type: _types.AtomsTypeEnum.OPERATOR
|
|
@@ -326,30 +332,45 @@ function validateParentheses(list) {
|
|
|
326
332
|
// CASE 语句不完整(缺少 END 或 WHEN/THEN)
|
|
327
333
|
function validateCaseStructure(list) {
|
|
328
334
|
for (var i = 0; i < list.length; i++) {
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
var
|
|
332
|
-
var
|
|
333
|
-
var
|
|
335
|
+
var item = list[i];
|
|
336
|
+
if (item.type === _types.AtomsTypeEnum.OPERATOR && item.val === 'case') {
|
|
337
|
+
var depth = 1;
|
|
338
|
+
var hasValidWhenThen = false;
|
|
339
|
+
var lastWasWhen = false; // 用于确保 then 前是 when
|
|
334
340
|
for (var j = i + 1; j < list.length; j++) {
|
|
335
|
-
var
|
|
336
|
-
if (
|
|
337
|
-
|
|
341
|
+
var token = list[j];
|
|
342
|
+
if (token.type !== _types.AtomsTypeEnum.OPERATOR) continue;
|
|
343
|
+
var val = token.val;
|
|
344
|
+
if (val === 'case') {
|
|
338
345
|
depth++;
|
|
339
|
-
} else if (
|
|
346
|
+
} else if (val === 'end') {
|
|
347
|
+
depth--;
|
|
340
348
|
if (depth === 0) {
|
|
341
|
-
|
|
342
|
-
|
|
349
|
+
// 当前 case 块结束
|
|
350
|
+
if (!hasValidWhenThen) {
|
|
351
|
+
return false; // 至少需要一个 when-then
|
|
352
|
+
}
|
|
353
|
+
break; // 成功找到匹配的 end
|
|
354
|
+
}
|
|
355
|
+
// 如果 depth < 0,说明 end 多余,但这里我们只关心当前 case,可忽略或报错
|
|
356
|
+
} else if (val === 'when') {
|
|
357
|
+
if (depth === 1) {
|
|
358
|
+
lastWasWhen = true;
|
|
359
|
+
}
|
|
360
|
+
} else if (val === 'then') {
|
|
361
|
+
if (depth === 1) {
|
|
362
|
+
if (!lastWasWhen) {
|
|
363
|
+
return false; // then 前没有 when
|
|
364
|
+
}
|
|
365
|
+
hasValidWhenThen = true;
|
|
366
|
+
lastWasWhen = false; // then 消费掉 when
|
|
343
367
|
}
|
|
344
|
-
} else if (item.val === 'when' && depth === 1) {
|
|
345
|
-
foundWhen = true;
|
|
346
|
-
} else if (item.val === 'then' && depth === 1) {
|
|
347
|
-
if (!foundWhen) return false; // then 前无 when
|
|
348
|
-
foundThen = true;
|
|
349
368
|
}
|
|
369
|
+
// 注意:其他操作符(如 else)可在此扩展
|
|
350
370
|
}
|
|
351
|
-
|
|
352
|
-
|
|
371
|
+
// 如果循环结束还没找到匹配的 end(即 depth > 0)
|
|
372
|
+
if (depth > 0) {
|
|
373
|
+
return false; // 缺少 end
|
|
353
374
|
}
|
|
354
375
|
}
|
|
355
376
|
}
|
package/lib/cjs/locale/en.js
CHANGED
|
@@ -56,6 +56,7 @@ var _default = exports["default"] = (0, _index.register)('en', {
|
|
|
56
56
|
'SqlQueryBuilder.selectColumnAll': 'select all',
|
|
57
57
|
'SqlQueryBuilder.alias': 'alias',
|
|
58
58
|
'SqlQueryBuilder.aliasForRules': 'The alias only supports a combination of letters, numbers, and underscores. It must start with a letter and cannot exceed 30 bytes',
|
|
59
|
+
'SqlQueryBuilder.nameForRules': 'The name only supports a combination of letters, numbers, and underscores. It must start with a letter and cannot exceed 30 bytes',
|
|
59
60
|
'SqlQueryBuilder.pleaseSelectTable': 'The currently dependent table is empty or has been deleted',
|
|
60
61
|
'SqlQueryBuilder.repeatAlias': 'If there are duplicate names, please modify them',
|
|
61
62
|
'customColumn.operator': 'operator',
|
|
@@ -167,8 +168,8 @@ var _default = exports["default"] = (0, _index.register)('en', {
|
|
|
167
168
|
'metabase.nextOk': 'ok',
|
|
168
169
|
'metabase.verify': 'The table has been modified. Please select again',
|
|
169
170
|
'metabase.validationFailed': 'Validation failed. Do you still want to save?',
|
|
170
|
-
'metabase.validationFilter': 'The filter configuration is incorrect
|
|
171
|
-
'metabase.validationFormula': 'The formula configuration is incorrect
|
|
171
|
+
'metabase.validationFilter': 'The filter configuration is incorrect. Saving is prohibited!',
|
|
172
|
+
'metabase.validationFormula': 'The formula configuration is incorrect. Saving is prohibited!',
|
|
172
173
|
'metabase.prompt': 'Prompt',
|
|
173
174
|
'metabase.copy': 'Copy',
|
|
174
175
|
'metabase.copySuccess': 'Copy success',
|
package/lib/cjs/locale/zh.js
CHANGED
|
@@ -52,6 +52,7 @@ var _default = exports["default"] = (0, _index.register)('zh', {
|
|
|
52
52
|
'SqlQueryBuilder.selectColumnAll': '全选',
|
|
53
53
|
'SqlQueryBuilder.alias': '别名',
|
|
54
54
|
'SqlQueryBuilder.aliasForRules': '别名只支持字母 + 数字 + 下划线组合,必须是字母开头,且不能超过30个字节',
|
|
55
|
+
'SqlQueryBuilder.nameForRules': '名字只支持字母 + 数字 + 下划线组合,必须是字母开头,且不能超过30个字节',
|
|
55
56
|
'SqlQueryBuilder.pleaseSelectTable': '当前依赖的表为空或被删除',
|
|
56
57
|
'SqlQueryBuilder.repeatAlias': '有重名请修改',
|
|
57
58
|
'customColumn.operator': '操作符',
|
|
@@ -167,8 +168,8 @@ var _default = exports["default"] = (0, _index.register)('zh', {
|
|
|
167
168
|
'metabase.nextOk': '确定',
|
|
168
169
|
'metabase.verify': '表已修改,请重新选择',
|
|
169
170
|
'metabase.validationFailed': '校验未通过,是否依然保存?',
|
|
170
|
-
'metabase.validationFilter': '
|
|
171
|
-
'metabase.validationFormula': '
|
|
171
|
+
'metabase.validationFilter': '过滤器配置有误,禁止保存!',
|
|
172
|
+
'metabase.validationFormula': '公式配置有误,禁止保存!',
|
|
172
173
|
'metabase.prompt': '提示',
|
|
173
174
|
'metabase.copy': '复制',
|
|
174
175
|
'metabase.copySuccess': '复制成功',
|
|
@@ -12,7 +12,8 @@ import { __ } from '../../../locale';
|
|
|
12
12
|
import Styled from 'styled-components';
|
|
13
13
|
// import { OptionsTypeEnum, customTypes, otherList, operatorList, functionList } from './enum';
|
|
14
14
|
import { FormulaTypeEnum } from '../../../store/types';
|
|
15
|
-
import { Input } from '@gingkoo/pandora';
|
|
15
|
+
import { Input, Toast } from '@gingkoo/pandora';
|
|
16
|
+
import { isValidSQLAlias } from '../../../utils';
|
|
16
17
|
var VisualBox = Styled.div.attrs({
|
|
17
18
|
className: 'visual-box'
|
|
18
19
|
})(_templateObject || (_templateObject = _taggedTemplateLiteral([""])));
|
|
@@ -42,6 +43,10 @@ var CaseEditor = function CaseEditor(props) {
|
|
|
42
43
|
};
|
|
43
44
|
// 确定
|
|
44
45
|
var _onOk = function _onOk() {
|
|
46
|
+
if (!isValidSQLAlias(name)) {
|
|
47
|
+
Toast.warning(__('SqlQueryBuilder.nameForRules'));
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
45
50
|
typeof onOk === 'function' && (onOk === null || onOk === void 0 ? void 0 : onOk({
|
|
46
51
|
name: name,
|
|
47
52
|
formulaList: caseList
|
|
@@ -30,6 +30,12 @@ export var insertTemplateAt = function insertTemplateAt(oldType, type, list, ind
|
|
|
30
30
|
}, {
|
|
31
31
|
val: '',
|
|
32
32
|
type: AtomsTypeEnum.UNKNOWN
|
|
33
|
+
}, {
|
|
34
|
+
val: 'else',
|
|
35
|
+
type: AtomsTypeEnum.OPERATOR
|
|
36
|
+
}, {
|
|
37
|
+
val: '',
|
|
38
|
+
type: AtomsTypeEnum.UNKNOWN
|
|
33
39
|
}, {
|
|
34
40
|
val: 'end',
|
|
35
41
|
type: AtomsTypeEnum.OPERATOR
|
|
@@ -319,30 +325,45 @@ function validateParentheses(list) {
|
|
|
319
325
|
// CASE 语句不完整(缺少 END 或 WHEN/THEN)
|
|
320
326
|
function validateCaseStructure(list) {
|
|
321
327
|
for (var i = 0; i < list.length; i++) {
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
var
|
|
325
|
-
var
|
|
326
|
-
var
|
|
328
|
+
var item = list[i];
|
|
329
|
+
if (item.type === AtomsTypeEnum.OPERATOR && item.val === 'case') {
|
|
330
|
+
var depth = 1;
|
|
331
|
+
var hasValidWhenThen = false;
|
|
332
|
+
var lastWasWhen = false; // 用于确保 then 前是 when
|
|
327
333
|
for (var j = i + 1; j < list.length; j++) {
|
|
328
|
-
var
|
|
329
|
-
if (
|
|
330
|
-
|
|
334
|
+
var token = list[j];
|
|
335
|
+
if (token.type !== AtomsTypeEnum.OPERATOR) continue;
|
|
336
|
+
var val = token.val;
|
|
337
|
+
if (val === 'case') {
|
|
331
338
|
depth++;
|
|
332
|
-
} else if (
|
|
339
|
+
} else if (val === 'end') {
|
|
340
|
+
depth--;
|
|
333
341
|
if (depth === 0) {
|
|
334
|
-
|
|
335
|
-
|
|
342
|
+
// 当前 case 块结束
|
|
343
|
+
if (!hasValidWhenThen) {
|
|
344
|
+
return false; // 至少需要一个 when-then
|
|
345
|
+
}
|
|
346
|
+
break; // 成功找到匹配的 end
|
|
347
|
+
}
|
|
348
|
+
// 如果 depth < 0,说明 end 多余,但这里我们只关心当前 case,可忽略或报错
|
|
349
|
+
} else if (val === 'when') {
|
|
350
|
+
if (depth === 1) {
|
|
351
|
+
lastWasWhen = true;
|
|
352
|
+
}
|
|
353
|
+
} else if (val === 'then') {
|
|
354
|
+
if (depth === 1) {
|
|
355
|
+
if (!lastWasWhen) {
|
|
356
|
+
return false; // then 前没有 when
|
|
357
|
+
}
|
|
358
|
+
hasValidWhenThen = true;
|
|
359
|
+
lastWasWhen = false; // then 消费掉 when
|
|
336
360
|
}
|
|
337
|
-
} else if (item.val === 'when' && depth === 1) {
|
|
338
|
-
foundWhen = true;
|
|
339
|
-
} else if (item.val === 'then' && depth === 1) {
|
|
340
|
-
if (!foundWhen) return false; // then 前无 when
|
|
341
|
-
foundThen = true;
|
|
342
361
|
}
|
|
362
|
+
// 注意:其他操作符(如 else)可在此扩展
|
|
343
363
|
}
|
|
344
|
-
|
|
345
|
-
|
|
364
|
+
// 如果循环结束还没找到匹配的 end(即 depth > 0)
|
|
365
|
+
if (depth > 0) {
|
|
366
|
+
return false; // 缺少 end
|
|
346
367
|
}
|
|
347
368
|
}
|
|
348
369
|
}
|
package/lib/es/locale/en.js
CHANGED
|
@@ -50,6 +50,7 @@ export default register('en', {
|
|
|
50
50
|
'SqlQueryBuilder.selectColumnAll': 'select all',
|
|
51
51
|
'SqlQueryBuilder.alias': 'alias',
|
|
52
52
|
'SqlQueryBuilder.aliasForRules': 'The alias only supports a combination of letters, numbers, and underscores. It must start with a letter and cannot exceed 30 bytes',
|
|
53
|
+
'SqlQueryBuilder.nameForRules': 'The name only supports a combination of letters, numbers, and underscores. It must start with a letter and cannot exceed 30 bytes',
|
|
53
54
|
'SqlQueryBuilder.pleaseSelectTable': 'The currently dependent table is empty or has been deleted',
|
|
54
55
|
'SqlQueryBuilder.repeatAlias': 'If there are duplicate names, please modify them',
|
|
55
56
|
'customColumn.operator': 'operator',
|
|
@@ -161,8 +162,8 @@ export default register('en', {
|
|
|
161
162
|
'metabase.nextOk': 'ok',
|
|
162
163
|
'metabase.verify': 'The table has been modified. Please select again',
|
|
163
164
|
'metabase.validationFailed': 'Validation failed. Do you still want to save?',
|
|
164
|
-
'metabase.validationFilter': 'The filter configuration is incorrect
|
|
165
|
-
'metabase.validationFormula': 'The formula configuration is incorrect
|
|
165
|
+
'metabase.validationFilter': 'The filter configuration is incorrect. Saving is prohibited!',
|
|
166
|
+
'metabase.validationFormula': 'The formula configuration is incorrect. Saving is prohibited!',
|
|
166
167
|
'metabase.prompt': 'Prompt',
|
|
167
168
|
'metabase.copy': 'Copy',
|
|
168
169
|
'metabase.copySuccess': 'Copy success',
|
package/lib/es/locale/zh.js
CHANGED
|
@@ -46,6 +46,7 @@ export default register('zh', {
|
|
|
46
46
|
'SqlQueryBuilder.selectColumnAll': '全选',
|
|
47
47
|
'SqlQueryBuilder.alias': '别名',
|
|
48
48
|
'SqlQueryBuilder.aliasForRules': '别名只支持字母 + 数字 + 下划线组合,必须是字母开头,且不能超过30个字节',
|
|
49
|
+
'SqlQueryBuilder.nameForRules': '名字只支持字母 + 数字 + 下划线组合,必须是字母开头,且不能超过30个字节',
|
|
49
50
|
'SqlQueryBuilder.pleaseSelectTable': '当前依赖的表为空或被删除',
|
|
50
51
|
'SqlQueryBuilder.repeatAlias': '有重名请修改',
|
|
51
52
|
'customColumn.operator': '操作符',
|
|
@@ -161,8 +162,8 @@ export default register('zh', {
|
|
|
161
162
|
'metabase.nextOk': '确定',
|
|
162
163
|
'metabase.verify': '表已修改,请重新选择',
|
|
163
164
|
'metabase.validationFailed': '校验未通过,是否依然保存?',
|
|
164
|
-
'metabase.validationFilter': '
|
|
165
|
-
'metabase.validationFormula': '
|
|
165
|
+
'metabase.validationFilter': '过滤器配置有误,禁止保存!',
|
|
166
|
+
'metabase.validationFormula': '公式配置有误,禁止保存!',
|
|
166
167
|
'metabase.prompt': '提示',
|
|
167
168
|
'metabase.copy': '复制',
|
|
168
169
|
'metabase.copySuccess': '复制成功',
|