function submit(event) { Dom.stopEvent(); const competitor = $.data(); const ids = []; const form = event.currentTarget; competitor.number = form.querySelector('[name=number]') || undefined; var groups = form.getElementsByClassName('Category'); for(var i = 0; i < groups.length; ++i) { var row = $.data(groups[i]); if (row.category_id) ids.push(row.category_id); } competitor.category_ids = ids; if (Form.saveDoc(competitor, form)) { Route.replacePath(Add); } }
define(function(require, exports, module) { const koru = require('koru'); const Dom = require('koru/dom'); const CompleteList = require('koru/ui/complete-list'); const Dialog = require('koru/ui/dialog'); const Form = require('koru/ui/form'); const Route = require('koru/ui/route'); const SelectMenu = require('koru/ui/select-menu'); const util = require('koru/util'); const Category = require('models/category'); const Climber = require('models/climber'); const Competitor = require('models/competitor'); const Team = require('models/team'); const TeamType = require('models/team-type'); const User = require('models/user'); const TeamTpl = require('ui/team'); const TeamHelper = require('ui/team-helper'); const App = require('./app-base'); require('./climber'); const eventTpl = require('./event'); const Tpl = Dom.newTemplate(require('koru/html!./event-register')); const $ = Dom.current; const { Index, Add, Edit, Category: catTpl, Groups, Teams, AddClimber} = Tpl; let competitor; let sortField = 'name'; let asc = 1; let sortFunc; setSortFunc(); koru.onunload(module, ()=>{eventTpl.route.removeBase(Tpl)}); const base = eventTpl.route.addBase(module, Tpl); base.addTemplate(module, Add, { focus: true, defaultPage: true, }); base.addTemplate(module, Edit, { focus: true, data(page, pageRoute) { return Competitor.findById(pageRoute.append) || Route.abortPage(); } }); Tpl.$helpers({ closedClass() { Dom.setClass('closed', eventTpl.event.closed); }, competitors(each) { return { query: Competitor.query, compare: asc == 1 ? sortFunc : (a,b)=>sortFunc(b,a), compareKeys: sortFunc.compareKeys, }; }, sortOrder() { var parent = $.element.parentNode; var ths = parent.getElementsByTagName('th'); for(var i = 0; i < ths.length; ++i) { Dom.removeClass(ths[i], 'sort'); Dom.removeClass(ths[i], 'desc'); } var elm = parent.querySelector('[data-sort="'+sortField+'"]'); Dom.addClass(elm, 'sort'); asc === -1 && Dom.addClass(elm, 'desc'); }, }); Tpl.$events({ 'click tbody>tr'(event) { Dom.stopEvent(); Route.replacePath(Edit, {append: $.data(this)._id}); }, 'click [name=cancel]'(event) { Dom.stopEvent(); Route.replacePath(Tpl); }, 'menustart [name=selectTeamType]': TeamHelper.chooseTeamTypeEvent(teamTypeList), 'click th'(event) { Dom.stopEvent(); var sort = this.getAttribute('data-sort'); if (sortField === sort) asc = asc * -1; else { sortField = sort; asc = 1; } setSortFunc(); $.ctx.updateAllTags(); }, }); function teamTypeList(ctx) { return TeamType.where({_id: ctx.data.teamType_ids}).fetch(); } function setSortFunc() { switch (sortField) { case 'cat': return sortFunc = util.compareByField('category_ids'); case 'createdAt': return sortFunc = util.compareByField('createdAt'); case 'team': return sortFunc = TeamHelper.sortBy; default: return sortFunc = util.compareByField(sortField); } } Tpl.$extend({ onBaseEntry(page, pageRoute) { if (! eventTpl.event) Route.abortPage(); document.querySelector('#Event>div>.body').appendChild(Tpl.$autoRender(eventTpl.event)); }, onBaseExit(page, pageRoute) { Dom.removeId('Register'); }, $destroyed(ctx, elm) { competitor = null; }, }); Edit.$extend({ $created(ctx, elm) { addGroups(elm, ctx.data); addTeams(elm, ctx.data); }, }); Edit.$events({ 'submit': submit, 'click [name=delete]'(event) { Dom.stopEvent(); var doc = $.data(); Dom.Dialog.confirm({ data: doc, classes: 'warn', okay: 'Deregister', content: Tpl.ConfirmDelete, callback: function(confirmed) { if (confirmed) { doc.$remove(); Route.replacePath(Tpl); } }, }); }, }); Add.$extend({ $created(ctx) { if (eventTpl.event) { ctx.data = new Competitor({event_id: eventTpl.event._id}); } }, }); Add.$events({ 'click [name=cancel]'(event) { Dom.stopEvent(); Route.replacePath(Tpl); }, 'submit': submit, 'input [name=name]'(event) { var input = this; var value = input.value; if (value) value = value.trim(); if (value) { var form = event.currentTarget; var competitor = $.data(); competitor.$clearCache(); var competitors = Competitor.eventIndex.lookup({event_id: competitor.event_id}) || {}; var found = false; var completeList = Climber.search(value, 20, function (doc) { found = true; return ! (doc._id in competitors); }); if (completeList.length === 0) { if (found) { completeList = [{name: "Already registered"}]; } else { completeList = [{name: 'Add "' + value + '"', addNew: true}]; } } } Form.completeList({ input: this, completeList: completeList, callback(ret) { if (ret._id) { input.value = ret.name; addClimber(competitor, ret); addGroups(form, competitor); addTeams(form, competitor); } else if (ret.addNew) { addNew(form, value); } }, }); }, }); Tpl.Row.$helpers({ categories() { var frag = document.createDocumentFragment(); this.category_ids.forEach(id =>{ var abbr = document.createElement('abbr'); var cat = Category.findById(id); if (! cat) return; abbr.setAttribute("title", cat.name); abbr.textContent = cat.shortName; frag.appendChild(abbr); }); return frag; }, team: TeamHelper.teamTD, }); Tpl.Row.$extend({ $created(ctx) { ctx.autoUpdate({subject: ctx.data.climber}); }, }); AddClimber.$events({ 'submit': Form.submitFunc('AddClimber', function (doc) { Dom.Dialog.close(); var form = document.querySelector('#Register form.add'); var competitor = $.data(form); competitor.$clearCache(); addClimber(competitor, doc); addGroups(form, competitor); addTeams(form, competitor); }), 'click [name=cancel]'(event) { Dom.stopEvent(); Dom.Dialog.close(); document.querySelector('#Register [name=name].autoComplete').focus(); }, }); Groups.$events({ 'click [name=editClimber]'(event) { Dom.stopEvent(); Route.gotoPage(Dom.Climber.Edit, {modelId: $.ctx.data.climber._id}); }, }); Teams.$helpers({ teamTypes(each) { return { query: TeamType.where({_id: this.event.teamType_ids}), compare: util.compareByName, }; }, }); Teams.TeamType.$helpers({ teamName() { let competitor = Teams.$data(); let team = competitor.getTeam(this._id); Dom.setClass('none', ! team, $.element.parentNode); if (team) return team.name; return 'Select'; }, }); Teams.TeamType.$events({ 'menustart .select'(event) { Dom.stopEvent(); let ctx = $.ctx; let competitor = Teams.$data(); let list = Team.where('teamType_id', $.ctx.data._id).sort('name'); list = [{_id: null, name: Dom.h({i:'none'})}, ...list, {_id: '$new', name: Dom.h({i: 'add new team'})}]; SelectMenu.popup(this, { list, onSelect(elm) { let id = $.data(elm)._id; if (id === '$new') { let elm = Tpl.AddTeam.$autoRender( new Team({org_id: App.orgId, teamType_id: ctx.data._id})); Dialog.open(elm); Dom.ctx(elm).teamData = {competitor, ctx}; } else { competitor.setTeam(ctx.data._id, id); ctx.updateAllTags(); } return true; } }); }, }); Tpl.AddTeam.$events({ 'click [name=cancel]'(event) { Dom.stopEvent(); Dialog.close(); }, 'click [type=submit]': Form.submitFunc('AddTeam', { success(team) { let {competitor, ctx} = Dom.ctxById('AddTeam').teamData; competitor.setTeam(ctx.data._id, team._id); ctx.updateAllTags(); Dialog.close(); }, }), }); catTpl.$helpers({ selectedCategory() { Dom.setClass('none', ! this.category_id, $.element.parentNode); return this.category_id ? Category.findById(this.category_id).name : '---'; }, }); catTpl.$events({ 'menustart .select'(event) { Dom.stopEvent(); const ctx = $.ctx; const data = ctx.data; SelectMenu.popup(this, { list: data.groupList, onSelect(elm) { data.category_id = $.data(elm)._id; ctx.updateAllTags(); return true; } }); }, }); function submit(event) { Dom.stopEvent(); const competitor = $.data(); const ids = []; const form = event.currentTarget; competitor.number = form.querySelector('[name=number]') || undefined; var groups = form.getElementsByClassName('Category'); for(var i = 0; i < groups.length; ++i) { var row = $.data(groups[i]); if (row.category_id) ids.push(row.category_id); } competitor.category_ids = ids; if (Form.saveDoc(competitor, form)) { Route.replacePath(Add); } } function addNew(form, name) { Dom.Dialog.open(AddClimber.$autoRender(Climber.build({org_id: App.orgId, name: name})), {focus: '[name=dateOfBirth]'}); } function addGroups(form, competitor) { var climber = competitor.climber; var groupsElm = form.querySelector('.Groups'); Dom.remove(groupsElm); groupsElm = Groups.$autoRender(competitor); let list = groupsElm.querySelector('.categoryList'); Category.groupApplicable(climber, function (group, docs) { list.appendChild(catTpl.$autoRender({ groupName: group, groupList: [{_id: null, name: '---'}, ...docs], category_id: competitor.categoryIdForGroup(group), })); }); form.insertBefore(groupsElm, form.querySelector('.actions')); } function addTeams(form, competitor) { var climber = competitor.climber; var teamsElm = form.querySelector('.Teams'); Dom.remove(teamsElm); teamsElm = Teams.$autoRender(competitor); form.insertBefore(teamsElm, form.querySelector('.actions')); } function addClimber(competitor, climber) { competitor.climber_id = climber._id; competitor.team_ids = climber.team_ids; competitor.number = climber.number; } App.restrictAccess(Tpl); return Tpl; });
callback: function(confirmed) { if (confirmed) { doc.$remove(); Route.replacePath(Tpl); } },
define(function(require, exports, module) { const koru = require('koru'); const Dom = require('koru/dom'); const Form = require('koru/ui/form'); const Route = require('koru/ui/route'); const util = require('koru/util'); const Org = require('models/org'); const User = require('models/user'); const App = require('./app'); const Tpl = Dom.newTemplate(require('koru/html!./system-setup')); const $ = Dom.current; const base = Route.root.addBase(module, Tpl); koru.onunload(module, ()=>{Route.root.removeBase(Tpl)}); base.addTemplate(module, Tpl.Index, {defaultPage: true}); base.addTemplate(module, Tpl.OrgForm, { data(page, pageRoute) { return Org.findById(pageRoute.append) || new Org(); } }); base.addTemplate(module, Tpl.UserForm, { data(page, pageRoute) { return User.findById(pageRoute.append) || new User({org_id: App.orgId}); } }); Tpl.$extend({ title: "Org settings", onBaseEntry() { document.body.appendChild(Tpl.$autoRender({})); }, onBaseExit() { Dom.removeId('SystemSetup'); }, }); Tpl.$helpers({ org() { return App.org(); }, orgList(each) { return { query: Org.query, compare: util.compareByName, }; }, userList(each) { return { query: User.query, compare: util.compareByName, }; }, }); Tpl.$events({ 'click [name=cancel]'(event) { Dom.stopEvent(); Route.history.back(); }, 'click [name=delete]'(event) { var doc = $.data(event.currentTarget.querySelector('form')); Dom.stopEvent(); Dom.Dialog.confirm({ data: doc, classes: 'warn', okay: 'Delete', content: Tpl.ConfirmDelete, callback(confirmed) { if (confirmed) { if (doc.constructor === User) { doc.changes = {org_id: doc.org_id, role: null}; doc.$$save(); } else { doc.$remove(); } Route.replacePath(Tpl); } }, }); }, 'click .orgs tr'(event) { if (! Dom.hasClass(document.body, 'sAccess')) return; Dom.stopEvent(); var data = $.data(this); Route.gotoPage(Tpl.OrgForm, {append: data._id}); }, 'click .users tr'(event) { Dom.stopEvent(); var data = $.data(this); Route.gotoPage(Tpl.UserForm, {append: data._id}); }, }); Tpl.OrgForm.$events({ 'click [type=submit]': Form.submitFunc('OrgForm', Tpl), }); Tpl.UserForm.$helpers({ orgList() { return Org.query.fetch().sort(util.compareByName); }, roleList() { var su = User.me().isSuperUser(); var role = User.ROLE; var results = []; for(var name in role) { if (su || name !== 'superUser') results.push([role[name], util.capitalize(util.humanize(name))]); } return results; }, }); Tpl.UserForm.$events({ 'click [type=submit]': Form.submitFunc('UserForm', { success: Tpl, save(doc) { doc.changes.org_id = doc.org_id; return doc.$save(); } }), }); App.restrictAccess(Tpl.Index); App.restrictAccess(Tpl.UserForm); App.restrictAccess(Tpl.OrgForm); return Tpl; });