@pardnchiu/adminui
Version:
AdminUI is a simple backend management system template with an intuitive interface and a modular architecture, supporting custom extensions, enabling developers to quickly build and customize backend management platforms.
1 lines • 6.1 kB
JavaScript
let page;const system_events={password_show:e=>{const t=e.target,a="1"===t.parentElement.dataset.show;t.className="fa-solid "+(a?"fa-eye-slash":"fa-eye"),t.previousElementSibling.children[0].type=a?"password":"text",t.parentElement.dataset.show=a?0:1},body_left_show:e=>{const t=document.querySelector("section.system-block-body-left");null!=t&&(t.dataset.show=parseInt(t.dataset.show)?0:1)},body_left_type:e=>{const t=document.querySelector("section.system-block-body-left");if(null==t)return;const a=parseInt(t.dataset.min);t.dataset.min=a?0:1,addCookie("is_body_left_min",a?0:1)},tab_show:e=>{const t=e.target,a=document.querySelector("section.system-block-body-left"),n=t.parentElement,r=parseInt(t.dataset.show),s=null!=n.querySelector("a[data-selected='1']")&&isNaN(r)||r||1===r;for(let e of[...a.querySelectorAll("p[data-show='1']")])e!==t&&(e.dataset.show=0);t.dataset.show=s?0:1}};function addCookie(e="",t,a){if("string"!=typeof(e=String(e).trim())||e.length<1||null==t)return;e=encodeURIComponent(e),a=1e3*("number"==typeof a?a:3600);const n=Date.now(),r=new Date(n+a);return t=encodeURIComponent("object"==typeof t?JSON.stringify(t).trim():String(t).trim()),document.cookie=`${e}=${t}; expires=${r.toUTCString()}; path=/`,document.cookie}function addEvent(e={}){let t;if("object"==typeof e&&e.hasOwnProperty("dom")){t=e.dom;for(const a of Object.keys(e))"dom"!==a&&(t[a]=t=>e[a](t));return t}}const regexCssClass=/\.([\w_-]+)?/gi,regexCssID=/\#([\w_-]+)?/i,regexCssTag=/^\w+(?=[\#\.]*)/i;function createElement(e="",t,a){const n=((e.match(regexCssTag)||[])[0]||"").trim(),r=((e.match(regexCssID)||[])[1]||"").trim(),s=(regexCssClass.test(e)?e.match(regexCssClass):[]).map((e=>e.replace(/^\./,"")));if(n.length<1)return;let l,o,u="temp"===e,c=u?document.createDocumentFragment():document.createElement(n);r.length>0&&(c.id=r);for(const e of s)c.classList.add(e);if(null==t&&null!=a&&([t,a]=[a,null]),null!=t&&null!=a)[l,o]=[t,a];else if(null==a)"string"==typeof t||"number"==typeof t||Array.isArray(t)?o=t:l=t;else if(null==t)return c;return(()=>{if("object"==typeof l&&null!=l)for(const e in l){if(!l.hasOwnProperty(e))continue;const t=l[e];if({value:1,innerText:1,innerHTML:1,textContent:1,contentEditable:1,selected:1,checked:1}[e])c[e]=t;else if({valuedisplay:1,valuecolor:1,valuebackgroundColor:1,valuebackground:1,valuewidth:1,valueheight:1,valuefloat:1}[e])c.style[e]=t;else if("dataset"===e&&"object"==typeof t)for(const e of Object.keys(t))c.dataset[e]=t[e];else null!=t&&c.setAttribute(e,t)}})(),(()=>{if(null==o)return;const e="object"==typeof o;if(Array.isArray(o)){for(let e of o){const t=e instanceof Element;"string"==typeof e||"number"==typeof e?u?c.appendChild(document.createTextNode(e)):c.innerHTML+=e:t&&c.appendChild(e)}return}if(e)return;const t=o,a="input"===n,r="textarea"===n;"img"===n||"source"===n?c[_src]=t:r||a?c.value=t:u?c.appendChild(document.createTextNode(o)):c.innerHTML=t})(),c}function decodeFromSafeBase64(e){const t=(e=e.replace(/[-_]/g,(e=>"-"===e?"+":"/"))).length%4;e+=t?"=".repeat(4-t):"";const a=atob(e),n=new Uint8Array([...a].map((e=>e.charCodeAt(0)))),r=(new TextDecoder).decode(n);return JSON.parse(r)}function encodeToSafeBase64(e){const t=JSON.stringify(e),a=(new TextEncoder).encode(t);return btoa(String.fromCharCode(...a)).replace(/=/g,"").replace(/\+/g,"-").replace(/\//g,"_")}function getCookie(e=""){if("string"!=typeof(e=String(e).trim())||e.length<1)return;const t=new RegExp(e+"=([^ ;]+)?"),a=document.cookie.match(t)||[],n=a.length;let r=a[n-1];if(!(n<1||null==r)){r=decodeURIComponent(r);try{return JSON.parse(r)}catch(e){return r}}}let textInputErrorTimer;function textInput(e){const t=e.target,a=t.parentElement.parentElement,n=t.dataset.type??t.type??"text",r=t.dataset.wrap??"1",s=t.dataset.force??"1",l=!("0"===r),o=/\n/.test(t.value),u="1"===s;let c=t.dataset.max,i=t.dataset.min;switch(n){case"text":!l&&o&&(t.value=t.value.replace(/\n/g,""),a.dataset.error=1,clearTimeout(textInputErrorTimer),textInputErrorTimer=setTimeout((e=>{a.dataset.error=0}),1e3));break;case"account":var d=/[^\w]/g;u&&(t.value=t.value.replace(/\s/g,"").replace(d,""));const e=d.test(t.value);a.dataset.error=e?1:0,a.dataset.message=e?"僅接受半形英文 / 數字 / 底線":"";break;case"number":d=/[^\d\-\.]/g;(u||c||i)&&(t.value=t.value.replace(/\s/g,"").replace(d,"")),a.dataset.error=d.test(t.value)?1:0;break;case"email":(d=/^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/).test(t.value)||(a.dataset.error=1,a.dataset.message="內容不符合EMAIL格式.",clearTimeout(textInputErrorTimer),textInputErrorTimer=setTimeout((e=>{a.dataset.error=0,a.dataset.message=""}),1e3));break;case"password":d=/[^\w\!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\]\^\`\{\|\}\~\ ]/;u&&(t.value=t.value.replace(/\s/g,"").replace(d,"")),a.dataset.error=d.test(t.value)?1:0,a.dataset.message=d.test(t.value)?"內容包含不支持的字符.":""}if(null!=c||null!=i){if(c=isNaN(c)?null:parseFloat(c),i=isNaN(i)?null:parseFloat(i),"number"===n){if(/^\-/.test(t.value)&&1===t.value.length||/\.$/.test(t.value)||t.value.length<1)return;t.value=Math.max(i,Math.min(c,parseFloat(t.value)))}else{null!=c&&t.value.length>c&&(t.value=t.value.slice(0,c));var m=null!=i&&t.value.length;"1"===a.dataset.error&&m?a.dataset.message=a.dataset.message+(t.value.length<i?" / 最小長度為 "+i:""):m&&(a.dataset.error=t.value.length<i?1:0,a.dataset.message=t.value.length<i?"最小長度為 "+i:"")}"TEXTAREA"===t.tagName&&null!=t.nextElementSibling&&(t.nextElementSibling.innerHTML=t.value.replace(/\n/g,"<br>"))}}const hasgtagKeyup=e=>{if("Enter"!==e.key)return;const t=e.target;let a=(t.value||"").match(/[##\,,\n\ ]+([\w\u4e00-\u9fa5\u3105-\u3129\u31A0-\u31B7\u3040-\u30FF\u3130-\u318F\uAC00-\uD7AF]+)/g)||t.value.split(/\s/),n=new Map;if(a.length<1)return;for(let e=0,t=a[e];e<a.length;e++,t=a[e]){const e=t.replace(/[##\,,\n\ ]/g,"").slice(0,24);e.length<2||n.set(e,0)}let r=Array.from(n.keys());r.length>0?(t.value=`#${r.join(" #")} #`.trim(),t.nextElementSibling.innerHTML=t.value.replace(/\n/g,"<br>")):(t.value="#",t.nextElementSibling.innerHTML="#")};