Last active
February 20, 2017 11:48
-
-
Save s7dhansh/721cf0bff6f9e34784c9594b16b30639 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* @author Sudhanshu | |
* @maintainers Sudhanshu | |
* @since Feb 08, 2017 | |
*/ | |
import React, {Component} from 'react'; | |
import { createContainer } from 'meteor/react-meteor-data'; | |
import { browserHistory } from 'react-router'; | |
import moment from 'moment'; | |
import '/imports/api/visit/methods.js'; | |
const { Config } = require('/imports/lib/config'); | |
const { INFO } = require('/imports/lib/infoDefs'); | |
const { Utils } = require('/imports/lib/utils'); | |
const { Groups, Units, Visits } = require('/imports/lib/collections'); | |
require('./day.scss'); | |
const convertVisitsToRequiredFormat = function(execs, visits) { | |
let newVisitsObj = {}; | |
Object.keys(execs).forEach((uid) => { | |
newVisitsObj[uid] = {}; | |
INFO.hours.forEach((h) => { newVisitsObj[uid][h] = []; }); | |
}); | |
visits.forEach((v) => { | |
if (!v.assignedTo) return; | |
if (!newVisitsObj[v.assignedTo][parseInt(moment(v.start).format('H'), 10)]) { | |
Log.error('Out of range: A visit is confirmed at ' + moment(v.start).format('hh:mm A')); | |
return; | |
} | |
newVisitsObj[v.assignedTo][parseInt(moment(v.start).format('H'), 10)].push(v); | |
}); | |
return newVisitsObj; | |
}; | |
const visitMap = function(v) { | |
v.unit = Units.findOne({_id: v.unitId}); | |
v.groupData = Groups.findOne({_id: v.groupId}); | |
v.className = INFO.getInfoName(INFO.visitStatuses, v.status, 'class'); | |
if (v.assignedTo) { | |
let assignee = Meteor.users.findOne({_id: v.assignedTo}); | |
if (assignee && assignee.services.google) v.userPic = assignee.services.google.picture; | |
v.assignee = Utils.userName(v.assignedTo); | |
} | |
return v; | |
}; | |
const fetchData = ({filterStates}) => { | |
$('title').text(moment(filterStates.date).format(Config.dateFormats.short)); | |
let visits = []; | |
let counts = {}; | |
if (!filterStates.relationship) { | |
let roles = (Meteor.user() || {}).roles; | |
if (!roles) return {ready: false, visits, counts, filterStates}; | |
if ((roles['settlin-buyer-ops'] || []).length) filterStates.relationship = 'buyer'; | |
else filterStates.relationship = 'seller'; | |
browserHistory.replace({ | |
pathname: location.pathname, | |
query: lodash.pickBy(filterStates, (v, k) => k !== 'date' && v !== null), | |
}); | |
} | |
let handle = Meteor.subscribe('visits', {date: filterStates.date, relationship: filterStates.relationship}); | |
window.vh = handle; // FIXME TODO | |
let ready = handle.ready(); | |
if (!ready) return {ready, visits, counts, filterStates}; | |
let confirmedToUsersObj = {}; | |
let query = {portal: true, 'status.inactive': false}; | |
if (filterStates.relationship === 'buyer') query = {...query, 'roles.settlin-buyer-ops': {$in: ['liaison']}}; | |
else query = {...query, 'roles.settlin-seller-ops': {$in: ['verifier']}, }; | |
Meteor.users.find(query).map(function(user) { | |
if (!filterStates.confirmedTo && Meteor.userId() === user._id) { | |
filterStates.confirmedTo = user._id; | |
browserHistory.replace({ | |
pathname: location.pathname, | |
query: lodash.pickBy(filterStates, (v, k) => k !== 'date' && v !== null), | |
}); | |
} | |
confirmedToUsersObj[user._id] = user.profile.name; | |
}); | |
if (!filterStates.confirmedTo) { | |
browserHistory.replace({ | |
pathname: location.pathname, | |
query: lodash.pickBy(this.state, (v, k) => k !== 'date' && v !== null), | |
}); | |
} | |
if (!Object.keys(confirmedToUsersObj).length) return {ready, visits, counts, filterStates}; | |
INFO.visitTypes.forEach((t) => { | |
counts[t.code] = {total: Visits.find({relationship: t.code, status: {$ne: 'cancelled'}}).count(), completed: Visits.find({relationship: t.code, status: 'completed'}).count()}; | |
}); | |
INFO.visitStatuses.forEach((s) => {counts[s.code] = Visits.find({relationship: filterStates.relationship, status: s.code}).count();}); | |
let q = {confirmedTo: {}}; | |
q.confirmedTo = filterStates.confirmedTo !== 'all' ? {assignedTo: {$in: [null, filterStates.confirmedTo]}} : null; | |
if (filterStates.status) visits = Visits.find({relationship: filterStates.relationship, status: filterStates.status, ...q.confirmedTo}, {sort: {start: 1}}).map(visitMap); | |
else { | |
// sort by cancelled | |
visits = [ | |
...Visits.find({relationship: filterStates.relationship, status: {$ne: 'cancelled'}, ...q.confirmedTo}, {sort: {start: 1, _id: 1}}).map(visitMap), | |
...Visits.find({relationship: filterStates.relationship, status: 'cancelled', ...q.confirmedTo}, {sort: {start: 1}}).map(visitMap) | |
]; | |
} | |
window.Visits = Visits; // TODO FIXME | |
if (filterStates.view === 'day') { | |
let confirmedToUsers = Object.keys(confirmedToUsersObj).map((id) => { return {code: id, name: confirmedToUsersObj[id]}; }); | |
return {ready, visits, counts, filterStates, confirmedToUsers: [{code: 'all', name: 'Confirmed To'}, ...confirmedToUsers]}; | |
} | |
if (filterStates.view === 'timeline') { | |
return {ready, visitsObj: convertVisitsToRequiredFormat(confirmedToUsersObj, visits), visits, counts, filterStates, confirmedToUsersObj}; | |
} | |
return {ready, visits, counts, filterStates, confirmedToUsers: [{code: 'all', name: 'Confirmed To'}]}; | |
}; | |
export default class VisitsDayView extends Component { | |
constructor(props) { | |
super(props); | |
let query = props.location.query; | |
this.state = {relationship: query.relationship || null, status: query.status || null, date: new Date(props.params.date), confirmedTo: query.confirmedTo || 'all', view: query.view || 'day'}; | |
} | |
componentWillReceiveProps(nextProps) { | |
let query = nextProps.location.query; | |
this.setState({relationship: query.relationship || null, status: query.status || null, date: new Date(nextProps.params.date), confirmedTo: query.confirmedTo || 'all', view: query.view || 'day'}); | |
} | |
render() { | |
let view = this.state.view, component; | |
if (view === 'timeline') { | |
const { VisitTimeLine } = require('/imports/client/components/visits/timeline'); | |
const VisitTimeLineContainer = createContainer(fetchData, VisitTimeLine); | |
component = <VisitTimeLineContainer filterStates={{...this.state}}/>; | |
} | |
else if (view === 'day') { | |
const { VisitList } = require('/imports/client/components/visits/list'); | |
const VisitListContainer = createContainer(fetchData, VisitList); | |
component = <VisitListContainer filterStates={{...this.state}}/>; | |
} | |
return <div id='visits-day-view'>{component}</div>; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment