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

Merge remote-tracking branch 'origin/master'

...@@ -69,6 +69,8 @@ public class AppEntityModel extends BaseModel{ ...@@ -69,6 +69,8 @@ public class AppEntityModel extends BaseModel{
} }
// 初始化界面行为 // 初始化界面行为
keyField = getAppDataEntity().getPSDataEntity().getKeyPSDEField().getCodeName();
majorField = getAppDataEntity().getPSDataEntity().getMajorPSDEField().getCodeName();
if(getAppDataEntity().getAllPSAppDEUIActions() != null){ if(getAppDataEntity().getAllPSAppDEUIActions() != null){
getAppDataEntity().getAllPSAppDEUIActions().forEach(appDEUIAction ->{ getAppDataEntity().getAllPSAppDEUIActions().forEach(appDEUIAction ->{
JSONObject actionJson = new JSONObject(); JSONObject actionJson = new JSONObject();
...@@ -81,6 +83,24 @@ public class AppEntityModel extends BaseModel{ ...@@ -81,6 +83,24 @@ public class AppEntityModel extends BaseModel{
actionJson.put("htmlPageUrl",appDEUIAction.getHtmlPageUrl()); actionJson.put("htmlPageUrl",appDEUIAction.getHtmlPageUrl());
actionJson.put("refreshMode",appDEUIAction.getRefreshMode()); actionJson.put("refreshMode",appDEUIAction.getRefreshMode());
actionJson.put("uILogicAttachMode",appDEUIAction.getUILogicAttachMode()); actionJson.put("uILogicAttachMode",appDEUIAction.getUILogicAttachMode());
StringBuffer navContexts = new StringBuffer();
navContexts.append("{");
if(appDEUIAction.getPSNavigateContexts() != null){
appDEUIAction.getPSNavigateContexts().forEach(context ->{
navContexts.append(context.getName().toLowerCase() + ":'"+(context.isRawValue()?"":"%") +context.getValue()+(context.isRawValue()?"":"%")+"',");
});
}
navContexts.append("}");
actionJson.put("navContexts",navContexts);
StringBuffer navParams = new StringBuffer();
navParams.append("{");
if(appDEUIAction.getPSNavigateParams() != null){
appDEUIAction.getPSNavigateParams().forEach(param ->{
navParams.append(param.getName().toLowerCase() + ":'"+(param.isRawValue()?"":"%")+param.getValue()+(param.isRawValue()?"":"%")+"',");
});
}
navParams.append("}");
actionJson.put("navParams",navParams);
if(appDEUIAction.getPSAppDEMethod() != null){ if(appDEUIAction.getPSAppDEMethod() != null){
actionJson.put("methodCodeName",appDEUIAction.getPSAppDEMethod().getCodeName()); actionJson.put("methodCodeName",appDEUIAction.getPSAppDEMethod().getCodeName());
} }
...@@ -95,6 +115,10 @@ public class AppEntityModel extends BaseModel{ ...@@ -95,6 +115,10 @@ public class AppEntityModel extends BaseModel{
}); });
} }
} }
// 主键属性名称
public String keyField = "";
// 主信息属性名称
public String majorField = "";
public IPSAppDataEntity getAppDataEntity() public IPSAppDataEntity getAppDataEntity()
{ {
......
...@@ -44,6 +44,6 @@ ...@@ -44,6 +44,6 @@
{{/if}} {{/if}}
{{#eq ctrlType 'grid'}} {{#eq ctrlType 'grid'}}
:value="record.{{item.psEditor.name}}" :value="record.{{item.psEditor.name}}"
@editorEvent="($event: IActionParam) => onEditorEvent(index,$event)" @editorEvent="onEditorEvent($event,index)"
{{/eq}} {{/eq}}
/> />
...@@ -26,6 +26,6 @@ ...@@ -26,6 +26,6 @@
{{/if}} {{/if}}
{{#eq ctrlType 'grid'}} {{#eq ctrlType 'grid'}}
:value="record.{{item.psEditor.name}}" :value="record.{{item.psEditor.name}}"
@editorEvent="($event: IActionParam) => onEditorEvent(index,$event)" @editorEvent="onEditorEvent($event,index)"
{{/eq}} {{/eq}}
/> />
...@@ -12,6 +12,6 @@ ...@@ -12,6 +12,6 @@
{{/if}} {{/if}}
{{#eq ctrlType 'grid'}} {{#eq ctrlType 'grid'}}
:value="record.{{item.psEditor.name}}" :value="record.{{item.psEditor.name}}"
@editorEvent="($event: IActionParam) => onEditorEvent(index,$event)" @editorEvent="onEditorEvent($event,index)"
{{/eq}} {{/eq}}
/> />
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
{{/if}} {{/if}}
{{#eq ctrlType 'grid'}} {{#eq ctrlType 'grid'}}
:value="record.{{item.psEditor.name}}" :value="record.{{item.psEditor.name}}"
@editorEvent="($event: IActionParam) => onEditorEvent(index,$event)" @editorEvent="onEditorEvent($event,index)"
{{/eq}} {{/eq}}
:context="state.context" :context="state.context"
:viewParams="state.viewParams"/> :viewParams="state.viewParams"/>
\ No newline at end of file
...@@ -30,6 +30,6 @@ ...@@ -30,6 +30,6 @@
{{/if}} {{/if}}
{{#eq ctrlType 'grid'}} {{#eq ctrlType 'grid'}}
:value="record.{{item.psEditor.name}}" :value="record.{{item.psEditor.name}}"
@editorEvent="($event: IActionParam) => onEditorEvent(index,$event)" @editorEvent="onEditorEvent($event,index)"
{{/eq}} {{/eq}}
/> />
\ No newline at end of file
...@@ -57,6 +57,6 @@ ...@@ -57,6 +57,6 @@
{{/if}} {{/if}}
{{#eq ctrlType 'grid'}} {{#eq ctrlType 'grid'}}
:value="record.{{item.psEditor.name}}" :value="record.{{item.psEditor.name}}"
@editorEvent="($event: IActionParam) => onEditorEvent(index,$event)" @editorEvent="onEditorEvent($event,index)"
{{/eq}} {{/eq}}
/> />
\ No newline at end of file
...@@ -51,6 +51,6 @@ ...@@ -51,6 +51,6 @@
{{/if}} {{/if}}
{{#eq ctrlType 'grid'}} {{#eq ctrlType 'grid'}}
:value="record.{{item.psEditor.name}}" :value="record.{{item.psEditor.name}}"
@editorEvent="($event: IActionParam) => onEditorEvent(index,$event)" @editorEvent="onEditorEvent($event,index)"
{{/eq}} {{/eq}}
/> />
...@@ -33,6 +33,6 @@ ...@@ -33,6 +33,6 @@
{{#eq ctrlType 'grid'}} {{#eq ctrlType 'grid'}}
:value="record.{{item.psEditor.name}}" :value="record.{{item.psEditor.name}}"
:data="record" :data="record"
@editorEvent="($event: IActionParam) => onEditorEvent(index,$event)" @editorEvent="onEditorEvent($event,index)"
{{/eq}} {{/eq}}
/> />
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
{{/if}} {{/if}}
{{#eq ctrlType 'grid'}} {{#eq ctrlType 'grid'}}
:value="record.{{item.psEditor.name}}" :value="record.{{item.psEditor.name}}"
@editorEvent="($event: IActionParam) => onEditorEvent(index,$event)" @editorEvent="onEditorEvent($event,index)"
{{/eq}} {{/eq}}
/> />
...@@ -42,6 +42,6 @@ ...@@ -42,6 +42,6 @@
{{/if}} {{/if}}
{{#eq ctrlType 'grid'}} {{#eq ctrlType 'grid'}}
:value="record.{{item.psEditor.name}}" :value="record.{{item.psEditor.name}}"
@editorEvent="($event: IActionParam) => onEditorEvent(index,$event)" @editorEvent="onEditorEvent($event,index)"
{{/eq}} {{/eq}}
/> />
...@@ -42,6 +42,6 @@ ...@@ -42,6 +42,6 @@
{{/if}} {{/if}}
{{#eq ctrlType 'grid'}} {{#eq ctrlType 'grid'}}
:value="record.{{item.psEditor.name}}" :value="record.{{item.psEditor.name}}"
@editorEvent="($event: IActionParam) => onEditorEvent(index,$event)" @editorEvent="onEditorEvent($event,index)"
{{/eq}} {{/eq}}
/> />
...@@ -26,6 +26,6 @@ ...@@ -26,6 +26,6 @@
{{/if}} {{/if}}
{{#eq ctrlType 'grid'}} {{#eq ctrlType 'grid'}}
:value="record.{{item.psEditor.name}}" :value="record.{{item.psEditor.name}}"
@editorEvent="($event: IActionParam) => onEditorEvent(index,$event)" @editorEvent="onEditorEvent($event,index)"
{{/eq}} {{/eq}}
/> />
\ No newline at end of file
...@@ -18,6 +18,6 @@ ...@@ -18,6 +18,6 @@
{{/if}} {{/if}}
{{#eq ctrlType 'grid'}} {{#eq ctrlType 'grid'}}
:value="record.{{item.psEditor.name}}" :value="record.{{item.psEditor.name}}"
@editorEvent="($event: IActionParam) => onEditorEvent(index,$event)" @editorEvent="onEditorEvent($event,index)"
{{/eq}} {{/eq}}
/> />
...@@ -16,6 +16,6 @@ ...@@ -16,6 +16,6 @@
{{/if}} {{/if}}
{{#eq ctrlType 'grid'}} {{#eq ctrlType 'grid'}}
:value="record.{{item.psEditor.name}}" :value="record.{{item.psEditor.name}}"
@editorEvent="($event: IActionParam) => onEditorEvent(index,$event)" @editorEvent="onEditorEvent($event,index)"
{{/eq}} {{/eq}}
/> />
...@@ -25,6 +25,6 @@ ...@@ -25,6 +25,6 @@
{{#eq ctrlType 'grid'}} {{#eq ctrlType 'grid'}}
:value="record.{{item.psEditor.name}}" :value="record.{{item.psEditor.name}}"
:data="record" :data="record"
@editorEvent="($event: IActionParam) => onEditorEvent(index,$event)" @editorEvent="onEditorEvent($event,index)"
{{/eq}} {{/eq}}
/> />
...@@ -22,6 +22,6 @@ ...@@ -22,6 +22,6 @@
{{/if}} {{/if}}
{{#eq ctrlType 'grid'}} {{#eq ctrlType 'grid'}}
:value="record.{{item.psEditor.name}}" :value="record.{{item.psEditor.name}}"
@editorEvent="($event: IActionParam) => onEditorEvent(index,$event)" @editorEvent="onEditorEvent($event,index)"
{{/eq}} {{/eq}}
/> />
...@@ -24,6 +24,6 @@ ...@@ -24,6 +24,6 @@
{{/if}} {{/if}}
{{#eq ctrlType 'grid'}} {{#eq ctrlType 'grid'}}
:value="record.{{item.psEditor.name}}" :value="record.{{item.psEditor.name}}"
@editorEvent="($event: IActionParam) => onEditorEvent(index,$event)" @editorEvent="onEditorEvent($event,index)"
{{/eq}} {{/eq}}
/> />
...@@ -15,6 +15,6 @@ ...@@ -15,6 +15,6 @@
{{/if}} {{/if}}
{{#eq ctrlType 'grid'}} {{#eq ctrlType 'grid'}}
:value="record.{{item.psEditor.name}}" :value="record.{{item.psEditor.name}}"
@editorEvent="($event: IActionParam) => onEditorEvent(index,$event)" @editorEvent="onEditorEvent($event,index)"
{{/eq}} {{/eq}}
/> />
...@@ -35,6 +35,6 @@ ...@@ -35,6 +35,6 @@
{{/if}} {{/if}}
{{#eq ctrlType 'grid'}} {{#eq ctrlType 'grid'}}
:value="record.{{item.psEditor.name}}" :value="record.{{item.psEditor.name}}"
@editorEvent="($event: IActionParam) => onEditorEvent(index,$event)" @editorEvent="onEditorEvent($event,index)"
{{/eq}} {{/eq}}
/> />
...@@ -18,16 +18,16 @@ ...@@ -18,16 +18,16 @@
}, },
{{/if}} {{/if}}
appEntityName: '{{page.appEntity.codeName}}', appEntityName: '{{page.appEntity.codeName}}',
isLoadDefault: true, isLoadDefault: {{#if (or page.loadDefault (eq page.loadDefault false))}}{{page.loadDefault}}{{else}}true{{/if}},
keyPSDEField: '{{lowerCase page.appEntity.codeName}}', keyPSDEField: '{{lowerCase page.appEntity.codeName}}',
{{!-- viewMsgGroup: '{{page.psAppViewMsgGroup}}', --}} {{!-- viewMsgGroup: '{{page.psAppViewMsgGroup}}', --}}
{{!-- viewUIActions: '{{page.psAppViewUIActions}}', --}} {{!-- viewUIActions: '{{page.psAppViewUIActions}}', --}}
viewSysCss: '{{page.psSysCss}}', viewSysCss: '{{page.psSysCss.cssName}}',
{{!-- viewSysImage: '{{page.psSysImage}}', --}} {{!-- viewSysImage: '{{page.psSysImage}}', --}}
subCaption: '{{page.subCaption}}', subCaption: '{{page.subCaption}}',
viewType: '{{page.viewType}}', viewType: '{{page.viewType}}',
viewStyle: '{{page.viewStyle}}', viewStyle: '{{page.viewStyle}}',
showCaptionBar: '{{page.viewStyle}}', showCaptionBar: {{page.showCaptionBar}},
xDataControlName:'{{page.xDataControlName}}', xDataControlName:'{{page.xDataControlName}}',
openDataViewName: 'ExampleEditorEditView', openDataViewName: 'ExampleEditorEditView',
appViewNavContexts:{{> @macro/front-end/common/navparam.hbs appNavParams=page.psAppViewNavContexts}}, appViewNavContexts:{{> @macro/front-end/common/navparam.hbs appNavParams=page.psAppViewNavContexts}},
......
关系界面未实现 {{#eq item.psLayoutPos 'FLEX'}}
\ No newline at end of file <div style="flex-grow: {{#if item.psLayoutPos.grow}}{{item.psLayoutPos.grow}}{{else}}0{{/if}};">
<AppFormDruipart v-show="state.detailsModel.{{item.codeName}}.visible" name="{{item.codeName}}" title="{{item.caption}}">
<{{item.psAppView.codeName}}
:class="['app-view-layout--from-druipart']"
:context="druipartParams.context"
:viewParams="druipartParams.viewParams"
:viewDefaultUsage="false"
:noViewCaption="true"
@viewEvent="druipartParams.viewEvent"
>
</{{item.psAppView.codeName}}>
</AppFormDruipart>
</div>
{{else}}
<a-col
{{> @macro/front-end/widgets/common/layout-pos.hbs item=item.psLayoutPos}} >
<AppFormDruipart v-show="state.detailsModel.{{item.codeName}}.visible" name="{{item.codeName}}" title="{{item.caption}}">
<{{item.psAppView.codeName}}
:class="['app-view-layout--from-druipart']"
:context="druipartParams.context"
:viewParams="druipartParams.viewParams"
:viewDefaultUsage="false"
:noViewCaption="true"
@viewEvent="druipartParams.viewEvent"
>
</{{item.psAppView.codeName}}>
</AppFormDruipart>
</a-col>
{{/eq}}
\ No newline at end of file
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
mode="link" mode="link"
name="{{lowerCase item.codeName}}" name="{{lowerCase item.codeName}}"
:actionModel="record.{{lowerCase item.codeName}}" :actionModel="record.{{lowerCase item.codeName}}"
@onToolbarEvent="($event: IActionParam) => onToolbarEvent(record, $event)"/> @onToolbarEvent="onToolbarEvent($event, record)"/>
{{/if}} {{/if}}
</div> </div>
{{/unless}} {{/unless}}
......
import { Environment } from "@/environments/environment"; import { Environment } from "@/environments/environment";
import { OpenViewService } from "@/utils"; import { OpenViewService } from "@/utils";
import { AppBase, IParam, ViewDetail, IApp, IOpenViewService, deepCopy, getSessionStorage, Http, AppUtil } from "@core"; import { AppBase, IParam, ViewDetail, IApp, IOpenViewService, deepCopy, getSessionStorage, Http, AppUtil, NavDataService, INavDataService } from "@core";
import { SyncSeriesHook } from "qx-util"; import { SyncSeriesHook } from "qx-util";
import { AppFuncConfig, AppViewConfig } from './config'; import { AppFuncConfig, AppViewConfig, AppEntityConfig } from './config';
import { DataServiceRegister, UIServiceRegister } from "./register"; import { DataServiceRegister, UIServiceRegister } from "./register";
export class App extends AppBase implements IApp { export class App extends AppBase implements IApp {
...@@ -125,10 +125,30 @@ export class App extends AppBase implements IApp { ...@@ -125,10 +125,30 @@ export class App extends AppBase implements IApp {
* *
* @static * @static
* @param codeName 视图codeName * @param codeName 视图codeName
* @return {*} * @return {*}
*/ */
public getViewInfo(codeName: string): ViewDetail | undefined { public getViewInfo(codeName: string): ViewDetail | undefined {
return AppViewConfig[codeName] ? (deepCopy(AppViewConfig[codeName]) as ViewDetail) : undefined;; return AppViewConfig[codeName] ? (deepCopy(AppViewConfig[codeName]) as ViewDetail) : undefined;;
} }
/**
* 获取实体信息
*
* @static
* @param codeName 实体codeName
* @return {*}
*/
public getEntityInfo(codeName: string): any {
return AppEntityConfig[codeName] ? deepCopy(AppEntityConfig[codeName]) : undefined;
}
/**
* @description 获取导航数据服务
* @return {*} {*}
* @memberof App
*/
public getNavDataService(): INavDataService {
return NavDataService.getInstance();
}
} }
\ No newline at end of file
import { IParam } from "@core";
export const AppEntityConfig:IParam = {
{{#each app.appEntitiesMap as |appEntity|}}
"{{appEntity.codeName}}":{
"name": "{{appEntity.name}}",
"codeName": "{{appEntity.codeName}}",
"majorField":"{{appEntity.majorField}}",
"keyField":"{{appEntity.keyField}}"
}{{#unless @last}},{{/unless}}
{{/each}}
}
\ No newline at end of file
...@@ -16,6 +16,12 @@ export const AppViewConfig:IParam = { ...@@ -16,6 +16,12 @@ export const AppViewConfig:IParam = {
"parameters": [ "parameters": [
{ "pathName": "views", "parameterName": "{{lowerCase appView.codeName}}" } { "pathName": "views", "parameterName": "{{lowerCase appView.codeName}}" }
], ],
{{#if (gt appView.height 0)}}
"height": {{appView.height}},
{{/if}}
{{#if (gt appView.width 0)}}
"width": {{appView.width}},
{{/if}}
{{#if appView.capPSLanguageRes}} {{#if appView.capPSLanguageRes}}
"captionTag": "{{appView.capPSLanguageRes.lanResTag}}", "captionTag": "{{appView.capPSLanguageRes.lanResTag}}",
{{/if}} {{/if}}
......
export { AppFuncConfig } from './app-func-config'; export { AppFuncConfig } from './app-func-config';
export { AppViewConfig } from './app-view-config'; export { AppViewConfig } from './app-view-config';
export { AppCodeListConfig } from './app-code-list-config'; export { AppCodeListConfig } from './app-code-list-config';
\ No newline at end of file export { AppEntityConfig } from './app-entity-config';
\ No newline at end of file
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
<template v-slot:header-bottom> <template v-slot:header-bottom>
<slot name="quickSearchForm" /> <slot name="quickSearchForm" />
<slot name="searchForm" /> <slot name="searchForm" />
<slot name="searchBar" />
</template> </template>
<template v-slot:body-top> <template v-slot:body-top>
<slot name="bodyMessage" /> <slot name="bodyMessage" />
......
<script setup lang="ts">
import { IActionParam, IParam } from "@core";
interface FilterTreeProps{
datas:any[]
fields:any[]
}
const props = withDefaults(defineProps<FilterTreeProps>(), {
});
onMounted(() => {
console.log(props)
});
</script>
<template>
<div class="app-filter-tree">暂未支持</div>
</template>
<style lang="scss">
</style>
\ No newline at end of file
<script setup lang="ts">
import { IActionParam, IParam, RouteUtil } from '@core';
import { Subject, Subscription } from 'rxjs';
interface FormDruipartProps {
// 关联视图
viewName: string;
// 刷新关系项
tempMode: string;
// 禁止加载
isForbidLoad: string;
// 传入参数项名称
paramItem: string;
// 视图上下文
context: string;
// 视图参数
viewParams: boolean;
// 应用实体参数名称
parentName: number;
// 应用实体映射实体名称
parentDeName: boolean;
// 标题
title: string;
// 刷新关系项
refreshItems: string;
// 表单数据
data: string;
// 表单订阅对象
formState: Subject<any>;
// 视图路由参数
parameters: any[];
// 名称
name: string;
// 是否忽略表单项值变化
ignoreFieldValueChange: boolean;
}
interface FormDruipartEmit {
(name: 'componentEvent', value: IActionParam): void;
}
const props = withDefaults(defineProps<FormDruipartProps>(), {});
const emit = defineEmits<FormDruipartEmit>();
let formStateEvent: undefined | Subscription = undefined;
const formDruipart: Subject<any> = new Subject<any>();
// 关秀界面上下文
let druipartContext:any = undefined;
// 关秀界面视图参数
let druipartViewParams:any = undefined;
onBeforeMount(() => {
watch(
() => props.data,
(newVal: any, oldVal: any) => {
if (props.ignoreFieldValueChange) {
return;
}
if (Object.is(newVal, oldVal)) {
return;
}
refreshDRUIPart();
},
);
druipartInit();
});
// 关系界面初始化
const druipartInit = () => {
if (!props.formState) {
return;
}
formStateEvent = props.formState.subscribe(($event: any) => {
// 表单加载完成
if (Object.is($event.type, 'load')) {
refreshDRUIPart($event.data);
}
});
};
// 刷新关系界面
const refreshDRUIPart = (data?: any) => {
// const formData: any = data ? data : JSON.parse(props.data);
// const _paramItem = formData[props.paramItem];
// let tempContext: any = {};
// let tempParam: any = {};
// const _parameters: any[] = [RouteUtil.getIndexViewParam(), ...props.parameters];
// _parameters.forEach((parameter: any) => {
// const { pathName, parameterName }: { pathName: string; parameterName: string } = parameter;
// if (formData[parameterName] && !Object.is(formData[parameterName], '')) {
// Object.assign(tempContext, {
// [parameterName]: formData[parameterName],
// });
// }
// });
// Object.assign(tempContext, { [props.paramItem]: _paramItem });
// //设置顶层视图唯一标识
// Object.assign(tempContext, props.context);
// Object.assign(tempContext, {
// srfParentDeName: props.parentName,
// srfParentDeMapName: props.parentDeName,
// srfParentKey: _paramItem,
// });
// Object.assign(tempParam, {
// srfParentDeName: props.parentName,
// srfParentDeMapName: props.parentDeName,
// srfParentKey: _paramItem,
// });
// 设置局部上下文
formDruipart.next({ action: 'load' });
};
const viewEvent = (action:any) => {
};
</script>
<template>
<a-card :class="['app-form-druipart', `app-form-druipart-${name}`]" :bordered="false">
<template #title>
<p :class="['app-form-druipart-title']">
<AppIconText :text="title" />
</p>
</template>
<slot :context="druipartContext" :viewParams="druipartViewParams" :viewEvent="viewEvent" ></slot>
</a-card>
</template>
<style lang="scss">
.app-form-druipart {
height: 100%;
width: 100%;
.ant-card-head {
text-align: left;
.app-form-druipart-title {
margin: 0px;
}
}
.app-view-layout--from-druipart {
padding: 0;
}
}
</style>
\ No newline at end of file
import { IParam, ViewDetail } from "../common"; import { IParam, ViewDetail } from "../common";
import { IAppFuncService, IDataServiceRegister, IOpenViewService, IUIServiceRegister } from "../service"; import { IAppFuncService, IDataServiceRegister, INavDataService, IOpenViewService, IUIServiceRegister } from "../service";
/** /**
...@@ -72,6 +72,17 @@ export interface IApp { ...@@ -72,6 +72,17 @@ export interface IApp {
*/ */
getViewInfo(codeName: string): ViewDetail | undefined; getViewInfo(codeName: string): ViewDetail | undefined;
/**
* 获取实体信息
*
* @static
* @param codeName 实体codeName
* @return {*}
*/
getEntityInfo(codeName: string): any;
/** /**
* 获取应用数据 * 获取应用数据
* *
...@@ -86,6 +97,13 @@ export interface IApp { ...@@ -86,6 +97,13 @@ export interface IApp {
* @param {IParam} opt * @param {IParam} opt
* @memberof IApp * @memberof IApp
*/ */
setAppData(opt:IParam): void; setAppData(opt: IParam): void;
/**
* @description 获取导航数据服务
* @return {*} {INavDataService}
* @memberof IApp
*/
getNavDataService(): INavDataService;
} }
\ No newline at end of file
import { INavDataParam, IParam, ViewDetail } from "@core";
import { Subject } from 'rxjs';
/**
* @description 打开视图服务接口
* @export
* @interface INavDataService
*/
export interface INavDataService {
addNavData(curNavData: INavDataParam): void;
getNavData(): Array<INavDataParam>;
getPreNavData(tag: string): INavDataParam | null;
skipNavData(tag: string): void;
removeNavData(tag: string): void;
removeNavDataFirst(): void;
removeNavDataLast(): void;
removeAllNavData(): void;
}
\ No newline at end of file
...@@ -2,4 +2,5 @@ export * from './i-app-func-service'; ...@@ -2,4 +2,5 @@ export * from './i-app-func-service';
export * from './i-app-action-service'; export * from './i-app-action-service';
export * from './i-open-view-service'; export * from './i-open-view-service';
export * from './i-data-service-register'; export * from './i-data-service-register';
export * from './i-ui-service-register'; export * from './i-ui-service-register';
\ No newline at end of file export * from './i-nav-data-service';
\ No newline at end of file
import { AppActionService, IContext, IParam } from "@core"; import { AppActionService, IContext, IParam, UIActionUtil } from "@core";
export interface ActionParams { export interface ActionParams {
/** /**
...@@ -60,7 +60,7 @@ export class AppActionBase { ...@@ -60,7 +60,7 @@ export class AppActionBase {
* @memberof AppActionBase * @memberof AppActionBase
*/ */
public static async getUIService(actionEnvironment: IParam) { public static async getUIService(actionEnvironment: IParam) {
const entityName = actionEnvironment?.viewState?.appEntityName; const entityName = actionEnvironment?.state?.appEntityName;
if (!entityName) { if (!entityName) {
console.log("实体名称不存在"); console.log("实体名称不存在");
return; return;
...@@ -76,13 +76,48 @@ export class AppActionBase { ...@@ -76,13 +76,48 @@ export class AppActionBase {
/** /**
* 根据数据目标处理行为参数 * 根据数据目标处理行为参数
* *
* @param {string} ActionTarget * @param {string} action
* @param { context: IContext, viewParams: IParam, data: IParam, event: MouseEvent, actionEnvironment: IParam } params * @param { context: IContext, viewParams: IParam, data: IParam, event: MouseEvent, actionEnvironment: IParam } params
* @memberof AppFrontAction * @memberof AppFrontAction
*/ */
public static handleActionTarget(ActionTarget: string, params: { context: IContext, viewParams: IParam, data: IParam, event: MouseEvent, actionEnvironment: IParam }): IParam { public static handleActionTarget(action: IParam, params: { context: IContext, viewParams: IParam, data: IParam, event: MouseEvent, actionEnvironment: IParam }): ActionParams {
// todo const { actionTarget, entityCodeName } = action;
return {}; const { data } = params;
// 数据目标值
let resultData: ActionParams = {
context: {},
viewParams: {},
data: {}
};
switch (actionTarget) {
case 'SINGLEKEY':
case 'MULTIKEY':
// 多数据主键和单数据主键,合并实体的主键参数和主信息参数 到上下文 后续统一合并进数据目标值
if (!entityCodeName) {
console.log("实体名称不存在");
break;
}
const entity = App.getEntityInfo(entityCodeName);
if (!entity) {
console.log("实体不存在");
break;
}
const entityName = entityCodeName.toLowerCase();
const keyField = entity.keyField.toLowerCase();
const majorField = entity.majorField.toLowerCase();
if (data?.[0]?.[keyField]) {
Object.assign(resultData.context, { [entityName]: `%${keyField}%` });
} else {
Object.assign(resultData.context, { [entityName]: `%${entityName}%` });
}
Object.assign(resultData.viewParams, { [keyField]: `%${keyField}%` });
Object.assign(resultData.viewParams, { [majorField]: `%${majorField}%` });
break;
case 'SINGLEDATA':
resultData.data = data?.[0]?data?.[0]:{};
break;
}
return resultData;
} }
/** /**
...@@ -93,9 +128,39 @@ export class AppActionBase { ...@@ -93,9 +128,39 @@ export class AppActionBase {
* @param { context: IContext, viewParams: IParam, data: IParam, event: MouseEvent, actionEnvironment: IParam } params * @param { context: IContext, viewParams: IParam, data: IParam, event: MouseEvent, actionEnvironment: IParam } params
* @memberof AppFrontAction * @memberof AppFrontAction
*/ */
public static handleActionParam(uiAction: IParam, params: { context: IContext, viewParams: IParam, data: IParam, event: MouseEvent, actionEnvironment: IParam }, data: IParam): ActionParams { public static handleActionParam(uiAction: IParam, params: { context: IContext, viewParams: IParam, data: IParam, event: MouseEvent, actionEnvironment: IParam }, data: ActionParams): ActionParams {
// todo const { navContexts, navParams, actionTarget } = uiAction;
return { context: {}, viewParams: {}, data: {} }; const { viewParams, context, data: _data } = params;
const { context: tempContext, viewParams: tempViewParams, } = data;
let { data: resultData } = data;
// 合并导航参数和导航上下文至数据目标处理后的参数
Object.assign(tempContext, navContexts);
Object.assign(tempViewParams, navParams);
// 根据上下文和导航参数,解析参数
const _context = UIActionUtil.formatDataActionData(actionTarget, _data, context, viewParams, tempContext);
const _viewParams = UIActionUtil.formatDataActionData(actionTarget, _data, context, viewParams, tempViewParams);
if (Object.is(actionTarget, 'SINGLEDATA')) {
Object.assign(resultData, _viewParams);
} else {
resultData = _viewParams;
}
// 多项数据主键转换数据
if (Object.is(actionTarget, 'MULTIKEY')) {
let tempDataArray: Array<any> = [];
if (_data.length > 1 && Object.keys(data).length > 0) {
for (let i = 0; i < _data.length; i++) {
let tempObject: any = {};
Object.keys(resultData).forEach((key: string) => {
Object.assign(tempObject, { [key]: resultData[key].split(',')[i] });
});
tempDataArray.push(tempObject);
}
} else {
tempDataArray.push(data);
}
resultData = tempDataArray;
}
return { context: _context, viewParams: _viewParams, data: resultData };
} }
/** /**
......
...@@ -16,14 +16,14 @@ export class AppBackendAction extends AppActionBase { ...@@ -16,14 +16,14 @@ export class AppBackendAction extends AppActionBase {
*/ */
public static async doBackendAction(uiAction: IParam, params: { context: IContext, viewParams: IParam, data: IParam, event: MouseEvent, actionEnvironment: IParam }, actionParams: ActionParams): Promise<UIActionResult> { public static async doBackendAction(uiAction: IParam, params: { context: IContext, viewParams: IParam, data: IParam, event: MouseEvent, actionEnvironment: IParam }, actionParams: ActionParams): Promise<UIActionResult> {
try { try {
const { context, actionEnvironment } = params; const { actionEnvironment } = params;
const entityName = actionEnvironment?.viewState?.appEntityName; const { context } = actionParams;
const entityName = actionEnvironment?.state?.appEntityName;
if (!entityName) { if (!entityName) {
console.log("实体名称不存在"); console.log("实体名称不存在");
return { ok: false, result: null }; return { ok: false, result: null };
} }
const methodCodeName: string = uiAction.methodCodeName; const methodCodeName: string = uiAction.methodCodeName;
if (!methodCodeName) { if (!methodCodeName) {
console.log("实体行为不存在"); console.log("实体行为不存在");
return { ok: false, result: null }; return { ok: false, result: null };
...@@ -31,7 +31,7 @@ export class AppBackendAction extends AppActionBase { ...@@ -31,7 +31,7 @@ export class AppBackendAction extends AppActionBase {
// 获取实体服务 // 获取实体服务
const dataService = await App.getDataService(entityName.toLowerCase(), context) const dataService = await App.getDataService(entityName.toLowerCase(), context)
// 获取实体行为名称 // 获取实体行为名称
const response = await dataService[methodCodeName](context, actionParams); const response = await dataService[methodCodeName](context, actionParams.data);
return new Promise((resolve: any, reject: any) => { return new Promise((resolve: any, reject: any) => {
if (response && response.ok) { if (response && response.ok) {
this.doSuccessMessage(uiAction); this.doSuccessMessage(uiAction);
...@@ -112,7 +112,7 @@ export class AppBackendAction extends AppActionBase { ...@@ -112,7 +112,7 @@ export class AppBackendAction extends AppActionBase {
/** /**
* 执行台行为 * 执行台行为
* *
* @param {IParam} uiAction * @param {IParam} uiAction
* @memberof AppFrontAction * @memberof AppFrontAction
...@@ -125,7 +125,7 @@ export class AppBackendAction extends AppActionBase { ...@@ -125,7 +125,7 @@ export class AppBackendAction extends AppActionBase {
// 消息确认提示 // 消息确认提示
this.doConfirmMessage(uiAction); this.doConfirmMessage(uiAction);
// 根据行为目标 合并行为参数 // 根据行为目标 合并行为参数
const data = this.handleActionTarget(uiAction.actionTarget, params); const data = this.handleActionTarget(uiAction, params);
// 处理行为参数 导航参数、数据项、信息项、参数项 // 处理行为参数 导航参数、数据项、信息项、参数项
const actionParams = this.handleActionParam(uiAction, params, data); const actionParams = this.handleActionParam(uiAction, params, data);
// 执行行为 // 执行行为
......
...@@ -19,8 +19,8 @@ export class AppFrontAction extends AppActionBase { ...@@ -19,8 +19,8 @@ export class AppFrontAction extends AppActionBase {
*/ */
public static openView(uiAction: IParam, params: { context: IContext, viewParams: IParam, data: IParam, event: MouseEvent, actionEnvironment: IParam }, actionParams: ActionParams): Promise<UIActionResult> { public static openView(uiAction: IParam, params: { context: IContext, viewParams: IParam, data: IParam, event: MouseEvent, actionEnvironment: IParam }, actionParams: ActionParams): Promise<UIActionResult> {
return new Promise((resolve: any, reject: any) => { return new Promise((resolve: any, reject: any) => {
const { context, viewParams } = params;
const { frontPSAppView } = uiAction; const { frontPSAppView } = uiAction;
const { context, viewParams, data } = actionParams;
if (!frontPSAppView) { if (!frontPSAppView) {
console.log("模型视图名称不存在"); console.log("模型视图名称不存在");
return reject({ ok: false, result: null }); return reject({ ok: false, result: null });
...@@ -103,7 +103,7 @@ export class AppFrontAction extends AppActionBase { ...@@ -103,7 +103,7 @@ export class AppFrontAction extends AppActionBase {
return this.executeUILogic(uiAction, params); return this.executeUILogic(uiAction, params);
} }
// 根据行为目标 合并行为参数 // 根据行为目标 合并行为参数
const data = this.handleActionTarget(uiAction.actionTarget, params); const data = this.handleActionTarget(uiAction, params);
// 处理行为参数 导航参数、数据项、信息项、参数项 // 处理行为参数 导航参数、数据项、信息项、参数项
const actionParams = this.handleActionParam(uiAction, params, data); const actionParams = this.handleActionParam(uiAction, params, data);
// 执行行为 // 执行行为
......
import { AppFuncService, IApp, IAppFuncService, IOpenViewService, ViewDetail } from "@core"; import { AppFuncService, IApp, IAppFuncService, IOpenViewService, ViewDetail } from "@core";
import { IDataServiceRegister, IParam, IUIServiceRegister } from "@core/interface"; import { IDataServiceRegister, INavDataService, IParam, IUIServiceRegister } from "@core/interface";
/** /**
* 应用基类 * 应用基类
...@@ -120,4 +120,13 @@ export abstract class AppBase implements IApp { ...@@ -120,4 +120,13 @@ export abstract class AppBase implements IApp {
public getViewInfo(codeName: string): ViewDetail | undefined { public getViewInfo(codeName: string): ViewDetail | undefined {
return undefined; return undefined;
} }
/**
* @description 获取导航数据服务
* @return {*} {INavDataService}
* @memberof AppBase
*/
public getNavDataService(): INavDataService {
throw new Error("Method not implemented.");
}
} }
\ No newline at end of file
...@@ -41,12 +41,12 @@ public declare state: GridViewState; ...@@ -41,12 +41,12 @@ public declare state: GridViewState;
* @param {IActionParam} actionParam * @param {IActionParam} actionParam
* @memberof MDView * @memberof MDView
*/ */
public handleCtrlEvent(actionParam: IActionParam) { public onCtrlEvent(actionParam: IActionParam) {
const { tag, action, data } = actionParam; const { tag, action, data } = actionParam;
if (Object.is(tag, 'grid')) { if (Object.is(tag, 'grid')) {
this.MDCtrlEvent(action, data); this.MDCtrlEvent(action, data);
} }
super.handleCtrlEvent(actionParam); super.onCtrlEvent(actionParam);
} }
/** /**
......
...@@ -66,7 +66,7 @@ export class MDView extends MainView { ...@@ -66,7 +66,7 @@ export class MDView extends MainView {
* @param {IActionParam} actionParam * @param {IActionParam} actionParam
* @memberof MDView * @memberof MDView
*/ */
public handleCtrlEvent(actionParam: IActionParam) { public onCtrlEvent(actionParam: IActionParam) {
const { tag, action, data } = actionParam; const { tag, action, data } = actionParam;
if (Object.is(tag, 'searchform')) { if (Object.is(tag, 'searchform')) {
this.handleSearchFormEvent(action, data); this.handleSearchFormEvent(action, data);
......
...@@ -38,7 +38,7 @@ export class PickupGridView extends PickupView { ...@@ -38,7 +38,7 @@ export class PickupGridView extends PickupView {
* @param {IActionParam} actionParam * @param {IActionParam} actionParam
* @memberof PickupGridView * @memberof PickupGridView
*/ */
public handleCtrlEvent(actionParam: IActionParam) { public onCtrlEvent(actionParam: IActionParam) {
const { tag, action, data } = actionParam; const { tag, action, data } = actionParam;
if (tag !== 'grid') { if (tag !== 'grid') {
return; return;
......
...@@ -49,7 +49,7 @@ export class PickupView extends MainView { ...@@ -49,7 +49,7 @@ export class PickupView extends MainView {
this.emit('viewEvent', { data: this.selectData, tag: '', action: 'close' }) this.emit('viewEvent', { data: this.selectData, tag: '', action: 'close' })
} }
public handleCtrlEvent(actionParam: IActionParam) { public onCtrlEvent(actionParam: IActionParam) {
const { tag, action, data } = actionParam; const { tag, action, data } = actionParam;
// TODO // TODO
......
...@@ -194,7 +194,19 @@ export class ViewBase { ...@@ -194,7 +194,19 @@ export class ViewBase {
* *
* @memberof ViewBase * @memberof ViewBase
*/ */
public useViewInit() { } public useViewInit() {
const route = useRoute();
App.getNavDataService().addNavData({title: this.state.viewCaption, viewType: this.state.viewType, path: unref(route.fullPath), openType: this.props.openType, tag: this.state.viewCodeName, key: '', data: {}});
}
/**
* @description 视图销毁
* @memberof ViewBase
*/
public useViewDestroyed() {
// 视图销毁从导航栈里面删除数据
App.getNavDataService().removeNavData(this.state.viewCodeName);
}
/** /**
* @description 安装视图所有功能模块的方法 * @description 安装视图所有功能模块的方法
......
...@@ -21,7 +21,7 @@ export class ExpBarControl extends MainControl { ...@@ -21,7 +21,7 @@ export class ExpBarControl extends MainControl {
* @param {IActionParam} actionParam * @param {IActionParam} actionParam
* @memberof ExpBarControl * @memberof ExpBarControl
*/ */
public handleCtrlEvent(actionParam: IActionParam) { public onCtrlEvent(actionParam: IActionParam) {
const { tag, action, data } = actionParam; const { tag, action, data } = actionParam;
const { selection } = this.state; const { selection } = this.state;
switch (action) { switch (action) {
...@@ -73,7 +73,7 @@ export class ExpBarControl extends MainControl { ...@@ -73,7 +73,7 @@ export class ExpBarControl extends MainControl {
const superParams = super.moduleInstall(); const superParams = super.moduleInstall();
return { return {
...superParams, ...superParams,
handleCtrlEvent: this.handleCtrlEvent.bind(this) onCtrlEvent: this.onCtrlEvent.bind(this)
}; };
} }
} }
\ No newline at end of file
import { DataTypes, dateFormat, deepCopy, FormControlProps, FormControlState, IActionParam, IParam, MainControl, UIUtil, verifyValue } from '@core'; import {
DataTypes,
dateFormat,
deepCopy,
FormControlProps,
FormControlState,
IActionParam,
IParam,
MainControl,
UIUtil,
verifyValue,
} from '@core';
/** /**
* @description 表单部件 * @description 表单部件
...@@ -19,7 +30,7 @@ export class FormControl extends MainControl { ...@@ -19,7 +30,7 @@ export class FormControl extends MainControl {
* @description 检验表单动态逻辑 * @description 检验表单动态逻辑
* @param {IParam} data 表单数据 * @param {IParam} data 表单数据
* @param {IParam} logic 动态逻辑 * @param {IParam} logic 动态逻辑
* @return {*} * @return {*}
* @memberof FormControl * @memberof FormControl
*/ */
public verifyGroupLogic(data: IParam, logic: IParam) { public verifyGroupLogic(data: IParam, logic: IParam) {
...@@ -28,12 +39,12 @@ export class FormControl extends MainControl { ...@@ -28,12 +39,12 @@ export class FormControl extends MainControl {
if (logic.groupOP == 'AND') { if (logic.groupOP == 'AND') {
const falseItem = logic.logics.find((childLogic: IParam) => { const falseItem = logic.logics.find((childLogic: IParam) => {
return !this.verifyGroupLogic(data, childLogic); return !this.verifyGroupLogic(data, childLogic);
}) });
result = falseItem ? false : true; result = falseItem ? false : true;
} else if (logic.groupOP == 'OR') { } else if (logic.groupOP == 'OR') {
const trueItem = logic.logics.find((childLogic: IParam) => { const trueItem = logic.logics.find((childLogic: IParam) => {
return this.verifyGroupLogic(data, childLogic); return this.verifyGroupLogic(data, childLogic);
}) });
result = trueItem ? true : false; result = trueItem ? true : false;
} }
// 是否取反 // 是否取反
...@@ -62,7 +73,7 @@ export class FormControl extends MainControl { ...@@ -62,7 +73,7 @@ export class FormControl extends MainControl {
this.formItemUpdate(name); this.formItemUpdate(name);
this.formDynamicLogic(name); this.formDynamicLogic(name);
if (enableAutoSave) { if (enableAutoSave) {
this.useSave().save(); this.save();
} }
} }
...@@ -80,7 +91,7 @@ export class FormControl extends MainControl { ...@@ -80,7 +91,7 @@ export class FormControl extends MainControl {
this.handleFormDataChange(item.valueItemName, null); this.handleFormDataChange(item.valueItemName, null);
} }
} }
}) });
} }
/** /**
...@@ -110,7 +121,7 @@ export class FormControl extends MainControl { ...@@ -110,7 +121,7 @@ export class FormControl extends MainControl {
if (data.value.hasOwnProperty(detailsName)) { if (data.value.hasOwnProperty(detailsName)) {
data.value[detailsName] = response.data[detailsName]; data.value[detailsName] = response.data[detailsName];
} }
}) });
this.afterFormAction('formItemUpdate'); this.afterFormAction('formItemUpdate');
} }
} }
...@@ -188,11 +199,11 @@ export class FormControl extends MainControl { ...@@ -188,11 +199,11 @@ export class FormControl extends MainControl {
if (Object.is(item.detailType, 'FORMITEM')) { if (Object.is(item.detailType, 'FORMITEM')) {
switch (item.enableCond) { switch (item.enableCond) {
case 0: case 0:
// 不启用 // 不启用
item.disabled = false; item.disabled = false;
break; break;
case 1: case 1:
// 新建 // 新建
item.disabled = data.srfuf != 0; item.disabled = data.srfuf != 0;
break; break;
case 2: case 2:
...@@ -284,12 +295,14 @@ export class FormControl extends MainControl { ...@@ -284,12 +295,14 @@ export class FormControl extends MainControl {
data.value[detail.codeName] = controlService.getRemoteCopyData()?.[detail.codeName] || null; data.value[detail.codeName] = controlService.getRemoteCopyData()?.[detail.codeName] || null;
break; break;
default: default:
data.value[detail.codeName] = DataTypes.isNumber(detail.dataType) ? Number(detail?.createDV) : detail?.createDV; data.value[detail.codeName] = DataTypes.isNumber(detail.dataType)
? Number(detail?.createDV)
: detail?.createDV;
break; break;
} }
} }
} }
}) });
} }
/** /**
...@@ -325,18 +338,28 @@ export class FormControl extends MainControl { ...@@ -325,18 +338,28 @@ export class FormControl extends MainControl {
data.value[detail.codeName] = controlService.getRemoteCopyData()?.[detail.codeName] || null; data.value[detail.codeName] = controlService.getRemoteCopyData()?.[detail.codeName] || null;
break; break;
default: default:
data.value[detail.codeName] = DataTypes.isNumber(detail.dataType) ? Number(detail.updateDV) : detail.updateDV; data.value[detail.codeName] = DataTypes.isNumber(detail.dataType)
? Number(detail.updateDV)
: detail.updateDV;
break; break;
} }
} }
} }
}) });
} }
/**
* 加载草稿行为
*
* @protected
* @param [opt={}]
*/
protected async loadDraft(opt: any = {}) {}
/** /**
* @description 使用加载草稿功能模块 * @description 使用加载草稿功能模块
* @param {FormControlProps} props 传入的props * @param {FormControlProps} props 传入的props
* @return {*} * @return {*}
* @memberof FormControl * @memberof FormControl
*/ */
public useLoadDraft() { public useLoadDraft() {
...@@ -371,6 +394,10 @@ export class FormControl extends MainControl { ...@@ -371,6 +394,10 @@ export class FormControl extends MainControl {
console.log(error); console.log(error);
} }
}; };
// 在类里绑定能力方法
this.loadDraft = loadDraft;
// 订阅viewSubject,监听load行为 // 订阅viewSubject,监听load行为
if (viewSubject) { if (viewSubject) {
let subscription = viewSubject.subscribe(({ tag, action, data }: IActionParam) => { let subscription = viewSubject.subscribe(({ tag, action, data }: IActionParam) => {
...@@ -378,14 +405,23 @@ export class FormControl extends MainControl { ...@@ -378,14 +405,23 @@ export class FormControl extends MainControl {
loadDraft(data); loadDraft(data);
} }
}); });
// 部件卸载时退订viewSubject // 部件卸载时退订viewSubject
onUnmounted(() => { onUnmounted(() => {
subscription.unsubscribe(); subscription.unsubscribe();
}); });
} }
return { loadDraft }; return loadDraft;
} }
/**
* 加载行为
*
* @protected
* @param [opt={}]
*/
protected async load(opt: any = {}) {}
/** /**
* @description 使用加载功能模块 * @description 使用加载功能模块
* @return {*} * @return {*}
...@@ -427,6 +463,9 @@ export class FormControl extends MainControl { ...@@ -427,6 +463,9 @@ export class FormControl extends MainControl {
} }
}; };
// 在类里绑定能力方法
this.load = load;
// 订阅viewSubject,监听load行为 // 订阅viewSubject,监听load行为
if (viewSubject) { if (viewSubject) {
let subscription = viewSubject.subscribe(({ tag, action, data }: IActionParam) => { let subscription = viewSubject.subscribe(({ tag, action, data }: IActionParam) => {
...@@ -441,11 +480,17 @@ export class FormControl extends MainControl { ...@@ -441,11 +480,17 @@ export class FormControl extends MainControl {
}); });
} }
return { return load;
load: load,
};
} }
/**
* 保存行为
*
* @protected
* @param [opt={}]
*/
protected async save(opt: any = {}) {}
/** /**
* @description 使用加载功能模块 * @description 使用加载功能模块
* @return {*} * @return {*}
...@@ -482,19 +527,14 @@ export class FormControl extends MainControl { ...@@ -482,19 +527,14 @@ export class FormControl extends MainControl {
Object.assign(arg, data.getDo()); Object.assign(arg, data.getDo());
Object.assign(arg, { viewParams: _viewParams }); Object.assign(arg, { viewParams: _viewParams });
// TODO 关系界面保存通知处理,做成异步。 // TODO 关系界面保存通知处理,做成异步。
// TODO 拷贝相关。 // TODO 拷贝相关。
// 发起请求处理与解析请求 // 发起请求处理与解析请求
const response = await controlService[saveFunName]( const response = await controlService[saveFunName](_context, arg, {
_context, action: saveAction,
arg, isLoading: showBusyIndicator,
{ });
action: saveAction,
isLoading: showBusyIndicator,
},
);
if (!response.status || response.status !== 200) { if (!response.status || response.status !== 200) {
// TODO 统一Error格式 // TODO 统一Error格式
return; return;
...@@ -510,6 +550,9 @@ export class FormControl extends MainControl { ...@@ -510,6 +550,9 @@ export class FormControl extends MainControl {
} }
}; };
// 在类里绑定能力方法
this.save = save;
// 订阅viewSubject,监听load行为 // 订阅viewSubject,监听load行为
if (viewSubject) { if (viewSubject) {
let subscription = viewSubject.subscribe(({ tag, action, data }: IActionParam) => { let subscription = viewSubject.subscribe(({ tag, action, data }: IActionParam) => {
...@@ -523,11 +566,17 @@ export class FormControl extends MainControl { ...@@ -523,11 +566,17 @@ export class FormControl extends MainControl {
}); });
} }
return { return save;
save: save,
};
} }
/**
* 删除行为
*
* @protected
* @param [opt={}]
*/
protected async remove(opt: any = {}) {}
/** /**
* @description 使用加载功能模块 * @description 使用加载功能模块
* @param {FormControlProps} props 传入的props * @param {FormControlProps} props 传入的props
...@@ -558,17 +607,13 @@ export class FormControl extends MainControl { ...@@ -558,17 +607,13 @@ export class FormControl extends MainControl {
let _context = deepCopy(context); let _context = deepCopy(context);
let _viewParams = deepCopy(viewParams); let _viewParams = deepCopy(viewParams);
const arg: any = opt[0]; const arg: any = opt[0];
Object.assign(arg, { viewParams: _viewParams },); Object.assign(arg, { viewParams: _viewParams });
// 发起请求处理与解析请求 // 发起请求处理与解析请求
const response = await controlService.remove( const response = await controlService.remove(_context, arg, {
_context, action: removeAction,
arg, isLoading: showBusyIndicator,
{ });
action: removeAction,
isLoading: showBusyIndicator
},
);
if (!response.status || response.status !== 200) { if (!response.status || response.status !== 200) {
return; return;
} }
...@@ -581,6 +626,9 @@ export class FormControl extends MainControl { ...@@ -581,6 +626,9 @@ export class FormControl extends MainControl {
} }
}; };
// 在类里绑定能力方法
this.remove = remove;
// 订阅viewSubject,监听load行为 // 订阅viewSubject,监听load行为
if (viewSubject) { if (viewSubject) {
let subscription = viewSubject.subscribe(({ tag, action, data }: IActionParam) => { let subscription = viewSubject.subscribe(({ tag, action, data }: IActionParam) => {
...@@ -595,9 +643,7 @@ export class FormControl extends MainControl { ...@@ -595,9 +643,7 @@ export class FormControl extends MainControl {
}); });
} }
return { return remove;
remove: remove,
};
} }
/** /**
...@@ -639,7 +685,7 @@ export class FormControl extends MainControl { ...@@ -639,7 +685,7 @@ export class FormControl extends MainControl {
* @memberof FormControl * @memberof FormControl
*/ */
public handleFormGroupAction(tag: string, data: any) { public handleFormGroupAction(tag: string, data: any) {
console.log(tag, data) console.log(tag, data);
} }
/** /**
......
...@@ -55,16 +55,16 @@ export class GridControl extends MDControl { ...@@ -55,16 +55,16 @@ export class GridControl extends MDControl {
if (!rowEditState) { if (!rowEditState) {
selectedRowKeys.value = [record.srfkey]; selectedRowKeys.value = [record.srfkey];
if (!record.children) { if (!record.children) {
this.emit("onCtrlEvent", { tag: controlName, action: "selectionChange", data: [deepCopy(record)] }) this.emit("ctrlEvent", { tag: this.props.name, action: "selectionChange", data: [deepCopy(record)] })
if (Object.is(rowActiveMode, 1)) { if (Object.is(rowActiveMode, 1)) {
this.emit("onCtrlEvent", { tag: controlName, action: "rowClick", data: [deepCopy(record)] }) this.emit("ctrlEvent", { tag: this.props.name, action: "rowClick", data: [deepCopy(record)] })
} }
} }
} }
}, },
onDblclick: () => { onDblclick: () => {
if (!record.children && Object.is(rowActiveMode, 2)) { if (!record.children && Object.is(rowActiveMode, 2)) {
this.emit("onCtrlEvent", { tag: controlName, action: "rowDbClick", data: [deepCopy(record)] }) this.emit("ctrlEvent", { tag: this.props.name, action: "rowDbClick", data: [deepCopy(record)] })
} }
} }
}; };
...@@ -86,7 +86,7 @@ export class GridControl extends MDControl { ...@@ -86,7 +86,7 @@ export class GridControl extends MDControl {
selection.push(select); selection.push(select);
} }
}) })
this.emit("onCtrlEvent", { tag: controlName, action: "selectionChange", data: selection }) this.emit("ctrlEvent", { tag: this.props.name, action: "selectionChange", data: selection })
}, },
}; };
}); });
...@@ -97,7 +97,7 @@ export class GridControl extends MDControl { ...@@ -97,7 +97,7 @@ export class GridControl extends MDControl {
// 处理表格变化(分页,过滤,排序) // 处理表格变化(分页,过滤,排序)
const onGridChange = (pagination: IParam, filters: IParam, sorter: IParam, data: IParam) => { const onGridChange = (pagination: IParam, filters: IParam, sorter: IParam, data: IParam) => {
if (pagination) { if (pagination) {
this.useLoad().load(); this.load();
} }
} }
return { return {
...@@ -116,7 +116,7 @@ export class GridControl extends MDControl { ...@@ -116,7 +116,7 @@ export class GridControl extends MDControl {
* @param {IActionParam} actionParam 行为参数 * @param {IActionParam} actionParam 行为参数
* @memberof GridControl * @memberof GridControl
*/ */
public onEditorEvent(rowIndex: number, actionParam: IActionParam) { public onEditorEvent(actionParam: IActionParam, rowIndex: number) {
const { tag, action, data } = actionParam; const { tag, action, data } = actionParam;
switch (action) { switch (action) {
case "valueChange": case "valueChange":
...@@ -131,6 +131,16 @@ export class GridControl extends MDControl { ...@@ -131,6 +131,16 @@ export class GridControl extends MDControl {
} }
} }
/**
* @description 操作列事件触发
* @param {IActionParam} action
* @param {IParam} record
* @memberof GridControl
*/
public onToolbarEvent(action: IActionParam, record: IParam) {
//todo 界面行为
}
/** /**
* @description 处理表格操作列事件 * @description 处理表格操作列事件
* @param {IActionParam} actionParam 行为参数 * @param {IActionParam} actionParam 行为参数
...@@ -179,8 +189,8 @@ export class GridControl extends MDControl { ...@@ -179,8 +189,8 @@ export class GridControl extends MDControl {
selectedRowKeys.value = _selectedRowKeys; selectedRowKeys.value = _selectedRowKeys;
} else if (isSelectDefault) { } else if (isSelectDefault) {
if (items && items.length > 0) { if (items && items.length > 0) {
this.emit("onCtrlEvent", { this.emit("ctrlEvent", {
tag: controlName, tag: this.props.name,
action: "selectionChange", action: "selectionChange",
data: [deepCopy(items[0])], data: [deepCopy(items[0])],
}); });
...@@ -433,6 +443,7 @@ export class GridControl extends MDControl { ...@@ -433,6 +443,7 @@ export class GridControl extends MDControl {
...superParams, ...superParams,
useCustom: this.useCustom(), useCustom: this.useCustom(),
onEditorEvent: this.onEditorEvent.bind(this), onEditorEvent: this.onEditorEvent.bind(this),
onToolbarEvent: this.onToolbarEvent.bind(this)
}; };
} }
} }
...@@ -9,4 +9,5 @@ export * from './pickup-view-panel-control' ...@@ -9,4 +9,5 @@ export * from './pickup-view-panel-control'
export * from './tree-exp-bar-control' export * from './tree-exp-bar-control'
export * from './tree-control' export * from './tree-control'
export * from './search-form-control' export * from './search-form-control'
export * from './quick-search-form-control' export * from './quick-search-form-control'
\ No newline at end of file export * from './searchbar-control'
...@@ -7,323 +7,367 @@ import { MDControlState, MainControl, deepCopy, IActionParam, IParam } from '@co ...@@ -7,323 +7,367 @@ import { MDControlState, MainControl, deepCopy, IActionParam, IParam } from '@co
* @extends {MainControl} * @extends {MainControl}
*/ */
export class MDControl extends MainControl { export class MDControl extends MainControl {
/**
* @description 多数据部件状态
* @type {MDControlState}
* @memberof MDControl
*/
public declare state: MDControlState;
/** /**
* @description 多数据部件状态 * @description
* @type {MDControlState} * @memberof MDControl
* @memberof MDControl */
*/ public setState() {
public declare state: MDControlState; super.setState();
// 交联输入Props
this.state.isMultiple = toRef(this.props, 'isMultiple') as any;
this.state.rowEditState = toRef(this.props, 'rowEditState') as any;
this.state.rowActiveMode = toRef(this.props, 'rowActiveMode') as any;
this.state.selectedData = toRef(this.props, 'selectedData') as any;
this.state.isSelectDefault = toRef(this.props, 'isSelectDefault') as any;
}
/** /**
* @description * 加载行为
* @memberof MDControl *
*/ * @protected
public setState() { * @param [opt={}]
super.setState(); */
// 交联输入Props protected async load(opt: any = {}) {}
this.state.isMultiple = toRef(this.props, "isMultiple") as any;
this.state.rowEditState = toRef(this.props, "rowEditState") as any; /**
this.state.rowActiveMode = toRef(this.props, "rowActiveMode") as any; * @description 使用加载功能模块
this.state.selectedData = toRef(this.props, "selectedData") as any; * @return {*}
this.state.isSelectDefault = toRef(this.props, "isSelectDefault") as any; * @memberof MDControl
} */
public useLoad() {
const { viewSubject, controlName } = this.state;
/** const load = async (opt: any = {}) => {
* @description 使用加载功能模块 try {
* @return {*} let { controlService, context, viewParams, showBusyIndicator, controlAction, mdCtrlSort, mdCtrlPaging } =
* @memberof MDControl this.state;
*/ if (!controlAction.fetchAction) {
public useLoad() { return;
const { viewSubject, controlName } = this.state;
const load = async (opt: any = {}) => {
try {
let {
controlService, context, viewParams, showBusyIndicator, controlAction, mdCtrlSort, mdCtrlPaging
} = this.state;
if (!controlAction.fetchAction) {
return;
}
// 组装查询参数
const arg: any = { ...opt };
let tempContext = deepCopy(context ? context : {});
let tempViewParams = deepCopy(viewParams ? viewParams : {});
const { noSort, minorSortDir, minorSortPSDEF } = mdCtrlSort;
let { enablePagingBar, current, pageSize } = mdCtrlPaging;
if (noSort && minorSortDir && minorSortPSDEF) {
Object.assign(tempViewParams, { sort: `${minorSortPSDEF},${minorSortDir}` });
}
if (enablePagingBar) {
Object.assign(tempViewParams, { page: current - 1, size: pageSize });
}
Object.assign(arg, tempViewParams);
// 组装视图其他查询参数
this.emit('ctrlevent', { tag: controlName.toLowerCase(), action: 'beforeload', data: arg });
const response = await controlService.search(
tempContext,
arg,
{ action: controlAction.fetchAction, isLoading: showBusyIndicator }
);
if (response.status || response.status == 200) {
this.state.items = response.data;
this.emit('ctrlevent', { tag: controlName.toLowerCase(), action: 'load', data: response.data });
if (enablePagingBar) {
this.state.mdCtrlPaging.pagination['total'] = response.total;
}
this.handleStateChange();
}
} catch (error) {
// todo 错误异常处理
console.log(error);
}
} }
// 订阅viewSubject,监听load行为
if (viewSubject) { // 组装查询参数
let subscription = viewSubject.subscribe(({ tag, action, data }: IActionParam) => { const arg: any = { ...opt };
if (Object.is(controlName, tag) && Object.is("load", action)) { let tempContext = deepCopy(context ? context : {});
load(data); let tempViewParams = deepCopy(viewParams ? viewParams : {});
} const { noSort, minorSortDir, minorSortPSDEF } = mdCtrlSort;
}) let { enablePagingBar, current, pageSize } = mdCtrlPaging;
// 部件卸载时退订viewSubject if (!noSort && minorSortDir && minorSortPSDEF) {
onUnmounted(() => { Object.assign(tempViewParams, { sort: `${minorSortPSDEF},${minorSortDir}` });
subscription.unsubscribe();
})
} }
return { load }; if (enablePagingBar) {
} Object.assign(tempViewParams, { page: current - 1, size: pageSize });
}
Object.assign(arg, tempViewParams);
/** // 组装视图其他查询参数
* @description 使用保存功能模块 this.emit("ctrlEvent", { tag: this.props.name, action: 'beforeload', data: arg });
* @return {*} const response = await controlService.search(tempContext, arg, {
* @memberof MDControl action: controlAction.fetchAction,
*/ isLoading: showBusyIndicator,
public useSave() { });
const { viewSubject, controlName } = this.state; if (response.status || response.status == 200) {
const save = async (opt: any = {}) => { this.state.items = response.data;
try { this.emit("ctrlEvent", { tag: this.props.name, action: 'load', data: response.data });
const { controlService, context, viewParams, showBusyIndicator, items, controlAction } = this.state; if (enablePagingBar) {
// TODO 值规则校验处理 this.state.mdCtrlPaging.pagination['total'] = response.total;
for (const item of items) { }
const { updateAction, createAction } = controlAction; this.handleStateChange();
const saveAction: any = item.rowDataState == "update" ? updateAction : item.rowDataState == "create" ? createAction : ""; }
if (!saveAction) { } catch (error) {
return; // todo 错误异常处理
} console.log(error);
const arg: any = { ...opt }; }
let _context = deepCopy(context); };
let _viewParams = deepCopy(viewParams);
Object.assign(arg, item.getDo());
Object.assign(arg, { viewParams: _viewParams });
const response = await controlService[saveAction](
_context,
arg,
{ action: saveAction, isLoading: showBusyIndicator },
);
if (response.status || response.status == 200) {
} // 在类里绑定能力方法
} this.load = load;
} catch (error) {
// TODO 错误异常处理 // 订阅viewSubject,监听load行为
console.log(error); if (viewSubject) {
} let subscription = viewSubject.subscribe(({ tag, action, data }: IActionParam) => {
}; if (Object.is(controlName, tag) && Object.is('load', action)) {
// 订阅viewSubject,监听load行为 load(data);
if (viewSubject) {
let subscription = viewSubject.subscribe(({ tag, action, data }: IActionParam) => {
if (Object.is(controlName, tag) && Object.is("save", action)) {
save(data);
}
});
// 部件卸载时退订viewSubject
onUnmounted(() => {
subscription.unsubscribe();
});
} }
return { save }; });
// 部件卸载时退订viewSubject
onUnmounted(() => {
subscription.unsubscribe();
});
} }
return load;
}
/** /**
* @description 使用删除功能模块 * 保存行为
* @return {*} *
* @memberof MDControl * @protected
*/ * @param [opt={}]
public useRemove() { */
const { viewSubject, controlName } = this.state; protected async save(opt: any = {}) {}
const remove = async (opt: IParam[] = []) => {
try {
const { controlService, context, viewParams, showBusyIndicator, controlAction, appDeCodeName } = this.state;
const { items } = toRefs(this.state);
if (!controlAction.removeAction) {
return;
}
const _data: IParam[] = [];
opt.forEach((item: IParam, index: number) => {
if (Object.is(item.srfuf, "0")) {
items.value.some((val: any, num: number) => {
if (JSON.stringify(val) == JSON.stringify(item)) {
items.value.splice(num, 1);
return true;
}
});
} else {
_data.push(opt[index]);
}
});
if (_data.length > 0) {
const keys: string[] = [];
_data.forEach((item: IParam) => {
keys.push(item.srfkey);
});
const _removeAction = keys.length > 1 ? "removeBatch" : controlAction.removeAction;
let _context = deepCopy(context);
Object.assign(_context, { [appDeCodeName]: keys });
let _viewParams = deepCopy(viewParams);
const arg: IParam = {
[appDeCodeName]: keys,
};
Object.assign(arg, { viewParams: _viewParams });
const response = await controlService.remove(
_context,
arg,
{ action: _removeAction, isLoading: showBusyIndicator },
);
if (response.status || response.status == 200) {
} /**
} * @description 使用保存功能模块
} catch (error) { * @return {*}
// TODO 错误异常处理 * @memberof MDControl
console.log(error); */
} public useSave() {
}; const { viewSubject, controlName } = this.state;
// 订阅viewSubject,监听load行为 const save = async (opt: any = {}) => {
if (viewSubject) { try {
let subscription = viewSubject.subscribe(({ tag, action, data }: IActionParam) => { const { controlService, context, viewParams, showBusyIndicator, items, controlAction } = this.state;
if (Object.is(controlName, tag) && Object.is("remove", action)) { // TODO 值规则校验处理
remove(data); for (const item of items) {
} const { updateAction, createAction } = controlAction;
}); const saveAction: any =
// 部件卸载时退订viewSubject item.rowDataState == 'update' ? updateAction : item.rowDataState == 'create' ? createAction : '';
onUnmounted(() => { if (!saveAction) {
subscription.unsubscribe(); return;
}); }
const arg: any = { ...opt };
let _context = deepCopy(context);
let _viewParams = deepCopy(viewParams);
Object.assign(arg, item.getDo());
Object.assign(arg, { viewParams: _viewParams });
const response = await controlService[saveAction](_context, arg, {
action: saveAction,
isLoading: showBusyIndicator,
});
if (response.status || response.status == 200) {
}
}
} catch (error) {
// TODO 错误异常处理
console.log(error);
}
};
// 在类里绑定能力方法
this.save = save;
// 订阅viewSubject,监听load行为
if (viewSubject) {
let subscription = viewSubject.subscribe(({ tag, action, data }: IActionParam) => {
if (Object.is(controlName, tag) && Object.is('save', action)) {
save(data);
} }
return { remove }; });
// 部件卸载时退订viewSubject
onUnmounted(() => {
subscription.unsubscribe();
});
} }
return save;
}
/** /**
* @description 使用新建功能模块 * 删除行为
* @return {*} *
* @memberof MDControl * @protected
*/ * @param [opt={}]
public useNewRow() { */
const { viewSubject, controlName } = this.state; protected async remove(opt: any = {}) {}
const newRow = async (opt: any = {}) => {
try {
const { controlService, context, viewParams, showBusyIndicator, controlAction } = this.state;
const { items } = toRefs(this.state);
if (!controlAction.loadDraftAction) {
return;
}
let _context = deepCopy(context);
let _viewParams = deepCopy(viewParams);
const arg: any = { ...opt };
Object.assign(arg, { viewParams: _viewParams });
const response = await controlService.loadDraft(
_context,
arg,
{ action: controlAction.loadDraftAction, isLoading: showBusyIndicator },
);
if (response.status || response.status == 200) {
items.value = [...items.value, [response.data]];
}
} catch (error) {
// TODO 错误异常处理
console.log(error);
}
};
// 订阅viewSubject,监听load行为 /**
if (viewSubject) { * @description 使用删除功能模块
let subscription = viewSubject.subscribe(({ tag, action, data }: IActionParam) => { * @return {*}
if (Object.is(controlName, tag) && Object.is("newRow", action)) { * @memberof MDControl
newRow(data); */
} public useRemove() {
}); const { viewSubject, controlName } = this.state;
// 部件卸载时退订viewSubject const remove = async (opt: IParam[] = []) => {
onUnmounted(() => { try {
subscription.unsubscribe(); const { controlService, context, viewParams, showBusyIndicator, controlAction, appDeCodeName } = this.state;
const { items } = toRefs(this.state);
if (!controlAction.removeAction) {
return;
}
const _data: IParam[] = [];
opt.forEach((item: IParam, index: number) => {
if (Object.is(item.srfuf, '0')) {
items.value.some((val: any, num: number) => {
if (JSON.stringify(val) == JSON.stringify(item)) {
items.value.splice(num, 1);
return true;
}
}); });
} else {
_data.push(opt[index]);
}
});
if (_data.length > 0) {
const keys: string[] = [];
_data.forEach((item: IParam) => {
keys.push(item.srfkey);
});
const _removeAction = keys.length > 1 ? 'removeBatch' : controlAction.removeAction;
let _context = deepCopy(context);
Object.assign(_context, { [appDeCodeName]: keys });
let _viewParams = deepCopy(viewParams);
const arg: IParam = {
[appDeCodeName]: keys,
};
Object.assign(arg, { viewParams: _viewParams });
const response = await controlService.remove(_context, arg, {
action: _removeAction,
isLoading: showBusyIndicator,
});
if (response.status || response.status == 200) {
}
} }
} catch (error) {
// TODO 错误异常处理
console.log(error);
}
};
// 在类里绑定能力方法
this.remove = remove;
return { // 订阅viewSubject,监听load行为
newRow, if (viewSubject) {
}; let subscription = viewSubject.subscribe(({ tag, action, data }: IActionParam) => {
if (Object.is(controlName, tag) && Object.is('remove', action)) {
remove(data);
}
});
// 部件卸载时退订viewSubject
onUnmounted(() => {
subscription.unsubscribe();
});
} }
return remove;
}
/**
* 新建行行为(新增一条数据)
*
* @protected
* @param [opt={}]
*/
protected async newRow(opt: any = {}) {}
/** /**
* 处理数据状态变化(逻辑数据+UI) * @description 使用新建功能模块
* * @return {*}
* @memberof MDControl * @memberof MDControl
*/ */
public handleStateChange() { } public useNewRow() {
const { viewSubject, controlName } = this.state;
const newRow = async (opt: any = {}) => {
try {
const { controlService, context, viewParams, showBusyIndicator, controlAction } = this.state;
const { items } = toRefs(this.state);
if (!controlAction.loadDraftAction) {
return;
}
let _context = deepCopy(context);
let _viewParams = deepCopy(viewParams);
const arg: any = { ...opt };
Object.assign(arg, { viewParams: _viewParams });
const response = await controlService.loadDraft(_context, arg, {
action: controlAction.loadDraftAction,
isLoading: showBusyIndicator,
});
if (response.status || response.status == 200) {
items.value = [...items.value, [response.data]];
}
} catch (error) {
// TODO 错误异常处理
console.log(error);
}
};
/** // 在类里绑定能力方法
* 处理数据分组 this.newRow = newRow;
*
* @memberof MDControl // 订阅viewSubject,监听load行为
*/ if (viewSubject) {
public handleDataGroup() { let subscription = viewSubject.subscribe(({ tag, action, data }: IActionParam) => {
const { enableGroup, groupField, groupMode } = this.state.mdCtrlGroup; if (Object.is(controlName, tag) && Object.is('newRow', action)) {
if (enableGroup && groupField && !Object.is(groupMode, "NONE")) { newRow(data);
if (Object.is(groupMode, "AUTO")) {
this.autoGroupData();
} else if (Object.is(groupMode, "CODELIST")) {
this.codeListGroupData();
}
} }
});
// 部件卸载时退订viewSubject
onUnmounted(() => {
subscription.unsubscribe();
});
} }
/** return newRow;
* 自动分组 }
*
* @protected
* @memberof MDControl
*/
protected autoGroupData() { }
/** /**
* 代码表分组 * 处理数据状态变化(逻辑数据+UI)
* *
* @protected * @memberof MDControl
* @memberof MDControl */
*/ public handleStateChange() {}
protected codeListGroupData() { }
/** /**
* 获取当前激活数据 * 处理数据分组
* *
* @memberof MDControl * @memberof MDControl
*/ */
public getData(): IParam[] { public handleDataGroup() {
const { selectedData } = this.state; const { enableGroup, groupField, groupMode } = this.state.mdCtrlGroup;
return selectedData; if (enableGroup && groupField && !Object.is(groupMode, 'NONE')) {
if (Object.is(groupMode, 'AUTO')) {
this.autoGroupData();
} else if (Object.is(groupMode, 'CODELIST')) {
this.codeListGroupData();
}
} }
}
/** /**
* @description 安装部件所有功能模块的方法 * 自动分组
* @return {*} *
* @memberof MDControl * @protected
*/ * @memberof MDControl
public moduleInstall() { */
const superParams = super.moduleInstall(); protected autoGroupData() {}
return {
...superParams, /**
load: this.useLoad(), * 代码表分组
save: this.useSave(), *
romove: this.useRemove(), * @protected
new: this.useNewRow() * @memberof MDControl
}; */
} protected codeListGroupData() {}
/**
* 获取当前激活数据
*
* @memberof MDControl
*/
public getData(): IParam[] {
const { selectedData } = this.state;
return selectedData;
}
/**
* @description 安装部件所有功能模块的方法
* @return {*}
* @memberof MDControl
*/
public moduleInstall() {
const superParams = super.moduleInstall();
return {
...superParams,
load: this.useLoad(),
save: this.useSave(),
remove: this.useRemove(),
newRow: this.useNewRow(),
};
}
} }
...@@ -49,7 +49,7 @@ export class PickupViewPanelControl extends MainControl { ...@@ -49,7 +49,7 @@ export class PickupViewPanelControl extends MainControl {
const { tag, action, data } = actionParam; const { tag, action, data } = actionParam;
const { controlName } = this.state; const { controlName } = this.state;
if (Object.is("selectionChange", action)) { if (Object.is("selectionChange", action)) {
this.emit('ctrlEvent', { tag: controlName, action: action, data: data }); this.emit("ctrlEvent", { tag: this.props.name, action: action, data: data });
} }
} }
......
...@@ -21,8 +21,8 @@ export class QuickSearchFormControl extends FormControl { ...@@ -21,8 +21,8 @@ export class QuickSearchFormControl extends FormControl {
*/ */
public onEditorEvent(actionParam: IActionParam) { public onEditorEvent(actionParam: IActionParam) {
super.onEditorEvent(actionParam); super.onEditorEvent(actionParam);
this.emit("onCtrlEvent", { this.emit("ctrlEvent", {
tag: this.state.controlName, tag: this.props.name,
action: "selectionChange", action: "selectionChange",
data: this.state.data, data: this.state.data,
}); });
......
...@@ -19,9 +19,8 @@ export class SearchFormControl extends FormControl { ...@@ -19,9 +19,8 @@ export class SearchFormControl extends FormControl {
* @memberof SearchFormControl * @memberof SearchFormControl
*/ */
public onSearch() { public onSearch() {
const { controlName } = this.state; this.emit("ctrlEvent", {
this.emit("onCtrlEvent", { tag: this.props.name,
tag: controlName,
action: "selectionChange", action: "selectionChange",
data: this.state.data, data: this.state.data,
}); });
...@@ -75,7 +74,6 @@ export class SearchFormControl extends FormControl { ...@@ -75,7 +74,6 @@ export class SearchFormControl extends FormControl {
public moduleInstall() { public moduleInstall() {
const superParams = super.moduleInstall(); const superParams = super.moduleInstall();
// 表单行为能力启用 // 表单行为能力启用
const { loadDraft } = this.useLoadDraft();
return { return {
...superParams, ...superParams,
onSearch: this.onSearch.bind(this), onSearch: this.onSearch.bind(this),
......
export * from './searchbar-control-prop'
export * from './searchbar-control-state'
export * from './searchbar-control'
\ No newline at end of file
import { IParam, MainControlProps } from "@core";
/**
* @description 搜索栏部件的props
* @export
* @interface SearchBarControlProps
* @extends {MainControlProps}
*/
export interface SearchBarControlProps extends MainControlProps {
}
\ No newline at end of file
import { IParam, MainControlState } from '@core';
/**
* @description 搜索栏部件状态
* @export
* @interface SearchBarControlState
* @extends {MainControlState}
*/
export interface SearchBarControlState extends MainControlState {
}
\ No newline at end of file
import { UIUtil, deepCopy, IActionParam, IParam, MainControl, SearchBarControlState, SearchBarControlProps } from '@core';
/**
* @description 搜索栏部件
* @export
* @class SearchBarControl
* @extends {MainControl}
*/
export class SearchBarControl extends MainControl {
/**
* @description 部件状态
* @type {SearchBarControlState}
* @memberof SearchBarControl
*/
public declare state: SearchBarControlState;
/**
* @description
* @param {SearchBarControlProps} props
* @memberof SearchBarControl
*/
public setState(props: SearchBarControlState) {
super.setState(props);
this.state.filterFields = Object.values(this.state.detailsModel);
this.state.filterItems = [];
}
/**
* @description 安装部件所有功能模块的方法
* @param {SearchBarControlProps} props
* @param {Function} [emit]
* @return {*}
* @memberof SearchBarControl [emit] 事件
*/
public moduleInstall(props: SearchBarControlProps, emit?: Function) {
const superParams = super.moduleInstall(props, emit);
return {
...superParams,
state: this.state,
};
}
}
\ No newline at end of file
import { toRef } from "vue";
import { deepCopy, deepObjectMerge, IActionParam, MainControl } from "@core"; import { deepCopy, deepObjectMerge, IActionParam, MainControl } from "@core";
import { TreeControlProps } from "./tree-control-prop"; import { TreeControlProps } from "./tree-control-prop";
import { TreeControlState } from "./tree-control-state"; import { TreeControlState } from "./tree-control-state";
...@@ -46,7 +45,7 @@ export class TreeControl extends MainControl { ...@@ -46,7 +45,7 @@ export class TreeControl extends MainControl {
currentselectedNode.value = e.node; currentselectedNode.value = e.node;
if (!multiple) { if (!multiple) {
selectedNodes.push(currentselectedNode.value); selectedNodes.push(currentselectedNode.value);
this.emit("ctrlEvent", { tag: controlName, action: 'selectionchange', data: deepCopy(selectedNodes) }); this.emit("ctrlEvent", { tag: this.props.name, action: 'selectionchange', data: deepCopy(selectedNodes) });
} }
} }
} }
...@@ -126,7 +125,7 @@ export class TreeControl extends MainControl { ...@@ -126,7 +125,7 @@ export class TreeControl extends MainControl {
const isSelectedAll = node.checked; const isSelectedAll = node.checked;
// TODO 默认选中 // TODO 默认选中
// this.setDefaultSelection(items, isRoot, isSelectedAll); // this.setDefaultSelection(items, isRoot, isSelectedAll);
this.emit("ctrlEvent", { tag: controlName, action: "load", data: items }); this.emit("ctrlEvent", { tag: this.props.name, action: "load", data: items });
} catch (error) { } catch (error) {
console.error(error); console.error(error);
} }
...@@ -143,9 +142,7 @@ export class TreeControl extends MainControl { ...@@ -143,9 +142,7 @@ export class TreeControl extends MainControl {
subscription.unsubscribe(); subscription.unsubscribe();
}) })
} }
return { return load;
load
};
} }
/** /**
...@@ -155,11 +152,10 @@ export class TreeControl extends MainControl { ...@@ -155,11 +152,10 @@ export class TreeControl extends MainControl {
*/ */
public moduleInstall() { public moduleInstall() {
const superParams = super.moduleInstall(); const superParams = super.moduleInstall();
const { load } = this.useLoad();
return { return {
...superParams, ...superParams,
treeNodeSelect: this.treeNodeSelect.bind(this), treeNodeSelect: this.treeNodeSelect.bind(this),
load load: this.useLoad(),
}; };
} }
} }
\ No newline at end of file
export * from './navdata-service';
export * from './navdata-param';
\ No newline at end of file
import { IParam } from '@core';
export interface INavDataParam {
/**
* @description 视图标题
* @type {*}
* @memberof INavDataParam
*/
title: string;
/**
* @description 视图数据
* @type {*}
* @memberof INavDataParam
*/
data: IParam;
/**
* @description 视图路径
* @type {string}
* @memberof INavDataParam
*/
path: string;
/**
* @description 视图打开模式("ROUTE" | "MODAL" | "EMBED")
* @type {("ROUTE" | "MODAL" | "EMBED")}
* @memberof INavDataParam
*/
openType: "ROUTE" | "MODAL" | "EMBED";
/**
* @description 视图类型
* @type {string}
* @memberof INavDataParam
*/
viewType: string;
/**
* @description 视图标识
* @type {string}
* @memberof INavDataParam
*/
tag: string;
/**
* @description 数据标识
* @type {*}
* @memberof INavDataParam
*/
key: string;
}
import { IActionParam, INavDataService } from '@core';
import { Subject } from 'rxjs';
import { INavDataParam } from './navdata-param';
/**
* 导航数据服务
*
* @export
* @class CodeListService
*/
export class NavDataService implements INavDataService {
/**
* 单例变量声明
*
* @private
* @static
* @type {NavDataService}
* @memberof NavDataService
*/
private static navDataService: NavDataService;
/**
* 服务状态
*
* @memberof NavDataService
*/
public serviceState: Subject<IActionParam> = new Subject();
/**
* 导航数据栈
*
* @memberof NavDataService
*/
public navDataStack: Array<INavDataParam> = [];
/**
* 初始化实例
*
* @memberof NavDataService
*/
constructor(opts: any = {}) { }
/**
* 获取 NavDataService 单例对象
*
* @static
* @returns {NavDataService}
* @memberof NavDataService
*/
public static getInstance(): NavDataService {
if (!NavDataService.navDataService) {
NavDataService.navDataService = new NavDataService();
}
return this.navDataService;
}
/**
* 添加基础导航数据到栈中
*
* @memberof NavDataService
*/
public addNavData(curNavData: INavDataParam) {
this.navDataStack.push(curNavData);
}
/**
* 设置指定数据到基础导航数据栈中
*
* @memberof NavDataService
*/
public setNavDataByTag(tag: string, isSingleMode: boolean, data: any) {
if (this.navDataStack.length > 0) {
let tempIndex: number = this.navDataStack.findIndex((element: INavDataParam) => {
return Object.is(element.tag, tag);
})
if(this.navDataStack[tempIndex]){
this.navDataStack[tempIndex].data = data;
if (isSingleMode && data.srfkey && data.srfmajortext) {
this.navDataStack[tempIndex].key = data.srfkey;
this.navDataStack[tempIndex].title = data.srfmajortext;
}
return this.navDataStack[tempIndex];
}else{
return null;
}
} else {
return null;
}
}
/**
* 获取基础导航数据
*
* @memberof NavDataService
*/
public getNavData() {
return this.navDataStack;
}
/**
* 从导航数据栈中获取指定数据的前一条数据
*
* @memberof NavDataService
*/
public getPreNavData(tag: string) {
if (this.navDataStack.length > 0) {
let tempIndex: number = this.navDataStack.findIndex((element: INavDataParam) => {
return Object.is(element.tag, tag);
})
return this.navDataStack[tempIndex - 1];
} else {
return null;
}
}
/**
* 跳转到导航数据栈中指定数据
*
* @memberof NavDataService
*/
public skipNavData(tag: string) {
if ((this.navDataStack.length > 0) && tag) {
let tempIndex: number = this.navDataStack.findIndex((element: INavDataParam) => {
return Object.is(element.tag, tag);
})
if (tempIndex !== -1) {
this.navDataStack = this.navDataStack.slice(0, tempIndex + 1);
}
}
}
/**
* 从导航数据栈中指定数据
*
* @memberof NavDataService
*/
public removeNavData(tag: string) {
if ((this.navDataStack.length > 0) && tag) {
let tempIndex: number = this.navDataStack.findIndex((element: INavDataParam) => {
return Object.is(element.tag, tag);
})
if (tempIndex !== -1) {
this.navDataStack = this.navDataStack.slice(0, tempIndex);
}
}
}
/**
* 从导航数据栈中删除仅剩第一条数据
*
* @memberof NavDataService
*/
public removeNavDataFirst() {
if (this.navDataStack.length > 0) {
this.navDataStack = this.navDataStack.slice(0, 1);
}
}
/**
* 从导航数据栈中删除最后一条数据
*
* @memberof NavDataService
*/
public removeNavDataLast() {
if (this.navDataStack.length > 0) {
this.navDataStack.pop();
}
}
/**
* 从导航数据栈中删除所有数据
*
* @memberof NavDataService
*/
public removeAllNavData() {
this.navDataStack = [];
}
}
\ No newline at end of file
export * from './control-service' export * from './control-service'
export * from './entity-service' export * from './entity-service'
export * from './ui-service' export * from './ui-service'
\ No newline at end of file export * from './common-service'
\ No newline at end of file
export class UIActionUtil { export class UIActionUtil {
/** /**
* 格式化数据 * 格式化数据
* *
...@@ -17,11 +17,14 @@ export class UIActionUtil { ...@@ -17,11 +17,14 @@ export class UIActionUtil {
public static formatDataActionData(actionTarget: any, args: any, parentContext: any, parentParams: any, _params: any): any { public static formatDataActionData(actionTarget: any, args: any, parentContext: any, parentParams: any, _params: any): any {
const _data: any = {}; const _data: any = {};
if ( if (
Object.is(actionTarget, 'SINGLEKEY') || Object.is(actionTarget, 'SINGLEKEY') ||
Object.is(actionTarget, 'NONE') || Object.is(actionTarget, 'NONE') ||
Object.is(actionTarget, 'SINGLEDATA') Object.is(actionTarget, 'SINGLEDATA')
) { ) {
const [arg] = args; let arg:any = {};
if(args){
[arg] = args;
}
Object.keys(_params).forEach((name: string) => { Object.keys(_params).forEach((name: string) => {
let hasProperty = true; let hasProperty = true;
if (!name) { if (!name) {
...@@ -31,11 +34,11 @@ export class UIActionUtil { ...@@ -31,11 +34,11 @@ export class UIActionUtil {
if (value && typeof value === 'string' && value.startsWith('%') && value.endsWith('%')) { if (value && typeof value === 'string' && value.startsWith('%') && value.endsWith('%')) {
const key = value.substring(1, value.length - 1); const key = value.substring(1, value.length - 1);
if ( if (
arg && arg &&
arg.hasOwnProperty(key) && arg.hasOwnProperty(key) &&
(Object.is(actionTarget, 'SINGLEKEY') || (Object.is(actionTarget, 'SINGLEKEY') ||
Object.is(actionTarget, 'SINGLEDATA') || Object.is(actionTarget, 'SINGLEDATA') ||
Object.is(actionTarget, 'NONE')) Object.is(actionTarget, 'NONE'))
) { ) {
value = arg[key] !== null && arg[key] !== undefined ? arg[key] : null; value = arg[key] !== null && arg[key] !== undefined ? arg[key] : null;
} else if (parentContext && parentContext.hasOwnProperty(key)) { } else if (parentContext && parentContext.hasOwnProperty(key)) {
......
...@@ -31,13 +31,15 @@ export class {{pascalCase appEntity.codeName}}UIServiceBase extends UIServiceBas ...@@ -31,13 +31,15 @@ export class {{pascalCase appEntity.codeName}}UIServiceBase extends UIServiceBas
uIActionTag:'{{upperCase appDEUIAction.uIActionTag}}', uIActionTag:'{{upperCase appDEUIAction.uIActionTag}}',
frontPSAppView:'{{appDEUIAction.frontPSAppView}}', frontPSAppView:'{{appDEUIAction.frontPSAppView}}',
caption:'{{appDEUIAction.caption}}', caption:'{{appDEUIAction.caption}}',
entityCodeName:'{{appDEUIAction.entityCodeName}}', entityCodeName:'{{appEntity.codeName}}',
methodCodeName:'{{appDEUIAction.methodCodeName}}', methodCodeName:'{{appDEUIAction.methodCodeName}}',
frontProcessType:'{{appDEUIAction.frontProcessType}}', frontProcessType:'{{appDEUIAction.frontProcessType}}',
refreshMode:'{{appDEUIAction.refreshMode}}', refreshMode:'{{appDEUIAction.refreshMode}}',
htmlPageUrl:'{{appDEUIAction.htmlPageUrl}}', htmlPageUrl:'{{appDEUIAction.htmlPageUrl}}',
uILogicAttachMode:'{{appDEUIAction.uILogicAttachMode}}', uILogicAttachMode:'{{appDEUIAction.uILogicAttachMode}}',
nextActionCodeName:'{{appDEUIAction.nextActionCodeName}}', nextActionCodeName:'{{appDEUIAction.nextActionCodeName}}',
navContexts:{{appDEUIAction.navContexts}},
navParams:{{appDEUIAction.navParams}}
}, },
{{/each}} {{/each}}
}; };
...@@ -49,7 +51,7 @@ export class {{pascalCase appEntity.codeName}}UIServiceBase extends UIServiceBas ...@@ -49,7 +51,7 @@ export class {{pascalCase appEntity.codeName}}UIServiceBase extends UIServiceBas
* @param {*} params * @param {*} params
* @memberof {{pascalCase appEntity.codeName}}UIServiceBase * @memberof {{pascalCase appEntity.codeName}}UIServiceBase
*/ */
public async {{appDEUIAction.codeName}}(params:any){ public async {{appDEUIAction.codeName}}(uiAction:any, params:any){
const actionModel = this.getUIActionModel('{{appDEUIAction.codeName}}'); const actionModel = this.getUIActionModel('{{appDEUIAction.codeName}}');
{{#eq appDEUIAction.UIActionMode 'FRONT'}} {{#eq appDEUIAction.UIActionMode 'FRONT'}}
AppFrontAction.doAction(actionModel, params); AppFrontAction.doAction(actionModel, params);
......
...@@ -196,14 +196,13 @@ const handleShowState = ($event: any) => { ...@@ -196,14 +196,13 @@ const handleShowState = ($event: any) => {
:maskClosable="true" :maskClosable="true"
:destroyOnClose="true" :destroyOnClose="true"
:width="width" :width="width"
:height="height"
:bodyStyle="style" :bodyStyle="style"
@cancel="onVisibleChange($event)" @cancel="onVisibleChange($event)"
> >
<component <component
:is="viewName" :is="viewName"
class="app-modal-view-component" class="app-modal-view-component"
:width="width"
:height="height"
:context="context" :context="context"
:viewParams="viewParams" :viewParams="viewParams"
:viewDefaultUsage="false" :viewDefaultUsage="false"
......
...@@ -39,7 +39,7 @@ const collapsedChange = () => { ...@@ -39,7 +39,7 @@ const collapsedChange = () => {
</script> </script>
<template> <template>
<AppDefaultIndexViewLayout class="app-index-view" :menuAlign="state.menuAlign" :collapsed="collapsed"> <AppDefaultIndexViewLayout :class="['app-index-view', state.viewSysCss]" :menuAlign="state.menuAlign" :collapsed="collapsed">
<template #caption> <template #caption>
<div class="index-view-header"> <div class="index-view-header">
\{{state.viewCaption}} \{{state.viewCaption}}
......
...@@ -13,6 +13,9 @@ import { {{codeName}}SearchForm } from '@widgets/{{spinalCase appEntity.codeName ...@@ -13,6 +13,9 @@ import { {{codeName}}SearchForm } from '@widgets/{{spinalCase appEntity.codeName
{{#if (and (eq controlType "SEARCHFORM") (eq name 'quicksearchform'))}} {{#if (and (eq controlType "SEARCHFORM") (eq name 'quicksearchform'))}}
import { {{codeName}}QuickSearchForm } from '@widgets/{{spinalCase appEntity.codeName}}/{{spinalCase codeName}}-quick-search-form'; import { {{codeName}}QuickSearchForm } from '@widgets/{{spinalCase appEntity.codeName}}/{{spinalCase codeName}}-quick-search-form';
{{/if}} {{/if}}
{{#eq controlType "SEARCHBAR"}}
import { {{codeName}}SearchBar } from '@widgets/{{spinalCase appEntity.codeName}}/{{spinalCase codeName}}-searchBar';
{{/eq}}
{{/page.ctrls}} {{/page.ctrls}}
// props声明和默认值处理 // props声明和默认值处理
...@@ -41,7 +44,7 @@ const { state, grid, onCtrlEvent, onToolbarEvent, onQuickGroupEvent } = new Grid ...@@ -41,7 +44,7 @@ const { state, grid, onCtrlEvent, onToolbarEvent, onQuickGroupEvent } = new Grid
</script> </script>
<template> <template>
<AppGridViewLayout class="app-grid-view"> <AppGridViewLayout :class="['app-grid-view', state.viewSysCss]">
<template v-slot:caption> <template v-slot:caption>
<AppIconText class="app-view__caption" size="large" :text="state.viewCaption" /> <AppIconText class="app-view__caption" size="large" :text="state.viewCaption" />
</template> </template>
...@@ -72,7 +75,7 @@ const { state, grid, onCtrlEvent, onToolbarEvent, onQuickGroupEvent } = new Grid ...@@ -72,7 +75,7 @@ const { state, grid, onCtrlEvent, onToolbarEvent, onQuickGroupEvent } = new Grid
:viewParams="state.viewParams" :viewParams="state.viewParams"
:controlAction="state.{{camelCase name}}.action" :controlAction="state.{{camelCase name}}.action"
:viewSubject="state.viewSubject" :viewSubject="state.viewSubject"
@onCtrlEvent="onCtrlEvent" @ctrlEvent="onCtrlEvent"
></{{codeName}}SearchForm> ></{{codeName}}SearchForm>
</template> </template>
<a-button><filter-outlined /></a-button> <a-button><filter-outlined /></a-button>
...@@ -86,7 +89,7 @@ const { state, grid, onCtrlEvent, onToolbarEvent, onQuickGroupEvent } = new Grid ...@@ -86,7 +89,7 @@ const { state, grid, onCtrlEvent, onToolbarEvent, onQuickGroupEvent } = new Grid
:viewParams="state.viewParams" :viewParams="state.viewParams"
:controlAction="state.{{camelCase name}}.action" :controlAction="state.{{camelCase name}}.action"
:viewSubject="state.viewSubject" :viewSubject="state.viewSubject"
@onCtrlEvent="onCtrlEvent" @ctrlEvent="onCtrlEvent"
></{{codeName}}SearchForm> ></{{codeName}}SearchForm>
</template> </template>
{{/if}} {{/if}}
...@@ -98,10 +101,17 @@ const { state, grid, onCtrlEvent, onToolbarEvent, onQuickGroupEvent } = new Grid ...@@ -98,10 +101,17 @@ const { state, grid, onCtrlEvent, onToolbarEvent, onQuickGroupEvent } = new Grid
:viewParams="state.viewParams" :viewParams="state.viewParams"
:controlAction="state.{{camelCase name}}.action" :controlAction="state.{{camelCase name}}.action"
:viewSubject="state.viewSubject" :viewSubject="state.viewSubject"
@onCtrlEvent="onCtrlEvent" @ctrlEvent="onCtrlEvent"
></{{codeName}}QuickSearchForm> ></{{codeName}}QuickSearchForm>
</template> </template>
{{/if}} {{/if}}
{{#eq controlType "SEARCHBAR"}}
<template v-slot:searchBar>
<{{codeName}}SearchBar
:controlAction="state.{{camelCase name}}.action"
:viewSubject="state.viewSubject"/>
</template>
{{/eq}}
{{#eq controlType "GRID"}} {{#eq controlType "GRID"}}
<{{codeName}}Grid <{{codeName}}Grid
ref="grid" ref="grid"
...@@ -112,7 +122,7 @@ const { state, grid, onCtrlEvent, onToolbarEvent, onQuickGroupEvent } = new Grid ...@@ -112,7 +122,7 @@ const { state, grid, onCtrlEvent, onToolbarEvent, onQuickGroupEvent } = new Grid
:viewParams="state.viewParams" :viewParams="state.viewParams"
:controlAction="state.{{name}}.action" :controlAction="state.{{name}}.action"
:viewSubject="state.viewSubject" :viewSubject="state.viewSubject"
@onCtrlEvent="onCtrlEvent" @ctrlEvent="onCtrlEvent"
></{{codeName}}Grid> ></{{codeName}}Grid>
{{/eq}} {{/eq}}
{{/page.ctrls}} {{/page.ctrls}}
......
...@@ -32,11 +32,11 @@ interface ViewEmit { ...@@ -32,11 +32,11 @@ interface ViewEmit {
const emit = defineEmits<ViewEmit>(); const emit = defineEmits<ViewEmit>();
// 安装功能模块,提供状态和能力方法 // 安装功能模块,提供状态和能力方法
const { state, confirm, handleCtrlEvent } = new PickupGridView(viewState, props, emit).moduleInstall(); const { state, confirm, onCtrlEvent } = new PickupGridView(viewState, props, emit).moduleInstall();
</script> </script>
<template> <template>
<AppPickerUpGridViewLayout class="app-pickup-grid-view"> <AppPickerUpGridViewLayout :class="['app-pickup-grid-view', state.viewSysCss]">
<template v-slot:header-left> <template v-slot:header-left>
<AppIconText class="app-view__caption" size="large" :text="state.viewCaption" /> <AppIconText class="app-view__caption" size="large" :text="state.viewCaption" />
</template> </template>
...@@ -62,7 +62,7 @@ const { state, confirm, handleCtrlEvent } = new PickupGridView(viewState, props, ...@@ -62,7 +62,7 @@ const { state, confirm, handleCtrlEvent } = new PickupGridView(viewState, props,
:viewParams="state.viewParams" :viewParams="state.viewParams"
:controlAction="state.controlsAction.grid" :controlAction="state.controlsAction.grid"
:viewSubject="state.viewSubject" :viewSubject="state.viewSubject"
@ctrlEvent="handleCtrlEvent" @ctrlEvent="onCtrlEvent"
></MainGrid> ></MainGrid>
</AppPickerUpGridViewLayout> </AppPickerUpGridViewLayout>
</template> </template>
...@@ -28,11 +28,11 @@ interface ViewEmit { ...@@ -28,11 +28,11 @@ interface ViewEmit {
const emit = defineEmits<ViewEmit>(); const emit = defineEmits<ViewEmit>();
// 安装功能模块,提供状态和能力方法 // 安装功能模块,提供状态和能力方法
const { state, cancel, confirm,handleCtrlEvent } = new PickupView(viewState, props, emit).moduleInstall(); const { state, cancel, confirm,onCtrlEvent } = new PickupView(viewState, props, emit).moduleInstall();
</script> </script>
<template> <template>
<AppPickerUpViewLayout class="app-pickup-view"> <AppPickerUpViewLayout :class="['app-pickup-view', state.viewSysCss]">
<template v-slot:header-left> <template v-slot:header-left>
<AppIconText class="app-view__caption" size="large" :text="state.viewCaption" /> <AppIconText class="app-view__caption" size="large" :text="state.viewCaption" />
</template> </template>
...@@ -56,7 +56,7 @@ const { state, cancel, confirm,handleCtrlEvent } = new PickupView(viewState, pro ...@@ -56,7 +56,7 @@ const { state, cancel, confirm,handleCtrlEvent } = new PickupView(viewState, pro
:viewParams="state.viewParams" :viewParams="state.viewParams"
:controlAction="state.controlsAction.{{name}}" :controlAction="state.controlsAction.{{name}}"
:viewSubject="state.viewSubject" :viewSubject="state.viewSubject"
@ctrlEvent="handleCtrlEvent" @ctrlEvent="onCtrlEvent"
></{{codeName}}PickUpViewPanel> ></{{codeName}}PickUpViewPanel>
{{/eq}} {{/eq}}
{{/page.ctrls}} {{/page.ctrls}}
......
...@@ -25,11 +25,11 @@ interface ViewEmit { ...@@ -25,11 +25,11 @@ interface ViewEmit {
const emit = defineEmits<ViewEmit>(); const emit = defineEmits<ViewEmit>();
// 安装功能模块 // 安装功能模块
const { state, handleCtrlEvent, onToolbarEvent } = new TreeExpView(viewState, props, emit).moduleInstall(); const { state, onCtrlEvent, onToolbarEvent } = new TreeExpView(viewState, props, emit).moduleInstall();
</script> </script>
<template> <template>
<AppTreeExpViewLayout class="app-tree-exp-view"> <AppTreeExpViewLayout :class="['app-tree-exp-view', state.viewSysCss]">
<template v-slot:caption> <template v-slot:caption>
<AppIconText class="app-view__caption" size="large" :text="state.viewCaption" /> <AppIconText class="app-view__caption" size="large" :text="state.viewCaption" />
</template> </template>
...@@ -49,7 +49,7 @@ const { state, handleCtrlEvent, onToolbarEvent } = new TreeExpView(viewState, pr ...@@ -49,7 +49,7 @@ const { state, handleCtrlEvent, onToolbarEvent } = new TreeExpView(viewState, pr
:showBusyIndicator="true" :showBusyIndicator="true"
:viewParams="state.viewParams" :viewParams="state.viewParams"
:viewSubject="state.viewSubject" :viewSubject="state.viewSubject"
@ctrlEvent="handleCtrlEvent" @ctrlEvent="onCtrlEvent"
></{{codeName}}TreeExpBar> ></{{codeName}}TreeExpBar>
{{/eq}} {{/eq}}
{{/page.ctrls}} {{/page.ctrls}}
......
...@@ -18,7 +18,7 @@ const props = withDefaults(defineProps < Props > (), { ...@@ -18,7 +18,7 @@ const props = withDefaults(defineProps < Props > (), {
interface CtrlEmit { interface CtrlEmit {
(name: "ctrlEvent", value: IActionParam): void; (name: "ctrlEvent", value: IActionParam): void;
} }
const emit = defineEmits < CtrlEmit > (); const emit = defineEmits <CtrlEmit> ();
const { state, menuSelect } = new MenuControl(ctrlState, props, emit).moduleInstall(); const { state, menuSelect } = new MenuControl(ctrlState, props, emit).moduleInstall();
...@@ -27,7 +27,7 @@ defineExpose({ state, name: '{{ctrl.name}}' }); ...@@ -27,7 +27,7 @@ defineExpose({ state, name: '{{ctrl.name}}' });
</script> </script>
<template> <template>
<a-menu class="app-menu" v-model:openKeys="state.defaultOpens" v-model:selectedKeys="state.defaultSelect" <a-menu class="app-menu{{#if ctrl.psSysCss}} {{ctrl.psSysCss.cssName}}{{/if}}" v-model:openKeys="state.defaultOpens" v-model:selectedKeys="state.defaultSelect"
:mode="Object.is('LEFT', state.menuAlign) ? 'inline' : 'horizontal'" @select="menuSelect"> :mode="Object.is('LEFT', state.menuAlign) ? 'inline' : 'horizontal'" @select="menuSelect">
<AppMenuItem :items="state.menus" :collapsed="collapsed" /> <AppMenuItem :items="state.menus" :collapsed="collapsed" />
</a-menu> </a-menu>
......
...@@ -3,7 +3,21 @@ ...@@ -3,7 +3,21 @@
import { Subject } from 'rxjs'; import { Subject } from 'rxjs';
import { ctrlState } from './{{spinalCase ctrl.codeName}}-form-state'; import { ctrlState } from './{{spinalCase ctrl.codeName}}-form-state';
import { FormControl, IActionParam, IParam, ControlAction, IContext } from '@core'; import { FormControl, IActionParam, IParam, ControlAction, IContext } from '@core';
{{#*inline "importFormDruipart"}}
{{#each items as | formDetail | }}
{{#eq formDetail.detailType 'DRUIPART'}}
import {{formDetail.psAppView.codeName}} from '@views/{{spinalCase formDetail.psAppView.psAppModule.codeName}}/{{spinalCase formDetail.psAppView.codeName}}';
{{/eq}}
{{#if formDetail.psDEFormDetails}}
{{>(lookup 'importFormDruipart') items=formDetail.psDEFormDetails}}
{{/if}}
{{/each }}
{{/inline}}
{{#each ctrl.psDEFormPages as | items | }}
{{#if items.psDEFormDetails}}
{{>(lookup 'importFormDruipart') items=items.psDEFormDetails}}
{{/if}}
{{/each}}
interface Props { interface Props {
context: IContext; context: IContext;
viewParams?: IParam; viewParams?: IParam;
...@@ -19,10 +33,10 @@ const props = withDefaults(defineProps < Props > (), { ...@@ -19,10 +33,10 @@ const props = withDefaults(defineProps < Props > (), {
// emit声明 // emit声明
interface CtrlEmit { interface CtrlEmit {
(name: "onCtrlEvent", value: IActionParam): void; (name: "ctrlEvent", value: IActionParam): void;
} }
const emit = defineEmits < CtrlEmit > (); const emit = defineEmits <CtrlEmit> ();
// 安装功能模块,提供状态和能力方法 // 安装功能模块,提供状态和能力方法
const { state, onEditorEvent, onComponentEvent } = new FormControl(ctrlState, props, emit).moduleInstall(); const { state, onEditorEvent, onComponentEvent } = new FormControl(ctrlState, props, emit).moduleInstall();
......
...@@ -27,7 +27,12 @@ const props = withDefaults(defineProps < Props > (), { ...@@ -27,7 +27,12 @@ const props = withDefaults(defineProps < Props > (), {
}) })
// emit声明 // emit声明
const emit = defineEmits<{(event: 'onCtrlevent', value: IActionParam): void;}>(); interface CtrlEmit {
(name: "ctrlEvent", value: IActionParam): void;
}
// emit声明
const emit = defineEmits<CtrlEmit>();
// 安装功能模块,提供状态和能力 // 安装功能模块,提供状态和能力
const { state, useCustom, onEditorEvent, onToolbarEvent } = new GridControl(ctrlState, props, emit).moduleInstall(); const { state, useCustom, onEditorEvent, onToolbarEvent } = new GridControl(ctrlState, props, emit).moduleInstall();
...@@ -40,7 +45,7 @@ defineExpose({ state, name: '{{ctrl.name}}' }); ...@@ -40,7 +45,7 @@ defineExpose({ state, name: '{{ctrl.name}}' });
<a-table <a-table
bordered bordered
sticky sticky
class="app-grid" class="app-grid{{#if ctrl.psSysCss}} {{ctrl.psSysCss.cssName}}{{/if}}"
:rowKey="rowKey" :rowKey="rowKey"
:showHeader="true" :showHeader="true"
:scroll="scrollOption" :scroll="scrollOption"
......
...@@ -28,7 +28,7 @@ interface CtrlEmit { ...@@ -28,7 +28,7 @@ interface CtrlEmit {
(name: "ctrlEvent", value: IActionParam): void; (name: "ctrlEvent", value: IActionParam): void;
} }
const emit = defineEmits < CtrlEmit > (); const emit = defineEmits <CtrlEmit> ();
// 安装功能模块,提供状态和能力方法 // 安装功能模块,提供状态和能力方法
const { state, inited, viewdata, viewparam } = new PickupViewPanelControl(ctrlState, props, emit).moduleInstall(); const { state, inited, viewdata, viewparam } = new PickupViewPanelControl(ctrlState, props, emit).moduleInstall();
...@@ -38,7 +38,7 @@ defineExpose({ state, name: '{{ctrl.name}}' }); ...@@ -38,7 +38,7 @@ defineExpose({ state, name: '{{ctrl.name}}' });
</script> </script>
<template> <template>
<div class="app-pickupviewpanel"> <div class="app-pickupviewpanel{{#if ctrl.psSysCss}} {{ctrl.psSysCss.cssName}}{{/if}}">
<component v-if="inited && state.embeddedView && state.embeddedView.viewName" :if="state.embeddedView.viewName" <component v-if="inited && state.embeddedView && state.embeddedView.viewName" :if="state.embeddedView.viewName"
:viewdata="viewdata" :viewparam="viewparam" :isSingleSelect="state.isSingleSelect" :viewdata="viewdata" :viewparam="viewparam" :isSingleSelect="state.isSingleSelect"
:isShowButton="state.isShowButton" :selectedData="state.selectedData"></component> :isShowButton="state.isShowButton" :selectedData="state.selectedData"></component>
......
...@@ -20,7 +20,7 @@ const props = withDefaults(defineProps<Props>(), { ...@@ -20,7 +20,7 @@ const props = withDefaults(defineProps<Props>(), {
// emit声明 // emit声明
interface CtrlEmit { interface CtrlEmit {
(name: "onCtrlEvent", value: IActionParam): void; (name: "ctrlEvent", value: IActionParam): void;
} }
const emit = defineEmits<CtrlEmit>(); const emit = defineEmits<CtrlEmit>();
......
import {{ctrl.codeName}}SearchBar from "./{{spinalCase ctrl.codeName}}-searchBar.vue";
export { {{ctrl.codeName}}SearchBar };
\ No newline at end of file
export const CtrlConfig = {
controlCodeName: "{{ctrl.codeName}}",
controlName: "{{ctrl.name}}",
detailsModel: {
{{#each ctrl.psSearchBarFilters as | filter | }}
{{filter.name}} : {
label: '{{filter.psAppDEField.logicName}}',
name: '{{filter.name}}',
prop: '{{lowerCase filter.psAppDEField.codeName}}',
disabled: false,
{{#if filter.psDEFSearchMode}}mode: '{{filter.psDEFSearchMode.valueOP}}',{{/if}}
},
{{/each}}
},
}
\ No newline at end of file
<script setup lang="ts">
import { Subject } from 'rxjs';
import { CtrlConfig } from './{{spinalCase ctrl.codeName}}-searchBar-config';
import { SearchBarControl, IActionParam, IParam, IContext, ControlAction, deepCopy } from '@core';
interface Props {
controlAction: ControlAction;
viewSubject: Subject<IActionParam>;
}
const props = withDefaults(defineProps<Props>(), {
})
// emit声明
interface CtrlEmit {
(name: "ctrlEvent", value: IActionParam): void;
}
const emit = defineEmits<CtrlEmit>();
// 安装功能模块,提供状态和能力方法
const { state } = new SearchBarControl(CtrlConfig).moduleInstall(props, emit);
// 暴露内部状态及能力
defineExpose({ state, name: '{{ctrl.name}}' });
</script>
<template>
<div class="search-bar{{#if ctrl.psSysCss}} {{ctrl.psSysCss.cssName}}{{/if}}">
<app-filter-tree :datas="state.filterItems" :fields="state.filterFields"/>
</div>
</template>
<style lang="scss">
</style>
\ No newline at end of file
...@@ -20,7 +20,7 @@ const props = withDefaults(defineProps<Props>(), { ...@@ -20,7 +20,7 @@ const props = withDefaults(defineProps<Props>(), {
// emit声明 // emit声明
interface CtrlEmit { interface CtrlEmit {
(name: "onCtrlEvent", value: IActionParam): void; (name: "ctrlEvent", value: IActionParam): void;
} }
const emit = defineEmits<CtrlEmit>(); const emit = defineEmits<CtrlEmit>();
......
...@@ -32,10 +32,10 @@ interface CtrlEmit { ...@@ -32,10 +32,10 @@ interface CtrlEmit {
(name: "ctrlEvent", value: IActionParam): void; (name: "ctrlEvent", value: IActionParam): void;
} }
const emit = defineEmits < CtrlEmit > (); const emit = defineEmits <CtrlEmit> ();
// 安装功能模块,提供状态和能力方法 // 安装功能模块,提供状态和能力方法
const { state, handleCtrlEvent } = new TreeExpBarControl(ctrlState, props, emit).moduleInstall(); const { state, onCtrlEvent } = new TreeExpBarControl(ctrlState, props, emit).moduleInstall();
// 暴露内部状态及能力 // 暴露内部状态及能力
defineExpose({ state, name: '{{ctrl.name}}' }); defineExpose({ state, name: '{{ctrl.name}}' });
...@@ -53,7 +53,7 @@ defineExpose({ state, name: '{{ctrl.name}}' }); ...@@ -53,7 +53,7 @@ defineExpose({ state, name: '{{ctrl.name}}' });
:viewParams="state.viewParams" :viewParams="state.viewParams"
:viewSubject="state.viewSubject" :viewSubject="state.viewSubject"
:isBranchAvailable="true" :isBranchAvailable="true"
@ctrlEvent="handleCtrlEvent" @ctrlEvent="onCtrlEvent"
></{{codeName}}Tree> ></{{codeName}}Tree>
{{/eq}} {{/eq}}
{{/ctrl.ctrls}} {{/ctrl.ctrls}}
......
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册