domShowInputAndGetFiles.mjs

import genPm from './genPm.mjs'
import genID from './genID.mjs'
import domRemove from './domRemove.mjs'
import domGetFileAccept from './domGetFileAccept.mjs'
import domAppend from './domAppend.mjs'
import domFind from './domFind.mjs'
import domGetFiles from './domGetFiles.mjs'
import domTriggerEvent from './domTriggerEvent.mjs'


/**
 * 前端開啟上傳視窗並回傳檔案
 *
 * Unit Test: {@link https://github.com/yuda-lyu/wsemi/blob/master/test/domShowInputAndGetFiles.test.mjs Github}
 * @memberOf wsemi
 * @param {String|Array} [kind='*'] 輸入檔案類型或種類字串或陣列,可選'docums'、'compress'、'image'、'data',若給予'common'則代表前述4種,也可給予有限的副檔名(詳見getFileAccept),預設為全部'*'
 * @param {Boolean} [multiple=false] 輸入是否可選多檔案,預設為false
 * @param {Number} [sizelimit=1000] 輸入檔案大小上線,單位mb,預設為1000mb(約1g)
 * @returns {Promise} 回傳Promise,resolve為各檔案陣列,無reject
 * @example
 * need test in browser
 *
 * domShowInputAndGetFiles()
 *     .then((files)=>{})
 *
 */
function domShowInputAndGetFiles(kind = '*', multiple = false, sizelimit = 1000) {

    let pm = genPm()

    //id
    let id = 'drf' + genID() //若全英文數字可能會導致出現特例如hex問題, 添加字首以避免

    //gname
    let gname = 'GrpDomReadFile'

    //remove
    domRemove(`[name=${gname}]`)

    //acp
    let acp = domGetFileAccept(kind)

    //mp
    let mp = multiple ? 'multiple' : ''

    //append html
    let hidehtml = `<div name="${gname}" style="position:relative; width:0px; height:0px; overflow:hidden;"><input id="${id}" type="file" accept="${acp}" ${mp} style="opacity:0; position:absolute; top:-10000px; left:-10000px;"></div>`
    domAppend(document.querySelector('body'), hidehtml)

    //inp
    let inp = domFind('#' + id)

    //evChange
    function evChange() {

        //ele
        let ele = this

        //domGetFiles
        let rs = domGetFiles(ele, sizelimit)

        //resolve
        pm.resolve(rs)

        //remove event
        inp.removeEventListener('change', evChange)

        //remove element
        domRemove(`[name=${gname}]`)

    }

    //change
    inp.addEventListener('change', evChange)

    //click
    domTriggerEvent(inp, 'click')

    return pm
}


export default domShowInputAndGetFiles