free-fe-core-modules 0.0.3 → 0.0.5

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 (35) hide show
  1. package/components/Basic/SummaryHead.vue +13 -2
  2. package/components/Dialog/BasicDialog.vue +11 -3
  3. package/components/SlidingCarousel/index.vue +13 -2
  4. package/components/SlidingNews/index.vue +13 -2
  5. package/composible/useFormValidator.js +56 -0
  6. package/free-field/Fields/AgreementCheck.js +6 -2
  7. package/free-field/Fields/Date.js +13 -5
  8. package/free-field/Fields/DateRange.js +14 -8
  9. package/free-field/Fields/DynamicList.js +33 -33
  10. package/free-field/Fields/FixedList.vue +9 -5
  11. package/free-field/Fields/Labels.vue +7 -1
  12. package/free-field/Fields/MixedTable.vue +9 -3
  13. package/free-field/Fields/Number.js +12 -6
  14. package/free-field/Fields/Password.js +12 -6
  15. package/free-field/Fields/PermissionEditor.vue +0 -1
  16. package/free-field/Fields/Search.vue +8 -2
  17. package/free-field/Fields/Select.vue +4 -1
  18. package/free-field/Fields/SelectionChain.vue +8 -2
  19. package/free-field/Fields/String.js +11 -5
  20. package/free-field/Fields/Text.js +12 -6
  21. package/free-field/Fields/Time.vue +8 -2
  22. package/free-field/Fields/TimeRange.vue +9 -3
  23. package/free-field/Fields/Year.js +12 -6
  24. package/free-field/Fields/YearRange.vue +9 -6
  25. package/free-field/Fields/index.js +12 -12
  26. package/free-field/composible/fieldWrapper.js +59 -51
  27. package/package.json +2 -2
  28. package/view/menu/index.vue +15 -11
  29. package/free-field/Fields/File.vue +0 -382
  30. package/free-field/Fields/FileList.vue +0 -405
  31. package/free-field/Fields/FileListCombined.vue +0 -142
  32. package/free-field/Fields/Image.vue +0 -328
  33. package/free-field/Fields/ImageList.vue +0 -285
  34. package/free-field/Fields/ImageListCombined.vue +0 -76
  35. package/free-field/Fields/UltimateFile.vue +0 -100
@@ -76,15 +76,26 @@
76
76
 
77
77
  <script>
78
78
  import { defineComponent } from 'vue';
79
- import mixins from 'free-fe-mixins';
79
+ import { useObjectData, objectDataProps } from '../../composible/useObjectData';
80
80
 
81
81
  export default defineComponent({
82
82
  name: 'SummaryHead',
83
- mixins: [mixins.ArrayDataMixin],
84
83
  props: {
84
+ ...objectDataProps,
85
85
  has_multiple_head: { type: Boolean, default: false },
86
86
  values: {type: Object, default: () => ({})},
87
87
  },
88
+ setup(props, ctx) {
89
+ const {
90
+ data,
91
+ refreshData,
92
+ } = useObjectData(props, ctx);
93
+
94
+ return {
95
+ data,
96
+ refreshData,
97
+ };
98
+ },
88
99
  created() {
89
100
  if (this.values) {
90
101
  this.data = this.values;
@@ -65,7 +65,7 @@
65
65
  :key="index"
66
66
  :Field="field"
67
67
  :values="fieldsData"
68
- :ref="`input_field_validator_${index}`"
68
+ ref="fieldsToValid"
69
69
  @input="onInputFieldInput(field)"
70
70
  ></free-field>
71
71
  </div>
@@ -100,14 +100,14 @@
100
100
  </template>
101
101
 
102
102
  <script>
103
- import mixins from 'free-fe-mixins';
104
103
  import { defineComponent } from 'vue';
104
+ import { useFormValidator } from '../../composible/useFormValidator';
105
105
  import FreeField from '../../free-field/composible/fieldWrapper';
106
106
  import EIcon from '../Basic/EIcon.vue';
107
107
 
108
108
  export default defineComponent({
109
109
  name: 'BasicDialog',
110
- mixins: [mixins.InputFieldValidator],
110
+ // mixins: [mixins.InputFieldValidator],
111
111
  emits: ['hide', 'ok', 'cancel'],
112
112
  props: {
113
113
  persistent: { type: Boolean, default: true },
@@ -154,6 +154,14 @@ export default defineComponent({
154
154
  FreeField,
155
155
  EIcon,
156
156
  },
157
+ setup(props, { expose }) {
158
+ const { validate } = useFormValidator('fieldsToValid');
159
+ expose({
160
+ validate,
161
+ })
162
+
163
+ return {};
164
+ },
157
165
  data() {
158
166
  return {
159
167
  timeLeft: 0,
@@ -26,13 +26,13 @@
26
26
  </template>
27
27
 
28
28
  <script>
29
- import mixins from 'free-fe-mixins';
30
29
  import { defineComponent } from 'vue';
30
+ import { useObjectData, objectDataProps } from '../../composible/useObjectData';
31
31
 
32
32
  export default defineComponent({
33
33
  name: 'SlidingCarousel',
34
- mixins: [mixins.ArrayDataMixin],
35
34
  props: {
35
+ ...objectDataProps,
36
36
  interval: { type: Number, default: 3000 },
37
37
  height: { type: String, default: '220px' },
38
38
  width: { type: String, default: '100%' },
@@ -42,6 +42,17 @@ export default defineComponent({
42
42
  swipeable: { type: Boolean, default: true },
43
43
  thumbnails: { type: Boolean, default: true },
44
44
  },
45
+ setup(props, ctx) {
46
+ const {
47
+ data,
48
+ refreshData,
49
+ } = useObjectData(props, ctx);
50
+
51
+ return {
52
+ data,
53
+ refreshData,
54
+ };
55
+ },
45
56
  data() {
46
57
  return {
47
58
  slide: 0,
@@ -65,13 +65,13 @@
65
65
  </template>
66
66
 
67
67
  <script>
68
- import mixins from 'free-fe-mixins';
69
68
  import { defineComponent } from 'vue';
69
+ import { useObjectData, objectDataProps } from '../../composible/useObjectData';
70
70
 
71
71
  export default defineComponent({
72
72
  name: 'SlidingNews',
73
- mixins: [mixins.ArrayDataMixin],
74
73
  props: {
74
+ ...objectDataProps,
75
75
  interval: { type: Number, default: 3000 },
76
76
  height: { type: String, default: '40px' },
77
77
  width: { type: String, default: '100%' },
@@ -83,6 +83,17 @@ export default defineComponent({
83
83
  transitionPrev: { type: String, default: 'slide-up' },
84
84
  transitionNext: { type: String, default: 'slide-down' },
85
85
  },
86
+ setup(props, ctx) {
87
+ const {
88
+ data,
89
+ refreshData,
90
+ } = useObjectData(props, ctx);
91
+
92
+ return {
93
+ data,
94
+ refreshData,
95
+ };
96
+ },
86
97
  data() {
87
98
  return {
88
99
  visible: true,
@@ -0,0 +1,56 @@
1
+ import { unref, getCurrentInstance, computed } from "vue";
2
+
3
+ export function useFormValidator(...list) {
4
+ const { proxy:vm } = getCurrentInstance();
5
+
6
+ return {
7
+ validate: computed(() => {
8
+ return (...args) => {
9
+ if (vm.shouldHide) return true;
10
+
11
+ // could have customized validate function in component
12
+ if (vm.selfValidate && typeof vm.selfValidate === 'function') {
13
+ return vm.selfValidate();
14
+ }
15
+
16
+ const refsList = [];
17
+ for(let i = 0; i < list.length; i += 1) {
18
+ if (typeof list[i] === 'string') {
19
+ list[i] = vm.$refs[list[i]];
20
+ } else if (typeof list[i] === 'function') {
21
+ list[i] = list[i]();
22
+ }
23
+
24
+ if (Array.isArray(list[i])) {
25
+ refsList.push(...list[i])
26
+ } else {
27
+ refsList.push(list[i])
28
+ }
29
+ }
30
+
31
+ if (refsList.length <= 0) return true;
32
+
33
+ let hasErr = false;
34
+ for (let i = 0; i < refsList.length; i += 1) {
35
+ let refi = unref(refsList[i]);
36
+
37
+
38
+ const validFun = unref(refi.validate || refi.methods?.validate || refi.component?.exposed?.validate|| refi.component?.ctx?.validate);
39
+ const shouldHide = unref(refi.shouldHide || refi.component?.ctx?.shouldHide);
40
+
41
+ if (typeof validFun === 'function' && shouldHide !== true) {
42
+ hasErr = !validFun() || hasErr;
43
+
44
+ if (hasErr) {
45
+ console.error('got error', args)
46
+ break;
47
+ }
48
+ }
49
+ }
50
+
51
+ return !hasErr;
52
+ };
53
+ }),
54
+ }
55
+ };
56
+
@@ -1,6 +1,6 @@
1
1
  import { defineComponent, h, ref, getCurrentInstance } from 'vue';
2
- import { useFreeField, freeFieldProps } from '../composible/useFreeField';
3
2
  import { QCheckbox } from 'quasar';
3
+ import { useFreeField, freeFieldProps } from '../composible/useFreeField';
4
4
 
5
5
  export default defineComponent({
6
6
  name: 'InputFieldAgreementCheck',
@@ -21,7 +21,7 @@ export default defineComponent({
21
21
  ...freeFieldProps,
22
22
  },
23
23
  emits: ['input'],
24
- setup(props, { emit }){
24
+ setup(props, { emit, expose }){
25
25
  if (!props.Field) return {};
26
26
 
27
27
  const { proxy:vm } = getCurrentInstance();
@@ -106,6 +106,10 @@ export default defineComponent({
106
106
  return isValid;
107
107
  };
108
108
 
109
+ defineExpose({
110
+ validate,
111
+ })
112
+
109
113
  const checkboxNode = () => h(QCheckbox, {
110
114
  disable: props.Field?.ReadOnly,
111
115
  label: props.Field?.showLabel ? '' : props.Field?.Label,
@@ -1,7 +1,8 @@
1
1
  import { ref, defineComponent, getCurrentInstance, h, computed } from 'vue';
2
- import { useFreeField, freeFieldProps, useFreeFieldMethods } from '../composible/useFreeField';
3
2
  import { QInput, QIcon, QPopupProxy, QDate } from 'quasar';
3
+ import { useFreeField, freeFieldProps, useFreeFieldMethods } from '../composible/useFreeField';
4
4
  import freeFieldLabel from '../composible/freeFieldLabel';
5
+ import { useFormValidator} from '../../composible/useFormValidator';
5
6
 
6
7
  export default defineComponent({
7
8
  name: 'InputFieldDate',
@@ -40,7 +41,7 @@ export default defineComponent({
40
41
  methods: {
41
42
  ...useFreeFieldMethods,
42
43
  },
43
- setup(props, { emit, slots }){
44
+ setup(props, { emit, slots, expose }){
44
45
  if (!props.Field) return {};
45
46
 
46
47
  const { proxy: vm } = getCurrentInstance();
@@ -80,7 +81,7 @@ export default defineComponent({
80
81
 
81
82
  const showPopup = ref(false);
82
83
 
83
- const DateNode = () => h(QInput, {
84
+ const DateNode = computed(() => h(QInput, {
84
85
  hideBottomSpace: true,
85
86
  readonly: props.Field?.ReadOnly,
86
87
 
@@ -121,12 +122,19 @@ export default defineComponent({
121
122
  class: 'cursor-pointer',
122
123
  name: 'event'
123
124
  }),
124
- });
125
+ }));
126
+
127
+ const {
128
+ validate,
129
+ } = useFormValidator(DateNode);
130
+ expose({
131
+ validate,
132
+ })
125
133
 
126
134
  return () => h('div', {
127
135
  class: 'simple-field input-field-date row items-center no-wrap',
128
136
  }, [
129
- props.Field.ReadOnly ? readonlyNode() : DateNode(),
137
+ props.Field.ReadOnly ? readonlyNode() : DateNode.value,
130
138
  slots.warning && slots.warning(),
131
139
  ]);
132
140
  },
@@ -1,7 +1,8 @@
1
1
  import { ref, defineComponent, getCurrentInstance, h, computed, watch, watchEffect } from 'vue';
2
- import { useFreeField, freeFieldProps, useFreeFieldMethods } from '../composible/useFreeField';
3
2
  import { QInput, QIcon, QPopupProxy, QDate } from 'quasar';
3
+ import { useFreeField, freeFieldProps, useFreeFieldMethods } from '../composible/useFreeField';
4
4
  import freeFieldLabel from '../composible/freeFieldLabel';
5
+ import { useFormValidator} from '../../composible/useFormValidator';
5
6
 
6
7
  export default defineComponent({
7
8
  name: 'InputFieldDateRange',
@@ -40,7 +41,7 @@ export default defineComponent({
40
41
  methods: {
41
42
  ...useFreeFieldMethods,
42
43
  },
43
- setup(props, { emit, slots }){
44
+ setup(props, { emit, slots, expose }){
44
45
  if (!props.Field) return {};
45
46
 
46
47
  const { proxy: vm } = getCurrentInstance();
@@ -119,7 +120,7 @@ export default defineComponent({
119
120
  const showMaxPopup = ref(false);
120
121
 
121
122
 
122
- const minDateNode = () => h(QInput, {
123
+ const minDateNode = computed(() => h(QInput, {
123
124
  hideBottomSpace: true,
124
125
  readonly: props.Field?.ReadOnly,
125
126
 
@@ -162,9 +163,9 @@ export default defineComponent({
162
163
  class: 'cursor-pointer',
163
164
  name: 'event'
164
165
  }),
165
- });
166
+ }));
166
167
 
167
- const maxDateNode = () => h(QInput, {
168
+ const maxDateNode = computed(() => h(QInput, {
168
169
  hideBottomSpace: true,
169
170
  readonly: props.Field?.ReadOnly,
170
171
 
@@ -206,7 +207,12 @@ export default defineComponent({
206
207
  class: 'cursor-pointer',
207
208
  name: 'event'
208
209
  }),
209
- });
210
+ }));
211
+
212
+ const { validate } = useFormValidator(minDateNode, maxDateNode);
213
+ expose({
214
+ validate,
215
+ })
210
216
 
211
217
  return () => h('div', {
212
218
  class: 'simple-field input-field-date row items-center no-wrap',
@@ -214,11 +220,11 @@ export default defineComponent({
214
220
  props.Field.ReadOnly ? readonlyNode() : h('div', {
215
221
  class: 'row items-center no-wrap'
216
222
  }, [
217
- minDateNode(),
223
+ minDateNode.value,
218
224
  h('span', {
219
225
  class: 'input-field-range-separator'
220
226
  },props.Field.Separator || '~'),
221
- maxDateNode(),
227
+ maxDateNode.value,
222
228
  ]),
223
229
  slots.warning && slots.warning(),
224
230
  ]);
@@ -1,8 +1,9 @@
1
1
  import { ref, defineComponent, getCurrentInstance, h, computed, watchEffect } from 'vue';
2
- import { useFreeField, freeFieldProps, useFreeFieldMethods } from '../composible/useFreeField';
3
2
  import { QTable, QTh, QTd, QTr, QIcon } from 'quasar';
3
+ import { useFreeField, freeFieldProps, useFreeFieldMethods } from '../composible/useFreeField';
4
4
  import freeFieldLabel from '../composible/freeFieldLabel';
5
5
  import FreeField from '../composible/fieldWrapper';
6
+ import { useFormValidator} from '../../composible/useFormValidator';
6
7
 
7
8
  export default defineComponent({
8
9
  name: 'InputFieldDynamicList',
@@ -424,10 +425,16 @@ export default defineComponent({
424
425
  }
425
426
  };
426
427
 
428
+ const fieldsToValidate = ref([]);
429
+ const {
430
+ validate
431
+ } = useFormValidator(fieldsToValidate);
432
+
427
433
  expose({
428
434
  selected,
429
435
  addRow,
430
436
  deleteRow,
437
+ validate,
431
438
  })
432
439
 
433
440
  watchEffect(() => {
@@ -456,6 +463,22 @@ export default defineComponent({
456
463
  );
457
464
 
458
465
  const bodyCell = (slotProps) => {
466
+ fieldsToValidate.value = slotProps.col?.List?.length > 1 ? slotProps.col.List.map((col) =>
467
+ h(FreeField, {
468
+ Field: columnField(col, true, slotProps.col),
469
+ values: slotProps.row,
470
+ style: "margin: 4px auto",
471
+ onInput: cellChanged,
472
+ })
473
+ ) : [
474
+ h(FreeField, {
475
+ Field: columnField(slotProps.col),
476
+ values: slotProps.row,
477
+ borderless: true,
478
+ onInput: cellChanged,
479
+ }),
480
+ ];
481
+
459
482
  if (slotProps.col.name === "listActions") {
460
483
  return h(QTd, null, {
461
484
  default: () =>
@@ -480,38 +503,15 @@ export default defineComponent({
480
503
  rowspan: slotProps.value ? slotProps.value.rowspan || "1" : "1",
481
504
  class: "items-center justify-center",
482
505
  },
483
- {
484
- default: () =>
485
- slotProps.col.List?.length > 1
486
- ? h(
487
- "span",
488
- {
489
- class: "full-height full-width abcClass",
490
- },
491
- slotProps.col.List.map((col) =>
492
- h(FreeField, {
493
- Field: columnField(col, true, slotProps.col),
494
- values: slotProps.row,
495
- style: "margin: 4px auto",
496
- onInput: cellChanged,
497
- })
498
- )
499
- )
500
- : h(
501
- "span",
502
- {
503
- class: "full-height full-width defClass",
504
- },
505
- [
506
- h(FreeField, {
507
- Field: columnField(slotProps.col),
508
- values: slotProps.row,
509
- borderless: true,
510
- onInput: cellChanged,
511
- }),
512
- ]
513
- ),
514
- }
506
+ [
507
+ h(
508
+ "span",
509
+ {
510
+ class: "full-height full-width",
511
+ },
512
+ fieldsToValidate.value,
513
+ )
514
+ ]
515
515
  );
516
516
  }
517
517
  };
@@ -45,8 +45,7 @@
45
45
  :Field="columnField(col, true, props.col)"
46
46
  :values="props.row"
47
47
  @input="cellChanged()"
48
- :ref="`input_field_validator_${
49
- columnField(col, true, props.col).Name}-${index}-${props.row.auto__index}`"
48
+ ref="fieldsToValid"
50
49
  ></free-field>
51
50
  </span>
52
51
  <span v-else class="full-width full-height">
@@ -55,8 +54,7 @@
55
54
  :values="props.row"
56
55
  @input="cellChanged()"
57
56
  borderless
58
- :ref="`input_field_validator_${
59
- columnField(props.col, false).Name}-${props.row.auto__index}`"
57
+ ref="fieldToValid"
60
58
  ></free-field>
61
59
  </span>
62
60
  </q-td>
@@ -74,6 +72,7 @@
74
72
  <script>
75
73
  import { defineComponent, watchEffect, ref, computed } from 'vue';
76
74
  import { useFreeField, freeFieldProps } from '../composible/useFreeField';
75
+ import { useFormValidator} from '../../composible/useFormValidator';
77
76
 
78
77
  export default defineComponent({
79
78
  name: 'InputFieldFixedList',
@@ -205,7 +204,7 @@ export default defineComponent({
205
204
  props: {
206
205
  ...freeFieldProps,
207
206
  },
208
- setup(props, { emit }) {
207
+ setup(props, { emit, expose }) {
209
208
  if (!props.Field) return {};
210
209
 
211
210
  const { fieldData, setFieldData } = useFreeField(props);
@@ -341,6 +340,11 @@ export default defineComponent({
341
340
  setFieldData(tableData.value, emit);
342
341
  };
343
342
 
343
+ const { validate } = useFormValidator('fieldsToValid', 'fieldToValid')
344
+ expose({
345
+ validate,
346
+ })
347
+
344
348
  return {
345
349
  fieldData,
346
350
  tableData,
@@ -87,6 +87,7 @@
87
87
  <script>
88
88
  import { defineComponent } from 'vue';
89
89
  import { useFreeField, freeFieldProps } from '../composible/useFreeField';
90
+ import { useFormValidator} from '../../composible/useFormValidator';
90
91
 
91
92
  export default defineComponent({
92
93
  name: 'InputFieldLabels',
@@ -114,9 +115,14 @@ export default defineComponent({
114
115
  newLabel: '',
115
116
  };
116
117
  },
117
- setup(props) {
118
+ setup(props, { expose }) {
118
119
  const { fieldData, setFieldData } = useFreeField(props);
119
120
 
121
+ const { validate } = useFormValidator('input_field_validator_label');
122
+ expose({
123
+ validate,
124
+ });
125
+
120
126
  return {
121
127
  fieldData,
122
128
  setFieldData,
@@ -54,7 +54,7 @@
54
54
  :Field="{...f, ReadOnly: Field.ReadOnly || f.ReadOnly}"
55
55
  :values="fieldData.value"
56
56
  @input="cellChanged(f)"
57
- :ref="`input_field_validator_${index}`"
57
+ ref="fieldsToValid"
58
58
  ></free-field>
59
59
  </span>
60
60
  <span
@@ -66,7 +66,7 @@
66
66
  :values="fieldData.value"
67
67
  @input="cellChanged(r[rk].List[0])"
68
68
  borderless
69
- :ref="`input_field_validator_extra_${index}`"
69
+ ref="fieldToValid"
70
70
  ></free-field>
71
71
  </span>
72
72
  </q-td>
@@ -91,6 +91,7 @@
91
91
  <script>
92
92
  import { computed, defineComponent } from 'vue';
93
93
  import { useFreeField, freeFieldProps } from '../composible/useFreeField';
94
+ import { useFormValidator} from '../../composible/useFormValidator';
94
95
 
95
96
  export default defineComponent({
96
97
  name: 'InputFieldMixedTable',
@@ -271,7 +272,7 @@ export default defineComponent({
271
272
  props: {
272
273
  ...freeFieldProps,
273
274
  },
274
- setup(props, { emit }) {
275
+ setup(props, { emit, expose }) {
275
276
  if (!props.Field) return () => null;
276
277
 
277
278
  const { fieldData, setFieldData } = useFreeField(props);
@@ -342,6 +343,11 @@ export default defineComponent({
342
343
  return summaryText;
343
344
  });
344
345
 
346
+ const { validate } = useFormValidator('fieldsToValid', 'fieldToValid');
347
+ expose({
348
+ validate,
349
+ });
350
+
345
351
  return {
346
352
  fieldData,
347
353
  setFieldData,
@@ -1,8 +1,9 @@
1
- import { defineComponent, h, watch } from 'vue';
2
- import { useFreeField, freeFieldProps, useFreeFieldMethods } from '../composible/useFreeField';
1
+ import { defineComponent, h, watch, computed } from 'vue';
3
2
  import { QInput } from 'quasar';
3
+ import { useFreeField, freeFieldProps, useFreeFieldMethods } from '../composible/useFreeField';
4
4
  import ReadonlyContent from '../composible/readonlyContent';
5
5
  import freeFieldLabel from '../composible/freeFieldLabel';
6
+ import { useFormValidator} from '../../composible/useFormValidator';
6
7
 
7
8
  export default defineComponent({
8
9
  name: 'InputFieldNumber',
@@ -95,7 +96,7 @@ export default defineComponent({
95
96
  methods: {
96
97
  ...useFreeFieldMethods,
97
98
  },
98
- setup(props, { emit, slots }){
99
+ setup(props, { emit, slots , expose }){
99
100
  if (!props.Field) return {};
100
101
 
101
102
  const { fieldData, setFieldData } = useFreeField(props);
@@ -134,7 +135,7 @@ export default defineComponent({
134
135
  class: 'postfix',
135
136
  }, props.Field.Options?.Postfix));
136
137
 
137
- const inputNode = () => h(QInput, {
138
+ const inputNode = computed(() => h(QInput, {
138
139
  type: 'number',
139
140
  maxlength: props.Field.Options?.MaxLength,
140
141
  autocomplete: 'off',
@@ -155,12 +156,17 @@ export default defineComponent({
155
156
  before,
156
157
  prepend,
157
158
  append,
158
- });
159
+ }));
160
+
161
+ const { validate } = useFormValidator(inputNode);
162
+ expose({
163
+ validate,
164
+ })
159
165
 
160
166
  return () => h('div', {
161
167
  class: 'simple-field input-field-number row items-center no-wrap',
162
168
  }, [
163
- props.Field.ReadOnly ? readonlyNode() : inputNode(),
169
+ props.Field.ReadOnly ? readonlyNode() : inputNode.value,
164
170
  slots.warning && slots.warning(),
165
171
  ]);
166
172
  },
@@ -1,7 +1,8 @@
1
- import { defineComponent, h, ref } from 'vue';
2
- import { useFreeField, freeFieldProps, useFreeFieldMethods } from '../composible/useFreeField';
1
+ import { defineComponent, h, ref, computed } from 'vue';
3
2
  import { QInput, QIcon } from 'quasar';
3
+ import { useFreeField, freeFieldProps, useFreeFieldMethods } from '../composible/useFreeField';
4
4
  import freeFieldLabel from '../composible/freeFieldLabel';
5
+ import { useFormValidator} from '../../composible/useFormValidator';
5
6
 
6
7
  export default defineComponent({
7
8
  name: 'InputFieldPassword',
@@ -31,7 +32,7 @@ export default defineComponent({
31
32
  methods: {
32
33
  ...useFreeFieldMethods,
33
34
  },
34
- setup(props, { emit, slots }){
35
+ setup(props, { emit, slots, expose }){
35
36
  if (!props.Field) return {};
36
37
 
37
38
  const { fieldData, setFieldData } = useFreeField(props);
@@ -49,7 +50,7 @@ export default defineComponent({
49
50
  },
50
51
  });
51
52
 
52
- const inputNode = () => h(QInput, {
53
+ const inputNode = () => computed(h(QInput, {
53
54
  type: isPwd.value ? 'password' : 'text',
54
55
  maxlength: props.Field.Options?.MaxLength,
55
56
  autocomplete: props.Field.Options?.autocomplete ? '' : 'new-password',
@@ -69,12 +70,17 @@ export default defineComponent({
69
70
  }, {
70
71
  before,
71
72
  append,
72
- });
73
+ }));
74
+
75
+ const { validate } = useFormValidator(inputNode);
76
+ expose({
77
+ validate,
78
+ })
73
79
 
74
80
  return () => h('div', {
75
81
  class: 'simple-field input-field-password row items-center no-wrap',
76
82
  }, [
77
- inputNode(),
83
+ inputNode.value,
78
84
  slots.warning && slots.warning(),
79
85
  ]);
80
86
  },
@@ -137,7 +137,6 @@ export default defineComponent({
137
137
  })
138
138
 
139
139
  watch(hasThis, (v) => {
140
- console.log('hasThis changed', v)
141
140
  if (v) {
142
141
  // checked from unchecked
143
142
  fieldData.value = fieldData.value || {};