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