diff --git a/src/app/features/deposit/components/routables/deposit-detail/deposit-detail.routable.html b/src/app/features/deposit/components/routables/deposit-detail/deposit-detail.routable.html index 798aa0783ebaab82ea9bfb675f21a0051aa38832..defb14f37ae2fa18fd0e75f87dc0295449149815 100644 --- a/src/app/features/deposit/components/routables/deposit-detail/deposit-detail.routable.html +++ b/src/app/features/deposit/components/routables/deposit-detail/deposit-detail.routable.html @@ -1,3 +1,9 @@ +<div *ngIf="!(isLoadingObs| async) && !(isLoadingDataFileObs | async) && !canSubmit(listDataFileObs | async)" + class="alert" +> + {{message| translate}} +</div> + <div class="button-toolbar"> <button *ngIf="(currentObs| async)?.status === statusEnum.INPROGRESS || (currentObs| async)?.status === statusEnum.INERROR" @@ -18,7 +24,7 @@ </button> <button *ngIf="(currentObs| async)?.status === statusEnum.INPROGRESS && formPresentational?.isValidWhenDisable - && (listDataFileObs | async) | allDataFileReady" + && canSubmit(listDataFileObs | async)" mat-flat-button color="primary" [disabled]="!(currentObs| async)" diff --git a/src/app/features/deposit/components/routables/deposit-detail/deposit-detail.routable.scss b/src/app/features/deposit/components/routables/deposit-detail/deposit-detail.routable.scss new file mode 100644 index 0000000000000000000000000000000000000000..cb0fa67a6b8ceae52acd892d4a7dd273ace6e5b4 --- /dev/null +++ b/src/app/features/deposit/components/routables/deposit-detail/deposit-detail.routable.scss @@ -0,0 +1,30 @@ +@import "../../../../../../sass/abstracts/variables"; +@import "../../../../../../sass/abstracts/mixins"; +@import "../../../../../shared/components/routables/shared-abstract-detail/shared-abstract-detail.routable.scss"; + +.alert { + background-color: $warning; + color: $white; + font-weight: bold; + text-align: center; + margin: -25px -25px 15px; + padding: 5px; + box-shadow: 0 5px 20px 0 rgba(0, 0, 0, 0.05); + animation: appear 1s; +} + + +@-webkit-keyframes appear { + 0% { + -webkit-transform: scaleY(0); + height: 0; + padding: 0; + opacity: 0; + display: none; + -webkit-animation-play-state: paused; + } + 100% { + -webkit-transform: scaleY(1); + opacity: 1; + } +} diff --git a/src/app/features/deposit/components/routables/deposit-detail/deposit-detail.routable.ts b/src/app/features/deposit/components/routables/deposit-detail/deposit-detail.routable.ts index 4701c717f27e615f03b1c0b7e5b1af7dbb4c63d0..3107f22fa073a911da9cecd573c0e95f9d315dfa 100644 --- a/src/app/features/deposit/components/routables/deposit-detail/deposit-detail.routable.ts +++ b/src/app/features/deposit/components/routables/deposit-detail/deposit-detail.routable.ts @@ -6,7 +6,10 @@ import { } from "@angular/core"; import {MatDialog} from "@angular/material"; import {ActivatedRoute} from "@angular/router"; -import {DepositDataFile} from "@app/features/deposit/models/deposit-data-file.model"; +import { + DepositDataFile, + DepositDataFileStateEnum, +} from "@app/features/deposit/models/deposit-data-file.model"; import {DepositExtended} from "@app/features/deposit/models/deposits-extended.model"; import {DepositDataFileAction} from "@app/features/deposit/stores/data-file/deposit-data-file.action"; import { @@ -37,6 +40,8 @@ import {Observable} from "rxjs"; import {tap} from "rxjs/internal/operators/tap"; import {take} from "rxjs/operators"; import { + isEmptyArray, + isNullOrUndefined, StoreUtil, TRANSLATE, } from "solidify-frontend"; @@ -44,11 +49,12 @@ import { @Component({ selector: "dlcm-deposit-detail-routable", templateUrl: "./deposit-detail.routable.html", - styleUrls: ["../../../../../shared/components/routables/shared-abstract-detail/shared-abstract-detail.routable.scss"], + styleUrls: ["./deposit-detail.routable.scss"], changeDetection: ChangeDetectionStrategy.OnPush, }) export class DepositDetailRoutable extends SharedAbstractDetailRoutable<DepositExtended, DepositStateModel> implements OnInit { @Select((state: LocalStateModel) => StoreUtil.isLoadingState(state.deposit.deposit_person)) isLoadingPersonObs: Observable<boolean>; + @Select((state: LocalStateModel) => StoreUtil.isLoadingState(state.deposit.deposit_dataFile)) isLoadingDataFileObs: Observable<boolean>; @Select((state: LocalStateModel) => state.shared.shared_language.list) languagesObs: Observable<Language[]>; @Select((state: LocalStateModel) => state.shared.shared_license.list) licensesObs: Observable<License[]>; @Select((state: LocalStateModel) => state.shared.shared_submissionPolicy.list) submissionPoliciesObs: Observable<SubmissionPolicy[]>; @@ -61,6 +67,8 @@ export class DepositDetailRoutable extends SharedAbstractDetailRoutable<DepositE @ViewChild("formPresentational", {static: false}) readonly formPresentational: DepositFormPresentational; + message: string; + readonly KEY_PARAM_NAME: string = "title"; readonly KEY_DELETE_BUTTON: string = TRANSLATE("deposit.delete"); readonly KEY_EDIT_BUTTON: string = TRANSLATE("deposit.edit"); @@ -80,6 +88,22 @@ export class DepositDetailRoutable extends SharedAbstractDetailRoutable<DepositE this.store.dispatch(new SharedOrgUnitAction.GetAll()); } + canSubmit(list: DepositDataFile[]): boolean { + if (isNullOrUndefined(list) || isEmptyArray(list)) { + this.message = TRANSLATE("deposit.error.noFile"); + return false; + } + + const result = !list.some(d => { + if (d.status === DepositDataFileStateEnum.IN_ERROR) { + this.message = TRANSLATE("deposit.error.fileInError"); + return true; + } + return false; + }); + return result; + } + getSubResourceWithParentId(id: string): void { this.store.dispatch(new DepositDataFileAction.GetAll(id)); this.store.dispatch(new DepositPersonAction.GetAll(id)); diff --git a/src/app/shared/components/routables/shared-abstract-detail/shared-abstract-detail.routable.scss b/src/app/shared/components/routables/shared-abstract-detail/shared-abstract-detail.routable.scss index f80d1a940ac6454dbd1ffc3286868e7c1b43125c..8f4a2c8eb3061e663a0d8e59901cb886f4db260d 100644 --- a/src/app/shared/components/routables/shared-abstract-detail/shared-abstract-detail.routable.scss +++ b/src/app/shared/components/routables/shared-abstract-detail/shared-abstract-detail.routable.scss @@ -1,4 +1,5 @@ @import "../../../../../sass/abstracts/variables"; +@import "../../../../../sass/abstracts/mixins"; @import "../shared-abstract-resource/shared-abstract-resource.routable"; .tab-content { diff --git a/src/app/shared/pipes/all-data-file-ready.pipe.ts b/src/app/shared/pipes/all-data-file-ready.pipe.ts deleted file mode 100644 index a339a655dfa3d43d2884fe5c4b3a569b92421ba6..0000000000000000000000000000000000000000 --- a/src/app/shared/pipes/all-data-file-ready.pipe.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { - Pipe, - PipeTransform, -} from "@angular/core"; -import { - DepositDataFile, - DepositDataFileStateEnum, -} from "@deposit/models/deposit-data-file.model"; -import {SharedAbstractPipe} from "@shared/pipes/shared-abstract/shared-abstract.pipe"; - -@Pipe({ - name: "allDataFileReady", -}) -export class AllDataFileReadyPipe extends SharedAbstractPipe implements PipeTransform { - transform(list: DepositDataFile[]): boolean { - if (list === undefined || list === null) { - return false; - } - if (list.length === 0) { - return false; - } - Array.from(list).forEach(d => { - if (d.status === DepositDataFileStateEnum.READY) { - return false; - } - }); - return true; - } -} diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index 6c6688810c8bde1674d455a8ec8345b10124a3d6..d3bdd89335e9f148a3f1bf537c6e613bf18f8c5b 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -26,7 +26,6 @@ import {library} from "@fortawesome/fontawesome-svg-core"; import {fas} from "@fortawesome/free-solid-svg-icons"; import {TranslateModule} from "@ngx-translate/core"; import {NgxsModule} from "@ngxs/store"; -import {AllDataFileReadyPipe} from "@shared/pipes/all-data-file-ready.pipe"; import {TableModule} from "primeng/table"; import {SolidifyFrontendModule} from "solidify-frontend"; import {SharedBreadcrumbPresentational} from "./components/presentationals/shared-breadcrumb/shared-breadcrumb.presentational"; @@ -43,10 +42,10 @@ const presentationals = [ SharedMultiSelectPresentational, SharedMultiSelectDefaultValuePresentational, SharedFieldErrorPresentational, - SharedErrorPresentational, + SharedErrorPresentational ]; const directives = [SharedValidationDirective]; -const pipes = [FileSizePipe, AllDataFileReadyPipe]; +const pipes = [FileSizePipe]; const modules = [ CommonModule, FormsModule, diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json index f9a515540b800121c2c063b1ef423c3db6f2baf5..3b48f2fc3ba2c2a7d4c2650b2d2e2459cff058f3 100644 --- a/src/assets/i18n/de.json +++ b/src/assets/i18n/de.json @@ -673,6 +673,10 @@ "datafiles": "Data Files", "details": "Details" }, + "error": { + "fileInError": "The data file has an Error", + "noFile": "You have to upload a file to submit the deposit" + }, "table": { "header": { "creation": { diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index f9a515540b800121c2c063b1ef423c3db6f2baf5..3b48f2fc3ba2c2a7d4c2650b2d2e2459cff058f3 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -673,6 +673,10 @@ "datafiles": "Data Files", "details": "Details" }, + "error": { + "fileInError": "The data file has an Error", + "noFile": "You have to upload a file to submit the deposit" + }, "table": { "header": { "creation": { diff --git a/src/assets/i18n/fr.json b/src/assets/i18n/fr.json index c71436bfbeeb342175b6f453210fd1e91fdb7294..33e7bfcd44a9de0102b39f5b790c4d57a5e9b4a4 100644 --- a/src/assets/i18n/fr.json +++ b/src/assets/i18n/fr.json @@ -673,6 +673,10 @@ "datafiles": "Fichiers", "details": "Détails" }, + "error": { + "fileInError": "Le fichier de données contient une erreur", + "noFile": "Vous devez télécharger un fichier pour pouvoir soumettre le dépôt" + }, "table": { "header": { "creation": {