@mythpe/quasar-ui-qui 0.0.23-dev → 0.0.24-dev

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 (56) hide show
  1. package/index.d.ts +4 -0
  2. package/package.json +8 -5
  3. package/src/components/form/MAvatarViewer.vue +324 -0
  4. package/src/components/form/MBtn.vue +258 -91
  5. package/src/components/form/MCheckbox.vue +123 -0
  6. package/src/components/form/MColor.vue +122 -0
  7. package/src/components/form/MDate.vue +47 -0
  8. package/src/components/form/MEditor.vue +285 -0
  9. package/src/components/form/MEmail.vue +40 -0
  10. package/src/components/form/MField.vue +142 -0
  11. package/src/components/form/MFile.vue +209 -0
  12. package/src/components/form/MForm.vue +83 -0
  13. package/src/components/form/MHidden.vue +83 -0
  14. package/src/components/form/MHiddenInput.vue +55 -0
  15. package/src/components/form/MInput.vue +62 -65
  16. package/src/components/form/MInputFieldControl.vue +4 -1
  17. package/src/components/form/MInputLabel.vue +6 -2
  18. package/src/components/form/MMobile.vue +37 -0
  19. package/src/components/form/MPicker.vue +310 -0
  20. package/src/components/form/MRadio.vue +175 -0
  21. package/src/components/form/MSelect.vue +343 -0
  22. package/src/components/form/MTime.vue +45 -0
  23. package/src/components/form/index.ts +38 -1
  24. package/src/components/grid/MBlock.vue +31 -17
  25. package/src/components/grid/MCol.vue +2 -14
  26. package/src/components/grid/MContainer.vue +21 -12
  27. package/src/components/grid/MHelpRow.vue +4 -9
  28. package/src/components/grid/MRow.vue +22 -9
  29. package/src/components/index.ts +1 -0
  30. package/src/components/transition/MFadeTransition.vue +27 -0
  31. package/src/components/transition/MFadeXTransition.vue +26 -0
  32. package/src/components/transition/MTransition.vue +41 -0
  33. package/src/components/transition/index.ts +13 -0
  34. package/src/components/typography/index.ts +1 -0
  35. package/src/composable/index.ts +3 -1
  36. package/src/composable/{useHelpersMyth.ts → useBindInput.ts} +92 -62
  37. package/src/composable/useError.ts +11 -0
  38. package/src/composable/useMyth.ts +280 -3
  39. package/src/composable/useValue.ts +12 -0
  40. package/src/index.sass +7 -33
  41. package/src/style/m-container.sass +13 -0
  42. package/src/style/main.sass +42 -0
  43. package/src/types/api-helpers.d.ts +120 -0
  44. package/src/types/components.d.ts +550 -52
  45. package/src/types/dt.d.ts +142 -0
  46. package/src/types/index.d.ts +128 -47
  47. package/src/types/lodash.d.ts +26 -0
  48. package/src/types/quasar-helpers.d.ts +7 -0
  49. package/src/types/theme.d.ts +12 -0
  50. package/src/utils/Helpers.ts +321 -0
  51. package/src/utils/Str.ts +210 -0
  52. package/src/utils/index.ts +2 -0
  53. package/src/utils/myth.ts +75 -22
  54. package/src/utils/vee-rules.ts +2 -1
  55. package/src/utils/vue-plugin.ts +80 -3
  56. package/tsconfig.json +8 -11
@@ -0,0 +1,310 @@
1
+ <!--
2
+ - MyTh Ahmed Faiz Copyright © 2016-2024 All rights reserved.
3
+ - Email: mythpe@gmail.com
4
+ - Mobile: +966590470092
5
+ - Website: https://www.4myth.com
6
+ - Github: https://github.com/mythpe
7
+ -->
8
+
9
+ <script
10
+ lang="ts"
11
+ setup
12
+ >
13
+ import { computed, reactive, ref, toValue, useTemplateRef } from 'vue'
14
+ import type { MPickerProps as Props } from '../../types'
15
+ import { useBindInput, useMyth } from '../../composable'
16
+ import { useField } from 'vee-validate'
17
+ import { QDate, QField, QFieldSlots, QTime } from 'quasar'
18
+ import { myth } from '../../utils'
19
+
20
+ const defSeparator = ' - '
21
+ const props = withDefaults(defineProps<Omit<Props, 'prefix'>>(), {
22
+ name: '',
23
+ type: undefined,
24
+ fillMask: undefined,
25
+ reverseFillMask: undefined,
26
+ unmaskedValue: undefined,
27
+ error: undefined,
28
+ noErrorIcon: undefined,
29
+ reactiveRules: undefined,
30
+ lazyRules: undefined,
31
+ stackLabel: undefined,
32
+ hideHint: undefined,
33
+ dark: undefined,
34
+ loading: undefined,
35
+ clearable: undefined,
36
+ filled: undefined,
37
+ outlined: undefined,
38
+ borderless: undefined,
39
+ standout: undefined,
40
+ labelSlot: undefined,
41
+ bottomSlots: undefined,
42
+ hideBottomSpace: undefined,
43
+ counter: undefined,
44
+ rounded: undefined,
45
+ square: undefined,
46
+ dense: undefined,
47
+ itemAligned: undefined,
48
+ disable: undefined,
49
+ readonly: undefined,
50
+ autofocus: undefined,
51
+ autogrow: undefined,
52
+ viewMode: undefined,
53
+ auto: undefined,
54
+ col: undefined,
55
+ xs: undefined,
56
+ sm: undefined,
57
+ md: undefined,
58
+ lg: undefined,
59
+ xl: undefined,
60
+ required: undefined,
61
+ autocomplete: undefined,
62
+ topLabel: undefined,
63
+ mobile: undefined,
64
+ email: undefined,
65
+ float: undefined,
66
+ landscape: undefined,
67
+ flat: undefined,
68
+ bordered: undefined,
69
+ yearsInMonthView: undefined,
70
+ noUnset: undefined,
71
+ todayBtn: undefined,
72
+ minimal: undefined,
73
+ multiple: undefined,
74
+ range: undefined,
75
+ emitImmediately: undefined,
76
+ format24h: undefined,
77
+ withSeconds: undefined,
78
+ nowBtn: undefined,
79
+ useChoice: undefined
80
+ })
81
+
82
+ defineModel<Props['modelValue']>({ required: !1, default: undefined })
83
+ const helper = useBindInput<Props>(() => props, 'picker', () => ({ choose: !0 }))
84
+ const { hasTopLabel, getLabel, getPlaceholder, inputRules, getAutocompleteAttribute, getProp } = helper
85
+ const { __ } = useMyth()
86
+ const options = computed(() => myth.props.value)
87
+ const theme = computed(() => myth.themeInput)
88
+ const inputScope = useField<Props['modelValue']>(() => props.name, inputRules, {
89
+ syncVModel: !0,
90
+ label: getLabel,
91
+ ...toValue<any>(props.fieldOptions)
92
+ })
93
+ const scopes = reactive(inputScope)
94
+ const { value, errorMessage, handleChange } = inputScope
95
+
96
+ const isDate = computed(() => props.type !== 'time')
97
+ // const mask = computed(() => {
98
+ // if (props.range || props.multiple) {
99
+ // return undefined
100
+ // // return isDate.value ? '####/##/## - ####-##-##' : '##:## - ##:##'
101
+ // }
102
+ // return isDate.value ? '####/##/##' : '##:##'
103
+ // })
104
+ const format = computed(() => isDate.value ? 'YYYY/MM/DD' : 'HH:mm')
105
+ const dateRef = ref<string | null>(null)
106
+ const onBeforeShow = () => {
107
+ dateRef.value = value.value || null
108
+ }
109
+ const onBeforeHide = () => {
110
+ dateRef.value = null
111
+ }
112
+ const saveDialog = () => {
113
+ let newVal: any = dateRef.value
114
+ if (typeof newVal === 'object' && isDate.value) {
115
+ const values: any[] = Object.values(newVal)
116
+ for (const aKey in values) {
117
+ if (typeof values[aKey] === 'object') {
118
+ values[aKey] = Object.values(values[aKey])
119
+ }
120
+ }
121
+ newVal = values
122
+ }
123
+ handleChange(newVal, !!errorMessage.value)
124
+ }
125
+
126
+ const dateElm = useTemplateRef<InstanceType<typeof QDate>>('dateElm')
127
+ const timeElm = useTemplateRef<InstanceType<typeof QTime>>('timeElm')
128
+ defineExpose<{ input: typeof dateElm | typeof timeElm }>({ input: isDate.value ? dateElm : timeElm })
129
+ defineOptions({ name: 'MPicker', inheritAttrs: !1 })
130
+ </script>
131
+
132
+ <template>
133
+ <MCol
134
+ :auto="auto"
135
+ :class="[$attrs.class,{'m--input__required':inputRules?.required!==undefined,'m--input__error':!!errorMessage,'m--input__view':viewMode}]"
136
+ :col="col"
137
+ :lg="lg"
138
+ :md="md"
139
+ :name="name"
140
+ :sm="sm"
141
+ :xs="xs"
142
+ >
143
+ <slot
144
+ name="top-input"
145
+ v-bind="scopes"
146
+ />
147
+ <slot name="top-label">
148
+ <MInputLabel
149
+ v-if="hasTopLabel"
150
+ :field="scopes"
151
+ >
152
+ <MHelpRow
153
+ :text="help"
154
+ tooltip
155
+ />
156
+ </MInputLabel>
157
+ </slot>
158
+ <slot name="caption">
159
+ <div
160
+ v-if="!!caption"
161
+ class="m--input__caption"
162
+ >
163
+ {{ __(caption) }}
164
+ </div>
165
+ </slot>
166
+ <q-field
167
+ ref="input"
168
+ v-model="value"
169
+ :error="!!errorMessage"
170
+ :error-message="errorMessage"
171
+ :hint="__(hint)"
172
+ :label="hasTopLabel ? undefined : getLabel"
173
+ v-bind="{
174
+ ...options.input as any,
175
+ ...options.field as any,
176
+ ...theme,
177
+ ...$attrs,
178
+ autocomplete:getAutocompleteAttribute,
179
+ stackLabel: !0
180
+ }"
181
+ >
182
+ <template #control>
183
+ <slot name="control">
184
+ <div
185
+ v-if="!disable && !readonly && !viewMode && !!getPlaceholder && !value"
186
+ class="q-placeholder"
187
+ >
188
+ {{ getPlaceholder }}
189
+ </div>
190
+ <template v-else-if="viewMode && viewModeValue">
191
+ <div>{{ viewModeValue?.toString() }}</div>
192
+ </template>
193
+ <template v-else>
194
+ <div>
195
+ <template v-if="value && Array.isArray(value)">
196
+ {{ value.join(rangeSeparator || options.picker?.rangeSeparator || defSeparator) }}
197
+ </template>
198
+ <template v-else>
199
+ {{ value?.toString() }}
200
+ </template>
201
+ </div>
202
+ </template>
203
+ </slot>
204
+ </template>
205
+ <template #append>
206
+ <q-btn
207
+ v-if="!disable && !readonly && !viewMode"
208
+ :icon="isDate ? 'ion-ios-calendar' : 'ion-ios-clock'"
209
+ flat
210
+ round
211
+ v-bind="{...options?.pickerBtn, ...btnProps}"
212
+ >
213
+ <q-popup-proxy
214
+ cover
215
+ no-shake
216
+ persistent
217
+ transition-hide="jump-down"
218
+ transition-show="jump-up"
219
+ @before-show="onBeforeShow()"
220
+ @before-hide="onBeforeHide()"
221
+ >
222
+ <q-card>
223
+ <q-date
224
+ v-if="isDate"
225
+ ref="dateElm"
226
+ v-bind="{
227
+ ...options.date as any,
228
+ ...props,
229
+ ...$attrs,
230
+ todayBtn: getProp('todayBtn') === undefined ? !0 : getProp('todayBtn'),
231
+ mask:format,
232
+ multiple,
233
+ range,
234
+ modelValue: dateRef ?? null
235
+ }"
236
+ @update:model-value="dateRef = $event ?? null"
237
+ >
238
+ <template #default>
239
+ <div class="row items-center justify-end">
240
+ <MBtn
241
+ v-close-popup
242
+ :label="__('close')"
243
+ color="negative"
244
+ flat
245
+ />
246
+ <MBtn
247
+ v-close-popup
248
+ :label="__('save')"
249
+ flat
250
+ @click="saveDialog()"
251
+ />
252
+ </div>
253
+ </template>
254
+ </q-date>
255
+ <q-time
256
+ v-else
257
+ ref="timeElm"
258
+ v-bind="{
259
+ ...$props,
260
+ ...options.time,
261
+ ...$attrs,
262
+ mask:format,
263
+ nowBtn: getProp('nowBtn') === undefined? !0 : getProp('nowBtn'),
264
+ modelValue: dateRef ?? null
265
+ }"
266
+ @update:model-value="dateRef = $event ?? null"
267
+ >
268
+ <div class="row items-center justify-end">
269
+ <MBtn
270
+ v-close-popup
271
+ :label="__('close')"
272
+ color="negative"
273
+ flat
274
+ />
275
+ <MBtn
276
+ v-close-popup
277
+ :label="__('save')"
278
+ flat
279
+ @click="saveDialog()"
280
+ />
281
+ </div>
282
+ </q-time>
283
+ </q-card>
284
+ </q-popup-proxy>
285
+ </q-btn>
286
+ </template>
287
+
288
+ <template
289
+ v-for="(_,slot) in $slots as Readonly<QFieldSlots>"
290
+ :key="slot"
291
+ #[slot]
292
+ >
293
+ <slot :name="slot" />
294
+ </template>
295
+ </q-field>
296
+ <slot
297
+ name="help"
298
+ v-bind="scopes"
299
+ >
300
+ <MHelpRow
301
+ v-if="!hasTopLabel"
302
+ :text="help"
303
+ />
304
+ </slot>
305
+ <slot
306
+ name="bottom-input"
307
+ v-bind="scopes"
308
+ />
309
+ </MCol>
310
+ </template>
@@ -0,0 +1,175 @@
1
+ <!--
2
+ - MyTh Ahmed Faiz Copyright © 2016-2024 All rights reserved.
3
+ - Email: mythpe@gmail.com
4
+ - Mobile: +966590470092
5
+ - Website: https://www.4myth.com
6
+ - Github: https://github.com/mythpe
7
+ -->
8
+
9
+ <script lang="ts" setup>
10
+ import { useField } from 'vee-validate'
11
+ import { defineProps, reactive, ref, toValue } from 'vue'
12
+ import { useBindInput, useMyth } from '../../composable'
13
+ import type { MRadioProps as Props } from '../../types'
14
+ import { QField, QRadio } from 'quasar'
15
+ import { myth } from '../../utils'
16
+
17
+ type P = {
18
+ auto?: Props['auto'];
19
+ col?: Props['col'];
20
+ xs?: Props['xs'];
21
+ sm?: Props['sm'];
22
+ md?: Props['md'];
23
+ lg?: Props['lg'];
24
+ xl?: Props['xl'];
25
+ name: Props['name'];
26
+ label?: Props['label'];
27
+ caption?: Props['caption'];
28
+ hint?: Props['hint'];
29
+ help?: Props['help'];
30
+ val: Props['val'];
31
+ required?: Props['required'];
32
+ rules?: Props['rules'];
33
+ dense?: Props['dense'];
34
+ checkedIcon?: Props['checkedIcon'];
35
+ rowProps?: Props['rowProps'];
36
+ colProps?: Props['colProps'];
37
+ viewMode?: Props['viewMode'];
38
+ fieldOptions?: Props['fieldOptions'];
39
+ }
40
+
41
+ const props = withDefaults(defineProps<P>(), {
42
+ auto: undefined,
43
+ col: undefined,
44
+ xs: undefined,
45
+ sm: undefined,
46
+ md: undefined,
47
+ lg: undefined,
48
+ xl: undefined,
49
+ name: () => '',
50
+ label: undefined,
51
+ caption: undefined,
52
+ hint: undefined,
53
+ help: undefined,
54
+ val: undefined,
55
+ required: undefined,
56
+ rules: undefined,
57
+ dense: undefined,
58
+ checkedIcon: undefined,
59
+ rowProps: undefined,
60
+ colProps: undefined,
61
+ viewMode: () => !1,
62
+ fieldOptions: undefined
63
+ })
64
+ defineModel<Props['modelValue']>({ required: !1, default: undefined })
65
+ const helper = useBindInput<P>(() => props, 'radio')
66
+ const { getLabel, inputRules, attrs, getProp } = helper
67
+ const inputScope = useField<Props['modelValue']>(() => props.name, inputRules, {
68
+ syncVModel: !0,
69
+ label: getLabel,
70
+ type: 'radio',
71
+ checkedValue: () => props.val,
72
+ ...toValue<any>(props.fieldOptions)
73
+ })
74
+ const { value, errorMessage, handleChange } = inputScope
75
+ const { __ } = useMyth()
76
+ const { props: options } = myth
77
+ const listeners = {
78
+ 'update:modelValue': (v: Props['modelValue']) => handleChange(v, !!errorMessage.value)
79
+ }
80
+ const input = ref<InstanceType<typeof QRadio> | null>(null)
81
+ const scopes = reactive(inputScope)
82
+ defineExpose<typeof scopes & { input: typeof input }>({ input, ...scopes })
83
+ defineOptions({ name: 'MRadio', inheritAttrs: !1 })
84
+ </script>
85
+
86
+ <template>
87
+ <MCol
88
+ :auto="auto"
89
+ :class="[$attrs.class,{'m--input__required':inputRules?.required!==undefined,'m--input__error':!!errorMessage,'m--input__view':viewMode}]"
90
+ :col="col"
91
+ :lg="lg"
92
+ :md="md"
93
+ :name="name"
94
+ :sm="sm"
95
+ :xs="xs"
96
+ >
97
+ <slot
98
+ name="top-input"
99
+ v-bind="scopes"
100
+ />
101
+ <slot name="caption">
102
+ <div
103
+ v-if="!!caption"
104
+ class="m--input__caption text-caption"
105
+ >
106
+ {{ __(caption) }}
107
+ </div>
108
+ </slot>
109
+ <MRow v-bind="rowProps">
110
+ <slot
111
+ name="before"
112
+ v-bind="scopes"
113
+ />
114
+ <MCol v-bind="colProps">
115
+ <q-field
116
+ :error="!!errorMessage"
117
+ :error-message="errorMessage"
118
+ :hint="__(hint)"
119
+ v-bind="{
120
+ ...options.input as any,
121
+ ...options.field,
122
+ ...$attrs,
123
+ ...myth.themeInput,
124
+ borderless: !0,
125
+ outlined: !1,
126
+ stackLabel: !0
127
+ }"
128
+ >
129
+ <template #control>
130
+ <q-radio
131
+ ref="input"
132
+ :disable="viewMode"
133
+ :model-value="value"
134
+ :val="val"
135
+ v-bind="{
136
+ ...options.radio,
137
+ ...$attrs,
138
+ dense: attrs.dense,
139
+ checkedIcon: getProp('checkedIcon'),
140
+ label: undefined
141
+ }"
142
+ v-on="listeners"
143
+ >
144
+ <template #default>
145
+ <MRow class="items-center">
146
+ <div
147
+ v-if="!!getLabel"
148
+ class="text-color"
149
+ >
150
+ {{ getLabel }}
151
+ </div>
152
+ <MHelpRow
153
+ v-if="!!help"
154
+ :right="!!getLabel"
155
+ :text="help"
156
+ tooltip
157
+ />
158
+ </MRow>
159
+ </template>
160
+ </q-radio>
161
+ </template>
162
+ </q-field>
163
+ <slot v-bind="scopes" />
164
+ </MCol>
165
+ <slot
166
+ name="after"
167
+ v-bind="scopes"
168
+ />
169
+ </MRow>
170
+ <slot
171
+ name="bottom-input"
172
+ v-bind="scopes"
173
+ />
174
+ </MCol>
175
+ </template>