class AdminAccessControlView extends EICDomContent { constructor() { super(); Object.assign(this, app.helpers.basicDialogs) } refreshRate = 1000; DOMContentLoaded(options) { for(let model in options.models) this[model] = options.models[model]; this.components = ui.eicfy(this.el); this.buttonStart = this.components.find(component => component.el.classList.contains('start')); this.buttonStop = this.components.find(component => component.el.classList.contains('stop')); this.gridUsers = new DataGrid(this.find('.active-users-grid'), { headers: [ { label: 'Online', type:'markup', filter: 'list', sortable: true}, { label: 'EU Login', type:'markup', filter: 'text', sortable: true}, { label: 'Full name', type:'markup', filter: 'text', sortable: true}, { label: 'Last req.', type:'markup', filter: false, sortable: true}, ], height: '60vh' }); this.gridBannedUsers = new DataGrid(this.find('.banned-users-grid'), { headers: [ { label: 'EU Login', type:'markup', filter: 'text'} ], height: '40vh' }); this.initEvents(); this.startAutoRefreshUser() this.startAutoRefreshPlatform() } initEvents() { let triggers = this.components.filter(c => ![ '', undefined ].includes( c.el.dataset.trigger) ); for(let element of triggers) { if(typeof this[element.el.dataset.trigger] === 'function') { element.click = this[element.el.dataset.trigger].bind(this) } } } DOMContentRemoved(){ this.stopAutoRefreshUser() this.stopAutoRefreshPlatform() } DOMContentFocused(){ this.startAutoRefreshUser() this.startAutoRefreshPlatform() } DOMContentBlured(){ this.stopAutoRefreshUser() this.stopAutoRefreshPlatform() } startAutoRefreshPlatform(){ if(this.refreshPlatformTo) return this.refreshPlatformTo = null this.refreshPlatformActive = true this.refreshPlatform() } stopAutoRefreshPlatform(){ if(this.refreshPlatformTo){ clearTimeout(this.refreshPlatformTo) this.refreshPlatformTo = null } this.refreshPlatformActive = false } refreshPlatform(){ if(this.refreshPlatformTo){ clearTimeout(this.refreshPlatformTo) this.refreshPlatformTo = null } this.platform.getPlatformStatus().then(this.fillPlatformState.bind(this)) if(this.refreshPlatformActive) this.refreshPlatformTo = setTimeout(this.refreshPlatform.bind(this),this.refreshRate) } startAutoRefreshUser(){ if(this.refreshUserTo) return this.refreshUserTo = null this.refreshUserActive = true this.refreshUsers() } stopAutoRefreshUser(){ if(this.refreshUserTo){ clearTimeout(this.refreshUserTo) this.refreshUserTo = null } this.refreshUserActive = false } refreshUsers(event){ if(this.refreshUserTo){ clearTimeout(this.refreshUserTo) this.refreshUserTo = null } this.platform.getUsers().then(this.fillUsers.bind(this)) if(this.refreshUserActive) this.refreshUserTo = setTimeout(this.refreshUsers.bind(this), this.refreshRate) } fillUsers(list) { if(!list) return // seriously ? const noKickRoles = ['EIC_Admin', 'EIC_Dev'] // just for display, anti-foot-shoot exists BE side this.gridUsers.loading = false; this.gridUsers.clear() for(let item of list) { let lastAjax = 3600-item.sessionExpire lastAjax = lastAjax<60 ? `${lastAjax} sec` : `${Math.floor(lastAjax/60)} min ${lastAjax%60} sec` let row = this.gridUsers.addRow(item.uid, [ `${item.busConnected ? 'Yes': 'No'}`, item.uid, `${item.given_name + ' ' + item.family_name}`, `${item.sessionExpire}${lastAjax}` ]); let buttonBar = ui.create(`
`) let btnMsg = ui.create(``) btnMsg.addEventListener('click',this.onUserMessage.bind(this)) buttonBar.appendChild(btnMsg); let intersect = noKickRoles.filter(value => item.userRoles.includes(value)); if(intersect.length==0){ let btnKick = ui.create(``) btnKick.addEventListener('click',this.onUserKick.bind(this)) buttonBar.appendChild(btnKick); let btnBan = ui.create(``) btnBan.addEventListener('click',this.onUserBan.bind(this)) buttonBar.appendChild(btnBan); } row.querySelector('.cell.actions').appendChild(buttonBar); } } fillPlatformState(data) { let article = new Card(this.find('.platform-status')); let alert = this.find('.platform-status > section'); if(data) { this.fillBannedUsers(data.blockedUUIDs) if(data.platformRestrictions) { article.severity = 'danger'; alert.innerHTML = ` access restricted granted access:You are about to remove restrictions on the EIC platform.
All users will be able to connect again.
`, okLabel: 'Free access', severity: 'primary', }) if(result) { this.platform.startPlatform(result); } } onUsersUpdate(event) { this.fillUsers(event.data.users); } /** * Growls a message to a user through bus */ async onUserMessage(event) { event.preventDefault(); event.stopPropagation(); let uid = event.currentTarget.dataset.uid; let result = await this.openDialog( await this.loadContent( 'system/admin/platform-control/dialogs/PlatformUserMessageDialog', { title: `Warn user ${uid}` }, { } ) ); if(result) { this.platform.growlOne(uid, result); } } /** * Growls a message to all users through bus */ async onUsersMessage(event) { event.preventDefault(); event.stopPropagation(); let result = await this.openDialog( await this.loadContent( 'system/admin/platform-control/dialogs/PlatformUserMessageDialog', { title: `Warn user` }, { } ) ); if(result) { this.platform.growlGlobal(result); } } /** * Kicks a user though bus */ async onUserKick(event) { event.preventDefault(); event.stopPropagation(); let uid = event.currentTarget.dataset.uid; let result = await this.confirmDialog({ title: 'Kick user', message: `You are about to kick user ${uid} from the platform.
All of his current activities will be terminated.
`, okLabel: 'Kick', severity: 'danger', okPromise: () => { return(this.platform.kick(uid)) } }) if(result) { ui.growl.append(`User ${uid} has been kicked !`, 'success', 10000) if(!this.refreshUserActive) this.refreshUsers() } } /** * Kicks all users though bus */ async onUsersKick(event) { event.preventDefault(); event.stopPropagation(); let result = await this.confirmDialog({ title: 'Kick all users', message: `You are about to kick ALL users from the platform.
All of their current activities will be terminated.
`, okLabel: 'Kick', severity: 'danger', okPromise: () => { return(this.platform.kickAll()) } }) if(result) { ui.growl.append(`All users (except Admins & Devs) have been kicked !`, 'success', 10000) if(!this.refreshUserActive) this.refreshUsers() } } /** * Bans a user from the platform though bus */ async onUserBan(event) { event.preventDefault(); event.stopPropagation(); let uid = event.currentTarget.dataset.uid; let result = await this.confirmDialog({ title: 'Ban user', message: `You are about to ban user ${uid} from the platform.
All of his current activities will be terminated and he won't be able to login again.
`, okLabel: 'Ban', severity: 'danger', okPromise: () => { return(this.platform.ban(uid)) } }) if(result) { ui.growl.append(`User ${uid} has been banned !`, 'success', 10000) if(!this.refreshPlatformActive) this.refreshPlatform() } } /** * Bans a user from the platform though bus */ async onUserUnban(event) { event.preventDefault(); event.stopPropagation(); let uid = event.currentTarget.dataset.uid; let result = await this.confirmDialog({ title: 'Unban user', message: `You are about to allow ${uid} back on the platform.
`, okLabel: 'Unban', severity: 'success', okPromise: () => { return(this.platform.unban(uid)) } }) if(result) { ui.growl.append(`User ${uid} has been unbanned !`, 'success', 10000) if(!this.refreshPlatformActive) this.refreshPlatform() } } } app.registerClass('AdminAccessControlView', AdminAccessControlView);