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"
@@ -51,9 +51,8 @@
51
51
  <free-field
52
52
  v-for="(f,fIndex) in r[rk].List"
53
53
  :key="fIndex"
54
- :Field="cellField(f)"
55
- v-bind="cellField(f)"
56
- :values="fieldData"
54
+ :Field="{...f, ReadOnly: Field.ReadOnly || f.ReadOnly}"
55
+ :values="fieldData.value"
57
56
  @input="cellChanged(f)"
58
57
  :ref="`input_field_validator_${index}`"
59
58
  ></free-field>
@@ -63,10 +62,9 @@
63
62
  class="full-width full-height"
64
63
  >
65
64
  <free-field
66
- :Field="cellField(r[rk].List[0])"
67
- :values="fieldData"
65
+ :Field="{...r[rk].List[0], ReadOnly: Field.ReadOnly || r[rk].List[0].ReadOnly}"
66
+ :values="fieldData.value"
68
67
  @input="cellChanged(r[rk].List[0])"
69
- v-bind="cellField(r[rk].List[0])"
70
68
  borderless
71
69
  :ref="`input_field_validator_extra_${index}`"
72
70
  ></free-field>
@@ -91,12 +89,11 @@
91
89
  </template>
92
90
 
93
91
  <script>
94
- import { defineComponent } from 'vue';
95
- import mixins from 'free-fe-mixins';
92
+ import { computed, defineComponent } from 'vue';
93
+ import { useFreeField, freeFieldProps } from '../composible/useFreeField';
96
94
 
97
95
  export default defineComponent({
98
96
  name: 'InputFieldMixedTable',
99
- mixins: [mixins.InputFieldMixin],
100
97
  emits:['input'],
101
98
  fieldInfo: {
102
99
  Category: 'Table',
@@ -271,34 +268,31 @@ export default defineComponent({
271
268
  }
272
269
  },
273
270
  },
274
- computed: {
275
- rowCells() {
276
- return (r) => {
277
- if (!r) return [];
278
- return Object.keys(r).filter(
279
- (rkk) => {
280
- if (!rkk) return false;
281
-
282
- // eslint-disable-next-line no-restricted-globals
283
- return !isNaN(Number(rkk)) && Number(rkk) < r.rowSize;
284
- },
285
- );
286
- };
287
- },
288
- cellField() {
289
- return (f) => {
290
- if (!f) return {};
291
- f.ReadOnly = this.Field.ReadOnly || f.ReadOnly;
271
+ props: {
272
+ ...freeFieldProps,
273
+ },
274
+ setup(props, { emit }) {
275
+ if (!props.Field) return () => null;
292
276
 
293
- return f;
294
- };
295
- },
296
- columns() {
297
- if (!this.Field.Options || !this.Field.Options.Rows) return [];
277
+ const { fieldData, setFieldData } = useFreeField(props);
278
+
279
+ const rowCells = (r) => {
280
+ if (!r) return [];
281
+ return Object.keys(r).filter(
282
+ (rkk) => {
283
+ if (!rkk) return false;
284
+
285
+ return !isNaN(Number(rkk)) && Number(rkk) < r.rowSize;
286
+ },
287
+ );
288
+ };
289
+
290
+ const columns = computed(() => {
291
+ if (!props.Field.Options?.Rows) return [];
298
292
 
299
293
  let cols = 0;
300
- for (let i = 0; i < this.Field.Options.Rows.length; i += 1) {
301
- const r = this.Field.Options.Rows[i];
294
+ for (let i = 0; i < props.Field.Options.Rows.length; i += 1) {
295
+ const r = props.Field.Options.Rows[i];
302
296
 
303
297
  for (let j = 0; j < Object.keys(r).length; j += 1) {
304
298
  const rk = Number(Object.keys(r)[j]);
@@ -317,51 +311,49 @@ export default defineComponent({
317
311
  }
318
312
 
319
313
  return ret;
320
- },
321
- summaryContent() {
314
+ })
315
+
316
+ const summaryContent = computed(() => {
322
317
  if (
323
- !this.fieldData
324
- || !this.Field
325
- || !this.Field.Options
326
- || !this.Field.Options.Summary
327
- || !this.Field.Options.Summary.Pattern
318
+ !fieldData.value
319
+ || !props.Field.Options?.Summary?.Pattern
328
320
  ) {
329
321
  return '';
330
322
  }
331
- let summaryText = this.Field.Options.Summary.Pattern;
323
+ let summaryText = props.Field.Options.Summary.Pattern;
332
324
 
333
- for (let i = 0; i < this.Field.Options.Summary.Fields.length; i += 1) {
334
- const sf = this.Field.Options.Summary.Fields[i];
325
+ for (let i = 0; i < props.Field.Options.Summary.Fields.length; i += 1) {
326
+ const sf = props.Field.Options.Summary.Fields[i];
335
327
  const fList = (sf || '').Field.split(',');
336
328
  let vi = 0;
337
329
  for (let j = 0; j < fList.length; j += 1) {
338
330
  const ff = fList[j];
339
331
 
340
- vi += Number(Object.nestValue(this.fieldData, ff.trim())) || 0;
332
+ vi += Number(Object.nestValue(fieldData.value, ff.trim())) || 0;
341
333
  }
342
334
 
343
335
  // round vi
344
336
  vi = vi.toFixed(
345
- (this.Field
346
- && this.Field.Options
347
- && this.Field.Options.Summary
348
- && this.Field.Options.Summary.Digits)
349
- || 2,
337
+ props.Field.Options?.Summary?.Digits || 2,
350
338
  );
351
339
 
352
340
  summaryText = summaryText.replace(`$\{${i + 1}}`, vi);
353
341
  }
354
342
  return summaryText;
355
- },
356
- },
357
- created() {
358
- this.fieldData = this.fieldData || {};
359
- },
360
- methods: {
361
- cellChanged(f) {
362
- this.$emit('input', f);
363
- this.$emit('input');
364
- },
343
+ });
344
+
345
+ return {
346
+ fieldData,
347
+ setFieldData,
348
+
349
+ rowCells,
350
+ columns,
351
+ summaryContent,
352
+
353
+ cellChanged: (f) => {
354
+ emit('input', f);
355
+ },
356
+ }
365
357
  },
366
358
  });
367
359
  </script>
@@ -0,0 +1,167 @@
1
+ import { defineComponent, h, watch } from 'vue';
2
+ import { useFreeField, freeFieldProps, useFreeFieldMethods } from '../composible/useFreeField';
3
+ import { QInput } from 'quasar';
4
+ import ReadonlyContent from '../composible/readonlyContent';
5
+ import freeFieldLabel from '../composible/freeFieldLabel';
6
+
7
+ export default defineComponent({
8
+ name: 'InputFieldNumber',
9
+ fieldInfo: {
10
+ Category: 'Simple',
11
+ Label: '数字',
12
+ Value: 'Number',
13
+ Extra: [
14
+ {
15
+ Type: 'String',
16
+ Label: '前缀',
17
+ Name: 'Options.Prefix',
18
+ },
19
+ {
20
+ Type: 'String',
21
+ Label: '后缀',
22
+ Name: 'Options.Postfix',
23
+ },
24
+ {
25
+ Type: 'Number',
26
+ Label: '最小值',
27
+ Name: 'MinValue',
28
+ },
29
+ {
30
+ Type: 'Number',
31
+ Label: '最大值',
32
+ Name: 'MaxValue',
33
+ },
34
+ {
35
+ Type: 'Number',
36
+ Label: '最大长度',
37
+ Name: 'Options.MaxLength',
38
+ },
39
+ {
40
+ Type: 'DynamicList',
41
+ Label: '附加字段',
42
+ Name: 'Options.Extra',
43
+ Options: {
44
+ Columns: [
45
+ {
46
+ Label: '值范围',
47
+ Name: 'Value',
48
+ Type: 'Labels',
49
+ Options: {
50
+ Batch: true,
51
+ },
52
+ },
53
+ {
54
+ Label: '不在其中时',
55
+ Type: 'Boolean',
56
+ Name: 'WhenNotIn',
57
+ Default: false,
58
+ },
59
+ {
60
+ Label: '字段',
61
+ Name: 'List',
62
+ Type: 'FieldList',
63
+ Options: {
64
+ Columns: [
65
+ {
66
+ Label: '#',
67
+ Name: 'Index',
68
+ sortable: true,
69
+ },
70
+ {
71
+ Label: '名称',
72
+ Name: 'Name',
73
+ style: 'max-width: 200px;',
74
+ sortable: true,
75
+ },
76
+ {
77
+ Label: '标题',
78
+ Name: 'Label',
79
+ style: 'max-width: 200px;',
80
+ sortable: true,
81
+ },
82
+ ],
83
+ },
84
+ },
85
+ ],
86
+ },
87
+ },
88
+ ],
89
+ Description: '',
90
+ },
91
+ props: {
92
+ ...freeFieldProps,
93
+ },
94
+ emits: ['input'],
95
+ methods: {
96
+ ...useFreeFieldMethods,
97
+ },
98
+ setup(props, { emit, slots }){
99
+ if (!props.Field) return {};
100
+
101
+ const { fieldData, setFieldData } = useFreeField(props);
102
+
103
+ // keep between the min and max value
104
+ watch(fieldData, (d) => {
105
+ if (!d) return;
106
+
107
+ if (!Number(d) && Number(d) !== 0) return;
108
+
109
+ let v = d;
110
+ if (props.Field.MinValue !== void 0 && Number(props.Field.MinValue) > v) {
111
+ v = Number(props.Field.MinValue);
112
+ }
113
+ if (props.Field.MaxValue !== void 0 && Number(props.Field.MaxValue) < v) {
114
+ v = Number(props.Field.MaxValue);
115
+ }
116
+
117
+ setFieldData(v);
118
+ })
119
+
120
+ const readonlyNode = () => h(ReadonlyContent, {
121
+ Field: props.Field,
122
+ Content: fieldData.value,
123
+ });
124
+
125
+ const before = () => h(freeFieldLabel, {
126
+ Field: props.Field,
127
+ });
128
+
129
+ const prepend = slots.prepend ? slots.prepend() : (props.Field.Options?.Prefix && h('span',{
130
+ class: 'prefix',
131
+ }, props.Field.Options?.Prefix));
132
+
133
+ const append = slots.append ? slots.append() : (props.Field.Options?.Postfix && h('span',{
134
+ class: 'postfix',
135
+ }, props.Field.Options?.Postfix));
136
+
137
+ const inputNode = () => h(QInput, {
138
+ type: 'number',
139
+ maxlength: props.Field.Options?.MaxLength,
140
+ autocomplete: 'off',
141
+ // bottomSlots: true,
142
+ hideBottomSpace: true,
143
+ readonly: props.Field?.ReadOnly,
144
+
145
+ class: 'full-width',
146
+ style: props.Field.Info?.Style,
147
+
148
+ rules: props.Field.Rules,
149
+
150
+ modelValue: fieldData.value,
151
+ 'onUpdate:modelValue': (v) => {
152
+ setFieldData(v, emit);
153
+ },
154
+ }, {
155
+ before,
156
+ prepend,
157
+ append,
158
+ });
159
+
160
+ return () => h('div', {
161
+ class: 'simple-field input-field-number row items-center no-wrap',
162
+ }, [
163
+ props.Field.ReadOnly ? readonlyNode() : inputNode(),
164
+ slots.warning && slots.warning(),
165
+ ]);
166
+ },
167
+ });
@@ -0,0 +1,81 @@
1
+ import { defineComponent, h, ref } from 'vue';
2
+ import { useFreeField, freeFieldProps, useFreeFieldMethods } from '../composible/useFreeField';
3
+ import { QInput, QIcon } from 'quasar';
4
+ import freeFieldLabel from '../composible/freeFieldLabel';
5
+
6
+ export default defineComponent({
7
+ name: 'InputFieldPassword',
8
+ fieldInfo: {
9
+ Category: 'Simple',
10
+ Label: '密码',
11
+ Value: 'Password',
12
+ Description: '',
13
+ Extra: [
14
+ {
15
+ Type: 'Boolean',
16
+ Label: '自动填入',
17
+ Name: 'Options.autocomplete',
18
+ Default: 'false',
19
+ },
20
+ {
21
+ Type: 'Number',
22
+ Label: '最大长度',
23
+ Name: 'Options.MaxLength',
24
+ },
25
+ ],
26
+ },
27
+ props: {
28
+ ...freeFieldProps,
29
+ },
30
+ emits: ['input'],
31
+ methods: {
32
+ ...useFreeFieldMethods,
33
+ },
34
+ setup(props, { emit, slots }){
35
+ if (!props.Field) return {};
36
+
37
+ const { fieldData, setFieldData } = useFreeField(props);
38
+ const isPwd = ref(true);
39
+
40
+ const before = () => h(freeFieldLabel, {
41
+ Field: props.Field,
42
+ });
43
+
44
+ const append = () => h(QIcon,{
45
+ class: 'cursor-pointer',
46
+ name: isPwd.value ? 'visibility_off' : 'visibility',
47
+ onClick: () => {
48
+ isPwd.value = !isPwd.value;
49
+ },
50
+ });
51
+
52
+ const inputNode = () => h(QInput, {
53
+ type: isPwd.value ? 'password' : 'text',
54
+ maxlength: props.Field.Options?.MaxLength,
55
+ autocomplete: props.Field.Options?.autocomplete ? '' : 'new-password',
56
+ // bottomSlots: true,
57
+ hideBottomSpace: true,
58
+ readonly: props.Field?.ReadOnly,
59
+
60
+ class: 'full-width',
61
+ style: props.Field.Info?.Style,
62
+
63
+ rules: props.Field.Rules,
64
+
65
+ modelValue: fieldData.value,
66
+ 'onUpdate:modelValue': (v) => {
67
+ setFieldData(v, emit);
68
+ },
69
+ }, {
70
+ before,
71
+ append,
72
+ });
73
+
74
+ return () => h('div', {
75
+ class: 'simple-field input-field-password row items-center no-wrap',
76
+ }, [
77
+ inputNode(),
78
+ slots.warning && slots.warning(),
79
+ ]);
80
+ },
81
+ });
@@ -3,10 +3,10 @@
3
3
  <slot name="warning"></slot>
4
4
  <div class="buttons relative-position" v-if="Field && Field.ShowButtons">
5
5
  <span class="q-ml-lg select-all-btn">
6
- <q-btn round icon="check" @click="fieldData = Object.assign({},serviceList)"></q-btn>
6
+ <q-btn round icon="check" @click="setFieldData(Object.assign({},serviceList))"></q-btn>
7
7
  </span>
8
8
  <span class="q-ml-md clear-btn">
9
- <q-btn round icon="clear" @click="fieldData = {}"></q-btn>
9
+ <q-btn round icon="clear" @click="setFieldData({})"></q-btn>
10
10
  </span>
11
11
  </div>
12
12
  <div class="roles relative-position row items-center">
@@ -17,12 +17,12 @@
17
17
  :key="idx"
18
18
  :val="r.Name"
19
19
  :label="r.Name || idx"
20
- @input="fieldData = r.Permission || {};$emit('input')"/>
20
+ @input="setFieldData(r.Permission || {})"/>
21
21
  </div>
22
22
  <permission-editor
23
23
  v-if="Field && !Field.HideEditor"
24
24
  class="permission-editor"
25
- :Permission="fieldData"
25
+ :Permission="fieldData.value"
26
26
  :Service="serviceList"
27
27
  :readonly="Field.ReadOnly"
28
28
  @changed="permissionChanged"
@@ -33,12 +33,14 @@
33
33
 
34
34
  <script>
35
35
  import { defineComponent } from 'vue';
36
- import mixins from 'free-fe-mixins';
36
+ import { useFreeField, freeFieldProps } from '../composible/useFreeField';
37
37
  import PermissionEditor from './PermissionEditor';
38
38
 
39
39
  export default defineComponent({
40
40
  name: 'InputFieldPermission',
41
- mixins: [mixins.InputFieldMixin],
41
+ props: {
42
+ ...freeFieldProps,
43
+ },
42
44
  emits:['input'],
43
45
  fieldInfo: {
44
46
  Category: 'Advanced',
@@ -53,6 +55,14 @@ export default defineComponent({
53
55
  currentRole: null
54
56
  };
55
57
  },
58
+ setup(props) {
59
+ const { fieldData, setFieldData } = useFreeField(props);
60
+
61
+ return {
62
+ fieldData,
63
+ setFieldData,
64
+ }
65
+ },
56
66
  created() {
57
67
  // get all service list
58
68
  if (this.Field.Type === 'Permission' && !!this.Field.ServiceList) {
@@ -65,13 +75,7 @@ export default defineComponent({
65
75
  },
66
76
  methods: {
67
77
  permissionChanged(v) {
68
- if (!v && this.data) {
69
- this.data[this.Field.Name] = {};
70
- } else if (v) {
71
- this.data[this.Field.Name] = v;
72
- }
73
-
74
- this.$emit('input');
78
+ this.setFieldData(v);
75
79
  },
76
80
  },
77
81
  });