Files
jiapu/dist/public/js/region-pages.js
T

2 lines
6.8 KiB
JavaScript

(function(o,d){if(typeof module=="object"&&module.exports){module.exports=d(o);return}o.RegionPages=d(o),o.document&&o.document.addEventListener("DOMContentLoaded",function(){o.RegionPages.init()})})(typeof globalThis!="undefined"?globalThis:window,function(o){"use strict";var d=o.document;function y(e){return Array.isArray(e)?e:[]}function v(e){return String(e==null?"":e).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function b(e){return e&&e.regionCode||""}function L(e){return e&&e.regionName||"未命名地区"}function q(e){var n=Number(e&&e.regionLevel);return Number.isInteger(n)?n:0}function A(e){var n={provinceCode:"",cityCode:"",districtCode:""};return y(e).forEach(function(t){var i=b(t),r=q(t);r===1&&(n.provinceCode=i),r===2&&(n.cityCode=i),r===3&&(n.districtCode=i)}),n}function I(e){return'<option value="'+v(b(e))+'">'+v(L(e))+"</option>"}function N(e){return y(e).map(function(n){return L(n)}).filter(Boolean).join(" / ")}function V(e){var n=e||{};return n.districtCode||n.cityCode||n.provinceCode||""}function R(){return o.GenealogyApi&&o.GenealogyApi.defaultClient}function F(e,n){var t=n&&(n.status||n.code);return!e||!e.getToken||!e.getToken()||Number(t)===401}function H(){o.NavigationUtil.open("login.html")}function p(e,n){return F(e,n)?(e&&e.clearToken&&e.clearToken(),H(),!0):!1}function h(e){return Number(e&&(e.status||e.code))===403}function u(e,n){return!d&&!n?null:(n||d).querySelector(e)}function C(e,n){return!d&&!n?[]:Array.prototype.slice.call((n||d).querySelectorAll(e))}function S(e){if(o.layui&&o.layui.layer){o.layui.layer.msg(e);return}o.alert&&o.alert(e)}function U(e){var n={};return C("[name]",e).forEach(function(t){n[t.name]=t.value}),n}function l(e,n,t){if(e){if(n&&o.ProfileUI&&o.ProfileUI.setApiState){o.ProfileUI.setApiState(e,n,t);return}e.textContent=t||""}}function s(e,n,t){var i=e&&u("[data-region-picker-status]",e.parentNode);l(i,n,t)}function j(e,n,t){var i=y(n);e&&(e.innerHTML='<option value="">'+v(t)+"</option>"+i.map(I).join(""),e.disabled=!1)}function c(e,n){e&&(e.__regionRequestVersion=(e.__regionRequestVersion||0)+1,e.innerHTML='<option value="">'+v(n)+"</option>",e.disabled=!0)}function _(e){var n={provinceCode:u('[data-region-level="province"]',e).value,cityCode:u('[data-region-level="city"]',e).value,districtCode:u('[data-region-level="district"]',e).value},t=u("[data-region-code]",e);t&&(t.value=V(n))}async function P(e,n,t){var i=R(),r,a;if(!i||!e)return!1;r=(e.__regionRequestVersion||0)+1,e.__regionRequestVersion=r,e.disabled=!0;try{return a=await i.regionChildren(n||"0"),e.__regionRequestVersion!==r?!1:(j(e,a,t),!0)}catch(f){throw e.__regionRequestVersion===r&&(e.innerHTML='<option value="">'+v(t)+"</option>",e.disabled=!0),f}}function E(e,n){var t=R(),i;p(t,n)||(i=h(n)?"当前账号无权读取地区数据。":n.message||"地区加载失败",s(e,h(n)?"forbidden":"error",i),S(i))}function D(e,n,t,i){e.__regionEventsBound||(e.__regionEventsBound=!0,n.addEventListener("change",function(){if(c(t,"请选择市"),c(i,"请选择区县"),_(e),!n.value){s(e,"","");return}s(e,"loading","正在加载市…"),P(t,n.value,"请选择市").then(function(){s(e,"","")}).catch(function(r){E(e,r)})}),t.addEventListener("change",function(){if(c(i,"请选择区县"),_(e),!t.value){s(e,"","");return}s(e,"loading","正在加载区县…"),P(i,t.value,"请选择区县").then(function(){s(e,"","")}).catch(function(r){E(e,r)})}),i.addEventListener("change",function(){_(e)}))}function M(e){var n=u('[data-region-level="province"]',e),t=u('[data-region-level="city"]',e),i=u('[data-region-level="district"]',e);return!e||!n||!t||!i?Promise.resolve():(e.__regionInitPromise||(c(t,"请选择市"),c(i,"请选择区县"),D(e,n,t,i),s(e,"loading","正在加载省…"),e.__regionInitPromise=P(n,"0","请选择省").then(function(r){return s(e,"",""),r}).catch(function(r){throw e.__regionInitPromise=null,r})),e.__regionInitPromise)}async function x(e,n){var t=u('[data-region-level="province"]',e),i=u('[data-region-level="city"]',e),r=u('[data-region-level="district"]',e),a=n||{};if(await M(e),!a.provinceCode){t.value="",c(i,"请选择市"),c(r,"请选择区县"),_(e);return}t.value=a.provinceCode,c(i,"请选择市"),c(r,"请选择区县"),a.cityCode&&(await P(i,a.provinceCode,"请选择市"),i.value=a.cityCode),a.districtCode&&a.cityCode&&(await P(r,a.cityCode,"请选择区县"),r.value=a.districtCode),_(e)}function O(e){return Promise.all(C("[data-region-picker]").map(function(n){return x(n,e)}))}function z(e,n){var t=y(n);if(e){if(!t.length){l(e,"empty","未找到匹配地区");return}e.innerHTML=t.map(function(i){var r=b(i),a=L(i);return'<button class="btn ghost magnetic" type="button" data-region-search-result="'+v(r)+'">'+v(a)+" "+v(r)+"</button>"}).join("")}}async function B(e){var n=R(),t=U(e),i=u("[data-region-search-results]",e.parentNode),r=u("[data-region-search-path]",e.parentNode),a=u("[data-region-search-status]",e),f,m;if(!p(n)){if(!t.regionKeyword||!t.regionKeyword.trim()){l(a,"error","请输入地区名称或编码"),S("请输入地区名称或编码");return}l(a,"loading","正在搜索地区…"),l(i,"loading","正在搜索地区…"),r&&(r.textContent="搜索中...");try{f=await n.regionSearch({keyword:t.regionKeyword.trim(),limit:20}),z(i,f),l(a,"",""),r&&(r.textContent=y(f).length?"请选择一个地区":"未找到匹配地区")}catch(g){if(p(n,g))return;m=h(g)?"当前账号无权搜索地区。":g.message||"地区搜索失败",l(i,h(g)?"forbidden":"error",m),l(a,h(g)?"forbidden":"error",m),r&&(r.textContent=m),S(m)}}}async function K(e){var n=R(),t=e.getAttribute("data-region-search-result"),i=e.closest(".module-panel"),r=i&&u("[data-region-picker]",i),a=i&&u("[data-region-search-path]",i),f=i&&u("[data-region-search-status]",i),m,g,T;if(!(!t||!r||p(n))){l(f,"loading","正在定位地区…"),a&&(a.textContent="正在定位地区...");try{m=await n.regionDetail(t),g=await n.regionPath(b(m)||t),await x(r,A(g)),a&&(a.textContent=N(g)),l(f,"","")}catch(w){if(p(n,w))return;T=h(w)?"当前账号无权定位地区。":w.message||"地区定位失败",l(f,h(w)?"forbidden":"error",T),a&&(a.textContent=T),S(T)}}}function G(){C("[data-region-search-form]").forEach(function(e){e.addEventListener("submit",function(n){n.preventDefault(),B(e)})}),d.addEventListener("click",function(e){var n=e.target.closest("[data-region-search-result]");n&&(e.preventDefault(),K(n))})}function J(){var e;d&&(!C("[data-region-picker]").length&&!C("[data-region-search-form]").length||(e=R(),!p(e)&&(C("[data-region-picker]").forEach(function(n){M(n).catch(function(t){E(n,t)})}),G())))}return{normalizeList:y,getRegionCode:b,getRegionName:L,getRegionLevel:q,buildRegionOption:I,buildPathText:N,buildRegionSelection:A,getFinalRegionCode:V,applyRegionSelection:x,applyProfileRegionSelection:O,shouldRedirectToLogin:F,isForbidden:h,init:J}});