@pranaysahith/decap-cms-core 3.9.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/README.md +9 -0
- package/dist/@pranaysahith/decap-cms-core.js +52 -0
- package/dist/@pranaysahith/decap-cms-core.js.LICENSE.txt +141 -0
- package/dist/@pranaysahith/decap-cms-core.js.map +1 -0
- package/dist/decap-cms-core.js +47 -0
- package/dist/decap-cms-core.js.LICENSE.txt +116 -0
- package/dist/decap-cms-core.js.map +1 -0
- package/dist/esm/actions/auth.js +97 -0
- package/dist/esm/actions/collections.js +15 -0
- package/dist/esm/actions/config.js +493 -0
- package/dist/esm/actions/deploys.js +79 -0
- package/dist/esm/actions/editorialWorkflow.js +480 -0
- package/dist/esm/actions/entries.js +865 -0
- package/dist/esm/actions/media.js +147 -0
- package/dist/esm/actions/mediaLibrary.js +552 -0
- package/dist/esm/actions/notifications.js +21 -0
- package/dist/esm/actions/search.js +149 -0
- package/dist/esm/actions/status.js +74 -0
- package/dist/esm/actions/waitUntil.js +32 -0
- package/dist/esm/backend.js +1082 -0
- package/dist/esm/bootstrap.js +101 -0
- package/dist/esm/components/App/App.js +289 -0
- package/dist/esm/components/App/Header.js +172 -0
- package/dist/esm/components/App/NotFoundPage.js +19 -0
- package/dist/esm/components/Collection/Collection.js +198 -0
- package/dist/esm/components/Collection/CollectionControls.js +46 -0
- package/dist/esm/components/Collection/CollectionSearch.js +222 -0
- package/dist/esm/components/Collection/CollectionTop.js +68 -0
- package/dist/esm/components/Collection/ControlButton.js +17 -0
- package/dist/esm/components/Collection/Entries/Entries.js +73 -0
- package/dist/esm/components/Collection/Entries/EntriesCollection.js +241 -0
- package/dist/esm/components/Collection/Entries/EntriesSearch.js +113 -0
- package/dist/esm/components/Collection/Entries/EntryCard.js +177 -0
- package/dist/esm/components/Collection/Entries/EntryListing.js +143 -0
- package/dist/esm/components/Collection/FilterControl.js +33 -0
- package/dist/esm/components/Collection/FolderRenameControl.js +403 -0
- package/dist/esm/components/Collection/GroupControl.js +33 -0
- package/dist/esm/components/Collection/NestedCollection.js +308 -0
- package/dist/esm/components/Collection/Sidebar.js +91 -0
- package/dist/esm/components/Collection/SortControl.js +59 -0
- package/dist/esm/components/Collection/ViewStyleControl.js +38 -0
- package/dist/esm/components/Editor/Editor.js +466 -0
- package/dist/esm/components/Editor/EditorControlPane/EditorControl.js +395 -0
- package/dist/esm/components/Editor/EditorControlPane/EditorControlPane.js +254 -0
- package/dist/esm/components/Editor/EditorControlPane/Widget.js +374 -0
- package/dist/esm/components/Editor/EditorInterface.js +386 -0
- package/dist/esm/components/Editor/EditorPreviewPane/EditorPreview.js +47 -0
- package/dist/esm/components/Editor/EditorPreviewPane/EditorPreviewContent.js +66 -0
- package/dist/esm/components/Editor/EditorPreviewPane/EditorPreviewPane.js +288 -0
- package/dist/esm/components/Editor/EditorPreviewPane/PreviewHOC.js +27 -0
- package/dist/esm/components/Editor/EditorToolbar.js +536 -0
- package/dist/esm/components/Editor/EntryPathEditor.js +272 -0
- package/dist/esm/components/Editor/withWorkflow.js +56 -0
- package/dist/esm/components/EditorWidgets/Unknown/UnknownControl.js +18 -0
- package/dist/esm/components/EditorWidgets/Unknown/UnknownPreview.js +20 -0
- package/dist/esm/components/EditorWidgets/index.js +4 -0
- package/dist/esm/components/MediaLibrary/EmptyMessage.js +22 -0
- package/dist/esm/components/MediaLibrary/MediaLibrary.js +446 -0
- package/dist/esm/components/MediaLibrary/MediaLibraryButtons.js +93 -0
- package/dist/esm/components/MediaLibrary/MediaLibraryCard.js +99 -0
- package/dist/esm/components/MediaLibrary/MediaLibraryCardGrid.js +198 -0
- package/dist/esm/components/MediaLibrary/MediaLibraryHeader.js +32 -0
- package/dist/esm/components/MediaLibrary/MediaLibraryModal.js +156 -0
- package/dist/esm/components/MediaLibrary/MediaLibrarySearch.js +51 -0
- package/dist/esm/components/MediaLibrary/MediaLibraryTop.js +123 -0
- package/dist/esm/components/UI/DragDrop.js +67 -0
- package/dist/esm/components/UI/ErrorBoundary.js +173 -0
- package/dist/esm/components/UI/FileUploadButton.js +27 -0
- package/dist/esm/components/UI/Modal.js +104 -0
- package/dist/esm/components/UI/Notifications.js +62 -0
- package/dist/esm/components/UI/SettingsDropdown.js +107 -0
- package/dist/esm/components/UI/index.js +6 -0
- package/dist/esm/components/Workflow/Workflow.js +133 -0
- package/dist/esm/components/Workflow/WorkflowCard.js +128 -0
- package/dist/esm/components/Workflow/WorkflowList.js +204 -0
- package/dist/esm/constants/collectionTypes.js +2 -0
- package/dist/esm/constants/collectionViews.js +2 -0
- package/dist/esm/constants/commitProps.js +2 -0
- package/dist/esm/constants/configSchema.js +644 -0
- package/dist/esm/constants/fieldInference.js +57 -0
- package/dist/esm/constants/publishModes.js +18 -0
- package/dist/esm/constants/validationErrorTypes.js +6 -0
- package/dist/esm/formats/formats.js +83 -0
- package/dist/esm/formats/frontmatter.js +146 -0
- package/dist/esm/formats/helpers.js +12 -0
- package/dist/esm/formats/json.js +8 -0
- package/dist/esm/formats/toml.js +32 -0
- package/dist/esm/formats/yaml.js +51 -0
- package/dist/esm/index.js +7 -0
- package/dist/esm/integrations/index.js +28 -0
- package/dist/esm/integrations/providers/algolia/implementation.js +174 -0
- package/dist/esm/integrations/providers/assetStore/implementation.js +165 -0
- package/dist/esm/lib/consoleError.js +3 -0
- package/dist/esm/lib/formatters.js +191 -0
- package/dist/esm/lib/i18n.js +367 -0
- package/dist/esm/lib/phrases.js +6 -0
- package/dist/esm/lib/polyfill.js +8 -0
- package/dist/esm/lib/registry.js +329 -0
- package/dist/esm/lib/serializeEntryValues.js +67 -0
- package/dist/esm/lib/stega.js +142 -0
- package/dist/esm/lib/textHelper.js +9 -0
- package/dist/esm/lib/urlHelper.js +111 -0
- package/dist/esm/mediaLibrary.js +37 -0
- package/dist/esm/reducers/auth.js +27 -0
- package/dist/esm/reducers/collections.js +428 -0
- package/dist/esm/reducers/combinedReducer.js +8 -0
- package/dist/esm/reducers/config.js +29 -0
- package/dist/esm/reducers/cursors.js +31 -0
- package/dist/esm/reducers/deploys.js +45 -0
- package/dist/esm/reducers/editorialWorkflow.js +83 -0
- package/dist/esm/reducers/entries.js +568 -0
- package/dist/esm/reducers/entryDraft.js +212 -0
- package/dist/esm/reducers/globalUI.js +25 -0
- package/dist/esm/reducers/index.js +66 -0
- package/dist/esm/reducers/integrations.js +53 -0
- package/dist/esm/reducers/mediaLibrary.js +252 -0
- package/dist/esm/reducers/medias.js +68 -0
- package/dist/esm/reducers/notifications.js +23 -0
- package/dist/esm/reducers/search.js +92 -0
- package/dist/esm/reducers/status.js +30 -0
- package/dist/esm/redux/index.js +7 -0
- package/dist/esm/redux/middleware/waitUntilAction.js +48 -0
- package/dist/esm/routing/history.js +12 -0
- package/dist/esm/types/diacritics.d.js +0 -0
- package/dist/esm/types/global.d.js +1 -0
- package/dist/esm/types/immutable.js +7 -0
- package/dist/esm/types/redux.js +14 -0
- package/dist/esm/types/tomlify-j0.4.d.js +0 -0
- package/dist/esm/valueObjects/AssetProxy.js +44 -0
- package/dist/esm/valueObjects/EditorComponent.js +34 -0
- package/dist/esm/valueObjects/Entry.js +20 -0
- package/index.d.ts +618 -0
- package/package.json +106 -0
- package/src/__tests__/backend.spec.js +1161 -0
- package/src/actions/__tests__/config.spec.js +1009 -0
- package/src/actions/__tests__/editorialWorkflow.spec.js +216 -0
- package/src/actions/__tests__/entries.spec.js +596 -0
- package/src/actions/__tests__/media.spec.ts +171 -0
- package/src/actions/__tests__/mediaLibrary.spec.js +327 -0
- package/src/actions/__tests__/search.spec.js +209 -0
- package/src/actions/auth.ts +127 -0
- package/src/actions/collections.ts +18 -0
- package/src/actions/config.ts +565 -0
- package/src/actions/deploys.ts +104 -0
- package/src/actions/editorialWorkflow.ts +567 -0
- package/src/actions/entries.ts +1055 -0
- package/src/actions/media.ts +139 -0
- package/src/actions/mediaLibrary.ts +574 -0
- package/src/actions/notifications.ts +36 -0
- package/src/actions/search.ts +221 -0
- package/src/actions/status.ts +99 -0
- package/src/actions/waitUntil.ts +49 -0
- package/src/backend.ts +1400 -0
- package/src/bootstrap.js +104 -0
- package/src/components/App/App.js +286 -0
- package/src/components/App/Header.js +266 -0
- package/src/components/App/NotFoundPage.js +23 -0
- package/src/components/Collection/Collection.js +210 -0
- package/src/components/Collection/CollectionControls.js +58 -0
- package/src/components/Collection/CollectionSearch.js +243 -0
- package/src/components/Collection/CollectionTop.js +81 -0
- package/src/components/Collection/ControlButton.js +27 -0
- package/src/components/Collection/Entries/Entries.js +82 -0
- package/src/components/Collection/Entries/EntriesCollection.js +277 -0
- package/src/components/Collection/Entries/EntriesSearch.js +102 -0
- package/src/components/Collection/Entries/EntryCard.js +246 -0
- package/src/components/Collection/Entries/EntryListing.js +151 -0
- package/src/components/Collection/Entries/__tests__/EntriesCollection.spec.js +163 -0
- package/src/components/Collection/Entries/__tests__/__snapshots__/EntriesCollection.spec.js.snap +46 -0
- package/src/components/Collection/FilterControl.js +39 -0
- package/src/components/Collection/GroupControl.js +39 -0
- package/src/components/Collection/NestedCollection.js +330 -0
- package/src/components/Collection/Sidebar.js +136 -0
- package/src/components/Collection/SortControl.js +68 -0
- package/src/components/Collection/ViewStyleControl.js +50 -0
- package/src/components/Collection/__tests__/Collection.spec.js +75 -0
- package/src/components/Collection/__tests__/NestedCollection.spec.js +445 -0
- package/src/components/Collection/__tests__/Sidebar.spec.js +87 -0
- package/src/components/Collection/__tests__/__snapshots__/Collection.spec.js.snap +144 -0
- package/src/components/Collection/__tests__/__snapshots__/NestedCollection.spec.js.snap +550 -0
- package/src/components/Collection/__tests__/__snapshots__/Sidebar.spec.js.snap +312 -0
- package/src/components/Editor/Editor.js +497 -0
- package/src/components/Editor/EditorControlPane/EditorControl.js +452 -0
- package/src/components/Editor/EditorControlPane/EditorControlPane.js +269 -0
- package/src/components/Editor/EditorControlPane/Widget.js +384 -0
- package/src/components/Editor/EditorInterface.js +444 -0
- package/src/components/Editor/EditorPreviewPane/EditorPreview.js +40 -0
- package/src/components/Editor/EditorPreviewPane/EditorPreviewContent.js +74 -0
- package/src/components/Editor/EditorPreviewPane/EditorPreviewPane.js +333 -0
- package/src/components/Editor/EditorPreviewPane/PreviewHOC.js +33 -0
- package/src/components/Editor/EditorToolbar.js +691 -0
- package/src/components/Editor/__tests__/Editor.spec.js +221 -0
- package/src/components/Editor/__tests__/EditorToolbar.spec.js +120 -0
- package/src/components/Editor/__tests__/__snapshots__/Editor.spec.js.snap +45 -0
- package/src/components/Editor/__tests__/__snapshots__/EditorToolbar.spec.js.snap +4233 -0
- package/src/components/Editor/withWorkflow.js +61 -0
- package/src/components/EditorWidgets/Unknown/UnknownControl.js +17 -0
- package/src/components/EditorWidgets/Unknown/UnknownPreview.js +19 -0
- package/src/components/EditorWidgets/index.js +5 -0
- package/src/components/MediaLibrary/EmptyMessage.js +28 -0
- package/src/components/MediaLibrary/MediaLibrary.js +411 -0
- package/src/components/MediaLibrary/MediaLibraryButtons.js +136 -0
- package/src/components/MediaLibrary/MediaLibraryCard.js +128 -0
- package/src/components/MediaLibrary/MediaLibraryCardGrid.js +199 -0
- package/src/components/MediaLibrary/MediaLibraryHeader.js +48 -0
- package/src/components/MediaLibrary/MediaLibraryModal.js +200 -0
- package/src/components/MediaLibrary/MediaLibrarySearch.js +61 -0
- package/src/components/MediaLibrary/MediaLibraryTop.js +143 -0
- package/src/components/MediaLibrary/__tests__/MediaLibraryButtons.spec.js +45 -0
- package/src/components/MediaLibrary/__tests__/MediaLibraryCard.spec.js +49 -0
- package/src/components/MediaLibrary/__tests__/__snapshots__/MediaLibraryCard.spec.js.snap +264 -0
- package/src/components/UI/DragDrop.js +66 -0
- package/src/components/UI/ErrorBoundary.js +214 -0
- package/src/components/UI/FileUploadButton.js +24 -0
- package/src/components/UI/Modal.js +112 -0
- package/src/components/UI/Notifications.tsx +83 -0
- package/src/components/UI/SettingsDropdown.js +103 -0
- package/src/components/UI/__tests__/ErrorBoundary.spec.js +57 -0
- package/src/components/UI/index.js +6 -0
- package/src/components/Workflow/Workflow.js +169 -0
- package/src/components/Workflow/WorkflowCard.js +177 -0
- package/src/components/Workflow/WorkflowList.js +272 -0
- package/src/constants/__tests__/configSchema.spec.js +611 -0
- package/src/constants/collectionTypes.ts +2 -0
- package/src/constants/collectionViews.js +2 -0
- package/src/constants/commitProps.ts +2 -0
- package/src/constants/configSchema.js +441 -0
- package/src/constants/fieldInference.tsx +78 -0
- package/src/constants/publishModes.ts +22 -0
- package/src/constants/validationErrorTypes.js +6 -0
- package/src/formats/__tests__/formats.spec.js +87 -0
- package/src/formats/__tests__/frontmatter.spec.js +429 -0
- package/src/formats/__tests__/toml.spec.js +9 -0
- package/src/formats/__tests__/yaml.spec.js +162 -0
- package/src/formats/formats.ts +97 -0
- package/src/formats/frontmatter.ts +150 -0
- package/src/formats/helpers.ts +14 -0
- package/src/formats/json.ts +9 -0
- package/src/formats/toml.ts +33 -0
- package/src/formats/yaml.ts +58 -0
- package/src/index.js +8 -0
- package/src/integrations/index.js +35 -0
- package/src/integrations/providers/algolia/implementation.js +176 -0
- package/src/integrations/providers/assetStore/implementation.js +148 -0
- package/src/lib/__tests__/formatters.spec.js +751 -0
- package/src/lib/__tests__/i18n.spec.js +792 -0
- package/src/lib/__tests__/phrases.spec.js +119 -0
- package/src/lib/__tests__/registry.spec.js +261 -0
- package/src/lib/__tests__/serializeEntryValues.spec.js +22 -0
- package/src/lib/__tests__/urlHelper.spec.js +138 -0
- package/src/lib/consoleError.js +7 -0
- package/src/lib/formatters.ts +286 -0
- package/src/lib/i18n.ts +454 -0
- package/src/lib/phrases.js +8 -0
- package/src/lib/polyfill.js +9 -0
- package/src/lib/registry.js +312 -0
- package/src/lib/serializeEntryValues.js +75 -0
- package/src/lib/stega.ts +145 -0
- package/src/lib/textHelper.js +11 -0
- package/src/lib/urlHelper.ts +128 -0
- package/src/mediaLibrary.ts +51 -0
- package/src/reducers/__tests__/auth.spec.ts +38 -0
- package/src/reducers/__tests__/collections.spec.js +610 -0
- package/src/reducers/__tests__/config.spec.js +38 -0
- package/src/reducers/__tests__/entries.spec.js +694 -0
- package/src/reducers/__tests__/entryDraft.spec.js +297 -0
- package/src/reducers/__tests__/globalUI.js +43 -0
- package/src/reducers/__tests__/integrations.spec.ts +76 -0
- package/src/reducers/__tests__/mediaLibrary.spec.js +154 -0
- package/src/reducers/__tests__/medias.spec.ts +49 -0
- package/src/reducers/auth.ts +46 -0
- package/src/reducers/collections.ts +535 -0
- package/src/reducers/combinedReducer.ts +11 -0
- package/src/reducers/config.ts +38 -0
- package/src/reducers/cursors.js +36 -0
- package/src/reducers/deploys.ts +52 -0
- package/src/reducers/editorialWorkflow.ts +163 -0
- package/src/reducers/entries.ts +819 -0
- package/src/reducers/entryDraft.js +260 -0
- package/src/reducers/globalUI.ts +45 -0
- package/src/reducers/index.ts +82 -0
- package/src/reducers/integrations.ts +59 -0
- package/src/reducers/mediaLibrary.ts +296 -0
- package/src/reducers/medias.ts +66 -0
- package/src/reducers/notifications.ts +52 -0
- package/src/reducers/search.ts +111 -0
- package/src/reducers/status.ts +40 -0
- package/src/redux/index.ts +18 -0
- package/src/redux/middleware/waitUntilAction.ts +64 -0
- package/src/routing/__tests__/history.spec.ts +49 -0
- package/src/routing/history.ts +17 -0
- package/src/types/diacritics.d.ts +1 -0
- package/src/types/global.d.ts +8 -0
- package/src/types/immutable.ts +49 -0
- package/src/types/redux.ts +827 -0
- package/src/types/tomlify-j0.4.d.ts +13 -0
- package/src/valueObjects/AssetProxy.ts +48 -0
- package/src/valueObjects/EditorComponent.js +38 -0
- package/src/valueObjects/Entry.ts +63 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { TypeOptions } from 'react-toastify';
|
|
2
|
+
|
|
3
|
+
export interface NotificationMessage {
|
|
4
|
+
details?: unknown;
|
|
5
|
+
key: string;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export interface NotificationPayload {
|
|
9
|
+
message: string | NotificationMessage;
|
|
10
|
+
dismissAfter?: number;
|
|
11
|
+
type: TypeOptions | undefined;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const NOTIFICATION_SEND = 'NOTIFICATION_SEND';
|
|
15
|
+
export const NOTIFICATION_DISMISS = 'NOTIFICATION_DISMISS';
|
|
16
|
+
export const NOTIFICATIONS_CLEAR = 'NOTIFICATION_CLEAR';
|
|
17
|
+
|
|
18
|
+
function addNotification(notification: NotificationPayload) {
|
|
19
|
+
return { type: NOTIFICATION_SEND, payload: notification };
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function dismissNotification(id: string) {
|
|
23
|
+
return { type: NOTIFICATION_DISMISS, id };
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function clearNotifications() {
|
|
27
|
+
return { type: NOTIFICATIONS_CLEAR };
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export type NotificationsAction = {
|
|
31
|
+
type: typeof NOTIFICATION_DISMISS | typeof NOTIFICATION_SEND | typeof NOTIFICATIONS_CLEAR;
|
|
32
|
+
payload?: NotificationPayload;
|
|
33
|
+
id?: string;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
export { addNotification, dismissNotification, clearNotifications };
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import isEqual from 'lodash/isEqual';
|
|
2
|
+
|
|
3
|
+
import { currentBackend } from '../backend';
|
|
4
|
+
import { getIntegrationProvider } from '../integrations';
|
|
5
|
+
import { selectIntegration } from '../reducers';
|
|
6
|
+
|
|
7
|
+
import type { QueryRequest } from '../reducers/search';
|
|
8
|
+
import type { State } from '../types/redux';
|
|
9
|
+
import type { AnyAction } from 'redux';
|
|
10
|
+
import type { ThunkDispatch } from 'redux-thunk';
|
|
11
|
+
import type { EntryValue } from '../valueObjects/Entry';
|
|
12
|
+
|
|
13
|
+
/*
|
|
14
|
+
* Constant Declarations
|
|
15
|
+
*/
|
|
16
|
+
export const SEARCH_ENTRIES_REQUEST = 'SEARCH_ENTRIES_REQUEST';
|
|
17
|
+
export const SEARCH_ENTRIES_SUCCESS = 'SEARCH_ENTRIES_SUCCESS';
|
|
18
|
+
export const SEARCH_ENTRIES_FAILURE = 'SEARCH_ENTRIES_FAILURE';
|
|
19
|
+
|
|
20
|
+
export const QUERY_REQUEST = 'QUERY_REQUEST';
|
|
21
|
+
export const QUERY_SUCCESS = 'QUERY_SUCCESS';
|
|
22
|
+
export const QUERY_FAILURE = 'QUERY_FAILURE';
|
|
23
|
+
|
|
24
|
+
export const SEARCH_CLEAR = 'SEARCH_CLEAR';
|
|
25
|
+
export const CLEAR_REQUESTS = 'CLEAR_REQUESTS';
|
|
26
|
+
|
|
27
|
+
/*
|
|
28
|
+
* Simple Action Creators (Internal)
|
|
29
|
+
* We still need to export them for tests
|
|
30
|
+
*/
|
|
31
|
+
export function searchingEntries(searchTerm: string, searchCollections: string[], page: number) {
|
|
32
|
+
return {
|
|
33
|
+
type: SEARCH_ENTRIES_REQUEST,
|
|
34
|
+
payload: { searchTerm, searchCollections, page },
|
|
35
|
+
} as const;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function searchSuccess(entries: EntryValue[], page: number) {
|
|
39
|
+
return {
|
|
40
|
+
type: SEARCH_ENTRIES_SUCCESS,
|
|
41
|
+
payload: {
|
|
42
|
+
entries,
|
|
43
|
+
page,
|
|
44
|
+
},
|
|
45
|
+
} as const;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function searchFailure(error: Error) {
|
|
49
|
+
return {
|
|
50
|
+
type: SEARCH_ENTRIES_FAILURE,
|
|
51
|
+
payload: { error },
|
|
52
|
+
} as const;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export function querying(searchTerm: string, request?: QueryRequest) {
|
|
56
|
+
return {
|
|
57
|
+
type: QUERY_REQUEST,
|
|
58
|
+
payload: {
|
|
59
|
+
searchTerm,
|
|
60
|
+
request,
|
|
61
|
+
},
|
|
62
|
+
} as const;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
type SearchResponse = {
|
|
66
|
+
entries: EntryValue[];
|
|
67
|
+
pagination: number;
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
type QueryResponse = {
|
|
71
|
+
hits: EntryValue[];
|
|
72
|
+
query: string;
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
export function querySuccess(namespace: string, hits: EntryValue[]) {
|
|
76
|
+
return {
|
|
77
|
+
type: QUERY_SUCCESS,
|
|
78
|
+
payload: {
|
|
79
|
+
namespace,
|
|
80
|
+
hits,
|
|
81
|
+
},
|
|
82
|
+
} as const;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export function queryFailure(error: Error) {
|
|
86
|
+
return {
|
|
87
|
+
type: QUERY_FAILURE,
|
|
88
|
+
payload: { error },
|
|
89
|
+
} as const;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/*
|
|
93
|
+
* Exported simple Action Creators
|
|
94
|
+
*/
|
|
95
|
+
|
|
96
|
+
export function clearSearch() {
|
|
97
|
+
return { type: SEARCH_CLEAR } as const;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export function clearRequests() {
|
|
101
|
+
return { type: CLEAR_REQUESTS } as const;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/*
|
|
105
|
+
* Exported Thunk Action Creators
|
|
106
|
+
*/
|
|
107
|
+
|
|
108
|
+
// SearchEntries will search for complete entries in all collections.
|
|
109
|
+
export function searchEntries(searchTerm: string, searchCollections: string[], page = 0) {
|
|
110
|
+
return async (dispatch: ThunkDispatch<State, undefined, AnyAction>, getState: () => State) => {
|
|
111
|
+
const state = getState();
|
|
112
|
+
const { search } = state;
|
|
113
|
+
const backend = currentBackend(state.config);
|
|
114
|
+
const allCollections = searchCollections || state.collections.keySeq().toArray();
|
|
115
|
+
const collections = allCollections.filter(collection =>
|
|
116
|
+
selectIntegration(state, collection, 'search'),
|
|
117
|
+
);
|
|
118
|
+
const integration = selectIntegration(state, collections[0], 'search');
|
|
119
|
+
|
|
120
|
+
// avoid duplicate searches
|
|
121
|
+
if (
|
|
122
|
+
search.isFetching &&
|
|
123
|
+
search.term === searchTerm &&
|
|
124
|
+
isEqual(allCollections, search.collections) &&
|
|
125
|
+
// if an integration doesn't exist, 'page' is not used
|
|
126
|
+
(search.page === page || !integration)
|
|
127
|
+
) {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
dispatch(searchingEntries(searchTerm, allCollections, page));
|
|
132
|
+
|
|
133
|
+
const searchPromise = integration
|
|
134
|
+
? getIntegrationProvider(state.integrations, backend.getToken, integration).search(
|
|
135
|
+
collections,
|
|
136
|
+
searchTerm,
|
|
137
|
+
page,
|
|
138
|
+
)
|
|
139
|
+
: backend.search(
|
|
140
|
+
state.collections
|
|
141
|
+
.filter((_, key: string) => allCollections.indexOf(key) !== -1)
|
|
142
|
+
.valueSeq()
|
|
143
|
+
.toArray(),
|
|
144
|
+
searchTerm,
|
|
145
|
+
);
|
|
146
|
+
|
|
147
|
+
try {
|
|
148
|
+
const response: SearchResponse = await searchPromise;
|
|
149
|
+
return dispatch(searchSuccess(response.entries, response.pagination));
|
|
150
|
+
} catch (error) {
|
|
151
|
+
return dispatch(searchFailure(error));
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// Instead of searching for complete entries, query will search for specific fields
|
|
157
|
+
// in specific collections and return raw data (no entries).
|
|
158
|
+
export function query(
|
|
159
|
+
namespace: string,
|
|
160
|
+
collectionName: string,
|
|
161
|
+
searchFields: string[],
|
|
162
|
+
searchTerm: string,
|
|
163
|
+
file?: string,
|
|
164
|
+
limit?: number,
|
|
165
|
+
) {
|
|
166
|
+
return async (dispatch: ThunkDispatch<State, {}, AnyAction>, getState: () => State) => {
|
|
167
|
+
const state = getState();
|
|
168
|
+
const backend = currentBackend(state.config);
|
|
169
|
+
const integration = selectIntegration(state, collectionName, 'search');
|
|
170
|
+
const collection = state.collections.find(
|
|
171
|
+
collection => collection.get('name') === collectionName,
|
|
172
|
+
);
|
|
173
|
+
|
|
174
|
+
dispatch(clearRequests());
|
|
175
|
+
|
|
176
|
+
const queryIdentifier = `${collectionName}-${searchFields.join()}-${searchTerm}-${file}-${limit}`;
|
|
177
|
+
|
|
178
|
+
const queuedQueryPromise = state.search.requests.find(({ id }) => id == queryIdentifier);
|
|
179
|
+
|
|
180
|
+
const queryPromise = queuedQueryPromise
|
|
181
|
+
? queuedQueryPromise.queryResponse
|
|
182
|
+
: integration
|
|
183
|
+
? getIntegrationProvider(state.integrations, backend.getToken, integration).searchBy(
|
|
184
|
+
searchFields.map(f => `data.${f}`),
|
|
185
|
+
collectionName,
|
|
186
|
+
searchTerm,
|
|
187
|
+
)
|
|
188
|
+
: backend.query(collection, searchFields, searchTerm, file, limit);
|
|
189
|
+
|
|
190
|
+
dispatch(
|
|
191
|
+
querying(
|
|
192
|
+
searchTerm,
|
|
193
|
+
queuedQueryPromise
|
|
194
|
+
? undefined
|
|
195
|
+
: {
|
|
196
|
+
id: queryIdentifier,
|
|
197
|
+
expires: new Date(new Date().getTime() + 10 * 1000),
|
|
198
|
+
queryResponse: queryPromise,
|
|
199
|
+
},
|
|
200
|
+
),
|
|
201
|
+
);
|
|
202
|
+
|
|
203
|
+
try {
|
|
204
|
+
const response: QueryResponse = await queryPromise;
|
|
205
|
+
return dispatch(querySuccess(namespace, response.hits));
|
|
206
|
+
} catch (error) {
|
|
207
|
+
return dispatch(queryFailure(error));
|
|
208
|
+
}
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
export type SearchAction = ReturnType<
|
|
213
|
+
| typeof searchingEntries
|
|
214
|
+
| typeof searchSuccess
|
|
215
|
+
| typeof searchFailure
|
|
216
|
+
| typeof querying
|
|
217
|
+
| typeof querySuccess
|
|
218
|
+
| typeof queryFailure
|
|
219
|
+
| typeof clearSearch
|
|
220
|
+
| typeof clearRequests
|
|
221
|
+
>;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { currentBackend } from '../backend';
|
|
2
|
+
import { addNotification, dismissNotification } from './notifications';
|
|
3
|
+
|
|
4
|
+
import type { ThunkDispatch } from 'redux-thunk';
|
|
5
|
+
import type { AnyAction } from 'redux';
|
|
6
|
+
import type { State } from '../types/redux';
|
|
7
|
+
|
|
8
|
+
export const STATUS_REQUEST = 'STATUS_REQUEST';
|
|
9
|
+
export const STATUS_SUCCESS = 'STATUS_SUCCESS';
|
|
10
|
+
export const STATUS_FAILURE = 'STATUS_FAILURE';
|
|
11
|
+
|
|
12
|
+
export function statusRequest() {
|
|
13
|
+
return {
|
|
14
|
+
type: STATUS_REQUEST,
|
|
15
|
+
} as const;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function statusSuccess(status: {
|
|
19
|
+
auth: { status: boolean };
|
|
20
|
+
api: { status: boolean; statusPage: string };
|
|
21
|
+
}) {
|
|
22
|
+
return {
|
|
23
|
+
type: STATUS_SUCCESS,
|
|
24
|
+
payload: { status },
|
|
25
|
+
} as const;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function statusFailure(error: Error) {
|
|
29
|
+
return {
|
|
30
|
+
type: STATUS_FAILURE,
|
|
31
|
+
payload: { error },
|
|
32
|
+
} as const;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function checkBackendStatus() {
|
|
36
|
+
return async (dispatch: ThunkDispatch<State, {}, AnyAction>, getState: () => State) => {
|
|
37
|
+
try {
|
|
38
|
+
const state = getState();
|
|
39
|
+
if (state.status.isFetching) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
dispatch(statusRequest());
|
|
44
|
+
const backend = currentBackend(state.config);
|
|
45
|
+
const status = await backend.status();
|
|
46
|
+
|
|
47
|
+
const backendDownKey = 'ui.toast.onBackendDown';
|
|
48
|
+
const previousBackendDownNotifications = state.notifications.notifications.filter(
|
|
49
|
+
n => typeof n.message != 'string' && n.message?.key === backendDownKey,
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
if (status.api.status === false) {
|
|
53
|
+
if (previousBackendDownNotifications.length === 0) {
|
|
54
|
+
dispatch(
|
|
55
|
+
addNotification({
|
|
56
|
+
message: {
|
|
57
|
+
details: status.api.statusPage,
|
|
58
|
+
key: 'ui.toast.onBackendDown',
|
|
59
|
+
},
|
|
60
|
+
type: 'error',
|
|
61
|
+
}),
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
return dispatch(statusSuccess(status));
|
|
65
|
+
} else if (status.api.status === true && previousBackendDownNotifications.length > 0) {
|
|
66
|
+
// If backend is up, clear all the danger messages
|
|
67
|
+
previousBackendDownNotifications.forEach(notification => {
|
|
68
|
+
dispatch(dismissNotification(notification.id));
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const authError = status.auth.status === false;
|
|
73
|
+
if (authError) {
|
|
74
|
+
const key = 'ui.toast.onLoggedOut';
|
|
75
|
+
const existingNotification = state.notifications.notifications.find(
|
|
76
|
+
n => typeof n.message != 'string' && n.message?.key === key,
|
|
77
|
+
);
|
|
78
|
+
if (!existingNotification) {
|
|
79
|
+
dispatch(
|
|
80
|
+
addNotification({
|
|
81
|
+
message: {
|
|
82
|
+
key: 'ui.toast.onLoggedOut',
|
|
83
|
+
},
|
|
84
|
+
type: 'error',
|
|
85
|
+
}),
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
dispatch(statusSuccess(status));
|
|
91
|
+
} catch (error) {
|
|
92
|
+
dispatch(statusFailure(error));
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export type StatusAction = ReturnType<
|
|
98
|
+
typeof statusRequest | typeof statusSuccess | typeof statusFailure
|
|
99
|
+
>;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { WAIT_UNTIL_ACTION } from '../redux/middleware/waitUntilAction';
|
|
2
|
+
|
|
3
|
+
import type { WaitActionArgs } from '../redux/middleware/waitUntilAction';
|
|
4
|
+
import type { ThunkDispatch } from 'redux-thunk';
|
|
5
|
+
import type { AnyAction } from 'redux';
|
|
6
|
+
import type { State } from '../types/redux';
|
|
7
|
+
|
|
8
|
+
export function waitUntil({ predicate, run }: WaitActionArgs) {
|
|
9
|
+
return {
|
|
10
|
+
type: WAIT_UNTIL_ACTION,
|
|
11
|
+
predicate,
|
|
12
|
+
run,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export async function waitUntilWithTimeout<T>(
|
|
17
|
+
dispatch: ThunkDispatch<State, {}, AnyAction>,
|
|
18
|
+
waitActionArgs: (resolve: (value?: T) => void) => WaitActionArgs,
|
|
19
|
+
timeout = 30000,
|
|
20
|
+
): Promise<T | null | void> {
|
|
21
|
+
let waitDone = false;
|
|
22
|
+
|
|
23
|
+
const waitPromise = new Promise<T>(resolve => {
|
|
24
|
+
dispatch(waitUntil(waitActionArgs(resolve as (value?: T | undefined) => void)));
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
const timeoutPromise = new Promise<T | null | void>(resolve => {
|
|
28
|
+
setTimeout(() => {
|
|
29
|
+
if (waitDone) {
|
|
30
|
+
resolve();
|
|
31
|
+
} else {
|
|
32
|
+
console.warn('Wait Action timed out');
|
|
33
|
+
resolve(null);
|
|
34
|
+
}
|
|
35
|
+
}, timeout);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
const result = await Promise.race([
|
|
39
|
+
waitPromise
|
|
40
|
+
.then(result => {
|
|
41
|
+
waitDone = true;
|
|
42
|
+
return result;
|
|
43
|
+
})
|
|
44
|
+
.catch(null),
|
|
45
|
+
timeoutPromise,
|
|
46
|
+
]);
|
|
47
|
+
|
|
48
|
+
return result;
|
|
49
|
+
}
|