@neatui/vue 2.17.5 → 3.0.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 (29) hide show
  1. package/.prettierrc +12 -0
  2. package/README.md +82 -0
  3. package/package.json +7 -4
  4. package/src/components/basic/IFollowView.vue +47 -34
  5. package/src/components/basic/IPickerView.vue +16 -8
  6. package/src/components/basic/IRouterView.vue +133 -74
  7. package/src/components/basic/IScrollView.vue +40 -28
  8. package/src/components/basic/LayerView/Layer.vue +33 -24
  9. package/src/components/basic/LayerView/index.ts +3 -1
  10. package/src/components/form/DateView@v3.vue +2 -1
  11. package/src/components/form/Input@v3.vue +9 -6
  12. package/src/components/form/TextArea.vue +3 -3
  13. package/src/components/loader/FormLoader/FormLoader.vue +29 -4
  14. package/src/components/loader/LayerLoader/LayerLoader.vue +2 -1
  15. package/src/components/loader/LimitLoader/LimitLoader@v3.vue +3 -3
  16. package/src/components/loader/TableLoader/TableLoader.vue +3 -3
  17. package/src/components/loader/index.ts +1 -1
  18. package/src/components/tools/FormDraftsView.vue +15 -11
  19. package/src/components/tools/FormVerifyView.vue +4 -3
  20. package/src/components/tools/MoreTools.vue +4 -3
  21. package/src/components/tools/Pagination@a.vue +74 -38
  22. package/src/components/tools/Pagination@b.vue +2 -1
  23. package/src/store/frame.ts +18 -10
  24. package/src/utils/theme.ts +3 -0
  25. package/src/components/basic/follow.ts +0 -133
  26. package/src/components/loader/FormLoader/FormLoader@v2.vue +0 -422
  27. package/src/components/loader/FormLoader/NodeLoader.vue +0 -85
  28. package/src/components/loader/FormLoader@v1/FormLoader.vue +0 -506
  29. package/src/components/loader/FormLoader@v1/FormRender.vue +0 -302
@@ -1,302 +0,0 @@
1
- <template>
2
- <div class="flex-block pr">
3
- <template v-if="mode === 'view'">
4
- <slot :name="`${node.field}-value`" :data="data" :node="node" :bind.sync="bind">
5
- <div class="nt-ss"><div v-html="value" style="padding-top: 2px"></div></div>
6
- </slot>
7
- </template>
8
- <template v-else>
9
- <el-input v-if="node.model[0] === 'Input'" v-model="value" class="w-full" v-bind="{ ...(node.model[1] || {}) }" @input="setInteracted" @blur="setInteracted" />
10
- <el-input
11
- v-if="node.model[0] === 'Textarea'"
12
- v-model="value"
13
- class="w-full"
14
- v-bind="{ ...(node.model[1] || {}, { type: 'textarea', rows: 3 }) }"
15
- @input="setInteracted"
16
- @blur="setInteracted"
17
- />
18
- <el-select v-else-if="node.model[0] === 'Select'" v-model="value" v-bind="{ ...(node.model[1] || {}) }" @input="setInteracted" @blur="setInteracted">
19
- <el-option v-for="item in node.enums" :key="item.value" :label="item.label" :value="item.value"> </el-option>
20
- </el-select>
21
- <el-radio-group v-else-if="node.model[0] === 'Radio'" v-model="value" v-bind="{ ...(node.model[1] || {}) }" @input="setInteracted" @blur="setInteracted">
22
- <el-radio v-for="item in node.enums" :key="item.value" :label="item.value">{{ item.label }}</el-radio>
23
- </el-radio-group>
24
- <el-checkbox-group v-else-if="node.model[0] === 'Checkbox' && node.enums" v-model="value" v-bind="{ ...(node.model[1] || {}) }" @input="setInteracted" @blur="setInteracted">
25
- <el-checkbox v-for="item in node.enums" :key="item.value" :label="item.value">{{ item.label }}</el-checkbox>
26
- </el-checkbox-group>
27
- <el-checkbox v-else-if="node.model[0] === 'Checkbox'" v-model="value" v-bind="{ ...(node.model[1] || {}) }" @input="setInteracted" @blur="setInteracted"> </el-checkbox>
28
- <el-switch v-else-if="node.model[0] === 'Switch'" v-model="value" v-bind="{ ...(node.model[1] || {}) }" @input="setInteracted" @blur="setInteracted"> </el-switch>
29
- <el-time-select v-else-if="node.model[0] === 'TimeSelect'" v-model="value" v-bind="{ ...(node.model[1] || {}) }" @input="setInteracted" @blur="setInteracted">
30
- </el-time-select>
31
- <el-time-picker v-else-if="node.model[0] === 'TimePicker'" v-model="value" v-bind="{ ...(node.model[1] || {}) }" @input="setInteracted" @blur="setInteracted">
32
- </el-time-picker>
33
- <el-date-picker v-else-if="node.model[0] === 'DatePicker'" v-model="value" v-bind="{ ...(node.model[1] || {}) }" @input="setInteracted" @blur="setInteracted">
34
- </el-date-picker>
35
- <el-date-picker
36
- v-else-if="node.model[0] === 'DateTimePicker'"
37
- v-model="value"
38
- type="datetime"
39
- v-bind="{ ...(node.model[1] || {}) }"
40
- @input="setInteracted"
41
- @blur="setInteracted"
42
- >
43
- </el-date-picker>
44
- <el-cascader
45
- v-else-if="node.model[0] === 'Cascader'"
46
- v-model="value"
47
- :options="node.enums"
48
- v-bind="{ ...node.model[1] }"
49
- @input="setInteracted"
50
- @blur="setInteracted"
51
- ></el-cascader>
52
- <gallery-value v-else-if="node.model[0] === 'SelectImg'" :form="data" :node="node" v-bind="{ ...node.model[1] }"></gallery-value>
53
- <!-- 自定义组件插槽 -->
54
- <slot v-else-if="node.model[0]" :name="node.model[0]" :data="data" :node="node" :bind.sync="bind"></slot>
55
- <!-- 自定义字段插槽 -->
56
- <slot v-else :name="`${node.field}-value`" :data="data" :node="node" :bind.sync="bind">
57
- <div class="nt-ss"><div v-html="value" style="padding-top: 2px"></div></div>
58
- </slot>
59
- <p v-show="error.verify === 'no'" class="form-loader-verify" :data-verify-type="error.co">{{ error.tips }}</p>
60
- </template>
61
- </div>
62
- </template>
63
- <script>
64
- import { isFunction, findEnumName } from '@fekit/utils';
65
- import GalleryValue from '@/common/galleryValue';
66
-
67
- export default {
68
- components: { GalleryValue },
69
- props: {
70
- mode: {
71
- type: String,
72
- default: 'edit',
73
- },
74
- node: {
75
- type: Object,
76
- default: () => ({}),
77
- },
78
- data: {
79
- type: Object,
80
- default: () => ({}),
81
- },
82
- interacted: {
83
- type: Boolean,
84
- default: false,
85
- },
86
- },
87
- data() {
88
- return {
89
- _interacted: false,
90
- bind: {
91
- value: null,
92
- },
93
- error: {},
94
- };
95
- },
96
- created() {},
97
- computed: {
98
- value: {
99
- get() {
100
- let _value = this.node?.value || null;
101
- if (_value) {
102
- if (isFunction(_value)) {
103
- _value = _value(this.data, this.data[this.node.field], this.node);
104
- }
105
- } else {
106
- if (this.node.field) {
107
- _value = this.data[this.node.field];
108
- }
109
- }
110
- if (_value && this.node.enums) {
111
- _value = findEnumName(this.node.enums, _value);
112
- }
113
- return _value;
114
- },
115
- set(value) {
116
- const _value = this.node.value;
117
- if (_value) {
118
- if (isFunction(_value)) {
119
- this.$set(this.data, this.node.field, _value(this.data, value, this.node));
120
- } else {
121
- this.$set(this.data, this.node.field, value);
122
- }
123
- } else {
124
- this.$set(this.data, this.node.field, value);
125
- }
126
- this.validate();
127
- },
128
- },
129
- },
130
- methods: {
131
- async validate() {
132
- if (this._interacted) {
133
- // 提示文案
134
- let tips = '';
135
- // 错误类型
136
- let type = '';
137
- // 验证结果
138
- let verify = '';
139
- const value = this.data[this.node.field];
140
- if (`${value}`) {
141
- // 有值
142
- let _err = false;
143
- // 遍历校验规则
144
- for (const rule of this.node.rules) {
145
- if (rule && rule.validator) {
146
- const yes = !(await rule.validator(value));
147
- if (yes) {
148
- tips = rule.message;
149
- type = rule.type;
150
- _err = true;
151
- break;
152
- }
153
- }
154
- }
155
- verify = _err ? 'no' : 'ok';
156
- // console.log(91);
157
- } else {
158
- // console.log(92);
159
- // 无值
160
- let _err = false;
161
- // 遍历校验规则
162
- for (const rule of this.node.rules) {
163
- if (rule) {
164
- tips = rule.message;
165
- type = rule.type;
166
- if (rule.required) {
167
- _err = true;
168
- break;
169
- }
170
- }
171
- }
172
- verify = _err ? 'no' : '';
173
- }
174
- if (verify !== 'no' && this.tips) {
175
- tips = this.tips;
176
- }
177
- // 是否显示提示
178
- const ontips = (verify === 'no' && tips) || this.tips ? 'show' : '';
179
- // 状态颜色
180
- const co = verify === 'no' ? 'co:' + type : this.co ? 'co:' + this.co : '';
181
- this.error = { tips, ontips, verify, co };
182
- } else {
183
- this.error = { tips: this.tips, ontips: this.tips ? 'show' : '', verify: '', co: '' };
184
- }
185
- },
186
- setInteracted() {
187
- // 用户交互
188
- if (!this._interacted) {
189
- setTimeout(() => {
190
- this._interacted = true;
191
- this.validate();
192
- }, 50);
193
- }
194
- },
195
- },
196
- watch: {
197
- bind: {
198
- handler(bind) {
199
- let value = bind.value;
200
- const run = this.node.value;
201
- if (run) {
202
- if (isFunction(run)) {
203
- value = run(value);
204
- } else {
205
- value = run;
206
- }
207
- }
208
- this.$set(this.data, this.node.field, value);
209
- this.$set(this.bind, 'value', value);
210
- },
211
- deep: true,
212
- },
213
- interacted: {
214
- handler(val) {
215
- this._interacted = val;
216
- this.validate();
217
- },
218
- deep: true,
219
- },
220
- value: {
221
- handler() {
222
- this.validate();
223
- },
224
- deep: true,
225
- },
226
- },
227
- };
228
- </script>
229
- <style>
230
- .form-loader .flex-block {
231
- overflow: unset !important;
232
- }
233
-
234
- .form-loader-verify {
235
- position: absolute;
236
- bottom: 100%;
237
- left: 0;
238
- background: #f95850;
239
- color: #fff;
240
- padding: 0.2em 0.5em;
241
- font-size: 0.8em;
242
- border-radius: 0.3em;
243
- margin-bottom: 0.3em;
244
- opacity: 0.9;
245
- z-index: 1;
246
- }
247
- .form-loader-verify[data-verify-type~='co:warn'] {
248
- background: #fb9a2a;
249
- }
250
- .form-loader-verify::before {
251
- position: absolute;
252
- content: '';
253
- display: block;
254
- width: 0;
255
- height: 0;
256
- border: 3px solid transparent;
257
- border-top-color: #f95850;
258
- bottom: -6px;
259
- left: 0.7em;
260
- }
261
- .form-loader-verify[data-verify-type~='co:warn']::before {
262
- border-top-color: #fb9a2a;
263
- }
264
-
265
- .form-loader .el-radio__label,
266
- .form-loader .el-checkbox__label {
267
- font-size: 12px;
268
- padding-left: 4px;
269
- }
270
- .form-loader .el-textarea__inner {
271
- height: auto;
272
- }
273
-
274
- .form-loader .el-select,
275
- .form-loader .el-cascader {
276
- display: block;
277
- }
278
- .form-loader .el-radio-group {
279
- margin-top: 6px;
280
- }
281
- .form-loader .el-radio,
282
- .form-loader .el-checkbox {
283
- font-weight: normal;
284
- color: #0e255a;
285
- }
286
- .form-loader .el-switch,
287
- .form-loader .el-checkbox {
288
- margin-top: 4px;
289
- }
290
- .form-loader .el-radio__label {
291
- font-size: 12px;
292
- padding-left: 4px;
293
- }
294
- .form-loader .el-checkbox__label {
295
- font-size: 12px;
296
- padding-left: 4px;
297
- }
298
-
299
- .form-loader .el-date-editor .el-range-separator {
300
- line-height: 20px;
301
- }
302
- </style>