box-ui-elements 24.0.0-beta.4 → 24.0.0-beta.6
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.
- package/dist/explorer.css +1 -1
- package/dist/explorer.js +1 -1
- package/dist/openwith.js +1 -1
- package/dist/picker.js +1 -1
- package/dist/preview.js +1 -1
- package/dist/sharing.js +1 -1
- package/dist/sidebar.js +1 -1
- package/dist/uploader.js +1 -1
- package/es/api/Metadata.js +98 -13
- package/es/api/Metadata.js.flow +110 -12
- package/es/api/Metadata.js.map +1 -1
- package/es/elements/common/messages.js +16 -0
- package/es/elements/common/messages.js.flow +25 -0
- package/es/elements/common/messages.js.map +1 -1
- package/es/elements/content-explorer/Content.js +5 -2
- package/es/elements/content-explorer/Content.js.map +1 -1
- package/es/elements/content-explorer/ContentExplorer.js +31 -6
- package/es/elements/content-explorer/ContentExplorer.js.map +1 -1
- package/es/elements/content-explorer/MetadataQueryAPIHelper.js +164 -10
- package/es/elements/content-explorer/MetadataQueryAPIHelper.js.map +1 -1
- package/es/elements/content-explorer/MetadataQueryBuilder.js +115 -0
- package/es/elements/content-explorer/MetadataQueryBuilder.js.map +1 -0
- package/es/elements/content-explorer/MetadataSidePanel.js +40 -14
- package/es/elements/content-explorer/MetadataSidePanel.js.map +1 -1
- package/es/elements/content-explorer/MetadataViewContainer.js +133 -36
- package/es/elements/content-explorer/MetadataViewContainer.js.map +1 -1
- package/es/elements/content-explorer/stories/MetadataView.stories.js +3 -25
- package/es/elements/content-explorer/stories/MetadataView.stories.js.map +1 -1
- package/es/elements/content-explorer/stories/tests/MetadataView-visual.stories.js +65 -29
- package/es/elements/content-explorer/stories/tests/MetadataView-visual.stories.js.map +1 -1
- package/es/elements/content-explorer/utils.js +140 -12
- package/es/elements/content-explorer/utils.js.map +1 -1
- package/es/src/elements/common/__mocks__/mockMetadata.d.ts +8 -24
- package/es/src/elements/content-explorer/Content.d.ts +4 -3
- package/es/src/elements/content-explorer/ContentExplorer.d.ts +19 -6
- package/es/src/elements/content-explorer/MetadataQueryAPIHelper.d.ts +22 -3
- package/es/src/elements/content-explorer/MetadataQueryBuilder.d.ts +27 -0
- package/es/src/elements/content-explorer/MetadataSidePanel.d.ts +6 -3
- package/es/src/elements/content-explorer/MetadataViewContainer.d.ts +10 -4
- package/es/src/elements/content-explorer/__tests__/MetadataQueryBuilder.test.d.ts +1 -0
- package/es/src/elements/content-explorer/stories/tests/MetadataView-visual.stories.d.ts +1 -0
- package/es/src/elements/content-explorer/utils.d.ts +9 -3
- package/i18n/bn-IN.js +4 -0
- package/i18n/bn-IN.properties +12 -0
- package/i18n/da-DK.js +4 -0
- package/i18n/da-DK.properties +12 -0
- package/i18n/de-DE.js +5 -1
- package/i18n/de-DE.properties +12 -0
- package/i18n/en-AU.js +4 -0
- package/i18n/en-AU.properties +12 -0
- package/i18n/en-CA.js +4 -0
- package/i18n/en-CA.properties +12 -0
- package/i18n/en-GB.js +4 -0
- package/i18n/en-GB.properties +12 -0
- package/i18n/en-US.js +4 -0
- package/i18n/en-US.properties +8 -0
- package/i18n/en-x-pseudo.js +4 -0
- package/i18n/es-419.js +5 -1
- package/i18n/es-419.properties +12 -0
- package/i18n/es-ES.js +5 -1
- package/i18n/es-ES.properties +12 -0
- package/i18n/fi-FI.js +4 -0
- package/i18n/fi-FI.properties +12 -0
- package/i18n/fr-CA.js +4 -0
- package/i18n/fr-CA.properties +12 -0
- package/i18n/fr-FR.js +4 -0
- package/i18n/fr-FR.properties +12 -0
- package/i18n/hi-IN.js +4 -0
- package/i18n/hi-IN.properties +12 -0
- package/i18n/it-IT.js +4 -0
- package/i18n/it-IT.properties +12 -0
- package/i18n/ja-JP.js +6 -2
- package/i18n/ja-JP.properties +14 -2
- package/i18n/ko-KR.js +4 -0
- package/i18n/ko-KR.properties +12 -0
- package/i18n/nb-NO.js +4 -0
- package/i18n/nb-NO.properties +12 -0
- package/i18n/nl-NL.js +4 -0
- package/i18n/nl-NL.properties +12 -0
- package/i18n/pl-PL.js +4 -0
- package/i18n/pl-PL.properties +12 -0
- package/i18n/pt-BR.js +4 -0
- package/i18n/pt-BR.properties +12 -0
- package/i18n/ru-RU.js +5 -1
- package/i18n/ru-RU.properties +12 -0
- package/i18n/sv-SE.js +4 -0
- package/i18n/sv-SE.properties +12 -0
- package/i18n/tr-TR.js +5 -1
- package/i18n/tr-TR.properties +12 -0
- package/i18n/zh-CN.js +4 -0
- package/i18n/zh-CN.properties +12 -0
- package/i18n/zh-TW.js +4 -0
- package/i18n/zh-TW.properties +12 -0
- package/package.json +3 -3
- package/src/api/Metadata.js +110 -12
- package/src/api/__tests__/Metadata.test.js +120 -0
- package/src/elements/common/__mocks__/mockMetadata.ts +7 -11
- package/src/elements/common/messages.js +25 -0
- package/src/elements/content-explorer/Content.tsx +9 -2
- package/src/elements/content-explorer/ContentExplorer.tsx +71 -17
- package/src/elements/content-explorer/MetadataQueryAPIHelper.ts +199 -8
- package/src/elements/content-explorer/MetadataQueryBuilder.ts +159 -0
- package/src/elements/content-explorer/MetadataSidePanel.tsx +55 -14
- package/src/elements/content-explorer/MetadataViewContainer.tsx +164 -29
- package/src/elements/content-explorer/__tests__/Content.test.tsx +1 -0
- package/src/elements/content-explorer/__tests__/ContentExplorer.test.tsx +38 -7
- package/src/elements/content-explorer/__tests__/MetadataQueryAPIHelper.test.ts +428 -12
- package/src/elements/content-explorer/__tests__/MetadataQueryBuilder.test.ts +419 -0
- package/src/elements/content-explorer/__tests__/MetadataSidePanel.test.tsx +145 -3
- package/src/elements/content-explorer/__tests__/MetadataViewContainer.test.tsx +413 -9
- package/src/elements/content-explorer/stories/MetadataView.stories.tsx +3 -21
- package/src/elements/content-explorer/stories/tests/MetadataView-visual.stories.tsx +56 -21
- package/src/elements/content-explorer/utils.ts +150 -13
|
@@ -6,18 +6,23 @@ import find from 'lodash/find';
|
|
|
6
6
|
import getProp from 'lodash/get';
|
|
7
7
|
import includes from 'lodash/includes';
|
|
8
8
|
import isArray from 'lodash/isArray';
|
|
9
|
-
import
|
|
9
|
+
import { areFieldValuesEqual, isEmptyValue, isMultiValuesField } from './utils';
|
|
10
10
|
import { JSON_PATCH_OP_ADD, JSON_PATCH_OP_REMOVE, JSON_PATCH_OP_REPLACE, JSON_PATCH_OP_TEST, METADATA_FIELD_TYPE_ENUM, METADATA_FIELD_TYPE_MULTISELECT } from '../../common/constants';
|
|
11
|
-
import {
|
|
11
|
+
import { FIELD_ITEM_NAME, FIELD_METADATA, FIELD_EXTENSION, FIELD_PERMISSIONS } from '../../constants';
|
|
12
|
+
import { getMimeTypeFilter, getRangeFilter, getSelectFilter, getStringFilter, mergeQueries, mergeQueryParams } from './MetadataQueryBuilder';
|
|
12
13
|
const SELECT_TYPES = [METADATA_FIELD_TYPE_ENUM, METADATA_FIELD_TYPE_MULTISELECT];
|
|
13
14
|
export default class MetadataQueryAPIHelper {
|
|
14
15
|
constructor(api) {
|
|
15
16
|
_defineProperty(this, "createJSONPatchOperations", (field, oldValue, newValue) => {
|
|
17
|
+
// check if two values are the same, return empty operations if so
|
|
18
|
+
if (areFieldValuesEqual(oldValue, newValue)) {
|
|
19
|
+
return [];
|
|
20
|
+
}
|
|
16
21
|
let operation = JSON_PATCH_OP_REPLACE;
|
|
17
|
-
if (
|
|
22
|
+
if (isEmptyValue(oldValue) && !isEmptyValue(newValue)) {
|
|
18
23
|
operation = JSON_PATCH_OP_ADD;
|
|
19
24
|
}
|
|
20
|
-
if (oldValue &&
|
|
25
|
+
if (!isEmptyValue(oldValue) && isEmptyValue(newValue)) {
|
|
21
26
|
operation = JSON_PATCH_OP_REMOVE;
|
|
22
27
|
}
|
|
23
28
|
const testOp = {
|
|
@@ -113,6 +118,43 @@ export default class MetadataQueryAPIHelper {
|
|
|
113
118
|
this.templateKey = Object.keys(instance)[0];
|
|
114
119
|
return this.api.getMetadataAPI(true).getSchemaByTemplateKey(this.templateKey);
|
|
115
120
|
});
|
|
121
|
+
/**
|
|
122
|
+
* Generate operations for all fields update in the metadata sidepanel
|
|
123
|
+
*
|
|
124
|
+
* @private
|
|
125
|
+
* @return {JSONPatchOperations}
|
|
126
|
+
*/
|
|
127
|
+
_defineProperty(this, "generateOperations", (item, templateOldFields, templateNewFields) => {
|
|
128
|
+
const {
|
|
129
|
+
scope,
|
|
130
|
+
templateKey
|
|
131
|
+
} = this.metadataTemplate;
|
|
132
|
+
const itemFields = item.metadata[scope][templateKey];
|
|
133
|
+
const operations = templateNewFields.flatMap(newField => {
|
|
134
|
+
let newFieldValue = newField.value;
|
|
135
|
+
const {
|
|
136
|
+
key,
|
|
137
|
+
type
|
|
138
|
+
} = newField;
|
|
139
|
+
// when retrieve value from float type field, it gives a string instead
|
|
140
|
+
if (type === 'float' && newFieldValue !== '') {
|
|
141
|
+
newFieldValue = Number(newFieldValue);
|
|
142
|
+
}
|
|
143
|
+
const oldField = templateOldFields.find(f => f.key === key);
|
|
144
|
+
const oldFieldValue = oldField.value;
|
|
145
|
+
|
|
146
|
+
/*
|
|
147
|
+
Generate operations array based on all the fields' orignal value and the incoming updated value.
|
|
148
|
+
Edge Case:
|
|
149
|
+
If there are multiple items shared different value for enum or multi-select field, the form will
|
|
150
|
+
return 'Multiple values' as the value. In this case, it needs to generate operation based on the
|
|
151
|
+
actual item's field value.
|
|
152
|
+
*/
|
|
153
|
+
const shouldUseItemFieldValue = isMultiValuesField(type, oldFieldValue) && !isMultiValuesField(type, newFieldValue);
|
|
154
|
+
return this.createJSONPatchOperations(key, shouldUseItemFieldValue ? itemFields[key] : oldFieldValue, newFieldValue);
|
|
155
|
+
});
|
|
156
|
+
return operations;
|
|
157
|
+
});
|
|
116
158
|
_defineProperty(this, "queryMetadata", () => {
|
|
117
159
|
return new Promise((resolve, reject) => {
|
|
118
160
|
this.api.getMetadataQueryAPI().queryMetadata(this.metadataQuery, resolve, reject, {
|
|
@@ -120,8 +162,8 @@ export default class MetadataQueryAPIHelper {
|
|
|
120
162
|
});
|
|
121
163
|
});
|
|
122
164
|
});
|
|
123
|
-
_defineProperty(this, "fetchMetadataQueryResults", (metadataQuery, successCallback, errorCallback) => {
|
|
124
|
-
this.metadataQuery = this.verifyQueryFields(metadataQuery);
|
|
165
|
+
_defineProperty(this, "fetchMetadataQueryResults", (metadataQuery, successCallback, errorCallback, fields) => {
|
|
166
|
+
this.metadataQuery = this.verifyQueryFields(metadataQuery, fields);
|
|
125
167
|
return this.queryMetadata().then(this.getTemplateSchemaInfo).then(this.getDataWithTypes).then(collection => {
|
|
126
168
|
return successCallback(collection, this.metadataTemplate);
|
|
127
169
|
}).catch(errorCallback);
|
|
@@ -130,24 +172,136 @@ export default class MetadataQueryAPIHelper {
|
|
|
130
172
|
const operations = this.createJSONPatchOperations(field, oldValue, newValue);
|
|
131
173
|
return this.api.getMetadataAPI(true).updateMetadata(file, this.metadataTemplate, operations, successCallback, errorCallback);
|
|
132
174
|
});
|
|
175
|
+
_defineProperty(this, "updateMetadataWithOperations", (item, operations, successCallback, errorCallback) => {
|
|
176
|
+
return this.api.getMetadataAPI(true).updateMetadata(item, this.metadataTemplate, operations, successCallback, errorCallback);
|
|
177
|
+
});
|
|
178
|
+
_defineProperty(this, "bulkUpdateMetadata", (items, templateOldFields, templateNewFields, successCallback, errorCallback) => {
|
|
179
|
+
const operations = [];
|
|
180
|
+
items.forEach(item => {
|
|
181
|
+
const operation = this.generateOperations(item, templateOldFields, templateNewFields);
|
|
182
|
+
operations.push(operation);
|
|
183
|
+
});
|
|
184
|
+
return this.api.getMetadataAPI(true).bulkUpdateMetadata(items, this.metadataTemplate, operations, successCallback, errorCallback);
|
|
185
|
+
});
|
|
186
|
+
_defineProperty(this, "buildMetadataQueryParams", filters => {
|
|
187
|
+
let argIndex = 0;
|
|
188
|
+
let queries = [];
|
|
189
|
+
let queryParams = {};
|
|
190
|
+
if (filters) {
|
|
191
|
+
Object.keys(filters).forEach(key => {
|
|
192
|
+
const filter = filters[key];
|
|
193
|
+
if (!filter) {
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
const {
|
|
197
|
+
fieldType,
|
|
198
|
+
value
|
|
199
|
+
} = filter;
|
|
200
|
+
switch (fieldType) {
|
|
201
|
+
case 'date':
|
|
202
|
+
case 'float':
|
|
203
|
+
{
|
|
204
|
+
if (typeof value === 'object' && value !== null && 'range' in value) {
|
|
205
|
+
const result = getRangeFilter(value, key, argIndex);
|
|
206
|
+
queryParams = mergeQueryParams(queryParams, result.queryParams);
|
|
207
|
+
queries = mergeQueries(queries, result.queries);
|
|
208
|
+
argIndex += result.keysGenerated;
|
|
209
|
+
break;
|
|
210
|
+
}
|
|
211
|
+
break;
|
|
212
|
+
}
|
|
213
|
+
case 'enum':
|
|
214
|
+
case 'multiSelect':
|
|
215
|
+
{
|
|
216
|
+
const arrayValue = Array.isArray(value) ? value.map(v => String(v)) : [String(value)];
|
|
217
|
+
let result;
|
|
218
|
+
if (key === 'mimetype-filter') {
|
|
219
|
+
result = getMimeTypeFilter(arrayValue, key, argIndex);
|
|
220
|
+
} else {
|
|
221
|
+
result = getSelectFilter(arrayValue, key, argIndex);
|
|
222
|
+
}
|
|
223
|
+
queryParams = mergeQueryParams(queryParams, result.queryParams);
|
|
224
|
+
queries = mergeQueries(queries, result.queries);
|
|
225
|
+
argIndex += result.keysGenerated;
|
|
226
|
+
break;
|
|
227
|
+
}
|
|
228
|
+
case 'string':
|
|
229
|
+
{
|
|
230
|
+
if (value && value[0]) {
|
|
231
|
+
const result = getStringFilter(value[0], key, argIndex);
|
|
232
|
+
queryParams = mergeQueryParams(queryParams, result.queryParams);
|
|
233
|
+
queries = mergeQueries(queries, result.queries);
|
|
234
|
+
argIndex += result.keysGenerated;
|
|
235
|
+
}
|
|
236
|
+
break;
|
|
237
|
+
}
|
|
238
|
+
default:
|
|
239
|
+
break;
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
const query = queries.reduce((acc, curr, index) => {
|
|
244
|
+
if (index > 0) {
|
|
245
|
+
acc += ` AND ${curr}`;
|
|
246
|
+
} else {
|
|
247
|
+
acc = curr;
|
|
248
|
+
}
|
|
249
|
+
return acc;
|
|
250
|
+
}, '');
|
|
251
|
+
return {
|
|
252
|
+
queryParams,
|
|
253
|
+
query
|
|
254
|
+
};
|
|
255
|
+
});
|
|
256
|
+
_defineProperty(this, "mergeQuery", (customQuery, filterQuery) => {
|
|
257
|
+
if (!customQuery) {
|
|
258
|
+
return filterQuery;
|
|
259
|
+
}
|
|
260
|
+
if (!filterQuery) {
|
|
261
|
+
return customQuery;
|
|
262
|
+
}
|
|
263
|
+
// Merge queries with AND operator
|
|
264
|
+
return `${customQuery} AND ${filterQuery}`;
|
|
265
|
+
});
|
|
133
266
|
/**
|
|
134
267
|
* Verify that the metadata query has required fields and update it if necessary
|
|
135
268
|
* For a file item, default fields included in the response are "type", "id", "etag"
|
|
136
269
|
*
|
|
137
270
|
* @param {MetadataQueryType} metadataQuery metadata query object
|
|
271
|
+
* @param {ExternalFilterValues} [fields] optional filter values to apply to the metadata query
|
|
138
272
|
* @return {MetadataQueryType} updated metadata query object with required fields
|
|
139
273
|
*/
|
|
140
|
-
_defineProperty(this, "verifyQueryFields", metadataQuery => {
|
|
274
|
+
_defineProperty(this, "verifyQueryFields", (metadataQuery, fields) => {
|
|
141
275
|
const clonedQuery = cloneDeep(metadataQuery);
|
|
142
276
|
const clonedFields = isArray(clonedQuery.fields) ? clonedQuery.fields : [];
|
|
143
|
-
|
|
277
|
+
if (fields) {
|
|
278
|
+
const {
|
|
279
|
+
query: filterQuery,
|
|
280
|
+
queryParams: filteredQueryParams
|
|
281
|
+
} = this.buildMetadataQueryParams(fields);
|
|
282
|
+
const {
|
|
283
|
+
query: customQuery,
|
|
284
|
+
query_params: customQueryParams
|
|
285
|
+
} = clonedQuery;
|
|
286
|
+
const query = this.mergeQuery(customQuery, filterQuery);
|
|
287
|
+
const queryParams = mergeQueryParams(filteredQueryParams, customQueryParams);
|
|
288
|
+
if (query) {
|
|
289
|
+
clonedQuery.query = query;
|
|
290
|
+
clonedQuery.query_params = queryParams;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
144
293
|
// Make sure the query fields array has "name" field which is necessary to display info.
|
|
145
|
-
if (!clonedFields.includes(
|
|
146
|
-
clonedFields.push(
|
|
294
|
+
if (!clonedFields.includes(FIELD_ITEM_NAME)) {
|
|
295
|
+
clonedFields.push(FIELD_ITEM_NAME);
|
|
147
296
|
}
|
|
148
297
|
if (!clonedFields.includes(FIELD_EXTENSION)) {
|
|
149
298
|
clonedFields.push(FIELD_EXTENSION);
|
|
150
299
|
}
|
|
300
|
+
|
|
301
|
+
// This field is necessary to check if the user has permission to update metadata
|
|
302
|
+
if (!clonedFields.includes(FIELD_PERMISSIONS)) {
|
|
303
|
+
clonedFields.push(FIELD_PERMISSIONS);
|
|
304
|
+
}
|
|
151
305
|
clonedQuery.fields = clonedFields;
|
|
152
306
|
return clonedQuery;
|
|
153
307
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MetadataQueryAPIHelper.js","names":["cloneDeep","find","getProp","includes","isArray","isNil","JSON_PATCH_OP_ADD","JSON_PATCH_OP_REMOVE","JSON_PATCH_OP_REPLACE","JSON_PATCH_OP_TEST","METADATA_FIELD_TYPE_ENUM","METADATA_FIELD_TYPE_MULTISELECT","FIELD_NAME","FIELD_METADATA","FIELD_EXTENSION","SELECT_TYPES","MetadataQueryAPIHelper","constructor","api","_defineProperty","field","oldValue","newValue","operation","testOp","op","path","value","patchOp","fields","from","metadataQuery","filter","map","split","pop","metadata","templateFields","metadataTemplate","instance","templateScope","templateKey","queryFields","getMetadataQueryFields","queryField","templateField","type","displayName","key","options","enterprise","id","$id","templateSchemaResponse","entries","items","next_marker","nextMarker","metadataQueryResponseData","data","length","Promise","resolve","Object","keys","getMetadataAPI","getSchemaByTemplateKey","reject","getMetadataQueryAPI","queryMetadata","forceFetch","successCallback","errorCallback","verifyQueryFields","then","getTemplateSchemaInfo","getDataWithTypes","collection","catch","file","operations","createJSONPatchOperations","updateMetadata","clonedQuery","clonedFields","push"],"sources":["../../../src/elements/content-explorer/MetadataQueryAPIHelper.ts"],"sourcesContent":["import cloneDeep from 'lodash/cloneDeep';\nimport find from 'lodash/find';\nimport getProp from 'lodash/get';\nimport includes from 'lodash/includes';\nimport isArray from 'lodash/isArray';\nimport isNil from 'lodash/isNil';\nimport API from '../../api';\n\nimport {\n JSON_PATCH_OP_ADD,\n JSON_PATCH_OP_REMOVE,\n JSON_PATCH_OP_REPLACE,\n JSON_PATCH_OP_TEST,\n METADATA_FIELD_TYPE_ENUM,\n METADATA_FIELD_TYPE_MULTISELECT,\n} from '../../common/constants';\nimport { FIELD_NAME, FIELD_METADATA, FIELD_EXTENSION } from '../../constants';\n\nimport type { MetadataQuery as MetadataQueryType, MetadataQueryResponseData } from '../../common/types/metadataQueries';\nimport type {\n MetadataTemplateSchemaResponse,\n MetadataTemplate,\n MetadataFieldValue,\n MetadataType,\n MetadataQueryInstanceTypeField,\n} from '../../common/types/metadata';\nimport type { ElementsXhrError, JSONPatchOperations } from '../../common/types/api';\nimport type { Collection, BoxItem } from '../../common/types/core';\n\ntype SuccessCallback = (metadataQueryCollection: Collection, metadataTemplate: MetadataTemplate) => void;\ntype ErrorCallback = (e: ElementsXhrError) => void;\n\nconst SELECT_TYPES: Array<typeof METADATA_FIELD_TYPE_ENUM | typeof METADATA_FIELD_TYPE_MULTISELECT> = [\n METADATA_FIELD_TYPE_ENUM,\n METADATA_FIELD_TYPE_MULTISELECT,\n];\n\nexport default class MetadataQueryAPIHelper {\n api: API;\n\n metadataQueryResponseData: MetadataQueryResponseData;\n\n metadataTemplate: MetadataTemplate;\n\n templateKey: string;\n\n templateScope: string;\n\n metadataQuery: MetadataQueryType;\n\n constructor(api: API) {\n this.api = api;\n }\n\n createJSONPatchOperations = (\n field: string,\n oldValue: MetadataFieldValue | null,\n newValue: MetadataFieldValue | null,\n ): JSONPatchOperations => {\n let operation = JSON_PATCH_OP_REPLACE;\n\n if (isNil(oldValue) && newValue) {\n operation = JSON_PATCH_OP_ADD;\n }\n\n if (oldValue && isNil(newValue)) {\n operation = JSON_PATCH_OP_REMOVE;\n }\n\n const testOp = {\n op: JSON_PATCH_OP_TEST,\n path: `/${field}`,\n value: oldValue,\n };\n const patchOp = {\n op: operation,\n path: `/${field}`,\n value: newValue,\n };\n\n if (operation === JSON_PATCH_OP_REMOVE) {\n delete patchOp.value;\n }\n\n return operation === JSON_PATCH_OP_ADD ? [patchOp] : [testOp, patchOp];\n };\n\n getMetadataQueryFields = (): string[] => {\n /*\n Example metadata query:\n const query = {\n from: 'enterprise_12345.myAwesomeTemplateKey',\n fields: [\n 'name', // base representation field for an item (name, size, etag etc.)\n 'metadata.enterprise_12345.myAwesomeTemplateKey.field_1', // metadata instance field\n 'metadata.enterprise_12345.myAwesomeTemplateKey.field_2', // metadata instance field\n 'metadata.enterprise_12345.myAwesomeTemplateKey.field_3' // metadata instance field\n ],\n ancestor_folder_id: 0,\n };\n\n This function will return ['field_1', 'field_2', 'field_3']\n */\n const { fields = [], from } = this.metadataQuery;\n return fields.filter(field => field.includes(from)).map(field => field.split('.').pop());\n };\n\n flattenMetadata = (metadata?: MetadataType): MetadataType => {\n const templateFields = getProp(this.metadataTemplate, 'fields', []);\n const instance = getProp(metadata, `${this.templateScope}.${this.templateKey}`);\n\n if (!instance) {\n return {};\n }\n\n const queryFields = this.getMetadataQueryFields();\n\n const fields = queryFields.map((queryField: string) => {\n const templateField = find(templateFields, ['key', queryField]);\n const type = getProp(templateField, 'type'); // get data type\n const displayName = getProp(templateField, 'displayName', queryField); // get displayName, defaults to key\n\n const field: MetadataQueryInstanceTypeField = {\n key: `${FIELD_METADATA}.${this.templateScope}.${this.templateKey}.${queryField}`,\n value: instance[queryField],\n type,\n displayName,\n };\n\n if (includes(SELECT_TYPES, type)) {\n // get \"options\" for enums or multiselects\n field.options = getProp(templateField, 'options');\n }\n\n return field;\n });\n\n return {\n enterprise: {\n fields,\n id: instance.$id,\n },\n };\n };\n\n getDataWithTypes = (templateSchemaResponse?: MetadataTemplateSchemaResponse): Collection => {\n this.metadataTemplate = getProp(templateSchemaResponse, 'data');\n\n const { entries: items, next_marker: nextMarker }: MetadataQueryResponseData = this.metadataQueryResponseData;\n\n return {\n items,\n nextMarker,\n };\n };\n\n getTemplateSchemaInfo = (data: MetadataQueryResponseData): Promise<MetadataTemplateSchemaResponse | void> => {\n const { entries } = data;\n this.metadataQueryResponseData = data;\n if (!entries || entries.length === 0) {\n // Don't make metadata API call to get template info\n return Promise.resolve();\n }\n\n const metadata = getProp(entries, '[0].metadata');\n this.templateScope = Object.keys(metadata)[0];\n const instance = metadata[this.templateScope];\n this.templateKey = Object.keys(instance)[0];\n\n return this.api.getMetadataAPI(true).getSchemaByTemplateKey(this.templateKey);\n };\n\n queryMetadata = (): Promise<MetadataQueryResponseData> => {\n return new Promise((resolve, reject) => {\n this.api.getMetadataQueryAPI().queryMetadata(this.metadataQuery, resolve, reject, { forceFetch: true });\n });\n };\n\n fetchMetadataQueryResults = (\n metadataQuery: MetadataQueryType,\n successCallback: SuccessCallback,\n errorCallback: ErrorCallback,\n ): Promise<void> => {\n this.metadataQuery = this.verifyQueryFields(metadataQuery);\n return this.queryMetadata()\n .then(this.getTemplateSchemaInfo)\n .then(this.getDataWithTypes)\n .then((collection: Collection) => {\n return successCallback(collection, this.metadataTemplate);\n })\n .catch(errorCallback);\n };\n\n updateMetadata = (\n file: BoxItem,\n field: string,\n oldValue: MetadataFieldValue | null,\n newValue: MetadataFieldValue | null,\n successCallback: () => void,\n errorCallback: ErrorCallback,\n ): Promise<void> => {\n const operations = this.createJSONPatchOperations(field, oldValue, newValue);\n return this.api\n .getMetadataAPI(true)\n .updateMetadata(file, this.metadataTemplate, operations, successCallback, errorCallback);\n };\n\n /**\n * Verify that the metadata query has required fields and update it if necessary\n * For a file item, default fields included in the response are \"type\", \"id\", \"etag\"\n *\n * @param {MetadataQueryType} metadataQuery metadata query object\n * @return {MetadataQueryType} updated metadata query object with required fields\n */\n verifyQueryFields = (metadataQuery: MetadataQueryType): MetadataQueryType => {\n const clonedQuery = cloneDeep(metadataQuery);\n const clonedFields = isArray(clonedQuery.fields) ? clonedQuery.fields : [];\n\n // Make sure the query fields array has \"name\" field which is necessary to display info.\n if (!clonedFields.includes(FIELD_NAME)) {\n clonedFields.push(FIELD_NAME);\n }\n\n if (!clonedFields.includes(FIELD_EXTENSION)) {\n clonedFields.push(FIELD_EXTENSION);\n }\n\n clonedQuery.fields = clonedFields;\n\n return clonedQuery;\n };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"MetadataQueryAPIHelper.js","names":["cloneDeep","find","getProp","includes","isArray","areFieldValuesEqual","isEmptyValue","isMultiValuesField","JSON_PATCH_OP_ADD","JSON_PATCH_OP_REMOVE","JSON_PATCH_OP_REPLACE","JSON_PATCH_OP_TEST","METADATA_FIELD_TYPE_ENUM","METADATA_FIELD_TYPE_MULTISELECT","FIELD_ITEM_NAME","FIELD_METADATA","FIELD_EXTENSION","FIELD_PERMISSIONS","getMimeTypeFilter","getRangeFilter","getSelectFilter","getStringFilter","mergeQueries","mergeQueryParams","SELECT_TYPES","MetadataQueryAPIHelper","constructor","api","_defineProperty","field","oldValue","newValue","operation","testOp","op","path","value","patchOp","fields","from","metadataQuery","filter","map","split","pop","metadata","templateFields","metadataTemplate","instance","templateScope","templateKey","queryFields","getMetadataQueryFields","queryField","templateField","type","displayName","key","options","enterprise","id","$id","templateSchemaResponse","entries","items","next_marker","nextMarker","metadataQueryResponseData","data","length","Promise","resolve","Object","keys","getMetadataAPI","getSchemaByTemplateKey","item","templateOldFields","templateNewFields","scope","itemFields","operations","flatMap","newField","newFieldValue","Number","oldField","f","oldFieldValue","shouldUseItemFieldValue","createJSONPatchOperations","reject","getMetadataQueryAPI","queryMetadata","forceFetch","successCallback","errorCallback","verifyQueryFields","then","getTemplateSchemaInfo","getDataWithTypes","collection","catch","file","updateMetadata","forEach","generateOperations","push","bulkUpdateMetadata","filters","argIndex","queries","queryParams","fieldType","result","keysGenerated","arrayValue","Array","v","String","query","reduce","acc","curr","index","customQuery","filterQuery","clonedQuery","clonedFields","filteredQueryParams","buildMetadataQueryParams","query_params","customQueryParams","mergeQuery"],"sources":["../../../src/elements/content-explorer/MetadataQueryAPIHelper.ts"],"sourcesContent":["import cloneDeep from 'lodash/cloneDeep';\nimport find from 'lodash/find';\nimport getProp from 'lodash/get';\nimport includes from 'lodash/includes';\nimport isArray from 'lodash/isArray';\nimport type { MetadataTemplateField } from '@box/metadata-editor';\nimport type { MetadataFieldType } from '@box/metadata-view';\n\nimport API from '../../api';\nimport { areFieldValuesEqual, isEmptyValue, isMultiValuesField } from './utils';\n\nimport {\n JSON_PATCH_OP_ADD,\n JSON_PATCH_OP_REMOVE,\n JSON_PATCH_OP_REPLACE,\n JSON_PATCH_OP_TEST,\n METADATA_FIELD_TYPE_ENUM,\n METADATA_FIELD_TYPE_MULTISELECT,\n} from '../../common/constants';\nimport { FIELD_ITEM_NAME, FIELD_METADATA, FIELD_EXTENSION, FIELD_PERMISSIONS } from '../../constants';\n\nimport type { MetadataQuery as MetadataQueryType, MetadataQueryResponseData } from '../../common/types/metadataQueries';\nimport type {\n MetadataTemplateSchemaResponse,\n MetadataTemplate,\n MetadataFieldValue,\n MetadataType,\n MetadataQueryInstanceTypeField,\n} from '../../common/types/metadata';\nimport type { ElementsXhrError, JSONPatchOperations } from '../../common/types/api';\nimport type { Collection, BoxItem } from '../../common/types/core';\nimport {\n getMimeTypeFilter,\n getRangeFilter,\n getSelectFilter,\n getStringFilter,\n mergeQueries,\n mergeQueryParams,\n} from './MetadataQueryBuilder';\nimport type { ExternalFilterValues } from './MetadataViewContainer';\n\ntype SuccessCallback = (metadataQueryCollection: Collection, metadataTemplate: MetadataTemplate) => void;\ntype ErrorCallback = (e: ElementsXhrError) => void;\n\nconst SELECT_TYPES: Array<typeof METADATA_FIELD_TYPE_ENUM | typeof METADATA_FIELD_TYPE_MULTISELECT> = [\n METADATA_FIELD_TYPE_ENUM,\n METADATA_FIELD_TYPE_MULTISELECT,\n];\n\nexport default class MetadataQueryAPIHelper {\n api: API;\n\n metadataQueryResponseData: MetadataQueryResponseData;\n\n metadataTemplate: MetadataTemplate;\n\n templateKey: string;\n\n templateScope: string;\n\n metadataQuery: MetadataQueryType;\n\n constructor(api: API) {\n this.api = api;\n }\n\n createJSONPatchOperations = (\n field: string,\n oldValue: MetadataFieldValue | null,\n newValue: MetadataFieldValue | null,\n ): JSONPatchOperations => {\n // check if two values are the same, return empty operations if so\n if (areFieldValuesEqual(oldValue, newValue)) {\n return [];\n }\n\n let operation = JSON_PATCH_OP_REPLACE;\n\n if (isEmptyValue(oldValue) && !isEmptyValue(newValue)) {\n operation = JSON_PATCH_OP_ADD;\n }\n\n if (!isEmptyValue(oldValue) && isEmptyValue(newValue)) {\n operation = JSON_PATCH_OP_REMOVE;\n }\n\n const testOp = {\n op: JSON_PATCH_OP_TEST,\n path: `/${field}`,\n value: oldValue,\n };\n const patchOp = {\n op: operation,\n path: `/${field}`,\n value: newValue,\n };\n\n if (operation === JSON_PATCH_OP_REMOVE) {\n delete patchOp.value;\n }\n\n return operation === JSON_PATCH_OP_ADD ? [patchOp] : [testOp, patchOp];\n };\n\n getMetadataQueryFields = (): string[] => {\n /*\n Example metadata query:\n const query = {\n from: 'enterprise_12345.myAwesomeTemplateKey',\n fields: [\n 'name', // base representation field for an item (name, size, etag etc.)\n 'metadata.enterprise_12345.myAwesomeTemplateKey.field_1', // metadata instance field\n 'metadata.enterprise_12345.myAwesomeTemplateKey.field_2', // metadata instance field\n 'metadata.enterprise_12345.myAwesomeTemplateKey.field_3' // metadata instance field\n ],\n ancestor_folder_id: 0,\n };\n\n This function will return ['field_1', 'field_2', 'field_3']\n */\n const { fields = [], from } = this.metadataQuery;\n return fields.filter(field => field.includes(from)).map(field => field.split('.').pop());\n };\n\n flattenMetadata = (metadata?: MetadataType): MetadataType => {\n const templateFields = getProp(this.metadataTemplate, 'fields', []);\n const instance = getProp(metadata, `${this.templateScope}.${this.templateKey}`);\n\n if (!instance) {\n return {};\n }\n\n const queryFields = this.getMetadataQueryFields();\n\n const fields = queryFields.map((queryField: string) => {\n const templateField = find(templateFields, ['key', queryField]);\n const type = getProp(templateField, 'type'); // get data type\n const displayName = getProp(templateField, 'displayName', queryField); // get displayName, defaults to key\n\n const field: MetadataQueryInstanceTypeField = {\n key: `${FIELD_METADATA}.${this.templateScope}.${this.templateKey}.${queryField}`,\n value: instance[queryField],\n type,\n displayName,\n };\n\n if (includes(SELECT_TYPES, type)) {\n // get \"options\" for enums or multiselects\n field.options = getProp(templateField, 'options');\n }\n\n return field;\n });\n\n return {\n enterprise: {\n fields,\n id: instance.$id,\n },\n };\n };\n\n getDataWithTypes = (templateSchemaResponse?: MetadataTemplateSchemaResponse): Collection => {\n this.metadataTemplate = getProp(templateSchemaResponse, 'data');\n\n const { entries: items, next_marker: nextMarker }: MetadataQueryResponseData = this.metadataQueryResponseData;\n\n return {\n items,\n nextMarker,\n };\n };\n\n getTemplateSchemaInfo = (data: MetadataQueryResponseData): Promise<MetadataTemplateSchemaResponse | void> => {\n const { entries } = data;\n this.metadataQueryResponseData = data;\n if (!entries || entries.length === 0) {\n // Don't make metadata API call to get template info\n return Promise.resolve();\n }\n\n const metadata = getProp(entries, '[0].metadata');\n this.templateScope = Object.keys(metadata)[0];\n const instance = metadata[this.templateScope];\n this.templateKey = Object.keys(instance)[0];\n\n return this.api.getMetadataAPI(true).getSchemaByTemplateKey(this.templateKey);\n };\n\n /**\n * Generate operations for all fields update in the metadata sidepanel\n *\n * @private\n * @return {JSONPatchOperations}\n */\n generateOperations = (\n item: BoxItem,\n templateOldFields: MetadataTemplateField[],\n templateNewFields: MetadataTemplateField[],\n ): JSONPatchOperations => {\n const { scope, templateKey } = this.metadataTemplate;\n const itemFields = item.metadata[scope][templateKey];\n const operations = templateNewFields.flatMap(newField => {\n let newFieldValue = newField.value;\n const { key, type } = newField;\n // when retrieve value from float type field, it gives a string instead\n if (type === 'float' && newFieldValue !== '') {\n newFieldValue = Number(newFieldValue);\n }\n const oldField = templateOldFields.find(f => f.key === key);\n const oldFieldValue = oldField.value;\n\n /*\n Generate operations array based on all the fields' orignal value and the incoming updated value.\n\n Edge Case:\n If there are multiple items shared different value for enum or multi-select field, the form will\n return 'Multiple values' as the value. In this case, it needs to generate operation based on the\n actual item's field value.\n */\n const shouldUseItemFieldValue =\n isMultiValuesField(type as MetadataFieldType, oldFieldValue) &&\n !isMultiValuesField(type as MetadataFieldType, newFieldValue);\n\n return this.createJSONPatchOperations(\n key,\n shouldUseItemFieldValue ? itemFields[key] : oldFieldValue,\n newFieldValue,\n );\n });\n\n return operations;\n };\n\n queryMetadata = (): Promise<MetadataQueryResponseData> => {\n return new Promise((resolve, reject) => {\n this.api.getMetadataQueryAPI().queryMetadata(this.metadataQuery, resolve, reject, { forceFetch: true });\n });\n };\n\n fetchMetadataQueryResults = (\n metadataQuery: MetadataQueryType,\n successCallback: SuccessCallback,\n errorCallback: ErrorCallback,\n fields?: ExternalFilterValues,\n ): Promise<void> => {\n this.metadataQuery = this.verifyQueryFields(metadataQuery, fields);\n\n return this.queryMetadata()\n .then(this.getTemplateSchemaInfo)\n .then(this.getDataWithTypes)\n .then((collection: Collection) => {\n return successCallback(collection, this.metadataTemplate);\n })\n .catch(errorCallback);\n };\n\n updateMetadata = (\n file: BoxItem,\n field: string,\n oldValue: MetadataFieldValue | null,\n newValue: MetadataFieldValue | null,\n successCallback: () => void,\n errorCallback: ErrorCallback,\n ): Promise<void> => {\n const operations = this.createJSONPatchOperations(field, oldValue, newValue);\n return this.api\n .getMetadataAPI(true)\n .updateMetadata(file, this.metadataTemplate, operations, successCallback, errorCallback);\n };\n\n updateMetadataWithOperations = (\n item: BoxItem,\n operations: JSONPatchOperations,\n successCallback: () => void,\n errorCallback: ErrorCallback,\n ): Promise<void> => {\n return this.api\n .getMetadataAPI(true)\n .updateMetadata(item, this.metadataTemplate, operations, successCallback, errorCallback);\n };\n\n bulkUpdateMetadata = (\n items: BoxItem[],\n templateOldFields: MetadataTemplateField[],\n templateNewFields: MetadataTemplateField[],\n successCallback: () => void,\n errorCallback: ErrorCallback,\n ): Promise<void> => {\n const operations: JSONPatchOperations = [];\n items.forEach(item => {\n const operation = this.generateOperations(item, templateOldFields, templateNewFields);\n operations.push(operation);\n });\n return this.api\n .getMetadataAPI(true)\n .bulkUpdateMetadata(items, this.metadataTemplate, operations, successCallback, errorCallback);\n };\n\n buildMetadataQueryParams = (filters: ExternalFilterValues) => {\n let argIndex = 0;\n let queries: string[] = [];\n let queryParams: { [key: string]: number | Date | string } = {};\n\n if (filters) {\n Object.keys(filters).forEach(key => {\n const filter = filters[key];\n if (!filter) {\n return;\n }\n\n const { fieldType, value } = filter;\n\n switch (fieldType) {\n case 'date':\n case 'float': {\n if (typeof value === 'object' && value !== null && 'range' in value) {\n const result = getRangeFilter(value, key, argIndex);\n queryParams = mergeQueryParams(queryParams, result.queryParams);\n queries = mergeQueries(queries, result.queries);\n argIndex += result.keysGenerated;\n break;\n }\n break;\n }\n case 'enum':\n case 'multiSelect': {\n const arrayValue = Array.isArray(value) ? value.map(v => String(v)) : [String(value)];\n let result;\n if (key === 'mimetype-filter') {\n result = getMimeTypeFilter(arrayValue, key, argIndex);\n } else {\n result = getSelectFilter(arrayValue, key, argIndex);\n }\n queryParams = mergeQueryParams(queryParams, result.queryParams);\n queries = mergeQueries(queries, result.queries);\n argIndex += result.keysGenerated;\n break;\n }\n\n case 'string': {\n if (value && value[0]) {\n const result = getStringFilter(value[0], key, argIndex);\n queryParams = mergeQueryParams(queryParams, result.queryParams);\n queries = mergeQueries(queries, result.queries);\n argIndex += result.keysGenerated;\n }\n break;\n }\n\n default:\n break;\n }\n });\n }\n\n const query = queries.reduce((acc, curr, index) => {\n if (index > 0) {\n acc += ` AND ${curr}`;\n } else {\n acc = curr;\n }\n return acc;\n }, '');\n\n return {\n queryParams,\n query,\n };\n };\n\n mergeQuery = (customQuery: string, filterQuery: string): string => {\n if (!customQuery) {\n return filterQuery;\n }\n if (!filterQuery) {\n return customQuery;\n }\n // Merge queries with AND operator\n return `${customQuery} AND ${filterQuery}`;\n };\n\n /**\n * Verify that the metadata query has required fields and update it if necessary\n * For a file item, default fields included in the response are \"type\", \"id\", \"etag\"\n *\n * @param {MetadataQueryType} metadataQuery metadata query object\n * @param {ExternalFilterValues} [fields] optional filter values to apply to the metadata query\n * @return {MetadataQueryType} updated metadata query object with required fields\n */\n verifyQueryFields = (metadataQuery: MetadataQueryType, fields?: ExternalFilterValues): MetadataQueryType => {\n const clonedQuery = cloneDeep(metadataQuery);\n const clonedFields = isArray(clonedQuery.fields) ? clonedQuery.fields : [];\n\n if (fields) {\n const { query: filterQuery, queryParams: filteredQueryParams } = this.buildMetadataQueryParams(fields);\n const { query: customQuery, query_params: customQueryParams } = clonedQuery;\n const query = this.mergeQuery(customQuery, filterQuery);\n const queryParams = mergeQueryParams(filteredQueryParams, customQueryParams);\n if (query) {\n clonedQuery.query = query;\n clonedQuery.query_params = queryParams;\n }\n }\n // Make sure the query fields array has \"name\" field which is necessary to display info.\n if (!clonedFields.includes(FIELD_ITEM_NAME)) {\n clonedFields.push(FIELD_ITEM_NAME);\n }\n\n if (!clonedFields.includes(FIELD_EXTENSION)) {\n clonedFields.push(FIELD_EXTENSION);\n }\n\n // This field is necessary to check if the user has permission to update metadata\n if (!clonedFields.includes(FIELD_PERMISSIONS)) {\n clonedFields.push(FIELD_PERMISSIONS);\n }\n\n clonedQuery.fields = clonedFields;\n\n return clonedQuery;\n };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
2
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
3
|
+
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
4
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
5
|
+
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
6
|
+
import isNil from 'lodash/isNil';
|
|
7
|
+
|
|
8
|
+
// Custom type for range filters
|
|
9
|
+
|
|
10
|
+
// Union type for filter values
|
|
11
|
+
|
|
12
|
+
export const mergeQueryParams = (targetParams, sourceParams) => {
|
|
13
|
+
return _objectSpread(_objectSpread({}, targetParams), sourceParams);
|
|
14
|
+
};
|
|
15
|
+
export const mergeQueries = (targetQueries, sourceQueries) => {
|
|
16
|
+
return [...targetQueries, ...sourceQueries];
|
|
17
|
+
};
|
|
18
|
+
const generateArgKey = (key, index) => {
|
|
19
|
+
const purifyKey = key.replace(/[^\w]/g, '_');
|
|
20
|
+
return `arg_${purifyKey}_${index}`;
|
|
21
|
+
};
|
|
22
|
+
const escapeValue = value => value.replace(/([_%])/g, '\\$1');
|
|
23
|
+
export const getStringFilter = (filterValue, fieldKey, argIndexStart) => {
|
|
24
|
+
let currentArgIndex = argIndexStart;
|
|
25
|
+
const argKey = generateArgKey(fieldKey, currentArgIndex += 1);
|
|
26
|
+
return {
|
|
27
|
+
queryParams: {
|
|
28
|
+
[argKey]: `%${escapeValue(filterValue)}%`
|
|
29
|
+
},
|
|
30
|
+
queries: [`(${fieldKey} ILIKE :${argKey})`],
|
|
31
|
+
keysGenerated: currentArgIndex - argIndexStart
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
const isInvalid = value => {
|
|
35
|
+
return isNil(value) || value === '';
|
|
36
|
+
};
|
|
37
|
+
export const getRangeFilter = (filterValue, fieldKey, argIndexStart) => {
|
|
38
|
+
let currentArgIndex = argIndexStart;
|
|
39
|
+
if (filterValue && typeof filterValue === 'object' && 'range' in filterValue && filterValue.range) {
|
|
40
|
+
const {
|
|
41
|
+
gt,
|
|
42
|
+
lt
|
|
43
|
+
} = filterValue.range;
|
|
44
|
+
const queryParams = {};
|
|
45
|
+
const queries = [];
|
|
46
|
+
if (!isInvalid(gt) && !isInvalid(lt)) {
|
|
47
|
+
// Both gt and lt: between values
|
|
48
|
+
const argKeyGt = generateArgKey(fieldKey, currentArgIndex += 1);
|
|
49
|
+
const argKeyLt = generateArgKey(fieldKey, currentArgIndex += 1);
|
|
50
|
+
queryParams[argKeyGt] = gt;
|
|
51
|
+
queryParams[argKeyLt] = lt;
|
|
52
|
+
queries.push(`(${fieldKey} >= :${argKeyGt} AND ${fieldKey} <= :${argKeyLt})`);
|
|
53
|
+
} else if (!isInvalid(gt)) {
|
|
54
|
+
// Only gt: greater than
|
|
55
|
+
const argKey = generateArgKey(fieldKey, currentArgIndex += 1);
|
|
56
|
+
queryParams[argKey] = gt;
|
|
57
|
+
queries.push(`(${fieldKey} >= :${argKey})`);
|
|
58
|
+
} else if (!isInvalid(lt)) {
|
|
59
|
+
// Only lt: less than
|
|
60
|
+
const argKey = generateArgKey(fieldKey, currentArgIndex += 1);
|
|
61
|
+
queryParams[argKey] = lt;
|
|
62
|
+
queries.push(`(${fieldKey} <= :${argKey})`);
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
queryParams,
|
|
66
|
+
queries,
|
|
67
|
+
keysGenerated: currentArgIndex - argIndexStart
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
queryParams: {},
|
|
72
|
+
queries: [],
|
|
73
|
+
keysGenerated: 0
|
|
74
|
+
};
|
|
75
|
+
};
|
|
76
|
+
export const getSelectFilter = (filterValue, fieldKey, argIndexStart) => {
|
|
77
|
+
if (!Array.isArray(filterValue) || filterValue.length === 0) {
|
|
78
|
+
return {
|
|
79
|
+
queryParams: {},
|
|
80
|
+
queries: [],
|
|
81
|
+
keysGenerated: 0
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
let currentArgIndex = argIndexStart;
|
|
85
|
+
const multiSelectQueryParams = Object.fromEntries(filterValue.map(value => {
|
|
86
|
+
currentArgIndex += 1;
|
|
87
|
+
return [generateArgKey(fieldKey, currentArgIndex), String(value)];
|
|
88
|
+
}));
|
|
89
|
+
return {
|
|
90
|
+
queryParams: multiSelectQueryParams,
|
|
91
|
+
queries: [`(${fieldKey === 'mimetype-filter' ? 'item.extension' : fieldKey} HASANY (${Object.keys(multiSelectQueryParams).map(argKey => `:${argKey}`).join(', ')}))`],
|
|
92
|
+
keysGenerated: currentArgIndex - argIndexStart
|
|
93
|
+
};
|
|
94
|
+
};
|
|
95
|
+
export const getMimeTypeFilter = (filterValue, fieldKey, argIndexStart) => {
|
|
96
|
+
if (!Array.isArray(filterValue) || filterValue.length === 0) {
|
|
97
|
+
return {
|
|
98
|
+
queryParams: {},
|
|
99
|
+
queries: [],
|
|
100
|
+
keysGenerated: 0
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
let currentArgIndex = argIndexStart;
|
|
104
|
+
const multiSelectQueryParams = Object.fromEntries(filterValue.map(value => {
|
|
105
|
+
currentArgIndex += 1;
|
|
106
|
+
// the item-type-selector is returning the extensions with the suffix 'Type', so we remove it for the query
|
|
107
|
+
return [generateArgKey(fieldKey, currentArgIndex), String(value.endsWith('Type') ? value.slice(0, -4) : value)];
|
|
108
|
+
}));
|
|
109
|
+
return {
|
|
110
|
+
queryParams: multiSelectQueryParams,
|
|
111
|
+
queries: [`(item.extension IN (${Object.keys(multiSelectQueryParams).map(argKey => `:${argKey}`).join(', ')}))`],
|
|
112
|
+
keysGenerated: currentArgIndex - argIndexStart
|
|
113
|
+
};
|
|
114
|
+
};
|
|
115
|
+
//# sourceMappingURL=MetadataQueryBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MetadataQueryBuilder.js","names":["isNil","mergeQueryParams","targetParams","sourceParams","_objectSpread","mergeQueries","targetQueries","sourceQueries","generateArgKey","key","index","purifyKey","replace","escapeValue","value","getStringFilter","filterValue","fieldKey","argIndexStart","currentArgIndex","argKey","queryParams","queries","keysGenerated","isInvalid","getRangeFilter","range","gt","lt","argKeyGt","argKeyLt","push","getSelectFilter","Array","isArray","length","multiSelectQueryParams","Object","fromEntries","map","String","keys","join","getMimeTypeFilter","endsWith","slice"],"sources":["../../../src/elements/content-explorer/MetadataQueryBuilder.ts"],"sourcesContent":["import isNil from 'lodash/isNil';\n\ntype QueryResult = {\n queryParams: { [key: string]: number | Date | string };\n queries: string[];\n keysGenerated: number;\n};\n\n// Custom type for range filters\ntype SimpleRangeType = {\n range: {\n gt: number | string;\n lt: number | string;\n };\n};\n\n// Union type for filter values\ntype SimpleFilterValue = string[] | SimpleRangeType;\n\nexport const mergeQueryParams = (\n targetParams: { [key: string]: number | Date | string },\n sourceParams: { [key: string]: number | Date | string },\n): { [key: string]: number | Date | string } => {\n return { ...targetParams, ...sourceParams };\n};\n\nexport const mergeQueries = (targetQueries: string[], sourceQueries: string[]): string[] => {\n return [...targetQueries, ...sourceQueries];\n};\n\nconst generateArgKey = (key: string, index: number): string => {\n const purifyKey = key.replace(/[^\\w]/g, '_');\n return `arg_${purifyKey}_${index}`;\n};\n\nconst escapeValue = (value: string): string => value.replace(/([_%])/g, '\\\\$1');\n\nexport const getStringFilter = (filterValue: string, fieldKey: string, argIndexStart: number): QueryResult => {\n let currentArgIndex = argIndexStart;\n\n const argKey = generateArgKey(fieldKey, (currentArgIndex += 1));\n return {\n queryParams: { [argKey]: `%${escapeValue(filterValue)}%` },\n queries: [`(${fieldKey} ILIKE :${argKey})`],\n keysGenerated: currentArgIndex - argIndexStart,\n };\n};\n\nconst isInvalid = (value: number | string) => {\n return isNil(value) || value === '';\n};\n\nexport const getRangeFilter = (\n filterValue: SimpleFilterValue,\n fieldKey: string,\n argIndexStart: number,\n): QueryResult => {\n let currentArgIndex = argIndexStart;\n\n if (filterValue && typeof filterValue === 'object' && 'range' in filterValue && filterValue.range) {\n const { gt, lt } = filterValue.range;\n const queryParams: { [key: string]: number | string } = {};\n const queries: string[] = [];\n\n if (!isInvalid(gt) && !isInvalid(lt)) {\n // Both gt and lt: between values\n const argKeyGt = generateArgKey(fieldKey, (currentArgIndex += 1));\n const argKeyLt = generateArgKey(fieldKey, (currentArgIndex += 1));\n queryParams[argKeyGt] = gt;\n queryParams[argKeyLt] = lt;\n queries.push(`(${fieldKey} >= :${argKeyGt} AND ${fieldKey} <= :${argKeyLt})`);\n } else if (!isInvalid(gt)) {\n // Only gt: greater than\n const argKey = generateArgKey(fieldKey, (currentArgIndex += 1));\n queryParams[argKey] = gt;\n queries.push(`(${fieldKey} >= :${argKey})`);\n } else if (!isInvalid(lt)) {\n // Only lt: less than\n const argKey = generateArgKey(fieldKey, (currentArgIndex += 1));\n queryParams[argKey] = lt;\n queries.push(`(${fieldKey} <= :${argKey})`);\n }\n\n return {\n queryParams,\n queries,\n keysGenerated: currentArgIndex - argIndexStart,\n };\n }\n return {\n queryParams: {},\n queries: [],\n keysGenerated: 0,\n };\n};\n\nexport const getSelectFilter = (filterValue: string[], fieldKey: string, argIndexStart: number): QueryResult => {\n if (!Array.isArray(filterValue) || filterValue.length === 0) {\n return {\n queryParams: {},\n queries: [],\n keysGenerated: 0,\n };\n }\n\n let currentArgIndex = argIndexStart;\n\n const multiSelectQueryParams = Object.fromEntries(\n filterValue.map(value => {\n currentArgIndex += 1;\n return [generateArgKey(fieldKey, currentArgIndex), String(value)];\n }),\n );\n\n return {\n queryParams: multiSelectQueryParams,\n queries: [\n `(${fieldKey === 'mimetype-filter' ? 'item.extension' : fieldKey} HASANY (${Object.keys(\n multiSelectQueryParams,\n )\n .map(argKey => `:${argKey}`)\n .join(', ')}))`,\n ],\n keysGenerated: currentArgIndex - argIndexStart,\n };\n};\n\nexport const getMimeTypeFilter = (filterValue: string[], fieldKey: string, argIndexStart: number): QueryResult => {\n if (!Array.isArray(filterValue) || filterValue.length === 0) {\n return {\n queryParams: {},\n queries: [],\n keysGenerated: 0,\n };\n }\n\n let currentArgIndex = argIndexStart;\n\n const multiSelectQueryParams = Object.fromEntries(\n filterValue.map(value => {\n currentArgIndex += 1;\n // the item-type-selector is returning the extensions with the suffix 'Type', so we remove it for the query\n return [\n generateArgKey(fieldKey, currentArgIndex),\n String(value.endsWith('Type') ? value.slice(0, -4) : value),\n ];\n }),\n );\n\n return {\n queryParams: multiSelectQueryParams,\n queries: [\n `(item.extension IN (${Object.keys(multiSelectQueryParams)\n .map(argKey => `:${argKey}`)\n .join(', ')}))`,\n ],\n keysGenerated: currentArgIndex - argIndexStart,\n };\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,18 +1,23 @@
|
|
|
1
1
|
import React, { useState } from 'react';
|
|
2
2
|
import { useIntl } from 'react-intl';
|
|
3
|
-
import { IconButton, SidePanel, Text } from '@box/blueprint-web';
|
|
3
|
+
import { IconButton, SidePanel, Text, useNotification } from '@box/blueprint-web';
|
|
4
4
|
import { XMark } from '@box/blueprint-web-assets/icons/Fill/index';
|
|
5
5
|
import { FileDefault } from '@box/blueprint-web-assets/icons/Line/index';
|
|
6
6
|
import { AutofillContextProvider, MetadataInstance, MetadataInstanceForm } from '@box/metadata-editor';
|
|
7
|
-
import {
|
|
7
|
+
import { useTemplateInstance, useSelectedItemText } from './utils';
|
|
8
8
|
import messages from '../common/messages';
|
|
9
9
|
import './MetadataSidePanel.scss';
|
|
10
10
|
const MetadataSidePanel = ({
|
|
11
11
|
currentCollection,
|
|
12
|
+
metadataTemplate,
|
|
12
13
|
onClose,
|
|
13
|
-
|
|
14
|
-
|
|
14
|
+
onUpdate,
|
|
15
|
+
refreshCollection,
|
|
16
|
+
selectedItemIds
|
|
15
17
|
}) => {
|
|
18
|
+
const {
|
|
19
|
+
addNotification
|
|
20
|
+
} = useNotification();
|
|
16
21
|
const {
|
|
17
22
|
formatMessage
|
|
18
23
|
} = useIntl();
|
|
@@ -20,26 +25,47 @@ const MetadataSidePanel = ({
|
|
|
20
25
|
const [isUnsavedChangesModalOpen, setIsUnsavedChangesModalOpen] = useState(false);
|
|
21
26
|
const selectedItemText = useSelectedItemText(currentCollection, selectedItemIds);
|
|
22
27
|
const selectedItems = selectedItemIds === 'all' ? currentCollection.items : currentCollection.items.filter(item => selectedItemIds.has(item.id));
|
|
23
|
-
const templateInstance =
|
|
28
|
+
const templateInstance = useTemplateInstance(metadataTemplate, selectedItems, isEditing);
|
|
24
29
|
const handleMetadataInstanceEdit = () => {
|
|
25
30
|
setIsEditing(true);
|
|
26
31
|
};
|
|
27
32
|
const handleMetadataInstanceFormCancel = () => {
|
|
28
33
|
setIsEditing(false);
|
|
29
34
|
};
|
|
30
|
-
|
|
31
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
32
|
-
const handleMetadataInstanceFormChange = values => {
|
|
33
|
-
// TODO: Implement on form change
|
|
34
|
-
};
|
|
35
35
|
const handleMetadataInstanceFormDiscardUnsavedChanges = () => {
|
|
36
36
|
setIsUnsavedChangesModalOpen(false);
|
|
37
37
|
setIsEditing(false);
|
|
38
38
|
};
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
const handleUpdateMetadataSuccess = () => {
|
|
40
|
+
addNotification({
|
|
41
|
+
closeButtonAriaLabel: formatMessage(messages.close),
|
|
42
|
+
sensitivity: 'foreground',
|
|
43
|
+
styledText: formatMessage(messages.metadataUpdateSuccessNotification, {
|
|
44
|
+
numSelected: selectedItems.length
|
|
45
|
+
}),
|
|
46
|
+
typeIconAriaLabel: formatMessage(messages.success),
|
|
47
|
+
variant: 'success'
|
|
48
|
+
});
|
|
49
|
+
setIsEditing(false);
|
|
50
|
+
refreshCollection();
|
|
51
|
+
};
|
|
52
|
+
const handleUpdateMetadataError = () => {
|
|
53
|
+
addNotification({
|
|
54
|
+
closeButtonAriaLabel: formatMessage(messages.close),
|
|
55
|
+
sensitivity: 'foreground',
|
|
56
|
+
styledText: formatMessage(messages.metadataUpdateErrorNotification),
|
|
57
|
+
typeIconAriaLabel: formatMessage(messages.error),
|
|
58
|
+
variant: 'error'
|
|
59
|
+
});
|
|
60
|
+
};
|
|
41
61
|
const handleMetadataInstanceFormSubmit = async (values, operations) => {
|
|
42
|
-
|
|
62
|
+
const {
|
|
63
|
+
fields: templateNewFields
|
|
64
|
+
} = values.metadata;
|
|
65
|
+
const {
|
|
66
|
+
fields: templateOldFields
|
|
67
|
+
} = templateInstance;
|
|
68
|
+
await onUpdate(selectedItems, operations, templateOldFields, templateNewFields, handleUpdateMetadataSuccess, handleUpdateMetadataError);
|
|
43
69
|
};
|
|
44
70
|
return /*#__PURE__*/React.createElement(SidePanel, {
|
|
45
71
|
variant: "persistent"
|
|
@@ -73,7 +99,7 @@ const MetadataSidePanel = ({
|
|
|
73
99
|
isUnsavedChangesModalOpen: isUnsavedChangesModalOpen,
|
|
74
100
|
selectedTemplateInstance: templateInstance,
|
|
75
101
|
onCancel: handleMetadataInstanceFormCancel,
|
|
76
|
-
onChange:
|
|
102
|
+
onChange: null,
|
|
77
103
|
onDelete: null,
|
|
78
104
|
onDiscardUnsavedChanges: handleMetadataInstanceFormDiscardUnsavedChanges,
|
|
79
105
|
onSubmit: handleMetadataInstanceFormSubmit,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MetadataSidePanel.js","names":["React","useState","useIntl","IconButton","SidePanel","Text","XMark","FileDefault","AutofillContextProvider","MetadataInstance","MetadataInstanceForm","getTemplateInstance","useSelectedItemText","messages","MetadataSidePanel","currentCollection","onClose","selectedItemIds","metadataTemplate","formatMessage","isEditing","setIsEditing","isUnsavedChangesModalOpen","setIsUnsavedChangesModalOpen","selectedItemText","selectedItems","items","filter","item","has","id","templateInstance","handleMetadataInstanceEdit","handleMetadataInstanceFormCancel","handleMetadataInstanceFormChange","values","handleMetadataInstanceFormDiscardUnsavedChanges","handleMetadataInstanceFormSubmit","operations","createElement","variant","Header","as","sidebarMetadataTitle","className","color","close","icon","onClick","size","ScrollableContainer","fetchSuggestions","isAiSuggestionsFeatureEnabled","areAiSuggestionsAvailable","isBetaLanguageEnabled","isDeleteButtonDisabled","isDeleteConfirmationModalCheckboxEnabled","isLargeFile","isMultilevelTaxonomyFieldEnabled","selectedTemplateInstance","onCancel","onChange","onDelete","onDiscardUnsavedChanges","onSubmit","taxonomyOptionsFetcher","onEdit","taxonomyNodeFetcher"],"sources":["../../../src/elements/content-explorer/MetadataSidePanel.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport { useIntl } from 'react-intl';\n\nimport { IconButton, SidePanel, Text } from '@box/blueprint-web';\nimport { XMark } from '@box/blueprint-web-assets/icons/Fill/index';\nimport { FileDefault } from '@box/blueprint-web-assets/icons/Line/index';\nimport {\n AutofillContextProvider,\n FormValues,\n JSONPatchOperations,\n MetadataInstance,\n MetadataInstanceForm,\n} from '@box/metadata-editor';\n\nimport type { Selection } from 'react-aria-components';\nimport type { Collection } from '../../common/types/core';\nimport type { MetadataTemplate } from '../../common/types/metadata';\nimport { getTemplateInstance, useSelectedItemText } from './utils';\n\nimport messages from '../common/messages';\n\nimport './MetadataSidePanel.scss';\n\nexport interface MetadataSidePanelProps {\n currentCollection: Collection;\n onClose: () => void;\n metadataTemplate: MetadataTemplate;\n selectedItemIds: Selection;\n}\n\nconst MetadataSidePanel = ({\n currentCollection,\n onClose,\n selectedItemIds,\n metadataTemplate,\n}: MetadataSidePanelProps) => {\n const { formatMessage } = useIntl();\n const [isEditing, setIsEditing] = useState<boolean>(false);\n const [isUnsavedChangesModalOpen, setIsUnsavedChangesModalOpen] = useState<boolean>(false);\n\n const selectedItemText = useSelectedItemText(currentCollection, selectedItemIds);\n const selectedItems =\n selectedItemIds === 'all'\n ? currentCollection.items\n : currentCollection.items.filter(item => selectedItemIds.has(item.id));\n const templateInstance = getTemplateInstance(metadataTemplate, selectedItems);\n\n const handleMetadataInstanceEdit = () => {\n setIsEditing(true);\n };\n\n const handleMetadataInstanceFormCancel = () => {\n setIsEditing(false);\n };\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const handleMetadataInstanceFormChange = (values: FormValues) => {\n // TODO: Implement on form change\n };\n\n const handleMetadataInstanceFormDiscardUnsavedChanges = () => {\n setIsUnsavedChangesModalOpen(false);\n setIsEditing(false);\n };\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const handleMetadataInstanceFormSubmit = async (values: FormValues, operations: JSONPatchOperations) => {\n // TODO: Implement onSave callback\n };\n\n return (\n <SidePanel variant=\"persistent\">\n <SidePanel.Header>\n <div>\n <Text as=\"span\" variant=\"titleLarge\">\n {formatMessage(messages.sidebarMetadataTitle)}\n </Text>\n <div className=\"bce-MetadataSidePanel-subtitle\">\n <FileDefault />\n <Text as=\"span\" color=\"textOnLightSecondary\" variant=\"subtitle\">\n {selectedItemText}\n </Text>\n </div>\n </div>\n <IconButton aria-label={formatMessage(messages.close)} icon={XMark} onClick={onClose} size=\"large\" />\n </SidePanel.Header>\n <SidePanel.ScrollableContainer>\n <div className=\"bce-MetadataSidePanel-content\">\n <AutofillContextProvider fetchSuggestions={null} isAiSuggestionsFeatureEnabled={false}>\n {isEditing ? (\n <MetadataInstanceForm\n areAiSuggestionsAvailable={false}\n isAiSuggestionsFeatureEnabled={false}\n isBetaLanguageEnabled={false}\n isDeleteButtonDisabled={true}\n isDeleteConfirmationModalCheckboxEnabled={false}\n isLargeFile={false}\n isMultilevelTaxonomyFieldEnabled={false}\n isUnsavedChangesModalOpen={isUnsavedChangesModalOpen}\n selectedTemplateInstance={templateInstance}\n onCancel={handleMetadataInstanceFormCancel}\n onChange={handleMetadataInstanceFormChange}\n onDelete={null}\n onDiscardUnsavedChanges={handleMetadataInstanceFormDiscardUnsavedChanges}\n onSubmit={handleMetadataInstanceFormSubmit}\n setIsUnsavedChangesModalOpen={setIsUnsavedChangesModalOpen}\n taxonomyOptionsFetcher={null}\n />\n ) : (\n <MetadataInstance\n areAiSuggestionsAvailable={false}\n isAiSuggestionsFeatureEnabled={false}\n isBetaLanguageEnabled={false}\n onEdit={handleMetadataInstanceEdit}\n templateInstance={templateInstance}\n taxonomyNodeFetcher={null}\n />\n )}\n </AutofillContextProvider>\n </div>\n </SidePanel.ScrollableContainer>\n </SidePanel>\n );\n};\n\nexport default MetadataSidePanel;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"MetadataSidePanel.js","names":["React","useState","useIntl","IconButton","SidePanel","Text","useNotification","XMark","FileDefault","AutofillContextProvider","MetadataInstance","MetadataInstanceForm","useTemplateInstance","useSelectedItemText","messages","MetadataSidePanel","currentCollection","metadataTemplate","onClose","onUpdate","refreshCollection","selectedItemIds","addNotification","formatMessage","isEditing","setIsEditing","isUnsavedChangesModalOpen","setIsUnsavedChangesModalOpen","selectedItemText","selectedItems","items","filter","item","has","id","templateInstance","handleMetadataInstanceEdit","handleMetadataInstanceFormCancel","handleMetadataInstanceFormDiscardUnsavedChanges","handleUpdateMetadataSuccess","closeButtonAriaLabel","close","sensitivity","styledText","metadataUpdateSuccessNotification","numSelected","length","typeIconAriaLabel","success","variant","handleUpdateMetadataError","metadataUpdateErrorNotification","error","handleMetadataInstanceFormSubmit","values","operations","fields","templateNewFields","metadata","templateOldFields","createElement","Header","as","sidebarMetadataTitle","className","color","icon","onClick","size","ScrollableContainer","fetchSuggestions","isAiSuggestionsFeatureEnabled","areAiSuggestionsAvailable","isBetaLanguageEnabled","isDeleteButtonDisabled","isDeleteConfirmationModalCheckboxEnabled","isLargeFile","isMultilevelTaxonomyFieldEnabled","selectedTemplateInstance","onCancel","onChange","onDelete","onDiscardUnsavedChanges","onSubmit","taxonomyOptionsFetcher","onEdit","taxonomyNodeFetcher"],"sources":["../../../src/elements/content-explorer/MetadataSidePanel.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport { useIntl } from 'react-intl';\n\nimport { IconButton, SidePanel, Text, useNotification } from '@box/blueprint-web';\nimport { XMark } from '@box/blueprint-web-assets/icons/Fill/index';\nimport { FileDefault } from '@box/blueprint-web-assets/icons/Line/index';\nimport {\n AutofillContextProvider,\n FormValues,\n JSONPatchOperations,\n MetadataInstance,\n MetadataInstanceForm,\n type MetadataTemplateField,\n} from '@box/metadata-editor';\n\nimport type { Selection } from 'react-aria-components';\nimport type { BoxItem, Collection } from '../../common/types/core';\nimport type { MetadataTemplate } from '../../common/types/metadata';\nimport { useTemplateInstance, useSelectedItemText } from './utils';\n\nimport messages from '../common/messages';\n\nimport './MetadataSidePanel.scss';\n\nexport interface MetadataSidePanelProps {\n currentCollection: Collection;\n metadataTemplate: MetadataTemplate;\n onClose: () => void;\n onUpdate: (\n items: BoxItem[],\n operations: JSONPatchOperations,\n templateOldFields: MetadataTemplateField[],\n templateNewFields: MetadataTemplateField[],\n successCallback: () => void,\n errorCallback: ErrorCallback,\n ) => Promise<void>;\n refreshCollection: () => void;\n selectedItemIds: Selection;\n}\n\nconst MetadataSidePanel = ({\n currentCollection,\n metadataTemplate,\n onClose,\n onUpdate,\n refreshCollection,\n selectedItemIds,\n}: MetadataSidePanelProps) => {\n const { addNotification } = useNotification();\n const { formatMessage } = useIntl();\n const [isEditing, setIsEditing] = useState<boolean>(false);\n const [isUnsavedChangesModalOpen, setIsUnsavedChangesModalOpen] = useState<boolean>(false);\n\n const selectedItemText = useSelectedItemText(currentCollection, selectedItemIds);\n const selectedItems =\n selectedItemIds === 'all'\n ? currentCollection.items\n : currentCollection.items.filter(item => selectedItemIds.has(item.id));\n const templateInstance = useTemplateInstance(metadataTemplate, selectedItems, isEditing);\n\n const handleMetadataInstanceEdit = () => {\n setIsEditing(true);\n };\n\n const handleMetadataInstanceFormCancel = () => {\n setIsEditing(false);\n };\n\n const handleMetadataInstanceFormDiscardUnsavedChanges = () => {\n setIsUnsavedChangesModalOpen(false);\n setIsEditing(false);\n };\n\n const handleUpdateMetadataSuccess = () => {\n addNotification({\n closeButtonAriaLabel: formatMessage(messages.close),\n sensitivity: 'foreground',\n styledText: formatMessage(messages.metadataUpdateSuccessNotification, {\n numSelected: selectedItems.length,\n }),\n typeIconAriaLabel: formatMessage(messages.success),\n variant: 'success',\n });\n setIsEditing(false);\n refreshCollection();\n };\n\n const handleUpdateMetadataError = () => {\n addNotification({\n closeButtonAriaLabel: formatMessage(messages.close),\n sensitivity: 'foreground',\n styledText: formatMessage(messages.metadataUpdateErrorNotification),\n typeIconAriaLabel: formatMessage(messages.error),\n variant: 'error',\n });\n };\n\n const handleMetadataInstanceFormSubmit = async (values: FormValues, operations: JSONPatchOperations) => {\n const { fields: templateNewFields } = values.metadata;\n const { fields: templateOldFields } = templateInstance;\n\n await onUpdate(\n selectedItems,\n operations,\n templateOldFields,\n templateNewFields,\n handleUpdateMetadataSuccess,\n handleUpdateMetadataError,\n );\n };\n\n return (\n <SidePanel variant=\"persistent\">\n <SidePanel.Header>\n <div>\n <Text as=\"span\" variant=\"titleLarge\">\n {formatMessage(messages.sidebarMetadataTitle)}\n </Text>\n <div className=\"bce-MetadataSidePanel-subtitle\">\n <FileDefault />\n <Text as=\"span\" color=\"textOnLightSecondary\" variant=\"subtitle\">\n {selectedItemText}\n </Text>\n </div>\n </div>\n <IconButton aria-label={formatMessage(messages.close)} icon={XMark} onClick={onClose} size=\"large\" />\n </SidePanel.Header>\n <SidePanel.ScrollableContainer>\n <div className=\"bce-MetadataSidePanel-content\">\n <AutofillContextProvider fetchSuggestions={null} isAiSuggestionsFeatureEnabled={false}>\n {isEditing ? (\n <MetadataInstanceForm\n areAiSuggestionsAvailable={false}\n isAiSuggestionsFeatureEnabled={false}\n isBetaLanguageEnabled={false}\n isDeleteButtonDisabled={true}\n isDeleteConfirmationModalCheckboxEnabled={false}\n isLargeFile={false}\n isMultilevelTaxonomyFieldEnabled={false}\n isUnsavedChangesModalOpen={isUnsavedChangesModalOpen}\n selectedTemplateInstance={templateInstance}\n onCancel={handleMetadataInstanceFormCancel}\n onChange={null}\n onDelete={null}\n onDiscardUnsavedChanges={handleMetadataInstanceFormDiscardUnsavedChanges}\n onSubmit={handleMetadataInstanceFormSubmit}\n setIsUnsavedChangesModalOpen={setIsUnsavedChangesModalOpen}\n taxonomyOptionsFetcher={null}\n />\n ) : (\n <MetadataInstance\n areAiSuggestionsAvailable={false}\n isAiSuggestionsFeatureEnabled={false}\n isBetaLanguageEnabled={false}\n onEdit={handleMetadataInstanceEdit}\n templateInstance={templateInstance}\n taxonomyNodeFetcher={null}\n />\n )}\n </AutofillContextProvider>\n </div>\n </SidePanel.ScrollableContainer>\n </SidePanel>\n );\n};\n\nexport default MetadataSidePanel;\n"],"mappings":"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","ignoreList":[]}
|