@usssa/component-library 1.0.0-beta.8 → 1.0.0-rc.1
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 +1 -1
- package/package.json +4 -3
- package/src/components/core/UBracket.vue +697 -167
- package/src/components/core/UBtnIcon.vue +7 -3
- package/src/components/core/UChip.vue +2 -2
- package/src/components/core/UDate.vue +43 -9
- package/src/components/core/UDrawer/UDrawer.vue +6 -0
- package/src/components/core/UDrawer/UDrawerMenuItem.vue +18 -12
- package/src/components/core/UEventCard.vue +47 -14
- package/src/components/core/UExpansionStd.vue +141 -35
- package/src/components/core/UExpansionTableStd.vue +6 -2
- package/src/components/core/UInputAddressLookup.vue +41 -11
- package/src/components/core/UInputPhoneStd.vue +8 -1
- package/src/components/core/UInputTextStd.vue +5 -0
- package/src/components/core/UMatchup.vue +404 -0
- package/src/components/core/UMenuItem.vue +3 -6
- package/src/components/core/UMultiSelectStd.vue +15 -4
- package/src/components/core/USelectStd.vue +21 -2
- package/src/components/core/UTable/UTable.vue +911 -744
- package/src/components/core/UTableStd.vue +175 -74
- package/src/components/core/UTabsStd.vue +2 -1
- package/src/components/core/UTooltip.vue +1 -0
- package/src/components/core/UVenueCard.vue +221 -0
- package/src/components/index.js +4 -0
- package/src/composables/useNotify.js +2 -2
- package/src/css/app.sass +13 -12
- package/src/utils/bracket.json +1498 -312
|
@@ -49,10 +49,13 @@ const props = defineProps({
|
|
|
49
49
|
type: String,
|
|
50
50
|
default: 'center end',
|
|
51
51
|
},
|
|
52
|
+
showIconBorder: {
|
|
53
|
+
type: Boolean,
|
|
54
|
+
default: false,
|
|
55
|
+
},
|
|
52
56
|
size: {
|
|
53
57
|
type: String,
|
|
54
58
|
default: 'md',
|
|
55
|
-
validator: (val) => ['sm', 'md', 'lg'].includes(val),
|
|
56
59
|
},
|
|
57
60
|
tooltip: {
|
|
58
61
|
type: String,
|
|
@@ -65,8 +68,8 @@ const props = defineProps({
|
|
|
65
68
|
})
|
|
66
69
|
|
|
67
70
|
const btnAriaLabel = computed(() => {
|
|
68
|
-
if(props.badge) {
|
|
69
|
-
return props.ariaLabel +
|
|
71
|
+
if (props.badge) {
|
|
72
|
+
return props.ariaLabel + ' ' + props.badgeLabel
|
|
70
73
|
}
|
|
71
74
|
return props.ariaLabel
|
|
72
75
|
})
|
|
@@ -140,6 +143,7 @@ const handleClick = () => {
|
|
|
140
143
|
:offset="offset"
|
|
141
144
|
:self="self"
|
|
142
145
|
/>
|
|
146
|
+
|
|
143
147
|
<slot name="menu" />
|
|
144
148
|
</template>
|
|
145
149
|
</q-btn>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<script setup>
|
|
2
2
|
import { computed, nextTick, ref, watch } from 'vue'
|
|
3
|
-
import UTooltip from './UTooltip.vue'
|
|
4
3
|
import { isQuasarColor } from '../../utils/data'
|
|
4
|
+
import UTooltip from './UTooltip.vue'
|
|
5
5
|
|
|
6
6
|
const emit = defineEmits(['update:modelValue', 'onClick'])
|
|
7
7
|
const props = defineProps({
|
|
@@ -151,7 +151,7 @@ watch(
|
|
|
151
151
|
padding: $xs
|
|
152
152
|
border-radius: 20px
|
|
153
153
|
height: $lg
|
|
154
|
-
margin
|
|
154
|
+
margin: 0px !important
|
|
155
155
|
|
|
156
156
|
&.q-chip--dense
|
|
157
157
|
.chip-label
|
|
@@ -4,6 +4,7 @@ import { useScreenType } from '../../composables/useScreenType'
|
|
|
4
4
|
import UBtnStd from './UBtnStd.vue'
|
|
5
5
|
import UInputTextStd from './UInputTextStd.vue'
|
|
6
6
|
import USheet from './USheet.vue'
|
|
7
|
+
import { debounce } from 'quasar'
|
|
7
8
|
|
|
8
9
|
const date = defineModel('date', { default: null })
|
|
9
10
|
|
|
@@ -63,6 +64,10 @@ const props = defineProps({
|
|
|
63
64
|
toolTipText: {
|
|
64
65
|
type: String,
|
|
65
66
|
},
|
|
67
|
+
useDebounce: {
|
|
68
|
+
type: Boolean,
|
|
69
|
+
default: false,
|
|
70
|
+
},
|
|
66
71
|
validationRules: { type: Array, default: () => [] },
|
|
67
72
|
})
|
|
68
73
|
|
|
@@ -115,7 +120,7 @@ const onUpdateSheet = (value) => {
|
|
|
115
120
|
}
|
|
116
121
|
}
|
|
117
122
|
|
|
118
|
-
const
|
|
123
|
+
const updateValue = (value) => {
|
|
119
124
|
if (value.search('-') > -1) {
|
|
120
125
|
date.value = { from: value.split('-')[0], to: value.split('-')[1] }
|
|
121
126
|
} else {
|
|
@@ -123,6 +128,16 @@ const onUpdateValue = (value) => {
|
|
|
123
128
|
}
|
|
124
129
|
}
|
|
125
130
|
|
|
131
|
+
const debouncedUpdateValue = debounce(updateValue, 1000)
|
|
132
|
+
|
|
133
|
+
const onUpdateValue = (value) => {
|
|
134
|
+
if (props.useDebounce) {
|
|
135
|
+
debouncedUpdateValue(value)
|
|
136
|
+
} else {
|
|
137
|
+
updateValue(value)
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
126
141
|
const openDatePicker = () => {
|
|
127
142
|
if ($screen.value.isMobile) {
|
|
128
143
|
openDialogs()
|
|
@@ -183,6 +198,7 @@ watch(
|
|
|
183
198
|
<UInputTextStd
|
|
184
199
|
v-model="selectedDate"
|
|
185
200
|
:class="inputClass ? inputClass : ''"
|
|
201
|
+
autocomplete="off"
|
|
186
202
|
:borderless="borderless"
|
|
187
203
|
:dataTestId="dataTestId"
|
|
188
204
|
:disable="disable"
|
|
@@ -205,7 +221,7 @@ watch(
|
|
|
205
221
|
aria-label="open date picker"
|
|
206
222
|
:flat="true"
|
|
207
223
|
:size="size"
|
|
208
|
-
:tabindex="
|
|
224
|
+
:tabindex="-1"
|
|
209
225
|
@mousedown.prevent
|
|
210
226
|
@touchstart.prevent="openDatePicker"
|
|
211
227
|
@on-click="openDatePicker"
|
|
@@ -214,7 +230,7 @@ watch(
|
|
|
214
230
|
class="cursor-pointer date-picker-icon fa-kit-duotone fa-calendar-event"
|
|
215
231
|
alt="open date picker"
|
|
216
232
|
size="1rem"
|
|
217
|
-
tabindex="
|
|
233
|
+
tabindex="0"
|
|
218
234
|
>
|
|
219
235
|
<q-popup-proxy
|
|
220
236
|
v-if="!$screen.isMobile"
|
|
@@ -260,7 +276,7 @@ watch(
|
|
|
260
276
|
:dataTestId="dataTestId"
|
|
261
277
|
:hint-icon="hintIcon"
|
|
262
278
|
:mask="`${range ? '##/##/####-##/##/####' : '##/##/####'}`"
|
|
263
|
-
tabindex="
|
|
279
|
+
tabindex="0"
|
|
264
280
|
@update:modelValue="onUpdateSheet"
|
|
265
281
|
>
|
|
266
282
|
<template #append>
|
|
@@ -269,13 +285,13 @@ watch(
|
|
|
269
285
|
aria-label="open date picker"
|
|
270
286
|
:flat="true"
|
|
271
287
|
:size="size"
|
|
272
|
-
:tabindex="
|
|
288
|
+
:tabindex="-1"
|
|
273
289
|
>
|
|
274
290
|
<q-icon
|
|
275
291
|
class="cursor-pointer date-picker-icon fa-kit-duotone fa-calendar-event"
|
|
276
292
|
alt="open date picker"
|
|
277
293
|
size="1rem"
|
|
278
|
-
tabindex="
|
|
294
|
+
tabindex="0"
|
|
279
295
|
>
|
|
280
296
|
</q-icon>
|
|
281
297
|
</UBtnStd>
|
|
@@ -565,18 +581,36 @@ watch(
|
|
|
565
581
|
padding: 0px !important
|
|
566
582
|
min-width: 0px !important
|
|
567
583
|
|
|
584
|
+
// remove hover background
|
|
585
|
+
&:hover
|
|
586
|
+
background: transparent !important
|
|
587
|
+
box-shadow: none !important
|
|
588
|
+
|
|
589
|
+
// disable ripple effect
|
|
590
|
+
.q-ripple
|
|
591
|
+
display: none !important
|
|
592
|
+
|
|
593
|
+
|
|
568
594
|
&.q-hoverable:hover > .q-focus-helper
|
|
569
595
|
opacity: 0
|
|
570
596
|
|
|
571
597
|
&:focus-visible
|
|
572
|
-
|
|
598
|
+
background: transparent !important
|
|
599
|
+
box-shadow: none !important
|
|
600
|
+
outline: none !important
|
|
601
|
+
|
|
602
|
+
.q-focus-helper
|
|
603
|
+
display: none !important
|
|
604
|
+
background: transparent !important
|
|
573
605
|
|
|
574
|
-
.q-focus-helper
|
|
575
|
-
display: none
|
|
576
606
|
|
|
577
607
|
.date-picker-icon
|
|
578
608
|
color: $description
|
|
579
609
|
|
|
610
|
+
&:focus-visible
|
|
611
|
+
outline: auto !important
|
|
612
|
+
|
|
613
|
+
|
|
580
614
|
.selected-month-year
|
|
581
615
|
color: #12316C
|
|
582
616
|
background: #234ba926
|
|
@@ -71,22 +71,13 @@ const handleMenuClick = (menu) => {
|
|
|
71
71
|
@on-click="handleMenuClick(menuItem)"
|
|
72
72
|
>
|
|
73
73
|
<template v-if="!miniState" #trailing_slot>
|
|
74
|
-
<UBadgeStd
|
|
75
|
-
v-if="menuItem.badgeInfo"
|
|
76
|
-
:class="{
|
|
77
|
-
'nested-badge-margin': multiLevel,
|
|
78
|
-
}"
|
|
79
|
-
:label="menuItem.badgeInfo"
|
|
80
|
-
size="lg"
|
|
81
|
-
tabindex="-1"
|
|
82
|
-
/>
|
|
83
74
|
<q-icon
|
|
84
75
|
v-if="menuItem.rightIcon && !multiLevel"
|
|
85
76
|
:class="`${menuItem.rightIcon} ${
|
|
86
77
|
currentPath === menuItem.to.replaceAll('/', '')
|
|
87
78
|
? ''
|
|
88
79
|
: 'non-active-right-icon'
|
|
89
|
-
}`"
|
|
80
|
+
} q-ml-xs`"
|
|
90
81
|
:aria-label="menuItem.badgeInfo"
|
|
91
82
|
size="1rem"
|
|
92
83
|
tabindex="-1"
|
|
@@ -101,6 +92,19 @@ const handleMenuClick = (menu) => {
|
|
|
101
92
|
size="1.5rem"
|
|
102
93
|
tabindex="-1"
|
|
103
94
|
/>
|
|
95
|
+
<UBadgeStd
|
|
96
|
+
v-if="menuItem.badgeInfo"
|
|
97
|
+
:class="{
|
|
98
|
+
'badge-with-navigation-icon':
|
|
99
|
+
(menuItem.children && menuItem.children.length && multiLevel) ||
|
|
100
|
+
(menuItem.slot && menuItem.slot.hasSlot && multiLevel),
|
|
101
|
+
}"
|
|
102
|
+
class="default-badge-position"
|
|
103
|
+
:color="menuItem.badgeStyle?.color ?? 'primary'"
|
|
104
|
+
:label="menuItem.badgeInfo"
|
|
105
|
+
:size="menuItem.badgeStyle?.size ?? 'lg'"
|
|
106
|
+
tabindex="-1"
|
|
107
|
+
/>
|
|
104
108
|
</template>
|
|
105
109
|
</UMenuItem>
|
|
106
110
|
</transition>
|
|
@@ -118,7 +122,9 @@ const handleMenuClick = (menu) => {
|
|
|
118
122
|
.drawer-menu-list .q-icon.navigation-right-icon
|
|
119
123
|
margin-left: $xs
|
|
120
124
|
color: $dark !important
|
|
125
|
+
position: absolute
|
|
126
|
+
right: 0
|
|
121
127
|
|
|
122
|
-
.
|
|
123
|
-
margin-right:
|
|
128
|
+
.badge-with-navigation-icon
|
|
129
|
+
margin-right: $ms !important
|
|
124
130
|
</style>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<script setup>
|
|
2
|
-
import { computed, ref } from 'vue'
|
|
2
|
+
import { computed, onMounted, ref } from 'vue'
|
|
3
3
|
|
|
4
4
|
import defaultImage from '../../assets/no-result.svg'
|
|
5
5
|
import { useScreenType } from '../../composables/useScreenType'
|
|
@@ -48,13 +48,27 @@ const props = defineProps({
|
|
|
48
48
|
eventViewText: {
|
|
49
49
|
type: String,
|
|
50
50
|
},
|
|
51
|
+
isRegisterEventActionDisabled: {
|
|
52
|
+
type: Boolean,
|
|
53
|
+
default: false,
|
|
54
|
+
},
|
|
55
|
+
isViewEventActionDisabled: {
|
|
56
|
+
type: Boolean,
|
|
57
|
+
default: false,
|
|
58
|
+
},
|
|
59
|
+
registerEventTooltip: {
|
|
60
|
+
type: String,
|
|
61
|
+
default: '',
|
|
62
|
+
},
|
|
51
63
|
})
|
|
52
64
|
|
|
65
|
+
const VERTICAL_TEXT_LIMIT = 13
|
|
66
|
+
|
|
53
67
|
const $screen = useScreenType()
|
|
68
|
+
|
|
54
69
|
const eventChip = ref(true) // this is required to show chip
|
|
55
70
|
const isCategoryOverflowing = ref(false)
|
|
56
71
|
const isNameOverflowing = ref(false)
|
|
57
|
-
const textECategory = ref(null)
|
|
58
72
|
const textEName = ref(null)
|
|
59
73
|
|
|
60
74
|
const eventAgeGroup = computed(() => trimmedLabel(props.eventAgeGroup, 30))
|
|
@@ -75,10 +89,8 @@ const eventViewText = computed(() =>
|
|
|
75
89
|
const isMobile = computed(() => $screen.value.isMobile)
|
|
76
90
|
|
|
77
91
|
const checkOverflow = () => {
|
|
78
|
-
if (
|
|
79
|
-
isCategoryOverflowing.value =
|
|
80
|
-
textECategory.value.scrollWidth > textECategory.value.clientWidth ||
|
|
81
|
-
textECategory.value.scrollHeight > textECategory.value.clientHeight
|
|
92
|
+
if (props.eventCategory.length > VERTICAL_TEXT_LIMIT) {
|
|
93
|
+
isCategoryOverflowing.value = true
|
|
82
94
|
}
|
|
83
95
|
|
|
84
96
|
if (textEName.value) {
|
|
@@ -95,6 +107,16 @@ const registerClick = () => {
|
|
|
95
107
|
const viewClick = () => {
|
|
96
108
|
emit('onView')
|
|
97
109
|
}
|
|
110
|
+
|
|
111
|
+
onMounted(() => {
|
|
112
|
+
const verticalTextEle = document.getElementsByClassName('event-vertical-text')
|
|
113
|
+
Array.from(verticalTextEle).forEach((el) => {
|
|
114
|
+
const originalText = el.innerText.trim()
|
|
115
|
+
if (originalText.length > VERTICAL_TEXT_LIMIT) {
|
|
116
|
+
el.innerText = originalText.slice(0, VERTICAL_TEXT_LIMIT) + '...'
|
|
117
|
+
}
|
|
118
|
+
})
|
|
119
|
+
})
|
|
98
120
|
</script>
|
|
99
121
|
|
|
100
122
|
<template>
|
|
@@ -109,9 +131,8 @@ const viewClick = () => {
|
|
|
109
131
|
>
|
|
110
132
|
<!-- Column 1: Rotated Text -->
|
|
111
133
|
<div
|
|
112
|
-
class="flex items-center justify-center q-py-sm q-px-xs rotated-text text-dark text-italic text-display-xxxs text-center cornero-font-family ellipsis"
|
|
134
|
+
class="flex items-center justify-center q-py-sm q-px-xs rotated-text event-vertical-text text-dark text-italic text-display-xxxs text-center cornero-font-family ellipsis"
|
|
113
135
|
data-testid="eventCategory"
|
|
114
|
-
ref="textECategory"
|
|
115
136
|
@mouseenter="checkOverflow"
|
|
116
137
|
>
|
|
117
138
|
{{ props.eventCategory }}
|
|
@@ -185,7 +206,7 @@ const viewClick = () => {
|
|
|
185
206
|
:description="props.eventAgeGroup"
|
|
186
207
|
/>
|
|
187
208
|
</span>
|
|
188
|
-
|
|
209
|
+
<span v-if="props.eventAgeGroup && props.eventLocation">|</span>
|
|
189
210
|
<span v-if="props.eventLocation" class="q-px-xxs">
|
|
190
211
|
{{ eventLocation.text }}
|
|
191
212
|
<UTooltip
|
|
@@ -193,7 +214,13 @@ const viewClick = () => {
|
|
|
193
214
|
:description="props.eventLocation"
|
|
194
215
|
/>
|
|
195
216
|
</span>
|
|
196
|
-
|
|
217
|
+
<span
|
|
218
|
+
v-if="
|
|
219
|
+
(props.eventAgeGroup || props.eventLocation) && props.eventHost
|
|
220
|
+
"
|
|
221
|
+
>
|
|
222
|
+
|
|
|
223
|
+
</span>
|
|
197
224
|
<span v-if="props.eventHost" class="q-ml-xxs">
|
|
198
225
|
{{ eventHost.text }}
|
|
199
226
|
<UTooltip
|
|
@@ -213,6 +240,7 @@ const viewClick = () => {
|
|
|
213
240
|
:aria-label="props.eventRegisterText || 'Register Event'"
|
|
214
241
|
color="primary"
|
|
215
242
|
data-testid="eventRegisterBtn"
|
|
243
|
+
:disable="isRegisterEventActionDisabled"
|
|
216
244
|
size="md"
|
|
217
245
|
@click="registerClick"
|
|
218
246
|
>
|
|
@@ -227,6 +255,7 @@ const viewClick = () => {
|
|
|
227
255
|
:aria-label="props.eventViewText || 'View Event'"
|
|
228
256
|
color="primary"
|
|
229
257
|
data-testid="eventViewBtn"
|
|
258
|
+
:disable="isViewEventActionDisabled"
|
|
230
259
|
flat
|
|
231
260
|
size="md"
|
|
232
261
|
@click="viewClick"
|
|
@@ -253,7 +282,6 @@ const viewClick = () => {
|
|
|
253
282
|
<div
|
|
254
283
|
class="text-dark text-display-xxxs text-italic cornero-font-family text-no-wrap ellipsis"
|
|
255
284
|
data-testid="eventCategory"
|
|
256
|
-
ref="textECategory"
|
|
257
285
|
@mouseenter="checkOverflow"
|
|
258
286
|
>
|
|
259
287
|
{{ props.eventCategory }}
|
|
@@ -310,14 +338,14 @@ const viewClick = () => {
|
|
|
310
338
|
</div>
|
|
311
339
|
|
|
312
340
|
<div class="event-item-mobile text-body-md text-description q-mt-ba">
|
|
313
|
-
<span v-if="props.eventAgeGroup" class="q-
|
|
341
|
+
<span v-if="props.eventAgeGroup" class="q-mx-xxs">
|
|
314
342
|
{{ eventAgeGroup.text }}
|
|
315
343
|
<UTooltip
|
|
316
344
|
v-if="eventAgeGroup.isTrimmed"
|
|
317
345
|
:description="props.eventAgeGroup"
|
|
318
346
|
/>
|
|
319
347
|
</span>
|
|
320
|
-
|
|
348
|
+
<span v-if="props.eventAgeGroup && props.eventLocation">|</span>
|
|
321
349
|
<span v-if="props.eventLocation" class="q-px-xxs">
|
|
322
350
|
{{ eventLocation.text }}
|
|
323
351
|
<UTooltip
|
|
@@ -325,7 +353,10 @@ const viewClick = () => {
|
|
|
325
353
|
:description="props.eventLocation"
|
|
326
354
|
/>
|
|
327
355
|
</span>
|
|
328
|
-
|
|
356
|
+
<span
|
|
357
|
+
v-if="(props.eventAgeGroup || props.eventLocation) && props.eventHost"
|
|
358
|
+
>|</span
|
|
359
|
+
>
|
|
329
360
|
<span v-if="props.eventHost" class="q-ml-xxs">
|
|
330
361
|
{{ eventHost.text }}
|
|
331
362
|
<UTooltip v-if="eventHost.isTrimmed" :description="props.eventHost" />
|
|
@@ -342,6 +373,7 @@ const viewClick = () => {
|
|
|
342
373
|
:aria-label="props.eventViewText || 'View Event'"
|
|
343
374
|
color="primary"
|
|
344
375
|
data-testid="eventViewBtn"
|
|
376
|
+
:disable="isViewEventActionDisabled"
|
|
345
377
|
flat
|
|
346
378
|
:label="eventViewText.text"
|
|
347
379
|
size="md"
|
|
@@ -352,6 +384,7 @@ const viewClick = () => {
|
|
|
352
384
|
:aria-label="props.eventRegisterText || 'Register Event'"
|
|
353
385
|
color="primary"
|
|
354
386
|
data-testid="eventRegisterBtn"
|
|
387
|
+
:disable="isRegisterEventActionDisabled"
|
|
355
388
|
:label="eventRegisterText.text"
|
|
356
389
|
size="md"
|
|
357
390
|
@click="registerClick"
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
<script setup>
|
|
2
|
-
import { ref } from 'vue'
|
|
2
|
+
import { nextTick, ref, watch } from 'vue'
|
|
3
|
+
import UBtnStd from './UBtnStd.vue'
|
|
3
4
|
import URadioStd from './URadioStd.vue'
|
|
5
|
+
import UTooltip from './UTooltip.vue'
|
|
4
6
|
|
|
5
7
|
const emit = defineEmits(['handleSelectChange'])
|
|
6
8
|
const isSelected = defineModel('isSelected', {
|
|
@@ -36,6 +38,19 @@ const props = defineProps({
|
|
|
36
38
|
type: String,
|
|
37
39
|
default: 'Expand',
|
|
38
40
|
},
|
|
41
|
+
expansionButtonProps: {
|
|
42
|
+
type: Object,
|
|
43
|
+
default: () => ({
|
|
44
|
+
flat: true,
|
|
45
|
+
outline: false,
|
|
46
|
+
color: 'primary',
|
|
47
|
+
label: '',
|
|
48
|
+
size: '',
|
|
49
|
+
rightIcon: 'fa-kit fa-caret-down',
|
|
50
|
+
leftIcon: '',
|
|
51
|
+
disable: false,
|
|
52
|
+
}),
|
|
53
|
+
},
|
|
39
54
|
expansionIcon: {
|
|
40
55
|
type: String,
|
|
41
56
|
default: 'fa-kit fa-caret-down',
|
|
@@ -60,6 +75,10 @@ const props = defineProps({
|
|
|
60
75
|
type: Number,
|
|
61
76
|
default: 20.563,
|
|
62
77
|
},
|
|
78
|
+
useExpansionButton: {
|
|
79
|
+
type: Boolean,
|
|
80
|
+
default: false,
|
|
81
|
+
},
|
|
63
82
|
toggleIconLeft: {
|
|
64
83
|
type: Boolean,
|
|
65
84
|
default: false,
|
|
@@ -71,6 +90,17 @@ const props = defineProps({
|
|
|
71
90
|
})
|
|
72
91
|
|
|
73
92
|
const isExpanded = ref(false)
|
|
93
|
+
const isOverflowing = ref(false)
|
|
94
|
+
const labelRef = ref(null)
|
|
95
|
+
|
|
96
|
+
const checkOverflow = () => {
|
|
97
|
+
nextTick(() => {
|
|
98
|
+
if (labelRef.value) {
|
|
99
|
+
const el = labelRef.value
|
|
100
|
+
isOverflowing.value = el.scrollWidth > el.clientWidth
|
|
101
|
+
}
|
|
102
|
+
})
|
|
103
|
+
}
|
|
74
104
|
|
|
75
105
|
const handleChange = (value) => {
|
|
76
106
|
emit('handleSelectChange', value)
|
|
@@ -89,6 +119,16 @@ const toggleExpansion = () => {
|
|
|
89
119
|
isExpanded.value = !isExpanded.value
|
|
90
120
|
}
|
|
91
121
|
}
|
|
122
|
+
|
|
123
|
+
watch(
|
|
124
|
+
() => props.label,
|
|
125
|
+
() => {
|
|
126
|
+
checkOverflow()
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
immediate: true,
|
|
130
|
+
}
|
|
131
|
+
)
|
|
92
132
|
</script>
|
|
93
133
|
|
|
94
134
|
<template>
|
|
@@ -139,26 +179,54 @@ const toggleExpansion = () => {
|
|
|
139
179
|
</q-icon>
|
|
140
180
|
<slot name="avatar" />
|
|
141
181
|
<div class="column u-expansion-label">
|
|
142
|
-
<span
|
|
143
|
-
|
|
182
|
+
<span
|
|
183
|
+
:class="`text-caption-lg text-truncate ${
|
|
184
|
+
isOverflowing ? `cursor-pointer` : ``
|
|
185
|
+
}`"
|
|
186
|
+
ref="labelRef"
|
|
187
|
+
@mouseenter="checkOverflow"
|
|
188
|
+
>{{ label }}</span
|
|
189
|
+
>
|
|
190
|
+
<UTooltip
|
|
191
|
+
v-if="isOverflowing"
|
|
192
|
+
anchor="bottom middle"
|
|
193
|
+
:description="label"
|
|
194
|
+
:offset="[14, 14]"
|
|
195
|
+
/>
|
|
196
|
+
<template v-if="$slots.caption">
|
|
197
|
+
<slot name="caption" />
|
|
198
|
+
</template>
|
|
199
|
+
<template v-else>
|
|
200
|
+
<span class="text-body-xs text-description">{{ caption }}</span>
|
|
201
|
+
</template>
|
|
144
202
|
</div>
|
|
145
|
-
<
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
'
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
203
|
+
<template v-if="!toggleIconLeft">
|
|
204
|
+
<UBtnStd
|
|
205
|
+
v-bind="expansionButtonProps"
|
|
206
|
+
v-if="useExpansionButton"
|
|
207
|
+
:class="{ 'u-expansion-btn--expanded': isExpanded }"
|
|
208
|
+
:aria-label="isExpanded ? collapsedAriaLabel : expandAriaLabel"
|
|
209
|
+
:tabindex="disabled ? -1 : 0"
|
|
210
|
+
@click.stop="toggleExpansion"
|
|
211
|
+
@keydown.stop="onIconKeydown"
|
|
212
|
+
/>
|
|
213
|
+
<q-icon
|
|
214
|
+
v-else
|
|
215
|
+
:class="[
|
|
216
|
+
'cursor-pointer',
|
|
217
|
+
'icon-secondary-opacity',
|
|
218
|
+
'transition-all',
|
|
219
|
+
expansionIcon,
|
|
220
|
+
isExpanded ? toggleIconRotationClass : '',
|
|
221
|
+
]"
|
|
222
|
+
:aria-label="isExpanded ? collapsedAriaLabel : expandAriaLabel"
|
|
223
|
+
:color="expansionIconColor"
|
|
224
|
+
:size="expansionIconSize"
|
|
225
|
+
:tabindex="disabled ? -1 : 0"
|
|
226
|
+
@click.stop="toggleExpansion"
|
|
227
|
+
@keydown.stop="onIconKeydown"
|
|
228
|
+
/>
|
|
229
|
+
</template>
|
|
162
230
|
</div>
|
|
163
231
|
</template>
|
|
164
232
|
<slot name="body" />
|
|
@@ -209,22 +277,49 @@ const toggleExpansion = () => {
|
|
|
209
277
|
</q-icon>
|
|
210
278
|
<slot name="avatar" />
|
|
211
279
|
<div class="column u-expansion-label">
|
|
212
|
-
<span
|
|
213
|
-
|
|
280
|
+
<span
|
|
281
|
+
:class="`text-caption-lg text-truncate ${
|
|
282
|
+
isOverflowing ? `cursor-pointer` : ``
|
|
283
|
+
}`"
|
|
284
|
+
ref="labelRef"
|
|
285
|
+
@mouseenter="checkOverflow"
|
|
286
|
+
>{{ label }}</span
|
|
287
|
+
>
|
|
288
|
+
<UTooltip
|
|
289
|
+
v-if="isOverflowing"
|
|
290
|
+
anchor="bottom middle"
|
|
291
|
+
:description="label"
|
|
292
|
+
:offset="[14, 14]"
|
|
293
|
+
/>
|
|
294
|
+
<template v-if="$slots.caption">
|
|
295
|
+
<slot name="caption" />
|
|
296
|
+
</template>
|
|
297
|
+
<template v-else>
|
|
298
|
+
<span class="text-body-xs text-description">{{ caption }}</span>
|
|
299
|
+
</template>
|
|
214
300
|
</div>
|
|
215
|
-
<
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
301
|
+
<template v-if="!toggleIconLeft">
|
|
302
|
+
<UBtnStd
|
|
303
|
+
v-if="useExpansionButton"
|
|
304
|
+
v-bind="expansionButtonProps"
|
|
305
|
+
:aria-label="isExpanded ? collapsedAriaLabel : expandAriaLabel"
|
|
306
|
+
:tabindex="disabled ? -1 : 0"
|
|
307
|
+
@click.stop="toggleExpansion"
|
|
308
|
+
@keydown.stop="onIconKeydown"
|
|
309
|
+
/>
|
|
310
|
+
<q-icon
|
|
311
|
+
v-else
|
|
312
|
+
:class="[
|
|
313
|
+
'cursor-pointer',
|
|
314
|
+
'icon-secondary-opacity',
|
|
315
|
+
'transition-all',
|
|
316
|
+
expansionIcon,
|
|
317
|
+
isExpanded ? toggleIconRotationClass : '',
|
|
318
|
+
]"
|
|
319
|
+
:color="expansionIconColor"
|
|
320
|
+
:size="expansionIconSize"
|
|
321
|
+
/>
|
|
322
|
+
</template>
|
|
228
323
|
</div>
|
|
229
324
|
</template>
|
|
230
325
|
<slot name="body" />
|
|
@@ -254,6 +349,13 @@ const toggleExpansion = () => {
|
|
|
254
349
|
word-break: break-word
|
|
255
350
|
overflow-wrap: break-word
|
|
256
351
|
|
|
352
|
+
.text-truncate
|
|
353
|
+
overflow: hidden
|
|
354
|
+
text-overflow: ellipsis
|
|
355
|
+
white-space: nowrap
|
|
356
|
+
display: block
|
|
357
|
+
max-width: 100%
|
|
358
|
+
|
|
257
359
|
.q-expansion-item__content > :first-child
|
|
258
360
|
padding: $xs $ba $ba $ba
|
|
259
361
|
|
|
@@ -268,6 +370,10 @@ const toggleExpansion = () => {
|
|
|
268
370
|
transform: rotate(90deg)
|
|
269
371
|
transition: 0.3s
|
|
270
372
|
|
|
373
|
+
.u-expansion-btn--expanded .q-icon.on-right
|
|
374
|
+
transform: rotate(180deg)
|
|
375
|
+
transition: 0.3s
|
|
376
|
+
|
|
271
377
|
.expansion-radio-wrapper
|
|
272
378
|
.q-radio__label
|
|
273
379
|
padding-left: 0px !important
|
|
@@ -151,6 +151,10 @@ const props = defineProps({
|
|
|
151
151
|
type: Boolean,
|
|
152
152
|
default: false,
|
|
153
153
|
},
|
|
154
|
+
showCustomTable: {
|
|
155
|
+
type: Boolean,
|
|
156
|
+
default: false,
|
|
157
|
+
},
|
|
154
158
|
tableCustomClass: {
|
|
155
159
|
type: String,
|
|
156
160
|
default: '',
|
|
@@ -200,7 +204,9 @@ const virtualScroll = ref(false)
|
|
|
200
204
|
<UAvatar name="UExpansion" :round="true" size="lg" />
|
|
201
205
|
</template>
|
|
202
206
|
<template #body>
|
|
207
|
+
<slot v-if="showCustomTable" name="custom_table" />
|
|
203
208
|
<UTableStd
|
|
209
|
+
v-else
|
|
204
210
|
v-model:columns="columns"
|
|
205
211
|
v-model:grid="grid"
|
|
206
212
|
v-model:pagination="pagination"
|
|
@@ -257,8 +263,6 @@ const virtualScroll = ref(false)
|
|
|
257
263
|
.q-expansion-item__content
|
|
258
264
|
padding: 0px !important
|
|
259
265
|
|
|
260
|
-
|
|
261
|
-
|
|
262
266
|
.q-table__grid-content
|
|
263
267
|
.expansion-table-card
|
|
264
268
|
padding: 0px !important
|