@bildvitta/quasar-ui-asteroid 3.17.0-beta.1 → 3.17.0-beta.3
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 +1 -1
- package/src/components/form-generator/QasFormGenerator.vue +23 -9
- package/src/components/grid-generator/QasGridGenerator.vue +50 -24
- package/src/components/grid-generator/QasGridGenerator.yml +15 -0
- package/src/components/header/QasHeader.vue +3 -3
- package/src/components/select/QasSelect.vue +25 -0
- package/src/components/select/QasSelect.yml +4 -0
package/package.json
CHANGED
|
@@ -2,10 +2,8 @@
|
|
|
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="fieldsetItem
|
|
6
|
-
<qas-
|
|
7
|
-
|
|
8
|
-
<div v-if="fieldsetItem.description" class="q-mb-md text-body1 text-grey-8">{{ fieldsetItem.description }}</div>
|
|
5
|
+
<slot v-if="hasFieldsetItem(fieldsetItem)" :name="`legend-${fieldsetItemKey}`">
|
|
6
|
+
<qas-header v-bind="getHeaderProps(fieldsetItem)" />
|
|
9
7
|
</slot>
|
|
10
8
|
|
|
11
9
|
<div>
|
|
@@ -99,7 +97,7 @@ provide('isFormGenerator', true)
|
|
|
99
97
|
// composables
|
|
100
98
|
const { classes, getFieldClass, getFieldSetColumnClass } = useGenerator({ props })
|
|
101
99
|
|
|
102
|
-
const { fieldsetClasses, hasFieldset } = useFieldset({ props })
|
|
100
|
+
const { fieldsetClasses, hasFieldset, hasFieldsetItem } = useFieldset({ props })
|
|
103
101
|
|
|
104
102
|
const screen = useScreen()
|
|
105
103
|
|
|
@@ -170,7 +168,8 @@ const normalizedFields = computed(() => {
|
|
|
170
168
|
description: fieldsetItem.description,
|
|
171
169
|
column: fieldsetItem.column,
|
|
172
170
|
buttonProps: fieldsetItem.buttonProps,
|
|
173
|
-
fields: { hidden: {}, visible: {} }
|
|
171
|
+
fields: { hidden: {}, visible: {} },
|
|
172
|
+
headerProps: fieldsetItem.headerProps
|
|
174
173
|
}
|
|
175
174
|
|
|
176
175
|
fieldsetItem.fields.forEach(fieldName => {
|
|
@@ -203,8 +202,17 @@ function getFieldType ({ type }) {
|
|
|
203
202
|
return type === 'hidden' ? 'hidden' : 'visible'
|
|
204
203
|
}
|
|
205
204
|
|
|
206
|
-
function
|
|
207
|
-
return
|
|
205
|
+
function getHeaderProps (fieldsetItem) {
|
|
206
|
+
return {
|
|
207
|
+
description: fieldsetItem.description,
|
|
208
|
+
|
|
209
|
+
labelProps: {
|
|
210
|
+
...fieldsetItem.headerProps?.labelProps,
|
|
211
|
+
...(fieldsetItem.label && { label: fieldsetItem.label })
|
|
212
|
+
},
|
|
213
|
+
|
|
214
|
+
...fieldsetItem.headerProps
|
|
215
|
+
}
|
|
208
216
|
}
|
|
209
217
|
|
|
210
218
|
function isFieldDisabled ({ disable }) {
|
|
@@ -240,9 +248,15 @@ function useFieldset ({ props }) {
|
|
|
240
248
|
|
|
241
249
|
const hasFieldset = computed(() => !!Object.keys(props.fieldset).length)
|
|
242
250
|
|
|
251
|
+
function hasFieldsetItem (fieldset = {}) {
|
|
252
|
+
return !!Object.keys(fieldset).length
|
|
253
|
+
}
|
|
254
|
+
|
|
243
255
|
return {
|
|
244
256
|
fieldsetClasses,
|
|
245
|
-
hasFieldset
|
|
257
|
+
hasFieldset,
|
|
258
|
+
|
|
259
|
+
hasFieldsetItem
|
|
246
260
|
}
|
|
247
261
|
}
|
|
248
262
|
</script>
|
|
@@ -1,31 +1,35 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<
|
|
3
|
-
<
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
2
|
+
<component :is="component.is" v-bind="component.props">
|
|
3
|
+
<qas-header v-if="hasHeader" v-bind="props.headerProps" />
|
|
4
|
+
|
|
5
|
+
<div :class="classes">
|
|
6
|
+
<div v-for="(field, key) in fieldsByResult" :key="key" :class="getContainerClass({ key })">
|
|
7
|
+
<slot :field="field" :name="`field-${field.name}`">
|
|
8
|
+
<qas-grid-item :use-ellipsis="props.useEllipsis" :use-inline="props.useInline">
|
|
9
|
+
<template #header>
|
|
10
|
+
<slot :field="field" :name="`header-field-${field.name}`">
|
|
11
|
+
<slot :field="field" name="header">
|
|
12
|
+
<div :class="headerClass" :data-cy="`grid-generator-${field.name}-field`" :title="getTitle(field, 'label')">
|
|
13
|
+
{{ field.label }}
|
|
14
|
+
</div>
|
|
15
|
+
</slot>
|
|
12
16
|
</slot>
|
|
13
|
-
</
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
</
|
|
17
|
+
</template>
|
|
18
|
+
|
|
19
|
+
<template #content>
|
|
20
|
+
<slot :field="field" :name="`content-field-${field.name}`">
|
|
21
|
+
<slot :field="field" name="content">
|
|
22
|
+
<div :class="contentClass" :data-cy="`grid-generator-${field.name}-result`" :title="getTitle(field, 'formattedResult')">
|
|
23
|
+
{{ field.formattedResult }}
|
|
24
|
+
</div>
|
|
25
|
+
</slot>
|
|
22
26
|
</slot>
|
|
23
|
-
</
|
|
24
|
-
</
|
|
25
|
-
</
|
|
26
|
-
</
|
|
27
|
+
</template>
|
|
28
|
+
</qas-grid-item>
|
|
29
|
+
</slot>
|
|
30
|
+
</div>
|
|
27
31
|
</div>
|
|
28
|
-
</
|
|
32
|
+
</component>
|
|
29
33
|
</template>
|
|
30
34
|
|
|
31
35
|
<script setup>
|
|
@@ -44,6 +48,11 @@ const screen = useScreen()
|
|
|
44
48
|
const props = defineProps({
|
|
45
49
|
...baseProps,
|
|
46
50
|
|
|
51
|
+
boxProps: {
|
|
52
|
+
type: Object,
|
|
53
|
+
default: () => ({})
|
|
54
|
+
},
|
|
55
|
+
|
|
47
56
|
contentClass: {
|
|
48
57
|
default: '',
|
|
49
58
|
type: [Array, Object, String]
|
|
@@ -54,6 +63,11 @@ const props = defineProps({
|
|
|
54
63
|
type: [Array, Object, String]
|
|
55
64
|
},
|
|
56
65
|
|
|
66
|
+
headerProps: {
|
|
67
|
+
type: Object,
|
|
68
|
+
default: () => ({})
|
|
69
|
+
},
|
|
70
|
+
|
|
57
71
|
emptyResultText: {
|
|
58
72
|
default: '-',
|
|
59
73
|
type: String
|
|
@@ -64,6 +78,10 @@ const props = defineProps({
|
|
|
64
78
|
type: Object
|
|
65
79
|
},
|
|
66
80
|
|
|
81
|
+
useBox: {
|
|
82
|
+
type: Boolean
|
|
83
|
+
},
|
|
84
|
+
|
|
67
85
|
useEmptyResult: {
|
|
68
86
|
default: true,
|
|
69
87
|
type: Boolean
|
|
@@ -85,6 +103,7 @@ const { classes, getFieldClass } = useGenerator({ props })
|
|
|
85
103
|
// computed
|
|
86
104
|
const hasResult = computed(() => Object.keys(props.result).length)
|
|
87
105
|
const hasFields = computed(() => Object.keys(props.fields).length)
|
|
106
|
+
const hasHeader = computed(() => Object.keys(props.headerProps).length)
|
|
88
107
|
|
|
89
108
|
const contentClass = computed(() => {
|
|
90
109
|
return [
|
|
@@ -96,6 +115,13 @@ const contentClass = computed(() => {
|
|
|
96
115
|
]
|
|
97
116
|
})
|
|
98
117
|
|
|
118
|
+
const component = computed(() => {
|
|
119
|
+
return {
|
|
120
|
+
is: props.useBox ? 'qas-box' : 'div',
|
|
121
|
+
props: props.useBox ? props.boxProps : {}
|
|
122
|
+
}
|
|
123
|
+
})
|
|
124
|
+
|
|
99
125
|
const headerClass = computed(() => {
|
|
100
126
|
return [
|
|
101
127
|
props.headerClass,
|
|
@@ -4,6 +4,11 @@ meta:
|
|
|
4
4
|
desc: Componente para criação de textos dinâmicos.
|
|
5
5
|
|
|
6
6
|
props:
|
|
7
|
+
box-props:
|
|
8
|
+
desc: Propriedades do "QasBox" que envolve o conteúdo.
|
|
9
|
+
default: {}
|
|
10
|
+
type: Object
|
|
11
|
+
|
|
7
12
|
columns:
|
|
8
13
|
desc: Colunas do grid de cada campo.
|
|
9
14
|
default: col-6
|
|
@@ -41,6 +46,11 @@ props:
|
|
|
41
46
|
default: 'text-bold'
|
|
42
47
|
type: [Array, Object, String]
|
|
43
48
|
|
|
49
|
+
header-props:
|
|
50
|
+
desc: Propriedades do "QasHeader".
|
|
51
|
+
default: {}
|
|
52
|
+
type: Object
|
|
53
|
+
|
|
44
54
|
result:
|
|
45
55
|
desc: Resultado contendo todas informações para serem exibidas na tela.
|
|
46
56
|
default: {}
|
|
@@ -52,6 +62,11 @@ props:
|
|
|
52
62
|
default: true
|
|
53
63
|
type: Boolean
|
|
54
64
|
|
|
65
|
+
use-box:
|
|
66
|
+
desc: Controla se o componente vai ter o QasBox englobando ou não.
|
|
67
|
+
default: false
|
|
68
|
+
type: Boolean
|
|
69
|
+
|
|
55
70
|
use-ellipsis:
|
|
56
71
|
desc: Adiciona a classe "ellipsis" para o elemento do conteúdo.
|
|
57
72
|
default: true
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
<div v-if="hasLabelSection" class="items-center justify-between no-wrap row" :class="labelSectionClasses">
|
|
4
4
|
<div class="items-center q-col-gutter-sm row">
|
|
5
5
|
<slot name="label">
|
|
6
|
-
<qas-label v-bind="defaultLabelProps" />
|
|
6
|
+
<qas-label v-if="hasLabel" v-bind="defaultLabelProps" />
|
|
7
7
|
</slot>
|
|
8
8
|
|
|
9
9
|
<div v-if="hasBadges" class="col-auto items-center q-col-gutter-sm row">
|
|
@@ -73,7 +73,7 @@ const props = defineProps({
|
|
|
73
73
|
},
|
|
74
74
|
|
|
75
75
|
spacing: {
|
|
76
|
-
default: Spacing.
|
|
76
|
+
default: Spacing.Md,
|
|
77
77
|
type: String,
|
|
78
78
|
validator: gutterValidator
|
|
79
79
|
}
|
|
@@ -102,5 +102,5 @@ const hasLabel = computed(() => !!Object.keys(props.labelProps).length)
|
|
|
102
102
|
const hasDefaultButton = computed(() => !!Object.keys(props.buttonProps).length)
|
|
103
103
|
const hasDefaultActionsMenu = computed(() => !!Object.keys(props.actionsMenuProps).length)
|
|
104
104
|
const hasDescriptionSection = computed(() => props.description || slots.description)
|
|
105
|
-
const hasLabelSection = computed(() => hasLabel.value || slots.label)
|
|
105
|
+
const hasLabelSection = computed(() => hasLabel.value || slots.label || hasBadges.value)
|
|
106
106
|
</script>
|
|
@@ -79,6 +79,10 @@ export default {
|
|
|
79
79
|
type: Boolean
|
|
80
80
|
},
|
|
81
81
|
|
|
82
|
+
useAutoSelect: {
|
|
83
|
+
type: Boolean
|
|
84
|
+
},
|
|
85
|
+
|
|
82
86
|
useFetchOptionsOnCreate: {
|
|
83
87
|
default: true,
|
|
84
88
|
type: Boolean
|
|
@@ -187,6 +191,10 @@ export default {
|
|
|
187
191
|
return getRequiredLabel({ label: this.label, required: this.required })
|
|
188
192
|
},
|
|
189
193
|
|
|
194
|
+
canSetDefaultOption () {
|
|
195
|
+
return (this.required || this.useAutoSelect) && this.options.length === 1 && !this.modelValue
|
|
196
|
+
},
|
|
197
|
+
|
|
190
198
|
// redesign
|
|
191
199
|
componentClasses () {
|
|
192
200
|
return {
|
|
@@ -220,15 +228,24 @@ export default {
|
|
|
220
228
|
this.togglePopupContentClass(value)
|
|
221
229
|
},
|
|
222
230
|
|
|
231
|
+
required () {
|
|
232
|
+
if (!this.canSetDefaultOption) return
|
|
233
|
+
|
|
234
|
+
this.setDefaultOption()
|
|
235
|
+
},
|
|
236
|
+
|
|
223
237
|
options: {
|
|
224
238
|
handler () {
|
|
225
239
|
if (this.useLazyLoading && this.mx_hasFilteredOptions) return
|
|
226
240
|
|
|
227
241
|
if (this.fuse || this.hasFuse) this.setFuse()
|
|
228
242
|
|
|
243
|
+
if (this.canSetDefaultOption) this.setDefaultOption()
|
|
244
|
+
|
|
229
245
|
this.mx_filteredOptions = [...this.options]
|
|
230
246
|
},
|
|
231
247
|
|
|
248
|
+
deep: true,
|
|
232
249
|
immediate: true
|
|
233
250
|
}
|
|
234
251
|
},
|
|
@@ -303,6 +320,14 @@ export default {
|
|
|
303
320
|
if (popupContentElement) {
|
|
304
321
|
popupContentElement.classList.toggle('qas-select__is-fetching', force)
|
|
305
322
|
}
|
|
323
|
+
},
|
|
324
|
+
|
|
325
|
+
setDefaultOption () {
|
|
326
|
+
const modelValue = this.attributes.emitValue
|
|
327
|
+
? this.options[0].value
|
|
328
|
+
: this.options[0]
|
|
329
|
+
|
|
330
|
+
this.$emit('update:modelValue', modelValue)
|
|
306
331
|
}
|
|
307
332
|
}
|
|
308
333
|
}
|
|
@@ -81,6 +81,10 @@ props:
|
|
|
81
81
|
type: String
|
|
82
82
|
examples: [value-key="uuid"]
|
|
83
83
|
|
|
84
|
+
use-auto-select:
|
|
85
|
+
desc: Controla se o select vai auto preencher em casos de ter uma única opção e não for required.
|
|
86
|
+
type: Boolean
|
|
87
|
+
|
|
84
88
|
use-fetch-options-on-create:
|
|
85
89
|
desc: Controla se o componente vai fazer um fetch das opções assim que o mesmo é criado (caso tenha lazy loading ativado).
|
|
86
90
|
default: true
|