提交 6ccbdf3e 编写于 作者: sq3536's avatar sq3536

Merge remote-tracking branch 'origin/master'

...@@ -12,6 +12,8 @@ import net.ibizsys.model.control.IPSControl; ...@@ -12,6 +12,8 @@ import net.ibizsys.model.control.IPSControl;
import net.ibizsys.model.control.IPSControlContainer; import net.ibizsys.model.control.IPSControlContainer;
import net.ibizsys.model.control.dashboard.IPSDBContainerPortletPart; import net.ibizsys.model.control.dashboard.IPSDBContainerPortletPart;
import net.ibizsys.model.control.dashboard.IPSDBPortletPart; import net.ibizsys.model.control.dashboard.IPSDBPortletPart;
import net.ibizsys.model.control.grid.IPSDEGrid;
import net.ibizsys.model.control.grid.IPSDEGridColumn;
import net.ibizsys.model.control.toolbar.IPSDETBUIActionItem; import net.ibizsys.model.control.toolbar.IPSDETBUIActionItem;
import net.ibizsys.model.control.toolbar.IPSDEToolbar; import net.ibizsys.model.control.toolbar.IPSDEToolbar;
import net.ibizsys.model.view.IPSUIAction; import net.ibizsys.model.view.IPSUIAction;
...@@ -217,6 +219,38 @@ public class CtrlModel extends BaseModel{ ...@@ -217,6 +219,38 @@ public class CtrlModel extends BaseModel{
} }
} }
// 表格是否需要空白列
public Boolean isNeedEmptyColumn() {
if (getControl().getControlType() != null && "GRID".equals(getControl().getControlType())) {
Boolean flag = true;
for (IPSDEGridColumn column : ((IPSDEGrid)getControl()).getPSDEGridColumns()) {
// 自适应列
if (
column.getWidthUnit() != null
&& "STAR".equals(column.getWidthUnit())
&& column.getColumnType() != null
&& !"GROUPGRIDCOLUMN".equals(column.getColumnType())
) {
flag = false;
break;
}
}
return flag;
}
return false;
}
// 获取表格列总宽度
public Integer getTotalColumnWidth() {
Integer width = 10;
if (getControl().getControlType() != null && "GRID".equals(getControl().getControlType())) {
for (IPSDEGridColumn column : ((IPSDEGrid)getControl()).getPSDEGridColumns()) {
width += column.getWidth();
}
}
return width;
}
// 忽略发布 // 忽略发布
public Boolean ignore() { public Boolean ignore() {
IPSControl control = getControl(); IPSControl control = getControl();
......
{
{{#if item.condOp}}
"condOp": "{{item.condOp}}",
{{/if}}
"notMode": {{item.notMode}},
"condType": "{{item.condType}}",
"ruleInfo": "{{item.ruleInfo}}",
"keyCond": {{item.keyCond}},
{{#eq item.condType 'SIMPLE'}}
"paramType": "{{item.paramType}}",
"paramValue": "{{item.paramValue}}",
{{/eq}}
{{#if (or (eq item.condType 'VALUERANGE2') (eq item.condType 'STRINGLENGTH'))}}
"includeMinValue": {{item.includeMinValue}},
"minValue": "{{item.minValue}}",
"includeMaxValue": {{item.includeMaxValue}},
"maxValue": "{{item.maxValue}}",
{{/if}}
{{#eq item.condType 'REGEX'}}
"regExCode": {{item.regExCode}},
{{/eq}}
{{#if (and (eq item.condType 'SYSVALUERULE') item.psSysValueRule)}}
{{#with item.psSysValueRule as | sysRule |}}
"sysValueRule": {
"ruleType": "{{sysRule.ruleType}}",
"regExCode": "{{sysRule.regExCode}}",
"ruleInfo": "{{sysRule.ruleInfo}}",
"scriptCode": `{{sysRule.scriptCode}}`
}
{{/with}}
{{/if}}
{{#if item.psDEFVRConditions}}
"conditions": [
{{#each item.psDEFVRConditions as | condition |}}
{{> @macro/front-end/common/derules.hbs item=condition}}
{{#unless @last}},{{/unless}}
{{/each}}
]
{{/if}}
}
<AppAutoComplete <AppAutoComplete
{{#if (and (eq ctrlType 'grid') dataItemName)}}
name="{{dataItemName}}"
{{else}}
name="{{item.codeName}}" name="{{item.codeName}}"
{{/if}}
:data="state.data" :data="state.data"
{{#eq ctrlType 'form'}} {{#eq ctrlType 'form'}}
:disabled="state.detailsModel.{{item.codeName}}.disabled" :disabled="state.detailsModel.{{item.codeName}}.disabled"
...@@ -51,7 +55,7 @@ ...@@ -51,7 +55,7 @@
@editorEvent="onEditorEvent" @editorEvent="onEditorEvent"
{{/if}} {{/if}}
{{#eq ctrlType 'grid'}} {{#eq ctrlType 'grid'}}
:value="record.{{item.psEditor.name}}" :value="record.{{#if dataItemName}}{{dataItemName}}{{else}}{{item.psEditor.name}}{{/if}}"
@editorEvent="onEditorEvent($event,index)" @editorEvent="onEditorEvent($event,index)"
{{/eq}} {{/eq}}
/> />
<AppCheckboxList <AppCheckboxList
{{#if (and (eq ctrlType 'grid') dataItemName)}}
name="{{dataItemName}}"
{{else}}
name="{{item.codeName}}" name="{{item.codeName}}"
{{/if}}
:data="state.data" :data="state.data"
{{#eq ctrlType 'form'}} {{#eq ctrlType 'form'}}
:disabled="state.detailsModel.{{item.codeName}}.disabled" :disabled="state.detailsModel.{{item.codeName}}.disabled"
...@@ -25,7 +29,7 @@ ...@@ -25,7 +29,7 @@
@editorEvent="onEditorEvent" @editorEvent="onEditorEvent"
{{/if}} {{/if}}
{{#eq ctrlType 'grid'}} {{#eq ctrlType 'grid'}}
:value="record.{{item.psEditor.name}}" :value="record.{{#if dataItemName}}{{dataItemName}}{{else}}{{item.psEditor.name}}{{/if}}"
@editorEvent="onEditorEvent($event,index)" @editorEvent="onEditorEvent($event,index)"
{{/eq}} {{/eq}}
/> />
<AppCheckbox <AppCheckbox
{{#if (and (eq ctrlType 'grid') dataItemName)}}
name="{{dataItemName}}"
{{else}}
name="{{item.codeName}}" name="{{item.codeName}}"
{{/if}}
{{#eq ctrlType 'form'}} {{#eq ctrlType 'form'}}
:disabled="state.detailsModel.{{item.codeName}}.disabled" :disabled="state.detailsModel.{{item.codeName}}.disabled"
{{/eq}} {{/eq}}
...@@ -11,7 +15,7 @@ ...@@ -11,7 +15,7 @@
@editorEvent="onEditorEvent" @editorEvent="onEditorEvent"
{{/if}} {{/if}}
{{#eq ctrlType 'grid'}} {{#eq ctrlType 'grid'}}
:value="record.{{item.psEditor.name}}" :value="record.{{#if dataItemName}}{{dataItemName}}{{else}}{{item.psEditor.name}}{{/if}}"
@editorEvent="onEditorEvent($event,index)" @editorEvent="onEditorEvent($event,index)"
{{/eq}} {{/eq}}
/> />
<AppCode <AppCode
{{#if (and (eq ctrlType 'grid') dataItemName)}}
name="{{dataItemName}}"
{{else}}
name="{{item.codeName}}" name="{{item.codeName}}"
{{/if}}
{{#eq ctrlType 'form'}} {{#eq ctrlType 'form'}}
:disabled="state.detailsModel.{{item.codeName}}.disabled" :disabled="state.detailsModel.{{item.codeName}}.disabled"
{{/eq}} {{/eq}}
...@@ -11,7 +15,7 @@ ...@@ -11,7 +15,7 @@
@editorEvent="onEditorEvent" @editorEvent="onEditorEvent"
{{/if}} {{/if}}
{{#eq ctrlType 'grid'}} {{#eq ctrlType 'grid'}}
:value="record.{{item.psEditor.name}}" :value="record.{{#if dataItemName}}{{dataItemName}}{{else}}{{item.psEditor.name}}{{/if}}"
@editorEvent="onEditorEvent($event,index)" @editorEvent="onEditorEvent($event,index)"
{{/eq}} {{/eq}}
:context="state.context" :context="state.context"
......
<AppDataPickerView <AppDataPickerView
{{#if (and (eq ctrlType 'grid') dataItemName)}}
name="{{dataItemName}}"
{{else}}
name="{{item.codeName}}" name="{{item.codeName}}"
{{/if}}
:data="state.data" :data="state.data"
{{#if item.valueItemName}} {{#if item.valueItemName}}
valueItem="{{item.valueItemName}}" valueItem="{{item.valueItemName}}"
...@@ -29,7 +33,7 @@ ...@@ -29,7 +33,7 @@
@editorEvent="onEditorEvent" @editorEvent="onEditorEvent"
{{/if}} {{/if}}
{{#eq ctrlType 'grid'}} {{#eq ctrlType 'grid'}}
:value="record.{{item.psEditor.name}}" :value="record.{{#if dataItemName}}{{dataItemName}}{{else}}{{item.psEditor.name}}{{/if}}"
@editorEvent="onEditorEvent($event,index)" @editorEvent="onEditorEvent($event,index)"
{{/eq}} {{/eq}}
/> />
<AppDataPicker <AppDataPicker
{{#if (and (eq ctrlType 'grid') dataItemName)}}
name="{{dataItemName}}"
{{else}}
name="{{item.codeName}}" name="{{item.codeName}}"
{{/if}}
:data="state.data" :data="state.data"
{{#if item.valueItemName}} {{#if item.valueItemName}}
valueItem="{{item.valueItemName}}" valueItem="{{item.valueItemName}}"
...@@ -52,7 +56,7 @@ ...@@ -52,7 +56,7 @@
@editorEvent="onEditorEvent" @editorEvent="onEditorEvent"
{{/if}} {{/if}}
{{#eq ctrlType 'grid'}} {{#eq ctrlType 'grid'}}
:value="record.{{item.psEditor.name}}" :value="record.{{#if dataItemName}}{{dataItemName}}{{else}}{{item.psEditor.name}}{{/if}}"
@editorEvent="onEditorEvent($event,index)" @editorEvent="onEditorEvent($event,index)"
{{/eq}} {{/eq}}
/> />
<AppDatePicker <AppDatePicker
{{#if (and (eq ctrlType 'grid') dataItemName)}}
name="{{dataItemName}}"
{{else}}
name="{{item.codeName}}" name="{{item.codeName}}"
{{/if}}
{{#if item.psEditor.placeHolder}} {{#if item.psEditor.placeHolder}}
placeholder="{{item.psEditor.placeHolder}}" placeholder="{{item.psEditor.placeHolder}}"
{{/if}} {{/if}}
...@@ -50,7 +54,7 @@ ...@@ -50,7 +54,7 @@
@editorEvent="onEditorEvent" @editorEvent="onEditorEvent"
{{/if}} {{/if}}
{{#eq ctrlType 'grid'}} {{#eq ctrlType 'grid'}}
:value="record.{{item.psEditor.name}}" :value="record.{{#if dataItemName}}{{dataItemName}}{{else}}{{item.psEditor.name}}{{/if}}"
@editorEvent="onEditorEvent($event,index)" @editorEvent="onEditorEvent($event,index)"
{{/eq}} {{/eq}}
/> />
<AppDropdownList <AppDropdownList
{{#if (and (eq ctrlType 'grid') dataItemName)}}
name="{{dataItemName}}"
{{else}}
name="{{item.codeName}}" name="{{item.codeName}}"
{{/if}}
{{#if item.psEditor.psAppCodeList}} {{#if item.psEditor.psAppCodeList}}
codeListTag="{{item.psEditor.psAppCodeList.codeListTag}}" codeListTag="{{item.psEditor.psAppCodeList.codeListTag}}"
codeListType="{{item.psEditor.psAppCodeList.codeListType}}" codeListType="{{item.psEditor.psAppCodeList.codeListType}}"
...@@ -33,7 +37,7 @@ ...@@ -33,7 +37,7 @@
@editorEvent="onEditorEvent" @editorEvent="onEditorEvent"
{{/if}} {{/if}}
{{#eq ctrlType 'grid'}} {{#eq ctrlType 'grid'}}
:value="record.{{item.psEditor.name}}" :value="record.{{#if dataItemName}}{{dataItemName}}{{else}}{{item.psEditor.name}}{{/if}}"
:data="record" :data="record"
@editorEvent="onEditorEvent($event,index)" @editorEvent="onEditorEvent($event,index)"
{{/eq}} {{/eq}}
......
<AppInputIp <AppInputIp
{{#if (and (eq ctrlType 'grid') dataItemName)}}
name="{{dataItemName}}"
{{else}}
name="{{item.codeName}}" name="{{item.codeName}}"
{{/if}}
{{#eq ctrlType 'form'}} {{#eq ctrlType 'form'}}
:disabled="state.detailsModel.{{item.codeName}}.disabled" :disabled="state.detailsModel.{{item.codeName}}.disabled"
{{/eq}} {{/eq}}
...@@ -11,7 +15,7 @@ ...@@ -11,7 +15,7 @@
@editorEvent="onEditorEvent" @editorEvent="onEditorEvent"
{{/if}} {{/if}}
{{#eq ctrlType 'grid'}} {{#eq ctrlType 'grid'}}
:value="record.{{item.psEditor.name}}" :value="record.{{#if dataItemName}}{{dataItemName}}{{else}}{{item.psEditor.name}}{{/if}}"
@editorEvent="onEditorEvent($event,index)" @editorEvent="onEditorEvent($event,index)"
{{/eq}} {{/eq}}
/> />
<AppInput <AppInput
{{#if (and (eq ctrlType 'grid') dataItemName)}}
name="{{dataItemName}}"
{{else}}
name="{{item.codeName}}" name="{{item.codeName}}"
{{/if}}
{{#eq ctrlType 'form'}} {{#eq ctrlType 'form'}}
:disabled="state.detailsModel.{{item.codeName}}.disabled" :disabled="state.detailsModel.{{item.codeName}}.disabled"
{{/eq}} {{/eq}}
...@@ -44,7 +48,7 @@ ...@@ -44,7 +48,7 @@
@editorEvent="onEditorEvent" @editorEvent="onEditorEvent"
{{/if}} {{/if}}
{{#eq ctrlType 'grid'}} {{#eq ctrlType 'grid'}}
:value="record.{{item.psEditor.name}}" :value="record.{{#if dataItemName}}{{dataItemName}}{{else}}{{item.psEditor.name}}{{/if}}"
@editorEvent="onEditorEvent($event,index)" @editorEvent="onEditorEvent($event,index)"
{{/eq}} {{/eq}}
/> />
<AppListBox <AppListBox
{{#if (and (eq ctrlType 'grid') dataItemName)}}
name="{{dataItemName}}"
{{else}}
name="{{item.codeName}}" name="{{item.codeName}}"
{{/if}}
:data="state.data" :data="state.data"
:server="state.controlService" :server="state.controlService"
:deMajorField="state.appDeMajorFieldName" :deMajorField="state.appDeMajorFieldName"
...@@ -41,7 +45,7 @@ ...@@ -41,7 +45,7 @@
@editorEvent="onEditorEvent" @editorEvent="onEditorEvent"
{{/if}} {{/if}}
{{#eq ctrlType 'grid'}} {{#eq ctrlType 'grid'}}
:value="record.{{item.psEditor.name}}" :value="record.{{#if dataItemName}}{{dataItemName}}{{else}}{{item.psEditor.name}}{{/if}}"
@editorEvent="onEditorEvent($event,index)" @editorEvent="onEditorEvent($event,index)"
{{/eq}} {{/eq}}
/> />
<AppRadioGroup <AppRadioGroup
{{#if (and (eq ctrlType 'grid') dataItemName)}}
name="{{dataItemName}}"
{{else}}
name="{{item.codeName}}" name="{{item.codeName}}"
{{/if}}
:data="state.data" :data="state.data"
{{#if item.psEditor.psAppCodeList}} {{#if item.psEditor.psAppCodeList}}
codeListTag="{{item.psEditor.psAppCodeList.codeListTag}}" codeListTag="{{item.psEditor.psAppCodeList.codeListTag}}"
...@@ -25,7 +29,7 @@ ...@@ -25,7 +29,7 @@
@editorEvent="onEditorEvent" @editorEvent="onEditorEvent"
{{/if}} {{/if}}
{{#eq ctrlType 'grid'}} {{#eq ctrlType 'grid'}}
:value="record.{{item.psEditor.name}}" :value="record.{{#if dataItemName}}{{dataItemName}}{{else}}{{item.psEditor.name}}{{/if}}"
@editorEvent="onEditorEvent($event,index)" @editorEvent="onEditorEvent($event,index)"
{{/eq}} {{/eq}}
/> />
<AppRating <AppRating
{{#if (and (eq ctrlType 'grid') dataItemName)}}
name="{{dataItemName}}"
{{else}}
name="{{item.codeName}}" name="{{item.codeName}}"
{{/if}}
{{#eq ctrlType 'form'}} {{#eq ctrlType 'form'}}
:disabled="state.detailsModel.{{item.codeName}}.disabled" :disabled="state.detailsModel.{{item.codeName}}.disabled"
{{/eq}} {{/eq}}
...@@ -17,7 +21,7 @@ ...@@ -17,7 +21,7 @@
@editorEvent="onEditorEvent" @editorEvent="onEditorEvent"
{{/if}} {{/if}}
{{#eq ctrlType 'grid'}} {{#eq ctrlType 'grid'}}
:value="record.{{item.psEditor.name}}" :value="record.{{#if dataItemName}}{{dataItemName}}{{else}}{{item.psEditor.name}}{{/if}}"
@editorEvent="onEditorEvent($event,index)" @editorEvent="onEditorEvent($event,index)"
{{/eq}} {{/eq}}
/> />
<AppRaw <AppRaw
{{#if (and (eq ctrlType 'grid') dataItemName)}}
name="{{dataItemName}}"
{{else}}
name="{{item.codeName}}" name="{{item.codeName}}"
{{/if}}
:date="state.data" :date="state.data"
{{#eq ctrlType 'form'}} {{#eq ctrlType 'form'}}
:disabled="state.detailsModel.{{item.codeName}}.disabled" :disabled="state.detailsModel.{{item.codeName}}.disabled"
...@@ -20,7 +24,7 @@ ...@@ -20,7 +24,7 @@
@editorEvent="onEditorEvent" @editorEvent="onEditorEvent"
{{/if}} {{/if}}
{{#eq ctrlType 'grid'}} {{#eq ctrlType 'grid'}}
:value="record.{{item.psEditor.name}}" :value="record.{{#if dataItemName}}{{dataItemName}}{{else}}{{item.psEditor.name}}{{/if}}"
@editorEvent="onEditorEvent($event,index)" @editorEvent="onEditorEvent($event,index)"
{{/eq}} {{/eq}}
/> />
<AppRichText <AppRichText
{{#if (and (eq ctrlType 'grid') dataItemName)}}
name="{{dataItemName}}"
{{else}}
name="{{item.codeName}}" name="{{item.codeName}}"
{{/if}}
{{#eq ctrlType 'form'}} {{#eq ctrlType 'form'}}
:disabled="state.detailsModel.{{item.codeName}}.disabled" :disabled="state.detailsModel.{{item.codeName}}.disabled"
{{/eq}} {{/eq}}
...@@ -23,7 +27,7 @@ ...@@ -23,7 +27,7 @@
@editorEvent="onEditorEvent" @editorEvent="onEditorEvent"
{{/if}} {{/if}}
{{#eq ctrlType 'grid'}} {{#eq ctrlType 'grid'}}
:value="record.{{item.psEditor.name}}" :value="record.{{#if dataItemName}}{{dataItemName}}{{else}}{{item.psEditor.name}}{{/if}}"
:data="record" :data="record"
@editorEvent="onEditorEvent($event,index)" @editorEvent="onEditorEvent($event,index)"
{{/eq}} {{/eq}}
......
<AppSlider <AppSlider
{{#if (and (eq ctrlType 'grid') dataItemName)}}
name="{{dataItemName}}"
{{else}}
name="{{item.codeName}}" name="{{item.codeName}}"
{{/if}}
:date="state.data" :date="state.data"
{{#eq ctrlType 'form'}} {{#eq ctrlType 'form'}}
:disabled="state.detailsModel.{{item.codeName}}.disabled" :disabled="state.detailsModel.{{item.codeName}}.disabled"
...@@ -21,7 +25,7 @@ ...@@ -21,7 +25,7 @@
@editorEvent="onEditorEvent" @editorEvent="onEditorEvent"
{{/if}} {{/if}}
{{#eq ctrlType 'grid'}} {{#eq ctrlType 'grid'}}
:value="record.{{item.psEditor.name}}" :value="record.{{#if dataItemName}}{{dataItemName}}{{else}}{{item.psEditor.name}}{{/if}}"
@editorEvent="onEditorEvent($event,index)" @editorEvent="onEditorEvent($event,index)"
{{/eq}} {{/eq}}
/> />
<AppSpan <AppSpan
{{#if (and (eq ctrlType 'grid') dataItemName)}}
name="{{dataItemName}}"
{{else}}
name="{{item.codeName}}" name="{{item.codeName}}"
{{/if}}
{{#eq ctrlType 'form'}} {{#eq ctrlType 'form'}}
:disabled="state.detailsModel.{{item.codeName}}.disabled" :disabled="state.detailsModel.{{item.codeName}}.disabled"
{{/eq}} {{/eq}}
...@@ -33,7 +37,7 @@ ...@@ -33,7 +37,7 @@
:value="state.data.{{item.psEditor.name}}" :value="state.data.{{item.psEditor.name}}"
{{/if}} {{/if}}
{{#eq ctrlType 'grid'}} {{#eq ctrlType 'grid'}}
:value="record.{{item.psEditor.name}}" :value="record.{{#if dataItemName}}{{dataItemName}}{{else}}{{item.psEditor.name}}{{/if}}"
{{/eq}} {{/eq}}
:context="state.context" :context="state.context"
:viewParams="state.viewParams"/> :viewParams="state.viewParams"/>
<AppStepper <AppStepper
{{#if (and (eq ctrlType 'grid') dataItemName)}}
name="{{dataItemName}}"
{{else}}
name="{{item.codeName}}" name="{{item.codeName}}"
{{/if}}
{{#eq ctrlType 'form'}} {{#eq ctrlType 'form'}}
:disabled="state.detailsModel.{{item.codeName}}.disabled" :disabled="state.detailsModel.{{item.codeName}}.disabled"
{{/eq}} {{/eq}}
...@@ -23,7 +27,7 @@ ...@@ -23,7 +27,7 @@
@editorEvent="onEditorEvent" @editorEvent="onEditorEvent"
{{/if}} {{/if}}
{{#eq ctrlType 'grid'}} {{#eq ctrlType 'grid'}}
:value="record.{{item.psEditor.name}}" :value="record.{{#if dataItemName}}{{dataItemName}}{{else}}{{item.psEditor.name}}{{/if}}"
@editorEvent="onEditorEvent($event,index)" @editorEvent="onEditorEvent($event,index)"
{{/eq}} {{/eq}}
/> />
<AppSwitch <AppSwitch
{{#if (and (eq ctrlType 'grid') dataItemName)}}
name="{{dataItemName}}"
{{else}}
name="{{item.codeName}}" name="{{item.codeName}}"
{{/if}}
{{#eq ctrlType 'form'}} {{#eq ctrlType 'form'}}
:disabled="state.detailsModel.{{item.codeName}}.disabled" :disabled="state.detailsModel.{{item.codeName}}.disabled"
{{/eq}} {{/eq}}
...@@ -14,7 +18,7 @@ ...@@ -14,7 +18,7 @@
@editorEvent="onEditorEvent" @editorEvent="onEditorEvent"
{{/if}} {{/if}}
{{#eq ctrlType 'grid'}} {{#eq ctrlType 'grid'}}
:value="record.{{item.psEditor.name}}" :value="record.{{#if dataItemName}}{{dataItemName}}{{else}}{{item.psEditor.name}}{{/if}}"
@editorEvent="onEditorEvent($event,index)" @editorEvent="onEditorEvent($event,index)"
{{/eq}} {{/eq}}
/> />
<AppUpload <AppUpload
{{#if (and (eq ctrlType 'grid') dataItemName)}}
name="{{dataItemName}}"
{{else}}
name="{{item.codeName}}" name="{{item.codeName}}"
{{/if}}
{{#if item.psEditor.editorParams.method}} {{#if item.psEditor.editorParams.method}}
method="{{item.psEditor.editorParams.method}}" method="{{item.psEditor.editorParams.method}}"
{{/if}} {{/if}}
...@@ -34,7 +38,7 @@ ...@@ -34,7 +38,7 @@
@editorEvent="onEditorEvent" @editorEvent="onEditorEvent"
{{/if}} {{/if}}
{{#eq ctrlType 'grid'}} {{#eq ctrlType 'grid'}}
:value="record.{{item.psEditor.name}}" :value="record.{{#if dataItemName}}{{dataItemName}}{{else}}{{item.psEditor.name}}{{/if}}"
@editorEvent="onEditorEvent($event,index)" @editorEvent="onEditorEvent($event,index)"
{{/eq}} {{/eq}}
/> />
...@@ -5,11 +5,11 @@ ...@@ -5,11 +5,11 @@
{{#if item.align}} {{#if item.align}}
align: "{{lowerCase item.align}}", align: "{{lowerCase item.align}}",
{{/if}} {{/if}}
{{#if (eq item.widthUnit 'PX')}} {{#if (eq item.widthUnit 'PX')}}
width: {{item.width}}, width: {{item.width}},
{{else}} {{else if (gt item.width 1)}}
minWidth: {{item.width}}, minWidth: {{item.width}},
{{/if}} {{/if}}
resizable: true, resizable: true,
{{#if (and item.enableLinkView item.linkPSAppView)}} {{#if (and item.enableLinkView item.linkPSAppView)}}
linkView: "{{item.linkPSAppView.codeName}}", linkView: "{{item.linkPSAppView.codeName}}",
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
{{#eq item.columnType 'GROUPGRIDCOLUMN'}} {{#eq item.columnType 'GROUPGRIDCOLUMN'}}
children: [ children: [
{{#each item.psDEGridColumns as | column |}} {{#each item.psDEGridColumns as | column |}}
{{> @macro/front-end/widgets/grid-detail/include-grid.hbs type="COLUMNMODEL" item=column}} {{> @macro/front-end/widgets/grid-detail/include-grid.hbs type="COLUMNMODEL" item=column}}
{{/each}} {{/each}}
], ],
{{else}} {{else}}
......
{{#*inline "COLUMNTEXT"}} {{#*inline "COLUMNTEXT"}}
{{#if (and item.psAppCodeList (eq item.cLConvertMode 'FRONT'))}} {{#if (and item.psAppCodeList (eq item.cLConvertMode 'FRONT'))}}
<AppCodelist <AppCodelist
name="{{#if item.dataItemName}}{{lowerCase item.dataItemName}}{{else}}{{item.codeName}}{{/if}}"
codeListTag="{{item.psAppCodeList.codeListTag}}" codeListTag="{{item.psAppCodeList.codeListTag}}"
:context="state.context" :context="state.context"
:data="record" :data="record"
...@@ -20,7 +21,7 @@ ...@@ -20,7 +21,7 @@
{{else}} {{else}}
{{#if item.valueFormat}} {{#if item.valueFormat}}
<AppSpan <AppSpan
name="{{lowerCase item.codeName}}" name="{{#if item.dataItemName}}{{lowerCase item.dataItemName}}{{else}}{{item.codeName}}{{/if}}"
:value="text" :value="text"
{{#if item.psAppDEField}} {{#if item.psAppDEField}}
:dataType="{{item.psAppDEField.stdDataType}}" :dataType="{{item.psAppDEField.stdDataType}}"
...@@ -40,19 +41,19 @@ ...@@ -40,19 +41,19 @@
{{/each}} {{/each}}
{{else}} {{else}}
{{#unless (or item.hideDefault item.hiddenDataItem)}} {{#unless (or item.hideDefault item.hiddenDataItem)}}
<div v-if="Object.is(column.dataIndex, '{{#if item.dataItemName}}{{lowerCase item.dataItemName}}{{else}}{{item.codeName}}{{/if}}')" class="table-cell {{#if item.cellPSSysCss}} {{item.cellPSSysCss.cssName}}{{/if}}"> <div v-if="Object.is(column.dataIndex, '{{#if item.dataItemName}}{{lowerCase item.dataItemName}}{{else}}{{item.codeName}}{{/if}}')" class="table-cell{{#if item.cellPSSysCss}} {{item.cellPSSysCss.cssName}}{{/if}}">
{{#if (eq item.columnType 'DEFGRIDCOLUMN')}} {{#if (eq item.columnType 'DEFGRIDCOLUMN')}}
{{#if item.enableRowEdit}} {{#if item.enableRowEdit}}
<div v-if="state.rowEditState" class="editor-cell"> <div v-if="state.rowEditState" class="editor-cell">
<AppFormItem <AppFormItem
name="{{item.codeName}}" name="{{#if item.dataItemName}}{{lowerCase item.dataItemName}}{{else}}{{item.codeName}}{{/if}}"
:error="state.gridEditState.{{item.codeName}}?.[index]?.message" :error="state.gridEditState.{{#if item.dataItemName}}{{lowerCase item.dataItemName}}{{else}}{{item.codeName}}{{/if}}?.[index]?.message"
:rules="state.rules.{{item.codeName}}" :rules="state.rules.{{item.codeName}}"
:showLabel="false" :showLabel="false"
> >
{{#each ctrl.psDEGridEditItems as | editColumn | }} {{#each ctrl.psDEGridEditItems as | editColumn | }}
{{#if (eq editColumn.codeName item.codeName)}} {{#if (eq editColumn.codeName item.codeName)}}
{{> @macro/front-end/editors/include-editor.hbs type=editColumn.psEditor.editorType item=editColumn ctrlType="grid"}} {{> @macro/front-end/editors/include-editor.hbs type=editColumn.psEditor.editorType item=editColumn dataItemName=item.dataItemName ctrlType="grid"}}
{{/if}} {{/if}}
{{/each}} {{/each}}
</AppFormItem> </AppFormItem>
...@@ -80,8 +81,8 @@ ...@@ -80,8 +81,8 @@
{{else if (eq item.columnType 'UAGRIDCOLUMN')}} {{else if (eq item.columnType 'UAGRIDCOLUMN')}}
<AppToolbar <AppToolbar
mode="link" mode="link"
name="{{lowerCase item.codeName}}" name="{{#if item.dataItemName}}{{lowerCase item.dataItemName}}{{else}}{{item.codeName}}{{/if}}"
:actionModel="record.{{lowerCase item.codeName}}" :actionModel="record.{{#if item.dataItemName}}{{lowerCase item.dataItemName}}{{else}}{{item.codeName}}{{/if}}"
@onToolbarEvent="onActionColEvent($event, record)"/> @onToolbarEvent="onActionColEvent($event, record)"/>
{{/if}} {{/if}}
</div> </div>
......
...@@ -58,4 +58,18 @@ export interface GridControlState extends MDControlState { ...@@ -58,4 +58,18 @@ export interface GridControlState extends MDControlState {
*/ */
updateDefaultItems: IParam[]; updateDefaultItems: IParam[];
/**
* @description 表格列总宽度
* @type {number}
* @memberof GridControlState
*/
totalColumnWidth: number;
/**
* @description 选择列宽度(默认50,存在聚合列时为100)
* @type {number}
* @memberof GridControlState
*/
selectColumnWidth: number;
} }
import { DataTypes, dateFormat, deepCopy, GridControlState, IActionParam, IParam, isExistAndNotEmpty, MDControl } from "@core"; import { DataTypes, dateFormat, deepCopy, GridControlState, IActionParam, IParam, isExistAndNotEmpty, MDControl } from "@core";
import { createUUID } from "qx-util"; import { createUUID } from "qx-util";
import schema, { ErrorList, FieldErrorList } from 'async-validator'; import schema, { ErrorList, FieldErrorList } from 'async-validator';
import { Ref } from "vue";
/** /**
* @description 表格部件 * @description 表格部件
* @export * @export
...@@ -30,12 +31,12 @@ export class GridControl extends MDControl { ...@@ -30,12 +31,12 @@ export class GridControl extends MDControl {
* @memberof GridControl * @memberof GridControl
*/ */
public useCustom() { public useCustom() {
const { controlName, selectFirstDefault, rowEditState, rowActiveMode, isSingleSelect } = this.state; const { selectFirstDefault, rowEditState, selectColumnWidth, isSingleSelect, totalColumnWidth } = this.state;
// 滚动条配置 // 滚动条配置
const useScrollOption = computed(() => { const useScrollOption = computed(() => {
return { return {
scrollToFirstRowOnChange: true, scrollToFirstRowOnChange: true,
x: '100%', x: totalColumnWidth || '150%',
y: '100%', y: '100%',
} }
}); });
...@@ -100,6 +101,11 @@ export class GridControl extends MDControl { ...@@ -100,6 +101,11 @@ export class GridControl extends MDControl {
} }
}; };
} }
// 展开行
const useExpandedRowKeys: Ref<Array<string>> = ref([]);
const onExpandedRowsChange = (expandedRows: string[]) => {
useExpandedRowKeys.value = expandedRows;
}
// 表格选择功能配置 // 表格选择功能配置
const useRowSelectionOption = computed(() => { const useRowSelectionOption = computed(() => {
if (selectFirstDefault) { if (selectFirstDefault) {
...@@ -107,10 +113,20 @@ export class GridControl extends MDControl { ...@@ -107,10 +113,20 @@ export class GridControl extends MDControl {
} }
return { return {
type: isSingleSelect ? 'radio' : 'checkbox', type: isSingleSelect ? 'radio' : 'checkbox',
columnWidth: 32, columnWidth: selectColumnWidth,
selectedRowKeys: this.state.selectedRowKeys, selectedRowKeys: this.state.selectedRowKeys,
checkStrictly: this.props.multiple ? false : true, checkStrictly: false,
onChange: (_selectedRowKeys: string[], selectedRows: IParam[]) => { onSelect: (record: IParam, selected: boolean, selectedRows: IParam[], $event: any) => {
if (selected) {
const { appDeKeyFieldName } = this.state;
const selectedRowKey: string = record[appDeKeyFieldName] || record.srfkey;
const index: number = useExpandedRowKeys.value.findIndex((key: string) => Object.is(key, selectedRowKey))
if (Object.is(index,-1) && record.children && record.children.length > 0) {
useExpandedRowKeys.value.push(selectedRowKey);
}
}
},
onChange: (_selectedRowKeys: string[], selectedRows: any[]) => {
this.state.selectedRowKeys = _selectedRowKeys; this.state.selectedRowKeys = _selectedRowKeys;
const selection: IParam[] = []; const selection: IParam[] = [];
selectedRows.forEach((select: IParam) => { selectedRows.forEach((select: IParam) => {
...@@ -142,9 +158,11 @@ export class GridControl extends MDControl { ...@@ -142,9 +158,11 @@ export class GridControl extends MDControl {
useRowKey, useRowKey,
useRowClassName, useRowClassName,
useCustomRow, useCustomRow,
useExpandedRowKeys,
useRowSelectionOption, useRowSelectionOption,
onResizeColumn, onResizeColumn,
onGridChange onGridChange,
onExpandedRowsChange
} }
} }
...@@ -171,7 +189,7 @@ export class GridControl extends MDControl { ...@@ -171,7 +189,7 @@ export class GridControl extends MDControl {
* @param {string} tag * @param {string} tag
* @memberof GridControl * @memberof GridControl
*/ */
public handleGridItemValueChange(rowIndex: number, tag: string, data: any) { private handleGridItemValueChange(rowIndex: number, tag: string, data: any) {
const { items } = toRefs(this.state); const { items } = toRefs(this.state);
if (items.value[rowIndex][tag] !== data) { if (items.value[rowIndex][tag] !== data) {
items.value[rowIndex][tag] = data; items.value[rowIndex][tag] = data;
...@@ -518,7 +536,7 @@ export class GridControl extends MDControl { ...@@ -518,7 +536,7 @@ export class GridControl extends MDControl {
* @protected * @protected
* @memberof MDControl * @memberof MDControl
*/ */
protected async codeListGroupData() { protected async codeListGroupData() {
const { groupField, groupCodeList } = this.state.mdCtrlGroup; const { groupField, groupCodeList } = this.state.mdCtrlGroup;
const { items, context, viewParams, columnsModel } = toRefs(this.state); const { items, context, viewParams, columnsModel } = toRefs(this.state);
if (!groupCodeList || !isExistAndNotEmpty(groupCodeList.codeListTag)) { if (!groupCodeList || !isExistAndNotEmpty(groupCodeList.codeListTag)) {
......
...@@ -65,8 +65,12 @@ export class MDControl extends MainControl { ...@@ -65,8 +65,12 @@ export class MDControl extends MainControl {
let tempViewParams = deepCopy(viewParams ? viewParams : {}); let tempViewParams = deepCopy(viewParams ? viewParams : {});
const { noSort, minorSortDir, minorSortPSDEF } = mdCtrlSort; const { noSort, minorSortDir, minorSortPSDEF } = mdCtrlSort;
let { enablePagingBar, current, pageSize } = mdCtrlPaging; let { enablePagingBar, current, pageSize } = mdCtrlPaging;
if (!noSort && minorSortDir && minorSortPSDEF) { if (!noSort) {
Object.assign(tempViewParams, { sort: `${minorSortPSDEF},${minorSortDir}` }); if (arg && arg.sort) {
Object.assign(tempViewParams, { sort: arg.sort });
} else if (minorSortDir && minorSortPSDEF) {
Object.assign(tempViewParams, { sort: `${minorSortPSDEF},${minorSortDir}` });
}
} }
if (enablePagingBar) { if (enablePagingBar) {
Object.assign(tempViewParams, { page: current - 1, size: pageSize }); Object.assign(tempViewParams, { page: current - 1, size: pageSize });
......
...@@ -2,4 +2,5 @@ export { RouteUtil } from './route-util'; ...@@ -2,4 +2,5 @@ export { RouteUtil } from './route-util';
export { UIUtil } from './ui-util'; export { UIUtil } from './ui-util';
export { UIActionUtil } from './uiaction-util'; export { UIActionUtil } from './uiaction-util';
export { ViewUtil } from './view-util'; export { ViewUtil } from './view-util';
export { DataTypes } from './data-types'; export { DataTypes } from './data-types';
\ No newline at end of file export { Verify } from './verify';
\ No newline at end of file
import { isEmpty, isExistAndNotEmpty } from "@core";
/**
* 校验对象
*
* @export
* @class Verify
*/
export class Verify {
/**
* 错误提示信息
*
* @static
* @type {string}
* @memberof Verify
*/
public static errorInfo: string = '';
/**
* 值比较
*
* @static
* @param {*} value
* @param {*} value2
* @returns {number}
* @memberof Verify
*/
public static compare(value: any, value2: any): number {
let result: any;
if (!Object.is(value, '') && !Object.is(value2, '') && !isNaN(value) && !isNaN(value2)) {
result = this.compareNumber(parseFloat(value), parseFloat(value2));
} else if (this.isParseDate(value) && this.isParseDate(value2)) {
result = this.compareDate(new Date(value).getTime(), new Date(value2).getTime());
} else if (value && (typeof value === 'boolean' || value instanceof Boolean)) {
result = this.compareBoolean(value, value2);
} else if (value && (typeof value === 'string' || value instanceof String)) {
result = this.compareString(value, value2);
}
return result;
}
/**
* 字符串比较
*
* @static
* @param {*} value
* @param {*} value2
* @returns {number}
* @memberof Verify
*/
public static compareString(value: any, value2: any): number {
return value.localeCompare(value2);
}
/**
* boolean 值比较
*
* @static
* @param {*} value
* @param {*} value2
* @returns {number}
* @memberof Verify
*/
public static compareBoolean(value: any, value2: any): number {
if (value === value2) {
return 0;
} else {
return -1;
}
}
/**
* 时间值比较(毫秒数)
*
* @static
* @param {number} value
* @param {number} value2
* @returns {number}
* @memberof Verify
*/
public static compareDate(value: number, value2: number): number {
if (value > value2) {
return 1;
} else if (value < value2) {
return -1;
} else {
return 0;
}
}
/**
* 是否是时间
*
* @static
* @param {string} value
* @returns {boolean}
* @memberof Verify
*/
public static isParseDate(value: string): boolean {
const time = new Date(value);
if (isNaN(time.getTime())) {
return false;
}
return true;
}
/**
* 数值比较
*
* @static
* @param {number} value
* @param {number} value2
* @returns {number}
* @memberof Verify
*/
public static compareNumber(value: number, value2: number): number {
if (isNaN(value)) {
value = 0;
}
if (isNaN(value2)) {
value2 = 0;
}
if (value > value2) {
return 1;
} else if (value < value2) {
return -1;
} else {
return 0;
}
}
/**
* 文本包含
*
* @static
* @param {*} value
* @param {*} value2
* @returns {boolean}
* @memberof Verify
*/
public static contains(value: any, value2: any): boolean {
if (value && value2) {
// 定义一数组
let arr = new Array();
arr = value2.split(',');
// 定义正则表达式的连接符
const S = String.fromCharCode(2);
const reg = new RegExp(S + value + S);
return reg.test(S + arr.join(S) + S);
}
return false;
}
/**
* 比较值
*
* @static
* @param {*} value
* @param {*} op
* @param {*} value2
* @returns {boolean}
* @memberof Verify
*/
public static testCond(value: any, op: any, value2: any): boolean {
// 等于操作
if (Object.is(op, 'EQ')) {
const _value = `${value}`;
return _value === value2;
}
// 大于操作
if (Object.is(op, 'GT')) {
const result: number = this.compare(value, value2);
if (result !== undefined && result > 0) {
return true;
} else {
return false;
}
}
// 大于等于操作
if (Object.is(op, 'GTANDEQ')) {
const result: number = this.compare(value, value2);
if (result !== undefined && result >= 0) {
return true;
} else {
return false;
}
}
// 值包含在给定的范围中
if (Object.is(op, 'IN')) {
return this.contains(value, value2);
}
// 不为空判断操作
if (Object.is(op, 'ISNOTNULL')) {
return value != null && value !== '';
}
// 为空判断操作
if (Object.is(op, 'ISNULL')) {
return value == null || value === '';
}
// 文本左包含
if (Object.is(op, 'LEFTLIKE')) {
return value && value2 && value.toUpperCase().indexOf(value2.toUpperCase()) === 0;
}
// 文本包含
if (Object.is(op, 'LIKE')) {
return value && value2 && value.toUpperCase().indexOf(value2.toUpperCase()) !== -1;
}
// 小于操作
if (Object.is(op, 'LT')) {
const result: number = this.compare(value, value2);
if (result !== undefined && result < 0) {
return true;
} else {
return false;
}
}
// 小于等于操作
if (Object.is(op, 'LTANDEQ')) {
const result: number = this.compare(value, value2);
if (result !== undefined && result <= 0) {
return true;
} else {
return false;
}
}
// 不等于操作
if (Object.is(op, 'NOTEQ')) {
const _value = `${value}`;
return _value !== value2;
}
// 值不包含在给定的范围中
if (Object.is(op, 'NOTIN')) {
return !this.contains(value, value2);
}
// 文本右包含
if (Object.is(op, 'RIGHTLIKE')) {
if (!(value && value2)) {
return false;
}
const nPos = value.toUpperCase().indexOf(value2.toUpperCase());
if (nPos === -1) {
return false;
}
return nPos + value2.length === value.length;
}
// 空判断
if (Object.is(op, 'TESTNULL')) {
}
// 自定义包含
if (Object.is(op, 'USERLIKE')) {
}
return false;
}
/**
* 检查属性常规条件
*
* @static
* @param {*} value 属性值
* @param {string} op 检测条件
* @param {*} value2 预定义值
* @param {string} errorInfo 错误信息
* @param {string} paramType 参数类型
* @param {*} form 表单对象
* @param {boolean} primaryModel 是否必须条件
* @returns {boolean}
* @memberof Verify
*/
public static checkFieldSimpleRule(value: any, op: string, value2: any, errorInfo: string, paramType: string, form: any, primaryModel: boolean): boolean {
if (Object.is(paramType, 'CURTIME')) {
value2 = `${new Date()}`;
}
if (Object.is(paramType, 'ENTITYFIELD')) {
value2 = value2 ? value2.toLowerCase() : '';
const _value2Field = form[value2] ? form[value2] : value2;
value2 = _value2Field;
}
if (isEmpty(errorInfo)) {
errorInfo = '内容必须符合值规则';
}
this.errorInfo = errorInfo;
const result = this.testCond(value, op, value2);
if (!result) {
if (primaryModel) {
// throw new Error(this.errorInfo);
}
}
return !result;
}
/**
* 检查属性字符长度规则
*
* @static
* @param {*} viewValue
* @param {number} minLength
* @param {boolean} indexOfMin
* @param {number} maxLength
* @param {boolean} indexOfMax
* @param {string} errorInfo
* @param {boolean} primaryModel
* @returns {boolean}
* @memberof Verify
*/
public static checkFieldStringLengthRule(viewValue: string, minLength: number, indexOfMin: boolean, maxLength: number, indexOfMax: boolean, errorInfo: string, primaryModel: boolean): boolean {
if (isEmpty(errorInfo)) {
this.errorInfo = '内容长度必须符合范围规则';
} else {
this.errorInfo = errorInfo;
}
const _isEmpty = isEmpty(viewValue);
if (_isEmpty) {
if (primaryModel) {
throw new Error('值为空');
}
this.errorInfo = '值为空';
return true;
}
const viewValueLength: number = viewValue.length;
// 小于等于
if (minLength !== null) {
if (indexOfMin) {
if (viewValueLength < minLength) {
if (primaryModel) {
throw new Error(this.errorInfo);
}
return true;
}
} else {
if (viewValueLength <= minLength) {
if (primaryModel) {
throw new Error(this.errorInfo);
}
return true;
}
}
}
// 大于等于
if (maxLength !== null) {
if (indexOfMax) {
if (viewValueLength > maxLength) {
if (primaryModel) {
throw new Error(this.errorInfo);
}
return true;
}
} else {
if (viewValueLength >= maxLength) {
if (primaryModel) {
throw new Error(this.errorInfo);
}
return true;
}
}
}
this.errorInfo = '';
return false;
}
/**
* 检查属性值正则式规则
*
* @static
* @param {string} viewValue 属性值
* @param {*} strReg 验证正则
* @param {string} errorInfo 错误信息
* @param {boolean} primaryModel 是否关键条件
* @returns {boolean}
* @memberof Verify
*/
public static checkFieldRegExRule(viewValue: string, strReg: any, errorInfo: string, primaryModel: boolean): boolean {
if (isEmpty(errorInfo)) {
this.errorInfo = '值必须符合正则规则';
} else {
this.errorInfo = errorInfo;
}
const _isEmpty = isEmpty(viewValue);
if (_isEmpty) {
if (primaryModel) {
throw new Error('值为空');
}
this.errorInfo = '值为空';
return true;
}
const regExp = new RegExp(strReg);
if (!regExp.test(viewValue)) {
if (primaryModel) {
throw new Error(this.errorInfo);
}
return true;
}
this.errorInfo = '';
return false;
}
/**
* 检查脚本值规则
*
* @static
* @param {string} value 属性值
* @param {*} data 数据对象
* @param {*} scriptCode 脚本内容
* @param {string} errorInfo 错误信息
* @param {boolean} primaryModel 是否关键条件
* @returns {boolean}
* @memberof Verify
*/
public static checkFieldScriptRule(value: string, data: any, scriptCode: any, errorInfo: string, primaryModel: boolean): { isPast: boolean, infoMessage: string } {
if (isEmpty(errorInfo)) {
this.errorInfo = '值必须符合脚本规则';
} else {
this.errorInfo = errorInfo;
}
// 脚本准备参数
let source = data;
let selfError = '';
let resultBoolean: boolean = true;
// 脚本回调
let callback = (error: any) => {
resultBoolean = false;
// 脚本回调多个错误信息
if (error?.length > 0) {
error.forEach((item: any) => {
if (item?.message) {
selfError += item.message;
}
})
// 脚本回调单个错误信息
} else if (error?.message) {
selfError = error.message;
}
}
try {
// 避免脚本内变量冲突
let runScript = () => eval(scriptCode)
runScript();
} catch (error) {
console.error(error);
}
this.errorInfo = '';
if (!resultBoolean && primaryModel) {
throw new Error(this.errorInfo);
}
return { isPast: resultBoolean, infoMessage: selfError || errorInfo };
}
/**
* 检查属性值范围规则
*
* @static
* @param {string} viewValue 属性值
* @param {*} minNumber 最小数值
* @param {boolean} indexOfMin 是否包含最小数值
* @param {*} maxNumber 最大数值
* @param {boolean} indexOfMax 是否包含最大数值
* @param {string} errorInfo 错误信息
* @param {boolean} primaryModel 是否关键条件
* @returns {boolean}
* @memberof Verify
*/
public static checkFieldValueRangeRule(viewValue: string, minNumber: any, indexOfMin: boolean, maxNumber: any, indexOfMax: boolean, errorInfo: string, primaryModel: boolean): boolean {
if (isEmpty(errorInfo)) {
this.errorInfo = '值必须符合值范围规则';
} else {
this.errorInfo = errorInfo;
}
const _isEmpty = isEmpty(viewValue);
if (_isEmpty) {
if (primaryModel) {
throw new Error('值为空');
}
this.errorInfo = '值为空';
return true;
}
const valueFormat = this.checkFieldRegExRule(viewValue, /^-?\d*\.?\d+$/, '', primaryModel);
if (valueFormat) {
return true;
} else {
this.errorInfo = errorInfo;
}
const data = Number.parseFloat(viewValue);
// 小于等于
if (minNumber !== null) {
if (indexOfMin) {
if (data < minNumber) {
if (primaryModel) {
throw new Error(this.errorInfo);
}
return true;
}
} else {
if (data <= minNumber) {
if (primaryModel) {
throw new Error(this.errorInfo);
}
return true;
}
}
}
// //大于等于
if (maxNumber != null) {
if (indexOfMax) {
if (data > maxNumber) {
if (primaryModel) {
throw new Error(this.errorInfo);
}
return true;
}
} else {
if (data >= maxNumber) {
if (primaryModel) {
throw new Error(this.errorInfo);
}
return true;
}
}
}
this.errorInfo = '';
return false;
}
/**
* 检查属性值系统值范围规则 暂时支持正则表达式
*
* @static
* @param {string} viewValue 属性值
* @param {*} strReg 正则
* @param {string} errorInfo 错误信息
* @param {boolean} primaryModel 是否关键条件
* @returns {boolean}
* @memberof Verify
*/
public static checkFieldSysValueRule(viewValue: string, strReg: any, errorInfo: string, primaryModel: boolean): boolean {
return this.checkFieldRegExRule(viewValue, strReg, errorInfo, primaryModel);
}
/**
* 遍历数据并进行逻辑判断,支持&&和||,支持短路
*
* @param {any[]} array 数组
* @param {Function} callback 回调函数
* @param {string} [operateTag='AND'] 与或操作标识,支持AND、OR
* @param {boolean} [isReverse=false] 是否取反
* @returns {boolean}
* @memberof Verify
*/
public static logicForEach(array: any[], callback: (item: any, index: number) => boolean, operateTag: string = 'AND', isReverse: boolean = false): boolean {
if (!(array?.length > 0)) {
return false;
}
let result: boolean = operateTag == 'AND';
for (let i = 0, len = array.length; i < len; i++) {
let temp = callback(array[i], i);
if (operateTag == 'AND') {
if (!temp) {
result = false;
break;
}
} else if (operateTag == 'OR') {
if (temp) {
result = true;
break;
}
}
}
return isReverse ? !result : result;
}
/**
* 校验属性值规则
*
* @param {string} name 校验属性值所在字段的名称
* @param {*} data 数据对象
* @param {*} condition 规则条件
* @returns {{ isPast: boolean, infoMessage: string }}
* @memberof Verify
*/
public static verifyDeRules(name: string, data: any, condition: any): { isPast: boolean; infoMessage: string } {
let flag = { isPast: true, infoMessage: condition.ruleInfo };
if (condition.condType == 'GROUP') {
let childRules = condition.conditions;
if (childRules?.length > 0) {
flag.isPast = this.logicForEach(
childRules,
(item: any) => {
const { isPast, infoMessage } = this.verifyDeRules(name, data, item);
// 每次都把分组的结果信息改为该条件的信息,短路后是最后一个条件的信息
flag.infoMessage = infoMessage;
return isPast;
},
condition.condOp,
!!condition.notMode,
);
// 分组结果为false时,如果是AND分组且取反,或是OR分组未取反,提示分组信息
if (!flag.isPast && ((condition.condOp == 'AND' && condition.notMode) || (condition.condOp == 'OR' && !condition.notMode))) {
flag.infoMessage = condition.ruleInfo;
}
}
} else {
try {
// 常规规则
if (condition.condType == 'SIMPLE') {
flag.isPast = !Verify.checkFieldSimpleRule(data[name], condition.condOp, condition.paramValue, condition.ruleInfo, condition.paramType, data, condition.keyCond);
// 数值范围
} else if (condition.condType == 'VALUERANGE2') {
flag.isPast = !Verify.checkFieldValueRangeRule(data[name], condition.minValue, condition.includeMinValue, condition.maxValue, condition.includeMaxValue, condition.ruleInfo, condition.keyCond);
// 正则式
} else if (condition.condType == 'REGEX') {
flag.isPast = !Verify.checkFieldRegExRule(data[name], condition.regExCode, condition.ruleInfo, condition.keyCond);
// 长度
} else if (condition.condType == 'STRINGLENGTH') {
flag.isPast = !Verify.checkFieldStringLengthRule(data[name], condition.minValue, condition.includeMinValue, condition.maxValue, condition.includeMaxValue, condition.ruleInfo, condition.keyCond);
// 系统值规则
} else if (condition.condType == 'SYSVALUERULE' && condition.sysValueRule) {
const { ruleType, regExCode, scriptCode, ruleInfo } = condition.sysValueRule;
flag.infoMessage = condition.ruleInfo || ruleInfo;
if (ruleType == 'REG') {
flag.isPast = !Verify.checkFieldRegExRule(data[name], regExCode, flag.infoMessage, condition.keyCond);
} else if (ruleType == 'SCRIPT') {
const { isPast, infoMessage } = Verify.checkFieldScriptRule(data[name], data, scriptCode, flag.infoMessage, condition.keyCond);
flag.isPast = isPast;
flag.infoMessage = infoMessage || flag.infoMessage;
}
}
} catch (error) {
flag.isPast = false;
}
// 取反
flag.isPast = condition.notMode ? !flag.isPast : flag.isPast;
}
return flag;
}
/**
* 构建校验条件
*
* @param {*} model 模型数据
*
* @memberof Verify
*/
public static buildVerConditions(model: any) {
if(!model){
return [];
}
let isNumber: boolean = (model?.editorType === "NUMBER") ? true : false;
let rules: Array<any> = [];
// 构建值的type,最大值,最小值,最大长度,最小长度
if (isNumber) {
if (model.maxValue) {
rules.push({ type: 'number', max: model.maxValue, message: `内容最大值必须为${model.maxValue}` });
}
if (model.minValue) {
rules.push({ type: 'number', min: model.minValue, message: `内容最小值必须为${model.minValue}` });
}
} else {
if (model.M.showMaxLength) {
if(model.maxLength) {
rules.push({ validator: (rule: any, value: any, callback: any) => {
const length = isExistAndNotEmpty(value) ? value.length : 0;
if(length > model.maxLength) {
callback(new Error(`内容最大长度必须为${model.maxLength},当前长度为${value.length}`));
} else {
callback();
}
}});
}
}
if (model.minLength) {
rules.push({ type: 'string', min: model.minLength, message: `内容最小长度必须为${model.minLength}` });
}
}
// 构建正则
if (model.getPSSysValueRule && model.getPSSysValueRule.ruleType && Object.is(model.getPSSysValueRule.ruleType, "REG")) {
rules.push({ type: isNumber ? 'number' : 'string', pattern: model.getPSSysValueRule.regExCode, message: `${model.getPSSysValueRule.ruleInfo}` });
}
// 精度
// if (model.precision) {
// const validateData = (rule: any, value: any, callback: Function) => {
// let errorMessage;
// if (value && value.toString()) {
// let tempValue: string = value.toString();
// if (tempValue.indexOf(".") !== -1) {
// let len: number = tempValue.substring(tempValue.indexOf(".") + 1).length;
// if (len !== model.precision) {
// errorMessage = `内容精度必须为${model.precision}`;
// }
// } else {
// if (model.precision !== 0) {
// errorMessage = `内容精度必须为${model.precision}`;
// }
// }
// }
// callback(errorMessage);
// }
// rules.push(validateData);
// }
return rules;
}
}
...@@ -10,8 +10,8 @@ body{ ...@@ -10,8 +10,8 @@ body{
// 滚动条样式 // 滚动条样式
::-webkit-scrollbar { ::-webkit-scrollbar {
background: transparent; background: transparent;
width: 4px; width: 6px;
height: 4px; height: 6px;
} }
::-webkit-scrollbar-thumb { ::-webkit-scrollbar-thumb {
......
...@@ -15,4 +15,14 @@ ...@@ -15,4 +15,14 @@
&:first-child { &:first-child {
padding-left: 0; padding-left: 0;
} }
}
.app-grid {
.header-cell {
display: flex;
}
.not-data {
display: flex;
flex-direction: column;
align-items: center;
}
} }
\ No newline at end of file
import { ControlVOBase, IParam, GridService } from '@core'; import { ControlVOBase, IParam, GridService, isEmpty, Verify } from '@core';
import { {{pascalCase ctrl.psAppDataEntity.codeName}}Service } from '@api/{{spinalCase ctrl.psAppDataEntity.codeName}}/{{spinalCase ctrl.psAppDataEntity.codeName}}-service'; import { {{pascalCase ctrl.psAppDataEntity.codeName}}Service } from '@api/{{spinalCase ctrl.psAppDataEntity.codeName}}/{{spinalCase ctrl.psAppDataEntity.codeName}}-service';
export class ControlVO extends ControlVOBase { export class ControlVO extends ControlVOBase {
...@@ -22,6 +22,8 @@ export class ControlVO extends ControlVOBase { ...@@ -22,6 +22,8 @@ export class ControlVO extends ControlVOBase {
export const ctrlState = { export const ctrlState = {
controlCodeName: '{{ctrl.codeName}}', controlCodeName: '{{ctrl.codeName}}',
controlName: '{{ctrl.name}}', controlName: '{{ctrl.name}}',
totalColumnWidth: {{ctrl.totalColumnWidth}},
selectColumnWidth: {{#if (neq ctrl.aggMode 'NONE')}}100{{else}}50{{/if}},
appEntityCodeName: '{{ctrl.appEntity.codeName}}', appEntityCodeName: '{{ctrl.appEntity.codeName}}',
appDeCodeName:'{{ctrl.appEntity.codeName}}', appDeCodeName:'{{ctrl.appEntity.codeName}}',
appDeKeyFieldName: '{{#if ctrl.appEntity.keyPSAppDEField}}{{ctrl.appEntity.keyPSAppDEField.codeName}}{{/if}}', appDeKeyFieldName: '{{#if ctrl.appEntity.keyPSAppDEField}}{{ctrl.appEntity.keyPSAppDEField.codeName}}{{/if}}',
...@@ -114,8 +116,27 @@ export const ctrlState = { ...@@ -114,8 +116,27 @@ export const ctrlState = {
}, },
{{/if}} {{/if}}
{{/if}} {{/if}}
{{!-- 适配表格操作列浮动 --}}
{{#each ctrl.psDEGridColumns as | column |}} {{#each ctrl.psDEGridColumns as | column |}}
{{#unless (eq column.columnType 'UAGRIDCOLUMN')}}
{{> @macro/front-end/widgets/grid-detail/include-grid.hbs type="COLUMNMODEL" item=column}} {{> @macro/front-end/widgets/grid-detail/include-grid.hbs type="COLUMNMODEL" item=column}}
{{/unless}}
{{/each}}
{{#if ctrl.needEmptyColumn}}
{
title: "",
columnType: "EMPTYCOLUMN",
dataIndex: "autowidthcolumn",
align: "center",
resizable: true,
ellipsis: true,
aggMode: "NONE",
},
{{/if}}
{{#each ctrl.psDEGridColumns as | column |}}
{{#if (eq column.columnType 'UAGRIDCOLUMN')}}
{{> @macro/front-end/widgets/grid-detail/include-grid.hbs type="COLUMNMODEL" item=column}}
{{/if}}
{{/each}} {{/each}}
], ],
// 是否单选 // 是否单选
...@@ -160,16 +181,39 @@ export const ctrlState = { ...@@ -160,16 +181,39 @@ export const ctrlState = {
{{/if}} {{/if}}
rules:{ rules:{
{{#each ctrl.psDEGridEditItemVRs as | ruleItem |}} {{#each ctrl.psDEGridEditItemVRs as | ruleItem |}}
{{ruleItem.psDEGridEditItemName}}: [
{{#if (eq ruleItem.valueRuleType 'SYSVALUERULE')}} {{#if (eq ruleItem.valueRuleType 'SYSVALUERULE')}}
{{ruleItem.psDEGridEditItemName}}: [ {
{ trigger: ['change', 'blur'],
trigger: ['change', 'blur'], {{#eq ruleItem.psSysValueRule.ruleType 'REG'}}
{{#eq ruleItem.psSysValueRule.ruleType 'REG'}} pattern: /{{ruleItem.psSysValueRule.regExCode}}/,
pattern: /{{ruleItem.psSysValueRule.regExCode}}/, {{/eq}}
{{/eq}} message:'{{ruleItem.psSysValueRule.ruleInfo}}'
message:'{{ruleItem.psSysValueRule.ruleInfo}}' },
}], {{else if (eq ruleItem.valueRuleType 'DEFVALUERULE')}}
{{#each ctrl.psDEGridEditItems as | editItem |}}
{{#eq editItem.codeName ruleItem.psDEGridEditItemName}}
{
validator: (rule: any, value: any, callback: any, source: any) => {
if (!source || isEmpty(source['{{#if editItem.valueItemName}}{{editItem.valueItemName}}{{else}}{{ruleItem.psDEGridEditItemName}}{{/if}}'])) {
return true;
}
const { isPast, infoMessage } = Verify.verifyDeRules(
'{{#if editItem.valueItemName}}{{editItem.valueItemName}}{{else}}{{ruleItem.psDEGridEditItemName}}{{/if}}',
source,
{{> @macro/front-end/common/derules.hbs item=ruleItem.psDEFValueRule.getPSDEFVRGroupCondition}}
);
if (!isPast) {
callback(new Error(infoMessage || '{{ruleItem.psDEFValueRule.ruleInfo}}'));
}
return true;
},
trigger: ['change', 'blur']
}
{{/eq}}
{{/each}}
{{/if}} {{/if}}
],
{{/each}} {{/each}}
} }
}; };
\ No newline at end of file
...@@ -40,7 +40,7 @@ const emit = defineEmits<CtrlEmit>(); ...@@ -40,7 +40,7 @@ const emit = defineEmits<CtrlEmit>();
// 安装功能模块,提供状态和能力 // 安装功能模块,提供状态和能力
const { name, state, useCustom, onEditorEvent, onToolbarEvent, onActionColEvent, newRow, remove, save, load, refresh, getData } = new GridControl(ctrlState, props, emit).moduleInstall(); const { name, state, useCustom, onEditorEvent, onToolbarEvent, onActionColEvent, newRow, remove, save, load, refresh, getData } = new GridControl(ctrlState, props, emit).moduleInstall();
const { useScrollOption, useRowKey, useRowClassName, useCustomRow, useRowSelectionOption, onResizeColumn, onGridChange } = useCustom; const { useScrollOption, useRowKey, useRowClassName, useCustomRow, useRowSelectionOption, onResizeColumn, onGridChange, useExpandedRowKeys, onExpandedRowsChange } = useCustom;
{{#if ctrl.batchToolBarItems}} {{#if ctrl.batchToolBarItems}}
const renderBatchToolbar = (total: number, range: IParam[]) => { const renderBatchToolbar = (total: number, range: IParam[]) => {
return ( return (
...@@ -73,6 +73,7 @@ defineExpose({ name, state, newRow, remove, save, load, refresh, getData }); ...@@ -73,6 +73,7 @@ defineExpose({ name, state, newRow, remove, save, load, refresh, getData });
:sortDirections="['ascend', 'descend']" :sortDirections="['ascend', 'descend']"
:data-source="state.items" :data-source="state.items"
:row-selection="useRowSelectionOption" :row-selection="useRowSelectionOption"
:expandedRowKeys="useExpandedRowKeys"
:columns="state.columnsModel" :columns="state.columnsModel"
{{#if ctrl.batchToolBarItems}} {{#if ctrl.batchToolBarItems}}
:pagination="Object.assign(state.mdCtrlPaging.pagination, { :pagination="Object.assign(state.mdCtrlPaging.pagination, {
...@@ -86,6 +87,7 @@ defineExpose({ name, state, newRow, remove, save, load, refresh, getData }); ...@@ -86,6 +87,7 @@ defineExpose({ name, state, newRow, remove, save, load, refresh, getData });
:customRow="useCustomRow" :customRow="useCustomRow"
:rowClassName="useRowClassName" :rowClassName="useRowClassName"
@change="onGridChange" @change="onGridChange"
@expandedRowsChange="onExpandedRowsChange"
@resizeColumn="onResizeColumn" @resizeColumn="onResizeColumn"
> >
<template #emptyText> <template #emptyText>
......
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册