@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,333 @@
1
+ import PropTypes from 'prop-types';
2
+ import React from 'react';
3
+ import styled from '@emotion/styled';
4
+ import { List, Map } from 'immutable';
5
+ import ImmutablePropTypes from 'react-immutable-proptypes';
6
+ import Frame, { FrameContextConsumer } from 'react-frame-component';
7
+ import { lengths } from 'decap-cms-ui-default';
8
+ import { connect } from 'react-redux';
9
+
10
+ import { encodeEntry } from '../../../lib/stega';
11
+ import {
12
+ resolveWidget,
13
+ getPreviewTemplate,
14
+ getPreviewStyles,
15
+ getRemarkPlugins,
16
+ } from '../../../lib/registry';
17
+ import { getAllEntries, tryLoadEntry } from '../../../actions/entries';
18
+ import { ErrorBoundary } from '../../UI';
19
+ import {
20
+ selectTemplateName,
21
+ selectInferredField,
22
+ selectField,
23
+ } from '../../../reducers/collections';
24
+ import { boundGetAsset } from '../../../actions/media';
25
+ import { selectIsLoadingAsset } from '../../../reducers/medias';
26
+ import { INFERABLE_FIELDS } from '../../../constants/fieldInference';
27
+ import EditorPreviewContent from './EditorPreviewContent.js';
28
+ import PreviewHOC from './PreviewHOC';
29
+ import EditorPreview from './EditorPreview';
30
+
31
+ const PreviewPaneFrame = styled(Frame)`
32
+ width: 100%;
33
+ height: 100%;
34
+ border: none;
35
+ background: #fff;
36
+ border-radius: ${lengths.borderRadius};
37
+ `;
38
+
39
+ export class PreviewPane extends React.Component {
40
+ getWidget = (field, value, metadata, props, idx = null) => {
41
+ const { getAsset, entry } = props;
42
+ const widget = resolveWidget(field.get('widget'));
43
+ const key = idx ? field.get('name') + '_' + idx : field.get('name');
44
+ const valueIsInMap = value && !widget.allowMapValue && Map.isMap(value);
45
+
46
+ /**
47
+ * Use an HOC to provide conditional updates for all previews.
48
+ */
49
+ return !widget.preview ? null : (
50
+ <PreviewHOC
51
+ previewComponent={widget.preview}
52
+ key={key}
53
+ field={field}
54
+ getAsset={getAsset}
55
+ value={valueIsInMap ? value.get(field.get('name')) : value}
56
+ entry={entry}
57
+ fieldsMetaData={metadata}
58
+ resolveWidget={resolveWidget}
59
+ getRemarkPlugins={getRemarkPlugins}
60
+ />
61
+ );
62
+ };
63
+
64
+ inferredFields = {};
65
+
66
+ inferFields() {
67
+ const titleField = selectInferredField(this.props.collection, 'title');
68
+ const shortTitleField = selectInferredField(this.props.collection, 'shortTitle');
69
+ const authorField = selectInferredField(this.props.collection, 'author');
70
+
71
+ this.inferredFields = {};
72
+ if (titleField) this.inferredFields[titleField] = INFERABLE_FIELDS.title;
73
+ if (shortTitleField) this.inferredFields[shortTitleField] = INFERABLE_FIELDS.shortTitle;
74
+ if (authorField) this.inferredFields[authorField] = INFERABLE_FIELDS.author;
75
+ }
76
+
77
+ /**
78
+ * Returns the widget component for a named field, and makes recursive calls
79
+ * to retrieve components for nested and deeply nested fields, which occur in
80
+ * object and list type fields. Used internally to retrieve widgets, and also
81
+ * exposed for use in custom preview templates.
82
+ */
83
+ widgetFor = (
84
+ name,
85
+ fields = this.props.fields,
86
+ values = this.props.entry.get('data'),
87
+ fieldsMetaData = this.props.fieldsMetaData,
88
+ ) => {
89
+ // We retrieve the field by name so that this function can also be used in
90
+ // custom preview templates, where the field object can't be passed in.
91
+ let field = fields && fields.find(f => f.get('name') === name);
92
+ let value = Map.isMap(values) && values.get(field.get('name'));
93
+ if (field.get('meta')) {
94
+ value = this.props.entry.getIn(['meta', field.get('name')]);
95
+ }
96
+
97
+ const nestedFields = field.get('fields');
98
+ const singleField = field.get('field');
99
+ const metadata = fieldsMetaData && fieldsMetaData.get(field.get('name'), Map());
100
+
101
+ if (nestedFields) {
102
+ field = field.set('fields', this.getNestedWidgets(nestedFields, value, metadata));
103
+ }
104
+
105
+ if (singleField) {
106
+ field = field.set('field', this.getSingleNested(singleField, value, metadata));
107
+ }
108
+
109
+ const labelledWidgets = ['string', 'text', 'number'];
110
+ const inferredField = Object.entries(this.inferredFields)
111
+ .filter(([key]) => {
112
+ const fieldToMatch = selectField(this.props.collection, key);
113
+ return fieldToMatch === field;
114
+ })
115
+ .map(([, value]) => value)[0];
116
+
117
+ if (inferredField) {
118
+ value = inferredField.defaultPreview(value);
119
+ } else if (
120
+ value &&
121
+ labelledWidgets.indexOf(field.get('widget')) !== -1 &&
122
+ value.toString().length < 50
123
+ ) {
124
+ value = (
125
+ <div>
126
+ <strong>{field.get('label', field.get('name'))}:</strong> {value}
127
+ </div>
128
+ );
129
+ }
130
+
131
+ return value ? this.getWidget(field, value, metadata, this.props) : null;
132
+ };
133
+
134
+ /**
135
+ * Retrieves widgets for nested fields (children of object/list fields)
136
+ */
137
+ getNestedWidgets = (fields, values, fieldsMetaData) => {
138
+ // Fields nested within a list field will be paired with a List of value Maps.
139
+ if (List.isList(values)) {
140
+ return values.map(value => this.widgetsForNestedFields(fields, value, fieldsMetaData));
141
+ }
142
+ // Fields nested within an object field will be paired with a single Map of values.
143
+ return this.widgetsForNestedFields(fields, values, fieldsMetaData);
144
+ };
145
+
146
+ getSingleNested = (field, values, fieldsMetaData) => {
147
+ if (List.isList(values)) {
148
+ return values.map((value, idx) =>
149
+ this.getWidget(field, value, fieldsMetaData.get(field.get('name')), this.props, idx),
150
+ );
151
+ }
152
+ return this.getWidget(field, values, fieldsMetaData.get(field.get('name')), this.props);
153
+ };
154
+
155
+ /**
156
+ * Use widgetFor as a mapping function for recursive widget retrieval
157
+ */
158
+ widgetsForNestedFields = (fields, values, fieldsMetaData) => {
159
+ return fields.map(field => this.widgetFor(field.get('name'), fields, values, fieldsMetaData));
160
+ };
161
+
162
+ /**
163
+ * This function exists entirely to expose nested widgets for object and list
164
+ * fields to custom preview templates.
165
+ *
166
+ * TODO: see if widgetFor can now provide this functionality for preview templates
167
+ */
168
+ widgetsFor = name => {
169
+ const { fields, entry, fieldsMetaData } = this.props;
170
+ const field = fields.find(f => f.get('name') === name);
171
+ const nestedFields = field && field.get('fields');
172
+ const variableTypes = field && field.get('types');
173
+ const value = entry.getIn(['data', field.get('name')]);
174
+ const metadata = fieldsMetaData.get(field.get('name'), Map());
175
+
176
+ // Variable Type lists
177
+ if (List.isList(value) && variableTypes) {
178
+ return value.map(val => {
179
+ const valueType = variableTypes.find(t => t.get('name') === val.get('type'));
180
+ const typeFields = valueType && valueType.get('fields');
181
+ const widgets =
182
+ typeFields &&
183
+ Map(
184
+ typeFields.map((f, i) => [
185
+ f.get('name'),
186
+ <div key={i}>{this.getWidget(f, val, metadata.get(f.get('name')), this.props)}</div>,
187
+ ]),
188
+ );
189
+ return Map({ data: val, widgets });
190
+ });
191
+ }
192
+
193
+ // List widgets
194
+ if (List.isList(value)) {
195
+ return value.map(val => {
196
+ const widgets =
197
+ nestedFields &&
198
+ Map(
199
+ nestedFields.map((f, i) => [
200
+ f.get('name'),
201
+ <div key={i}>{this.getWidget(f, val, metadata.get(f.get('name')), this.props)}</div>,
202
+ ]),
203
+ );
204
+ return Map({ data: val, widgets });
205
+ });
206
+ }
207
+
208
+ return Map({
209
+ data: value,
210
+ widgets:
211
+ nestedFields &&
212
+ Map(
213
+ nestedFields.map(f => [
214
+ f.get('name'),
215
+ this.getWidget(f, value, metadata.get(f.get('name')), this.props),
216
+ ]),
217
+ ),
218
+ });
219
+ };
220
+
221
+ /**
222
+ * This function exists entirely to expose collections from outside of this entry
223
+ *
224
+ */
225
+ getCollection = async (collectionName, slug) => {
226
+ const { state } = this.props;
227
+ const selectedCollection = state.collections.get(collectionName);
228
+
229
+ if (typeof slug === 'undefined') {
230
+ const entries = await getAllEntries(state, selectedCollection);
231
+ return entries.map(entry => Map().set('data', entry.data));
232
+ }
233
+
234
+ const entry = await tryLoadEntry(state, selectedCollection, slug);
235
+ return Map().set('data', entry.data);
236
+ };
237
+
238
+ render() {
239
+ const { entry, collection, config } = this.props;
240
+
241
+ if (!entry || !entry.get('data')) {
242
+ return null;
243
+ }
244
+
245
+ const previewComponent =
246
+ getPreviewTemplate(selectTemplateName(collection, entry.get('slug'))) || EditorPreview;
247
+
248
+ this.inferFields();
249
+
250
+ const visualEditing = collection.getIn(['editor', 'visualEditing'], false);
251
+
252
+ // Only encode entry data if visual editing is enabled
253
+ const previewEntry = visualEditing
254
+ ? entry.set('data', encodeEntry(entry.get('data'), this.props.fields))
255
+ : entry;
256
+
257
+ const previewProps = {
258
+ ...this.props,
259
+ entry: previewEntry,
260
+ widgetFor: (name, fields, values = previewEntry.get('data'), fieldsMetaData) =>
261
+ this.widgetFor(name, fields, values, fieldsMetaData),
262
+ widgetsFor: this.widgetsFor,
263
+ getCollection: this.getCollection,
264
+ };
265
+
266
+ const styleEls = getPreviewStyles().map((style, i) => {
267
+ if (style.raw) {
268
+ return <style key={i}>{style.value}</style>;
269
+ }
270
+ return <link key={i} href={style.value} type="text/css" rel="stylesheet" />;
271
+ });
272
+
273
+ if (!collection) {
274
+ <PreviewPaneFrame id="preview-pane" head={styleEls} />;
275
+ }
276
+
277
+ const initialContent = `
278
+ <!DOCTYPE html>
279
+ <html>
280
+ <head><base target="_blank"/></head>
281
+ <body><div></div></body>
282
+ </html>
283
+ `;
284
+
285
+ return (
286
+ <ErrorBoundary config={config}>
287
+ <PreviewPaneFrame id="preview-pane" head={styleEls} initialContent={initialContent}>
288
+ <FrameContextConsumer>
289
+ {({ document, window }) => {
290
+ return (
291
+ <EditorPreviewContent
292
+ {...{ previewComponent, previewProps: { ...previewProps, document, window } }}
293
+ onFieldClick={this.props.onFieldClick}
294
+ />
295
+ );
296
+ }}
297
+ </FrameContextConsumer>
298
+ </PreviewPaneFrame>
299
+ </ErrorBoundary>
300
+ );
301
+ }
302
+ }
303
+
304
+ PreviewPane.propTypes = {
305
+ collection: ImmutablePropTypes.map.isRequired,
306
+ fields: ImmutablePropTypes.list.isRequired,
307
+ entry: ImmutablePropTypes.map.isRequired,
308
+ fieldsMetaData: ImmutablePropTypes.map.isRequired,
309
+ getAsset: PropTypes.func.isRequired,
310
+ onFieldClick: PropTypes.func,
311
+ };
312
+
313
+ function mapStateToProps(state) {
314
+ const isLoadingAsset = selectIsLoadingAsset(state.medias);
315
+ return { isLoadingAsset, config: state.config, state };
316
+ }
317
+
318
+ function mapDispatchToProps(dispatch) {
319
+ return {
320
+ boundGetAsset: (collection, entry) => boundGetAsset(dispatch, collection, entry),
321
+ };
322
+ }
323
+
324
+ function mergeProps(stateProps, dispatchProps, ownProps) {
325
+ return {
326
+ ...stateProps,
327
+ ...dispatchProps,
328
+ ...ownProps,
329
+ getAsset: dispatchProps.boundGetAsset(ownProps.collection, ownProps.entry),
330
+ };
331
+ }
332
+
333
+ export default connect(mapStateToProps, mapDispatchToProps, mergeProps)(PreviewPane);
@@ -0,0 +1,33 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import ImmutablePropTypes from 'react-immutable-proptypes';
4
+
5
+ class PreviewHOC extends React.Component {
6
+ /**
7
+ * Only re-render on value change, but always re-render objects and lists.
8
+ * Their child widgets will each also be wrapped with this component, and
9
+ * will only be updated on value change.
10
+ */
11
+ shouldComponentUpdate(nextProps) {
12
+ const isWidgetContainer = ['object', 'list'].includes(nextProps.field.get('widget'));
13
+ return (
14
+ isWidgetContainer ||
15
+ this.props.value !== nextProps.value ||
16
+ this.props.fieldsMetaData !== nextProps.fieldsMetaData ||
17
+ this.props.getAsset !== nextProps.getAsset
18
+ );
19
+ }
20
+
21
+ render() {
22
+ const { previewComponent, ...props } = this.props;
23
+ return React.createElement(previewComponent, props);
24
+ }
25
+ }
26
+
27
+ PreviewHOC.propTypes = {
28
+ previewComponent: PropTypes.func.isRequired,
29
+ field: ImmutablePropTypes.map.isRequired,
30
+ value: PropTypes.oneOfType([PropTypes.node, PropTypes.object, PropTypes.string, PropTypes.bool]),
31
+ };
32
+
33
+ export default PreviewHOC;