diff --git a/src/components/Tabs.js b/src/components/Tabs.js new file mode 100644 index 0000000000000000000000000000000000000000..b84a254be53086191333e0635b1caeb0f4ecdb0c --- /dev/null +++ b/src/components/Tabs.js @@ -0,0 +1,27 @@ +import m from 'mithril'; +import { Tabs } from 'polythene-mithril'; +import { TabsCSS } from 'polythene-css'; + +TabsCSS.addStyle('.themed-tabs', { + tab_max_width: 110, + tab_min_width: 110, + color_light: '#444', + color_light_selected: '#ff1744', + color_light_tab_indicator: '#ff1744', + color_dark: '#ccc', + color_dark_selected: '#c51162', + color_dark_tab_indicator: '#c51162', +}); + +export default class TabComponent { + constructor() { + this.defaultProps = { + className: 'themed-tabs', + activeSelected: true, + }; + } + + view(vnode) { + return m(Tabs, { ...this.defaultProps, ...vnode.attrs }); + } +} diff --git a/src/components/index.js b/src/components/index.js index 5142300129f7b0c66c38e0fb857e3f46b437e6cf..563fc179d60cddefb757843a3d4f8c437dc5746a 100644 --- a/src/components/index.js +++ b/src/components/index.js @@ -1,4 +1,8 @@ export { default as Button } from './Button'; +<<<<<<< HEAD export { default as Checkbox } from './Checkbox'; export { default as RadioGroup } from './RadioGroup'; export { default as TextField } from './TextField'; +======= +export { default as Tabs } from './Tabs'; +>>>>>>> 4b6c554c7a733576d7bea69b758fc04b6ba0f353 diff --git a/src/views/events/eventDetails.js b/src/views/events/eventDetails.js index 62063166e29c9c976b8528a2bd15167cd29926fc..364d36bb9bf397105256891031163552a46cf700 100644 --- a/src/views/events/eventDetails.js +++ b/src/views/events/eventDetails.js @@ -138,7 +138,7 @@ export default class EventDetails { } else { let participantNotice = ''; if (events.getSignupForSelectedEvent() !== 'undefined') { - participantNotice = m('You signed up for this event.'); + participantNotice = m('span', 'You signed up for this event.'); } eventSignupForm = m('div', ['The registration period is over.', participantNotice]); } diff --git a/src/views/frontpage.js b/src/views/frontpage.js index a5f5e87fbdd6f8d8e0c3be00acbbe7f68bc6a59c..20d9d68f5129a8857c28f02a348468eed2820968 100644 --- a/src/views/frontpage.js +++ b/src/views/frontpage.js @@ -3,15 +3,33 @@ import * as events from '../models/events'; const date = `${new Date().toISOString().split('.')[0]}Z`; +// Render the frontpage cards, with href and imageurl const renderCards = item => { - const { title } = item; - return m('div.frontpage-card', title); + const { title, href, imageurl } = item; + return m( + 'div.frontpage-card', + { style: `background-image: url(${imageurl})` }, + m('a', { href }, title) + ); }; +// Render the Hot Cards, with link and imageurl const renderHotCards = (item, index) => { - const { title } = item; - if (index === 0) return m('div.hot-first-card', title); - return m('div.hot-card', title); + const { title, href, imageurl } = item; + if (index === 0) { + return m( + 'div.hot-first-card', + { + style: `background-image: url(${imageurl})`, + }, + m('a', { href }, title) + ); + } + return m( + 'div.hot-card', + { style: `background-image: url(${imageurl})` }, + m('a', { href }, title) + ); }; export default class Frontpage { @@ -26,21 +44,40 @@ export default class Frontpage { }); this.events = events.getList().slice(0, 3); - console.log(this.events); // MOCKDATA - this.hot = [{ title: 'super hot' }, { title: 'also pretty hot' }, { title: 'kinda hot' }]; - this.jobs = [ - { title: 'google' }, - { title: 'less than google' }, - { title: 'abb' }, - { title: 'accenture' }, + this.hot = [ + { + title: 'super hot', + imageurl: 'http://www.heilpraxisnet.de/wp-content/uploads/2016/04/bier-lagern-1024x724.jpg', + }, + { title: 'also pretty hot' }, + { title: 'kinda hot' }, + ]; + this.jobs = [{ title: 'Google' }, { title: 'ABB' }, { title: 'Accenture' }]; + this.socialmedia = [ + { + title: 'Facebook', + href: 'https://www.facebook.com/AMIV.ETHZ/', + imageurl: 'https://upload.wikimedia.org/wikipedia/commons/c/c2/F_icon.svg', + }, + { + title: 'Instagram', + href: 'https://www.instagram.com/amiv_eth/?hl=de', + imageurl: + 'https://upload.wikimedia.org/wikipedia/commons/thumb/e/e7/Instagram_logo_2016.svg/2000px-Instagram_logo_2016.svg.png', + }, + { + title: 'Twitter', + href: 'https://twitter.com/amiv_ethz?lang=de', + imageurl: + 'https://upload.wikimedia.org/wikipedia/de/thumb/9/9f/Twitter_bird_logo_2012.svg/1200px-Twitter_bird_logo_2012.svg.png', + }, ]; } onbeforeupdate() { - this.events = events.getList().slice(0, 4); - console.log(this.events); + this.events = events.getList().slice(0, 3); } view() { @@ -48,6 +85,7 @@ export default class Frontpage { m('div.hot-row', this.hot.map((item, index) => renderHotCards(item, index))), m('div.frontpage-row', this.events.map(item => renderCards(item))), m('div.frontpage-row', this.jobs.map(item => renderCards(item))), + m('div.frontpage-row', this.socialmedia.map(item => renderCards(item))), ]); } } diff --git a/src/views/layout.js b/src/views/layout.js index 423bb945cf76e36fe690e080639b9086094f1035..d2d100312ee369fbf15faf7c77821841032bbd65 100644 --- a/src/views/layout.js +++ b/src/views/layout.js @@ -1,44 +1,78 @@ import m from 'mithril'; import { checkLogin, isLoggedIn, logout } from '../models/auth'; +import { Tabs } from '../components'; -const layoutCommon = [ - m('a', { href: '/', oncreate: m.route.link }, 'AMIV'), - m('a', { href: '/events', oncreate: m.route.link }, 'Events'), - m('a', { href: '/studydocuments', oncreate: m.route.link }, 'Studienunterlagen'), - m('a', { href: '/jobs', oncreate: m.route.link }, 'Jobs'), -]; +const defaultTabs = ['AMIV', 'Events', 'Studienunterlagen', 'Jobs']; +const tabsLoggedOut = ['Login']; +const tabsLoggedIn = ['Profil', 'Logout']; -const layoutLoggedOut = vnode => - m('div', [ - m('nav', [layoutCommon, m('a', { href: '/login', oncreate: m.route.link }, 'Login')]), - m('main', vnode.children), - ]); +const gotoRoute = route => { + const current = m.route.get(); + if (current !== route) m.route.set(route); +}; -const layoutLoggedIn = vnode => - m('div', [ - m('nav', [ - layoutCommon, - m('a', { href: '/profile', oncreate: m.route.link }, 'Profil'), - m( - 'a', - { - href: '/', - onclick: () => { - logout().then(() => { - m.route.set('/'); - }); - return false; - }, - }, - 'Logout' - ), - ]), - m('main', vnode.children), - ]); +export default class Layout { + constructor() { + checkLogin(); + this.setTabs(); + this.selectedTabIndex = 0; + this.wasLoggedIn = isLoggedIn(); + } + + setTabs() { + const tabOptions = isLoggedIn() ? tabsLoggedIn : tabsLoggedOut; + this.tabs = [...defaultTabs, ...tabOptions]; + } + + selectTab(tabIndex) { + const tabString = this.tabs[tabIndex]; + switch (tabString) { + case 'AMIV': + gotoRoute('/'); + break; + case 'Events': + gotoRoute('/events'); + break; + case 'Studienunterlagen': + gotoRoute('/studydocuments'); + break; + case 'Jobs': + gotoRoute('/jobs'); + break; + case 'Profil': + gotoRoute('/profile'); + break; + case 'Logout': + gotoRoute('/'); + logout(); + break; + case 'Login': + gotoRoute('/login'); + break; + default: + console.log('Tab not known!'); + } + } + + onupdate() { + if (this.wasLoggedIn !== isLoggedIn()) { + this.selectedTabIndex = 0; + this.wasLoggedIn = isLoggedIn(); + this.setTabs(); + } + } -module.exports = { - oninit: checkLogin, view(vnode) { - return isLoggedIn() ? layoutLoggedIn(vnode) : layoutLoggedOut(vnode); - }, -}; + return m('div#amiv-container', [ + m(Tabs, { + onChange: ({ index }) => { + this.selectedTabIndex = index; + this.selectTab(index); + }, + tabs: this.tabs.map(tab => ({ label: tab })), + selectedTab: this.selectedTabIndex, + }), + m('main', vnode.children), + ]); + } +} diff --git a/src/views/styles/base.less b/src/views/styles/base.less index 0e2ebf20790fde15e341a44ab31eca0f38370c46..af19c75dba4a74042b46b6a9dffca9c561ecc811 100644 --- a/src/views/styles/base.less +++ b/src/views/styles/base.less @@ -2,5 +2,16 @@ @import './studydocList.less'; div { +<<<<<<< HEAD border: none; } +======= + border: solid 1px black; +} + +#amiv-container { + max-width: 1280px; + display: block; + margin: 0 auto; +} +>>>>>>> 4b6c554c7a733576d7bea69b758fc04b6ba0f353 diff --git a/src/views/styles/frontpage.less b/src/views/styles/frontpage.less index d2fbaac9dae5d060bc9394716e48ea44066290cb..580d92f9d1d8de12059ce32370eeab1868f39524 100644 --- a/src/views/styles/frontpage.less +++ b/src/views/styles/frontpage.less @@ -1,9 +1,57 @@ #frontpage-container { - width: 800px; + // Grid general settings display: grid; grid-template-columns: repeat(12, 1fr); - + grid-gap: 30px; + align-content: center; + text-align: center; + border: none; + + // Hot sector on the frontpage .hot-row { - background-color: aqua; + // Grid of 12 frame colums + grid-column-start: 1; + grid-column-end: 13; + grid-row-start: 1; + grid-row-end: 15; + + // Grid declaration for sub items, 2 frame columns + display: grid; + grid-template-columns: repeat(2, 1fr); + grid-gap: 30px; + border: none; + + .hot-first-card { + background-color: red; + grid-row-start: 1; + grid-row-end: 3; + background-size: cover; + background-position: centre-centre; + } + + .hot-card { + background-color: yellow; + background-size: cover; + background-position: centre-centre; + } + } + + .frontpage-row{ + grid-column-start: 1; + grid-column-end: 13; + + // Grid declaration for sub items, 3 frame columns + display: grid; + border: none; + grid-template-columns: repeat(3, 1fr); + grid-gap: 30px; + + .frontpage-card{ + background-color: yellowgreen; + grid-row-start: 1; + grid-row-end: 8; + background-size: cover; + background-position: centre-centre; + } } } \ No newline at end of file diff --git a/src/views/styles/listview.less b/src/views/styles/listview.less index e0229900dfaf6e358ab1a9c6f273f07b9407351e..635e0e4a342defe057fe77eaf4d7c08b98ac5a5f 100644 --- a/src/views/styles/listview.less +++ b/src/views/styles/listview.less @@ -21,6 +21,7 @@ display: grid; grid-row: auto auto; border-bottom: solid 1px black; + border-top: solid 1px black; } } .content{