diff --git a/.env b/.env
index 49e954c87..9c54c3073 100644
--- a/.env
+++ b/.env
@@ -4,5 +4,8 @@ REACT_APP_OIDC_CLIENT_ID="https://api.hel.fi/auth/helsinkiprofile-ui"
REACT_APP_PROFILE_AUDIENCE="https://api.hel.fi/auth/helsinkiprofile"
REACT_APP_PROFILE_GRAPHQL=
REACT_APP_OIDC_SCOPE="openid profile $REACT_APP_PROFILE_AUDIENCE"
-REACT_APP_SENTRY_DSN=
+REACT_APP_SENTRY_DSN="https://8b5b23e2171b42cd8617e2b1ad7353b6@sentry.hel.ninja/63"
REACT_APP_VERSION=$npm_package_version
+TRANSLATION_LANGUAGES=en,fi,sv
+TRANSLATIONS_SHEET_ID=1Q5LfG2wC_vxsoK0Ko-J1npWzY-96QQCERqMpvA0s9hg
+TRANSLATION_PROJECT_NAME=open-city-profile
diff --git a/.env.development b/.env.development
index 5900c7942..37812ec1f 100644
--- a/.env.development
+++ b/.env.development
@@ -1,3 +1,3 @@
-REACT_APP_OIDC_AUTHORITY="https://tunnistamo.test.kuva.hel.ninja/"
+REACT_APP_OIDC_AUTHORITY="https://api.hel.fi/sso-test/"
REACT_APP_OIDC_CLIENT_ID="https://api.hel.fi/auth/helsinkiprofile-ui"
REACT_APP_PROFILE_GRAPHQL="https://profiili-api.test.kuva.hel.ninja/graphql/"
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index bb0478872..36ead8cca 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -11,6 +11,7 @@ build-review:
extends: .build
variables:
DOCKER_IMAGE_NAME: "$CI_PROJECT_NAME-review"
+ DOCKER_BUILD_ARG_REACT_APP_ENVIRONMENT: 'review'
DOCKER_BUILD_ARG_REACT_APP_OIDC_AUTHORITY: "https://tunnistamo.test.kuva.hel.ninja/"
DOCKER_BUILD_ARG_REACT_APP_PROFILE_GRAPHQL: "https://profiili-api.test.kuva.hel.ninja/graphql/"
only:
@@ -21,7 +22,8 @@ build-staging:
extends: .build
variables:
DOCKER_IMAGE_NAME: "$CI_PROJECT_NAME-staging"
- DOCKER_BUILD_ARG_REACT_APP_OIDC_AUTHORITY: "https://tunnistamo.test.kuva.hel.ninja/"
+ DOCKER_BUILD_ARG_REACT_APP_ENVIRONMENT: 'staging'
+ DOCKER_BUILD_ARG_REACT_APP_OIDC_AUTHORITY: "https://api.hel.fi/sso-test/"
DOCKER_BUILD_ARG_REACT_APP_PROFILE_GRAPHQL: "https://profiili-api.test.kuva.hel.ninja/graphql/"
only:
refs:
@@ -31,6 +33,7 @@ build-production:
extends: .build
variables:
DOCKER_IMAGE_NAME: "$CI_PROJECT_NAME-production"
+ DOCKER_BUILD_ARG_REACT_APP_ENVIRONMENT: 'production'
DOCKER_BUILD_ARG_REACT_APP_OIDC_AUTHORITY: "https://api.hel.fi/sso/"
DOCKER_BUILD_ARG_REACT_APP_PROFILE_GRAPHQL: "https://profiili-api.prod.kuva.hel.ninja/graphql/"
only:
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 000000000..8188838d8
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,11 @@
+Contributions are accepted as pull requests. Please observe our coding
+practices at https://github.com/City-of-Helsinki/bestpractice/ .
+Please make your pull requests short, elegant and only handling one
+issue at a time!
+
+
+
+
+Our contribution handling guidelines are at
+https://github.com/City-of-Helsinki/bestpractice/blob/master/accepting-contributions.md
diff --git a/Dockerfile b/Dockerfile
index 842f46a06..af4b9d143 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -56,6 +56,8 @@ FROM appbase as staticbuilder
ARG REACT_APP_PROFILE_GRAPHQL
ARG REACT_APP_OIDC_AUTHORITY
+ARG REACT_APP_ENVIRONMENT
+
COPY . /app
RUN yarn build
diff --git a/README.md b/README.md
index 092bbef7c..07aa5bdd7 100644
--- a/README.md
+++ b/README.md
@@ -4,19 +4,13 @@ UI for citizen-profile - This project was bootstrapped with [Create React App](h
## Environments
-Test: https://omahelsinki.test.kuva.hel.ninja/
+Test: https://profiili.test.kuva.hel.ninja/
-Staging: None
+Production: https://profiili.prod.kuva.hel.ninja/
-Production: None
+## Issues board
-## Development
-
-If running on Linux or MacOS, easiest way is to just run the app without docker. Any semi-new version of node should probably work, the docker-image is set to use node 12.
-
-Run `yarn` to install dependencies, start app with `yarn start`.
-
-The graphql-backend for development is located at https://helsinkiprofile.test.kuva.hel.ninja/graphql/, it has graphiql installed so you can browse it in your browser!
+https://helsinkisolutionoffice.atlassian.net/projects/OM/issues/?filter=allissues&=
## CI
@@ -49,13 +43,16 @@ Your app is ready to be deployed!
See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.
-## Running with docker
+### `yarn codegen`
+
+Generate static types for GraphQL queries by using the schema from the backend server.
-If you really must, you can run this app with docker locally.
+### `yarn update-translations`
-Run `docker-compose up` to start the app in docker.
+Fetches translation data from our Google Spreadsheet and updates translation files. See `.env` for configuration.
+
+You still need to update tests and add the translation files to the git repository manually.
-`docker-compose down` stops the container.
## Environment variables
@@ -68,12 +65,39 @@ The following envs are used:
- REACT_APP_PROFILE_AUDIENCE - name of the api-token that client uses profile-api with
- REACT_APP_PROFILE_GRAPHQL - URL to the profile graphql
- REACT_APP_OIDC_SCOPE - which scopes the app requires
-- REACT_APP_SENTRY_DSN - not yet used
+- REACT_APP_SENTRY_DSN - sentry public dns-key
+
+
+## Setting up local development environment with Docker
+
+### Set tunnistamo hostname
+
+Add the following line to your hosts file (`/etc/hosts` on mac and linux):
+
+ 127.0.0.1 tunnistamo-backend
+
+### Create a new OAuth app on GitHub
+
+Go to https://github.com/settings/developers/ and add a new app with the following settings:
+
+- Application name: can be anything, e.g. local tunnistamo
+- Homepage URL: http://tunnistamo-backend:8000
+- Authorization callback URL: http://tunnistamo-backend:8000/accounts/github/login/callback/
+Save. You'll need the created **Client ID** and **Client Secret** for configuring tunnistamo in the next step.
-## Tunnistamo configuration
+### Install local tunnistamo
-This app uses tunnistamo for authentication. Tunnistamo needs to have the following things set up:
+Clone https://github.com/City-of-Helsinki/tunnistamo/.
+
+Follow the instructions for setting up tunnistamo locally. Before running `docker-compose up` set the following settings in tunnistamo roots `docker-compose.env.yaml`:
+
+- SOCIAL_AUTH_GITHUB_KEY: **Client ID** from the GitHub OAuth app
+- SOCIAL_AUTH_GITHUB_SECRET: **Client Secret** from the GitHub OAuth app
+
+Run `docker-compose up`
+
+After container is up and running, few things need to be set up at http://localhost:8000/admin
**OIDC client**
@@ -89,6 +113,33 @@ Requires the following things:
The scopes this app uses are set with the REACT_APP_OIDC_SCOPE environment variable.
+### Install local open-city-profile
+Clone https://github.com/City-of-Helsinki/open-city-profile/.
+
+1. Create a `docker-compose.env.yaml` file in the project folder:
+ * Use `docker-compose.env.yaml.example` as a base, it does not need any changes
+ for getting the project running.
+ * Change `DEBUG` and the rest of the Django settings if needed.
+ * `TOKEN_AUTH_*`, settings for [tunnistamo](https://github.com/City-of-Helsinki/tunnistamo) authentication service
+ * Set entrypoint/startup variables according to taste.
+ * `CREATE_SUPERUSER`, creates a superuser with credentials `admin`:`admin` (admin@example.com)
+ * `APPLY_MIGRATIONS`, applies migrations on startup
+ * `BOOTSTRAP_DIVISIONS`, bootstrap data import for divisions
+
+2. Run `docker-compose up`
+
+### open-city-profile-ui
+
+If running on Linux or MacOS, easiest way is to just run the app without docker. Any semi-new version of node should probably work, the docker-image is set to use node 12.
+
+`docker-compose up` starts the container.
+
+OR
+
+Run `yarn` to install dependencies, start app with `yarn start`.
+
+The graphql-backend for development is located at https://profiili-api.test.kuva.hel.ninja/graphql/, it has graphiql installed so you can browse it in your browser!
+
## Learn More
You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).
diff --git a/package.json b/package.json
index 100bd2d0c..ea342f56f 100644
--- a/package.json
+++ b/package.json
@@ -1,10 +1,13 @@
{
"name": "open-city-profile-ui",
- "version": "1.0.0-rc.1",
+ "version": "1.0.0-rc.2",
"license": "MIT",
"private": true,
"dependencies": {
"@apollo/react-hooks": "^3.1.3",
+ "@apollo/react-testing": "^3.1.3",
+ "@datapunt/matomo-tracker-react": "^0.1.2",
+ "@sentry/browser": "^5.15.4",
"@types/classnames": "^2.2.9",
"@types/enzyme": "^3.10.5",
"@types/enzyme-adapter-react-16": "^1.0.6",
@@ -12,6 +15,7 @@
"@types/node": "12.11.5",
"@types/react": "16.9.9",
"@types/react-dom": "16.9.2",
+ "@types/react-helmet": "^6.0.0",
"@types/react-modal": "^3.10.1",
"@types/react-redux": "^7.1.5",
"@types/react-router-dom": "^5.1.0",
@@ -25,13 +29,16 @@
"formik": "^2.0.4",
"graphql": "^14.5.8",
"graphql.macro": "^1.4.2",
- "hds-core": "^0.4.0",
- "hds-react": "^0.5.3",
+ "hds-core": "0.6.3",
+ "hds-design-tokens": "0.2.0",
+ "hds-react": "0.7.2",
+ "i18n-iso-countries": "^5.3.0",
"i18next": "^17.3.0",
"i18next-browser-languagedetector": "^4.0.1",
"oidc-client": "^1.9.1",
"react": "^16.11.0",
"react-dom": "^16.11.0",
+ "react-helmet": "^6.0.0",
"react-i18next": "^10.13.1",
"react-modal": "^3.11.1",
"react-redux": "^7.1.1",
@@ -49,7 +56,8 @@
"test": "react-scripts test",
"ci": "CI=true yarn test --coverage",
"lint": "eslint --ext js,ts,tsx src",
- "codegen": "apollo client:codegen ./src/graphql/generatedTypes.ts --outputFlat --includes=./src/**/*.graphql --target=typescript --endpoint=https://helsinkiprofile.test.kuva.hel.ninja/graphql/ --useReadOnlyTypes --addTypename"
+ "codegen": "apollo client:codegen ./src/graphql/generatedTypes.ts --outputFlat --includes=./src/**/*.graphql --target=typescript --endpoint=https://profiili-api.test.kuva.hel.ninja/graphql/ --useReadOnlyTypes --addTypename",
+ "update-translations": "ts-node -P ./scripts/tsconfig.json -r dotenv/config --files scripts/update-translations.ts"
},
"eslintConfig": {
"extends": "react-app"
@@ -70,7 +78,9 @@
"apollo": "^2.21.1",
"eslint-config-prettier": "^6.4.0",
"eslint-plugin-prettier": "^3.1.1",
+ "helsinki-utils": "City-of-Helsinki/helsinki-utils-js#0.1.0",
"jest-fetch-mock": "^2.1.2",
- "prettier": "^1.18.2"
+ "prettier": "^1.18.2",
+ "ts-node": "^8.8.2"
}
}
diff --git a/public/index.html b/public/index.html
index ff4219a90..d57aa728f 100644
--- a/public/index.html
+++ b/public/index.html
@@ -1,41 +1,18 @@
-
+
-
-
- Open city profile app
+ Profiili
-
diff --git a/public/robots.txt b/public/robots.txt
index 01b0f9a10..b21f0887a 100644
--- a/public/robots.txt
+++ b/public/robots.txt
@@ -1,2 +1,3 @@
# https://www.robotstxt.org/robotstxt.html
User-agent: *
+Disallow: /
diff --git a/scripts/helsinki-utils.d.ts b/scripts/helsinki-utils.d.ts
new file mode 100644
index 000000000..1b674459e
--- /dev/null
+++ b/scripts/helsinki-utils.d.ts
@@ -0,0 +1,9 @@
+declare module 'helsinki-utils/scripts/fetch-translations' {
+ function fetchTranslations(
+ sheetId: string,
+ languages: string[],
+ output: string,
+ debug?: boolean
+ ): Promise;
+ export = fetchTranslations;
+}
diff --git a/scripts/tsconfig.json b/scripts/tsconfig.json
new file mode 100644
index 000000000..5b66bde8d
--- /dev/null
+++ b/scripts/tsconfig.json
@@ -0,0 +1,13 @@
+{
+ "compilerOptions": {
+ "module": "commonjs",
+ "target": "es5",
+ "noImplicitAny": true,
+ "outDir": "./dist",
+ "sourceMap": true,
+ "esModuleInterop": true
+ },
+ "include": [
+ "*"
+ ],
+ }
\ No newline at end of file
diff --git a/scripts/update-translations.ts b/scripts/update-translations.ts
new file mode 100644
index 000000000..cd9a5c418
--- /dev/null
+++ b/scripts/update-translations.ts
@@ -0,0 +1,22 @@
+#!/usr/bin/env ts-node-script
+import * as path from 'path';
+
+///
+import fetchTranslations from 'helsinki-utils/scripts/fetch-translations';
+
+const languages = process.env.TRANSLATION_LANGUAGES.split(',');
+const sheetId = process.env.TRANSLATIONS_SHEET_ID;
+
+const pathToLocales: string = path.join(__dirname, '../src/i18n');
+
+const start = async () => {
+ try {
+ await fetchTranslations(sheetId, languages, pathToLocales);
+ console.log('Done'); // eslint-disable-line
+ } catch (err) {
+ console.error(err.message); // eslint-disable-line
+ process.exit(1);
+ }
+};
+
+start();
diff --git a/src/App.tsx b/src/App.tsx
index a3ca57661..54f8db3ab 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -3,6 +3,11 @@ import { Switch, Route } from 'react-router';
import { ApolloProvider } from '@apollo/react-hooks';
import { Provider as ReduxProvider } from 'react-redux';
import { OidcProvider, loadUser } from 'redux-oidc';
+import { MatomoProvider, createInstance } from '@datapunt/matomo-tracker-react';
+import countries from 'i18n-iso-countries';
+import fi from 'i18n-iso-countries/langs/fi.json';
+import en from 'i18n-iso-countries/langs/en.json';
+import sv from 'i18n-iso-countries/langs/sv.json';
import graphqlClient from './graphql/client';
import store from './redux/store';
@@ -12,8 +17,14 @@ import Login from './auth/components/login/Login';
import OidcCallback from './auth/components/oidcCallback/OidcCallback';
import Profile from './profile/components/profile/Profile';
import { fetchApiTokenThunk } from './auth/redux';
-import TermsOfService from './tos/components/termsOfService/TermsOfService';
import ProfileDeleted from './profile/components/profileDeleted/ProfileDeleted';
+import { MAIN_CONTENT_ID } from './common/constants';
+import AccessibilityShortcuts from './common/accessibilityShortcuts/AccessibilityShortcuts';
+import AppMeta from './AppMeta';
+
+countries.registerLocale(fi);
+countries.registerLocale(en);
+countries.registerLocale(sv);
if (process.env.NODE_ENV !== 'production') {
enableOidcLogging();
@@ -25,6 +36,18 @@ loadUser(store, userManager).then(async user => {
}
});
+const instance = createInstance({
+ urlBase: 'https://analytics.hel.ninja/',
+ siteId: 60,
+});
+
+// Prevent non-production data from being submitted to Matomo
+// by pretending to require consent to process analytics data and never ask for it.
+// https://developer.matomo.org/guides/tracking-javascript-guide#step-1-require-consent
+if (process.env.REACT_APP_ENVIRONMENT !== 'production') {
+ window._paq.push(['requireConsent']);
+}
+
type Props = {};
function App(props: Props) {
@@ -32,31 +55,36 @@ function App(props: Props) {
-
- {
- userManager.signinSilentCallback();
- return null;
- }}
- />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 404 - not found
-
+
+
+ {/* This should be the first focusable element */}
+
+
+ {
+ userManager.signinSilentCallback();
+ return null;
+ }}
+ />
+
+
+
+
+
+
+
+
+
+
+
+
+ 404 - not found
+
+
diff --git a/src/AppMeta.tsx b/src/AppMeta.tsx
new file mode 100644
index 000000000..ad4d3d7c5
--- /dev/null
+++ b/src/AppMeta.tsx
@@ -0,0 +1,15 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import { useTranslation } from 'react-i18next';
+
+function AppMeta() {
+ const { i18n } = useTranslation();
+
+ return (
+
+
+
+ );
+}
+
+export default AppMeta;
diff --git a/src/auth/authenticate.ts b/src/auth/authenticate.ts
index 1218d92c7..73383aef3 100644
--- a/src/auth/authenticate.ts
+++ b/src/auth/authenticate.ts
@@ -1,9 +1,14 @@
+import * as Sentry from '@sentry/browser';
+
import userManager from './userManager';
import store from '../redux/store';
import { apiError } from './redux';
export default function(): void {
userManager.signinRedirect().catch(error => {
+ if (error.message !== 'Network Error') {
+ Sentry.captureException(error);
+ }
store.dispatch(apiError(error.toString()));
});
}
diff --git a/src/auth/components/login/Login.module.css b/src/auth/components/login/Login.module.css
index 58cfd9b72..22daea664 100644
--- a/src/auth/components/login/Login.module.css
+++ b/src/auth/components/login/Login.module.css
@@ -1,5 +1,5 @@
.wrapper {
- background-color: var(--hds-brand-color-bus);
+ background-color: var(--color-bus);
display: flex;
justify-content: center;
align-items: center;
@@ -11,7 +11,7 @@
margin: 20px 10px;
width: 95%;
text-align: center;
- color: var(--hds-ui-color-white);
+ color: var(--color-white);
}
.logo {
@@ -20,13 +20,17 @@
}
.logo g {
- fill: var(--hds-ui-color-white);
+ fill: var(--color-white);
}
.button {
margin-top: 50px;
}
+.content h2 {
+ font-size: var(--fontsize-h-5);
+}
+
.content button {
min-width: auto;
}
diff --git a/src/auth/components/login/Login.tsx b/src/auth/components/login/Login.tsx
index 97b282484..74e67e157 100644
--- a/src/auth/components/login/Login.tsx
+++ b/src/auth/components/login/Login.tsx
@@ -1,6 +1,7 @@
import React from 'react';
import { useTranslation } from 'react-i18next';
import { connect } from 'react-redux';
+import { useMatomo } from '@datapunt/matomo-tracker-react';
import { RootState } from '../../../redux/rootReducer';
import { AuthState, resetApiError } from '../../redux';
@@ -18,18 +19,22 @@ type Props = {
function Home(props: Props) {
const { t } = useTranslation();
+ const { trackEvent } = useMatomo();
return (
-
+
}
);
}
diff --git a/src/common/explanation/Explanation.module.css b/src/common/explanation/Explanation.module.css
index b80f2a0f8..18df4e87a 100644
--- a/src/common/explanation/Explanation.module.css
+++ b/src/common/explanation/Explanation.module.css
@@ -1,7 +1,19 @@
+.container.margin {
+ margin: 0 15px;
+}
+
.main {
- font-size: 24px;
+ font-size: 36px;
+ margin-bottom: 30px;
}
.small {
- color: var(--hds-ui-color-black-70);
+ margin-top: 0;
+ color: var(--color-black-70);
font-size: 20px;
}
+
+@media (min-width: 1200px) {
+ .container.margin {
+ margin: 0;
+ }
+}
diff --git a/src/common/explanation/Explanation.tsx b/src/common/explanation/Explanation.tsx
index 4c3b48723..f17b78f76 100644
--- a/src/common/explanation/Explanation.tsx
+++ b/src/common/explanation/Explanation.tsx
@@ -1,18 +1,37 @@
import React from 'react';
+import classNames from 'classnames';
import styles from './Explanation.module.css';
type Props = {
main: string;
- small: string;
+ small?: string;
className?: string;
+ // The explanation content can be with or without a wrapping element.
+ // When it is not wrapped, it needs to have its own margin on small
+ // screens. When it is wrapped, the containing element usually has a
+ // padding that takes care of the whitespace.
+ //
+ // In this context margin means that the explanation has horizontal
+ // margin. Flush means that it does not--that it's flush with the
+ // other content on that level of the hierarchy.
+ variant?: 'margin' | 'flush';
};
-function Explanation(props: Props) {
+function Explanation({ className, main, small, variant = 'margin' }: Props) {
return (
-
-
-
+ {/* The language switcher is a navigation element. Because */}
+ {/* there's a possibility that we have multiple navs on */}
+ {/* the same page, we need to give the element a label to */}
+ {/* distinct it from the other navs. */}
+
+
+ );
+}
+
+export default ToggleSwitch;
diff --git a/src/graphql/generatedTypes.ts b/src/graphql/generatedTypes.ts
index 4c3188747..0ef236391 100644
--- a/src/graphql/generatedTypes.ts
+++ b/src/graphql/generatedTypes.ts
@@ -20,6 +20,23 @@ export interface CreateMyProfile_createMyProfile {
}
export interface CreateMyProfile {
+ /**
+ * Creates a new profile based on the given data. The new profile is linked to the currently authenticated user.
+ *
+ * One or several of the following is possible to add:
+ *
+ * * Email
+ * * Address
+ * * Phone
+ *
+ * If youth data is given, a youth profile will also be created and linked to the profile.
+ *
+ * Requires authentication.
+ *
+ * Possible error codes:
+ *
+ * * `TODO`
+ */
readonly createMyProfile: CreateMyProfile_createMyProfile | null;
}
@@ -41,6 +58,19 @@ export interface DeleteMyProfile_deleteMyProfile {
}
export interface DeleteMyProfile {
+ /**
+ * Deletes the data of the profile which is linked to the currently authenticated user.
+ *
+ * Requires authentication.
+ *
+ * Possible error codes:
+ *
+ * * `CANNOT_DELETE_PROFILE_WHILE_SERVICE_CONNECTED_ERROR`: Returned if the profile is connected to Berth service.
+ *
+ * * `PROFILE_DOES_NOT_EXIST_ERROR`: Returned if there is no profile linked to the currently authenticated user.
+ *
+ * * `TODO`
+ */
readonly deleteMyProfile: DeleteMyProfile_deleteMyProfile | null;
}
@@ -57,6 +87,15 @@ export interface DeleteMyProfileVariables {
// ====================================================
export interface DownloadMyProfile {
+ /**
+ * Get the user information stored in the profile as machine readable JSON.
+ *
+ * Requires authentication.
+ *
+ * Possible error codes:
+ *
+ * * `TODO`
+ */
readonly downloadMyProfile: any | null;
}
@@ -77,6 +116,7 @@ export interface MyProfileQuery_myProfile_primaryAddress {
readonly address: string;
readonly postalCode: string;
readonly city: string;
+ readonly countryCode: string;
}
export interface MyProfileQuery_myProfile_primaryEmail {
@@ -106,12 +146,31 @@ export interface MyProfileQuery_myProfile {
readonly firstName: string;
readonly lastName: string;
readonly nickname: string;
+ readonly language: Language | null;
+ /**
+ * Convenience field for the address which is marked as primary.
+ */
readonly primaryAddress: MyProfileQuery_myProfile_primaryAddress | null;
+ /**
+ * Convenience field for the email which is marked as primary.
+ */
readonly primaryEmail: MyProfileQuery_myProfile_primaryEmail | null;
+ /**
+ * Convenience field for the phone which is marked as primary.
+ */
readonly primaryPhone: MyProfileQuery_myProfile_primaryPhone | null;
}
export interface MyProfileQuery {
+ /**
+ * Get the profile belonging to the currently authenticated user.
+ *
+ * Requires authentication.
+ *
+ * Possible error codes:
+ *
+ * * `TODO`
+ */
readonly myProfile: MyProfileQuery_myProfile | null;
}
@@ -131,6 +190,15 @@ export interface NameQuery_myProfile {
}
export interface NameQuery {
+ /**
+ * Get the profile belonging to the currently authenticated user.
+ *
+ * Requires authentication.
+ *
+ * Possible error codes:
+ *
+ * * `TODO`
+ */
readonly myProfile: NameQuery_myProfile | null;
}
@@ -151,6 +219,15 @@ export interface ProfileExistsQuery_myProfile {
}
export interface ProfileExistsQuery {
+ /**
+ * Get the profile belonging to the currently authenticated user.
+ *
+ * Requires authentication.
+ *
+ * Possible error codes:
+ *
+ * * `TODO`
+ */
readonly myProfile: ProfileExistsQuery_myProfile | null;
}
@@ -220,10 +297,22 @@ export interface ServiceConnectionsQuery_myProfile {
* The ID of the object.
*/
readonly id: string;
+ /**
+ * List of the profile's connected services.
+ */
readonly serviceConnections: ServiceConnectionsQuery_myProfile_serviceConnections | null;
}
export interface ServiceConnectionsQuery {
+ /**
+ * Get the profile belonging to the currently authenticated user.
+ *
+ * Requires authentication.
+ *
+ * Possible error codes:
+ *
+ * * `TODO`
+ */
readonly myProfile: ServiceConnectionsQuery_myProfile | null;
}
@@ -272,8 +361,17 @@ export interface UpdateMyProfile_updateMyProfile_profile {
readonly id: string;
readonly firstName: string;
readonly lastName: string;
+ /**
+ * Convenience field for the address which is marked as primary.
+ */
readonly primaryAddress: UpdateMyProfile_updateMyProfile_profile_primaryAddress | null;
+ /**
+ * Convenience field for the email which is marked as primary.
+ */
readonly primaryEmail: UpdateMyProfile_updateMyProfile_profile_primaryEmail | null;
+ /**
+ * Convenience field for the phone which is marked as primary.
+ */
readonly primaryPhone: UpdateMyProfile_updateMyProfile_profile_primaryPhone | null;
}
@@ -283,6 +381,25 @@ export interface UpdateMyProfile_updateMyProfile {
}
export interface UpdateMyProfile {
+ /**
+ * Updates the profile which is linked to the currently authenticated user based on the given data.
+ *
+ * One or several of the following is possible to add, modify or remove:
+ *
+ * * Email
+ * * Address
+ * * Phone
+ *
+ * If youth data is given, a youth profile will also be created and linked to the
+ * profile **or** the existing youth profile will be updated if the profile is
+ * already linked to a youth profile.
+ *
+ * Requires authentication.
+ *
+ * Possible error codes:
+ *
+ * * `TODO`
+ */
readonly updateMyProfile: UpdateMyProfile_updateMyProfile | null;
}
@@ -294,6 +411,132 @@ export interface UpdateMyProfileVariables {
/* eslint-disable */
// This file was automatically generated and should not be edited.
+// ====================================================
+// GraphQL query operation: QueryMySubscriptions
+// ====================================================
+
+export interface QueryMySubscriptions_myProfile_subscriptions_edges_node_subscriptionType {
+ readonly __typename: "SubscriptionTypeNode";
+ readonly code: string;
+}
+
+export interface QueryMySubscriptions_myProfile_subscriptions_edges_node {
+ readonly __typename: "SubscriptionNode";
+ /**
+ * The ID of the object.
+ */
+ readonly id: string;
+ readonly enabled: boolean;
+ readonly subscriptionType: QueryMySubscriptions_myProfile_subscriptions_edges_node_subscriptionType;
+}
+
+export interface QueryMySubscriptions_myProfile_subscriptions_edges {
+ readonly __typename: "SubscriptionNodeEdge";
+ /**
+ * The item at the end of the edge
+ */
+ readonly node: QueryMySubscriptions_myProfile_subscriptions_edges_node | null;
+}
+
+export interface QueryMySubscriptions_myProfile_subscriptions {
+ readonly __typename: "SubscriptionNodeConnection";
+ /**
+ * Contains the nodes in this connection.
+ */
+ readonly edges: ReadonlyArray<(QueryMySubscriptions_myProfile_subscriptions_edges | null)>;
+}
+
+export interface QueryMySubscriptions_myProfile {
+ readonly __typename: "ProfileNode";
+ /**
+ * The ID of the object.
+ */
+ readonly id: string;
+ readonly subscriptions: QueryMySubscriptions_myProfile_subscriptions | null;
+}
+
+export interface QueryMySubscriptions {
+ /**
+ * Get the profile belonging to the currently authenticated user.
+ *
+ * Requires authentication.
+ *
+ * Possible error codes:
+ *
+ * * `TODO`
+ */
+ readonly myProfile: QueryMySubscriptions_myProfile | null;
+}
+
+/* tslint:disable */
+/* eslint-disable */
+// This file was automatically generated and should not be edited.
+
+// ====================================================
+// GraphQL query operation: QuerySubscriptions
+// ====================================================
+
+export interface QuerySubscriptions_subscriptionTypeCategories_edges_node_subscriptionTypes_edges_node {
+ readonly __typename: "SubscriptionTypeNode";
+ readonly label: string | null;
+ /**
+ * The ID of the object.
+ */
+ readonly id: string;
+ readonly code: string;
+}
+
+export interface QuerySubscriptions_subscriptionTypeCategories_edges_node_subscriptionTypes_edges {
+ readonly __typename: "SubscriptionTypeNodeEdge";
+ /**
+ * The item at the end of the edge
+ */
+ readonly node: QuerySubscriptions_subscriptionTypeCategories_edges_node_subscriptionTypes_edges_node | null;
+}
+
+export interface QuerySubscriptions_subscriptionTypeCategories_edges_node_subscriptionTypes {
+ readonly __typename: "SubscriptionTypeNodeConnection";
+ /**
+ * Contains the nodes in this connection.
+ */
+ readonly edges: ReadonlyArray<(QuerySubscriptions_subscriptionTypeCategories_edges_node_subscriptionTypes_edges | null)>;
+}
+
+export interface QuerySubscriptions_subscriptionTypeCategories_edges_node {
+ readonly __typename: "SubscriptionTypeCategoryNode";
+ /**
+ * The ID of the object.
+ */
+ readonly id: string;
+ readonly code: string;
+ readonly label: string | null;
+ readonly subscriptionTypes: QuerySubscriptions_subscriptionTypeCategories_edges_node_subscriptionTypes;
+}
+
+export interface QuerySubscriptions_subscriptionTypeCategories_edges {
+ readonly __typename: "SubscriptionTypeCategoryNodeEdge";
+ /**
+ * The item at the end of the edge
+ */
+ readonly node: QuerySubscriptions_subscriptionTypeCategories_edges_node | null;
+}
+
+export interface QuerySubscriptions_subscriptionTypeCategories {
+ readonly __typename: "SubscriptionTypeCategoryNodeConnection";
+ /**
+ * Contains the nodes in this connection.
+ */
+ readonly edges: ReadonlyArray<(QuerySubscriptions_subscriptionTypeCategories_edges | null)>;
+}
+
+export interface QuerySubscriptions {
+ readonly subscriptionTypeCategories: QuerySubscriptions_subscriptionTypeCategories | null;
+}
+
+/* tslint:disable */
+/* eslint-disable */
+// This file was automatically generated and should not be edited.
+
//==============================================================
// START Enums and Input Objects
//==============================================================
@@ -354,14 +597,19 @@ export enum YouthLanguage {
SWEDISH = "SWEDISH",
}
-export interface AddressInput {
- readonly id?: string | null;
+export interface CreateAddressInput {
+ readonly countryCode?: string | null;
+ readonly primary?: boolean | null;
readonly address: string;
readonly postalCode: string;
readonly city: string;
- readonly countryCode?: string | null;
readonly addressType: AddressType;
+}
+
+export interface CreateEmailInput {
readonly primary?: boolean | null;
+ readonly email: string;
+ readonly emailType: EmailType;
}
export interface CreateMyProfileMutationInput {
@@ -369,22 +617,14 @@ export interface CreateMyProfileMutationInput {
readonly clientMutationId?: string | null;
}
-export interface DeleteMyProfileMutationInput {
- readonly clientMutationId?: string | null;
-}
-
-export interface EmailInput {
- readonly id?: string | null;
- readonly email?: string | null;
- readonly emailType: EmailType;
+export interface CreatePhoneInput {
readonly primary?: boolean | null;
-}
-
-export interface PhoneInput {
- readonly id?: string | null;
readonly phone: string;
readonly phoneType: PhoneType;
- readonly primary?: boolean | null;
+}
+
+export interface DeleteMyProfileMutationInput {
+ readonly clientMutationId?: string | null;
}
export interface ProfileInput {
@@ -394,16 +634,44 @@ export interface ProfileInput {
readonly image?: string | null;
readonly language?: Language | null;
readonly contactMethod?: ContactMethod | null;
- readonly addEmails?: ReadonlyArray<(EmailInput | null)> | null;
- readonly updateEmails?: ReadonlyArray<(EmailInput | null)> | null;
+ readonly addEmails?: ReadonlyArray<(CreateEmailInput | null)> | null;
+ readonly updateEmails?: ReadonlyArray<(UpdateEmailInput | null)> | null;
readonly removeEmails?: ReadonlyArray<(string | null)> | null;
- readonly addPhones?: ReadonlyArray<(PhoneInput | null)> | null;
- readonly updatePhones?: ReadonlyArray<(PhoneInput | null)> | null;
+ readonly addPhones?: ReadonlyArray<(CreatePhoneInput | null)> | null;
+ readonly updatePhones?: ReadonlyArray<(UpdatePhoneInput | null)> | null;
readonly removePhones?: ReadonlyArray<(string | null)> | null;
- readonly addAddresses?: ReadonlyArray<(AddressInput | null)> | null;
- readonly updateAddresses?: ReadonlyArray<(AddressInput | null)> | null;
+ readonly addAddresses?: ReadonlyArray<(CreateAddressInput | null)> | null;
+ readonly updateAddresses?: ReadonlyArray<(UpdateAddressInput | null)> | null;
readonly removeAddresses?: ReadonlyArray<(string | null)> | null;
+ readonly subscriptions?: ReadonlyArray<(SubscriptionInputType | null)> | null;
readonly youthProfile?: YouthProfileFields | null;
+ readonly sensitivedata?: SensitiveDataFields | null;
+}
+
+export interface SensitiveDataFields {
+ readonly ssn?: string | null;
+}
+
+export interface SubscriptionInputType {
+ readonly subscriptionTypeId: string;
+ readonly enabled: boolean;
+}
+
+export interface UpdateAddressInput {
+ readonly countryCode?: string | null;
+ readonly primary?: boolean | null;
+ readonly id: string;
+ readonly address?: string | null;
+ readonly postalCode?: string | null;
+ readonly city?: string | null;
+ readonly addressType?: AddressType | null;
+}
+
+export interface UpdateEmailInput {
+ readonly primary?: boolean | null;
+ readonly id: string;
+ readonly email?: string | null;
+ readonly emailType?: EmailType | null;
}
export interface UpdateMyProfileMutationInput {
@@ -411,6 +679,13 @@ export interface UpdateMyProfileMutationInput {
readonly clientMutationId?: string | null;
}
+export interface UpdatePhoneInput {
+ readonly primary?: boolean | null;
+ readonly id: string;
+ readonly phone?: string | null;
+ readonly phoneType?: PhoneType | null;
+}
+
export interface YouthProfileFields {
readonly schoolName?: string | null;
readonly schoolClass?: string | null;
@@ -420,6 +695,7 @@ export interface YouthProfileFields {
readonly approverPhone?: string | null;
readonly approverEmail?: string | null;
readonly birthDate?: any | null;
+ readonly photoUsageApproved?: boolean | null;
}
//==============================================================
diff --git a/src/i18n/en.json b/src/i18n/en.json
index 1deee1200..4ac1b8739 100644
--- a/src/i18n/en.json
+++ b/src/i18n/en.json
@@ -1,133 +1,140 @@
{
"appName": "Profile",
- "loading": "Loading...",
- "oidc": {
- "authenticating": "Authenticating..."
- },
- "login": {
- "title": "Many opportunities with one account",
- "description": "Registering gives you access to new services with one easy login. A single account makes the everyday life of a citizen easier.",
- "login": "Log in"
- },
- "profile": {
- "loading": "Loading profile..."
- },
- "serviceConnections": {
- "title": "Connected services",
- "explanation": "You may use several services in the City of Helsinki as well as certain third-party services for the same profile.",
- "empty": "You currently don't have any active services connected to your profile.",
- "servicePersonalData": "Data which the service will know about you:",
- "created": "Created",
- "clock": "at"
- },
- "nav": {
- "information": "Information",
- "services": "Connected services",
- "signin": "Log in",
- "signout": "Sign out",
- "menuButtonLabel": "Profile menu"
+ "berthErrors": {
+ "close": "Close",
+ "explanation": "To delete your profile, you must first terminate your berth billing agreement",
+ "title": "You cannot delete your Helsinki-profile because Berth needs your information for billing"
},
- "profileInformation": {
- "title": "My information",
- "personalData": "Personal data",
- "visibility": "The following information about you is stored in the service",
- "deleteProfile": "Delete your profile",
- "downloadData": "Download your data",
- "name": "Name",
- "address": "Address",
- "email": "Email",
- "phone": "Phone"
+ "confirmationModal": {
+ "cancel": "Cancel",
+ "save": "Save",
+ "saveMessage": "Saved data will transfer to following services",
+ "saveTitle": "Do you want to save your changes"
},
"createProfile": {
- "pageTitle": "Create profile",
"heading": "Fill in your details to create a profile",
- "helpText": "This information is only visible to you"
- },
- "profileForm": {
- "firstName": "First name",
- "lastName": "Last name",
- "email": "Email",
- "phone": "Phone",
- "address": "Home address",
- "city": "City",
- "postalCode": "Postal code",
- "terms": "I agree to the <0>Terms of Service0>, and that I may be contacted at the address I provide",
- "submit": "Save",
- "edit": "Edit"
- },
- "validation": {
- "required": "This field is required",
- "email": "The value must be an email-address",
- "phoneMin": "The number must be at least {{min}} characters long",
- "maxLength": "This field can be max {{max}} characters"
+ "helpText": "This information is only visible to you",
+ "pageTitle": "Create profile"
},
"deleteProfile": {
- "title": "Do you want to delete you Oma.helsinki account?",
- "explanation": "If desired you can delete all your information, but also means deleting your account. Read more from the guide. By deleting your Helsinki profile you also loose all information saved to connected services and can no longer log in",
"accept": "I have read <0>guide0> and understand what deleting my data means.",
- "delete": "Delete Helsinki profile"
+ "delete": "Delete Helsinki profile",
+ "explanation": "If desired you can delete all your information, but also means deleting your account. Read more from the guide. By deleting your Helsinki profile you also loose all information saved to connected services and can no longer log in",
+ "title": "Do you want to delete you account?"
},
"deleteProfileModal": {
- "title": "Are you sure you want to delete your Helsinki profile",
+ "delete": "Delete Helsinki profile",
"explanation": "By deleting your profile you also loose all the data saved to following services",
"noServiceExplanation": "By removing your profile you will loose all of your stored data.",
- "close": "Cancel deletion",
- "delete": "Delete Helsinki profile"
- },
- "profileDeleted": {
- "title": "Your profile has been successfully removed!",
- "message": "You can recreate it later if you want. You will be logged out after {{time}} seconds."
- },
- "berthErrors": {
- "title": "You cannot delete your Helsinki profile because Berth needs your information for billing",
- "explanation": "To delete your profile, you must first terminate your berth billing agreement",
- "close": "Close"
+ "title": "Are you sure you want to delete your Helsinki profile"
},
"downloadData": {
- "panelTitle": "Do you want to download your data?",
+ "button": "Download my data",
"panelText": "Download your data to see all the information we have stored about you.",
- "button": "Download my data"
+ "panelTitle": "Do you want to download your data?"
},
"expandingPanel": {
- "showInformation": "SHOW INFORMATION",
- "hideInformation": "HIDE INFORMATION"
+ "hideInformation": "HIDE INFORMATION",
+ "showInformation": "SHOW INFORMATION"
},
"footer": {
+ "accessibility": "Accessibility document",
"copyright": "Copyright {{year}}",
- "reserveRights": "All rights reserved",
+ "feedback": "GIVE FEEDBACK",
+ "feedbackLink": "https://www.hel.fi/helsinki/en/administration/participate/feedback",
"privacy": "Privacy policy",
- "accessibility": "Accessibility document",
- "terms": "Terms of Service",
- "feedback": "GIVE FEEDBACK"
+ "reserveRights": "All rights reserved",
+ "terms": "Terms of Service"
+ },
+ "landmarks": {
+ "navigation": {
+ "language": "Language",
+ "main": "Main",
+ "user": "User"
+ }
+ },
+ "LANGUAGE_OPTIONS": {
+ "ENGLISH": "English",
+ "FINNISH": "Finnish",
+ "SWEDISH": "Swedish"
+ },
+ "loading": "Loading...",
+ "login": {
+ "description": "Registering gives you access to new services with one easy login. A single account makes the everyday life of a citizen easier.",
+ "login": "Log in",
+ "title": "Many opportunities with one account"
+ },
+ "nav": {
+ "information": "Information",
+ "menuButtonLabel": "Profile menu",
+ "services": "Connected services",
+ "signin": "Log in",
+ "signout": "Sign out",
+ "subscriptions": "Subscriptions"
},
"notification": {
- "defaultErrorTitle": "Error",
+ "closeButtonText": "Close",
"defaultErrorText": "Something went wrong. Try again after a while.",
- "closeButtonText": "Close"
-
- },
- "tos": {
- "mainTitle": "Helsinkiprofiilin käyttöä koskevat käyttöehdot",
- "updated": "Olemme päivittäneet käyttöehdot 14.1.2020",
- "termsTitle": "Helsinki profiili - avain kaikkiin kaupungin palveluihin",
- "termsText": "Luomalla Helsinkiprofiilin voit kirjautua kaikkiin Helsingin kaupungin digitaalisiin palveluihin. Tarjoamme sinulle parempaa henkilökohtaista palvelua, kun käytät kaikkiin palveluihin samaa kirjautumistapaa. Keräämme käytöstäsi tietoja tarjotaksemme sinulle sinua kiinnostavia palveluita ja tuotteita, ymmärtääksemme paremmin kaupunkilaistemme kiinnostuksen kohteita ja tarpeita sekä kehittääksemme palveluistamme jatkuvasti parempia.
Helsinkiprofiili on turvallinen. Pidämme kaiken keräämästämme tiedon itsellämme: emme luovuta tietoja ulkopuolisille tahoille. Emme käytä tietojasi muuhun kuin tässä kuvaaviimme tarkoituksiin. Voit ladata itsellesi kaikki sinusta keräämämme tiedot sekä halutessasi poistaa Helsinkiprofiilisi kokonaan.
Lähetämme sinulle ainoastaan olennaista palvelukohtaista tietoa. Voit itse hallita asiakasviestintää joko omassa profiilissasi tai käyttämiesi palveluiden kirjautuneen käyttäjän näkymässä.",
- "terms1Title": "1. Soveltamisala",
- "terms1Text": "Helsinkiprofiili on Helsingin kaupungin tarjoama kirjautumistapa sen ja mahdollisten muiden palveluntarjoajien palveluihin (jäljempänä \"Palvelut\").
Nämä Helsingin palveluiden käyttöehdot yhdessä Helsingin kaupungin tietosuojalausekkeen kanssa (yhdessä “Ehdot”) sääntelevät Helsinkiprofiilin käyttöä eri Palvelujen yhteydessä. Helsinkiprofiililla tarkoitetaan näissä ehdoissa käyttäjätunnuksen ja salasanan yhdistelmää tai muuta kirjautumisessa käytettyä tunnistautumistapaa ja niiden mahdollistamaa kirjautumispalvelua. Ehdot määrittelevät oikeutesi ja velvollisuutesi Helsinkiprofiiliin liittyen. Käyttö edellyttää, että noudatat näitä ehtoja.
Huomioithan, että Helsingin kaupungin eri palveluiden käyttöön tai niiden osiin voi soveltua lisäehtoja. Nämä ehdot kommunikoidaan käyttäjälle aina kirjautumisen yhteydessä. Luomalla Helsinkiprofiilin tiedostat ja hyväksyt myös, että Helsingin kaupunki kerää ja käyttää palveluiden kautta kerättyjä henkilötietoja Helsingin kaupungin tietosuojalausekkeessa ja evästekäytännöissä kuvatuilla tavoilla. Tietosuojalausekkeen löydät <0>TÄÄLTÄ0>.",
- "terms2Title": "2. Tunnuksen luominen ja poistaminen käytöstä",
- "terms2Text": "Luodaksesi Helsinkiprofiilin sinun on oltava vähintään 13-vuotias. Profiilin luodaksesi sinun tulee antaa vaaditut rekisteröintitiedot, joiden avulla sinut voidaan tunnistaa.
Rekisteröidessäsi Helsinkiprofiilin luot käyttäjätunnuksen ja salasanan tai tunnistaudut jollain kirjautumispalvelun tarjoamalla kirjautumispalveluntarjoajalla. Olet henkilökohtaisesti vastuussa kaikesta käyttäjätunnuksellasi ja salasanallasi tapahtuvasta Palvelujen käytöstä. Sinun tulee säilyttää käyttäjätunnusta ja salasanaa huolellisesti ja ilmoittaa kaikista tietoosi tulleista väärinkäytöksistä. Voit poistaa profiilisi, mikäli et halua enää käyttää Helsinkiprofiilia palveluihin kirjautumisessa. Helsinkiprofiilin poistamisen jälkeen sinulla ei ole enää ole pääsyä palveluihin tai niiden ominaisuuksiin, jotka vaativat kirjautumista. Voit luoda Helsinkiprofiilin uudelleen, mutta tällöin aiemmin käytöstäsi kertyneet tiedot on poistettu eikä niitä voi enää palauttaa.",
- "terms3Title": "3. Helsinki profiilin käyttäminen",
- "terms3Text": "Saat käyttää Helsinkiprofiilia näiden ehtojen mukaisesti. Helsinkiprofiili on henkilökohtainen, etkä saa luovuttaa sitä kenellekään muulle. Sinun pitää ilmoittaa viipymättä Helsingin kaupungille, mikäli huomaat väärinkäytöksiä. Helsinki Profiilin käyttö on omalla vastuullasi. Helsingin kaupunki vastaa tarjoamistaan palveluista ja niiden sisällöistä niihin kohdistuvien ehtojen mukaisesti. ",
- "terms4Title": "4. Palvelun saatavuus",
- "terms4Text": "Helsinkiprofiili on käytettävissä ympäri vuorokauden. Helsingin kaupunki varaa oikeuden harkintansa mukaan kehittää, muuttaa ja korjata Helsinkiprofiilia, sen ominaisuuksia, käyttökohteita tai taustajärjestelmiä. Helsinkiprofiili saattaa myös olla poissa käytöstä huoltotaukojen aikana ja muinakin ajankohtina esimerkiksi liiallisen kuormituksen vuoksi.",
- "terms5Title": "5. Henkilötiedot",
- "terms5Text": "Helsinkiprofiiliin liittyvät henkilötietojen suojaperiaatteet on määritelty tietosuojalausekekkeessa. Tietosuojalausekkeen löydät <0>TÄÄLTÄ0>. Helsingin kaupunki käsittelee henkilötietojasi voimassa olevan lainsäädännön ja tietosuojalausekkeen mukaisesti. Palveluissa saatetaan käyttää evästeitä tai vastaavia tunnisteita evästekäytännöissä kuvatulla tavalla. Evästekäytännöt löydät <1>TÄÄLTÄ1>.",
- "terms6Title": "6. Oikeudet",
- "terms6Text": "Helsinkiprofiiliin ja siihen liittyvät taustajärjestelmät ja ohjelmistot ovat tekijänoikeuslakien suojaamia ja tekijänoikeus niihin kuuluu Helsingin kaupungille. Kaikki oikeudet Helsinkiprofiiliin ja kaikkiin sen kautta tarjottaviin tai käytettävissä oleviin palveluihin kuuluvat Helsingin kaupungille.",
- "terms7Title": "7. Vastuunrajoitus",
- "terms7Text": "Helsingin kaupunki tarjoaa Helsinkiprofiilin käytettäväksi “sellaisena kuin se on”. Helsingin kaupunki ei takaa, että palvelu on käytettävissä keskeytyksettä tai että se toimii virheettömästi. Helsingin kaupunki ei anna mitään Helsinkiprofiilin saatavuuteen, täydellisyyteen, luotettavuuteen, tietoihin tai sisältöön liittyvää nimenomaista tai välillistä takuuta.
Lukuun ottamatta törkeästä huolimattomuudesta tai tahallisuudesta aiheutuvaa vastuuta, Helsingin kaupunki ei ole vastuussa mistään suorasta, epäsuorasta, välillisestä tai yllättävästä vahingosta, joka on seurausta Helsinkiprofiilin käytöstä tai kykenemättömyydestä käyttää Helsinkiprofiilia.",
- "terms8Title": "8. Muut ehdot",
- "terms8Text": "Helsinkiprofiiliin ja Ehtoihin sovelletaan Suomessa voimassa olevaa lainsäädäntöä pois lukien lainvalintaan liittyvät säädökset. Helsingin kaupunki pidättää oikeuden muuttaa Ehtoja milloin tahansa ilman ennakkoilmoitusta. Jos Ehtoja muutetaan merkittävästi, Helsingin kaupunki ilmoittaa tällaisesta muutoksesta erikseen etukäteen. Muutokset tulevat voimaan viikon kuluttua ilmoituksesta. Ehtojen muutoksista kerrotaan Helsinkiprofiilissa sekä eri palveluiden verkkosivuilla. (Voiko tähän laittaa “ja/tai sähköpostitse”)
Mikäli Ehtojen muutos johtuu lainsäädännön muutoksesta, viranomaismääräyksestä tai muusta ennalta arvaamattomasta syystä, Ehtojen muutos tulee voimaan välittömästi.",
- "terms9Title": "9. Yhteystiedot",
- "terms9Text": "Helsinki profiilin palveluntarjoajana toimii Helsingin kaupungin kanslia, osoitteessa YHTEYSTIEDOT TÄHÄN."
+ "defaultErrorTitle": "Error"
+ },
+ "oidc": {
+ "authenticating": "Authenticating..."
+ },
+ "profile": {
+ "loading": "Loading profile..."
+ },
+ "profileDeleted": {
+ "message": "You can recreate it later if you want. You will be logged out after {{time}} seconds.",
+ "title": "Your profile has been successfully removed!"
+ },
+ "profileForm": {
+ "address": "Home address",
+ "cancel": "Cancel",
+ "city": "City",
+ "country": "Country",
+ "edit": "Edit",
+ "email": "Email",
+ "firstName": "First name",
+ "language": "Profile language",
+ "lastName": "Last name",
+ "phone": "Phone",
+ "postalCode": "Postal code",
+ "submit": "Save",
+ "terms": "I have read <0>file description0> and city's <1>data protection principles1>"
+ },
+ "profileInformation": {
+ "address": "Address",
+ "deleteProfile": "Delete your profile",
+ "downloadData": "Download your data",
+ "email": "Email",
+ "name": "Name",
+ "personalData": "Personal data",
+ "phone": "Phone",
+ "title": "My information",
+ "visibility": "The following information about you is stored in the service"
+ },
+ "sanityCheck": "open-city-profile.en",
+ "serviceConnections": {
+ "clock": "at",
+ "created": "Created",
+ "empty": "You currently don't have any active services connected to your profile.",
+ "explanation": "You may use several services in the City of Helsinki as well as certain third-party services for the same profile.",
+ "servicePersonalData": "Data which the service will know about you:",
+ "title": "Connected services"
+ },
+ "skipToContent": "Skip to content",
+ "subscriptions": {
+ "empty": "No subscriptions / newsletters",
+ "explanation": "Subscribe to announcements and newsletters",
+ "saveSuccess": "Saved!",
+ "saveSuccessMessage": "Subscriptions saved succesfully",
+ "subscribed": "Subscribed!",
+ "title": "Subscriptions and newsletters"
+ },
+ "validation": {
+ "email": "The value must be an email-address",
+ "maxLength": "This field can be max {{max}} characters",
+ "phoneMin": "The number must be at least {{min}} characters long",
+ "required": "This field is required"
}
-}
+}
\ No newline at end of file
diff --git a/src/i18n/fi.json b/src/i18n/fi.json
index b249b3157..18584a379 100644
--- a/src/i18n/fi.json
+++ b/src/i18n/fi.json
@@ -1,132 +1,140 @@
{
"appName": "Profiili",
- "loading": "Ladataan...",
- "oidc": {
- "authenticating": "Tunnistaudutaan..."
- },
- "login": {
- "title": "Yhdellä tunnuksella monta mahdollisuutta",
- "description": "Rekisteröitymällä pääset käyttämään uusia palveluita yhdellä helpolla kirjautimisella. Yksi yhtenäinen tunnus tekee kaupunkilaisen arjesta helpompaa.",
- "login": "Kirjaudu sisään"
- },
- "profile": {
- "loading": "Ladataan profiilia..."
- },
- "serviceConnections": {
- "title": "Yhdistetyt palvelut",
- "explanation": "Voit käyttää samalla profiilillasi useita helsingin kaupungin palveluita sekä tiettyjä kolmansien osapuolten palveluita.",
- "empty": "Sinulla ei tällä hetkellä ole palveluita liitettynä profiiliisi.",
- "servicePersonalData": "Palvelu saa tietää sinusta:",
- "created": "Luotu",
- "clock": "klo"
+ "berthErrors": {
+ "close": "Sulje",
+ "explanation": "Jotta voit poistaa profiilisi, sinun on ensin irtisanottava venepaikkasopimuksesi",
+ "title": "Et voi poistaa Helsinki-profiiliasi, koska venepaikka tarvitsee tietojasi laskutukseen"
},
- "nav": {
- "information": "Omat tiedot",
- "services": "Yhdistetyt palvelut",
- "signin": "Kirjaudu sisään",
- "signout": "Kirjaudu ulos",
- "menuButtonLabel": "Profiili valikko"
- },
- "profileInformation": {
- "title": "Omat tiedot",
- "personalData": "Henkilötiedot",
- "visibility": "Palveluun on tallennettu sinusta seuraavat tiedot",
- "deleteProfile": "Poista omat tietosi",
- "downloadData": "Lataa omat tietosi",
- "name": "Nimi",
- "address": "Osoite",
- "email": "Sähköpostiosoite",
- "phone": "Puhelinnumero"
+ "confirmationModal": {
+ "cancel": "Peruuta",
+ "save": "Tallenna",
+ "saveMessage": "Muutokset välittyvät seuraaviin palveluihin",
+ "saveTitle": "Haluatko tallentaa tekemäsi muutokset"
},
"createProfile": {
- "pageTitle": "Uusi profiili",
"heading": "Täydennä tietosi luodaksesi profiili",
- "helpText": "Nämä tiedot näkyvät vain sinulle"
- },
- "profileForm": {
- "firstName": "Etunimi",
- "lastName": "Sukunimi",
- "email": "Sähköpostiosoite",
- "phone": "Puhelinnumero",
- "address": "Kotiosoite",
- "city": "Kaupunki",
- "postalCode": "Postinumero",
- "terms": "Hyväksyn <0>palvelun ehdot0>, ja että minuun voi olla yhteydessä antamaani osoitteeseen",
- "submit": "Tallenna",
- "edit": "Muokkaa"
- },
- "validation": {
- "required": "Tämä kenttä on pakollinen",
- "email": "Ei kelvollinen sähköpostiosoite",
- "phoneMin": "Puhelinnumeron pitää olla vähintään {{min}} merkkiä pitkä",
- "maxLength": "Kentän maksimipituus on {{max}} merkkiä"
+ "helpText": "Nämä tiedot näkyvät vain sinulle",
+ "pageTitle": "Uusi profiili"
},
"deleteProfile": {
- "title": "Haluatko poistaa Oma.helsinki tunnuksesi?",
- "explanation": "Voit halutessasi poistaa kaikki tietosi, mutta se tarkoittaa myös käyttäjätilisi poistamista Lue lisää ohjeesta. Poistamalla Helsinki profiilisi menetätä myös kaikki yhdistettyihin palveluihin tallennetut tietosi, etkä voi enää kirjautua niihin.",
"accept": "Olen lukenut <0>ohjeet0> ja ymmärrän mitä tietojeni poistaminen tarkoittaa",
- "delete": "Poista Helsinki profiili"
+ "delete": "Poista Helsinki-profiili",
+ "explanation": "Voit halutessasi poistaa kaikki tietosi, mutta se tarkoittaa myös käyttäjätilisi poistamista. Lue lisää ohjeesta. Poistamalla Helsinki profiilisi menetätä myös kaikki yhdistettyihin palveluihin tallennetut tietosi, etkä voi enää kirjautua niihin.",
+ "title": "Haluatko poistaa profiilisi?"
},
"deleteProfileModal": {
- "title": "Haluatko varmasti poistaa Helsinki profiilisi",
+ "delete": "Poista Helsinki-profiili",
"explanation": "Poistamalla profiilisi menetät myös kaikki seuraaviin palveluihin tallennetut tiedot",
"noServiceExplanation": "Poistamalla profiilisi menetät kaikki tallennetut tiedot.",
- "close": "Peru poistaminen",
- "delete": "Poista Helsinki profiili"
- },
- "profileDeleted": {
- "title": "Profiilisi on poistettu onnistuneesti!",
- "message": "Jos haluat, voit luoda profiilis uudestaan myöhemmin. Sinut kirjataan ulos {{time}} sekunnin kuluttua."
- },
- "berthErrors": {
- "title": "Et voi poistaa Helsinki profiiliasi, koska venepaikka tarvitsee tietojasi laskutukseen",
- "explanation": "Jotta voit poistaa profiilisi, sinun on ensin irtisanottava venepaikkasopimuksesi",
- "close": "Sulje"
+ "title": "Haluatko varmasti poistaa Helsinki-profiilisi"
},
"downloadData": {
- "panelTitle": "Haluatko ladata omat tietosi?",
+ "button": "Lataa kaikki palvelun tiedot",
"panelText": "Jos haluat nähdä kaikki sinusta tallentamamme tiedot, voit ladata ne seuraavasta napista.",
- "button": "Lataa kaikki palvelun tiedot"
+ "panelTitle": "Haluatko ladata omat tietosi?"
},
"expandingPanel": {
- "showInformation": "NÄYTÄ TIEDOT",
- "hideInformation": "PIILOTA TIEDOT"
+ "hideInformation": "PIILOTA TIEDOT",
+ "showInformation": "NÄYTÄ TIEDOT"
},
"footer": {
+ "accessibility": "Saavutettavuusseloste",
"copyright": "Tekijänoikeus {{year}}",
- "reserveRights": "Kaikki oikeudet pidätetään",
+ "feedback": "ANNA PALAUTETTA",
+ "feedbackLink": "https://www.hel.fi/helsinki/fi/kaupunki-ja-hallinto/osallistu-ja-vaikuta/palaute/anna-palautetta",
"privacy": "Rekisteriseloste",
- "accessibility": "Saavutettavuusseloste",
- "terms": "Palvelun käyttöehdot",
- "feedback": "ANNA PALAUTETTA"
+ "reserveRights": "Kaikki oikeudet pidätetään",
+ "terms": "Palvelun käyttöehdot"
+ },
+ "landmarks": {
+ "navigation": {
+ "language": "Kieli",
+ "main": "Pää",
+ "user": "Käyttäjä"
+ }
+ },
+ "LANGUAGE_OPTIONS": {
+ "ENGLISH": "Englanti",
+ "FINNISH": "Suomi",
+ "SWEDISH": "Ruotsi"
+ },
+ "loading": "Ladataan...",
+ "login": {
+ "description": "Rekisteröitymällä pääset käyttämään uusia palveluita yhdellä helpolla kirjautimisella. Yksi yhtenäinen tunnus tekee kaupunkilaisen arjesta helpompaa.",
+ "login": "Kirjaudu sisään",
+ "title": "Yhdellä tunnuksella monta mahdollisuutta"
+ },
+ "nav": {
+ "information": "Omat tiedot",
+ "menuButtonLabel": "Profiili valikko",
+ "services": "Yhdistetyt palvelut",
+ "signin": "Kirjaudu sisään",
+ "signout": "Kirjaudu ulos",
+ "subscriptions": "Tilaukset"
},
"notification": {
- "defaultErrorTitle": "Virhe",
+ "closeButtonText": "Sulje",
"defaultErrorText": "Jokin meni pieleen. Yritä hetken kuluttua uudelleen.",
- "closeButtonText": "Sulje"
- },
- "tos": {
- "mainTitle": "Helsinkiprofiilin käyttöä koskevat käyttöehdot",
- "updated": "Olemme päivittäneet käyttöehdot 14.1.2020",
- "termsTitle": "Helsinki profiili - avain kaikkiin kaupungin palveluihin",
- "termsText": "Luomalla Helsinkiprofiilin voit kirjautua kaikkiin Helsingin kaupungin digitaalisiin palveluihin. Tarjoamme sinulle parempaa henkilökohtaista palvelua, kun käytät kaikkiin palveluihin samaa kirjautumistapaa. Keräämme käytöstäsi tietoja tarjotaksemme sinulle sinua kiinnostavia palveluita ja tuotteita, ymmärtääksemme paremmin kaupunkilaistemme kiinnostuksen kohteita ja tarpeita sekä kehittääksemme palveluistamme jatkuvasti parempia.
Helsinkiprofiili on turvallinen. Pidämme kaiken keräämästämme tiedon itsellämme: emme luovuta tietoja ulkopuolisille tahoille. Emme käytä tietojasi muuhun kuin tässä kuvaaviimme tarkoituksiin. Voit ladata itsellesi kaikki sinusta keräämämme tiedot sekä halutessasi poistaa Helsinkiprofiilisi kokonaan.
Lähetämme sinulle ainoastaan olennaista palvelukohtaista tietoa. Voit itse hallita asiakasviestintää joko omassa profiilissasi tai käyttämiesi palveluiden kirjautuneen käyttäjän näkymässä.",
- "terms1Title": "1. Soveltamisala",
- "terms1Text": "Helsinkiprofiili on Helsingin kaupungin tarjoama kirjautumistapa sen ja mahdollisten muiden palveluntarjoajien palveluihin (jäljempänä \"Palvelut\").
Nämä Helsingin palveluiden käyttöehdot yhdessä Helsingin kaupungin tietosuojalausekkeen kanssa (yhdessä “Ehdot”) sääntelevät Helsinkiprofiilin käyttöä eri Palvelujen yhteydessä. Helsinkiprofiililla tarkoitetaan näissä ehdoissa käyttäjätunnuksen ja salasanan yhdistelmää tai muuta kirjautumisessa käytettyä tunnistautumistapaa ja niiden mahdollistamaa kirjautumispalvelua. Ehdot määrittelevät oikeutesi ja velvollisuutesi Helsinkiprofiiliin liittyen. Käyttö edellyttää, että noudatat näitä ehtoja.
Huomioithan, että Helsingin kaupungin eri palveluiden käyttöön tai niiden osiin voi soveltua lisäehtoja. Nämä ehdot kommunikoidaan käyttäjälle aina kirjautumisen yhteydessä. Luomalla Helsinkiprofiilin tiedostat ja hyväksyt myös, että Helsingin kaupunki kerää ja käyttää palveluiden kautta kerättyjä henkilötietoja Helsingin kaupungin tietosuojalausekkeessa ja evästekäytännöissä kuvatuilla tavoilla. Tietosuojalausekkeen löydät <0>TÄÄLTÄ0>.",
- "terms2Title": "2. Tunnuksen luominen ja poistaminen käytöstä",
- "terms2Text": "Luodaksesi Helsinkiprofiilin sinun on oltava vähintään 13-vuotias. Profiilin luodaksesi sinun tulee antaa vaaditut rekisteröintitiedot, joiden avulla sinut voidaan tunnistaa.
Rekisteröidessäsi Helsinkiprofiilin luot käyttäjätunnuksen ja salasanan tai tunnistaudut jollain kirjautumispalvelun tarjoamalla kirjautumispalveluntarjoajalla. Olet henkilökohtaisesti vastuussa kaikesta käyttäjätunnuksellasi ja salasanallasi tapahtuvasta Palvelujen käytöstä. Sinun tulee säilyttää käyttäjätunnusta ja salasanaa huolellisesti ja ilmoittaa kaikista tietoosi tulleista väärinkäytöksistä. Voit poistaa profiilisi, mikäli et halua enää käyttää Helsinkiprofiilia palveluihin kirjautumisessa. Helsinkiprofiilin poistamisen jälkeen sinulla ei ole enää ole pääsyä palveluihin tai niiden ominaisuuksiin, jotka vaativat kirjautumista. Voit luoda Helsinkiprofiilin uudelleen, mutta tällöin aiemmin käytöstäsi kertyneet tiedot on poistettu eikä niitä voi enää palauttaa.",
- "terms3Title": "3. Helsinki profiilin käyttäminen",
- "terms3Text": "Saat käyttää Helsinkiprofiilia näiden ehtojen mukaisesti. Helsinkiprofiili on henkilökohtainen, etkä saa luovuttaa sitä kenellekään muulle. Sinun pitää ilmoittaa viipymättä Helsingin kaupungille, mikäli huomaat väärinkäytöksiä. Helsinki Profiilin käyttö on omalla vastuullasi. Helsingin kaupunki vastaa tarjoamistaan palveluista ja niiden sisällöistä niihin kohdistuvien ehtojen mukaisesti. ",
- "terms4Title": "4. Palvelun saatavuus",
- "terms4Text": "Helsinkiprofiili on käytettävissä ympäri vuorokauden. Helsingin kaupunki varaa oikeuden harkintansa mukaan kehittää, muuttaa ja korjata Helsinkiprofiilia, sen ominaisuuksia, käyttökohteita tai taustajärjestelmiä. Helsinkiprofiili saattaa myös olla poissa käytöstä huoltotaukojen aikana ja muinakin ajankohtina esimerkiksi liiallisen kuormituksen vuoksi.",
- "terms5Title": "5. Henkilötiedot",
- "terms5Text": "Helsinkiprofiiliin liittyvät henkilötietojen suojaperiaatteet on määritelty tietosuojalausekekkeessa. Tietosuojalausekkeen löydät <0>TÄÄLTÄ0>. Helsingin kaupunki käsittelee henkilötietojasi voimassa olevan lainsäädännön ja tietosuojalausekkeen mukaisesti. Palveluissa saatetaan käyttää evästeitä tai vastaavia tunnisteita evästekäytännöissä kuvatulla tavalla. Evästekäytännöt löydät <1>TÄÄLTÄ1>.",
- "terms6Title": "6. Oikeudet",
- "terms6Text": "Helsinkiprofiiliin ja siihen liittyvät taustajärjestelmät ja ohjelmistot ovat tekijänoikeuslakien suojaamia ja tekijänoikeus niihin kuuluu Helsingin kaupungille. Kaikki oikeudet Helsinkiprofiiliin ja kaikkiin sen kautta tarjottaviin tai käytettävissä oleviin palveluihin kuuluvat Helsingin kaupungille.",
- "terms7Title": "7. Vastuunrajoitus",
- "terms7Text": "Helsingin kaupunki tarjoaa Helsinkiprofiilin käytettäväksi “sellaisena kuin se on”. Helsingin kaupunki ei takaa, että palvelu on käytettävissä keskeytyksettä tai että se toimii virheettömästi. Helsingin kaupunki ei anna mitään Helsinkiprofiilin saatavuuteen, täydellisyyteen, luotettavuuteen, tietoihin tai sisältöön liittyvää nimenomaista tai välillistä takuuta.
Lukuun ottamatta törkeästä huolimattomuudesta tai tahallisuudesta aiheutuvaa vastuuta, Helsingin kaupunki ei ole vastuussa mistään suorasta, epäsuorasta, välillisestä tai yllättävästä vahingosta, joka on seurausta Helsinkiprofiilin käytöstä tai kykenemättömyydestä käyttää Helsinkiprofiilia.",
- "terms8Title": "8. Muut ehdot",
- "terms8Text": "Helsinkiprofiiliin ja Ehtoihin sovelletaan Suomessa voimassa olevaa lainsäädäntöä pois lukien lainvalintaan liittyvät säädökset. Helsingin kaupunki pidättää oikeuden muuttaa Ehtoja milloin tahansa ilman ennakkoilmoitusta. Jos Ehtoja muutetaan merkittävästi, Helsingin kaupunki ilmoittaa tällaisesta muutoksesta erikseen etukäteen. Muutokset tulevat voimaan viikon kuluttua ilmoituksesta. Ehtojen muutoksista kerrotaan Helsinkiprofiilissa sekä eri palveluiden verkkosivuilla. (Voiko tähän laittaa “ja/tai sähköpostitse”)
Mikäli Ehtojen muutos johtuu lainsäädännön muutoksesta, viranomaismääräyksestä tai muusta ennalta arvaamattomasta syystä, Ehtojen muutos tulee voimaan välittömästi.",
- "terms9Title": "9. Yhteystiedot",
- "terms9Text": "Helsinki profiilin palveluntarjoajana toimii Helsingin kaupungin kanslia, osoitteessa YHTEYSTIEDOT TÄHÄN."
+ "defaultErrorTitle": "Virhe"
+ },
+ "oidc": {
+ "authenticating": "Tunnistaudutaan..."
+ },
+ "profile": {
+ "loading": "Ladataan profiilia..."
+ },
+ "profileDeleted": {
+ "message": "Jos haluat, voit luoda profiilis uudestaan myöhemmin. Sinut kirjataan ulos {{time}} sekunnin kuluttua.",
+ "title": "Profiilisi on poistettu onnistuneesti!"
+ },
+ "profileForm": {
+ "address": "Kotiosoite",
+ "cancel": "Peruuta",
+ "city": "Kaupunki",
+ "country": "Maa",
+ "edit": "Muokkaa",
+ "email": "Sähköpostiosoite",
+ "firstName": "Etunimi",
+ "language": "Profiilin kieli",
+ "lastName": "Sukunimi",
+ "phone": "Puhelinnumero",
+ "postalCode": "Postinumero",
+ "submit": "Tallenna",
+ "terms": "Olen tutustunut palvelun <0>rekisteriselosteeseen0> ja kaupungin <1>tietosuojakäytäntöön1> "
+ },
+ "profileInformation": {
+ "address": "Osoite",
+ "deleteProfile": "Poista omat tietosi",
+ "downloadData": "Lataa omat tietosi",
+ "email": "Sähköpostiosoite",
+ "name": "Nimi",
+ "personalData": "Henkilötiedot",
+ "phone": "Puhelinnumero",
+ "title": "Omat tiedot",
+ "visibility": "Palveluun on tallennettu sinusta seuraavat tiedot"
+ },
+ "sanityCheck": "open-city-profile.fi",
+ "serviceConnections": {
+ "clock": "klo",
+ "created": "Luotu",
+ "empty": "Sinulla ei tällä hetkellä ole palveluita liitettynä profiiliisi.",
+ "explanation": "Voit käyttää samalla profiililla useita Helsingin kaupungin palveluita sekä tiettyjä kolmansien osapuolten palveluita.",
+ "servicePersonalData": "Palvelu saa tietää sinusta:",
+ "title": "Yhdistetyt palvelut"
+ },
+ "skipToContent": "Siirry suoraan sisältöön",
+ "subscriptions": {
+ "empty": "Ei tilattavia palveluita / ilmoituksia",
+ "explanation": "Tilaa ilmoituksia ja uutiskirjeitä",
+ "saveSuccess": "Tallennettu!",
+ "saveSuccessMessage": "Tilaukset tallennettu onnistuneesti",
+ "subscribed": "Tilattu!",
+ "title": "Tilaukset ja uutiskirjeet"
+ },
+ "validation": {
+ "email": "Epäkelpo sähköpostiosoite",
+ "maxLength": "Kentän maksimipituus on {{max}} merkkiä",
+ "phoneMin": "Puhelinnumeron pitää olla vähintään {{min}} merkkiä pitkä",
+ "required": "Tämä kenttä on pakollinen"
}
-}
+}
\ No newline at end of file
diff --git a/src/i18n/sv.json b/src/i18n/sv.json
index 9d009d480..535067ac7 100644
--- a/src/i18n/sv.json
+++ b/src/i18n/sv.json
@@ -1,132 +1,140 @@
{
"appName": "Profil",
- "loading": "Laddar...",
- "oidc": {
- "authenticating": "Autentiserar..."
- },
- "login": {
- "title": "Många möjligheter med ett konto",
- "description": "Registrering ger dig tillgång till nya tjänster med en enkel inloggning. Ett enda konto gör en medborgares vardagsliv enklare.",
- "login": "Logga in"
- },
- "profile": {
- "loading": "Laddar profil..."
- },
- "serviceConnections": {
- "title": "Anslutna servicer",
- "explanation": "Du kan använda många av Helsingfors stads tjänster samt vissa tjänster från tredje parter med samma profil.",
- "empty": "Du har för närvarande inga tjänster anslutna till din profil.",
- "servicePersonalData": "Data som tjänsten vet om dig:",
- "created": "Skapad",
- "clock": "kl."
- },
- "nav": {
- "information": "Mina uppgifter",
- "services": "Anslutna servicer",
- "signin": "Logga in",
- "signout": "Logga ut",
- "menuButtonLabel": "Profilmeny"
+ "berthErrors": {
+ "close": "Stänga",
+ "explanation": "För att radera din profil måste du först säga upp betalningsavtal för kaj",
+ "title": "Du kan inte ta bort din Helsingfors-profil eftersom Berth behöver din information för fakturering"
},
- "profileInformation": {
- "title": "Mina uppgifter",
- "personalData": "Personuppgifter",
- "visibility": "Följande information om dig lagras i tjänsten",
- "deleteProfile": "Radera profil",
- "downloadData": "Ladda ner min data",
- "name": "Namn",
- "address": "Adress",
- "email": "Epost",
- "phone": "Telefonnummer"
+ "confirmationModal": {
+ "cancel": "Annullera",
+ "save": "Spara",
+ "saveMessage": "Sparade data överförs till följande tjänster",
+ "saveTitle": "Vill du spara dina ändringar"
},
"createProfile": {
- "pageTitle": "Skapa profil",
"heading": "Fyll i detaljerna för att skapa en profil",
- "helpText": "Denna information syns endast åt dig"
- },
- "profileForm": {
- "firstName": "Förnamn",
- "lastName": "Efternamn",
- "email": "Epost-adress",
- "phone": "Telefonnummer",
- "address": "Hemadress",
- "city": "Stad",
- "postalCode": "Postnummer",
- "terms": "Jag godkänner <0>användarvillkorna0>, och att man får kontakta mig i adressen jag givit",
- "submit": "Spara",
- "edit": "Redigera"
- },
- "validation": {
- "required": "Detta fält krävs",
- "email": "Inte ett giltigt epost-adress",
- "phoneMin": "Telefonnumret måste vara mint {{min}} tecken långt",
- "maxLength": "Fältet får vara högst {{max}} tecken långt"
+ "helpText": "Denna information syns endast åt dig",
+ "pageTitle": "Skapa profil"
},
"deleteProfile": {
- "title": "Vill du ta bort ditt Oma.helsinki-konto?",
- "explanation": "Om så önskas kan du ta bort all information, men betyder också att du tar bort ditt konto. Läs mer från guiden. Genom att ta bort din Helsingfors-profil tappar du också all information som sparats i anslutna tjänster och kan inte längre logga in.",
"accept": "Jag har läst <0>guide0> och förstå vad att ta bort mina data betyder.",
- "delete": "Radera Helsinki profilen"
+ "delete": "Radera Helsingfors-profilen",
+ "explanation": "Om så önskas kan du ta bort all information, men betyder också att du tar bort ditt konto. Läs mer från guiden. Genom att ta bort din Helsingfors-profil tappar du också all information som sparats i anslutna tjänster och kan inte längre logga in.",
+ "title": "Vill du ta bort ditt profil?"
},
"deleteProfileModal": {
- "title": "Är du säker på att du vill ta bort din Helsingfors-profil",
+ "delete": "Radera Helsingfors-profilen",
"explanation": "Genom att ta bort din profil tappar du också all data som sparats till följande tjänster",
"noServiceExplanation": "Genom, att ta bort din profil kommer du att förlora alla dina lagrade data.",
- "close": "Avbryt borttagning",
- "delete": "Radera Helsingfors-profilen"
- },
- "profileDeleted": {
- "title": "Din profil har tagits bort!",
- "message": "Du kan återskapa det senare om du vill. Du kommer att loggas ut efter {{time}} sekunder."
- },
- "berthErrors": {
- "title": "Du kan inte ta bort din Helsingfors-profil eftersom Berth behöver din information för fakturering",
- "explanation": "För att radera din profil måste du först säga upp betalningsavtal för kaj",
- "close": "Stänga"
+ "title": "Är du säker på att du vill ta bort din Helsingfors-profil"
},
"downloadData": {
- "panelTitle": "Vill du ladda ner dina uppgifter?",
+ "button": "Ladda ner informationen om mig",
"panelText": "Du kan ladda ner all information vi har om dig från följande knapp.",
- "button": "Ladda ner informationen om mig"
+ "panelTitle": "Vill du ladda ner dina uppgifter?"
},
"expandingPanel": {
- "showInformation": "VISA INFORMATION",
- "hideInformation": "GÖM INFORMATION"
+ "hideInformation": "GÖM INFORMATION",
+ "showInformation": "VISA INFORMATION"
},
"footer": {
+ "accessibility": "Tillgänglighetsdokument",
"copyright": "Upphovsrätt {{year}}",
- "reserveRights": "Alla rättigheter förbehållna",
+ "feedback": "GE FEEDBACK",
+ "feedbackLink": "https://www.hel.fi/helsinki/sv/stad-och-forvaltning/delta/feedback",
"privacy": "Integritetspolicy",
- "accessibility": "Tillgänglighetsdokument",
- "terms": "Användarvillkor",
- "feedback": "Ge feedback"
+ "reserveRights": "Alla rättigheter förbehållna",
+ "terms": "Användarvillkor"
+ },
+ "landmarks": {
+ "navigation": {
+ "language": "",
+ "main": "",
+ "user": ""
+ }
+ },
+ "LANGUAGE_OPTIONS": {
+ "ENGLISH": "Engelsk",
+ "FINNISH": "Finska",
+ "SWEDISH": "Svenska"
+ },
+ "loading": "Laddar...",
+ "login": {
+ "description": "Registrering ger dig tillgång till nya tjänster med en enkel inloggning. Ett enda konto gör en medborgares vardagsliv enklare.",
+ "login": "Logga in",
+ "title": "Många möjligheter med ett konto"
+ },
+ "nav": {
+ "information": "Mina uppgifter",
+ "menuButtonLabel": "Profilmeny",
+ "services": "Anslutna servicer",
+ "signin": "Logga in",
+ "signout": "Logga ut",
+ "subscriptions": "Prenumerationer"
},
"notification": {
- "defaultErrorTitle": "Fel",
+ "closeButtonText": "Stäng",
"defaultErrorText": "Något gick fel. Försök igen efter ett tag.",
- "closeButtonText": "Stäng"
- },
- "tos": {
- "mainTitle": "Helsinkiprofiilin käyttöä koskevat käyttöehdot",
- "updated": "Olemme päivittäneet käyttöehdot 14.1.2020",
- "termsTitle": "Helsinki profiili - avain kaikkiin kaupungin palveluihin",
- "termsText": "Luomalla Helsinkiprofiilin voit kirjautua kaikkiin Helsingin kaupungin digitaalisiin palveluihin. Tarjoamme sinulle parempaa henkilökohtaista palvelua, kun käytät kaikkiin palveluihin samaa kirjautumistapaa. Keräämme käytöstäsi tietoja tarjotaksemme sinulle sinua kiinnostavia palveluita ja tuotteita, ymmärtääksemme paremmin kaupunkilaistemme kiinnostuksen kohteita ja tarpeita sekä kehittääksemme palveluistamme jatkuvasti parempia.
Helsinkiprofiili on turvallinen. Pidämme kaiken keräämästämme tiedon itsellämme: emme luovuta tietoja ulkopuolisille tahoille. Emme käytä tietojasi muuhun kuin tässä kuvaaviimme tarkoituksiin. Voit ladata itsellesi kaikki sinusta keräämämme tiedot sekä halutessasi poistaa Helsinkiprofiilisi kokonaan.
Lähetämme sinulle ainoastaan olennaista palvelukohtaista tietoa. Voit itse hallita asiakasviestintää joko omassa profiilissasi tai käyttämiesi palveluiden kirjautuneen käyttäjän näkymässä.",
- "terms1Title": "1. Soveltamisala",
- "terms1Text": "Helsinkiprofiili on Helsingin kaupungin tarjoama kirjautumistapa sen ja mahdollisten muiden palveluntarjoajien palveluihin (jäljempänä \"Palvelut\").
Nämä Helsingin palveluiden käyttöehdot yhdessä Helsingin kaupungin tietosuojalausekkeen kanssa (yhdessä “Ehdot”) sääntelevät Helsinkiprofiilin käyttöä eri Palvelujen yhteydessä. Helsinkiprofiililla tarkoitetaan näissä ehdoissa käyttäjätunnuksen ja salasanan yhdistelmää tai muuta kirjautumisessa käytettyä tunnistautumistapaa ja niiden mahdollistamaa kirjautumispalvelua. Ehdot määrittelevät oikeutesi ja velvollisuutesi Helsinkiprofiiliin liittyen. Käyttö edellyttää, että noudatat näitä ehtoja.
Huomioithan, että Helsingin kaupungin eri palveluiden käyttöön tai niiden osiin voi soveltua lisäehtoja. Nämä ehdot kommunikoidaan käyttäjälle aina kirjautumisen yhteydessä. Luomalla Helsinkiprofiilin tiedostat ja hyväksyt myös, että Helsingin kaupunki kerää ja käyttää palveluiden kautta kerättyjä henkilötietoja Helsingin kaupungin tietosuojalausekkeessa ja evästekäytännöissä kuvatuilla tavoilla. Tietosuojalausekkeen löydät <0>TÄÄLTÄ0>.",
- "terms2Title": "2. Tunnuksen luominen ja poistaminen käytöstä",
- "terms2Text": "Luodaksesi Helsinkiprofiilin sinun on oltava vähintään 13-vuotias. Profiilin luodaksesi sinun tulee antaa vaaditut rekisteröintitiedot, joiden avulla sinut voidaan tunnistaa.
Rekisteröidessäsi Helsinkiprofiilin luot käyttäjätunnuksen ja salasanan tai tunnistaudut jollain kirjautumispalvelun tarjoamalla kirjautumispalveluntarjoajalla. Olet henkilökohtaisesti vastuussa kaikesta käyttäjätunnuksellasi ja salasanallasi tapahtuvasta Palvelujen käytöstä. Sinun tulee säilyttää käyttäjätunnusta ja salasanaa huolellisesti ja ilmoittaa kaikista tietoosi tulleista väärinkäytöksistä. Voit poistaa profiilisi, mikäli et halua enää käyttää Helsinkiprofiilia palveluihin kirjautumisessa. Helsinkiprofiilin poistamisen jälkeen sinulla ei ole enää ole pääsyä palveluihin tai niiden ominaisuuksiin, jotka vaativat kirjautumista. Voit luoda Helsinkiprofiilin uudelleen, mutta tällöin aiemmin käytöstäsi kertyneet tiedot on poistettu eikä niitä voi enää palauttaa.",
- "terms3Title": "3. Helsinki profiilin käyttäminen",
- "terms3Text": "Saat käyttää Helsinkiprofiilia näiden ehtojen mukaisesti. Helsinkiprofiili on henkilökohtainen, etkä saa luovuttaa sitä kenellekään muulle. Sinun pitää ilmoittaa viipymättä Helsingin kaupungille, mikäli huomaat väärinkäytöksiä. Helsinki Profiilin käyttö on omalla vastuullasi. Helsingin kaupunki vastaa tarjoamistaan palveluista ja niiden sisällöistä niihin kohdistuvien ehtojen mukaisesti. ",
- "terms4Title": "4. Palvelun saatavuus",
- "terms4Text": "Helsinkiprofiili on käytettävissä ympäri vuorokauden. Helsingin kaupunki varaa oikeuden harkintansa mukaan kehittää, muuttaa ja korjata Helsinkiprofiilia, sen ominaisuuksia, käyttökohteita tai taustajärjestelmiä. Helsinkiprofiili saattaa myös olla poissa käytöstä huoltotaukojen aikana ja muinakin ajankohtina esimerkiksi liiallisen kuormituksen vuoksi.",
- "terms5Title": "5. Henkilötiedot",
- "terms5Text": "Helsinkiprofiiliin liittyvät henkilötietojen suojaperiaatteet on määritelty tietosuojalausekekkeessa. Tietosuojalausekkeen löydät <0>TÄÄLTÄ0>. Helsingin kaupunki käsittelee henkilötietojasi voimassa olevan lainsäädännön ja tietosuojalausekkeen mukaisesti. Palveluissa saatetaan käyttää evästeitä tai vastaavia tunnisteita evästekäytännöissä kuvatulla tavalla. Evästekäytännöt löydät <1>TÄÄLTÄ1>.",
- "terms6Title": "6. Oikeudet",
- "terms6Text": "Helsinkiprofiiliin ja siihen liittyvät taustajärjestelmät ja ohjelmistot ovat tekijänoikeuslakien suojaamia ja tekijänoikeus niihin kuuluu Helsingin kaupungille. Kaikki oikeudet Helsinkiprofiiliin ja kaikkiin sen kautta tarjottaviin tai käytettävissä oleviin palveluihin kuuluvat Helsingin kaupungille.",
- "terms7Title": "7. Vastuunrajoitus",
- "terms7Text": "Helsingin kaupunki tarjoaa Helsinkiprofiilin käytettäväksi “sellaisena kuin se on”. Helsingin kaupunki ei takaa, että palvelu on käytettävissä keskeytyksettä tai että se toimii virheettömästi. Helsingin kaupunki ei anna mitään Helsinkiprofiilin saatavuuteen, täydellisyyteen, luotettavuuteen, tietoihin tai sisältöön liittyvää nimenomaista tai välillistä takuuta.
Lukuun ottamatta törkeästä huolimattomuudesta tai tahallisuudesta aiheutuvaa vastuuta, Helsingin kaupunki ei ole vastuussa mistään suorasta, epäsuorasta, välillisestä tai yllättävästä vahingosta, joka on seurausta Helsinkiprofiilin käytöstä tai kykenemättömyydestä käyttää Helsinkiprofiilia.",
- "terms8Title": "8. Muut ehdot",
- "terms8Text": "Helsinkiprofiiliin ja Ehtoihin sovelletaan Suomessa voimassa olevaa lainsäädäntöä pois lukien lainvalintaan liittyvät säädökset. Helsingin kaupunki pidättää oikeuden muuttaa Ehtoja milloin tahansa ilman ennakkoilmoitusta. Jos Ehtoja muutetaan merkittävästi, Helsingin kaupunki ilmoittaa tällaisesta muutoksesta erikseen etukäteen. Muutokset tulevat voimaan viikon kuluttua ilmoituksesta. Ehtojen muutoksista kerrotaan Helsinkiprofiilissa sekä eri palveluiden verkkosivuilla. (Voiko tähän laittaa “ja/tai sähköpostitse”)
Mikäli Ehtojen muutos johtuu lainsäädännön muutoksesta, viranomaismääräyksestä tai muusta ennalta arvaamattomasta syystä, Ehtojen muutos tulee voimaan välittömästi.",
- "terms9Title": "9. Yhteystiedot",
- "terms9Text": "Helsinki profiilin palveluntarjoajana toimii Helsingin kaupungin kanslia, osoitteessa YHTEYSTIEDOT TÄHÄN."
+ "defaultErrorTitle": "Fel"
+ },
+ "oidc": {
+ "authenticating": "Autentiserar..."
+ },
+ "profile": {
+ "loading": "Laddar profil..."
+ },
+ "profileDeleted": {
+ "message": "Du kan återskapa det senare om du vill. Du kommer att loggas ut efter {{time}} sekunder.",
+ "title": "Din profil har tagits bort!"
+ },
+ "profileForm": {
+ "address": "Hemadress",
+ "cancel": "Annullera",
+ "city": "Stad",
+ "country": "Land",
+ "edit": "Redigera",
+ "email": "Epost-adress",
+ "firstName": "Förnamn",
+ "language": "Profilspråk",
+ "lastName": "Efternamn",
+ "phone": "Telefonnummer",
+ "postalCode": "Postnummer",
+ "submit": "Spara",
+ "terms": "Jag har läst filen <0>beskrivningen0> och stads <1>sekretesspolicy1>"
+ },
+ "profileInformation": {
+ "address": "Adress",
+ "deleteProfile": "Radera profil",
+ "downloadData": "Ladda ner min data",
+ "email": "Epost",
+ "name": "Namn",
+ "personalData": "Personuppgifter",
+ "phone": "Telefonnummer",
+ "title": "Mina uppgifter",
+ "visibility": "Följande information om dig lagras i tjänsten"
+ },
+ "sanityCheck": "open-city-profile.sv",
+ "serviceConnections": {
+ "clock": "kl.",
+ "created": "Skapad",
+ "empty": "Du har för närvarande inga tjänster anslutna till din profil.",
+ "explanation": "Du kan använda många av Helsingfors stads tjänster samt vissa tjänster från tredje parter med samma profil.",
+ "servicePersonalData": "Data som tjänsten vet om dig:",
+ "title": "Anslutna servicer"
+ },
+ "skipToContent": "",
+ "subscriptions": {
+ "empty": "Inga prenumerationer / nyhetsbrev",
+ "explanation": "Prenumerera på meddelanden och nyhetsbrev",
+ "saveSuccess": "Sparade!",
+ "saveSuccessMessage": "Prenumerationer sparades framgångsrikt",
+ "subscribed": "Prenumererar!",
+ "title": "Prenumerationer och nyhetsbrev"
+ },
+ "validation": {
+ "email": "Inte ett giltigt epost-adress",
+ "maxLength": "Fältet får vara högst {{max}} tecken långt",
+ "phoneMin": "Telefonnumret måste vara mint {{min}} tecken långt",
+ "required": "Detta fält krävs"
}
-}
+}
\ No newline at end of file
diff --git a/src/index.css b/src/index.css
index ce40de101..b7f7a2fbc 100644
--- a/src/index.css
+++ b/src/index.css
@@ -1,4 +1,6 @@
-@import "~hds-core/lib/helsinki.css";
+@import "~hds-core/lib/base.css";
+/* Imports hds design tokens as CSS variables */
+@import "~hds-design-tokens/lib/all.min.css";
@font-face {
font-family: 'HelsinkiGrotesk';
diff --git a/src/index.tsx b/src/index.tsx
index 0b7507e03..a1b678f17 100644
--- a/src/index.tsx
+++ b/src/index.tsx
@@ -1,10 +1,23 @@
import React from 'react';
import ReactDOM from 'react-dom';
+import Modal from 'react-modal';
+import * as Sentry from '@sentry/browser';
import './index.css';
import BrowserApp from './BrowserApp';
import * as serviceWorker from './serviceWorker';
+Modal.setAppElement('#root');
+
+const ENVS_WITH_SENTRY = ['staging', 'production'];
+
+if (ENVS_WITH_SENTRY.includes(process.env.NODE_ENV)) {
+ Sentry.init({
+ dsn: process.env.REACT_APP_SENTRY_DSN,
+ environment: process.env.NODE_ENV,
+ });
+}
+
ReactDOM.render(, document.getElementById('root'));
// If you want your app to work offline and load faster, you can change
diff --git a/src/profile/components/createProfile/CreateProfile.module.css b/src/profile/components/createProfile/CreateProfile.module.css
index 3f062a68d..6730af451 100644
--- a/src/profile/components/createProfile/CreateProfile.module.css
+++ b/src/profile/components/createProfile/CreateProfile.module.css
@@ -1,5 +1,8 @@
.createProfile {
padding: 0 15px 50px;
+ display: flex;
+ flex-direction: column;
+ width: 100%;
}
.front {
diff --git a/src/profile/components/createProfile/CreateProfile.tsx b/src/profile/components/createProfile/CreateProfile.tsx
index c2cf86293..9b39f0ba5 100644
--- a/src/profile/components/createProfile/CreateProfile.tsx
+++ b/src/profile/components/createProfile/CreateProfile.tsx
@@ -4,6 +4,8 @@ import { useTranslation } from 'react-i18next';
import { useMutation } from '@apollo/react-hooks';
import { loader } from 'graphql.macro';
import classNames from 'classnames';
+import * as Sentry from '@sentry/browser';
+import { useMatomo } from '@datapunt/matomo-tracker-react';
import CreateProfileForm, {
FormValues,
@@ -16,6 +18,7 @@ import {
CreateMyProfile as CreateMyProfileData,
CreateMyProfileVariables,
EmailType,
+ Language,
PhoneType,
} from '../../../graphql/generatedTypes';
import NotificationComponent from '../../../common/notification/NotificationComponent';
@@ -29,17 +32,20 @@ type Props = {
function CreateProfile({ tunnistamoUser, onProfileCreated }: Props) {
const { t } = useTranslation();
+ const { trackEvent } = useMatomo();
const [showNotification, setShowNotification] = useState(false);
const [createProfile, { loading }] = useMutation<
CreateMyProfileData,
CreateMyProfileVariables
>(CREATE_PROFILE);
+
const handleOnValues = (formValues: FormValues) => {
const variables: CreateMyProfileVariables = {
input: {
profile: {
firstName: formValues.firstName,
lastName: formValues.lastName,
+ language: formValues.profileLanguage,
addEmails: [
{
email: formValues.email,
@@ -59,13 +65,18 @@ function CreateProfile({ tunnistamoUser, onProfileCreated }: Props) {
},
},
};
+
createProfile({ variables })
.then(result => {
if (result.data) {
+ trackEvent({ category: 'action', action: 'Register profile' });
onProfileCreated();
}
})
- .catch(() => setShowNotification(true));
+ .catch((error: Error) => {
+ Sentry.captureException(error);
+ setShowNotification(true);
+ });
};
return (