@usssa/component-library 1.0.0-alpha.1 → 1.0.0-alpha.100

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 (128) hide show
  1. package/README.md +18 -37
  2. package/package.json +17 -6
  3. package/src/assets/files.png +0 -0
  4. package/src/assets/logo.svg +19 -0
  5. package/src/assets/no-result.png +0 -0
  6. package/src/assets/quasar-logo-vertical.svg +15 -0
  7. package/src/components/ComponentLink.vue +26 -0
  8. package/src/components/core/UAvatar.vue +179 -0
  9. package/src/components/core/UAvatarGroup.vue +120 -0
  10. package/src/components/core/UBadgeStd.vue +91 -0
  11. package/src/components/core/UBannerStd.vue +142 -0
  12. package/src/components/core/UBreadCrumbs.vue +67 -0
  13. package/src/components/core/UBtnIcon.vue +158 -0
  14. package/src/components/core/UBtnStd.vue +129 -0
  15. package/src/components/core/UBtnToggle.vue +68 -0
  16. package/src/components/core/UCheckboxStd.vue +95 -0
  17. package/src/components/core/UChip.vue +251 -0
  18. package/src/components/core/UDialogStd.vue +244 -0
  19. package/src/components/core/UDrawer.vue +235 -0
  20. package/src/components/core/UInnerLoader.vue +58 -0
  21. package/src/components/core/UInputAddressLookup.vue +470 -0
  22. package/src/components/core/UInputPhoneStd.vue +299 -0
  23. package/src/components/core/UInputTextStd.vue +299 -0
  24. package/src/components/core/UInputTypeaheadAdvanceSearch.vue +59 -0
  25. package/src/components/core/UMenuButtonStd.vue +274 -0
  26. package/src/components/core/UMenuDropdown.vue +72 -0
  27. package/src/components/core/UMenuDropdownAdvancedSearch.vue +301 -0
  28. package/src/components/core/UMenuItem.vue +134 -0
  29. package/src/components/core/UMenuSearch.vue +752 -0
  30. package/src/components/core/UMultiSelectStd.vue +274 -0
  31. package/src/components/core/UPagination.vue +104 -0
  32. package/src/components/core/URadioBtn.vue +116 -0
  33. package/src/components/core/URadioStd.vue +62 -0
  34. package/src/components/core/USelectStd.vue +250 -0
  35. package/src/components/core/UTabBtnStd.vue +176 -0
  36. package/src/components/core/UTable/UTable.vue +93 -0
  37. package/src/components/core/UTable/UTd.vue +63 -0
  38. package/src/components/core/UTable/UTh.vue +48 -0
  39. package/src/components/core/UTable/UTr.vue +20 -0
  40. package/src/components/core/UTableStd.vue +1003 -0
  41. package/src/components/core/UTabsStd.vue +111 -0
  42. package/src/components/core/UToggleStd.vue +159 -0
  43. package/src/components/core/UToolbar.vue +94 -0
  44. package/src/components/core/UTooltip.vue +73 -0
  45. package/src/components/core/UUploader.vue +497 -0
  46. package/src/components/index.js +75 -0
  47. package/src/composables/useNotify.js +79 -0
  48. package/src/composables/useOverlayLoader.js +23 -0
  49. package/src/css/app.sass +159 -0
  50. package/src/css/colors.sass +101 -0
  51. package/src/css/media.sass +1 -0
  52. package/src/css/quasar.variables.sass +121 -0
  53. package/src/css/typography.sass +0 -0
  54. package/src/css/vars/colors.variables.sass +126 -0
  55. package/src/utils/data.ts +146 -0
  56. package/dist/spa/assets/Avatar.45667392.js +0 -9
  57. package/dist/spa/assets/AvatarGroup.99557443.js +0 -9
  58. package/dist/spa/assets/AvatarGroup.bb4cd03a.css +0 -1
  59. package/dist/spa/assets/BadgeStd.ee4129c5.js +0 -6
  60. package/dist/spa/assets/BannerPage.6c6a98c4.js +0 -10
  61. package/dist/spa/assets/BannerPage.d195fcac.css +0 -1
  62. package/dist/spa/assets/BtnIcon.89e50d2e.css +0 -1
  63. package/dist/spa/assets/BtnIcon.934f8c5b.js +0 -10
  64. package/dist/spa/assets/BtnStd.95fc4510.js +0 -11
  65. package/dist/spa/assets/CheckBox.3c204a4b.css +0 -1
  66. package/dist/spa/assets/CheckBox.fbc0bd1a.js +0 -7
  67. package/dist/spa/assets/Chip.49ffc857.js +0 -11
  68. package/dist/spa/assets/Chip.74acaa33.css +0 -1
  69. package/dist/spa/assets/ComponentBase.1ae19b7e.js +0 -1
  70. package/dist/spa/assets/ErrorNotFound.6cccfaee.js +0 -1
  71. package/dist/spa/assets/IndexPage.17d09b76.js +0 -1
  72. package/dist/spa/assets/InputText.19c0d7d1.css +0 -1
  73. package/dist/spa/assets/InputText.3fcd97a4.js +0 -20
  74. package/dist/spa/assets/KFOkCnqEu92Fr1MmgVxIIzQ.34e9582c.woff +0 -0
  75. package/dist/spa/assets/KFOlCnqEu92Fr1MmEU9fBBc-.9ce7f3ac.woff +0 -0
  76. package/dist/spa/assets/KFOlCnqEu92Fr1MmSU5fBBc-.bf14c7d7.woff +0 -0
  77. package/dist/spa/assets/KFOlCnqEu92Fr1MmWUlfBBc-.e0fd57c0.woff +0 -0
  78. package/dist/spa/assets/KFOlCnqEu92Fr1MmYUtfBBc-.f6537e32.woff +0 -0
  79. package/dist/spa/assets/KFOmCnqEu92Fr1Mu4mxM.f2abf7fb.woff +0 -0
  80. package/dist/spa/assets/MainLayout.912bb0f8.js +0 -1
  81. package/dist/spa/assets/MultiSelectStd.644b108c.js +0 -17
  82. package/dist/spa/assets/MultiSelectStd.c7af49eb.css +0 -1
  83. package/dist/spa/assets/QAvatar.5940a79e.js +0 -1
  84. package/dist/spa/assets/QCheckbox.48b43f7d.js +0 -1
  85. package/dist/spa/assets/QPage.ca395ec4.js +0 -1
  86. package/dist/spa/assets/QRadio.0a7f5e2c.js +0 -1
  87. package/dist/spa/assets/QResizeObserver.30c3566c.js +0 -1
  88. package/dist/spa/assets/QSelect.a40eb786.js +0 -1
  89. package/dist/spa/assets/QTabs.72f2507e.js +0 -1
  90. package/dist/spa/assets/QToggle.376c48be.js +0 -1
  91. package/dist/spa/assets/QTooltip.5aa8e325.js +0 -1
  92. package/dist/spa/assets/Radio.0ac35288.js +0 -7
  93. package/dist/spa/assets/Radio.aca54a89.css +0 -1
  94. package/dist/spa/assets/SelectStd.5c6891db.css +0 -1
  95. package/dist/spa/assets/SelectStd.daf1def9.js +0 -16
  96. package/dist/spa/assets/TabButtonPage.20e871dd.js +0 -7
  97. package/dist/spa/assets/TabButtonPage.36ce9f9c.css +0 -1
  98. package/dist/spa/assets/TabsPage.9b94ff39.css +0 -1
  99. package/dist/spa/assets/TabsPage.b92cccee.js +0 -9
  100. package/dist/spa/assets/TogglePage.8129b631.css +0 -1
  101. package/dist/spa/assets/TogglePage.ba6e325c.js +0 -9
  102. package/dist/spa/assets/UAvatar.dda7e478.js +0 -1
  103. package/dist/spa/assets/UAvatar.ea8daa38.css +0 -1
  104. package/dist/spa/assets/UBadgeStd.3965db9a.css +0 -1
  105. package/dist/spa/assets/UBadgeStd.e165ee05.js +0 -1
  106. package/dist/spa/assets/UBtnStd.979ec4e8.js +0 -1
  107. package/dist/spa/assets/UBtnStd.bdd4f5e5.css +0 -1
  108. package/dist/spa/assets/UTooltip.d2e04d0c.js +0 -1
  109. package/dist/spa/assets/UTooltip.efa029a7.css +0 -1
  110. package/dist/spa/assets/dom.e9d4ad51.js +0 -1
  111. package/dist/spa/assets/flUhRq6tzZclQEJ-Vdg-IuiaDsNa.fd84f88b.woff +0 -0
  112. package/dist/spa/assets/flUhRq6tzZclQEJ-Vdg-IuiaDsNcIhQ8tQ.4a4dbc62.woff2 +0 -0
  113. package/dist/spa/assets/format.41663636.js +0 -1
  114. package/dist/spa/assets/index.43c62a18.js +0 -21
  115. package/dist/spa/assets/index.4fbd73cf.css +0 -5
  116. package/dist/spa/assets/option-sizes.10cc02d3.js +0 -1
  117. package/dist/spa/assets/render.e67ff27a.js +0 -1
  118. package/dist/spa/assets/tooltip.7c0d0774.js +0 -8
  119. package/dist/spa/assets/touch.9135741d.js +0 -1
  120. package/dist/spa/assets/use-checkbox.44a623c0.js +0 -1
  121. package/dist/spa/favicon.ico +0 -0
  122. package/dist/spa/icons/caret-down.svg +0 -5
  123. package/dist/spa/icons/circle-xmark.svg +0 -6
  124. package/dist/spa/icons/favicon-128x128.png +0 -0
  125. package/dist/spa/icons/favicon-16x16.png +0 -0
  126. package/dist/spa/icons/favicon-32x32.png +0 -0
  127. package/dist/spa/icons/favicon-96x96.png +0 -0
  128. package/dist/spa/index.html +0 -3
@@ -0,0 +1,251 @@
1
+ <script setup>
2
+ import { computed } from 'vue'
3
+ import UTooltip from './UTooltip.vue'
4
+
5
+ const props = defineProps({
6
+ chipLabel: {
7
+ type: String,
8
+ default: 'Chip',
9
+ },
10
+ dense: {
11
+ type: Boolean,
12
+ default: false,
13
+ },
14
+ modelValue: {
15
+ type: Boolean,
16
+ default: false,
17
+ },
18
+ avatarLabel: {
19
+ type: String,
20
+ default: '',
21
+ },
22
+ icon: {
23
+ type: String,
24
+ },
25
+ iconClass: {
26
+ type: String,
27
+ },
28
+ type: {
29
+ type: String,
30
+ default: 'neutral',
31
+ },
32
+ removable: {
33
+ type: Boolean,
34
+ default: true,
35
+ },
36
+ remove: {
37
+ type: Function,
38
+ },
39
+ isShowTooltip: {
40
+ type: Boolean,
41
+ default: false,
42
+ },
43
+ offset: {
44
+ default: () => [14, 14],
45
+ type: Array,
46
+ },
47
+ anchor: {
48
+ type: String,
49
+ default: 'bottom middle',
50
+ },
51
+ })
52
+
53
+ const emit = defineEmits(['update:modelValue', 'onClick'])
54
+
55
+ const handleClick = () => {
56
+ return emit('onClick')
57
+ }
58
+ const size = computed(() => {
59
+ if (props.dense) {
60
+ return 'xs'
61
+ }
62
+ return 'sm'
63
+ })
64
+
65
+ const avatarLabel = computed(() => {
66
+ if (props.avatarLabel && props.avatarLabel.length > 2) {
67
+ return props.avatarLabel.substring(0, 2)
68
+ }
69
+ return props.avatarLabel
70
+ })
71
+ </script>
72
+
73
+ <template>
74
+ <q-chip
75
+ v-if="chipLabel"
76
+ class="u-chip q-px-xs"
77
+ v-bind="$attrs"
78
+ :class="type"
79
+ :modelValue="modelValue"
80
+ :dense="dense"
81
+ @remove="remove"
82
+ :removable="removable"
83
+ :aria-label="chipLabel"
84
+ @click="handleClick"
85
+ >
86
+ <q-avatar v-if="avatarLabel" class="u-avatar">
87
+ <span class="text-caption-xs">{{ avatarLabel }}</span>
88
+ </q-avatar>
89
+
90
+ <q-icon v-if="iconClass" :class="`iconLeft ${iconClass}`" />
91
+
92
+ <span :class="`chip-label text-overline-${size} text-uppercase`">
93
+ {{ chipLabel }}
94
+ </span>
95
+ <UTooltip
96
+ v-if="isShowTooltip"
97
+ :description="chipLabel"
98
+ :offset="offset"
99
+ :anchor="anchor"
100
+ />
101
+ </q-chip>
102
+ </template>
103
+
104
+ <style lang="sass">
105
+ .u-chip
106
+ padding: $xs
107
+ border-radius: 20px
108
+ height: $lg
109
+
110
+ .u-avatar
111
+ width: $ms
112
+ height: $ms
113
+ margin-left:0 !important
114
+
115
+
116
+ .q-icon
117
+ width: $ba
118
+ height: $ba
119
+ font-size:$ba
120
+
121
+ .iconLeft
122
+ padding-right: $xs
123
+
124
+ .q-chip__icon--remove
125
+ padding: $xs 0 $xs $xs
126
+ margin:0
127
+
128
+
129
+ &.neutral
130
+ background-color: $neutral-3
131
+ color: $neutral-9
132
+ .q-avatar
133
+ background-color: $neutral-9 !important
134
+ color: $neutral-3
135
+
136
+ .q-icon
137
+ color: $neutral-9 !important
138
+
139
+ &.primary
140
+ background-color: $blue-2
141
+ color: $primary
142
+ .q-avatar
143
+ background-color: $primary !important
144
+ color: $blue-2 !important
145
+
146
+ .q-icon
147
+ color: $primary !important
148
+
149
+ &.positive
150
+ background-color: $green-2
151
+ color: $green-7
152
+ .q-avatar
153
+ background-color: $green-7 !important
154
+ color: $green-2 !important
155
+
156
+ .q-icon
157
+ color: $green-7 !important
158
+
159
+ &.accent
160
+ background-color: $red-2
161
+ color: $red-7
162
+ .q-avatar
163
+ background-color: $red-7 !important
164
+ color: $red-2 !important
165
+
166
+ .q-icon
167
+ color: $red-7 !important
168
+
169
+ &.info
170
+ background-color: $purple-2
171
+ color: $purple-7
172
+ .q-avatar
173
+ background-color: $purple-7 !important
174
+ color: $purple-2 !important
175
+
176
+ .q-icon
177
+ color: $purple-7 !important
178
+
179
+ &.warning
180
+ background-color: $orange-2
181
+ color: $orange-7
182
+ .q-avatar
183
+ background-color: $orange-7 !important
184
+ color: $orange-2 !important
185
+
186
+ .q-icon
187
+ color: $orange-7 !important
188
+ &.yellow
189
+ background-color: $yellow-1
190
+ color: $yellow-9
191
+ .q-avatar
192
+ background-color: $yellow-9 !important
193
+ color: $yellow-1 !important
194
+
195
+ .q-icon
196
+ color: $yellow-9 !important
197
+
198
+ &.teal
199
+ background-color: $teal-1
200
+ color: $teal-7
201
+ .q-avatar
202
+ background-color: $teal-7 !important
203
+ color: $teal-1 !important
204
+
205
+ .q-icon
206
+ color: $teal-7 !important
207
+
208
+ &.gold
209
+ background-color: $gold-2
210
+ color: $gold-8
211
+ .q-avatar
212
+ background-color: $gold-8 !important
213
+ color: $gold-2 !important
214
+
215
+ .q-icon
216
+ color: $gold-8 !important
217
+
218
+ &.pink
219
+ background-color: $pink-1
220
+ color: $pink-7
221
+ .q-avatar
222
+ background-color: $pink-7 !important
223
+ color: $pink-1 !important
224
+
225
+ .q-icon
226
+ color: $pink-7 !important
227
+
228
+ &.q-chip--dense
229
+ padding: $xxs !important
230
+ height: $ms !important
231
+ .q-avatar
232
+ width: $ba !important
233
+ height: $ba !important
234
+ .q-avatar__content span
235
+ font-size:$xs !important
236
+ line-height:0rem !important
237
+ .q-icon
238
+ width: $sm !important
239
+ height: $sm !important
240
+ font-size:$sm !important
241
+ padding: $xxs $xxs $xxs 0rem
242
+
243
+ .q-chip__icon--remove
244
+ padding: $xxs
245
+
246
+ .chip-label
247
+ max-width: 12.5rem
248
+ white-space: normal
249
+ overflow-wrap: break-word
250
+ line-height: 1.2 !important // over-ridding this in long chip label case
251
+ </style>
@@ -0,0 +1,244 @@
1
+ <script setup>
2
+ import { computed, ref } from 'vue'
3
+ import UBtnStd from './UBtnStd.vue'
4
+
5
+ const emit = defineEmits(['onBackIconClick', 'hideDialog'])
6
+ const model = defineModel()
7
+ const props = defineProps({
8
+ heading: {
9
+ type: String,
10
+ required: true,
11
+ },
12
+ fields: Object,
13
+ position: String,
14
+ size: {
15
+ type: String,
16
+ default: 'default',
17
+ },
18
+ customSize: {
19
+ type: String,
20
+ },
21
+ headingCaption: String,
22
+ leftIcon: String,
23
+ closeIcon: String,
24
+ showActionButtons: Boolean,
25
+ leftIconLabel: String,
26
+ closeIconLabel: String,
27
+ divider: Boolean,
28
+ })
29
+
30
+ const dialogRef = ref(true)
31
+
32
+ const dialogStyle = computed(() => ({
33
+ '--customSize': props.customSize,
34
+ }))
35
+
36
+ const headerClass = computed(() => {
37
+ return props.divider ? 'divider' : ''
38
+ })
39
+
40
+ const handleBackClick = () => {
41
+ return emit('onBackIconClick')
42
+ }
43
+ </script>
44
+
45
+ <template>
46
+ <q-dialog
47
+ v-bind="$attrs"
48
+ v-model="model"
49
+ :class="`dialog-${size}`"
50
+ full-width
51
+ no-backdrop-dismiss
52
+ :position="position"
53
+ ref="dialogRef"
54
+ :style="dialogStyle"
55
+ >
56
+ <q-card class="dialog-wrapper full-height">
57
+ <q-card-section
58
+ :class="`col items-center q-pa-none heading-section ${headerClass}`"
59
+ >
60
+ <div class="heading-wrapper row">
61
+ <div class="flex items-center dialog-heading-container">
62
+ <div v-if="leftIcon">
63
+ <UBtnStd
64
+ class="dialog-action-icons"
65
+ :aria-label="leftIconLabel"
66
+ :flat="true"
67
+ tabindex="0"
68
+ @click="handleBackClick()"
69
+ >
70
+ <q-icon
71
+ class="icon-back"
72
+ :class="leftIcon"
73
+ size="1.5rem"
74
+ tabindex="-1"
75
+ />
76
+ </UBtnStd>
77
+ </div>
78
+ <div class="col">
79
+ <div>
80
+ <span class="text-heading-sm dialog-heading">
81
+ {{ heading }}
82
+ </span>
83
+ </div>
84
+ <div>
85
+ <span v-if="headingCaption" class="text-body-sm dialog-caption">
86
+ {{ headingCaption }}
87
+ </span>
88
+ </div>
89
+ </div>
90
+ </div>
91
+
92
+ <UBtnStd
93
+ class="dialog-action-icons"
94
+ :aria-label="closeIconLabel"
95
+ :flat="true"
96
+ tabindex="0"
97
+ @click="dialogRef.hide()"
98
+ >
99
+ <q-icon
100
+ v-if="closeIcon"
101
+ class="icon-close"
102
+ :class="closeIcon"
103
+ size="1.5rem"
104
+ tabindex="-1"
105
+ />
106
+ </UBtnStd>
107
+ </div>
108
+ <div class="row">
109
+ <slot name="secondary_row"></slot>
110
+ </div>
111
+ </q-card-section>
112
+
113
+ <q-card-section class="full-height main-content-dialog scroll q-px-ba">
114
+ <slot name="content" />
115
+ </q-card-section>
116
+
117
+ <div v-if="showActionButtons" class="q-pa-ba action-wrapper">
118
+ <q-card-actions class="action-buttons" align="left">
119
+ <slot name="action_secondary_one"></slot>
120
+ <slot name="action_secondary_two"></slot>
121
+ </q-card-actions>
122
+ <q-card-actions class="action-buttons" align="right">
123
+ <slot name="action_primary_one"></slot>
124
+ <slot name="action_primary_two"></slot>
125
+ </q-card-actions>
126
+ </div>
127
+ </q-card>
128
+ </q-dialog>
129
+ </template>
130
+
131
+ <style lang="sass">
132
+ .dialog-default, .dialog-half
133
+ .q-dialog__inner--left, .q-dialog__inner--right
134
+ .dialog-wrapper
135
+ max-height: 100vh !important
136
+ .q-dialog__inner
137
+ &.q-dialog__inner--right
138
+ padding-right: $ba !important
139
+ &.q-dialog__inner--left
140
+ padding-left: $ba !important
141
+ .dialog-heading-container
142
+ gap: $xs
143
+
144
+ .dialog-caption
145
+ color: $neutral-9
146
+ .dialog-heading
147
+ color: $dark
148
+
149
+ .heading-section
150
+ padding: $ba
151
+
152
+ .dialog-wrapper
153
+ border-radius: $xs !important
154
+ .divider
155
+ border-bottom: 1.5px solid $neutral-4
156
+ .action-wrapper
157
+ display: flex
158
+ justify-content: space-between
159
+ border-radius: 0 0 $xs $xs !important
160
+ .q-card__actions
161
+ padding: 0
162
+
163
+ .dialog-half
164
+ .q-dialog__inner
165
+ padding: $ba 0
166
+ width: 50% !important
167
+
168
+ .dialog-full
169
+ .q-dialog__inner
170
+ padding: 0 0
171
+ width: 100% !important
172
+ .dialog-wrapper
173
+ max-height: calc(100vh - 1rem)
174
+ border-radius: $xs $xs 0 0 !important
175
+ &.action-wrapper
176
+ border-radius: 0 !important
177
+ .main-content-dialog
178
+ padding: $ms $ms
179
+ padding-bottom: 0
180
+ margin-bottom: $ms !important
181
+ .heading-section
182
+ padding: $ba $ms !important
183
+ .action-wrapper
184
+ padding: $ba $ms
185
+
186
+ .dialog-custom
187
+ .q-dialog__inner
188
+ padding: $ba 0
189
+ width: var(--customSize)
190
+
191
+ .dialog-default
192
+ .q-dialog__inner
193
+ padding: $ba 0
194
+ width: 35.25rem !important
195
+
196
+ .heading-wrapper
197
+ justify-content: space-between
198
+ flex-wrap: nowrap
199
+ margin-bottom: $ba
200
+
201
+ .icon-close
202
+ color: $neutral-9
203
+ cursor: pointer
204
+ align-self: flex-start
205
+
206
+ .icon-back
207
+ cursor: pointer
208
+ color: $neutral-9
209
+
210
+ .main-content-dialog
211
+ margin-bottom: $ba
212
+ padding-bottom: 0
213
+
214
+ .full-height
215
+ height: 100vh
216
+ display: flex
217
+ flex-direction: column
218
+
219
+ .action-buttons
220
+ display: flex
221
+ align-items: center
222
+ gap: $xs
223
+ .q-btn
224
+ margin: 0 !important
225
+
226
+ .q-btn.dialog-action-icons
227
+ padding: 0px 0px !important
228
+ min-width: 1.5rem !important
229
+ min-height: 0px !important
230
+ height: fit-content !important
231
+ border-radius: 0px
232
+
233
+ &:focus
234
+ outline: auto !important
235
+
236
+ .q-focus-helper
237
+ background: transparent !important
238
+
239
+ #closeIconLabelRef
240
+ display: none
241
+
242
+ #leftIconLabelRef
243
+ display: none
244
+ </style>
@@ -0,0 +1,235 @@
1
+ <script setup>
2
+ import { computed } from 'vue'
3
+ import { useRouter } from 'vue-router'
4
+ import UBadgeStd from './UBadgeStd.vue'
5
+ import UBtnIcon from './UBtnIcon.vue'
6
+ import UBtnStd from './UBtnStd.vue'
7
+ import UMenuItem from './UMenuItem.vue'
8
+ import UTooltip from './UTooltip.vue'
9
+
10
+ const emit = defineEmits(['menuItemClicked', 'closeDrawer'])
11
+ const miniState = defineModel('miniState', {
12
+ default: false,
13
+ type: Boolean,
14
+ })
15
+ const open = defineModel('open', {
16
+ default: false,
17
+ type: Boolean,
18
+ })
19
+ const props = defineProps({
20
+ menu: {
21
+ default: () => [],
22
+ type: Array,
23
+ },
24
+ brandLogo: {
25
+ default: '',
26
+ },
27
+ brandMiniLogo: {
28
+ default: '',
29
+ },
30
+ homeLink: {
31
+ required: true,
32
+ default: '/home',
33
+ type: String,
34
+ },
35
+ })
36
+
37
+ const $router = useRouter()
38
+ const currentPath = computed(() => getCurrentPath())
39
+ const currentRoute = computed(() => $router.currentRoute.value.fullPath)
40
+
41
+ const getCurrentPath = (int = 1) => {
42
+ return currentRoute.value.split('/')[int]
43
+ }
44
+
45
+ /**
46
+ * returning x offset for tooltip for long text
47
+ * @param {*} label
48
+ */
49
+ const getXOffset = (label) => {
50
+ let labelLength = label.trim().length
51
+ return labelLength <= 4 ? 65 : labelLength < 9 ? 85 : 145
52
+ }
53
+
54
+ const handleClick = (menu) => {
55
+ emit('menuItemClicked', menu)
56
+ }
57
+
58
+ const handleCloseDrawer = () => {
59
+ emit('closeDrawer')
60
+ }
61
+ </script>
62
+ <template>
63
+ <q-drawer
64
+ v-model="open"
65
+ :class="`u-drawer ${miniState ? 'u-mini-drawer' : ''}`"
66
+ :breakpoint="400"
67
+ :mini="miniState"
68
+ :mini-width="64"
69
+ show-if-above
70
+ side="left"
71
+ :width="224"
72
+ >
73
+ <q-scroll-area class="u-drawer-scrollable-area">
74
+ <div
75
+ :class="`flex items-center justify-${
76
+ miniState ? 'center q-py-xs' : 'between q-py-xs q-pl-ba q-pr-xxs'
77
+ } `"
78
+ >
79
+ <UBtnStd
80
+ class="flex items-center justify-center drawer-logo q-pa-none"
81
+ flat
82
+ :ripple="false"
83
+ size="sm"
84
+ :to="homeLink"
85
+ >
86
+ <q-img
87
+ v-if="!miniState"
88
+ class="full-logo"
89
+ alt="usssa-logo"
90
+ aria-label="usssa logo"
91
+ :src="`${brandLogo}`"
92
+ />
93
+ <q-img
94
+ v-else
95
+ class="mini-state-logo"
96
+ alt="usssa-logo"
97
+ aria-label="usssa logo"
98
+ :src="brandMiniLogo"
99
+ />
100
+ </UBtnStd>
101
+ <div
102
+ v-if="!miniState"
103
+ class="drawer-open-close-icon-wrapper flex items-center justify-center"
104
+ >
105
+ <UBtnIcon
106
+ iconClass="fa-kit-duotone fa-sidebar-shrink"
107
+ ariaLabel="Sidebar shrink icon"
108
+ color="primary"
109
+ dense
110
+ ref="btn-icon"
111
+ size="sm"
112
+ @click="handleCloseDrawer"
113
+ />
114
+ <UTooltip
115
+ anchor="center right"
116
+ description="Collapse Menu"
117
+ :offset="[4, 14]"
118
+ self="center start"
119
+ />
120
+ </div>
121
+ </div>
122
+ <q-list
123
+ :class="`drawer-menu-list ${miniState ? 'drawer-menu-mini-list' : ''}`"
124
+ padding
125
+ >
126
+ <template v-for="(m, i) in menu" :key="i">
127
+ <UMenuItem
128
+ :class="`drawer-items ${miniState ? 'mini-menu-box' : ''}`"
129
+ :id="`u-drawer-menu-${i}`"
130
+ :label="m.label"
131
+ :left-icon="m.leftIcon"
132
+ :selected="currentPath === m.to.replaceAll('/', '')"
133
+ @onClick="handleClick(m)"
134
+ >
135
+ <template v-if="!miniState" #trailing_slot>
136
+ <UBadgeStd v-if="m.badgeInfo" :label="m.badgeInfo" size="lg" />
137
+ <q-icon
138
+ v-if="m.rightIcon"
139
+ :class="`${m.rightIcon} ${
140
+ currentPath === m.to.replaceAll('/', '')
141
+ ? ''
142
+ : 'non-active-right-icon'
143
+ }`"
144
+ :aria-label="m.badgeInfo"
145
+ size="1rem"
146
+ />
147
+ </template>
148
+ </UMenuItem>
149
+ <UTooltip
150
+ v-if="miniState"
151
+ anchor="center right"
152
+ :description="m.label"
153
+ :offset="[getXOffset(m.label), 20]"
154
+ self="center right"
155
+ :target="`#u-drawer-menu-${i}`"
156
+ />
157
+ </template>
158
+ </q-list>
159
+ </q-scroll-area>
160
+ </q-drawer>
161
+ </template>
162
+ <style lang="sass">
163
+ .mini-state-logo
164
+ height: 1.5rem
165
+ width: 2.022rem
166
+
167
+ .q-drawer:has(.u-drawer)
168
+ width: 14rem !important
169
+
170
+ .q-drawer:has(.u-mini-drawer)
171
+ width: 4rem !important
172
+
173
+ .u-drawer
174
+ background: $surface-bg-1
175
+ .q-scrollarea__content
176
+ width: 100%
177
+ .drawer-logo
178
+ padding: 0px !important
179
+ min-width: 0px !important
180
+ &.q-hoverable:hover > .q-focus-helper
181
+ opacity: 0
182
+ &:focus-visible
183
+ outline: auto !important
184
+ .q-focus-helper
185
+ display: none
186
+
187
+ .u-drawer-scrollable-area
188
+ height: calc(100% - 0px)
189
+ margin-top: 0px
190
+
191
+ .menu-icon-class
192
+ font-size: 1rem
193
+
194
+ .menu-icon-wrapper
195
+ min-width: auto !important
196
+
197
+ .full-logo
198
+ width: 5.918rem
199
+ height: 1.5rem
200
+
201
+ .drawer-open-close-icon
202
+ font-size: 1rem
203
+ color: $primary
204
+
205
+ .drawer-open-close-icon-wrapper
206
+ height: $md
207
+ width: $md
208
+
209
+ .drawer-menu-list
210
+ padding: 0px $xs
211
+
212
+ .u-menu-link
213
+ .q-item
214
+ margin-bottom: 0
215
+
216
+ .drawer-menu-mini-list
217
+ display: grid
218
+ place-content: center
219
+ place-items: center
220
+
221
+ .u-drawer
222
+ .drawer-menu-list
223
+ .q-icon
224
+ color: $primary !important
225
+
226
+ .mini-menu-box
227
+ width: 3.5rem
228
+
229
+ .u-drawer
230
+ .drawer-menu-list
231
+ .non-active-right-icon
232
+ color: $dark !important
233
+ .drawer-items
234
+ margin-bottom: $xs!important
235
+ </style>