ttk-app-core
Version:
@ttk/recat enterprise develop framework
542 lines (502 loc) • 14.6 kB
JavaScript
import { action as MetaAction, AppLoader } from '@ttk/meta-engine';;
import { fromJS } from 'immutable';
import { history, environment } from 'edf-utils';
import config from './config';
import moment from 'moment'
let { changeTheme, changeThemeforIE } = window.changeTheme
let loadSplitCss = false
const borwserVersion = environment.getBrowserVersion()
if (borwserVersion.ie && borwserVersion.version < 10) {
loadSplitCss = true
}
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 ompArgs = JSON.parse(sessionStorage.getItem('ompArgs'));
if (ompArgs) {
if (Object.keys(ompArgs).includes('isOnlyContent')) {
ompArgs.isOnlyContent = !ompArgs.isOnlyContent;
}
this.metaAction.sf('data.app', fromJS(ompArgs));
}
// 更新皮肤
let skin = localStorage.getItem('skin') || '#1EB5AD'
this.toggleColor(skin)
this.load();
//history增加
history.listen('ttk-edf-app-simple-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;
}
};
componentWillUnmount = () => {
history.unlisten('ttk-edf-app-simple-portal', this.listen);
};
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;
});
};
if (obj.addEventListener) {
obj.addEventListener(type, func);
}
else if (obj.attachEvent) {
obj.attachEvent(type, func);
}
};
throttle('resize', 'optimizedResize');
})();
//注册 resize 事件
if (window.addEventListener) {
window.addEventListener('optimizedResize', this.resize);
} else if (window.attachEvent) {
window.attachEvent('optimizedResize', this.resize);
}
};
load = async (option) => {
let response = await this.webapi.portal.portal();
if (!response) {
response = {}
}
this.injections.reduce('load', { menu: response.menu });
};
getOrgs = async () => {
let manageList = await this.webapi.org.queryList();
this.injections.reduce('manageList', { manageList });
};
handleVisibleChange = (visible) => {
this.metaAction.sf('data.visible', visible);
};
animationEnd = () => {
this.metaAction.gf('data.animation') == 'out' && this.metaAction.sf('data.showPanel', 'none');
};
getCurrentUser = () => this.metaAction.context.get('currentUser') || {};
getCurrentOrg = () => this.metaAction.context.get('currentOrg') || {};
getOrgName = () => {
const org = this.getCurrentOrg();
if (org) {
return org.name;
}
return '';
};
resize = () => {
this.injections.reduce('resize');
let data = this.metaAction.gf('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);
}
};
this.metaAction.sf('data.service.mathRandom', Math.random());
};
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 && children.forEach(child => {
if (child.id != '99') {
ret.push({
name: child.key,
key: child.key,
className: '{{data.width ? \'level-first show-content\' : \'level-first hide-content\'}}',
title: child.children && child.children.length !== 0 && [{
name: 'title',
component: '::span',
className: 'leftNavMenu',
children: [{
name: 'icon',
component: 'Icon',
fontFamily: 'edficon',
className: 'menu-icon',
type: child.iconFont
}, {
name: 'title',
component: '::span',
className: 'menu-content',
children: child.name
}, {
name: 'badgeImg',
component: '::img',
_visible: child.versionTag == 1,
className: '{{data.width ? \'right_beta\' : \'top_beta\'}}',
src: '{{$getBeta()}}'
}]
}],
component: child.children && child.children.length == 0 ? 'Menu.Item' : 'Menu.SubMenu',
children: child.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 && children.forEach(child => {
if (!child.children || (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');
let origin = location.origin;
let link = document.createElement('link');
link.className = 'el-element';
link.rel = 'stylesheet';
link.type = 'text/css';
link.id = 'skin';
return link;
};
topMenuClick = async (e) => {
this.metaAction.sf('data.userMenuVisible', false);
switch (e.key) {
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, localStorage && localStorage['ompKey'] && JSON.parse(localStorage['ompKey']));
}
}
break;
}
};
getMenuSelectKeys = () => {
return ['50'];
};
tabChange = (key) => {
if (key == 'more') return;
const openTabs = this.metaAction.gf('data.openTabs');
let curr = openTabs.find(o => o.get('name') == key);
let _app = curr.toJS();
if (_app.appProps) {
_app.appProps.accessType = 0;
} else {
_app.appProps = {
accessType: 0
};
}
_app.appProps.isFolded && _app.appProps.isFolded == 1 ? this.metaAction.sf('data.width', false) : this.metaAction.sf('data.width', true);
curr = fromJS(_app);
this.setContent(curr.get('name'), curr.get('appName'), curr.get('appProps'));
};
onlyCloseContent = (appName) => {
//判断app是否打开
let openTabs = this.metaAction.gf('data.openTabs').toJS()
let hasApp = false
for (let i = 0; i < openTabs.length; i++) {
if (openTabs[i].appName.indexOf(appName) != -1) {
hasApp = true
break
}
}
if (hasApp) {
this.injections.reduce('onlyCloseContent', appName)
}
}
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() {
that.injections.reduce('closeContent', key);
that.metaAction.sf('data.mathRandom', Math.random());
// that.reInitContent()
return;
},
onCancel() {
return;
}
});
} else {
this.injections.reduce('closeContent', key);
this.metaAction.sf('data.mathRandom', Math.random());
// this.reInitContent()
}
}
};
closeTabs = (e) => {
let key = e.key,
name = null,
status = false,
that = this,
content = this.metaAction.gf('data.content')
.toJS(),
openTabs = this.metaAction.gf('data.openTabs')
.toJS();
for (let i = 0; i < openTabs.length; i++) {
if (key == 'all') {
if (openTabs[i].editing) {
status = true;
name = openTabs[i].name;
break;
}
} else {
if (openTabs[i].appName == content.appName) {
status = openTabs[i].editing;
if (status) name = content.name;
break;
}
}
}
if (status) {
const ret = this.metaAction.modal('confirm', {
title: '是否离开',
content: `${name}尚未保存,还要离开吗?`,
onOk() {
if (key == 'all') {
that.injections.reduce('closeContent', 'all');
that.metaAction.sf('data.mathRandom', Math.random());
} else {
that.injections.reduce('closeContent', content.name);
that.metaAction.sf('data.mathRandom', Math.random());
}
return;
},
onCancel() {
return;
}
});
} else {
if (e.key == 'all') {
this.injections.reduce('closeContent', 'all');
this.metaAction.sf('data.mathRandom', Math.random());
} else {
this.injections.reduce('closeContent', content.name);
this.metaAction.sf('data.mathRandom', Math.random());
}
}
};
/**
* 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);
};
//关闭popover时取消选中menu
cancelCheckStatus = (visible) => {
if (!visible) {
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);
};
addEventListener = (eventName, handler) => {
this.injections.reduce('addEventListener', eventName, handler);
};
removeEventListener = (eventName) => {
this.injections.reduce('removeEventListener', eventName);
};
toggleColor = async (color, action) => {
if (loadSplitCss) {
return this.toggleColorforIe(color, action)
}
let origin = location.origin
let link = null
if (document.querySelector("#skin")) {
link = document.querySelector("#skin")
link.id = "refSkin"
} else {
link = this.createLink()
link.id = "refSkin"
document.head.appendChild(link)
}
switch (color) {
case '#FF913A':
link.href = origin + '/yellowTheme' + '.css'
break;
case '#00B38A':
link.href = origin + '/greenTheme' + '.css'
break;
case '#0066B3':
link.href = origin + '/blueTheme' + '.css'
break;
case '#1EB5AD':
link.href = origin + '/businessBlueTheme' + '.css'
break;
case '#B4A074':
link.href = origin + '/orangeTheme' + '.css'
break;
case '#414141':
link.href = origin + '/blackTheme' + '.css'
break;
default:
link.href = origin + '/yellowTheme' + '.css'
break;
}
//各个子模块主题颜色加载
changeTheme(origin, color)
if (action && action == 'change') {
this.webapi.user.updateSkin(color)
localStorage['skin'] = color
}
}
toggleColorforIe = async (color, action) => {
//let hash = (__webpack_hash__).slice(0, 8)
for (let i = 1; i < 3; i++) {
let origin = location.origin
let link = null
if (document.querySelector("#skin")) {
link = document.querySelector("#skin")
} else {
link = this.createLink()
document.head.appendChild(link)
}
switch (color) {
case '#FF913A':
link.href = origin + '/splitcss/yellowTheme' + `-${i}` + '.css'
break;
case '#00B38A':
link.href = origin + '/splitcss/greenTheme' + `-${i}` + '.css'
break;
case '#0066B3':
link.href = origin + '/splitcss/blueTheme' + `-${i}` + '.css'
break;
case '#1EB5AD':
link.href = origin + '/splitcss/businessBlueTheme' + `-${i}` + '.css'
break;
case '#B4A074':
link.href = origin + '/splitcss/orangeTheme' + `-${i}` + '.css'
break;
case '#414141':
link.href = origin + '/splitcss/blackTheme' + `-${i}` + '.css'
break;
default:
link.href = origin + '/splitcss/yellowTheme' + `-${i}` + '.css'
break;
}
if (action && action == 'change') {
this.webapi.user.updateSkin(color)
localStorage['skin'] = color
}
}
changeThemeforIE(color)
}
}
export default function creator(option) {
const metaAction = new MetaAction(option),
o = new action({ ...option, metaAction }),
ret = { ...metaAction, ...o };
metaAction.config({ metaHandlers: ret });
return ret;
}