Changeset d45005e in uz for src/UploadZone.vue
- Timestamp:
- 2022.10.06 19:55:24 (2 years ago)
- Branches:
- master
- Children:
- 76e46d7
- Parents:
- 64249d6
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/UploadZone.vue
r64249d6 rd45005e 22 22 }) 23 23 24 enum State { 25 s_idle = 'idle', 26 s_hover = 'hover', 27 s_wait = 'wait', 28 s_uploading = 'uploading', 29 s_done = 'done', 30 s_error = 'error', 31 s_with_errors = 'with_errors', 32 s_aborted = 'aborted' 33 } 34 24 35 const emit = defineEmits<{ 25 (e: 'drag:over', evt: any): void26 (e: 'drag:out', evt: any): void27 (e: 'drop', evt: any, files: any[]): void28 (e: 'upload:progress', vec: any[]): void29 (e: 'upload:done', vec: any[]): void30 36 (e: 'update:canReset', flag: boolean): void 31 37 (e: 'update:canPick', flag: boolean): void 32 38 (e: 'update:canStart', flag: boolean): void 33 39 (e: 'update:canAbort', flag: boolean): void 40 (e: 'update:state', new_state: State): void 41 42 (e: 'files:add', evt: any, files: any[]): void 43 (e: 'files:clear'): void 44 45 (e: 'drag:over', evt: any): void 46 (e: 'drag:out', evt: any): void 47 48 (e: 'upload:start', queue: any[]): void 49 (e: 'upload:progress', progress: any[], current: any[], queue: any[]): void 50 51 (e: 'upload:done', result: any[], errors: any[]): void 52 (e: 'upload:error', error: any): void 53 (e: 'upload:aborted', progress: any[], current: any[], queue: any[], errors: any[]): void 54 55 (e: 'debug', ... args: any[]): void 34 56 }>() 35 57 58 const do_emit = (code: string, ... args: any[]) => { 59 // @ts-ignore 60 emit.apply(null, [code].concat(args)) 61 emit.apply(null, ['debug', code, args]) 62 } 63 36 64 const inst = getCurrentInstance() 37 65 38 enum Mode { 39 m_idle = 'idle', 40 m_hover = 'hover', 41 m_wait = 'wait', 42 m_uploading = 'uploading', 43 m_done = 'done', 44 m_error = 'error', 45 m_with_errors = 'with_errors', // XXX av when keep-going set 46 m_aborted = 'aborted' 47 } 48 49 const mode = ref('idle' as Mode) 66 const state = ref(State.s_idle) 50 67 51 68 const queue = ref([] as any[]) … … 76 93 for(const file of evt.dataTransfer.files) 77 94 files.push(file) 78 else // XXX elem click95 else 79 96 for(const file of evt.target.files) 80 97 files.push(file) … … 84 101 85 102 const drop = (evt: any): void => { 86 if( mode.value != Mode.m_hover && mode.value != Mode.m_idle && mode.value != Mode.m_wait)87 return 88 89 mode.value = Mode.m_wait103 if(state.value != State.s_hover && state.value != State.s_idle && state.value != State.s_wait) 104 return 105 106 state.value = State.s_wait 90 107 files = files.concat(extract_files(evt)) 91 emit('drop', evt, files)108 do_emit('files:add', [evt, files]) 92 109 queue.value = files 93 110 … … 97 114 98 115 const drag_over = (evt: any): void => { 99 if(mode.value != Mode.m_idle) 100 return 101 102 mode.value = Mode.m_hover 103 emit('drag:over', evt) 116 if(state.value != State.s_idle) 117 return 118 119 state.value = State.s_hover 120 121 do_emit('drag:over', evt) 104 122 } 105 123 106 124 const drag_out = (evt: any): void => { 107 if( mode.value != Mode.m_hover)108 return 109 110 mode.value = Mode.m_idle111 //console.log('out', evt) 112 emit('drag:out', evt)125 if(state.value != State.s_hover) 126 return 127 128 state.value = State.s_idle 129 130 do_emit('drag:out', evt) 113 131 } 114 132 115 133 const start_cb = (): void => { 116 if(mode.value != Mode.m_wait) 117 return 134 if(state.value != State.s_wait) 135 return 136 137 do_emit('upload:start', [files]) 118 138 119 139 aborted = false 120 140 121 mode.value = Mode.m_uploading141 state.value = State.s_uploading 122 142 123 143 results.value = [] … … 135 155 136 156 const reset_cb = (): void => { 137 if( mode.value == Mode.m_idle)138 return 139 140 mode.value = Mode.m_idle157 if(state.value == State.s_idle) 158 return 159 160 state.value = State.s_idle 141 161 files = [] 162 do_emit('files:clear', []) 142 163 } 143 164 144 165 const pick_cb = (): void => { 145 if( mode.value != Mode.m_idle && mode.value != Mode.m_wait)166 if(state.value != State.s_idle && state.value != State.s_wait) 146 167 return 147 168 … … 152 173 drop(evt) 153 174 }) 175 154 176 inp.click() 155 177 } 156 178 157 179 const abort_cb = (): void => { 158 if( mode.value != Mode.m_uploading)180 if(state.value != State.s_uploading) 159 181 return 160 182 … … 178 200 return file !== cur 179 201 }) 202 203 do_emit('upload:progress', progress.value, current.value, queue.value) 180 204 181 205 cur_file += 1 … … 197 221 } 198 222 }) 223 do_emit('upload:progress', progress.value, current.value, queue.value) 199 224 }) 200 225 … … 207 232 }) 208 233 234 do_emit('upload:progress', progress.value, current.value, queue.value) 235 209 236 progress.value.push(res) 210 237 results.value.push(res) 211 238 212 emit('upload:progress', progress.value)213 214 239 cur_jobs -= 1 215 240 216 241 if(aborted) { 217 242 if(props.autoReset || props.autoReset === '') { 218 mode.value = Mode.m_idle 219 files = [] // # XXX can drop w/o reset 243 state.value = State.s_idle 244 files = [] 245 do_emit('files:clear', []) 220 246 } 221 247 else 222 mode.value = Mode.m_aborted 248 if(state.value != State.s_aborted) { 249 state.value = State.s_aborted 250 do_emit('upload:aborted', progress.value, current.value, queue.value, errors.value) 251 } 223 252 224 253 return … … 226 255 227 256 if(cur_file == files.length && !cur_jobs) { 228 emit('upload:done', results.value) 229 230 files = [] // XXX can drop w/o reset 257 files = [] 258 do_emit('files:clear', []) 231 259 232 260 if(errors.value.length) 233 if(props.keepGoing || props.keepGoing === '') 234 mode.value = Mode.m_with_errors 261 if(props.keepGoing || props.keepGoing === '') { 262 state.value = State.s_with_errors 263 do_emit('upload:done', results.value, errors.value) 264 } 235 265 else 236 mode.value = Mode.m_error266 state.value = State.s_error 237 267 else 238 268 if(props.autoReset || props.autoReset === '') 239 mode.value = Mode.m_idle 240 else 241 mode.value = Mode.m_done 269 state.value = State.s_idle 270 else { 271 state.value = State.s_done 272 do_emit('upload:done', results.value, errors.value) 273 } 242 274 243 275 return … … 258 290 }) 259 291 292 do_emit('upload:error', err) 293 260 294 cur_jobs -= 1 261 295 262 296 if(cur_file == files.length && !cur_jobs) { 263 mode.value = Mode.m_with_errors 297 state.value = State.s_with_errors 298 do_emit('upload:done', results.value, errors.value) 264 299 return 265 300 } … … 269 304 } 270 305 else { 271 mode.value = Mode.m_error306 state.value = State.s_error 272 307 error.value = err 308 do_emit('upload:error', err) 273 309 } 274 310 }) … … 277 313 const can_pick = computed({ 278 314 get: () => { 279 return mode.value == Mode.m_idle || mode.value == Mode.m_wait315 return state.value == State.s_idle || state.value == State.s_wait 280 316 }, 281 317 set: () => { … … 285 321 const can_start = computed({ 286 322 get: () => { 287 return mode.value == Mode.m_wait323 return state.value == State.s_wait 288 324 }, 289 325 set: () => { … … 293 329 const can_abort = computed({ 294 330 get: () => { 295 return mode.value == Mode.m_uploading331 return state.value == State.s_uploading 296 332 }, 297 333 set: () => { … … 301 337 const can_reset = computed({ 302 338 get: () => { 303 return mode.value != Mode.m_idle339 return state.value != State.s_idle 304 340 }, 305 341 set: () => { … … 307 343 }) 308 344 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 })345 const on_state_changed = (): void => { 346 do_emit('update:canPick', can_pick.value) 347 do_emit('update:canStart', can_start.value) 348 do_emit('update:canAbort', can_abort.value) 349 do_emit('update:canReset', can_reset.value) 350 351 do_emit('update:state', state.value) 352 } 353 354 watch(() => { return state.value }, (t: State, f: State) => { nextTick(on_state_changed) } ) 355 356 nextTick(on_state_changed) 321 357 322 358 defineExpose({ … … 336 372 <template bindings=""> 337 373 <component is='props.tag' @drop.prevent='drop' @dragover.prevent='drag_over' @dragleave.prevent='drag_out'> 338 <slot name='idle' v-if=' mode == "idle"' v-bind:pick='pick_cb' />339 <slot name='hover' v-if=' mode == "hover"' />340 <slot name='wait' v-if=' mode == "wait"' v-bind:start='start_cb'374 <slot name='idle' v-if='state == "idle"' v-bind:pick='pick_cb' /> 375 <slot name='hover' v-if='state == "hover"' /> 376 <slot name='wait' v-if='state == "wait"' v-bind:start='start_cb' 341 377 v-bind:queue='queue' v-bind:reset='reset_cb' /> 342 <slot name='uploading' v-if=' mode == "uploading"'378 <slot name='uploading' v-if='state == "uploading"' 343 379 v-bind:progress='progress' 344 380 v-bind:current='current' … … 346 382 v-bind:errors='errors' 347 383 v-bind:abort='abort_cb' /> 348 <slot name='done' v-if=' mode == "done"' v-bind:result='results' v-bind:reset='reset_cb' />349 <slot name='error' v-if=' mode == "error"' v-bind:error='error' v-bind:reset='reset_cb' />350 <slot name='aborted' v-if=' mode == "aborted"' v-bind:result='results' v-bind:reset='reset_cb' />351 <slot name='with-errors' v-if=' mode == "with_errors"' v-bind:result='results' v-bind:errors='errors'384 <slot name='done' v-if='state == "done"' v-bind:result='results' v-bind:reset='reset_cb' /> 385 <slot name='error' v-if='state == "error"' v-bind:error='error' v-bind:reset='reset_cb' /> 386 <slot name='aborted' v-if='state == "aborted"' v-bind:result='results' v-bind:reset='reset_cb' /> 387 <slot name='with-errors' v-if='state == "with_errors"' v-bind:result='results' v-bind:errors='errors' 352 388 v-bind:reset='reset_cb' /> 353 389 </component>
Note:
See TracChangeset
for help on using the changeset viewer.