diff --git a/projects/netgrif-components-core/src/lib/data-fields/case-ref-field/model/abstract-case-ref-base-field-component.ts b/projects/netgrif-components-core/src/lib/data-fields/case-ref-field/model/abstract-case-ref-base-field-component.ts index 0ccb01a1e..f5eef8ca6 100644 --- a/projects/netgrif-components-core/src/lib/data-fields/case-ref-field/model/abstract-case-ref-base-field-component.ts +++ b/projects/netgrif-components-core/src/lib/data-fields/case-ref-field/model/abstract-case-ref-base-field-component.ts @@ -32,7 +32,7 @@ export abstract class AbstractCaseRefBaseFieldComponent { let component: TestHeaderComponent; @@ -89,7 +96,9 @@ describe('AbstractHeaderComponent', () => { class TestHeaderComponent extends AbstractHeaderComponent { constructor(protected _injector: Injector, protected _translate: TranslateService, - @Optional() protected _overflowService: OverflowService) { - super(_injector, _translate, _overflowService); + @Optional() protected _overflowService: OverflowService, + @Optional() protected _caseViewService: CaseViewService, + @Optional() @Inject(DATA_FIELD_PORTAL_DATA) protected _dataFieldPortalData: DataFieldPortalData) { + super(_injector, _translate, _overflowService, _caseViewService, _dataFieldPortalData); } } diff --git a/projects/netgrif-components-core/src/lib/header/abstract-header.component.ts b/projects/netgrif-components-core/src/lib/header/abstract-header.component.ts index 4dcbc14e2..b27cf8930 100644 --- a/projects/netgrif-components-core/src/lib/header/abstract-header.component.ts +++ b/projects/netgrif-components-core/src/lib/header/abstract-header.component.ts @@ -1,4 +1,4 @@ -import {Component, Injector, Input, OnDestroy, OnInit, Optional} from '@angular/core'; +import {Component, Inject, Injector, Input, OnDestroy, OnInit, Optional} from '@angular/core'; import {AbstractHeaderService} from './abstract-header-service'; import {CaseHeaderService} from './case-header/case-header.service'; import {TaskHeaderService} from './task-header/task-header.service'; @@ -12,6 +12,13 @@ import {OverflowService} from './services/overflow.service'; import {stopPropagation} from '../utility/stop-propagation'; import {Subscription} from 'rxjs'; import {debounceTime} from "rxjs/operators"; +import {CaseViewService} from "../view/case-view/service/case-view-service"; +import { + DATA_FIELD_PORTAL_DATA, + DataFieldPortalData +} from "../data-fields/models/data-field-portal-data-injection-token"; +import {MultichoiceField} from "../data-fields/multichoice-field/models/multichoice-field"; +import {EnumerationField} from "../data-fields/enumeration-field/models/enumeration-field"; @Component({ selector: 'ncc-abstract-header', @@ -45,11 +52,16 @@ export abstract class AbstractHeaderComponent implements OnInit, OnDestroy { protected _initHeaderCount: number = undefined; protected _initResponsiveHeaders: boolean = undefined; protected _approvalFormControl: FormControl; + protected _changeValue: boolean; + protected _subCases: Subscription; constructor(protected _injector: Injector, protected _translate: TranslateService, - @Optional() protected _overflowService: OverflowService) { + @Optional() protected _overflowService: OverflowService, + @Optional() protected _caseViewService: CaseViewService, + @Optional() @Inject(DATA_FIELD_PORTAL_DATA) protected _dataFieldPortalData: DataFieldPortalData) { this.initializeFormControls(this._overflowService !== null); + this._changeValue = true; } @Input() @@ -93,6 +105,7 @@ export abstract class AbstractHeaderComponent implements OnInit, OnDestroy { this.headerService.responsiveHeaders = this._initResponsiveHeaders; } this.headerService.preferenceColumnCount$.subscribe(value => this.columnCountControl.setValue(value)); + this.resolveApprovalDatafields(); } ngOnDestroy(): void { @@ -101,6 +114,9 @@ export abstract class AbstractHeaderComponent implements OnInit, OnDestroy { this.subColumnCountControl.unsubscribe(); this.subOverflowControl.unsubscribe(); } + if (this._subCases) { + this._subCases.unsubscribe(); + } } /** @@ -199,4 +215,54 @@ export abstract class AbstractHeaderComponent implements OnInit, OnDestroy { } }); } + + public indeterminate() { + if (this._caseViewService) { + return this._dataFieldPortalData?.dataField?.value?.length > 0 && + this._caseViewService.cases.some(value => this._dataFieldPortalData?.dataField.value.includes(value.stringId)) && + !this.resolveApprovalValue(); + } + return this._dataFieldPortalData?.dataField?.value?.length > 0 && + this._dataFieldPortalData?.dataField?.value?.length < this._dataFieldPortalData?.dataField?.choices?.length; + } + + public typeApproval() { + return this._dataFieldPortalData?.dataField instanceof MultichoiceField ? 'multichoice' : 'enumeration'; + } + + protected resolveApprovalDatafields() { + if (this._dataFieldPortalData !== null && this._dataFieldPortalData.dataField instanceof MultichoiceField && this._caseViewService) { + this.approvalFormControl.setValue(this.resolveApprovalValue()); + this.approvalFormControl.valueChanges.subscribe(value => { + if (this._changeValue) { + if (value) { + this._dataFieldPortalData.dataField.value = this._caseViewService.cases.map(caze => caze.stringId); + } else { + this._dataFieldPortalData.dataField.value = []; + } + } + this._changeValue = true; + }) + this._dataFieldPortalData.dataField.valueChanges().subscribe(() => { + this._changeValue = false; + this.approvalFormControl.setValue(this.resolveApprovalValue()); + }) + this._subCases = this._caseViewService.cases$.subscribe(() => { + this._changeValue = false; + this.approvalFormControl.setValue(this.resolveApprovalValue()); + }) + } + if (this._dataFieldPortalData !== null && this._dataFieldPortalData.dataField instanceof EnumerationField) { + this.approvalFormControl.valueChanges.subscribe(value => { + this._dataFieldPortalData.dataField.value = null; + }) + } + } + + protected resolveApprovalValue() { + if (this._caseViewService.cases.length === 0) { + return false; + } + return this._caseViewService.cases.every(value => this._dataFieldPortalData?.dataField.value.includes(value.stringId)); + } } diff --git a/projects/netgrif-components-core/src/lib/panel/task-panel-list/task-panel-list-pagination/abstract-task-list-pagination.component.ts b/projects/netgrif-components-core/src/lib/panel/task-panel-list/task-panel-list-pagination/abstract-task-list-pagination.component.ts index 04ec4b9fc..1b00842b2 100644 --- a/projects/netgrif-components-core/src/lib/panel/task-panel-list/task-panel-list-pagination/abstract-task-list-pagination.component.ts +++ b/projects/netgrif-components-core/src/lib/panel/task-panel-list/task-panel-list-pagination/abstract-task-list-pagination.component.ts @@ -18,7 +18,7 @@ export abstract class AbstractTaskListPaginationComponent extends AbstractDefaul public length: number; public pageSize = 20; public pageIndex = 0; - public pageSizeOptions: Array = [10, 20, 50]; + public pageSizeOptions: Array = [10, 20, 50, 100]; @Input() public disabled: boolean; @Input() diff --git a/projects/netgrif-components-core/src/lib/view/case-view/components/case-list-paginator/abstract-case-list-paginator.component.ts b/projects/netgrif-components-core/src/lib/view/case-view/components/case-list-paginator/abstract-case-list-paginator.component.ts index deb0a335d..1f6d2f48d 100644 --- a/projects/netgrif-components-core/src/lib/view/case-view/components/case-list-paginator/abstract-case-list-paginator.component.ts +++ b/projects/netgrif-components-core/src/lib/view/case-view/components/case-list-paginator/abstract-case-list-paginator.component.ts @@ -17,7 +17,7 @@ export abstract class AbstractCaseListPaginatorComponent extends AbstractDefault public length: number; public pageSize = 20; public pageIndex = 0; - public pageSizeOptions: number[] = [10, 20, 50]; + public pageSizeOptions: number[] = [10, 20, 50, 100]; @Input() public approval: boolean; @Input() public disabled: boolean; diff --git a/projects/netgrif-components-core/src/lib/view/case-view/service/case-view-service.ts b/projects/netgrif-components-core/src/lib/view/case-view/service/case-view-service.ts index 66eb5b7fa..ac84fcfc6 100644 --- a/projects/netgrif-components-core/src/lib/view/case-view/service/case-view-service.ts +++ b/projects/netgrif-components-core/src/lib/view/case-view/service/case-view-service.ts @@ -47,6 +47,7 @@ export class CaseViewService extends AbstractSortableViewComponent implements On protected _loading$: LoadingWithFilterEmitter; protected _cases$: Observable>; + protected _cases: Array; protected _nextPage$: BehaviorSubject; protected _endOfData: boolean; protected _pagination: Pagination; @@ -67,6 +68,7 @@ export class CaseViewService extends AbstractSortableViewComponent implements On @Optional() @Inject(NAE_NEW_CASE_CONFIGURATION) newCaseConfig: NewCaseConfiguration, protected _permissionService: PermissionService) { super(resolver); + this._cases = []; this._newCaseConfiguration = {...this.DEFAULT_NEW_CASE_CONFIGURATION}; if (newCaseConfig !== null) { Object.assign(this._newCaseConfiguration, newCaseConfig); @@ -112,7 +114,8 @@ export class CaseViewService extends AbstractSortableViewComponent implements On }, {}) ); this._cases$ = casesMap.pipe( - map(v => Object.values(v)) + map(v => Object.values(v) as Array), + tap(cases => this._cases = cases as Array), ); } @@ -134,6 +137,10 @@ export class CaseViewService extends AbstractSortableViewComponent implements On return this._cases$; } + public get cases(): Array { + return this._cases; + } + public get pagination(): Pagination { return this._pagination; } diff --git a/projects/netgrif-components/src/lib/header/header.component.ts b/projects/netgrif-components/src/lib/header/header.component.ts index a9ae5f61e..552479baa 100644 --- a/projects/netgrif-components/src/lib/header/header.component.ts +++ b/projects/netgrif-components/src/lib/header/header.component.ts @@ -6,7 +6,7 @@ import { HeaderSearchService, TaskHeaderService, WorkflowHeaderService, - OverflowService, MultichoiceField, DATA_FIELD_PORTAL_DATA, DataFieldPortalData, EnumerationField + OverflowService, MultichoiceField, DATA_FIELD_PORTAL_DATA, DataFieldPortalData, EnumerationField, CaseViewService } from '@netgrif/components-core'; import {TranslateService} from '@ngx-translate/core'; @@ -22,49 +22,13 @@ import {TranslateService} from '@ngx-translate/core'; CategoryFactory ] }) -export class HeaderComponent extends AbstractHeaderComponent implements OnInit { - protected _changeValue: boolean; +export class HeaderComponent extends AbstractHeaderComponent { constructor(injector: Injector, translate: TranslateService, @Optional() overflowService: OverflowService, - @Optional() @Inject(DATA_FIELD_PORTAL_DATA) protected _dataFieldPortalData: DataFieldPortalData) { - super(injector, translate, overflowService); - this._changeValue = true; - } - - public indeterminate() { - return this._dataFieldPortalData?.dataField?.value?.length > 0 && - this._dataFieldPortalData?.dataField?.value?.length < this._dataFieldPortalData?.dataField?.choices?.length; - } - - public typeApproval() { - return this._dataFieldPortalData?.dataField instanceof MultichoiceField ? 'multichoice' : 'enumeration'; - } - - ngOnInit() { - super.ngOnInit(); - if (this._dataFieldPortalData !== null && this._dataFieldPortalData.dataField instanceof MultichoiceField) { - this.approvalFormControl.setValue(this._dataFieldPortalData?.dataField.value.length === this._dataFieldPortalData?.dataField.choices.length); - this.approvalFormControl.valueChanges.subscribe(value => { - if (this._changeValue) { - if (value) { - this._dataFieldPortalData.dataField.value = this._dataFieldPortalData?.dataField.choices.map(val => val.key); - } else { - this._dataFieldPortalData.dataField.value = []; - } - } - this._changeValue = true; - }) - this._dataFieldPortalData.dataField.valueChanges().subscribe(() => { - this._changeValue = false; - this.approvalFormControl.setValue(this._dataFieldPortalData?.dataField.value.length === this._dataFieldPortalData?.dataField.choices.length); - }) - } - if (this._dataFieldPortalData !== null && this._dataFieldPortalData.dataField instanceof EnumerationField) { - this.approvalFormControl.valueChanges.subscribe(value => { - this._dataFieldPortalData.dataField.value = null; - }) - } + @Optional() protected _caseViewService: CaseViewService, + @Optional() @Inject(DATA_FIELD_PORTAL_DATA) protected _dataFieldPortalData: DataFieldPortalData) { + super(injector, translate, overflowService, _caseViewService, _dataFieldPortalData); } }