提交 a2c1e38f 编写于 作者: RedPig97's avatar RedPig97

add: 新增搜索表单部件

上级 c976694e
{{#*inline "FORM"}}{{>@macro/front-end/views/view-control/view-form/view-control-form.hbs}}{{/inline}}
{{#*inline "SEARCHFORM"}}{{>@macro/front-end/views/view-control/view-form/view-control-form.hbs}}{{/inline}}
{{#*inline "SEARCHFORM"}}{{>@macro/front-end/views/view-control/view-search-form/view-control-search-form.hbs}}{{/inline}}
{{#*inline "GRID"}}{{>@macro/front-end/views/view-control/view-grid/view-control-grid.hbs}}{{/inline}}
{{#*inline "APPMENU"}}{{>@macro/front-end/views/view-control/view-menu/view-control-menu.hbs}}{{/inline}}
{{camelCase name}}:{
action:{
{{#each ctrl.psControlHandler.psHandlerActions as | action |}}
{{#eq action.name 'search'}}
searchAction: '{{action.psAppDEMethod.id}}',
{{/eq}}
{{#eq action.name 'load'}}
loadAction: '{{action.psAppDEMethod.id}}',
{{/eq}}
{{#eq action.name 'loaddraft'}}
loadDraftAction: '{{action.psAppDEMethod.id}}',
{{/eq}}
{{/each}}
}
}
......@@ -393,7 +393,7 @@ export class FormControl extends MainControl {
}
return {
load: loadDraft,
loadDraft: loadDraft,
};
}
......
......@@ -6,4 +6,5 @@ export * from './menu-control'
export * from './grid-control'
export * from './pickupviewpanel-control'
export * from './tree-exp-bar-control'
export * from './tree-control'
\ No newline at end of file
export * from './tree-control'
export * from './search-form-control'
\ No newline at end of file
export * from './search-form-control-prop'
export * from './search-form-control-state'
export * from './search-form-control'
\ No newline at end of file
import { FormControlProps } from "@core";
/**
* @description 表单部件的props
* @export
* @interface SearchFormControlProps
* @extends {FormControlProps}
*/
export interface SearchFormControlProps extends FormControlProps {
}
\ No newline at end of file
import { FormControlState, IParam } from '@core';
/**
* @description 表单部件状态
* @export
* @interface SearchFormControlState
* @extends {FormControlState}
*/
export interface SearchFormControlState extends FormControlState {
}
import { deepCopy, FormControl, FormControlProps, FormControlState } from '@core';
/**
* @description 表单部件
* @export
* @class FormControl
* @extends {MainControl}
* @todo 部件加载loading,能否不写在行为方法里。
*/
export class SearchFormControl extends FormControl {
/**
* @description 部件状态
* @type {FormControlState}
* @memberof FormControl
*/
public declare controlState: FormControlState;
/**
* @description 查询
* @memberof SearchFormControl
*/
public onSearch() {
const { controlName } = this.controlState;
this.emit("ctrlEvent", {
tag: controlName,
action: "selectionChange",
data: this.controlState.data,
});
}
/**
* @description 取消
* @memberof SearchFormControl
*/
public onCancel() {
//todo 获取部件实列
}
/**
* @description 确认保存
* @memberof SearchFormControl
*/
public onOk() {
//todo saveModel服务
}
/**
* @description 安装部件所有功能模块的方法
* @param {FormControlProps} props 传入的Props
* @param {Function} [emit]
* @return {*}
* @memberof FormControl [emit] 事件
*/
public moduleInstall(props: FormControlProps, emit?: Function) {
const superParams = super.moduleInstall(props, emit);
// 表单行为能力启用
const { loadDraft } = this.useLoadDraft(props);
return {
...superParams,
state: this.controlState,
loadDraft,
onSearch: this.onSearch.bind(this),
onCancel: this.onCancel.bind(this),
onOk: this.onOk.bind(this),
handleEditorEvent: this.handleEditorEvent.bind(this),
handleComponentEvent: this.handleComponentEvent.bind(this),
};
}
}
// 部件样式汇总
\ No newline at end of file
// 部件样式汇总
@use './search-form.scss';
\ No newline at end of file
.app-search-form {
&>.ant-row {
flex-direction: column;
.search-form-footer {
text-align: right;
}
}
&.right-button>.ant-row {
flex-flow: row wrap;
.search-form-content {
flex: auto;
}
}
.search-form-footer {
padding-left: 8px;
.ant-btn {
margin-right: 4px;
}
}
}
//搜索表单气泡
.search-form-popover-button {
margin-top: 8px;
display: flex;
justify-content: right;
.ant-btn {
margin-left: 4px;
}
}
\ No newline at end of file
......@@ -6,6 +6,9 @@ import { ViewConfig } from './{{spinalCase page.codeName}}-config';
{{#eq controlType "GRID"}}
import { {{codeName}}Grid } from '@widgets/{{spinalCase appEntity.codeName}}/{{spinalCase codeName}}-grid';
{{/eq}}
{{#eq controlType "SEARCHFORM"}}
import { {{codeName}}SearchForm } from '@widgets/{{spinalCase appEntity.codeName}}/{{spinalCase codeName}}-searchForm';
{{/eq}}
{{/page.ctrls}}
// props声明和默认值处理
......@@ -48,6 +51,17 @@ const { state, grid, handleCtrlEvent, handleToolbarEvent } = new GridView(ViewCo
@toolbarEvent="handleToolbarEvent"/>
</template>
{{/eq}}
{{#eq controlType "SEARCHFORM"}}
<template v-slot:searchForm>
<{{codeName}}SearchForm
:context="state.context"
:viewParams="state.viewParams"
:controlAction="state.{{camelCase name}}.action"
:viewSubject="state.viewSubject"
@ctrlEvent="handleCtrlEvent"
></{{codeName}}SearchForm>
</template>
{{/eq}}
{{#eq controlType "GRID"}}
<{{codeName}}Grid
ref="grid"
......
import {{ctrl.codeName}}SearchForm from "./{{spinalCase ctrl.codeName}}-searchForm.vue";
export { {{ctrl.codeName}}SearchForm };
{{>@macro/front-end/widgets/form-detail/include-form.hbs}}
import { ControlVOBase, EditFormService } from '@core';
import { {{pascalCase ctrl.psAppDataEntity.codeName}}Service } from '@api/{{spinalCase ctrl.psAppDataEntity.codeName}}/{{spinalCase ctrl.psAppDataEntity.codeName}}-service';
/**
* 部件展示数据对象
* @export
* @class ControlVO
*/
export class ControlVO extends ControlVOBase {
/**
* 用后台数据对象创建部件数据对象
* @param data 后台数据
*/
constructor(data: any){
super(data);
// 记录没有映射的属性
{{#if ctrl.psDEFormItems}}
this.$ownKeys =
{{~#each ctrl.psDEFormItems as | formItem | ~}}
{{#if @first}}[{{/if~}}
'{{lowerCase formItem.id}}'{{#unless @last}},{{/unless}}
{{~#if @last}}];{{/if~}}
{{/each}}
{{/if}}
}
// 表单里映射了属性的字段
{{#each ctrl.psDEFormItems as | formItem | }}
{{!-- TODO: 表单formItem的name拿不到 --}}
{{#neq formItem.psAppDEField null }}
get {{lowerCase formItem.id}}() {
return this.$DO.{{lowerCase formItem.psAppDEField.codeName}};
}
set {{lowerCase formItem.id}}(value: any) {
this.$DO.{{lowerCase formItem.psAppDEField.codeName}} = value;
}
{{/neq}}
{{/each}}
// 表单里没有映射实体属性的字段(srfuf除外)
{{#each ctrl.psDEFormItems as | formItem | }}
{{#if (and (eq formItem.psAppDEField null) (neq formItem.id "srfuf" )) }}
{{lowerCase formItem.id}}: any;
{{/if}}
{{/each}}
}
// 部件配置对象
export const CtrlConfig = {
controlCodeName: '{{ctrl.codeName}}',
controlName: '{{ctrl.name}}',
controlService: new EditFormService<ControlVO>(ControlVO, new {{pascalCase ctrl.psAppDataEntity.codeName}}Service() ),
data: new ControlVO({}),
detailsModel: {
{{#each ctrl.psDEFormPages as | FormPage | }}
{{>(lookup 'FORMDETAILSMODEL') items=FormPage.psDEFormDetails}}
{{/each}}
},
rules: {
{{#each ctrl.psDEFormEditItemVRs as | ruleItem |}}
{{#neq ruleItem 2}}
{{#if ruleItem.valueRuleType 'DEFVALUERULE'}}
{{psDEFormEditItemName}}: [
{{#each ruleItem.psDEFVRGroupCondition as | condition |}}
{trigger: ['change', 'blur'],
validator: (_rule: RuleObject, value: string) => verifyRules(_rule,value,{
{{#condition.condType}}type: '{{condition.condType}}',{{/condition.condType}}
{{#condition.name}}name: '{{condition.name}}',{{/condition.name}}
{{#condition.maxValue}}maxValue: '{{condition.maxValue}}',{{/condition.maxValue}}
{{#condition.minValue}}minValue: '{{condition.minValue}}',{{/condition.minValue}}
{{#condition.ruleInfo}}ruleInfo: '{{condition.ruleInfo}}',{{/condition.ruleInfo}}
{{#condition.includeMaxValue}}includeMaxValue: '{{condition.includeMaxValue}}',{{/condition.includeMaxValue}}
{{#condition.includeMinValue}}includeMinValue: '{{condition.includeMinValue}}',{{/condition.includeMinValue}}
}) }
{{/each}}
]
{{/if}}
{{/neq}}
{{/each}}
},
};
\ No newline at end of file
{{>@macro/front-end/widgets/form-detail/include-form.hbs}}
<script setup lang="ts">
import { Subject } from 'rxjs';
import { SaveOutlined } from '@ant-design/icons-vue';
import { CtrlConfig } from './{{spinalCase ctrl.codeName}}-searchForm-config';
import { SearchFormControl, IActionParam, IParam, ControlAction, IContext } from '@core';
interface Props {
context: IContext;
viewParams?: IParam;
controlAction: ControlAction;
showBusyIndicator?: boolean;
viewSubject: Subject<IActionParam>;
}
const props = withDefaults(defineProps<Props>(), {
viewSubject: () => new Subject<IActionParam>(),
showBusyIndicator: true,
})
// emit声明
interface CtrlEmit {
(name: "ctrlEvent", value: IActionParam): void;
}
const emit = defineEmits<CtrlEmit>();
// 安装功能模块,提供状态和能力方法
const { state, handleEditorEvent, handleComponentEvent, onSearch, loadDraft, onOk, onCancel } = new SearchFormControl(CtrlConfig).moduleInstall(props, emit);
</script>
<template>
<a-form
name="{{ctrl.codeName}}"
class="app-search-form{{#if ctrl.psSysCss}} {{ctrl.psSysCss.cssName}}{{/if}}{{#if ctrl.searchButtonPos}} {{ctrl.searchButtonPos}}-button{{/if}}"
style="{{#if ctrl.formWidth}}width: {{ctrl.formWidth}}px;{{/if}}"
:model="state.data"
:rules="state.rules">
<a-row>
<a-col>{{#if ctrl.noTabHeader}}
<a-row>
{{#each ctrl.psDEFormPages as | ctrlPage | }}
{{#each ctrlPage.psDEFormDetails as | formDetail | }}
{{>(lookup . 'formDetail.detailType') item=formDetail}}
{{/each }}
{{/each}}
{{else}}
<a-tabs class="ibiz-form-page">
{{#each ctrl.psDEFormPages as | ctrlPage | }}
{{>(lookup . 'ctrlPage.detailType') item=ctrlPage }}
{{/each}}
</a-tabs>
{{/if}}
</a-row>
</a-col>
<a-col class='search-form-footer'>
{{#if (eq ctrl.searchButtonStyle 'DEFAULT')}}
<a-button class='search-button' @click="onSearch" type="primary">搜索</a-button>
<a-button class='reset-button' @click='loadDraft'>重置</a-button>
<a-popover title="存储自定义查询">
<template #content>
<a-input />
<div class="search-form-popover-button">
<a-button @click="onCancel">取消</a-button>
<a-button @click="onOk" type="primary">保存</a-button>
</div>
</template>
<a-button><save-outlined /></a-button>
</a-popover>
{{else if (eq ctrl.searchButtonStyle 'SEARCHONLY')}}
<a-button class='search-button' type="primary">搜索</a-button>
{{/if}}
</a-col>
</a-row>
</a-form>
</template>
\ No newline at end of file
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册