jobsys-mpower
Version:
Enhanced component based on Taro & NutUI
1 lines • 24.8 kB
Source Map (JSON)
{"version":3,"file":"hooks.cjs","sources":["../hooks/network.js","../hooks/utils.js","../hooks/form.js","../hooks/datetime.js","../hooks/resolver.js"],"sourcesContent":["import axios from \"axios\"\r\nimport Taro from \"@tarojs/taro\"\r\n\r\n/**\r\n * 请求返回状态码\r\n * @type {{STATE_CODE_NOT_FOUND: string, STATE_CODE_SUCCESS: string, STATE_CODE_FAIL: string, STATE_CODE_INFO_NOT_COMPLETE: string, STATE_CODE_NOT_ALLOWED: string}}\r\n */\r\nexport const STATUS = {\r\n\tSTATE_CODE_SUCCESS: \"SUCCESS\", // 成功\r\n\tSTATE_CODE_FAIL: \"FAIL\", // 失败\r\n\tSTATE_CODE_NOT_FOUND: \"NOT_FOUND\", // 找不到资源\r\n\tSTATE_CODE_INFO_NOT_COMPLETE: \"INCOMPLETE\", // 信息不完整\r\n\tSTATE_CODE_NOT_ALLOWED: \"NOT_ALLOWED\", //没有权限\r\n}\r\n\r\n/**\r\n * 通用 AJAX 请求\r\n * @param {Object} [fetcher] - 用于存储请求状态的对象\r\n * @returns {{post(*=, *=, *=): Promise<unknown>, get(*=, *=): Promise<unknown>}}\r\n */\r\nexport function useFetch(fetcher) {\r\n\tif (!fetcher) {\r\n\t\tfetcher = {}\r\n\t}\r\n\tfetcher.loading = true\r\n\r\n\treturn {\r\n\t\t/**\r\n\t\t * get请求\r\n\t\t * @param url\r\n\t\t * @param {Object} [config] - axios config\r\n\t\t * @returns {Promise<unknown>}\r\n\t\t */\r\n\t\tget(url, config) {\r\n\t\t\treturn new Promise((resolve, reject) => {\r\n\t\t\t\taxios\r\n\t\t\t\t\t.get(url, config)\r\n\t\t\t\t\t.then((res) => {\r\n\t\t\t\t\t\tresolve(res)\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.catch((err) => {\r\n\t\t\t\t\t\treject(err)\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.finally(() => {\r\n\t\t\t\t\t\tfetcher.loading = false\r\n\t\t\t\t\t})\r\n\t\t\t})\r\n\t\t},\r\n\t\t/**\r\n\t\t * post请求\r\n\t\t * @param {string} url\r\n\t\t * @param {Object} data\r\n\t\t * @param {Object} [config] - axios config\r\n\t\t * @returns {Promise<unknown>}\r\n\t\t */\r\n\t\tpost(url, data, config) {\r\n\t\t\treturn new Promise((resolve, reject) => {\r\n\t\t\t\taxios\r\n\t\t\t\t\t.post(url, data, config)\r\n\t\t\t\t\t.then((res) => {\r\n\t\t\t\t\t\tresolve(res)\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.catch((err) => {\r\n\t\t\t\t\t\treject(err)\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.finally(() => {\r\n\t\t\t\t\t\tfetcher.loading = false\r\n\t\t\t\t\t})\r\n\t\t\t})\r\n\t\t},\r\n\t}\r\n}\r\n\r\n/**\r\n * 分页请求\r\n * @param {object} pagination 分页对象\r\n * @param {string} pagination.uri 请求地址\r\n * @param {object} [pagination.params] 请求参数\r\n * @param {number} [pagination.page] 当前页码\r\n * @param {string} [pagination.finishedText] 加载完毕文本\r\n * @param {boolean} [pagination.loading] 加载状态\r\n * @param {boolean} [pagination.finished] 加载完毕\r\n * @param {boolean} [pagination.error] 是否错误\r\n * @param {string} [pagination.errorText] 错误文本\r\n * @param {boolean} [pagination.empty] 是否无内容\r\n * @param {array} [pagination.items] 分页数据\r\n *\r\n * @param {boolean} refresh 是否刷新\r\n * @param {function} [process] 数据处理函数\r\n *\r\n */\r\nexport const usePage = async (pagination, refresh, process) => {\r\n\tpagination.finishedText = pagination.finishedText || \"加载完毕\"\r\n\tpagination.loading = true\r\n\r\n\tif (!pagination.uri) {\r\n\t\tconsole.error(\"URI is required in pagination\")\r\n\t\treturn\r\n\t}\r\n\r\n\tlet res = {}\r\n\ttry {\r\n\t\tTaro.showLoading({ title: \"加载中...\", mask: true })\r\n\t\tres = await useFetch().get(pagination.uri, {\r\n\t\t\tparams: { ...(pagination.params || {}), page: refresh || !pagination.page ? 1 : pagination.page + 1 },\r\n\t\t})\r\n\t} catch (e) {\r\n\t\tpagination.loading = false\r\n\t\tpagination.finished = false\r\n\t\tpagination.error = true\r\n\t\treturn\r\n\t} finally {\r\n\t\tTaro.hideLoading()\r\n\t}\r\n\r\n\tif (res.status !== STATUS.STATE_CODE_SUCCESS) {\r\n\t\tpagination.loading = false\r\n\t\tpagination.error = true\r\n\t\tpagination.errorText = res.result\r\n\t\treturn\r\n\t}\r\n\r\n\tlet result\r\n\r\n\tif (process) {\r\n\t\tresult = process(res)\r\n\t} else {\r\n\t\tresult = res.result\r\n\t}\r\n\r\n\tlet items = result.data\r\n\r\n\tif (!refresh && pagination.items) {\r\n\t\titems = pagination.items.concat(items)\r\n\t}\r\n\r\n\tconst currentPage = result.current_page || result.current || result.page || 1\r\n\tconst lastPage = result.last_page || result.lastPage || result.pages || 0\r\n\tconst totalSize = result.total_size || result.totalSize || result.total || 0\r\n\r\n\tpagination.loading = false\r\n\tpagination.error = false\r\n\tpagination.page = currentPage\r\n\tpagination.items = items\r\n\tpagination.finished = lastPage === 0 || lastPage === currentPage\r\n\tpagination.empty = totalSize === 0\r\n}\r\n\r\nexport default {\r\n\tSTATUS,\r\n\tuseFetch,\r\n\tusePage,\r\n}\r\n","import { find, reduce } from \"lodash-es\"\r\n\r\n/**\r\n * 从 options 中根据 value 获取 text\r\n * @param value\r\n * @param options\r\n * @return {*|string|string}\r\n */\r\nexport function useTextFromOptionsValue(value, options) {\r\n\tif (!options) {\r\n\t\treturn \"\"\r\n\t}\r\n\tconst option = options.find((option) => option.value === value)\r\n\treturn option ? option.text : \"\"\r\n}\r\n\r\n/**\r\n * 从嵌套的 options 中根据 value 获取 text, 如 [1, 3] => [\"东\", \"南\"]\r\n *\r\n * @param {Array} options - 嵌套的选项\r\n * @param {Array} values - 需要查找的值\r\n * @param {Object} [adapter={value: \"value\",label: \"label\",children: \"children\"}] - 选项适配器\r\n * @return Array\r\n */\r\nexport function useFindTextsInValues(options, values, adapter) {\r\n\tadapter = adapter || {\r\n\t\tvalue: \"value\",\r\n\t\tlabel: \"text\",\r\n\t\tchildren: \"children\",\r\n\t}\r\n\r\n\tconst labels = []\r\n\r\n\tfunction recursiveSearch(node) {\r\n\t\tif (values.includes(node[adapter.value])) {\r\n\t\t\tlabels.push(node[adapter.label])\r\n\t\t}\r\n\r\n\t\tif (node[adapter.children]?.length) {\r\n\t\t\tnode[adapter.children].forEach((child) => {\r\n\t\t\t\trecursiveSearch(child)\r\n\t\t\t})\r\n\t\t}\r\n\t}\r\n\r\n\toptions.forEach((item) => {\r\n\t\trecursiveSearch(item)\r\n\t})\r\n\r\n\treturn labels\r\n}\r\n\r\n/**\r\n * 从嵌套的 options 中根据 value 获取 label\r\n * @param {Array} options\r\n * @param {Array} path\r\n * @param {Object} [adapter]\r\n * @return {*}\r\n */\r\nexport function useFindLabelsFromPath(options, path, adapter) {\r\n\tadapter = adapter || {\r\n\t\tvalue: \"value\",\r\n\t\tlabel: \"text\",\r\n\t\tchildren: \"children\",\r\n\t}\r\n\r\n\tlet labels = []\r\n\treduce(\r\n\t\tpath,\r\n\t\t(acc, value) => {\r\n\t\t\tconst item = find(acc, { [adapter.value]: value })\r\n\t\t\tif (item) {\r\n\t\t\t\tlabels.push(item[adapter.label])\r\n\t\t\t\treturn item[adapter.children]\r\n\t\t\t}\r\n\t\t},\r\n\t\toptions,\r\n\t)\r\n\treturn labels\r\n}\r\n\r\n/**\r\n * [移动端适配]\r\n * 从嵌套的 options 中根据 value 获取 text\r\n * @param {Array} options\r\n * @param {Array} path\r\n * @param {Object} [adapter]\r\n * @return {*}\r\n */\r\nexport function useFindTextsFromPath(options, path, adapter) {\r\n\tadapter = adapter || {\r\n\t\tvalue: \"value\",\r\n\t\tlabel: \"text\",\r\n\t\tchildren: \"children\",\r\n\t}\r\n\treturn useFindLabelsFromPath(options, path, adapter)\r\n}\r\n\r\n/**\r\n * 从嵌套的 options 中根据 value 获取整个 values 路径, 如地区路径: 440113 => [440000, 440100, 440113]\r\n * @param options\r\n * @param value\r\n * @param adapter\r\n * @return {*}\r\n */\r\nexport function useFindParentValues(options, value, adapter) {\r\n\tadapter = adapter || {\r\n\t\tvalue: \"value\",\r\n\t\tlabel: \"text\",\r\n\t\tchildren: \"children\",\r\n\t}\r\n\r\n\tconst values = []\r\n\r\n\tfunction findParentValues(options, value, values) {\r\n\t\tfor (const option of options) {\r\n\t\t\tif (option[adapter.value] === value) {\r\n\t\t\t\tvalues.unshift(option[adapter.value])\r\n\t\t\t\tbreak\r\n\t\t\t} else if (option[adapter.children]) {\r\n\t\t\t\tconst childResult = findParentValues(option[adapter.children], value, values)\r\n\t\t\t\tif (childResult.length > 0) {\r\n\t\t\t\t\tvalues.unshift(option[adapter.value])\r\n\t\t\t\t\tbreak\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn values\r\n\t}\r\n\r\n\treturn findParentValues(options, value, values)\r\n}\r\n","import { cloneDeep, isArray, isBoolean, isFunction, isObject, isString, isUndefined } from \"lodash-es\"\r\nimport { STATUS } from \"./network\"\r\nimport Taro from \"@tarojs/taro\"\r\nimport dayjs from \"dayjs\"\r\n\r\nconst { STATE_CODE_FAIL, STATE_CODE_INFO_NOT_COMPLETE, STATE_CODE_NOT_FOUND, STATE_CODE_NOT_ALLOWED, STATE_CODE_SUCCESS } = STATUS\r\n\r\n/**\r\n * 创建一个隐藏的表单\r\n *\r\n * @param {Object} options\r\n * @param {string} options.url\r\n * @param {Object} options.data\r\n * @param {string} [options.method]\r\n * @param {string} options.csrfToken\r\n * @returns {HTMLFormElement}\r\n */\r\nexport function useHiddenForm(options) {\r\n\tconst { url, data, csrfToken } = options\r\n\tlet { method } = options\r\n\r\n\tmethod = method || \"post\"\r\n\r\n\tconst form = document.createElement(\"form\")\r\n\tform.action = url\r\n\tform.method = method\r\n\tform.target = \"_blank\"\r\n\tform.style.display = \"none\"\r\n\r\n\tObject.keys(data).forEach((key) => {\r\n\t\tconst input = document.createElement(\"input\")\r\n\t\tinput.type = \"hidden\"\r\n\t\tinput.name = key\r\n\t\tinput.value = data[key]\r\n\t\tform.appendChild(input)\r\n\t})\r\n\r\n\tif (!csrfToken) {\r\n\t\tconst input = document.createElement(\"input\")\r\n\t\tinput.type = \"hidden\"\r\n\t\tinput.name = \"_token\"\r\n\t\tinput.value = document.querySelector('meta[name=\"csrf-token\"]').getAttribute(\"content\")\r\n\t\tform.appendChild(input)\r\n\t}\r\n\r\n\tdocument.body.appendChild(form)\r\n\r\n\treturn form\r\n}\r\n\r\n/**\r\n * 处理请求结果\r\n *\r\n * @param {object} res 请求结果\r\n * @param {string} res.status 请求结果状态\r\n * @param {*} res.result 请求结果信息\r\n * @param {Object.<string, string|function>} ops 状态的处理对象\r\n */\r\nexport function useProcessStatus(res, ops) {\r\n\tconst { status } = res\r\n\tconst msg = res.result\r\n\tconst predefined = {}\r\n\tpredefined.default = \"请求失败, 请检查数据并重试\"\r\n\tpredefined[STATE_CODE_FAIL] = \"系统错误,请稍候再试\"\r\n\tpredefined[STATE_CODE_NOT_FOUND] = \"请求的内容不存在\"\r\n\tpredefined[STATE_CODE_INFO_NOT_COMPLETE] = \"信息不完整\"\r\n\tpredefined[STATE_CODE_NOT_ALLOWED] = \"没有权限\"\r\n\r\n\t// 有几个常用的自定义名称\r\n\tconst special = {\r\n\t\t[STATE_CODE_SUCCESS]: \"success\",\r\n\t}\r\n\r\n\tconst op = ops[status] || ops[special[status]] || predefined[status] || predefined.def\r\n\r\n\tif (isString(op)) {\r\n\t\tif (status === STATE_CODE_SUCCESS) {\r\n\t\t\tTaro.showToast({\r\n\t\t\t\ttitle: op,\r\n\t\t\t\ticon: \"success\",\r\n\t\t\t\tduration: 2000,\r\n\t\t\t})\r\n\t\t} else {\r\n\t\t\tTaro.showToast({\r\n\t\t\t\ttitle: msg || op,\r\n\t\t\t\ticon: \"none\",\r\n\t\t\t\tduration: 2000,\r\n\t\t\t})\r\n\t\t}\r\n\t} else if (isFunction(op)) {\r\n\t\top()\r\n\t}\r\n}\r\n\r\n/**\r\n * 处理正确请求结果\r\n *\r\n * @param {object} res 请求结果\r\n * @param {string} res.status 请求结果状态\r\n * @param {*} res.result 请求结果信息\r\n * @param {string|function} success 状态的处理对象\r\n */\r\nexport function useProcessStatusSuccess(res, success) {\r\n\tuseProcessStatus(res, { success })\r\n}\r\n\r\n/**\r\n * 处理表单提交失败\r\n * @param {*} e\r\n */\r\nexport function useFormFail(e) {\r\n\tif (e && e.errorFields) {\r\n\t\te.errorFields.forEach((item) => {\r\n\t\t\tTaro.showToast({\r\n\t\t\t\ttitle: item.errors.join(\" \"),\r\n\t\t\t\ticon: \"none\",\r\n\t\t\t\tduration: 2000,\r\n\t\t\t})\r\n\t\t})\r\n\t} else if (!(e && e.response)) {\r\n\t\tTaro.showToast({\r\n\t\t\ttitle: \"请检查填写项\",\r\n\t\t\ticon: \"error\",\r\n\t\t\tduration: 2000,\r\n\t\t})\r\n\t} else {\r\n\t\tTaro.showToast({\r\n\t\t\ttitle: \"网络异常\",\r\n\t\t\ticon: \"error\",\r\n\t\t\tduration: 2000,\r\n\t\t})\r\n\t}\r\n}\r\n\r\n/**\r\n * 处理表单数据\r\n * @param {Object} form\r\n * @param {Object} [format] 需要处理的类型\r\n * @param {boolean|string|Function} [format.date] `true`: 转成时间戳,`string`: 为 Format 格式, 如 `\"YYYY-MM-DD\"`, `function`: 自定义处理函数, 参数为 dayjs 对象\r\n * @param {boolean} [format.boolean] 布尔值处理, 如果开启则 `true` 转成 1, `false` 转成 0\r\n * @param {string|Function} [format.attachment] `string`: 附件字段名, `function`: 自定义处理函数, 参数为附件对象\r\n * @return {Object}\r\n */\r\nexport function useFormFormat(form, format) {\r\n\t//必须先 Copy form, 否则会改变 vm model 里的引用值而导致出错\r\n\tconst newForm = cloneDeep(form)\r\n\tformat = format || {}\r\n\tconst formatter = (obj) => {\r\n\t\tfor (let key in obj) {\r\n\t\t\t//日期处理\r\n\r\n\t\t\tlet date\r\n\t\t\tif (dayjs.isDayjs(obj[key])) {\r\n\t\t\t\tdate = obj[key]\r\n\t\t\t} else if (Object.prototype.toString.call(obj[key]) === \"[object Date]\") {\r\n\t\t\t\tdate = dayjs(obj[key])\r\n\t\t\t}\r\n\r\n\t\t\tif (date && format.date) {\r\n\t\t\t\tif (isString(format.date)) {\r\n\t\t\t\t\tobj[key] = date.format(format.date)\r\n\t\t\t\t} else if (isFunction(format.date)) {\r\n\t\t\t\t\tobj[key] = format.date(date)\r\n\t\t\t\t} else {\r\n\t\t\t\t\tobj[key] = obj[key].unix()\r\n\t\t\t\t}\r\n\t\t\t\tcontinue\r\n\t\t\t}\r\n\r\n\t\t\t//布尔值处理\r\n\t\t\tif (isBoolean(obj[key]) && format.boolean) {\r\n\t\t\t\tif (format.boolean === true) {\r\n\t\t\t\t\tobj[key] = obj[key] ? 1 : 0\r\n\t\t\t\t} else if (Array.isArray(format.boolean)) {\r\n\t\t\t\t\tobj[key] = obj[key] ? format.boolean?.[0] || 1 : format.boolean?.[1] || 0\r\n\t\t\t\t}\r\n\t\t\t\tcontinue\r\n\t\t\t}\r\n\r\n\t\t\t//附件处理\r\n\t\t\tif (format.attachment) {\r\n\t\t\t\tconst checker = format.attachment\r\n\t\t\t\tif (isObject(obj[key]) && isString(checker) && !isUndefined(obj[key][checker])) {\r\n\t\t\t\t\tobj[key] = obj[key][checker]\r\n\t\t\t\t\tcontinue\r\n\t\t\t\t} else if (isObject(obj[key]) && isFunction(checker)) {\r\n\t\t\t\t\tobj[key] = checker(obj[key])\r\n\t\t\t\t\tcontinue\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t//数组处理\r\n\t\t\tif (isArray(obj[key])) {\r\n\t\t\t\tfor (let index in obj[key]) {\r\n\t\t\t\t\tobj[key][index] = formatter(obj[key][index], format)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn obj\r\n\t}\r\n\r\n\treturn formatter(newForm)\r\n}\r\n\r\nexport default {\r\n\tuseHiddenForm,\r\n\tuseProcessStatus,\r\n\tuseProcessStatusSuccess,\r\n\tuseFormFail,\r\n\tuseFormFormat,\r\n}\r\n","import dayjs from \"dayjs\"\r\nimport { isString } from \"lodash-es\"\r\n\r\n/**\r\n * 根据格式创建 Dayjs 对象\r\n * @param {string|number} date\r\n * @param {string} [format] - 日期格式\r\n * @return {dayjs.Dayjs}\r\n */\r\nexport function useDayjs(date, format) {\r\n\treturn format ? dayjs(date, format) : dayjs(date)\r\n}\r\n\r\n/**\r\n * 格式化日期\r\n * @param {dayjs.Dayjs|Date} date\r\n * @param {string} format\r\n * @return {string}\r\n */\r\nexport function useDateFormat(date, format) {\r\n\tif (!date) {\r\n\t\treturn \"\"\r\n\t}\r\n\tif (!dayjs.isDayjs(date)) {\r\n\t\tdate = dayjs(date)\r\n\t}\r\n\r\n\treturn date.format(format || \"YYYY-MM-DD HH:mm\")\r\n}\r\n\r\n/**\r\n * 获取日期的 Unix 时间戳\r\n * @param {dayjs.Dayjs|Date} date\r\n * @return {number|string}\r\n */\r\nexport function useDateUnix(date) {\r\n\tif (!date) {\r\n\t\treturn \"\"\r\n\t}\r\n\tif (!dayjs.isDayjs(date)) {\r\n\t\tdate = dayjs(date)\r\n\t}\r\n\r\n\treturn date.unix()\r\n}\r\n\r\n/**\r\n * 根据时间戳格式化日期\r\n * @param timestamp 时间戳\r\n * @param [format] 日期格式\r\n * @return {string}\r\n */\r\nexport function useTimestampFormat(timestamp, format) {\r\n\tif (timestamp && isString(timestamp)) {\r\n\t\ttimestamp = parseInt(timestamp)\r\n\t}\r\n\r\n\tif (timestamp < 9999999999) {\r\n\t\ttimestamp *= 1000\r\n\t}\r\n\r\n\treturn useDateFormat(new Date(timestamp), format)\r\n}\r\n","const mpFunctions = [\"showToast\", \"showNotify\", \"showDialog\", \"showImagePreview\"]\r\n\r\nfunction getMpResolved(name, options) {\r\n\tconsole.log(name, \"MpUIResolver\", options)\r\n\treturn {\r\n\t\tname,\r\n\t\tfrom: \"jobsys-mpower\",\r\n\t\tsideEffects: \"jobsys/dist/style.css\",\r\n\t}\r\n}\r\n\r\n/**\r\n * Resolver for NutUI 4.0+\r\n *\r\n * @link https://github.com/jdf2e/nutui\r\n */\r\nexport function MpUIResolver(options = {}) {\r\n\treturn {\r\n\t\ttype: \"component\",\r\n\t\tresolve: (name) => {\r\n\t\t\tconst { autoImport = false } = options\r\n\r\n\t\t\tif (autoImport && mpFunctions.includes(name)) return getMpResolved(name, options)\r\n\r\n\t\t\tconsole.log(\"component\", name)\r\n\t\t\tif (name.startsWith(\"Mp\")) return getMpResolved(name.slice(2), options)\r\n\t\t},\r\n\t}\r\n}\r\n"],"names":["STATUS","useFetch","fetcher","url","config","resolve","reject","axios","res","err","data","usePage","pagination","refresh","process","Taro","result","items","currentPage","lastPage","totalSize","useTextFromOptionsValue","value","options","option","useFindTextsInValues","values","adapter","labels","recursiveSearch","node","_a","child","item","useFindLabelsFromPath","path","reduce","acc","find","useFindTextsFromPath","useFindParentValues","findParentValues","STATE_CODE_FAIL","STATE_CODE_INFO_NOT_COMPLETE","STATE_CODE_NOT_FOUND","STATE_CODE_NOT_ALLOWED","STATE_CODE_SUCCESS","useHiddenForm","csrfToken","method","form","key","input","useProcessStatus","ops","status","msg","predefined","special","op","isString","isFunction","useProcessStatusSuccess","success","useFormFail","useFormFormat","format","newForm","cloneDeep","formatter","obj","date","dayjs","isBoolean","_b","checker","isObject","isUndefined","isArray","index","useDayjs","useDateFormat","useDateUnix","useTimestampFormat","timestamp","mpFunctions","getMpResolved","name","MpUIResolver","autoImport"],"mappings":"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"}