Files
doormanserver/static/index.js
T
2020-01-19 15:14:21 -05:00

216 lines
5.8 KiB
JavaScript

(function(){
const Ratio = (n, d) => ({
type: 'Ratio',
'n': n, // numerator
'd': d // denominator
});
const approxRatio = eps => n => {
const
gcde = (e, x, y) => {
const _gcd = (a, b) => (b < e ? a : _gcd(b, a % b));
return _gcd(Math.abs(x), Math.abs(y));
},
c = gcde(Boolean(eps) ? eps : (1 / 10000), 1, n);
return Ratio(
Math.floor(n / c), // numerator
Math.floor(1 / c) // denominator
);
};
var topBar = {}
function fontawesome(){
const classes = _.map(arguments, x => "." + x).reduce((s, n) => s + n);
return m('i' + classes);
}
var TopBar = {
view: function(){
return m('nav.navbar', [
m('div.navbar-brand',
m('a.navbar-item', {href: "#!/"}, "Doorman ", fontawesome('fas', 'fa-door-open'))),
m('div.navbar-menu', [
m('div.navbar-end', [
m('a.navbar-item', {href: "#!/server"}, "Server"),
m('a.navbar-item', {href: "#!/new-doorman"}, "New Doorman"),
])
])
]);
}
}
var Home = {};
Home.doormen = [];
Home.oninit = function(){
m.request({method: "GET", url: "/api/doormen"}).then(data => Home.doormen = data.doormen);
}
Home.doorman = function(doorman, idx){
const link = "#!/doorman/" + doorman.id
return m('li', m('a', {href: link}, doorman.name));
}
Home.view = function() {
return m("main", [
m(TopBar),
m("h1", {class: "title"}, "Home"),
m('div.content',
m('ul', _.map(Home.doormen, Home.doorman)))
]);
}
var NewDoorman = {}
NewDoorman.oninit = function(){
NewDoorman.clear();
}
NewDoorman.setToPayload = function(field){
return function(e){
_.set(NewDoorman.payload, field, e.target.value);
}
}
NewDoorman.nameField = function(){
const fields = {
type: 'text',
placeholder: 'Background Colour dsds',
onchange: NewDoorman.setToPayload('foo')};
return m('label.label', 'Name',
m('input.input', fields));
}
NewDoorman.ownerField = function(email, idx){
const label = 'Owner ' + (idx + 1);
const fields = {
type: 'text',
value: email,
onchange: NewDoorman.setToPayload(['OwnerEmails', idx])}
return m('label.label', label,
m('input.input', fields));
}
NewDoorman.putEmptyOwnerFields = function(){
NewDoorman.payload.OwnerEmails = _(NewDoorman.payload.OwnerEmails)
.filter(x => !_.isEmpty(x))
.concat('')
.value();
}
NewDoorman.ownerFields = function(){
return m('fieldset', {onchange: NewDoorman.putEmptyOwnerFields()},
m('legend', 'Owners'),
_.map(NewDoorman.payload.OwnerEmails, NewDoorman.ownerField));
}
NewDoorman.valueField = function(value, idx){
const nameField = m('div.field',
m('label', 'name',
m('input.input', {type: 'text', value: value.name, onchange: NewDoorman.setToPayload(['Values', idx, 'name'])})));
const valueField = m('div.field', m('label', 'value', m('input.input', {type: 'number', value: value.value, onchange: NewDoorman.setToPayload(['Values', idx, 'value'])})));
return m('div.columns',
m('div.column', nameField),
m('div.column', valueField));
}
NewDoorman.putEmptyValueFields = function() {
const hasEmptyNames = _(NewDoorman.payload.Values).map('name').filter(_.isEmpty).value().length;
const hasEmptyValues = _(NewDoorman.payload.Values).map('value').filter(_.isEmpty).value().length;
const sum = _(NewDoorman.payload.Values).map('value').map(x => parseInt(x)).sum();
if(sum >= 100 || hasEmptyNames || hasEmptyValues){
return;
}
NewDoorman.payload.Values.push({name: '', value: 100 - sum});
}
NewDoorman.valueFields = function(){
return m('fieldset', {onchange: NewDoorman.putEmptyValueFields}, m('legend', 'Values'),
_.map(NewDoorman.payload.Values, NewDoorman.valueField));
}
NewDoorman.clear = function(){
NewDoorman.payload = {
OwnerEmails: [],
Values: [{}]
};
}
NewDoorman.buttons = function(){
return m('div.buttons', [
m('button.button.is-primary.is-light', 'Create'),
m('button.button.is-danger.is-light', {onclick: NewDoorman.clear}, 'Clear')
])
}
NewDoorman.view = function(){
return m('div',
m(TopBar),
m('form', [
NewDoorman.nameField(),
m('br'),
NewDoorman.ownerFields(),
m('br'),
NewDoorman.valueFields(),
m('br'),
NewDoorman.buttons()
]))
}
var Server = {}
Server.data = {};
Server.oninit= function(){
m.request({method: "GET", url: "/api/server"})
.then(function(data) {
Server.data = data;
});
}
Server.renderRow = function(value, key){
return m('tr', [
m('td', key),
m('td', _.isObject(value) ? JSON.stringify(value) : value)]);
}
Server.renderTable = function(serverData){
const rows = _.map(serverData, Server.renderRow);
return m('table.table.is-bordered.is-striped.is-hoverable', rows);
}
Server.view = function() {
return m("div", [
m(TopBar),
m("h1", {class: "title"}, "Server"),
Server.renderTable(Server.data)
]);
}
var Doorman = {};
Doorman.doorman = {}
Doorman.oninit = function(vnode){
m.request({method: "GET", url: "/api/doormen"})
.then(data => _(data.doormen).filter(x => x.id == vnode.attrs.doormanId).map('url').first())
.then(url => m.request({method: "GET", url: url}))
.then(data => Doorman.doorman = data);
}
Doorman.view = function(vnode){
return m('div', [m(TopBar),'blah' + JSON.stringify(Doorman.doorman)])
}
m.route(document.getElementById('mithril'), "/", {
"/": Home,
"/server": Server,
"/new-doorman": NewDoorman,
"/doorman/:doormanId": Doorman,
});
})();