@jiangood/open-admin 2.3.1 → 2.4.0
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/package.json +1 -1
- package/src/.umi-production/appData.json +42 -42
- package/src/pages/system/dict/index.jsx +214 -94
package/package.json
CHANGED
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"dev": "umi dev",
|
|
39
39
|
"build": "umi build"
|
|
40
40
|
},
|
|
41
|
-
"version": "2.
|
|
41
|
+
"version": "2.4.0"
|
|
42
42
|
},
|
|
43
43
|
"pkgPath": "/home/runner/work/open-admin/open-admin/web/package.json",
|
|
44
44
|
"plugins": {
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
"config": {},
|
|
52
52
|
"time": {
|
|
53
53
|
"hooks": {},
|
|
54
|
-
"register":
|
|
54
|
+
"register": 0
|
|
55
55
|
},
|
|
56
56
|
"enableBy": "register"
|
|
57
57
|
},
|
|
@@ -98,7 +98,7 @@
|
|
|
98
98
|
0
|
|
99
99
|
]
|
|
100
100
|
},
|
|
101
|
-
"register":
|
|
101
|
+
"register": 1
|
|
102
102
|
},
|
|
103
103
|
"enableBy": "register"
|
|
104
104
|
},
|
|
@@ -128,7 +128,7 @@
|
|
|
128
128
|
"config": {},
|
|
129
129
|
"time": {
|
|
130
130
|
"hooks": {},
|
|
131
|
-
"register":
|
|
131
|
+
"register": 1
|
|
132
132
|
},
|
|
133
133
|
"enableBy": "register"
|
|
134
134
|
},
|
|
@@ -142,7 +142,7 @@
|
|
|
142
142
|
"time": {
|
|
143
143
|
"hooks": {
|
|
144
144
|
"modifyAppData": [
|
|
145
|
-
|
|
145
|
+
55
|
|
146
146
|
]
|
|
147
147
|
},
|
|
148
148
|
"register": 21
|
|
@@ -158,7 +158,7 @@
|
|
|
158
158
|
"config": {},
|
|
159
159
|
"time": {
|
|
160
160
|
"hooks": {},
|
|
161
|
-
"register":
|
|
161
|
+
"register": 0
|
|
162
162
|
},
|
|
163
163
|
"enableBy": "register"
|
|
164
164
|
},
|
|
@@ -208,7 +208,7 @@
|
|
|
208
208
|
"config": {},
|
|
209
209
|
"time": {
|
|
210
210
|
"hooks": {},
|
|
211
|
-
"register":
|
|
211
|
+
"register": 0
|
|
212
212
|
},
|
|
213
213
|
"enableBy": "config"
|
|
214
214
|
},
|
|
@@ -225,7 +225,7 @@
|
|
|
225
225
|
0
|
|
226
226
|
]
|
|
227
227
|
},
|
|
228
|
-
"register":
|
|
228
|
+
"register": 6
|
|
229
229
|
},
|
|
230
230
|
"enableBy": "register"
|
|
231
231
|
},
|
|
@@ -1077,7 +1077,7 @@
|
|
|
1077
1077
|
"config": {},
|
|
1078
1078
|
"time": {
|
|
1079
1079
|
"hooks": {},
|
|
1080
|
-
"register":
|
|
1080
|
+
"register": 1
|
|
1081
1081
|
},
|
|
1082
1082
|
"enableBy": "config"
|
|
1083
1083
|
},
|
|
@@ -1120,7 +1120,7 @@
|
|
|
1120
1120
|
"config": {},
|
|
1121
1121
|
"time": {
|
|
1122
1122
|
"hooks": {},
|
|
1123
|
-
"register":
|
|
1123
|
+
"register": 95
|
|
1124
1124
|
},
|
|
1125
1125
|
"enableBy": "register"
|
|
1126
1126
|
},
|
|
@@ -1133,7 +1133,7 @@
|
|
|
1133
1133
|
"config": {},
|
|
1134
1134
|
"time": {
|
|
1135
1135
|
"hooks": {},
|
|
1136
|
-
"register":
|
|
1136
|
+
"register": 29
|
|
1137
1137
|
},
|
|
1138
1138
|
"enableBy": "config"
|
|
1139
1139
|
},
|
|
@@ -1163,7 +1163,7 @@
|
|
|
1163
1163
|
1
|
|
1164
1164
|
]
|
|
1165
1165
|
},
|
|
1166
|
-
"register":
|
|
1166
|
+
"register": 1
|
|
1167
1167
|
},
|
|
1168
1168
|
"enableBy": "register"
|
|
1169
1169
|
},
|
|
@@ -1176,7 +1176,7 @@
|
|
|
1176
1176
|
"config": {},
|
|
1177
1177
|
"time": {
|
|
1178
1178
|
"hooks": {},
|
|
1179
|
-
"register":
|
|
1179
|
+
"register": 0
|
|
1180
1180
|
},
|
|
1181
1181
|
"enableBy": "register"
|
|
1182
1182
|
},
|
|
@@ -1202,7 +1202,7 @@
|
|
|
1202
1202
|
"config": {},
|
|
1203
1203
|
"time": {
|
|
1204
1204
|
"hooks": {},
|
|
1205
|
-
"register":
|
|
1205
|
+
"register": 31
|
|
1206
1206
|
}
|
|
1207
1207
|
},
|
|
1208
1208
|
"./node_modules/@umijs/preset-umi/dist/features/mpa/mpa": {
|
|
@@ -1227,7 +1227,7 @@
|
|
|
1227
1227
|
"config": {},
|
|
1228
1228
|
"time": {
|
|
1229
1229
|
"hooks": {},
|
|
1230
|
-
"register":
|
|
1230
|
+
"register": 0
|
|
1231
1231
|
}
|
|
1232
1232
|
},
|
|
1233
1233
|
"./node_modules/@umijs/preset-umi/dist/features/overrides/overrides": {
|
|
@@ -1281,7 +1281,7 @@
|
|
|
1281
1281
|
"config": {},
|
|
1282
1282
|
"time": {
|
|
1283
1283
|
"hooks": {},
|
|
1284
|
-
"register":
|
|
1284
|
+
"register": 1
|
|
1285
1285
|
},
|
|
1286
1286
|
"enableBy": "register"
|
|
1287
1287
|
},
|
|
@@ -1384,7 +1384,7 @@
|
|
|
1384
1384
|
"config": {},
|
|
1385
1385
|
"time": {
|
|
1386
1386
|
"hooks": {},
|
|
1387
|
-
"register":
|
|
1387
|
+
"register": 1
|
|
1388
1388
|
},
|
|
1389
1389
|
"enableBy": "config"
|
|
1390
1390
|
},
|
|
@@ -1397,7 +1397,7 @@
|
|
|
1397
1397
|
"config": {},
|
|
1398
1398
|
"time": {
|
|
1399
1399
|
"hooks": {},
|
|
1400
|
-
"register":
|
|
1400
|
+
"register": 2
|
|
1401
1401
|
},
|
|
1402
1402
|
"enableBy": "register"
|
|
1403
1403
|
},
|
|
@@ -1436,7 +1436,7 @@
|
|
|
1436
1436
|
"config": {},
|
|
1437
1437
|
"time": {
|
|
1438
1438
|
"hooks": {},
|
|
1439
|
-
"register":
|
|
1439
|
+
"register": 0
|
|
1440
1440
|
},
|
|
1441
1441
|
"enableBy": "config"
|
|
1442
1442
|
},
|
|
@@ -1449,7 +1449,7 @@
|
|
|
1449
1449
|
"config": {},
|
|
1450
1450
|
"time": {
|
|
1451
1451
|
"hooks": {},
|
|
1452
|
-
"register":
|
|
1452
|
+
"register": 4
|
|
1453
1453
|
}
|
|
1454
1454
|
},
|
|
1455
1455
|
"./node_modules/@umijs/preset-umi/dist/features/monorepo/redirect": {
|
|
@@ -1474,7 +1474,7 @@
|
|
|
1474
1474
|
"config": {},
|
|
1475
1475
|
"time": {
|
|
1476
1476
|
"hooks": {},
|
|
1477
|
-
"register":
|
|
1477
|
+
"register": 1
|
|
1478
1478
|
}
|
|
1479
1479
|
},
|
|
1480
1480
|
"./node_modules/@umijs/preset-umi/dist/features/clickToComponent/clickToComponent": {
|
|
@@ -1486,7 +1486,7 @@
|
|
|
1486
1486
|
"config": {},
|
|
1487
1487
|
"time": {
|
|
1488
1488
|
"hooks": {},
|
|
1489
|
-
"register":
|
|
1489
|
+
"register": 0
|
|
1490
1490
|
}
|
|
1491
1491
|
},
|
|
1492
1492
|
"./node_modules/@umijs/preset-umi/dist/features/legacy/legacy": {
|
|
@@ -1498,7 +1498,7 @@
|
|
|
1498
1498
|
"config": {},
|
|
1499
1499
|
"time": {
|
|
1500
1500
|
"hooks": {},
|
|
1501
|
-
"register":
|
|
1501
|
+
"register": 0
|
|
1502
1502
|
},
|
|
1503
1503
|
"enableBy": "config"
|
|
1504
1504
|
},
|
|
@@ -1511,7 +1511,7 @@
|
|
|
1511
1511
|
"config": {},
|
|
1512
1512
|
"time": {
|
|
1513
1513
|
"hooks": {},
|
|
1514
|
-
"register":
|
|
1514
|
+
"register": 1
|
|
1515
1515
|
},
|
|
1516
1516
|
"enableBy": "config"
|
|
1517
1517
|
},
|
|
@@ -1540,7 +1540,7 @@
|
|
|
1540
1540
|
0
|
|
1541
1541
|
]
|
|
1542
1542
|
},
|
|
1543
|
-
"register":
|
|
1543
|
+
"register": 0
|
|
1544
1544
|
},
|
|
1545
1545
|
"enableBy": "register"
|
|
1546
1546
|
},
|
|
@@ -1602,7 +1602,7 @@
|
|
|
1602
1602
|
"config": {},
|
|
1603
1603
|
"time": {
|
|
1604
1604
|
"hooks": {},
|
|
1605
|
-
"register":
|
|
1605
|
+
"register": 27
|
|
1606
1606
|
}
|
|
1607
1607
|
},
|
|
1608
1608
|
"./node_modules/@umijs/preset-umi/dist/features/forget/forget": {
|
|
@@ -1640,7 +1640,7 @@
|
|
|
1640
1640
|
"config": {},
|
|
1641
1641
|
"time": {
|
|
1642
1642
|
"hooks": {},
|
|
1643
|
-
"register":
|
|
1643
|
+
"register": 4
|
|
1644
1644
|
},
|
|
1645
1645
|
"enableBy": "register"
|
|
1646
1646
|
},
|
|
@@ -1653,7 +1653,7 @@
|
|
|
1653
1653
|
"config": {},
|
|
1654
1654
|
"time": {
|
|
1655
1655
|
"hooks": {},
|
|
1656
|
-
"register":
|
|
1656
|
+
"register": 42
|
|
1657
1657
|
},
|
|
1658
1658
|
"enableBy": "register"
|
|
1659
1659
|
},
|
|
@@ -1666,7 +1666,7 @@
|
|
|
1666
1666
|
"config": {},
|
|
1667
1667
|
"time": {
|
|
1668
1668
|
"hooks": {},
|
|
1669
|
-
"register":
|
|
1669
|
+
"register": 17
|
|
1670
1670
|
}
|
|
1671
1671
|
},
|
|
1672
1672
|
"./node_modules/@umijs/preset-umi/dist/commands/help": {
|
|
@@ -1678,7 +1678,7 @@
|
|
|
1678
1678
|
"config": {},
|
|
1679
1679
|
"time": {
|
|
1680
1680
|
"hooks": {},
|
|
1681
|
-
"register":
|
|
1681
|
+
"register": 0
|
|
1682
1682
|
},
|
|
1683
1683
|
"enableBy": "register"
|
|
1684
1684
|
},
|
|
@@ -1691,7 +1691,7 @@
|
|
|
1691
1691
|
"config": {},
|
|
1692
1692
|
"time": {
|
|
1693
1693
|
"hooks": {},
|
|
1694
|
-
"register":
|
|
1694
|
+
"register": 1
|
|
1695
1695
|
},
|
|
1696
1696
|
"enableBy": "register"
|
|
1697
1697
|
},
|
|
@@ -1756,7 +1756,7 @@
|
|
|
1756
1756
|
"config": {},
|
|
1757
1757
|
"time": {
|
|
1758
1758
|
"hooks": {},
|
|
1759
|
-
"register":
|
|
1759
|
+
"register": 1
|
|
1760
1760
|
},
|
|
1761
1761
|
"enableBy": "register"
|
|
1762
1762
|
},
|
|
@@ -1769,7 +1769,7 @@
|
|
|
1769
1769
|
"config": {},
|
|
1770
1770
|
"time": {
|
|
1771
1771
|
"hooks": {},
|
|
1772
|
-
"register":
|
|
1772
|
+
"register": 0
|
|
1773
1773
|
},
|
|
1774
1774
|
"enableBy": "register"
|
|
1775
1775
|
},
|
|
@@ -1782,7 +1782,7 @@
|
|
|
1782
1782
|
"config": {},
|
|
1783
1783
|
"time": {
|
|
1784
1784
|
"hooks": {},
|
|
1785
|
-
"register":
|
|
1785
|
+
"register": 1
|
|
1786
1786
|
},
|
|
1787
1787
|
"enableBy": "register"
|
|
1788
1788
|
},
|
|
@@ -1795,7 +1795,7 @@
|
|
|
1795
1795
|
"config": {},
|
|
1796
1796
|
"time": {
|
|
1797
1797
|
"hooks": {},
|
|
1798
|
-
"register":
|
|
1798
|
+
"register": 0
|
|
1799
1799
|
},
|
|
1800
1800
|
"enableBy": "register"
|
|
1801
1801
|
},
|
|
@@ -1808,7 +1808,7 @@
|
|
|
1808
1808
|
"config": {},
|
|
1809
1809
|
"time": {
|
|
1810
1810
|
"hooks": {},
|
|
1811
|
-
"register":
|
|
1811
|
+
"register": 1
|
|
1812
1812
|
},
|
|
1813
1813
|
"enableBy": "register"
|
|
1814
1814
|
},
|
|
@@ -1834,7 +1834,7 @@
|
|
|
1834
1834
|
"config": {},
|
|
1835
1835
|
"time": {
|
|
1836
1836
|
"hooks": {},
|
|
1837
|
-
"register":
|
|
1837
|
+
"register": 0
|
|
1838
1838
|
},
|
|
1839
1839
|
"enableBy": "register"
|
|
1840
1840
|
},
|
|
@@ -1847,7 +1847,7 @@
|
|
|
1847
1847
|
"config": {},
|
|
1848
1848
|
"time": {
|
|
1849
1849
|
"hooks": {},
|
|
1850
|
-
"register":
|
|
1850
|
+
"register": 1
|
|
1851
1851
|
},
|
|
1852
1852
|
"enableBy": "register"
|
|
1853
1853
|
},
|
|
@@ -1860,7 +1860,7 @@
|
|
|
1860
1860
|
"config": {},
|
|
1861
1861
|
"time": {
|
|
1862
1862
|
"hooks": {},
|
|
1863
|
-
"register":
|
|
1863
|
+
"register": 0
|
|
1864
1864
|
},
|
|
1865
1865
|
"enableBy": "register"
|
|
1866
1866
|
},
|
|
@@ -1873,7 +1873,7 @@
|
|
|
1873
1873
|
"config": {},
|
|
1874
1874
|
"time": {
|
|
1875
1875
|
"hooks": {},
|
|
1876
|
-
"register":
|
|
1876
|
+
"register": 1
|
|
1877
1877
|
},
|
|
1878
1878
|
"enableBy": "register"
|
|
1879
1879
|
},
|
|
@@ -1925,7 +1925,7 @@
|
|
|
1925
1925
|
"config": {},
|
|
1926
1926
|
"time": {
|
|
1927
1927
|
"hooks": {},
|
|
1928
|
-
"register":
|
|
1928
|
+
"register": 1
|
|
1929
1929
|
},
|
|
1930
1930
|
"enableBy": "register"
|
|
1931
1931
|
},
|
|
@@ -2085,7 +2085,7 @@
|
|
|
2085
2085
|
"parentId": "@@/global-layout",
|
|
2086
2086
|
"file": "system/dict/index.jsx",
|
|
2087
2087
|
"absPath": "/system/dict",
|
|
2088
|
-
"__content": "import React from \"react\";\nimport {Button, Form, Input, InputNumber, Modal, Popconfirm, Splitter, Tag, Tree, Typography} from \"antd\";\nimport {PlusOutlined} from \"@ant-design/icons\";\n\nimport {\n ButtonList,\n FieldBoolean, FieldDictSelect, FieldRemoteSelect,\n HttpUtils,\n Page,\n ProTable,\n ViewBooleanEnableDisable, ViewText\n} from \"../../../framework\";\n\nexport default class extends React.Component {\n\n state = {\n formValues: {},\n formOpen: false\n }\n\n formRef = React.createRef()\n tableRef = React.createRef()\n\n\n\n\n handleAdd = () => {\n this.setState({formOpen: true, formValues: {}})\n }\n\n handleEdit = record => {\n this.setState({formOpen: true, formValues: record})\n }\n\n onFinish = values => {\n const isNew = !values.id;\n const url = isNew ? 'admin/dict/create' : 'admin/dict/update';\n HttpUtils.post(url, values).then(rs => {\n this.setState({formOpen: false})\n this.tableRef.current.reload()\n })\n }\n\n handleDelete = row => {\n HttpUtils.post('admin/dict/delete', row).then(rs => {\n this.tableRef.current.reload()\n })\n }\n\n columns = [\n {\n title: '类型标签',\n dataIndex: 'typeLabel',\n },\n {\n title: '类型编码',\n dataIndex: 'typeCode',\n },\n {\n title: '标签',\n dataIndex: 'label',\n },\n {\n title: '编码',\n dataIndex: 'code',\n },\n\n {\n title: '启用',\n dataIndex: 'enabled',\n render(v) {\n return <ViewBooleanEnableDisable value={v}/>\n }\n\n },\n {\n title: '显示颜色',\n dataIndex: 'color',\n render(v) {\n if (v) {\n return <Tag color={v.toLowerCase()}>{v}</Tag>\n }\n\n }\n },\n\n {\n title: '序号',\n dataIndex: 'seq',\n },\n {\n title: '操作',\n dataIndex: 'option',\n render: (_, record) => {\n return (\n <ButtonList>\n <Button size='small' perm='sys-dict:update'\n onClick={() => this.handleEdit(record)}> 编辑 </Button>\n <Popconfirm perm='sys-dict:delete' title='是否确定删除字典项'\n onConfirm={() => this.handleDelete(record)}>\n <Button size='small'>删除</Button>\n </Popconfirm>\n </ButtonList>\n );\n },\n },\n ]\n\n render() {\n return <Page>\n <ProTable\n rowKey='uid'\n actionRef={this.tableRef}\n toolBarRender={() => {\n return <ButtonList>\n <Button perm='sys-dict:create' type='primary' onClick={this.handleAdd} >\n <PlusOutlined/> 新增\n </Button>\n </ButtonList>\n }}\n request={(params) => {\n params.typeCode = this.state.typeCode\n return HttpUtils.get('admin/dict/page', params);\n }}\n columns={this.columns}\n showToolbarSearch={true}\n />\n <Modal\n title='编辑数据字典项'\n open={this.state.formOpen}\n onOk={() => this.formRef.current.submit()}\n onCancel={() => this.setState({formOpen: false})}\n destroyOnHidden\n >\n\n <Form ref={this.formRef} labelCol={{flex: '100px'}}\n initialValues={this.state.formValues}\n onFinish={this.onFinish}>\n <Form.Item name='id' noStyle></Form.Item>\n <Form.Item label='类型' name='color' rules={[{required: true}]} >\n <ViewText />\n </Form.Item>\n <Form.Item label='类型' name='typeCode' rules={[{required: true}]} >\n <FieldRemoteSelect url='/admin/dict/type-options' />\n </Form.Item>\n <Form.Item label='编码' name='code' rules={[{required: true}]}>\n <Input/>\n </Form.Item>\n <Form.Item label='标签' name='label' rules={[{required: true}]} help='显示文本'>\n <Input/>\n </Form.Item>\n <Form.Item label='颜色' name='color' rules={[{required: true}]}>\n <FieldDictSelect typeCode='statusColor' />\n </Form.Item>\n <Form.Item label='序号' name='seq' rules={[{required: true}]}>\n <InputNumber/>\n </Form.Item>\n\n <Form.Item label='启用' name='enabled' rules={[{required: true}]}>\n <FieldBoolean/>\n </Form.Item>\n\n </Form>\n </Modal>\n </Page>\n\n\n }\n\n\n}\n",
|
|
2088
|
+
"__content": "import {DeleteOutlined, EditOutlined, PlusOutlined, SyncOutlined} from '@ant-design/icons';\nimport {Button, Card, Empty, Form, Input, InputNumber, Modal, Popconfirm, Space, Splitter, Tree, Tag, TreeSelect} from 'antd';\nimport React from 'react';\nimport {\n ButtonList,\n FieldBoolean,\n FieldDictSelect,\n Gap,\n HttpUtils,\n Page,\n ProTable,\n ViewBooleanEnableDisable,\n} from \"../../../framework\";\n\nexport default class extends React.Component {\n\n state = {\n typeTree: [],\n treeLoading: false,\n selectedType: null,\n selectedTypeCode: null,\n\n formOpen: false,\n formValues: {},\n typeFormOpen: false,\n typeFormValues: {},\n }\n\n formRef = React.createRef();\n typeFormRef = React.createRef();\n tableRef = React.createRef();\n\n componentDidMount() {\n this.loadTree()\n }\n\n loadTree = () => {\n this.setState({treeLoading: true})\n HttpUtils.get('admin/dict/type-tree').then(rs => {\n this.setState({typeTree: rs})\n }).finally(() => {\n this.setState({treeLoading: false})\n })\n }\n\n handleTypeAdd = () => {\n this.setState({\n typeFormOpen: true,\n typeFormValues: {pid: this.state.selectedType?.id, enabled: true},\n })\n }\n\n handleTypeEdit = () => {\n const {selectedType} = this.state\n if (!selectedType) return\n this.setState({typeFormOpen: true, typeFormValues: {...selectedType}})\n }\n\n handleTypeDelete = () => {\n const {selectedType} = this.state\n if (!selectedType) return\n HttpUtils.post('admin/dict/type-delete', {id: selectedType.id}).then(() => {\n this.setState({selectedType: null, selectedTypeCode: null})\n this.loadTree()\n })\n }\n\n handleTypeFormFinish = values => {\n const isNew = !values.id\n const url = isNew ? 'admin/dict/type-create' : 'admin/dict/type-update'\n HttpUtils.post(url, values).then(rs => {\n this.setState({typeFormOpen: false})\n this.loadTree()\n })\n }\n\n onTreeSelect = (selectedKeys) => {\n if (selectedKeys.length === 0) {\n this.setState({selectedType: null, selectedTypeCode: null})\n return\n }\n const findNode = (nodes, key) => {\n for (const n of nodes) {\n if (n.id === key) return n\n if (n.children) {\n const found = findNode(n.children, key)\n if (found) return found\n }\n }\n return null\n }\n const node = findNode(this.state.typeTree, selectedKeys[0])\n this.setState({\n selectedType: node,\n selectedTypeCode: node?.typeCode || null\n },()=>this.tableRef.current.reload())\n }\n\n handleItemAdd = () => {\n this.setState({formOpen: true, formValues: {typeCode: this.state.selectedTypeCode}})\n }\n\n handleItemEdit = record => {\n this.setState({formOpen: true, formValues: record})\n }\n\n handleItemDelete = row => {\n HttpUtils.post('admin/dict/delete', row).then(rs => {\n this.tableRef.current.reload()\n })\n }\n\n onItemFormFinish = values => {\n const isNew = !values.id\n const url = isNew ? 'admin/dict/create' : 'admin/dict/update'\n HttpUtils.post(url, values).then(rs => {\n this.setState({formOpen: false})\n this.tableRef.current.reload()\n })\n }\n\n columns = [\n {title: '编码', dataIndex: 'code'},\n {title: '标签', dataIndex: 'label'},\n {\n title: '颜色', dataIndex: 'color',\n render(v) {\n if (v) return <Tag color={v.toLowerCase()}>{v}</Tag>\n }\n },\n {\n title: '启用', dataIndex: 'enabled',\n render(v) {\n return <ViewBooleanEnableDisable value={v}/>\n }\n },\n {title: '序号', dataIndex: 'seq'},\n {\n title: '操作', dataIndex: 'option',\n render: (_, record) => {\n return (\n <ButtonList>\n <Button size='small' perm='sys-dict:update'\n onClick={() => this.handleItemEdit(record)}>编辑</Button>\n <Popconfirm perm='sys-dict:delete' title='是否确定删除字典项'\n onConfirm={() => this.handleItemDelete(record)}>\n <Button size='small'>删除</Button>\n </Popconfirm>\n </ButtonList>\n );\n },\n },\n ]\n\n render() {\n const {selectedType, selectedTypeCode} = this.state\n const hasTypeSelected = selectedType != null && selectedTypeCode != null\n\n return <Page>\n <Splitter>\n <Splitter.Panel defaultSize={300}>\n <Card loading={this.state.treeLoading}\n title='字典类型'\n extra={<Space>\n <Button size='small' shape='round' icon={<SyncOutlined/>}\n onClick={this.loadTree}/>\n </Space>}\n >\n <ButtonList>\n <Button type='primary' size='small' onClick={this.handleTypeAdd}>\n <PlusOutlined/> 新增类型\n </Button>\n <Button size='small' disabled={!selectedType} onClick={this.handleTypeEdit}>\n <EditOutlined/> 编辑\n </Button>\n <Popconfirm title='是否确定删除此类型及其所有子类型和字典项?'\n disabled={!selectedType}\n onConfirm={this.handleTypeDelete}>\n <Button size='small' disabled={!selectedType}>\n <DeleteOutlined/> 删除\n </Button>\n </Popconfirm>\n </ButtonList>\n <Gap/>\n <Tree\n treeData={this.state.typeTree}\n onSelect={this.onTreeSelect}\n fieldNames={{title: 'typeLabel', key: 'id'}}\n showLine\n defaultExpandAll\n blockNode\n />\n {this.state.typeTree.length === 0 && <Empty/>}\n\n\n </Card>\n </Splitter.Panel>\n\n <Splitter.Panel>\n <Card title={hasTypeSelected ? `${selectedType.typeLabel} 的字典项` : '字典项'}\n extra={\n hasTypeSelected\n ? <Button type='primary' onClick={this.handleItemAdd}>\n <PlusOutlined/> 新增\n </Button>\n : null\n }\n >\n {!hasTypeSelected\n ? <Empty description='请在左侧选择一个字典类型'/>\n : <ProTable\n rowKey='uid'\n actionRef={this.tableRef}\n request={(params) => {\n params.typeCode = selectedTypeCode\n return HttpUtils.get('admin/dict/page', params)\n }}\n columns={this.columns}\n showToolbarSearch\n />\n }\n </Card>\n </Splitter.Panel>\n </Splitter>\n\n <Modal title={this.state.typeFormValues?.id ? '编辑字典类型' : '新增字典类型'}\n open={this.state.typeFormOpen}\n onOk={() => this.typeFormRef.current.submit()}\n onCancel={() => this.setState({typeFormOpen: false})}\n destroyOnClose\n >\n <Form ref={this.typeFormRef} labelCol={{flex: '100px'}}\n initialValues={this.state.typeFormValues}\n onFinish={this.handleTypeFormFinish}\n >\n <Form.Item name='id' noStyle/>\n <Form.Item label='父类型' name='pid'>\n <TreeSelect treeData={this.state.typeTree}\n fieldNames={{label: 'typeLabel', value: 'id'}}\n allowClear\n />\n </Form.Item>\n <Form.Item label='类型编码' name='typeCode' rules={[{required: true}]}>\n <Input placeholder='举例: orderStatus'/>\n </Form.Item>\n <Form.Item label='类型名称' name='typeLabel' rules={[{required: true}]}>\n <Input placeholder='举例: 订单状态'/>\n </Form.Item>\n <Form.Item label='启用' name='enabled' rules={[{required: true}]}>\n <FieldBoolean/>\n </Form.Item>\n <Form.Item label='序号' name='seq'>\n <InputNumber/>\n </Form.Item>\n </Form>\n </Modal>\n\n <Modal title='编辑字典项'\n open={this.state.formOpen}\n onOk={() => this.formRef.current.submit()}\n onCancel={() => this.setState({formOpen: false})}\n destroyOnClose\n >\n <Form ref={this.formRef} labelCol={{flex: '100px'}}\n initialValues={this.state.formValues}\n onFinish={this.onItemFormFinish}\n >\n <Form.Item name='id' noStyle/>\n <Form.Item label='类型编码' name='typeCode'>\n <Input disabled/>\n </Form.Item>\n <Form.Item label='编码' name='code' rules={[{required: true}]}>\n <Input/>\n </Form.Item>\n <Form.Item label='标签' name='label' rules={[{required: true}]} help='显示文本'>\n <Input/>\n </Form.Item>\n <Form.Item label='颜色' name='color'>\n <FieldDictSelect typeCode='statusColor'/>\n </Form.Item>\n <Form.Item label='序号' name='seq'>\n <InputNumber/>\n </Form.Item>\n <Form.Item label='启用' name='enabled' rules={[{required: true}]}>\n <FieldBoolean/>\n </Form.Item>\n </Form>\n </Modal>\n </Page>\n }\n}\n",
|
|
2089
2089
|
"__isJSFile": true,
|
|
2090
2090
|
"__absFile": "/home/runner/work/open-admin/open-admin/web/src/pages/system/dict/index.jsx"
|
|
2091
2091
|
},
|
|
@@ -1,103 +1,149 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {Button, Form, Input, InputNumber, Modal, Popconfirm,
|
|
3
|
-
import
|
|
4
|
-
|
|
1
|
+
import {DeleteOutlined, EditOutlined, PlusOutlined, SyncOutlined} from '@ant-design/icons';
|
|
2
|
+
import {Button, Card, Empty, Form, Input, InputNumber, Modal, Popconfirm, Space, Splitter, Tree, Tag, TreeSelect} from 'antd';
|
|
3
|
+
import React from 'react';
|
|
5
4
|
import {
|
|
6
5
|
ButtonList,
|
|
7
|
-
FieldBoolean,
|
|
6
|
+
FieldBoolean,
|
|
7
|
+
FieldDictSelect,
|
|
8
|
+
Gap,
|
|
8
9
|
HttpUtils,
|
|
9
10
|
Page,
|
|
10
11
|
ProTable,
|
|
11
|
-
ViewBooleanEnableDisable,
|
|
12
|
+
ViewBooleanEnableDisable,
|
|
12
13
|
} from "../../../framework";
|
|
13
14
|
|
|
14
15
|
export default class extends React.Component {
|
|
15
16
|
|
|
16
17
|
state = {
|
|
18
|
+
typeTree: [],
|
|
19
|
+
treeLoading: false,
|
|
20
|
+
selectedType: null,
|
|
21
|
+
selectedTypeCode: null,
|
|
22
|
+
|
|
23
|
+
formOpen: false,
|
|
17
24
|
formValues: {},
|
|
18
|
-
|
|
25
|
+
typeFormOpen: false,
|
|
26
|
+
typeFormValues: {},
|
|
19
27
|
}
|
|
20
28
|
|
|
21
|
-
formRef = React.createRef()
|
|
22
|
-
|
|
29
|
+
formRef = React.createRef();
|
|
30
|
+
typeFormRef = React.createRef();
|
|
31
|
+
tableRef = React.createRef();
|
|
23
32
|
|
|
33
|
+
componentDidMount() {
|
|
34
|
+
this.loadTree()
|
|
35
|
+
}
|
|
24
36
|
|
|
37
|
+
loadTree = () => {
|
|
38
|
+
this.setState({treeLoading: true})
|
|
39
|
+
HttpUtils.get('admin/dict/type-tree').then(rs => {
|
|
40
|
+
this.setState({typeTree: rs})
|
|
41
|
+
}).finally(() => {
|
|
42
|
+
this.setState({treeLoading: false})
|
|
43
|
+
})
|
|
44
|
+
}
|
|
25
45
|
|
|
46
|
+
handleTypeAdd = () => {
|
|
47
|
+
this.setState({
|
|
48
|
+
typeFormOpen: true,
|
|
49
|
+
typeFormValues: {pid: this.state.selectedType?.id, enabled: true},
|
|
50
|
+
})
|
|
51
|
+
}
|
|
26
52
|
|
|
27
|
-
|
|
28
|
-
|
|
53
|
+
handleTypeEdit = () => {
|
|
54
|
+
const {selectedType} = this.state
|
|
55
|
+
if (!selectedType) return
|
|
56
|
+
this.setState({typeFormOpen: true, typeFormValues: {...selectedType}})
|
|
29
57
|
}
|
|
30
58
|
|
|
31
|
-
|
|
32
|
-
|
|
59
|
+
handleTypeDelete = () => {
|
|
60
|
+
const {selectedType} = this.state
|
|
61
|
+
if (!selectedType) return
|
|
62
|
+
HttpUtils.post('admin/dict/type-delete', {id: selectedType.id}).then(() => {
|
|
63
|
+
this.setState({selectedType: null, selectedTypeCode: null})
|
|
64
|
+
this.loadTree()
|
|
65
|
+
})
|
|
33
66
|
}
|
|
34
67
|
|
|
35
|
-
|
|
36
|
-
const isNew = !values.id
|
|
37
|
-
const url = isNew ? 'admin/dict/create' : 'admin/dict/update'
|
|
68
|
+
handleTypeFormFinish = values => {
|
|
69
|
+
const isNew = !values.id
|
|
70
|
+
const url = isNew ? 'admin/dict/type-create' : 'admin/dict/type-update'
|
|
38
71
|
HttpUtils.post(url, values).then(rs => {
|
|
39
|
-
this.setState({
|
|
40
|
-
this.
|
|
72
|
+
this.setState({typeFormOpen: false})
|
|
73
|
+
this.loadTree()
|
|
41
74
|
})
|
|
42
75
|
}
|
|
43
76
|
|
|
44
|
-
|
|
77
|
+
onTreeSelect = (selectedKeys) => {
|
|
78
|
+
if (selectedKeys.length === 0) {
|
|
79
|
+
this.setState({selectedType: null, selectedTypeCode: null})
|
|
80
|
+
return
|
|
81
|
+
}
|
|
82
|
+
const findNode = (nodes, key) => {
|
|
83
|
+
for (const n of nodes) {
|
|
84
|
+
if (n.id === key) return n
|
|
85
|
+
if (n.children) {
|
|
86
|
+
const found = findNode(n.children, key)
|
|
87
|
+
if (found) return found
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return null
|
|
91
|
+
}
|
|
92
|
+
const node = findNode(this.state.typeTree, selectedKeys[0])
|
|
93
|
+
this.setState({
|
|
94
|
+
selectedType: node,
|
|
95
|
+
selectedTypeCode: node?.typeCode || null
|
|
96
|
+
},()=>this.tableRef.current.reload())
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
handleItemAdd = () => {
|
|
100
|
+
this.setState({formOpen: true, formValues: {typeCode: this.state.selectedTypeCode}})
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
handleItemEdit = record => {
|
|
104
|
+
this.setState({formOpen: true, formValues: record})
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
handleItemDelete = row => {
|
|
45
108
|
HttpUtils.post('admin/dict/delete', row).then(rs => {
|
|
46
109
|
this.tableRef.current.reload()
|
|
47
110
|
})
|
|
48
111
|
}
|
|
49
112
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
},
|
|
59
|
-
{
|
|
60
|
-
title: '标签',
|
|
61
|
-
dataIndex: 'label',
|
|
62
|
-
},
|
|
63
|
-
{
|
|
64
|
-
title: '编码',
|
|
65
|
-
dataIndex: 'code',
|
|
66
|
-
},
|
|
113
|
+
onItemFormFinish = values => {
|
|
114
|
+
const isNew = !values.id
|
|
115
|
+
const url = isNew ? 'admin/dict/create' : 'admin/dict/update'
|
|
116
|
+
HttpUtils.post(url, values).then(rs => {
|
|
117
|
+
this.setState({formOpen: false})
|
|
118
|
+
this.tableRef.current.reload()
|
|
119
|
+
})
|
|
120
|
+
}
|
|
67
121
|
|
|
122
|
+
columns = [
|
|
123
|
+
{title: '编码', dataIndex: 'code'},
|
|
124
|
+
{title: '标签', dataIndex: 'label'},
|
|
68
125
|
{
|
|
69
|
-
title: '
|
|
70
|
-
dataIndex: 'enabled',
|
|
126
|
+
title: '颜色', dataIndex: 'color',
|
|
71
127
|
render(v) {
|
|
72
|
-
return <
|
|
128
|
+
if (v) return <Tag color={v.toLowerCase()}>{v}</Tag>
|
|
73
129
|
}
|
|
74
|
-
|
|
75
130
|
},
|
|
76
131
|
{
|
|
77
|
-
title: '
|
|
78
|
-
dataIndex: 'color',
|
|
132
|
+
title: '启用', dataIndex: 'enabled',
|
|
79
133
|
render(v) {
|
|
80
|
-
|
|
81
|
-
return <Tag color={v.toLowerCase()}>{v}</Tag>
|
|
82
|
-
}
|
|
83
|
-
|
|
134
|
+
return <ViewBooleanEnableDisable value={v}/>
|
|
84
135
|
}
|
|
85
136
|
},
|
|
86
|
-
|
|
87
|
-
{
|
|
88
|
-
title: '序号',
|
|
89
|
-
dataIndex: 'seq',
|
|
90
|
-
},
|
|
137
|
+
{title: '序号', dataIndex: 'seq'},
|
|
91
138
|
{
|
|
92
|
-
title: '操作',
|
|
93
|
-
dataIndex: 'option',
|
|
139
|
+
title: '操作', dataIndex: 'option',
|
|
94
140
|
render: (_, record) => {
|
|
95
141
|
return (
|
|
96
142
|
<ButtonList>
|
|
97
143
|
<Button size='small' perm='sys-dict:update'
|
|
98
|
-
onClick={() => this.
|
|
144
|
+
onClick={() => this.handleItemEdit(record)}>编辑</Button>
|
|
99
145
|
<Popconfirm perm='sys-dict:delete' title='是否确定删除字典项'
|
|
100
|
-
onConfirm={() => this.
|
|
146
|
+
onConfirm={() => this.handleItemDelete(record)}>
|
|
101
147
|
<Button size='small'>删除</Button>
|
|
102
148
|
</Popconfirm>
|
|
103
149
|
</ButtonList>
|
|
@@ -107,41 +153,121 @@ export default class extends React.Component {
|
|
|
107
153
|
]
|
|
108
154
|
|
|
109
155
|
render() {
|
|
156
|
+
const {selectedType, selectedTypeCode} = this.state
|
|
157
|
+
const hasTypeSelected = selectedType != null && selectedTypeCode != null
|
|
158
|
+
|
|
110
159
|
return <Page>
|
|
111
|
-
<
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
160
|
+
<Splitter>
|
|
161
|
+
<Splitter.Panel defaultSize={300}>
|
|
162
|
+
<Card loading={this.state.treeLoading}
|
|
163
|
+
title='字典类型'
|
|
164
|
+
extra={<Space>
|
|
165
|
+
<Button size='small' shape='round' icon={<SyncOutlined/>}
|
|
166
|
+
onClick={this.loadTree}/>
|
|
167
|
+
</Space>}
|
|
168
|
+
>
|
|
169
|
+
<ButtonList>
|
|
170
|
+
<Button type='primary' size='small' onClick={this.handleTypeAdd}>
|
|
171
|
+
<PlusOutlined/> 新增类型
|
|
172
|
+
</Button>
|
|
173
|
+
<Button size='small' disabled={!selectedType} onClick={this.handleTypeEdit}>
|
|
174
|
+
<EditOutlined/> 编辑
|
|
175
|
+
</Button>
|
|
176
|
+
<Popconfirm title='是否确定删除此类型及其所有子类型和字典项?'
|
|
177
|
+
disabled={!selectedType}
|
|
178
|
+
onConfirm={this.handleTypeDelete}>
|
|
179
|
+
<Button size='small' disabled={!selectedType}>
|
|
180
|
+
<DeleteOutlined/> 删除
|
|
181
|
+
</Button>
|
|
182
|
+
</Popconfirm>
|
|
183
|
+
</ButtonList>
|
|
184
|
+
<Gap/>
|
|
185
|
+
<Tree
|
|
186
|
+
treeData={this.state.typeTree}
|
|
187
|
+
onSelect={this.onTreeSelect}
|
|
188
|
+
fieldNames={{title: 'typeLabel', key: 'id'}}
|
|
189
|
+
showLine
|
|
190
|
+
defaultExpandAll
|
|
191
|
+
blockNode
|
|
192
|
+
/>
|
|
193
|
+
{this.state.typeTree.length === 0 && <Empty/>}
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
</Card>
|
|
197
|
+
</Splitter.Panel>
|
|
198
|
+
|
|
199
|
+
<Splitter.Panel>
|
|
200
|
+
<Card title={hasTypeSelected ? `${selectedType.typeLabel} 的字典项` : '字典项'}
|
|
201
|
+
extra={
|
|
202
|
+
hasTypeSelected
|
|
203
|
+
? <Button type='primary' onClick={this.handleItemAdd}>
|
|
204
|
+
<PlusOutlined/> 新增
|
|
205
|
+
</Button>
|
|
206
|
+
: null
|
|
207
|
+
}
|
|
208
|
+
>
|
|
209
|
+
{!hasTypeSelected
|
|
210
|
+
? <Empty description='请在左侧选择一个字典类型'/>
|
|
211
|
+
: <ProTable
|
|
212
|
+
rowKey='uid'
|
|
213
|
+
actionRef={this.tableRef}
|
|
214
|
+
request={(params) => {
|
|
215
|
+
params.typeCode = selectedTypeCode
|
|
216
|
+
return HttpUtils.get('admin/dict/page', params)
|
|
217
|
+
}}
|
|
218
|
+
columns={this.columns}
|
|
219
|
+
showToolbarSearch
|
|
220
|
+
/>
|
|
221
|
+
}
|
|
222
|
+
</Card>
|
|
223
|
+
</Splitter.Panel>
|
|
224
|
+
</Splitter>
|
|
225
|
+
|
|
226
|
+
<Modal title={this.state.typeFormValues?.id ? '编辑字典类型' : '新增字典类型'}
|
|
227
|
+
open={this.state.typeFormOpen}
|
|
228
|
+
onOk={() => this.typeFormRef.current.submit()}
|
|
229
|
+
onCancel={() => this.setState({typeFormOpen: false})}
|
|
230
|
+
destroyOnClose
|
|
134
231
|
>
|
|
232
|
+
<Form ref={this.typeFormRef} labelCol={{flex: '100px'}}
|
|
233
|
+
initialValues={this.state.typeFormValues}
|
|
234
|
+
onFinish={this.handleTypeFormFinish}
|
|
235
|
+
>
|
|
236
|
+
<Form.Item name='id' noStyle/>
|
|
237
|
+
<Form.Item label='父类型' name='pid'>
|
|
238
|
+
<TreeSelect treeData={this.state.typeTree}
|
|
239
|
+
fieldNames={{label: 'typeLabel', value: 'id'}}
|
|
240
|
+
allowClear
|
|
241
|
+
/>
|
|
242
|
+
</Form.Item>
|
|
243
|
+
<Form.Item label='类型编码' name='typeCode' rules={[{required: true}]}>
|
|
244
|
+
<Input placeholder='举例: orderStatus'/>
|
|
245
|
+
</Form.Item>
|
|
246
|
+
<Form.Item label='类型名称' name='typeLabel' rules={[{required: true}]}>
|
|
247
|
+
<Input placeholder='举例: 订单状态'/>
|
|
248
|
+
</Form.Item>
|
|
249
|
+
<Form.Item label='启用' name='enabled' rules={[{required: true}]}>
|
|
250
|
+
<FieldBoolean/>
|
|
251
|
+
</Form.Item>
|
|
252
|
+
<Form.Item label='序号' name='seq'>
|
|
253
|
+
<InputNumber/>
|
|
254
|
+
</Form.Item>
|
|
255
|
+
</Form>
|
|
256
|
+
</Modal>
|
|
135
257
|
|
|
258
|
+
<Modal title='编辑字典项'
|
|
259
|
+
open={this.state.formOpen}
|
|
260
|
+
onOk={() => this.formRef.current.submit()}
|
|
261
|
+
onCancel={() => this.setState({formOpen: false})}
|
|
262
|
+
destroyOnClose
|
|
263
|
+
>
|
|
136
264
|
<Form ref={this.formRef} labelCol={{flex: '100px'}}
|
|
137
265
|
initialValues={this.state.formValues}
|
|
138
|
-
onFinish={this.
|
|
139
|
-
|
|
140
|
-
<Form.Item
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
<Form.Item label='类型' name='typeCode' rules={[{required: true}]} >
|
|
144
|
-
<FieldRemoteSelect url='/admin/dict/type-options' />
|
|
266
|
+
onFinish={this.onItemFormFinish}
|
|
267
|
+
>
|
|
268
|
+
<Form.Item name='id' noStyle/>
|
|
269
|
+
<Form.Item label='类型编码' name='typeCode'>
|
|
270
|
+
<Input disabled/>
|
|
145
271
|
</Form.Item>
|
|
146
272
|
<Form.Item label='编码' name='code' rules={[{required: true}]}>
|
|
147
273
|
<Input/>
|
|
@@ -149,23 +275,17 @@ export default class extends React.Component {
|
|
|
149
275
|
<Form.Item label='标签' name='label' rules={[{required: true}]} help='显示文本'>
|
|
150
276
|
<Input/>
|
|
151
277
|
</Form.Item>
|
|
152
|
-
<Form.Item label='颜色' name='color'
|
|
153
|
-
<FieldDictSelect typeCode='statusColor'
|
|
278
|
+
<Form.Item label='颜色' name='color'>
|
|
279
|
+
<FieldDictSelect typeCode='statusColor'/>
|
|
154
280
|
</Form.Item>
|
|
155
|
-
<Form.Item label='序号' name='seq'
|
|
281
|
+
<Form.Item label='序号' name='seq'>
|
|
156
282
|
<InputNumber/>
|
|
157
283
|
</Form.Item>
|
|
158
|
-
|
|
159
284
|
<Form.Item label='启用' name='enabled' rules={[{required: true}]}>
|
|
160
285
|
<FieldBoolean/>
|
|
161
286
|
</Form.Item>
|
|
162
|
-
|
|
163
287
|
</Form>
|
|
164
288
|
</Modal>
|
|
165
289
|
</Page>
|
|
166
|
-
|
|
167
|
-
|
|
168
290
|
}
|
|
169
|
-
|
|
170
|
-
|
|
171
291
|
}
|