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 @@ ...@@ -11256,9 +11256,9 @@
} }
}, },
"solidify-frontend": { "solidify-frontend": {
"version": "0.2.16", "version": "0.2.18",
"resolved": "https://packages.dlcm.ch/repository/npm-group/solidify-frontend/-/solidify-frontend-0.2.16.tgz", "resolved": "https://packages.dlcm.ch/repository/npm-group/solidify-frontend/-/solidify-frontend-0.2.18.tgz",
"integrity": "sha512-l6kU7zZ9CEWsWfpsLbccoQTGqhz4qiq5v9SUx9u8nN0kRy2nWdnY1pgbs8XXplJrcuW2DhsxDy4QatDTPlQliQ==", "integrity": "sha512-sDIi/qVLM54slKps/k6YHN2jqrDZ5V+Nuc0pCy28FRA3FtZxgtqnyK4l62lM19V/sdrxzcRk5ql3la/xKl8vZw==",
"requires": { "requires": {
"tslib": "^1.9.0" "tslib": "^1.9.0"
} }
......
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
"generate-version": "ts-node --project tsconfig-ts-node.json git.version.ts", "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", "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", "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", "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", "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" "refresh-ngsw-config": "ngsw-config dist/DLCM-Frontend ngsw-config.json"
...@@ -70,7 +70,7 @@ ...@@ -70,7 +70,7 @@
"primeicons": "2.0.0", "primeicons": "2.0.0",
"primeng": "8.0.4", "primeng": "8.0.4",
"rxjs": "6.5.3", "rxjs": "6.5.3",
"solidify-frontend": "0.2.16", "solidify-frontend": "0.2.18",
"sync-pom-version-to-package": "1.3.1", "sync-pom-version-to-package": "1.3.1",
"ts-key-enum": "2.0.0", "ts-key-enum": "2.0.0",
"tslib": "1.10.0", "tslib": "1.10.0",
......
...@@ -91,6 +91,7 @@ const dialogs = [ ...@@ -91,6 +91,7 @@ const dialogs = [
const appInitializerFn = (appConfig: AppConfigService) => () => appConfig.mergeConfig(environment).toPromise(); const appInitializerFn = (appConfig: AppConfigService) => () => appConfig.mergeConfig(environment).toPromise();
export const WINDOW = "windowObject"; export const WINDOW = "windowObject";
export const infiniteNumber: number = 999999999;
export function createDefaultStorage(): Storage | null { export function createDefaultStorage(): Storage | null {
return environment.tokenInMemoryStorage ? new InMemoryStorage() : (typeof sessionStorage !== "undefined" ? sessionStorage : null); return environment.tokenInMemoryStorage ? new InMemoryStorage() : (typeof sessionStorage !== "undefined" ? sessionStorage : null);
......
...@@ -44,13 +44,6 @@ export class AdminHomeRoutable extends SharedAbstractPresentational { ...@@ -44,13 +44,6 @@ export class AdminHomeRoutable extends SharedAbstractPresentational {
path: RoutesEnum.adminPreservationPolicy, path: RoutesEnum.adminPreservationPolicy,
isVisible: () => true, 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", avatarIcon: "cart-arrow-down",
titleToTranslate: TRANSLATE("admin.disseminationPolicy.home.title"), titleToTranslate: TRANSLATE("admin.disseminationPolicy.home.title"),
...@@ -58,6 +51,13 @@ export class AdminHomeRoutable extends SharedAbstractPresentational { ...@@ -58,6 +51,13 @@ export class AdminHomeRoutable extends SharedAbstractPresentational {
path: RoutesEnum.adminDisseminationPolicy, path: RoutesEnum.adminDisseminationPolicy,
isVisible: () => true, isVisible: () => true,
}, },
{
avatarIcon: "copyright",
titleToTranslate: TRANSLATE("admin.license.home.title"),
subtitleToTranslate: TRANSLATE("admin.license.home.subtitle"),
path: RoutesEnum.adminLicense,
isVisible: () => true,
},
{ {
avatarIcon: "university", avatarIcon: "university",
titleToTranslate: TRANSLATE("admin.institution.home.title"), titleToTranslate: TRANSLATE("admin.institution.home.title"),
......
...@@ -5,11 +5,13 @@ import { ...@@ -5,11 +5,13 @@ import {
} from "@admin/dissemination-policy/stores/admin-dissemination-policy.state"; } from "@admin/dissemination-policy/stores/admin-dissemination-policy.state";
import { import {
ChangeDetectionStrategy, ChangeDetectionStrategy,
ChangeDetectorRef,
Component, Component,
ViewChild, ViewChild,
} from "@angular/core"; } from "@angular/core";
import {DisseminationPolicy} from "@app/generated-api"; import {DisseminationPolicy} from "@app/generated-api";
import { import {
Actions,
Select, Select,
Store, Store,
} from "@ngxs/store"; } from "@ngxs/store";
...@@ -31,7 +33,9 @@ export class AdminDisseminationPolicyCreateRoutable extends SharedAbstractCreate ...@@ -31,7 +33,9 @@ export class AdminDisseminationPolicyCreateRoutable extends SharedAbstractCreate
@ViewChild("formPresentational", {static: false}) @ViewChild("formPresentational", {static: false})
readonly formPresentational: SharedAbstractFormPresentational<DisseminationPolicy>; readonly formPresentational: SharedAbstractFormPresentational<DisseminationPolicy>;
constructor(protected store: Store) { constructor(protected readonly _store: Store,
super(store, LocalStateEnum.admin_disseminationPolicy, adminDisseminationPolicyActionNameSpace, LocalStateEnum.admin); 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 ...@@ -30,14 +30,14 @@ export class AdminDisseminationPolicyDetailEditRoutable extends SharedAbstractDe
@Select(AdminDisseminationPolicyState.isLoadingWithDependency) isLoadingWithDependencyObs: Observable<boolean>; @Select(AdminDisseminationPolicyState.isLoadingWithDependency) isLoadingWithDependencyObs: Observable<boolean>;
@Select(AdminDisseminationPolicyState.isReadyToBeDisplayed) isReadyToBeDisplayedObs: 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, constructor(protected _store: Store,
protected route: ActivatedRoute, protected _route: ActivatedRoute,
protected readonly _actions$: Actions, protected readonly _actions$: Actions,
protected readonly _changeDetector: ChangeDetectorRef, protected readonly _changeDetector: ChangeDetectorRef,
public dialog: MatDialog) { public _dialog: MatDialog) {
super(_store, route, _actions$, _changeDetector, dialog, LocalStateEnum.admin_disseminationPolicy, adminDisseminationPolicyActionNameSpace, LocalStateEnum.admin); super(_store, _route, _actions$, _changeDetector, _dialog, LocalStateEnum.admin_disseminationPolicy, adminDisseminationPolicyActionNameSpace, LocalStateEnum.admin);
} }
getSubResourceWithParentId(id: string): void { getSubResourceWithParentId(id: string): void {
......
...@@ -5,9 +5,13 @@ import { ...@@ -5,9 +5,13 @@ import {
ChangeDetectorRef, ChangeDetectorRef,
Component, Component,
} from "@angular/core"; } from "@angular/core";
import {MatDialog} from "@angular/material/dialog";
import {ActivatedRoute} from "@angular/router"; import {ActivatedRoute} from "@angular/router";
import {DisseminationPolicy} from "@app/generated-api"; 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 {SharedAbstractListRoutable} from "@shared/components/routables/shared-abstract-list/shared-abstract-list.routable";
import {FieldTypeEnum} from "@shared/enums/field-type.enum"; import {FieldTypeEnum} from "@shared/enums/field-type.enum";
import {LocalStateEnum} from "@shared/enums/local-state.enum"; import {LocalStateEnum} from "@shared/enums/local-state.enum";
...@@ -26,11 +30,22 @@ export class AdminDisseminationPolicyListRoutable extends SharedAbstractListRout ...@@ -26,11 +30,22 @@ export class AdminDisseminationPolicyListRoutable extends SharedAbstractListRout
readonly KEY_CREATE_BUTTON: string = TRANSLATE("admin.disseminationPolicy.button.new"); readonly KEY_CREATE_BUTTON: string = TRANSLATE("admin.disseminationPolicy.button.new");
readonly KEY_REFRESH_BUTTON: string = TRANSLATE("admin.disseminationPolicy.button.refresh"); readonly KEY_REFRESH_BUTTON: string = TRANSLATE("admin.disseminationPolicy.button.refresh");
readonly KEY_BACK_BUTTON: string | undefined = TRANSLATE("admin.button.goBackToAdminHome"); 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, conditionDisplayDeleteButton(model: DisseminationPolicy | undefined): boolean {
protected _changeDetector: ChangeDetectorRef, return true;
protected _route: ActivatedRoute) {
super(store, _changeDetector, _route, LocalStateEnum.admin_disseminationPolicy, adminDisseminationPolicyActionNameSpace, {}, LocalStateEnum.admin);
} }
defineColumns(): void { defineColumns(): void {
......
<form [formGroup]="form" <form [formGroup]="form"
(ngSubmit)="onSubmit()" (ngSubmit)="onSubmit()"
> >
<mat-form-field> <mat-form-field *ngIf="getFormControl(formDefinition.acronym) as fd">
<mat-label>{{'admin.funding-agencies.form.acronym' | translate}}</mat-label> <mat-label>{{'admin.funding-agencies.form.acronym' | translate}}</mat-label>
<input matInput <input matInput
[formControlName]="formDefinition.acronym" [solidifyValidation]="errors"
[required]="isRequired(formDefinition.acronym)" [formControl]="fd"
[required]="formValidationHelper.hasRequiredField(fd)"
> >
<mat-error *ngIf="getFormControl(formDefinition.acronym).invalid">{{'required' | translate}}</mat-error> <mat-error #errors></mat-error>
<mat-error
*ngFor="let error of getFormControl(formDefinition.acronym).errors?.errorsFromBackend"
>{{error}}</mat-error>
</mat-form-field> </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> <mat-label>{{'admin.funding-agencies.form.name' | translate}}</mat-label>
<input matInput <input matInput
[formControlName]="formDefinition.name" [solidifyValidation]="errors"
[required]="isRequired(formDefinition.name)" [formControl]="fd"
[required]="formValidationHelper.hasRequiredField(fd)"
(blur)="checkAvailable(formDefinition.name, fd)"
> >
<mat-error *ngIf="getFormControl(formDefinition.name).invalid">{{'required' | translate}}</mat-error> <mat-error #errors></mat-error>
<mat-error *ngFor="let error of getFormControl(formDefinition.name).errors?.errorsFromBackend">{{error}}</mat-error>
</mat-form-field> </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> <mat-label>{{'admin.funding-agencies.form.url' | translate}}</mat-label>
<input matInput <input matInput
[formControlName]="formDefinition.url" [solidifyValidation]="errors"
[formControl]="fd"
[required]="formValidationHelper.hasRequiredField(fd)"
> >
<mat-error <mat-error #errors></mat-error>
*ngFor="let error of getFormControl(formDefinition.url).errors?.errorsFromBackend"
>{{error}}</mat-error>
</mat-form-field> </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> <mat-label>{{'admin.funding-agencies.form.description' | translate}}</mat-label>
<textarea matInput <textarea matInput
[formControlName]="formDefinition.description" [solidifyValidation]="errors"
[formControl]="fd"
[required]="formValidationHelper.hasRequiredField(fd)"
></textarea> ></textarea>
<mat-error <mat-error #errors></mat-error>
*ngFor="let error of getFormControl(formDefinition.description).errors?.errorsFromBackend"
>{{error}}</mat-error>
</mat-form-field> </mat-form-field>
<dlcm-shared-multi-select [list]="listOrgUnits" <dlcm-shared-multi-select [list]="listOrgUnits"
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
*ngIf="isReadyToBeDisplayedInCreateModeObs | async" *ngIf="isReadyToBeDisplayedInCreateModeObs | async"
[listOrgUnits]="listOrgUnitsObs | async" [listOrgUnits]="listOrgUnitsObs | async"
(submitChange)="create($event)" (submitChange)="create($event)"
(checkAvailableChange)="checkAvailable($event)"
(dirtyChange)="updateCanDeactivate($event)" (dirtyChange)="updateCanDeactivate($event)"
> >
</dlcm-admin-funding-agencies-form> </dlcm-admin-funding-agencies-form>
......
...@@ -5,10 +5,12 @@ import { ...@@ -5,10 +5,12 @@ import {
} from "@admin/funding-agencies/stores/admin-funding-agencies.state"; } from "@admin/funding-agencies/stores/admin-funding-agencies.state";
import { import {
ChangeDetectionStrategy, ChangeDetectionStrategy,
ChangeDetectorRef,
Component, Component,
} from "@angular/core"; } from "@angular/core";
import {FundingAgency} from "@app/generated-api"; import {FundingAgency} from "@app/generated-api";
import { import {
Actions,
Select, Select,
Store, Store,
} from "@ngxs/store"; } from "@ngxs/store";
...@@ -29,8 +31,10 @@ export class AdminFundingAgenciesCreateRoutable extends SharedAbstractCreateRout ...@@ -29,8 +31,10 @@ export class AdminFundingAgenciesCreateRoutable extends SharedAbstractCreateRout
@Select(AdminFundingAgenciesState.isReadyToBeDisplayedInCreateMode) isReadyToBeDisplayedInCreateModeObs: Observable<boolean>; @Select(AdminFundingAgenciesState.isReadyToBeDisplayedInCreateMode) isReadyToBeDisplayedInCreateModeObs: Observable<boolean>;
@Select((state: LocalStateModel) => state.shared.shared_organizationalUnit.list) listOrgUnitsObs: Observable<OrganizationalUnitExtended[]>; @Select((state: LocalStateModel) => state.shared.shared_organizationalUnit.list) listOrgUnitsObs: Observable<OrganizationalUnitExtended[]>;
constructor(protected store: Store) { constructor(protected readonly _store: Store,
super(store, LocalStateEnum.admin_fundingAgencies, adminFundingAgenciesActionNameSpace, LocalStateEnum.admin); protected readonly _actions$: Actions,
protected readonly _changeDetector: ChangeDetectorRef) {
super(_store, _actions$, _changeDetector, LocalStateEnum.admin_fundingAgencies, adminFundingAgenciesActionNameSpace, LocalStateEnum.admin);
} }
} }
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
[listOrgUnits]="listOrgUnitsObs | async" [listOrgUnits]="listOrgUnitsObs | async"
[readonly]="!isEdit" [readonly]="!isEdit"
(submitChange)="update($event)" (submitChange)="update($event)"
(checkAvailableChange)="checkAvailable($event)"
(dirtyChange)="updateCanDeactivate($event)" (dirtyChange)="updateCanDeactivate($event)"
> >
</dlcm-admin-funding-agencies-form> </dlcm-admin-funding-agencies-form>
......
...@@ -38,14 +38,14 @@ export class AdminFundingAgenciesDetailEditRoutable extends SharedAbstractDetail ...@@ -38,14 +38,14 @@ export class AdminFundingAgenciesDetailEditRoutable extends SharedAbstractDetail
@Select((state: LocalStateModel) => state.shared.shared_organizationalUnit.list) listOrgUnitsObs: Observable<OrganizationalUnitExtended[]>; @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[]>; @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, constructor(protected _store: Store,
protected route: ActivatedRoute, protected _route: ActivatedRoute,
protected readonly _actions$: Actions, protected readonly _actions$: Actions,
protected readonly _changeDetector: ChangeDetectorRef, protected readonly _changeDetector: ChangeDetectorRef,
public dialog: MatDialog) { public _dialog: MatDialog) {
super(_store, route, _actions$, _changeDetector, dialog, LocalStateEnum.admin_fundingAgencies, adminFundingAgenciesActionNameSpace, LocalStateEnum.admin); super(_store, _route, _actions$, _changeDetector, _dialog, LocalStateEnum.admin_fundingAgencies, adminFundingAgenciesActionNameSpace, LocalStateEnum.admin);
} }
getSubResourceWithParentId(id: string): void { getSubResourceWithParentId(id: string): void {
......
...@@ -5,9 +5,13 @@ import { ...@@ -5,9 +5,13 @@ import {
ChangeDetectorRef, ChangeDetectorRef,
Component, Component,
} from "@angular/core"; } from "@angular/core";
import {MatDialog} from "@angular/material/dialog";
import {ActivatedRoute} from "@angular/router"; import {ActivatedRoute} from "@angular/router";
import {FundingAgency} from "@app/generated-api"; 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 {SharedAbstractListRoutable} from "@shared/components/routables/shared-abstract-list/shared-abstract-list.routable";
import {FieldTypeEnum} from "@shared/enums/field-type.enum"; import {FieldTypeEnum} from "@shared/enums/field-type.enum";
import {LocalStateEnum} from "@shared/enums/local-state.enum"; import {LocalStateEnum} from "@shared/enums/local-state.enum";
...@@ -26,11 +30,22 @@ export class AdminFundingAgenciesListRoutable extends SharedAbstractListRoutable ...@@ -26,11 +30,22 @@ export class AdminFundingAgenciesListRoutable extends SharedAbstractListRoutable
readonly KEY_CREATE_BUTTON: string = TRANSLATE("admin.funding-agencies.button.new"); readonly KEY_CREATE_BUTTON: string = TRANSLATE("admin.funding-agencies.button.new");
readonly KEY_REFRESH_BUTTON: string = TRANSLATE("admin.funding-agencies.button.refresh"); readonly KEY_REFRESH_BUTTON: string = TRANSLATE("admin.funding-agencies.button.refresh");
readonly KEY_BACK_BUTTON: string | undefined = TRANSLATE("admin.button.goBackToAdminHome"); 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, conditionDisplayDeleteButton(model: FundingAgency | undefined): boolean {
protected _changeDetector: ChangeDetectorRef, return true;
protected _route: ActivatedRoute) {
super(store, _changeDetector, _route, LocalStateEnum.admin_fundingAgencies, adminFundingAgenciesActionNameSpace, {}, LocalStateEnum.admin);
} }
defineColumns(): void { defineColumns(): void {
......
...@@ -2,37 +2,39 @@ ...@@ -2,37 +2,39 @@
(ngSubmit)="onSubmit()" (ngSubmit)="onSubmit()"
> >
<mat-form-field> <mat-form-field *ngIf="getFormControl(formDefinition.name) as fd">
<mat-label>{{'admin.institution.form.name' | translate }}</mat-label> <mat-label>{{'admin.institution.form.name' | translate }}</mat-label>
<input matInput <input matInput
[formControlName]="formDefinition.name" [formControl]="fd"
[required]="isRequired(formDefinition.name)" [solidifyValidation]="errors"
[required]="formValidationHelper.hasRequiredField(fd)"
(blur)="checkAvailable(formDefinition.name, fd)"
> >
<mat-error *ngIf="getFormControl(formDefinition.name).invalid">{{'required' | translate}}</mat-error> <mat-error #errors></mat-error>
<mat-error *ngFor="let error of getFormControl(formDefinition.name).errors?.errorsFromBackend">{{error}}</mat-error>
</mat-form-field> </mat-form-field>
<mat-form-field> <mat-form-field *ngIf="getFormControl(formDefinition.url) as fd">
<mat-label>{{'admin.institution.form.url' | translate }}</mat-label> <mat-label>{{'admin.institution.form.url' | translate }}</mat-label>
<input matInput <input matInput
[formControlName]="formDefinition.url" [formControl]="fd"
[required]="isRequired(formDefinition.url)" [solidifyValidation]="errors"
[required]="formValidationHelper.hasRequiredField(fd)"
> >
<mat-error *ngIf="getFormControl(formDefinition.url).invalid">{{'URL is invalid' | translate}}</mat-error> <mat-error #errors></mat-error>
<mat-error *ngFor="let error of getFormControl(formDefinition.url).errors?.errorsFromBackend">{{error}}</mat-error>
</mat-form-field> </mat-form-field>
<mat-form-field> <mat-form-field *ngIf="getFormControl(formDefinition.description) as fd">
<mat-label>{{'admin.institution.form.description' | translate }}</mat-label> <mat-label>{{'admin.institution.form.description' | translate }}</mat-label>
<textarea matInput <textarea matInput
cdkTextareaAutosize cdkTextareaAutosize
cdkAutosizeMinRows="5" cdkAutosizeMinRows="5"
cdkAutosizeMaxRows="10" cdkAutosizeMaxRows="10"
[formControlName]="formDefinition.description" [solidifyValidation]="errors"
[formControl]="fd"
[required]="formValidationHelper.hasRequiredField(fd)"
> >
</textarea> </textarea>
<mat-error *ngIf="getFormControl(formDefinition.description).invalid">{{'Description is invalid' | translate}}</mat-error> <mat-error #errors></mat-error>
<mat-error *ngFor="let error of getFormControl(formDefinition.description).errors?.errorsFromBackend">{{error}}</mat-error>
</mat-form-field> </mat-form-field>
<div class="submit-button"> <div class="submit-button">
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
<dlcm-admin-institution-form #formPresentational <dlcm-admin-institution-form #formPresentational
*ngIf="isReadyToBeDisplayedInCreateModeObs | async" *ngIf="isReadyToBeDisplayedInCreateModeObs | async"
(submitChange)="create($event)" (submitChange)="create($event)"
(checkAvailableChange)="checkAvailable($event)"
(dirtyChange)="updateCanDeactivate($event)" (dirtyChange)="updateCanDeactivate($event)"
></dlcm-admin-institution-form> ></dlcm-admin-institution-form>
</div> </div>
...@@ -5,12 +5,14 @@ import { ...@@ -5,12 +5,14 @@ import {
} from "@admin/institution/stores/admin-institution.state"; } from "@admin/institution/stores/admin-institution.state";
import { import {
ChangeDetectionStrategy, ChangeDetectionStrategy,
ChangeDetectorRef,
Component, Component,
OnInit, OnInit,
ViewChild, ViewChild,
} from "@angular/core"; } from "@angular/core";
import {Institution} from "@app/generated-api"; import {Institution} from "@app/generated-api";
import { import {
Actions,
Select, Select,
Store, Store,
} from "@ngxs/store"; } from "@ngxs/store";
...@@ -32,7 +34,9 @@ export class AdminInstitutionCreateRoutable extends SharedAbstractCreateRoutable ...@@ -32,7 +34,9 @@ export class AdminInstitutionCreateRoutable extends SharedAbstractCreateRoutable
@ViewChild("formPresentational", {static: false}) @ViewChild("formPresentational", {static: false})
readonly formPresentational: SharedAbstractFormPresentational<Institution>; readonly formPresentational: SharedAbstractFormPresentational<Institution>;
constructor(protected store: Store) { constructor(protected readonly _store: Store,
super(store, LocalStateEnum.admin_institution, adminInstitutionActionNameSpace, LocalStateEnum.admin); protected readonly _actions$: Actions,
protected readonly _changeDetector: ChangeDetectorRef) {
super(_store, _actions$, _changeDetector, LocalStateEnum.admin_institution, adminInstitutionActionNameSpace, LocalStateEnum.admin);
} }
} }
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
[model]="currentObs| async" [model]="currentObs| async"
[readonly]="!isEdit" [readonly]="!isEdit"
(submitChange)="update($event)" (submitChange)="update($event)"
(checkAvailableChange)="checkAvailable($event)"
(dirtyChange)="updateCanDeactivate($event)" (dirtyChange)="updateCanDeactivate($event)"
></dlcm-admin-institution-form> ></dlcm-admin-institution-form>
......
...@@ -30,14 +30,14 @@ export class AdminInstitutionDetailEditRoutable extends SharedAbstractDetailEdit ...@@ -30,14 +30,14 @@ export class AdminInstitutionDetailEditRoutable extends SharedAbstractDetailEdit
@Select(AdminInstitutionState.isLoadingWithDependency) isLoadingWithDependencyObs: Observable<boolean>; @Select(AdminInstitutionState.isLoadingWithDependency) isLoadingWithDependencyObs: Observable<boolean>;
@Select(AdminInstitutionState.isReadyToBeDisplayed) isReadyToBeDisplayedObs: 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, constructor(protected _store: Store,
protected route: ActivatedRoute, protected _route: ActivatedRoute,
protected readonly _actions$: Actions, protected readonly _actions$: Actions,
protected readonly _changeDetector: ChangeDetectorRef, protected readonly _changeDetector: ChangeDetectorRef,
public dialog: MatDialog) { public _dialog: MatDialog) {
super(_store, route, _actions$, _changeDetector, dialog, LocalStateEnum.admin_institution, adminInstitutionActionNameSpace, LocalStateEnum.admin); super(_store, _route, _actions$, _changeDetector, _dialog, LocalStateEnum.admin_institution, adminInstitutionActionNameSpace, LocalStateEnum.admin);
} }
getSubResourceWithParentId(id: string): void { getSubResourceWithParentId(id: string): void {
......
...@@ -5,9 +5,13 @@ import { ...@@ -5,9 +5,13 @@ import {
ChangeDetectorRef, ChangeDetectorRef,
Component, Component,
} from "@angular/core"; } from "@angular/core";
import {MatDialog} from "@angular/material/dialog";
import {ActivatedRoute} from "@angular/router"; import {ActivatedRoute} from "@angular/router";
import {Institution} from "@app/generated-api"; 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 {SharedAbstractListRoutable} from "@shared/components/routables/shared-abstract-list/shared-abstract-list.routable";
import {FieldTypeEnum} from "@shared/enums/field-type.enum"; import {FieldTypeEnum} from "@shared/enums/field-type.enum";
import {LocalStateEnum} from "@shared/enums/local-state.enum"; import {LocalStateEnum} from "@shared/enums/local-state.enum";
...@@ -26,11 +30,22 @@ export class AdminInstitutionListRoutable extends SharedAbstractListRoutable<Ins ...@@ -26,11 +30,22 @@ export class AdminInstitutionListRoutable extends SharedAbstractListRoutable<Ins
readonly KEY_CREATE_BUTTON: string = TRANSLATE("admin.institution.button.new"); readonly KEY_CREATE_BUTTON: string = TRANSLATE("admin.institution.button.new");
readonly KEY_REFRESH_BUTTON: string = TRANSLATE("admin.institution.button.refresh"); readonly KEY_REFRESH_BUTTON: string = TRANSLATE("admin.institution.button.refresh");
readonly KEY_BACK_BUTTON: string | undefined = TRANSLATE("admin.button.goBackToAdminHome"); 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, conditionDisplayDeleteButton(model: Institution | undefined): boolean {
protected _changeDetector: ChangeDetectorRef, return true;
protected _route: ActivatedRoute) {
super(store, _changeDetector, _route, LocalStateEnum.admin_institution, adminInstitutionActionNameSpace, {}, LocalStateEnum.admin);
} }
defineColumns(): void { defineColumns(): void {
......
...@@ -4,87 +4,103 @@ ...@@ -4,87 +4,103 @@
> >
<div class="two-columns-wrapper"> <div class="two-columns-wrapper">
<div class="left-part"> <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> <mat-label>{{'admin.license.form.title' | translate}}</mat-label>
<input matInput <input matInput
[formControlName]="formDefinition.title" [solidifyValidation]="errors"
[required]="isRequired(formDefinition.title)" [formControl]="fd"
[required]="formValidationHelper.hasRequiredField(fd)"
> >
<mat-error *ngIf="getFormControl(formDefinition.title).invalid">{{'required' | translate}}</mat-error> <mat-error #errors></mat-error>
<mat-error *ngFor="let error of getFormControl(formDefinition.title).errors?.errorsFromBackend">{{error}}</mat-error>
</mat-form-field> </mat-form-field>
<mat-form-field> <mat-form-field *ngIf="getFormControl(formDefinition.openLicenseId) as fd">
<mat-label>{{'admin.license.form.openLicenseId' | translate}}</mat-label> <mat-label>{{'admin.license.form.openLicenseId' | translate}}</mat-label>
<input matInput <input matInput
[formControlName]="formDefinition.openLicenseId" [solidifyValidation]="errors"
[required]="isRequired(formDefinition.openLicenseId)" [formControl]="fd"
[required]="formValidationHelper.hasRequiredField(fd)"
(blur)="checkAvailable(formDefinition.openLicenseId, fd)"
> >
<mat-error *ngIf="getFormControl(formDefinition.openLicenseId).invalid">{{'required' | translate}}</mat-error> <mat-error #errors></mat-error>
<mat-error *ngFor="let error of getFormControl(formDefinition.openLicenseId).errors?.errorsFromBackend">{{error}}</mat-error>
</mat-form-field> </mat-form-field>
<mat-form-field> <mat-form-field *ngIf="getFormControl(formDefinition.url) as fd">
<mat-label>{{'admin.license.form.url' | translate}}</mat-label> <mat-label>{{'admin.license.form.url' | translate}}</mat-label>
<input matInput <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> <mat-form-field *ngIf="getFormControl(formDefinition.odConformance) as fd">
<mat-label>{{'admin.license.form.odConformance' | translate}}</mat-label> <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" <mat-option *ngFor="let odConformance of licenseOdConformanceEnum"
[value]="odConformance" [value]="odConformance"
> >
{{odConformance}} {{odConformance}}
</mat-option> </mat-option>
</mat-select> </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> <mat-form-field *ngIf="getFormControl(formDefinition.osdConformance) as fd">
<mat-label>{{'admin.license.form.osdConformance' | translate}}</mat-label> <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" <mat-option *ngFor="let osdConformance of licenseOsdConformanceEnum"
[value]="osdConformance" [value]="osdConformance"
> >
{{osdConformance}} {{osdConformance}}
</mat-option> </mat-option>
</mat-select> </mat-select>
<mat-error *ngFor="let error of getFormControl(formDefinition.osdConformance).errors?.errorsFromBackend">{{error}}</mat-error> <mat-error #errors></mat-error>
</mat-form-field> </mat-form-field>
</div> </div>
<div class="right-part"> <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> <mat-label>{{'admin.license.form.maintainer' | translate}}</mat-label>
<input matInput <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> <mat-form-field *ngIf="getFormControl(formDefinition.status) as fd">
<mat-label>{{'admin.license.form.status' | translate}}</mat-label> <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" <mat-option *ngFor="let status of licensesStatusEnum"
[value]="status" [value]="status"
> >
{{status}} {{status}}
</mat-option> </mat-option>
</mat-select> </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-form-field>
<mat-checkbox [formControlName]="formDefinition.isGeneric">{{'admin.license.form.isGeneric' | translate }}</mat-checkbox> <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> <mat-label>{{'admin.license.form.family' | translate}}</mat-label>
<input matInput <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-form-field>
<mat-checkbox [formControlName]="formDefinition.domainContent">{{'admin.license.form.domainContent' | translate }}</mat-checkbox> <mat-checkbox [formControlName]="formDefinition.domainContent">{{'admin.license.form.domainContent' | translate }}</mat-checkbox>
......