From f20569ea8226d159ad3873675c9533f320452ebc Mon Sep 17 00:00:00 2001 From: theresa Date: Fri, 3 May 2024 15:30:02 +0200 Subject: [PATCH] #3327: added further components, implemented ways of translation --- mdm-frontend/package-lock.json | 54 ++++++ mdm-frontend/package.json | 5 +- mdm-frontend/src/app/app.component.ts | 6 +- mdm-frontend/src/app/app.module.ts | 23 ++- .../assignee-status-badge.component.ts | 2 +- .../current-project.service.spec.ts | 16 -- .../current-project.service.ts | 41 ---- .../dataacquisitionprojectmanagement.data.ts | 2 +- ...dataacquisitionprojectmanagement.module.ts | 14 +- .../state-card/state-card.component.css | 4 + .../state-card/state-card.component.html | 23 +++ .../state-card/state-card.component.spec.ts | 21 +++ .../state-card/state-card.component.ts | 175 ++++++++++++++++++ .../project-cockpit.component.html | 82 +++++++- .../project-cockpit.component.ts | 81 ++++++-- .../release-button.component.ts | 5 +- .../common/toolbar/toolbar.controller.js | 5 + .../legacy/common/toolbar/toolbar.html.tmpl | 6 +- ...sition-project-navbar-module.controller.js | 10 +- .../src/app/translate/translate.module.ts | 29 +++ mdm-frontend/src/assets/i18n/de.json | 15 ++ mdm-frontend/src/assets/i18n/en.json | 15 ++ mdm-frontend/src/locale/messages.en.json | 12 ++ mdm-frontend/src/locale/messages.json | 12 ++ mdm-frontend/tsconfig.app.json | 4 +- mdm-frontend/tsconfig.spec.json | 3 +- 26 files changed, 576 insertions(+), 89 deletions(-) delete mode 100644 mdm-frontend/src/app/dataacquisitionprojectmanagement/current-project.service.spec.ts delete mode 100644 mdm-frontend/src/app/dataacquisitionprojectmanagement/current-project.service.ts create mode 100644 mdm-frontend/src/app/dataacquisitionprojectmanagement/project-cockpit/components/state-card/state-card.component.css create mode 100644 mdm-frontend/src/app/dataacquisitionprojectmanagement/project-cockpit/components/state-card/state-card.component.html create mode 100644 mdm-frontend/src/app/dataacquisitionprojectmanagement/project-cockpit/components/state-card/state-card.component.spec.ts create mode 100644 mdm-frontend/src/app/dataacquisitionprojectmanagement/project-cockpit/components/state-card/state-card.component.ts create mode 100644 mdm-frontend/src/app/translate/translate.module.ts create mode 100644 mdm-frontend/src/assets/i18n/de.json create mode 100644 mdm-frontend/src/assets/i18n/en.json create mode 100644 mdm-frontend/src/locale/messages.en.json create mode 100644 mdm-frontend/src/locale/messages.json diff --git a/mdm-frontend/package-lock.json b/mdm-frontend/package-lock.json index cce14ccd9c..44f0851fa7 100644 --- a/mdm-frontend/package-lock.json +++ b/mdm-frontend/package-lock.json @@ -20,6 +20,8 @@ "@angular/router": "^16.1.5", "@angular/upgrade": "^16.1.5", "@citation-js/plugin-doi": "0.5.4", + "@ngx-translate/core": "^15.0.0", + "@ngx-translate/http-loader": "^8.0.0", "angular": "1.8.2", "angular-animate": "1.8.2", "angular-aria": "1.8.2", @@ -511,6 +513,31 @@ "rxjs": "^6.5.3 || ^7.4.0" } }, + "node_modules/@angular/localize": { + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-16.1.5.tgz", + "integrity": "sha512-8ApTdmv4sH0VbW9kVNanze5DEmb3OPIGzbD19jzvUSb6mTVMfUcQrsf4h+H8+cT+epBhor8RgVeVbUJaUbaLNQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@babel/core": "7.22.5", + "fast-glob": "3.2.12", + "yargs": "^17.2.1" + }, + "bin": { + "localize-extract": "tools/bundles/src/extract/cli.js", + "localize-migrate": "tools/bundles/src/migrate/cli.js", + "localize-translate": "tools/bundles/src/translate/cli.js" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/compiler": "16.1.5", + "@angular/compiler-cli": "16.1.5" + } + }, "node_modules/@angular/material": { "version": "16.2.14", "resolved": "https://registry.npmjs.org/@angular/material/-/material-16.2.14.tgz", @@ -4002,6 +4029,33 @@ "webpack": "^5.54.0" } }, + "node_modules/@ngx-translate/core": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-15.0.0.tgz", + "integrity": "sha512-Am5uiuR0bOOxyoercDnAA3rJVizo4RRqJHo8N3RqJ+XfzVP/I845yEnMADykOHvM6HkVm4SZSnJBOiz0Anx5BA==", + "engines": { + "node": "^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/common": ">=16.0.0", + "@angular/core": ">=16.0.0", + "rxjs": "^6.5.5 || ^7.4.0" + } + }, + "node_modules/@ngx-translate/http-loader": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@ngx-translate/http-loader/-/http-loader-8.0.0.tgz", + "integrity": "sha512-SFMsdUcmHF5OdZkL1CHEoSAwbP5EbAOPTLLboOCRRoOg21P4GJx+51jxGdJeGve6LSKLf4Pay7BkTwmE6vxYlg==", + "engines": { + "node": "^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/common": ">=16.0.0", + "@angular/core": ">=16.0.0", + "@ngx-translate/core": ">=15.0.0", + "rxjs": "^6.5.5 || ^7.4.0" + } + }, "node_modules/@nicolo-ribaudo/semver-v6": { "version": "6.3.3", "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz", diff --git a/mdm-frontend/package.json b/mdm-frontend/package.json index 08cf32643f..5dc8fd3c99 100644 --- a/mdm-frontend/package.json +++ b/mdm-frontend/package.json @@ -6,7 +6,8 @@ "start": "ng serve --proxy-config proxy.conf.json", "build": "ng build", "watch": "ng build --watch --configuration development", - "test": "ng test" + "test": "ng test", + "i18n:extract": "ng extract-i18n --output-path='src/locale' --format=json" }, "private": true, "dependencies": { @@ -22,6 +23,8 @@ "@angular/router": "^16.1.5", "@angular/upgrade": "^16.1.5", "@citation-js/plugin-doi": "0.5.4", + "@ngx-translate/core": "^15.0.0", + "@ngx-translate/http-loader": "^8.0.0", "angular": "1.8.2", "angular-animate": "1.8.2", "angular-aria": "1.8.2", diff --git a/mdm-frontend/src/app/app.component.ts b/mdm-frontend/src/app/app.component.ts index 075642b119..23ba61a76d 100644 --- a/mdm-frontend/src/app/app.component.ts +++ b/mdm-frontend/src/app/app.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, Inject } from '@angular/core'; @Component({ selector: 'app-root', @@ -7,4 +7,8 @@ import { Component } from '@angular/core'; }) export class AppComponent { title = 'mdm-frontend'; + localesList = [ + { code: 'en', label: 'English' }, + { code: 'de', label: 'Deutsch' } + ]; } diff --git a/mdm-frontend/src/app/app.module.ts b/mdm-frontend/src/app/app.module.ts index 01bbdea217..bd78a48d61 100644 --- a/mdm-frontend/src/app/app.module.ts +++ b/mdm-frontend/src/app/app.module.ts @@ -22,7 +22,28 @@ import { DataacquisitionprojectmanagementModule } from './dataacquisitionproject UpgradeModule, DataacquisitionprojectmanagementModule ], - // providers: [], + providers: [ + { + provide: 'CommonDialogsService', + useFactory: ($injector: any) => $injector.get('CommonDialogsService'), + deps: ['$injector'] + }, + { + provide: 'SearchDao', + useFactory: ($injector: any) => $injector.get('SearchDao'), + deps: ['$injector'] + }, + { + provide: 'ProjectSaveService', + useFactory: ($injector: any) => $injector.get('ProjectSaveService'), + deps: ['$injector'] + }, + { + provide: 'CurrentProjectService', + useFactory: ($injector: any) => $injector.get('CurrentProjectService'), + deps: ['$injector'] + } + ], // bootstrap: [AppComponent] }) export class AppModule implements DoBootstrap { diff --git a/mdm-frontend/src/app/dataacquisitionprojectmanagement/assignee-status-badge/assignee-status-badge.component.ts b/mdm-frontend/src/app/dataacquisitionprojectmanagement/assignee-status-badge/assignee-status-badge.component.ts index 00a5a8e195..1ea8f98339 100644 --- a/mdm-frontend/src/app/dataacquisitionprojectmanagement/assignee-status-badge/assignee-status-badge.component.ts +++ b/mdm-frontend/src/app/dataacquisitionprojectmanagement/assignee-status-badge/assignee-status-badge.component.ts @@ -13,7 +13,7 @@ export class AssigneeStatusBadgeComponent implements OnInit { publishersAssigned = false; ngOnInit(): void { - if(this.assigneeGroup && this.assigneeGroup === "PUBLISHERS") { + if(this.assigneeGroup && this.assigneeGroup === "PUBLISHER") { this.publishersAssigned = true; } else { this.publishersAssigned = false; diff --git a/mdm-frontend/src/app/dataacquisitionprojectmanagement/current-project.service.spec.ts b/mdm-frontend/src/app/dataacquisitionprojectmanagement/current-project.service.spec.ts deleted file mode 100644 index 98a8aef16e..0000000000 --- a/mdm-frontend/src/app/dataacquisitionprojectmanagement/current-project.service.spec.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { CurrentProjectService } from './current-project.service'; - -describe('CurrentProjectService', () => { - let service: CurrentProjectService; - - beforeEach(() => { - TestBed.configureTestingModule({}); - service = TestBed.inject(CurrentProjectService); - }); - - it('should be created', () => { - expect(service).toBeTruthy(); - }); -}); diff --git a/mdm-frontend/src/app/dataacquisitionprojectmanagement/current-project.service.ts b/mdm-frontend/src/app/dataacquisitionprojectmanagement/current-project.service.ts deleted file mode 100644 index 7b7a834f75..0000000000 --- a/mdm-frontend/src/app/dataacquisitionprojectmanagement/current-project.service.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { EventEmitter, Injectable, Output } from '@angular/core'; -import { DataAcquisitionProject } from './data/dataacquisitionprojectmanagement.data'; - -/** - * Service to get and set the current project - */ -@Injectable({ - providedIn: 'root' -}) -export class CurrentProjectService { - - @Output() currentProjectChanged = new EventEmitter(); - - private currentProject : DataAcquisitionProject | undefined; - - constructor() { } - - /** - * Getter for current project - * @returns the current project - */ - getCurrentProject() { - return this.currentProject; - } - - /** - * Setter for current project - * @param chosenProject - */ - setCurrentProject(chosenProject: DataAcquisitionProject) { - if (this.currentProject && this.currentProject!.id != chosenProject.id) { - this.currentProject = chosenProject; - if (this.currentProject) { - localStorage.setItem("currentProject", JSON.stringify(this.currentProject)); - } else { - localStorage.removeItem("currentProject") - } - this.currentProjectChanged.emit(this.currentProject); - } - } -} diff --git a/mdm-frontend/src/app/dataacquisitionprojectmanagement/data/dataacquisitionprojectmanagement.data.ts b/mdm-frontend/src/app/dataacquisitionprojectmanagement/data/dataacquisitionprojectmanagement.data.ts index 7b4cfaa88c..6f973a4d78 100644 --- a/mdm-frontend/src/app/dataacquisitionprojectmanagement/data/dataacquisitionprojectmanagement.data.ts +++ b/mdm-frontend/src/app/dataacquisitionprojectmanagement/data/dataacquisitionprojectmanagement.data.ts @@ -47,7 +47,7 @@ export interface ProjectRequirements { export interface ProjectPartState { publisherReady: boolean; - dataproviderReady: boolean; + dataProviderReady: boolean; } export interface Release { diff --git a/mdm-frontend/src/app/dataacquisitionprojectmanagement/dataacquisitionprojectmanagement.module.ts b/mdm-frontend/src/app/dataacquisitionprojectmanagement/dataacquisitionprojectmanagement.module.ts index 83d582d31e..457d59ac6c 100644 --- a/mdm-frontend/src/app/dataacquisitionprojectmanagement/dataacquisitionprojectmanagement.module.ts +++ b/mdm-frontend/src/app/dataacquisitionprojectmanagement/dataacquisitionprojectmanagement.module.ts @@ -1,4 +1,4 @@ -import { Injector, NgModule } from '@angular/core'; +import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { DataacquisitionprojectSearchService } from './dataacquisitionproject.search.service'; import { UpgradeModule } from '@angular/upgrade/static'; @@ -15,6 +15,10 @@ import { HttpClientModule } from '@angular/common/http'; import { ReleaseStatusBadgeComponent } from './release-status-badge/release-status-badge.component'; import { AssigneeStatusBadgeComponent } from './assignee-status-badge/assignee-status-badge.component'; import { ReleaseButtonComponent } from './release-button/release-button.component'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { StateCardComponent } from './project-cockpit/components/state-card/state-card.component'; +import { FormsModule } from '@angular/forms'; +import { NgxTranslateModule } from '../translate/translate.module'; @@ -23,7 +27,8 @@ import { ReleaseButtonComponent } from './release-button/release-button.componen ProjectCockpitComponent, ReleaseStatusBadgeComponent, AssigneeStatusBadgeComponent, - ReleaseButtonComponent + ReleaseButtonComponent, + StateCardComponent ], imports: [ CommonModule, @@ -35,7 +40,10 @@ import { ReleaseButtonComponent } from './release-button/release-button.componen MatChipsModule, MatButtonModule, MatTooltipModule, - HttpClientModule + MatCheckboxModule, + HttpClientModule, + FormsModule, + NgxTranslateModule ], providers: [ DataacquisitionprojectSearchService, diff --git a/mdm-frontend/src/app/dataacquisitionprojectmanagement/project-cockpit/components/state-card/state-card.component.css b/mdm-frontend/src/app/dataacquisitionprojectmanagement/project-cockpit/components/state-card/state-card.component.css new file mode 100644 index 0000000000..c6914e45dd --- /dev/null +++ b/mdm-frontend/src/app/dataacquisitionprojectmanagement/project-cockpit/components/state-card/state-card.component.css @@ -0,0 +1,4 @@ +.state-card { + background-color: white; + box-shadow: 2px 2px 3px #c3c3c3; +} \ No newline at end of file diff --git a/mdm-frontend/src/app/dataacquisitionprojectmanagement/project-cockpit/components/state-card/state-card.component.html b/mdm-frontend/src/app/dataacquisitionprojectmanagement/project-cockpit/components/state-card/state-card.component.html new file mode 100644 index 0000000000..313f4838a9 --- /dev/null +++ b/mdm-frontend/src/app/dataacquisitionprojectmanagement/project-cockpit/components/state-card/state-card.component.html @@ -0,0 +1,23 @@ + + + + + + {{'test.title.'+type | translate }} ({{counts}}) + + + +
+ Datengeber:innen fertig + Publisher fertig +
+
+ + + + +
\ No newline at end of file diff --git a/mdm-frontend/src/app/dataacquisitionprojectmanagement/project-cockpit/components/state-card/state-card.component.spec.ts b/mdm-frontend/src/app/dataacquisitionprojectmanagement/project-cockpit/components/state-card/state-card.component.spec.ts new file mode 100644 index 0000000000..01c53d4ce8 --- /dev/null +++ b/mdm-frontend/src/app/dataacquisitionprojectmanagement/project-cockpit/components/state-card/state-card.component.spec.ts @@ -0,0 +1,21 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { StateCardComponent } from './state-card.component'; + +describe('StateCardComponent', () => { + let component: StateCardComponent; + let fixture: ComponentFixture; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [StateCardComponent] + }); + fixture = TestBed.createComponent(StateCardComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/mdm-frontend/src/app/dataacquisitionprojectmanagement/project-cockpit/components/state-card/state-card.component.ts b/mdm-frontend/src/app/dataacquisitionprojectmanagement/project-cockpit/components/state-card/state-card.component.ts new file mode 100644 index 0000000000..544658d298 --- /dev/null +++ b/mdm-frontend/src/app/dataacquisitionprojectmanagement/project-cockpit/components/state-card/state-card.component.ts @@ -0,0 +1,175 @@ +import { Component, EventEmitter, Inject, Input, OnInit, Output } from '@angular/core'; +import { MatCheckboxChange } from '@angular/material/checkbox'; +import { TranslateService } from '@ngx-translate/core'; +import { IRootScopeService } from 'angular'; +import { DataAcquisitionProject } from 'src/app/dataacquisitionprojectmanagement/data/dataacquisitionprojectmanagement.data'; + +@Component({ + selector: 'fdz-state-card', + templateUrl: './state-card.component.html', + styleUrls: ['./state-card.component.css'] +}) +export class StateCardComponent implements OnInit { + @Input() type!: string; + @Input() counts!: number; + @Input() project!: DataAcquisitionProject; + @Output() projectChange = new EventEmitter(); + + createState: string = ""; + searchState: string = ""; + tooltip: string = ""; + deleteTooltip: string = ""; + editTooltip: string = ""; + icon: string = ""; + limit = 1; + + dataProviderReady: boolean = false; + publisherReady: boolean = false; + + ngOnInit(): void { + switch (this.type) { + case 'dataPackages': + this.createState = 'dataPackageCreate'; + this.searchState = 'data_packages'; + this.tooltip = 'search-management.buttons.' + + 'create-data-package-tooltip'; + this.deleteTooltip = 'search-management.buttons.' + + 'delete-all-data-packages-tooltip'; + this.limit = 1; + this.dataProviderReady = this.project.configuration.dataPackagesState!.dataProviderReady; + this.publisherReady = this.project.configuration.dataPackagesState!.publisherReady; + break; + case 'analysisPackages': + this.createState = 'analysisPackageCreate'; + this.searchState = 'analysis_packages'; + this.tooltip = 'search-management.buttons.' + + 'create-analysis-package-tooltip'; + this.editTooltip = 'search-management.buttons.' + + 'edit-analysis-package-tooltip'; + this.deleteTooltip = 'search-management.buttons.' + + 'delete-all-analysis-packages-tooltip'; + this.limit = 1; + this.dataProviderReady = this.project.configuration.analysisPackagesState!.dataProviderReady; + this.publisherReady = this.project.configuration.analysisPackagesState!.publisherReady; + break; + case 'surveys': + this.createState = 'surveyCreate'; + this.searchState = this.type; + this.tooltip = 'search-management.buttons.create-survey-tooltip'; + this.deleteTooltip = 'search-management.buttons.' + + 'delete-all-surveys-tooltip'; + this.editTooltip = 'search-management.buttons.' + + 'edit-surveys-tooltip'; + this.dataProviderReady = this.project.configuration.surveysState!.dataProviderReady; + this.publisherReady = this.project.configuration.surveysState!.publisherReady; + break; + case 'instruments': + this.createState = 'instrumentCreate'; + this.searchState = this.type; + this.tooltip = 'search-management.buttons.' + + 'create-instrument-tooltip'; + this.deleteTooltip = 'search-management.buttons.' + + 'delete-all-instruments-tooltip'; + this.editTooltip = 'search-management.buttons.' + + 'edit-instruments-tooltip'; + this.dataProviderReady = this.project.configuration.instrumentsState!.dataProviderReady; + this.publisherReady = this.project.configuration.instrumentsState!.publisherReady; + break; + case 'questions': + this.createState = ''; + // this.uploadFunction = function(files) { + // QuestionUploadService.uploadQuestions(files, this.project.id); + // }.bind(this); + this.searchState = this.type; + this.tooltip = 'search-management.buttons.' + + 'upload-questions-tooltip'; + this.deleteTooltip = 'search-management.buttons.' + + 'delete-all-questions-tooltip'; + break; + case 'dataSets': + this.createState = 'dataSetCreate'; + this.searchState = 'data_sets'; + this.tooltip = 'search-management.buttons.' + + 'create-data-set-tooltip'; + this.deleteTooltip = 'search-management.buttons.' + + 'delete-all-data-sets-tooltip'; + this.editTooltip = 'search-management.buttons.' + + 'edit-data-sets-tooltip'; + this.dataProviderReady = this.project.configuration.datasetsState ? this.project.configuration.datasetsState.dataProviderReady : false; + this.publisherReady = this.project.configuration.datasetsState ? this.project.configuration.datasetsState.publisherReady : false; + break; + case 'variables': + this.createState = ''; + // this.uploadFunction = function(files) { + // VariableUploadService.uploadVariables(files, this.project.id); + // }.bind(this); + this.searchState = this.type; + this.tooltip = 'search-management.buttons.' + + 'upload-variables-tooltip'; + this.deleteTooltip = 'search-management.buttons.' + + 'delete-all-variables-tooltip'; + break; + case 'publications': + this.icon = 'assets/images/icons/related-publication.svg'; + this.createState = ''; + this.searchState = 'related_publications'; + this.tooltip = 'search-management.buttons.' + + 'edit-publications-tooltip'; + break; + case 'concepts': + this.icon = 'assets/images/icons/related-publication.svg'; + this.createState = 'conceptCreate'; + this.searchState = 'concepts'; + this.tooltip = 'search-management.buttons.' + + 'create-concept-tooltip'; + this.editTooltip = 'search-management.buttons.' + + 'edit-concepts-tooltip'; + break; + case 'fake1': + break; + default: + throw Error('wrong argument for group'); + } + } + + onDataProviderStateChanged(value: MatCheckboxChange) { + console.log(value); + switch (this.type) { + case 'dataPackages': + this.project.configuration.dataPackagesState!.dataProviderReady = value.checked; + break; + case 'analysisPackages': + this.project.configuration.analysisPackagesState!.dataProviderReady = value.checked; + break; + case 'surveys': + this.project.configuration.surveysState!.dataProviderReady = value.checked; + break; + case 'instruments': + this.project.configuration.instrumentsState!.dataProviderReady = value.checked; + break; + case 'questions': + console.log("TODO") + // this.project.configuration.!.dataProviderReady = value.checked; + break; + case 'dataSets': + this.project.configuration.datasetsState!.dataProviderReady = value.checked; + break; + case 'variables': + console.log("TODO") + // this.project.configuration.!.dataProviderReady = value.checked; + break; + case 'publications': + console.log("TODO") + // this.project.configuration.!.dataProviderReady = value.checked; + break; + case 'concepts': + console.log("TODO") + // this.project.configuration.!.dataProviderReady = value.checked; + break; + default: + console.error("Case not implemented") + } + this.dataProviderReady = value.checked; + this.projectChange.emit(this.project); + } +} diff --git a/mdm-frontend/src/app/dataacquisitionprojectmanagement/project-cockpit/project-cockpit.component.html b/mdm-frontend/src/app/dataacquisitionprojectmanagement/project-cockpit/project-cockpit.component.html index eb8b63088d..3d74c50f5c 100644 --- a/mdm-frontend/src/app/dataacquisitionprojectmanagement/project-cockpit/project-cockpit.component.html +++ b/mdm-frontend/src/app/dataacquisitionprojectmanagement/project-cockpit/project-cockpit.component.html @@ -2,13 +2,13 @@
-

- Projekt-Cockpit +

+

Projekt-Cockpit

{{current.id}}

-
+

Kein Projekt ausgewählt

@@ -20,7 +20,7 @@

info Status -
+
@@ -62,6 +62,80 @@

+
+ + + + + + + + + + + + + + + + + + + +
diff --git a/mdm-frontend/src/app/dataacquisitionprojectmanagement/project-cockpit/project-cockpit.component.ts b/mdm-frontend/src/app/dataacquisitionprojectmanagement/project-cockpit/project-cockpit.component.ts index 76d016b778..6c8bbb09de 100644 --- a/mdm-frontend/src/app/dataacquisitionprojectmanagement/project-cockpit/project-cockpit.component.ts +++ b/mdm-frontend/src/app/dataacquisitionprojectmanagement/project-cockpit/project-cockpit.component.ts @@ -1,8 +1,10 @@ import { Component, OnInit, Input, Inject } from '@angular/core'; import { downgradeComponent, getAngularJSGlobal } from '@angular/upgrade/static'; import { DataacquisitionprojectDataService } from '../dataacquisitionproject.data.service'; -import { CurrentProjectService } from '../current-project.service'; import { DataAcquisitionProject } from '../data/dataacquisitionprojectmanagement.data'; +import { Router } from '@angular/router'; +import { IRootScopeService } from 'angular'; +import { TranslateService } from '@ngx-translate/core'; @Component({ selector: 'fdz-project-cockpit', @@ -12,18 +14,35 @@ import { DataAcquisitionProject } from '../data/dataacquisitionprojectmanagement export class ProjectCockpitComponent implements OnInit { @Input({ required: true }) id!: string; - // todo input for project - project = { - id: "dummy" - } - current! : DataAcquisitionProject; selectedTabIndex = 0; - constructor(private dataService: DataacquisitionprojectDataService, - private currentProjectService: CurrentProjectService) { - + // counts! : {[key: string]: number|undefined}; + counts : {key: string, count: number}[] = []; + count: number | undefined; + + requiredParts : string[] = []; + + + constructor( + private dataService: DataacquisitionprojectDataService, + private router: Router, + // private currentProjectService: CurrentProjectService, + @Inject("CurrentProjectService") private currentProjectService: any, + @Inject("CommonDialogsService") private dialogsService: any, + @Inject("SearchDao") private searchDaoService: any, + @Inject("ProjectSaveService") private projectSaveService: any, + @Inject("$rootScope") private _rootScope: IRootScopeService, + private translate: TranslateService) { + _rootScope.$on('current-project-changed', (event, project) => { + this.current = project; + router.navigateByUrl("/de/cockpit/"+project.id); + }); + _rootScope.$on('switched-language', (event, langCode) => { + console.log("HELLOO", langCode); + this.translate.use(langCode); + }); } ngOnInit(): void { @@ -31,10 +50,11 @@ export class ProjectCockpitComponent implements OnInit { if(this.id) { this.dataService.fetchProjectById(this.id).then(project => { this.current = project; - console.log("CURRENT",this.current.assigneeGroup); + console.log("CURRENT",this.current); // todo: prüfen ob das an der Stelle Sinn macht - this.currentProjectService.setCurrentProject(this.current) + this.currentProjectService.setCurrentProject(this.current); }); + this.fetchTypeCounts(this.id); } } catch (error) { console.error("Unable to fetch project data for id " + this.id); @@ -43,6 +63,45 @@ export class ProjectCockpitComponent implements OnInit { onSelectedTabChanged(tabIndex: number): void { console.log("New Tab Index", this.selectedTabIndex) + // return this.dialogsService.showConfirmOnDirtyDialog(); + } + + fetchTypeCounts(projectId: string): void { + const dataTypes = [ + 'variables', 'questions', 'data_sets', 'surveys', 'instruments', + 'data_packages', 'analysis_packages', 'related_publications', + 'concepts'] + this.searchDaoService.search('', 1, projectId, {}, undefined, 0, undefined).then( + (d: any) => { + for (const type of dataTypes) { + let buckets : ({ key: any; doc_count:number}[]) = d.aggregations.countByType.buckets; + let b = buckets.find(b => b.key === type); + if (b) { + this.counts.push({key: type, count: b.doc_count ? b.doc_count : 0}); + } + } + } + ); + } + + getCountForType(type: string): number { + if (!this.counts) { + return 0; + } + let count = this.counts.find(c => c.key === type)?.count; + return count ? count : 0; + } + + /** + * Handles changes of metadata. + * @param project + */ + onProjectPartStateChanged(project: DataAcquisitionProject): void { + console.log("CHANGES IN PROJECT") + this.current = project; + this.projectSaveService.prepareProjectForSave(this.current); + this.projectSaveService.saveProject(this.current); + } } diff --git a/mdm-frontend/src/app/dataacquisitionprojectmanagement/release-button/release-button.component.ts b/mdm-frontend/src/app/dataacquisitionprojectmanagement/release-button/release-button.component.ts index 3b162ab0b9..5bb9f30287 100644 --- a/mdm-frontend/src/app/dataacquisitionprojectmanagement/release-button/release-button.component.ts +++ b/mdm-frontend/src/app/dataacquisitionprojectmanagement/release-button/release-button.component.ts @@ -1,6 +1,5 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, Inject, OnInit } from '@angular/core'; import { DataAcquisitionProject } from '../data/dataacquisitionprojectmanagement.data'; -import { CurrentProjectService } from '../current-project.service'; @Component({ selector: 'fdz-release-button', @@ -11,7 +10,7 @@ export class ReleaseButtonComponent implements OnInit { project! : DataAcquisitionProject | undefined; - constructor(private currentProjectService: CurrentProjectService) { + constructor(@Inject("CurrentProjectService") private currentProjectService: any,) { } diff --git a/mdm-frontend/src/app/legacy/common/toolbar/toolbar.controller.js b/mdm-frontend/src/app/legacy/common/toolbar/toolbar.controller.js index eca3346860..635d027521 100644 --- a/mdm-frontend/src/app/legacy/common/toolbar/toolbar.controller.js +++ b/mdm-frontend/src/app/legacy/common/toolbar/toolbar.controller.js @@ -145,4 +145,9 @@ angular.module('metadatamanagementApp').controller( ($scope.productsCount && $scope.isAuthenticated() && Principal.isDataprovider()); }; + + $scope.switchedLanguage = function(langCode) { + console.log("switched", langCode) + $rootScope.$broadcast('switched-language', langCode) + } }]); diff --git a/mdm-frontend/src/app/legacy/common/toolbar/toolbar.html.tmpl b/mdm-frontend/src/app/legacy/common/toolbar/toolbar.html.tmpl index 43e0123796..43d1af4930 100644 --- a/mdm-frontend/src/app/legacy/common/toolbar/toolbar.html.tmpl +++ b/mdm-frontend/src/app/legacy/common/toolbar/toolbar.html.tmpl @@ -67,7 +67,8 @@ id="changeLanguageToEn" lang="en" rel="alternate" ng-if="currentLanguage!='en'" - ui-sref="({lang:'en'})" hreflang="en"> + ui-sref="({lang:'en'})" hreflang="en" + ng-click="switchedLanguage('en')"> EN @@ -79,7 +80,8 @@ id="changeLanguageToDe" lang="de" rel="alternate" ng-if="currentLanguage!='de'" - ui-sref="({lang:'de'})" hreflang="de"> + ui-sref="({lang:'de'})" hreflang="de" + ng-click="switchedLanguage('de')"> DE diff --git a/mdm-frontend/src/app/legacy/dataacquisitionprojectmanagement/directives/data-acquisition-project-navbar-module.controller.js b/mdm-frontend/src/app/legacy/dataacquisitionprojectmanagement/directives/data-acquisition-project-navbar-module.controller.js index 8039decd63..c6d16f69f6 100644 --- a/mdm-frontend/src/app/legacy/dataacquisitionprojectmanagement/directives/data-acquisition-project-navbar-module.controller.js +++ b/mdm-frontend/src/app/legacy/dataacquisitionprojectmanagement/directives/data-acquisition-project-navbar-module.controller.js @@ -88,8 +88,14 @@ angular.module('metadatamanagementApp') id: project.id }); ctrl.selectedProject = project; - CurrentProjectService.setCurrentProject(project); - $state.go('project-cockpit', { + currentProjectService.setCurrentProject(project); + // $state.go('project-cockpit', { + // id: ctrl.selectedProject.id, + // lang: LanguageService.getCurrentInstantly(), + // tab: 'config'}, + // {inherit: false} + // ); + $state.go('cockpit', { id: ctrl.selectedProject.id, lang: LanguageService.getCurrentInstantly(), tab: 'config'}, diff --git a/mdm-frontend/src/app/translate/translate.module.ts b/mdm-frontend/src/app/translate/translate.module.ts new file mode 100644 index 0000000000..b26f8a489a --- /dev/null +++ b/mdm-frontend/src/app/translate/translate.module.ts @@ -0,0 +1,29 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { HttpClient, HttpClientModule } from '@angular/common/http'; +import { TranslateHttpLoader } from '@ngx-translate/http-loader'; +import { TranslateModule, TranslateLoader } from '@ngx-translate/core'; + +export function HttpLoaderFactory(http: HttpClient) { + return new TranslateHttpLoader(http, + './assets/i18n/', + '.json'); +} + +@NgModule({ + declarations: [], + imports: [ + CommonModule, + HttpClientModule, + TranslateModule.forRoot({ + defaultLanguage: 'de', + loader: { + provide: TranslateLoader, + useFactory: HttpLoaderFactory, + deps: [HttpClient], + }, + }), + ], + exports: [TranslateModule], +}) +export class NgxTranslateModule { } diff --git a/mdm-frontend/src/assets/i18n/de.json b/mdm-frontend/src/assets/i18n/de.json new file mode 100644 index 0000000000..bd3fa03c1a --- /dev/null +++ b/mdm-frontend/src/assets/i18n/de.json @@ -0,0 +1,15 @@ +{ + "test": { + "title": { + "dataPackages": "Datenpaket", + "variables": "Variable", + "analysisPackages": "Analysepaket", + "concepts": "Konzept", + "instruments": "Instrument", + "dataSets": "Datensatz", + "surveys": "Erhebung", + "publications": "Publikation", + "questions": "Fragen" + } + } +} \ No newline at end of file diff --git a/mdm-frontend/src/assets/i18n/en.json b/mdm-frontend/src/assets/i18n/en.json new file mode 100644 index 0000000000..aa6977f9c6 --- /dev/null +++ b/mdm-frontend/src/assets/i18n/en.json @@ -0,0 +1,15 @@ +{ + "test": { + "title": { + "dataPackages": "Data Package", + "variables": "Variable", + "analysisPackages": "Analysis Package", + "concepts": "Concept", + "instruments": "Instrument", + "dataSets": "Dataset", + "surveys": "Survey", + "publications": "Publication", + "questions": "Questions" + } + } +} \ No newline at end of file diff --git a/mdm-frontend/src/locale/messages.en.json b/mdm-frontend/src/locale/messages.en.json new file mode 100644 index 0000000000..17251d45fa --- /dev/null +++ b/mdm-frontend/src/locale/messages.en.json @@ -0,0 +1,12 @@ +{ + "locale": "en-US", + "translations": { + "state-card.card-title": "{VAR_SELECT, select, dataPackages {Data Packages} variables {Variables}}", + "state-card-provider-ready": "Dataprovider ready", + "state-card-publisher-ready": "Publisher ready", + "state-card-delete-btn": " Delete ", + "state-card-edit-btn": " Edit ", + "cockpit-title": "Project Cockpit", + "cockpit-no-project": "{$START_PARAGRAPH}No project selected{$CLOSE_PARAGRAPH}" + } +} \ No newline at end of file diff --git a/mdm-frontend/src/locale/messages.json b/mdm-frontend/src/locale/messages.json new file mode 100644 index 0000000000..47d3712884 --- /dev/null +++ b/mdm-frontend/src/locale/messages.json @@ -0,0 +1,12 @@ +{ + "locale": "en-US", + "translations": { + "state-card.card-title": "{VAR_SELECT, select, dataPackages {Datenpakete} variables {Variablen}}", + "state-card-provider-ready": "Datengeber:innen fertig", + "state-card-publisher-ready": "Publisher fertig", + "state-card-delete-btn": " Löschen ", + "state-card-edit-btn": " Bearbeiten ", + "cockpit-title": "Projekt-Cockpit", + "cockpit-no-project": "{$START_PARAGRAPH}Kein Projekt ausgewählt{$CLOSE_PARAGRAPH}" + } +} \ No newline at end of file diff --git a/mdm-frontend/tsconfig.app.json b/mdm-frontend/tsconfig.app.json index 374cc9d294..ec26f7034c 100644 --- a/mdm-frontend/tsconfig.app.json +++ b/mdm-frontend/tsconfig.app.json @@ -3,7 +3,9 @@ "extends": "./tsconfig.json", "compilerOptions": { "outDir": "./out-tsc/app", - "types": [] + "types": [ + "@angular/localize" + ] }, "files": [ "src/main.ts" diff --git a/mdm-frontend/tsconfig.spec.json b/mdm-frontend/tsconfig.spec.json index be7e9da76f..c63b6982a6 100644 --- a/mdm-frontend/tsconfig.spec.json +++ b/mdm-frontend/tsconfig.spec.json @@ -4,7 +4,8 @@ "compilerOptions": { "outDir": "./out-tsc/spec", "types": [ - "jasmine" + "jasmine", + "@angular/localize" ] }, "include": [