@neatui/vue 3.1.0 → 4.0.1

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 (52) hide show
  1. package/README.md +1 -10
  2. package/package.json +5 -2
  3. package/rollup.config.js +42 -2
  4. package/src/components/basic/IDraggable@b.vue +1 -1
  5. package/src/components/basic/IFollowView.vue +2 -2
  6. package/src/components/basic/LayerView/Layer.vue +193 -42
  7. package/src/components/display/Calendar.vue +6 -6
  8. package/src/components/display/CalendarReg.vue +6 -6
  9. package/src/components/display/PhotoEditor.vue +2 -2
  10. package/src/components/display/TreeView.vue +4 -3
  11. package/src/components/form/Cascader.vue +3 -3
  12. package/src/components/form/DatePicker.vue +2 -2
  13. package/src/components/form/{DateRangePicker@v3.vue → DateRangePicker.vue} +2 -1
  14. package/src/components/form/{DateRangeView@v3.vue → DateRangeView.vue} +11 -11
  15. package/src/components/form/DateView.vue +461 -82
  16. package/src/components/form/ImgUpload.vue +3 -3
  17. package/src/components/form/{MoreSelect@v3.vue → MoreSelect.vue} +1 -1
  18. package/src/components/form/MoreSelectList.vue +1 -1
  19. package/src/components/form/{MoreSelectPanel@v3.vue → MoreSelectPanel.vue} +1 -1
  20. package/src/components/form/MoreSelectPicker.vue +3 -3
  21. package/src/components/form/MoreSelectTags.vue +1 -1
  22. package/src/components/form/PageMoreSelect.vue +1 -1
  23. package/src/components/form/PageSelect.vue +1 -1
  24. package/src/components/form/SearchMoreSelect.vue +1 -1
  25. package/src/components/form/{SearchSelect@v3.vue → SearchSelect.vue} +1 -1
  26. package/src/components/form/{Select@v3.vue → Select.vue} +1 -1
  27. package/src/components/form/SelectList.vue +1 -1
  28. package/src/components/form/SelectPicker.vue +3 -3
  29. package/src/components/form/SelectTree/{SelectTree@v1.vue → SelectTree.vue} +1 -1
  30. package/src/components/form/Switch.vue +2 -1
  31. package/src/components/form/TimeView.vue +6 -6
  32. package/src/components/form/Upload.vue +22 -11
  33. package/src/components/form/index.ts +8 -8
  34. package/src/components/loader/FormLoader/FormLoader.vue +124 -103
  35. package/src/components/loader/LayerLoader/LayerLoader.vue +6 -7
  36. package/src/components/loader/LimitLoader/{LimitLoader@v3.vue → LimitLoader.vue} +4 -4
  37. package/src/components/loader/LimitLoader/index.ts +1 -1
  38. package/src/components/loader/TableLoader/TableLoader.vue +7 -7
  39. package/src/components/loader/TableLoader/TableRender.vue +0 -1
  40. package/src/components/loader/ViewLoader/{ViewLoader@v1.vue → ViewLoader.vue} +124 -103
  41. package/src/components/loader/ViewLoader/index.ts +1 -1
  42. package/src/components/tools/FormDraftsView.vue +4 -4
  43. package/src/components/tools/FormVerifyView.vue +2 -2
  44. package/src/components/tools/MoreTools.vue +5 -5
  45. package/src/components/tools/Pagination@a.vue +4 -4
  46. package/src/components/tools/Pagination@b.vue +4 -4
  47. package/tsconfig.json +1 -2
  48. package/src/components/form/DateView@v2.vue +0 -386
  49. package/src/components/form/DateView@v3.vue +0 -608
  50. package/src/components/tools/MoreTools@v2.vue +0 -74
  51. /package/src/components/form/{Input@v3.vue → Input.vue} +0 -0
  52. /package/src/components/form/{TextArea.vue → Textarea.vue} +0 -0
@@ -1,386 +0,0 @@
1
- <template>
2
- <div ui-date="@a" class="fekit-date-view pr" :class="`${frame ? 'b-solid bk-line b-xs r-sm' : ''}`" ui-flex="col xy" style="width: 22em">
3
- <div ui-date-head="" class="flex-fixed nx-sl mt-ss ny-sm b-solid bk-back" ui-flex="row xm">
4
- <div ui-flex="row lm" class="o-lm">
5
- <div ui-btn="@a s none :square" @click="prev('y')">
6
- <Icon name="double-arrow-left" />
7
- </div>
8
- <div ui-btn="@a s none :square" @click="prev('m')">
9
- <Icon name="arrow-left" />
10
- </div>
11
- </div>
12
- <div ui-flex="row cm" class="nx-ss-sub">
13
- <div ui-flex="row cm" class="nx-ss-sub">
14
- <p class="nowrap" ui-flex="row cm" ui-btns="@a none xs">
15
- <b class="nx-ss" @click="setPanelType('year')">{{ state.curr.y }}年</b>
16
- <b class="nx-ss" @click="setPanelType('month')">{{ state.curr.M }}月</b>
17
- <!-- <b class="nx-ss" @click="setPanelType('time')">时间</b> -->
18
- </p>
19
- </div>
20
- </div>
21
- <div ui-flex="row rm" class="o-lm">
22
- <div ui-btn="@a s none :square" @click="next('m')">
23
- <Icon name="arrow-right" />
24
- </div>
25
- <div ui-btn="@a s none :square" @click="next('y')">
26
- <Icon name="double-arrow-right" />
27
- </div>
28
- </div>
29
- </div>
30
- <div ui-date-body="" class="flex-block pr">
31
- <div class="full">
32
- <ul ui-flex="row am" class="fs-xs nx-sm nt-sm">
33
- <li class="flex-block ac"><span>日</span></li>
34
- <li class="flex-block ac"><span>一</span></li>
35
- <li class="flex-block ac"><span>二</span></li>
36
- <li class="flex-block ac"><span>三</span></li>
37
- <li class="flex-block ac"><span>四</span></li>
38
- <li class="flex-block ac"><span>五</span></li>
39
- <li class="flex-block ac"><span>六</span></li>
40
- </ul>
41
- <ul ui-date-days="" ui-flex="col xm" class="flex-wrap nx-sm">
42
- <li v-for="(week, idx) in state.curr.days" :key="idx" :ui-date-week="idx + 1" class="flex-block" ui-flex="row am" style="margin-bottom: -0.25em">
43
- <div v-for="(item, i) in week" :key="i" class="pr flex-block nb-sm" ui-flex="col xy">
44
- <div
45
- v-if="item.day"
46
- :ui-date-day="item.day"
47
- class="flex-block"
48
- :class="`${item.range ? 'bg-main-o-xs' : ''} ${item.sta ? 'r-lt-sl r-lb-sl' : ''} ${item.end ? 'r-rt-sl r-rb-sl' : ''}`"
49
- ui-flex="col cm"
50
- @click="change(item)"
51
- @mouseenter="setRangeValue(item)"
52
- >
53
- <div
54
- ui-flex="col cm"
55
- class="r-sm b-solid bk-none b-xs my-ss ux-scale"
56
- style="width: 1.8em; height: 1.8em"
57
- :class="`${item.isLastMonth || item.isNextMonth ? 'co-idle' : item.isHoliday ? 'co-risk' : ''} ${item.selected ? 'active bg-main-o-lm co-fore' : 'hover-bg-weak'}`"
58
- >
59
- <span>{{ item.day }}</span>
60
- </div>
61
- </div>
62
- <div class="pa w-full lh-xs ny-ss ob-no ol-no nowrap s-ml bold" style="transform-origin: 50% 100%" ui-flex="row ct" v-html="extras(item)"></div>
63
- </div>
64
- </li>
65
- </ul>
66
- </div>
67
- </div>
68
- <div v-if="!state.isNoTime" class="ny-sm nx-ms">
69
- <div class="full ac b-solid bk-line b-xs r-sm" ui-row="mob-8" style="width: 100%; height: 3em; padding: 0.5em">
70
- <ul
71
- :style="`${state.panel ? '' : 'pointer-events: none; opacity:.35'}`"
72
- class="fekit-date-view-time-scroll"
73
- ref="ths"
74
- ui-scroll=":y xs"
75
- ui-btns="@a none s :block"
76
- data-type="h"
77
- @scroll="timeScroll"
78
- >
79
- <li v-for="(item, idx) in hours" :key="idx">
80
- {{ item }}
81
- </li>
82
- </ul>
83
- <ul
84
- :style="`${state.panel ? '' : 'pointer-events: none; opacity:.35'}`"
85
- class="fekit-date-view-time-scroll"
86
- ref="tms"
87
- ui-scroll=":y xs"
88
- ui-btns="@a none s :block"
89
- data-type="m"
90
- @scroll="timeScroll"
91
- >
92
- <li v-for="(item, idx) in seconds" :key="idx">
93
- {{ item }}
94
- </li>
95
- </ul>
96
- <ul
97
- :style="`${state.panel ? '' : 'pointer-events: none; opacity:.35'}`"
98
- class="fekit-date-view-time-scroll"
99
- ref="tss"
100
- ui-scroll=":y xs"
101
- ui-btns="@a none s :block"
102
- data-type="s"
103
- @scroll="timeScroll"
104
- >
105
- <li v-for="(item, idx) in seconds" :key="idx">
106
- {{ item }}
107
- </li>
108
- </ul>
109
- </div>
110
- </div>
111
-
112
- <div v-if="tools" ui-date-foot="" ui-flex="row xm" class="flex-fixed nx-sl ny-sl b-solid bk-line-o-mm bt-xs">
113
- <div ui-flex="row lm" class="nl-ss">
114
- <div v-if="state.panel" ui-flex="row lm">
115
- <span :anim-editing="state.type === 'date'" ui-btn="@a xs none" class="nx-ss" @click="setPanelType('date')">{{ idate(state.panel).format('YYYY-MM-DD') }}</span>
116
- <span v-if="!state.isNoTime" :anim-editing="state.type === 'time'" ui-btn="@a xs none" class="nx-ss" @click="setPanelType('time')">
117
- {{ idate(state.panel).format('HH:mm:ss') }}
118
- </span>
119
- </div>
120
- <div v-else-if="state.shortcuts?.length" ui-flex="row lm">
121
- <div class="mr-sm-sub nx-sl-sub ny-ss-sub lh-ss nowrap fs-ss dib-sub" ui-scroll=":x y:hidden">
122
- <p v-for="(item, idx) in state.shortcuts" :key="idx" class="bg-main-o-ss co-main r-xl" ui-btn="@a xs none :round" @click="item?.func">{{ item?.text }}</p>
123
- <p class="bg-main-o-ss co-main r-xl" ui-btn="@a xs none :round"><Icon class="co-main" name="more" /></p>
124
- </div>
125
- </div>
126
- <div>&nbsp;</div>
127
- </div>
128
- <div class="ml-ss-sub" ui-flex="row rm">
129
- <button v-if="state.panel" ui-btn="@a xs none" class="nx-ss co-risk" @click="remove">清除</button>
130
- <button v-if="state.panel && !state.isNoTime" ui-btn="@a xs none" class="nx-ss co-main" @click="update">确定</button>
131
- </div>
132
- </div>
133
- </div>
134
- </template>
135
- <script setup lang="ts">
136
- import { computed, ref, reactive, watch, onMounted } from 'vue';
137
- import { isDateString, isObject, isString } from '@fekit/utils';
138
- import { idate } from '@fekit/utils';
139
- import { Icon } from '../basic';
140
-
141
- // 创建日期
142
- const cDate = (date: any = null) => {
143
- return isDateString(date) ? new Date(date) : new Date();
144
- };
145
-
146
- // 快捷预设
147
- const shortcutsList: any = {
148
- yesterday: {
149
- text: '昨天',
150
- func() {
151
- change({ date: idate(new Date().setDate(new Date().getDate() - 1)).format('YYYY-MM-DD') });
152
- },
153
- },
154
- today: {
155
- text: '今天',
156
- func() {
157
- change({ date: idate(new Date()).format('YYYY-MM-DD') });
158
- },
159
- },
160
- tomorrow: {
161
- text: '明天',
162
- func() {
163
- change({ date: idate(new Date().setDate(new Date().getDate() + 1)).format('YYYY-MM-DD') });
164
- },
165
- },
166
- };
167
-
168
- const emits: any = defineEmits(['update:modelValue', 'change', 'update']);
169
- interface TimeProps {
170
- h: boolean | number;
171
- m?: boolean | number;
172
- s?: boolean | number;
173
- }
174
- interface Props {
175
- modelValue?: string | number;
176
- frame: boolean;
177
- tools?: boolean;
178
- range?: boolean;
179
- format?: string;
180
- picker?: 'date' | 'week' | 'month' | 'quarter';
181
- holiday?: object;
182
- shortcuts?: Array<'yesterday' | 'today' | 'tomorrow'>;
183
- extras?: (item: any) => string;
184
- time?: boolean | TimeProps;
185
- }
186
- const props: any = withDefaults(defineProps<Props>(), {
187
- // 值
188
- modelValue: '',
189
- // 是否显示框架
190
- frame: false,
191
- // 是否是示工具
192
- tools: true,
193
- // 时间范围
194
- range: false,
195
- // 面板类型
196
- picker: 'date',
197
- // 额外内容
198
- extras: (item: any) => {
199
- return `<i class="dib o-ms mb-xs r-xl ${item.today ? 'bg-main' : 'bg-none'}" style="width:.6em; height:.6em;"></i>`;
200
- },
201
- // 快捷选择
202
- shortcuts: () => ['yesterday', 'today', 'tomorrow'],
203
- // 数据格式化
204
- format: 'YYYY-MM-DD',
205
- // 节假日
206
- holiday: () => ({}),
207
- time: false,
208
- });
209
-
210
- // 小时
211
- const hours = computed(() => {
212
- const _hours: any = [];
213
- for (let i = 0; i < 24; i++) {
214
- _hours.push(i > 9 ? `${i}` : `0${i}`);
215
- }
216
- return _hours;
217
- });
218
- // 分秒
219
- const seconds = computed(() => {
220
- const _seconds: any = [];
221
- for (let i = 0; i < 60; i++) {
222
- _seconds.push(i > 9 ? `${i}` : `0${i}`);
223
- }
224
- return _seconds;
225
- });
226
-
227
- // 内部数据
228
- const state: any = reactive({
229
- // 面板显示时间
230
- panel: '',
231
- // 当前时间计算
232
- curr: computed(() => {
233
- const date = idate(state.panel);
234
- console.log(235, date);
235
- const days = date.calendar({ group: true, value: [state.panel] });
236
- return { days, ...date.attr };
237
- }),
238
- type: 'date',
239
- // 值
240
- value: '',
241
- // 快捷选择
242
- shortcuts: computed(() => {
243
- return props.shortcuts.map((item: any) => {
244
- return isString(item) ? shortcutsList[item] : item;
245
- });
246
- }),
247
- isNoTime: computed(() => {
248
- if (isObject(props.time)) {
249
- return !(props.time.h || props.time.m || props.time.s);
250
- } else {
251
- return !props.time;
252
- }
253
- }),
254
- });
255
-
256
- const ths: any = ref(null);
257
- const tms: any = ref(null);
258
- const tss: any = ref(null);
259
- const setTimeValue = () => {
260
- const { H = 0, m = 0, s = 0 }: any = state.curr || {};
261
- if (state.panel) {
262
- if (ths.value && ths.value.children[H]) {
263
- ths.value.scrollTop = ths.value.children[H].offsetTop;
264
- }
265
- if (tms.value && tms.value.children[m]) {
266
- tms.value.scrollTop = tms.value.children[m].offsetTop;
267
- }
268
- if (tss.value && tss.value.children[s]) {
269
- tss.value.scrollTop = tss.value.children[s].offsetTop;
270
- }
271
- } else {
272
- if (ths.value && ths.value.children[H]) {
273
- ths.value.scrollTop = ths.value.children[0].offsetTop;
274
- }
275
- if (tms.value && tms.value.children[m]) {
276
- tms.value.scrollTop = tms.value.children[0].offsetTop;
277
- }
278
- if (tss.value && tss.value.children[s]) {
279
- tss.value.scrollTop = tss.value.children[0].offsetTop;
280
- }
281
- }
282
- };
283
-
284
- watch(
285
- () => props.modelValue,
286
- (value: any) => {
287
- // 面板显示日期
288
- state.panel = value || '';
289
- // 值
290
- state.value = value || '';
291
- },
292
- { deep: true, immediate: true },
293
- );
294
-
295
- onMounted(() => {
296
- setTimeValue();
297
- });
298
- watch(
299
- () => state.panel,
300
- () => {
301
- setTimeValue();
302
- },
303
- );
304
-
305
- // 更新时间
306
- const upload = (a: any = 'm', b: any = 1) => {
307
- const date = cDate(state.panel);
308
- if (a === 'm') {
309
- date.setMonth(date.getMonth() + b);
310
- } else {
311
- date.setFullYear(date.getFullYear() + b);
312
- }
313
- return idate(date).format(props.format);
314
- };
315
-
316
- // 日期前翻
317
- const prev = (type: any = 'm') => {
318
- state.panel = upload(type, -1);
319
- };
320
- // 日期后翻
321
- const next = (type: any = 'm') => {
322
- state.panel = upload(type, 1);
323
- };
324
-
325
- // 向外通信
326
- const change = (item: any) => {
327
- state.panel = item ? idate(item.date).format(props.format) : item;
328
- emits('change', state.value);
329
- if (state.isNoTime) {
330
- update();
331
- }
332
- };
333
-
334
- // 清空日期
335
- const remove = () => {
336
- state.panel = '';
337
- update();
338
- };
339
-
340
- // 更新数据
341
- const update = () => {
342
- emits('update:modelValue', state.panel ? idate(state.panel).format(props.format) : '');
343
- emits('update', state.panel ? idate(state.panel).format(props.format) : '');
344
- };
345
-
346
- // 设置范围
347
- const setRangeValue = (item: any) => {};
348
- // 设置面板类型
349
- const setPanelType = (type: any) => {
350
- state.type = type;
351
- };
352
-
353
- // 时间滚动
354
- const _timer: any = ref(null);
355
- const timeScroll = (ev: any) => {
356
- const item: any = ev.target?.children[0];
357
- const type: any = ev.target.getAttribute('data-type') || '';
358
- if (state.panel && item) {
359
- clearTimeout(_timer.value);
360
- _timer.value = setTimeout(() => {
361
- const h = item.offsetHeight;
362
- const index = Math.floor(ev.target.scrollTop / h);
363
- const { YYYY = 0, MM = 0, DD = 0, HH = '', mm = '', ss = '' }: any = state.curr || {};
364
- if (type === 'h') {
365
- state.panel = idate(`${YYYY}-${MM}-${DD} ${index}:${mm}:${ss}`).format('YYYY-MM-DD HH:mm:ss');
366
- }
367
- if (type === 'm') {
368
- state.panel = idate(`${YYYY}-${MM}-${DD} ${HH}:${index}:${ss}`).format('YYYY-MM-DD HH:mm:ss');
369
- }
370
- if (type === 's') {
371
- state.panel = idate(`${YYYY}-${MM}-${DD} ${HH}:${mm}:${index}`).format('YYYY-MM-DD HH:mm:ss');
372
- }
373
- }, 100);
374
- }
375
- };
376
- </script>
377
- <style lang="scss">
378
- .fekit-date-view-time-scroll {
379
- position: relative;
380
- height: 100%;
381
- scroll-snap-type: y mandatory;
382
- & > * {
383
- scroll-snap-align: center;
384
- }
385
- }
386
- </style>