@bildvitta/quasar-ui-asteroid 3.17.0-beta.2 → 3.17.0-beta.21
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 +2 -2
- package/src/assets/sounds/nave-notification.mp3 +0 -0
- package/src/components/actions/QasActions.vue +1 -1
- package/src/components/app-menu/QasAppMenu.vue +6 -1
- package/src/components/avatar/QasAvatar.vue +7 -8
- package/src/components/board-generator/QasBoardGenerator.vue +407 -40
- package/src/components/board-generator/QasBoardGenerator.yml +53 -12
- package/src/components/btn-dropdown/QasBtnDropdown.vue +14 -1
- package/src/components/card/QasCard.vue +13 -4
- package/src/components/chart-view/QasChartView.vue +44 -20
- package/src/components/chart-view/QasChartView.yml +10 -0
- package/src/components/checkbox/QasCheckbox.vue +30 -9
- package/src/components/checkbox/QasCheckbox.yml +5 -0
- package/src/components/copy/QasCopy.vue +12 -2
- package/src/components/copy/QasCopy.yml +8 -0
- package/src/components/date-time-input/QasDateTimeInput.vue +1 -1
- package/src/components/dialog/QasDialog.vue +3 -3
- package/src/components/expansion-item/QasExpansionItem.vue +120 -34
- package/src/components/expansion-item/QasExpansionItem.yml +38 -5
- package/src/components/filters/QasFilters.vue +1 -1
- package/src/components/filters/private/PvFiltersButton.vue +1 -1
- package/src/components/form-generator/QasFormGenerator.vue +39 -27
- package/src/components/form-generator/QasFormGenerator.yml +3 -0
- package/src/components/grabbable/QasGrabbable.vue +14 -6
- package/src/components/grabbable/QasGrabbable.yml +4 -0
- package/src/components/grid-generator/QasGridGenerator.vue +67 -34
- package/src/components/grid-generator/QasGridGenerator.yml +15 -0
- package/src/components/header/QasHeader.vue +58 -12
- package/src/components/header/QasHeader.yml +5 -0
- package/src/components/infinite-scroll/QasInfiniteScroll.vue +16 -17
- package/src/components/infinite-scroll/QasInfiniteScroll.yml +7 -0
- package/src/components/list-items/QasListItems.vue +28 -4
- package/src/components/list-items/QasListItems.yml +10 -0
- package/src/components/list-view/QasListView.vue +17 -5
- package/src/components/list-view/QasListView.yml +9 -0
- package/src/components/nested-fields/QasNestedFields.vue +91 -36
- package/src/components/nested-fields/QasNestedFields.yml +23 -0
- package/src/components/radio/QasRadio.vue +24 -5
- package/src/components/radio/QasRadio.yml +6 -0
- package/src/components/select/QasSelect.vue +129 -5
- package/src/components/select/QasSelect.yml +11 -0
- package/src/components/stepper-form-view/QasStepperFormView.yml +1 -1
- package/src/components/table-generator/QasTableGenerator.vue +10 -1
- package/src/components/text-truncate/QasTextTruncate.vue +11 -4
- package/src/components/text-truncate/QasTextTruncate.yml +4 -0
- package/src/composables/private/use-generator.js +3 -9
- package/src/composables/use-notifications.js +14 -0
- package/src/css/components/field.scss +13 -6
- package/src/css/components/item.scss +5 -1
- package/src/enums/Spacing.js +33 -0
- package/src/helpers/set-scroll-on-grab.js +9 -1
|
@@ -1,35 +1,37 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<div ref="expansionItem" class="full-width qas-expansion-item" :class="
|
|
3
|
-
<component :is="component.is" class="qas-expansion-item__box">
|
|
4
|
-
<q-expansion-item header-class="text-bold q-mt-sm q-pa-none qas-expansion-item__header"
|
|
2
|
+
<div ref="expansionItem" class="full-width qas-expansion-item" :class="classes" v-bind="expansionProps.parent">
|
|
3
|
+
<component :is="component.is" class="qas-expansion-item__box" v-bind="boxProps">
|
|
4
|
+
<q-expansion-item v-model="modelValue" v-bind="expansionProps.item" header-class="text-bold q-mt-sm q-pa-none qas-expansion-item__header" @show="setShowContent">
|
|
5
5
|
<template #header>
|
|
6
|
-
<
|
|
6
|
+
<div class="full-width justify-between no-wrap row">
|
|
7
7
|
<div class="full-width">
|
|
8
|
-
<
|
|
9
|
-
<
|
|
10
|
-
<
|
|
11
|
-
|
|
12
|
-
</
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
8
|
+
<slot name="header">
|
|
9
|
+
<div class="items-center q-col-gutter-sm row">
|
|
10
|
+
<slot name="header-label">
|
|
11
|
+
<qas-label class="col-auto qas-expansion-item__label" :label="props.label" margin="none" typography="h5" />
|
|
12
|
+
</slot>
|
|
13
|
+
|
|
14
|
+
<div v-if="hasBadges" class="col-auto items-center q-col-gutter-sm row">
|
|
15
|
+
<div v-for="(badge, badgeIndex) in props.badges" :key="badgeIndex" class="col-auto">
|
|
16
|
+
<qas-badge v-bind="badge" />
|
|
17
|
+
</div>
|
|
18
18
|
</div>
|
|
19
19
|
</div>
|
|
20
|
-
</div>
|
|
21
20
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
<div v-if="hasHeaderBottom" class="q-mt-sm">
|
|
22
|
+
<slot name="header-bottom" />
|
|
23
|
+
</div>
|
|
24
|
+
</slot>
|
|
25
25
|
</div>
|
|
26
|
-
|
|
26
|
+
|
|
27
|
+
<qas-btn class="qas-expansion-item__dropdown" color="grey-10" :disable="isDisabled" icon="sym_r_keyboard_arrow_down" />
|
|
28
|
+
</div>
|
|
27
29
|
</template>
|
|
28
30
|
|
|
29
31
|
<q-separator v-if="hasHeaderSeparator" class="q-my-md" />
|
|
30
32
|
|
|
31
33
|
<div :class="contentClasses">
|
|
32
|
-
<slot name="content">
|
|
34
|
+
<slot v-if="showContent" name="content">
|
|
33
35
|
<qas-grid-generator v-if="hasGridGenerator" use-inline v-bind="gridGeneratorProps" />
|
|
34
36
|
</slot>
|
|
35
37
|
</div>
|
|
@@ -60,6 +62,14 @@ const props = defineProps({
|
|
|
60
62
|
default: () => []
|
|
61
63
|
},
|
|
62
64
|
|
|
65
|
+
disable: {
|
|
66
|
+
type: Boolean
|
|
67
|
+
},
|
|
68
|
+
|
|
69
|
+
disableButton: {
|
|
70
|
+
type: Boolean
|
|
71
|
+
},
|
|
72
|
+
|
|
63
73
|
error: {
|
|
64
74
|
type: Boolean
|
|
65
75
|
},
|
|
@@ -69,14 +79,24 @@ const props = defineProps({
|
|
|
69
79
|
default: ''
|
|
70
80
|
},
|
|
71
81
|
|
|
82
|
+
gridGeneratorProps: {
|
|
83
|
+
type: Object,
|
|
84
|
+
default: () => ({})
|
|
85
|
+
},
|
|
86
|
+
|
|
87
|
+
group: {
|
|
88
|
+
type: String,
|
|
89
|
+
default: undefined
|
|
90
|
+
},
|
|
91
|
+
|
|
72
92
|
label: {
|
|
73
93
|
type: String,
|
|
74
94
|
default: ''
|
|
75
95
|
},
|
|
76
96
|
|
|
77
|
-
|
|
78
|
-
type:
|
|
79
|
-
default:
|
|
97
|
+
maxContentHeight: {
|
|
98
|
+
type: String,
|
|
99
|
+
default: ''
|
|
80
100
|
},
|
|
81
101
|
|
|
82
102
|
useHeaderSeparator: {
|
|
@@ -85,6 +105,8 @@ const props = defineProps({
|
|
|
85
105
|
}
|
|
86
106
|
})
|
|
87
107
|
|
|
108
|
+
const modelValue = defineModel({ type: Boolean })
|
|
109
|
+
|
|
88
110
|
const attrs = useAttrs()
|
|
89
111
|
|
|
90
112
|
provide('isExpansionItem', true)
|
|
@@ -95,16 +117,20 @@ const slots = defineSlots()
|
|
|
95
117
|
// refs
|
|
96
118
|
const expansionItem = ref(null)
|
|
97
119
|
const hasNextSibling = ref(false)
|
|
120
|
+
const showContent = ref(false)
|
|
98
121
|
|
|
99
122
|
onMounted(setHasNextSibling)
|
|
100
123
|
|
|
101
124
|
// constants
|
|
102
125
|
const isNestedExpansionItem = inject('isExpansionItem', false)
|
|
126
|
+
const isNestedBox = inject('isBox', false)
|
|
127
|
+
|
|
103
128
|
const component = {
|
|
104
129
|
is: isNestedExpansionItem ? 'div' : QasBox
|
|
105
130
|
}
|
|
106
131
|
|
|
107
132
|
// computed
|
|
133
|
+
const hasBadges = computed(() => !!props.badges.length)
|
|
108
134
|
const hasError = computed(() => props.error || !!props.errorMessage)
|
|
109
135
|
const hasGridGenerator = computed(() => !!Object.keys(props.gridGeneratorProps).length)
|
|
110
136
|
const hasBottomSeparator = computed(() => isNestedExpansionItem && hasNextSibling.value)
|
|
@@ -121,12 +147,19 @@ const hasHeaderSeparator = computed(() => {
|
|
|
121
147
|
return typeof props.useHeaderSeparator === 'undefined' ? !isNestedExpansionItem : props.useHeaderSeparator
|
|
122
148
|
})
|
|
123
149
|
|
|
124
|
-
const
|
|
150
|
+
const classes = computed(() => {
|
|
151
|
+
return {
|
|
152
|
+
'qas-expansion-item--error': hasError.value,
|
|
153
|
+
'qas-expansion-item--disabled': props.disable || props.disableButton,
|
|
154
|
+
'qas-expansion-item--disabled-full': props.disable
|
|
155
|
+
}
|
|
156
|
+
})
|
|
125
157
|
|
|
126
158
|
const contentClasses = computed(() => {
|
|
127
159
|
return {
|
|
128
160
|
'q-mt-sm': isNestedExpansionItem,
|
|
129
|
-
'q-mt-md': !isNestedExpansionItem && !props.useHeaderSeparator
|
|
161
|
+
'q-mt-md': !isNestedExpansionItem && !props.useHeaderSeparator,
|
|
162
|
+
'qas-expansion-item__content overflow-auto': !!props.maxContentHeight
|
|
130
163
|
}
|
|
131
164
|
})
|
|
132
165
|
|
|
@@ -142,11 +175,15 @@ const expansionProps = computed(() => {
|
|
|
142
175
|
} = attrs
|
|
143
176
|
|
|
144
177
|
return {
|
|
145
|
-
parent:
|
|
146
|
-
...propsPayload
|
|
147
|
-
},
|
|
178
|
+
parent: propsPayload,
|
|
148
179
|
|
|
149
180
|
item: {
|
|
181
|
+
disable: isDisabled.value,
|
|
182
|
+
hideExpandIcon: true,
|
|
183
|
+
label: props.label,
|
|
184
|
+
group: props.group,
|
|
185
|
+
|
|
186
|
+
// events
|
|
150
187
|
onUpdateModelValue,
|
|
151
188
|
onShow,
|
|
152
189
|
onBeforeShow,
|
|
@@ -157,13 +194,30 @@ const expansionProps = computed(() => {
|
|
|
157
194
|
}
|
|
158
195
|
})
|
|
159
196
|
|
|
197
|
+
const boxProps = computed(() => {
|
|
198
|
+
/**
|
|
199
|
+
* Caso o QasExpansionItem estiver dentro de um QasBox e não for um QasExpansionItem
|
|
200
|
+
* dentro de outro QasExpansionItem, o componente terá uma borda.
|
|
201
|
+
*/
|
|
202
|
+
const isBoxed = isNestedBox && !isNestedExpansionItem
|
|
203
|
+
|
|
204
|
+
if (!isBoxed) return {}
|
|
205
|
+
|
|
206
|
+
return {
|
|
207
|
+
unelevated: isBoxed,
|
|
208
|
+
outlined: isBoxed
|
|
209
|
+
}
|
|
210
|
+
})
|
|
211
|
+
|
|
212
|
+
const isDisabled = computed(() => props.disable || props.disableButton)
|
|
213
|
+
|
|
160
214
|
// functions
|
|
161
215
|
|
|
162
216
|
/**
|
|
163
217
|
* Caso o componente esteja dentro de um QasExpansionItem, verifica se existe um próximo irmão
|
|
164
218
|
* para adicionar um separador.
|
|
165
219
|
*/
|
|
166
|
-
function setHasNextSibling (
|
|
220
|
+
function setHasNextSibling () {
|
|
167
221
|
if (!isNestedExpansionItem) return
|
|
168
222
|
|
|
169
223
|
const hasTextContentSibling = !!expansionItem.value.nextSibling?.textContent?.trim?.()
|
|
@@ -171,21 +225,31 @@ function setHasNextSibling (value) {
|
|
|
171
225
|
|
|
172
226
|
hasNextSibling.value = hasElementSibling || hasTextContentSibling
|
|
173
227
|
}
|
|
228
|
+
|
|
229
|
+
function setShowContent () {
|
|
230
|
+
showContent.value = true
|
|
231
|
+
}
|
|
174
232
|
</script>
|
|
175
233
|
|
|
176
234
|
<style lang="scss">
|
|
177
235
|
.qas-expansion-item {
|
|
178
236
|
$root: &;
|
|
179
237
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
238
|
+
&--disabled {
|
|
239
|
+
.q-item.disabled {
|
|
240
|
+
opacity: 1 !important;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
&--disabled-full {
|
|
245
|
+
#{$root}__label {
|
|
246
|
+
color: $grey-6 !important;
|
|
247
|
+
}
|
|
184
248
|
}
|
|
185
249
|
|
|
186
250
|
&--error {
|
|
187
251
|
#{$root}__box {
|
|
188
|
-
border: 2px solid $negative;
|
|
252
|
+
border: 2px solid $negative !important;
|
|
189
253
|
}
|
|
190
254
|
|
|
191
255
|
#{$root}__error-message {
|
|
@@ -193,6 +257,28 @@ function setHasNextSibling (value) {
|
|
|
193
257
|
}
|
|
194
258
|
}
|
|
195
259
|
|
|
260
|
+
&__content {
|
|
261
|
+
max-height: v-bind("props.maxContentHeight");
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
// em alguns casos quando usado com grid, o espaçamento afetava o header, com z-index o problema é resolvido
|
|
265
|
+
&__header {
|
|
266
|
+
position: relative;
|
|
267
|
+
z-index: 1;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
.q-expansion-item {
|
|
271
|
+
#{$root}__dropdown {
|
|
272
|
+
transition: transform var(--qas-generic-transition);;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
&--expanded {
|
|
276
|
+
#{$root}__dropdown {
|
|
277
|
+
transform: rotate(180deg);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
|
|
196
282
|
.q-item {
|
|
197
283
|
margin-top: 0;
|
|
198
284
|
min-height: auto;
|
|
@@ -8,6 +8,16 @@ props:
|
|
|
8
8
|
desc: Lista de badges que serão exibidas na parte superior do card.
|
|
9
9
|
type: Array
|
|
10
10
|
|
|
11
|
+
disable:
|
|
12
|
+
desc: Desabilita o componente e aplica estilo de desabilitado no label e no button.
|
|
13
|
+
default: false
|
|
14
|
+
type: Boolean
|
|
15
|
+
|
|
16
|
+
disable-button:
|
|
17
|
+
desc: Desabilita o componente sem aplicar o estilo de desabilitado no label (usar em casos onde não tem conteúdo no slot content).
|
|
18
|
+
default: false
|
|
19
|
+
type: Boolean
|
|
20
|
+
|
|
11
21
|
error:
|
|
12
22
|
desc: Booleano que caso seja true o card passa a ter uma borda vermelha.
|
|
13
23
|
type: Boolean
|
|
@@ -16,10 +26,25 @@ props:
|
|
|
16
26
|
desc: Mensagem de erro onde será exibida na parte inferior do card.
|
|
17
27
|
type: String
|
|
18
28
|
|
|
29
|
+
group:
|
|
30
|
+
desc: Agrupamento para estado aberto|fechado.
|
|
31
|
+
default: ''
|
|
32
|
+
type: String
|
|
33
|
+
|
|
19
34
|
label:
|
|
20
35
|
desc: Titulo exibido na parte superior do card.
|
|
21
36
|
type: String
|
|
22
37
|
|
|
38
|
+
model-value:
|
|
39
|
+
desc: Model que controla o estado aberto|fechado.
|
|
40
|
+
default: false
|
|
41
|
+
type: Boolean
|
|
42
|
+
|
|
43
|
+
max-content-height:
|
|
44
|
+
desc: Define um tamanho máximo de altura do conteúdo.
|
|
45
|
+
default: ''
|
|
46
|
+
type: String
|
|
47
|
+
|
|
23
48
|
grid-generator-props:
|
|
24
49
|
desc: Propriedades que serão repassadas para o QasGridGenerator.
|
|
25
50
|
type: Object
|
|
@@ -31,13 +56,21 @@ props:
|
|
|
31
56
|
|
|
32
57
|
slots:
|
|
33
58
|
header:
|
|
34
|
-
desc:
|
|
59
|
+
desc: Slot para substituir o conteúdo do header (não inclui o botão dropdown).
|
|
35
60
|
|
|
36
61
|
header-bottom:
|
|
37
|
-
desc:
|
|
62
|
+
desc: Slot para acessar o conteúdo que fica abaixo do header.
|
|
38
63
|
|
|
39
|
-
label:
|
|
40
|
-
desc:
|
|
64
|
+
header-label:
|
|
65
|
+
desc: Slot para substituir o conteúdo da label do header.
|
|
41
66
|
|
|
42
67
|
content:
|
|
43
|
-
desc:
|
|
68
|
+
desc: Slot para substituir o conteúdo principal do card.
|
|
69
|
+
|
|
70
|
+
events:
|
|
71
|
+
'@update:model-value -> function(value)':
|
|
72
|
+
desc: Dispara quando o model-value altera, também usado para v-model.
|
|
73
|
+
params:
|
|
74
|
+
value:
|
|
75
|
+
desc: Novo valor do model.
|
|
76
|
+
type: Boolean
|
|
@@ -160,7 +160,7 @@ export default {
|
|
|
160
160
|
const field = { ...this.fields[key], ...this.formattedFieldsProps?.[decamelize(key)] }
|
|
161
161
|
const value = humanize(field, this.normalizeValues(filters[key], field?.multiple))
|
|
162
162
|
|
|
163
|
-
if (!value) continue
|
|
163
|
+
if (!value || (Array.isArray(value) && !value.length)) continue
|
|
164
164
|
|
|
165
165
|
const { label, name } = field
|
|
166
166
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<qas-btn data-cy="filters-btn" icon="sym_r_filter_alt" label="Filtrar" :use-label-on-small-screen="false" variant="tertiary">
|
|
3
|
-
<q-menu ref="menu" anchor="center right" class="full-width" max-width="270px"
|
|
3
|
+
<q-menu ref="menu" anchor="center right" class="full-width" max-width="270px" v-bind="menuProps" no-refocus self="top right">
|
|
4
4
|
<div v-if="loading" class="q-pa-xl text-center">
|
|
5
5
|
<q-spinner color="grey" size="2em" />
|
|
6
6
|
</div>
|
|
@@ -2,22 +2,26 @@
|
|
|
2
2
|
<div :class="fieldsetClasses">
|
|
3
3
|
<div v-for="(fieldsetItem, fieldsetItemKey) in normalizedFields" :key="fieldsetItemKey" :class="getFieldSetColumnClass(fieldsetItem.column)">
|
|
4
4
|
<component :is="containerComponent.is" v-bind="containerComponent.props">
|
|
5
|
-
<slot v-if="
|
|
6
|
-
<qas-header v-bind="getHeaderProps(fieldsetItem)" />
|
|
5
|
+
<slot v-if="fieldsetItem.__hasFieldset" :name="`legend-${fieldsetItemKey}`">
|
|
6
|
+
<qas-header v-if="fieldsetItem.__hasHeader" v-bind="getHeaderProps(fieldsetItem)" />
|
|
7
7
|
</slot>
|
|
8
8
|
|
|
9
9
|
<div>
|
|
10
10
|
<slot :fields="fieldsetItem.fields?.visible" :name="`legend-section-${fieldsetItemKey}`">
|
|
11
|
-
<div class="
|
|
12
|
-
<div
|
|
13
|
-
<div
|
|
14
|
-
<
|
|
15
|
-
<
|
|
16
|
-
|
|
11
|
+
<div class="q-col-gutter-md row">
|
|
12
|
+
<div class="col">
|
|
13
|
+
<div :class="fieldContainerClasses">
|
|
14
|
+
<div v-for="(field, key) in fieldsetItem.fields.visible" :key="key" :class="getFieldClass({ index: key, fields: normalizedFields })">
|
|
15
|
+
<slot :field="field" :name="`field-${field.name}`">
|
|
16
|
+
<qas-field :disable="isFieldDisabled(field)" v-bind="props.fieldsProps[field.name]" :error="props.errors[key]" :field="field" :model-value="props.modelValue[field.name]" @update:model-value="updateModelValue({ key: field.name, value: $event })" />
|
|
17
|
+
</slot>
|
|
18
|
+
</div>
|
|
17
19
|
</div>
|
|
18
20
|
</div>
|
|
19
21
|
|
|
20
|
-
<
|
|
22
|
+
<div v-if="hasButtonProps(fieldsetItem)" class="col-12 col-sm-auto items-end justify-end row">
|
|
23
|
+
<qas-btn v-bind="fieldsetItem.buttonProps" />
|
|
24
|
+
</div>
|
|
21
25
|
</div>
|
|
22
26
|
|
|
23
27
|
<div v-for="(field, key) in fieldsetItem.fields.hidden" :key="key">
|
|
@@ -27,6 +31,8 @@
|
|
|
27
31
|
</div>
|
|
28
32
|
</slot>
|
|
29
33
|
</div>
|
|
34
|
+
|
|
35
|
+
<slot v-if="fieldsetItem.__hasFieldset" :name="`legend-bottom-${fieldsetItemKey}`" />
|
|
30
36
|
</component>
|
|
31
37
|
</div>
|
|
32
38
|
</div>
|
|
@@ -97,7 +103,7 @@ provide('isFormGenerator', true)
|
|
|
97
103
|
// composables
|
|
98
104
|
const { classes, getFieldClass, getFieldSetColumnClass } = useGenerator({ props })
|
|
99
105
|
|
|
100
|
-
const { fieldsetClasses, hasFieldset
|
|
106
|
+
const { fieldsetClasses, hasFieldset } = useFieldset({ props })
|
|
101
107
|
|
|
102
108
|
const screen = useScreen()
|
|
103
109
|
|
|
@@ -163,13 +169,29 @@ const normalizedFields = computed(() => {
|
|
|
163
169
|
for (const fieldsetKey in props.fieldset) {
|
|
164
170
|
const fieldsetItem = props.fieldset[fieldsetKey]
|
|
165
171
|
|
|
172
|
+
const {
|
|
173
|
+
label,
|
|
174
|
+
description,
|
|
175
|
+
column,
|
|
176
|
+
buttonProps,
|
|
177
|
+
headerProps
|
|
178
|
+
} = fieldsetItem
|
|
179
|
+
|
|
180
|
+
const hasHeader = !!(label || description || Object.keys(headerProps || {}).length)
|
|
181
|
+
|
|
166
182
|
fields[fieldsetKey] = {
|
|
167
|
-
label
|
|
168
|
-
description
|
|
169
|
-
column
|
|
170
|
-
buttonProps
|
|
183
|
+
label,
|
|
184
|
+
description,
|
|
185
|
+
column,
|
|
186
|
+
buttonProps,
|
|
171
187
|
fields: { hidden: {}, visible: {} },
|
|
172
|
-
headerProps
|
|
188
|
+
headerProps,
|
|
189
|
+
|
|
190
|
+
// Indica que existe um fieldset para que o legend-bottom possa ser renderizado.
|
|
191
|
+
__hasFieldset: true,
|
|
192
|
+
|
|
193
|
+
// Indica que existe props para que o header seja renderizado.
|
|
194
|
+
__hasHeader: hasHeader
|
|
173
195
|
}
|
|
174
196
|
|
|
175
197
|
fieldsetItem.fields.forEach(fieldName => {
|
|
@@ -197,7 +219,7 @@ const fieldContainerClasses = computed(() => {
|
|
|
197
219
|
]
|
|
198
220
|
})
|
|
199
221
|
|
|
200
|
-
//
|
|
222
|
+
// functions
|
|
201
223
|
function getFieldType ({ type }) {
|
|
202
224
|
return type === 'hidden' ? 'hidden' : 'visible'
|
|
203
225
|
}
|
|
@@ -230,10 +252,6 @@ function hasButtonProps ({ buttonProps = {} }) {
|
|
|
230
252
|
return !!Object.keys(buttonProps).length
|
|
231
253
|
}
|
|
232
254
|
|
|
233
|
-
function getRowContainerClasses (item) {
|
|
234
|
-
return { row: hasButtonProps(item) }
|
|
235
|
-
}
|
|
236
|
-
|
|
237
255
|
// composables
|
|
238
256
|
function useFieldset ({ props }) {
|
|
239
257
|
const fieldsetClasses = computed(() => {
|
|
@@ -248,15 +266,9 @@ function useFieldset ({ props }) {
|
|
|
248
266
|
|
|
249
267
|
const hasFieldset = computed(() => !!Object.keys(props.fieldset).length)
|
|
250
268
|
|
|
251
|
-
function hasFieldsetItem (fieldset = {}) {
|
|
252
|
-
return !!Object.keys(fieldset).length
|
|
253
|
-
}
|
|
254
|
-
|
|
255
269
|
return {
|
|
256
270
|
fieldsetClasses,
|
|
257
|
-
hasFieldset
|
|
258
|
-
|
|
259
|
-
hasFieldsetItem
|
|
271
|
+
hasFieldset
|
|
260
272
|
}
|
|
261
273
|
}
|
|
262
274
|
</script>
|
|
@@ -97,6 +97,9 @@ slots:
|
|
|
97
97
|
default: {}
|
|
98
98
|
type: Object
|
|
99
99
|
|
|
100
|
+
'legend-bottom-[nome-da-chave]':
|
|
101
|
+
desc: Acessa o slot da seção abaixo do conteúdo do form de um fieldset específico.
|
|
102
|
+
|
|
100
103
|
events:
|
|
101
104
|
'@update:model-value -> function(value)':
|
|
102
105
|
desc: Dispara quando o model-value altera, também usado para v-model.
|
|
@@ -19,6 +19,11 @@ defineOptions({ name: 'QasGrabbable' })
|
|
|
19
19
|
const props = defineProps({
|
|
20
20
|
useScrollBar: {
|
|
21
21
|
type: Boolean
|
|
22
|
+
},
|
|
23
|
+
|
|
24
|
+
cancelMouseDownTarget: {
|
|
25
|
+
type: String,
|
|
26
|
+
default: ''
|
|
22
27
|
}
|
|
23
28
|
})
|
|
24
29
|
|
|
@@ -61,17 +66,20 @@ function handleEnableScrollOnGrab () {
|
|
|
61
66
|
function initScrollOnGrab () {
|
|
62
67
|
if (hasScrollOnGrab.value) return
|
|
63
68
|
|
|
64
|
-
scrollOnGrab.value = setScrollOnGrab(
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
+
scrollOnGrab.value = setScrollOnGrab(
|
|
70
|
+
grabContainer.value,
|
|
71
|
+
{
|
|
72
|
+
onGrabFn: onGrab,
|
|
73
|
+
onMoveFn: setGrabPosition,
|
|
74
|
+
onScrollFn: setGrabPosition
|
|
75
|
+
},
|
|
76
|
+
props.cancelMouseDownTarget
|
|
77
|
+
)
|
|
69
78
|
}
|
|
70
79
|
|
|
71
80
|
function destroyScrollOnGrab () {
|
|
72
81
|
if (!hasScrollOnGrab.value) return
|
|
73
82
|
|
|
74
|
-
scrollOnGrab.value.destroyEvents()
|
|
75
83
|
scrollOnGrab.value.element.style.cursor = 'auto'
|
|
76
84
|
scrollOnGrab.value = {}
|
|
77
85
|
|