diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..966f070 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "angular.enable-strict-mode-prompt": false +} \ No newline at end of file diff --git a/apps/dafa-web/src/app/app.component.html b/apps/dafa-web/src/app/app.component.html index 9ee2bcb..0eb7c8e 100644 --- a/apps/dafa-web/src/app/app.component.html +++ b/apps/dafa-web/src/app/app.component.html @@ -13,5 +13,7 @@ > + + diff --git a/apps/dafa-web/src/app/app.component.scss b/apps/dafa-web/src/app/app.component.scss index 24a7d95..af305b3 100644 --- a/apps/dafa-web/src/app/app.component.scss +++ b/apps/dafa-web/src/app/app.component.scss @@ -3,22 +3,24 @@ @import 'variables/gutters'; .dafa { - width: 100vw; - height: 100vh; - overflow: hidden; display: grid; + height: 100vh; grid-template-columns: 15rem 1fr; - grid-template-rows: $dafa__navigation-height 1fr; + grid-template-rows: auto 1fr auto; grid-template-areas: 'header header' - 'sidebar content'; + 'sidebar content' + 'footer footer'; - @media (min-width: $digi--layout--breakpoint--m) { - grid-template-rows: $dafa__navigation-height-large 1fr; - } + // @media (min-width: $digi--layout--breakpoint--m) { + // grid-template-rows: $dafa__navigation-height-large 1fr auto; + // } &__header { grid-area: header; + position: sticky; + top: 0; + z-index: 1; } &__sidebar { @@ -30,11 +32,16 @@ &__content { grid-area: content; padding: var(--digi--layout--gutter) $digi--layout--gutter--l $digi--layout--gutter--xxl; - overflow-y: auto; } &__breadcrumbs { display: block; margin-bottom: var(--digi--layout--gutter); } + + &__footer { + grid-area: footer; + background-color: var(--digi--ui--color--primary); + min-height: 10rem; + } } diff --git a/apps/dafa-web/src/app/app.module.ts b/apps/dafa-web/src/app/app.module.ts index 77c624d..4babeea 100644 --- a/apps/dafa-web/src/app/app.module.ts +++ b/apps/dafa-web/src/app/app.module.ts @@ -7,6 +7,7 @@ import { CustomErrorHandler } from '@dafa-interceptors/custom-error-handler.modu import { MarkdownModule } from 'ngx-markdown'; import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; +import { FooterModule } from './components/footer/footer.module'; import { NavigationModule } from './components/navigation/navigation.module'; import { SidebarModule } from './components/sidebar/sidebar.module'; import { SkipToContentModule } from './components/skip-to-content/skip-to-content.module'; @@ -23,6 +24,7 @@ import { ToastListModule } from './components/toast-list/toast-list.module'; NavigationModule, SidebarModule, ToastListModule, + FooterModule, MarkdownModule.forRoot({ loader: HttpClient }), DigiNgNavigationBreadcrumbsModule, ], diff --git a/apps/dafa-web/src/app/components/footer/footer.component.html b/apps/dafa-web/src/app/components/footer/footer.component.html new file mode 100644 index 0000000..4cfee34 --- /dev/null +++ b/apps/dafa-web/src/app/components/footer/footer.component.html @@ -0,0 +1,7 @@ + diff --git a/apps/dafa-web/src/app/components/footer/footer.component.scss b/apps/dafa-web/src/app/components/footer/footer.component.scss new file mode 100644 index 0000000..4d3f086 --- /dev/null +++ b/apps/dafa-web/src/app/components/footer/footer.component.scss @@ -0,0 +1,15 @@ +.footer { + background-color: var(--digi--ui--color--background--profile); + padding: var(--digi--layout--gutter); + + &__logo-wrapper { + height: 100%; + display: flex; + align-items: center; + } + + &__logo { + height: 2rem; + vertical-align: middle; + } +} diff --git a/apps/dafa-web/src/app/components/footer/footer.component.spec.ts b/apps/dafa-web/src/app/components/footer/footer.component.spec.ts new file mode 100644 index 0000000..3298320 --- /dev/null +++ b/apps/dafa-web/src/app/components/footer/footer.component.spec.ts @@ -0,0 +1,28 @@ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; +import { IconModule } from '@dafa-shared/components/icon/icon.module'; +import { FooterComponent } from './footer.component'; + +describe('FooterComponent', () => { + let component: FooterComponent; + let fixture: ComponentFixture; + + beforeEach( + waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [FooterComponent], + imports: [RouterTestingModule, IconModule], + }).compileComponents(); + }) + ); + + beforeEach(() => { + fixture = TestBed.createComponent(FooterComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/apps/dafa-web/src/app/components/footer/footer.component.ts b/apps/dafa-web/src/app/components/footer/footer.component.ts new file mode 100644 index 0000000..bcf1421 --- /dev/null +++ b/apps/dafa-web/src/app/components/footer/footer.component.ts @@ -0,0 +1,9 @@ +import { ChangeDetectionStrategy, Component } from '@angular/core'; + +@Component({ + selector: 'dafa-footer', + templateUrl: './footer.component.html', + styleUrls: ['./footer.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class FooterComponent {} diff --git a/apps/dafa-web/src/app/components/footer/footer.module.ts b/apps/dafa-web/src/app/components/footer/footer.module.ts new file mode 100644 index 0000000..dc8c438 --- /dev/null +++ b/apps/dafa-web/src/app/components/footer/footer.module.ts @@ -0,0 +1,11 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { FooterComponent } from './footer.component'; + +@NgModule({ + declarations: [FooterComponent], + imports: [CommonModule, RouterModule], + exports: [FooterComponent], +}) +export class FooterModule {} diff --git a/apps/dafa-web/src/app/components/footer/footer.print.component.scss b/apps/dafa-web/src/app/components/footer/footer.print.component.scss new file mode 100644 index 0000000..004262a --- /dev/null +++ b/apps/dafa-web/src/app/components/footer/footer.print.component.scss @@ -0,0 +1,7 @@ +@media print { + .footer { + border-bottom-width: 0; + padding: var(--digi--layout--gutter) 0; + display: flex; + } +} diff --git a/apps/dafa-web/src/app/components/sidebar/sidebar.component.scss b/apps/dafa-web/src/app/components/sidebar/sidebar.component.scss index 4bc360d..bfda9a7 100644 --- a/apps/dafa-web/src/app/components/sidebar/sidebar.component.scss +++ b/apps/dafa-web/src/app/components/sidebar/sidebar.component.scss @@ -1,11 +1,12 @@ @import 'variables/colors'; +@import 'variables/navigation'; @import 'mixins/list'; .sidebar { display: flex; flex-direction: column; position: sticky; - top: 0; + top: $dafa__navigation-height-large; &__list { @include dafa__reset-list; diff --git a/apps/dafa-web/src/app/data/models/authorization.model.ts b/apps/dafa-web/src/app/data/models/authorization.model.ts new file mode 100644 index 0000000..0ad4407 --- /dev/null +++ b/apps/dafa-web/src/app/data/models/authorization.model.ts @@ -0,0 +1,19 @@ +import { Authorization as AuthorizationEnum } from '@dafa-enums/authorization.enum'; + +export interface Authorization { + id: string; + name: AuthorizationEnum; +} + +export interface AuthorizationApiResponse { + id: string; + name: AuthorizationEnum; +} + +export function mapAuthorizationApiResponseToAuthorization(data: AuthorizationApiResponse): Authorization { + const { id, name } = data; + return { + id, + name, + }; +} diff --git a/apps/dafa-web/src/app/data/models/employee.model.ts b/apps/dafa-web/src/app/data/models/employee.model.ts index 0c2d0f2..136f0f4 100644 --- a/apps/dafa-web/src/app/data/models/employee.model.ts +++ b/apps/dafa-web/src/app/data/models/employee.model.ts @@ -1,27 +1,22 @@ -import { mapPegaAuthorizationToAuthorization, PegaAuthorization } from '@dafa-enums/authorization.enum'; -import { Service } from '@dafa-enums/service.enum'; import { Participant } from './participant.model'; +import { Service } from './service.model'; import { User, UserApiResponse } from './user.model'; -// eslint-disable-next-line @typescript-eslint/no-empty-interface export interface Employee extends User { languages: string[]; - outOfOffice: { - start: Date; - end: Date; - }[]; participants: Participant[]; services: Service[]; - active: boolean; } export interface EmployeeApiResponse extends UserApiResponse { - active: boolean; services: Service[]; languages: string[]; participants: Participant[]; } +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface EmployeeApiRequestData extends Employee {} + export interface PegaEmployeesApiResponse { pxMore: string; pxObjClass: string; @@ -44,7 +39,6 @@ export interface PegaEmployeeApiResponse { pyOrganization: string; pyOrgDivision: string; pyOrgUnit: string; - pyTelephone: string; pyUserIdentifier: string; pyUserName: string; } @@ -52,7 +46,6 @@ export interface PegaEmployeeApiResponse { export interface PegaEmployeeApiRequestData { pyFirstName: string; pyLastName: string; - pyTelephone: string; } export interface PegaEmployeeApiPostResponse { @@ -61,15 +54,17 @@ export interface PegaEmployeeApiPostResponse { pyFirstName: string; pyHasError: 'true' | 'false'; pyLastName: string; - pyTelephone: string; pyUserIdentifier: string; } -export function mapEmployeeToEmployeeApiRequestData(data: Employee): PegaEmployeeApiRequestData { +export function mapEmployeeToEmployeeApiRequestData(data: Employee): EmployeeApiRequestData { + return data; +} + +export function mapEmployeeToPegaEmployeeApiRequestData(data: Employee): PegaEmployeeApiRequestData { return { pyFirstName: data.firstName, pyLastName: data.lastName, - pyTelephone: data.phone, }; } @@ -79,59 +74,41 @@ export function mapPegaEmployeeReponseToEmployee(data: PegaEmployeeApiResponse): lastName: data.pyLastName, firstName: data.pyFirstName, fullName: `${data.pyFirstName} ${data.pyLastName}`, - organization: { - id: '', - name: data.pyOrganization, - kaNumber: null, - address: { - street: null, - houseNumber: null, - postalCode: null, - city: null, - kommun: null, + organizations: [ + { + id: '', + name: data.pyOrganization, + kaNumber: null, + address: { + street: null, + houseNumber: null, + postalCode: null, + city: null, + kommun: null, + }, }, - }, - phone: data.pyTelephone, - email: '', - authorizations: mapPegaAuthorizationToAuthorization(data.pyAccessGroup as PegaAuthorization), + ], + authorizations: null, + // authorizations: mapPegaAuthorizationToAuthorization(data.pyAccessGroup as PegaAuthorization), services: [], languages: [], - outOfOffice: null, ssn: '', participants: [], - active: true, }; } export function mapEmployeeReponseToEmployee(data: EmployeeApiResponse): Employee { - const { - id, - firstName, - lastName, - phone, - email, - ssn, - active, - services, - languages, - organization, - authorizations, - participants, - } = data; + const { id, firstName, lastName, ssn, services, languages, organizations, authorizations, participants } = data; return { id, firstName, lastName, fullName: `${firstName} ${lastName}`, - organization, - phone, - email, + organizations, authorizations, services, languages, - outOfOffice: null, ssn, participants, - active, }; } diff --git a/apps/dafa-web/src/app/data/models/service.model.ts b/apps/dafa-web/src/app/data/models/service.model.ts new file mode 100644 index 0000000..7adea6d --- /dev/null +++ b/apps/dafa-web/src/app/data/models/service.model.ts @@ -0,0 +1,19 @@ +import { Service as ServiceEnum } from '@dafa-enums/service.enum'; + +export interface Service { + id: string; + name: ServiceEnum; +} + +export interface ServiceApiResponse { + id: string; + name: ServiceEnum; +} + +export function mapServiceApiResponseToService(data: ServiceApiResponse): Service { + const { id, name } = data; + return { + id, + name, + }; +} diff --git a/apps/dafa-web/src/app/data/models/user.model.ts b/apps/dafa-web/src/app/data/models/user.model.ts index 07ed5ed..ccd6f4c 100644 --- a/apps/dafa-web/src/app/data/models/user.model.ts +++ b/apps/dafa-web/src/app/data/models/user.model.ts @@ -1,4 +1,4 @@ -import { Authorization, mapPegaAuthorizationToAuthorization, PegaAuthorization } from '@dafa-enums/authorization.enum'; +import { Authorization } from './authorization.model'; import { Organization } from './organization.model'; export interface User { @@ -7,9 +7,7 @@ export interface User { lastName: string; fullName: string; ssn: string; - phone: string; - email: string; - organization: Organization; + organizations: Organization[]; authorizations: Authorization[]; } @@ -18,9 +16,7 @@ export interface UserApiResponse { firstName: string; lastName: string; ssn: string; - phone: string; - email: string; - organization: Organization; + organizations: Organization[]; authorizations: Authorization[]; } @@ -35,30 +31,20 @@ export interface PegaUserApiResponse { pyOrganization: string; pyOrgDivision: string; pyOrgUnit: string; - pyTelephone: string; pyUserIdentifier: string; pyUserName: string; pyAccessGroupsAdditional: string[]; - pyAddresses: { - Email: { - pxObjClass: string; - pxSubscript: string; - pyEmailAddress: string; - }; - }; } export function mapUserApiResponseToUser(data: UserApiResponse): User { - const { id, firstName, lastName, ssn, organization, phone, email, authorizations } = data; + const { id, firstName, lastName, ssn, organizations, authorizations } = data; return { id, firstName, lastName, fullName: `${firstName} ${lastName}`, ssn, - organization, - phone, - email, + organizations, authorizations, }; } @@ -70,20 +56,21 @@ export function mapPegaUserApiReponseToUser(data: PegaUserApiResponse): User { firstName: data.pyFirstName, fullName: `${data.pyFirstName} ${data.pyLastName}`, ssn: null, - organization: { - id: '', - name: data.pyOrganization, - kaNumber: null, - address: { - street: null, - houseNumber: null, - postalCode: null, - city: null, - kommun: null, + organizations: [ + { + id: '', + name: data.pyOrganization, + kaNumber: null, + address: { + street: null, + houseNumber: null, + postalCode: null, + city: null, + kommun: null, + }, }, - }, - phone: data.pyTelephone, - email: data.pyAddresses.Email.pyEmailAddress, - authorizations: mapPegaAuthorizationToAuthorization(data.pyAccessGroup as PegaAuthorization), + ], + authorizations: null, + // authorizations: mapPegaAuthorizationToAuthorization(data.pyAccessGroup as PegaAuthorization), }; } diff --git a/apps/dafa-web/src/app/pages/administration/administration-routing.module.ts b/apps/dafa-web/src/app/pages/administration/administration-routing.module.ts index c7cebca..4f05197 100644 --- a/apps/dafa-web/src/app/pages/administration/administration-routing.module.ts +++ b/apps/dafa-web/src/app/pages/administration/administration-routing.module.ts @@ -19,7 +19,11 @@ const routes: Routes = [ }, { path: 'skapa-konto', - loadChildren: () => import('./pages/create-account/create-account.module').then(m => m.CreateAccountModule), + loadChildren: () => import('./pages/employee-form/employee-form.module').then(m => m.EmployeeFormModule), + }, + { + path: 'redigera-konto/:id', + loadChildren: () => import('./pages/employee-form/employee-form.module').then(m => m.EmployeeFormModule), }, ]; diff --git a/apps/dafa-web/src/app/pages/administration/pages/create-account/create-account.component.html b/apps/dafa-web/src/app/pages/administration/pages/create-account/create-account.component.html deleted file mode 100644 index f1346c6..0000000 --- a/apps/dafa-web/src/app/pages/administration/pages/create-account/create-account.component.html +++ /dev/null @@ -1,99 +0,0 @@ -
- -

Skapa nytt konto

-

- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam magna neque, interdum vel massa eget, condimentum - rutrum velit. Sed vitae ullamcorper sem. Aliquam malesuada nunc sed purus mollis scelerisque. Curabitur bibendum - leo quis ante porttitor tincidunt. Nam tincidunt imperdiet tortor eu suscipit. Maecenas ut dui est. -

-
-
- - - - - -
-
diff --git a/apps/dafa-web/src/app/pages/administration/pages/create-account/create-account.component.scss b/apps/dafa-web/src/app/pages/administration/pages/create-account/create-account.component.scss deleted file mode 100644 index 36b6077..0000000 --- a/apps/dafa-web/src/app/pages/administration/pages/create-account/create-account.component.scss +++ /dev/null @@ -1,70 +0,0 @@ -@import 'mixins/list'; - -.create-account { - &__block { - max-width: var(--digi--typography--text--max-width); - } - &__combined-inputs { - display: flex; - gap: var(--digi--layout--gutter); - } - - &__input { - display: block; - width: 100%; - margin-bottom: var(--digi--layout--gutter); - } - - &__permission-checkbox { - display: flex; - height: 5rem; - align-items: center; - } - - &__fieldset { - padding: 0; - border: 0; - margin-top: var(--digi--layout--gutter); - - legend { - width: 100%; - display: flex; - align-items: center; - margin: 0; - font-weight: var(--digi--typography--font-weight--bold); - font-size: 1.5rem; - padding-bottom: var(--digi--layout--gutter--s); - } - } - - &__pending-out-of-office-list { - @include dafa__reset-list; - margin-top: var(--digi--layout--gutter); - - li { - display: flex; - justify-content: space-between; - align-items: center; - gap: var(--digi--layout--gutter--s); - padding: var(--digi--layout--gutter--s); - - &:nth-child(odd) { - background-color: var(--digi--ui--color--background--tertiary); - } - } - } - - &__footer { - margin-top: var(--digi--layout--gutter); - display: flex; - gap: var(--digi--layout--gutter); - } - - &__popover { - margin-left: var(--digi--layout--gutter); - - ::ng-deep .digi-ng-popover__container { - z-index: 1; - } - } -} diff --git a/apps/dafa-web/src/app/pages/administration/pages/create-account/create-account.component.ts b/apps/dafa-web/src/app/pages/administration/pages/create-account/create-account.component.ts deleted file mode 100644 index 756aa01..0000000 --- a/apps/dafa-web/src/app/pages/administration/pages/create-account/create-account.component.ts +++ /dev/null @@ -1,124 +0,0 @@ -import { FormSelectBaseItem } from '@af/digi-ng/_form/form-select-base'; -import { ChangeDetectionStrategy, Component } from '@angular/core'; -import { AbstractControl, FormBuilder, FormGroup } from '@angular/forms'; -import { Router } from '@angular/router'; -import { Service } from '@dafa-enums/service.enum'; -import { EmployeeService } from '@dafa-services/api/employee.service'; -import { RequiredValidator } from '@dafa-validators/required.validator'; -import { BehaviorSubject } from 'rxjs'; - -@Component({ - selector: 'dafa-create-account', - templateUrl: './create-account.component.html', - styleUrls: ['./create-account.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class CreateAccountComponent { - private _searchValue$ = new BehaviorSubject(''); - - formGroup: FormGroup; - todaysDate = new Date(); - - list: FormSelectBaseItem[] = [ - { - name: Service.STOM, - value: '1', - }, - { - name: Service.KVL, - value: '2', - }, - { - name: Service.KROM, - value: '3', - }, - ]; - - constructor(private formBuilder: FormBuilder, private employeeService: EmployeeService, private router: Router) { - this.formGroup = this.formBuilder.group({ - firstName: this.formBuilder.control('', [RequiredValidator('Förnamn')]), - lastName: this.formBuilder.control('', [RequiredValidator('Efternamn')]), - phone: this.formBuilder.control('', [RequiredValidator('Telefonnummer')]), - // ssn: this.formBuilder.control('', [RequiredValidator('Personnummer'), SocialSecurityNumberValidator()]), - // employeeId: this.formBuilder.control('', [RequiredValidator('Personal-ID')]), - ssn: this.formBuilder.control(''), - employeeId: this.formBuilder.control(''), - service: this.formBuilder.control(''), - permissions: this.formBuilder.control(false), - participant: this.formBuilder.control(false), - infoParticipant: this.formBuilder.control(false), - orderBills: this.formBuilder.control(false), - }); - } - - handleSearchSubmit(): void { - // skicka searchvalue till en service och filtrera - } - - handleSearchInput($event: CustomEvent): void { - this._searchValue$.next($event.detail.target.value); - } - - get formselectItem(): FormSelectBaseItem[] { - return [ - { - name: Service.STOM, - value: '1', - }, - { - name: Service.KVL, - value: '2', - }, - { - name: Service.KROM, - value: '3', - }, - ]; - } - - get firstNameControl(): AbstractControl { - return this.formGroup.get('firstName'); - } - get lastNameControl(): AbstractControl { - return this.formGroup.get('lastName'); - } - get ssnControl(): AbstractControl { - return this.formGroup.get('ssn'); - } - get phoneControl(): AbstractControl { - return this.formGroup.get('phone'); - } - - private _markFormAsDirty(): void { - Object.keys(this.formGroup.controls).forEach(control => { - this.formGroup.get(control).markAsDirty(); - this.formGroup.get(control).markAsTouched(); - }); - } - - submitForm(): void { - if (this.formGroup.valid) { - const submittableValues = { - ...this.formGroup.value, - fullName: `${this.firstNameControl.value} ${this.lastNameControl.value}`, - }; - - delete submittableValues.outOfOfficeStart; - delete submittableValues.outOfOfficeEnd; - - const post = this.employeeService.postNewEmployee(submittableValues).subscribe({ - next: id => { - this.router.navigate(['/administration', 'personal', id]); - }, - complete: () => { - post.unsubscribe(); - }, - }); - - // this.formGroup.reset(); - } else { - console.error('Form is invalid, do something...'); - this._markFormAsDirty(); - } - } -} diff --git a/apps/dafa-web/src/app/pages/administration/pages/employee-card/employee-card.component.html b/apps/dafa-web/src/app/pages/administration/pages/employee-card/employee-card.component.html index 004fe7d..4ea2bbf 100644 --- a/apps/dafa-web/src/app/pages/administration/pages/employee-card/employee-card.component.html +++ b/apps/dafa-web/src/app/pages/administration/pages/employee-card/employee-card.component.html @@ -7,76 +7,58 @@ perferendis commodi.

-
-
+
+

Kontaktuppgifter

+
Namn
+
{{ detailedEmployeeData.fullName }}
Personnummer
{{ detailedEmployeeData.ssn }}
-
Telefonnummer
-
- {{ detailedEmployeeData.phone }} -
-
Epost adress
-
- {{ detailedEmployeeData.email }} -
-
+

Uppgifter om arbete

-
Utförandeverksamhet
-
- {{ detailedEmployeeData.organization.address.city }} -
Behörigheter
-
- {{ detailedEmployeeData.authorizations.join(', ') }} -
-
Frånvaroperiod
- -
- {{ date.start | localDate }} - {{ date.end | localDate }} -
+ +
{{ authorization.name }}
+
+
Tjänster
+ +
{{ service.name }}
-
Tjänst
-
- {{ detailedEmployeeData.services.join(', ') }} -
-
Språk
-
{{ detailedEmployeeData.languages?.join(', ') }}
-
-

Utförande verksamhet

+
+

Utförande verksamheter

-
    -
  • -

    {{ agency.name }}

    +
      +
    • +

      {{ organization.name }}

      KA-nummer
      -
      {{ agency.kaNumber }}
      +
      {{ organization.kaNumber }}
      Adress
      -
      {{ agency.address.street }} {{ agency.address.houseNumber }}
      -
      {{ agency.address.postalCode }} {{ agency.address.city }}
      +
      {{ organization.address.street }} {{ organization.address.houseNumber }}
      +
      {{ organization.address.postalCode }} {{ organization.address.city }}
-
+

Tilldelade deltagare ({{ detailedEmployeeData.participants?.length || 0 }})

-
    -
  • +
      +
    • -
    • +
    • ; + authorizationsAsString$: Observable; private _pendingSelectedParticipants$ = new BehaviorSubject([]); constructor(private activatedRoute: ActivatedRoute, private employeeService: EmployeeService) { diff --git a/apps/dafa-web/src/app/pages/administration/pages/employee-form/employee-form.component.html b/apps/dafa-web/src/app/pages/administration/pages/employee-form/employee-form.component.html new file mode 100644 index 0000000..7ad5713 --- /dev/null +++ b/apps/dafa-web/src/app/pages/administration/pages/employee-form/employee-form.component.html @@ -0,0 +1,147 @@ +
      + +

      Skapa nytt konto

      +

      + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam magna neque, interdum vel massa eget, condimentum + rutrum velit. Sed vitae ullamcorper sem. Aliquam malesuada nunc sed purus mollis scelerisque. Curabitur bibendum + leo quis ante porttitor tincidunt. Nam tincidunt imperdiet tortor eu suscipit. Maecenas ut dui est. +

      +
      +
      + + {{ + error.message + }} + + +
      + +

      Personuppgifter

      +
      + + + +
      +
      + +

      Tjänst

      +
      + + + + + + + + {{ servicesControl.errors.message }} + + +
      + +

      Valda tjänster

      +
      +
        +
      • + {{ service.name }} + + + +
      • +
      + Inga tjänster vald. +
      +
      + +
      +
      + + Tilldela behörigheter + + +
        +
      • + + +

        Info om behörighet

        +
        +
      • +
      + + {{ authorizationsControl.errors.message }} + +
      +
      + + +
      +
      diff --git a/apps/dafa-web/src/app/pages/administration/pages/employee-form/employee-form.component.scss b/apps/dafa-web/src/app/pages/administration/pages/employee-form/employee-form.component.scss new file mode 100644 index 0000000..4e4bf63 --- /dev/null +++ b/apps/dafa-web/src/app/pages/administration/pages/employee-form/employee-form.component.scss @@ -0,0 +1,84 @@ +@import 'mixins/list'; +@import 'variables/gutters'; + +.employee-form { + &__block { + max-width: var(--digi--typography--text--max-width); + margin-bottom: $digi--layout--gutter--xl; + } + + &__input { + display: block; + width: 100%; + margin-bottom: var(--digi--layout--gutter); + } + + &__fieldset { + padding: 0; + border: 0; + + legend { + width: 100%; + display: flex; + align-items: center; + font-weight: var(--digi--typography--font-weight--semibold); + font-size: var(--digi--typography--font-size--h2--desktop); + margin-bottom: var(--digi-typography--margin--h2); + } + } + + &__validation-message { + display: block; + margin-top: var(--digi--layout--gutter--s); + } + + &__added-services { + margin-top: var(--digi--layout--gutter); + max-width: 50rem; + } + + &__services, + &__authorizations { + @include dafa__reset-list; + margin-bottom: var(--digi--layout--gutter); + } + + &__service-item { + display: flex; + justify-content: space-between; + align-items: center; + padding: var(--digi--layout--gutter--xs) var(--digi--layout--gutter--s); + + &:nth-child(odd) { + background-color: var(--digi--ui--color--background--secondary); + } + } + + &__authorization-item { + display: flex; + align-items: center; + + &:not(:first-child) { + margin-top: var(--digi--layout--gutter); + } + } + + &__error-list { + display: block; + margin-top: $digi--layout--gutter--l; + } + + &__footer { + margin-top: $digi--layout--gutter--xl; + display: flex; + gap: var(--digi--layout--gutter); + } + + &__popover { + margin-left: var(--digi--layout--gutter); + + ::ng-deep .digi-ng-popover__container { + z-index: 1; + } + } +} diff --git a/apps/dafa-web/src/app/pages/administration/pages/create-account/create-account.component.spec.ts b/apps/dafa-web/src/app/pages/administration/pages/employee-form/employee-form.component.spec.ts similarity index 82% rename from apps/dafa-web/src/app/pages/administration/pages/create-account/create-account.component.spec.ts rename to apps/dafa-web/src/app/pages/administration/pages/employee-form/employee-form.component.spec.ts index ded9697..1776ecb 100644 --- a/apps/dafa-web/src/app/pages/administration/pages/create-account/create-account.component.spec.ts +++ b/apps/dafa-web/src/app/pages/administration/pages/employee-form/employee-form.component.spec.ts @@ -9,17 +9,17 @@ import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { ReactiveFormsModule } from '@angular/forms'; import { RouterTestingModule } from '@angular/router/testing'; -import { CreateAccountComponent } from './create-account.component'; +import { EmployeeFormComponent } from './employee-form.component'; -describe('CreateAccountComponent', () => { - let component: CreateAccountComponent; - let fixture: ComponentFixture; +describe('EmployeeFormComponent', () => { + let component: EmployeeFormComponent; + let fixture: ComponentFixture; beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ schemas: [CUSTOM_ELEMENTS_SCHEMA], - declarations: [CreateAccountComponent], + declarations: [EmployeeFormComponent], imports: [ RouterTestingModule, HttpClientTestingModule, @@ -36,7 +36,7 @@ describe('CreateAccountComponent', () => { ); beforeEach(() => { - fixture = TestBed.createComponent(CreateAccountComponent); + fixture = TestBed.createComponent(EmployeeFormComponent); component = fixture.componentInstance; fixture.detectChanges(); }); diff --git a/apps/dafa-web/src/app/pages/administration/pages/employee-form/employee-form.component.ts b/apps/dafa-web/src/app/pages/administration/pages/employee-form/employee-form.component.ts new file mode 100644 index 0000000..782c034 --- /dev/null +++ b/apps/dafa-web/src/app/pages/administration/pages/employee-form/employee-form.component.ts @@ -0,0 +1,165 @@ +import { FormSelectBaseItem } from '@af/digi-ng/_form/form-select-base'; +import { ChangeDetectionStrategy, Component } from '@angular/core'; +import { AbstractControl, FormBuilder, FormGroup } from '@angular/forms'; +import { Router } from '@angular/router'; +import { Authorization } from '@dafa-models/authorization.model'; +import { Service } from '@dafa-models/service.model'; +import { AuthorizationService } from '@dafa-services/api/authorizations.service'; +import { EmployeeService } from '@dafa-services/api/employee.service'; +import { ServiceService } from '@dafa-services/api/service.service'; +import { SocialSecurityNumberValidator } from '@dafa-utils/validators/social-security-number.validator'; +import { RequiredValidator } from '@dafa-validators/required.validator'; +import { BehaviorSubject, Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; + +@Component({ + selector: 'dafa-employee-form', + templateUrl: './employee-form.component.html', + styleUrls: ['./employee-form.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class EmployeeFormComponent { + services$: Observable = this.serviceService.services$; + authorizations$: Observable = this.authorizationService.authorizations$; + servicesSelectItems$: Observable = this.services$.pipe( + map(services => services.map(({ name, id }) => ({ name, value: id }))) + ); + private _pendingServices$ = new BehaviorSubject([]); + + formGroup: FormGroup = this.formBuilder.group({ + firstName: this.formBuilder.control('', [RequiredValidator('Förnamn')]), + lastName: this.formBuilder.control('', [RequiredValidator('Efternamn')]), + ssn: this.formBuilder.control('', [RequiredValidator('Personnummer'), SocialSecurityNumberValidator()]), + // services: this.formBuilder.control([], [RequiredValidator('en tjänst')]), + services: this.formBuilder.control([]), + authorizations: this.formBuilder.control([], [RequiredValidator('en behörighet')]), + }); + todaysDate = new Date(); + submitted = false; + + constructor( + private formBuilder: FormBuilder, + private employeeService: EmployeeService, + private serviceService: ServiceService, + private authorizationService: AuthorizationService, + private router: Router + ) { + this.formGroup.valueChanges.subscribe(values => console.log(this.formGroup)); + } + + get pendingServices(): Service[] { + return this._pendingServices$.getValue(); + } + + get firstNameControl(): AbstractControl { + return this.formGroup.get('firstName'); + } + get lastNameControl(): AbstractControl { + return this.formGroup.get('lastName'); + } + get ssnControl(): AbstractControl { + return this.formGroup.get('ssn'); + } + get servicesControl(): AbstractControl { + return this.formGroup.get('services'); + } + get authorizationsControl(): AbstractControl { + return this.formGroup.get('authorizations'); + } + + get formErrors(): { id: string; message: string }[] { + const controlsWithErrors = Object.keys(this.formGroup.controls).filter( + key => !!this.formGroup.controls[key].errors + ); + + return controlsWithErrors.map(key => ({ + id: key, + message: this.formGroup.controls[key].errors.message, + })); + } + + private _markFormAsDirty(): void { + Object.keys(this.formGroup.controls).forEach(control => { + this.formGroup.get(control).markAsDirty(); + this.formGroup.get(control).markAsTouched(); + }); + } + + toggleAuthorization(authorization: Authorization, checked: boolean): void { + const currentAuthorizations = this.authorizationsControl.value; + + if (checked) { + this.authorizationsControl.patchValue([...currentAuthorizations, authorization]); + } else { + this.authorizationsControl.patchValue( + currentAuthorizations.filter(currentAuthorization => currentAuthorization.id !== authorization.id) + ); + } + } + + togglePendingService(service: Service, checked: boolean): void { + const currentPendingServices = this.pendingServices; + + if (checked) { + this._pendingServices$.next([...currentPendingServices, service]); + } else { + this._pendingServices$.next(currentPendingServices.filter(currentService => currentService.id !== service.id)); + } + } + + toggleAllPendingServices(services: Service[], checked: boolean): void { + this._pendingServices$.next(checked ? services : []); + } + + resetPendingServices(): void { + this._pendingServices$.next([]); + } + + addPendingServicesToFormControl(): void { + this.servicesControl.patchValue(this.pendingServices); + } + + removeServiceFromFormControl(id: string): void { + const currentAddedServices = this.servicesControl.value; + + this.servicesControl.patchValue(currentAddedServices.filter(currentService => currentService.id !== id)); + } + + setFocusOnInvalidInput(event: CustomEvent): void { + console.log(event.target); + } + + resetForm(event: Event): void { + event.preventDefault(); + this.formGroup.reset({ + firstName: '', + lastName: '', + ssn: '', + services: [], + authorizations: [], + }); + // Object.keys(this.formGroup.controls).forEach(controlKey => this.formGroup.controls[controlKey].markAsPristine()); + } + + submitForm(): void { + this.submitted = true; + if (this.formGroup.valid) { + const submittableValues = { + ...this.formGroup.value, + }; + const post = this.employeeService.postNewEmployee(submittableValues).subscribe({ + next: id => { + this.router.navigate(['/administration', 'personal', id]); + }, + complete: () => { + post.unsubscribe(); + }, + }); + + // this.formGroup.reset(); + } else { + console.error('Form is invalid, do something...'); + this._markFormAsDirty(); + } + } +} diff --git a/apps/dafa-web/src/app/pages/administration/pages/create-account/create-account.module.ts b/apps/dafa-web/src/app/pages/administration/pages/employee-form/employee-form.module.ts similarity index 82% rename from apps/dafa-web/src/app/pages/administration/pages/create-account/create-account.module.ts rename to apps/dafa-web/src/app/pages/administration/pages/employee-form/employee-form.module.ts index 3fe912e..14bbc12 100644 --- a/apps/dafa-web/src/app/pages/administration/pages/create-account/create-account.module.ts +++ b/apps/dafa-web/src/app/pages/administration/pages/employee-form/employee-form.module.ts @@ -1,22 +1,22 @@ +import { DigiNgFormCheckboxModule } from '@af/digi-ng/_form/form-checkbox'; import { DigiNgFormDatepickerModule } from '@af/digi-ng/_form/form-datepicker'; import { DigiNgFormInputModule } from '@af/digi-ng/_form/form-input'; import { DigiNgFormRadiobuttonGroupModule } from '@af/digi-ng/_form/form-radiobutton-group'; +import { DigiNgFormSelectModule } from '@af/digi-ng/_form/form-select'; +import { DigiNgPopoverModule } from '@af/digi-ng/_popover/popover'; import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { ReactiveFormsModule } from '@angular/forms'; import { RouterModule } from '@angular/router'; import { LocalDatePipeModule } from '@dafa-shared/pipes/local-date/local-date.module'; -import { CreateAccountComponent } from './create-account.component'; -import { DigiNgPopoverModule } from '@af/digi-ng/_popover/popover'; -import { DigiNgFormCheckboxModule } from '@af/digi-ng/_form/form-checkbox'; -import { DigiNgFormSelectModule } from '@af/digi-ng/_form/form-select'; +import { EmployeeFormComponent } from './employee-form.component'; @NgModule({ schemas: [CUSTOM_ELEMENTS_SCHEMA], - declarations: [CreateAccountComponent], + declarations: [EmployeeFormComponent], imports: [ CommonModule, - RouterModule.forChild([{ path: '', component: CreateAccountComponent }]), + RouterModule.forChild([{ path: '', component: EmployeeFormComponent }]), ReactiveFormsModule, LocalDatePipeModule, DigiNgFormInputModule, @@ -27,4 +27,4 @@ import { DigiNgFormSelectModule } from '@af/digi-ng/_form/form-select'; DigiNgFormCheckboxModule, ], }) -export class CreateAccountModule {} +export class EmployeeFormModule {} diff --git a/apps/dafa-web/src/app/pages/administration/pages/employees/components/employees-list/employees-list.component.html b/apps/dafa-web/src/app/pages/administration/pages/employees/components/employees-list/employees-list.component.html index 92651ab..2a9e35e 100644 --- a/apps/dafa-web/src/app/pages/administration/pages/employees/components/employees-list/employees-list.component.html +++ b/apps/dafa-web/src/app/pages/administration/pages/employees/components/employees-list/employees-list.component.html @@ -22,23 +22,37 @@ - + Redigera - + - {{ employees.fullName }} + {{ employee.fullName }} - {{ employees.services.length ? employees.services.join(', ') : '-' }} - {{ employees.organization.address.city || '-' }} + + + {{ service.name }}, + + + + + {{ organization.address.city }}, + + + + + + + diff --git a/apps/dafa-web/src/app/pages/administration/pages/employees/components/employees-list/employees-list.component.ts b/apps/dafa-web/src/app/pages/administration/pages/employees/components/employees-list/employees-list.component.ts index 7404aea..27659b0 100644 --- a/apps/dafa-web/src/app/pages/administration/pages/employees/components/employees-list/employees-list.component.ts +++ b/apps/dafa-web/src/app/pages/administration/pages/employees/components/employees-list/employees-list.component.ts @@ -17,8 +17,6 @@ export class EmployeesListComponent { private _currentPage$ = new BehaviorSubject(1); private _employeesPerPage = 10; - private _searchValue$ = new BehaviorSubject(''); - get currentPage(): number { return this._currentPage$.getValue(); } diff --git a/apps/dafa-web/src/app/services/api/authorizations.service.ts b/apps/dafa-web/src/app/services/api/authorizations.service.ts new file mode 100644 index 0000000..0db6ed8 --- /dev/null +++ b/apps/dafa-web/src/app/services/api/authorizations.service.ts @@ -0,0 +1,24 @@ +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { environment } from '@dafa-environment'; +import { + Authorization, + AuthorizationApiResponse, + mapAuthorizationApiResponseToAuthorization, +} from '@dafa-models/authorization.model'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; + +const API_HEADERS = { headers: environment.api.headers }; + +@Injectable({ + providedIn: 'root', +}) +export class AuthorizationService { + private _authorizationsApiUrl = `${environment.api.url}/authorizations`; + public authorizations$: Observable = this.httpClient + .get(this._authorizationsApiUrl, API_HEADERS) + .pipe(map(response => response.map(authorization => mapAuthorizationApiResponseToAuthorization(authorization)))); + + constructor(private httpClient: HttpClient) {} +} diff --git a/apps/dafa-web/src/app/services/api/employee.service.ts b/apps/dafa-web/src/app/services/api/employee.service.ts index 1748091..36b0ff2 100644 --- a/apps/dafa-web/src/app/services/api/employee.service.ts +++ b/apps/dafa-web/src/app/services/api/employee.service.ts @@ -70,6 +70,8 @@ export class EmployeeService { } public postNewEmployee(employeeData: Employee): Observable { + console.log(employeeData); + return; return this.httpClient .post( this._employeeApiUrl, diff --git a/apps/dafa-web/src/app/services/api/service.service.ts b/apps/dafa-web/src/app/services/api/service.service.ts new file mode 100644 index 0000000..f99b59d --- /dev/null +++ b/apps/dafa-web/src/app/services/api/service.service.ts @@ -0,0 +1,20 @@ +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { environment } from '@dafa-environment'; +import { mapServiceApiResponseToService, Service, ServiceApiResponse } from '@dafa-models/service.model'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; + +const API_HEADERS = { headers: environment.api.headers }; + +@Injectable({ + providedIn: 'root', +}) +export class ServiceService { + private _servicesApiUrl = `${environment.api.url}/services`; + public services$: Observable = this.httpClient + .get(this._servicesApiUrl, API_HEADERS) + .pipe(map(response => response.map(service => mapServiceApiResponseToService(service)))); + + constructor(private httpClient: HttpClient) {} +} diff --git a/apps/dafa-web/src/app/utils/validators/required.validator.ts b/apps/dafa-web/src/app/utils/validators/required.validator.ts index 18954ca..88ab562 100644 --- a/apps/dafa-web/src/app/utils/validators/required.validator.ts +++ b/apps/dafa-web/src/app/utils/validators/required.validator.ts @@ -3,8 +3,14 @@ import { ValidationError } from '@dafa-models/validation-error.model'; export function RequiredValidator(label = 'Fältet'): ValidatorFn { return (control: AbstractControl): ValidationError => { - if (control && !control.value) { - return { type: 'required', message: `${label} är obligatoriskt` }; + if (control) { + if (!control.value) { + return { type: 'required', message: `${label} är obligatoriskt` }; + } + + if (Array.isArray(control.value) && !control.value.length) { + return { type: 'required', message: `Minst ${label} behöver väljas` }; + } } return null; diff --git a/apps/dafa-web/src/assets/logo/arbetsformedlingen-light.svg b/apps/dafa-web/src/assets/logo/arbetsformedlingen-light.svg new file mode 100644 index 0000000..bbf2058 --- /dev/null +++ b/apps/dafa-web/src/assets/logo/arbetsformedlingen-light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/dafa-web/src/environments/environment.pega.ts b/apps/dafa-web/src/environments/environment.pega.ts index 5cb0a02..099a393 100644 --- a/apps/dafa-web/src/environments/environment.pega.ts +++ b/apps/dafa-web/src/environments/environment.pega.ts @@ -3,6 +3,7 @@ export const environment = { api: { meet: 'https://dafa-utv.tocp.arbetsformedlingen.se/prweb/api/meettest/v1', default: 'https://dafa-utv.tocp.arbetsformedlingen.se/prweb/api/v1/data', + url: '/api', headers: { Authorization: 'Basic dGVzdHVzZXIxOmRhZmFAMTIz', // user: testuser1, password: dafa@123 }, diff --git a/apps/dafa-web/src/styles/styles.scss b/apps/dafa-web/src/styles/styles.scss index 1c35aab..9150fdd 100644 --- a/apps/dafa-web/src/styles/styles.scss +++ b/apps/dafa-web/src/styles/styles.scss @@ -15,7 +15,6 @@ body { margin: 0; font-weight: var(--digi--typography--font-weight); - overflow: hidden; } button { diff --git a/mock-api/dafa-web/scripts/authorizations.js b/mock-api/dafa-web/scripts/authorizations.js new file mode 100644 index 0000000..c59f8c2 --- /dev/null +++ b/mock-api/dafa-web/scripts/authorizations.js @@ -0,0 +1,28 @@ +import faker from 'faker'; + +faker.locale = 'sv'; + +function generateAuthorizations() { + return [ + { + id: faker.datatype.uuid(), + name: 'Hantera behörigheter', + }, + { + id: faker.datatype.uuid(), + name: 'Hantera användare', + }, + { + id: faker.datatype.uuid(), + name: 'Hantera organisation', + }, + { + id: faker.datatype.uuid(), + name: 'Hantera ekonomi', + }, + ]; +} + +export default { + generate: generateAuthorizations, +}; diff --git a/mock-api/dafa-web/scripts/current-user.js b/mock-api/dafa-web/scripts/current-user.js index dd9678b..f85f3ac 100644 --- a/mock-api/dafa-web/scripts/current-user.js +++ b/mock-api/dafa-web/scripts/current-user.js @@ -16,9 +16,7 @@ function generateCurrentUser() { min: 1000, max: 9999, })}`, - phone: `07${faker.datatype.number(9)}-${faker.datatype.number({ min: 1000000, max: 9999999 })}`, - email: faker.internet.email(), - organization: ORGANIZATIONS[Math.floor(Math.random() * ORGANIZATIONS.length)], + organizations: [ORGANIZATIONS[Math.floor(Math.random() * ORGANIZATIONS.length)]], authorizations: chooseRandom(AUTHORIZATIONS, faker.datatype.number(3)), }; } diff --git a/mock-api/dafa-web/scripts/employees.js b/mock-api/dafa-web/scripts/employees.js index 24e1850..9ad31c0 100644 --- a/mock-api/dafa-web/scripts/employees.js +++ b/mock-api/dafa-web/scripts/employees.js @@ -1,17 +1,12 @@ import faker from 'faker'; -import kommuner from './kommuner.js'; -import languages from './languages.js'; +import authorizations from './authorizations.js'; import organizations from './organizations.js'; import services from './services.js'; faker.locale = 'sv'; const SERVICES = services.generate(); -const KOMMUN = kommuner.generate(); const ORGANIZATIONS = organizations.generate(); -const STATUSES = [true, false]; -const LANGUAGES = languages.generate(); -const AUTHORIZATIONS = ['Hantera användare', 'Hantera origisation', 'Hantera ekonomi']; function generateEmployees(amount = 10) { const employees = []; @@ -27,24 +22,9 @@ function generateEmployees(amount = 10) { max: 9999, } )}`, - phone: `07${faker.datatype.number(9)}-${faker.datatype.number({ min: 1000000, max: 9999999 })}`, - email: faker.internet.email(), - organization: ORGANIZATIONS[Math.floor(Math.random() * ORGANIZATIONS.length)], - services: [SERVICES[Math.floor(Math.random() * SERVICES.length)].name], - authorizations: AUTHORIZATIONS, - // active: STATUSES[Math.floor(Math.random() * STATUSES.length)], - // languages: [ - // LANGUAGES.find(language => language.name === 'Svenska'), - // ...chooseRandom(LANGUAGES, faker.datatype.number(3)), - // ], - // outOfOffice: STATUSES[Math.floor(Math.random() * STATUSES.length)] - // ? [ - // { - // start: new Date('2021-07-12'), - // end: new Date('2021-07-24'), - // }, - // ] - // : [], + organizations: [ORGANIZATIONS[Math.floor(Math.random() * ORGANIZATIONS.length)]], + services: [SERVICES[Math.floor(Math.random() * SERVICES.length)]], + authorizations: authorizations.generate(), }; employees.push(person); diff --git a/mock-api/dafa-web/scripts/generate-api.js b/mock-api/dafa-web/scripts/generate-api.js index 63cea54..0382d0a 100644 --- a/mock-api/dafa-web/scripts/generate-api.js +++ b/mock-api/dafa-web/scripts/generate-api.js @@ -1,4 +1,5 @@ import fs from 'fs'; +import authorizations from './authorizations.js'; import currentUser from './current-user.js'; import employees from './employees.js'; import kommuner from './kommuner.js'; @@ -20,6 +21,7 @@ const apiData = { employeeId: generatedEmployees[Math.floor(Math.random() * generatedEmployees.length)].id, })), currentUser: currentUser.generate(), + authorizations: authorizations.generate(), }; fs.writeFileSync('api.json', JSON.stringify(apiData, null, '\t')); diff --git a/mock-api/dafa-web/scripts/services.js b/mock-api/dafa-web/scripts/services.js index c03fe2e..bc656a6 100644 --- a/mock-api/dafa-web/scripts/services.js +++ b/mock-api/dafa-web/scripts/services.js @@ -1,23 +1,27 @@ +import faker from 'faker'; + +faker.locale = 'sv'; + function generateServices() { const services = [ { - id: 1, + id: faker.datatype.uuid(), name: 'KROM', }, { - id: 2, + id: faker.datatype.uuid(), name: 'KVL', }, // { - // id: 3, + // id: faker.datatype.uuid(), // name: 'STOM', // }, // { - // id: 4, + // id: faker.datatype.uuid(), // name: 'YSM', // }, // { - // id: 5, + // id: faker.datatype.uuid(), // name: 'AUB', // }, ];