提交 566dc899 编写于 作者: yanshaowei's avatar yanshaowei

init

上级
流水线 #218 已失败 ,包含阶段

要显示的变更太多。

为了保持性能,仅显示文件中的 1000/1000+

import { Vue, Component, Prop, Provide, Emit, Watch } from 'vue-property-decorator';
import { CreateElement } from 'vue';
import { Subject, Subscription } from 'rxjs';
import { ControlInterface } from '@/interface/control';
import { UICounter } from '@/utils';
import './${srffilepath2(ctrl.codeName)}-${ctrl.getControlType()?lower_case}.less';
<#if ctrl.getPSControls?? && ctrl.getPSControls()??>
<#list ctrl.getPSControls() as subctrl>
<#if subctrl.getControlType() != 'TOOLBAR' && subctrl.getControlType() != 'CONTEXTMENU'>
<#if subctrl.getPSDataEntity?? && subctrl.getPSDataEntity()??>
import view_${subctrl.getName()} from '@widget/${srffilepath2(subctrl.getPSDataEntity().getCodeName())}/${srffilepath2(subctrl.getCodeName())}-${subctrl.getControlType()?lower_case}/${srffilepath2(subctrl.getCodeName())}-${subctrl.getControlType()?lower_case}';
<#else>
import view_${subctrl.getName()} from '@widget/app/${srffilepath2(subctrl.getCodeName())}-${subctrl.getControlType()?lower_case}/${srffilepath2(subctrl.getCodeName())}-${subctrl.getControlType()?lower_case}';
</#if>
</#if>
</#list>
</#if>
<#-- 语言资源入口 -->
<#ibizinclude>
./LANGBASE.tsx.ftl
</#ibizinclude>
<#if ctrl.getPSLayoutPanels?? && ctrl.getPSLayoutPanels()??>
<#list ctrl.getPSLayoutPanels() as panel>
import layout_${panel.getName()} from '@widget/${srffilepath2(panel.getPSDataEntity().getCodeName())}/${srffilepath2(panel.getCodeName())}-${panel.getControlType()?lower_case}/${srffilepath2(panel.getCodeName())}-${panel.getControlType()?lower_case}';
</#list>
</#if>
<#if import_block??>${import_block}</#if>
@Component({
components: {
<#if ctrl.getPSControls?? && ctrl.getPSControls()??>
<#list ctrl.getPSControls() as subctrl>
<#if subctrl.getControlType() != 'TOOLBAR' && subctrl.getControlType() != 'CONTEXTMENU'>
view_${subctrl.getName()},
</#if>
</#list>
</#if>
<#if ctrl.getPSLayoutPanels?? && ctrl.getPSLayoutPanels()??>
<#list ctrl.getPSLayoutPanels() as panel>
layout_${panel.getName()},
</#list>
</#if>
<#if components??>${components}</#if>
}
})
export default class ${srfclassname('${ctrl.codeName}')} extends Vue implements ControlInterface {
/**
* 名称
*
* @type {string}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
@Prop() public name?: string;
/**
* 视图通讯对象
*
* @type {Subject<ViewState>}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
@Prop() public viewState!: Subject<ViewState>;
/**
* 视图状态事件
*
* @protected
* @type {(Subscription | undefined)}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
protected viewStateEvent: Subscription | undefined;
<#if ctrl.getPSControls?? && ctrl.getPSControls()??>
<#list ctrl.getPSControls() as childCtrl>
<#if childCtrl.getControlType()??>
<#if childCtrl.getHookEventNames()??>
<#list childCtrl.getHookEventNames() as eventName>
/**
* ${childCtrl.name} 部件 ${eventName?lower_case} 事件
*
* @param {*} [args={}]
* @param {*} $event
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
public ${childCtrl.name}_${eventName?lower_case}($event: any, $event2?: any) {
<#if childCtrl.getPSControlLogics(eventName)??>
<#list childCtrl.getPSControlLogics(eventName) as ctrlLogic>
<#if ctrlLogic.getLogicType?? && ctrlLogic.getLogicType() == "APPVIEWENGINE" && ctrlLogic.getPSAppViewEngine()??>
this.${ctrlLogic.getPSAppViewEngine().getName()}.onCtrlEvent('${childCtrl.name}', '${eventName?lower_case}', $event);
<#else>
<#if ctrlLogic.getEventArg()?? && ctrlLogic.getEventArg()?length gt 0>
if (Object.is($event.tag, '${ctrlLogic.getEventArg()}')) {
this.${ctrlLogic.name}($event, '<#if ctrlLogic.getLogicTag()?length gt 0>${ctrlLogic.getLogicTag()}</#if>', $event2);
}
<#else>
this.${ctrlLogic.name}($event, '<#if ctrlLogic.getLogicTag()?length gt 0>${ctrlLogic.getLogicTag()}</#if>', $event2);
</#if>
</#if>
</#list>
</#if>
}
</#list>
</#if>
</#if>
</#list>
</#if>
<#if ctrl.getPSAppViewLogics?? && ctrl.getPSAppViewLogics()??>
<#list ctrl.getPSAppViewLogics() as logic>
<#if logic.getLogicTrigger() == "CUSTOM" || logic.getLogicTrigger() == "CTRLEVENT">
${P.getLogicCode(logic, "LOGIC.tsx").code}
</#if>
</#list>
</#if>
<#if ctrl.getPSUIActions?? && ctrl.getPSUIActions()??>
<#list ctrl.getPSUIActions() as uiAction>
${P.getLogicCode(uiAction, "LOGIC.tsx").code}
</#list>
</#if>
/**
* 序列号
*
* @private
* @type {number}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
private serialNumber: number = this.$util.createSerialNumber();
/**
* 请求行为序列号数组
*
* @private
* @type {any[]}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
private serialsNumber: any[] = [];
/**
* 添加序列号
*
* @private
* @param {*} action
* @param {number} serialnumber
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
private addSerialNumber(action: any, serialnumber: number): void {
const index = this.serialsNumber.findIndex((serial: any) => Object.is(serial.action, action));
if (index === -1) {
this.serialsNumber.push({ action: action, serialnumber: serialnumber })
} else {
this.serialsNumber[index].serialnumber = serialnumber;
}
}
/**
* 删除序列号
*
* @private
* @param {*} action
* @returns {number}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
private getSerialNumber(action: any): number {
const index = this.serialsNumber.findIndex((serial: any) => Object.is(serial.action, action));
return this.serialsNumber[index].serialnumber;
}
/**
* 关闭视图
*
* @param {any[]} args
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
public closeView(args: any[]): void {
let _this: any = this;
_this.$emit('closeview', args);
}
<#assign layout='TABLE_24COL'><#if formmenber.getPSLayoutPos()??><#if formmenber.getPSLayoutPos().getParentPSLayout()??><#assign layout='${formmenber.getPSLayoutPos().getParentPSLayout().getLayout()}'></#if></#if>
<#assign LayoutPos = formmenber.getPSLayoutPos()>
<#if layout == 'TABLE_24COL' && LayoutPos??>
<i-col v-show={this.detailsModel.${formmenber.name}.visible} style='<#if (formmenber.getHeight?? && formmenber.getHeight() gt 0)>height: ${formmenber.getHeight()?c}px !important;</#if><#if (formmenber.getWidth?? && formmenber.getWidth() gt 0)>width: ${formmenber.getWidth()?c}px !important;</#if>' <#if LayoutPos.getColXS() != -1> sm={{ span: ${LayoutPos.getColXS()}, offset: <#if LayoutPos.getColXSOffset() != -1>${LayoutPos.getColXSOffset()}<#else>0</#if> }}</#if><#if LayoutPos.getColSM() != -1> md={{ span: ${LayoutPos.getColSM()}, offset: <#if LayoutPos.getColSMOffset() != -1>${LayoutPos.getColSMOffset()}<#else>0</#if> }}</#if><#if LayoutPos.getColMD() != -1> lg={{ span: ${LayoutPos.getColMD()}, offset: <#if LayoutPos.getColMDOffset() != -1>${LayoutPos.getColMDOffset()}<#else>0</#if> }}</#if><#if LayoutPos.getColLG() != -1> xl={{ span: ${LayoutPos.getColLG()}, offset: <#if LayoutPos.getColLGOffset() != -1>${LayoutPos.getColLGOffset()}<#else>0</#if> }}</#if>>
${P.getPartCode(formmenber).code}
</i-col>
<#elseif layout == 'FLEX'>
<div v-show={this.detailsModel.${formmenber.name}.visible} style="<#if LayoutPos.getGrow() != -1>flex-grow: ${LayoutPos.getGrow()?c};<#if !LayoutPos.getHeight()??>height: 0;</#if></#if><#if LayoutPos.getWidth()??>width: ${LayoutPos.getWidth()?c}px;</#if><#if LayoutPos.getHeight()??>height: ${LayoutPos.getHeight()?c}px;</#if>">
${P.getPartCode(formmenber).code}
</div>
<#else>
<div v-show={this.detailsModel.${formmenber.name}.visible}>
${P.getPartCode(formmenber).code}
</div>
</#if>
\ No newline at end of file
<#assign langbase><#if de??>${de.getCodeName()?lower_case}.${ctrl.getCodeName()?lower_case}_${ctrl.getControlType()?lower_case}</#if></#assign>
\ No newline at end of file
${app.getPKGCodeName()?lower_case}/${de.getPSSystemModule().codeName?lower_case}/${de.codeName?lower_case}/${ctrl.codeName?lower_case}${srfclassname(ctrl.getControlType())?lower_case}/
\ No newline at end of file
// this is less
<#if ctrl.getPSSysCsses?? && ctrl.getPSSysCsses()??>
<#list ctrl.getPSSysCsses() as css>
<#if css.getRawCssStyle()?? && css.getRawCssStyle()?length gt 0>
.${css.getCssName()} {
${css.getRawCssStyle()}
}
</#if>
<#if css.getCssStyle()??>
${css.getCssStyle()}
</#if>
</#list>
</#if>
\ No newline at end of file
<#-- ctrl document -->
<view_${ctrl.getName()}
viewState={this.viewState}
<#if content??>
${content}
</#if>
name='${ctrl.name}'
ref='${ctrl.name}'
<#if ctrl.getHookEventNames()??>
<#list ctrl.getHookEventNames() as eventName>
on-${eventName?lower_case}={($event: any) => this.${ctrl.name}_${eventName?lower_case}($event)}
</#list>
</#if>
on-closeview={($event: any) => this.closeView($event)}>
</view_${ctrl.getName()}>
\ No newline at end of file
<#-- ctrl document -->
<view_${ctrl.getName()}
viewState={this.viewState}
name='${ctrl.name}'
ref='${ctrl.name}'
<#if ctrl.getHookEventNames()??>
<#list ctrl.getHookEventNames() as eventName>
on-${eventName?lower_case}={($event: any) => this.${ctrl.name}_${eventName?lower_case}($event)}
</#list>
</#if>
on-closeview={($event: any) => this.closeView($event)}>
<#if view.hasPSControl('form')>
${P.getCtrlCode('form', 'CONTROL.html').code}
</#if>
</view_${ctrl.getName()}>
\ No newline at end of file
<#assign handler = ctrl.getPSAjaxControlHandler() />
<#-- content -->
<#assign content>
autosave={${ctrl.isEnableAutoSave()?c}}
viewtag={this.viewtag}
showBusyIndicator={${ctrl.isShowBusyIndicator()?c}}
<#if handler.getPSAjaxHandlerActions()??>
<#list handler.getPSAjaxHandlerActions() as action>
<#if action.getPSDEAction()??>
${action.name?lower_case}Action='${action.getPSDEAction().getCodeName()?lower_case}'
</#if>
</#list>
</#if>
style='<#if ctrl.getWidth() gt 0>width: ${ctrl.getWidth()?c}px</#if><#if ctrl.getHeight() gt 0>height: ${ctrl.getHeight()?c}px</#if>'
</#assign>
<#ibizinclude>
./DEFAULT.html.ftl
</#ibizinclude>
\ No newline at end of file
<#assign handler = ctrl.getPSAjaxControlHandler() />
<#-- content -->
<#assign content>
isSingleSelect={this.isSingleSelect}
showBusyIndicator={${ctrl.isShowBusyIndicator()?c}}
searchAction='search<#if handler.getTempMode() gt 0>temp</#if>${handler.getPSDEDataSet().getCodeName()?lower_case}'
<#if handler.getPSAjaxHandlerActions()??>
<#list handler.getPSAjaxHandlerActions() as action>
<#if action.getPSDEAction()??>
${action.name?lower_case}Action='${action.getPSDEAction().getCodeName()?lower_case}'
</#if>
</#list>
</#if>
</#assign>
<#ibizinclude>
./DEFAULT.html.ftl
</#ibizinclude>
\ No newline at end of file
<dropdown-item name="${item.name}">
<#if item.isShowIcon()><#if item.getPSSysImage()??><#assign img=item.getPSSysImage()><i class='<#if img.getCssClass()?? && (img.getCssClass()?length gt 0)>${img.getCssClass()}</#if>'></i></#if></#if>
<#if item.isShowCaption()>${item.getCaption()}</#if>
</dropdown-item>
\ No newline at end of file
<dropdown placement="right-start">
<dropdown-item>
<#if item.isShowIcon()><#if item.getPSSysImage()??><#assign img=item.getPSSysImage()><i class='<#if img.getCssClass()?? && (img.getCssClass()?length gt 0)>${img.getCssClass()}</#if>'></i></#if></#if>
<#if item.isShowCaption()>${item.getCaption()}</#if>
<icon type="ios-arrow-forward"></icon>
</dropdown-item>
<dropdown-menu slot="list">
<#if item.getPSDEToolbarItems()??>
<#list item.getPSDEToolbarItems() as toolbarItem>
<@ibizindent blank=8>
${P.getPartCode(toolbarItem).code}
</@ibizindent>
</#list>
</#if>
</dropdown-menu>
</dropdown>
\ No newline at end of file
<dropdown class="tree-right-menu" trigger="custom" visible={true} on-on-click={($event: any) => this.${ctrl.name}_click({tag: $event})}>
<dropdown-menu slot="list">
<#if ctrl.getPSDEToolbarItems()??>
<#list ctrl.getPSDEToolbarItems() as item>
<@ibizindent blank=8>
${P.getPartCode(item).code}
</@ibizindent>
</#list>
</#if>
</dropdown-menu>
</dropdown>
\ No newline at end of file
.tree-right-menu {
.ivu-divider-horizontal {
width: calc(100% - 32px);
min-width: calc(100% - 32px);
margin: 0 auto;
}
.ivu-dropdown-item {
position: relative;
padding-left: 32px;
> i {
position: absolute;
left: 16px;
top: 10px;
}
.ivu-icon-ios-arrow-forward {
left: initial;
right: 4px;
}
}
.ivu-dropdown {
.ivu-select-dropdown {
margin: 0;
}
}
}
<#ibizinclude>
../@MACRO/CSS/DEFAULT.less.ftl
</#ibizinclude>
\ No newline at end of file
CTRLTYPE=CONTEXTMENU
\ No newline at end of file
<#ibizinclude>
../@MACRO/HTML/DEFAULT.html.ftl
</#ibizinclude>
\ No newline at end of file
<#ibizinclude>
../@MACRO/CSS/DEFAULT.less.ftl
</#ibizinclude>
.tabexppanel {
height: 100%;
>.ivu-tabs-bar {
margin-bottom: 0px;
}
>.ivu-tabs-content {
height: calc(100% - 36px);
padding: 0px !important;
.ivu-tabs-tabpane {
height: 100%;
}
}
}
\ No newline at end of file
<#ibizinclude>
../@MACRO/CONTROL/CONTROL_HEADER.tsx.ftl
</#ibizinclude>
/**
* 获取多项数据
*
* @returns {any[]}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
public getDatas(): any[] {
return [];
}
/**
* 获取单项树
*
* @returns {*}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
public getData(): any {
return null;
}
/**
* 父数据
*
* @protected
* @type {*}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
protected srfparentdata: any = {};
/**
* 行为参数
*
* @protected
* @type {*}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
protected action:any = '';
/**
* 被激活的分页面板
*
* @type {string}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
public activiedTabViewPanel: string = '<#list ctrl.getPSControls() as tabviewpanel><#if tabviewpanel_index==0>${tabviewpanel.name}</#if></#list>';
/**
* vue 生命周期
*
* @returns
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
public created() {
if (this.viewState) {
this.viewStateEvent = this.viewState.subscribe(({ tag, action, data }) => {
if (!Object.is(tag, this.name)) {
return;
}
this.srfparentdata = {};
this.action = action;
Object.assign(this.srfparentdata, data);
this.viewState.next({ tag: this.activiedTabViewPanel, action: action, data: this.srfparentdata });
});
}
}
/**
* vue 生命周期
*
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
public destroyed() {
if (this.viewStateEvent) {
this.viewStateEvent.unsubscribe();
}
<#if destroyed_block??>
${destroyed_block}
</#if>
}
/**
* 分页面板选中
*
* @param {*} $event
* @returns
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
public tabPanelClick($event: any) {
if (!$event) {
return;
}
if (!this.viewState) {
return;
}
this.activiedTabViewPanel = $event;
this.viewState.next({ tag: this.activiedTabViewPanel, action: this.action, data: this.srfparentdata });
}
/**
* 绘制内容
*
* @returns
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
public render() {
return (
<tabs animated={false} class='tabexppanel' name='${ctrl.name}' on-on-click={($event: any) => this.tabPanelClick($event)}>
<#list ctrl.getPSControls() as tabviewpanel>
<tab-pane index={${tabviewpanel_index}} name='${tabviewpanel.name}' tab='${ctrl.name}' class='<#if tabviewpanel.getPSSysCss?? && tabviewpanel.getPSSysCss()??>${tabviewpanel.getPSSysCss().getCssName()}</#if>'
label={
(h: any) => {
return (
<span class='caption<#if tabviewpanel.getPSSysCss?? && tabviewpanel.getPSSysCss()??> ${tabviewpanel.getPSSysCss().getCssName()}</#if>'>
<#if tabviewpanel.getPSSysImage()??>
<span>
<#assign sysimage = tabviewpanel.getPSSysImage()/>
<#if sysimage.getImagePath() == "">
<i class='${sysimage.getCssClass()}'></i>&nbsp;
<#else>
<img src='${sysimage.getImagePath()}'/>&nbsp;
</#if>
</span>
</#if>
${tabviewpanel.getCaption()}
</span>
);
}
}>
${P.getCtrlCode(tabviewpanel, 'CONTROL.html').code}
</tab-pane>
</#list>
</tabs>
);
}
}
CTRLTYPE=TABEXPPANEL
\ No newline at end of file
<#ibizinclude>
../@MACRO/HTML/DEFAULT.html.ftl
</#ibizinclude>
\ No newline at end of file
<#ibizinclude>
../@MACRO/CSS/DEFAULT.less.ftl
</#ibizinclude>
\ No newline at end of file
<#ibizinclude>
../@MACRO/CONTROL/CONTROL_HEADER.tsx.ftl
</#ibizinclude>
/**
* 获取多项数据
*
* @returns {any[]}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
public getDatas(): any[] {
return [];
}
/**
* 获取单项树
*
* @returns {*}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
public getData(): any {
return null;
}
/**
* 父参数
*
* @type {*}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
public viewdata: any = { srfparentdata: {} };
/**
* 是否被激活
*
* @type {boolean}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
public isActivied: boolean = false;
/**
* 关系视图参数
*
* @private
* @type {*}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
private parentdata: any = <#if ctrl.getParentDataJO?? && ctrl.getParentDataJO()??>${ctrl.getParentDataJO()}<#else>{}</#if>;
/**
* vue 生命周期
*
* @returns
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
public created() {
if (this.viewState) {
this.viewStateEvent = this.viewState.subscribe(({ tag, action, data }) => {
if (!Object.is(tag, this.name)) {
return;
}
this.viewdata = { srfparentdata: {} };
if (data.srfparentdata) {
Object.assign(this.viewdata.srfparentdata, data.srfparentdata);
}
Object.assign(this.viewdata.srfparentdata, this.parentdata);
if (!this.isActivied) {
this.$nextTick(() => {
this.isActivied = true;
});
}
});
}
}
/**
* vue 生命周期
*
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
public destroyed() {
if (this.viewStateEvent) {
this.viewStateEvent.unsubscribe();
}
<#if destroyed_block??>
${destroyed_block}
</#if>
}
/**
* 绘制内容
*
* @returns
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
public render() {
return (
<span>
{
this.isActivied ?
<#if ctrl.getEmbeddedPSAppDEView()??><#assign embedddevedview = ctrl.getEmbeddedPSAppDEView()><${srffilepath2(embedddevedview.getCodeName())} class='viewcontainer2' viewdata={JSON.stringify(this.viewdata)}></${srffilepath2(embedddevedview.getCodeName())}></#if>
:
''
}
</span>
);
}
}
CTRLTYPE=TABVIEWPANEL
\ No newline at end of file
<#assign handler = ctrl.getPSAjaxControlHandler() />
<#-- content -->
<#assign content>
searchAction='search${handler.getPSDEDataSet().getCodeName()?lower_case}'
showBusyIndicator={${ctrl.isShowBusyIndicator()?c}}
</#assign>
<#ibizinclude>
../@MACRO/HTML/DEFAULT.html.ftl
</#ibizinclude>
\ No newline at end of file
<#ibizinclude>
../@MACRO/CSS/DEFAULT.less.ftl
</#ibizinclude>
.app-list {
flex-grow: 1;
overflow-y: auto;
.app-list-item {
line-height: 34px;
}
.app-list-item.isSelect {
background: #f3f3f3;
}
.app-list-item:hover {
background: #f3f3f3;
}
}
.app-list-empty {
color: #909399;
display: flex;
justify-content: center;
align-items: center;
}
\ No newline at end of file
此差异已折叠。
CTRLTYPE=LIST
\ No newline at end of file
<#ibizinclude>
../@MACRO/HTML/DEFAULT.html.ftl
</#ibizinclude>
\ No newline at end of file
<#ibizinclude>
../@MACRO/CSS/DEFAULT.less.ftl
</#ibizinclude>
\ No newline at end of file
import { Vue, Component, Provide, Prop } from 'vue-property-decorator';
import { Subject } from 'rxjs';
import { CreateElement } from 'vue';
@Component({})
export default class ${view.codeName} extends Vue {
/**
* 名称
*
* @type {string}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
@Prop() public name?: string;
/**
* 视图通讯对象
*
* @type {Subject<ViewState>}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
@Prop() public viewState!: Subject<ViewState>;
/**
* 视图参数
*
* @type {string}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
public viewData: string = '';
/**
* 监听对象
*
* @type {*}
* @memberof SPLBGridView
*/
public viewStateEvent: any;
/**
* 生命周期
*
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
public created() {
if (this.viewState) {
this.viewStateEvent = this.viewState.subscribe(({ tag, action, data }) => {
if (!Object.is(tag, this.name)) {
return;
}
if (Object.is('load', action)) {
this.viewData = JSON.stringify(data);
}
});
}
}
/**
* vue 生命周期
*
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
public destroyed() {
if (this.viewStateEvent) {
this.viewStateEvent.unsubscribe();
}
<#if destroyed_block??>
${destroyed_block}
</#if>
}
/**
* 绘制内容
*
* @param {CreateElement} h
* @returns
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
public render(h: CreateElement) {
<#if ctrl.getEmbeddedPSAppDEView()??>
<#assign embedview = ctrl.getEmbeddedPSAppDEView()>
return (<${srffilepath2(embedview.codeName)} viewdata={this.viewData}></${srffilepath2(embedview.codeName)}>);
<#else>
return (<div>无嵌入视图</div>);
</#if>
}
}
\ No newline at end of file
CTRLTYPE=VIEWPANEL
\ No newline at end of file
<#ibizinclude>
../@MACRO/HTML/DEFAULT.html.ftl
</#ibizinclude>
\ No newline at end of file
.app-wizard {
background: #fff;
height: 100%;
.app-wizard-content{
height: 100%;
overflow-y: auto;
}
.app-wizard-footer {
padding: 10px;
text-align: right;
.ivu-btn {
margin: 0 5px;
}
}
}
<#ibizinclude>
../@MACRO/CSS/DEFAULT.less.ftl
</#ibizinclude>
\ No newline at end of file
此差异已折叠。
CTRLTYPE=WIZARDPANEL
\ No newline at end of file
<#ibizinclude>
../@MACRO/HTML/DEFAULT.html.ftl
</#ibizinclude>
\ No newline at end of file
<#ibizinclude>
../@MACRO/CSS/DEFAULT.less.ftl
</#ibizinclude>
\ No newline at end of file
import { Vue, Component, Provide } from 'vue-property-decorator';
@Component({})
export default class ${view.codeName} extends Vue {
public render() {
return <div>未实现</div>;
}
}
CTRLTYPE=MULTIEDITVIEWPANEL
\ No newline at end of file
<#ibizinclude>
../@MACRO/HTML/DEFAULT.html.ftl
</#ibizinclude>
\ No newline at end of file
<#ibizinclude>
../@MACRO/CSS/DEFAULT.less.ftl
</#ibizinclude>
\ No newline at end of file
import { Vue, Component, Provide } from 'vue-property-decorator';
@Component({})
export default class ${view.codeName} extends Vue {
public render() {
return <div>未实现</div>;
}
}
CTRLTYPE=EXPBAR
\ No newline at end of file
<#ibizinclude>
../@MACRO/CONTROL/LANGBASE.tsx.ftl
</#ibizinclude>
<#assign deuiaction=item.getPSUIAction()>
<#if item.getTooltip()?? && item.getTooltip() != ''>
<tooltip transfer={true} max-width={600}>
<#if deuiaction.getUIActionTag() == 'ExportExcel'>
<app-export-excel item={this.toolBarModels.${item.name}} on-exportexcel={($event:any) => this.toolbar_click({ tag: '${item.name}' }, $event)}></app-export-excel>
<#else>
<i-button v-show={this.toolBarModels.${item.name}.visabled} disabled={this.toolBarModels.${item.name}.disabled} class='<#if item.getPSSysCss()??> ${item.getPSSysCss().getCssName()}</#if>' on-click={($event: any) => this.${ctrl.name}_click({ tag: '${item.name}' }, $event)}>
<#if item.isShowIcon()><i class='<#if item.getPSSysImage()??><#assign img=item.getPSSysImage()><#if img.getCssClass()?? && (img.getCssClass()?length gt 0)>${img.getCssClass()}</#if></#if>'></i></#if>
<#if item.isShowCaption()><span class='caption'>{<#if langbase??>this.$t('${langbase}.${item.name}.caption')<#else>'${item.getCaption()}'</#if>}</span></#if>
</i-button>
</#if>
<div slot='content'>{<#if langbase??>this.$t('${langbase}.${item.name}.tip')<#else>'${item.getTooltip()}'</#if>}</div>
</tooltip>
<#else>
<#if deuiaction.getUIActionTag() == 'ExportExcel'>
<app-export-excel item={this.toolBarModels.${item.name}} on-exportexcel={($event:any) => this.toolbar_click({ tag: '${item.name}' }, $event)}></app-export-excel>
<#else>
<i-button v-show={this.toolBarModels.${item.name}.visabled} disabled={this.toolBarModels.${item.name}.disabled} class='<#if item.getPSSysCss()??> ${item.getPSSysCss().getCssName()}</#if>' on-click={($event: any) => this.${ctrl.name}_click({ tag: '${item.name}' }, $event)}>
<#if item.isShowIcon()><i class='<#if item.getPSSysImage()??><#assign img=item.getPSSysImage()><#if img.getCssClass()?? && (img.getCssClass()?length gt 0)>${img.getCssClass()}</#if></#if>'></i></#if>
<#if item.isShowCaption()><span class='caption'>{<#if langbase??>this.$t('${langbase}.${item.name}.caption')<#else>'${item.getCaption()}'</#if>}</span></#if>
</i-button>
</#if>
</#if>
<#ibizinclude>
../@MACRO/CONTROL/LANGBASE.tsx.ftl
</#ibizinclude>
<dropdown v-show={this.toolBarModels.${item.name}.visabled} trigger='click'>
<#if item.getTooltip()?? && item.getTooltip() != ''>
<tooltip transfer={true} max-width={600}>
<i-button class='<#if item.getPSSysCss()??> ${item.getPSSysCss().getCssName()}</#if>'>
<#if item.isShowIcon()><i class='<#if item.getPSSysImage()??><#assign img=item.getPSSysImage()><#if img.getCssClass()?? && (img.getCssClass()?length gt 0)>${img.getCssClass()}</#if></#if>'></i></#if>
<#if item.isShowCaption()><span class='caption'>{<#if langbase??>this.$t('${langbase}.${item.name}.caption')<#else>'${item.getCaption()}'</#if>}</span></#if>
<icon type="ios-arrow-down"></icon>
</i-button>
<div slot='content'><#if langbase??>{<#if langbase??>this.$t('${langbase}.${item.name}.tip')<#else>'${item.getTooltip()}'</#if>}</#if></div>
</tooltip>
<#else>
<i-button class='<#if item.getPSSysCss()??> ${item.getPSSysCss().getCssName()}</#if>'>
<#if item.isShowIcon()><i class='<#if item.getPSSysImage()??><#assign img=item.getPSSysImage()><#if img.getCssClass()?? && (img.getCssClass()?length gt 0)>${img.getCssClass()}</#if></#if>'></i></#if>
<#if item.isShowCaption()><span class='caption'>{<#if langbase??>this.$t('${langbase}.${item.name}.caption')<#else>'${item.getCaption()}'</#if>}</span></#if>
<icon type="ios-arrow-down"></icon>
</i-button>
</#if>
<#if item.getPSDEToolbarItems()??>
<dropdown-menu slot='list'>
<#list item.getPSDEToolbarItems() as toolbarItem>
<dropdown-item>
${P.getPartCode(toolbarItem).code}
</dropdown-item>
</#list>
</dropdown-menu>
</#if>
</dropdown>
\ No newline at end of file
<div></div>
\ No newline at end of file
<span class='seperator'>|</span>
\ No newline at end of file
<div class='toolbar-container'>
<#if (view.getPSWorkflow?? && view.getPSWorkflow()??) && (view.isWFIAMode?? && view.isWFIAMode()) && (view.getWFStepValue?? && view.getWFStepValue() == "") && (view.getViewType?? && (view.getViewType() == 'DEWFEDITVIEW3' || view.getViewType() == 'DEWFEDITVIEW'))>
{
this.containerModel.wflinks.map((item: any) => {
return (
<tooltip transfer={true} max-width={600}>
<i-button class='' on-click={($event: any) => this.wflink_click(item, $event)}>
{/* <i class='fa fa-save'></i> */}
<span class='caption'>{item.name}</span>
</i-button>
<div slot='content'>{item.name}</div>
</tooltip>
)
})
}
</#if>
<#if ctrl.getPSDEToolbarItems()??>
<#list ctrl.getPSDEToolbarItems() as item>
${P.getPartCode(item).code}
</#list>
</#if>
</div>
\ No newline at end of file
.toolbar-container {
button {
margin: 6px 0px 4px 4px;
.caption {
margin-left: 4px;
}
}
.seperator {
color: #dcdee2;
margin: 0 0px 0 4px;
}
}
<#ibizinclude>
../@MACRO/CSS/DEFAULT.less.ftl
</#ibizinclude>
\ No newline at end of file
<#assign deuiaction=item.getPSUIAction()>
<#if deuiaction.getUIActionTag() == 'ExportExcel'>
${item.getName()?lower_case}: { name: '${item.getName()?lower_case}', caption: '${item.caption}', disabled: false, type: '${item.getItemType()}', visabled: true, dataaccaction: '<#if deuiaction.getDataAccessAction()??>${deuiaction.getDataAccessAction()}</#if>', uiaction: { tag: '${deuiaction.getUIActionTag()}', target: '${deuiaction.getActionTarget()}' }<#if view.hasPSControl("GRID")><#assign gridhandler = view.getPSControl("GRID").getPSAjaxControlHandler()>, MaxRowCount: <#if gridhandler?? && gridhandler.getPSDEDataExport()??>${gridhandler.getPSDEDataExport().getMaxRowCount()?c}<#elseif sys.getDEDataExportMaxRowCount() gt 0>${sys.getDEDataExportMaxRowCount()?c}<#else>10000</#if></#if> },
<#elseif deuiaction.getUIActionTag() == 'ToggleRowEdit'>
${item.getName()?lower_case}: { name: '${item.getName()?lower_case}', caption: '${item.caption}', disabled: false, type: '${item.getItemType()}', visabled: true, dataaccaction: '<#if deuiaction.getDataAccessAction()??>${deuiaction.getDataAccessAction()}</#if>', uiaction: { tag: '${deuiaction.getUIActionTag()}', target: '${deuiaction.getActionTarget()}' } },
<#else>
${item.getName()?lower_case}: { name: '${item.getName()?lower_case}', caption: '${item.caption}', disabled: false, type: '${item.getItemType()}', visabled: true, dataaccaction: '<#if deuiaction.getDataAccessAction()??>${deuiaction.getDataAccessAction()}</#if>', uiaction: { tag: '${deuiaction.getUIActionTag()}', target: '${deuiaction.getActionTarget()}' } },
</#if>
\ No newline at end of file
${item.getName()?lower_case}: { name: '${item.getName()?lower_case}', caption: '${item.caption}', disabled: false, type: '${item.getItemType()}', visabled: true, dataaccaction: '', uiaction: { } },
<#if item.getPSDEToolbarItems()??>
<#list item.getPSDEToolbarItems() as toolbarItem>
${P.getPartCode(toolbarItem).code}
</#list>
</#if>
\ No newline at end of file
${item.getName()?lower_case}: { name: '${item.getName()?lower_case}', type: '${item.getItemType()}', visabled: true, dataaccaction: '', uiaction: { } },
\ No newline at end of file
${item.getName()?lower_case}: { name: '${item.getName()?lower_case}', type: '${item.getItemType()}', visabled: true, dataaccaction: '', uiaction: { } },
\ No newline at end of file
<#-- 工具栏模型 -->
/**
* 工具栏模型
*
* @type {*}
* @memberof ${srfclassname('${view.name}')}
*/
public toolBarModels: any = {
<#if ctrl.getPSDEToolbarItems()??>
<#list ctrl.getPSDEToolbarItems() as item>
${P.getPartCode(item).code}
</#list>
</#if>
};
CTRLTYPE=TOOLBAR
\ No newline at end of file
<#-- content -->
<#assign content>
showBusyIndicator={${ctrl.isShowBusyIndicator()?c}}
collapsechange={this.collapseChange}
mode={this.mode}
selectTheme={this.selectTheme}
isDefaultPage={this.isDefaultPage}
defPSAppView={this.defPSAppView}
</#assign>
<#ibizinclude>
../@MACRO/HTML/DEFAULT.html.ftl
</#ibizinclude>
\ No newline at end of file
/*** BRGIN:菜单样式 ***/
.app-app-menu {
overflow: auto;
height: calc(100% - 58px);
> .el-menu {
border-right: 0;
.el-menu-item {
.ivu-badge {
.ivu-badge-count {
box-shadow: 0 0 0 0px #fff;
}
}
}
.el-submenu__title i, .el-menu-item i {
font-size: 16px;
width: 16px;
}
.el-menu-item, .el-submenu__title {
height: 36px;
font-size: 16px;
line-height: 32px;
}
.el-menu-item, .el-submenu, .el-menu {
border-top: 1px solid #fff;
}
> .el-menu-item, > .el-submenu > .el-submenu__title {
height: 40px;
line-height: 36px;
border-left: 4px solid transparent;
padding-left: 16px !important;
}
.app-menu-icon {
margin-right: 4px;
}
> .el-submenu {
> .el-menu {
> .el-menu-item, > .el-submenu > .el-submenu__title {
padding-left: 44px !important;
}
> .el-submenu {
> .el-menu {
> .el-menu-item, > .el-submenu > .el-submenu__title {
padding-left: 68px !important;
}
}
}
}
}
.active-icon {
font-size: 40px !important;
position: absolute;
right: 0;
line-height: 42px;
color: #fff !important;
display: none;
width: 24px !important;
overflow: hidden;
}
}
.ivu-divider-horizontal {
width: calc(100% - 32px);
min-width: calc(100% - 32px);
margin: 4px auto;
margin-bottom: 1px;
}
}
.app-popper-menu {
.el-menu-item, .el-submenu__title {
height: 36px;
font-size: 16px;
line-height: 36px;
}
> .el-menu-item, > .el-submenu > .el-submenu__title {
height: 40px;
line-height: 40px;
}
.el-menu-item {
.ivu-badge {
.ivu-badge-count {
box-shadow: 0 0 0 0px #fff;
}
}
}
.ivu-divider-horizontal {
width: calc(100% - 12px);
min-width: calc(100% - 12px);
margin: 4px auto;
margin-bottom: 1px;
}
}
<#ibizinclude>
../@MACRO/CSS/DEFAULT.less.ftl
</#ibizinclude>
\ No newline at end of file
此差异已折叠。
CTRLTYPE=APPMENU
\ No newline at end of file
<#-- content -->
<#assign content>
showBusyIndicator={${ctrl.isShowBusyIndicator()?c}}
</#assign>
<#ibizinclude>
../@MACRO/HTML/DEFAULT.html.ftl
</#ibizinclude>
\ No newline at end of file
<#ibizinclude>
../@MACRO/CSS/DEFAULT.less.ftl
</#ibizinclude>
\ No newline at end of file
<#assign render_block>
/**
* 绘制父项处理
*
* @param {*} item
* @param {any[]} items
* @returns
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
public subItemsRender(item: any, items: any[]) {
return (
<card bordered={false} dis-hover={true}>
<p slot='title' on-click={() => this.select(item.name, [item.name])}>
<span>
{
!Object.is(item.icon, '') ? <i class={item.icon}></i> :
!Object.is(item.iconcls, '') ? <i class={item.iconcls}></i> :
<i class='fa fa-cogs'></i>
}
</span>&nbsp;&nbsp;
<span>{this.$t('app.menus.${ctrl.codeName?lower_case}.' + item.name)}</span>
</p>
<p style={{ display: 'flex' }}>
{items.map((_item: any) => {
if (_item.items && Array.isArray(_item.items)) {
return this.subItemsRender(_item, _item.items);
} else {
return this.subItemRender(_item);
}
})}
</p>
</card>
)
}
/**
* 绘制子节点
*
* @param {*} item
* @returns
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
public subItemRender(item: any) {
const style = {
width: '120px',
height: '120px',
marginRight: '10px',
justifyContent: 'center',
alignItems: 'center',
display: 'flex',
textAlign: 'center',
wordBreak: 'break-all',
cursor: 'pointer',
}
return (
<card style={style} padding={0} >
<div on-click={() => this.select(item.name, [item.name])}>
<span>
{
!Object.is(item.icon, '') ? <i class={item.icon}></i> :
!Object.is(item.iconcls, '') ? <i class={item.iconcls}></i> :
<i class='fa fa-cogs'></i>
}
</span>
<h3>{this.$t('app.menus.${ctrl.codeName?lower_case}.' + item.name)}</h3>
</div>
</card>
);
}
/**
* 绘制内容
*
* @returns
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
public render() {
return (
<row>
{this.menus.map((item: any) => {
if (item.items && Array.isArray(item.items)) {
return this.subItemsRender(item, item.items);
} else {
return this.subItemRender(item);
}
})}
</row>
);
}
</#assign>
<#ibizinclude>
../应用菜单/CONTROL.tsx.ftl
</#ibizinclude>
\ No newline at end of file
CTRLTYPE=APPMENU#QUICKMENUBAR
\ No newline at end of file
<#ibizinclude>
../@MACRO/HTML/DEFAULT.html.ftl
</#ibizinclude>
\ No newline at end of file
<#ibizinclude>
../@MACRO/CSS/DEFAULT.less.ftl
</#ibizinclude>
\ No newline at end of file
import { Vue, Component, Provide } from 'vue-property-decorator';
@Component({})
export default class ${view.codeName} extends Vue {
public render() {
return <div>未实现</div>;
}
}
CTRLTYPE=REPORTPANEL
\ No newline at end of file
<#ibizinclude>
../@MACRO/HTML/DEFAULT.html.ftl
</#ibizinclude>
\ No newline at end of file
<#ibizinclude>
../@MACRO/CSS/DEFAULT.less.ftl
</#ibizinclude>
\ No newline at end of file
import { Vue, Component, Provide } from 'vue-property-decorator';
@Component({})
export default class ${view.codeName} extends Vue {
public render() {
return <div>未实现</div>;
}
}
CTRLTYPE=SEARCHBAR
\ No newline at end of file
<#assign handler = ctrl.getPSAjaxControlHandler() />
<#-- content -->
<#assign content>
loaddraftAction='loaddraft'
showBusyIndicator={${ctrl.isShowBusyIndicator()?c}}
<#if view.isExpandSearchForm??>
v-show={this.isExpandSearchForm}
</#if>
<#if handler.getPSAjaxHandlerActions()??>
<#list handler.getPSAjaxHandlerActions() as action>
<#if action.getPSDEAction()??>
${action.name?lower_case}Action='${action.getPSDEAction().getCodeName()?lower_case}'
</#if>
</#list>
</#if>
</#assign>
<#ibizinclude>
../@MACRO/HTML/DEFAULT.html.ftl
</#ibizinclude>
\ No newline at end of file
.ivu-tabs-no-animation>.ivu-tabs-content{
padding: 0 16px;
}
.ivu-card-head{
padding: 14px 0;
}
.app-search-form {
display: flex;
>.ivu-row {
flex-grow: 1;
}
.search_reset {
width: 100px;
margin-left: 10px;
height: 32px;
.el-button-group {
.el-button {
height: 32px;
}
>.el-button:not(:last-child) {
margin-right: 0px;
}
}
}
}
.app-search-form-flex {
height: 100%;
> .ivu-row {
height: 100%;
> .ivu-tabs {
height: 100%;
display: flex;
flex-direction: column;
> .ivu-tabs-content {
flex-grow: 1;
overflow: auto;
> .ivu-tabs-tabpane {
height: 100%;
}
}
}
}
}
.app-tabpanel-flex {
height: 100%;
> .ivu-tabs-content {
height: calc(100% - 52px);
> .ivu-tabs-tabpane {
height: 100%;
}
}
}
<#ibizinclude>
../@MACRO/CSS/DEFAULT.less.ftl
</#ibizinclude>
\ No newline at end of file
<#ibizinclude>
../@MACRO/CONTROL/LANGBASE.tsx.ftl
</#ibizinclude>
<i-button type="primary" on-click={($event: any) => this.${item.getName()}_click($event)}
style="<#if item.getHeight() gt 0>height: ${item.getHeight()?c}px;</#if><#if item.getWidth() gt 0>width: ${item.getWidth()?c}px;</#if>">
<#if item.getPSSysImage()??><#assign img=item.getPSSysImage()><#if img.getCssClass()?? && (img.getCssClass()?length gt 0)><i class="${img.getCssClass()}"></i></#if></#if>
<#if item.isShowCaption()><span >{<#if langbase??>this.$t('${langbase}.details.${item.name}')<#else>'${item.getCaption()}'</#if>}</span></#if>
</i-button>
\ No newline at end of file
<#assign dritem = item.getPSDEDRItem()>
<app-form-druipart formState={this.formState} paramitem='<#if item.getParamItem()??>${item.getParamItem()}<#else>srfkey</#if>'
parentdata={<#if dritem.getParentDataJO?? && dritem.getParentDataJO()??>${dritem.getParentDataJO()}<#else>{}</#if>}
refviewtype='<#if item.getPSAppView()?? && item.getPSAppView().getPSViewType()??>${item.getPSAppView().getPSViewType().getId()}</#if>'
refreshitems='<#if item.getRefreshItems()??>${item.getRefreshItems()}</#if>'
ignorefieldvaluechange={this.ignorefieldvaluechange}
viewname='${srffilepath2(item.getPSAppView().codeName)}' data={JSON.stringify(this.data)} style="<#if item.getPSLayoutPos()?? && item.getPSLayoutPos().getLayout() == "FLEX">height: 100%</#if><#if item.getContentHeight() == 0><#if item.getPSAppView().getHeight() gt 0>height:${item.getPSAppView().getHeight()?c}px</#if><#else>height:${item.getContentHeight()?c}px</#if>;overflow: auto;">
</app-form-druipart>
<#if !item.isHidden()>
<#ibizinclude>
../@MACRO/CONTROL/LANGBASE.tsx.ftl
</#ibizinclude>
<app-form-item name='${item.name}' itemRules={JSON.stringify(this.rules.${item.name})} class='<#if item.getPSSysCss?? && item.getPSSysCss()??>${item.getPSSysCss().getCssName()}</#if>' caption={<#if langbase??>this.$t('${langbase}.details.${item.name}')<#else>'${item.getCaption()}'</#if>} uiStyle='${item.getDetailStyle()}' labelWidth={${item.getLabelWidth()?c}} isShowCaption={${item.isShowCaption()?c}} error={this.detailsModel.${item.name}.error} isEmptyCaption={${item.isEmptyCaption()?c}} labelPos='${item.getLabelPos()}'>
<#if item.isCompositeItem()>
<#assign formitems=item.getPSDEFormItems()>
<app-range-editor v-model={this.data.${item.name}} activeData={this.data} disabled={this.detailsModel.${item.name}.disabled} name="${item.name}" editorType="${item.getEditorType()}" format="${item.getEditorParam("TIMEFMT","")}" refFormItem={[<#list formitems as formitem><#if formitem_index gt 0>,</#if>'${formitem.name}'</#list>]} on-formitemvaluechange={this.onFormItemValueChange} style="${item.getEditorCssStyle()}"></app-range-editor>
<#else>
${P.getEditorCode(item, "EDITOR.tsx").code}
</#if>
</app-form-item>
</#if>
\ No newline at end of file
<#assign content>
<#list item.getPSDEFormDetails() as formmenber>
<#if !(formmenber.isHidden?? && formmenber.isHidden())>
<#ibizinclude>
../@MACRO/CONTROL/FORM_MEMBER_LAYOUT.tsx.ftl
</#ibizinclude>
</#if>
</#list>
</#assign>
<#if item.getPSLayout()?? && item.getPSLayout().getLayout() == "FLEX">
<#assign pageLayout = item.getPSLayout()>
<div style="height: 100%;display: flex;<#if pageLayout.getDir()!="">flex-direction: ${pageLayout.getDir()};</#if><#if pageLayout.getAlign()!="">justify-content: ${pageLayout.getAlign()};</#if><#if pageLayout.getVAlign()!="">align-items: ${pageLayout.getVAlign()};</#if>">
${content}
</div>
<#else>
${content}
</#if>
\ No newline at end of file
<#ibizinclude>
../@MACRO/CONTROL/LANGBASE.tsx.ftl
</#ibizinclude>
<app-form-group layoutType="<#if item.getPSLayoutPos()??>${item.getPSLayoutPos().getLayout()}</#if>" class='<#if item.getPSSysCss?? && item.getPSSysCss()??> ${item.getPSSysCss().getCssName()}</#if>' uiActionGroup={this.detailsModel.${item.name}.uiActionGroup} on-groupuiactionclick={($event:any) => this.groupUIActionClick($event)} caption={<#if langbase??>this.$t('${langbase}.details.${item.name}')<#else>'${item.getCaption()}'</#if>} isShowCaption={${item.isShowCaption()?c}} uiStyle={'${item.getDetailStyle()}'} titleBarCloseMode={${item.getTitleBarCloseMode()}} isInfoGroupMode={${item.isInfoGroupMode()?c}}>
<#assign content>
<#list item.getPSDEFormDetails() as formmenber>
<#if !(formmenber.isHidden?? && formmenber.isHidden())>
<#ibizinclude>
../@MACRO/CONTROL/FORM_MEMBER_LAYOUT.tsx.ftl
</#ibizinclude>
</#if>
</#list>
</#assign>
<#if item.getPSLayout()?? && item.getPSLayout().getLayout() == "FLEX">
<#assign pageLayout = item.getPSLayout()>
<div style="height: 100%;display: flex;<#if pageLayout.getDir()!="">flex-direction: ${pageLayout.getDir()};</#if><#if pageLayout.getAlign()!="">justify-content: ${pageLayout.getAlign()};</#if><#if pageLayout.getVAlign()!="">align-items: ${pageLayout.getVAlign()};</#if>">
${content}
</div>
<#else>
<row>
${content}
</row>
</#if>
</app-form-group>
\ No newline at end of file
<div style="height:${item.getContentHeight()}px;">${item.getIFrameUrl()}</div>
\ No newline at end of file
<#if item.getLogicType() == 'GROUP'><#if item.isNotMode()>!(</#if><#if item.getPSDEFDLogics()??><#list item.getPSDEFDLogics() as subLogic><#if subLogic_index gt 0><#if item.getGroupOP() == 'AND'> && </#if><#if item.getGroupOP() == 'OR'> || </#if></#if>${P.getPartCode(subLogic, 'DETAIL_LOGIC').code}</#list></#if><#if item.isNotMode()>)</#if><#elseif item.getLogicType() == 'SINGLE'>this.$util.testCond(_${item.getDEFDName()?lower_case}, '${item.getPSDBValueOPId()}', '${item.getValue()}')</#if>
\ No newline at end of file
<#ibizinclude>
../@MACRO/CONTROL/LANGBASE.tsx.ftl
</#ibizinclude>
<#assign detail>caption: '${item.getCaption()}', detailType: '${item.getDetailType()}', name: '${item.getName()}', visible: <#if item.getPSDEFDGroupLogic('PANELVISIBLE')??>false<#else>true</#if>, isShowCaption: ${item.isShowCaption()?c}, form: this</#assign>
<#if item.getDetailType() == 'BUTTON'>
new FormButtonModel({ ${detail}<#if item.getPSUIAction()??><#assign uiaction=item.getPSUIAction()>, uiaction: { type: '${uiaction.getUIActionType()}',
tag: '${uiaction.getUIActionTag()}'<#if (uiaction.getActionTarget()!="")>, actiontarget: '${uiaction.getActionTarget()}'</#if> }</#if> })
<#elseif item.getDetailType() == 'DRUIPART'>
new FormDRUIPartModel({ ${detail} })
<#elseif item.getDetailType() == 'FORMITEM'>
new FormItemModel({ ${detail}, disabled: false, enableCond: ${item.getEnableCond()?c} })
<#elseif item.getDetailType() == 'FORMPAGE'>
new FormPageModel({ ${detail} })
<#elseif item.getDetailType() == 'FORMPART'>
new FormPartModel({ ${detail} })
<#elseif item.getDetailType() == 'GROUPPANEL'>
new FormGroupPanelModel({ ${detail}, uiActionGroup: { caption: '<#if item.getPSUIActionGroup()??>${item.getPSUIActionGroup().getName()}</#if>', langbase: '<#if langbase??>${langbase}</#if>', extractMode: '<#if item.getActionGroupExtractMode?? && item.getActionGroupExtractMode()??>${item.getActionGroupExtractMode()}<#else>ITEM</#if>', details: [<#if item.getPSUIActionGroup()??><#list item.getPSUIActionGroup().getPSUIActionGroupDetails() as uadetails><#if uadetails_index gt 0>, </#if>{ name: '${item.getName()}_${uadetails.getName()}', caption: '${uadetails.getPSUIAction().getCaption()}', uiactiontag: '${uadetails.getPSUIAction().getUIActionTag()?lower_case}'<#if uadetails.getPSUIAction().getPSSysImage()??>, <#assign viewimg=uadetails.getPSUIAction().getPSSysImage()/><#if viewimg.getCssClass() != ''>icon: '${viewimg.getCssClass()}'<#else>img: '${viewimg.getImagePath()}'</#if></#if> }</#list></#if>] } })
<#elseif item.getDetailType() == 'IFRAME'>
new FormIFrameModel({ ${detail} })
<#elseif item.getDetailType() == 'RAWITEM'>
new FormRowItemModel({ ${detail} })
<#elseif item.getDetailType() == 'TABPAGE'>
new FormTabPageModel({ ${detail} })
<#elseif item.getDetailType() == 'TABPANEL'>
new FormTabPanelModel({ ${detail}, tabPages: [<#list item.getPSDEFormTabPages() as formmenber><#if formmenber_index gt 0>, </#if>{ name: '${formmenber.name}', index: ${formmenber_index}, visible: <#if formmenber.getPSDEFDGroupLogic('PANELVISIBLE')??>false<#else>true</#if> }</#list>] })
<#elseif item.getDetailType() == 'USERCONTROL'>
new FormUserControlModel({ ${detail} })
</#if>
\ No newline at end of file
<#if item.render??>
${item.render.code}
<#else>
<div class="<#if item.getPSSysCss()??>${item.getPSSysCss().getCssName()}</#if>" style="<#if item.getRawContentHeight() gt 0>height: ${item.getRawContentHeight()?c}px;</#if><#if item.getRawContentWidth() gt 0>width: ${item.getRawContentWidth()?c}px;</#if>">
${item.getRawContent()}
</div>
</#if>
\ No newline at end of file
<#assign content>
<#list item.getPSDEFormDetails() as formmenber>
<#if !(formmenber.isHidden?? && formmenber.isHidden())>
<#ibizinclude>
../@MACRO/CONTROL/FORM_MEMBER_LAYOUT.tsx.ftl
</#ibizinclude>
</#if>
</#list>
</#assign>
<#if item.getPSLayout()?? && item.getPSLayout().getLayout() == "FLEX">
<#assign pageLayout = item.getPSLayout()>
<div style="height: 100%;display: flex;<#if pageLayout.getDir()!="">flex-direction: ${pageLayout.getDir()};</#if><#if pageLayout.getAlign()!="">justify-content: ${pageLayout.getAlign()};</#if><#if pageLayout.getVAlign()!="">align-items: ${pageLayout.getVAlign()};</#if>">
${content}
</div>
<#else>
${content}
</#if>
\ No newline at end of file
<#ibizinclude>
../@MACRO/CONTROL/LANGBASE.tsx.ftl
</#ibizinclude>
<tabs animated={false} name='${item.name}' v-show={this.detailsModel.${item.name}.visible} class='<#if item.getPSSysCss?? && item.getPSSysCss()??>${item.getPSSysCss().getCssName()}</#if><#if item.getPSLayoutPos()?? && item.getPSLayoutPos().getLayout() == "FLEX"> app-tabpanel-flex</#if>'
value={this.detailsModel.${item.name}.activiedPage} on-on-click={($event: any) => this.detailsModel.${item.name}.clickPage($event)}>
<#list item.getPSDEFormTabPages() as formmenber>
{
this.detailsModel.${formmenber.name}.visible ?
<tab-pane name='${formmenber.name}' index={${formmenber_index}} tab='${item.name}' class='<#if formmenber.getPSSysCss?? && formmenber.getPSSysCss()??>${formmenber.getPSSysCss().getCssName()}</#if>'
label={
(h: any) => {
return (
<span class='caption<#if formmenber.getLabelPSSysCss?? && formmenber.getLabelPSSysCss()??> ${formmenber.getLabelPSSysCss().getCssName()}</#if>'>
<#if formmenber.getPSSysImage()??>
<span>
<#assign sysimage = formmenber.getPSSysImage()/>
<#if sysimage.getImagePath() == "">
<i class='${sysimage.getCssClass()}'></i>&nbsp;
<#else>
<img src='${sysimage.getImagePath()}'/>&nbsp;
</#if>
</span>
</#if>
{<#if langbase??>this.$t('${langbase}.details.${formmenber.name}')<#else>'${formmenber.getCaption()}'</#if>}
</span>
);
}
}>
${P.getPartCode(formmenber).code}
</tab-pane>
: ''
}
</#list>
</tabs>
\ No newline at end of file
<#if item.render??>
${item.render.code}
<#else>
表单自定义部件没有定义插件
</#if>
\ No newline at end of file
<#ibizinclude>
../@MACRO/CONTROL/LANGBASE.tsx.ftl
</#ibizinclude>
<i-form props={{ model: this.data }} class='app-search-form<#if ctrl.getLayoutMode() == "FLEX"> app-search-form-flex</#if><#if ctrl.getPSSysCss()??> ${ctrl.getPSSysCss().getCssName()}</#if><#if ctrl.isInfoFormMode?? && ctrl.isInfoFormMode()> info-form-mode</#if>' ref='${ctrl.name}'>
<input style={{ display: 'none' }}></input>
<row >
<#if ctrl.isNoTabHeader()>
<#list ctrl.getPSDEFormPages() as formmenber>
${P.getPartCode(formmenber).code}
</#list>
<#else>
<tabs animated={false} name='${ctrl.name}' value={this.detailsModel.${ctrl.name}.activiedPage}
on-on-click={($event: any) => this.detailsModel.${ctrl.name}.clickPage($event)}>
<#list ctrl.getPSDEFormPages() as formpage>
{
this.detailsModel.${formpage.name}.visible ?
<tab-pane name='${formpage.name}' index={${formpage_index}} tab='${ctrl.name}' class='<#if formpage.getPSSysCss?? && formpage.getPSSysCss()??>${formpage.getPSSysCss().getCssName()}</#if>'
label={
(h: any) => {
return (
<span class='caption<#if formpage.getLabelPSSysCss?? && formpage.getLabelPSSysCss()??> ${formpage.getLabelPSSysCss().getCssName()}</#if>'>
<#if formpage.getPSSysImage()??>
<span>
<#assign sysimage = formpage.getPSSysImage()/>
<#if sysimage.getImagePath() == "">
<i class='${sysimage.getCssClass()}'></i>&nbsp;
<#else>
<img src='${sysimage.getImagePath()}'/>&nbsp;
</#if>
</span>
</#if>
{<#if langbase??>this.$t('${langbase}.details.${formpage.name}')<#else>'${formpage.getCaption()}'</#if>}
</span>
);
}
}>
${P.getPartCode(formpage).code}
</tab-pane>
: ''
}
</#list>
</tabs>
</#if>
</row>
<#if ctrl.getSearchButtonStyle() == 'DEFAULT'>
<el-dropdown
class='search_reset'
size='small'
split-button={true}
trigger='click'
on-click={() => this.onSearch()}
on-command={() => this.onReset()}>
{this.$t('app.searchButton.search')}
<el-dropdown-menu slot='dropdown'>
<el-dropdown-item>{this.$t('app.searchButton.reset')}</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</#if>
<#if ctrl.getSearchButtonStyle() == 'SEARCHONLY'>
<el-button class='search_reset' style={{ width: 'auto' }} size='small' on-click={() => this.onSearch()}>{this.$t('app.searchButton.search')}</el-button>
</#if>
</i-form>
\ No newline at end of file
<#list ctrl.getAllPSDEFormDetails() as formdetail>
<#if formdetail.getPSDEFDGroupLogic('ITEMBLANK')??>
<#assign ITEMBLANK = formdetail.getPSDEFDGroupLogic('ITEMBLANK')/>
if (Object.is(name, '')<#if ITEMBLANK.getRelatedDetailNames()??><#list ITEMBLANK.getRelatedDetailNames() as detailName> || Object.is(name, '${detailName}')</#list></#if>) {
let ret = true;
<#if ITEMBLANK.getRelatedDetailNames()??>
<#list ITEMBLANK.getRelatedDetailNames() as detailName>
const _${detailName} = this.data.${detailName};
</#list>
</#if>
if (${P.getPartCode(ITEMBLANK, 'DETAIL_LOGIC').code}) {
ret = false;
}
this.rules.${formdetail.name}.some((rule: any) => {
if (rule.hasOwnProperty('required')) {
rule.required = ret;
}
return false;
});
}
</#if>
<#if formdetail.getPSDEFDGroupLogic('ITEMENABLE')??>
<#assign ITEMENABLE = formdetail.getPSDEFDGroupLogic('ITEMENABLE')/>
if (Object.is(name, '')<#if ITEMENABLE.getRelatedDetailNames()??><#list ITEMENABLE.getRelatedDetailNames() as detailName> || Object.is(name, '${detailName}')</#list></#if>) {
let ret = false;
<#if ITEMENABLE.getRelatedDetailNames()??>
<#list ITEMENABLE.getRelatedDetailNames() as detailName>
const _${detailName} = this.data.${detailName};
</#list>
</#if>
if (${P.getPartCode(ITEMENABLE, 'DETAIL_LOGIC').code}) {
ret = true;
}
this.detailsModel.${formdetail.name}.setDisabled(!ret);
}
</#if>
<#if formdetail.getPSDEFDGroupLogic('PANELVISIBLE')??>
<#assign PANELVISIBLE = formdetail.getPSDEFDGroupLogic('PANELVISIBLE')/>
if (Object.is(name, '')<#if PANELVISIBLE.getRelatedDetailNames()??><#list PANELVISIBLE.getRelatedDetailNames() as detailName> || Object.is(name, '${detailName}')</#list></#if>) {
let ret = false;
<#if PANELVISIBLE.getRelatedDetailNames()??>
<#list PANELVISIBLE.getRelatedDetailNames() as detailName>
const _${detailName} = this.data.${detailName};
</#list>
</#if>
if (${P.getPartCode(PANELVISIBLE, 'DETAIL_LOGIC').code}) {
ret = true;
}
this.detailsModel.${formdetail.name}.setVisible(ret);
}
</#if>
</#list>
\ No newline at end of file
此差异已折叠。
CTRLTYPE=SEARCHFORM
\ No newline at end of file
<#ibizinclude>
../@MACRO/HTML/DRTAB.html.ftl
</#ibizinclude>
\ No newline at end of file
.app-dr-tab {
height: 100%;
>.ivu-tabs-bar {
margin-bottom: 0px;
}
>.ivu-tabs-content {
height: calc(100% - 36px);
padding: 0px !important;
.ivu-tabs-tabpane {
height: 100%;
.main-data {
width: 100%;
height: 100%;
}
}
}
}
<#ibizinclude>
../@MACRO/CSS/DEFAULT.less.ftl
</#ibizinclude>
\ No newline at end of file
<#ibizinclude>
../@MACRO/CONTROL/CONTROL_HEADER.tsx.ftl
</#ibizinclude>
/**
* 获取多项数据
*
* @returns {any[]}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
public getDatas(): any[] {
return this.items;
}
/**
* 获取单项树
*
* @returns {*}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
public getData(): any {
return this.selection;
}
/**
* 数据选中项
*
* @type {*}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
public selection: any = {};
/**
* 父数据
*
* @private
* @type {*}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
private parentData: any = {};
/**
* 关系栏数据项
*
* @type {any[]}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
public items: any[] = [
<#list ctrl.getRootItem().getAllItems() as dritem>
{
index: ${dritem_index?c},
id: '${dritem.getId()?lower_case}',
name: '${dritem.getId()?lower_case}',
text: '${dritem.text}',
disabled: false,
},
</#list>
];
/**
* 生命周期
*
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
public created(): void {
if (this.viewState) {
this.viewStateEvent = this.viewState.subscribe(({ tag, action, data }) => {
if (!Object.is(tag, this.name)) {
return;
}
if (Object.is('state', action)) {
if (data.srfkey && !Object.is(data.srfkey, '')) {
Object.assign(this.parentData, { srfparentkey: data.srfkey });
}
const state = !this.parentData.srfparentkey || (this.parentData.srfparentkey && Object.is(this.parentData.srfparentkey, '')) ? true : false;
this.setItemDisabled(state);
}
});
}
this.$nextTick(() => {
this.$emit('selectionchange', [this.items[0]]);
});
}
/**
* vue 生命周期
*
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
public destroyed() {
if (this.viewStateEvent) {
this.viewStateEvent.unsubscribe();
}
<#if destroyed_block??>
${destroyed_block}
</#if>
}
/**
* 获取关系项
*
* @private
* @param {*} [arg={}]
* @returns {*}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
private getDRTabItem(arg: any = {}): any {
let expmode = arg.nodetype.toUpperCase();
if (!expmode) {
expmode = '';
}
<#list ctrl.getPSAppViewRefs() as item>
<#if (item.getName()?index_of("DRITEM:")==0)>
<#assign refview = item.getRefPSAppView()>
if (Object.is(expmode, '${item.getName()?substring(7)}')) {
return {
viewname: '${srffilepath2(refview.codeName)}',
parentdatajo: <#if item.getParentDataJO()??>${item.getParentDataJO()}<#else>{},</#if>
};
}
</#if>
</#list>
return undefined;
}
/**
* 设置关系项状态
*
* @param {boolean} state
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
public setItemDisabled(state: boolean): void {
this.items.forEach((item: any) => {
if (Object.is(item.name, 'form')) {
item.disabled = false;
} else {
item.disabled = state;
}
});
}
/**
* 获取数据项
*
* @private
* @param {string} id
* @returns {*}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
private getItem(id: string): any {
const arr: any[] = this.items.filter((_item: any) => Object.is(_item.id, id));
if (arr) {
return arr[0];
}
return null;
}
/**
* 选中节点
*
* @param {*} $event
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
public tabPanelClick($event: any): void {
const item = this.getItem($event);
if (Object.is(item.id, this.selection.id)) {
return;
}
this.$emit('selectionchange', [item]);
const refview = this.getDRTabItem({ nodetype: item.id });
this.selection = {};
const params: any = { ...JSON.parse(JSON.stringify(this.parentData)) };
if (refview && refview.parentdatajo) {
Object.assign(params, refview.parentdatajo);
Object.assign(this.selection, { view: { viewname: refview.viewname }, data: params });
}
Object.assign(this.selection, item);
}
<#list ctrl.getRootItem().getAllItems() as dritem>
/**
* 绘制 ${dritem.text} 分页
*
* @param {string} id
* @returns
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
public render_${dritem.getId()?lower_case}(id: string) {
const arr: any[] = this.items.filter((_item: any) => Object.is(_item.id, id));
const [item] = arr;
return (
<tab-pane index={item.index} name={item.name} tab={this.name} class='' disabled={item.disabled}
label={
(h: any) => {
return (
<span class='caption'>
{item.text}
</span>
);
}
}>
<#if dritem.getId()?lower_case == 'form'>
<div class='main-data'>
{this.$slots.default}
</div>
<#else>
{
(
Object.is(this.selection.id, '${dritem.getId()?lower_case}') &&
this.selection.view &&
!Object.is(this.selection.view.viewname, '')
) ?
this.$createElement(this.selection.view.viewname, {
class: {
viewcontainer2: true,
},
props: {
viewdata: JSON.stringify({ srfparentdata: this.selection.data }),
},
key: this.$util.createUUID(),
})
: ''
}
</#if>
</tab-pane>
);
}
</#list>
/**
* 绘制内容
*
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
public render() {
return (
<tabs animated={false} class='app-dr-tab' name={this.name} on-on-click={($event: any) => this.tabPanelClick($event)}>
<#list ctrl.getRootItem().getAllItems() as dritem>
{this.render_${dritem.getId()?lower_case}('${dritem.getId()?lower_case}')}
</#list>
</tabs>
);
}
<#ibizinclude>
../@MACRO/CONTROL/CONTROL_BOTTOM.tsx.ftl
</#ibizinclude>
CTRLTYPE=DRTAB
\ No newline at end of file
<#-- ctrl document -->
<view_${ctrl.getName()}
viewState={this.viewState}
loadAction='get'
name='${ctrl.name}'
ref='${ctrl.name}'
<#if ctrl.getHookEventNames()??>
<#list ctrl.getHookEventNames() as eventName>
on-${eventName?lower_case}={($event: any) => this.${ctrl.name}_${eventName?lower_case}($event)}
</#list>
</#if>
on-closeview={($event: any) => this.closeView($event)}>
<#if view.hasPSControl('form')>
${P.getCtrlCode('form', 'CONTROL.html').code}
</#if>
</view_${ctrl.getName()}>
\ No newline at end of file
.app-dr-bar {
height: 100%;
width: 100%;
background: white;
>.ivu-layout-sider {
background: white;
border-right: solid 1px #e6e6e6;
margin-bottom: 10px;
>.ivu-layout-sider-children {
overflow: auto;
>.el-menu {
height: 100%;
border-right: solid 0px #e6e6e6;
}
> .el-menu {
margin-top: -1px;
border-right: 0;
.el-submenu__title i, .el-menu-item i {
font-size: 14px;
width: 14px;
}
.el-menu-item, .el-submenu__title {
height: 36px;
font-size: 14px;
line-height: 32px;
> img {
height: 18px;
width: 18px;
margin-top: -2px;
}
}
.el-menu-item, .el-submenu, .el-menu {
border-top: 1px solid #fff;
}
.el-menu-item, .el-submenu > .el-submenu__title {
height: 40px;
line-height: 36px;
border-left: 3px solid transparent;
padding-left: 16px !important;
}
.el-menu-item.is-active {
background: #e9e9e9 !important;
color: #666666 !important;
border-left: 3px solid #3fd5c0;
i {
color: #666666;
}
}
// .app-menu-icon {
// margin-right: 3px;
// }
> .el-submenu {
> .el-menu {
> .el-menu-item, > .el-submenu > .el-submenu__title {
padding-left: 38px !important;
}
> .el-submenu {
> .el-menu {
> .el-menu-item, > .el-submenu > .el-submenu__title {
padding-left: 58px !important;
}
}
}
}
}
}
}
}
>content {
height: 100%;
.main-data {
width: 100%;
height: 100%;
padding: 0 15px;
}
}
}
<#ibizinclude>
../@MACRO/CSS/DEFAULT.less.ftl
</#ibizinclude>
\ No newline at end of file
此差异已折叠。
CTRLTYPE=DRBAR
\ No newline at end of file
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册