Skip to content

Instantly share code, notes, and snippets.

@s7dhansh
Last active February 20, 2017 11:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save s7dhansh/721cf0bff6f9e34784c9594b16b30639 to your computer and use it in GitHub Desktop.
Save s7dhansh/721cf0bff6f9e34784c9594b16b30639 to your computer and use it in GitHub Desktop.
/**
* @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