UNPKG

fastlion-amis

Version:

一种MIS页面生成工具

308 lines (307 loc) 16.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); var react_1 = tslib_1.__importStar(require("react")); var components_1 = require("../../../components"); var antd_1 = require("antd"); var DragModal_1 = (0, tslib_1.__importDefault)(require("../../../components/DragModal")); require("./index.scss"); var lodash_1 = require("lodash"); var SqlOptimize = function (props) { var _a; var action = props.action, selectedList = props.selectedList, sqlStr = props.sqlStr, env = props.env, store = props.store; var _b = (0, react_1.useState)(false), visible = _b[0], setVisible = _b[1]; /** 生成语句后的数据源 */ var _c = (0, react_1.useState)({}), sqlData = _c[0], setSqlData = _c[1]; /** 表名列表 */ var _d = (0, react_1.useState)([]), tableList = _d[0], setTableList = _d[1]; /** 表名数据 */ var _e = (0, react_1.useState)(), tableName = _e[0], setTableName = _e[1]; /** 所有表 */ var _f = (0, react_1.useState)([]), allTable = _f[0], setAllTable = _f[1]; /** 主键对应的columns */ var _g = (0, react_1.useState)([]), primaryKeyColumns = _g[0], setPrimaryKeyColumns = _g[1]; /** 更新字段对应的columns */ var _h = (0, react_1.useState)([]), updateKeyColumns = _h[0], setUpdateKeyColumns = _h[1]; /** 生成语句的loading */ var _j = (0, react_1.useState)(false), genLoading = _j[0], setGenLoading = _j[1]; var mainTabRef = (0, react_1.useRef)(null); var reqMap = { tableList: { data: { sql: "${sql}" }, method: 'post', url: '/api/v1/db/tool/info' }, updateSql: { data: { columns: "${columns}", wheres: "${wheres}", tableName: "${tableName}", data: "${data}" }, method: 'post', url: '/api/v1/db/tool/script' } }; var columnsMap = { primaryKey: primaryKeyColumns, updateKey: updateKeyColumns }; var updateColumnsMap = { primaryKey: setPrimaryKeyColumns, updateKey: setUpdateKeyColumns }; (0, react_1.useEffect)(function () { if (visible) { handleGetTableNameList(); } }, [visible]); /** 获取表名列表 */ var handleGetTableNameList = function () { return (0, tslib_1.__awaiter)(void 0, void 0, void 0, function () { var params, res, tableNames; var _a; return (0, tslib_1.__generator)(this, function (_b) { switch (_b.label) { case 0: params = { sql: sqlStr }; return [4 /*yield*/, env.fetcher(reqMap['tableList'], params)]; case 1: res = _b.sent(); if (res.ok && res.data) { tableNames = res.data.map(function (item) { return ({ label: item.tableName, value: item.tableName }); }).filter(Boolean); setAllTable(res.data); /** 配置表名列表与默认表名 */ setTableName((_a = tableNames[0]) === null || _a === void 0 ? void 0 : _a['value']); setTableList(tableNames); /** 初始化第一个表名 */ handleGenColumns(res.data[0]); } return [2 /*return*/]; } }); }); }; var handleToggleTable = function (tableName) { var targetItem = allTable.find(function (item) { return item.tableName === tableName; }); if (targetItem) { setTableName(tableName); handleGenColumns(targetItem); } }; /** 初始化字段 */ var handleGenColumns = function (data) { var columns = data.columns, _a = data.primaryKey, primaryKey = _a === void 0 ? '' : _a; /** 配置主键列表 */ var pKeyColumns = columns.map(function (item) { return ({ label: item, value: item, type: 'primaryKey', checked: primaryKey.includes(item) }); }); var updateKeyColumns = columns.map(function (item) { return ({ label: item, value: item, type: 'updateKey' }); }); setPrimaryKeyColumns(pKeyColumns); setUpdateKeyColumns(updateKeyColumns); }; /** 选中 主键/更新字段 */ var handleColumnChange = function (column, e) { var type = column.type, value = column.value; var checked = e.target.checked; if (type === 'primaryKey') { setPrimaryKeyColumns(function (cols) { if (cols === void 0) { cols = []; } var newCols = cols.map(function (item) { return item.value === value ? ((0, tslib_1.__assign)((0, tslib_1.__assign)({}, item), { checked: checked })) : item; }); return newCols; }); } else { setUpdateKeyColumns(function (cols) { if (cols === void 0) { cols = []; } var newCols = cols.map(function (item) { return item.value === value ? ((0, tslib_1.__assign)((0, tslib_1.__assign)({}, item), { checked: checked })) : item; }); return newCols; }); } }; /** 获取主键 */ var handleGetPrimeKey = function () { var targetItem = allTable.find(function (item) { return item.tableName === tableName; }); if (targetItem) { var primaryKey = targetItem.primaryKey; // setPrimaryKeyColumns((cols) => { // const newCols = cols.map((item) => ({ ...item, checked: item.value === primaryKey })) // return newCols; // }); var key = Array.isArray(primaryKey) ? primaryKey[0] : primaryKey; debounceFilter(key, 'primaryKey', true); } }; /** 生成语句 */ var handleGenerateSql = function () { return (0, tslib_1.__awaiter)(void 0, void 0, void 0, function () { var updateColumns, primaryKeys, params, res; return (0, tslib_1.__generator)(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, , 2, 3]); setGenLoading(true); updateColumns = updateKeyColumns.map(function (item) { return item.checked ? item.value : undefined; }).filter(Boolean); primaryKeys = primaryKeyColumns.map(function (item) { return item.checked ? item.value : undefined; }).filter(Boolean); params = { tableName: tableName, columns: updateColumns, wheres: primaryKeys, data: selectedList }; return [4 /*yield*/, env.fetcher(reqMap['updateSql'], params)]; case 1: res = _a.sent(); if (res.ok && res.data) { antd_1.message.success('已生成语句'); setSqlData(res.data); } else { antd_1.message.error(res.msg); } return [3 /*break*/, 3]; case 2: setGenLoading(false); return [7 /*endfinally*/]; case 3: return [2 /*return*/]; } }); }); }; /** 执行过滤 */ var handleFilter = function (searchValue, type, forceCheck) { if (searchValue === void 0) { searchValue = ''; } var sortColumns = columnsMap[type]; var updateColumns = updateColumnsMap[type]; var trimVal = searchValue.trim(); //匹配规则,1.全匹配 2.以关键字开头匹配 3.模糊匹配 var target = sortColumns.find(function (item) { return item.label === trimVal; }); !target && (target = sortColumns.find(function (item) { var _a; return trimVal.length && ((_a = item.label) === null || _a === void 0 ? void 0 : _a.startsWith(trimVal)); })); !target && (target = sortColumns.find(function (item) { var _a; return trimVal.length && ((_a = item.label) === null || _a === void 0 ? void 0 : _a.includes(trimVal)); })); var value = (target !== null && target !== void 0 ? target : {}).value; updateColumns(function (columns) { var newColumns = columns.map(function (item) { return (0, tslib_1.__assign)((0, tslib_1.__assign)({}, item), { match: item.value === value, // 如果是获取主键,则默认只勾选默认主键 checked: forceCheck ? item.value === value : item.checked }); }); return newColumns; }); if (target) { setTimeout(function () { requestAnimationFrame(function () { var _a; var boxDom = (_a = mainTabRef.current) === null || _a === void 0 ? void 0 : _a.querySelector(".columns-box." + type); var matchItem = boxDom === null || boxDom === void 0 ? void 0 : boxDom.querySelector('.column-item.match'); matchItem === null || matchItem === void 0 ? void 0 : matchItem.scrollIntoView({ behavior: 'smooth', block: 'start' }); }); }, 100); } }; /** 关键词过滤时触发 */ var debounceFilter = (0, lodash_1.debounce)(handleFilter, 300); /** 切换选值 */ var columnCheck = function (checkType, columnType) { var _a; var columnsMap = { 'primaryKey': setPrimaryKeyColumns, 'updateKey': setUpdateKeyColumns }; (_a = columnsMap[columnType]) === null || _a === void 0 ? void 0 : _a.call(columnsMap, function (cols) { var newColumns = cols; switch (checkType) { /** 全选 */ case 'all': newColumns = cols.map(function (item) { return ((0, tslib_1.__assign)((0, tslib_1.__assign)({}, item), { checked: true, match: false })); }); break; /** 反选 */ case 'rebellion': newColumns = cols.map(function (item) { return ((0, tslib_1.__assign)((0, tslib_1.__assign)({}, item), { checked: !item.checked, match: false })); }); break; /** 不选 */ case 'clear': newColumns = cols.map(function (item) { return ((0, tslib_1.__assign)((0, tslib_1.__assign)({}, item), { checked: false, match: false })); }); break; } return newColumns; }); }; /** 渲染主键/更新字段 */ var columnTogglerRender = function () { var configs = [ { label: '主键', type: 'primaryKey' }, { label: '更新字段', type: 'updateKey' } ]; var render = configs.map(function (item) { var type = item.type, label = item.label; return (react_1.default.createElement("div", { className: "tab-item " + type, key: type }, react_1.default.createElement("div", { className: "title-box" }, react_1.default.createElement("div", { className: "l" }, label), react_1.default.createElement("div", { className: "r" }, react_1.default.createElement(antd_1.Button, { type: "link", size: "small", onClick: function () { return columnCheck('all', type); } }, "\u5168\u9009"), react_1.default.createElement(antd_1.Button, { type: "link", size: "small", onClick: function () { return columnCheck('rebellion', type); } }, "\u53CD\u9009"), react_1.default.createElement(antd_1.Button, { type: "link", size: "small", onClick: function () { return columnCheck('clear', type); } }, "\u4E0D\u9009"))), react_1.default.createElement("div", { className: "filter-box" }, react_1.default.createElement(antd_1.Input, { className: "filter-inp", placeholder: "\u8BF7\u8F93\u5165\u5173\u952E\u8BCD", onChange: function (e) { return debounceFilter(e.target.value, type); }, allowClear: true })), react_1.default.createElement("div", { className: "content columns-box " + type }, (columnsMap[type]).map(function (column) { return (react_1.default.createElement("div", { className: "column-item " + (column.match ? 'match' : ''), key: column.label }, react_1.default.createElement(antd_1.Checkbox, { key: column.label, checked: column.checked, onChange: function (e) { return handleColumnChange(column, e); } }, column.label))); })))); }); return render; }; /** 主选项渲染 */ var mainTabRenderer = function () { return (react_1.default.createElement("div", { className: "main-tab", ref: mainTabRef }, react_1.default.createElement("div", { className: "tab-item" }, react_1.default.createElement("div", { className: "title-box" }, react_1.default.createElement("div", { className: "l" }, "\u8868\u540D"), react_1.default.createElement("div", { className: "r" })), react_1.default.createElement("div", { className: "content" }, react_1.default.createElement(antd_1.Select, { className: "table-select", placeholder: "\u8BF7\u9009\u62E9\u8868\u540D", value: tableName, options: tableList, onChange: function (e) { return handleToggleTable(e); } }), react_1.default.createElement(antd_1.Button, { block: true, type: "primary", onClick: handleGetPrimeKey }, "\u83B7\u53D6\u4E3B\u952E"), react_1.default.createElement(antd_1.Button, { block: true, onClick: handleGenerateSql, loading: genLoading }, "\u751F\u6210\u8BED\u53E5"))), columnTogglerRender())); }; /** 新增/修改/删除 语句 */ var updateSqlRenderer = function (value) { if (value === void 0) { value = []; } var newStr = value.join('\n'); return (react_1.default.createElement("div", { className: "update-tab" }, react_1.default.createElement(antd_1.Input.TextArea, { value: newStr, autoSize: { minRows: 6, maxRows: 22 } }))); }; var handleResetData = function () { setTableName(undefined); setPrimaryKeyColumns([]); setUpdateKeyColumns([]); setVisible(false); }; var tabs = [ { label: '选项', key: 'main-tab', children: mainTabRenderer() }, { label: '新增语句', key: 'insert-tab', children: updateSqlRenderer(sqlData['insertSql']) }, { label: '修改语句', key: 'update-tab', children: updateSqlRenderer(sqlData['updateSql']) }, { label: '删除语句', key: 'del-tab', children: updateSqlRenderer(sqlData['deleteSql']) }, ]; return (react_1.default.createElement("div", { className: "sql-optimize-container" }, react_1.default.createElement(components_1.Button, { onClick: function () { return setVisible(true); }, className: "open-btn" }, action === null || action === void 0 ? void 0 : action.label), visible && react_1.default.createElement(DragModal_1.default, { className: "sql-optimize-dialog common-modal-component", width: 710, title: "\u751F\u6210\u8BED\u53E5", dialogVisible: visible, setFixRight: false, resizeable: false, canClickBelowDom: true, mask: false, bounds: "window", centered: true, setMaxSize: false, footer: false, getContainer: ((_a = env.container) !== null && _a !== void 0 ? _a : env.getModalContainer), onCancel: function () { return handleResetData(); } }, react_1.default.createElement(antd_1.Tabs, { defaultActiveKey: "main", type: "card", items: tabs })))); }; exports.default = SqlOptimize; //# sourceMappingURL=./renderers/Table/SqlOptimize/index.js.map