Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • dlcm/ui/dlcm-portal
1 result
Show changes
Commits on Source (15)
Showing
with 188 additions and 109 deletions
......@@ -11256,9 +11256,9 @@
}
},
"solidify-frontend": {
"version": "0.2.16",
"resolved": "https://packages.dlcm.ch/repository/npm-group/solidify-frontend/-/solidify-frontend-0.2.16.tgz",
"integrity": "sha512-l6kU7zZ9CEWsWfpsLbccoQTGqhz4qiq5v9SUx9u8nN0kRy2nWdnY1pgbs8XXplJrcuW2DhsxDy4QatDTPlQliQ==",
"version": "0.2.18",
"resolved": "https://packages.dlcm.ch/repository/npm-group/solidify-frontend/-/solidify-frontend-0.2.18.tgz",
"integrity": "sha512-sDIi/qVLM54slKps/k6YHN2jqrDZ5V+Nuc0pCy28FRA3FtZxgtqnyK4l62lM19V/sdrxzcRk5ql3la/xKl8vZw==",
"requires": {
"tslib": "^1.9.0"
}
......
......@@ -28,7 +28,7 @@
"generate-version": "ts-node --project tsconfig-ts-node.json git.version.ts",
"generate-models": "(rm src/app/generated-api -fr || echo generated-api directory is absent) && openapi-generator generate -Dmodels -DsupportingFiles -i src/assets/openapi/DLCM-APIs.json -g typescript-angular -o src/app/generated-api --additional-properties=\"ngVersion=7.2.0,providedInRoot=true,modelSuffix=,modelFileSuffix=.model,fileNaming=kebab-case,prependFormOrBodyParameters=true,modelPropertyNaming=original\" --skip-validate-spec && npm run clean-after-models-generation",
"clean-after-models-generation": "cd src/app/generated-api && rm -fr .openapi-generator .gitignore .openapi-generator-ignore git_push.sh api api.module.ts configuration.ts encoder.ts index.ts variables.ts README.md && cp ../../assets/openapi/index-ts-to-copy.txt index.ts && cp ../../assets/openapi/README-txt-to-copy.txt README.txt",
"build:sourcemaps": "ng build --prod --sourceMap --base-href /",
"build:sourcemaps": "node --max_old_space_size=8192 node_modules/@angular/cli/bin/ng build --prod --sourceMap --base-href /",
"serve:prod": "cd dist/DLCM-Frontend && ws --spa index.html --rewrite \"/api/rss -> https://www.unige.ch/feed/rss\" -p 4200",
"simulate-prod-local": "rm -fr dist && cd ../Solidify-Frontend/ && npm run build-dlcm:nowatch && cd ../DLCM-Portal/ && npm run build:sourcemaps && cp src/assets/configurations/environment.devserver.json dist/DLCM-Frontend/assets/configurations/environment.runtime.json && npm run serve:prod",
"refresh-ngsw-config": "ngsw-config dist/DLCM-Frontend ngsw-config.json"
......@@ -70,7 +70,7 @@
"primeicons": "2.0.0",
"primeng": "8.0.4",
"rxjs": "6.5.3",
"solidify-frontend": "0.2.16",
"solidify-frontend": "0.2.18",
"sync-pom-version-to-package": "1.3.1",
"ts-key-enum": "2.0.0",
"tslib": "1.10.0",
......
......@@ -91,6 +91,7 @@ const dialogs = [
const appInitializerFn = (appConfig: AppConfigService) => () => appConfig.mergeConfig(environment).toPromise();
export const WINDOW = "windowObject";
export const infiniteNumber: number = 999999999;
export function createDefaultStorage(): Storage | null {
return environment.tokenInMemoryStorage ? new InMemoryStorage() : (typeof sessionStorage !== "undefined" ? sessionStorage : null);
......
......@@ -44,13 +44,6 @@ export class AdminHomeRoutable extends SharedAbstractPresentational {
path: RoutesEnum.adminPreservationPolicy,
isVisible: () => true,
},
{
avatarIcon: "copyright",
titleToTranslate: TRANSLATE("admin.license.home.title"),
subtitleToTranslate: TRANSLATE("admin.license.home.subtitle"),
path: RoutesEnum.adminLicense,
isVisible: () => true,
},
{
avatarIcon: "cart-arrow-down",
titleToTranslate: TRANSLATE("admin.disseminationPolicy.home.title"),
......@@ -58,6 +51,13 @@ export class AdminHomeRoutable extends SharedAbstractPresentational {
path: RoutesEnum.adminDisseminationPolicy,
isVisible: () => true,
},
{
avatarIcon: "copyright",
titleToTranslate: TRANSLATE("admin.license.home.title"),
subtitleToTranslate: TRANSLATE("admin.license.home.subtitle"),
path: RoutesEnum.adminLicense,
isVisible: () => true,
},
{
avatarIcon: "university",
titleToTranslate: TRANSLATE("admin.institution.home.title"),
......
......@@ -5,11 +5,13 @@ import {
} from "@admin/dissemination-policy/stores/admin-dissemination-policy.state";
import {
ChangeDetectionStrategy,
ChangeDetectorRef,
Component,
ViewChild,
} from "@angular/core";
import {DisseminationPolicy} from "@app/generated-api";
import {
Actions,
Select,
Store,
} from "@ngxs/store";
......@@ -31,7 +33,9 @@ export class AdminDisseminationPolicyCreateRoutable extends SharedAbstractCreate
@ViewChild("formPresentational", {static: false})
readonly formPresentational: SharedAbstractFormPresentational<DisseminationPolicy>;
constructor(protected store: Store) {
super(store, LocalStateEnum.admin_disseminationPolicy, adminDisseminationPolicyActionNameSpace, LocalStateEnum.admin);
constructor(protected readonly _store: Store,
protected readonly _actions$: Actions,
protected readonly _changeDetector: ChangeDetectorRef) {
super(_store, _actions$, _changeDetector, LocalStateEnum.admin_disseminationPolicy, adminDisseminationPolicyActionNameSpace, LocalStateEnum.admin);
}
}
......@@ -30,14 +30,14 @@ export class AdminDisseminationPolicyDetailEditRoutable extends SharedAbstractDe
@Select(AdminDisseminationPolicyState.isLoadingWithDependency) isLoadingWithDependencyObs: Observable<boolean>;
@Select(AdminDisseminationPolicyState.isReadyToBeDisplayed) isReadyToBeDisplayedObs: Observable<boolean>;
readonly KEY_PARAM_NAME: string = "name";
readonly KEY_PARAM_NAME: keyof DisseminationPolicy & string = "name";
constructor(protected _store: Store,
protected route: ActivatedRoute,
protected _route: ActivatedRoute,
protected readonly _actions$: Actions,
protected readonly _changeDetector: ChangeDetectorRef,
public dialog: MatDialog) {
super(_store, route, _actions$, _changeDetector, dialog, LocalStateEnum.admin_disseminationPolicy, adminDisseminationPolicyActionNameSpace, LocalStateEnum.admin);
public _dialog: MatDialog) {
super(_store, _route, _actions$, _changeDetector, _dialog, LocalStateEnum.admin_disseminationPolicy, adminDisseminationPolicyActionNameSpace, LocalStateEnum.admin);
}
getSubResourceWithParentId(id: string): void {
......
......@@ -5,9 +5,13 @@ import {
ChangeDetectorRef,
Component,
} from "@angular/core";
import {MatDialog} from "@angular/material/dialog";
import {ActivatedRoute} from "@angular/router";
import {DisseminationPolicy} from "@app/generated-api";
import {Store} from "@ngxs/store";
import {
Actions,
Store,
} from "@ngxs/store";
import {SharedAbstractListRoutable} from "@shared/components/routables/shared-abstract-list/shared-abstract-list.routable";
import {FieldTypeEnum} from "@shared/enums/field-type.enum";
import {LocalStateEnum} from "@shared/enums/local-state.enum";
......@@ -26,11 +30,22 @@ export class AdminDisseminationPolicyListRoutable extends SharedAbstractListRout
readonly KEY_CREATE_BUTTON: string = TRANSLATE("admin.disseminationPolicy.button.new");
readonly KEY_REFRESH_BUTTON: string = TRANSLATE("admin.disseminationPolicy.button.refresh");
readonly KEY_BACK_BUTTON: string | undefined = TRANSLATE("admin.button.goBackToAdminHome");
readonly KEY_PARAM_NAME: keyof DisseminationPolicy & string = "name";
constructor(protected readonly _store: Store,
protected readonly _changeDetector: ChangeDetectorRef,
protected readonly _route: ActivatedRoute,
protected readonly _actions$: Actions,
protected readonly _dialog: MatDialog) {
super(_store, _changeDetector, _route, _actions$, _dialog, LocalStateEnum.admin_disseminationPolicy, adminDisseminationPolicyActionNameSpace, {}, LocalStateEnum.admin);
}
conditionDisplayEditButton(model: DisseminationPolicy | undefined): boolean {
return true;
}
constructor(protected store: Store,
protected _changeDetector: ChangeDetectorRef,
protected _route: ActivatedRoute) {
super(store, _changeDetector, _route, LocalStateEnum.admin_disseminationPolicy, adminDisseminationPolicyActionNameSpace, {}, LocalStateEnum.admin);
conditionDisplayDeleteButton(model: DisseminationPolicy | undefined): boolean {
return true;
}
defineColumns(): void {
......
<form [formGroup]="form"
(ngSubmit)="onSubmit()"
>
<mat-form-field>
<mat-form-field *ngIf="getFormControl(formDefinition.acronym) as fd">
<mat-label>{{'admin.funding-agencies.form.acronym' | translate}}</mat-label>
<input matInput
[formControlName]="formDefinition.acronym"
[required]="isRequired(formDefinition.acronym)"
[solidifyValidation]="errors"
[formControl]="fd"
[required]="formValidationHelper.hasRequiredField(fd)"
>
<mat-error *ngIf="getFormControl(formDefinition.acronym).invalid">{{'required' | translate}}</mat-error>
<mat-error
*ngFor="let error of getFormControl(formDefinition.acronym).errors?.errorsFromBackend"
>{{error}}</mat-error>
<mat-error #errors></mat-error>
</mat-form-field>
<mat-form-field>
<mat-form-field *ngIf="getFormControl(formDefinition.name) as fd">
<mat-label>{{'admin.funding-agencies.form.name' | translate}}</mat-label>
<input matInput
[formControlName]="formDefinition.name"
[required]="isRequired(formDefinition.name)"
[solidifyValidation]="errors"
[formControl]="fd"
[required]="formValidationHelper.hasRequiredField(fd)"
(blur)="checkAvailable(formDefinition.name, fd)"
>
<mat-error *ngIf="getFormControl(formDefinition.name).invalid">{{'required' | translate}}</mat-error>
<mat-error *ngFor="let error of getFormControl(formDefinition.name).errors?.errorsFromBackend">{{error}}</mat-error>
<mat-error #errors></mat-error>
</mat-form-field>
<mat-form-field>
<mat-form-field *ngIf="getFormControl(formDefinition.url) as fd">
<mat-label>{{'admin.funding-agencies.form.url' | translate}}</mat-label>
<input matInput
[formControlName]="formDefinition.url"
[solidifyValidation]="errors"
[formControl]="fd"
[required]="formValidationHelper.hasRequiredField(fd)"
>
<mat-error
*ngFor="let error of getFormControl(formDefinition.url).errors?.errorsFromBackend"
>{{error}}</mat-error>
<mat-error #errors></mat-error>
</mat-form-field>
<mat-form-field>
<mat-form-field *ngIf="getFormControl(formDefinition.description) as fd">
<mat-label>{{'admin.funding-agencies.form.description' | translate}}</mat-label>
<textarea matInput
[formControlName]="formDefinition.description"
[solidifyValidation]="errors"
[formControl]="fd"
[required]="formValidationHelper.hasRequiredField(fd)"
></textarea>
<mat-error
*ngFor="let error of getFormControl(formDefinition.description).errors?.errorsFromBackend"
>{{error}}</mat-error>
<mat-error #errors></mat-error>
</mat-form-field>
<dlcm-shared-multi-select [list]="listOrgUnits"
......
......@@ -5,6 +5,7 @@
*ngIf="isReadyToBeDisplayedInCreateModeObs | async"
[listOrgUnits]="listOrgUnitsObs | async"
(submitChange)="create($event)"
(checkAvailableChange)="checkAvailable($event)"
(dirtyChange)="updateCanDeactivate($event)"
>
</dlcm-admin-funding-agencies-form>
......
......@@ -5,10 +5,12 @@ import {
} from "@admin/funding-agencies/stores/admin-funding-agencies.state";
import {
ChangeDetectionStrategy,
ChangeDetectorRef,
Component,
} from "@angular/core";
import {FundingAgency} from "@app/generated-api";
import {
Actions,
Select,
Store,
} from "@ngxs/store";
......@@ -29,8 +31,10 @@ export class AdminFundingAgenciesCreateRoutable extends SharedAbstractCreateRout
@Select(AdminFundingAgenciesState.isReadyToBeDisplayedInCreateMode) isReadyToBeDisplayedInCreateModeObs: Observable<boolean>;
@Select((state: LocalStateModel) => state.shared.shared_organizationalUnit.list) listOrgUnitsObs: Observable<OrganizationalUnitExtended[]>;
constructor(protected store: Store) {
super(store, LocalStateEnum.admin_fundingAgencies, adminFundingAgenciesActionNameSpace, LocalStateEnum.admin);
constructor(protected readonly _store: Store,
protected readonly _actions$: Actions,
protected readonly _changeDetector: ChangeDetectorRef) {
super(_store, _actions$, _changeDetector, LocalStateEnum.admin_fundingAgencies, adminFundingAgenciesActionNameSpace, LocalStateEnum.admin);
}
}
......@@ -17,6 +17,7 @@
[listOrgUnits]="listOrgUnitsObs | async"
[readonly]="!isEdit"
(submitChange)="update($event)"
(checkAvailableChange)="checkAvailable($event)"
(dirtyChange)="updateCanDeactivate($event)"
>
</dlcm-admin-funding-agencies-form>
......
......@@ -38,14 +38,14 @@ export class AdminFundingAgenciesDetailEditRoutable extends SharedAbstractDetail
@Select((state: LocalStateModel) => state.shared.shared_organizationalUnit.list) listOrgUnitsObs: Observable<OrganizationalUnitExtended[]>;
@Select((state: LocalStateModel) => state.admin.admin_fundingAgencies.admin_fundingAgencies_organizationalUnit.selected) selectedOrgUnitsObs: Observable<OrganizationalUnit[]>;
readonly KEY_PARAM_NAME: string = "name";
readonly KEY_PARAM_NAME: keyof FundingAgency & string = "name";
constructor(protected _store: Store,
protected route: ActivatedRoute,
protected _route: ActivatedRoute,
protected readonly _actions$: Actions,
protected readonly _changeDetector: ChangeDetectorRef,
public dialog: MatDialog) {
super(_store, route, _actions$, _changeDetector, dialog, LocalStateEnum.admin_fundingAgencies, adminFundingAgenciesActionNameSpace, LocalStateEnum.admin);
public _dialog: MatDialog) {
super(_store, _route, _actions$, _changeDetector, _dialog, LocalStateEnum.admin_fundingAgencies, adminFundingAgenciesActionNameSpace, LocalStateEnum.admin);
}
getSubResourceWithParentId(id: string): void {
......
......@@ -5,9 +5,13 @@ import {
ChangeDetectorRef,
Component,
} from "@angular/core";
import {MatDialog} from "@angular/material/dialog";
import {ActivatedRoute} from "@angular/router";
import {FundingAgency} from "@app/generated-api";
import {Store} from "@ngxs/store";
import {
Actions,
Store,
} from "@ngxs/store";
import {SharedAbstractListRoutable} from "@shared/components/routables/shared-abstract-list/shared-abstract-list.routable";
import {FieldTypeEnum} from "@shared/enums/field-type.enum";
import {LocalStateEnum} from "@shared/enums/local-state.enum";
......@@ -26,11 +30,22 @@ export class AdminFundingAgenciesListRoutable extends SharedAbstractListRoutable
readonly KEY_CREATE_BUTTON: string = TRANSLATE("admin.funding-agencies.button.new");
readonly KEY_REFRESH_BUTTON: string = TRANSLATE("admin.funding-agencies.button.refresh");
readonly KEY_BACK_BUTTON: string | undefined = TRANSLATE("admin.button.goBackToAdminHome");
readonly KEY_PARAM_NAME: keyof FundingAgency & string = "name";
constructor(protected readonly _store: Store,
protected readonly _changeDetector: ChangeDetectorRef,
protected readonly _route: ActivatedRoute,
protected readonly _actions$: Actions,
protected readonly _dialog: MatDialog) {
super(_store, _changeDetector, _route, _actions$, _dialog, LocalStateEnum.admin_fundingAgencies, adminFundingAgenciesActionNameSpace, {}, LocalStateEnum.admin);
}
conditionDisplayEditButton(model: FundingAgency | undefined): boolean {
return true;
}
constructor(protected store: Store,
protected _changeDetector: ChangeDetectorRef,
protected _route: ActivatedRoute) {
super(store, _changeDetector, _route, LocalStateEnum.admin_fundingAgencies, adminFundingAgenciesActionNameSpace, {}, LocalStateEnum.admin);
conditionDisplayDeleteButton(model: FundingAgency | undefined): boolean {
return true;
}
defineColumns(): void {
......
......@@ -2,37 +2,39 @@
(ngSubmit)="onSubmit()"
>
<mat-form-field>
<mat-form-field *ngIf="getFormControl(formDefinition.name) as fd">
<mat-label>{{'admin.institution.form.name' | translate }}</mat-label>
<input matInput
[formControlName]="formDefinition.name"
[required]="isRequired(formDefinition.name)"
[formControl]="fd"
[solidifyValidation]="errors"
[required]="formValidationHelper.hasRequiredField(fd)"
(blur)="checkAvailable(formDefinition.name, fd)"
>
<mat-error *ngIf="getFormControl(formDefinition.name).invalid">{{'required' | translate}}</mat-error>
<mat-error *ngFor="let error of getFormControl(formDefinition.name).errors?.errorsFromBackend">{{error}}</mat-error>
<mat-error #errors></mat-error>
</mat-form-field>
<mat-form-field>
<mat-form-field *ngIf="getFormControl(formDefinition.url) as fd">
<mat-label>{{'admin.institution.form.url' | translate }}</mat-label>
<input matInput
[formControlName]="formDefinition.url"
[required]="isRequired(formDefinition.url)"
[formControl]="fd"
[solidifyValidation]="errors"
[required]="formValidationHelper.hasRequiredField(fd)"
>
<mat-error *ngIf="getFormControl(formDefinition.url).invalid">{{'URL is invalid' | translate}}</mat-error>
<mat-error *ngFor="let error of getFormControl(formDefinition.url).errors?.errorsFromBackend">{{error}}</mat-error>
<mat-error #errors></mat-error>
</mat-form-field>
<mat-form-field>
<mat-form-field *ngIf="getFormControl(formDefinition.description) as fd">
<mat-label>{{'admin.institution.form.description' | translate }}</mat-label>
<textarea matInput
cdkTextareaAutosize
cdkAutosizeMinRows="5"
cdkAutosizeMaxRows="10"
[formControlName]="formDefinition.description"
[solidifyValidation]="errors"
[formControl]="fd"
[required]="formValidationHelper.hasRequiredField(fd)"
>
</textarea>
<mat-error *ngIf="getFormControl(formDefinition.description).invalid">{{'Description is invalid' | translate}}</mat-error>
<mat-error *ngFor="let error of getFormControl(formDefinition.description).errors?.errorsFromBackend">{{error}}</mat-error>
<mat-error #errors></mat-error>
</mat-form-field>
<div class="submit-button">
......
......@@ -4,6 +4,7 @@
<dlcm-admin-institution-form #formPresentational
*ngIf="isReadyToBeDisplayedInCreateModeObs | async"
(submitChange)="create($event)"
(checkAvailableChange)="checkAvailable($event)"
(dirtyChange)="updateCanDeactivate($event)"
></dlcm-admin-institution-form>
</div>
......@@ -5,12 +5,14 @@ import {
} from "@admin/institution/stores/admin-institution.state";
import {
ChangeDetectionStrategy,
ChangeDetectorRef,
Component,
OnInit,
ViewChild,
} from "@angular/core";
import {Institution} from "@app/generated-api";
import {
Actions,
Select,
Store,
} from "@ngxs/store";
......@@ -32,7 +34,9 @@ export class AdminInstitutionCreateRoutable extends SharedAbstractCreateRoutable
@ViewChild("formPresentational", {static: false})
readonly formPresentational: SharedAbstractFormPresentational<Institution>;
constructor(protected store: Store) {
super(store, LocalStateEnum.admin_institution, adminInstitutionActionNameSpace, LocalStateEnum.admin);
constructor(protected readonly _store: Store,
protected readonly _actions$: Actions,
protected readonly _changeDetector: ChangeDetectorRef) {
super(_store, _actions$, _changeDetector, LocalStateEnum.admin_institution, adminInstitutionActionNameSpace, LocalStateEnum.admin);
}
}
......@@ -15,6 +15,7 @@
[model]="currentObs| async"
[readonly]="!isEdit"
(submitChange)="update($event)"
(checkAvailableChange)="checkAvailable($event)"
(dirtyChange)="updateCanDeactivate($event)"
></dlcm-admin-institution-form>
......
......@@ -30,14 +30,14 @@ export class AdminInstitutionDetailEditRoutable extends SharedAbstractDetailEdit
@Select(AdminInstitutionState.isLoadingWithDependency) isLoadingWithDependencyObs: Observable<boolean>;
@Select(AdminInstitutionState.isReadyToBeDisplayed) isReadyToBeDisplayedObs: Observable<boolean>;
readonly KEY_PARAM_NAME: string = "name";
readonly KEY_PARAM_NAME: keyof Institution & string = "name";
constructor(protected _store: Store,
protected route: ActivatedRoute,
protected _route: ActivatedRoute,
protected readonly _actions$: Actions,
protected readonly _changeDetector: ChangeDetectorRef,
public dialog: MatDialog) {
super(_store, route, _actions$, _changeDetector, dialog, LocalStateEnum.admin_institution, adminInstitutionActionNameSpace, LocalStateEnum.admin);
public _dialog: MatDialog) {
super(_store, _route, _actions$, _changeDetector, _dialog, LocalStateEnum.admin_institution, adminInstitutionActionNameSpace, LocalStateEnum.admin);
}
getSubResourceWithParentId(id: string): void {
......
......@@ -5,9 +5,13 @@ import {
ChangeDetectorRef,
Component,
} from "@angular/core";
import {MatDialog} from "@angular/material/dialog";
import {ActivatedRoute} from "@angular/router";
import {Institution} from "@app/generated-api";
import {Store} from "@ngxs/store";
import {
Actions,
Store,
} from "@ngxs/store";
import {SharedAbstractListRoutable} from "@shared/components/routables/shared-abstract-list/shared-abstract-list.routable";
import {FieldTypeEnum} from "@shared/enums/field-type.enum";
import {LocalStateEnum} from "@shared/enums/local-state.enum";
......@@ -26,11 +30,22 @@ export class AdminInstitutionListRoutable extends SharedAbstractListRoutable<Ins
readonly KEY_CREATE_BUTTON: string = TRANSLATE("admin.institution.button.new");
readonly KEY_REFRESH_BUTTON: string = TRANSLATE("admin.institution.button.refresh");
readonly KEY_BACK_BUTTON: string | undefined = TRANSLATE("admin.button.goBackToAdminHome");
readonly KEY_PARAM_NAME: keyof Institution & string = "name";
constructor(protected readonly _store: Store,
protected readonly _changeDetector: ChangeDetectorRef,
protected readonly _route: ActivatedRoute,
protected readonly _actions$: Actions,
protected readonly _dialog: MatDialog) {
super(_store, _changeDetector, _route, _actions$, _dialog, LocalStateEnum.admin_institution, adminInstitutionActionNameSpace, {}, LocalStateEnum.admin);
}
conditionDisplayEditButton(model: Institution | undefined): boolean {
return true;
}
constructor(protected store: Store,
protected _changeDetector: ChangeDetectorRef,
protected _route: ActivatedRoute) {
super(store, _changeDetector, _route, LocalStateEnum.admin_institution, adminInstitutionActionNameSpace, {}, LocalStateEnum.admin);
conditionDisplayDeleteButton(model: Institution | undefined): boolean {
return true;
}
defineColumns(): void {
......
......@@ -4,87 +4,103 @@
>
<div class="two-columns-wrapper">
<div class="left-part">
<mat-form-field>
<mat-form-field *ngIf="getFormControl(formDefinition.title) as fd">
<mat-label>{{'admin.license.form.title' | translate}}</mat-label>
<input matInput
[formControlName]="formDefinition.title"
[required]="isRequired(formDefinition.title)"
[solidifyValidation]="errors"
[formControl]="fd"
[required]="formValidationHelper.hasRequiredField(fd)"
>
<mat-error *ngIf="getFormControl(formDefinition.title).invalid">{{'required' | translate}}</mat-error>
<mat-error *ngFor="let error of getFormControl(formDefinition.title).errors?.errorsFromBackend">{{error}}</mat-error>
<mat-error #errors></mat-error>
</mat-form-field>
<mat-form-field>
<mat-form-field *ngIf="getFormControl(formDefinition.openLicenseId) as fd">
<mat-label>{{'admin.license.form.openLicenseId' | translate}}</mat-label>
<input matInput
[formControlName]="formDefinition.openLicenseId"
[required]="isRequired(formDefinition.openLicenseId)"
[solidifyValidation]="errors"
[formControl]="fd"
[required]="formValidationHelper.hasRequiredField(fd)"
(blur)="checkAvailable(formDefinition.openLicenseId, fd)"
>
<mat-error *ngIf="getFormControl(formDefinition.openLicenseId).invalid">{{'required' | translate}}</mat-error>
<mat-error *ngFor="let error of getFormControl(formDefinition.openLicenseId).errors?.errorsFromBackend">{{error}}</mat-error>
<mat-error #errors></mat-error>
</mat-form-field>
<mat-form-field>
<mat-form-field *ngIf="getFormControl(formDefinition.url) as fd">
<mat-label>{{'admin.license.form.url' | translate}}</mat-label>
<input matInput
[formControlName]="formDefinition.url"
[solidifyValidation]="errors"
[formControl]="fd"
[required]="formValidationHelper.hasRequiredField(fd)"
>
<mat-error *ngFor="let error of getFormControl(formDefinition.url).errors?.errorsFromBackend">{{error}}</mat-error>
<mat-error #errors></mat-error>
</mat-form-field>
<mat-form-field>
<mat-form-field *ngIf="getFormControl(formDefinition.odConformance) as fd">
<mat-label>{{'admin.license.form.odConformance' | translate}}</mat-label>
<mat-select [formControlName]="formDefinition.odConformance">
<mat-select [formControl]="fd"
[solidifyValidation]="errors"
[required]="formValidationHelper.hasRequiredField(fd)"
>
<mat-option *ngFor="let odConformance of licenseOdConformanceEnum"
[value]="odConformance"
>
{{odConformance}}
</mat-option>
</mat-select>
<mat-error *ngFor="let error of getFormControl(formDefinition.odConformance).errors?.errorsFromBackend">{{error}}</mat-error>
<mat-error #errors></mat-error>
</mat-form-field>
<mat-form-field>
<mat-form-field *ngIf="getFormControl(formDefinition.osdConformance) as fd">
<mat-label>{{'admin.license.form.osdConformance' | translate}}</mat-label>
<mat-select [formControlName]="formDefinition.osdConformance">
<mat-select [formControl]="fd"
[solidifyValidation]="errors"
[required]="formValidationHelper.hasRequiredField(fd)"
>
<mat-option *ngFor="let osdConformance of licenseOsdConformanceEnum"
[value]="osdConformance"
>
{{osdConformance}}
</mat-option>
</mat-select>
<mat-error *ngFor="let error of getFormControl(formDefinition.osdConformance).errors?.errorsFromBackend">{{error}}</mat-error>
<mat-error #errors></mat-error>
</mat-form-field>
</div>
<div class="right-part">
<mat-form-field>
<mat-form-field *ngIf="getFormControl(formDefinition.maintainer) as fd">
<mat-label>{{'admin.license.form.maintainer' | translate}}</mat-label>
<input matInput
[formControlName]="formDefinition.maintainer"
[formControl]="fd"
[solidifyValidation]="errors"
[required]="formValidationHelper.hasRequiredField(fd)"
>
<mat-error *ngFor="let error of getFormControl(formDefinition.maintainer).errors?.errorsFromBackend">{{error}}</mat-error>
<mat-error #errors></mat-error>
</mat-form-field>
<mat-form-field>
<mat-form-field *ngIf="getFormControl(formDefinition.status) as fd">
<mat-label>{{'admin.license.form.status' | translate}}</mat-label>
<mat-select [formControlName]="formDefinition.status">
<mat-select [formControl]="fd"
[solidifyValidation]="errors"
[required]="formValidationHelper.hasRequiredField(fd)"
>
<mat-option *ngFor="let status of licensesStatusEnum"
[value]="status"
>
{{status}}
</mat-option>
</mat-select>
<mat-error *ngFor="let error of getFormControl(formDefinition.status).errors?.errorsFromBackend">{{error}}</mat-error>
<mat-error #errors></mat-error>
</mat-form-field>
<mat-checkbox [formControlName]="formDefinition.isGeneric">{{'admin.license.form.isGeneric' | translate }}</mat-checkbox>
<mat-form-field>
<mat-form-field *ngIf="getFormControl(formDefinition.family) as fd">
<mat-label>{{'admin.license.form.family' | translate}}</mat-label>
<input matInput
[formControlName]="formDefinition.family"
[solidifyValidation]="errors"
[formControl]="fd"
[required]="formValidationHelper.hasRequiredField(fd)"
>
<mat-error *ngFor="let error of getFormControl(formDefinition.family).errors?.errorsFromBackend">{{error}}</mat-error>
<mat-error #errors></mat-error>
</mat-form-field>
<mat-checkbox [formControlName]="formDefinition.domainContent">{{'admin.license.form.domainContent' | translate }}</mat-checkbox>
......