Add scheduler panel (#1146)

* Add scheduler panel

* Rename scheduler to calendar

* Continue

* First working version

* Fix lint errors

* Fix comments

* Fix calendar display

* Continue fixing comments

* Continue fixing comments 2

* Continue fixing comments 3

* Fix UI to work with the new PRs

* Use preact-compat instead of react

* Fix tests

* Move css file in a panels specific folder

* Fix tests

* Add Event details dialog

* Improve date format

* Remove event details

* Continue

* Continue calendar

* continue

* Continue

* Cleaning

* Fix PR comments

* Lint

* Clean useless import and css

* Fix PR comments

* Fix PR comments

* Fix PR comments

* Clean Event handler

* Fix week view

* Continue
This commit is contained in:
Thibault Cohen 2018-06-15 11:17:46 -04:00 committed by Paulus Schoutsen
parent 2905cefd39
commit 58a0f6aab9
8 changed files with 494 additions and 5 deletions

View File

@ -9,6 +9,11 @@
"settings": { "settings": {
"react": { "react": {
"pragma": "h" "pragma": "h"
},
"import/resolver": {
"webpack": {
"config": "webpack.config.js"
}
} }
}, },
"globals": { "globals": {

View File

@ -66,14 +66,17 @@
"chart.js": "~2.7.2", "chart.js": "~2.7.2",
"chartjs-chart-timeline": "^0.2.1", "chartjs-chart-timeline": "^0.2.1",
"es6-object-assign": "^1.1.0", "es6-object-assign": "^1.1.0",
"eslint-import-resolver-webpack": "^0.10.0",
"fecha": "^2.3.3", "fecha": "^2.3.3",
"home-assistant-js-websocket": "2.0.1", "home-assistant-js-websocket": "2.0.1",
"intl-messageformat": "^2.2.0", "intl-messageformat": "^2.2.0",
"leaflet": "^1.0.2", "leaflet": "^1.0.2",
"marked": "^0.3.19", "marked": "^0.3.19",
"mdn-polyfills": "^5.5.0", "mdn-polyfills": "^5.5.0",
"moment": "^2.20.0", "moment": "^2.22.1",
"preact": "^8.2.6", "preact": "^8.2.6",
"preact-compat": "^3.18.0",
"react-big-calendar": "^0.19.1",
"unfetch": "^3.0.0", "unfetch": "^3.0.0",
"web-animations-js": "^2.3.1", "web-animations-js": "^2.3.1",
"xss": "^0.3.8" "xss": "^0.3.8"

View File

@ -31,7 +31,8 @@
"**/ha-paper-slider.js", "**/ha-paper-slider.js",
"**/ha-iconset-svg.js", "**/ha-iconset-svg.js",
"**/ha-script-editor.js", "**/ha-script-editor.js",
"**/ha-automation-editor.js" "**/ha-automation-editor.js",
"**/ha-big-calendar.js"
] ]
}, },
"builds": [ "builds": [

View File

@ -77,6 +77,10 @@ function ensureLoaded(panel) {
imported = import(/* webpackChunkName: "panel-shopping-list" */ '../panels/shopping-list/ha-panel-shopping-list.js'); imported = import(/* webpackChunkName: "panel-shopping-list" */ '../panels/shopping-list/ha-panel-shopping-list.js');
break; break;
case 'calendar':
imported = import(/* webpackChunkName: "panel-calendar" */ '../panels/calendar/ha-panel-calendar.js');
break;
default: default:
imported = null; imported = null;
} }

View File

@ -0,0 +1,83 @@
import { html } from '@polymer/polymer/lib/utils/html-tag.js';
import { PolymerElement } from '@polymer/polymer/polymer-element.js';
/* eslint-disable */
import { render } from 'react-dom';
import React from 'react';
/* eslint-enable */
import BigCalendar from 'react-big-calendar';
import moment from 'moment';
import EventsMixin from '../../mixins/events-mixin.js';
import '../../resources/ha-style.js';
BigCalendar.setLocalizer(BigCalendar.momentLocalizer(moment));
const DEFAULT_VIEW = 'month';
class HaBigCalendar extends EventsMixin(PolymerElement) {
static get template() {
return html`
<link rel="stylesheet" href="/static/panels/calendar/react-big-calendar.css">
<style>
div#root {
height: 100%;
width: 100%;
}
</style>
<div id="root"></div>`;
}
update(events) {
const allViews = BigCalendar.Views.values;
const BCElement = React.createElement(
BigCalendar,
{ events: events,
views: allViews,
popup: true,
onNavigate: (date, viewName) => this.fire('navigate', { date, viewName }),
onView: viewName => this.fire('view', { viewName }),
eventPropGetter: this.setEventStyle,
defaultView: this.defaultView,
defaultDate: new Date(),
}
);
render(BCElement, this.$.root);
}
setEventStyle(event) {
// https://stackoverflow.com/questions/34587067/change-color-of-react-big-calendar-events
const newStyle = {};
if (event.color) {
newStyle.backgroundColor = event.color;
}
return { style: newStyle };
}
static get properties() {
return {
dateUpdated: Object,
viewUpdated: Object,
defaultView: {
type: String,
value: DEFAULT_VIEW
},
defaultDate: {
type: Object,
value: new Date()
},
events: {
type: Array,
observer: 'update',
},
};
}
}
customElements.define('ha-big-calendar', HaBigCalendar);

View File

@ -0,0 +1,229 @@
import '@polymer/app-layout/app-header-layout/app-header-layout.js';
import '@polymer/app-layout/app-header/app-header.js';
import '@polymer/app-layout/app-toolbar/app-toolbar.js';
import '@polymer/paper-listbox/paper-listbox.js';
import '@polymer/paper-card/paper-card.js';
import '@polymer/paper-checkbox/paper-checkbox.js';
import '@polymer/paper-item/paper-item.js';
import { html } from '@polymer/polymer/lib/utils/html-tag.js';
import { PolymerElement } from '@polymer/polymer/polymer-element.js';
import moment from 'moment';
import dates from 'react-big-calendar/lib/utils/dates';
import '../../components/ha-menu-button.js';
import '../../resources/ha-style.js';
import './ha-big-calendar.js';
import LocalizeMixin from '../../mixins/localize-mixin.js';
const DEFAULT_VIEW = 'month';
/*
* @appliesMixin LocalizeMixin
*/
class HaPanelCalendar extends LocalizeMixin(PolymerElement) {
static get template() {
return html`
<style include="iron-flex ha-style">
.content {
padding: 16px;
@apply --layout-horizontal;
}
ha-big-calendar {
min-height: 500px;
min-width: 100%;
}
#calendars {
padding-right: 16px;
width: 15%;
}
div.all_calendars {
height: 20px;
text-align: center;
}
.iron-selected {
background-color: #e5e5e5;
font-weight: normal;
}
</style>
<app-header-layout has-scrolling-region>
<app-header slot="header" fixed>
<app-toolbar>
<ha-menu-button narrow='[[narrow]]' show-menu='[[showMenu]]'></ha-menu-button>
<div main-title>[[localize('panel.calendar')]]</div>
</app-toolbar>
</app-header>
<div class="flex content">
<div id="calendars" class="layout vertical wrap">
<paper-card heading="Calendars">
<div class="all_calendars">
<paper-checkbox id="all_calendars" on-change="checkAll" checked>All calendars</paper-checkbox>
</div>
<paper-listbox id="calendar_list" multi on-selected-items-changed="_fetchData" selected-values="{{selectedCalendars}}" attr-for-selected="item-name">
<template is="dom-repeat" items="[[calendars]]">
<paper-item item-name="[[item.entity_id]]">
<span class="calendar_color" style$="background-color: [[item.color]]"></span>
<span class="calendar_color_spacer"></span>
[[item.name]]
</paper-item>
</template>
</paper-listbox>
</paper-card>
</div>
<div class="flex layout horizontal wrap">
<ha-big-calendar
default-date="[[currentDate]]"
default-view="[[currentView]]"
on-navigate='handleNavigate'
on-view='handleView'
events="[[events]]">
</ha-big-calendar>
</div>
</div>
</app-header-layout>`;
}
connectedCallback() {
super.connectedCallback();
this._fetchData = this._fetchData.bind(this);
// TODO implement calendar_updated event
// this.hass.connection.subscribeEvents(this._fetchData, 'calendar_updated')
// .then(function (unsub) { this._unsubEvents = unsub; }.bind(this));
this._fetchCalendar();
}
_fetchCalendar() {
// Fetch calendar list
this.hass.callApi('get', 'calendars')
.then((result) => {
this.calendars = result;
});
}
_fetchData() {
// TODO: Improve me
var start = dates.firstVisibleDay(this.currentDate).toISOString();
var end = dates.lastVisibleDay(this.currentDate).toISOString();
// var dates = this._getDateRange();
// var start = dates[0];
// var end = dates[1];
// Fetch calendar list
this._fetchCalendar();
// Fetch events for selected calendar
const params = encodeURI(`?start=${start}&end=${end}`);
const calls = this.selectedCalendars.map(cal => this.hass.callApi('get', `calendar/${cal}${params}`));
Promise.all(calls).then((results) => {
var tmpEvents = [];
results.forEach((res) => {
res.forEach((ev) => {
ev.start = new Date(ev.start);
if (ev.end) {
ev.end = new Date(ev.end);
} else {
ev.end = null;
}
tmpEvents.push(ev);
});
});
this.events = tmpEvents;
});
}
_getDateRange() {
// TODO: Delete me
var startDate;
var endDate;
if (this.currentView === 'day') {
startDate = moment(this.currentDate).startOf('day');
endDate = moment(this.currentDate).startOf('day');
} else if (this.currentView === 'week') {
startDate = moment(this.currentDate).startOf('isoWeek');
endDate = moment(this.currentDate).endOf('isoWeek');
} else if (this.currentView === 'month') {
startDate = moment(this.currentDate).startOf('month').subtract(7, 'days');
endDate = moment(this.currentDate).endOf('month').add(7, 'days');
} else if (this.currentView === 'agenda') {
startDate = moment(this.currentDate).startOf('day');
endDate = moment(this.currentDate).endOf('day').add(1, 'month');
}
return [startDate.toISOString(), endDate.toISOString()];
}
handleView(ev) {
// Calendar view changed
this.currentView = ev.detail.viewName;
this._fetchData();
}
handleNavigate(ev) {
// Calendar date range changed
this.currentDate = ev.detail.date;
this.currentView = ev.detail.viewName;
this._fetchData();
}
checkAll(ev) {
// Check all calendars
if (ev.target.checked) {
const selectedIndex = this.selectedCalendars
.map(x => this.calendars.map(y => y.entity_id).indexOf(x));
for (let i = 0; i < this.calendars.length; i++) {
if (selectedIndex.indexOf(i) === -1) {
this.$.calendar_list.selectIndex(i);
}
}
}
}
static get properties() {
return {
hass: Object,
currentView: {
type: String,
value: DEFAULT_VIEW
},
currentDate: {
type: Object,
value: new Date()
},
events: {
type: Array,
value: [],
},
calendars: {
type: Array,
value: [],
},
selectedCalendars: {
type: Array,
value: [],
},
narrow: {
type: Boolean,
value: false,
},
showMenu: {
type: Boolean,
value: false,
},
};
}
}
customElements.define('ha-panel-calendar', HaPanelCalendar);

View File

@ -70,6 +70,7 @@ function createConfig(isProdBuild, latestBuild) {
copyPluginOpts.push({ from: 'node_modules/@polymer/font-roboto-local/fonts', to: 'fonts' }); copyPluginOpts.push({ from: 'node_modules/@polymer/font-roboto-local/fonts', to: 'fonts' });
copyPluginOpts.push('node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js') copyPluginOpts.push('node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js')
copyPluginOpts.push('node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js.map') copyPluginOpts.push('node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js.map')
copyPluginOpts.push({ from: 'node_modules/react-big-calendar/lib/css/react-big-calendar.css', to: `panels/calendar/` });
copyPluginOpts.push({ from: 'node_modules/leaflet/dist/leaflet.css', to: `images/leaflet/` }); copyPluginOpts.push({ from: 'node_modules/leaflet/dist/leaflet.css', to: `images/leaflet/` });
copyPluginOpts.push({ from: 'node_modules/leaflet/dist/images', to: `images/leaflet/` }); copyPluginOpts.push({ from: 'node_modules/leaflet/dist/images', to: `images/leaflet/` });
entry['hass-icons'] = './src/entrypoints/hass-icons.js'; entry['hass-icons'] = './src/entrypoints/hass-icons.js';
@ -175,6 +176,16 @@ function createConfig(isProdBuild, latestBuild) {
chunkFilename: chunkFilename, chunkFilename: chunkFilename,
path: path.resolve(__dirname, buildPath), path: path.resolve(__dirname, buildPath),
publicPath, publicPath,
},
resolve: {
alias: {
'react': 'preact-compat',
'react-dom': 'preact-compat',
// Not necessary unless you consume a module using `createClass`
'create-react-class': 'preact-compat/lib/create-react-class',
// Not necessary unless you consume a module requiring `react-dom-factories`
'react-dom-factories': 'preact-compat/lib/react-dom-factories'
}
} }
} }
} }

159
yarn.lock
View File

@ -2188,6 +2188,10 @@ array-find-index@^1.0.1:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
array-find@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/array-find/-/array-find-1.0.0.tgz#6c8e286d11ed768327f8e62ecee87353ca3e78b8"
array-flatten@1.1.1: array-flatten@1.1.1:
version "1.1.1" version "1.1.1"
resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
@ -3871,6 +3875,10 @@ class-utils@^0.3.5:
isobject "^3.0.0" isobject "^3.0.0"
static-extend "^0.1.1" static-extend "^0.1.1"
classnames@^2.1.3, classnames@^2.2.5:
version "2.2.5"
resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.5.tgz#fb3801d453467649ef3603c7d61a02bd129bde6d"
clean-css@3.4.x: clean-css@3.4.x:
version "3.4.28" version "3.4.28"
resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-3.4.28.tgz#bf1945e82fc808f55695e6ddeaec01400efd03ff" resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-3.4.28.tgz#bf1945e82fc808f55695e6ddeaec01400efd03ff"
@ -4462,6 +4470,10 @@ dashdash@^1.12.0:
dependencies: dependencies:
assert-plus "^1.0.0" assert-plus "^1.0.0"
date-arithmetic@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/date-arithmetic/-/date-arithmetic-3.1.0.tgz#1fcd03dbd504b9dbee2b9078c85a5f1c7d3cc2d3"
date-fns@^1.27.2: date-fns@^1.27.2:
version "1.29.0" version "1.29.0"
resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.29.0.tgz#12e609cdcb935127311d04d33334e2960a2a54e6" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.29.0.tgz#12e609cdcb935127311d04d33334e2960a2a54e6"
@ -4734,6 +4746,10 @@ doctrine@^2.0.0, doctrine@^2.0.2, doctrine@^2.1.0:
dependencies: dependencies:
esutils "^2.0.2" esutils "^2.0.2"
"dom-helpers@^2.3.0 || ^3.0.0", dom-helpers@^3.2.1:
version "3.3.1"
resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.3.1.tgz#fc1a4e15ffdf60ddde03a480a9c0fece821dd4a6"
dom-serializer@0: dom-serializer@0:
version "0.1.0" version "0.1.0"
resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82"
@ -4960,6 +4976,14 @@ enhanced-resolve@^4.0.0:
memory-fs "^0.4.0" memory-fs "^0.4.0"
tapable "^1.0.0" tapable "^1.0.0"
enhanced-resolve@~0.9.0:
version "0.9.1"
resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz#4d6e689b3725f86090927ccc86cd9f1635b89e2e"
dependencies:
graceful-fs "^4.1.2"
memory-fs "^0.2.0"
tapable "^0.1.8"
entities@^1.1.1, entities@~1.1.1: entities@^1.1.1, entities@~1.1.1:
version "1.1.1" version "1.1.1"
resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0"
@ -5060,6 +5084,21 @@ eslint-import-resolver-node@^0.3.1:
debug "^2.6.8" debug "^2.6.8"
resolve "^1.2.0" resolve "^1.2.0"
eslint-import-resolver-webpack@^0.10.0:
version "0.10.0"
resolved "https://registry.yarnpkg.com/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.10.0.tgz#b6f2468dc3e8b4ea076e5d75bece8da932789b07"
dependencies:
array-find "^1.0.0"
debug "^2.6.8"
enhanced-resolve "~0.9.0"
find-root "^1.1.0"
has "^1.0.1"
interpret "^1.0.0"
lodash "^4.17.4"
node-libs-browser "^1.0.0 || ^2.0.0"
resolve "^1.4.0"
semver "^5.3.0"
eslint-module-utils@^2.1.1: eslint-module-utils@^2.1.1:
version "2.1.1" version "2.1.1"
resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz#abaec824177613b8a95b299639e1b6facf473449" resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz#abaec824177613b8a95b299639e1b6facf473449"
@ -5629,6 +5668,10 @@ find-replace@^2.0.1:
array-back "^2.0.0" array-back "^2.0.0"
test-value "^3.0.0" test-value "^3.0.0"
find-root@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4"
find-up@^1.0.0: find-up@^1.0.0:
version "1.1.2" version "1.1.2"
resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
@ -6895,6 +6938,12 @@ ignore@^3.3.3, ignore@^3.3.5:
version "3.3.8" version "3.3.8"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.8.tgz#3f8e9c35d38708a3a7e0e9abb6c73e7ee7707b2b" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.8.tgz#3f8e9c35d38708a3a7e0e9abb6c73e7ee7707b2b"
immutability-helper@^2.1.2:
version "2.7.0"
resolved "https://registry.yarnpkg.com/immutability-helper/-/immutability-helper-2.7.0.tgz#4ea9916cc8f45142ec3e3f0fce75fa5d66fa1b38"
dependencies:
invariant "^2.2.0"
import-lazy@^2.1.0: import-lazy@^2.1.0:
version "2.1.0" version "2.1.0"
resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43"
@ -7024,7 +7073,7 @@ into-stream@^3.1.0:
from2 "^2.1.1" from2 "^2.1.1"
p-is-promise "^1.1.0" p-is-promise "^1.1.0"
invariant@^2.2.0, invariant@^2.2.2: invariant@^2.1.0, invariant@^2.2.0, invariant@^2.2.2:
version "2.2.4" version "2.2.4"
resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
dependencies: dependencies:
@ -8336,6 +8385,10 @@ mem@^1.1.0:
dependencies: dependencies:
mimic-fn "^1.0.0" mimic-fn "^1.0.0"
memory-fs@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.2.0.tgz#f2bb25368bc121e391c2520de92969caee0a0290"
memory-fs@^0.4.0, memory-fs@~0.4.1: memory-fs@^0.4.0, memory-fs@~0.4.1:
version "0.4.1" version "0.4.1"
resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
@ -8596,7 +8649,7 @@ mocha@^5.0.0:
mkdirp "0.5.1" mkdirp "0.5.1"
supports-color "4.4.0" supports-color "4.4.0"
moment@^2.10.2, moment@^2.20.0, moment@^2.22.0: moment@^2.10.2, moment@^2.22.0, moment@^2.22.1:
version "2.22.1" version "2.22.1"
resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.1.tgz#529a2e9bf973f259c9643d237fda84de3a26e8ad" resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.1.tgz#529a2e9bf973f259c9643d237fda84de3a26e8ad"
@ -8772,7 +8825,7 @@ node-fetch@^1.0.1:
encoding "^0.1.11" encoding "^0.1.11"
is-stream "^1.0.1" is-stream "^1.0.1"
node-libs-browser@^2.0.0: "node-libs-browser@^1.0.0 || ^2.0.0", node-libs-browser@^2.0.0:
version "2.1.0" version "2.1.0"
resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df" resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df"
dependencies: dependencies:
@ -9816,6 +9869,26 @@ posix-character-classes@^0.1.0:
version "0.1.1" version "0.1.1"
resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
preact-compat@^3.18.0:
version "3.18.0"
resolved "https://registry.yarnpkg.com/preact-compat/-/preact-compat-3.18.0.tgz#ca430cc1f67193fb9feaf7c510832957b2ebe701"
dependencies:
immutability-helper "^2.1.2"
preact-render-to-string "^3.6.0"
preact-transition-group "^1.1.0"
prop-types "^15.5.8"
standalone-react-addons-pure-render-mixin "^0.1.1"
preact-render-to-string@^3.6.0:
version "3.7.0"
resolved "https://registry.yarnpkg.com/preact-render-to-string/-/preact-render-to-string-3.7.0.tgz#7db4177454bc01395e0d01d6ac07bc5e838e31ee"
dependencies:
pretty-format "^3.5.1"
preact-transition-group@^1.1.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/preact-transition-group/-/preact-transition-group-1.1.1.tgz#f0a49327ea515ece34ea2be864c4a7d29e5d6e10"
preact@^8.2.6: preact@^8.2.6:
version "8.2.7" version "8.2.7"
resolved "https://registry.yarnpkg.com/preact/-/preact-8.2.7.tgz#316249fb678cd5e93e7cee63cea7bfb62dbd6814" resolved "https://registry.yarnpkg.com/preact/-/preact-8.2.7.tgz#316249fb678cd5e93e7cee63cea7bfb62dbd6814"
@ -9844,6 +9917,10 @@ pretty-bytes@^4.0.2:
version "4.0.2" version "4.0.2"
resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-4.0.2.tgz#b2bf82e7350d65c6c33aa95aaa5a4f6327f61cd9" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-4.0.2.tgz#b2bf82e7350d65c6c33aa95aaa5a4f6327f61cd9"
pretty-format@^3.5.1:
version "3.8.0"
resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-3.8.0.tgz#bfbed56d5e9a776645f4b1ff7aa1a3ac4fa3c385"
pretty-hrtime@^1.0.0: pretty-hrtime@^1.0.0:
version "1.0.3" version "1.0.3"
resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1"
@ -9901,6 +9978,21 @@ promisify-node@^0.4.0:
nodegit-promise "~4.0.0" nodegit-promise "~4.0.0"
object-assign "^4.0.1" object-assign "^4.0.1"
prop-types-extra@^1.0.1:
version "1.1.0"
resolved "https://registry.yarnpkg.com/prop-types-extra/-/prop-types-extra-1.1.0.tgz#32609910ea2dcf190366bacd3490d5a6412a605f"
dependencies:
react-is "^16.3.2"
warning "^3.0.0"
prop-types@^15.5.10, prop-types@^15.5.8:
version "15.6.1"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.1.tgz#36644453564255ddda391191fb3a125cbdf654ca"
dependencies:
fbjs "^0.8.16"
loose-envify "^1.3.1"
object-assign "^4.1.1"
prop-types@^15.6.0: prop-types@^15.6.0:
version "15.6.0" version "15.6.0"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.0.tgz#ceaf083022fc46b4a35f69e13ef75aed0d639856" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.0.tgz#ceaf083022fc46b4a35f69e13ef75aed0d639856"
@ -10058,6 +10150,41 @@ rc@^1.0.1, rc@^1.1.6, rc@^1.1.7:
minimist "^1.2.0" minimist "^1.2.0"
strip-json-comments "~2.0.1" strip-json-comments "~2.0.1"
react-big-calendar@^0.19.1:
version "0.19.1"
resolved "https://registry.yarnpkg.com/react-big-calendar/-/react-big-calendar-0.19.1.tgz#ace5a24009bef21c09378f162c2234f9b34a7975"
dependencies:
classnames "^2.1.3"
date-arithmetic "^3.0.0"
dom-helpers "^2.3.0 || ^3.0.0"
invariant "^2.1.0"
lodash "^4.17.4"
prop-types "^15.5.8"
react-overlays "^0.7.0"
react-prop-types "^0.4.0"
uncontrollable "^4.0.0"
warning "^2.0.0"
react-is@^16.3.2:
version "16.3.2"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.3.2.tgz#f4d3d0e2f5fbb6ac46450641eb2e25bf05d36b22"
react-overlays@^0.7.0:
version "0.7.4"
resolved "https://registry.yarnpkg.com/react-overlays/-/react-overlays-0.7.4.tgz#ef2ec652c3444ab8aa014262b18f662068e56d5c"
dependencies:
classnames "^2.2.5"
dom-helpers "^3.2.1"
prop-types "^15.5.10"
prop-types-extra "^1.0.1"
warning "^3.0.0"
react-prop-types@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/react-prop-types/-/react-prop-types-0.4.0.tgz#f99b0bfb4006929c9af2051e7c1414a5c75b93d0"
dependencies:
warning "^3.0.0"
read-all-stream@^3.0.0: read-all-stream@^3.0.0:
version "3.1.0" version "3.1.0"
resolved "https://registry.yarnpkg.com/read-all-stream/-/read-all-stream-3.1.0.tgz#35c3e177f2078ef789ee4bfafa4373074eaef4fa" resolved "https://registry.yarnpkg.com/read-all-stream/-/read-all-stream-3.1.0.tgz#35c3e177f2078ef789ee4bfafa4373074eaef4fa"
@ -11259,6 +11386,10 @@ stacky@^1.3.1:
chalk "^1.1.1" chalk "^1.1.1"
lodash "^3.0.0" lodash "^3.0.0"
standalone-react-addons-pure-render-mixin@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/standalone-react-addons-pure-render-mixin/-/standalone-react-addons-pure-render-mixin-0.1.1.tgz#3c7409f4c79c40de9ac72c616cf679a994f37551"
static-extend@^0.1.1: static-extend@^0.1.1:
version "0.1.2" version "0.1.2"
resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
@ -11537,6 +11668,10 @@ table@4.0.2:
slice-ansi "1.0.0" slice-ansi "1.0.0"
string-width "^2.1.1" string-width "^2.1.1"
tapable@^0.1.8:
version "0.1.10"
resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.1.10.tgz#29c35707c2b70e50d07482b5d202e8ed446dafd4"
tapable@^1.0.0: tapable@^1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.0.0.tgz#cbb639d9002eed9c6b5975eb20598d7936f1f9f2" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.0.0.tgz#cbb639d9002eed9c6b5975eb20598d7936f1f9f2"
@ -11935,6 +12070,12 @@ unc-path-regex@^0.1.0:
version "0.1.2" version "0.1.2"
resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa"
uncontrollable@^4.0.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-4.1.0.tgz#e0358291252e1865222d90939b19f2f49f81c1a9"
dependencies:
invariant "^2.1.0"
underscore.string@3.3.4: underscore.string@3.3.4:
version "3.3.4" version "3.3.4"
resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.4.tgz#2c2a3f9f83e64762fdc45e6ceac65142864213db" resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.4.tgz#2c2a3f9f83e64762fdc45e6ceac65142864213db"
@ -12328,6 +12469,18 @@ walkdir@^0.0.11:
version "0.0.11" version "0.0.11"
resolved "https://registry.yarnpkg.com/walkdir/-/walkdir-0.0.11.tgz#a16d025eb931bd03b52f308caed0f40fcebe9532" resolved "https://registry.yarnpkg.com/walkdir/-/walkdir-0.0.11.tgz#a16d025eb931bd03b52f308caed0f40fcebe9532"
warning@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/warning/-/warning-2.1.0.tgz#21220d9c63afc77a8c92111e011af705ce0c6901"
dependencies:
loose-envify "^1.0.0"
warning@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c"
dependencies:
loose-envify "^1.0.0"
watchpack@^1.5.0: watchpack@^1.5.0:
version "1.6.0" version "1.6.0"
resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00"