diff --git a/openbis_ng_ui/src/js/components/common/form/EntityAutocompleterField.jsx b/openbis_ng_ui/src/js/components/common/form/EntityAutocompleterField.jsx index 31abf0a451a331a893a5c3949adf03306a3446d6..c5dcee8ec666c1119f6992b8a834db811fb51676 100644 --- a/openbis_ng_ui/src/js/components/common/form/EntityAutocompleterField.jsx +++ b/openbis_ng_ui/src/js/components/common/form/EntityAutocompleterField.jsx @@ -8,6 +8,7 @@ import logger from '@src/js/common/logger.js' const styles = () => ({}) +const ENTITY_NAME_PROPERTY = '$NAME' const LOADED_OPTIONS_COUNT = 100 class EntityAutocompleterField extends React.PureComponent { @@ -124,21 +125,28 @@ class EntityAutocompleterField extends React.PureComponent { if (value && value.trim().length > 0) { //criteria.withCode().thatContains(value) criteria.withIdentifier().thatContains(value) - criteria.withProperty('$NAME').thatContains(value) + criteria.withProperty(ENTITY_NAME_PROPERTY).thatContains(value) } const fo = new openbis.ExperimentFetchOptions() + fo.withProperties() fo.from(0).count(count) fo.sortBy().identifier().asc() const results = await openbis.searchExperiments(criteria, fo) return { - options: results.getObjects().map(object => ({ - label: object.identifier.identifier, - entityKind: openbis.EntityKind.EXPERIMENT, - entityId: object.identifier.identifier - })), + options: results.getObjects().map(object => { + return { + label: this.createOptionLabel(openbis.EntityKind.EXPERIMENT, object), + fullLabel: this.createOptionFullLabel( + openbis.EntityKind.EXPERIMENT, + object + ), + entityKind: openbis.EntityKind.EXPERIMENT, + entityId: object.identifier.identifier + } + }), totalCount: results.totalCount } } @@ -150,21 +158,28 @@ class EntityAutocompleterField extends React.PureComponent { if (value && value.trim().length > 0) { //criteria.withCode().thatContains(value) criteria.withIdentifier().thatContains(value) - criteria.withProperty('$NAME').thatContains(value) + criteria.withProperty(ENTITY_NAME_PROPERTY).thatContains(value) } const fo = new openbis.SampleFetchOptions() + fo.withProperties() fo.from(0).count(count) fo.sortBy().identifier().asc() const results = await openbis.searchSamples(criteria, fo) return { - options: results.getObjects().map(object => ({ - label: object.identifier.identifier, - entityKind: openbis.EntityKind.SAMPLE, - entityId: object.identifier.identifier - })), + options: results.getObjects().map(object => { + return { + label: this.createOptionLabel(openbis.EntityKind.SAMPLE, object), + fullLabel: this.createOptionFullLabel( + openbis.EntityKind.SAMPLE, + object + ), + entityKind: openbis.EntityKind.SAMPLE, + entityId: object.identifier.identifier + } + }), totalCount: results.totalCount } } @@ -175,24 +190,31 @@ class EntityAutocompleterField extends React.PureComponent { if (value && value.trim().length > 0) { criteria.withCode().thatContains(value) - criteria.withProperty('$NAME').thatContains(value) + criteria.withProperty(ENTITY_NAME_PROPERTY).thatContains(value) } const fo = new openbis.MaterialFetchOptions() + fo.withProperties() fo.from(0).count(count) fo.sortBy().code().asc() const results = await openbis.searchMaterials(criteria, fo) return { - options: results.getObjects().map(object => ({ - label: object.permId.code + ' (' + object.permId.typeCode + ')', - entityKind: openbis.EntityKind.MATERIAL, - entityId: { - code: object.permId.code, - typeCode: object.permId.typeCode + options: results.getObjects().map(object => { + return { + label: this.createOptionLabel(openbis.EntityKind.MATERIAL, object), + fullLabel: this.createOptionFullLabel( + openbis.EntityKind.MATERIAL, + object + ), + entityKind: openbis.EntityKind.MATERIAL, + entityId: { + code: object.permId.code, + typeCode: object.permId.typeCode + } } - })), + }), totalCount: results.totalCount } } @@ -203,37 +225,97 @@ class EntityAutocompleterField extends React.PureComponent { if (value && value.trim().length > 0) { criteria.withCode().thatContains(value) - criteria.withProperty('$NAME').thatContains(value) + criteria.withProperty(ENTITY_NAME_PROPERTY).thatContains(value) const experimentCriteria = criteria.withExperiment() experimentCriteria.withOrOperator() //experimentCriteria.withCode().thatContains(value) experimentCriteria.withIdentifier().thatContains(value) - experimentCriteria.withProperty('$NAME').thatContains(value) + experimentCriteria.withProperty(ENTITY_NAME_PROPERTY).thatContains(value) const sampleCriteria = criteria.withSample() sampleCriteria.withOrOperator() //sampleCriteria.withCode().thatContains(value) sampleCriteria.withIdentifier().thatContains(value) - sampleCriteria.withProperty('$NAME').thatContains(value) + sampleCriteria.withProperty(ENTITY_NAME_PROPERTY).thatContains(value) } const fo = new openbis.DataSetFetchOptions() + fo.withProperties() + fo.withExperiment() + fo.withSample() fo.from(0).count(count) fo.sortBy().code().asc() const results = await openbis.searchDataSets(criteria, fo) return { - options: results.getObjects().map(object => ({ - label: object.code, - entityKind: openbis.EntityKind.DATA_SET, - entityId: object.code - })), + options: results.getObjects().map(object => { + return { + label: this.createOptionLabel(openbis.EntityKind.DATA_SET, object), + fullLabel: this.createOptionFullLabel( + openbis.EntityKind.DATA_SET, + object + ), + entityKind: openbis.EntityKind.DATA_SET, + entityId: object.code + } + }), totalCount: results.totalCount } } + createOptionLabel(entityKind, object) { + if ( + entityKind === openbis.EntityKind.EXPERIMENT || + entityKind === openbis.EntityKind.SAMPLE + ) { + return object.identifier.identifier + } else if ( + entityKind === openbis.EntityKind.MATERIAL || + entityKind === openbis.EntityKind.DATA_SET + ) { + return object.code + } + } + + createOptionFullLabel(entityKind, object) { + let name = object.properties[ENTITY_NAME_PROPERTY] + + if (name && name.trim().length > 0) { + name = ' (' + name.trim() + ')' + } else { + name = '' + } + + if ( + entityKind === openbis.EntityKind.EXPERIMENT || + entityKind === openbis.EntityKind.SAMPLE || + entityKind === openbis.EntityKind.MATERIAL + ) { + return this.createOptionLabel(entityKind, object) + name + } else if (entityKind === openbis.EntityKind.DATA_SET) { + let owner = null + + if (object.experiment) { + owner = this.createOptionLabel( + openbis.EntityKind.EXPERIMENT, + object.experiment + ) + } else if (object.sample) { + owner = this.createOptionLabel(openbis.EntityKind.SAMPLE, object.sample) + } + + if (owner) { + owner = ' [owner: ' + owner + ']' + } else { + owner = '' + } + + return this.createOptionLabel(entityKind, object) + name + owner + } + } + handleFocus() { this.load(this.state.inputValue) } @@ -271,7 +353,11 @@ class EntityAutocompleterField extends React.PureComponent { } renderOption(option) { - return <span>{this.getOptionLabel(option)}</span> + if (option) { + return option.fullLabel || option.label + } else { + return '' + } } filterOptions(options) {