diff --git a/pisk/.meteor/packages b/pisk/.meteor/packages
index 0cd3100..8b4b1df 100644
--- a/pisk/.meteor/packages
+++ b/pisk/.meteor/packages
@@ -20,3 +20,4 @@ shell-server@0.2.1 # Server-side component of the `meteor shell` comm
autopublish@1.0.7 # Publish all data to the clients (for prototyping)
insecure@1.0.7 # Allow all DB writes from clients (for prototyping)
+kadira:flow-router
diff --git a/pisk/.meteor/versions b/pisk/.meteor/versions
index 8cc40eb..0b57afd 100644
--- a/pisk/.meteor/versions
+++ b/pisk/.meteor/versions
@@ -32,6 +32,7 @@ http@1.1.8
id-map@1.0.8
insecure@1.0.7
jquery@1.11.9
+kadira:flow-router@2.12.1
launch-screen@1.0.12
livedata@1.0.18
logging@1.1.15_1
@@ -51,6 +52,7 @@ observe-sequence@1.0.13
ordered-dict@1.0.8
promise@0.8.7
random@1.0.10
+reactive-dict@1.1.8
reactive-var@1.0.10
reload@1.1.10
retry@1.0.8
diff --git a/pisk/client/main.html b/pisk/client/main.html
index 2f25749..21f7057 100644
--- a/pisk/client/main.html
+++ b/pisk/client/main.html
@@ -1,8 +1,4 @@
PI:SK
+
-
-
-
-
-
diff --git a/pisk/client/main.jsx b/pisk/client/main.jsx
index 27cc14f..724e06f 100644
--- a/pisk/client/main.jsx
+++ b/pisk/client/main.jsx
@@ -1,11 +1 @@
-import React from 'react';
-import { Meteor } from 'meteor/meteor';
-import { render } from 'react-dom';
-
-import App from '../imports/ui/App.jsx';
-import Footer from '../imports/ui/Footer.jsx';
-
-Meteor.startup(() => {
- render(, document.getElementById('render-body'));
- render(, document.getElementById('render-footer'));
-});
+import '/imports/startup';
diff --git a/pisk/data/calendarfeed.json b/pisk/data/calendarfeed.json
new file mode 100644
index 0000000..ef48ff2
--- /dev/null
+++ b/pisk/data/calendarfeed.json
@@ -0,0 +1,19 @@
+{
+ "events": [
+ {
+ "date": "2016-11-20 09:40",
+ "title": "Styremøte",
+ "description": "Bare for styret, ikke for deg!"
+ },
+ {
+ "date": "2016-11-20 09:40",
+ "title": "Styremøte",
+ "description": "Bare for styret, ikke for deg!"
+ },
+ {
+ "date": "2016-11-20 09:40",
+ "title": "Styremøte",
+ "description": "Bare for styret, ikke for deg!"
+ }
+ ]
+}
diff --git a/pisk/data/styret.json b/pisk/data/styret.json
new file mode 100644
index 0000000..498dede
--- /dev/null
+++ b/pisk/data/styret.json
@@ -0,0 +1,52 @@
+{
+ "members": [
+ {
+ "name": "Uy Tran",
+ "role": "Styremedlem",
+ "email": "uqtran@ifi.uio.no",
+ "picture": ""
+ },
+ {
+ "name": "Adrian Eriksen",
+ "role": "Styreleder",
+ "email": "adrian_eriksen92@hotmail.com",
+ "picture": ""
+ },
+ {
+ "name": "Øystein Halvorsen",
+ "role": "Økonomiansvarlig",
+ "email": "",
+ "picture": ""
+ },
+ {
+ "name": "Kaisa Korsak",
+ "role": "Nestleder",
+ "email": "",
+ "picture": ""
+ },
+ {
+ "name": "Martine Solberg",
+ "role": "Styremedlem",
+ "email": "",
+ "picture": ""
+ },
+ {
+ "name": "Marie Fremstad",
+ "role": "Styremedlem",
+ "email": "",
+ "picture": ""
+ },
+ {
+ "name": "Nikolas Martin",
+ "role": "Styremedlem",
+ "email": "",
+ "picture": ""
+ },
+ {
+ "name": "Sofie Lie Rapp",
+ "role": "Styremedlem",
+ "email": "",
+ "picture": ""
+ }
+ ]
+}
diff --git a/pisk/imports/startup/index.js b/pisk/imports/startup/index.js
new file mode 100644
index 0000000..d56643d
--- /dev/null
+++ b/pisk/imports/startup/index.js
@@ -0,0 +1 @@
+import './routes.jsx';
diff --git a/pisk/imports/startup/routes.jsx b/pisk/imports/startup/routes.jsx
new file mode 100644
index 0000000..b84f742
--- /dev/null
+++ b/pisk/imports/startup/routes.jsx
@@ -0,0 +1,62 @@
+import {FlowRouter} from 'meteor/kadira:flow-router';
+import {Meteor} from 'meteor/meteor';
+import {ReactiveVar} from 'meteor/reactive-var';
+import {mount} from 'react-mounter';
+import AppLayout from '../ui/AppLayout.jsx';
+import NavBar from '../ui/NavBar.jsx';
+import LandingPage from '../ui/LandingPage.jsx';
+import WhatsUpPage from '../ui/WhatsUpPage.jsx';
+import FortranPage from '../ui/FortranPage.jsx';
+import StatutesPage from '../ui/StatutesPage.jsx';
+import Footer from '../ui/Footer.jsx';
+import React from 'react';
+
+FlowRouter.route('/', {
+ name: 'rootview',
+ action(props, {goToUrl}) {
+ mount(AppLayout, {
+ header: (),
+ main: ()
+ });
+ }
+});
+
+FlowRouter.route('/whatsup', {
+ name: 'whatsup',
+ action(props, {goToUrl}) {
+ mount(AppLayout, {
+ header: (),
+ main: ()
+ });
+ }
+});
+
+FlowRouter.route('/fortran', {
+ name: 'fortran',
+ action(props, {goToUrl}) {
+ mount(AppLayout, {
+ header: (),
+ main: ()
+ });
+ }
+});
+
+FlowRouter.route('/statutes', {
+ name: 'statutes',
+ action(props, {goToUrl}) {
+ mount(AppLayout, {
+ header: (),
+ main: ()
+ });
+ }
+});
+
+FlowRouter.notFound = {
+ action() {
+ mount(AppLayout, {
+ header: (),
+ main: (404 siden finnes ikke
),
+ footer:('')
+ });
+ }
+};
diff --git a/pisk/imports/ui/App.jsx b/pisk/imports/ui/App.jsx
deleted file mode 100644
index 959483d..0000000
--- a/pisk/imports/ui/App.jsx
+++ /dev/null
@@ -1,111 +0,0 @@
-import React, { Component } from 'react';
-import {Tabs, Tab} from 'material-ui/Tabs';
-import baseTheme from 'material-ui/styles/baseThemes/lightBaseTheme';
-import getMuiTheme from 'material-ui/styles/getMuiTheme';
-import injectTapEventPlugin from 'react-tap-event-plugin';
-import LandingPage from './LandingPage.jsx';
-import ScrollWithPage from './ScrollWithPage.jsx';
-injectTapEventPlugin();
-
-
-// App component - represents the whole app
-const tabs =
-[{label:"Hva skjer?", value:0, component:()},
-{label:"Kalender", value:1, component:()},
-{label:"Fortran", value:2, component:()},
-{label:"Vedtekter", value:3, component:()}];
-
-export default class App extends Component {
-
- constructor(props) {
- super(props);
-
- this.state = {
- activeTab:0
- };
-
- this.handleChange = this.handleChange.bind(this);
- }
-
- handleChange(tabNumber) {
- $("html, body").animate({ scrollTop: 0 }, "fast");
- this.setState({activeTab:tabNumber});
- }
-
- getChildContext() {
- return { muiTheme: getMuiTheme(piskTheme) };
- }
-
- render() {
- return (
-
-
-
-
-
PI:SK
-
- {tabs.map((tab, index)=>{
- return ();
- })}
-
-
-
- {tabs[this.state.activeTab].component}
-
-
-
- );
- }
-}
-
-App.childContextTypes = {
- muiTheme: React.PropTypes.object.isRequired
-};
-
-const navBarStyles = {
- marginRight:50,
- marginLeft:50,
- fontSize:38,
- fontFamily:"Roboto, sans-serif",
- marginTop:5
-}
-
-const piskTheme = {
- fontFamily:"Roboto, sans-serif",
- palette:{
- accent1Color:"#ff4081",
- accent2Color:"#f5f5f5",
- accent3Color:"#9e9e9e",
- alternateTextColor:"#000000",
- borderColor:"#e0e0e0",
- canvasColor:"#ffffff",
- clockCircleColor:"rgba(0, 0, 0, 0.07)",
- disabledColor:"rgba(0, 0, 0, 0.3)",
- pickerHeaderColor:"#00bcd4",
- primary1Color:"#ffffff",
- primary2Color:"#0097a7",
- primary3Color:"#bdbdbd",
- secondaryTextColor:"rgba(0, 0, 0, 0.54)",
- shadowColor:"rgba(0, 0, 0, 1)",
- textColor:"rgba(0, 0, 0, 0.87)"
- },
- spacing:{
- desktopDrawerMenuItemHeight:48,
- desktopDropDownMenuFontSize:15,
- desktopDropDownMenuItemHeight:32,
- desktopGutter:24,
- desktopGutterLess:16,
- desktopGutterMini:8,
- desktopGutterMore:32,
- desktopKeylineIncrement:64,
- desktopSubheaderHeight:48,
- desktopToolbarHeight:56,
- iconSize:24
- }
-}
diff --git a/pisk/imports/ui/AppLayout.jsx b/pisk/imports/ui/AppLayout.jsx
new file mode 100644
index 0000000..f5e5462
--- /dev/null
+++ b/pisk/imports/ui/AppLayout.jsx
@@ -0,0 +1,36 @@
+import React from 'react';
+import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider';
+import getMuiTheme from 'material-ui/styles/getMuiTheme';
+import lightBaseTheme from 'material-ui/styles/baseThemes/lightBaseTheme.js';
+import { blue800 } from 'material-ui/styles/colors';
+
+const style = {
+ ...lightBaseTheme,
+ palette: {
+ ...lightBaseTheme.palette,
+ primary1Color: "#ffffff",
+ alternateTextColor:"#000000"
+ }
+};
+
+const AppLayout = ({header, main, footer}) => {
+ return (
+
+
+
+
+ {main}
+
+
+
+
+ );
+};
+
+AppLayout.propTypes = {
+ header: React.PropTypes.node.isRequired,
+ main: React.PropTypes.node.isRequired,
+ footer: React.PropTypes.node
+};
+
+export default AppLayout;
diff --git a/pisk/imports/ui/FortranPage.jsx b/pisk/imports/ui/FortranPage.jsx
new file mode 100644
index 0000000..e67946b
--- /dev/null
+++ b/pisk/imports/ui/FortranPage.jsx
@@ -0,0 +1,22 @@
+import React, { Component } from 'react';
+import CalendarIcon from 'material-ui/svg-icons/action/event';
+import {cyan500} from 'material-ui/styles/colors';
+import calendarfeed from '/data/calendarfeed.json';
+
+
+export default class StatutesPage extends Component {
+
+ constructor(props) {
+ super(props);
+
+ this.state = {
+ };
+ }
+
+ render() {
+ return (
+
+
+
);
+ }
+}
diff --git a/pisk/imports/ui/LandingPage.jsx b/pisk/imports/ui/LandingPage.jsx
index 73429fd..1867097 100644
--- a/pisk/imports/ui/LandingPage.jsx
+++ b/pisk/imports/ui/LandingPage.jsx
@@ -1,6 +1,7 @@
import React, { Component } from 'react';
import CalendarIcon from 'material-ui/svg-icons/action/event';
import {cyan500} from 'material-ui/styles/colors';
+import styret from '/data/styret.json';
export default class LandingPage extends Component {
diff --git a/pisk/imports/ui/NavBar.jsx b/pisk/imports/ui/NavBar.jsx
new file mode 100644
index 0000000..a7432fd
--- /dev/null
+++ b/pisk/imports/ui/NavBar.jsx
@@ -0,0 +1,69 @@
+import React, { Component } from 'react';
+import {Tabs, Tab} from 'material-ui/Tabs';
+import baseTheme from 'material-ui/styles/baseThemes/lightBaseTheme';
+import getMuiTheme from 'material-ui/styles/getMuiTheme';
+import injectTapEventPlugin from 'react-tap-event-plugin';
+import LandingPage from './LandingPage.jsx';
+import ScrollWithPage from './ScrollWithPage.jsx';
+import {FlowRouter} from 'meteor/kadira:flow-router';
+import moment from 'moment';
+injectTapEventPlugin();
+
+// App component - represents the whole app
+const tabs =
+[{label:"Hjem", value:0, routeName:'rootview'},
+{label:"Hva skjer?", value:1, routeName:'whatsup'},
+{label:"Fortran", value:2, routeName:'fortran'},
+{label:"Vedtekter", value:3, routeName:'statutes'}];
+
+export default class NavBar extends Component {
+
+ constructor(props) {
+ super(props);
+
+ const currentRouteName = FlowRouter.current().route.name;
+ const activeTab = tabs.find((tab)=>currentRouteName === tab.routeName);
+
+ this.state = {
+ activeTab:activeTab ? activeTab.value : -1
+ };
+
+ this.handleChange = this.handleChange.bind(this);
+ }
+
+ handleChange(tabNumber) {
+ $("html, body").animate({ scrollTop: 0 }, "fast");
+ this.setState({activeTab:tabNumber},()=>{
+ FlowRouter.go(tabs[tabNumber].routeName);
+ });
+
+ }
+
+ render() {
+ return (
+
+
+
+
PI:SK
+
+ {tabs.map((tab, index)=>{
+ return ();
+ })}
+
+
+
+ );
+ }
+}
+
+const navBarStyles = {
+ fontSize:38,
+ fontFamily:"Roboto, sans-serif",
+ marginTop:5
+}
diff --git a/pisk/imports/ui/StatutesPage.jsx b/pisk/imports/ui/StatutesPage.jsx
new file mode 100644
index 0000000..4c61608
--- /dev/null
+++ b/pisk/imports/ui/StatutesPage.jsx
@@ -0,0 +1,55 @@
+import React, { Component } from 'react';
+import CalendarIcon from 'material-ui/svg-icons/action/event';
+import {cyan500} from 'material-ui/styles/colors';
+import calendarfeed from '/data/calendarfeed.json';
+
+
+export default class StatutesPage extends Component {
+
+ constructor(props) {
+ super(props);
+
+ this.state = {
+ };
+ }
+
+ render() {
+ return (
+
+ §1 - Formålsparagraf
+ Foreningens navn er Programutvalet for Informatikk: språk og kommunikasjon (PI:SK).
+ Foreningens formål er å ivareta interressene til studentene ved studieprogrammet Informatikk: språk og kommunikasjon (I:SK), samt bidra til et godt sosialt og faglig miljø blant studentene, og på programrommet til I:SK. Foreningen skal også arbeide for god kontakt mellom studentene og studieprogrammets ledelse.
+ §2 - Generalforsamling
+ Generalforsamlingen er foreningens høyeste myndighet og avholdes hvert semester, fortrinnsvis i februar og september.
+ Styret innkaller til generalforsamling med 14 dagers varsel. Dagsorden offentliggjøres seinest en uke i forveien.
+ På generalforsamlingen behandles styrets semesterberetning, regnskap for forrige periode og budsjett for neste periode, valg, samt eventuelle andre saker som er satt opp på dagsorden. Valg foregår i tråd med §7.
+ Alle studenter som er registrert ved studieprogrammet Informatikk: språk og kommunikasjon (I:SK) som har betalt semesteravgift ved UiO kan bli medlemmer av PI:SK, har stemme- og forslagsrett og kan stille til valg.
+ Avstemninger på generalforsamlingen skal være skriftlige dersom minst tre av de stemmeberettige krever det.
+ Generalforsamlingen fatter vedtak, utenom vedtektsendringer, ved simpelt flertall.
+ Ekstraordinær generalforsamling kan innkalles dersom minst 10 av medlemmene krever det, eller når styret finner det nødvendig.
+ Forslag til saker må være styret i hende minst 2 dager før generalforsamlingen. Alle stemmeberettige kan foreslå saker til behandling. Generalforsamlingen kan behandle saker som kommer inn senere, men kan ikke fatte vedtak i disse.
+ Generalforsamlingen kan foreta endringer i rekkefølgen på punktene i dagsordenen og utelukke punkter så lenge dette ikke strider mot §8.
+ §3 - Styret
+ Styret skal drive foreningens aktivitet og sikre gjennomføringen av foreningens formål.
+ Leder (eller nestleder) innkaller til styremøte med en ukes varsel, forslag til agenda skal foreligge senest 48 timer før møtet.
+ Styret er vedtaksdyktige om 1/2 av styremedlemmene er tilstede. Vedtak gjøres med simpelt flertall, ved stemmelikhet har leder dobbeltstemme.
+ Styret skal ha mellom 3 og 10 styremedlemmer, som velges for ett år. Faste stillinger i styret er som følger; Leder, Nestleder og Økonomiansvarlig. Øvrige verv bestemmes av styret.
+ Alle som oppfyller kravene i iht §2.4, har møterett på styremøter, men bare styremedlemmer har tale- og stemmerett. Styret kan innvilge talerett om ønskelig.
+ Styremedlemmer som ikke møter og ikke melder forfall to møter på rad regnes som fratrådt.
+ Styret kan ved behov velge nye styremedlemmer, med unntak av vervene Leder og Økonomiansvarlig.
+ Styret velger selv foreningens representanter til utvalg og råd hvor foreningen har representasjon.
+ §4 - Vedtekter
+ Forslag til vedtektsendringer skal være styret i hende senest 7 dager før allmøte.
+ Endring av vedtektene kan bare skje når 2/3 av de stemmeberettigede stemmer for.
+ Styret skal offentliggjøre forslagene til vedtektsendringer senest 2 dager før generalforsamlingen.
+ §5 - Økonomi
+ Foreningens midler skal brukes i henhold til foreningens formål.
+ Leder i samarbeid med økonomiansvarlig plikter å engasjere en uavhengig tredjepart til å revidere regnskap for hvert hele år. Revidert regnskap skal forelegges første mulige generalforsamling.
+ §6 - Valg
+ Styremedlemmer velges særskilt på generalforsamling, for 2 semester av gangen.
+ Hver høst velges Leder.
+ Hver vår velges Nestleder og Økonomiansvarlig.
+
+
);
+ }
+}
diff --git a/pisk/imports/ui/WhatsUpPage.jsx b/pisk/imports/ui/WhatsUpPage.jsx
new file mode 100644
index 0000000..e304402
--- /dev/null
+++ b/pisk/imports/ui/WhatsUpPage.jsx
@@ -0,0 +1,22 @@
+import React, { Component } from 'react';
+import CalendarIcon from 'material-ui/svg-icons/action/event';
+import {cyan500} from 'material-ui/styles/colors';
+import calendarfeed from '/data/calendarfeed.json';
+
+
+export default class WhatsUpPage extends Component {
+
+ constructor(props) {
+ super(props);
+
+ this.state = {
+ };
+ }
+
+ render() {
+ return (
+
+
+
);
+ }
+}
diff --git a/pisk/package.json b/pisk/package.json
index 45b4ca8..daaa0d0 100644
--- a/pisk/package.json
+++ b/pisk/package.json
@@ -9,6 +9,7 @@
"meteor-node-stubs": "~0.2.0",
"react": "^15.3.2",
"react-dom": "^15.3.2",
+ "react-mounter": "^1.2.0",
"react-tap-event-plugin": "^1.0.0"
}
}