Changeset 64249d6 in uz
- Timestamp:
- 2022.10.05 19:45:19 (2 years ago)
- Branches:
- master
- Children:
- d45005e
- Parents:
- 4b96189
- Files:
-
- 1 added
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
README.md
r4b96189 r64249d6 4 4 more info at: https://pub.js29a.info.pl/pub/wiki/UZ 5 5 6 demo: https://vite.js29a.usermd.net/#/0 -
src/UploadTest.vue
r4b96189 r64249d6 12 12 const max_jobs = ref(3) 13 13 14 const can_reset = ref(false) 15 const can_start = ref(false) 16 const can_pick = ref(false) 17 const can_abort = ref(false) 18 14 19 const reset = (): void => { 15 20 (inst as any).refs.uploader.reset() … … 20 25 } 21 26 27 const pick = (): void => { 28 (inst as any).refs.uploader.pick() 29 } 30 31 const abort = (): void => { 32 (inst as any).refs.uploader.abort() 33 } 34 22 35 </script> 23 36 24 37 <template> 25 <component class='uploader' :is='UploadZone' target='https://vite.js29a.usermd.net/upload.php' 26 :max-jobs='max_jobs' :auto-start='auto_start' :auto-reset='auto_reset' 27 :keep-going='keep_going' ref='uploader'> 28 <template #idle='{ pick }'> 29 <div class='idle'> 30 idle 31 <br /> 32 <button @click='pick()'>pick</button> 33 </div> 34 </template> 35 36 <template #hover> 37 <div class='hover'> 38 hover 39 </div> 40 </template> 41 42 <template #wait='{ start, queue }'> 43 <div class='wait'> 44 wait 45 <br /> 46 <button @click='pick()'>pick</button> 47 <br /> 48 <button @click='start()'>start</button> 49 <br/> 50 <div v-for='file in queue'>{{ file.name }}</div> 51 </div> 52 </template> 53 54 <template #uploading='{ progress, current, queue, abort, errors }'> 55 <div class='uploading'> 56 uploading 57 <br /> 58 <button @click='abort()'>abort</button> 59 <br /> 60 {{ progress.length }} / {{ current.length }} / {{ queue.length }} 61 <br /> 62 <button @click='abort()'>abort</button> 63 <b>errors:</b> <span v-for='error in errors'>{{ error.file.name }}</span> 64 <b>progress:</b> <div v-for='item in progress'>{{ item }}</div> 65 <b>current:</b> 66 <div v-for='item in current'> 67 {{ item.file.name }}: {{ item.current }} of {{ item.total }} 68 </div> 69 <b>remaining:</b> 70 <div v-for='file in queue'>{{ file.name }}</div> 71 </div> 72 </template> 73 74 <template #done='{ result, reset }'> 75 <div class='done'> 76 done 77 <br /> 78 <button @click='reset()'>reset</button> 79 <br /> 80 <div v-for='item in result'>{{ item }}</div> 81 </div> 82 </template> 83 84 <template #error='{ error, reset }'> 85 <div class='error'> 86 error 87 <br /> 88 <button @click='reset()'>reset</button> 89 <div>{{ error }}</div> 90 </div> 91 </template> 92 93 <template #aborted='{ result, reset }'> 94 <div class='aborted'> 95 aborted 96 <br /> 97 <button @click='reset()'>reset</button> 98 <div v-for='item in result'>{{ item }}</div> 99 </div> 100 </template> 101 102 <template #with-errors='{ result, errors }'> 103 <div class='with-errors'> 104 with errors 105 <br /> 106 <b>errors(s):</b> 107 <div v-for='item in errors'>{{ item.file.name }} / {{ item.error }}</div> 108 <b>ok:</b> 109 <div v-for='item in result'>{{ item }}</div> 110 </div> 111 </template> 112 </component> 38 <div class='over'> 39 <button @click='pick' :disabled='!can_pick'>pick</button> 40 <span> </span> 41 <button @click='start' :disabled='!can_start'>start</button> 42 <span> </span> 43 <button @click='abort' :disabled='!can_abort'>abort</button> 44 <span> </span> 45 <button @click='reset' :disabled='!can_reset'>reset</button> 46 <p /> 47 <input type='checkbox' v-model='auto_start' id='auto-start' /> 48 <label for='auto-start'> auto-start</label><br /> 49 <input type='checkbox' v-model='auto_reset' id='auto-reset' /> 50 <label for='auto-reset'> auto-reset</label><br /> 51 <input type='checkbox' v-model='keep_going' id='keep-going' /> 52 <label for='keep-going'> keep-going</label><br /> 53 <p /> 54 55 <component class='uploader' :is='UploadZone' target='https://vite.js29a.usermd.net/upload.php' 56 :max-jobs='max_jobs' :auto-start='auto_start' :auto-reset='auto_reset' 57 :keep-going='keep_going' ref='uploader' 58 @update:canPick='(flag: boolean) => can_pick = flag' 59 @update:canStart='(flag: boolean) => can_start = flag' 60 @update:canAbort='(flag: boolean) => can_abort = flag' 61 @update:canReset='(flag: boolean) => can_reset = flag'> 62 <template #idle='{ pick }'> 63 <div class='idle'> 64 idle 65 <br /> 66 <button @click='pick()'>pick</button> 67 </div> 68 </template> 69 70 <template #hover> 71 <div class='hover'> 72 hover 73 </div> 74 </template> 75 76 <template #wait='{ start, queue }'> 77 <div class='wait'> 78 wait 79 <br /> 80 <button @click='pick()'>pick</button> 81 <br /> 82 <button @click='start()'>start</button> 83 <br/> 84 <div v-for='file in queue'>{{ file.name }}</div> 85 </div> 86 </template> 87 88 <template #uploading='{ progress, current, queue, abort, errors }'> 89 <div class='uploading'> 90 uploading 91 <br /> 92 <button @click='abort()'>abort</button> 93 <br /> 94 {{ progress.length }} / {{ current.length }} / {{ queue.length }} 95 <br /> 96 <button @click='abort()'>abort</button> 97 <b>errors:</b> <span v-for='error in errors'>{{ error.file.name }}</span> 98 <b>progress:</b> <div v-for='item in progress'>{{ item }}</div> 99 <b>current:</b> 100 <div v-for='item in current'> 101 {{ item.file.name }}: {{ item.current }} of {{ item.total }} 102 </div> 103 <b>remaining:</b> 104 <div v-for='file in queue'>{{ file.name }}</div> 105 </div> 106 </template> 107 108 <template #done='{ result, reset }'> 109 <div class='done'> 110 done 111 <br /> 112 <button @click='reset()'>reset</button> 113 <br /> 114 <div v-for='item in result'>{{ item }}</div> 115 </div> 116 </template> 117 118 <template #error='{ error, reset }'> 119 <div class='error'> 120 error 121 <br /> 122 <button @click='reset()'>reset</button> 123 <div>{{ error }}</div> 124 </div> 125 </template> 126 127 <template #aborted='{ result, reset }'> 128 <div class='aborted'> 129 aborted 130 <br /> 131 <button @click='reset()'>reset</button> 132 <div v-for='item in result'>{{ item }}</div> 133 </div> 134 </template> 135 136 <template #with-errors='{ result, errors }'> 137 <div class='with-errors'> 138 with errors 139 <br /> 140 <b>errors(s):</b> 141 <div v-for='item in errors'>{{ item.file.name }} / {{ item.error }}</div> 142 <b>ok:</b> 143 <div v-for='item in result'>{{ item }}</div> 144 </div> 145 </template> 146 </component> 147 </div> 113 148 </template> 114 149 115 150 <style scoped> 116 151 117 .uploader { 118 border: 3px dashed #fff; 119 width: 512px; 120 height: 384px; 152 .over { 121 153 position: absolute; 122 154 border-radius: 20px; … … 124 156 left: 50%; 125 157 transform: translate(-50%, -50%); 158 } 159 160 .uploader { 161 border: 3px dashed #fff; 162 width: 512px; 163 height: 384px; 164 display: inline-block; 126 165 } 127 166 -
src/UploadZone.vue
r4b96189 r64249d6 1 1 <script setup lang="ts"> 2 2 3 import { ref, defineProps, withDefaults, defineEmits, getCurrentInstance, defineExpose} from 'vue'3 import { ref, computed, defineProps, withDefaults, defineEmits, getCurrentInstance, defineExpose, watch, nextTick } from 'vue' 4 4 5 5 import $ from 'jQuery' … … 28 28 (e: 'upload:progress', vec: any[]): void 29 29 (e: 'upload:done', vec: any[]): void 30 (e: 'update:canReset', flag: boolean): void 31 (e: 'update:canPick', flag: boolean): void 32 (e: 'update:canStart', flag: boolean): void 33 (e: 'update:canAbort', flag: boolean): void 30 34 }>() 31 35 … … 131 135 132 136 const reset_cb = (): void => { 137 if(mode.value == Mode.m_idle) 138 return 139 133 140 mode.value = Mode.m_idle 134 141 files = [] … … 136 143 137 144 const pick_cb = (): void => { 138 if(mode.value != Mode.m_idle && Mode.value != Mode.m_wait)145 if(mode.value != Mode.m_idle && mode.value != Mode.m_wait) 139 146 return 140 147 … … 168 175 }) 169 176 170 queue.value = queue.value.filter( queue.value,(file) => {177 queue.value = queue.value.filter((file) => { 171 178 return file !== cur 172 179 }) … … 184 191 185 192 xhr.upload.addEventListener('progress', (evt): void => { 186 queue.value.forEach(current.value,(item) => {193 current.value.forEach((item) => { 187 194 if(item.file === cur) { 188 195 item.current = evt.loaded … … 196 203 }) 197 204 .then((res: any) => { 198 current.value = queue.value.filter(current.value,(item) => {205 current.value = current.value.filter((item) => { 199 206 return item.file !== cur 200 207 }) … … 223 230 files = [] // XXX can drop w/o reset 224 231 225 if(errors.value.length) {232 if(errors.value.length) 226 233 if(props.keepGoing || props.keepGoing === '') 227 234 mode.value = Mode.m_with_errors 228 235 else 229 236 mode.value = Mode.m_error 230 }231 237 else 232 238 if(props.autoReset || props.autoReset === '') … … 243 249 .catch((err: any) => { 244 250 if(props.keepGoing || props.keepGoing === '') { 245 current.value = current.value.filter( current.value,(item) => {251 current.value = current.value.filter((item) => { 246 252 return item.file !== cur 247 253 }) … … 269 275 } 270 276 277 const can_pick = computed({ 278 get: () => { 279 return mode.value == Mode.m_idle || mode.value == Mode.m_wait 280 }, 281 set: () => { 282 } 283 }) 284 285 const can_start = computed({ 286 get: () => { 287 return mode.value == Mode.m_wait 288 }, 289 set: () => { 290 } 291 }) 292 293 const can_abort = computed({ 294 get: () => { 295 return mode.value == Mode.m_uploading 296 }, 297 set: () => { 298 } 299 }) 300 301 const can_reset = computed({ 302 get: () => { 303 return mode.value != Mode.m_idle 304 }, 305 set: () => { 306 } 307 }) 308 309 const update_can = (state: Mode): void => { 310 emit('update:canPick', can_pick.value) 311 emit('update:canStart', can_start.value) 312 emit('update:canAbort', can_abort.value) 313 emit('update:canReset', can_reset.value) 314 } 315 316 watch(() => { return mode.value }, (t: Mode, f: Mode) => { update_can(t) } ) 317 318 nextTick(() => { 319 update_can(mode.value) 320 }) 321 271 322 defineExpose({ 272 323 reset: reset_cb, 273 324 start: start_cb, 274 325 pick: pick_cb, 275 abort: abort_cb 326 abort: abort_cb, 327 328 can_pick, 329 can_start, 330 can_abort, 331 can_reset 276 332 }) 277 333
Note:
See TracChangeset
for help on using the changeset viewer.