@ramathibodi/nuxt-commons 0.1.73 → 0.1.75

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 (111) hide show
  1. package/README.md +115 -96
  2. package/dist/module.json +1 -1
  3. package/dist/module.mjs +1 -0
  4. package/dist/runtime/components/Alert.vue +58 -54
  5. package/dist/runtime/components/BarcodeReader.vue +130 -122
  6. package/dist/runtime/components/ExportCSV.vue +110 -102
  7. package/dist/runtime/components/FileBtn.vue +79 -67
  8. package/dist/runtime/components/ImportCSV.vue +151 -139
  9. package/dist/runtime/components/MrzReader.vue +168 -0
  10. package/dist/runtime/components/SplitterPanel.vue +67 -59
  11. package/dist/runtime/components/TabsGroup.vue +39 -31
  12. package/dist/runtime/components/TextBarcode.vue +66 -54
  13. package/dist/runtime/components/device/IdCardButton.vue +95 -83
  14. package/dist/runtime/components/device/IdCardWebSocket.vue +207 -195
  15. package/dist/runtime/components/device/Scanner.vue +350 -338
  16. package/dist/runtime/components/dialog/Confirm.vue +112 -100
  17. package/dist/runtime/components/dialog/Host.vue +88 -84
  18. package/dist/runtime/components/dialog/Index.vue +84 -72
  19. package/dist/runtime/components/dialog/Loading.vue +51 -39
  20. package/dist/runtime/components/dialog/default/Confirm.vue +112 -100
  21. package/dist/runtime/components/dialog/default/Loading.vue +60 -48
  22. package/dist/runtime/components/dialog/default/Notify.vue +82 -70
  23. package/dist/runtime/components/dialog/default/Printing.vue +46 -34
  24. package/dist/runtime/components/dialog/default/VerifyUser.vue +144 -132
  25. package/dist/runtime/components/document/Form.vue +50 -42
  26. package/dist/runtime/components/document/TemplateBuilder.vue +536 -524
  27. package/dist/runtime/components/form/ActionPad.vue +156 -144
  28. package/dist/runtime/components/form/Birthdate.vue +116 -104
  29. package/dist/runtime/components/form/CheckboxGroup.vue +99 -87
  30. package/dist/runtime/components/form/CodeEditor.vue +45 -37
  31. package/dist/runtime/components/form/Date.vue +270 -258
  32. package/dist/runtime/components/form/DateTime.vue +220 -208
  33. package/dist/runtime/components/form/Dialog.vue +178 -166
  34. package/dist/runtime/components/form/EditPad.vue +157 -145
  35. package/dist/runtime/components/form/File.vue +295 -283
  36. package/dist/runtime/components/form/Hidden.vue +44 -32
  37. package/dist/runtime/components/form/Iterator.vue +538 -526
  38. package/dist/runtime/components/form/Login.vue +143 -131
  39. package/dist/runtime/components/form/Pad.vue +399 -387
  40. package/dist/runtime/components/form/SignPad.vue +226 -218
  41. package/dist/runtime/components/form/System.vue +34 -26
  42. package/dist/runtime/components/form/Table.vue +391 -379
  43. package/dist/runtime/components/form/TableData.vue +236 -224
  44. package/dist/runtime/components/form/Time.vue +177 -165
  45. package/dist/runtime/components/form/images/Capture.vue +245 -237
  46. package/dist/runtime/components/form/images/Edit.vue +133 -121
  47. package/dist/runtime/components/form/images/Field.vue +331 -320
  48. package/dist/runtime/components/form/images/Pad.vue +54 -42
  49. package/dist/runtime/components/label/Date.vue +37 -29
  50. package/dist/runtime/components/label/DateAgo.vue +102 -94
  51. package/dist/runtime/components/label/DateCount.vue +152 -144
  52. package/dist/runtime/components/label/Field.vue +111 -103
  53. package/dist/runtime/components/label/FormatMoney.vue +37 -29
  54. package/dist/runtime/components/label/Mask.vue +46 -38
  55. package/dist/runtime/components/label/Object.vue +21 -13
  56. package/dist/runtime/components/master/Autocomplete.vue +89 -81
  57. package/dist/runtime/components/master/Combobox.vue +88 -80
  58. package/dist/runtime/components/master/RadioGroup.vue +90 -78
  59. package/dist/runtime/components/master/Select.vue +70 -62
  60. package/dist/runtime/components/master/label.vue +55 -47
  61. package/dist/runtime/components/model/Autocomplete.vue +91 -79
  62. package/dist/runtime/components/model/Combobox.vue +90 -78
  63. package/dist/runtime/components/model/Pad.vue +114 -102
  64. package/dist/runtime/components/model/Select.vue +78 -72
  65. package/dist/runtime/components/model/Table.vue +370 -358
  66. package/dist/runtime/components/model/iterator.vue +497 -489
  67. package/dist/runtime/components/model/label.vue +58 -50
  68. package/dist/runtime/components/pdf/Print.vue +75 -63
  69. package/dist/runtime/components/pdf/View.vue +146 -134
  70. package/dist/runtime/composables/alert.d.ts +4 -0
  71. package/dist/runtime/composables/api.d.ts +4 -0
  72. package/dist/runtime/composables/dialog.d.ts +1 -1
  73. package/dist/runtime/composables/document/templateFormHidden.d.ts +4 -0
  74. package/dist/runtime/composables/graphql.d.ts +1 -1
  75. package/dist/runtime/composables/graphqlModel.d.ts +9 -9
  76. package/dist/runtime/composables/graphqlModelItem.d.ts +7 -7
  77. package/dist/runtime/composables/graphqlModelOperation.d.ts +6 -6
  78. package/dist/runtime/composables/localStorageModel.d.ts +4 -0
  79. package/dist/runtime/composables/lookupList.d.ts +4 -0
  80. package/dist/runtime/composables/menu.d.ts +4 -0
  81. package/dist/runtime/composables/useMrzReader.d.ts +48 -0
  82. package/dist/runtime/composables/useMrzReader.js +423 -0
  83. package/dist/runtime/composables/useTesseract.d.ts +16 -0
  84. package/dist/runtime/composables/useTesseract.js +45 -0
  85. package/dist/runtime/composables/userPermission.d.ts +1 -1
  86. package/dist/runtime/labs/Calendar.vue +99 -99
  87. package/dist/runtime/labs/form/EditMobile.vue +152 -152
  88. package/dist/runtime/labs/form/TextFieldMask.vue +43 -43
  89. package/dist/runtime/plugins/clientConfig.d.ts +1 -1
  90. package/dist/runtime/plugins/default.d.ts +1 -1
  91. package/dist/runtime/plugins/dialogManager.d.ts +1 -1
  92. package/dist/runtime/plugins/permission.d.ts +1 -1
  93. package/dist/runtime/types/alert.d.ts +11 -11
  94. package/dist/runtime/types/clientConfig.d.ts +13 -13
  95. package/dist/runtime/types/dialogManager.d.ts +35 -35
  96. package/dist/runtime/types/formDialog.d.ts +5 -5
  97. package/dist/runtime/types/graphqlOperation.d.ts +23 -23
  98. package/dist/runtime/types/menu.d.ts +31 -31
  99. package/dist/runtime/types/modules.d.ts +7 -7
  100. package/dist/runtime/types/permission.d.ts +13 -13
  101. package/dist/runtime/utils/asset.d.ts +2 -0
  102. package/dist/runtime/utils/asset.js +49 -0
  103. package/package.json +131 -122
  104. package/scripts/enrich-vue-docs-from-ai.mjs +197 -0
  105. package/scripts/generate-ai-summary.mjs +321 -0
  106. package/scripts/generate-composables-md.mjs +129 -0
  107. package/scripts/postInstall.cjs +70 -70
  108. package/templates/.codegen/codegen.ts +32 -32
  109. package/templates/.codegen/plugin-schema-object.js +161 -161
  110. package/templates/public/tesseract/mrz.traineddata.gz +0 -0
  111. package/templates/public/tesseract/ocrb.traineddata.gz +0 -0
@@ -1,144 +1,156 @@
1
- <script lang="ts" setup>
2
- import {computed, defineExpose, ref, watchEffect} from 'vue'
3
- import {cloneDeep, isEqual} from 'lodash-es'
4
- import type {FormDialogCallback} from '../../types/formDialog'
5
- import FormPadComponent from './Pad.vue'
6
-
7
- interface Props extends /* @vue-ignore */ InstanceType<typeof FormPadComponent['$props']> {
8
- title?: string
9
- initialData?: object
10
- saveCaption?: string
11
- cancelCaption?: string
12
- readonly?: boolean
13
- showTitle?: boolean
14
- skipValidation?:boolean
15
- }
16
-
17
- const props = withDefaults(defineProps<Props>(), {
18
- saveCaption: 'บันทึก',
19
- cancelCaption: 'ยกเลิก',
20
- readonly: false,
21
- showTitle: false,
22
- skipValidation:false
23
- })
24
-
25
- const isSaving = ref<boolean>(false)
26
- const formPadRef = ref()
27
- const formData = ref<object>({})
28
- const formDataOriginalValue = ref<object>()
29
-
30
- const emit = defineEmits(['create', 'update'])
31
-
32
- function save() {
33
- if (props.skipValidation || formPadRef.value?.isValid) {
34
- isSaving.value = true
35
- emit((isCreating.value) ? 'create' : 'update', cloneDeep(formData.value), callback)
36
- }
37
- }
38
-
39
- function cancel() {
40
- reset()
41
- }
42
-
43
- function reset() {
44
- formDataOriginalValue.value = undefined
45
- formPadRef.value?.reset()
46
- loadFormData()
47
- }
48
-
49
- const callback: FormDialogCallback = {
50
- done: function () {
51
- isSaving.value = false
52
- reset()
53
- },
54
- error: function () {
55
- isSaving.value = false
56
- },
57
- }
58
-
59
- const isDataChange = computed(() => {
60
- return !((isCreating.value) ? isEqual(formData.value, createOriginalValue.value) : isEqual(formData.value, formDataOriginalValue.value))
61
- })
62
-
63
- const isCreating = computed(() => {
64
- return !formDataOriginalValue.value
65
- })
66
-
67
- const createOriginalValue = computed(() => {
68
- return Object.assign({}, props.initialData)
69
- })
70
-
71
- const loadFormData = () => {
72
- if (formDataOriginalValue.value) {
73
- formData.value = cloneDeep(formDataOriginalValue.value)
74
- }
75
- else {
76
- formData.value = Object.assign({}, cloneDeep(props.initialData))
77
- }
78
- }
79
-
80
- const operation = ref({ isDataChange, isCreating, isSaving, save, cancel })
81
-
82
- watchEffect(loadFormData)
83
-
84
- function setOriginalData(originalData?: object) {
85
- formDataOriginalValue.value = originalData
86
- }
87
-
88
- defineExpose({setOriginalData,operation,formPad: formPadRef})
89
- </script>
90
-
91
- <template>
92
- <VCard flat>
93
- <VToolbar v-if="showTitle">
94
- <slot name="titleToolbar" :operation="operation">
95
- <VToolbarTitle>
96
- <slot name="title" :operation="operation">
97
- {{ (isCreating) ? "New" : "Edit" }} {{ title }}
98
- </slot>
99
- </VToolbarTitle>
100
- </slot>
101
- </VToolbar>
102
- <VCardText>
103
- <form-pad
104
- ref="formPadRef"
105
- v-model="formData"
106
- :originalData="formDataOriginalValue"
107
- :readonly="readonly"
108
- isolated
109
- v-bind="$attrs"
110
- >
111
- <template #default="slotData">
112
- <slot
113
- v-bind="slotData"
114
- :is-creating="isCreating"
115
- :is-data-change="isDataChange"
116
- />
117
- </template>
118
- </form-pad>
119
- </VCardText>
120
- <VCardActions>
121
- <slot name="action" :operation="operation">
122
- <VSpacer />
123
- <VBtn
124
- color="primary"
125
- variant="flat"
126
- :loading="isSaving"
127
- :disabled="!isDataChange"
128
- @click="save"
129
- v-if="!readonly"
130
- >
131
- {{ saveCaption }}
132
- </VBtn>
133
- <VBtn
134
- color="error"
135
- variant="flat"
136
- :disabled="isSaving"
137
- @click="cancel"
138
- >
139
- {{ cancelCaption }}
140
- </VBtn>
141
- </slot>
142
- </VCardActions>
143
- </VCard>
144
- </template>
1
+ <script lang="ts" setup>
2
+ /**
3
+ * FormActionPad is a schema-driven form field component that binds model data, renders field UI, and emits normalized updates.
4
+ * This doc block is consumed by vue-docgen for generated API documentation.
5
+ */
6
+ import {computed, defineExpose, ref, watchEffect} from 'vue'
7
+ import {cloneDeep, isEqual} from 'lodash-es'
8
+ import type {FormDialogCallback} from '../../types/formDialog'
9
+ import FormPadComponent from './Pad.vue'
10
+
11
+ interface Props extends /* @vue-ignore */ InstanceType<typeof FormPadComponent['$props']> {
12
+ title?: string // Title text displayed in the component header or dialog.
13
+ initialData?: object // Initial form/object values used when creating a new record.
14
+ saveCaption?: string // Label text for the save/confirm action button.
15
+ cancelCaption?: string // Label text for the cancel action button.
16
+ readonly?: boolean // renders as read-only while keeping value visible
17
+ showTitle?: boolean // Shows or hides the component title/header area.
18
+ skipValidation?: boolean // Skips form validation before emitting save actions.
19
+ }
20
+
21
+ /**
22
+ * Public props accepted by FormActionPad.
23
+ * Document each prop field with intent, defaults, and side effects for clear generated docs.
24
+ */
25
+ const props = withDefaults(defineProps<Props>(), {
26
+ saveCaption: 'บันทึก',
27
+ cancelCaption: 'ยกเลิก',
28
+ readonly: false,
29
+ showTitle: false,
30
+ skipValidation:false
31
+ })
32
+
33
+ const isSaving = ref<boolean>(false)
34
+ const formPadRef = ref()
35
+ const formData = ref<object>({})
36
+ const formDataOriginalValue = ref<object>()
37
+
38
+ /**
39
+ * Custom events emitted by FormActionPad.
40
+ * Parents can listen to these events to react to user actions and internal state changes.
41
+ */
42
+ const emit = defineEmits(['create', 'update'])
43
+
44
+ function save() {
45
+ if (props.skipValidation || formPadRef.value?.isValid) {
46
+ isSaving.value = true
47
+ emit((isCreating.value) ? 'create' : 'update', cloneDeep(formData.value), callback)
48
+ }
49
+ }
50
+
51
+ function cancel() {
52
+ reset()
53
+ }
54
+
55
+ function reset() {
56
+ formDataOriginalValue.value = undefined
57
+ formPadRef.value?.reset()
58
+ loadFormData()
59
+ }
60
+
61
+ const callback: FormDialogCallback = {
62
+ done: function () {
63
+ isSaving.value = false
64
+ reset()
65
+ },
66
+ error: function () {
67
+ isSaving.value = false
68
+ },
69
+ }
70
+
71
+ const isDataChange = computed(() => {
72
+ return !((isCreating.value) ? isEqual(formData.value, createOriginalValue.value) : isEqual(formData.value, formDataOriginalValue.value))
73
+ })
74
+
75
+ const isCreating = computed(() => {
76
+ return !formDataOriginalValue.value
77
+ })
78
+
79
+ const createOriginalValue = computed(() => {
80
+ return Object.assign({}, props.initialData)
81
+ })
82
+
83
+ const loadFormData = () => {
84
+ if (formDataOriginalValue.value) {
85
+ formData.value = cloneDeep(formDataOriginalValue.value)
86
+ }
87
+ else {
88
+ formData.value = Object.assign({}, cloneDeep(props.initialData))
89
+ }
90
+ }
91
+
92
+ const operation = ref({ isDataChange, isCreating, isSaving, save, cancel })
93
+
94
+ watchEffect(loadFormData)
95
+
96
+ function setOriginalData(originalData?: object) {
97
+ formDataOriginalValue.value = originalData
98
+ }
99
+
100
+ defineExpose({setOriginalData,operation,formPad: formPadRef})
101
+ </script>
102
+
103
+ <template>
104
+ <VCard flat>
105
+ <VToolbar v-if="showTitle">
106
+ <slot name="titleToolbar" :operation="operation">
107
+ <VToolbarTitle>
108
+ <slot name="title" :operation="operation">
109
+ {{ (isCreating) ? "New" : "Edit" }} {{ title }}
110
+ </slot>
111
+ </VToolbarTitle>
112
+ </slot>
113
+ </VToolbar>
114
+ <VCardText>
115
+ <form-pad
116
+ ref="formPadRef"
117
+ v-model="formData"
118
+ :originalData="formDataOriginalValue"
119
+ :readonly="readonly"
120
+ isolated
121
+ v-bind="$attrs"
122
+ >
123
+ <template #default="slotData">
124
+ <slot
125
+ v-bind="slotData"
126
+ :is-creating="isCreating"
127
+ :is-data-change="isDataChange"
128
+ />
129
+ </template>
130
+ </form-pad>
131
+ </VCardText>
132
+ <VCardActions>
133
+ <slot name="action" :operation="operation">
134
+ <VSpacer />
135
+ <VBtn
136
+ color="primary"
137
+ variant="flat"
138
+ :loading="isSaving"
139
+ :disabled="!isDataChange"
140
+ @click="save"
141
+ v-if="!readonly"
142
+ >
143
+ {{ saveCaption }}
144
+ </VBtn>
145
+ <VBtn
146
+ color="error"
147
+ variant="flat"
148
+ :disabled="isSaving"
149
+ @click="cancel"
150
+ >
151
+ {{ cancelCaption }}
152
+ </VBtn>
153
+ </slot>
154
+ </VCardActions>
155
+ </VCard>
156
+ </template>
@@ -1,104 +1,116 @@
1
- <script lang="ts" setup>
2
- import '@vuepic/vue-datepicker/dist/main.css'
3
- import {computed, onMounted, ref} from 'vue'
4
- import {VTextField} from "vuetify/components/VTextField";
5
- import {isArray} from "lodash-es";
6
-
7
- interface IDobPrecision {
8
- yearMonthDay: string
9
- yearMonth: string
10
- year: string
11
- estimated: string
12
- }
13
-
14
- interface Props {
15
- flow?: ('month' | 'year' | 'calendar' | 'time' | 'minutes' | 'hours' | 'seconds')[]
16
- dobPrecisionText?: IDobPrecision
17
- rules?: typeof VTextField['rules']
18
- }
19
-
20
- const props = withDefaults(defineProps<Props>(), {
21
- flow: () => ['year', 'month', 'calendar'],
22
- })
23
-
24
- const emit = defineEmits(['update:modelValue'])
25
-
26
- const modelValue = defineModel<string>()
27
-
28
- const dobPrecisionText = computed(() => {
29
- if (props.dobPrecisionText) return props.dobPrecisionText
30
- else return {
31
- yearMonthDay: 'YMD',
32
- yearMonth: 'YM',
33
- year: 'Y',
34
- estimated: 'EST',
35
- }
36
- })
37
- const dobPrecisionChoice = ref<('yearMonthDay' | 'yearMonth' | 'year' | 'estimated')[]>(['yearMonthDay', 'yearMonth', 'year', 'estimated'])
38
- const dobPrecisionSelected = defineModel<'yearMonthDay' | 'yearMonth' | 'year' | 'estimated'>('dobPrecision')
39
- onMounted(()=>{
40
- if (!dobPrecisionSelected.value) {
41
- dobPrecisionSelected.value = 'yearMonthDay'
42
- }
43
- })
44
-
45
- const dobPrecisionDisplay = computed(() => {
46
- return (dobPrecisionSelected.value) ? dobPrecisionText.value[dobPrecisionSelected.value] : dobPrecisionText.value['yearMonthDay']
47
- })
48
-
49
- const changeDobPrecision = () => {
50
- if (dobPrecisionSelected.value && dobPrecisionChoice.value.includes(dobPrecisionSelected.value)) {
51
- dobPrecisionSelected.value = dobPrecisionChoice.value[(dobPrecisionChoice.value.indexOf(dobPrecisionSelected.value) + 1) % dobPrecisionChoice.value.length]
52
- }
53
- else {
54
- dobPrecisionSelected.value = dobPrecisionChoice.value[0]
55
- }
56
- }
57
-
58
- const computedRules = computed(() => {
59
- if (props.rules && isArray(props.rules)) {
60
- return props.rules.includes("DateHappen") ? props.rules : props.rules.concat("DateHappen")
61
- } else {
62
- return ['DateHappen']
63
- }
64
- })
65
-
66
- const dobFormat = computed(() => {
67
- let displayFormat : string|undefined = undefined
68
- if (dobPrecisionSelected.value=="yearMonth") {
69
- displayFormat = "MMM yyyy"
70
- }
71
- if (dobPrecisionSelected.value=="year") {
72
- displayFormat = "yyyy"
73
- }
74
- if (dobPrecisionSelected.value=="estimated") {
75
- displayFormat = "~ MMM yyyy"
76
- }
77
- return displayFormat
78
- })
79
- </script>
80
-
81
- <template>
82
- <FormDate
83
- v-model="modelValue"
84
- :flow="props.flow"
85
- :format="dobFormat"
86
- :rules="computedRules"
87
- >
88
- <template #append="{ isReadonly, isDisabled, activatorProps, toggleMenuOpen}">
89
- <span
90
- style="cursor: pointer;"
91
- class="font-weight-medium"
92
- @click="(isReadonly.value || isDisabled.value) ? undefined : changeDobPrecision()"
93
- >{{ dobPrecisionDisplay }}</span>
94
- &nbsp;
95
- <v-icon
96
- :disabled="isReadonly.value || isDisabled.value"
97
- v-bind="activatorProps"
98
- @click="toggleMenuOpen('icon')"
99
- >
100
- fa:fa-regular fa-calendar
101
- </v-icon>
102
- </template>
103
- </FormDate>
104
- </template>
1
+ <script lang="ts" setup>
2
+ /**
3
+ * FormBirthdate is a schema-driven form field component that binds model data, renders field UI, and emits normalized updates.
4
+ * This doc block is consumed by vue-docgen for generated API documentation.
5
+ */
6
+ import '@vuepic/vue-datepicker/dist/main.css'
7
+ import {computed, onMounted, ref} from 'vue'
8
+ import {VTextField} from "vuetify/components/VTextField";
9
+ import {isArray} from "lodash-es";
10
+
11
+ interface IDobPrecision {
12
+ yearMonthDay: string
13
+ yearMonth: string
14
+ year: string
15
+ estimated: string
16
+ }
17
+
18
+ interface Props {
19
+ flow?: ('month' | 'year' | 'calendar' | 'time' | 'minutes' | 'hours' | 'seconds')[] // picker navigation flow order shown to users
20
+ dobPrecisionText?: IDobPrecision // Label map for birthdate precision values (day/month/year).
21
+ rules?: typeof VTextField['rules'] // validation rules applied before accepting input
22
+ }
23
+
24
+ /**
25
+ * Public props accepted by FormBirthdate.
26
+ * Document each prop field with intent, defaults, and side effects for clear generated docs.
27
+ */
28
+ const props = withDefaults(defineProps<Props>(), {
29
+ flow: () => ['year', 'month', 'calendar'],
30
+ })
31
+
32
+ /**
33
+ * Custom events emitted by FormBirthdate.
34
+ * Parents can listen to these events to react to user actions and internal state changes.
35
+ */
36
+ const emit = defineEmits(['update:modelValue'])
37
+
38
+ const modelValue = defineModel<string>()
39
+
40
+ const dobPrecisionText = computed(() => {
41
+ if (props.dobPrecisionText) return props.dobPrecisionText
42
+ else return {
43
+ yearMonthDay: 'YMD',
44
+ yearMonth: 'YM',
45
+ year: 'Y',
46
+ estimated: 'EST',
47
+ }
48
+ })
49
+ const dobPrecisionChoice = ref<('yearMonthDay' | 'yearMonth' | 'year' | 'estimated')[]>(['yearMonthDay', 'yearMonth', 'year', 'estimated'])
50
+ const dobPrecisionSelected = defineModel<'yearMonthDay' | 'yearMonth' | 'year' | 'estimated'>('dobPrecision')
51
+ onMounted(()=>{
52
+ if (!dobPrecisionSelected.value) {
53
+ dobPrecisionSelected.value = 'yearMonthDay'
54
+ }
55
+ })
56
+
57
+ const dobPrecisionDisplay = computed(() => {
58
+ return (dobPrecisionSelected.value) ? dobPrecisionText.value[dobPrecisionSelected.value] : dobPrecisionText.value['yearMonthDay']
59
+ })
60
+
61
+ const changeDobPrecision = () => {
62
+ if (dobPrecisionSelected.value && dobPrecisionChoice.value.includes(dobPrecisionSelected.value)) {
63
+ dobPrecisionSelected.value = dobPrecisionChoice.value[(dobPrecisionChoice.value.indexOf(dobPrecisionSelected.value) + 1) % dobPrecisionChoice.value.length]
64
+ }
65
+ else {
66
+ dobPrecisionSelected.value = dobPrecisionChoice.value[0]
67
+ }
68
+ }
69
+
70
+ const computedRules = computed(() => {
71
+ if (props.rules && isArray(props.rules)) {
72
+ return props.rules.includes("DateHappen") ? props.rules : props.rules.concat("DateHappen")
73
+ } else {
74
+ return ['DateHappen']
75
+ }
76
+ })
77
+
78
+ const dobFormat = computed(() => {
79
+ let displayFormat : string|undefined = undefined
80
+ if (dobPrecisionSelected.value=="yearMonth") {
81
+ displayFormat = "MMM yyyy"
82
+ }
83
+ if (dobPrecisionSelected.value=="year") {
84
+ displayFormat = "yyyy"
85
+ }
86
+ if (dobPrecisionSelected.value=="estimated") {
87
+ displayFormat = "~ MMM yyyy"
88
+ }
89
+ return displayFormat
90
+ })
91
+ </script>
92
+
93
+ <template>
94
+ <FormDate
95
+ v-model="modelValue"
96
+ :flow="props.flow"
97
+ :format="dobFormat"
98
+ :rules="computedRules"
99
+ >
100
+ <template #append="{ isReadonly, isDisabled, activatorProps, toggleMenuOpen}">
101
+ <span
102
+ style="cursor: pointer;"
103
+ class="font-weight-medium"
104
+ @click="(isReadonly.value || isDisabled.value) ? undefined : changeDobPrecision()"
105
+ >{{ dobPrecisionDisplay }}</span>
106
+ &nbsp;
107
+ <v-icon
108
+ :disabled="isReadonly.value || isDisabled.value"
109
+ v-bind="activatorProps"
110
+ @click="toggleMenuOpen('icon')"
111
+ >
112
+ fa:fa-regular fa-calendar
113
+ </v-icon>
114
+ </template>
115
+ </FormDate>
116
+ </template>