@mythpe/quasar-ui-qui 0.0.26 → 0.0.27-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 (92) hide show
  1. package/index.d.ts +13 -0
  2. package/package.json +15 -8
  3. package/src/boot/register.ts +14 -0
  4. package/src/components/datatable/MDatatable.vue +2305 -0
  5. package/src/components/datatable/MDtAvatar.vue +49 -0
  6. package/src/components/datatable/MDtBtn.vue +153 -0
  7. package/src/components/datatable/MDtContextmenuItems.vue +54 -0
  8. package/src/components/datatable/index.ts +6 -0
  9. package/src/components/form/MAvatarViewer.vue +327 -0
  10. package/src/components/form/MAxios.vue +144 -0
  11. package/src/components/form/MBtn.vue +271 -93
  12. package/src/components/form/MCheckbox.vue +150 -0
  13. package/src/components/form/MColor.vue +122 -0
  14. package/src/components/form/MDate.vue +50 -0
  15. package/src/components/form/MEditor.vue +285 -0
  16. package/src/components/form/MEmail.vue +43 -0
  17. package/src/components/form/MField.vue +148 -0
  18. package/src/components/form/MFile.vue +215 -0
  19. package/src/components/form/MForm.vue +89 -0
  20. package/src/components/form/MHidden.vue +86 -0
  21. package/src/components/form/MHiddenInput.vue +58 -0
  22. package/src/components/form/MInput.vue +178 -0
  23. package/src/components/form/MInputFieldControl.vue +27 -0
  24. package/src/components/form/MInputLabel.vue +38 -0
  25. package/src/components/form/MMobile.vue +43 -0
  26. package/src/components/form/MOptions.vue +255 -0
  27. package/src/components/form/MOtp.vue +292 -0
  28. package/src/components/form/MPassword.vue +73 -0
  29. package/src/components/form/MPicker.vue +313 -0
  30. package/src/components/form/MRadio.vue +181 -0
  31. package/src/components/form/MSelect.vue +352 -0
  32. package/src/components/form/MTime.vue +48 -0
  33. package/src/components/form/MToggle.vue +211 -0
  34. package/src/components/form/MUploader.vue +511 -0
  35. package/src/components/form/index.ts +63 -0
  36. package/src/components/grid/MBlock.vue +39 -18
  37. package/src/components/grid/MCol.vue +11 -15
  38. package/src/components/grid/MColumn.vue +12 -1
  39. package/src/components/grid/MContainer.vue +22 -13
  40. package/src/components/grid/MHelpRow.vue +13 -12
  41. package/src/components/grid/MRow.vue +31 -10
  42. package/src/components/grid/index.ts +16 -0
  43. package/src/components/index.ts +15 -0
  44. package/src/components/modal/MDialog.vue +58 -0
  45. package/src/components/modal/MModalMenu.vue +62 -0
  46. package/src/components/modal/MTooltip.vue +39 -0
  47. package/src/components/modal/index.ts +5 -0
  48. package/src/components/parials/UploaderItem.vue +298 -0
  49. package/src/components/parials/index.ts +3 -0
  50. package/src/components/transition/MFadeTransition.vue +27 -0
  51. package/src/components/transition/MFadeXTransition.vue +26 -0
  52. package/src/components/transition/MTransition.vue +44 -0
  53. package/src/components/transition/index.ts +13 -0
  54. package/src/components/typography/MTypingString.vue +8 -0
  55. package/src/components/typography/index.ts +11 -0
  56. package/src/composable/index.ts +12 -0
  57. package/src/composable/useBindInput.ts +209 -0
  58. package/src/composable/useError.ts +11 -0
  59. package/src/composable/useMyth.ts +311 -0
  60. package/src/composable/useValue.ts +12 -0
  61. package/src/index.common.js +19 -1
  62. package/src/index.esm.js +18 -3
  63. package/src/index.js +19 -0
  64. package/src/index.sass +9 -26
  65. package/src/index.ts +18 -4
  66. package/src/index.umd.js +17 -2
  67. package/src/style/m-container.sass +13 -0
  68. package/src/style/main.sass +146 -0
  69. package/src/style/print.sass +14 -0
  70. package/src/style/transition.sass +40 -0
  71. package/src/types/api-helpers.d.ts +62 -0
  72. package/src/types/components.d.ts +1075 -27
  73. package/src/types/index.d.ts +21 -1
  74. package/src/types/install-options.d.ts +19 -0
  75. package/src/types/lodash.d.ts +26 -0
  76. package/src/types/m-datatable.d.ts +316 -0
  77. package/src/types/m-geolocation.d.ts +16 -0
  78. package/src/types/m-helpers.d.ts +97 -0
  79. package/src/types/plugin-props-option.d.ts +301 -0
  80. package/src/types/quasar-helpers.d.ts +7 -0
  81. package/src/types/theme.d.ts +12 -0
  82. package/src/utils/Helpers.ts +293 -0
  83. package/src/utils/Str.ts +211 -0
  84. package/src/utils/index.ts +13 -0
  85. package/src/utils/myth.ts +109 -0
  86. package/src/utils/vee-rules.ts +32 -0
  87. package/src/utils/vue-plugin.ts +161 -0
  88. package/tsconfig.json +9 -13
  89. package/src/myth.ts +0 -30
  90. package/src/types/myth.ts +0 -42
  91. package/src/vue-plugin.ts +0 -41
  92. package/types.d.ts +0 -1
@@ -0,0 +1,511 @@
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
+ <script
9
+ lang="ts"
10
+ setup
11
+ >
12
+ import { QList, type QRejectedEntry, QUploader, type QUploaderFactoryObject } from 'quasar'
13
+ import { computed, nextTick, reactive, useTemplateRef, watch } from 'vue'
14
+ import { useBindInput, useError, useMyth, useValue } from '../../composable'
15
+ import type { MUploaderMediaItem, MUploaderProps as Props, MUploaderXhrInfo } from '../../types'
16
+ import { useFieldArray, useFieldValue, useFormValues, useResetForm } from 'vee-validate'
17
+
18
+ interface P {
19
+ name?: Props['name'];
20
+ auto?: Props['auto'];
21
+ col?: Props['col'];
22
+ xs?: Props['xs'];
23
+ sm?: Props['sm'];
24
+ md?: Props['md'];
25
+ lg?: Props['lg'];
26
+ xl?: Props['xl'];
27
+ disable?: Props['disable'];
28
+ readonly?: Props['readonly'];
29
+ accept?: Props['accept'];
30
+ images?: Props['images'];
31
+ svg?: Props['svg'];
32
+ video?: Props['video'];
33
+ pdf?: Props['pdf'];
34
+ excel?: Props['excel'];
35
+ autoUpload?: Props['autoUpload'];
36
+ fieldName?: Props['fieldName'];
37
+ collection?: Props['collection'];
38
+ attachmentType?: Props['attachmentType'];
39
+ returnType?: Props['returnType'];
40
+ formFields?: Props['formFields'];
41
+ headers?: Props['headers'];
42
+ label?: Props['label'];
43
+ hideDeleteMedia?: Props['hideDeleteMedia'];
44
+ hideUploadBtn?: Props['hideUploadBtn'];
45
+ updateBtn?: Props['updateBtn'];
46
+ service: Props['service'];
47
+ modelId?: Props['modelId'];
48
+ batch?: Props['batch'];
49
+ defaultFileIcon?: Props['defaultFileIcon'];
50
+ deleteMediaIcon?: Props['deleteMediaIcon'];
51
+ uploadFilesIcon?: Props['uploadFilesIcon'];
52
+ pickFilesIcon?: Props['pickFilesIcon'];
53
+ removeUploadedIcon?: Props['removeUploadedIcon'];
54
+ removeQueuedIcon?: Props['removeQueuedIcon'];
55
+ abortUploadIcon?: Props['abortUploadIcon'];
56
+ downloadFileIcon?: Props['downloadFileIcon'];
57
+ errorsIcon?: Props['errorsIcon'];
58
+ iconsSize?: Props['iconsSize'];
59
+ displayMode?: Props['displayMode'];
60
+ shadow?: Props['shadow'];
61
+ fieldOptions?: Props['fieldOptions'];
62
+ mediaLabel?: Props['mediaLabel'];
63
+ }
64
+
65
+ const props = withDefaults(defineProps<P>(), {
66
+ name: () => 'attachments',
67
+ auto: undefined,
68
+ col: undefined,
69
+ xs: undefined,
70
+ sm: undefined,
71
+ md: undefined,
72
+ lg: undefined,
73
+ xl: undefined,
74
+ readonly: undefined,
75
+ disable: undefined,
76
+ accept: undefined,
77
+ images: () => !1,
78
+ svg: () => !1,
79
+ video: () => !1,
80
+ pdf: () => !1,
81
+ excel: () => !1,
82
+ autoUpload: () => !0,
83
+ fieldName: 'attachment',
84
+ collection: undefined,
85
+ attachmentType: undefined,
86
+ returnType: undefined,
87
+ formFields: undefined,
88
+ headers: undefined,
89
+ label: undefined,
90
+ hideDeleteMedia: undefined,
91
+ hideUploadBtn: undefined,
92
+ updateBtn: () => !1,
93
+ service: undefined,
94
+ modelId: undefined,
95
+ defaultFileIcon: () => 'o_file_present',
96
+ deleteMediaIcon: () => 'ion-ios-trash',
97
+ uploadFilesIcon: () => 'o_cloud_upload',
98
+ pickFilesIcon: () => 'o_upload_file',
99
+ removeUploadedIcon: () => 'o_done_all',
100
+ removeQueuedIcon: () => 'o_clear_all',
101
+ abortUploadIcon: () => 'o_clear',
102
+ downloadFileIcon: () => 'o_download',
103
+ errorsIcon: () => 'o_error_outline',
104
+ batch: () => !1,
105
+ iconsSize: () => '30px',
106
+ displayMode: () => 'card',
107
+ shadow: () => 'shadow-5',
108
+ fieldOptions: undefined,
109
+ mediaLabel: () => 'name'
110
+ })
111
+
112
+ type Emits = {
113
+ (e: 'startUpload', event: {
114
+ files: readonly File[];
115
+ url: string;
116
+ method: string;
117
+ headers: { name: string; value: string; }[];
118
+ formFields: { name: string; value: string; }[];
119
+ }): void;
120
+
121
+ (e: 'failed', error: MUploaderXhrInfo): void;
122
+
123
+ (e: 'rejected', files: QRejectedEntry[]): void;
124
+
125
+ (e: 'uploaded', error: MUploaderXhrInfo): void;
126
+
127
+ (e: 'delete-media', media: MUploaderMediaItem, result: boolean): void;
128
+
129
+ (e: 'remove-file', file: File): void;
130
+ }
131
+ const emit = defineEmits<Emits>()
132
+
133
+ type Form = Record<string, any>;
134
+ const $myth = useMyth()
135
+ const { alertError, alertSuccess, __ } = $myth
136
+ const { mOptions, api, mAxios, baseUrl } = reactive($myth)
137
+ const fieldId = useFieldValue<string | undefined>('id')
138
+ const modelIdProp = computed(() => props.modelId !== undefined ? props.modelId : fieldId.value)
139
+ const modelValue = defineModel<Props['modelValue']>({ required: !1, default: undefined })
140
+ const { field } = useValue<Props['modelValue']>(() => props.name)
141
+ watch(field, v => (modelValue.value = v), { deep: !0 })
142
+ const { error, setErrors } = useError(() => props.name)
143
+ const resetForm = useResetForm<Form>()
144
+ const formValues = useFormValues<Form>()
145
+ const { fields: attachments } = useFieldArray<MUploaderMediaItem | File>(() => props.name)
146
+
147
+ // const setFormValues = useSetFormValues()
148
+ // const setFormTouched = useSetFormTouched()
149
+ // const error = useFieldError(() => props.name)
150
+ // const setErrors = useSetFieldError(() => props.name)
151
+ // const setFormValues = useSetFormValues()
152
+ // const setTouched = useSetFieldTouched(() => props.name)
153
+ // const modelValue = computed<Props['modelValue']>({
154
+ // get: () => value.value || [],
155
+ // set: (v) => {
156
+ // setFormValues({ [props.name]: v }, !1)
157
+ // model.value = v
158
+ // setTouched(!1)
159
+ // }
160
+ // })
161
+ // const { value: modelValue, error, setErrors, resetField } = useField<Props['modelValue']>(() => props.name, undefined, {
162
+ // syncVModel: !0,
163
+ // label: () => __(props.label),
164
+ // validateOnValueUpdate: !1,
165
+ // ...toValue<any>(props.fieldOptions)
166
+ // })
167
+ const setModelValue = async (value: Props['modelValue']) => {
168
+ const name = props.name
169
+ resetForm({ values: { ...formValues.value, [name]: value }, errors: { [name]: undefined }, touched: { [name]: !1 } })
170
+ }
171
+ const uploader = useTemplateRef<InstanceType<typeof QUploader>>('uploader')
172
+ const uploading = defineModel<boolean>('uploading', { required: !1, default: () => !1 })
173
+ const { accepts } = useBindInput<any>(() => props, 'uploader')
174
+ const iconsSizeProp = computed(() => mOptions.uploaderOptions?.iconsSize || props.iconsSize)
175
+
176
+ /* Events Callback */
177
+ const startUpload = async (files: readonly File[]): Promise<QUploaderFactoryObject> => {
178
+ return new Promise((resolve, reject) => {
179
+ if (!modelIdProp.value) {
180
+ reject()
181
+ return
182
+ }
183
+ try {
184
+ const common = mAxios?.defaults?.headers.common || {}
185
+ const headers: { name: string; value: string; }[] = []
186
+ setErrors([])
187
+ for (const i in common) {
188
+ if (common[i]) {
189
+ headers.push({
190
+ name: i,
191
+ value: common[i] as string
192
+ })
193
+ }
194
+ }
195
+ if (props.headers) {
196
+ for (const f in props.headers) {
197
+ if (props.headers[f]) {
198
+ headers.push({
199
+ name: f,
200
+ value: props.headers[f]
201
+ })
202
+ }
203
+ }
204
+ }
205
+ const formFields: { name: string; value: string; }[] = []
206
+ if (props.formFields) {
207
+ for (const f in props.formFields) {
208
+ if (props.formFields[f]) {
209
+ formFields.push({
210
+ name: f,
211
+ value: props.formFields[f]
212
+ })
213
+ }
214
+ }
215
+ }
216
+ if (props.collection) {
217
+ formFields.push({ name: 'collection', value: props.collection as string })
218
+ }
219
+ if (props.attachmentType) {
220
+ formFields.push({ name: 'attachment_type', value: props.attachmentType })
221
+ }
222
+ if (props.returnType) {
223
+ formFields.push({ name: 'return', value: props.returnType })
224
+ }
225
+ const url: string = typeof props.service === 'string'
226
+ ? api?.[props.service]?.getUploadAttachmentsUrl(modelIdProp.value)
227
+ : props.service.getUploadAttachmentsUrl(modelIdProp.value)
228
+ const resolveValue = {
229
+ url: `${baseUrl}/${url}`,
230
+ method: 'POST',
231
+ headers,
232
+ formFields
233
+ }
234
+ emit('startUpload', {
235
+ files,
236
+ url: `${baseUrl}/${url}`,
237
+ method: 'POST',
238
+ headers,
239
+ formFields
240
+ })
241
+ resolve(resolveValue)
242
+ } catch (e) {
243
+ reject(e)
244
+ console.error(e)
245
+ }
246
+ })
247
+ }
248
+ const onReject = (rejectedEntries: QRejectedEntry[]) => {
249
+ alertError(__('myth.errors.uploaderRejectedEntries', { c: rejectedEntries.length }))
250
+ emit('rejected', rejectedEntries)
251
+ }
252
+ const onError = (info: MUploaderXhrInfo) => {
253
+ const { xhr } = info
254
+ try {
255
+ if (xhr.responseText) {
256
+ const response = JSON.parse(xhr.responseText)
257
+ response?.message && alertError(response.message)
258
+ if (response.errors) {
259
+ const name = typeof props.fieldName === 'function' ? props.fieldName({} as File) : props.fieldName
260
+ if (response.errors[name]) {
261
+ setErrors(response.errors[name])
262
+ } else {
263
+ setErrors(Object.values(response.errors) || [])
264
+ }
265
+ }
266
+ }
267
+ } catch (e: any) {
268
+ e?.message && alertError(e.message)
269
+ } finally {
270
+ emit('failed', info)
271
+ }
272
+ }
273
+ const onFinishUpload = ({ files, xhr }: MUploaderXhrInfo) => {
274
+ try {
275
+ if (xhr.responseText) {
276
+ const response = JSON.parse(xhr.responseText)
277
+ if (response?.data?.length !== undefined) {
278
+ setModelValue(response.data ?? [])
279
+ files.forEach(f => uploader.value?.removeFile(f))
280
+ }
281
+ if (response?.message) {
282
+ alertSuccess(response.message)
283
+ }
284
+ }
285
+ } catch (e: any) {
286
+ e?.message && alertError(e.message)
287
+ } finally {
288
+ nextTick(() => emit('uploaded', { files, xhr }))
289
+ }
290
+ }
291
+
292
+ const onDeleteUploaderFile = (file: File) => {
293
+ uploader.value?.removeFile(file)
294
+ emit('remove-file', file)
295
+ }
296
+ const onDeleteMedia = (media: MUploaderMediaItem, result: boolean) => emit('delete-media', media, result)
297
+ watch(() => uploader.value?.isUploading, (v) => {
298
+ uploading.value = Boolean(v)
299
+ })
300
+ defineOptions({
301
+ name: 'MUploader',
302
+ inheritAttrs: !1
303
+ })
304
+ </script>
305
+
306
+ <template>
307
+ <MCol
308
+ v-if="!!modelIdProp"
309
+ :auto="auto"
310
+ :class="$attrs.class"
311
+ :col="col"
312
+ :lg="lg"
313
+ :md="md"
314
+ :name="name"
315
+ :sm="sm"
316
+ :xs="xs"
317
+ >
318
+ <MFadeTransition>
319
+ <div
320
+ v-if="!!error"
321
+ class="row items-center q-pa-sm bg-negative text-white q-mb-xs rounded-borders"
322
+ >
323
+ <q-icon
324
+ :name="errorsIcon"
325
+ left
326
+ />
327
+ {{ error }}
328
+ </div>
329
+ </MFadeTransition>
330
+ <q-uploader
331
+ ref="uploader"
332
+ :accept="accepts.join(',')"
333
+ :auto-upload="autoUpload"
334
+ :batch="batch"
335
+ :disable="disable"
336
+ :factory="startUpload"
337
+ :field-name="fieldName"
338
+ :label="__(label)"
339
+ :readonly="readonly"
340
+ style="width: 100%;max-height: 450px;"
341
+ v-bind="{...mOptions.uploader as any,...$attrs}"
342
+ @failed="onError"
343
+ @rejected="onReject"
344
+ @uploaded="onFinishUpload"
345
+ >
346
+ <template #header="scope">
347
+ <MRow class="row no-wrap items-center q-pa-sm q-gutter-xs">
348
+ <q-spinner
349
+ v-if="scope.isUploading"
350
+ class="q-uploader__spinner"
351
+ />
352
+ <div class="col">
353
+ <div class="q-uploader__title">
354
+ {{ __(label) }}
355
+ </div>
356
+ <div class="q-uploader__subtitle">
357
+ {{ scope.uploadSizeLabel }} / {{ scope.uploadProgressLabel }}
358
+ </div>
359
+ </div>
360
+ <q-btn
361
+ v-if="scope.queuedFiles.length > 0"
362
+ :icon="removeQueuedIcon"
363
+ :label="__('myth.uploader.clearAll')"
364
+ dense
365
+ flat
366
+ @click="scope.removeQueuedFiles"
367
+ />
368
+ <q-btn
369
+ v-if="scope.uploadedFiles.length > 0"
370
+ :icon="removeUploadedIcon"
371
+ :label="__('myth.uploader.removeUploadedFiles')"
372
+ dense
373
+ flat
374
+ @click="scope.removeUploadedFiles"
375
+ />
376
+ <q-btn
377
+ v-if="scope.canAddFiles && !hideUploadBtn"
378
+ :icon="pickFilesIcon"
379
+ :label="__('myth.uploader.pickFiles')"
380
+ dense
381
+ flat
382
+ @click="scope.pickFiles"
383
+ >
384
+ <q-uploader-add-trigger />
385
+ </q-btn>
386
+ <q-btn
387
+ v-if="scope.canUpload && !hideUploadBtn"
388
+ :icon="uploadFilesIcon"
389
+ :label="__('myth.uploader.uploadFiles')"
390
+ dense
391
+ flat
392
+ @click="scope.upload"
393
+ />
394
+ <q-btn
395
+ v-if="scope.isUploading"
396
+ :icon="abortUploadIcon"
397
+ :label="__('myth.uploader.abortUpload')"
398
+ dense
399
+ flat
400
+ @click="scope.abort"
401
+ />
402
+ </MRow>
403
+ <slot
404
+ name="header"
405
+ v-bind="scope as QUploader"
406
+ />
407
+ </template>
408
+
409
+ <template #list="scope">
410
+ <div
411
+ v-if="!scope.files.length && !attachments?.length"
412
+ key="m--uploader-no-data"
413
+ class="absolute-full"
414
+ >
415
+ <div class="full-width full-height overflow-hidden">
416
+ <MRow class="full-height justify-center items-center">
417
+ <MCol
418
+ auto
419
+ class="text-h6 text-center"
420
+ >
421
+ <q-icon
422
+ left
423
+ name="error_outline"
424
+ />
425
+ <span v-text="__('myth.select.noData')" />
426
+ </MCol>
427
+ </MRow>
428
+ </div>
429
+ </div>
430
+ <template v-else-if="!!$slots.list">
431
+ <slot
432
+ :items="attachments"
433
+ name="list"
434
+ v-bind="scope"
435
+ />
436
+ </template>
437
+ <MRow
438
+ v-else-if="!!$slots['item-list']"
439
+ class="q-col-gutter-sm"
440
+ >
441
+ <template
442
+ v-for="(file,i) in [...scope.files,...(attachments || [])]"
443
+ :key="`item-${i}`"
444
+ >
445
+ <slot
446
+ :index="i"
447
+ :item="file as MUploaderMediaItem"
448
+ name="item-list"
449
+ />
450
+ </template>
451
+ </MRow>
452
+ <q-list
453
+ v-else
454
+ :class="{'row': displayMode === 'card','q-gutter-sm': displayMode === 'card'}"
455
+ :separator="displayMode === 'list' ? !0 : undefined"
456
+ >
457
+ <template
458
+ v-for="(file,i) in scope.files"
459
+ :key="`fi-${i}`"
460
+ >
461
+ <UploaderItem
462
+ :collection="collection"
463
+ :default-file-icon="defaultFileIcon"
464
+ :delete-media-icon="deleteMediaIcon"
465
+ :display-mode="displayMode"
466
+ :download-file-icon="downloadFileIcon"
467
+ :hide-delete-media="hideDeleteMedia"
468
+ :icons-size="iconsSizeProp"
469
+ :media-label="mediaLabel"
470
+ :model-id="modelIdProp"
471
+ :model-value="file"
472
+ :name="name"
473
+ :return-type="returnType"
474
+ :scope="scope"
475
+ :service="service"
476
+ @remove-file="onDeleteUploaderFile"
477
+ @delete-media="onDeleteMedia"
478
+ />
479
+ </template>
480
+ <template v-if="attachments">
481
+ <template
482
+ v-for="f in attachments"
483
+ :key="f.key"
484
+ >
485
+ <UploaderItem
486
+ :collection="collection"
487
+ :default-file-icon="defaultFileIcon"
488
+ :delete-media-icon="deleteMediaIcon"
489
+ :display-mode="displayMode"
490
+ :download-file-icon="downloadFileIcon"
491
+ :hide-delete-media="hideDeleteMedia"
492
+ :icons-size="iconsSizeProp"
493
+ :media-label="mediaLabel"
494
+ :model-id="modelIdProp"
495
+ :model-value="f.value"
496
+ :name="name"
497
+ :return-type="returnType"
498
+ :scope="scope"
499
+ :service="service"
500
+ :update-btn="updateBtn"
501
+ @values="setModelValue"
502
+ @remove-file="onDeleteUploaderFile"
503
+ @delete-media="onDeleteMedia"
504
+ />
505
+ </template>
506
+ </template>
507
+ </q-list>
508
+ </template>
509
+ </q-uploader>
510
+ </MCol>
511
+ </template>
@@ -0,0 +1,63 @@
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
+ import MAxios from './MAxios.vue'
10
+ import MAvatarViewer from './MAvatarViewer.vue'
11
+ import MBtn from './MBtn.vue'
12
+ import MCheckbox from './MCheckbox.vue'
13
+ import MColor from './MColor.vue'
14
+ import MDate from './MDate.vue'
15
+ import MEditor from './MEditor.vue'
16
+ import MEmail from './MEmail.vue'
17
+ import MField from './MField.vue'
18
+ import MFile from './MFile.vue'
19
+ import MForm from './MForm.vue'
20
+ import MHidden from './MHidden.vue'
21
+ import MHiddenInput from './MHiddenInput.vue'
22
+ import MInput from './MInput.vue'
23
+ import MInputFieldControl from './MInputFieldControl.vue'
24
+ import MInputLabel from './MInputLabel.vue'
25
+ import MMobile from './MMobile.vue'
26
+ import MOptions from './MOptions.vue'
27
+ import MOtp from './MOtp.vue'
28
+ import MPassword from './MPassword.vue'
29
+ import MPicker from './MPicker.vue'
30
+ import MRadio from './MRadio.vue'
31
+ import MSelect from './MSelect.vue'
32
+ import MTime from './MTime.vue'
33
+ import MToggle from './MToggle.vue'
34
+ import MUploader from './MUploader.vue'
35
+
36
+ export {
37
+ MAxios,
38
+ MAvatarViewer,
39
+ MBtn,
40
+ MCheckbox,
41
+ MColor,
42
+ MDate,
43
+ MEditor,
44
+ MField,
45
+ MFile,
46
+ MForm,
47
+ MHidden,
48
+ MHiddenInput,
49
+ MEmail,
50
+ MInput,
51
+ MInputFieldControl,
52
+ MInputLabel,
53
+ MMobile,
54
+ MOptions,
55
+ MOtp,
56
+ MPassword,
57
+ MPicker,
58
+ MRadio,
59
+ MSelect,
60
+ MTime,
61
+ MToggle,
62
+ MUploader
63
+ }
@@ -1,22 +1,43 @@
1
- <script lang="ts" setup>
2
- import type { MBlockProps } from '../../types'
3
- import { computed } from 'vue'
4
- import MythOptions from '../../myth'
5
- import { extend } from 'quasar'
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
+ -->
6
8
 
7
- interface Props {
8
- size?: MBlockProps['size'];
9
- rounded?: MBlockProps['rounded'];
10
- shadow?: MBlockProps['shadow'];
11
- }
9
+ <script
10
+ lang="ts"
11
+ setup
12
+ >
13
+ import type { MBlockProps as Props } from '../../types'
14
+ import { computed } from 'vue'
15
+ import { myth } from '../../utils'
12
16
 
13
17
  const props = withDefaults(defineProps<Props>(), {
14
- size: 'md',
15
- rounded: !1,
16
- shadow: 'none'
18
+ size: undefined,
19
+ rounded: undefined,
20
+ shadow: undefined
21
+ })
22
+ const getSize = computed(() => {
23
+ if (props.size !== undefined) {
24
+ return props.size
25
+ }
26
+ return myth.props.value.block?.size || myth.size.value
17
27
  })
18
- const block = computed(() => MythOptions.options.value.block ?? {})
19
- const options = computed<Props>(() => extend(!0, { ...props }, block.value))
28
+ const getRounded = computed(() => {
29
+ if (props.rounded !== undefined) {
30
+ return props.rounded
31
+ }
32
+ return myth.props.value.block?.rounded || myth.rounded.value
33
+ })
34
+ const getShadow = computed(() => {
35
+ if (props.shadow !== undefined) {
36
+ return props.shadow
37
+ }
38
+ return myth.props.value.block?.shadow || myth.shadow.value
39
+ })
40
+
20
41
  defineOptions({
21
42
  name: 'MBlock',
22
43
  inheritAttrs: !1
@@ -27,9 +48,9 @@ defineOptions({
27
48
  <div
28
49
  :class="{
29
50
  'm---block' : !0,
30
- [`q-pa-${options.size}`] : options.size && options.size !== 'none',
31
- 'rounded-borders' : options.rounded === !0,
32
- [`shadow-${options.shadow}`] : options.shadow && options.shadow !== 'none'
51
+ [`q-pa-${getSize}`] : getSize && getSize !== 'none',
52
+ 'rounded-borders' : getRounded === !0,
53
+ [`shadow-${getShadow||''}`] : getShadow && getShadow !== 'none'
33
54
  }"
34
55
  v-bind="$attrs"
35
56
  >
@@ -1,21 +1,18 @@
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
+
1
9
  <script
2
10
  lang="ts"
3
11
  setup
4
12
  >
5
13
  import { computed } from 'vue'
6
14
  import { uniq } from 'lodash'
7
- import type { MColProps } from '../../types'
8
-
9
- interface Props {
10
- name?: MColProps['name']
11
- auto?: MColProps['auto']
12
- col?: MColProps['col']
13
- xs?: MColProps['xs']
14
- sm?: MColProps['sm']
15
- md?: MColProps['md']
16
- lg?: MColProps['lg']
17
- xl?: MColProps['xl']
18
- }
15
+ import type { MColProps as Props } from '../../types'
19
16
 
20
17
  const props = defineProps<Props>()
21
18
  const classes = computed(() => {
@@ -45,8 +42,8 @@ const classes = computed(() => {
45
42
  list.push('col')
46
43
  }
47
44
  return uniq(list)
48
- // return list
49
45
  })
46
+
50
47
  defineOptions({
51
48
  name: 'MCol',
52
49
  inheritAttrs: !1
@@ -56,8 +53,7 @@ defineOptions({
56
53
  <template>
57
54
  <div
58
55
  :class="classes"
59
- :data-input-name="name??undefined"
60
- v-bind="$attrs"
56
+ v-bind="{...$attrs,':data-input-name': name??undefined}"
61
57
  >
62
58
  <slot />
63
59
  </div>