@evfrenkel/decap-cms-core 3.13.0-image-conversions.0

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 (306) hide show
  1. package/README.md +9 -0
  2. package/dist/20.decap-cms-core.js +2 -0
  3. package/dist/20.decap-cms-core.js.map +1 -0
  4. package/dist/3802306e7b58a11862fb.wasm +0 -0
  5. package/dist/@evfrenkel/20.decap-cms-core.js +2 -0
  6. package/dist/@evfrenkel/20.decap-cms-core.js.map +1 -0
  7. package/dist/@evfrenkel/decap-cms-core.js +44 -0
  8. package/dist/@evfrenkel/decap-cms-core.js.LICENSE.txt +126 -0
  9. package/dist/@evfrenkel/decap-cms-core.js.map +1 -0
  10. package/dist/decap-cms-core.js +47 -0
  11. package/dist/decap-cms-core.js.LICENSE.txt +126 -0
  12. package/dist/decap-cms-core.js.map +1 -0
  13. package/dist/esm/actions/auth.js +97 -0
  14. package/dist/esm/actions/collections.js +15 -0
  15. package/dist/esm/actions/config.js +503 -0
  16. package/dist/esm/actions/deploys.js +80 -0
  17. package/dist/esm/actions/editorialWorkflow.js +480 -0
  18. package/dist/esm/actions/entries.js +876 -0
  19. package/dist/esm/actions/media.js +147 -0
  20. package/dist/esm/actions/mediaLibrary.js +599 -0
  21. package/dist/esm/actions/notifications.js +21 -0
  22. package/dist/esm/actions/search.js +149 -0
  23. package/dist/esm/actions/status.js +74 -0
  24. package/dist/esm/actions/waitUntil.js +32 -0
  25. package/dist/esm/backend.js +1090 -0
  26. package/dist/esm/bootstrap.js +101 -0
  27. package/dist/esm/components/App/App.js +296 -0
  28. package/dist/esm/components/App/Header.js +172 -0
  29. package/dist/esm/components/App/NotFoundPage.js +19 -0
  30. package/dist/esm/components/Collection/Collection.js +198 -0
  31. package/dist/esm/components/Collection/CollectionControls.js +47 -0
  32. package/dist/esm/components/Collection/CollectionSearch.js +222 -0
  33. package/dist/esm/components/Collection/CollectionTop.js +68 -0
  34. package/dist/esm/components/Collection/ControlButton.js +17 -0
  35. package/dist/esm/components/Collection/Entries/Entries.js +73 -0
  36. package/dist/esm/components/Collection/Entries/EntriesCollection.js +241 -0
  37. package/dist/esm/components/Collection/Entries/EntriesSearch.js +113 -0
  38. package/dist/esm/components/Collection/Entries/EntryCard.js +192 -0
  39. package/dist/esm/components/Collection/Entries/EntryListing.js +143 -0
  40. package/dist/esm/components/Collection/FilterControl.js +33 -0
  41. package/dist/esm/components/Collection/GroupControl.js +33 -0
  42. package/dist/esm/components/Collection/NestedCollection.js +308 -0
  43. package/dist/esm/components/Collection/Sidebar.js +91 -0
  44. package/dist/esm/components/Collection/SortControl.js +59 -0
  45. package/dist/esm/components/Collection/ViewStyleControl.js +41 -0
  46. package/dist/esm/components/Editor/Editor.js +466 -0
  47. package/dist/esm/components/Editor/EditorControlPane/EditorControl.js +398 -0
  48. package/dist/esm/components/Editor/EditorControlPane/EditorControlPane.js +254 -0
  49. package/dist/esm/components/Editor/EditorControlPane/Widget.js +374 -0
  50. package/dist/esm/components/Editor/EditorInterface.js +386 -0
  51. package/dist/esm/components/Editor/EditorPreviewPane/EditorPreview.js +47 -0
  52. package/dist/esm/components/Editor/EditorPreviewPane/EditorPreviewContent.js +67 -0
  53. package/dist/esm/components/Editor/EditorPreviewPane/EditorPreviewPane.js +306 -0
  54. package/dist/esm/components/Editor/EditorPreviewPane/PreviewHOC.js +27 -0
  55. package/dist/esm/components/Editor/EditorToolbar.js +554 -0
  56. package/dist/esm/components/Editor/withWorkflow.js +56 -0
  57. package/dist/esm/components/EditorWidgets/Unknown/UnknownControl.js +18 -0
  58. package/dist/esm/components/EditorWidgets/Unknown/UnknownPreview.js +20 -0
  59. package/dist/esm/components/EditorWidgets/index.js +4 -0
  60. package/dist/esm/components/MediaLibrary/EmptyMessage.js +22 -0
  61. package/dist/esm/components/MediaLibrary/MediaLibrary.js +446 -0
  62. package/dist/esm/components/MediaLibrary/MediaLibraryButtons.js +92 -0
  63. package/dist/esm/components/MediaLibrary/MediaLibraryCard.js +99 -0
  64. package/dist/esm/components/MediaLibrary/MediaLibraryCardGrid.js +198 -0
  65. package/dist/esm/components/MediaLibrary/MediaLibraryHeader.js +34 -0
  66. package/dist/esm/components/MediaLibrary/MediaLibraryModal.js +156 -0
  67. package/dist/esm/components/MediaLibrary/MediaLibrarySearch.js +51 -0
  68. package/dist/esm/components/MediaLibrary/MediaLibraryTop.js +124 -0
  69. package/dist/esm/components/UI/DragDrop.js +67 -0
  70. package/dist/esm/components/UI/ErrorBoundary.js +170 -0
  71. package/dist/esm/components/UI/FileUploadButton.js +27 -0
  72. package/dist/esm/components/UI/Modal.js +104 -0
  73. package/dist/esm/components/UI/Notifications.js +62 -0
  74. package/dist/esm/components/UI/SettingsDropdown.js +107 -0
  75. package/dist/esm/components/UI/index.js +6 -0
  76. package/dist/esm/components/Workflow/Workflow.js +133 -0
  77. package/dist/esm/components/Workflow/WorkflowCard.js +128 -0
  78. package/dist/esm/components/Workflow/WorkflowList.js +204 -0
  79. package/dist/esm/constants/collectionTypes.js +2 -0
  80. package/dist/esm/constants/collectionViews.js +2 -0
  81. package/dist/esm/constants/commitProps.js +2 -0
  82. package/dist/esm/constants/configSchema.js +695 -0
  83. package/dist/esm/constants/fieldInference.js +57 -0
  84. package/dist/esm/constants/publishModes.js +18 -0
  85. package/dist/esm/constants/validationErrorTypes.js +6 -0
  86. package/dist/esm/formats/formats.js +83 -0
  87. package/dist/esm/formats/frontmatter.js +146 -0
  88. package/dist/esm/formats/helpers.js +12 -0
  89. package/dist/esm/formats/json.js +8 -0
  90. package/dist/esm/formats/toml.js +32 -0
  91. package/dist/esm/formats/yaml.js +60 -0
  92. package/dist/esm/index.js +7 -0
  93. package/dist/esm/integrations/index.js +28 -0
  94. package/dist/esm/integrations/providers/algolia/implementation.js +174 -0
  95. package/dist/esm/integrations/providers/assetStore/implementation.js +165 -0
  96. package/dist/esm/lib/consoleError.js +3 -0
  97. package/dist/esm/lib/formatters.js +201 -0
  98. package/dist/esm/lib/i18n.js +372 -0
  99. package/dist/esm/lib/imageTransformations.js +143 -0
  100. package/dist/esm/lib/phrases.js +6 -0
  101. package/dist/esm/lib/polyfill.js +8 -0
  102. package/dist/esm/lib/registry.js +332 -0
  103. package/dist/esm/lib/serializeEntryValues.js +67 -0
  104. package/dist/esm/lib/stega.js +142 -0
  105. package/dist/esm/lib/textHelper.js +9 -0
  106. package/dist/esm/lib/urlHelper.js +129 -0
  107. package/dist/esm/mediaLibrary.js +37 -0
  108. package/dist/esm/reducers/auth.js +27 -0
  109. package/dist/esm/reducers/collections.js +428 -0
  110. package/dist/esm/reducers/combinedReducer.js +8 -0
  111. package/dist/esm/reducers/config.js +29 -0
  112. package/dist/esm/reducers/cursors.js +31 -0
  113. package/dist/esm/reducers/deploys.js +50 -0
  114. package/dist/esm/reducers/editorialWorkflow.js +83 -0
  115. package/dist/esm/reducers/entries.js +568 -0
  116. package/dist/esm/reducers/entryDraft.js +211 -0
  117. package/dist/esm/reducers/globalUI.js +25 -0
  118. package/dist/esm/reducers/index.js +66 -0
  119. package/dist/esm/reducers/integrations.js +53 -0
  120. package/dist/esm/reducers/mediaLibrary.js +252 -0
  121. package/dist/esm/reducers/medias.js +68 -0
  122. package/dist/esm/reducers/notifications.js +23 -0
  123. package/dist/esm/reducers/search.js +92 -0
  124. package/dist/esm/reducers/status.js +30 -0
  125. package/dist/esm/redux/index.js +7 -0
  126. package/dist/esm/redux/middleware/waitUntilAction.js +48 -0
  127. package/dist/esm/routing/history.js +12 -0
  128. package/dist/esm/types/diacritics.d.js +0 -0
  129. package/dist/esm/types/global.d.js +1 -0
  130. package/dist/esm/types/immutable.js +7 -0
  131. package/dist/esm/types/redux.js +14 -0
  132. package/dist/esm/types/tomlify-j0.4.d.js +0 -0
  133. package/dist/esm/valueObjects/AssetProxy.js +44 -0
  134. package/dist/esm/valueObjects/EditorComponent.js +34 -0
  135. package/dist/esm/valueObjects/Entry.js +20 -0
  136. package/index.d.ts +662 -0
  137. package/package.json +100 -0
  138. package/src/__tests__/backend.spec.js +1223 -0
  139. package/src/actions/__tests__/config.spec.js +1023 -0
  140. package/src/actions/__tests__/editorialWorkflow.spec.js +216 -0
  141. package/src/actions/__tests__/entries.spec.js +610 -0
  142. package/src/actions/__tests__/media.spec.ts +171 -0
  143. package/src/actions/__tests__/mediaLibrary.spec.js +462 -0
  144. package/src/actions/__tests__/search.spec.js +209 -0
  145. package/src/actions/auth.ts +127 -0
  146. package/src/actions/collections.ts +18 -0
  147. package/src/actions/config.ts +574 -0
  148. package/src/actions/deploys.ts +105 -0
  149. package/src/actions/editorialWorkflow.ts +567 -0
  150. package/src/actions/entries.ts +1070 -0
  151. package/src/actions/media.ts +139 -0
  152. package/src/actions/mediaLibrary.ts +639 -0
  153. package/src/actions/notifications.ts +36 -0
  154. package/src/actions/search.ts +221 -0
  155. package/src/actions/status.ts +99 -0
  156. package/src/actions/waitUntil.ts +49 -0
  157. package/src/backend.ts +1411 -0
  158. package/src/bootstrap.js +104 -0
  159. package/src/components/App/App.js +295 -0
  160. package/src/components/App/Header.js +291 -0
  161. package/src/components/App/NotFoundPage.js +23 -0
  162. package/src/components/Collection/Collection.js +210 -0
  163. package/src/components/Collection/CollectionControls.js +58 -0
  164. package/src/components/Collection/CollectionSearch.js +243 -0
  165. package/src/components/Collection/CollectionTop.js +81 -0
  166. package/src/components/Collection/ControlButton.js +27 -0
  167. package/src/components/Collection/Entries/Entries.js +82 -0
  168. package/src/components/Collection/Entries/EntriesCollection.js +277 -0
  169. package/src/components/Collection/Entries/EntriesSearch.js +102 -0
  170. package/src/components/Collection/Entries/EntryCard.js +256 -0
  171. package/src/components/Collection/Entries/EntryListing.js +151 -0
  172. package/src/components/Collection/Entries/__tests__/EntriesCollection.spec.js +163 -0
  173. package/src/components/Collection/Entries/__tests__/__snapshots__/EntriesCollection.spec.js.snap +46 -0
  174. package/src/components/Collection/FilterControl.js +39 -0
  175. package/src/components/Collection/GroupControl.js +39 -0
  176. package/src/components/Collection/NestedCollection.js +330 -0
  177. package/src/components/Collection/Sidebar.js +136 -0
  178. package/src/components/Collection/SortControl.js +68 -0
  179. package/src/components/Collection/ViewStyleControl.js +52 -0
  180. package/src/components/Collection/__tests__/Collection.spec.js +75 -0
  181. package/src/components/Collection/__tests__/NestedCollection.spec.js +445 -0
  182. package/src/components/Collection/__tests__/Sidebar.spec.js +87 -0
  183. package/src/components/Collection/__tests__/__snapshots__/Collection.spec.js.snap +144 -0
  184. package/src/components/Collection/__tests__/__snapshots__/NestedCollection.spec.js.snap +550 -0
  185. package/src/components/Collection/__tests__/__snapshots__/Sidebar.spec.js.snap +312 -0
  186. package/src/components/Editor/Editor.js +497 -0
  187. package/src/components/Editor/EditorControlPane/EditorControl.js +453 -0
  188. package/src/components/Editor/EditorControlPane/EditorControlPane.js +269 -0
  189. package/src/components/Editor/EditorControlPane/Widget.js +384 -0
  190. package/src/components/Editor/EditorInterface.js +444 -0
  191. package/src/components/Editor/EditorPreviewPane/EditorPreview.js +40 -0
  192. package/src/components/Editor/EditorPreviewPane/EditorPreviewContent.js +75 -0
  193. package/src/components/Editor/EditorPreviewPane/EditorPreviewPane.js +337 -0
  194. package/src/components/Editor/EditorPreviewPane/PreviewHOC.js +33 -0
  195. package/src/components/Editor/EditorToolbar.js +728 -0
  196. package/src/components/Editor/__tests__/Editor.spec.js +221 -0
  197. package/src/components/Editor/__tests__/EditorToolbar.spec.js +166 -0
  198. package/src/components/Editor/__tests__/__snapshots__/Editor.spec.js.snap +45 -0
  199. package/src/components/Editor/__tests__/__snapshots__/EditorToolbar.spec.js.snap +4265 -0
  200. package/src/components/Editor/withWorkflow.js +61 -0
  201. package/src/components/EditorWidgets/Unknown/UnknownControl.js +17 -0
  202. package/src/components/EditorWidgets/Unknown/UnknownPreview.js +19 -0
  203. package/src/components/EditorWidgets/index.js +5 -0
  204. package/src/components/MediaLibrary/EmptyMessage.js +28 -0
  205. package/src/components/MediaLibrary/MediaLibrary.js +411 -0
  206. package/src/components/MediaLibrary/MediaLibraryButtons.js +135 -0
  207. package/src/components/MediaLibrary/MediaLibraryCard.js +128 -0
  208. package/src/components/MediaLibrary/MediaLibraryCardGrid.js +199 -0
  209. package/src/components/MediaLibrary/MediaLibraryHeader.js +48 -0
  210. package/src/components/MediaLibrary/MediaLibraryModal.js +200 -0
  211. package/src/components/MediaLibrary/MediaLibrarySearch.js +61 -0
  212. package/src/components/MediaLibrary/MediaLibraryTop.js +144 -0
  213. package/src/components/MediaLibrary/__tests__/MediaLibraryButtons.spec.js +45 -0
  214. package/src/components/MediaLibrary/__tests__/MediaLibraryCard.spec.js +49 -0
  215. package/src/components/MediaLibrary/__tests__/__snapshots__/MediaLibraryCard.spec.js.snap +264 -0
  216. package/src/components/UI/DragDrop.js +66 -0
  217. package/src/components/UI/ErrorBoundary.js +213 -0
  218. package/src/components/UI/FileUploadButton.js +24 -0
  219. package/src/components/UI/Modal.js +112 -0
  220. package/src/components/UI/Notifications.tsx +83 -0
  221. package/src/components/UI/SettingsDropdown.js +130 -0
  222. package/src/components/UI/__tests__/ErrorBoundary.spec.js +57 -0
  223. package/src/components/UI/index.js +6 -0
  224. package/src/components/Workflow/Workflow.js +169 -0
  225. package/src/components/Workflow/WorkflowCard.js +177 -0
  226. package/src/components/Workflow/WorkflowList.js +272 -0
  227. package/src/constants/__tests__/configSchema.spec.js +644 -0
  228. package/src/constants/collectionTypes.ts +2 -0
  229. package/src/constants/collectionViews.js +2 -0
  230. package/src/constants/commitProps.ts +2 -0
  231. package/src/constants/configSchema.js +489 -0
  232. package/src/constants/fieldInference.tsx +78 -0
  233. package/src/constants/publishModes.ts +22 -0
  234. package/src/constants/validationErrorTypes.js +6 -0
  235. package/src/formats/__tests__/formats.spec.js +87 -0
  236. package/src/formats/__tests__/frontmatter.spec.js +450 -0
  237. package/src/formats/__tests__/toml.spec.js +9 -0
  238. package/src/formats/__tests__/yaml.spec.js +189 -0
  239. package/src/formats/formats.ts +97 -0
  240. package/src/formats/frontmatter.ts +150 -0
  241. package/src/formats/helpers.ts +14 -0
  242. package/src/formats/json.ts +9 -0
  243. package/src/formats/toml.ts +33 -0
  244. package/src/formats/yaml.ts +73 -0
  245. package/src/index.js +8 -0
  246. package/src/integrations/index.js +35 -0
  247. package/src/integrations/providers/algolia/implementation.js +176 -0
  248. package/src/integrations/providers/assetStore/implementation.js +148 -0
  249. package/src/lib/__tests__/formatters.spec.js +844 -0
  250. package/src/lib/__tests__/i18n.spec.js +792 -0
  251. package/src/lib/__tests__/imageTransformations.spec.ts +97 -0
  252. package/src/lib/__tests__/phrases.spec.js +119 -0
  253. package/src/lib/__tests__/registry.spec.js +261 -0
  254. package/src/lib/__tests__/serializeEntryValues.spec.js +22 -0
  255. package/src/lib/__tests__/urlHelper.spec.js +145 -0
  256. package/src/lib/consoleError.js +7 -0
  257. package/src/lib/formatters.ts +297 -0
  258. package/src/lib/i18n.ts +462 -0
  259. package/src/lib/imageTransformations.ts +212 -0
  260. package/src/lib/phrases.js +8 -0
  261. package/src/lib/polyfill.js +9 -0
  262. package/src/lib/registry.js +315 -0
  263. package/src/lib/serializeEntryValues.js +75 -0
  264. package/src/lib/stega.ts +145 -0
  265. package/src/lib/textHelper.js +11 -0
  266. package/src/lib/urlHelper.ts +152 -0
  267. package/src/mediaLibrary.ts +51 -0
  268. package/src/reducers/__tests__/auth.spec.ts +38 -0
  269. package/src/reducers/__tests__/collections.spec.js +610 -0
  270. package/src/reducers/__tests__/config.spec.js +38 -0
  271. package/src/reducers/__tests__/deploys.spec.ts +111 -0
  272. package/src/reducers/__tests__/entries.spec.js +694 -0
  273. package/src/reducers/__tests__/entryDraft.spec.js +315 -0
  274. package/src/reducers/__tests__/globalUI.js +43 -0
  275. package/src/reducers/__tests__/integrations.spec.ts +76 -0
  276. package/src/reducers/__tests__/mediaLibrary.spec.js +154 -0
  277. package/src/reducers/__tests__/medias.spec.ts +49 -0
  278. package/src/reducers/auth.ts +46 -0
  279. package/src/reducers/collections.ts +535 -0
  280. package/src/reducers/combinedReducer.ts +11 -0
  281. package/src/reducers/config.ts +38 -0
  282. package/src/reducers/cursors.js +36 -0
  283. package/src/reducers/deploys.ts +54 -0
  284. package/src/reducers/editorialWorkflow.ts +163 -0
  285. package/src/reducers/entries.ts +819 -0
  286. package/src/reducers/entryDraft.js +259 -0
  287. package/src/reducers/globalUI.ts +45 -0
  288. package/src/reducers/index.ts +82 -0
  289. package/src/reducers/integrations.ts +59 -0
  290. package/src/reducers/mediaLibrary.ts +296 -0
  291. package/src/reducers/medias.ts +66 -0
  292. package/src/reducers/notifications.ts +52 -0
  293. package/src/reducers/search.ts +111 -0
  294. package/src/reducers/status.ts +40 -0
  295. package/src/redux/index.ts +18 -0
  296. package/src/redux/middleware/waitUntilAction.ts +64 -0
  297. package/src/routing/__tests__/history.spec.ts +49 -0
  298. package/src/routing/history.ts +17 -0
  299. package/src/types/diacritics.d.ts +1 -0
  300. package/src/types/global.d.ts +8 -0
  301. package/src/types/immutable.ts +49 -0
  302. package/src/types/redux.ts +875 -0
  303. package/src/types/tomlify-j0.4.d.ts +13 -0
  304. package/src/valueObjects/AssetProxy.ts +48 -0
  305. package/src/valueObjects/EditorComponent.js +38 -0
  306. package/src/valueObjects/Entry.ts +63 -0
@@ -0,0 +1,599 @@
1
+ import { Map } from 'immutable';
2
+ import { basename, getBlobSHA } from 'decap-cms-lib-util';
3
+ import { currentBackend } from '../backend';
4
+ import { createAssetProxy } from '../valueObjects/AssetProxy';
5
+ import { selectIntegration } from '../reducers';
6
+ import { selectMediaFilePath, selectMediaFilePublicPath, selectEditingDraft } from '../reducers/entries';
7
+ import { selectMediaDisplayURL, selectMediaFiles } from '../reducers/mediaLibrary';
8
+ import { getIntegrationProvider } from '../integrations';
9
+ import { addAsset, removeAsset } from './media';
10
+ import { addDraftEntryMediaFile, removeDraftEntryMediaFile } from './entries';
11
+ import { sanitizeSlug } from '../lib/urlHelper';
12
+ import { waitUntilWithTimeout } from './waitUntil';
13
+ import { addNotification } from './notifications';
14
+ import { getImageTransformationsConfig, shouldTransformImage, sortTransformationFilesForSelection, transformImage } from '../lib/imageTransformations';
15
+ export const MEDIA_LIBRARY_OPEN = 'MEDIA_LIBRARY_OPEN';
16
+ export const MEDIA_LIBRARY_CLOSE = 'MEDIA_LIBRARY_CLOSE';
17
+ export const MEDIA_LIBRARY_CREATE = 'MEDIA_LIBRARY_CREATE';
18
+ export const MEDIA_INSERT = 'MEDIA_INSERT';
19
+ export const MEDIA_REMOVE_INSERTED = 'MEDIA_REMOVE_INSERTED';
20
+ export const MEDIA_LOAD_REQUEST = 'MEDIA_LOAD_REQUEST';
21
+ export const MEDIA_LOAD_SUCCESS = 'MEDIA_LOAD_SUCCESS';
22
+ export const MEDIA_LOAD_FAILURE = 'MEDIA_LOAD_FAILURE';
23
+ export const MEDIA_PERSIST_REQUEST = 'MEDIA_PERSIST_REQUEST';
24
+ export const MEDIA_PERSIST_SUCCESS = 'MEDIA_PERSIST_SUCCESS';
25
+ export const MEDIA_PERSIST_FAILURE = 'MEDIA_PERSIST_FAILURE';
26
+ export const MEDIA_DELETE_REQUEST = 'MEDIA_DELETE_REQUEST';
27
+ export const MEDIA_DELETE_SUCCESS = 'MEDIA_DELETE_SUCCESS';
28
+ export const MEDIA_DELETE_FAILURE = 'MEDIA_DELETE_FAILURE';
29
+ export const MEDIA_DISPLAY_URL_REQUEST = 'MEDIA_DISPLAY_URL_REQUEST';
30
+ export const MEDIA_DISPLAY_URL_SUCCESS = 'MEDIA_DISPLAY_URL_SUCCESS';
31
+ export const MEDIA_DISPLAY_URL_FAILURE = 'MEDIA_DISPLAY_URL_FAILURE';
32
+ export function createMediaLibrary(instance) {
33
+ const api = {
34
+ show: instance.show || (() => undefined),
35
+ hide: instance.hide || (() => undefined),
36
+ onClearControl: instance.onClearControl || (() => undefined),
37
+ onRemoveControl: instance.onRemoveControl || (() => undefined),
38
+ enableStandalone: instance.enableStandalone || (() => undefined)
39
+ };
40
+ return {
41
+ type: MEDIA_LIBRARY_CREATE,
42
+ payload: api
43
+ };
44
+ }
45
+ export function clearMediaControl(id) {
46
+ return (_dispatch, getState) => {
47
+ const state = getState();
48
+ const mediaLibrary = state.mediaLibrary.get('externalLibrary');
49
+ if (mediaLibrary) {
50
+ mediaLibrary.onClearControl({
51
+ id
52
+ });
53
+ }
54
+ };
55
+ }
56
+ export function removeMediaControl(id) {
57
+ return (_dispatch, getState) => {
58
+ const state = getState();
59
+ const mediaLibrary = state.mediaLibrary.get('externalLibrary');
60
+ if (mediaLibrary) {
61
+ mediaLibrary.onRemoveControl({
62
+ id
63
+ });
64
+ }
65
+ };
66
+ }
67
+ export function openMediaLibrary(payload = {}) {
68
+ return (dispatch, getState) => {
69
+ const state = getState();
70
+ const mediaLibrary = state.mediaLibrary.get('externalLibrary');
71
+ if (mediaLibrary) {
72
+ const {
73
+ controlID: id,
74
+ value,
75
+ config = Map(),
76
+ allowMultiple,
77
+ forImage
78
+ } = payload;
79
+ mediaLibrary.show({
80
+ id,
81
+ value,
82
+ config: config.toJS(),
83
+ allowMultiple,
84
+ imagesOnly: forImage
85
+ });
86
+ }
87
+ dispatch(mediaLibraryOpened(payload));
88
+ };
89
+ }
90
+ export function closeMediaLibrary() {
91
+ return (dispatch, getState) => {
92
+ const state = getState();
93
+ const mediaLibrary = state.mediaLibrary.get('externalLibrary');
94
+ if (mediaLibrary) {
95
+ mediaLibrary.hide();
96
+ }
97
+ dispatch(mediaLibraryClosed());
98
+ };
99
+ }
100
+ export function insertMedia(mediaPath, field) {
101
+ return (dispatch, getState) => {
102
+ const state = getState();
103
+ const config = state.config;
104
+ const entry = state.entryDraft.get('entry');
105
+ const collectionName = state.entryDraft.getIn(['entry', 'collection']);
106
+ const collection = state.collections.get(collectionName);
107
+ if (Array.isArray(mediaPath)) {
108
+ mediaPath = mediaPath.map(path => selectMediaFilePublicPath(config, collection, path, entry, field));
109
+ } else {
110
+ mediaPath = selectMediaFilePublicPath(config, collection, mediaPath, entry, field);
111
+ }
112
+ dispatch(mediaInserted(mediaPath));
113
+ };
114
+ }
115
+ export function removeInsertedMedia(controlID) {
116
+ return {
117
+ type: MEDIA_REMOVE_INSERTED,
118
+ payload: {
119
+ controlID
120
+ }
121
+ };
122
+ }
123
+ export function loadMedia(opts = {}) {
124
+ const {
125
+ delay = 0,
126
+ query = '',
127
+ page = 1,
128
+ privateUpload
129
+ } = opts;
130
+ return async (dispatch, getState) => {
131
+ const state = getState();
132
+ const backend = currentBackend(state.config);
133
+ const integration = selectIntegration(state, null, 'assetStore');
134
+ if (integration) {
135
+ const provider = getIntegrationProvider(state.integrations, backend.getToken, integration);
136
+ dispatch(mediaLoading(page));
137
+ try {
138
+ const files = await provider.retrieve(query, page, privateUpload);
139
+ const mediaLoadedOpts = {
140
+ page,
141
+ canPaginate: true,
142
+ dynamicSearch: true,
143
+ dynamicSearchQuery: query,
144
+ privateUpload
145
+ };
146
+ return dispatch(mediaLoaded(files, mediaLoadedOpts));
147
+ } catch (error) {
148
+ return dispatch(mediaLoadFailed({
149
+ privateUpload
150
+ }));
151
+ }
152
+ }
153
+ dispatch(mediaLoading(page));
154
+ function loadFunction() {
155
+ return backend.getMedia().then(files => dispatch(mediaLoaded(files))).catch(error => {
156
+ console.error(error);
157
+ if (error.status === 404) {
158
+ console.log('This 404 was expected and handled appropriately.');
159
+ dispatch(mediaLoaded([]));
160
+ } else {
161
+ dispatch(mediaLoadFailed());
162
+ }
163
+ });
164
+ }
165
+ if (delay > 0) {
166
+ return new Promise(resolve => {
167
+ setTimeout(() => resolve(loadFunction()), delay);
168
+ });
169
+ } else {
170
+ return loadFunction();
171
+ }
172
+ };
173
+ }
174
+ function createMediaFileFromAsset({
175
+ id,
176
+ file,
177
+ assetProxy,
178
+ draft
179
+ }) {
180
+ const mediaFile = {
181
+ id,
182
+ name: basename(assetProxy.path),
183
+ displayURL: assetProxy.url,
184
+ draft,
185
+ file,
186
+ size: file.size,
187
+ url: assetProxy.url,
188
+ path: assetProxy.path,
189
+ field: assetProxy.field
190
+ };
191
+ return mediaFile;
192
+ }
193
+ async function getMediaFilesForUpload({
194
+ file,
195
+ fileName,
196
+ path,
197
+ config,
198
+ field
199
+ }) {
200
+ const imageTransformations = getImageTransformationsConfig(config, field);
201
+ if (!shouldTransformImage(file, imageTransformations)) {
202
+ return [{
203
+ file,
204
+ path
205
+ }];
206
+ }
207
+ const transformedFiles = await transformImage(file, path, imageTransformations);
208
+ return sortTransformationFilesForSelection(transformedFiles).map(transformedFile => ({
209
+ file: transformedFile.file,
210
+ path: transformedFile.path || fileName
211
+ }));
212
+ }
213
+ export function persistMedia(file, opts = {}) {
214
+ const {
215
+ privateUpload,
216
+ field
217
+ } = opts;
218
+ return async (dispatch, getState) => {
219
+ const state = getState();
220
+ const backend = currentBackend(state.config);
221
+ const integration = selectIntegration(state, null, 'assetStore');
222
+ const files = selectMediaFiles(state, field);
223
+ const fileName = sanitizeSlug(file.name.toLowerCase(), state.config.slug);
224
+ const imageTransformations = !integration ? getImageTransformationsConfig(state.config, field) : undefined;
225
+ const uploadsOriginal = !shouldTransformImage(file, imageTransformations) || imageTransformations?.keepOriginal;
226
+ const existingFile = files.find(existingFile => existingFile.name.toLowerCase() === fileName);
227
+ const editingDraft = selectEditingDraft(state.entryDraft);
228
+
229
+ /**
230
+ * Check for existing files of the same name before persisting. If no asset
231
+ * store integration is used, files are being stored in Git, so we can
232
+ * expect file names to be unique. If an asset store is in use, file names
233
+ * may not be unique, so we forego this check.
234
+ */
235
+ if (!integration && uploadsOriginal && existingFile) {
236
+ if (!window.confirm(`${existingFile.name} already exists. Do you want to replace it?`)) {
237
+ return;
238
+ } else {
239
+ await dispatch(deleteMedia(existingFile, {
240
+ privateUpload
241
+ }));
242
+ }
243
+ }
244
+ if (integration || !editingDraft) {
245
+ dispatch(mediaPersisting());
246
+ }
247
+ try {
248
+ let assetProxies;
249
+ if (integration) {
250
+ try {
251
+ const provider = getIntegrationProvider(state.integrations, backend.getToken, integration);
252
+ const response = await provider.upload(file, privateUpload);
253
+ assetProxies = [{
254
+ file,
255
+ assetProxy: createAssetProxy({
256
+ url: response.asset.url,
257
+ path: response.asset.url
258
+ })
259
+ }];
260
+ } catch (error) {
261
+ assetProxies = [{
262
+ file,
263
+ assetProxy: createAssetProxy({
264
+ file,
265
+ path: fileName
266
+ })
267
+ }];
268
+ }
269
+ } else if (privateUpload) {
270
+ throw new Error('The Private Upload option is only available for Asset Store Integration');
271
+ } else {
272
+ const entry = state.entryDraft.get('entry');
273
+ const collection = state.collections.get(entry?.get('collection'));
274
+ const path = selectMediaFilePath(state.config, collection, entry, fileName, field);
275
+ const mediaFiles = await getMediaFilesForUpload({
276
+ file,
277
+ fileName,
278
+ path,
279
+ config: state.config,
280
+ field
281
+ });
282
+ assetProxies = mediaFiles.map(mediaFile => ({
283
+ file: mediaFile.file,
284
+ assetProxy: createAssetProxy({
285
+ file: mediaFile.file,
286
+ path: mediaFile.path,
287
+ field
288
+ })
289
+ }));
290
+ }
291
+ let lastDispatch;
292
+ for (const {
293
+ file,
294
+ assetProxy
295
+ } of assetProxies) {
296
+ dispatch(addAsset(assetProxy));
297
+ let mediaFile;
298
+ if (integration) {
299
+ const id = await getBlobSHA(file);
300
+ // integration assets are persisted immediately, thus draft is false
301
+ mediaFile = createMediaFileFromAsset({
302
+ id,
303
+ file,
304
+ assetProxy,
305
+ draft: false
306
+ });
307
+ } else if (editingDraft) {
308
+ const id = await getBlobSHA(file);
309
+ mediaFile = createMediaFileFromAsset({
310
+ id,
311
+ file,
312
+ assetProxy,
313
+ draft: editingDraft
314
+ });
315
+ lastDispatch = dispatch(addDraftEntryMediaFile(mediaFile));
316
+ continue;
317
+ } else {
318
+ mediaFile = await backend.persistMedia(state.config, assetProxy);
319
+ }
320
+ lastDispatch = dispatch(mediaPersisted(mediaFile, {
321
+ privateUpload
322
+ }));
323
+ }
324
+ return lastDispatch;
325
+ } catch (error) {
326
+ console.error(error);
327
+ dispatch(addNotification({
328
+ message: `Failed to persist media: ${error}`,
329
+ type: 'error',
330
+ dismissAfter: 8000
331
+ }));
332
+ return dispatch(mediaPersistFailed({
333
+ privateUpload
334
+ }));
335
+ }
336
+ };
337
+ }
338
+ export function deleteMedia(file, opts = {}) {
339
+ const {
340
+ privateUpload
341
+ } = opts;
342
+ return async (dispatch, getState) => {
343
+ const state = getState();
344
+ const backend = currentBackend(state.config);
345
+ const integration = selectIntegration(state, null, 'assetStore');
346
+ if (integration) {
347
+ const provider = getIntegrationProvider(state.integrations, backend.getToken, integration);
348
+ dispatch(mediaDeleting());
349
+ try {
350
+ await provider.delete(file.id);
351
+ return dispatch(mediaDeleted(file, {
352
+ privateUpload
353
+ }));
354
+ } catch (error) {
355
+ console.error(error);
356
+ dispatch(addNotification({
357
+ message: `Failed to delete media: ${error.message}`,
358
+ type: 'error',
359
+ dismissAfter: 8000
360
+ }));
361
+ return dispatch(mediaDeleteFailed({
362
+ privateUpload
363
+ }));
364
+ }
365
+ }
366
+ try {
367
+ if (file.draft) {
368
+ dispatch(removeAsset(file.path));
369
+ dispatch(removeDraftEntryMediaFile({
370
+ id: file.id
371
+ }));
372
+ } else {
373
+ const editingDraft = selectEditingDraft(state.entryDraft);
374
+ dispatch(mediaDeleting());
375
+ dispatch(removeAsset(file.path));
376
+ await backend.deleteMedia(state.config, file.path);
377
+ dispatch(mediaDeleted(file));
378
+ if (editingDraft) {
379
+ dispatch(removeDraftEntryMediaFile({
380
+ id: file.id
381
+ }));
382
+ }
383
+ }
384
+ } catch (error) {
385
+ console.error(error);
386
+ dispatch(addNotification({
387
+ message: `Failed to delete media: ${error.message}`,
388
+ type: 'error',
389
+ dismissAfter: 8000
390
+ }));
391
+ return dispatch(mediaDeleteFailed());
392
+ }
393
+ };
394
+ }
395
+ export async function getMediaFile(state, path) {
396
+ const backend = currentBackend(state.config);
397
+ const {
398
+ url
399
+ } = await backend.getMediaFile(path);
400
+ return {
401
+ url
402
+ };
403
+ }
404
+ export function loadMediaDisplayURL(file) {
405
+ return async (dispatch, getState) => {
406
+ const {
407
+ displayURL,
408
+ id
409
+ } = file;
410
+ const state = getState();
411
+ const displayURLState = selectMediaDisplayURL(state, id);
412
+ if (!id || !displayURL || displayURLState.get('url') || displayURLState.get('isFetching') || displayURLState.get('err')) {
413
+ return Promise.resolve();
414
+ }
415
+ if (typeof displayURL === 'string') {
416
+ dispatch(mediaDisplayURLRequest(id));
417
+ dispatch(mediaDisplayURLSuccess(id, displayURL));
418
+ return;
419
+ }
420
+ try {
421
+ const backend = currentBackend(state.config);
422
+ dispatch(mediaDisplayURLRequest(id));
423
+ const newURL = await backend.getMediaDisplayURL(displayURL);
424
+ if (newURL) {
425
+ dispatch(mediaDisplayURLSuccess(id, newURL));
426
+ } else {
427
+ throw new Error('No display URL was returned!');
428
+ }
429
+ } catch (err) {
430
+ console.error(err);
431
+ dispatch(mediaDisplayURLFailure(id, err));
432
+ }
433
+ };
434
+ }
435
+ function mediaLibraryOpened(payload) {
436
+ return {
437
+ type: MEDIA_LIBRARY_OPEN,
438
+ payload
439
+ };
440
+ }
441
+ function mediaLibraryClosed() {
442
+ return {
443
+ type: MEDIA_LIBRARY_CLOSE
444
+ };
445
+ }
446
+ function mediaInserted(mediaPath) {
447
+ return {
448
+ type: MEDIA_INSERT,
449
+ payload: {
450
+ mediaPath
451
+ }
452
+ };
453
+ }
454
+ export function mediaLoading(page) {
455
+ return {
456
+ type: MEDIA_LOAD_REQUEST,
457
+ payload: {
458
+ page
459
+ }
460
+ };
461
+ }
462
+ export function mediaLoaded(files, opts = {}) {
463
+ return {
464
+ type: MEDIA_LOAD_SUCCESS,
465
+ payload: {
466
+ files,
467
+ ...opts
468
+ }
469
+ };
470
+ }
471
+ export function mediaLoadFailed(opts = {}) {
472
+ const {
473
+ privateUpload
474
+ } = opts;
475
+ return {
476
+ type: MEDIA_LOAD_FAILURE,
477
+ payload: {
478
+ privateUpload
479
+ }
480
+ };
481
+ }
482
+ export function mediaPersisting() {
483
+ return {
484
+ type: MEDIA_PERSIST_REQUEST
485
+ };
486
+ }
487
+ export function mediaPersisted(file, opts = {}) {
488
+ const {
489
+ privateUpload
490
+ } = opts;
491
+ return {
492
+ type: MEDIA_PERSIST_SUCCESS,
493
+ payload: {
494
+ file,
495
+ privateUpload
496
+ }
497
+ };
498
+ }
499
+ export function mediaPersistFailed(opts = {}) {
500
+ const {
501
+ privateUpload
502
+ } = opts;
503
+ return {
504
+ type: MEDIA_PERSIST_FAILURE,
505
+ payload: {
506
+ privateUpload
507
+ }
508
+ };
509
+ }
510
+ export function mediaDeleting() {
511
+ return {
512
+ type: MEDIA_DELETE_REQUEST
513
+ };
514
+ }
515
+ export function mediaDeleted(file, opts = {}) {
516
+ const {
517
+ privateUpload
518
+ } = opts;
519
+ return {
520
+ type: MEDIA_DELETE_SUCCESS,
521
+ payload: {
522
+ file,
523
+ privateUpload
524
+ }
525
+ };
526
+ }
527
+ export function mediaDeleteFailed(opts = {}) {
528
+ const {
529
+ privateUpload
530
+ } = opts;
531
+ return {
532
+ type: MEDIA_DELETE_FAILURE,
533
+ payload: {
534
+ privateUpload
535
+ }
536
+ };
537
+ }
538
+ export function mediaDisplayURLRequest(key) {
539
+ return {
540
+ type: MEDIA_DISPLAY_URL_REQUEST,
541
+ payload: {
542
+ key
543
+ }
544
+ };
545
+ }
546
+ export function mediaDisplayURLSuccess(key, url) {
547
+ return {
548
+ type: MEDIA_DISPLAY_URL_SUCCESS,
549
+ payload: {
550
+ key,
551
+ url
552
+ }
553
+ };
554
+ }
555
+ export function mediaDisplayURLFailure(key, err) {
556
+ return {
557
+ type: MEDIA_DISPLAY_URL_FAILURE,
558
+ payload: {
559
+ key,
560
+ err
561
+ }
562
+ };
563
+ }
564
+ export async function waitForMediaLibraryToLoad(dispatch, state) {
565
+ if (state.mediaLibrary.get('isLoading') !== false && !state.mediaLibrary.get('externalLibrary')) {
566
+ await waitUntilWithTimeout(dispatch, resolve => ({
567
+ predicate: ({
568
+ type
569
+ }) => type === MEDIA_LOAD_SUCCESS || type === MEDIA_LOAD_FAILURE,
570
+ run: () => resolve()
571
+ }));
572
+ }
573
+ }
574
+ export async function getMediaDisplayURL(dispatch, state, file) {
575
+ const displayURLState = selectMediaDisplayURL(state, file.id);
576
+ let url;
577
+ if (displayURLState.get('url')) {
578
+ // url was already loaded
579
+ url = displayURLState.get('url');
580
+ } else if (displayURLState.get('err')) {
581
+ // url loading had an error
582
+ url = null;
583
+ } else {
584
+ const key = file.id;
585
+ const promise = waitUntilWithTimeout(dispatch, resolve => ({
586
+ predicate: ({
587
+ type,
588
+ payload
589
+ }) => (type === MEDIA_DISPLAY_URL_SUCCESS || type === MEDIA_DISPLAY_URL_FAILURE) && payload.key === key,
590
+ run: (_dispatch, _getState, action) => resolve(action.payload.url)
591
+ }));
592
+ if (!displayURLState.get('isFetching')) {
593
+ // load display url
594
+ dispatch(loadMediaDisplayURL(file));
595
+ }
596
+ url = (await promise) ?? null;
597
+ }
598
+ return url;
599
+ }
@@ -0,0 +1,21 @@
1
+ export const NOTIFICATION_SEND = 'NOTIFICATION_SEND';
2
+ export const NOTIFICATION_DISMISS = 'NOTIFICATION_DISMISS';
3
+ export const NOTIFICATIONS_CLEAR = 'NOTIFICATION_CLEAR';
4
+ function addNotification(notification) {
5
+ return {
6
+ type: NOTIFICATION_SEND,
7
+ payload: notification
8
+ };
9
+ }
10
+ function dismissNotification(id) {
11
+ return {
12
+ type: NOTIFICATION_DISMISS,
13
+ id
14
+ };
15
+ }
16
+ function clearNotifications() {
17
+ return {
18
+ type: NOTIFICATIONS_CLEAR
19
+ };
20
+ }
21
+ export { addNotification, dismissNotification, clearNotifications };