studiokit-scaffolding-js 7.0.12-next.1.3 → 7.0.12-next.2.1
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.
- package/lib/components/ActionList.js +164 -37
- package/lib/components/AlertDialog.js +128 -12
- package/lib/components/AlertWithIcon.js +88 -29
- package/lib/components/ConnectedModal.js +35 -12
- package/lib/components/Dropdowns/GroupsDropdown.js +63 -45
- package/lib/components/Dropdowns/ManagedNavDropdown.js +92 -67
- package/lib/components/Dropdowns/UserDropdown.js +105 -24
- package/lib/components/Dropdowns/index.js +4 -10
- package/lib/components/EntityOwnerList.js +47 -21
- package/lib/components/Error.js +101 -12
- package/lib/components/ErrorBoundary.js +127 -38
- package/lib/components/ErrorMessage.js +39 -12
- package/lib/components/Forms/DateField.js +56 -45
- package/lib/components/Forms/TimeField.js +76 -45
- package/lib/components/Forms/index.js +3 -5
- package/lib/components/Groups/CreateEditCopySaveButtons.js +109 -14
- package/lib/components/Groups/ExternalGroups/Attach.js +206 -151
- package/lib/components/Groups/ExternalGroups/Table.js +176 -48
- package/lib/components/Groups/GroupCreateOrEditCommonProps.js +2 -2
- package/lib/components/Groups/RosterSyncInfo.js +142 -23
- package/lib/components/HOC/AccessibleAppComponent.js +88 -72
- package/lib/components/HOC/ActivityRequiredComponent.js +68 -33
- package/lib/components/HOC/AsyncComponent.js +49 -41
- package/lib/components/HOC/AuthenticatedComponent.js +55 -44
- package/lib/components/HOC/CollectionComponent.js +154 -104
- package/lib/components/HOC/CollectionFirstItemComponent.js +45 -40
- package/lib/components/HOC/CollectionItemComponent.js +152 -100
- package/lib/components/HOC/ConnectedModalComponent.js +87 -69
- package/lib/components/HOC/DataDependentComponent.js +26 -27
- package/lib/components/HOC/EntityComponent.js +57 -53
- package/lib/components/HOC/FullscreenModalComponent.js +139 -108
- package/lib/components/HOC/GroupActivityRequiredComponent.js +27 -20
- package/lib/components/HOC/GuidComponent.js +20 -20
- package/lib/components/HOC/ModelContextDependencyVerifyComponent.js +32 -29
- package/lib/components/HOC/ModelErrorRedirectComponent.js +37 -39
- package/lib/components/HOC/SearchPersistorComponent.js +237 -173
- package/lib/components/HOC/UnauthenticatedComponent.js +32 -30
- package/lib/components/HOC/UserComponent.js +6 -8
- package/lib/components/Icons/IconAlphaList.js +28 -8
- package/lib/components/Icons/IconExternalUser.js +28 -8
- package/lib/components/Icons/IconImpersonation.js +28 -8
- package/lib/components/Icons/IconStopImpersonating.js +28 -8
- package/lib/components/Icons/IconTable.js +29 -9
- package/lib/components/Icons/IconTableDeleteCol.js +28 -8
- package/lib/components/Icons/IconTableDeleteRow.js +28 -8
- package/lib/components/Icons/IconTableInsertCol.js +28 -8
- package/lib/components/Icons/IconTableInsertRow.js +28 -8
- package/lib/components/Impersonation/Button.js +71 -16
- package/lib/components/Impersonation/Link.js +72 -16
- package/lib/components/Impersonation/UserDetail.js +60 -11
- package/lib/components/Loading.js +23 -8
- package/lib/components/LockDownBrowser/Check.js +188 -51
- package/lib/components/LockDownBrowser/ExitButton.js +22 -13
- package/lib/components/LockDownBrowser/Launch.js +64 -64
- package/lib/components/Lti/Confirm.js +147 -14
- package/lib/components/Lti/CreateNonLtiGroupAlertDialog.js +165 -36
- package/lib/components/Lti/Launch.js +99 -25
- package/lib/components/Lti/LaunchGroup.js +81 -16
- package/lib/components/ManageTable.js +304 -90
- package/lib/components/ManageTableNoDataComponent.js +38 -7
- package/lib/components/NewVersionAlert.js +76 -49
- package/lib/components/NotFound.js +81 -11
- package/lib/components/Notifications.js +179 -129
- package/lib/components/PaginationNextButton.js +28 -9
- package/lib/components/PaginationPreviousButton.js +28 -9
- package/lib/components/Quill/CustomToolbar.js +427 -222
- package/lib/components/Quill/Formats/Image.js +67 -67
- package/lib/components/Quill/Formats/List.js +38 -47
- package/lib/components/Quill/Formats/Video.js +23 -26
- package/lib/components/Quill/ImageDropModule.js +136 -114
- package/lib/components/Quill/ImageWarning.js +41 -12
- package/lib/components/Quill/ImageWithAltTextModal.js +420 -89
- package/lib/components/Quill/Specs/CustomImageSpec.js +32 -31
- package/lib/components/Quill/Specs/CustomVideoSpec.js +22 -23
- package/lib/components/Quill/TableModule/Blots/BaseTableBlot.js +89 -97
- package/lib/components/Quill/TableModule/Blots/TableBlot.js +47 -50
- package/lib/components/Quill/TableModule/Blots/TableBodyBlot.js +48 -51
- package/lib/components/Quill/TableModule/Blots/TableCellBlot.js +219 -224
- package/lib/components/Quill/TableModule/Blots/TableContainer.js +75 -86
- package/lib/components/Quill/TableModule/Blots/TableRowBlot.js +70 -73
- package/lib/components/Quill/TableModule/constants.js +40 -42
- package/lib/components/Quill/TableModule/index.js +357 -305
- package/lib/components/Quill/TableModule/utils.js +39 -48
- package/lib/components/Quill/accessibilityFix.js +219 -223
- package/lib/components/Quill/index.js +30 -33
- package/lib/components/RefreshIndicator/Bordered.js +44 -10
- package/lib/components/RefreshIndicator/Inline.js +43 -12
- package/lib/components/RefreshIndicator/index.js +257 -62
- package/lib/components/SearchControls.js +211 -14
- package/lib/components/SentryRoute.js +5 -7
- package/lib/components/Tables/RoleFilter.js +66 -38
- package/lib/components/Tables/TextFilter.js +58 -18
- package/lib/components/UserRoles/Add.js +193 -99
- package/lib/components/UserRoles/Context.js +3 -6
- package/lib/components/UserRoles/RoleCell.js +176 -75
- package/lib/components/UserRoles/Select.js +151 -20
- package/lib/components/UserRoles/Table.js +215 -82
- package/lib/components/UserRoles/index.js +526 -386
- package/lib/config/eslint/index.js +26 -29
- package/lib/config/eslint/lib/order.js +21 -28
- package/lib/config/eslint/lib/prettier.js +15 -19
- package/lib/config/eslint/lib/typescript.js +87 -113
- package/lib/config/eslint/react.js +18 -15
- package/lib/constants/baseActivity.js +26 -28
- package/lib/constants/baseRole.js +10 -12
- package/lib/constants/configuration.js +43 -55
- package/lib/constants/externalProviderType.js +6 -8
- package/lib/constants/fetchErrorData.js +10 -12
- package/lib/constants/index.js +13 -15
- package/lib/constants/lockDownBrowser.js +23 -25
- package/lib/constants/mockData.js +370 -300
- package/lib/constants/modelStatus.js +11 -13
- package/lib/constants/notificationType.js +8 -10
- package/lib/constants/operatingSystem.js +8 -10
- package/lib/constants/shard.js +7 -9
- package/lib/constants/table.js +18 -22
- package/lib/constants/tier.js +8 -10
- package/lib/constants/userRole.js +11 -8
- package/lib/endpointMappings.js +191 -182
- package/lib/hooks/useCollection.js +79 -65
- package/lib/hooks/useCollectionConfiguration.js +220 -80
- package/lib/hooks/useCollectionItem.js +151 -57
- package/lib/hooks/useGuid.js +16 -9
- package/lib/hooks/usePrevious.js +14 -13
- package/lib/index.js +11 -26
- package/lib/redux/actionCreator.js +44 -35
- package/lib/redux/actions/AuthAction.js +45 -32
- package/lib/redux/actions/ModalAction.js +6 -8
- package/lib/redux/actions/ModelAction.js +95 -43
- package/lib/redux/actions/NotificationAction.js +6 -8
- package/lib/redux/actions/SearchAction.js +5 -7
- package/lib/redux/actions/index.js +6 -8
- package/lib/redux/configureReducers.js +48 -46
- package/lib/redux/configureStore.js +77 -91
- package/lib/redux/helpers.js +2 -5
- package/lib/redux/reducers/authReducer.js +44 -43
- package/lib/redux/reducers/index.js +7 -14
- package/lib/redux/reducers/modalsReducer.js +43 -31
- package/lib/redux/reducers/modelsReducer.js +131 -137
- package/lib/redux/reducers/notificationsReducer.js +20 -20
- package/lib/redux/reducers/searchReducer.js +13 -13
- package/lib/redux/sagas/appInsightsSaga.js +19 -21
- package/lib/redux/sagas/authSaga.js +248 -234
- package/lib/redux/sagas/caliperSaga.js +142 -131
- package/lib/redux/sagas/clockOffsetSaga.js +29 -32
- package/lib/redux/sagas/configurationSaga.js +8 -10
- package/lib/redux/sagas/downtimeApiErrorSaga.js +16 -19
- package/lib/redux/sagas/errorSaga.js +23 -24
- package/lib/redux/sagas/googleAnalyticsSaga.js +24 -27
- package/lib/redux/sagas/identityProviderSaga.js +19 -21
- package/lib/redux/sagas/initialDataLoadSaga.js +34 -31
- package/lib/redux/sagas/lockDownBrowserErrorSaga.js +25 -22
- package/lib/redux/sagas/modelFetchSaga.js +302 -286
- package/lib/redux/sagas/noStoreSaga.js +60 -61
- package/lib/redux/sagas/postLoginDataSaga.js +37 -32
- package/lib/redux/sagas/postLoginRedirectSaga.js +22 -27
- package/lib/redux/sagas/rootSaga.js +77 -60
- package/lib/redux/sagas/sentrySaga.js +25 -28
- package/lib/redux/sagas/userIdSaga.js +13 -15
- package/lib/services/codeProviderService.js +21 -21
- package/lib/services/dateService.js +6 -8
- package/lib/services/documentService.js +10 -11
- package/lib/services/fetchService.js +103 -95
- package/lib/services/persistenceService.js +27 -30
- package/lib/services/ticketProviderService.js +25 -25
- package/lib/services/tokenPersistenceService.js +8 -10
- package/lib/services/windowService.js +14 -16
- package/lib/startup.js +110 -101
- package/lib/types/AppConfiguration.js +2 -2
- package/lib/types/Artifact.js +7 -9
- package/lib/types/BaseReduxState.js +2 -2
- package/lib/types/Client.js +2 -2
- package/lib/types/Collection.js +2 -2
- package/lib/types/Configuration.js +2 -2
- package/lib/types/DeepLinkingResponseRequest.js +2 -2
- package/lib/types/DeletableModel.js +2 -2
- package/lib/types/Event.js +2 -2
- package/lib/types/ExternalGroup.js +2 -2
- package/lib/types/ExternalProvider.js +2 -2
- package/lib/types/ExternalTerm.js +2 -2
- package/lib/types/Group.js +2 -2
- package/lib/types/IdentityProvider.js +2 -2
- package/lib/types/LtiLaunch.js +2 -2
- package/lib/types/NameOnlyEntity.js +2 -2
- package/lib/types/Notification.js +2 -2
- package/lib/types/OptionalRecord.js +2 -2
- package/lib/types/OwnerSchedule.js +2 -2
- package/lib/types/PropertyOfType.js +2 -2
- package/lib/types/Quill.js +2 -2
- package/lib/types/RoleDescription.js +2 -2
- package/lib/types/Search.js +2 -2
- package/lib/types/SimpleLocation.js +2 -2
- package/lib/types/UniTime.js +2 -2
- package/lib/types/User.js +2 -2
- package/lib/types/UserRole.js +2 -2
- package/lib/types/auth/AuthState.js +2 -2
- package/lib/types/auth/CasV1LoginRequestBody.js +2 -2
- package/lib/types/auth/ClientCredentials.js +2 -2
- package/lib/types/auth/CodeProviderService.js +2 -2
- package/lib/types/auth/LocalLoginRequestBody.js +2 -2
- package/lib/types/auth/TicketProviderService.js +2 -2
- package/lib/types/auth/TokenPersistenceService.js +2 -2
- package/lib/types/auth/index.js +8 -10
- package/lib/types/externals.d.js +2 -0
- package/lib/types/index.js +29 -31
- package/lib/types/net/EndpointConfig.js +2 -2
- package/lib/types/net/EndpointMapping.js +2 -2
- package/lib/types/net/EndpointMappings.js +2 -2
- package/lib/types/net/ErrorHandler.js +2 -2
- package/lib/types/net/FetchConfig.js +2 -2
- package/lib/types/net/FetchErrorData.js +6 -8
- package/lib/types/net/FetchResult.js +2 -2
- package/lib/types/net/HTTPMethod.js +2 -2
- package/lib/types/net/HTTPStatusCode.js +12 -14
- package/lib/types/net/Metadata.js +2 -2
- package/lib/types/net/Model.js +2 -2
- package/lib/types/net/ModelCollection.js +2 -2
- package/lib/types/net/ModelsState.js +2 -2
- package/lib/types/net/OAuthToken.js +2 -2
- package/lib/types/net/OAuthTokenOrNull.js +2 -2
- package/lib/types/net/TokenAccessFunction.js +2 -2
- package/lib/types/net/index.js +17 -19
- package/lib/utils/baseActivity.js +83 -85
- package/lib/utils/baseRole.js +32 -36
- package/lib/utils/collection.js +403 -297
- package/lib/utils/cookies.js +19 -23
- package/lib/utils/date.js +188 -205
- package/lib/utils/dom.js +130 -131
- package/lib/utils/domainIdentifier.js +4 -8
- package/lib/utils/entityUserRole.js +2 -5
- package/lib/utils/error.js +14 -19
- package/lib/utils/events.js +32 -31
- package/lib/utils/externalGroup.js +20 -25
- package/lib/utils/externalProviders.js +4 -7
- package/lib/utils/externalTerms.js +6 -6
- package/lib/utils/fetch.js +168 -176
- package/lib/utils/group.js +14 -11
- package/lib/utils/groupDates.js +38 -46
- package/lib/utils/groupRoles.js +23 -32
- package/lib/utils/lockDownBrowser.js +12 -15
- package/lib/utils/logger.js +23 -28
- package/lib/utils/lti.js +4 -7
- package/lib/utils/model.js +28 -43
- package/lib/utils/number.js +9 -13
- package/lib/utils/promise.js +23 -26
- package/lib/utils/quill.js +55 -60
- package/lib/utils/route.js +52 -60
- package/lib/utils/search.js +72 -87
- package/lib/utils/shard.js +33 -42
- package/lib/utils/sort.js +47 -50
- package/lib/utils/string.js +10 -12
- package/lib/utils/table.js +29 -33
- package/lib/utils/timezone.js +7 -12
- package/lib/utils/url.js +130 -144
- package/lib/utils/user.js +54 -64
- package/lib/utils/userAgent.js +7 -14
- package/lib/utils/userRole.js +36 -39
- package/package.json +17 -3
package/lib/utils/dom.js
CHANGED
|
@@ -1,59 +1,54 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.setupMobileEventListeners = exports.isTextInput = exports.hasExternalKeyboard = exports.isMobileDevice = exports.getFirstParentElementWithClassName = exports.getVerticallyScrollableParent = void 0;
|
|
4
|
-
const logger_1 = require("./logger");
|
|
1
|
+
import { getLogger } from './logger';
|
|
5
2
|
const KEYBOARD_ANIMATION_MS = 250;
|
|
3
|
+
|
|
6
4
|
/**
|
|
7
5
|
* Get the nearest vertically scrollable parent of an element
|
|
8
6
|
* @param { HTMLElement } element - The element to start with
|
|
9
7
|
* @returns The nearest vertically scrollable parent element
|
|
10
8
|
*/
|
|
11
|
-
const getVerticallyScrollableParent =
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
}
|
|
22
|
-
return document.scrollingElement;
|
|
9
|
+
export const getVerticallyScrollableParent = element => {
|
|
10
|
+
let style = getComputedStyle(element);
|
|
11
|
+
const excludeStaticParent = style.position === 'absolute';
|
|
12
|
+
const overflowRegex = /(auto|scroll|hidden)/;
|
|
13
|
+
for (let parent = element; parent = parent.parentElement;) {
|
|
14
|
+
style = getComputedStyle(parent);
|
|
15
|
+
if (excludeStaticParent && style.position === 'static') continue;
|
|
16
|
+
if (overflowRegex.test(style.overflow + style.overflowY) && parent.scrollHeight > parent.clientHeight) return parent;
|
|
17
|
+
}
|
|
18
|
+
return document.scrollingElement;
|
|
23
19
|
};
|
|
24
|
-
|
|
20
|
+
|
|
25
21
|
/**
|
|
26
22
|
* Get the first parent that has the given className in its classList
|
|
27
23
|
* @param element The target element
|
|
28
24
|
* @param className The className to match
|
|
29
25
|
*/
|
|
30
|
-
const getFirstParentElementWithClassName = (element, className) => {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
return undefined;
|
|
26
|
+
export const getFirstParentElementWithClassName = (element, className) => {
|
|
27
|
+
for (let parent = element; parent = parent.parentElement;) {
|
|
28
|
+
if (parent.classList.contains(className)) return parent;
|
|
29
|
+
}
|
|
30
|
+
return undefined;
|
|
36
31
|
};
|
|
37
|
-
|
|
32
|
+
|
|
38
33
|
/**
|
|
39
34
|
* Return whether the device being used is one of several mainstream mobile devices
|
|
40
35
|
*/
|
|
41
|
-
const isMobileDevice = () => {
|
|
42
|
-
|
|
43
|
-
(/macintosh/i.test(navigator.userAgent) && navigator.maxTouchPoints));
|
|
36
|
+
export const isMobileDevice = () => {
|
|
37
|
+
return /android|ipad|ipod|iphone/i.test(navigator.userAgent) || /macintosh/i.test(navigator.userAgent) && navigator.maxTouchPoints;
|
|
44
38
|
};
|
|
45
|
-
|
|
39
|
+
|
|
46
40
|
/** Return whether the device is using an external keyboard vs. the native on-screen OS keyboard. */
|
|
47
|
-
const hasExternalKeyboard = () => window.hasExternalKeyboard;
|
|
48
|
-
|
|
41
|
+
export const hasExternalKeyboard = () => window.hasExternalKeyboard;
|
|
42
|
+
|
|
49
43
|
/**
|
|
50
44
|
* Sets `window.hasExternalKeyboard`, returned by `hasExternalKeyboard`.
|
|
51
45
|
*/
|
|
52
|
-
const setHasExternalKeyboard =
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
46
|
+
const setHasExternalKeyboard = hasExternalKeyboard => {
|
|
47
|
+
getLogger().debug('hasExternalKeyboard', hasExternalKeyboard);
|
|
48
|
+
const windowWithoutType = window;
|
|
49
|
+
windowWithoutType.hasExternalKeyboard = hasExternalKeyboard;
|
|
56
50
|
};
|
|
51
|
+
|
|
57
52
|
/**
|
|
58
53
|
* 100vh is kind of b⊘rked on mobile safari, we have to set it programmatically here
|
|
59
54
|
* so we can calculate device-independent viewport heights
|
|
@@ -63,72 +58,73 @@ const setHasExternalKeyboard = (hasExternalKeyboard) => {
|
|
|
63
58
|
*
|
|
64
59
|
*/
|
|
65
60
|
const setVisualViewportHeightVar = () => {
|
|
66
|
-
|
|
67
|
-
|
|
61
|
+
const height = visualViewport ? visualViewport.height : 0;
|
|
62
|
+
document.documentElement.style.setProperty('--visual-viewport-height', `${height}px`);
|
|
68
63
|
};
|
|
64
|
+
|
|
69
65
|
/**
|
|
70
66
|
* Is the given element capable of text input?
|
|
71
67
|
*
|
|
72
68
|
* @param el An HTML element
|
|
73
69
|
*/
|
|
74
|
-
const isTextInput =
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
return tagName === 'div' && el.className.includes('ql-editor') && el.contentEditable === 'true';
|
|
70
|
+
export const isTextInput = el => {
|
|
71
|
+
const tagName = el.tagName && el.tagName.toLowerCase();
|
|
72
|
+
if (tagName === 'textarea') return true;
|
|
73
|
+
if (tagName === 'input') {
|
|
74
|
+
const inputEl = el;
|
|
75
|
+
return inputEl.type !== 'button' && inputEl.type !== 'radio' && inputEl.type !== 'checkbox';
|
|
76
|
+
}
|
|
77
|
+
// Quill editor
|
|
78
|
+
return tagName === 'div' && el.className.includes('ql-editor') && el.contentEditable === 'true';
|
|
84
79
|
};
|
|
85
|
-
exports.isTextInput = isTextInput;
|
|
86
80
|
let updateHasExternalKeyboardAfterFocusTimeout = undefined;
|
|
87
81
|
let scrollToElementAfterFocusTimeout = undefined;
|
|
88
82
|
const updateHasExternalKeyboardAfterFocus = () => {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
}, KEYBOARD_ANIMATION_MS);
|
|
83
|
+
const closedVisualViewportHeight = visualViewport ? visualViewport.height : 0;
|
|
84
|
+
// wait for the keyboard animation
|
|
85
|
+
updateHasExternalKeyboardAfterFocusTimeout = window.setTimeout(() => {
|
|
86
|
+
// find the keyboard height based on the difference in viewport height
|
|
87
|
+
const keyboardHeight = closedVisualViewportHeight - (visualViewport ? visualViewport.height : 0);
|
|
88
|
+
// on first-load the input focus can fail
|
|
89
|
+
// when this happens the height is 0, and this ONLY happens when there is NOT an external keyboard
|
|
90
|
+
if (keyboardHeight === 0 && hasExternalKeyboard() === undefined) {
|
|
91
|
+
setHasExternalKeyboard(false);
|
|
92
|
+
} else {
|
|
93
|
+
// if the keyboard height is greater than 100, that means the full onscreen keyboard displayed
|
|
94
|
+
// otherwise, only the small context menu displayed, meaning there is an external keyboard
|
|
95
|
+
setHasExternalKeyboard(keyboardHeight < 100);
|
|
96
|
+
}
|
|
97
|
+
updateHasExternalKeyboardAfterFocusTimeout = undefined;
|
|
98
|
+
}, KEYBOARD_ANIMATION_MS);
|
|
106
99
|
};
|
|
107
|
-
const scrollToElementAfterFocus =
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
100
|
+
const scrollToElementAfterFocus = el => {
|
|
101
|
+
// wait for the keyboard animation
|
|
102
|
+
scrollToElementAfterFocusTimeout = window.setTimeout(() => {
|
|
103
|
+
// after the keyboard is open, check for the el’s scrollable parent, as it could have just become scrollable
|
|
104
|
+
const scrollParent = getVerticallyScrollableParent(el);
|
|
105
|
+
// if the el has a scrollable parent other than the document, scroll it back into view
|
|
106
|
+
if (scrollParent && scrollParent !== document.documentElement) {
|
|
107
|
+
const scrollRect = scrollParent.getBoundingClientRect();
|
|
108
|
+
const rect = el.getBoundingClientRect();
|
|
109
|
+
// only scroll into view if outside of the scroll parent bounds
|
|
110
|
+
if (rect.bottom < scrollRect.top || rect.top > scrollRect.bottom) {
|
|
111
|
+
const newScrollTop = scrollParent.scrollTop + rect.top - scrollRect.top - 10;
|
|
112
|
+
getLogger().debug('scrollToEl', newScrollTop);
|
|
113
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
114
|
+
if (scrollParent.scrollTo) {
|
|
115
|
+
scrollParent.scrollTo({
|
|
116
|
+
top: newScrollTop,
|
|
117
|
+
behavior: 'smooth'
|
|
118
|
+
});
|
|
119
|
+
} else {
|
|
120
|
+
scrollParent.scrollTop = newScrollTop;
|
|
128
121
|
}
|
|
129
|
-
|
|
130
|
-
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
scrollToElementAfterFocusTimeout = undefined;
|
|
125
|
+
}, KEYBOARD_ANIMATION_MS);
|
|
131
126
|
};
|
|
127
|
+
|
|
132
128
|
/**
|
|
133
129
|
* Event handler for "focusin" event.
|
|
134
130
|
*
|
|
@@ -137,12 +133,12 @@ const scrollToElementAfterFocus = (el) => {
|
|
|
137
133
|
* Checks for external keyboard and scrolls to the focused element after any animations, e.g. keyboard open.
|
|
138
134
|
*
|
|
139
135
|
*/
|
|
140
|
-
const onFocusIn =
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
scrollToElementAfterFocus(e.target);
|
|
136
|
+
const onFocusIn = e => {
|
|
137
|
+
if (!e.target || !isTextInput(e.target)) return;
|
|
138
|
+
updateHasExternalKeyboardAfterFocus();
|
|
139
|
+
scrollToElementAfterFocus(e.target);
|
|
145
140
|
};
|
|
141
|
+
|
|
146
142
|
/**
|
|
147
143
|
* Event handler for "focusout" event.
|
|
148
144
|
*
|
|
@@ -151,52 +147,55 @@ const onFocusIn = (e) => {
|
|
|
151
147
|
* Clears any pending timeouts from "focusin" events.
|
|
152
148
|
*
|
|
153
149
|
*/
|
|
154
|
-
const onFocusOut =
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
}
|
|
150
|
+
const onFocusOut = e => {
|
|
151
|
+
if (!e.target || !isTextInput(e.target)) return;
|
|
152
|
+
if (updateHasExternalKeyboardAfterFocusTimeout) {
|
|
153
|
+
window.clearTimeout(updateHasExternalKeyboardAfterFocusTimeout);
|
|
154
|
+
updateHasExternalKeyboardAfterFocusTimeout = undefined;
|
|
155
|
+
}
|
|
156
|
+
if (scrollToElementAfterFocusTimeout) {
|
|
157
|
+
window.clearTimeout(scrollToElementAfterFocusTimeout);
|
|
158
|
+
scrollToElementAfterFocusTimeout = undefined;
|
|
159
|
+
}
|
|
165
160
|
};
|
|
161
|
+
|
|
166
162
|
/**
|
|
167
163
|
* Check if the device is using an external keyboard by appending an `input` and focusing it.
|
|
168
164
|
*
|
|
169
165
|
* This will trigger the `onFocusIn` event handler, which updates the `hasExternalKeyboard` global.
|
|
170
166
|
*/
|
|
171
167
|
const checkForExternalKeyboard = () => {
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
168
|
+
const el = document.createElement('input');
|
|
169
|
+
el.type = 'text';
|
|
170
|
+
el.autofocus = true;
|
|
171
|
+
el.addEventListener('focusin', () => {
|
|
172
|
+
// remove the input after the keyboard has displayed, plus a small buffer
|
|
173
|
+
window.setTimeout(() => {
|
|
174
|
+
el.blur();
|
|
175
|
+
el.remove();
|
|
176
|
+
}, KEYBOARD_ANIMATION_MS + 100);
|
|
177
|
+
});
|
|
178
|
+
document.documentElement.append(el);
|
|
183
179
|
};
|
|
184
|
-
const setupMobileEventListeners = () => {
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
180
|
+
export const setupMobileEventListeners = () => {
|
|
181
|
+
if (!isMobileDevice() || !visualViewport) return;
|
|
182
|
+
|
|
183
|
+
// set viewport height var at setup
|
|
184
|
+
setVisualViewportHeightVar();
|
|
185
|
+
|
|
186
|
+
// add event listeners
|
|
187
|
+
visualViewport.addEventListener('resize', () => {
|
|
188
188
|
setVisualViewportHeightVar();
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
checkForExternalKeyboard();
|
|
189
|
+
|
|
190
|
+
// keep the document element scrolled to the top if a ReactModal is open
|
|
191
|
+
if (document.body.classList.contains('ReactModal__Body--open')) {
|
|
192
|
+
document.documentElement.scrollTop = 0;
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
window.addEventListener('focusin', onFocusIn);
|
|
196
|
+
window.addEventListener('focusout', onFocusOut);
|
|
197
|
+
|
|
198
|
+
// check for external keyboard at setup
|
|
199
|
+
checkForExternalKeyboard();
|
|
201
200
|
};
|
|
202
|
-
exports.setupMobileEventListeners = setupMobileEventListeners;
|
|
201
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJnZXRMb2dnZXIiLCJLRVlCT0FSRF9BTklNQVRJT05fTVMiLCJnZXRWZXJ0aWNhbGx5U2Nyb2xsYWJsZVBhcmVudCIsImVsZW1lbnQiLCJzdHlsZSIsImdldENvbXB1dGVkU3R5bGUiLCJleGNsdWRlU3RhdGljUGFyZW50IiwicG9zaXRpb24iLCJvdmVyZmxvd1JlZ2V4IiwicGFyZW50IiwicGFyZW50RWxlbWVudCIsInRlc3QiLCJvdmVyZmxvdyIsIm92ZXJmbG93WSIsInNjcm9sbEhlaWdodCIsImNsaWVudEhlaWdodCIsImRvY3VtZW50Iiwic2Nyb2xsaW5nRWxlbWVudCIsImdldEZpcnN0UGFyZW50RWxlbWVudFdpdGhDbGFzc05hbWUiLCJjbGFzc05hbWUiLCJjbGFzc0xpc3QiLCJjb250YWlucyIsInVuZGVmaW5lZCIsImlzTW9iaWxlRGV2aWNlIiwibmF2aWdhdG9yIiwidXNlckFnZW50IiwibWF4VG91Y2hQb2ludHMiLCJoYXNFeHRlcm5hbEtleWJvYXJkIiwid2luZG93Iiwic2V0SGFzRXh0ZXJuYWxLZXlib2FyZCIsImRlYnVnIiwid2luZG93V2l0aG91dFR5cGUiLCJzZXRWaXN1YWxWaWV3cG9ydEhlaWdodFZhciIsImhlaWdodCIsInZpc3VhbFZpZXdwb3J0IiwiZG9jdW1lbnRFbGVtZW50Iiwic2V0UHJvcGVydHkiLCJpc1RleHRJbnB1dCIsImVsIiwidGFnTmFtZSIsInRvTG93ZXJDYXNlIiwiaW5wdXRFbCIsInR5cGUiLCJpbmNsdWRlcyIsImNvbnRlbnRFZGl0YWJsZSIsInVwZGF0ZUhhc0V4dGVybmFsS2V5Ym9hcmRBZnRlckZvY3VzVGltZW91dCIsInNjcm9sbFRvRWxlbWVudEFmdGVyRm9jdXNUaW1lb3V0IiwidXBkYXRlSGFzRXh0ZXJuYWxLZXlib2FyZEFmdGVyRm9jdXMiLCJjbG9zZWRWaXN1YWxWaWV3cG9ydEhlaWdodCIsInNldFRpbWVvdXQiLCJrZXlib2FyZEhlaWdodCIsInNjcm9sbFRvRWxlbWVudEFmdGVyRm9jdXMiLCJzY3JvbGxQYXJlbnQiLCJzY3JvbGxSZWN0IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwicmVjdCIsImJvdHRvbSIsInRvcCIsIm5ld1Njcm9sbFRvcCIsInNjcm9sbFRvcCIsInNjcm9sbFRvIiwiYmVoYXZpb3IiLCJvbkZvY3VzSW4iLCJlIiwidGFyZ2V0Iiwib25Gb2N1c091dCIsImNsZWFyVGltZW91dCIsImNoZWNrRm9yRXh0ZXJuYWxLZXlib2FyZCIsImNyZWF0ZUVsZW1lbnQiLCJhdXRvZm9jdXMiLCJhZGRFdmVudExpc3RlbmVyIiwiYmx1ciIsInJlbW92ZSIsImFwcGVuZCIsInNldHVwTW9iaWxlRXZlbnRMaXN0ZW5lcnMiLCJib2R5Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2RvbS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlcidcblxuY29uc3QgS0VZQk9BUkRfQU5JTUFUSU9OX01TID0gMjUwXG5cbi8qKlxuICogR2V0IHRoZSBuZWFyZXN0IHZlcnRpY2FsbHkgc2Nyb2xsYWJsZSBwYXJlbnQgb2YgYW4gZWxlbWVudFxuICogQHBhcmFtIHsgSFRNTEVsZW1lbnQgfSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgdG8gc3RhcnQgd2l0aFxuICogQHJldHVybnMgVGhlIG5lYXJlc3QgdmVydGljYWxseSBzY3JvbGxhYmxlIHBhcmVudCBlbGVtZW50XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRWZXJ0aWNhbGx5U2Nyb2xsYWJsZVBhcmVudCA9IChlbGVtZW50OiBIVE1MRWxlbWVudCkgPT4ge1xuXHRsZXQgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpXG5cdGNvbnN0IGV4Y2x1ZGVTdGF0aWNQYXJlbnQgPSBzdHlsZS5wb3NpdGlvbiA9PT0gJ2Fic29sdXRlJ1xuXHRjb25zdCBvdmVyZmxvd1JlZ2V4ID0gLyhhdXRvfHNjcm9sbHxoaWRkZW4pL1xuXG5cdGZvciAobGV0IHBhcmVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gZWxlbWVudDsgKHBhcmVudCA9IHBhcmVudC5wYXJlbnRFbGVtZW50KTsgKSB7XG5cdFx0c3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKHBhcmVudClcblx0XHRpZiAoZXhjbHVkZVN0YXRpY1BhcmVudCAmJiBzdHlsZS5wb3NpdGlvbiA9PT0gJ3N0YXRpYycpIGNvbnRpbnVlXG5cdFx0aWYgKG92ZXJmbG93UmVnZXgudGVzdChzdHlsZS5vdmVyZmxvdyArIHN0eWxlLm92ZXJmbG93WSkgJiYgcGFyZW50LnNjcm9sbEhlaWdodCA+IHBhcmVudC5jbGllbnRIZWlnaHQpXG5cdFx0XHRyZXR1cm4gcGFyZW50XG5cdH1cblx0cmV0dXJuIGRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnRcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGZpcnN0IHBhcmVudCB0aGF0IGhhcyB0aGUgZ2l2ZW4gY2xhc3NOYW1lIGluIGl0cyBjbGFzc0xpc3RcbiAqIEBwYXJhbSBlbGVtZW50IFRoZSB0YXJnZXQgZWxlbWVudFxuICogQHBhcmFtIGNsYXNzTmFtZSBUaGUgY2xhc3NOYW1lIHRvIG1hdGNoXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRGaXJzdFBhcmVudEVsZW1lbnRXaXRoQ2xhc3NOYW1lID0gKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBjbGFzc05hbWU6IHN0cmluZykgPT4ge1xuXHRmb3IgKGxldCBwYXJlbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IGVsZW1lbnQ7IChwYXJlbnQgPSBwYXJlbnQucGFyZW50RWxlbWVudCk7ICkge1xuXHRcdGlmIChwYXJlbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSkpIHJldHVybiBwYXJlbnRcblx0fVxuXHRyZXR1cm4gdW5kZWZpbmVkXG59XG5cbi8qKlxuICogUmV0dXJuIHdoZXRoZXIgdGhlIGRldmljZSBiZWluZyB1c2VkIGlzIG9uZSBvZiBzZXZlcmFsIG1haW5zdHJlYW0gbW9iaWxlIGRldmljZXNcbiAqL1xuZXhwb3J0IGNvbnN0IGlzTW9iaWxlRGV2aWNlID0gKCkgPT4ge1xuXHRyZXR1cm4gKFxuXHRcdC9hbmRyb2lkfGlwYWR8aXBvZHxpcGhvbmUvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpIHx8XG5cdFx0KC9tYWNpbnRvc2gvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpICYmIG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cylcblx0KVxufVxuXG4vKiogUmV0dXJuIHdoZXRoZXIgdGhlIGRldmljZSBpcyB1c2luZyBhbiBleHRlcm5hbCBrZXlib2FyZCB2cy4gdGhlIG5hdGl2ZSBvbi1zY3JlZW4gT1Mga2V5Ym9hcmQuICovXG5leHBvcnQgY29uc3QgaGFzRXh0ZXJuYWxLZXlib2FyZCA9ICgpOiBib29sZWFuIHwgdW5kZWZpbmVkID0+ICh3aW5kb3cgYXMgYW55KS5oYXNFeHRlcm5hbEtleWJvYXJkXG5cbi8qKlxuICogU2V0cyBgd2luZG93Lmhhc0V4dGVybmFsS2V5Ym9hcmRgLCByZXR1cm5lZCBieSBgaGFzRXh0ZXJuYWxLZXlib2FyZGAuXG4gKi9cbmNvbnN0IHNldEhhc0V4dGVybmFsS2V5Ym9hcmQgPSAoaGFzRXh0ZXJuYWxLZXlib2FyZDogYm9vbGVhbikgPT4ge1xuXHRnZXRMb2dnZXIoKS5kZWJ1ZygnaGFzRXh0ZXJuYWxLZXlib2FyZCcsIGhhc0V4dGVybmFsS2V5Ym9hcmQpXG5cdGNvbnN0IHdpbmRvd1dpdGhvdXRUeXBlID0gd2luZG93IGFzIGFueVxuXHR3aW5kb3dXaXRob3V0VHlwZS5oYXNFeHRlcm5hbEtleWJvYXJkID0gaGFzRXh0ZXJuYWxLZXlib2FyZFxufVxuXG4vKipcbiAqIDEwMHZoIGlzIGtpbmQgb2YgYuKKmHJrZWQgb24gbW9iaWxlIHNhZmFyaSwgd2UgaGF2ZSB0byBzZXQgaXQgcHJvZ3JhbW1hdGljYWxseSBoZXJlXG4gKiBzbyB3ZSBjYW4gY2FsY3VsYXRlIGRldmljZS1pbmRlcGVuZGVudCB2aWV3cG9ydCBoZWlnaHRzXG4gKiBodHRwczovL2FsbHRoaW5nc3NtaXR0eS5jb20vMjAyMC8wNS8xMS9jc3MtZml4LWZvci0xMDB2aC1pbi1tb2JpbGUtd2Via2l0L1xuICpcbiAqIFNldHMgdGhlIENTUyB2YXJpYWJsZSBgLS12aXN1YWwtdmlld3BvcnQtaGVpZ2h0YCBvbiB0aGUgYGRvY3VtZW50RWxlbWVudGAvPGh0bWw+LlxuICpcbiAqL1xuY29uc3Qgc2V0VmlzdWFsVmlld3BvcnRIZWlnaHRWYXIgPSAoKSA9PiB7XG5cdGNvbnN0IGhlaWdodCA9IHZpc3VhbFZpZXdwb3J0ID8gdmlzdWFsVmlld3BvcnQuaGVpZ2h0IDogMFxuXHRkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoJy0tdmlzdWFsLXZpZXdwb3J0LWhlaWdodCcsIGAke2hlaWdodH1weGApXG59XG5cbi8qKlxuICogSXMgdGhlIGdpdmVuIGVsZW1lbnQgY2FwYWJsZSBvZiB0ZXh0IGlucHV0P1xuICpcbiAqIEBwYXJhbSBlbCBBbiBIVE1MIGVsZW1lbnRcbiAqL1xuZXhwb3J0IGNvbnN0IGlzVGV4dElucHV0ID0gKGVsOiBIVE1MRWxlbWVudCkgPT4ge1xuXHRjb25zdCB0YWdOYW1lID0gZWwudGFnTmFtZSAmJiBlbC50YWdOYW1lLnRvTG93ZXJDYXNlKClcblx0aWYgKHRhZ05hbWUgPT09ICd0ZXh0YXJlYScpIHJldHVybiB0cnVlXG5cdGlmICh0YWdOYW1lID09PSAnaW5wdXQnKSB7XG5cdFx0Y29uc3QgaW5wdXRFbCA9IGVsIGFzIEhUTUxJbnB1dEVsZW1lbnRcblx0XHRyZXR1cm4gaW5wdXRFbC50eXBlICE9PSAnYnV0dG9uJyAmJiBpbnB1dEVsLnR5cGUgIT09ICdyYWRpbycgJiYgaW5wdXRFbC50eXBlICE9PSAnY2hlY2tib3gnXG5cdH1cblx0Ly8gUXVpbGwgZWRpdG9yXG5cdHJldHVybiB0YWdOYW1lID09PSAnZGl2JyAmJiBlbC5jbGFzc05hbWUuaW5jbHVkZXMoJ3FsLWVkaXRvcicpICYmIGVsLmNvbnRlbnRFZGl0YWJsZSA9PT0gJ3RydWUnXG59XG5cbmxldCB1cGRhdGVIYXNFeHRlcm5hbEtleWJvYXJkQWZ0ZXJGb2N1c1RpbWVvdXQ6IG51bWJlciB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZFxubGV0IHNjcm9sbFRvRWxlbWVudEFmdGVyRm9jdXNUaW1lb3V0OiBudW1iZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWRcblxuY29uc3QgdXBkYXRlSGFzRXh0ZXJuYWxLZXlib2FyZEFmdGVyRm9jdXMgPSAoKSA9PiB7XG5cdGNvbnN0IGNsb3NlZFZpc3VhbFZpZXdwb3J0SGVpZ2h0ID0gdmlzdWFsVmlld3BvcnQgPyB2aXN1YWxWaWV3cG9ydC5oZWlnaHQgOiAwXG5cdC8vIHdhaXQgZm9yIHRoZSBrZXlib2FyZCBhbmltYXRpb25cblx0dXBkYXRlSGFzRXh0ZXJuYWxLZXlib2FyZEFmdGVyRm9jdXNUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdC8vIGZpbmQgdGhlIGtleWJvYXJkIGhlaWdodCBiYXNlZCBvbiB0aGUgZGlmZmVyZW5jZSBpbiB2aWV3cG9ydCBoZWlnaHRcblx0XHRjb25zdCBrZXlib2FyZEhlaWdodCA9IGNsb3NlZFZpc3VhbFZpZXdwb3J0SGVpZ2h0IC0gKHZpc3VhbFZpZXdwb3J0ID8gdmlzdWFsVmlld3BvcnQuaGVpZ2h0IDogMClcblx0XHQvLyBvbiBmaXJzdC1sb2FkIHRoZSBpbnB1dCBmb2N1cyBjYW4gZmFpbFxuXHRcdC8vIHdoZW4gdGhpcyBoYXBwZW5zIHRoZSBoZWlnaHQgaXMgMCwgYW5kIHRoaXMgT05MWSBoYXBwZW5zIHdoZW4gdGhlcmUgaXMgTk9UIGFuIGV4dGVybmFsIGtleWJvYXJkXG5cdFx0aWYgKGtleWJvYXJkSGVpZ2h0ID09PSAwICYmIGhhc0V4dGVybmFsS2V5Ym9hcmQoKSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRzZXRIYXNFeHRlcm5hbEtleWJvYXJkKGZhbHNlKVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBpZiB0aGUga2V5Ym9hcmQgaGVpZ2h0IGlzIGdyZWF0ZXIgdGhhbiAxMDAsIHRoYXQgbWVhbnMgdGhlIGZ1bGwgb25zY3JlZW4ga2V5Ym9hcmQgZGlzcGxheWVkXG5cdFx0XHQvLyBvdGhlcndpc2UsIG9ubHkgdGhlIHNtYWxsIGNvbnRleHQgbWVudSBkaXNwbGF5ZWQsIG1lYW5pbmcgdGhlcmUgaXMgYW4gZXh0ZXJuYWwga2V5Ym9hcmRcblx0XHRcdHNldEhhc0V4dGVybmFsS2V5Ym9hcmQoa2V5Ym9hcmRIZWlnaHQgPCAxMDApXG5cdFx0fVxuXG5cdFx0dXBkYXRlSGFzRXh0ZXJuYWxLZXlib2FyZEFmdGVyRm9jdXNUaW1lb3V0ID0gdW5kZWZpbmVkXG5cdH0sIEtFWUJPQVJEX0FOSU1BVElPTl9NUylcbn1cblxuY29uc3Qgc2Nyb2xsVG9FbGVtZW50QWZ0ZXJGb2N1cyA9IChlbDogSFRNTEVsZW1lbnQpID0+IHtcblx0Ly8gd2FpdCBmb3IgdGhlIGtleWJvYXJkIGFuaW1hdGlvblxuXHRzY3JvbGxUb0VsZW1lbnRBZnRlckZvY3VzVGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcblx0XHQvLyBhZnRlciB0aGUga2V5Ym9hcmQgaXMgb3BlbiwgY2hlY2sgZm9yIHRoZSBlbOKAmXMgc2Nyb2xsYWJsZSBwYXJlbnQsIGFzIGl0IGNvdWxkIGhhdmUganVzdCBiZWNvbWUgc2Nyb2xsYWJsZVxuXHRcdGNvbnN0IHNjcm9sbFBhcmVudCA9IGdldFZlcnRpY2FsbHlTY3JvbGxhYmxlUGFyZW50KGVsKVxuXHRcdC8vIGlmIHRoZSBlbCBoYXMgYSBzY3JvbGxhYmxlIHBhcmVudCBvdGhlciB0aGFuIHRoZSBkb2N1bWVudCwgc2Nyb2xsIGl0IGJhY2sgaW50byB2aWV3XG5cdFx0aWYgKHNjcm9sbFBhcmVudCAmJiBzY3JvbGxQYXJlbnQgIT09IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuXHRcdFx0Y29uc3Qgc2Nyb2xsUmVjdCA9IHNjcm9sbFBhcmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuXHRcdFx0Y29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG5cdFx0XHQvLyBvbmx5IHNjcm9sbCBpbnRvIHZpZXcgaWYgb3V0c2lkZSBvZiB0aGUgc2Nyb2xsIHBhcmVudCBib3VuZHNcblx0XHRcdGlmIChyZWN0LmJvdHRvbSA8IHNjcm9sbFJlY3QudG9wIHx8IHJlY3QudG9wID4gc2Nyb2xsUmVjdC5ib3R0b20pIHtcblx0XHRcdFx0Y29uc3QgbmV3U2Nyb2xsVG9wID0gc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCArIHJlY3QudG9wIC0gc2Nyb2xsUmVjdC50b3AgLSAxMFxuXHRcdFx0XHRnZXRMb2dnZXIoKS5kZWJ1Zygnc2Nyb2xsVG9FbCcsIG5ld1Njcm9sbFRvcClcblx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb25cblx0XHRcdFx0aWYgKHNjcm9sbFBhcmVudC5zY3JvbGxUbykge1xuXHRcdFx0XHRcdHNjcm9sbFBhcmVudC5zY3JvbGxUbyh7IHRvcDogbmV3U2Nyb2xsVG9wLCBiZWhhdmlvcjogJ3Ntb290aCcgfSlcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzY3JvbGxQYXJlbnQuc2Nyb2xsVG9wID0gbmV3U2Nyb2xsVG9wXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRzY3JvbGxUb0VsZW1lbnRBZnRlckZvY3VzVGltZW91dCA9IHVuZGVmaW5lZFxuXHR9LCBLRVlCT0FSRF9BTklNQVRJT05fTVMpXG59XG5cbi8qKlxuICogRXZlbnQgaGFuZGxlciBmb3IgXCJmb2N1c2luXCIgZXZlbnQuXG4gKlxuICogXCJmb2N1c2luXCIgYnViYmxlcyB1cCBmcm9tIGFsbCBmb2N1cyBldmVudHMsIHNvIHVzZXMgYGlzVGV4dElucHV0YCB0byBvbmx5IHJlYWN0IHRvIFwia2V5Ym9hcmRcIiBmb2N1cyBldmVudHMuXG4gKlxuICogQ2hlY2tzIGZvciBleHRlcm5hbCBrZXlib2FyZCBhbmQgc2Nyb2xscyB0byB0aGUgZm9jdXNlZCBlbGVtZW50IGFmdGVyIGFueSBhbmltYXRpb25zLCBlLmcuIGtleWJvYXJkIG9wZW4uXG4gKlxuICovXG5jb25zdCBvbkZvY3VzSW4gPSAoZTogRXZlbnQpID0+IHtcblx0aWYgKCFlLnRhcmdldCB8fCAhaXNUZXh0SW5wdXQoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpKSByZXR1cm5cblx0dXBkYXRlSGFzRXh0ZXJuYWxLZXlib2FyZEFmdGVyRm9jdXMoKVxuXHRzY3JvbGxUb0VsZW1lbnRBZnRlckZvY3VzKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KVxufVxuXG4vKipcbiAqIEV2ZW50IGhhbmRsZXIgZm9yIFwiZm9jdXNvdXRcIiBldmVudC5cbiAqXG4gKiBcImZvY3Vzb3V0XCIgYnViYmxlcyB1cCBmcm9tIGFsbCBmb2N1cyBldmVudHMsIHNvIHVzZXMgYGlzVGV4dElucHV0YCB0byBvbmx5IHJlYWN0IHRvIFwia2V5Ym9hcmRcIiBmb2N1cyBldmVudHMuXG4gKlxuICogQ2xlYXJzIGFueSBwZW5kaW5nIHRpbWVvdXRzIGZyb20gXCJmb2N1c2luXCIgZXZlbnRzLlxuICpcbiAqL1xuY29uc3Qgb25Gb2N1c091dCA9IChlOiBFdmVudCkgPT4ge1xuXHRpZiAoIWUudGFyZ2V0IHx8ICFpc1RleHRJbnB1dChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkpIHJldHVyblxuXHRpZiAodXBkYXRlSGFzRXh0ZXJuYWxLZXlib2FyZEFmdGVyRm9jdXNUaW1lb3V0KSB7XG5cdFx0d2luZG93LmNsZWFyVGltZW91dCh1cGRhdGVIYXNFeHRlcm5hbEtleWJvYXJkQWZ0ZXJGb2N1c1RpbWVvdXQpXG5cdFx0dXBkYXRlSGFzRXh0ZXJuYWxLZXlib2FyZEFmdGVyRm9jdXNUaW1lb3V0ID0gdW5kZWZpbmVkXG5cdH1cblx0aWYgKHNjcm9sbFRvRWxlbWVudEFmdGVyRm9jdXNUaW1lb3V0KSB7XG5cdFx0d2luZG93LmNsZWFyVGltZW91dChzY3JvbGxUb0VsZW1lbnRBZnRlckZvY3VzVGltZW91dClcblx0XHRzY3JvbGxUb0VsZW1lbnRBZnRlckZvY3VzVGltZW91dCA9IHVuZGVmaW5lZFxuXHR9XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIGRldmljZSBpcyB1c2luZyBhbiBleHRlcm5hbCBrZXlib2FyZCBieSBhcHBlbmRpbmcgYW4gYGlucHV0YCBhbmQgZm9jdXNpbmcgaXQuXG4gKlxuICogVGhpcyB3aWxsIHRyaWdnZXIgdGhlIGBvbkZvY3VzSW5gIGV2ZW50IGhhbmRsZXIsIHdoaWNoIHVwZGF0ZXMgdGhlIGBoYXNFeHRlcm5hbEtleWJvYXJkYCBnbG9iYWwuXG4gKi9cbmNvbnN0IGNoZWNrRm9yRXh0ZXJuYWxLZXlib2FyZCA9ICgpID0+IHtcblx0Y29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpXG5cdGVsLnR5cGUgPSAndGV4dCdcblx0ZWwuYXV0b2ZvY3VzID0gdHJ1ZVxuXHRlbC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c2luJywgKCkgPT4ge1xuXHRcdC8vIHJlbW92ZSB0aGUgaW5wdXQgYWZ0ZXIgdGhlIGtleWJvYXJkIGhhcyBkaXNwbGF5ZWQsIHBsdXMgYSBzbWFsbCBidWZmZXJcblx0XHR3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRlbC5ibHVyKClcblx0XHRcdGVsLnJlbW92ZSgpXG5cdFx0fSwgS0VZQk9BUkRfQU5JTUFUSU9OX01TICsgMTAwKVxuXHR9KVxuXHRkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXBwZW5kKGVsKVxufVxuXG5leHBvcnQgY29uc3Qgc2V0dXBNb2JpbGVFdmVudExpc3RlbmVycyA9ICgpID0+IHtcblx0aWYgKCFpc01vYmlsZURldmljZSgpIHx8ICF2aXN1YWxWaWV3cG9ydCkgcmV0dXJuXG5cblx0Ly8gc2V0IHZpZXdwb3J0IGhlaWdodCB2YXIgYXQgc2V0dXBcblx0c2V0VmlzdWFsVmlld3BvcnRIZWlnaHRWYXIoKVxuXG5cdC8vIGFkZCBldmVudCBsaXN0ZW5lcnNcblx0dmlzdWFsVmlld3BvcnQuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgKCkgPT4ge1xuXHRcdHNldFZpc3VhbFZpZXdwb3J0SGVpZ2h0VmFyKClcblxuXHRcdC8vIGtlZXAgdGhlIGRvY3VtZW50IGVsZW1lbnQgc2Nyb2xsZWQgdG8gdGhlIHRvcCBpZiBhIFJlYWN0TW9kYWwgaXMgb3BlblxuXHRcdGlmIChkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5jb250YWlucygnUmVhY3RNb2RhbF9fQm9keS0tb3BlbicpKSB7XG5cdFx0XHRkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wID0gMFxuXHRcdH1cblx0fSlcblx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCBvbkZvY3VzSW4pXG5cdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIG9uRm9jdXNPdXQpXG5cblx0Ly8gY2hlY2sgZm9yIGV4dGVybmFsIGtleWJvYXJkIGF0IHNldHVwXG5cdGNoZWNrRm9yRXh0ZXJuYWxLZXlib2FyZCgpXG59XG4iXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFNBQVMsUUFBUSxVQUFVO0FBRXBDLE1BQU1DLHFCQUFxQixHQUFHLEdBQUc7O0FBRWpDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLE1BQU1DLDZCQUE2QixHQUFJQyxPQUFvQixJQUFLO0VBQ3RFLElBQUlDLEtBQUssR0FBR0MsZ0JBQWdCLENBQUNGLE9BQU8sQ0FBQztFQUNyQyxNQUFNRyxtQkFBbUIsR0FBR0YsS0FBSyxDQUFDRyxRQUFRLEtBQUssVUFBVTtFQUN6RCxNQUFNQyxhQUFhLEdBQUcsc0JBQXNCO0VBRTVDLEtBQUssSUFBSUMsTUFBMEIsR0FBR04sT0FBTyxFQUFHTSxNQUFNLEdBQUdBLE1BQU0sQ0FBQ0MsYUFBYSxHQUFLO0lBQ2pGTixLQUFLLEdBQUdDLGdCQUFnQixDQUFDSSxNQUFNLENBQUM7SUFDaEMsSUFBSUgsbUJBQW1CLElBQUlGLEtBQUssQ0FBQ0csUUFBUSxLQUFLLFFBQVEsRUFBRTtJQUN4RCxJQUFJQyxhQUFhLENBQUNHLElBQUksQ0FBQ1AsS0FBSyxDQUFDUSxRQUFR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
|
|
@@ -1,8 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const getDomainIdentifierTypeString = () => (0, shard_1.isPurdueShard)() ? 'Purdue career account alias or PUID' : 'Email Address';
|
|
6
|
-
exports.getDomainIdentifierTypeString = getDomainIdentifierTypeString;
|
|
7
|
-
const getDomainIdentifierTypePluralString = () => (0, shard_1.isPurdueShard)() ? 'Purdue career account aliases or PUIDs' : 'Email Addresses';
|
|
8
|
-
exports.getDomainIdentifierTypePluralString = getDomainIdentifierTypePluralString;
|
|
1
|
+
import { isPurdueShard } from './shard';
|
|
2
|
+
export const getDomainIdentifierTypeString = () => isPurdueShard() ? 'Purdue career account alias or PUID' : 'Email Address';
|
|
3
|
+
export const getDomainIdentifierTypePluralString = () => isPurdueShard() ? 'Purdue career account aliases or PUIDs' : 'Email Addresses';
|
|
4
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJpc1B1cmR1ZVNoYXJkIiwiZ2V0RG9tYWluSWRlbnRpZmllclR5cGVTdHJpbmciLCJnZXREb21haW5JZGVudGlmaWVyVHlwZVBsdXJhbFN0cmluZyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9kb21haW5JZGVudGlmaWVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzUHVyZHVlU2hhcmQgfSBmcm9tICcuL3NoYXJkJ1xuXG5leHBvcnQgY29uc3QgZ2V0RG9tYWluSWRlbnRpZmllclR5cGVTdHJpbmcgPSAoKSA9PlxuXHRpc1B1cmR1ZVNoYXJkKCkgPyAnUHVyZHVlIGNhcmVlciBhY2NvdW50IGFsaWFzIG9yIFBVSUQnIDogJ0VtYWlsIEFkZHJlc3MnXG5cbmV4cG9ydCBjb25zdCBnZXREb21haW5JZGVudGlmaWVyVHlwZVBsdXJhbFN0cmluZyA9ICgpID0+XG5cdGlzUHVyZHVlU2hhcmQoKSA/ICdQdXJkdWUgY2FyZWVyIGFjY291bnQgYWxpYXNlcyBvciBQVUlEcycgOiAnRW1haWwgQWRkcmVzc2VzJ1xuIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxhQUFhLFFBQVEsU0FBUztBQUV2QyxPQUFPLE1BQU1DLDZCQUE2QixHQUFHQSxDQUFBLEtBQzVDRCxhQUFhLENBQUMsQ0FBQyxHQUFHLHFDQUFxQyxHQUFHLGVBQWU7QUFFMUUsT0FBTyxNQUFNRSxtQ0FBbUMsR0FBR0EsQ0FBQSxLQUNsREYsYUFBYSxDQUFDLENBQUMsR0FBRyx3Q0FBd0MsR0FBRyxpQkFBaUIiLCJpZ25vcmVMaXN0IjpbXX0=
|
|
@@ -1,5 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.getRootModelName = void 0;
|
|
4
|
-
const getRootModelName = (props) => props.modelName.split('.').slice(0, -1).join('.');
|
|
5
|
-
exports.getRootModelName = getRootModelName;
|
|
1
|
+
export const getRootModelName = props => props.modelName.split('.').slice(0, -1).join('.');
|
|
2
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJnZXRSb290TW9kZWxOYW1lIiwicHJvcHMiLCJtb2RlbE5hbWUiLCJzcGxpdCIsInNsaWNlIiwiam9pbiJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9lbnRpdHlVc2VyUm9sZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgZ2V0Um9vdE1vZGVsTmFtZSA9IChwcm9wczogeyBtb2RlbE5hbWU6IHN0cmluZyB9KSA9PiBwcm9wcy5tb2RlbE5hbWUuc3BsaXQoJy4nKS5zbGljZSgwLCAtMSkuam9pbignLicpXG4iXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sTUFBTUEsZ0JBQWdCLEdBQUlDLEtBQTRCLElBQUtBLEtBQUssQ0FBQ0MsU0FBUyxDQUFDQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUNDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQ0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyIsImlnbm9yZUxpc3QiOltdfQ==
|
package/lib/utils/error.js
CHANGED
|
@@ -1,20 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
error.
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
}
|
|
15
|
-
else if (caughtError && typeof caughtError === 'object') {
|
|
16
|
-
error.message += `${message ? '.\n' : ''}${JSON.stringify(caughtError)}`;
|
|
17
|
-
}
|
|
18
|
-
return error;
|
|
1
|
+
export const constructErrorFromCaughtError = (caughtError, name, message) => {
|
|
2
|
+
const error = new Error(message);
|
|
3
|
+
error.name = name;
|
|
4
|
+
if (caughtError instanceof Error) {
|
|
5
|
+
error.message += `${message ? '.\n' : ''}${caughtError.name !== 'Error' ? `${caughtError.name}: ` : ''}${caughtError.message}`;
|
|
6
|
+
error.stack = caughtError.stack;
|
|
7
|
+
// TODO: use `new Error(message, { cause: caughtError })` once we upgrade TS to allow es2022
|
|
8
|
+
} else if (typeof caughtError === 'string') {
|
|
9
|
+
error.message += `${message ? '.\n' : ''}${caughtError}`;
|
|
10
|
+
} else if (caughtError && typeof caughtError === 'object') {
|
|
11
|
+
error.message += `${message ? '.\n' : ''}${JSON.stringify(caughtError)}`;
|
|
12
|
+
}
|
|
13
|
+
return error;
|
|
19
14
|
};
|
|
20
|
-
|
|
15
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb25zdHJ1Y3RFcnJvckZyb21DYXVnaHRFcnJvciIsImNhdWdodEVycm9yIiwibmFtZSIsIm1lc3NhZ2UiLCJlcnJvciIsIkVycm9yIiwic3RhY2siLCJKU09OIiwic3RyaW5naWZ5Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2Vycm9yLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBjb25zdHJ1Y3RFcnJvckZyb21DYXVnaHRFcnJvciA9IChjYXVnaHRFcnJvcjogdW5rbm93biwgbmFtZTogc3RyaW5nLCBtZXNzYWdlPzogc3RyaW5nKSA9PiB7XG5cdGNvbnN0IGVycm9yID0gbmV3IEVycm9yKG1lc3NhZ2UpXG5cdGVycm9yLm5hbWUgPSBuYW1lXG5cdGlmIChjYXVnaHRFcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG5cdFx0ZXJyb3IubWVzc2FnZSArPSBgJHttZXNzYWdlID8gJy5cXG4nIDogJyd9JHtjYXVnaHRFcnJvci5uYW1lICE9PSAnRXJyb3InID8gYCR7Y2F1Z2h0RXJyb3IubmFtZX06IGAgOiAnJ30ke1xuXHRcdFx0Y2F1Z2h0RXJyb3IubWVzc2FnZVxuXHRcdH1gXG5cdFx0ZXJyb3Iuc3RhY2sgPSBjYXVnaHRFcnJvci5zdGFja1xuXHRcdC8vIFRPRE86IHVzZSBgbmV3IEVycm9yKG1lc3NhZ2UsIHsgY2F1c2U6IGNhdWdodEVycm9yIH0pYCBvbmNlIHdlIHVwZ3JhZGUgVFMgdG8gYWxsb3cgZXMyMDIyXG5cdH0gZWxzZSBpZiAodHlwZW9mIGNhdWdodEVycm9yID09PSAnc3RyaW5nJykge1xuXHRcdGVycm9yLm1lc3NhZ2UgKz0gYCR7bWVzc2FnZSA/ICcuXFxuJyA6ICcnfSR7Y2F1Z2h0RXJyb3J9YFxuXHR9IGVsc2UgaWYgKGNhdWdodEVycm9yICYmIHR5cGVvZiBjYXVnaHRFcnJvciA9PT0gJ29iamVjdCcpIHtcblx0XHRlcnJvci5tZXNzYWdlICs9IGAke21lc3NhZ2UgPyAnLlxcbicgOiAnJ30ke0pTT04uc3RyaW5naWZ5KGNhdWdodEVycm9yKX1gXG5cdH1cblx0cmV0dXJuIGVycm9yXG59XG4iXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sTUFBTUEsNkJBQTZCLEdBQUdBLENBQUNDLFdBQW9CLEVBQUVDLElBQVksRUFBRUMsT0FBZ0IsS0FBSztFQUN0RyxNQUFNQyxLQUFLLEdBQUcsSUFBSUMsS0FBSyxDQUFDRixPQUFPLENBQUM7RUFDaENDLEtBQUssQ0FBQ0YsSUFBSSxHQUFHQSxJQUFJO0VBQ2pCLElBQUlELFdBQVcsWUFBWUksS0FBSyxFQUFFO0lBQ2pDRCxLQUFLLENBQUNELE9BQU8sSUFBSSxHQUFHQSxPQUFPLEdBQUcsS0FBSyxHQUFHLEVBQUUsR0FBR0YsV0FBVyxDQUFDQyxJQUFJLEtBQUssT0FBTyxHQUFHLEdBQUdELFdBQVcsQ0FBQ0MsSUFBSSxJQUFJLEdBQUcsRUFBRSxHQUNyR0QsV0FBVyxDQUFDRSxPQUFPLEVBQ2xCO0lBQ0ZDLEtBQUssQ0FBQ0UsS0FBSyxHQUFHTCxXQUFXLENBQUNLLEtBQUs7SUFDL0I7RUFDRCxDQUFDLE1BQU0sSUFBSSxPQUFPTCxXQUFXLEtBQUssUUFBUSxFQUFFO0lBQzNDRyxLQUFLLENBQUNELE9BQU8sSUFBSSxHQUFHQSxPQUFPLEdBQUcsS0FBSyxHQUFHLEVBQUUsR0FBR0YsV0FBVyxFQUFFO0VBQ3pELENBQUMsTUFBTSxJQUFJQSxXQUFXLElBQUksT0FBT0EsV0FBVyxLQUFLLFFBQVEsRUFBRTtJQUMxREcsS0FBSyxDQUFDRCxPQUFPLElBQUksR0FBR0EsT0FBTyxHQUFHLEtBQUssR0FBRyxFQUFFLEdBQUdJLElBQUksQ0FBQ0MsU0FBUyxDQUFDUCxXQUFXLENBQUMsRUFBRTtFQUN6RTtFQUNBLE9BQU9HLEtBQUs7QUFDYixDQUFDIiwiaWdub3JlTGlzdCI6W119
|
package/lib/utils/events.js
CHANGED
|
@@ -1,36 +1,37 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.trackCustomEvent = void 0;
|
|
4
|
-
const tslib_1 = require("tslib");
|
|
5
|
-
const react_ga4_1 = tslib_1.__importDefault(require("react-ga4"));
|
|
6
|
-
const constants_1 = require("../constants");
|
|
1
|
+
import ga from 'react-ga4';
|
|
2
|
+
import { getAppConfig, getAppInsights, getUserId } from '../constants';
|
|
7
3
|
/**
|
|
8
4
|
* Send an event to Google Analytics and App Insights
|
|
9
5
|
* @param event
|
|
10
6
|
*/
|
|
11
|
-
const trackCustomEvent =
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
7
|
+
export const trackCustomEvent = event => {
|
|
8
|
+
const {
|
|
9
|
+
eventName,
|
|
10
|
+
category,
|
|
11
|
+
action,
|
|
12
|
+
label
|
|
13
|
+
} = event;
|
|
14
|
+
const userId = getUserId();
|
|
15
|
+
const appConfig = getAppConfig();
|
|
16
|
+
if (appConfig.GOOGLE_ANALYTICS_TRACKING_ID) {
|
|
17
|
+
ga.event(eventName, {
|
|
18
|
+
event_category: category,
|
|
19
|
+
action: action,
|
|
20
|
+
event_label: label,
|
|
21
|
+
user_id: userId
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
if (appConfig.APP_INSIGHTS_CONNECTION_STRING) {
|
|
25
|
+
const appInsights = getAppInsights();
|
|
26
|
+
appInsights.trackEvent({
|
|
27
|
+
name: eventName,
|
|
28
|
+
properties: {
|
|
29
|
+
category: category,
|
|
30
|
+
action: action,
|
|
31
|
+
label: label,
|
|
32
|
+
userId: userId
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
}
|
|
35
36
|
};
|
|
36
|
-
|
|
37
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJnYSIsImdldEFwcENvbmZpZyIsImdldEFwcEluc2lnaHRzIiwiZ2V0VXNlcklkIiwidHJhY2tDdXN0b21FdmVudCIsImV2ZW50IiwiZXZlbnROYW1lIiwiY2F0ZWdvcnkiLCJhY3Rpb24iLCJsYWJlbCIsInVzZXJJZCIsImFwcENvbmZpZyIsIkdPT0dMRV9BTkFMWVRJQ1NfVFJBQ0tJTkdfSUQiLCJldmVudF9jYXRlZ29yeSIsImV2ZW50X2xhYmVsIiwidXNlcl9pZCIsIkFQUF9JTlNJR0hUU19DT05ORUNUSU9OX1NUUklORyIsImFwcEluc2lnaHRzIiwidHJhY2tFdmVudCIsIm5hbWUiLCJwcm9wZXJ0aWVzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2V2ZW50cy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZ2EgZnJvbSAncmVhY3QtZ2E0J1xuaW1wb3J0IHsgZ2V0QXBwQ29uZmlnLCBnZXRBcHBJbnNpZ2h0cywgZ2V0VXNlcklkIH0gZnJvbSAnLi4vY29uc3RhbnRzJ1xuaW1wb3J0IHsgQ3VzdG9tRXZlbnQgfSBmcm9tICcuLi90eXBlcy9FdmVudCdcblxuLyoqXG4gKiBTZW5kIGFuIGV2ZW50IHRvIEdvb2dsZSBBbmFseXRpY3MgYW5kIEFwcCBJbnNpZ2h0c1xuICogQHBhcmFtIGV2ZW50XG4gKi9cbmV4cG9ydCBjb25zdCB0cmFja0N1c3RvbUV2ZW50ID0gKGV2ZW50OiBDdXN0b21FdmVudCkgPT4ge1xuXHRjb25zdCB7IGV2ZW50TmFtZSwgY2F0ZWdvcnksIGFjdGlvbiwgbGFiZWwgfSA9IGV2ZW50XG5cdGNvbnN0IHVzZXJJZCA9IGdldFVzZXJJZCgpXG5cdGNvbnN0IGFwcENvbmZpZyA9IGdldEFwcENvbmZpZygpXG5cdGlmIChhcHBDb25maWcuR09PR0xFX0FOQUxZVElDU19UUkFDS0lOR19JRCkge1xuXHRcdGdhLmV2ZW50KGV2ZW50TmFtZSwge1xuXHRcdFx0ZXZlbnRfY2F0ZWdvcnk6IGNhdGVnb3J5LFxuXHRcdFx0YWN0aW9uOiBhY3Rpb24sXG5cdFx0XHRldmVudF9sYWJlbDogbGFiZWwsXG5cdFx0XHR1c2VyX2lkOiB1c2VySWRcblx0XHR9KVxuXHR9XG5cdGlmIChhcHBDb25maWcuQVBQX0lOU0lHSFRTX0NPTk5FQ1RJT05fU1RSSU5HKSB7XG5cdFx0Y29uc3QgYXBwSW5zaWdodHMgPSBnZXRBcHBJbnNpZ2h0cygpXG5cdFx0YXBwSW5zaWdodHMudHJhY2tFdmVudCh7XG5cdFx0XHRuYW1lOiBldmVudE5hbWUsXG5cdFx0XHRwcm9wZXJ0aWVzOiB7XG5cdFx0XHRcdGNhdGVnb3J5OiBjYXRlZ29yeSxcblx0XHRcdFx0YWN0aW9uOiBhY3Rpb24sXG5cdFx0XHRcdGxhYmVsOiBsYWJlbCxcblx0XHRcdFx0dXNlcklkOiB1c2VySWRcblx0XHRcdH1cblx0XHR9KVxuXHR9XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLEVBQUUsTUFBTSxXQUFXO0FBQzFCLFNBQVNDLFlBQVksRUFBRUMsY0FBYyxFQUFFQyxTQUFTLFFBQVEsY0FBYztBQUd0RTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sTUFBTUMsZ0JBQWdCLEdBQUlDLEtBQWtCLElBQUs7RUFDdkQsTUFBTTtJQUFFQyxTQUFTO0lBQUVDLFFBQVE7SUFBRUMsTUFBTTtJQUFFQztFQUFNLENBQUMsR0FBR0osS0FBSztFQUNwRCxNQUFNSyxNQUFNLEdBQUdQLFNBQVMsQ0FBQyxDQUFDO0VBQzFCLE1BQU1RLFNBQVMsR0FBR1YsWUFBWSxDQUFDLENBQUM7RUFDaEMsSUFBSVUsU0FBUyxDQUFDQyw0QkFBNEIsRUFBRTtJQUMzQ1osRUFBRSxDQUFDSyxLQUFLLENBQUNDLFNBQVMsRUFBRTtNQUNuQk8sY0FBYyxFQUFFTixRQUFRO01BQ3hCQyxNQUFNLEVBQUVBLE1BQU07TUFDZE0sV0FBVyxFQUFFTCxLQUFLO01BQ2xCTSxPQUFPLEVBQUVMO0lBQ1YsQ0FBQyxDQUFDO0VBQ0g7RUFDQSxJQUFJQyxTQUFTLENBQUNLLDhCQUE4QixFQUFFO0lBQzdDLE1BQU1DLFdBQVcsR0FBR2YsY0FBYyxDQUFDLENBQUM7SUFDcENlLFdBQVcsQ0FBQ0MsVUFBVSxDQUFDO01BQ3RCQyxJQUFJLEVBQUViLFNBQVM7TUFDZmMsVUFBVSxFQUFFO1FBQ1hiLFFBQVEsRUFBRUEsUUFBUTtRQUNsQkMsTUFBTSxFQUFFQSxNQUFNO1FBQ2RDLEtBQUssRUFBRUEsS0FBSztRQUNaQyxNQUFNLEVBQUVBO01BQ1Q7SUFDRCxDQUFDLENBQUM7RUFDSDtBQUNELENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=
|
|
@@ -1,28 +1,23 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
return false;
|
|
9
|
-
}
|
|
10
|
-
return externalGroups.some(eg => eg.externalProviderId === uniTimeExternalProvider.id);
|
|
1
|
+
import { EXTERNAL_PROVIDER_TYPE } from '../constants/externalProviderType';
|
|
2
|
+
export const hasAnyUniTimeExternalGroup = (externalGroups, externalProviders) => {
|
|
3
|
+
const uniTimeExternalProvider = externalProviders.find(ep => ep.typename === EXTERNAL_PROVIDER_TYPE.UNITIME);
|
|
4
|
+
if (!uniTimeExternalProvider) {
|
|
5
|
+
return false;
|
|
6
|
+
}
|
|
7
|
+
return externalGroups.some(eg => eg.externalProviderId === uniTimeExternalProvider.id);
|
|
11
8
|
};
|
|
12
|
-
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
return externalGroups.some(eg => eg.externalProviderId === ltiExternalProvider.id);
|
|
9
|
+
export const hasAnyLtiExternalGroup = (externalGroups, externalProviders) => {
|
|
10
|
+
const ltiExternalProvider = externalProviders.find(ep => ep.typename === EXTERNAL_PROVIDER_TYPE.LTI);
|
|
11
|
+
if (!ltiExternalProvider) {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
return externalGroups.some(eg => eg.externalProviderId === ltiExternalProvider.id);
|
|
19
15
|
};
|
|
20
|
-
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
return externalGroups.some(eg => eg.externalProviderId === ltiExternalProvider.id && !!eg.gradesUrl);
|
|
16
|
+
export const hasGradePushEnabled = (externalGroups, externalProviders) => {
|
|
17
|
+
const ltiExternalProvider = externalProviders.find(ep => ep.gradePushEnabled);
|
|
18
|
+
if (!ltiExternalProvider) {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
return externalGroups.some(eg => eg.externalProviderId === ltiExternalProvider.id && !!eg.gradesUrl);
|
|
27
22
|
};
|
|
28
|
-
|
|
23
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFWFRFUk5BTF9QUk9WSURFUl9UWVBFIiwiaGFzQW55VW5pVGltZUV4dGVybmFsR3JvdXAiLCJleHRlcm5hbEdyb3VwcyIsImV4dGVybmFsUHJvdmlkZXJzIiwidW5pVGltZUV4dGVybmFsUHJvdmlkZXIiLCJmaW5kIiwiZXAiLCJ0eXBlbmFtZSIsIlVOSVRJTUUiLCJzb21lIiwiZWciLCJleHRlcm5hbFByb3ZpZGVySWQiLCJpZCIsImhhc0FueUx0aUV4dGVybmFsR3JvdXAiLCJsdGlFeHRlcm5hbFByb3ZpZGVyIiwiTFRJIiwiaGFzR3JhZGVQdXNoRW5hYmxlZCIsImdyYWRlUHVzaEVuYWJsZWQiLCJncmFkZXNVcmwiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvZXh0ZXJuYWxHcm91cC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFWFRFUk5BTF9QUk9WSURFUl9UWVBFIH0gZnJvbSAnLi4vY29uc3RhbnRzL2V4dGVybmFsUHJvdmlkZXJUeXBlJ1xuaW1wb3J0IHsgRXh0ZXJuYWxHcm91cCB9IGZyb20gJy4uL3R5cGVzL0V4dGVybmFsR3JvdXAnXG5pbXBvcnQgeyBFeHRlcm5hbFByb3ZpZGVyIH0gZnJvbSAnLi4vdHlwZXMvRXh0ZXJuYWxQcm92aWRlcidcblxuZXhwb3J0IGNvbnN0IGhhc0FueVVuaVRpbWVFeHRlcm5hbEdyb3VwID0gKGV4dGVybmFsR3JvdXBzOiBFeHRlcm5hbEdyb3VwW10sIGV4dGVybmFsUHJvdmlkZXJzOiBFeHRlcm5hbFByb3ZpZGVyW10pID0+IHtcblx0Y29uc3QgdW5pVGltZUV4dGVybmFsUHJvdmlkZXIgPSBleHRlcm5hbFByb3ZpZGVycy5maW5kKGVwID0+IGVwLnR5cGVuYW1lID09PSBFWFRFUk5BTF9QUk9WSURFUl9UWVBFLlVOSVRJTUUpXG5cblx0aWYgKCF1bmlUaW1lRXh0ZXJuYWxQcm92aWRlcikge1xuXHRcdHJldHVybiBmYWxzZVxuXHR9XG5cblx0cmV0dXJuIGV4dGVybmFsR3JvdXBzLnNvbWUoZWcgPT4gZWcuZXh0ZXJuYWxQcm92aWRlcklkID09PSB1bmlUaW1lRXh0ZXJuYWxQcm92aWRlci5pZClcbn1cblxuZXhwb3J0IGNvbnN0IGhhc0FueUx0aUV4dGVybmFsR3JvdXAgPSAoZXh0ZXJuYWxHcm91cHM6IEV4dGVybmFsR3JvdXBbXSwgZXh0ZXJuYWxQcm92aWRlcnM6IEV4dGVybmFsUHJvdmlkZXJbXSkgPT4ge1xuXHRjb25zdCBsdGlFeHRlcm5hbFByb3ZpZGVyID0gZXh0ZXJuYWxQcm92aWRlcnMuZmluZChlcCA9PiBlcC50eXBlbmFtZSA9PT0gRVhURVJOQUxfUFJPVklERVJfVFlQRS5MVEkpXG5cblx0aWYgKCFsdGlFeHRlcm5hbFByb3ZpZGVyKSB7XG5cdFx0cmV0dXJuIGZhbHNlXG5cdH1cblxuXHRyZXR1cm4gZXh0ZXJuYWxHcm91cHMuc29tZShlZyA9PiBlZy5leHRlcm5hbFByb3ZpZGVySWQgPT09IGx0aUV4dGVybmFsUHJvdmlkZXIuaWQpXG59XG5cbmV4cG9ydCBjb25zdCBoYXNHcmFkZVB1c2hFbmFibGVkID0gKGV4dGVybmFsR3JvdXBzOiBFeHRlcm5hbEdyb3VwW10sIGV4dGVybmFsUHJvdmlkZXJzOiBFeHRlcm5hbFByb3ZpZGVyW10pID0+IHtcblx0Y29uc3QgbHRpRXh0ZXJuYWxQcm92aWRlciA9IGV4dGVybmFsUHJvdmlkZXJzLmZpbmQoZXAgPT4gZXAuZ3JhZGVQdXNoRW5hYmxlZClcblxuXHRpZiAoIWx0aUV4dGVybmFsUHJvdmlkZXIpIHtcblx0XHRyZXR1cm4gZmFsc2Vcblx0fVxuXG5cdHJldHVybiBleHRlcm5hbEdyb3Vwcy5zb21lKGVnID0+IGVnLmV4dGVybmFsUHJvdmlkZXJJZCA9PT0gbHRpRXh0ZXJuYWxQcm92aWRlci5pZCAmJiAhIWVnLmdyYWRlc1VybClcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0Esc0JBQXNCLFFBQVEsbUNBQW1DO0FBSTFFLE9BQU8sTUFBTUMsMEJBQTBCLEdBQUdBLENBQUNDLGNBQStCLEVBQUVDLGlCQUFxQyxLQUFLO0VBQ3JILE1BQU1DLHVCQUF1QixHQUFHRCxpQkFBaUIsQ0FBQ0UsSUFBSSxDQUFDQyxFQUFFLElBQUlBLEVBQUUsQ0FBQ0MsUUFBUSxLQUFLUCxzQkFBc0IsQ0FBQ1EsT0FBTyxDQUFDO0VBRTVHLElBQUksQ0FBQ0osdUJBQXVCLEVBQUU7SUFDN0IsT0FBTyxLQUFLO0VBQ2I7RUFFQSxPQUFPRixjQUFjLENBQUNPLElBQUksQ0FBQ0MsRUFBRSxJQUFJQSxFQUFFLENBQUNDLGtCQUFrQixLQUFLUCx1QkFBdUIsQ0FBQ1EsRUFBRSxDQUFDO0FBQ3ZGLENBQUM7QUFFRCxPQUFPLE1BQU1DLHNCQUFzQixHQUFHQSxDQUFDWCxjQUErQixFQUFFQyxpQkFBcUMsS0FBSztFQUNqSCxNQUFNVyxtQkFBbUIsR0FBR1gsaUJBQWlCLENBQUNFLElBQUksQ0FBQ0MsRUFBRSxJQUFJQSxFQUFFLENBQUNDLFFBQVEsS0FBS1Asc0JBQXNCLENBQUNlLEdBQUcsQ0FBQztFQUVwRyxJQUFJLENBQUNELG1CQUFtQixFQUFFO0lBQ3pCLE9BQU8sS0FBSztFQUNiO0VBRUEsT0FBT1osY0FBYyxDQUFDTyxJQUFJLENBQUNDLEVBQUUsSUFBSUEsRUFBRSxDQUFDQyxrQkFBa0IsS0FBS0csbUJBQW1CLENBQUNGLEVBQUUsQ0FBQztBQUNuRixDQUFDO0FBRUQsT0FBTyxNQUFNSSxtQkFBbUIsR0FBR0EsQ0FBQ2QsY0FBK0IsRUFBRUMsaUJBQXFDLEtBQUs7RUFDOUcsTUFBTVcsbUJBQW1CLEdBQUdYLGlCQUFpQixDQUFDRSxJQUFJLENBQUNDLEVBQUUsSUFBSUEsRUFBRSxDQUFDVyxnQkFBZ0IsQ0FBQztFQUU3RSxJQUFJLENBQUNILG1CQUFtQixFQUFFO0lBQ3pCLE9BQU8sS0FBSztFQUNiO0VBRUEsT0FBT1osY0FBYyxDQUFDTyxJQUFJLENBQUNDLEVBQUUsSUFBSUEsRUFBRSxDQUFDQyxrQkFBa0IsS0FBS0csbUJBQW1CLENBQUNGLEVBQUUsSUFBSSxDQUFDLENBQUNGLEVBQUUsQ0FBQ1EsU0FBUyxDQUFDO0FBQ3JHLENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const externalProviderType_1 = require("../constants/externalProviderType");
|
|
5
|
-
const shouldDisplayCreateNonLtiGroupAlert = (externalProviders) => {
|
|
6
|
-
return externalProviders.some(ep => ep.typename === externalProviderType_1.EXTERNAL_PROVIDER_TYPE.LTI && ep.shouldDisplayCreateNonLtiGroupAlert);
|
|
1
|
+
import { EXTERNAL_PROVIDER_TYPE } from '../constants/externalProviderType';
|
|
2
|
+
export const shouldDisplayCreateNonLtiGroupAlert = externalProviders => {
|
|
3
|
+
return externalProviders.some(ep => ep.typename === EXTERNAL_PROVIDER_TYPE.LTI && ep.shouldDisplayCreateNonLtiGroupAlert);
|
|
7
4
|
};
|
|
8
|
-
|
|
5
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFWFRFUk5BTF9QUk9WSURFUl9UWVBFIiwic2hvdWxkRGlzcGxheUNyZWF0ZU5vbkx0aUdyb3VwQWxlcnQiLCJleHRlcm5hbFByb3ZpZGVycyIsInNvbWUiLCJlcCIsInR5cGVuYW1lIiwiTFRJIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2V4dGVybmFsUHJvdmlkZXJzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVYVEVSTkFMX1BST1ZJREVSX1RZUEUgfSBmcm9tICcuLi9jb25zdGFudHMvZXh0ZXJuYWxQcm92aWRlclR5cGUnXG5pbXBvcnQgeyBFeHRlcm5hbFByb3ZpZGVyIH0gZnJvbSAnLi4vdHlwZXMvRXh0ZXJuYWxQcm92aWRlcidcblxuZXhwb3J0IGNvbnN0IHNob3VsZERpc3BsYXlDcmVhdGVOb25MdGlHcm91cEFsZXJ0ID0gKGV4dGVybmFsUHJvdmlkZXJzOiBFeHRlcm5hbFByb3ZpZGVyW10pID0+IHtcblx0cmV0dXJuIGV4dGVybmFsUHJvdmlkZXJzLnNvbWUoXG5cdFx0ZXAgPT4gZXAudHlwZW5hbWUgPT09IEVYVEVSTkFMX1BST1ZJREVSX1RZUEUuTFRJICYmIGVwLnNob3VsZERpc3BsYXlDcmVhdGVOb25MdGlHcm91cEFsZXJ0XG5cdClcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0Esc0JBQXNCLFFBQVEsbUNBQW1DO0FBRzFFLE9BQU8sTUFBTUMsbUNBQW1DLEdBQUlDLGlCQUFxQyxJQUFLO0VBQzdGLE9BQU9BLGlCQUFpQixDQUFDQyxJQUFJLENBQzVCQyxFQUFFLElBQUlBLEVBQUUsQ0FBQ0MsUUFBUSxLQUFLTCxzQkFBc0IsQ0FBQ00sR0FBRyxJQUFJRixFQUFFLENBQUNILG1DQUN4RCxDQUFDO0FBQ0YsQ0FBQyIsImlnbm9yZUxpc3QiOltdfQ==
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import { getServerNowUtc, isNowBeforeDate } from '../utils/date';
|
|
2
|
+
export const filterByCurrentAndFuture = function (externalTerms) {
|
|
3
|
+
let nowUtc = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getServerNowUtc().toISOString();
|
|
4
|
+
return externalTerms.filter(et => isNowBeforeDate(et.endDate, nowUtc));
|
|
5
|
+
};
|
|
6
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJnZXRTZXJ2ZXJOb3dVdGMiLCJpc05vd0JlZm9yZURhdGUiLCJmaWx0ZXJCeUN1cnJlbnRBbmRGdXR1cmUiLCJleHRlcm5hbFRlcm1zIiwibm93VXRjIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwidG9JU09TdHJpbmciLCJmaWx0ZXIiLCJldCIsImVuZERhdGUiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvZXh0ZXJuYWxUZXJtcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFeHRlcm5hbFRlcm0gfSBmcm9tICcuLi90eXBlcy9FeHRlcm5hbFRlcm0nXG5pbXBvcnQgeyBnZXRTZXJ2ZXJOb3dVdGMsIGlzTm93QmVmb3JlRGF0ZSB9IGZyb20gJy4uL3V0aWxzL2RhdGUnXG5cbmV4cG9ydCBjb25zdCBmaWx0ZXJCeUN1cnJlbnRBbmRGdXR1cmUgPSAoZXh0ZXJuYWxUZXJtczogRXh0ZXJuYWxUZXJtW10sIG5vd1V0YyA9IGdldFNlcnZlck5vd1V0YygpLnRvSVNPU3RyaW5nKCkpID0+XG5cdGV4dGVybmFsVGVybXMuZmlsdGVyKGV0ID0+IGlzTm93QmVmb3JlRGF0ZShldC5lbmREYXRlLCBub3dVdGMpKVxuIl0sIm1hcHBpbmdzIjoiQUFDQSxTQUFTQSxlQUFlLEVBQUVDLGVBQWUsUUFBUSxlQUFlO0FBRWhFLE9BQU8sTUFBTUMsd0JBQXdCLEdBQUcsU0FBQUEsQ0FBQ0MsYUFBNkI7RUFBQSxJQUFFQyxNQUFNLEdBQUFDLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFFLFNBQUEsR0FBQUYsU0FBQSxNQUFHTCxlQUFlLENBQUMsQ0FBQyxDQUFDUSxXQUFXLENBQUMsQ0FBQztFQUFBLE9BQy9HTCxhQUFhLENBQUNNLE1BQU0sQ0FBQ0MsRUFBRSxJQUFJVCxlQUFlLENBQUNTLEVBQUUsQ0FBQ0MsT0FBTyxFQUFFUCxNQUFNLENBQUMsQ0FBQztBQUFBIiwiaWdub3JlTGlzdCI6W119
|