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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pgo-ui",
3
- "version": "1.0.21",
3
+ "version": "1.0.22",
4
4
  "description": "A Vue 3 component library with PGO design system",
5
5
  "private": false,
6
6
  "type": "module",
@@ -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-6 py-4' },
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
- <Button
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 v-if="loading" #append>
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 py-4 ', gridColsMap[group.numberOfColumns] || gridColsMap[2], 'gap-2']">
26
- <div v-if="group.title" :class="['absolute top-0 -translate-y-1/2 bg-white px-2 text-sm font-semibold mb-2', lang === 'dv' ? 'right-4' : 'left-4']">
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 {
@@ -1,5 +1,6 @@
1
1
  <template>
2
- <form @submit.prevent="handleSubmit">
2
+ <form @submit.prevent="handleSubmit" enctype="multipart/form-data">
3
+
3
4
  <slot
4
5
  :isValid="isValid"
5
6
  :validate="validate"
@@ -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: 'vts-bg-surface-elevated vts-text vts-transition-colors vts-hover-bg-surface',
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
- <!-- <Card >
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
- <Toolbar
32
- v-if="items.componentSettings?.toolbar"
33
- :elevation="false"
34
- color="none"
35
- variant="contained"
36
- :title="useLanguageSelected(items.componentSettings?.toolbar?.title)"
37
- :quick-filters="items.componentSettings?.toolbar?.filters"
38
- :filter-section="items.componentSettings?.filterSection ? true : false"
39
- :filter-values="quickFilterValues"
40
- :filter-section-values="filterSectionValues"
41
- @update:filter-values="quickFilterValues = $event"
42
- @show-filter-section="showFilters = !showFilters"
43
- @search="handleSearch"
44
- @refresh="handleRefresh"
45
- @create-button="handleCreateButton"
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
- <FilterSection
64
- dir=""
65
- grid
66
- :grid-columns="2"
67
- v-model="filterSectionValues"
68
- rounded=""
69
- :filters="items.componentSettings.filterSection.filters"
70
- :buttons="items.componentSettings.filterSection.buttons"
71
- @search="handleSearch"
72
- @submit="handleSearch"
73
- @close="showFilters = false"
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
- <DataTable
80
- v-if="props.items?.componentSettings?.table?.headers.length > 0"
81
- dir=""
82
- :items="tableData.data"
83
- :settings="props.items?.componentSettings?.table"
84
- :server-side-options="options"
85
- :loading="tableLoading"
86
- title=""
87
- :lang="lang"
88
- @update:options="handleOptionsUpdate"
89
- :show-actions="items.componentSettings?.table?.showActions ?? true"
90
- :show-view="items.componentSettings?.table?.actions?.showView ?? true"
91
- :show-edit="items.componentSettings?.table?.actions?.showEdit ?? true"
92
- :show-delete="items.componentSettings?.table?.actions?.showDelete ?? true"
93
- :inline-edit="items.componentSettings?.table?.showInlineEdit ?? true"
94
- @inline-update="handleInlineUpdate"
95
- @view="handleView"
96
- @edit="handleEdit"
97
- @delete="handleDelete"
98
- />
99
- <div v-else class="p-8">
100
- <p>No headers found</p>
101
- <!-- <pre>{{ JSON.stringify(items.componentSettings, null, 2) }}</pre> -->
102
- </div>
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
- <ConfirmationModal
112
- v-model="showConfirmation"
113
- :item="DeleteItem"
114
- :title="items.componentSettings?.table?.delete?.title || 'Delete Confirmation'"
115
- :subtitle="items.componentSettings?.table?.delete?.subtitle || 'Are you sure you want to delete this item?'"
116
- type="warning"
117
- @confirm="handleDeleteConfirm"
118
- @cancel="showConfirmation = false; DeleteItem = null"
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
- <p><b>{{ useLanguageSelected(message) }}:</b> {{ DeleteItem[key] }}</p>
126
- </div>
127
- </ConfirmationModal>
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) => {
@@ -0,0 +1,3 @@
1
+ <template>
2
+ this is a custom slot
3
+ </template>