@mixd-id/web-scaffold 0.1.230406194 → 0.1.230406196

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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@mixd-id/web-scaffold",
3
3
  "private": false,
4
- "version": "0.1.230406194",
4
+ "version": "0.1.230406196",
5
5
  "scripts": {
6
6
  "dev": "vite serve",
7
7
  "build": "vite build",
@@ -1,5 +1,18 @@
1
1
  <template>
2
- <a v-if="isExternalLink && items.length > 0" :target="target">
2
+ <a v-if="mode === 'download' && items.length > 0"
3
+ :href="download.url"
4
+ :download="download.as ?? (download.originalName ?? '')">
5
+ <component v-for="(item, idx) in items"
6
+ :is="item.type"
7
+ :key="idx"
8
+ :="item" />
9
+ </a>
10
+ <a v-else-if="mode === 'download'"
11
+ :href="download.url"
12
+ :download="download.as ?? (download.originalName ?? '')">
13
+ {{ text }}
14
+ </a>
15
+ <a v-else-if="isExternalLink && items.length > 0" :target="target">
3
16
  <component v-for="(item, idx) in items"
4
17
  :is="item.type"
5
18
  :key="idx"
@@ -29,8 +42,10 @@ export default{
29
42
  type: String,
30
43
  default: ''
31
44
  },
45
+ mode: String,
32
46
  target: String,
33
47
  text: String,
48
+ download: Object,
34
49
  },
35
50
 
36
51
  computed: {
@@ -5,7 +5,7 @@
5
5
  <svg width="14" height="14" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Pro 6.2.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M470.6 105.4c12.5 12.5 12.5 32.8 0 45.3l-256 256c-12.5 12.5-32.8 12.5-45.3 0l-128-128c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0L192 338.7 425.4 105.4c12.5-12.5 32.8-12.5 45.3 0z"/></svg>
6
6
  </div>
7
7
  </div>
8
- <input type="radio" class="hidden" :checked="cChecked"/>
8
+ <input type="radio" :name="name" class="hidden" :checked="cChecked"/>
9
9
  <slot></slot>
10
10
  </div>
11
11
  </template>
@@ -4,25 +4,67 @@
4
4
  <div class="flex flex-col gap-4">
5
5
 
6
6
  <div>
7
- <label class="flex-1 text-text-400">Text</label>
7
+ <label class="text-text-400">Text</label>
8
8
  <Textbox v-model="item.props.text" @keyup.enter="$emit('change')"/>
9
9
  </div>
10
10
 
11
11
  <div>
12
- <label class="flex-1 text-text-400">To</label>
13
- <Textbox v-model="item.props.href" @keyup.enter="$emit('change')"/>
12
+ <label class="text-text-400">Mode</label>
13
+ <Dropdown v-model="item.props.mode">
14
+ <option disabled selected>Select Mode</option>
15
+ <option value="link">Link</option>
16
+ <option value="download">Download</option>
17
+ </Dropdown>
14
18
  </div>
15
19
 
16
- <div v-if="isExternalLink">
17
- <label class="flex-1 text-text-400">Target</label>
18
- <Dropdown v-model="item.props.target" @change="$emit('change')">
19
- <option value="_self">Self</option>
20
- <option value="_blank">Blank</option>
21
- <option value="_parent">Parent</option>
22
- <option value="_top">Top</option>
23
- </Dropdown>
20
+ <div v-if="item.props.mode === 'link'" class="flex flex-col gap-4">
21
+ <div>
22
+ <label class="text-text-400">To</label>
23
+ <Textbox v-model="item.props.href" @keyup.enter="$emit('change')"/>
24
+ </div>
25
+
26
+ <div v-if="isExternalLink">
27
+ <label class="text-text-400">Target</label>
28
+ <Dropdown v-model="item.props.target" @change="$emit('change')">
29
+ <option value="_self">Self</option>
30
+ <option value="_blank">Blank</option>
31
+ <option value="_parent">Parent</option>
32
+ <option value="_top">Top</option>
33
+ </Dropdown>
34
+ </div>
24
35
  </div>
25
36
 
37
+ <div v-else-if="item.props.mode === 'download'" class="flex flex-col gap-4">
38
+
39
+ <div>
40
+ <label class="text-text-400">File</label>
41
+ <div>
42
+ <input type="file" ref="file" class="hidden"
43
+ accept=".jpg,.jpeg,.png,.gif,.xls,.xlsx,.doc,.docx,.ppt,.pptx,.csv,.pdf"
44
+ @change="onChange" />
45
+ <button v-if="!download.url" type="button"
46
+ @click="$refs.file.click()"
47
+ class="w-full p-2 text-center bg-text-50 rounded-lg text-text-300">
48
+ Click to Add File
49
+ </button>
50
+ <div v-else class="p-2 border-l-[2px] border-primary bg-text-50 flex flex-row items-center rounded-r-lg">
51
+ <div class="flex-1 px-1 text-ellipsis overflow-hidden whitespace-nowrap">
52
+ {{ placeholder }}
53
+ </div>
54
+ <button type="button" @click="this.item.props.download = {}">
55
+ <svg width="14" height="14" class="fill-text-300 hover:fill-red-500" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><path d="M193.94 256L296.5 153.44l21.15-21.15c3.12-3.12 3.12-8.19 0-11.31l-22.63-22.63c-3.12-3.12-8.19-3.12-11.31 0L160 222.06 36.29 98.34c-3.12-3.12-8.19-3.12-11.31 0L2.34 120.97c-3.12 3.12-3.12 8.19 0 11.31L126.06 256 2.34 379.71c-3.12 3.12-3.12 8.19 0 11.31l22.63 22.63c3.12 3.12 8.19 3.12 11.31 0L160 289.94 262.56 392.5l21.15 21.15c3.12 3.12 8.19 3.12 11.31 0l22.63-22.63c3.12-3.12 3.12-8.19 0-11.31L193.94 256z"/></svg>
56
+ </button>
57
+ </div>
58
+ </div>
59
+ </div>
60
+
61
+ <div>
62
+ <label class="text-text-400">As</label>
63
+ <Textbox v-model="download.as" @keyup.enter="$emit('change')" :placeholder="placeholder"/>
64
+ </div>
65
+ </div>
66
+
67
+
26
68
  </div>
27
69
 
28
70
  <ComponentSetting :item="item"
@@ -58,10 +100,19 @@ export default{
58
100
  }
59
101
  },
60
102
 
61
- inject: [ 'confirm', 'imageSrc' ],
103
+ inject: [ 'alert', 'confirm', 'imageSrc', 'uploadImage' ],
62
104
 
63
105
  methods: {
64
106
 
107
+ onChange(){
108
+ this.uploadImage(this.$refs.file.files[0], { target:'downloads' })
109
+ .then((obj) => {
110
+ console.log(obj)
111
+ Object.assign(this.download, obj)
112
+ this.$emit('change')
113
+ })
114
+ .catch(err => this.alert(err))
115
+ }
65
116
 
66
117
  },
67
118
 
@@ -71,6 +122,18 @@ export default{
71
122
  return (this.item.props.href ?? '').indexOf('://') > -1;
72
123
  },
73
124
 
125
+ download(){
126
+ if(!this.item.props.download){
127
+ this.item.props.download = {}
128
+ }
129
+
130
+ return this.item.props.download
131
+ },
132
+
133
+ placeholder(){
134
+ return this.download.originalName ?? this.download.name
135
+ }
136
+
74
137
  }
75
138
 
76
139
  }
@@ -945,14 +945,14 @@ export default{
945
945
  },
946
946
 
947
947
  onHooks(model, event, items){
948
- if(model === 'page' && event === 'update'){
948
+ /*if(model === 'page' && event === 'update'){
949
949
  items.forEach((item) => {
950
950
  if(item.id === this.page.id){
951
951
  Object.assign(this.page, item)
952
952
  //this.reloadIframe()
953
953
  }
954
954
  })
955
- }
955
+ }*/
956
956
  },
957
957
 
958
958
  onKeyDown(e){
@@ -1326,12 +1326,12 @@ export default{
1326
1326
  }
1327
1327
  },
1328
1328
 
1329
- async uploadImage(image){
1329
+ async uploadImage(image, extra = {}){
1330
1330
 
1331
1331
  return axios({
1332
1332
  method: this.uploadConfig.method,
1333
1333
  url: this.uploadConfig.url,
1334
- data: createFormData({ image })
1334
+ data: createFormData({ image, ...extra })
1335
1335
  })
1336
1336
  .then((res) => {
1337
1337
  return res.data