@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
@@ -6,24 +6,33 @@
6
6
  - Github: https://github.com/mythpe
7
7
  -->
8
8
 
9
- <script lang="ts" setup>
9
+ <script
10
+ lang="ts"
11
+ setup
12
+ >
10
13
  import type { MContainerProps } from '../../types'
11
14
  import { myth } from '../../utils'
12
15
  import { computed } from 'vue'
13
16
 
14
- interface Props {
15
- size?: MContainerProps['size'];
16
- fluid?: MContainerProps['fluid'];
17
- dense?: MContainerProps['dense'];
18
- }
19
-
20
- const props = defineProps<Props>()
21
- const styles = computed(() => myth.options.value?.style ?? {})
17
+ const props = withDefaults(defineProps<MContainerProps>(), {
18
+ size: undefined,
19
+ dense: !1,
20
+ fluid: undefined
21
+ })
22
22
  const sizeProp = computed(() => {
23
23
  if (props.size !== undefined) {
24
24
  return props.size
25
25
  }
26
- return styles.value.gutters
26
+ if (myth.props.value.container?.size !== undefined) {
27
+ return myth.props.value.container?.size
28
+ }
29
+ return myth.size.value
30
+ })
31
+ const fluidProp = computed(() => {
32
+ if (props.fluid !== undefined) {
33
+ return props.fluid
34
+ }
35
+ return myth.fluid.value === !0
27
36
  })
28
37
  defineOptions({
29
38
  name: 'MContainer',
@@ -35,8 +44,8 @@ defineOptions({
35
44
  <div
36
45
  :class="{
37
46
  'm--container' : !0,
38
- 'm--container__fluid' : (fluid !== !1 && fluid !== undefined) || (styles.fluid === !0 && (fluid !== !1 && fluid !== undefined)),
39
- 'm--container__dense' : dense !== !1 && dense !== undefined,
47
+ 'm--container__fluid' : fluidProp === !0,
48
+ 'm--container__dense' : dense === !0,
40
49
  [`q-pa-${sizeProp||''}`]: sizeProp && sizeProp !== 'none'
41
50
  }"
42
51
  v-bind="$attrs"
@@ -11,14 +11,13 @@
11
11
  setup
12
12
  >
13
13
  import { useMyth } from '../../composable'
14
+ import type { MHelpRowProps } from '../../types'
14
15
 
15
- interface Props {
16
- text?: string | undefined;
17
- icon?: string | undefined;
18
- tooltip?: boolean | undefined;
19
- }
20
-
21
- defineProps<Props>()
16
+ withDefaults(defineProps<MHelpRowProps>(), {
17
+ text: undefined,
18
+ icon: undefined,
19
+ tooltip: !1
20
+ })
22
21
  const { __ } = useMyth()
23
22
  defineOptions({
24
23
  name: 'MHelpRow',
@@ -27,11 +26,14 @@ defineOptions({
27
26
  </script>
28
27
 
29
28
  <template>
30
- <div class="row">
29
+ <div
30
+ v-if="text || tooltip"
31
+ class="row"
32
+ >
31
33
  <div class="col-auto">
32
34
  <q-icon
35
+ :class="{'cursor-pointer': !!tooltip}"
33
36
  :left="!!text && !tooltip"
34
- class="cursor-pointer"
35
37
  name="ion-ios-information-circle-outline"
36
38
  size="19px"
37
39
  >
@@ -14,15 +14,28 @@ import type { MRowProps } from '../../types'
14
14
  import { computed } from 'vue'
15
15
  import { myth } from '../../utils'
16
16
 
17
- interface Props {
18
- gutter?: MRowProps['gutter'];
19
- col?: MRowProps['col'];
20
- }
21
-
22
- const props = defineProps<Props>()
23
- const defSize = computed<string>(() => myth.options.value.style?.gutters || '')
24
- const gutterSize = computed<string>(() => props.gutter === !0 ? defSize.value : (props.gutter || defSize.value))
25
- const colSize = computed<string>(() => props.gutter === !0 ? defSize.value : (props.gutter || defSize.value))
17
+ const props = withDefaults(defineProps<MRowProps>(), {
18
+ gutter: undefined,
19
+ col: undefined
20
+ })
21
+ const defSize = 'md'
22
+ const gutterSize = computed<string>(() => {
23
+ if (props.gutter !== undefined) {
24
+ if (typeof props.gutter === 'string' && props.gutter?.length > 0) {
25
+ return props.gutter
26
+ }
27
+ }
28
+ return myth.size.value || defSize
29
+ })
30
+ const colSize = computed<string>(() => {
31
+ if (props.col !== undefined) {
32
+ if (typeof props.col === 'string' && props.col?.length > 0) {
33
+ return props.col
34
+ }
35
+ }
36
+ return myth.size.value || defSize
37
+ })
38
+ // const colSize = computed<string>(() => props.gutter === !0 ? defSize.value : (props.gutter || defSize.value))
26
39
  defineOptions({
27
40
  name: 'MRow',
28
41
  inheritAttrs: !1
@@ -6,6 +6,10 @@
6
6
  * Github: https://github.com/mythpe
7
7
  */
8
8
 
9
+ export * from './datatable'
9
10
  export * from './form'
10
11
  export * from './grid'
12
+ export * from './modal'
13
+ export * from './parials'
11
14
  export * from './typography'
15
+ export * from './transition'
@@ -0,0 +1,58 @@
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
+
14
+ import { computed, reactive } from 'vue'
15
+ import type { MDialogProps as Props } from '../../types'
16
+ import { useMyth } from '../../composable'
17
+
18
+ interface P {
19
+ slide?: Props['slide'] | undefined;
20
+ from?: Props['from']
21
+ }
22
+
23
+ const props = withDefaults(defineProps<P>(), {
24
+ slide: () => !1,
25
+ from: () => 'left'
26
+ })
27
+ const slideProp = computed(() => props.slide !== undefined && props.slide !== !1 && props.slide !== null)
28
+ const map = {
29
+ left: 'right',
30
+ right: 'left',
31
+ up: 'down',
32
+ down: 'up'
33
+ }
34
+
35
+ const slideHide = computed<string>(() => 'slide-' + props.from)
36
+ const slideShow = computed<string>(() => 'slide-' + map[props.from])
37
+ const { mOptions } = reactive(useMyth())
38
+ defineOptions({
39
+ name: 'MDialog',
40
+ inheritAttrs: !1
41
+ })
42
+ </script>
43
+
44
+ <template>
45
+ <q-dialog
46
+ :transition-hide="$q.screen.lt.md ? slideHide : (slideProp ? slideHide : 'jump-down')"
47
+ :transition-show="$q.screen.lt.md ? slideShow : (slideProp ? slideShow : 'jump-up')"
48
+ allow-focus-outside
49
+ maximized
50
+ no-backdrop-dismiss
51
+ no-esc-dismiss
52
+ no-shake
53
+ persistent
54
+ v-bind="{...mOptions.dialog,...$attrs}"
55
+ >
56
+ <slot />
57
+ </q-dialog>
58
+ </template>
@@ -0,0 +1,62 @@
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
+
13
+ import type { MModalMenuProps } from '../../types'
14
+ import { useMyth } from '../../composable'
15
+ import { reactive } from 'vue'
16
+
17
+ interface Props {
18
+ noCloseBtn?: MModalMenuProps['noCloseBtn'];
19
+ position?: MModalMenuProps['position'];
20
+ }
21
+
22
+ const { mOptions, __ } = reactive(useMyth())
23
+ withDefaults(defineProps<Props>(), {
24
+ noCloseBtn: () => !1,
25
+ position: () => 'bottom'
26
+ })
27
+ defineOptions({
28
+ name: 'MModalMenu',
29
+ inheritAttrs: !1
30
+ })
31
+ </script>
32
+
33
+ <template>
34
+ <q-popup-proxy
35
+ :position="position"
36
+ allow-focus-outside
37
+ class="m--modal_menu shadow-24"
38
+ maximized
39
+ no-backdrop-dismiss
40
+ no-shake
41
+ v-bind="{...mOptions.modalMenu,...$attrs}"
42
+ >
43
+ <q-card v-bind="mOptions.modalMenuOptions?.card">
44
+ <slot />
45
+ <template v-if="!noCloseBtn">
46
+ <q-separator class="lt-md" />
47
+ <q-item
48
+ v-close-popup
49
+ class="lt-md"
50
+ clickable
51
+ v-bind="mOptions.modalMenuOptions?.closeBtn"
52
+ >
53
+ <q-item-section>
54
+ <q-item-label header>
55
+ {{ __('myth.titles.close') }}
56
+ </q-item-label>
57
+ </q-item-section>
58
+ </q-item>
59
+ </template>
60
+ </q-card>
61
+ </q-popup-proxy>
62
+ </template>
@@ -0,0 +1,39 @@
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
+
14
+ import { useMyth } from '../../composable'
15
+
16
+ interface Props {
17
+ noCloseBtn?: boolean;
18
+ }
19
+
20
+ withDefaults(defineProps<Props>(), {
21
+ noCloseBtn: () => !1
22
+ })
23
+ defineOptions({
24
+ name: 'MTooltip',
25
+ inheritAttrs: !1
26
+ })
27
+ const { mOptions } = useMyth()
28
+ </script>
29
+
30
+ <template>
31
+ <q-tooltip
32
+ class="m--dt-btn-tooltip"
33
+ transition-hide="scale"
34
+ transition-show="scale"
35
+ v-bind="{...mOptions.tooltip,...$attrs}"
36
+ >
37
+ <slot />
38
+ </q-tooltip>
39
+ </template>
@@ -0,0 +1,5 @@
1
+ import MDialog from './MDialog.vue'
2
+ import MModalMenu from './MModalMenu.vue'
3
+ import MTooltip from './MTooltip.vue'
4
+
5
+ export { MDialog, MModalMenu, MTooltip }
@@ -0,0 +1,299 @@
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
+
14
+ import { computed, nextTick, reactive, ref } from 'vue'
15
+ import type { MUploaderMediaItem, MUploaderProps as Props, MUploaderServiceType } from '../../types'
16
+ import type { QUploader } from 'quasar'
17
+ import { useQuasar } from 'quasar'
18
+ import { useMyth } from '../../composable'
19
+ import { useI18n } from 'vue-i18n'
20
+
21
+ type ModelValue = MUploaderMediaItem | File & {
22
+ __sizeLabel?: string;
23
+ __progressLabel?: string;
24
+ __status?: string;
25
+ __img?: string;
26
+ };
27
+
28
+ interface P {
29
+ name: Props['name'];
30
+ modelId?: Props['modelId'];
31
+ iconsSize?: Props['iconsSize'];
32
+ hideDeleteMedia?: Props['hideDeleteMedia'];
33
+ updateBtn?: Props['updateBtn'];
34
+ collection?: Props['collection'];
35
+ returnType?: Props['returnType'];
36
+ service: Props['service'];
37
+ displayMode?: Props['displayMode'];
38
+ shadow?: Props['shadow'];
39
+ scope: QUploader;
40
+ defaultFileIcon?: Props['defaultFileIcon'];
41
+ deleteMediaIcon?: Props['deleteMediaIcon'];
42
+ downloadFileIcon?: Props['downloadFileIcon'];
43
+ mediaLabel?: Props['mediaLabel'];
44
+ }
45
+
46
+ const props = withDefaults(defineProps<P>(), {
47
+ name: () => '',
48
+ modelId: undefined,
49
+ iconsSize: undefined,
50
+ hideDeleteMedia: undefined,
51
+ updateBtn: undefined,
52
+ collection: undefined,
53
+ returnType: undefined,
54
+ service: undefined,
55
+ displayMode: undefined,
56
+ shadow: undefined,
57
+ scope: () => ({} as QUploader),
58
+ defaultFileIcon: undefined,
59
+ deleteMediaIcon: undefined,
60
+ downloadFileIcon: undefined,
61
+ mediaLabel: () => ''
62
+ })
63
+ const modelValue = defineModel<ModelValue>({ required: !0, default: () => ({} as ModelValue) })
64
+ const mediaProp = computed<MUploaderMediaItem>(() => modelValue.value as MUploaderMediaItem)
65
+
66
+ interface Emits {
67
+ (e: 'delete-media', media: MUploaderMediaItem, result: boolean): void;
68
+
69
+ (e: 'remove-file', File: File): void;
70
+
71
+ (e: 'values', value: Props['modelValue']): void;
72
+ }
73
+
74
+ const emit = defineEmits<Emits>()
75
+
76
+ const q = useQuasar()
77
+ const { te } = useI18n({ useScope: 'global' })
78
+ const $myth = useMyth()
79
+ const { alertError, alertSuccess, confirmMessage, __ } = $myth
80
+ const { api, mOptions } = reactive($myth)
81
+ const setModelValue = (value: Props['modelValue']) => emit('values', value)
82
+ const deleting = ref(!1)
83
+ const onClickDeleteAttachment = () => {
84
+ const file = modelValue.value
85
+ if (file instanceof File) {
86
+ confirmMessage().onOk(() => {
87
+ deleteUploaderFile(file)
88
+ })
89
+ } else {
90
+ deleteMedia(file)
91
+ }
92
+ }
93
+
94
+ const hideDeleteMediaProp = computed(() => props.hideDeleteMedia)
95
+ const getRequestConfig = () => ({
96
+ params: {
97
+ collection: props.collection !== undefined ? props.collection : undefined,
98
+ return: props.returnType !== undefined ? props.returnType : undefined
99
+ }
100
+ })
101
+ const deleteMedia = (media: MUploaderMediaItem) => {
102
+ if (deleting.value || hideDeleteMediaProp.value) {
103
+ return
104
+ }
105
+ confirmMessage().onOk(() => {
106
+ const model = modelValue.value as MUploaderMediaItem
107
+ let r = !1
108
+ const method = (typeof props.service === 'string' ? api[props.service] : props.service) as MUploaderServiceType
109
+ if (method) {
110
+ deleting.value = !0
111
+ q.loading.show()
112
+ method.deleteAttachment(props.modelId, model.id, getRequestConfig())
113
+ .then(({ _message, _success, _data }) => {
114
+ _message && alertSuccess(_message)
115
+ r = _success
116
+ setModelValue((_data ?? []) as MUploaderMediaItem[])
117
+ })
118
+ .catch((e) => {
119
+ alertError(e?._message || e?.message)
120
+ r = !1
121
+ })
122
+ .finally(() => {
123
+ deleting.value = !1
124
+ q.loading.hide()
125
+ emit('delete-media', media, r)
126
+ })
127
+ }
128
+ })
129
+ }
130
+ const deleteUploaderFile = (file: File) => {
131
+ nextTick(() => emit('remove-file', file))
132
+ }
133
+ const onUpdateField = (data: any) => {
134
+ const model = modelValue.value as MUploaderMediaItem
135
+ const method = (typeof props.service === 'string' ? api[props.service] : props.service) as MUploaderServiceType
136
+ if (method) {
137
+ deleting.value = !0
138
+ q.loading.show()
139
+ method.updateAttachment(props.modelId, model.id, data, getRequestConfig())
140
+ .then(({ _message, _data }) => {
141
+ _message && alertSuccess(_message)
142
+ setModelValue((_data ?? []) as MUploaderMediaItem[])
143
+ })
144
+ .catch((e) => {
145
+ alertError(e?._message || e?.message)
146
+ })
147
+ .finally(() => {
148
+ deleting.value = !1
149
+ q.loading.hide()
150
+ })
151
+ }
152
+ }
153
+ defineOptions({ name: 'UploaderItem' })
154
+ </script>
155
+
156
+ <template>
157
+ <q-item
158
+ :class="displayMode === 'card' ? `rounded-borders ${shadow || 'shadow-1'}` : undefined"
159
+ :dense="displayMode === 'card'"
160
+ :style="displayMode === 'card' ? 'max-width: 300px; min-width: 200px;' : undefined"
161
+ >
162
+ <q-item-section
163
+ v-if="displayMode === 'list'"
164
+ avatar
165
+ top
166
+ >
167
+ <q-icon
168
+ v-if="!!mediaProp.icon"
169
+ :name="mediaProp.icon"
170
+ :size="iconsSize"
171
+ color="primary"
172
+ />
173
+ <q-img
174
+ v-else-if="!!modelValue.__img || (mediaProp.url && modelValue.type === 'image')"
175
+ :ratio="1"
176
+ :src="modelValue.__img ? modelValue.__img.src : mediaProp.url"
177
+ fit="contain"
178
+ />
179
+ <q-icon
180
+ v-else
181
+ :name="modelValue.type === 'pdf' ? 'fa-regular fa-file-pdf' : (modelValue.type === 'excel' ? 'fa-regular fa-file-excel' : (modelValue.type === 'image' ? 'o_image' :defaultFileIcon))"
182
+ :size="props.iconsSize"
183
+ color="primary"
184
+ />
185
+ </q-item-section>
186
+ <q-item-section :class="{'overflow-hidden': displayMode === 'card'}">
187
+ <q-item-label v-if="!!mediaProp[mediaLabel]">
188
+ {{ mediaProp[mediaLabel] }}
189
+ <q-icon
190
+ v-if="updateBtn"
191
+ class="cursor-pointer"
192
+ color="primary"
193
+ name="o_edit"
194
+ right
195
+ >
196
+ <q-popup-edit
197
+ v-slot="popupScope"
198
+ :label-set="__('labels.save')"
199
+ :model-value="{name: mediaProp.name, order_column: mediaProp.order_column}"
200
+ :title="__('labels.update')"
201
+ buttons
202
+ cover
203
+ max-width="350px"
204
+ persistent
205
+ @save="onUpdateField( $event)"
206
+ >
207
+ <q-input
208
+ v-model="popupScope.value.name"
209
+ :label="__('name')"
210
+ autofocus
211
+ dense
212
+ hide-bottom-space
213
+ />
214
+ <q-input
215
+ v-model="popupScope.value.order_column"
216
+ :label="__('order_column')"
217
+ autofocus
218
+ dense
219
+ hide-bottom-space
220
+ />
221
+ </q-popup-edit>
222
+ <q-tooltip>{{ __('labels.update') }}</q-tooltip>
223
+ </q-icon>
224
+ </q-item-label>
225
+ <q-item-label v-else-if="!!mediaProp.label">
226
+ {{ __(mediaProp.label) }}
227
+ </q-item-label>
228
+ <q-item-label v-if="!!mediaProp.user_id_to_string">
229
+ <q-icon
230
+ color="primary"
231
+ name="ion-ios-contact"
232
+ />
233
+ {{ mediaProp.user_id_to_string }}
234
+ </q-item-label>
235
+ <q-item-label v-if="!!mediaProp.description">
236
+ {{ mediaProp.description }}
237
+ </q-item-label>
238
+ <q-item-label v-else-if="!!mediaProp.attachment_type">
239
+ {{ mediaProp.attachment_type }}
240
+ </q-item-label>
241
+ <slot
242
+ :item="modelValue"
243
+ name="item"
244
+ />
245
+ <q-item-label
246
+ v-if="!!modelValue.__status"
247
+ :class="{'print-hide': !0,'text-positive' : (modelValue.__status === 'uploaded' || !!mediaProp.id),'text-orange' : modelValue.__status === 'uploading','text-amber-10' : modelValue.__status === 'idle' || modelValue.__status === 'failed'}"
248
+ caption
249
+ >
250
+ <q-icon
251
+ :name="modelValue.__status === 'uploaded' ? 'o_check' : ( modelValue.__status === 'uploading' ? 'o_cloud_sync' : (modelValue.__status === 'idle' ? 'o_hourglass_empty' : (modelValue.__status === 'failed' ? 'o_error_outline' : undefined)))"
252
+ size="22px"
253
+ />
254
+ <span class="text-body2 q-pl-xs">
255
+ {{ te(`myth.uploader.statuses.${modelValue.__status}`) ? __(`myth.uploader.statuses.${modelValue.__status}`) : modelValue.__status }}
256
+ </span>
257
+ </q-item-label>
258
+ <q-item-label
259
+ v-if="!!mediaProp.size_to_string || !!modelValue.__sizeLabel"
260
+ caption
261
+ class="print-hide"
262
+ >
263
+ <span v-if="!!mediaProp.size_to_string">{{ mediaProp.size_to_string }} | {{ modelValue.type }}</span>
264
+ <span v-if="modelValue.__sizeLabel">{{ modelValue.__sizeLabel }} / {{ modelValue.__progressLabel }}</span>
265
+ </q-item-label>
266
+ <q-item-label
267
+ v-if="(mediaProp.id && mediaProp.url) || (!hideDeleteMedia || (hideDeleteMedia && !mediaProp.id))"
268
+ class="print-hide justify-between"
269
+ >
270
+ <q-btn
271
+ v-if="mediaProp.id && mediaProp.url"
272
+ :href="mediaProp.url"
273
+ :icon="downloadFileIcon"
274
+ dense
275
+ flat
276
+ target="_blank"
277
+ v-bind="mOptions.uploaderOptions?.downloadBtnProps"
278
+ >
279
+ <q-tooltip class="m--dt-btn-tooltip">
280
+ {{ __('myth.titles.download') }}
281
+ </q-tooltip>
282
+ </q-btn>
283
+ <q-btn
284
+ v-if="(!hideDeleteMedia || (hideDeleteMedia && !mediaProp.id))"
285
+ :disable="deleting || scope.isBusy || scope.isUploading"
286
+ :icon="deleteMediaIcon"
287
+ dense
288
+ flat
289
+ v-bind="mOptions.uploaderOptions?.removeBtnProps"
290
+ @click="onClickDeleteAttachment()"
291
+ >
292
+ <q-tooltip class="m--dt-btn-tooltip">
293
+ {{ __(mediaProp.id ? 'myth.uploader.deleteMedia' : 'myth.uploader.removeMedia') }}
294
+ </q-tooltip>
295
+ </q-btn>
296
+ </q-item-label>
297
+ </q-item-section>
298
+ </q-item>
299
+ </template>
@@ -0,0 +1,3 @@
1
+ import UploaderItem from './UploaderItem.vue'
2
+
3
+ export { UploaderItem }
@@ -0,0 +1,27 @@
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
+ defineOptions({
14
+ name: 'MFadeTransition',
15
+ inheritAttrs: !1
16
+ })
17
+ </script>
18
+
19
+ <template>
20
+ <Transition
21
+ appear
22
+ name="myth-transition__fade"
23
+ v-bind="$attrs"
24
+ >
25
+ <slot />
26
+ </Transition>
27
+ </template>
@@ -0,0 +1,26 @@
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
+ defineOptions({
13
+ name: 'MFadeXTransition',
14
+ inheritAttrs: !1
15
+ })
16
+ </script>
17
+
18
+ <template>
19
+ <Transition
20
+ appear
21
+ name="myth-transition__fade-x"
22
+ v-bind="$attrs"
23
+ >
24
+ <slot />
25
+ </Transition>
26
+ </template>