Skip to content

Commit bcc01f9

Browse files
committed
[DSC-1557] Fix issue with type-bind when dc.type is provided via metadata enrichment
1 parent 6e97375 commit bcc01f9

5 files changed

Lines changed: 33 additions & 13 deletions

File tree

src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-form-control-container.component.ts

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ import {
33
Component,
44
ComponentFactoryResolver,
55
ContentChildren,
6-
EventEmitter, Inject,
6+
EventEmitter,
7+
Inject,
78
Input,
89
NgZone,
910
OnChanges,
@@ -58,7 +59,9 @@ import { TranslateService } from '@ngx-translate/core';
5859
import { ReorderableRelationship } from './existing-metadata-list-element/existing-metadata-list-element.component';
5960

6061
import { DYNAMIC_FORM_CONTROL_TYPE_ONEBOX } from './models/onebox/dynamic-onebox.model';
61-
import { DYNAMIC_FORM_CONTROL_TYPE_SCROLLABLE_DROPDOWN } from './models/scrollable-dropdown/dynamic-scrollable-dropdown.model';
62+
import {
63+
DYNAMIC_FORM_CONTROL_TYPE_SCROLLABLE_DROPDOWN
64+
} from './models/scrollable-dropdown/dynamic-scrollable-dropdown.model';
6265
import { DYNAMIC_FORM_CONTROL_TYPE_TAG } from './models/tag/dynamic-tag.model';
6366
import { DYNAMIC_FORM_CONTROL_TYPE_DSDATEPICKER } from './models/date-picker/date-picker.model';
6467
import { DYNAMIC_FORM_CONTROL_TYPE_LOOKUP } from './models/lookup/dynamic-lookup.model';
@@ -70,7 +73,9 @@ import { DsDynamicTagComponent } from './models/tag/dynamic-tag.component';
7073
import { DsDatePickerComponent } from './models/date-picker/date-picker.component';
7174
import { DsDynamicListComponent } from './models/list/dynamic-list.component';
7275
import { DsDynamicOneboxComponent } from './models/onebox/dynamic-onebox.component';
73-
import { DsDynamicScrollableDropdownComponent } from './models/scrollable-dropdown/dynamic-scrollable-dropdown.component';
76+
import {
77+
DsDynamicScrollableDropdownComponent
78+
} from './models/scrollable-dropdown/dynamic-scrollable-dropdown.component';
7479
import { DsDynamicLookupComponent } from './models/lookup/dynamic-lookup.component';
7580
import { DsDynamicFormGroupComponent } from './models/form-group/dynamic-form-group.component';
7681
import { DsDynamicFormArrayComponent } from './models/array-group/dynamic-form-array.component';
@@ -82,7 +87,9 @@ import { CustomSwitchComponent } from './models/custom-switch/custom-switch.comp
8287
import { find, map, startWith, switchMap, take } from 'rxjs/operators';
8388
import { combineLatest as observableCombineLatest, Observable, Subscription } from 'rxjs';
8489
import { DsDynamicTypeBindRelationService } from './ds-dynamic-type-bind-relation.service';
85-
import { DsDynamicRelationInlineGroupComponent } from './models/relation-inline-group/dynamic-relation-inline-group.components';
90+
import {
91+
DsDynamicRelationInlineGroupComponent
92+
} from './models/relation-inline-group/dynamic-relation-inline-group.components';
8693
import { SearchResult } from '../../../search/models/search-result.model';
8794
import { DSpaceObject } from '../../../../core/shared/dspace-object.model';
8895
import { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap';
@@ -497,6 +504,7 @@ export class DsDynamicFormControlContainerComponent extends DynamicFormControlCo
497504
* Unsubscribe from all subscriptions
498505
*/
499506
ngOnDestroy(): void {
507+
super.ngOnDestroy();
500508
this.subs
501509
.filter((sub) => hasValue(sub))
502510
.forEach((sub) => sub.unsubscribe());

src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-type-bind-relation.service.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ describe('DSDynamicTypeBindRelationService test suite', () => {
3939

4040
beforeEach(inject([DsDynamicTypeBindRelationService, DynamicFormRelationService],
4141
(relationService: DsDynamicTypeBindRelationService,
42-
formRelationService: DynamicFormRelationService,
42+
formRelationService: DynamicFormRelationService
4343
) => {
4444
service = relationService;
4545
dynamicFormRelationService = formRelationService;

src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-type-bind-relation.service.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,6 @@ export class DsDynamicTypeBindRelationService {
9191
// Default to OR for operator (OR is explicitly set in field-parser.ts anyway)
9292
const operator = relation.operator || OR_OPERATOR;
9393

94-
9594
return relation.when.reduce((hasAlreadyMatched: boolean, condition: DynamicFormControlCondition, index: number) => {
9695
// Get the DynamicFormControlModel (typeBindModel) from the form builder service, set in the form builder
9796
// in the form model at init time in formBuilderService.modelFromConfiguration (called by other form components
@@ -185,9 +184,8 @@ export class DsDynamicTypeBindRelationService {
185184
const initValue = (hasNoValue(relatedModel.value) || typeof relatedModel.value === 'string') ? relatedModel.value :
186185
(Array.isArray(relatedModel.value) ? relatedModel.value : relatedModel.value.value);
187186

188-
const updateSubject = (relatedModel.type === 'CHECKBOX_GROUP' ? relatedModel.valueUpdates : relatedModel.valueChanges);
189-
const valueChanges = updateSubject.pipe(
190-
startWith(initValue)
187+
const valueChanges = this.formBuilderService.getTypeBindModelUpdates().pipe(
188+
startWith(initValue),
191189
);
192190

193191
// Build up the subscriptions to watch for changes;

src/app/shared/form/builder/form-builder.service.ts

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ import {
2121
import isObject from 'lodash/isObject';
2222
import isString from 'lodash/isString';
2323
import mergeWith from 'lodash/mergeWith';
24+
import { BehaviorSubject, Observable } from 'rxjs';
25+
import { distinctUntilChanged, switchMap } from 'rxjs/operators';
2426

2527
import {
2628
hasNoValue,
@@ -50,7 +52,7 @@ import { getFirstCompletedRemoteData } from '../../../core/shared/operators';
5052
@Injectable()
5153
export class FormBuilderService extends DynamicFormService {
5254

53-
private typeBindModel: DynamicFormControlModel;
55+
private typeBindModel: BehaviorSubject<DynamicFormControlModel> = new BehaviorSubject<DynamicFormControlModel>(null);
5456

5557
/**
5658
* This map contains the active forms model
@@ -92,11 +94,21 @@ export class FormBuilderService extends DynamicFormService {
9294
}
9395

9496
getTypeBindModel() {
95-
return this.typeBindModel;
97+
return this.typeBindModel.getValue();
98+
}
99+
100+
getTypeBindModelUpdates(): Observable<any> {
101+
return this.typeBindModel.pipe(
102+
distinctUntilChanged(),
103+
switchMap((bindModel: any) => {
104+
return (bindModel.type === 'CHECKBOX_GROUP' ? bindModel.valueUpdates : bindModel.valueChanges);
105+
}),
106+
distinctUntilChanged()
107+
);
96108
}
97109

98110
setTypeBindModel(model: DynamicFormControlModel) {
99-
this.typeBindModel = model;
111+
this.typeBindModel.next(model);
100112
}
101113

102114
findById(id: string, groupModel: DynamicFormControlModel[], arrayIndex = null): DynamicFormControlModel | null {

src/app/shared/mocks/form-builder-service.mock.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { FormBuilderService } from '../form/builder/form-builder.service';
22
import { UntypedFormControl, UntypedFormGroup } from '@angular/forms';
33
import { DsDynamicInputModel } from '../form/builder/ds-dynamic-form-ui/models/ds-dynamic-input.model';
4+
import { of } from 'rxjs';
45

56
export function getMockFormBuilderService(): FormBuilderService {
67

@@ -43,7 +44,8 @@ export function getMockFormBuilderService(): FormBuilderService {
4344
removeFormModel: {},
4445
addFormModel: {},
4546
updateValue: {},
46-
addFormGroups: {}
47+
addFormGroups: {},
48+
getTypeBindModelUpdates: of('test')
4749
});
4850

4951
}

0 commit comments

Comments
 (0)