@bildvitta/quasar-ui-asteroid 3.16.1 → 3.17.0-beta.0
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/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 +62 -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 +7 -19
- package/src/components/select/QasSelect.vue +82 -10
- package/src/components/table-generator/QasTableGenerator.vue +2 -5
- 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/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,31 @@
|
|
|
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="classes">
|
|
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>
|
|
19
|
+
</div>
|
|
20
|
+
|
|
21
|
+
<div v-for="(field, key) in fieldsetItem.fields.hidden" :key="key">
|
|
22
|
+
<slot :field="field" :name="`field-${field.name}`">
|
|
23
|
+
<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 })" />
|
|
24
|
+
</slot>
|
|
25
|
+
</div>
|
|
21
26
|
</slot>
|
|
22
27
|
</div>
|
|
23
|
-
</
|
|
28
|
+
</component>
|
|
24
29
|
</div>
|
|
25
30
|
</div>
|
|
26
31
|
</template>
|
|
@@ -29,13 +34,18 @@
|
|
|
29
34
|
import { gutterValidator } from '../../helpers/private/gutter-validator'
|
|
30
35
|
import useGenerator, { baseProps } from '../../composables/private/use-generator'
|
|
31
36
|
import { Spacing } from '../../enums/Spacing'
|
|
32
|
-
import { computed } from 'vue'
|
|
37
|
+
import { computed, provide, inject } from 'vue'
|
|
33
38
|
|
|
34
39
|
defineOptions({ name: 'QasFormGenerator' })
|
|
35
40
|
|
|
36
41
|
const props = defineProps({
|
|
37
42
|
...baseProps,
|
|
38
43
|
|
|
44
|
+
boxProps: {
|
|
45
|
+
default: () => ({}),
|
|
46
|
+
type: Object
|
|
47
|
+
},
|
|
48
|
+
|
|
39
49
|
disable: {
|
|
40
50
|
type: Boolean
|
|
41
51
|
},
|
|
@@ -70,17 +80,42 @@ const props = defineProps({
|
|
|
70
80
|
order: {
|
|
71
81
|
default: () => [],
|
|
72
82
|
type: Array
|
|
83
|
+
},
|
|
84
|
+
|
|
85
|
+
useBox: {
|
|
86
|
+
type: Boolean
|
|
73
87
|
}
|
|
74
88
|
})
|
|
75
89
|
|
|
76
90
|
const emit = defineEmits(['update:modelValue'])
|
|
77
91
|
|
|
92
|
+
provide('isFormGenerator', true)
|
|
93
|
+
|
|
78
94
|
// composables
|
|
79
|
-
const { classes, getFieldClass } = useGenerator({ props })
|
|
95
|
+
const { classes, getFieldClass, getFieldSetColumnClass } = useGenerator({ props })
|
|
80
96
|
|
|
81
97
|
const { fieldsetClasses, hasFieldset } = useFieldset({ props })
|
|
82
98
|
|
|
99
|
+
// constants
|
|
100
|
+
const hasNestedFormGenerator = inject('isFormGenerator', false)
|
|
101
|
+
|
|
83
102
|
// computed
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Se o QasFormGenerator tiver um elemento acima que também é um QasFormGenerator,
|
|
106
|
+
* mesmo que a propriedade useBox seja true, o componente não deve renderizar o box.
|
|
107
|
+
*/
|
|
108
|
+
const containerComponent = computed(() => {
|
|
109
|
+
const hasBox = props.useBox && !hasNestedFormGenerator
|
|
110
|
+
|
|
111
|
+
return {
|
|
112
|
+
is: hasBox ? 'qas-box' : 'div',
|
|
113
|
+
props: {
|
|
114
|
+
...(hasBox && { ...props.boxProps })
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
})
|
|
118
|
+
|
|
84
119
|
const groupedFields = computed(() => {
|
|
85
120
|
const fields = { hidden: {}, visible: {} }
|
|
86
121
|
|
|
@@ -126,6 +161,7 @@ const normalizedFields = computed(() => {
|
|
|
126
161
|
fields[fieldsetKey] = {
|
|
127
162
|
label: fieldsetItem.label,
|
|
128
163
|
description: fieldsetItem.description,
|
|
164
|
+
column: fieldsetItem.column,
|
|
129
165
|
fields: { hidden: {}, visible: {} }
|
|
130
166
|
}
|
|
131
167
|
|
|
@@ -150,6 +186,10 @@ function getFieldType ({ type }) {
|
|
|
150
186
|
return type === 'hidden' ? 'hidden' : 'visible'
|
|
151
187
|
}
|
|
152
188
|
|
|
189
|
+
function getLabelMargin (fieldsetItem) {
|
|
190
|
+
return fieldsetItem.description ? 'sm' : 'md'
|
|
191
|
+
}
|
|
192
|
+
|
|
153
193
|
function isFieldDisabled ({ disable }) {
|
|
154
194
|
return disable || props.disable
|
|
155
195
|
}
|
|
@@ -167,7 +207,7 @@ function useFieldset ({ props }) {
|
|
|
167
207
|
const classes = ['row']
|
|
168
208
|
|
|
169
209
|
if (props.fieldsetGutter) {
|
|
170
|
-
classes.push(`q-col-gutter
|
|
210
|
+
classes.push(`q-col-gutter-${props.fieldsetGutter}`)
|
|
171
211
|
}
|
|
172
212
|
|
|
173
213
|
return classes
|
|
@@ -180,8 +220,4 @@ function useFieldset ({ props }) {
|
|
|
180
220
|
hasFieldset
|
|
181
221
|
}
|
|
182
222
|
}
|
|
183
|
-
|
|
184
|
-
function getLabelMargin (fieldsetItem) {
|
|
185
|
-
return fieldsetItem.description ? 'sm' : 'md'
|
|
186
|
-
}
|
|
187
223
|
</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).
|