@xmszm/core 0.0.2 → 0.0.3

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.
Files changed (71) hide show
  1. package/README.md +10 -1
  2. package/dist/index.cjs +2 -2
  3. package/dist/index.mjs +1296 -1285
  4. package/dist/plugin/vite/initRouteMeta.cjs +1 -0
  5. package/dist/plugin/vite/initRouteMeta.mjs +13 -0
  6. package/dist/style.css +1 -1
  7. package/docs/.vitepress/config.mjs +10 -1
  8. package/docs/components/config-options.md +125 -0
  9. package/docs/components/dataform.md +175 -22
  10. package/docs/components/datatable.md +21 -39
  11. package/docs/components/dialog.md +155 -16
  12. package/docs/components/options.md +43 -14
  13. package/docs/components/query.md +20 -12
  14. package/docs/components/utils.md +118 -10
  15. package/docs/guide/changelog.md +81 -0
  16. package/docs/guide/config.md +241 -4
  17. package/docs/guide/quickstart.md +27 -2
  18. package/docs/index.md +1 -1
  19. package/docs/usage.md +16 -3
  20. package/examples/README.md +46 -0
  21. package/examples/index.html +14 -0
  22. package/examples/package.json +25 -0
  23. package/examples/pnpm-lock.yaml +1569 -0
  24. package/examples/pnpm-workspace.yaml +3 -0
  25. package/examples/src/AdminSystem.vue +870 -0
  26. package/examples/src/App.vue +330 -0
  27. package/examples/src/Introduction.vue +307 -0
  28. package/examples/src/main.js +22 -0
  29. package/examples/src/utils/permission.js +16 -0
  30. package/examples/src/utils/request.js +10 -0
  31. package/examples/vite.config.js +41 -0
  32. package/package.json +10 -4
  33. package/src/dialog/commonDialog.tsx +285 -0
  34. package/src/dialog/utils/{dialog.js → dialog.ts} +2 -0
  35. package/src/enum/sort.tsx +45 -0
  36. package/src/form/DataForm.vue +26 -52
  37. package/src/{index.js → index.ts} +7 -6
  38. package/src/list/{useList.jsx → useList.tsx} +49 -14
  39. package/src/options/{Options.jsx → Options.tsx} +37 -36
  40. package/src/options/defaultOptions.tsx +656 -0
  41. package/src/query/CommonQuery.vue +57 -89
  42. package/src/table/DataTable.vue +60 -94
  43. package/src/table/opr/{DataColumnCollet.jsx → DataColumnCollet.tsx} +18 -8
  44. package/src/table/opr/{useDataColumn.jsx → useDataColumn.tsx} +43 -48
  45. package/src/table/opr/{useDataColumnButton.jsx → useDataColumnButton.tsx} +13 -6
  46. package/src/table/opr/{useDataColumnPop.jsx → useDataColumnPop.tsx} +13 -5
  47. package/src/utils/{array.js → array.ts} +4 -6
  48. package/src/utils/{config.js → config.ts} +16 -2
  49. package/src/utils/{dialog.js → dialog.ts} +2 -2
  50. package/src/utils/{object.js → object.ts} +1 -0
  51. package/src/utils/{upload.js → upload.ts} +3 -3
  52. package/types/components.d.ts +402 -0
  53. package/types/index.d.ts +145 -7
  54. package/types/plugin/vite/initRouteMeta.d.ts +23 -0
  55. package/types/src.d.ts +55 -0
  56. package/types/vue-shim.d.ts +9 -0
  57. package/examples/demo.vue +0 -224
  58. package/src/dialog/commonDialog.jsx +0 -262
  59. package/src/enum/sort.jsx +0 -31
  60. package/src/options/defaultOptions.jsx +0 -580
  61. /package/src/dialog/{useCommonDialog.js → useCommonDialog.ts} +0 -0
  62. /package/src/directives/{auto-register.js → auto-register.ts} +0 -0
  63. /package/src/directives/{permission.js → permission.ts} +0 -0
  64. /package/src/enum/{options.js → options.ts} +0 -0
  65. /package/src/plugin/{index.js → index.ts} +0 -0
  66. /package/src/plugin/vite/{initRouteMeta.js → initRouteMeta.ts} +0 -0
  67. /package/src/store/utils/{index.js → index.ts} +0 -0
  68. /package/src/table/opr/{useQRCode.js → useQRCode.ts} +0 -0
  69. /package/src/table/utils/{ellipsis.js → ellipsis.ts} +0 -0
  70. /package/src/utils/{auth.js → auth.ts} +0 -0
  71. /package/src/utils/{time.js → time.ts} +0 -0
package/examples/demo.vue DELETED
@@ -1,224 +0,0 @@
1
- <script setup lang="jsx">
2
- import { computed, onMounted, reactive } from 'vue'
3
- import { NButton, NCard, NSpace } from 'naive-ui'
4
- import {
5
- commonDialogMethod,
6
- CommonQuery,
7
- createActionColumnJsx,
8
- DataTable,
9
- } from 'core'
10
- import 'core/dist/style.css'
11
-
12
- // 查询与分页状态(可替换为业务方的 useNaivePage)
13
- const listQuery = reactive({
14
- page: 1,
15
- pageSize: 10,
16
- desc: true,
17
- likeQuery: {
18
- name1: '',
19
- name2: '',
20
- name3: '',
21
- },
22
- })
23
-
24
- const pageState = reactive({
25
- data: [],
26
- itemCount: 0,
27
- loading: false,
28
- page: computed(() => listQuery.page),
29
- pageSize: computed(() => listQuery.pageSize),
30
- showSizePicker: true,
31
- pageSizes: [10, 20, 50],
32
- onUpdatePage: (p) => {
33
- listQuery.page = p
34
- pageState.fetchData()
35
- },
36
- onUpdatePageSize: (ps) => {
37
- listQuery.pageSize = ps
38
- listQuery.page = 1
39
- pageState.fetchData()
40
- },
41
- fetchData: async () => {
42
- pageState.loading = true
43
- try {
44
- // 模拟请求
45
- const mock = Array.from({ length: 25 }).map((_, i) => ({
46
- id: i + 1,
47
- name: `名称-${i + 1}`,
48
- type: i % 2 ? 'B' : 'A',
49
- }))
50
- pageState.itemCount = mock.length
51
- const start = (listQuery.page - 1) * listQuery.pageSize
52
- const end = start + listQuery.pageSize
53
- pageState.data = mock.slice(start, end)
54
- }
55
- finally {
56
- pageState.loading = false
57
- }
58
- },
59
- search: () => {
60
- listQuery.page = 1
61
- pageState.fetchData()
62
- },
63
- reset: () => {
64
- listQuery.likeQuery = { name1: '', name2: '', name3: '' }
65
- listQuery.page = 1
66
- pageState.fetchData()
67
- },
68
- })
69
-
70
- // 查询项
71
- const keyQuery = [
72
- { label: '名称1', key: 'name1', queryType: 'likeQuery' },
73
- { label: '名称2', key: 'name2', queryType: 'likeQuery' },
74
- { label: '名称3', key: 'name3', queryType: 'likeQuery' },
75
- ]
76
-
77
- // 表格列与操作列
78
- const columns = [
79
- { title: '名称', key: 'name', width: 160 },
80
- { title: '类型', key: 'type', width: 120 },
81
- ]
82
- const defaultColumns = []
83
- const selectColumns = { type: 'selection', width: '40px' }
84
- const opr = createActionColumnJsx([
85
- {
86
- label: '编辑',
87
- type: 'primary',
88
- onClick: row => onAdd(row, 'edit'),
89
- },
90
- {
91
- label: '删除',
92
- type: 'error',
93
- mode: 'pop',
94
- onClick: (row) => {
95
- // del(row.id).then(() => pageState.fetchData())
96
- console.log('删除', row)
97
- },
98
- },
99
- ])
100
-
101
- // 弹窗新增/编辑
102
- function onAdd(row = null, mode = 'add') {
103
- commonDialogMethod({
104
- title: '示例弹窗',
105
- mode,
106
- options: [
107
- { key: 'name', label: '名称', way: 'input', required: true },
108
- {
109
- key: 'type',
110
- label: '类型',
111
- way: 'select',
112
- options: [
113
- { label: '类型A', value: 'A' },
114
- { label: '类型B', value: 'B' },
115
- ],
116
- },
117
- ],
118
- valueData: { ...row },
119
- interfaceFn: async (data, { close }) => {
120
- console.log('提交数据', data)
121
- // await save(data)
122
- pageState.fetchData()
123
- close()
124
- },
125
- })
126
- }
127
-
128
- // 导出示例
129
- const exportLoading = reactive({ value: false })
130
- function onExport() {
131
- exportLoading.value = true
132
- // exportApi(listQuery).finally(() => (exportLoading.value = false))
133
- setTimeout(() => (exportLoading.value = false), 800)
134
- }
135
-
136
- onMounted(() => pageState.fetchData())
137
- </script>
138
-
139
- <template>
140
- <div class="page-box">
141
- <!-- 头部筛选 -->
142
- <NCard class="page-head">
143
- <CommonQuery
144
- :query="listQuery"
145
- :options="keyQuery"
146
- @submit="pageState.search()"
147
- @reset="pageState.reset()"
148
- />
149
- </NCard>
150
-
151
- <!-- 操作区 -->
152
- <NSpace justify="space-between">
153
- <NSpace>
154
- <NButton type="primary" @click="onAdd()">新增</NButton>
155
- <NButton type="primary" :loading="exportLoading.value" @click="onExport">
156
- 导出
157
- </NButton>
158
- </NSpace>
159
- </NSpace>
160
-
161
- <!-- 内容表格区 -->
162
- <div class="page-main">
163
- <DataTable
164
- :data="pageState.data"
165
- :pagination="pageState"
166
- :columns="columns"
167
- :opr-columns="opr"
168
- :default-columns="defaultColumns"
169
- :row-key="row => row?.id"
170
- :select-columns="selectColumns"
171
- :loading="pageState.loading"
172
- />
173
- </div>
174
- </div>
175
- </template>
176
-
177
- <style scoped lang="less">
178
- .page-head {
179
- border-radius: 8px;
180
- background-color: #fff;
181
- box-sizing: border-box;
182
- display: flex;
183
- flex-direction: column;
184
- row-gap: 20px;
185
- }
186
-
187
- .page-main {
188
- flex: 0 1 auto;
189
- background-color: #fff;
190
- border-radius: 8px;
191
- padding: 20px;
192
- box-sizing: border-box;
193
- display: flex;
194
- height: 100%;
195
- flex-direction: column;
196
- row-gap: 10px;
197
-
198
- .n-data-table {
199
- .n-data-table-th {
200
- background-color: #f7f8fa;
201
- border-right: 1px solid var(--n-merged-border-color);
202
- white-space: break-spaces;
203
- }
204
- .n-data-table-th--last {
205
- border-right: 1px solid transparent;
206
- }
207
- .n-data-table-td--last-row {
208
- border-bottom: 1px solid var(--n-merged-border-color);
209
- }
210
- }
211
- }
212
-
213
- .page-box {
214
- display: flex;
215
- flex-direction: column;
216
- height: calc(100vh - 120px); // 可按实际头/标签高度调整
217
- margin: -16px;
218
- padding: 24px;
219
- box-sizing: border-box;
220
- overflow: hidden;
221
- row-gap: 20px;
222
- }
223
- </style>
224
-
@@ -1,262 +0,0 @@
1
- import { NButton, NSpace, useDialog, createDiscreteApi } from 'naive-ui'
2
- import { computed, reactive, ref, unref, watch } from 'vue'
3
- import DataForm from '../form/DataForm.vue'
4
- import { dialogDefaultOption } from './utils/dialog'
5
- import './style/commonDialog.less'
6
-
7
- // 全局缓存 dialog 实例,避免重复创建离散 API
8
- let globalDialogInstance = typeof $dialog !== 'undefined' ? $dialog : null
9
- let discreteDialogFactory = null
10
-
11
- function getDialogInstanceOnce() {
12
- if (globalDialogInstance)
13
- return globalDialogInstance
14
-
15
- // 1. 组件上下文中尝试 useDialog(若无上下文会抛错)
16
- try {
17
- const dialog = useDialog()
18
- if (dialog) {
19
- globalDialogInstance = dialog
20
- return globalDialogInstance
21
- }
22
- }
23
- catch (e) {
24
- // 忽略,继续尝试离散 API
25
- }
26
-
27
- // 2. 使用离散 API,且只创建一次
28
- if (!discreteDialogFactory) {
29
- const { dialog } = createDiscreteApi(['dialog'])
30
- discreteDialogFactory = { dialog }
31
- }
32
- globalDialogInstance = discreteDialogFactory.dialog
33
- return globalDialogInstance
34
- }
35
-
36
- /**
37
- *
38
- * @param {*} param
39
- * @param {object} dialogProps
40
- * @returns {object {cancel,model}}
41
- * 集成填写表单功能的弹窗
42
- */
43
- export function commonDialogMethod(
44
- {
45
- title = '',
46
- noTitle = false,
47
- titleFull = null,
48
- options = [],
49
- mode = 'add',
50
- modeEnum = {},
51
- labelField = 'label',
52
- isNo = true,
53
- formProps = {},
54
- interfaceFn = null,
55
- interfaceFnCancel = null,
56
- valueData,
57
- read,
58
- isRead,
59
- action = null,
60
- contentStyle = {},
61
- actionProps = {},
62
- } = {
63
- title: '自定义弹窗',
64
- noTitle: false,
65
- action: [],
66
- options: [],
67
- read: false,
68
- isRead: false,
69
- valueData: {},
70
- },
71
- dialogProps = null,
72
- ) {
73
- // 优先使用外部注册的 $dialog;再尝试组件上下文 useDialog;再退回离散 API(仅全局创建一次)
74
- const dialogInstance = getDialogInstanceOnce()
75
-
76
- const defaultModeEnum = {
77
- none: { sub: '', read: false },
78
- create: { sub: '创建', read: false },
79
- add: { sub: '添加', read: false },
80
- edit: { sub: '编辑', read: false },
81
- view: { sub: '查看', read: true },
82
- export: { sub: '导出', read: false },
83
- import: { sub: '导入', read: false },
84
- delete: { sub: '删除', read: false },
85
- copy: { sub: '复制', read: false },
86
- ...modeEnum,
87
- }
88
- const formRef = ref()
89
- const actionLoading = reactive([])
90
- const model = ref({ ...valueData })
91
- const defaultActionProps = {
92
- justify: 'end',
93
- wrapItem: false,
94
- style: {
95
- width: '100%',
96
- },
97
- }
98
-
99
- const defaultButtonStyle = {
100
- width: '120px',
101
- }
102
- const defaultAction = [
103
- {
104
- label: '取消',
105
- props: {
106
- type: 'primary',
107
- ghost: true,
108
- },
109
- onClick: ({ cancel }) => {
110
- if (interfaceFnCancel) {
111
- interfaceFnCancel(unref(model), {
112
- close: cancel,
113
- })
114
- }else {
115
- cancel()
116
- }
117
- },
118
- },
119
- {
120
- label: '确定',
121
- valid: true,
122
- onClick: async ({ cancel, hideLoading }) =>
123
- interfaceFn
124
- ? await interfaceFn(unref(model), {
125
- close: cancel,
126
- hideLoading,
127
- })
128
- : cancel(),
129
- },
130
- ]
131
-
132
- action
133
- || defaultAction.forEach((v, i) => {
134
- actionLoading[i] = false
135
- })
136
- const titleRender
137
- = typeof titleFull === 'function'
138
- ? () => titleFull(defaultModeEnum[mode]?.sub)
139
- : titleFull
140
-
141
- const d = dialogInstance.create({
142
- type: 'info',
143
- ...dialogDefaultOption,
144
- ...(!noTitle
145
- ? { title: titleRender || (defaultModeEnum[mode]?.sub ?? '') + title }
146
- : {}),
147
- style: {
148
- width: '500px',
149
- },
150
- content: () => (
151
- <DataForm
152
- ref={v => {
153
- formRef.value = v
154
- }}
155
- options={options}
156
- v-model:value={model.value}
157
- isNo={isNo}
158
- read={read ?? isRead}
159
- labelField={labelField}
160
- formProps={formProps}
161
- contentStyle={contentStyle}
162
- dialog
163
- />
164
- ),
165
- action: !(read ?? isRead)
166
- ? typeof action === 'function'
167
- ? () => action({ formRef, data: unref(model), d, close: cancel })
168
- : () => (
169
- <NSpace
170
- {...defaultActionProps}
171
- {...actionProps}
172
- style={{
173
- ...defaultActionProps?.style,
174
- ...(actionProps?.style || {}),
175
- }}
176
- >
177
- {(action || defaultAction).map((v, i) =>
178
- v?.render
179
- ? (
180
- v?.render?.()
181
- )
182
- : (
183
- <NButton
184
- type="primary" ghost={v.mode === 'cancel'} {...({ ...v?.props, ...actionProps?.buttonProps } || {})}
185
- style={{ ...defaultButtonStyle, ...(v?.style || {}) }}
186
- loading={actionLoading[i]}
187
- onClick={async () => {
188
- if (v.mode === 'cancel') {
189
- d.destroy()
190
- }
191
- else {
192
- const showLoading = () => (actionLoading[i] = true)
193
- const hideLoading = () => (actionLoading[i] = false)
194
- if (v?.loading)
195
- showLoading()
196
- try {
197
- console.log('model', unref(model));
198
-
199
- if (v?.valid)
200
- await validate()
201
- console.log(v?.valid)
202
- if (v?.valid || v?.loading)
203
- showLoading()
204
- await v?.onClick({
205
- model: unref(model),
206
- comfirm,
207
- cancel,
208
- validate,
209
- showLoading,
210
- hideLoading,
211
- })
212
- }
213
- catch (e) {
214
- console.log(e)
215
- }
216
- finally {
217
- if (v?.valid || v?.loading)
218
- hideLoading()
219
- }
220
- }
221
- }}
222
- >
223
- {v.label || ''}
224
- </NButton>
225
- ),
226
- )}
227
- </NSpace>
228
- )
229
- : null,
230
- // ...readButton.value,
231
- ...dialogProps,
232
- class: `core-dialog ${ unref(read) ? 'core-dialog-read' : ''} ${dialogProps?.class || ''}`,
233
- })
234
-
235
- function cancel() {
236
- console.log('取消', model.value)
237
-
238
- d?.destroy()
239
- }
240
-
241
- async function validate(arr = []) {
242
- console.log('开启验证')
243
- await formRef.value?.valid()
244
- }
245
-
246
- async function comfirm(fn) {
247
- return fn && fn()
248
- }
249
-
250
- // onBeforeUnmount(() => {
251
- // console.log('commomDialog end')
252
- // cancel()
253
- // })
254
-
255
- return {
256
- cancel,
257
- setValue: (v, str) =>
258
- str ? (model.value[str] = v) : (model.value = { ...model.value, ...v }),
259
- model: unref(model),
260
- modeEnum: defaultModeEnum,
261
- }
262
- }
package/src/enum/sort.jsx DELETED
@@ -1,31 +0,0 @@
1
- import { ChevronDown, ChevronUp, Code } from '@vicons/ionicons5'
2
-
3
- export const orderEnum = {
4
- ascend: {
5
- title: '升序',
6
- value: true,
7
- Icon: <ChevronUp />,
8
- fn: (listQuery, key) => {
9
- listQuery.desc = true
10
- listQuery.sortFieldName = key
11
- },
12
- },
13
- descend: {
14
- title: '降序',
15
- value: false,
16
- Icon: <ChevronDown />,
17
- fn: (listQuery) => {
18
- listQuery.sortFieldName = ''
19
- listQuery.desc = true
20
- },
21
- },
22
- false: {
23
- title: '默认',
24
- value: null,
25
- Icon: <Code style="transform:rotateZ(90deg)" />,
26
- fn: (listQuery) => {
27
- listQuery.desc = false
28
- listQuery.sortFieldName = ''
29
- },
30
- },
31
- }