ttk-app-core
Version:
@ttk/recat enterprise develop framework
685 lines (632 loc) • 24.4 kB
JavaScript
import React from 'react'
import { Menu, Dropdown } from '@ttk/component'
import { action as MetaAction, AppLoader } from '@ttk/meta-engine';
import { fromJS } from 'immutable'
import { history } from 'edf-utils'
import config from './config'
import { fetch, environment } from 'edf-utils'
import female from './img/female_t.png'
import male from './img/male_t.png'
import other from './img/other_t.png'
import { requestFullscreen, exitFullscreen } from "./fullscreen"
class action {
constructor(option) {
this.metaAction = option.metaAction
this.config = config.current
this.webapi = this.config.webapi
}
onInit = ({ component, injections }) => {
this.component = component
this.injections = injections
injections.reduce('init')
//没有token跳转到登录
if (!sessionStorage.getItem('_accessToken')) {
this.component.props.onRedirect(this.config.goAfterLogout)
return
}
//更新皮肤
let skin = localStorage.getItem('skin') || '#1EB5AD'
if (skin != '#1EB5AD') {
this.toggleColor(skin)
}
//根据账号下企业list的情况做跳转
let availableOrg = sessionStorage.getItem('currentOrgStatus')
if (availableOrg == 1 || availableOrg == 2) {
this.metaAction.sf('data.headCtrl', false)
return
}
this.load()
//history增加
history.listen('ttk-edf-app-portal', this.listen)
}
//history增加
listen = (childApp, location, action) => {
const currentAppName = this.metaAction.gf('data.content.appName')
const targetAppName = childApp
if (!targetAppName) {
this.injections.reduce('closeAll')
return
}
if (targetAppName == currentAppName) {
return
}
//this.setContent('', targetAppName, {})
}
componentWillUnmount = () => {
history.unlisten('ttk-edf-app-portal', this.listen)
}
windowClick = (e) => {
if (!document.getElementById('ttk-edf-app-portal-search-id')) return
const dom = document.getElementById('ttk-edf-app-portal-search-id').parentNode
if (!dom.contains(e.target)) {
this.metaAction.sf('data.animation1', 'out')
this.metaAction.sf('data.showPanel', 'none')
}
}
componentDidMount = () => {
//IE中无CustomEvent
(function () {
if (typeof window.CustomEvent === "function") return false;
function CustomEvent(event, params) {
params = params || { bubbles: false, cancelable: false, detail: undefined };
var evt = document.createEvent('CustomEvent');
evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);
return evt;
}
CustomEvent.prototype = window.Event.prototype;
window.CustomEvent = CustomEvent;
})();
(function () {
var throttle = function (type, name, obj) {
obj = obj || window;
var running = false;
var func = function () {
if (running) { return; }
running = true;
requestAnimationFrame(function () {
obj.dispatchEvent(new CustomEvent(name));
running = false;
});
};
obj.addEventListener(type, func);
};
throttle("resize", "optimizedResize");
})();
//注册 resize 事件
window.addEventListener("optimizedResize", this.resize);
}
load = async (option) => {
let response = await this.webapi.portal.init()
let manageList = await this.webapi.org.queryList()
response.manageList = manageList
if (option) {
response.org = Object.assign(response.org, option)
}
if (response.user) {
this.metaAction.context.set('currentUser', response.user)
//this.metaAction.sf('data.other.currentUser', fromJS(response.user))
}
else {
this.metaAction.context.set('currentUser', undefined)
if (this.component.props.onRedirect && this.config.goAfterLogout) {
this.component.props.onRedirect(this.config.goAfterLogout)
}
}
if (response.org) {
this.metaAction.context.set('currentOrg', response.org)
}
else {
this.metaAction.context.set('currentOrg', undefined)
if (this.component.props.onRedirect && this.config.goAfterLogout) {
this.component.props.onRedirect(this.config.goAfterLogout)
}
}
if (response.menu) {
this.injections.reduce('load', { menu: response.menu, manageList: response.manageList })
}
this.metaAction.sf('data.headCtrl', true)
this.metaAction.sf('data.isShowSearch', false)
}
getOrgs = async () => {
let manageList = await this.webapi.org.queryList()
this.injections.reduce('load', { manageList: manageList })
}
toggleManage = async (e) => {//切换企业
let data = this.metaAction.gf('data').toJS()
let setManage = data.manageList.splice(e.key, 1)
let response = await this.webapi.org.updateCurrentOrg({ "orgId": setManage[0].id })
// sessionStorage['_accessToken'] = response.token
this.metaAction.context.set('currentOrg', setManage[0])
this.injections.reduce('closeContentReally', 'all')
this.load(setManage[0])
this.setContent('门户首页', 'ttk-edf-app-portal', { isShowMenu: false, isTabsStyle: false })
this.metaAction.sf('data.visible', false)
// this.metaAction.setTimeout(() => {
// this.setContent('门户首页', 'ttk-edf-app-portal')
// },500)
}
handleVisibleChange = (visible) => {
this.metaAction.sf('data.visible', visible)
}
menuControl = async (e) => {//帮助中心控制面板
if (this.metaAction.gf('data.showPanel') == 'block') {
this.metaAction.sf('data.showPanel', 'none')
} else {
this.metaAction.sf('data.showPanel', 'block')
}
this.metaAction.sf('data.animation', 'in')
}
onFull = () => {
requestFullscreen()
}
onExitFull = () => {
exitFullscreen()
}
fullScreenControl = () => {
if (this.metaAction.gf('data.fold') == true) {
this.metaAction.sf('data.fold', false)
this.onExitFull()
return false
} else {
this.metaAction.sf('data.fold', true)
this.onFull()
return true
}
}
pagestyleControl = () => {
if (this.metaAction.gf('data.isTabsStyle') == true) {
this.metaAction.sf('data.isTabsStyle', false)
}
else {
this.metaAction.sf('data.isTabsStyle', true)
}
}
hidePanel = () => {
this.metaAction.sf('data.animation', 'out')
this.metaAction.sf('data.showPanel', 'none')
}
animationEnd = () => {
this.metaAction.gf('data.animation') == 'out' &&
this.metaAction.sf('data.showPanel', 'none')
}
getLogo = () => this.config.logo
getPhoto = () => {
const user = this.getCurrentUser()
if (user) {
if (user.sex == 1) {
return male
} else if (user.sex == 2) {
return female;
} else {
return other
}
}
return other
}
getCurrentUser = () => this.metaAction.context.get('currentUser') || {}
getCurrentOrg = () => this.metaAction.context.get('currentOrg') || {}
getUserNickName = () => {
const user = this.getCurrentUser()
if (user && user.nickname) {
return user.nickname;
} else {
return sessionStorage.getItem('username')
}
return ""
}
getOrgName = () => {
const org = this.getCurrentOrg()
if (org) {
return org.name;
}
return ""
}
resize = () => {
let data = this.metaAction.gf('data').toJS();
window.onresize = () => {
if (data.widthPersonStatus == false) {
let width = window.innerWidth > 1024 ? true : false;
this.metaAction.sf('data.width', width);
}
}
}
switchMenu = () => {
let flag = this.metaAction.gf('data').toJS();
this.metaAction.sf('data.width', !flag.width);
this.metaAction.sf('data.widthPersonStatus', true);
}
getMenuChildren = () => {
const menu = this.metaAction.gf('data.menu').toJS()
const loop = (children, num) => {
const ret = [];
if (num == 1) {
children.forEach(child => {
if (child.id != "1") {
ret.push({
name: child.key,
key: child.key,
className: "{{data.width ? 'level-first show-content' : 'level-first hide-content'}}",
title: child.children.length !== 0 && [{
name: 'title',
component: 'span',
className: 'leftNavMenu',
children: [{
name: 'icon',
component: 'Icon',
fontFamily: 'edficon',
className: 'menu-icon',
type: child.iconFont //'laptop'
}, {
name: 'title',
component: 'span',
className: 'menu-content',
children: child.name
}]
}],
component: child.children.length == 0 ? 'Menu.Item' : 'Menu.SubMenu',
children: child.children.length == 0 ? [{
name: 'icon',
component: 'Icon',
fontFamily: 'edficon',
className: 'menu-icon',
type: child.iconFont //'link'
}, {
name: 'title',
component: 'span',
className: 'menu-content',
children: child.name
}] : loop(child.children, 2)
})
}
})
} else {
children.forEach(child => {
if (!child.children || child.children.length == 0) {
ret.push({
name: child.key,
key: child.key,
className: 'left-menu-submenu-menuitem',
component: 'Menu.Item',
children: child.name
})
} else {
ret.push({
name: child.key,
key: child.key,
className: 'left-menu-itemgroup',
title: {
name: 'title',
component: 'span',
children: child.name
},
component: 'Menu.ItemGroup',
children: loop(child.children, 2)
})
}
})
}
return ret
}
return {
_isMeta: true,
value: loop(menu, 1)
}
}
createLink = () => {
let element = document.head.querySelector('.el-element')
// if(element){
// element.parentNode.removeChild(element)
// }
let origin = location.origin
let link = document.createElement('link')
link.className = 'el-element'
link.rel = 'stylesheet'
link.type = 'text/css'
return link
}
toggleColor = async (color, action) => {
//let hash = (__webpack_hash__).slice(0, 8)
let origin = location.href
if (origin && origin.indexOf('#') > -1) {
origin = location.href.split('#')[0].substr(0, location.href.split('#')[0].length - 1)
}
let link = this.createLink()
switch (color) {
case '#416AAA':
link.href = origin + '/blueTheme' + '.css'
break;
case '#1EB5AD':
link.href = origin + '/businessBlueTheme' + '.css'
break;
default:
link.href = origin + '/businessBlueTheme' + '.css'
break;
}
document.head.appendChild(link)
if (action && action == 'change') {
this.webapi.user.updateSkin(color)
localStorage['skin'] = color
}
}
//获取extraMenuWidth
getExtraMenuWidth = () => {
let style = {}
let content = this.metaAction.gf('data.content').toJS()
if (content.appName == "ttk-edf-app-home") {
style.width = environment.isDevMode() ? "185px" : "95px"
} else {
style.width = environment.isDevMode() ? "95px" : "0px"
}
return style
}
//panel控制
showControlPanel = async () => {
this.metaAction.sf('data.showControlPanel', 'block')
this.metaAction.sf('data.panelAnimation', 'in')
}
//切换选中状态
panelCheckChange = (e, index) => {
let appList = this.metaAction.gf('data.desktopAppList').toJS()
appList[index].checked = !appList[index].checked
this.injections.reduce('appList', appList)
}
hidePanelEnd = () => {
let animation = this.metaAction.gf('data.panelAnimation')
if (animation == 'in') return
this.metaAction.sf('data.showControlPanel', 'none')
}
hideCtrlPanel = async (str) => {
this.metaAction.sf('data.panelAnimation', 'out')
if (str == 'save') {
let appList = this.metaAction.gf('data.desktopAppList').toJS()
let response = await this.webapi.desktop.saveAppList(appList)
this.injections.reduce('appList', appList, 'reload')
this.metaAction.sf('data.ctrlPanel', appList)
} else if (str == 'cancel') {
let appList = this.metaAction.gf('data.ctrlPanel')
this.injections.reduce('appList', appList)
}
}
topMenuClick = async (e) => {
switch (e.key) {
case 'mySetting':
//点击个人设置时先判断当前是否在企业管理和创建企业界面
let currentOpenAppName = this.metaAction.gf('data.content').toJS().appName
if (currentOpenAppName == 'ttk-edf-app-company-manage' || currentOpenAppName == 'ttk-edf-app-company-manage') {
this.tabEdit(currentOpenAppName, 'remove')
}
this.metaAction.sf('data.isTabsStyle', true)
this.metaAction.sf('data.isShowMenu', true)
this.setContent('个人设置', 'ttk-edf-app-my-setting')
break;
case 'changestyle':
this.metaAction.sf('data.setPopoverVisible', true)
this.showControlPanel()
break;
case 'help':
window.open('https://www.kancloud.cn/test001001/ttk-guide/754594')
break;
case 'logout':
if (this.component.props.onRedirect && this.config.goAfterLogout) {
let res = await this.webapi.user.logout()
if (res) {
this.metaAction.context.set('currentUser', undefined)
this.metaAction.context.set('currentOrg', undefined)
sessionStorage.removeItem('mobile')
sessionStorage.removeItem('username')
sessionStorage.removeItem('_accessToken')
sessionStorage.removeItem('password')
this.component.props.onRedirect(this.config.goAfterLogout)
}
}
break;
default:
return
}
let selectedKeys = this.metaAction.gf('data.selectedKeys')
if (selectedKeys) {
selectedKeys = selectedKeys.toJS()
selectedKeys[0] = e.key
this.metaAction.sf('data.selectedKeys', fromJS(selectedKeys))
}
}
goRegister = (e) => {
if (e.preventDefault) {
e.preventDefault()
}
if (e.stopPropagation) {
e.stopPropagation()
}
this.setContent('新建企业', 'ttk-edf-app-company-manage')
this.metaAction.sf('data.isTabsStyle', false)
this.metaAction.sf('data.isShowMenu', false)
this.metaAction.sf('data.visible', false)
// this.setContent('新建企业', 'ttk-edf-app-company-manage', { mark: 'home' })
}
goCompanyManage = (e) => {
if (e.preventDefault) {
e.preventDefault()
}
if (e.stopPropagation) {
e.stopPropagation()
}
this.setContent('企业管理', 'ttk-edf-app-company-manage')
this.metaAction.sf('data.isTabsStyle', false)
this.metaAction.sf('data.isShowMenu', false)
this.metaAction.sf('data.visible', false)
}
searchVisibleToogle = () => {
this.metaAction.sf('data.isShowSearch', !this.metaAction.gf('data.isShowSearch'));
this.metaAction.sf('data.showSearch', 'block')
this.metaAction.sf('data.animation1', 'in')
}
hideSearch = () => {
// this.metaAction.sf('data.isShowSearch', !this.metaAction.gf('data.isShowSearch'));
this.metaAction.sf('data.animation1', 'out')
}
animationEnd2 = () => {
// this.metaAction.gf('data.animation') == 'out' &&
// this.metaAction.sf('data.showSearch', 'none')
if (this.metaAction.gf('data.animation1') == 'out') {
this.metaAction.sf('data.showSearch', 'none')
this.metaAction.sf('data.isShowSearch', !this.metaAction.gf('data.isShowSearch'));
}
}
getSearchVisible = () => {
return this.metaAction.gf('data.isShowSearch')
}
menuClick = (e) => {
const menu = this.metaAction.gf('data.menu').toJS()
const find = (children) => {
for (let child of children) {
if (child.key == e.key) {
return child
}
if (child.children) {
let o = find(child.children)
if (o) return o
}
}
}
const hit = find(menu)
if (hit) {
this.setContent(hit.name, hit.appName, hit.appParams)
//埋点
//_hmt.push(['_trackEvent', '系统管理', '菜单',hit.name])
}
}
getMenuSelectKeys = () => {
return ['50']
/*
const content = this.metaAction.gf('data.content')
if (!content) return
const menuKeyNameMap = this.metaAction.gf('data.menuKeyNameMap')
return [menuKeyNameMap.get(content.get('name'))]
*/
}
tabChange = (key) => {
if (key == 'more') return
const openTabs = this.metaAction.gf('data.openTabs')
const curr = openTabs.find(o => o.get('name') == key)
this.setContent(curr.get('name'), curr.get('appName'), curr.get('appProps'))
}
tabEdit = async (key, action) => {
if (key == 'more') return
let that = this
let status = false
let openTabs = this.metaAction.gf('data.openTabs').toJS()
openTabs.forEach(o => {
if (o.name == key) {
status = o.editing
}
})
if (action == 'remove') {
if (status) {
const ret = this.metaAction.modal('confirm', {
title: '是否离开',
content: `${key}尚未保存,还要离开吗?`,
onOk() {
return that.injections.reduce('closeContent', key)
},
onCancel() {
return
}
})
} else {
this.injections.reduce('closeContent', key)
}
}
}
closeTabs = (e) => {
let key = e.key
let openTabs = this.metaAction.gf('data.openTabs').toJS();
if (e.key == 'all') {
this.injections.reduce('closeContent', 'all')
} else {
this.injections.reduce('closeContent', openTabs[openTabs.length - 1].name)
}
}
/**
* reinit时调用
* 记录当前打开的所有页签
* 关闭所有后重新打开
*/
reInitContent = async () => {
let content = this.metaAction.gf('data.content')
let openTabs = this.metaAction.gf('data.openTabs')
this.injections.reduce('closeAll')
this.metaAction.setTimeout(() => {
this.injections.reduce('reInit', content, openTabs)
}, 0)
}
//从企业管理和创建企业返回时调用
setContent = (name, appName, appProps = {}) => {
this.injections.reduce('setContent', name, appName, appProps)
}
//判断页面是否处于编辑状态
editing = (name, status) => {
this.injections.reduce('editing', name, status)
}
//关闭popover时取消选中menu
cancelCheckStatus = (visible) => {
this.metaAction.sf('data.setPopoverVisible', false)
if (!visible) {
this.metaAction.sf('data.selectedKeys', fromJS([]))
}
}
popoverVisible = (e) => {
this.metaAction.sf('data.selectedKeys', fromJS([]))
}
foldMenu = () => {
this.metaAction.sf('data.isShowMenu', !this.metaAction.gf('data.isShowMenu'))
this.metaAction.setTimeout(function () {
var event = document.createEvent('HTMLEvents')
event.initEvent("resize", true, true)
window.dispatchEvent(event)
}, 0)
}
/**
* dev模式下才显示开发帮助
*/
isDevMode = () => {
return environment.isDevMode()
}
//develop开发管理链接
batchMenuClick = (e) => {
let links = {
'axure': 'http://prototype.aierp.cn:8089',
'jira': 'http://jira.aierp.cn:8089/',
'Jenkins': 'http://jenkins.aierp.cn:8089/',
'ued': 'http://ued.aierp.cn:8089/',
'k8s': 'http://k8s.aierp.cn:8089/',
'sonar': 'http://sonar.aierp.cn:8089/',
}
if (e.key == 'webapi') {
this.openWebApi()
} else if (e.key == 'deleteAccount') {
let name = prompt("Please enter your mobile", "")
if (name != null && name != "") {
this.webapi.user.deleteUser({ mobile: name })
}
} else {
window.open(links[e.key])
}
}
openWebApi = () => {
this.setContent('api', 'app-common-iframe')
//window.open('http://172.16.10.26/webapi/')
}
addEventListener = (eventName, handler) => {
this.injections.reduce('addEventListener', eventName, handler)
}
removeEventListener = (eventName) => {
this.injections.reduce('removeEventListener', eventName)
}
}
export default function creator(option) {
const metaAction = new MetaAction(option),
o = new action({ ...option, metaAction }),
ret = { ...metaAction, ...o }
metaAction.config({ metaHandlers: ret })
return ret
}