@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.
- package/README.md +115 -96
- package/dist/module.json +1 -1
- package/dist/module.mjs +1 -0
- package/dist/runtime/components/Alert.vue +58 -54
- package/dist/runtime/components/BarcodeReader.vue +130 -122
- package/dist/runtime/components/ExportCSV.vue +110 -102
- package/dist/runtime/components/FileBtn.vue +79 -67
- package/dist/runtime/components/ImportCSV.vue +151 -139
- package/dist/runtime/components/MrzReader.vue +168 -0
- package/dist/runtime/components/SplitterPanel.vue +67 -59
- package/dist/runtime/components/TabsGroup.vue +39 -31
- package/dist/runtime/components/TextBarcode.vue +66 -54
- package/dist/runtime/components/device/IdCardButton.vue +95 -83
- package/dist/runtime/components/device/IdCardWebSocket.vue +207 -195
- package/dist/runtime/components/device/Scanner.vue +350 -338
- package/dist/runtime/components/dialog/Confirm.vue +112 -100
- package/dist/runtime/components/dialog/Host.vue +88 -84
- package/dist/runtime/components/dialog/Index.vue +84 -72
- package/dist/runtime/components/dialog/Loading.vue +51 -39
- package/dist/runtime/components/dialog/default/Confirm.vue +112 -100
- package/dist/runtime/components/dialog/default/Loading.vue +60 -48
- package/dist/runtime/components/dialog/default/Notify.vue +82 -70
- package/dist/runtime/components/dialog/default/Printing.vue +46 -34
- package/dist/runtime/components/dialog/default/VerifyUser.vue +144 -132
- package/dist/runtime/components/document/Form.vue +50 -42
- package/dist/runtime/components/document/TemplateBuilder.vue +536 -524
- package/dist/runtime/components/form/ActionPad.vue +156 -144
- package/dist/runtime/components/form/Birthdate.vue +116 -104
- package/dist/runtime/components/form/CheckboxGroup.vue +99 -87
- package/dist/runtime/components/form/CodeEditor.vue +45 -37
- package/dist/runtime/components/form/Date.vue +270 -258
- package/dist/runtime/components/form/DateTime.vue +220 -208
- package/dist/runtime/components/form/Dialog.vue +178 -166
- package/dist/runtime/components/form/EditPad.vue +157 -145
- package/dist/runtime/components/form/File.vue +295 -283
- package/dist/runtime/components/form/Hidden.vue +44 -32
- package/dist/runtime/components/form/Iterator.vue +538 -526
- package/dist/runtime/components/form/Login.vue +143 -131
- package/dist/runtime/components/form/Pad.vue +399 -387
- package/dist/runtime/components/form/SignPad.vue +226 -218
- package/dist/runtime/components/form/System.vue +34 -26
- package/dist/runtime/components/form/Table.vue +391 -379
- package/dist/runtime/components/form/TableData.vue +236 -224
- package/dist/runtime/components/form/Time.vue +177 -165
- package/dist/runtime/components/form/images/Capture.vue +245 -237
- package/dist/runtime/components/form/images/Edit.vue +133 -121
- package/dist/runtime/components/form/images/Field.vue +331 -320
- package/dist/runtime/components/form/images/Pad.vue +54 -42
- package/dist/runtime/components/label/Date.vue +37 -29
- package/dist/runtime/components/label/DateAgo.vue +102 -94
- package/dist/runtime/components/label/DateCount.vue +152 -144
- package/dist/runtime/components/label/Field.vue +111 -103
- package/dist/runtime/components/label/FormatMoney.vue +37 -29
- package/dist/runtime/components/label/Mask.vue +46 -38
- package/dist/runtime/components/label/Object.vue +21 -13
- package/dist/runtime/components/master/Autocomplete.vue +89 -81
- package/dist/runtime/components/master/Combobox.vue +88 -80
- package/dist/runtime/components/master/RadioGroup.vue +90 -78
- package/dist/runtime/components/master/Select.vue +70 -62
- package/dist/runtime/components/master/label.vue +55 -47
- package/dist/runtime/components/model/Autocomplete.vue +91 -79
- package/dist/runtime/components/model/Combobox.vue +90 -78
- package/dist/runtime/components/model/Pad.vue +114 -102
- package/dist/runtime/components/model/Select.vue +78 -72
- package/dist/runtime/components/model/Table.vue +370 -358
- package/dist/runtime/components/model/iterator.vue +497 -489
- package/dist/runtime/components/model/label.vue +58 -50
- package/dist/runtime/components/pdf/Print.vue +75 -63
- package/dist/runtime/components/pdf/View.vue +146 -134
- package/dist/runtime/composables/alert.d.ts +4 -0
- package/dist/runtime/composables/api.d.ts +4 -0
- package/dist/runtime/composables/dialog.d.ts +1 -1
- package/dist/runtime/composables/document/templateFormHidden.d.ts +4 -0
- package/dist/runtime/composables/graphql.d.ts +1 -1
- package/dist/runtime/composables/graphqlModel.d.ts +9 -9
- package/dist/runtime/composables/graphqlModelItem.d.ts +7 -7
- package/dist/runtime/composables/graphqlModelOperation.d.ts +6 -6
- package/dist/runtime/composables/localStorageModel.d.ts +4 -0
- package/dist/runtime/composables/lookupList.d.ts +4 -0
- package/dist/runtime/composables/menu.d.ts +4 -0
- package/dist/runtime/composables/useMrzReader.d.ts +48 -0
- package/dist/runtime/composables/useMrzReader.js +423 -0
- package/dist/runtime/composables/useTesseract.d.ts +16 -0
- package/dist/runtime/composables/useTesseract.js +45 -0
- package/dist/runtime/composables/userPermission.d.ts +1 -1
- package/dist/runtime/labs/Calendar.vue +99 -99
- package/dist/runtime/labs/form/EditMobile.vue +152 -152
- package/dist/runtime/labs/form/TextFieldMask.vue +43 -43
- package/dist/runtime/plugins/clientConfig.d.ts +1 -1
- package/dist/runtime/plugins/default.d.ts +1 -1
- package/dist/runtime/plugins/dialogManager.d.ts +1 -1
- package/dist/runtime/plugins/permission.d.ts +1 -1
- package/dist/runtime/types/alert.d.ts +11 -11
- package/dist/runtime/types/clientConfig.d.ts +13 -13
- package/dist/runtime/types/dialogManager.d.ts +35 -35
- package/dist/runtime/types/formDialog.d.ts +5 -5
- package/dist/runtime/types/graphqlOperation.d.ts +23 -23
- package/dist/runtime/types/menu.d.ts +31 -31
- package/dist/runtime/types/modules.d.ts +7 -7
- package/dist/runtime/types/permission.d.ts +13 -13
- package/dist/runtime/utils/asset.d.ts +2 -0
- package/dist/runtime/utils/asset.js +49 -0
- package/package.json +131 -122
- package/scripts/enrich-vue-docs-from-ai.mjs +197 -0
- package/scripts/generate-ai-summary.mjs +321 -0
- package/scripts/generate-composables-md.mjs +129 -0
- package/scripts/postInstall.cjs +70 -70
- package/templates/.codegen/codegen.ts +32 -32
- package/templates/.codegen/plugin-schema-object.js +161 -161
- package/templates/public/tesseract/mrz.traineddata.gz +0 -0
- package/templates/public/tesseract/ocrb.traineddata.gz +0 -0
|
@@ -1,79 +1,91 @@
|
|
|
1
|
-
<script lang="ts" setup>
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
:
|
|
59
|
-
:
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
<template v-
|
|
76
|
-
<
|
|
77
|
-
</template>
|
|
78
|
-
|
|
1
|
+
<script lang="ts" setup>
|
|
2
|
+
/**
|
|
3
|
+
* ModelCombobox connects model metadata to reusable selection, labeling, iterator, or table UI patterns.
|
|
4
|
+
* This doc block is consumed by vue-docgen for generated API documentation.
|
|
5
|
+
*/
|
|
6
|
+
import { VCombobox } from 'vuetify/components/VCombobox'
|
|
7
|
+
import { defineModel, withDefaults } from 'vue'
|
|
8
|
+
import { useLookupList, type LookupProps } from '../../composables/lookupList'
|
|
9
|
+
import { useLocalStorageModel, type PersistSlimProps } from '../../composables/localStorageModel'
|
|
10
|
+
|
|
11
|
+
interface Props extends /* @vue-ignore */ InstanceType<typeof VCombobox['$props']> {}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Public props accepted by ModelCombobox.
|
|
15
|
+
* Document each prop field with intent, defaults, and side effects for clear generated docs.
|
|
16
|
+
*/
|
|
17
|
+
const props = withDefaults(defineProps<Props & LookupProps & PersistSlimProps>(), {
|
|
18
|
+
fuzzy: false, // Enables fuzzy matching when filtering local options.
|
|
19
|
+
showCode: false, // Displays code values alongside labels in option lists.
|
|
20
|
+
cache: false, // Enables cached requests; number values represent cache TTL in milliseconds.
|
|
21
|
+
serverSearch: false, // Uses remote search requests instead of local filtering.
|
|
22
|
+
searchSearchSort: false, // Sorts server-search results based on search relevance.
|
|
23
|
+
serverSearchText: 'Type to search…', // Placeholder/help text shown before server search starts.
|
|
24
|
+
serverSearchLoadingText: 'Searching…', // Status text shown while server search request is running.
|
|
25
|
+
serverSearchDebounce: 500, // Debounce delay in milliseconds before sending server search.
|
|
26
|
+
|
|
27
|
+
statusField: 'statusCode', // Field name that indicates active/inactive status in each item.
|
|
28
|
+
activeValue: 'active', // Value in statusField treated as active/selectable.
|
|
29
|
+
hideInactiveInList: false, // Hides inactive options from the displayed selection list.
|
|
30
|
+
preventSelectingInactive: false, // Blocks selecting inactive options even if present in the dataset.
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Custom events emitted by ModelCombobox.
|
|
35
|
+
* Parents can listen to these events to react to user actions and internal state changes.
|
|
36
|
+
*/
|
|
37
|
+
const emit = defineEmits<{
|
|
38
|
+
(e: 'update:selectedObject', object: any | any[]): void
|
|
39
|
+
}>()
|
|
40
|
+
|
|
41
|
+
const selectedItems = defineModel<any>()
|
|
42
|
+
useLocalStorageModel(selectedItems, props)
|
|
43
|
+
|
|
44
|
+
const {
|
|
45
|
+
searchData,
|
|
46
|
+
computedItems,
|
|
47
|
+
computedFilterKeys,
|
|
48
|
+
computedPlaceholder,
|
|
49
|
+
computedNoDataText,
|
|
50
|
+
isLoading,
|
|
51
|
+
isErrorLoading,
|
|
52
|
+
onUpdateModelValue, // ✅ from composable
|
|
53
|
+
} = useLookupList(props as any, emit, selectedItems)
|
|
54
|
+
</script>
|
|
55
|
+
|
|
56
|
+
<template>
|
|
57
|
+
<v-combobox
|
|
58
|
+
:model-value="selectedItems"
|
|
59
|
+
@update:model-value="onUpdateModelValue"
|
|
60
|
+
v-model:search="searchData"
|
|
61
|
+
v-bind="$attrs"
|
|
62
|
+
:items="computedItems"
|
|
63
|
+
:filter-keys="computedFilterKeys"
|
|
64
|
+
:no-filter="props.fuzzy || props.serverSearch"
|
|
65
|
+
:item-title="props.itemTitle"
|
|
66
|
+
:item-value="props.itemValue"
|
|
67
|
+
:loading="isLoading"
|
|
68
|
+
:placeholder="computedPlaceholder"
|
|
69
|
+
:no-data-text="computedNoDataText"
|
|
70
|
+
:multiple="props.multiple"
|
|
71
|
+
:return-object="false"
|
|
72
|
+
>
|
|
73
|
+
<!-- passthrough slots -->
|
|
74
|
+
<!-- @ts-ignore -->
|
|
75
|
+
<template v-for="(_, name, index) in ($slots as {})" :key="index" #[name]="slotData">
|
|
76
|
+
<slot :name="name" v-bind="((slotData || {}) as object)" />
|
|
77
|
+
</template>
|
|
78
|
+
|
|
79
|
+
<template v-if="!$slots.item" #item="{ props: itemProps, item }">
|
|
80
|
+
<v-list-item v-bind="itemProps" :title="(props.showCode ? item.value + '-' : '') + item.title" />
|
|
81
|
+
</template>
|
|
82
|
+
|
|
83
|
+
<template v-if="!$slots.selection && props.showCode" #selection="{ item }">
|
|
84
|
+
{{ item.value + '-' + item.title }}
|
|
85
|
+
</template>
|
|
86
|
+
|
|
87
|
+
<template v-if="isErrorLoading" #append>
|
|
88
|
+
<v-icon color="error">mdi mdi-alert</v-icon>
|
|
89
|
+
</template>
|
|
90
|
+
</v-combobox>
|
|
79
91
|
</template>
|
|
@@ -1,102 +1,114 @@
|
|
|
1
|
-
<script lang="ts" setup>
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
createItem
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
>
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
1
|
+
<script lang="ts" setup>
|
|
2
|
+
/**
|
|
3
|
+
* ModelPad connects model metadata to reusable selection, labeling, iterator, or table UI patterns.
|
|
4
|
+
* This doc block is consumed by vue-docgen for generated API documentation.
|
|
5
|
+
*/
|
|
6
|
+
import { computed, useTemplateRef, defineExpose } from 'vue'
|
|
7
|
+
import { type GraphqlModelItemProps, useGraphqlModelItem } from '../../composables/graphqlModelItem'
|
|
8
|
+
import type {FormDialogCallback} from '../../types/formDialog'
|
|
9
|
+
import EditPad from '../form/EditPad.vue'
|
|
10
|
+
import {useDialog} from "../../composables/dialog";
|
|
11
|
+
|
|
12
|
+
defineOptions({
|
|
13
|
+
inheritAttrs: false,
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
interface Props extends /* @vue-ignore */ InstanceType<typeof EditPad['$props']> {
|
|
17
|
+
title?: string // Title text displayed in the component header or dialog.
|
|
18
|
+
saveCaption?: string // Label text for the save/confirm action button.
|
|
19
|
+
cancelCaption?: string // Label text for the cancel action button.
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Public props accepted by ModelPad.
|
|
24
|
+
* Document each prop field with intent, defaults, and side effects for clear generated docs.
|
|
25
|
+
*/
|
|
26
|
+
const props = withDefaults(defineProps<Props & GraphqlModelItemProps>(), {
|
|
27
|
+
fields: () => ['*'],
|
|
28
|
+
|
|
29
|
+
saveCaption: 'บันทึก',
|
|
30
|
+
cancelCaption: 'ยกเลิก',
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Custom events emitted by ModelPad.
|
|
35
|
+
* Parents can listen to these events to react to user actions and internal state changes.
|
|
36
|
+
*/
|
|
37
|
+
const emit = defineEmits(['create', 'update'])
|
|
38
|
+
|
|
39
|
+
const { item,
|
|
40
|
+
canCreate, canUpdate,
|
|
41
|
+
createItem, updateItem,
|
|
42
|
+
reload, isLoading } = useGraphqlModelItem(props)
|
|
43
|
+
|
|
44
|
+
const editPad = useTemplateRef<typeof EditPad>("editPadRef")
|
|
45
|
+
|
|
46
|
+
const canSave = computed<boolean>(() => { return ((canCreate.value && editPad.value?.operation?.isCreating?.value) || canUpdate.value) as boolean})
|
|
47
|
+
|
|
48
|
+
const operation : any = computed(()=>{
|
|
49
|
+
return Object.assign({},editPad.value?.operation,{canSave,reload,item})
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
const onCreateItem = (item: Record<string, any>,callback?: FormDialogCallback)=>{
|
|
53
|
+
createItem(item,callback).then(()=>{
|
|
54
|
+
useDialog().notify({message: "Data created successfully",type: 'success',title:"Success"})
|
|
55
|
+
emit("create",item,callback)
|
|
56
|
+
})
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const onUpdateItem = (item: Record<string, any>,callback?: FormDialogCallback)=>{
|
|
60
|
+
updateItem(item,callback).then(()=>{
|
|
61
|
+
useDialog().notify({message: "Data updated successfully",type: 'success',title:"Success"})
|
|
62
|
+
emit("update",item,callback)
|
|
63
|
+
})
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
defineExpose({ operation, formPad: editPad.value?.formPad })
|
|
67
|
+
</script>
|
|
68
|
+
|
|
69
|
+
<template>
|
|
70
|
+
<FormEditPad v-bind="$attrs" :form-data="item" ref="editPadRef" @create="onCreateItem" @update="onUpdateItem">
|
|
71
|
+
<template #titleToolbar>
|
|
72
|
+
<slot name="titleToolbar" :operation="operation">
|
|
73
|
+
<VToolbarTitle>
|
|
74
|
+
<slot name="title" :operation="operation">
|
|
75
|
+
{{ title }}
|
|
76
|
+
<v-icon
|
|
77
|
+
size="small"
|
|
78
|
+
@click="reload"
|
|
79
|
+
>
|
|
80
|
+
mdi mdi-refresh
|
|
81
|
+
</v-icon>
|
|
82
|
+
</slot>
|
|
83
|
+
</VToolbarTitle>
|
|
84
|
+
</slot>
|
|
85
|
+
</template>
|
|
86
|
+
<template #action="slotData">
|
|
87
|
+
<slot name="action" :operation="operation">
|
|
88
|
+
<VSpacer />
|
|
89
|
+
<VBtn
|
|
90
|
+
color="primary"
|
|
91
|
+
variant="flat"
|
|
92
|
+
:loading="isLoading"
|
|
93
|
+
:disabled="!slotData.operation?.isDataChange || !canSave"
|
|
94
|
+
@click="slotData.operation?.save"
|
|
95
|
+
>
|
|
96
|
+
{{ props.saveCaption }}
|
|
97
|
+
</VBtn>
|
|
98
|
+
<VBtn
|
|
99
|
+
color="error"
|
|
100
|
+
variant="flat"
|
|
101
|
+
:disabled="isLoading"
|
|
102
|
+
@click="slotData.operation?.cancel"
|
|
103
|
+
>
|
|
104
|
+
{{ props.cancelCaption }}
|
|
105
|
+
</VBtn>
|
|
106
|
+
</slot>
|
|
107
|
+
</template>
|
|
108
|
+
<template #default="slotData">
|
|
109
|
+
<slot
|
|
110
|
+
v-bind="slotData"
|
|
111
|
+
/>
|
|
112
|
+
</template>
|
|
113
|
+
</FormEditPad>
|
|
114
|
+
</template>
|
|
@@ -1,73 +1,79 @@
|
|
|
1
|
-
<script lang="ts" setup>
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
:
|
|
51
|
-
:
|
|
52
|
-
|
|
53
|
-
:
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
1
|
+
<script lang="ts" setup>
|
|
2
|
+
/**
|
|
3
|
+
* ModelSelect connects model metadata to reusable selection, labeling, iterator, or table UI patterns.
|
|
4
|
+
* This doc block is consumed by vue-docgen for generated API documentation.
|
|
5
|
+
*/
|
|
6
|
+
import { VSelect } from 'vuetify/components/VSelect'
|
|
7
|
+
import { defineModel, withDefaults } from 'vue'
|
|
8
|
+
import { useLookupList, type StaticLookupProps } from '../../composables/lookupList'
|
|
9
|
+
import { useLocalStorageModel, type PersistSlimProps } from '../../composables/localStorageModel'
|
|
10
|
+
|
|
11
|
+
interface Props extends /* @vue-ignore */ InstanceType<typeof VSelect['$props']> {}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Public props accepted by ModelSelect.
|
|
15
|
+
* Document each prop field with intent, defaults, and side effects for clear generated docs.
|
|
16
|
+
*/
|
|
17
|
+
const props = withDefaults(defineProps<Props & StaticLookupProps & PersistSlimProps>(), {
|
|
18
|
+
fuzzy: false, // Enables fuzzy matching when filtering local options.
|
|
19
|
+
showCode: false, // Displays code values alongside labels in option lists.
|
|
20
|
+
cache: false, // Enables cached requests; number values represent cache TTL in milliseconds.
|
|
21
|
+
|
|
22
|
+
statusField: 'statusCode', // Field name that indicates active/inactive status in each item.
|
|
23
|
+
activeValue: 'active', // Value in statusField treated as active/selectable.
|
|
24
|
+
hideInactiveInList: false, // Hides inactive options from the displayed selection list.
|
|
25
|
+
preventSelectingInactive: false, // Blocks selecting inactive options even if present in the dataset.
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Custom events emitted by ModelSelect.
|
|
30
|
+
* Parents can listen to these events to react to user actions and internal state changes.
|
|
31
|
+
*/
|
|
32
|
+
const emit = defineEmits<{
|
|
33
|
+
(e: 'update:selectedObject', object: any | any[]): void
|
|
34
|
+
}>()
|
|
35
|
+
|
|
36
|
+
const selectedItems = defineModel<any>()
|
|
37
|
+
useLocalStorageModel(selectedItems, props)
|
|
38
|
+
|
|
39
|
+
const {
|
|
40
|
+
computedItems,
|
|
41
|
+
computedNoDataText,
|
|
42
|
+
isLoading,
|
|
43
|
+
isErrorLoading,
|
|
44
|
+
onUpdateModelValue,
|
|
45
|
+
} = useLookupList(props as any, emit, selectedItems)
|
|
46
|
+
</script>
|
|
47
|
+
|
|
48
|
+
<template>
|
|
49
|
+
<v-select
|
|
50
|
+
:model-value="selectedItems"
|
|
51
|
+
@update:model-value="onUpdateModelValue"
|
|
52
|
+
v-bind="$attrs"
|
|
53
|
+
:items="computedItems"
|
|
54
|
+
:item-title="props.itemTitle"
|
|
55
|
+
:item-value="props.itemValue"
|
|
56
|
+
:loading="isLoading"
|
|
57
|
+
:no-data-text="computedNoDataText"
|
|
58
|
+
:multiple="props.multiple"
|
|
59
|
+
:return-object="false"
|
|
60
|
+
>
|
|
61
|
+
<!-- passthrough slots -->
|
|
62
|
+
<!-- @ts-ignore -->
|
|
63
|
+
<template v-for="(_, name, index) in ($slots as {})" :key="index" #[name]="slotData">
|
|
64
|
+
<slot :name="name" v-bind="((slotData || {}) as object)" />
|
|
65
|
+
</template>
|
|
66
|
+
|
|
67
|
+
<template v-if="!$slots.item" #item="{ props: itemProps, item }">
|
|
68
|
+
<v-list-item v-bind="itemProps" :title="(props.showCode ? item.value + '-' : '') + item.title" />
|
|
69
|
+
</template>
|
|
70
|
+
|
|
71
|
+
<template v-if="!$slots.selection && props.showCode" #selection="{ item }">
|
|
72
|
+
{{ item.value + '-' + item.title }}
|
|
73
|
+
</template>
|
|
74
|
+
|
|
75
|
+
<template v-if="isErrorLoading" #append>
|
|
76
|
+
<v-icon color="error">mdi mdi-alert</v-icon>
|
|
77
|
+
</template>
|
|
78
|
+
</v-select>
|
|
73
79
|
</template>
|