From 418ba316c0dff442f6c4d6afa688d950ba9d8f52 Mon Sep 17 00:00:00 2001 From: Hermann <blumh@student.ethz.ch> Date: Sun, 29 Apr 2018 20:33:52 +0200 Subject: [PATCH] add basic overview about groups and members --- src/groups/overview.js | 40 ++++++++++++++ src/groups/viewGroup.js | 114 ++++++++++++++++++++++++++++++++++++++++ src/index.js | 13 ++--- 3 files changed, 158 insertions(+), 9 deletions(-) create mode 100644 src/groups/overview.js create mode 100644 src/groups/viewGroup.js diff --git a/src/groups/overview.js b/src/groups/overview.js new file mode 100644 index 0000000..be8acda --- /dev/null +++ b/src/groups/overview.js @@ -0,0 +1,40 @@ +import m from 'mithril'; +import { Card } from 'polythene-mithril'; +import DatalistController from '../listcontroller'; + + +class GroupItem { + view({ attrs: { name, _id }}) { + return m('div', { + style: { + padding: '20px', + 'max-width': '500px', + }, + onclick: () => { + m.route.set(`/groups/${_id}`); + }, + }, m(Card, { content: [{ primary: { title: name } }] })); + } +} + + +export default class GroupList { + constructor() { + this.ctrl = new DatalistController('groups', {}, ['name']); + this.data = []; + + this.ctrl.getPageData(1).then((data) => { + this.data = data; + m.redraw(); + }); + } + + view() { + if (!this.data) return ''; + + return m( + 'div', { style: { display: 'flex' } }, + this.data.map(item => m(GroupItem, item)), + ); + } +} diff --git a/src/groups/viewGroup.js b/src/groups/viewGroup.js new file mode 100644 index 0000000..c48feb0 --- /dev/null +++ b/src/groups/viewGroup.js @@ -0,0 +1,114 @@ +import m from 'mithril'; +import { + Button, + Card, +} from 'polythene-mithril'; +import { styler } from 'polythene-core-css'; +import ItemView from '../views/itemView'; +import TableView from '../views/tableView'; +import DatalistController from '../listcontroller'; + +const viewLayout = [ + { + '.eventViewContainer': { + display: 'grid', + 'grid-template-columns': '40% 55%', + 'grid-gap': '50px', + }, + '.propertyLangIndicator': { + width: '30px', + height: '20px', + float: 'left', + 'background-color': 'rgb(031,045,084)', + 'border-radius': '10px', + 'text-align': 'center', + 'line-height': '20px', + color: 'rgb(255,255,255)', + 'margin-right': '10px', + 'font-size': '11px', + }, + '.eventViewLeft': { + 'grid-column': 1, + }, + '.eventViewRight': { + 'grid-column': 2, + }, + '.eventViewRight h4': { + 'margin-top': '0px', + }, + }, +]; +styler.add('eventView', viewLayout); + + +// Helper class to either display the signed up participants or those on the +// waiting list. +class MembersTable { + constructor({ attrs: { where } }) { + this.ctrl = new DatalistController('groupmemberships', { + embedded: { user: 1 }, + where, + }, ['email', 'user.firstname', 'user.lastname'], false); + } + + getItemData(data) { + // TODO list should not have hardcoded size outside of stylesheet + return [ + m('div', { style: { width: '9em' } }, data.user.lastname), + m('div', { style: { width: '9em' } }, data.user.firstname), + m('div', { style: { width: '9em' } }, data.user.email), + ]; + } + + view() { + return m(Card, { + style: { height: '300px' }, + content: m(TableView, { + controller: this.ctrl, + keys: ['user.lastname', 'user.firstname', 'user.email'], + tileContent: this.getItemData, + titles: [ + { text: 'Name', width: '9em' }, + { text: 'First Name', width: '9em' }, + { text: 'Email', width: '9em' }, + ], + }), + }); + } +} + +export default class viewGroup extends ItemView { + constructor() { + super('groups'); + } + + oninit() { + this.handler.getItem(this.id, this.embedded).then((item) => { + this.data = item; + m.redraw(); + }); + } + + view({ attrs: { onEdit } }) { + if (!this.data) return ''; + + return m('div', { + style: { height: '100%', 'overflow-y': 'scroll', padding: '10px' }, + }, [ + m(Button, { + element: 'div', + label: 'edit group', + events: { onclick: onEdit }, + }), + // this div is the title line + m('div', [ + // event image if existing + m('h1', { style: { 'margin-top': '0px', 'margin-bottom': '0px' } }, this.data.name), + ]), + m('div', [ + m('h4', 'Members'), + m(MembersTable, { where: { group: this.id } }), + ]), + ]); + } +} diff --git a/src/index.js b/src/index.js index 46b56d3..67af7f1 100644 --- a/src/index.js +++ b/src/index.js @@ -1,6 +1,7 @@ import m from 'mithril'; import { OauthRedirect } from './auth'; -import TableView from './views/tableView'; +import GroupList from './groups/overview'; +import viewGroup from './groups/viewGroup'; import { UserModal, UserTable, NewUser } from './userTool'; import { MembershipView } from './membershipTool'; import EventTable from './events/table'; @@ -32,14 +33,8 @@ m.route(root, '/users', { '/newevent': layoutWith(newEvent), '/draftevent': layoutWith(eventDraft), '/eventwithexport': layoutWith(eventWithExport), - '/groups': layoutWith({ - view() { - return m(TableView, { - resource: 'groups', - keys: ['name'], - }); - }, - }), + '/groups': layoutWith(GroupList), + '/groups/:id': layoutWith(viewGroup), '/oauthcallback': OauthRedirect, // '/announce': layoutWith(AnnounceTool), }); -- GitLab