@bildvitta/quasar-ui-asteroid 3.20.0-beta.2 → 3.20.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.
Files changed (102) hide show
  1. package/package.json +3 -3
  2. package/src/asteroid.js +8 -1
  3. package/src/components/actions/QasActions.vue +12 -2
  4. package/src/components/actions-menu/QasActionsMenu.vue +18 -5
  5. package/src/components/alert/QasAlert.vue +89 -64
  6. package/src/components/app-user/QasAppUser.vue +2 -1
  7. package/src/components/board-generator/QasBoardGenerator.vue +883 -162
  8. package/src/components/board-generator/QasBoardGenerator.yml +83 -2
  9. package/src/components/board-generator/private/PvBoardGeneratorCardsContainer.vue +25 -0
  10. package/src/components/box/QasBox.vue +16 -3
  11. package/src/components/box/QasBox.yml +10 -0
  12. package/src/components/btn/QasBtn.vue +27 -5
  13. package/src/components/btn/QasBtn.yml +10 -1
  14. package/src/components/btn-dropdown/QasBtnDropdown.vue +13 -1
  15. package/src/components/card/QasCard.vue +97 -25
  16. package/src/components/card/QasCard.yml +10 -0
  17. package/src/components/card-image/QasCardImage.vue +10 -1
  18. package/src/components/card-image/QasCardImage.yml +5 -0
  19. package/src/components/chart-view/QasChartView.vue +4 -3
  20. package/src/components/chart-view/QasChartView.yml +5 -0
  21. package/src/components/checkbox/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
  22. package/src/components/copy/QasCopy.vue +6 -1
  23. package/src/components/copy/QasCopy.yml +5 -0
  24. package/src/components/date-time-input/QasDateTimeInput.vue +30 -6
  25. package/src/components/dialog/QasDialog.vue +308 -91
  26. package/src/components/dialog/QasDialog.yml +51 -23
  27. package/src/components/dialog/composables/use-cancel.js +1 -1
  28. package/src/components/dialog/composables/use-dynamic-components.js +2 -2
  29. package/src/components/dialog/composables/use-ok.js +1 -0
  30. package/src/components/dialog-router/QasDialogRouter.vue +1 -1
  31. package/src/components/drawer/QasDrawer.vue +76 -26
  32. package/src/components/drawer/QasDrawer.yml +10 -0
  33. package/src/components/expansion-item/QasExpansionItem.yml +5 -0
  34. package/src/components/filters/QasFilters.vue +2 -1
  35. package/src/components/filters/private/PvFiltersActions.vue +79 -13
  36. package/src/components/form-generator/QasFormGenerator.vue +8 -1
  37. package/src/components/form-generator/QasFormGenerator.yml +10 -0
  38. package/src/components/form-view/QasFormView.vue +20 -11
  39. package/src/components/form-view/QasFormView.yml +6 -0
  40. package/src/components/gallery/composables/use-delete.js +2 -3
  41. package/src/components/gallery/private/PvGalleryCarouselDialog.vue +8 -7
  42. package/src/components/grid-item/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
  43. package/src/components/header/QasHeader.vue +66 -11
  44. package/src/components/header/QasHeader.yml +16 -1
  45. package/src/components/infinite-scroll/QasInfiniteScroll.vue +1 -1
  46. package/src/components/label/QasLabel.vue +3 -1
  47. package/src/components/layout/QasLayout.vue +16 -1
  48. package/src/components/layout/private/PvLayoutNotificationsDrawer.vue +2 -1
  49. package/src/components/layout/private/PvLayoutOverlayDrawer.vue +4 -2
  50. package/src/components/lazy-loading-components/QasLazyLoadingComponents.vue +262 -0
  51. package/src/components/lazy-loading-components/QasLazyLoadingComponents.yml +49 -0
  52. package/src/components/list-view/QasListView.vue +12 -4
  53. package/src/components/list-view/QasListView.yml +12 -0
  54. package/src/components/page-header/QasPageHeader.vue +49 -3
  55. package/src/components/page-header/QasPageHeader.yml +5 -0
  56. package/src/components/router-link/QasRouterLink.vue +72 -0
  57. package/src/components/router-link/QasRouterLink.yml +24 -0
  58. package/src/components/search-box/QasSearchBox.vue +1 -1
  59. package/src/components/select/QasSelect.vue +8 -1
  60. package/src/components/select-list-dialog/QasSelectListDialog.vue +40 -20
  61. package/src/components/select-list-dialog/QasSelectListDialog.yml +14 -2
  62. package/src/components/signature-uploader/QasSignatureUploader.vue +5 -18
  63. package/src/components/single-view/QasSingleView.vue +2 -2
  64. package/src/components/skeleton/QasSkeleton.vue +139 -0
  65. package/src/components/skeleton/QasSkeleton.yml +48 -0
  66. package/src/components/sortable/QasSortable.vue +1 -1
  67. package/src/components/stepper/QasStepper.vue +24 -2
  68. package/src/components/table-generator/QasTableGenerator.vue +186 -35
  69. package/src/components/table-generator/QasTableGenerator.yml +6 -1
  70. package/src/components/tabs-generator/QasTabsGenerator.vue +14 -3
  71. package/src/components/tabs-generator/QasTabsGenerator.yml +5 -1
  72. package/src/components/text-truncate/QasTextTruncate.vue +61 -12
  73. package/src/components/text-truncate/QasTextTruncate.yml +5 -0
  74. package/src/components/toggle-visibility/QasToggleVisibility.vue +2 -1
  75. package/src/components/tooltip/QasTooltip.vue +6 -1
  76. package/src/components/tree-generator/QasTreeGenerator.vue +4 -6
  77. package/src/components/uploader/QasUploader.vue +12 -2
  78. package/src/composables/private/use-view.js +1 -1
  79. package/src/composables/use-overlay-navigation.js +116 -10
  80. package/src/composables/use-screen.js +17 -1
  81. package/src/css/components/button.scss +82 -3
  82. package/src/css/components/item.scss +6 -0
  83. package/src/css/utils/background.scss +5 -0
  84. package/src/css/utils/border.scss +6 -0
  85. package/src/css/utils/container.scss +4 -3
  86. package/src/css/utils/text.scss +9 -0
  87. package/src/helpers/copy-to-clipboard.js +2 -1
  88. package/src/helpers/filters.js +1 -1
  89. package/src/helpers/promise-handler.js +2 -1
  90. package/src/helpers/set-scroll-gradient.js +31 -8
  91. package/src/helpers/set-scroll-on-grab.js +10 -3
  92. package/src/index.scss +1 -0
  93. package/src/mixins/search-filter.js +7 -1
  94. package/src/plugins/delete/Delete.js +7 -9
  95. package/src/plugins/delete/Delete.yml +1 -1
  96. package/src/plugins/dialog/Dialog.yml +1 -1
  97. package/src/plugins/notify-error/NotifyError.yml +1 -1
  98. package/src/plugins/notify-success/NotifySuccess.yml +1 -1
  99. package/src/plugins/screen/Screen.js +17 -1
  100. package/src/plugins/screen/Screen.yml +5 -1
  101. package/src/vue-plugin.js +5 -7
  102. package/src/plugins/index.js +0 -5
@@ -1,28 +1,32 @@
1
1
  <template>
2
2
  <div class="app-select-list-dialog full-width">
3
- <qas-header v-bind="headerProps" />
3
+ <slot name="container-header" :toggle-dialog>
4
+ <qas-header v-bind="headerProps" />
5
+ </slot>
4
6
 
5
7
  <component
6
8
  :is="containerListComponent"
7
9
  v-if="canShowContainerList"
8
10
  class="q-mt-md relative-position"
9
11
  >
10
- <span class="text-grey-10 text-subtitle1">
11
- {{ props.listLabel }}
12
- </span>
13
-
14
12
  <slot name="selected-content">
15
- <q-virtual-scroll #default="{ item, index }" class="app-select-list-dialog__list q-mt-md" :items="selectedOptions" separator>
16
- <q-item class="q-px-none text-body1 text-grey-8">
17
- <q-item-section>
18
- {{ item.label }}
19
- </q-item-section>
20
-
21
- <q-item-section avatar>
22
- <qas-btn v-bind="getRemoveButtonProps({ index, option: item })" />
23
- </q-item-section>
24
- </q-item>
25
- </q-virtual-scroll>
13
+ <qas-search-box v-model:results="searchedResults" v-bind="searchSelectedItemsBoxProps" class="q-mt-md">
14
+ <span class="text-grey-10 text-subtitle1">
15
+ {{ props.listLabel }}
16
+ </span>
17
+
18
+ <q-virtual-scroll #default="{ item, index }" class="app-select-list-dialog__list" :items="searchedResults" separator>
19
+ <q-item class="q-px-none text-body1 text-grey-8">
20
+ <q-item-section>
21
+ {{ item.label }}
22
+ </q-item-section>
23
+
24
+ <q-item-section avatar>
25
+ <qas-btn v-bind="getRemoveButtonProps({ index, option: item })" />
26
+ </q-item-section>
27
+ </q-item>
28
+ </q-virtual-scroll>
29
+ </qas-search-box>
26
30
  </slot>
27
31
 
28
32
  <q-inner-loading :showing="props.loading">
@@ -50,7 +54,7 @@
50
54
 
51
55
  <template #description>
52
56
  <slot name="dialog-description">
53
- <div v-if="dialogDescription" class="q-mb-xl text-center">
57
+ <div v-if="dialogDescription" class="q-mb-md">
54
58
  {{ dialogDescription }}
55
59
  </div>
56
60
 
@@ -69,6 +73,7 @@ import QasHeader from '../header/QasHeader.vue'
69
73
  import QasBtn from '../btn/QasBtn.vue'
70
74
  import QasDialog from '../dialog/QasDialog.vue'
71
75
  import QasSelectList from '../select-list/QasSelectList.vue'
76
+ import QasSearchBox from '../search-box/QasSearchBox.vue'
72
77
 
73
78
  import { computed, ref, watch, useSlots, inject } from 'vue'
74
79
 
@@ -130,6 +135,11 @@ const props = defineProps({
130
135
 
131
136
  useLazyLoading: {
132
137
  type: Boolean
138
+ },
139
+
140
+ searchPlaceholder: {
141
+ default: 'Pesquisar...',
142
+ type: String
133
143
  }
134
144
  })
135
145
 
@@ -172,6 +182,7 @@ defineExpose({ add, removeAll, remove, toggleDialog })
172
182
 
173
183
  // refs
174
184
  const model = ref([...props.modelValue])
185
+ const searchedResults = ref([])
175
186
 
176
187
  // computeds
177
188
  const hasError = computed(() => Array.isArray(props.error) ? !!props.error.length : !!props.error)
@@ -208,6 +219,15 @@ const hasLazyLoading = computed(() => {
208
219
  return props.useLazyLoading || !!props.selectListProps?.searchBoxProps?.useLazyLoading
209
220
  })
210
221
 
222
+ const searchSelectedItemsBoxProps = computed(() => {
223
+ return {
224
+ fuseOptions: { keys: ['label'] },
225
+ list: selectedOptions.value,
226
+ useEmptyResults: false,
227
+ placeholder: props.searchPlaceholder
228
+ }
229
+ })
230
+
211
231
  watch(() => props.modelValue, newValue => {
212
232
  model.value = [...newValue]
213
233
  })
@@ -227,7 +247,7 @@ function getDialogSlot (name) {
227
247
 
228
248
  // ------------------------- composable functions ------------------------------
229
249
  function useList () {
230
- const filteredOptions = ref(props.options)
250
+ const filteredOptions = ref([...props.options])
231
251
 
232
252
  const selectedOptions = computed(() => {
233
253
  const options = []
@@ -323,8 +343,8 @@ function useSelectDialog () {
323
343
 
324
344
  const defaultDialogProps = computed(() => {
325
345
  return {
326
- useFullMaxWidth: true,
327
-
346
+ size: 'md',
347
+ title: 'Adicionar itens',
328
348
  ...props.dialogProps,
329
349
 
330
350
  onBeforeShow: event => {
@@ -55,6 +55,11 @@ props:
55
55
  type: Array
56
56
  model: true
57
57
 
58
+ search-placeholder:
59
+ desc: Placeholder do campo de busca.
60
+ default: Pesquisar...
61
+ type: String
62
+
58
63
  select-list-model:
59
64
  desc: Model dos itens selecionados dentro do dialog.
60
65
  type: Array
@@ -64,8 +69,8 @@ props:
64
69
 
65
70
  select-list-props:
66
71
  desc: Propriedades repassadas para o componente QasSelectList.
67
- default: []
68
- type: Array
72
+ default: {}
73
+ type: Object
69
74
 
70
75
  use-lazy-loading:
71
76
  desc: O componente precisa saber se o lazy-loading esta habilitado para este componente, e caso esteja usando customização pelos slots do "dialog-description", é necessário informar por esta prop.
@@ -82,6 +87,13 @@ slots:
82
87
  dialog-header:
83
88
  desc: Slot para substituir cabeçalho do dialog.
84
89
 
90
+ container-header:
91
+ desc: Slot para personalizar o header do componente dentro do box.
92
+ scope:
93
+ toggle-dialog:
94
+ desc: Função para abertura/fechamento do dialog do select list.
95
+ type: Function
96
+
85
97
  selected-content:
86
98
  desc: Slot para personalizar o conteúdo dos itens adicionados.
87
99
 
@@ -3,12 +3,8 @@
3
3
  <qas-uploader ref="uploader" v-model="model" :add-button-fn="openDialog" :use-resize="false" v-bind="defaultUploaderProps" />
4
4
 
5
5
  <qas-dialog v-model="isOpenedDialog" v-bind="defaultDialogProps">
6
- <template #header>
7
- <div class="text-bold text-center">Insira sua assinatura digital no campo abaixo</div>
8
- </template>
9
-
10
6
  <template #description>
11
- <div :style="signaturePadWidth">
7
+ <div>
12
8
  <qas-signature-pad ref="signaturePadModal" v-model:empty="isEmpty" :height="signaturePadHeight" />
13
9
  </div>
14
10
  </template>
@@ -22,7 +18,7 @@ import QasUploader from '../uploader/QasUploader.vue'
22
18
  import QasSignaturePad from '../signature-pad/QasSignaturePad.vue'
23
19
 
24
20
  import { base64ToBlob } from '../../helpers'
25
- import { NotifyError } from '../../plugins'
21
+ import NotifyError from '../../plugins/notify-error/NotifyError.js'
26
22
 
27
23
  export default {
28
24
  name: 'QasSignatureUploader',
@@ -82,10 +78,11 @@ export default {
82
78
 
83
79
  defaultDialogProps () {
84
80
  return {
85
- maxWidth: '620px',
81
+ title: 'Assinatura digital',
82
+ size: 'md',
86
83
  ...this.dialogProps,
87
84
  ok: {
88
- label: 'Salvar',
85
+ label: 'Assinar',
89
86
  onClick: () => this.getSignatureData()
90
87
  }
91
88
  }
@@ -111,16 +108,6 @@ export default {
111
108
  return sizes.true
112
109
  },
113
110
 
114
- signaturePadWidth () {
115
- const sizes = {
116
- [this.$qas.screen.isSmall]: { width: '100%' },
117
- [this.$qas.screen.isMedium]: { width: '570px' },
118
- [this.$qas.screen.isLarge]: { width: '350px' }
119
- }
120
-
121
- return sizes.true
122
- },
123
-
124
111
  uploaderScope () {
125
112
  return this.$refs?.uploader?.uploader
126
113
  }
@@ -71,7 +71,7 @@ const qas = inject('qas')
71
71
  // composables
72
72
  const route = useRoute()
73
73
 
74
- const { isBackgroundOverlay } = useOverlayNavigation()
74
+ const { isBackgroundOverlay, route: overlayRoute } = useOverlayNavigation()
75
75
 
76
76
  const {
77
77
  // state
@@ -96,7 +96,7 @@ const {
96
96
  defineExpose({ fetchSingle, fetchHandler })
97
97
 
98
98
  // computed
99
- const id = computed(() => props.customId || route.params.id)
99
+ const id = computed(() => props.customId || overlayRoute.value.params.id)
100
100
 
101
101
  const resultModel = computed(() => {
102
102
  if (props.useStore) return qas.getGetter({ entity: props.entity, key: 'byId' })(id.value) || {}
@@ -0,0 +1,139 @@
1
+ <template>
2
+ <q-skeleton class="qas-skeleton" v-bind="skeletonProps" />
3
+ </template>
4
+
5
+ <script setup>
6
+ import { computed, useAttrs } from 'vue'
7
+
8
+ defineOptions({ name: 'QasSkeleton', inheritAttrs: false })
9
+
10
+ const props = defineProps({
11
+ gutter: {
12
+ type: String,
13
+ default: undefined
14
+ },
15
+
16
+ width: {
17
+ type: String,
18
+ default: undefined
19
+ },
20
+
21
+ height: {
22
+ type: String,
23
+ default: undefined
24
+ },
25
+
26
+ minHeight: {
27
+ type: String,
28
+ default: undefined
29
+ },
30
+
31
+ maxWidth: {
32
+ type: String,
33
+ default: undefined
34
+ },
35
+
36
+ size: {
37
+ type: String,
38
+ default: undefined
39
+ },
40
+
41
+ type: {
42
+ type: String,
43
+ default: undefined
44
+ },
45
+
46
+ useContrast: {
47
+ type: Boolean
48
+ },
49
+
50
+ useOverlay: {
51
+ type: Boolean
52
+ }
53
+ })
54
+
55
+ // composables
56
+ const attrs = useAttrs()
57
+
58
+ // computeds
59
+ const skeletonProps = computed(() => {
60
+ const defaultCustomProps = {
61
+ QasBadge: {
62
+ width: props.width || '60px',
63
+ height: props.height || '24px'
64
+ },
65
+
66
+ QasActionsMenu: {
67
+ width: props.width || '80px',
68
+ height: props.height || '24px'
69
+ },
70
+
71
+ QasCheckbox: {
72
+ size: '18px'
73
+ },
74
+
75
+ QasBtn: {
76
+ width: props.width || '130px',
77
+ height: '24px'
78
+ },
79
+
80
+ QasToggleVisibility: {
81
+ width: props.width || '140px'
82
+ },
83
+
84
+ QasTextTruncate: {
85
+ width: props.width || '200px'
86
+ },
87
+
88
+ QasStatus: {
89
+ size: '16px',
90
+ type: 'circle'
91
+ }
92
+ }
93
+
94
+ const actionTypes = [
95
+ 'QasCheckbox',
96
+ 'QasBtn',
97
+ 'QasToggleVisibility',
98
+ 'QasActionsMenu'
99
+ ]
100
+
101
+ const classes = {
102
+ [`qas-skeleton--${props.gutter}`]: !!props.gutter,
103
+ 'bg-blue-grey-4': props.useContrast || actionTypes.includes(props.type),
104
+ 'qas-skeleton--overlay': props.useOverlay
105
+ }
106
+
107
+ /**
108
+ * Se o tipo for um dos tipos customizados, usa as propriedades definidas, não podemos passar por
109
+ * exemplo "QasBtn" na prop "type" para o QSkeleton, caso seja passado uma prop type que não seja
110
+ * custom, passa o valor normalmente.
111
+ */
112
+ const type = defaultCustomProps[props.type] ? defaultCustomProps[props.type].type : props.type
113
+
114
+ return {
115
+ animation: 'blink',
116
+ size: props.size,
117
+ type,
118
+ class: [classes, attrs.class],
119
+ width: props.width,
120
+ height: props.height,
121
+ ...defaultCustomProps[props.type],
122
+ style: {
123
+ ...(props.maxWidth && { maxWidth: props.maxWidth }),
124
+ ...(props.minHeight && { minHeight: props.minHeight })
125
+ }
126
+ }
127
+ })
128
+ </script>
129
+
130
+ <style lang="scss">
131
+ .qas-skeleton {
132
+ &--overlay {
133
+ top: 0 !important;
134
+ width: 100%;
135
+ bottom: 0 !important;
136
+ position: absolute;
137
+ }
138
+ }
139
+ </style>
@@ -0,0 +1,48 @@
1
+ type: component
2
+
3
+ meta:
4
+ desc: Componente wrapper do "QSkeleton" que facilita a criação de skeletons com padrões pré-definidos para componentes do Asteroid.
5
+
6
+ props:
7
+ gutter:
8
+ desc: Adiciona espaçamento (padding) no skeleton quando usado como overlay.
9
+ type: String
10
+ examples: ['sm', 'md', 'lg', 'xl']
11
+
12
+ height:
13
+ desc: Altura do skeleton.
14
+ type: String
15
+ examples: ['50px']
16
+
17
+ max-width:
18
+ desc: Largura máxima do skeleton.
19
+ type: String
20
+ examples: ['300px']
21
+
22
+ min-height:
23
+ desc: Altura mínima do skeleton.
24
+ type: String
25
+ examples: ['200px']
26
+
27
+ size:
28
+ desc: Tamanho do skeleton (usado para tipos circulares ou quadrados).
29
+ type: String
30
+ examples: ['50px']
31
+
32
+ type:
33
+ desc: Tipo do skeleton. Pode ser um tipo padrão do Quasar ou um dos tipos personalizados do Asteroid ("QasBadge", "QasActionsMenu", "QasCheckbox", "QasBtn", "QasToggleVisibility", "QasTextTruncate", "QasStatus").
34
+ type: String
35
+ examples: ['text', 'QasBtn', 'rect']
36
+
37
+ use-overlay:
38
+ desc: Define se o skeleton deve se comportar como um overlay (posicionamento absoluto cobrindo o pai).
39
+ type: Boolean
40
+
41
+ use-contrast:
42
+ desc: Define se o skeleton deve ter a cor de fundo mais escura ("bg-blue-grey-4"), geralmente usado para títulos ou botões.
43
+ type: Boolean
44
+
45
+ width:
46
+ desc: Largura do skeleton.
47
+ type: String
48
+ examples: ['100px', '100%']
@@ -9,7 +9,7 @@ import { Loading, extend } from 'quasar'
9
9
  import Sortable from 'sortablejs'
10
10
  import { getAction } from '@bildvitta/store-adapter'
11
11
 
12
- import { NotifyError } from '../../plugins'
12
+ import NotifyError from '../../plugins/notify-error/NotifyError.js'
13
13
 
14
14
  export default {
15
15
  name: 'QasSortable',
@@ -206,6 +206,27 @@ function previous () {
206
206
  border-radius: var(--qas-generic-border-radius);
207
207
  }
208
208
 
209
+ .q-stepper__tab {
210
+ /*
211
+ * Por padrão o quasar sempre deixa as demais linhas com o mesmo tamanho, exceto a primeira e a última, que são
212
+ * maiores devido terem alinhamento inicial e final respectivamente, enquanto as demais possuem alinhamento
213
+ * central. Para equalizar visualmente os tamanhos, é necessário setar uma proporção de flex diferente para a
214
+ * primeira/última tab e para as tabs do meio.
215
+ *
216
+ * Proporção 2:3 para equalizar visualmente os tamanhos:
217
+ * - Primeira/última tab: flex 2 (possuem apenas meia linha)
218
+ * - Tabs do meio: flex 3 (possuem linha completa dos dois lados)
219
+ */
220
+ &:first-child,
221
+ &:last-child {
222
+ flex: 2;
223
+ }
224
+
225
+ &:not(:first-child):not(:last-child) {
226
+ flex: 3;
227
+ }
228
+ }
229
+
209
230
  .q-stepper {
210
231
  &__tab {
211
232
  &--done {
@@ -223,9 +244,10 @@ function previous () {
223
244
  }
224
245
  }
225
246
 
226
- // Seta a cor do after da linha quando a step está finalizada, é a primeira step ou a próxima é ativa.
247
+ // Seta a cor do after da linha quando a step está finalizada, é a primeira step ou a próxima é ativa ou finalizada.
227
248
  &:first-child,
228
- &:has(+ .q-stepper__tab.q-stepper__tab--active) {
249
+ &:has(+ .q-stepper__tab.q-stepper__tab--active),
250
+ &:has(+ .q-stepper__tab.q-stepper__tab--done) {
229
251
  .q-stepper__line::after {
230
252
  background-color: var(--q-primary);
231
253
  }