@bildvitta/quasar-ui-asteroid 3.0.0-beta.2 → 3.0.0-beta.20
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/dist/api/QasActionsMenu.json +15 -15
- package/dist/api/QasAppBar.json +4 -8
- package/dist/api/QasAppMenu.json +11 -7
- package/dist/api/QasBtn.json +8 -4
- package/dist/api/QasCard.json +17 -13
- package/dist/api/QasCheckboxGroup.json +8 -8
- package/dist/api/QasCopy.json +4 -4
- package/dist/api/QasDateTimeInput.json +16 -16
- package/dist/api/QasDelete.json +17 -17
- package/dist/api/QasDialog.json +24 -20
- package/dist/api/QasFilters.json +14 -14
- package/dist/api/QasFormGenerator.json +57 -26
- package/dist/api/QasFormView.json +115 -87
- package/dist/api/QasGallery.json +4 -4
- package/dist/api/QasGridGenerator.json +40 -39
- package/dist/api/QasInput.json +13 -13
- package/dist/api/QasListItems.json +18 -17
- package/dist/api/QasListView.json +67 -53
- package/dist/api/QasNestedFields.json +45 -35
- package/dist/api/QasNumericInput.json +31 -12
- package/dist/api/QasPageHeader.json +7 -7
- package/dist/api/QasPasswordInput.json +13 -13
- package/dist/api/QasPasswordStrengthChecker.json +12 -12
- package/dist/api/QasProfile.json +5 -5
- package/dist/api/QasResizer.json +11 -11
- package/dist/api/QasSearchBox.json +90 -8
- package/dist/api/QasSelect.json +92 -25
- package/dist/api/QasSelectList.json +16 -14
- package/dist/api/QasSignaturePad.json +1 -1
- package/dist/api/QasSignatureUploader.json +9 -9
- package/dist/api/QasSingleView.json +52 -43
- package/dist/api/QasSortable.json +20 -20
- package/dist/api/QasTableGenerator.json +5 -5
- package/dist/api/QasTabsGenerator.json +5 -2
- package/dist/api/QasTransfer.json +9 -9
- package/dist/api/QasUploader.json +22 -17
- package/dist/asteroid.cjs.css +1 -1
- package/dist/asteroid.cjs.js +3904 -3102
- package/dist/asteroid.cjs.min.js +2 -2
- package/dist/asteroid.esm.css +1 -1
- package/dist/asteroid.esm.js +3908 -3106
- package/dist/asteroid.esm.min.js +2 -2
- package/dist/asteroid.umd.css +1 -1
- package/dist/asteroid.umd.js +3907 -3106
- package/dist/asteroid.umd.min.js +2 -2
- package/dist/vetur/asteroid-attributes.json +387 -303
- package/dist/vetur/asteroid-tags.json +129 -108
- package/package.json +1 -1
- package/src/assets/gear.svg +27 -0
- package/src/components/actions/QasActions.vue +1 -5
- package/src/components/actions-menu/QasActionsMenu.vue +4 -10
- package/src/components/actions-menu/QasActionsMenu.yml +15 -15
- package/src/components/app-bar/QasAppBar.vue +18 -14
- package/src/components/app-bar/QasAppBar.yml +4 -8
- package/src/components/app-menu/QasAppMenu.vue +8 -7
- package/src/components/app-menu/QasAppMenu.yml +11 -7
- package/src/components/avatar/QasAvatar.vue +0 -4
- package/src/components/box/QasBox.vue +1 -1
- package/src/components/btn/QasBtn.vue +11 -15
- package/src/components/btn/QasBtn.yml +7 -3
- package/src/components/card/QasCard.vue +18 -9
- package/src/components/card/QasCard.yml +17 -13
- package/src/components/checkbox-group/QasCheckboxGroup.yml +9 -8
- package/src/components/copy/QasCopy.vue +1 -1
- package/src/components/copy/QasCopy.yml +4 -3
- package/src/components/date-time-input/QasDateTimeInput.vue +39 -41
- package/src/components/date-time-input/QasDateTimeInput.yml +16 -16
- package/src/components/delete/QasDelete.vue +15 -1
- package/src/components/delete/QasDelete.yml +15 -15
- package/src/components/dialog/QasDialog.vue +28 -9
- package/src/components/dialog/QasDialog.yml +22 -18
- package/src/components/dialog-router/QasDialogRouter.vue +1 -1
- package/src/components/field/QasField.vue +15 -14
- package/src/components/filters/QasFilters.vue +30 -13
- package/src/components/filters/QasFilters.yml +14 -14
- package/src/components/form-generator/QasFormGenerator.vue +87 -12
- package/src/components/form-generator/QasFormGenerator.yml +32 -18
- package/src/components/form-view/QasFormView.vue +142 -60
- package/src/components/form-view/QasFormView.yml +91 -67
- package/src/components/gallery/QasGallery.vue +4 -8
- package/src/components/gallery/QasGallery.yml +4 -4
- package/src/components/grid-generator/QasGridGenerator.vue +23 -7
- package/src/components/grid-generator/QasGridGenerator.yml +29 -27
- package/src/components/input/QasInput.vue +37 -21
- package/src/components/input/QasInput.yml +13 -13
- package/src/components/layout/QasLayout.vue +4 -0
- package/src/components/list-items/QasListItems.vue +16 -24
- package/src/components/list-items/QasListItems.yml +14 -15
- package/src/components/list-view/QasListView.vue +48 -20
- package/src/components/list-view/QasListView.yml +58 -46
- package/src/components/map/QasMap.vue +5 -5
- package/src/components/nested-fields/QasNestedFields.vue +29 -21
- package/src/components/nested-fields/QasNestedFields.yml +35 -28
- package/src/components/numeric-input/QasNumericInput.vue +45 -27
- package/src/components/numeric-input/QasNumericInput.yml +26 -12
- package/src/components/page-header/QasPageHeader.vue +14 -11
- package/src/components/page-header/QasPageHeader.yml +4 -4
- package/src/components/password-input/QasPasswordInput.vue +17 -16
- package/src/components/password-input/QasPasswordInput.yml +11 -11
- package/src/components/password-strength-checker/QasPasswordStrengthChecker.yml +10 -10
- package/src/components/profile/QasProfile.vue +3 -6
- package/src/components/profile/QasProfile.yml +5 -5
- package/src/components/resizer/QasResizer.vue +1 -1
- package/src/components/resizer/QasResizer.yml +6 -5
- package/src/components/search-box/QasSearchBox.vue +138 -42
- package/src/components/search-box/QasSearchBox.yml +74 -7
- package/src/components/select/QasSelect.vue +63 -53
- package/src/components/select/QasSelect.yml +68 -17
- package/src/components/select-list/QasSelectList.vue +13 -32
- package/src/components/select-list/QasSelectList.yml +13 -14
- package/src/components/signature-pad/QasSignaturePad.vue +1 -1
- package/src/components/signature-pad/QasSignaturePad.yml +1 -1
- package/src/components/signature-uploader/QasSignatureUploader.vue +13 -14
- package/src/components/signature-uploader/QasSignatureUploader.yml +9 -9
- package/src/components/single-view/QasSingleView.vue +24 -8
- package/src/components/single-view/QasSingleView.yml +45 -38
- package/src/components/sortable/QasSortable.yml +17 -17
- package/src/components/table-generator/QasTableGenerator.vue +14 -6
- package/src/components/table-generator/QasTableGenerator.yml +5 -5
- package/src/components/tabs-generator/QasTabsGenerator.vue +2 -2
- package/src/components/tabs-generator/QasTabsGenerator.yml +2 -2
- package/src/components/text-truncate/QasTextTruncate.vue +2 -5
- package/src/components/transfer/QasTransfer.vue +5 -7
- package/src/components/transfer/QasTransfer.yml +9 -9
- package/src/components/uploader/QasUploader.vue +63 -16
- package/src/components/uploader/QasUploader.yml +17 -12
- package/src/composables/index.js +1 -1
- package/src/composables/{useHistory.js → use-history.js} +0 -0
- package/src/css/components/base.scss +3 -0
- package/src/css/components/field.scss +4 -0
- package/src/css/components/index.scss +4 -0
- package/src/css/components/radio.scss +3 -0
- package/src/css/components/tabs.scss +3 -0
- package/src/css/mixins/index.scss +1 -0
- package/src/css/{set-brand.scss → mixins/set-brand.scss} +0 -0
- package/src/css/{background.scss → utils/background.scss} +0 -0
- package/src/css/{border-radius.scss → utils/border-radius.scss} +0 -0
- package/src/css/{border.scss → utils/border.scss} +0 -0
- package/src/css/{container.scss → utils/container.scss} +0 -0
- package/src/css/{fonts.scss → utils/fonts.scss} +0 -0
- package/src/css/utils/index.scss +9 -0
- package/src/css/{line-height.scss → utils/line-height.scss} +0 -0
- package/src/css/{opacity.scss → utils/opacity.scss} +0 -0
- package/src/css/{text.scss → utils/text.scss} +0 -0
- package/src/css/{unset.scss → utils/unset.scss} +0 -0
- package/src/css/variables/button.scss +3 -0
- package/src/css/variables/index.scss +3 -0
- package/src/css/variables/shadow.scss +33 -0
- package/src/css/variables/typography.scss +139 -0
- package/src/helpers/camelize-fields-name.js +15 -0
- package/src/helpers/filters.js +2 -0
- package/src/helpers/get-normalized-options.js +20 -0
- package/src/helpers/handle-process.js +13 -0
- package/src/helpers/index.js +3 -0
- package/src/index.scss +11 -12
- package/src/mixins/generator.js +10 -2
- package/src/mixins/index.js +3 -3
- package/src/mixins/search-filter.js +227 -0
- package/src/mixins/view.js +35 -13
- package/src/pages/ErrorComponent.vue +56 -0
- package/src/pages/Forbidden.vue +21 -5
- package/src/pages/NotFound.vue +21 -5
- package/src/pages/ServerError.vue +25 -0
- package/src/pages/Unauthorized.vue +28 -0
- package/src/plugins/index.js +4 -2
- package/src/plugins/logger/Logger.js +44 -0
- package/src/plugins/logger/Logger.yml +9 -0
- package/src/plugins/screen/Screen.js +5 -0
- package/src/vue-plugin.js +6 -3
- package/src/assets/logo-modular.svg +0 -1
- package/src/css/design-system.scss +0 -18
- package/src/css/shadow.scss +0 -7
- package/src/mixins/screen.js +0 -34
|
@@ -4,29 +4,28 @@ meta:
|
|
|
4
4
|
desc: Componente para C.R.U.D. responsável pela visualização (Read) ou conhecido também como "show".
|
|
5
5
|
|
|
6
6
|
props:
|
|
7
|
-
|
|
8
|
-
desc:
|
|
9
|
-
|
|
10
|
-
type:
|
|
7
|
+
before-fetch:
|
|
8
|
+
desc: Callback para controlar como funciona o comportamento do fetchSingle.
|
|
9
|
+
default: null
|
|
10
|
+
type: Function
|
|
11
|
+
examples: ['beforeFetch({ payload, resolve, done })']
|
|
11
12
|
|
|
12
13
|
custom-id:
|
|
13
14
|
desc: Por padrão, o componente vai pegar o "id" que vem como parâmetro na url, caso queira que o id seja diferente da url, use esta prop.
|
|
14
15
|
type: String
|
|
15
16
|
examples: ['my-custom-id']
|
|
16
17
|
|
|
17
|
-
|
|
18
|
-
desc:
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
url:
|
|
22
|
-
desc: Envia como parâmetro para a action "fetchSingle" do modulo correspondente a "entity".
|
|
18
|
+
entity:
|
|
19
|
+
desc: Entidade da store, por exemplo se tiver que trabalhar com modulo de usuários, teremos o model "users" na store, que vai ser nossa "entity".
|
|
20
|
+
required: true
|
|
23
21
|
type: String
|
|
24
22
|
|
|
25
|
-
|
|
23
|
+
errors:
|
|
26
24
|
model: true
|
|
27
|
-
desc: Model de
|
|
25
|
+
desc: Model de errors, utilizado para recuperar os errors fora do template.
|
|
26
|
+
default: {}
|
|
28
27
|
type: Object
|
|
29
|
-
examples: [v-model:
|
|
28
|
+
examples: [v-model:errors="errors"]
|
|
30
29
|
|
|
31
30
|
fields:
|
|
32
31
|
model: true
|
|
@@ -35,12 +34,11 @@ props:
|
|
|
35
34
|
type: Object
|
|
36
35
|
examples: [v-model:fields="fields"]
|
|
37
36
|
|
|
38
|
-
|
|
37
|
+
fetching:
|
|
39
38
|
model: true
|
|
40
|
-
desc: Model de
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
examples: [v-model:errors="errors"]
|
|
39
|
+
desc: Model de fetching, utilizado para saber se o componente está fazendo fetching de dados.
|
|
40
|
+
type: Boolean
|
|
41
|
+
examples: [v-model:fetching="isFetching"]
|
|
44
42
|
|
|
45
43
|
metadata:
|
|
46
44
|
model: true
|
|
@@ -49,23 +47,46 @@ props:
|
|
|
49
47
|
type: Object
|
|
50
48
|
examples: [v-model:metadata="metadata"]
|
|
51
49
|
|
|
52
|
-
|
|
50
|
+
result:
|
|
53
51
|
model: true
|
|
54
|
-
desc: Model de
|
|
52
|
+
desc: Model de result, utilizado para recuperar o resultado retornado pelo componente.
|
|
53
|
+
type: Object
|
|
54
|
+
examples: [v-model:result="result"]
|
|
55
|
+
|
|
56
|
+
url:
|
|
57
|
+
desc: Envia como parâmetro para a action "fetchSingle" do modulo correspondente a "entity".
|
|
58
|
+
type: String
|
|
59
|
+
|
|
60
|
+
use-boundary:
|
|
61
|
+
desc: Controla o limite que o FormView terá, quando é "false", a tag pai deixa de ser um "QPage" para ser uma "div" e é removido as classes "container" e "spaced", comumente utilizando quando precisa usar o QasFormView dentro de um dialog.
|
|
62
|
+
default: true
|
|
55
63
|
type: Boolean
|
|
56
|
-
examples: [v-model:fetching="isFetching"]
|
|
57
64
|
|
|
58
65
|
slots:
|
|
59
|
-
header:
|
|
60
|
-
desc: 'Slot para acessar o header.'
|
|
61
|
-
|
|
62
66
|
default:
|
|
63
67
|
desc: 'Slot para ter o conteúdo principal (dentro do main).'
|
|
64
68
|
|
|
65
69
|
footer:
|
|
66
70
|
desc: 'Slot para acessar o footer.'
|
|
67
71
|
|
|
72
|
+
header:
|
|
73
|
+
desc: 'Slot para acessar o header.'
|
|
74
|
+
|
|
68
75
|
events:
|
|
76
|
+
'@fetch-success -> function(value)':
|
|
77
|
+
desc: Dispara quando a action "fetchSingle" é executada com sucesso.
|
|
78
|
+
params:
|
|
79
|
+
value:
|
|
80
|
+
desc: Retorna todos os dados "cru" respondido pelo fetch.
|
|
81
|
+
type: Object
|
|
82
|
+
|
|
83
|
+
'@fetch-error -> function(value)':
|
|
84
|
+
desc: Dispara quando a action "fetchSingle" cai em uma exceção.
|
|
85
|
+
params:
|
|
86
|
+
value:
|
|
87
|
+
desc: Retorna todos os dados "cru" respondido na exceção do fetch.
|
|
88
|
+
type: Object
|
|
89
|
+
|
|
69
90
|
'@update:result -> function(value)':
|
|
70
91
|
desc: Dispara quando a action "fetchSingle" é executada com sucesso, é chamado antes do evento "fetch-success".
|
|
71
92
|
params:
|
|
@@ -100,17 +121,3 @@ events:
|
|
|
100
121
|
value:
|
|
101
122
|
desc: Retorna se está ou não fazendo fetching de dados.
|
|
102
123
|
type: Boolean
|
|
103
|
-
|
|
104
|
-
'@fetch-success -> function(value)':
|
|
105
|
-
desc: Dispara quando a action "fetchSingle" é executada com sucesso.
|
|
106
|
-
params:
|
|
107
|
-
value:
|
|
108
|
-
desc: Retorna todos os dados "cru" respondido pelo fetch.
|
|
109
|
-
type: Object
|
|
110
|
-
|
|
111
|
-
'@fetch-error -> function(value)':
|
|
112
|
-
desc: Dispara quando a action "fetchSingle" cai em uma exceção.
|
|
113
|
-
params:
|
|
114
|
-
value:
|
|
115
|
-
desc: Retorna todos os dados "cru" respondido na exceção do fetch.
|
|
116
|
-
type: Object
|
|
@@ -9,15 +9,22 @@ props:
|
|
|
9
9
|
required: true
|
|
10
10
|
type: String
|
|
11
11
|
|
|
12
|
+
list:
|
|
13
|
+
desc: Lista que vai ser reordenada.
|
|
14
|
+
default: []
|
|
15
|
+
type: Array
|
|
16
|
+
|
|
12
17
|
sortable-options:
|
|
13
18
|
desc: Opções do "sortablejs" (https://github.com/SortableJS/Sortable#options).
|
|
14
19
|
default: { animation: 500 }
|
|
15
20
|
type: Object
|
|
16
21
|
|
|
17
|
-
|
|
18
|
-
desc:
|
|
22
|
+
sorted:
|
|
23
|
+
desc: Model da lista reordenada
|
|
19
24
|
default: []
|
|
20
25
|
type: Array
|
|
26
|
+
examples: [v-model:sorted="fields"]
|
|
27
|
+
model: true
|
|
21
28
|
|
|
22
29
|
tag:
|
|
23
30
|
desc: Tag do componente pai.
|
|
@@ -28,24 +35,17 @@ props:
|
|
|
28
35
|
desc: Parâmetro enviado para a action "replace".
|
|
29
36
|
type: String
|
|
30
37
|
|
|
31
|
-
sorted:
|
|
32
|
-
desc: Model da lista reordenada
|
|
33
|
-
default: []
|
|
34
|
-
type: Array
|
|
35
|
-
examples: [v-model:sorted="fields"]
|
|
36
|
-
model: true
|
|
37
|
-
|
|
38
38
|
slots:
|
|
39
39
|
default:
|
|
40
40
|
desc: Slot para adicionar os items que serão reordenados.
|
|
41
41
|
|
|
42
42
|
events:
|
|
43
|
-
'@
|
|
44
|
-
desc: Dispara
|
|
43
|
+
'@error -> function(value)':
|
|
44
|
+
desc: Dispara toda vez que acontece algum erro ao salvar a nova ordenação.
|
|
45
45
|
params:
|
|
46
46
|
value:
|
|
47
|
-
desc:
|
|
48
|
-
type:
|
|
47
|
+
desc: fields.
|
|
48
|
+
type: Object
|
|
49
49
|
|
|
50
50
|
'@sort -> function(value)':
|
|
51
51
|
desc: Dispara toda vez que acontece uma nova ordenação.
|
|
@@ -57,9 +57,9 @@ events:
|
|
|
57
57
|
desc: fields.
|
|
58
58
|
type: Object
|
|
59
59
|
|
|
60
|
-
'@
|
|
61
|
-
desc: Dispara toda vez que
|
|
60
|
+
'@update:sorted -> function(value)':
|
|
61
|
+
desc: Dispara no created e toda vez que a prop "list" muda, usado para o v-model:sorted.
|
|
62
62
|
params:
|
|
63
63
|
value:
|
|
64
|
-
desc:
|
|
65
|
-
type:
|
|
64
|
+
desc: Lista contendo nova ordenação.
|
|
65
|
+
type: Array
|
|
@@ -16,13 +16,10 @@
|
|
|
16
16
|
import { extend } from 'quasar'
|
|
17
17
|
import { humanize } from '../../helpers/filters'
|
|
18
18
|
import { setScrollOnGrab } from '../../helpers'
|
|
19
|
-
import screenMixin from '../../mixins/screen'
|
|
20
19
|
|
|
21
20
|
export default {
|
|
22
21
|
name: 'QasTableGenerator',
|
|
23
22
|
|
|
24
|
-
mixins: [screenMixin],
|
|
25
|
-
|
|
26
23
|
props: {
|
|
27
24
|
columns: {
|
|
28
25
|
default: () => [],
|
|
@@ -104,6 +101,8 @@ export default {
|
|
|
104
101
|
columnByField(this.fields[index])
|
|
105
102
|
}
|
|
106
103
|
|
|
104
|
+
this.$qas.logger.group('QasTableGenerator - Automatic columns', [columns])
|
|
105
|
+
|
|
107
106
|
return columns
|
|
108
107
|
}
|
|
109
108
|
|
|
@@ -116,6 +115,8 @@ export default {
|
|
|
116
115
|
}
|
|
117
116
|
})
|
|
118
117
|
|
|
118
|
+
this.$qas.logger.group('QasTableGenerator - columns', [columns])
|
|
119
|
+
|
|
119
120
|
return columns
|
|
120
121
|
},
|
|
121
122
|
|
|
@@ -132,9 +133,11 @@ export default {
|
|
|
132
133
|
},
|
|
133
134
|
|
|
134
135
|
resultsByFields () {
|
|
136
|
+
if (!Object.keys(this.fields).length) return []
|
|
137
|
+
|
|
135
138
|
const results = extend(true, [], this.results)
|
|
136
139
|
|
|
137
|
-
|
|
140
|
+
const mappedResults = results.map((result, index) => {
|
|
138
141
|
for (const key in result) {
|
|
139
142
|
result.default = this.results[index]
|
|
140
143
|
result[key] = humanize(this.fields[key], result[key]) || this.emptyResultText
|
|
@@ -142,6 +145,10 @@ export default {
|
|
|
142
145
|
|
|
143
146
|
return result
|
|
144
147
|
})
|
|
148
|
+
|
|
149
|
+
this.$qas.logger.group('QasTableGenerator - resultsByFields', [mappedResults])
|
|
150
|
+
|
|
151
|
+
return mappedResults
|
|
145
152
|
},
|
|
146
153
|
|
|
147
154
|
rowsPerPage () {
|
|
@@ -149,7 +156,7 @@ export default {
|
|
|
149
156
|
},
|
|
150
157
|
|
|
151
158
|
tableClass () {
|
|
152
|
-
return this.
|
|
159
|
+
return this.$qas.screen.isSmall && 'qas-table-generator--mobile'
|
|
153
160
|
},
|
|
154
161
|
|
|
155
162
|
hasScrollOnGrab () {
|
|
@@ -202,10 +209,11 @@ export default {
|
|
|
202
209
|
handleScrollOnGrab () {
|
|
203
210
|
const fullTableWidth = this.getFullTableWidth()
|
|
204
211
|
const containerTableWidth = this.getContainerTableWidth()
|
|
212
|
+
const hasScrollOnGrab = !!Object.keys(this.scrollOnGrab).length
|
|
205
213
|
|
|
206
214
|
if (fullTableWidth > containerTableWidth) {
|
|
207
215
|
this.initializeScrollOnGrab()
|
|
208
|
-
} else if (
|
|
216
|
+
} else if (hasScrollOnGrab) {
|
|
209
217
|
this.scrollOnGrab.destroyEvents()
|
|
210
218
|
this.scrollOnGrab.element.style.cursor = 'auto'
|
|
211
219
|
this.scrollOnGrab = {}
|
|
@@ -9,6 +9,11 @@ props:
|
|
|
9
9
|
default: []
|
|
10
10
|
type: Array
|
|
11
11
|
|
|
12
|
+
empty-result-text:
|
|
13
|
+
desc: Quando uma célula da tabela está vazia, esta prop define qual será o valor padrão.
|
|
14
|
+
default: '-'
|
|
15
|
+
type: String
|
|
16
|
+
|
|
12
17
|
fields:
|
|
13
18
|
desc: Lista de field contendo informações necessárias para a criação da tabela.
|
|
14
19
|
default: {}
|
|
@@ -26,11 +31,6 @@ props:
|
|
|
26
31
|
default: name
|
|
27
32
|
type: String
|
|
28
33
|
|
|
29
|
-
empty-result-text:
|
|
30
|
-
desc: Quando uma célula da tabela está vazia, esta prop define qual será o valor padrão.
|
|
31
|
-
default: '-'
|
|
32
|
-
type: String
|
|
33
|
-
|
|
34
34
|
use-scroll-on-grab:
|
|
35
35
|
desc: Adiciona scroll pelo mouse ao arrastar tabela em todas as telas (Celular, Desktop).
|
|
36
36
|
default: true
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<q-tabs v-model="model" :active-color="activeColor" :indicator-color="indicatorColor" outside-arrows>
|
|
3
3
|
<slot v-for="(tab, key) in formattedTabs" :item="tab" :name="`tab-${tab.value}`">
|
|
4
|
-
<q-tab :key="key" v-bind="tab" :class="tabClass" :label="tab.label" :name="
|
|
4
|
+
<q-tab :key="key" v-bind="tab" :class="tabClass" :label="tab.label" :name="tab.value">
|
|
5
5
|
<slot :item="tab" :name="`tab-after-${tab.value}`">
|
|
6
6
|
<q-badge v-if="counters[key]" :label="counters[key]" v-bind="defaultCounterProps" />
|
|
7
7
|
</slot>
|
|
@@ -50,7 +50,7 @@ export default {
|
|
|
50
50
|
tabs: {
|
|
51
51
|
default: () => ({}),
|
|
52
52
|
required: true,
|
|
53
|
-
type: Object
|
|
53
|
+
type: [Object, Array]
|
|
54
54
|
}
|
|
55
55
|
},
|
|
56
56
|
|
|
@@ -38,9 +38,9 @@ props:
|
|
|
38
38
|
type: String
|
|
39
39
|
|
|
40
40
|
tabs:
|
|
41
|
-
desc: Objeto contendo todas as tabs a serem geradas.
|
|
41
|
+
desc: Objeto ou Array contendo todas as tabs a serem geradas.
|
|
42
42
|
default: {}
|
|
43
|
-
type: Object
|
|
43
|
+
type: [Object, Array]
|
|
44
44
|
examples: ["{ tab1: 'tab1', tab2: 'tab2' }"]
|
|
45
45
|
|
|
46
46
|
slots:
|
|
@@ -18,7 +18,6 @@
|
|
|
18
18
|
</template>
|
|
19
19
|
|
|
20
20
|
<script>
|
|
21
|
-
import screenMixin from '../../mixins/screen'
|
|
22
21
|
import QasDialog from '../dialog/QasDialog.vue'
|
|
23
22
|
|
|
24
23
|
export default {
|
|
@@ -28,8 +27,6 @@ export default {
|
|
|
28
27
|
QasDialog
|
|
29
28
|
},
|
|
30
29
|
|
|
31
|
-
mixins: [screenMixin],
|
|
32
|
-
|
|
33
30
|
props: {
|
|
34
31
|
dialogProps: {
|
|
35
32
|
type: Object,
|
|
@@ -69,7 +66,7 @@ export default {
|
|
|
69
66
|
|
|
70
67
|
computed: {
|
|
71
68
|
truncateTextClass () {
|
|
72
|
-
return (this.isTruncated || this.
|
|
69
|
+
return (this.isTruncated || this.$qas.screen.isSmall) && 'ellipsis q-pr-sm'
|
|
73
70
|
},
|
|
74
71
|
|
|
75
72
|
isTruncated () {
|
|
@@ -84,7 +81,7 @@ export default {
|
|
|
84
81
|
return {
|
|
85
82
|
cancel: false,
|
|
86
83
|
ok: false,
|
|
87
|
-
|
|
84
|
+
useCloseButton: true,
|
|
88
85
|
...this.dialogProps,
|
|
89
86
|
card: {
|
|
90
87
|
title: this.dialogTitle,
|
|
@@ -49,7 +49,6 @@
|
|
|
49
49
|
</template>
|
|
50
50
|
|
|
51
51
|
<script>
|
|
52
|
-
import { screenMixin } from '../../mixins'
|
|
53
52
|
import { extend } from 'quasar'
|
|
54
53
|
|
|
55
54
|
import QasBtn from '../btn/QasBtn.vue'
|
|
@@ -65,8 +64,6 @@ export default {
|
|
|
65
64
|
QasSearchBox
|
|
66
65
|
},
|
|
67
66
|
|
|
68
|
-
mixins: [screenMixin],
|
|
69
|
-
|
|
70
67
|
props: {
|
|
71
68
|
emitValue: {
|
|
72
69
|
type: Boolean
|
|
@@ -124,15 +121,15 @@ export default {
|
|
|
124
121
|
|
|
125
122
|
computed: {
|
|
126
123
|
actionsClass () {
|
|
127
|
-
return !this.
|
|
124
|
+
return !this.$qas.screen.isSmall && 'column'
|
|
128
125
|
},
|
|
129
126
|
|
|
130
127
|
gutterClass () {
|
|
131
|
-
return `q-col-gutter-${this.
|
|
128
|
+
return `q-col-gutter-${this.$qas.screen.untilLarge ? 'md' : 'xl'}`
|
|
132
129
|
},
|
|
133
130
|
|
|
134
131
|
iconClass () {
|
|
135
|
-
return !this.
|
|
132
|
+
return !this.$qas.screen.isSmall && 'qas-transfer__icon'
|
|
136
133
|
},
|
|
137
134
|
|
|
138
135
|
searchBoxProps () {
|
|
@@ -147,6 +144,7 @@ export default {
|
|
|
147
144
|
options: {
|
|
148
145
|
handler (value) {
|
|
149
146
|
this.optionsList = extend(true, [], value)
|
|
147
|
+
this.setSelectedFromValue(true)
|
|
150
148
|
},
|
|
151
149
|
|
|
152
150
|
immediate: true
|
|
@@ -212,7 +210,7 @@ export default {
|
|
|
212
210
|
},
|
|
213
211
|
|
|
214
212
|
setSelectedFromValue (isFirst) {
|
|
215
|
-
this.modelValue.forEach(item => {
|
|
213
|
+
this.optionsList.length && this.modelValue.forEach(item => {
|
|
216
214
|
const selected = this.optionsList.find(option => {
|
|
217
215
|
return option[this.valueKey] === (this.emitValue ? item : item[this.valueKey])
|
|
218
216
|
})
|
|
@@ -8,25 +8,25 @@ props:
|
|
|
8
8
|
desc: Controla como sera o retorno do model, se "true" será um array de string, se "false" array de objeto.
|
|
9
9
|
type: Boolean
|
|
10
10
|
|
|
11
|
-
model-value:
|
|
12
|
-
desc: Model do componente, controla quais itens estão na segunda coluna.
|
|
13
|
-
default: []
|
|
14
|
-
type: Array
|
|
15
|
-
|
|
16
11
|
fuse-options:
|
|
17
12
|
desc: Configurações do [fuse.js](https://fusejs.io/api/options.html).
|
|
18
13
|
default: { keys: ['label'] }
|
|
19
14
|
type: Object
|
|
20
15
|
|
|
16
|
+
label-key:
|
|
17
|
+
desc: Nos options, você pode passar um array de objeto com qualquer chave/valor, esta prop serve para identificar qual será o equivalente ao "label".
|
|
18
|
+
default: label
|
|
19
|
+
type: String
|
|
20
|
+
|
|
21
21
|
label:
|
|
22
22
|
desc: Rotulo que vai ficar em cima da primeira coluna.
|
|
23
23
|
type: String
|
|
24
24
|
required: true
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
desc:
|
|
28
|
-
default:
|
|
29
|
-
type:
|
|
26
|
+
model-value:
|
|
27
|
+
desc: Model do componente, controla quais itens estão na segunda coluna.
|
|
28
|
+
default: []
|
|
29
|
+
type: Array
|
|
30
30
|
|
|
31
31
|
options:
|
|
32
32
|
desc: Array de objetos com todos items que serão transferidos
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
|
|
16
16
|
<qas-btn v-if="showAddFile" ref="buttonUpload" color="white" dense flat icon="o_add" round @click="$refs.hiddenInput.click()" />
|
|
17
17
|
|
|
18
|
-
<input ref="hiddenInput" class="qas-uploader__input" :multiple="isMultiple" type="file">
|
|
18
|
+
<input ref="hiddenInput" :accept="attributes.accept" class="qas-uploader__input" :multiple="isMultiple" type="file">
|
|
19
19
|
|
|
20
20
|
<qas-btn ref="buttonCleanFiles" class="hidden" color="white" @click="scope.removeUploadedFiles" />
|
|
21
21
|
<qas-btn v-if="scope.canUpload" color="white" dense flat icon="o_cloud_upload" round @click="scope.upload" />
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
<slot name="list" :scope="scope">
|
|
29
29
|
<div class="col-12 q-col-gutter-md row">
|
|
30
30
|
<div v-for="(file, index) in getFilesList(scope.files, scope)" :key="index" class="row" :class="itemClass">
|
|
31
|
-
<qas-avatar class="q-mr-sm" color="
|
|
31
|
+
<qas-avatar class="q-mr-sm" color="contrast-primary" icon="o_attach_file" :image="file.url" rounded :text-color="getColorFileIcon(file)" />
|
|
32
32
|
|
|
33
33
|
<div class="col items-center no-wrap row">
|
|
34
34
|
<div class="column no-wrap" :class="{ col: isMultiple }">
|
|
@@ -131,6 +131,10 @@ export default {
|
|
|
131
131
|
|
|
132
132
|
uploading: {
|
|
133
133
|
type: Boolean
|
|
134
|
+
},
|
|
135
|
+
|
|
136
|
+
useObjectModel: {
|
|
137
|
+
type: Boolean
|
|
134
138
|
}
|
|
135
139
|
},
|
|
136
140
|
|
|
@@ -244,12 +248,19 @@ export default {
|
|
|
244
248
|
uploaded (response) {
|
|
245
249
|
const fullPath = response.xhr.responseURL.split('?').shift()
|
|
246
250
|
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
+
const objectValue = {
|
|
252
|
+
format: response.files[0].type,
|
|
253
|
+
url: fullPath,
|
|
254
|
+
name: response.files[0].name
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
const model = this.useObjectModel ? objectValue : fullPath
|
|
258
|
+
|
|
259
|
+
this.$emit('update:modelValue', this.isMultiple ? [...this.modelValue, model] : model || '')
|
|
251
260
|
|
|
252
261
|
this.updateUploading(false)
|
|
262
|
+
|
|
263
|
+
this.$qas.logger.group('QasUploader - uploaded', [this.modelValue])
|
|
253
264
|
},
|
|
254
265
|
|
|
255
266
|
async fetchCredentials (filename) {
|
|
@@ -260,6 +271,12 @@ export default {
|
|
|
260
271
|
entity: this.entity,
|
|
261
272
|
filename
|
|
262
273
|
})
|
|
274
|
+
|
|
275
|
+
this.$qas.logger.group(
|
|
276
|
+
'QasUploader - fetchCredentials -> resposta de /upload-credentials/',
|
|
277
|
+
[data]
|
|
278
|
+
)
|
|
279
|
+
|
|
263
280
|
return data
|
|
264
281
|
} finally {
|
|
265
282
|
this.isFetching = false
|
|
@@ -278,8 +295,16 @@ export default {
|
|
|
278
295
|
}
|
|
279
296
|
|
|
280
297
|
const clonedValue = extend(true, [], this.modelValue)
|
|
281
|
-
const numberIndex = this.modelValue.findIndex(file =>
|
|
298
|
+
const numberIndex = this.modelValue.findIndex(file => {
|
|
299
|
+
if (this.useObjectModel) {
|
|
300
|
+
return file.uuid === index || file.url.includes(index)
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
return this.getFileName(file) === index
|
|
304
|
+
})
|
|
305
|
+
|
|
282
306
|
clonedValue.splice(numberIndex, 1)
|
|
307
|
+
|
|
283
308
|
this.$emit('update:modelValue', clonedValue)
|
|
284
309
|
},
|
|
285
310
|
|
|
@@ -288,12 +313,10 @@ export default {
|
|
|
288
313
|
},
|
|
289
314
|
|
|
290
315
|
getFilesList (uploadedFiles) {
|
|
291
|
-
const pathsList = Array.isArray(this.modelValue) ? this.modelValue : (this.modelValue ? [this.modelValue] : [])
|
|
292
|
-
|
|
293
316
|
uploadedFiles = uploadedFiles.map((file, indexToDelete) => {
|
|
294
317
|
return {
|
|
295
318
|
isUploaded: true,
|
|
296
|
-
|
|
319
|
+
url: file.xhr ? file.xhr.responseURL.split('?').shift() : '',
|
|
297
320
|
name: file.name,
|
|
298
321
|
progressLabel: file.__progressLabel,
|
|
299
322
|
sizeLabel: file.__sizeLabel,
|
|
@@ -302,11 +325,20 @@ export default {
|
|
|
302
325
|
}
|
|
303
326
|
})
|
|
304
327
|
|
|
328
|
+
const pathsList = Array.isArray(this.modelValue)
|
|
329
|
+
? this.modelValue
|
|
330
|
+
: (this.modelValue ? [this.modelValue] : [])
|
|
331
|
+
|
|
305
332
|
const mergedList = [...pathsList, ...uploadedFiles]
|
|
306
333
|
|
|
307
334
|
const files = {}
|
|
308
335
|
|
|
309
336
|
mergedList.forEach(file => {
|
|
337
|
+
if (this.useObjectModel && file.uuid) {
|
|
338
|
+
files[file.uuid] = file
|
|
339
|
+
return
|
|
340
|
+
}
|
|
341
|
+
|
|
310
342
|
if (file.isFailed) {
|
|
311
343
|
files[file.name] = file
|
|
312
344
|
return
|
|
@@ -314,21 +346,23 @@ export default {
|
|
|
314
346
|
|
|
315
347
|
if (typeof file === 'string') {
|
|
316
348
|
const fileName = this.getFileName(file)
|
|
317
|
-
files[fileName] = {
|
|
349
|
+
files[fileName] = { url: file, isUploaded: false, name: fileName }
|
|
318
350
|
return
|
|
319
351
|
}
|
|
320
352
|
|
|
321
|
-
if (file.
|
|
322
|
-
const fileName = this.getFileName(file.
|
|
353
|
+
if (file.url) {
|
|
354
|
+
const fileName = this.getFileName(file.url)
|
|
323
355
|
files[fileName] = file
|
|
324
356
|
}
|
|
325
357
|
})
|
|
326
358
|
|
|
359
|
+
this.$qas.logger.group('QasUploader - getFilesList', [files])
|
|
360
|
+
|
|
327
361
|
return files
|
|
328
362
|
},
|
|
329
363
|
|
|
330
364
|
getFileNameClass (isFailed) {
|
|
331
|
-
return isFailed ? 'text-negative' : 'text-grey-
|
|
365
|
+
return isFailed ? 'text-negative' : 'text-grey-9'
|
|
332
366
|
},
|
|
333
367
|
|
|
334
368
|
isFailed (file) {
|
|
@@ -343,6 +377,8 @@ export default {
|
|
|
343
377
|
const filesList = Array.from(this.hiddenInputElement.files)
|
|
344
378
|
const processedFiles = []
|
|
345
379
|
|
|
380
|
+
this.$refs.hiddenInput.value = ''
|
|
381
|
+
|
|
346
382
|
filesList.forEach(file => processedFiles.push(this.resizeImage(file)))
|
|
347
383
|
this.uploader.addFiles(await Promise.all(processedFiles))
|
|
348
384
|
},
|
|
@@ -362,7 +398,14 @@ export default {
|
|
|
362
398
|
// Retorna largura e altura da original da imagem
|
|
363
399
|
const { width, height } = await getImageSize(image)
|
|
364
400
|
|
|
365
|
-
if (width <= this.sizeLimit)
|
|
401
|
+
if (width <= this.sizeLimit) {
|
|
402
|
+
this.$qas.logger.info(`
|
|
403
|
+
QasUploader - resizeImage -> Tamanho da imagem menor que o tamanho limite,
|
|
404
|
+
sendo assim, não faz o resize
|
|
405
|
+
`)
|
|
406
|
+
|
|
407
|
+
return file
|
|
408
|
+
}
|
|
366
409
|
|
|
367
410
|
// Retorna os novos tamanhos redimensionados
|
|
368
411
|
const resizedDimensions = getResizeDimensions(this.sizeLimit, width, height)
|
|
@@ -380,7 +423,11 @@ export default {
|
|
|
380
423
|
const resizedImage = await pica.resize(image, canvas, this.defaultPicaResizeOptions)
|
|
381
424
|
const blob = await pica.toBlob(resizedImage, type, 0.90)
|
|
382
425
|
|
|
383
|
-
|
|
426
|
+
const newFile = new File([blob], file.name, { type })
|
|
427
|
+
|
|
428
|
+
this.$qas.logger.group('QasUploader - resizeImage -> nova imagem', [newFile])
|
|
429
|
+
|
|
430
|
+
return newFile
|
|
384
431
|
} catch {
|
|
385
432
|
// Caso não consiga redimensionar retorna o arquivo original
|
|
386
433
|
return file
|