-
Notifications
You must be signed in to change notification settings - Fork 87
/
vocabularies.ts
125 lines (107 loc) · 4 KB
/
vocabularies.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
import {OrderedMap} from 'immutable';
import ng from 'core/services/ng';
import {IArticle, IVocabulary, IVocabularyItem} from 'superdesk-api';
import {getVocabularyItemNameTranslated} from 'core/utils';
function getAll(): OrderedMap<IVocabulary['_id'], IVocabulary> {
return OrderedMap<string, IVocabulary>(
ng.get('vocabularies').getAllVocabulariesSync().map(
(vocabulary) => [vocabulary._id, vocabulary],
),
);
}
function isCustomFieldVocabulary(vocabulary: IVocabulary): boolean {
return vocabulary.field_type != null || vocabulary.custom_field_type != null;
}
/**
* custom means any vocabulary that is not used as a field type
*/
function isCustomVocabulary(vocabulary: IVocabulary): boolean {
return vocabulary.field_type == null && vocabulary.service != null;
}
function getVocabularyItemLabel(term: IVocabularyItem, item: IArticle): string {
if (!term) {
return 'None';
}
// Item can be anything here. It might be an article object or search filters object
// depending where the function is called from.
// It's checked if language is a string in order not to confuse it when language
// is an array when called from global search filters.
const language = typeof item.language === 'string' ? item.language : undefined;
return getVocabularyItemNameTranslated(term, language);
}
const vocabularyItemsToString = (
array: Array<IVocabularyItem>,
propertyName?: keyof IVocabularyItem,
schemeName?: string,
): string =>
getVocabularyItemsByPropertyName(array, propertyName, schemeName).join(', ');
const getVocabularyItemsByPropertyName = (
array: Array<IVocabularyItem>,
propertyName?: keyof IVocabularyItem,
schemeName?: string,
): Array<string> => {
let subjectMerged = [];
array.forEach((item) => {
const value = propertyName == null ? item : item[propertyName];
if (value) {
subjectMerged.push(value);
if ((schemeName?.length ?? 0) > 1 && item.scheme !== schemeName) {
subjectMerged.pop();
}
}
});
return subjectMerged;
};
const getVocabularyItemsPreview = (
array: Array<IVocabularyItem>,
propertyName?: keyof IVocabularyItem,
schemeName?: string,
returnArray?: boolean,
): Array<string> | string => {
if (returnArray) {
return getVocabularyItemsByPropertyName(array, propertyName, schemeName);
} else {
return vocabularyItemsToString(array, propertyName, schemeName);
}
};
/**
* Selection vocabularies may be configured to be included in content profiles.
*/
function isSelectionVocabulary(vocabulary: IVocabulary): boolean {
return !isCustomFieldVocabulary(vocabulary) && (
vocabulary.selection_type === 'multi selection'
|| vocabulary.selection_type === 'single selection'
);
}
function getCustomFieldVocabularies(): Array<IVocabulary> {
return getAll().filter((vocabulary) => isCustomFieldVocabulary(vocabulary)).toArray();
}
interface IVocabulariesApi {
getAll: () => OrderedMap<IVocabulary['_id'], IVocabulary>;
getCustomFieldVocabularies(): Array<IVocabulary>;
isCustomFieldVocabulary: (vocabulary: IVocabulary) => boolean;
isSelectionVocabulary: (vocabulary: IVocabulary) => boolean;
isCustomVocabulary: (vocabulary: IVocabulary) => boolean;
getVocabularyItemLabel: (term: IVocabularyItem, item: IArticle) => string;
getVocabularyItemsPreview: (
array: Array<IVocabularyItem>,
propertyName?: keyof IVocabularyItem,
schemeName?: string,
returnArray?: boolean,
) => Array<string> | string;
vocabularyItemsToString: (
array: Array<IVocabularyItem>,
propertyName?: keyof IVocabularyItem,
schemeName?: string,
) => string;
}
export const vocabularies: IVocabulariesApi = {
getAll,
isCustomFieldVocabulary,
isSelectionVocabulary,
getVocabularyItemLabel,
getVocabularyItemsPreview,
vocabularyItemsToString,
isCustomVocabulary,
getCustomFieldVocabularies,
};