UNPKG

@farris/ui-vue

Version:

Farris Vue, a Farris Design based Vue3 component library.

2 lines (1 loc) 17.2 kB
(function(u,m){typeof exports=="object"&&typeof module<"u"?m(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"],m):(u=typeof globalThis<"u"?globalThis:u||self,m(u["html-template"]={},u.Vue,u.dynamicResolver,u.common,u.designerCanvas,u.LodashES))})(this,function(u,m,v,R,b,F){"use strict";var A=Object.defineProperty;var H=(u,m,v)=>m in u?A(u,m,{enumerable:!0,configurable:!0,writable:!0,value:v}):u[m]=v;var f=(u,m,v)=>H(u,typeof m!="symbol"?m+"":m,v);const V={$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:[]},w=new Map([]);function M(p,e,t){return e}const P={renderFunction:{type:Function}},k=v.createPropsResolver(P,V,w,M),I={html:{type:String,default:""}},N=v.createPropsResolver(I,V,w,M),T=v.getPropsResolverGenerator(P,V,w,M),S=v.getPropsResolverGenerator(I,V,w,M),y=m.defineComponent({name:"FHtmlTemplate",props:P,emits:[],setup(p){return()=>{var e;return(e=p.renderFunction)==null?void 0:e.call(p)}}});function U(p){const{formSchemaUtils:e,formStateMachineUtils:t}=p;function i(o,d=""){return{path:d+o.code,field:o.id,fullPath:o.code}}function s(o,d=""){const l=e.getViewModelById(o);return l?l.states.map(c=>i(c,d)):[]}function r(o){const d=e.getRootViewModelId(),l=s(o);if(o===d)return l;const c=s(d,"root-component.");return[...l,...c]}function n(o){return o.binding&&o.binding.path||o.id||""}function a(){return t&&t.getRenderStates()||[]}return{getVariables:r,getControlName:n,getStateMachines:a}}class B{constructor(e){f(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'"}]);f(this,"expressionNames",{compute:"计算表达式",dependency:"依赖表达式",validate:"验证表达式",dataPicking:"帮助前表达式",visible:"可见表达式",readonly:"只读表达式",required:"必填表达式"});f(this,"getExpressionConverter",(e,t)=>({convertFrom:(i,s,r,n)=>{const a=r.getExpressionRuleValue(e,t||s);return a&&a.value||""},convertTo:(i,s,r,n,a)=>{var o;if(s==="dataPicking"&&(r!=null&&r.target)){const d=`${r.target}_dataPicking`;((o=r.rules)==null?void 0:o.some(c=>c.id===d&&c.value))?i.dictPickingExpressionId=d: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 a;const r=this.createTreeNode(s,t);let n=[];(a=s.type)!=null&&a.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,d;const r=this.createTreeNode(s,t);r.type="entity";const n=this.buildEntityFieldsTreeData((o=s.type)==null?void 0:o.fields,[...t,s.label]),a=this.buildChildEntityTreeData((d=s.type)==null?void 0:d.entities,[...t,s.label]);a!=null&&a.length&&(n==null||n.push(...a)),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(),a={message:["validate","required","dataPicking"].includes(t)&&r?r.message:"",...n};return r.messageType!=null&&(a.messageType=r.messageType),a}buildRule(e,t,i,s){const{expression:r,message:n,messageType:a}=t,o={id:`${e}_${i}`,type:i,value:r};return(i==="validate"||i==="dataPicking"||i==="required")&&(o.message=n),i==="dataPicking"&&(o.messageType=a),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(l=>l.targetType===t&&l.target===r);const d=l=>l.value.trim()==="";if(o){const l=o.rules.find(c=>c.id===n.id);if(l)d(n)?o.rules=o.rules.filter(c=>c.id!==n.id):(Object.assign(l,n),s==="validate"&&e.type==="form-group"&&(l.elementId=e.id));else{if(d(n))return null;o.rules=o.rules||[],o.rules.push(n)}}else{if(d(n))return null;o={target:`${r}`,rules:[n],targetType:t}}return o}getExpressionEditorOptions(e,t,i,s){return i.reduce((r,n)=>{var o,d;const a=t==="Field"?(o=e==null?void 0:e.binding)==null?void 0:o.field:e.id;return r[n]={hide:t==="Field"?!!((d=e==null?void 0:e.binding)!=null&&d.field):!1,description:"",title:this.expressionNames[n],type:"string",$converter:this.getExpressionConverter(a),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:l=>{const c=this.updateExpression(e,t,l,n);if(s){const g=this.buildRule(a,l,n);s(g)}return c}}},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){var r;return{description:"表达式",title:"表达式",hide:!(e.binding&&((r=e.binding)==null?void 0:r.type)==="Form"),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){f(this,"componentId");f(this,"viewModelId");f(this,"eventsEditorUtils");f(this,"formSchemaUtils");f(this,"formMetadataConverter");f(this,"designViewModelUtils");f(this,"designViewModelField");f(this,"controlCreatorUtils");f(this,"designerHostService");f(this,"designerContext");f(this,"modalService",null);f(this,"formRule",null);f(this,"schemaService",null);f(this,"metadataService",null);f(this,"propertyConfig",{type:"object",categories:{}});f(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)}inResponsiveForm(){var e;return!!((e=this.designerContext)!=null&&e.responsiveForm)}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:b.DgControl[e.type]&&b.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,a){if(n){switch(n&&n.propertyID){case"class":case"style":{b.canvasChanged.value++;break}}i&&i(n,e,a)}}}}getPropertyEditorParams(e,t=[],i="visible",s={},r={},n=""){const{getVariables:a,getControlName:o,getStateMachines:d}=U(this.designerHostService),l=this.getRealTargetType(e),c=t&&t.length>0?t:["Const","Variable","StateMachine","Expression"],g={type:"property-editor",propertyTypes:c};return c.map(x=>{switch(x){case"Const":Object.assign(g,{constType:"enum",constEnums:[{id:!0,name:"是"},{id:!1,name:"否"}]},s);break;case"Expression":g.expressionConfig=this.getExpressionOptions(e,l,n||i);break;case"StateMachine":g.stateMachines=d();break;case"Variable":Object.assign(g,{controlName:o(e),newVariablePrefix:"is",newVariableType:"Boolean",variables:a(this.viewModelId),parentComponentId:this.componentId==="root-component"?"":"root-component",onBeforeOpenVariables:h=>{h.value=a(this.viewModelId)}},r),this.designerContext.designerMode==="PC_RTC"&&(g.newVariablePrefix="ext_"+g.newVariablePrefix);break}}),g}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","Custom"]:t==="dataGrid"||t==="treeGrid"||t==="wizard"?i=["Const","Variable","Expression"]:(e.type.indexOf("toolbar-item")>-1||t==="form-group")&&(i=["Const","Variable","StateMachine","Custom","Expression"]),{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 a=this;return{...r,properties:{...n},setPropertyRelates(o,d){if(o){switch(o.propertyID){case"disabled":case"readonly":case"visible":a.afterMutilEditorChanged(e,o);break}s&&s(o,d)}}}}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),b.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:a}=i,{targetId:o,targetType:d,expressionType:l,value:c,message:g}=a,x=this.getExpressions();let h=x.find(C=>C.target===o);h||(h={target:o,rules:[],targetType:d},x.push(h));const E=h.rules.find(C=>C.type===l);if(E)E.id=n,E.value=c,E.message=g,(l==="minDate"||l==="maxDate"||l==="defaultTime")&&(E.elementId=t.id);else{const C={id:n,type:l,value:c,message:g,elementId:t.id};h.rules.push(C)}delete i.expressionInfo}clearExpression(e,t){const i=e.propertyValue;if(i&&i.type==="Expression")return;const r=e.propertyID,n=this.getExpressions(),a=t.binding?t.binding.field:t.id,o=n.find(d=>d.target===a);!o||!o.rules||(o.rules=o.rules.filter(d=>d.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 j(p,e){function t(){return!1}function i(){var x,h;const l=(x=p.parent)==null?void 0:x.schema,c=((h=l==null?void 0:l.appearance)==null?void 0:h.class)||"",g=c?c.split(" "):[];return!((l==null?void 0:l.type)===b.DgControl["content-container"].type&&g.includes("f-title"))}function s(){var x,h;const l=(x=p.parent)==null?void 0:x.schema,c=((h=l==null?void 0:l.appearance)==null?void 0:h.class)||"",g=c?c.split(" "):[];return!((l==null?void 0:l.type)===b.DgControl["content-container"].type&&g.includes("f-title"))}function r(){return!0}function n(l){const c=new $(l,e),{schema:g}=p;return c.getPropertyConfig(g)}function a(){return"fv-html-template-design"}function o(){p.designerItemElementRef.value&&m.nextTick(()=>{b.setPositionOfButtonGroup(p.designerItemElementRef.value)})}function d(l){if(!l)return;const{changeObject:c}=l;c&&c.propertyID==="html"&&o()}return{canAccepts:t,hideNestedPaddingInDesginerView:r,getPropsConfig:n,checkCanDeleteComponent:i,checkCanMoveComponent:s,getDesignerClass:a,onPropertyChanged:d}}const q=m.defineComponent({name:"FHtmlTemplateDesign",props:I,emits:[],setup(p,e){const t=m.ref(),i=m.inject("designer-host-service"),s=m.inject("design-item-context"),r=j(s,i),n=b.useDesignerComponent(t,s,r);m.onMounted(()=>{t.value.componentInstance=n}),e.expose(n.value);const o='<div class="fv-html-template-design-placeholder">请在属性面板中配置模板</div>',d=m.computed(()=>p.html?p.html:o);return()=>m.createVNode("div",{ref:t,class:"fv-html-template-design",innerHTML:d.value},null)}});y.register=(p,e,t,i,s)=>{p["html-template"]=y,e["html-template"]=T(s)},y.registerDesigner=(p,e,t,i)=>{p["html-template"]=q,e["html-template"]=S(i)};const G=R.withInstall(y);u.FHtmlTemplate=y,u.default=G,u.designPropsResolver=N,u.designPropsResolverGenerator=S,u.htmlTemplateDesignProps=I,u.htmlTemplateProps=P,u.propsResolver=k,u.propsResolverGenerator=T,Object.defineProperties(u,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});