studiokit-scaffolding-js 7.0.16 → 7.0.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,12 @@
1
+ import React from 'react';
2
+ import { OverlayTriggerProps } from 'react-bootstrap';
3
+ interface AccessibleOverlayTriggerProps extends Omit<OverlayTriggerProps, 'overlay'> {
4
+ overlay: React.ReactNode;
5
+ screenReaderNodeLocation?: 'before' | 'after';
6
+ popoverStyle?: React.CSSProperties;
7
+ }
8
+ /**
9
+ * Wrapper for react-bootstrap's OverlayTrigger with custom popover logic to improve screen reader support.
10
+ */
11
+ export declare const AccessibleOverlayTrigger: ({ children, overlay, popoverStyle, screenReaderNodeLocation, ...restProps }: AccessibleOverlayTriggerProps) => React.JSX.Element;
12
+ export {};
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __rest = (this && this.__rest) || function (s, e) {
14
+ var t = {};
15
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
16
+ t[p] = s[p];
17
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
18
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
19
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
20
+ t[p[i]] = s[p[i]];
21
+ }
22
+ return t;
23
+ };
24
+ var __importDefault = (this && this.__importDefault) || function (mod) {
25
+ return (mod && mod.__esModule) ? mod : { "default": mod };
26
+ };
27
+ Object.defineProperty(exports, "__esModule", { value: true });
28
+ exports.AccessibleOverlayTrigger = void 0;
29
+ var react_1 = __importDefault(require("react"));
30
+ var react_bootstrap_1 = require("react-bootstrap");
31
+ var useGuid_1 = require("../hooks/useGuid");
32
+ /**
33
+ * Wrapper for react-bootstrap's OverlayTrigger with custom popover logic to improve screen reader support.
34
+ */
35
+ var AccessibleOverlayTrigger = function (_a) {
36
+ var children = _a.children, overlay = _a.overlay, popoverStyle = _a.popoverStyle, _b = _a.screenReaderNodeLocation, screenReaderNodeLocation = _b === void 0 ? 'after' : _b, restProps = __rest(_a, ["children", "overlay", "popoverStyle", "screenReaderNodeLocation"]);
37
+ var guid = useGuid_1.useGuid();
38
+ var popover = (react_1.default.createElement(react_bootstrap_1.Popover, { id: "popover-" + guid, "aria-hidden": true, style: popoverStyle }, overlay));
39
+ var screenReaderNode = react_1.default.createElement("span", { className: "sr-only" }, overlay);
40
+ return (react_1.default.createElement(react_1.default.Fragment, null,
41
+ screenReaderNodeLocation === 'before' && screenReaderNode,
42
+ react_1.default.createElement(react_bootstrap_1.OverlayTrigger, __assign({}, restProps, { overlay: popover }), children),
43
+ screenReaderNodeLocation === 'after' && screenReaderNode));
44
+ };
45
+ exports.AccessibleOverlayTrigger = AccessibleOverlayTrigger;
@@ -29,13 +29,6 @@ var __importStar = (this && this.__importStar) || function (mod) {
29
29
  __setModuleDefault(result, mod);
30
30
  return result;
31
31
  };
32
- var __spreadArrays = (this && this.__spreadArrays) || function () {
33
- for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
34
- for (var r = Array(s), k = 0, i = 0; i < il; i++)
35
- for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
36
- r[k] = a[j];
37
- return r;
38
- };
39
32
  var __importDefault = (this && this.__importDefault) || function (mod) {
40
33
  return (mod && mod.__esModule) ? mod : { "default": mod };
41
34
  };
@@ -81,13 +74,10 @@ var ActionList = function (_a) {
81
74
  return (react_1.default.createElement(core_1.Grow, __assign({}, TransitionProps, { style: { transformOrigin: placement === 'bottom-end' ? 'top right' : 'bottom right' } }),
82
75
  react_1.default.createElement(core_1.Paper, null,
83
76
  react_1.default.createElement(core_1.ClickAwayListener, { onClickAway: onActionItemClick() },
84
- react_1.default.createElement(core_1.MenuList, { id: "info-menu-" + model.id, autoFocusItem: !!infoMenuAnchorElement, onKeyDown: handleListKeyDown, className: "action-list shadow-large" }, allowedActions.map(function (a, index) {
85
- return a.predicate
86
- ? __spreadArrays((index > 0 ? [react_1.default.createElement(core_1.Divider, null)] : []), [
87
- react_1.default.createElement(core_1.MenuItem, { key: a.id, className: "action-list-menu mv1 pv2 " + a.className, onClick: onActionItemClick(a.action), color: "primary", disabled: a.disabled },
88
- a.icon,
89
- a.name)
90
- ]) : undefined;
77
+ react_1.default.createElement(core_1.MenuList, { id: "info-menu-" + model.id, autoFocusItem: !!infoMenuAnchorElement, onKeyDown: handleListKeyDown, className: "action-list shadow-large" }, allowedActions.map(function (a) {
78
+ return a.predicate ? (react_1.default.createElement(core_1.MenuItem, { key: a.id, className: "action-list-menu-item " + a.className, onClick: onActionItemClick(a.action), color: "primary", disabled: a.disabled },
79
+ a.icon,
80
+ a.name)) : undefined;
91
81
  }))))));
92
82
  })))));
93
83
  };
@@ -27,14 +27,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
27
27
  Object.defineProperty(exports, "__esModule", { value: true });
28
28
  var react_1 = __importDefault(require("react"));
29
29
  var react_bootstrap_1 = require("react-bootstrap");
30
- var ConnectedModalComponent_1 = __importDefault(require("./HOC/ConnectedModalComponent"));
30
+ var ConnectedModalComponent_1 = require("./HOC/ConnectedModalComponent");
31
31
  var ConnectedModal = function (_a) {
32
32
  var
33
33
  // exclude props that shouldn't be passed to the Modal
34
- guid = _a.guid, modals = _a.modals, isTopOpenFullscreenModal = _a.isTopOpenFullscreenModal, dispatch = _a.dispatch, modalProps = __rest(_a, ["guid", "modals", "isTopOpenFullscreenModal", "dispatch"]);
34
+ guid = _a.guid, modals = _a.modals, dispatch = _a.dispatch, modalProps = __rest(_a, ["guid", "modals", "dispatch"]);
35
35
  return react_1.default.createElement(react_bootstrap_1.Modal, __assign({}, modalProps));
36
36
  };
37
37
  /**
38
38
  * Wrapped version of "react-bootstrap"'s `Modal` component. Uses `ConnectedModalComponent` to coordinate modal state in redux.
39
39
  */
40
- exports.default = ConnectedModalComponent_1.default(ConnectedModal);
40
+ exports.default = ConnectedModalComponent_1.connectedModalComponent(ConnectedModal);
@@ -42,6 +42,17 @@ var __importStar = (this && this.__importStar) || function (mod) {
42
42
  __setModuleDefault(result, mod);
43
43
  return result;
44
44
  };
45
+ var __rest = (this && this.__rest) || function (s, e) {
46
+ var t = {};
47
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
48
+ t[p] = s[p];
49
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
50
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
51
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
52
+ t[p[i]] = s[p[i]];
53
+ }
54
+ return t;
55
+ };
45
56
  var __importDefault = (this && this.__importDefault) || function (mod) {
46
57
  return (mod && mod.__esModule) ? mod : { "default": mod };
47
58
  };
@@ -72,28 +83,14 @@ var DateField = /** @class */ (function (_super) {
72
83
  return _this;
73
84
  }
74
85
  DateField.prototype.render = function () {
75
- var _a = this.props, value = _a.value, disabled = _a.disabled, minDate = _a.minDate, maxDate = _a.maxDate;
76
- var formatWarning = !!value && value.length > 0 && !dateRegex.test(value)
77
- ? date_1.isDateInputSupported
78
- ? "Must match the format \"MM/DD/YYYY\""
79
- : "Must match the format \"" + dateFormat + "\""
80
- : !!value && value.length > 0 && !this.isDateValid(value)
81
- ? 'Must be a valid date'
82
- : undefined;
83
- // prevent custom props from being passed to TextField
84
- var newProps = __assign({}, this.props);
85
- var className = newProps.className;
86
- delete newProps.minDate;
87
- delete newProps.maxDate;
88
- delete newProps.className;
86
+ var _a = this.props, className = _a.className, minDate = _a.minDate, maxDate = _a.maxDate, disabled = _a.disabled, textFieldProps = __rest(_a, ["className", "minDate", "maxDate", "disabled"]);
89
87
  return (react_1.default.createElement("div", { className: className },
90
- react_1.default.createElement(TextField_1.default, __assign({}, newProps, { type: "date", className: "material-text-field-date", inputProps: {
88
+ react_1.default.createElement(TextField_1.default, __assign({}, textFieldProps, { type: "date", className: "material-text-field-date", inputProps: {
91
89
  pattern: datePattern,
92
90
  placeholder: dateFormat,
93
91
  min: !!minDate && !disabled ? date_1.getFormattedNumberedDateForInput(minDate) : null,
94
92
  max: !!maxDate && !disabled ? date_1.getFormattedNumberedDateForInput(maxDate) : null
95
- }, onChange: this.onChange })),
96
- formatWarning && react_1.default.createElement("label", { className: "color-red i f6 db" }, formatWarning)));
93
+ }, onChange: this.onChange }))));
97
94
  };
98
95
  return DateField;
99
96
  }(react_1.Component));
@@ -42,17 +42,25 @@ var __importStar = (this && this.__importStar) || function (mod) {
42
42
  __setModuleDefault(result, mod);
43
43
  return result;
44
44
  };
45
+ var __rest = (this && this.__rest) || function (s, e) {
46
+ var t = {};
47
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
48
+ t[p] = s[p];
49
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
50
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
51
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
52
+ t[p[i]] = s[p[i]];
53
+ }
54
+ return t;
55
+ };
45
56
  var __importDefault = (this && this.__importDefault) || function (mod) {
46
57
  return (mod && mod.__esModule) ? mod : { "default": mod };
47
58
  };
48
59
  Object.defineProperty(exports, "__esModule", { value: true });
49
60
  exports.TimeField = void 0;
50
61
  var TextField_1 = __importDefault(require("@material-ui/core/TextField"));
51
- var Help_1 = __importDefault(require("@material-ui/icons/Help"));
52
62
  var moment_1 = __importDefault(require("moment"));
53
63
  var react_1 = __importStar(require("react"));
54
- var react_bootstrap_1 = require("react-bootstrap");
55
- var date_1 = require("../../utils/date");
56
64
  var timePattern = '^(2[0-3]|[0-1][0-9]):([0-5][0-9])$';
57
65
  var timeFormat = 'HH:mm';
58
66
  var timeRegex = new RegExp(timePattern);
@@ -75,38 +83,12 @@ var TimeField = /** @class */ (function (_super) {
75
83
  return _this;
76
84
  }
77
85
  TimeField.prototype.render = function () {
78
- var value = this.props.value;
79
- var formatWarning = !!value && value.length > 0 && !timeRegex.test(value)
80
- ? date_1.isTimeInputSupported
81
- ? "Must match the format \"hh:mm a\""
82
- : "Must match the format \"" + timeFormat + "\" using 24 hour time"
83
- : !!value && value.length > 0 && !this.isTimeValid(value)
84
- ? 'Must be a valid time'
85
- : undefined;
86
- // prevent some props from being passed to TextField
87
- var newProps = __assign({}, this.props);
88
- var className = newProps.className;
89
- delete newProps.className;
90
- if (!!newProps.label && !date_1.isTimeInputSupported) {
91
- var popover = (react_1.default.createElement(react_bootstrap_1.Popover, { id: "activatedAssignments" },
92
- react_1.default.createElement("h3", null, "Missing Browser Features"),
93
- react_1.default.createElement("p", null,
94
- "Your current browser does not have a default time picker. You must use the 24 hour time format, \"",
95
- timeFormat,
96
- "\".")));
97
- newProps.label = (react_1.default.createElement(react_bootstrap_1.OverlayTrigger, { placement: "top", trigger: ['click', 'hover', 'focus'], overlay: popover },
98
- react_1.default.createElement("span", null,
99
- newProps.label,
100
- " ",
101
- react_1.default.createElement("small", null, "(24 hour time)"),
102
- react_1.default.createElement(Help_1.default, { color: "primary", className: "ml1 v-top f7", fontSize: "small", tabIndex: 0 }))));
103
- }
86
+ var _a = this.props, className = _a.className, textFieldProps = __rest(_a, ["className"]);
104
87
  return (react_1.default.createElement("div", { className: className },
105
- react_1.default.createElement(TextField_1.default, __assign({}, newProps, { type: "time", className: "material-text-field-time", inputProps: {
88
+ react_1.default.createElement(TextField_1.default, __assign({}, textFieldProps, { type: "time", className: "material-text-field-time", inputProps: {
106
89
  pattern: timePattern,
107
90
  placeholder: timeFormat
108
- }, onChange: this.onChange })),
109
- formatWarning && react_1.default.createElement("label", { className: "color-red i f6 db" }, formatWarning)));
91
+ }, onChange: this.onChange }))));
110
92
  };
111
93
  return TimeField;
112
94
  }(react_1.Component));
@@ -8,7 +8,6 @@ export declare type ConnectedModalReduxProps = {
8
8
  export interface ConnectedModalWrappedProps {
9
9
  onEntering: () => void;
10
10
  onExited: () => void;
11
- isTopOpenFullscreenModal?: boolean;
12
11
  }
13
12
  export interface ConnectedModalState {
14
13
  isModalOpen: boolean;
@@ -118,12 +118,8 @@ function configureConnectedModalComponent(WrappedComponent, isFullscreen) {
118
118
  this.onExited();
119
119
  };
120
120
  ConnectedModalComponent.prototype.render = function () {
121
- var _a, _b;
122
- var _c = this.props, modals = _c.modals, guid = _c.guid, ownProps = __rest(_c, ["modals", "guid"]);
123
- var topOpenFullscreenModal = lodash_1.maxBy(Object.values(modals).filter(function (m) { return m.isFullscreen; }), function (modal) { return modal.index; });
124
- var thisModalIndex = (_b = (_a = modals[guid]) === null || _a === void 0 ? void 0 : _a.index) !== null && _b !== void 0 ? _b : null;
125
- var isTopOpenFullscreenModal = (topOpenFullscreenModal === null || topOpenFullscreenModal === void 0 ? void 0 : topOpenFullscreenModal.index) === thisModalIndex;
126
- return (react_1.default.createElement(WrappedComponent, __assign({}, ownProps, { guid: guid, onEntering: this.onEntering, onExited: this.onExited, isTopOpenFullscreenModal: isTopOpenFullscreenModal })));
121
+ var _a = this.props, modals = _a.modals, guid = _a.guid, ownProps = __rest(_a, ["modals", "guid"]);
122
+ return (react_1.default.createElement(WrappedComponent, __assign({}, ownProps, { guid: guid, onEntering: this.onEntering, onExited: this.onExited })));
127
123
  };
128
124
  return ConnectedModalComponent;
129
125
  }(react_1.Component));
@@ -3,7 +3,6 @@ import { ConnectedModalWrappedProps } from './ConnectedModalComponent';
3
3
  import { GuidComponentWrappedProps } from './GuidComponent';
4
4
  /**
5
5
  * The props that are provided to the HOC component directly from the caller, not other wrapping HOCs
6
- * NOTE: if more flexibility is needed, add more props from `ReactModal.Props`
7
6
  */
8
7
  export interface FullscreenModalOwnProps {
9
8
  isOpen?: boolean;
@@ -12,12 +11,10 @@ export interface FullscreenModalOwnProps {
12
11
  * If not provided, the modal manages itself.
13
12
  */
14
13
  closeModal?: () => void;
15
- contentLabel?: string;
16
- zIndex?: number;
17
14
  }
18
15
  /** The props that are provided to the HOC component, either directly or from other wrapping HOCs */
19
16
  export declare type FullscreenModalComponentProps = FullscreenModalOwnProps & ConnectedModalWrappedProps & GuidComponentWrappedProps;
20
- /** The props that are provide to the wrapped component. */
17
+ /** The props that are provided to the wrapped component. */
21
18
  export interface FullscreenModalWrappedProps {
22
19
  /** GUID of the fullscreen modal, used in state.modals. */
23
20
  guid: string;
@@ -28,8 +25,7 @@ interface FullscreenModalState {
28
25
  isOpen: boolean;
29
26
  }
30
27
  /**
31
- * HOC that manages a `ReactModal`, adds inline css, and
32
- * coordinates modal state in redux using.
28
+ * HOC that manages a "react-boostrap" `Modal` and adds fullscreen styles.
33
29
  *
34
30
  * NOTE: Meant for testing. Should be wrapped in `connectedModalComponent` normally.
35
31
  *
@@ -38,9 +34,7 @@ interface FullscreenModalState {
38
34
  export declare function configureFullscreenModalComponent<TOwnProps extends {}>(WrappedComponent: ComponentType<TOwnProps & FullscreenModalWrappedProps>): {
39
35
  new (props: TOwnProps & FullscreenModalOwnProps & ConnectedModalWrappedProps & GuidComponentWrappedProps): {
40
36
  componentDidMount(): void;
41
- componentWillUnmount(): void;
42
37
  componentDidUpdate(prevProps: TOwnProps & FullscreenModalOwnProps & ConnectedModalWrappedProps & GuidComponentWrappedProps, prevState: FullscreenModalState): void;
43
- disableScroll: (e: Event) => boolean;
44
38
  onOpen: () => void;
45
39
  onClose: () => void;
46
40
  closeModal: () => void;
@@ -56,6 +50,7 @@ export declare function configureFullscreenModalComponent<TOwnProps extends {}>(
56
50
  [key: string]: React.ReactInstance;
57
51
  };
58
52
  shouldComponentUpdate?(nextProps: Readonly<TOwnProps & FullscreenModalOwnProps & ConnectedModalWrappedProps & GuidComponentWrappedProps>, nextState: Readonly<FullscreenModalState>, nextContext: any): boolean;
53
+ componentWillUnmount?(): void;
59
54
  componentDidCatch?(error: Error, errorInfo: React.ErrorInfo): void;
60
55
  getSnapshotBeforeUpdate?(prevProps: Readonly<TOwnProps & FullscreenModalOwnProps & ConnectedModalWrappedProps & GuidComponentWrappedProps>, prevState: Readonly<FullscreenModalState>): any;
61
56
  componentWillMount?(): void;
@@ -68,16 +63,9 @@ export declare function configureFullscreenModalComponent<TOwnProps extends {}>(
68
63
  contextType?: React.Context<any> | undefined;
69
64
  };
70
65
  /**
71
- * HOC that contains a `ReactModal` which can be auto managed or managed with props,
72
- * adds fullscreen styles, and coordinates modal state in redux.
66
+ * HOC that manages a "react-bootstrap" `Modal` and adds fullscreen styles.
73
67
  *
74
- * Uses `connectedModalComponent`.
75
- *
76
- * NOTE: Please add the following css
77
- *
78
- * .ReactModal__Body--open {
79
- * overflow: hidden;
80
- * }
68
+ * Uses `connectedModalComponent` to coordinate modal state in redux.
81
69
  *
82
70
  * @param WrappedComponent The component to wrap.
83
71
  */
@@ -53,17 +53,13 @@ var __rest = (this && this.__rest) || function (s, e) {
53
53
  }
54
54
  return t;
55
55
  };
56
- var __importDefault = (this && this.__importDefault) || function (mod) {
57
- return (mod && mod.__esModule) ? mod : { "default": mod };
58
- };
59
56
  Object.defineProperty(exports, "__esModule", { value: true });
60
57
  exports.fullscreenModalComponent = exports.configureFullscreenModalComponent = void 0;
61
58
  var react_1 = __importStar(require("react"));
62
- var react_modal_1 = __importDefault(require("react-modal"));
59
+ var react_bootstrap_1 = require("react-bootstrap");
63
60
  var ConnectedModalComponent_1 = require("./ConnectedModalComponent");
64
61
  /**
65
- * HOC that manages a `ReactModal`, adds inline css, and
66
- * coordinates modal state in redux using.
62
+ * HOC that manages a "react-boostrap" `Modal` and adds fullscreen styles.
67
63
  *
68
64
  * NOTE: Meant for testing. Should be wrapped in `connectedModalComponent` normally.
69
65
  *
@@ -74,17 +70,10 @@ function configureFullscreenModalComponent(WrappedComponent) {
74
70
  __extends(FullscreenModalComponent, _super);
75
71
  function FullscreenModalComponent(props) {
76
72
  var _this = _super.call(this, props) || this;
77
- _this.disableScroll = function (e) {
78
- document.documentElement.scrollTop = 0;
79
- e.preventDefault();
80
- return false;
81
- };
82
73
  _this.onOpen = function () {
83
- document.documentElement.addEventListener('touchmove', _this.disableScroll);
84
74
  _this.props.onEntering();
85
75
  };
86
76
  _this.onClose = function () {
87
- document.documentElement.removeEventListener('touchmove', _this.disableScroll);
88
77
  _this.props.onExited();
89
78
  };
90
79
  _this.closeModal = function () {
@@ -99,11 +88,6 @@ function configureFullscreenModalComponent(WrappedComponent) {
99
88
  _this.state = {
100
89
  isOpen: props.isOpen === undefined ? true : props.isOpen
101
90
  };
102
- // https://github.com/reactjs/react-modal#app-element
103
- // Accessibility fixed when reading the content in the modal
104
- if (document.getElementById('root')) {
105
- react_modal_1.default.setAppElement('#root');
106
- }
107
91
  return _this;
108
92
  }
109
93
  FullscreenModalComponent.prototype.componentDidMount = function () {
@@ -112,9 +96,6 @@ function configureFullscreenModalComponent(WrappedComponent) {
112
96
  this.onOpen();
113
97
  }
114
98
  };
115
- FullscreenModalComponent.prototype.componentWillUnmount = function () {
116
- document.documentElement.removeEventListener('touchmove', this.disableScroll);
117
- };
118
99
  FullscreenModalComponent.prototype.componentDidUpdate = function (prevProps, prevState) {
119
100
  var isOpen;
120
101
  if (this.props.isOpen !== undefined && this.props.isOpen !== this.state.isOpen) {
@@ -139,33 +120,11 @@ function configureFullscreenModalComponent(WrappedComponent) {
139
120
  });
140
121
  };
141
122
  FullscreenModalComponent.prototype.render = function () {
142
- var _a = this.props, contentLabel = _a.contentLabel, isTopOpenFullscreenModal = _a.isTopOpenFullscreenModal, onEntering = _a.onEntering, onExited = _a.onExited, _ = _a.isOpen, closeModal = _a.closeModal, zIndex = _a.zIndex, remainingProps = __rest(_a, ["contentLabel", "isTopOpenFullscreenModal", "onEntering", "onExited", "isOpen", "closeModal", "zIndex"]);
123
+ var _a = this.props, onEntering = _a.onEntering, onExited = _a.onExited, _ = _a.isOpen, closeModal = _a.closeModal, remainingProps = __rest(_a, ["onEntering", "onExited", "isOpen", "closeModal"]);
143
124
  // do not pass ConnectedModalWrappedProps to wrapped component
144
125
  var wrappedProps = __assign(__assign({}, remainingProps), { closeModal: this.closeModal });
145
126
  var isOpen = this.state.isOpen;
146
- return (react_1.default.createElement(react_modal_1.default, { isOpen: isOpen, contentLabel: contentLabel, style: {
147
- content: {
148
- position: 'absolute',
149
- top: 0,
150
- left: 0,
151
- right: 0,
152
- bottom: 0,
153
- overflow: 'hidden',
154
- padding: 0,
155
- border: 'none',
156
- backgroundColor: 'white'
157
- },
158
- overlay: {
159
- position: 'absolute',
160
- top: 0,
161
- left: 0,
162
- right: 0,
163
- bottom: 0,
164
- zIndex: zIndex !== null && zIndex !== void 0 ? zIndex : 2000
165
- }
166
- },
167
- // apply custom class, if this is not the top open fullscreen modal, to allow targeted styling (e.g. hide when printing in Safari)
168
- portalClassName: "ReactModalPortal" + (!isTopOpenFullscreenModal ? ' HiddenFullscreenModal' : ''), shouldCloseOnOverlayClick: false },
127
+ return (react_1.default.createElement(react_bootstrap_1.Modal, { show: isOpen, backdrop: false, animation: false, className: "fullscreen-modal" },
169
128
  react_1.default.createElement(WrappedComponent, __assign({}, wrappedProps))));
170
129
  };
171
130
  return FullscreenModalComponent;
@@ -173,16 +132,9 @@ function configureFullscreenModalComponent(WrappedComponent) {
173
132
  }
174
133
  exports.configureFullscreenModalComponent = configureFullscreenModalComponent;
175
134
  /**
176
- * HOC that contains a `ReactModal` which can be auto managed or managed with props,
177
- * adds fullscreen styles, and coordinates modal state in redux.
178
- *
179
- * Uses `connectedModalComponent`.
180
- *
181
- * NOTE: Please add the following css
135
+ * HOC that manages a "react-bootstrap" `Modal` and adds fullscreen styles.
182
136
  *
183
- * .ReactModal__Body--open {
184
- * overflow: hidden;
185
- * }
137
+ * Uses `connectedModalComponent` to coordinate modal state in redux.
186
138
  *
187
139
  * @param WrappedComponent The component to wrap.
188
140
  */
@@ -30,6 +30,7 @@ var lodash_1 = require("lodash");
30
30
  var react_1 = __importStar(require("react"));
31
31
  var react_bootstrap_1 = require("react-bootstrap");
32
32
  var react_quill_1 = require("react-quill");
33
+ var AccessibleOverlayTrigger_1 = require("../AccessibleOverlayTrigger");
33
34
  var ConnectedModal_1 = __importDefault(require("../ConnectedModal"));
34
35
  var ErrorMessage_1 = require("../ErrorMessage");
35
36
  var ImageWarning_1 = require("./ImageWarning");
@@ -137,8 +138,7 @@ var ImageWithAltTextModal = function (_a) {
137
138
  react_1.default.createElement("h3", { className: "mv0" },
138
139
  react_1.default.createElement(react_bootstrap_1.FormLabel, { htmlFor: "img-alt-text", className: "mb0" },
139
140
  "Alt Text *",
140
- react_1.default.createElement(react_bootstrap_1.OverlayTrigger, { placement: "top", trigger: ['hover', 'focus'], overlay: react_1.default.createElement(react_bootstrap_1.Popover, { id: "alt-text-explanation" },
141
- react_1.default.createElement("p", { className: "mb0" }, "Used by screen readers to describe the content of an image.")) },
141
+ react_1.default.createElement(AccessibleOverlayTrigger_1.AccessibleOverlayTrigger, { placement: "top", trigger: ['hover', 'focus'], overlay: react_1.default.createElement("p", { className: "mb0" }, "Used by screen readers to describe the content of an image.") },
142
142
  react_1.default.createElement("button", { type: "button", className: "dib help-button bg-transparent" },
143
143
  react_1.default.createElement(Help_1.default, { color: "primary", titleAccess: "Alt text explanation" })))))),
144
144
  react_1.default.createElement(react_bootstrap_1.FormControl, { id: "img-alt-text", "aria-label": "Image Alt Text", as: "textarea", onChange: function (event) {
@@ -126,7 +126,7 @@ var UserRolesAdd = /** @class */ (function (_super) {
126
126
  var _a = this.state, identifiers = _a.identifiers, role = _a.role, showErrorAlert = _a.showErrorAlert, errorMessage = _a.errorMessage;
127
127
  var _b = this.props, entityName = _b.entityName, isAddingUsersToRole = _b.isAddingUsersToRole, roleDescriptions = _b.roleDescriptions, renderAddDescription = _b.renderAddDescription, disabled = _b.disabled, textForRole = _b.textForRole;
128
128
  var roles = lodash_1.default.keys(roleDescriptions);
129
- var rolePopover = (react_1.default.createElement(react_bootstrap_1.Popover, { id: "role" },
129
+ var rolePopoverContent = (react_1.default.createElement(react_1.default.Fragment, null,
130
130
  react_1.default.createElement("h3", null, "Role"),
131
131
  roles.map(function (r) { return (react_1.default.createElement(react_1.Fragment, { key: r }, roleDescriptions[r])); })));
132
132
  var appConfig = configuration_1.getAppConfig();
@@ -141,7 +141,7 @@ var UserRolesAdd = /** @class */ (function (_super) {
141
141
  " (separated by a new line)"),
142
142
  react_1.default.createElement(react_bootstrap_1.FormControl, { type: "text", as: "textarea", name: "account", "aria-label": "The account names to add", onChange: this.updateIdentifiers, value: identifiers, placeholder: domainIdentifier_1.getDomainIdentifierTypeString(), disabled: disabled }))),
143
143
  react_1.default.createElement(react_bootstrap_1.Col, { xs: 12, sm: 4 },
144
- react_1.default.createElement(Select_1.RoleSelect, { options: roles, value: role, onChange: this.updateRole, labelVisible: true, popoverContentComponent: rolePopover, textForRole: textForRole })),
144
+ react_1.default.createElement(Select_1.RoleSelect, { options: roles, value: role, onChange: this.updateRole, labelVisible: true, popoverContentComponent: rolePopoverContent, textForRole: textForRole })),
145
145
  react_1.default.createElement(react_bootstrap_1.Col, { xs: 12, sm: 2, className: "mt3-ns pt2-ns" },
146
146
  isAddingUsersToRole && react_1.default.createElement(Inline_1.RefreshIndicatorInline, { className: "mr3" }),
147
147
  !isAddingUsersToRole && (react_1.default.createElement(Button_1.default, { id: "userRolesAddButton", color: "primary", className: "btn-primary w-100-lt-xs", disabled: !identifiers || disabled, onClick: this.handleSubmit },
@@ -26,9 +26,9 @@ exports.RoleCell = void 0;
26
26
  var core_1 = require("@material-ui/core");
27
27
  var Delete_1 = __importDefault(require("@material-ui/icons/Delete"));
28
28
  var react_1 = __importStar(require("react"));
29
- var react_bootstrap_1 = require("react-bootstrap");
30
29
  var react_redux_1 = require("react-redux");
31
30
  var userRole_1 = require("../../utils/userRole");
31
+ var AccessibleOverlayTrigger_1 = require("../AccessibleOverlayTrigger");
32
32
  var IconExternalUser_1 = require("../Icons/IconExternalUser");
33
33
  var Inline_1 = require("../RefreshIndicator/Inline");
34
34
  var Context_1 = require("./Context");
@@ -45,7 +45,6 @@ var RoleCell = function (_a) {
45
45
  return (react_1.default.createElement("ul", { className: "mb0 list pa0 tr" }, user.roles.sort(userRole_1.sortByRole(roles)).map(function (userRole) {
46
46
  var roleText = userRole_1.getRoleText(textForRole)(userRole);
47
47
  var isUserRoleExternal = userRole_1.isExternal(userRole);
48
- var userId = userRole_1.getUserId(userRole);
49
48
  var canUpdate =
50
49
  // current user has modify access
51
50
  canModify &&
@@ -77,7 +76,7 @@ var RoleCell = function (_a) {
77
76
  !canModify ||
78
77
  // update is disabled
79
78
  isUpdateDisabled;
80
- var isExternalPopover = (react_1.default.createElement(react_bootstrap_1.Popover, { id: "is-external-popover-" + userId + "-" + userRole.role },
79
+ var isExternalPopoverContent = (react_1.default.createElement(react_1.default.Fragment, null,
81
80
  react_1.default.createElement("h3", null, "Added via Roster Sync"),
82
81
  react_1.default.createElement("p", { className: "mb2" }, "This person was added automatically via roster sync and cannot be manually removed.")));
83
82
  var isUserRoleUpdating = isUpdating && (userRoleToUpdate === null || userRoleToUpdate === void 0 ? void 0 : userRoleToUpdate.id) === userRole.id;
@@ -91,7 +90,7 @@ var RoleCell = function (_a) {
91
90
  react_1.default.createElement(Inline_1.RefreshIndicatorInline, { size: 20, className: "ma3" }))) : canDelete ? (react_1.default.createElement(core_1.IconButton, { className: "remove-user-button", "aria-label": "Remove " + roleText, onClick: function () {
92
91
  removeUserRole(userRole);
93
92
  }, disabled: isUpdating || isRemoving },
94
- react_1.default.createElement(Delete_1.default, { color: "error" }))) : isUserRoleExternal ? (react_1.default.createElement(react_bootstrap_1.OverlayTrigger, { placement: "auto", trigger: ['hover', 'focus'], overlay: isExternalPopover },
93
+ react_1.default.createElement(Delete_1.default, { color: "error" }))) : isUserRoleExternal ? (react_1.default.createElement(AccessibleOverlayTrigger_1.AccessibleOverlayTrigger, { placement: "auto", trigger: ['hover', 'focus'], overlay: isExternalPopoverContent },
95
94
  react_1.default.createElement(IconExternalUser_1.IconExternalUser, { tabIndex: 0, style: { margin: '12px', fill: '#949494' }, className: "external-icon", titleAccess: "External Role" }))) : (
96
95
  // dummy spacer to keep items aligned
97
96
  react_1.default.createElement("span", { style: {
@@ -30,6 +30,7 @@ var Help_1 = __importDefault(require("@material-ui/icons/Help"));
30
30
  var react_1 = __importDefault(require("react"));
31
31
  var react_bootstrap_1 = require("react-bootstrap");
32
32
  var baseRole_1 = require("../../utils/baseRole");
33
+ var AccessibleOverlayTrigger_1 = require("../AccessibleOverlayTrigger");
33
34
  var label = function (hasMultipleOptions, labelVisible, hasTooltip, ref) {
34
35
  var content = (react_1.default.createElement(react_1.default.Fragment, null,
35
36
  "Role",
@@ -39,7 +40,7 @@ var label = function (hasMultipleOptions, labelVisible, hasTooltip, ref) {
39
40
  };
40
41
  var overlay = function (hasMultipleOptions, labelVisible, rolePopover) {
41
42
  if (labelVisible === void 0) { labelVisible = false; }
42
- return rolePopover ? (react_1.default.createElement(react_bootstrap_1.OverlayTrigger, { placement: "right", trigger: ['hover', 'focus'], overlay: rolePopover }, function (_a) {
43
+ return rolePopover ? (react_1.default.createElement(AccessibleOverlayTrigger_1.AccessibleOverlayTrigger, { placement: "right", trigger: ['hover', 'focus'], overlay: rolePopover }, function (_a) {
43
44
  var ref = _a.ref, triggerHandler = __rest(_a, ["ref"]);
44
45
  return (react_1.default.createElement("span", __assign({}, triggerHandler), label(hasMultipleOptions, labelVisible, true, ref)));
45
46
  })) : (label(hasMultipleOptions, labelVisible, false));
@@ -107,5 +107,5 @@ export declare class UserRoles extends Component<UserRolesProps, UserRolesState>
107
107
  render(): React.JSX.Element;
108
108
  }
109
109
  export declare const mapStateToProps: (state: BaseReduxState, ownProps: UserRolesOwnProps) => UserRolesReduxProps;
110
- declare const _default: import("react-redux").ConnectedComponent<typeof UserRoles, Pick<React.ClassAttributes<UserRoles> & UserRolesProps, "guid" | "ref" | "modelName" | "pathParams" | "queryParams" | "externalProviders" | "model" | "key" | "readOnly" | "entityName" | "load" | "disableAutoLoad" | "disableAutoLoadOnParamsChange" | "modelArray" | "stopPeriodicLoad" | "create" | "update" | "delete" | "modelStatus" | "previousModelStatus" | "fetchingId" | "textForRole" | "defaultRole" | "roleDescriptions" | "renderAddDescription" | "isUpdateDisabled" | "isDeleteDisabled" | "allowMultipleRoles" | "requiredRole" | "isAddDisabled" | "modifyUserRoleActivityName" | "deleteOwnUserRoleActivityName" | "addRoleExcludeList" | "entity" | "filterUsers" | "onAdd" | "onUpdate" | "onRemove" | "renderTableDescription" | "lowercaseTextForRole" | "singularArticleForRole"> & UserRolesOwnProps>;
110
+ declare const _default: import("react-redux").ConnectedComponent<typeof UserRoles, Pick<React.ClassAttributes<UserRoles> & UserRolesProps, "guid" | "ref" | "modelName" | "pathParams" | "queryParams" | "externalProviders" | "load" | "key" | "readOnly" | "model" | "entityName" | "disableAutoLoad" | "disableAutoLoadOnParamsChange" | "modelArray" | "stopPeriodicLoad" | "create" | "update" | "delete" | "modelStatus" | "previousModelStatus" | "fetchingId" | "textForRole" | "defaultRole" | "roleDescriptions" | "renderAddDescription" | "isUpdateDisabled" | "isDeleteDisabled" | "allowMultipleRoles" | "requiredRole" | "isAddDisabled" | "modifyUserRoleActivityName" | "deleteOwnUserRoleActivityName" | "addRoleExcludeList" | "entity" | "filterUsers" | "onAdd" | "onUpdate" | "onRemove" | "renderTableDescription" | "lowercaseTextForRole" | "singularArticleForRole"> & UserRolesOwnProps>;
111
111
  export default _default;
@@ -13,7 +13,7 @@
13
13
 
14
14
  @media print {
15
15
  /* override global react fullscreen modal styles */
16
- .ReactModal__Body--open {
16
+ .modal-open {
17
17
  overflow: visible !important;
18
18
 
19
19
  /* always hide content underneath the fullscreen modal */
@@ -22,25 +22,29 @@
22
22
  }
23
23
  }
24
24
 
25
+ .fullscreen-modal {
26
+ position: static;
27
+ }
28
+
25
29
  /* hide hidden fullscreen modal content when printing */
26
- .ReactModalPortal.HiddenFullscreenModal {
27
- display: none;
30
+ .fullscreen-modal[aria-hidden="true"] {
31
+ display: none !important;
28
32
  }
29
33
 
30
- .ReactModal__Overlay {
34
+ .fullscreen-modal .modal-dialog {
35
+ overflow: visible !important;
36
+
31
37
  /* safari-only */
32
38
  @supports (-webkit-hyphens:none) {
33
- position: static !important;
39
+ border: none !important;
34
40
  }
35
41
  }
36
42
 
37
- .ReactModal__Content {
38
- overflow: visible !important;
39
-
43
+ .fullscreen-modal .modal-dialog,
44
+ .fullscreen-modal .modal-dialog .modal-content {
40
45
  /* safari-only */
41
46
  @supports (-webkit-hyphens:none) {
42
47
  position: static !important;
43
- border: none !important;
44
48
  }
45
49
  }
46
50
  }
@@ -281,6 +281,7 @@ button.close > span {
281
281
  .action-list {
282
282
  display: block;
283
283
  min-width: 146px;
284
+ padding: 0;
284
285
 
285
286
  & .btn-default {
286
287
  padding: 0.5rem 1rem;
@@ -295,11 +296,20 @@ button.close > span {
295
296
  align-self: stretch;
296
297
  }
297
298
 
298
- & .action-list-menu svg {
299
- height: 2rem;
300
- width: 2rem;
301
- vertical-align: middle;
302
- margin-right: 0.5rem;
299
+ & .action-list-menu-item {
300
+ padding-top: 0.75rem;
301
+ padding-bottom: 0.75rem;
302
+
303
+ & svg {
304
+ height: 2rem;
305
+ width: 2rem;
306
+ vertical-align: middle;
307
+ margin-right: 0.5rem;
308
+ }
309
+
310
+ &:not(:last-of-type) {
311
+ border-bottom: 1px solid var(--color-medium-grey);
312
+ }
303
313
  }
304
314
  }
305
315
 
@@ -10,10 +10,11 @@
10
10
  box-shadow: none;
11
11
  }
12
12
 
13
- .form-control:focus, .MuiInputBase-input:focus {
13
+ .form-control:focus,
14
+ .MuiInputBase-input:focus {
14
15
  border-color: var(--color-focus-border);
15
16
  box-shadow: var(--box-shadow-focus-shadow);
16
- transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out;
17
+ transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
17
18
  }
18
19
 
19
20
  select.form-control {
@@ -1,7 +1,3 @@
1
- .ReactModal__Body--open {
2
- overflow: hidden;
3
- }
4
-
5
1
  .modal-dialog {
6
2
  max-width: none;
7
3
  width: auto;
@@ -40,6 +36,31 @@
40
36
  }
41
37
  }
42
38
 
39
+ .fullscreen-modal {
40
+ & .modal-dialog {
41
+ position: absolute;
42
+ top: 0;
43
+ left: 0;
44
+ overflow: hidden;
45
+ padding: 0;
46
+ margin: 0;
47
+ border: none;
48
+ background-color: white;
49
+ width: 100%;
50
+ transition: none !important;
51
+ }
52
+
53
+ & .modal-content {
54
+ box-shadow: none;
55
+ border-radius: 0;
56
+ border: none;
57
+ }
58
+ }
59
+
60
+ .modal-open .fullscreen-modal {
61
+ overflow: hidden;
62
+ }
63
+
43
64
  /* Always display sentry feedback dialog on top of everything else. */
44
65
  .sentry-error-embed-wrapper {
45
66
  z-index: 9999 !important;
@@ -44,10 +44,6 @@
44
44
  }
45
45
  }
46
46
 
47
- .ql-toolbar.ql-snow {
48
- border-color: var(--color-medium-dark-grey);
49
- }
50
-
51
47
  /* Expandable toolbar */
52
48
 
53
49
  .more-options {
@@ -87,6 +83,7 @@
87
83
  /* Toolbar */
88
84
 
89
85
  .ql-toolbar.ql-snow {
86
+ border-color: var(--color-medium-dark-grey);
90
87
  padding: 0.6rem;
91
88
 
92
89
  &.disabled-invisible {
@@ -302,7 +299,7 @@
302
299
  z-index: 1;
303
300
 
304
301
  & .ql-container.ql-snow {
305
- border-color: var(--color-focus-border);
302
+ border-color: var(--color-focus-border);
306
303
  transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
307
304
  }
308
305
  }
@@ -157,6 +157,4 @@ export declare function getFullFormattedTimeZone(timeZoneId?: string, showEaster
157
157
  * @param dateTimeUtc The date to format.
158
158
  */
159
159
  export declare function getFormattedTimeZone(dateTimeUtc: string): string;
160
- export declare const isDateInputSupported: boolean;
161
- export declare const isTimeInputSupported: boolean;
162
160
  export declare function isDateTimeValid(dateTime: string | Date): boolean;
package/lib/utils/date.js CHANGED
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.isDateTimeValid = exports.isTimeInputSupported = exports.isDateInputSupported = exports.getFormattedTimeZone = exports.getFullFormattedTimeZone = exports.getFormattedNumberedTimeWithoutZoneOrMeridian = exports.getFormattedNumberedTimeWithoutZone = exports.getFormattedNumberedTimeWithFullZone = exports.getFormattedNumberedTime = exports.getFormattedNumberedDateWithoutYear = exports.getFormattedNumberedDateForInput = exports.getFormattedNumberedDateWithFullYear = exports.getFormattedNumberedDate = exports.getFormattedSimplifiedDateWithYearIfNotCurrent = exports.getFormattedSimplifiedDateWithoutYear = exports.getFormattedSimplifiedDate = exports.getFormattedNumberedDateAndTimeWithoutYear = exports.getFormattedNumberedDateAndTime = exports.getFormattedFullDateWithWeek = exports.getFormattedFullDateAndTime = exports.isNowBeforeDate = exports.isNowAfterDate = exports.isNowEqualOrBeforeDate = exports.isNowEqualOrAfterDate = exports.getEndOfMinute = exports.getEndOfDay = exports.getDateMinusTime = exports.getLocalDateTimeFromUtc = exports.getLocalMomentFromUtc = exports.getZonedMomentFromLocalDateTime = exports.getZonedMomentFromUtcInDefaultZone = exports.getZonedMomentFromUtc = exports.getOffsetDate = exports.getServerNowUtc = exports.setClockOffset = void 0;
6
+ exports.isDateTimeValid = exports.getFormattedTimeZone = exports.getFullFormattedTimeZone = exports.getFormattedNumberedTimeWithoutZoneOrMeridian = exports.getFormattedNumberedTimeWithoutZone = exports.getFormattedNumberedTimeWithFullZone = exports.getFormattedNumberedTime = exports.getFormattedNumberedDateWithoutYear = exports.getFormattedNumberedDateForInput = exports.getFormattedNumberedDateWithFullYear = exports.getFormattedNumberedDate = exports.getFormattedSimplifiedDateWithYearIfNotCurrent = exports.getFormattedSimplifiedDateWithoutYear = exports.getFormattedSimplifiedDate = exports.getFormattedNumberedDateAndTimeWithoutYear = exports.getFormattedNumberedDateAndTime = exports.getFormattedFullDateWithWeek = exports.getFormattedFullDateAndTime = exports.isNowBeforeDate = exports.isNowAfterDate = exports.isNowEqualOrBeforeDate = exports.isNowEqualOrAfterDate = exports.getEndOfMinute = exports.getEndOfDay = exports.getDateMinusTime = exports.getLocalDateTimeFromUtc = exports.getLocalMomentFromUtc = exports.getZonedMomentFromLocalDateTime = exports.getZonedMomentFromUtcInDefaultZone = exports.getZonedMomentFromUtc = exports.getOffsetDate = exports.getServerNowUtc = exports.setClockOffset = void 0;
7
7
  var moment_timezone_1 = __importDefault(require("moment-timezone"));
8
8
  var moment_timezone_utils_1 = __importDefault(require("moment-timezone/moment-timezone-utils"));
9
9
  var timezone_1 = require("./timezone");
@@ -382,19 +382,6 @@ function applyFormat(dateTimeUtc, format, timeZoneId) {
382
382
  if (timeZoneId === void 0) { timeZoneId = timezone_1.guessTimeZoneId(); }
383
383
  return exports.getZonedMomentFromUtc(dateTimeUtc, timeZoneId).format(format);
384
384
  }
385
- var isInputTypeSupported = function (type) {
386
- try {
387
- var test_1 = document.createElement('input');
388
- test_1.type = type;
389
- var isSupported = test_1.type === type;
390
- return isSupported;
391
- }
392
- catch (e) {
393
- return false;
394
- }
395
- };
396
- exports.isDateInputSupported = isInputTypeSupported('date');
397
- exports.isTimeInputSupported = isInputTypeSupported('time');
398
385
  function isDateTimeValid(dateTime) {
399
386
  return !!dateTime && moment_timezone_1.default(dateTime).isValid();
400
387
  }
package/lib/utils/dom.js CHANGED
@@ -188,10 +188,6 @@ var setupMobileEventListeners = function () {
188
188
  // add event listeners
189
189
  visualViewport.addEventListener('resize', function () {
190
190
  setVisualViewportHeightVar();
191
- // keep the document element scrolled to the top if a ReactModal is open
192
- if (document.body.classList.contains('ReactModal__Body--open')) {
193
- document.documentElement.scrollTop = 0;
194
- }
195
191
  });
196
192
  window.addEventListener('focusin', onFocusIn);
197
193
  window.addEventListener('focusout', onFocusOut);
@@ -30,7 +30,7 @@ function getShardKey(host, localhostShardKey) {
30
30
  lodash_1.default.includes(finalHost, 'web.core.windows.net') ||
31
31
  lodash_1.default.includes(finalHost, 'azureedge.net') ||
32
32
  lodash_1.default.includes(finalHost, 'z01.azurefd.net') ||
33
- lodash_1.default.includes(finalHost, 'ngrok.io')) {
33
+ lodash_1.default.includes(finalHost, 'ngrok')) {
34
34
  return shard_1.SHARD.PURDUE;
35
35
  }
36
36
  var urlParts = finalHost.split('.');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "studiokit-scaffolding-js",
3
- "version": "7.0.16",
3
+ "version": "7.0.18",
4
4
  "description": "Common scaffolding for Studio apps at Purdue",
5
5
  "repository": "https://gitlab.com/purdue-informatics/studiokit/studiokit-scaffolding-js",
6
6
  "license": "MIT",
@@ -101,7 +101,6 @@
101
101
  "@types/react": "^17.0.0",
102
102
  "@types/react-dom": "^17.0.0",
103
103
  "@types/react-helmet": "^6.1.0",
104
- "@types/react-modal": "^3.16.3",
105
104
  "@types/react-redux": "^7.1.16",
106
105
  "@types/react-router": "^5.1.11",
107
106
  "@types/react-router-bootstrap": "^0.24.5",
@@ -128,7 +127,6 @@
128
127
  "react-bootstrap": "^1.4.3",
129
128
  "react-ga4": "^2.1.0",
130
129
  "react-helmet": "^6.1.0",
131
- "react-modal": "^3.12.1",
132
130
  "react-quill": "purdue-tlt/react-quill#fix/auto-focus",
133
131
  "react-redux": "^7.2.2",
134
132
  "react-router": "^5.2.0",