Sfoglia il codice sorgente

search components

master
Daniel 1 anno fa
parent
commit
84531bb163
26 ha cambiato i file con 653 aggiunte e 166 eliminazioni
  1. +1
    -1
      matsen-tool/openapi.json
  2. +78
    -0
      matsen-tool/openapi.yaml
  3. +7
    -0
      matsen-tool/src/app/_components/search-input/search-input-col-def.ts
  4. +41
    -0
      matsen-tool/src/app/_components/search-select/search-select.component.html
  5. +0
    -0
      matsen-tool/src/app/_components/search-select/search-select.component.scss
  6. +23
    -0
      matsen-tool/src/app/_components/search-select/search-select.component.spec.ts
  7. +124
    -0
      matsen-tool/src/app/_components/search-select/search-select.component.ts
  8. +6
    -0
      matsen-tool/src/app/_forms/apiForms.ts
  9. +20
    -18
      matsen-tool/src/app/_views/products/assign-product/assign-product.component.html
  10. +63
    -56
      matsen-tool/src/app/_views/products/assign-product/assign-product.component.ts
  11. +12
    -3
      matsen-tool/src/app/_views/products/product-list/product-list.component.ts
  12. +17
    -6
      matsen-tool/src/app/_views/tasks/new-task-note/new-task-note.component.html
  13. +91
    -49
      matsen-tool/src/app/_views/tasks/new-task-note/new-task-note.component.ts
  14. +24
    -9
      matsen-tool/src/app/_views/tasks/new-task/new-task.component.html
  15. +79
    -3
      matsen-tool/src/app/_views/tasks/new-task/new-task.component.ts
  16. +1
    -1
      matsen-tool/src/app/_views/tasks/task-list/task-list.component.html
  17. +7
    -3
      matsen-tool/src/app/_views/tasks/task-list/task-list.component.ts
  18. +2
    -0
      matsen-tool/src/app/app.module.ts
  19. +9
    -4
      matsen-tool/src/app/core/api/v1/api/contact.service.ts
  20. +9
    -4
      matsen-tool/src/app/core/api/v1/api/partnerProduct.service.ts
  21. +9
    -4
      matsen-tool/src/app/core/api/v1/api/product.service.ts
  22. +9
    -4
      matsen-tool/src/app/core/api/v1/api/user.service.ts
  23. +6
    -0
      matsen-tool/src/app/core/api/v1/model/taskNote.ts
  24. +6
    -0
      matsen-tool/src/app/core/api/v1/model/taskNoteJsonhal.ts
  25. +6
    -0
      matsen-tool/src/app/core/api/v1/model/taskNoteJsonld.ts
  26. +3
    -1
      matsen-tool/src/assets/i18n/de.json

+ 1
- 1
matsen-tool/openapi.json
File diff soppresso perché troppo grande
Vedi File


+ 78
- 0
matsen-tool/openapi.yaml Vedi File

@@ -586,6 +586,18 @@ paths:
style: form
explode: true
allowReserved: false
-
name: nameSearch
in: query
description: ''
required: false
deprecated: false
allowEmptyValue: true
schema:
type: string
style: form
explode: false
allowReserved: false
deprecated: false
post:
operationId: api_contacts_post
@@ -1811,6 +1823,18 @@ paths:
style: form
explode: true
allowReserved: false
-
name: productPartnerUnassigned
in: query
description: ''
required: false
deprecated: false
allowEmptyValue: true
schema:
type: string
style: form
explode: false
allowReserved: false
deprecated: false
post:
operationId: api_partner_products_post
@@ -2633,6 +2657,18 @@ paths:
style: form
explode: false
allowReserved: false
-
name: partnerIdUnassigned
in: query
description: ''
required: false
deprecated: false
allowEmptyValue: true
schema:
type: string
style: form
explode: false
allowReserved: false
-
name: 'order[name]'
in: query
@@ -4023,6 +4059,18 @@ paths:
style: form
explode: false
allowReserved: false
-
name: nameSearch
in: query
description: ''
required: false
deprecated: false
allowEmptyValue: true
schema:
type: string
style: form
explode: false
allowReserved: false
deprecated: false
post:
operationId: api_users_post
@@ -6657,6 +6705,16 @@ components:
- 'null'
format: iri-reference
example: 'https://example.com/'
contact:
readOnly: true
description: '?ContactApi'
$ref: '#/components/schemas/Contact'
contactIri:
type:
- string
- 'null'
format: iri-reference
example: 'https://example.com/'
contactType:
type: string
enum:
@@ -6701,6 +6759,16 @@ components:
- 'null'
format: iri-reference
example: 'https://example.com/'
contact:
readOnly: true
description: '?ContactApi'
$ref: '#/components/schemas/Contact.jsonhal'
contactIri:
type:
- string
- 'null'
format: iri-reference
example: 'https://example.com/'
contactType:
type: string
enum:
@@ -6759,6 +6827,16 @@ components:
- 'null'
format: iri-reference
example: 'https://example.com/'
contact:
readOnly: true
description: '?ContactApi'
$ref: '#/components/schemas/Contact.jsonld'
contactIri:
type:
- string
- 'null'
format: iri-reference
example: 'https://example.com/'
contactType:
type: string
enum:


+ 7
- 0
matsen-tool/src/app/_components/search-input/search-input-col-def.ts Vedi File

@@ -0,0 +1,7 @@
export interface SearchInputColDef {
column: string,
columnHeader: string,
columnType: string,
field?: string
subResource?: string
}

+ 41
- 0
matsen-tool/src/app/_components/search-select/search-select.component.html Vedi File

@@ -0,0 +1,41 @@
<app-paging #pagingComponent
[getDataFunction]="getDataFunction"
[dataSource]="dataSource"
[searchable]="true"
>

<div *ngIf="searchSelectColDefs" class="table-responsive">
<table mat-table [dataSource]="dataSource" matSort (matSortChange)="onSortChange($event)" class="mat-elevation-z8">

<ng-container *ngFor="let column of searchSelectColDefs" [matColumnDef]="column.column">
<th mat-header-cell *matHeaderCellDef>
{{ column.columnHeader | translate }}
</th>
<ng-container *ngIf="column.columnType == COLUMN_TYPE_POSITION">
<td mat-cell *matCellDef="let element">
{{ pagingComponent.getPageSize() * (pagingComponent.getPageIndex()-1) + dataSource.filteredData.indexOf(element) + 1 }}
</td>
</ng-container>
<ng-container *ngIf="column.columnType == COLUMN_TYPE_IMAGE">
<td mat-cell *matCellDef="let element">
<img src="{{ getElementValue(element, column) }}" width="40" height="40"/>
</td>
</ng-container>
<ng-container *ngIf="column.columnType == COLUMN_TYPE_TEXT">
<td mat-cell *matCellDef="let element">
{{ getElementValue(element, column) }}
</td>
</ng-container>

</ng-container>

<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
<tr mat-row
*matRowDef="let row; columns: displayedColumns; index as i;"
(click)="onRowSelected(row, i)"
[ngClass]="{'highlighted': selectedRowIndex === i}"
></tr>

</table>
</div>
</app-paging>

+ 0
- 0
matsen-tool/src/app/_components/search-select/search-select.component.scss Vedi File


+ 23
- 0
matsen-tool/src/app/_components/search-select/search-select.component.spec.ts Vedi File

@@ -0,0 +1,23 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';

import { SearchSelectComponent } from './search-select.component';

describe('SearchSelectComponent', () => {
let component: SearchSelectComponent;
let fixture: ComponentFixture<SearchSelectComponent>;

beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [SearchSelectComponent]
})
.compileComponents();
fixture = TestBed.createComponent(SearchSelectComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});

it('should create', () => {
expect(component).toBeTruthy();
});
});

+ 124
- 0
matsen-tool/src/app/_components/search-select/search-select.component.ts Vedi File

@@ -0,0 +1,124 @@
import {AfterViewInit, Component, EventEmitter, Input, OnInit, Output, ViewChild} from '@angular/core';
import {PagingComponent} from "@app/_components/paging/paging.component";
import {FormGroup} from "@angular/forms";
import {SearchInputColDef} from "@app/_components/search-input/search-input-col-def";
import {MatSort, Sort} from "@angular/material/sort";
import {OrderFilter} from "@app/_models/orderFilter";

@Component({
selector: 'app-search-select',
templateUrl: './search-select.component.html',
styleUrl: './search-select.component.scss'
})
export class SearchSelectComponent implements OnInit, AfterViewInit {

static COLUMN_TYPE_POSITION: string = 'position';
static COLUMN_TYPE_TEXT: string = 'text';
static COLUMN_TYPE_IMAGE: string = 'image';
static validColumnTypes: string[] = [
SearchSelectComponent.COLUMN_TYPE_POSITION,
SearchSelectComponent.COLUMN_TYPE_TEXT,
SearchSelectComponent.COLUMN_TYPE_IMAGE
];

@Input() public formId!: string;
@Input() public formLabelLangKey!: string;
@Input() public documentForm!: FormGroup;
@Input() public documentFormField!: string;
@Input() public getDataFunction!: Function;
@Input() public dataSource: any;
@Input() public searchSelectColDefs!: SearchInputColDef[];
@Output() rowSelected = new EventEmitter<any>();
@ViewChild("pagingComponent", { static: false }) pagingComponent!: PagingComponent
@ViewChild(MatSort) sort;

protected displayedColumns!: string[];
protected selectedRowIndex: number | null = null;

constructor() {
this.sort = new MatSort();
}

ngOnInit(): void {
this.displayedColumns = [];
this.searchSelectColDefs.forEach((value, index) => {
this.displayedColumns.push(value.column);
});
}

ngAfterViewInit(): void {

}

getData(): void {
this.pagingComponent.getData();
}

setData(dataSource: any, data: any[], dataLength: number): void {
console.log(data);
this.dataSource = dataSource;
this.pagingComponent.dataSource = dataSource;
this.pagingComponent.dataLength = dataLength;
}

getPagingComponent(): PagingComponent {
return this.pagingComponent;
}

onSortChange = (sortState: Sort) => {
this.pagingComponent.resetPageIndex()

let order: OrderFilter;
if (sortState.direction === "") {
order = OrderFilter.Undefined;
} else {
order = sortState.direction;
}
this.pagingComponent.getData();
}

onRowSelected(row: any, index: number) {
console.log('row selected');
console.log(row, index);
this.selectedRowIndex = index;
this.documentForm.get(this.formId)?.setValue(row.id);
}

get COLUMN_TYPE_POSITION(): string {
return SearchSelectComponent.COLUMN_TYPE_POSITION;
}

get COLUMN_TYPE_IMAGE(): string {
return SearchSelectComponent.COLUMN_TYPE_IMAGE;
}

get COLUMN_TYPE_TEXT(): string {
return SearchSelectComponent.COLUMN_TYPE_TEXT;
}

getElementValue(element: any, column: SearchInputColDef): any {
if (column.field) {
return column.subResource ? element[column.subResource][column.field] : element[column.field];
}
}

static createColDef(
column: string,
columnHeader: string,
columnType: string,
field?: string,
subResource?: string
): SearchInputColDef {
if (!this.validColumnTypes.includes(columnType)) {
throw Error('invalid column type');
}

let res: SearchInputColDef = {} as SearchInputColDef;
res.column = column;
res.columnHeader = columnHeader;
res.columnType = columnType;
res.field = field;
res.subResource = subResource
return res;
}
}

+ 6
- 0
matsen-tool/src/app/_forms/apiForms.ts Vedi File

@@ -498,6 +498,8 @@ export const taskNoteForm = new FormGroup({
message: new FormControl(null, [Validators.required]),
owner: new FormControl(null, []),
taskIri: new FormControl(null, [Validators.required]),
contact: new FormControl(null, []),
contactIri: new FormControl(null, []),
contactType: new FormControl(null, [Validators.required]),
createdAt: new FormControl(null, [])
});
@@ -507,6 +509,8 @@ export const taskNoteJsonhalForm = new FormGroup({
message: new FormControl(null, [Validators.required]),
owner: new FormControl(null, []),
taskIri: new FormControl(null, [Validators.required]),
contact: new FormControl(null, []),
contactIri: new FormControl(null, []),
contactType: new FormControl(null, [Validators.required]),
createdAt: new FormControl(null, [])
});
@@ -515,6 +519,8 @@ export const taskNoteJsonldForm = new FormGroup({
message: new FormControl(null, [Validators.required]),
owner: new FormControl(null, []),
taskIri: new FormControl(null, [Validators.required]),
contact: new FormControl(null, []),
contactIri: new FormControl(null, []),
contactType: new FormControl(null, [Validators.required]),
createdAt: new FormControl(null, [])
});


+ 20
- 18
matsen-tool/src/app/_views/products/assign-product/assign-product.component.html Vedi File

@@ -3,26 +3,28 @@
<div class="spt-form">
<form [formGroup]="form" (ngSubmit)="onSubmit()">
<div class="mb-3" *ngIf="this.partnerProduct">
<app-search-input #productSearchInput
[formId]="'productIri'"
[formLabelLangKey]="'form.product'"
[dataField]="'productName'"
[documentForm]="form"
[documentFormField]="'productName'"
[fetchFunction]="fetchPartnerProducts">
</app-search-input>
<input type="hidden" formControlName="partnerIri" value="{{partnerProduct.partnerIri}}"/>
<app-search-select #productSearchSelect
[formId]="'productIri'"
[formLabelLangKey]="'form.product'"
[documentForm]="form"
[getDataFunction]="getUnassignedProducts"
[dataSource]="dataSourceProducts"
[searchSelectColDefs]="colDefProducts"
>
<input type="hidden" formControlName="productIri" value="{{partnerProduct.productIri}}"/>
</app-search-select>
</div>
<div class="mb-3" *ngIf="this.contactPartnerProduct">
<app-search-input #productSearchInput
[formId]="'partnerProductIri'"
[formLabelLangKey]="'form.product'"
[dataField]="'productName'"
[documentForm]="form"
[documentFormField]="'productName'"
[fetchFunction]="fetchContactPartnerProducts">
</app-search-input>
<input type="hidden" formControlName="partnerProductIri" value="{{contactPartnerProduct.partnerProductIri}}"/>
<app-search-select #productSearchSelect
[formId]="'partnerProductIri'"
[formLabelLangKey]="'form.product'"
[documentForm]="form"
[getDataFunction]="getUnassignedPartnerProducts"
[dataSource]="dataSourcePartnerProducts"
[searchSelectColDefs]="colDefPartnerProducts"
>
<input type="hidden" formControlName="partnerProductIri" value="{{contactPartnerProduct.partnerProductIri}}"/>
</app-search-select>
</div>
<button type="submit" class="btn btn-primary" [disabled]="form.invalid">{{'form.send' | translate}}</button>
</form>

+ 63
- 56
matsen-tool/src/app/_views/products/assign-product/assign-product.component.ts Vedi File

@@ -1,37 +1,62 @@
import {Component, EventEmitter, Input, OnInit, Output, ViewChild} from '@angular/core';
import {AfterViewInit, Component, EventEmitter, Input, OnInit, Output, ViewChild} from '@angular/core';
import {
ContactPartnerProductJsonld, ContactPartnerProductService, PartnerJsonld,
PartnerProductJsonld, PartnerProductService,
ContactPartnerProductJsonld, ContactPartnerProductService,
PartnerProductJsonld, PartnerProductService, ProductJsonld,
ProductService,
} from "@app/core/api/v1";
import {ModalStatus} from "@app/_helpers/modal.states";
import {SearchInputComponent} from "@app/_components/search-input/search-input.component";
import {FormGroupInitializer} from "@app/_helpers/formgroup.initializer";
import {FormGroup} from "@angular/forms";
import {contactPartnerProductForm, partnerProductForm} from "@app/_forms/apiForms";
import {forkJoin, Observable} from "rxjs";
import {map} from "rxjs/operators";
import {SearchSelectComponent} from "@app/_components/search-select/search-select.component";
import {MatTableDataSource} from "@angular/material/table";
import {SearchInputColDef} from "@app/_components/search-input/search-input-col-def";
import {AppHelperService} from "@app/_helpers/app-helper.service";

@Component({
selector: 'app-assign-product',
templateUrl: './assign-product.component.html',
styleUrl: './assign-product.component.scss'
})
export class AssignProductComponent implements OnInit {
export class AssignProductComponent implements OnInit, AfterViewInit {
@Input() public partnerIri!: string;
@Input() public partnerProduct!: PartnerProductJsonld;
@Input() public contactPartnerProduct!: ContactPartnerProductJsonld;
@Output() public submit: EventEmitter<ModalStatus> = new EventEmitter<ModalStatus>();
@ViewChild('productSearchInput', { static: false }) $productSearchInput!: SearchInputComponent;
@ViewChild('productSearchSelect', { static: false }) productSearchSelect!: SearchSelectComponent;

protected products: Array<ProductJsonld>;
protected dataSourceProducts;
protected partnerProducts: Array<PartnerProductJsonld>;
protected dataSourcePartnerProducts;
protected form!: FormGroup;

protected colDefProducts: SearchInputColDef[];
protected colDefPartnerProducts: SearchInputColDef[];

constructor(
protected productService: ProductService,
protected partnerProductService: PartnerProductService,
protected contactPartnerProductService: ContactPartnerProductService
protected contactPartnerProductService: ContactPartnerProductService,
protected appHelperService: AppHelperService,
) {
this.products = [];
this.dataSourceProducts = new MatTableDataSource<ProductJsonld>(this.products);

this.partnerProducts = [];
this.dataSourcePartnerProducts = new MatTableDataSource<PartnerProductJsonld>(this.partnerProducts);

this.colDefProducts = [
SearchSelectComponent.createColDef('pos', 'overview.number', SearchSelectComponent.COLUMN_TYPE_POSITION),
SearchSelectComponent.createColDef('img', 'overview.image', SearchSelectComponent.COLUMN_TYPE_IMAGE, 'imageUrl'),
SearchSelectComponent.createColDef('name', 'overview.productname', SearchSelectComponent.COLUMN_TYPE_TEXT, 'name')
];

this.colDefPartnerProducts = [
SearchSelectComponent.createColDef('pos', 'overview.number', SearchSelectComponent.COLUMN_TYPE_POSITION),
SearchSelectComponent.createColDef('img', 'overview.image', SearchSelectComponent.COLUMN_TYPE_IMAGE, 'imageUrl', 'product'),
SearchSelectComponent.createColDef('name', 'overview.productname', SearchSelectComponent.COLUMN_TYPE_TEXT, 'name', 'product')
];
}

ngOnInit(): void {
@@ -43,33 +68,29 @@ export class AssignProductComponent implements OnInit {
}
}

fetchPartnerProducts = (term: string): Observable<{ id: any; name: any }[]> => {
let products$ = this.productService.productsGetCollection(1, 50, term);
let partnerProducts$ = this.partnerProductService.partnerProductsGetCollection(
1,
50,
this.partnerProduct.partnerIri!,
undefined,
undefined,
undefined,
undefined,
term
);
ngAfterViewInit(): void {
this.productSearchSelect.getData();
}

// Combine api calls
return forkJoin([products$, partnerProducts$])
.pipe(
map(([productsResponse, partnerProductsResponse]) => {
let products = productsResponse['hydra:member'].map(product => ({ id: product.id, name: product.name }));
let partnerProductIds = partnerProductsResponse['hydra:member'].map(partnerProduct => partnerProduct.product?.id);
// Filter all products where a partner product already exists
return products.filter(product => !partnerProductIds.includes(product.id));
})
);
getUnassignedProducts = (term?: string): void => {
// NOTE: all products that are not assigned to partner yet
this.productService.productsGetCollection(
this.productSearchSelect.pagingComponent.getPageIndex(),
this.productSearchSelect.pagingComponent.getPageSize(),
term,
this.appHelperService.extractId(this.partnerProduct.partnerIri)
).subscribe(
data => {
this.products = data['hydra:member'];
this.dataSourceProducts = new MatTableDataSource<ProductJsonld>(this.products);
this.productSearchSelect.setData(this.dataSourceProducts, this.products, Number(data["hydra:totalItems"]));
}
);
}

fetchContactPartnerProducts = (term: string): Observable<{ id: any; name: any }[]> => {
let partnerProducts$ = this.partnerProductService.partnerProductsGetCollection(
getUnassignedPartnerProducts = (term: string) => {
// NOTE: all partner products that are not assigned to contact yet
this.partnerProductService.partnerProductsGetCollection(
1,
50,
this.partnerIri,
@@ -77,31 +98,17 @@ export class AssignProductComponent implements OnInit {
undefined,
undefined,
undefined,
term
);

let contactPartnerProducts$ = this.contactPartnerProductService.contactPartnerProductsGetCollection(
1,
50,
this.contactPartnerProduct.contactIri!,
term,
undefined,
undefined,
term
this.appHelperService.extractId(this.contactPartnerProduct.contactIri)
).subscribe(
data => {
this.partnerProducts = data['hydra:member'];
this.dataSourcePartnerProducts = new MatTableDataSource<PartnerProductJsonld>(this.partnerProducts);
this.productSearchSelect.setData(this.dataSourceProducts, this.partnerProducts, Number(data["hydra:totalItems"]));
}
);

// Combine api calls
return forkJoin([partnerProducts$, contactPartnerProducts$])
.pipe(
map(([partnerProductsResponse, contactPartnerProductsResponse]) => {
let partnerProducts = partnerProductsResponse['hydra:member'].map(partnerProduct =>
({ id: partnerProduct.id, name: partnerProduct.product!.name })
);
let contactPartnerProductIds = contactPartnerProductsResponse['hydra:member'].map(contactPartnerProduct =>
contactPartnerProduct.partnerProduct?.id
);
// Filter all products where a partner product already exists
return partnerProducts.filter(partnerProduct => !contactPartnerProductIds.includes(partnerProduct.id));
})
);
}

onSubmit() {


+ 12
- 3
matsen-tool/src/app/_views/products/product-list/product-list.component.ts Vedi File

@@ -38,6 +38,7 @@ export class ProductListComponent implements OnInit, AfterViewInit {
protected products: Array<ProductJsonld>;
protected dataSource;
protected bShowNewProductButton: boolean;
protected nameOrderAsc: OrderFilter;

constructor(
private router: Router,
@@ -55,6 +56,7 @@ export class ProductListComponent implements OnInit, AfterViewInit {
this.products = [];
this.dataSource = new MatTableDataSource<ProductJsonld>(this.products);
this.bShowNewProductButton = true;
this.nameOrderAsc = OrderFilter.Asc;
}

ngOnInit(){
@@ -88,7 +90,9 @@ export class ProductListComponent implements OnInit, AfterViewInit {
this.productsSub = this.productService.productsGetCollection(
this.pagingComponent.getPageIndex(),
this.pagingComponent.getPageSize(),
searchValue
searchValue,
undefined,
this.nameOrderAsc,
).subscribe(
data => {
this.products = data["hydra:member"];
@@ -103,6 +107,10 @@ export class ProductListComponent implements OnInit, AfterViewInit {
this.pagingComponent.getPageIndex(),
this.pagingComponent.getPageSize(),
this.user.id,
undefined,
undefined,
undefined,
this.nameOrderAsc,
).subscribe(
data => {
let userProducts = data["hydra:member"];
@@ -127,7 +135,8 @@ export class ProductListComponent implements OnInit, AfterViewInit {
undefined,
undefined,
undefined,
searchValue
undefined,
searchValue,
).subscribe(
data => {
let partnerProducts = data["hydra:member"];
@@ -159,7 +168,6 @@ export class ProductListComponent implements OnInit, AfterViewInit {
this.products.push(item.product);
}
})
console.log(this.products);
this.pagingComponent.dataLength = Number(data["hydra:totalItems"]);
this.dataSource = new MatTableDataSource<ProductJsonld>(this.products);
}
@@ -177,6 +185,7 @@ export class ProductListComponent implements OnInit, AfterViewInit {
} else {
order = sortState.direction;
}
this.nameOrderAsc = order;
this.pagingComponent.getData();
}



+ 17
- 6
matsen-tool/src/app/_views/tasks/new-task-note/new-task-note.component.html Vedi File

@@ -11,12 +11,23 @@
</div>

<div class="mb-3">
<p class="form-label">{{ 'form.contact-type' | translate }}:</p>
<div class="d-flex">
<div class="form-check me-3" *ngFor="let type of contactTypes; let i = index">
<input type="radio" class="form-check-input" id="radio-{{ type }}" formControlName="contactType" [value]="type" />
<label for="radio-{{ type }}" class="form-check-label">{{ getTranslationKey(type) | translate }}</label>
</div>
<app-search-select #contactSearchSelect
[formId]="'contactIri'"
[formLabelLangKey]="'form.product'"
[documentForm]="taskNoteForm"
[getDataFunction]="getContacts"
[dataSource]="dataSourceContacts"
[searchSelectColDefs]="colDefContacts"
>
<input type="hidden" formControlName="contactIri" value="{{taskNote.contactIri}}"/>
</app-search-select>
</div>

<p class="form-label">{{ 'form.contact-type' | translate }}:</p>
<div class="d-flex">
<div class="form-check me-3" *ngFor="let type of contactTypes; let i = index">
<input type="radio" class="form-check-input" id="radio-{{ type }}" formControlName="contactType" [value]="type" />
<label for="radio-{{ type }}" class="form-check-label">{{ getContactTypeTranslationKey(type) | translate }}</label>
</div>
</div>



+ 91
- 49
matsen-tool/src/app/_views/tasks/new-task-note/new-task-note.component.ts Vedi File

@@ -1,71 +1,113 @@
import {Component, EventEmitter, Input, Output} from '@angular/core';
import {TaskNoteJsonld, TaskNoteService} from "@app/core/api/v1";
import {AfterViewInit, Component, EventEmitter, Input, OnInit, Output, ViewChild} from '@angular/core';
import {
ContactJsonld,
ContactService,
TaskJsonld,
TaskNoteJsonld,
TaskNoteService
} from "@app/core/api/v1";
import {ModalStatus} from "@app/_helpers/modal.states";
import {FormGroup} from "@angular/forms";
import {Subscription} from "rxjs";
import {FormGroupInitializer} from "@app/_helpers/formgroup.initializer";
import {AppHelperService} from "@app/_helpers/app-helper.service";
import {taskNoteForm} from "@app/_forms/apiForms";
import {SearchSelectComponent} from "@app/_components/search-select/search-select.component";
import {MatTableDataSource} from "@angular/material/table";
import {SearchInputColDef} from "@app/_components/search-input/search-input-col-def";

@Component({
selector: 'app-new-task-note',
templateUrl: './new-task-note.component.html',
styleUrl: './new-task-note.component.scss'
selector: 'app-new-task-note',
templateUrl: './new-task-note.component.html',
styleUrl: './new-task-note.component.scss'
})
export class NewTaskNoteComponent {
@Input() public taskNote!: TaskNoteJsonld;
@Output() public submit: EventEmitter<ModalStatus> = new EventEmitter<ModalStatus>();
export class NewTaskNoteComponent implements OnInit, AfterViewInit {
@Input() public task!: TaskJsonld;
@Input() public taskNote!: TaskNoteJsonld;
@Output() public submit: EventEmitter<ModalStatus> = new EventEmitter<ModalStatus>();
@ViewChild('contactSearchSelect', { static: false }) contactSearchSelect!: SearchSelectComponent;

protected taskNoteForm: FormGroup;
protected taskNoteSub: Subscription;
protected contactTypes = Object.values(TaskNoteJsonld.ContactTypeEnum);
protected taskNoteForm: FormGroup;
protected taskNoteSub: Subscription;
protected contactTypes = Object.values(TaskNoteJsonld.ContactTypeEnum);
protected contacts: Array<ContactJsonld>;
protected dataSourceContacts;
protected colDefContacts: SearchInputColDef[];

constructor(
private taskNoteService: TaskNoteService,
protected appHelperService: AppHelperService
) {
this.taskNoteForm = taskNoteForm;
this.taskNoteSub = new Subscription();
}
constructor(
protected taskNoteService: TaskNoteService,
protected appHelperService: AppHelperService,
protected contactService: ContactService
) {
this.taskNoteForm = taskNoteForm;
this.taskNoteSub = new Subscription();
this.contacts = [];
this.dataSourceContacts = new MatTableDataSource<ContactJsonld>(this.contacts);

ngOnInit(): void {
this.taskNoteForm = FormGroupInitializer.initFormGroup(this.taskNoteForm, this.taskNote);
const contactTypeControl = this.taskNoteForm.get('contactType');
// Set first radio checked
if (contactTypeControl && !contactTypeControl.value) {
contactTypeControl.patchValue(this.contactTypes[0]);
this.colDefContacts = [
SearchSelectComponent.createColDef('pos', 'overview.number', SearchSelectComponent.COLUMN_TYPE_POSITION),
SearchSelectComponent.createColDef('img', 'overview.image', SearchSelectComponent.COLUMN_TYPE_IMAGE, 'imageUrl'),
SearchSelectComponent.createColDef('name', 'form.name', SearchSelectComponent.COLUMN_TYPE_TEXT, 'fullName')
];
}
console.log(this.taskNoteForm);
}

getTranslationKey(type: string): string {
return `task-note.type-${type}`;
}
ngOnInit(): void {
this.taskNoteForm = FormGroupInitializer.initFormGroup(this.taskNoteForm, this.taskNote);
const contactTypeControl = this.taskNoteForm.get('contactType');
// Set first radio checked
if (contactTypeControl && !contactTypeControl.value) {
contactTypeControl.patchValue(this.contactTypes[0]);
}
}

ngAfterViewInit(): void {
this.contactSearchSelect.getData();
}

onSubmit() {
if (this.taskNoteForm.valid) {
if (this.taskNote.id === null || this.taskNote.id === undefined) {
// Create new taskNote
this.taskNoteSub = this.taskNoteService.taskNotesPost(
this.taskNoteForm.value as TaskNoteJsonld
getContacts = (term?: string): void => {
this.contactService.contactsGetCollection(
this.contactSearchSelect.pagingComponent.getPageIndex(),
this.contactSearchSelect.pagingComponent.getPageSize(),
this.task.partnerIri!,
undefined,
term
).subscribe(
data => {
this.taskNoteForm.reset();
this.submit.emit(ModalStatus.Submitted);
this.contacts = data['hydra:member'];
this.dataSourceContacts = new MatTableDataSource<ContactJsonld>(this.contacts);
this.contactSearchSelect.setData(this.dataSourceContacts, this.contacts, Number(data["hydra:totalItems"]));
}
);
} else {
// Edit taskNote
this.taskNoteSub = this.taskNoteService.taskNotesIdPatch(
this.appHelperService.extractId(this.taskNote.id),
this.taskNoteForm.value as TaskNoteJsonld
).subscribe(
data => {
this.taskNoteForm.reset();
this.submit.emit(ModalStatus.Submitted);
}

getContactTypeTranslationKey(type: string): string {
return `task-note.type-${type}`;
}

onSubmit() {
if (this.taskNoteForm.valid) {
if (this.taskNote.id === null || this.taskNote.id === undefined) {
// Create new taskNote
this.taskNoteSub = this.taskNoteService.taskNotesPost(
this.taskNoteForm.value as TaskNoteJsonld
).subscribe(
data => {
this.taskNoteForm.reset();
this.submit.emit(ModalStatus.Submitted);
}
);
} else {
// Edit taskNote
this.taskNoteSub = this.taskNoteService.taskNotesIdPatch(
this.appHelperService.extractId(this.taskNote.id),
this.taskNoteForm.value as TaskNoteJsonld
).subscribe(
data => {
this.taskNoteForm.reset();
this.submit.emit(ModalStatus.Submitted);
}
);
}
);
}
}
}
}
}

+ 24
- 9
matsen-tool/src/app/_views/tasks/new-task/new-task.component.html Vedi File

@@ -18,18 +18,33 @@
</div>
</div>

<div class="mb-3" *ngIf="task.partner === null">
<label for="partner" class="form-label">{{ 'form.partner' | translate }}:</label>
<input type="text" class="form-control" id="partner" [ngbTypeahead]="searchPartners" [inputFormatter]="formatter"
[resultFormatter]="formatter" [value]="taskForm.get('partnerName')?.value" [editable]="false" (selectItem)="onPartnerSelect($event)"/>
<input type="hidden" formControlName="partner"/>
<div class="mb-3">
<label for="productIri" class="form-label">{{ 'form.product' | translate }}:</label>
<app-search-select #productSearchSelect id="productIri"
[formId]="'productIri'"
[formLabelLangKey]="'form.product'"
[documentForm]="taskForm"
[getDataFunction]="getProducts"
[dataSource]="dataSourceProducts"
[searchSelectColDefs]="colDefProducts"
>
<input type="hidden" formControlName="productIri" value="{{task.productIri}}"/>
</app-search-select>
</div>


<div class="mb-3">
<label for="assignedTo" class="form-label">{{ 'form.assign-to' | translate }}:</label>
<input type="text" class="form-control" id="assignedTo" [ngbTypeahead]="searchUsers" [inputFormatter]="formatter"
[resultFormatter]="formatter" [value]="taskForm.get('assignedToName')?.value" [editable]="false" (selectItem)="onAssignedToSelect($event)"/>
<input type="hidden" formControlName="assignedTo"/>
<label for="assignedToIri" class="form-label">{{ 'form.assign-to' | translate }}:</label>
<app-search-select #userSearchSelect id="assignedToIri"
[formId]="'assignedToIri'"
[formLabelLangKey]="'form.user'"
[documentForm]="taskForm"
[getDataFunction]="getUsers"
[dataSource]="dataSourceUsers"
[searchSelectColDefs]="colDefUsers"
>
<input type="hidden" formControlName="assignedToIri" value="{{task.productIri}}"/>
</app-search-select>
<div class="form-text" *ngIf="taskForm.get('assignedTo')?.invalid && taskForm.get('assignedTo')?.touched">
{{ 'form.assign-to' | translate }} {{ 'form.mandatory' | translate }}.
</div>


+ 79
- 3
matsen-tool/src/app/_views/tasks/new-task/new-task.component.ts Vedi File

@@ -1,5 +1,13 @@
import {Component, EventEmitter, Input, OnInit, Output} from '@angular/core';
import {PartnerService, TaskJsonld, TaskService, UserJsonld, UserService} from "@app/core/api/v1";
import {AfterViewInit, Component, EventEmitter, Input, OnInit, Output, ViewChild} from '@angular/core';
import {
PartnerService,
ProductJsonld,
ProductService,
TaskJsonld,
TaskService,
UserJsonld,
UserService
} from "@app/core/api/v1";
import {ModalStatus} from "@app/_helpers/modal.states";
import {FormGroupInitializer} from "@app/_helpers/formgroup.initializer";
import {FormGroup} from "@angular/forms";
@@ -7,37 +15,105 @@ import {debounceTime, distinctUntilChanged, Observable, OperatorFunction, Subscr
import {taskForm} from "@app/_forms/apiForms";
import {AppHelperService} from "@app/_helpers/app-helper.service";
import {filter, map} from "rxjs/operators";
import {MatTableDataSource} from "@angular/material/table";
import {SearchSelectComponent} from "@app/_components/search-select/search-select.component";
import {SearchInputColDef} from "@app/_components/search-input/search-input-col-def";

@Component({
selector: 'app-new-task',
templateUrl: './new-task.component.html',
styleUrl: './new-task.component.scss'
})
export class NewTaskComponent implements OnInit {
export class NewTaskComponent implements OnInit, AfterViewInit {
@Input() public task!: TaskJsonld;
@Output() public submit: EventEmitter<ModalStatus> = new EventEmitter<ModalStatus>();
@ViewChild('userSearchSelect', { static: false }) userSearchSelect!: SearchSelectComponent;
@ViewChild('productSearchSelect', { static: false }) productSearchSelect!: SearchSelectComponent;

protected taskForm: FormGroup;
protected taskSub: Subscription;
protected dueAtValue: string;

protected users: Array<UserJsonld>;
protected dataSourceUsers;

protected products: Array<ProductJsonld>;
protected dataSourceProducts;

protected colDefUsers: SearchInputColDef[];
protected colDefProducts: SearchInputColDef[];

protected formatter = (apiData: any) => apiData.name;

constructor(
private taskService: TaskService,
private userService: UserService,
private partnerService: PartnerService,
protected productService: ProductService,
protected appHelperService: AppHelperService
) {
this.users = [];
this.dataSourceUsers = new MatTableDataSource<UserJsonld>(this.users);
this.products = [];
this.dataSourceProducts = new MatTableDataSource<ProductJsonld>(this.products);
this.taskForm = taskForm;
this.taskSub = new Subscription();
this.dueAtValue = "";

this.colDefUsers = [
SearchSelectComponent.createColDef('pos', 'overview.number', SearchSelectComponent.COLUMN_TYPE_POSITION),
SearchSelectComponent.createColDef('img', 'overview.image', SearchSelectComponent.COLUMN_TYPE_IMAGE, 'imageUrl'),
SearchSelectComponent.createColDef('name', 'form.name', SearchSelectComponent.COLUMN_TYPE_TEXT, 'fullName'),
];
this.colDefProducts = [
SearchSelectComponent.createColDef('pos', 'overview.number', SearchSelectComponent.COLUMN_TYPE_POSITION),
SearchSelectComponent.createColDef('img', 'overview.image', SearchSelectComponent.COLUMN_TYPE_IMAGE, 'imageUrl'),
SearchSelectComponent.createColDef('name', 'form.product', SearchSelectComponent.COLUMN_TYPE_TEXT, 'name'),
];
}

ngOnInit(): void {
this.taskForm = FormGroupInitializer.initFormGroup(this.taskForm, this.task);
}

ngAfterViewInit(): void {
this.userSearchSelect.getData();
this.productSearchSelect.getData();
}

getUsers = (term?: string): void => {
this.userService.usersGetCollection(1, 50, undefined, term)
this.userService.usersGetCollection(
this.userSearchSelect.pagingComponent.getPageIndex(),
this.userSearchSelect.pagingComponent.getPageSize(),
undefined,
undefined,
term
).subscribe(
data => {
this.users = data['hydra:member'];
this.dataSourceUsers = new MatTableDataSource<UserJsonld>(this.users);
this.userSearchSelect.setData(this.dataSourceUsers, this.users, Number(data["hydra:totalItems"]));
}
)
}

getProducts = (term?: string): void => {
// NOTE: all products that are not assigned to partner yet
this.productService.productsGetCollection(
this.productSearchSelect.pagingComponent.getPageIndex(),
this.productSearchSelect.pagingComponent.getPageSize(),
term
).subscribe(
data => {
this.products = data['hydra:member'];
this.dataSourceProducts = new MatTableDataSource<ProductJsonld>(this.products);
this.productSearchSelect.setData(this.dataSourceProducts, this.products, Number(data["hydra:totalItems"]));
}
);
}


protected searchUsers: OperatorFunction<string, readonly { id: any; name: any }[]> = (text$: Observable<string>) =>
text$.pipe(
debounceTime(200),


+ 1
- 1
matsen-tool/src/app/_views/tasks/task-list/task-list.component.html Vedi File

@@ -111,7 +111,7 @@
</div>
<span *ngIf="taskNote.owner === currentUser?.id" class="position-absolute bi bi-pencil p-2"
data-type="user-tool" data-action="edit"
(click)="openModalEditTaskNote(taskNote)"></span>
(click)="openModalEditTaskNote(taskNote, task)"></span>
</div>
</div>
</div>


+ 7
- 3
matsen-tool/src/app/_views/tasks/task-list/task-list.component.ts Vedi File

@@ -153,11 +153,15 @@ export class TaskListComponent implements OnInit, AfterViewInit {
openModalNewTaskNote(task: TaskJsonld) {
let taskNote: TaskNoteJsonld = {} as TaskNoteJsonld;
taskNote.taskIri = task.id ?? null;
this.appHelperService.openModal(NewTaskNoteComponent, { 'taskNote': taskNote }, this.afterCommentCreation, task.id);
this.appHelperService.openModal(
NewTaskNoteComponent, { 'taskNote': taskNote, 'task': task }, this.afterCommentCreation, task.id
);
}

openModalEditTaskNote(taskNote: TaskNoteJsonld) {
this.appHelperService.openModal(NewTaskNoteComponent, { 'taskNote': taskNote }, this.afterCommentCreation, taskNote.id);
openModalEditTaskNote(taskNote: TaskNoteJsonld, task: TaskJsonld) {
this.appHelperService.openModal(
NewTaskNoteComponent, { 'taskNote': taskNote, 'task': task }, this.afterCommentCreation, taskNote.id
);
}

switchTaskCompactMode() {


+ 2
- 0
matsen-tool/src/app/app.module.ts Vedi File

@@ -64,6 +64,7 @@ import { UserListComponent } from './_views/user/user-list/user-list.component';
import { AssignProductComponent } from './_views/products/assign-product/assign-product.component';
import { LinkedLabelComponent } from './_components/linked-label/linked-label.component';
import {LoadingInterceptor} from "@app/_helpers/loading-interceptor.service";
import { SearchSelectComponent } from './_components/search-select/search-select.component';


export function apiConfigFactory(): Configuration {
@@ -150,6 +151,7 @@ export function HttpLoaderFactory(http: HttpClient) {
UserListComponent,
AssignProductComponent,
LinkedLabelComponent,
SearchSelectComponent,
],
providers: [
{provide: HTTP_INTERCEPTORS, useClass: JwtInterceptor, multi: true},


+ 9
- 4
matsen-tool/src/app/core/api/v1/api/contact.service.ts Vedi File

@@ -106,13 +106,14 @@ export class ContactService {
* @param itemsPerPage The number of items per page
* @param partner
* @param partner2
* @param nameSearch
* @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
* @param reportProgress flag to report request and response progress.
*/
public contactsGetCollection(page?: number, itemsPerPage?: number, partner?: string, partner2?: Array<string>, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/ld+json' | 'application/json' | 'text/html' | 'application/hal+json', context?: HttpContext, transferCache?: boolean}): Observable<ApiContactsGetCollection200Response>;
public contactsGetCollection(page?: number, itemsPerPage?: number, partner?: string, partner2?: Array<string>, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/ld+json' | 'application/json' | 'text/html' | 'application/hal+json', context?: HttpContext, transferCache?: boolean}): Observable<HttpResponse<ApiContactsGetCollection200Response>>;
public contactsGetCollection(page?: number, itemsPerPage?: number, partner?: string, partner2?: Array<string>, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/ld+json' | 'application/json' | 'text/html' | 'application/hal+json', context?: HttpContext, transferCache?: boolean}): Observable<HttpEvent<ApiContactsGetCollection200Response>>;
public contactsGetCollection(page?: number, itemsPerPage?: number, partner?: string, partner2?: Array<string>, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/ld+json' | 'application/json' | 'text/html' | 'application/hal+json', context?: HttpContext, transferCache?: boolean}): Observable<any> {
public contactsGetCollection(page?: number, itemsPerPage?: number, partner?: string, partner2?: Array<string>, nameSearch?: string, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/ld+json' | 'application/json' | 'text/html' | 'application/hal+json', context?: HttpContext, transferCache?: boolean}): Observable<ApiContactsGetCollection200Response>;
public contactsGetCollection(page?: number, itemsPerPage?: number, partner?: string, partner2?: Array<string>, nameSearch?: string, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/ld+json' | 'application/json' | 'text/html' | 'application/hal+json', context?: HttpContext, transferCache?: boolean}): Observable<HttpResponse<ApiContactsGetCollection200Response>>;
public contactsGetCollection(page?: number, itemsPerPage?: number, partner?: string, partner2?: Array<string>, nameSearch?: string, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/ld+json' | 'application/json' | 'text/html' | 'application/hal+json', context?: HttpContext, transferCache?: boolean}): Observable<HttpEvent<ApiContactsGetCollection200Response>>;
public contactsGetCollection(page?: number, itemsPerPage?: number, partner?: string, partner2?: Array<string>, nameSearch?: string, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/ld+json' | 'application/json' | 'text/html' | 'application/hal+json', context?: HttpContext, transferCache?: boolean}): Observable<any> {

let localVarQueryParameters = new HttpParams({encoder: this.encoder});
if (page !== undefined && page !== null) {
@@ -133,6 +134,10 @@ export class ContactService {
<any>element, 'partner[]');
})
}
if (nameSearch !== undefined && nameSearch !== null) {
localVarQueryParameters = this.addToHttpParams(localVarQueryParameters,
<any>nameSearch, 'nameSearch');
}

let localVarHeaders = this.defaultHeaders;



+ 9
- 4
matsen-tool/src/app/core/api/v1/api/partnerProduct.service.ts Vedi File

@@ -112,13 +112,14 @@ export class PartnerProductService {
* @param productName
* @param partnerType
* @param partnerType2
* @param productPartnerUnassigned
* @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
* @param reportProgress flag to report request and response progress.
*/
public partnerProductsGetCollection(page?: number, itemsPerPage?: number, partner?: string, partner2?: Array<string>, partnerName?: string, product?: string, product2?: Array<string>, productName?: string, partnerType?: string, partnerType2?: Array<string>, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/ld+json' | 'application/json' | 'text/html' | 'application/hal+json', context?: HttpContext, transferCache?: boolean}): Observable<ApiPartnerProductsGetCollection200Response>;
public partnerProductsGetCollection(page?: number, itemsPerPage?: number, partner?: string, partner2?: Array<string>, partnerName?: string, product?: string, product2?: Array<string>, productName?: string, partnerType?: string, partnerType2?: Array<string>, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/ld+json' | 'application/json' | 'text/html' | 'application/hal+json', context?: HttpContext, transferCache?: boolean}): Observable<HttpResponse<ApiPartnerProductsGetCollection200Response>>;
public partnerProductsGetCollection(page?: number, itemsPerPage?: number, partner?: string, partner2?: Array<string>, partnerName?: string, product?: string, product2?: Array<string>, productName?: string, partnerType?: string, partnerType2?: Array<string>, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/ld+json' | 'application/json' | 'text/html' | 'application/hal+json', context?: HttpContext, transferCache?: boolean}): Observable<HttpEvent<ApiPartnerProductsGetCollection200Response>>;
public partnerProductsGetCollection(page?: number, itemsPerPage?: number, partner?: string, partner2?: Array<string>, partnerName?: string, product?: string, product2?: Array<string>, productName?: string, partnerType?: string, partnerType2?: Array<string>, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/ld+json' | 'application/json' | 'text/html' | 'application/hal+json', context?: HttpContext, transferCache?: boolean}): Observable<any> {
public partnerProductsGetCollection(page?: number, itemsPerPage?: number, partner?: string, partner2?: Array<string>, partnerName?: string, product?: string, product2?: Array<string>, productName?: string, partnerType?: string, partnerType2?: Array<string>, productPartnerUnassigned?: string, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/ld+json' | 'application/json' | 'text/html' | 'application/hal+json', context?: HttpContext, transferCache?: boolean}): Observable<ApiPartnerProductsGetCollection200Response>;
public partnerProductsGetCollection(page?: number, itemsPerPage?: number, partner?: string, partner2?: Array<string>, partnerName?: string, product?: string, product2?: Array<string>, productName?: string, partnerType?: string, partnerType2?: Array<string>, productPartnerUnassigned?: string, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/ld+json' | 'application/json' | 'text/html' | 'application/hal+json', context?: HttpContext, transferCache?: boolean}): Observable<HttpResponse<ApiPartnerProductsGetCollection200Response>>;
public partnerProductsGetCollection(page?: number, itemsPerPage?: number, partner?: string, partner2?: Array<string>, partnerName?: string, product?: string, product2?: Array<string>, productName?: string, partnerType?: string, partnerType2?: Array<string>, productPartnerUnassigned?: string, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/ld+json' | 'application/json' | 'text/html' | 'application/hal+json', context?: HttpContext, transferCache?: boolean}): Observable<HttpEvent<ApiPartnerProductsGetCollection200Response>>;
public partnerProductsGetCollection(page?: number, itemsPerPage?: number, partner?: string, partner2?: Array<string>, partnerName?: string, product?: string, product2?: Array<string>, productName?: string, partnerType?: string, partnerType2?: Array<string>, productPartnerUnassigned?: string, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/ld+json' | 'application/json' | 'text/html' | 'application/hal+json', context?: HttpContext, transferCache?: boolean}): Observable<any> {

let localVarQueryParameters = new HttpParams({encoder: this.encoder});
if (page !== undefined && page !== null) {
@@ -167,6 +168,10 @@ export class PartnerProductService {
<any>element, 'partner.type[]');
})
}
if (productPartnerUnassigned !== undefined && productPartnerUnassigned !== null) {
localVarQueryParameters = this.addToHttpParams(localVarQueryParameters,
<any>productPartnerUnassigned, 'productPartnerUnassigned');
}

let localVarHeaders = this.defaultHeaders;



+ 9
- 4
matsen-tool/src/app/core/api/v1/api/product.service.ts Vedi File

@@ -105,14 +105,15 @@ export class ProductService {
* @param page The collection page number
* @param itemsPerPage The number of items per page
* @param name
* @param partnerIdUnassigned
* @param orderName
* @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
* @param reportProgress flag to report request and response progress.
*/
public productsGetCollection(page?: number, itemsPerPage?: number, name?: string, orderName?: 'asc' | 'desc', observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/ld+json' | 'application/json' | 'text/html' | 'application/hal+json', context?: HttpContext, transferCache?: boolean}): Observable<ApiProductsGetCollection200Response>;
public productsGetCollection(page?: number, itemsPerPage?: number, name?: string, orderName?: 'asc' | 'desc', observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/ld+json' | 'application/json' | 'text/html' | 'application/hal+json', context?: HttpContext, transferCache?: boolean}): Observable<HttpResponse<ApiProductsGetCollection200Response>>;
public productsGetCollection(page?: number, itemsPerPage?: number, name?: string, orderName?: 'asc' | 'desc', observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/ld+json' | 'application/json' | 'text/html' | 'application/hal+json', context?: HttpContext, transferCache?: boolean}): Observable<HttpEvent<ApiProductsGetCollection200Response>>;
public productsGetCollection(page?: number, itemsPerPage?: number, name?: string, orderName?: 'asc' | 'desc', observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/ld+json' | 'application/json' | 'text/html' | 'application/hal+json', context?: HttpContext, transferCache?: boolean}): Observable<any> {
public productsGetCollection(page?: number, itemsPerPage?: number, name?: string, partnerIdUnassigned?: string, orderName?: 'asc' | 'desc', observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/ld+json' | 'application/json' | 'text/html' | 'application/hal+json', context?: HttpContext, transferCache?: boolean}): Observable<ApiProductsGetCollection200Response>;
public productsGetCollection(page?: number, itemsPerPage?: number, name?: string, partnerIdUnassigned?: string, orderName?: 'asc' | 'desc', observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/ld+json' | 'application/json' | 'text/html' | 'application/hal+json', context?: HttpContext, transferCache?: boolean}): Observable<HttpResponse<ApiProductsGetCollection200Response>>;
public productsGetCollection(page?: number, itemsPerPage?: number, name?: string, partnerIdUnassigned?: string, orderName?: 'asc' | 'desc', observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/ld+json' | 'application/json' | 'text/html' | 'application/hal+json', context?: HttpContext, transferCache?: boolean}): Observable<HttpEvent<ApiProductsGetCollection200Response>>;
public productsGetCollection(page?: number, itemsPerPage?: number, name?: string, partnerIdUnassigned?: string, orderName?: 'asc' | 'desc', observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/ld+json' | 'application/json' | 'text/html' | 'application/hal+json', context?: HttpContext, transferCache?: boolean}): Observable<any> {

let localVarQueryParameters = new HttpParams({encoder: this.encoder});
if (page !== undefined && page !== null) {
@@ -127,6 +128,10 @@ export class ProductService {
localVarQueryParameters = this.addToHttpParams(localVarQueryParameters,
<any>name, 'name');
}
if (partnerIdUnassigned !== undefined && partnerIdUnassigned !== null) {
localVarQueryParameters = this.addToHttpParams(localVarQueryParameters,
<any>partnerIdUnassigned, 'partnerIdUnassigned');
}
if (orderName !== undefined && orderName !== null) {
localVarQueryParameters = this.addToHttpParams(localVarQueryParameters,
<any>orderName, 'order[name]');


+ 9
- 4
matsen-tool/src/app/core/api/v1/api/user.service.ts Vedi File

@@ -106,13 +106,14 @@ export class UserService {
* @param itemsPerPage The number of items per page
* @param firstName
* @param lastName
* @param nameSearch
* @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
* @param reportProgress flag to report request and response progress.
*/
public usersGetCollection(page?: number, itemsPerPage?: number, firstName?: string, lastName?: string, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/ld+json' | 'application/json' | 'text/html' | 'application/hal+json', context?: HttpContext, transferCache?: boolean}): Observable<ApiUsersGetCollection200Response>;
public usersGetCollection(page?: number, itemsPerPage?: number, firstName?: string, lastName?: string, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/ld+json' | 'application/json' | 'text/html' | 'application/hal+json', context?: HttpContext, transferCache?: boolean}): Observable<HttpResponse<ApiUsersGetCollection200Response>>;
public usersGetCollection(page?: number, itemsPerPage?: number, firstName?: string, lastName?: string, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/ld+json' | 'application/json' | 'text/html' | 'application/hal+json', context?: HttpContext, transferCache?: boolean}): Observable<HttpEvent<ApiUsersGetCollection200Response>>;
public usersGetCollection(page?: number, itemsPerPage?: number, firstName?: string, lastName?: string, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/ld+json' | 'application/json' | 'text/html' | 'application/hal+json', context?: HttpContext, transferCache?: boolean}): Observable<any> {
public usersGetCollection(page?: number, itemsPerPage?: number, firstName?: string, lastName?: string, nameSearch?: string, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/ld+json' | 'application/json' | 'text/html' | 'application/hal+json', context?: HttpContext, transferCache?: boolean}): Observable<ApiUsersGetCollection200Response>;
public usersGetCollection(page?: number, itemsPerPage?: number, firstName?: string, lastName?: string, nameSearch?: string, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/ld+json' | 'application/json' | 'text/html' | 'application/hal+json', context?: HttpContext, transferCache?: boolean}): Observable<HttpResponse<ApiUsersGetCollection200Response>>;
public usersGetCollection(page?: number, itemsPerPage?: number, firstName?: string, lastName?: string, nameSearch?: string, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/ld+json' | 'application/json' | 'text/html' | 'application/hal+json', context?: HttpContext, transferCache?: boolean}): Observable<HttpEvent<ApiUsersGetCollection200Response>>;
public usersGetCollection(page?: number, itemsPerPage?: number, firstName?: string, lastName?: string, nameSearch?: string, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/ld+json' | 'application/json' | 'text/html' | 'application/hal+json', context?: HttpContext, transferCache?: boolean}): Observable<any> {

let localVarQueryParameters = new HttpParams({encoder: this.encoder});
if (page !== undefined && page !== null) {
@@ -131,6 +132,10 @@ export class UserService {
localVarQueryParameters = this.addToHttpParams(localVarQueryParameters,
<any>lastName, 'lastName');
}
if (nameSearch !== undefined && nameSearch !== null) {
localVarQueryParameters = this.addToHttpParams(localVarQueryParameters,
<any>nameSearch, 'nameSearch');
}

let localVarHeaders = this.defaultHeaders;



+ 6
- 0
matsen-tool/src/app/core/api/v1/model/taskNote.ts Vedi File

@@ -10,6 +10,7 @@
* Do not edit the class manually.
*/
import { User } from './user';
import { Contact } from './contact';


/**
@@ -22,6 +23,11 @@ export interface TaskNote {
*/
readonly owner?: User;
taskIri: string | null;
/**
* ?ContactApi
*/
readonly contact?: Contact;
contactIri?: string | null;
contactType: TaskNote.ContactTypeEnum;
readonly createdAt?: string | null;
}


+ 6
- 0
matsen-tool/src/app/core/api/v1/model/taskNoteJsonhal.ts Vedi File

@@ -10,6 +10,7 @@
* Do not edit the class manually.
*/
import { CommentJsonhalLinks } from './commentJsonhalLinks';
import { ContactJsonhal } from './contactJsonhal';
import { UserJsonhal } from './userJsonhal';


@@ -24,6 +25,11 @@ export interface TaskNoteJsonhal {
*/
readonly owner?: UserJsonhal;
taskIri: string | null;
/**
* ?ContactApi
*/
readonly contact?: ContactJsonhal;
contactIri?: string | null;
contactType: TaskNoteJsonhal.ContactTypeEnum;
readonly createdAt?: string | null;
}


+ 6
- 0
matsen-tool/src/app/core/api/v1/model/taskNoteJsonld.ts Vedi File

@@ -9,6 +9,7 @@
* https://openapi-generator.tech
* Do not edit the class manually.
*/
import { ContactJsonld } from './contactJsonld';
import { UserJsonld } from './userJsonld';
import { CommentJsonldContext } from './commentJsonldContext';

@@ -26,6 +27,11 @@ export interface TaskNoteJsonld {
*/
readonly owner?: UserJsonld;
taskIri: string | null;
/**
* ?ContactApi
*/
readonly contact?: ContactJsonld;
contactIri?: string | null;
contactType: TaskNoteJsonld.ContactTypeEnum;
readonly createdAt?: string | null;
}


+ 3
- 1
matsen-tool/src/assets/i18n/de.json Vedi File

@@ -130,7 +130,9 @@
"send": "Speichern",
"search-placeholder": "Suche",
"no-data": "Keine Datensätze gefunden.",
"contact-type": "Kontaktart"
"contact-type": "Kontaktart",
"user": "Benutzer",
"contact": "Kontakt"
},
"sales":
{


Caricamento…
Annulla
Salva