+ );
+};
+
+export default TransportationForm;
diff --git a/src/page-modules/contact/means-of-transport/index.tsx b/src/page-modules/contact/means-of-transport/index.tsx
new file mode 100644
index 00000000..f7679ce0
--- /dev/null
+++ b/src/page-modules/contact/means-of-transport/index.tsx
@@ -0,0 +1,93 @@
+import { useMachine } from '@xstate/react';
+import {
+ FormType,
+ meansOfTransportFormMachine,
+} from './means-of-transport-form-machine';
+import {
+ DelayForm,
+ DriverForm,
+ InjuryForm,
+ ServiceOfferingForm,
+ StopForm,
+ TransportationForm,
+} from './forms';
+import { Button } from '@atb/components/button';
+import { PageText, useTranslation } from '@atb/translations';
+import { FormEventHandler, useState } from 'react';
+import { SectionCard } from '../components/section-card';
+import { RadioInput } from '../components/input/radio';
+import style from '../contact.module.css';
+
+export const MeansOfTransportContent = () => {
+ const { t } = useTranslation();
+ const [state, send] = useMachine(meansOfTransportFormMachine);
+
+ // Local state to force re-render to display errors.
+ const [forceRerender, setForceRerender] = useState(false);
+
+ const onSubmit: FormEventHandler = async (e) => {
+ e.preventDefault();
+ send({ type: 'VALIDATE' });
+
+ // Force a re-render with dummy state.
+ if (Object.keys(state.context.errorMessages).length > 0) {
+ setForceRerender(!forceRerender);
+ }
+ };
+
+ return (
+
+ );
+};
+
+export default MeansOfTransportContent;
diff --git a/src/page-modules/contact/means-of-transport/means-of-transport-form-machine.ts b/src/page-modules/contact/means-of-transport/means-of-transport-form-machine.ts
new file mode 100644
index 00000000..03884d3d
--- /dev/null
+++ b/src/page-modules/contact/means-of-transport/means-of-transport-form-machine.ts
@@ -0,0 +1,252 @@
+import { TransportModeType } from '@atb-as/config-specs';
+import { assign, fromPromise, setup } from 'xstate';
+import { Line } from '../server/journey-planner/validators';
+import { machineEvents, Area } from '../machineEvents';
+import { InputErrorMessages, commonFieldValidator } from '../validation';
+import {
+ convertFilesToBase64,
+ getCurrentDateString,
+ getCurrentTimeString,
+} from '../utils';
+
+export enum FormType {
+ Driver = 'driver',
+ Transportation = 'transportation',
+ Delay = 'delay',
+ Stop = 'stop',
+ ServiceOffering = 'serviceOffering',
+ Injury = 'injury',
+}
+
+type submitInput = {
+ formType: string;
+ areaName: string;
+ transportMode: string;
+ lineName: string;
+ fromStopName: string;
+ toStopName: string;
+ date: string;
+ plannedDepartureTime: string;
+ feedback: string;
+ attachments?: File[];
+ firstName: string;
+ lastName: string;
+ email: string;
+};
+
+export type ContextProps = {
+ formType: FormType | undefined;
+ area: Area | undefined;
+ transportMode: TransportModeType | undefined;
+ line: Line | undefined;
+ fromStop: Line['quays'][0] | undefined;
+ toStop: Line['quays'][0] | undefined;
+ date: string;
+ plannedDepartureTime: string;
+ feedback: string;
+ attachments?: File[];
+ firstName: string;
+ lastName: string;
+ email: string;
+ target?: string;
+ isContactInfoOptional: boolean;
+ wantsToBeContacted: boolean;
+ errorMessages: InputErrorMessages;
+};
+
+export const meansOfTransportFormMachine = setup({
+ types: {
+ context: {} as ContextProps,
+ events: machineEvents,
+ },
+ guards: {
+ validateInputs: ({ context }) => commonFieldValidator(context),
+ },
+ actions: {
+ updateField: assign(({ context, event }) => {
+ if (event.type === 'UPDATE_FIELD') {
+ const { field, value } = event;
+
+ // Remove all errorMessages if changing form type.
+ // Else, remove errorMessages related to type.
+ if (field === 'formType') {
+ context.errorMessages = {};
+ } else {
+ context.errorMessages[field] = [];
+ }
+ return {
+ ...context,
+ [field]: value,
+ };
+ }
+ return context;
+ }),
+
+ toggleField: assign(({ context, event }: any) => {
+ if (event.type === 'TOGGLE') {
+ const { field } = event;
+ return {
+ [field]: !context[field],
+ };
+ }
+ return context;
+ }),
+ },
+ actors: {
+ submit: fromPromise(
+ async ({
+ input: {
+ formType,
+ areaName,
+ transportMode,
+ lineName,
+ fromStopName,
+ toStopName,
+ date,
+ plannedDepartureTime,
+ feedback,
+ attachments,
+ firstName,
+ lastName,
+ email,
+ },
+ }: {
+ input: submitInput;
+ }) => {
+ const base64EncodedAttachments = await convertFilesToBase64(
+ attachments || [],
+ );
+ return await fetch('api/contact/means-of-transport', {
+ method: 'POST',
+ body: JSON.stringify({
+ formType: formType,
+ area: areaName,
+ transportMode: transportMode,
+ line: lineName,
+ fromStop: fromStopName,
+ toStop: toStopName,
+ date: date,
+ plannedDepartureTime: plannedDepartureTime,
+ additionalInfo: feedback,
+ firstName: firstName,
+ lastName: lastName,
+ email: email,
+ attachments: base64EncodedAttachments,
+ }),
+ }).then((response) => {
+ // throw an error to force onError
+ if (!response.ok) throw new Error('Failed to call API');
+ return response.ok;
+ });
+ },
+ ),
+ },
+}).createMachine({
+ /** @xstate-layout N4IgpgJg5mDOIC5QAoC2BDAxgCwJYDswBKAOlwgBswBiAZQFUAhAWQEkAVAbQAYBdRUAAcA9rFwAXXMPwCQAD0QBGAGzcSAZgCsATnXLlAJi2rN6gDQgAnkoDsmktxsAObstN7FN5eoC+Pi2hYeISk5FTU7ADyAOLRADIAojz8SCAiYpLSsgoIACyKJNpFxSUlFtYIRvZO6rUqBg3c3Fp+ARg4BMRklDTsAIIAGqzJsukSUjKpOSpqWrr6VSbmVojqueoaBk6K3AbOqjYGyq0ggR0hJJDj+FB0TGxcfKOi41lTiJqaBdyKmoaKTmcTkB2nKtnsjhcblqyk83hOZ2CXSukhudAS7AA+uwAEp9ABytAACpEcVjmJEACJJJ6pMaZSagHJ2NSKXKudnqGw7TSAsGVdTaEhOYpOTQ2ZqmZS5BHtJGkCjCdAQAi3CDSMBkfAAN2EAGtNYjOgqlSqbggCLrMOgGckRnSXgzsh8vg5fv9AcCQfztiRcsVnHpuO4bLKgsaSIrlarqGAAE5x4RxkiCCg2gBmSdQJCNFyjZqgFp1wmttr49qEjomzoQn2+7oMAKB3pWlQM9nF20cn20nj8-hA+GEEDgslzxGeGWr7wQAFplA4mkvl8ubPz52Hzl0wmBJ69GfIPkLcgZtMpudovmze6DW7UbH7FGzT9wnA12TKB+PSCjVXunTO2wPq47anmK3DaGKuT8msBS5M4EFit4Ng2OoBifm04Z5qaf4OlObxMqsmi5H6TjrGRhwoV4wb8r8BgOAh5FNCo56bvKJCwAArpgmBwPAeH7jWQEOIYmhgZoiHEbRzQkKY2jBl83C5GKnihv2QA */
+ initial: 'editing',
+ context: {
+ formType: undefined,
+ area: undefined,
+ transportMode: undefined,
+ line: undefined,
+ fromStop: undefined,
+ toStop: undefined,
+ date: getCurrentDateString(),
+ plannedDepartureTime: getCurrentTimeString(),
+ feedback: '',
+ firstName: '',
+ lastName: '',
+ email: '',
+ isContactInfoOptional: true,
+ wantsToBeContacted: false,
+ errorMessages: {},
+ },
+ states: {
+ editing: {
+ initial: 'idle',
+ on: {
+ TOGGLE: {
+ actions: 'toggleField',
+ },
+
+ UPDATE_FIELD: {
+ actions: 'updateField',
+ },
+
+ VALIDATE: {
+ guard: 'validateInputs',
+ target: 'editing.readyForSubmit',
+ },
+ },
+
+ states: {
+ idle: {},
+ readyForSubmit: {
+ type: 'final',
+ },
+ },
+
+ onDone: {
+ target: 'submitting',
+ },
+ },
+
+ submitting: {
+ invoke: {
+ src: 'submit',
+ input: ({ context }) => {
+ const {
+ formType,
+ area,
+ transportMode,
+ line,
+ fromStop,
+ toStop,
+ date,
+ plannedDepartureTime,
+ feedback,
+ firstName,
+ lastName,
+ email,
+ } = context;
+ if (
+ !formType ||
+ !area ||
+ !transportMode ||
+ !line ||
+ !fromStop ||
+ !toStop
+ ) {
+ throw new Error(`Missing required field(s)`);
+ }
+ return {
+ formType: formType,
+ areaName: area.name.no,
+ transportMode: transportMode,
+ lineName: line.name,
+ fromStopName: fromStop.name,
+ toStopName: toStop.name,
+ date: date,
+ plannedDepartureTime: plannedDepartureTime,
+ feedback: feedback,
+ firstName: firstName,
+ lastName: lastName,
+ email: email,
+ };
+ },
+
+ onDone: {
+ target: 'success',
+ },
+
+ onError: {
+ target: 'editing',
+ },
+ },
+ },
+
+ success: {
+ type: 'final',
+ },
+ },
+});
diff --git a/src/page-modules/contact/ticket-control/feedback/feedbackformMachine.ts b/src/page-modules/contact/ticket-control/feedback/feedbackformMachine.ts
index 65516e70..4d2fb4c4 100644
--- a/src/page-modules/contact/ticket-control/feedback/feedbackformMachine.ts
+++ b/src/page-modules/contact/ticket-control/feedback/feedbackformMachine.ts
@@ -3,7 +3,11 @@ import { Line } from '../../server/journey-planner/validators';
import { assign, fromPromise, setup } from 'xstate';
import { commonFieldValidator, InputErrorMessages } from '../../validation';
import { machineEvents } from '../../machineEvents';
-import { convertFilesToBase64 } from '../../utils';
+import {
+ convertFilesToBase64,
+ getCurrentDateString,
+ getCurrentTimeString,
+} from '../../utils';
type APIParams = {
transportMode: TransportModeType | undefined;
@@ -108,8 +112,8 @@ export const formMachine = setup({
line: undefined,
fromStop: undefined,
toStop: undefined,
- date: new Date().toISOString().split('T')[0],
- plannedDepartureTime: `${String(new Date().getHours()).padStart(2, '0')}:${String(new Date().getMinutes()).padStart(2, '0')}`,
+ date: getCurrentDateString(),
+ plannedDepartureTime: getCurrentTimeString(),
feedback: '',
firstName: '',
lastName: '',
diff --git a/src/page-modules/contact/travel-guarantee/travelGuaranteeFormMachine.ts b/src/page-modules/contact/travel-guarantee/travelGuaranteeFormMachine.ts
index 2c58b69b..6f6901a9 100644
--- a/src/page-modules/contact/travel-guarantee/travelGuaranteeFormMachine.ts
+++ b/src/page-modules/contact/travel-guarantee/travelGuaranteeFormMachine.ts
@@ -6,6 +6,7 @@ import {
InputErrorMessages,
travelGuaranteeFieldValidator,
} from '../validation';
+import { getCurrentDateString, getCurrentTimeString } from '../utils';
type APIParams = {
transportMode: TransportModeType | undefined;
@@ -154,8 +155,8 @@ export const fetchMachine = setup({
line: undefined,
fromStop: undefined,
toStop: undefined,
- date: new Date().toISOString().split('T')[0],
- plannedDepartureTime: `${String(new Date().getHours()).padStart(2, '0')}:${String(new Date().getMinutes()).padStart(2, '0')}`,
+ date: getCurrentDateString(),
+ plannedDepartureTime: getCurrentTimeString(),
reasonForTransportFailure: undefined,
kilometersDriven: '',
feedback: '',
diff --git a/src/page-modules/contact/utils.ts b/src/page-modules/contact/utils.ts
index 9f8fd869..80d066c6 100644
--- a/src/page-modules/contact/utils.ts
+++ b/src/page-modules/contact/utils.ts
@@ -30,3 +30,9 @@ export const convertFilesToBase64 = (
return Promise.all(filePromises);
};
+
+export const getCurrentDateString = (): string =>
+ new Date().toISOString().split('T')[0];
+
+export const getCurrentTimeString = (): string =>
+ `${String(new Date().getHours()).padStart(2, '0')}:${String(new Date().getMinutes()).padStart(2, '0')}`;
diff --git a/src/page-modules/contact/validation/commonFieldValidator.ts b/src/page-modules/contact/validation/commonFieldValidator.ts
index 1ba77814..d1166d9d 100644
--- a/src/page-modules/contact/validation/commonFieldValidator.ts
+++ b/src/page-modules/contact/validation/commonFieldValidator.ts
@@ -6,17 +6,18 @@ export const commonFieldValidator = (context: any) => {
const inputFieldRules = [
{
field: 'firstName',
- validCondition: context.firstName,
+ validCondition: context.firstName || context.isContactInfoOptional,
+
errorMessage: PageText.Contact.inputFields.firstName.errorMessages.empty,
},
{
field: 'lastName',
- validCondition: context.lastName,
+ validCondition: context.lastName || context.isContactInfoOptional,
errorMessage: PageText.Contact.inputFields.lastName.errorMessages.empty,
},
{
field: 'email',
- validCondition: context.email,
+ validCondition: context.email || context.isContactInfoOptional,
errorMessage: PageText.Contact.inputFields.email.errorMessages.empty,
},
{
@@ -47,6 +48,11 @@ export const commonFieldValidator = (context: any) => {
errorMessage:
PageText.Contact.inputFields.bankAccountNumber.errorMessages.empty,
},
+ {
+ field: 'area',
+ validCondition: context.area,
+ errorMessage: PageText.Contact.inputFields.area.errorMessages.empty,
+ },
{
field: 'transportMode',
validCondition: context.transportMode,
diff --git a/src/pages/contact/means-of-transport/index.tsx b/src/pages/contact/means-of-transport/index.tsx
new file mode 100644
index 00000000..090d84b6
--- /dev/null
+++ b/src/pages/contact/means-of-transport/index.tsx
@@ -0,0 +1,24 @@
+import DefaultLayout from '@atb/layouts/default';
+import { withGlobalData, WithGlobalData } from '@atb/layouts/global-data';
+import {
+ ContactPageLayout,
+ ContactPageLayoutProps,
+ MeansOfTransportContent,
+} from '@atb/page-modules/contact';
+import { NextPage } from 'next';
+
+export type MeansOfTransportPageProps = WithGlobalData;
+
+const MeansOfTransportPage: NextPage = (props) => {
+ return (
+
+
+
+
+
+ );
+};
+
+export default MeansOfTransportPage;
+
+export const getServerSideProps = withGlobalData();
diff --git a/src/translations/pages/contact.ts b/src/translations/pages/contact.ts
index c8f8901f..46358ed4 100644
--- a/src/translations/pages/contact.ts
+++ b/src/translations/pages/contact.ts
@@ -1,4 +1,7 @@
-import { ReasonForTransportFailure } from '@atb/page-modules/contact/machineEvents';
+import {
+ ReasonForTransportFailure,
+ Area,
+} from '@atb/page-modules/contact/machineEvents';
import { translation as _ } from '@atb/translations/commons';
export const Contact = {
@@ -344,13 +347,142 @@ export const Contact = {
},
},
},
+
modeOfTransport: {
title: _(
'Transportmiddel og stoppested',
'Means of transport and stopping place',
'Transportmiddel og stoppested',
),
+
+ driver: {
+ description: _(
+ 'Tilbakemelding på sjåfør/mannskap',
+ 'Feedback on driver/crew',
+ 'Tilbakemelding på sjåfør/mannskap',
+ ),
+ info: _(
+ 'Har du opplevd uansvarlig kjøring, eller reagert på hvordan mannskapet gjorde jobben sin, kan du gi tilbakemelding her. Har du hatt en ekstra hyggelig opplevelse, vil vi gjerne høre om det også.',
+ 'If you have experienced irresponsible driving, or reacted to how the crew did their job, you can give feedback here. If you have had an extra pleasant experience, we would like to hear about it too.',
+ 'Har du opplevd uforsvarleg køyring, eller reagert på korleis mannskapet gjorde jobben sin, kan du gi tilbakemelding her. Har du hatt ei ekstra hyggeleg oppleving, vil vi gjerne høyre om det også.',
+ ),
+ about: {
+ title: _('Om reisen', 'About the trip', 'Om reisa'),
+ description: _(
+ 'Vi trenger å vite litt om reisen din. Da er det lettere for oss å følge opp saken.',
+ 'We need to know a bit about your journey. Then it is easier for us to follow up on the case.',
+ 'Vi treng å vite litt om reisa di. Då er det enklare for oss å følgje opp saka.',
+ ),
+ },
+ },
+ transportation: {
+ description: _(
+ 'Tilbakemelding på transportmiddel',
+ 'Feedback on transport vehicle',
+ 'Tilbakemelding på transportmiddel',
+ ),
+ info: _(
+ 'Har du opplevd noe som ikke var som det skulle på transportmiddelet, kan du gi tilbakemelding her. Har du hatt en ekstra hyggelig opplevelse, vil vi gjerne høre om det også.',
+ 'If you have experienced something that was not as it should be on the means of transport, you can give feedback here. If you have had an extra pleasant experience, we would like to hear about it too.',
+ 'Har du opplevd noko som ikkje var som det skulle på transportmiddelet, kan du gi tilbakemelding her. Har du hatt ei ekstra hyggeleg oppleving, vil vi gjerne høyre om det også.',
+ ),
+ about: {
+ title: _('Om reisen', 'About the trip', 'Om reisa'),
+ description: _(
+ 'Vi trenger å vite litt om reisen din. Da er det lettere for oss å følge opp saken.',
+ 'We need to know a bit about your journey. Then it is easier for us to follow up on the case.',
+ 'Vi treng å vite litt om reisa di. Då er det enklare for oss å følgje opp saka.',
+ ),
+ },
+ },
+ delay: {
+ description: _(
+ 'Forinkelse, kjørt for tidlig eller innstilt',
+ 'Delay, driven too early or cancelled',
+ 'Forseinking, køyrd for tidleg eller innstilt',
+ ),
+ info: _(
+ 'Hvis transportmiddelet ditt er forsinket, for tidlig ute, ikke stoppet, manglet plass eller hvis du ikke fikk tilstrekkelig informasjon om planlakte avvik, kan du gi tilbakemelding her.',
+ 'If your means of transport is delayed, left too early, did not stop, lacked space or if you did not receive sufficient information about planned deviations, you can give feedback here.',
+ 'Viss transportmiddelet ditt er forseinka, for tidleg ute, ikkje stoppa, mangla plass eller viss du ikkje fekk tilstrekkeleg informasjon om planlagde avvik, kan du gi tilbakemelding her. ',
+ ),
+ about: {
+ title: _('Om reisen', 'About the trip', 'Om reisa'),
+ description: _(
+ 'Vi trenger å vite litt om reisen din. Da er det lettere for oss å følge opp saken.',
+ 'We need to know a bit about your journey. Then it is easier for us to follow up on the case.',
+ 'Vi treng å vite litt om reisa di. Då er det enklare for oss å følgje opp saka.',
+ ),
+ },
+ },
+ stop: {
+ description: _(
+ 'Tilbakemelding på holdeplass/kai',
+ 'Feedback on stop/dock',
+ 'Tilbakemelding på haldeplass/kai',
+ ),
+ info: _(
+ 'Har du opplevd en feil eller manglende stopp? Eksempler kan være skade på leseskur, søppel, feil med sanntidsskilt eller lignende.',
+ 'Have you experienced an error or lack of a stop? Examples could be damage to reading sheds, litter, errors with real-time signs, or the like.',
+ 'Har du opplevd ein feil eller mangel på stoppestaden? Eksempel kan vere skader på leskur, søppel, feil med sanntidsskilt, eller liknande.',
+ ),
+ about: {
+ title: _(
+ 'Om holdeplassen/kaia',
+ 'About the stop/dock',
+ 'Om haldeplassen/kaia',
+ ),
+ description: _(
+ 'Vi trenger å vite litt om reisen din. Da er det lettere for oss å følge opp saken.',
+ 'We need to know a bit about your journey. Then it is easier for us to follow up on the case.',
+ 'Vi treng å vite litt om reisa di. Då er det enklare for oss å følgje opp saka.',
+ ),
+ },
+ },
+ serviceOffering: {
+ description: _(
+ 'Tilbakemelding på rutetilbudet',
+ 'Feedback on route offering',
+ 'Tilbakemelding på rutetilbodet',
+ ),
+ info: _(
+ 'Har du et forslag til ruteendring, eller vil du gi tilbakemelding på tilbudet vårt? Gi oss gjerne tilbakemelding her. Alle oppføringer lagres og systematiseres og inngår i den årlige ruteendringsprosessen. Vi kan ikke gi individuell tilbakemelding på hvilke innspill/forslag som innføres.',
+ 'Do you have a suggestion for a route change, or would you like to give feedback on our offer? Feel free to give us feedback here. All entries are stored and systematized and are included in the annual route change process. We cannot give individual feedback on which input/suggestions are introduced.',
+ 'Har du eit forslag til ruteendring, eller ønsker du å gi tilbakemelding på tilbodet vårt? Gi oss gjerne tilbakemelding her. Alle innspel blir lagra og systematisert og blir tatt med i den årlege ruteendringsprosessen. Vi kan ikkje gi individuelle tilbakemeldingar på kva innspel/forslag som blir innførte. ',
+ ),
+
+ about: {
+ title: _('Om reisen', 'About the trip', 'Om reisa'),
+ description: _(
+ 'Vi trenger å vite litt om reisen din. Da er det lettere for oss å følge opp saken.',
+ 'We need to know a bit about your journey. Then it is easier for us to follow up on the case.',
+ 'Vi treng å vite litt om reisa di. Då er det enklare for oss å følgje opp saka.',
+ ),
+ },
+ },
+ injury: {
+ description: _(
+ 'Melde fra om personskade eller ulykke',
+ 'Report of personal injury or accident',
+ 'Melde frå om personskade eller ulykke',
+ ),
+ info: _(
+ 'Har du skadet deg selv eller noe du eier om bord på et av våre transportmidler eller ved kai/brygge? Gi tilbakemelding her, så tar vi saken videre med det aktuelle busselskapet eller ledergruppen.',
+ 'Did you injure yourself or something you own on board one of our means of transport or at a dock? Give feedback here, and we will take the matter further with the relevant bus company or management team.',
+ 'Skada du deg sjølv eller noko du eig om bord på eit av våre transportmiddel eller på haldeplass/kai? Gi tilbakemelding her, så tar vi saka vidare med aktuelt busselskap eller reiarlag.',
+ ),
+
+ about: {
+ title: _('Om reisen', 'About the trip', 'Om reisa'),
+ description: _(
+ 'Vi trenger å vite litt om reisen din. Da er det lettere for oss å følge opp saken.',
+ 'We need to know a bit about your journey. Then it is easier for us to follow up on the case.',
+ 'Vi treng å vite litt om reisa di. Då er det enklare for oss å følgje opp saka.',
+ ),
+ },
+ },
},
+
ticketsApp: {
title: _('Billetter og app', 'Tickets and app', 'Billettar og app'),
},
@@ -366,6 +498,11 @@ export const Contact = {
'Information about you',
'Informasjon om deg',
),
+ optionalTitle: _(
+ 'Informasjon om deg (valgfritt)',
+ 'Information about you (optinal)',
+ 'Informasjon om deg (valfritt)',
+ ),
firstname: _(
'Fornavn og mellomnavn',
@@ -430,6 +567,21 @@ export const Contact = {
email: {
label: _('E-post', 'Email', 'E-post'),
+ wantsToBeContacted: {
+ label: _(
+ 'E-post (må fylles ut hvis du vil ha svar)',
+ 'Email (must be entered if you want to receive an answer)',
+ 'E-post (må fyllast ut viss du vil ha svar)',
+ ),
+ question: _(
+ 'Ønsker du svar på angåande saka?',
+ 'Ønsker du svar på angåande saka?',
+ 'Ønsker du svar på angåande saka?',
+ ),
+
+ yes: _('Ja', 'Yes', 'Ja'),
+ no: _('Nei', 'No', 'Nei'),
+ },
errorMessages: {
empty: _(
'Vennligst fyll ut informasjon om deg',
@@ -506,14 +658,18 @@ export const Contact = {
},
transportMode: {
- label: _('Reisemåte', 'Transport mode', 'Reisemåte'),
+ label: _('Transportmiddel', 'Transport mode', 'Transportmiddel'),
optionLabel: _(
- 'Velg reisemåte',
+ 'Velg transportmiddel',
'Select transport mode',
- 'Velg reisemåte',
+ 'Velg transportmiddel',
),
errorMessages: {
- empty: _('Velg reisemåte', 'Select transport mode', 'Velg reisemåte'),
+ empty: _(
+ 'Velg transportmiddel',
+ 'Select transport mode',
+ 'Velg transportmiddel',
+ ),
},
},
@@ -526,7 +682,12 @@ export const Contact = {
},
fromStop: {
- label: _('Avreisested', 'Departure location', 'Avreisested'),
+ label: _('Fra holdeplass/kai', 'From stop/harbor', 'Frå haldeplass/kai'),
+ labelWhitoutSpecification: _(
+ 'Holdeplass/kai',
+ 'Stop/harbor',
+ 'Haldeplass/kai',
+ ),
optionLabel: _(
'Velg avreisested',
'Select departure loation',
@@ -542,7 +703,7 @@ export const Contact = {
},
toStop: {
- label: _('Ankomststed', 'Arrival location', 'Ankomststed'),
+ label: _('Til holdeplass/kai', 'To stop/harbor', 'Til haldeplass/kai'),
optionLabel: _(
'Velg anskomststed',
'Select arrival location',
@@ -557,7 +718,11 @@ export const Contact = {
},
},
date: _('Dato', 'Date', 'Dato'),
- plannedDepartureTime: _('Avgangstid', 'Departure time', 'Avgangstid'),
+ plannedDepartureTime: _(
+ 'Planlagt avgangstid',
+ 'Planned departure time',
+ 'Planlagd avgangstid',
+ ),
reasonForTransportFailure: {
label: _('Mulige valg', 'Options', 'Moglege val'),
optionLabel: _('Velg årsak', 'Select reason', 'Vel åtsak'),
@@ -718,6 +883,12 @@ export const Contact = {
'Ønsker du å fortelje oss noko meir? (valfritt)',
),
+ description: _(
+ 'Unngå å oppgi personlig informasjon som bankkortnummer eller helseopplysninger. Vi vil spørre deg senere om det er nødvendig.',
+ 'Avoid providing personal information such as bank card numbers or health information. We will ask you later if it is necessary.',
+ 'Unngå å oppgi personopplysningar som bankkortnummer eller helseopplysningar. Vi spør deg seinare viss det er nødvendig.',
+ ),
+
attachment: _(
'Last opp vedlegg',
'Upload attachments',
@@ -731,5 +902,78 @@ export const Contact = {
),
},
},
+ area: {
+ label: _('Område', 'Area', 'Område'),
+ optionLabel: _('Velg område', 'Select area', 'Vel område'),
+ options: [
+ {
+ id: 'rp1',
+ name: _(
+ 'Ålesund, Giske, Sula (RP1)',
+ 'Ålesund, Giske, Sula (RP1)',
+ 'Ålesund, Giske, Sula (RP1)',
+ ),
+ },
+ {
+ id: 'rp2',
+ name: _(
+ 'Kristiansund, Averøy, Aure, Smøla (RP2)',
+ 'Kristiansund, Averøy, Aure, Smøla (RP2)',
+ 'Kristiansund, Averøy, Aure, Smøla (RP2)',
+ ),
+ },
+ {
+ id: 'rp3',
+ name: _(
+ 'Molde (unntatt Skåla), Gjemnes (RP3)',
+ 'Molde (except Skåla), Gjemnes (RP3)',
+ 'Molde (unntatt Skåla), Gjemnes (RP3)',
+ ),
+ },
+ {
+ id: 'rp4',
+ name: _(
+ 'Sunnmøre nord (RP4)',
+ 'Sunnmøre nord (RP4)',
+ 'Sunnmøre nord (RP4)',
+ ),
+ },
+ {
+ id: 'rp5',
+ name: _(
+ 'Sunnmøre sør (RP5)',
+ 'Sunnmøre sør (RP5)',
+ 'Sunnmøre sør (RP5)',
+ ),
+ },
+ {
+ id: 'rp6',
+ name: _(
+ 'Sunndalsøra, Surnadal, Trondheim, Oppdal (RP6)',
+ 'Sunndalsøra, Surnadal, Trondheim, Oppdal (RP6)',
+ 'Sunndalsøra, Surnadal, Trondheim, Oppdal (RP6)',
+ ),
+ },
+ {
+ id: 'rp7',
+ name: _(
+ 'Rauma, Vestnes, Skåla (RP7)',
+ 'Rauma, Vestnes, Skåla (RP7)',
+ 'Rauma, Vestnes, Skåla (RP7)',
+ ),
+ },
+ {
+ id: 'rp8',
+ name: _(
+ 'Hustadvika, Midsund, Aukra (RP8)',
+ 'Hustadvika, Midsund, Aukra (RP8)',
+ 'Hustadvika, Midsund, Aukra (RP8)',
+ ),
+ },
+ ] as Area[],
+ errorMessages: {
+ empty: _('Område mangler', 'Area is missing', 'Område mangler'),
+ },
+ },
},
};