@lysaab/lysa-pep 1.0.0 → 1.0.2-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/.vscode/settings.json +4 -0
  2. package/lib/Exports.d.ts +7 -8
  3. package/lib/Exports.js +7 -8
  4. package/lib/components/CountrySelect.d.ts +15 -22
  5. package/lib/components/CountrySelect.js +30 -21
  6. package/lib/components/PepAnswers.d.ts +8 -8
  7. package/lib/components/PepAnswers.js +131 -39
  8. package/lib/components/PepAnswers.scss +7 -7
  9. package/lib/model/Countries.d.ts +4 -4
  10. package/lib/model/Countries.js +1002 -1002
  11. package/lib/model/PepModel.d.ts +7 -7
  12. package/lib/model/PepModel.js +40 -40
  13. package/lib/model/PepTexts.d.ts +322 -380
  14. package/lib/model/PepTexts.js +467 -552
  15. package/lib/pages/IsPep/IsPepMessages.d.ts +32 -0
  16. package/lib/pages/IsPep/IsPepMessages.js +66 -0
  17. package/lib/pages/IsPep/IsPepPage.d.ts +14 -0
  18. package/lib/pages/IsPep/IsPepPage.js +59 -0
  19. package/lib/pages/PepContext.d.ts +80 -80
  20. package/lib/pages/PepContext.js +88 -88
  21. package/lib/pages/PepIsPepPage.d.ts +6 -15
  22. package/lib/pages/PepIsPepPage.js +57 -59
  23. package/lib/pages/PepRelationPage.d.ts +6 -6
  24. package/lib/pages/PepRelationPage.js +83 -79
  25. package/lib/pages/PepRolePage.d.ts +9 -10
  26. package/lib/pages/PepRolePage.js +127 -127
  27. package/lib/pages/PepStatusPage.d.ts +6 -6
  28. package/lib/pages/PepStatusPage.js +57 -58
  29. package/lib/pages/RelationPage/RelationMessages.d.ts +105 -0
  30. package/lib/pages/RelationPage/RelationMessages.js +283 -0
  31. package/lib/pages/RelationPage/RelationPage.d.ts +6 -0
  32. package/lib/pages/RelationPage/RelationPage.js +153 -0
  33. package/lib/pages/RolePage/RoleMessages.d.ts +185 -0
  34. package/lib/pages/RolePage/RoleMessages.js +385 -0
  35. package/lib/pages/RolePage/RolePage.d.ts +11 -0
  36. package/lib/pages/RolePage/RolePage.js +220 -0
  37. package/lib/pages/StatusPage/StatusMessages.d.ts +72 -0
  38. package/lib/pages/StatusPage/StatusMessages.js +266 -0
  39. package/lib/pages/StatusPage/StatusPage.d.ts +6 -0
  40. package/lib/pages/StatusPage/StatusPage.js +95 -0
  41. package/lib/utils/Possession.d.ts +1 -0
  42. package/lib/utils/Possession.js +18 -0
  43. package/package.json +57 -53
  44. package/src/Exports.ts +12 -13
  45. package/src/components/CountrySelect.tsx +47 -43
  46. package/src/components/PepAnswers.scss +7 -7
  47. package/src/components/PepAnswers.tsx +252 -120
  48. package/src/demo/Done.tsx +16 -20
  49. package/src/demo/Pep.tsx +112 -106
  50. package/src/model/PepModel.ts +52 -52
  51. package/src/pages/IsPep/IsPepMessages.ts +67 -0
  52. package/src/pages/IsPep/IsPepPage.tsx +114 -0
  53. package/src/pages/PepContext.tsx +144 -144
  54. package/src/pages/RelationPage/RelationMessages.ts +288 -0
  55. package/src/pages/RelationPage/RelationPage.tsx +299 -0
  56. package/src/pages/RolePage/RoleMessages.ts +393 -0
  57. package/src/pages/RolePage/RolePage.tsx +356 -0
  58. package/src/pages/StatusPage/StatusMessages.ts +272 -0
  59. package/src/pages/StatusPage/StatusPage.tsx +207 -0
  60. package/src/utils/Possession.ts +21 -0
  61. package/src/model/PepTexts.ts +0 -607
  62. package/src/pages/PepIsPepPage.tsx +0 -107
  63. package/src/pages/PepRelationPage.tsx +0 -188
  64. package/src/pages/PepRolePage.tsx +0 -272
  65. package/src/pages/PepStatusPage.tsx +0 -157
package/src/demo/Pep.tsx CHANGED
@@ -1,106 +1,112 @@
1
- import React, { useState, useContext, useEffect, useRef } from "react";
2
- import { Story } from "@lysaab/ui-2";
3
- import { PepIsPepPage } from "../pages/PepIsPepPage";
4
- import { PepStatusPage } from "../pages/PepStatusPage";
5
- import { PepRolePage } from "../pages/PepRolePage";
6
- import { PepContext, PepType, EntityType } from "../pages/PepContext";
7
- import { Done } from "./Done";
8
- import { PepRelationPage } from "../pages/PepRelationPage";
9
-
10
- export function Pep() {
11
- const [page, setPage] = useState(0);
12
- const pepContext = useContext(PepContext);
13
- const type = pepContext.state.type;
14
- const loaded = useRef(false);
15
-
16
- useEffect(() => {
17
- if(!loaded.current) {
18
- pepContext.setState({ ownerName: "Sean Banan", tin: '191212121212', legalEntityType: EntityType.PERSON });
19
- loaded.current = true;
20
- }
21
- }, [loaded, pepContext]);
22
-
23
- return (
24
- <div style={{ maxWidth: "1000px", margin: "0 auto" }}>
25
- <Story
26
- header="PEP Lib"
27
- showBack={page > 0}
28
- showClose={false}
29
- onBack={() => {
30
- if (page === 4 && type === PepType.NOT_PEP) {
31
- setPage(0);
32
- } else if (page === 2 && type === PepType.ME) {
33
- setPage(0);
34
- } else {
35
- setPage(page - 1);
36
- }
37
- }}
38
- transitionKey={page.toString()}
39
- onExit={() => {}}
40
- >
41
- {page === 0 && (
42
- <PepIsPepPage
43
- next={() => {
44
- if (type === PepType.ME) {
45
- setPage(2);
46
- } else if (type === PepType.NOT_PEP) {
47
- setPage(4);
48
- } else {
49
- setPage(1);
50
- }
51
- }}
52
- />
53
- )}
54
- {page === 1 && <PepRelationPage next={() => setPage(2)} />}
55
- {page === 2 && <PepStatusPage next={() => setPage(3)} />}
56
- {page === 3 && <PepRolePage next={() => setPage(4)} />}
57
- {page === 4 && <Done />}
58
- </Story>
59
- <hr />
60
- <fieldset>
61
- <legend>Konfig</legend>
62
- <div>
63
- <label>
64
- Entitet
65
-
66
- <select
67
- value={pepContext.state.legalEntityType || EntityType.PERSON}
68
- onChange={event => {
69
- pepContext.setState({
70
- legalEntityType: event.currentTarget.value as EntityType,
71
- });
72
- }}
73
- >
74
- <option value={EntityType.PERSON}>Person</option>
75
- <option value={EntityType.CORPORATION}>Företag</option>
76
- </select>
77
- </label>
78
- </div>
79
- <div>
80
- <label>
81
- Namnet på den verkliga huvudmannen
82
- <input
83
- type="text"
84
- value={pepContext.state.ownerName || ''}
85
- onChange={event =>
86
- pepContext.setState({ ownerName: event.currentTarget.value })
87
- }
88
- />
89
- </label>
90
- </div>
91
- <div>
92
- <label>
93
- Personnummer på huvudmannen
94
- <input
95
- type="text"
96
- value={pepContext.state.tin || ''}
97
- onChange={event =>
98
- pepContext.setState({ tin: event.currentTarget.value })
99
- }
100
- />
101
- </label>
102
- </div>
103
- </fieldset>
104
- </div>
105
- );
106
- }
1
+ import React, { useState, useContext, useEffect, useRef } from "react";
2
+ import { Story } from "@lysaab/ui-2";
3
+ import { IntlProvider } from "react-intl";
4
+ import { IsPepPage } from "../pages/IsPep/IsPepPage";
5
+ import { StatusPage } from "../pages/StatusPage/StatusPage";
6
+ import { RolePage } from "../pages/RolePage/RolePage";
7
+ import { PepContext, PepType, EntityType } from "../pages/PepContext";
8
+ import { Done } from "./Done";
9
+ import { RelationPage } from "../pages/RelationPage/RelationPage";
10
+
11
+ export function Pep() {
12
+ const [page, setPage] = useState(0);
13
+ const pepContext = useContext(PepContext);
14
+ const type = pepContext.state.type;
15
+ const loaded = useRef(false);
16
+
17
+ useEffect(() => {
18
+ if (!loaded.current) {
19
+ pepContext.setState({
20
+ ownerName: "Sean Banan",
21
+ tin: "191212121212",
22
+ legalEntityType: EntityType.PERSON,
23
+ });
24
+ loaded.current = true;
25
+ }
26
+ }, [loaded, pepContext]);
27
+
28
+ return (
29
+ <div style={{ maxWidth: "1000px", margin: "0 auto" }}>
30
+ <IntlProvider locale="sv">
31
+ <Story
32
+ header="PEP Lib"
33
+ showBack={page > 0}
34
+ showClose={false}
35
+ onBack={() => {
36
+ if (page === 4 && type === PepType.NOT_PEP) {
37
+ setPage(0);
38
+ } else if (page === 2 && type === PepType.ME) {
39
+ setPage(0);
40
+ } else {
41
+ setPage(page - 1);
42
+ }
43
+ }}
44
+ transitionKey={page.toString()}
45
+ onExit={() => {}}
46
+ >
47
+ {page === 0 ? (
48
+ <IsPepPage
49
+ next={() => {
50
+ if (type === PepType.NOT_PEP) {
51
+ setPage(4);
52
+ } else if (type === PepType.ME) {
53
+ setPage(page + 2);
54
+ } else {
55
+ setPage(page + 1);
56
+ }
57
+ }}
58
+ />
59
+ ) : null}
60
+ {page === 1 ? <RelationPage next={() => setPage(page + 1)} /> : null}
61
+ {page === 2 ? <StatusPage next={() => setPage(page + 1)} /> : null}
62
+ {page === 3 ? <RolePage next={() => setPage(page + 1)} /> : null}
63
+ {page === 4 ? <Done /> : null}
64
+ </Story>
65
+ <hr />
66
+ <fieldset>
67
+ <legend>Konfig</legend>
68
+ <div>
69
+ <label>
70
+ Verkligen huvudman
71
+ <input
72
+ type="checkbox"
73
+ value={"true"}
74
+ onChange={(event) =>
75
+ pepContext.setState({
76
+ legalEntityType: event.currentTarget.checked
77
+ ? EntityType.CORPORATION
78
+ : EntityType.PERSON,
79
+ })
80
+ }
81
+ />
82
+ </label>
83
+ </div>
84
+ <div>
85
+ <label>
86
+ Namnet på den verkliga huvudmannen
87
+ <input
88
+ type="text"
89
+ value={pepContext.state.ownerName || ""}
90
+ onChange={(event) =>
91
+ pepContext.setState({ ownerName: event.currentTarget.value })
92
+ }
93
+ />
94
+ </label>
95
+ </div>
96
+ <div>
97
+ <label>
98
+ Personnummer på huvudmannen
99
+ <input
100
+ type="text"
101
+ value={pepContext.state.tin || ""}
102
+ onChange={(event) =>
103
+ pepContext.setState({ tin: event.currentTarget.value })
104
+ }
105
+ />
106
+ </label>
107
+ </div>
108
+ </fieldset>
109
+ </IntlProvider>
110
+ </div>
111
+ );
112
+ }
@@ -1,52 +1,52 @@
1
- import { PepState, PepType, EntityType, PepStatus } from "../pages/PepContext";
2
- import { DateTime } from "luxon";
3
-
4
- export interface PepRequest
5
- extends Omit<PepState, "isSweden" | "isOngoing" | "ended" | "birthdayOfPEP"> {
6
- ended?: string;
7
- birthdayOfPEP?: string;
8
- }
9
-
10
- /**
11
- * Do some minor preprocessing before we are ready to send everything to the
12
- * server
13
- */
14
- export function stateToRequest(pepData: PepState): PepRequest {
15
- const data = { ...pepData };
16
- delete data.isSweden;
17
- delete data.isOngoing;
18
- delete data.ownerName;
19
- if (data.legalEntityType === EntityType.PERSON) {
20
- delete data.tin;
21
- }
22
- return {
23
- ...data,
24
- country: data.type !== PepType.NOT_PEP ? data.country || "SE" : undefined,
25
- ended: data.ended
26
- ? DateTime.fromJSDate(data.ended).toFormat("yyyy-MM")
27
- : undefined,
28
- birthdayOfPEP: data.birthdayOfPEP
29
- ? DateTime.fromJSDate(data.birthdayOfPEP).toFormat("yyyy-MM-dd")
30
- : undefined
31
- };
32
- }
33
-
34
- export function requestToState({
35
- ended,
36
- birthdayOfPEP,
37
- ...serverData
38
- }: PepRequest): PepState {
39
- const state: PepState = { ...serverData };
40
- if (ended) {
41
- state.ended = DateTime.fromFormat(ended, "yyyy-MM").toJSDate();
42
- }
43
- if (birthdayOfPEP) {
44
- state.birthdayOfPEP = DateTime.fromFormat(
45
- birthdayOfPEP,
46
- "yyyy-MM-dd"
47
- ).toJSDate();
48
- }
49
- state.isSweden = state.country === "SE" ? "sweden" : "other";
50
- state.isOngoing = state.ended ? PepStatus.ENDED : PepStatus.ONGOING;
51
- return state;
52
- }
1
+ import { PepState, PepType, EntityType, PepStatus } from "../pages/PepContext";
2
+ import { DateTime } from "luxon";
3
+
4
+ export interface PepRequest
5
+ extends Omit<PepState, "isSweden" | "isOngoing" | "ended" | "birthdayOfPEP"> {
6
+ ended?: string;
7
+ birthdayOfPEP?: string;
8
+ }
9
+
10
+ /**
11
+ * Do some minor preprocessing before we are ready to send everything to the
12
+ * server
13
+ */
14
+ export function stateToRequest(pepData: PepState): PepRequest {
15
+ const data = { ...pepData };
16
+ delete data.isSweden;
17
+ delete data.isOngoing;
18
+ delete data.ownerName;
19
+ if (data.legalEntityType === EntityType.PERSON) {
20
+ delete data.tin;
21
+ }
22
+ return {
23
+ ...data,
24
+ country: data.type !== PepType.NOT_PEP ? data.country || "SE" : undefined,
25
+ ended: data.ended
26
+ ? DateTime.fromJSDate(data.ended).toFormat("yyyy-MM")
27
+ : undefined,
28
+ birthdayOfPEP: data.birthdayOfPEP
29
+ ? DateTime.fromJSDate(data.birthdayOfPEP).toFormat("yyyy-MM-dd")
30
+ : undefined
31
+ };
32
+ }
33
+
34
+ export function requestToState({
35
+ ended,
36
+ birthdayOfPEP,
37
+ ...serverData
38
+ }: PepRequest): PepState {
39
+ const state: PepState = { ...serverData };
40
+ if (ended) {
41
+ state.ended = DateTime.fromFormat(ended, "yyyy-MM").toJSDate();
42
+ }
43
+ if (birthdayOfPEP) {
44
+ state.birthdayOfPEP = DateTime.fromFormat(
45
+ birthdayOfPEP,
46
+ "yyyy-MM-dd"
47
+ ).toJSDate();
48
+ }
49
+ state.isSweden = state.country === "SE" ? "sweden" : "other";
50
+ state.isOngoing = state.ended ? PepStatus.ENDED : PepStatus.ONGOING;
51
+ return state;
52
+ }
@@ -0,0 +1,67 @@
1
+ import { defineMessages } from "react-intl";
2
+ import { PepType } from "../PepContext";
3
+
4
+ export const messages = defineMessages({
5
+ header: {
6
+ id: "pep.ispep.header",
7
+ description: "Not pep",
8
+ defaultMessage: `{
9
+ entityType, select,
10
+ PERSON {
11
+ Är du eller en närstående till dig en person i politisk utsatt ställning? (PEP)
12
+ }
13
+ CORPORATION {
14
+ Är {name} eller en närstående till {name} en person i politisk utsatt ställning? (PEP)
15
+ }
16
+ }`,
17
+ },
18
+ required: {
19
+ id: "pep.ispep.required",
20
+ description: "Not pep",
21
+ defaultMessage: "Du måste välja ett alternativ",
22
+ },
23
+ [PepType.NOT_PEP]: {
24
+ id: "pep.ispep.NOT_PEP",
25
+ description: "Not pep",
26
+ defaultMessage: "Nej",
27
+ },
28
+ [PepType.ME]: {
29
+ id: "pep.ispep.ME",
30
+ description: "The person is pep",
31
+ defaultMessage: `{
32
+ entityType, select,
33
+ PERSON {
34
+ Jag har en funktion som gör mig till PEP
35
+ }
36
+ CORPORATION {
37
+ På grund av sin funktion är {name} PEP
38
+ }
39
+ }`,
40
+ },
41
+ [PepType.RELATIVE]: {
42
+ id: "pep.ispep.RELATIVE",
43
+ description: "Jag har en relation med en person som är PEP",
44
+ defaultMessage: `{
45
+ entityType, select,
46
+ PERSON {
47
+ Jag har en relation med en person som är PEP
48
+ }
49
+ CORPORATION {
50
+ {name} är medarbetare till, eller har en affärsrelation med, en person som är PEP
51
+ }
52
+ }`,
53
+ },
54
+ [PepType.COLLEAGUE]: {
55
+ id: "pep.ispep.COLLEAGUE",
56
+ description: "The person has a colleague that is pep",
57
+ defaultMessage: `{
58
+ entityType, select,
59
+ PERSON {
60
+ Jag är medarbetare till, eller har en affärsrelation med, en person som är PEP
61
+ }
62
+ CORPORATION {
63
+ På grund av sin funktion är {name} PEP
64
+ }
65
+ }`,
66
+ },
67
+ });
@@ -0,0 +1,114 @@
1
+ import React, {
2
+ FunctionComponent,
3
+ useRef,
4
+ useCallback,
5
+ useContext,
6
+ } from "react";
7
+ import {
8
+ Form,
9
+ RadioGroup,
10
+ RequiredValidator,
11
+ PrimaryButton,
12
+ LysaFormRef,
13
+ } from "@lysaab/ui-2";
14
+ import { PepType, PepContext, EntityType } from "../PepContext";
15
+ import { useIntl, FormattedMessage } from "react-intl";
16
+ import { messages } from "./IsPepMessages";
17
+
18
+ export interface ExternalIsPepState {
19
+ ownerName: string;
20
+ entityType: EntityType;
21
+ type?: PepType;
22
+ onChange: (type: PepType) => void;
23
+ }
24
+
25
+ interface Props {
26
+ next?: () => void;
27
+ }
28
+
29
+ export const IsPepRadioGroup: FunctionComponent<ExternalIsPepState> = ({
30
+ ownerName,
31
+ entityType,
32
+ type,
33
+ onChange,
34
+ }) => {
35
+ const intl = useIntl();
36
+
37
+ const IsPepAlternatives = [
38
+ {
39
+ text: intl.formatMessage(messages[PepType.NOT_PEP], {
40
+ entityType,
41
+ name: ownerName,
42
+ }),
43
+ value: PepType.NOT_PEP,
44
+ },
45
+ {
46
+ text: intl.formatMessage(messages[PepType.ME], {
47
+ entityType,
48
+ name: ownerName,
49
+ }),
50
+ value: PepType.ME,
51
+ },
52
+ {
53
+ text: intl.formatMessage(messages[PepType.RELATIVE], {
54
+ entityType,
55
+ name: ownerName,
56
+ }),
57
+ value: PepType.RELATIVE,
58
+ },
59
+ {
60
+ text: intl.formatMessage(messages[PepType.COLLEAGUE], {
61
+ entityType,
62
+ name: ownerName,
63
+ }),
64
+ value: PepType.COLLEAGUE,
65
+ },
66
+ ];
67
+
68
+ return (
69
+ <RadioGroup
70
+ alternatives={IsPepAlternatives}
71
+ onChange={(alt) => onChange(alt.value)}
72
+ value={IsPepAlternatives.find((alt) => alt.value === type)}
73
+ header={intl.formatMessage(messages.header, {
74
+ entityType,
75
+ name: ownerName,
76
+ })}
77
+ validators={[
78
+ new RequiredValidator(intl.formatMessage(messages.required)),
79
+ ]}
80
+ />
81
+ );
82
+ };
83
+
84
+ export const IsPepPage: FunctionComponent<Props> = ({ next }) => {
85
+ const pepContext = useContext(PepContext);
86
+ const formRef = useRef<LysaFormRef>();
87
+
88
+ const nextPage = useCallback(() => {
89
+ if (formRef.current && formRef.current.isValid && next) {
90
+ next();
91
+ }
92
+ }, [formRef, next]);
93
+
94
+ return (
95
+ <Form onSubmit={nextPage} lysaFormRef={formRef}>
96
+ <IsPepRadioGroup
97
+ entityType={pepContext.state.legalEntityType || EntityType.PERSON}
98
+ ownerName={pepContext.state.ownerName || ""}
99
+ type={pepContext.state.type}
100
+ onChange={(type) => {
101
+ pepContext.setState({ type });
102
+ }}
103
+ />
104
+
105
+ <PrimaryButton type="submit">
106
+ <FormattedMessage
107
+ id="pep.ispep.next"
108
+ description="Next button"
109
+ defaultMessage="Gå vidare"
110
+ />
111
+ </PrimaryButton>
112
+ </Form>
113
+ );
114
+ };