@bildvitta/quasar-ui-asteroid 2.12.4 → 3.0.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. package/dist/api/QasBox.json +16 -0
  2. package/dist/api/QasBreakline.json +32 -0
  3. package/dist/api/QasBtn.json +15 -0
  4. package/dist/api/QasDebugger.json +13 -0
  5. package/dist/asteroid.cjs.css +1 -0
  6. package/dist/asteroid.cjs.js +9154 -0
  7. package/dist/asteroid.cjs.min.js +6 -0
  8. package/dist/asteroid.esm.css +1 -0
  9. package/dist/asteroid.esm.js +9145 -0
  10. package/dist/asteroid.esm.min.js +6 -0
  11. package/dist/asteroid.umd.css +1 -0
  12. package/dist/asteroid.umd.js +9148 -0
  13. package/dist/asteroid.umd.min.js +6 -0
  14. package/dist/vetur/asteroid-attributes.json +30 -0
  15. package/dist/vetur/asteroid-tags.json +29 -0
  16. package/package.json +42 -56
  17. package/src/assets/logo-modular.svg +1 -0
  18. package/src/asteroid.js +1 -0
  19. package/src/components/actions/QasActions.vue +45 -0
  20. package/src/components/actions-menu/QasActionsMenu.vue +8 -19
  21. package/src/components/alert/QasAlert.vue +90 -0
  22. package/src/components/app-bar/QasAppBar.vue +59 -61
  23. package/src/components/app-menu/QasAppMenu.vue +128 -41
  24. package/src/components/avatar/QasAvatar.vue +7 -3
  25. package/src/components/box/QasBox.vue +12 -4
  26. package/src/components/box/QasBox.yml +13 -0
  27. package/src/components/breakline/QasBreakline.vue +37 -0
  28. package/src/components/breakline/QasBreakline.yml +25 -0
  29. package/src/components/btn/QasBtn.vue +27 -24
  30. package/src/components/btn/QasBtn.yml +12 -0
  31. package/src/components/card/QasCard.vue +29 -21
  32. package/src/components/checkbox-group/QasCheckboxGroup.vue +31 -17
  33. package/src/components/copy/QasCopy.vue +22 -11
  34. package/src/components/date-time-input/QasDateTimeInput.vue +16 -26
  35. package/src/components/debugger/QasDebugger.vue +2 -0
  36. package/src/components/debugger/QasDebugger.yml +10 -0
  37. package/src/components/delete/QasDelete.vue +28 -15
  38. package/src/components/dialog/QasDialog.vue +71 -67
  39. package/src/components/dialog-router/QasDialogRouter.vue +12 -4
  40. package/src/components/field/QasField.vue +22 -25
  41. package/src/components/filters/QasFilters.vue +31 -24
  42. package/src/components/form-generator/QasFormGenerator.vue +13 -15
  43. package/src/components/form-view/QasFormView.vue +117 -66
  44. package/src/components/gallery/QasGallery.vue +39 -26
  45. package/src/components/grid-generator/QasGridGenerator.vue +12 -6
  46. package/src/components/index.js +0 -0
  47. package/src/components/input/QasInput.vue +38 -36
  48. package/src/components/label/QasLabel.vue +14 -15
  49. package/src/components/layout/QasLayout.vue +81 -0
  50. package/src/components/list-items/QasListItems.vue +16 -8
  51. package/src/components/list-view/QasListView.vue +31 -28
  52. package/src/components/map/QasMap.vue +15 -25
  53. package/src/components/nested-fields/QasNestedFields.vue +39 -36
  54. package/src/components/numeric-input/QasNumericInput.vue +125 -0
  55. package/src/components/page-header/QasPageHeader.vue +19 -10
  56. package/src/components/password-input/QasPasswordInput.vue +20 -18
  57. package/src/components/password-strength-checker/QasPasswordStrengthChecker.vue +52 -31
  58. package/src/components/profile/QasProfile.vue +14 -12
  59. package/src/components/resizer/QasResizer.vue +1 -1
  60. package/src/components/search-box/QasSearchBox.vue +36 -20
  61. package/src/components/select/QasSelect.vue +43 -44
  62. package/src/components/select-list/QasSelectList.vue +64 -51
  63. package/src/components/signature-pad/QasSignaturePad.vue +57 -41
  64. package/src/components/signature-uploader/QasSignatureUploader.vue +15 -13
  65. package/src/components/single-view/QasSingleView.vue +31 -17
  66. package/src/components/sortable/QasSortable.vue +45 -27
  67. package/src/components/table-generator/QasTableGenerator.vue +95 -22
  68. package/src/components/tabs-generator/QasTabsGenerator.vue +36 -24
  69. package/src/components/text-truncate/QasTextTruncate.vue +25 -17
  70. package/src/components/transfer/QasTransfer.vue +57 -53
  71. package/src/components/uploader/QasUploader.vue +169 -48
  72. package/src/css/background.scss +1 -1
  73. package/src/css/border.scss +7 -6
  74. package/src/css/design-system.scss +0 -43
  75. package/src/css/fonts.scss +2 -28
  76. package/src/css/opacity.scss +0 -4
  77. package/src/css/set-brand.scss +15 -0
  78. package/src/css/transitions.scss +1 -1
  79. package/src/helpers/add-counter-suffix.js +3 -0
  80. package/src/helpers/{base64ToBlob.js → base-64-to-blob.js} +0 -0
  81. package/src/helpers/{constructObject.js → construct-object.js} +0 -0
  82. package/src/helpers/filter-object.js +8 -6
  83. package/src/helpers/filters.js +3 -4
  84. package/src/helpers/get-slot-children-text.js +15 -0
  85. package/src/helpers/{greatestCommonDivisor.js → greatest-common-divisor.js} +0 -0
  86. package/src/helpers/images.js +28 -0
  87. package/src/helpers/index.js +11 -57
  88. package/src/helpers/is-local-development.js +3 -0
  89. package/src/helpers/scroll-on-grap.js +61 -0
  90. package/src/index.cjs.js +1 -0
  91. package/src/index.esm.js +4 -0
  92. package/src/index.scss +18 -20
  93. package/src/index.umd.js +2 -0
  94. package/src/mixins/context.js +1 -1
  95. package/src/mixins/dialog-router.js +17 -0
  96. package/src/mixins/form.js +4 -12
  97. package/src/mixins/generator.js +14 -14
  98. package/src/mixins/index.js +2 -8
  99. package/src/mixins/password.js +73 -11
  100. package/src/mixins/screen.js +8 -6
  101. package/src/mixins/view.js +57 -20
  102. package/src/plugins/Dialog.js +14 -0
  103. package/src/plugins/NotifySuccess.js +3 -3
  104. package/src/plugins/index.js +4 -2
  105. package/src/store/history.js +43 -0
  106. package/src/store/index.js +1 -0
  107. package/src/vue-plugin.js +185 -0
  108. package/.babelrc +0 -12
  109. package/.storybook/main.js +0 -35
  110. package/.storybook/preview.js +0 -26
  111. package/debug.log +0 -1
  112. package/index.js +0 -4
  113. package/jest-setup.js +0 -1
  114. package/jest.config.json +0 -22
  115. package/postcss.config.js +0 -5
  116. package/src/components/Introduction.stories.mdx +0 -12
  117. package/src/components/actions-menu/QasActionsMenu.stories.js +0 -73
  118. package/src/components/app-bar/QasAppBar.stories.js +0 -88
  119. package/src/components/app-menu/QasAppMenu.stories.js +0 -62
  120. package/src/components/apps-menu/QasAppsMenu.spec.js +0 -58
  121. package/src/components/apps-menu/QasAppsMenu.stories.js +0 -54
  122. package/src/components/apps-menu/QasAppsMenu.vue +0 -48
  123. package/src/components/avatar/QasAvatar.spec.js +0 -14
  124. package/src/components/avatar/QasAvatar.stories.js +0 -52
  125. package/src/components/box/QasBox.spec.js +0 -18
  126. package/src/components/box/QasBox.stories.js +0 -35
  127. package/src/components/break-line/QasBreakLine.stories.js +0 -57
  128. package/src/components/break-line/QasBreakLine.vue +0 -52
  129. package/src/components/btn/QasBtn.stories.js +0 -45
  130. package/src/components/btn-actions/QasBtnActions.stories.js +0 -77
  131. package/src/components/btn-actions/QasBtnActions.vue +0 -54
  132. package/src/components/card/QasCard.stories.js +0 -126
  133. package/src/components/checkbox-group/QasCheckboxGroup.stories.js +0 -59
  134. package/src/components/copy/QasCopy.stories.js +0 -41
  135. package/src/components/date-time-input/QasDateTimeInput.stories.js +0 -67
  136. package/src/components/debugger/QasDebugger.stories.js +0 -33
  137. package/src/components/decimal-input/QasDecimalInput.stories.js +0 -82
  138. package/src/components/decimal-input/QasDecimalInput.vue +0 -92
  139. package/src/components/delete/QasDelete.stories.js +0 -80
  140. package/src/components/dialog/QasDialog.stories.js +0 -139
  141. package/src/components/dialog-router/QasDialogRouter.stories.js +0 -38
  142. package/src/components/field/QasField.stories.js +0 -181
  143. package/src/components/filters/QasFilters.stories.js +0 -121
  144. package/src/components/form-generator/QasFormGenerator.stories.js +0 -115
  145. package/src/components/form-view/QasFormView.stories.js +0 -236
  146. package/src/components/gallery/QasGallery.stories.js +0 -91
  147. package/src/components/grid-generator/QasGridGenerator.stories.js +0 -138
  148. package/src/components/input/QasInput.stories.js +0 -78
  149. package/src/components/label/QasLabel.stories.js +0 -60
  150. package/src/components/list-items/QasListItems.stories.js +0 -130
  151. package/src/components/list-view/QasListView.stories.js +0 -168
  152. package/src/components/map/QasMap.stories.js +0 -75
  153. package/src/components/nested-fields/QasNestedFields.stories.js +0 -255
  154. package/src/components/page-header/QasPageHeader.stories.js +0 -61
  155. package/src/components/password-input/QasPasswordInput.stories.js +0 -76
  156. package/src/components/password-strength-checker/QasPasswordStrengthChecker.stories.js +0 -54
  157. package/src/components/profile/QasProfile.stories.js +0 -131
  158. package/src/components/resizer/QasResizer.stories.js +0 -43
  159. package/src/components/search-box/QasSearchBox.stories.js +0 -111
  160. package/src/components/select/QasSelect.stories.js +0 -113
  161. package/src/components/select-list/QasSelectList.stories.js +0 -153
  162. package/src/components/signature-pad/QasSignaturePad.stories.js +0 -51
  163. package/src/components/signature-uploader/QasSignatureUploader.stories.js +0 -69
  164. package/src/components/single-view/QasSingleView.stories.js +0 -130
  165. package/src/components/sortable/QasSortable.stories.js +0 -80
  166. package/src/components/table-generator/QasTableGenerator.stories.js +0 -116
  167. package/src/components/tabs-generator/QasTabsGenerator.stories.js +0 -145
  168. package/src/components/text-truncate/QasTextTruncate.stories.js +0 -55
  169. package/src/components/tip/QasTip.stories.js +0 -57
  170. package/src/components/tip/QasTip.vue +0 -68
  171. package/src/components/tooltip/QasTooltip.stories.js +0 -63
  172. package/src/components/tooltip/QasTooltip.vue +0 -81
  173. package/src/components/transfer/QasTransfer.stories.js +0 -118
  174. package/src/components/uploader/QasCustomUploader.vue +0 -121
  175. package/src/components/uploader/QasUploader.stories.js +0 -139
  176. package/src/directives/Test.js +0 -13
  177. package/src/helpers/historyHandler.js +0 -52
  178. package/src/helpers/label.js +0 -3
  179. package/src/index.js +0 -245
  180. package/src/mixins/map-markers.js +0 -26
  181. package/src/mixins/unsaved-changes.js +0 -24
  182. package/src/mixins/uploader.js +0 -30
  183. package/src/mocks/json/user.json +0 -27
  184. package/src/mocks/json/users-new.json +0 -23
  185. package/src/mocks/json/users.json +0 -97
  186. package/src/mocks/storeModule.js +0 -71
  187. package/src/pages/Forbidden.vue +0 -6
  188. package/src/pages/NotFound.vue +0 -6
@@ -1,9 +1,12 @@
1
1
  <template>
2
- <q-dialog ref="dialog" v-model="model" v-bind="$attrs" :persistent="persistent" v-on="$listeners">
2
+ <q-dialog ref="dialog" :persistent="persistent" v-bind="dialogProps" @hide="onDialogHide" @update:model-value="updateModelValue">
3
3
  <q-card v-bind="cardProps" class="q-pa-sm" :style="style">
4
4
  <q-card-section>
5
5
  <slot name="header">
6
- <div class="text-bold text-h6">{{ card.title }}</div>
6
+ <div class="justify-between row">
7
+ <div class="text-bold text-h6">{{ card.title }}</div>
8
+ <qas-btn v-if="useCloseIcon" v-close-popup dense flat icon="o_close" rounded />
9
+ </div>
7
10
  </slot>
8
11
  </q-card-section>
9
12
 
@@ -17,14 +20,15 @@
17
20
 
18
21
  <q-card-section>
19
22
  <slot name="actions">
20
- <qas-btn-actions v-bind="btnActions">
23
+ <qas-actions v-bind="btnActionsProps">
21
24
  <template #primary>
22
- <qas-btn v-if="ok" v-close-popup="!useForm" class="full-width" v-bind="defaultOk.props" v-on="defaultOk.events" @click="submitHandler" />
25
+ <qas-btn v-if="ok" v-close-popup="!useForm" class="full-width" v-bind="defaultOk" @click="submitHandler" />
23
26
  </template>
27
+
24
28
  <template #secondary>
25
- <qas-btn v-if="cancel" v-close-popup class="full-width" v-bind="defaultCancel.props" v-on="defaultCancel.events" />
29
+ <qas-btn v-if="cancel" v-close-popup class="full-width" v-bind="defaultCancel" />
26
30
  </template>
27
- </qas-btn-actions>
31
+ </qas-actions>
28
32
  </slot>
29
33
  </q-card-section>
30
34
  </q-card>
@@ -33,23 +37,29 @@
33
37
 
34
38
  <script>
35
39
  import QasBtn from '../btn/QasBtn.vue'
36
- import QasBtnActions from '../btn-actions/QasBtnActions.vue'
40
+ import QasActions from '../actions/QasActions.vue'
41
+
42
+ import screenMixin from '../../mixins/screen'
37
43
 
38
44
  export default {
45
+ name: 'QasDialog',
46
+
39
47
  components: {
40
48
  QasBtn,
41
- QasBtnActions
49
+ QasActions
42
50
  },
43
51
 
52
+ mixins: [screenMixin],
53
+
44
54
  props: {
45
- btnActions: {
55
+ btnActionsProps: {
46
56
  default: () => ({}),
47
57
  type: Object
48
58
  },
49
59
 
50
60
  cancel: {
51
61
  default: () => ({}),
52
- type: [Boolean, Object]
62
+ type: [Object, Boolean]
53
63
  },
54
64
 
55
65
  card: {
@@ -74,7 +84,7 @@ export default {
74
84
 
75
85
  ok: {
76
86
  default: () => ({}),
77
- type: [Boolean, Object]
87
+ type: [Object, Boolean]
78
88
  },
79
89
 
80
90
  persistent: {
@@ -86,91 +96,85 @@ export default {
86
96
  type: Boolean
87
97
  },
88
98
 
89
- value: {
99
+ modelValue: {
90
100
  type: Boolean
91
- }
92
- },
101
+ },
93
102
 
94
- data () {
95
- return {
96
- dialogMethods: {
97
- focus: null,
98
- hide: null,
99
- shake: null,
100
- show: null,
101
- toggle: null
102
- }
103
+ usePlugin: {
104
+ type: Boolean
105
+ },
106
+
107
+ useCloseIcon: {
108
+ type: Boolean
103
109
  }
104
110
  },
105
111
 
112
+ emits: [
113
+ 'update:modelValue',
114
+ 'validate',
115
+ 'ok',
116
+ 'hide',
117
+ 'update:open'
118
+ ],
119
+
106
120
  computed: {
107
121
  defaultCancel () {
108
122
  return {
109
- events: this.cancel?.events,
110
-
111
- props: {
112
- label: 'Cancelar',
113
- outline: true,
114
- ...this.cancel?.props
115
- }
123
+ label: 'Cancelar',
124
+ outline: true,
125
+ ...this.cancel?.props
116
126
  }
117
127
  },
118
128
 
119
- defaultDialogMethods () {
120
- return this.dialogMethods
121
- },
122
-
123
129
  defaultOk () {
124
130
  return {
125
- events: this.ok?.events,
126
-
127
- props: {
128
- label: 'Ok',
129
- type: this.ok?.props.type || this.useForm ? 'submit' : 'button',
130
- ...this.ok?.props
131
- }
132
- }
133
- },
134
-
135
- isSmallScreen () {
136
- return this.$q.screen.xs
137
- },
138
-
139
- model: {
140
- get () {
141
- return this.value
142
- },
143
-
144
- set (value) {
145
- return this.$emit('input', value)
131
+ label: 'Ok',
132
+ type: this.ok?.props?.type || this.useForm ? 'submit' : 'button',
133
+ ...this.ok?.props
146
134
  }
147
135
  },
148
136
 
149
137
  style () {
150
138
  return {
151
- maxWidth: this.maxWidth || (this.isSmallScreen ? '' : '600px'),
152
- minWidth: this.minWidth || (this.isSmallScreen ? '' : '400px')
139
+ maxWidth: this.maxWidth || (this.mx_isSmall ? '' : '600px'),
140
+ minWidth: this.minWidth || (this.mx_isSmall ? '' : '400px')
153
141
  }
154
142
  },
155
143
 
156
144
  componentTag () {
157
145
  return this.useForm ? 'q-form' : 'div'
158
- }
159
- },
146
+ },
160
147
 
161
- mounted () {
162
- this.setDialogMethods()
148
+ dialogProps () {
149
+ return {
150
+ ...(!this.usePlugin && { modelValue: this.modelValue }),
151
+ ...this.$attrs
152
+ }
153
+ }
163
154
  },
164
155
 
165
156
  methods: {
166
- setDialogMethods () {
167
- for (const key in this.dialogMethods) {
168
- this.dialogMethods[key] = this.$refs.dialog[key]
169
- }
170
- },
171
-
172
157
  async submitHandler () {
173
158
  this.useForm && this.$emit('validate', await this.$refs.form.validate())
159
+ },
160
+
161
+ // metodo para funcionar como plugin
162
+ show () {
163
+ this.$refs.dialog.show()
164
+ },
165
+
166
+ // metodo para funcionar como plugin
167
+ hide () {
168
+ this.$refs.dialog.hide()
169
+ },
170
+
171
+ // metodo para funcionar como plugin
172
+ onDialogHide () {
173
+ this.$emit('hide')
174
+ },
175
+
176
+ updateModelValue (value) {
177
+ this.$emit('update:modelValue', value)
174
178
  }
175
179
  }
176
180
  }
@@ -9,10 +9,15 @@
9
9
  </template>
10
10
 
11
11
  <script>
12
- import { Loading } from 'quasar'
12
+ import { markRaw } from 'vue'
13
+ import { Loading, extend } from 'quasar'
13
14
  import { NotifyError } from '../../plugins'
14
15
 
15
16
  export default {
17
+ name: 'QasDialogRouter',
18
+
19
+ emits: ['error', 'hide'],
20
+
16
21
  data () {
17
22
  return {
18
23
  component: null,
@@ -39,7 +44,7 @@ export default {
39
44
  },
40
45
 
41
46
  resolveRoute (path) {
42
- return this.$router.resolve(path).route
47
+ return this.$router.resolve(path)
43
48
  },
44
49
 
45
50
  async show (route) {
@@ -52,9 +57,12 @@ export default {
52
57
 
53
58
  try {
54
59
  Loading.show()
55
- const component = [...this.route.matched].pop().components.default
56
60
 
57
- if (typeof component !== 'function') {
61
+ const component = markRaw(
62
+ extend(true, {}, [...this.route.matched].pop().components.default)
63
+ )
64
+
65
+ if (typeof component.value !== 'function') {
58
66
  this.component = component
59
67
  this.$refs.dialog.show()
60
68
  } else {
@@ -1,9 +1,8 @@
1
1
  <template>
2
2
  <div>
3
- <component :is="component.is" v-bind="component" :data-cy="field.name" :value="formattedValue" v-on="events" @input="emitValue">
4
- <slot v-for="(slot, key) in $slots" :slot="key" :name="key" />
5
- <template v-for="(slot, key) in $scopedSlots" :slot="key" slot-scope="scope">
6
- <slot :name="key" v-bind="scope" />
3
+ <component :is="component.is" v-bind="component" :data-cy="field.name" :model-value="formattedValue" @update:model-value="updateModel">
4
+ <template v-for="(_, name) in $slots" #[name]="context">
5
+ <slot :name="name" v-bind="context || {}" />
7
6
  </template>
8
7
  </component>
9
8
  </div>
@@ -12,8 +11,8 @@
12
11
  <script>
13
12
  import QasCheckboxGroup from '../checkbox-group/QasCheckboxGroup.vue'
14
13
  import QasDateTimeInput from '../date-time-input/QasDateTimeInput.vue'
15
- import QasDecimalInput from '../decimal-input/QasDecimalInput.vue'
16
14
  import QasInput from '../input/QasInput.vue'
15
+ import QasNumericInput from '../numeric-input/QasNumericInput.vue'
17
16
  import QasPasswordInput from '../password-input/QasPasswordInput.vue'
18
17
  import QasUploader from '../uploader/QasUploader.vue'
19
18
  import QasSignatureUploader from '../signature-uploader/QasSignatureUploader.vue'
@@ -30,8 +29,8 @@ export default {
30
29
  components: {
31
30
  QasCheckboxGroup,
32
31
  QasDateTimeInput,
33
- QasDecimalInput,
34
32
  QasInput,
33
+ QasNumericInput,
35
34
  QasPasswordInput,
36
35
  QasUploader,
37
36
  QasSignatureUploader
@@ -47,9 +46,16 @@ export default {
47
46
  default: () => ({}),
48
47
  required: true,
49
48
  type: Object
49
+ },
50
+
51
+ modelValue: {
52
+ default: undefined,
53
+ type: [Object, Array, String, Number, Boolean]
50
54
  }
51
55
  },
52
56
 
57
+ emits: ['update:modelValue'],
58
+
53
59
  computed: {
54
60
  component () {
55
61
  const {
@@ -96,8 +102,8 @@ export default {
96
102
  gmt
97
103
  }
98
104
 
105
+ const numericInput = { is: 'qas-numeric-input', ...input }
99
106
  const datetimeInput = { is: 'qas-date-time-input', gmt, ...input }
100
- const decimalInput = { is: 'qas-decimal-input', comma: true, fillMask: '0', reverseFillMask: true, ...input }
101
107
 
102
108
  // It'll generate a list of acceptable files extensions.
103
109
  const accept = extensions && extensions.length ? extensions.map(extension => `.${extension}`).join(',') : ''
@@ -121,9 +127,9 @@ export default {
121
127
  email: { is: 'q-input', type, ...input },
122
128
  password: { is: 'qas-password-input', type, pattern, hideStrengthChecker: !pattern, ...input },
123
129
 
124
- decimal: { ...decimalInput },
125
- money: { ...decimalInput, prefix: 'R$' },
126
- percent: { ...decimalInput, suffix: '%' },
130
+ decimal: { ...numericInput, mode: 'decimal' },
131
+ money: { ...numericInput, mode: 'money' },
132
+ percent: { ...numericInput, mode: 'percent' },
127
133
 
128
134
  date: { ...datetimeInput, dateOnly: true },
129
135
  datetime: { ...datetimeInput },
@@ -148,11 +154,6 @@ export default {
148
154
  return Array.isArray(this.error) ? this.error.join(' ') : this.error
149
155
  },
150
156
 
151
- events () {
152
- const { input, ...events } = this.$listeners
153
- return events
154
- },
155
-
156
157
  // This computed will change the key name when the server sends different key.
157
158
  formatedField () {
158
159
  const field = {}
@@ -165,17 +166,15 @@ export default {
165
166
  },
166
167
 
167
168
  formattedValue () {
168
- const { value } = this.$attrs
169
-
170
169
  if (!this.isBoolean) {
171
- return value
170
+ return this.modelValue
172
171
  }
173
172
 
174
173
  if (this.isEmptyValue) {
175
- return !!value
174
+ return !!this.modelValue
176
175
  }
177
176
 
178
- return JSON.parse(value)
177
+ return JSON.parse(this.modelValue)
179
178
  },
180
179
 
181
180
  hasError () {
@@ -187,13 +186,11 @@ export default {
187
186
  },
188
187
 
189
188
  isEmptyValue () {
190
- const { value } = this.$attrs
191
-
192
189
  if (!this.isBoolean) {
193
190
  return false
194
191
  }
195
192
 
196
- return !this.value && (value === undefined || typeof value === 'string')
193
+ return !this.modelValue && (this.modelValue === undefined || typeof this.modelValue === 'string')
197
194
  },
198
195
 
199
196
  isNumberType () {
@@ -202,8 +199,8 @@ export default {
202
199
  },
203
200
 
204
201
  methods: {
205
- emitValue (value) {
206
- this.$emit('input', this.isNumberType ? Number(value) : value)
202
+ updateModel (value) {
203
+ this.$emit('update:modelValue', this.isNumberType ? Number(value) : value)
207
204
  }
208
205
  }
209
206
  }
@@ -3,7 +3,7 @@
3
3
  <div v-if="showFilters" class="q-gutter-x-md row">
4
4
  <div v-if="showSearch" class="col">
5
5
  <slot :filter="filter" name="search">
6
- <q-form v-if="!noSearch" @submit.prevent="filter()">
6
+ <q-form v-if="useSearch" @submit.prevent="filter()">
7
7
  <q-input v-model="search" :debounce="debounce" dense :placeholder="searchPlaceholder" type="search">
8
8
  <template #append>
9
9
  <q-btn v-if="hasSearch" icon="o_clear" unelevated @click="clearSearch" />
@@ -15,7 +15,7 @@
15
15
  </div>
16
16
 
17
17
  <slot v-if="showFilterButton" :filter="filter" name="filter-button">
18
- <q-btn v-if="!noFilterButton" :color="filterButtonColor" flat icon="o_filter_list" :label="filterButtonLabel">
18
+ <q-btn v-if="useFilterButton" :color="filterButtonColor" flat icon="o_filter_list" :label="filterButtonLabel">
19
19
  <q-menu @before-show="fetchFilters">
20
20
  <div v-if="isFetching" class="q-pa-xl text-center">
21
21
  <q-spinner color="grey" size="2em" />
@@ -40,29 +40,32 @@
40
40
  </slot>
41
41
  </div>
42
42
 
43
- <div v-if="badges && hasActiveFilters" class="q-mt-md">
43
+ <div v-if="useBadges && hasActiveFilters" class="q-mt-md">
44
44
  <q-chip v-for="(filterItem, key) in activeFilters" :key="key" color="grey-4" dense removable size="md" text-color="grey-8" @remove="removeFilter(filterItem)">{{ filterItem.label }} = "{{ getChipValue(filterItem.value) }}"</q-chip>
45
45
  </div>
46
46
 
47
- <slot :context="context" :filter="filter" :filters="activeFilters" :removeFilter="removeFilter" />
47
+ <slot :context="mx_context" :filter="filter" :filters="activeFilters" :remove-filter="removeFilter" />
48
48
  </section>
49
49
  </template>
50
50
 
51
51
  <script>
52
- import QasField from '../field/QasField'
52
+ import QasField from '../field/QasField.vue'
53
53
 
54
54
  import { camelize, camelizeKeys } from 'humps'
55
- import { humanize, parseValue } from '../../helpers/filters'
56
- import contextMixin from '../../mixins/context'
55
+ import { humanize, parseValue } from '../../helpers/filters.js'
56
+ import contextMixin from '../../mixins/context.js'
57
57
 
58
58
  export default {
59
+ name: 'QasFilters',
60
+
59
61
  components: {
60
62
  QasField
61
63
  },
62
64
 
63
65
  mixins: [contextMixin],
66
+
64
67
  props: {
65
- badges: {
68
+ useBadges: {
66
69
  default: true,
67
70
  type: Boolean
68
71
  },
@@ -72,13 +75,13 @@ export default {
72
75
  type: String
73
76
  },
74
77
 
75
- noFilterButton: {
76
- default: false,
78
+ useFilterButton: {
79
+ default: true,
77
80
  type: Boolean
78
81
  },
79
82
 
80
- noSearch: {
81
- default: false,
83
+ useSearch: {
84
+ default: true,
82
85
  type: Boolean
83
86
  },
84
87
 
@@ -98,6 +101,8 @@ export default {
98
101
  }
99
102
  },
100
103
 
104
+ emits: ['fetch-success', 'fetch-error'],
105
+
101
106
  data () {
102
107
  return {
103
108
  filters: {},
@@ -116,7 +121,7 @@ export default {
116
121
  const activeFilters = {}
117
122
 
118
123
  const fields = Object.keys(this.fields)
119
- const filters = camelizeKeys(this.context.filters)
124
+ const filters = camelizeKeys(this.mx_context.filters)
120
125
 
121
126
  for (const key in filters) {
122
127
  const hasField = fields.includes(key)
@@ -161,22 +166,24 @@ export default {
161
166
  },
162
167
 
163
168
  showFilterButton () {
164
- return !!this.$scopedSlots.filterButton || !this.noFilterButton
169
+ return !!this.$slots.filterButton || this.useFilterButton
165
170
  },
166
171
 
167
172
  showFilters () {
168
- return this.showFilterButton || this.showSearch
173
+ return this.useFilterButton || this.showSearch
169
174
  },
170
175
 
171
176
  showSearch () {
172
- return !!this.$scopedSlots.search || !this.noSearch
177
+ return !!this.$slots.search || this.useSearch
173
178
  }
174
179
  },
175
180
 
176
181
  watch: {
177
- $route () {
178
- this.fetchFilters()
179
- this.updateValues()
182
+ $route (to, from) {
183
+ if (to.name === from.name) {
184
+ this.fetchFilters()
185
+ this.updateValues()
186
+ }
180
187
  },
181
188
 
182
189
  search () {
@@ -193,7 +200,7 @@ export default {
193
200
 
194
201
  methods: {
195
202
  clearFilters () {
196
- const { filters, ...query } = this.context
203
+ const { filters, ...query } = this.mx_context
197
204
 
198
205
  if (this.hasFields) {
199
206
  const fields = Object.keys(this.fields)
@@ -220,7 +227,7 @@ export default {
220
227
  },
221
228
 
222
229
  async fetchFilters () {
223
- if (this.hasFields || this.noFilterButton) {
230
+ if (this.hasFields || !this.useFilterButton) {
224
231
  return null
225
232
  }
226
233
 
@@ -239,7 +246,7 @@ export default {
239
246
  },
240
247
 
241
248
  filter (external) {
242
- const { filters, page, ...context } = this.context
249
+ const { filters, page, ...context } = this.mx_context
243
250
 
244
251
  const query = {
245
252
  ...filters,
@@ -266,11 +273,11 @@ export default {
266
273
  },
267
274
 
268
275
  updateValues () {
269
- const { filters, search } = this.context
276
+ const { filters, search } = this.mx_context
270
277
  this.search = search || ''
271
278
 
272
279
  for (const key in filters) {
273
- this.$set(this.filters, key, parseValue(this.normalizeValues(filters[key], this.fields[key]?.multiple)))
280
+ this.filters[key] = parseValue(this.normalizeValues(filters[key], this.fields[key]?.multiple))
274
281
  }
275
282
  },
276
283
 
@@ -1,16 +1,16 @@
1
1
  <template>
2
2
  <div>
3
- <div :class="classes">
4
- <div v-for="(field, key) in groupedFields.visible" :key="key" :class="getFieldClass(key)">
3
+ <div :class="mx_classes">
4
+ <div v-for="(field, key) in groupedFields.visible" :key="key" :class="mx_getFieldClass(key)">
5
5
  <slot :field="field" :name="`field-${field.name}`">
6
- <qas-field v-bind="fieldsProps[field.name]" :error="errors[key]" :field="field" :value="value[field.name]" v-on="fieldsEvents[field.name]" @input="emitValue(field.name, $event)" />
6
+ <qas-field v-bind="fieldsProps[field.name]" :error="errors[key]" :field="field" :model-value="modelValue[field.name]" @update:model-value="updateModelValue(field.name, $event)" />
7
7
  </slot>
8
8
  </div>
9
9
  </div>
10
10
 
11
11
  <div v-for="(field, key) in groupedFields.hidden" :key="key">
12
12
  <slot :field="field" :name="`field-${field.name}`">
13
- <qas-field v-bind="fieldsProps[field.name]" :field="field" :value="value[field.name]" v-on="fieldsEvents[field.name]" @input="emitValue(field.name, $event)" />
13
+ <qas-field v-bind="fieldsProps[field.name]" :field="field" :model-value="modelValue[field.name]" @update:model-value="updateModelValue(field.name, $event)" />
14
14
  </slot>
15
15
  </div>
16
16
  </div>
@@ -18,10 +18,11 @@
18
18
 
19
19
  <script>
20
20
  import generatorMixin from '../../mixins/generator'
21
-
22
- import QasField from '../field/QasField'
21
+ import QasField from '../field/QasField.vue'
23
22
 
24
23
  export default {
24
+ name: 'QasFormGenerator',
25
+
25
26
  components: {
26
27
  QasField
27
28
  },
@@ -34,11 +35,6 @@ export default {
34
35
  type: Object
35
36
  },
36
37
 
37
- fieldsEvents: {
38
- default: () => ({}),
39
- type: Object
40
- },
41
-
42
38
  fieldsProps: {
43
39
  default: () => ({}),
44
40
  type: Object
@@ -49,13 +45,15 @@ export default {
49
45
  type: Array
50
46
  },
51
47
 
52
- value: {
48
+ modelValue: {
53
49
  default: () => ({}),
54
50
  required: true,
55
51
  type: Object
56
52
  }
57
53
  },
58
54
 
55
+ emits: ['update:modelValue'],
56
+
59
57
  computed: {
60
58
  groupedFields () {
61
59
  const fields = { hidden: {}, visible: {} }
@@ -80,11 +78,11 @@ export default {
80
78
  },
81
79
 
82
80
  methods: {
83
- emitValue (key, value) {
84
- const models = { ...this.value }
81
+ updateModelValue (key, value) {
82
+ const models = { ...this.modelValue }
85
83
  models[key] = value
86
84
 
87
- this.$emit('input', models)
85
+ this.$emit('update:modelValue', models)
88
86
  }
89
87
  }
90
88
  }