import { AppDefaultViewLayout } from "../app-default-view-layout/app-default-view-layout";
import { Component } from 'vue-property-decorator';
import { Util, AppServiceBase } from "ibiz-core";
import { AppLoadingService } from "../../../../app-service/loading-service/app-loading-service";
import { IPSAppIndexView } from "@ibiz/dynamic-model-api";
@Component({})
export class AppDefaultIndexViewLayout extends AppDefaultViewLayout {
/**
* 应用loading服务
*
* @memberof AppLayout
*/
public appLoadingService = AppLoadingService.getInstance();
/**
* 当前应用是否为微应用
*
* @memberof AppDefaultIndexViewLayout
*/
public isMicroApp: boolean = false;
/**
* 初始化视图的绘制参数
*
* @memberof AppDefaultIndexViewLayout
*/
public initRenderOptions(opts: any = {}) {
this.renderOptions = {};
const { viewType, viewStyle, codeName } = this.viewInstance;
const viewClassNames: any = {
[`view-style-${viewStyle.toLowerCase()}`]: true,
'app-container': true,
[viewType?.toLowerCase()]: true,
[Util.srfFilePath2(codeName)]: true,
};
if (this.viewProxyMode) {
Object.assign(viewClassNames, { 'isproxy': true });
}
Object.assign(viewClassNames, opts);
if (this.viewInstance?.getPSSysCss?.()?.cssName) {
Object.assign(viewClassNames, { [this.viewInstance.getPSSysCss()?.cssName]: true });
}
// 应用首页菜单方向
if (this.viewInstance.mainMenuAlign) {
Object.assign(viewClassNames, { [`app-vc-menu--${this.viewInstance.mainMenuAlign.toLowerCase()}`]: true });
} else {
Object.assign(viewClassNames, { [`app-vc-menu--left`]: true });
}
// 应用首页tab/应用首页路由
if (Object.is(this.viewInstance.viewStyle, 'DEFAULT')) {
Object.assign(viewClassNames, { [`app-content--tab`]: true });
} else {
Object.assign(viewClassNames, { [`app-content--route`]: true });
}
this.$set(this.renderOptions, 'viewClassNames', viewClassNames);
}
/**
* 路由列表
*
* @memberof AppDefaultIndexViewLayout
*/
get routerList() {
return this.$store.state.historyPathList;
}
/**
* 路由键值
*
* @memberof AppDefaultIndexViewLayout
*/
get routerViewKey() {
let _this: any = this;
return _this.$route.fullPath;
}
/**
* 是否满屏
*
* @type {boolean}
* @memberof IndexViewBase
*/
public isFullScreen: boolean = false;
/**
* 菜单收缩变化
*
* @type {boolean}
* @memberof AppDefaultIndexViewLayout
*/
public collapseChange: boolean = false;
/**
* 抽屉状态
*
* @type {boolean}
* @memberof AppDefaultIndexViewLayout
*/
public contextMenuDragVisiable: boolean = false;
/**
* 容器挂载完成(重写)
*
* @memberof AppDefaultIndexViewLayout
*/
public containerMounted() {
if (this.viewProxyMode) {
super.containerMounted();
this.$emit('view-event', { viewname: this.viewInstance.name, action: 'viewIsMounted', data: true })
this.handleContainerPreEvent('onViewMounted').then((result: boolean) => {
if (!result) {
return;
}
if (this.viewState) {
this.viewState.next({ tag: 'appmenu', action: 'load', data: {} });
}
this.$emit('view-event', { viewName: this.viewInstance.codeName, action: 'viewIsInited', data: null });
})
}
}
/**
* 当前主题
*
* @memberof AppDefaultIndexViewLayout
*/
public selectTheme() {
let _this: any = this;
if (_this.$router.app.$store.state.selectTheme) {
return _this.$router.app.$store.state.selectTheme;
} else if (localStorage.getItem('theme-class')) {
return localStorage.getItem('theme-class');
} else {
return 'app-theme-default';
}
}
/**
* 获取当前语言环境
*
* @memberof AppDefaultIndexViewLayout
*/
public getSelectLanguage() { }
/**
* 菜单收缩
*
* @memberof AppDefaultIndexViewLayout
*/
public collapseMenus() {
if (this.$store.getters['getCustomParamByTag']('srffullscreen')) {
this.isFullScreen = !this.isFullScreen;
if (this.isFullScreen) {
this.collapseChange = true;
} else {
this.collapseChange = false;
}
} else {
this.collapseChange = !this.collapseChange;
}
this.$emit('onCollapseChange', this.collapseChange);
}
/**
* 是否显示标题栏
*
* @readonly
* @memberof AppDefaultViewLayout
*/
get showCaption() {
if (this.viewInstance && this.$parent && Util.isExist(this.viewInstance.showCaptionBar)) {
return this.viewInstance.showCaptionBar && !(this.$parent as any).noViewCaption
} else {
return true;
}
}
/**
* 初始化
*
* @memberof AppDefaultIndexViewLayout
*/
public created() {
document.getElementsByTagName('html')[0].className = this.selectTheme();
this.isFullScreen = Boolean(this.$store.getters['getCustomParamByTag']('srffullscreen'));
const microAppService = AppServiceBase.getInstance().getMicroAppService();
if (microAppService) {
this.isMicroApp = microAppService.getIsMicroApp();
}
}
/**
* 渲染左侧菜单样式
*
* @memberof AppDefaultIndexViewLayout
*/
public renderContentLeft() {
return (
<layout>
{
!this.isMicroApp ? <header class="app-header">
<div class="app-header__left" >
<div class="app-header__left__logo">
{(this.viewInstance as IPSAppIndexView).enableAppSwitch ? <span class="logo__menuicon" on-click={() => this.contextMenuDragVisiable = !this.contextMenuDragVisiable}><icon type="md-menu" /> </span> : null}
{(this.viewInstance as IPSAppIndexView).appIconPath ? <img class="logo__image" src={(this.viewInstance as IPSAppIndexView).appIconPath}></img> : null}
{this.showCaption ? <span class="logo__title">{this.model.srfCaption}</span> : null}
{(this.viewInstance as IPSAppIndexView).enableAppSwitch ? <context-menu-drag viewStyle={this.viewInstance.viewStyle} contextMenuDragVisiable={this.contextMenuDragVisiable}></context-menu-drag> : null}
</div>
{!this.collapseChange ? <i class="ivu-icon el-icon-s-fold" on-click={() => this.collapseMenus()}></i> : null}
{this.collapseChange ? <i class="ivu-icon el-icon-s-unfold" on-click={() => this.collapseMenus()}></i> : null}
{Object.is(this.viewInstance.viewStyle, 'STYLE4') ? <app-breadcrumb indexViewTag={this.viewInstance.codeName} /> : null}
</div>
<div class="app-header__right">
<app-header-menus />
{this.Environment.showLang && <app-lang title={this.model.srfTitle || this.model.srfCaption} />}
{this.Environment.showOrg && <app-orgsector />}
<app-user viewStyle={this.viewInstance.viewStyle} />
<app-message-popover />
<app-full-scren />
</div>
</header> : null
}
<layout class="app-content">
<sider class="app-content__left" width={this.isMicroApp ? 0 : this.isFullScreen ? 0 : this.collapseChange ? 68 : 200} hide-trigger value={this.collapseChange}>
{this.$slots.default}
</sider>
<content class="app-content__right" style={{'width':this.isMicroApp ? 'calc(100% - 0px)' : this.isFullScreen ? 'calc(100% - 0px)' : this.collapseChange ? 'calc(100% - 68px)' : 'calc(100% - 200px)'}}>
{Object.is(this.viewInstance.viewStyle, 'DEFAULT') ? <tab-page-exp style={{ display: this.isMicroApp ? 'none' : 'block' }} modelService={this.modelService}></tab-page-exp> : null}
<app-nav-pos enableCache={true}></app-nav-pos>
</content>
</layout>
</layout>
);
}
/**
* 渲染无菜单样式
*
* @memberof AppDefaultIndexViewLayout
*/
public renderContentOnly() {
return (
<layout style={{ 'height': '100vh' }}>
<header class="app-header">
<div class="app-header__left" >
<div class="app-header__left__logo">
{(this.viewInstance as IPSAppIndexView).enableAppSwitch ? <span class="logo__menuicon" on-click={() => this.contextMenuDragVisiable = !this.contextMenuDragVisiable}><icon type="md-menu" /> </span> : null}
{(this.viewInstance as IPSAppIndexView).appIconPath ? <img class="logo__image" src={(this.viewInstance as IPSAppIndexView).appIconPath}></img> : null}
{this.showCaption ? <span class="logo__title">{this.model.srfCaption}</span> : null}
{(this.viewInstance as IPSAppIndexView).enableAppSwitch ? <context-menu-drag viewStyle={this.viewInstance.viewStyle} contextMenuDragVisiable={this.contextMenuDragVisiable}></context-menu-drag> : null}
</div>
</div>
<div class="app-header-right">
<app-header-menus />
{ this.Environment.showLang && <app-lang title={this.model.srfTitle || this.model.srfCaption} style='font-size: 15px;padding: 0 10px;' />}
{ this.Environment.showOrg && <app-orgsector /> }
<app-user viewStyle={this.viewInstance.viewStyle} />
<app-message-popover />
<app-full-scren />
</div>
</header>
<layout class="app-content">
<sider class="app-content__left" hide-trigger value={this.collapseChange}>
{this.$slots.default}
</sider>
<content class='app-content__content'>
<app-nav-pos enableCache={true}></app-nav-pos>
</content>
</layout>
</layout>
);
}
/**
* 渲染顶部菜单样式
*
* @memberof AppDefaultIndexViewLayout
*/
public renderContentTop() {
return (
<layout>
<header class="app-header" >
<div class="app-header__left">
<div class="app-header__left__logo">
{(this.viewInstance as IPSAppIndexView).appIconPath ? <img class="logo__image" src={(this.viewInstance as IPSAppIndexView).appIconPath}></img> : null}
{this.showCaption ? <span class="logo__title">{this.model.srfCaption}</span> : null}
</div>
{this.$slots.default}
</div>
<div class="app-header__right">
<app-header-menus />
{this.Environment.showLang && <app-lang title={this.model.srfTitle || this.model.srfCaption}></app-lang>}
{this.Environment.showOrg && <app-orgsector></app-orgsector>}
<app-user viewStyle={this.viewInstance.viewStyle}></app-user>
<app-message-popover></app-message-popover>
<app-full-scren />
</div>
</header>
<content class={'app-content'} on-click={() => this.contextMenuDragVisiable = false}>
<tab-page-exp style={{ display: this.isMicroApp ? 'none' : 'block' }} modelService={this.modelService}></tab-page-exp>
<app-nav-pos enableCache={true}></app-nav-pos>
</content>
</layout>
);
}
/**
* 渲染中间菜单样式
*
* @memberof AppDefaultIndexViewLayout
*/
public renderContentMiddle() {
return (
<card disHover={true} bordered={false}>
{this.showCaption ? <div slot='title' class='app-header'>
<span class='app-header__caption'>{this.model.srfCaption}</span>
</div> : null}
<div class='app-content'>
{this.$slots.default}
</div>
</card>
);
}
/**
* 渲染分页导航菜单样式
*
* @return {*}
* @memberof AppDefaultIndexViewLayout
*/
public renderContentTabexpView() {
return (
<div class='app-content'>
{this.$slots.default}
</div>
);
}
/**
* 绘制内容
*
* @memberof AppDefaultIndexViewLayout
*/
public renderContent(): any {
return [
(Object.is(this.viewInstance.mainMenuAlign, "LEFT") || !this.viewInstance.mainMenuAlign) ? this.renderContentLeft() : null,
Object.is(this.viewInstance.mainMenuAlign, "TOP") ? this.renderContentTop() : null,
Object.is(this.viewInstance.mainMenuAlign, "CENTER") ? this.renderContentMiddle() : null,
Object.is(this.viewInstance.mainMenuAlign, 'TABEXP_LEFT') || Object.is(this.viewInstance.mainMenuAlign, 'TREEEXP') ? this.renderContentTabexpView() : null,
Object.is(this.viewInstance.mainMenuAlign, 'TABEXP_TOP') ? this.renderContentTabexpView() : null,
Object.is(this.viewInstance.mainMenuAlign, 'TABEXP_RIGHT') ? this.renderContentTabexpView() : null,
Object.is(this.viewInstance.mainMenuAlign, 'TABEXP_BOTTOM') ? this.renderContentTabexpView() : null,
Object.is(this.viewInstance.mainMenuAlign, "NONE") ? this.renderContentOnly() : null,
];
}
/**
* 绘制布局
*
* @memberof AppDefaultIndexViewLayout
*/
public render(h: any): any {
const { viewClassNames } = this.renderOptions;
return (
<div class={viewClassNames}>
{/* {(this.viewInstance as IPSAppIndexView)?.defaultPage && <div class="loading-bar" v-notification-signal={this.appLoadingService.isLoading}></div>} */}
<app-studioaction
viewInstance={this.viewInstance}
context={this.context}
viewparams={this.viewparams}
viewName={this.viewInstance.codeName.toLowerCase()}
viewTitle={this.model?.srfCaption} />
{this.viewIsInit ? (this.viewLayoutPanel && this.viewLayoutPanel.useDefaultLayout) ? this.renderContent() : this.renderViewLayoutPanel() : this.renderInitLoading()}
</div>
);
}
}