Skip to content

Commit ab8a628

Browse files
FrancescoMolinaroatarix83
authored andcommitted
Merged in task/dspace-cris-2023_02_x/DSC-2279 (pull request DSpace#3075)
Task/dspace cris 2023 02 x/DSC-2279 Approved-by: Giuseppe Digilio
2 parents a84c870 + 57b03e7 commit ab8a628

File tree

5 files changed

+25
-30
lines changed

5 files changed

+25
-30
lines changed

src/app/core/shared/metadata.models.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,10 @@ export interface MetadataValueFilter {
9696

9797
/** Whether the value constraint should match as a substring. */
9898
substring?: boolean;
99+
/**
100+
* Whether to negate the filter
101+
*/
102+
negate?: boolean;
99103
}
100104

101105
export class MetadatumViewModel {

src/app/core/shared/metadata.utils.spec.ts

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { isUndefined } from '../../shared/empty.util';
22
import { v4 as uuidv4 } from 'uuid';
33
import { MetadataMap, MetadataValue, MetadataValueFilter, MetadatumViewModel } from './metadata.models';
4-
import { Metadata, PLACEHOLDER_VALUE } from './metadata.utils';
4+
import { Metadata } from './metadata.utils';
55

66
const mdValue = (value: string, language?: string, authority?: string): MetadataValue => {
77
return Object.assign(new MetadataValue(), {
@@ -306,21 +306,4 @@ describe('Metadata', () => {
306306
testAllWithLimit(multiMap, 'dc.title', [dcTitle1], 1);
307307
});
308308
});
309-
310-
describe('Placeholder values', () => {
311-
it('should ignore placeholder values in get methods', () => {
312-
const placeholderMd = mdValue(PLACEHOLDER_VALUE);
313-
const key = 'dc.test.placeholder';
314-
const map = { 'dc.test.placeholder': [placeholderMd] };
315-
316-
expect(Metadata.all(map, key).length).toEqual(0);
317-
expect(Metadata.allValues(map, key).length).toEqual(0);
318-
expect(Metadata.has(map, key)).toBeFalsy();
319-
expect(Metadata.first(map, key)).toBeUndefined();
320-
expect(Metadata.firstValue(map, key)).toBeUndefined();
321-
expect(Metadata.hasValue(placeholderMd)).toBeFalsy();
322-
expect(Metadata.valueMatches(placeholderMd, null)).toBeFalsy();
323-
});
324-
});
325-
326309
});

src/app/core/shared/metadata.utils.ts

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@ import { validate as uuidValidate } from 'uuid';
1515
export const AUTHORITY_GENERATE = 'will be generated::';
1616
export const AUTHORITY_REFERENCE = 'will be referenced::';
1717
export const PLACEHOLDER_VALUE = '#PLACEHOLDER_PARENT_METADATA_VALUE#';
18-
19-
2018
/**
2119
* Utility class for working with DSpace object metadata.
2220
*
@@ -31,6 +29,7 @@ export const PLACEHOLDER_VALUE = '#PLACEHOLDER_PARENT_METADATA_VALUE#';
3129
* followed by any other (non-dc) metadata values.
3230
*/
3331
export class Metadata {
32+
3433
/**
3534
* Gets all matching metadata in the map(s).
3635
*
@@ -153,11 +152,11 @@ export class Metadata {
153152
* Returns true if this Metadatum's value is defined
154153
*/
155154
public static hasValue(value: MetadataValue|string): boolean {
156-
if (isEmpty(value) || value === PLACEHOLDER_VALUE) {
155+
if (isEmpty(value)) {
157156
return false;
158157
}
159158
if (isObject(value) && value.hasOwnProperty('value')) {
160-
return isNotEmpty(value.value) && value.value !== PLACEHOLDER_VALUE;
159+
return isNotEmpty(value.value);
161160
}
162161
return true;
163162
}
@@ -170,9 +169,7 @@ export class Metadata {
170169
* @returns {boolean} whether the filter matches, or true if no filter is given.
171170
*/
172171
public static valueMatches(mdValue: MetadataValue, filter: MetadataValueFilter) {
173-
if (mdValue.value === PLACEHOLDER_VALUE) {
174-
return false;
175-
} else if (!filter) {
172+
if (!filter) {
176173
return true;
177174
} else if (filter.language && filter.language !== mdValue.language) {
178175
return false;
@@ -181,15 +178,19 @@ export class Metadata {
181178
} else if (filter.value) {
182179
let fValue = filter.value;
183180
let mValue = mdValue.value;
181+
184182
if (filter.ignoreCase) {
185183
fValue = filter.value.toLowerCase();
186184
mValue = mdValue.value.toLowerCase();
187185
}
186+
let result;
187+
188188
if (filter.substring) {
189-
return mValue.includes(fValue);
189+
result = mValue.includes(fValue);
190190
} else {
191-
return mValue === fValue;
191+
result = mValue === fValue;
192192
}
193+
return filter.negate ? !result : result;
193194
}
194195
return true;
195196
}

src/app/shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,15 @@
3838
<span *ngIf="dso.firstMetadataValue('dc.date.issued')" class="item-list-date"
3939
[innerHTML]="firstMetadataValue('dc.date.issued')"></span>)
4040
</ng-container>
41-
<span *ngIf="dso.allMetadataValues(authorMetadata).length > 0" class="item-list-authors">
41+
<span *ngIf="dso.allMetadataValues(authorMetadata, placeholderFilter).length > 0" class="item-list-authors">
4242
<ng-container *ngVar="(isCollapsed() | async) as isCollapsed">
4343
<ng-container *ngIf="isCollapsed">
44-
<span *ngFor="let author of dso.limitedMetadata(authorMetadata, additionalMetadataLimit); let i=index; let last=last;">
44+
<span *ngFor="let author of dso.limitedMetadata(authorMetadata, additionalMetadataLimit, placeholderFilter); let i=index; let last=last;">
4545
<ds-metadata-link-view [item]="dso" [metadata]="author" [metadataName]="authorMetadata"></ds-metadata-link-view><span *ngIf="!last">; </span>
4646
</span>
4747
</ng-container>
4848
<ng-container *ngIf="!isCollapsed">
49-
<span *ngFor="let author of dso.allMetadata(authorMetadata); let i=index; let last=last;">
49+
<span *ngFor="let author of dso.allMetadata(authorMetadata, placeholderFilter); let i=index; let last=last;">
5050
<ds-metadata-link-view [item]="dso" [metadata]="author" [metadataName]="authorMetadata"></ds-metadata-link-view><span *ngIf="!last">; </span>
5151
</span>
5252
</ng-container>

src/app/shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ import { getFirstSucceededRemoteListPayload } from '../../../../../../core/share
1818
import { differenceInDays, differenceInMilliseconds, parseISO} from 'date-fns';
1919
import { filter, map } from 'rxjs/operators';
2020
import { isNotEmpty } from '../../../../../empty.util';
21+
import { MetadataValueFilter } from '../../../../../../core/shared/metadata.models';
22+
import { PLACEHOLDER_VALUE } from '../../../../../../core/shared/metadata.utils';
2123

2224
@listableObjectComponent('PublicationSearchResult', ViewMode.ListElement)
2325
@listableObjectComponent(ItemSearchResult, ViewMode.ListElement)
@@ -46,6 +48,11 @@ export class ItemSearchResultListElementComponent extends SearchResultListElemen
4648

4749
hasLoadedThirdPartyMetrics$: Observable<boolean>;
4850

51+
readonly placeholderFilter: MetadataValueFilter = {
52+
negate: true,
53+
value: PLACEHOLDER_VALUE
54+
};
55+
4956
private thirdPartyMetrics = environment.info.metricsConsents.filter(metric => metric.enabled).map(metric => metric.key);
5057

5158

0 commit comments

Comments
 (0)