@bildvitta/quasar-ui-asteroid 3.16.1 → 3.17.0-beta.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/package.json +1 -1
- package/src/components/badge/QasBadge.vue +51 -3
- package/src/components/badge/QasBadge.yml +29 -2
- package/src/components/box/QasBox.vue +26 -3
- package/src/components/box/QasBox.yml +16 -0
- package/src/components/card/QasCard.vue +38 -25
- package/src/components/chart-view/QasChartView.vue +13 -13
- package/src/components/{checkbox-group/QasCheckboxGroup.vue → checkbox/QasCheckbox.vue} +34 -12
- package/src/components/date-time-input/QasDateTimeInput.vue +13 -3
- package/src/components/dialog/QasDialog.vue +3 -1
- package/src/components/field/QasField.vue +18 -13
- package/src/components/filters/QasFilters.vue +16 -7
- package/src/components/filters/private/PvFiltersButton.vue +2 -1
- package/src/components/form-generator/QasFormGenerator.vue +87 -26
- package/src/components/form-generator/QasFormGenerator.yml +21 -2
- package/src/components/gallery-card/QasGalleryCard.vue +10 -3
- package/src/components/grid-generator/QasGridGenerator.vue +22 -13
- package/src/components/grid-generator/QasGridGenerator.yml +18 -2
- package/src/components/grid-item/QasGridItem.vue +89 -0
- package/src/components/grid-item/QasGridItem.yml +22 -0
- package/src/components/header/QasHeader.vue +106 -0
- package/src/components/header/QasHeader.yml +45 -0
- package/src/components/info/QasInfo.vue +155 -0
- package/src/components/info/QasInfo.yml +34 -0
- package/src/components/input/QasInput.vue +48 -3
- package/src/components/input/QasInput.yml +10 -0
- package/src/components/nested-fields/QasNestedFields.vue +58 -47
- package/src/components/nested-fields/QasNestedFields.yml +5 -0
- package/src/components/numeric-input/QasNumericInput.vue +38 -3
- package/src/components/numeric-input/QasNumericInput.yml +10 -0
- package/src/components/page-header/QasPageHeader.vue +5 -5
- package/src/components/page-header/QasPageHeader.yml +2 -2
- package/src/components/radio/QasRadio.vue +43 -0
- package/src/components/radio/QasRadio.yml +5 -0
- package/src/components/search-input/QasSearchInput.vue +26 -19
- package/src/components/select/QasSelect.vue +82 -10
- package/src/components/select-list-dialog/QasSelectListDialog.vue +14 -7
- package/src/components/table-generator/QasTableGenerator.vue +30 -5
- package/src/components/table-generator/QasTableGenerator.yml +9 -0
- package/src/components/tabs-generator/QasTabsGenerator.vue +3 -1
- package/src/components/toggle/QasToggle.vue +14 -0
- package/src/components/toggle/QasToggle.yml +5 -0
- package/src/composables/private/use-generator.js +9 -1
- package/src/css/components/checkbox.scss +2 -0
- package/src/css/components/field.scss +59 -2
- package/src/css/components/radio.scss +3 -1
- package/src/css/components/toggle.scss +3 -1
- package/src/css/utils/border.scss +5 -0
- package/src/helpers/get-placeholder.js +19 -0
- package/src/helpers/index.js +1 -0
- package/src/vue-plugin.js +18 -6
- package/src/components/header-actions/QasHeaderActions.vue +0 -76
- package/src/components/header-actions/QasHeaderActions.yml +0 -38
- /package/src/components/{checkbox-group/QasCheckboxGroup.yml → checkbox/QasCheckbox.yml} +0 -0
|
@@ -1,26 +1,35 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div :class="fieldsetClasses">
|
|
3
|
-
<div v-for="(fieldsetItem, fieldsetItemKey) in normalizedFields" :key="fieldsetItemKey" class="
|
|
4
|
-
<
|
|
5
|
-
<
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
3
|
+
<div v-for="(fieldsetItem, fieldsetItemKey) in normalizedFields" :key="fieldsetItemKey" :class="getFieldSetColumnClass(fieldsetItem.column)">
|
|
4
|
+
<component :is="containerComponent.is" v-bind="containerComponent.props">
|
|
5
|
+
<slot v-if="fieldsetItem.label" :name="`legend-${fieldsetItemKey}`">
|
|
6
|
+
<qas-label :label="fieldsetItem.label" :margin="getLabelMargin(fieldsetItem)" />
|
|
7
|
+
|
|
8
|
+
<div v-if="fieldsetItem.description" class="q-mb-md text-body1 text-grey-8">{{ fieldsetItem.description }}</div>
|
|
9
|
+
</slot>
|
|
10
|
+
|
|
11
|
+
<div>
|
|
12
|
+
<slot :fields="fieldsetItem.fields?.visible" :name="`legend-section-${fieldsetItemKey}`">
|
|
13
|
+
<div class="items-end justify-end" :class="getRowContainerClasses(fieldsetItem)">
|
|
14
|
+
<div :class="fieldContainerClasses">
|
|
15
|
+
<div v-for="(field, key) in fieldsetItem.fields.visible" :key="key" :class="getFieldClass({ index: key, fields: normalizedFields })">
|
|
16
|
+
<slot :field="field" :name="`field-${field.name}`">
|
|
17
|
+
<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 })" />
|
|
18
|
+
</slot>
|
|
19
|
+
</div>
|
|
20
|
+
</div>
|
|
21
|
+
|
|
22
|
+
<qas-btn v-if="hasButtonProps(fieldsetItem)" class="md:q-mt-none q-ml-md q-mt-md" v-bind="fieldsetItem.buttonProps" />
|
|
23
|
+
</div>
|
|
24
|
+
|
|
25
|
+
<div v-for="(field, key) in fieldsetItem.fields.hidden" :key="key">
|
|
26
|
+
<slot :field="field" :name="`field-${field.name}`">
|
|
27
|
+
<qas-field :disable="isFieldDisabled(field)" v-bind="props.fieldsProps[field.name]" :field="field" :model-value="props.modelValue[field.name]" @update:model-value="updateModelValue({ key: field.name, value: $event })" />
|
|
28
|
+
</slot>
|
|
29
|
+
</div>
|
|
21
30
|
</slot>
|
|
22
31
|
</div>
|
|
23
|
-
</
|
|
32
|
+
</component>
|
|
24
33
|
</div>
|
|
25
34
|
</div>
|
|
26
35
|
</template>
|
|
@@ -29,13 +38,19 @@
|
|
|
29
38
|
import { gutterValidator } from '../../helpers/private/gutter-validator'
|
|
30
39
|
import useGenerator, { baseProps } from '../../composables/private/use-generator'
|
|
31
40
|
import { Spacing } from '../../enums/Spacing'
|
|
32
|
-
import {
|
|
41
|
+
import { useScreen } from '../../composables'
|
|
42
|
+
import { computed, provide, inject } from 'vue'
|
|
33
43
|
|
|
34
44
|
defineOptions({ name: 'QasFormGenerator' })
|
|
35
45
|
|
|
36
46
|
const props = defineProps({
|
|
37
47
|
...baseProps,
|
|
38
48
|
|
|
49
|
+
boxProps: {
|
|
50
|
+
default: () => ({}),
|
|
51
|
+
type: Object
|
|
52
|
+
},
|
|
53
|
+
|
|
39
54
|
disable: {
|
|
40
55
|
type: Boolean
|
|
41
56
|
},
|
|
@@ -70,17 +85,44 @@ const props = defineProps({
|
|
|
70
85
|
order: {
|
|
71
86
|
default: () => [],
|
|
72
87
|
type: Array
|
|
88
|
+
},
|
|
89
|
+
|
|
90
|
+
useBox: {
|
|
91
|
+
type: Boolean
|
|
73
92
|
}
|
|
74
93
|
})
|
|
75
94
|
|
|
76
95
|
const emit = defineEmits(['update:modelValue'])
|
|
77
96
|
|
|
97
|
+
provide('isFormGenerator', true)
|
|
98
|
+
|
|
78
99
|
// composables
|
|
79
|
-
const { classes, getFieldClass } = useGenerator({ props })
|
|
100
|
+
const { classes, getFieldClass, getFieldSetColumnClass } = useGenerator({ props })
|
|
80
101
|
|
|
81
102
|
const { fieldsetClasses, hasFieldset } = useFieldset({ props })
|
|
82
103
|
|
|
104
|
+
const screen = useScreen()
|
|
105
|
+
|
|
106
|
+
// constants
|
|
107
|
+
const hasNestedFormGenerator = inject('isFormGenerator', false)
|
|
108
|
+
|
|
83
109
|
// computed
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Se o QasFormGenerator tiver um elemento acima que também é um QasFormGenerator,
|
|
113
|
+
* mesmo que a propriedade useBox seja true, o componente não deve renderizar o box.
|
|
114
|
+
*/
|
|
115
|
+
const containerComponent = computed(() => {
|
|
116
|
+
const hasBox = props.useBox && !hasNestedFormGenerator
|
|
117
|
+
|
|
118
|
+
return {
|
|
119
|
+
is: hasBox ? 'qas-box' : 'div',
|
|
120
|
+
props: {
|
|
121
|
+
...(hasBox && { ...props.boxProps })
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
})
|
|
125
|
+
|
|
84
126
|
const groupedFields = computed(() => {
|
|
85
127
|
const fields = { hidden: {}, visible: {} }
|
|
86
128
|
|
|
@@ -126,6 +168,8 @@ const normalizedFields = computed(() => {
|
|
|
126
168
|
fields[fieldsetKey] = {
|
|
127
169
|
label: fieldsetItem.label,
|
|
128
170
|
description: fieldsetItem.description,
|
|
171
|
+
column: fieldsetItem.column,
|
|
172
|
+
buttonProps: fieldsetItem.buttonProps,
|
|
129
173
|
fields: { hidden: {}, visible: {} }
|
|
130
174
|
}
|
|
131
175
|
|
|
@@ -145,11 +189,24 @@ const normalizedFields = computed(() => {
|
|
|
145
189
|
return fields
|
|
146
190
|
})
|
|
147
191
|
|
|
192
|
+
const fieldContainerClasses = computed(() => {
|
|
193
|
+
return [
|
|
194
|
+
...classes.value,
|
|
195
|
+
{
|
|
196
|
+
col: !screen.isSmall
|
|
197
|
+
}
|
|
198
|
+
]
|
|
199
|
+
})
|
|
200
|
+
|
|
148
201
|
// methods
|
|
149
202
|
function getFieldType ({ type }) {
|
|
150
203
|
return type === 'hidden' ? 'hidden' : 'visible'
|
|
151
204
|
}
|
|
152
205
|
|
|
206
|
+
function getLabelMargin (fieldsetItem) {
|
|
207
|
+
return fieldsetItem.description ? 'sm' : 'md'
|
|
208
|
+
}
|
|
209
|
+
|
|
153
210
|
function isFieldDisabled ({ disable }) {
|
|
154
211
|
return disable || props.disable
|
|
155
212
|
}
|
|
@@ -161,13 +218,21 @@ function updateModelValue ({ key, value }) {
|
|
|
161
218
|
emit('update:modelValue', models)
|
|
162
219
|
}
|
|
163
220
|
|
|
221
|
+
function hasButtonProps ({ buttonProps = {} }) {
|
|
222
|
+
return !!Object.keys(buttonProps).length
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
function getRowContainerClasses (item) {
|
|
226
|
+
return { row: hasButtonProps(item) }
|
|
227
|
+
}
|
|
228
|
+
|
|
164
229
|
// composables
|
|
165
230
|
function useFieldset ({ props }) {
|
|
166
231
|
const fieldsetClasses = computed(() => {
|
|
167
232
|
const classes = ['row']
|
|
168
233
|
|
|
169
234
|
if (props.fieldsetGutter) {
|
|
170
|
-
classes.push(`q-col-gutter
|
|
235
|
+
classes.push(`q-col-gutter-${props.fieldsetGutter}`)
|
|
171
236
|
}
|
|
172
237
|
|
|
173
238
|
return classes
|
|
@@ -180,8 +245,4 @@ function useFieldset ({ props }) {
|
|
|
180
245
|
hasFieldset
|
|
181
246
|
}
|
|
182
247
|
}
|
|
183
|
-
|
|
184
|
-
function getLabelMargin (fieldsetItem) {
|
|
185
|
-
return fieldsetItem.description ? 'sm' : 'md'
|
|
186
|
-
}
|
|
187
248
|
</script>
|
|
@@ -19,6 +19,11 @@ props:
|
|
|
19
19
|
default: "false"
|
|
20
20
|
type: Boolean
|
|
21
21
|
|
|
22
|
+
box-props:
|
|
23
|
+
desc: Propriedades repassadas para o componente `QasBox`.
|
|
24
|
+
default: {}
|
|
25
|
+
type: Object
|
|
26
|
+
|
|
22
27
|
error:
|
|
23
28
|
desc: Objeto contendo propriedades contendo a mensagem de erro.
|
|
24
29
|
default: {}
|
|
@@ -67,6 +72,11 @@ props:
|
|
|
67
72
|
default: []
|
|
68
73
|
type: Array
|
|
69
74
|
|
|
75
|
+
use-box:
|
|
76
|
+
desc: Contra QasBox dentro do form-generator e fieldset.
|
|
77
|
+
default: false
|
|
78
|
+
type: Boolean
|
|
79
|
+
|
|
70
80
|
slots:
|
|
71
81
|
'field-[nome-da-chave]':
|
|
72
82
|
desc: Acessa o slot de um campo especifico.
|
|
@@ -75,8 +85,17 @@ slots:
|
|
|
75
85
|
desc: Payload do campo atual.
|
|
76
86
|
default: {}
|
|
77
87
|
type: Object
|
|
78
|
-
|
|
79
|
-
|
|
88
|
+
|
|
89
|
+
'legend-[nome-da-chave]':
|
|
90
|
+
desc: Acessa o slot de um rótulo (label).
|
|
91
|
+
|
|
92
|
+
'legend-section-[nome-da-chave]':
|
|
93
|
+
desc: Acessa o slot da seção de fields daquele fieldset.
|
|
94
|
+
scope:
|
|
95
|
+
fields:
|
|
96
|
+
desc: Campos daquela seção.
|
|
97
|
+
default: {}
|
|
98
|
+
type: Object
|
|
80
99
|
|
|
81
100
|
events:
|
|
82
101
|
'@update:model-value -> function(value)':
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<
|
|
2
|
+
<qas-box class="bg-white qas-gallery-card" :class="classes" v-bind="boxProps">
|
|
3
3
|
<header class="flat items-center no-wrap row" :class="headerClasses">
|
|
4
4
|
<slot name="header">
|
|
5
5
|
<div class="ellipsis q-mr-xs qas-gallery__name text-subtitle1">
|
|
@@ -45,11 +45,11 @@
|
|
|
45
45
|
<qas-grid-generator v-if="hasGridGenerator" v-bind="props.gridGeneratorProps" />
|
|
46
46
|
</slot>
|
|
47
47
|
</div>
|
|
48
|
-
</
|
|
48
|
+
</qas-box>
|
|
49
49
|
</template>
|
|
50
50
|
|
|
51
51
|
<script setup>
|
|
52
|
-
import { computed, useSlots } from 'vue'
|
|
52
|
+
import { computed, useSlots, inject } from 'vue'
|
|
53
53
|
|
|
54
54
|
defineOptions({ name: 'QasGalleryCard' })
|
|
55
55
|
|
|
@@ -91,6 +91,13 @@ const props = defineProps({
|
|
|
91
91
|
|
|
92
92
|
const slots = useSlots()
|
|
93
93
|
|
|
94
|
+
const isInsideBox = inject('isBox', false)
|
|
95
|
+
|
|
96
|
+
const boxProps = {
|
|
97
|
+
outlined: isInsideBox,
|
|
98
|
+
unelevated: isInsideBox
|
|
99
|
+
}
|
|
100
|
+
|
|
94
101
|
const errorClasses = [
|
|
95
102
|
'bg-grey-4',
|
|
96
103
|
'flex',
|
|
@@ -2,17 +2,27 @@
|
|
|
2
2
|
<div :class="classes">
|
|
3
3
|
<div v-for="(field, key) in fieldsByResult" :key="key" :class="getContainerClass({ key })">
|
|
4
4
|
<slot :field="field" :name="`field-${field.name}`">
|
|
5
|
-
<
|
|
6
|
-
<header
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
</
|
|
15
|
-
|
|
5
|
+
<qas-grid-item :use-ellipsis="props.useEllipsis" :use-inline="props.useInline">
|
|
6
|
+
<template #header>
|
|
7
|
+
<slot :field="field" :name="`header-field-${field.name}`">
|
|
8
|
+
<slot :field="field" name="header">
|
|
9
|
+
<div :class="headerClass" :data-cy="`grid-generator-${field.name}-field`" :title="getTitle(field, 'label')">
|
|
10
|
+
{{ field.label }}
|
|
11
|
+
</div>
|
|
12
|
+
</slot>
|
|
13
|
+
</slot>
|
|
14
|
+
</template>
|
|
15
|
+
|
|
16
|
+
<template #content>
|
|
17
|
+
<slot :field="field" :name="`content-field-${field.name}`">
|
|
18
|
+
<slot :field="field" name="content">
|
|
19
|
+
<div :class="contentClass" :data-cy="`grid-generator-${field.name}-result`" :title="getTitle(field, 'formattedResult')">
|
|
20
|
+
{{ field.formattedResult }}
|
|
21
|
+
</div>
|
|
22
|
+
</slot>
|
|
23
|
+
</slot>
|
|
24
|
+
</template>
|
|
25
|
+
</qas-grid-item>
|
|
16
26
|
</slot>
|
|
17
27
|
</div>
|
|
18
28
|
</div>
|
|
@@ -91,8 +101,7 @@ const headerClass = computed(() => {
|
|
|
91
101
|
props.headerClass,
|
|
92
102
|
|
|
93
103
|
{
|
|
94
|
-
ellipsis: !screen.isSmall && props.useEllipsis
|
|
95
|
-
'text-bold': screen.isSmall || !props.useInline
|
|
104
|
+
ellipsis: !screen.isSmall && props.useEllipsis
|
|
96
105
|
}
|
|
97
106
|
]
|
|
98
107
|
})
|
|
@@ -63,7 +63,7 @@ props:
|
|
|
63
63
|
|
|
64
64
|
slots:
|
|
65
65
|
content:
|
|
66
|
-
desc: Slot para o conteúdo (
|
|
66
|
+
desc: Slot para o conteúdo (valor) de todas os campos de uma vez.
|
|
67
67
|
scope:
|
|
68
68
|
field:
|
|
69
69
|
desc: Conteúdo do field atual mais o resultado formatado.
|
|
@@ -79,7 +79,23 @@ slots:
|
|
|
79
79
|
type: Object
|
|
80
80
|
|
|
81
81
|
header:
|
|
82
|
-
desc: Slot para o header.
|
|
82
|
+
desc: Slot para o header de todas os campos de uma vez.
|
|
83
|
+
scope:
|
|
84
|
+
field:
|
|
85
|
+
desc: Conteúdo do field atual mais o resultado formatado.
|
|
86
|
+
default: {}
|
|
87
|
+
type: Object
|
|
88
|
+
|
|
89
|
+
'header-field-[nome-da-chave]':
|
|
90
|
+
desc: Slot para o header especifico de um field.
|
|
91
|
+
scope:
|
|
92
|
+
field:
|
|
93
|
+
desc: Conteúdo do field atual mais o resultado formatado.
|
|
94
|
+
default: {}
|
|
95
|
+
type: Object
|
|
96
|
+
|
|
97
|
+
'content-field-[nome-da-chave]':
|
|
98
|
+
desc: Slot para o conteúdo (valor) especifico de um field.
|
|
83
99
|
scope:
|
|
84
100
|
field:
|
|
85
101
|
desc: Conteúdo do field atual mais o resultado formatado.
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div :class="classes.container">
|
|
3
|
+
<header v-bind="headerProps">
|
|
4
|
+
<slot name="header">
|
|
5
|
+
{{ props.label }}
|
|
6
|
+
</slot>
|
|
7
|
+
</header>
|
|
8
|
+
|
|
9
|
+
<div v-bind="contentProps">
|
|
10
|
+
<slot name="content">
|
|
11
|
+
{{ props.value }}
|
|
12
|
+
</slot>
|
|
13
|
+
</div>
|
|
14
|
+
</div>
|
|
15
|
+
</template>
|
|
16
|
+
|
|
17
|
+
<script setup>
|
|
18
|
+
import { useScreen } from '../../composables'
|
|
19
|
+
|
|
20
|
+
import { computed } from 'vue'
|
|
21
|
+
|
|
22
|
+
defineOptions({ name: 'QasGridItem' })
|
|
23
|
+
|
|
24
|
+
const props = defineProps({
|
|
25
|
+
label: {
|
|
26
|
+
type: String,
|
|
27
|
+
default: ''
|
|
28
|
+
},
|
|
29
|
+
|
|
30
|
+
useEllipsis: {
|
|
31
|
+
default: true,
|
|
32
|
+
type: Boolean
|
|
33
|
+
},
|
|
34
|
+
|
|
35
|
+
useInline: {
|
|
36
|
+
type: Boolean
|
|
37
|
+
},
|
|
38
|
+
|
|
39
|
+
value: {
|
|
40
|
+
type: [String, Number, Boolean],
|
|
41
|
+
default: ''
|
|
42
|
+
}
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
const screen = useScreen()
|
|
46
|
+
|
|
47
|
+
// computed
|
|
48
|
+
const hasEllipsis = computed(() => props.useEllipsis && !screen.isSmall)
|
|
49
|
+
|
|
50
|
+
const classes = computed(() => {
|
|
51
|
+
const isInline = props.useInline && !screen.isSmall
|
|
52
|
+
|
|
53
|
+
return {
|
|
54
|
+
container: {
|
|
55
|
+
flex: isInline,
|
|
56
|
+
'q-col-gutter-x-md': isInline,
|
|
57
|
+
'justify-between': isInline,
|
|
58
|
+
'col-12': isInline,
|
|
59
|
+
'no-wrap': isInline
|
|
60
|
+
},
|
|
61
|
+
|
|
62
|
+
header: {
|
|
63
|
+
'text-caption': !isInline,
|
|
64
|
+
'text-body1': isInline
|
|
65
|
+
},
|
|
66
|
+
|
|
67
|
+
content: {
|
|
68
|
+
'text-body1': !isInline,
|
|
69
|
+
'text-grey-10': !isInline,
|
|
70
|
+
'text-subtitle1': isInline,
|
|
71
|
+
ellipsis: hasEllipsis.value
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
})
|
|
75
|
+
|
|
76
|
+
const headerProps = computed(() => {
|
|
77
|
+
return {
|
|
78
|
+
class: classes.value.header,
|
|
79
|
+
...(hasEllipsis.value && { title: props.label })
|
|
80
|
+
}
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
const contentProps = computed(() => {
|
|
84
|
+
return {
|
|
85
|
+
class: classes.value.content,
|
|
86
|
+
...(hasEllipsis.value && { title: props.value })
|
|
87
|
+
}
|
|
88
|
+
})
|
|
89
|
+
</script>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
type: component
|
|
2
|
+
|
|
3
|
+
meta:
|
|
4
|
+
desc: Componente para renderizar chave/valor comumente utilizado junto ao QasGridGenerator.
|
|
5
|
+
|
|
6
|
+
props:
|
|
7
|
+
label:
|
|
8
|
+
desc: Rótulo do header.
|
|
9
|
+
default: ''
|
|
10
|
+
type: String
|
|
11
|
+
|
|
12
|
+
value:
|
|
13
|
+
desc: Valor do conteúdo.
|
|
14
|
+
default: ''
|
|
15
|
+
type: [String, Number, Boolean]
|
|
16
|
+
|
|
17
|
+
slots:
|
|
18
|
+
content:
|
|
19
|
+
desc: Slot para o conteúdo (value).
|
|
20
|
+
|
|
21
|
+
header:
|
|
22
|
+
desc: Slot para o header (label).
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div :class="containerClasses">
|
|
3
|
+
<div v-if="hasLabelSection" class="items-center justify-between no-wrap row" :class="labelSectionClasses">
|
|
4
|
+
<div class="items-center q-col-gutter-sm row">
|
|
5
|
+
<slot name="label">
|
|
6
|
+
<qas-label v-bind="defaultLabelProps" />
|
|
7
|
+
</slot>
|
|
8
|
+
|
|
9
|
+
<div v-if="hasBadges" class="col-auto items-center q-col-gutter-sm row">
|
|
10
|
+
<div v-for="(badge, badgeIndex) in props.badges" :key="badgeIndex">
|
|
11
|
+
<qas-badge v-bind="badge" />
|
|
12
|
+
</div>
|
|
13
|
+
</div>
|
|
14
|
+
</div>
|
|
15
|
+
|
|
16
|
+
<slot name="actions">
|
|
17
|
+
<qas-actions-menu v-if="hasDefaultActionsMenu" v-bind="props.actionsMenuProps" />
|
|
18
|
+
|
|
19
|
+
<qas-btn v-if="hasDefaultButton" :use-label-on-small-screen="false" v-bind="props.buttonProps" />
|
|
20
|
+
</slot>
|
|
21
|
+
</div>
|
|
22
|
+
|
|
23
|
+
<div class="items-start justify-between no-wrap q-col-gutter-sm row">
|
|
24
|
+
<div v-if="hasDescriptionSection" class="text-body1 text-grey-8">
|
|
25
|
+
<slot name="description">
|
|
26
|
+
{{ props.description }}
|
|
27
|
+
</slot>
|
|
28
|
+
</div>
|
|
29
|
+
|
|
30
|
+
<div v-if="!hasLabelSection" class="justify-end row">
|
|
31
|
+
<slot name="actions">
|
|
32
|
+
<qas-actions-menu v-if="hasDefaultActionsMenu" v-bind="props.actionsMenuProps" />
|
|
33
|
+
|
|
34
|
+
<qas-btn v-if="hasDefaultButton" :use-label-on-small-screen="false" v-bind="props.buttonProps" />
|
|
35
|
+
</slot>
|
|
36
|
+
</div>
|
|
37
|
+
</div>
|
|
38
|
+
</div>
|
|
39
|
+
</template>
|
|
40
|
+
|
|
41
|
+
<script setup>
|
|
42
|
+
import { Spacing } from '../../enums/Spacing'
|
|
43
|
+
import { gutterValidator } from '../../helpers/private/gutter-validator'
|
|
44
|
+
|
|
45
|
+
import { computed, useSlots } from 'vue'
|
|
46
|
+
|
|
47
|
+
defineOptions({ name: 'QasHeader' })
|
|
48
|
+
|
|
49
|
+
const props = defineProps({
|
|
50
|
+
actionsMenuProps: {
|
|
51
|
+
type: Object,
|
|
52
|
+
default: () => ({})
|
|
53
|
+
},
|
|
54
|
+
|
|
55
|
+
badges: {
|
|
56
|
+
type: Array,
|
|
57
|
+
default: () => []
|
|
58
|
+
},
|
|
59
|
+
|
|
60
|
+
buttonProps: {
|
|
61
|
+
default: () => ({}),
|
|
62
|
+
type: Object
|
|
63
|
+
},
|
|
64
|
+
|
|
65
|
+
description: {
|
|
66
|
+
type: String,
|
|
67
|
+
default: ''
|
|
68
|
+
},
|
|
69
|
+
|
|
70
|
+
labelProps: {
|
|
71
|
+
type: Object,
|
|
72
|
+
default: () => ({})
|
|
73
|
+
},
|
|
74
|
+
|
|
75
|
+
spacing: {
|
|
76
|
+
default: Spacing.Xl,
|
|
77
|
+
type: String,
|
|
78
|
+
validator: gutterValidator
|
|
79
|
+
}
|
|
80
|
+
})
|
|
81
|
+
|
|
82
|
+
const slots = useSlots()
|
|
83
|
+
|
|
84
|
+
// computed
|
|
85
|
+
const containerClasses = computed(() => `q-mb-${props.spacing}`)
|
|
86
|
+
|
|
87
|
+
const labelSectionClasses = computed(() => {
|
|
88
|
+
return {
|
|
89
|
+
'q-mb-xs': hasBadges.value
|
|
90
|
+
}
|
|
91
|
+
})
|
|
92
|
+
|
|
93
|
+
const defaultLabelProps = computed(() => {
|
|
94
|
+
return {
|
|
95
|
+
margin: hasBadges.value ? 'none' : 'xs',
|
|
96
|
+
...props.labelProps
|
|
97
|
+
}
|
|
98
|
+
})
|
|
99
|
+
|
|
100
|
+
const hasBadges = computed(() => !!props.badges.length)
|
|
101
|
+
const hasLabel = computed(() => !!Object.keys(props.labelProps).length)
|
|
102
|
+
const hasDefaultButton = computed(() => !!Object.keys(props.buttonProps).length)
|
|
103
|
+
const hasDefaultActionsMenu = computed(() => !!Object.keys(props.actionsMenuProps).length)
|
|
104
|
+
const hasDescriptionSection = computed(() => props.description || slots.description)
|
|
105
|
+
const hasLabelSection = computed(() => hasLabel.value || slots.label)
|
|
106
|
+
</script>
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
type: component
|
|
2
|
+
|
|
3
|
+
meta:
|
|
4
|
+
desc: Componente para cabeçalho composto por label (título), badges, descrição e ação.
|
|
5
|
+
|
|
6
|
+
props:
|
|
7
|
+
actions-menu-props:
|
|
8
|
+
desc: Propriedades do QasActionsMenu.
|
|
9
|
+
default: {}
|
|
10
|
+
type: Object
|
|
11
|
+
|
|
12
|
+
badges:
|
|
13
|
+
desc: Adiciona badges ao lado do titulo (QasLabel), caso não tenha titulo fica somente as bages acima da descrição.
|
|
14
|
+
default: []
|
|
15
|
+
type: Array
|
|
16
|
+
|
|
17
|
+
button-props:
|
|
18
|
+
desc: Propriedades do QasBtn.
|
|
19
|
+
default: {}
|
|
20
|
+
type: Object
|
|
21
|
+
|
|
22
|
+
description:
|
|
23
|
+
desc: Descrição da seção a esquerda.
|
|
24
|
+
type: String
|
|
25
|
+
|
|
26
|
+
label-props:
|
|
27
|
+
desc: Propriedades repassadas para o componente QasLabel.
|
|
28
|
+
type: Object
|
|
29
|
+
default: {}
|
|
30
|
+
|
|
31
|
+
spacing:
|
|
32
|
+
desc: Espaçamento entre o componente e o conteúdo abaixo.
|
|
33
|
+
default: xl
|
|
34
|
+
type: String
|
|
35
|
+
examples: [none, xs, sm, md, lg, xl, '2xl', '3xl', '4xl', '5xl']
|
|
36
|
+
|
|
37
|
+
slots:
|
|
38
|
+
actions:
|
|
39
|
+
desc: slot para acessar seção da direita (ações).
|
|
40
|
+
|
|
41
|
+
description:
|
|
42
|
+
desc: slot para acessar seção de descrição.
|
|
43
|
+
|
|
44
|
+
label:
|
|
45
|
+
desc: slot para acessar o label (título).
|