Changeset d45005e in uz


Ignore:
Timestamp:
2022.10.06 19:55:24 (2 years ago)
Author:
js29a <js29a@…>
Branches:
master
Children:
76e46d7
Parents:
64249d6
Message:

events

Location:
src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • src/UploadTest.vue

    r64249d6 rd45005e  
    3131const abort = (): void => {
    3232  (inst as any).refs.uploader.abort()
     33}
     34
     35const log = (code: string, args: any[]) => {
     36  console.log.apply(null, ['>', code].concat(args))
    3337}
    3438
     
    5963               @update:canStart='(flag: boolean) => can_start = flag'
    6064               @update:canAbort='(flag: boolean) => can_abort = flag'
    61                @update:canReset='(flag: boolean) => can_reset = flag'>
     65               @update:canReset='(flag: boolean) => can_reset = flag'
     66               @debug='(code: string, args: any[]) => log(code, args)'>
    6267      <template #idle='{ pick }'>
    6368        <div class='idle'>
  • src/UploadZone.vue

    r64249d6 rd45005e  
    2222})
    2323
     24enum 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
    2435const emit = defineEmits<{
    25   (e: 'drag:over', evt: any): void
    26   (e: 'drag:out', evt: any): void
    27   (e: 'drop', evt: any, files: any[]): void
    28   (e: 'upload:progress', vec: any[]): void
    29   (e: 'upload:done', vec: any[]): void
    3036  (e: 'update:canReset', flag: boolean): void
    3137  (e: 'update:canPick', flag: boolean): void
    3238  (e: 'update:canStart', flag: boolean): void
    3339  (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
    3456}>()
    3557
     58const 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
    3664const inst = getCurrentInstance()
    3765
    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)
     66const state = ref(State.s_idle)
    5067
    5168const queue = ref([] as any[])
     
    7693      for(const file of evt.dataTransfer.files)
    7794        files.push(file)
    78     else // XXX elem click
     95    else
    7996      for(const file of evt.target.files)
    8097        files.push(file)
     
    84101
    85102const 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_wait
     103  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
    90107  files = files.concat(extract_files(evt))
    91   emit('drop', evt, files)
     108  do_emit('files:add', [evt, files])
    92109  queue.value = files
    93110
     
    97114
    98115const 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)
    104122}
    105123
    106124const drag_out = (evt: any): void => {
    107   if(mode.value != Mode.m_hover)
    108     return
    109 
    110   mode.value = Mode.m_idle
    111   //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)
    113131}
    114132
    115133const 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])
    118138
    119139  aborted = false
    120140
    121   mode.value = Mode.m_uploading
     141  state.value = State.s_uploading
    122142
    123143  results.value = []
     
    135155
    136156const reset_cb = (): void => {
    137   if(mode.value == Mode.m_idle)
    138     return
    139 
    140   mode.value = Mode.m_idle
     157  if(state.value == State.s_idle)
     158    return
     159
     160  state.value = State.s_idle
    141161  files = []
     162  do_emit('files:clear', [])
    142163}
    143164
    144165const 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)
    146167    return
    147168
     
    152173    drop(evt)
    153174  })
     175
    154176  inp.click()
    155177}
    156178
    157179const abort_cb = (): void => {
    158   if(mode.value != Mode.m_uploading)
     180  if(state.value != State.s_uploading)
    159181    return
    160182
     
    178200    return file !== cur
    179201  })
     202
     203  do_emit('upload:progress', progress.value, current.value, queue.value)
    180204
    181205  cur_file += 1
     
    197221          }
    198222        })
     223        do_emit('upload:progress', progress.value, current.value, queue.value)
    199224      })
    200225
     
    207232      })
    208233
     234      do_emit('upload:progress', progress.value, current.value, queue.value)
     235
    209236      progress.value.push(res)
    210237      results.value.push(res)
    211238
    212       emit('upload:progress', progress.value)
    213 
    214239      cur_jobs -= 1
    215240
    216241      if(aborted) {
    217242        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', [])
    220246        }
    221247        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          }
    223252
    224253        return
     
    226255
    227256      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', [])
    231259
    232260        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          }
    235265          else
    236             mode.value = Mode.m_error
     266            state.value = State.s_error
    237267        else
    238268          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          }
    242274
    243275        return
     
    258290        })
    259291
     292        do_emit('upload:error', err)
     293
    260294        cur_jobs -= 1
    261295
    262296        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)
    264299          return
    265300        }
     
    269304      }
    270305      else {
    271         mode.value = Mode.m_error
     306        state.value = State.s_error
    272307        error.value = err
     308        do_emit('upload:error', err)
    273309      }
    274310    })
     
    277313const can_pick = computed({
    278314  get: () => {
    279     return mode.value == Mode.m_idle || mode.value == Mode.m_wait
     315    return state.value == State.s_idle || state.value == State.s_wait
    280316  },
    281317  set: () => {
     
    285321const can_start = computed({
    286322  get: () => {
    287     return mode.value == Mode.m_wait
     323    return state.value == State.s_wait
    288324  },
    289325  set: () => {
     
    293329const can_abort = computed({
    294330  get: () => {
    295     return mode.value == Mode.m_uploading
     331    return state.value == State.s_uploading
    296332  },
    297333  set: () => {
     
    301337const can_reset = computed({
    302338  get: () => {
    303     return mode.value != Mode.m_idle
     339    return state.value != State.s_idle
    304340  },
    305341  set: () => {
     
    307343})
    308344
    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 })
     345const 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
     354watch(() => { return state.value }, (t: State, f: State) => { nextTick(on_state_changed) } )
     355
     356nextTick(on_state_changed)
    321357
    322358defineExpose({
     
    336372<template bindings="">
    337373  <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'
    341377          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"'
    343379          v-bind:progress='progress'
    344380          v-bind:current='current'
     
    346382          v-bind:errors='errors'
    347383          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'
    352388          v-bind:reset='reset_cb' />
    353389  </component>
Note: See TracChangeset for help on using the changeset viewer.