From cfbf31b130172d0f2c44fcfa0bcc4d96bd84ef5f Mon Sep 17 00:00:00 2001 From: Shawn Erquhart Date: Thu, 7 Dec 2017 12:37:10 -0500 Subject: [PATCH] WIP - Global UI (#785) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * update top bar and collections sidebar UI * update collection entries UI * improve global layout * merge search page into collection page * enable new entry button * search fixup * wip -initial editor update * update editor scrolling and markdown toolbar position * wip * editor toolbar progress * editor toolbar wip * finished basic editor toolbar * add standalone toggle component * improve markdown toolbar spacing * add user avatar placeholder * finish markdown toggle styling * refactor icon setup, add new icons * add new icons to markdown editor toolbar * remove extra app container * add markdown active mark style * relation and text widget styling * widget design updates, basic list/object design update * widget style updates, image widget improvements * refactor widget directory, fix file removal * widget focus styles * finish editor widget focus styles * migrate media library modal to react-modal * wip - migrate editor component form to modal * wip - move editor component form to modal * wip - embed plugin forms in the editor * inline shortcode forms working * disable react hot loading, its breaking things * improve shortcode form styles * make shortcode form collapsible, improve styling * add close functionality to shortcode blocks * improve base media library styling * fix shortcode label * migrate unstyled workflow to new UI * wip - reorganizing everything * more work moving everything * finish more moving and eliminating stuff * restructure, remove react-toolbox * wip - removing old stuff, more restructure * finish restructure * wip - css arch * switch back to test repo * update react-datetime to ^2.11.0 * remove leftover react-toolbox button * more restructuring clean-up * fix UI component directory case * wip -css editor control style * wip - consolidate widget styles * wip - use a single control renderer * fixed object values breaking * wip - editor control active styles * pass control wrapper to widgets * ensure branch name is trimmed * wip - improve widget authoring support * import Map to Widget component * refactor toolbar buttons * wip - more widget active styles * break out editor toggle component * add local scroll sync back * update editor toggle icons * limit editor control pane content width * fix editor control spacing * migrate markdown toolbar stickiness to css * fix markdown toolbar border radius * temporarily use test backend * stop markdown toolbar from going to bottom * restore disabled markdown toolbar buttons for raw * test markdown widget without focus styles * more widget updates * remove card visuals from editor * disable dragging editor split off screen * use editorControl component for shortcode fields * make header site link configurable * add configurable collection descriptions * temporarily add example assets * add basic list view * remove outdated css mixins * add and implement search icon * activate quick add menu * visualize usable space in editor view * fix entry close, other improvements * wip - editorial workflow updates * some dropshadow and other CSS tweaks * workflow ui updates * add worfklow card buttons * fix workflow card button handlers * some dropshadow and other CSS tweaks * make workflow board wider * center workflow and collection views * add basic responsiveness * a bunch of fun UI fixes! a BUNCH! (#875) * give `.nc-entryEditor-toolbar-mainSection` left and right child divs * a bunch of fun UI fixes! a BUNCH! * remove obscure --buttonShadow * revert to test repo * fix not found page styling * allow workflow publishing from any column * disallow publishing from all columns, with feedback * fix new entry button * fix markdown state persisting across entries * enable simple workflow save and new from editor * update slug in address bar when saving new entry * wip - workflow updates, deletion working * add status change functionality to editor * wip - improving status change from editor * editor toolbar back button improvements, loading improvements, cleanup * progress on the media library UI cleanup * remove font smothing css * a quick fix for these buttons * tweaks * progress on media library modal— broken FYI * fix media library functionality, finish migrating footer * remove media library footer files * remove leftover css import * fix media library * editor publishing functionality complete (unstyled) * remove leftover loader var from media library * wip - editor publishing styles * add status dropdown styling * editor toolbar style updates * editor toolbar state improvements * progress on the media library UI cleanup, style improvements * finish editorial workflow editor styling * finish media library styling * fix config * add what-input to optimize focus styling * fix button * fix navigation blocking for simple workflow * improve simple workflow publishing * add avatar dropdown to editor top bar * style github and test-repo auth pages * add git gateway auth page styles * improve editor error styling --- .babelrc | 1 - .storybook/config.js | 8 - .storybook/webpack.config.js | 1 - example/config.yml | 4 + example/moby-dick.jpg | Bin 10613 -> 364538 bytes package.json | 22 +- postcss.config.js | 14 +- src/actions/auth.js | 2 +- src/actions/collections.js | 14 + src/actions/config.js | 4 +- src/actions/editor.js | 22 - src/actions/editorialWorkflow.js | 101 ++- src/actions/entries.js | 26 +- src/actions/findbar.js | 38 - src/actions/globalUI.js | 13 - src/actions/mediaLibrary.js | 13 +- src/actions/search.js | 10 +- src/backends/backend.js | 23 +- src/backends/git-gateway/API.js | 4 +- .../git-gateway/AuthenticationPage.css | 48 +- .../git-gateway/AuthenticationPage.js | 77 +- src/backends/git-gateway/implementation.js | 2 +- src/backends/git-gateway/netlify_logo.svg | 23 - src/backends/github/API.js | 9 +- src/backends/github/AuthenticationPage.css | 23 +- src/backends/github/AuthenticationPage.js | 12 +- src/backends/github/__tests__/API.spec.js | 2 +- src/backends/github/implementation.js | 4 +- src/backends/test-repo/AuthenticationPage.js | 38 +- src/backends/test-repo/implementation.js | 15 +- src/components/App/App.css | 8 + src/components/App/App.js | 180 +++++ src/components/App/Header.css | 91 +++ src/components/App/Header.js | 115 +++ src/components/App/NotFoundPage.css | 3 + src/components/App/NotFoundPage.js | 7 + src/components/AppHeader/AppHeader.css | 37 - src/components/AppHeader/AppHeader.js | 89 --- src/components/Collection/Collection.css | 11 + src/components/Collection/Collection.js | 70 ++ src/components/Collection/CollectionTop.css | 64 ++ src/components/Collection/CollectionTop.js | 63 ++ src/components/Collection/Entries/Entries.css | 2 + src/components/Collection/Entries/Entries.js | 51 ++ .../Collection/Entries/EntriesCollection.js | 64 ++ .../Collection/Entries/EntriesSearch.js} | 61 +- .../Collection/Entries/EntryCard.css | 70 ++ .../Collection/Entries/EntryCard.js | 53 ++ .../Collection/Entries/EntryListing.css | 9 + .../Collection/Entries/EntryListing.js | 70 ++ src/components/Collection/Sidebar.css | 68 ++ src/components/Collection/Sidebar.js | 53 ++ src/components/ControlPanel/ControlPane.css | 35 - src/components/ControlPanel/ControlPane.js | 109 --- src/components/Editor/Editor.css | 6 + src/components/Editor/Editor.js | 390 ++++++++++ .../EditorControlPane/EditorControl.css | 7 + .../Editor/EditorControlPane/EditorControl.js | 83 ++ .../EditorControlPane/EditorControlPane.css | 106 +++ .../EditorControlPane/EditorControlPane.js | 82 ++ .../EditorControlPane/Widget.js} | 63 +- src/components/Editor/EditorInterface.css | 78 ++ src/components/Editor/EditorInterface.js | 224 ++++++ .../EditorPreviewPane/EditorPreview.js} | 0 .../EditorPreviewContent.js} | 2 +- .../EditorPreviewPane/EditorPreviewPane.css} | 1 + .../EditorPreviewPane/EditorPreviewPane.js} | 24 +- .../EditorPreviewPane}/PreviewHOC.js | 0 .../Editor/EditorScrollSync/ScrollSync.js | 127 ++++ .../Editor/EditorScrollSync/ScrollSyncPane.js | 50 ++ .../EditorScrollSync}/index.js | 0 src/components/Editor/EditorToggle.css | 18 + src/components/Editor/EditorToggle.js | 18 + src/components/Editor/EditorToolbar.css | 151 ++++ src/components/Editor/EditorToolbar.js | 237 ++++++ .../__tests__/EntryEditorToolbar.spec.js | 2 +- .../EntryEditorToolbar.spec.js.snap | 0 src/components/Editor/withWorkflow.js | 58 ++ .../EditorWidgets/Boolean/Boolean.css | 9 + .../EditorWidgets/Boolean/BooleanControl.js | 40 + .../Date}/DateControl.js | 42 +- .../Date}/DatePreview.js | 3 +- .../EditorWidgets/DateTime/DateTime.css | 1 + .../EditorWidgets/DateTime/DateTimeControl.js | 43 ++ .../DateTime}/DateTimePreview.js | 3 +- .../EditorWidgets/DateTime/ReactDatetime.css | 210 ++++++ .../EditorWidgets/EditorWidgets.css | 17 + .../EditorWidgets/File/FileControl.css | 7 + .../EditorWidgets/File/FileControl.js | 5 + .../File}/FilePreview.js | 3 +- src/components/EditorWidgets/Image/Image.css | 4 + .../EditorWidgets/Image/ImageControl.js | 5 + .../Image}/ImagePreview.js | 5 +- src/components/EditorWidgets/List/List.css | 83 ++ .../List}/ListControl.js | 167 ++-- .../List}/ListPreview.js | 4 +- .../EditorWidgets/Markdown/Markdown.css | 4 + .../MarkdownControl/RawEditor/index.css | 5 +- .../MarkdownControl/RawEditor/index.js | 23 +- .../MarkdownControl/Toolbar/Toolbar.css | 48 ++ .../MarkdownControl/Toolbar/Toolbar.js | 189 +++++ .../MarkdownControl/Toolbar/ToolbarButton.css | 22 + .../MarkdownControl/Toolbar/ToolbarButton.js | 30 + .../VisualEditor/Shortcode.css | 22 + .../MarkdownControl/VisualEditor/Shortcode.js | 136 ++++ .../__snapshots__/parser.spec.js.snap | 0 .../VisualEditor/__tests__/parser.spec.js | 2 +- .../MarkdownControl/VisualEditor/index.css | 37 +- .../MarkdownControl/VisualEditor/index.js | 131 ++-- .../MarkdownControl/VisualEditor/keys.js | 0 .../MarkdownControl/VisualEditor/plugins.js | 0 .../MarkdownControl/VisualEditor/renderers.js | 7 +- .../VisualEditor/validators.js | 0 .../Markdown/MarkdownControl/index.js | 34 +- .../Markdown/MarkdownControl/plugins.js | 8 +- .../__snapshots__/renderer.spec.js.snap | 0 .../__tests__/renderer.spec.js | 2 +- .../Markdown/MarkdownPreview/index.js | 5 +- .../__tests__/remarkAllowHtmlEntities.spec.js | 0 .../__tests__/remarkAssertParents.spec.js | 0 .../remarkEscapeMarkdownEntities.spec.js | 0 .../__tests__/remarkPaddedLinks.spec.js | 0 .../remarkStripTrailingBreaks.spec.js | 0 .../serializers/__tests__/slate.spec.js | 0 .../Markdown/serializers/index.js | 10 +- .../Markdown/serializers/rehypePaperEmoji.js | 0 .../serializers/remarkAllowHtmlEntities.js | 0 .../serializers/remarkAssertParents.js | 0 .../remarkEscapeMarkdownEntities.js | 2 +- .../serializers/remarkImagesToText.js | 0 .../Markdown/serializers/remarkPaddedLinks.js | 0 .../serializers/remarkRehypeShortcodes.js | 0 .../Markdown/serializers/remarkShortcodes.js | 0 .../Markdown/serializers/remarkSlate.js | 0 .../serializers/remarkSquashReferences.js | 0 .../serializers/remarkStripTrailingBreaks.js | 0 .../Markdown/serializers/remarkWrapHtml.js | 0 .../Markdown/serializers/slateRemark.js | 2 +- .../Number}/NumberControl.js | 30 +- .../Number}/NumberPreview.js | 3 +- .../EditorWidgets/Object/Object.css | 3 + .../EditorWidgets/Object/ObjectControl.js | 102 +++ .../Object}/ObjectPreview.js | 4 +- .../Relation/ReactAutosuggest.css | 35 + .../EditorWidgets/Relation/Relation.css | 1 + .../Relation}/RelationControl.js | 27 +- .../Relation}/RelationPreview.js | 3 +- .../EditorWidgets/Select/SelectControl.js | 64 ++ .../Select}/SelectPreview.js | 3 +- .../EditorWidgets/String/StringControl.js | 36 + .../String}/StringPreview.js | 3 +- .../EditorWidgets/Text/TextControl.js | 48 ++ .../Text}/TextPreview.js | 3 +- .../Unknown}/UnknownControl.js | 0 .../Unknown}/UnknownPreview.js | 3 +- src/components/EditorWidgets/index.js | 44 ++ .../EditorWidgets/withMedia/withMedia.css | 34 + .../withMedia/withMediaControl.js | 116 +++ src/components/EntryEditor/EntryEditor.css | 62 -- src/components/EntryEditor/EntryEditor.js | 187 ----- .../EntryEditor/EntryEditorToolbar.js | 48 -- src/components/EntryListing/EntryListing.css | 38 - src/components/EntryListing/EntryListing.js | 97 --- src/components/FindBar/FindBar.css | 17 - src/components/FindBar/FindBar.js | 56 -- src/components/MarkdownPlugins/image.js | 23 + src/components/MarkdownPlugins/index.js | 8 + src/components/MediaLibrary/MediaLibrary.css | 161 +++- src/components/MediaLibrary/MediaLibrary.js | 106 ++- .../MediaLibrary/MediaLibraryFooter.css | 25 - .../MediaLibrary/MediaLibraryFooter.js | 64 -- src/components/ScrollSync/ScrollSync.js | 84 --- src/components/ScrollSync/ScrollSyncPane.js | 29 - src/components/UI/Dialog/Dialog.css | 52 -- src/components/UI/Dialog/FocusTrap.js | 16 - src/components/UI/Dialog/index.js | 65 -- .../{dndHelpers.js => DragDrop/DragDrop.js} | 6 +- src/components/UI/Dropdown/Dropdown.css | 77 ++ src/components/UI/Dropdown/Dropdown.js | 53 ++ .../UI/ErrorBoundary/ErrorBoundary.css | 2 +- .../UI/ErrorBoundary/ErrorBoundary.js | 2 +- .../UI/FileUploadButton/FileUploadButton.css | 0 .../UI/FileUploadButton/FileUploadButton.js | 21 + src/components/UI/Icon/Icon.css | 24 + src/components/UI/Icon/Icon.js | 48 ++ src/components/UI/Icon/icons.js | 40 + src/components/UI/Icon/images/_index.js | 83 ++ src/components/UI/Icon/images/add-with.svg | 3 + src/components/UI/Icon/images/add.svg | 3 + src/components/UI/Icon/images/arrow.svg | 3 + src/components/UI/Icon/images/bold.svg | 3 + src/components/UI/Icon/images/caret.svg | 3 + src/components/UI/Icon/images/check.svg | 3 + src/components/UI/Icon/images/circle.svg | 3 + src/components/UI/Icon/images/close.svg | 3 + src/components/UI/Icon/images/code-block.svg | 3 + src/components/UI/Icon/images/code.svg | 3 + src/components/UI/Icon/images/drag-handle.svg | 3 + src/components/UI/Icon/images/eye.svg | 3 + src/components/UI/Icon/images/folder.svg | 3 + src/components/UI/Icon/images/github.svg | 3 + src/components/UI/Icon/images/grid.svg | 3 + src/components/UI/Icon/images/h1.svg | 3 + src/components/UI/Icon/images/h2.svg | 3 + src/components/UI/Icon/images/home.svg | 3 + src/components/UI/Icon/images/image.svg | 3 + src/components/UI/Icon/images/italic.svg | 3 + src/components/UI/Icon/images/link.svg | 3 + .../UI/Icon/images/list-bulleted.svg | 3 + .../UI/Icon/images/list-numbered.svg | 3 + src/components/UI/Icon/images/list.svg | 3 + src/components/UI/Icon/images/markdown.svg | 3 + src/components/UI/Icon/images/media-alt.svg | 3 + src/components/UI/Icon/images/media.svg | 3 + .../UI/Icon/images/netlify-cms-logo.svg | 11 + src/components/UI/Icon/images/netlify.svg | 21 + src/components/UI/Icon/images/page.svg | 3 + src/components/UI/Icon/images/pages-alt.svg | 4 + src/components/UI/Icon/images/pages.svg | 4 + src/components/UI/Icon/images/quote.svg | 3 + src/components/UI/Icon/images/scroll.svg | 3 + src/components/UI/Icon/images/search.svg | 3 + src/components/UI/Icon/images/settings.svg | 3 + src/components/UI/Icon/images/user.svg | 5 + src/components/UI/Icon/images/workflow.svg | 3 + src/components/UI/Icon/images/write.svg | 3 + .../UI/ListItemTopBar/ListItemTopBar.css | 29 + .../UI/ListItemTopBar/ListItemTopBar.js | 32 + .../UI/{loader => Loader}/Loader.css | 8 +- .../UI/{loader => Loader}/Loader.js | 2 +- src/components/UI/Modal/Modal.css | 57 ++ src/components/UI/Modal/Modal.js | 34 + src/components/UI/Sticky/Sticky.css | 18 - src/components/UI/Sticky/Sticky.js | 227 ------ src/components/UI/Toast/Toast.css | 34 + src/components/UI/Toast/Toast.js | 13 + src/components/UI/Toggle/Toggle.css | 31 + src/components/UI/Toggle/Toggle.js | 28 + src/components/UI/UI.css | 8 + src/components/UI/base.css | 337 +++++++++ src/components/UI/card/Card.css | 47 -- src/components/UI/card/Card.js | 7 - src/components/UI/icon/Icon.css | 352 --------- src/components/UI/icon/Icon.js | 207 ----- src/components/UI/icon/icons.eot | Bin 83416 -> 0 bytes src/components/UI/icon/icons.svg | 646 ---------------- src/components/UI/icon/icons.ttf | Bin 83260 -> 0 bytes src/components/UI/icon/icons.woff | Bin 50404 -> 0 bytes src/components/UI/icon/icons.woff2 | Bin 41316 -> 0 bytes src/components/UI/index.js | 21 +- src/components/UI/theme.css | 79 -- src/components/UI/toast/Toast.css | 39 - src/components/UI/toast/Toast.js | 27 - .../UnpublishedListing/UnpublishedListing.css | 43 -- .../UnpublishedListing/UnpublishedListing.js | 149 ---- .../UnpublishedListingCardMeta.css | 23 - .../UnpublishedListingCardMeta.js | 17 - src/components/Widgets.js | 48 -- src/components/Widgets/BooleanControl.css | 3 - src/components/Widgets/BooleanControl.js | 26 - src/components/Widgets/DateTimeControl.js | 9 - src/components/Widgets/FileControl.css | 19 - src/components/Widgets/FileControl.js | 76 -- src/components/Widgets/ImageControl.js | 74 -- src/components/Widgets/ListControl.css | 107 --- .../MarkdownControl/Toolbar/Toolbar.css | 10 - .../MarkdownControl/Toolbar/Toolbar.js | 102 --- .../MarkdownControl/Toolbar/ToolbarButton.css | 14 - .../MarkdownControl/Toolbar/ToolbarButton.js | 24 - .../Toolbar/ToolbarComponentsMenu.css | 14 - .../Toolbar/ToolbarComponentsMenu.js | 57 -- .../Toolbar/ToolbarPluginForm.css | 31 - .../Toolbar/ToolbarPluginForm.js | 87 --- .../Toolbar/ToolbarPluginFormControl.js | 44 -- src/components/Widgets/ObjectControl.css | 7 - src/components/Widgets/ObjectControl.js | 91 --- src/components/Widgets/SelectControl.js | 50 -- src/components/Widgets/StringControl.js | 18 - src/components/Widgets/TextControl.js | 33 - src/components/Widgets/defaultPreviewStyle.js | 10 - src/components/Workflow/Workflow.css | 29 + src/components/Workflow/Workflow.js | 116 +++ src/components/Workflow/WorkflowCard.css | 88 +++ src/components/Workflow/WorkflowCard.js | 43 ++ src/components/Workflow/WorkflowList.css | 83 ++ src/components/Workflow/WorkflowList.js | 147 ++++ src/components/stories/Card.js | 42 -- src/components/stories/FindBar.js | 16 - src/components/stories/Icon.js | 329 -------- src/components/stories/ScrollSync.js | 55 -- src/components/stories/Toast.js | 41 - src/components/stories/index.js | 5 - src/constants/collectionViews.js | 2 + src/containers/App.css | 4 - src/containers/App.js | 248 ------ src/containers/CollectionPage.css | 10 - src/containers/CollectionPage.js | 81 -- src/containers/DashboardPage.js | 39 - src/containers/EntryPage.js | 227 ------ src/containers/NotFoundPage.js | 5 - src/containers/Sidebar.css | 47 -- src/containers/Sidebar.js | 63 -- .../editorialWorkflow/EntryPageHOC.js | 63 -- .../UnpublishedEntriesPanel.js | 77 -- src/formats/toml.js | 2 +- src/formats/yaml.js | 2 +- src/index.css | 392 +--------- src/index.js | 93 ++- .../providers/algolia/implementation.js | 4 +- .../providers/assetStore/implementation.js | 2 +- src/lib/consoleError.js | 1 - src/lib/registry.js | 114 ++- src/lib/serializeEntryValues.js | 4 +- src/lib/urlHelper.js | 6 +- src/material-icons.css | 36 - src/react-toolbox-global.css | 129 ---- src/reducers/__tests__/auth.spec.js | 2 +- src/reducers/__tests__/collections.spec.js | 2 +- src/reducers/__tests__/config.spec.js | 2 +- src/reducers/__tests__/entries.spec.js | 2 +- src/reducers/__tests__/entryDraft.spec.js | 2 +- src/reducers/auth.js | 2 +- src/reducers/collections.js | 10 +- src/reducers/config.js | 2 +- src/reducers/editor.js | 13 - src/reducers/editorialWorkflow.js | 28 +- src/reducers/entries.js | 4 +- src/reducers/entryDraft.js | 16 +- src/reducers/globalUI.js | 13 +- src/reducers/index.js | 2 - src/reducers/integrations.js | 2 +- src/reducers/mediaLibrary.js | 7 +- src/reducers/medias.js | 6 +- src/reducers/search.js | 2 +- src/redux/configureStore.js | 10 +- src/root.js | 22 - src/utils.css | 23 - src/valueObjects/AssetProxy.js | 8 +- wallaby.config.js | 36 - webpack.base.js | 62 +- webpack.dev.js | 6 - website/site/content/docs/architecture.md | 9 +- .../site/content/docs/editorial-workflow.md | 6 - yarn.lock | 710 +++--------------- 344 files changed, 6964 insertions(+), 7415 deletions(-) delete mode 100644 .storybook/config.js delete mode 100644 .storybook/webpack.config.js create mode 100644 src/actions/collections.js delete mode 100644 src/actions/editor.js delete mode 100644 src/actions/findbar.js delete mode 100644 src/actions/globalUI.js delete mode 100644 src/backends/git-gateway/netlify_logo.svg create mode 100644 src/components/App/App.css create mode 100644 src/components/App/App.js create mode 100644 src/components/App/Header.css create mode 100644 src/components/App/Header.js create mode 100644 src/components/App/NotFoundPage.css create mode 100644 src/components/App/NotFoundPage.js delete mode 100644 src/components/AppHeader/AppHeader.css delete mode 100644 src/components/AppHeader/AppHeader.js create mode 100644 src/components/Collection/Collection.css create mode 100644 src/components/Collection/Collection.js create mode 100644 src/components/Collection/CollectionTop.css create mode 100644 src/components/Collection/CollectionTop.js create mode 100644 src/components/Collection/Entries/Entries.css create mode 100644 src/components/Collection/Entries/Entries.js create mode 100644 src/components/Collection/Entries/EntriesCollection.js rename src/{containers/SearchPage.js => components/Collection/Entries/EntriesSearch.js} (54%) create mode 100644 src/components/Collection/Entries/EntryCard.css create mode 100644 src/components/Collection/Entries/EntryCard.js create mode 100644 src/components/Collection/Entries/EntryListing.css create mode 100644 src/components/Collection/Entries/EntryListing.js create mode 100644 src/components/Collection/Sidebar.css create mode 100644 src/components/Collection/Sidebar.js delete mode 100644 src/components/ControlPanel/ControlPane.css delete mode 100644 src/components/ControlPanel/ControlPane.js create mode 100644 src/components/Editor/Editor.css create mode 100644 src/components/Editor/Editor.js create mode 100644 src/components/Editor/EditorControlPane/EditorControl.css create mode 100644 src/components/Editor/EditorControlPane/EditorControl.js create mode 100644 src/components/Editor/EditorControlPane/EditorControlPane.css create mode 100644 src/components/Editor/EditorControlPane/EditorControlPane.js rename src/components/{Widgets/ControlHOC.js => Editor/EditorControlPane/Widget.js} (70%) create mode 100644 src/components/Editor/EditorInterface.css create mode 100644 src/components/Editor/EditorInterface.js rename src/components/{PreviewPane/Preview.js => Editor/EditorPreviewPane/EditorPreview.js} (100%) rename src/components/{PreviewPane/PreviewContent.js => Editor/EditorPreviewPane/EditorPreviewContent.js} (92%) rename src/components/{PreviewPane/PreviewPane.css => Editor/EditorPreviewPane/EditorPreviewPane.css} (70%) rename src/components/{PreviewPane/PreviewPane.js => Editor/EditorPreviewPane/EditorPreviewPane.js} (89%) rename src/components/{Widgets => Editor/EditorPreviewPane}/PreviewHOC.js (100%) create mode 100644 src/components/Editor/EditorScrollSync/ScrollSync.js create mode 100644 src/components/Editor/EditorScrollSync/ScrollSyncPane.js rename src/components/{ScrollSync => Editor/EditorScrollSync}/index.js (100%) create mode 100644 src/components/Editor/EditorToggle.css create mode 100644 src/components/Editor/EditorToggle.js create mode 100644 src/components/Editor/EditorToolbar.css create mode 100644 src/components/Editor/EditorToolbar.js rename src/components/{EntryEditor => Editor}/__tests__/EntryEditorToolbar.spec.js (94%) rename src/components/{EntryEditor => Editor}/__tests__/__snapshots__/EntryEditorToolbar.spec.js.snap (100%) create mode 100644 src/components/Editor/withWorkflow.js create mode 100644 src/components/EditorWidgets/Boolean/Boolean.css create mode 100644 src/components/EditorWidgets/Boolean/BooleanControl.js rename src/components/{Widgets => EditorWidgets/Date}/DateControl.js (53%) rename src/components/{Widgets => EditorWidgets/Date}/DatePreview.js (57%) create mode 100644 src/components/EditorWidgets/DateTime/DateTime.css create mode 100644 src/components/EditorWidgets/DateTime/DateTimeControl.js rename src/components/{Widgets => EditorWidgets/DateTime}/DateTimePreview.js (58%) create mode 100644 src/components/EditorWidgets/DateTime/ReactDatetime.css create mode 100644 src/components/EditorWidgets/EditorWidgets.css create mode 100644 src/components/EditorWidgets/File/FileControl.css create mode 100644 src/components/EditorWidgets/File/FileControl.js rename src/components/{Widgets => EditorWidgets/File}/FilePreview.js (77%) create mode 100644 src/components/EditorWidgets/Image/Image.css create mode 100644 src/components/EditorWidgets/Image/ImageControl.js rename src/components/{Widgets => EditorWidgets/Image}/ImagePreview.js (70%) create mode 100644 src/components/EditorWidgets/List/List.css rename src/components/{Widgets => EditorWidgets/List}/ListControl.js (57%) rename src/components/{Widgets => EditorWidgets/List}/ListPreview.js (58%) create mode 100644 src/components/EditorWidgets/Markdown/Markdown.css rename src/components/{Widgets => EditorWidgets}/Markdown/MarkdownControl/RawEditor/index.css (65%) rename src/components/{Widgets => EditorWidgets}/Markdown/MarkdownControl/RawEditor/index.js (79%) create mode 100644 src/components/EditorWidgets/Markdown/MarkdownControl/Toolbar/Toolbar.css create mode 100644 src/components/EditorWidgets/Markdown/MarkdownControl/Toolbar/Toolbar.js create mode 100644 src/components/EditorWidgets/Markdown/MarkdownControl/Toolbar/ToolbarButton.css create mode 100644 src/components/EditorWidgets/Markdown/MarkdownControl/Toolbar/ToolbarButton.js create mode 100644 src/components/EditorWidgets/Markdown/MarkdownControl/VisualEditor/Shortcode.css create mode 100644 src/components/EditorWidgets/Markdown/MarkdownControl/VisualEditor/Shortcode.js rename src/components/{Widgets => EditorWidgets}/Markdown/MarkdownControl/VisualEditor/__tests__/__snapshots__/parser.spec.js.snap (100%) rename src/components/{Widgets => EditorWidgets}/Markdown/MarkdownControl/VisualEditor/__tests__/parser.spec.js (98%) rename src/components/{Widgets => EditorWidgets}/Markdown/MarkdownControl/VisualEditor/index.css (79%) rename src/components/{Widgets => EditorWidgets}/Markdown/MarkdownControl/VisualEditor/index.js (61%) rename src/components/{Widgets => EditorWidgets}/Markdown/MarkdownControl/VisualEditor/keys.js (100%) rename src/components/{Widgets => EditorWidgets}/Markdown/MarkdownControl/VisualEditor/plugins.js (100%) rename src/components/{Widgets => EditorWidgets}/Markdown/MarkdownControl/VisualEditor/renderers.js (92%) rename src/components/{Widgets => EditorWidgets}/Markdown/MarkdownControl/VisualEditor/validators.js (100%) rename src/components/{Widgets => EditorWidgets}/Markdown/MarkdownControl/index.js (61%) rename src/components/{Widgets => EditorWidgets}/Markdown/MarkdownControl/plugins.js (78%) rename src/components/{Widgets => EditorWidgets}/Markdown/MarkdownPreview/__tests__/__snapshots__/renderer.spec.js.snap (100%) rename src/components/{Widgets => EditorWidgets}/Markdown/MarkdownPreview/__tests__/renderer.spec.js (98%) rename src/components/{Widgets => EditorWidgets}/Markdown/MarkdownPreview/index.js (64%) rename src/components/{Widgets => EditorWidgets}/Markdown/serializers/__tests__/remarkAllowHtmlEntities.spec.js (100%) rename src/components/{Widgets => EditorWidgets}/Markdown/serializers/__tests__/remarkAssertParents.spec.js (100%) rename src/components/{Widgets => EditorWidgets}/Markdown/serializers/__tests__/remarkEscapeMarkdownEntities.spec.js (100%) rename src/components/{Widgets => EditorWidgets}/Markdown/serializers/__tests__/remarkPaddedLinks.spec.js (100%) rename src/components/{Widgets => EditorWidgets}/Markdown/serializers/__tests__/remarkStripTrailingBreaks.spec.js (100%) rename src/components/{Widgets => EditorWidgets}/Markdown/serializers/__tests__/slate.spec.js (100%) rename src/components/{Widgets => EditorWidgets}/Markdown/serializers/index.js (94%) rename src/components/{Widgets => EditorWidgets}/Markdown/serializers/rehypePaperEmoji.js (100%) rename src/components/{Widgets => EditorWidgets}/Markdown/serializers/remarkAllowHtmlEntities.js (100%) rename src/components/{Widgets => EditorWidgets}/Markdown/serializers/remarkAssertParents.js (100%) rename src/components/{Widgets => EditorWidgets}/Markdown/serializers/remarkEscapeMarkdownEntities.js (99%) rename src/components/{Widgets => EditorWidgets}/Markdown/serializers/remarkImagesToText.js (100%) rename src/components/{Widgets => EditorWidgets}/Markdown/serializers/remarkPaddedLinks.js (100%) rename src/components/{Widgets => EditorWidgets}/Markdown/serializers/remarkRehypeShortcodes.js (100%) rename src/components/{Widgets => EditorWidgets}/Markdown/serializers/remarkShortcodes.js (100%) rename src/components/{Widgets => EditorWidgets}/Markdown/serializers/remarkSlate.js (100%) rename src/components/{Widgets => EditorWidgets}/Markdown/serializers/remarkSquashReferences.js (100%) rename src/components/{Widgets => EditorWidgets}/Markdown/serializers/remarkStripTrailingBreaks.js (100%) rename src/components/{Widgets => EditorWidgets}/Markdown/serializers/remarkWrapHtml.js (100%) rename src/components/{Widgets => EditorWidgets}/Markdown/serializers/slateRemark.js (99%) rename src/components/{Widgets => EditorWidgets/Number}/NumberControl.js (58%) rename src/components/{Widgets => EditorWidgets/Number}/NumberPreview.js (63%) create mode 100644 src/components/EditorWidgets/Object/Object.css create mode 100644 src/components/EditorWidgets/Object/ObjectControl.js rename src/components/{Widgets => EditorWidgets/Object}/ObjectPreview.js (55%) create mode 100644 src/components/EditorWidgets/Relation/ReactAutosuggest.css create mode 100644 src/components/EditorWidgets/Relation/Relation.css rename src/components/{Widgets => EditorWidgets/Relation}/RelationControl.js (85%) rename src/components/{Widgets => EditorWidgets/Relation}/RelationPreview.js (63%) create mode 100644 src/components/EditorWidgets/Select/SelectControl.js rename src/components/{Widgets => EditorWidgets/Select}/SelectPreview.js (58%) create mode 100644 src/components/EditorWidgets/String/StringControl.js rename src/components/{Widgets => EditorWidgets/String}/StringPreview.js (63%) create mode 100644 src/components/EditorWidgets/Text/TextControl.js rename src/components/{Widgets => EditorWidgets/Text}/TextPreview.js (62%) rename src/components/{Widgets => EditorWidgets/Unknown}/UnknownControl.js (100%) rename src/components/{Widgets => EditorWidgets/Unknown}/UnknownPreview.js (59%) create mode 100644 src/components/EditorWidgets/index.js create mode 100644 src/components/EditorWidgets/withMedia/withMedia.css create mode 100644 src/components/EditorWidgets/withMedia/withMediaControl.js delete mode 100644 src/components/EntryEditor/EntryEditor.css delete mode 100644 src/components/EntryEditor/EntryEditor.js delete mode 100644 src/components/EntryEditor/EntryEditorToolbar.js delete mode 100644 src/components/EntryListing/EntryListing.css delete mode 100644 src/components/EntryListing/EntryListing.js delete mode 100644 src/components/FindBar/FindBar.css delete mode 100644 src/components/FindBar/FindBar.js create mode 100644 src/components/MarkdownPlugins/image.js create mode 100644 src/components/MarkdownPlugins/index.js delete mode 100644 src/components/MediaLibrary/MediaLibraryFooter.css delete mode 100644 src/components/MediaLibrary/MediaLibraryFooter.js delete mode 100644 src/components/ScrollSync/ScrollSync.js delete mode 100644 src/components/ScrollSync/ScrollSyncPane.js delete mode 100644 src/components/UI/Dialog/Dialog.css delete mode 100644 src/components/UI/Dialog/FocusTrap.js delete mode 100644 src/components/UI/Dialog/index.js rename src/components/UI/{dndHelpers.js => DragDrop/DragDrop.js} (90%) create mode 100644 src/components/UI/Dropdown/Dropdown.css create mode 100644 src/components/UI/Dropdown/Dropdown.js create mode 100644 src/components/UI/FileUploadButton/FileUploadButton.css create mode 100644 src/components/UI/FileUploadButton/FileUploadButton.js create mode 100644 src/components/UI/Icon/Icon.css create mode 100644 src/components/UI/Icon/Icon.js create mode 100644 src/components/UI/Icon/icons.js create mode 100644 src/components/UI/Icon/images/_index.js create mode 100644 src/components/UI/Icon/images/add-with.svg create mode 100644 src/components/UI/Icon/images/add.svg create mode 100644 src/components/UI/Icon/images/arrow.svg create mode 100644 src/components/UI/Icon/images/bold.svg create mode 100644 src/components/UI/Icon/images/caret.svg create mode 100644 src/components/UI/Icon/images/check.svg create mode 100644 src/components/UI/Icon/images/circle.svg create mode 100644 src/components/UI/Icon/images/close.svg create mode 100644 src/components/UI/Icon/images/code-block.svg create mode 100644 src/components/UI/Icon/images/code.svg create mode 100644 src/components/UI/Icon/images/drag-handle.svg create mode 100644 src/components/UI/Icon/images/eye.svg create mode 100644 src/components/UI/Icon/images/folder.svg create mode 100644 src/components/UI/Icon/images/github.svg create mode 100644 src/components/UI/Icon/images/grid.svg create mode 100644 src/components/UI/Icon/images/h1.svg create mode 100644 src/components/UI/Icon/images/h2.svg create mode 100644 src/components/UI/Icon/images/home.svg create mode 100644 src/components/UI/Icon/images/image.svg create mode 100644 src/components/UI/Icon/images/italic.svg create mode 100644 src/components/UI/Icon/images/link.svg create mode 100644 src/components/UI/Icon/images/list-bulleted.svg create mode 100644 src/components/UI/Icon/images/list-numbered.svg create mode 100644 src/components/UI/Icon/images/list.svg create mode 100644 src/components/UI/Icon/images/markdown.svg create mode 100644 src/components/UI/Icon/images/media-alt.svg create mode 100644 src/components/UI/Icon/images/media.svg create mode 100644 src/components/UI/Icon/images/netlify-cms-logo.svg create mode 100644 src/components/UI/Icon/images/netlify.svg create mode 100644 src/components/UI/Icon/images/page.svg create mode 100644 src/components/UI/Icon/images/pages-alt.svg create mode 100644 src/components/UI/Icon/images/pages.svg create mode 100644 src/components/UI/Icon/images/quote.svg create mode 100644 src/components/UI/Icon/images/scroll.svg create mode 100644 src/components/UI/Icon/images/search.svg create mode 100644 src/components/UI/Icon/images/settings.svg create mode 100644 src/components/UI/Icon/images/user.svg create mode 100644 src/components/UI/Icon/images/workflow.svg create mode 100644 src/components/UI/Icon/images/write.svg create mode 100644 src/components/UI/ListItemTopBar/ListItemTopBar.css create mode 100644 src/components/UI/ListItemTopBar/ListItemTopBar.js rename src/components/UI/{loader => Loader}/Loader.css (93%) rename src/components/UI/{loader => Loader}/Loader.js (96%) create mode 100644 src/components/UI/Modal/Modal.css create mode 100644 src/components/UI/Modal/Modal.js delete mode 100644 src/components/UI/Sticky/Sticky.css delete mode 100644 src/components/UI/Sticky/Sticky.js create mode 100644 src/components/UI/Toast/Toast.css create mode 100644 src/components/UI/Toast/Toast.js create mode 100644 src/components/UI/Toggle/Toggle.css create mode 100644 src/components/UI/Toggle/Toggle.js create mode 100644 src/components/UI/UI.css create mode 100644 src/components/UI/base.css delete mode 100644 src/components/UI/card/Card.css delete mode 100644 src/components/UI/card/Card.js delete mode 100644 src/components/UI/icon/Icon.css delete mode 100644 src/components/UI/icon/Icon.js delete mode 100755 src/components/UI/icon/icons.eot delete mode 100755 src/components/UI/icon/icons.svg delete mode 100755 src/components/UI/icon/icons.ttf delete mode 100755 src/components/UI/icon/icons.woff delete mode 100755 src/components/UI/icon/icons.woff2 delete mode 100644 src/components/UI/theme.css delete mode 100644 src/components/UI/toast/Toast.css delete mode 100644 src/components/UI/toast/Toast.js delete mode 100644 src/components/UnpublishedListing/UnpublishedListing.css delete mode 100644 src/components/UnpublishedListing/UnpublishedListing.js delete mode 100644 src/components/UnpublishedListing/UnpublishedListingCardMeta.css delete mode 100644 src/components/UnpublishedListing/UnpublishedListingCardMeta.js delete mode 100644 src/components/Widgets.js delete mode 100644 src/components/Widgets/BooleanControl.css delete mode 100644 src/components/Widgets/BooleanControl.js delete mode 100644 src/components/Widgets/DateTimeControl.js delete mode 100644 src/components/Widgets/FileControl.css delete mode 100644 src/components/Widgets/FileControl.js delete mode 100644 src/components/Widgets/ImageControl.js delete mode 100644 src/components/Widgets/ListControl.css delete mode 100644 src/components/Widgets/Markdown/MarkdownControl/Toolbar/Toolbar.css delete mode 100644 src/components/Widgets/Markdown/MarkdownControl/Toolbar/Toolbar.js delete mode 100644 src/components/Widgets/Markdown/MarkdownControl/Toolbar/ToolbarButton.css delete mode 100644 src/components/Widgets/Markdown/MarkdownControl/Toolbar/ToolbarButton.js delete mode 100644 src/components/Widgets/Markdown/MarkdownControl/Toolbar/ToolbarComponentsMenu.css delete mode 100644 src/components/Widgets/Markdown/MarkdownControl/Toolbar/ToolbarComponentsMenu.js delete mode 100644 src/components/Widgets/Markdown/MarkdownControl/Toolbar/ToolbarPluginForm.css delete mode 100644 src/components/Widgets/Markdown/MarkdownControl/Toolbar/ToolbarPluginForm.js delete mode 100644 src/components/Widgets/Markdown/MarkdownControl/Toolbar/ToolbarPluginFormControl.js delete mode 100644 src/components/Widgets/ObjectControl.css delete mode 100644 src/components/Widgets/ObjectControl.js delete mode 100644 src/components/Widgets/SelectControl.js delete mode 100644 src/components/Widgets/StringControl.js delete mode 100644 src/components/Widgets/TextControl.js delete mode 100644 src/components/Widgets/defaultPreviewStyle.js create mode 100644 src/components/Workflow/Workflow.css create mode 100644 src/components/Workflow/Workflow.js create mode 100644 src/components/Workflow/WorkflowCard.css create mode 100644 src/components/Workflow/WorkflowCard.js create mode 100644 src/components/Workflow/WorkflowList.css create mode 100644 src/components/Workflow/WorkflowList.js delete mode 100644 src/components/stories/Card.js delete mode 100644 src/components/stories/FindBar.js delete mode 100644 src/components/stories/Icon.js delete mode 100644 src/components/stories/ScrollSync.js delete mode 100644 src/components/stories/Toast.js delete mode 100644 src/components/stories/index.js create mode 100644 src/constants/collectionViews.js delete mode 100644 src/containers/App.css delete mode 100644 src/containers/App.js delete mode 100644 src/containers/CollectionPage.css delete mode 100644 src/containers/CollectionPage.js delete mode 100644 src/containers/DashboardPage.js delete mode 100644 src/containers/EntryPage.js delete mode 100644 src/containers/NotFoundPage.js delete mode 100644 src/containers/Sidebar.css delete mode 100644 src/containers/Sidebar.js delete mode 100644 src/containers/editorialWorkflow/EntryPageHOC.js delete mode 100644 src/containers/editorialWorkflow/UnpublishedEntriesPanel.js delete mode 100644 src/material-icons.css delete mode 100644 src/react-toolbox-global.css delete mode 100644 src/reducers/editor.js delete mode 100644 src/root.js delete mode 100644 src/utils.css delete mode 100644 wallaby.config.js diff --git a/.babelrc b/.babelrc index 6ec82922..825ea6b8 100644 --- a/.babelrc +++ b/.babelrc @@ -7,7 +7,6 @@ "react" ], "plugins": [ - "react-hot-loader/babel", "lodash", ["babel-plugin-transform-builtin-extend", { "globals": ["Error"] diff --git a/.storybook/config.js b/.storybook/config.js deleted file mode 100644 index 1977c69a..00000000 --- a/.storybook/config.js +++ /dev/null @@ -1,8 +0,0 @@ -import { configure } from '@kadira/storybook'; -import '../src/index.css'; - -function loadStories() { - require('../src/components/stories/'); -} - -configure(loadStories, module); diff --git a/.storybook/webpack.config.js b/.storybook/webpack.config.js deleted file mode 100644 index e62e19d4..00000000 --- a/.storybook/webpack.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('../webpack.base.js'); diff --git a/example/config.yml b/example/config.yml index c1866961..3a2a746f 100644 --- a/example/config.yml +++ b/example/config.yml @@ -1,11 +1,15 @@ backend: name: test-repo +display_url: https://example.com media_folder: "assets/uploads" collections: # A list of collections the CMS should be able to edit - name: "posts" # Used in routes, ie.: /admin/collections/:slug/edit label: "Post" # Used in the UI, ie.: "New Post" + description: > + The description is a great place for tone setting, high level information, and editing + guidelines that are specific to a collection. folder: "_posts" slug: "{{year}}-{{month}}-{{day}}-{{slug}}" create: true # Allow users to create new documents in this collection diff --git a/example/moby-dick.jpg b/example/moby-dick.jpg index cbbbffbd753c9a6dcf4c1834fc1ed45afca737fd..0eb9c8b59581383866f74f9c6f5a43ffbbaedbe6 100644 GIT binary patch literal 364538 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 z�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∋4-=nXMdx<4|a#F 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

}owxy*@~;aU!97EIGJ=PkM@jRmH!p>Y&9 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

agp=$Lt~{ei4E(t-g`F6t(^?@hwbw#i3p4} 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Π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 (T?? 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 JNBVK`{{dON?s)(J diff --git a/package.json b/package.json index 84abe699..d2956cdb 100644 --- a/package.json +++ b/package.json @@ -11,8 +11,6 @@ "build:scripts": "cross-env NODE_ENV=production webpack --config webpack.cli.js", "add-contributor": "all-contributors add", "generate-contributors": "all-contributors generate", - "storybook": "start-storybook -p 9001", - "storybook-build": "build-storybook -o dist", "lint": "npm run lint:js & npm run lint:css", "lint:js": "eslint .", "lint:js:fix": "npm run lint:js -- --fix", @@ -73,7 +71,6 @@ "last 2 ChromeAndroid versions" ], "devDependencies": { - "@kadira/storybook": "^1.36.0", "all-contributors-cli": "^4.4.0", "babel": "^6.5.2", "babel-cli": "^6.18.0", @@ -87,7 +84,6 @@ "babel-preset-react": "^6.23.0", "babel-preset-stage-1": "^6.22.0", "babel-runtime": "^6.23.0", - "caniuse-lite": "^1.0.30000745", "cross-env": "^5.0.2", "css-loader": "^0.28.7", "cssnano": "^v4.0.0-rc.2", @@ -110,7 +106,6 @@ "postcss-import": "^11.0.0", "postcss-loader": "^2.0.7", "raf": "^3.4.0", - "react-hot-loader": "^3.0.0-beta.7", "react-test-renderer": "^16.0.0", "style-loader": "^0.18.2", "stylefmt": "^4.3.1", @@ -119,8 +114,8 @@ "stylelint-config-standard": "^13.0.2", "stylelint-declaration-block-order": "^0.1.0", "stylelint-declaration-use-variable": "^1.6.0", + "svg-inline-loader": "^0.8.0", "uglifyjs-webpack-plugin": "^1.0.1", - "url-loader": "^0.5.9", "webpack": "^3.6.0", "webpack-dev-server": "^2.9.1", "webpack-merge": "^4.1.0", @@ -129,7 +124,6 @@ "dependencies": { "classnames": "^2.2.5", "create-react-class": "^15.6.0", - "focus-trap-react": "^3.0.3", "fuzzy": "^0.1.1", "gotrue-js": "^0.9.15", "gray-matter": "^3.0.6", @@ -140,27 +134,28 @@ "jwt-decode": "^2.1.0", "localforage": "^1.4.2", "lodash": "^4.13.1", - "material-design-icons": "^3.0.1", "mdast-util-definitions": "^1.2.2", "mdast-util-to-string": "^1.0.4", "moment": "^2.11.2", - "normalize.css": "^4.2.0", "prop-types": "^15.5.10", "react": "^16.0.0", + "react-aria-menubutton": "^5.1.0", "react-autosuggest": "^9.3.2", - "react-datetime": "^2.6.0", + "react-datetime": "^2.11.0", "react-dnd": "^2.5.4", "react-dnd-html5-backend": "^2.5.4", "react-dom": "^16.0.0", "react-frame-component": "^2.0.0", "react-immutable-proptypes": "^2.1.0", + "react-modal": "^3.1.5", "react-redux": "^4.4.0", "react-router-dom": "^4.2.2", "react-router-redux": "^5.0.0-alpha.8", - "react-sidebar": "^2.2.1", + "react-scroll-sync": "^0.4.0", "react-sortable-hoc": "^0.6.8", "react-split-pane": "^0.1.66", - "react-toolbox": "^2.0.0-beta.12", + "react-textarea-autosize": "^5.2.0", + "react-toggled": "^1.1.2", "react-topbar-progress-indicator": "^2.0.0", "react-transition-group": "^2.2.1", "react-waypoint": "^7.1.0", @@ -189,7 +184,8 @@ "unist-builder": "^1.0.2", "unist-util-visit-parents": "^1.1.1", "url": "^0.11.0", - "uuid": "^3.1.0" + "uuid": "^3.1.0", + "what-input": "^5.0.3" }, "optionalDependencies": { "fsevents": "^1.0.14" diff --git a/postcss.config.js b/postcss.config.js index 377a7b27..4668f798 100644 --- a/postcss.config.js +++ b/postcss.config.js @@ -3,17 +3,7 @@ const webpack = require('webpack'); module.exports = { plugins: [ require('postcss-import')({ addDependencyTo: webpack }), - require('postcss-cssnext')({ - features: { - customProperties: { - variables: { - "preferred-font": 'inherit', // Override react-toolbox font setting - }, - }, - }, - }), - require('cssnano')({ - preset: 'default', - }), + require('postcss-cssnext')(), + require('cssnano')({ preset: 'default' }), ], }; diff --git a/src/actions/auth.js b/src/actions/auth.js index a0e3ee84..8b19aa9b 100644 --- a/src/actions/auth.js +++ b/src/actions/auth.js @@ -1,5 +1,5 @@ -import { currentBackend } from '../backends/backend'; import { actions as notifActions } from 'redux-notifications'; +import { currentBackend } from 'Backends/backend'; const { notifSend } = notifActions; diff --git a/src/actions/collections.js b/src/actions/collections.js new file mode 100644 index 00000000..70cf1b3c --- /dev/null +++ b/src/actions/collections.js @@ -0,0 +1,14 @@ +import history from 'Routing/history'; +import { getCollectionUrl, getNewEntryUrl } from 'Lib/urlHelper'; + +export function searchCollections(query) { + history.push(`/search/${query}`); +} + +export function showCollection(collectionName) { + history.push(getCollectionUrl(collectionName)); +} + +export function createNewEntry(collectionName) { + history.push(getNewEntryUrl(collectionName)); +} diff --git a/src/actions/config.js b/src/actions/config.js index 5f1c3f2d..3dd7bde8 100644 --- a/src/actions/config.js +++ b/src/actions/config.js @@ -1,7 +1,7 @@ import yaml from "js-yaml"; import { set, defaultsDeep, get } from "lodash"; -import { authenticateUser } from "../actions/auth"; -import * as publishModes from "../constants/publishModes"; +import { authenticateUser } from "Actions/auth"; +import * as publishModes from "Constants/publishModes"; export const CONFIG_REQUEST = "CONFIG_REQUEST"; export const CONFIG_SUCCESS = "CONFIG_SUCCESS"; diff --git a/src/actions/editor.js b/src/actions/editor.js deleted file mode 100644 index c7a98c5f..00000000 --- a/src/actions/editor.js +++ /dev/null @@ -1,22 +0,0 @@ -import history from '../routing/history'; - -export const SWITCH_VISUAL_MODE = 'SWITCH_VISUAL_MODE'; -export const CLOSED_ENTRY = 'CLOSED_ENTRY'; - -export function switchVisualMode(useVisualMode) { - return { - type: SWITCH_VISUAL_MODE, - payload: useVisualMode, - }; -} - -export function closeEntry(collection) { - return (dispatch) => { - if (collection && collection.get('name', false)) { - history.push(`collections/${ collection.get('name') }`); - } else { - history.goBack(); - } - dispatch({ type: CLOSED_ENTRY }); - }; -} diff --git a/src/actions/editorialWorkflow.js b/src/actions/editorialWorkflow.js index 9255cf14..92b9f57c 100644 --- a/src/actions/editorialWorkflow.js +++ b/src/actions/editorialWorkflow.js @@ -1,14 +1,13 @@ import uuid from 'uuid/v4'; import { actions as notifActions } from 'redux-notifications'; -import { serializeValues } from '../lib/serializeEntryValues'; -import { closeEntry } from './editor'; import { BEGIN, COMMIT, REVERT } from 'redux-optimist'; -import { currentBackend } from '../backends/backend'; -import { getAsset } from '../reducers'; -import { selectFields } from '../reducers/collections'; +import { serializeValues } from 'Lib/serializeEntryValues'; +import { currentBackend } from 'Backends/backend'; +import { getAsset } from 'Reducers'; +import { selectFields } from 'Reducers/collections'; +import { status, EDITORIAL_WORKFLOW } from 'Constants/publishModes'; +import { EditorialWorkflowError } from "ValueObjects/errors"; import { loadEntry } from './entries'; -import { status, EDITORIAL_WORKFLOW } from '../constants/publishModes'; -import { EditorialWorkflowError } from "../valueObjects/errors"; const { notifSend } = notifActions; @@ -35,6 +34,10 @@ export const UNPUBLISHED_ENTRY_PUBLISH_REQUEST = 'UNPUBLISHED_ENTRY_PUBLISH_REQU export const UNPUBLISHED_ENTRY_PUBLISH_SUCCESS = 'UNPUBLISHED_ENTRY_PUBLISH_SUCCESS'; export const UNPUBLISHED_ENTRY_PUBLISH_FAILURE = 'UNPUBLISHED_ENTRY_PUBLISH_FAILURE'; +export const UNPUBLISHED_ENTRY_DELETE_REQUEST = 'UNPUBLISHED_ENTRY_DELETE_REQUEST'; +export const UNPUBLISHED_ENTRY_DELETE_SUCCESS = 'UNPUBLISHED_ENTRY_DELETE_SUCCESS'; +export const UNPUBLISHED_ENTRY_DELETE_FAILURE = 'UNPUBLISHED_ENTRY_DELETE_FAILURE'; + /* * Simple Action Creators (Internal) */ @@ -105,12 +108,13 @@ function unpublishedEntryPersisting(collection, entry, transactionID) { }; } -function unpublishedEntryPersisted(collection, entry, transactionID) { +function unpublishedEntryPersisted(collection, entry, transactionID, slug) { return { type: UNPUBLISHED_ENTRY_PERSIST_SUCCESS, payload: { collection: collection.get('name'), entry, + slug, }, optimist: { type: COMMIT, id: transactionID }, }; @@ -183,6 +187,30 @@ function unpublishedEntryPublishError(collection, slug, transactionID) { }; } +function unpublishedEntryDeleteRequest(collection, slug, transactionID) { + return { + type: UNPUBLISHED_ENTRY_DELETE_REQUEST, + payload: { collection, slug }, + optimist: { type: BEGIN, id: transactionID }, + }; +} + +function unpublishedEntryDeleted(collection, slug, transactionID) { + return { + type: UNPUBLISHED_ENTRY_DELETE_SUCCESS, + payload: { collection, slug }, + optimist: { type: COMMIT, id: transactionID }, + }; +} + +function unpublishedEntryDeleteError(collection, slug, transactionID) { + return { + type: UNPUBLISHED_ENTRY_DELETE_FAILURE, + payload: { collection, slug }, + optimist: { type: REVERT, id: transactionID }, + }; +} + /* * Exported Thunk Action Creators */ @@ -223,7 +251,7 @@ export function loadUnpublishedEntries(collections) { } export function persistUnpublishedEntry(collection, existingUnpublishedEntry) { - return (dispatch, getState) => { + return async (dispatch, getState) => { const state = getState(); const entryDraft = state.entryDraft; @@ -246,23 +274,32 @@ export function persistUnpublishedEntry(collection, existingUnpublishedEntry) { dispatch(unpublishedEntryPersisting(collection, serializedEntry, transactionID)); const persistAction = existingUnpublishedEntry ? backend.persistUnpublishedEntry : backend.persistEntry; - return persistAction.call(backend, state.config, collection, serializedEntryDraft, assetProxies.toJS(), state.integrations) - .then(() => { + const persistCallArgs = [ + backend, + state.config, + collection, + serializedEntryDraft, + assetProxies.toJS(), + state.integrations, + ]; + + try { + const newSlug = await persistAction.call(...persistCallArgs); dispatch(notifSend({ message: 'Entry saved', kind: 'success', dismissAfter: 4000, })); - return dispatch(unpublishedEntryPersisted(collection, serializedEntry, transactionID)); - }) - .catch((error) => { + dispatch(unpublishedEntryPersisted(collection, serializedEntry, transactionID, newSlug)); + } + catch(error) { dispatch(notifSend({ message: `Failed to persist entry: ${ error }`, kind: 'danger', dismissAfter: 8000, })); return Promise.reject(dispatch(unpublishedEntryPersistedFail(error, transactionID))); - }); + } }; } @@ -274,9 +311,19 @@ export function updateUnpublishedEntryStatus(collection, slug, oldStatus, newSta dispatch(unpublishedEntryStatusChangeRequest(collection, slug, oldStatus, newStatus, transactionID)); backend.updateUnpublishedEntryStatus(collection, slug, newStatus) .then(() => { + dispatch(notifSend({ + message: 'Entry status updated', + kind: 'success', + dismissAfter: 4000, + })); dispatch(unpublishedEntryStatusChangePersisted(collection, slug, oldStatus, newStatus, transactionID)); }) .catch(() => { + dispatch(notifSend({ + message: `Failed to update status: ${ error }`, + kind: 'danger', + dismissAfter: 8000, + })); dispatch(unpublishedEntryStatusChangeError(collection, slug, transactionID)); }); }; @@ -287,18 +334,23 @@ export function deleteUnpublishedEntry(collection, slug) { const state = getState(); const backend = currentBackend(state.config); const transactionID = uuid(); - dispatch(unpublishedEntryPublishRequest(collection, slug, transactionID)); - backend.deleteUnpublishedEntry(collection, slug) + dispatch(unpublishedEntryDeleteRequest(collection, slug, transactionID)); + return backend.deleteUnpublishedEntry(collection, slug) .then(() => { - dispatch(unpublishedEntryPublished(collection, slug, transactionID)); + dispatch(notifSend({ + message: 'Unpublished changes deleted', + kind: 'success', + dismissAfter: 4000, + })); + dispatch(unpublishedEntryDeleted(collection, slug, transactionID)); }) .catch((error) => { dispatch(notifSend({ - message: `Failed to close PR: ${ error }`, + message: `Failed to delete unpublished changes: ${ error }`, kind: 'danger', dismissAfter: 8000, })); - dispatch(unpublishedEntryPublishError(collection, slug, transactionID)); + dispatch(unpublishedEntryDeleteError(collection, slug, transactionID)); }); }; } @@ -309,13 +361,18 @@ export function publishUnpublishedEntry(collection, slug) { const backend = currentBackend(state.config); const transactionID = uuid(); dispatch(unpublishedEntryPublishRequest(collection, slug, transactionID)); - backend.publishUnpublishedEntry(collection, slug) + return backend.publishUnpublishedEntry(collection, slug) .then(() => { + dispatch(notifSend({ + message: 'Entry published', + kind: 'success', + dismissAfter: 4000, + })); dispatch(unpublishedEntryPublished(collection, slug, transactionID)); }) .catch((error) => { dispatch(notifSend({ - message: `Failed to merge: ${ error }`, + message: `Failed to publish: ${ error }`, kind: 'danger', dismissAfter: 8000, })); diff --git a/src/actions/entries.js b/src/actions/entries.js index 72df4a40..4797f479 100644 --- a/src/actions/entries.js +++ b/src/actions/entries.js @@ -1,13 +1,12 @@ import { List } from 'immutable'; import { actions as notifActions } from 'redux-notifications'; -import { serializeValues } from '../lib/serializeEntryValues'; -import { closeEntry } from './editor'; -import { currentBackend } from '../backends/backend'; -import { getIntegrationProvider } from '../integrations'; -import { getAsset, selectIntegration } from '../reducers'; -import { selectFields } from '../reducers/collections'; -import { createEntry } from '../valueObjects/Entry'; -import ValidationErrorTypes from '../constants/validationErrorTypes'; +import { serializeValues } from 'Lib/serializeEntryValues'; +import { currentBackend } from 'Backends/backend'; +import { getIntegrationProvider } from 'Integrations'; +import { getAsset, selectIntegration } from 'Reducers'; +import { selectFields } from 'Reducers/collections'; +import { createEntry } from 'ValueObjects/Entry'; +import ValidationErrorTypes from 'Constants/validationErrorTypes'; const { notifSend } = notifActions; @@ -111,12 +110,17 @@ export function entryPersisting(collection, entry) { }; } -export function entryPersisted(collection, entry) { +export function entryPersisted(collection, entry, slug) { return { type: ENTRY_PERSIST_SUCCESS, payload: { collectionName: collection.get('name'), entrySlug: entry.get('slug'), + + /** + * Pass slug from backend for newly created entries. + */ + slug, }, }; } @@ -299,13 +303,13 @@ export function persistEntry(collection) { dispatch(entryPersisting(collection, serializedEntry)); return backend .persistEntry(state.config, collection, serializedEntryDraft, assetProxies.toJS()) - .then(() => { + .then(slug => { dispatch(notifSend({ message: 'Entry saved', kind: 'success', dismissAfter: 4000, })); - return dispatch(entryPersisted(collection, serializedEntry)); + dispatch(entryPersisted(collection, serializedEntry, slug)) }) .catch((error) => { console.error(error); diff --git a/src/actions/findbar.js b/src/actions/findbar.js deleted file mode 100644 index d257abc2..00000000 --- a/src/actions/findbar.js +++ /dev/null @@ -1,38 +0,0 @@ -import history from '../routing/history'; -import { SEARCH } from '../components/FindBar/FindBar'; -import { getCollectionUrl, getNewEntryUrl } from '../lib/urlHelper'; - -export const RUN_COMMAND = 'RUN_COMMAND'; -export const SHOW_COLLECTION = 'SHOW_COLLECTION'; -export const CREATE_COLLECTION = 'CREATE_COLLECTION'; -export const HELP = 'HELP'; - -export function runCommand(command, payload) { - return (dispatch) => { - switch (command) { - case SHOW_COLLECTION: - history.push(getCollectionUrl(payload.collectionName)); - break; - case CREATE_COLLECTION: - history.push(getNewEntryUrl(payload.collectionName)); - break; - case HELP: - window.alert('Find Bar Help (PLACEHOLDER)\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit.'); - break; - case SEARCH: - history.push(`/search/${ payload.searchTerm }`); - break; - default: - break; - } - dispatch({ type: RUN_COMMAND, command, payload }); - }; -} - -export function navigateToCollection(collectionName) { - return runCommand(SHOW_COLLECTION, { collectionName }); -} - -export function createNewEntryInCollection(collectionName) { - return runCommand(CREATE_COLLECTION, { collectionName }); -} diff --git a/src/actions/globalUI.js b/src/actions/globalUI.js deleted file mode 100644 index ca9e4088..00000000 --- a/src/actions/globalUI.js +++ /dev/null @@ -1,13 +0,0 @@ -export const TOGGLE_SIDEBAR = 'TOGGLE_SIDEBAR'; -export const OPEN_SIDEBAR = 'OPEN_SIDEBAR'; - -export function toggleSidebar() { - return { type: TOGGLE_SIDEBAR }; -} - -export function openSidebar(open = false) { - return { - type: OPEN_SIDEBAR, - payload: { open }, - }; -} diff --git a/src/actions/mediaLibrary.js b/src/actions/mediaLibrary.js index 805065e3..a5861664 100644 --- a/src/actions/mediaLibrary.js +++ b/src/actions/mediaLibrary.js @@ -1,15 +1,16 @@ import { actions as notifActions } from 'redux-notifications'; -import { currentBackend } from '../backends/backend'; -import { createAssetProxy } from '../valueObjects/AssetProxy'; -import { getAsset, selectIntegration } from '../reducers'; +import { currentBackend } from 'Backends/backend'; +import { createAssetProxy } from 'ValueObjects/AssetProxy'; +import { getAsset, selectIntegration } from 'Reducers'; +import { getIntegrationProvider } from 'Integrations'; import { addAsset } from './media'; -import { getIntegrationProvider } from '../integrations'; const { notifSend } = notifActions; export const MEDIA_LIBRARY_OPEN = 'MEDIA_LIBRARY_OPEN'; export const MEDIA_LIBRARY_CLOSE = 'MEDIA_LIBRARY_CLOSE'; export const MEDIA_INSERT = 'MEDIA_INSERT'; +export const MEDIA_REMOVE_INSERTED = 'MEDIA_REMOVE_INSERTED'; export const MEDIA_LOAD_REQUEST = 'MEDIA_LOAD_REQUEST'; export const MEDIA_LOAD_SUCCESS = 'MEDIA_LOAD_SUCCESS'; export const MEDIA_LOAD_FAILURE = 'MEDIA_LOAD_FAILURE'; @@ -32,6 +33,10 @@ export function insertMedia(mediaPath) { return { type: MEDIA_INSERT, payload: { mediaPath } }; } +export function removeInsertedMedia(controlID) { + return { type: MEDIA_REMOVE_INSERTED, payload: { controlID } }; +} + export function loadMedia(opts = {}) { const { delay = 0, query = '', page = 1, privateUpload } = opts; return async (dispatch, getState) => { diff --git a/src/actions/search.js b/src/actions/search.js index 81e96ce7..dfc22b99 100644 --- a/src/actions/search.js +++ b/src/actions/search.js @@ -1,9 +1,9 @@ import fuzzy from 'fuzzy'; -import { currentBackend } from '../backends/backend'; -import { getIntegrationProvider } from '../integrations'; -import { selectIntegration, selectEntries } from '../reducers'; -import { selectInferedField } from '../reducers/collections'; -import { WAIT_UNTIL_ACTION } from '../redux/middleware/waitUntilAction'; +import { currentBackend } from 'Backends/backend'; +import { getIntegrationProvider } from 'Integrations'; +import { selectIntegration, selectEntries } from 'Reducers'; +import { selectInferedField } from 'Reducers/collections'; +import { WAIT_UNTIL_ACTION } from 'Redux/middleware/waitUntilAction'; import { loadEntries, ENTRIES_SUCCESS } from './entries'; /* diff --git a/src/backends/backend.js b/src/backends/backend.js index 4b73307d..4f2771af 100644 --- a/src/backends/backend.js +++ b/src/backends/backend.js @@ -1,12 +1,19 @@ import { attempt, isError } from 'lodash'; +import { resolveFormat } from "Formats/formats"; +import { selectIntegration } from 'Reducers/integrations'; +import { + selectListMethod, + selectEntrySlug, + selectEntryPath, + selectAllowNewEntries, + selectAllowDeletion, + selectFolderEntryExtension +} from "Reducers/collections"; +import { createEntry } from "ValueObjects/Entry"; +import { sanitizeSlug } from "Lib/urlHelper"; import TestRepoBackend from "./test-repo/implementation"; import GitHubBackend from "./github/implementation"; import GitGatewayBackend from "./git-gateway/implementation"; -import { resolveFormat } from "../formats/formats"; -import { selectIntegration } from '../reducers/integrations'; -import { selectListMethod, selectEntrySlug, selectEntryPath, selectAllowNewEntries, selectAllowDeletion, selectFolderEntryExtension } from "../reducers/collections"; -import { createEntry } from "../valueObjects/Entry"; -import { sanitizeSlug } from "../lib/urlHelper"; class LocalStorageAuthStore { storageKey = "netlify-cms-user"; @@ -252,10 +259,10 @@ class Backend { */ const hasAssetStore = integrations && !!selectIntegration(integrations, null, 'assetStore'); const updatedOptions = { ...options, hasAssetStore }; + const opts = { newEntry, parsedData, commitMessage, collectionName, mode, ...updatedOptions }; - return this.implementation.persistEntry(entryObj, MediaFiles, { - newEntry, parsedData, commitMessage, collectionName, mode, ...updatedOptions, - }); + return this.implementation.persistEntry(entryObj, MediaFiles, opts) + .then(() => entryObj.slug); } persistMedia(file) { diff --git a/src/backends/git-gateway/API.js b/src/backends/git-gateway/API.js index 3f75c1cc..10737bb3 100644 --- a/src/backends/git-gateway/API.js +++ b/src/backends/git-gateway/API.js @@ -1,5 +1,5 @@ -import GithubAPI from "../github/API"; -import { APIError } from "../../valueObjects/errors"; +import GithubAPI from "Backends/github/API"; +import { APIError } from "ValueObjects/errors"; export default class API extends GithubAPI { constructor(config) { diff --git a/src/backends/git-gateway/AuthenticationPage.css b/src/backends/git-gateway/AuthenticationPage.css index d71790be..0a51b8fa 100644 --- a/src/backends/git-gateway/AuthenticationPage.css +++ b/src/backends/git-gateway/AuthenticationPage.css @@ -1,31 +1,45 @@ .nc-gitGatewayAuthenticationPage-root { display: flex; + flex-flow: column nowrap; align-items: center; justify-content: center; height: 100vh; } -.nc-gitGatewayAuthenticationPage-card { +.nc-gitGatewayAuthenticationPage-form { width: 350px; - padding: 10px; -} + margin-top: -80px; + & input { + background-color: #fff; + border-radius: var(--borderRadius); -.nc-gitGatewayAuthenticationPage-card img { - display: block; - margin: auto; - padding-bottom: 5px; -} + font-size: 14px; + padding: 10px 10px; + margin-bottom: 15px; + margin-top: 6px; + width: 100%; + position: relative; + z-index: 1; -.nc-gitGatewayAuthenticationPage-errorMsg { - color: #dd0000; -} - -.nc-gitGatewayAuthenticationPage-message { - font-size: 1.1em; - margin: 20px 10px; + &:focus { + outline: none; + box-shadow: inset 0 0 0 2px var(--colorBlue); + } + } } .nc-gitGatewayAuthenticationPage-button { - padding: .25em 1em; - height: auto; + @apply(--button); + @apply(--dropShadowDeep); + @apply(--buttonDefault); + @apply(--buttonGray); + + padding: 0 30px; + display: block; + margin-top: 20px; + margin-left: auto; +} + +.nc-gitGatewayAuthenticationPage-errorMsg { + color: var(--colorErrorText); } diff --git a/src/backends/git-gateway/AuthenticationPage.js b/src/backends/git-gateway/AuthenticationPage.js index 058030b3..820a1354 100644 --- a/src/backends/git-gateway/AuthenticationPage.js +++ b/src/backends/git-gateway/AuthenticationPage.js @@ -1,11 +1,8 @@ import PropTypes from 'prop-types'; import React from "react"; -import Input from "react-toolbox/lib/input"; -import Button from "react-toolbox/lib/button"; +import { partial } from 'lodash'; import { Notifs } from 'redux-notifications'; -import { Toast } from '../../components/UI/index'; -import { Card, Icon } from "../../components/UI"; -import logo from "./netlify_logo.svg"; +import { Toast, Icon } from 'UI'; let component = null; @@ -59,8 +56,8 @@ export default class AuthenticationPage extends React.Component { state = { email: "", password: "", errors: {} }; - handleChange = (name, value) => { - this.setState({ ...this.state, [name]: value }); + handleChange = (name, e) => { + this.setState({ ...this.state, [name]: e.target.value }); }; handleLogin = (e) => { @@ -96,48 +93,42 @@ export default class AuthenticationPage extends React.Component { if (window.netlifyIdentity) { return

- +
} return (
- -
- - {error &&

- {error} -

} - {errors.server &&

- {errors.server} -

} - - - -
-
+ +
+ {!error &&

+ {error} +

} + {!errors.server &&

+ {errors.server} +

} +
{ errors.email || null }
+ +
{ errors.password || null }
+ + +
); } diff --git a/src/backends/git-gateway/implementation.js b/src/backends/git-gateway/implementation.js index cdc3ebe4..cd8f029c 100644 --- a/src/backends/git-gateway/implementation.js +++ b/src/backends/git-gateway/implementation.js @@ -2,7 +2,7 @@ import GoTrue from "gotrue-js"; import jwtDecode from 'jwt-decode'; import {List} from 'immutable'; import { get, pick, intersection } from "lodash"; -import GitHubBackend from "../github/implementation"; +import GitHubBackend from "Backends/github/implementation"; import API from "./API"; import AuthenticationPage from "./AuthenticationPage"; diff --git a/src/backends/git-gateway/netlify_logo.svg b/src/backends/git-gateway/netlify_logo.svg deleted file mode 100644 index 7e426899..00000000 --- a/src/backends/git-gateway/netlify_logo.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - Netlify - - - - - - - - - - - - - - - - - - - - diff --git a/src/backends/github/API.js b/src/backends/github/API.js index 7e3eda86..60152b2f 100644 --- a/src/backends/github/API.js +++ b/src/backends/github/API.js @@ -1,10 +1,10 @@ import LocalForage from "localforage"; import { Base64 } from "js-base64"; import { uniq, initial, last, get, find } from "lodash"; -import { filterPromises, resolvePromiseProperties } from "../../lib/promiseHelper"; -import AssetProxy from "../../valueObjects/AssetProxy"; -import { SIMPLE, EDITORIAL_WORKFLOW, status } from "../../constants/publishModes"; -import { APIError, EditorialWorkflowError } from "../../valueObjects/errors"; +import { filterPromises, resolvePromiseProperties } from "Lib/promiseHelper"; +import AssetProxy from "ValueObjects/AssetProxy"; +import { SIMPLE, EDITORIAL_WORKFLOW, status } from "Constants/publishModes"; +import { APIError, EditorialWorkflowError } from "ValueObjects/errors"; const CMS_BRANCH_PREFIX = 'cms/'; @@ -270,6 +270,7 @@ export default class API { .then(branchData => this.updateTree(branchData.commit.sha, "/", fileTree)) .then(changeTree => this.commit(options.commitMessage, changeTree)) .then(response => this.patchBranch(this.branch, response.sha)); + } else if (options.mode && options.mode === EDITORIAL_WORKFLOW) { const mediaFilesList = mediaFiles.map(file => ({ path: file.path, sha: file.sha })); return this.editorialWorkflowGit(fileTree, entry, mediaFilesList, options); diff --git a/src/backends/github/AuthenticationPage.css b/src/backends/github/AuthenticationPage.css index 1465a12e..124099ae 100644 --- a/src/backends/github/AuthenticationPage.css +++ b/src/backends/github/AuthenticationPage.css @@ -6,7 +6,24 @@ height: 100vh; } -.nc-githubAuthenticationPage-button { - padding: .25em 1em; - height: auto; +.nc-githubAuthenticationPage-logo { + color: #c4c6d2; + margin-top: -300px; +} + +.nc-githubAuthenticationPage-button { + @apply(--button); + @apply(--dropShadowDeep); + @apply(--buttonDefault); + @apply(--buttonGray); + + padding: 0 30px; + margin-top: -80px; + display: flex; + align-items: center; + position: relative; + + & .nc-icon { + margin-right: 18px; + } } diff --git a/src/backends/github/AuthenticationPage.js b/src/backends/github/AuthenticationPage.js index 71ec7a06..319309d0 100644 --- a/src/backends/github/AuthenticationPage.js +++ b/src/backends/github/AuthenticationPage.js @@ -1,10 +1,8 @@ import PropTypes from 'prop-types'; import React from 'react'; -import Button from 'react-toolbox/lib/button'; -import Authenticator from '../../lib/netlify-auth'; -import { Icon } from '../../components/UI'; +import Authenticator from 'Lib/netlify-auth'; import { Notifs } from 'redux-notifications'; -import { Toast } from '../../components/UI/index'; +import { Icon, Toast } from 'UI'; export default class AuthenticationPage extends React.Component { static propTypes = { @@ -37,16 +35,16 @@ export default class AuthenticationPage extends React.Component { return (
+ {loginError &&

{loginError}

} - +
); } diff --git a/src/backends/github/__tests__/API.spec.js b/src/backends/github/__tests__/API.spec.js index ba665961..de2a74bb 100644 --- a/src/backends/github/__tests__/API.spec.js +++ b/src/backends/github/__tests__/API.spec.js @@ -1,4 +1,4 @@ -import AssetProxy from "../../../valueObjects/AssetProxy"; +import AssetProxy from "ValueObjects/AssetProxy"; import API from "../API"; describe('github API', () => { diff --git a/src/backends/github/implementation.js b/src/backends/github/implementation.js index bba53bda..eb3b865d 100644 --- a/src/backends/github/implementation.js +++ b/src/backends/github/implementation.js @@ -1,8 +1,8 @@ import trimStart from 'lodash/trimStart'; import semaphore from "semaphore"; +import { fileExtension } from 'Lib/pathHelper' import AuthenticationPage from "./AuthenticationPage"; import API from "./API"; -import { fileExtension } from '../../lib/pathHelper' const MAX_CONCURRENT_DOWNLOADS = 10; @@ -15,7 +15,7 @@ export default class GitHub { } this.repo = config.getIn(["backend", "repo"], ""); - this.branch = config.getIn(["backend", "branch"], "master"); + this.branch = config.getIn(["backend", "branch"], "master").trim(); this.api_root = config.getIn(["backend", "api_root"], "https://api.github.com"); this.token = ''; } diff --git a/src/backends/test-repo/AuthenticationPage.js b/src/backends/test-repo/AuthenticationPage.js index 17c5d77f..ca38d68b 100644 --- a/src/backends/test-repo/AuthenticationPage.js +++ b/src/backends/test-repo/AuthenticationPage.js @@ -1,9 +1,6 @@ import PropTypes from 'prop-types'; import React from 'react'; -import Input from "react-toolbox/lib/input"; -import Button from "react-toolbox/lib/button"; -import { Card, Icon } from "../../components/UI"; -import logo from "../git-gateway/netlify_logo.svg"; +import { Icon } from 'UI'; export default class AuthenticationPage extends React.Component { static propTypes = { @@ -11,40 +8,25 @@ export default class AuthenticationPage extends React.Component { inProgress: PropTypes.bool.isRequired, }; - state = { email: '' }; - handleLogin = (e) => { e.preventDefault(); this.props.onLogin(this.state); }; - handleEmailChange = (value) => { - this.setState({ email: value }); - }; - render() { const { inProgress } = this.props; - return (
- - -

This is a demo, enter your email to start

- - -
-
); + {inProgress ? "Logging in..." : "Login"} + + + ); } } diff --git a/src/backends/test-repo/implementation.js b/src/backends/test-repo/implementation.js index 9e82204e..55a723de 100644 --- a/src/backends/test-repo/implementation.js +++ b/src/backends/test-repo/implementation.js @@ -1,7 +1,7 @@ import { remove, attempt, isError } from 'lodash'; import uuid from 'uuid/v4'; +import { fileExtension } from 'Lib/pathHelper' import AuthenticationPage from './AuthenticationPage'; -import { fileExtension } from '../../lib/pathHelper' window.repoFiles = window.repoFiles || {}; @@ -14,15 +14,6 @@ function getFile(path) { return obj || {}; } -function nameFromEmail(email) { - return email - .split('@').shift().replace(/[.-_]/g, ' ') - .split(' ') - .filter(f => f) - .map(s => s.substr(0, 1).toUpperCase() + (s.substr(1) || '')) - .join(' '); -} - export default class TestRepo { constructor(config) { this.config = config; @@ -37,8 +28,8 @@ export default class TestRepo { return this.authenticate(user); } - authenticate(state) { - return Promise.resolve({ email: state.email, name: nameFromEmail(state.email) }); + authenticate() { + return Promise.resolve(); } logout() { diff --git a/src/components/App/App.css b/src/components/App/App.css new file mode 100644 index 00000000..0f7e895e --- /dev/null +++ b/src/components/App/App.css @@ -0,0 +1,8 @@ +@import "./NotFoundPage.css"; +@import "./Header.css"; + +.nc-app-main { + min-width: 800px; + max-width: 1440px; + margin: 0 auto; +} diff --git a/src/components/App/App.js b/src/components/App/App.js new file mode 100644 index 00000000..4b575ae5 --- /dev/null +++ b/src/components/App/App.js @@ -0,0 +1,180 @@ +import PropTypes from 'prop-types'; +import React from 'react'; +import ImmutablePropTypes from 'react-immutable-proptypes'; +import { connect } from 'react-redux'; +import { Route, Switch, Link, Redirect } from 'react-router-dom'; +import { Notifs } from 'redux-notifications'; +import TopBarProgress from 'react-topbar-progress-indicator'; +import { loadConfig as actionLoadConfig } from 'Actions/config'; +import { loginUser as actionLoginUser, logoutUser as actionLogoutUser } from 'Actions/auth'; +import { currentBackend } from 'Backends/backend'; +import { showCollection, createNewEntry } from 'Actions/collections'; +import { openMediaLibrary as actionOpenMediaLibrary } from 'Actions/mediaLibrary'; +import MediaLibrary from 'MediaLibrary/MediaLibrary'; +import { Loader, Toast } from 'UI'; +import { getCollectionUrl, getNewEntryUrl } from 'Lib/urlHelper'; +import { SIMPLE, EDITORIAL_WORKFLOW } from 'Constants/publishModes'; +import Collection from 'Collection/Collection'; +import Workflow from 'Workflow/Workflow'; +import Editor from 'Editor/Editor'; +import NotFoundPage from './NotFoundPage'; +import Header from './Header'; + +TopBarProgress.config({ + barColors: { + /** + * Uses value from CSS --colorActive. + */ + "0": '#3a69c8', + '1.0': '#3a69c8', + }, + shadowBlur: 0, + barThickness: 2, +}); + +class App extends React.Component { + + static propTypes = { + auth: ImmutablePropTypes.map, + config: ImmutablePropTypes.map, + collections: ImmutablePropTypes.orderedMap, + logoutUser: PropTypes.func.isRequired, + dispatch: PropTypes.func.isRequired, + user: ImmutablePropTypes.map, + isFetching: PropTypes.bool.isRequired, + publishMode: PropTypes.oneOf([SIMPLE, EDITORIAL_WORKFLOW]), + siteId: PropTypes.string, + }; + + static configError(config) { + return (
+

Error loading the CMS configuration

+ +
+

The config.yml file could not be loaded or failed to parse properly.

+

Error message: {config.get('error')}

+
+
); + } + + componentDidMount() { + this.props.dispatch(actionLoadConfig()); + } + + handleLogin(credentials) { + this.props.dispatch(actionLoginUser(credentials)); + } + + authenticating() { + const { auth } = this.props; + const backend = currentBackend(this.props.config); + + if (backend == null) { + return

Waiting for backend...

; + } + + return ( +
+ { + React.createElement(backend.authComponent(), { + onLogin: this.handleLogin.bind(this), + error: auth && auth.get('error'), + isFetching: auth && auth.get('isFetching'), + siteId: this.props.config.getIn(["backend", "site_domain"]), + base_url: this.props.config.getIn(["backend", "base_url"], null) + }) + } +
+ ); + } + + handleLinkClick(event, handler, ...args) { + event.preventDefault(); + handler(...args); + } + + render() { + const { + user, + config, + collections, + logoutUser, + isFetching, + publishMode, + openMediaLibrary, + } = this.props; + + + if (config === null) { + return null; + } + + if (config.get('error')) { + return App.configError(config); + } + + if (config.get('isFetching')) { + return Loading configuration...; + } + + if (user == null) { + return this.authenticating(); + } + + const defaultPath = `/collections/${collections.first().get('name')}`; + const hasWorkflow = publishMode === EDITORIAL_WORKFLOW; + + return ( +
+ +
+
+ { isFetching && } +
+ + + + { hasWorkflow ? : null } + + } /> + + } /> + + + +
+
+
+ ); + } +} + +function mapStateToProps(state, ownProps) { + const { auth, config, collections, globalUI } = state; + const user = auth && auth.get('user'); + const isFetching = globalUI.get('isFetching'); + const publishMode = config && config.get('publish_mode'); + return { auth, config, collections, user, isFetching, publishMode }; +} + +function mapDispatchToProps(dispatch) { + return { + dispatch, + openMediaLibrary: () => { + dispatch(actionOpenMediaLibrary()); + }, + logoutUser: () => { + dispatch(actionLogoutUser()); + }, + }; +} + +export default connect(mapStateToProps, mapDispatchToProps)(App); diff --git a/src/components/App/Header.css b/src/components/App/Header.css new file mode 100644 index 00000000..f8d3f70a --- /dev/null +++ b/src/components/App/Header.css @@ -0,0 +1,91 @@ +.nc-appHeader-container { + z-index: 300; +} + +.nc-appHeader-main { + @apply(--dropShadowMain); + position: fixed; + width: 100%; + top: 0; + background-color: var(--colorForeground); + z-index: 300; + height: var(--topBarHeight); +} + +.nc-appHeader-content { + display: flex; + justify-content: space-between; + min-width: 800px; + max-width: 1440px; + padding: 0 12px; + margin: 0 auto; +} + +.nc-appHeader-button { + background-color: transparent; + color: #7b8290; + font-size: 16px; + font-weight: 500; + display: inline-flex; + padding: 16px 20px; + align-items: center; + + & .nc-icon { + margin-right: 4px; + color: #b3b9c4; + } + + &:hover, + &:active, + &:focus, + &.nc-appHeader-button-active { + background-color: white; + color: var(--colorActive); + + & .nc-icon { + color: var(--colorActive); + } + } +} + +.nc-appHeader-actions { + display: inline-flex; + align-items: center; +} + +.nc-appHeader-siteLink { + font-size: 14px; + font-weight: 400; + color: #7b8290; + padding: 10px 16px; +} + +.nc-appHeader-quickNew { + @apply(--buttonMedium); + @apply(--buttonGray); + margin-right: 8px; + + &:after { + top: 11px; + } +} + +.nc-appHeader-avatar { + border: 0; + padding: 8px; + cursor: pointer; + color: #1e2532; + background-color: transparent; +} + +.nc-appHeader-avatar-image, +.nc-appHeader-avatar-placeholder { + width: 32px; + border-radius: 32px; +} + +.nc-appHeader-avatar-placeholder { + height: 32px; + color: #1e2532; + background-color: var(--textFieldBorderColor); +} diff --git a/src/components/App/Header.js b/src/components/App/Header.js new file mode 100644 index 00000000..1d770fab --- /dev/null +++ b/src/components/App/Header.js @@ -0,0 +1,115 @@ +import PropTypes from 'prop-types'; +import React from "react"; +import ImmutablePropTypes from "react-immutable-proptypes"; +import { NavLink } from 'react-router-dom'; +import { Icon, Dropdown, DropdownItem } from 'UI'; +import { stripProtocol } from 'Lib/urlHelper'; + +export default class Header extends React.Component { + static propTypes = { + user: ImmutablePropTypes.map.isRequired, + collections: ImmutablePropTypes.orderedMap.isRequired, + onCreateEntryClick: PropTypes.func.isRequired, + onLogoutClick: PropTypes.func.isRequired, + displayUrl: PropTypes.string, + }; + + handleCreatePostClick = (collectionName) => { + const { onCreateEntryClick } = this.props; + if (onCreateEntryClick) { + onCreateEntryClick(collectionName); + } + }; + + render() { + const { + user, + collections, + toggleDrawer, + onLogoutClick, + openMediaLibrary, + hasWorkflow, + displayUrl, + } = this.props; + + const avatarUrl = user.get('avatar_url'); + + return ( +
+ ); + } +} diff --git a/src/components/App/NotFoundPage.css b/src/components/App/NotFoundPage.css new file mode 100644 index 00000000..9022a94b --- /dev/null +++ b/src/components/App/NotFoundPage.css @@ -0,0 +1,3 @@ +.nc-notFound-container { + margin: var(--pageMargin); +} diff --git a/src/components/App/NotFoundPage.js b/src/components/App/NotFoundPage.js new file mode 100644 index 00000000..5115a424 --- /dev/null +++ b/src/components/App/NotFoundPage.js @@ -0,0 +1,7 @@ +import React from 'react'; + +export default () => ( +
+

Not Found

+
+); diff --git a/src/components/AppHeader/AppHeader.css b/src/components/AppHeader/AppHeader.css deleted file mode 100644 index 8ee8475d..00000000 --- a/src/components/AppHeader/AppHeader.css +++ /dev/null @@ -1,37 +0,0 @@ -.nc-appHeader-appBar { - padding: 8px 24px; - height: auto; - background-color: var(--backgroundAltColor); - color: var(--defaultColorLight); -} - -/* Gross stuff below, React Toolbox hacks */ - -.nc-appHeader-button, -.nc-appHeader-iconMenu { - margin-left: 16px; -} - -.nc-appHeader-button { - cursor: pointer; - border: 0; - background-color: transparent; - width: 36px; - padding: 6px 0; - text-align: center; - - & .nc-appHeader-icon { - vertical-align: top; - } -} - -.nc-appHeader-icon, -.nc-appHeader-icon span, -.nc-appHeader-leftIcon span { - /* stylelint-disable */ - - color: var(--defaultColorLight) !important; - font-size: 24px !important; - - /* stylelint-enable */ -} diff --git a/src/components/AppHeader/AppHeader.js b/src/components/AppHeader/AppHeader.js deleted file mode 100644 index 486b98e7..00000000 --- a/src/components/AppHeader/AppHeader.js +++ /dev/null @@ -1,89 +0,0 @@ -import PropTypes from 'prop-types'; -import React from "react"; -import ImmutablePropTypes from "react-immutable-proptypes"; -import { Link } from 'react-router-dom'; -import { IconMenu, Menu, MenuItem } from "react-toolbox/lib/menu"; -import Avatar from "react-toolbox/lib/avatar"; -import AppBar from "react-toolbox/lib/app_bar"; -import FontIcon from "react-toolbox/lib/font_icon"; -import FindBar from "../FindBar/FindBar"; -import { stringToRGB } from "../../lib/textHelper"; - -export default class AppHeader extends React.Component { - - static propTypes = { - user: ImmutablePropTypes.map.isRequired, - collections: ImmutablePropTypes.orderedMap.isRequired, - runCommand: PropTypes.func.isRequired, - toggleDrawer: PropTypes.func.isRequired, - onCreateEntryClick: PropTypes.func.isRequired, - onLogoutClick: PropTypes.func.isRequired, - }; - - handleCreatePostClick = (collectionName) => { - const { onCreateEntryClick } = this.props; - if (onCreateEntryClick) { - onCreateEntryClick(collectionName); - } - }; - - render() { - const { - user, - collections, - runCommand, - toggleDrawer, - onLogoutClick, - openMediaLibrary, - } = this.props; - - const avatarStyle = { - backgroundColor: `#${ stringToRGB(user.get("name")) }`, - }; - - const theme = { - appBar: 'nc-appHeader-appBar', - iconMenu: 'nc-appHeader-iconMenu', - icon: 'nc-appHeader-icon', - leftIcon: 'nc-appHeader-leftIcon', - base: 'nc-theme-base', - container: 'nc-theme-container', - rounded: 'nc-theme-rounded', - depth: 'nc-theme-depth', - clearfix: 'nc-theme-clearfix', - }; - - return ( - - - - - - - { - collections.filter(collection => collection.get('create')).toList().map(collection => - - ) - } - - - - - - - - ); - } -} diff --git a/src/components/Collection/Collection.css b/src/components/Collection/Collection.css new file mode 100644 index 00000000..ca7ec0ea --- /dev/null +++ b/src/components/Collection/Collection.css @@ -0,0 +1,11 @@ +@import "./Sidebar.css"; +@import "./CollectionTop.css"; +@import "./Entries/Entries.css"; + +.nc-collectionPage-container { + margin: var(--pageMargin); +} + +.nc-collectionPage-main { + padding-left: 280px; +} diff --git a/src/components/Collection/Collection.js b/src/components/Collection/Collection.js new file mode 100644 index 00000000..f954e736 --- /dev/null +++ b/src/components/Collection/Collection.js @@ -0,0 +1,70 @@ +import React from 'react'; +import ImmutablePropTypes from 'react-immutable-proptypes'; +import { connect } from 'react-redux'; +import { getNewEntryUrl } from 'Lib/urlHelper'; +import Sidebar from './Sidebar'; +import CollectionTop from './CollectionTop'; +import EntriesCollection from './Entries/EntriesCollection'; +import EntriesSearch from './Entries/EntriesSearch'; +import { VIEW_STYLE_LIST, VIEW_STYLE_GRID } from 'Constants/collectionViews'; + +class Collection extends React.Component { + static propTypes = { + collection: ImmutablePropTypes.map.isRequired, + collections: ImmutablePropTypes.orderedMap.isRequired, + }; + + state = { + viewStyle: VIEW_STYLE_LIST, + }; + + renderEntriesCollection = () => { + const { name, collection } = this.props; + return + }; + + renderEntriesSearch = () => { + const { searchTerm, collections } = this.props; + return + }; + + handleChangeViewStyle = (viewStyle) => { + if (this.state.viewStyle !== viewStyle) { + this.setState({ viewStyle }); + } + } + + render() { + const { collection, collections, collectionName, isSearchResults, searchTerm } = this.props; + const newEntryUrl = collection.get('create') && getNewEntryUrl(collectionName); + return ( +
+ +
+ { + isSearchResults + ? null + : + } + { isSearchResults ? this.renderEntriesSearch() : this.renderEntriesCollection() } +
+
+ ); + } +} + +function mapStateToProps(state, ownProps) { + const { collections } = state; + const { isSearchResults, match } = ownProps; + const { name, searchTerm } = match.params; + const collection = name ? collections.get(name) : collections.first(); + return { collection, collections, collectionName: name, isSearchResults, searchTerm }; +} + +export default connect(mapStateToProps)(Collection); diff --git a/src/components/Collection/CollectionTop.css b/src/components/Collection/CollectionTop.css new file mode 100644 index 00000000..095a2d49 --- /dev/null +++ b/src/components/Collection/CollectionTop.css @@ -0,0 +1,64 @@ +.nc-collectionPage-top { + @apply(--cardTop); +} + +.nc-collectionPage-top-row { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 20px; +} + +.nc-collectionPage-top-description { + @apply(--cardTopDescription) +} + +.nc-collectionPage-topHeading { + @apply(--cardTopHeading) +} + +.nc-collectionPage-topNewButton { + @apply(--button); + @apply(--dropShadowDeep); + @apply(--buttonDefault); + @apply(--buttonGray); + + padding: 0 30px; +} + +.nc-collectionPage-top-viewControls { + display: flex; + align-items: center; + justify-content: flex-end; + margin-top: 14px; +} + +.nc-collectionPage-top-viewControls { + margin-top: 24px; +} + +.nc-collectionPage-top-viewControls-text { + font-size: 14px; + color: var(--colorText); + margin-right: 12px; +} + +.nc-collectionPage-top-viewControls-button { + color: #b3b9c4; + background-color: transparent; + display: block; + padding: 0; + margin: 0 4px; + + &:last-child { + margin-right: 0; + } + + & .nc-icon { + display: block; + } +} + +.nc-collectionPage-top-viewControls-buttonActive { + color: var(--colorActive); +} diff --git a/src/components/Collection/CollectionTop.js b/src/components/Collection/CollectionTop.js new file mode 100644 index 00000000..28c38adb --- /dev/null +++ b/src/components/Collection/CollectionTop.js @@ -0,0 +1,63 @@ +import PropTypes from 'prop-types'; +import React from 'react'; +import c from 'classnames'; +import { Link } from 'react-router-dom'; +import { Icon } from 'UI'; +import { VIEW_STYLE_LIST, VIEW_STYLE_GRID } from 'Constants/collectionViews'; + +const CollectionTop = ({ + collectionLabel, + collectionDescription, + viewStyle, + onChangeViewStyle, + newEntryUrl, +}) => { + return ( +
+
+

{collectionLabel}

+ { + newEntryUrl + ? + {`New ${collectionLabel}`} + + : null + } +
+ { + collectionDescription + ?

{collectionDescription}

+ : null + } +
+ View as: + + +
+
+ ); +}; + +CollectionTop.propTypes = { + collectionLabel: PropTypes.string.isRequired, + collectionDescription: PropTypes.string, + newEntryUrl: PropTypes.string +}; + +export default CollectionTop; diff --git a/src/components/Collection/Entries/Entries.css b/src/components/Collection/Entries/Entries.css new file mode 100644 index 00000000..8f62e0a2 --- /dev/null +++ b/src/components/Collection/Entries/Entries.css @@ -0,0 +1,2 @@ +@import "./EntryListing.css"; +@import "./EntryCard.css"; diff --git a/src/components/Collection/Entries/Entries.js b/src/components/Collection/Entries/Entries.js new file mode 100644 index 00000000..bc9974b2 --- /dev/null +++ b/src/components/Collection/Entries/Entries.js @@ -0,0 +1,51 @@ +import PropTypes from 'prop-types'; +import React from 'react'; +import ImmutablePropTypes from 'react-immutable-proptypes'; +import { Loader } from 'UI'; +import EntryListing from './EntryListing'; + +const Entries = ({ + collections, + entries, + publicFolder, + page, + onPaginate, + isFetching, + viewStyle +}) => { + const loadingMessages = [ + 'Loading Entries', + 'Caching Entries', + 'This might take several minutes', + ]; + + if (entries) { + return ( + + ); + } + + if (isFetching) { + return {loadingMessages}; + } + + return
No Entries
; +} + +Entries.propTypes = { + collections: ImmutablePropTypes.map.isRequired, + entries: ImmutablePropTypes.list, + publicFolder: PropTypes.string.isRequired, + page: PropTypes.number, + isFetching: PropTypes.bool, + viewStyle: PropTypes.string, +}; + +export default Entries; diff --git a/src/components/Collection/Entries/EntriesCollection.js b/src/components/Collection/Entries/EntriesCollection.js new file mode 100644 index 00000000..37b72747 --- /dev/null +++ b/src/components/Collection/Entries/EntriesCollection.js @@ -0,0 +1,64 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import ImmutablePropTypes from 'react-immutable-proptypes'; +import { connect } from 'react-redux'; +import { loadEntries } from 'Actions/entries'; +import { selectEntries } from 'Reducers'; +import Entries from './Entries'; + +class EntriesCollection extends React.Component { + static propTypes = { + collection: ImmutablePropTypes.map.isRequired, + publicFolder: PropTypes.string.isRequired, + dispatch: PropTypes.func.isRequired, + page: PropTypes.number, + entries: ImmutablePropTypes.list, + isFetching: PropTypes.bool.isRequired, + viewStyle: PropTypes.string, + }; + + componentDidMount() { + const { collection, dispatch } = this.props; + if (collection) { + dispatch(loadEntries(collection)); + } + } + + componentWillReceiveProps(nextProps) { + const { collection, dispatch } = this.props; + if (nextProps.collection !== collection) { + dispatch(loadEntries(nextProps.collection)); + } + } + + render () { + const { dispatch, collection, entries, publicFolder, page, isFetching, viewStyle } = this.props; + + return ( + dispatch(loadEntries(collection, page))} + isFetching={isFetching} + collectionName={collection.get('label')} + viewStyle={viewStyle} + /> + ); + } +} + +function mapStateToProps(state, ownProps) { + const { name, collection, viewStyle } = ownProps; + const { config } = state; + const publicFolder = config.get('public_folder'); + const page = state.entries.getIn(['pages', collection.get('name'), 'page']); + + const entries = selectEntries(state, collection.get('name')); + const isFetching = state.entries.getIn(['pages', collection.get('name'), 'isFetching'], false); + + return { publicFolder, collection, page, entries, isFetching, viewStyle }; +} + +export default connect(mapStateToProps)(EntriesCollection); diff --git a/src/containers/SearchPage.js b/src/components/Collection/Entries/EntriesSearch.js similarity index 54% rename from src/containers/SearchPage.js rename to src/components/Collection/Entries/EntriesSearch.js index e27d5721..02c66ffa 100644 --- a/src/containers/SearchPage.js +++ b/src/components/Collection/Entries/EntriesSearch.js @@ -1,14 +1,15 @@ -import PropTypes from 'prop-types'; import React from 'react'; +import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { connect } from 'react-redux'; -import { selectSearchedEntries } from '../reducers'; -import { searchEntries as actionSearchEntries, clearSearch as actionClearSearch } from '../actions/search'; -import { Loader } from '../components/UI'; -import EntryListing from '../components/EntryListing/EntryListing'; - -class SearchPage extends React.Component { +import { selectSearchedEntries } from 'Reducers'; +import { + searchEntries as actionSearchEntries, + clearSearch as actionClearSearch +} from 'Actions/search'; +import Entries from './Entries'; +class EntriesSearch extends React.Component { static propTypes = { isFetching: PropTypes.bool, searchEntries: PropTypes.func.isRequired, @@ -40,43 +41,35 @@ class SearchPage extends React.Component { if (!isNaN(page)) searchEntries(searchTerm, page); }; - render() { - const { collections, searchTerm, entries, isFetching, page, publicFolder } = this.props; - return (
- {(isFetching === true || !entries) ? - {['Loading Entries', 'Caching Entries', 'This might take several minutes']} - : - - Results for “{searchTerm}” - - } -
); + render () { + const { dispatch, collections, entries, publicFolder, page, isFetching } = this.props; + return ( + + ); } } - function mapStateToProps(state, ownProps) { + const { searchTerm } = ownProps; + const collections = ownProps.collections.toIndexedSeq(); const isFetching = state.entries.getIn(['search', 'isFetching']); const page = state.entries.getIn(['search', 'page']); const entries = selectSearchedEntries(state); - const collections = state.collections.toIndexedSeq(); const publicFolder = state.config.get('public_folder'); - const { searchTerm } = ownProps.match.params; return { isFetching, page, collections, entries, publicFolder, searchTerm }; } +const mapDispatchToProps = { + searchEntries: actionSearchEntries, + clearSearch: actionClearSearch, +}; -export default connect( - mapStateToProps, - { - searchEntries: actionSearchEntries, - clearSearch: actionClearSearch, - } -)(SearchPage); +export default connect(mapStateToProps, mapDispatchToProps)(EntriesSearch); diff --git a/src/components/Collection/Entries/EntryCard.css b/src/components/Collection/Entries/EntryCard.css new file mode 100644 index 00000000..8dfc1876 --- /dev/null +++ b/src/components/Collection/Entries/EntryCard.css @@ -0,0 +1,70 @@ +.nc-entryListing-gridCard { + @apply(--card); + flex: 0 0 335px; + height: 240px; + background-color: var(--colorForeground); + color: var(--colorText); + overflow: hidden; + margin-bottom: 16px; + margin-left: 12px; + + &:hover { + background-color: var(--colorForeground); + color: var(--colorText); + } +} + +.nc-entryListing-cardImage { + background-position: center center; + background-size: cover; + background-repeat: no-repeat; + height: 150px; +} + +.nc-entryListing-cardBody { + padding: 16px 22px; + height: 90px; + position: relative; + + &:after { + content: ''; + position: absolute; + display: block; + z-index: 1; + bottom: 0; + left: -20%; + height: 140%; + width: 140%; + box-shadow: inset 0 -15px 24px #fff; + } +} + +.nc-entryListing-listCard { + @apply(--card); + width: var(--topCardWidth); + max-width: 100%; + padding: 16px 22px; + margin-left: 12px; + margin-bottom: 16px; + + &:hover { + background-color: var(--colorForeground); + } +} + +.nc-entryListing-listCard-title { + margin-bottom: 0; +} + +.nc-entryListing-cardBody-full { + height: 100%; +} + +.nc-entryListing-cardHeading { + margin: 0 0 2px; +} + +.nc-entryListing-cardListLabel { + white-space: nowrap; + font-weight: bold; +} diff --git a/src/components/Collection/Entries/EntryCard.js b/src/components/Collection/Entries/EntryCard.js new file mode 100644 index 00000000..e9f3f9fc --- /dev/null +++ b/src/components/Collection/Entries/EntryCard.js @@ -0,0 +1,53 @@ +import PropTypes from 'prop-types'; +import React from 'react'; +import ImmutablePropTypes from 'react-immutable-proptypes'; +import { Link } from 'react-router-dom'; +import c from 'classnames'; +import history from 'Routing/history'; +import { resolvePath } from 'Lib/pathHelper'; +import { VIEW_STYLE_LIST, VIEW_STYLE_GRID } from 'Constants/collectionViews'; + +const EntryCard = ({ + collection, + entry, + inferedFields, + publicFolder, + viewStyle = VIEW_STYLE_LIST, +}) => { + const label = entry.get('label'); + const title = label || entry.getIn(['data', inferedFields.titleField]); + const path = `/collections/${collection.get('name')}/entries/${entry.get('slug')}`; + let image = entry.getIn(['data', inferedFields.imageField]); + image = resolvePath(image, publicFolder); + if(image) { + image = encodeURI(image); + } + + if (viewStyle === VIEW_STYLE_LIST) { + return ( + +

{title}

+ + ); + } + + if (viewStyle === VIEW_STYLE_GRID) { + return ( + +
+

{title}

+
+ { + image + ?
+ : null + } + + ); + } +} + +export default EntryCard; diff --git a/src/components/Collection/Entries/EntryListing.css b/src/components/Collection/Entries/EntryListing.css new file mode 100644 index 00000000..4980857f --- /dev/null +++ b/src/components/Collection/Entries/EntryListing.css @@ -0,0 +1,9 @@ +.nc-entryListing-cardsGrid { + display: flex; + flex-flow: row wrap; + margin-left: -12px; +} + +.nc-entryListing-cardsList { + margin-left: -12px; +} diff --git a/src/components/Collection/Entries/EntryListing.js b/src/components/Collection/Entries/EntryListing.js new file mode 100644 index 00000000..dff560bb --- /dev/null +++ b/src/components/Collection/Entries/EntryListing.js @@ -0,0 +1,70 @@ +import PropTypes from 'prop-types'; +import React from 'react'; +import ImmutablePropTypes from 'react-immutable-proptypes'; +import Waypoint from 'react-waypoint'; +import { Map } from 'immutable'; +import { selectFields, selectInferedField } from 'Reducers/collections'; +import EntryCard from './EntryCard'; + +export default class EntryListing extends React.Component { + static propTypes = { + publicFolder: PropTypes.string.isRequired, + collections: PropTypes.oneOfType([ + ImmutablePropTypes.map, + ImmutablePropTypes.iterable, + ]).isRequired, + entries: ImmutablePropTypes.list, + onPaginate: PropTypes.func.isRequired, + page: PropTypes.number, + viewStyle: PropTypes.string, + }; + + handleLoadMore = () => { + this.props.onPaginate(this.props.page + 1); + }; + + inferFields = collection => { + const titleField = selectInferedField(collection, 'title'); + const descriptionField = selectInferedField(collection, 'description'); + const imageField = selectInferedField(collection, 'image'); + const fields = selectFields(collection); + const inferedFields = [titleField, descriptionField, imageField]; + const remainingFields = fields && fields.filter(f => inferedFields.indexOf(f.get('name')) === -1); + return { titleField, descriptionField, imageField, remainingFields }; + }; + + renderCardsForSingleCollection = () => { + const { collections, entries, publicFolder, viewStyle } = this.props; + const inferedFields = this.inferFields(collections); + const entryCardProps = { collection: collections, inferedFields, publicFolder, viewStyle }; + return entries.map((entry, idx) => ); + }; + + renderCardsForMultipleCollections = () => { + const { collections, entries, publicFolder } = this.props; + return entries.map((entry, idx) => { + const collectionName = entry.get('collection'); + const collection = collections.find(coll => coll.get('name') === collectionName); + const inferedFields = this.inferFields(collection); + const entryCardProps = { collection, entry, inferedFields, publicFolder, key: idx }; + return ; + }); + }; + + render() { + const { collections, entries, publicFolder } = this.props; + + return ( +
+
+ { + Map.isMap(collections) + ? this.renderCardsForSingleCollection() + : this.renderCardsForMultipleCollections() + } + +
+
+ ); + } +} diff --git a/src/components/Collection/Sidebar.css b/src/components/Collection/Sidebar.css new file mode 100644 index 00000000..ace061b0 --- /dev/null +++ b/src/components/Collection/Sidebar.css @@ -0,0 +1,68 @@ +.nc-collectionPage-sidebar { + @apply(--card); + width: 250px; + padding: 8px 0 12px; + position: fixed; +} + +.nc-collectionPage-sidebarHeading { + font-size: 23px; + font-weight: 600; + padding: 0; + margin: 18px 12px 12px; + color: var(--colorTextLead); +} + +.nc-collectionPage-sidebarSearch { + display: flex; + align-items: center; + margin: 0 8px; + position: relative; + + & input { + background-color: #eff0f4; + border-radius: var(--borderRadius); + + font-size: 14px; + padding: 10px 6px 10px 32px; + width: 100%; + position: relative; + z-index: 1; + + &:focus { + outline: none; + box-shadow: inset 0 0 0 2px var(--colorBlue); + } + } + + & .nc-icon { + position: absolute; + left: 6px; + z-index: 2; + } +} + +.nc-collectionPage-sidebarLink { + display: flex; + font-size: 14px; + font-weight: 500; + align-items: center; + padding: 8px 12px; + border-left: 2px solid #fff; + + & .nc-icon { + margin-right: 8px; + } + + &:hover, + &:active, + &.nc-collectionPage-sidebarLink-active { + color: var(--colorActive); + background-color: var(--colorActiveBackground); + border-left-color: #4863c6; + } + + &:first-of-type { + margin-top: 16px; + } +} diff --git a/src/components/Collection/Sidebar.js b/src/components/Collection/Sidebar.js new file mode 100644 index 00000000..671a8bcf --- /dev/null +++ b/src/components/Collection/Sidebar.js @@ -0,0 +1,53 @@ +import PropTypes from 'prop-types'; +import React from 'react'; +import ImmutablePropTypes from 'react-immutable-proptypes'; +import { NavLink } from 'react-router-dom'; +import { searchCollections } from 'Actions/collections'; +import { getCollectionUrl } from 'Lib/urlHelper'; +import { Icon } from 'UI'; + +export default class Collection extends React.Component { + + static propTypes = { + collections: ImmutablePropTypes.orderedMap.isRequired, + }; + + state = { query: this.props.searchTerm || '' }; + + renderLink = collection => { + const collectionName = collection.get('name'); + return ( + + + {collection.get('label')} + + ); + }; + + + render() { + const { collections } = this.props; + const { query } = this.state; + + return ( +
+

Collections

+
+ + this.setState({ query: e.target.value })} + onKeyDown={e => e.key === 'Enter' && searchCollections(query)} + placeholder="Search all" + value={query} + /> +
+ {collections.toList().map(this.renderLink)} +
+ ); + } +} diff --git a/src/components/ControlPanel/ControlPane.css b/src/components/ControlPanel/ControlPane.css deleted file mode 100644 index 7d496776..00000000 --- a/src/components/ControlPanel/ControlPane.css +++ /dev/null @@ -1,35 +0,0 @@ -.nc-controlPane-root p { - font-size: 16px; -} - -.nc-controlPane-control { - color: var(--textColor); - position: relative; - padding: 20px 0 10px 0; - margin-top: 16px; - - & input, - & textarea, - & select { - @apply --input; - } -} - -.nc-controlPane-label { - display: block; - color: var(--controlLabelColor); - font-size: 12px; - text-transform: uppercase; - font-weight: 600; -} - -.nc-controlPane-labelWithError { - color: #FF706F; -} - -.nc-controlPane-errors { - list-style-type: none; - font-size: 10px; - color: #FF706F; - margin-bottom: 5px; -} diff --git a/src/components/ControlPanel/ControlPane.js b/src/components/ControlPanel/ControlPane.js deleted file mode 100644 index 1d7525d6..00000000 --- a/src/components/ControlPanel/ControlPane.js +++ /dev/null @@ -1,109 +0,0 @@ -import PropTypes from 'prop-types'; -import React, { Component } from 'react'; -import { Map, fromJS } from 'immutable'; -import ImmutablePropTypes from 'react-immutable-proptypes'; -import { resolveWidget } from '../Widgets'; -import ControlHOC from '../Widgets/ControlHOC'; - -function isHidden(field) { - return field.get('widget') === 'hidden'; -} - -export default class ControlPane extends Component { - componentValidate = {}; - processControlRef(fieldName, wrappedControl) { - if (!wrappedControl) return; - this.componentValidate[fieldName] = wrappedControl.validate; - } - - validate = () => { - this.props.fields.forEach((field) => { - if (isHidden(field)) return; - this.componentValidate[field.get("name")](); - }); - }; - - controlFor(field) { - const { - entry, - fieldsMetaData, - fieldsErrors, - mediaPaths, - getAsset, - onChange, - onOpenMediaLibrary, - onAddAsset, - onRemoveAsset - } = this.props; - const widget = resolveWidget(field.get('widget')); - const fieldName = field.get('name'); - const value = entry.getIn(['data', fieldName]); - const metadata = fieldsMetaData.get(fieldName); - const errors = fieldsErrors.get(fieldName); - const labelClass = errors ? 'nc-controlPane-label nc-controlPane-labelWithError' : 'nc-controlPane-label'; - if (entry.size === 0 || entry.get('partial') === true) return null; - return ( -
- -
    - { - errors && errors.map(error => - error.message && - typeof error.message === 'string' && -
  • {error.message}
  • - ) - } -
- onChange(fieldName, newValue, newMetadata)} - onValidate={this.props.onValidate.bind(this, fieldName)} - onOpenMediaLibrary={onOpenMediaLibrary} - onAddAsset={onAddAsset} - onRemoveAsset={onRemoveAsset} - getAsset={getAsset} - ref={this.processControlRef.bind(this, fieldName)} - /> -
- ); - } - - render() { - const { collection, fields } = this.props; - if (!collection || !fields) { - return null; - } - - return ( -
- { - fields.map((field, i) => { - if (isHidden(field)) { - return null; - } - return
{this.controlFor(field)}
; - }) - } -
- ); - } -} - -ControlPane.propTypes = { - collection: ImmutablePropTypes.map.isRequired, - entry: ImmutablePropTypes.map.isRequired, - fields: ImmutablePropTypes.list.isRequired, - fieldsMetaData: ImmutablePropTypes.map.isRequired, - fieldsErrors: ImmutablePropTypes.map.isRequired, - mediaPaths: ImmutablePropTypes.map.isRequired, - getAsset: PropTypes.func.isRequired, - onOpenMediaLibrary: PropTypes.func.isRequired, - onAddAsset: PropTypes.func.isRequired, - onChange: PropTypes.func.isRequired, - onValidate: PropTypes.func.isRequired, - onRemoveAsset: PropTypes.func.isRequired, -}; diff --git a/src/components/Editor/Editor.css b/src/components/Editor/Editor.css new file mode 100644 index 00000000..edcd4e7b --- /dev/null +++ b/src/components/Editor/Editor.css @@ -0,0 +1,6 @@ +@import "./EditorInterface.css"; +@import "./EditorToolbar.css"; +@import "./EditorToggle.css"; +@import "./EditorControlPane/EditorControlPane.css"; +@import "./EditorControlPane/EditorControl.css"; +@import "./EditorPreviewPane/EditorPreviewPane.css"; diff --git a/src/components/Editor/Editor.js b/src/components/Editor/Editor.js new file mode 100644 index 00000000..b0bb7ec5 --- /dev/null +++ b/src/components/Editor/Editor.js @@ -0,0 +1,390 @@ +import PropTypes from 'prop-types'; +import React from 'react'; +import ImmutablePropTypes from 'react-immutable-proptypes'; +import { Map } from 'immutable'; +import { get } from 'lodash'; +import { connect } from 'react-redux'; +import history from 'Routing/history'; +import { logoutUser } from 'Actions/auth'; +import { + loadEntry, + loadEntries, + createDraftFromEntry, + createEmptyDraft, + discardDraft, + changeDraftField, + changeDraftFieldValidation, + persistEntry, + deleteEntry, +} from 'Actions/entries'; +import { + updateUnpublishedEntryStatus, + publishUnpublishedEntry, + deleteUnpublishedEntry +} from 'Actions/editorialWorkflow'; +import { deserializeValues } from 'Lib/serializeEntryValues'; +import { addAsset } from 'Actions/media'; +import { openMediaLibrary, removeInsertedMedia } from 'Actions/mediaLibrary'; +import { selectEntry, selectUnpublishedEntry, getAsset } from 'Reducers'; +import { selectFields } from 'Reducers/collections'; +import { Loader } from 'UI'; +import { status } from 'Constants/publishModes'; +import { EDITORIAL_WORKFLOW } from 'Constants/publishModes'; +import EditorInterface from './EditorInterface'; +import withWorkflow from './withWorkflow'; + +const navigateCollection = (collectionPath) => history.push(`/collections/${collectionPath}`); +const navigateToCollection = collectionName => navigateCollection(collectionName); +const navigateToNewEntry = collectionName => navigateCollection(`${collectionName}/new`); +const navigateToEntry = (collectionName, slug) => navigateCollection(`${collectionName}/entries/${slug}`); + +class Editor extends React.Component { + static propTypes = { + addAsset: PropTypes.func.isRequired, + boundGetAsset: PropTypes.func.isRequired, + changeDraftField: PropTypes.func.isRequired, + changeDraftFieldValidation: PropTypes.func.isRequired, + collection: ImmutablePropTypes.map.isRequired, + createDraftFromEntry: PropTypes.func.isRequired, + createEmptyDraft: PropTypes.func.isRequired, + discardDraft: PropTypes.func.isRequired, + entry: ImmutablePropTypes.map, + mediaPaths: ImmutablePropTypes.map.isRequired, + entryDraft: ImmutablePropTypes.map.isRequired, + loadEntry: PropTypes.func.isRequired, + persistEntry: PropTypes.func.isRequired, + deleteEntry: PropTypes.func.isRequired, + showDelete: PropTypes.bool.isRequired, + openMediaLibrary: PropTypes.func.isRequired, + removeInsertedMedia: PropTypes.func.isRequired, + closeEntry: PropTypes.func.isRequired, + fields: ImmutablePropTypes.list.isRequired, + slug: PropTypes.string, + newEntry: PropTypes.bool.isRequired, + displayUrl: PropTypes.string, + hasWorkflow: PropTypes.bool, + unpublishedEntry: PropTypes.bool, + isModification: PropTypes.bool, + collectionEntriesLoaded: PropTypes.bool, + updateUnpublishedEntryStatus: PropTypes.func.isRequired, + publishUnpublishedEntry: PropTypes.func.isRequired, + deleteUnpublishedEntry: PropTypes.func.isRequired, + currentStatus: PropTypes.string, + logoutUser: PropTypes.func.isRequired, + }; + + componentDidMount() { + const { + entry, + newEntry, + entryDraft, + collection, + slug, + loadEntry, + createEmptyDraft, + loadEntries, + collectionEntriesLoaded, + } = this.props; + + if (newEntry) { + createEmptyDraft(collection); + } else { + loadEntry(collection, slug); + } + + const leaveMessage = 'Are you sure you want to leave this page?'; + + this.exitBlocker = (event) => { + if (this.props.entryDraft.get('hasChanged')) { + // This message is ignored in most browsers, but its presence + // triggers the confirmation dialog + event.returnValue = leaveMessage; + return leaveMessage; + } + }; + window.addEventListener('beforeunload', this.exitBlocker); + + const navigationBlocker = (location, action) => { + /** + * New entry being saved and redirected to it's new slug based url. + */ + const isPersisting = this.props.entryDraft.getIn(['entry', 'isPersisting']); + const newRecord = this.props.entryDraft.getIn(['entry', 'newRecord']); + const newEntryPath = `/collections/${collection.get('name')}/new`; + if (isPersisting && newRecord && this.props.location.pathname === newEntryPath && action === 'PUSH') { + return; + } + + if (this.props.hasChanged) { + return leaveMessage; + } + + }; + const unblock = history.block(navigationBlocker); + + /** + * This will run as soon as the location actually changes, unless creating + * a new post. The confirmation above will run first. + */ + this.unlisten = history.listen((location, action) => { + const newEntryPath = `/collections/${collection.get('name')}/new`; + const entriesPath = `/collections/${collection.get('name')}/entries/`; + const { pathname } = location; + if (pathname.startsWith(newEntryPath) || pathname.startsWith(entriesPath) && action === 'PUSH') { + return; + } + unblock(); + this.unlisten(); + }); + + if (!collectionEntriesLoaded) { + loadEntries(collection); + } + } + + componentWillReceiveProps(nextProps) { + /** + * If the old slug is empty and the new slug is not, a new entry was just + * saved, and we need to update navigation to the correct url using the + * slug. + */ + const newSlug = nextProps.entryDraft && nextProps.entryDraft.getIn(['entry', 'slug']); + if (!this.props.slug && newSlug && nextProps.newEntry) { + navigateToEntry(this.props.collection.get('name'), newSlug); + nextProps.loadEntry(nextProps.collection, newSlug); + } + + if (this.props.entry === nextProps.entry) return; + const { entry, newEntry, fields, collection } = nextProps; + + if (entry && !entry.get('isFetching') && !entry.get('error')) { + + /** + * Deserialize entry values for widgets with registered serializers before + * creating the entry draft. + */ + const values = deserializeValues(entry.get('data'), fields); + const deserializedEntry = entry.set('data', values); + this.createDraft(deserializedEntry); + } else if (newEntry) { + this.props.createEmptyDraft(collection); + } + } + + componentWillUnmount() { + this.props.discardDraft(); + window.removeEventListener('beforeunload', this.exitBlocker); + } + + createDraft = (entry) => { + if (entry) this.props.createDraftFromEntry(entry); + }; + + handleChangeStatus = (newStatusName) => { + const { updateUnpublishedEntryStatus, collection, slug, currentStatus } = this.props; + const newStatus = status.get(newStatusName); + this.props.updateUnpublishedEntryStatus(collection.get('name'), slug, currentStatus, newStatus); + } + + handlePersistEntry = async (opts = {}) => { + const { createNew = false } = opts; + const { persistEntry, collection, entryDraft, newEntry, currentStatus, hasWorkflow, loadEntry, slug, createEmptyDraft } = this.props; + + await persistEntry(collection) + + if (createNew) { + navigateToNewEntry(collection.get('name')); + createEmptyDraft(collection); + } + else if (slug && hasWorkflow && !currentStatus) { + loadEntry(collection, slug); + } + }; + + handlePublishEntry = async (opts = {}) => { + const { createNew = false } = opts; + const { publishUnpublishedEntry, entryDraft, collection, slug, currentStatus, loadEntry } = this.props; + if (currentStatus !== status.last()) { + window.alert('Please update status to "Ready" before publishing.'); + return; + } else if (!window.confirm('Are you sure you want to publish this entry?')) { + return; + } else if (entryDraft.get('hasChanged')) { + if (window.confirm('Your unsaved changes will be saved before publishing. Are you sure you want to publish?')) { + await persistEntry(collection); + } else { + return; + } + } + + await publishUnpublishedEntry(collection.get('name'), slug); + + if (createNew) { + navigateToNewEntry(collection.get('name')); + } + else { + loadEntry(collection, slug); + } + }; + + handleDeleteEntry = () => { + const { entryDraft, newEntry, collection, deleteEntry, slug } = this.props; + if (entryDraft.get('hasChanged')) { + if (!window.confirm('Are you sure you want to delete this published entry, as well as your unsaved changes from the current session?')) { + return; + } + } else if (!window.confirm('Are you sure you want to delete this published entry?')) { + return; + } + if (newEntry) { + return navigateToCollection(collection.get('name')); + } + + setTimeout(async () => { + await deleteEntry(collection, slug); + return navigateToCollection(collection.get('name')); + }, 0); + }; + + handleDeleteUnpublishedChanges = async () => { + const { entryDraft, collection, slug, deleteUnpublishedEntry, loadEntry, isModification } = this.props; + if (entryDraft.get('hasChanged') && !window.confirm('This will delete all unpublished changes to this entry, as well as your unsaved changes from the current session. Do you still want to delete?')) { + return; + } else if (!window.confirm('All unpublished changes to this entry will be deleted. Do you still want to delete?')) { + return; + } + await deleteUnpublishedEntry(collection.get('name'), slug); + + if (isModification) { + loadEntry(collection, slug); + } else { + navigateToCollection(collection.get('name')); + } + }; + + render() { + const { + entry, + entryDraft, + fields, + mediaPaths, + boundGetAsset, + collection, + changeDraftField, + changeDraftFieldValidation, + openMediaLibrary, + addAsset, + removeInsertedMedia, + user, + hasChanged, + displayUrl, + hasWorkflow, + unpublishedEntry, + newEntry, + isModification, + currentStatus, + logoutUser, + } = this.props; + + if (entry && entry.get('error')) { + return

{ entry.get('error') }

; + } else if (entryDraft == null + || entryDraft.get('entry') === undefined + || (entry && entry.get('isFetching'))) { + return Loading entry...; + } + + return ( + + ); + } +} + +function mapStateToProps(state, ownProps) { + const { collections, entryDraft, mediaLibrary, auth, config, entries } = state; + const slug = ownProps.match.params.slug; + const collection = collections.get(ownProps.match.params.name); + const collectionName = collection.get('name'); + const newEntry = ownProps.newRecord === true; + const fields = selectFields(collection, slug); + const entry = newEntry ? null : selectEntry(state, collectionName, slug); + const boundGetAsset = getAsset.bind(null, state); + const mediaPaths = mediaLibrary.get('controlMedia'); + const user = auth && auth.get('user'); + const hasChanged = entryDraft.get('hasChanged'); + const displayUrl = config.get('display_url'); + const hasWorkflow = config.get('publish_mode') === EDITORIAL_WORKFLOW; + const isModification = entryDraft.getIn(['entry', 'isModification']); + const collectionEntriesLoaded = !!entries.getIn(['entities', collectionName]) + const unpublishedEntry = selectUnpublishedEntry(state, collectionName, slug); + const currentStatus = unpublishedEntry && unpublishedEntry.getIn(['metaData', 'status']); + return { + collection, + collections, + newEntry, + entryDraft, + mediaPaths, + boundGetAsset, + fields, + slug, + entry, + user, + hasChanged, + displayUrl, + hasWorkflow, + isModification, + collectionEntriesLoaded, + currentStatus, + }; +} + +export default connect( + mapStateToProps, + { + changeDraftField, + changeDraftFieldValidation, + openMediaLibrary, + removeInsertedMedia, + addAsset, + loadEntry, + loadEntries, + createDraftFromEntry, + createEmptyDraft, + discardDraft, + persistEntry, + deleteEntry, + updateUnpublishedEntryStatus, + publishUnpublishedEntry, + deleteUnpublishedEntry, + logoutUser, + } +)(withWorkflow(Editor)); diff --git a/src/components/Editor/EditorControlPane/EditorControl.css b/src/components/Editor/EditorControlPane/EditorControl.css new file mode 100644 index 00000000..432eb70b --- /dev/null +++ b/src/components/Editor/EditorControlPane/EditorControl.css @@ -0,0 +1,7 @@ +.nc-controlPane-control { + margin-top: 16px; + + &:first-child { + margin-top: 36px; + } +} diff --git a/src/components/Editor/EditorControlPane/EditorControl.js b/src/components/Editor/EditorControlPane/EditorControl.js new file mode 100644 index 00000000..4b8370b1 --- /dev/null +++ b/src/components/Editor/EditorControlPane/EditorControl.js @@ -0,0 +1,83 @@ +import React from 'react'; +import { partial } from 'lodash'; +import c from 'classnames'; +import { resolveWidget } from 'Lib/registry'; +import Widget from './Widget'; + +export default class EditorControl extends React.Component { + state = { + activeLabel: false, + }; + + render() { + const { + value, + field, + fieldsMetaData, + fieldsErrors, + mediaPaths, + getAsset, + onChange, + onOpenMediaLibrary, + onAddAsset, + onRemoveInsertedMedia, + onValidate, + processControlRef, + } = this.props; + const widgetName = field.get('widget'); + const widget = resolveWidget(widgetName); + const fieldName = field.get('name'); + const metadata = fieldsMetaData && fieldsMetaData.get(fieldName); + const errors = fieldsErrors && fieldsErrors.get(fieldName); + return ( +
+
    + { + errors && errors.map(error => + error.message && + typeof error.message === 'string' && +
  • {error.message}
  • + ) + } +
+ + onChange(fieldName, newValue, newMetadata)} + onValidate={onValidate && partial(onValidate, fieldName)} + onOpenMediaLibrary={onOpenMediaLibrary} + onRemoveInsertedMedia={onRemoveInsertedMedia} + onAddAsset={onAddAsset} + getAsset={getAsset} + hasActiveStyle={this.state.styleActive} + setActiveStyle={() => this.setState({ styleActive: true })} + setInactiveStyle={() => this.setState({ styleActive: false })} + ref={processControlRef && partial(processControlRef, fieldName)} + editorControl={EditorControl} + /> +
+ ); + } +} diff --git a/src/components/Editor/EditorControlPane/EditorControlPane.css b/src/components/Editor/EditorControlPane/EditorControlPane.css new file mode 100644 index 00000000..1c773401 --- /dev/null +++ b/src/components/Editor/EditorControlPane/EditorControlPane.css @@ -0,0 +1,106 @@ +:root { + --controlPaneLabel: { + display: inline-block; + color: var(--controlLabelColor); + font-size: 12px; + text-transform: uppercase; + font-weight: 600; + background-color: var(--textFieldBorderColor); + border: 0; + border-radius: 3px 3px 0 0; + padding: 3px 6px 2px; + margin: 0; + transition: all var(--transition); + position: relative; + + /** + * Faux outside curve into top of input + */ + &:before, + &:after { + content: ''; + display: block; + position: absolute; + top: 0; + right: -4px; + height: 100%; + width: 4px; + background-color: inherit; + } + + &:after { + border-bottom-left-radius: 3px; + background-color: #fff; + } + } + + --controlPaneWidget: { + display: block; + width: 100%; + padding: var(--inputPadding); + margin: 0; + border: var(--textFieldBorder); + border-radius: var(--borderRadius); + border-top-left-radius: 0; + outline: 0; + box-shadow: none; + background-color: var(--colorInputBackground); + color: #444a57; + transition: border-color var(--transition); + position: relative; + font-size: 15px; + line-height: 1.5; + } +} + +.nc-controlPane-root { + max-width: 800px; + margin: 0 auto; + + & p { + font-size: 16px; + } +} + +.nc-controlPane-label { + @apply(--controlPaneLabel); +} + +.nc-controlPane-labelActive { + background-color: var(--colorActive); + color: var(--colorTextLight); +} + +.nc-controlPane-widget { + @apply(--controlPaneWidget); + + &.nc-controlPane-widgetActive { + border-color: var(--colorActive); + } +} + +select.nc-controlPane-widget { + text-indent: 14px; + height: 58px; +} + +.nc-controlPane-labelWithError { + background-color: var(--colorErrorText); + color: #fff; +} + +.nc-controlPane-widgetError { + border-color: var(--colorErrorText); +} + +.nc-controlPane-errors { + list-style-type: none; + font-size: 12px; + color: var(--colorErrorText); + margin-bottom: 5px; + text-align: right; + text-transform: uppercase; + position: relative; + font-weight: 600; + top: 20px; +} diff --git a/src/components/Editor/EditorControlPane/EditorControlPane.js b/src/components/Editor/EditorControlPane/EditorControlPane.js new file mode 100644 index 00000000..41f0cf98 --- /dev/null +++ b/src/components/Editor/EditorControlPane/EditorControlPane.js @@ -0,0 +1,82 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import ImmutablePropTypes from 'react-immutable-proptypes'; +import EditorControl from './EditorControl'; + +export default class ControlPane extends React.Component { + componentValidate = {}; + + processControlRef = (fieldName, wrappedControl) => { + if (!wrappedControl) return; + this.componentValidate[fieldName] = wrappedControl.validate; + }; + + validate = () => { + this.props.fields.forEach((field) => { + if (field.get('widget') === 'hidden') return; + this.componentValidate[field.get("name")](); + }); + }; + + render() { + const { + collection, + fields, + entry, + fieldsMetaData, + fieldsErrors, + mediaPaths, + getAsset, + onChange, + onOpenMediaLibrary, + onAddAsset, + onRemoveInsertedMedia, + onValidate, + } = this.props; + + if (!collection || !fields) { + return null; + } + + if (entry.size === 0 || entry.get('partial') === true) { + return null; + } + + return ( +
+ {fields.map((field, i) => field.get('widget') === 'hidden' ? null : + + )} +
+ ); + } +} + +ControlPane.propTypes = { + collection: ImmutablePropTypes.map.isRequired, + entry: ImmutablePropTypes.map.isRequired, + fields: ImmutablePropTypes.list.isRequired, + fieldsMetaData: ImmutablePropTypes.map.isRequired, + fieldsErrors: ImmutablePropTypes.map.isRequired, + mediaPaths: ImmutablePropTypes.map.isRequired, + getAsset: PropTypes.func.isRequired, + onOpenMediaLibrary: PropTypes.func.isRequired, + onAddAsset: PropTypes.func.isRequired, + onChange: PropTypes.func.isRequired, + onValidate: PropTypes.func.isRequired, + onRemoveInsertedMedia: PropTypes.func.isRequired, +}; diff --git a/src/components/Widgets/ControlHOC.js b/src/components/Editor/EditorControlPane/Widget.js similarity index 70% rename from src/components/Widgets/ControlHOC.js rename to src/components/Editor/EditorControlPane/Widget.js index 5016cb39..75c18bbb 100644 --- a/src/components/Widgets/ControlHOC.js +++ b/src/components/Editor/EditorControlPane/Widget.js @@ -1,15 +1,24 @@ import PropTypes from 'prop-types'; import React, { Component } from 'react'; import ImmutablePropTypes from "react-immutable-proptypes"; -import ValidationErrorTypes from '../../constants/validationErrorTypes'; +import { Map } from 'immutable'; +import ValidationErrorTypes from 'Constants/validationErrorTypes'; const truthy = () => ({ error: false }); -class ControlHOC extends Component { - +export default class Widget extends Component { static propTypes = { controlComponent: PropTypes.func.isRequired, field: ImmutablePropTypes.map.isRequired, + hasActiveStyle: PropTypes.bool, + setActiveStyle: PropTypes.func.isRequired, + setInactiveStyle: PropTypes.func.isRequired, + className: PropTypes.string.isRequired, + classNameWrapper: PropTypes.string.isRequired, + classNameWidget: PropTypes.string.isRequired, + classNameWidgetActive: PropTypes.string.isRequired, + classNameLabel: PropTypes.string.isRequired, + classNameLabelActive: PropTypes.string.isRequired, value: PropTypes.oneOfType([ PropTypes.node, PropTypes.object, @@ -22,7 +31,7 @@ class ControlHOC extends Component { onValidate: PropTypes.func, onOpenMediaLibrary: PropTypes.func.isRequired, onAddAsset: PropTypes.func.isRequired, - onRemoveAsset: PropTypes.func.isRequired, + onRemoveInsertedMedia: PropTypes.func.isRequired, getAsset: PropTypes.func.isRequired, }; @@ -33,7 +42,9 @@ class ControlHOC extends Component { if (this.wrappedControlShouldComponentUpdate) { return this.wrappedControlShouldComponentUpdate(nextProps); } - return this.props.value !== nextProps.value; + return this.props.value !== nextProps.value + || this.props.classNameWrapper !== nextProps.classNameWrapper + || this.props.hasActiveStyle !== nextProps.hasActiveStyle; } processInnerControlRef = ref => { @@ -136,6 +147,21 @@ class ControlHOC extends Component { return { error: false }; }; + /** + * In case the `onChangeObject` function is frozen by a child widget implementation, + * e.g. when debounced, always get the latest object value instead of using + * `this.props.value` directly. + */ + getObjectValue = () => this.props.value || Map(); + + /** + * Change handler for fields that are nested within another field. + */ + onChangeObject = (fieldName, newValue, newMetadata) => { + const newObjectValue = this.getObjectValue().set(fieldName, newValue); + return this.props.onChange(newObjectValue, newMetadata); + }; + render() { const { controlComponent, @@ -146,8 +172,17 @@ class ControlHOC extends Component { onChange, onOpenMediaLibrary, onAddAsset, - onRemoveAsset, - getAsset + onRemoveInsertedMedia, + getAsset, + classNameWrapper, + classNameWidget, + classNameWidgetActive, + classNameLabel, + classNameLabelActive, + setActiveStyle, + setInactiveStyle, + hasActiveStyle, + editorControl, } = this.props; return React.createElement(controlComponent, { field, @@ -155,14 +190,22 @@ class ControlHOC extends Component { mediaPaths, metadata, onChange, + onChangeObject: this.onChangeObject, onOpenMediaLibrary, onAddAsset, - onRemoveAsset, + onRemoveInsertedMedia, getAsset, forID: field.get('name'), ref: this.processInnerControlRef, + classNameWrapper, + classNameWidget, + classNameWidgetActive, + classNameLabel, + classNameLabelActive, + setActiveStyle, + setInactiveStyle, + hasActiveStyle, + editorControl, }); } } - -export default ControlHOC; diff --git a/src/components/Editor/EditorInterface.css b/src/components/Editor/EditorInterface.css new file mode 100644 index 00000000..c8a5d2a3 --- /dev/null +++ b/src/components/Editor/EditorInterface.css @@ -0,0 +1,78 @@ +/** + * React Split Pane + */ +.Resizer.vertical { + width: 21px; + cursor: col-resize; + position: relative; + transition: background-color var(--transition); + + &:before { + content: ''; + width: 1px; + height: 100%; + position: relative; + left: 10px; + background-color: var(--textFieldBorderColor); + display: block; + } + + &:hover, + &:active { + background-color: var(--colorGrayLight); + } +} + +/* Quick fix for preview pane not fully displaying in Safari */ +.SplitPane .Pane { + height: 100%; +} + +.SplitPane, +.nc-entryEditor-noPreviewEditorContainer { + @apply(--card); + border-radius: 0; + height: 100%; +} + +.nc-entryEditor-containerOuter { + width: 100%; + min-width: 800px; + height: 100%; + position: absolute; + top: 0; + left: 0; + overflow: hidden; + padding-top: 66px; + background-color: var(--colorBackground); +} + +.nc-entryEditor-container { + max-width: 1600px; + height: 100%; + margin: 0 auto; + position: relative; +} + +.nc-entryEditor-controlPane, +.nc-entryEditor-previewPane { + height: 100%; + overflow-y: auto; +} + +.nc-entryEditor-controlPane { + padding: 0 16px 16px; + position: relative; + overflow-x: hidden; +} + +.nc-entryEditor-viewControls { + position: absolute; + top: 10px; + right: -10px; + z-index: 299; +} + +.nc-entryEditor-blocker > * { + pointer-events: none; +} diff --git a/src/components/Editor/EditorInterface.js b/src/components/Editor/EditorInterface.js new file mode 100644 index 00000000..7afe6572 --- /dev/null +++ b/src/components/Editor/EditorInterface.js @@ -0,0 +1,224 @@ +import PropTypes from 'prop-types'; +import React, { Component } from 'react'; +import ImmutablePropTypes from 'react-immutable-proptypes'; +import SplitPane from 'react-split-pane'; +import classnames from 'classnames'; +import { ScrollSync, ScrollSyncPane } from './EditorScrollSync'; +import { Icon } from 'UI' +import EditorControlPane from './EditorControlPane/EditorControlPane'; +import EditorPreviewPane from './EditorPreviewPane/EditorPreviewPane'; +import EditorToolbar from './EditorToolbar'; +import EditorToggle from './EditorToggle'; + +const PREVIEW_VISIBLE = 'cms.preview-visible'; +const SCROLL_SYNC_ENABLED = 'cms.scroll-sync-enabled'; + +class EditorInterface extends Component { + state = { + showEventBlocker: false, + previewVisible: localStorage.getItem(PREVIEW_VISIBLE) !== "false", + scrollSyncEnabled: localStorage.getItem(SCROLL_SYNC_ENABLED) !== "false", + }; + + handleSplitPaneDragStart = () => { + this.setState({ showEventBlocker: true }); + }; + + handleSplitPaneDragFinished = () => { + this.setState({ showEventBlocker: false }); + }; + + handleOnPersist = (opts = {}) => { + const { createNew = false } = opts; + this.controlPaneRef.validate(); + this.props.onPersist({ createNew }); + }; + + handleOnPublish = (opts = {}) => { + const { createNew = false } = opts; + this.controlPaneRef.validate(); + this.props.onPublish({ createNew }); + }; + + handleTogglePreview = () => { + const newPreviewVisible = !this.state.previewVisible; + this.setState({ previewVisible: newPreviewVisible }); + localStorage.setItem(PREVIEW_VISIBLE, newPreviewVisible); + }; + + handleToggleScrollSync = () => { + const newScrollSyncEnabled = !this.state.scrollSyncEnabled; + this.setState({ scrollSyncEnabled: newScrollSyncEnabled }); + localStorage.setItem(SCROLL_SYNC_ENABLED, newScrollSyncEnabled); + }; + + render() { + const { + collection, + entry, + fields, + fieldsMetaData, + fieldsErrors, + mediaPaths, + getAsset, + onChange, + enableSave, + showDelete, + onDelete, + onDeleteUnpublishedChanges, + onChangeStatus, + onPublish, + onValidate, + onOpenMediaLibrary, + onAddAsset, + onRemoveInsertedMedia, + user, + hasChanged, + displayUrl, + hasWorkflow, + hasUnpublishedChanges, + isNewEntry, + isModification, + currentStatus, + onLogoutClick, + } = this.props; + + const { previewVisible, scrollSyncEnabled, showEventBlocker } = this.state; + + const collectionPreviewEnabled = collection.getIn(['editor', 'preview'], true); + + const editor = ( +
+ this.controlPaneRef = c} // eslint-disable-line + /> +
+ ); + + const editorWithPreview = ( + +
+ + {editor} +
+ +
+
+
+
+ ); + + const editorWithoutPreview = ( +
+ {editor} +
+ ); + + return ( +
+ this.handleOnPersist({ createNew: true })} + onDelete={onDelete} + onDeleteUnpublishedChanges={onDeleteUnpublishedChanges} + onChangeStatus={onChangeStatus} + showDelete={showDelete} + onPublish={onPublish} + onPublishAndNew={() => this.handleOnPublish({ createNew: true })} + enableSave={enableSave} + user={user} + hasChanged={hasChanged} + displayUrl={displayUrl} + collection={collection} + hasWorkflow={hasWorkflow} + hasUnpublishedChanges={hasUnpublishedChanges} + isNewEntry={isNewEntry} + isModification={isModification} + currentStatus={currentStatus} + onLogoutClick={onLogoutClick} + /> +
+
+ + +
+ { + collectionPreviewEnabled && this.state.previewVisible + ? editorWithPreview + : editorWithoutPreview + } +
+
+ ); + } +} + +EditorInterface.propTypes = { + collection: ImmutablePropTypes.map.isRequired, + entry: ImmutablePropTypes.map.isRequired, + fields: ImmutablePropTypes.list.isRequired, + fieldsMetaData: ImmutablePropTypes.map.isRequired, + fieldsErrors: ImmutablePropTypes.map.isRequired, + mediaPaths: ImmutablePropTypes.map.isRequired, + getAsset: PropTypes.func.isRequired, + onOpenMediaLibrary: PropTypes.func.isRequired, + onAddAsset: PropTypes.func.isRequired, + onChange: PropTypes.func.isRequired, + onValidate: PropTypes.func.isRequired, + onPersist: PropTypes.func.isRequired, + enableSave: PropTypes.bool.isRequired, + showDelete: PropTypes.bool.isRequired, + onDelete: PropTypes.func.isRequired, + onDeleteUnpublishedChanges: PropTypes.func.isRequired, + onPublish: PropTypes.func.isRequired, + onChangeStatus: PropTypes.func.isRequired, + onRemoveInsertedMedia: PropTypes.func.isRequired, + user: ImmutablePropTypes.map, + hasChanged: PropTypes.bool, + displayUrl: PropTypes.string, + hasWorkflow: PropTypes.bool, + hasUnpublishedChanges: PropTypes.bool, + isNewEntry: PropTypes.bool, + isModification: PropTypes.bool, + currentStatus: PropTypes.string, + onLogoutClick: PropTypes.func.isRequired, +}; + +export default EditorInterface; diff --git a/src/components/PreviewPane/Preview.js b/src/components/Editor/EditorPreviewPane/EditorPreview.js similarity index 100% rename from src/components/PreviewPane/Preview.js rename to src/components/Editor/EditorPreviewPane/EditorPreview.js diff --git a/src/components/PreviewPane/PreviewContent.js b/src/components/Editor/EditorPreviewPane/EditorPreviewContent.js similarity index 92% rename from src/components/PreviewPane/PreviewContent.js rename to src/components/Editor/EditorPreviewPane/EditorPreviewContent.js index a8bae522..c7a466ba 100644 --- a/src/components/PreviewPane/PreviewContent.js +++ b/src/components/Editor/EditorPreviewPane/EditorPreviewContent.js @@ -1,6 +1,6 @@ import PropTypes from 'prop-types'; import React from 'react'; -import { ScrollSyncPane } from '../ScrollSync'; +import { ScrollSyncPane } from 'react-scroll-sync'; /** * We need to create a lightweight component here so that we can access the diff --git a/src/components/PreviewPane/PreviewPane.css b/src/components/Editor/EditorPreviewPane/EditorPreviewPane.css similarity index 70% rename from src/components/PreviewPane/PreviewPane.css rename to src/components/Editor/EditorPreviewPane/EditorPreviewPane.css index e91d1e10..9b92a1f7 100644 --- a/src/components/PreviewPane/PreviewPane.css +++ b/src/components/Editor/EditorPreviewPane/EditorPreviewPane.css @@ -3,4 +3,5 @@ height: 100%; border: none; background: #fff; + border-radius: var(--borderRadius); } diff --git a/src/components/PreviewPane/PreviewPane.js b/src/components/Editor/EditorPreviewPane/EditorPreviewPane.js similarity index 89% rename from src/components/PreviewPane/PreviewPane.js rename to src/components/Editor/EditorPreviewPane/EditorPreviewPane.js index 0f13ddb1..fd7654be 100644 --- a/src/components/PreviewPane/PreviewPane.js +++ b/src/components/Editor/EditorPreviewPane/EditorPreviewPane.js @@ -3,14 +3,13 @@ import React from 'react'; import { List, Map } from 'immutable'; import ImmutablePropTypes from 'react-immutable-proptypes'; import Frame from 'react-frame-component'; -import registry from '../../lib/registry'; -import ErrorBoundary from '../UI/ErrorBoundary/ErrorBoundary'; -import { resolveWidget } from '../Widgets'; -import { selectTemplateName, selectInferedField } from '../../reducers/collections'; -import { INFERABLE_FIELDS } from '../../constants/fieldInference'; -import PreviewContent from './PreviewContent.js'; -import PreviewHOC from '../Widgets/PreviewHOC'; -import Preview from './Preview'; +import { resolveWidget, getPreviewTemplate, getPreviewStyles } from 'Lib/registry'; +import { ErrorBoundary } from 'UI'; +import { selectTemplateName, selectInferedField } from 'Reducers/collections'; +import { INFERABLE_FIELDS } from 'Constants/fieldInference'; +import EditorPreviewContent from './EditorPreviewContent.js'; +import PreviewHOC from './PreviewHOC'; +import EditorPreview from './EditorPreview'; export default class PreviewPane extends React.Component { @@ -127,8 +126,8 @@ export default class PreviewPane extends React.Component { } const previewComponent = - registry.getPreviewTemplate(selectTemplateName(collection, entry.get('slug'))) || - Preview; + getPreviewTemplate(selectTemplateName(collection, entry.get('slug'))) || + EditorPreview; this.inferFields(); @@ -138,7 +137,7 @@ export default class PreviewPane extends React.Component { widgetsFor: this.widgetsFor, }; - const styleEls = registry.getPreviewStyles() + const styleEls = getPreviewStyles() .map((style, i) => ); if (!collection) { @@ -152,10 +151,11 @@ export default class PreviewPane extends React.Component {
`; + return ( - + ); diff --git a/src/components/Widgets/PreviewHOC.js b/src/components/Editor/EditorPreviewPane/PreviewHOC.js similarity index 100% rename from src/components/Widgets/PreviewHOC.js rename to src/components/Editor/EditorPreviewPane/PreviewHOC.js diff --git a/src/components/Editor/EditorScrollSync/ScrollSync.js b/src/components/Editor/EditorScrollSync/ScrollSync.js new file mode 100644 index 00000000..a5ce3a62 --- /dev/null +++ b/src/components/Editor/EditorScrollSync/ScrollSync.js @@ -0,0 +1,127 @@ +import React, { Component } from 'react' +import PropTypes from 'prop-types' + +/** + * ScrollSync provider component + * + */ + +export default class ScrollSync extends Component { + + static propTypes = { + children: PropTypes.element.isRequired, + proportional: PropTypes.bool, + vertical: PropTypes.bool, + horizontal: PropTypes.bool, + enabled: PropTypes.bool + }; + + static defaultProps = { + proportional: true, + vertical: true, + horizontal: true, + enabled: true + }; + + static childContextTypes = { + registerPane: PropTypes.func, + unregisterPane: PropTypes.func + } + + getChildContext() { + return { + registerPane: this.registerPane, + unregisterPane: this.unregisterPane + } + } + + panes = {} + + registerPane = (node, group) => { + if (!this.panes[group]) { + this.panes[group] = [] + } + + if (!this.findPane(node, group)) { + this.addEvents(node, group) + this.panes[group].push(node) + } + } + + unregisterPane = (node, group) => { + if (this.findPane(node, group)) { + this.removeEvents(node) + this.panes[group].splice(this.panes[group].indexOf(node), 1) + } + } + + addEvents = (node, group) => { + /* For some reason element.addEventListener doesnt work with document.body */ + node.onscroll = this.handlePaneScroll.bind(this, node, group) // eslint-disable-line + } + + removeEvents = (node) => { + /* For some reason element.removeEventListener doesnt work with document.body */ + node.onscroll = null // eslint-disable-line + } + + findPane = (node, group) => { + if (!this.panes[group]) { + return false + } + + return this.panes[group].find(pane => pane === node) + } + + handlePaneScroll = (node, group) => { + if (!this.props.enabled) { + return; + } + + window.requestAnimationFrame(() => { + this.syncScrollPositions(node, group) + }) + } + + syncScrollPositions = (scrolledPane, group) => { + const { + scrollTop, + scrollHeight, + clientHeight, + scrollLeft, + scrollWidth, + clientWidth + } = scrolledPane + + const scrollTopOffset = scrollHeight - clientHeight + const scrollLeftOffset = scrollWidth - clientWidth + + const { proportional, vertical, horizontal } = this.props + + this.panes[group].forEach((pane) => { + /* For all panes beside the currently scrolling one */ + if (scrolledPane !== pane) { + /* Remove event listeners from the node that we'll manipulate */ + this.removeEvents(pane, group) + /* Calculate the actual pane height */ + const paneHeight = pane.scrollHeight - clientHeight + const paneWidth = pane.scrollWidth - clientWidth + /* Adjust the scrollTop position of it accordingly */ + if (vertical && scrollTopOffset > 0) { + pane.scrollTop = proportional ? (paneHeight * scrollTop) / scrollTopOffset : scrollTop // eslint-disable-line + } + if (horizontal && scrollLeftOffset > 0) { + pane.scrollLeft = proportional ? (paneWidth * scrollLeft) / scrollLeftOffset : scrollLeft // eslint-disable-line + } + /* Re-attach event listeners after we're done scrolling */ + window.requestAnimationFrame(() => { + this.addEvents(pane, group) + }) + } + }) + } + + render() { + return React.Children.only(this.props.children) + } +} diff --git a/src/components/Editor/EditorScrollSync/ScrollSyncPane.js b/src/components/Editor/EditorScrollSync/ScrollSyncPane.js new file mode 100644 index 00000000..b3a22c5f --- /dev/null +++ b/src/components/Editor/EditorScrollSync/ScrollSyncPane.js @@ -0,0 +1,50 @@ +import { Component } from 'react' +import ReactDOM from 'react-dom' +import PropTypes from 'prop-types' + +/** + * ScrollSyncPane Component + * + * Wrap your content in it to keep its scroll position in sync with other panes + * + * @example ./example.md + */ + + +export default class ScrollSyncPane extends Component { + + static propTypes = { + children: PropTypes.node.isRequired, + attachTo: PropTypes.object, + group: PropTypes.string + } + + static defaultProps = { + group: 'default' + } + + static contextTypes = { + registerPane: PropTypes.func.isRequired, + unregisterPane: PropTypes.func.isRequired + }; + + componentDidMount() { + this.node = this.props.attachTo || ReactDOM.findDOMNode(this) + this.context.registerPane(this.node, this.props.group) + } + + componentWillReceiveProps(nextProps) { + if (this.props.group !== nextProps.group) { + this.context.unregisterPane(this.node, this.props.group) + this.context.registerPane(this.node, nextProps.group) + } + } + + componentWillUnmount() { + this.context.unregisterPane(this.node, this.props.group) + } + + render() { + return this.props.children + } +} diff --git a/src/components/ScrollSync/index.js b/src/components/Editor/EditorScrollSync/index.js similarity index 100% rename from src/components/ScrollSync/index.js rename to src/components/Editor/EditorScrollSync/index.js diff --git a/src/components/Editor/EditorToggle.css b/src/components/Editor/EditorToggle.css new file mode 100644 index 00000000..8a4a7859 --- /dev/null +++ b/src/components/Editor/EditorToggle.css @@ -0,0 +1,18 @@ +.nc-editor-toggle { + @apply(--dropShadowMiddle); + background-color: #fff; + color: var(--colorInactive); + border-radius: 32px; + display: block; + width: 40px; + height: 40px; + padding: 0; + display: flex; + justify-content: center; + align-items: center; + margin-bottom: 12px; +} + +.nc-editor-toggleActive { + color: var(--colorActive); +} diff --git a/src/components/Editor/EditorToggle.js b/src/components/Editor/EditorToggle.js new file mode 100644 index 00000000..13c674fd --- /dev/null +++ b/src/components/Editor/EditorToggle.js @@ -0,0 +1,18 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import c from 'classnames'; +import { Icon } from 'UI'; + +const EditorToggle = ({ enabled, active, onClick, icon }) => !enabled ? null : + ; + +EditorToggle.propTypes = { + enabled: PropTypes.bool, + active: PropTypes.bool, + onClick: PropTypes.func.isRequired, + icon: PropTypes.string.isRequired, +}; + +export default EditorToggle; diff --git a/src/components/Editor/EditorToolbar.css b/src/components/Editor/EditorToolbar.css new file mode 100644 index 00000000..45b6f494 --- /dev/null +++ b/src/components/Editor/EditorToolbar.css @@ -0,0 +1,151 @@ +:root { + --editorToolbarButtonMargin: 0 10px; +} + +.nc-entryEditor-toolbar { + box-shadow: 0 2px 6px 0 rgba(68, 74, 87, 0.05), + 0 1px 3px 0 rgba(68, 74, 87, 0.10), + 0 2px 54px rgba(0, 0, 0, 0.1); + position: fixed; + top: 0; + left: 0; + width: 100%; + min-width: 800px; + z-index: 300; + background-color: #fff; + height: 66px; + display: flex; + justify-content: space-between; +} + +.nc-entryEditor-toolbar-mainSection, +.nc-entryEditor-toolbar-backSection, +.nc-entryEditor-toolbar-metaSection { + height: 100%; + display: flex; + align-items: center; + +} + +.nc-entryEditor-toolbar-mainSection { + flex: 10; + display: flex; + justify-content: space-between; + padding: 0 10px; + + & .nc-entryEditor-toolbar-mainSection-left { + display: flex; + } + & .nc-entryEditor-toolbar-mainSection-right { + display: flex; + justify-content: flex-end; + } +} + +.nc-entryEditor-toolbar-backSection, +.nc-entryEditor-toolbar-metaSection { + border: 0 solid var(--textFieldBorderColor); +} + +.nc-entryEditor-toolbar-dropdown { + margin: var(--editorToolbarButtonMargin); + + & .nc-icon { + color: var(--colorTeal); + } +} + +.nc-entryEditor-toolbar-publishButton { + background-color: var(--colorTeal); +} + +.nc-entryEditor-toolbar-statusButton { + background-color: var(--colorTealLight); + color: var(--colorTeal); +} + +.nc-entryEditor-toolbar-backSection { + border-right-width: 1px; + font-weight: normal; + padding: 0 20px; + + &:hover, + &:focus { + background-color: #F1F2F4; + } +} + +.nc-entryEditor-toolbar-metaSection { + border-left-width: 1px; + padding: 0 7px; +} + +.nc-entryEditor-toolbar-backArrow { + color: var(--colorTextLead); + font-size: 21px; + font-weight: 600; + margin-right: 16px; +} + +.nc-entryEditor-toolbar-backCollection { + color: var(--colorTextLead); + font-size: 14px; +} + +.nc-entryEditor-toolbar-backStatus { + @apply(--textBadgeSuccess); + + &::after { + height: 12px; + width: 15.5px; + color: #005614; + margin-left: 5px; + + position: relative; + top: 1px; + + content: url("data:image/svg+xml; utf8, "); + } + +} + +.nc-entryEditor-toolbar-backStatus-hasChanged { + @apply(--textBadgeDanger); +} + +.nc-entryEditor-toolbar-backStatus, +.nc-entryEditor-toolbar-backStatus-hasChanged { + margin-top: 6px; +} + +.nc-entryEditor-toolbar-deleteButton, +.nc-entryEditor-toolbar-saveButton { + @apply(--buttonDefault); + display: block; + margin: var(--editorToolbarButtonMargin); +} + +.nc-entryEditor-toolbar-deleteButton { + @apply(--buttonLightRed); +} + +.nc-entryEditor-toolbar-saveButton { + @apply(--buttonLightBlue); +} + +.nc-entryEditor-toolbar-statusPublished { + margin: var(--editorToolbarButtonMargin); + border: 1px solid var(--textFieldBorderColor); + border-radius: var(--borderRadius); + background-color: var(--colorWhite); + color: var(--colorTeal); + padding: 0 24px; + line-height: 36px; + cursor: default; + font-size: 14px; + font-weight: 500; +} + +.nc-entryEditor-toolbar-statusMenu-status .nc-icon { + color: var(--colorInfoText); +} diff --git a/src/components/Editor/EditorToolbar.js b/src/components/Editor/EditorToolbar.js new file mode 100644 index 00000000..8f4b4ede --- /dev/null +++ b/src/components/Editor/EditorToolbar.js @@ -0,0 +1,237 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import ImmutablePropTypes from 'react-immutable-proptypes'; +import c from 'classnames'; +import { Link } from 'react-router-dom'; +import { status } from 'Constants/publishModes'; +import { Icon, Dropdown, DropdownItem } from 'UI'; +import { stripProtocol } from 'Lib/urlHelper'; + +export default class EditorToolbar extends React.Component { + static propTypes = { + isPersisting: PropTypes.bool, + isPublishing: PropTypes.bool, + isUpdatingStatus: PropTypes.bool, + isDeleting: PropTypes.bool, + onPersist: PropTypes.func.isRequired, + onPersistAndNew: PropTypes.func.isRequired, + enableSave: PropTypes.bool.isRequired, + showDelete: PropTypes.bool.isRequired, + onDelete: PropTypes.func.isRequired, + onDeleteUnpublishedChanges: PropTypes.func.isRequired, + onChangeStatus: PropTypes.func.isRequired, + onPublish: PropTypes.func.isRequired, + onPublishAndNew: PropTypes.func.isRequired, + user: ImmutablePropTypes.map, + hasChanged: PropTypes.bool, + displayUrl: PropTypes.string, + collection: ImmutablePropTypes.map.isRequired, + hasWorkflow: PropTypes.bool, + hasUnpublishedChanges: PropTypes.bool, + isNewEntry: PropTypes.bool, + isModification: PropTypes.bool, + currentStatus: PropTypes.string, + onLogoutClick: PropTypes.func.isRequired, + }; + + renderSimpleSaveControls = () => { + const { showDelete, onDelete } = this.props; + return ( +
+ { + showDelete + ? + : null + } +
+ ); + }; + + renderSimplePublishControls = () => { + const { onPersist, onPersistAndNew, isPersisting, hasChanged, isNewEntry } = this.props; + if (!isNewEntry && !hasChanged) { + return
Published
; + } + return ( +
+ + + + +
+ ); + }; + + renderWorkflowSaveControls = () => { + const { + onPersist, + onDelete, + onDeleteUnpublishedChanges, + hasChanged, + hasUnpublishedChanges, + isPersisting, + isDeleting, + isNewEntry, + isModification, + } = this.props; + + const deleteLabel = (hasUnpublishedChanges && isModification && 'Delete unpublished changes') + || (hasUnpublishedChanges && (isNewEntry || !isModification) && 'Delete unpublished entry') + || (!hasUnpublishedChanges && !isModification && 'Delete published entry'); + + return [ + , + isNewEntry || !deleteLabel ? null + : , + ]; + }; + + renderWorkflowPublishControls = () => { + const { + onPersist, + onPersistAndNew, + isUpdatingStatus, + isPublishing, + onChangeStatus, + onPublish, + onPublishAndNew, + currentStatus, + isNewEntry, + } = this.props; + if (currentStatus) { + return [ + + onChangeStatus('DRAFT')} + icon={currentStatus === status.get('DRAFT') && 'check'} + /> + onChangeStatus('PENDING_REVIEW')} + icon={currentStatus === status.get('PENDING_REVIEW') && 'check'} + /> + onChangeStatus('PENDING_PUBLISH')} + icon={currentStatus === status.get('PENDING_PUBLISH') && 'check'} + /> + , + + + + + ]; + } + + if (!isNewEntry) { + return
Published
; + } + }; + + + + render() { + const { + isPersisting, + onPersist, + onPersistAndNew, + enableSave, + showDelete, + onDelete, + user, + hasChanged, + displayUrl, + collection, + hasWorkflow, + hasUnpublishedChanges, + onLogoutClick, + } = this.props; + const disabled = !enableSave || isPersisting; + const avatarUrl = user.get('avatar_url'); + + return ( +
+ +
+
+
+ Writing in {collection.get('label')} collection +
+ { + hasChanged + ?
Unsaved Changes
+ :
Changes saved
+ } +
+ +
+
+ { hasWorkflow ? this.renderWorkflowSaveControls() : this.renderSimpleSaveControls() } +
+
+ { hasWorkflow ? this.renderWorkflowPublishControls() : this.renderSimplePublishControls() } +
+
+
+ { + displayUrl + ? + {stripProtocol(displayUrl)} + + : null + } + + { + avatarUrl + ? + : + } + + } + > + + +
+
+ ); + } +}; diff --git a/src/components/EntryEditor/__tests__/EntryEditorToolbar.spec.js b/src/components/Editor/__tests__/EntryEditorToolbar.spec.js similarity index 94% rename from src/components/EntryEditor/__tests__/EntryEditorToolbar.spec.js rename to src/components/Editor/__tests__/EntryEditorToolbar.spec.js index c8e28d65..bd763cd2 100644 --- a/src/components/EntryEditor/__tests__/EntryEditorToolbar.spec.js +++ b/src/components/Editor/__tests__/EntryEditorToolbar.spec.js @@ -1,6 +1,6 @@ import React from 'react'; import { shallow } from 'enzyme'; -import EntryEditorToolbar from '../EntryEditorToolbar'; +import EditorToolbar from '../EditorInterface/EditorToolbar'; describe('EntryEditorToolbar', () => { it('should have the Save button disabled initally, and the Cancel button enabled', () => { diff --git a/src/components/EntryEditor/__tests__/__snapshots__/EntryEditorToolbar.spec.js.snap b/src/components/Editor/__tests__/__snapshots__/EntryEditorToolbar.spec.js.snap similarity index 100% rename from src/components/EntryEditor/__tests__/__snapshots__/EntryEditorToolbar.spec.js.snap rename to src/components/Editor/__tests__/__snapshots__/EntryEditorToolbar.spec.js.snap diff --git a/src/components/Editor/withWorkflow.js b/src/components/Editor/withWorkflow.js new file mode 100644 index 00000000..c8678258 --- /dev/null +++ b/src/components/Editor/withWorkflow.js @@ -0,0 +1,58 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import { EDITORIAL_WORKFLOW } from 'Constants/publishModes'; +import { selectUnpublishedEntry, selectEntry } from 'Reducers'; +import { selectAllowDeletion } from 'Reducers/collections'; +import { loadUnpublishedEntry, persistUnpublishedEntry } from 'Actions/editorialWorkflow'; + +function mapStateToProps(state, ownProps) { + const { collections } = state; + const isEditorialWorkflow = (state.config.get('publish_mode') === EDITORIAL_WORKFLOW); + const collection = collections.get(ownProps.match.params.name); + const returnObj = { + isEditorialWorkflow, + showDelete: !ownProps.newEntry && selectAllowDeletion(collection), + }; + if (isEditorialWorkflow) { + const slug = ownProps.match.params.slug; + const unpublishedEntry = selectUnpublishedEntry(state, collection.get('name'), slug); + if (unpublishedEntry) { + returnObj.unpublishedEntry = true; + returnObj.entry = unpublishedEntry; + } + } + return returnObj; +} + +function mergeProps(stateProps, dispatchProps, ownProps) { + const { isEditorialWorkflow, unpublishedEntry } = stateProps; + const { dispatch } = dispatchProps; + const returnObj = {}; + + if (isEditorialWorkflow) { + // Overwrite loadEntry to loadUnpublishedEntry + returnObj.loadEntry = (collection, slug) => + dispatch(loadUnpublishedEntry(collection, slug)); + + // Overwrite persistEntry to persistUnpublishedEntry + returnObj.persistEntry = collection => + dispatch(persistUnpublishedEntry(collection, unpublishedEntry)); + } + + return { + ...ownProps, + ...stateProps, + ...returnObj, + }; +} + +export default function withWorkflow(Editor) { + return connect(mapStateToProps, null, mergeProps)( + class extends React.Component { + render() { + return ; + } + } + ); +}; + diff --git a/src/components/EditorWidgets/Boolean/Boolean.css b/src/components/EditorWidgets/Boolean/Boolean.css new file mode 100644 index 00000000..b56b8545 --- /dev/null +++ b/src/components/EditorWidgets/Boolean/Boolean.css @@ -0,0 +1,9 @@ +.nc-booleanControl-switch { + & .nc-toggle-background { + background-color: var(--textFieldBorderColor); + } + + & .nc-toggle-active .nc-toggle-background { + background-color: var(--colorActive); + } +} diff --git a/src/components/EditorWidgets/Boolean/BooleanControl.js b/src/components/EditorWidgets/Boolean/BooleanControl.js new file mode 100644 index 00000000..0612a9cc --- /dev/null +++ b/src/components/EditorWidgets/Boolean/BooleanControl.js @@ -0,0 +1,40 @@ +import PropTypes from 'prop-types'; +import React from 'react'; +import ImmutablePropTypes from "react-immutable-proptypes"; +import { isBoolean } from 'lodash'; +import { Toggle } from 'UI'; + +export default class BooleanControl extends React.Component { + render() { + const { + value, + field, + forID, + onChange, + classNameWrapper, + setActiveStyle, + setInactiveStyle + } = this.props; + return ( +
+ +
+ ); + } +} + +BooleanControl.propTypes = { + field: ImmutablePropTypes.map.isRequired, + onChange: PropTypes.func.isRequired, + classNameWrapper: PropTypes.string.isRequired, + setActiveStyle: PropTypes.func.isRequired, + setInactiveStyle: PropTypes.func.isRequired, + forID: PropTypes.string, + value: PropTypes.bool, +}; diff --git a/src/components/Widgets/DateControl.js b/src/components/EditorWidgets/Date/DateControl.js similarity index 53% rename from src/components/Widgets/DateControl.js rename to src/components/EditorWidgets/Date/DateControl.js index fca1653a..dc064ccd 100644 --- a/src/components/Widgets/DateControl.js +++ b/src/components/EditorWidgets/Date/DateControl.js @@ -1,9 +1,22 @@ -import PropTypes from 'prop-types'; import React from 'react'; +import PropTypes from 'prop-types'; import DateTime from 'react-datetime'; import moment from 'moment'; export default class DateControl extends React.Component { + static propTypes = { + field: PropTypes.object.isRequired, + onChange: PropTypes.func.isRequired, + classNameWrapper: PropTypes.string.isRequired, + setActiveStyle: PropTypes.func.isRequired, + setInactiveStyle: PropTypes.func.isRequired, + value: PropTypes.oneOfType([ + PropTypes.object, + PropTypes.string, + ]), + includeTime: PropTypes.bool, + }; + componentDidMount() { const { value, field, onChange } = this.props; this.format = field.get('format'); @@ -28,22 +41,17 @@ export default class DateControl extends React.Component { }; render() { - const { includeTime, value } = this.props; + const { includeTime, value, classNameWrapper, setActiveStyle, setInactiveStyle } = this.props; const format = this.format || moment.defaultFormat; - return (); + return ( + + ); } } - -DateControl.propTypes = { - onChange: PropTypes.func.isRequired, - value: PropTypes.oneOfType([ - PropTypes.object, - PropTypes.string, - ]), - includeTime: PropTypes.bool, - field: PropTypes.object, -}; diff --git a/src/components/Widgets/DatePreview.js b/src/components/EditorWidgets/Date/DatePreview.js similarity index 57% rename from src/components/Widgets/DatePreview.js rename to src/components/EditorWidgets/Date/DatePreview.js index c31e95f5..945a8f2b 100644 --- a/src/components/Widgets/DatePreview.js +++ b/src/components/EditorWidgets/Date/DatePreview.js @@ -1,9 +1,8 @@ import PropTypes from 'prop-types'; import React from 'react'; -import previewStyle from './defaultPreviewStyle'; export default function DatePreview({ value }) { - return
{value ? value.toString() : null}
; + return
{value ? value.toString() : null}
; } DatePreview.propTypes = { diff --git a/src/components/EditorWidgets/DateTime/DateTime.css b/src/components/EditorWidgets/DateTime/DateTime.css new file mode 100644 index 00000000..41b83e5c --- /dev/null +++ b/src/components/EditorWidgets/DateTime/DateTime.css @@ -0,0 +1 @@ +@import "./ReactDatetime.css"; diff --git a/src/components/EditorWidgets/DateTime/DateTimeControl.js b/src/components/EditorWidgets/DateTime/DateTimeControl.js new file mode 100644 index 00000000..dc97a680 --- /dev/null +++ b/src/components/EditorWidgets/DateTime/DateTimeControl.js @@ -0,0 +1,43 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import DateControl from 'EditorWidgets/Date/DateControl'; + +export default class DateTimeControl extends React.Component { + static propTypes = { + field: PropTypes.object.isRequired, + onChange: PropTypes.func.isRequired, + classNameWrapper: PropTypes.string.isRequired, + setActiveStyle: PropTypes.func.isRequired, + setInactiveStyle: PropTypes.func.isRequired, + value: PropTypes.oneOfType([ + PropTypes.object, + PropTypes.string, + ]), + format: PropTypes.string, + }; + + render() { + const { + field, + format, + onChange, + value, + classNameWrapper, + setActiveStyle, + setInactiveStyle + } = this.props; + + return ( + + ); + } +} diff --git a/src/components/Widgets/DateTimePreview.js b/src/components/EditorWidgets/DateTime/DateTimePreview.js similarity index 58% rename from src/components/Widgets/DateTimePreview.js rename to src/components/EditorWidgets/DateTime/DateTimePreview.js index c6cc8589..a6d89bdd 100644 --- a/src/components/Widgets/DateTimePreview.js +++ b/src/components/EditorWidgets/DateTime/DateTimePreview.js @@ -1,9 +1,8 @@ import PropTypes from 'prop-types'; import React from 'react'; -import previewStyle from './defaultPreviewStyle'; export default function DateTimePreview({ value }) { - return
{value ? value.toString() : null}
; + return
{value ? value.toString() : null}
; } DateTimePreview.propTypes = { diff --git a/src/components/EditorWidgets/DateTime/ReactDatetime.css b/src/components/EditorWidgets/DateTime/ReactDatetime.css new file mode 100644 index 00000000..4dc0b791 --- /dev/null +++ b/src/components/EditorWidgets/DateTime/ReactDatetime.css @@ -0,0 +1,210 @@ +.rdt { + position: relative; +} +.rdtPicker { + display: none; + position: absolute; + width: 250px; + padding: 4px; + margin-top: 1px; + z-index: 99999 !important; + background: #fff; + border: 2px solid var(--colorGray); + border-radius: 2px; + box-shadow: 0 2px 8px 0 rgba(0, 0, 0, .16); +} +.rdtOpen .rdtPicker { + display: block; +} +.rdtStatic .rdtPicker { + box-shadow: none; + position: static; +} + +.rdtPicker .rdtTimeToggle { + text-align: center; +} + +.rdtPicker table { + width: 100%; + margin: 0; +} +.rdtPicker td, +.rdtPicker th { + text-align: center; + height: 28px; +} +.rdtPicker td { + cursor: pointer; +} +.rdtPicker td.rdtDay:hover, +.rdtPicker td.rdtHour:hover, +.rdtPicker td.rdtMinute:hover, +.rdtPicker td.rdtSecond:hover, +.rdtPicker .rdtTimeToggle:hover { + background: #eeeeee; + cursor: pointer; +} +.rdtPicker td.rdtOld, +.rdtPicker td.rdtNew { + color: #999999; +} +.rdtPicker td.rdtToday { + position: relative; +} +.rdtPicker td.rdtToday:before { + content: ''; + display: inline-block; + border-left: 7px solid transparent; + border-bottom: 7px solid #428bca; + border-top-color: rgba(0, 0, 0, 0.2); + position: absolute; + bottom: 4px; + right: 4px; +} +.rdtPicker td.rdtActive, +.rdtPicker td.rdtActive:hover { + background-color: #428bca; + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.rdtPicker td.rdtActive.rdtToday:before { + border-bottom-color: #fff; +} +.rdtPicker td.rdtDisabled, +.rdtPicker td.rdtDisabled:hover { + background: none; + color: #999999; + cursor: not-allowed; +} + +.rdtPicker td span.rdtOld { + color: #999999; +} +.rdtPicker td span.rdtDisabled, +.rdtPicker td span.rdtDisabled:hover { + background: none; + color: #999999; + cursor: not-allowed; +} +.rdtPicker th { + border-bottom: 1px solid #f9f9f9; +} +.rdtPicker .dow { + width: 14.2857%; + border-bottom: none; +} +.rdtPicker th.rdtSwitch { + width: 100px; +} +.rdtPicker th.rdtNext, +.rdtPicker th.rdtPrev { + font-size: 21px; + vertical-align: top; +} + +.rdtPrev span, +.rdtNext span { + display: block; + -webkit-touch-callout: none; /* iOS Safari */ + -webkit-user-select: none; /* Chrome/Safari/Opera */ + -khtml-user-select: none; /* Konqueror */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* Internet Explorer/Edge */ + user-select: none; +} + +.rdtPicker th.rdtDisabled, +.rdtPicker th.rdtDisabled:hover { + background: none; + color: #999999; + cursor: not-allowed; +} +.rdtPicker thead tr:first-child th { + cursor: pointer; +} +.rdtPicker thead tr:first-child th:hover { + background: #eeeeee; +} + +.rdtPicker tfoot { + border-top: 1px solid #f9f9f9; +} + +.rdtPicker button { + border: none; + background: none; + cursor: pointer; +} +.rdtPicker button:hover { + background-color: #eee; +} + +.rdtPicker thead button { + width: 100%; + height: 100%; +} + +td.rdtMonth, +td.rdtYear { + height: 50px; + width: 25%; + cursor: pointer; +} +td.rdtMonth:hover, +td.rdtYear:hover { + background: #eee; +} + +.rdtCounters { + display: inline-block; +} + +.rdtCounters > div { + float: left; +} + +.rdtCounter { + height: 100px; +} + +.rdtCounter { + width: 40px; +} + +.rdtCounterSeparator { + line-height: 100px; +} + +.rdtCounter .rdtBtn { + height: 40%; + line-height: 40px; + cursor: pointer; + display: block; + + -webkit-touch-callout: none; /* iOS Safari */ + -webkit-user-select: none; /* Chrome/Safari/Opera */ + -khtml-user-select: none; /* Konqueror */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* Internet Explorer/Edge */ + user-select: none; +} +.rdtCounter .rdtBtn:hover { + background: #eee; +} +.rdtCounter .rdtCount { + height: 20%; + font-size: 1.2em; +} + +.rdtMilli { + vertical-align: middle; + padding-left: 8px; + width: 48px; +} + +.rdtMilli input { + width: 100%; + font-size: 1.2em; + margin-top: 37px; +} diff --git a/src/components/EditorWidgets/EditorWidgets.css b/src/components/EditorWidgets/EditorWidgets.css new file mode 100644 index 00000000..1c7eec76 --- /dev/null +++ b/src/components/EditorWidgets/EditorWidgets.css @@ -0,0 +1,17 @@ +@import "./Object/Object.css"; +@import "./List/List.css"; +@import "./withMedia/withMedia.css"; +@import "./Image/Image.css"; +@import "./File/FileControl.css"; +@import "./Markdown/Markdown.css"; +@import "./Boolean/Boolean.css"; +@import "./Relation/Relation.css"; +@import "./DateTime/DateTime.css"; + +:root { + --widgetNestDistance: 14px; +} + +.nc-widgetPreview { + margin: 15px 2px; +} diff --git a/src/components/EditorWidgets/File/FileControl.css b/src/components/EditorWidgets/File/FileControl.css new file mode 100644 index 00000000..bd521747 --- /dev/null +++ b/src/components/EditorWidgets/File/FileControl.css @@ -0,0 +1,7 @@ +.nc-fileControl-input { + display: none !important; +} + +.nc-fileControl-imageUpload { + cursor: pointer; +} diff --git a/src/components/EditorWidgets/File/FileControl.js b/src/components/EditorWidgets/File/FileControl.js new file mode 100644 index 00000000..db2fdeb0 --- /dev/null +++ b/src/components/EditorWidgets/File/FileControl.js @@ -0,0 +1,5 @@ +import withMediaControl from 'EditorWidgets/withMedia/withMediaControl'; + +const FileControl = withMediaControl(); + +export default FileControl; diff --git a/src/components/Widgets/FilePreview.js b/src/components/EditorWidgets/File/FilePreview.js similarity index 77% rename from src/components/Widgets/FilePreview.js rename to src/components/EditorWidgets/File/FilePreview.js index bea801d3..716bba42 100644 --- a/src/components/Widgets/FilePreview.js +++ b/src/components/EditorWidgets/File/FilePreview.js @@ -1,9 +1,8 @@ import PropTypes from 'prop-types'; import React from 'react'; -import previewStyle from './defaultPreviewStyle'; export default function FilePreview({ value, getAsset }) { - return (
+ return (
{ value ? { value } : null} diff --git a/src/components/EditorWidgets/Image/Image.css b/src/components/EditorWidgets/Image/Image.css new file mode 100644 index 00000000..e3351ec8 --- /dev/null +++ b/src/components/EditorWidgets/Image/Image.css @@ -0,0 +1,4 @@ +.nc-imagePreview-image { + max-width: 100%; + height: auto; +} diff --git a/src/components/EditorWidgets/Image/ImageControl.js b/src/components/EditorWidgets/Image/ImageControl.js new file mode 100644 index 00000000..801a59bc --- /dev/null +++ b/src/components/EditorWidgets/Image/ImageControl.js @@ -0,0 +1,5 @@ +import withMediaControl from 'EditorWidgets/withMedia/withMediaControl'; + +const ImageControl = withMediaControl(true); + +export default ImageControl; diff --git a/src/components/Widgets/ImagePreview.js b/src/components/EditorWidgets/Image/ImagePreview.js similarity index 70% rename from src/components/Widgets/ImagePreview.js rename to src/components/EditorWidgets/Image/ImagePreview.js index 55ffa1a4..b18c96d5 100644 --- a/src/components/Widgets/ImagePreview.js +++ b/src/components/EditorWidgets/Image/ImagePreview.js @@ -1,13 +1,12 @@ import PropTypes from 'prop-types'; import React from 'react'; -import previewStyle, { imagePreviewStyle } from './defaultPreviewStyle'; export default function ImagePreview({ value, getAsset }) { - return (
+ return (
{ value ? : null} diff --git a/src/components/EditorWidgets/List/List.css b/src/components/EditorWidgets/List/List.css new file mode 100644 index 00000000..441299cc --- /dev/null +++ b/src/components/EditorWidgets/List/List.css @@ -0,0 +1,83 @@ +.nc-listControl { + padding: 0 14px 14px; + + &.nc-listControl-collapsed { + padding-bottom: 0; + } +} + +.list-item-dragging { + opacity: 0.5; +} + +.nc-listControl-topBar { + display: flex; + justify-content: space-between; + align-items: center; + margin: 0 -14px; + background-color: var(--textFieldBorderColor); + padding: 13px; +} + +.nc-listControl-addButton { + display: flex; + justify-content: center; + align-items: center; + padding: 2px 12px; + font-size: 12px; + font-weight: bold; + border-radius: 3px; + + & .nc-icon { + padding-left: 6px; + } +} + +.nc-listControl-listCollapseToggle { + display: flex; + align-items: center; + font-size: 14px; + font-weight: 500; + cursor: pointer; + line-height: 1; + + & .nc-icon { + padding-right: 8px; + } +} + +.nc-listControl-item { + margin-top: 18px; + + &:first-of-type { + margin-top: 26px; + } +} + +.nc-listControl-itemTopBar { + background-color: var(--textFieldBorderColor); +} + +.nc-listControl-objectLabel { + display: none; + border-top: 0; + background-color: var(--textFieldBorderColor); + padding: 13px; + border-radius: 0 0 var(--borderRadius) var(--borderRadius); +} + +.nc-listControl-objectControl { + padding: 6px 14px 14px; + border-top: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.nc-listControl-collapsed { + & .nc-listControl-objectLabel { + display: block; + } + & .nc-listControl-objectControl { + display: none; + } +} diff --git a/src/components/Widgets/ListControl.js b/src/components/EditorWidgets/List/ListControl.js similarity index 57% rename from src/components/Widgets/ListControl.js rename to src/components/EditorWidgets/List/ListControl.js index 1050fff5..335ac808 100644 --- a/src/components/Widgets/ListControl.js +++ b/src/components/EditorWidgets/List/ListControl.js @@ -2,9 +2,11 @@ import PropTypes from 'prop-types'; import React, { Component } from 'react'; import { List, Map, fromJS } from 'immutable'; import ImmutablePropTypes from 'react-immutable-proptypes'; +import { partial } from 'lodash'; +import c from 'classnames'; import { SortableContainer, SortableElement, SortableHandle } from 'react-sortable-hoc'; -import FontIcon from 'react-toolbox/lib/font_icon'; -import ObjectControl from './ObjectControl'; +import { Icon, ListItemTopBar } from 'UI'; +import ObjectControl from 'EditorWidgets/Object/ObjectControl'; function ListItem(props) { return
{props.children}
; @@ -20,11 +22,22 @@ function valueToString(value) { } const SortableListItem = SortableElement(ListItem); -const DragHandle = SortableHandle( - () => + +const TopBar = ({ onAdd, listLabel, collapsed, onCollapseToggle, itemsCount }) => ( +
+
+ + {itemsCount} {listLabel} +
+ +
); -const SortableList = SortableContainer(({ items, renderItem }) => - (
{items.map(renderItem)}
)); + +const SortableList = SortableContainer(({ items, renderItem }) => { + return
{items.map(renderItem)}
; +}); const valueTypes = { SINGLE: 'SINGLE', @@ -34,6 +47,7 @@ const valueTypes = { export default class ListControl extends Component { static propTypes = { onChange: PropTypes.func.isRequired, + onChangeObject: PropTypes.func.isRequired, value: PropTypes.node, field: PropTypes.node, forID: PropTypes.string, @@ -41,12 +55,19 @@ export default class ListControl extends Component { getAsset: PropTypes.func.isRequired, onOpenMediaLibrary: PropTypes.func.isRequired, onAddAsset: PropTypes.func.isRequired, - onRemoveAsset: PropTypes.func.isRequired, + onRemoveInsertedMedia: PropTypes.func.isRequired, + classNameWrapper: PropTypes.string.isRequired, + setActiveStyle: PropTypes.func.isRequired, + setInactiveStyle: PropTypes.func.isRequired, }; constructor(props) { super(props); - this.state = { itemsCollapsed: List(), value: valueToString(props.value) }; + this.state = { + collapsed: false, + itemsCollapsed: List(), + value: valueToString(props.value), + }; this.valueType = null; } @@ -87,28 +108,42 @@ export default class ListControl extends Component { if (newValue.match(/,$/) && oldValue.match(/, $/)) { listValue.pop(); } - + const parsedValue = valueToString(listValue); this.setState({ value: parsedValue }); onChange(listValue.map(val => val.trim())); }; - handleCleanup = (e) => { + handleFocus = () => { + this.props.setActiveStyle(); + } + + handleBlur = (e) => { const listValue = e.target.value.split(',').map(el => el.trim()).filter(el => el); this.setState({ value: valueToString(listValue) }); + this.props.setInactiveStyle(); }; handleAdd = (e) => { e.preventDefault(); const { value, onChange } = this.props; const parsedValue = (this.valueType === valueTypes.SINGLE) ? null : Map(); + this.setState({ collapsed: false }); onChange((value || List()).push(parsedValue)); }; + /** + * In case the `onChangeObject` function is frozen by a child widget implementation, + * e.g. when debounced, always get the latest object value instead of using + * `this.props.value` directly. + */ + getObjectValue = idx => this.props.value.get(idx) || Map(); + handleChangeFor(index) { - return (newValue, newMetadata) => { + return (fieldName, newValue, newMetadata) => { const { value, metadata, onChange, forID } = this.props; - const parsedValue = (this.valueType === valueTypes.SINGLE) ? newValue.first() : newValue; + const newObjectValue = this.getObjectValue(index).set(fieldName, newValue); + const parsedValue = (this.valueType === valueTypes.SINGLE) ? newObjectValue.first() : newObjectValue; const parsedMetadata = { [forID]: Object.assign(metadata ? metadata.toJS() : {}, newMetadata ? newMetadata[forID] : {}), }; @@ -116,23 +151,23 @@ export default class ListControl extends Component { }; } - handleRemove(index) { - return (e) => { - e.preventDefault(); - const { value, metadata, onChange, forID } = this.props; - const parsedMetadata = metadata && { [forID]: metadata.removeIn(value.get(index).valueSeq()) }; - onChange(value.remove(index), parsedMetadata); - }; + handleRemove = (index, event) => { + event.preventDefault(); + const { value, metadata, onChange, forID } = this.props; + const parsedMetadata = metadata && { [forID]: metadata.removeIn(value.get(index).valueSeq()) }; + onChange(value.remove(index), parsedMetadata); } - handleToggle(index) { - return (e) => { - e.preventDefault(); - const { itemsCollapsed } = this.state; - this.setState({ - itemsCollapsed: itemsCollapsed.set(index, !itemsCollapsed.get(index, false)), - }); - }; + handleCollapseToggle = () => { + this.setState({ collapsed: !this.state.collapsed }); + } + + handleItemCollapseToggle = (index, event) => { + event.preventDefault(); + const { itemsCollapsed } = this.state; + this.setState({ + itemsCollapsed: itemsCollapsed.set(index, !itemsCollapsed.get(index, false)), + }); } objectLabel(item) { @@ -160,55 +195,75 @@ export default class ListControl extends Component { }; renderItem = (item, index) => { - const { field, getAsset, mediaPaths, onOpenMediaLibrary, onAddAsset, onRemoveAsset } = this.props; + const { + field, + getAsset, + mediaPaths, + onOpenMediaLibrary, + onAddAsset, + onRemoveInsertedMedia, + classNameWrapper, + } = this.props; const { itemsCollapsed } = this.state; const collapsed = itemsCollapsed.get(index); const classNames = ['nc-listControl-item', collapsed ? 'nc-listControl-collapsed' : '']; return ( - - - +
{this.objectLabel(item)}
); }; renderListControl() { - const { value, forID, field } = this.props; - const listLabel = field.get('label'); + const { value, forID, field, classNameWrapper } = this.props; + const { collapsed } = this.state; + const items = value || List(); + const className = c(classNameWrapper, 'nc-listControl', { + 'nc-listControl-collapsed' : collapsed, + }); - return (
- - -
); + return ( +
+ + { + collapsed ? null : + + } +
+ ); } render() { - const { field, forID } = this.props; + const { field, forID, classNameWrapper } = this.props; const { value } = this.state; if (field.get('field') || field.get('fields')) { @@ -220,7 +275,9 @@ export default class ListControl extends Component { id={forID} value={value} onChange={this.handleChange} - onBlur={this.handleCleanup} + onFocus={this.handleFocus} + onBlur={this.handleBlur} + className={classNameWrapper} />); } }; diff --git a/src/components/Widgets/ListPreview.js b/src/components/EditorWidgets/List/ListPreview.js similarity index 58% rename from src/components/Widgets/ListPreview.js rename to src/components/EditorWidgets/List/ListPreview.js index c2bc596c..82562100 100644 --- a/src/components/Widgets/ListPreview.js +++ b/src/components/EditorWidgets/List/ListPreview.js @@ -1,8 +1,6 @@ import PropTypes from 'prop-types'; import React, { Component } from 'react'; -import { resolveWidget } from '../Widgets'; -import previewStyle from './defaultPreviewStyle'; -import ObjectPreview from './ObjectPreview'; +import ObjectPreview from 'EditorWidgets/Object/ObjectPreview'; const ListPreview = ObjectPreview; diff --git a/src/components/EditorWidgets/Markdown/Markdown.css b/src/components/EditorWidgets/Markdown/Markdown.css new file mode 100644 index 00000000..6aef2344 --- /dev/null +++ b/src/components/EditorWidgets/Markdown/Markdown.css @@ -0,0 +1,4 @@ +@import "./MarkdownControl/RawEditor/index.css"; +@import "./MarkdownControl/Toolbar/Toolbar.css"; +@import "./MarkdownControl/Toolbar/ToolbarButton.css"; +@import "./MarkdownControl/VisualEditor/index.css"; diff --git a/src/components/Widgets/Markdown/MarkdownControl/RawEditor/index.css b/src/components/EditorWidgets/Markdown/MarkdownControl/RawEditor/index.css similarity index 65% rename from src/components/Widgets/Markdown/MarkdownControl/RawEditor/index.css rename to src/components/EditorWidgets/Markdown/MarkdownControl/RawEditor/index.css index 02877169..65f58565 100644 --- a/src/components/Widgets/Markdown/MarkdownControl/RawEditor/index.css +++ b/src/components/EditorWidgets/Markdown/MarkdownControl/RawEditor/index.css @@ -3,10 +3,13 @@ } .nc-rawEditor-rawEditor { - @apply(--input); position: relative; overflow: hidden; overflow-x: auto; min-height: var(--richTextEditorMinHeight); font-family: var(--fontFamilyMono); + border-top-left-radius: 0; + border-top-right-radius: 0; + border-top: 0; + margin-top: -var(--stickyDistanceBottom); } diff --git a/src/components/Widgets/Markdown/MarkdownControl/RawEditor/index.js b/src/components/EditorWidgets/Markdown/MarkdownControl/RawEditor/index.js similarity index 79% rename from src/components/Widgets/Markdown/MarkdownControl/RawEditor/index.js rename to src/components/EditorWidgets/Markdown/MarkdownControl/RawEditor/index.js index c0494f22..cd15da30 100644 --- a/src/components/Widgets/Markdown/MarkdownControl/RawEditor/index.js +++ b/src/components/EditorWidgets/Markdown/MarkdownControl/RawEditor/index.js @@ -3,8 +3,7 @@ import React from 'react'; import { Editor as Slate } from 'slate-react'; import Plain from 'slate-plain-serializer'; import { debounce } from 'lodash'; -import Toolbar from '../Toolbar/Toolbar'; -import { Sticky } from '../../../../UI/Sticky/Sticky'; +import Toolbar from 'EditorWidgets/Markdown/MarkdownControl/Toolbar/Toolbar'; export default class RawEditor extends React.Component { constructor(props) { @@ -51,17 +50,20 @@ export default class RawEditor extends React.Component { }; render() { + const { className } = this.props; + return (
- - - +
+ +
+
+ + + + + + + + + + +
+ + } + > + {plugins && plugins.toList().map(plugin => ( + onSubmit(plugin.get('id'))} /> + ))} + +
+
+
+ + {toggleOffLabel} + + + + {toggleOnLabel} + +
+
+ ); + } +} diff --git a/src/components/EditorWidgets/Markdown/MarkdownControl/Toolbar/ToolbarButton.css b/src/components/EditorWidgets/Markdown/MarkdownControl/Toolbar/ToolbarButton.css new file mode 100644 index 00000000..89b49470 --- /dev/null +++ b/src/components/EditorWidgets/Markdown/MarkdownControl/Toolbar/ToolbarButton.css @@ -0,0 +1,22 @@ +.nc-toolbarButton-button { + display: inline-block; + padding: 6px; + border: none; + background-color: transparent; + font-size: 16px; + color: inherit; + cursor: pointer; + + &:disabled { + cursor: auto; + opacity: 0.5; + } + + & .nc-icon { + display: block; + } +} + +.nc-toolbarButton-active { + color: #1e2532; +} diff --git a/src/components/EditorWidgets/Markdown/MarkdownControl/Toolbar/ToolbarButton.js b/src/components/EditorWidgets/Markdown/MarkdownControl/Toolbar/ToolbarButton.js new file mode 100644 index 00000000..026e6750 --- /dev/null +++ b/src/components/EditorWidgets/Markdown/MarkdownControl/Toolbar/ToolbarButton.js @@ -0,0 +1,30 @@ +import PropTypes from 'prop-types'; +import React from 'react'; +import c from 'classnames'; +import { Icon } from 'UI'; + +const ToolbarButton = ({ type, label, icon, onClick, isActive, disabled }) => { + const active = isActive && type && isActive(type); + + return ( + + ); +}; + +ToolbarButton.propTypes = { + type: PropTypes.string, + label: PropTypes.string.isRequired, + icon: PropTypes.string, + onClick: PropTypes.func.isRequired, + isActive: PropTypes.func, + disabled: PropTypes.bool, +}; + +export default ToolbarButton; diff --git a/src/components/EditorWidgets/Markdown/MarkdownControl/VisualEditor/Shortcode.css b/src/components/EditorWidgets/Markdown/MarkdownControl/VisualEditor/Shortcode.css new file mode 100644 index 00000000..fb3b9a30 --- /dev/null +++ b/src/components/EditorWidgets/Markdown/MarkdownControl/VisualEditor/Shortcode.css @@ -0,0 +1,22 @@ +.nc-visualEditor-shortcode { + border-radius: var(--borderRadius); + border: 2px solid var(--textFieldBorderColor); + margin: 12px 0; + padding: 14px; +} + +.nc-visualEditor-shortcode-topBar { + background-color: var(--textFieldBorderColor); + margin: -var(--widgetNestDistance) -var(--widgetNestDistance) 0; + border-radius: 0; +} + +.nc-visualEditor-shortcode-collapsed { + background-color: var(--textFieldBorderColor); + cursor: pointer; +} + +.nc-visualEditor-shortcode-collapsedTitle { + padding: 8px; + color: var(--controlLabelColor); +} diff --git a/src/components/EditorWidgets/Markdown/MarkdownControl/VisualEditor/Shortcode.js b/src/components/EditorWidgets/Markdown/MarkdownControl/VisualEditor/Shortcode.js new file mode 100644 index 00000000..346ea3e2 --- /dev/null +++ b/src/components/EditorWidgets/Markdown/MarkdownControl/VisualEditor/Shortcode.js @@ -0,0 +1,136 @@ +import React from 'react'; +import c from 'classnames'; +import { Map } from 'immutable'; +import { connect } from 'react-redux'; +import { partial, capitalize } from 'lodash'; +import { resolveWidget, getEditorComponents } from 'Lib/registry'; +import { openMediaLibrary, removeInsertedMedia } from 'Actions/mediaLibrary'; +import { addAsset } from 'Actions/media'; +import { getAsset } from 'Reducers'; +import { ListItemTopBar } from 'UI'; +import { getEditorControl } from '../index'; + +class Shortcode extends React.Component { + constructor(props) { + super(props); + this.state = { + /** + * The `shortcodeNew` prop is set to `true` when creating a new Shortcode, + * so that the form is immediately open for editing. Otherwise all + * shortcodes are collapsed by default. + */ + collapsed: !props.node.data.get('shortcodeNew'), + }; + } + + handleChange = (fieldName, value) => { + const { editor, node } = this.props; + const shortcodeData = Map(node.data.get('shortcodeData')).set(fieldName, value); + const data = node.data.set('shortcodeData', shortcodeData); + editor.change(c => c.setNodeByKey(node.key, { data })); + }; + + handleCollapseToggle = () => { + this.setState({ collapsed: !this.state.collapsed }); + } + + handleRemove = () => { + const { editor, node } = this.props; + editor.change(change => { + change + .removeNodeByKey(node.key) + .focus(); + }); + } + + handleClick = event => { + /** + * Stop click from propagating to editor, otherwise focus will be passed + * to the editor. + */ + event.stopPropagation(); + + /** + * If collapsed, any click should open the form. + */ + if (this.state.collapsed) { + this.handleCollapseToggle(); + } + } + + renderControl = (shortcodeData, field, index) => { + const { + onAddAsset, + boundGetAsset, + mediaPaths, + onOpenMediaLibrary, + onRemoveInsertedMedia, + } = this.props; + const value = shortcodeData.get(field.get('name')); + const key = `field-${ field.get('name') }`; + const Control = getEditorControl(); + const controlProps = { + field, + value, + onAddAsset, + getAsset: boundGetAsset, + onChange: this.handleChange, + mediaPaths, + onOpenMediaLibrary, + onRemoveInsertedMedia, + }; + + return ( +
+ +
+ ); + }; + + render() { + const { attributes, node, editor } = this.props; + const { collapsed } = this.state; + const pluginId = node.data.get('shortcode'); + const shortcodeData = Map(this.props.node.data.get('shortcodeData')); + const plugin = getEditorComponents().get(pluginId); + const className = c( + 'nc-objectControl-root', + 'nc-visualEditor-shortcode', + { 'nc-visualEditor-shortcode-collapsed': collapsed }, + ); + return ( +
+ + { + collapsed + ?
{capitalize(pluginId)}
+ : plugin.get('fields').map(partial(this.renderControl, shortcodeData)) + } +
+ ); + } +} + +const mapStateToProps = (state, ownProps) => { + const { attributes, node, editor } = ownProps; + return { + mediaPaths: state.mediaLibrary.get('controlMedia'), + boundGetAsset: getAsset.bind(null, state), + attributes, + node, + editor, + }; +}; + +const mapDispatchToProps = { + onAddAsset: addAsset, + onOpenMediaLibrary: openMediaLibrary, + onRemoveInsertedMedia: removeInsertedMedia, +}; + +export default connect(mapStateToProps, mapDispatchToProps)(Shortcode); diff --git a/src/components/Widgets/Markdown/MarkdownControl/VisualEditor/__tests__/__snapshots__/parser.spec.js.snap b/src/components/EditorWidgets/Markdown/MarkdownControl/VisualEditor/__tests__/__snapshots__/parser.spec.js.snap similarity index 100% rename from src/components/Widgets/Markdown/MarkdownControl/VisualEditor/__tests__/__snapshots__/parser.spec.js.snap rename to src/components/EditorWidgets/Markdown/MarkdownControl/VisualEditor/__tests__/__snapshots__/parser.spec.js.snap diff --git a/src/components/Widgets/Markdown/MarkdownControl/VisualEditor/__tests__/parser.spec.js b/src/components/EditorWidgets/Markdown/MarkdownControl/VisualEditor/__tests__/parser.spec.js similarity index 98% rename from src/components/Widgets/Markdown/MarkdownControl/VisualEditor/__tests__/parser.spec.js rename to src/components/EditorWidgets/Markdown/MarkdownControl/VisualEditor/__tests__/parser.spec.js index f549b366..c77d2a00 100644 --- a/src/components/Widgets/Markdown/MarkdownControl/VisualEditor/__tests__/parser.spec.js +++ b/src/components/EditorWidgets/Markdown/MarkdownControl/VisualEditor/__tests__/parser.spec.js @@ -1,5 +1,5 @@ import { fromJS } from 'immutable'; -import { markdownToSlate } from '../../../serializers'; +import { markdownToSlate } from 'EditorWidgets/Markdown/serializers'; const parser = markdownToSlate; diff --git a/src/components/Widgets/Markdown/MarkdownControl/VisualEditor/index.css b/src/components/EditorWidgets/Markdown/MarkdownControl/VisualEditor/index.css similarity index 79% rename from src/components/Widgets/Markdown/MarkdownControl/VisualEditor/index.css rename to src/components/EditorWidgets/Markdown/MarkdownControl/VisualEditor/index.css index 384334ab..e7e1aaa3 100644 --- a/src/components/Widgets/Markdown/MarkdownControl/VisualEditor/index.css +++ b/src/components/EditorWidgets/Markdown/MarkdownControl/VisualEditor/index.css @@ -1,12 +1,14 @@ -.nc-visualEditor-editorControlBar { - z-index: 1; - border: 2px solid transparent; - border-top: 0; - background-color: var(--controlBGColor); +@import './Shortcode.css'; + +:root { + --stickyDistanceBottom: 100px; } -.nc-visualEditor-editorControlBarSticky { - border-color: var(--textFieldBorderColor); +.nc-visualEditor-editorControlBar { + z-index: 1; + position: sticky; + top: 0; + margin-bottom: var(--stickyDistanceBottom); } .nc-visualEditor-wrapper { @@ -14,12 +16,15 @@ } .nc-visualEditor-editor { - @apply(--input); position: relative; overflow: hidden; overflow-x: auto; min-height: var(--richTextEditorMinHeight); font-family: var(--fontFamilyPrimary); + border-top-left-radius: 0; + border-top-right-radius: 0; + border-top: 0; + margin-top: -var(--stickyDistanceBottom); } .nc-visualEditor-editor h1 { @@ -100,7 +105,7 @@ } .nc-visualEditor-editor code { - background-color: var(--backgroundColorShaded); + background-color: var(--colorBackground); border-radius: var(--borderRadius); padding: 0 2px; font-size: 85%; @@ -108,7 +113,7 @@ .nc-visualEditor-editor blockquote { padding-left: 16px; - border-left: 3px solid var(--backgroundColorShaded); + border-left: 3px solid var(--colorBackground); margin-left: 0; margin-right: 0; } @@ -123,15 +128,3 @@ padding: 8px; text-align: left; } - -.nc-visualEditor-shortcode { - border: 2px solid black; - padding: 8px; - margin: 2px 0; - cursor: pointer; -} - -.nc-visualEditor-shortcodeSelected { - border-color: var(--primaryColor); - color: var(--primaryColor); -} diff --git a/src/components/Widgets/Markdown/MarkdownControl/VisualEditor/index.js b/src/components/EditorWidgets/Markdown/MarkdownControl/VisualEditor/index.js similarity index 61% rename from src/components/Widgets/Markdown/MarkdownControl/VisualEditor/index.js rename to src/components/EditorWidgets/Markdown/MarkdownControl/VisualEditor/index.js index 253c4a17..ff475f78 100644 --- a/src/components/Widgets/Markdown/MarkdownControl/VisualEditor/index.js +++ b/src/components/EditorWidgets/Markdown/MarkdownControl/VisualEditor/index.js @@ -1,35 +1,60 @@ import PropTypes from 'prop-types'; import React, { Component } from 'react'; import { get, isEmpty, debounce } from 'lodash'; +import { Map } from 'immutable'; import { Value, Document, Block, Text } from 'slate'; import { Editor as Slate } from 'slate-react'; -import { slateToMarkdown, markdownToSlate, htmlToSlate } from '../../serializers'; -import registry from '../../../../../lib/registry'; -import Toolbar from '../Toolbar/Toolbar'; -import { Sticky } from '../../../../UI/Sticky/Sticky'; +import { slateToMarkdown, markdownToSlate, htmlToSlate } from 'EditorWidgets/Markdown/serializers'; +import { getEditorComponents } from 'Lib/registry'; +import Toolbar from 'EditorWidgets/Markdown/MarkdownControl/Toolbar/Toolbar'; import { renderNode, renderMark } from './renderers'; import { validateNode } from './validators'; import plugins, { EditListConfigured } from './plugins'; import onKeyDown from './keys'; +const createEmptyRawDoc = () => { + const emptyText = Text.create(''); + const emptyBlock = Block.create({ kind: 'block', type: 'paragraph', nodes: [ emptyText ] }); + return { nodes: [emptyBlock] }; +}; + +const createSlateValue = (rawValue) => { + const rawDoc = rawValue && markdownToSlate(rawValue); + const rawDocHasNodes = !isEmpty(get(rawDoc, 'nodes')) + const document = Document.fromJSON(rawDocHasNodes ? rawDoc : createEmptyRawDoc()); + return Value.create({ document }); +} + export default class Editor extends Component { + static propTypes = { + onAddAsset: PropTypes.func.isRequired, + getAsset: PropTypes.func.isRequired, + onChange: PropTypes.func.isRequired, + onMode: PropTypes.func.isRequired, + className: PropTypes.string.isRequired, + value: PropTypes.string, + }; + constructor(props) { super(props); - const emptyText = Text.create(''); - const emptyBlock = Block.create({ kind: 'block', type: 'paragraph', nodes: [ emptyText ] }); - const emptyRawDoc = { nodes: [emptyBlock] }; - const rawDoc = this.props.value && markdownToSlate(this.props.value); - const rawDocHasNodes = !isEmpty(get(rawDoc, 'nodes')) - const document = Document.fromJSON(rawDocHasNodes ? rawDoc : emptyRawDoc); - const value = Value.create({ document }); this.state = { - value, - shortcodePlugins: registry.getEditorComponents(), + value: createSlateValue(props.value), + shortcodePlugins: getEditorComponents(), }; } shouldComponentUpdate(nextProps, nextState) { - return !this.state.value.equals(nextState.value); + return (this.props.value !== null && nextProps.value === null) + || (this.props.value === null && nextProps.value !== null) + || !this.state.value.equals(nextState.value); + } + + componentWillUpdate(nextProps) { + const shouldResetState = (this.props.value !== null && nextProps.value === null) + || (this.props.value === null && nextProps.value !== null) + if (shouldResetState) { + this.setState({ value: createSlateValue(nextProps.value) }); + } } handlePaste = (e, data, change) => { @@ -41,8 +66,8 @@ export default class Editor extends Component { return change.insertFragment(doc); } - hasMark = type => this.state.value.activeMarks.some(mark => mark.type === type); - hasBlock = type => this.state.value.blocks.some(node => node.type === type); + selectionHasMark = type => this.state.value.activeMarks.some(mark => mark.type === type); + selectionHasBlock = type => this.state.value.blocks.some(node => node.type === type); handleMarkClick = (event, type) => { event.preventDefault(); @@ -60,7 +85,7 @@ export default class Editor extends Component { // Handle everything except list buttons. if (!['bulleted-list', 'numbered-list'].includes(type)) { - const isActive = this.hasBlock(type); + const isActive = this.selectionHasBlock(type); change = change.setBlock(isActive ? 'paragraph' : type); } @@ -121,14 +146,20 @@ export default class Editor extends Component { this.setState({ value: change.value }); }; - handlePluginSubmit = (plugin, shortcodeData) => { + handlePluginAdd = pluginId => { const { value } = this.state; - const data = { - shortcode: plugin.id, - shortcodeData, - }; const nodes = [Text.create('')]; - const block = { kind: 'block', type: 'shortcode', data, isVoid: true, nodes }; + const block = { + kind: 'block', + type: 'shortcode', + data: { + shortcode: pluginId, + shortcodeNew: true, + shortcodeData: Map(), + }, + isVoid: true, + nodes + }; let change = value.change(); const { focusBlock } = change.value; @@ -148,12 +179,6 @@ export default class Editor extends Component { this.props.onMode('raw'); }; - getButtonProps = (type, opts = {}) => { - const { isBlock } = opts; - const handler = opts.handler || (isBlock ? this.handleBlockClick: this.handleMarkClick); - const isActive = opts.isActive || (isBlock ? this.hasBlock : this.hasMark); - return { onAction: e => handler(e, type), active: isActive(type) }; - }; handleDocumentChange = debounce(change => { const raw = change.value.document.toJSON(); @@ -169,39 +194,32 @@ export default class Editor extends Component { this.setState({ value: change.value }); }; + processRef = ref => { + this.ref = ref; + } + render() { - const { onAddAsset, onRemoveAsset, getAsset } = this.props; + const { onAddAsset, getAsset, className } = this.props; return (
- +
- +
this.ref = ref} + ref={this.processRef} spellCheck />
); } } - -Editor.propTypes = { - onAddAsset: PropTypes.func.isRequired, - onRemoveAsset: PropTypes.func.isRequired, - getAsset: PropTypes.func.isRequired, - onChange: PropTypes.func.isRequired, - onMode: PropTypes.func.isRequired, - value: PropTypes.string, -}; diff --git a/src/components/Widgets/Markdown/MarkdownControl/VisualEditor/keys.js b/src/components/EditorWidgets/Markdown/MarkdownControl/VisualEditor/keys.js similarity index 100% rename from src/components/Widgets/Markdown/MarkdownControl/VisualEditor/keys.js rename to src/components/EditorWidgets/Markdown/MarkdownControl/VisualEditor/keys.js diff --git a/src/components/Widgets/Markdown/MarkdownControl/VisualEditor/plugins.js b/src/components/EditorWidgets/Markdown/MarkdownControl/VisualEditor/plugins.js similarity index 100% rename from src/components/Widgets/Markdown/MarkdownControl/VisualEditor/plugins.js rename to src/components/EditorWidgets/Markdown/MarkdownControl/VisualEditor/plugins.js diff --git a/src/components/Widgets/Markdown/MarkdownControl/VisualEditor/renderers.js b/src/components/EditorWidgets/Markdown/MarkdownControl/VisualEditor/renderers.js similarity index 92% rename from src/components/Widgets/Markdown/MarkdownControl/VisualEditor/renderers.js rename to src/components/EditorWidgets/Markdown/MarkdownControl/VisualEditor/renderers.js index b1788463..c24acbc5 100644 --- a/src/components/Widgets/Markdown/MarkdownControl/VisualEditor/renderers.js +++ b/src/components/EditorWidgets/Markdown/MarkdownControl/VisualEditor/renderers.js @@ -1,6 +1,7 @@ import React from 'react'; import { List } from 'immutable'; import cn from 'classnames'; +import Shortcode from './Shortcode'; /** * Slate uses React components to render each type of node that it receives. @@ -60,12 +61,6 @@ const Image = props => { }, image); return result; }; -const Shortcode = props => { - const { attributes, node, editor } = props; - const isSelected = editor.value.selection.hasFocusIn(node); - const className = cn('nc-visualEditor-shortcode', { ['nc-visualEditor-shortcodeSelected']: isSelected }); - return
{node.data.get('shortcode')}
; -}; export const renderMark = props => { switch (props.mark.type) { diff --git a/src/components/Widgets/Markdown/MarkdownControl/VisualEditor/validators.js b/src/components/EditorWidgets/Markdown/MarkdownControl/VisualEditor/validators.js similarity index 100% rename from src/components/Widgets/Markdown/MarkdownControl/VisualEditor/validators.js rename to src/components/EditorWidgets/Markdown/MarkdownControl/VisualEditor/validators.js diff --git a/src/components/Widgets/Markdown/MarkdownControl/index.js b/src/components/EditorWidgets/Markdown/MarkdownControl/index.js similarity index 61% rename from src/components/Widgets/Markdown/MarkdownControl/index.js rename to src/components/EditorWidgets/Markdown/MarkdownControl/index.js index 78de7ef2..367858a8 100644 --- a/src/components/Widgets/Markdown/MarkdownControl/index.js +++ b/src/components/EditorWidgets/Markdown/MarkdownControl/index.js @@ -1,24 +1,29 @@ import PropTypes from 'prop-types'; import React from 'react'; -import registry from '../../../../lib/registry'; -import { markdownToRemark, remarkToMarkdown } from '../serializers' +import c from 'classnames'; +import { markdownToRemark, remarkToMarkdown } from 'EditorWidgets/Markdown/serializers' import RawEditor from './RawEditor'; import VisualEditor from './VisualEditor'; -import { StickyContainer } from '../../../UI/Sticky/Sticky'; const MODE_STORAGE_KEY = 'cms.md-mode'; +let editorControl; + +export const getEditorControl = () => editorControl; + export default class MarkdownControl extends React.Component { static propTypes = { onChange: PropTypes.func.isRequired, onAddAsset: PropTypes.func.isRequired, - onRemoveAsset: PropTypes.func.isRequired, getAsset: PropTypes.func.isRequired, + classNameWrapper: PropTypes.string.isRequired, + editorControl: PropTypes.node.isRequired, value: PropTypes.string, }; constructor(props) { super(props); + editorControl = props.editorControl; this.state = { mode: localStorage.getItem(MODE_STORAGE_KEY) || 'visual' }; } @@ -27,33 +32,42 @@ export default class MarkdownControl extends React.Component { localStorage.setItem(MODE_STORAGE_KEY, mode); }; + processRef = ref => this.ref = ref; + render() { - const { onChange, onAddAsset, onRemoveAsset, getAsset, value } = this.props; + const { + onChange, + onAddAsset, + getAsset, + value, + classNameWrapper, + } = this.props; + const { mode } = this.state; const visualEditor = ( -
+
); const rawEditor = ( -
+
); - return { mode === 'visual' ? visualEditor : rawEditor }; + return mode === 'visual' ? visualEditor : rawEditor; } } diff --git a/src/components/Widgets/Markdown/MarkdownControl/plugins.js b/src/components/EditorWidgets/Markdown/MarkdownControl/plugins.js similarity index 78% rename from src/components/Widgets/Markdown/MarkdownControl/plugins.js rename to src/components/EditorWidgets/Markdown/MarkdownControl/plugins.js index dc39d20c..5a403ae7 100644 --- a/src/components/Widgets/Markdown/MarkdownControl/plugins.js +++ b/src/components/EditorWidgets/Markdown/MarkdownControl/plugins.js @@ -1,7 +1,7 @@ import PropTypes from 'prop-types'; import { Component, Children } from 'react'; import { List, Record, fromJS } from 'immutable'; -import _ from 'lodash'; +import { isFunction } from 'lodash'; const plugins = { editor: List() }; @@ -43,9 +43,9 @@ export function newEditorPlugin(config) { icon: config.icon, fields: fromJS(config.fields), pattern: config.pattern, - fromBlock: _.isFunction(config.fromBlock) ? config.fromBlock.bind(null) : null, - toBlock: _.isFunction(config.toBlock) ? config.toBlock.bind(null) : null, - toPreview: _.isFunction(config.toPreview) ? config.toPreview.bind(null) : config.toBlock.bind(null), + fromBlock: isFunction(config.fromBlock) ? config.fromBlock.bind(null) : null, + toBlock: isFunction(config.toBlock) ? config.toBlock.bind(null) : null, + toPreview: isFunction(config.toPreview) ? config.toPreview.bind(null) : config.toBlock.bind(null), }); diff --git a/src/components/Widgets/Markdown/MarkdownPreview/__tests__/__snapshots__/renderer.spec.js.snap b/src/components/EditorWidgets/Markdown/MarkdownPreview/__tests__/__snapshots__/renderer.spec.js.snap similarity index 100% rename from src/components/Widgets/Markdown/MarkdownPreview/__tests__/__snapshots__/renderer.spec.js.snap rename to src/components/EditorWidgets/Markdown/MarkdownPreview/__tests__/__snapshots__/renderer.spec.js.snap diff --git a/src/components/Widgets/Markdown/MarkdownPreview/__tests__/renderer.spec.js b/src/components/EditorWidgets/Markdown/MarkdownPreview/__tests__/renderer.spec.js similarity index 98% rename from src/components/Widgets/Markdown/MarkdownPreview/__tests__/renderer.spec.js rename to src/components/EditorWidgets/Markdown/MarkdownPreview/__tests__/renderer.spec.js index b4d7c0bf..dcb8ef85 100644 --- a/src/components/Widgets/Markdown/MarkdownPreview/__tests__/renderer.spec.js +++ b/src/components/EditorWidgets/Markdown/MarkdownPreview/__tests__/renderer.spec.js @@ -4,7 +4,7 @@ import React from 'react'; import { shallow } from 'enzyme'; import { padStart } from 'lodash'; import MarkdownPreview from '../index'; -import { markdownToHtml } from '../../serializers'; +import { markdownToHtml } from 'EditorWidgets/Markdown/serializers'; const parser = markdownToHtml; diff --git a/src/components/Widgets/Markdown/MarkdownPreview/index.js b/src/components/EditorWidgets/Markdown/MarkdownPreview/index.js similarity index 64% rename from src/components/Widgets/Markdown/MarkdownPreview/index.js rename to src/components/EditorWidgets/Markdown/MarkdownPreview/index.js index cfa5b04b..14f9dc1c 100644 --- a/src/components/Widgets/Markdown/MarkdownPreview/index.js +++ b/src/components/EditorWidgets/Markdown/MarkdownPreview/index.js @@ -1,14 +1,13 @@ import PropTypes from 'prop-types'; import React from 'react'; -import { markdownToHtml } from '../serializers'; -import previewStyle from '../../defaultPreviewStyle'; +import { markdownToHtml } from 'EditorWidgets/Markdown/serializers'; const MarkdownPreview = ({ value, getAsset }) => { if (value === null) { return null; } const html = markdownToHtml(value, getAsset); - return
; + return
; }; MarkdownPreview.propTypes = { diff --git a/src/components/Widgets/Markdown/serializers/__tests__/remarkAllowHtmlEntities.spec.js b/src/components/EditorWidgets/Markdown/serializers/__tests__/remarkAllowHtmlEntities.spec.js similarity index 100% rename from src/components/Widgets/Markdown/serializers/__tests__/remarkAllowHtmlEntities.spec.js rename to src/components/EditorWidgets/Markdown/serializers/__tests__/remarkAllowHtmlEntities.spec.js diff --git a/src/components/Widgets/Markdown/serializers/__tests__/remarkAssertParents.spec.js b/src/components/EditorWidgets/Markdown/serializers/__tests__/remarkAssertParents.spec.js similarity index 100% rename from src/components/Widgets/Markdown/serializers/__tests__/remarkAssertParents.spec.js rename to src/components/EditorWidgets/Markdown/serializers/__tests__/remarkAssertParents.spec.js diff --git a/src/components/Widgets/Markdown/serializers/__tests__/remarkEscapeMarkdownEntities.spec.js b/src/components/EditorWidgets/Markdown/serializers/__tests__/remarkEscapeMarkdownEntities.spec.js similarity index 100% rename from src/components/Widgets/Markdown/serializers/__tests__/remarkEscapeMarkdownEntities.spec.js rename to src/components/EditorWidgets/Markdown/serializers/__tests__/remarkEscapeMarkdownEntities.spec.js diff --git a/src/components/Widgets/Markdown/serializers/__tests__/remarkPaddedLinks.spec.js b/src/components/EditorWidgets/Markdown/serializers/__tests__/remarkPaddedLinks.spec.js similarity index 100% rename from src/components/Widgets/Markdown/serializers/__tests__/remarkPaddedLinks.spec.js rename to src/components/EditorWidgets/Markdown/serializers/__tests__/remarkPaddedLinks.spec.js diff --git a/src/components/Widgets/Markdown/serializers/__tests__/remarkStripTrailingBreaks.spec.js b/src/components/EditorWidgets/Markdown/serializers/__tests__/remarkStripTrailingBreaks.spec.js similarity index 100% rename from src/components/Widgets/Markdown/serializers/__tests__/remarkStripTrailingBreaks.spec.js rename to src/components/EditorWidgets/Markdown/serializers/__tests__/remarkStripTrailingBreaks.spec.js diff --git a/src/components/Widgets/Markdown/serializers/__tests__/slate.spec.js b/src/components/EditorWidgets/Markdown/serializers/__tests__/slate.spec.js similarity index 100% rename from src/components/Widgets/Markdown/serializers/__tests__/slate.spec.js rename to src/components/EditorWidgets/Markdown/serializers/__tests__/slate.spec.js diff --git a/src/components/Widgets/Markdown/serializers/index.js b/src/components/EditorWidgets/Markdown/serializers/index.js similarity index 94% rename from src/components/Widgets/Markdown/serializers/index.js rename to src/components/EditorWidgets/Markdown/serializers/index.js index bc36b11a..728d567f 100644 --- a/src/components/Widgets/Markdown/serializers/index.js +++ b/src/components/EditorWidgets/Markdown/serializers/index.js @@ -7,6 +7,7 @@ import remarkToRehype from 'remark-rehype'; import rehypeToHtml from 'rehype-stringify'; import htmlToRehype from 'rehype-parse'; import rehypeToRemark from 'rehype-remark'; +import { getEditorComponents } from 'Lib/registry'; import remarkToRehypeShortcodes from './remarkRehypeShortcodes'; import rehypePaperEmoji from './rehypePaperEmoji'; import remarkAssertParents from './remarkAssertParents'; @@ -20,7 +21,6 @@ import remarkEscapeMarkdownEntities from './remarkEscapeMarkdownEntities'; import remarkStripTrailingBreaks from './remarkStripTrailingBreaks'; import remarkAllowHtmlEntities from './remarkAllowHtmlEntities'; import slateToRemark from './slateRemark'; -import registry from '../../../../lib/registry'; /** * This module contains all serializers for the Markdown widget. @@ -76,7 +76,7 @@ export const markdownToRemark = markdown => { const result = unified() .use(remarkSquashReferences) .use(remarkImagesToText) - .use(remarkShortcodes, { plugins: registry.getEditorComponents() }) + .use(remarkShortcodes, { plugins: getEditorComponents() }) .runSync(parsed); return result; @@ -154,7 +154,7 @@ export const markdownToHtml = (markdown, getAsset) => { const mdast = markdownToRemark(markdown); const hast = unified() - .use(remarkToRehypeShortcodes, { plugins: registry.getEditorComponents(), getAsset }) + .use(remarkToRehypeShortcodes, { plugins: getEditorComponents(), getAsset }) .use(remarkToRehype, { allowDangerousHTML: true }) .runSync(mdast); @@ -184,7 +184,7 @@ export const htmlToSlate = html => { .use(remarkAssertParents) .use(remarkPaddedLinks) .use(remarkImagesToText) - .use(remarkShortcodes, { plugins: registry.getEditorComponents() }) + .use(remarkShortcodes, { plugins: getEditorComponents() }) .use(remarkWrapHtml) .use(remarkToSlate) .runSync(mdast); @@ -218,7 +218,7 @@ export const markdownToSlate = markdown => { * trees. */ export const slateToMarkdown = raw => { - const mdast = slateToRemark(raw, { shortcodePlugins: registry.getEditorComponents() }); + const mdast = slateToRemark(raw, { shortcodePlugins: getEditorComponents() }); const markdown = remarkToMarkdown(mdast); return markdown; }; diff --git a/src/components/Widgets/Markdown/serializers/rehypePaperEmoji.js b/src/components/EditorWidgets/Markdown/serializers/rehypePaperEmoji.js similarity index 100% rename from src/components/Widgets/Markdown/serializers/rehypePaperEmoji.js rename to src/components/EditorWidgets/Markdown/serializers/rehypePaperEmoji.js diff --git a/src/components/Widgets/Markdown/serializers/remarkAllowHtmlEntities.js b/src/components/EditorWidgets/Markdown/serializers/remarkAllowHtmlEntities.js similarity index 100% rename from src/components/Widgets/Markdown/serializers/remarkAllowHtmlEntities.js rename to src/components/EditorWidgets/Markdown/serializers/remarkAllowHtmlEntities.js diff --git a/src/components/Widgets/Markdown/serializers/remarkAssertParents.js b/src/components/EditorWidgets/Markdown/serializers/remarkAssertParents.js similarity index 100% rename from src/components/Widgets/Markdown/serializers/remarkAssertParents.js rename to src/components/EditorWidgets/Markdown/serializers/remarkAssertParents.js diff --git a/src/components/Widgets/Markdown/serializers/remarkEscapeMarkdownEntities.js b/src/components/EditorWidgets/Markdown/serializers/remarkEscapeMarkdownEntities.js similarity index 99% rename from src/components/Widgets/Markdown/serializers/remarkEscapeMarkdownEntities.js rename to src/components/EditorWidgets/Markdown/serializers/remarkEscapeMarkdownEntities.js index 344f0f60..6a40c617 100644 --- a/src/components/Widgets/Markdown/serializers/remarkEscapeMarkdownEntities.js +++ b/src/components/EditorWidgets/Markdown/serializers/remarkEscapeMarkdownEntities.js @@ -1,5 +1,5 @@ import { has, flow, partial, flatMap, flatten, map } from 'lodash'; -import { joinPatternSegments, combinePatterns, replaceWhen } from '../../../../lib/regexHelper'; +import { joinPatternSegments, combinePatterns, replaceWhen } from 'Lib/regexHelper'; /** * Reusable regular expressions segments. diff --git a/src/components/Widgets/Markdown/serializers/remarkImagesToText.js b/src/components/EditorWidgets/Markdown/serializers/remarkImagesToText.js similarity index 100% rename from src/components/Widgets/Markdown/serializers/remarkImagesToText.js rename to src/components/EditorWidgets/Markdown/serializers/remarkImagesToText.js diff --git a/src/components/Widgets/Markdown/serializers/remarkPaddedLinks.js b/src/components/EditorWidgets/Markdown/serializers/remarkPaddedLinks.js similarity index 100% rename from src/components/Widgets/Markdown/serializers/remarkPaddedLinks.js rename to src/components/EditorWidgets/Markdown/serializers/remarkPaddedLinks.js diff --git a/src/components/Widgets/Markdown/serializers/remarkRehypeShortcodes.js b/src/components/EditorWidgets/Markdown/serializers/remarkRehypeShortcodes.js similarity index 100% rename from src/components/Widgets/Markdown/serializers/remarkRehypeShortcodes.js rename to src/components/EditorWidgets/Markdown/serializers/remarkRehypeShortcodes.js diff --git a/src/components/Widgets/Markdown/serializers/remarkShortcodes.js b/src/components/EditorWidgets/Markdown/serializers/remarkShortcodes.js similarity index 100% rename from src/components/Widgets/Markdown/serializers/remarkShortcodes.js rename to src/components/EditorWidgets/Markdown/serializers/remarkShortcodes.js diff --git a/src/components/Widgets/Markdown/serializers/remarkSlate.js b/src/components/EditorWidgets/Markdown/serializers/remarkSlate.js similarity index 100% rename from src/components/Widgets/Markdown/serializers/remarkSlate.js rename to src/components/EditorWidgets/Markdown/serializers/remarkSlate.js diff --git a/src/components/Widgets/Markdown/serializers/remarkSquashReferences.js b/src/components/EditorWidgets/Markdown/serializers/remarkSquashReferences.js similarity index 100% rename from src/components/Widgets/Markdown/serializers/remarkSquashReferences.js rename to src/components/EditorWidgets/Markdown/serializers/remarkSquashReferences.js diff --git a/src/components/Widgets/Markdown/serializers/remarkStripTrailingBreaks.js b/src/components/EditorWidgets/Markdown/serializers/remarkStripTrailingBreaks.js similarity index 100% rename from src/components/Widgets/Markdown/serializers/remarkStripTrailingBreaks.js rename to src/components/EditorWidgets/Markdown/serializers/remarkStripTrailingBreaks.js diff --git a/src/components/Widgets/Markdown/serializers/remarkWrapHtml.js b/src/components/EditorWidgets/Markdown/serializers/remarkWrapHtml.js similarity index 100% rename from src/components/Widgets/Markdown/serializers/remarkWrapHtml.js rename to src/components/EditorWidgets/Markdown/serializers/remarkWrapHtml.js diff --git a/src/components/Widgets/Markdown/serializers/slateRemark.js b/src/components/EditorWidgets/Markdown/serializers/slateRemark.js similarity index 99% rename from src/components/Widgets/Markdown/serializers/slateRemark.js rename to src/components/EditorWidgets/Markdown/serializers/slateRemark.js index cd6b83c9..d836b7cd 100644 --- a/src/components/Widgets/Markdown/serializers/slateRemark.js +++ b/src/components/EditorWidgets/Markdown/serializers/slateRemark.js @@ -1,4 +1,4 @@ -import { get, isEmpty, concat, without, flatten, flatMap, initial, last, difference, reverse, sortBy } from 'lodash'; +import { get, isEmpty, without, flatMap, last, sortBy } from 'lodash'; import u from 'unist-builder'; /** diff --git a/src/components/Widgets/NumberControl.js b/src/components/EditorWidgets/Number/NumberControl.js similarity index 58% rename from src/components/Widgets/NumberControl.js rename to src/components/EditorWidgets/Number/NumberControl.js index d8c2fa28..c47938f7 100644 --- a/src/components/Widgets/NumberControl.js +++ b/src/components/EditorWidgets/Number/NumberControl.js @@ -1,7 +1,20 @@ -import PropTypes from 'prop-types'; import React from 'react'; +import PropTypes from 'prop-types'; export default class NumberControl extends React.Component { + static propTypes = { + onChange: PropTypes.func.isRequired, + classNameWrapper: PropTypes.string.isRequired, + setActiveStyle: PropTypes.func.isRequired, + setInactiveStyle: PropTypes.func.isRequired, + value: PropTypes.node, + forID: PropTypes.string, + valueType: PropTypes.string, + step: PropTypes.number, + min: PropTypes.number, + max: PropTypes.number, + }; + handleChange = (e) => { const valueType = this.props.field.get('valueType'); const { onChange } = this.props; @@ -15,13 +28,16 @@ export default class NumberControl extends React.Component { }; render() { - const { field, value, forID } = this.props; + const { field, value, classNameWrapper, forID, setActiveStyle, setInactiveStyle } = this.props; const min = field.get('min', ''); const max = field.get('max', ''); const step = field.get('step', field.get('valueType') === 'int' ? 1 : ''); return ; } } - -NumberControl.propTypes = { - onChange: PropTypes.func.isRequired, - value: PropTypes.node, - forID: PropTypes.string, - valueType: PropTypes.string, - step: PropTypes.number, - min: PropTypes.number, - max: PropTypes.number, -}; diff --git a/src/components/Widgets/NumberPreview.js b/src/components/EditorWidgets/Number/NumberPreview.js similarity index 63% rename from src/components/Widgets/NumberPreview.js rename to src/components/EditorWidgets/Number/NumberPreview.js index b90e3fbb..e954d3ff 100644 --- a/src/components/Widgets/NumberPreview.js +++ b/src/components/EditorWidgets/Number/NumberPreview.js @@ -1,9 +1,8 @@ import PropTypes from 'prop-types'; import React from 'react'; -import previewStyle from './defaultPreviewStyle'; export default function NumberPreview({ value }) { - return
{value}
; + return
{value}
; } NumberPreview.propTypes = { diff --git a/src/components/EditorWidgets/Object/Object.css b/src/components/EditorWidgets/Object/Object.css new file mode 100644 index 00000000..3adba5d2 --- /dev/null +++ b/src/components/EditorWidgets/Object/Object.css @@ -0,0 +1,3 @@ +.nc-objectControl-root { + padding: 14px; +} diff --git a/src/components/EditorWidgets/Object/ObjectControl.js b/src/components/EditorWidgets/Object/ObjectControl.js new file mode 100644 index 00000000..140fafd7 --- /dev/null +++ b/src/components/EditorWidgets/Object/ObjectControl.js @@ -0,0 +1,102 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import ImmutablePropTypes from 'react-immutable-proptypes'; +import { Map } from 'immutable'; +import { partial } from 'lodash'; +import c from 'classnames'; +import { resolveWidget } from 'Lib/registry'; +import EditorControl from 'Editor/EditorControlPane/EditorControl'; + +const TopBar = ({ collapsed, onCollapseToggle }) => +
+
+ + {itemsCount} {listLabel} +
+
; + + +export default class ObjectControl extends Component { + static propTypes = { + onChangeObject: PropTypes.func.isRequired, + onOpenMediaLibrary: PropTypes.func.isRequired, + mediaPaths: ImmutablePropTypes.map.isRequired, + onAddAsset: PropTypes.func.isRequired, + onRemoveInsertedMedia: PropTypes.func.isRequired, + getAsset: PropTypes.func.isRequired, + value: PropTypes.oneOfType([ + PropTypes.node, + PropTypes.object, + PropTypes.bool, + ]), + field: PropTypes.object, + forID: PropTypes.string, + classNameWrapper: PropTypes.string.isRequired, + }; + + constructor(props) { + super(props); + this.state = { + collapsed: false, + }; + } + + /* + * Always update so that each nested widget has the option to update. This is + * required because ControlHOC provides a default `shouldComponentUpdate` + * which only updates if the value changes, but every widget must be allowed + * to override this. + */ + shouldComponentUpdate() { + return true; + } + + controlFor(field) { + const { + onAddAsset, + onOpenMediaLibrary, + mediaPaths, + onRemoveInsertedMedia, + getAsset, + value, + onChangeObject, + } = this.props; + + if (field.get('widget') === 'hidden') { + return null; + } + const widgetName = field.get('widget') || 'string'; + const widget = resolveWidget(widgetName); + const fieldName = field.get('name'); + const fieldValue = value && Map.isMap(value) ? value.get(fieldName) : value; + + return ( + + ); + } + + render() { + const { field, forID, classNameWrapper } = this.props; + const multiFields = field.get('fields'); + const singleField = field.get('field'); + + if (multiFields) { + return (
+ {multiFields.map(f => this.controlFor(f))} +
); + } else if (singleField) { + return this.controlFor(singleField); + } + + return

No field(s) defined for this widget

; + } +} diff --git a/src/components/Widgets/ObjectPreview.js b/src/components/EditorWidgets/Object/ObjectPreview.js similarity index 55% rename from src/components/Widgets/ObjectPreview.js rename to src/components/EditorWidgets/Object/ObjectPreview.js index bd713072..c849d428 100644 --- a/src/components/Widgets/ObjectPreview.js +++ b/src/components/EditorWidgets/Object/ObjectPreview.js @@ -1,10 +1,8 @@ import PropTypes from 'prop-types'; import React, { Component } from 'react'; -import { resolveWidget } from '../Widgets'; -import previewStyle from './defaultPreviewStyle'; const ObjectPreview = ({ field }) => ( -
{(field && field.get('fields')) || null}
+
{(field && field.get('fields')) || null}
); ObjectPreview.propTypes = { diff --git a/src/components/EditorWidgets/Relation/ReactAutosuggest.css b/src/components/EditorWidgets/Relation/ReactAutosuggest.css new file mode 100644 index 00000000..9bed23f7 --- /dev/null +++ b/src/components/EditorWidgets/Relation/ReactAutosuggest.css @@ -0,0 +1,35 @@ +.react-autosuggest__container { + position: relative; +} + +.react-autosuggest__suggestions-container { + display: none; +} + +.react-autosuggest__container--open .react-autosuggest__suggestions-container { + @apply(--dropdownList); + position: absolute; + display: block; + top: 51px; + width: 100%; + z-index: 2; +} + +.react-autosuggest__suggestion { + @apply(--dropdownItem); +} + +.react-autosuggest__suggestions-list { + margin: 0; + padding: 0; + list-style-type: none; +} + +.react-autosuggest__suggestion { + cursor: pointer; + padding: 10px 20px; +} + +.react-autosuggest__suggestion--focused { + background-color: #ddd; +} diff --git a/src/components/EditorWidgets/Relation/Relation.css b/src/components/EditorWidgets/Relation/Relation.css new file mode 100644 index 00000000..2556f673 --- /dev/null +++ b/src/components/EditorWidgets/Relation/Relation.css @@ -0,0 +1 @@ +@import "./ReactAutosuggest.css"; diff --git a/src/components/Widgets/RelationControl.js b/src/components/EditorWidgets/Relation/RelationControl.js similarity index 85% rename from src/components/Widgets/RelationControl.js rename to src/components/EditorWidgets/Relation/RelationControl.js index 0b7a15c9..589892b7 100644 --- a/src/components/Widgets/RelationControl.js +++ b/src/components/EditorWidgets/Relation/RelationControl.js @@ -5,9 +5,8 @@ import uuid from 'uuid/v4'; import { Map } from 'immutable'; import { connect } from 'react-redux'; import { debounce } from 'lodash'; -import { Loader } from '../../components/UI/index'; -import { query, clearSearch } from '../../actions/search'; - +import { query, clearSearch } from 'Actions/search'; +import { Loader } from 'UI'; function escapeRegexCharacters(str) { return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); @@ -26,6 +25,9 @@ class RelationControl extends Component { PropTypes.array, PropTypes.object, ]), + classNameWrapper: PropTypes.string.isRequired, + setActiveStyle: PropTypes.func.isRequired, + setInactiveStyle: PropTypes.func.isRequired, }; constructor(props, ctx) { @@ -89,13 +91,24 @@ class RelationControl extends Component { }; render() { - const { value, isFetching, forID, queryHits } = this.props; + const { + value, + isFetching, + forID, + queryHits, + classNameWrapper, + setActiveStyle, + setInactiveStyle + } = this.props; const inputProps = { placeholder: '', value: value || '', onChange: this.onChange, id: forID, + className: classNameWrapper, + onFocus: setActiveStyle, + onBlur: setInactiveStyle, }; const suggestions = (queryHits.get) ? queryHits.get(this.controlID, []) : []; @@ -110,6 +123,7 @@ class RelationControl extends Component { getSuggestionValue={this.getSuggestionValue} renderSuggestion={this.renderSuggestion} inputProps={inputProps} + focusInputOnSuggestionClick={false} />
@@ -117,10 +131,11 @@ class RelationControl extends Component { } } -function mapStateToProps(state) { +function mapStateToProps(state, ownProps) { + const { className } = ownProps; const isFetching = state.search.get('isFetching'); const queryHits = state.search.get('queryHits'); - return { isFetching, queryHits }; + return { isFetching, queryHits, className }; } export default connect( diff --git a/src/components/Widgets/RelationPreview.js b/src/components/EditorWidgets/Relation/RelationPreview.js similarity index 63% rename from src/components/Widgets/RelationPreview.js rename to src/components/EditorWidgets/Relation/RelationPreview.js index 1924708d..7ee2fcac 100644 --- a/src/components/Widgets/RelationPreview.js +++ b/src/components/EditorWidgets/Relation/RelationPreview.js @@ -1,9 +1,8 @@ import PropTypes from 'prop-types'; import React from 'react'; -import previewStyle from './defaultPreviewStyle'; export default function RelationPreview({ value }) { - return
{ value }
; + return
{ value }
; } RelationPreview.propTypes = { diff --git a/src/components/EditorWidgets/Select/SelectControl.js b/src/components/EditorWidgets/Select/SelectControl.js new file mode 100644 index 00000000..04a2aafb --- /dev/null +++ b/src/components/EditorWidgets/Select/SelectControl.js @@ -0,0 +1,64 @@ +import PropTypes from 'prop-types'; +import React from 'react'; +import ImmutablePropTypes from 'react-immutable-proptypes'; +import { isMap } from 'immutable'; + +export default class SelectControl extends React.Component { + static propTypes = { + onChange: PropTypes.func.isRequired, + value: PropTypes.node, + forID: PropTypes.string.isRequired, + classNameWrapper: PropTypes.string.isRequired, + setActiveStyle: PropTypes.func.isRequired, + setInactiveStyle: PropTypes.func.isRequired, + field: ImmutablePropTypes.contains({ + options: ImmutablePropTypes.listOf(PropTypes.oneOfType([ + PropTypes.string, + ImmutablePropTypes.contains({ + label: PropTypes.string.isRequired, + value: PropTypes.string.isRequired, + }), + ])).isRequired, + }), + }; + + handleChange = (e) => { + this.props.onChange(e.target.value); + }; + + render() { + const { field, value, forID, classNameWrapper, setActiveStyle, setInactiveStyle } = this.props; + const fieldOptions = field.get('options'); + + if (!fieldOptions) { + return
Error rendering select control for {field.get('name')}: No options
; + } + + const options = [ + ...(field.get('default', false) ? [] : [{ label: '', value: '' }]), + ...fieldOptions.map((option) => { + if (typeof option === 'string') { + return { label: option, value: option }; + } + return isMap(option) ? option.toJS() : option; + }), + ]; + + return ( + + ); + } +} diff --git a/src/components/Widgets/SelectPreview.js b/src/components/EditorWidgets/Select/SelectPreview.js similarity index 58% rename from src/components/Widgets/SelectPreview.js rename to src/components/EditorWidgets/Select/SelectPreview.js index 1eb2a59c..9517e240 100644 --- a/src/components/Widgets/SelectPreview.js +++ b/src/components/EditorWidgets/Select/SelectPreview.js @@ -1,9 +1,8 @@ import PropTypes from 'prop-types'; import React from 'react'; -import previewStyle from './defaultPreviewStyle'; export default function SelectPreview({ value }) { - return
{value ? value.toString() : null}
; + return
{value ? value.toString() : null}
; } SelectPreview.propTypes = { diff --git a/src/components/EditorWidgets/String/StringControl.js b/src/components/EditorWidgets/String/StringControl.js new file mode 100644 index 00000000..3c13a4cd --- /dev/null +++ b/src/components/EditorWidgets/String/StringControl.js @@ -0,0 +1,36 @@ +import PropTypes from 'prop-types'; +import React from 'react'; + +export default class StringControl extends React.Component { + static propTypes = { + onChange: PropTypes.func.isRequired, + forID: PropTypes.string, + value: PropTypes.node, + classNameWrapper: PropTypes.string.isRequired, + setActiveStyle: PropTypes.func.isRequired, + setInactiveStyle: PropTypes.func.isRequired, + }; + + render() { + const { + forID, + value, + onChange, + classNameWrapper, + setActiveStyle, + setInactiveStyle + } = this.props; + + return ( + onChange(e.target.value)} + onFocus={setActiveStyle} + onBlur={setInactiveStyle} + /> + ); + } +} diff --git a/src/components/Widgets/StringPreview.js b/src/components/EditorWidgets/String/StringPreview.js similarity index 63% rename from src/components/Widgets/StringPreview.js rename to src/components/EditorWidgets/String/StringPreview.js index b1d5817e..9f9e0ea4 100644 --- a/src/components/Widgets/StringPreview.js +++ b/src/components/EditorWidgets/String/StringPreview.js @@ -1,9 +1,8 @@ import PropTypes from 'prop-types'; import React from 'react'; -import previewStyle from './defaultPreviewStyle'; export default function StringPreview({ value }) { - return
{ value }
; + return
{ value }
; } StringPreview.propTypes = { diff --git a/src/components/EditorWidgets/Text/TextControl.js b/src/components/EditorWidgets/Text/TextControl.js new file mode 100644 index 00000000..e09ca5cb --- /dev/null +++ b/src/components/EditorWidgets/Text/TextControl.js @@ -0,0 +1,48 @@ +import PropTypes from 'prop-types'; +import React from 'react'; +import Textarea from 'react-textarea-autosize'; + +export default class TextControl extends React.Component { + static propTypes = { + onChange: PropTypes.func.isRequired, + forID: PropTypes.string, + value: PropTypes.node, + classNameWrapper: PropTypes.string.isRequired, + setActiveStyle: PropTypes.func.isRequired, + setInactiveStyle: PropTypes.func.isRequired, + }; + + /** + * Always update to ensure `react-textarea-autosize` properly calculates + * height. Certain situations, such as this widget being nested in a list + * item that gets rearranged, can leave the textarea in a minimal height + * state. Always updating should generally be low cost, but this should be + * optimized in the future. + */ + shouldComponentUpdate(nextProps) { + return true; + } + + render() { + const { + forID, + value = '', + onChange, + classNameWrapper, + setActiveStyle, + setInactiveStyle, + } = this.props; + + return ( +