@farris/ui-vue
Version:
Farris Vue, a Farris Design based Vue3 component library.
2 lines (1 loc) • 16.2 kB
JavaScript
(function(c,p){typeof exports=="object"&&typeof module<"u"?p(exports,require("vue"),require("../dynamic-resolver/index.umd.js"),require("../common/index.umd.js"),require("../designer-canvas/index.umd.js"),require("lodash-es")):typeof define=="function"&&define.amd?define(["exports","vue","../dynamic-resolver/index.umd.js","../common/index.umd.js","../designer-canvas/index.umd.js","lodash-es"],p):(c=typeof globalThis<"u"?globalThis:c||self,p(c["html-template"]={},c.Vue,c.dynamicResolver,c.common,c.designerCanvas,c.LodashES))})(this,function(c,p,f,R,v,F){"use strict";var H=Object.defineProperty;var _=(c,p,f)=>p in c?H(c,p,{enumerable:!0,configurable:!0,writable:!0,value:f}):c[p]=f;var u=(c,p,f)=>_(c,typeof p!="symbol"?p+"":p,f);const E={$schema:"https://json-schema.org/draft/2020-12/schema",$id:"https://farris-design.gitee.io/html-template.schema.json",title:"html-template",description:"A Farris Component",type:"object",properties:{id:{description:"The unique identifier for a html-template",type:"string"},type:{description:"The type string of html-template",type:"string",default:"html-template"},html:{description:"",type:"string",default:""},renderFunction:{description:"",type:"function",default:null}},required:["id","type"],ignore:[]},C=new Map([]);function w(m,e,t){return e}const V={renderFunction:{type:Function}},k=f.createPropsResolver(V,E,C,w),M={html:{type:String,default:""}},N=f.createPropsResolver(M,E,C,w),S=f.getPropsResolverGenerator(V,E,C,w),T=f.getPropsResolverGenerator(M,E,C,w),b=p.defineComponent({name:"FHtmlTemplate",props:V,emits:[],setup(m){return()=>{var e;return(e=m.renderFunction)==null?void 0:e.call(m)}}});function U(m){const{formSchemaUtils:e,formStateMachineUtils:t}=m;function i(o,a=""){return{path:a+o.code,field:o.id,fullPath:o.code}}function s(o,a=""){const d=e.getViewModelById(o);return d?d.states.map(g=>i(g,a)):[]}function r(o){const a=e.getRootViewModelId(),d=s(o);if(o===a)return d;const g=s(a,"root-component.");return[...d,...g]}function n(o){return o.binding&&o.binding.path||o.id||""}function l(){return t&&t.getRenderStates()||[]}return{getVariables:r,getControlName:n,getStateMachines:l}}class B{constructor(e){u(this,"sessionVariables",[{key:"CurrentSysOrgName",name:"当前组织Name",description:"当前组织Name"},{key:"CurrentSysOrgId",name:"当前组织Id",description:"当前组织Id"},{key:"CurrentUserName",name:"当前用户Name",description:"当前用户Name"},{key:"CurrentUserCode",name:"当前用户Code",description:"当前用户Code"},{key:"CurrentUserId",name:"当前用户Id",description:"当前用户Id"},{key:"CurrentLanguage",name:"当前语言编号",description:"当前登录的语言编号,例如简体中文返回'zh-CHS',英文返回'en',繁体中文'zh-CHT'"}]);u(this,"expressionNames",{compute:"计算表达式",dependency:"依赖表达式",validate:"验证表达式",dataPicking:"帮助前表达式",visible:"可见表达式",readonly:"只读表达式",required:"必填表达式"});u(this,"getExpressionConverter",(e,t)=>({convertFrom:(i,s,r,n)=>{const l=r.getExpressionRuleValue(e,t||s);return l&&l.value||""},convertTo:(i,s,r,n,l)=>{var o;if(s==="dataPicking"&&(r!=null&&r.target)){const a=`${r.target}_dataPicking`;((o=r.rules)==null?void 0:o.some(g=>g.id===a&&g.value))?i.dictPickingExpressionId=a:delete i.dictPickingExpressionId}n.updateExpression(r)}}));this.formSchemaService=e}getExpressionRule(e,t){const i=this.getExpressionData();if(!i)return"";const s=i.find(n=>n.target===e);if(!s)return"";const r=s.rules.find(n=>n.type===t);return r||""}getContextFormVariables(){const{module:e}=this.formSchemaService.getFormSchema();if(!e.viewmodels||e.viewmodels.length===0)return[];const t=this.formSchemaService.getRootViewModelId(),i=this.formSchemaService.getViewModelById(t);if(!i||!i.states||i.states.length===0)return[];const s=[];return i.states.filter(r=>r.category==="remote").forEach(r=>{s.push({key:r.code,name:r.name,description:r.name,category:r.category})}),s}createTreeNode(e,t,i="label"){return{id:e.id,name:e.name,bindingPath:e[i],parents:t,type:"field"}}buildEntityFieldsTreeData(e=null,t){const i=[];return e==null||e.forEach(s=>{var l;const r=this.createTreeNode(s,t);let n=[];(l=s.type)!=null&&l.fields&&(n=this.buildEntityFieldsTreeData(s.type.fields,[...t,s.label])),i.push({data:r,children:n,expanded:!0})}),i}buildChildEntityTreeData(e=null,t){const i=[];return e==null||e.forEach(s=>{var o,a;const r=this.createTreeNode(s,t);r.type="entity";const n=this.buildEntityFieldsTreeData((o=s.type)==null?void 0:o.fields,[...t,s.label]),l=this.buildChildEntityTreeData((a=s.type)==null?void 0:a.entities,[...t,s.label]);l!=null&&l.length&&(n==null||n.push(...l)),i.push({data:r,children:n||[],expanded:!0})}),i}getEntitiesTreeData(){const e=this.formSchemaService.getSchemaEntities();if(!(e!=null&&e.length))return[];const t=e[0];if(!(t!=null&&t.type))return[];const i=this.buildEntityFieldsTreeData(t.type.fields,[t.code]),s=this.buildChildEntityTreeData(t.type.entities,[t.code]);return s!=null&&s.length&&(i==null||i.push(...s)),{entityCode:t.code,fields:[{data:this.createTreeNode(t,[],"code"),children:i||[]}]}}getEntitiesAndVariables(){return{entities:this.getEntitiesTreeData(),variables:{session:{name:"系统变量",items:this.sessionVariables,visible:!1},forms:{name:"表单变量",items:this.getContextFormVariables(),visible:!0}}}}onBeforeOpenExpression(e,t,i){const s=i==="Field"?e.binding.field:e.id,r=this.getExpressionRule(s,t),n=this.getEntitiesAndVariables(),l={message:["validate","required","dataPicking"].includes(t)&&r?r.message:"",...n};return r.messageType!=null&&(l.messageType=r.messageType),l}buildRule(e,t,i,s){const{expression:r,message:n,messageType:l}=t,o={id:`${e}_${i}`,type:i,value:r};return(i==="validate"||i==="dataPicking"||i==="required")&&(o.message=n),i==="dataPicking"&&(o.messageType=l),i==="validate"&&s&&(o.elementId=s),o}getExpressionData(){const{expressions:e}=this.formSchemaService.getFormSchema().module;return e||[]}updateExpression(e,t,i,s){const r=t==="Field"?e.binding.field:e.id,n=this.buildRule(r,i,s,e.type==="form-group"?e.id:"");let o=this.getExpressionData().find(d=>d.targetType===t&&d.target===r);const a=d=>d.value.trim()==="";if(o){const d=o.rules.find(g=>g.id===n.id);if(d)a(n)?o.rules=o.rules.filter(g=>g.id!==n.id):(Object.assign(d,n),s==="validate"&&e.type==="form-group"&&(d.elementId=e.id));else{if(a(n))return null;o.rules=o.rules||[],o.rules.push(n)}}else{if(a(n))return null;o={target:`${r}`,rules:[n],targetType:t}}return o}getExpressionEditorOptions(e,t,i,s){return i.reduce((r,n)=>{var o,a;const l=t==="Field"?(o=e==null?void 0:e.binding)==null?void 0:o.field:e.id;return r[n]={hide:t==="Field"?!!((a=e==null?void 0:e.binding)!=null&&a.field):!1,description:"",title:this.expressionNames[n],type:"string",$converter:this.getExpressionConverter(l),refreshPanelAfterChanged:!0,editor:{type:"expression-editor",singleExpand:!1,dialogTitle:`${this.expressionNames[n]}编辑器`,showMessage:n==="validate"||n==="dataPicking"||n==="required",showMessageType:n==="dataPicking",beforeOpen:()=>this.onBeforeOpenExpression(e,n,t),onSubmitModal:d=>{const g=this.updateExpression(e,t,d,n);if(s){const h=this.buildRule(l,d,n);s(h)}return g}}},r},{})}getExpressionInfo(e,t,i){const s=t==="Field"?e.binding.field:e.id,r=this.getExpressionRule(s,i),n={value:r&&r.value,targetId:s,targetType:t,expressionType:i};return r&&r.message&&(n.message=r.message),n}getExpressionConfig(e,t,i=["compute","dependency","validate"],s){return{description:"表达式",title:"表达式",hide:!e.binding,properties:{...this.getExpressionEditorOptions(e,t,i,s)}}}getExpressionOptions(e,t,i){const s=this.getExpressionInfo(e,t,i);return{dialogTitle:`${this.expressionNames[i]||"表达式"}编辑器`,singleExpand:!1,showMessage:i==="required",beforeOpen:()=>this.onBeforeOpenExpression(e,i,t),expressionInfo:s}}}class O{constructor(e,t){u(this,"componentId");u(this,"viewModelId");u(this,"eventsEditorUtils");u(this,"formSchemaUtils");u(this,"formMetadataConverter");u(this,"designViewModelUtils");u(this,"designViewModelField");u(this,"controlCreatorUtils");u(this,"designerHostService");u(this,"designerContext");u(this,"modalService",null);u(this,"formRule",null);u(this,"schemaService",null);u(this,"metadataService",null);u(this,"propertyConfig",{type:"object",categories:{}});u(this,"expressionProperty");var i;this.componentId=e,this.designerHostService=t,this.eventsEditorUtils=t.eventsEditorUtils,this.formSchemaUtils=t.formSchemaUtils,this.formMetadataConverter=t.formMetadataConverter,this.viewModelId=((i=this.formSchemaUtils)==null?void 0:i.getViewModelIdByComponentId(e))||"",this.designViewModelUtils=t.designViewModelUtils,this.controlCreatorUtils=t.controlCreatorUtils,this.metadataService=t.metadataService,this.schemaService=t.schemaService,this.designerContext=t.designerContext,this.modalService=t.modalService,this.expressionProperty=new B(this.formSchemaUtils)}getFormDesignerInstance(){var e,t;return(t=(e=this.designerContext)==null?void 0:e.instances)==null?void 0:t.formDesigner.value}getTableInfo(){var e;return(e=this.schemaService)==null?void 0:e.getTableInfoByViewModelId(this.viewModelId)}setDesignViewModelField(e){var i;const t=e.binding&&e.binding.type==="Form"&&e.binding.field;if(t){if(!this.designViewModelField){const s=this.designViewModelUtils.getDgViewModel(this.viewModelId);this.designViewModelField=s.fields.find(r=>r.id===t)}e.updateOn=(i=this.designViewModelField)==null?void 0:i.updateOn}}getBasicPropConfig(e){return{description:"Basic Information",title:"基本信息",properties:{id:{description:"组件标识",title:"标识",type:"string",readonly:!0},type:{description:"组件类型",title:"控件类型",type:"select",editor:{type:"combo-list",textField:"name",valueField:"value",idField:"value",editable:!1,data:[{value:e.type,name:v.DgControl[e.type]&&v.DgControl[e.type].name}]}}}}}getAppearanceConfig(e=null,t={},i){const s={title:"外观",description:"Appearance"},r={class:{title:"class样式",type:"string",description:"组件的CSS样式",$converter:"/converter/appearance.converter",parentPropertyID:"appearance"},style:{title:"style样式",type:"string",description:"组件的样式",$converter:"/converter/appearance.converter",parentPropertyID:"appearance"}};for(const n in t)r[n]=Object.assign(r[n]||{},t[n]);return{...s,properties:{...r},setPropertyRelates(n,l){if(n){switch(n&&n.propertyID){case"class":case"style":{v.canvasChanged.value++;break}}i&&i(n,e,l)}}}}getPropertyEditorParams(e,t=[],i="visible",s={},r={},n=""){const{getVariables:l,getControlName:o,getStateMachines:a}=U(this.designerHostService),d=this.getRealTargetType(e),g=t&&t.length>0?t:["Const","Variable","StateMachine","Expression"],h={type:"property-editor",propertyTypes:g};return g.map(I=>{switch(I){case"Const":Object.assign(h,{constType:"enum",constEnums:[{id:!0,name:"是"},{id:!1,name:"否"}]},s);break;case"Expression":h.expressionConfig=this.getExpressionOptions(e,d,n||i);break;case"StateMachine":h.stateMachines=a();break;case"Variable":Object.assign(h,{controlName:o(e),newVariablePrefix:"is",newVariableType:"Boolean",variables:l(this.viewModelId),parentComponentId:this.componentId==="root-component"?"":"root-component",onBeforeOpenVariables:x=>{x.value=l(this.viewModelId)}},r),this.designerContext.designerMode==="PC_RTC"&&(h.newVariablePrefix="ext_"+h.newVariablePrefix);break}}),h}getVisibleProperty(e,t=""){var r;let i=["Const","Variable","StateMachine","Expression"];return t==="gridFieldEditor"?i=["Const","Expression"]:t==="form-group"&&!((r=e.binding)!=null&&r.field)&&(i=["Const","Variable","StateMachine"]),{visible:{title:"是否可见",type:"boolean",description:"运行时组件是否可见",editor:this.getPropertyEditorParams(e,i,"visible")}}}getBehaviorConfig(e,t="",i={},s){const r={title:"行为",description:""},n=this.getVisibleProperty(e,t);for(const o in i)n[o]=Object.assign(n[o]||{},i[o]);const l=this;return{...r,properties:{...n},setPropertyRelates(o,a){if(o){switch(o.propertyID){case"disabled":case"readonly":case"visible":l.afterMutilEditorChanged(e,o);break}s&&s(o,a)}}}}afterMutilEditorChanged(e,t){this.addNewVariableToViewModel(t,this.viewModelId),this.updateExpressionValue(t,e),this.clearExpression(t,e)}updateElementByParentContainer(e,t){const i=t&&t.parent&&t.parent.schema;if(!i)return;const s=i.contents.findIndex(n=>n.id===e),r=F.cloneDeep(i.contents[s]);i.contents.splice(s,1),i.contents.splice(s,0,r),v.refreshCanvas()}addNewVariableToViewModel(e,t){const i=e.propertyValue;if(!(i&&typeof i=="object")||!(i.type==="Variable"&&i.isNewVariable))return;const n={id:i.field,category:"locale",code:i.fullPath,name:i.fullPath,type:i.newVariableType||"String",isRtcVariable:this.designerContext.designerMode==="PC_RTC"?!0:void 0};delete i.newVariableType,delete i.isNewVariable,this.formSchemaUtils.getVariableByCode(n.code)||this.formSchemaUtils.getViewModelById("root-viewmodel").states.push(n)}getExpressions(){let e=[];return this.formRule?(this.formRule.expressions=this.formRule.expressions||[],e=this.formRule.expressions||[]):e=this.formSchemaUtils.getExpressions(),e}updateExpressionValue(e,t){const i=e.propertyValue;if(!((i&&i.type)==="Expression"&&i.expressionInfo))return;const{expressionId:n,expressionInfo:l}=i,{targetId:o,targetType:a,expressionType:d,value:g,message:h}=l,I=this.getExpressions();let x=I.find(y=>y.target===o);x||(x={target:o,rules:[],targetType:a},I.push(x));const P=x.rules.find(y=>y.type===d);if(P)P.value=g,P.message=h,(d==="minDate"||d==="maxDate"||d==="defaultTime")&&(P.elementId=t.id);else{const y={id:n,type:d,value:g,message:h,elementId:t.id};x.rules.push(y)}delete i.expressionInfo}clearExpression(e,t){const i=e.propertyValue;if(i&&i.type==="Expression")return;const r=e.propertyID,n=this.getExpressions(),l=t.binding?t.binding.field:t.id,o=n.find(a=>a.target===l);!o||!o.rules||(o.rules=o.rules.filter(a=>a.type!==r))}getExpressionOptions(e,t,i){return this.expressionProperty.getExpressionOptions(e,t,i)}getRealTargetType(e){return["response-toolbar-item","tab-toolbar-item","section-toolbar-item","drawer-toolbar-item"].indexOf(e.type)>-1?"Button":e.binding&&e.binding.field?"Field":"Container"}createBaseEventProperty(e){const t={};return t[this.viewModelId]={type:"events-editor",editor:{initialData:e,viewSourceHandle:i=>{var s;((s=i.controller)==null?void 0:s.label.indexOf(this.formSchemaUtils.getModule().code))>-1&&this.eventsEditorUtils.jumpToMethod(i)}}},t}}class $ extends O{constructor(e,t){super(e,t)}getPropertyConfig(e){return this.propertyConfig.categories.basic=this.getBasicPropConfig(e),this.propertyConfig.categories.template=this.getTemplateProperties(e),this.propertyConfig}getTemplateProperties(e){return{title:"模板",description:"",properties:{html:{title:"html",type:"string",description:"HTML模板",refreshPanelAfterChanged:!0,editor:{type:"code-editor",language:"html"}}}}}}function q(m,e){function t(){return!1}function i(){return!0}function s(){return!0}function r(){return!0}function n(o){return new $(o,e).getPropertyConfig(m)}function l(){return""}return{canAccepts:t,hideNestedPaddingInDesginerView:r,getPropsConfig:n,checkCanDeleteComponent:i,checkCanMoveComponent:s,getDesignerClass:l}}const j=p.defineComponent({name:"FHtmlTemplateDesign",props:M,emits:[],setup(m,e){const t=p.ref(),i=p.inject("designer-host-service"),s=p.inject("design-item-context"),r=q(s.schema,i),n=v.useDesignerComponent(t,s,r);p.onMounted(()=>{t.value.componentInstance=n}),e.expose(n.value);const o='<div class="fv-html-template-design-placeholder">请在属性面板中配置模板</div>',a=p.computed(()=>m.html?m.html:o);return()=>p.createVNode("div",{ref:t,class:"fv-html-template-design",innerHTML:a.value},null)}});b.register=(m,e,t,i,s)=>{m["html-template"]=b,e["html-template"]=S(s)},b.registerDesigner=(m,e,t,i)=>{m["html-template"]=j,e["html-template"]=T(i)};const A=R.withInstall(b);c.FHtmlTemplate=b,c.default=A,c.designPropsResolver=N,c.designPropsResolverGenerator=T,c.htmlTemplateDesignProps=M,c.htmlTemplateProps=V,c.propsResolver=k,c.propsResolverGenerator=S,Object.defineProperties(c,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});