box-ui-elements 24.0.0-beta.5 → 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.
Files changed (85) hide show
  1. package/dist/explorer.css +1 -1
  2. package/dist/explorer.js +1 -1
  3. package/es/elements/content-explorer/Content.js +3 -1
  4. package/es/elements/content-explorer/Content.js.map +1 -1
  5. package/es/elements/content-explorer/ContentExplorer.js +16 -5
  6. package/es/elements/content-explorer/ContentExplorer.js.map +1 -1
  7. package/es/elements/content-explorer/MetadataQueryAPIHelper.js +104 -7
  8. package/es/elements/content-explorer/MetadataQueryAPIHelper.js.map +1 -1
  9. package/es/elements/content-explorer/MetadataQueryBuilder.js +115 -0
  10. package/es/elements/content-explorer/MetadataQueryBuilder.js.map +1 -0
  11. package/es/elements/content-explorer/MetadataViewContainer.js +92 -46
  12. package/es/elements/content-explorer/MetadataViewContainer.js.map +1 -1
  13. package/es/elements/content-explorer/stories/MetadataView.stories.js +3 -25
  14. package/es/elements/content-explorer/stories/MetadataView.stories.js.map +1 -1
  15. package/es/elements/content-explorer/stories/tests/MetadataView-visual.stories.js +4 -16
  16. package/es/elements/content-explorer/stories/tests/MetadataView-visual.stories.js.map +1 -1
  17. package/es/src/elements/common/__mocks__/mockMetadata.d.ts +8 -24
  18. package/es/src/elements/content-explorer/Content.d.ts +4 -3
  19. package/es/src/elements/content-explorer/ContentExplorer.d.ts +8 -3
  20. package/es/src/elements/content-explorer/MetadataQueryAPIHelper.d.ts +11 -2
  21. package/es/src/elements/content-explorer/MetadataQueryBuilder.d.ts +27 -0
  22. package/es/src/elements/content-explorer/MetadataViewContainer.d.ts +8 -4
  23. package/es/src/elements/content-explorer/__tests__/MetadataQueryBuilder.test.d.ts +1 -0
  24. package/i18n/bn-IN.js +1 -1
  25. package/i18n/bn-IN.properties +8 -0
  26. package/i18n/da-DK.js +1 -1
  27. package/i18n/da-DK.properties +8 -0
  28. package/i18n/de-DE.js +1 -1
  29. package/i18n/de-DE.properties +8 -0
  30. package/i18n/en-AU.js +1 -1
  31. package/i18n/en-AU.properties +8 -0
  32. package/i18n/en-CA.js +1 -1
  33. package/i18n/en-CA.properties +8 -0
  34. package/i18n/en-GB.js +1 -1
  35. package/i18n/en-GB.properties +8 -0
  36. package/i18n/es-419.js +1 -1
  37. package/i18n/es-419.properties +8 -0
  38. package/i18n/es-ES.js +1 -1
  39. package/i18n/es-ES.properties +8 -0
  40. package/i18n/fi-FI.js +1 -1
  41. package/i18n/fi-FI.properties +8 -0
  42. package/i18n/fr-CA.js +1 -1
  43. package/i18n/fr-CA.properties +8 -0
  44. package/i18n/fr-FR.js +1 -1
  45. package/i18n/fr-FR.properties +8 -0
  46. package/i18n/hi-IN.js +1 -1
  47. package/i18n/hi-IN.properties +8 -0
  48. package/i18n/it-IT.js +1 -1
  49. package/i18n/it-IT.properties +8 -0
  50. package/i18n/ja-JP.js +1 -1
  51. package/i18n/ja-JP.properties +8 -0
  52. package/i18n/ko-KR.js +1 -1
  53. package/i18n/ko-KR.properties +8 -0
  54. package/i18n/nb-NO.js +1 -1
  55. package/i18n/nb-NO.properties +8 -0
  56. package/i18n/nl-NL.js +1 -1
  57. package/i18n/nl-NL.properties +8 -0
  58. package/i18n/pl-PL.js +1 -1
  59. package/i18n/pl-PL.properties +8 -0
  60. package/i18n/pt-BR.js +1 -1
  61. package/i18n/pt-BR.properties +8 -0
  62. package/i18n/ru-RU.js +1 -1
  63. package/i18n/ru-RU.properties +8 -0
  64. package/i18n/sv-SE.js +1 -1
  65. package/i18n/sv-SE.properties +8 -0
  66. package/i18n/tr-TR.js +1 -1
  67. package/i18n/tr-TR.properties +8 -0
  68. package/i18n/zh-CN.js +1 -1
  69. package/i18n/zh-CN.properties +8 -0
  70. package/i18n/zh-TW.js +1 -1
  71. package/i18n/zh-TW.properties +8 -0
  72. package/package.json +3 -3
  73. package/src/elements/common/__mocks__/mockMetadata.ts +7 -11
  74. package/src/elements/content-explorer/Content.tsx +8 -2
  75. package/src/elements/content-explorer/ContentExplorer.tsx +208 -193
  76. package/src/elements/content-explorer/MetadataQueryAPIHelper.ts +111 -5
  77. package/src/elements/content-explorer/MetadataQueryBuilder.ts +159 -0
  78. package/src/elements/content-explorer/MetadataViewContainer.tsx +112 -37
  79. package/src/elements/content-explorer/__tests__/Content.test.tsx +1 -0
  80. package/src/elements/content-explorer/__tests__/ContentExplorer.test.tsx +2 -5
  81. package/src/elements/content-explorer/__tests__/MetadataQueryAPIHelper.test.ts +421 -8
  82. package/src/elements/content-explorer/__tests__/MetadataQueryBuilder.test.ts +419 -0
  83. package/src/elements/content-explorer/__tests__/MetadataViewContainer.test.tsx +413 -9
  84. package/src/elements/content-explorer/stories/MetadataView.stories.tsx +3 -21
  85. package/src/elements/content-explorer/stories/tests/MetadataView-visual.stories.tsx +2 -13
@@ -8,7 +8,8 @@ import includes from 'lodash/includes';
8
8
  import isArray from 'lodash/isArray';
9
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 { FIELD_NAME, FIELD_METADATA, FIELD_EXTENSION, FIELD_PERMISSIONS } from '../../constants';
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) {
@@ -161,8 +162,8 @@ export default class MetadataQueryAPIHelper {
161
162
  });
162
163
  });
163
164
  });
164
- _defineProperty(this, "fetchMetadataQueryResults", (metadataQuery, successCallback, errorCallback) => {
165
- this.metadataQuery = this.verifyQueryFields(metadataQuery);
165
+ _defineProperty(this, "fetchMetadataQueryResults", (metadataQuery, successCallback, errorCallback, fields) => {
166
+ this.metadataQuery = this.verifyQueryFields(metadataQuery, fields);
166
167
  return this.queryMetadata().then(this.getTemplateSchemaInfo).then(this.getDataWithTypes).then(collection => {
167
168
  return successCallback(collection, this.metadataTemplate);
168
169
  }).catch(errorCallback);
@@ -182,20 +183,116 @@ export default class MetadataQueryAPIHelper {
182
183
  });
183
184
  return this.api.getMetadataAPI(true).bulkUpdateMetadata(items, this.metadataTemplate, operations, successCallback, errorCallback);
184
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
+ });
185
266
  /**
186
267
  * Verify that the metadata query has required fields and update it if necessary
187
268
  * For a file item, default fields included in the response are "type", "id", "etag"
188
269
  *
189
270
  * @param {MetadataQueryType} metadataQuery metadata query object
271
+ * @param {ExternalFilterValues} [fields] optional filter values to apply to the metadata query
190
272
  * @return {MetadataQueryType} updated metadata query object with required fields
191
273
  */
192
- _defineProperty(this, "verifyQueryFields", metadataQuery => {
274
+ _defineProperty(this, "verifyQueryFields", (metadataQuery, fields) => {
193
275
  const clonedQuery = cloneDeep(metadataQuery);
194
276
  const clonedFields = isArray(clonedQuery.fields) ? clonedQuery.fields : [];
195
-
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
+ }
196
293
  // Make sure the query fields array has "name" field which is necessary to display info.
197
- if (!clonedFields.includes(FIELD_NAME)) {
198
- clonedFields.push(FIELD_NAME);
294
+ if (!clonedFields.includes(FIELD_ITEM_NAME)) {
295
+ clonedFields.push(FIELD_ITEM_NAME);
199
296
  }
200
297
  if (!clonedFields.includes(FIELD_EXTENSION)) {
201
298
  clonedFields.push(FIELD_EXTENSION);
@@ -1 +1 @@
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_NAME","FIELD_METADATA","FIELD_EXTENSION","FIELD_PERMISSIONS","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","clonedQuery","clonedFields"],"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';\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_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';\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 ): 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 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 /**\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 // 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":[]}
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,5 +1,4 @@
1
- const _excluded = ["actionBarProps", "columns", "currentCollection", "metadataTemplate", "onSortChange"],
2
- _excluded2 = ["tableProps"];
1
+ const _excluded = ["actionBarProps", "columns", "currentCollection", "metadataTemplate", "onMetadataFilter", "onSortChange", "tableProps"];
3
2
  function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
4
3
  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; }
5
4
  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; }
@@ -9,11 +8,17 @@ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e =
9
8
  function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
10
9
  function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
11
10
  import * as React from 'react';
11
+ import { useIntl } from 'react-intl';
12
12
  import { MetadataView } from '@box/metadata-view';
13
+ import cloneDeep from 'lodash/cloneDeep';
14
+ import { FIELD_ITEM_NAME } from '../../constants';
15
+ import messages from '../common/messages';
13
16
 
14
17
  // Public-friendly version of MetadataFormFieldValue from @box/metadata-filter
15
18
  // (string[] for enum type, range/float objects stay the same)
16
19
 
20
+ const ITEM_FILTER_NAME = 'item_name';
21
+
17
22
  /**
18
23
  * Helper function to trim metadataFieldNamePrefix from column names
19
24
  * For example: 'metadata.enterprise_1515946.mdViewTemplate1.industry' -> 'industry'
@@ -43,72 +48,113 @@ function transformInitialFilterValuesToInternal(publicValues) {
43
48
  return acc;
44
49
  }, {});
45
50
  }
46
- function transformInternalFieldsToPublic(fields) {
47
- return Object.entries(fields).reduce((acc, [key, {
48
- value
49
- }]) => {
50
- acc[key] = 'enum' in value && Array.isArray(value.enum) ? {
51
- value: value.enum
52
- } : {
53
- value: value
51
+ export function convertFilterValuesToExternal(fields) {
52
+ return Object.entries(fields).reduce((acc, [key, field]) => {
53
+ const {
54
+ value,
55
+ options,
56
+ fieldType
57
+ } = field;
58
+
59
+ // Transform the value based on its type
60
+ const transformedValue = 'enum' in value && Array.isArray(value.enum) ? value.enum // Convert enum type to string array
61
+ : value; // Keep range/float objects as-is
62
+
63
+ acc[key === ITEM_FILTER_NAME ? FIELD_ITEM_NAME : key] = {
64
+ options,
65
+ fieldType,
66
+ value: transformedValue
54
67
  };
55
68
  return acc;
56
69
  }, {});
57
70
  }
71
+
72
+ // Internal helper function for component use
73
+ function transformInternalFieldsToPublic(fields) {
74
+ return convertFilterValuesToExternal(fields);
75
+ }
58
76
  const MetadataViewContainer = _ref => {
59
77
  let {
60
78
  actionBarProps,
61
79
  columns,
62
80
  currentCollection,
63
81
  metadataTemplate,
64
- onSortChange: onSortChangeInternal
82
+ onMetadataFilter,
83
+ onSortChange: onSortChangeInternal,
84
+ tableProps
65
85
  } = _ref,
66
86
  rest = _objectWithoutProperties(_ref, _excluded);
87
+ const {
88
+ formatMessage
89
+ } = useIntl();
67
90
  const {
68
91
  items = []
69
92
  } = currentCollection;
70
93
  const {
71
94
  initialFilterValues: initialFilterValuesProp,
72
- onFilterSubmit: onFilterSubmitProp
95
+ onFilterSubmit
73
96
  } = actionBarProps ?? {};
74
- const filterGroups = React.useMemo(() => [{
75
- toggleable: true,
76
- filters: metadataTemplate?.fields?.map(field => {
77
- return {
78
- id: `${field.key}-filter`,
79
- name: field.displayName,
80
- fieldType: field.type,
81
- options: field.options?.map(({
82
- key
83
- }) => key) || [],
84
- shouldRenderChip: true
85
- };
86
- }) || []
87
- }], [metadataTemplate]);
97
+ const newColumns = React.useMemo(() => {
98
+ let clonedColumns = cloneDeep(columns);
99
+ const hasItemNameField = clonedColumns.some(col => col.id === FIELD_ITEM_NAME);
100
+ if (!hasItemNameField) {
101
+ clonedColumns = [{
102
+ allowsSorting: true,
103
+ id: FIELD_ITEM_NAME,
104
+ isItemMetadata: true,
105
+ isRowHeader: true,
106
+ minWidth: 250,
107
+ maxWidth: 250,
108
+ textValue: formatMessage(messages.name),
109
+ type: 'string'
110
+ }, ...clonedColumns];
111
+ }
112
+ return clonedColumns;
113
+ }, [columns, formatMessage]);
114
+ const filterGroups = React.useMemo(() => {
115
+ const clonedTemplate = cloneDeep(metadataTemplate);
116
+ let fields = clonedTemplate?.fields || [];
88
117
 
89
- // Transform initial filter values to internal field format
118
+ // Check if item_name field already exists to avoid duplicates
119
+ const hasItemNameField = fields.some(field => field.key === ITEM_FILTER_NAME);
120
+ if (!hasItemNameField) {
121
+ fields = [{
122
+ key: ITEM_FILTER_NAME,
123
+ displayName: formatMessage(messages.name),
124
+ type: 'string',
125
+ shouldRenderChip: true
126
+ }, ...fields];
127
+ }
128
+ return [{
129
+ toggleable: true,
130
+ filters: fields?.map(field => {
131
+ return {
132
+ id: field.key,
133
+ name: field.displayName,
134
+ fieldType: field.type,
135
+ options: field.options?.map(({
136
+ key
137
+ }) => key) || [],
138
+ shouldRenderChip: true
139
+ };
140
+ }) || []
141
+ }];
142
+ }, [formatMessage, metadataTemplate]);
90
143
  const initialFilterValues = React.useMemo(() => transformInitialFilterValuesToInternal(initialFilterValuesProp), [initialFilterValuesProp]);
91
-
92
- // Transform field values to public-friendly format
93
- const onFilterSubmit = React.useCallback(fields => {
94
- if (!onFilterSubmitProp) return;
144
+ const handleFilterSubmit = React.useCallback(fields => {
95
145
  const transformed = transformInternalFieldsToPublic(fields);
96
- onFilterSubmitProp(transformed);
97
- }, [onFilterSubmitProp]);
146
+ onMetadataFilter(transformed);
147
+ if (onFilterSubmit) {
148
+ onFilterSubmit(transformed);
149
+ }
150
+ }, [onFilterSubmit, onMetadataFilter]);
98
151
  const transformedActionBarProps = React.useMemo(() => {
99
152
  return _objectSpread(_objectSpread({}, actionBarProps), {}, {
100
153
  initialFilterValues,
101
- onFilterSubmit,
154
+ onFilterSubmit: handleFilterSubmit,
102
155
  filterGroups
103
156
  });
104
- }, [actionBarProps, initialFilterValues, onFilterSubmit, filterGroups]);
105
-
106
- // Extract the original tableProps.onSortChange from rest
107
- const {
108
- tableProps
109
- } = rest,
110
- otherRest = _objectWithoutProperties(rest, _excluded2);
111
- const onSortChangeExternal = tableProps?.onSortChange;
157
+ }, [actionBarProps, initialFilterValues, handleFilterSubmit, filterGroups]);
112
158
 
113
159
  // Create a wrapper function that calls both. The wrapper function should follow the signature of onSortChange from RAC
114
160
  const handleSortChange = React.useCallback(({
@@ -121,7 +167,7 @@ const MetadataViewContainer = _ref => {
121
167
  const trimmedColumn = trimMetadataFieldPrefix(String(column));
122
168
  onSortChangeInternal(trimmedColumn, direction === 'ascending' ? 'ASC' : 'DESC');
123
169
  }
124
-
170
+ const onSortChangeExternal = tableProps?.onSortChange;
125
171
  // Then call the original customer-provided onSortChange if it exists
126
172
  // Accepts "ascending" / "descending" (https://react-spectrum.adobe.com/react-aria/Table.html)
127
173
  if (onSortChangeExternal) {
@@ -130,7 +176,7 @@ const MetadataViewContainer = _ref => {
130
176
  direction
131
177
  });
132
178
  }
133
- }, [onSortChangeInternal, onSortChangeExternal]);
179
+ }, [onSortChangeInternal, tableProps]);
134
180
 
135
181
  // Create new tableProps with our wrapper function
136
182
  const newTableProps = _objectSpread(_objectSpread({}, tableProps), {}, {
@@ -138,10 +184,10 @@ const MetadataViewContainer = _ref => {
138
184
  });
139
185
  return /*#__PURE__*/React.createElement(MetadataView, _extends({
140
186
  actionBarProps: transformedActionBarProps,
141
- columns: columns,
187
+ columns: newColumns,
142
188
  items: items,
143
189
  tableProps: newTableProps
144
- }, otherRest));
190
+ }, rest));
145
191
  };
146
192
  export default MetadataViewContainer;
147
193
  //# sourceMappingURL=MetadataViewContainer.js.map