@drax/media-vue 0.13.0 → 0.14.0

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.
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "0.13.0",
6
+ "version": "0.14.0",
7
7
  "type": "module",
8
8
  "main": "./src/index.ts",
9
9
  "module": "./src/index.ts",
@@ -24,7 +24,7 @@
24
24
  "format": "prettier --write src/"
25
25
  },
26
26
  "dependencies": {
27
- "@drax/media-front": "^0.13.0"
27
+ "@drax/media-front": "^0.14.0"
28
28
  },
29
29
  "peerDependencies": {
30
30
  "pinia": "^2.2.2",
@@ -61,5 +61,5 @@
61
61
  "vue-tsc": "^2.0.11",
62
62
  "vuetify": "^3.7.1"
63
63
  },
64
- "gitHead": "ff7df3bb96303a056ad2e1ee70dc9dfa4a43ef9e"
64
+ "gitHead": "e159fe1498b9ca2693c64b76de12ea9635ffaebb"
65
65
  }
@@ -6,7 +6,7 @@ const mediaSystem = MediaSystemFactory.getInstance()
6
6
 
7
7
  const valueModel = defineModel<any>({type: [String], default: false})
8
8
 
9
- const {dir} = defineProps({
9
+ const {dir, readonly} = defineProps({
10
10
  prependIcon: {type: String, default: ''},
11
11
  prependInnerIcon: {type: String, default: ''},
12
12
  appendIcon: {type: String, default: ''},
@@ -34,6 +34,9 @@ const {dir} = defineProps({
34
34
  let fileInput = ref()
35
35
 
36
36
  function onFileClick() {
37
+ if(readonly){
38
+ return;
39
+ }
37
40
  fileInput.value.click();
38
41
  }
39
42
 
@@ -49,6 +52,9 @@ async function onFileChanged(e: Event) {
49
52
  }
50
53
 
51
54
  const handleDrop = async (event: DragEvent) => {
55
+ if(readonly){
56
+ return;
57
+ }
52
58
  isDragOver.value = false;
53
59
  const files = event.dataTransfer?.files;
54
60
  if (files && files[0]) {
@@ -89,7 +95,7 @@ defineEmits(['updateValue'])
89
95
  :name="name"
90
96
  :label="label"
91
97
  v-model="valueModel"
92
- :readonly="readonly"
98
+ :readonly="true"
93
99
  :error-messages="errorMessages"
94
100
  :rules="rules"
95
101
  :density="density"
@@ -0,0 +1,151 @@
1
+ <script setup lang="ts">
2
+ import {MediaSystemFactory} from "@drax/media-front"
3
+ import {type PropType, ref, computed} from "vue";
4
+
5
+ const mediaSystem = MediaSystemFactory.getInstance()
6
+
7
+ const valueModel = defineModel<any>({
8
+ type: Object,
9
+ default: () => ({filename: '', filepath: '', size: 0, mimetype: '', url: ''})
10
+ })
11
+
12
+ const {dir, readonly} = defineProps({
13
+ prependIcon: {type: String, default: ''},
14
+ prependInnerIcon: {type: String, default: ''},
15
+ appendIcon: {type: String, default: ''},
16
+ appendInnerIcon: {type: String, default: ''},
17
+ readonly: {type: Boolean, default: true},
18
+ hideDetails: {type: Boolean, default: false},
19
+ singleLine: {type: Boolean, default: false},
20
+ clearable: {type: Boolean, default: false},
21
+ disableRules: {type: Boolean, default: false},
22
+ parentField: {type: String, default: null, required: false},
23
+ index: {type: Number, default: null, required: false},
24
+ name: {type: String, default: 'file'},
25
+ dir: {type: String, default: 'files'},
26
+ label: {type: String, default: 'media.file'},
27
+ accept: {type: String, default: '*'},
28
+ errorMessages: {type: Array as PropType<string[]>, default: []},
29
+ rules: {type: Array as PropType<any>, default: []},
30
+ density: {type: String as PropType<'comfortable' | 'compact' | 'default'>, default: 'default'},
31
+ variant: {
32
+ type: String as PropType<'underlined' | 'outlined' | 'filled' | 'solo' | 'solo-inverted' | 'solo-filled' | 'plain'>,
33
+ default: 'filled'
34
+ },
35
+ })
36
+
37
+ let fileInput = ref()
38
+
39
+ function onFileClick() {
40
+ if(readonly){
41
+ return;
42
+ }
43
+ fileInput.value.click();
44
+ }
45
+
46
+ const valueModelUrl = computed(() =>
47
+ valueModel.value.url || '')
48
+
49
+ async function onFileChanged(e: Event) {
50
+ if (e.target && (e.target as HTMLInputElement).files) {
51
+ const files = (e.target as HTMLInputElement).files;
52
+ if (files && files[0]) {
53
+ const file = await mediaSystem.uploadFile(files[0], dir);
54
+ valueModel.value = file;
55
+
56
+ }
57
+ }
58
+ }
59
+
60
+ const handleDrop = async (event: DragEvent) => {
61
+ if(readonly){
62
+ return;
63
+ }
64
+ isDragOver.value = false;
65
+ const files = event.dataTransfer?.files;
66
+ if (files && files[0]) {
67
+ const file = await mediaSystem.uploadFile(files[0], dir);
68
+ valueModel.value = file.url;
69
+ }
70
+ };
71
+
72
+ const isDragOver = ref(false);
73
+
74
+ const handleDragEnter = () => {
75
+ isDragOver.value = true;
76
+ };
77
+
78
+ const handleDragOver = () => {
79
+ isDragOver.value = true;
80
+ };
81
+
82
+ const handleDragLeave = () => {
83
+ isDragOver.value = false;
84
+ };
85
+
86
+ defineEmits(['updateValue'])
87
+
88
+ </script>
89
+
90
+ <template>
91
+ <div
92
+
93
+ :class="{ 'drop-zone': true, 'dragover': isDragOver }"
94
+ @dragenter.prevent="handleDragEnter"
95
+ @dragover.prevent="handleDragOver"
96
+ @dragleave.prevent="handleDragLeave"
97
+ @drop.prevent="handleDrop"
98
+
99
+ >
100
+
101
+ <v-text-field
102
+ type="text"
103
+ :name="name"
104
+ :label="label"
105
+ v-model="valueModelUrl"
106
+ :readonly="true"
107
+ :error-messages="errorMessages"
108
+ :rules="rules"
109
+ :density="density"
110
+ :variant="variant"
111
+ :clearable="clearable"
112
+ :hide-details="hideDetails"
113
+ :single-line="singleLine"
114
+ :prepend-inner-icon="prependInnerIcon"
115
+ :append-icon="appendIcon"
116
+ :prepend-icon="prependIcon"
117
+ :append-inner-icon="appendInnerIcon"
118
+ @update:modelValue="$emit('updateValue')"
119
+ @click:prepend-inner="onFileClick"
120
+ >
121
+
122
+ </v-text-field>
123
+
124
+ <input
125
+ :accept="accept"
126
+ ref="fileInput"
127
+ class="d-none"
128
+ type="file"
129
+ @change="onFileChanged"
130
+ >
131
+
132
+ <v-btn @click="onFileClick" density="compact" color="grey" variant="text">Click | Drag & Drop</v-btn>
133
+
134
+ </div>
135
+
136
+ </template>
137
+
138
+ <style scoped>
139
+ .drop-zone {
140
+ border: 2px dashed #ccc;
141
+ padding: 10px;
142
+ text-align: center;
143
+ color: #666;
144
+ transition: background-color 0.3s;
145
+ }
146
+
147
+ .drop-zone.dragover {
148
+ background-color: #e0f7fa;
149
+ border-color: #00acc1;
150
+ }
151
+ </style>
package/src/index.ts CHANGED
@@ -1,5 +1,7 @@
1
1
  import MediaField from "./components/MediaField.vue";
2
+ import MediaFullField from "./components/MediaFullField.vue";
2
3
 
3
4
  export {
4
- MediaField
5
+ MediaField,
6
+ MediaFullField
5
7
  }