@bildvitta/quasar-ui-asteroid 2.16.0 → 3.0.0-alpha.2

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 (280) hide show
  1. package/dist/api/QasActions.json +40 -0
  2. package/dist/api/QasActionsMenu.json +64 -0
  3. package/dist/api/QasAlert.json +40 -0
  4. package/dist/api/QasAppBar.json +52 -0
  5. package/dist/api/QasAppMenu.json +38 -0
  6. package/dist/api/QasAvatar.json +44 -0
  7. package/dist/api/QasBox.json +16 -0
  8. package/dist/api/QasBreakline.json +32 -0
  9. package/dist/api/QasBtn.json +16 -0
  10. package/dist/api/QasCard.json +52 -0
  11. package/dist/api/QasCheckboxGroup.json +38 -0
  12. package/dist/api/QasCopy.json +29 -0
  13. package/dist/api/QasDateTimeInput.json +60 -0
  14. package/dist/api/QasDebugger.json +13 -0
  15. package/dist/api/QasDelete.json +64 -0
  16. package/dist/api/QasDialog.json +109 -0
  17. package/dist/api/QasDialogRouter.json +31 -0
  18. package/dist/api/QasField.json +56 -0
  19. package/dist/api/QasFilters.json +111 -0
  20. package/dist/api/QasFormGenerator.json +92 -0
  21. package/dist/api/QasFormView.json +228 -0
  22. package/dist/api/QasGallery.json +54 -0
  23. package/dist/api/QasGridGenerator.json +108 -0
  24. package/dist/api/QasInput.json +40 -0
  25. package/dist/api/QasLabel.json +40 -0
  26. package/dist/api/QasLayout.json +47 -0
  27. package/dist/api/QasListItems.json +72 -0
  28. package/dist/api/QasListView.json +161 -0
  29. package/dist/api/QasMap.json +41 -0
  30. package/dist/api/QasNestedFields.json +223 -0
  31. package/dist/api/QasNumericInput.json +68 -0
  32. package/dist/api/QasPageHeader.json +36 -0
  33. package/dist/api/QasPasswordInput.json +121 -0
  34. package/dist/api/QasPasswordStrengthChecker.json +126 -0
  35. package/dist/api/QasProfile.json +74 -0
  36. package/dist/api/QasResizer.json +34 -0
  37. package/dist/api/QasSearchBox.json +91 -0
  38. package/dist/api/QasSelect.json +88 -0
  39. package/dist/api/QasSelectList.json +134 -0
  40. package/dist/api/QasSignaturePad.json +63 -0
  41. package/dist/api/QasSignatureUploader.json +41 -0
  42. package/dist/api/QasSingleView.json +147 -0
  43. package/dist/api/QasSortable.json +80 -0
  44. package/dist/api/QasTableGenerator.json +56 -0
  45. package/dist/api/QasTabsGenerator.json +90 -0
  46. package/dist/api/QasTextTruncate.json +38 -0
  47. package/dist/api/QasTransfer.json +70 -0
  48. package/dist/api/QasUploader.json +143 -0
  49. package/dist/asteroid.cjs.css +1 -0
  50. package/dist/asteroid.cjs.js +9307 -0
  51. package/dist/asteroid.cjs.min.js +6 -0
  52. package/dist/asteroid.esm.css +1 -0
  53. package/dist/asteroid.esm.js +9298 -0
  54. package/dist/asteroid.esm.min.js +6 -0
  55. package/dist/asteroid.umd.css +1 -0
  56. package/dist/asteroid.umd.js +9301 -0
  57. package/dist/asteroid.umd.min.js +6 -0
  58. package/dist/vetur/asteroid-attributes.json +1178 -0
  59. package/dist/vetur/asteroid-tags.json +535 -0
  60. package/package.json +41 -56
  61. package/src/assets/logo-modular.svg +1 -1
  62. package/src/asteroid.js +1 -0
  63. package/src/components/actions/QasActions.vue +45 -0
  64. package/src/components/actions/QasActions.yml +24 -0
  65. package/src/components/actions-menu/QasActionsMenu.vue +41 -14
  66. package/src/components/actions-menu/QasActionsMenu.yml +63 -0
  67. package/src/components/alert/QasAlert.vue +90 -0
  68. package/src/components/alert/QasAlert.yml +33 -0
  69. package/src/components/app-bar/QasAppBar.vue +16 -13
  70. package/src/components/app-bar/QasAppBar.yml +51 -0
  71. package/src/components/app-menu/QasAppMenu.vue +10 -12
  72. package/src/components/app-menu/QasAppMenu.yml +32 -0
  73. package/src/components/avatar/QasAvatar.vue +17 -9
  74. package/src/components/avatar/QasAvatar.yml +38 -0
  75. package/src/components/box/QasBox.vue +12 -4
  76. package/src/components/box/QasBox.yml +13 -0
  77. package/src/components/breakline/QasBreakline.vue +37 -0
  78. package/src/components/breakline/QasBreakline.yml +25 -0
  79. package/src/components/btn/QasBtn.vue +27 -24
  80. package/src/components/btn/QasBtn.yml +13 -0
  81. package/src/components/card/QasCard.vue +32 -33
  82. package/src/components/card/QasCard.yml +42 -0
  83. package/src/components/checkbox-group/QasCheckboxGroup.vue +50 -17
  84. package/src/components/checkbox-group/QasCheckboxGroup.yml +30 -0
  85. package/src/components/copy/QasCopy.vue +22 -11
  86. package/src/components/copy/QasCopy.yml +20 -0
  87. package/src/components/date-time-input/QasDateTimeInput.vue +18 -26
  88. package/src/components/date-time-input/QasDateTimeInput.yml +54 -0
  89. package/src/components/debugger/QasDebugger.vue +2 -0
  90. package/src/components/debugger/QasDebugger.yml +10 -0
  91. package/src/components/delete/QasDelete.vue +43 -16
  92. package/src/components/delete/QasDelete.yml +52 -0
  93. package/src/components/dialog/QasDialog.vue +63 -67
  94. package/src/components/dialog/QasDialog.yml +86 -0
  95. package/src/components/dialog-router/QasDialogRouter.vue +14 -4
  96. package/src/components/dialog-router/QasDialogRouter.yml +23 -0
  97. package/src/components/field/QasField.vue +21 -24
  98. package/src/components/field/QasField.yml +31 -0
  99. package/src/components/filters/QasFilters.vue +33 -26
  100. package/src/components/filters/QasFilters.yml +91 -0
  101. package/src/components/form-generator/QasFormGenerator.vue +13 -15
  102. package/src/components/form-generator/QasFormGenerator.yml +64 -0
  103. package/src/components/form-view/QasFormView.vue +129 -69
  104. package/src/components/form-view/QasFormView.yml +179 -0
  105. package/src/components/gallery/QasGallery.vue +47 -30
  106. package/src/components/gallery/QasGallery.yml +51 -0
  107. package/src/components/grid-generator/QasGridGenerator.vue +15 -7
  108. package/src/components/grid-generator/QasGridGenerator.yml +73 -0
  109. package/src/components/index.js +0 -0
  110. package/src/components/input/QasInput.vue +43 -36
  111. package/src/components/input/QasInput.yml +32 -0
  112. package/src/components/label/QasLabel.vue +14 -15
  113. package/src/components/label/QasLabel.yml +28 -0
  114. package/src/components/layout/QasLayout.vue +13 -21
  115. package/src/components/layout/QasLayout.yml +38 -0
  116. package/src/components/list-items/QasListItems.vue +15 -12
  117. package/src/components/list-items/QasListItems.yml +57 -0
  118. package/src/components/list-view/QasListView.vue +57 -31
  119. package/src/components/list-view/QasListView.yml +132 -0
  120. package/src/components/map/QasMap.vue +15 -31
  121. package/src/components/map/QasMap.yml +33 -0
  122. package/src/components/nested-fields/QasNestedFields.vue +57 -47
  123. package/src/components/nested-fields/QasNestedFields.yml +180 -0
  124. package/src/components/numeric-input/QasNumericInput.vue +31 -22
  125. package/src/components/numeric-input/QasNumericInput.yml +51 -0
  126. package/src/components/page-header/QasPageHeader.vue +20 -11
  127. package/src/components/page-header/QasPageHeader.yml +24 -0
  128. package/src/components/password-input/QasPasswordInput.vue +24 -21
  129. package/src/components/password-input/QasPasswordInput.yml +103 -0
  130. package/src/components/password-strength-checker/QasPasswordStrengthChecker.vue +51 -34
  131. package/src/components/password-strength-checker/QasPasswordStrengthChecker.yml +103 -0
  132. package/src/components/profile/QasProfile.vue +15 -13
  133. package/src/components/profile/QasProfile.yml +60 -0
  134. package/src/components/resizer/QasResizer.vue +3 -3
  135. package/src/components/resizer/QasResizer.yml +23 -0
  136. package/src/components/search-box/QasSearchBox.vue +50 -21
  137. package/src/components/search-box/QasSearchBox.yml +76 -0
  138. package/src/components/select/QasSelect.vue +51 -50
  139. package/src/components/select/QasSelect.yml +62 -0
  140. package/src/components/select-list/QasSelectList.vue +72 -53
  141. package/src/components/select-list/QasSelectList.yml +116 -0
  142. package/src/components/signature-pad/QasSignaturePad.vue +60 -40
  143. package/src/components/signature-pad/QasSignaturePad.yml +53 -0
  144. package/src/components/signature-uploader/QasSignatureUploader.vue +19 -17
  145. package/src/components/signature-uploader/QasSignatureUploader.yml +36 -0
  146. package/src/components/single-view/QasSingleView.vue +41 -22
  147. package/src/components/single-view/QasSingleView.yml +116 -0
  148. package/src/components/sortable/QasSortable.vue +51 -30
  149. package/src/components/sortable/QasSortable.yml +65 -0
  150. package/src/components/table-generator/QasTableGenerator.vue +112 -21
  151. package/src/components/table-generator/QasTableGenerator.yml +46 -0
  152. package/src/components/tabs-generator/QasTabsGenerator.vue +37 -25
  153. package/src/components/tabs-generator/QasTabsGenerator.yml +67 -0
  154. package/src/components/text-truncate/QasTextTruncate.vue +25 -17
  155. package/src/components/text-truncate/QasTextTruncate.yml +32 -0
  156. package/src/components/transfer/QasTransfer.vue +48 -49
  157. package/src/components/transfer/QasTransfer.yml +59 -0
  158. package/src/components/uploader/QasUploader.vue +169 -48
  159. package/src/components/uploader/QasUploader.yml +117 -0
  160. package/src/css/background.scss +1 -1
  161. package/src/css/border.scss +7 -6
  162. package/src/css/design-system.scss +0 -43
  163. package/src/css/fonts.scss +2 -28
  164. package/src/css/opacity.scss +0 -4
  165. package/src/css/set-brand.scss +15 -0
  166. package/src/css/transitions.scss +1 -1
  167. package/src/helpers/add-counter-suffix.js +3 -0
  168. package/src/helpers/{base64ToBlob.js → base-64-to-blob.js} +0 -0
  169. package/src/helpers/{constructObject.js → construct-object.js} +0 -0
  170. package/src/helpers/filter-object.js +8 -6
  171. package/src/helpers/filters.js +8 -4
  172. package/src/helpers/{greatestCommonDivisor.js → get-greatest-common-divisor.js} +0 -0
  173. package/src/helpers/get-slot-children-text.js +15 -0
  174. package/src/helpers/images.js +28 -0
  175. package/src/helpers/index.js +11 -59
  176. package/src/helpers/{isLocalDevelopment.js → is-local-development.js} +0 -0
  177. package/src/helpers/set-scroll-on-grab.js +61 -0
  178. package/src/index.cjs.js +1 -0
  179. package/src/index.esm.js +4 -0
  180. package/src/index.scss +19 -21
  181. package/src/index.umd.js +2 -0
  182. package/src/mixins/context.js +1 -1
  183. package/src/mixins/dialog-router.js +17 -0
  184. package/src/mixins/form.js +4 -12
  185. package/src/mixins/generator.js +14 -14
  186. package/src/mixins/index.js +2 -8
  187. package/src/mixins/password.js +73 -11
  188. package/src/mixins/screen.js +8 -6
  189. package/src/mixins/view.js +62 -22
  190. package/src/plugins/dialog/Dialog.js +14 -0
  191. package/src/plugins/dialog/Dialog.yml +10 -0
  192. package/src/plugins/index.js +4 -2
  193. package/src/plugins/{NotifyError.js → notify-error/NotifyError.js} +0 -0
  194. package/src/plugins/notify-error/NotifyError.yml +11 -0
  195. package/src/plugins/{NotifySuccess.js → notify-success/NotifySuccess.js} +3 -3
  196. package/src/plugins/notify-success/NotifySuccess.yml +11 -0
  197. package/src/store/history.js +43 -0
  198. package/src/store/index.js +1 -0
  199. package/src/vue-plugin.js +185 -0
  200. package/.babelrc +0 -12
  201. package/.storybook/main.js +0 -35
  202. package/.storybook/preview.js +0 -26
  203. package/debug.log +0 -1
  204. package/index.js +0 -4
  205. package/jest-setup.js +0 -1
  206. package/jest.config.json +0 -22
  207. package/postcss.config.js +0 -5
  208. package/src/components/Introduction.stories.mdx +0 -12
  209. package/src/components/actions-menu/QasActionsMenu.stories.js +0 -73
  210. package/src/components/app-bar/QasAppBar.stories.js +0 -84
  211. package/src/components/app-menu/QasAppMenu.stories.js +0 -66
  212. package/src/components/apps-menu/QasAppsMenu.spec.js +0 -58
  213. package/src/components/apps-menu/QasAppsMenu.stories.js +0 -54
  214. package/src/components/apps-menu/QasAppsMenu.vue +0 -48
  215. package/src/components/avatar/QasAvatar.spec.js +0 -14
  216. package/src/components/avatar/QasAvatar.stories.js +0 -52
  217. package/src/components/box/QasBox.spec.js +0 -18
  218. package/src/components/box/QasBox.stories.js +0 -35
  219. package/src/components/break-line/QasBreakLine.stories.js +0 -57
  220. package/src/components/break-line/QasBreakLine.vue +0 -52
  221. package/src/components/btn/QasBtn.stories.js +0 -45
  222. package/src/components/btn-actions/QasBtnActions.stories.js +0 -77
  223. package/src/components/btn-actions/QasBtnActions.vue +0 -54
  224. package/src/components/card/QasCard.stories.js +0 -126
  225. package/src/components/checkbox-group/QasCheckboxGroup.stories.js +0 -59
  226. package/src/components/copy/QasCopy.stories.js +0 -41
  227. package/src/components/date-time-input/QasDateTimeInput.stories.js +0 -67
  228. package/src/components/debugger/QasDebugger.stories.js +0 -33
  229. package/src/components/delete/QasDelete.stories.js +0 -80
  230. package/src/components/dialog/QasDialog.stories.js +0 -139
  231. package/src/components/dialog-router/QasDialogRouter.stories.js +0 -38
  232. package/src/components/field/QasField.stories.js +0 -181
  233. package/src/components/filters/QasFilters.stories.js +0 -121
  234. package/src/components/form-generator/QasFormGenerator.stories.js +0 -115
  235. package/src/components/form-view/QasFormView.stories.js +0 -236
  236. package/src/components/gallery/QasGallery.stories.js +0 -91
  237. package/src/components/grid-generator/QasGridGenerator.stories.js +0 -142
  238. package/src/components/input/QasInput.stories.js +0 -78
  239. package/src/components/label/QasLabel.stories.js +0 -60
  240. package/src/components/layout/QasLayout.stories.js +0 -104
  241. package/src/components/list-items/QasListItems.stories.js +0 -135
  242. package/src/components/list-view/QasListView.stories.js +0 -168
  243. package/src/components/map/QasMap.stories.js +0 -75
  244. package/src/components/nested-fields/QasNestedFields.stories.js +0 -255
  245. package/src/components/numeric-input/QasNumericInput.stories.js +0 -92
  246. package/src/components/page-header/QasPageHeader.stories.js +0 -61
  247. package/src/components/password-input/QasPasswordInput.stories.js +0 -76
  248. package/src/components/password-strength-checker/QasPasswordStrengthChecker.stories.js +0 -54
  249. package/src/components/profile/QasProfile.stories.js +0 -131
  250. package/src/components/resizer/QasResizer.stories.js +0 -43
  251. package/src/components/search-box/QasSearchBox.stories.js +0 -111
  252. package/src/components/select/QasSelect.stories.js +0 -113
  253. package/src/components/select-list/QasSelectList.stories.js +0 -153
  254. package/src/components/signature-pad/QasSignaturePad.stories.js +0 -51
  255. package/src/components/signature-uploader/QasSignatureUploader.stories.js +0 -69
  256. package/src/components/single-view/QasSingleView.stories.js +0 -130
  257. package/src/components/sortable/QasSortable.stories.js +0 -80
  258. package/src/components/table-generator/QasTableGenerator.stories.js +0 -120
  259. package/src/components/tabs-generator/QasTabsGenerator.stories.js +0 -145
  260. package/src/components/text-truncate/QasTextTruncate.stories.js +0 -55
  261. package/src/components/tip/QasTip.stories.js +0 -57
  262. package/src/components/tip/QasTip.vue +0 -68
  263. package/src/components/tooltip/QasTooltip.stories.js +0 -63
  264. package/src/components/tooltip/QasTooltip.vue +0 -81
  265. package/src/components/transfer/QasTransfer.stories.js +0 -118
  266. package/src/components/uploader/QasCustomUploader.vue +0 -120
  267. package/src/components/uploader/QasUploader.stories.js +0 -139
  268. package/src/directives/Test.js +0 -13
  269. package/src/helpers/historyHandler.js +0 -52
  270. package/src/helpers/label.js +0 -3
  271. package/src/index.js +0 -249
  272. package/src/mixins/map-markers.js +0 -26
  273. package/src/mixins/unsaved-changes.js +0 -24
  274. package/src/mixins/uploader.js +0 -30
  275. package/src/mocks/json/user.json +0 -27
  276. package/src/mocks/json/users-new.json +0 -23
  277. package/src/mocks/json/users.json +0 -97
  278. package/src/mocks/storeModule.js +0 -71
  279. package/src/pages/Forbidden.vue +0 -6
  280. package/src/pages/NotFound.vue +0 -6
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <qas-box v-bind="$attrs">
2
+ <qas-box>
3
3
  <q-input v-model="search" clearable :disable="!list.length" outlined :placeholder="placeholder">
4
4
  <template #append>
5
5
  <q-icon color="primary" name="o_search" />
@@ -7,9 +7,9 @@
7
7
  </q-input>
8
8
 
9
9
  <div class="overflow-auto q-mt-xs relative-position" :style="contentStyle">
10
- <slot v-if="hasResults" :results="results" />
10
+ <slot v-if="hasResults" />
11
11
 
12
- <slot v-else-if="!hideEmptySlot" name="empty">
12
+ <slot v-else-if="useEmptySlot" name="empty-result">
13
13
  <div class="absolute-center text-center">
14
14
  <q-icon class="q-mb-sm text-center" color="primary" name="o_search" size="38px" />
15
15
  <div>Não há resultados disponíveis.</div>
@@ -20,11 +20,13 @@
20
20
  </template>
21
21
 
22
22
  <script>
23
- import QasBox from '../box/QasBox.vue'
24
-
25
23
  import Fuse from 'fuse.js'
26
24
 
25
+ import QasBox from '../box/QasBox.vue'
26
+
27
27
  export default {
28
+ name: 'QasSearchBox',
29
+
28
30
  components: {
29
31
  QasBox
30
32
  },
@@ -45,30 +47,42 @@ export default {
45
47
  type: String
46
48
  },
47
49
 
48
- hideEmptySlot: {
49
- type: Boolean
50
- },
51
-
52
50
  list: {
53
51
  default: () => [],
54
52
  type: Array
55
53
  },
56
54
 
55
+ modelValue: {
56
+ default: '',
57
+ type: String
58
+ },
59
+
57
60
  placeholder: {
58
61
  default: 'Pesquisar',
59
62
  type: String
60
63
  },
61
64
 
62
- value: {
63
- default: '',
64
- type: String
65
+ useEmptySlot: {
66
+ default: true,
67
+ type: Boolean
68
+ },
69
+
70
+ results: {
71
+ type: Array,
72
+ default: () => []
65
73
  }
66
74
  },
67
75
 
76
+ emits: [
77
+ 'empty-result',
78
+ 'update:modelValue',
79
+ 'update:results'
80
+ ],
81
+
68
82
  data () {
69
83
  return {
70
84
  fuse: null,
71
- results: this.list,
85
+ searchResults: this.list,
72
86
  search: ''
73
87
  }
74
88
  },
@@ -93,7 +107,7 @@ export default {
93
107
  },
94
108
 
95
109
  hasResults () {
96
- return !!this.results.length
110
+ return !!this.searchResults.length
97
111
  }
98
112
  },
99
113
 
@@ -103,32 +117,47 @@ export default {
103
117
  },
104
118
 
105
119
  hasResults (value) {
106
- !value && this.$emit('emptyResult')
120
+ !value && this.$emit('empty-result')
107
121
  },
108
122
 
109
- list (value) {
110
- this.fuse.list = value
111
- this.setResults(this.search)
123
+ list: {
124
+ handler (value) {
125
+ this.fuse = new Fuse(value, this.defaultFuseOptions)
126
+
127
+ this.setResults(this.search)
128
+ },
129
+
130
+ deep: true
112
131
  },
113
132
 
114
133
  search: {
115
134
  handler (value) {
116
135
  this.setResults(value)
117
- this.$emit('input', value)
136
+ this.$emit('update:modelValue', value)
118
137
  },
119
138
 
139
+ immediate: true
140
+ },
141
+
142
+ searchResults: {
143
+ handler (value) {
144
+ this.$emit('update:results', value.map(result => result.item || result))
145
+ },
120
146
  immediate: true
121
147
  }
122
148
  },
123
149
 
124
150
  created () {
125
- this.search = this.value
151
+ this.search = this.modelValue
126
152
  this.fuse = new Fuse(this.list, this.defaultFuseOptions)
153
+ this.setResults()
127
154
  },
128
155
 
129
156
  methods: {
130
157
  setResults (value) {
131
- this.results = value ? this.fuse.search(value) : this.list
158
+ this.searchResults = value
159
+ ? this.fuse.search(value)
160
+ : this.list
132
161
  }
133
162
  }
134
163
  }
@@ -0,0 +1,76 @@
1
+ type: component
2
+
3
+ meta:
4
+ desc: Componente para pesquisa utilizando Fuse.js.
5
+
6
+ props:
7
+ empty-list-height:
8
+ desc: Define altura do box quando a lista está vazia.
9
+ default: 100px
10
+ type: String
11
+
12
+ fuse-options:
13
+ desc: Opções do Fuse.js (https://fusejs.io/api/options.html).
14
+ default: "{ distance: 100, location: 0, maxPatternLength: 32, minMatchCharLength: 1, shouldSort: true, threshold: 0.1, tokenize: true }"
15
+ debugger: true
16
+ type: Object
17
+ examples: ["{ keys: ['label'] }"]
18
+
19
+ height:
20
+ desc: Define altura do box quando a lista não está vazia.
21
+ default: 300px
22
+ type: String
23
+
24
+ list:
25
+ desc: Lista onde ocorrerá a busca (array de objetos).
26
+ default: []
27
+ type: String
28
+
29
+ model-value:
30
+ desc: Model do campo de pesquisa.
31
+ type: String
32
+ examples: [v-model="search"]
33
+ model: true
34
+
35
+ placeholder:
36
+ desc: Placeholder do campo de pesquisa.
37
+ default: Pesquisar
38
+ type: String
39
+
40
+ use-empty-slot:
41
+ desc: Controla o slot "empty-result".
42
+ default: true
43
+ type: Boolean
44
+
45
+ results:
46
+ desc: Model que retorna o resultado filtrado.
47
+ default: []
48
+ type: Array
49
+ examples: [v-model:results="results"]
50
+ model: true
51
+
52
+ slots:
53
+ default:
54
+ desc: Acesso ao conteúdo principal, só existe caso a busca retorne algum resultado.
55
+
56
+ empty-result:
57
+ desc: Acesso ao conteúdo quando a busca não retorne resultado e a prop "useEmptySlot" seja "true".
58
+
59
+ events:
60
+ '@empty-result -> function ()':
61
+ desc: Dispara toda vez que a pesquisa não retorna resultado.
62
+
63
+ '@update:model-value -> function (value)':
64
+ desc: Dispara toda vez que o campo de busca é alterado, também utilizado para v-model
65
+ params:
66
+ value:
67
+ desc: Novo valor do v-model
68
+ type: String
69
+
70
+ '@update:results -> function (value)':
71
+ desc: Dispara toda vez que o campo de busca é alterado e acontece um novo filtro, também utilizado para v-model:results
72
+ params:
73
+ value:
74
+ desc: Novo valor do v-model:results
75
+ default: []
76
+ type: Array
@@ -1,11 +1,5 @@
1
1
  <template>
2
- <q-select v-model="model" v-bind="attributes" v-on="listeners" @filter="filterOptions">
3
- <slot v-for="(slot, key) in $slots" :slot="key" :name="key" />
4
-
5
- <template v-for="(slot, key) in $scopedSlots" :slot="key" slot-scope="scope">
6
- <slot :name="key" v-bind="scope" />
7
- </template>
8
-
2
+ <q-select v-model="model" v-bind="attributes" @filter="filterOptions">
9
3
  <template #append>
10
4
  <slot name="append">
11
5
  <q-icon v-if="searchable" name="o_search" />
@@ -21,10 +15,16 @@
21
15
  </q-item>
22
16
  </slot>
23
17
  </template>
18
+
19
+ <template v-for="(_, name) in $slots" #[name]="context">
20
+ <slot :name="name" v-bind="context || {}" />
21
+ </template>
24
22
  </q-select>
25
23
  </template>
26
24
 
27
25
  <script>
26
+ import Fuse from 'fuse.js'
27
+
28
28
  export default {
29
29
  name: 'QasSelect',
30
30
 
@@ -39,31 +39,33 @@ export default {
39
39
  type: String
40
40
  },
41
41
 
42
- options: {
43
- default: () => [],
44
- type: Array
45
- },
46
-
47
- value: {
42
+ modelValue: {
48
43
  default: () => [],
49
44
  type: [Array, Object, String, Number]
50
45
  },
51
46
 
52
- valueKey: {
53
- default: '',
54
- type: String
55
- },
56
-
57
47
  noOptionLabel: {
58
48
  default: 'Nenhum resultado foi encontrado.',
59
49
  type: String
60
50
  },
61
51
 
52
+ options: {
53
+ default: () => [],
54
+ type: Array
55
+ },
56
+
62
57
  searchable: {
63
58
  type: Boolean
59
+ },
60
+
61
+ valueKey: {
62
+ default: '',
63
+ type: String
64
64
  }
65
65
  },
66
66
 
67
+ emits: ['update:modelValue'],
68
+
67
69
  data () {
68
70
  return {
69
71
  filteredOptions: [],
@@ -72,20 +74,18 @@ export default {
72
74
  },
73
75
 
74
76
  computed: {
75
- model: {
76
- get () {
77
- return this.value
78
- },
79
-
80
- set (value) {
81
- this.$emit('input', value)
82
- }
83
- },
77
+ attributes () {
78
+ return {
79
+ clearable: this.searchable,
80
+ emitValue: true,
81
+ mapOptions: true,
82
+ outlined: true,
84
83
 
85
- listeners () {
86
- const { input, ...events } = this.$listeners
84
+ ...this.$attrs,
87
85
 
88
- return events
86
+ options: this.filteredOptions,
87
+ useInput: this.searchable
88
+ }
89
89
  },
90
90
 
91
91
  defaultFuseOptions () {
@@ -112,26 +112,20 @@ export default {
112
112
  return this.options.map(item => this.renameKey(item))
113
113
  },
114
114
 
115
- isMultiple () {
116
- return this.$attrs.multiple || this.$attrs.multiple === ''
117
- },
115
+ model: {
116
+ get () {
117
+ return this.modelValue
118
+ },
118
119
 
119
- attributes () {
120
- return {
121
- emitValue: true,
122
- mapOptions: true,
123
- outlined: true,
124
- clearable: this.searchable,
125
- ...this.$attrs,
126
- options: this.filteredOptions,
127
- useInput: this.searchable
120
+ set (value) {
121
+ this.$emit('update:modelValue', value)
128
122
  }
129
123
  }
130
124
  },
131
125
 
132
126
  watch: {
133
- defaultFuseOptions (value) {
134
- this.fuse.options = { ...this.fuse.options, ...value }
127
+ defaultFuseOptions () {
128
+ this.setFuse()
135
129
  },
136
130
 
137
131
  options: {
@@ -142,15 +136,13 @@ export default {
142
136
 
143
137
  this.filteredOptions = this.formattedResult
144
138
  },
139
+
145
140
  immediate: true
146
141
  }
147
142
  },
148
143
 
149
- async created () {
150
- if (this.searchable) {
151
- const Fuse = (await import('fuse.js')).default
152
- this.fuse = new Fuse(this.options, this.defaultFuseOptions)
153
- }
144
+ created () {
145
+ this.setFuse()
154
146
  },
155
147
 
156
148
  methods: {
@@ -168,7 +160,10 @@ export default {
168
160
  },
169
161
 
170
162
  renameKey (item) {
171
- const mapKeys = { label: this.labelKey, value: this.valueKey }
163
+ const mapKeys = {
164
+ label: this.labelKey,
165
+ value: this.valueKey
166
+ }
172
167
 
173
168
  for (const newKey in mapKeys) {
174
169
  if (!item.hasOwnProperty.call(newKey)) {
@@ -178,6 +173,12 @@ export default {
178
173
  }
179
174
 
180
175
  return item
176
+ },
177
+
178
+ setFuse () {
179
+ if (this.searchable) {
180
+ this.fuse = new Fuse(this.options, this.defaultFuseOptions)
181
+ }
181
182
  }
182
183
  }
183
184
  }
@@ -0,0 +1,62 @@
1
+ type: component
2
+
3
+ mixins:
4
+ - quasar/dist/api/QSelect.json
5
+
6
+ meta:
7
+ desc: Componente para select que implementa o "QSelect" repassando propriedades, slots e eventos.
8
+
9
+ props:
10
+ model-value:
11
+ desc: Model do componente.
12
+ default: []
13
+ type: [Array, Object, String, Number]
14
+ examples: [v-model="value"]
15
+ model: true
16
+
17
+ fuse-options:
18
+ desc: Opções do Fuse.js (https://fusejs.io/api/options.html).
19
+ type: Object
20
+ debugger: true
21
+ default:
22
+ distance: 100
23
+ includeScore: true
24
+ keys: [label, value]
25
+ location: 0
26
+ maxPatternLength: 32
27
+ minMatchCharLength: 1
28
+ shouldSort: true
29
+ threshold: 0.1
30
+ tokenize: true
31
+
32
+ label-key:
33
+ desc: O componente internamente espera receber na propriedade "options" um array de objeto contendo "label" e "value", caso o seu objeto não tenha "label" mas um "name" por exemplo, você pode definir esta prop "label-key" como "name".
34
+ type: String
35
+ examples: [label-key="name"]
36
+
37
+ no-option-label:
38
+ desc: Rótulo padrão de quando os options estão vazios.
39
+ default: Nenhum resultado foi encontrado.
40
+ type: String
41
+
42
+ options:
43
+ desc: Opções do select.
44
+ default: []
45
+ type: Array
46
+
47
+ searchable:
48
+ desc: Controla se vai ou não ter campo de busca no select.
49
+ type: Boolean
50
+
51
+ value-key:
52
+ desc: O componente internamente espera receber na propriedade "options" um array de objeto contendo "label" e "value", caso o seu objeto não tenha "value" mas um "uuid" por exemplo, você pode definir esta prop "label-value" como "uuid".
53
+ type: String
54
+ examples: [value-key="uuid"]
55
+
56
+ events:
57
+ '@update:model-value -> function (value)':
58
+ desc: Dispara toda vez que o model é atualizado, também utilizado para v-model.
59
+ params:
60
+ value:
61
+ desc: Novo valor do v-model
62
+ type: [Array, Object, String, Number]
@@ -1,9 +1,9 @@
1
1
  <template>
2
- <qas-search-box v-bind="$attrs" class="q-pa-md" :fuse-options="fuseOptions" :list="sortedOptions">
3
- <template #default="{ results }">
2
+ <qas-search-box v-model:results="results" class="q-pa-md" :fuse-options="fuseOptions" :list="sortedList">
3
+ <template #default>
4
4
  <q-list separator>
5
- <q-item v-for="(result, index) in results" :key="index">
6
- <slot name="item" v-bind="self">
5
+ <q-item v-for="result in results" :key="result.value">
6
+ <slot v-bind="slotData" :item="result" name="item">
7
7
  <slot name="item-section" :result="result">
8
8
  <q-item-section class="items-start text-bold">
9
9
  <div :class="labelClass" @click="redirectRoute(result)">{{ result.label }}</div>
@@ -11,8 +11,8 @@
11
11
  </slot>
12
12
 
13
13
  <q-item-section avatar>
14
- <slot name="item-action" v-bind="self">
15
- <qas-btn hide-mobile-label v-bind="setButtonProps(result)" size="sm" @click="handleClick(result)" />
14
+ <slot :item="result" name="item-action" v-bind="slotData">
15
+ <qas-btn v-bind="getButtonProps(result)" @click="handleClick(result)" />
16
16
  </slot>
17
17
  </q-item-section>
18
18
  </slot>
@@ -23,17 +23,22 @@
23
23
  </template>
24
24
 
25
25
  <script>
26
- import { sortBy } from 'lodash'
26
+ import { sortBy } from 'lodash-es'
27
+ import { screenMixin } from '../../mixins'
27
28
 
28
- import QasBtn from '../btn/QasBtn'
29
- import QasSearchBox from '../search-box/QasSearchBox'
29
+ import QasBtn from '../btn/QasBtn.vue'
30
+ import QasSearchBox from '../search-box/QasSearchBox.vue'
30
31
 
31
32
  export default {
33
+ name: 'QasSelectList',
34
+
32
35
  components: {
33
36
  QasBtn,
34
37
  QasSearchBox
35
38
  },
36
39
 
40
+ mixins: [screenMixin],
41
+
37
42
  props: {
38
43
  deleteOnly: {
39
44
  type: Boolean
@@ -44,40 +49,47 @@ export default {
44
49
  type: Object
45
50
  },
46
51
 
47
- options: {
52
+ list: {
48
53
  default: () => [],
49
54
  type: Array
50
55
  },
51
56
 
57
+ modelValue: {
58
+ type: Array,
59
+ default: () => []
60
+ },
61
+
52
62
  to: {
53
63
  default: () => ({}),
54
64
  type: Object
55
65
  },
56
66
 
57
- toIdentifier: {
58
- type: String,
59
- default: 'value'
67
+ redirectKey: {
68
+ default: 'uuid',
69
+ type: String
60
70
  },
61
71
 
62
- value: {
63
- type: Array,
64
- default: () => []
72
+ paramKey: {
73
+ default: 'id',
74
+ type: String
65
75
  }
66
76
  },
67
77
 
78
+ emits: [
79
+ 'added',
80
+ 'update:modelValue',
81
+ 'removed'
82
+ ],
83
+
68
84
  data () {
69
85
  return {
70
- sortedOptions: [],
71
- values: []
86
+ sortedList: [],
87
+ values: [],
88
+ results: []
72
89
  }
73
90
  },
74
91
 
75
92
  computed: {
76
- // TODO: parar de usar "mobile".
77
- isMobile () {
78
- return this.$q.screen.xs
79
- },
80
-
81
93
  isRedirectEnabled () {
82
94
  return Object.keys(this.to).length
83
95
  },
@@ -86,29 +98,34 @@ export default {
86
98
  return this.isRedirectEnabled ? 'cursor-pointer' : ''
87
99
  },
88
100
 
89
- self () {
90
- return this
101
+ slotData () {
102
+ return {
103
+ add: this.add,
104
+ handleClick: this.handleClick,
105
+ remove: this.remove,
106
+ updateModel: this.updateModel
107
+ }
91
108
  }
92
109
  },
93
110
 
94
111
  watch: {
95
- options: {
112
+ list: {
96
113
  handler (value) {
97
- if (!this.sortedOptions.length) {
98
- this.sortedOptions = value
114
+ if (!this.sortedList.length) {
115
+ this.sortedList = value
99
116
  }
100
117
  },
101
118
 
102
119
  immediate: true
103
120
  },
104
121
 
105
- value (value) {
122
+ modelValue (value) {
106
123
  this.values = [...value]
107
124
  }
108
125
  },
109
126
 
110
127
  created () {
111
- this.values = [...this.value]
128
+ this.values = [...this.modelValue]
112
129
 
113
130
  this.handleOptions()
114
131
  },
@@ -121,18 +138,31 @@ export default {
121
138
  this.$emit('added', item)
122
139
  },
123
140
 
141
+ getButtonProps ({ value }) {
142
+ const isSelected = this.values.includes(value)
143
+
144
+ return {
145
+ dense: this.mx_isSmall,
146
+ hideLabelOnSmallScreen: true,
147
+ icon: !this.mx_isSmall ? undefined : isSelected ? 'o_close' : 'o_add',
148
+ label: isSelected ? 'Remover' : 'Adicionar',
149
+ outline: isSelected,
150
+ size: 'sm'
151
+ }
152
+ },
153
+
124
154
  handleClick (item) {
125
155
  return this.values.includes(item.value) ? this.remove(item) : this.add(item)
126
156
  },
127
157
 
128
158
  handleOptions () {
129
- if (this.value.length) {
130
- return this.sortOptions()
159
+ if (this.modelValue.length) {
160
+ return this.sortList()
131
161
  }
132
162
 
133
- const unwatch = this.$watch('value', value => {
134
- if (!this.sortedOptions.length) {
135
- this.sortOptions()
163
+ const unwatch = this.$watch('modelValue', () => {
164
+ if (!this.sortedList.length) {
165
+ this.sortList()
136
166
  unwatch()
137
167
  }
138
168
  })
@@ -140,7 +170,7 @@ export default {
140
170
 
141
171
  redirectRoute (item) {
142
172
  return this.isRedirectEnabled && this.$router.push({
143
- params: { id: item[this.toIdentifier] },
173
+ params: { [this.paramKey]: item[this.redirectKey] },
144
174
  ...this.to
145
175
  })
146
176
  },
@@ -154,25 +184,14 @@ export default {
154
184
  this.$emit('removed', item, index)
155
185
  },
156
186
 
157
- setButtonProps ({ value }) {
158
- const isSelected = this.values.includes(value)
159
-
160
- return {
161
- dense: this.isMobile,
162
- icon: !this.isMobile ? undefined : isSelected ? 'o_close' : 'o_add',
163
- label: isSelected ? 'Remover' : 'Adicionar',
164
- outline: isSelected
165
- }
166
- },
167
-
168
- sortOptions () {
169
- this.sortedOptions = this.deleteOnly
170
- ? this.options.filter(option => this.value.includes(option.value))
171
- : sortBy(this.options, option => !this.value.includes(option.value))
187
+ sortList () {
188
+ this.sortedList = this.deleteOnly
189
+ ? this.list.filter(option => this.modelValue.includes(option.value))
190
+ : sortBy(this.list, option => !this.modelValue.includes(option.value))
172
191
  },
173
192
 
174
- updateModel () {
175
- this.$emit('input', this.values)
193
+ updateModel (model) {
194
+ this.$emit('update:modelValue', model || this.values)
176
195
  }
177
196
  }
178
197
  }