Skip to content

Commit 9479df3

Browse files
imnasnainaecrmunn
andauthored
Prevent sorting by '-audio' citation and lexeme forms (#1807)
* [getSortableValue] Add types; Avoid audio lexeme forms * Update getFontFamily... and test projects * Also avoid audio citation forms --------- Co-authored-by: Robin Munn <[email protected]>
1 parent ef581f5 commit 9479df3

File tree

3 files changed

+39
-33
lines changed

3 files changed

+39
-33
lines changed

src/angular-app/bellows/core/offline/editor-data.service.ts

Lines changed: 33 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ import {LexEntry} from '../../../languageforge/lexicon/shared/model/lex-entry.mo
77
import {LexMultiValue} from '../../../languageforge/lexicon/shared/model/lex-multi-value.model';
88
import {
99
LexConfigFieldList,
10+
LexConfigMultiOptionList,
1011
LexConfigMultiText,
12+
LexConfigOptionList,
1113
LexiconConfig
1214
} from '../../../languageforge/lexicon/shared/model/lexicon-config.model';
1315
import {LexiconProjectSettings} from '../../../languageforge/lexicon/shared/model/lexicon-project-settings.model';
@@ -327,66 +329,68 @@ export class EditorDataService {
327329
return meaning || '';
328330
}
329331

330-
getSortableValue = (config: any, entry: any): string => {
332+
getSortableValue = (config: LexiconConfig, entry: any): string => {
331333
const fieldKey = this.entryListModifiers.sortBy.value === 'default' ?
332334
'lexeme' : this.entryListModifiers.sortBy.value;
333335
let sortableValue = '';
334336
let field;
335337
let dataNode;
336338
const isSpecialMultitext = (fieldKey === 'lexeme' || fieldKey === 'citationForm');
339+
const sensesField = config.entry.fields.senses as LexConfigFieldList;
337340
if (fieldKey in config.entry.fields && fieldKey in entry) {
338341
field = config.entry.fields[fieldKey];
339342
dataNode = entry[fieldKey];
340-
} else if (fieldKey in config.entry.fields.senses.fields && angular.isDefined(entry.senses) &&
343+
} else if (fieldKey in sensesField.fields && angular.isDefined(entry.senses) &&
341344
entry.senses.length > 0 && fieldKey in entry.senses[0]
342345
) {
343-
field = config.entry.fields.senses.fields[fieldKey];
346+
field = sensesField.fields[fieldKey];
344347
dataNode = entry.senses[0][fieldKey];
345348
}
346349

347350
if (field || isSpecialMultitext) {
348-
if (isSpecialMultitext || field.type === 'multitext') {
349-
// special case for lexeme form / citation form. Use citation form if available, fall back to lexeme form
350-
if (fieldKey === 'lexeme' || fieldKey === 'citationForm') {
351-
if (config.entry.fields.citationForm) {
352-
const citationFormInputSystems = config.entry.fields.citationForm.inputSystems;
353-
if (entry.citationForm && citationFormInputSystems.length > 0 &&
354-
citationFormInputSystems[0] in entry.citationForm
355-
) {
356-
sortableValue = entry.citationForm[citationFormInputSystems[0]].value;
357-
}
358-
}
359-
360-
if (!sortableValue) {
361-
const lexemeInputSystems = config.entry.fields.lexeme.inputSystems;
362-
if (entry.lexeme && lexemeInputSystems.length > 0 && lexemeInputSystems[0] in entry.lexeme) {
363-
sortableValue = entry.lexeme[lexemeInputSystems[0]].value;
364-
}
351+
// special case for lexeme form / citation form. Use citation form if available, fall back to lexeme form
352+
if (isSpecialMultitext) {
353+
if ('citationForm' in config.entry.fields) {
354+
const citationFormField = config.entry.fields.citationForm as LexConfigMultiText;
355+
// don't sort by the first citation form if it is an "-audio" writing system
356+
const inputSystem = citationFormField.inputSystems.find((system) => !system.includes('-audio'));
357+
if (entry.citationForm && inputSystem && inputSystem in entry.citationForm) {
358+
sortableValue = entry.citationForm[inputSystem].value;
365359
}
360+
}
366361

367-
// regular multi-text field
368-
} else {
369-
if (field.inputSystems.length > 0 && field.inputSystems[0] in dataNode) {
370-
sortableValue = dataNode[field.inputSystems[0]].value;
362+
if (!sortableValue) {
363+
const lexemeField = config.entry.fields.lexeme as LexConfigMultiText;
364+
// don't sort by the first lexeme form if it is an "-audio" writing system
365+
const inputSystem = lexemeField.inputSystems.find((system) => !system.includes('-audio'));
366+
if (entry.lexeme && inputSystem && inputSystem in entry.lexeme) {
367+
sortableValue = entry.lexeme[inputSystem].value;
371368
}
372369
}
370+
} else if (field.type === 'multitext') {
371+
const inputSystems = (field as LexConfigMultiText).inputSystems;
372+
if (inputSystems.length > 0 && inputSystems[0] in dataNode) {
373+
sortableValue = dataNode[inputSystems[0]].value;
374+
}
373375
} else if (field.type === 'optionlist') {
374-
if (config.optionlists && config.optionlists[field.listCode]) {
376+
const listCode = (field as LexConfigOptionList).listCode;
377+
if (config.optionlists && config.optionlists[listCode]) {
375378
// something weird here with config.optionlists not being set consistently when this is called - cjh 2017-07
376-
sortableValue = this.getOptionListItem(config.optionlists[field.listCode], dataNode.value).value;
379+
sortableValue = this.getOptionListItem(config.optionlists[listCode], dataNode.value).value;
377380
} else {
378381
sortableValue = dataNode.value;
379382
}
380383
} else if (field.type === 'multioptionlist' && dataNode.values.length > 0) {
381-
if (field.listCode === 'semantic-domain-ddp4') {
384+
const listCode = (field as LexConfigMultiOptionList).listCode;
385+
if (listCode === 'semantic-domain-ddp4') {
382386
if (this.semanticDomains.data[dataNode.values[0]]) {
383387
sortableValue = this.semanticDomains.data[dataNode.values[0]].value;
384388
} else {
385389
sortableValue = dataNode.values[0];
386390
}
387391
} else {
388-
if (config.optionlists && config.optionlists[field.listCode]) {
389-
sortableValue = this.getOptionListItem(config.optionlists[field.listCode], dataNode.values[0]).value;
392+
if (config.optionlists && config.optionlists[listCode]) {
393+
sortableValue = this.getOptionListItem(config.optionlists[listCode], dataNode.values[0]).value;
390394
} else {
391395
sortableValue = dataNode.values[0].value;
392396
}

src/angular-app/languageforge/lexicon/editor/editor.component.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -680,10 +680,11 @@ export class LexiconEditorController implements angular.IController {
680680

681681
getFontFamilyForPrimaryListItemForDisplay(entry: LexEntry) {
682682
if (!this.getSortableValue(this.lecConfig, entry)) return '';
683+
683684
// FIXME this is not always accurate, given the complexity in get EditorDataService#getSortableValue
684-
return this.lecConfig.inputSystems[
685-
(this.lecConfig.entry.fields.lexeme as LexConfigMultiText).inputSystems[0]
686-
].cssFontFamily;
685+
const lexemeField = this.lecConfig.entry.fields.lexeme as LexConfigMultiText;
686+
const inputSystem = lexemeField.inputSystems.find(system => !system.includes('-audio'));
687+
return this.lecConfig.inputSystems[inputSystem].cssFontFamily;
687688
}
688689

689690
getSecondaryListItemForDisplay(entry: LexEntry): string {

test/e2e/utils/project-utils.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,9 @@ export class ProjectTestService {
7474
async createDefaultProject(testInfo: TestInfo): Promise<TestProject> {
7575
const project = await this.initTestProject(testInfo.titlePath[0], undefined, users.manager, [users.member]);
7676
await this.addUserToProject(project, users.observer, "observer");
77-
await this.addWritingSystemToProject(project, 'th-fonipa', 'tipa');
77+
// add audio first to make sure editor.entries tests fail if the audio is used for the dictionary citation
7878
await this.addWritingSystemToProject(project, 'th-Zxxx-x-audio', 'taud');
79+
await this.addWritingSystemToProject(project, 'th-fonipa', 'tipa');
7980
await this.addPictureFileToProject(project, entries.entry1.senses[0].pictures[0].fileName);
8081
await this.addAudioVisualFileToProject(project, entries.entry1.lexeme['th-Zxxx-x-audio'].value);
8182
const projectEntries = await Promise.all([

0 commit comments

Comments
 (0)