@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,166 +0,0 @@
1
- import React, { useState, useEffect, useCallback } from 'react';
2
- import { InputNumber, Button, Typography, Input } from 'antd';
3
- import { CheckOutlined } from '@ant-design/icons';
4
- import { useTranslation } from 'react-i18next';
5
- import { debounce } from 'lodash';
6
-
7
- export interface NumberProps {
8
- property: string;
9
- definition?: {
10
- minValue?: number;
11
- maxValue?: number;
12
- numberType?: string[];
13
- };
14
- value?: string | number;
15
- onSaveProperty: (data: { property: string; value: number }) => void;
16
- }
17
-
18
- const NumberComponent: React.FC<NumberProps> = ({
19
- property,
20
- definition,
21
- value,
22
- onSaveProperty
23
- }) => {
24
- const { t } = useTranslation();
25
- const [internalValue, setInternalValue] = useState<string>(value?.toString() || '');
26
- const [isValidNumber, setIsValidNumber] = useState<boolean>(checkIsNumeric(value));
27
- const [isDeleting, setIsDeleting] = useState(false);
28
-
29
- // Constraints from definition
30
- const constraints = {
31
- minValue: definition?.minValue,
32
- maxValue: definition?.maxValue,
33
- numberType: definition?.numberType,
34
- };
35
-
36
- // Update when props change
37
- useEffect(() => {
38
- if (!isDeleting) {
39
- setInternalValue(value?.toString() || '');
40
- setIsValidNumber(checkIsNumeric(value));
41
- }
42
- }, [value, isDeleting]);
43
-
44
- function save(): void {
45
- if (isDeleting) return;
46
-
47
- const isValid = checkIsNumeric(internalValue);
48
- setIsValidNumber(isValid);
49
-
50
- if (isValid) {
51
- const normalizedValue = internalValue.replace(',', '.');
52
- const numValue = parseFloat(normalizedValue);
53
- if (validateNumberConstraints(numValue)) {
54
- onSaveProperty({
55
- property,
56
- value: numValue
57
- });
58
- }
59
- }
60
- }
61
-
62
- function handleDelete(): void {
63
- setIsDeleting(true);
64
- // Your delete logic here
65
- }
66
-
67
- // Create debounced save function
68
- const debouncedSave = useCallback(
69
- debounce(() => {
70
- save();
71
- }, 200),
72
- [internalValue, property]
73
- );
74
-
75
- function checkIsNumeric(value?: string | number): boolean {
76
- if (value === undefined || value === null) return false;
77
- const stringValue = String(value);
78
- // Simple numeric check: matches integers and decimals (with either . or ,), positive and negative
79
- return /^-?\d+([.,]\d+)?$/.test(stringValue);
80
- }
81
-
82
- function isNumberType(value: number, numberTypes: string[]): boolean {
83
- const stringValue = String(value).toLowerCase();
84
-
85
- const typeMap: Record<string, boolean> = {
86
- any: true,
87
- long: Number.isSafeInteger(value),
88
- int: Number.isInteger(value),
89
- float: stringValue.includes(".") && !Number.isNaN(parseFloat(stringValue)),
90
- double: !Number.isNaN(parseFloat(stringValue)),
91
- };
92
-
93
- return Array.isArray(numberTypes) &&
94
- numberTypes.some((type) => typeMap[type.toLowerCase()]);
95
- }
96
-
97
- function validateNumberConstraints(value: number): boolean {
98
- if (constraints.minValue !== undefined && constraints.minValue > value) return false;
99
- if (constraints.maxValue !== undefined && constraints.maxValue < value) return false;
100
- if (constraints.numberType && !isNumberType(value, constraints.numberType)) return false;
101
- return true;
102
- }
103
-
104
- function getConstraintsString(): string {
105
- const message: string[] = [];
106
-
107
- Object.entries(constraints).forEach(([name, value]) => {
108
- if (name && value) {
109
- message.push(`${name}: ${value}`);
110
- }
111
- });
112
-
113
- return message.join(', ');
114
- }
115
-
116
- function handleChange(e: React.ChangeEvent<HTMLInputElement>): void {
117
- const newValue = e.target.value;
118
- setInternalValue(newValue);
119
- setIsValidNumber(checkIsNumeric(newValue));
120
- }
121
-
122
- const isValidConstraints = isValidNumber &&
123
- validateNumberConstraints(parseFloat(internalValue));
124
-
125
- return (
126
- <div className="flex flex-col w-full describo-property-type-number">
127
- <div className="flex flex-row gap-x-2">
128
- <Input
129
- size='middle'
130
- type="number"
131
- value={internalValue}
132
- onChange={handleChange}
133
- onBlur={debouncedSave}
134
- style={{ width: '100%' }}
135
- status={(!isValidNumber || !isValidConstraints) ? 'error' : ''}
136
- />
137
- <Button
138
- onClick={() => {
139
- // Cancel any pending debounced save
140
- debouncedSave.cancel();
141
- save();
142
- }}
143
- variant='solid'
144
- color="green"
145
- size="middle"
146
- disabled={!isValidNumber || !isValidConstraints}
147
- icon={<CheckOutlined />}
148
- />
149
- </div>
150
-
151
- {!isValidNumber && internalValue && (
152
- <Typography.Text type="danger">
153
- {t('invalid_number_value', { value: internalValue })}
154
- </Typography.Text>
155
- )}
156
-
157
- {isValidNumber && !isValidConstraints && getConstraintsString() && (
158
- <Typography.Text type="danger">
159
- {t('number_constraints_error_message', { value: getConstraintsString() })}
160
- </Typography.Text>
161
- )}
162
- </div>
163
- );
164
- };
165
-
166
- export default NumberComponent;
@@ -1,66 +0,0 @@
1
- import React from 'react';
2
- import { StoryFn, Meta } from '@storybook/react';
3
- import Select from './Select';
4
-
5
- export default {
6
- title: 'Primitives/Select',
7
- component: Select,
8
- argTypes: {
9
- value: {
10
- options: ['a', 'b', 'c'],
11
- control: { type: 'select' }
12
- },
13
- onSaveProperty: { action: 'saveProperty' }
14
- }
15
- } as Meta<typeof Select>;
16
-
17
- const Template: StoryFn<typeof Select> = (args) => <Select {...args} />;
18
-
19
- export const DefaultSelect = Template.bind({});
20
- DefaultSelect.args = {
21
- property: 'select',
22
- value: 'a',
23
- definition: {
24
- values: ['a', 'b', 'c']
25
- // no style, defaults to dropdown
26
- }
27
- };
28
-
29
- export const DropdownSelect = Template.bind({});
30
- DropdownSelect.args = {
31
- property: 'select',
32
- value: 'a',
33
- definition: {
34
- values: ['a', 'b', 'c'],
35
- style: 'dropdown'
36
- }
37
- };
38
-
39
- export const RadioSelect = Template.bind({});
40
- RadioSelect.args = {
41
- property: 'select',
42
- value: 'a',
43
- definition: {
44
- values: ['a', 'b', 'c'],
45
- style: 'radio'
46
- }
47
- };
48
-
49
- export const CheckboxSelect = Template.bind({});
50
- CheckboxSelect.args = {
51
- property: 'select',
52
- value: ['a'],
53
- definition: {
54
- values: ['a', 'b', 'c'],
55
- style: 'checkbox'
56
- }
57
- };
58
-
59
- export const InvalidSelect = Template.bind({});
60
- InvalidSelect.args = {
61
- property: 'select',
62
- value: 'a',
63
- definition: {
64
- values: ['a', 'b', 'c']
65
- }
66
- };
@@ -1,121 +0,0 @@
1
- import React, { useState, useEffect } from 'react';
2
- import { Select, Radio, Checkbox, Form } from 'antd';
3
- import { useTranslation } from 'react-i18next';
4
- import { isArray, isString, uniq } from 'lodash';
5
-
6
- export interface SelectProps {
7
- property: string;
8
- value?: string | string[];
9
- definition: {
10
- values: string[];
11
- style?: 'dropdown' | 'radio' | 'checkbox';
12
- };
13
- onSaveProperty: (data: { property: string; value: string | string[] }) => void;
14
- }
15
-
16
- const SelectComponent: React.FC<SelectProps> = ({
17
- property,
18
- value,
19
- definition,
20
- onSaveProperty
21
- }) => {
22
- const { t } = useTranslation();
23
- const [internalValue, setInternalValue] = useState<string | string[] | undefined>(value === '' ? undefined : value);
24
- const [hasValidValues, setHasValidValues] = useState<boolean>(false);
25
-
26
- useEffect(() => {
27
- // setInternalValue(value);
28
- setHasValidValues(verifySelectValuesAreStrings(definition.values));
29
- }, [value]);
30
-
31
- useEffect(() => {
32
- setHasValidValues(verifySelectValuesAreStrings(definition.values));
33
- }, [definition.values]);
34
-
35
- const save = (newValue: string | string[]) => {
36
- let valueToSave = newValue;
37
- if (definition.style === 'checkbox' && !isArray(valueToSave)) {
38
- valueToSave = [valueToSave as string];
39
- }
40
- setInternalValue(valueToSave);
41
- onSaveProperty({
42
- property,
43
- value: valueToSave
44
- });
45
- };
46
-
47
- const verifySelectValuesAreStrings = (values: any[]): boolean => {
48
- if (!isArray(values)) return false;
49
- const stringChecks = values.map(v => isString(v));
50
- const uniqueChecks = uniq(stringChecks);
51
- return uniqueChecks.length === 1 && uniqueChecks[0] === true;
52
- };
53
-
54
- if (!hasValidValues) {
55
- return (
56
- <div className="text-xs text-gray-700">
57
- {t('invalid_select_value')}
58
- </div>
59
- );
60
- }
61
-
62
- if (definition.style === 'radio') {
63
- return (
64
- <div className="flex flex-col w-full describo-property-type-select">
65
- <Radio.Group
66
- value={internalValue as string}
67
- onChange={(e) => save(e.target.value)}
68
- >
69
- {definition.values.map((value, idx) => (
70
- <div key={idx} className="flex flex-col">
71
- <Radio value={value}>
72
- {value}
73
- </Radio>
74
- </div>
75
- ))}
76
- </Radio.Group>
77
- </div>
78
- );
79
- }
80
-
81
- if (definition.style === 'checkbox') {
82
- return (
83
- <div className="flex flex-col w-full describo-property-type-select">
84
- <Checkbox.Group
85
- className="flex flex-col gap-1"
86
- value={isArray(internalValue) ? internalValue : []}
87
- onChange={(checkedValues) => save(checkedValues as string[])}
88
- >
89
- {definition.values.map((value, idx) => (
90
- <Checkbox key={idx} value={value} className="block">
91
- {value}
92
- </Checkbox>
93
- ))}
94
- </Checkbox.Group>
95
- </div>
96
-
97
- );
98
- }
99
-
100
- // Default dropdown style
101
- return (
102
- <div className="flex flex-col w-full describo-property-type-select">
103
- <Form.Item>
104
- <Select
105
- value={internalValue}
106
- onChange={(value) => save(value as string | string[])}
107
- style={{ width: '100%' }}
108
- placeholder={t('select')}
109
- >
110
- {definition.values.map((value, idx) => (
111
- <Select.Option key={idx} value={value}>
112
- {value}
113
- </Select.Option>
114
- ))}
115
- </Select>
116
- </Form.Item>
117
- </div>
118
- );
119
- };
120
-
121
- export default SelectComponent;
@@ -1,29 +0,0 @@
1
- import React from 'react';
2
- import { StoryFn, Meta } from '@storybook/react';
3
- import SelectObject from './SelectObject';
4
-
5
- export default {
6
- title: 'Primitives/SelectObject',
7
- component: SelectObject,
8
- argTypes: {
9
- property: {
10
- control: { type: 'text' }
11
- },
12
- onCreateEntity: { action: 'createEntity' }
13
- }
14
- } as Meta<typeof SelectObject>;
15
-
16
- const Template: StoryFn<typeof SelectObject> = (args) => <SelectObject {...args} />;
17
-
18
- export const Default = Template.bind({});
19
- Default.args = {
20
- property: 'select',
21
- definition: {
22
- values: [
23
- { '@id': '#a', '@type': 'Thing', name: 'a' },
24
- { '@id': '#b', '@type': 'Thing', name: 'b' },
25
- { '@id': '#c', '@type': 'Thing', name: 'c' },
26
- { '@id': '#d', '@type': 'Thing', name: 'd' }
27
- ]
28
- }
29
- };
@@ -1,105 +0,0 @@
1
- import React, { useState, useEffect } from 'react';
2
- import { Select, Form } from 'antd';
3
- import { useTranslation } from 'react-i18next';
4
- import { isPlainObject } from 'lodash';
5
- import { validateId } from '../CrateManager/validate-identifier';
6
-
7
- export interface SelectObjectProps {
8
- property: string;
9
- definition: {
10
- values: any[];
11
- };
12
- onCreateEntity: (data: { property: string; json: any }) => void;
13
- }
14
-
15
- const SelectObject: React.FC<SelectObjectProps> = ({
16
- property,
17
- definition,
18
- onCreateEntity
19
- }) => {
20
- const { t } = useTranslation();
21
- const [items, setItems] = useState(definition.values);
22
- const [internalValue, setInternalValue] = useState<any | undefined>(undefined);
23
- const [hasValidValues, setHasValidValues] = useState(verifySelectValuesAreValidPlainObjects(definition.values));
24
-
25
- useEffect(() => {
26
- setItems(definition.values);
27
- setHasValidValues(verifySelectValuesAreValidPlainObjects(definition.values));
28
- }, [definition.values]);
29
-
30
- const save = (selectedItem: any) => {
31
- setInternalValue(selectedItem);
32
- onCreateEntity({ property, json: selectedItem });
33
- };
34
-
35
- const filter = (searchText: string) => {
36
- const filteredItems = definition.values.filter((v) => {
37
- const re = new RegExp(searchText, 'i');
38
- const data = `${v['@id']} ${v['@type']} ${v.name}`;
39
- return data.match(re);
40
- });
41
- setItems(filteredItems);
42
- };
43
-
44
- const reset = () => {
45
- setItems(definition.values);
46
- };
47
-
48
- function verifySelectValuesAreValidPlainObjects(values: any[]) {
49
- let valid = true;
50
- if (!Array.isArray(values)) return false;
51
-
52
- values.forEach((v) => {
53
- if (!isPlainObject(v)) {
54
- valid = false;
55
- return;
56
- }
57
- if (!('@id' in v) || !('@type' in v) || !('name' in v)) {
58
- valid = false;
59
- return;
60
- }
61
- const { isValid } = validateId({ id: v['@id'], type: v['@type'] });
62
- if (!isValid) valid = false;
63
- });
64
- return valid;
65
- }
66
-
67
- if (!hasValidValues) {
68
- return (
69
- <div className="text-xs text-gray-700">
70
- {t('invalid_selectobject_values')}
71
- </div>
72
- );
73
- }
74
-
75
- return (
76
- <div className="flex flex-col">
77
- <Form.Item>
78
- <Select
79
- size='middle'
80
- showSearch
81
- placeholder={t('select')}
82
- value={internalValue ? internalValue['@id'] : undefined}
83
- onChange={(value: string) => {
84
- const selectedItem = items.find(item => item['@id'] === value);
85
- if (selectedItem) {
86
- save(selectedItem);
87
- }
88
- }}
89
- onSearch={filter}
90
- onBlur={reset}
91
- filterOption={false}
92
- notFoundContent={t('no_data')}
93
- >
94
- {items.map((item, idx) => (
95
- <Select.Option key={idx} value={item['@id']}>
96
- {item.name} ({item['@id']})
97
- </Select.Option>
98
- ))}
99
- </Select>
100
- </Form.Item>
101
- </div>
102
- );
103
- };
104
-
105
- export default SelectObject;
@@ -1,42 +0,0 @@
1
- import React from 'react';
2
- import { StoryFn, Meta } from '@storybook/react';
3
- import SelectUrl from './SelectUrl';
4
-
5
- export default {
6
- title: 'Primitives/SelectUrl',
7
- component: SelectUrl,
8
- argTypes: {
9
- property: {
10
- control: { type: 'text' }
11
- },
12
- onCreateEntity: { action: 'createEntity' }
13
- }
14
- } as Meta<typeof SelectUrl>;
15
-
16
- const Template: StoryFn<typeof SelectUrl> = (args) => <SelectUrl {...args} />;
17
-
18
- export const Default = Template.bind({});
19
- Default.args = {
20
- property: 'select',
21
- value: 'http://schema.org/name',
22
- definition: {
23
- values: ['http://schema.org/name', 'https://schema.org/Country']
24
- }
25
- };
26
-
27
- export const InvalidValue = Template.bind({});
28
- InvalidValue.args = {
29
- property: 'select',
30
- value: 'not-a-url',
31
- definition: {
32
- values: ['http://schema.org/name', 'https://schema.org/Country']
33
- }
34
- };
35
-
36
- export const InvalidValues = Template.bind({});
37
- InvalidValues.args = {
38
- property: 'select',
39
- definition: {
40
- values: ['not-a-url', 'also-not-a-url']
41
- }
42
- };
@@ -1,110 +0,0 @@
1
- import React, { useState, useEffect } from 'react';
2
- import { Select, Form } from 'antd';
3
- import { useTranslation } from 'react-i18next';
4
- import { isArray, isString, uniq } from 'lodash';
5
- import { isURL } from '../CrateManager/lib';
6
-
7
- export interface SelectUrlProps {
8
- property: string;
9
- value?: string;
10
- definition: {
11
- values: string[];
12
- };
13
- onCreateEntity: (data: { property: string; json: any }) => void;
14
- }
15
-
16
- const SelectUrl: React.FC<SelectUrlProps> = ({
17
- property,
18
- value,
19
- definition,
20
- onCreateEntity
21
- }) => {
22
- const { t } = useTranslation();
23
- const [items, setItems] = useState(definition.values);
24
- const [internalValue, setInternalValue] = useState<string | undefined>(value);
25
- const [isValidValue, setIsValidValue] = useState(value ? isURL(value) : true);
26
- const [hasValidValues, setHasValidValues] = useState(verifySelectValuesAreUrls(definition.values));
27
-
28
- useEffect(() => {
29
- setInternalValue(value);
30
- setIsValidValue(value ? isURL(value) : true);
31
- }, [value]);
32
-
33
- useEffect(() => {
34
- setItems(definition.values);
35
- setHasValidValues(verifySelectValuesAreUrls(definition.values));
36
- }, [definition.values]);
37
-
38
- const save = (selectedValue: string) => {
39
- setInternalValue(selectedValue);
40
- onCreateEntity({
41
- property,
42
- json: {
43
- '@id': selectedValue,
44
- '@type': 'URL',
45
- name: selectedValue,
46
- },
47
- });
48
- };
49
-
50
- const filter = (searchText: string) => {
51
- const filteredItems = definition.values.filter((v) => {
52
- const re = new RegExp(searchText, 'i');
53
- return v.toLowerCase().match(re);
54
- });
55
- setItems(filteredItems);
56
- };
57
-
58
- const reset = () => {
59
- setItems(definition.values);
60
- };
61
-
62
- function verifySelectValuesAreUrls(values: any[]): boolean {
63
- if (!isArray(values)) return false;
64
- const validatedValues = values.map((v) => isString(v) && isURL(v));
65
- const uniqueValues = uniq(validatedValues);
66
- return uniqueValues.length === 1 && uniqueValues[0] === true;
67
- }
68
-
69
- if (!isValidValue) {
70
- return (
71
- <div className="text-xs text-gray-700">
72
- {t('invalid_selecturl_value', { value })}
73
- </div>
74
- );
75
- }
76
-
77
- if (!hasValidValues) {
78
- return (
79
- <div className="text-xs text-gray-700">
80
- {t('invalid_selecturl_values')}
81
- </div>
82
- );
83
- }
84
-
85
- return (
86
- <div>
87
- <Form.Item>
88
- <Select
89
- size='middle'
90
- showSearch
91
- placeholder={t('select')}
92
- value={internalValue || undefined}
93
- onChange={(value: string) => save(value)}
94
- onSearch={filter}
95
- onBlur={reset}
96
- filterOption={false}
97
- notFoundContent={t('no_data')}
98
- >
99
- {items.map((item, idx) => (
100
- <Select.Option key={idx} value={item}>
101
- {item}
102
- </Select.Option>
103
- ))}
104
- </Select>
105
- </Form.Item>
106
- </div>
107
- );
108
- };
109
-
110
- export default SelectUrl;