111 lines
3.3 KiB
JavaScript
111 lines
3.3 KiB
JavaScript
|
const m = require('mithril')
|
||
|
|
||
|
const { getAllStaff, removeStaff } = require('../api/staff')
|
||
|
const Dialogue = require('../widgets/dialogue')
|
||
|
const Pages = require('../widgets/pages')
|
||
|
|
||
|
const AdminStaffList = {
|
||
|
oninit: function(vnode) {
|
||
|
this.error = ''
|
||
|
this.lastpage = m.route.param('page') || '1'
|
||
|
this.staff = []
|
||
|
this.removeStaff = null
|
||
|
|
||
|
this.fetchStaffs(vnode)
|
||
|
},
|
||
|
|
||
|
fetchStaffs: function(vnode) {
|
||
|
this.loading = true
|
||
|
|
||
|
return getAllStaff()
|
||
|
.then(function(result) {
|
||
|
vnode.state.staff = result
|
||
|
})
|
||
|
.catch(function(err) {
|
||
|
vnode.state.error = err.message
|
||
|
})
|
||
|
.then(function() {
|
||
|
vnode.state.loading = false
|
||
|
m.redraw()
|
||
|
})
|
||
|
},
|
||
|
|
||
|
confirmRemoveStaff: function(vnode) {
|
||
|
let removingStaff = this.removeStaff
|
||
|
this.removeStaff = null
|
||
|
this.loading = true
|
||
|
removeStaff(removingStaff.id)
|
||
|
.then(this.oninit.bind(this, vnode))
|
||
|
.catch(function(err) {
|
||
|
vnode.state.error = err.message
|
||
|
vnode.state.loading = false
|
||
|
m.redraw()
|
||
|
})
|
||
|
},
|
||
|
|
||
|
getLevel: function(level) {
|
||
|
if (level === 100) {
|
||
|
return 'Admin'
|
||
|
}
|
||
|
return 'Manager'
|
||
|
},
|
||
|
|
||
|
view: function(vnode) {
|
||
|
return [
|
||
|
m('div.admin-wrapper', [
|
||
|
m('div.admin-actions', [
|
||
|
m('span', 'Actions:'),
|
||
|
m(m.route.Link, { href: '/admin/staff/add' }, 'Create new staff'),
|
||
|
]),
|
||
|
m('article.editarticle', [
|
||
|
m('header', m('h1', 'All staff')),
|
||
|
m('div.error', {
|
||
|
hidden: !this.error,
|
||
|
onclick: function() { vnode.state.error = '' },
|
||
|
}, this.error),
|
||
|
(this.loading
|
||
|
? m('div.loading-spinner.full')
|
||
|
: m('table', [
|
||
|
m('thead',
|
||
|
m('tr', [
|
||
|
m('th', 'Fullname'),
|
||
|
m('th', 'Email'),
|
||
|
m('th', 'Level'),
|
||
|
m('th.right', 'Updated'),
|
||
|
m('th.right', 'Actions'),
|
||
|
])
|
||
|
),
|
||
|
m('tbody', this.staff.map(function(item) {
|
||
|
return m('tr', [
|
||
|
m('td', m(m.route.Link, { href: '/admin/staff/' + item.id }, item.fullname)),
|
||
|
m('td', item.email),
|
||
|
m('td.right', AdminStaffList.getLevel(item.level)),
|
||
|
m('td.right', (item.updated_at || '---').replace('T', ' ').split('.')[0]),
|
||
|
m('td.right', m('button', { onclick: function() { vnode.state.removeStaff = item } }, 'Remove')),
|
||
|
])
|
||
|
})),
|
||
|
])
|
||
|
),
|
||
|
m(Pages, {
|
||
|
base: '/admin/staff',
|
||
|
links: this.links,
|
||
|
}),
|
||
|
]),
|
||
|
]),
|
||
|
m(Dialogue, {
|
||
|
hidden: vnode.state.removeStaff === null,
|
||
|
title: 'Delete ' + (vnode.state.removeStaff ? vnode.state.removeStaff.name : ''),
|
||
|
message: 'Are you sure you want to remove "' + (vnode.state.removeStaff ? vnode.state.removeStaff.fullname : '') + '" (' + (vnode.state.removeStaff ? vnode.state.removeStaff.email : '') + ')',
|
||
|
yes: 'Remove',
|
||
|
yesclass: 'alert',
|
||
|
no: 'Cancel',
|
||
|
noclass: 'cancel',
|
||
|
onyes: this.confirmRemoveStaff.bind(this, vnode),
|
||
|
onno: function() { vnode.state.removeStaff = null },
|
||
|
}),
|
||
|
]
|
||
|
},
|
||
|
}
|
||
|
|
||
|
module.exports = AdminStaffList
|