<template>
<Drawer
class="sider-drawer"
:class-name="getClass()"
placement="left"
:closable="false"
:mask="false"
width="200"
v-model="leftDrawerVisiable"
>
<div class="context-menu-drag">
<div class="context-menu__list">
<div class="context-menu__list__header">
<div class="header__menuicon">
<Icon type="md-apps" />
</div>
<div class="header__content">
<span>{{ $t('components.contextmenudrag.allapp') }}</span>
</div>
<div class="header__forward">
<Icon type="ios-arrow-forward" />
</div>
</div>
<div class="context-menu__list__content">
<div @click="skipTo(item)" class="content__item" v-for="item in list" :key="item.id">
<span class="icon">
<Icon type="ios-star" />
</span>
<span class="caption">{{ item.fullName ? item.fullName : item.label }}</span>
</div>
</div>
</div>
</div>
</Drawer>
</template>
<script lang="ts">
import draggable from 'vuedraggable';
import { Vue, Component, Watch, Prop, Model } from 'vue-property-decorator';
import { AppServiceBase, DataEntityService, LogUtil } from 'ibiz-core';
// tslint:disable-next-line:max-classes-per-file
@Component({
components: {
draggable,
},
})
export default class ContextMenuDrag extends Vue {
public panelShow: boolean = true;
/**
* 抽屉菜单状态
*
* @memberof ContextMenuDrag
*/
@Prop() public contextMenuDragVisiable?: boolean;
/**
* 视图样式
*
* @memberof ContextMenuDrag
*/
@Prop() public viewStyle!: string;
/**
* 拖拽列表配置对象
*
* @returns
* @memberof ContextMenuDrag
*/
@Model('change') public dragOptions: any;
/**
* 左侧飘窗状态
*
* @returns
* @memberof ContextMenuDrag
*/
public leftDrawerVisiable: boolean = false;
/**
* 全部应用数据
*
* @returns
* @memberof ContextMenuDrag
*/
public list: Array<any> = [];
/**
* 拖拽列表
*
* @returns
* @memberof ContextMenuDrag
*/
public drag: boolean = false;
/**
* 拖拽列表配置项
*
* @returns
* @memberof ContextMenuDrag
*/
get dragOptionsVal() {
return {
animation: 200,
group: 'description',
disabled: false,
ghostClass: 'ghost',
};
}
/**
* 获取绑定样式
*
* @memberof ContextMenuDrag
*/
getClass() {
if (this.viewStyle === 'STYLE2' || this.viewStyle === 'STYLE3') {
return 'style-top';
} else {
return 'default-top';
}
}
/**
* 实体服务对象
*
* @protected
* @type {DataEntityService}
* @memberof ContextMenuDrag
*/
protected entityService: DataEntityService = new DataEntityService();
/**
* 监听抽屉菜单状态
*
* @returns
* @memberof ContextMenuDrag
*/
@Watch('contextMenuDragVisiable')
public onVisiableChange(newVal: any, oldVal: any) {
this.leftDrawerVisiable = newVal;
}
/**
* 跳转到应用
*
* @returns
* @memberof ContextMenuDrag
*/
public skipTo(item: any) {
if (item.addr) {
window.location.href = item.addr;
} else {
this.$info(this.$t('components.contextmenudrag.nofind') as string,'skipTo');
}
}
/**
* vue 生命周期
*
* @returns
* @memberof ContextMenuDrag
*/
mounted() {
const get: Promise<any> = this.entityService.getAllApp(null, {});
get.then((response: any) => {
if (response) {
this.handleAppList(response?.data?.model);
}
}).catch((error: any) => {
LogUtil.warn(this.$t('components.contextmenudrag.error'));
});
}
/**
* 处理应用列表
*
* @memberof ContextMenuDrag
*/
public handleAppList(data:any){
if(!data && data.length === 0){
this.list = [];
}
const Environment: any = AppServiceBase.getInstance().getAppEnvironment();
let protalData:any = {fullName:this.$t('components.contextmenudrag.portlet'),addr:Environment.portalUrl};
this.list.push(protalData);
this.list.push(...data);
}
}
</script>