From 5d0b823d9cf48a126706794e1454f02c59abf06f Mon Sep 17 00:00:00 2001 From: NazarMykhalkevych Date: Mon, 22 Sep 2025 15:50:50 +0300 Subject: [PATCH 1/5] fix(draft): registries select component --- .../registries/components/review/review.component.ts | 4 +++- .../select-components-dialog.component.html | 8 +++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/app/features/registries/components/review/review.component.ts b/src/app/features/registries/components/review/review.component.ts index 491700644..3538ce8ca 100644 --- a/src/app/features/registries/components/review/review.component.ts +++ b/src/app/features/registries/components/review/review.component.ts @@ -164,7 +164,9 @@ export class ReviewComponent { }, }) .onClose.subscribe((selectedComponents) => { - this.openConfirmRegistrationDialog(selectedComponents); + if (selectedComponents) { + this.openConfirmRegistrationDialog(selectedComponents); + } }); } diff --git a/src/app/features/registries/components/select-components-dialog/select-components-dialog.component.html b/src/app/features/registries/components/select-components-dialog/select-components-dialog.component.html index 4b55e05b6..334e43284 100644 --- a/src/app/features/registries/components/select-components-dialog/select-components-dialog.component.html +++ b/src/app/features/registries/components/select-components-dialog/select-components-dialog.component.html @@ -1,6 +1,12 @@

{{ 'registries.review.selectComponents.description' | translate }}

- +
Date: Tue, 23 Sep 2025 00:36:22 +0300 Subject: [PATCH 2/5] fix(stepper): update stepper validation --- .../custom-step/custom-step.component.ts | 10 ++--- .../components/drafts/drafts.component.ts | 37 ++++++++++++++---- .../justification-step.component.html | 2 +- .../justification-step.component.ts | 7 ++-- ...registries-metadata-step.component.spec.ts | 2 +- .../registries-metadata-step.component.ts | 17 +++----- .../components/review/review.component.ts | 14 +++++-- .../justification/justification.component.ts | 39 ++++++++++++------- .../registries/store/registries.actions.ts | 5 ++- .../registries/store/registries.model.ts | 4 +- .../registries/store/registries.selectors.ts | 4 +- .../registries/store/registries.state.ts | 12 +++--- .../files-tree/files-tree.component.ts | 4 +- .../components/stepper/stepper.component.html | 4 +- .../components/stepper/stepper.component.ts | 19 +++++++++ src/app/shared/models/step-option.model.ts | 1 + 16 files changed, 118 insertions(+), 63 deletions(-) diff --git a/src/app/features/registries/components/custom-step/custom-step.component.ts b/src/app/features/registries/components/custom-step/custom-step.component.ts index e32768270..fd8e32b75 100644 --- a/src/app/features/registries/components/custom-step/custom-step.component.ts +++ b/src/app/features/registries/components/custom-step/custom-step.component.ts @@ -36,7 +36,7 @@ import { FilePayloadJsonApi, OsfFile, PageSchema } from '@osf/shared/models'; import { ToastService } from '@osf/shared/services'; import { FilesMapper } from '../../mappers/files.mapper'; -import { RegistriesSelectors, SetUpdatedFields, UpdateStepValidation } from '../../store'; +import { RegistriesSelectors, SetUpdatedFields, UpdateStepState } from '../../store'; import { FilesControlComponent } from '../files-control/files-control.component'; @Component({ @@ -82,10 +82,10 @@ export class CustomStepComponent implements OnDestroy { readonly pages = select(RegistriesSelectors.getPagesSchema); readonly FieldType = FieldType; - readonly stepsValidation = select(RegistriesSelectors.getStepsValidation); + readonly stepsState = select(RegistriesSelectors.getStepsState); readonly actions = createDispatchMap({ - updateStepValidation: UpdateStepValidation, + updateStepState: UpdateStepState, setUpdatedFields: SetUpdatedFields, }); @@ -159,7 +159,7 @@ export class CustomStepComponent implements OnDestroy { this.stepForm.addControl(controlName, control); }); - if (this.stepsValidation()?.[this.step()]?.invalid) { + if (this.stepsState()?.[this.step()]?.invalid) { this.stepForm.markAllAsTouched(); } } @@ -176,7 +176,7 @@ export class CustomStepComponent implements OnDestroy { if (this.stepForm) { this.updateDraft(); this.stepForm.markAllAsTouched(); - this.actions.updateStepValidation(this.step(), this.stepForm.invalid); + this.actions.updateStepState(this.step(), this.stepForm.invalid, true); } } diff --git a/src/app/features/registries/components/drafts/drafts.component.ts b/src/app/features/registries/components/drafts/drafts.component.ts index 7c30dc25c..80a1cb964 100644 --- a/src/app/features/registries/components/drafts/drafts.component.ts +++ b/src/app/features/registries/components/drafts/drafts.component.ts @@ -4,7 +4,17 @@ import { TranslatePipe, TranslateService } from '@ngx-translate/core'; import { filter, tap } from 'rxjs'; -import { ChangeDetectionStrategy, Component, computed, effect, inject, OnDestroy, Signal, signal } from '@angular/core'; +import { + ChangeDetectionStrategy, + Component, + computed, + effect, + inject, + OnDestroy, + Signal, + signal, + untracked, +} from '@angular/core'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { ActivatedRoute, NavigationEnd, Router, RouterOutlet } from '@angular/router'; @@ -20,7 +30,7 @@ import { } from '@osf/shared/stores'; import { DEFAULT_STEPS } from '../../constants'; -import { ClearState, FetchDraft, FetchSchemaBlocks, RegistriesSelectors, UpdateStepValidation } from '../../store'; +import { ClearState, FetchDraft, FetchSchemaBlocks, RegistriesSelectors, UpdateStepState } from '../../store'; @Component({ selector: 'osf-drafts', @@ -38,7 +48,7 @@ export class DraftsComponent implements OnDestroy { readonly pages = select(RegistriesSelectors.getPagesSchema); readonly draftRegistration = select(RegistriesSelectors.getDraftRegistration); - stepsValidation = select(RegistriesSelectors.getStepsValidation); + stepsState = select(RegistriesSelectors.getStepsState); readonly stepsData = select(RegistriesSelectors.getStepsData); selectedSubjects = select(SubjectsSelectors.getSelectedSubjects); initialContributors = select(ContributorsSelectors.getContributors); @@ -48,7 +58,7 @@ export class DraftsComponent implements OnDestroy { private readonly actions = createDispatchMap({ getSchemaBlocks: FetchSchemaBlocks, getDraftRegistration: FetchDraft, - updateStepValidation: UpdateStepValidation, + updateStepState: UpdateStepState, clearState: ClearState, getContributors: GetAllContributors, getSubjects: FetchSelectedSubjects, @@ -73,19 +83,29 @@ export class DraftsComponent implements OnDestroy { isLoaded = false; steps: Signal = computed(() => { + const stepState = this.stepsState(); + const stepData = this.stepsData(); this.defaultSteps = DEFAULT_STEPS.map((step) => ({ ...step, label: this.translateService.instant(step.label), - invalid: this.stepsValidation()?.[step.index]?.invalid || false, + invalid: stepState?.[step.index]?.invalid || false, })); + this.defaultSteps[0].invalid = this.isMetaDataInvalid(); const customSteps = this.pages().map((page, index) => { + const pageStep = this.pages()[index]; + const wasTouched = + pageStep?.questions?.some((question) => { + const questionData = stepData[question.responseKey!]; + return Array.isArray(questionData) ? questionData.length : questionData; + }) || false; return { index: index + 1, label: page.title, value: page.id, routeLink: `${index + 1}`, - invalid: this.stepsValidation()?.[index + 1]?.invalid || false, + invalid: stepState?.[index + 1]?.invalid || false, + touched: stepState?.[index + 1]?.touched || wasTouched, }; }); return [ @@ -156,8 +176,9 @@ export class DraftsComponent implements OnDestroy { }); effect(() => { + const stepState = untracked(() => this.stepsState()); if (this.currentStepIndex() > 0) { - this.actions.updateStepValidation('0', this.isMetaDataInvalid()); + this.actions.updateStepState('0', this.isMetaDataInvalid(), stepState?.[0]?.touched || false); } if (this.pages().length && this.currentStepIndex() > 0 && this.stepsData()) { for (let i = 1; i < this.currentStepIndex(); i++) { @@ -167,7 +188,7 @@ export class DraftsComponent implements OnDestroy { const questionData = this.stepsData()[question.responseKey!]; return question.required && (Array.isArray(questionData) ? !questionData.length : !questionData); }) || false; - this.actions.updateStepValidation(i.toString(), isStepInvalid); + this.actions.updateStepState(i.toString(), isStepInvalid, stepState?.[i]?.touched || false); } } }); diff --git a/src/app/features/registries/components/justification-step/justification-step.component.html b/src/app/features/registries/components/justification-step/justification-step.component.html index a833891e3..e1265453e 100644 --- a/src/app/features/registries/components/justification-step/justification-step.component.html +++ b/src/app/features/registries/components/justification-step/justification-step.component.html @@ -1,4 +1,4 @@ -
+

{{ 'registries.justification.title' | translate }}

diff --git a/src/app/features/registries/components/justification-step/justification-step.component.ts b/src/app/features/registries/components/justification-step/justification-step.component.ts index cfdb8315b..19f780e26 100644 --- a/src/app/features/registries/components/justification-step/justification-step.component.ts +++ b/src/app/features/registries/components/justification-step/justification-step.component.ts @@ -21,7 +21,7 @@ import { DeleteSchemaResponse, RegistriesSelectors, UpdateSchemaResponse, - UpdateStepValidation, + UpdateStepState, } from '../../store'; @Component({ @@ -39,11 +39,12 @@ export class JustificationStepComponent implements OnDestroy { private readonly toastService = inject(ToastService); readonly schemaResponse = select(RegistriesSelectors.getSchemaResponse); + readonly stepsState = select(RegistriesSelectors.getStepsState); readonly INPUT_VALIDATION_MESSAGES = INPUT_VALIDATION_MESSAGES; actions = createDispatchMap({ - updateStepValidation: UpdateStepValidation, + updateStepState: UpdateStepState, updateRevision: UpdateSchemaResponse, deleteSchemaResponse: DeleteSchemaResponse, clearState: ClearState, @@ -106,7 +107,7 @@ export class JustificationStepComponent implements OnDestroy { ngOnDestroy(): void { if (!this.isDraftDeleted) { - this.actions.updateStepValidation('0', this.justificationForm.invalid); + this.actions.updateStepState('0', this.justificationForm.invalid, true); const changes = findChangedFields( { justification: this.justificationForm.value.justification! }, { justification: this.schemaResponse()?.revisionJustification } diff --git a/src/app/features/registries/components/registries-metadata-step/registries-metadata-step.component.spec.ts b/src/app/features/registries/components/registries-metadata-step/registries-metadata-step.component.spec.ts index 0233d74c1..8422c23c6 100644 --- a/src/app/features/registries/components/registries-metadata-step/registries-metadata-step.component.spec.ts +++ b/src/app/features/registries/components/registries-metadata-step/registries-metadata-step.component.spec.ts @@ -39,7 +39,7 @@ describe('RegistriesMetadataStepComponent', () => { switch (selector) { case RegistriesSelectors.getDraftRegistration: return () => MOCK_DRAFT_REGISTRATION; - case RegistriesSelectors.getStepsValidation: + case RegistriesSelectors.getStepsState: return () => []; case ContributorsSelectors.getContributors: return () => []; diff --git a/src/app/features/registries/components/registries-metadata-step/registries-metadata-step.component.ts b/src/app/features/registries/components/registries-metadata-step/registries-metadata-step.component.ts index 209169044..4f86c1a0c 100644 --- a/src/app/features/registries/components/registries-metadata-step/registries-metadata-step.component.ts +++ b/src/app/features/registries/components/registries-metadata-step/registries-metadata-step.component.ts @@ -13,13 +13,6 @@ import { ChangeDetectionStrategy, Component, effect, inject, OnDestroy } from '@ import { FormBuilder, ReactiveFormsModule, Validators } from '@angular/forms'; import { ActivatedRoute, Router } from '@angular/router'; -import { - ClearState, - DeleteDraft, - RegistriesSelectors, - UpdateDraft, - UpdateStepValidation, -} from '@osf/features/registries/store'; import { TextInputComponent } from '@osf/shared/components'; import { INPUT_VALIDATION_MESSAGES } from '@osf/shared/constants'; import { CustomValidators, findChangedFields } from '@osf/shared/helpers'; @@ -27,6 +20,8 @@ import { ContributorModel, DraftRegistrationModel, SubjectModel } from '@osf/sha import { CustomConfirmationService } from '@osf/shared/services'; import { ContributorsSelectors, SubjectsSelectors } from '@osf/shared/stores'; +import { ClearState, DeleteDraft, RegistriesSelectors, UpdateDraft, UpdateStepState } from '../../store'; + import { RegistriesAffiliatedInstitutionComponent } from './registries-affiliated-institution/registries-affiliated-institution.component'; import { RegistriesContributorsComponent } from './registries-contributors/registries-contributors.component'; import { RegistriesLicenseComponent } from './registries-license/registries-license.component'; @@ -63,12 +58,12 @@ export class RegistriesMetadataStepComponent implements OnDestroy { readonly draftRegistration = select(RegistriesSelectors.getDraftRegistration); selectedSubjects = select(SubjectsSelectors.getSelectedSubjects); initialContributors = select(ContributorsSelectors.getContributors); - stepsValidation = select(RegistriesSelectors.getStepsValidation); + stepsState = select(RegistriesSelectors.getStepsState); actions = createDispatchMap({ deleteDraft: DeleteDraft, updateDraft: UpdateDraft, - updateStepValidation: UpdateStepValidation, + updateStepState: UpdateStepState, clearState: ClearState, }); @@ -107,7 +102,7 @@ export class RegistriesMetadataStepComponent implements OnDestroy { contributors: this.initialContributors(), subjects: this.selectedSubjects(), }); - if (this.stepsValidation()?.[0]?.invalid) { + if (this.stepsState()?.[0]?.invalid) { this.metadataForm.markAllAsTouched(); } } @@ -149,7 +144,7 @@ export class RegistriesMetadataStepComponent implements OnDestroy { ngOnDestroy(): void { if (!this.isDraftDeleted) { - this.actions.updateStepValidation('0', this.metadataForm.invalid); + this.actions.updateStepState('0', this.metadataForm.invalid, true); const changedFields = findChangedFields( { title: this.metadataForm.value.title!, description: this.metadataForm.value.description! }, { title: this.draftRegistration()?.title, description: this.draftRegistration()?.description } diff --git a/src/app/features/registries/components/review/review.component.ts b/src/app/features/registries/components/review/review.component.ts index 3538ce8ca..5862e1a80 100644 --- a/src/app/features/registries/components/review/review.component.ts +++ b/src/app/features/registries/components/review/review.component.ts @@ -28,7 +28,14 @@ import { SubjectsSelectors, } from '@osf/shared/stores'; -import { ClearState, DeleteDraft, FetchLicenses, FetchProjectChildren, RegistriesSelectors } from '../../store'; +import { + ClearState, + DeleteDraft, + FetchLicenses, + FetchProjectChildren, + RegistriesSelectors, + UpdateStepState, +} from '../../store'; import { ConfirmRegistrationDialogComponent } from '../confirm-registration-dialog/confirm-registration-dialog.component'; import { SelectComponentsDialogComponent } from '../select-components-dialog/select-components-dialog.component'; @@ -83,13 +90,14 @@ export class ReviewComponent { clearState: ClearState, getProjectsComponents: FetchProjectChildren, fetchLicenses: FetchLicenses, + updateStepState: UpdateStepState, }); private readonly draftId = toSignal(this.route.params.pipe(map((params) => params['id'])) ?? of(undefined)); - stepsValidation = select(RegistriesSelectors.getStepsValidation); + stepsState = select(RegistriesSelectors.getStepsState); - isDraftInvalid = computed(() => Object.values(this.stepsValidation()).some((step) => step.invalid)); + isDraftInvalid = computed(() => Object.values(this.stepsState()).some((step) => step.invalid)); licenseOptionsRecord = computed(() => (this.draftRegistration()?.license.options ?? {}) as Record); diff --git a/src/app/features/registries/pages/justification/justification.component.ts b/src/app/features/registries/pages/justification/justification.component.ts index cb200fdbf..d73a2aa32 100644 --- a/src/app/features/registries/pages/justification/justification.component.ts +++ b/src/app/features/registries/pages/justification/justification.component.ts @@ -4,7 +4,17 @@ import { TranslatePipe, TranslateService } from '@ngx-translate/core'; import { filter, tap } from 'rxjs'; -import { ChangeDetectionStrategy, Component, computed, effect, inject, OnDestroy, Signal, signal } from '@angular/core'; +import { + ChangeDetectionStrategy, + Component, + computed, + effect, + inject, + OnDestroy, + Signal, + signal, + untracked, +} from '@angular/core'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { ActivatedRoute, NavigationEnd, Router, RouterOutlet } from '@angular/router'; @@ -13,13 +23,7 @@ import { RevisionReviewStates } from '@osf/shared/enums'; import { StepOption } from '@osf/shared/models'; import { LoaderService } from '@osf/shared/services'; -import { - ClearState, - FetchSchemaBlocks, - FetchSchemaResponse, - RegistriesSelectors, - UpdateStepValidation, -} from '../../store'; +import { ClearState, FetchSchemaBlocks, FetchSchemaResponse, RegistriesSelectors, UpdateStepState } from '../../store'; @Component({ selector: 'osf-justification', @@ -36,7 +40,7 @@ export class JustificationComponent implements OnDestroy { private readonly loaderService = inject(LoaderService); private readonly translateService = inject(TranslateService); readonly pages = select(RegistriesSelectors.getPagesSchema); - readonly stepsValidation = select(RegistriesSelectors.getStepsValidation); + readonly stepsState = select(RegistriesSelectors.getStepsState); readonly schemaResponse = select(RegistriesSelectors.getSchemaResponse); readonly schemaResponseRevisionData = select(RegistriesSelectors.getSchemaResponseRevisionData); @@ -44,7 +48,7 @@ export class JustificationComponent implements OnDestroy { getSchemaBlocks: FetchSchemaBlocks, clearState: ClearState, getSchemaResponse: FetchSchemaResponse, - updateStepValidation: UpdateStepValidation, + updateStepState: UpdateStepState, }); get isReviewPage(): boolean { @@ -56,11 +60,13 @@ export class JustificationComponent implements OnDestroy { revisionId = this.route.snapshot.firstChild?.params['id'] || ''; steps: Signal = computed(() => { + const isJustificationValid = !!this.schemaResponse()?.revisionJustification; this.justificationStep = { index: 0, value: 'justification', label: this.translateService.instant('registries.justification.step'), - invalid: false, + invalid: !isJustificationValid, + touched: isJustificationValid, routeLink: 'justification', disabled: this.schemaResponse()?.reviewsState !== RevisionReviewStates.RevisionInProgress, }; @@ -72,14 +78,15 @@ export class JustificationComponent implements OnDestroy { invalid: false, routeLink: 'review', }; - + const stepState = this.stepsState(); const customSteps = this.pages().map((page, index) => { return { index: index + 1, label: page.title, value: page.id, routeLink: `${index + 1}`, - invalid: this.stepsValidation()?.[index + 1]?.invalid || false, + invalid: stepState?.[index + 1]?.invalid || false, + touched: stepState?.[index + 1]?.touched || false, disabled: this.schemaResponse()?.reviewsState !== RevisionReviewStates.RevisionInProgress, }; }); @@ -139,8 +146,10 @@ export class JustificationComponent implements OnDestroy { }); effect(() => { + const stepState = untracked(() => this.stepsState()); + if (this.currentStepIndex() > 0) { - this.actions.updateStepValidation('0', true); + this.actions.updateStepState('0', true, stepState?.[0]?.touched || false); } if (this.pages().length && this.currentStepIndex() > 0 && this.schemaResponseRevisionData()) { for (let i = 1; i < this.currentStepIndex(); i++) { @@ -150,7 +159,7 @@ export class JustificationComponent implements OnDestroy { const questionData = this.schemaResponseRevisionData()[question.responseKey!]; return question.required && (Array.isArray(questionData) ? !questionData.length : !questionData); }) || false; - this.actions.updateStepValidation(i.toString(), isStepInvalid); + this.actions.updateStepState(i.toString(), isStepInvalid, stepState?.[i]?.touched || false); } } }); diff --git a/src/app/features/registries/store/registries.actions.ts b/src/app/features/registries/store/registries.actions.ts index 79ef8dc4a..294804da3 100644 --- a/src/app/features/registries/store/registries.actions.ts +++ b/src/app/features/registries/store/registries.actions.ts @@ -78,11 +78,12 @@ export class SaveLicense { ) {} } -export class UpdateStepValidation { +export class UpdateStepState { static readonly type = '[Registries] Update Step Validation'; constructor( public step: string, - public invalid: boolean + public invalid: boolean, + public touched: boolean ) {} } diff --git a/src/app/features/registries/store/registries.model.ts b/src/app/features/registries/store/registries.model.ts index 22a99c7e6..f07e4b1ee 100644 --- a/src/app/features/registries/store/registries.model.ts +++ b/src/app/features/registries/store/registries.model.ts @@ -22,7 +22,7 @@ export interface RegistriesStateModel { registries: AsyncStateModel; licenses: AsyncStateModel; pagesSchema: AsyncStateModel; - stepsValidation: Record; + stepsState: Record; draftRegistrations: AsyncStateWithTotalCount; submittedRegistrations: AsyncStateWithTotalCount; files: AsyncStateWithTotalCount; @@ -65,7 +65,7 @@ export const REGISTRIES_STATE_DEFAULTS: RegistriesStateModel = { isLoading: false, error: null, }, - stepsValidation: {}, + stepsState: {}, registration: { data: null, isLoading: false, diff --git a/src/app/features/registries/store/registries.selectors.ts b/src/app/features/registries/store/registries.selectors.ts index 60d7f2035..55993bfd8 100644 --- a/src/app/features/registries/store/registries.selectors.ts +++ b/src/app/features/registries/store/registries.selectors.ts @@ -94,8 +94,8 @@ export class RegistriesSelectors { } @Selector([RegistriesState]) - static getStepsValidation(state: RegistriesStateModel): Record { - return state.stepsValidation; + static getStepsState(state: RegistriesStateModel): Record { + return state.stepsState; } @Selector([RegistriesState]) diff --git a/src/app/features/registries/store/registries.state.ts b/src/app/features/registries/store/registries.state.ts index d57cf7025..c8a771c00 100644 --- a/src/app/features/registries/store/registries.state.ts +++ b/src/app/features/registries/store/registries.state.ts @@ -43,7 +43,7 @@ import { SetUpdatedFields, UpdateDraft, UpdateSchemaResponse, - UpdateStepValidation, + UpdateStepState, } from './registries.actions'; import { REGISTRIES_STATE_DEFAULTS, RegistriesStateModel } from './registries.model'; @@ -260,13 +260,13 @@ export class RegistriesState { ); } - @Action(UpdateStepValidation) - updateStepValidation(ctx: StateContext, { step, invalid }: UpdateStepValidation) { + @Action(UpdateStepState) + updateStepState(ctx: StateContext, { step, invalid, touched }: UpdateStepState) { const state = ctx.getState(); ctx.patchState({ - stepsValidation: { - ...state.stepsValidation, - [step]: { invalid }, + stepsState: { + ...state.stepsState, + [step]: { invalid, touched }, }, }); } diff --git a/src/app/shared/components/files-tree/files-tree.component.ts b/src/app/shared/components/files-tree/files-tree.component.ts index 480e4a786..da7bcdaae 100644 --- a/src/app/shared/components/files-tree/files-tree.component.ts +++ b/src/app/shared/components/files-tree/files-tree.component.ts @@ -132,12 +132,12 @@ export class FilesTreeComponent implements OnDestroy, AfterViewInit { ngAfterViewInit(): void { if (!this.viewOnly()) { - this.dropZoneContainerRef()!.nativeElement.addEventListener('dragenter', this.dragEnterHandler); + this.dropZoneContainerRef()?.nativeElement?.addEventListener('dragenter', this.dragEnterHandler); } } ngOnDestroy(): void { - if (!this.viewOnly()) { + if (this.dropZoneContainerRef()?.nativeElement) { this.dropZoneContainerRef()!.nativeElement.removeEventListener('dragenter', this.dragEnterHandler); } } diff --git a/src/app/shared/components/stepper/stepper.component.html b/src/app/shared/components/stepper/stepper.component.html index 6e5549af5..2bc772455 100644 --- a/src/app/shared/components/stepper/stepper.component.html +++ b/src/app/shared/components/stepper/stepper.component.html @@ -5,7 +5,7 @@