@arpproject/recrate 0.1.7 → 0.1.8

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 (188) hide show
  1. package/dist/index.d.ts +3 -2
  2. package/dist/recrate.css +4 -4
  3. package/dist/recrate.es.js +34674 -114061
  4. package/package.json +41 -32
  5. package/.eslintrc.json +0 -37
  6. package/.storybook/main.ts +0 -40
  7. package/.storybook/preview.tsx +0 -46
  8. package/babel.config.json +0 -5
  9. package/docker-compose.yml +0 -30
  10. package/docs/.nojekyll +0 -1
  11. package/docs/assets/highlight.css +0 -99
  12. package/docs/assets/icons.js +0 -18
  13. package/docs/assets/icons.svg +0 -1
  14. package/docs/assets/main.js +0 -60
  15. package/docs/assets/navigation.js +0 -1
  16. package/docs/assets/search.js +0 -1
  17. package/docs/assets/style.css +0 -1448
  18. package/docs/classes/src_crate_builder_CrateManager_crate_manager.CrateManager.html +0 -240
  19. package/docs/classes/src_crate_builder_CrateManager_profile_manager.ProfileManager.html +0 -42
  20. package/docs/classes/src_crate_builder_editor_state.EditorState.html +0 -28
  21. package/docs/classes/src_crate_builder_types.CrateManagerType.html +0 -57
  22. package/docs/classes/src_crate_builder_types.ProfileManagerType.html +0 -13
  23. package/docs/functions/src_crate_builder_CrateManager_lib.isURL.html +0 -2
  24. package/docs/functions/src_crate_builder_CrateManager_lib.mintNewCrate.html +0 -3
  25. package/docs/functions/src_crate_builder_CrateManager_lib.normalise.html +0 -5
  26. package/docs/functions/src_crate_builder_CrateManager_lib.normaliseEntityType.html +0 -1
  27. package/docs/index.html +0 -58
  28. package/docs/interfaces/src_crate_builder_types.NormalisedCrate.html +0 -3
  29. package/docs/interfaces/src_crate_builder_types.NormalisedEntityDefinition.html +0 -4
  30. package/docs/interfaces/src_crate_builder_types.NormalisedProfile.html +0 -9
  31. package/docs/interfaces/src_crate_builder_types.ProfileLayout.html +0 -2
  32. package/docs/interfaces/src_crate_builder_types.ProfileLayoutGroup.html +0 -9
  33. package/docs/interfaces/src_crate_builder_types.UnverifiedCrate.html +0 -3
  34. package/docs/interfaces/src_crate_builder_types.UnverifiedEntityDefinition.html +0 -4
  35. package/docs/modules/src_crate_builder_CrateManager_crate_manager.html +0 -2
  36. package/docs/modules/src_crate_builder_CrateManager_lib.html +0 -6
  37. package/docs/modules/src_crate_builder_CrateManager_profile_manager.html +0 -2
  38. package/docs/modules/src_crate_builder_editor_state.html +0 -2
  39. package/docs/modules/src_crate_builder_types.html +0 -16
  40. package/docs/types/src_crate_builder_types.EntityReference.html +0 -1
  41. package/docs/types/src_crate_builder_types.NormalisedContext.html +0 -1
  42. package/docs/types/src_crate_builder_types.PrimitiveType.html +0 -1
  43. package/docs/types/src_crate_builder_types.ProfileAssociation.html +0 -1
  44. package/docs/types/src_crate_builder_types.ProfileInput.html +0 -1
  45. package/docs/types/src_crate_builder_types.UnverifiedContext.html +0 -1
  46. package/docs/variables/src_crate_builder_CrateManager_lib.urlProtocols.html +0 -1
  47. package/index.html +0 -13
  48. package/load-data-packs.cjs +0 -38
  49. package/postcss.config.cjs +0 -6
  50. package/public/favicon.ico +0 -0
  51. package/public/index.html +0 -43
  52. package/public/logo192.png +0 -0
  53. package/public/logo512.png +0 -0
  54. package/public/manifest.json +0 -25
  55. package/public/marker-icon.png +0 -0
  56. package/public/marker-shadow.png +0 -0
  57. package/public/robots.txt +0 -3
  58. package/react-app-env.d.ts +0 -1
  59. package/rollup.config.js +0 -26
  60. package/src/app/App.tsx +0 -13
  61. package/src/app/EmbeddedComponent.tsx +0 -432
  62. package/src/app/index.html +0 -20
  63. package/src/app/index.tsx +0 -19
  64. package/src/app/lookup.ts +0 -141
  65. package/src/app/override-styles.css +0 -96
  66. package/src/crate-builder/CrateManager/contexts/1.1-context.jsonld +0 -2660
  67. package/src/crate-builder/CrateManager/contexts/1.2-DRAFT-context.jsonld +0 -2918
  68. package/src/crate-builder/CrateManager/contexts.ts +0 -42
  69. package/src/crate-builder/CrateManager/crate-manager-benchmarking.spec.ts +0 -31
  70. package/src/crate-builder/CrateManager/crate-manager-loading-exporting.spec.ts +0 -431
  71. package/src/crate-builder/CrateManager/crate-manager-operations.spec.ts +0 -298
  72. package/src/crate-builder/CrateManager/crate-manager.spec.ts +0 -2336
  73. package/src/crate-builder/CrateManager/crate-manager.ts +0 -2111
  74. package/src/crate-builder/CrateManager/lib.spec.ts +0 -133
  75. package/src/crate-builder/CrateManager/lib.ts +0 -170
  76. package/src/crate-builder/CrateManager/profile-manager.spec.ts +0 -593
  77. package/src/crate-builder/CrateManager/profile-manager.ts +0 -367
  78. package/src/crate-builder/CrateManager/schema-type-definitions.json +0 -35122
  79. package/src/crate-builder/CrateManager/validate-identifier.spec.ts +0 -82
  80. package/src/crate-builder/CrateManager/validate-identifier.ts +0 -65
  81. package/src/crate-builder/RenderEntity/Add.tsx +0 -249
  82. package/src/crate-builder/RenderEntity/AddControl.stories.tsx +0 -126
  83. package/src/crate-builder/RenderEntity/AddControl.tsx +0 -84
  84. package/src/crate-builder/RenderEntity/AutoComplete.tsx +0 -215
  85. package/src/crate-builder/RenderEntity/BulkAdd.tsx +0 -136
  86. package/src/crate-builder/RenderEntity/DeleteProperty.tsx +0 -33
  87. package/src/crate-builder/RenderEntity/DialogAddProperty.tsx +0 -83
  88. package/src/crate-builder/RenderEntity/DialogBrowseEntities.tsx +0 -136
  89. package/src/crate-builder/RenderEntity/DialogEditContext.tsx +0 -107
  90. package/src/crate-builder/RenderEntity/DialogPreviewCrate.tsx +0 -54
  91. package/src/crate-builder/RenderEntity/DialogSaveCrateAsTemplate.tsx +0 -65
  92. package/src/crate-builder/RenderEntity/DialogSaveEntityTemplate.tsx +0 -87
  93. package/src/crate-builder/RenderEntity/DisplayPropertyName.stories.tsx +0 -30
  94. package/src/crate-builder/RenderEntity/DisplayPropertyName.tsx +0 -21
  95. package/src/crate-builder/RenderEntity/EntityId.tsx +0 -75
  96. package/src/crate-builder/RenderEntity/EntityName.tsx +0 -49
  97. package/src/crate-builder/RenderEntity/EntityProperty.tsx +0 -188
  98. package/src/crate-builder/RenderEntity/EntityPropertyInstance.tsx +0 -255
  99. package/src/crate-builder/RenderEntity/EntityType.tsx +0 -95
  100. package/src/crate-builder/RenderEntity/ItemLink.tsx +0 -37
  101. package/src/crate-builder/RenderEntity/PaginateLinkedEntities.stories.tsx +0 -43
  102. package/src/crate-builder/RenderEntity/PaginateLinkedEntities.tsx +0 -141
  103. package/src/crate-builder/RenderEntity/PropertyHelp.tsx +0 -39
  104. package/src/crate-builder/RenderEntity/RenderControls.tsx +0 -278
  105. package/src/crate-builder/RenderEntity/RenderLinkedItem.tsx +0 -139
  106. package/src/crate-builder/RenderEntity/RenderPropertyHelp.tsx +0 -41
  107. package/src/crate-builder/RenderEntity/RenderReverseConnections.tsx +0 -150
  108. package/src/crate-builder/RenderEntity/RenderTypes.tsx +0 -102
  109. package/src/crate-builder/RenderEntity/Shell2.tsx +0 -576
  110. package/src/crate-builder/RenderEntity/UnlinkEntity.tsx +0 -30
  111. package/src/crate-builder/RenderEntity/auto-complete.lib.ts +0 -184
  112. package/src/crate-builder/RenderEntity/keys.ts +0 -4
  113. package/src/crate-builder/RenderEntity/layout.spec.js +0 -593
  114. package/src/crate-builder/RenderEntity/layout.ts +0 -220
  115. package/src/crate-builder/Shell.tsx +0 -337
  116. package/src/crate-builder/component.css +0 -65
  117. package/src/crate-builder/editor-state.ts +0 -114
  118. package/src/crate-builder/emotionCache.ts +0 -8
  119. package/src/crate-builder/helpers.ts +0 -16
  120. package/src/crate-builder/i18n.ts +0 -22
  121. package/src/crate-builder/lib/validate-iri.js +0 -69
  122. package/src/crate-builder/lib/validate-iri.ts +0 -57
  123. package/src/crate-builder/locales/en.js +0 -149
  124. package/src/crate-builder/locales/hu.js +0 -147
  125. package/src/crate-builder/primitives/Boolean.stories.tsx +0 -33
  126. package/src/crate-builder/primitives/Boolean.tsx +0 -67
  127. package/src/crate-builder/primitives/Date.stories.tsx +0 -32
  128. package/src/crate-builder/primitives/Date.tsx +0 -58
  129. package/src/crate-builder/primitives/DateTime.stories.tsx +0 -32
  130. package/src/crate-builder/primitives/DateTime.tsx +0 -64
  131. package/src/crate-builder/primitives/Geo.stories.tsx +0 -57
  132. package/src/crate-builder/primitives/Geo.tsx +0 -225
  133. package/src/crate-builder/primitives/Map.SelectArea.js +0 -359
  134. package/src/crate-builder/primitives/Map.stories.tsx +0 -61
  135. package/src/crate-builder/primitives/Map.tsx +0 -124
  136. package/src/crate-builder/primitives/Number.stories.tsx +0 -74
  137. package/src/crate-builder/primitives/Number.tsx +0 -166
  138. package/src/crate-builder/primitives/Select.stories.tsx +0 -66
  139. package/src/crate-builder/primitives/Select.tsx +0 -121
  140. package/src/crate-builder/primitives/SelectObject.stories.tsx +0 -29
  141. package/src/crate-builder/primitives/SelectObject.tsx +0 -105
  142. package/src/crate-builder/primitives/SelectUrl.stories.tsx +0 -42
  143. package/src/crate-builder/primitives/SelectUrl.tsx +0 -110
  144. package/src/crate-builder/primitives/Text.stories.tsx +0 -106
  145. package/src/crate-builder/primitives/Text.tsx +0 -197
  146. package/src/crate-builder/primitives/Time.stories.tsx +0 -38
  147. package/src/crate-builder/primitives/Time.tsx +0 -71
  148. package/src/crate-builder/primitives/Url.stories.tsx +0 -43
  149. package/src/crate-builder/primitives/Url.tsx +0 -75
  150. package/src/crate-builder/primitives/Value.stories.tsx +0 -37
  151. package/src/crate-builder/primitives/Value.tsx +0 -30
  152. package/src/crate-builder/primitives/date-libs.ts +0 -12
  153. package/src/crate-builder/profile-schema.json +0 -145
  154. package/src/crate-builder/property-definitions.ts +0 -78
  155. package/src/crate-builder/recrate.css +0 -3
  156. package/src/crate-builder/store.ts +0 -14
  157. package/src/crate-builder/tailwind.css +0 -5
  158. package/src/crate-builder/types.d.ts +0 -318
  159. package/src/examples/collection/collections-entity-example.json +0 -131
  160. package/src/examples/collection/crate-builder-entity-example.json +0 -33
  161. package/src/examples/item/complex-collection/ro-crate-metadata.json +0 -174
  162. package/src/examples/item/complex-item/ro-crate-metadata.json +0 -769
  163. package/src/examples/item/crate-with-language.json +0 -38
  164. package/src/examples/item/empty/ro-crate-metadata.json +0 -20
  165. package/src/examples/item/item-with-relationship-and-action/ro-crate-metadata.json +0 -66
  166. package/src/examples/item/large-crate/ro-crate-metadata.json +0 -5762
  167. package/src/examples/item/multiple-types/ro-crate-metadata.json +0 -20
  168. package/src/examples/item/ridiculously-big-collection/ro-crate-metadata.json +0 -162977
  169. package/src/examples/profile/aroma.complex.profile.json +0 -11098
  170. package/src/examples/profile/aroma.profile.json +0 -9158
  171. package/src/examples/profile/nyingarn-item-profile.json +0 -426
  172. package/src/examples/profile/profile-to-test-inverse-associations.json +0 -73
  173. package/src/examples/profile/profile-to-test-multiple-types.json +0 -31
  174. package/src/examples/profile/profile-with-all-primitives-and-groups.json +0 -207
  175. package/src/examples/profile/profile-with-all-primitives.json +0 -244
  176. package/src/examples/profile/profile-with-constraints.json +0 -446
  177. package/src/examples/profile/profile-with-resolve.json +0 -57
  178. package/src/examples/profile/vocabulary-creation-profile.json +0 -231
  179. package/src/images.d.ts +0 -5
  180. package/src/index.ts +0 -12
  181. package/src/types.ts +0 -104
  182. package/tailwind.config.js +0 -21
  183. package/tsconfig.app.json +0 -31
  184. package/tsconfig.json +0 -26
  185. package/typedoc.json +0 -11
  186. package/update-deps.sh +0 -4
  187. package/vite-env.d.ts +0 -1
  188. package/vite.config.ts +0 -46
@@ -1,67 +0,0 @@
1
- import React, { useState, useEffect } from 'react';
2
- import { Switch, Form} from 'antd'
3
- import { useTranslation } from 'react-i18next';
4
- import { debounce } from 'lodash';
5
-
6
- export interface BooleanProps {
7
- property: string;
8
- value?: boolean;
9
- onSaveProperty: (data: { property: string; value: boolean }) => void;
10
- }
11
-
12
- const Boolean: React.FC<BooleanProps> = ({ property, value = false, onSaveProperty }) => {
13
- // Add try-catch to handle the case when i18n is not available (like in Storybook)
14
- let t: (key: string) => string;
15
- try {
16
- const i18n = useTranslation();
17
- t = i18n.t;
18
- } catch (e) {
19
- // Fallback translation function if i18n is not available
20
- t = (key: string) => key === 'true_label' ? 'True' : 'False';
21
- }
22
-
23
- const [internalValue, setInternalValue] = useState<boolean>(value);
24
-
25
- // Update internal value when prop value changes
26
- useEffect(() => {
27
- setInternalValue(value);
28
- }, [value]);
29
-
30
- // Create debounced save function
31
- const debouncedSave = React.useCallback(
32
- debounce((newValue: boolean) => {
33
- onSaveProperty({
34
- property,
35
- value: newValue
36
- });
37
- }, 200),
38
- [property, onSaveProperty]
39
- );
40
-
41
- // Handle change
42
- const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {
43
- const newValue = event.target.checked;
44
- setInternalValue(newValue);
45
- debouncedSave(newValue);
46
- };
47
-
48
- return (
49
- <div className="flex flex-col describo-property-type-boolean">
50
- <div className="flex flex-row space-x-2">
51
- <Form.Item
52
- label={internalValue ? t('true_label') : t('false_label')}
53
- >
54
- <Switch
55
- checked={internalValue}
56
- onChange={(checked: boolean) => {
57
- handleChange({ target: { checked } } as React.ChangeEvent<HTMLInputElement>);
58
- }}
59
- size="default"
60
- />
61
- </Form.Item>
62
- </div>
63
- </div>
64
- );
65
- };
66
-
67
- export default Boolean;
@@ -1,32 +0,0 @@
1
- import React from 'react';
2
- import { StoryFn, Meta } from '@storybook/react';
3
- import DateComponent from './Date';
4
- import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';
5
- import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';
6
-
7
- export default {
8
- title: 'Primitives/Date',
9
- component: DateComponent,
10
- argTypes: {
11
- value: {
12
- options: ['2022-03-02', '2022-09-28T02:20:56.521', new Date().toISOString()],
13
- control: { type: 'radio' }
14
- },
15
- onSaveProperty: { action: 'saveProperty' }
16
- },
17
- decorators: [
18
- (Story) => (
19
- <LocalizationProvider dateAdapter={AdapterDayjs}>
20
- <Story />
21
- </LocalizationProvider>
22
- )
23
- ]
24
- } as Meta<typeof DateComponent>;
25
-
26
- const Template: StoryFn<typeof DateComponent> = (args) => <DateComponent {...args} />;
27
-
28
- export const Default = Template.bind({});
29
- Default.args = {
30
- property: 'date',
31
- value: '2022-03-02'
32
- };
@@ -1,58 +0,0 @@
1
- import React, { useState, useEffect } from 'react';
2
- import { DatePicker } from 'antd';
3
- import dayjs from 'dayjs';
4
- import { useTranslation } from 'react-i18next';
5
- import { checkDateIsValid } from './date-libs';
6
-
7
- export interface DateProps {
8
- property: string;
9
- value?: string;
10
- onSaveProperty: (data: { property: string; value: string }) => void;
11
- }
12
-
13
- const DateComponent: React.FC<DateProps> = ({
14
- property,
15
- value,
16
- onSaveProperty
17
- }) => {
18
- const { t } = useTranslation();
19
- const [internalValue, setInternalValue] = useState<dayjs.Dayjs | null>(
20
- value ? dayjs(value) : null
21
- );
22
- const [isValidDate, setIsValidDate] = useState<boolean>(checkDateIsValid(value));
23
-
24
- useEffect(() => {
25
- setInternalValue(value ? dayjs(value) : null);
26
- setIsValidDate(checkDateIsValid(value));
27
- }, [value]);
28
-
29
- const handleDateChange = (newValue: dayjs.Dayjs | null, dateString: string | string[]) => {
30
- setInternalValue(newValue);
31
- if (newValue && checkDateIsValid(newValue.toString())) {
32
- onSaveProperty({
33
- property,
34
- value: newValue.startOf('day').toISOString()
35
- });
36
- }
37
- };
38
-
39
- return (
40
- <div className="flex flex-col describo-property-type-date">
41
- <DatePicker
42
- value={internalValue}
43
- onChange={handleDateChange}
44
- format="YYYY-MM-DD"
45
- placeholder={t('pick_a_date') || 'Pick a date'}
46
- size="middle"
47
- allowClear={true}
48
- />
49
- {!isValidDate && (
50
- <span style={{ color: 'red', fontSize: '0.875rem' }}>
51
- {t('invalid_date_value', { value })}
52
- </span>
53
- )}
54
- </div>
55
- );
56
- };
57
-
58
- export default DateComponent;
@@ -1,32 +0,0 @@
1
- import React from 'react';
2
- import { StoryFn, Meta } from '@storybook/react';
3
- import DateTimeComponent from './DateTime';
4
- import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';
5
- import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';
6
-
7
- export default {
8
- title: 'Primitives/DateTime',
9
- component: DateTimeComponent,
10
- argTypes: {
11
- value: {
12
- options: ['2022-03-02', '2022-09-28T02:20:56.521', new Date().toISOString()],
13
- control: { type: 'radio' }
14
- },
15
- onSaveProperty: { action: 'saveProperty' }
16
- },
17
- decorators: [
18
- (Story) => (
19
- <LocalizationProvider dateAdapter={AdapterDayjs}>
20
- <Story />
21
- </LocalizationProvider>
22
- )
23
- ]
24
- } as Meta<typeof DateTimeComponent>;
25
-
26
- const Template: StoryFn<typeof DateTimeComponent> = (args) => <DateTimeComponent {...args} />;
27
-
28
- export const Default = Template.bind({});
29
- Default.args = {
30
- property: 'date',
31
- value: '2022-03-02'
32
- };
@@ -1,64 +0,0 @@
1
- import React, { useState, useEffect } from 'react';
2
- import { DatePicker } from 'antd';
3
- import dayjs from 'dayjs';
4
- import { useTranslation } from 'react-i18next';
5
- import { checkDateIsValid } from './date-libs';
6
-
7
- export interface DateTimeProps {
8
- property: string;
9
- value?: string;
10
- onSaveProperty: (data: { property: string; value: string }) => void;
11
- }
12
-
13
- const DateTimeComponent: React.FC<DateTimeProps> = ({
14
- property,
15
- value,
16
- onSaveProperty
17
- }) => {
18
- const { t } = useTranslation();
19
- const [internalValue, setInternalValue] = useState<dayjs.Dayjs | null>(
20
- value ? dayjs(value) : null
21
- );
22
- const [isValidDate, setIsValidDate] = useState<boolean>(checkDateIsValid(value));
23
-
24
- useEffect(() => {
25
- setInternalValue(value ? dayjs(value) : null);
26
- setIsValidDate(checkDateIsValid(value));
27
- }, [value]);
28
-
29
- const handleDateTimeChange = (newValue: dayjs.Dayjs | null, dateString: string | string[]) => {
30
- setInternalValue(newValue);
31
- try {
32
- if (newValue && checkDateIsValid(newValue.toString())) {
33
- onSaveProperty({
34
- property,
35
- value: newValue.toISOString()
36
- });
37
- setIsValidDate(true);
38
- }
39
- } catch (error) {
40
- setIsValidDate(false);
41
- }
42
- };
43
-
44
- return (
45
- <div className="flex flex-col w-full describo-property-type-datetime">
46
- <DatePicker
47
- showTime
48
- value={internalValue}
49
- onChange={handleDateTimeChange}
50
- format="YYYY-MM-DD HH:mm:ss"
51
- placeholder={t('pick_a_datetime') || 'Pick a date and time'}
52
- style={{ width: '100%' }}
53
- size="middle"
54
- />
55
- {!isValidDate && (
56
- <span style={{ color: 'red', fontSize: '12px' }}>
57
- {t('invalid_datetime_value', { value })}
58
- </span>
59
- )}
60
- </div>
61
- );
62
- };
63
-
64
- export default DateTimeComponent;
@@ -1,57 +0,0 @@
1
- import React from 'react';
2
- import { StoryFn, Meta } from '@storybook/react';
3
- import Geo from './Geo';
4
- import { CrateManagerContext } from '../Shell';
5
-
6
- export default {
7
- title: 'Primitives/Geo',
8
- component: Geo,
9
- parameters: {
10
- layout: 'centered',
11
- },
12
- } as Meta<typeof Geo>;
13
-
14
- const mockEntities = [
15
- {
16
- '@id': 'geo_1',
17
- '@type': 'GeoCoordinates',
18
- name: 'Test Location',
19
- geojson: {
20
- type: 'Feature',
21
- geometry: {
22
- type: 'Point',
23
- coordinates: [144.9631, -37.8136],
24
- },
25
- },
26
- },
27
- ];
28
-
29
- const mockCrateManager = {
30
- getEntities: ({ limit, type }: { limit?: number; type?: string }) => {
31
- // Only return mockEntities if type matches
32
- if (!type || type === 'GeoCoordinates') return mockEntities;
33
- return [];
34
- },
35
- addBlankNode: (type: string) => ({ '@id': 'blank_node', '@type': type }),
36
- deleteEntity: ({ id }: { id: string }) => {},
37
- };
38
-
39
- const Template: StoryFn<typeof Geo> = (args) => (
40
- <CrateManagerContext.Provider value={mockCrateManager}>
41
- <Geo {...args} />
42
- </CrateManagerContext.Provider>
43
- );
44
-
45
- export const Default = Template.bind({});
46
- Default.args = {
47
- property: 'location',
48
- onCreateEntity: (data) => console.log('Create entity:', data),
49
- onLinkEntity: (data) => console.log('Link entity:', data),
50
- };
51
-
52
- export const WithExistingEntities = Template.bind({});
53
- WithExistingEntities.args = {
54
- property: 'location',
55
- onCreateEntity: (data) => console.log('Create entity:', data),
56
- onLinkEntity: (data) => console.log('Link entity:', data),
57
- };
@@ -1,225 +0,0 @@
1
- import React, { useContext, useEffect, useRef, useState } from "react";
2
- import {
3
- Divider,
4
- Form,
5
- Input,
6
- Select,
7
- Radio,
8
- Typography
9
- } from "antd";
10
- import L from "leaflet";
11
- import "leaflet/dist/leaflet.css";
12
- import AreaSelectInit from "./Map.SelectArea.js";
13
- import { geojsonToWKT } from "@terraformer/wkt";
14
- import flattenDeep from "lodash/flattenDeep";
15
- import { CrateManagerContext } from '../Shell';
16
-
17
- import icon from "leaflet/dist/images/marker-icon.png";
18
- import iconShadow from "leaflet/dist/images/marker-shadow.png";
19
-
20
- L.Marker.prototype.options.icon = L.icon({
21
- iconUrl: icon,
22
- shadowUrl: iconShadow,
23
- });
24
-
25
- AreaSelectInit(L);
26
-
27
- type LeafletMapWithSelectArea = L.Map & { selectArea?: any };
28
-
29
- const GeoInputComponent = ({
30
- property,
31
- onCreateEntity,
32
- onLinkEntity,
33
- }: {
34
- property: string;
35
- onCreateEntity: (args: { property: string; json: any }) => void;
36
- onLinkEntity: (args: { property: string; json: any }) => void;
37
- }) => {
38
- const mapRef = useRef<LeafletMapWithSelectArea | null>(null);
39
- const [mode, setMode] = useState("box");
40
- const [locationName, setLocationName] = useState("");
41
- const [feature, setFeature] = useState<any>(null);
42
- const [existingEntities, setExistingEntities] = useState<any[]>([]);
43
- const [selectValue, setSelectValue] = useState("");
44
- const locationNameRef = useRef(locationName);
45
-
46
- const crateManager = useContext(CrateManagerContext);
47
-
48
- useEffect(() => {
49
- mapRef.current = L.map("map", {
50
- center: [0, 0],
51
- zoom: 1,
52
- });
53
-
54
- init();
55
-
56
- return () => {
57
- mapRef.current?.off();
58
- mapRef.current?.remove();
59
- };
60
- }, []);
61
-
62
- useEffect(() => {
63
- updateHandlers();
64
- }, [mode]);
65
-
66
- useEffect(() => {
67
- locationNameRef.current = locationName;
68
- }, [locationName]);
69
-
70
- const init = async () => {
71
- await loadGeoDataInCrate();
72
-
73
- L.tileLayer(
74
- "https://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer/tile/{z}/{y}/{x}",
75
- {
76
- attribution:
77
- "Tiles © Esri — Source: Esri, DeLorme, NAVTEQ, USGS, Intermap, iPC, NRCAN, Esri Japan, METI, Esri China (Hong Kong), Esri (Thailand), TomTom, 2012",
78
- minZoom: 1,
79
- maxZoom: 16,
80
- }
81
- ).addTo(mapRef.current!);
82
-
83
- // Let Leaflet fully mount and register `selectArea`
84
- setTimeout(() => updateHandlers(), 200);
85
- };
86
-
87
- const loadGeoDataInCrate = () => {
88
- const geometryClasses = ["Geo", "Geomtery", "GeoShape", "GeoCoordinates"];
89
- let geos = geometryClasses.map((g) => [
90
- ...crateManager.getEntities({ limit: 5, type: g }),
91
- ]);
92
- setExistingEntities(flattenDeep(geos));
93
- };
94
-
95
- const updateHandlers = () => {
96
- if (!mapRef.current) return;
97
- if (!(mapRef.current as LeafletMapWithSelectArea).selectArea) return;
98
-
99
- if (mode === "box") {
100
- mapRef.current.off("click");
101
- (mapRef.current as LeafletMapWithSelectArea).selectArea.enable();
102
- (mapRef.current as LeafletMapWithSelectArea).selectArea.setShiftKey(true);
103
- mapRef.current.on("areaselected", handleAreaSelect);
104
- } else {
105
- (mapRef.current as LeafletMapWithSelectArea).selectArea.disable();
106
- mapRef.current.off("areaselected");
107
- mapRef.current.on("click", handlePointSelect);
108
- }
109
- };
110
-
111
- const handleAreaSelect = (e: any) => {
112
- const bounds = e.bounds;
113
- const geoJSON = {
114
- type: "Feature",
115
- geometry: {
116
- type: "Polygon",
117
- coordinates: [[
118
- [bounds.getNorthEast().lng, bounds.getNorthEast().lat],
119
- [bounds.getSouthEast().lng, bounds.getSouthEast().lat],
120
- [bounds.getSouthWest().lng, bounds.getSouthWest().lat],
121
- [bounds.getNorthWest().lng, bounds.getNorthWest().lat],
122
- ]],
123
- },
124
- };
125
- const entity = { "@type": "GeoShape", geojson: geoJSON };
126
- setFeature(entity);
127
- emitFeature(entity);
128
- };
129
-
130
- const handlePointSelect = (e: any) => {
131
- const latlng = e.latlng;
132
- const geoJSON = {
133
- type: "Feature",
134
- geometry: {
135
- type: "Point",
136
- coordinates: [latlng.lng, latlng.lat],
137
- },
138
- };
139
- const entity = { "@type": "GeoCoordinates", geojson: geoJSON };
140
- setFeature(entity);
141
- emitFeature(entity);
142
- };
143
-
144
- const emitFeature = (feat: any) => {
145
- let node = crateManager.addBlankNode("Geometry");
146
- let entity = {
147
- ...node,
148
- name: locationNameRef.current,
149
- geojson: JSON.stringify(feat.geojson),
150
- asWKT: geojsonToWKT(feat.geojson.geometry),
151
- };
152
- crateManager.deleteEntity({ id: node["@id"] });
153
- onCreateEntity({ property, json: entity });
154
- };
155
-
156
- const handleSelectChange = (value: string) => {
157
- setSelectValue(value);
158
- const entity = existingEntities.find((e) => e["@id"] === value);
159
- onLinkEntity({ property, json: entity });
160
- };
161
-
162
- return (
163
- <div className="flex flex-col text-gray-600 describo-property-type-geo">
164
- <div className="flex flex-col space-y-4">
165
- {existingEntities.length > 0 && (
166
- <>
167
- <Typography.Title level={5}>Select Existing Location</Typography.Title>
168
- <Form.Item label="Select">
169
- <Select
170
- value={selectValue}
171
- onChange={handleSelectChange}
172
- style={{ width: '100%' }}
173
- >
174
- {existingEntities.map((entity) => (
175
- <Select.Option key={entity["@id"]} value={entity["@id"]}>
176
- {entity.name}
177
- </Select.Option>
178
- ))}
179
- </Select>
180
- </Form.Item>
181
- <Divider className="border border-gray-400" />
182
- </>
183
- )}
184
-
185
- <div className="flex flex-col space-y-2">
186
- <Typography.Title level={5}>Define Location</Typography.Title>
187
- <Input
188
- size="middle"
189
- placeholder="Provide name for location"
190
- value={locationName}
191
- onChange={(e) => setLocationName(e.target.value)}
192
- />
193
-
194
- <div className="flex flex-row space-x-4">
195
- <Radio.Group
196
- value={mode}
197
- onChange={(e) => {
198
- setMode(e.target.value);
199
- updateHandlers();
200
- }}
201
- >
202
- <Radio value="box">Select Region</Radio>
203
- <Radio value="point">Select Point</Radio>
204
- </Radio.Group>
205
-
206
- {mode === "box" && (
207
- <Typography.Text className="pt-1 text-gray-600">
208
- Press Shift and drag to select region
209
- </Typography.Text>
210
- )}
211
- {mode === "point" && (
212
- <Typography.Text className="pt-1 text-gray-600">
213
- Click on map to select point
214
- </Typography.Text>
215
- )}
216
- </div>
217
- </div>
218
-
219
- <div id="map" className="map-style" style={{ width: 700, height: 500 }}></div>
220
- </div>
221
- </div>
222
- );
223
- };
224
-
225
- export default GeoInputComponent;