diff --git a/imports/client/views/core/DatePicker.js b/imports/client/views/core/DatePicker.js index 85d4e04..2aebdba 100644 --- a/imports/client/views/core/DatePicker.js +++ b/imports/client/views/core/DatePicker.js @@ -4,18 +4,25 @@ import 'jquery-ui/ui/widgets/datepicker' class DatePicker extends Component { componentDidMount() { + SELF = this; $('.datepicker').datepicker({ changeMonth: true, changeYear: true, showButtonPanel: true, - yearRange: '-116:-1', - dateFormat: 'dd/mm/yy' + yearRange: '-25:-1', + dateFormat: 'dd/mm/yy', + onSelect: function(dateText, inst) { + var date = $(this).val(); + // $("#datepickerDOB").val(date); + SELF.props.setValue('dob',date); + } }); } render() { return ( +
+ + + Users + + + Setup + + + + +
+ + ); + }; + +}; diff --git a/imports/client/views/org/admin/Header.js b/imports/client/views/org/admin/Header.js new file mode 100644 index 0000000..876934f --- /dev/null +++ b/imports/client/views/org/admin/Header.js @@ -0,0 +1,58 @@ +import _ from 'lodash'; +import { Meteor } from 'meteor/meteor'; + +import React, { Component } from 'react'; +import { Link,browserHistory } from 'react-router'; +import { FormGroup, + FormControl,Glyphicon,Button } from 'react-bootstrap'; + + +export class Header extends Component { + + constructor(props) { + super(props); + this.state = { + + }; + this.onUpdate = this.onUpdate.bind(this); + }; + + onUpdate(key, value) { + this.setState({[key]: value}); + }; + + render() { + return ( +
+
+
+
+ +
+ +
+
+
Students Click to view
+
+ +
+
+
+
+ +
+ +
+
+
Teachers Click to view
+
+ +
+
+ +
+
+ ); + }; + +}; diff --git a/imports/client/views/org/admin/Sidebar.js b/imports/client/views/org/admin/Sidebar.js new file mode 100644 index 0000000..3ee7740 --- /dev/null +++ b/imports/client/views/org/admin/Sidebar.js @@ -0,0 +1,85 @@ +import _ from 'lodash'; +import { Meteor } from 'meteor/meteor'; + +import React, { Component } from 'react'; +import { Link,browserHistory } from 'react-router'; +import { Navbar,Modal, Nav, NavItem, + Glyphicon, Collapse, FormGroup, FormControl, Panel, + NavbarToggler, NavbarBrand, Table, ButtonToolbar, + NavLink, DropdownItem, DropdownToggle, DropdownMenu, + NavDropdown, MenuItem, Breadcrumb, Button } from 'react-bootstrap'; + + +export class AdminSidebar extends Component { + + constructor(props) { + super(props); + this.state = { + + }; + this.onUpdate = this.onUpdate.bind(this); + }; + + onUpdate(key, value) { + this.setState({[key]: value}); + }; + + render() { + const {user, org} = this.props; + return ( +
+
+
+
+ +
+
+
+
+ ); + }; + +}; diff --git a/imports/client/views/org/admin/students/AddStudentFormContainer.js b/imports/client/views/org/admin/students/AddStudentFormContainer.js index 15974c3..83f0024 100644 --- a/imports/client/views/org/admin/students/AddStudentFormContainer.js +++ b/imports/client/views/org/admin/students/AddStudentFormContainer.js @@ -51,13 +51,12 @@ export class AddStudentFormContainer extends Component { validations={{ admissionId: [(value) => isRequired('Admission id', value)], firstName: [(value) => isRequired('First name', value)], - middleName: [(value) => isRequired('Middle name', value)], lastName: [(value) => isRequired('Last name', value)], email: [(value) => isRequired('Email', value), isValidEmail], dob: [(value) => isRequired('Date of birth', value)], gender: [(value) => isRequired('Gender', value)], rollNo: [(value) => this.state.currentStep === 1 && isRequired('Roll no', value)], - class: [(value) => this.state.currentStep === 1 && isRequired('Class', value)], + studentClass: [(value) => this.state.currentStep === 1 && isRequired('Class', value)], section: [(value) => this.state.currentStep === 1 && isRequired('Section', value)], community: [(value) => this.state.currentStep === 1 && isRequired('Community', value)], bloodGroup: [(value) => this.state.currentStep === 1 && isRequired('Blood group', value)], diff --git a/imports/client/views/org/admin/students/Header.js b/imports/client/views/org/admin/students/Header.js deleted file mode 100644 index bdc3550..0000000 --- a/imports/client/views/org/admin/students/Header.js +++ /dev/null @@ -1,98 +0,0 @@ -import _ from 'lodash'; -import { Meteor } from 'meteor/meteor'; - -import React, { Component } from 'react'; -import { Link,browserHistory } from 'react-router'; -import { FormGroup, - FormControl,Glyphicon,Button } from 'react-bootstrap'; - - -export class Header extends Component { - - constructor(props) { - super(props); - this.state = { - - }; - this.onUpdate = this.onUpdate.bind(this); - }; - - onUpdate(key, value) { - this.setState({[key]: value}); - }; - - render() { - return ( -
-
-
-
-
-
- - - -
-
-
Students
- Click to view -
-
-
-
-
-
-
-
- - - -
- -
-
Teachers
- Click to view -
-
-
-
- -
-
-
-
- - - -
- -
-
Parents
- Click to view -
-
-
-
- -
-
-
-
- - - -
- -
-
Non Teaching Staff
- Click to view -
-
-
-
-
-
- ); - }; - -}; diff --git a/imports/client/views/org/admin/students/StudentForm.js b/imports/client/views/org/admin/students/StudentForm.js index 29eb8f1..2db920a 100644 --- a/imports/client/views/org/admin/students/StudentForm.js +++ b/imports/client/views/org/admin/students/StudentForm.js @@ -67,34 +67,36 @@ const StudentForm = props => ( - - - - props.setValue('middleName', e.target.value)} - /> - {props.isSubmitted() && props.errors && props.errors.middleName && ( - {props.errors.middleName} - )} - - - - - - props.setValue('lastName', e.target.value)} - /> - {props.isSubmitted() && props.errors && props.errors.lastName && ( - {props.errors.lastName} - )} - - + + + + props.setValue('lastName', e.target.value)} + /> + {props.isSubmitted() && props.errors && props.errors.lastName && ( + {props.errors.lastName} + )} + + + + + + props.setValue('gender', e.target.value)} + > + + + + {props.isSubmitted() && props.errors && props.errors.gender && ( + {props.errors.gender} + )} + + @@ -116,6 +118,7 @@ const StudentForm = props => ( { props.setValue('dob', e.target.value) @@ -128,22 +131,7 @@ const StudentForm = props => ( - - - - props.setValue('gender', e.target.value)} - > - - - - {props.isSubmitted() && props.errors && props.errors.gender && ( - {props.errors.gender} - )} - - + )} @@ -170,12 +158,12 @@ const StudentForm = props => ( props.setValue('class', e.target.value)} + onChange={e => props.setValue('studentClass', e.target.value)} /> - {props.isSubmitted() && props.errors && props.errors.class && ( - {props.errors.class} + {props.isSubmitted() && props.errors && props.errors.studentClass && ( + {props.errors.studentClass} )} @@ -419,6 +407,20 @@ const StudentForm = props => ( + + + + props.setValue('parentState', e.target.value)} + /> + {props.isSubmitted() && props.errors && props.errors.parentState && ( + {props.errors.parentState} + )} + + diff --git a/imports/client/views/org/admin/students/StudentView.js b/imports/client/views/org/admin/students/StudentView.js index 528a89d..0eb6e05 100644 --- a/imports/client/views/org/admin/students/StudentView.js +++ b/imports/client/views/org/admin/students/StudentView.js @@ -8,11 +8,13 @@ import { Navbar,Modal, Nav, NavItem, NavbarToggler, NavbarBrand, Table, ButtonToolbar, NavLink, DropdownItem, DropdownToggle, DropdownMenu, NavDropdown, MenuItem, Breadcrumb, Button } from 'react-bootstrap'; -import { AddStudent } from './addStudent'; import { StudentTable } from './view/StudentTable'; -import { Header } from './Header'; +import { Header } from '../Header'; +import { AdminSidebar } from '../Sidebar' +import { AdminBreadcrumb } from '../Breadcrumb' import { FabMenuView } from './FabMenu'; import { UploadCsv } from './UploadCsv'; +import { AddStudent } from './addStudent'; import { Students } from '/imports/collections/students/index'; @@ -42,7 +44,6 @@ export class StudentView extends Component { }; render() { - console.log(this.props); firstNameSearch = this.state.firstNameSearch; lastNameSearch = this.state.lastNameSearch; var students =_.filter(this.props.data.students,function(item){ @@ -54,85 +55,13 @@ export class StudentView extends Component {
-
-
- -
-
- -
-
-
-
+ {/*end sidebar*/}
-
-
- - - Users - - - Setup - - - -
    - Support - - Account security - Analytics - Accessibility - - All settings - - -
-
-
+ {/*content*/}
diff --git a/imports/client/views/org/admin/teachers/index.js b/imports/client/views/org/admin/teachers/index.js index 7447c66..47bdca4 100644 --- a/imports/client/views/org/admin/teachers/index.js +++ b/imports/client/views/org/admin/teachers/index.js @@ -9,7 +9,8 @@ import { Loading } from '/imports/client/components/Loadi import { Orgs } from '/imports/collections/orgs/index'; import { Users } from '/imports/collections/users/index'; -import { teachersView } from './teachersView'; +import { Teachers } from '/imports/collections/teachers/index'; +import { TeachersView } from './TeachersView'; const meteorTick = (props, onData) => { @@ -21,10 +22,22 @@ const meteorTick = (props, onData) => { if(_.every(handles, (handle) => (handle.ready()) )) { const user = Users.current(); const org = Orgs.current(); + teachers = Users.find({"role":"TEACHER"}).fetch() ? Users.find({"role":"TEACHER"}).fetch() : ""; + teachersData = Teachers.find().fetch() ? Teachers.find().fetch() : ""; + for(var i=0; i< teachers.length; i++){ + for(var j=0; j< teachers.length; j++){ + if(teachers[i]._id == teachersData[j].userId){ + teachers[i].class = teachersData[j].class; + teachers[i].dob = teachersData[j].dob; + } + } + } onData(null, { data: { user: user, - org: org + org: org, + teachersData: teachersData, + teachers: teachers }, }); } @@ -45,4 +58,4 @@ const reduxTick = (props, onData) => { export const teachersViewController = composeAll( composeWithTracker(meteorTick, Loading), compose(reduxTick, Loading), -)(teachersView); +)(TeachersView); diff --git a/imports/client/views/org/admin/teachers/teachersView.js b/imports/client/views/org/admin/teachers/teachersView.js index 4095efb..eff92ed 100644 --- a/imports/client/views/org/admin/teachers/teachersView.js +++ b/imports/client/views/org/admin/teachers/teachersView.js @@ -5,10 +5,12 @@ import React, { Component } from 'react'; import { Link,browserHistory } from 'react-router'; import { FormGroup, FormControl,Glyphicon,Button } from 'react-bootstrap'; +import { Header } from '../Header'; +import { AdminSidebar } from '../Sidebar' +import { AdminBreadcrumb } from '../Breadcrumb' +import { TeachersTable } from './view/TeachersTable' - -export class teachersView extends Component { - +export class TeachersView extends Component { constructor(props) { super(props); this.state = { @@ -24,8 +26,81 @@ export class teachersView extends Component { render() { const {user, org} = this.props.data; return ( -
+
+
+
+ + {/*end sidebar*/} +
+ + {/*content*/} + +
+
+
+
+ + { + /** + + + */ + } +
+
+
+
+
+ +
+
+ Advanced Search +
    +
  • +
+
+
+
+
+ this.onUpdate('firstNameSearch',e.target.value)} + placeholder="First Name" + /> +
+ +
+
+
+
+
+
+
+ this.onUpdate('lastNameSearch',e.target.value)} + placeholder="Last Name" /> +
+ +
+
+
+
+
+
+
+
+
+
+
+
); }; diff --git a/imports/client/views/org/admin/teachers/view/TeachersRow.js b/imports/client/views/org/admin/teachers/view/TeachersRow.js new file mode 100644 index 0000000..2cd6950 --- /dev/null +++ b/imports/client/views/org/admin/teachers/view/TeachersRow.js @@ -0,0 +1,56 @@ +import _ from 'lodash'; +import { Meteor } from 'meteor/meteor'; + +import React, { Component } from 'react'; +import { Link,browserHistory } from 'react-router'; +import { FormGroup, + FormControl,Glyphicon,Button } from 'react-bootstrap'; + + +export class teachersRow extends Component { + + constructor(props) { + super(props); + this.state = { + + }; + this.onUpdate = this.onUpdate.bind(this); + }; + + onUpdate(key, value) { + this.setState({[key]: value}); + }; + + render() { + const {student} = this.props; + if(student.firstName){ + return ( + + {student.firstName} + {student.lastName} + {student.class} + {student.dob? moment(student.dob).format("LL") : } + Active + + + + + ); + }else { + return null; + } + + }; + +}; diff --git a/imports/client/views/org/admin/teachers/view/TeachersTable.js b/imports/client/views/org/admin/teachers/view/TeachersTable.js new file mode 100644 index 0000000..a3b5315 --- /dev/null +++ b/imports/client/views/org/admin/teachers/view/TeachersTable.js @@ -0,0 +1,65 @@ +import _ from 'lodash'; +import { Meteor } from 'meteor/meteor'; + +import React, { Component } from 'react'; +import { Link,browserHistory } from 'react-router'; +import { FormGroup,Panel,Table, + ButtonToolbar,Modal, + FormControl,Glyphicon,Button } from 'react-bootstrap'; +import {moment} from 'meteor/momentjs:moment' +import {TeachersRow} from './TeachersRow' + +export class TeachersTable extends Component { + + constructor(props) { + super(props); + this.state = { + show: false + }; + this.onUpdate = this.onUpdate.bind(this); + }; + onUpdate(key, value) { + this.setState({[key]: value}); + }; + + render() { + return ( +
+
+
Teachers Details
+
+
    +
  • +
  • +
+
+
+ + + + + + + + + + + + + { + this.props.teachers.map(function(student, i) + { + return( + + ) + }) + } + +
First NameLast NameClassDOBStatusActions
+
+ ); + }; + +}; diff --git a/imports/client/views/org/app/module/AppLayout.js b/imports/client/views/org/app/module/AppLayout.js index 3765216..eb312f0 100644 --- a/imports/client/views/org/app/module/AppLayout.js +++ b/imports/client/views/org/app/module/AppLayout.js @@ -87,7 +87,7 @@ export class AppLayout extends Component { Warning palett - + Reports Examinations @@ -118,73 +118,39 @@ export class AppLayout extends Component { All settings - +
- -
-
-
- -
- - -
- -
-
Students Click to view
- -
- -
-
- -
-
- -
- -
- -
-
Teachers Click to view
-
- -
-
- - - - -
- -
+
+
+
+ +
+ +
+
+
Students Click to view
+
+ +
+
+
+
+ +
+ +
+
+
Teachers Click to view
+
+ +
+
+ +
+
diff --git a/imports/collections/students/methods.js b/imports/collections/students/methods.js index fe866bc..82c9d85 100644 --- a/imports/collections/students/methods.js +++ b/imports/collections/students/methods.js @@ -28,14 +28,12 @@ export const addStudentManually = new ValidatedMethod({ validate: new SimpleSchema({ admissionId: { type: String }, firstName: { type: String }, - middleName: { type: String }, lastName: { type: String }, email: { type: String }, dob: { type: String }, - formattedDob: { type: String }, gender: { type: String }, rollNo: { type: String }, - studentclass: { type: String }, + studentClass: { type: String }, section: { type: String }, community: { type: String }, bloodGroup: { type: String }, @@ -62,16 +60,13 @@ export const addStudentManually = new ValidatedMethod({ orgId = user.orgId; newStudentId = Users.insert({ emails: [{address:data.email, verified: false}], - username: data.firstName, firstName: data.firstName, - middleName: data.middleName, lastName: data.lastName, orgId: orgId, role: 'STUDENT' }); newParentUserId = Users.insert({ emails: [{address:data.parentEmail, verified: false}], - username: data.parentName, firstName: data.parentName, orgId: orgId, role: 'PARENT' @@ -84,7 +79,7 @@ export const addStudentManually = new ValidatedMethod({ gender: data.gender, dob: data.dob, rollNo: data.rollNo, - class: data.studentclass, + studentClass: data.studentClass, section: data.section, bloodGroup: data.bloodGroup, community: data.community, @@ -99,7 +94,7 @@ export const addStudentManually = new ValidatedMethod({ gender: data.gender, dob: data.dob, rollNo: data.rollNo, - class: data.studentclass, + class: data.studentClass, section: data.section, bloodGroup: data.bloodGroup, community: data.community, diff --git a/imports/collections/teachers/index.js b/imports/collections/teachers/index.js new file mode 100644 index 0000000..db39d20 --- /dev/null +++ b/imports/collections/teachers/index.js @@ -0,0 +1,96 @@ +// import {Parents } from '/imports/collections/parents/index' + +import _ from 'lodash'; +import { Meteor } from 'meteor/meteor'; +import { Mongo } from 'meteor/mongo'; +import { SimpleSchema } from 'meteor/aldeed:simple-schema'; + +import { Orgs } from '/imports/collections/orgs/index'; +import { Users } from '/imports/collections/users/index'; + +class Teacher { + constructor(doc) { + _.assign(this, doc); + }; + + getUserIds() { + return _.filter(_.map(this.users, 'userId')); + }; +}; +export { Teacher }; + +class TeachersCollection extends Mongo.Collection { + insert(item, callback) { + _.assign(item, { + createdAt: new Date().getTime(), + }); + return super.insert(item, callback); + }; +}; + +export const Teachers = new TeachersCollection('Teachers', { + transform: (item) => { + return new Teacher(item); + }, +}); + +_.assign(Teachers, { + allStudents: () => { + const user = Users.current(); + if(!user) return null; + return Orgs.find({'users.userId': user._id}); + }, + current: () => { + const user = Users.current(); + if(!user) return null; + return Orgs.findOne({_id: user.orgId}); + }, + currentOrgUsers: () => { + const OrgsArr = Orgs.current(); + if(!OrgsArr) return null; + return OrgsArr.users; + }, + +}); + +Teachers.deny({ + insert() { return true; }, + update() { return true; }, + remove() { return true; }, +}); + + +Teachers.schema = new SimpleSchema({ + userId: { type: String }, + orgId: { type: String }, + type: { type: String }, + gender: { type: String, optional: true }, + services: { + type: Object, + optional: true, + blackbox: true, + }, + + isMetaUser: { type: Boolean, optional: true }, + + createdAt: { type: Date, autoValue: function(){return new Date();}} + +}); + +Teachers.attachSchema(Teachers.schema); + +Teachers.privateFields = { + orgId: 1, + address: 1, + + isMetaUser: 1, + createdAt: 1, +}; + +Teachers.publicFields = { + firstName: 1, + lastName: 1, + emails: 1, + + createdAt: 1, +}; diff --git a/imports/collections/teachers/methods.js b/imports/collections/teachers/methods.js new file mode 100644 index 0000000..17bd50b --- /dev/null +++ b/imports/collections/teachers/methods.js @@ -0,0 +1,22 @@ +// import {Parents } from '/imports/collections/parents/methods' +import _ from 'lodash'; +import { Meteor } from 'meteor/meteor'; +import { ValidatedMethod } from 'meteor/mdg:validated-method'; +import { SimpleSchema } from 'meteor/aldeed:simple-schema'; +import { DDPRateLimiter } from 'meteor/ddp-rate-limiter'; +import { Bert } from 'meteor/themeteorchef:bert'; +import { Users } from '/imports/collections/users/index'; +import { Teachers } from '/imports/collections/teachers/index'; +import { Orgs } from '/imports/collections/orgs/index'; +export const teachersMethods = new ValidatedMethod({ + name: 'teachers.method', + + validate: new SimpleSchema({ + itemId: { type: String }, + }).validator(), + + run({itemId}) { + return {}; + }, + +}); diff --git a/imports/collections/teachers/publications.js b/imports/collections/teachers/publications.js new file mode 100644 index 0000000..bfd6b17 --- /dev/null +++ b/imports/collections/teachers/publications.js @@ -0,0 +1,12 @@ +import { Meteor } from 'meteor/meteor'; +import { check, Match } from 'meteor/check' + +import { Orgs } from '/imports/collections/orgs/index'; +import { Users } from '/imports/collections/users/index'; +import { Teachers } from '/imports/collections/teachers/index'; + +Meteor.publish('teachers.forMyOrg', function () { + const user = Users.findOne({_id: this.userId}); + if(!user) return []; + return Teachers.find({orgId: user.orgId}); +}); diff --git a/imports/server/collections.js b/imports/server/collections.js index 5b3d9a6..74ee38f 100644 --- a/imports/server/collections.js +++ b/imports/server/collections.js @@ -6,3 +6,6 @@ import '/imports/collections/users/publications'; import '/imports/collections/students/methods'; import '/imports/collections/students/publications'; import '/imports/collections/students/serverCsvUpload'; + +import '/imports/collections/teachers/methods'; +import '/imports/collections/teachers/publications';