From 30c11954d586c43a00c8c61fa467873bfe1ed1fc Mon Sep 17 00:00:00 2001 From: Francois-Stevenart <51128673+Francois-Stevenart@users.noreply.github.com> Date: Fri, 29 Jan 2021 16:26:56 +0100 Subject: [PATCH] feat(widget-image): enable images ordering (#4857) --- packages/netlify-cms-widget-file/package.json | 4 +- .../src/withFileControl.js | 57 +++++++++++++++---- yarn.lock | 5 ++ 3 files changed, 54 insertions(+), 12 deletions(-) diff --git a/packages/netlify-cms-widget-file/package.json b/packages/netlify-cms-widget-file/package.json index c5f998a6..f9fa2835 100644 --- a/packages/netlify-cms-widget-file/package.json +++ b/packages/netlify-cms-widget-file/package.json @@ -23,7 +23,9 @@ "build:esm": "cross-env NODE_ENV=esm babel src --out-dir dist/esm --ignore \"**/__tests__\" --root-mode upward" }, "dependencies": { - "common-tags": "^1.8.0" + "common-tags": "^1.8.0", + "react-sortable-hoc": "^1.0.0", + "array-move": "3.0.1" }, "peerDependencies": { "@emotion/core": "^10.0.35", diff --git a/packages/netlify-cms-widget-file/src/withFileControl.js b/packages/netlify-cms-widget-file/src/withFileControl.js index 5348d90f..1d9b2aa9 100644 --- a/packages/netlify-cms-widget-file/src/withFileControl.js +++ b/packages/netlify-cms-widget-file/src/withFileControl.js @@ -2,12 +2,15 @@ import React from 'react'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import styled from '@emotion/styled'; +import { css } from '@emotion/core'; import { Map, List } from 'immutable'; import { once } from 'lodash'; import uuid from 'uuid/v4'; import { oneLine } from 'common-tags'; import { lengths, components, buttons, borders, effects, shadows } from 'netlify-cms-ui-default'; import { basename } from 'netlify-cms-lib-util'; +import { SortableContainer, SortableElement } from 'react-sortable-hoc'; +import arrayMove from 'array-move'; const MAX_DISPLAY_LENGTH = 50; @@ -22,6 +25,7 @@ const ImageWrapper = styled.div` overflow: hidden; ${effects.checkerboard}; ${shadows.inset}; + cursor: ${props => (props.sortable ? 'pointer' : 'auto')}; `; const StyledImage = styled.img` @@ -32,10 +36,34 @@ const StyledImage = styled.img` const Image = props => ; -const MultiImageWrapper = styled.div` - display: flex; - flex-wrap: wrap; -`; +const SortableImage = SortableElement(({ itemValue, getAsset, field }) => { + return ( + + + + ); +}); + +const SortableMultiImageWrapper = SortableContainer(({ items, getAsset, field }) => { + return ( +
+ {items.map((itemValue, index) => ( + + ))} +
+ ); +}); const FileLink = styled.a` margin-bottom: 20px; @@ -188,6 +216,12 @@ export default function withFileControl({ forImage } = {}) { return this.props.onChange(''); }; + onSortEnd = ({ oldIndex, newIndex }) => { + const { value } = this.props; + const newValue = arrayMove(value, oldIndex, newIndex); + return this.props.onChange(newValue); + }; + getValidateValue = () => { const { value } = this.props; if (value) { @@ -235,13 +269,14 @@ export default function withFileControl({ forImage } = {}) { if (isMultiple(value)) { return ( - - {value.map(val => ( - - - - ))} - + ); } diff --git a/yarn.lock b/yarn.lock index fc5d8526..a6005f99 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4323,6 +4323,11 @@ array-includes@^3.0.3, array-includes@^3.1.1, array-includes@^3.1.2: get-intrinsic "^1.0.1" is-string "^1.0.5" +array-move@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/array-move/-/array-move-3.0.1.tgz#179645cc0987b65953a4fc06b6df9045e4ba9618" + integrity sha512-H3Of6NIn2nNU1gsVDqDnYKY/LCdWvCMMOWifNGhKcVQgiZ6nOek39aESOvro6zmueP07exSl93YLvkN4fZOkSg== + array-union@^1.0.1, array-union@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"