.label.label-id-0.selected{background-color:undefined}
- .label.label-id-0.selected:not(.no-hover):hover{background-color:white;border-color:undefined;color:undefined}
- .label.label-id-0:not(.selected){background-color:white;border-color:undefined;color:undefined}
+ .label.label-id-0.selected:not(.no-hover):hover,
+ .label.label-id-0:not(.selected)
+ {background-color:white;border-color:undefined;color:undefined}
.label.label-id-0:not(.no-hover):hover{background-color:black;color:white}
.label.label-id-4.selected{background-color:undefined}
- .label.label-id-4.selected:not(.no-hover):hover{background-color:white;border-color:undefined;color:undefined}
- .label.label-id-4:not(.selected){background-color:white;border-color:undefined;color:undefined}
+ .label.label-id-4.selected:not(.no-hover):hover,
+ .label.label-id-4:not(.selected)
+ {background-color:white;border-color:undefined;color:undefined}
.label.label-id-4:not(.no-hover):hover{background-color:black;color:white}
.label.label-id-3.selected{background-color:undefined}
- .label.label-id-3.selected:not(.no-hover):hover{background-color:white;border-color:undefined;color:undefined}
- .label.label-id-3:not(.selected){background-color:white;border-color:undefined;color:undefined}
+ .label.label-id-3.selected:not(.no-hover):hover,
+ .label.label-id-3:not(.selected)
+ {background-color:white;border-color:undefined;color:undefined}
.label.label-id-3:not(.no-hover):hover{background-color:black;color:white}
.label.label-id-2.selected{background-color:undefined}
- .label.label-id-2.selected:not(.no-hover):hover{background-color:white;border-color:undefined;color:undefined}
- .label.label-id-2:not(.selected){background-color:white;border-color:undefined;color:undefined}
+ .label.label-id-2.selected:not(.no-hover):hover,
+ .label.label-id-2:not(.selected)
+ {background-color:white;border-color:undefined;color:undefined}
.label.label-id-2:not(.no-hover):hover{background-color:black;color:white}
.label.label-id-1.selected{background-color:undefined}
- .label.label-id-1.selected:not(.no-hover):hover{background-color:white;border-color:undefined;color:undefined}
- .label.label-id-1:not(.selected){background-color:white;border-color:undefined;color:undefined}
+ .label.label-id-1.selected:not(.no-hover):hover,
+ .label.label-id-1:not(.selected)
+ {background-color:white;border-color:undefined;color:undefined}
.label.label-id-1:not(.no-hover):hover{background-color:black;color:white}
diff --git a/src/pages/add-edit/recurrence-selector.jsx b/src/pages/add-edit/recurrence-selector.jsx
index 6a890d6..160f6ed 100644
--- a/src/pages/add-edit/recurrence-selector.jsx
+++ b/src/pages/add-edit/recurrence-selector.jsx
@@ -202,7 +202,11 @@ class EndOptions extends React.Component {
render() {
const untilDate =
this.state.option === 'date' ? (
-
@@ -313,7 +317,7 @@ export default class RecurrenceSelector extends React.Component {
}
endOptionsChanged(value) {
- const state = this.state;
+ const { state } = this;
if (value.option === 'date') {
state.recurrence.until = value.endDate;
delete state.recurrence.count;
@@ -333,7 +337,10 @@ export default class RecurrenceSelector extends React.Component {
render() {
const monthOptions =
this.props.recurs.frequency === 'MONTHLY' ? (
-
+
) : null;
const weekOptions =
this.props.recurs.frequency === 'WEEKLY' ? (
diff --git a/src/pages/calendar/calendar-header.jsx b/src/pages/calendar/calendar-header.jsx
index 405e966..f2053f5 100644
--- a/src/pages/calendar/calendar-header.jsx
+++ b/src/pages/calendar/calendar-header.jsx
@@ -3,37 +3,32 @@
import React from 'react';
import MenuIconButton from '../../components/menu-icon-button';
-export default class CalendarHeader extends React.Component {
- render() {
- const viewOptions = Object.values(this.props.possibleViewModes).map((mode) => {
- const className = `calendar-header-view-option${
- mode === this.props.currentViewMode ? ' current' : ''}`;
- return (
-
this.props.setViewMode(mode)}
- >
- {mode.displayName}
-
- );
- });
-
+const CalendarHeader = (props) => {
+ const viewOptions = Object.values(props.possibleViewModes).map((mode) => {
+ const className = `calendar-header-view-option${
+ mode === props.currentViewMode ? ' current' : ''
+ }`;
return (
-
-
-
{this.props.title}
-
-
- {viewOptions}
-
-
-
-
-
-
-
+
props.setViewMode(mode)}>
+ {mode.displayName}
);
- }
-}
+ });
+
+ return (
+
+
+
{props.title}
+
+
{viewOptions}
+
+
+
+
+
+
+
+ );
+};
+
+export default CalendarHeader;
diff --git a/src/pages/calendar/calendar-page.jsx b/src/pages/calendar/calendar-page.jsx
index 9c57acf..57c4782 100644
--- a/src/pages/calendar/calendar-page.jsx
+++ b/src/pages/calendar/calendar-page.jsx
@@ -47,7 +47,7 @@ export default class CalendarPage extends React.Component {
componentDidUpdate() {
if (this.props.labels.visibleLabels) {
const labelsStr = this.props.labels.visibleLabels
- .sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase())) // sort alphabetically ignoring case
+ .sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()))
.join(',');
const url = `/calendar/${labelsStr}`;
if (url !== this.props.location.pathname) {
@@ -58,7 +58,9 @@ export default class CalendarPage extends React.Component {
}
render() {
- const currDate = this.props.currentlyViewingDate ? this.props.currentlyViewingDate.format('MMMM D, YYYY') : '';
+ const currDate = this.props.currentlyViewingDate
+ ? this.props.currentlyViewingDate.format('MMMM D, YYYY')
+ : '';
return (
diff --git a/src/pages/details/event-details-page.jsx b/src/pages/details/event-details-page.jsx
index bebcdda..8ed0f6a 100644
--- a/src/pages/details/event-details-page.jsx
+++ b/src/pages/details/event-details-page.jsx
@@ -44,7 +44,9 @@ export default class EventDetailsPage extends React.Component {
{event.end.format(endDateFormat)}
);
- const recurrence = event.recurrence &&
;
+ const recurrence = event.recurrence && (
+
+ );
return (
diff --git a/src/pages/import/import.jsx b/src/pages/import/import.jsx
index 9dd4cff..cd36baa 100644
--- a/src/pages/import/import.jsx
+++ b/src/pages/import/import.jsx
@@ -30,13 +30,13 @@ export default class ImportPage extends React.Component {
};
urlChanged = (e) => {
- let importData = this.state.importData;
- importData = Object.assign(importData, { url: e.currentTarget.value });
+ const importData = Object.assign(this.state.importData, { url: e.currentTarget.value });
this.setState({ importData });
};
submitICS = () => {
- axios.post(`${window.abe_url}/ics/`, this.state.importData)
+ axios
+ .post(`${window.abe_url}/ics/`, this.state.importData)
.then(
response => this.props.importSuccess(response, this.state.importData),
(jqXHR, textStatus, errorThrown) => this.props.importFailed(errorThrown, jqXHR.message),
@@ -48,7 +48,10 @@ export default class ImportPage extends React.Component {
-
+
Import
- {/* TODO: Update label.public to whatever the property ends up being named */}
- {/* TODO: Update label.protected to whatever the property ends up being named */}
l.default).map(l => l.name);
+ visibleLabels = Object.values(this.props.possibleLabels)
+ .filter(l => l.default)
+ .map(l => l.name);
break;
default:
// Do nothing
diff --git a/src/sidebar/sidebar-item-wrapper.jsx b/src/sidebar/sidebar-item-wrapper.jsx
deleted file mode 100644
index 25b044d..0000000
--- a/src/sidebar/sidebar-item-wrapper.jsx
+++ /dev/null
@@ -1,18 +0,0 @@
-// This component "wraps" sidebar panes in a standard header (for consistent UI)
-
-import React from 'react';
-
-export default class SidebarItemWrapper extends React.Component {
- render() {
- return (
-
-
- {this.props.header}
-
-
- {this.props.children}
-
-
- );
- }
-}
diff --git a/src/sidebar/sidebar-item.jsx b/src/sidebar/sidebar-item.jsx
new file mode 100644
index 0000000..43b488f
--- /dev/null
+++ b/src/sidebar/sidebar-item.jsx
@@ -0,0 +1,18 @@
+// This component "wraps" sidebar panes in a standard header (for consistent UI)
+
+import PropTypes from 'prop-types';
+import React from 'react';
+
+const SidebarItemWrapper = props => (
+
+
{props.header}
+
{props.children}
+
+);
+
+SidebarItemWrapper.propTypes = {
+ header: PropTypes.node.isRequired,
+ children: PropTypes.node.isRequired,
+};
+
+export default SidebarItemWrapper;
diff --git a/src/sidebar/sidebar.jsx b/src/sidebar/sidebar.jsx
index 3302afa..1b47086 100644
--- a/src/sidebar/sidebar.jsx
+++ b/src/sidebar/sidebar.jsx
@@ -3,40 +3,39 @@
import React from 'react';
import LabelPane from '../components/label-pane';
-import { SidebarHeader } from '../components/sidebar-header';
+import SidebarHeader from '../components/sidebar-header';
+import { canSignOut, clearAccessToken } from '../data/auth';
import EventActionsPane from './event-actions-pane';
import FilterPane from './filter-pane';
import Footer from './footer';
import GenerateICSPane from './generate-ics-pane';
import LinkPane from './link-pane';
import MarkdownGuide from './markdown-guide';
-import SidebarItemContainer from './sidebar-item-wrapper';
-import { canSignOut, clearAccessToken } from '../data/auth';
+import SidebarItem from './sidebar-item';
const Sidebar = (props) => {
const {
- account: { permissions },
+ account: { scope },
sidebarMode: mode,
} = props;
+ const oauthBaseUrl = `${window.abe_url}/oauth/authorize`;
+ const oauthUrl = `${oauthBaseUrl}?redirect_uri=${encodeURIComponent(window.location.href)}`;
const content = (
- {!permissions.has('view_all_events') && (
-
-
You are viewing the public calendar.
-
-
- Sign in
- {' '}
- to view and add Olin Community events.
-
-
+ {!scope.has('community_events:read') && (
+
+
+
You are viewing the public calendar.
+
+ Sign in to view and add Olin Community events.
+
+
+
)}
{mode.LINK_PANE &&
- permissions.has('add_events') && (
+ scope.has('events:create') && (
{
)}
{mode.EVENT_ACTIONS &&
- permissions.has('edit_events') && (
+ scope.has('events:edit') && (
)}
{mode.EVENT_LABELS_PANE && (
-
+
-
+
)}
{mode.FILTER_PANE && (
// For viewing the calendar
-
+
-
+
)}
{mode.GENERATE_ICS_PANE && (
-
+
-
+
)}
{mode.MARKDOWN_GUIDE && (
-
+
-
+
)}
);