@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.
Files changed (299) hide show
  1. package/README.md +9 -0
  2. package/dist/@pranaysahith/decap-cms-core.js +52 -0
  3. package/dist/@pranaysahith/decap-cms-core.js.LICENSE.txt +141 -0
  4. package/dist/@pranaysahith/decap-cms-core.js.map +1 -0
  5. package/dist/decap-cms-core.js +47 -0
  6. package/dist/decap-cms-core.js.LICENSE.txt +116 -0
  7. package/dist/decap-cms-core.js.map +1 -0
  8. package/dist/esm/actions/auth.js +97 -0
  9. package/dist/esm/actions/collections.js +15 -0
  10. package/dist/esm/actions/config.js +493 -0
  11. package/dist/esm/actions/deploys.js +79 -0
  12. package/dist/esm/actions/editorialWorkflow.js +480 -0
  13. package/dist/esm/actions/entries.js +865 -0
  14. package/dist/esm/actions/media.js +147 -0
  15. package/dist/esm/actions/mediaLibrary.js +552 -0
  16. package/dist/esm/actions/notifications.js +21 -0
  17. package/dist/esm/actions/search.js +149 -0
  18. package/dist/esm/actions/status.js +74 -0
  19. package/dist/esm/actions/waitUntil.js +32 -0
  20. package/dist/esm/backend.js +1082 -0
  21. package/dist/esm/bootstrap.js +101 -0
  22. package/dist/esm/components/App/App.js +289 -0
  23. package/dist/esm/components/App/Header.js +172 -0
  24. package/dist/esm/components/App/NotFoundPage.js +19 -0
  25. package/dist/esm/components/Collection/Collection.js +198 -0
  26. package/dist/esm/components/Collection/CollectionControls.js +46 -0
  27. package/dist/esm/components/Collection/CollectionSearch.js +222 -0
  28. package/dist/esm/components/Collection/CollectionTop.js +68 -0
  29. package/dist/esm/components/Collection/ControlButton.js +17 -0
  30. package/dist/esm/components/Collection/Entries/Entries.js +73 -0
  31. package/dist/esm/components/Collection/Entries/EntriesCollection.js +241 -0
  32. package/dist/esm/components/Collection/Entries/EntriesSearch.js +113 -0
  33. package/dist/esm/components/Collection/Entries/EntryCard.js +177 -0
  34. package/dist/esm/components/Collection/Entries/EntryListing.js +143 -0
  35. package/dist/esm/components/Collection/FilterControl.js +33 -0
  36. package/dist/esm/components/Collection/FolderRenameControl.js +403 -0
  37. package/dist/esm/components/Collection/GroupControl.js +33 -0
  38. package/dist/esm/components/Collection/NestedCollection.js +308 -0
  39. package/dist/esm/components/Collection/Sidebar.js +91 -0
  40. package/dist/esm/components/Collection/SortControl.js +59 -0
  41. package/dist/esm/components/Collection/ViewStyleControl.js +38 -0
  42. package/dist/esm/components/Editor/Editor.js +466 -0
  43. package/dist/esm/components/Editor/EditorControlPane/EditorControl.js +395 -0
  44. package/dist/esm/components/Editor/EditorControlPane/EditorControlPane.js +254 -0
  45. package/dist/esm/components/Editor/EditorControlPane/Widget.js +374 -0
  46. package/dist/esm/components/Editor/EditorInterface.js +386 -0
  47. package/dist/esm/components/Editor/EditorPreviewPane/EditorPreview.js +47 -0
  48. package/dist/esm/components/Editor/EditorPreviewPane/EditorPreviewContent.js +66 -0
  49. package/dist/esm/components/Editor/EditorPreviewPane/EditorPreviewPane.js +288 -0
  50. package/dist/esm/components/Editor/EditorPreviewPane/PreviewHOC.js +27 -0
  51. package/dist/esm/components/Editor/EditorToolbar.js +536 -0
  52. package/dist/esm/components/Editor/EntryPathEditor.js +272 -0
  53. package/dist/esm/components/Editor/withWorkflow.js +56 -0
  54. package/dist/esm/components/EditorWidgets/Unknown/UnknownControl.js +18 -0
  55. package/dist/esm/components/EditorWidgets/Unknown/UnknownPreview.js +20 -0
  56. package/dist/esm/components/EditorWidgets/index.js +4 -0
  57. package/dist/esm/components/MediaLibrary/EmptyMessage.js +22 -0
  58. package/dist/esm/components/MediaLibrary/MediaLibrary.js +446 -0
  59. package/dist/esm/components/MediaLibrary/MediaLibraryButtons.js +93 -0
  60. package/dist/esm/components/MediaLibrary/MediaLibraryCard.js +99 -0
  61. package/dist/esm/components/MediaLibrary/MediaLibraryCardGrid.js +198 -0
  62. package/dist/esm/components/MediaLibrary/MediaLibraryHeader.js +32 -0
  63. package/dist/esm/components/MediaLibrary/MediaLibraryModal.js +156 -0
  64. package/dist/esm/components/MediaLibrary/MediaLibrarySearch.js +51 -0
  65. package/dist/esm/components/MediaLibrary/MediaLibraryTop.js +123 -0
  66. package/dist/esm/components/UI/DragDrop.js +67 -0
  67. package/dist/esm/components/UI/ErrorBoundary.js +173 -0
  68. package/dist/esm/components/UI/FileUploadButton.js +27 -0
  69. package/dist/esm/components/UI/Modal.js +104 -0
  70. package/dist/esm/components/UI/Notifications.js +62 -0
  71. package/dist/esm/components/UI/SettingsDropdown.js +107 -0
  72. package/dist/esm/components/UI/index.js +6 -0
  73. package/dist/esm/components/Workflow/Workflow.js +133 -0
  74. package/dist/esm/components/Workflow/WorkflowCard.js +128 -0
  75. package/dist/esm/components/Workflow/WorkflowList.js +204 -0
  76. package/dist/esm/constants/collectionTypes.js +2 -0
  77. package/dist/esm/constants/collectionViews.js +2 -0
  78. package/dist/esm/constants/commitProps.js +2 -0
  79. package/dist/esm/constants/configSchema.js +644 -0
  80. package/dist/esm/constants/fieldInference.js +57 -0
  81. package/dist/esm/constants/publishModes.js +18 -0
  82. package/dist/esm/constants/validationErrorTypes.js +6 -0
  83. package/dist/esm/formats/formats.js +83 -0
  84. package/dist/esm/formats/frontmatter.js +146 -0
  85. package/dist/esm/formats/helpers.js +12 -0
  86. package/dist/esm/formats/json.js +8 -0
  87. package/dist/esm/formats/toml.js +32 -0
  88. package/dist/esm/formats/yaml.js +51 -0
  89. package/dist/esm/index.js +7 -0
  90. package/dist/esm/integrations/index.js +28 -0
  91. package/dist/esm/integrations/providers/algolia/implementation.js +174 -0
  92. package/dist/esm/integrations/providers/assetStore/implementation.js +165 -0
  93. package/dist/esm/lib/consoleError.js +3 -0
  94. package/dist/esm/lib/formatters.js +191 -0
  95. package/dist/esm/lib/i18n.js +367 -0
  96. package/dist/esm/lib/phrases.js +6 -0
  97. package/dist/esm/lib/polyfill.js +8 -0
  98. package/dist/esm/lib/registry.js +329 -0
  99. package/dist/esm/lib/serializeEntryValues.js +67 -0
  100. package/dist/esm/lib/stega.js +142 -0
  101. package/dist/esm/lib/textHelper.js +9 -0
  102. package/dist/esm/lib/urlHelper.js +111 -0
  103. package/dist/esm/mediaLibrary.js +37 -0
  104. package/dist/esm/reducers/auth.js +27 -0
  105. package/dist/esm/reducers/collections.js +428 -0
  106. package/dist/esm/reducers/combinedReducer.js +8 -0
  107. package/dist/esm/reducers/config.js +29 -0
  108. package/dist/esm/reducers/cursors.js +31 -0
  109. package/dist/esm/reducers/deploys.js +45 -0
  110. package/dist/esm/reducers/editorialWorkflow.js +83 -0
  111. package/dist/esm/reducers/entries.js +568 -0
  112. package/dist/esm/reducers/entryDraft.js +212 -0
  113. package/dist/esm/reducers/globalUI.js +25 -0
  114. package/dist/esm/reducers/index.js +66 -0
  115. package/dist/esm/reducers/integrations.js +53 -0
  116. package/dist/esm/reducers/mediaLibrary.js +252 -0
  117. package/dist/esm/reducers/medias.js +68 -0
  118. package/dist/esm/reducers/notifications.js +23 -0
  119. package/dist/esm/reducers/search.js +92 -0
  120. package/dist/esm/reducers/status.js +30 -0
  121. package/dist/esm/redux/index.js +7 -0
  122. package/dist/esm/redux/middleware/waitUntilAction.js +48 -0
  123. package/dist/esm/routing/history.js +12 -0
  124. package/dist/esm/types/diacritics.d.js +0 -0
  125. package/dist/esm/types/global.d.js +1 -0
  126. package/dist/esm/types/immutable.js +7 -0
  127. package/dist/esm/types/redux.js +14 -0
  128. package/dist/esm/types/tomlify-j0.4.d.js +0 -0
  129. package/dist/esm/valueObjects/AssetProxy.js +44 -0
  130. package/dist/esm/valueObjects/EditorComponent.js +34 -0
  131. package/dist/esm/valueObjects/Entry.js +20 -0
  132. package/index.d.ts +618 -0
  133. package/package.json +106 -0
  134. package/src/__tests__/backend.spec.js +1161 -0
  135. package/src/actions/__tests__/config.spec.js +1009 -0
  136. package/src/actions/__tests__/editorialWorkflow.spec.js +216 -0
  137. package/src/actions/__tests__/entries.spec.js +596 -0
  138. package/src/actions/__tests__/media.spec.ts +171 -0
  139. package/src/actions/__tests__/mediaLibrary.spec.js +327 -0
  140. package/src/actions/__tests__/search.spec.js +209 -0
  141. package/src/actions/auth.ts +127 -0
  142. package/src/actions/collections.ts +18 -0
  143. package/src/actions/config.ts +565 -0
  144. package/src/actions/deploys.ts +104 -0
  145. package/src/actions/editorialWorkflow.ts +567 -0
  146. package/src/actions/entries.ts +1055 -0
  147. package/src/actions/media.ts +139 -0
  148. package/src/actions/mediaLibrary.ts +574 -0
  149. package/src/actions/notifications.ts +36 -0
  150. package/src/actions/search.ts +221 -0
  151. package/src/actions/status.ts +99 -0
  152. package/src/actions/waitUntil.ts +49 -0
  153. package/src/backend.ts +1400 -0
  154. package/src/bootstrap.js +104 -0
  155. package/src/components/App/App.js +286 -0
  156. package/src/components/App/Header.js +266 -0
  157. package/src/components/App/NotFoundPage.js +23 -0
  158. package/src/components/Collection/Collection.js +210 -0
  159. package/src/components/Collection/CollectionControls.js +58 -0
  160. package/src/components/Collection/CollectionSearch.js +243 -0
  161. package/src/components/Collection/CollectionTop.js +81 -0
  162. package/src/components/Collection/ControlButton.js +27 -0
  163. package/src/components/Collection/Entries/Entries.js +82 -0
  164. package/src/components/Collection/Entries/EntriesCollection.js +277 -0
  165. package/src/components/Collection/Entries/EntriesSearch.js +102 -0
  166. package/src/components/Collection/Entries/EntryCard.js +246 -0
  167. package/src/components/Collection/Entries/EntryListing.js +151 -0
  168. package/src/components/Collection/Entries/__tests__/EntriesCollection.spec.js +163 -0
  169. package/src/components/Collection/Entries/__tests__/__snapshots__/EntriesCollection.spec.js.snap +46 -0
  170. package/src/components/Collection/FilterControl.js +39 -0
  171. package/src/components/Collection/GroupControl.js +39 -0
  172. package/src/components/Collection/NestedCollection.js +330 -0
  173. package/src/components/Collection/Sidebar.js +136 -0
  174. package/src/components/Collection/SortControl.js +68 -0
  175. package/src/components/Collection/ViewStyleControl.js +50 -0
  176. package/src/components/Collection/__tests__/Collection.spec.js +75 -0
  177. package/src/components/Collection/__tests__/NestedCollection.spec.js +445 -0
  178. package/src/components/Collection/__tests__/Sidebar.spec.js +87 -0
  179. package/src/components/Collection/__tests__/__snapshots__/Collection.spec.js.snap +144 -0
  180. package/src/components/Collection/__tests__/__snapshots__/NestedCollection.spec.js.snap +550 -0
  181. package/src/components/Collection/__tests__/__snapshots__/Sidebar.spec.js.snap +312 -0
  182. package/src/components/Editor/Editor.js +497 -0
  183. package/src/components/Editor/EditorControlPane/EditorControl.js +452 -0
  184. package/src/components/Editor/EditorControlPane/EditorControlPane.js +269 -0
  185. package/src/components/Editor/EditorControlPane/Widget.js +384 -0
  186. package/src/components/Editor/EditorInterface.js +444 -0
  187. package/src/components/Editor/EditorPreviewPane/EditorPreview.js +40 -0
  188. package/src/components/Editor/EditorPreviewPane/EditorPreviewContent.js +74 -0
  189. package/src/components/Editor/EditorPreviewPane/EditorPreviewPane.js +333 -0
  190. package/src/components/Editor/EditorPreviewPane/PreviewHOC.js +33 -0
  191. package/src/components/Editor/EditorToolbar.js +691 -0
  192. package/src/components/Editor/__tests__/Editor.spec.js +221 -0
  193. package/src/components/Editor/__tests__/EditorToolbar.spec.js +120 -0
  194. package/src/components/Editor/__tests__/__snapshots__/Editor.spec.js.snap +45 -0
  195. package/src/components/Editor/__tests__/__snapshots__/EditorToolbar.spec.js.snap +4233 -0
  196. package/src/components/Editor/withWorkflow.js +61 -0
  197. package/src/components/EditorWidgets/Unknown/UnknownControl.js +17 -0
  198. package/src/components/EditorWidgets/Unknown/UnknownPreview.js +19 -0
  199. package/src/components/EditorWidgets/index.js +5 -0
  200. package/src/components/MediaLibrary/EmptyMessage.js +28 -0
  201. package/src/components/MediaLibrary/MediaLibrary.js +411 -0
  202. package/src/components/MediaLibrary/MediaLibraryButtons.js +136 -0
  203. package/src/components/MediaLibrary/MediaLibraryCard.js +128 -0
  204. package/src/components/MediaLibrary/MediaLibraryCardGrid.js +199 -0
  205. package/src/components/MediaLibrary/MediaLibraryHeader.js +48 -0
  206. package/src/components/MediaLibrary/MediaLibraryModal.js +200 -0
  207. package/src/components/MediaLibrary/MediaLibrarySearch.js +61 -0
  208. package/src/components/MediaLibrary/MediaLibraryTop.js +143 -0
  209. package/src/components/MediaLibrary/__tests__/MediaLibraryButtons.spec.js +45 -0
  210. package/src/components/MediaLibrary/__tests__/MediaLibraryCard.spec.js +49 -0
  211. package/src/components/MediaLibrary/__tests__/__snapshots__/MediaLibraryCard.spec.js.snap +264 -0
  212. package/src/components/UI/DragDrop.js +66 -0
  213. package/src/components/UI/ErrorBoundary.js +214 -0
  214. package/src/components/UI/FileUploadButton.js +24 -0
  215. package/src/components/UI/Modal.js +112 -0
  216. package/src/components/UI/Notifications.tsx +83 -0
  217. package/src/components/UI/SettingsDropdown.js +103 -0
  218. package/src/components/UI/__tests__/ErrorBoundary.spec.js +57 -0
  219. package/src/components/UI/index.js +6 -0
  220. package/src/components/Workflow/Workflow.js +169 -0
  221. package/src/components/Workflow/WorkflowCard.js +177 -0
  222. package/src/components/Workflow/WorkflowList.js +272 -0
  223. package/src/constants/__tests__/configSchema.spec.js +611 -0
  224. package/src/constants/collectionTypes.ts +2 -0
  225. package/src/constants/collectionViews.js +2 -0
  226. package/src/constants/commitProps.ts +2 -0
  227. package/src/constants/configSchema.js +441 -0
  228. package/src/constants/fieldInference.tsx +78 -0
  229. package/src/constants/publishModes.ts +22 -0
  230. package/src/constants/validationErrorTypes.js +6 -0
  231. package/src/formats/__tests__/formats.spec.js +87 -0
  232. package/src/formats/__tests__/frontmatter.spec.js +429 -0
  233. package/src/formats/__tests__/toml.spec.js +9 -0
  234. package/src/formats/__tests__/yaml.spec.js +162 -0
  235. package/src/formats/formats.ts +97 -0
  236. package/src/formats/frontmatter.ts +150 -0
  237. package/src/formats/helpers.ts +14 -0
  238. package/src/formats/json.ts +9 -0
  239. package/src/formats/toml.ts +33 -0
  240. package/src/formats/yaml.ts +58 -0
  241. package/src/index.js +8 -0
  242. package/src/integrations/index.js +35 -0
  243. package/src/integrations/providers/algolia/implementation.js +176 -0
  244. package/src/integrations/providers/assetStore/implementation.js +148 -0
  245. package/src/lib/__tests__/formatters.spec.js +751 -0
  246. package/src/lib/__tests__/i18n.spec.js +792 -0
  247. package/src/lib/__tests__/phrases.spec.js +119 -0
  248. package/src/lib/__tests__/registry.spec.js +261 -0
  249. package/src/lib/__tests__/serializeEntryValues.spec.js +22 -0
  250. package/src/lib/__tests__/urlHelper.spec.js +138 -0
  251. package/src/lib/consoleError.js +7 -0
  252. package/src/lib/formatters.ts +286 -0
  253. package/src/lib/i18n.ts +454 -0
  254. package/src/lib/phrases.js +8 -0
  255. package/src/lib/polyfill.js +9 -0
  256. package/src/lib/registry.js +312 -0
  257. package/src/lib/serializeEntryValues.js +75 -0
  258. package/src/lib/stega.ts +145 -0
  259. package/src/lib/textHelper.js +11 -0
  260. package/src/lib/urlHelper.ts +128 -0
  261. package/src/mediaLibrary.ts +51 -0
  262. package/src/reducers/__tests__/auth.spec.ts +38 -0
  263. package/src/reducers/__tests__/collections.spec.js +610 -0
  264. package/src/reducers/__tests__/config.spec.js +38 -0
  265. package/src/reducers/__tests__/entries.spec.js +694 -0
  266. package/src/reducers/__tests__/entryDraft.spec.js +297 -0
  267. package/src/reducers/__tests__/globalUI.js +43 -0
  268. package/src/reducers/__tests__/integrations.spec.ts +76 -0
  269. package/src/reducers/__tests__/mediaLibrary.spec.js +154 -0
  270. package/src/reducers/__tests__/medias.spec.ts +49 -0
  271. package/src/reducers/auth.ts +46 -0
  272. package/src/reducers/collections.ts +535 -0
  273. package/src/reducers/combinedReducer.ts +11 -0
  274. package/src/reducers/config.ts +38 -0
  275. package/src/reducers/cursors.js +36 -0
  276. package/src/reducers/deploys.ts +52 -0
  277. package/src/reducers/editorialWorkflow.ts +163 -0
  278. package/src/reducers/entries.ts +819 -0
  279. package/src/reducers/entryDraft.js +260 -0
  280. package/src/reducers/globalUI.ts +45 -0
  281. package/src/reducers/index.ts +82 -0
  282. package/src/reducers/integrations.ts +59 -0
  283. package/src/reducers/mediaLibrary.ts +296 -0
  284. package/src/reducers/medias.ts +66 -0
  285. package/src/reducers/notifications.ts +52 -0
  286. package/src/reducers/search.ts +111 -0
  287. package/src/reducers/status.ts +40 -0
  288. package/src/redux/index.ts +18 -0
  289. package/src/redux/middleware/waitUntilAction.ts +64 -0
  290. package/src/routing/__tests__/history.spec.ts +49 -0
  291. package/src/routing/history.ts +17 -0
  292. package/src/types/diacritics.d.ts +1 -0
  293. package/src/types/global.d.ts +8 -0
  294. package/src/types/immutable.ts +49 -0
  295. package/src/types/redux.ts +827 -0
  296. package/src/types/tomlify-j0.4.d.ts +13 -0
  297. package/src/valueObjects/AssetProxy.ts +48 -0
  298. package/src/valueObjects/EditorComponent.js +38 -0
  299. package/src/valueObjects/Entry.ts +63 -0
@@ -0,0 +1,480 @@
1
+ import get from 'lodash/get';
2
+ import { Map, List } from 'immutable';
3
+ import { EDITORIAL_WORKFLOW_ERROR } from 'decap-cms-lib-util';
4
+ import { currentBackend, slugFromCustomPath } from '../backend';
5
+ import { selectPublishedSlugs, selectUnpublishedSlugs, selectEntry, selectUnpublishedEntry } from '../reducers';
6
+ import { selectEditingDraft } from '../reducers/entries';
7
+ import { EDITORIAL_WORKFLOW, status } from '../constants/publishModes';
8
+ import { loadEntry, entryDeleted, getMediaAssets, createDraftFromEntry, loadEntries, getSerializedEntry } from './entries';
9
+ import { createAssetProxy } from '../valueObjects/AssetProxy';
10
+ import { addAssets } from './media';
11
+ import { loadMedia } from './mediaLibrary';
12
+ import ValidationErrorTypes from '../constants/validationErrorTypes';
13
+ import { navigateToEntry } from '../routing/history';
14
+ import { addNotification } from './notifications';
15
+ /*
16
+ * Constant Declarations
17
+ */
18
+ export const UNPUBLISHED_ENTRY_REQUEST = 'UNPUBLISHED_ENTRY_REQUEST';
19
+ export const UNPUBLISHED_ENTRY_SUCCESS = 'UNPUBLISHED_ENTRY_SUCCESS';
20
+ export const UNPUBLISHED_ENTRY_REDIRECT = 'UNPUBLISHED_ENTRY_REDIRECT';
21
+ export const UNPUBLISHED_ENTRIES_REQUEST = 'UNPUBLISHED_ENTRIES_REQUEST';
22
+ export const UNPUBLISHED_ENTRIES_SUCCESS = 'UNPUBLISHED_ENTRIES_SUCCESS';
23
+ export const UNPUBLISHED_ENTRIES_FAILURE = 'UNPUBLISHED_ENTRIES_FAILURE';
24
+ export const UNPUBLISHED_ENTRY_PERSIST_REQUEST = 'UNPUBLISHED_ENTRY_PERSIST_REQUEST';
25
+ export const UNPUBLISHED_ENTRY_PERSIST_SUCCESS = 'UNPUBLISHED_ENTRY_PERSIST_SUCCESS';
26
+ export const UNPUBLISHED_ENTRY_PERSIST_FAILURE = 'UNPUBLISHED_ENTRY_PERSIST_FAILURE';
27
+ export const UNPUBLISHED_ENTRY_STATUS_CHANGE_REQUEST = 'UNPUBLISHED_ENTRY_STATUS_CHANGE_REQUEST';
28
+ export const UNPUBLISHED_ENTRY_STATUS_CHANGE_SUCCESS = 'UNPUBLISHED_ENTRY_STATUS_CHANGE_SUCCESS';
29
+ export const UNPUBLISHED_ENTRY_STATUS_CHANGE_FAILURE = 'UNPUBLISHED_ENTRY_STATUS_CHANGE_FAILURE';
30
+ export const UNPUBLISHED_ENTRY_PUBLISH_REQUEST = 'UNPUBLISHED_ENTRY_PUBLISH_REQUEST';
31
+ export const UNPUBLISHED_ENTRY_PUBLISH_SUCCESS = 'UNPUBLISHED_ENTRY_PUBLISH_SUCCESS';
32
+ export const UNPUBLISHED_ENTRY_PUBLISH_FAILURE = 'UNPUBLISHED_ENTRY_PUBLISH_FAILURE';
33
+ export const UNPUBLISHED_ENTRY_DELETE_REQUEST = 'UNPUBLISHED_ENTRY_DELETE_REQUEST';
34
+ export const UNPUBLISHED_ENTRY_DELETE_SUCCESS = 'UNPUBLISHED_ENTRY_DELETE_SUCCESS';
35
+ export const UNPUBLISHED_ENTRY_DELETE_FAILURE = 'UNPUBLISHED_ENTRY_DELETE_FAILURE';
36
+
37
+ /*
38
+ * Simple Action Creators (Internal)
39
+ */
40
+
41
+ function unpublishedEntryLoading(collection, slug) {
42
+ return {
43
+ type: UNPUBLISHED_ENTRY_REQUEST,
44
+ payload: {
45
+ collection: collection.get('name'),
46
+ slug
47
+ }
48
+ };
49
+ }
50
+ function unpublishedEntryLoaded(collection, entry) {
51
+ return {
52
+ type: UNPUBLISHED_ENTRY_SUCCESS,
53
+ payload: {
54
+ collection: collection.get('name'),
55
+ entry
56
+ }
57
+ };
58
+ }
59
+ function unpublishedEntryRedirected(collection, slug) {
60
+ return {
61
+ type: UNPUBLISHED_ENTRY_REDIRECT,
62
+ payload: {
63
+ collection: collection.get('name'),
64
+ slug
65
+ }
66
+ };
67
+ }
68
+ function unpublishedEntriesLoading() {
69
+ return {
70
+ type: UNPUBLISHED_ENTRIES_REQUEST
71
+ };
72
+ }
73
+ function unpublishedEntriesLoaded(entries, pagination) {
74
+ return {
75
+ type: UNPUBLISHED_ENTRIES_SUCCESS,
76
+ payload: {
77
+ entries,
78
+ pages: pagination
79
+ }
80
+ };
81
+ }
82
+ function unpublishedEntriesFailed(error) {
83
+ return {
84
+ type: UNPUBLISHED_ENTRIES_FAILURE,
85
+ error: 'Failed to load entries',
86
+ payload: error
87
+ };
88
+ }
89
+ function unpublishedEntryPersisting(collection, slug) {
90
+ return {
91
+ type: UNPUBLISHED_ENTRY_PERSIST_REQUEST,
92
+ payload: {
93
+ collection: collection.get('name'),
94
+ slug
95
+ }
96
+ };
97
+ }
98
+ function unpublishedEntryPersisted(collection, entry) {
99
+ return {
100
+ type: UNPUBLISHED_ENTRY_PERSIST_SUCCESS,
101
+ payload: {
102
+ collection: collection.get('name'),
103
+ entry
104
+ }
105
+ };
106
+ }
107
+ function unpublishedEntryPersistedFail(error, collection, slug) {
108
+ return {
109
+ type: UNPUBLISHED_ENTRY_PERSIST_FAILURE,
110
+ payload: {
111
+ error,
112
+ collection: collection.get('name'),
113
+ slug
114
+ },
115
+ error
116
+ };
117
+ }
118
+ function unpublishedEntryStatusChangeRequest(collection, slug) {
119
+ return {
120
+ type: UNPUBLISHED_ENTRY_STATUS_CHANGE_REQUEST,
121
+ payload: {
122
+ collection,
123
+ slug
124
+ }
125
+ };
126
+ }
127
+ function unpublishedEntryStatusChangePersisted(collection, slug, newStatus) {
128
+ return {
129
+ type: UNPUBLISHED_ENTRY_STATUS_CHANGE_SUCCESS,
130
+ payload: {
131
+ collection,
132
+ slug,
133
+ newStatus
134
+ }
135
+ };
136
+ }
137
+ function unpublishedEntryStatusChangeError(collection, slug) {
138
+ return {
139
+ type: UNPUBLISHED_ENTRY_STATUS_CHANGE_FAILURE,
140
+ payload: {
141
+ collection,
142
+ slug
143
+ }
144
+ };
145
+ }
146
+ function unpublishedEntryPublishRequest(collection, slug) {
147
+ return {
148
+ type: UNPUBLISHED_ENTRY_PUBLISH_REQUEST,
149
+ payload: {
150
+ collection,
151
+ slug
152
+ }
153
+ };
154
+ }
155
+ function unpublishedEntryPublished(collection, slug) {
156
+ return {
157
+ type: UNPUBLISHED_ENTRY_PUBLISH_SUCCESS,
158
+ payload: {
159
+ collection,
160
+ slug
161
+ }
162
+ };
163
+ }
164
+ function unpublishedEntryPublishError(collection, slug) {
165
+ return {
166
+ type: UNPUBLISHED_ENTRY_PUBLISH_FAILURE,
167
+ payload: {
168
+ collection,
169
+ slug
170
+ }
171
+ };
172
+ }
173
+ function unpublishedEntryDeleteRequest(collection, slug) {
174
+ return {
175
+ type: UNPUBLISHED_ENTRY_DELETE_REQUEST,
176
+ payload: {
177
+ collection,
178
+ slug
179
+ }
180
+ };
181
+ }
182
+ function unpublishedEntryDeleted(collection, slug) {
183
+ return {
184
+ type: UNPUBLISHED_ENTRY_DELETE_SUCCESS,
185
+ payload: {
186
+ collection,
187
+ slug
188
+ }
189
+ };
190
+ }
191
+ function unpublishedEntryDeleteError(collection, slug) {
192
+ return {
193
+ type: UNPUBLISHED_ENTRY_DELETE_FAILURE,
194
+ payload: {
195
+ collection,
196
+ slug
197
+ }
198
+ };
199
+ }
200
+
201
+ /*
202
+ * Exported Thunk Action Creators
203
+ */
204
+
205
+ export function loadUnpublishedEntry(collection, slug) {
206
+ return async (dispatch, getState) => {
207
+ const state = getState();
208
+ const backend = currentBackend(state.config);
209
+ const entriesLoaded = get(state.editorialWorkflow.toJS(), 'pages.ids', false);
210
+ //run possible unpublishedEntries migration
211
+ if (!entriesLoaded) {
212
+ try {
213
+ const {
214
+ entries,
215
+ pagination
216
+ } = await backend.unpublishedEntries(state.collections);
217
+ dispatch(unpublishedEntriesLoaded(entries, pagination));
218
+ // eslint-disable-next-line no-empty
219
+ } catch (e) {}
220
+ }
221
+ dispatch(unpublishedEntryLoading(collection, slug));
222
+ try {
223
+ const entry = await backend.unpublishedEntry(state, collection, slug);
224
+ const assetProxies = await Promise.all(entry.mediaFiles.filter(file => file.draft).map(({
225
+ url,
226
+ file,
227
+ path
228
+ }) => createAssetProxy({
229
+ path,
230
+ url,
231
+ file
232
+ })));
233
+ dispatch(addAssets(assetProxies));
234
+ dispatch(unpublishedEntryLoaded(collection, entry));
235
+ dispatch(createDraftFromEntry(entry));
236
+ } catch (error) {
237
+ if (error.name === EDITORIAL_WORKFLOW_ERROR && error.notUnderEditorialWorkflow) {
238
+ dispatch(unpublishedEntryRedirected(collection, slug));
239
+ dispatch(loadEntry(collection, slug));
240
+ } else {
241
+ dispatch(addNotification({
242
+ message: {
243
+ key: 'ui.toast.onFailToLoadEntries',
244
+ details: error
245
+ },
246
+ type: 'error',
247
+ dismissAfter: 8000
248
+ }));
249
+ }
250
+ }
251
+ };
252
+ }
253
+ export function loadUnpublishedEntries(collections) {
254
+ return (dispatch, getState) => {
255
+ const state = getState();
256
+ const backend = currentBackend(state.config);
257
+ const entriesLoaded = get(state.editorialWorkflow.toJS(), 'pages.ids', false);
258
+ if (state.config.publish_mode !== EDITORIAL_WORKFLOW || entriesLoaded) {
259
+ return;
260
+ }
261
+ dispatch(unpublishedEntriesLoading());
262
+ backend.unpublishedEntries(collections).then(response => dispatch(unpublishedEntriesLoaded(response.entries, response.pagination))).catch(error => {
263
+ dispatch(addNotification({
264
+ message: {
265
+ key: 'ui.toast.onFailToLoadEntries',
266
+ details: error
267
+ },
268
+ type: 'error',
269
+ dismissAfter: 8000
270
+ }));
271
+ dispatch(unpublishedEntriesFailed(error));
272
+ Promise.reject(error);
273
+ });
274
+ };
275
+ }
276
+ export function persistUnpublishedEntry(collection, existingUnpublishedEntry) {
277
+ return async (dispatch, getState) => {
278
+ const state = getState();
279
+ const entryDraft = state.entryDraft;
280
+ const fieldsErrors = entryDraft.get('fieldsErrors');
281
+ const unpublishedSlugs = selectUnpublishedSlugs(state, collection.get('name'));
282
+ const publishedSlugs = selectPublishedSlugs(state, collection.get('name'));
283
+ const usedSlugs = publishedSlugs.concat(unpublishedSlugs);
284
+ const entriesLoaded = get(state.editorialWorkflow.toJS(), 'pages.ids', false);
285
+
286
+ //load unpublishedEntries
287
+ !entriesLoaded && dispatch(loadUnpublishedEntries(state.collections));
288
+
289
+ // Early return if draft contains validation errors
290
+ if (!fieldsErrors.isEmpty()) {
291
+ const hasPresenceErrors = fieldsErrors.some(errors => errors.some(error => error.type && error.type === ValidationErrorTypes.PRESENCE));
292
+ if (hasPresenceErrors) {
293
+ dispatch(addNotification({
294
+ message: {
295
+ key: 'ui.toast.missingRequiredField'
296
+ },
297
+ type: 'error',
298
+ dismissAfter: 8000
299
+ }));
300
+ }
301
+ return Promise.reject();
302
+ }
303
+ const backend = currentBackend(state.config);
304
+ const entry = entryDraft.get('entry');
305
+ const assetProxies = getMediaAssets({
306
+ entry
307
+ });
308
+ const serializedEntry = getSerializedEntry(collection, entry);
309
+ const serializedEntryDraft = entryDraft.set('entry', serializedEntry);
310
+ dispatch(unpublishedEntryPersisting(collection, entry.get('slug')));
311
+ const persistAction = existingUnpublishedEntry ? backend.persistUnpublishedEntry : backend.persistEntry;
312
+ try {
313
+ const newSlug = await persistAction.call(backend, {
314
+ config: state.config,
315
+ collection,
316
+ entryDraft: serializedEntryDraft,
317
+ assetProxies,
318
+ usedSlugs
319
+ });
320
+ dispatch(addNotification({
321
+ message: {
322
+ key: 'ui.toast.entrySaved'
323
+ },
324
+ type: 'success',
325
+ dismissAfter: 4000
326
+ }));
327
+ dispatch(unpublishedEntryPersisted(collection, serializedEntry));
328
+ if (entry.get('slug') !== newSlug) {
329
+ await dispatch(loadUnpublishedEntry(collection, newSlug));
330
+ navigateToEntry(collection.get('name'), newSlug);
331
+ }
332
+ } catch (error) {
333
+ dispatch(addNotification({
334
+ message: {
335
+ key: 'ui.toast.onFailToPersist',
336
+ details: error
337
+ },
338
+ type: 'error',
339
+ dismissAfter: 8000
340
+ }));
341
+ return Promise.reject(dispatch(unpublishedEntryPersistedFail(error, collection, entry.get('slug'))));
342
+ }
343
+ };
344
+ }
345
+ export function updateUnpublishedEntryStatus(collection, slug, oldStatus, newStatus) {
346
+ return (dispatch, getState) => {
347
+ if (oldStatus === newStatus) return;
348
+ const state = getState();
349
+ const backend = currentBackend(state.config);
350
+ dispatch(unpublishedEntryStatusChangeRequest(collection, slug));
351
+ backend.updateUnpublishedEntryStatus(collection, slug, newStatus).then(() => {
352
+ dispatch(addNotification({
353
+ message: {
354
+ key: 'ui.toast.entryUpdated'
355
+ },
356
+ type: 'success',
357
+ dismissAfter: 4000
358
+ }));
359
+ dispatch(unpublishedEntryStatusChangePersisted(collection, slug, newStatus));
360
+ }).catch(error => {
361
+ dispatch(addNotification({
362
+ message: {
363
+ key: 'ui.toast.onFailToUpdateStatus',
364
+ details: error
365
+ },
366
+ type: 'error',
367
+ dismissAfter: 8000
368
+ }));
369
+ dispatch(unpublishedEntryStatusChangeError(collection, slug));
370
+ });
371
+ };
372
+ }
373
+ export function deleteUnpublishedEntry(collection, slug) {
374
+ return (dispatch, getState) => {
375
+ const state = getState();
376
+ const backend = currentBackend(state.config);
377
+ dispatch(unpublishedEntryDeleteRequest(collection, slug));
378
+ return backend.deleteUnpublishedEntry(collection, slug).then(() => {
379
+ dispatch(addNotification({
380
+ message: {
381
+ key: 'ui.toast.onDeleteUnpublishedChanges'
382
+ },
383
+ type: 'success',
384
+ dismissAfter: 4000
385
+ }));
386
+ dispatch(unpublishedEntryDeleted(collection, slug));
387
+ }).catch(error => {
388
+ dispatch(addNotification({
389
+ message: {
390
+ key: 'ui.toast.onDeleteUnpublishedChanges',
391
+ details: error
392
+ },
393
+ type: 'error',
394
+ dismissAfter: 8000
395
+ }));
396
+ dispatch(unpublishedEntryDeleteError(collection, slug));
397
+ });
398
+ };
399
+ }
400
+ export function publishUnpublishedEntry(collectionName, slug) {
401
+ return async (dispatch, getState) => {
402
+ const state = getState();
403
+ const collections = state.collections;
404
+ const backend = currentBackend(state.config);
405
+ const entry = selectUnpublishedEntry(state, collectionName, slug);
406
+ dispatch(unpublishedEntryPublishRequest(collectionName, slug));
407
+ try {
408
+ await backend.publishUnpublishedEntry(entry);
409
+ // re-load media after entry was published
410
+ dispatch(loadMedia());
411
+ dispatch(addNotification({
412
+ message: {
413
+ key: 'ui.toast.entryPublished'
414
+ },
415
+ type: 'success',
416
+ dismissAfter: 4000
417
+ }));
418
+ dispatch(unpublishedEntryPublished(collectionName, slug));
419
+ const collection = collections.get(collectionName);
420
+ if (collection.has('nested')) {
421
+ dispatch(loadEntries(collection));
422
+ const newSlug = slugFromCustomPath(collection, entry.get('path'));
423
+ loadEntry(collection, newSlug);
424
+ if (slug !== newSlug && selectEditingDraft(state.entryDraft)) {
425
+ navigateToEntry(collection.get('name'), newSlug);
426
+ }
427
+ } else {
428
+ return dispatch(loadEntry(collection, slug));
429
+ }
430
+ } catch (error) {
431
+ dispatch(addNotification({
432
+ message: {
433
+ key: 'ui.toast.onFailToPublishEntry',
434
+ details: error
435
+ },
436
+ type: 'error',
437
+ dismissAfter: 8000
438
+ }));
439
+ dispatch(unpublishedEntryPublishError(collectionName, slug));
440
+ }
441
+ };
442
+ }
443
+ export function unpublishPublishedEntry(collection, slug) {
444
+ return (dispatch, getState) => {
445
+ const state = getState();
446
+ const backend = currentBackend(state.config);
447
+ const entry = selectEntry(state, collection.get('name'), slug);
448
+ const entryDraft = Map().set('entry', entry);
449
+ dispatch(unpublishedEntryPersisting(collection, slug));
450
+ return backend.deleteEntry(state, collection, slug).then(() => backend.persistEntry({
451
+ config: state.config,
452
+ collection,
453
+ entryDraft,
454
+ assetProxies: [],
455
+ usedSlugs: List(),
456
+ status: status.get('PENDING_PUBLISH')
457
+ })).then(() => {
458
+ dispatch(unpublishedEntryPersisted(collection, entry));
459
+ dispatch(entryDeleted(collection, slug));
460
+ dispatch(loadUnpublishedEntry(collection, slug));
461
+ dispatch(addNotification({
462
+ message: {
463
+ key: 'ui.toast.entryUnpublished'
464
+ },
465
+ type: 'success',
466
+ dismissAfter: 4000
467
+ }));
468
+ }).catch(error => {
469
+ dispatch(addNotification({
470
+ message: {
471
+ key: 'ui.toast.onFailToUnpublishEntry',
472
+ details: error
473
+ },
474
+ type: 'error',
475
+ dismissAfter: 8000
476
+ }));
477
+ dispatch(unpublishedEntryPersistedFail(error, collection, entry.get('slug')));
478
+ });
479
+ };
480
+ }