Files
workspace/code/fms/fms-vue/.tmp-build/assets/menu-management-DDsNXGVA.js
T
2026-09-05 17:25:35 +08:00

3 lines
30 KiB
JavaScript

import{$ as e,G as t,Ht as n,I as r,J as i,Lt as a,M as o,Q as s,R as c,T as l,U as u,V as d,X as f,_ as p,a as m,b as h,d as g,ft as _,gt as v,it as y,p as ee,t as b,ut as x,v as S,w as C,wt as w,x as T,y as E}from"./_plugin-vue_export-helper-Ktpf6lZe.js";import{a as D,r as O,t as k}from"./routes-w7ij2FJx.js";import{D as A,T as j,_ as M,b as N,c as P,g as F,h as te,m as I,n as ne,s as re,t as L,y as R}from"./ui-BhP3ZSBa.js";import{a as z,c as ie,i as ae,n as B,o as oe,r as se,s as ce,t as le,v as V,y as ue}from"./tree-yUDFHuVX.js";import{i as de,r as H}from"./folder-open-xxjo8zBP.js";import{n as fe,r as U,t as pe}from"./search-PJpc0enG.js";import{n as me,t as he}from"./i18n-Tza9fYNM.js";import{t as ge}from"./trash-2-CumKnXxQ.js";import{n as W,r as _e,s as ve}from"./api-BHfsXASe.js";import{t as G}from"./FmsTable-CCmDuvFF.js";import{n as ye,r as be,t as K}from"./dataChanges-1MP4ya4d.js";import{n as xe,r as Se,t as Ce}from"./UnsavedChangesModal-khbqSNRL.js";o(),w(),y();var we={class:`i18n-name-modal`},q={class:`i18n-name-row__label`},Te={key:0,class:`i18n-name-modal__hint`},Ee=b(Object.assign({inheritAttrs:!1},{__name:`I18nNameModal`,props:{open:{type:Boolean,default:!1},title:{type:String,default:`多语言名称`},languages:{type:Array,default:()=>[]},modelValue:{type:Object,default:()=>({})},hint:{type:String,default:``}},emits:[`update:open`,`update:modelValue`,`confirm`],setup(r,{emit:i}){let a=r,o=i,c=x({});s(()=>a.open,e=>{e&&(c.value={...a.modelValue})});function d(e,t){c.value={...c.value,[e.code]:t}}function f(){o(`update:modelValue`,{...c.value}),o(`confirm`,{...c.value}),o(`update:open`,!1)}function p(){o(`update:open`,!1)}return(i,a)=>(u(),E(v(te),{open:r.open,title:r.title,width:520,"mask-closable":!1,onCancel:p},{footer:e(()=>[l(v(A),{type:`outline`,onClick:p},{default:e(()=>[...a[0]||=[C(`取消`,-1)]]),_:1}),l(v(A),{type:`primary`,onClick:f},{default:e(()=>[...a[1]||=[C(`确定`,-1)]]),_:1})]),default:e(()=>[S(`div`,we,[(u(!0),T(ee,null,t(r.languages,e=>(u(),T(`div`,{class:`i18n-name-row`,key:e.code},[S(`span`,q,n(e.name),1),l(v(F),{class:`i18n-name-row__input`,"model-value":c.value[e.code]||``,placeholder:`请输入${e.name}名称`,"onUpdate:modelValue":t=>d(e,t)},null,8,[`model-value`,`placeholder`,`onUpdate:modelValue`])]))),128)),r.hint?(u(),T(`p`,Te,n(r.hint),1)):h(``,!0)])]),_:1},8,[`open`,`title`]))}}),[[`__scopeId`,`data-v-1f24c706`]]);y(),o(),w(),m();var De={class:`mm-tree-panel`},Oe={class:`mm-tree-header`},ke={class:`mm-tree-header__actions`},Ae={class:`mm-tree-panel__scroll`},je={key:0,class:`mm-tree-empty`},Me={class:`mm-tree-node`},Ne=b({__name:`MenuTreePanel`,props:{treeData:{type:Array,required:!0},loading:{type:Boolean,default:!1},selectedId:{type:[String,Number],default:null},expandedKeys:{type:Array,default:()=>[]},unsavedIds:{type:Set,default:()=>new Set}},emits:[`update:expandedKeys`,`select`,`add`,`delete`,`drop`,`refresh`,`toggleEnable`],setup(t,{emit:r}){let i=t,o=r,c=x(``),d=p(()=>ae(i.treeData,c.value));s(c,e=>{o(`update:expandedKeys`,e.trim()?B(i.treeData):[])});let f=[{key:`directory`,label:`新增目录`,icon:V},{key:`page`,label:`新增页面`,icon:H},{key:`external`,label:`新增外链`,icon:de}];function m(e){if(!e.length)return;let t=String(e[0]);t!==String(i.selectedId)&&o(`select`,t)}function h(e){let t=e!=null&&i.unsavedIds.has(String(e.b_id)),n=f.map(e=>({...e,disabled:t}));return e&&(n.push({divider:!0}),n.push({key:`delete`,label:`删除`,icon:ge,danger:!0})),n}function _({item:e,node:t}){let n=t?String(t.b_id):null;e.key===`delete`?o(`delete`,n):o(`add`,{parentId:n,menuType:e.key})}function y({key:e}){o(`add`,{parentId:i.selectedId?String(i.selectedId):null,menuType:e})}return(r,i)=>(u(),T(`aside`,De,[S(`div`,Oe,[l(v(F),{modelValue:c.value,"onUpdate:modelValue":i[0]||=e=>c.value=e,"allow-clear":``,class:`mm-tree-search`},{prefix:e(()=>[l(v(pe),{size:14,class:`mm-tree-search__icon`})]),_:1},8,[`modelValue`]),S(`div`,ke,[l(v(A),{type:`ghost`,class:`mm-tree-header__icon-btn`,title:`刷新菜单树`,"aria-label":`刷新菜单树`,onClick:i[1]||=e=>o(`refresh`)},{default:e(()=>[l(v(fe),{size:14})]),_:1}),l(v(N),{items:f,onClick:y},{default:e(()=>[l(v(A),{type:`ghost`,class:`mm-tree-header__icon-btn`,title:`新增菜单`,"aria-label":`新增菜单`},{default:e(()=>[l(v(U),{size:14})]),_:1})]),_:1})])]),S(`div`,Ae,[t.loading?(u(),T(`div`,je,`加载中...`)):(u(),E(v(ne),{key:1,"tree-data":d.value,"field-names":{key:`b_id`,title:`b_name`,children:`children`},"expanded-keys":t.expandedKeys,"onUpdate:expandedKeys":i[3]||=e=>o(`update:expandedKeys`,e),"selected-keys":t.selectedId?[t.selectedId]:[],"context-menu":h,draggable:!c.value.trim(),onSelect:m,onContextMenuClick:_,onDrop:i[4]||=e=>o(`drop`,e)},{title:e(({node:e})=>[S(`span`,Me,[S(`span`,{class:a([`mm-tree-node__name`,{"is-disabled":Number(e.b_canuse)!==1}])},n(e.b_name||e.b_id||`(未命名)`),3),l(v(j),{class:`mm-tree-node__enable`,"model-value":Number(e.b_canuse)===1,onClick:i[2]||=g(()=>{},[`stop`]),onChange:t=>o(`toggleEnable`,{node:e,checked:t})},null,8,[`model-value`,`onChange`])])]),_:1},8,[`tree-data`,`expanded-keys`,`selected-keys`,`draggable`]))])]))}},[[`__scopeId`,`data-v-f1bb3550`]]);o(),w(),y();var J={class:`icon-input__field`},Y=[`title`],X=b({__name:`IconPicker`,props:{modelValue:{type:String,default:``},disabled:{type:Boolean,default:!1}},emits:[`update:modelValue`,`change`,`clear`],setup(e,{emit:t}){let n=e,r=t,o=x(n.modelValue);s(()=>n.modelValue,e=>{e!==o.value&&(o.value=e)});function c(){o.value=n.modelValue}let d=p(()=>O(o.value));return(t,n)=>(u(),T(`div`,{class:a([`icon-input`,{"icon-input-disabled":e.disabled}])},[S(`div`,J,[l(F,{"model-value":e.modelValue,disabled:e.disabled,"allow-clear":``,"onUpdate:modelValue":n[0]||=e=>r(`update:modelValue`,e),onBlur:c},null,8,[`model-value`,`disabled`])]),d.value?(u(),T(`div`,{key:0,class:`icon-input__preview`,title:o.value},[(u(),E(i(d.value),{class:`icon-input__preview-icon`}))],8,Y)):h(``,!0)],2))}},[[`__scopeId`,`data-v-d7de1144`]]),Pe=[{label:`目录`,value:`directory`},{label:`页面`,value:`page`},{label:`外链`,value:`external`}],Fe={directory:V,page:H,external:de};function Ie(e){for(let t of e){t.b_menu_type===`directory`&&(t.isLeaf=!1);let e=Fe[t.b_menu_type];e&&(t.icon=e),t.children&&Ie(t.children)}return e}function Le(e){return{b_id:e.b_id,b_parent_id:e.b_parent_id?String(e.b_parent_id):null,b_name:e.b_name,b_i18n:e.b_i18n??null,b_menu_type:e.b_menu_type,b_route:e.b_route??null,b_module_id:e.b_module_id??null,b_icon:e.b_icon??null,b_xh:e.b_xh,b_canuse:e.b_canuse}}function Re(e,t){for(let n=0;n<e.length;n++){if(String(e[n].b_id)===String(t))return{list:e,index:n};if(e[n].children){let r=Re(e[n].children,t);if(r)return r}}return null}function ze(e,t){e.forEach((e,n)=>{let r=(n+1)*10;e.b_xh!==r&&(e.b_xh=r,t.push({b_id:e.b_id,b_xh:r}))})}o(),y();var Be={class:`mm-name-field`},Ve=b({__name:`MenuBasicPanel`,props:r({typeLocked:{type:Boolean,default:!1},moduleOptions:{type:Array,default:()=>[]},loading:{type:Boolean,default:!1}},{modelValue:{type:Object,default:null},modelModifiers:{}}),emits:r([`openI18n`],[`update:modelValue`]),setup(t,{expose:n,emit:r}){let i=t,a=r,o=f(t,`modelValue`),s=p(()=>o.value?.b_menu_type===`page`),c=p(()=>o.value?.b_menu_type===`external`),d=p(()=>{let e=String(o.value?.b_route??``).trim();return e?k.some(t=>t.value===e)?k:[{value:e,label:`${e}(已不在路由表中)`},...k]:k}),m=p(()=>({b_id:[{required:!0,message:`请填写菜单编码`}],b_name:[{required:!0,message:`请填写菜单名称`}],b_menu_type:[{required:!0,message:`请选择菜单类型`}],b_route:s.value||c.value?[{required:!0,message:`请填写路由地址`}]:[],b_module_id:[]})),g=x(null);function _(){return g.value?.validateAll?.()??[]}n({validate:_});function y(e,t){o.value&&(o.value[e]=t===``||t==null?null:t)}function ee(e){o.value&&(i.typeLocked||(o.value.b_menu_type=e,e===`directory`?(o.value.b_route=null,o.value.b_module_id=null):e===`external`&&(o.value.b_module_id=null)))}return(n,r)=>o.value?(u(),E(v(R),{key:0,ref_key:`formRef`,ref:g,model:o.value,rules:m.value,layout:`vertical`,gap:20},{default:e(()=>[l(v(M),{label:`菜单名称`,name:`b_name`,required:``},{default:e(()=>[S(`div`,Be,[l(v(F),{class:`mm-name-field__input`,"model-value":o.value.b_name,"onUpdate:modelValue":r[0]||=e=>y(`b_name`,e)},null,8,[`model-value`]),l(v(A),{type:`ghost`,class:`mm-name-field__i18n`,title:`多语言名称`,onClick:r[1]||=e=>a(`openI18n`)},{default:e(()=>[l(v(D),{size:16})]),_:1})])]),_:1}),l(v(M),{label:`菜单编码`,name:`b_id`,required:``},{default:e(()=>[l(v(F),{"model-value":o.value.b_id,disabled:t.typeLocked,placeholder:`主键即编码,保存后不可修改`,"onUpdate:modelValue":r[2]||=e=>y(`b_id`,e)},null,8,[`model-value`,`disabled`])]),_:1}),l(v(M),{label:`菜单类型`,name:`b_menu_type`,required:``},{default:e(()=>[l(v(I),{"model-value":o.value.b_menu_type,options:v(Pe),disabled:t.typeLocked||t.loading,"onUpdate:modelValue":ee},null,8,[`model-value`,`options`,`disabled`])]),_:1}),s.value?(u(),E(v(M),{key:0,label:`路由地址`,name:`b_route`,required:``},{default:e(()=>[l(v(I),{"model-value":o.value.b_route,options:d.value,"not-found-text":`无匹配路由`,clearable:``,"onUpdate:modelValue":r[3]||=e=>y(`b_route`,e)},null,8,[`model-value`,`options`])]),_:1})):h(``,!0),c.value?(u(),E(v(M),{key:1,label:`外链地址`,name:`b_route`,required:``},{default:e(()=>[l(v(F),{"model-value":o.value.b_route,"onUpdate:modelValue":r[4]||=e=>y(`b_route`,e)},null,8,[`model-value`])]),_:1})):h(``,!0),s.value?(u(),E(v(M),{key:2,label:`绑定模块`,name:`b_module_id`},{default:e(()=>[l(v(I),{"model-value":o.value.b_module_id,options:t.moduleOptions,clearable:``,"onUpdate:modelValue":r[5]||=e=>y(`b_module_id`,e)},null,8,[`model-value`,`options`])]),_:1})):h(``,!0),l(v(M),{label:`图标`,name:`b_icon`},{default:e(()=>[l(X,{"model-value":o.value.b_icon,"onUpdate:modelValue":r[6]||=e=>y(`b_icon`,e)},null,8,[`model-value`])]),_:1}),l(v(M),{label:`排序号`,name:`b_xh`},{default:e(()=>[l(v(F),{"model-value":o.value.b_xh,type:`number`,"onUpdate:modelValue":r[7]||=e=>y(`b_xh`,Number(e)||0)},null,8,[`model-value`])]),_:1})]),_:1},8,[`model`,`rules`])):h(``,!0)}},[[`__scopeId`,`data-v-0249c9f0`]]);o(),y(),w();var He={class:`mm-power-card`},Ue={class:`mm-power-card__head`},We={class:`mm-power-toolbar`},Ge={key:0,class:`mm-power-loading`},Ke={key:1,class:`mm-power-table-wrap`},qe=b({__name:`MenuPowersPanel`,props:r({loading:{type:Boolean,default:!1},menuId:{type:[String,Number],default:null}},{modelValue:{type:Array,default:()=>[]},modelModifiers:{}}),emits:[`update:modelValue`],setup(t){let r=t,i=f(t,`modelValue`),a=_([{dataIndex:`b_id`,title:`权限编码`,width:150,editor:{type:`input`}},{dataIndex:`b_name`,title:`权限名称`,width:180,editor:{type:`input`}},{dataIndex:`b_canuse`,title:`启用`,align:`center`,width:70,editor:{type:`checkbox`}},{dataIndex:`actions`,title:`操作`,align:`center`,width:70,actions:[{type:`delete`,label:`删除`,onClick:e=>g(e)}]}]),o=x(null),d=x([]),m=p(()=>({selectedRowKeys:d.value,onChange:e=>{d.value=e}}));s(()=>r.menuId,()=>{d.value=[]}),s(()=>i.value,e=>{for(let t of e||[])t._rowKey||=xe()},{deep:!0,immediate:!0});async function h(){if(r.loading)return;let e=xe();i.value=[...i.value,{b_id:``,b_name:``,b_power_type:`action`,b_canuse:1,_rowKey:e}],d.value=[],await c(),o.value?.editRow?.(e,`b_id`)}function g(e){i.value=i.value.filter(t=>t!==e),d.value=d.value.filter(t=>String(t)!==String(e._rowKey))}function y(){let e=d.value;if(!e.length)return;let t=new Set(e.map(String));i.value=i.value.filter(e=>!t.has(String(e._rowKey))),d.value=[],L.success(`已删除 ${e.length} 条权限`)}return(r,s)=>(u(),T(`div`,He,[S(`div`,Ue,[s[2]||=S(`div`,{class:`mm-pane__title`},`当前菜单权限`,-1),S(`div`,We,[l(v(A),{type:`primary`,size:`small`,disabled:t.loading,onClick:h},{default:e(()=>[l(v(U),{size:12}),s[1]||=C(` 新增 `,-1)]),_:1},8,[`disabled`]),l(v(A),{type:`danger`,size:`small`,disabled:t.loading||!d.value.length,onClick:y},{default:e(()=>[l(v(ge),{size:12}),C(` 删除`+n(d.value.length?`(${d.value.length})`:``),1)]),_:1},8,[`disabled`])])]),t.loading?(u(),T(`div`,Ge,`加载中...`)):(u(),T(`div`,Ke,[l(G,{ref_key:`tableRef`,ref:o,columns:a.value,"onUpdate:columns":s[0]||=e=>a.value=e,"data-source":i.value,editable:!0,"row-key":`_rowKey`,"row-selection":m.value,"col-resizable":!0,onChange:()=>{}},null,8,[`columns`,`data-source`,`row-selection`])]))]))}},[[`__scopeId`,`data-v-23416a49`]]);o(),y(),w();var Je={class:`mm-power-card`},Ye={class:`mm-power-card__head`},Xe={class:`mm-power-toolbar`},Ze={key:0,class:`mm-power-loading`},Qe={key:1,class:`mm-lib-table-wrap`},$e=b({__name:`MenuPowerLibraryPanel`,props:{modelValue:{type:Array,default:()=>[]},modelModifiers:{}},emits:[`update:modelValue`],setup(t){let r=!1,i=x([]),a=f(t,`modelValue`),o=x(!1),s=x([]),c=_([{dataIndex:`b_id`,title:`权限编码`},{dataIndex:`b_name`,title:`权限名称`}]),m=p(()=>({selectedRowKeys:s.value,onChange:e=>{s.value=e}}));async function h(){o.value=!0;try{let e=await _e(`SELECT b_id, MAX(b_name) AS b_name FROM s_power
WHERE b_power_type = 'action' AND b_id IS NOT NULL AND b_id <> ''
GROUP BY b_id ORDER BY b_id`);i.value=(e.data||[]).map(e=>({b_id:e.b_id,b_name:e.b_name})),r=!0,s.value=[]}catch(e){L.error(`加载权限库失败:`+(e?.message||e)),i.value=[]}finally{o.value=!1}}function g(){let e=s.value;if(!e.length){L.warning(`请先在权限库中勾选要导入的权限`);return}let t=new Set(a.value.map(e=>String(e.b_id||``).trim())),n=[];for(let r of e){if(t.has(String(r).trim()))continue;let e=i.value.find(e=>String(e.b_id)===String(r));n.push({b_id:String(r),b_name:e?.b_name||``,b_power_type:`action`,b_canuse:1}),t.add(String(r).trim())}if(!n.length){L.warning(`勾选的权限均已存在,无需导入`);return}a.value=[...a.value,...n],s.value=[],L.success(`已导入 ${n.length} 条权限`)}return d(()=>{r||h()}),(t,r)=>(u(),T(`div`,Je,[S(`div`,Ye,[r[2]||=S(`div`,{class:`mm-pane__title`},`权限库`,-1),S(`div`,Xe,[l(v(A),{type:`outline`,size:`small`,loading:o.value,onClick:h},{default:e(()=>[l(v(fe),{size:12}),r[1]||=C(` 刷新 `,-1)]),_:1},8,[`loading`]),l(v(A),{type:`primary`,size:`small`,disabled:!s.value.length,onClick:g},{default:e(()=>[l(v(U),{size:12}),C(` 导入选中`+n(s.value.length?`(${s.value.length})`:``),1)]),_:1},8,[`disabled`])])]),o.value?(u(),T(`div`,Ze,`加载中...`)):(u(),T(`div`,Qe,[l(G,{columns:c.value,"onUpdate:columns":r[0]||=e=>c.value=e,"data-source":i.value,seq:!1,"row-key":`b_id`,"row-selection":m.value,"auto-fit-width":!0,onChange:()=>{}},null,8,[`columns`,`data-source`,`row-selection`])]))]))}},[[`__scopeId`,`data-v-f48de0c8`]]);y(),o(),w();var et={class:`mm-page`},tt={class:`mm-body`},nt={class:`mm-main`},rt={class:`mm-main-toolbar`},it={key:0,class:`mm-edit-body`},at={class:`mm-form-col__card`},ot={key:1,class:`mm-config-state`},st={key:2,class:`mm-config-state`},ct={key:1,class:`mm-main__empty`},lt={style:{margin:`0`,"line-height":`1.7`,color:`var(--fms-text)`}},ut=b({__name:`index`,setup(t){function r(e){return`N'${String(e??``).replace(/'/g,`''`)}'`}let i=he(),a=p(()=>i.defaultLanguage?.b_id||i.languages[0]?.b_id||``),o=p(()=>i.languages.map(e=>({code:e.b_id,name:e.b_name,default:Number(e.b_default)===1}))),d=p(()=>i.nonDefaultLanguages.map(e=>({code:e.b_id,name:e.b_name}))),f=p(()=>i.defaultLanguage?.b_name||a.value||``),m=x([]),g=x(!1),_=x(null),y=x([]),b=new Set,w=x(!1),D=x(!1),O=x(null),k=x(null),j=x(null),M={value:!1},N=x({}),F=x({}),I=x([]),ne=x(!1),R=x([]),ae=x(``),B=x(!1);function V(){R.value=[],ae.value=`[]`,B.value=!1}let de=x(null),H=p(()=>_.value?z(m.value,_.value):null),U=p(()=>w.value||D.value),pe=p(()=>k.value?.b_menu_type||H.value?.b_menu_type||null),ge=p(()=>pe.value===`directory`),_e=p(()=>!!H.value&&!b.has(String(H.value.b_id)));function G(e){for(let t of e.children||[])if(!b.has(String(t.b_id))||G(t))return!0;return!1}function we(e,t=new Set){t.add(String(e.b_id));for(let n of e.children||[])we(n,t);return t}async function q(){g.value=!0;try{let e=await W(`s_menu`,`1 = 1`,`b_xh ASC, b_id ASC`);m.value=Ie(ie(le(e.data||[]))),b.clear()}catch(e){L.error(`加载菜单树失败:`+(e?.message||e))}finally{g.value=!1}}function Te(){let e=[...b].some(e=>z(m.value,e)),t=!!_.value&&b.has(String(_.value)),n=O.value&&Be();if(!e&&!n){q();return}ht({title:`刷新菜单树`,content:`刷新会用数据库数据重建整棵树,当前未保存的修改与未保存的新建菜单都将丢失。确定继续吗?`,okText:`刷新`,onOk:async()=>{let e=t||!_.value?null:String(_.value);t&&(_.value=null),await q(),e&&await J(e)}})}function De(){let e=_.value;if(e){if(!(O.value&&Be())){J(e);return}ht({title:`重载菜单配置`,content:`重载会放弃当前未保存的修改,改为从数据库重新加载。确定继续吗?`,okText:`重载`,onOk:async()=>{await J(e)}})}}function Oe(e){He(()=>{_.value=e})}function ke({parentId:e,menuType:t}){if(e&&b.has(String(e))){L.warning(`请先保存当前新建的菜单,再在其下新增子菜单`);return}He(()=>void je(e,t))}async function Ae({dragKey:e,dropKey:t,dropPosition:n}){let r=String(e),i=String(t);if(r===i)return;let a=Re(m.value,r),o=Re(m.value,i);if(!a||!o)return;let s=o.list[o.index];if(n===`inside`&&s.b_menu_type!==`directory`){L.warning(`只能将菜单放入目录下`);return}let c=s.b_parent_id??null,[l]=a.list.splice(a.index,1),u=[],d=new Set;if(n===`inside`)l.b_parent_id=s.b_id,s.children||(s.children=[],s.isLeaf=!1),s.children.push(l),d.add(s.children),d.add(a.list);else{l.b_parent_id=c;let e=o.list,t=o.index+ +(n===`after`);a.list===o.list&&a.index<o.index&&--t,e.splice(t,0,l),d.add(e)}if(d.forEach(e=>ze(e,u)),k.value){let e=String(k.value.b_id),t=!b.has(e)&&!!j.value,n=u.find(t=>String(t.b_id)===e);n&&(k.value.b_xh=n.b_xh,t&&(j.value.b_xh=n.b_xh)),e===r&&(k.value.b_parent_id=l.b_parent_id,t&&(j.value.b_parent_id=l.b_parent_id))}if(!u.length)return;let f=u.filter(e=>!b.has(String(e.b_id)));if(f.length)try{let e=f.map(e=>({table:`s_menu`,key_field:`b_id`,updates:[e]}));await ve(e),L.success(`排序已更新`)}catch(e){L.error(`排序更新失败:`+(e?.message||e)),await q()}}async function je(e,t=`page`){let n=xe(),r={b_id:n,b_parent_id:e?String(e):null,b_name:``,b_i18n:null,b_menu_type:t,b_route:null,b_module_id:null,b_icon:null,b_xh:10,b_canuse:1};oe(m.value,r,{sort:ie});let i=se(m.value,n);if(i.length&&(y.value=[...new Set([...y.value,...i])]),t===`directory`){let e=z(m.value,n);e&&(e.isLeaf=!1)}b.add(n),M.value=!0,_.value=n,await c(),k.value=K(r),j.value=K(k.value),N.value={[a.value]:``},F.value={[a.value]:``},I.value=[],V(),O.value=n}async function Me(e){let t=e==null?H.value:z(m.value,e);if(!t||U.value)return;let n=String(t.b_id);if(b.has(n)){we(t).forEach(e=>b.delete(e)),ce(m.value,n),_.value=null;return}if(G(t)){L.warning(`该菜单下还有已保存的子菜单,请先删除子菜单`);return}ht({title:`删除菜单`,content:`确定删除菜单「${t.b_name||t.b_id}」?`,okText:`删除`,okType:`danger`,onOk:async()=>{try{let e=t.b_id?`menu.${String(t.b_id).trim()}`:``,r=[{table:`s_i18n`,key_field:`b_id`,deletes:[{b_module_id:n}]}];e&&r.push({table:`s_power`,key_field:`b_id`,deletes:[{b_power_type:`menu`,b_resource:e}]}),r.push({table:`s_power`,key_field:`b_id`,deletes:[{b_power_type:`action`,b_module_id:n}]}),r.push({table:`s_menu`,key_field:`b_id`,deletes:[{b_id:n}]}),await ve(r),we(t).forEach(e=>b.delete(e)),ce(m.value,n),_.value=null,L.success(`菜单已删除`)}catch(e){L.error(`删除失败:`+(e?.message||e))}}})}async function J(e){let t=String(e);w.value=!0;try{let e=await W(`s_menu`,`b_id = ${r(t)}`);if(String(_.value)!==t)return;let n=e.data?.[0]||null;j.value=n?{...n}:null,k.value=K(j.value);let i={[a.value]:n?.b_name||``},o=[];if(n){let e=await W(`s_i18n`,`b_module_id = ${r(t)}`,`b_key ASC, b_locale ASC`);for(let t of e.data||[])!t.b_locale||t.b_locale===a.value||(i[t.b_locale]=t.b_value,o.push({b_id:t.b_id,b_key:t.b_key,b_locale:t.b_locale,b_value:t.b_value}))}N.value=i,F.value={...i},I.value=o,B.value=!0;try{let e=n&&n.b_menu_type!==`directory`?await W(`s_power`,`b_power_type = 'action' AND b_module_id = ${r(t)}`,`b_xh ASC, b_id ASC`):{data:[]};R.value=(e.data||[]).map(e=>({b_id:e.b_id,b_name:e.b_name,b_power_type:`action`,b_canuse:+(Number(e.b_canuse)===1)})),ae.value=JSON.stringify(R.value)}finally{B.value=!1}O.value=t}catch(t){String(_.value)===String(e)&&(O.value=null,k.value=null,L.error(`菜单加载失败:`+(t?.message||t)))}finally{String(_.value)===String(e)&&(w.value=!1)}}s(_,e=>{if(M.value){M.value=!1,w.value=!1;return}if(!e){w.value=!1,O.value=null,k.value=null,V();return}if(b.has(String(e))){let t=z(m.value,String(e));if(w.value=!1,!t){O.value=null,k.value=null;return}k.value=K(Le(t)),j.value=K(k.value),N.value={[a.value]:t.b_name||``},F.value={...N.value},I.value=[],V(),O.value=String(e);return}O.value=null,k.value=null,J(e)});let Y=x(null),X=x(!1);function Pe(){try{return JSON.parse(ae.value)||[]}catch{return[]}}function Fe(e){return JSON.stringify((e||[]).map(e=>({b_id:e.b_id==null?null:String(e.b_id),b_name:String(e.b_name||``),b_canuse:+(Number(e.b_canuse)===1)})))}function Be(){return k.value?!!(JSON.stringify(k.value)!==JSON.stringify(j.value)||d.value.some(e=>N.value[e.code]!==F.value[e.code])||Fe(R.value)!==Fe(Pe())):!1}function He(e){if(O.value&&Be()){Y.value={name:H.value?.b_name||H.value?.b_id||``,proceed:e};return}e()}function Ue(){Y.value=null,X.value=!1}function We(){let e=Y.value;e&&(Y.value=null,e.proceed())}async function Ge(){let e=Y.value;if(!(!e||X.value)){X.value=!0;try{if(!await Xe()){L.warning(`保存未完成,请处理后再继续`);return}Y.value=null,e.proceed()}finally{X.value=!1}}}async function Ke(){let e=String(H.value.b_id);if((await de.value?.validate?.())?.length)return L.warning(`请修正表单中标红的错误项`),!1;let t=k.value;if(!t)return!1;let n=b.has(e);if(!new Set([`directory`,`page`,`external`]).has(t.b_menu_type))return L.warning(`菜单类型只能是目录、页面或外链`),!1;if(!n&&t.b_menu_type!==j.value?.b_menu_type)return L.warning(`已保存菜单不允许修改菜单类型`),!1;if(t.b_parent_id&&String(t.b_parent_id)===e)return L.warning(`上级菜单不能选择当前菜单`),!1;let r={directory:{route:!1,module:!1},page:{route:!0,module:!0},external:{route:!0,module:!1}}[t.b_menu_type];if(r.route&&!String(t.b_route||``).trim())return L.warning(t.b_menu_type===`external`?`外链菜单必须填写外链地址`:`页面菜单必须填写路由地址`),!1;!r.route&&t.b_route&&(t.b_route=null),!r.module&&t.b_module_id&&(t.b_module_id=null);let i=String(t.b_id||``).trim();return n&&(!i||/^-\d+$/.test(i))?(L.warning(`新建菜单必须先填写菜单编码`),!1):i?(t.b_id=i,t.b_i18n=`menu.${i}`,!0):(L.warning(`菜单编码不能为空`),!1)}async function Je(){let e=String(H.value.b_id),t=k.value;if(!t)return null;let n=b.has(e),i=String(t.b_id||``).trim();if(!i)return null;let a=`menu.${i}`,o=t.b_menu_type===`directory`,s=`menu.${i}`,c=[],l=ye({current:t,original:n?null:j.value||null});if(l.hasChanges){let e={table:`s_menu`,key_field:`b_id`};l.inserts.length&&(e.inserts=l.inserts),l.updates.length&&(e.updates=l.updates),c.push(e)}new Map(I.value.map(e=>[String(e.b_locale),e]));let u=[];for(let e of d.value){let t=String(N.value[e.code]||``).trim();t&&u.push({b_id:`${a}:${e.code}`,b_key:a,b_locale:e.code,b_value:t})}let f=I.value.map(e=>({b_id:e.b_id,b_key:e.b_key,b_locale:e.b_locale,b_value:String(e.b_value??``).trim()})),p=be(u,f);if(p.inserts.length||p.updates.length||p.deletes.length){let e={table:`s_i18n`,key_field:`b_id`};p.inserts.length&&(e.inserts=p.inserts.map(e=>({...e,b_module_id:i,b_canuse:1}))),p.updates.length&&(e.updates=p.updates.map(e=>({...e,b_module_id:i,b_canuse:1}))),p.deletes.length&&(e.deletes=p.deletes),c.push(e)}if(o){let e=String(j.value?.b_id||``).trim(),t=e?`menu.${e}`:``;t&&c.push({table:`s_power`,key_field:`b_id`,deletes:[{b_id:t}]}),c.push({table:`s_power`,key_field:`b_id`,deletes:[{b_power_type:`action`,b_module_id:i}]})}if(!o&&s){let e=String(j.value?.b_id||``).trim(),n=e?`menu.${e}`:``;n&&n!==s&&c.push({table:`s_power`,key_field:`b_id`,deletes:[{b_id:n}]});let i=(t.b_id?await W(`s_power`,`b_power_type = 'menu' AND b_id = ${r(s)}`):{data:[]}).data?.[0],a={b_id:s,b_power_type:`menu`,b_name:t.b_name,b_resource:s,b_operation:`access`,b_canuse:t.b_canuse??1};i?c.push({table:`s_power`,key_field:`b_id`,updates:[a]}):c.push({table:`s_power`,key_field:`b_id`,inserts:[a]})}let m=new Set;for(let e of Pe())e.b_id&&m.add(String(e.b_id));if(!o&&(m.size||R.value.length)){let e=new Set(R.value.filter(e=>e.b_id).map(e=>String(e.b_id)));for(let t of m)e.has(t)||c.push({table:`s_power`,key_field:`b_id`,deletes:[{b_id:t}]});for(let e of R.value){let t=String(e.b_id||``).trim();if(!t)continue;let n={b_id:t,b_power_type:`action`,b_name:e.b_name,b_resource:t,b_operation:`execute`,b_module_id:i,b_canuse:+(Number(e.b_canuse)===1)};m.has(String(e.b_id))?c.push({table:`s_power`,key_field:`b_id`,updates:[n]}):c.push({table:`s_power`,key_field:`b_id`,inserts:[n]})}}return c.length?c:null}async function Ye(){let e=String(H.value?.b_id??``),t=k.value,n=String(t?.b_id||e).trim();b.delete(e),await q(),n===String(_.value)?J(n):_.value=n,L.success(`保存成功`)}async function Xe(){if(!H.value||U.value||O.value==null||String(O.value)!==String(_.value))return!1;D.value=!0;try{if(!await Ke())return!1;let e=await Je();return e?(await ve(e),await Ye(),!0):(L.info(`没有需要保存的变更`),!0)}catch(e){return L.error(`保存失败:`+(e?.message||e)),!1}finally{D.value=!1}}function Ze(e,t){N.value={...N.value,[e]:t}}let Qe=p(()=>{let e=k.value,t={[a.value]:e?.b_name||``};for(let e of d.value)t[e.code]=N.value[e.code]||``;return t});function ut(e){k.value&&(k.value.b_name=e[a.value]??``);for(let t of d.value)Ze(t.code,e[t.code]||``)}async function dt({node:e,checked:t}){let n=String(e.b_id),r=+!!t,i=z(m.value,n)||e;if(Number(i.b_canuse)!==r&&(i.b_canuse=r,k.value&&String(k.value.b_id)===n&&(k.value.b_canuse=r,!b.has(n)&&j.value&&(j.value.b_canuse=r)),!b.has(n)))try{await ve([{table:`s_menu`,key_field:`b_id`,updates:[{b_id:n,b_canuse:r}]}]),L.success(r?`菜单已启用`:`菜单已停用`)}catch(e){i.b_canuse=r===1?0:1,k.value&&String(k.value.b_id)===n&&(k.value.b_canuse=i.b_canuse,j.value&&(j.value.b_canuse=i.b_canuse)),L.error(`操作失败:`+(e?.message||e))}}let ft=x([]),pt=!1;async function mt(){if(!pt)try{let e=await W(`s_module`,`b_canuse = 1 AND b_module_type IN ('data', 'query')`,`b_xh ASC, b_id ASC`);ft.value=(e.data||[]).map(e=>({label:`[${e.b_id}] ${e.b_name}`,value:String(e.b_id)})),pt=!0}catch{}}Se([{key:`s`,mod:!0,ignoreWhenTyping:!1,handler:()=>void Xe()}]);let Z=x(!1),Q=x(null),$=x(!1);function ht({title:e,content:t,okText:n,okType:r,onOk:i}){Q.value={title:e,content:t,okText:n||`确定`,okType:r,onOk:i},Z.value=!0}async function gt(){if(!(!Q.value?.onOk||$.value)){$.value=!0;try{await Q.value.onOk(),Z.value=!1}finally{$.value=!1}}}return q(),mt(),(t,r)=>(u(),T(`div`,et,[S(`div`,tt,[l(v(re),{class:`mm-body-splitter`},{default:e(()=>[l(v(P),{"default-size":248,min:180,max:420},{default:e(()=>[l(Ne,{"expanded-keys":y.value,"onUpdate:expandedKeys":r[0]||=e=>y.value=e,"tree-data":m.value,loading:g.value,"selected-id":_.value,"unsaved-ids":v(b),onSelect:Oe,onAdd:ke,onDelete:r[1]||=e=>void Me(e),onDrop:r[2]||=e=>void Ae(e),onRefresh:Te,onToggleEnable:r[3]||=e=>void dt(e)},null,8,[`expanded-keys`,`tree-data`,`loading`,`selected-id`,`unsaved-ids`])]),_:1}),l(v(P),null,{default:e(()=>[S(`main`,nt,[H.value?(u(),T(ee,{key:0},[S(`div`,rt,[l(v(A),{type:`primary`,loading:D.value,disabled:w.value||!k.value,onClick:Xe},{default:e(()=>[l(v(me),{size:14}),r[12]||=C(` 保存 `,-1)]),_:1},8,[`loading`,`disabled`]),l(v(A),{type:`outline`,disabled:U.value||!k.value,onClick:De},{default:e(()=>[l(v(fe),{size:14}),r[13]||=C(` 重载 `,-1)]),_:1},8,[`disabled`])]),k.value?(u(),T(`div`,it,[l(v(re),{class:`mm-edit-splitter`},{default:e(()=>[l(v(P),{"default-size":360},{default:e(()=>[S(`div`,at,[r[14]||=S(`div`,{class:`mm-form-col__head`},[S(`div`,{class:`mm-pane__title`},`菜单配置`)],-1),l(Ve,{ref_key:`basicPanelRef`,ref:de,modelValue:k.value,"onUpdate:modelValue":r[4]||=e=>k.value=e,"type-locked":_e.value,"module-options":ft.value,loading:U.value,onOpenI18n:r[5]||=e=>ne.value=!0},null,8,[`modelValue`,`type-locked`,`module-options`,`loading`])])]),_:1}),ge.value?h(``,!0):(u(),E(v(P),{key:0},{default:e(()=>[l(qe,{modelValue:R.value,"onUpdate:modelValue":r[6]||=e=>R.value=e,loading:B.value,"menu-id":String(H.value.b_id)},null,8,[`modelValue`,`loading`,`menu-id`])]),_:1})),ge.value?h(``,!0):(u(),E(v(P),{key:1,"default-size":260},{default:e(()=>[l($e,{modelValue:R.value,"onUpdate:modelValue":r[7]||=e=>R.value=e},null,8,[`modelValue`])]),_:1}))]),_:1})])):w.value?(u(),T(`div`,ot,[...r[15]||=[S(`span`,{class:`mm-config-state__spinner`},null,-1),S(`span`,null,`加载中...`,-1)]])):(u(),T(`div`,st,`暂无配置数据`))],64)):(u(),T(`div`,ct,[l(v(ue),{size:32}),r[16]||=S(`span`,null,`请选择左侧菜单节点`,-1)]))])]),_:1})]),_:1})]),l(v(te),{open:Z.value,"onUpdate:open":r[9]||=e=>Z.value=e,title:`确认`,"confirm-loading":$.value,"mask-closable":!$.value,keyboard:!$.value},{footer:e(()=>[l(v(A),{type:`outline`,disabled:$.value,onClick:r[8]||=e=>Z.value=!1},{default:e(()=>[...r[17]||=[C(`取消`,-1)]]),_:1},8,[`disabled`]),l(v(A),{type:Q.value?.okType||`primary`,loading:$.value,onClick:gt},{default:e(()=>[C(n(Q.value?.okText||`确定`),1)]),_:1},8,[`type`,`loading`])]),default:e(()=>[S(`p`,lt,n(Q.value?.content),1)]),_:1},8,[`open`,`confirm-loading`,`mask-closable`,`keyboard`]),l(Ee,{open:ne.value,languages:o.value,"model-value":Qe.value,hint:`${f.value}即「菜单名称」;其余语言保存到多语言表(s_i18n,键 menu.编码)。`,"onUpdate:modelValue":ut,"onUpdate:open":r[10]||=e=>ne.value=e},null,8,[`open`,`languages`,`model-value`,`hint`]),l(Ce,{open:!!Y.value,name:Y.value?.name||``,saving:X.value,"save-text":`保存并继续`,"discard-text":`放弃修改`,onSave:Ge,onDiscard:We,"onUpdate:open":r[11]||=e=>!e&&Ue()},null,8,[`open`,`name`,`saving`])]))}},[[`__scopeId`,`data-v-a06da6b2`]]);export{ut as default};