@blaze-cms/plugin-media-ui 0.146.0-rc-eagle.0 → 0.146.0-rc-eagle-3.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 (223) hide show
  1. package/CHANGELOG.md +8 -1
  2. package/lib/components/CardMedia/CardMedia.js +96 -52
  3. package/lib/components/CardMedia/CardMedia.js.map +1 -1
  4. package/lib/components/EditMediaFile/EditMediaFile.js +24 -39
  5. package/lib/components/EditMediaFile/EditMediaFile.js.map +1 -1
  6. package/lib/components/EditMediaFile/EditMediaFilePage.js +16 -8
  7. package/lib/components/EditMediaFile/EditMediaFilePage.js.map +1 -1
  8. package/lib/components/FileList/useGetFiles/getFiles.js +6 -3
  9. package/lib/components/FileList/useGetFiles/getFiles.js.map +1 -1
  10. package/lib/components/FileList/useGetFiles/useGetFiles.js +7 -2
  11. package/lib/components/FileList/useGetFiles/useGetFiles.js.map +1 -1
  12. package/lib/components/FileList/useGetFilesList/useGetFilesList.js +4 -1
  13. package/lib/components/FileList/useGetFilesList/useGetFilesList.js.map +1 -1
  14. package/lib/components/FilePreview/Actions/index.js +2 -1
  15. package/lib/components/FilePreview/Actions/index.js.map +1 -1
  16. package/lib/components/FilePreview/Image/imageSchema.js +8 -4
  17. package/lib/components/FilePreview/Image/imageSchema.js.map +1 -1
  18. package/lib/components/FilePreview/PDF/schema.js +2 -1
  19. package/lib/components/FilePreview/PDF/schema.js.map +1 -1
  20. package/lib/components/FilePreview/index.js +47 -3
  21. package/lib/components/FilePreview/index.js.map +1 -1
  22. package/lib/components/FilePreview/previewDefault/previewDefaultSchema.js +2 -1
  23. package/lib/components/FilePreview/previewDefault/previewDefaultSchema.js.map +1 -1
  24. package/lib/components/FilePreviewReadOnly/FilePreviewReadOnly.js +2 -1
  25. package/lib/components/FilePreviewReadOnly/FilePreviewReadOnly.js.map +1 -1
  26. package/lib/components/FileUploadAdapter/FileList.js +2 -1
  27. package/lib/components/FileUploadAdapter/FileList.js.map +1 -1
  28. package/lib/components/FileUploadAdapter/FileUploadAdapter.js +35 -23
  29. package/lib/components/FileUploadAdapter/FileUploadAdapter.js.map +1 -1
  30. package/lib/components/FileUploadModal/FileUploadModal.js +82 -18
  31. package/lib/components/FileUploadModal/FileUploadModal.js.map +1 -1
  32. package/lib/components/FilterPanel/FilterPanel.js +43 -125
  33. package/lib/components/FilterPanel/FilterPanel.js.map +1 -1
  34. package/lib/components/FilterPanel/MediaSearchFilter.js +41 -0
  35. package/lib/components/FilterPanel/MediaSearchFilter.js.map +1 -0
  36. package/lib/components/ListingContainer/Listing/MediaListing/MediaFileList/MediaFileList.js +9 -5
  37. package/lib/components/ListingContainer/Listing/MediaListing/MediaFileList/MediaFileList.js.map +1 -1
  38. package/lib/components/ListingContainer/Listing/MediaListing/MediaListing.js +2 -1
  39. package/lib/components/ListingContainer/Listing/MediaListing/MediaListing.js.map +1 -1
  40. package/lib/components/ListingContainer/ListingContainer.js +6 -2
  41. package/lib/components/ListingContainer/ListingContainer.js.map +1 -1
  42. package/lib/components/MediaListing.js +2 -1
  43. package/lib/components/MediaListing.js.map +1 -1
  44. package/lib/constants.js +3 -2
  45. package/lib/constants.js.map +1 -1
  46. package/lib-es/components/CardMedia/CardMedia.js +276 -0
  47. package/lib-es/components/CardMedia/CardMedia.js.map +1 -0
  48. package/lib-es/components/CardMedia/index.js +3 -0
  49. package/lib-es/components/CardMedia/index.js.map +1 -0
  50. package/lib-es/components/EditMediaFile/EditMediaFile.js +171 -0
  51. package/lib-es/components/EditMediaFile/EditMediaFile.js.map +1 -0
  52. package/lib-es/components/EditMediaFile/EditMediaFilePage.js +116 -0
  53. package/lib-es/components/EditMediaFile/EditMediaFilePage.js.map +1 -0
  54. package/lib-es/components/EditMediaFile/index.js +3 -0
  55. package/lib-es/components/EditMediaFile/index.js.map +1 -0
  56. package/lib-es/components/EditorAdapter/EditorAdapter.js +59 -0
  57. package/lib-es/components/EditorAdapter/EditorAdapter.js.map +1 -0
  58. package/lib-es/components/EditorAdapter/index.js +3 -0
  59. package/lib-es/components/EditorAdapter/index.js.map +1 -0
  60. package/lib-es/components/FileList/FilesListContext/index.js +4 -0
  61. package/lib-es/components/FileList/FilesListContext/index.js.map +1 -0
  62. package/lib-es/components/FileList/FilesListProvider/index.js +36 -0
  63. package/lib-es/components/FileList/FilesListProvider/index.js.map +1 -0
  64. package/lib-es/components/FileList/useFileList/index.js +5 -0
  65. package/lib-es/components/FileList/useFileList/index.js.map +1 -0
  66. package/lib-es/components/FileList/useGetFiles/getFiles.js +182 -0
  67. package/lib-es/components/FileList/useGetFiles/getFiles.js.map +1 -0
  68. package/lib-es/components/FileList/useGetFiles/index.js +3 -0
  69. package/lib-es/components/FileList/useGetFiles/index.js.map +1 -0
  70. package/lib-es/components/FileList/useGetFiles/useGetFiles.js +119 -0
  71. package/lib-es/components/FileList/useGetFiles/useGetFiles.js.map +1 -0
  72. package/lib-es/components/FileList/useGetFilesList/getCounters.js +11 -0
  73. package/lib-es/components/FileList/useGetFilesList/getCounters.js.map +1 -0
  74. package/lib-es/components/FileList/useGetFilesList/index.js +3 -0
  75. package/lib-es/components/FileList/useGetFilesList/index.js.map +1 -0
  76. package/lib-es/components/FileList/useGetFilesList/useGetFilesList.js +175 -0
  77. package/lib-es/components/FileList/useGetFilesList/useGetFilesList.js.map +1 -0
  78. package/lib-es/components/FilePreview/Actions/index.js +38 -0
  79. package/lib-es/components/FilePreview/Actions/index.js.map +1 -0
  80. package/lib-es/components/FilePreview/Image/Image.js +40 -0
  81. package/lib-es/components/FilePreview/Image/Image.js.map +1 -0
  82. package/lib-es/components/FilePreview/Image/RawImage.js +31 -0
  83. package/lib-es/components/FilePreview/Image/RawImage.js.map +1 -0
  84. package/lib-es/components/FilePreview/Image/imageSchema.js +57 -0
  85. package/lib-es/components/FilePreview/Image/imageSchema.js.map +1 -0
  86. package/lib-es/components/FilePreview/Image/index.js +12 -0
  87. package/lib-es/components/FilePreview/Image/index.js.map +1 -0
  88. package/lib-es/components/FilePreview/ModalContext.js +3 -0
  89. package/lib-es/components/FilePreview/ModalContext.js.map +1 -0
  90. package/lib-es/components/FilePreview/PDF/PDF.js +49 -0
  91. package/lib-es/components/FilePreview/PDF/PDF.js.map +1 -0
  92. package/lib-es/components/FilePreview/PDF/RawPDF.js +33 -0
  93. package/lib-es/components/FilePreview/PDF/RawPDF.js.map +1 -0
  94. package/lib-es/components/FilePreview/PDF/index.js +12 -0
  95. package/lib-es/components/FilePreview/PDF/index.js.map +1 -0
  96. package/lib-es/components/FilePreview/PDF/schema.js +22 -0
  97. package/lib-es/components/FilePreview/PDF/schema.js.map +1 -0
  98. package/lib-es/components/FilePreview/get-preview.js +28 -0
  99. package/lib-es/components/FilePreview/get-preview.js.map +1 -0
  100. package/lib-es/components/FilePreview/index.js +148 -0
  101. package/lib-es/components/FilePreview/index.js.map +1 -0
  102. package/lib-es/components/FilePreview/previewDefault/PreviewDefault.js +41 -0
  103. package/lib-es/components/FilePreview/previewDefault/PreviewDefault.js.map +1 -0
  104. package/lib-es/components/FilePreview/previewDefault/RawPreviewDefault.js +39 -0
  105. package/lib-es/components/FilePreview/previewDefault/RawPreviewDefault.js.map +1 -0
  106. package/lib-es/components/FilePreview/previewDefault/icons/DefaultIcon.js +121 -0
  107. package/lib-es/components/FilePreview/previewDefault/icons/DefaultIcon.js.map +1 -0
  108. package/lib-es/components/FilePreview/previewDefault/icons/index.js +3 -0
  109. package/lib-es/components/FilePreview/previewDefault/icons/index.js.map +1 -0
  110. package/lib-es/components/FilePreview/previewDefault/index.js +12 -0
  111. package/lib-es/components/FilePreview/previewDefault/index.js.map +1 -0
  112. package/lib-es/components/FilePreview/previewDefault/previewDefaultSchema.js +26 -0
  113. package/lib-es/components/FilePreview/previewDefault/previewDefaultSchema.js.map +1 -0
  114. package/lib-es/components/FilePreviewReadOnly/FileList.js +18 -0
  115. package/lib-es/components/FilePreviewReadOnly/FileList.js.map +1 -0
  116. package/lib-es/components/FilePreviewReadOnly/FilePreviewList.js +22 -0
  117. package/lib-es/components/FilePreviewReadOnly/FilePreviewList.js.map +1 -0
  118. package/lib-es/components/FilePreviewReadOnly/FilePreviewReadOnly.js +68 -0
  119. package/lib-es/components/FilePreviewReadOnly/FilePreviewReadOnly.js.map +1 -0
  120. package/lib-es/components/FilePreviewReadOnly/index.js +3 -0
  121. package/lib-es/components/FilePreviewReadOnly/index.js.map +1 -0
  122. package/lib-es/components/FilePreviewReadOnly/mappers/format-initial-value.js +11 -0
  123. package/lib-es/components/FilePreviewReadOnly/mappers/format-initial-value.js.map +1 -0
  124. package/lib-es/components/FilePreviewReadOnly/mappers/index.js +3 -0
  125. package/lib-es/components/FilePreviewReadOnly/mappers/index.js.map +1 -0
  126. package/lib-es/components/FileUploadAdapter/FileList.js +52 -0
  127. package/lib-es/components/FileUploadAdapter/FileList.js.map +1 -0
  128. package/lib-es/components/FileUploadAdapter/FilePreviewList.js +22 -0
  129. package/lib-es/components/FileUploadAdapter/FilePreviewList.js.map +1 -0
  130. package/lib-es/components/FileUploadAdapter/FileReorderList.js +32 -0
  131. package/lib-es/components/FileUploadAdapter/FileReorderList.js.map +1 -0
  132. package/lib-es/components/FileUploadAdapter/FileReorderListItem.js +24 -0
  133. package/lib-es/components/FileUploadAdapter/FileReorderListItem.js.map +1 -0
  134. package/lib-es/components/FileUploadAdapter/FileUploadAdapter.js +402 -0
  135. package/lib-es/components/FileUploadAdapter/FileUploadAdapter.js.map +1 -0
  136. package/lib-es/components/FileUploadAdapter/index.js +3 -0
  137. package/lib-es/components/FileUploadAdapter/index.js.map +1 -0
  138. package/lib-es/components/FileUploadAdapter/mappers/format-initial-value.js +11 -0
  139. package/lib-es/components/FileUploadAdapter/mappers/format-initial-value.js.map +1 -0
  140. package/lib-es/components/FileUploadAdapter/mappers/get-button-text.js +11 -0
  141. package/lib-es/components/FileUploadAdapter/mappers/get-button-text.js.map +1 -0
  142. package/lib-es/components/FileUploadAdapter/mappers/get-format.js +12 -0
  143. package/lib-es/components/FileUploadAdapter/mappers/get-format.js.map +1 -0
  144. package/lib-es/components/FileUploadAdapter/mappers/get-number-files-pending-to-fetch.js +7 -0
  145. package/lib-es/components/FileUploadAdapter/mappers/get-number-files-pending-to-fetch.js.map +1 -0
  146. package/lib-es/components/FileUploadAdapter/mappers/index.js +8 -0
  147. package/lib-es/components/FileUploadAdapter/mappers/index.js.map +1 -0
  148. package/lib-es/components/FileUploadAdapter/mappers/is-unselecting.js +2 -0
  149. package/lib-es/components/FileUploadAdapter/mappers/is-unselecting.js.map +1 -0
  150. package/lib-es/components/FileUploadAdapter/mappers/transform-to-array.js +2 -0
  151. package/lib-es/components/FileUploadAdapter/mappers/transform-to-array.js.map +1 -0
  152. package/lib-es/components/FileUploadAdapter/useLimit.js +13 -0
  153. package/lib-es/components/FileUploadAdapter/useLimit.js.map +1 -0
  154. package/lib-es/components/FileUploadModal/FileUploadModal.js +241 -0
  155. package/lib-es/components/FileUploadModal/FileUploadModal.js.map +1 -0
  156. package/lib-es/components/FileUploadModal/index.js +3 -0
  157. package/lib-es/components/FileUploadModal/index.js.map +1 -0
  158. package/lib-es/components/FilterPanel/FilterPanel.js +55 -0
  159. package/lib-es/components/FilterPanel/FilterPanel.js.map +1 -0
  160. package/lib-es/components/FilterPanel/MediaSearchFilter.js +34 -0
  161. package/lib-es/components/FilterPanel/MediaSearchFilter.js.map +1 -0
  162. package/lib-es/components/FilterPanel/index.js +3 -0
  163. package/lib-es/components/FilterPanel/index.js.map +1 -0
  164. package/lib-es/components/ListingContainer/Listing/Listing.js +70 -0
  165. package/lib-es/components/ListingContainer/Listing/Listing.js.map +1 -0
  166. package/lib-es/components/ListingContainer/Listing/MediaListing/MediaFileList/MediaFileList.js +156 -0
  167. package/lib-es/components/ListingContainer/Listing/MediaListing/MediaFileList/MediaFileList.js.map +1 -0
  168. package/lib-es/components/ListingContainer/Listing/MediaListing/MediaFileList/index.js +3 -0
  169. package/lib-es/components/ListingContainer/Listing/MediaListing/MediaFileList/index.js.map +1 -0
  170. package/lib-es/components/ListingContainer/Listing/MediaListing/MediaListing.js +33 -0
  171. package/lib-es/components/ListingContainer/Listing/MediaListing/MediaListing.js.map +1 -0
  172. package/lib-es/components/ListingContainer/Listing/MediaListing/index.js +3 -0
  173. package/lib-es/components/ListingContainer/Listing/MediaListing/index.js.map +1 -0
  174. package/lib-es/components/ListingContainer/Listing/index.js +3 -0
  175. package/lib-es/components/ListingContainer/Listing/index.js.map +1 -0
  176. package/lib-es/components/ListingContainer/ListingContainer.js +118 -0
  177. package/lib-es/components/ListingContainer/ListingContainer.js.map +1 -0
  178. package/lib-es/components/ListingContainer/index.js +3 -0
  179. package/lib-es/components/ListingContainer/index.js.map +1 -0
  180. package/lib-es/components/ListingContainer/mappers/exist-previous.js +3 -0
  181. package/lib-es/components/ListingContainer/mappers/exist-previous.js.map +1 -0
  182. package/lib-es/components/ListingContainer/mappers/index.js +3 -0
  183. package/lib-es/components/ListingContainer/mappers/index.js.map +1 -0
  184. package/lib-es/components/MediaListing.js +29 -0
  185. package/lib-es/components/MediaListing.js.map +1 -0
  186. package/lib-es/constants.js +37 -0
  187. package/lib-es/constants.js.map +1 -0
  188. package/lib-es/icons/MediaLibraryIcon.js +70 -0
  189. package/lib-es/icons/MediaLibraryIcon.js.map +1 -0
  190. package/lib-es/icons/index.js +3 -0
  191. package/lib-es/icons/index.js.map +1 -0
  192. package/lib-es/index.js +77 -0
  193. package/lib-es/index.js.map +1 -0
  194. package/lib-es/utils/available-filters/available-filters.js +26 -0
  195. package/lib-es/utils/available-filters/available-filters.js.map +1 -0
  196. package/lib-es/utils/bustUrl.js +7 -0
  197. package/lib-es/utils/bustUrl.js.map +1 -0
  198. package/lib-es/utils/media-context/index.js +4 -0
  199. package/lib-es/utils/media-context/index.js.map +1 -0
  200. package/lib-es/utils/media-context/media-context.js +6 -0
  201. package/lib-es/utils/media-context/media-context.js.map +1 -0
  202. package/lib-es/utils/media-context/useMediaContext.js +4 -0
  203. package/lib-es/utils/media-context/useMediaContext.js.map +1 -0
  204. package/package.json +16 -9
  205. package/src/components/CardMedia/CardMedia.js +119 -89
  206. package/src/components/EditMediaFile/EditMediaFile.js +20 -21
  207. package/src/components/EditMediaFile/EditMediaFilePage.js +12 -7
  208. package/src/components/FileList/useGetFiles/getFiles.js +12 -4
  209. package/src/components/FileList/useGetFiles/useGetFiles.js +3 -4
  210. package/src/components/FileList/useGetFilesList/useGetFilesList.js +2 -1
  211. package/src/components/FilePreview/Image/imageSchema.js +8 -4
  212. package/src/components/FilePreview/PDF/schema.js +2 -1
  213. package/src/components/FilePreview/index.js +36 -2
  214. package/src/components/FilePreview/previewDefault/previewDefaultSchema.js +2 -1
  215. package/src/components/FileUploadAdapter/FileUploadAdapter.js +24 -14
  216. package/src/components/FileUploadModal/FileUploadModal.js +71 -6
  217. package/src/components/FilterPanel/FilterPanel.js +44 -129
  218. package/src/components/FilterPanel/MediaSearchFilter.js +32 -0
  219. package/src/components/ListingContainer/Listing/MediaListing/MediaFileList/MediaFileList.js +7 -2
  220. package/src/components/ListingContainer/ListingContainer.js +4 -1
  221. package/src/constants.js +16 -2
  222. package/babel.config.js +0 -3
  223. package/jest.config.js +0 -5
@@ -1,7 +1,15 @@
1
1
  import { getQuery } from '@blaze-cms/admin-ui-utils';
2
2
  import { ALL, INVALID_STORE_KEY_VALUES } from '../../../constants';
3
3
 
4
- const getFromSearch = async ({ searchTerm, offset, limit, where, client, fileStores = [] }) => {
4
+ const getFromSearch = async ({
5
+ searchTerm,
6
+ offset,
7
+ limit,
8
+ where,
9
+ client,
10
+ fileStores = [],
11
+ esFilters = []
12
+ }) => {
5
13
  const allTypesMatches = [
6
14
  {
7
15
  match: { type: 'image' }
@@ -19,7 +27,7 @@ const getFromSearch = async ({ searchTerm, offset, limit, where, client, fileSto
19
27
  }
20
28
  ];
21
29
  const match = !where.type || where.type === ALL ? allTypesMatches : matchSpecificType;
22
- const mustMatch = [];
30
+ const mustMatch = [...esFilters];
23
31
 
24
32
  if (searchTerm) {
25
33
  mustMatch.push({
@@ -160,7 +168,7 @@ const getFromSearch = async ({ searchTerm, offset, limit, where, client, fileSto
160
168
  return { files, all, image, video, text };
161
169
  };
162
170
 
163
- const getFiles = ({ offset, limit, where, searchTerm, fileStores }, client) =>
164
- getFromSearch({ searchTerm, offset, limit, where, client, fileStores });
171
+ const getFiles = ({ searchTerm, offset, limit, where, esFilters, fileStores }, client) =>
172
+ getFromSearch({ searchTerm, offset, limit, where, esFilters, client, fileStores });
165
173
 
166
174
  export default getFiles;
@@ -29,8 +29,8 @@ function useGetFiles() {
29
29
 
30
30
  useEffect(
31
31
  () => {
32
- const { offset, limit, where, sort, searchTerm, isSearch } = queryParams;
33
- const newFilter = JSON.stringify(where);
32
+ const { offset, limit, where, sort, searchTerm, isSearch, esFilters } = queryParams;
33
+ const newFilter = JSON.stringify({ where, esFilters });
34
34
  const isNewFilterSet = newFilter !== previousFilter;
35
35
  const isNewOffsetSet = previousOffset !== null && offset !== previousOffset;
36
36
  const isNewSearchTermSet = searchTerm && previousSearchTerm !== searchTerm;
@@ -41,9 +41,8 @@ function useGetFiles() {
41
41
  if (data.files.length) {
42
42
  setData({ files: [] });
43
43
  }
44
-
45
44
  const { files, total, all, image, video, text } = await getFiles(
46
- { offset, limit, where, sort, searchTerm, isSearch, fileStores },
45
+ { offset, limit, where, sort, searchTerm, isSearch, esFilters, fileStores },
47
46
  client
48
47
  );
49
48
  setData({ files, total, all, image, video, text });
@@ -137,8 +137,9 @@ function useGetFilesList() {
137
137
  const setQueryParams = params => {
138
138
  const isNewSearchTerm = params.isSearch && previousSearchTerm !== params.searchTerm;
139
139
  const hasDeletedSearchTerm = previousSearchTerm && params.searchTerm === null;
140
- const newFilter = JSON.stringify(params.where);
140
+ const newFilter = JSON.stringify({ where: params.where, esFilters: params.esFilters });
141
141
  const isNewFilter = newFilter !== previousFilter;
142
+
142
143
  const shouldClearList = hasDeletedSearchTerm || isNewFilter || isNewSearchTerm;
143
144
  shouldClearList ? clearList(params) : setParams(params);
144
145
  setCurrentFilter(newFilter);
@@ -23,19 +23,22 @@ const imageSchema = {
23
23
  showInForm: true,
24
24
  label: 'Alt text',
25
25
  formFieldType: 'text',
26
- formPriority: 3.0
26
+ formPriority: 3.0,
27
+ isDataPropery: true
27
28
  },
28
29
  caption: {
29
30
  type: 'string',
30
31
  showInForm: true,
31
32
  formFieldType: 'text',
32
- formPriority: 4.0
33
+ formPriority: 4.0,
34
+ isDataPropery: true
33
35
  },
34
36
  credits: {
35
37
  type: 'string',
36
38
  showInForm: true,
37
39
  formFieldType: 'text',
38
- formPriority: 5.0
40
+ formPriority: 5.0,
41
+ isDataPropery: true
39
42
  },
40
43
  hrefUrl: {
41
44
  type: 'string',
@@ -43,7 +46,8 @@ const imageSchema = {
43
46
  label: 'Image hyperlink',
44
47
  showInForm: true,
45
48
  formFieldType: 'text',
46
- description: 'Url format is not valid'
49
+ description: 'Url format is not valid',
50
+ isDataPropery: true
47
51
  }
48
52
  },
49
53
  required: ['name']
@@ -11,7 +11,8 @@ const PDFSchema = {
11
11
  caption: {
12
12
  type: 'string',
13
13
  showInForm: true,
14
- formFieldType: 'text'
14
+ formFieldType: 'text',
15
+ isDataPropery: true
15
16
  }
16
17
  },
17
18
  required: ['name']
@@ -1,7 +1,10 @@
1
1
  import React from 'react';
2
2
  import { FormBuilder } from '@blaze-cms/react-form-builder';
3
3
  import PropTypes from 'prop-types';
4
+ import { useQuery } from '@apollo/client';
5
+ import { getQuery, getDynamicQuery } from '@blaze-cms/admin-ui-utils';
4
6
  import { getPreview } from './get-preview';
7
+ import { FILE_DEFAULT_PROPS } from '../../constants';
5
8
 
6
9
  const FilePreview = ({
7
10
  file,
@@ -13,7 +16,34 @@ const FilePreview = ({
13
16
  showChangeButton,
14
17
  disableFilePreview
15
18
  }) => {
16
- const { name, url, mimetype, data, store, updated } = file;
19
+ const {
20
+ data: schemaData = {
21
+ getEntitySchemas: [
22
+ {
23
+ properties: {},
24
+ actions: {
25
+ get: 'getFile'
26
+ }
27
+ }
28
+ ]
29
+ },
30
+ loading: schemaLoading
31
+ } = useQuery(getQuery('GET_ENTITY_SCHEMA'), {
32
+ variables: { identifier: 'file' }
33
+ });
34
+
35
+ const [fileSchema] = schemaData && schemaData.getEntitySchemas ? schemaData.getEntitySchemas : [];
36
+
37
+ const fileQuery = getDynamicQuery('DATA_QUERY')(fileSchema, file.id, null, FILE_DEFAULT_PROPS);
38
+ const { loading, data: { entityData: fileData } = {} } = useQuery(fileQuery, {
39
+ variables: { id: file.id },
40
+ fetchPolicy: 'cache-and-network',
41
+ skip: !fileSchema || !fileSchema.id
42
+ });
43
+
44
+ if (!fileSchema || schemaLoading || loading) return null;
45
+
46
+ const { name, url, mimetype, data, store, updated } = fileData;
17
47
  const bustUrl = (srcUrl, version) => {
18
48
  if (!srcUrl) return srcUrl;
19
49
  const sep = srcUrl.includes('?') ? '&' : '?';
@@ -23,6 +53,10 @@ const FilePreview = ({
23
53
  const [Preview, schema] = getPreview({ mimetype, previewType });
24
54
  const shouldRenderForm = schema && displayForm;
25
55
 
56
+ const { properties } = fileSchema;
57
+ const { name: nameProp, storeKey: storeKeyProp, ...restProperties } = properties;
58
+ Object.assign(schema.formSchema.properties, restProperties);
59
+
26
60
  if (shouldRenderForm && store) {
27
61
  const { defaultStore = {}, storeOptions = [] } = store;
28
62
  if (schema.formSchema.properties.storeKey) {
@@ -34,7 +68,7 @@ const FilePreview = ({
34
68
  }
35
69
  }
36
70
 
37
- const formBuilderData = { values: { ...data, ...file } };
71
+ const formBuilderData = { values: { ...data, ...fileData } };
38
72
 
39
73
  return (
40
74
  <>
@@ -15,7 +15,8 @@ const previewDefaultSchema = {
15
15
  label: 'url',
16
16
  showInForm: true,
17
17
  formFieldType: 'text',
18
- description: 'Url format is not valid'
18
+ description: 'Url format is not valid',
19
+ isDataPropery: true
19
20
  }
20
21
  },
21
22
  required: ['name']
@@ -1,9 +1,8 @@
1
1
  import React, { useState, useContext, useEffect } from 'react';
2
2
  import FileUpload from '@blaze-react/file-upload';
3
3
  import PropTypes from 'prop-types';
4
- import { useApolloClient } from '@apollo/client';
4
+ import { useApolloClient, useQuery } from '@apollo/client';
5
5
  import { getQuery, getMutation, ModalAdapter as Modal } from '@blaze-cms/admin-ui-utils';
6
- import { parseFormValues } from '@blaze-cms/react-form-builder';
7
6
  import { useToasts } from '@blaze-react/toaster';
8
7
  import Tooltip from '@blaze-react/tooltip';
9
8
  import { MORE } from '../../constants';
@@ -49,6 +48,13 @@ const FileUploadAdapter = ({
49
48
  const client = useApolloClient();
50
49
  const { addToast } = useToasts();
51
50
 
51
+ const { data: { getEntitySchemas: [schemaData] = [] } = {} } = useQuery(
52
+ getQuery('GET_ENTITY_SCHEMA'),
53
+ {
54
+ variables: { identifier: 'file' }
55
+ }
56
+ );
57
+
52
58
  const getFiles = async (offset, ids, fetchAll = previewAllFiles) => {
53
59
  const {
54
60
  data: { files: newFiles }
@@ -175,18 +181,22 @@ const FileUploadAdapter = ({
175
181
  };
176
182
 
177
183
  const handleEditFileForm = editedFile => {
178
- const values = parseFormValues(editedFile.valuesChecked);
184
+ const dataValues = editedFile.valuesChecked.reduce(
185
+ (acc, { id: formValueId, value: formValue, isDataPropery }) => {
186
+ if (isDataPropery) {
187
+ acc.data[formValueId] = formValue;
188
+ } else {
189
+ acc[formValueId] = formValue;
190
+ }
191
+ return acc;
192
+ },
193
+ { id: editFile.id, data: { ...editFile.data } }
194
+ );
195
+ delete dataValues.data.__typename; // Remove __typename if it exists in data to avoid issues with Apollo cache.
179
196
 
180
- const { altText, caption, credits, hrefUrl, name } = values;
181
197
  setEditFile({
182
198
  ...editFile,
183
- name,
184
- data: {
185
- altText,
186
- caption,
187
- credits,
188
- hrefUrl
189
- }
199
+ formData: dataValues
190
200
  });
191
201
  };
192
202
 
@@ -221,7 +231,7 @@ const FileUploadAdapter = ({
221
231
  {
222
232
  textButton: 'Apply',
223
233
  callback: async () => {
224
- const { name, id: editedFileId, data } = editFile;
234
+ const { name, id: editedFileId, data, formData } = editFile;
225
235
  const updatedSelectedFiles = selectedFiles.map(selectedFile => {
226
236
  if (selectedFile.id === editedFileId) {
227
237
  return { ...selectedFile, name, data };
@@ -235,8 +245,7 @@ const FileUploadAdapter = ({
235
245
  mutation: getMutation('UPDATE_FILE'),
236
246
  variables: {
237
247
  input: {
238
- name,
239
- data,
248
+ ...formData,
240
249
  id: editedFileId
241
250
  }
242
251
  },
@@ -324,6 +333,7 @@ const FileUploadAdapter = ({
324
333
  displayForm
325
334
  previewType="card"
326
335
  disableFilePreview={disableFilePreview}
336
+ schemaData={schemaData}
327
337
  />
328
338
  </Modal>
329
339
  )}
@@ -1,6 +1,7 @@
1
- import React, { useState } from 'react';
1
+ import React, { useState, useMemo } from 'react';
2
2
  import { ModalAdapter as Modal, getMutation, getQuery } from '@blaze-cms/admin-ui-utils';
3
3
  import FileUpload from '@blaze-react/file-upload';
4
+ import { getFormBuilderLookup } from '@blaze-cms/react-form-builder';
4
5
  import PropTypes from 'prop-types';
5
6
  import { useToasts } from '@blaze-react/toaster';
6
7
  import { useApolloClient, useQuery } from '@apollo/client';
@@ -20,10 +21,57 @@ const FileUploadModal = ({
20
21
  const client = useApolloClient();
21
22
  const { addNewFile } = useFileList();
22
23
 
24
+ const { data: { getEntitySchemas: [schemaData] = [] } = {}, loading: schemaLoading } = useQuery(
25
+ getQuery('GET_ENTITY_SCHEMA'),
26
+ {
27
+ variables: { identifier: 'file' }
28
+ }
29
+ );
30
+
31
+ const customFields = useMemo(() => {
32
+ if (schemaData && schemaData.properties) {
33
+ const { name: _name, storeKey: _storeKey, ...restProperties } = schemaData.properties;
34
+ return Object.entries(restProperties)
35
+ .filter(([, field]) => field && field.showInForm === true)
36
+ .map(([key, field]) => {
37
+ const Component = getFormBuilderLookup.getFormField(field.formFieldType);
38
+ return {
39
+ name: key,
40
+ label: field.label || key,
41
+ component: props => (
42
+ <Component
43
+ {...field}
44
+ {...props}
45
+ onChange={(...args) => {
46
+ const [event] = args;
47
+ if (!event.value) {
48
+ event.value = event.event.target ? event.event.target.value : event.value;
49
+ }
50
+ if (event.event.target && !event.event.target.id) {
51
+ event.event.target.id = props.id || key;
52
+ }
53
+ if (event.event.target) {
54
+ event.event.target.name = key;
55
+ }
56
+ return props.onChange(...args);
57
+ }}
58
+ />
59
+ )
60
+ };
61
+ });
62
+ }
63
+ return [];
64
+ }, [schemaData]);
65
+
23
66
  const fileStoresType = getQuery('GET_FILE_STORES');
24
- const { data: { getFileStores: storeType = [] } = {} } = useQuery(fileStoresType, {
25
- variables: { visibleInAdmin: true }
26
- });
67
+ const { data: { getFileStores: storeType = [] } = {}, loading: storeLoading } = useQuery(
68
+ fileStoresType,
69
+ {
70
+ variables: { visibleInAdmin: true }
71
+ }
72
+ );
73
+
74
+ if (schemaLoading || storeLoading) return null;
27
75
 
28
76
  const handleFiles = filesToUpload => {
29
77
  if (fileId && filesToUpload && filesToUpload.length) {
@@ -37,12 +85,28 @@ const FileUploadModal = ({
37
85
  const filesToProcess = fileId && files.length ? [files[0]] : files;
38
86
 
39
87
  const response = await Promise.all(
40
- filesToProcess.map(({ file, name, data, storeKey: fileStoreKey }) => {
88
+ filesToProcess.map(fileData => {
89
+ const { file, name, data: dataProperties = {}, storeKey: fileStoreKey } = fileData;
90
+ const customProperties = customFields.map(
91
+ ({ name: customPropertyName }) => customPropertyName
92
+ );
93
+ const otherProperties = Object.entries(dataProperties).reduce(
94
+ (acc, [key, value]) => {
95
+ if (customProperties.includes(key)) {
96
+ acc.fileProperties[key] = value;
97
+ } else {
98
+ acc.data[key] = value;
99
+ }
100
+ return acc;
101
+ },
102
+ { data: {}, fileProperties: {} }
103
+ );
41
104
  const payload = {
42
105
  name,
43
106
  storeKey: fileStoreKey || selectedStoreKey || storeKey,
44
- data
107
+ ...otherProperties
45
108
  };
109
+
46
110
  if (fileId) {
47
111
  payload.id = fileId;
48
112
  } else if (!name) {
@@ -129,6 +193,7 @@ const FileUploadModal = ({
129
193
  storeKey={selectedStoreKey || storeKey}
130
194
  onChange={handleFiles}
131
195
  selectOptions={storeOptions}
196
+ customFields={customFields}
132
197
  />
133
198
  </Modal>
134
199
  );
@@ -1,138 +1,53 @@
1
- /* eslint-disable jsx-a11y/no-static-element-interactions */
2
- /* eslint-disable jsx-a11y/anchor-is-valid */
3
- import React, { useState, useEffect } from 'react';
4
- import { SearchBar } from '@blaze-cms/plugin-search-ui';
5
- import classnames from 'classnames';
6
- import Select from '@blaze-react/select';
1
+ import React from 'react';
2
+ import MediaSearchFilter from './MediaSearchFilter';
7
3
  import { useMediaContext, MediaContext } from '../../utils/media-context';
8
- import useFileList from '../FileList/useFileList';
9
4
 
10
5
  const FilterPanel = () => {
11
- const [searchTerm, setSearchTerm] = useState('');
12
- const { filters, selectedFilter, changeSelectedFilter, fileStores } =
13
- useMediaContext(MediaContext);
14
- const { queryParams, data } = useFileList();
15
- const [active, setActive] = useState(filters[0].id);
16
-
17
- useEffect(() => {
18
- if (queryParams.searchTerm === null) {
19
- setSearchTerm('');
20
- }
21
- }, [queryParams.searchTerm]);
22
-
23
- const handleSearchTerm = ({ target: { value } }) => {
24
- setSearchTerm(value);
25
- };
26
-
27
- const storeKey = selectedFilter.storeKey || '';
28
-
29
- const onChangeFilter = id => {
30
- setActive(id);
31
- searchTerm
32
- ? changeSelectedFilter({
33
- filter: id,
34
- isSearch: true,
35
- searchTerm,
36
- storeKey
37
- })
38
- : changeSelectedFilter({
39
- filter: id,
40
- isSearch: false,
41
- searchTerm: null,
42
- storeKey
43
- });
6
+ const { filters, selectedFilter, changeSelectedFilter } = useMediaContext(MediaContext);
7
+
8
+ const handleOnSelectFilter = (esFilters = []) => {
9
+ let nextSearchTerm = null;
10
+ let nextFilterId = selectedFilter.filter;
11
+ let nextStoreKey = selectedFilter.storeKey || '';
12
+
13
+ esFilters.forEach(filterObj => {
14
+ const { simple_query_string: simpleQueryString, match } = filterObj || {};
15
+
16
+ if (simpleQueryString) {
17
+ const { query } = simpleQueryString;
18
+ if (query != null) {
19
+ nextSearchTerm = String(query).trim();
20
+ }
21
+ }
22
+
23
+ if (match) {
24
+ const { 'type.keyword': typeKeyword, 'storeKey.keyword': storeKeyKeyword } = match;
25
+
26
+ if (typeKeyword && typeKeyword.query != null) {
27
+ nextFilterId = typeKeyword.query;
28
+ }
29
+
30
+ if (storeKeyKeyword && storeKeyKeyword.query != null) {
31
+ nextStoreKey = storeKeyKeyword.query;
32
+ }
33
+ }
34
+ });
35
+
36
+ changeSelectedFilter({
37
+ filter: nextFilterId,
38
+ isSearch: Boolean(nextSearchTerm),
39
+ searchTerm: nextSearchTerm || null,
40
+ storeKey: nextStoreKey,
41
+ esFilters
42
+ });
44
43
  };
45
44
 
46
- const handleKeyDown = ({ key }) => {
47
- if (key === 'Enter') {
48
- searchTerm
49
- ? changeSelectedFilter({
50
- filter: selectedFilter.filter,
51
- isSearch: true,
52
- searchTerm: searchTerm.trim(),
53
- storeKey
54
- })
55
- : changeSelectedFilter({
56
- filter: selectedFilter.filter,
57
- isSearch: false,
58
- searchTerm: null,
59
- storeKey
60
- });
61
- }
62
- };
63
-
64
- const onSelectFilter = ({ value }) => {
65
- searchTerm
66
- ? changeSelectedFilter({
67
- filter: selectedFilter.filter,
68
- isSearch: true,
69
- searchTerm: searchTerm.trim(),
70
- storeKey: value
71
- })
72
- : changeSelectedFilter({
73
- filter: selectedFilter.filter,
74
- isSearch: false,
75
- searchTerm: null,
76
- storeKey: value
77
- });
78
- };
79
-
80
- const activeSegements = filters.reduce((acc, { id }, index) => {
81
- acc[`active-${index}`] = active === id;
82
- return acc;
83
- }, {});
84
- const activeBarSegment = classnames('filter-panel__barWrapper--active', activeSegements);
85
- const storeOptions = (fileStores || []).map(type => [type.key, type.name]);
86
-
87
45
  return (
88
- <div className="filter-panel">
89
- <div className="filter-panel__wrapper">
90
- <ul className="filter-panel__list">
91
- {filters.map(({ label, id }) =>
92
- selectedFilter.filter !== id ? (
93
- <li key={label} className="filter-panel__list-item">
94
- <a onClick={() => onChangeFilter(id)}>
95
- {label} ({data[id]})
96
- </a>
97
- </li>
98
- ) : (
99
- <li key={label} className="filter-panel__list-item active">
100
- {label} ({data[id]})
101
- </li>
102
- )
103
- )}
104
- </ul>
105
- <div className="filter-panel__barWrapper">
106
- <div className={activeBarSegment} />
107
- </div>
108
- </div>
109
- <div className="filter-panel__searchBarWrapper">
110
- <div className="select__wrapper">
111
- <Select
112
- name="filter"
113
- defaultTextValue="Any"
114
- options={storeOptions}
115
- onChange={onSelectFilter}
116
- selected={selectedFilter.storeKey}
117
- />
118
- </div>
119
- <SearchBar
120
- search={() =>
121
- changeSelectedFilter({
122
- filter: selectedFilter.filter,
123
- isSearch: true,
124
- searchTerm,
125
- storeKey: selectedFilter.storeKey
126
- })
127
- }
128
- handleKeyDown={handleKeyDown}
129
- searchTerm={searchTerm}
130
- handleSearchTerm={handleSearchTerm}
131
- placeholder="Search term here..."
132
- close={false}
133
- />
134
- </div>
135
- </div>
46
+ <MediaSearchFilter
47
+ selectedFilter={selectedFilter}
48
+ listFilters={filters}
49
+ updateListingFilters={handleOnSelectFilter}
50
+ />
136
51
  );
137
52
  };
138
53
 
@@ -0,0 +1,32 @@
1
+ import { useQuery } from '@apollo/client';
2
+ import React from 'react';
3
+ import PropTypes from 'prop-types';
4
+ import { getQuery } from '@blaze-cms/admin-ui-utils';
5
+ import { SearchFilter } from '@blaze-cms/plugin-data-ui';
6
+
7
+ const MediaSearchFilter = ({ selectedFilter, listFilters, updateListingFilters }) => {
8
+ const { data } = useQuery(getQuery('GET_ENTITY_SCHEMA'), {
9
+ variables: { identifier: 'file' }
10
+ });
11
+
12
+ const getEntitySchemas = data?.getEntitySchemas ?? [];
13
+
14
+ if (!getEntitySchemas.length) return null;
15
+
16
+ return (
17
+ <SearchFilter
18
+ schema={getEntitySchemas[0]}
19
+ listFilters={listFilters}
20
+ setListFilters={updateListingFilters}
21
+ values={selectedFilter.defaultFilters}
22
+ />
23
+ );
24
+ };
25
+
26
+ MediaSearchFilter.propTypes = {
27
+ selectedFilter: PropTypes.object.isRequired,
28
+ updateListingFilters: PropTypes.func.isRequired,
29
+ listFilters: PropTypes.array.isRequired
30
+ };
31
+
32
+ export default MediaSearchFilter;
@@ -34,6 +34,8 @@ const MediaFileList = ({
34
34
 
35
35
  useEffect(() => {
36
36
  if (!loading && !hasFiles) setDisplayCardPrompt(true);
37
+ if (!loading) setDisplayCardPrompt(false);
38
+ if (hasFiles) setDisplayCardPrompt(false);
37
39
  }, [loading, hasFiles, setDisplayCardPrompt]);
38
40
 
39
41
  useEffect(
@@ -41,6 +43,7 @@ const MediaFileList = ({
41
43
  setVerifiedRanges([]);
42
44
  setCurrentListIndex(0);
43
45
  setQueryParams({
46
+ ...selectedFilter,
44
47
  where: {
45
48
  ...AVAILABLE_FILTER_TYPES[selectedFilter.filter],
46
49
  storeKey: selectedFilter.storeKey
@@ -54,7 +57,8 @@ const MediaFileList = ({
54
57
  selectedFilter.filter,
55
58
  selectedFilter.storeKey,
56
59
  selectedFilter.isSearch,
57
- selectedFilter.searchTerm
60
+ selectedFilter.searchTerm,
61
+ selectedFilter.esFilters
58
62
  ]
59
63
  );
60
64
 
@@ -70,7 +74,8 @@ const MediaFileList = ({
70
74
  storeKey: selectedFilter.storeKey
71
75
  },
72
76
  isSearch: selectedFilter.isSearch,
73
- searchTerm: selectedFilter.searchTerm
77
+ searchTerm: selectedFilter.searchTerm,
78
+ esFilters: selectedFilter.esFilters
74
79
  });
75
80
  setVerifiedRanges([...verifiedRanges, loadIndex]);
76
81
  setCurrentListIndex(startIndex + MEDIA_OVER_SCAN_COUNT);
@@ -67,7 +67,10 @@ const ListingContainer = ({
67
67
  changeSelectedFilter: value => setSelectedFilter(value),
68
68
  selectedFilter: {
69
69
  ...selectedFilter,
70
- storeKey: selectedFilter.storeKey || defaultFileStore
70
+ storeKey: selectedFilter.storeKey || defaultFileStore,
71
+ defaultFilters: {
72
+ storeKey: selectedFilter.storeKey || defaultFileStore
73
+ }
71
74
  },
72
75
  selectedFiles,
73
76
  getSelectedFiles,