@neatui/nuxt 0.1.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.
Files changed (102) hide show
  1. package/README.md +3 -0
  2. package/package.json +43 -0
  3. package/rollup.config.js +35 -0
  4. package/src/components/basic/IDraggable.vue +84 -0
  5. package/src/components/basic/IDraggable@b.vue +80 -0
  6. package/src/components/basic/IFollowView.vue +211 -0
  7. package/src/components/basic/IPickerView.vue +351 -0
  8. package/src/components/basic/IRouterView.vue +360 -0
  9. package/src/components/basic/IScrollView.vue +127 -0
  10. package/src/components/basic/Icon.vue +54 -0
  11. package/src/components/basic/LayerView/Layer.vue +339 -0
  12. package/src/components/basic/LayerView/index.ts +5 -0
  13. package/src/components/basic/index.ts +7 -0
  14. package/src/components/display/Avatar.vue +1 -0
  15. package/src/components/display/Badge.vue +1 -0
  16. package/src/components/display/Calendar.vue +245 -0
  17. package/src/components/display/CalendarReg.vue +245 -0
  18. package/src/components/display/Card.vue +1 -0
  19. package/src/components/display/Carousel.vue +1 -0
  20. package/src/components/display/ChartView.vue +123 -0
  21. package/src/components/display/Collapse.vue +1 -0
  22. package/src/components/display/Desriptions.vue +1 -0
  23. package/src/components/display/Empty.vue +1 -0
  24. package/src/components/display/Image.vue +112 -0
  25. package/src/components/display/List.vue +1 -0
  26. package/src/components/display/PhotoEditor.vue +181 -0
  27. package/src/components/display/PhotoViewer.vue +50 -0
  28. package/src/components/display/Popover.vue +1 -0
  29. package/src/components/display/QRCode.vue +1 -0
  30. package/src/components/display/Segmented.vue +1 -0
  31. package/src/components/display/Statistic.vue +1 -0
  32. package/src/components/display/Table.vue +1 -0
  33. package/src/components/display/Tabs.vue +1 -0
  34. package/src/components/display/Tag.vue +1 -0
  35. package/src/components/display/Timeline.vue +1 -0
  36. package/src/components/display/Tooltip.vue +1 -0
  37. package/src/components/display/Tour.vue +1 -0
  38. package/src/components/display/Tree.vue +431 -0
  39. package/src/components/display/TreeView.vue +225 -0
  40. package/src/components/display/index.ts +8 -0
  41. package/src/components/form/Cascader.vue +435 -0
  42. package/src/components/form/DatePicker.vue +124 -0
  43. package/src/components/form/DateRangePicker@v2.vue.backup +224 -0
  44. package/src/components/form/DateRangePicker@v3.vue +116 -0
  45. package/src/components/form/DateRangeView@v3.vue +386 -0
  46. package/src/components/form/DateView.vue +229 -0
  47. package/src/components/form/DateView@v2.vue +386 -0
  48. package/src/components/form/DateView@v3.vue +471 -0
  49. package/src/components/form/EditUpload.vue +4 -0
  50. package/src/components/form/ImgUpload.vue +174 -0
  51. package/src/components/form/Input.vue.backup +230 -0
  52. package/src/components/form/Input@v3.vue +267 -0
  53. package/src/components/form/InputNumber.vue +200 -0
  54. package/src/components/form/InputRange.vue +235 -0
  55. package/src/components/form/MoreSelect.vue.backup +144 -0
  56. package/src/components/form/MoreSelect@v3.vue +195 -0
  57. package/src/components/form/MoreSelectList.vue +125 -0
  58. package/src/components/form/MoreSelectPanel@v3.vue +190 -0
  59. package/src/components/form/MoreSelectPicker.vue +124 -0
  60. package/src/components/form/MoreSelectTags.vue +124 -0
  61. package/src/components/form/PageMoreSelect.vue +187 -0
  62. package/src/components/form/PageSelect.vue +189 -0
  63. package/src/components/form/SearchMoreSelect.vue +173 -0
  64. package/src/components/form/SearchSelect.vue.backup +194 -0
  65. package/src/components/form/SearchSelect@v3.vue +202 -0
  66. package/src/components/form/Select@v3.vue +201 -0
  67. package/src/components/form/SelectList.vue +58 -0
  68. package/src/components/form/SelectPicker.vue +97 -0
  69. package/src/components/form/SelectTags.vue +52 -0
  70. package/src/components/form/SelectTree/SelectTree@v1.vue +227 -0
  71. package/src/components/form/Switch.vue +135 -0
  72. package/src/components/form/TextArea.vue +193 -0
  73. package/src/components/form/TimePicker.vue +11 -0
  74. package/src/components/form/TimeView.vue +244 -0
  75. package/src/components/form/Upload.vue +346 -0
  76. package/src/components/form/index.ts +82 -0
  77. package/src/components/loader/FormLoader/FormLoader@v2.vue +422 -0
  78. package/src/components/loader/FormLoader/FormLoader@v3.vue.backup +318 -0
  79. package/src/components/loader/FormLoader/index.ts +2 -0
  80. package/src/components/loader/FormLoader@v1/FormLoader.vue +506 -0
  81. package/src/components/loader/FormLoader@v1/FormRender.vue +277 -0
  82. package/src/components/loader/LimitLoader/LimitLoader.vue.backup +131 -0
  83. package/src/components/loader/LimitLoader/LimitLoader@v2.vue.backup +174 -0
  84. package/src/components/loader/LimitLoader/LimitLoader@v3.vue +183 -0
  85. package/src/components/loader/LimitLoader/index.ts +2 -0
  86. package/src/components/loader/TableLoader/TableColView.vue +115 -0
  87. package/src/components/loader/TableLoader/TableLoader.vue +360 -0
  88. package/src/components/loader/TableLoader/index.ts +2 -0
  89. package/src/components/loader/ViewLoader/ViewLoader@v1.vue +256 -0
  90. package/src/components/loader/ViewLoader/index.ts +2 -0
  91. package/src/components/loader/index.ts +5 -0
  92. package/src/components/tools/FormDraftsView.vue +330 -0
  93. package/src/components/tools/FormVerifyView.vue +206 -0
  94. package/src/components/tools/MoreTools.vue +74 -0
  95. package/src/components/tools/MoreTools@v2.vue +74 -0
  96. package/src/components/tools/Pagination@a.vue +222 -0
  97. package/src/components/tools/Pagination@b.vue +221 -0
  98. package/src/components/tools/index.ts +5 -0
  99. package/src/index.ts +9 -0
  100. package/src/shims-vue.d.ts +5 -0
  101. package/src/store/myui.ts +50 -0
  102. package/tsconfig.json +24 -0
@@ -0,0 +1,422 @@
1
+ <template>
2
+ <slot>
3
+ <div :ui-row="rows" class="n-sl-sub">
4
+ <template v-for="(col, idx) in state.form" :key="idx">
5
+ <div v-if="!col.clear" :id="col._fid" :ui-col="col.media" :ui-flex="`${vertical ? 'col xm' : 'row lt'}`">
6
+ <template v-if="col.label">
7
+ <h6 v-if="vertical" :style="`${col.rules?.some((validator: any) => validator.required) ? 'text-indent: -1em' : ''}`" class="o-ls">
8
+ <template v-if="col.label == '*'"></template>
9
+ <template v-else>
10
+ <b v-if="col.rules?.some((validator: any) => validator.required)" class="co-risk pr" style="left: 0.1em">﹡</b>
11
+ <span>{{ col.label ? col.label + ':' : '' }}</span>
12
+ </template>
13
+ </h6>
14
+ <p v-else :class="`${clh({ ...(col.model[1] || {}) })}`" :style="`width:${state._lw + 'em'}; max-width:50%;`" class="ar nr-sm flex-fixed o-ls">
15
+ <template v-if="col.label == '*'"></template>
16
+ <template v-else>
17
+ <b v-if="col.rules?.some((validator: any) => validator.required)" class="co-risk">﹡</b>
18
+ <span>{{ col.label ? col.label + ':' : '' }}</span>
19
+ </template>
20
+ </p>
21
+ </template>
22
+ <Input v-if="col.model[0] === 'Input'" v-model="col._data[col.field]" :interacted="interacted" :rules="col.rules" class="full-w" v-bind="{ ...(col.model[1] || {}) }" />
23
+ <Select
24
+ v-else-if="col.model[0] === 'Select'"
25
+ v-model="col._data[col.field]"
26
+ :interacted="interacted"
27
+ :options="col.enums"
28
+ :rules="col?.rules"
29
+ class="full-w"
30
+ v-bind="{ ...(col.model[1] || {}) }"
31
+ ></Select>
32
+ <SelectList
33
+ v-else-if="col.model[0] === 'SelectList'"
34
+ v-model="col._data[col.field]"
35
+ :interacted="interacted"
36
+ :options="col.enums"
37
+ :rules="col?.rules"
38
+ class="full-w"
39
+ v-bind="{ ...(col.model[1] || {}) }"
40
+ />
41
+ <SelectTags
42
+ v-else-if="col.model[0] === 'SelectTags'"
43
+ v-model="col._data[col.field]"
44
+ :interacted="interacted"
45
+ :options="col.enums"
46
+ :rules="col?.rules"
47
+ class="full-w"
48
+ v-bind="{ ...(col.model[1] || {}) }"
49
+ />
50
+ <SelectPicker
51
+ v-else-if="col.model[0] === 'SelectPicker'"
52
+ v-model="col._data[col.field]"
53
+ :interacted="interacted"
54
+ :options="col.enums"
55
+ :rules="col?.rules"
56
+ class="full-w"
57
+ v-bind="{ ...(col.model[1] || {}) }"
58
+ />
59
+ <SearchSelect
60
+ v-else-if="col.model[0] === 'SearchSelect'"
61
+ v-model="col._data[col.field]"
62
+ :interacted="interacted"
63
+ :options="col.enums"
64
+ :rules="col.rules"
65
+ class="full-w"
66
+ v-bind="{ ...(col.model[1] || {}) }"
67
+ />
68
+ <MoreSelect
69
+ v-else-if="col.model[0] === 'MoreSelect'"
70
+ v-model="col._data[col.field]"
71
+ :interacted="interacted"
72
+ :options="col.enums"
73
+ :rules="col.rules"
74
+ class="full-w"
75
+ v-bind="{ ...(col.model[1] || {}) }"
76
+ />
77
+ <MoreSelectList
78
+ v-else-if="col.model[0] === 'MoreSelectList'"
79
+ v-model="col._data[col.field]"
80
+ :interacted="interacted"
81
+ :options="col.enums"
82
+ :rules="col.rules"
83
+ class="full-w"
84
+ v-bind="{ ...(col.model[1] || {}) }"
85
+ />
86
+ <MoreSelectTags
87
+ v-else-if="col.model[0] === 'MoreSelectTags'"
88
+ v-model="col._data[col.field]"
89
+ :interacted="interacted"
90
+ :options="col.enums"
91
+ :rules="col.rules"
92
+ class="full-w"
93
+ v-bind="{ ...(col.model[1] || {}) }"
94
+ />
95
+ <MoreSelectPicker
96
+ v-else-if="col.model[0] === 'MoreSelectPicker'"
97
+ v-model="col._data[col.field]"
98
+ :interacted="interacted"
99
+ :options="col.enums"
100
+ :rules="col.rules"
101
+ class="full-w"
102
+ v-bind="{ ...(col.model[1] || {}) }"
103
+ />
104
+ <SearchMoreSelect
105
+ v-else-if="col.model[0] === 'SearchMoreSelect'"
106
+ v-model="col._data[col.field]"
107
+ :interacted="interacted"
108
+ :options="col.enums"
109
+ :rules="col.rules"
110
+ class="full-w"
111
+ v-bind="{ ...(col.model[1] || {}) }"
112
+ />
113
+ <PageSelect
114
+ v-else-if="col.model[0] === 'PageSelect'"
115
+ v-model="col._data[col.field]"
116
+ :interacted="interacted"
117
+ :options="col.enums"
118
+ :rules="col.rules"
119
+ class="full-w"
120
+ v-bind="{ ...(col.model[1] || {}) }"
121
+ />
122
+ <SelectTree
123
+ v-else-if="col.model[0] === 'SelectTree'"
124
+ v-model="col._data[col.field]"
125
+ :interacted="interacted"
126
+ :options="col.enums"
127
+ :rules="col.rules"
128
+ class="full-w"
129
+ v-bind="{ ...(col.model[1] || {}) }"
130
+ />
131
+ <DatePicker
132
+ v-else-if="col.model[0] === 'DatePicker'"
133
+ v-model="col._data[col.field]"
134
+ :interacted="interacted"
135
+ :rules="col.rules"
136
+ class="full-w"
137
+ v-bind="{ ...(col.model[1] || {}) }"
138
+ />
139
+ <DateRangePicker
140
+ v-else-if="col.model[0] === 'DateRangePicker'"
141
+ v-model="col._data[col.field]"
142
+ :interacted="interacted"
143
+ :rules="col.rules"
144
+ class="full-w"
145
+ v-bind="{ ...(col.model[1] || {}) }"
146
+ />
147
+ <ImgUpload v-else-if="col.model[0] === 'ImgUpload'" v-model="col._data[col.field]" :interacted="interacted" :rules="col.rules" v-bind="{ ...(col.model[1] || {}) }" />
148
+ <Upload v-else-if="col.model[0] === 'Upload'" v-model="col._data[col.field]" :interacted="interacted" :rules="col.rules" v-bind="{ ...(col.model[1] || {}) }" />
149
+ <TextArea
150
+ v-else-if="col.model[0] === 'TextArea'"
151
+ v-model="col._data[col.field]"
152
+ :interacted="interacted"
153
+ :rules="col.rules"
154
+ v-bind="{ ...(col.model[1] || {}) }"
155
+ ></TextArea>
156
+ <Switch v-else-if="col.model[0] === 'Switch'" v-model="col._data[col.field]" :interacted="interacted" :rules="col.rules" v-bind="{ ...(col.model[1] || {}) }" />
157
+ <Tree v-else-if="col.model[0] === 'Tree'" v-model="col._data[col.field]" :interacted="interacted" :rules="col.rules" class="mt-sm" v-bind="{ ...(col.model[1] || {}) }" />
158
+ <Cascader
159
+ v-else-if="col.model[0] === 'Cascader'"
160
+ v-model="col._data[col.field]"
161
+ :interacted="interacted"
162
+ :options="col.enums"
163
+ :rules="col.rules"
164
+ class="full-w"
165
+ v-bind="{ ...(col.model[1] || {}) }"
166
+ />
167
+ <template v-else>
168
+ <slot v-if="col.slot" :name="col.slot" :col="col"></slot>
169
+ <slot v-else-if="col.model[0]" :name="col.model[0]" :col="col"></slot>
170
+ <slot v-else :name="col.field" :col="col"></slot>
171
+ </template>
172
+ </div>
173
+ </template>
174
+ <div :ui-flex="`${vertical ? 'col xm' : 'row xt'}`">
175
+ <div v-if="vertical">
176
+ <slot name="submit"></slot>
177
+ </div>
178
+ <div v-else :style="`padding-left:${state._lw + 'em'};`">
179
+ <slot name="submit"></slot>
180
+ </div>
181
+ </div>
182
+ </div>
183
+ </slot>
184
+ </template>
185
+ <script lang="ts" setup>
186
+ import { watch, reactive, onBeforeUnmount, nextTick } from 'vue';
187
+ import { useRoute, useRouter } from 'vue-router';
188
+ import { isString, isObject, isFunction, deepcopy, isArray } from '@fekit/utils';
189
+ import {
190
+ Input,
191
+ Switch,
192
+ TextArea,
193
+ Select,
194
+ SelectList,
195
+ SelectTags,
196
+ SelectPicker,
197
+ SearchSelect,
198
+ PageSelect,
199
+ SelectTree,
200
+ MoreSelect,
201
+ MoreSelectList,
202
+ MoreSelectTags,
203
+ MoreSelectPicker,
204
+ DatePicker,
205
+ DateRangePicker,
206
+ SearchMoreSelect,
207
+ ImgUpload,
208
+ Upload,
209
+ Cascader
210
+ } from '../../form';
211
+ import { Tree } from '../../display';
212
+
213
+ const route = useRoute();
214
+ const router = useRouter();
215
+
216
+ // 计算Label行高
217
+ const clh = ({ sz = '' }: any = {}) => {
218
+ const lhs: any = { xs: 'lh-sm', s: 'lh-mm', m: 'lh-ls', l: 'lh-ll', xl: 'lh-xl' };
219
+ return lhs[sz] || 'lh-ls';
220
+ };
221
+
222
+ // 计算Label宽度
223
+ function clw(label: any = '') {
224
+ let emWidth = 0;
225
+ if (isString(label)) {
226
+ for (let i = 0; i < label.length; i++) {
227
+ const char = label[i];
228
+ if (/^[\u4e00-\u9fa5]+$/.test(char)) {
229
+ emWidth += 1;
230
+ } else {
231
+ emWidth += 0.5;
232
+ }
233
+ }
234
+ }
235
+ return emWidth;
236
+ }
237
+
238
+ // 入参
239
+ const props: any = defineProps({
240
+ // 用户是否交互
241
+ interacted: {
242
+ type: Boolean,
243
+ default: false
244
+ },
245
+ // JSON规则
246
+ form: {
247
+ type: Object,
248
+ default: () => ({})
249
+ },
250
+ // 表单数据
251
+ data: {
252
+ type: Object as any,
253
+ default: () => ({})
254
+ },
255
+ // 栅格系统
256
+ rows: {
257
+ type: String,
258
+ default: 'mob-24 pad-12 dpc-8'
259
+ },
260
+ // 如果表单是数组的话这里传入下标
261
+ idx: {
262
+ type: [String, Number],
263
+ default: ''
264
+ },
265
+ // 是否垂直排列
266
+ vertical: {
267
+ type: Boolean,
268
+ default: false
269
+ }
270
+ });
271
+
272
+ // 数据
273
+ const state: any = reactive({
274
+ form: [],
275
+ _lw: 6
276
+ });
277
+
278
+ // 监听结构
279
+ const unwatchs: any = [];
280
+ watch(
281
+ [() => props.form, () => props.data, () => props.idx],
282
+ ([form = []]) => {
283
+ const wkeys: any = {};
284
+ const onces: any = [];
285
+ state.form = deepcopy(form)?.map((item: any = {}, idx: number) => {
286
+ // 计算Label宽度
287
+ const _w = clw(item.label) + 2;
288
+ if (_w > state._lw) {
289
+ state._lw = _w;
290
+ }
291
+
292
+ if (isObject(item)) {
293
+ for (const key in item) {
294
+ let val = item[key] || {};
295
+ // 处理函数
296
+ if (isFunction(val)) {
297
+ val = val(deepcopy(props.data), props.form, route, router);
298
+ if (isObject(val)) {
299
+ if (!isFunction(val.setup)) {
300
+ val.setup = item[key];
301
+ }
302
+ if (!isArray(val.watch)) {
303
+ val.watch = deepcopy(form).map(({ field = '' }: any = {}) => field);
304
+ }
305
+ } else {
306
+ val = { value: val, setup: item[key], watch: deepcopy(form).map(({ field = '' }: any = {}) => field) };
307
+ }
308
+ }
309
+ // 对象处理
310
+ if (isObject(val)) {
311
+ const { value = null, setup = () => {}, watch: _watch = [] } = val || {};
312
+ // 监听字段为空
313
+ if (_watch.length) {
314
+ _watch?.forEach((k: any) => {
315
+ if (wkeys[k]) {
316
+ wkeys[k].push({ idx, key, value, setup });
317
+ } else {
318
+ wkeys[k] = [{ idx, key, value, setup }];
319
+ }
320
+ });
321
+ } else {
322
+ onces.push({ idx, key, value, setup });
323
+ }
324
+ item[key] = value;
325
+ } else {
326
+ item[key] = val;
327
+ }
328
+ }
329
+ }
330
+
331
+ // 模型处理
332
+ if (item.model) {
333
+ if (isString(item.model)) {
334
+ item.model = [item.model, { verify: false }];
335
+ }
336
+ } else {
337
+ item.model = ['', { verify: false }];
338
+ }
339
+ if (item.model[1] && !Object.prototype.hasOwnProperty.call(item.model[1], 'verify')) {
340
+ item.model[1].verify = false;
341
+ }
342
+
343
+ // 添加ID
344
+ item._fid = `form-${props.idx !== '' ? props.idx + '-' : ''}field-${item.field}`;
345
+
346
+ // 数据路径处理
347
+ item._data = props.data;
348
+ (item.paths?.split('.') || [])?.forEach((i: any) => {
349
+ if (item._data[i]) {
350
+ item._data = item._data[i];
351
+ }
352
+ });
353
+ return item;
354
+ });
355
+ const runsetup = (item: any = {}) => {
356
+ const { idx = null, key = null, value = null, setup = null }: any = item || {};
357
+ if (state.form[idx] && isFunction(setup)) {
358
+ const v = setup(deepcopy(props.data), state.form[idx], route, router);
359
+ nextTick(() => {
360
+ if (v instanceof Promise) {
361
+ state.form[idx][key] = value;
362
+ v.then((res: any) => {
363
+ state.form[idx][key] = res;
364
+ });
365
+ } else {
366
+ state.form[idx][key] = v;
367
+ }
368
+ });
369
+ }
370
+ };
371
+ // 执行一次
372
+ onces?.forEach((item: any = {}) => {
373
+ runsetup(item);
374
+ });
375
+ // 监听列表
376
+ for (const key in wkeys) {
377
+ unwatchs.push(
378
+ watch(
379
+ () => props.data[key],
380
+ () => {
381
+ wkeys[key]?.forEach((item: any = {}) => {
382
+ runsetup(item);
383
+ });
384
+ },
385
+ {
386
+ deep: true,
387
+ immediate: true
388
+ }
389
+ )
390
+ );
391
+ }
392
+ },
393
+ { deep: true, immediate: true }
394
+ );
395
+
396
+ // 处理
397
+ watch(
398
+ [() => state.form, () => props.data],
399
+ () => {
400
+ state.form.forEach((item: any = {}) => {
401
+ const { clear = false, field = '', paths = '' }: any = item;
402
+ if (clear) {
403
+ // 数据路径处理
404
+ let _data = props.data;
405
+ (paths?.split('.') || [])?.forEach((i: any) => {
406
+ if (_data[i]) {
407
+ _data = item._data[i];
408
+ }
409
+ });
410
+ _data[field] = isArray(_data[field]) ? [] : '';
411
+ }
412
+ });
413
+ },
414
+ { deep: true }
415
+ );
416
+
417
+ onBeforeUnmount(() => {
418
+ unwatchs?.forEach((unwatch: any) => {
419
+ unwatch();
420
+ });
421
+ });
422
+ </script>