@ibiz-template/mob-vue3-components 0.7.41-alpha.23 → 0.7.41-alpha.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index-HQsqnjtM.js +2 -0
- package/dist/index-HQsqnjtM.js.map +1 -0
- package/dist/index.min.css +9 -9
- package/dist/index.system.min.js +1 -1
- package/dist/{quill-CeDXLpcJ.js → quill-CSDnV3Pb.js} +2 -2
- package/dist/{quill-CeDXLpcJ.js.map → quill-CSDnV3Pb.js.map} +1 -1
- package/dist/quill-editor-B7NuxNK7.js +2 -0
- package/dist/{quill-editor-C5mEMG93.js.map → quill-editor-B7NuxNK7.js.map} +1 -1
- package/dist/quill-editor-preview-CtFf0ZKt.js +2 -0
- package/dist/{quill-editor-preview-BPS9uMa7.js.map → quill-editor-preview-CtFf0ZKt.js.map} +1 -1
- package/dist/tree-on8cJom4.js +2 -0
- package/dist/{tree-SAqvldtV.js.map → tree-on8cJom4.js.map} +1 -1
- package/dist/{xlsx-util-b5CesqYd.js → xlsx-util-DRvvWEVq.js} +2 -2
- package/dist/{xlsx-util-b5CesqYd.js.map → xlsx-util-DRvvWEVq.js.map} +1 -1
- package/es/common/fullscreen-header/fullscreen-header.css +1 -1
- package/es/control/app-menu/app-menu.mjs +2 -2
- package/es/control/app-menu/custom-menu-design/custom-menu-design.css +1 -1
- package/es/control/app-menu/custom-menu-design/custom-menu-design.mjs +30 -86
- package/es/control/app-menu/custom-menu-design/menu-design-list/menu-design-list.css +1 -0
- package/es/control/app-menu/custom-menu-design/menu-design-list/menu-design-list.mjs +105 -0
- package/es/control/app-menu/custom-menu-design/menu-design-tree/menu-design-tree.css +1 -0
- package/es/control/app-menu/custom-menu-design/menu-design-tree/menu-design-tree.mjs +124 -0
- package/es/control/app-menu/menu-render-util.mjs +4 -1
- package/es/control/form/form-detail/form-button/form-button.mjs +3 -3
- package/es/control/toolbar/float-toolbar/float-toolbar.mjs +6 -1
- package/es/control/toolbar/toolbar-group-list/toolbar-group-list.css +1 -1
- package/es/control/toolbar/toolbar-group-list/toolbar-group-list.mjs +26 -12
- package/es/control/toolbar/toolbar-render-util.mjs +68 -17
- package/es/control/toolbar/toolbar.css +1 -1
- package/es/control/toolbar/toolbar.mjs +3 -0
- package/es/editor/html/quill-editor-preview/quill-editor-preview.css +1 -1
- package/es/editor/upload/ibiz-file-upload/ibiz-file-upload.css +1 -1
- package/es/mob-app/guard/auth-guard/dyna-auth-guard.mjs +1 -1
- package/es/util/button-util/button-util.mjs +2 -2
- package/es/util/fullscreen/fullscreen-util.mjs +1 -1
- package/es/util/list-util/list-render-util.mjs +2 -2
- package/es/view/download-view/download-view.mjs +4 -1
- package/es/view/login-view/login-view.mjs +1 -0
- package/es/view-engine/index-view.engine.mjs +0 -4
- package/lib/common/fullscreen-header/fullscreen-header.css +1 -1
- package/lib/control/app-menu/app-menu.cjs +1 -1
- package/lib/control/app-menu/custom-menu-design/custom-menu-design.cjs +29 -85
- package/lib/control/app-menu/custom-menu-design/custom-menu-design.css +1 -1
- package/lib/control/app-menu/custom-menu-design/menu-design-list/menu-design-list.cjs +107 -0
- package/lib/control/app-menu/custom-menu-design/menu-design-list/menu-design-list.css +1 -0
- package/lib/control/app-menu/custom-menu-design/menu-design-tree/menu-design-tree.cjs +126 -0
- package/lib/control/app-menu/custom-menu-design/menu-design-tree/menu-design-tree.css +1 -0
- package/lib/control/app-menu/menu-render-util.cjs +4 -1
- package/lib/control/form/form-detail/form-button/form-button.cjs +3 -3
- package/lib/control/toolbar/float-toolbar/float-toolbar.cjs +6 -1
- package/lib/control/toolbar/toolbar-group-list/toolbar-group-list.cjs +25 -11
- package/lib/control/toolbar/toolbar-group-list/toolbar-group-list.css +1 -1
- package/lib/control/toolbar/toolbar-render-util.cjs +66 -15
- package/lib/control/toolbar/toolbar.cjs +3 -0
- package/lib/control/toolbar/toolbar.css +1 -1
- package/lib/editor/html/quill-editor-preview/quill-editor-preview.css +1 -1
- package/lib/editor/upload/ibiz-file-upload/ibiz-file-upload.css +1 -1
- package/lib/mob-app/guard/auth-guard/dyna-auth-guard.cjs +1 -1
- package/lib/util/button-util/button-util.cjs +2 -2
- package/lib/util/fullscreen/fullscreen-util.cjs +1 -1
- package/lib/util/list-util/list-render-util.cjs +2 -2
- package/lib/view/download-view/download-view.cjs +3 -0
- package/lib/view/login-view/login-view.cjs +1 -0
- package/lib/view-engine/index-view.engine.cjs +0 -4
- package/package.json +5 -5
- package/dist/index-Cxv8dJIk.js +0 -2
- package/dist/index-Cxv8dJIk.js.map +0 -1
- package/dist/quill-editor-C5mEMG93.js +0 -2
- package/dist/quill-editor-preview-BPS9uMa7.js +0 -2
- package/dist/tree-SAqvldtV.js +0 -2
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
System.register(["vue","@ibiz-template/vue3-util","./quill-CSDnV3Pb.js","@ibiz-template/core","lodash-es","./index-HQsqnjtM.js","vant","ramda","@ibiz-template/runtime","@floating-ui/dom","vue-router","pinia","qx-util","dayjs","vuedraggable","qs","vue-i18n","@ibiz-template/devtool","@ibiz-template/model-helper"],function(e){"use strict";var l,t,i,a,n,o,s,r,d,u,c,p,m,h;return{setters:[function(e){l=e.defineComponent,t=e.createVNode,i=e.resolveComponent,a=e.ref,n=e.watch,o=e.isVNode,s=e.nextTick},function(e){r=e.getEditorEmits,d=e.getHtmlProps,u=e.useNamespace},function(e){c=e.Q},function(e){p=e.getAppCookie,m=e.CoreConst,h=e.base64ToBlob},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],execute:function(){function v(e){return"function"==typeof e||"[object Object]"===Object.prototype.toString.call(e)&&!o(e)}e("default",l({name:"IBizQuill",props:d(),emits:r(),setup(e,{emit:l}){const t=u("quill"),i=e.controller,o=a(null),r=ibiz.i18n.getLang();let d=null;const v=a({["".concat(ibiz.env.tokenHeader,"Authorization")]:"".concat(ibiz.env.tokenPrefix,"Bearer ").concat(p(m.TOKEN))}),f=a(""),b=a(""),g=a(!1),w=a(!1),C=a(""),x=a(!0),z=()=>"text"===i.valueMode?d.getText():d.getSemanticHTML(),y=()=>{if(!o.value)return;const l=i.showToolbar?"snow":"bubble";d=new c(o.value,{theme:l,modules:i.modules,readOnly:e.disabled||e.readonly,placeholder:i.placeHolder}),d.on("text-change",(l,t,a)=>{if("user"===a){const t=(e=>{const l=e.ops.find(e=>e.insert&&e.insert.image);if(l)return l.insert.image})(l);if(t&&"file"===i.imageMode)return void(async l=>{const t=h(l),a=await ibiz.util.file.fileUpload(f.value,t,v.value);let n=b.value.replace("%fileId%",a.fileid);if(ibiz.config.common.enableDownloadTicket&&!i.enableNoAccess){const l=await ibiz.util.file.getDownloadTicket(i.context,i.params,e.data||{},{fileId:a.id},i.downloadTicketParams);l&&l.ticket&&(n=b.value.replace("%fileId%",l.ticket))}const o=z();C.value=o.replace(l,n)})(t);C.value=z()}}),"text"===i.valueMode&&d.setText(e.value||"")};n(()=>[e.disabled,e.readonly],()=>{d&&(e.disabled||e.readonly?d.enable(!1):d.enable())},{immediate:!0}),n(()=>e.data,e=>{if(e){const l={...i.editorParams,enableNoAccess:i.enableNoAccess,globalDownloadPrifix:i.globalDownloadPrifix};l.uploadparams&&(l.uploadParams=JSON.parse(l.uploadparams)),l.exportparams&&(l.exportParams=JSON.parse(l.exportparams));const t=ibiz.util.file.calcFileUpDownUrl(i.context,i.params,e,l);f.value=t.uploadUrl,b.value=t.downloadUrl}},{immediate:!0,deep:!0}),n(()=>e.value,()=>{d&&e.value&&(C.value=e.value,"text"===i.valueMode?d.setText(e.value):(w.value=!0,s(()=>{w.value=!1})))},{immediate:!0});return{ns:t,c:i,lang:r,editing:g,updating:w,editorRef:o,isCollapse:x,handleEdit:()=>{d||y()},handleCancel:()=>{g.value=!1},handleConfirm:()=>{l("change",C.value),g.value=!1}}},render(){let e,l;return t("div",{class:[this.ns.b(),this.disabled?this.ns.m("disabled"):"",this.readonly?this.ns.m("readonly"):"",this.ns.m(this.lang.toLowerCase())]},[!this.updating&&t(i("iBizQuillPreview"),{value:this.value,controller:this.controller,disabled:this.disabled,readonly:this.readonly,showCollapse:this.c.showCollapse,defaultHeight:this.c.defaultHeight,isCollapse:this.isCollapse,onEdit:()=>{this.editing=!0},onCollapse:e=>{this.isCollapse=e}},null),t(i("van-action-sheet"),{show:this.editing,"onUpdate:show":e=>this.editing=e,teleport:"body",class:[this.ns.e("popup"),this.ns.m(this.lang.toLowerCase())],onOpened:this.handleEdit},{default:()=>[t("div",{class:this.ns.e("content")},[t("div",{ref:"editorRef"},["html"===this.controller.valueMode?t("div",{innerHTML:this.value},null):null])]),t("div",{class:this.ns.e("footer")},[t(i("van-button"),{class:this.ns.e("cancel"),onClick:this.handleCancel},v(e=ibiz.i18n.t("editor.common.cancel"))?e:{default:()=>[e]}),t(i("van-button"),{class:this.ns.e("confirm"),onClick:this.handleConfirm,type:"primary"},v(l=ibiz.i18n.t("editor.common.confirm"))?l:{default:()=>[l]})])]})])}}))}}});
|
|
2
|
+
//# sourceMappingURL=quill-editor-B7NuxNK7.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quill-editor-C5mEMG93.js","sources":["../src/editor/html/quill-editor/quill-editor.tsx"],"sourcesContent":["/* eslint-disable import/no-extraneous-dependencies */\nimport { defineComponent, nextTick, Ref, ref, watch } from 'vue';\nimport {\n getHtmlProps,\n getEditorEmits,\n useNamespace,\n} from '@ibiz-template/vue3-util';\nimport 'quill/dist/quill.core.css';\nimport 'quill/dist/quill.snow.css';\nimport 'quill/dist/quill.bubble.css';\nimport Quill from 'quill';\nimport { Delta } from 'quill/core';\nimport { base64ToBlob, CoreConst, getAppCookie } from '@ibiz-template/core';\nimport { HtmlEditorController } from '../html-editor.controller';\nimport './quill-editor.scss';\n\n/**\n * 移动端HTML编辑框\n * @primary\n * @description 基于Quill深度定制可扩展的富文本编辑器,集成文件/图片上传、实时预览及样式配置功能,提供完整的富媒体编辑解决方案。支持编辑器类型包含:`移动端HTML编辑框`\n * @editorparams {name:uploadparams,parameterType:string,description:上传参数,图片或文件上传时,用于计算上传路径}\n * @editorparams {name:exportparams,parameterType:string,description:下载参数,图片或文件下载时,用于计算下载路径}\n * @editorparams {name:osscat,parameterType:string,description:用于计算上传和下载路径的OSS参数}\n * @editorparams {name:showtoolbar,parameterType:boolean,defaultvalue:true,description:显示工具栏}\n * @editorparams {name:valuemode,parameterType:'text' | 'html',defaultvalue:html,description:值模式,暂时只支持html模式}\n * @editorparams {name:imagemode,parameterType:'base64' | 'file',defaultvalue:'file',description:图片模式}\n * @editorparams {name:modules,parameterType:string,description:quill配置}\n * @editorparams {name:defaultheight,parameterType:number,defaultvalue:200,description:收缩时的高度}\n * @editorparams {name:showcollapse,parameterType:boolean,defaultvalue:true,description:是否显示伸缩按钮}\n * @editorparams {name:readonly,parameterType:boolean,defaultvalue:false,description:设置编辑器是否为只读态}\n * @editorparams {\"name\":\"enablenoaccess\",\"parameterType\":\"boolean\",\"defaultvalue\":\"false\", \"description\":\"是否启用无权限模式,若启用无权限模式,上传文件夹需拼接'$'字符,也不需要计算下载凭证\"}\n * @editorparams {\"name\":\"globaldownloadprifix\",\"parameterType\":\"boolean\",\"defaultvalue\":\"false\", \"description\":\"是否使用全局文件下载前缀,若启用,则以global作为前缀\"}\n * @ignoreprops autoFocus | overflowMode\n * @ignoreemits blur | focus | infoTextChange | enter\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst IBizQuill: any = defineComponent({\n name: 'IBizQuill',\n props: getHtmlProps<HtmlEditorController>(),\n emits: getEditorEmits(),\n setup(props, { emit }) {\n const ns = useNamespace('quill');\n const c: HtmlEditorController = props.controller;\n\n const editorRef = ref(null);\n\n const lang = ibiz.i18n.getLang();\n\n // 编辑器对象\n let quill: Quill | null = null;\n\n // 请求头\n const headers: Ref<IData> = ref({\n [`${ibiz.env.tokenHeader}Authorization`]: `${\n ibiz.env.tokenPrefix\n }Bearer ${getAppCookie(CoreConst.TOKEN)}`,\n });\n\n // 上传文件路径\n const uploadUrl: Ref<string> = ref('');\n\n // 下载文件路径\n const downloadUrl: Ref<string> = ref('');\n\n // 编辑状态\n const editing: Ref<boolean> = ref(false);\n\n // 更新中\n const updating: Ref<boolean> = ref(false);\n\n // 临时数据\n const tempValue: Ref<string> = ref('');\n\n // 是否完全展开\n const isCollapse: Ref<boolean> = ref(true);\n\n const getImage = (delta: Delta) => {\n const item = delta.ops.find(x => x.insert && (x.insert as IData).image);\n if (item) {\n return (item.insert as IData).image;\n }\n };\n\n const getValue = () => {\n if (c.valueMode === 'text') {\n return quill!.getText();\n }\n return quill!.getSemanticHTML();\n };\n\n // 处理图片上传(文件模式)\n const handleUpload = async (image: string) => {\n const blob = base64ToBlob(image);\n const file = await ibiz.util.file.fileUpload(\n uploadUrl.value,\n blob,\n headers.value,\n );\n let url = downloadUrl.value.replace('%fileId%', file.fileid);\n if (ibiz.config.common.enableDownloadTicket && !c.enableNoAccess) {\n const downloadTicket = await ibiz.util.file.getDownloadTicket(\n c.context,\n c.params,\n props.data || {},\n { fileId: file.id },\n c.downloadTicketParams,\n );\n if (downloadTicket && downloadTicket.ticket)\n url = downloadUrl.value.replace('%fileId%', downloadTicket.ticket);\n }\n const value = getValue();\n tempValue.value = value.replace(image, url);\n };\n\n const init = () => {\n if (!editorRef.value) {\n return;\n }\n const theme = c.showToolbar ? 'snow' : 'bubble';\n quill = new Quill(editorRef.value, {\n theme,\n modules: c.modules,\n readOnly: props.disabled || props.readonly,\n placeholder: c.placeHolder,\n });\n quill.on('text-change', (delta, oldDelta, source) => {\n if (source === 'user') {\n const image = getImage(delta);\n if (image && c.imageMode === 'file') {\n handleUpload(image);\n return;\n }\n tempValue.value = getValue();\n }\n });\n if (c.valueMode === 'text') {\n quill.setText(props.value || '');\n }\n };\n\n watch(\n () => [props.disabled, props.readonly],\n () => {\n if (!quill) {\n return;\n }\n if (props.disabled || props.readonly) {\n quill.enable(false);\n } else {\n quill.enable();\n }\n },\n { immediate: true },\n );\n\n // data响应式变更基础路径\n watch(\n () => props.data,\n newVal => {\n if (newVal) {\n const editorParams: IData = {\n ...c.editorParams,\n enableNoAccess: c.enableNoAccess,\n globalDownloadPrifix: c.globalDownloadPrifix,\n };\n if (editorParams.uploadparams) {\n editorParams.uploadParams = JSON.parse(editorParams.uploadparams);\n }\n if (editorParams.exportparams) {\n editorParams.exportParams = JSON.parse(editorParams.exportparams);\n }\n const urls = ibiz.util.file.calcFileUpDownUrl(\n c.context,\n c.params,\n newVal,\n editorParams,\n );\n uploadUrl.value = urls.uploadUrl;\n downloadUrl.value = urls.downloadUrl;\n }\n },\n { immediate: true, deep: true },\n );\n\n watch(\n () => props.value,\n () => {\n if (!quill || !props.value) {\n return;\n }\n tempValue.value = props.value;\n if (c.valueMode === 'text') {\n quill.setText(props.value);\n } else {\n updating.value = true;\n nextTick(() => {\n updating.value = false;\n });\n }\n },\n { immediate: true },\n );\n\n // 展开编辑\n const handleEdit = () => {\n if (!quill) {\n init();\n }\n };\n\n // 取消编辑\n const handleCancel = () => {\n editing.value = false;\n };\n\n // 确认编辑\n const handleConfirm = () => {\n emit('change', tempValue.value);\n editing.value = false;\n };\n\n return {\n ns,\n c,\n lang,\n editing,\n updating,\n editorRef,\n isCollapse,\n handleEdit,\n handleCancel,\n handleConfirm,\n };\n },\n render() {\n return (\n <div\n class={[\n this.ns.b(),\n this.disabled ? this.ns.m('disabled') : '',\n this.readonly ? this.ns.m('readonly') : '',\n this.ns.m(this.lang.toLowerCase()),\n ]}\n >\n {!this.updating && (\n <iBizQuillPreview\n value={this.value}\n controller={this.controller}\n disabled={this.disabled}\n readonly={this.readonly}\n showCollapse={this.c.showCollapse}\n defaultHeight={this.c.defaultHeight}\n isCollapse={this.isCollapse}\n onEdit={() => {\n this.editing = true;\n }}\n onCollapse={(val: boolean) => {\n this.isCollapse = val;\n }}\n />\n )}\n <van-action-sheet\n v-model:show={this.editing}\n teleport='body'\n class={[this.ns.e('popup'), this.ns.m(this.lang.toLowerCase())]}\n onOpened={this.handleEdit}\n >\n <div class={this.ns.e('content')}>\n <div ref='editorRef'>\n {this.controller.valueMode === 'html' ? (\n <div v-html={this.value}></div>\n ) : null}\n </div>\n </div>\n <div class={this.ns.e('footer')}>\n <van-button class={this.ns.e('cancel')} onClick={this.handleCancel}>\n {ibiz.i18n.t('editor.common.cancel')}\n </van-button>\n <van-button\n class={this.ns.e('confirm')}\n onClick={this.handleConfirm}\n type='primary'\n >\n {ibiz.i18n.t('editor.common.confirm')}\n </van-button>\n </div>\n </van-action-sheet>\n </div>\n );\n },\n});\n\nexport default IBizQuill;\n"],"names":["s","Object","prototype","toString","call","_isVNode","exports","defineComponent","name","props","getHtmlProps","emits","getEditorEmits","setup","emit","ns","useNamespace","c","controller","editorRef","ref","lang","ibiz","i18n","getLang","quill","headers","concat","env","tokenHeader","tokenPrefix","getAppCookie","CoreConst","TOKEN","uploadUrl","downloadUrl","editing","tempValue","isCollapse","getValue","valueMode","init","updating","theme","modules","placeholder","placeHolder","getImage","delta","oldDelta","source","item","image","ops","find","x","insert","async","base64ToBlob","url","value","replace","file","fileid","enableDownloadTicket","enableNoAccess","downloadTicket","util","context","fileId","id","ticket","handleUpload","getSemanticHTML","setText","watch","disabled","readonly","config","downloadTicketParams","immediate","data","newVal","editorParams","globalDownloadPrifix","uploadparams","JSON","parse","exportParams","exportparams","calcFileUpDownUrl","params","imageMode","nextTick","enable","handleEdit","deep","render","_slot","_slot2","_createVNode","this","m","toLowerCase","_resolveComponent","showCollapse","defaultHeight","onEdit","val","$event","teleport","onOpened","class","e","handleConfirm","onClick","handleCancel","t"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"quill-editor-B7NuxNK7.js","sources":["../src/editor/html/quill-editor/quill-editor.tsx"],"sourcesContent":["/* eslint-disable import/no-extraneous-dependencies */\nimport { defineComponent, nextTick, Ref, ref, watch } from 'vue';\nimport {\n getHtmlProps,\n getEditorEmits,\n useNamespace,\n} from '@ibiz-template/vue3-util';\nimport 'quill/dist/quill.core.css';\nimport 'quill/dist/quill.snow.css';\nimport 'quill/dist/quill.bubble.css';\nimport Quill from 'quill';\nimport { Delta } from 'quill/core';\nimport { base64ToBlob, CoreConst, getAppCookie } from '@ibiz-template/core';\nimport { HtmlEditorController } from '../html-editor.controller';\nimport './quill-editor.scss';\n\n/**\n * 移动端HTML编辑框\n * @primary\n * @description 基于Quill深度定制可扩展的富文本编辑器,集成文件/图片上传、实时预览及样式配置功能,提供完整的富媒体编辑解决方案。支持编辑器类型包含:`移动端HTML编辑框`\n * @editorparams {name:uploadparams,parameterType:string,description:上传参数,图片或文件上传时,用于计算上传路径}\n * @editorparams {name:exportparams,parameterType:string,description:下载参数,图片或文件下载时,用于计算下载路径}\n * @editorparams {name:osscat,parameterType:string,description:用于计算上传和下载路径的OSS参数}\n * @editorparams {name:showtoolbar,parameterType:boolean,defaultvalue:true,description:显示工具栏}\n * @editorparams {name:valuemode,parameterType:'text' | 'html',defaultvalue:html,description:值模式,暂时只支持html模式}\n * @editorparams {name:imagemode,parameterType:'base64' | 'file',defaultvalue:'file',description:图片模式}\n * @editorparams {name:modules,parameterType:string,description:quill配置}\n * @editorparams {name:defaultheight,parameterType:number,defaultvalue:200,description:收缩时的高度}\n * @editorparams {name:showcollapse,parameterType:boolean,defaultvalue:true,description:是否显示伸缩按钮}\n * @editorparams {name:readonly,parameterType:boolean,defaultvalue:false,description:设置编辑器是否为只读态}\n * @editorparams {\"name\":\"enablenoaccess\",\"parameterType\":\"boolean\",\"defaultvalue\":\"false\", \"description\":\"是否启用无权限模式,若启用无权限模式,上传文件夹需拼接'$'字符,也不需要计算下载凭证\"}\n * @editorparams {\"name\":\"globaldownloadprifix\",\"parameterType\":\"boolean\",\"defaultvalue\":\"false\", \"description\":\"是否使用全局文件下载前缀,若启用,则以global作为前缀\"}\n * @ignoreprops autoFocus | overflowMode\n * @ignoreemits blur | focus | infoTextChange | enter\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst IBizQuill: any = defineComponent({\n name: 'IBizQuill',\n props: getHtmlProps<HtmlEditorController>(),\n emits: getEditorEmits(),\n setup(props, { emit }) {\n const ns = useNamespace('quill');\n const c: HtmlEditorController = props.controller;\n\n const editorRef = ref(null);\n\n const lang = ibiz.i18n.getLang();\n\n // 编辑器对象\n let quill: Quill | null = null;\n\n // 请求头\n const headers: Ref<IData> = ref({\n [`${ibiz.env.tokenHeader}Authorization`]: `${\n ibiz.env.tokenPrefix\n }Bearer ${getAppCookie(CoreConst.TOKEN)}`,\n });\n\n // 上传文件路径\n const uploadUrl: Ref<string> = ref('');\n\n // 下载文件路径\n const downloadUrl: Ref<string> = ref('');\n\n // 编辑状态\n const editing: Ref<boolean> = ref(false);\n\n // 更新中\n const updating: Ref<boolean> = ref(false);\n\n // 临时数据\n const tempValue: Ref<string> = ref('');\n\n // 是否完全展开\n const isCollapse: Ref<boolean> = ref(true);\n\n const getImage = (delta: Delta) => {\n const item = delta.ops.find(x => x.insert && (x.insert as IData).image);\n if (item) {\n return (item.insert as IData).image;\n }\n };\n\n const getValue = () => {\n if (c.valueMode === 'text') {\n return quill!.getText();\n }\n return quill!.getSemanticHTML();\n };\n\n // 处理图片上传(文件模式)\n const handleUpload = async (image: string) => {\n const blob = base64ToBlob(image);\n const file = await ibiz.util.file.fileUpload(\n uploadUrl.value,\n blob,\n headers.value,\n );\n let url = downloadUrl.value.replace('%fileId%', file.fileid);\n if (ibiz.config.common.enableDownloadTicket && !c.enableNoAccess) {\n const downloadTicket = await ibiz.util.file.getDownloadTicket(\n c.context,\n c.params,\n props.data || {},\n { fileId: file.id },\n c.downloadTicketParams,\n );\n if (downloadTicket && downloadTicket.ticket)\n url = downloadUrl.value.replace('%fileId%', downloadTicket.ticket);\n }\n const value = getValue();\n tempValue.value = value.replace(image, url);\n };\n\n const init = () => {\n if (!editorRef.value) {\n return;\n }\n const theme = c.showToolbar ? 'snow' : 'bubble';\n quill = new Quill(editorRef.value, {\n theme,\n modules: c.modules,\n readOnly: props.disabled || props.readonly,\n placeholder: c.placeHolder,\n });\n quill.on('text-change', (delta, oldDelta, source) => {\n if (source === 'user') {\n const image = getImage(delta);\n if (image && c.imageMode === 'file') {\n handleUpload(image);\n return;\n }\n tempValue.value = getValue();\n }\n });\n if (c.valueMode === 'text') {\n quill.setText(props.value || '');\n }\n };\n\n watch(\n () => [props.disabled, props.readonly],\n () => {\n if (!quill) {\n return;\n }\n if (props.disabled || props.readonly) {\n quill.enable(false);\n } else {\n quill.enable();\n }\n },\n { immediate: true },\n );\n\n // data响应式变更基础路径\n watch(\n () => props.data,\n newVal => {\n if (newVal) {\n const editorParams: IData = {\n ...c.editorParams,\n enableNoAccess: c.enableNoAccess,\n globalDownloadPrifix: c.globalDownloadPrifix,\n };\n if (editorParams.uploadparams) {\n editorParams.uploadParams = JSON.parse(editorParams.uploadparams);\n }\n if (editorParams.exportparams) {\n editorParams.exportParams = JSON.parse(editorParams.exportparams);\n }\n const urls = ibiz.util.file.calcFileUpDownUrl(\n c.context,\n c.params,\n newVal,\n editorParams,\n );\n uploadUrl.value = urls.uploadUrl;\n downloadUrl.value = urls.downloadUrl;\n }\n },\n { immediate: true, deep: true },\n );\n\n watch(\n () => props.value,\n () => {\n if (!quill || !props.value) {\n return;\n }\n tempValue.value = props.value;\n if (c.valueMode === 'text') {\n quill.setText(props.value);\n } else {\n updating.value = true;\n nextTick(() => {\n updating.value = false;\n });\n }\n },\n { immediate: true },\n );\n\n // 展开编辑\n const handleEdit = () => {\n if (!quill) {\n init();\n }\n };\n\n // 取消编辑\n const handleCancel = () => {\n editing.value = false;\n };\n\n // 确认编辑\n const handleConfirm = () => {\n emit('change', tempValue.value);\n editing.value = false;\n };\n\n return {\n ns,\n c,\n lang,\n editing,\n updating,\n editorRef,\n isCollapse,\n handleEdit,\n handleCancel,\n handleConfirm,\n };\n },\n render() {\n return (\n <div\n class={[\n this.ns.b(),\n this.disabled ? this.ns.m('disabled') : '',\n this.readonly ? this.ns.m('readonly') : '',\n this.ns.m(this.lang.toLowerCase()),\n ]}\n >\n {!this.updating && (\n <iBizQuillPreview\n value={this.value}\n controller={this.controller}\n disabled={this.disabled}\n readonly={this.readonly}\n showCollapse={this.c.showCollapse}\n defaultHeight={this.c.defaultHeight}\n isCollapse={this.isCollapse}\n onEdit={() => {\n this.editing = true;\n }}\n onCollapse={(val: boolean) => {\n this.isCollapse = val;\n }}\n />\n )}\n <van-action-sheet\n v-model:show={this.editing}\n teleport='body'\n class={[this.ns.e('popup'), this.ns.m(this.lang.toLowerCase())]}\n onOpened={this.handleEdit}\n >\n <div class={this.ns.e('content')}>\n <div ref='editorRef'>\n {this.controller.valueMode === 'html' ? (\n <div v-html={this.value}></div>\n ) : null}\n </div>\n </div>\n <div class={this.ns.e('footer')}>\n <van-button class={this.ns.e('cancel')} onClick={this.handleCancel}>\n {ibiz.i18n.t('editor.common.cancel')}\n </van-button>\n <van-button\n class={this.ns.e('confirm')}\n onClick={this.handleConfirm}\n type='primary'\n >\n {ibiz.i18n.t('editor.common.confirm')}\n </van-button>\n </div>\n </van-action-sheet>\n </div>\n );\n },\n});\n\nexport default IBizQuill;\n"],"names":["s","Object","prototype","toString","call","_isVNode","exports","defineComponent","name","props","getHtmlProps","emits","getEditorEmits","setup","emit","ns","useNamespace","c","controller","editorRef","ref","lang","ibiz","i18n","getLang","quill","headers","concat","env","tokenHeader","tokenPrefix","getAppCookie","CoreConst","TOKEN","uploadUrl","downloadUrl","editing","tempValue","isCollapse","getValue","valueMode","init","updating","theme","modules","placeholder","placeHolder","getImage","delta","oldDelta","source","item","image","ops","find","x","insert","async","base64ToBlob","url","value","replace","file","fileid","enableDownloadTicket","enableNoAccess","downloadTicket","util","context","fileId","id","ticket","handleUpload","getSemanticHTML","setText","watch","disabled","readonly","config","downloadTicketParams","immediate","data","newVal","editorParams","globalDownloadPrifix","uploadparams","JSON","parse","exportParams","exportparams","calcFileUpDownUrl","params","imageMode","nextTick","enable","handleEdit","deep","render","_slot","_slot2","_createVNode","this","m","toLowerCase","_resolveComponent","showCollapse","defaultHeight","onEdit","val","$event","teleport","onOpened","class","e","handleConfirm","onClick","handleCancel","t"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
System.register(["vue","@ibiz-template/vue3-util","./quill-CSDnV3Pb.js","lodash-es","./index-HQsqnjtM.js","vant","@ibiz-template/core","ramda","@ibiz-template/runtime","@floating-ui/dom","vue-router","pinia","qx-util","dayjs","vuedraggable","qs","vue-i18n","@ibiz-template/devtool","@ibiz-template/model-helper"],function(e){"use strict";var l,t,i,n,s,a,o,u,r,d;return{setters:[function(e){l=e.defineComponent,t=e.createVNode,i=e.resolveComponent,n=e.ref,s=e.onMounted,a=e.nextTick,o=e.watch},function(e){u=e.getHtmlProps,r=e.useNamespace},function(e){d=e.Q},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],execute:function(){e("default",l({name:"IBizQuillPreview",props:{...u(),showCollapse:{type:Boolean},defaultHeight:{type:Number,default:200},isCollapse:{type:Boolean,default:!1}},setup(e,{emit:l}){const i=r("quill-preview"),u=e.controller,c=n(null),h=ibiz.i18n.getLang();let p=null;const v=n(""),m=n("auto"),C=n(!1),f=()=>{if(e.isCollapse&&c.value){const l=c.value.offsetHeight;l<e.defaultHeight?(m.value="".concat(l,"px"),C.value=!1):(m.value="".concat(e.defaultHeight,"px"),C.value=!0)}};s(()=>{c.value&&(p=new d(c.value,{theme:"bubble",modules:u.modules,readOnly:!0,placeholder:u.placeHolder}),"text"===u.valueMode&&p.setText(e.value||"")),a(()=>{f(),(l=>{if(!l)return;const t=l.querySelectorAll("img");let i=0;t.forEach(l=>{l.addEventListener("load",()=>{const t=l.offsetHeight;i+=t,i>e.defaultHeight&&(m.value="".concat(e.defaultHeight,"px"),C.value=!0)})})})(c.value)})});const g=()=>{l("collapse",!e.isCollapse)};return o(()=>[e.value,e.isCollapse],()=>{f()},{immediate:!0}),{ns:i,lang:h,editorRef:c,previewImage:v,collapseHeight:m,showCollapseBtn:C,handleClick:()=>{l("edit")},handleContentClick:e=>{const l=e.target;l&&"IMG"===l.tagName&&(v.value=l.src)},handlePreviewClose:()=>{v.value=""},renderCollapseBtn:()=>t("div",{class:i.b("collapse-btn"),onClick:g},[t("span",null,[e.isCollapse?ibiz.i18n.t("editor.html.expand"):ibiz.i18n.t("editor.html.collapse")]),e.isCollapse&&t("ion-icon",{name:"caret-down-outline"},null),!e.isCollapse&&t("ion-icon",{name:"caret-up-outline"},null)])}},render(){return t("div",{class:[this.ns.b(),this.disabled?this.ns.m("disabled"):"",this.readonly?this.ns.m("readonly"):"",this.ns.m(this.lang.toLowerCase()),this.showCollapse?this.ns.m("show-collapse"):"",this.ns.is("collapse",this.isCollapse)],style:this.ns.cssVarBlock({"height-default":"".concat(this.collapseHeight||"")})},[t("div",{ref:"editorRef",onClick:this.handleContentClick},["html"===this.controller.valueMode?t("div",{innerHTML:this.value},null):null]),this.readonly||this.disabled?null:t("div",{onClick:this.handleClick,class:this.ns.e("edit")},[t("ion-icon",{name:"create-outline"},null)]),this.showCollapse&&this.showCollapseBtn&&this.renderCollapseBtn(),t(i("van-popup"),{class:this.ns.e("image-popup"),show:!!this.previewImage,"close-on-popstate":!0,onClose:this.handlePreviewClose},{default:()=>[t(i("iBizPreviewImage"),{url:this.previewImage},null)]})])}}))}}});
|
|
2
|
+
//# sourceMappingURL=quill-editor-preview-CtFf0ZKt.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quill-editor-preview-
|
|
1
|
+
{"version":3,"file":"quill-editor-preview-CtFf0ZKt.js","sources":["../src/editor/html/quill-editor-preview/quill-editor-preview.tsx"],"sourcesContent":["/* eslint-disable import/no-extraneous-dependencies */\nimport { defineComponent, nextTick, onMounted, ref, watch } from 'vue';\nimport { getHtmlProps, useNamespace } from '@ibiz-template/vue3-util';\nimport Quill from 'quill';\nimport { HtmlEditorController } from '../html-editor.controller';\nimport './quill-editor-preview.scss';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst IBizQuillPreview: any = defineComponent({\n name: 'IBizQuillPreview',\n props: {\n ...getHtmlProps<HtmlEditorController>(),\n showCollapse: {\n type: Boolean,\n },\n defaultHeight: {\n type: Number,\n default: 200,\n },\n isCollapse: {\n type: Boolean,\n default: false,\n },\n },\n setup(props, { emit }) {\n const ns = useNamespace('quill-preview');\n const c: HtmlEditorController = props.controller;\n\n const editorRef = ref(null);\n\n const lang = ibiz.i18n.getLang();\n\n // 编辑器对象\n let quill: Quill | null = null;\n\n // 预览图片路径\n const previewImage = ref('');\n\n // 伸缩内容高度\n const collapseHeight = ref('auto');\n\n // 显示伸缩按钮\n const showCollapseBtn = ref(false);\n\n const init = () => {\n if (!editorRef.value) {\n return;\n }\n quill = new Quill(editorRef.value, {\n theme: 'bubble',\n modules: c.modules,\n readOnly: true,\n placeholder: c.placeHolder,\n });\n if (c.valueMode === 'text') {\n quill.setText(props.value || '');\n }\n };\n\n // 重置伸缩高度\n const resetCollapseHeight = () => {\n if (props.isCollapse && editorRef.value) {\n // 收缩时\n const height = (editorRef.value as HTMLElement).offsetHeight;\n // 内容高度低于设置的默认高度时,拿内容高度作为伸缩高度\n if (height < props.defaultHeight) {\n collapseHeight.value = `${height}px`;\n showCollapseBtn.value = false;\n } else {\n collapseHeight.value = `${props.defaultHeight}px`;\n showCollapseBtn.value = true;\n }\n }\n };\n\n // 监听img加载情况\n const watchHtmlImages = (container: HTMLElement | null) => {\n if (!container) return;\n const images = container.querySelectorAll('img');\n let totalHieght = 0;\n images.forEach(image => {\n image.addEventListener('load', () => {\n const height = image.offsetHeight;\n totalHieght += height;\n if (totalHieght > props.defaultHeight) {\n collapseHeight.value = `${props.defaultHeight}px`;\n showCollapseBtn.value = true;\n }\n });\n });\n };\n\n onMounted(() => {\n init();\n nextTick(() => {\n resetCollapseHeight();\n watchHtmlImages(editorRef.value);\n });\n });\n\n const handleClick = () => {\n emit('edit');\n };\n\n const handlePreviewClose = () => {\n previewImage.value = '';\n };\n\n const handleContentClick = (event: MouseEvent) => {\n const target = event.target as HTMLElement;\n if (target && target.tagName === 'IMG') {\n previewImage.value = (target as IData).src;\n }\n };\n\n // 点击伸缩按钮\n const onClick = () => {\n // isCollapse.value = !isCollapse.value;\n emit('collapse', !props.isCollapse);\n };\n\n // 绘制伸缩按钮\n const renderCollapseBtn = () => {\n return (\n <div class={ns.b('collapse-btn')} onClick={onClick}>\n <span>\n {props.isCollapse\n ? ibiz.i18n.t('editor.html.expand')\n : ibiz.i18n.t('editor.html.collapse')}\n </span>\n {props.isCollapse && <ion-icon name='caret-down-outline'></ion-icon>}\n {!props.isCollapse && <ion-icon name='caret-up-outline'></ion-icon>}\n </div>\n );\n };\n\n watch(\n () => [props.value, props.isCollapse],\n () => {\n resetCollapseHeight();\n },\n {\n immediate: true,\n },\n );\n\n return {\n ns,\n lang,\n editorRef,\n previewImage,\n collapseHeight,\n showCollapseBtn,\n handleClick,\n handleContentClick,\n handlePreviewClose,\n renderCollapseBtn,\n };\n },\n render() {\n return (\n <div\n class={[\n this.ns.b(),\n this.disabled ? this.ns.m('disabled') : '',\n this.readonly ? this.ns.m('readonly') : '',\n this.ns.m(this.lang.toLowerCase()),\n this.showCollapse ? this.ns.m('show-collapse') : '',\n this.ns.is('collapse', this.isCollapse),\n ]}\n style={this.ns.cssVarBlock({\n 'height-default': `${this.collapseHeight || ''}`,\n })}\n >\n <div ref='editorRef' onClick={this.handleContentClick}>\n {this.controller.valueMode === 'html' ? (\n <div v-html={this.value}></div>\n ) : null}\n </div>\n {!this.readonly && !this.disabled ? (\n <div onClick={this.handleClick} class={this.ns.e('edit')}>\n <ion-icon name='create-outline'></ion-icon>\n </div>\n ) : null}\n {this.showCollapse && this.showCollapseBtn && this.renderCollapseBtn()}\n <van-popup\n class={this.ns.e('image-popup')}\n show={!!this.previewImage}\n close-on-popstate={true}\n onClose={this.handlePreviewClose}\n >\n <iBizPreviewImage url={this.previewImage}></iBizPreviewImage>\n </van-popup>\n </div>\n );\n },\n});\n\nexport default IBizQuillPreview;\n"],"names":["name","props","IBizQuillPreview","type","getHtmlProps","Boolean","Number","defaultHeight","default","isCollapse","setup","emit","c","controller","ns","useNamespace","quill","editorRef","lang","getLang","showCollapseBtn","ref","theme","value","modules","offsetHeight","readOnly","placeholder","placeHolder","concat","onMounted","watchHtmlImages","collapseHeight","init","nextTick","resetCollapseHeight","container","images","totalHieght","height","image","watch","immediate","previewImage","handleClick","event","target","tagName","src","handlePreviewClose","renderCollapseBtn","class","b","onClick","ibiz","i18n","t","_createVNode","handleContentClick","this","m","readonly","toLowerCase","showCollapse","is","valueMode","disabled","e","_resolveComponent","show","render","url"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
System.register(["vue","@ibiz-template/vue3-util","ramda","@ibiz-template/runtime","lodash-es","qx-util","@ibiz-template-package/vs-tree-ex","./index-HQsqnjtM.js","vant","@ibiz-template/core","@floating-ui/dom","vue-router","pinia","dayjs","vuedraggable","qs","vue-i18n","@ibiz-template/devtool","@ibiz-template/model-helper"],function(e){"use strict";var t,n,o,a,l,s,i,r,c,d,u,h,m,p,v,b,f,g,y,N,_,C;return{setters:[function(e){t=e.defineComponent,n=e.withDirectives,o=e.createVNode,a=e.resolveComponent,l=e.resolveDirective,s=e.computed,i=e.ref,r=e.onUnmounted,c=e.isVNode,d=e.h,u=e.createApp},function(e){h=e.useControlController,m=e.useNamespace,p=e.IBizControlShell,v=e.IBizIcon},function(e){b=e.isNil},function(e){f=e.TreeController,g=e.getControlPanel},function(e){y=e.debounce},function(e){N=e.createUUID},function(e){_=e.VsTreeComponent},function(e){C=e.c},null,null,null,null,null,null,null,null,null,null,null],execute:function(){const D=t({name:"IBizTreeControl",components:{"vs-tree":_},props:{modelData:{type:Object,required:!0},context:{type:Object,required:!0},params:{type:Object,default:()=>({})},provider:{type:Object},mdctrlActiveMode:{type:Number,default:2},singleSelect:{type:Boolean,default:!0},navigational:{type:Boolean,default:void 0}},setup(){var e,t;const n=h((...e)=>new f(...e)),o=m("control-".concat(n.model.controlType.toLowerCase())),a=s(()=>n.state.selectedData.map(e=>e._id));let l=[];const c=i(),_=i(N()),D=i(""),k=N(),x=i(!0),E=i(!1),S="HEADERSTYLE"===n.crumbShowMode||n.state.navigational,I=e=>e.map(e=>{const t=(null==e?void 0:e._icon)?(e=>{const t=d(v,e),n=u(t),o=document.createElement("span");return n.mount(o),l.push(n),o})({icon:null==e?void 0:e._icon}):"";return{_id:e._id,id:e._id,_uuid:e._uuid,_leaf:e._leaf,_text:e._text,icon:t,_disableSelect:e._disableSelect}}),z=s(()=>{if(!n.state.isLoaded)return[];const e=n.model.rootVisible?n.state.rootNodes:n.state.rootNodes.reduce((e,t)=>t._children?e.concat(t._children):e,[]);return I(e)}),w=(e,t)=>{if(n.state.singleSelect)return;const{originData:o}=t,{selectedData:a}=n.state,l=n.getNodeData(o._uuid),s=a.filter(e=>e._id!==l._id);s.length===a.length?n.setSelection(a.concat([l])):n.setSelection(s)},L=(e,t)=>{e.stopPropagation();const{originData:o}=t;w(0,t),n.onTreeNodeClick(o,e)},K=e=>{n.state.mobExpandedKey=e._uuid||""},j=(e,t)=>{var n;e.preventDefault(),e.stopPropagation();const o=null==t?void 0:t.parent.list,a=o.length-2,l=o[a];if(!l)return;const s=l.store,i=null==(n=l.store)?void 0:n.data;o.splice(a+1),s.update(),K(i)},T=y(async()=>{var e,t,n,o,a,l,s,i,r;if(c.value){const d=null==(a=null==(o=null==(n=null==(t=null==(e=c.value)?void 0:e.tree)?void 0:t.tree)?void 0:n.store)?void 0:o.breadcrumb)?void 0:a.list,u=d?d[d.length-1]:null;u&&(u.childNodes=[],null==(r=null==(i=null==(s=null==(l=c.value)?void 0:l.tree)?void 0:s.tree)?void 0:i.store)||r.nodesChange([]),u.loaded=!1,u.setExpand(!0))}},500);n.evt.on("onAfterRefreshParent",()=>{T()}),n.evt.on("onLoadSuccess",()=>{n.state.mobExpandedKey="",_.value=N()});const B={maxHeight:"100%",checkInherit:!1,nocheckParent:!0,rootName:null==(t=null==(e=n.model.detreeNodes)?void 0:e.find(e=>e.rootNode))?void 0:t.name,virtual:{showCount:30},renderNode:(e,t)=>{const{originData:o}=t,a=(e=>{const t=n.getNodeData(e);if(t){const e=n.getNodeModel(t._nodeId),o=e?g(e):void 0;if(o)return{nodeData:t,layoutPanel:o}}})(o._id);if(a){const{nodeData:t,layoutPanel:o}=a,s=d(p,{data:t,modelData:o,context:n.context,params:n.params}),i=C(s);return i.mount(e),l.push(i),e}},renderContent:(e,t)=>{var l;const{loadingEl:s,originData:i}=t,r=(e=>{const t=n.getNodeData(e);if(t)return n.getNodeModel(t._nodeId)})(i._id);s&&(null==(l=null==r?void 0:r.sysCss)?void 0:l.cssName)&&s.parentNode.parentNode.classList.add("".concat(r.sysCss.cssName)),n.state.singleSelect&&(e=>{const{originData:t,loadingEl:n}=e;a.value.includes(t._id)&&n&&(n.parentNode.parentNode.classList.add("selected"),e.store.selectedCurrent=e)})(t);const c=[];if(null==r?void 0:r.counterId){const e=n.state.counterData[r.counterId];if(!(b(e)||1===r.counterMode&&0===e)){const t=document.createElement("div");t.className="ibiz-badge tree-counter ".concat(o.is("mob",!0)),t.innerText=e>99?"".concat(99,"+"):e,c.push(t)}}if(!i._leaf){const e=document.createElement("i");e.className="van-icon van-icon-arrow",c.push(e)}return e("div",{className:"tree-button ".concat(o.b("node-expanded-btn")),click:(e,t)=>{i._leaf||(t.store.breadcrumb.list.push(t),t.setExpand(!0),K(i))},children:c})},customNodeClick:(e,t)=>{const{checked:n}=t;t.setChecked(!n),L(e,t)}};x.value&&(Object.assign(B,{breadcrumb:{el:"#breadcrumb".concat(k),link:(e,t)=>{var n,a;if(((null==(a=null==(n=e.store)?void 0:n.breadcrumb)?void 0:a.list)||[]).length<2)return E.value=!0,null;E.value=!1;const l=document.createElement("span"),s=document.createElement("span");return s.innerText=t.name,t.icon instanceof HTMLElement&&l.appendChild(t.icon.cloneNode(!0)),l.appendChild(s),l.className="".concat(o.be("header","crumb")," ").concat(o.is("root",t._vsroot)),l.onclick=()=>K.bind(this)(t),l},separator:">"}}),S&&Object.assign(B.breadcrumb,{icon:(...e)=>{const t=e[2],n=document.createElement("span"),a=document.createElement("i");return a.className="van-icon van-icon-arrow-left",n.className="".concat(o.bem("header","crumb","back-btn")),n.appendChild(a),n.onclick=e=>j.bind(this)(e,t),n}}));const P=y(async e=>{const{mobExpandedKey:t}=n.state,o=t||n.state.rootNodes[0]._uuid,a=n.getNodeData(o);if(!a)return;const l=n.getLoadMoreInfoItems(a._id);if(!l)return;const s=l.some(e=>e.curPage<e.totalPage-1),{scrollTop:i,clientHeight:r,scrollHeight:d}=e.target;if(s&&i+r>=d-10){const e=I(await n.loadNodes(a,!0)),o=n.model.rootVisible||t?t:void 0,l=c.value.getNodeById(o);e.forEach(e=>l.append(e))}},300,{leading:!0});return r(()=>{l.forEach(e=>{e.unmount()}),l=[]}),{c:n,ns:o,uuid:k,options:B,treeRef:c,treeData:z,breadcrumb:x,currentVal:D,checkedKeys:a,treeRefreshKey:_,hiddenBreadcrumb:E,isHeaderStyle:S,onInput:async e=>{n.state.query=e,await n.load()},loadData:async(e,t)=>{if(!n.state.isLoaded)return;let o;const l=n.getNodeData(e.data._uuid);if(l&&l._children&&!n.state.query?(ibiz.log.debug("节点展开加载-本地",l),o=l._children):(ibiz.log.debug("节点展开加载-远程",l),o=await n.loadNodes(l)),o&&n.state.rootNodes.includes(o[0]))return t(z.value),n.state.mobExpandedKey="",void(_.value=N());t(I(o)),(()=>{var e;if(c.value){c.value.tree.tree.store.checkedKeys=a.value,c.value.tree.tree.store.setDefaultChecked();const t=(null==(e=c.value.tree.tree.store.breadcrumb)?void 0:e.list)||[];E.value=t.length<2}})()},onScroll:P,onNodeCheck:w,onNodeClick:L,treeDataFormat:e=>({id:e._id,name:e._text,children:e._children,isLeaf:e._leaf})}},render(){const e={searchbar:()=>this.c.enableQuickSearch?o(a("van-search"),{modelValue:this.c.state.query,class:this.ns.b("quick-search"),clearable:!0,placeholder:this.c.state.placeHolder,"onUpdate:model-value":this.onInput},null):null},t=this.c.controlPanel?"tree":"default";return e[t]=()=>{const e=[this.breadcrumb&&o("div",{class:[this.ns.be("header","container"),this.ns.is("hidden",this.hiddenBreadcrumb)]},[o(a("van-sticky"),null,{default:()=>[o("div",{id:"breadcrumb".concat(this.uuid),class:[this.ns.b("header"),this.ns.is("no-root",!this.treeData.length),this.ns.is("header-style",this.isHeaderStyle)]},null)]})]),this.c.state.isCreated&&this.c.state.isLoaded&&o(a("vs-tree"),{"show-line":!0,ref:"treeRef",lazy:!0,showIcon:!0,strictLeaf:!0,data:this.treeData,options:this.options,highlightCurrent:!0,key:this.treeRefreshKey,class:this.ns.b("content"),checkedKeys:this.checkedKeys,expandKeys:this.c.state.expandedKeys,"show-checkbox":!this.c.state.singleSelect,load:this.loadData,onScroll:this.onScroll,onCheck:this.onNodeCheck,format:this.treeDataFormat},null)];return o("div",{class:this.ns.b("container")},[e])},n(o(a("iBizControlBase"),{controller:this.c},"function"==typeof(s=e)||"[object Object]"===Object.prototype.toString.call(s)&&!c(s)?e:{default:()=>[e]}),[[l("loading"),this.c.state.isLoading]]);var s}});e({TreeControl:D,default:D})}}});
|
|
2
|
+
//# sourceMappingURL=tree-on8cJom4.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree-SAqvldtV.js","sources":["../src/control/tree/tree.tsx"],"sourcesContent":["import {\n IBizIcon,\n useNamespace,\n IBizControlShell,\n useControlController,\n} from '@ibiz-template/vue3-util';\nimport {\n h,\n App,\n ref,\n VNode,\n computed,\n PropType,\n createApp,\n onUnmounted,\n defineComponent,\n} from 'vue';\nimport { isNil } from 'ramda';\nimport { IDETree, IDETreeNode } from '@ibiz/model-core';\nimport {\n ITreeNodeData,\n TreeController,\n IControlProvider,\n getControlPanel,\n} from '@ibiz-template/runtime';\nimport { debounce } from 'lodash-es';\nimport { createUUID } from 'qx-util';\nimport { VsTreeComponent } from '@ibiz-template-package/vs-tree-ex';\nimport { createVueApp } from '../../mob-app/create-vue-app';\nimport './tree.scss';\n\nexport const TreeControl = defineComponent({\n name: 'IBizTreeControl',\n components: {\n 'vs-tree': VsTreeComponent,\n },\n props: {\n /**\n * @description 树控件模型数据\n */\n modelData: { type: Object as PropType<IDETree>, required: true },\n /**\n * @description 应用上下文对象\n */\n context: { type: Object as PropType<IContext>, required: true },\n /**\n * @description 视图参数对象\n * @default {}\n */\n params: { type: Object as PropType<IParams>, default: () => ({}) },\n /**\n * @description 部件适配器\n */\n provider: { type: Object as PropType<IControlProvider> },\n /**\n * @description 部件激活模式,值为0:无激活,值为1:单击激活,值为2:双击激活\n * @default 2\n */\n mdctrlActiveMode: { type: Number, default: 2 },\n /**\n * @description 是否单选\n * @default true\n */\n singleSelect: { type: Boolean, default: true },\n /**\n * @description 是否是导航内的(即树导航里的树)\n */\n navigational: { type: Boolean, default: undefined },\n },\n setup() {\n const c: TreeController = useControlController<TreeController>(\n (...args) => new TreeController(...args),\n );\n const ns = useNamespace(`control-${c.model.controlType!.toLowerCase()}`);\n // 默认选中项\n const checkedKeys = computed(() => {\n return c.state.selectedData.map(item => item._id);\n });\n\n // 节点创建的app实例,用于组件销毁时销毁所有实例\n let vueApps: App[] = [];\n // 引用的树组件实例\n const treeRef = ref();\n // 用于树强制刷新\n const treeRefreshKey = ref(createUUID());\n\n // 快捷搜索值\n const currentVal = ref('');\n\n const uuid = createUUID();\n\n // 启用面包屑功能\n const breadcrumb = ref(true);\n\n // 隐藏显示面包屑\n const hiddenBreadcrumb = ref(false);\n\n const isHeaderStyle =\n c.crumbShowMode === 'HEADERSTYLE' || c.state.navigational;\n\n // 创建图标节点\n const createIconNode = (customProps: IData) => {\n const iop = h(IBizIcon, customProps);\n const vueApp = createApp(iop);\n const dom = document.createElement('span');\n vueApp.mount(dom);\n vueApps.push(vueApp);\n return dom;\n };\n\n /**\n * 创建新的节点对象,隔离组件数据和controller数据\n * @param {ITreeNodeData[]} nodes\n * @return {*} {IData[]}\n */\n const toElNodes = (nodes: ITreeNodeData[]): IData[] => {\n return nodes.map(node => {\n const iconDom = node?._icon\n ? createIconNode({ icon: node?._icon })\n : '';\n return {\n _id: node._id,\n id: node._id,\n _uuid: node._uuid,\n _leaf: node._leaf,\n _text: node._text,\n icon: iconDom,\n _disableSelect: node._disableSelect,\n };\n });\n };\n\n /** 树展示数据 */\n const treeData = computed(() => {\n if (!c.state.isLoaded) {\n return [];\n }\n const nodes = c.model.rootVisible\n ? c.state.rootNodes\n : c.state.rootNodes.reduce<ITreeNodeData[]>((result, nodeData) => {\n if (nodeData._children) {\n return result.concat(nodeData._children as ITreeNodeData[]);\n }\n return result;\n }, []);\n return toElNodes(nodes as ITreeNodeData[]);\n });\n\n /**\n * @description 查找节点模型\n * @param {string} key\n * @returns {*} {(IDETreeNode | undefined)}\n */\n const findNodeModel = (key: string): IDETreeNode | undefined => {\n const nodeData = c.getNodeData(key);\n if (nodeData) return c.getNodeModel(nodeData._nodeId);\n };\n\n /**\n * @description 查找节点视图布局面板\n * @param {string} key\n * @returns {*}\n */\n const findNodeLayoutPanel = (key: string) => {\n const nodeData = c.getNodeData(key);\n if (nodeData) {\n const nodeModel = c.getNodeModel(nodeData._nodeId);\n const layoutPanel = nodeModel ? getControlPanel(nodeModel) : undefined;\n if (layoutPanel) return { nodeData, layoutPanel };\n }\n };\n\n /**\n * @description 更新vs树,防止树节点数据加载完后选中数据丢失\n */\n const updateUI = () => {\n if (treeRef.value) {\n treeRef.value.tree.tree.store.checkedKeys = checkedKeys.value;\n treeRef.value.tree.tree.store.setDefaultChecked();\n const list = treeRef.value.tree.tree.store.breadcrumb?.list || [];\n hiddenBreadcrumb.value = list.length < 2;\n }\n };\n\n /**\n * 触发节点加载数据\n * @author zk\n * @date 2023-05-29 09:16:07\n * @param {IData} item\n * @param {(nodes: IData[]) => void} callback\n */\n const loadData = async (\n item: IData,\n callback: (nodes: IData[]) => void,\n ) => {\n // 没加载前拦截\n if (!c.state.isLoaded) return;\n // 加载时拦截点击事件\n let nodes: ITreeNodeData[];\n const nodeData = c.getNodeData(item.data._uuid)!;\n // 有搜索值为搜索框搜索,必须请求后台数据过滤\n if (nodeData && nodeData._children && !c.state.query) {\n ibiz.log.debug('节点展开加载-本地', nodeData);\n nodes = nodeData._children;\n } else {\n ibiz.log.debug('节点展开加载-远程', nodeData);\n nodes = await c.loadNodes(nodeData);\n }\n // 根节点搜索时,返回树展示数据,并强制刷新\n if (nodes && c.state.rootNodes.includes(nodes[0])) {\n callback(treeData.value);\n c.state.mobExpandedKey = '';\n treeRefreshKey.value = createUUID();\n return;\n }\n callback(toElNodes(nodes));\n updateUI();\n };\n\n /**\n * 多选时选中节点变更\n *\n * @param {ITreeNodeData} nodeData\n */\n const onNodeCheck = (event: MouseEvent, opts: IData) => {\n if (c.state.singleSelect) return;\n const { originData } = opts;\n // 选中相关处理\n const { selectedData } = c.state;\n const nodeData = c.getNodeData(originData._uuid)!;\n // 选中里没有则添加,有则删除\n const filterArr = selectedData.filter(\n (item: IData) => item._id !== nodeData._id,\n );\n if (filterArr.length === selectedData.length) {\n c.setSelection(selectedData.concat([nodeData]));\n } else {\n c.setSelection(filterArr);\n }\n };\n\n const onNodeClick = (event: MouseEvent, opts: IData) => {\n event.stopPropagation();\n const { originData } = opts;\n onNodeCheck(event, opts);\n c.onTreeNodeClick(originData, event);\n };\n\n // 处理展开节点切换\n const handleExpandedLastKey = (data: IData) => {\n c.state.mobExpandedKey = data._uuid || '';\n };\n\n // 面包屑回退按钮点击事件\n const handleCrumbBack = (_e: MouseEvent, crumbItem?: IData) => {\n _e.preventDefault();\n _e.stopPropagation();\n\n const breads = crumbItem?.parent.list;\n const prevIndex = breads.length - 2;\n const prevNode = breads[prevIndex];\n if (!prevNode) return;\n const store = prevNode.store;\n const _data = prevNode.store?.data;\n breads.splice(prevIndex + 1);\n store.update();\n handleExpandedLastKey(_data);\n };\n\n // 搜索\n const debounceSearch = debounce(async () => {\n if (treeRef.value) {\n // 获取最后展开的节点\n const list = treeRef.value?.tree?.tree?.store?.breadcrumb?.list;\n const breadcrumbListLast = list ? list[list.length - 1] : null;\n if (breadcrumbListLast) {\n breadcrumbListLast.childNodes = [];\n treeRef.value?.tree?.tree?.store?.nodesChange([]);\n breadcrumbListLast.loaded = false;\n breadcrumbListLast.setExpand(true);\n }\n }\n }, 500);\n\n const onInput = async (value: string): Promise<void> => {\n c.state.query = value;\n await c.load();\n };\n\n c.evt.on('onAfterRefreshParent', () => {\n debounceSearch();\n });\n\n c.evt.on('onLoadSuccess', () => {\n c.state.mobExpandedKey = '';\n treeRefreshKey.value = createUUID();\n });\n\n /**\n * 树数据格式化\n *\n * @author zk\n * @date 2023-07-03 11:07:59\n * @param {ITreeNodeData} data\n * @return {*}\n */\n const treeDataFormat = (data: ITreeNodeData) => {\n return {\n id: data._id,\n name: data._text,\n children: data._children,\n isLeaf: data._leaf,\n };\n };\n\n /**\n * 处理单选默认选中样式\n *\n * @author ljx\n * @date 2024-12-12 15:07:59\n * @param {IData} opts\n * @return {*}\n */\n const handleSingleSelect = (opts: IData) => {\n const { originData, loadingEl } = opts;\n if (checkedKeys.value.includes(originData._id) && loadingEl) {\n loadingEl.parentNode.parentNode.classList.add('selected');\n opts.store.selectedCurrent = opts;\n }\n };\n\n /**\n * @description 绘制节点\n * @param {HTMLDivElement} dom 父dom元素\n * @param {IData} opts 配置\n * @returns {*}\n */\n const renderNode = (dom: HTMLDivElement, opts: IData) => {\n const { originData } = opts;\n const nodeLayoutPanel = findNodeLayoutPanel(originData._id);\n if (nodeLayoutPanel) {\n const { nodeData, layoutPanel } = nodeLayoutPanel;\n const nodePanel = h(IBizControlShell, {\n data: nodeData,\n modelData: layoutPanel,\n context: c.context,\n params: c.params,\n });\n const vueApp = createVueApp(nodePanel);\n vueApp.mount(dom);\n vueApps.push(vueApp);\n return dom;\n }\n };\n\n const renderContent = (\n _h: (tag: string, opt: IData) => VNode,\n opts: IData,\n ) => {\n // 添加节点样式表\n const { loadingEl, originData } = opts;\n const nodeModel = findNodeModel(originData._id);\n if (loadingEl && nodeModel?.sysCss?.cssName)\n loadingEl.parentNode.parentNode.classList.add(\n `${nodeModel.sysCss.cssName}`,\n );\n if (c.state.singleSelect) handleSingleSelect(opts);\n\n const children: HTMLElement[] = [];\n\n // 添加计数器\n if (nodeModel?.counterId) {\n const count = c.state.counterData[nodeModel.counterId];\n if (!(isNil(count) || (nodeModel.counterMode === 1 && count === 0))) {\n const child = document.createElement('div');\n child.className = `ibiz-badge tree-counter ${ns.is('mob', true)}`;\n child.innerText = count > 99 ? `${99}+` : count;\n children.push(child);\n }\n }\n\n // 非叶子节点添加展开图标\n if (!originData._leaf) {\n const child = document.createElement('i');\n child.className = 'van-icon van-icon-arrow';\n children.push(child);\n }\n\n // 节点内容区绘制\n return _h('div', {\n className: `tree-button ${ns.b('node-expanded-btn')}`,\n click: (e: Event, _opts: IData) => {\n if (originData._leaf) return;\n _opts.store.breadcrumb.list.push(_opts);\n _opts.setExpand(true);\n handleExpandedLastKey(originData);\n },\n children,\n });\n };\n\n const customNodeClick = (event: MouseEvent, opts: IData) => {\n const { checked } = opts;\n opts.setChecked(!checked);\n onNodeClick(event, opts);\n };\n\n // vs树配置项\n const options = {\n maxHeight: '100%',\n // 继承父状态\n checkInherit: false,\n // 不能选择父节点\n nocheckParent: true,\n rootName: c.model.detreeNodes?.find(item => item.rootNode)?.name,\n virtual: {\n showCount: 30, // 虚拟列表显示数量,太少时会导致虚拟列表无法滚动\n },\n renderNode,\n renderContent,\n customNodeClick,\n } as IParams;\n\n if (breadcrumb.value) {\n Object.assign(options, {\n breadcrumb: {\n el: `#breadcrumb${uuid}`,\n link: (node: IData, data: IData) => {\n const list = node.store?.breadcrumb?.list || [];\n if (list.length < 2) {\n hiddenBreadcrumb.value = true;\n return null;\n }\n hiddenBreadcrumb.value = false;\n const content = document.createElement('span');\n const textDom = document.createElement('span');\n textDom.innerText = data.name;\n if (data.icon instanceof HTMLElement) {\n content.appendChild(data.icon.cloneNode(true));\n }\n content.appendChild(textDom);\n content.className = `${ns.be('header', 'crumb')} ${ns.is(\n 'root',\n data._vsroot,\n )}`;\n content.onclick = () => handleExpandedLastKey.bind(this)(data);\n return content;\n },\n separator: '>',\n },\n });\n\n if (isHeaderStyle) {\n Object.assign(options.breadcrumb, {\n icon: (...args: IParams[]) => {\n const crumbItem = args[2];\n const content = document.createElement('span');\n const iconDom = document.createElement('i');\n iconDom.className = 'van-icon van-icon-arrow-left';\n content.className = `${ns.bem('header', 'crumb', 'back-btn')}`;\n content.appendChild(iconDom);\n content.onclick = (_e: MouseEvent) =>\n handleCrumbBack.bind(this)(_e, crumbItem);\n return content;\n },\n });\n }\n }\n\n /**\n * 滚动事件\n * - 加载更多\n */\n const onScroll = debounce(\n async (event: MouseEvent) => {\n const { mobExpandedKey } = c.state;\n // 当前展开节点默认是根节点\n const expandNodeKey = mobExpandedKey || c.state.rootNodes[0]._uuid;\n const nodeData = c.getNodeData(expandNodeKey);\n if (!nodeData) return;\n const infoItems = c.getLoadMoreInfoItems(nodeData._id);\n if (!infoItems) return;\n const result = infoItems.some(infoItem => {\n return infoItem.curPage < infoItem.totalPage - 1;\n });\n const { scrollTop, clientHeight, scrollHeight } = event.target as IData;\n // 滚动到底部且还有下一页数据时\n if (result && scrollTop + clientHeight >= scrollHeight - 10) {\n const childern = toElNodes(await c.loadNodes(nodeData, true));\n // 如果不显示根节点并且当前展开是根节点时 nodeKey为 undefined\n const nodeKey =\n !c.model.rootVisible && !mobExpandedKey\n ? undefined\n : mobExpandedKey;\n const node = treeRef.value.getNodeById(nodeKey);\n // 在父节点上添加子数据\n childern.forEach(child => node.append(child));\n }\n },\n 300,\n { leading: true },\n );\n\n onUnmounted(() => {\n // 卸载绘制的图标节点\n vueApps.forEach((vueApp: App) => {\n vueApp.unmount();\n });\n vueApps = [];\n });\n\n return {\n c,\n ns,\n uuid,\n options,\n treeRef,\n treeData,\n breadcrumb,\n currentVal,\n checkedKeys,\n treeRefreshKey,\n hiddenBreadcrumb,\n isHeaderStyle,\n onInput,\n loadData,\n onScroll,\n onNodeCheck,\n onNodeClick,\n treeDataFormat,\n };\n },\n render() {\n const slots: IData = {\n searchbar: () => {\n if (!this.c.enableQuickSearch) return null;\n return (\n <van-search\n modelValue={this.c.state.query}\n class={this.ns.b('quick-search')}\n clearable={true}\n placeholder={this.c.state.placeHolder}\n onUpdate:model-value={this.onInput}\n ></van-search>\n );\n },\n };\n const key = this.c.controlPanel ? 'tree' : 'default';\n slots[key] = () => {\n const content = [\n this.breadcrumb && (\n <div\n class={[\n this.ns.be('header', 'container'),\n this.ns.is('hidden', this.hiddenBreadcrumb),\n ]}\n >\n <van-sticky>\n <div\n id={`breadcrumb${this.uuid}`}\n class={[\n this.ns.b('header'),\n this.ns.is('no-root', !this.treeData.length),\n this.ns.is('header-style', this.isHeaderStyle),\n ]}\n ></div>\n </van-sticky>\n </div>\n ),\n this.c.state.isCreated && this.c.state.isLoaded && (\n <vs-tree\n show-line\n ref='treeRef'\n lazy={true}\n showIcon={true}\n strictLeaf={true}\n data={this.treeData}\n options={this.options}\n highlightCurrent={true}\n key={this.treeRefreshKey}\n class={this.ns.b('content')}\n checkedKeys={this.checkedKeys}\n expandKeys={this.c.state.expandedKeys}\n show-checkbox={!this.c.state.singleSelect}\n load={this.loadData}\n onScroll={this.onScroll}\n onCheck={this.onNodeCheck}\n format={this.treeDataFormat}\n ></vs-tree>\n ),\n ];\n return <div class={this.ns.b('container')}>{content}</div>;\n };\n return (\n <iBizControlBase v-loading={this.c.state.isLoading} controller={this.c}>\n {slots}\n </iBizControlBase>\n );\n },\n});\n\nexport default TreeControl;\n"],"names":["TreeControl","defineComponent","components","VsTreeComponent","props","type","Object","required","default","Boolean","setup","_a","_b","c","useControlController","args","TreeController","checkedKeys","computed","concat","model","controlType","toLowerCase","selectedData","state","map","item","_id","vueApps","ref","treeRefreshKey","createUUID","treeRef","uuid","isHeaderStyle","crumbShowMode","navigational","nodes","iconDom","node","_icon","customProps","dom","document","createElement","vueApp","breadcrumb","createIconNode","mount","push","_leaf","_text","_disableSelect","treeData","toElNodes","isLoaded","icon","_children","result","nodeData","onNodeCheck","event","opts","singleSelect","updateUI","originData","hiddenBreadcrumb","getNodeData","_uuid","filterArr","filter","setSelection","onNodeClick","stopPropagation","onTreeNodeClick","handleExpandedLastKey","data","_a2","ibiz","breads","crumbItem","parent","list","prevIndex","length","rootNodes","callback","store","_data","prevNode","splice","_b2","_c","_d","_e","_f","_g","_h","_i","value","tree","breadcrumbListLast","nodesChange","loaded","evt","on","debounceSearch","checkInherit","rootName","detreeNodes","find","rootNode","name","virtual","showCount","renderNode","key","getNodeModel","_nodeId","layoutPanel","nodeModel","getControlPanel","nodeLayoutPanel","params","renderContent","loadingEl","findNodeModel","sysCss","cssName","parentNode","classList","add","mobExpandedKey","counterId","count","counterData","child","className","ns","is","innerText","children","treeDataFormat","b","isLeaf","_opts","setExpand","customNodeClick","checked","el","nodePanel","modelData","content","createVueApp","HTMLElement","appendChild","cloneNode","textDom","be","_vsroot","onclick","bind","this","handleSingleSelect","counterMode","handleCrumbBack","onScroll","debounce","async","expandNodeKey","infoItems","getLoadMoreInfoItems","click","some","infoItem","scrollTop","clientHeight","scrollHeight","target","childern","loadNodes","getNodeById","nodeKey","setChecked","append","onUnmounted","maxHeight","unmount","currentVal","link","loadData","query","log","debug","findNodeLayoutPanel","setDefaultChecked","id","slots","enableQuickSearch","class","clearable","separator","placeHolder","onInput","isCreated","_createVNode","_resolveComponent","lazy","strictLeaf","options","highlightCurrent","expandKeys","expandedKeys","load","onCheck","format","curPage","s","prototype","toString","call","_isVNode","_resolveDirective","isLoading","exports"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tree-on8cJom4.js","sources":["../src/control/tree/tree.tsx"],"sourcesContent":["import {\n IBizIcon,\n useNamespace,\n IBizControlShell,\n useControlController,\n} from '@ibiz-template/vue3-util';\nimport {\n h,\n App,\n ref,\n VNode,\n computed,\n PropType,\n createApp,\n onUnmounted,\n defineComponent,\n} from 'vue';\nimport { isNil } from 'ramda';\nimport { IDETree, IDETreeNode } from '@ibiz/model-core';\nimport {\n ITreeNodeData,\n TreeController,\n IControlProvider,\n getControlPanel,\n} from '@ibiz-template/runtime';\nimport { debounce } from 'lodash-es';\nimport { createUUID } from 'qx-util';\nimport { VsTreeComponent } from '@ibiz-template-package/vs-tree-ex';\nimport { createVueApp } from '../../mob-app/create-vue-app';\nimport './tree.scss';\n\nexport const TreeControl = defineComponent({\n name: 'IBizTreeControl',\n components: {\n 'vs-tree': VsTreeComponent,\n },\n props: {\n /**\n * @description 树控件模型数据\n */\n modelData: { type: Object as PropType<IDETree>, required: true },\n /**\n * @description 应用上下文对象\n */\n context: { type: Object as PropType<IContext>, required: true },\n /**\n * @description 视图参数对象\n * @default {}\n */\n params: { type: Object as PropType<IParams>, default: () => ({}) },\n /**\n * @description 部件适配器\n */\n provider: { type: Object as PropType<IControlProvider> },\n /**\n * @description 部件激活模式,值为0:无激活,值为1:单击激活,值为2:双击激活\n * @default 2\n */\n mdctrlActiveMode: { type: Number, default: 2 },\n /**\n * @description 是否单选\n * @default true\n */\n singleSelect: { type: Boolean, default: true },\n /**\n * @description 是否是导航内的(即树导航里的树)\n */\n navigational: { type: Boolean, default: undefined },\n },\n setup() {\n const c: TreeController = useControlController<TreeController>(\n (...args) => new TreeController(...args),\n );\n const ns = useNamespace(`control-${c.model.controlType!.toLowerCase()}`);\n // 默认选中项\n const checkedKeys = computed(() => {\n return c.state.selectedData.map(item => item._id);\n });\n\n // 节点创建的app实例,用于组件销毁时销毁所有实例\n let vueApps: App[] = [];\n // 引用的树组件实例\n const treeRef = ref();\n // 用于树强制刷新\n const treeRefreshKey = ref(createUUID());\n\n // 快捷搜索值\n const currentVal = ref('');\n\n const uuid = createUUID();\n\n // 启用面包屑功能\n const breadcrumb = ref(true);\n\n // 隐藏显示面包屑\n const hiddenBreadcrumb = ref(false);\n\n const isHeaderStyle =\n c.crumbShowMode === 'HEADERSTYLE' || c.state.navigational;\n\n // 创建图标节点\n const createIconNode = (customProps: IData) => {\n const iop = h(IBizIcon, customProps);\n const vueApp = createApp(iop);\n const dom = document.createElement('span');\n vueApp.mount(dom);\n vueApps.push(vueApp);\n return dom;\n };\n\n /**\n * 创建新的节点对象,隔离组件数据和controller数据\n * @param {ITreeNodeData[]} nodes\n * @return {*} {IData[]}\n */\n const toElNodes = (nodes: ITreeNodeData[]): IData[] => {\n return nodes.map(node => {\n const iconDom = node?._icon\n ? createIconNode({ icon: node?._icon })\n : '';\n return {\n _id: node._id,\n id: node._id,\n _uuid: node._uuid,\n _leaf: node._leaf,\n _text: node._text,\n icon: iconDom,\n _disableSelect: node._disableSelect,\n };\n });\n };\n\n /** 树展示数据 */\n const treeData = computed(() => {\n if (!c.state.isLoaded) {\n return [];\n }\n const nodes = c.model.rootVisible\n ? c.state.rootNodes\n : c.state.rootNodes.reduce<ITreeNodeData[]>((result, nodeData) => {\n if (nodeData._children) {\n return result.concat(nodeData._children as ITreeNodeData[]);\n }\n return result;\n }, []);\n return toElNodes(nodes as ITreeNodeData[]);\n });\n\n /**\n * @description 查找节点模型\n * @param {string} key\n * @returns {*} {(IDETreeNode | undefined)}\n */\n const findNodeModel = (key: string): IDETreeNode | undefined => {\n const nodeData = c.getNodeData(key);\n if (nodeData) return c.getNodeModel(nodeData._nodeId);\n };\n\n /**\n * @description 查找节点视图布局面板\n * @param {string} key\n * @returns {*}\n */\n const findNodeLayoutPanel = (key: string) => {\n const nodeData = c.getNodeData(key);\n if (nodeData) {\n const nodeModel = c.getNodeModel(nodeData._nodeId);\n const layoutPanel = nodeModel ? getControlPanel(nodeModel) : undefined;\n if (layoutPanel) return { nodeData, layoutPanel };\n }\n };\n\n /**\n * @description 更新vs树,防止树节点数据加载完后选中数据丢失\n */\n const updateUI = () => {\n if (treeRef.value) {\n treeRef.value.tree.tree.store.checkedKeys = checkedKeys.value;\n treeRef.value.tree.tree.store.setDefaultChecked();\n const list = treeRef.value.tree.tree.store.breadcrumb?.list || [];\n hiddenBreadcrumb.value = list.length < 2;\n }\n };\n\n /**\n * 触发节点加载数据\n * @author zk\n * @date 2023-05-29 09:16:07\n * @param {IData} item\n * @param {(nodes: IData[]) => void} callback\n */\n const loadData = async (\n item: IData,\n callback: (nodes: IData[]) => void,\n ) => {\n // 没加载前拦截\n if (!c.state.isLoaded) return;\n // 加载时拦截点击事件\n let nodes: ITreeNodeData[];\n const nodeData = c.getNodeData(item.data._uuid)!;\n // 有搜索值为搜索框搜索,必须请求后台数据过滤\n if (nodeData && nodeData._children && !c.state.query) {\n ibiz.log.debug('节点展开加载-本地', nodeData);\n nodes = nodeData._children;\n } else {\n ibiz.log.debug('节点展开加载-远程', nodeData);\n nodes = await c.loadNodes(nodeData);\n }\n // 根节点搜索时,返回树展示数据,并强制刷新\n if (nodes && c.state.rootNodes.includes(nodes[0])) {\n callback(treeData.value);\n c.state.mobExpandedKey = '';\n treeRefreshKey.value = createUUID();\n return;\n }\n callback(toElNodes(nodes));\n updateUI();\n };\n\n /**\n * 多选时选中节点变更\n *\n * @param {ITreeNodeData} nodeData\n */\n const onNodeCheck = (event: MouseEvent, opts: IData) => {\n if (c.state.singleSelect) return;\n const { originData } = opts;\n // 选中相关处理\n const { selectedData } = c.state;\n const nodeData = c.getNodeData(originData._uuid)!;\n // 选中里没有则添加,有则删除\n const filterArr = selectedData.filter(\n (item: IData) => item._id !== nodeData._id,\n );\n if (filterArr.length === selectedData.length) {\n c.setSelection(selectedData.concat([nodeData]));\n } else {\n c.setSelection(filterArr);\n }\n };\n\n const onNodeClick = (event: MouseEvent, opts: IData) => {\n event.stopPropagation();\n const { originData } = opts;\n onNodeCheck(event, opts);\n c.onTreeNodeClick(originData, event);\n };\n\n // 处理展开节点切换\n const handleExpandedLastKey = (data: IData) => {\n c.state.mobExpandedKey = data._uuid || '';\n };\n\n // 面包屑回退按钮点击事件\n const handleCrumbBack = (_e: MouseEvent, crumbItem?: IData) => {\n _e.preventDefault();\n _e.stopPropagation();\n\n const breads = crumbItem?.parent.list;\n const prevIndex = breads.length - 2;\n const prevNode = breads[prevIndex];\n if (!prevNode) return;\n const store = prevNode.store;\n const _data = prevNode.store?.data;\n breads.splice(prevIndex + 1);\n store.update();\n handleExpandedLastKey(_data);\n };\n\n // 搜索\n const debounceSearch = debounce(async () => {\n if (treeRef.value) {\n // 获取最后展开的节点\n const list = treeRef.value?.tree?.tree?.store?.breadcrumb?.list;\n const breadcrumbListLast = list ? list[list.length - 1] : null;\n if (breadcrumbListLast) {\n breadcrumbListLast.childNodes = [];\n treeRef.value?.tree?.tree?.store?.nodesChange([]);\n breadcrumbListLast.loaded = false;\n breadcrumbListLast.setExpand(true);\n }\n }\n }, 500);\n\n const onInput = async (value: string): Promise<void> => {\n c.state.query = value;\n await c.load();\n };\n\n c.evt.on('onAfterRefreshParent', () => {\n debounceSearch();\n });\n\n c.evt.on('onLoadSuccess', () => {\n c.state.mobExpandedKey = '';\n treeRefreshKey.value = createUUID();\n });\n\n /**\n * 树数据格式化\n *\n * @author zk\n * @date 2023-07-03 11:07:59\n * @param {ITreeNodeData} data\n * @return {*}\n */\n const treeDataFormat = (data: ITreeNodeData) => {\n return {\n id: data._id,\n name: data._text,\n children: data._children,\n isLeaf: data._leaf,\n };\n };\n\n /**\n * 处理单选默认选中样式\n *\n * @author ljx\n * @date 2024-12-12 15:07:59\n * @param {IData} opts\n * @return {*}\n */\n const handleSingleSelect = (opts: IData) => {\n const { originData, loadingEl } = opts;\n if (checkedKeys.value.includes(originData._id) && loadingEl) {\n loadingEl.parentNode.parentNode.classList.add('selected');\n opts.store.selectedCurrent = opts;\n }\n };\n\n /**\n * @description 绘制节点\n * @param {HTMLDivElement} dom 父dom元素\n * @param {IData} opts 配置\n * @returns {*}\n */\n const renderNode = (dom: HTMLDivElement, opts: IData) => {\n const { originData } = opts;\n const nodeLayoutPanel = findNodeLayoutPanel(originData._id);\n if (nodeLayoutPanel) {\n const { nodeData, layoutPanel } = nodeLayoutPanel;\n const nodePanel = h(IBizControlShell, {\n data: nodeData,\n modelData: layoutPanel,\n context: c.context,\n params: c.params,\n });\n const vueApp = createVueApp(nodePanel);\n vueApp.mount(dom);\n vueApps.push(vueApp);\n return dom;\n }\n };\n\n const renderContent = (\n _h: (tag: string, opt: IData) => VNode,\n opts: IData,\n ) => {\n // 添加节点样式表\n const { loadingEl, originData } = opts;\n const nodeModel = findNodeModel(originData._id);\n if (loadingEl && nodeModel?.sysCss?.cssName)\n loadingEl.parentNode.parentNode.classList.add(\n `${nodeModel.sysCss.cssName}`,\n );\n if (c.state.singleSelect) handleSingleSelect(opts);\n\n const children: HTMLElement[] = [];\n\n // 添加计数器\n if (nodeModel?.counterId) {\n const count = c.state.counterData[nodeModel.counterId];\n if (!(isNil(count) || (nodeModel.counterMode === 1 && count === 0))) {\n const child = document.createElement('div');\n child.className = `ibiz-badge tree-counter ${ns.is('mob', true)}`;\n child.innerText = count > 99 ? `${99}+` : count;\n children.push(child);\n }\n }\n\n // 非叶子节点添加展开图标\n if (!originData._leaf) {\n const child = document.createElement('i');\n child.className = 'van-icon van-icon-arrow';\n children.push(child);\n }\n\n // 节点内容区绘制\n return _h('div', {\n className: `tree-button ${ns.b('node-expanded-btn')}`,\n click: (e: Event, _opts: IData) => {\n if (originData._leaf) return;\n _opts.store.breadcrumb.list.push(_opts);\n _opts.setExpand(true);\n handleExpandedLastKey(originData);\n },\n children,\n });\n };\n\n const customNodeClick = (event: MouseEvent, opts: IData) => {\n const { checked } = opts;\n opts.setChecked(!checked);\n onNodeClick(event, opts);\n };\n\n // vs树配置项\n const options = {\n maxHeight: '100%',\n // 继承父状态\n checkInherit: false,\n // 不能选择父节点\n nocheckParent: true,\n rootName: c.model.detreeNodes?.find(item => item.rootNode)?.name,\n virtual: {\n showCount: 30, // 虚拟列表显示数量,太少时会导致虚拟列表无法滚动\n },\n renderNode,\n renderContent,\n customNodeClick,\n } as IParams;\n\n if (breadcrumb.value) {\n Object.assign(options, {\n breadcrumb: {\n el: `#breadcrumb${uuid}`,\n link: (node: IData, data: IData) => {\n const list = node.store?.breadcrumb?.list || [];\n if (list.length < 2) {\n hiddenBreadcrumb.value = true;\n return null;\n }\n hiddenBreadcrumb.value = false;\n const content = document.createElement('span');\n const textDom = document.createElement('span');\n textDom.innerText = data.name;\n if (data.icon instanceof HTMLElement) {\n content.appendChild(data.icon.cloneNode(true));\n }\n content.appendChild(textDom);\n content.className = `${ns.be('header', 'crumb')} ${ns.is(\n 'root',\n data._vsroot,\n )}`;\n content.onclick = () => handleExpandedLastKey.bind(this)(data);\n return content;\n },\n separator: '>',\n },\n });\n\n if (isHeaderStyle) {\n Object.assign(options.breadcrumb, {\n icon: (...args: IParams[]) => {\n const crumbItem = args[2];\n const content = document.createElement('span');\n const iconDom = document.createElement('i');\n iconDom.className = 'van-icon van-icon-arrow-left';\n content.className = `${ns.bem('header', 'crumb', 'back-btn')}`;\n content.appendChild(iconDom);\n content.onclick = (_e: MouseEvent) =>\n handleCrumbBack.bind(this)(_e, crumbItem);\n return content;\n },\n });\n }\n }\n\n /**\n * 滚动事件\n * - 加载更多\n */\n const onScroll = debounce(\n async (event: MouseEvent) => {\n const { mobExpandedKey } = c.state;\n // 当前展开节点默认是根节点\n const expandNodeKey = mobExpandedKey || c.state.rootNodes[0]._uuid;\n const nodeData = c.getNodeData(expandNodeKey);\n if (!nodeData) return;\n const infoItems = c.getLoadMoreInfoItems(nodeData._id);\n if (!infoItems) return;\n const result = infoItems.some(infoItem => {\n return infoItem.curPage < infoItem.totalPage - 1;\n });\n const { scrollTop, clientHeight, scrollHeight } = event.target as IData;\n // 滚动到底部且还有下一页数据时\n if (result && scrollTop + clientHeight >= scrollHeight - 10) {\n const childern = toElNodes(await c.loadNodes(nodeData, true));\n // 如果不显示根节点并且当前展开是根节点时 nodeKey为 undefined\n const nodeKey =\n !c.model.rootVisible && !mobExpandedKey\n ? undefined\n : mobExpandedKey;\n const node = treeRef.value.getNodeById(nodeKey);\n // 在父节点上添加子数据\n childern.forEach(child => node.append(child));\n }\n },\n 300,\n { leading: true },\n );\n\n onUnmounted(() => {\n // 卸载绘制的图标节点\n vueApps.forEach((vueApp: App) => {\n vueApp.unmount();\n });\n vueApps = [];\n });\n\n return {\n c,\n ns,\n uuid,\n options,\n treeRef,\n treeData,\n breadcrumb,\n currentVal,\n checkedKeys,\n treeRefreshKey,\n hiddenBreadcrumb,\n isHeaderStyle,\n onInput,\n loadData,\n onScroll,\n onNodeCheck,\n onNodeClick,\n treeDataFormat,\n };\n },\n render() {\n const slots: IData = {\n searchbar: () => {\n if (!this.c.enableQuickSearch) return null;\n return (\n <van-search\n modelValue={this.c.state.query}\n class={this.ns.b('quick-search')}\n clearable={true}\n placeholder={this.c.state.placeHolder}\n onUpdate:model-value={this.onInput}\n ></van-search>\n );\n },\n };\n const key = this.c.controlPanel ? 'tree' : 'default';\n slots[key] = () => {\n const content = [\n this.breadcrumb && (\n <div\n class={[\n this.ns.be('header', 'container'),\n this.ns.is('hidden', this.hiddenBreadcrumb),\n ]}\n >\n <van-sticky>\n <div\n id={`breadcrumb${this.uuid}`}\n class={[\n this.ns.b('header'),\n this.ns.is('no-root', !this.treeData.length),\n this.ns.is('header-style', this.isHeaderStyle),\n ]}\n ></div>\n </van-sticky>\n </div>\n ),\n this.c.state.isCreated && this.c.state.isLoaded && (\n <vs-tree\n show-line\n ref='treeRef'\n lazy={true}\n showIcon={true}\n strictLeaf={true}\n data={this.treeData}\n options={this.options}\n highlightCurrent={true}\n key={this.treeRefreshKey}\n class={this.ns.b('content')}\n checkedKeys={this.checkedKeys}\n expandKeys={this.c.state.expandedKeys}\n show-checkbox={!this.c.state.singleSelect}\n load={this.loadData}\n onScroll={this.onScroll}\n onCheck={this.onNodeCheck}\n format={this.treeDataFormat}\n ></vs-tree>\n ),\n ];\n return <div class={this.ns.b('container')}>{content}</div>;\n };\n return (\n <iBizControlBase v-loading={this.c.state.isLoading} controller={this.c}>\n {slots}\n </iBizControlBase>\n );\n },\n});\n\nexport default TreeControl;\n"],"names":["TreeControl","defineComponent","components","VsTreeComponent","props","type","Object","required","default","Boolean","setup","_a","_b","c","useControlController","args","TreeController","checkedKeys","computed","concat","model","controlType","toLowerCase","selectedData","state","map","item","_id","vueApps","ref","treeRefreshKey","createUUID","treeRef","uuid","isHeaderStyle","crumbShowMode","navigational","nodes","iconDom","node","_icon","customProps","dom","document","createElement","vueApp","breadcrumb","createIconNode","mount","push","_leaf","_text","_disableSelect","treeData","toElNodes","isLoaded","icon","_children","result","nodeData","onNodeCheck","event","opts","singleSelect","updateUI","originData","hiddenBreadcrumb","getNodeData","_uuid","filterArr","filter","setSelection","onNodeClick","stopPropagation","onTreeNodeClick","handleExpandedLastKey","data","_a2","ibiz","breads","crumbItem","parent","list","prevIndex","length","rootNodes","callback","store","_data","prevNode","splice","_b2","_c","_d","_e","_f","_g","_h","_i","value","tree","breadcrumbListLast","nodesChange","loaded","evt","on","debounceSearch","checkInherit","rootName","detreeNodes","find","rootNode","name","virtual","showCount","renderNode","key","getNodeModel","_nodeId","layoutPanel","nodeModel","getControlPanel","nodeLayoutPanel","params","renderContent","loadingEl","findNodeModel","sysCss","cssName","parentNode","classList","add","mobExpandedKey","counterId","count","counterData","child","className","ns","is","innerText","children","treeDataFormat","b","isLeaf","_opts","setExpand","customNodeClick","checked","el","nodePanel","modelData","content","createVueApp","HTMLElement","appendChild","cloneNode","textDom","be","_vsroot","onclick","bind","this","handleSingleSelect","counterMode","handleCrumbBack","onScroll","debounce","async","expandNodeKey","infoItems","getLoadMoreInfoItems","click","some","infoItem","scrollTop","clientHeight","scrollHeight","target","childern","loadNodes","getNodeById","nodeKey","setChecked","append","onUnmounted","maxHeight","unmount","currentVal","link","loadData","query","log","debug","findNodeLayoutPanel","setDefaultChecked","id","slots","enableQuickSearch","class","clearable","separator","placeHolder","onInput","isCreated","_createVNode","_resolveComponent","lazy","strictLeaf","options","highlightCurrent","expandKeys","expandedKeys","load","onCheck","format","curPage","s","prototype","toString","call","_isVNode","_resolveDirective","isLoading","exports"],"mappings":"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"}
|