@omnsight/osint-entity-components 0.2.4 → 0.2.6

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 (60) hide show
  1. package/dist/index.js +8 -8
  2. package/dist/index.mjs +796 -781
  3. package/package.json +15 -2
  4. package/src/App.tsx +397 -141
  5. package/src/avatars/layouts/AvatarDropdown.tsx +1 -1
  6. package/src/avatars/layouts/AvatarSpan.tsx +7 -2
  7. package/src/forms/BaseForm.tsx +138 -0
  8. package/src/forms/EditableAttributes.tsx +131 -0
  9. package/src/forms/EventForm/EditableForm.tsx +78 -0
  10. package/src/forms/EventForm/EditingForm.tsx +401 -0
  11. package/src/forms/EventForm/IconFormSection.tsx +54 -0
  12. package/src/forms/EventForm/StaticForm.tsx +272 -0
  13. package/src/forms/EventForm/index.ts +1 -0
  14. package/src/forms/InsightForm/EditableForm.tsx +70 -0
  15. package/src/forms/InsightForm/EditingForm.tsx +79 -0
  16. package/src/forms/InsightForm/StaticForm.tsx +139 -0
  17. package/src/forms/InsightForm/index.ts +1 -0
  18. package/src/forms/MonitoringSourceForm/EditableForm.tsx +59 -0
  19. package/src/forms/MonitoringSourceForm/EditingForm.tsx +192 -0
  20. package/src/forms/MonitoringSourceForm/StaticForm.tsx +107 -0
  21. package/src/forms/MonitoringSourceForm/index.ts +1 -0
  22. package/src/forms/OrganizationForm/EditableForm.tsx +74 -0
  23. package/src/forms/OrganizationForm/EditingForm.tsx +177 -0
  24. package/src/forms/OrganizationForm/IconFormSection.tsx +60 -0
  25. package/src/forms/OrganizationForm/StaticForm.tsx +209 -0
  26. package/src/forms/OrganizationForm/index.ts +1 -0
  27. package/src/forms/PersonForm/EditableForm.tsx +74 -0
  28. package/src/forms/PersonForm/EditingForm.tsx +187 -0
  29. package/src/forms/PersonForm/IconFormSection.tsx +54 -0
  30. package/src/forms/PersonForm/StaticForm.tsx +202 -0
  31. package/src/forms/PersonForm/index.ts +1 -0
  32. package/src/forms/RelationForm/EditableForm.tsx +74 -0
  33. package/src/forms/RelationForm/EditingForm.tsx +147 -0
  34. package/src/forms/RelationForm/StaticForm.tsx +182 -0
  35. package/src/forms/RelationForm/index.ts +1 -0
  36. package/src/forms/SourceForm/EditableForm.tsx +74 -0
  37. package/src/forms/SourceForm/EditingForm.tsx +199 -0
  38. package/src/forms/SourceForm/IconFormSection.tsx +54 -0
  39. package/src/forms/SourceForm/StaticForm.tsx +209 -0
  40. package/src/forms/SourceForm/index.ts +1 -0
  41. package/src/forms/WebsiteForm/EditableForm.tsx +74 -0
  42. package/src/forms/WebsiteForm/EditingForm.tsx +216 -0
  43. package/src/forms/WebsiteForm/IconFormSection.tsx +54 -0
  44. package/src/forms/WebsiteForm/StaticForm.tsx +225 -0
  45. package/src/forms/WebsiteForm/index.ts +1 -0
  46. package/src/forms/accessLevel.ts +48 -0
  47. package/src/forms/index.ts +8 -0
  48. package/src/icons/Event/Select.tsx +7 -6
  49. package/src/icons/Organization/Select.tsx +7 -6
  50. package/src/icons/Person/Select.tsx +7 -6
  51. package/src/icons/Source/Select.tsx +7 -6
  52. package/src/icons/Website/Select.tsx +9 -8
  53. package/src/inputs/CountrySelect.tsx +45 -0
  54. package/src/inputs/CustomDatePicker.tsx +51 -0
  55. package/src/inputs/CustomDateTimePicker.tsx +51 -0
  56. package/src/inputs/RangeDatePicker.tsx +99 -0
  57. package/src/inputs/TimezoneSelect.tsx +20 -0
  58. package/src/locales/en.json +135 -0
  59. package/src/locales/zh.json +135 -0
  60. package/src/main.tsx +20 -4
package/package.json CHANGED
@@ -3,7 +3,12 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "0.2.4",
6
+ "version": "0.2.6",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/omnsight/omni-osint-entity-components.git",
10
+ "directory": "client"
11
+ },
7
12
  "engines": {
8
13
  "node": ">=24.0.0"
9
14
  },
@@ -51,20 +56,28 @@
51
56
  "dependencies": {
52
57
  "@heroicons/react": "^2.2.0",
53
58
  "@mantine/core": "^8.3.18",
59
+ "@mantine/dates": "^8.3.18",
54
60
  "@mantine/hooks": "^8.3.18",
61
+ "@mantine/modals": "^8.3.18",
62
+ "@mantine/notifications": "^8.3.18",
55
63
  "@svgr/plugin-jsx": "^8.1.0",
56
64
  "@svgr/plugin-svgo": "^8.1.0",
65
+ "date-fns-tz": "^3.2.0",
66
+ "i18n-iso-countries": "^7.14.0",
67
+ "loadash": "^1.0.0",
57
68
  "omni-monitoring-client": "latest",
58
69
  "omni-osint-crud-client": "latest",
59
70
  "react": "^19.2.4",
60
71
  "react-dom": "^19.2.4",
61
72
  "react-hook-form": "^7.72.0",
62
- "react-i18next": "^16.6.6"
73
+ "react-i18next": "^16.6.6",
74
+ "react-timezone-select": "^3.3.3"
63
75
  },
64
76
  "devDependencies": {
65
77
  "@eslint/js": "^9.39.4",
66
78
  "@iconify/utils": "^3.1.0",
67
79
  "@svgr/core": "^8.1.0",
80
+ "@types/lodash": "^4.17.24",
68
81
  "@types/node": "^24.12.0",
69
82
  "@types/react": "^19.2.14",
70
83
  "@types/react-dom": "^19.2.3",
package/src/App.tsx CHANGED
@@ -2,6 +2,7 @@ import {
2
2
  ActionIcon,
3
3
  Button,
4
4
  Card,
5
+ Divider,
5
6
  Group,
6
7
  ScrollArea,
7
8
  SimpleGrid,
@@ -11,6 +12,17 @@ import {
11
12
  } from "@mantine/core";
12
13
  import { useState } from "react";
13
14
  import { useTranslation } from "react-i18next";
15
+ import { ArrowRightIcon } from "@heroicons/react/24/solid";
16
+ import type {
17
+ Person,
18
+ Organization,
19
+ Event,
20
+ Source,
21
+ Website,
22
+ Relation,
23
+ OsintView,
24
+ } from "omni-osint-crud-client";
25
+ import type { MonitoringSource } from "omni-monitoring-client";
14
26
  import {
15
27
  AvatarDropdown,
16
28
  AvatarRowList,
@@ -34,15 +46,6 @@ import {
34
46
  WebsiteIcon,
35
47
  WebsiteIconSelect,
36
48
  } from "./icons";
37
- import type {
38
- Person,
39
- Organization,
40
- Event,
41
- Source,
42
- Website,
43
- Relation,
44
- } from "omni-osint-crud-client";
45
- import type { MonitoringSource } from "omni-monitoring-client";
46
49
  import {
47
50
  EventCard,
48
51
  OrganizationCard,
@@ -51,66 +54,132 @@ import {
51
54
  WebsiteCard,
52
55
  MonitoringSourceCard,
53
56
  } from "./cards";
54
- import { ArrowRightIcon } from "@heroicons/react/24/solid";
57
+ import {
58
+ EventForm,
59
+ InsightForm,
60
+ MonitoringSourceForm,
61
+ OrganizationForm,
62
+ PersonForm,
63
+ RelationForm,
64
+ SourceForm,
65
+ WebsiteForm,
66
+ } from "./forms";
55
67
 
56
68
  function App() {
57
69
  const { i18n } = useTranslation();
58
70
  const { colorScheme, setColorScheme } = useMantineColorScheme();
71
+ const [isAdmin, setIsAdmin] = useState(true);
59
72
  const [person, setPerson] = useState<Person>({
60
- _id: "person-1",
73
+ _id: "person/1",
61
74
  name: "John Doe",
62
75
  role: "professional",
63
76
  aliases: ["John", "Johnny"],
64
77
  tags: ["tag1", "tag2"],
78
+ owner: "asj1834s",
79
+ read: ["admin"],
80
+ write: ["admin"],
65
81
  });
66
82
  const [organization, setOrganization] = useState<Organization>({
67
- _id: "org-1",
83
+ _id: "org/1",
68
84
  name: "Acme Inc.",
69
85
  tags: ["company", "software"],
86
+ owner: "asj1834s",
87
+ read: ["admin"],
88
+ write: ["admin"],
70
89
  });
71
90
  const [event, setEvent] = useState<Event>({
72
- _id: "event-1",
91
+ _id: "event/1",
73
92
  title: "New Product Launch",
74
93
  description: "The launch of a new product",
75
94
  happened_at: new Date().getTime() / 1000,
76
95
  tags: ["new-product", "launch"],
96
+ owner: "asj1834s",
97
+ read: ["admin"],
98
+ write: ["admin"],
77
99
  });
78
100
  const [source, setSource] = useState<Source>({
79
- _id: "source-1",
101
+ _id: "source/1",
80
102
  name: "News Article",
81
103
  url: "https://example.com/article",
82
104
  description: "A news article about something.",
83
105
  tags: ["news", "article"],
106
+ owner: "asj1834s",
107
+ read: ["admin"],
108
+ write: ["admin"],
109
+ });
110
+ const [source2, ] = useState<Source>({
111
+ _id: "source/2",
112
+ name: "Sample Artical 2",
113
+ url: "https://example.com/article/2",
114
+ description: "A news article about something 2",
115
+ tags: ["news", "article", "2"],
116
+ owner: "asj1834s",
117
+ read: ["admin"],
118
+ write: ["admin"],
84
119
  });
85
120
  const [website, setWebsite] = useState<Website>({
86
- _id: "website-1",
121
+ _id: "website/1",
87
122
  url: "https://example.com",
88
123
  title: "Example Website",
89
124
  description: "An example website.",
90
125
  tags: ["website", "example"],
126
+ owner: "asj1834s",
127
+ read: ["admin"],
128
+ write: ["admin"],
91
129
  });
92
- const [monitoringSource] = useState<MonitoringSource>({
130
+ const [relation, setRelation] = useState<Relation>({
131
+ _id: "relation/1",
132
+ _from: "person/1",
133
+ _to: "org/1",
134
+ label: "相关人物/组织",
135
+ owner: "asj1834s",
136
+ read: ["admin"],
137
+ write: ["admin"],
138
+ });
139
+ const [monitoringSource, setMonitoringSource] = useState<MonitoringSource>({
93
140
  name: "Test Monitoring Source",
94
141
  description:
95
142
  "This is a test description for the monitoring source card. It should truncate after a certain point to avoid overflowing the card.",
96
143
  reliability: 75,
97
- owner: "test-owner",
144
+ owner: "asj1834s",
98
145
  });
99
- const [relation] = useState<Relation>({
100
- _id: "relation-1",
101
- _from: "person-1",
102
- _to: "org-1",
103
- label: "相关人物/组织",
146
+ const [insight, setInsight] = useState<OsintView>({
147
+ _id: "insight/1",
148
+ name: "My test analysis",
149
+ description: "Analysis description",
150
+ owner: "asj1834s",
151
+ read: ["admin"],
152
+ write: ["admin"],
104
153
  });
105
154
 
106
155
  const cardStyle = {
107
156
  height: 500,
108
- width: 400,
157
+ width: 500,
109
158
  display: "flex",
110
159
  alignItems: "center",
111
160
  justifyContent: "center",
112
161
  };
113
162
 
163
+ const handleSubmit = (data: any) => {
164
+ console.log("Submit:", data);
165
+ };
166
+
167
+ const handleUpdate = (setter: Function) => (data: any) => {
168
+ setter((prev: any) => ({ ...prev, ...data }));
169
+ };
170
+
171
+ const exitButton = (
172
+ <ActionIcon
173
+ variant="subtle"
174
+ color="gray"
175
+ onClick={(e) => {
176
+ e.stopPropagation();
177
+ }}
178
+ >
179
+ <ArrowRightIcon style={{ width: 18, height: 18 }} />
180
+ </ActionIcon>
181
+ );
182
+
114
183
  return (
115
184
  <>
116
185
  <Group>
@@ -128,135 +197,322 @@ function App() {
128
197
  >
129
198
  Toggle Theme
130
199
  </Button>
200
+ <Button onClick={() => setIsAdmin((p) => !p)}>Toggle Admin</Button>
131
201
  </Group>
132
202
  <ScrollArea style={{ height: "100vh" }}>
133
- <SimpleGrid
134
- cols={{ base: 1, sm: 2, md: 3, lg: 4, xl: 5 }}
135
- spacing="lg"
136
- p="lg"
137
- >
138
- <Card withBorder style={cardStyle}>
139
- <Text>Avatar List</Text>
140
- <AvatarRowList>
141
- <EventAvatar data={event} relation={relation} key={1} />
142
- <OrganizationAvatar
143
- data={organization}
144
- relation={relation}
145
- key={2}
146
- />
147
- <PersonAvatar data={person} relation={relation} key={3} />
148
- <SourceAvatar data={source} relation={relation} key={4} />
149
- <WebsiteAvatar data={website} relation={relation} key={5} />
203
+ <Stack p="lg" gap="lg">
204
+ <Text size="xl" fw={700}>
205
+ Original Components
206
+ </Text>
207
+ <SimpleGrid
208
+ cols={{ base: 1, sm: 2, md: 3, lg: 4, xl: 5 }}
209
+ spacing="lg"
210
+ >
211
+ <Card withBorder style={cardStyle}>
212
+ <Text>Avatar List</Text>
213
+ <AvatarRowList>
214
+ <EventAvatar data={event} relation={relation} key={1} />
215
+ <OrganizationAvatar
216
+ data={organization}
217
+ relation={relation}
218
+ key={2}
219
+ />
220
+ <PersonAvatar data={person} relation={relation} key={3} />
221
+ <SourceAvatar data={source} relation={relation} key={4} />
222
+ <WebsiteAvatar data={website} relation={relation} key={5} />
223
+ <EmptyAvatar />
224
+ </AvatarRowList>
225
+ </Card>
226
+ <Card withBorder style={cardStyle}>
227
+ <Text>Avatar Dropdown</Text>
228
+ <AvatarDropdown
229
+ avatarOnOpen={<Text>+</Text>}
230
+ avatarOnClose={<Text>-</Text>}
231
+ >
232
+ <SourceAvatar data={source} relation={relation} key={1} />
233
+ <SourceAvatar data={source} relation={relation} key={2} />
234
+ <SourceAvatar data={source} relation={relation} key={3} />
235
+ </AvatarDropdown>
236
+ </Card>
237
+ <Card withBorder style={cardStyle}>
238
+ <Text>Avatar Span</Text>
239
+ <AvatarSpan>
240
+ <EventAvatar data={event} relation={relation} key={1} />
241
+ <OrganizationAvatar
242
+ data={organization}
243
+ relation={relation}
244
+ key={2}
245
+ />
246
+ <PersonAvatar data={person} relation={relation} key={3} />
247
+ <SourceAvatar data={source} relation={relation} key={4} />
248
+ <WebsiteAvatar data={website} relation={relation} key={5} />
249
+ <EmptyAvatar />
250
+ </AvatarSpan>
251
+ </Card>
252
+
253
+ <Card withBorder style={cardStyle}>
254
+ <Text>Avatars: </Text>
150
255
  <EmptyAvatar />
151
- </AvatarRowList>
152
- </Card>
153
- <Card withBorder style={cardStyle}>
154
- <Text>Avatar Dropdown</Text>
155
- <AvatarDropdown
156
- avatarOnOpen={<Text>+</Text>}
157
- avatarOnClose={<Text>-</Text>}
158
- >
159
- <SourceAvatar data={source} relation={relation} key={1} />
160
- <SourceAvatar data={source} relation={relation} key={2} />
161
- <SourceAvatar data={source} relation={relation} key={3} />
162
- </AvatarDropdown>
163
- </Card>
164
- <Card withBorder style={cardStyle}>
165
- <Text>Avatar Span</Text>
166
- <AvatarSpan>
167
- <EventAvatar data={event} relation={relation} key={1} />
168
- <OrganizationAvatar
169
- data={organization}
170
- relation={relation}
171
- key={2}
256
+ <EventAvatar data={event} />
257
+ <OrganizationAvatar data={organization} />
258
+ <PersonAvatar data={person} />
259
+ <SourceAvatar data={source} />
260
+ <WebsiteAvatar data={website} />
261
+ </Card>
262
+
263
+ <Card withBorder style={cardStyle}>
264
+ <Text>Icons</Text>
265
+ <EventIcon event={event} />
266
+ <OrganizationIcon organization={organization} />
267
+ <PersonIcon person={person} />
268
+ <SourceIcon source={source} />
269
+ <WebsiteIcon website={website} />
270
+ </Card>
271
+
272
+ <Card withBorder style={cardStyle}>
273
+ <Text>Icon Select</Text>
274
+ <Text>Person:</Text>
275
+ <PersonIconSelect value={person} onChange={setPerson} />
276
+ <Text>Organization:</Text>
277
+ <OrganizationIconSelect
278
+ value={organization}
279
+ onChange={setOrganization}
172
280
  />
173
- <PersonAvatar data={person} relation={relation} key={3} />
174
- <SourceAvatar data={source} relation={relation} key={4} />
175
- <WebsiteAvatar data={website} relation={relation} key={5} />
176
- <EmptyAvatar />
177
- </AvatarSpan>
178
- </Card>
281
+ <Text>Event:</Text>
282
+ <EventIconSelect value={event} onChange={setEvent} />
283
+ <Text>Source:</Text>
284
+ <SourceIconSelect value={source} onChange={setSource} />
285
+ <Text>Website:</Text>
286
+ <WebsiteIconSelect value={website} onChange={setWebsite} />
287
+ </Card>
288
+ </SimpleGrid>
179
289
 
180
- <Card withBorder style={cardStyle}>
181
- <Text>Avatars: </Text>
182
- <EmptyAvatar />
183
- <EventAvatar data={event} />
184
- <OrganizationAvatar data={organization} />
185
- <PersonAvatar data={person} />
186
- <SourceAvatar data={source} />
187
- <WebsiteAvatar data={website} />
188
- </Card>
290
+ <Divider />
291
+ <Text size="xl" fw={700}>
292
+ Entity Cards
293
+ </Text>
294
+ <SimpleGrid
295
+ cols={{ base: 1, sm: 2, md: 3, lg: 4, xl: 5 }}
296
+ spacing="lg"
297
+ >
298
+ <EventCard
299
+ event={event}
300
+ action={
301
+ <ActionIcon
302
+ variant="subtle"
303
+ color="gray"
304
+ onClick={(e) => {
305
+ e.stopPropagation();
306
+ }}
307
+ >
308
+ <ArrowRightIcon style={{ width: 18, height: 18 }} />
309
+ </ActionIcon>
310
+ }
311
+ />
312
+ <PersonCard person={person} />
313
+ <OrganizationCard organization={organization} />
314
+ <SourceCard source={source} />
315
+ <WebsiteCard website={website} />
316
+ <MonitoringSourceCard monitoringSource={monitoringSource} />
189
317
 
190
- <Card withBorder style={cardStyle}>
191
- <Text>Icons</Text>
192
- <EventIcon event={event} />
193
- <OrganizationIcon organization={organization} />
194
- <PersonIcon person={person} />
195
- <SourceIcon source={source} />
196
- <WebsiteIcon website={website} />
197
- </Card>
318
+ <EventCard event={{}} />
319
+ <PersonCard person={{}} />
320
+ <OrganizationCard organization={{}} />
321
+ <SourceCard source={{}} />
322
+ <WebsiteCard website={{}} />
323
+ <MonitoringSourceCard monitoringSource={{ owner: "" }} />
324
+ </SimpleGrid>
198
325
 
199
- <Card withBorder style={cardStyle}>
200
- <Text>Icon Select</Text>
201
- <Text>Person:</Text>
202
- <PersonIconSelect value={person} onChange={setPerson} />
203
- <Text>Organization:</Text>
204
- <OrganizationIconSelect
205
- value={organization}
206
- onChange={setOrganization}
326
+ <Divider />
327
+
328
+ <Text size="xl" fw={700}>
329
+ Input Forms For Creation
330
+ </Text>
331
+ <SimpleGrid
332
+ cols={{ base: 1, sm: 2, md: 3, lg: 4, xl: 5 }}
333
+ spacing="lg"
334
+ >
335
+ <EventForm event={{}} onSubmit={handleSubmit} isAdmin={isAdmin} />
336
+ <InsightForm
337
+ insight={{}}
338
+ onSubmit={handleSubmit}
339
+ isAdmin={isAdmin}
340
+ />
341
+ <MonitoringSourceForm
342
+ source={{ owner: "" }}
343
+ onSubmit={handleSubmit}
344
+ />
345
+ <OrganizationForm
346
+ organization={{}}
347
+ onSubmit={handleSubmit}
348
+ isAdmin={isAdmin}
349
+ />
350
+ <PersonForm person={{}} onSubmit={handleSubmit} isAdmin={isAdmin} />
351
+ <RelationForm
352
+ relation={{ _from: "", _to: "" }}
353
+ onSubmit={handleSubmit}
354
+ isAdmin={isAdmin}
207
355
  />
208
- <Text>Event:</Text>
209
- <EventIconSelect value={event} onChange={setEvent} />
210
- <Text>Source:</Text>
211
- <SourceIconSelect value={source} onChange={setSource} />
212
- <Text>Website:</Text>
213
- <WebsiteIconSelect value={website} onChange={setWebsite} />
214
- </Card>
356
+ <SourceForm source={{}} onSubmit={handleSubmit} isAdmin={isAdmin} />
357
+ <WebsiteForm
358
+ website={{}}
359
+ onSubmit={handleSubmit}
360
+ isAdmin={isAdmin}
361
+ />
362
+ </SimpleGrid>
215
363
 
216
- <Card withBorder style={cardStyle}>
217
- <Text>Cards</Text>
218
- <ScrollArea w={350} h={400}>
219
- <Stack>
220
- <EventCard
221
- event={event}
222
- action={
223
- <ActionIcon
224
- variant="subtle"
225
- color="gray"
226
- onClick={(e) => {
227
- e.stopPropagation();
228
- }}
229
- >
230
- <ArrowRightIcon style={{ width: 18, height: 18 }} />
231
- </ActionIcon>
232
- }
233
- />
234
- <PersonCard person={person} />
235
- <OrganizationCard organization={organization} />
236
- <SourceCard source={source} />
237
- <WebsiteCard website={website} />
238
- </Stack>
239
- </ScrollArea>
240
- </Card>
364
+ <Divider />
365
+
366
+ <Text size="xl" fw={700}>
367
+ Forms Double Clickable To Update
368
+ </Text>
369
+ <SimpleGrid
370
+ cols={{ base: 1, sm: 2, md: 3, lg: 4, xl: 5 }}
371
+ spacing="lg"
372
+ >
373
+ <EventForm
374
+ event={event}
375
+ onUpdate={handleUpdate(setEvent)}
376
+ onUpdatePermissive={handleUpdate(setEvent)}
377
+ exitButton={exitButton}
378
+ isAdmin={isAdmin}
379
+ />
380
+ <InsightForm
381
+ insight={insight}
382
+ onUpdate={handleUpdate(setInsight)}
383
+ onUpdatePermissive={handleUpdate(setInsight)}
384
+ exitButton={exitButton}
385
+ isAdmin={isAdmin}
386
+ />
387
+ <MonitoringSourceForm
388
+ source={monitoringSource}
389
+ onUpdate={handleUpdate(setMonitoringSource)}
390
+ exitButton={exitButton}
391
+ />
392
+ <OrganizationForm
393
+ organization={organization}
394
+ onUpdate={handleUpdate(setOrganization)}
395
+ onUpdatePermissive={handleUpdate(setOrganization)}
396
+ exitButton={exitButton}
397
+ isAdmin={isAdmin}
398
+ />
399
+ <PersonForm
400
+ person={person}
401
+ onUpdate={handleUpdate(setPerson)}
402
+ onUpdatePermissive={handleUpdate(setPerson)}
403
+ exitButton={exitButton}
404
+ isAdmin={isAdmin}
405
+ />
406
+ <RelationForm
407
+ relation={relation}
408
+ onUpdate={handleUpdate(setRelation)}
409
+ onUpdatePermissive={handleUpdate(setRelation)}
410
+ exitButton={exitButton}
411
+ isAdmin={isAdmin}
412
+ />
413
+ <SourceForm
414
+ source={source}
415
+ onUpdate={handleUpdate(setSource)}
416
+ onUpdatePermissive={handleUpdate(setSource)}
417
+ exitButton={exitButton}
418
+ isAdmin={isAdmin}
419
+ />
420
+ <WebsiteForm
421
+ website={website}
422
+ onUpdate={handleUpdate(setWebsite)}
423
+ onUpdatePermissive={handleUpdate(setWebsite)}
424
+ exitButton={exitButton}
425
+ isAdmin={isAdmin}
426
+ />
427
+ </SimpleGrid>
241
428
 
242
- <Card withBorder style={cardStyle}>
243
- <Text>Empty Cards</Text>
244
- <ScrollArea w={350} h={400}>
245
- <Stack>
246
- <EventCard event={{}} />
247
- <PersonCard person={{}} />
248
- <OrganizationCard organization={{}} />
249
- <SourceCard source={{}} />
250
- <WebsiteCard website={{}} />
251
- <MonitoringSourceCard monitoringSource={{ owner: "" }} />
252
- </Stack>
253
- </ScrollArea>
254
- </Card>
429
+ <Divider />
255
430
 
256
- <Card withBorder style={cardStyle}>
257
- <MonitoringSourceCard monitoringSource={monitoringSource} />
258
- </Card>
259
- </SimpleGrid>
431
+ <Text size="xl" fw={700}>
432
+ Read Only Forms
433
+ </Text>
434
+ <SimpleGrid
435
+ cols={{ base: 1, sm: 2, md: 3, lg: 4, xl: 5 }}
436
+ spacing="lg"
437
+ >
438
+ <EventForm
439
+ event={event}
440
+ sources={[source, source2]}
441
+ exitButton={exitButton}
442
+ isAdmin={isAdmin}
443
+ />
444
+ <InsightForm
445
+ insight={insight}
446
+ exitButton={exitButton}
447
+ isAdmin={isAdmin}
448
+ />
449
+ <MonitoringSourceForm
450
+ source={monitoringSource}
451
+ exitButton={exitButton}
452
+ />
453
+ <OrganizationForm
454
+ organization={organization}
455
+ exitButton={exitButton}
456
+ isAdmin={isAdmin}
457
+ />
458
+ <PersonForm
459
+ person={person}
460
+ exitButton={exitButton}
461
+ isAdmin={isAdmin}
462
+ />
463
+ <RelationForm
464
+ relation={relation}
465
+ exitButton={exitButton}
466
+ isAdmin={isAdmin}
467
+ />
468
+ <SourceForm source={source} exitButton={exitButton} />
469
+ <WebsiteForm
470
+ website={website}
471
+ exitButton={exitButton}
472
+ isAdmin={isAdmin}
473
+ />
474
+ </SimpleGrid>
475
+
476
+ <Divider />
477
+
478
+ <Text size="xl" fw={700}>
479
+ Borderless Read Only Forms
480
+ </Text>
481
+ <SimpleGrid
482
+ cols={{ base: 1, sm: 2, md: 3, lg: 4, xl: 5 }}
483
+ spacing="lg"
484
+ >
485
+ <EventForm
486
+ event={event}
487
+ style={{ border: "none", boxShadow: "none", padding: 0 }}
488
+ isAdmin={isAdmin}
489
+ />
490
+ <OrganizationForm
491
+ organization={organization}
492
+ style={{ border: "none", boxShadow: "none", padding: 0 }}
493
+ isAdmin={isAdmin}
494
+ />
495
+ <PersonForm
496
+ person={person}
497
+ style={{ border: "none", boxShadow: "none", padding: 0 }}
498
+ isAdmin={isAdmin}
499
+ />
500
+ <RelationForm
501
+ relation={relation}
502
+ style={{ border: "none", boxShadow: "none", padding: 0 }}
503
+ isAdmin={isAdmin}
504
+ />
505
+ <SourceForm
506
+ source={source}
507
+ style={{ border: "none", boxShadow: "none", padding: 0 }}
508
+ />
509
+ <WebsiteForm
510
+ website={website}
511
+ style={{ border: "none", boxShadow: "none", padding: 0 }}
512
+ isAdmin={isAdmin}
513
+ />
514
+ </SimpleGrid>
515
+ </Stack>
260
516
  </ScrollArea>
261
517
  </>
262
518
  );