coveo-search-ui
Version:
Coveo JavaScript Search Framework
99 lines (84 loc) • 4.11 kB
text/typescript
import { IQueryResult } from '../../rest/QueryResult';
import { Utils } from '../../utils/Utils';
import { l } from '../../strings/Strings';
import { Assert } from '../../misc/Assert';
import { keys, escape } from 'underscore';
// On-demand mapping of file types to captions. Used by facets, but I don't
// really like this. Maybe a dedicated filetype facet would be better? Hmm...
let fileTypeCaptions: { [id: string]: string };
export interface IFileTypeInfo {
icon: string;
caption: string;
}
export class FileTypes {
static get(result: IQueryResult): IFileTypeInfo {
const objecttype = <string>Utils.getFieldValue(result, 'objecttype');
const filetype = <string>Utils.getFieldValue(result, 'filetype');
// When @objecttype is File, Item, Document, or ContentVersion we fallback on @filetype for icons and such
if (Utils.isNonEmptyString(objecttype) && !objecttype.match(/^(file|document|contentversion|item)$/i)) {
return FileTypes.getObjectType(objecttype);
} else if (Utils.isNonEmptyString(filetype)) {
return FileTypes.getFileType(filetype);
} else {
return {
// This will render a default icon. Really it should not happen.
icon: 'coveo-icon filetype',
caption: l('Unknown')
};
}
}
static getObjectType(objecttype: string, fallbackOnLocalization = true): IFileTypeInfo {
// We must use lowercase filetypes because that's how the CSS classes
// are generated (they are case sensitive, alas).
const loweredCaseObjecttype = objecttype.toLowerCase();
const variableValue = `objecttype_${loweredCaseObjecttype}`;
// Most object types have a set of localized strings in the main dictionary
let localizedString = l(variableValue);
// Some strings are sent as `objecttype_[...]` to specify a dictionary to use. If there's no match, try using
// the main dictionary by using the original value.
if (localizedString.toLowerCase() == variableValue.toLowerCase()) {
localizedString = fallbackOnLocalization ? l(objecttype) : objecttype;
}
return this.safelyBuildFileTypeInfo('objecttype', loweredCaseObjecttype, localizedString);
}
static getFileType(filetype: string, fallbackOnLocalization = true): IFileTypeInfo {
// We must use lowercase filetypes because that's how the CSS classes
// are generated (they are case sensitive, alas).
let loweredCaseFiletype = filetype.toLowerCase();
// Sometimes, filetype begins with a period (typically means the index has
// no idea and uses the file extension as a filetype).
if (loweredCaseFiletype[0] == '.') {
loweredCaseFiletype = loweredCaseFiletype.substring(1);
}
const variableValue = `filetype_${loweredCaseFiletype}`;
// Most filetypes have a set of localized strings in the main dictionary
let localizedString = l(variableValue);
if (localizedString.toLowerCase() == variableValue.toLowerCase()) {
// Some strings are sent as `filetype_[...]` to specify a dictionary to use. If there's no match, try using
// The main dictionary by using the original value.
localizedString = fallbackOnLocalization ? l(filetype) : filetype;
}
return this.safelyBuildFileTypeInfo('filetype', loweredCaseFiletype, localizedString);
}
static getFileTypeCaptions() {
if (fileTypeCaptions == undefined) {
fileTypeCaptions = {};
var strings = String['locales'][String['locale'].toLowerCase()];
Assert.isNotUndefined(strings);
keys(strings).forEach(key => {
if (key.indexOf('filetype_') == 0) {
fileTypeCaptions[key.substr('filetype_'.length)] = key.toLocaleString();
} else if (key.indexOf('objecttype_') == 0) {
fileTypeCaptions[key.substr('objecttype_'.length)] = key.toLocaleString();
}
});
}
return fileTypeCaptions;
}
static safelyBuildFileTypeInfo(fieldname: string, iconClass: string, caption: string): IFileTypeInfo {
return {
icon: `coveo-icon ${fieldname} ${escape(iconClass.replace(' ', '-'))}`,
caption: escape(caption)
};
}
}