fix(forms): Preventing double submit when double-clicking submit buttons. (TV-908)

Merge in TEA/mina-sidor-fa-web from bugfix/TV-908-prevent-double-submit to develop

Squashed commit of the following:

commit b9f0b803a97b104647c835e9244d845b4a6fb41a
Merge: 44fd4ff8 af4f6cbe
Author: Erik Tiekstra <erik.tiekstra@arbetsformedlingen.se>
Date:   Tue Nov 30 08:53:56 2021 +0100

    Merged develop and fixed conflicts

commit 44fd4ff8f3c58361b991142fad9c64bf6e13f329
Author: Erik Tiekstra <erik.tiekstra@arbetsformedlingen.se>
Date:   Mon Nov 29 11:51:35 2021 +0100

    Added custom selector to directive

commit 9c4a82556be3d78183cfa4a13413708876519643
Author: Erik Tiekstra <erik.tiekstra@arbetsformedlingen.se>
Date:   Mon Nov 29 10:43:45 2021 +0100

    Added directive to prevent double submit
This commit is contained in:
Erik Tiekstra
2021-11-30 08:55:53 +01:00
parent af4f6cbefc
commit d36701d102
29 changed files with 78 additions and 29 deletions

View File

@@ -17,10 +17,10 @@ import { AvropModule } from './pages/avrop/avrop.module';
registerLocaleData(localeSe); registerLocaleData(localeSe);
const providers: Provider[] = [ const providers: Provider[] = [
ApmErrorHandler, ApmErrorHandler,
{ provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true }, { provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true },
{ provide: LOCALE_ID, useValue: 'sv-SE' }, { provide: LOCALE_ID, useValue: 'sv-SE' },
]; ];
// Skip error handler in Dev until "Uncaught Error: ApplicationRef.tick is called recursively" is fixed // Skip error handler in Dev until "Uncaught Error: ApplicationRef.tick is called recursively" is fixed
if (environment.production) { if (environment.production) {
providers.push({ providers.push({

View File

@@ -123,7 +123,7 @@
<ui-link-button [uiRouterLink]="['/administration/personal', employee.id]" uiType="secondary"> <ui-link-button [uiRouterLink]="['/administration/personal', employee.id]" uiType="secondary">
Avbryt<span class="msfa__a11y-sr-only">&nbsp;redigering av personalkontot.</span> Avbryt<span class="msfa__a11y-sr-only">&nbsp;redigering av personalkontot.</span>
</ui-link-button> </ui-link-button>
<digi-button af-type="submit">Spara ändringar</digi-button> <digi-button af-type="submit" msfaPreventDoubleSubmit>Spara ändringar</digi-button>
</footer> </footer>
</form> </form>
</digi-typography> </digi-typography>

View File

@@ -3,25 +3,26 @@ import { DigiNgDialogModule } from '@af/digi-ng/_dialog/dialog';
import { DigiNgFormCheckboxModule } from '@af/digi-ng/_form/form-checkbox'; import { DigiNgFormCheckboxModule } from '@af/digi-ng/_form/form-checkbox';
import { DigiNgFormDatepickerModule } from '@af/digi-ng/_form/form-datepicker'; import { DigiNgFormDatepickerModule } from '@af/digi-ng/_form/form-datepicker';
import { DigiNgFormRadiobuttonGroupModule } from '@af/digi-ng/_form/form-radiobutton-group'; import { DigiNgFormRadiobuttonGroupModule } from '@af/digi-ng/_form/form-radiobutton-group';
import { DigiNgPopoverModule } from '@af/digi-ng/_popover/popover';
import { DigiNgLoaderSpinnerModule } from '@af/digi-ng/_loader/loader-spinner'; import { DigiNgLoaderSpinnerModule } from '@af/digi-ng/_loader/loader-spinner';
import { DigiNgPopoverModule } from '@af/digi-ng/_popover/popover';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { ReactiveFormsModule } from '@angular/forms'; import { ReactiveFormsModule } from '@angular/forms';
import { RouterModule } from '@angular/router'; import { RouterModule } from '@angular/router';
import { PreventDoubleSubmitModule } from '@msfa-directives/prevent-double-submit.module';
import { ErrorListModule } from '@msfa-shared/components/error-list/error-list.module'; import { ErrorListModule } from '@msfa-shared/components/error-list/error-list.module';
import { HideTextModule } from '@msfa-shared/components/hide-text/hide-text.module'; import { HideTextModule } from '@msfa-shared/components/hide-text/hide-text.module';
import { LayoutModule } from '@msfa-shared/components/layout/layout.module'; import { LayoutModule } from '@msfa-shared/components/layout/layout.module';
import { RolesDialogModule } from '@msfa-shared/components/roles-dialog/roles-dialog.module'; import { RolesDialogModule } from '@msfa-shared/components/roles-dialog/roles-dialog.module';
import { TreeNodesSelectorModule } from '@msfa-shared/components/tree-nodes-selector/tree-nodes-selector.module'; import { TreeNodesSelectorModule } from '@msfa-shared/components/tree-nodes-selector/tree-nodes-selector.module';
import { LocalDatePipeModule } from '@msfa-shared/pipes/local-date/local-date.module'; import { LocalDatePipeModule } from '@msfa-shared/pipes/local-date/local-date.module';
import { UiInputModule } from '@ui/input/input.module';
import { UiLinkButtonModule } from '@ui/link-button/link-button.module'; import { UiLinkButtonModule } from '@ui/link-button/link-button.module';
import { UiSelectModule } from '@ui/select/select.module';
import { UiSkeletonModule } from '@ui/skeleton/skeleton.module'; import { UiSkeletonModule } from '@ui/skeleton/skeleton.module';
import { EmployeeDeleteModule } from '../../components/employee-delete/employee-delete.module'; import { EmployeeDeleteModule } from '../../components/employee-delete/employee-delete.module';
import { EditEmployeeFormComponent } from './edit-employee-form/edit-employee-form.component'; import { EditEmployeeFormComponent } from './edit-employee-form/edit-employee-form.component';
import { EmployeeFormComponent } from './employee-form.component'; import { EmployeeFormComponent } from './employee-form.component';
import { UiSelectModule } from '@ui/select/select.module';
import { UiInputModule } from '@ui/input/input.module';
@NgModule({ @NgModule({
schemas: [CUSTOM_ELEMENTS_SCHEMA], schemas: [CUSTOM_ELEMENTS_SCHEMA],
@@ -48,6 +49,7 @@ import { UiInputModule } from '@ui/input/input.module';
RolesDialogModule, RolesDialogModule,
UiLinkButtonModule, UiLinkButtonModule,
UiInputModule, UiInputModule,
PreventDoubleSubmitModule,
], ],
}) })
export class EmployeeFormModule {} export class EmployeeFormModule {}

View File

@@ -74,7 +74,7 @@
</digi-notification-alert> </digi-notification-alert>
<footer class="employee-invite__footer"> <footer class="employee-invite__footer">
<digi-button af-size="m" af-type="submit">Skicka inbjudningslänk</digi-button> <digi-button af-size="m" af-type="submit" msfaPreventDoubleSubmit>Skicka inbjudningslänk</digi-button>
<ui-link-button uiRouterLink="../" uiType="secondary"> <ui-link-button uiRouterLink="../" uiType="secondary">
Avbryt<span class="msfa__a11y-sr-only">&nbsp;och gå tillbaka till personallistan</span> Avbryt<span class="msfa__a11y-sr-only">&nbsp;och gå tillbaka till personallistan</span>
</ui-link-button> </ui-link-button>

View File

@@ -2,6 +2,7 @@ import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { ReactiveFormsModule } from '@angular/forms'; import { ReactiveFormsModule } from '@angular/forms';
import { RouterModule } from '@angular/router'; import { RouterModule } from '@angular/router';
import { PreventDoubleSubmitModule } from '@msfa-directives/prevent-double-submit.module';
import { LayoutModule } from '@msfa-shared/components/layout/layout.module'; import { LayoutModule } from '@msfa-shared/components/layout/layout.module';
import { UiLinkButtonModule } from '@ui/link-button/link-button.module'; import { UiLinkButtonModule } from '@ui/link-button/link-button.module';
import { UiLoaderModule } from '@ui/loader/loader.module'; import { UiLoaderModule } from '@ui/loader/loader.module';
@@ -19,6 +20,7 @@ import { EmployeeInviteComponent } from './employee-invite.component';
UiTextareaModule, UiTextareaModule,
UiLoaderModule, UiLoaderModule,
UiLinkButtonModule, UiLinkButtonModule,
PreventDoubleSubmitModule,
], ],
}) })
export class EmployeeInviteModule {} export class EmployeeInviteModule {}

View File

@@ -83,7 +83,7 @@
</div> </div>
<div class="avvikelse-report-form__cta-wrapper"> <div class="avvikelse-report-form__cta-wrapper">
<digi-button af-type="submit" af-size="m">Förhandsgranska</digi-button> <digi-button af-type="submit" af-size="m" msfaPreventDoubleSubmit>Förhandsgranska</digi-button>
<ui-link-button uiRouterLink="../" uiType="secondary"> <ui-link-button uiRouterLink="../" uiType="secondary">
Avbryt Avbryt
<span class="msfa__a11y-sr-only">&nbsp;och gå tillbaka till deltagaren</span> <span class="msfa__a11y-sr-only">&nbsp;och gå tillbaka till deltagaren</span>

View File

@@ -7,18 +7,19 @@ import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { ReactiveFormsModule } from '@angular/forms'; import { ReactiveFormsModule } from '@angular/forms';
import { RouterModule } from '@angular/router'; import { RouterModule } from '@angular/router';
import { PreventDoubleSubmitModule } from '@msfa-directives/prevent-double-submit.module';
import { ConfirmDialogModule } from '@msfa-shared/components/confirm-dialog/confirm-dialog.module'; import { ConfirmDialogModule } from '@msfa-shared/components/confirm-dialog/confirm-dialog.module';
import { LayoutModule } from '@msfa-shared/components/layout/layout.module'; import { LayoutModule } from '@msfa-shared/components/layout/layout.module';
import { UiBackLinkModule } from '@ui/back-link/back-link.module'; import { UiBackLinkModule } from '@ui/back-link/back-link.module';
import { UiLinkButtonModule } from '@ui/link-button/link-button.module'; import { UiLinkButtonModule } from '@ui/link-button/link-button.module';
import { UiLoaderModule } from '@ui/loader/loader.module'; import { UiLoaderModule } from '@ui/loader/loader.module';
import { UiSelectModule } from '@ui/select/select.module';
import { UiSkeletonModule } from '@ui/skeleton/skeleton.module'; import { UiSkeletonModule } from '@ui/skeleton/skeleton.module';
import { UiTextareaModule } from '@ui/textarea/textarea.module'; import { UiTextareaModule } from '@ui/textarea/textarea.module';
import { ReportDescriptionListModule } from '../../../components/report-description-list/report-description-list.module'; import { ReportDescriptionListModule } from '../../../components/report-description-list/report-description-list.module';
import { ReportLayoutModule } from '../../../components/report-layout/report-layout.module'; import { ReportLayoutModule } from '../../../components/report-layout/report-layout.module';
import { AvvikelseReportFormComponent } from './avvikelse-report-form.component'; import { AvvikelseReportFormComponent } from './avvikelse-report-form.component';
import { AvvikelseReportFormService } from './avvikelse-report-form.service'; import { AvvikelseReportFormService } from './avvikelse-report-form.service';
import { UiSelectModule } from '@ui/select/select.module';
@NgModule({ @NgModule({
schemas: [CUSTOM_ELEMENTS_SCHEMA], schemas: [CUSTOM_ELEMENTS_SCHEMA],
@@ -42,6 +43,7 @@ import { UiSelectModule } from '@ui/select/select.module';
DigiNgDialogModule, DigiNgDialogModule,
UiTextareaModule, UiTextareaModule,
UiLinkButtonModule, UiLinkButtonModule,
PreventDoubleSubmitModule,
], ],
providers: [AvvikelseReportFormService], providers: [AvvikelseReportFormService],
exports: [AvvikelseReportFormComponent], exports: [AvvikelseReportFormComponent],

View File

@@ -164,7 +164,7 @@
<footer class="franvaro-report-form__footer"> <footer class="franvaro-report-form__footer">
<div class="franvaro-report-form__cta-wrapper"> <div class="franvaro-report-form__cta-wrapper">
<digi-button af-type="submit" af-size="m">Förhandsgranska</digi-button> <digi-button af-type="submit" af-size="m" msfaPreventDoubleSubmit>Förhandsgranska</digi-button>
<ui-link-button uiRouterLink="../" uiType="secondary"> <ui-link-button uiRouterLink="../" uiType="secondary">
Avbryt Avbryt
<span class="msfa__a11y-sr-only">&nbsp;och gå tillbaka till deltagaren</span> <span class="msfa__a11y-sr-only">&nbsp;och gå tillbaka till deltagaren</span>

View File

@@ -4,20 +4,21 @@ import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { ReactiveFormsModule } from '@angular/forms'; import { ReactiveFormsModule } from '@angular/forms';
import { RouterModule } from '@angular/router'; import { RouterModule } from '@angular/router';
import { PreventDoubleSubmitModule } from '@msfa-directives/prevent-double-submit.module';
import { LayoutModule } from '@msfa-shared/components/layout/layout.module'; import { LayoutModule } from '@msfa-shared/components/layout/layout.module';
import { UiBackLinkModule } from '@ui/back-link/back-link.module'; import { UiBackLinkModule } from '@ui/back-link/back-link.module';
import { UiInputModule } from '@ui/input/input.module';
import { UiLinkButtonModule } from '@ui/link-button/link-button.module'; import { UiLinkButtonModule } from '@ui/link-button/link-button.module';
import { UiLoaderModule } from '@ui/loader/loader.module'; import { UiLoaderModule } from '@ui/loader/loader.module';
import { UiRadiobuttonGroupModule } from '@ui/radiobutton-group/radiobutton-group.module'; import { UiRadiobuttonGroupModule } from '@ui/radiobutton-group/radiobutton-group.module';
import { UiSelectModule } from '@ui/select/select.module';
import { UiSkeletonModule } from '@ui/skeleton/skeleton.module'; import { UiSkeletonModule } from '@ui/skeleton/skeleton.module';
import { UiTextareaModule } from '@ui/textarea/textarea.module'; import { UiTextareaModule } from '@ui/textarea/textarea.module';
import { UiSelectModule } from '@ui/select/select.module';
import { UiValidationMessageModule } from '@ui/validation-message/validation-message.module'; import { UiValidationMessageModule } from '@ui/validation-message/validation-message.module';
import { ReportDescriptionListModule } from '../../../components/report-description-list/report-description-list.module'; import { ReportDescriptionListModule } from '../../../components/report-description-list/report-description-list.module';
import { ReportLayoutModule } from '../../../components/report-layout/report-layout.module'; import { ReportLayoutModule } from '../../../components/report-layout/report-layout.module';
import { FranvaroReportFormComponent } from './franvaro-report-form.component'; import { FranvaroReportFormComponent } from './franvaro-report-form.component';
import { FranvaroReportFormService } from './franvaro-report-form.service'; import { FranvaroReportFormService } from './franvaro-report-form.service';
import { UiInputModule } from '@ui/input/input.module';
@NgModule({ @NgModule({
schemas: [CUSTOM_ELEMENTS_SCHEMA], schemas: [CUSTOM_ELEMENTS_SCHEMA],
@@ -40,6 +41,7 @@ import { UiInputModule } from '@ui/input/input.module';
UiRadiobuttonGroupModule, UiRadiobuttonGroupModule,
UiLinkButtonModule, UiLinkButtonModule,
UiInputModule, UiInputModule,
PreventDoubleSubmitModule,
], ],
providers: [FranvaroReportFormService], providers: [FranvaroReportFormService],
exports: [FranvaroReportFormComponent], exports: [FranvaroReportFormComponent],

View File

@@ -82,7 +82,7 @@
<footer class="gemensam-planering-form__footer"> <footer class="gemensam-planering-form__footer">
<div class="gemensam-planering-form__cta-wrapper"> <div class="gemensam-planering-form__cta-wrapper">
<digi-button af-type="submit" af-size="m">Förhandsgranska</digi-button> <digi-button af-type="submit" af-size="m" msfaPreventDoubleSubmit>Förhandsgranska</digi-button>
<ui-link-button uiRouterLink="../" uiType="secondary"> <ui-link-button uiRouterLink="../" uiType="secondary">
Avbryt Avbryt
<span class="msfa__a11y-sr-only">&nbsp;och gå tillbaka till deltagaren</span> <span class="msfa__a11y-sr-only">&nbsp;och gå tillbaka till deltagaren</span>

View File

@@ -5,6 +5,7 @@ import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { ReactiveFormsModule } from '@angular/forms'; import { ReactiveFormsModule } from '@angular/forms';
import { RouterModule } from '@angular/router'; import { RouterModule } from '@angular/router';
import { PreventDoubleSubmitModule } from '@msfa-directives/prevent-double-submit.module';
import { LayoutModule } from '@msfa-shared/components/layout/layout.module'; import { LayoutModule } from '@msfa-shared/components/layout/layout.module';
import { UiBackLinkModule } from '@ui/back-link/back-link.module'; import { UiBackLinkModule } from '@ui/back-link/back-link.module';
import { UiLinkButtonModule } from '@ui/link-button/link-button.module'; import { UiLinkButtonModule } from '@ui/link-button/link-button.module';
@@ -36,6 +37,7 @@ import { GemensamPlaneringFormService } from './gemensam-planering-form.service'
DigiNgDialogModule, DigiNgDialogModule,
UiValidationMessageModule, UiValidationMessageModule,
UiLinkButtonModule, UiLinkButtonModule,
PreventDoubleSubmitModule,
], ],
providers: [GemensamPlaneringFormService], providers: [GemensamPlaneringFormService],
exports: [GemensamPlaneringFormComponent], exports: [GemensamPlaneringFormComponent],

View File

@@ -96,7 +96,7 @@
</div> </div>
<footer class="informativ-rapport-form__footer"> <footer class="informativ-rapport-form__footer">
<div class="informativ-rapport-form__cta-wrapper"> <div class="informativ-rapport-form__cta-wrapper">
<digi-button af-type="submit" af-size="m">Förhandsgranska</digi-button> <digi-button af-type="submit" af-size="m" msfaPreventDoubleSubmit>Förhandsgranska</digi-button>
<ui-link-button uiRouterLink="../" uiType="secondary"> <ui-link-button uiRouterLink="../" uiType="secondary">
Avbryt Avbryt
<span class="msfa__a11y-sr-only">&nbsp;och gå tillbaka till deltagaren</span> <span class="msfa__a11y-sr-only">&nbsp;och gå tillbaka till deltagaren</span>

View File

@@ -3,19 +3,20 @@ import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { ReactiveFormsModule } from '@angular/forms'; import { ReactiveFormsModule } from '@angular/forms';
import { RouterModule } from '@angular/router'; import { RouterModule } from '@angular/router';
import { PreventDoubleSubmitModule } from '@msfa-directives/prevent-double-submit.module';
import { ConfirmDialogModule } from '@msfa-shared/components/confirm-dialog/confirm-dialog.module'; import { ConfirmDialogModule } from '@msfa-shared/components/confirm-dialog/confirm-dialog.module';
import { LayoutModule } from '@msfa-shared/components/layout/layout.module'; import { LayoutModule } from '@msfa-shared/components/layout/layout.module';
import { UiBackLinkModule } from '@ui/back-link/back-link.module'; import { UiBackLinkModule } from '@ui/back-link/back-link.module';
import { UiFileUploadModule } from '@ui/file-upload/file-upload.module';
import { UiLinkButtonModule } from '@ui/link-button/link-button.module'; import { UiLinkButtonModule } from '@ui/link-button/link-button.module';
import { UiLoaderModule } from '@ui/loader/loader.module';
import { UiSelectModule } from '@ui/select/select.module';
import { UiSkeletonModule } from '@ui/skeleton/skeleton.module'; import { UiSkeletonModule } from '@ui/skeleton/skeleton.module';
import { UiTextareaModule } from '@ui/textarea/textarea.module'; import { UiTextareaModule } from '@ui/textarea/textarea.module';
import { ReportDescriptionListModule } from '../../../components/report-description-list/report-description-list.module'; import { ReportDescriptionListModule } from '../../../components/report-description-list/report-description-list.module';
import { ReportLayoutModule } from '../../../components/report-layout/report-layout.module'; import { ReportLayoutModule } from '../../../components/report-layout/report-layout.module';
import { InformativRapportFormComponent } from './informativ-rapport-form.component'; import { InformativRapportFormComponent } from './informativ-rapport-form.component';
import { InformativRapportFormService } from './informativ-rapport-form.service'; import { InformativRapportFormService } from './informativ-rapport-form.service';
import { UiFileUploadModule } from '@ui/file-upload/file-upload.module';
import { UiSelectModule } from '@ui/select/select.module';
import { UiLoaderModule } from '@ui/loader/loader.module';
@NgModule({ @NgModule({
schemas: [CUSTOM_ELEMENTS_SCHEMA], schemas: [CUSTOM_ELEMENTS_SCHEMA],
@@ -35,6 +36,7 @@ import { UiLoaderModule } from '@ui/loader/loader.module';
UiTextareaModule, UiTextareaModule,
UiFileUploadModule, UiFileUploadModule,
UiLinkButtonModule, UiLinkButtonModule,
PreventDoubleSubmitModule,
UiLoaderModule, UiLoaderModule,
], ],
providers: [InformativRapportFormService], providers: [InformativRapportFormService],

View File

@@ -159,7 +159,7 @@
<footer class="periodisk-redovisning-form__footer"> <footer class="periodisk-redovisning-form__footer">
<div class="periodisk-redovisning-form__cta-wrapper"> <div class="periodisk-redovisning-form__cta-wrapper">
<digi-button af-type="submit" af-size="m">Förhandsgranska</digi-button> <digi-button af-type="submit" af-size="m" msfaPreventDoubleSubmit>Förhandsgranska</digi-button>
<ui-link-button uiRouterLink="../" uiType="secondary"> <ui-link-button uiRouterLink="../" uiType="secondary">
Avbryt Avbryt
<span class="msfa__a11y-sr-only">&nbsp;och gå tillbaka till deltagaren</span> <span class="msfa__a11y-sr-only">&nbsp;och gå tillbaka till deltagaren</span>

View File

@@ -4,6 +4,7 @@ import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { ReactiveFormsModule } from '@angular/forms'; import { ReactiveFormsModule } from '@angular/forms';
import { RouterModule } from '@angular/router'; import { RouterModule } from '@angular/router';
import { PreventDoubleSubmitModule } from '@msfa-directives/prevent-double-submit.module';
import { LayoutModule } from '@msfa-shared/components/layout/layout.module'; import { LayoutModule } from '@msfa-shared/components/layout/layout.module';
import { UiBackLinkModule } from '@ui/back-link/back-link.module'; import { UiBackLinkModule } from '@ui/back-link/back-link.module';
import { UiInputModule } from '@ui/input/input.module'; import { UiInputModule } from '@ui/input/input.module';
@@ -38,6 +39,7 @@ import { PeriodiskRedovisningFormService } from './periodisk-redovisning-form.se
UiLinkButtonModule, UiLinkButtonModule,
UiInputModule, UiInputModule,
UiValidationMessageModule, UiValidationMessageModule,
PreventDoubleSubmitModule,
], ],
providers: [PeriodiskRedovisningFormService], providers: [PeriodiskRedovisningFormService],
exports: [PeriodiskRedovisningFormComponent], exports: [PeriodiskRedovisningFormComponent],

View File

@@ -75,7 +75,7 @@
<footer class="signal-form__footer"> <footer class="signal-form__footer">
<div class="signal-form__cta-wrapper"> <div class="signal-form__cta-wrapper">
<digi-button af-type="submit" af-size="m">Förhandsgranska</digi-button> <digi-button af-type="submit" af-size="m" msfaPreventDoubleSubmit>Förhandsgranska</digi-button>
<ui-link-button uiRouterLink="../" uiType="secondary"> <ui-link-button uiRouterLink="../" uiType="secondary">
Avbryt Avbryt
<span class="msfa__a11y-sr-only">&nbsp;och gå tillbaka till deltagaren</span> <span class="msfa__a11y-sr-only">&nbsp;och gå tillbaka till deltagaren</span>

View File

@@ -4,11 +4,13 @@ import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { ReactiveFormsModule } from '@angular/forms'; import { ReactiveFormsModule } from '@angular/forms';
import { RouterModule } from '@angular/router'; import { RouterModule } from '@angular/router';
import { PreventDoubleSubmitModule } from '@msfa-directives/prevent-double-submit.module';
import { ConfirmDialogModule } from '@msfa-shared/components/confirm-dialog/confirm-dialog.module'; import { ConfirmDialogModule } from '@msfa-shared/components/confirm-dialog/confirm-dialog.module';
import { LayoutModule } from '@msfa-shared/components/layout/layout.module'; import { LayoutModule } from '@msfa-shared/components/layout/layout.module';
import { UiBackLinkModule } from '@ui/back-link/back-link.module'; import { UiBackLinkModule } from '@ui/back-link/back-link.module';
import { UiInputModule } from '@ui/input/input.module'; import { UiInputModule } from '@ui/input/input.module';
import { UiLinkButtonModule } from '@ui/link-button/link-button.module'; import { UiLinkButtonModule } from '@ui/link-button/link-button.module';
import { UiLoaderModule } from '@ui/loader/loader.module';
import { UiRadiobuttonGroupModule } from '@ui/radiobutton-group/radiobutton-group.module'; import { UiRadiobuttonGroupModule } from '@ui/radiobutton-group/radiobutton-group.module';
import { UiSelectModule } from '@ui/select/select.module'; import { UiSelectModule } from '@ui/select/select.module';
import { UiSkeletonModule } from '@ui/skeleton/skeleton.module'; import { UiSkeletonModule } from '@ui/skeleton/skeleton.module';
@@ -17,7 +19,6 @@ import { ReportDescriptionListModule } from '../../../components/report-descript
import { ReportLayoutModule } from '../../../components/report-layout/report-layout.module'; import { ReportLayoutModule } from '../../../components/report-layout/report-layout.module';
import { SignalFormComponent } from './signal-form.component'; import { SignalFormComponent } from './signal-form.component';
import { SignalFormService } from './signal-form.service'; import { SignalFormService } from './signal-form.service';
import { UiLoaderModule } from '@ui/loader/loader.module';
@NgModule({ @NgModule({
schemas: [CUSTOM_ELEMENTS_SCHEMA], schemas: [CUSTOM_ELEMENTS_SCHEMA],
@@ -40,6 +41,7 @@ import { UiLoaderModule } from '@ui/loader/loader.module';
UiInputModule, UiInputModule,
UiValidationMessageModule, UiValidationMessageModule,
UiLinkButtonModule, UiLinkButtonModule,
PreventDoubleSubmitModule,
], ],
providers: [SignalFormService], providers: [SignalFormService],
exports: [SignalFormComponent], exports: [SignalFormComponent],

View File

@@ -48,7 +48,7 @@
></msfa-slutredovisning-form-step0-other> ></msfa-slutredovisning-form-step0-other>
<footer class="slutredovisning-form-step0__footer"> <footer class="slutredovisning-form-step0__footer">
<digi-button af-type="submit">Vidare till steg 2</digi-button> <digi-button af-type="submit" msfaPreventDoubleSubmit>Vidare till steg 2</digi-button>
<ui-link-button uiRouterLink="../" uiType="secondary"> <ui-link-button uiRouterLink="../" uiType="secondary">
Avbryt Avbryt
<span class="msfa__a11y-sr-only">&nbsp;och gå tillbaka till deltagaren</span> <span class="msfa__a11y-sr-only">&nbsp;och gå tillbaka till deltagaren</span>

View File

@@ -27,7 +27,7 @@
<!-- TODO: If something is required at the top of the form it will be hard to see when at the bottom and clicking next --> <!-- TODO: If something is required at the top of the form it will be hard to see when at the bottom and clicking next -->
<footer class="slutredovisning-form-step1__footer"> <footer class="slutredovisning-form-step1__footer">
<digi-button af-type="submit">Nästa</digi-button> <digi-button af-type="submit" msfaPreventDoubleSubmit>Nästa</digi-button>
<digi-button af-type="button" af-variation="secondary" (click)="goBack()"> <digi-button af-type="button" af-variation="secondary" (click)="goBack()">
Tillbaka Tillbaka
<span class="msfa__a11y-sr-only">&nbsp;till steg förgående steg</span> <span class="msfa__a11y-sr-only">&nbsp;till steg förgående steg</span>

View File

@@ -40,7 +40,7 @@
></ui-textarea> ></ui-textarea>
<footer class="slutredovisning-form-step2__footer"> <footer class="slutredovisning-form-step2__footer">
<digi-button af-type="submit">Nästa</digi-button> <digi-button af-type="submit" msfaPreventDoubleSubmit>Nästa</digi-button>
<digi-button af-type="button" af-variation="secondary" (click)="goBack()"> <digi-button af-type="button" af-variation="secondary" (click)="goBack()">
Tillbaka Tillbaka
<span class="msfa__a11y-sr-only">&nbsp;till steg förgående steg</span> <span class="msfa__a11y-sr-only">&nbsp;till steg förgående steg</span>

View File

@@ -8,12 +8,13 @@ import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { ReactiveFormsModule } from '@angular/forms'; import { ReactiveFormsModule } from '@angular/forms';
import { RouterModule } from '@angular/router'; import { RouterModule } from '@angular/router';
import { PreventDoubleSubmitModule } from '@msfa-directives/prevent-double-submit.module';
import { ConfirmDialogModule } from '@msfa-shared/components/confirm-dialog/confirm-dialog.module'; import { ConfirmDialogModule } from '@msfa-shared/components/confirm-dialog/confirm-dialog.module';
import { UiIconModule } from '@ui/icon/icon.module';
import { LayoutModule } from '@msfa-shared/components/layout/layout.module'; import { LayoutModule } from '@msfa-shared/components/layout/layout.module';
import { UiBackLinkModule } from '@ui/back-link/back-link.module'; import { UiBackLinkModule } from '@ui/back-link/back-link.module';
import { UiCheckboxModule } from '@ui/checkbox/checkbox.module'; import { UiCheckboxModule } from '@ui/checkbox/checkbox.module';
import { UiErrorListModule } from '@ui/error-list/error-list.module'; import { UiErrorListModule } from '@ui/error-list/error-list.module';
import { UiIconModule } from '@ui/icon/icon.module';
import { UiInputModule } from '@ui/input/input.module'; import { UiInputModule } from '@ui/input/input.module';
import { UiLinkButtonModule } from '@ui/link-button/link-button.module'; import { UiLinkButtonModule } from '@ui/link-button/link-button.module';
import { UiLoaderModule } from '@ui/loader/loader.module'; import { UiLoaderModule } from '@ui/loader/loader.module';
@@ -75,6 +76,7 @@ import { SlutredovisningFormService } from './slutredovisning-form.service';
UiInputModule, UiInputModule,
SlutredovisningViewDescriptionListModule, SlutredovisningViewDescriptionListModule,
UiLinkButtonModule, UiLinkButtonModule,
PreventDoubleSubmitModule,
], ],
providers: [SlutredovisningFormService], providers: [SlutredovisningFormService],
exports: [SlutredovisningFormComponent], exports: [SlutredovisningFormComponent],

View File

@@ -61,7 +61,7 @@
<p>Det finns inga deltagare att exportera. Försök att ändra filtreringen och försök igen.</p> <p>Det finns inga deltagare att exportera. Försök att ändra filtreringen och försök igen.</p>
</digi-notification-alert> </digi-notification-alert>
<div class="deltagare-export__cta-wrapper"> <div class="deltagare-export__cta-wrapper">
<digi-button af-type="submit" af-size="m">Exportera deltagare</digi-button> <digi-button af-type="submit" af-size="m" msfaPreventDoubleSubmit>Exportera deltagare</digi-button>
</div> </div>
</footer> </footer>
</form> </form>

View File

@@ -3,6 +3,7 @@ import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { RouterModule } from '@angular/router'; import { RouterModule } from '@angular/router';
import { PreventDoubleSubmitModule } from '@msfa-directives/prevent-double-submit.module';
import { LayoutModule } from '@msfa-shared/components/layout/layout.module'; import { LayoutModule } from '@msfa-shared/components/layout/layout.module';
import { UiCheckboxModule } from '@ui/checkbox/checkbox.module'; import { UiCheckboxModule } from '@ui/checkbox/checkbox.module';
import { UiLoaderModule } from '@ui/loader/loader.module'; import { UiLoaderModule } from '@ui/loader/loader.module';
@@ -21,6 +22,7 @@ import { DeltagareExportService } from './deltagare-export.service';
UiCheckboxModule, UiCheckboxModule,
UiLoaderModule, UiLoaderModule,
DigiNgFormDatepickerModule, DigiNgFormDatepickerModule,
PreventDoubleSubmitModule,
], ],
providers: [DeltagareExportService], providers: [DeltagareExportService],
}) })

View File

@@ -9,7 +9,7 @@
[uiInvalid]="handledareFormControl.invalid && handledareFormControl.touched || invalid" [uiInvalid]="handledareFormControl.invalid && handledareFormControl.touched || invalid"
(uiOnChange)="handledareChanged()" (uiOnChange)="handledareChanged()"
></ui-select> ></ui-select>
<digi-button *ngIf="!skipSubmit" class="handledare-picker-form__submit" af-type="submit"> <digi-button *ngIf="!skipSubmit" class="handledare-picker-form__submit" af-type="submit" msfaPreventDoubleSubmit>
{{submitText}} {{submitText}}
</digi-button> </digi-button>
<div class="handledare-picker-form__validation-wrapper"> <div class="handledare-picker-form__validation-wrapper">

View File

@@ -1,10 +1,11 @@
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { ReactiveFormsModule } from '@angular/forms'; import { ReactiveFormsModule } from '@angular/forms';
import { PreventDoubleSubmitModule } from '@msfa-directives/prevent-double-submit.module';
import { UiLoaderModule } from '@ui/loader/loader.module'; import { UiLoaderModule } from '@ui/loader/loader.module';
import { HandledarePickerFormComponent } from './handledare-picker-form.component';
import { UiSelectModule } from '@ui/select/select.module'; import { UiSelectModule } from '@ui/select/select.module';
import { UiValidationMessageModule } from '@ui/validation-message/validation-message.module'; import { UiValidationMessageModule } from '@ui/validation-message/validation-message.module';
import { HandledarePickerFormComponent } from './handledare-picker-form.component';
@NgModule({ @NgModule({
schemas: [CUSTOM_ELEMENTS_SCHEMA], schemas: [CUSTOM_ELEMENTS_SCHEMA],
@@ -15,6 +16,7 @@ import { UiValidationMessageModule } from '@ui/validation-message/validation-mes
UiLoaderModule, UiLoaderModule,
UiSelectModule, UiSelectModule,
UiValidationMessageModule, UiValidationMessageModule,
PreventDoubleSubmitModule,
], ],
exports: [HandledarePickerFormComponent], exports: [HandledarePickerFormComponent],
}) })

View File

@@ -14,5 +14,7 @@
[uiInvalid]="organizationFormControl.invalid && organizationFormControl.touched" [uiInvalid]="organizationFormControl.invalid && organizationFormControl.touched"
uiValidationMessage="Du måste välja en organisation för att kunna logga in" uiValidationMessage="Du måste välja en organisation för att kunna logga in"
></ui-select> ></ui-select>
<digi-button class="organization-picker-form__submit" af-type="submit">{{submitText}}</digi-button> <digi-button class="organization-picker-form__submit" af-type="submit" msfaPreventDoubleSubmit
>{{submitText}}</digi-button
>
</form> </form>

View File

@@ -1,14 +1,15 @@
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { ReactiveFormsModule } from '@angular/forms'; import { ReactiveFormsModule } from '@angular/forms';
import { PreventDoubleSubmitModule } from '@msfa-directives/prevent-double-submit.module';
import { UiSelectModule } from '@ui/select/select.module';
import { UiValidationMessageModule } from '@ui/validation-message/validation-message.module'; import { UiValidationMessageModule } from '@ui/validation-message/validation-message.module';
import { OrganizationPickerFormComponent } from './organization-picker-form.component'; import { OrganizationPickerFormComponent } from './organization-picker-form.component';
import { UiSelectModule } from '@ui/select/select.module';
@NgModule({ @NgModule({
schemas: [CUSTOM_ELEMENTS_SCHEMA], schemas: [CUSTOM_ELEMENTS_SCHEMA],
declarations: [OrganizationPickerFormComponent], declarations: [OrganizationPickerFormComponent],
imports: [CommonModule, ReactiveFormsModule, UiSelectModule, UiValidationMessageModule], imports: [CommonModule, ReactiveFormsModule, UiSelectModule, UiValidationMessageModule, PreventDoubleSubmitModule],
exports: [OrganizationPickerFormComponent], exports: [OrganizationPickerFormComponent],
}) })
export class OrganizationPickerFormModule {} export class OrganizationPickerFormModule {}

View File

@@ -0,0 +1,16 @@
import { Directive, HostListener } from '@angular/core';
@Directive({
// eslint-disable-next-line @angular-eslint/directive-selector
selector: '[msfaPreventDoubleSubmit]',
})
export class PreventDoubleSubmitDirective {
@HostListener('click', ['$event'])
onSubmit(event: UIEvent): void {
const clickCount = event.detail;
if (clickCount > 1) {
event.preventDefault();
}
}
}

View File

@@ -0,0 +1,8 @@
import { NgModule } from '@angular/core';
import { PreventDoubleSubmitDirective } from './prevent-double-submit.directive';
@NgModule({
declarations: [PreventDoubleSubmitDirective],
exports: [PreventDoubleSubmitDirective],
})
export class PreventDoubleSubmitModule {}