"
6 | ],
7 | "moduleType": [
8 | "node"
9 | ],
10 | "license": "MIT",
11 | "private": true,
12 | "ignore": [
13 | "**/.*",
14 | "node_modules",
15 | "bower_components",
16 | "test",
17 | "tests"
18 | ],
19 | "dependencies": {
20 | "bootstrap": "~3.3.4"
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | ReactCalendar
6 |
7 |
8 |
9 |
10 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/src/stores/ChangeEmitter.js:
--------------------------------------------------------------------------------
1 | var _ = require('lodash');
2 | var EventEmitter = require('events').EventEmitter;
3 |
4 | /**
5 | * @extends EventEmitter.prototype
6 | */
7 | var CHANGE_EVENT = 'CHANGE_EVENT';
8 | var ChangeEmitter = _.assign({}, EventEmitter.prototype, {
9 | emitChange() {
10 | this.emit(CHANGE_EVENT);
11 | },
12 |
13 | addChangeListener(callback) {
14 | this.on(CHANGE_EVENT, callback);
15 | }
16 | });
17 |
18 | module.exports = ChangeEmitter;
--------------------------------------------------------------------------------
/src/components/ArrowButton.js:
--------------------------------------------------------------------------------
1 | var React = require('react');
2 | var _ = require('lodash');
3 |
4 | var _styles = {
5 | cursor: 'pointer'
6 | };
7 |
8 | var ArrowButton = React.createClass({
9 | propTypes: {
10 | onClick: React.PropTypes.func.isRequired,
11 | direction: React.PropTypes.oneOf(['left', 'right']).isRequired
12 | },
13 |
14 | render() {
15 | return (
16 |
20 |
21 |
22 | )
23 | },
24 |
25 | onClick(e) {
26 | e.preventDefault();
27 | e.stopPropogation();
28 | this.props.onClick();
29 | }
30 | });
31 |
32 | module.exports = ArrowButton;
--------------------------------------------------------------------------------
/src/actions/EventActions.js:
--------------------------------------------------------------------------------
1 | var AppDispatcher = require('../AppDispatcher');
2 |
3 | var _actions = {
4 | EVENT_CREATE: 'EVENT_CREATE',
5 | EVENT_UPDATE: 'EVENT_UPDATE',
6 | EVENT_DESTROY: 'EVENT_DESTROY'
7 | };
8 |
9 | var EventActions = {
10 | create(eventData) {
11 | AppDispatcher.dispatch({
12 | actionType: _actions.EVENT_CREATE,
13 | eventData: eventData
14 | });
15 | },
16 |
17 | update(eventId, eventData) {
18 | AppDispatcher.dispatch({
19 | actionType: _actions.EVENT_UPDATE,
20 | eventId: eventId,
21 | eventData: eventData
22 | });
23 | },
24 |
25 | destroy(eventId) {
26 | AppDispatcher.dispatch({
27 | actionType: _actions.EVENT_DESTROY,
28 | eventId: eventId
29 | });
30 | }
31 | };
32 |
33 | module.exports = EventActions;
34 | module.exports.actionNames = _actions;
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "reactCalendar",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "clean": "rm -rf ./dist",
8 | "build": "npm run clean && ./node_modules/.bin/webpack --optimize-minimize",
9 | "build-dev": "npm run clean && ./node_modules/.bin/webpack --watch --verbose",
10 | "server": "./node_modules/.bin/browser-sync start --config='./bs-config.js'",
11 | "develop": "npm run server & npm run build-dev"
12 | },
13 | "author": "",
14 | "license": "ISC",
15 | "dependencies": {
16 | "flux": "^2.0.1",
17 | "lodash": "^3.6.0",
18 | "moment": "^2.9.0",
19 | "react": "^0.13.1"
20 | },
21 | "devDependencies": {
22 | "webpack": "^1.8.5",
23 | "browser-sync": "2.6.5",
24 | "babel-core": "^5.1.10",
25 | "babel-loader": "^5.0.0",
26 | "babel-runtime": "^5.1.13"
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | #### To Run/Develop
2 |
3 | ```
4 | npm install && bower install
5 | npm run develop
6 | # You may have to reload your browser manually, once.
7 | ```
8 |
9 | See `package.json` for details :)
10 |
11 | ### 1st Attempt at Implementing [Facebook's Flux Architecture](http://facebook.github.io/flux/)
12 |
13 | Note: It was intentionally implemented **without** Flux first so that I could work through refactoring my *non-Flux hacks* into Flux. Also, this is my first shot/attempt at Flux. Don't judge me!
14 |
15 | ...TODO details/context :smile:
16 |
17 | Head on over to check out some of the [Pull Requests from building...](https://github.com/erikthedeveloper/react-calendar/pulls?q=is%3Apr+is%3Aclosed)
18 |
19 | some screenshots...
20 |
21 | 
22 |
23 | 
24 |
25 | 
26 |
27 |
--------------------------------------------------------------------------------
/src/actions/UserSelectedActions.js:
--------------------------------------------------------------------------------
1 | var AppDispatcher = require('../AppDispatcher');
2 |
3 | var _actions = {
4 | SELECT_DAY: 'SELECT_DAY',
5 | SELECT_EVENT: 'SELECT_EVENT',
6 | PANE_NAV_UP: 'PANE_NAV_UP',
7 | MONTH_NAV_PREV: 'MONTH_NAV_PREV',
8 | MONTH_NAV_NEXT: 'MONTH_NAV_NEXT'
9 | };
10 |
11 | var UserSelectedActions = {
12 |
13 | selectDay(dateArgs) {
14 | AppDispatcher.dispatch({
15 | actionType: _actions.SELECT_DAY,
16 | dateArgs: dateArgs
17 | });
18 | },
19 |
20 | selectEvent(eventId) {
21 | AppDispatcher.dispatch({
22 | actionType: _actions.SELECT_EVENT,
23 | eventId: eventId
24 | });
25 | },
26 |
27 | paneNavUp() {
28 | AppDispatcher.dispatch({
29 | actionType: _actions.PANE_NAV_UP
30 | });
31 | },
32 |
33 | monthNavPrev() {
34 | AppDispatcher.dispatch({
35 | actionType: _actions.MONTH_NAV_PREV
36 | });
37 | },
38 |
39 | monthNavNext() {
40 | AppDispatcher.dispatch({
41 | actionType: _actions.MONTH_NAV_NEXT
42 | });
43 | }
44 |
45 | };
46 |
47 | module.exports = UserSelectedActions;
48 | module.exports.actionNames = _actions;
--------------------------------------------------------------------------------
/src/components/FormAddDayEvent.js:
--------------------------------------------------------------------------------
1 | var React = require('react');
2 | var EventActions = require('../actions/EventActions');
3 | let InputBinder = require('./mixins/InputBinder');
4 | /**
5 | *
6 | */
7 | var FormAddDayEvent = React.createClass({
8 | mixins: [InputBinder],
9 |
10 | propTypes: {
11 | moment: React.PropTypes.object.isRequired
12 | },
13 |
14 | getInitialState() {
15 | return {
16 | newTitle: ''
17 | }
18 | },
19 |
20 | render() {
21 | return (
22 |
23 |
29 |
34 |
35 | );
36 | },
37 |
38 | addEvent() {
39 | var titleInput = React.findDOMNode(this.refs['newEventTitle']);
40 | var newEventData = {
41 | title: this.state.newTitle.trim(),
42 | moment: this.props.moment
43 | };
44 |
45 | if (newEventData.title.length === 0 )
46 | return;
47 |
48 | EventActions.create(newEventData);
49 | titleInput.value = "";
50 | titleInput.focus();
51 |
52 | }
53 | });
54 |
55 | module.exports = FormAddDayEvent;
--------------------------------------------------------------------------------
/src/components/GridMonth.js:
--------------------------------------------------------------------------------
1 | var React = require('react');
2 | var _ = require('lodash');
3 | var moment = require('moment');
4 |
5 | var EventStore = require('../stores/EventStore');
6 | var UserSelectedStore = require('../stores/UserSelectedStore');
7 |
8 | var GridDay = require('./GridDay');
9 | var DummyDay = require('./GridDay').GridDayDummy;
10 |
11 | var styles = {
12 | dayHeading: {
13 | float: 'left',
14 | width: 100/7 + '%',
15 | textAlign: 'center'
16 | }
17 | };
18 |
19 | var GridMonth = React.createClass({
20 |
21 | propTypes: {
22 | selectedMoment: React.PropTypes.object.isRequired
23 | },
24 |
25 | render() {
26 | var monthMoment = this.props.selectedMoment;
27 | return (
28 |
29 | {moment.weekdaysShort().map((day) =>
30 |
{day}
)}
31 | {this.renderDayBlocks(monthMoment)}
32 |
33 | )
34 | },
35 |
36 | renderDayBlocks(monthMoment) {
37 | var dayBlocks = [];
38 | var daysInMonth = monthMoment.daysInMonth();
39 | var padDays = function (daysToPad) {
40 | while (daysToPad--) dayBlocks.push();
41 | };
42 |
43 | padDays(monthMoment.clone().date(1).day());
44 |
45 | for (var i = 1; i <= daysInMonth; i++) {
46 | var dayMoment = moment(monthMoment).date(i);
47 | var isMonthMode = UserSelectedStore.getPaneType() !== 'month';
48 | dayBlocks.push();
54 | }
55 |
56 | padDays(6 - monthMoment.clone().date(daysInMonth).day());
57 |
58 | return dayBlocks;
59 | }
60 |
61 | });
62 |
63 | module.exports = GridMonth;
--------------------------------------------------------------------------------
/src/components/Calendar.js:
--------------------------------------------------------------------------------
1 | var React = require('react');
2 | var EventStore = require('../stores/EventStore');
3 | var UserSelectedStore = require('../stores/UserSelectedStore');
4 | var UserSelectedActions = require('../actions/UserSelectedActions');
5 | var GridMonth = require('./GridMonth');
6 | var DetailsPane = require('./DetailsPane');
7 | var ArrowButton = require('./ArrowButton');
8 |
9 | /**
10 | * Bootstrap 3 Grid Calendar component w/ self-contained "Details Pane"
11 | */
12 | var Calendar = React.createClass({
13 |
14 | render() {
15 |
16 | var monthMoment = this.state.selectedMoment;
17 |
18 | return (
19 |
20 |
21 |
22 |
23 |
24 | {monthMoment.format('MMMM')} - {monthMoment.format('YYYY')}
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 | )
35 | },
36 |
37 | getInitialState() {
38 | return {
39 | selectedMoment: UserSelectedStore.getMoment(),
40 | selectedType: UserSelectedStore.getPaneType(),
41 | events: EventStore.getAll()
42 | }
43 | },
44 |
45 | componentDidMount() {
46 | EventStore.addChangeListener(() => this.setState({events: EventStore.getAll()}));
47 | UserSelectedStore.addChangeListener(() => this.setState({
48 | selectedMoment: UserSelectedStore.getMoment()
49 | }));
50 | },
51 |
52 | prevMonth() {
53 | UserSelectedActions.monthNavPrev();
54 | },
55 |
56 | nextMonth() {
57 | UserSelectedActions.monthNavNext();
58 | }
59 |
60 | });
61 |
62 | module.exports = Calendar;
--------------------------------------------------------------------------------
/src/stores/UserSelectedStore.js:
--------------------------------------------------------------------------------
1 | var _ = require('lodash');
2 | var moment = require('moment');
3 | var AppDispatcher = require('../AppDispatcher');
4 | var ActionNames = require('../actions/UserSelectedActions').actionNames;
5 | var ChangeEmitter = require('./ChangeEmitter');
6 | var EventStore = require('./EventStore');
7 |
8 | var _moment = moment();
9 | var _paneType = 'month';
10 | var _eventId;
11 |
12 | /**
13 | * @extends ChangeEmitter
14 | */
15 | var UserSelectedStore = _.assign({}, ChangeEmitter, {
16 |
17 | /**
18 | * @return {moment}
19 | */
20 | getMoment() {
21 | return _moment;
22 | },
23 |
24 | /**
25 | * @return {string}
26 | */
27 | getPaneType() {
28 | return _paneType;
29 | },
30 |
31 | /**
32 | * @return {*}
33 | */
34 | getEvent() {
35 | return EventStore.get(_eventId);
36 | }
37 |
38 | });
39 |
40 | UserSelectedStore.dispatchToken = AppDispatcher.register(function (action) {
41 |
42 | switch (action.actionType) {
43 | case ActionNames.SELECT_DAY:
44 | _moment = moment(action.dateArgs);
45 | _paneType = 'day';
46 | UserSelectedStore.emitChange();
47 | break;
48 |
49 | case ActionNames.SELECT_EVENT:
50 | _eventId = action.eventId;
51 | _paneType = 'event';
52 | _moment = EventStore.get(_eventId).moment;
53 | UserSelectedStore.emitChange();
54 | break;
55 |
56 | case ActionNames.PANE_NAV_UP:
57 | _paneType = _paneType === 'event'
58 | ? 'day'
59 | : 'month';
60 | UserSelectedStore.emitChange();
61 | break;
62 |
63 | case ActionNames.MONTH_NAV_PREV:
64 | _moment.subtract(1, 'month');
65 | _paneType = 'month';
66 | UserSelectedStore.emitChange();
67 | break;
68 |
69 | case ActionNames.MONTH_NAV_NEXT:
70 | _moment.add(1, 'month');
71 | _paneType = 'month';
72 | UserSelectedStore.emitChange();
73 | break;
74 | }
75 |
76 | return true;
77 |
78 | });
79 |
80 | module.exports = UserSelectedStore;
--------------------------------------------------------------------------------
/src/components/FormEditEvent.js:
--------------------------------------------------------------------------------
1 | var React = require('react');
2 | var EventActions = require('../actions/EventActions');
3 | let InputBinder = require('./mixins/InputBinder');
4 |
5 | /**
6 | *
7 | * Update title, date, and notes
8 | */
9 | var FormEditEvent = React.createClass({
10 | mixins: [InputBinder],
11 |
12 | propTypes: {
13 | event: React.PropTypes.object.isRequired
14 | },
15 |
16 | componentWillMount() {
17 | this.setStateFromEvent(this.props.event);
18 | },
19 |
20 | componentWillReceiveProps(nextProps) {
21 | this.setStateFromEvent(nextProps.event);
22 | },
23 |
24 | setStateFromEvent(event) {
25 | this.setState({
26 | title: event.title,
27 | dateArgs: event.moment.format("YYYY-MM-DD"),
28 | notes: event.notes || ""
29 | })
30 | },
31 |
32 | render() {
33 | return (
34 |
35 |
43 |
49 |
55 |
60 |
61 | );
62 | },
63 |
64 | updateEvent() {
65 | var updateEventData = {
66 | title: this.state.title.trim(),
67 | dateArgs: this.state.dateArgs,
68 | notes: this.state.notes.trim()
69 | };
70 |
71 | if (updateEventData.title.length === 0)
72 | return;
73 |
74 | EventActions.update(this.props.event.id, updateEventData);
75 | }
76 | });
77 |
78 | module.exports = FormEditEvent;
--------------------------------------------------------------------------------
/src/components/GridDay.js:
--------------------------------------------------------------------------------
1 | var React = require('react');
2 | var _ = require('lodash');
3 | var moment = require('moment');
4 |
5 | var UserSelectedActions = require('../actions/UserSelectedActions');
6 |
7 | var styles = {
8 | gridBlock: {
9 | height: 150,
10 | width: 100/7 + "%",
11 | float: 'left',
12 | border: '1px solid gray',
13 | position: 'relative',
14 | overflow: 'scroll',
15 | cursor: 'pointer'
16 | },
17 | date: {
18 | position: 'absolute',
19 | top: 0,
20 | left: 0,
21 | padding: 10
22 | },
23 | label: {
24 | display: 'inline-block',
25 | maxWidth: "100%",
26 | whiteSpace: "nowrap",
27 | overflow: "hidden",
28 | textOverflow: "ellipsis",
29 | cursor: 'pointer'
30 | }
31 | };
32 |
33 | var GridDay = React.createClass({
34 |
35 | propTypes: {
36 | isActive: React.PropTypes.bool
37 | },
38 |
39 | render() {
40 | var dayMoment = this.props.selectedMoment;
41 |
42 | return (
43 |
44 |
{dayMoment.format('Do')}
45 |
46 | {this.props.events.map((event) =>
47 | -
52 | {event.title}
53 |
)}
54 |
55 |
56 | )
57 | },
58 |
59 | onClickDay(dayMoment) {
60 | UserSelectedActions.selectDay(dayMoment);
61 | },
62 |
63 | onClickEvent(eventData, e) {
64 | e.stopPropagation();
65 | UserSelectedActions.selectEvent(eventData.id);
66 | },
67 |
68 | _getStyles() {
69 | var _styles = _.assign({}, styles.gridBlock);
70 | if (this.props.selectedMoment.day() === 0)
71 | _styles.clear = 'left';
72 | if (this.props.isActive)
73 | _styles.backgroundColor = 'lightgray';
74 | return _styles;
75 | }
76 |
77 | });
78 |
79 | var GridDayDummy = React.createClass({
80 | render () {
81 | return (
82 |
83 |
84 | )
85 | }
86 | });
87 |
88 | module.exports = GridDay;
89 | module.exports.GridDayDummy = GridDayDummy;
--------------------------------------------------------------------------------
/src/stores/EventStore.js:
--------------------------------------------------------------------------------
1 | var _ = require('lodash');
2 | var moment = require('moment');
3 | var AppDispatcher = require('../AppDispatcher');
4 | var ActionNames = require('../actions/EventActions').actionNames;
5 | var ChangeEmitter = require('./ChangeEmitter');
6 |
7 | var _events = {};
8 |
9 | /**
10 | * @extends ChangeEmitter
11 | */
12 | var EventStore = _.assign({}, ChangeEmitter, {
13 |
14 | get(id) {
15 | return _events[id];
16 | },
17 |
18 | getAll() {
19 | return _events;
20 | },
21 |
22 | /**
23 | * @param dayMoment
24 | * @return {[]}
25 | */
26 | getForDay(dayMoment) {
27 | return _.filter(_events, (event) => moment(dayMoment).isSame(event.moment, 'day'))
28 | },
29 |
30 | /**
31 | * @param monthMoment
32 | * @return {[]}
33 | */
34 | getForMonth(monthMoment) {
35 | return _.filter(_events, (event) => moment(monthMoment).isSame(event.moment, 'month'))
36 | }
37 |
38 | });
39 |
40 | // TEMP - Dummy _makeId function
41 | var _curId = 0;
42 | var _makeId = function () {
43 | return ++_curId;
44 | };
45 |
46 | /**
47 | * @param eventData {*}
48 | */
49 | var _createEvent = function (eventData) {
50 | var eventId = _makeId();
51 |
52 | if (!moment.isMoment(eventData.moment))
53 | throw new Exception("WTF give a moment date object man...");
54 |
55 | _events[eventId] = _.assign(eventData, {
56 | id: eventId
57 | });
58 | return eventId;
59 | };
60 |
61 |
62 | var _updateEvent = function (eventId, eventData) {
63 | var targetEvent = _events[eventId];
64 | var updateData = {};
65 | var {dateArgs, title, notes} = eventData;
66 | if (dateArgs) updateData.moment = moment(dateArgs);
67 | if (title) updateData.title = title;
68 | if (notes) updateData.notes = notes;
69 |
70 | _events[eventId] = _.assign({}, targetEvent, updateData);
71 | return true;
72 | };
73 |
74 | /**
75 | * @param eventId {number}
76 | */
77 | var _destroyEvent = function (eventId) {
78 | delete _events[eventId];
79 | };
80 |
81 | EventStore.dispatchToken = AppDispatcher.register(function (action) {
82 |
83 | switch (action.actionType) {
84 | case ActionNames.EVENT_CREATE:
85 | _createEvent(action.eventData);
86 | EventStore.emitChange();
87 | break;
88 |
89 | case ActionNames.EVENT_UPDATE:
90 | _updateEvent(action.eventId, action.eventData);
91 | EventStore.emitChange();
92 | break;
93 |
94 | case ActionNames.EVENT_DESTROY:
95 | _destroyEvent(action.eventId);
96 | EventStore.emitChange();
97 | break;
98 | }
99 |
100 | return true;
101 |
102 | });
103 |
104 | module.exports = EventStore;
105 |
106 | // TEMP - Dummy Data
107 | var DATA_SOURCE = [
108 | {dateArgs: [2015, 3, 3], title: 'HEYYYYY April 3rd'},
109 | {dateArgs: [2015, 3, 3], title: 'And another... April 3rd'},
110 | {dateArgs: [2015, 3, 10], title: 'My Birthday!'},
111 | {dateArgs: [2015, 4, 5 ], title: 'Sinco De Mayo!'},
112 | {dateArgs: [2015, 4, 14], title: 'Just another day...'},
113 | {dateArgs: [2015, 4, 14], title: 'The 14th!'}
114 | ];
115 | DATA_SOURCE.forEach(function (dummyEvent) {
116 | var eventId = _makeId();
117 | _events[eventId] = {
118 | id: eventId,
119 | title: dummyEvent.title,
120 | moment: moment(dummyEvent.dateArgs)
121 | };
122 | });
123 | // TEMP END - Dummy Data
--------------------------------------------------------------------------------
/src/components/DetailsPane.js:
--------------------------------------------------------------------------------
1 | var React = require('react');
2 | var moment = require('moment');
3 | var EventStore = require('../stores/EventStore');
4 | var EventActions = require('../actions/EventActions');
5 | var UserSelectedStore = require('../stores/UserSelectedStore');
6 | var UserSelectedActions = require('../actions/UserSelectedActions');
7 | var ArrowButton = require('./ArrowButton');
8 | var FormAddDayEvent = require('./FormAddDayEvent');
9 | var FormEditEvent = require('./FormEditEvent');
10 |
11 | /**
12 | *
13 | * @private
14 | */
15 | var PaneNavUpButton = React.createClass({
16 | render() {
17 | return (
18 |
19 |
20 |
21 | );
22 | },
23 |
24 | onNavBack () {
25 | UserSelectedActions.paneNavUp();
26 | }
27 | });
28 |
29 | /**
30 | *
31 | * @private
32 | */
33 | var EventListItem = React.createClass({
34 | propTypes: {
35 | event: React.PropTypes.object.isRequired
36 | },
37 |
38 | render() {
39 | var event = this.props.event;
40 | return (
41 |
42 |
47 | -
48 |
52 | {event.title}
53 |
54 |
55 | );
56 | },
57 |
58 | onClickViewEvent() {
59 | UserSelectedActions.selectEvent(this.props.event.id);
60 | },
61 |
62 | onClickRemoveEvent() {
63 | EventActions.destroy(this.props.event.id)
64 | }
65 |
66 | });
67 |
68 | /**
69 | *
70 | */
71 | var DetailsPane = React.createClass({
72 |
73 | render() {
74 | var paneContents = this.getPaneContents();
75 | return (
76 |
77 | {paneContents}
78 |
79 | )
80 | },
81 |
82 | getInitialState() {
83 | return {
84 | selectedType: UserSelectedStore.getPaneType()
85 | }
86 | },
87 |
88 | componentDidMount() {
89 | UserSelectedStore.addChangeListener(() => {
90 | return this.setState({
91 | selectedType: UserSelectedStore.getPaneType()
92 | });
93 | });
94 | },
95 |
96 | getPaneContents() {
97 | var selectedMoment = UserSelectedStore.getMoment();
98 | var fallbackListing = Whoops! No events found!
;
99 |
100 | switch (this.state.selectedType) {
101 |
102 | case 'month':
103 | var groupedByDay = {};
104 | EventStore.getForMonth(selectedMoment).forEach((event) => {
105 | if (!groupedByDay[event.moment.date()]) groupedByDay[event.moment.date()] = [];
106 | groupedByDay[event.moment.date()].push(event);
107 | });
108 | return (
109 |
110 |
{selectedMoment.format('MMMM')}
111 | {(Object.keys(groupedByDay).length === 0)
112 | ? fallbackListing
113 | : Object.keys(groupedByDay)
114 | .map((dayNum) => {
115 | var dayDate = moment(selectedMoment).date(dayNum);
116 | return (
117 |
118 |
{dayDate.format('ddd Do')}
119 |
120 | {groupedByDay[dayDate.date()].map((event) => )}
121 |
122 |
123 | )
124 | })}
125 |
126 | );
127 |
128 | case 'day':
129 | var dayEvents = EventStore.getForDay(selectedMoment);
130 | return (
131 |
132 |
{selectedMoment.format('MMMM ddd Do')}
133 |
134 |
135 | {(dayEvents.length === 0)
136 | ? fallbackListing
137 | :
138 | {dayEvents.map((event) => ) }
139 |
}
140 |
141 | );
142 |
143 | case 'event':
144 | var event = UserSelectedStore.getEvent();
145 | return (
146 |
147 |
{event.title}
148 |
149 |
150 | );
151 | }
152 | }
153 |
154 | });
155 |
156 | module.exports = DetailsPane;
--------------------------------------------------------------------------------