@mythpe/quasar-ui-qui 0.0.19-dev → 0.0.19

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