@blaze-cms/plugin-media-ui 0.146.0-node18-core-styles-tooltips.58 → 0.146.0-node18-tooltips.45

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 (118) hide show
  1. package/CHANGELOG.md +29 -88
  2. package/lib/components/CardMedia/CardMedia.js +107 -50
  3. package/lib/components/CardMedia/CardMedia.js.map +1 -1
  4. package/lib/components/EditMediaFile/EditMediaFile.js +31 -45
  5. package/lib/components/EditMediaFile/EditMediaFile.js.map +1 -1
  6. package/lib/components/EditMediaFile/EditMediaFilePage.js +18 -9
  7. package/lib/components/EditMediaFile/EditMediaFilePage.js.map +1 -1
  8. package/lib/components/FileList/useGetFiles/getFiles.js +13 -12
  9. package/lib/components/FileList/useGetFiles/getFiles.js.map +1 -1
  10. package/lib/components/FileList/useGetFiles/useGetFiles.js +8 -4
  11. package/lib/components/FileList/useGetFiles/useGetFiles.js.map +1 -1
  12. package/lib/components/FileList/useGetFilesList/getCounters.js +1 -1
  13. package/lib/components/FileList/useGetFilesList/getCounters.js.map +1 -1
  14. package/lib/components/FileList/useGetFilesList/useGetFilesList.js +4 -2
  15. package/lib/components/FileList/useGetFilesList/useGetFilesList.js.map +1 -1
  16. package/lib/components/FilePreview/Actions/index.js +1 -1
  17. package/lib/components/FilePreview/Actions/index.js.map +1 -1
  18. package/lib/components/FilePreview/Image/Image.js.map +1 -1
  19. package/lib/components/FilePreview/Image/imageSchema.js +8 -4
  20. package/lib/components/FilePreview/Image/imageSchema.js.map +1 -1
  21. package/lib/components/FilePreview/PDF/PDF.js.map +1 -1
  22. package/lib/components/FilePreview/PDF/schema.js +2 -1
  23. package/lib/components/FilePreview/PDF/schema.js.map +1 -1
  24. package/lib/components/FilePreview/index.js +51 -9
  25. package/lib/components/FilePreview/index.js.map +1 -1
  26. package/lib/components/FilePreview/previewDefault/PreviewDefault.js.map +1 -1
  27. package/lib/components/FilePreview/previewDefault/previewDefaultSchema.js +2 -1
  28. package/lib/components/FilePreview/previewDefault/previewDefaultSchema.js.map +1 -1
  29. package/lib/components/FilePreviewReadOnly/FilePreviewList.js +0 -1
  30. package/lib/components/FilePreviewReadOnly/FilePreviewList.js.map +1 -1
  31. package/lib/components/FilePreviewReadOnly/FilePreviewReadOnly.js +3 -3
  32. package/lib/components/FilePreviewReadOnly/FilePreviewReadOnly.js.map +1 -1
  33. package/lib/components/FileUploadAdapter/FileList.js +1 -1
  34. package/lib/components/FileUploadAdapter/FileList.js.map +1 -1
  35. package/lib/components/FileUploadAdapter/FilePreviewList.js +0 -1
  36. package/lib/components/FileUploadAdapter/FilePreviewList.js.map +1 -1
  37. package/lib/components/FileUploadAdapter/FileReorderList.js.map +1 -1
  38. package/lib/components/FileUploadAdapter/FileUploadAdapter.js +50 -36
  39. package/lib/components/FileUploadAdapter/FileUploadAdapter.js.map +1 -1
  40. package/lib/components/FileUploadModal/FileUploadModal.js +3 -3
  41. package/lib/components/FileUploadModal/FileUploadModal.js.map +1 -1
  42. package/lib/components/FilterPanel/FilterPanel.js +42 -141
  43. package/lib/components/FilterPanel/FilterPanel.js.map +1 -1
  44. package/lib/components/FilterPanel/MediaSearchFilter.js +40 -0
  45. package/lib/components/FilterPanel/MediaSearchFilter.js.map +1 -0
  46. package/lib/components/ListingContainer/Listing/Listing.js.map +1 -1
  47. package/lib/components/ListingContainer/Listing/MediaListing/MediaFileList/MediaFileList.js +6 -5
  48. package/lib/components/ListingContainer/Listing/MediaListing/MediaFileList/MediaFileList.js.map +1 -1
  49. package/lib/components/ListingContainer/Listing/MediaListing/MediaListing.js +1 -1
  50. package/lib/components/ListingContainer/Listing/MediaListing/MediaListing.js.map +1 -1
  51. package/lib/components/ListingContainer/ListingContainer.js +5 -2
  52. package/lib/components/ListingContainer/ListingContainer.js.map +1 -1
  53. package/lib/components/MediaListing.js +1 -1
  54. package/lib/components/MediaListing.js.map +1 -1
  55. package/lib/constants.js +2 -1
  56. package/lib/constants.js.map +1 -1
  57. package/lib/index.js +5 -5
  58. package/lib/index.js.map +1 -1
  59. package/lib/utils/bustUrl.js +1 -0
  60. package/lib/utils/bustUrl.js.map +1 -1
  61. package/lib-es/components/CardMedia/CardMedia.js +97 -54
  62. package/lib-es/components/CardMedia/CardMedia.js.map +1 -1
  63. package/lib-es/components/EditMediaFile/EditMediaFile.js +26 -42
  64. package/lib-es/components/EditMediaFile/EditMediaFile.js.map +1 -1
  65. package/lib-es/components/EditMediaFile/EditMediaFilePage.js +15 -8
  66. package/lib-es/components/EditMediaFile/EditMediaFilePage.js.map +1 -1
  67. package/lib-es/components/FileList/useGetFiles/getFiles.js +6 -3
  68. package/lib-es/components/FileList/useGetFiles/getFiles.js.map +1 -1
  69. package/lib-es/components/FileList/useGetFiles/useGetFiles.js +7 -2
  70. package/lib-es/components/FileList/useGetFiles/useGetFiles.js.map +1 -1
  71. package/lib-es/components/FileList/useGetFilesList/useGetFilesList.js +4 -1
  72. package/lib-es/components/FileList/useGetFilesList/useGetFilesList.js.map +1 -1
  73. package/lib-es/components/FilePreview/Actions/index.js.map +1 -1
  74. package/lib-es/components/FilePreview/Image/imageSchema.js +8 -4
  75. package/lib-es/components/FilePreview/Image/imageSchema.js.map +1 -1
  76. package/lib-es/components/FilePreview/PDF/PDF.js.map +1 -1
  77. package/lib-es/components/FilePreview/PDF/schema.js +2 -1
  78. package/lib-es/components/FilePreview/PDF/schema.js.map +1 -1
  79. package/lib-es/components/FilePreview/index.js +47 -3
  80. package/lib-es/components/FilePreview/index.js.map +1 -1
  81. package/lib-es/components/FilePreview/previewDefault/PreviewDefault.js.map +1 -1
  82. package/lib-es/components/FilePreview/previewDefault/previewDefaultSchema.js +2 -1
  83. package/lib-es/components/FilePreview/previewDefault/previewDefaultSchema.js.map +1 -1
  84. package/lib-es/components/FileUploadAdapter/FileList.js.map +1 -1
  85. package/lib-es/components/FileUploadAdapter/FileUploadAdapter.js +34 -23
  86. package/lib-es/components/FileUploadAdapter/FileUploadAdapter.js.map +1 -1
  87. package/lib-es/components/FileUploadAdapter/mappers/get-button-text.js.map +1 -1
  88. package/lib-es/components/FileUploadModal/FileUploadModal.js.map +1 -1
  89. package/lib-es/components/FilterPanel/FilterPanel.js +43 -123
  90. package/lib-es/components/FilterPanel/FilterPanel.js.map +1 -1
  91. package/lib-es/components/FilterPanel/MediaSearchFilter.js +34 -0
  92. package/lib-es/components/FilterPanel/MediaSearchFilter.js.map +1 -0
  93. package/lib-es/components/ListingContainer/Listing/MediaListing/MediaFileList/MediaFileList.js +5 -4
  94. package/lib-es/components/ListingContainer/Listing/MediaListing/MediaFileList/MediaFileList.js.map +1 -1
  95. package/lib-es/components/ListingContainer/ListingContainer.js +4 -1
  96. package/lib-es/components/ListingContainer/ListingContainer.js.map +1 -1
  97. package/lib-es/constants.js +2 -1
  98. package/lib-es/constants.js.map +1 -1
  99. package/lib-es/index.js +3 -3
  100. package/lib-es/index.js.map +1 -1
  101. package/lib-es/utils/bustUrl.js.map +1 -1
  102. package/package.json +8 -8
  103. package/src/components/CardMedia/CardMedia.js +120 -90
  104. package/src/components/EditMediaFile/EditMediaFile.js +28 -27
  105. package/src/components/EditMediaFile/EditMediaFilePage.js +12 -7
  106. package/src/components/FileList/useGetFiles/getFiles.js +12 -4
  107. package/src/components/FileList/useGetFiles/useGetFiles.js +3 -4
  108. package/src/components/FileList/useGetFilesList/useGetFilesList.js +2 -1
  109. package/src/components/FilePreview/Image/imageSchema.js +8 -4
  110. package/src/components/FilePreview/PDF/schema.js +2 -1
  111. package/src/components/FilePreview/index.js +36 -2
  112. package/src/components/FilePreview/previewDefault/previewDefaultSchema.js +2 -1
  113. package/src/components/FileUploadAdapter/FileUploadAdapter.js +24 -14
  114. package/src/components/FilterPanel/FilterPanel.js +44 -129
  115. package/src/components/FilterPanel/MediaSearchFilter.js +32 -0
  116. package/src/components/ListingContainer/Listing/MediaListing/MediaFileList/MediaFileList.js +5 -2
  117. package/src/components/ListingContainer/ListingContainer.js +4 -1
  118. package/src/constants.js +15 -1
@@ -1,15 +1,14 @@
1
- import React, { useState } from 'react';
2
- import More from '@blaze-react/more';
3
- import Button from '@blaze-react/button';
1
+ import React, { useState, useCallback } from 'react';
4
2
  import { DeleteAction } from '@blaze-cms/admin';
5
3
  import PropTypes from 'prop-types';
6
4
  import { getQuery, getMutation } from '@blaze-cms/admin-ui-utils';
7
- import { useMutation, useApolloClient } from '@apollo/client';
5
+ import { useMutation, useApolloClient, useQuery } from '@apollo/client';
8
6
  import classnames from 'classnames';
9
7
  import { useToasts } from '@blaze-react/toaster';
10
8
  import Modal from '@blaze-react/modal';
11
9
  import { createPortal } from 'react-dom';
12
10
  import { Link } from 'react-router-dom';
11
+ import { DeleteIcon, EditIcon } from '@blaze-cms/plugin-page-builder-ui';
13
12
  import EditMediaFile from '../EditMediaFile';
14
13
  import bustUrl from '../../utils/bustUrl';
15
14
 
@@ -38,52 +37,53 @@ const CardMedia = ({
38
37
  const [type, extension] = mimetype.split('/');
39
38
  const client = useApolloClient();
40
39
 
40
+ const { data: { getEntitySchemas: [schemaData] = [] } = {}, loading: schemaLoading } = useQuery(
41
+ getQuery('GET_ENTITY_SCHEMA'),
42
+ {
43
+ variables: { identifier: 'file' }
44
+ }
45
+ );
46
+
41
47
  const deleteFileById = async () => {
42
48
  setDisplayDeleteModal(false);
43
49
  try {
44
- await deleteFile({
45
- variables: { input: { id } }
46
- });
47
-
48
- removeFile({
49
- index
50
- });
51
-
52
- addToast(`File: ${name} has been deleted`, {
53
- appearance: 'success',
54
- autoDismiss: true
55
- });
50
+ await deleteFile({ variables: { input: { id } } });
51
+ removeFile({ index });
52
+ addToast(`File: ${name} has been deleted`, { appearance: 'success', autoDismiss: true });
56
53
  } catch (error) {
57
- addToast(error.message, {
58
- appearance: 'error',
59
- autoDismiss: true
60
- });
54
+ addToast(error.message, { appearance: 'error', autoDismiss: true });
61
55
  }
62
56
  };
63
57
 
64
- const handleClick = () => {
65
- onSelected({ id, url, name, data });
66
- };
58
+ const handleRowClick = () => onSelected({ id, url, name, data });
67
59
 
68
- const cardMediaClassNames = classnames('card card--media-list', {
69
- 'card--media-list--selected': selected,
70
- [`card--media-${displayLayout}`]: displayLayout
71
- });
60
+ const handleCheckboxToggle = useCallback(
61
+ e => {
62
+ e.preventDefault();
63
+ e.stopPropagation();
64
+ onSelected({ id, url, name, data });
65
+ },
66
+ [id, url, name, data, onSelected]
67
+ );
72
68
 
73
- const handleCloseModal = () => {
74
- setDisplayEditModal(false);
69
+ const handleKeyDown = e => {
70
+ if (e.key === ' ' || e.key === 'Enter') {
71
+ e.preventDefault();
72
+ handleRowClick();
73
+ }
75
74
  };
76
75
 
77
- const handleSaveButtonStatus = state => {
78
- setEnableSaveButton(state);
79
- };
76
+ const cardMediaClassNames = classnames(
77
+ 'card card--media-list card--media-list-row',
78
+ `card--media-${displayLayout}`,
79
+ { 'card--media-list--selected': selected }
80
+ );
81
+
82
+ const handleCloseModal = () => setDisplayEditModal(false);
83
+ const handleSaveButtonStatus = state => setEnableSaveButton(state);
80
84
 
81
85
  const modalActions = [
82
- {
83
- textButton: 'Cancel',
84
- callback: handleCloseModal,
85
- modifiers: ['cancel']
86
- },
86
+ { textButton: 'Cancel', callback: handleCloseModal, modifiers: ['cancel'] },
87
87
  {
88
88
  textButton: 'Apply',
89
89
  callback: () => handleFormSave(),
@@ -91,9 +91,9 @@ const CardMedia = ({
91
91
  }
92
92
  ];
93
93
 
94
- const handleFileChange = file => {
95
- setFileData(file);
96
- };
94
+ const handleFileChange = file => setFileData(file);
95
+
96
+ const handleStopPropagation = e => e.stopPropagation();
97
97
 
98
98
  const handleFormSave = async () => {
99
99
  try {
@@ -101,7 +101,7 @@ const CardMedia = ({
101
101
  data: { updateFile: updatedFile }
102
102
  } = await client.mutate({
103
103
  mutation: getMutation('UPDATE_FILE'),
104
- variables: { input: fileData },
104
+ variables: { input: fileData.formData },
105
105
  update(cache, { data: { updateFile: fileUpdated } }) {
106
106
  cache.writeQuery({
107
107
  query: getQuery('GET_FILE_BY_ID'),
@@ -127,6 +127,8 @@ const CardMedia = ({
127
127
  setEnableSaveButton(false);
128
128
  };
129
129
 
130
+ if (schemaLoading) return null;
131
+
130
132
  return (
131
133
  <>
132
134
  {displayEditModal &&
@@ -138,28 +140,52 @@ const CardMedia = ({
138
140
  handleSaveButtonStatus={handleSaveButtonStatus}
139
141
  handleFormSave={handleFormSave}
140
142
  enableSaveButton={enableSaveButton}
143
+ schemaData={schemaData}
141
144
  />
142
145
  </Modal>,
143
146
  modalTargetRef.current
144
147
  )}
145
- <div className={cardMediaClassNames} role="button" onClick={handleClick}>
146
- {displayDeleteModal &&
147
- createPortal(
148
- <DeleteAction
149
- onClose={() => setDisplayDeleteModal(false)}
150
- deleteAction={() => deleteFileById()}
151
- itemName={name}
152
- />,
153
- modalTargetRef.current
154
- )}
155
148
 
149
+ {displayDeleteModal &&
150
+ createPortal(
151
+ <DeleteAction
152
+ onClose={() => setDisplayDeleteModal(false)}
153
+ deleteAction={() => deleteFileById()}
154
+ itemName={name}
155
+ />,
156
+ modalTargetRef.current
157
+ )}
158
+
159
+ <div
160
+ className={cardMediaClassNames}
161
+ role="option"
162
+ aria-selected={selected}
163
+ tabIndex={0}
164
+ onClick={handleRowClick}
165
+ onKeyDown={handleKeyDown}>
166
+ {openEditInModal && (
167
+ <div className="card__select">
168
+ <input
169
+ type="checkbox"
170
+ aria-label={`Select ${name}`}
171
+ checked={!!selected}
172
+ onChange={handleCheckboxToggle}
173
+ onClick={handleStopPropagation}
174
+ />
175
+ </div>
176
+ )}
156
177
  {type === 'image' ? (
157
178
  <div className={`card__image card__image--media-${displayLayout}`}>
158
179
  <img src={bustUrl(url, updated)} alt={name} />
159
180
  </div>
160
181
  ) : (
161
182
  <div className="card__image card__image--media-list-document">
162
- <svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 8 8">
183
+ <svg
184
+ xmlns="http://www.w3.org/2000/svg"
185
+ width="100"
186
+ height="100"
187
+ viewBox="0 0 8 8"
188
+ aria-hidden="true">
163
189
  <path d="M0 0v8h7v-4h-4v-4h-3zm4 0v3h3l-3-3zm-3 2h1v1h-1v-1zm0 2h1v1h-1v-1zm0 2h4v1h-4v-1z" />
164
190
  </svg>
165
191
  </div>
@@ -168,46 +194,50 @@ const CardMedia = ({
168
194
  <footer className={`card__footer card__footer--media-${displayLayout}`}>
169
195
  <div className={`card__details card__details--media-${displayLayout}`}>
170
196
  <div className={`card__title card__title--media-${displayLayout}`}>
171
- <h2>{name}</h2>
197
+ <h2 className="card__file-name">{name}</h2>
172
198
  </div>
173
- <p>
174
- <span>format: {extension}</span>
199
+ <p className="card__meta">
200
+ <span>Format: {extension}</span>
175
201
  </p>
176
202
  </div>
177
- <div className={`card__menu card__menu--${displayLayout}`}>
178
- <div className="more-menu__wrapper more-menu__wrapper--card">
179
- <More displayBg>
180
- <More.Avatar isMoreMenu>
181
- <span className="material-icons">more_vert</span>
182
- </More.Avatar>
183
- <More.Content isMoreMenu>
184
- {openEditInModal ? (
185
- <Button
186
- onClick={event => {
187
- event.preventDefault();
188
- event.stopPropagation();
189
- setDisplayEditModal(true);
190
- }}
191
- className="more-menu__link">
192
- Edit
193
- </Button>
194
- ) : (
195
- <Link to={`/media/edit/${id}`} className="more-menu__link">
196
- Edit
197
- </Link>
198
- )}
199
- <Button
200
- onClick={event => {
201
- event.preventDefault();
202
- event.stopPropagation();
203
- setDisplayDeleteModal(true);
204
- }}
205
- className="more-menu__link">
206
- Delete
207
- </Button>
208
- </More.Content>
209
- </More>
210
- </div>
203
+
204
+ <div className={`card__menu card__menu--icons card__menu--${displayLayout}`}>
205
+ {openEditInModal ? (
206
+ <button
207
+ type="button"
208
+ className="card__icon-btn"
209
+ title="Edit"
210
+ aria-label="Edit"
211
+ onClick={e => {
212
+ e.preventDefault();
213
+ e.stopPropagation();
214
+ setDisplayEditModal(true);
215
+ }}>
216
+ <EditIcon width="20px" height="20px" />
217
+ </button>
218
+ ) : (
219
+ <Link
220
+ to={`/media/edit/${id}`}
221
+ className="card__icon-btn"
222
+ title="Edit"
223
+ aria-label="Edit"
224
+ onClick={e => e.stopPropagation()}>
225
+ <EditIcon width="20px" height="20px" />
226
+ </Link>
227
+ )}
228
+
229
+ <button
230
+ type="button"
231
+ className="card__icon-btn"
232
+ title="Delete"
233
+ aria-label="Delete"
234
+ onClick={e => {
235
+ e.preventDefault();
236
+ e.stopPropagation();
237
+ setDisplayDeleteModal(true);
238
+ }}>
239
+ <DeleteIcon width="18px" height="18px" />
240
+ </button>
211
241
  </div>
212
242
  </footer>
213
243
  </div>
@@ -233,7 +263,7 @@ CardMedia.propTypes = {
233
263
  };
234
264
 
235
265
  CardMedia.defaultProps = {
236
- onSelected: () => {},
266
+ onSelected: () => { },
237
267
  selected: false,
238
268
  data: {},
239
269
  updated: null,
@@ -1,27 +1,28 @@
1
1
  import React, { useState, useEffect } from 'react';
2
2
  import PropTypes from 'prop-types';
3
- import { getQuery } from '@blaze-cms/admin-ui-utils';
3
+ import { getQuery, getDynamicQuery } from '@blaze-cms/admin-ui-utils';
4
4
  import { useQuery } from '@apollo/client';
5
5
  import { useToasts } from '@blaze-react/toaster';
6
6
  import FilePreview from '../FilePreview';
7
7
  import FileUploadModal from '../FileUploadModal';
8
- import { STORE_KEY, NAME } from '../../constants';
8
+ import { FILE_DEFAULT_PROPS } from '../../constants';
9
9
 
10
10
  const EditMediaFile = ({
11
11
  onChange,
12
12
  handleSaveButtonStatus,
13
13
  fileId,
14
14
  showChangeButton,
15
- fileUpdated
15
+ fileUpdated,
16
+ schemaData
16
17
  }) => {
17
18
  const [formValues, setFormValues] = useState(null);
18
19
  const [displayFileUploadModal, setDisplayFileUploadModal] = useState(false);
19
20
  const { addToast } = useToasts();
20
21
 
21
- const fileQuery = getQuery('GET_FILE_BY_ID');
22
+ const fileQuery = getDynamicQuery('DATA_QUERY')(schemaData, fileId, null, FILE_DEFAULT_PROPS);
22
23
  const {
23
24
  loading,
24
- data: { file } = {},
25
+ data: { entityData: file } = {},
25
26
  refetch: refetchFile
26
27
  } = useQuery(fileQuery, {
27
28
  variables: { id: fileId },
@@ -52,32 +53,30 @@ const EditMediaFile = ({
52
53
 
53
54
  const handleFormChange = ({ isValid, isNewValueSet, valuesChecked }) => {
54
55
  const baseFile = formValues || file;
55
- const valuesCheckedWithoutName = valuesChecked.filter(
56
- ({ id }) => id !== NAME && id !== STORE_KEY
57
- );
58
-
59
- const dataValues = valuesCheckedWithoutName.reduce((acc, { id, value }) => {
60
- acc[id] = value;
61
- return acc;
62
- }, {});
63
56
 
64
- const { value: newFileName } = valuesChecked.find(({ id }) => id === NAME) || {};
65
- const { value: storeKey } = valuesChecked.find(({ id }) => id === STORE_KEY) || {};
57
+ const dataValues = valuesChecked.reduce(
58
+ (acc, { id, value, isDataPropery }) => {
59
+ if (isDataPropery) {
60
+ acc.data[id] = value;
61
+ } else {
62
+ acc[id] = value;
63
+ }
64
+ return acc;
65
+ },
66
+ { id: baseFile.id, data: { ...baseFile.data } }
67
+ );
68
+ delete dataValues.data.__typename; // Remove __typename if it exists in data to avoid issues with Apollo cache.
66
69
 
67
70
  const shouldEnableSaveButton = isNewValueSet && isValid;
68
71
  handleSaveButtonStatus(shouldEnableSaveButton);
69
72
 
70
73
  const updatedFile = {
71
74
  ...baseFile,
72
- name: newFileName || baseFile.name,
73
- storeKey: storeKey || baseFile.storeKey,
74
- data: { ...(baseFile.data || {}), ...dataValues }
75
+ ...dataValues
75
76
  };
76
77
 
77
78
  setFormValues(updatedFile);
78
- // Strip GraphQL metadata field __typename before passing data to onChange.
79
- const { __typename, ...cleanData } = updatedFile.data || {};
80
- onChange({ id: updatedFile.id, name: updatedFile.name, data: cleanData });
79
+ onChange({ ...updatedFile, formData: dataValues });
81
80
  };
82
81
 
83
82
  const getFileWithStoreType = sourceFile => {
@@ -100,10 +99,10 @@ const EditMediaFile = ({
100
99
  values.id === fileId
101
100
  ? values
102
101
  : {
103
- ...(formValues || file),
104
- ...values,
105
- url: values.url || (formValues || file).url
106
- };
102
+ ...(formValues || file),
103
+ ...values,
104
+ url: values.url || (formValues || file).url
105
+ };
107
106
  setFormValues(updated);
108
107
  onChange(updated);
109
108
  handleSaveButtonStatus(true);
@@ -127,7 +126,7 @@ const EditMediaFile = ({
127
126
  const fileToRender = formValues || file;
128
127
  const fileWithStoreType = getFileWithStoreType(fileToRender);
129
128
 
130
- return (
129
+ return !loading ? (
131
130
  <>
132
131
  {!!file && (
133
132
  <FilePreview
@@ -146,11 +145,13 @@ const EditMediaFile = ({
146
145
  simpleLayout
147
146
  fileId={fileId}
148
147
  storeKey={file && file.storeKey}
149
- getSelectedFiles={() => {}}
148
+ getSelectedFiles={() => { }}
150
149
  />
151
150
  </div>
152
151
  )}
153
152
  </>
153
+ ) : (
154
+ <div>loading...</div>
154
155
  );
155
156
  };
156
157
 
@@ -2,7 +2,7 @@ import React, { useState } from 'react';
2
2
  import { withRouter } from 'react-router-dom';
3
3
  import PropTypes from 'prop-types';
4
4
  import Button from '@blaze-react/button';
5
- import { useApolloClient } from '@apollo/client';
5
+ import { useApolloClient, useQuery } from '@apollo/client';
6
6
  import { getQuery, getMutation } from '@blaze-cms/admin-ui-utils';
7
7
  import { useToasts } from '@blaze-react/toaster';
8
8
  import EditMediaFile from './EditMediaFile';
@@ -13,6 +13,13 @@ const EditMediaFilePage = ({ match, history }) => {
13
13
  const client = useApolloClient();
14
14
  const { addToast } = useToasts();
15
15
 
16
+ const { data: { getEntitySchemas: [schemaData] = [] } = {}, loading: schemaLoading } = useQuery(
17
+ getQuery('GET_ENTITY_SCHEMA'),
18
+ {
19
+ variables: { identifier: 'file' }
20
+ }
21
+ );
22
+
16
23
  const handleFileChange = values => setFile(values);
17
24
 
18
25
  const handleSaveButtonStatus = value => {
@@ -29,12 +36,7 @@ const EditMediaFilePage = ({ match, history }) => {
29
36
  }
30
37
 
31
38
  try {
32
- const inputData = {
33
- id: file.id,
34
- name: file.name,
35
- data: file.data,
36
- storeKey: file.storeKey
37
- };
39
+ const inputData = file.formData;
38
40
 
39
41
  const {
40
42
  data: { updateFile: updatedFile }
@@ -75,6 +77,8 @@ const EditMediaFilePage = ({ match, history }) => {
75
77
 
76
78
  const buttonModifiers = shouldEnableSaveButton ? [] : ['disabled'];
77
79
 
80
+ if (schemaLoading) return null;
81
+
78
82
  return (
79
83
  <div className="page">
80
84
  <div className="page__content">
@@ -86,6 +90,7 @@ const EditMediaFilePage = ({ match, history }) => {
86
90
  handleFormSave={handleFormSave}
87
91
  showChangeButton
88
92
  fileUpdated={file}
93
+ schemaData={schemaData}
89
94
  />
90
95
  <div className="page__content__mediaWrapperActions">
91
96
  <Button onClick={pushBack}>Cancel</Button>
@@ -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']