@lysaab/lysa-pep 6.2.0 → 7.0.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 (84) hide show
  1. package/lib/README.md +51 -0
  2. package/lib/package.json +73 -0
  3. package/{pages → lib/pages}/PepContext.d.ts +3 -3
  4. package/package.json +19 -21
  5. package/public/favicon.ico +0 -0
  6. package/public/index.html +43 -0
  7. package/public/logo192.png +0 -0
  8. package/public/logo512.png +0 -0
  9. package/public/manifest.json +25 -0
  10. package/public/robots.txt +2 -0
  11. package/src/App.scss +5 -0
  12. package/src/App.test.tsx +9 -0
  13. package/src/App.tsx +17 -0
  14. package/src/Exports.ts +12 -0
  15. package/src/components/PepAnswers.scss +7 -0
  16. package/src/components/PepAnswers.tsx +218 -0
  17. package/src/demo/Done.tsx +21 -0
  18. package/src/demo/Localization.tsx +66 -0
  19. package/src/demo/LocalizationContext.tsx +61 -0
  20. package/src/demo/Pep.tsx +172 -0
  21. package/src/index.css +13 -0
  22. package/src/index.tsx +13 -0
  23. package/src/locales/da.json +98 -0
  24. package/src/locales/de.json +98 -0
  25. package/src/locales/defaultMessages.json +335 -0
  26. package/src/locales/en.json +98 -0
  27. package/src/locales/fi.json +98 -0
  28. package/src/locales/sv.json +98 -0
  29. package/src/locales/whitelist_da.json +2 -0
  30. package/src/locales/whitelist_en.json +2 -0
  31. package/src/locales/whitelist_fi.json +2 -0
  32. package/src/locales/whitelist_sv.json +2 -0
  33. package/src/logo.svg +1 -0
  34. package/src/model/PepModel.ts +54 -0
  35. package/src/pages/IsPep/IsPepMessages.ts +11 -0
  36. package/src/pages/IsPep/IsPepPage.tsx +119 -0
  37. package/src/pages/PepContext.tsx +150 -0
  38. package/src/pages/RelationPage/RelationMessages.ts +74 -0
  39. package/src/pages/RelationPage/RelationPage.tsx +306 -0
  40. package/src/pages/RolePage/RoleMessages.ts +128 -0
  41. package/src/pages/RolePage/RolePage.tsx +359 -0
  42. package/src/pages/StatusPage/StatusMessages.ts +59 -0
  43. package/src/pages/StatusPage/StatusPage.tsx +237 -0
  44. package/src/react-app-env.d.ts +1 -0
  45. package/src/serviceWorker.ts +143 -0
  46. package/src/utils/Possession.ts +41 -0
  47. package/translationRunner.js +7 -0
  48. package/tsconfig.json +26 -0
  49. package/tsconfig_build.json +19 -0
  50. /package/{Exports.d.ts → lib/Exports.d.ts} +0 -0
  51. /package/{Exports.js → lib/Exports.js} +0 -0
  52. /package/{components → lib/components}/PepAnswers.d.ts +0 -0
  53. /package/{components → lib/components}/PepAnswers.js +0 -0
  54. /package/{components → lib/components}/PepAnswers.scss +0 -0
  55. /package/{messages → lib/messages}/src/components/PepAnswers.json +0 -0
  56. /package/{messages → lib/messages}/src/pages/IsPep/IsPepMessages.json +0 -0
  57. /package/{messages → lib/messages}/src/pages/IsPep/IsPepPage.json +0 -0
  58. /package/{messages → lib/messages}/src/pages/RelationPage/RelationMessages.json +0 -0
  59. /package/{messages → lib/messages}/src/pages/RelationPage/RelationPage.json +0 -0
  60. /package/{messages → lib/messages}/src/pages/RolePage/RoleMessages.json +0 -0
  61. /package/{messages → lib/messages}/src/pages/RolePage/RolePage.json +0 -0
  62. /package/{messages → lib/messages}/src/pages/StatusPage/StatusMessages.json +0 -0
  63. /package/{messages → lib/messages}/src/pages/StatusPage/StatusPage.json +0 -0
  64. /package/{model → lib/model}/PepModel.d.ts +0 -0
  65. /package/{model → lib/model}/PepModel.js +0 -0
  66. /package/{pages → lib/pages}/IsPep/IsPepMessages.d.ts +0 -0
  67. /package/{pages → lib/pages}/IsPep/IsPepMessages.js +0 -0
  68. /package/{pages → lib/pages}/IsPep/IsPepPage.d.ts +0 -0
  69. /package/{pages → lib/pages}/IsPep/IsPepPage.js +0 -0
  70. /package/{pages → lib/pages}/PepContext.js +0 -0
  71. /package/{pages → lib/pages}/RelationPage/RelationMessages.d.ts +0 -0
  72. /package/{pages → lib/pages}/RelationPage/RelationMessages.js +0 -0
  73. /package/{pages → lib/pages}/RelationPage/RelationPage.d.ts +0 -0
  74. /package/{pages → lib/pages}/RelationPage/RelationPage.js +0 -0
  75. /package/{pages → lib/pages}/RolePage/RoleMessages.d.ts +0 -0
  76. /package/{pages → lib/pages}/RolePage/RoleMessages.js +0 -0
  77. /package/{pages → lib/pages}/RolePage/RolePage.d.ts +0 -0
  78. /package/{pages → lib/pages}/RolePage/RolePage.js +0 -0
  79. /package/{pages → lib/pages}/StatusPage/StatusMessages.d.ts +0 -0
  80. /package/{pages → lib/pages}/StatusPage/StatusMessages.js +0 -0
  81. /package/{pages → lib/pages}/StatusPage/StatusPage.d.ts +0 -0
  82. /package/{pages → lib/pages}/StatusPage/StatusPage.js +0 -0
  83. /package/{utils → lib/utils}/Possession.d.ts +0 -0
  84. /package/{utils → lib/utils}/Possession.js +0 -0
@@ -0,0 +1,306 @@
1
+ import React, {
2
+ useContext,
3
+ useRef,
4
+ useCallback,
5
+ FunctionComponent,
6
+ } from "react";
7
+ import {
8
+ PepContext,
9
+ PepType,
10
+ BusinessRelation,
11
+ Relation,
12
+ EntityType,
13
+ PepContextProps,
14
+ } from "../PepContext";
15
+ import {
16
+ LysaFormRef,
17
+ RadioGroup,
18
+ Form,
19
+ Alternative,
20
+ RequiredValidator,
21
+ TextInput,
22
+ Datepicker,
23
+ Button,
24
+ Card,
25
+ } from "@lysaab/ui-2";
26
+ import { DateTime } from "luxon";
27
+ import { useIntl, IntlShape, FormattedMessage } from "react-intl";
28
+ import {
29
+ relationMessages,
30
+ businessRelationMessages,
31
+ relativeNameMessages,
32
+ birthdayMessages,
33
+ colleagueNameMessages,
34
+ } from "./RelationMessages";
35
+ import { formatPossessive } from "../../utils/Possession";
36
+
37
+ const DATEPICKER_START_DATE = DateTime.fromISO("1970-01-01").toJSDate();
38
+
39
+ interface Props {
40
+ next: () => void;
41
+ }
42
+
43
+ export const RelationPage: FunctionComponent<Props> = ({ next }) => {
44
+ const intl = useIntl();
45
+ const pepContext = useContext(PepContext);
46
+ const formRef = useRef<LysaFormRef>();
47
+ const entityType = pepContext.state.legalEntityType || EntityType.PERSON;
48
+ const type = pepContext.state.type;
49
+
50
+ const businessRelationAlternatives = getBusinessRelationAlternatives(
51
+ intl,
52
+ entityType,
53
+ pepContext
54
+ );
55
+ const relationAlternatives = getRelationAlternatives(
56
+ intl,
57
+ entityType,
58
+ pepContext
59
+ );
60
+
61
+ const nextPage = useCallback(() => {
62
+ if (formRef.current && formRef.current.isValid) {
63
+ next();
64
+ }
65
+ }, [formRef, next]);
66
+ return (
67
+ <Form onSubmit={() => nextPage()} lysaFormRef={formRef}>
68
+ <Card>
69
+ {type === PepType.RELATIVE ? (
70
+ <RadioGroup
71
+ alternatives={relationAlternatives}
72
+ onChange={(alternative) => {
73
+ pepContext.setState({
74
+ relationToPEP: alternative.value,
75
+ });
76
+ }}
77
+ value={relationAlternatives.find(
78
+ (alt) => alt.value === pepContext.state.relationToPEP
79
+ )}
80
+ header={intl.formatMessage(relationMessages.header, {
81
+ entityType,
82
+ name: pepContext.state.ownerName,
83
+ possessiveName: formatPossessive(
84
+ pepContext.state.ownerName,
85
+ intl.locale
86
+ ),
87
+ })}
88
+ validators={[
89
+ new RequiredValidator(
90
+ intl.formatMessage(relationMessages.required)
91
+ ),
92
+ ]}
93
+ />
94
+ ) : null}
95
+ {type === PepType.COLLEAGUE ? (
96
+ <RadioGroup
97
+ alternatives={businessRelationAlternatives}
98
+ onChange={(alternative) => {
99
+ pepContext.setState({
100
+ businessRelation: alternative.value,
101
+ });
102
+ }}
103
+ value={businessRelationAlternatives.find(
104
+ (alt) => alt.value === pepContext.state.businessRelation
105
+ )}
106
+ header={intl.formatMessage(businessRelationMessages.header, {
107
+ entityType,
108
+ name: pepContext.state.ownerName,
109
+ })}
110
+ validators={[
111
+ new RequiredValidator(
112
+ intl.formatMessage(businessRelationMessages.required)
113
+ ),
114
+ ]}
115
+ />
116
+ ) : null}
117
+ {pepContext.state.relationToPEP && type === PepType.RELATIVE ? (
118
+ <React.Fragment>
119
+ <TextInput
120
+ label={intl.formatMessage(relativeNameMessages.header, {
121
+ entityType,
122
+ name: pepContext.state.ownerName,
123
+ relation:
124
+ pepContext.state.type === PepType.COLLEAGUE
125
+ ? pepContext.state.businessRelation
126
+ : pepContext.state.relationToPEP,
127
+ possessiveName: formatPossessive(
128
+ pepContext.state.ownerName,
129
+ intl.locale
130
+ ),
131
+ })}
132
+ value={pepContext.state.nameOfPEP || ""}
133
+ onChange={(value) => {
134
+ pepContext.setState({ nameOfPEP: value });
135
+ }}
136
+ validators={[
137
+ new RequiredValidator(
138
+ intl.formatMessage(relativeNameMessages.required)
139
+ ),
140
+ ]}
141
+ />
142
+ <Datepicker
143
+ label={intl.formatMessage(birthdayMessages.header, {
144
+ entityType,
145
+ name: pepContext.state.ownerName,
146
+ relation:
147
+ pepContext.state.type === PepType.COLLEAGUE
148
+ ? pepContext.state.businessRelation
149
+ : pepContext.state.relationToPEP,
150
+ possessiveName: formatPossessive(
151
+ pepContext.state.ownerName,
152
+ intl.locale
153
+ ),
154
+ })}
155
+ selected={pepContext.state.birthdayOfPEP}
156
+ onChange={(event) => {
157
+ // event has a type that says it can be [startDate, endDate]
158
+ // but we know that will never be the case here
159
+ pepContext.setState({
160
+ birthdayOfPEP: (event as Date) || undefined,
161
+ });
162
+ }}
163
+ validators={[
164
+ new RequiredValidator(
165
+ intl.formatMessage(birthdayMessages.required)
166
+ ),
167
+ ]}
168
+ maxDate={new Date()}
169
+ openToDate={
170
+ pepContext.state.birthdayOfPEP || DATEPICKER_START_DATE
171
+ }
172
+ />
173
+ </React.Fragment>
174
+ ) : null}
175
+
176
+ {pepContext.state.businessRelation && type === PepType.COLLEAGUE ? (
177
+ <React.Fragment>
178
+ <TextInput
179
+ label={intl.formatMessage(colleagueNameMessages.header, {
180
+ entityType,
181
+ name: pepContext.state.ownerName,
182
+ relation:
183
+ pepContext.state.type === PepType.COLLEAGUE
184
+ ? pepContext.state.businessRelation
185
+ : pepContext.state.relationToPEP,
186
+ possessiveName: formatPossessive(
187
+ pepContext.state.ownerName,
188
+ intl.locale
189
+ ),
190
+ })}
191
+ value={pepContext.state.nameOfPEP || ""}
192
+ onChange={(value) => {
193
+ pepContext.setState({ nameOfPEP: value });
194
+ }}
195
+ validators={[
196
+ new RequiredValidator(
197
+ intl.formatMessage(colleagueNameMessages.required)
198
+ ),
199
+ ]}
200
+ />
201
+ </React.Fragment>
202
+ ) : null}
203
+ </Card>
204
+ <Button
205
+ block
206
+ type="submit"
207
+ label={<FormattedMessage id="pep.relation.next" />}
208
+ />
209
+ </Form>
210
+ );
211
+ };
212
+ function getRelationAlternatives(
213
+ intl: IntlShape,
214
+ entityType: EntityType,
215
+ pepContext: PepContextProps
216
+ ): Alternative<Relation>[] {
217
+ return [
218
+ {
219
+ text: intl.formatMessage(relationMessages[Relation.MARRIED_PARTNER], {
220
+ entityType,
221
+ name: pepContext.state.ownerName,
222
+ }),
223
+ value: Relation.MARRIED_PARTNER,
224
+ },
225
+ {
226
+ text: intl.formatMessage(relationMessages[Relation.COLIVING_PARTNER], {
227
+ entityType,
228
+ name: pepContext.state.ownerName,
229
+ }),
230
+ value: Relation.COLIVING_PARTNER,
231
+ },
232
+ {
233
+ text: intl.formatMessage(relationMessages[Relation.CHILD], {
234
+ entityType,
235
+ name: pepContext.state.ownerName,
236
+ }),
237
+ value: Relation.CHILD,
238
+ },
239
+ {
240
+ text: intl.formatMessage(relationMessages[Relation.PARENT], {
241
+ entityType,
242
+ name: pepContext.state.ownerName,
243
+ }),
244
+ value: Relation.PARENT,
245
+ },
246
+ {
247
+ text: intl.formatMessage(
248
+ relationMessages[Relation.CHILD_MARRIED_PARTNER],
249
+ {
250
+ entityType,
251
+ name: pepContext.state.ownerName,
252
+ }
253
+ ),
254
+ value: Relation.CHILD_MARRIED_PARTNER,
255
+ },
256
+ {
257
+ text: intl.formatMessage(
258
+ relationMessages[Relation.CHILD_COLIVING_PARTNER],
259
+ {
260
+ entityType,
261
+ name: pepContext.state.ownerName,
262
+ }
263
+ ),
264
+ value: Relation.CHILD_COLIVING_PARTNER,
265
+ },
266
+ ];
267
+ }
268
+
269
+ function getBusinessRelationAlternatives(
270
+ intl: IntlShape,
271
+ entityType: EntityType,
272
+ pepContext: PepContextProps
273
+ ): Alternative<BusinessRelation>[] {
274
+ return [
275
+ {
276
+ text: intl.formatMessage(
277
+ businessRelationMessages[BusinessRelation.CO_OWNERSHIP],
278
+ {
279
+ entityType,
280
+ name: pepContext.state.ownerName,
281
+ }
282
+ ),
283
+ value: BusinessRelation.CO_OWNERSHIP,
284
+ },
285
+ {
286
+ text: intl.formatMessage(
287
+ businessRelationMessages[BusinessRelation.CLOSE_CONNECTION],
288
+ {
289
+ entityType,
290
+ name: pepContext.state.ownerName,
291
+ }
292
+ ),
293
+ value: BusinessRelation.CLOSE_CONNECTION,
294
+ },
295
+ {
296
+ text: intl.formatMessage(
297
+ businessRelationMessages[BusinessRelation.COMPANY_FOR_PEP],
298
+ {
299
+ entityType,
300
+ name: pepContext.state.ownerName,
301
+ }
302
+ ),
303
+ value: BusinessRelation.COMPANY_FOR_PEP,
304
+ },
305
+ ];
306
+ }
@@ -0,0 +1,128 @@
1
+ import { defineMessages } from "react-intl";
2
+ import { Role, MilitaryRank } from "../PepContext";
3
+
4
+ export const roleMessages = defineMessages({
5
+ header: {
6
+ id: "pep.role.roles.header",
7
+ },
8
+ placeholder: {
9
+ id: "pep.role.roles.placeholder",
10
+ },
11
+ required: {
12
+ id: "pep.role.roles.required",
13
+ },
14
+ [Role.HEAD_OF_GOVERNMENT]: {
15
+ id: "pep.role.roles.alt.HEAD_OF_GOVERNMENT",
16
+ },
17
+ [Role.MINISTER]: {
18
+ id: "pep.role.roles.alt.MINISTER",
19
+ },
20
+ [Role.PARLIMENT_MEMBER]: {
21
+ id: "pep.role.roles.alt.PARLIMENT_MEMBER",
22
+ },
23
+ [Role.CENTRAL_BANK_MEMBER]: {
24
+ id: "pep.role.roles.alt.CENTRAL_BANK_MEMBER",
25
+ },
26
+ [Role.BOARD_MEMBER_POLITICAL_PARTY]: {
27
+ id: "pep.role.roles.alt.BOARD_MEMBER_POLITICAL_PARTY",
28
+ },
29
+ [Role.JUDGE_SUPREME_COURT]: {
30
+ id: "pep.role.roles.alt.JUDGE_SUPREME_COURT",
31
+ },
32
+ [Role.JUDGE_OTHER_HIGH_COURT]: {
33
+ id: "pep.role.roles.alt.JUDGE_OTHER_HIGH_COURT",
34
+ },
35
+ [Role.REVISION_INSTITUTE]: {
36
+ id: "pep.role.roles.alt.REVISION_INSTITUTE",
37
+ },
38
+ [Role.AMBASSADOR]: {
39
+ id: "pep.role.roles.alt.AMBASSADOR",
40
+ },
41
+ [Role.MILITARY_OFFICER]: {
42
+ id: "pep.role.roles.alt.MILITARY_OFFICER",
43
+ },
44
+ [Role.GOVERNMENT_COMPANY]: {
45
+ id: "pep.role.roles.alt.GOVERNMENT_COMPANY",
46
+ },
47
+ [Role.EU_HIGH_RANKING_POSITION]: {
48
+ id: "pep.role.roles.alt.EU_HIGH_RANKING_POSITION",
49
+ },
50
+ [Role.HIGH_RANKING_POSITION_INTERNALTIONAL_CORP]: {
51
+ id: "pep.role.roles.alt.HIGH_RANKING_POSITION_INTERNALTIONAL_CORP",
52
+ },
53
+ });
54
+
55
+ export const militaryMessages = defineMessages({
56
+ header: {
57
+ id: "pep.role.military.name.header",
58
+ },
59
+ placeholder: {
60
+ id: "pep.role.military.header",
61
+ },
62
+ required: {
63
+ id: "pep.role.military.required",
64
+ },
65
+ [MilitaryRank.GENERAL]: {
66
+ id: "pep.role.military.alt.GENERAL",
67
+ },
68
+ [MilitaryRank.LIEUTENANT_GENERAL]: {
69
+ id: "pep.role.military.alt.LIEUTENANT_GENERAL",
70
+ },
71
+ [MilitaryRank.MAJOR_GENERAL]: {
72
+ id: "pep.role.military.alt.MAJOR_GENERAL",
73
+ },
74
+ [MilitaryRank.ADMIRAL]: {
75
+ id: "pep.role.military.alt.ADMIRAL",
76
+ },
77
+ [MilitaryRank.VICE_ADMIRAL]: {
78
+ id: "pep.role.military.alt.VICE_ADMIRAL",
79
+ },
80
+ [MilitaryRank.REAR_ADMIRAL]: {
81
+ id: "pep.role.military.alt.REAR_ADMIRAL",
82
+ },
83
+ });
84
+
85
+ export const ambassadorMessages = defineMessages({
86
+ header: {
87
+ id: "pep.role.ambassador.header",
88
+ },
89
+ required: {
90
+ id: "pep.role.ambassador.required",
91
+ },
92
+ placeholder: {
93
+ id: "pep.role.ambassador.placeholder",
94
+ },
95
+ });
96
+
97
+ export const governmentCompanyMessages = defineMessages({
98
+ nameHeader: {
99
+ id: "pep.role.governmentCompany.name.header",
100
+ },
101
+ nameRequired: {
102
+ id: "pep.role.governmentCompany.name.required",
103
+ },
104
+ roleHeader: {
105
+ id: "pep.role.governmentCompany.role.header",
106
+ },
107
+ roleRequired: {
108
+ id: "pep.role.governmentCompany.role.required",
109
+ },
110
+ });
111
+
112
+ export const intCompanyMessages = defineMessages({
113
+ nameHeader: {
114
+ id: "pep.role.intCompany.name.header",
115
+ },
116
+ nameRequired: {
117
+ id: "pep.role.intCompany.name.required",
118
+ },
119
+ roleHeader: {
120
+ id: "pep.role.intCompany.role.header",
121
+ },
122
+ roleRequired: {
123
+ id: "pep.role.intCompany.role.required",
124
+ },
125
+ });
126
+
127
+ export const countrySelectionMessages = defineMessages({
128
+ });