UNPKG

ze-react-component-library

Version:
923 lines (805 loc) 26.6 kB
"use strict"; function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; require("antd/lib/space/style"); var _space = _interopRequireDefault(require("antd/lib/space")); require("antd/lib/drawer/style"); var _drawer = _interopRequireDefault(require("antd/lib/drawer")); require("antd/lib/message/style"); var _message2 = _interopRequireDefault(require("antd/lib/message")); require("antd/lib/popconfirm/style"); var _popconfirm = _interopRequireDefault(require("antd/lib/popconfirm")); require("antd/lib/button/style"); var _button = _interopRequireDefault(require("antd/lib/button")); var _react = _interopRequireWildcard(require("react")); var _hooks = require("@umijs/hooks"); var _underscore = _interopRequireDefault(require("underscore")); var _flat = _interopRequireDefault(require("flat")); var _proProvider = _interopRequireDefault(require("@ant-design/pro-provider")); var _proTable = require("@ant-design/pro-table"); var _proForm = require("@ant-design/pro-form"); var _zeroetpApiSdk = require("zeroetp-api-sdk"); var _TsEditor = _interopRequireDefault(require("../components/TsEditor")); var _JsonEditor = _interopRequireDefault(require("./JsonEditor")); var _util = require("../util"); var _apis = require("./apis"); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var __assign = void 0 && (void 0).__assign || function () { __assign = Object.assign || function (t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } } return t; }; return __assign.apply(this, arguments); }; var __awaiter = void 0 && (void 0).__awaiter || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = void 0 && (void 0).__generator || function (thisArg, body) { var _ = { label: 0, sent: function sent() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function () { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (_) { try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; var __spreadArray = void 0 && (void 0).__spreadArray || function (to, from) { for (var i = 0, il = from.length, j = to.length; i < il; i++, j++) { to[j] = from[i]; } return to; }; var tsCodeRenderer = { render: function render(v, props) { return (props === null || props === void 0 ? void 0 : props.value) ? /*#__PURE__*/_react.default.createElement(_TsEditor.default, __assign({}, props, { readOnly: true, height: "100px", width: "100%" })) : "-"; }, renderFormItem: function renderFormItem(props) { return /*#__PURE__*/_react.default.createElement(_TsEditor.default, __assign({}, props === null || props === void 0 ? void 0 : props.fieldProps, { height: "100px", width: "100%" })); } }; var optionsOfTypeColumn = __spreadArray(__spreadArray([], _util.typePropertyOfSchema.constraints.enum), ["report"]).map(function (d) { return { label: _util.typePropertyOfSchema.constraints.enumText[d] || d, value: d }; }); var MeasurementEditor = function MeasurementEditor() { var _a = (0, _react.useState)(false), drawerVisible = _a[0], setDrawerVisible = _a[1]; var _b = (0, _react.useState)(), editingRecord = _b[0], setEditingRecord = _b[1]; var _c = (0, _react.useState)(false), saveLoading = _c[0], setSaveLoading = _c[1]; var editorRef = (0, _react.useRef)(); var values = (0, _react.useContext)(_proProvider.default); // 用来自定义ValueType // EditableProTable var _d = (0, _react.useState)([]), editableKeys = _d[0], setEditableRowKeys = _d[1]; var _e = (0, _react.useState)({}), codeEditorType = _e[0], setCodeEditorType = _e[1]; var _f = (0, _react.useState)(), codeEditorId = _f[0], setCodeEditorId = _f[1]; var _g = (0, _react.useState)([]), data = _g[0], setData = _g[1]; var codeValuesRef = (0, _react.useRef)({}); var formRef = (0, _react.useRef)(); var _h = (0, _hooks.useRequest)(_apis.getMeasurements, { formatResult: function formatResult(res) { var v = _underscore.default.sortBy((res === null || res === void 0 ? void 0 : res.data) || [], "schema"); setData(v.map(function (d) { return (0, _flat.default)(d, { safe: true }); })); return v; } }), loading = _h.loading, originalData = _h.data, reloadData = _h.run; var _j = (0, _hooks.useRequest)(_zeroetpApiSdk.getSchemas, { formatResult: function formatResult(res) { return (res === null || res === void 0 ? void 0 : res.schemas) || []; } }), _k = _j.data, schemas = _k === void 0 ? [] : _k, schemasLoading = _j.loading; var codeColumns = [{ dataIndex: "codeEditorType", title: "类型", valueEnum: { sql: { text: "sql" }, js: { text: "js" } }, hideInPayload: true }, { dataIndex: "run", title: "run函数", valueType: "code", hideInForm: codeEditorType[codeEditorId] !== "js", renderFormItem: tsCodeRenderer.renderFormItem }, { dataIndex: "shouldSplitGroupby", title: "shouldSplitGroupby函数", valueType: "code", hideInForm: codeEditorType[codeEditorId] !== "js", renderFormItem: tsCodeRenderer.renderFormItem }, { dataIndex: "sql", title: "sql", valueType: "code", hideInForm: codeEditorType[codeEditorId] !== "sql" }, { dataIndex: "sqlLeftJoinClause", title: "sqlLeftJoinClause", valueType: "code", hideInForm: codeEditorType[codeEditorId] !== "sql" }]; var getCodeType = function getCodeType(record) { var values = __assign(__assign({}, record), codeValuesRef.current[record._id]); var codeIsJs = values.run || values.shouldSplitGroupby; return codeIsJs ? "js" : "sql"; }; var onCodeCancel = function onCodeCancel(record) { var _a; codeValuesRef.current[record._id] = {}; var type = getCodeType(record); setCodeEditorType(function (p) { var _a; return __assign(__assign({}, p), (_a = {}, _a[record._id] = type, _a)); }); (_a = formRef.current) === null || _a === void 0 ? void 0 : _a.setFieldsValue({ codeEditorType: type }); }; var columns = [{ title: "Schema", dataIndex: "schema", valueType: "select", fixed: "left", fieldProps: { dropdownMatchSelectWidth: false, options: schemas === null || schemas === void 0 ? void 0 : schemas.map(function (d) { return { label: d.name + "\uFF08" + d._id + "\uFF09", value: d._id }; }) }, formItemProps: { rules: [{ required: true, message: "必填项" }] }, width: 160 }, { title: "指标名", dataIndex: "name", valueType: "text", fixed: "left", width: 120 }, { title: "同义词", dataIndex: "syno", valueType: "tag", hideInSearch: true, width: 200 }, { title: "类型", dataIndex: "type", valueType: "select", hideInSearch: true, width: 120, fieldProps: { options: optionsOfTypeColumn }, formItemProps: { rules: [{ required: true, message: "必填项" }] } }, { title: "是否可加?", dataIndex: "is_additive", valueType: "radio", hideInSearch: true, width: 120, fieldProps: { options: [{ label: "是", value: true }, { label: "否", value: false }] } }, { title: "代码", hideInSearch: true, hideInPayload: true, width: 120, render: function render(item, record) { var codeIsJs = record.run || record.shouldSplitGroupby; return /*#__PURE__*/_react.default.createElement(_proForm.BetaSchemaForm, { layoutType: "ModalForm", title: "\u4EE3\u7801\u8BE6\u60C5", initialValues: record, trigger: /*#__PURE__*/_react.default.createElement(_button.default, { type: "link", style: { padding: 0 } }, "\u70B9\u51FB\u67E5\u770B"), modalProps: { width: "80%", centered: true }, columns: [{ dataIndex: "run", title: "run函数", valueType: "code", readonly: true, hideInDescriptions: !codeIsJs, render: tsCodeRenderer.render }, { dataIndex: "shouldSplitGroupby", title: "shouldSplitGroupby函数", valueType: "code", readonly: true, hideInDescriptions: !codeIsJs, render: tsCodeRenderer.render }, { dataIndex: "sql", title: "sql", valueType: "code", readonly: true, hideInDescriptions: codeIsJs, fieldProps: { style: { width: "100%", overflow: "auto" } } }, { dataIndex: "sqlLeftJoinClause", title: "sqlLeftJoinClause", valueType: "code", readonly: true, hideInDescriptions: codeIsJs, fieldProps: { style: { width: "100%", overflow: "auto" } } }].filter(function (d) { return !d.hideInDescriptions; }), submitter: false }); }, renderFormItem: function renderFormItem(item, _a) { var record = _a.record; var type = codeEditorType[record._id] || getCodeType(record); return /*#__PURE__*/_react.default.createElement(_proForm.BetaSchemaForm, { layoutType: "ModalForm", title: "\u4EE3\u7801\u7F16\u8F91", formRef: formRef, initialValues: __assign(__assign(__assign({}, record), codeValuesRef.current[record._id]), { codeEditorType: type }), trigger: /*#__PURE__*/_react.default.createElement(_button.default, { type: "link", style: { padding: 0 }, onClick: function onClick() { setCodeEditorId(record._id); setCodeEditorType(function (p) { var _a; return __assign(__assign({}, p), (_a = {}, _a[record._id] = type, _a)); }); } }, "\u70B9\u51FB\u4FEE\u6539"), columns: codeColumns.map(function (d) { if (d.dataIndex === "codeEditorType") { return __assign(__assign({}, d), { fieldProps: { onChange: function onChange(v) { var _a; var values = ((_a = formRef.current) === null || _a === void 0 ? void 0 : _a.getFieldsValue()) || {}; codeValuesRef.current[record._id] = __assign(__assign({}, codeValuesRef.current[record._id] || {}), values); setCodeEditorType(function (p) { var _a; return __assign(__assign({}, p), (_a = {}, _a[record._id] = v, _a)); }); } } }); } return d; }), modalProps: { width: "80%", centered: true, onCancel: function onCancel() { onCodeCancel(record); } }, onFinish: function onFinish(values) { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) { if (values.codeEditorType === "js") { codeValuesRef.current[record._id] = __assign(__assign({}, values), { sql: undefined, sqlLeftJoinClause: undefined }); } else { codeValuesRef.current[record._id] = __assign(__assign({}, values), { run: undefined, shouldSplitGroupby: undefined }); } return [2 /*return*/ , true]; }); }); } }); } }, { title: "基础指标", width: 120, dataIndex: "basePred", hideInSearch: true, valueType: "string", tooltip: "【专家选项】指定此公式在智能归因功能中的结构分析所用的基础聚合指标。例:毛利率的基础聚合指标为销售额,那么毛利率公式的basePred就填销售额。" }, { title: "目标", width: 120, dataIndex: "target", hideInSearch: true, valueType: "number", render: function render(v, record) { if (typeof record.target !== "number") { return "-"; } return (0, _util.formatWithProperty)({ type: record.type, primal_type: record.primal_type }, record.target); } }, { title: "单位", dataIndex: "unit", width: 120, tooltip: "例如: (元)。此字段会显示在问答的结果旁边。" }, { title: "数字格式", dataIndex: "ui.formatter", width: 120, tooltip: "例如: 0,0.0A。格式配置详情请见使用文档" }, { title: "图表格式", dataIndex: "ui.representation", width: 120, valueType: "select", fieldProps: { options: [{ label: "柱状图", value: "column" }, { label: "横向柱状图", value: "bar" }, { label: "折线图", value: "line" }, { label: "面积图", value: "area" }, { label: "饼图", value: "pie" }] } }, { title: "说明", dataIndex: "description", hideInSearch: true, width: 200 }, { title: "操作", width: 160, valueType: "option", hideInSearch: true, hideInPayload: true, fixed: "right", render: function render(_text, record, _index, action) { return [/*#__PURE__*/_react.default.createElement("a", { key: "editable", onClick: function onClick() { var _a; (_a = action === null || action === void 0 ? void 0 : action.startEditable) === null || _a === void 0 ? void 0 : _a.call(action, record._id); } }, "\u7F16\u8F91"), /*#__PURE__*/_react.default.createElement("a", { key: "expert", onClick: function onClick() { setDrawerVisible(true); setEditingRecord(record); } }, "\u4E13\u5BB6"), /*#__PURE__*/_react.default.createElement(_popconfirm.default, { title: "\u662F\u5426\u786E\u5B9A\u5220\u9664", key: "delete", onConfirm: function onConfirm() { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/ , (0, _apis.deleteMeasurementsByName)(record)]; case 1: _a.sent(); reloadData(); return [2 /*return*/ ]; } }); }); } }, /*#__PURE__*/_react.default.createElement(_button.default, { type: "link", danger: true, style: { padding: 0 } }, "\u5220\u9664"))]; } }]; var onExpertCancel = function onExpertCancel() { setDrawerVisible(false); }; var getPayload = function getPayload(record) { if (!record) { return {}; } var payload = {}; Object.keys(record).forEach(function (k) { var _a; var v = (_a = record[k]) !== null && _a !== void 0 ? _a : ""; payload[k] = ("" + v).trim() === "" ? undefined : v; }); var finalPayload = _flat.default.unflatten(payload); if ("index" in finalPayload) { delete finalPayload._id; delete finalPayload[finalPayload.index]; delete finalPayload.index; } return finalPayload; }; var onSave = function onSave(rowKey, d) { return __awaiter(void 0, void 0, void 0, function () { var target, record, payload; return __generator(this, function (_a) { switch (_a.label) { case 0: setSaveLoading(true); target = data.find(function (d) { return d._id === rowKey; }); if (!target) return [3 /*break*/ , 2]; return [4 /*yield*/ , (0, _apis.deleteMeasurementsByName)(target)]; case 1: _a.sent(); _a.label = 2; case 2: record = __assign(__assign({}, (0, _flat.default)(d, { safe: true })), codeValuesRef.current[rowKey]); payload = getPayload(record); return [2 /*return*/ , (0, _apis.postMeasurements)(payload).then(function () { _message2.default.success("保存成功"); reloadData(); return true; }).catch(function (e) { _message2.default.error("" + e.message); // 如果是edit模式,那么因为之前delete掉了,所以存回来 if (target) { return (0, _apis.postMeasurements)(target); } return Promise.reject(e); }).finally(function () { setSaveLoading(false); })]; } }); }); }; return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_proProvider.default.Provider, { value: __assign(__assign({}, values), { valueTypeMap: (0, _util.customValueTypes)({ name: "schema", properties: columns.map(function (d) { return { name: d.dataIndex, type: d.valueType, primal_type: d.valueType }; }), type: "entity", _id: "schema" }) }) }, /*#__PURE__*/_react.default.createElement(_proTable.EditableProTable, { rowKey: "_id", scroll: { x: columns.reduce(function (p, c) { return p + Number(c.width); }, 0) }, recordCreatorProps: { position: "bottom", record: function record() { return { _id: (Math.random() * 1000000).toFixed(0) }; } }, loading: loading || schemasLoading, search: { labelWidth: "auto" }, onReset: function onReset() { setData(originalData); }, onSubmit: function onSubmit(filters) { setData(_underscore.default.filter(originalData, function (item) { var keys = Object.keys(filters); var res = true; keys.forEach(function (k) { var _a; res = res && ((_a = item[k]) === null || _a === void 0 ? void 0 : _a.includes(filters[k])); }); return res; })); }, columns: columns, value: data, editable: { type: "multiple", editableKeys: editableKeys, onCancel: function onCancel(rowKey, d, record) { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) { onCodeCancel(record); return [2 /*return*/ , true]; }); }); }, onSave: onSave, onChange: setEditableRowKeys } })), /*#__PURE__*/_react.default.createElement(_drawer.default, { open: drawerVisible, width: "90%", maskClosable: false, onClose: function onClose(e) { // 取消按esc退出弹窗 if (e.type === "keydown") { return; } onExpertCancel(); }, title: "\u6307\u6807\u7F16\u8F91-" + (editingRecord === null || editingRecord === void 0 ? void 0 : editingRecord.name), destroyOnClose: true, footer: /*#__PURE__*/_react.default.createElement("div", { style: { display: "flex", flexDirection: "row-reverse" } }, /*#__PURE__*/_react.default.createElement(_space.default, null, /*#__PURE__*/_react.default.createElement(_button.default, { onClick: function onClick() { onExpertCancel(); } }, "\u53D6\u6D88"), /*#__PURE__*/_react.default.createElement(_button.default, { type: "primary", onClick: function onClick() { return __awaiter(void 0, void 0, void 0, function () { var errors, record, codeIsJs, codeIsSql; return __generator(this, function (_a) { switch (_a.label) { case 0: if (!editorRef.current) return [3 /*break*/ , 3]; return [4 /*yield*/ , editorRef.current.validate()]; case 1: errors = _a.sent(); if (errors && errors.length > 0) { _message2.default.error("校验不通过,请检查!"); return [2 /*return*/ ]; } record = editorRef.current.get(); codeIsJs = record.run || record.shouldSplitGroupby; codeIsSql = record.sql || record.sqlLeftJoinClause; if (codeIsJs && codeIsSql) { _message2.default.error("js\u76F8\u5173\u5B57\u6BB5\uFF08run\u3001shouldSplitGroupby\uFF09\u6216sql\u76F8\u5173\u5B57\u6BB5\uFF08sql\u3001sqlLeftJoinClause\uFF09\n \u4E24\u7EC4\u5B57\u6BB5\u4E0D\u80FD\u540C\u65F6\u5B58\u5728\uFF0C\u8BF7\u68C0\u67E5\uFF01"); return [2 /*return*/ ]; } return [4 /*yield*/ , onSave(editingRecord._id, record)]; case 2: _a.sent(); setDrawerVisible(false); _a.label = 3; case 3: return [2 /*return*/ ]; } }); }); }, loading: saveLoading }, "\u786E\u5B9A"))) }, /*#__PURE__*/_react.default.createElement(_JsonEditor.default, { value: getPayload(editingRecord), editorRef: editorRef, editable: true, isCreate: editingRecord === null }))); }; var _default = MeasurementEditor; exports.default = _default;