Commit b02441289faa525d44e328f455bf8e626079d822

Authored by Deepak
1 parent c6b4fc634c
Exists in master

added verify module

imports/client/views/nonOrg/app/module/AppLayout.js
1 import _ from 'lodash'; 1 import _ from 'lodash';
2 import { Meteor } from 'meteor/meteor'; 2 import { Meteor } from 'meteor/meteor';
3 import React, { Component } from 'react'; 3 import React, { Component } from 'react';
4 import { Link } from 'react-router'; 4 import { Link } from 'react-router';
5 import { Avatar } from '/imports/client/components/Avatar'; 5 import { Avatar } from '/imports/client/components/Avatar';
6 import { Icon } from '/imports/client/components/Icon'; 6 import { Icon } from '/imports/client/components/Icon';
7 import classNames from 'classnames'; 7 import classNames from 'classnames';
8 8
9 import { logout } from '/imports/client/app/utils/loginMethods'; 9 import { logout } from '/imports/client/app/utils/loginMethods';
10 import { VerifyModule } from '/imports/client/views/verify/module/index'
10 11
11 import Signup from '/imports/client/views/nonOrg/enter/SignupView'; 12 import Signup from '/imports/client/views/nonOrg/enter/SignupView';
12 import { Collapse, Navbar, NavbarToggler, 13 import { Collapse, Navbar, NavbarToggler,
13 NavbarBrand, Nav, NavItem, NavLink } from 'reactstrap'; 14 NavbarBrand, Nav, NavItem, NavLink } from 'reactstrap';
14 15
15 16
16 export class AppLayout extends Component { 17 export class AppLayout extends Component {
17 constructor(props) { 18 constructor(props) {
18 super(props); 19 super(props);
19 20
20 this.toggle = this.toggle.bind(this); 21 this.toggle = this.toggle.bind(this);
21 this.state = { 22 this.state = {
22 isOpen: false 23 isOpen: false
23 }; 24 };
24 } 25 }
25 toggle() { 26 toggle() {
26 this.setState({ 27 this.setState({
27 isOpen: !this.state.isOpen 28 isOpen: !this.state.isOpen
28 }); 29 });
29 } 30 }
30 render() { 31 render() {
31 const {user, org} = this.props.data; 32 const {user, org} = this.props.data;
32 console.log(user); 33 console.log(user);
33 console.log(org); 34 console.log(org);
34 if(!user) { 35 if(!user) {
35 return ( 36 return (
36 <Signup 37 <Signup
37 /> 38 />
38 ); 39 );
39 } 40 }
40 41
41 if(!user.isEmailVerified()) { 42 if(!user.isEmailVerified()) {
42 return ( 43 return (
43 <VerifyModule 44 <VerifyModule
44 pane = {this.props.location.query.verify} 45 pane = {this.props.location.query.verify}
45 location = {this.props.location} 46 location = {this.props.location}
46 /> 47 />
47 ); 48 );
48 } 49 }
49 const theUrl = Meteor.absoluteUrl(); 50 const theUrl = Meteor.absoluteUrl();
50 OrgUrl = theUrl.replace("http://","http://"+org.slug+"."); 51 OrgUrl = theUrl.replace("http://","http://"+org.slug+".");
51 return ( 52 return (
52 <div className = "appLayout-box"> 53 <div className = "appLayout-box">
53 <Navbar color="faded" light toggleable> 54 <Navbar color="faded" light toggleable>
54 <NavbarToggler right onClick={this.toggle} /> 55 <NavbarToggler right onClick={this.toggle} />
55 <NavbarBrand href="/">reactstrap</NavbarBrand> 56 <NavbarBrand href="/">reactstrap</NavbarBrand>
56 <Collapse isOpen={this.state.isOpen} navbar> 57 <Collapse isOpen={this.state.isOpen} navbar>
57 <Nav className="ml-auto" navbar> 58 <Nav className="ml-auto" navbar>
58 <NavItem> 59 <NavItem>
59 <NavLink href="/components/">Components</NavLink> 60 <NavLink href="/components/">Components</NavLink>
60 </NavItem> 61 </NavItem>
61 <NavItem> 62 <NavItem>
62 <NavLink href="https://github.com/reactstrap/reactstrap">Github</NavLink> 63 <NavLink href="https://github.com/reactstrap/reactstrap">Github</NavLink>
63 </NavItem> 64 </NavItem>
64 </Nav> 65 </Nav>
65 </Collapse> 66 </Collapse>
66 </Navbar> 67 </Navbar>
67 <div className = "appLayout-wrapOuter"> 68 <div className = "appLayout-wrapOuter">
68 <div className = "appLayout-wrapInner"> 69 <div className = "appLayout-wrapInner">
69 <div className = "appLayout-menuWrap"> 70 <div className = "appLayout-menuWrap">
70 </div> 71 </div>
71 <div className = "appLayout-contentWrap"> 72 <div className = "appLayout-contentWrap">
72 <div className = "appLayout-content"> 73 <div className = "appLayout-content">
73 Hi, {user.getFullName()}, 74 Hi, {user.getFullName()},
74 Please visit your organization page by <a href={OrgUrl}>clicking here </a> and login using your credentials! 75 Please visit your organization page by <a href={OrgUrl}>clicking here </a> and login using your credentials!
75 </div> 76 </div>
76 </div> 77 </div>
77 </div> 78 </div>
78 </div> 79 </div>
79 </div> 80 </div>
80 ); 81 );
81 }; 82 };
82 83
83 }; 84 };
84 85
imports/client/views/nonOrg/enter/SignupView.js
1 import React from 'react'; 1 import React from 'react';
2 import { Link } from 'react-router'; 2 import { Link } from 'react-router';
3 import { Row, Col, FormGroup, 3 import { Row, Col, FormGroup,
4 ControlLabel, FormControl, 4 ControlLabel, FormControl,
5 InputGroup, Button } from 'react-bootstrap'; 5 InputGroup, Button } from 'react-bootstrap';
6 import handleSignup from './signup'; 6 import handleSignup from './signup';
7 import { Orgs } from '/imports/collections/orgs/index'; 7 import { Orgs } from '/imports/collections/orgs/index';
8 import './signup.css'
8 9
9 export default class Signup extends React.Component { 10 export default class Signup extends React.Component {
10 constructor(props) { 11 constructor(props) {
11 super(props); 12 super(props);
12 this.state = { 13 this.state = {
13 orgSlug: "" 14 orgSlug: ""
14 }; 15 };
15 } 16 }
16 componentWillMount(){ 17 componentWillMount(){
17 Meteor.subscribe('allOrgsSlug'); 18 Meteor.subscribe('allOrgsSlug');
18 } 19 }
19 20
20 componentDidMount() { 21 componentDidMount() {
21 handleSignup({ component: this }); 22 handleSignup({ component: this });
22 } 23 }
23 handleChange(e) { 24 handleChange(e) {
24 this.setState({ orgSlug: e.target.value }); 25 this.setState({ orgSlug: e.target.value });
25 } 26 }
26 handleSubmit(event) { 27 handleSubmit(event) {
27 event.preventDefault(); 28 event.preventDefault();
28 } 29 }
29 checkExistingOrgSlug() { 30 checkExistingOrgSlug() {
30 if(this.state.orgSlug==""){return null} 31 if(this.state.orgSlug==""){return null}
31 searchOrg = Orgs.find({slug:this.state.orgSlug}).fetch(); 32 searchOrg = Orgs.find({slug:this.state.orgSlug}).fetch();
32 if(searchOrg.length>0){ 33 if(searchOrg.length>0){
33 return "error" 34 return "error"
34 }else{ 35 }else{
35 return "success" 36 return "success"
36 } 37 }
37 } 38 }
38 render() { 39 render() {
39 return ( 40 return (
40 <div className="Signup"> 41 <div className="Signup">
41 <Row> 42 <Row>
42 <Col xs={ 12 } sm={ 6 } md={ 4 }> 43 <Col xs={ 12 } sm={ 6 } md={ 4 }>
43 <h4 className="page-header">Sign Up</h4> 44 <h4 className="page-header">Sign Up</h4>
44 <form 45 <form
45 ref={ form => (this.signupForm = form) } 46 ref={ form => (this.signupForm = form) }
46 onSubmit={ this.handleSubmit } 47 onSubmit={ this.handleSubmit }
47 > 48 >
48 <Row> 49 <Row>
49 <Col xs={ 12 } sm={ 12 }> 50 <Col xs={ 12 } sm={ 12 }>
50 <FormGroup controlId="orgSlugField" validationState={this.checkExistingOrgSlug()}> 51 <FormGroup controlId="orgSlugField" validationState={this.checkExistingOrgSlug()}>
51 <ControlLabel>Organisation name</ControlLabel> 52 <ControlLabel>Organisation name</ControlLabel>
52 <InputGroup> 53 <InputGroup>
53 <FormControl 54 <FormControl
54 type ="text" 55 type ="text"
55 ref ="orgSlug" 56 ref ="orgSlug"
56 name ="orgSlug" 57 name ="orgSlug"
57 placeholder ="School URL" 58 placeholder ="School URL"
58 onChange = {(e) => this.handleChange(e)} 59 onChange = {(e) => this.handleChange(e)}
59 /> 60 />
60 <InputGroup.Addon>@yd.com</InputGroup.Addon> 61 <InputGroup.Addon>@yd.com</InputGroup.Addon>
61 </InputGroup> 62 </InputGroup>
62 </FormGroup> 63 </FormGroup>
63 </Col> 64 </Col>
64 </Row> 65 </Row>
65 <Row> 66 <Row>
66 <Col xs={ 6 } sm={ 6 }> 67 <Col xs={ 6 } sm={ 6 }>
67 <FormGroup> 68 <FormGroup>
68 <ControlLabel>First Name</ControlLabel> 69 <ControlLabel>First Name</ControlLabel>
69 <FormControl 70 <FormControl
70 type="text" 71 type="text"
71 ref="orgName" 72 ref="orgName"
72 name="orgName" 73 name="orgName"
73 placeholder="School Name" 74 placeholder="School Name"
74 /> 75 />
75 </FormGroup> 76 </FormGroup>
76 </Col> 77 </Col>
77 </Row> 78 </Row>
78 <Row> 79 <Row>
79 <Col xs={ 6 } sm={ 6 }> 80 <Col xs={ 6 } sm={ 6 }>
80 <FormGroup> 81 <FormGroup>
81 <ControlLabel>First Name</ControlLabel> 82 <ControlLabel>First Name</ControlLabel>
82 <FormControl 83 <FormControl
83 type="text" 84 type="text"
84 ref="firstName" 85 ref="firstName"
85 name="firstName" 86 name="firstName"
86 placeholder="First Name" 87 placeholder="First Name"
87 /> 88 />
88 </FormGroup> 89 </FormGroup>
89 </Col> 90 </Col>
90 <Col xs={ 6 } sm={ 6 }> 91 <Col xs={ 6 } sm={ 6 }>
91 <FormGroup> 92 <FormGroup>
92 <ControlLabel>Last Name</ControlLabel> 93 <ControlLabel>Last Name</ControlLabel>
93 <FormControl 94 <FormControl
94 type="text" 95 type="text"
95 ref="lastName" 96 ref="lastName"
96 name="lastName" 97 name="lastName"
97 placeholder="Last Name" 98 placeholder="Last Name"
98 /> 99 />
99 </FormGroup> 100 </FormGroup>
100 </Col> 101 </Col>
101 </Row> 102 </Row>
102 <FormGroup> 103 <FormGroup>
103 <ControlLabel>Email Address</ControlLabel> 104 <ControlLabel>Email Address</ControlLabel>
104 <FormControl 105 <FormControl
105 type="text" 106 type="text"
106 ref="emailAddress" 107 ref="emailAddress"
107 name="emailAddress" 108 name="emailAddress"
108 placeholder="Email Address" 109 placeholder="Email Address"
109 /> 110 />
110 </FormGroup> 111 </FormGroup>
111 <FormGroup> 112 <FormGroup>
112 <ControlLabel>Password</ControlLabel> 113 <ControlLabel>Password</ControlLabel>
113 <FormControl 114 <FormControl
114 type="password" 115 type="password"
115 ref="password" 116 ref="password"
116 name="password" 117 name="password"
117 placeholder="Password" 118 placeholder="Password"
118 /> 119 />
119 </FormGroup> 120 </FormGroup>
120 <Button type="submit" bsStyle="success">Sign Up</Button> 121 <Button type="submit" bsStyle="success">Sign Up</Button>
121 </form> 122 </form>
122 <p>Already have an account? <Link to="/login">Log In</Link>.</p> 123 <p>Already have an account? <Link to="/login">Log In</Link>.</p>
123 </Col> 124 </Col>
124 </Row> 125 </Row>
125 </div> 126 </div>
126 ); 127 );
127 } 128 }
128 } 129 }
129 130
imports/client/views/nonOrg/enter/signup.css
File was created 1 .Signup .row div{
2 display: block;
3 margin: auto;
4 left: 27%;
5 }
6
imports/client/views/org/admin/students/StudentTable.js
1 import _ from 'lodash'; 1 import _ from 'lodash';
2 import { Meteor } from 'meteor/meteor'; 2 import { Meteor } from 'meteor/meteor';
3 3
4 import React, { Component } from 'react'; 4 import React, { Component } from 'react';
5 import { Link,browserHistory } from 'react-router'; 5 import { Link,browserHistory } from 'react-router';
6 import { FormGroup,Panel,Table, 6 import { FormGroup,Panel,Table,
7 ButtonToolbar,Modal, 7 ButtonToolbar,Modal,
8 FormControl,Glyphicon,Button } from 'react-bootstrap'; 8 FormControl,Glyphicon,Button } from 'react-bootstrap';
9 import { AddStudentForm } from './addStudentForm'; 9 import { AddStudentForm } from './addStudentForm';
10 import {moment} from 'meteor/momentjs:moment'
10 11
11 export class StudentTable extends Component { 12 export class StudentTable extends Component {
12 13
13 constructor(props) { 14 constructor(props) {
14 super(props); 15 super(props);
15 this.state = { 16 this.state = {
16 show: false 17 show: false
17 }; 18 };
18 this.onUpdate = this.onUpdate.bind(this); 19 this.onUpdate = this.onUpdate.bind(this);
19 }; 20 };
20 onUpdate(key, value) { 21 onUpdate(key, value) {
21 this.setState({[key]: value}); 22 this.setState({[key]: value});
22 }; 23 };
23 24
24 render() { 25 render() {
25 return ( 26 return (
26 <div className="panel panel-flat"> 27 <div className="panel panel-flat">
27 <div className="panel-heading"> 28 <div className="panel-heading">
28 <h5 className="panel-title">Student Details</h5> 29 <h5 className="panel-title">Student Details</h5>
29 <div className="heading-elements"> 30 <div className="heading-elements">
30 <ul className="icons-list"> 31 <ul className="icons-list">
31 <li><a data-action="collapse"></a></li> 32 <li><a data-action="collapse"></a></li>
32 <li><a data-action="reload"></a></li> 33 <li><a data-action="reload"></a></li>
33 </ul> 34 </ul>
34 </div> 35 </div>
35 </div> 36 </div>
36 <Table striped bordered condensed hover> 37 <Table striped bordered condensed hover>
37 <thead> 38 <thead>
38 <tr> 39 <tr>
39 <th>First Name</th> 40 <th>First Name</th>
40 <th>Last Name</th> 41 <th>Last Name</th>
41 <th>Class</th> 42 <th>Class</th>
42 <th>DOB</th> 43 <th>DOB</th>
43 <th>Status</th> 44 <th>Status</th>
44 <th className="text-center">Actions</th> 45 <th className="text-center">Actions</th>
45 </tr> 46 </tr>
46 </thead> 47 </thead>
47 <tbody> 48 <tbody>
48 { 49 {
49 this.props.students.map(function(student, i) 50 this.props.students.map(function(student, i)
50 { 51 {
51 return( 52 return(
52 <tr key={i}> 53 <tr key={i}>
53 <td>{student.firstName}</td> 54 <td>{student.firstName}</td>
54 <td>{student.lastName}</td> 55 <td>{student.lastName}</td>
55 <td>{student.class}</td> 56 <td>{student.class}</td>
56 <td>{}</td> 57 <td>{student.dob? moment(student.dob).format("LL") : <span></span>}</td>
57 <td><span className="label label-success">Active</span></td> 58 <td><span className="label label-success">Active</span></td>
58 <td className="text-center"> 59 <td className="text-center">
59 <ul className="icons-list"> 60 <ul className="icons-list">
60 <li className="dropdown"> 61 <li className="dropdown">
61 <a href="#" className="dropdown-toggle" data-toggle="dropdown"> 62 <a href="#" className="dropdown-toggle" data-toggle="dropdown">
62 <i className="icon-menu9"></i> 63 <i className="icon-menu9"></i>
63 </a> 64 </a>
64 <ul className="dropdown-menu dropdown-menu-right"> 65 <ul className="dropdown-menu dropdown-menu-right">
65 <li><a href="#"><i className="icon-file-pdf"></i> Export to .pdf</a></li> 66 <li><a href="#"><i className="icon-file-pdf"></i> Export to .pdf</a></li>
66 <li><a href="#"><i className="icon-file-excel"></i> Export to .csv</a></li> 67 <li><a href="#"><i className="icon-file-excel"></i> Export to .csv</a></li>
67 <li><a href="#"><i className="icon-file-word"></i> Export to .doc</a></li> 68 <li><a href="#"><i className="icon-file-word"></i> Export to .doc</a></li>
68 </ul> 69 </ul>
69 </li> 70 </li>
70 </ul> 71 </ul>
71 </td> 72 </td>
72 </tr> 73 </tr>
73 ) 74 )
74 }) 75 })
75 } 76 }
76 </tbody> 77 </tbody>
77 </Table> 78 </Table>
78 </div> 79 </div>
79 ); 80 );
80 }; 81 };
81 82
82 }; 83 };
83 84
imports/client/views/org/admin/students/StudentView.js
1 import _ from 'lodash'; 1 import _ from 'lodash';
2 import { Meteor } from 'meteor/meteor'; 2 import { Meteor } from 'meteor/meteor';
3 3
4 import React, { Component } from 'react'; 4 import React, { Component } from 'react';
5 import { Link,browserHistory } from 'react-router'; 5 import { Link,browserHistory } from 'react-router';
6 import { FormGroup,Panel,Table, 6 import { FormGroup,Panel,Table,
7 ButtonToolbar,Modal, 7 ButtonToolbar,Modal,
8 FormControl,Glyphicon,Button } from 'react-bootstrap'; 8 FormControl,Glyphicon,Button } from 'react-bootstrap';
9 import { AddStudent } from './addStudent'; 9 import { AddStudent } from './addStudent';
10 import { StudentTable } from './StudentTable'; 10 import { StudentTable } from './StudentTable';
11 import { Header } from './Header'; 11 import { Header } from './Header';
12 import { FabMenuView } from './FabMenu'; 12 import { FabMenuView } from './FabMenu';
13 import { UploadCsv } from './UploadCsv'; 13 import { UploadCsv } from './UploadCsv';
14 import { Students } from '/imports/collections/students/index';
14 15
15 16
16 export class StudentView extends Component { 17 export class StudentView extends Component {
17 18
18 constructor(props) { 19 constructor(props) {
19 super(props); 20 super(props);
20 this.state = { 21 this.state = {
21 show: false, 22 show: false,
22 firstNameSearch: "", 23 firstNameSearch: "",
23 lastNameSearch: "", 24 lastNameSearch: "",
24 }; 25 };
25 this.showModal = this.showModal.bind(this); 26 this.showModal = this.showModal.bind(this);
26 this.hideModal = this.hideModal.bind(this); 27 this.hideModal = this.hideModal.bind(this);
27 this.onUpdate = this.onUpdate.bind(this); 28 this.onUpdate = this.onUpdate.bind(this);
28 }; 29 };
29 30
30 showModal() { 31 showModal() {
31 this.setState({show: true}); 32 this.setState({show: true});
32 } 33 }
33 34
34 hideModal() { 35 hideModal() {
35 this.setState({show: false}); 36 this.setState({show: false});
36 } 37 }
37 onUpdate(key, value) { 38 onUpdate(key, value) {
38 this.setState({[key]: value}); 39 this.setState({[key]: value});
39 }; 40 };
40 41
41 render() { 42 render() {
43 console.log(this.props);
42 firstNameSearch = this.state.firstNameSearch; 44 firstNameSearch = this.state.firstNameSearch;
45 lastNameSearch = this.state.lastNameSearch;
43 var students =_.filter(this.props.data.students,function(item){ 46 var students =_.filter(this.props.data.students,function(item){
44 return _.includes(item.firstName.toLowerCase(),firstNameSearch.toLowerCase()); 47 return _.includes(item.firstName.toLowerCase(),firstNameSearch.toLowerCase());
45 }); 48 });
46 return ( 49 return (
47 <div className="content has-detached-left"> 50 <div className="content has-detached-left">
48 <div className="container-detached"> 51 <div className="container-detached">
49 <div className="content-detached"> 52 <div className="content-detached">
50 <Header/> 53 <Header/>
51 <StudentTable 54 <StudentTable
52 data = {this.props.data} 55 data = {this.props.data}
53 students = {students} 56 students = {students}
54 /> 57 />
55 <AddStudent/> 58 <AddStudent/>
56 <UploadCsv /> 59 <UploadCsv />
57 </div> 60 </div>
58 </div> 61 </div>
59 <div className="sidebar-detached affix-top"> 62 <div className="sidebar-detached affix-top">
60 <div className="sidebar sidebar-default"> 63 <div className="sidebar sidebar-default">
61 <div className="sidebar-content"> 64 <div className="sidebar-content">
62 65
63 <div className="sidebar-category"> 66 <div className="sidebar-category">
64 <div className="category-title"> 67 <div className="category-title">
65 <span>Advanced Search</span> 68 <span>Advanced Search</span>
66 <ul className="icons-list"> 69 <ul className="icons-list">
67 <li><a href="#" data-action="collapse"></a></li> 70 <li><a href="#" data-action="collapse"></a></li>
68 </ul> 71 </ul>
69 </div> 72 </div>
70 73
71 <div className="category-content"> 74 <div className="category-content">
72 <form action="#"> 75 <form action="#">
73 <div className="has-feedback has-feedback-left"> 76 <div className="has-feedback has-feedback-left">
74 <input type="search" className="form-control" 77 <input type="search" className="form-control"
75 value={this.state.firstNameSearch} 78 value={this.state.firstNameSearch}
76 onChange={e=>this.onUpdate('firstNameSearch',e.target.value)} 79 onChange={e=>this.onUpdate('firstNameSearch',e.target.value)}
77 placeholder="First Name" 80 placeholder="First Name"
78 /> 81 />
79 <div className="form-control-feedback"> 82 <div className="form-control-feedback">
80 <i className="icon-search4 text-size-base text-muted"></i> 83 <i className="icon-search4 text-size-base text-muted"></i>
81 </div> 84 </div>
82 </div> 85 </div>
83 </form> 86 </form>
84 </div> 87 </div>
85 <div className="category-content"> 88 <div className="category-content">
86 <form action="#"> 89 <form action="#">
87 <div className="has-feedback has-feedback-left"> 90 <div className="has-feedback has-feedback-left">
88 <input type="search" className="form-control" 91 <input type="search" className="form-control"
89 value={this.state.lastNameSearch} 92 value={this.state.lastNameSearch}
90 onChange={e=>this.onUpdate('lastNameSearch',e.target.value)} 93 onChange={e=>this.onUpdate('lastNameSearch',e.target.value)}
91 placeholder="Last Name" /> 94 placeholder="Last Name" />
92 <div className="form-control-feedback"> 95 <div className="form-control-feedback">
93 <i className="icon-search4 text-size-base text-muted"></i> 96 <i className="icon-search4 text-size-base text-muted"></i>
94 </div> 97 </div>
95 </div> 98 </div>
96 </form> 99 </form>
97 </div> 100 </div>
98 101
99 </div> 102 </div>
100 103
101 104
102 </div> 105 </div>
103 </div> 106 </div>
104 </div> 107 </div>
105 </div> 108 </div>
106 ); 109 );
107 }; 110 };
108 111
109 }; 112 };
110 113
imports/client/views/org/admin/students/UploadCsv.js
1 import _ from 'lodash'; 1 import _ from 'lodash';
2 import { Meteor } from 'meteor/meteor'; 2 import { Meteor } from 'meteor/meteor';
3 3
4 import React, { Component } from 'react'; 4 import React, { Component } from 'react';
5 import { Link,browserHistory } from 'react-router'; 5 import { Link,browserHistory } from 'react-router';
6 import { FormGroup,Panel,Table, 6 import { FormGroup,Panel,Table,
7 ButtonToolbar,Modal, FieldGroup, 7 ButtonToolbar,Modal,ControlLabel,HelpBlock,
8 FormControl,Glyphicon,Button } from 'react-bootstrap'; 8 FormControl,Glyphicon,Button } from 'react-bootstrap';
9 import { AddStudentForm } from './addStudentForm'; 9 // import { AddStudentForm } from './addStudentForm';
10 10
11 const style = { 11 const style = {
12 margin: 12, 12 margin: 12,
13 }; 13 };
14 function FieldGroup({ id, label, help, ...props }) {
15 return (
16 <FormGroup controlId={id}>
17 <ControlLabel>{label}</ControlLabel>
18 <FormControl {...props} />
19 {help && <HelpBlock>{help}</HelpBlock>}
20 </FormGroup>
21 );
22 }
14 export class UploadCsv extends Component { 23 export class UploadCsv extends Component {
15 constructor(props) { 24 constructor(props) {
16 super(props); 25 super(props);
17 this.state = { 26 this.state = {
18 show: false 27 show: false
19 }; 28 };
20 this.showModal = this.showModal.bind(this); 29 this.showModal = this.showModal.bind(this);
21 this.hideModal = this.hideModal.bind(this); 30 this.hideModal = this.hideModal.bind(this);
22 this.onUpdate = this.onUpdate.bind(this); 31 this.onUpdate = this.onUpdate.bind(this);
23 }; 32 };
24 33
25 showModal() { 34 showModal() {
26 this.setState({show: true}); 35 this.setState({show: true});
27 } 36 }
28 37
29 hideModal() { 38 hideModal() {
30 this.setState({show: false}); 39 this.setState({show: false});
31 } 40 }
32 onUpdate(key, value) { 41 onUpdate(key, value) {
33 this.setState({[key]: value}); 42 this.setState({[key]: value});
34 }; 43 };
35 44
36 render() { 45 render() {
46 console.log(this.props);
37 return ( 47 return (
38 <ButtonToolbar> 48 <ButtonToolbar>
39 <Button bsStyle="primary" onClick={this.showModal}> 49 <Button bsStyle="primary" onClick={this.showModal}>
40 Upload CSV 50 Upload CSV
41 </Button> 51 </Button>
42 <Modal 52 <Modal
43 {...this.props} 53 {...this.props}
44 show={this.state.show} 54 show={this.state.show}
45 onHide={this.hideModal} 55 onHide={this.hideModal}
46 dialogClassName="custom-modal" 56 dialogClassName="custom-modal"
47 > 57 >
48 <Modal.Header closeButton> 58 <Modal.Header closeButton>
49 <Modal.Title id="contained-modal-title-lg">New Student</Modal.Title> 59 <Modal.Title id="contained-modal-title-lg">New Student</Modal.Title>
50 </Modal.Header> 60 </Modal.Header>
51 <Modal.Body> 61 <Modal.Body>
62 <form>
52 <FieldGroup 63 <FieldGroup
53 id="formControlsFile" 64 id="formControlsFile"
54 type="file" 65 type="file"
55 label="File" 66 label="File"
56 help="Example block-level help text here." 67 help="Example block-level help text here."
57 /> 68 />
69 </form>
58 </Modal.Body> 70 </Modal.Body>
59 <Modal.Footer> 71 <Modal.Footer>
60 <Button onClick={this.hideModal}>Close</Button> 72 <Button onClick={this.hideModal}>Close</Button>
61 </Modal.Footer> 73 </Modal.Footer>
62 </Modal> 74 </Modal>
63 </ButtonToolbar> 75 </ButtonToolbar>
64 ); 76 );
65 }; 77 };
66 78
67 }; 79 };
68 80
imports/client/views/org/admin/students/index.js
1 // import { StudentDataController } from '/imports/client/views/org/admin/students/index' 1 // import { StudentDataController } from '/imports/client/views/org/admin/students/index'
2 import _ from 'lodash'; 2 import _ from 'lodash';
3 import { 3 import {
4 composeWithTracker, 4 composeWithTracker,
5 compose, 5 compose,
6 composeAll 6 composeAll
7 } from 'react-komposer'; 7 } from 'react-komposer';
8 import { Loading } from '/imports/client/components/Loading'; 8 import { Loading } from '/imports/client/components/Loading';
9 9
10 import { Orgs } from '/imports/collections/orgs/index'; 10 import { Orgs } from '/imports/collections/orgs/index';
11 import { Users } from '/imports/collections/users/index'; 11 import { Users } from '/imports/collections/users/index';
12 import { StudentView } from './StudentView'; 12 import { StudentView } from './StudentView';
13 import { Students } from '/imports/collections/students/index'; 13 import { Students } from '/imports/collections/students/index';
14 14
15 15
16 const meteorTick = (props, onData) => { 16 const meteorTick = (props, onData) => {
17 17
18 const handles = [ 18 const handles = [
19 Meteor.subscribe('users.current'), 19 Meteor.subscribe('users.current'),
20 Meteor.subscribe('orgs.current'), 20 Meteor.subscribe('orgs.current'),
21 Meteor.subscribe('users.forMyOrg'), 21 Meteor.subscribe('users.forMyOrg'),
22 Meteor.subscribe('student.forMyOrg'), 22 Meteor.subscribe('student.forMyOrg'),
23 ]; 23 ];
24 24
25 if(_.every(handles, (handle) => (handle.ready()) )) { 25 if(_.every(handles, (handle) => (handle.ready()) )) {
26 const user = Users.current(); 26 const user = Users.current();
27 const org = Orgs.current(); 27 const org = Orgs.current();
28 const students = Users.find({"role":"STUDENT"}).fetch(); 28 students = Users.find({"role":"STUDENT"}).fetch();
29 const StudentData = Students.find().fetch(); 29 studentData = Students.find().fetch();
30 console.log("StudentData"); 30 for(var i=0; i< students.length; i++){
31 console.log(StudentData); 31 for(var j=0; j< studentData.length; j++){
32 if(students[i]._id == studentData[j].userId){
33 students[i].class = studentData[j].class;
34 students[i].dob = studentData[j].dob;
35 }
36 }
37 }
32 onData(null, { 38 onData(null, {
33 data: { 39 data: {
34 user: user, 40 user: user,
35 org: org, 41 org: org,
36 students:students 42 students: students,
43 studentData: studentData
37 }, 44 },
38 }); 45 });
39 } 46 }
40 47
41 return () => { 48 return () => {
42 _.each(handles, (handle) => handle.stop() ); 49 _.each(handles, (handle) => handle.stop() );
43 }; 50 };
44 }; 51 };
45 52
46 53
47 const reduxTick = (props, onData) => { 54 const reduxTick = (props, onData) => {
48 onData(null, { 55 onData(null, {
49 data: {} 56 data: {}
50 }); 57 });
51 }; 58 };
52 59
53 60
54 export const StudentDataController = composeAll( 61 export const StudentDataController = composeAll(
55 composeWithTracker(meteorTick, Loading), 62 composeWithTracker(meteorTick, Loading),
56 compose(reduxTick, Loading), 63 compose(reduxTick, Loading),
57 )(StudentView); 64 )(StudentView);
58 65
imports/client/views/org/app/module/AppLayout.js
1 import _ from 'lodash'; 1 import _ from 'lodash';
2 import { Meteor } from 'meteor/meteor'; 2 import { Meteor } from 'meteor/meteor';
3 import React, { Component } from 'react'; 3 import React, { Component } from 'react';
4 import { Link } from 'react-router'; 4 import { Link } from 'react-router';
5 import { Avatar } from '/imports/client/components/Avatar'; 5 import { Avatar } from '/imports/client/components/Avatar';
6 import { Icon } from '/imports/client/components/Icon'; 6 import { Icon } from '/imports/client/components/Icon';
7 import classNames from 'classnames'; 7 import classNames from 'classnames';
8 import { EnterModule } from '/imports/client/views/org/enter/module/index'; 8 import { EnterModule } from '/imports/client/views/org/enter/module/index';
9 // import { VerifyModule } from '/imports/client/views/verify/module/index'; 9 // import { VerifyModule } from '/imports/client/views/verify/module/index';
10 import { Navbar,Modal, Nav, NavItem, 10 import { Navbar,Modal, Nav, NavItem,
11 Glyphicon, Collapse, 11 Glyphicon, Collapse,
12 NavbarToggler, NavbarBrand, 12 NavbarToggler, NavbarBrand,
13 NavLink, DropdownItem, DropdownToggle, DropdownMenu, 13 NavLink, DropdownItem, DropdownToggle, DropdownMenu,
14 NavDropdown, MenuItem } from 'react-bootstrap'; 14 NavDropdown, MenuItem } from 'react-bootstrap';
15 15 import { VerifyModule } from '/imports/client/views/verify/module/index'
16
16 var Accordion = require('react-bootstrap').Accordion; 17 var Accordion = require('react-bootstrap').Accordion;
17 var Panel = require('react-bootstrap').Panel; 18 var Panel = require('react-bootstrap').Panel;
18 export class AppLayout extends Component { 19 export class AppLayout extends Component {
19 20
20 render() { 21 render() {
21 console.log(this.props); 22 console.log(this.props);
22 const {user} = this.props.data; 23 const {user} = this.props.data;
23 24
24 if(!user) { 25 if(!user) {
25 return ( 26 return (
26 <EnterModule 27 <EnterModule
27 pane = {this.props.location.query.enter} 28 pane = {this.props.location.query.enter}
28 location = {this.props.location} 29 location = {this.props.location}
29 /> 30 />
30 ); 31 );
31 } 32 }
33 if(!user.isEmailVerified()) {
34 return (
35 <VerifyModule
36 pane = {this.props.location.query.verify}
37 location = {this.props.location}
38 />
39 );
40 }
32 return ( 41 return (
33 42
34 <div className = "appLayout-box"> 43 <div className = "appLayout-box">
35 <div className="page-container"> 44 <div className="page-container">
36 <div className="page-content"> 45 <div className="page-content">
37 <div className="sidebar sidebar-main sidebar-default"> 46 <div className="sidebar sidebar-main sidebar-default">
38 <div className="sidebar-content"> 47 <div className="sidebar-content">
39 48
40 <div className="sidebar-category sidebar-category-visible"> 49 <div className="sidebar-category sidebar-category-visible">
41 <div className="category-content no-padding"> 50 <div className="category-content no-padding">
42 <Nav className="navigation navigation-main navigation-accordion"> 51 <Nav className="navigation navigation-main navigation-accordion">
43 <NavItem className="navigation-header"><span>#schoolname</span> <i className="icon-menu" title="Main pages"></i></NavItem> 52 <NavItem className="navigation-header"><span>#schoolname</span> <i className="icon-menu" title="Main pages"></i></NavItem>
44 <NavItem className="active" eventKey={1} href="#"><i className="icon-home4"></i> <span>Dashboard</span></NavItem> 53 <NavItem className="active" eventKey={1} href="#"><i className="icon-home4"></i> <span>Dashboard</span></NavItem>
45 54
46 <NavDropdown eventKey={2} title="Settings" id="setting"> 55 <NavDropdown eventKey={2} title="Settings" id="setting">
47 <MenuItem eventKey={2.1}>Information</MenuItem> 56 <MenuItem eventKey={2.1}>Information</MenuItem>
48 <MenuItem eventKey={2.2}>Infrastructure</MenuItem> 57 <MenuItem eventKey={2.2}>Infrastructure</MenuItem>
49 <MenuItem eventKey={2.3}>Users</MenuItem> 58 <MenuItem eventKey={2.3}>Users</MenuItem>
50 <MenuItem eventKey={2.4}>Academic Settings</MenuItem> 59 <MenuItem eventKey={2.4}>Academic Settings</MenuItem>
51 <MenuItem eventKey={2.5}>Account Configuration</MenuItem> 60 <MenuItem eventKey={2.5}>Account Configuration</MenuItem>
52 61
53 </NavDropdown> 62 </NavDropdown>
54 <li> 63 <li>
55 <a href="#"><i className="icon-copy"></i> <span>Academic</span></a> 64 <a href="#"><i className="icon-copy"></i> <span>Academic</span></a>
56 <ul> 65 <ul>
57 <li><a href="../../../layout_1/LTR/index.html" id="layout1">Layout 1</a></li> 66 <li><a href="../../../layout_1/LTR/index.html" id="layout1">Layout 1</a></li>
58 <li><a href="index.html" id="layout2">Layout 2 <span className="label bg-warning-400">Current</span></a></li> 67 <li><a href="index.html" id="layout2">Layout 2 <span className="label bg-warning-400">Current</span></a></li>
59 <li><a href="../../../layout_3/LTR/index.html" id="layout3">Layout 3</a></li> 68 <li><a href="../../../layout_3/LTR/index.html" id="layout3">Layout 3</a></li>
60 <li><a href="../../../layout_4/LTR/index.html" id="layout4">Layout 4</a></li> 69 <li><a href="../../../layout_4/LTR/index.html" id="layout4">Layout 4</a></li>
61 <li><a href="../../../layout_5/LTR/index.html" id="layout5">Layout 5</a></li> 70 <li><a href="../../../layout_5/LTR/index.html" id="layout5">Layout 5</a></li>
62 <li className="disabled"><a href="../../../layout_6/LTR/index.html" id="layout6">Layout 6 <span className="label label-transparent">Coming soon</span></a></li> 71 <li className="disabled"><a href="../../../layout_6/LTR/index.html" id="layout6">Layout 6 <span className="label label-transparent">Coming soon</span></a></li>
63 </ul> 72 </ul>
64 </li> 73 </li>
65 <li> 74 <li>
66 <a href="#"><i className="glyphicon glyphicon-send"></i> <span>Communication</span></a> 75 <a href="#"><i className="glyphicon glyphicon-send"></i> <span>Communication</span></a>
67 <ul> 76 <ul>
68 <li><a href="#">Primary palette</a></li> 77 <li><a href="#">Primary palette</a></li>
69 <li><a href="#">Danger palette</a></li> 78 <li><a href="#">Danger palette</a></li>
70 <li><a href="#">Success palette</a></li> 79 <li><a href="#">Success palette</a></li>
71 <li><a href="#">Warning palette</a></li> 80 <li><a href="#">Warning palette</a></li>
72 <li><a href="#">Info palette</a></li> 81 <li><a href="#">Info palette</a></li>
73 <li className="navigation-divider"></li> 82 <li className="navigation-divider"></li>
74 <li><a href="#">Pink palette</a></li> 83 <li><a href="#">Pink palette</a></li>
75 <li><a href="#">Violet palette</a></li> 84 <li><a href="#">Violet palette</a></li>
76 <li><a href="#">Purple palette</a></li> 85 <li><a href="#">Purple palette</a></li>
77 <li><a href="#">Indigo palette</a></li> 86 <li><a href="#">Indigo palette</a></li>
78 <li><a href="colors_blue.html">Blue palette</a></li> 87 <li><a href="colors_blue.html">Blue palette</a></li>
79 <li><a href="colors_teal.html">Teal palette</a></li> 88 <li><a href="colors_teal.html">Teal palette</a></li>
80 <li><a href="colors_green.html">Green palette</a></li> 89 <li><a href="colors_green.html">Green palette</a></li>
81 <li><a href="colors_orange.html">Orange palette</a></li> 90 <li><a href="colors_orange.html">Orange palette</a></li>
82 <li><a href="colors_brown.html">Brown palette</a></li> 91 <li><a href="colors_brown.html">Brown palette</a></li>
83 <li><a href="colors_grey.html">Grey palette</a></li> 92 <li><a href="colors_grey.html">Grey palette</a></li>
84 <li><a href="colors_slate.html">Slate palette</a></li> 93 <li><a href="colors_slate.html">Slate palette</a></li>
85 </ul> 94 </ul>
86 </li> 95 </li>
87 <li> 96 <li>
88 <a href="#"><i className="glyphicon glyphicon-stats"></i> <span>Finance</span></a> 97 <a href="#"><i className="glyphicon glyphicon-stats"></i> <span>Finance</span></a>
89 <ul> 98 <ul>
90 <li><a href="starters/horizontal_nav.html">Horizontal navigation</a></li> 99 <li><a href="starters/horizontal_nav.html">Horizontal navigation</a></li>
91 <li><a href="starters/1_col.html">1 column</a></li> 100 <li><a href="starters/1_col.html">1 column</a></li>
92 <li><a href="starters/2_col.html">2 columns</a></li> 101 <li><a href="starters/2_col.html">2 columns</a></li>
93 <li> 102 <li>
94 <a href="#">3 columns</a> 103 <a href="#">3 columns</a>
95 <ul> 104 <ul>
96 <li><a href="starters/3_col_dual.html">Dual sidebars</a></li> 105 <li><a href="starters/3_col_dual.html">Dual sidebars</a></li>
97 <li><a href="starters/3_col_double.html">Double sidebars</a></li> 106 <li><a href="starters/3_col_double.html">Double sidebars</a></li>
98 </ul> 107 </ul>
99 </li> 108 </li>
100 <li><a href="starters/4_col.html">4 columns</a></li> 109 <li><a href="starters/4_col.html">4 columns</a></li>
101 <li> 110 <li>
102 <a href="#">Detached layout</a> 111 <a href="#">Detached layout</a>
103 <ul> 112 <ul>
104 <li><a href="starters/detached_left.html">Left sidebar</a></li> 113 <li><a href="starters/detached_left.html">Left sidebar</a></li>
105 <li><a href="starters/detached_right.html">Right sidebar</a></li> 114 <li><a href="starters/detached_right.html">Right sidebar</a></li>
106 <li><a href="starters/detached_sticky.html">Sticky sidebar</a></li> 115 <li><a href="starters/detached_sticky.html">Sticky sidebar</a></li>
107 </ul> 116 </ul>
108 </li> 117 </li>
109 <li><a href="starters/layout_boxed.html">Boxed layout</a></li> 118 <li><a href="starters/layout_boxed.html">Boxed layout</a></li>
110 <li className="navigation-divider"></li> 119 <li className="navigation-divider"></li>
111 <li><a href="starters/layout_navbar_fixed_main.html">Fixed main navbar</a></li> 120 <li><a href="starters/layout_navbar_fixed_main.html">Fixed main navbar</a></li>
112 <li><a href="starters/layout_navbar_fixed_secondary.html">Fixed secondary navbar</a></li> 121 <li><a href="starters/layout_navbar_fixed_secondary.html">Fixed secondary navbar</a></li>
113 <li><a href="starters/layout_navbar_fixed_both.html">Both navbars fixed</a></li> 122 <li><a href="starters/layout_navbar_fixed_both.html">Both navbars fixed</a></li>
114 <li><a href="starters/layout_fixed.html">Fixed layout</a></li> 123 <li><a href="starters/layout_fixed.html">Fixed layout</a></li>
115 </ul> 124 </ul>
116 </li> 125 </li>
117 <li><a href=""><i className="icon-file-stats"></i><span> Reports </span></a></li> 126 <li><a href=""><i className="icon-file-stats"></i><span> Reports </span></a></li>
118 <li><a href=""><i className="icon-design"></i> <span>Examinations</span></a></li> 127 <li><a href=""><i className="icon-design"></i> <span>Examinations</span></a></li>
119 128
120 </Nav> 129 </Nav>
121 </div> 130 </div>
122 </div> 131 </div>
123 </div> 132 </div>
124 </div> 133 </div>
125 {/*end sidebar*/} 134 {/*end sidebar*/}
126 <div className="content-wrapper"> 135 <div className="content-wrapper">
127 136
128 <div className="page-header page-header-default"> 137 <div className="page-header page-header-default">
129 <div className="breadcrumb-line"> 138 <div className="breadcrumb-line">
130 <ul className="breadcrumb"> 139 <ul className="breadcrumb">
131 <li><a href="index.html"><i className="icon-home2 position-left"></i> Users</a></li> 140 <li><a href="index.html"><i className="icon-home2 position-left"></i> Users</a></li>
132 <li className="active">Setup</li> 141 <li className="active">Setup</li>
133 </ul> 142 </ul>
134 143
135 <ul className="breadcrumb-elements"> 144 <ul className="breadcrumb-elements">
136 <li><a href="#"><i className="icon-comment-discussion position-left"></i> Support</a></li> 145 <li><a href="#"><i className="icon-comment-discussion position-left"></i> Support</a></li>
137 <li className="dropdown"> 146 <li className="dropdown">
138 <a href="#" className="dropdown-toggle" data-toggle="dropdown"> 147 <a href="#" className="dropdown-toggle" data-toggle="dropdown">
139 <i className="icon-gear position-left"></i> 148 <i className="icon-gear position-left"></i>
140 Settings 149 Settings
141 <span className="caret"></span> 150 <span className="caret"></span>
142 </a> 151 </a>
143 152
144 <ul className="dropdown-menu dropdown-menu-right"> 153 <ul className="dropdown-menu dropdown-menu-right">
145 <li><a href="#"><i className="icon-user-lock"></i> Account security</a></li> 154 <li><a href="#"><i className="icon-user-lock"></i> Account security</a></li>
146 <li><a href="#"><i className="icon-statistics"></i> Analytics</a></li> 155 <li><a href="#"><i className="icon-statistics"></i> Analytics</a></li>
147 <li><a href="#"><i className="icon-accessibility"></i> Accessibility</a></li> 156 <li><a href="#"><i className="icon-accessibility"></i> Accessibility</a></li>
148 <li className="divider"></li> 157 <li className="divider"></li>
149 <li><a href="#"><i className="icon-gear"></i> All settings</a></li> 158 <li><a href="#"><i className="icon-gear"></i> All settings</a></li>
150 </ul> 159 </ul>
151 </li> 160 </li>
152 </ul> 161 </ul>
153 </div> 162 </div>
154 </div> 163 </div>
155 </div> 164 </div>
156 {/*end content*/} 165 {/*end content*/}
157 166
158 </div> 167 </div>
159 </div> 168 </div>
160 169
161 <div className = "appLayout-wrapOuter"> 170 <div className = "appLayout-wrapOuter">
162 <div className = "appLayout-wrapInner"> 171 <div className = "appLayout-wrapInner">
163 <div className = "appLayout-menuWrap"> 172 <div className = "appLayout-menuWrap">
164 173
165 </div> 174 </div>
166 <div className = "appLayout-contentWrap"> 175 <div className = "appLayout-contentWrap">
167 <div className = "appLayout-content"> 176 <div className = "appLayout-content">
168 { this.props.children } 177 { this.props.children }
169 </div> 178 </div>
170 </div> 179 </div>
171 </div> 180 </div>
172 </div> 181 </div>
173 </div> 182 </div>
174 ); 183 );
175 }; 184 };
176 185
177 }; 186 };
178 187