pgo-ui 1.0.21 → 1.0.22
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/dist/index.es.js +3190 -3179
- package/dist/index.umd.js +33 -33
- package/dist/pgo-ui.css +1 -1
- package/package.json +1 -1
- package/src/components/pgo/Card.vue +2 -2
- package/src/components/pgo/SearchBox.vue +14 -13
- package/src/components/pgo/base/Base.vue +1 -0
- package/src/components/pgo/forms/DynamicForm.vue +14 -10
- package/src/components/pgo/forms/Form.vue +2 -1
- package/src/pgo-components/lib/componentConfig.js +1 -1
- package/src/pgo-components/pages/ListView.vue +95 -94
- package/src/pgo-components/pages/customSlot.vue +3 -0
package/package.json
CHANGED
|
@@ -90,12 +90,12 @@ const { language } = inject('i18n')
|
|
|
90
90
|
|
|
91
91
|
//footer props
|
|
92
92
|
footerClass: { type: String, default: '' },
|
|
93
|
-
footerBg: { type: String, default: '' },
|
|
93
|
+
footerBg: { type: String, default: 'vts-bg-surface' },
|
|
94
94
|
footerText: { type: String, default: 'text-input-text' },
|
|
95
95
|
footerTextSize: { type: String, default: '' },
|
|
96
96
|
footerBd: { type: String, default: '' },
|
|
97
97
|
footerMargin: { type: String, default: '' },
|
|
98
|
-
footerPadding: { type: String, default: 'px-
|
|
98
|
+
footerPadding: { type: String, default: 'px-4 py-4' },
|
|
99
99
|
|
|
100
100
|
})
|
|
101
101
|
|
|
@@ -45,28 +45,29 @@
|
|
|
45
45
|
@focus="handleFocus"
|
|
46
46
|
@blur="handleBlur"
|
|
47
47
|
/>
|
|
48
|
-
|
|
49
|
-
type="button"
|
|
50
|
-
label="buttons.search"
|
|
51
|
-
variant="tonal"
|
|
52
|
-
prepend-icon="magnifying-glass"
|
|
53
|
-
size="xs"
|
|
54
|
-
icon-type="soild"
|
|
55
|
-
:icon-rotate="props.iconRotate ? props.iconRotate : (computedLang === 'dv' ? 90 : 0)"
|
|
56
|
-
:disabled="disabled || loading"
|
|
57
|
-
@click="handleSubmit"
|
|
58
|
-
/>
|
|
48
|
+
|
|
59
49
|
<!-- :icon-rotate="props.iconRotate ?? (computedLang === 'dv' ? 180 : 0)" -->
|
|
60
50
|
</div>
|
|
61
51
|
</template>
|
|
62
52
|
|
|
63
53
|
|
|
64
54
|
<!-- Loading spinner in append slot -->
|
|
65
|
-
<template
|
|
66
|
-
<svg class="animate-spin h-4 w-4" fill="none" viewBox="0 0 24 24">
|
|
55
|
+
<template #append>
|
|
56
|
+
<svg v-if="loading" class="animate-spin h-4 w-4" fill="none" viewBox="0 0 24 24">
|
|
67
57
|
<circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>
|
|
68
58
|
<path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 714 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>
|
|
69
59
|
</svg>
|
|
60
|
+
<Button
|
|
61
|
+
type="button"
|
|
62
|
+
label="buttons.search"
|
|
63
|
+
variant="tonal"
|
|
64
|
+
prepend-icon="magnifying-glass"
|
|
65
|
+
size="xs"
|
|
66
|
+
icon-type="soild"
|
|
67
|
+
:icon-rotate="props.iconRotate ? props.iconRotate : (computedLang === 'dv' ? 90 : 0)"
|
|
68
|
+
:disabled="disabled || loading"
|
|
69
|
+
@click="handleSubmit"
|
|
70
|
+
/>
|
|
70
71
|
</template>
|
|
71
72
|
</Base>
|
|
72
73
|
</div>
|
|
@@ -46,6 +46,7 @@
|
|
|
46
46
|
<HeroIcon :size="iconSizes[size]" :name="append" :type="iconType == 'outline' ? 'outline' : 'solid'" />
|
|
47
47
|
</slot>
|
|
48
48
|
</div>
|
|
49
|
+
<!-- <slot name="" -->
|
|
49
50
|
</div>
|
|
50
51
|
</div>
|
|
51
52
|
<div v-if="messagesToShow.length" :class="['.vts-mt-1 text-xs', selectLanguage === 'dv' ? 'text-right' : 'text-left', 'text-input-text']">
|
|
@@ -3,11 +3,12 @@
|
|
|
3
3
|
v-model="open"
|
|
4
4
|
persistent
|
|
5
5
|
padding="p-3"
|
|
6
|
+
:bg="bg"
|
|
6
7
|
>
|
|
7
8
|
<Banner
|
|
8
9
|
v-if="form?.banner"
|
|
9
10
|
v-bind="form?.banner"
|
|
10
|
-
bannerClass="mb-4"
|
|
11
|
+
bannerClass="mb-4"
|
|
11
12
|
/>
|
|
12
13
|
<Form
|
|
13
14
|
v-model="valid"
|
|
@@ -19,11 +20,12 @@
|
|
|
19
20
|
type="hidden"
|
|
20
21
|
/>
|
|
21
22
|
<!-- Render grouped fields -->
|
|
23
|
+
<!-- A0111904 -->
|
|
22
24
|
<template v-if="form.groups">
|
|
23
25
|
<template v-for="(group, id) in form.groups" :key="id">
|
|
24
26
|
<div v-if="shouldShowGroup(group)" class="mb-4">
|
|
25
|
-
<div :class="['relative grid border border-gray-300 rounded px-4
|
|
26
|
-
<div v-if="group.title" :class="['absolute top-0 -translate-y-1/2 bg-
|
|
27
|
+
<div :class="['relative grid border border-gray-300 rounded px-4 pt-6 pb-4', bg, gridColsMap[group.numberOfColumns] || gridColsMap[2], 'gap-2']">
|
|
28
|
+
<div v-if="group.title" :class="['absolute top-0 -translate-y-1/2 bg-inherit px-2 text-sm font-semibold mb-2', lang === 'dv' ? 'right-4' : 'left-4']">
|
|
27
29
|
{{ group.title ? useLanguageSelected(group.title, lang) : '' }}
|
|
28
30
|
</div>
|
|
29
31
|
<template
|
|
@@ -90,7 +92,7 @@
|
|
|
90
92
|
</div>
|
|
91
93
|
</Form>
|
|
92
94
|
<template #footer>
|
|
93
|
-
<div class="flex justify-end gap-2">
|
|
95
|
+
<div class="flex justify-end gap-2 ">
|
|
94
96
|
<Button v-if="mode == 'edit'"
|
|
95
97
|
label="buttons.edit"
|
|
96
98
|
color="primary"
|
|
@@ -148,7 +150,9 @@
|
|
|
148
150
|
lang:{ type: String, default: 'dv' },
|
|
149
151
|
crudLink:{ type: String },
|
|
150
152
|
editItemId: { type: [String, Number], default: null },
|
|
151
|
-
mode: { type: String, default: 'create', enum: ['create', 'edit'] }
|
|
153
|
+
mode: { type: String, default: 'create', enum: ['create', 'edit'] },
|
|
154
|
+
|
|
155
|
+
bg: { type: String, default: 'bg-background-color' },
|
|
152
156
|
});
|
|
153
157
|
|
|
154
158
|
const api = inject('api');
|
|
@@ -234,17 +238,17 @@
|
|
|
234
238
|
formData[field.key] = false;
|
|
235
239
|
break;
|
|
236
240
|
case 'array':
|
|
237
|
-
formData[field.key] =
|
|
241
|
+
formData[field.key] = null;
|
|
238
242
|
break;
|
|
239
243
|
case 'object':
|
|
240
|
-
formData[field.key] =
|
|
244
|
+
formData[field.key] = null;
|
|
241
245
|
break;
|
|
242
246
|
case 'string':
|
|
243
247
|
default:
|
|
244
248
|
if (field.inputType === 'checkbox') {
|
|
245
249
|
formData[field.key] = false; // Default checkboxes to false
|
|
246
250
|
} else {
|
|
247
|
-
formData[field.key] =
|
|
251
|
+
formData[field.key] = null;
|
|
248
252
|
}
|
|
249
253
|
break;
|
|
250
254
|
}
|
|
@@ -754,7 +758,8 @@
|
|
|
754
758
|
|
|
755
759
|
} catch (error) {
|
|
756
760
|
console.error('Form submission error:', error);
|
|
757
|
-
|
|
761
|
+
const errorMessage = error.response?.data?.message || 'Form submission failed';
|
|
762
|
+
snackbar?.show({ message: errorMessage, variant: 'error' });
|
|
758
763
|
if (error.response?.status === 422 || error.response?.data?.errors) {
|
|
759
764
|
const backendErrors = error.response.data.errors;
|
|
760
765
|
|
|
@@ -765,7 +770,6 @@
|
|
|
765
770
|
}
|
|
766
771
|
|
|
767
772
|
const errorMessage = error.response.data.message || 'Validation failed';
|
|
768
|
-
snackbar?.show({ message: errorMessage, variant: 'error' });
|
|
769
773
|
emit('submit:error', error);
|
|
770
774
|
}
|
|
771
775
|
} finally {
|
|
@@ -62,7 +62,7 @@ export const colorMap = {
|
|
|
62
62
|
tonal: 'bg-blue-50 vts-text-info vts-transition-colors hover:bg-blue-100'
|
|
63
63
|
},
|
|
64
64
|
gray: {
|
|
65
|
-
contained: '
|
|
65
|
+
contained: 'bg-gray-200 text-gray-700 vts-transition-colors hover:bg-gray-300',
|
|
66
66
|
outlined: 'vts-border vts-border-color vts-text-secondary vts-bg-transparent vts-transition-colors vts-hover-bg-surface',
|
|
67
67
|
text: 'vts-text-secondary vts-bg-transparent vts-transition-colors vts-hover-bg-surface',
|
|
68
68
|
tonal: 'vts-bg-border-light vts-text-secondary vts-transition-colors vts-hover-bg-surface'
|
|
@@ -1,24 +1,7 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div class="mx-auto m-4">
|
|
3
3
|
<template v-if="items">
|
|
4
|
-
|
|
5
|
-
<SearchBox
|
|
6
|
-
v-model="search"
|
|
7
|
-
label="Find Users"
|
|
8
|
-
/>
|
|
9
|
-
</Card> -->
|
|
10
|
-
<DynamicForm
|
|
11
|
-
v-if="showDynamicForm && items.componentSettings?.form"
|
|
12
|
-
:form="items.componentSettings?.form"
|
|
13
|
-
rounded="sm"
|
|
14
|
-
:title="useLanguageSelected(formMode == 'edit' ? items.componentSettings?.form?.editTitle : items.componentSettings?.form?.createTitle) || ''"
|
|
15
|
-
@close="showDynamicForm = false"
|
|
16
|
-
@submit:success="handleFormSubmit"
|
|
17
|
-
:lang="lang"
|
|
18
|
-
:crud-link="props.items?.componentSettings?.meta?.crudLink"
|
|
19
|
-
:edit-item-id="editItemId"
|
|
20
|
-
:mode="formMode"
|
|
21
|
-
/>
|
|
4
|
+
<slot name="topSlot" />
|
|
22
5
|
|
|
23
6
|
<!-- <hr class="border-input-border my-2" /> -->
|
|
24
7
|
<Card
|
|
@@ -28,22 +11,24 @@
|
|
|
28
11
|
margin="mb-4"
|
|
29
12
|
shadow="shadow-lg"
|
|
30
13
|
>
|
|
31
|
-
<
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
14
|
+
<slot name="toolbar">
|
|
15
|
+
<Toolbar
|
|
16
|
+
v-if="items.componentSettings?.toolbar"
|
|
17
|
+
:elevation="false"
|
|
18
|
+
color="none"
|
|
19
|
+
variant="contained"
|
|
20
|
+
:title="useLanguageSelected(items.componentSettings?.toolbar?.title)"
|
|
21
|
+
:quick-filters="items.componentSettings?.toolbar?.filters"
|
|
22
|
+
:filter-section="items.componentSettings?.filterSection ? true : false"
|
|
23
|
+
:filter-values="quickFilterValues"
|
|
24
|
+
:filter-section-values="filterSectionValues"
|
|
25
|
+
@update:filter-values="quickFilterValues = $event"
|
|
26
|
+
@show-filter-section="showFilters = !showFilters"
|
|
27
|
+
@search="handleSearch"
|
|
28
|
+
@refresh="handleRefresh"
|
|
29
|
+
@create-button="handleCreateButton"
|
|
30
|
+
/>
|
|
31
|
+
</slot>
|
|
47
32
|
<Transition
|
|
48
33
|
enter-active-class="transition-all duration-300 ease-out"
|
|
49
34
|
enter-from-class="transform -translate-y-4 opacity-0"
|
|
@@ -60,46 +45,49 @@
|
|
|
60
45
|
bg=""
|
|
61
46
|
margin="mt-2"
|
|
62
47
|
>
|
|
63
|
-
<
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
48
|
+
<slot name="filterSection">
|
|
49
|
+
<FilterSection
|
|
50
|
+
dir=""
|
|
51
|
+
grid
|
|
52
|
+
:grid-columns="2"
|
|
53
|
+
v-model="filterSectionValues"
|
|
54
|
+
rounded=""
|
|
55
|
+
:filters="items.componentSettings.filterSection.filters"
|
|
56
|
+
:buttons="items.componentSettings.filterSection.buttons"
|
|
57
|
+
@search="handleSearch"
|
|
58
|
+
@submit="handleSearch"
|
|
59
|
+
@close="showFilters = false"
|
|
60
|
+
/>
|
|
61
|
+
</slot>
|
|
76
62
|
</Card>
|
|
77
63
|
</Transition>
|
|
78
64
|
</Card>
|
|
79
|
-
<
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
<
|
|
101
|
-
|
|
102
|
-
|
|
65
|
+
<slot name="table" >
|
|
66
|
+
<DataTable
|
|
67
|
+
v-if="props.items?.componentSettings?.table?.headers.length > 0"
|
|
68
|
+
dir=""
|
|
69
|
+
:items="tableData.data"
|
|
70
|
+
:settings="props.items?.componentSettings?.table"
|
|
71
|
+
:server-side-options="options"
|
|
72
|
+
:loading="tableLoading"
|
|
73
|
+
title=""
|
|
74
|
+
:lang="lang"
|
|
75
|
+
@update:options="handleOptionsUpdate"
|
|
76
|
+
:show-actions="items.componentSettings?.table?.showActions ?? true"
|
|
77
|
+
:show-view="items.componentSettings?.table?.actions?.showView ?? true"
|
|
78
|
+
:show-edit="items.componentSettings?.table?.actions?.showEdit ?? true"
|
|
79
|
+
:show-delete="items.componentSettings?.table?.actions?.showDelete ?? true"
|
|
80
|
+
:inline-edit="items.componentSettings?.table?.showInlineEdit ?? true"
|
|
81
|
+
@inline-update="handleInlineUpdate"
|
|
82
|
+
@view="handleView"
|
|
83
|
+
@edit="handleEdit"
|
|
84
|
+
@delete="handleDelete"
|
|
85
|
+
/>
|
|
86
|
+
<div v-else class="p-8">
|
|
87
|
+
<p>No headers found</p>
|
|
88
|
+
<!-- <pre>{{ JSON.stringify(items.componentSettings, null, 2) }}</pre> -->
|
|
89
|
+
</div>
|
|
90
|
+
</slot>
|
|
103
91
|
|
|
104
92
|
|
|
105
93
|
</template>
|
|
@@ -107,24 +95,42 @@
|
|
|
107
95
|
<p>No data</p>
|
|
108
96
|
</div>
|
|
109
97
|
|
|
98
|
+
<!-- FORM -->
|
|
99
|
+
<slot name="form">
|
|
100
|
+
<DynamicForm
|
|
101
|
+
v-if="showDynamicForm && items.componentSettings?.form"
|
|
102
|
+
:form="items.componentSettings?.form"
|
|
103
|
+
rounded="sm"
|
|
104
|
+
:title="useLanguageSelected(formMode == 'edit' ? items.componentSettings?.form?.editTitle : items.componentSettings?.form?.createTitle) || ''"
|
|
105
|
+
@close="showDynamicForm = false"
|
|
106
|
+
@submit:success="handleFormSubmit"
|
|
107
|
+
:lang="lang"
|
|
108
|
+
:crud-link="props.items?.componentSettings?.meta?.crudLink"
|
|
109
|
+
:edit-item-id="editItemId"
|
|
110
|
+
:mode="formMode"
|
|
111
|
+
/>
|
|
112
|
+
</slot>
|
|
110
113
|
<!-- Delete Confirmation Modal -->
|
|
111
|
-
<
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
<div
|
|
121
|
-
v-if="items.componentSettings?.table?.delete?.message"
|
|
122
|
-
v-for="(message, key) in items.componentSettings?.table?.delete?.message"
|
|
123
|
-
:key="key"
|
|
114
|
+
<slot name="delete">
|
|
115
|
+
<ConfirmationModal
|
|
116
|
+
v-model="showConfirmation"
|
|
117
|
+
:item="DeleteItem"
|
|
118
|
+
:title="items.componentSettings?.table?.delete?.title || 'Delete Confirmation'"
|
|
119
|
+
:subtitle="items.componentSettings?.table?.delete?.subtitle || 'Are you sure you want to delete this item?'"
|
|
120
|
+
type="warning"
|
|
121
|
+
@confirm="handleDeleteConfirm"
|
|
122
|
+
@cancel="showConfirmation = false; DeleteItem = null"
|
|
124
123
|
>
|
|
125
|
-
<
|
|
126
|
-
|
|
127
|
-
|
|
124
|
+
<div
|
|
125
|
+
v-if="items.componentSettings?.table?.delete?.message"
|
|
126
|
+
v-for="(message, key) in items.componentSettings?.table?.delete?.message"
|
|
127
|
+
:key="key"
|
|
128
|
+
>
|
|
129
|
+
<p><b>{{ useLanguageSelected(message) }}:</b> {{ DeleteItem[key] }}</p>
|
|
130
|
+
</div>
|
|
131
|
+
</ConfirmationModal>
|
|
132
|
+
</slot>
|
|
133
|
+
<slot name="bottomSlot" />
|
|
128
134
|
</div>
|
|
129
135
|
</template>
|
|
130
136
|
|
|
@@ -154,7 +160,7 @@ const props = defineProps({
|
|
|
154
160
|
|
|
155
161
|
const tableLoading = ref(props.loading)
|
|
156
162
|
|
|
157
|
-
const emit = defineEmits(['update:queryParams'])
|
|
163
|
+
const emit = defineEmits(['update:queryParams', 'items'])
|
|
158
164
|
|
|
159
165
|
const showFilters = ref(false)
|
|
160
166
|
// const searchbar = ref({})
|
|
@@ -227,14 +233,9 @@ watch(() => props.items, (newItems) => {
|
|
|
227
233
|
}
|
|
228
234
|
}
|
|
229
235
|
}
|
|
236
|
+
emit('items', newItems)
|
|
230
237
|
}, { immediate: true, deep: true })
|
|
231
238
|
|
|
232
|
-
// const headers = computed(() => {
|
|
233
|
-
// const headersFromTable = props.items?.componentSettings?.table?.headers
|
|
234
|
-
// const headersFromSettings = props.items?.componentSettings?.headers
|
|
235
|
-
|
|
236
|
-
// return headersFromTable || headersFromSettings || []
|
|
237
|
-
// })
|
|
238
239
|
|
|
239
240
|
// Handle options update from DataTable
|
|
240
241
|
const handleOptionsUpdate = (newOptions) => {
|