box-ui-elements 24.0.0-beta.6 → 24.0.0-beta.7
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.js +1 -1
- package/dist/picker.js +1 -1
- package/es/elements/content-explorer/ContentExplorer.js +1 -1
- package/es/elements/content-explorer/ContentExplorer.js.map +1 -1
- package/es/elements/content-explorer/MetadataQueryBuilder.js +47 -8
- package/es/elements/content-explorer/MetadataQueryBuilder.js.map +1 -1
- package/es/elements/content-explorer/constants.js +4 -2
- package/es/elements/content-explorer/constants.js.map +1 -1
- package/es/elements/content-explorer/utils.js +12 -0
- package/es/elements/content-explorer/utils.js.map +1 -1
- package/es/src/elements/content-explorer/constants.d.ts +4 -2
- package/es/src/elements/content-explorer/utils.d.ts +2 -0
- package/package.json +1 -1
- package/src/elements/content-explorer/ContentExplorer.tsx +1 -1
- package/src/elements/content-explorer/MetadataQueryBuilder.ts +54 -19
- package/src/elements/content-explorer/__tests__/MetadataQueryAPIHelper.test.ts +8 -2
- package/src/elements/content-explorer/__tests__/MetadataQueryBuilder.test.ts +155 -39
- package/src/elements/content-explorer/constants.ts +39 -2
- package/src/elements/content-explorer/utils.ts +17 -0
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
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); }
|
|
1
2
|
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
3
|
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
4
|
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
5
|
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
5
6
|
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
7
|
import isNil from 'lodash/isNil';
|
|
8
|
+
import { mapFileTypes } from './utils';
|
|
7
9
|
|
|
8
10
|
// Custom type for range filters
|
|
9
11
|
|
|
@@ -88,7 +90,7 @@ export const getSelectFilter = (filterValue, fieldKey, argIndexStart) => {
|
|
|
88
90
|
}));
|
|
89
91
|
return {
|
|
90
92
|
queryParams: multiSelectQueryParams,
|
|
91
|
-
queries: [`(${fieldKey
|
|
93
|
+
queries: [`(${fieldKey} HASANY (${Object.keys(multiSelectQueryParams).map(argKey => `:${argKey}`).join(', ')}))`],
|
|
92
94
|
keysGenerated: currentArgIndex - argIndexStart
|
|
93
95
|
};
|
|
94
96
|
};
|
|
@@ -100,15 +102,52 @@ export const getMimeTypeFilter = (filterValue, fieldKey, argIndexStart) => {
|
|
|
100
102
|
keysGenerated: 0
|
|
101
103
|
};
|
|
102
104
|
}
|
|
105
|
+
|
|
106
|
+
// Use mapFileTypes to get the correct extensions and handle special cases
|
|
107
|
+
const mappedExtensions = mapFileTypes(filterValue);
|
|
108
|
+
if (mappedExtensions.length === 0) {
|
|
109
|
+
return {
|
|
110
|
+
queryParams: {},
|
|
111
|
+
queries: [],
|
|
112
|
+
keysGenerated: 0
|
|
113
|
+
};
|
|
114
|
+
}
|
|
103
115
|
let currentArgIndex = argIndexStart;
|
|
104
|
-
const
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
116
|
+
const queryParams = {};
|
|
117
|
+
const queries = [];
|
|
118
|
+
|
|
119
|
+
// Handle specific extensions and folder type
|
|
120
|
+
const extensions = [];
|
|
121
|
+
let hasFolder = false;
|
|
122
|
+
for (const extension of mappedExtensions) {
|
|
123
|
+
if (extension === 'folder') {
|
|
124
|
+
if (!hasFolder) {
|
|
125
|
+
currentArgIndex += 1;
|
|
126
|
+
const folderArgKey = generateArgKey('mime_folderType', currentArgIndex);
|
|
127
|
+
queryParams[folderArgKey] = 'folder';
|
|
128
|
+
queries.push(`(item.type = :${folderArgKey})`);
|
|
129
|
+
hasFolder = true;
|
|
130
|
+
}
|
|
131
|
+
} else {
|
|
132
|
+
extensions.push(extension);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Handle extensions in batch if any exist
|
|
137
|
+
if (extensions.length > 0) {
|
|
138
|
+
const extensionQueryParams = Object.fromEntries(extensions.map(extension => {
|
|
139
|
+
currentArgIndex += 1;
|
|
140
|
+
return [generateArgKey(fieldKey, currentArgIndex), extension];
|
|
141
|
+
}));
|
|
142
|
+
_extends(queryParams, extensionQueryParams);
|
|
143
|
+
queries.push(`(item.extension IN (${Object.keys(extensionQueryParams).map(argKey => `:${argKey}`).join(', ')}))`);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// Combine queries with OR if multiple exist
|
|
147
|
+
const finalQueries = queries.length > 1 ? [`(${queries.join(' OR ')})`] : queries;
|
|
109
148
|
return {
|
|
110
|
-
queryParams
|
|
111
|
-
queries:
|
|
149
|
+
queryParams,
|
|
150
|
+
queries: finalQueries,
|
|
112
151
|
keysGenerated: currentArgIndex - argIndexStart
|
|
113
152
|
};
|
|
114
153
|
};
|
|
@@ -1 +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
|
+
{"version":3,"file":"MetadataQueryBuilder.js","names":["isNil","mapFileTypes","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","mappedExtensions","extensions","hasFolder","extension","folderArgKey","extensionQueryParams","_extends","finalQueries"],"sources":["../../../src/elements/content-explorer/MetadataQueryBuilder.ts"],"sourcesContent":["import { BoxItemSelection } from '@box/box-item-type-selector';\nimport isNil from 'lodash/isNil';\nimport { mapFileTypes } from './utils';\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} HASANY (${Object.keys(multiSelectQueryParams)\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 // Use mapFileTypes to get the correct extensions and handle special cases\n const mappedExtensions = mapFileTypes(filterValue as BoxItemSelection);\n if (mappedExtensions.length === 0) {\n return {\n queryParams: {},\n queries: [],\n keysGenerated: 0,\n };\n }\n\n let currentArgIndex = argIndexStart;\n const queryParams: { [key: string]: number | Date | string } = {};\n const queries: string[] = [];\n\n // Handle specific extensions and folder type\n const extensions: string[] = [];\n let hasFolder = false;\n\n for (const extension of mappedExtensions) {\n if (extension === 'folder') {\n if (!hasFolder) {\n currentArgIndex += 1;\n const folderArgKey = generateArgKey('mime_folderType', currentArgIndex);\n queryParams[folderArgKey] = 'folder';\n queries.push(`(item.type = :${folderArgKey})`);\n hasFolder = true;\n }\n } else {\n extensions.push(extension);\n }\n }\n\n // Handle extensions in batch if any exist\n if (extensions.length > 0) {\n const extensionQueryParams = Object.fromEntries(\n extensions.map(extension => {\n currentArgIndex += 1;\n return [generateArgKey(fieldKey, currentArgIndex), extension];\n }),\n );\n\n Object.assign(queryParams, extensionQueryParams);\n queries.push(\n `(item.extension IN (${Object.keys(extensionQueryParams)\n .map(argKey => `:${argKey}`)\n .join(', ')}))`,\n );\n }\n\n // Combine queries with OR if multiple exist\n const finalQueries = queries.length > 1 ? [`(${queries.join(' OR ')})`] : queries;\n\n return {\n queryParams,\n queries: finalQueries,\n keysGenerated: currentArgIndex - argIndexStart,\n };\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -2,6 +2,8 @@ import { FIELD_FILE_VERSION, FIELD_SHA1, FIELD_SHARED_LINK, FIELD_WATERMARK_INFO
|
|
|
2
2
|
import { FOLDER_FIELDS_TO_FETCH } from '../../utils/fields';
|
|
3
3
|
|
|
4
4
|
// Fields needed for Content Explorer folder requests
|
|
5
|
-
const CONTENT_EXPLORER_FOLDER_FIELDS_TO_FETCH = [...FOLDER_FIELDS_TO_FETCH, FIELD_FILE_VERSION, FIELD_SHA1, FIELD_SHARED_LINK, FIELD_WATERMARK_INFO];
|
|
6
|
-
export
|
|
5
|
+
export const CONTENT_EXPLORER_FOLDER_FIELDS_TO_FETCH = [...FOLDER_FIELDS_TO_FETCH, FIELD_FILE_VERSION, FIELD_SHA1, FIELD_SHARED_LINK, FIELD_WATERMARK_INFO];
|
|
6
|
+
export const NON_FOLDER_FILE_TYPES_MAP = new Map([['boxnoteType', ['boxnote']], ['boxcanvasType', ['boxcanvas']], ['pdfType', ['pdf']], ['documentType', ['doc', 'docx', 'gdoc', 'rtf', 'txt']], ['spreadsheetType', ['xls', 'xlsx', 'xlsm', 'csv', 'gsheet']], ['presentationType', ['ppt', 'pptx', 'odp']], ['imageType', ['png', 'jpg', 'jpeg', 'gif', 'bmp', 'tif', 'tiff']], ['audioType', ['mp3', 'm4a', 'm4p', 'wav', 'mid', 'wma']], ['videoType', ['mp4', 'mpeg', 'mpg', 'wmv', '3g2', '3gp', 'avi', 'm2v', 'm4v', 'mkv', 'mov', 'ogg', 'mts', 'qt', 'ts', 'flv', 'rm']], ['drawingType', ['dwg', 'dxf']], ['threedType', ['obj', 'fbx', 'stl', 'amf', 'iges']]]);
|
|
7
|
+
export const FILE_FOLDER_TYPES_MAP = new Map(NON_FOLDER_FILE_TYPES_MAP).set('folderType', ['folder']);
|
|
8
|
+
export const NON_FOLDER_FILE_TYPES = Array.from(NON_FOLDER_FILE_TYPES_MAP.keys());
|
|
7
9
|
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","names":["FIELD_FILE_VERSION","FIELD_SHA1","FIELD_SHARED_LINK","FIELD_WATERMARK_INFO","FOLDER_FIELDS_TO_FETCH","CONTENT_EXPLORER_FOLDER_FIELDS_TO_FETCH"],"sources":["../../../src/elements/content-explorer/constants.ts"],"sourcesContent":["import { FIELD_FILE_VERSION, FIELD_SHA1, FIELD_SHARED_LINK, FIELD_WATERMARK_INFO } from '../../constants';\nimport { FOLDER_FIELDS_TO_FETCH } from '../../utils/fields';\n\n// Fields needed for Content Explorer folder requests\
|
|
1
|
+
{"version":3,"file":"constants.js","names":["FIELD_FILE_VERSION","FIELD_SHA1","FIELD_SHARED_LINK","FIELD_WATERMARK_INFO","FOLDER_FIELDS_TO_FETCH","CONTENT_EXPLORER_FOLDER_FIELDS_TO_FETCH","NON_FOLDER_FILE_TYPES_MAP","Map","FILE_FOLDER_TYPES_MAP","set","NON_FOLDER_FILE_TYPES","Array","from","keys"],"sources":["../../../src/elements/content-explorer/constants.ts"],"sourcesContent":["import { FIELD_FILE_VERSION, FIELD_SHA1, FIELD_SHARED_LINK, FIELD_WATERMARK_INFO } from '../../constants';\nimport { FOLDER_FIELDS_TO_FETCH } from '../../utils/fields';\n\n// Fields needed for Content Explorer folder requests\nexport const CONTENT_EXPLORER_FOLDER_FIELDS_TO_FETCH = [\n ...FOLDER_FIELDS_TO_FETCH,\n FIELD_FILE_VERSION,\n FIELD_SHA1,\n FIELD_SHARED_LINK,\n FIELD_WATERMARK_INFO,\n];\n\nexport const NON_FOLDER_FILE_TYPES_MAP = new Map([\n ['boxnoteType', ['boxnote']],\n ['boxcanvasType', ['boxcanvas']],\n ['pdfType', ['pdf']],\n ['documentType', ['doc', 'docx', 'gdoc', 'rtf', 'txt']],\n ['spreadsheetType', ['xls', 'xlsx', 'xlsm', 'csv', 'gsheet']],\n ['presentationType', ['ppt', 'pptx', 'odp']],\n ['imageType', ['png', 'jpg', 'jpeg', 'gif', 'bmp', 'tif', 'tiff']],\n ['audioType', ['mp3', 'm4a', 'm4p', 'wav', 'mid', 'wma']],\n [\n 'videoType',\n [\n 'mp4',\n 'mpeg',\n 'mpg',\n 'wmv',\n '3g2',\n '3gp',\n 'avi',\n 'm2v',\n 'm4v',\n 'mkv',\n 'mov',\n 'ogg',\n 'mts',\n 'qt',\n 'ts',\n 'flv',\n 'rm',\n ],\n ],\n ['drawingType', ['dwg', 'dxf']],\n ['threedType', ['obj', 'fbx', 'stl', 'amf', 'iges']],\n]);\n\nexport const FILE_FOLDER_TYPES_MAP = new Map(NON_FOLDER_FILE_TYPES_MAP).set('folderType', ['folder']);\n\nexport const NON_FOLDER_FILE_TYPES = Array.from(NON_FOLDER_FILE_TYPES_MAP.keys());\n"],"mappings":"AAAA,SAASA,kBAAkB,EAAEC,UAAU,EAAEC,iBAAiB,EAAEC,oBAAoB,QAAQ,iBAAiB;AACzG,SAASC,sBAAsB,QAAQ,oBAAoB;;AAE3D;AACA,OAAO,MAAMC,uCAAuC,GAAG,CACnD,GAAGD,sBAAsB,EACzBJ,kBAAkB,EAClBC,UAAU,EACVC,iBAAiB,EACjBC,oBAAoB,CACvB;AAED,OAAO,MAAMG,yBAAyB,GAAG,IAAIC,GAAG,CAAC,CAC7C,CAAC,aAAa,EAAE,CAAC,SAAS,CAAC,CAAC,EAC5B,CAAC,eAAe,EAAE,CAAC,WAAW,CAAC,CAAC,EAChC,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC,EACpB,CAAC,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,EACvD,CAAC,iBAAiB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,EAC7D,CAAC,kBAAkB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,EAC5C,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,EAClE,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,EACzD,CACI,WAAW,EACX,CACI,KAAK,EACL,MAAM,EACN,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,IAAI,CACP,CACJ,EACD,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,EAC/B,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CACvD,CAAC;AAEF,OAAO,MAAMC,qBAAqB,GAAG,IAAID,GAAG,CAACD,yBAAyB,CAAC,CAACG,GAAG,CAAC,YAAY,EAAE,CAAC,QAAQ,CAAC,CAAC;AAErG,OAAO,MAAMC,qBAAqB,GAAGC,KAAK,CAACC,IAAI,CAACN,yBAAyB,CAACO,IAAI,CAAC,CAAC,CAAC","ignoreList":[]}
|
|
@@ -9,6 +9,7 @@ import isNil from 'lodash/isNil';
|
|
|
9
9
|
import xor from 'lodash/xor';
|
|
10
10
|
import { MULTI_VALUE_DEFAULT_OPTION, MULTI_VALUE_DEFAULT_VALUE } from '@box/metadata-editor';
|
|
11
11
|
import messages from '../common/messages';
|
|
12
|
+
import { FILE_FOLDER_TYPES_MAP, NON_FOLDER_FILE_TYPES } from './constants';
|
|
12
13
|
|
|
13
14
|
// Specific type for metadata field value in the item
|
|
14
15
|
// Note: Item doesn't have field value in metadata object if that field is not set, so the value will be undefined in this case
|
|
@@ -192,4 +193,15 @@ export function useTemplateInstance(metadataTemplate, selectedItems, isEditing)
|
|
|
192
193
|
type
|
|
193
194
|
};
|
|
194
195
|
}
|
|
196
|
+
export const mapFileTypes = selectedFileTypes => {
|
|
197
|
+
const selectedFileTypesSet = new Set(selectedFileTypes);
|
|
198
|
+
const areAllNonFolderFileTypesSelected = NON_FOLDER_FILE_TYPES.every(key => selectedFileTypesSet.has(key));
|
|
199
|
+
if (areAllNonFolderFileTypesSelected) {
|
|
200
|
+
if (selectedFileTypes.includes('folderType')) {
|
|
201
|
+
return [];
|
|
202
|
+
}
|
|
203
|
+
return ['file'];
|
|
204
|
+
}
|
|
205
|
+
return selectedFileTypes.map(fileType => FILE_FOLDER_TYPES_MAP.get(fileType) || []).flat();
|
|
206
|
+
};
|
|
195
207
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","names":["React","useMemo","useIntl","isNil","xor","MULTI_VALUE_DEFAULT_OPTION","MULTI_VALUE_DEFAULT_VALUE","messages","useSelectedItemText","currentCollection","selectedItemIds","formatMessage","selectedCount","items","length","size","selectedKey","id","values","next","value","selectedItem","find","item","name","numFilesSelected","numSelected","isEmptyValue","Array","isArray","Number","isNaN","areFieldValuesEqual","value1","value2","getDefaultValueByFieldType","fieldType","undefined","getFieldValue","fieldValue","isMultiValuesField","useTemplateInstance","metadataTemplate","selectedItems","isEditing","displayName","fields","hidden","scope","templateKey","type","selectedItemsFields","map","fieldDisplayName","fieldHidden","fieldId","key","options","defaultItemField","firstSelectedItem","firstSelectedItemFieldValue","metadata","_objectSpread","allItemsHaveSameInitialValue","every","multiValueOption","option","push","multipleValuesText","multipleValues","createElement","Fragment","canEdit"],"sources":["../../../src/elements/content-explorer/utils.ts"],"sourcesContent":["import React, { useMemo } from 'react';\nimport { useIntl } from 'react-intl';\nimport isNil from 'lodash/isNil';\nimport xor from 'lodash/xor';\n\nimport {\n MULTI_VALUE_DEFAULT_OPTION,\n MULTI_VALUE_DEFAULT_VALUE,\n type MetadataTemplate,\n type MetadataFormFieldValue,\n} from '@box/metadata-editor';\nimport type { MetadataFieldType } from '@box/metadata-view';\nimport type { Selection } from 'react-aria-components';\nimport type { BoxItem, Collection } from '../../common/types/core';\n\nimport messages from '../common/messages';\n\n// Specific type for metadata field value in the item\n// Note: Item doesn't have field value in metadata object if that field is not set, so the value will be undefined in this case\ntype ItemMetadataFieldValue = string | number | Array<string> | null | undefined;\n\n// Get selected item text\nexport function useSelectedItemText(currentCollection: Collection, selectedItemIds: Selection): string {\n const { formatMessage } = useIntl();\n\n return useMemo(() => {\n const selectedCount = selectedItemIds === 'all' ? currentCollection.items.length : selectedItemIds.size;\n if (selectedCount === 0) return '';\n\n // Case 1: Single selected item - show item name\n if (selectedCount === 1) {\n const selectedKey =\n selectedItemIds === 'all' ? currentCollection.items[0].id : selectedItemIds.values().next().value;\n const selectedItem = currentCollection.items.find(item => item.id === selectedKey);\n return selectedItem?.name ?? '';\n }\n\n // Case 2: Multiple selected items - show count\n return formatMessage(messages.numFilesSelected, { numSelected: selectedCount });\n }, [currentCollection.items, formatMessage, selectedItemIds]);\n}\n\n// Check if the field value is empty.\n// Note: 0 doesn't represent empty here because of float type field\nexport function isEmptyValue(value: ItemMetadataFieldValue) {\n if (isNil(value)) {\n return true;\n }\n\n // date, string, enum\n if (value === '') {\n return true;\n }\n\n // multiSelect\n if (Array.isArray(value) && value.length === 0) {\n return true;\n }\n\n // float\n if (Number.isNaN(value)) {\n return true;\n }\n\n return false;\n}\n\n// Check if the field values are equal based on the field types\nexport function areFieldValuesEqual(value1: ItemMetadataFieldValue, value2: ItemMetadataFieldValue) {\n if (isEmptyValue(value1) && isEmptyValue(value2)) {\n return true;\n }\n\n // Handle multiSelect arrays comparison\n if (Array.isArray(value1) && Array.isArray(value2)) {\n return xor(value1, value2).length === 0;\n }\n\n return value1 === value2;\n}\n\n// Return default form value by field type\nfunction getDefaultValueByFieldType(fieldType: MetadataFieldType) {\n if (fieldType === 'date' || fieldType === 'enum' || fieldType === 'float' || fieldType === 'string') {\n return '';\n }\n if (fieldType === 'multiSelect') {\n return [];\n }\n return undefined;\n}\n\n// Set the field value in Metadata Form based on the field type\nfunction getFieldValue(fieldType: MetadataFieldType, fieldValue: ItemMetadataFieldValue) {\n if (isNil(fieldValue)) {\n return getDefaultValueByFieldType(fieldType);\n }\n return fieldValue;\n}\n\n// Check if the field value in Metadata Form is multi-values such as \"Multiple values\"\nexport function isMultiValuesField(fieldType: MetadataFieldType, fieldValue: MetadataFormFieldValue) {\n if (fieldType === 'multiSelect') {\n return Array.isArray(fieldValue) && fieldValue.length === 1 && fieldValue[0] === MULTI_VALUE_DEFAULT_VALUE;\n }\n if (fieldType === 'enum') {\n return fieldValue === MULTI_VALUE_DEFAULT_VALUE;\n }\n return false;\n}\n\n// Get template instance based on metadata template and selected items\nexport function useTemplateInstance(metadataTemplate: MetadataTemplate, selectedItems: BoxItem[], isEditing: boolean) {\n const { formatMessage } = useIntl();\n const { displayName, fields, hidden, id, scope, templateKey, type } = metadataTemplate;\n\n const selectedItemsFields = fields.map(\n ({ displayName: fieldDisplayName, hidden: fieldHidden, id: fieldId, key, options, type: fieldType }) => {\n const defaultItemField = {\n displayName: fieldDisplayName,\n hidden: fieldHidden,\n id: fieldId,\n key,\n options,\n type: fieldType,\n value: getFieldValue(fieldType as MetadataFieldType, undefined),\n };\n\n const firstSelectedItem = selectedItems[0];\n const firstSelectedItemFieldValue = firstSelectedItem.metadata[scope][templateKey][key];\n\n // Case 1: Single selected item\n if (selectedItems.length <= 1) {\n return {\n ...defaultItemField,\n value: firstSelectedItemFieldValue,\n };\n }\n\n // Case 2.1: Multiple selected items, but all have the same initial value\n const allItemsHaveSameInitialValue = selectedItems.every(selectedItem =>\n areFieldValuesEqual(selectedItem.metadata[scope][templateKey][key], firstSelectedItemFieldValue),\n );\n\n if (allItemsHaveSameInitialValue) {\n return {\n ...defaultItemField,\n value: getFieldValue(fieldType as MetadataFieldType, firstSelectedItemFieldValue),\n };\n }\n\n // Case 2.2: Multiple selected items, but some have different initial values\n // Case 2.2.1: Edit Mode\n if (isEditing) {\n let fieldValue = getFieldValue(fieldType as MetadataFieldType, undefined);\n // Add MultiValue Option if the field is multiSelect or enum\n if (fieldType === 'multiSelect' || fieldType === 'enum') {\n fieldValue = fieldType === 'enum' ? MULTI_VALUE_DEFAULT_VALUE : [MULTI_VALUE_DEFAULT_VALUE];\n const multiValueOption = options?.find(option => option.key === MULTI_VALUE_DEFAULT_VALUE);\n if (!multiValueOption) {\n options?.push(MULTI_VALUE_DEFAULT_OPTION);\n }\n }\n return {\n ...defaultItemField,\n value: fieldValue,\n };\n }\n\n /**\n * Case: 2.2.2 View Mode\n *\n * We want to show \"Multiple values\" label for multiple dates across files selection.\n * We use fragment here to bypass check in shared feature.\n * This feature tries to parse string as date if the string is passed as value.\n */\n const multipleValuesText = formatMessage(messages.multipleValues);\n return {\n ...defaultItemField,\n value: React.createElement(React.Fragment, null, multipleValuesText),\n };\n },\n );\n\n return {\n canEdit: true,\n displayName,\n hidden,\n id,\n fields: selectedItemsFields,\n scope,\n templateKey,\n type,\n };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"utils.js","names":["React","useMemo","useIntl","isNil","xor","MULTI_VALUE_DEFAULT_OPTION","MULTI_VALUE_DEFAULT_VALUE","messages","FILE_FOLDER_TYPES_MAP","NON_FOLDER_FILE_TYPES","useSelectedItemText","currentCollection","selectedItemIds","formatMessage","selectedCount","items","length","size","selectedKey","id","values","next","value","selectedItem","find","item","name","numFilesSelected","numSelected","isEmptyValue","Array","isArray","Number","isNaN","areFieldValuesEqual","value1","value2","getDefaultValueByFieldType","fieldType","undefined","getFieldValue","fieldValue","isMultiValuesField","useTemplateInstance","metadataTemplate","selectedItems","isEditing","displayName","fields","hidden","scope","templateKey","type","selectedItemsFields","map","fieldDisplayName","fieldHidden","fieldId","key","options","defaultItemField","firstSelectedItem","firstSelectedItemFieldValue","metadata","_objectSpread","allItemsHaveSameInitialValue","every","multiValueOption","option","push","multipleValuesText","multipleValues","createElement","Fragment","canEdit","mapFileTypes","selectedFileTypes","selectedFileTypesSet","Set","areAllNonFolderFileTypesSelected","has","includes","fileType","get","flat"],"sources":["../../../src/elements/content-explorer/utils.ts"],"sourcesContent":["import React, { useMemo } from 'react';\nimport { useIntl } from 'react-intl';\nimport isNil from 'lodash/isNil';\nimport xor from 'lodash/xor';\n\nimport {\n MULTI_VALUE_DEFAULT_OPTION,\n MULTI_VALUE_DEFAULT_VALUE,\n type MetadataTemplate,\n type MetadataFormFieldValue,\n} from '@box/metadata-editor';\nimport type { MetadataFieldType } from '@box/metadata-view';\nimport type { Selection } from 'react-aria-components';\nimport { BoxItemSelection } from '@box/box-item-type-selector';\nimport type { BoxItem, Collection } from '../../common/types/core';\n\nimport messages from '../common/messages';\nimport { FILE_FOLDER_TYPES_MAP, NON_FOLDER_FILE_TYPES } from './constants';\n\n// Specific type for metadata field value in the item\n// Note: Item doesn't have field value in metadata object if that field is not set, so the value will be undefined in this case\ntype ItemMetadataFieldValue = string | number | Array<string> | null | undefined;\n\n// Get selected item text\nexport function useSelectedItemText(currentCollection: Collection, selectedItemIds: Selection): string {\n const { formatMessage } = useIntl();\n\n return useMemo(() => {\n const selectedCount = selectedItemIds === 'all' ? currentCollection.items.length : selectedItemIds.size;\n if (selectedCount === 0) return '';\n\n // Case 1: Single selected item - show item name\n if (selectedCount === 1) {\n const selectedKey =\n selectedItemIds === 'all' ? currentCollection.items[0].id : selectedItemIds.values().next().value;\n const selectedItem = currentCollection.items.find(item => item.id === selectedKey);\n return selectedItem?.name ?? '';\n }\n\n // Case 2: Multiple selected items - show count\n return formatMessage(messages.numFilesSelected, { numSelected: selectedCount });\n }, [currentCollection.items, formatMessage, selectedItemIds]);\n}\n\n// Check if the field value is empty.\n// Note: 0 doesn't represent empty here because of float type field\nexport function isEmptyValue(value: ItemMetadataFieldValue) {\n if (isNil(value)) {\n return true;\n }\n\n // date, string, enum\n if (value === '') {\n return true;\n }\n\n // multiSelect\n if (Array.isArray(value) && value.length === 0) {\n return true;\n }\n\n // float\n if (Number.isNaN(value)) {\n return true;\n }\n\n return false;\n}\n\n// Check if the field values are equal based on the field types\nexport function areFieldValuesEqual(value1: ItemMetadataFieldValue, value2: ItemMetadataFieldValue) {\n if (isEmptyValue(value1) && isEmptyValue(value2)) {\n return true;\n }\n\n // Handle multiSelect arrays comparison\n if (Array.isArray(value1) && Array.isArray(value2)) {\n return xor(value1, value2).length === 0;\n }\n\n return value1 === value2;\n}\n\n// Return default form value by field type\nfunction getDefaultValueByFieldType(fieldType: MetadataFieldType) {\n if (fieldType === 'date' || fieldType === 'enum' || fieldType === 'float' || fieldType === 'string') {\n return '';\n }\n if (fieldType === 'multiSelect') {\n return [];\n }\n return undefined;\n}\n\n// Set the field value in Metadata Form based on the field type\nfunction getFieldValue(fieldType: MetadataFieldType, fieldValue: ItemMetadataFieldValue) {\n if (isNil(fieldValue)) {\n return getDefaultValueByFieldType(fieldType);\n }\n return fieldValue;\n}\n\n// Check if the field value in Metadata Form is multi-values such as \"Multiple values\"\nexport function isMultiValuesField(fieldType: MetadataFieldType, fieldValue: MetadataFormFieldValue) {\n if (fieldType === 'multiSelect') {\n return Array.isArray(fieldValue) && fieldValue.length === 1 && fieldValue[0] === MULTI_VALUE_DEFAULT_VALUE;\n }\n if (fieldType === 'enum') {\n return fieldValue === MULTI_VALUE_DEFAULT_VALUE;\n }\n return false;\n}\n\n// Get template instance based on metadata template and selected items\nexport function useTemplateInstance(metadataTemplate: MetadataTemplate, selectedItems: BoxItem[], isEditing: boolean) {\n const { formatMessage } = useIntl();\n const { displayName, fields, hidden, id, scope, templateKey, type } = metadataTemplate;\n\n const selectedItemsFields = fields.map(\n ({ displayName: fieldDisplayName, hidden: fieldHidden, id: fieldId, key, options, type: fieldType }) => {\n const defaultItemField = {\n displayName: fieldDisplayName,\n hidden: fieldHidden,\n id: fieldId,\n key,\n options,\n type: fieldType,\n value: getFieldValue(fieldType as MetadataFieldType, undefined),\n };\n\n const firstSelectedItem = selectedItems[0];\n const firstSelectedItemFieldValue = firstSelectedItem.metadata[scope][templateKey][key];\n\n // Case 1: Single selected item\n if (selectedItems.length <= 1) {\n return {\n ...defaultItemField,\n value: firstSelectedItemFieldValue,\n };\n }\n\n // Case 2.1: Multiple selected items, but all have the same initial value\n const allItemsHaveSameInitialValue = selectedItems.every(selectedItem =>\n areFieldValuesEqual(selectedItem.metadata[scope][templateKey][key], firstSelectedItemFieldValue),\n );\n\n if (allItemsHaveSameInitialValue) {\n return {\n ...defaultItemField,\n value: getFieldValue(fieldType as MetadataFieldType, firstSelectedItemFieldValue),\n };\n }\n\n // Case 2.2: Multiple selected items, but some have different initial values\n // Case 2.2.1: Edit Mode\n if (isEditing) {\n let fieldValue = getFieldValue(fieldType as MetadataFieldType, undefined);\n // Add MultiValue Option if the field is multiSelect or enum\n if (fieldType === 'multiSelect' || fieldType === 'enum') {\n fieldValue = fieldType === 'enum' ? MULTI_VALUE_DEFAULT_VALUE : [MULTI_VALUE_DEFAULT_VALUE];\n const multiValueOption = options?.find(option => option.key === MULTI_VALUE_DEFAULT_VALUE);\n if (!multiValueOption) {\n options?.push(MULTI_VALUE_DEFAULT_OPTION);\n }\n }\n return {\n ...defaultItemField,\n value: fieldValue,\n };\n }\n\n /**\n * Case: 2.2.2 View Mode\n *\n * We want to show \"Multiple values\" label for multiple dates across files selection.\n * We use fragment here to bypass check in shared feature.\n * This feature tries to parse string as date if the string is passed as value.\n */\n const multipleValuesText = formatMessage(messages.multipleValues);\n return {\n ...defaultItemField,\n value: React.createElement(React.Fragment, null, multipleValuesText),\n };\n },\n );\n\n return {\n canEdit: true,\n displayName,\n hidden,\n id,\n fields: selectedItemsFields,\n scope,\n templateKey,\n type,\n };\n}\n\nexport const mapFileTypes = (selectedFileTypes: BoxItemSelection) => {\n const selectedFileTypesSet = new Set(selectedFileTypes);\n\n const areAllNonFolderFileTypesSelected = NON_FOLDER_FILE_TYPES.every(key => selectedFileTypesSet.has(key));\n\n if (areAllNonFolderFileTypesSelected) {\n if (selectedFileTypes.includes('folderType')) {\n return [];\n }\n return ['file'];\n }\n\n return selectedFileTypes.map(fileType => FILE_FOLDER_TYPES_MAP.get(fileType as string) || []).flat();\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,2 +1,4 @@
|
|
|
1
|
-
declare const CONTENT_EXPLORER_FOLDER_FIELDS_TO_FETCH: any[];
|
|
2
|
-
export
|
|
1
|
+
export declare const CONTENT_EXPLORER_FOLDER_FIELDS_TO_FETCH: any[];
|
|
2
|
+
export declare const NON_FOLDER_FILE_TYPES_MAP: Map<string, string[]>;
|
|
3
|
+
export declare const FILE_FOLDER_TYPES_MAP: Map<string, string[]>;
|
|
4
|
+
export declare const NON_FOLDER_FILE_TYPES: string[];
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type MetadataTemplate, type MetadataFormFieldValue } from '@box/metadata-editor';
|
|
2
2
|
import type { MetadataFieldType } from '@box/metadata-view';
|
|
3
3
|
import type { Selection } from 'react-aria-components';
|
|
4
|
+
import { BoxItemSelection } from '@box/box-item-type-selector';
|
|
4
5
|
import type { BoxItem, Collection } from '../../common/types/core';
|
|
5
6
|
type ItemMetadataFieldValue = string | number | Array<string> | null | undefined;
|
|
6
7
|
export declare function useSelectedItemText(currentCollection: Collection, selectedItemIds: Selection): string;
|
|
@@ -25,4 +26,5 @@ export declare function useTemplateInstance(metadataTemplate: MetadataTemplate,
|
|
|
25
26
|
templateKey: string;
|
|
26
27
|
type: string;
|
|
27
28
|
};
|
|
29
|
+
export declare const mapFileTypes: (selectedFileTypes: BoxItemSelection) => string[];
|
|
28
30
|
export {};
|
package/package.json
CHANGED
|
@@ -34,7 +34,7 @@ import Content from './Content';
|
|
|
34
34
|
import { isThumbnailAvailable } from '../common/utils';
|
|
35
35
|
import { isFocusableElement, isInputElement, focus } from '../../utils/dom';
|
|
36
36
|
import { FILE_SHARED_LINK_FIELDS_TO_FETCH } from '../../utils/fields';
|
|
37
|
-
import CONTENT_EXPLORER_FOLDER_FIELDS_TO_FETCH from './constants';
|
|
37
|
+
import { CONTENT_EXPLORER_FOLDER_FIELDS_TO_FETCH } from './constants';
|
|
38
38
|
import LocalStore from '../../utils/LocalStore';
|
|
39
39
|
import {
|
|
40
40
|
withFeatureConsumer,
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import { BoxItemSelection } from '@box/box-item-type-selector';
|
|
1
2
|
import isNil from 'lodash/isNil';
|
|
3
|
+
import { mapFileTypes } from './utils';
|
|
2
4
|
|
|
3
5
|
type QueryResult = {
|
|
4
6
|
queryParams: { [key: string]: number | Date | string };
|
|
@@ -115,9 +117,7 @@ export const getSelectFilter = (filterValue: string[], fieldKey: string, argInde
|
|
|
115
117
|
return {
|
|
116
118
|
queryParams: multiSelectQueryParams,
|
|
117
119
|
queries: [
|
|
118
|
-
`(${fieldKey
|
|
119
|
-
multiSelectQueryParams,
|
|
120
|
-
)
|
|
120
|
+
`(${fieldKey} HASANY (${Object.keys(multiSelectQueryParams)
|
|
121
121
|
.map(argKey => `:${argKey}`)
|
|
122
122
|
.join(', ')}))`,
|
|
123
123
|
],
|
|
@@ -134,26 +134,61 @@ export const getMimeTypeFilter = (filterValue: string[], fieldKey: string, argIn
|
|
|
134
134
|
};
|
|
135
135
|
}
|
|
136
136
|
|
|
137
|
-
|
|
137
|
+
// Use mapFileTypes to get the correct extensions and handle special cases
|
|
138
|
+
const mappedExtensions = mapFileTypes(filterValue as BoxItemSelection);
|
|
139
|
+
if (mappedExtensions.length === 0) {
|
|
140
|
+
return {
|
|
141
|
+
queryParams: {},
|
|
142
|
+
queries: [],
|
|
143
|
+
keysGenerated: 0,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
138
146
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
147
|
+
let currentArgIndex = argIndexStart;
|
|
148
|
+
const queryParams: { [key: string]: number | Date | string } = {};
|
|
149
|
+
const queries: string[] = [];
|
|
150
|
+
|
|
151
|
+
// Handle specific extensions and folder type
|
|
152
|
+
const extensions: string[] = [];
|
|
153
|
+
let hasFolder = false;
|
|
154
|
+
|
|
155
|
+
for (const extension of mappedExtensions) {
|
|
156
|
+
if (extension === 'folder') {
|
|
157
|
+
if (!hasFolder) {
|
|
158
|
+
currentArgIndex += 1;
|
|
159
|
+
const folderArgKey = generateArgKey('mime_folderType', currentArgIndex);
|
|
160
|
+
queryParams[folderArgKey] = 'folder';
|
|
161
|
+
queries.push(`(item.type = :${folderArgKey})`);
|
|
162
|
+
hasFolder = true;
|
|
163
|
+
}
|
|
164
|
+
} else {
|
|
165
|
+
extensions.push(extension);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
149
168
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
169
|
+
// Handle extensions in batch if any exist
|
|
170
|
+
if (extensions.length > 0) {
|
|
171
|
+
const extensionQueryParams = Object.fromEntries(
|
|
172
|
+
extensions.map(extension => {
|
|
173
|
+
currentArgIndex += 1;
|
|
174
|
+
return [generateArgKey(fieldKey, currentArgIndex), extension];
|
|
175
|
+
}),
|
|
176
|
+
);
|
|
177
|
+
|
|
178
|
+
Object.assign(queryParams, extensionQueryParams);
|
|
179
|
+
queries.push(
|
|
180
|
+
`(item.extension IN (${Object.keys(extensionQueryParams)
|
|
154
181
|
.map(argKey => `:${argKey}`)
|
|
155
182
|
.join(', ')}))`,
|
|
156
|
-
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// Combine queries with OR if multiple exist
|
|
187
|
+
const finalQueries = queries.length > 1 ? [`(${queries.join(' OR ')})`] : queries;
|
|
188
|
+
|
|
189
|
+
return {
|
|
190
|
+
queryParams,
|
|
191
|
+
queries: finalQueries,
|
|
157
192
|
keysGenerated: currentArgIndex - argIndexStart,
|
|
158
193
|
};
|
|
159
194
|
};
|
|
@@ -673,14 +673,20 @@ describe('elements/content-explorer/MetadataQueryAPIHelper', () => {
|
|
|
673
673
|
const filters = {
|
|
674
674
|
'mimetype-filter': {
|
|
675
675
|
fieldType: 'enum',
|
|
676
|
-
value: ['
|
|
676
|
+
value: ['pdfType', 'documentType'],
|
|
677
677
|
},
|
|
678
678
|
};
|
|
679
679
|
|
|
680
680
|
const result = metadataQueryAPIHelper.buildMetadataQueryParams(filters);
|
|
681
|
-
expect(result.query).toBe(
|
|
681
|
+
expect(result.query).toBe(
|
|
682
|
+
'(item.extension IN (:arg_mimetype_filter_1, :arg_mimetype_filter_2, :arg_mimetype_filter_3, :arg_mimetype_filter_4, :arg_mimetype_filter_5, :arg_mimetype_filter_6))',
|
|
683
|
+
);
|
|
682
684
|
expect(result.queryParams.arg_mimetype_filter_1).toBe('pdf');
|
|
683
685
|
expect(result.queryParams.arg_mimetype_filter_2).toBe('doc');
|
|
686
|
+
expect(result.queryParams.arg_mimetype_filter_3).toBe('docx');
|
|
687
|
+
expect(result.queryParams.arg_mimetype_filter_4).toBe('gdoc');
|
|
688
|
+
expect(result.queryParams.arg_mimetype_filter_5).toBe('rtf');
|
|
689
|
+
expect(result.queryParams.arg_mimetype_filter_6).toBe('txt');
|
|
684
690
|
});
|
|
685
691
|
|
|
686
692
|
test('should handle multiple filters of different types', () => {
|