free-fe-core-modules 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 (104) hide show
  1. package/components/Basic/EIcon.vue +2 -4
  2. package/components/Basic/LeveledMenus.vue +0 -5
  3. package/components/Basic/SummaryHead.vue +10 -1
  4. package/components/Dialog/BasicDialog.vue +1 -1
  5. package/components/SlidingCarousel/index.vue +0 -1
  6. package/components/SlidingNews/index.vue +0 -1
  7. package/components/ThemeSwitch/index.vue +7 -5
  8. package/composible/useObjectData.js +69 -0
  9. package/free-field/Fields/AgreementCheck.js +170 -0
  10. package/free-field/Fields/ApiCall.js +123 -0
  11. package/{field-components/Fields/Boolean.vue → free-field/Fields/Boolean.js} +40 -46
  12. package/free-field/Fields/Category.js +28 -0
  13. package/free-field/Fields/Check.js +106 -0
  14. package/free-field/Fields/Customize.js +87 -0
  15. package/free-field/Fields/Date.js +133 -0
  16. package/free-field/Fields/DateRange.js +226 -0
  17. package/free-field/Fields/DynamicList.js +565 -0
  18. package/{field-components → free-field}/Fields/File.vue +1 -1
  19. package/{field-components → free-field}/Fields/FileList.vue +1 -1
  20. package/{field-components → free-field}/Fields/FileListCombined.vue +1 -1
  21. package/{field-components → free-field}/Fields/FixedList.vue +78 -83
  22. package/{field-components → free-field}/Fields/ImageList.vue +1 -1
  23. package/{field-components → free-field}/Fields/ImageListCombined.vue +1 -1
  24. package/free-field/Fields/InputFieldList.vue +324 -0
  25. package/{field-components → free-field}/Fields/Labels.vue +24 -15
  26. package/{field-components → free-field}/Fields/MixedTable.vue +53 -61
  27. package/free-field/Fields/Number.js +167 -0
  28. package/free-field/Fields/Password.js +81 -0
  29. package/{field-components → free-field}/Fields/Permission.vue +17 -13
  30. package/{field-components → free-field}/Fields/PermissionEditor.vue +63 -105
  31. package/{field-components → free-field}/Fields/QueryFilters.vue +65 -48
  32. package/{field-components → free-field}/Fields/RadioList.vue +36 -12
  33. package/{field-components → free-field}/Fields/Rich.vue +104 -114
  34. package/{field-components → free-field}/Fields/Search.vue +35 -26
  35. package/{field-components → free-field}/Fields/Select.vue +116 -87
  36. package/{field-components → free-field}/Fields/SelectionChain.vue +89 -67
  37. package/{field-components/Fields/Separator.vue → free-field/Fields/Separator.js} +11 -16
  38. package/{field-components → free-field}/Fields/SingleList.vue +27 -21
  39. package/free-field/Fields/Static.js +27 -0
  40. package/free-field/Fields/String.js +105 -0
  41. package/free-field/Fields/Text.js +80 -0
  42. package/{field-components → free-field}/Fields/Time.vue +59 -43
  43. package/{field-components → free-field}/Fields/TimeRange.vue +107 -92
  44. package/{field-components → free-field}/Fields/UltimateFile.vue +1 -1
  45. package/free-field/Fields/Year.js +137 -0
  46. package/{field-components → free-field}/Fields/YearRange.vue +63 -73
  47. package/{field-components → free-field}/Fields/index.js +16 -18
  48. package/free-field/composible/fieldWrapper.js +221 -0
  49. package/free-field/composible/freeFieldLabel.js +22 -0
  50. package/free-field/composible/readonlyContent.js +36 -0
  51. package/free-field/composible/useFileSizeUtils.js +52 -0
  52. package/free-field/composible/useFreeField.js +143 -0
  53. package/{field-components → free-field}/index.js +3 -3
  54. package/i18n/en-us/index.js +1 -1
  55. package/i18n/zh-cn/index.js +1 -1
  56. package/index.js +1 -4
  57. package/package.json +1 -1
  58. package/router/error/data.js +4 -1
  59. package/view/dict/index.vue +13 -2
  60. package/view/error/list.vue +22 -14
  61. package/view/menu/index.vue +19 -4
  62. package/view/system/index.vue +15 -2
  63. package/field-components/Fields/AgreementCheck.vue +0 -161
  64. package/field-components/Fields/ApiCall.vue +0 -139
  65. package/field-components/Fields/Category.vue +0 -33
  66. package/field-components/Fields/Check.vue +0 -131
  67. package/field-components/Fields/Customize.vue +0 -103
  68. package/field-components/Fields/Date.vue +0 -142
  69. package/field-components/Fields/DateRange.vue +0 -199
  70. package/field-components/Fields/DynamicList.vue +0 -575
  71. package/field-components/Fields/FieldEditor.vue +0 -379
  72. package/field-components/Fields/InputFieldList.vue +0 -299
  73. package/field-components/Fields/Number.vue +0 -247
  74. package/field-components/Fields/Password.vue +0 -79
  75. package/field-components/Fields/Static.vue +0 -22
  76. package/field-components/Fields/String.vue +0 -185
  77. package/field-components/Fields/Text.vue +0 -89
  78. package/field-components/Fields/Year.vue +0 -124
  79. package/field-components/Fields/components/FieldTypeOptions.vue +0 -248
  80. package/field-components/components/FieldComponents.vue +0 -246
  81. package/free-fields/AutoHide.js +0 -66
  82. package/free-fields/CenterContent.js +0 -15
  83. package/free-fields/Draggable.js +0 -30
  84. package/free-fields/Droppable.js +0 -114
  85. package/free-fields/EditableString.js +0 -63
  86. package/free-fields/FieldCategory.js +0 -83
  87. package/free-fields/FieldTypeSelect.js +0 -94
  88. package/free-fields/fieldEditors/arrayEditor.js +0 -3
  89. package/free-fields/fieldEditors/boolEditor.js +0 -22
  90. package/free-fields/fieldEditors/dateEditor.js +0 -23
  91. package/free-fields/fieldEditors/datetimeEditor.js +0 -23
  92. package/free-fields/fieldEditors/index.js +0 -21
  93. package/free-fields/fieldEditors/jsonEditor.js +0 -371
  94. package/free-fields/fieldEditors/labeledField.js +0 -74
  95. package/free-fields/fieldEditors/numberEditor.js +0 -51
  96. package/free-fields/fieldEditors/objectEditor.js +0 -3
  97. package/free-fields/fieldEditors/selectEditor.js +0 -0
  98. package/free-fields/fieldEditors/stringEditor.js +0 -49
  99. package/free-fields/fieldEditors/textEditor.js +0 -50
  100. package/free-fields/fieldEditors/timeEditor.js +0 -23
  101. package/free-fields/index.js +0 -402
  102. /package/{field-components → free-field}/Fields/Image.vue +0 -0
  103. /package/{field-components/Display → free-field/Layout}/index.js +0 -0
  104. /package/{field-components → free-field}/style.sass +0 -0
@@ -3,7 +3,7 @@
3
3
  <span
4
4
  :class="`field-label ${(Field.Label && Field.Label.trim().length)
5
5
  ? '' : 'field-label-empty'} ${Field.Required ? 'required' : ''}`"
6
- v-if="typeof Field.Label !== 'undefined'"
6
+ v-if="Field.Label !== void 0"
7
7
  >
8
8
  <q-tooltip
9
9
  v-if="Field.Description"
@@ -55,55 +55,21 @@
55
55
  :disabled="Field.ReadOnly"
56
56
  toolbar
57
57
  value
58
- v-model="fieldData"
59
- @onChange="validate();$emit('input')"
58
+ v-model="fieldData.value"
59
+ @update:model-value="tinyChanged"
60
60
  />
61
61
  </span>
62
62
  </div>
63
63
  </template>
64
64
 
65
65
  <script>
66
- import { defineComponent } from 'vue';
67
- import mixins from 'free-fe-mixins';
66
+ import { defineComponent, watchEffect, ref } from 'vue';
68
67
  import tiny from '@tinymce/tinymce-vue';
69
-
70
- function fileSizeStrToNumber(s) {
71
- if (!s) return undefined;
72
-
73
- const sizeMatch = s.match(/^([0-9]*)(k|m|g*)(b*)/);
74
-
75
- if (sizeMatch) {
76
- // eslint-disable-next-line no-unused-vars
77
- // const [tmp, num, unit] = sizeMatch;
78
- const num = sizeMatch[1];
79
- const unit = sizeMatch[2];
80
- if (!num || !Number(num)) return '';
81
-
82
- let multi = 1;
83
- switch (unit) {
84
- case 'k':
85
- multi = 1024;
86
- break;
87
- case 'm':
88
- multi = 1024 * 1024;
89
- break;
90
- case 'g':
91
- multi = 1024 * 1024 * 1024;
92
- break;
93
- default:
94
- multi = 1024;
95
- break;
96
- }
97
-
98
- return Number(num) * multi;
99
- }
100
-
101
- return undefined;
102
- }
68
+ import { fileSizeStrToNumber } from '../composible/useFileSizeUtils';
69
+ import { useFreeField, freeFieldProps } from '../composible/useFreeField';
103
70
 
104
71
  export default defineComponent({
105
72
  name: 'InputFieldRich',
106
- mixins: [mixins.InputFieldMixin],
107
73
  fieldInfo: {
108
74
  Category: 'Advanced',
109
75
  Label: '所见即所得',
@@ -144,12 +110,24 @@ export default defineComponent({
144
110
  tiny,
145
111
  },
146
112
  props: {
113
+ ...freeFieldProps,
147
114
  enableField: { type: Boolean, default: false },
148
115
  },
149
- data() {
150
- return {
151
- isValid: true,
152
- plugins: [
116
+ setup(props, { expose, emit }) {
117
+ if (!props.Field) return {};
118
+
119
+ const { fieldData, setFieldData } = useFreeField(props);
120
+
121
+ const readonlyContent = ref(null);
122
+ const tiny = ref(null);
123
+
124
+ // TODO: 设置默认warning信息不生效
125
+ if (props.Field.Warning) {
126
+ Object.setValue(props.Field, 'Warning', `可嵌入图片、视频、超级链接。内容不可超过${(props.Field.Options?.MaxLength) || 1000}字,内容总大小不可超过${(props.Field.Options?.MaxSize) || '5m'}。较大图片或视频请使用超链接!`);
127
+ }
128
+
129
+ const isValid = ref(true);
130
+ const plugins = [
153
131
  'print',
154
132
  // 'preview',
155
133
  'paste',
@@ -186,9 +164,9 @@ export default defineComponent({
186
164
  // 'charmap',
187
165
  'quickbars',
188
166
  'emoticons',
189
- ],
190
- menubar: ['insert', 'format', 'table'],
191
- toolbar: [
167
+ ];
168
+ const menubar = ['insert', 'format', 'table'];
169
+ const toolbar = [
192
170
  'undo',
193
171
  'redo',
194
172
  '|',
@@ -221,8 +199,8 @@ export default defineComponent({
221
199
  '|',
222
200
  'code',
223
201
  'insertFieldButton',
224
- ],
225
- quickbars_selection_toolbar: [
202
+ ];
203
+ const quickbars_selection_toolbar = [
226
204
  'bold',
227
205
  'italic',
228
206
  '|',
@@ -234,49 +212,39 @@ export default defineComponent({
234
212
  'quicktable',
235
213
  '|',
236
214
  'insertFieldButton',
237
- ],
238
- contextmenu: ['link', 'image', 'table'],
239
- };
240
- },
241
- watch: {
242
- fieldData() {
243
- if (this.$refs.readonlyContent && this.Field.ReadOnly && this.fieldData) {
244
- this.$refs.readonlyContent.innerHTML = this.fieldData;
245
- }
246
- },
247
- },
248
- created() {
249
- if (this.$refs.readonlyContent && this.Field.ReadOnly) {
250
- this.$refs.readonlyContent.innerHTML = this.fieldData;
215
+ ];
216
+ const contextmenu = ['link', 'image', 'table'];
217
+
218
+ if (props.Field.ReadOnly) {
219
+ watchEffect(() => {
220
+ readonlyContent.value.innerHTML = fieldData.value;
221
+ });
251
222
  }
252
223
 
253
- this.Field.Warning = this.Field.Warning
254
- || `可嵌入图片、视频、超级链接。内容不可超过${(this.Field.Options && this.Field.Options.MaxLength) || 1000}字,内容总大小不可超过${(this.Field.Options && this.Field.Options.MaxSize) || '5m'}。较大图片或视频请使用超链接!`;
255
- },
256
- methods: {
257
- validate() {
258
- let isValid = true;
259
- if (this.$refs.tiny) {
260
- if (this.Field.Required) isValid = !!this.fieldData;
224
+ const validate = () => {
225
+ let isVal = true;
226
+ if (tiny.value) {
227
+ if (props.Field.Required) isVal = !!fieldData.value;
261
228
 
262
- const rules = Array.isArray(typeof this.Field.Rules)
263
- ? this.Field.Rules : [this.Field.Rules];
229
+ const rules = Array.isArray(typeof props.Field.Rules)
230
+ ? props.Field.Rules : [props.Field.Rules];
264
231
 
265
232
  for (let i = 0; i < rules.length; i += 1) {
266
233
  const r = rules[i];
267
234
 
268
235
  if (typeof r === 'function') {
269
- isValid = isValid && r(this.fieldData);
236
+ isVal = isVal && r(fieldData.value);
270
237
  }
271
238
  }
272
239
  }
273
240
 
274
- this.isValid = isValid;
241
+ isValid.value = isVal;
275
242
 
276
- return isValid;
277
- },
278
- tinySetup(editor) {
279
- if (this.enableField) {
243
+ return isVal;
244
+ };
245
+
246
+ const tinySetup = (editor) => {
247
+ if (props.enableField) {
280
248
  editor.ui.registry.addButton('insertFieldButton', {
281
249
  text: '数据字段',
282
250
  tooltip: '插入数据字段',
@@ -289,49 +257,71 @@ export default defineComponent({
289
257
  });
290
258
  }
291
259
 
292
- if (this.Field && this.Field.Options) {
293
- if (this.Field.Options.MaxLength) {
294
- editor.on('keydown', (e) => {
295
- const allowedKeys = [8, 37, 38, 39, 40, 46];
296
- if (allowedKeys.indexOf(e.keyCode) >= 0) return true;
297
-
298
- const selectedText = editor.selection.getContent({
299
- format: 'text',
300
- });
260
+ if (props.Field.Options?.MaxLength) {
261
+ editor.on('keydown', (e) => {
262
+ const allowedKeys = [8, 37, 38, 39, 40, 46];
263
+ if (allowedKeys.indexOf(e.keyCode) >= 0) return true;
301
264
 
302
- if (selectedText.length <= 0
303
- && editor.getContent({ format: 'text' }).length >= this.Field.Options.MaxLength) {
304
- e.preventDefault();
305
- e.stopPropagation();
306
- return false;
307
- }
308
-
309
- return true;
265
+ const selectedText = editor.selection.getContent({
266
+ format: 'text',
310
267
  });
311
- }
312
- if (this.Field.Options.MaxSize) {
313
- const maxSize = fileSizeStrToNumber(this.Field.Options.MaxSize);
314
268
 
315
- editor.on('keydown', (e) => {
316
- const allowedKeys = [8, 37, 38, 39, 40, 46];
317
- if (allowedKeys.indexOf(e.keyCode) >= 0) return true;
269
+ if (selectedText.length <= 0
270
+ && editor.getContent({ format: 'text' }).length >= props.Field.Options.MaxLength) {
271
+ e.preventDefault();
272
+ e.stopPropagation();
273
+ return false;
274
+ }
318
275
 
319
- const selectedText = editor.selection.getContent({
320
- format: 'text',
321
- });
276
+ return true;
277
+ });
278
+ }
279
+ if (props.Field.Options?.MaxSize) {
280
+ const maxSize = fileSizeStrToNumber(props.Field.Options.MaxSize);
322
281
 
323
- if (selectedText.length <= 0
324
- && editor.getContent({ format: 'html' }).length >= maxSize) {
325
- e.preventDefault();
326
- e.stopPropagation();
327
- return false;
328
- }
282
+ editor.on('keydown', (e) => {
283
+ const allowedKeys = [8, 37, 38, 39, 40, 46];
284
+ if (allowedKeys.indexOf(e.keyCode) >= 0) return true;
329
285
 
330
- return true;
286
+ const selectedText = editor.selection.getContent({
287
+ format: 'text',
331
288
  });
332
- }
289
+
290
+ if (selectedText.length <= 0
291
+ && editor.getContent({ format: 'html' }).length >= maxSize) {
292
+ e.preventDefault();
293
+ e.stopPropagation();
294
+ return false;
295
+ }
296
+
297
+ return true;
298
+ });
333
299
  }
334
- },
300
+ };
301
+
302
+ const tinyChanged = (v) => {
303
+ validate();
304
+ setFieldData(v, emit);
305
+ };
306
+
307
+ expose({
308
+ validate,
309
+ })
310
+
311
+ return {
312
+ isValid,
313
+ fieldData,
314
+ readonlyContent,
315
+ tiny,
316
+ tinySetup,
317
+ tinyChanged,
318
+
319
+ plugins,
320
+ menubar,
321
+ toolbar,
322
+ quickbars_selection_toolbar,
323
+ contextmenu,
324
+ };
335
325
  },
336
326
  });
337
327
  </script>
@@ -32,7 +32,8 @@
32
32
  row-key="id"
33
33
  :pagination="searchPagination"
34
34
  :selection="Field.Multiple ? 'multiple' : 'single'"
35
- v-model:selected="searchSelected"
35
+ :selected="searchSelected"
36
+ @update:selected="searchSelected = $event"
36
37
  >
37
38
  <template v-slot:header="props">
38
39
  <q-tr :props="props">
@@ -108,7 +109,7 @@
108
109
  :class="`field-label field-label-readonly ${
109
110
  (Field.Label && Field.Label.trim().length)
110
111
  ? '' : 'field-label-empty'} ${Field.Required ? 'required' : ''}`"
111
- v-if="typeof Field.Label !== 'undefined'"
112
+ v-if="Field.Label !== void 0"
112
113
  >
113
114
  <q-tooltip v-if="Field.Description" anchor="top right">{{Field.Description}}</q-tooltip>
114
115
  {{Field.Label || ''}}
@@ -120,11 +121,10 @@
120
121
  </span>
121
122
  <q-input
122
123
  v-else
123
- v-model="searchDisplay"
124
+ modelValue=""
124
125
  :type="`${Field && Field.Multiple ? 'textarea' : ''}`"
125
126
  hide-bottom-space
126
127
  readonly
127
- v-bind="$attrs"
128
128
  :class="`${Field && Field.Multiple
129
129
  ? '' : 'simple-field'} ${searchDisplay ? 'has-data' : 'empty'}`"
130
130
  :ref="`input_field_validator_${Field.Name || Field.Label}`"
@@ -150,7 +150,7 @@
150
150
  <span
151
151
  :class="`field-label ${(Field.Label && Field.Label.trim().length)
152
152
  ? '' : 'field-label-empty'} ${Field.Required ? 'required' : ''}`"
153
- v-if="typeof Field.Label !== 'undefined'"
153
+ v-if="Field.Label !== void 0"
154
154
  >
155
155
  <q-tooltip v-if="Field.Description" anchor="top right">{{Field.Description}}</q-tooltip>
156
156
  {{Field.Label || ''}}
@@ -174,12 +174,14 @@
174
174
 
175
175
  <script>
176
176
  import { defineComponent } from 'vue';
177
- import mixins from 'free-fe-mixins';
177
+ import { useFreeField, freeFieldProps } from '../composible/useFreeField';
178
178
 
179
179
  export default defineComponent({
180
180
  name: 'InputFieldSearch',
181
- mixins: [mixins.InputFieldMixin],
182
181
  emits:['input'],
182
+ props: {
183
+ ...freeFieldProps,
184
+ },
183
185
  fieldInfo: {
184
186
  Category: 'Advanced',
185
187
  Label: '搜索',
@@ -284,6 +286,16 @@ export default defineComponent({
284
286
  ],
285
287
  Description: '',
286
288
  },
289
+ setup(props) {
290
+ if (!props.Field) return {};
291
+
292
+ const { fieldData, setFieldData } = useFreeField(props);
293
+
294
+ return {
295
+ fieldData,
296
+ setFieldData,
297
+ };
298
+ },
287
299
  data() {
288
300
  return {
289
301
  searchKey: '',
@@ -302,16 +314,12 @@ export default defineComponent({
302
314
  },
303
315
  computed: {
304
316
  searchColumns() {
305
- if (
306
- !this.Field
307
- || !this.Field.Options
308
- || !this.Field.Options.SearchColumns
309
- ) {
317
+ if (!this.Field?.Options?.SearchColumns) {
310
318
  return [];
311
319
  }
312
320
 
313
321
  const cls = [];
314
- this.Field.Options.SearchColumns.forEach((c) => {
322
+ (this.Field?.Options?.SearchColumns || []).forEach((c) => {
315
323
  const newC = { ...c };
316
324
  newC.name = c.Name;
317
325
  newC.label = c.Label;
@@ -336,14 +344,14 @@ export default defineComponent({
336
344
  },
337
345
  },
338
346
  watch: {
339
- data(n, o) {
347
+ fieldData(n, o) {
340
348
  // init search data from exist id
341
- if (typeof this.fieldData === 'undefined') {
349
+ if (typeof this.fieldData.value === 'undefined') {
342
350
  this.searchSelected = [];
343
351
  this.searchData = {};
344
352
  this.searchDisplay = '';
345
353
  this.searchKey = '';
346
- } else if (this.Field.Type === 'Search' && this.data) {
354
+ } else if (this.Field.Type === 'Search' && this.fieldData.value) {
347
355
  if (n && o) {
348
356
  const nV = Object.nestValue(n, this.Field.Name);
349
357
  const oV = Object.nestValue(o, this.Field.Name);
@@ -354,8 +362,8 @@ export default defineComponent({
354
362
  if (this.Field.Options && this.Field.Options.SearchUrl) {
355
363
  const paramObj = {};
356
364
  paramObj[this.Field.Options.SearchField || 'id'] = this.Field.Multiple
357
- ? JSON.stringify(Object.nestValue(this.data, this.Field.Name))
358
- : Object.nestValue(this.data, this.Field.Name);
365
+ ? JSON.stringify(this.fieldData.value)
366
+ : this.fieldData.value;
359
367
 
360
368
  this.getRequest(
361
369
  `${this.Field.Options.SearchUrl}`,
@@ -404,9 +412,8 @@ export default defineComponent({
404
412
  methods: {
405
413
  search(p) {
406
414
  if (
407
- !this.Field.Options
408
- || !this.Field.Options.SearchUrl
409
- || (!this.searchKey && !this.Field.Options.AllowEmptySearch)
415
+ !this.Field?.Options?.SearchUrl
416
+ || (!this.searchKey && !this.Field?.Options?.AllowEmptySearch)
410
417
  ) {
411
418
  return;
412
419
  }
@@ -419,7 +426,7 @@ export default defineComponent({
419
426
  if (d && d.msg === 'OK') {
420
427
  const { data } = d;
421
428
  if (data) {
422
- for (let i = 0; i < data.docs.length; i += 1) {
429
+ for (let i = 0; i < data.docs?.length; i += 1) {
423
430
  const dc = data.docs[i];
424
431
 
425
432
  dc.index = (data.page - 1) * data.limit + i + 1;
@@ -439,11 +446,13 @@ export default defineComponent({
439
446
  ? this.searchSelected : [this.searchSelected[0]];
440
447
 
441
448
  const sFieldName = this.Field.SearchField || 'id';
442
- this.fieldData = selected.map(
449
+
450
+ this.setFieldData(selected.map(
443
451
  (ss) => Object.nestValue(ss, sFieldName),
444
- ).filter((ss) => !!ss);
452
+ ).filter((ss) => !!ss));
453
+
445
454
  if (!this.Field || !this.Field.Multiple) {
446
- [this.fieldData] = this.fieldData;
455
+ this.setFieldData(this.fieldData.value[0]);
447
456
  }
448
457
 
449
458
  const sdFieldName = this.Field.Options.SearchDisplayField || 'id';
@@ -459,7 +468,7 @@ export default defineComponent({
459
468
 
460
469
  if (!this.Field || !this.Field.Multiple) {
461
470
  this.searchSelected = [];
462
- this.fieldData = undefined;
471
+ this.setFieldData(undefined);
463
472
 
464
473
  this.$emit('input');
465
474