@akemona-org/strapi-plugin-upload 3.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (246) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +19 -0
  3. package/admin/src/assets/images/logo.svg +1 -0
  4. package/admin/src/components/BrowseAssets/Wrapper.js +8 -0
  5. package/admin/src/components/BrowseAssets/index.js +182 -0
  6. package/admin/src/components/Card/index.js +146 -0
  7. package/admin/src/components/CardBorder/index.js +28 -0
  8. package/admin/src/components/CardControl/Wrapper.js +89 -0
  9. package/admin/src/components/CardControl/index.js +61 -0
  10. package/admin/src/components/CardControlsWrapper/index.js +22 -0
  11. package/admin/src/components/CardEmpty/Bar.js +19 -0
  12. package/admin/src/components/CardEmpty/Wrapper.js +7 -0
  13. package/admin/src/components/CardEmpty/index.js +16 -0
  14. package/admin/src/components/CardErrorMessage/index.js +9 -0
  15. package/admin/src/components/CardImgWrapper/index.js +52 -0
  16. package/admin/src/components/CardPreview/Image.js +12 -0
  17. package/admin/src/components/CardPreview/Wrapper.js +25 -0
  18. package/admin/src/components/CardPreview/index.js +66 -0
  19. package/admin/src/components/CardTitle/index.js +14 -0
  20. package/admin/src/components/CardWrapper/index.js +23 -0
  21. package/admin/src/components/CheckControl/Button.js +49 -0
  22. package/admin/src/components/CheckControl/CustomDropdownSection.js +9 -0
  23. package/admin/src/components/CheckControl/Spacer.js +7 -0
  24. package/admin/src/components/CheckControl/index.js +74 -0
  25. package/admin/src/components/Container/index.js +7 -0
  26. package/admin/src/components/ContainerFluid/index.js +12 -0
  27. package/admin/src/components/ControlsWrapper/index.js +9 -0
  28. package/admin/src/components/DragLayer/Wrapper.js +13 -0
  29. package/admin/src/components/DragLayer/index.js +68 -0
  30. package/admin/src/components/DropdownButton/index.js +63 -0
  31. package/admin/src/components/DropdownSection/index.js +27 -0
  32. package/admin/src/components/Duration/index.js +25 -0
  33. package/admin/src/components/Duration/utils/formatDuration.js +13 -0
  34. package/admin/src/components/EditForm/CropWrapper.js +21 -0
  35. package/admin/src/components/EditForm/ErrorMessage.js +10 -0
  36. package/admin/src/components/EditForm/FileDetailsBox.js +95 -0
  37. package/admin/src/components/EditForm/FileDetailsBoxWrapper.js +14 -0
  38. package/admin/src/components/EditForm/FileWrapper.js +41 -0
  39. package/admin/src/components/EditForm/FormWrapper.js +7 -0
  40. package/admin/src/components/EditForm/SizeBox.js +13 -0
  41. package/admin/src/components/EditForm/Wrapper.js +8 -0
  42. package/admin/src/components/EditForm/index.js +425 -0
  43. package/admin/src/components/EditForm/utils/form.js +34 -0
  44. package/admin/src/components/EditForm/utils/isImageType.js +3 -0
  45. package/admin/src/components/EditForm/utils/isVideoType.js +3 -0
  46. package/admin/src/components/FileIcon/Wrapper.js +20 -0
  47. package/admin/src/components/FileIcon/index.js +33 -0
  48. package/admin/src/components/FileIcon/utils/extensions.json +4 -0
  49. package/admin/src/components/FileInfos/index.js +32 -0
  50. package/admin/src/components/Filters/index.js +30 -0
  51. package/admin/src/components/FiltersList/index.js +34 -0
  52. package/admin/src/components/FiltersList/utils/formatFilter.js +36 -0
  53. package/admin/src/components/FiltersPicker/FiltersCard/FilterButton.js +8 -0
  54. package/admin/src/components/FiltersPicker/FiltersCard/FilterInput.js +35 -0
  55. package/admin/src/components/FiltersPicker/FiltersCard/InputWrapper.js +10 -0
  56. package/admin/src/components/FiltersPicker/FiltersCard/SizeInput.js +57 -0
  57. package/admin/src/components/FiltersPicker/FiltersCard/Wrapper.js +8 -0
  58. package/admin/src/components/FiltersPicker/FiltersCard/index.js +97 -0
  59. package/admin/src/components/FiltersPicker/FiltersCard/init.js +21 -0
  60. package/admin/src/components/FiltersPicker/FiltersCard/reducer.js +47 -0
  61. package/admin/src/components/FiltersPicker/FiltersCard/utils/filtersForm.js +27 -0
  62. package/admin/src/components/FiltersPicker/index.js +43 -0
  63. package/admin/src/components/FiltersPicker/utils/formatFilter.js +18 -0
  64. package/admin/src/components/InfiniteLoadingIndicator/Button.js +20 -0
  65. package/admin/src/components/InfiniteLoadingIndicator/Container.js +12 -0
  66. package/admin/src/components/InfiniteLoadingIndicator/Wrapper.js +18 -0
  67. package/admin/src/components/InfiniteLoadingIndicator/index.js +39 -0
  68. package/admin/src/components/Input/index.js +7 -0
  69. package/admin/src/components/InputFileModal/Label.js +47 -0
  70. package/admin/src/components/InputFileModal/P.js +15 -0
  71. package/admin/src/components/InputFileModal/index.js +73 -0
  72. package/admin/src/components/InputMedia/CardControlWrapper.js +12 -0
  73. package/admin/src/components/InputMedia/CardPreviewWrapper.js +13 -0
  74. package/admin/src/components/InputMedia/Chevron/Wrapper.js +10 -0
  75. package/admin/src/components/InputMedia/Chevron/index.js +21 -0
  76. package/admin/src/components/InputMedia/EmptyInputMedia.js +60 -0
  77. package/admin/src/components/InputMedia/EmptyText.js +13 -0
  78. package/admin/src/components/InputMedia/ErrorMessage.js +12 -0
  79. package/admin/src/components/InputMedia/IconUpload.js +48 -0
  80. package/admin/src/components/InputMedia/InputFilePreview.js +37 -0
  81. package/admin/src/components/InputMedia/Name.js +10 -0
  82. package/admin/src/components/InputMedia/Wrapper.js +11 -0
  83. package/admin/src/components/InputMedia/index.js +238 -0
  84. package/admin/src/components/InputUploadURL/Wrapper.js +13 -0
  85. package/admin/src/components/InputUploadURL/index.js +46 -0
  86. package/admin/src/components/IntlText/index.js +26 -0
  87. package/admin/src/components/List/ListCell.js +19 -0
  88. package/admin/src/components/List/ListRow.js +8 -0
  89. package/admin/src/components/List/index.js +114 -0
  90. package/admin/src/components/ListEmpty/Wrapper.js +15 -0
  91. package/admin/src/components/ListEmpty/index.js +70 -0
  92. package/admin/src/components/ListEmpty/utils/generateRows.js +12 -0
  93. package/admin/src/components/ListModal/BaselineAlignmentWrapper.js +12 -0
  94. package/admin/src/components/ListModal/index.js +66 -0
  95. package/admin/src/components/ListWrapper/index.js +16 -0
  96. package/admin/src/components/LoadingIndicator/index.js +44 -0
  97. package/admin/src/components/ModalHeader/BackButton.js +33 -0
  98. package/admin/src/components/ModalHeader/Wrapper.js +24 -0
  99. package/admin/src/components/ModalHeader/index.js +47 -0
  100. package/admin/src/components/ModalNavWrapper/BaselineAlignment.js +12 -0
  101. package/admin/src/components/ModalNavWrapper/Hr.js +14 -0
  102. package/admin/src/components/ModalNavWrapper/Wrapper.js +8 -0
  103. package/admin/src/components/ModalNavWrapper/index.js +70 -0
  104. package/admin/src/components/ModalSection/index.js +20 -0
  105. package/admin/src/components/ModalTab/Count/Wrapper.js +16 -0
  106. package/admin/src/components/ModalTab/Count/index.js +30 -0
  107. package/admin/src/components/ModalTab/Wrapper.js +37 -0
  108. package/admin/src/components/ModalTab/index.js +60 -0
  109. package/admin/src/components/PlayIcon/Play.js +65 -0
  110. package/admin/src/components/PlayIcon/Wrapper.js +24 -0
  111. package/admin/src/components/PlayIcon/index.js +23 -0
  112. package/admin/src/components/SelectAll/Wrapper.js +19 -0
  113. package/admin/src/components/SelectAll/index.js +26 -0
  114. package/admin/src/components/SelectedAssets/DraggableCard.js +149 -0
  115. package/admin/src/components/SelectedAssets/ListTitleWrapper.js +7 -0
  116. package/admin/src/components/SelectedAssets/ListWrapper.js +7 -0
  117. package/admin/src/components/SelectedAssets/SortableList.js +102 -0
  118. package/admin/src/components/SelectedAssets/Wrapper.js +7 -0
  119. package/admin/src/components/SelectedAssets/index.js +56 -0
  120. package/admin/src/components/SortList/Wrapper.js +19 -0
  121. package/admin/src/components/SortList/index.js +37 -0
  122. package/admin/src/components/SortListItem/Wrapper.js +28 -0
  123. package/admin/src/components/SortListItem/index.js +35 -0
  124. package/admin/src/components/SortPicker/index.js +54 -0
  125. package/admin/src/components/Tag/Wrapper.js +16 -0
  126. package/admin/src/components/Tag/index.js +25 -0
  127. package/admin/src/components/UploadForm/index.js +61 -0
  128. package/admin/src/components/UploadList/ButtonWrapper.js +7 -0
  129. package/admin/src/components/UploadList/Container.js +10 -0
  130. package/admin/src/components/UploadList/CustomModalSection.js +9 -0
  131. package/admin/src/components/UploadList/ListTitle.js +10 -0
  132. package/admin/src/components/UploadList/ListTitleWrapper.js +7 -0
  133. package/admin/src/components/UploadList/RowItem.js +98 -0
  134. package/admin/src/components/UploadList/index.js +90 -0
  135. package/admin/src/components/VideoPlayer/Wrapper.js +24 -0
  136. package/admin/src/components/VideoPlayer/index.js +57 -0
  137. package/admin/src/components/VideoPreview/CanvasWrapper.js +22 -0
  138. package/admin/src/components/VideoPreview/Thumbnail.js +12 -0
  139. package/admin/src/components/VideoPreview/Wrapper.js +15 -0
  140. package/admin/src/components/VideoPreview/index.js +165 -0
  141. package/admin/src/components/VideoPreview/reducer.js +33 -0
  142. package/admin/src/containers/App/index.js +31 -0
  143. package/admin/src/containers/HomePage/HomePageContent/HomePageList.js +98 -0
  144. package/admin/src/containers/HomePage/HomePageContent/HomePageSettings.js +103 -0
  145. package/admin/src/containers/HomePage/HomePageContent/index.js +90 -0
  146. package/admin/src/containers/HomePage/components.js +18 -0
  147. package/admin/src/containers/HomePage/index.js +373 -0
  148. package/admin/src/containers/HomePage/init.js +5 -0
  149. package/admin/src/containers/HomePage/reducer.js +88 -0
  150. package/admin/src/containers/HomePage/utils/generateParamsFromQuery.js +14 -0
  151. package/admin/src/containers/HomePage/utils/generateStringFromParams.js +27 -0
  152. package/admin/src/containers/HomePage/utils/getHeaderLabel.js +13 -0
  153. package/admin/src/containers/HomePage/utils/index.js +2 -0
  154. package/admin/src/containers/Initializer/index.js +44 -0
  155. package/admin/src/containers/InputModalStepper/HeaderSearch.js +12 -0
  156. package/admin/src/containers/InputModalStepper/InputModalStepper.js +480 -0
  157. package/admin/src/containers/InputModalStepper/Search.js +48 -0
  158. package/admin/src/containers/InputModalStepper/index.js +86 -0
  159. package/admin/src/containers/InputModalStepper/stepper.js +52 -0
  160. package/admin/src/containers/InputModalStepperProvider/index.js +564 -0
  161. package/admin/src/containers/InputModalStepperProvider/init.js +5 -0
  162. package/admin/src/containers/InputModalStepperProvider/reducer.js +301 -0
  163. package/admin/src/containers/ModalStepper/index.js +629 -0
  164. package/admin/src/containers/ModalStepper/init.js +5 -0
  165. package/admin/src/containers/ModalStepper/reducer.js +132 -0
  166. package/admin/src/containers/ModalStepper/stepper.js +46 -0
  167. package/admin/src/containers/SettingsPage/Divider.js +11 -0
  168. package/admin/src/containers/SettingsPage/SectionTitleWrapper.js +7 -0
  169. package/admin/src/containers/SettingsPage/Wrapper.js +17 -0
  170. package/admin/src/containers/SettingsPage/index.js +198 -0
  171. package/admin/src/containers/SettingsPage/init.js +5 -0
  172. package/admin/src/containers/SettingsPage/reducer.js +38 -0
  173. package/admin/src/contexts/AppContext/index.js +5 -0
  174. package/admin/src/contexts/InputModal/InputModalDataManager.js +5 -0
  175. package/admin/src/contexts/index.js +2 -0
  176. package/admin/src/hooks/index.js +2 -0
  177. package/admin/src/hooks/useAppContext/index.js +6 -0
  178. package/admin/src/hooks/useModalContext.js +6 -0
  179. package/admin/src/icons/BrokenFile/index.js +91 -0
  180. package/admin/src/icons/Cloud/index.js +35 -0
  181. package/admin/src/icons/DoubleFile/index.js +35 -0
  182. package/admin/src/icons/Download/index.js +36 -0
  183. package/admin/src/icons/File/index.js +35 -0
  184. package/admin/src/index.js +85 -0
  185. package/admin/src/lifecycles.js +13 -0
  186. package/admin/src/permissions.js +40 -0
  187. package/admin/src/pluginId.js +5 -0
  188. package/admin/src/translations/de.json +81 -0
  189. package/admin/src/translations/dk.json +81 -0
  190. package/admin/src/translations/en.json +86 -0
  191. package/admin/src/translations/es.json +81 -0
  192. package/admin/src/translations/fr.json +85 -0
  193. package/admin/src/translations/he.json +81 -0
  194. package/admin/src/translations/index.js +39 -0
  195. package/admin/src/translations/it.json +82 -0
  196. package/admin/src/translations/ja.json +81 -0
  197. package/admin/src/translations/ms.json +73 -0
  198. package/admin/src/translations/pl.json +81 -0
  199. package/admin/src/translations/pt-BR.json +81 -0
  200. package/admin/src/translations/ru.json +81 -0
  201. package/admin/src/translations/sk.json +81 -0
  202. package/admin/src/translations/th.json +81 -0
  203. package/admin/src/translations/uk.json +78 -0
  204. package/admin/src/translations/zh-Hans.json +86 -0
  205. package/admin/src/translations/zh.json +81 -0
  206. package/admin/src/utils/ItemTypes.js +3 -0
  207. package/admin/src/utils/canDownloadFile.js +3 -0
  208. package/admin/src/utils/compactParams.js +13 -0
  209. package/admin/src/utils/createFileToDownloadName.js +9 -0
  210. package/admin/src/utils/createMatrix.js +32 -0
  211. package/admin/src/utils/createNewFilesToDownloadArray.js +57 -0
  212. package/admin/src/utils/createNewFilesToUploadArray.js +25 -0
  213. package/admin/src/utils/formatBytes.js +13 -0
  214. package/admin/src/utils/formatFileForEditing.js +20 -0
  215. package/admin/src/utils/formatFilters.js +23 -0
  216. package/admin/src/utils/generatePageFromStart.js +5 -0
  217. package/admin/src/utils/generateStartFromPage.js +5 -0
  218. package/admin/src/utils/getFileModelTimestamps.js +15 -0
  219. package/admin/src/utils/getFilesToDownload.js +5 -0
  220. package/admin/src/utils/getRequestUrl.js +5 -0
  221. package/admin/src/utils/getTrad.js +5 -0
  222. package/admin/src/utils/getType.js +15 -0
  223. package/admin/src/utils/getYupError.js +17 -0
  224. package/admin/src/utils/index.js +20 -0
  225. package/admin/src/utils/unformatBytes.js +16 -0
  226. package/admin/src/utils/urlYupSchema.js +49 -0
  227. package/config/config.json +8 -0
  228. package/config/functions/bootstrap.js +143 -0
  229. package/config/routes.json +98 -0
  230. package/config/schema.graphql.js +96 -0
  231. package/controllers/Upload.js +103 -0
  232. package/controllers/upload/admin.js +213 -0
  233. package/controllers/upload/api.js +125 -0
  234. package/controllers/validation/settings.js +22 -0
  235. package/controllers/validation/upload.js +27 -0
  236. package/documentation/1.0.0/overrides/upload-File.json +263 -0
  237. package/errors.js +48 -0
  238. package/index.js +7 -0
  239. package/middlewares/upload/defaults.json +5 -0
  240. package/middlewares/upload/index.js +35 -0
  241. package/models/File.js +7 -0
  242. package/models/File.settings.json +86 -0
  243. package/package.json +71 -0
  244. package/services/Upload.js +397 -0
  245. package/services/image-manipulation.js +167 -0
  246. package/utils/file.js +23 -0
@@ -0,0 +1,60 @@
1
+ /**
2
+ *
3
+ * ModalTab
4
+ *
5
+ */
6
+
7
+ import React from 'react';
8
+ import PropTypes from 'prop-types';
9
+ import { Flex, Padded } from '@buffetjs/core';
10
+
11
+ import { getTrad } from '../../utils';
12
+ import Wrapper from './Wrapper';
13
+ import IntlText from '../IntlText';
14
+ import Count from './Count';
15
+
16
+ const ModalTab = ({ isDisabled, label, to, isActive, onClick, count }) => {
17
+ const handleClick = e => {
18
+ if (isDisabled) {
19
+ e.preventDefault();
20
+
21
+ return;
22
+ }
23
+
24
+ onClick(to);
25
+ };
26
+
27
+ return (
28
+ <Padded right size="lg">
29
+ <Wrapper isActive={isActive} isDisabled={isDisabled} onClick={handleClick}>
30
+ <Flex>
31
+ <IntlText
32
+ id={getTrad(`modal.nav.${label}`)}
33
+ textTransform="uppercase"
34
+ fontWeight={isActive ? 'bold' : 'semiBold'}
35
+ color={isActive ? 'mediumBlue' : 'grey'}
36
+ />
37
+ {typeof count === 'number' && <Count count={count} isActive={isActive} />}
38
+ </Flex>
39
+ </Wrapper>
40
+ </Padded>
41
+ );
42
+ };
43
+
44
+ ModalTab.defaultProps = {
45
+ count: null,
46
+ isActive: false,
47
+ isDisabled: false,
48
+ onClick: () => {},
49
+ };
50
+
51
+ ModalTab.propTypes = {
52
+ count: PropTypes.number,
53
+ isActive: PropTypes.bool,
54
+ isDisabled: PropTypes.bool,
55
+ label: PropTypes.string.isRequired,
56
+ onClick: PropTypes.func,
57
+ to: PropTypes.string.isRequired,
58
+ };
59
+
60
+ export default ModalTab;
@@ -0,0 +1,65 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+
4
+ const Play = ({ fill, ...rest }) => (
5
+ <svg width="48px" height="52px" viewBox="0 0 48 52" {...rest} xmlns="http://www.w3.org/2000/svg">
6
+ <defs>
7
+ <filter
8
+ x="-1.7%"
9
+ y="-2.1%"
10
+ width="103.5%"
11
+ height="104.1%"
12
+ filterUnits="objectBoundingBox"
13
+ id="filter-1"
14
+ >
15
+ <feOffset dx="0" dy="2" in="SourceAlpha" result="shadowOffsetOuter1" />
16
+ <feGaussianBlur stdDeviation="2" in="shadowOffsetOuter1" result="shadowBlurOuter1" />
17
+ <feColorMatrix
18
+ values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.05 0"
19
+ type="matrix"
20
+ in="shadowBlurOuter1"
21
+ result="shadowMatrixOuter1"
22
+ />
23
+ <feMerge>
24
+ <feMergeNode in="shadowMatrixOuter1" />
25
+ <feMergeNode in="SourceGraphic" />
26
+ </feMerge>
27
+ </filter>
28
+ </defs>
29
+ <g id="Prototype---Media-library" stroke="none" strokeWidth="1" fill="none" fillRule="evenodd">
30
+ <g
31
+ id="Media-Library-/-Single-view-/-Media-Video"
32
+ transform="translate(-545.000000, -435.000000)"
33
+ fill={fill}
34
+ fillRule="nonzero"
35
+ >
36
+ <g
37
+ id="Modal---Upload-from-Unsplash"
38
+ filter="url(#filter-1)"
39
+ transform="translate(323.000000, 182.000000)"
40
+ >
41
+ <g id="Video" transform="translate(25.000000, 79.000000)">
42
+ <g id="Group-17" transform="translate(169.000000, 151.000000)">
43
+ <g id="play" transform="translate(32.000000, 25.000000)">
44
+ <path
45
+ d="M39.3461265,22.97086 L1.5920398,43.9516702 C1.15612414,44.1980573 0.781805259,44.2264866 0.469083156,44.0369581 C0.156361052,43.8474295 0,43.5062781 0,43.0135039 L0,1.16560057 C0,0.672826344 0.156361052,0.331674959 0.469083156,0.142146411 C0.781805259,-0.0473821369 1.15612414,-0.0189528548 1.5920398,0.227434257 L39.3461265,21.2082445 C39.7820422,21.4546316 40,21.7484009 40,22.0895522 C40,22.4307036 39.7820422,22.7244729 39.3461265,22.97086 Z"
46
+ id="Path"
47
+ />
48
+ </g>
49
+ </g>
50
+ </g>
51
+ </g>
52
+ </g>
53
+ </g>
54
+ </svg>
55
+ );
56
+
57
+ Play.defaultProps = {
58
+ fill: '#fff',
59
+ };
60
+
61
+ Play.propTypes = {
62
+ fill: PropTypes.string,
63
+ };
64
+
65
+ export default Play;
@@ -0,0 +1,24 @@
1
+ import styled from 'styled-components';
2
+ import PropTypes from 'prop-types';
3
+
4
+ const Wrapper = styled.div`
5
+ display: flex;
6
+ position: absolute;
7
+ justify-content: center;
8
+ align-items: center;
9
+ width: ${({ small }) => (small ? '45px' : '94px')};
10
+ height: ${({ small }) => (small ? '45px' : '94px')};
11
+ padding-left: ${({ small }) => (small ? '5px' : '9px')};
12
+ border-radius: 50%;
13
+ background-color: rgba(255, 255, 255, 0.5);
14
+ `;
15
+
16
+ Wrapper.defaultProps = {
17
+ small: false,
18
+ };
19
+
20
+ Wrapper.propTypes = {
21
+ small: PropTypes.bool,
22
+ };
23
+
24
+ export default Wrapper;
@@ -0,0 +1,23 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+
4
+ import Wrapper from './Wrapper';
5
+ import Play from './Play';
6
+
7
+ const PlayIcon = ({ small }) => {
8
+ return (
9
+ <Wrapper small={small}>
10
+ <Play fill="#000000" width={small ? '23px' : '49px'} height={small ? '25px' : '52px'} />
11
+ </Wrapper>
12
+ );
13
+ };
14
+
15
+ PlayIcon.defaultProps = {
16
+ small: false,
17
+ };
18
+
19
+ PlayIcon.propTypes = {
20
+ small: PropTypes.bool,
21
+ };
22
+
23
+ export default PlayIcon;
@@ -0,0 +1,19 @@
1
+ import styled from 'styled-components';
2
+
3
+ const Wrapper = styled.div`
4
+ display: flex;
5
+ justify-content: center;
6
+ height: 30px;
7
+ width: 35px;
8
+ background: #ffffff;
9
+ border: 1px solid #e3e9f3;
10
+ border-radius: 2px;
11
+ > div {
12
+ margin: auto;
13
+ > label {
14
+ margin-left: 0;
15
+ }
16
+ }
17
+ `;
18
+
19
+ export default Wrapper;
@@ -0,0 +1,26 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { Checkbox } from '@buffetjs/core';
4
+ import Wrapper from './Wrapper';
5
+
6
+ const SelectAll = ({ checked, onChange, someChecked }) => {
7
+ return (
8
+ <Wrapper>
9
+ <Checkbox name="selectAll" onChange={onChange} value={checked} someChecked={someChecked} />
10
+ </Wrapper>
11
+ );
12
+ };
13
+
14
+ SelectAll.defaultProps = {
15
+ checked: false,
16
+ onChange: () => {},
17
+ someChecked: false,
18
+ };
19
+
20
+ SelectAll.propTypes = {
21
+ checked: PropTypes.bool,
22
+ onChange: PropTypes.func,
23
+ someChecked: PropTypes.bool,
24
+ };
25
+
26
+ export default SelectAll;
@@ -0,0 +1,149 @@
1
+ import React, { useRef, useEffect } from 'react';
2
+ import { useDrag, useDrop } from 'react-dnd';
3
+ import PropTypes from 'prop-types';
4
+ import { getEmptyImage } from 'react-dnd-html5-backend';
5
+ import { Flex } from '@buffetjs/core';
6
+ import { getFileExtension } from 'strapi-helper-plugin';
7
+ import { formatBytes, getType, ItemTypes } from '../../utils';
8
+
9
+ import Border from '../CardBorder';
10
+ import CardImgWrapper from '../CardImgWrapper';
11
+ import CardPreview from '../CardPreview';
12
+ import ErrorMessage from '../CardErrorMessage';
13
+ import FileInfos from '../FileInfos';
14
+ import Title from '../CardTitle';
15
+ import Tag from '../Tag';
16
+ import Wrapper from '../CardWrapper';
17
+
18
+ const DraggableCard = ({
19
+ id,
20
+ checked,
21
+ children,
22
+ errorMessage,
23
+ ext,
24
+ hasError,
25
+ index,
26
+ isDraggable,
27
+ mime,
28
+ moveAsset,
29
+ name,
30
+ onClick,
31
+ size,
32
+ type,
33
+ url,
34
+ withFileCaching,
35
+ }) => {
36
+ const ref = useRef(null);
37
+ // Adapted from https://react-dnd.github.io/react-dnd/examples/sortable/simple
38
+ const [, drop] = useDrop({
39
+ accept: ItemTypes.MEDIA_CARD,
40
+ hover(item) {
41
+ if (!ref.current) {
42
+ return;
43
+ }
44
+ const dragIndex = item.index;
45
+ const hoverIndex = index;
46
+
47
+ // Don't replace items with themselves
48
+ if (dragIndex === hoverIndex) {
49
+ return;
50
+ }
51
+
52
+ // Directly move the asset for faster reorder
53
+ // It doing so makes lot of computations though
54
+ moveAsset(dragIndex, hoverIndex);
55
+ // Note: we're mutating the monitor item here!
56
+ // Generally it's better to avoid mutations,
57
+ // but it's good here for the sake of performance
58
+ // to avoid expensive index searches.
59
+ item.index = hoverIndex;
60
+ },
61
+ });
62
+
63
+ const fileSize = formatBytes(size, 0);
64
+ const fileType = mime || type;
65
+
66
+ const [{ isDragging }, drag, preview] = useDrag({
67
+ item: { type: ItemTypes.MEDIA_CARD, id, index, checked, url, fileType },
68
+ canDrag: () => isDraggable,
69
+ collect: monitor => ({
70
+ isDragging: monitor.isDragging(),
71
+ }),
72
+ });
73
+
74
+ // Remove the default preview when the item is being dragged
75
+ // The preview is handled by the DragLayer
76
+ useEffect(() => {
77
+ preview(getEmptyImage(), { captureDraggingState: true });
78
+ }, [preview]);
79
+
80
+ const opacity = isDragging ? 0.2 : 1;
81
+
82
+ const handleClick = () => {
83
+ onClick(id);
84
+ };
85
+
86
+ drag(drop(ref));
87
+
88
+ return (
89
+ <Wrapper onClick={handleClick} isDraggable={isDraggable} ref={ref} style={{ opacity }}>
90
+ <CardImgWrapper checked={checked} small>
91
+ <CardPreview
92
+ extension={getFileExtension(ext)}
93
+ hasError={hasError}
94
+ url={url}
95
+ type={fileType}
96
+ withFileCaching={withFileCaching}
97
+ />
98
+ <Border color={hasError ? 'orange' : 'mediumBlue'} shown={checked || hasError} />
99
+ {children}
100
+ </CardImgWrapper>
101
+ <Flex>
102
+ <Title>{name}</Title>
103
+ <Tag label={getType(fileType)} />
104
+ </Flex>
105
+ <FileInfos extension={getFileExtension(ext)} size={fileSize} />
106
+ {hasError && <ErrorMessage>{errorMessage}</ErrorMessage>}
107
+ </Wrapper>
108
+ );
109
+ };
110
+
111
+ DraggableCard.defaultProps = {
112
+ checked: false,
113
+ children: null,
114
+ errorMessage: null,
115
+ ext: null,
116
+ id: null,
117
+ index: 0,
118
+ isDraggable: false,
119
+ hasError: false,
120
+ mime: null,
121
+ moveAsset: () => {},
122
+ name: null,
123
+ onClick: () => {},
124
+ size: 0,
125
+ type: null,
126
+ url: null,
127
+ withFileCaching: true,
128
+ };
129
+
130
+ DraggableCard.propTypes = {
131
+ id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
132
+ checked: PropTypes.bool,
133
+ children: PropTypes.node,
134
+ errorMessage: PropTypes.string,
135
+ ext: PropTypes.string,
136
+ hasError: PropTypes.bool,
137
+ index: PropTypes.number,
138
+ isDraggable: PropTypes.bool,
139
+ mime: PropTypes.string,
140
+ moveAsset: PropTypes.func,
141
+ name: PropTypes.string,
142
+ onClick: PropTypes.func,
143
+ size: PropTypes.number,
144
+ type: PropTypes.string,
145
+ url: PropTypes.string,
146
+ withFileCaching: PropTypes.bool,
147
+ };
148
+
149
+ export default DraggableCard;
@@ -0,0 +1,7 @@
1
+ import styled from 'styled-components';
2
+
3
+ const ListTitleWrapper = styled.div`
4
+ margin-top: 23px;
5
+ `;
6
+
7
+ export default ListTitleWrapper;
@@ -0,0 +1,7 @@
1
+ import styled from 'styled-components';
2
+
3
+ const ListWrapper = styled.div`
4
+ margin-top: 1.5rem;
5
+ `;
6
+
7
+ export default ListWrapper;
@@ -0,0 +1,102 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { Checkbox } from '@buffetjs/core';
4
+ import { get } from 'lodash';
5
+ import { prefixFileUrlWithBackendUrl } from 'strapi-helper-plugin';
6
+ import DraggableCard from './DraggableCard';
7
+ import CardControlsWrapper from '../CardControlsWrapper';
8
+ import ListWrapper from '../ListWrapper';
9
+ import CardControl from '../CardControl';
10
+
11
+ const SortableList = ({
12
+ allowedActions,
13
+ canSelect,
14
+ data,
15
+ moveAsset,
16
+ noNavigation,
17
+ onChange,
18
+ onClickEditFile,
19
+ selectedItems,
20
+ }) => {
21
+ const handleClick = e => {
22
+ e.stopPropagation();
23
+ };
24
+
25
+ return (
26
+ <ListWrapper small>
27
+ <div className="row">
28
+ {data.map((item, index) => {
29
+ const { id } = item;
30
+ const url = get(item, ['formats', 'thumbnail', 'url'], item.url);
31
+ const checked = selectedItems.findIndex(file => file.id === id) !== -1;
32
+ const fileUrl = prefixFileUrlWithBackendUrl(url);
33
+ const handleEditClick = e => {
34
+ e.stopPropagation();
35
+ onClickEditFile(id);
36
+ };
37
+
38
+ return (
39
+ <div className="col-xs-12 col-md-6 col-xl-3" key={id || index}>
40
+ <DraggableCard
41
+ checked={checked}
42
+ {...item}
43
+ url={fileUrl}
44
+ moveAsset={moveAsset}
45
+ isDraggable
46
+ index={index}
47
+ >
48
+ {(checked || canSelect) && (
49
+ <CardControlsWrapper leftAlign displayed className="card-control-wrapper">
50
+ <Checkbox
51
+ name={`${id}`}
52
+ onChange={onChange}
53
+ onClick={handleClick}
54
+ value={checked}
55
+ />
56
+ </CardControlsWrapper>
57
+ )}
58
+ {!noNavigation && allowedActions.canUpdate && (
59
+ <CardControlsWrapper className="card-control-wrapper card-control-wrapper-hidden">
60
+ <CardControl
61
+ small
62
+ title="edit"
63
+ color="#9EA7B8"
64
+ type="pencil"
65
+ onClick={e => handleEditClick(e)}
66
+ />
67
+ </CardControlsWrapper>
68
+ )}
69
+ </DraggableCard>
70
+ </div>
71
+ );
72
+ })}
73
+ </div>
74
+ </ListWrapper>
75
+ );
76
+ };
77
+
78
+ SortableList.defaultProps = {
79
+ allowedActions: {
80
+ canUpdate: false,
81
+ },
82
+ canSelect: true,
83
+ data: [],
84
+ moveAsset: () => {},
85
+ noNavigation: false,
86
+ onChange: () => {},
87
+ onClickEditFile: () => {},
88
+ selectedItems: [],
89
+ };
90
+
91
+ SortableList.propTypes = {
92
+ allowedActions: PropTypes.object,
93
+ canSelect: PropTypes.bool,
94
+ data: PropTypes.array,
95
+ moveAsset: PropTypes.func,
96
+ noNavigation: PropTypes.bool,
97
+ onChange: PropTypes.func,
98
+ onClickEditFile: PropTypes.func,
99
+ selectedItems: PropTypes.array,
100
+ };
101
+
102
+ export default SortableList;
@@ -0,0 +1,7 @@
1
+ import styled from 'styled-components';
2
+
3
+ const Wrapper = styled.div`
4
+ width: 100%;
5
+ `;
6
+
7
+ export default Wrapper;
@@ -0,0 +1,56 @@
1
+ import React from 'react';
2
+
3
+ import { Flex } from '@buffetjs/core';
4
+
5
+ import { getTrad } from '../../utils';
6
+ import IntlText from '../IntlText';
7
+ import ListTitle from '../UploadList/ListTitle';
8
+ import useModalContext from '../../hooks/useModalContext';
9
+ import SortableList from './SortableList';
10
+ import Wrapper from './Wrapper';
11
+ import ListTitleWrapper from './ListTitleWrapper';
12
+ import ListWrapper from './ListWrapper';
13
+
14
+ const SelectedAssets = () => {
15
+ const {
16
+ allowedActions,
17
+ selectedFiles,
18
+ handleFileSelection,
19
+ handleGoToEditFile,
20
+ moveAsset,
21
+ noNavigation,
22
+ } = useModalContext();
23
+ const filesToUploadLength = selectedFiles.length;
24
+ const titleId = `modal.upload-list.sub-header-title.${
25
+ filesToUploadLength > 1 ? 'plural' : 'singular'
26
+ }`;
27
+
28
+ return (
29
+ <Wrapper>
30
+ <Flex justifyContent="space-between">
31
+ <ListTitleWrapper>
32
+ <ListTitle id={getTrad(titleId)} values={{ number: filesToUploadLength }} />
33
+ <IntlText
34
+ id={getTrad('modal.upload-list.sub-header-subtitle')}
35
+ values={{ number: filesToUploadLength }}
36
+ fontSize="sm"
37
+ color="grey"
38
+ />
39
+ </ListTitleWrapper>
40
+ </Flex>
41
+ <ListWrapper>
42
+ <SortableList
43
+ allowedActions={allowedActions}
44
+ data={selectedFiles}
45
+ moveAsset={moveAsset}
46
+ noNavigation={noNavigation}
47
+ onChange={handleFileSelection}
48
+ onClickEditFile={handleGoToEditFile}
49
+ selectedItems={selectedFiles}
50
+ />
51
+ </ListWrapper>
52
+ </Wrapper>
53
+ );
54
+ };
55
+
56
+ export default SelectedAssets;
@@ -0,0 +1,19 @@
1
+ import React from 'react';
2
+ import styled from 'styled-components';
3
+ import { themePropTypes } from 'strapi-helper-plugin';
4
+
5
+ import { Text } from '@buffetjs/core';
6
+
7
+ const Wrapper = styled(props => <Text as="ul" fontSize="md" {...props} />)`
8
+ margin-bottom: 0;
9
+ padding: 0;
10
+ min-width: 230px;
11
+ list-style-type: none;
12
+ background-color: ${({ theme }) => theme.main.colors.white};
13
+ `;
14
+
15
+ Wrapper.propTypes = {
16
+ ...themePropTypes,
17
+ };
18
+
19
+ export default Wrapper;
@@ -0,0 +1,37 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+
4
+ import Wrapper from './Wrapper';
5
+ import SortListItem from '../SortListItem';
6
+
7
+ const SortList = ({ list, onClick, selectedItem }) => {
8
+ return (
9
+ <Wrapper>
10
+ {Object.keys(list).map(item => {
11
+ return (
12
+ <SortListItem
13
+ key={item}
14
+ label={item}
15
+ value={list[item]}
16
+ onClick={onClick}
17
+ selectedItem={selectedItem}
18
+ />
19
+ );
20
+ })}
21
+ </Wrapper>
22
+ );
23
+ };
24
+
25
+ SortList.defaultProps = {
26
+ list: {},
27
+ onClick: () => {},
28
+ selectedItem: null,
29
+ };
30
+
31
+ SortList.propTypes = {
32
+ list: PropTypes.object,
33
+ onClick: PropTypes.func,
34
+ selectedItem: PropTypes.string,
35
+ };
36
+
37
+ export default SortList;
@@ -0,0 +1,28 @@
1
+ import styled from 'styled-components';
2
+ import PropTypes from 'prop-types';
3
+ import { themePropTypes } from 'strapi-helper-plugin';
4
+
5
+ const SortListItem = styled.li`
6
+ padding: 0 14px;
7
+ height: 27px;
8
+ &:hover {
9
+ cursor: pointer;
10
+ background-color: ${({ theme }) => theme.main.colors.mediumGrey};
11
+ }
12
+ ${({ isActive, theme }) =>
13
+ isActive &&
14
+ `
15
+ background-color: ${theme.main.colors.mediumGrey};
16
+ `}
17
+ `;
18
+
19
+ SortListItem.defaultProps = {
20
+ isActive: false,
21
+ };
22
+
23
+ SortListItem.propTypes = {
24
+ isActive: PropTypes.bool,
25
+ ...themePropTypes,
26
+ };
27
+
28
+ export default SortListItem;
@@ -0,0 +1,35 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+
4
+ import { getTrad } from '../../utils';
5
+
6
+ import Wrapper from './Wrapper';
7
+ import IntlText from '../IntlText';
8
+
9
+ const SortListItem = ({ onClick, selectedItem, label, value }) => {
10
+ const handleClick = () => {
11
+ onClick({ target: { name: '_sort', value } });
12
+ };
13
+
14
+ return (
15
+ <Wrapper isActive={selectedItem === value} onClick={handleClick}>
16
+ <IntlText id={getTrad(`sort.${label}`)} lineHeight="27px" />
17
+ </Wrapper>
18
+ );
19
+ };
20
+
21
+ SortListItem.defaultProps = {
22
+ selectedItem: null,
23
+ label: '',
24
+ onClick: () => {},
25
+ value: null,
26
+ };
27
+
28
+ SortListItem.propTypes = {
29
+ selectedItem: PropTypes.string,
30
+ label: PropTypes.string,
31
+ onClick: PropTypes.func,
32
+ value: PropTypes.string,
33
+ };
34
+
35
+ export default SortListItem;