216 lines
5.8 KiB
JavaScript
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,
|
|
});
|
|
|
|
})();
|