mirror of
https://github.com/home-assistant/frontend.git
synced 2025-07-19 07:16:39 +00:00
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:
parent
2905cefd39
commit
58a0f6aab9
@ -9,6 +9,11 @@
|
||||
"settings": {
|
||||
"react": {
|
||||
"pragma": "h"
|
||||
},
|
||||
"import/resolver": {
|
||||
"webpack": {
|
||||
"config": "webpack.config.js"
|
||||
}
|
||||
}
|
||||
},
|
||||
"globals": {
|
||||
|
@ -66,14 +66,17 @@
|
||||
"chart.js": "~2.7.2",
|
||||
"chartjs-chart-timeline": "^0.2.1",
|
||||
"es6-object-assign": "^1.1.0",
|
||||
"eslint-import-resolver-webpack": "^0.10.0",
|
||||
"fecha": "^2.3.3",
|
||||
"home-assistant-js-websocket": "2.0.1",
|
||||
"intl-messageformat": "^2.2.0",
|
||||
"leaflet": "^1.0.2",
|
||||
"marked": "^0.3.19",
|
||||
"mdn-polyfills": "^5.5.0",
|
||||
"moment": "^2.20.0",
|
||||
"moment": "^2.22.1",
|
||||
"preact": "^8.2.6",
|
||||
"preact-compat": "^3.18.0",
|
||||
"react-big-calendar": "^0.19.1",
|
||||
"unfetch": "^3.0.0",
|
||||
"web-animations-js": "^2.3.1",
|
||||
"xss": "^0.3.8"
|
||||
|
@ -31,7 +31,8 @@
|
||||
"**/ha-paper-slider.js",
|
||||
"**/ha-iconset-svg.js",
|
||||
"**/ha-script-editor.js",
|
||||
"**/ha-automation-editor.js"
|
||||
"**/ha-automation-editor.js",
|
||||
"**/ha-big-calendar.js"
|
||||
]
|
||||
},
|
||||
"builds": [
|
||||
|
@ -77,6 +77,10 @@ function ensureLoaded(panel) {
|
||||
imported = import(/* webpackChunkName: "panel-shopping-list" */ '../panels/shopping-list/ha-panel-shopping-list.js');
|
||||
break;
|
||||
|
||||
case 'calendar':
|
||||
imported = import(/* webpackChunkName: "panel-calendar" */ '../panels/calendar/ha-panel-calendar.js');
|
||||
break;
|
||||
|
||||
default:
|
||||
imported = null;
|
||||
}
|
||||
|
83
src/panels/calendar/ha-big-calendar.js
Normal file
83
src/panels/calendar/ha-big-calendar.js
Normal 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);
|
229
src/panels/calendar/ha-panel-calendar.js
Normal file
229
src/panels/calendar/ha-panel-calendar.js
Normal 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);
|
@ -70,6 +70,7 @@ function createConfig(isProdBuild, latestBuild) {
|
||||
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.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/images', to: `images/leaflet/` });
|
||||
entry['hass-icons'] = './src/entrypoints/hass-icons.js';
|
||||
@ -175,6 +176,16 @@ function createConfig(isProdBuild, latestBuild) {
|
||||
chunkFilename: chunkFilename,
|
||||
path: path.resolve(__dirname, buildPath),
|
||||
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
159
yarn.lock
@ -2188,6 +2188,10 @@ array-find-index@^1.0.1:
|
||||
version "1.0.2"
|
||||
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:
|
||||
version "1.1.1"
|
||||
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"
|
||||
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:
|
||||
version "3.4.28"
|
||||
resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-3.4.28.tgz#bf1945e82fc808f55695e6ddeaec01400efd03ff"
|
||||
@ -4462,6 +4470,10 @@ dashdash@^1.12.0:
|
||||
dependencies:
|
||||
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:
|
||||
version "1.29.0"
|
||||
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:
|
||||
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:
|
||||
version "0.1.0"
|
||||
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"
|
||||
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:
|
||||
version "1.1.1"
|
||||
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"
|
||||
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:
|
||||
version "2.1.1"
|
||||
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"
|
||||
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:
|
||||
version "1.1.2"
|
||||
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"
|
||||
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:
|
||||
version "2.1.0"
|
||||
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"
|
||||
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"
|
||||
resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
|
||||
dependencies:
|
||||
@ -8336,6 +8385,10 @@ mem@^1.1.0:
|
||||
dependencies:
|
||||
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:
|
||||
version "0.4.1"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df"
|
||||
dependencies:
|
||||
@ -9816,6 +9869,26 @@ posix-character-classes@^0.1.0:
|
||||
version "0.1.1"
|
||||
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:
|
||||
version "8.2.7"
|
||||
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"
|
||||
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:
|
||||
version "1.0.3"
|
||||
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"
|
||||
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:
|
||||
version "15.6.0"
|
||||
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"
|
||||
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:
|
||||
version "3.1.0"
|
||||
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"
|
||||
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:
|
||||
version "0.1.2"
|
||||
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"
|
||||
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:
|
||||
version "1.0.0"
|
||||
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"
|
||||
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:
|
||||
version "3.3.4"
|
||||
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"
|
||||
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:
|
||||
version "1.6.0"
|
||||
resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00"
|
||||
|
Loading…
x
Reference in New Issue
Block a user