@arpproject/recrate 0.1.7 → 0.1.9

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,255 +0,0 @@
1
- import React from 'react';
2
- import dayjs from 'dayjs';
3
- import { isDecimal, isInt, isFloat, isNumeric } from 'validator';
4
- import { isURL } from '../CrateManager/lib';
5
- import { useStateStore } from '../store';
6
- import TextComponent from '../primitives/Text';
7
- import DateComponent from '../primitives/Date';
8
- import DateTimeComponent from '../primitives/DateTime';
9
- import TimeComponent from '../primitives/Time';
10
- import NumberComponent from '../primitives/Number';
11
- import ValueComponent from '../primitives/Value';
12
- import SelectComponent from '../primitives/Select';
13
- import UrlComponent from '../primitives/Url';
14
- import BooleanComponent from '../primitives/Boolean';
15
-
16
- interface EntityPropertyInstanceProps {
17
- property: string;
18
- value: string | number | boolean | Date | any[];
19
- idx: number;
20
- definition: {
21
- type: string;
22
- value?: any;
23
- values?: string[];
24
- minValue?: number;
25
- maxValue?: number;
26
- numberType?: string[];
27
- style?: 'dropdown' | 'radio' | 'checkbox';
28
- // Add TextComponent definition properties
29
- minLength?: number;
30
- maxLength?: number;
31
- regex?: string;
32
- dateFormat?: string[];
33
- };
34
- className?: string;
35
- placeholder?: string;
36
- onSaveProperty: (data: any) => void;
37
- onCreateEntity: (data: any) => void;
38
- }
39
-
40
- export const EntityPropertyInstance: React.FC<EntityPropertyInstanceProps> = ({
41
- property,
42
- value,
43
- idx,
44
- definition,
45
- className,
46
- placeholder,
47
- onSaveProperty,
48
- onCreateEntity
49
- }) => {
50
- const state = useStateStore();
51
-
52
- const savePropertyValue = async (data: any) => {
53
- if (!data.idx) {
54
- data = { ...data, property, idx };
55
- }
56
- onSaveProperty(data);
57
- };
58
-
59
- const isDate = (value: any) => {
60
- try {
61
- if (typeof value === 'boolean') return false;
62
- const date = dayjs(value);
63
- return date.isValid() && definitionIncludes('Date');
64
- } catch (error) {
65
- return false;
66
- }
67
- };
68
-
69
- const isDateTime = (value: any) => {
70
- try {
71
- if (typeof value === 'boolean') return false;
72
- const date = dayjs(value);
73
- return date.isValid() && definitionIncludes('DateTime');
74
- } catch (error) {
75
- return false;
76
- }
77
- };
78
-
79
- const isTime = (value: any) => {
80
- const stringValue = String(value);
81
- return (stringValue.match(/^([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$/) ||
82
- stringValue.match(/^([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$/)) &&
83
- (definitionIncludes('DateTime') || definitionIncludes('Time'));
84
- };
85
-
86
- const isNumber = (value: any) => {
87
- const stringValue = String(value);
88
- return (isDecimal(stringValue) || isInt(stringValue) || isFloat(stringValue) || isNumeric(stringValue)) &&
89
- (definitionIncludes('Number') || definitionIncludes('Float') || definitionIncludes('Integer'));
90
- };
91
-
92
- const isValue = () => {
93
- return definition?.type === 'Value';
94
- };
95
-
96
- const isSelect = () => {
97
- return (definition?.values?.includes(String(value)) || definitionIncludes('Select'));
98
- };
99
-
100
- const isBoolean = () => {
101
- return definition?.type == 'Boolean';
102
- };
103
-
104
- const isText = (value: any) => {
105
- return !isBoolean() &&
106
- !isDate(value) &&
107
- !isDateTime(value) &&
108
- !isTime(value) &&
109
- !isNumber(value) &&
110
- !isURL(value) &&
111
- !isSelect() &&
112
- !isValue();
113
- };
114
-
115
- const definitionIncludes = (type: string) => {
116
- return definition?.type?.includes(type);
117
- };
118
-
119
- if (state.configuration?.readonly) {
120
- if (isDate(value)) {
121
- try {
122
- const dateValue = typeof value === 'string' || typeof value === 'number' || value instanceof Date ? value : String(value);
123
- return <div>{dayjs(dateValue).format('dddd, MMM DD, YYYY')}</div>;
124
- } catch (error) {
125
- return <div>{String(value)}</div>;
126
- }
127
- }
128
- if (isDateTime(value)) {
129
- try {
130
- const dateValue = typeof value === 'string' || typeof value === 'number' || value instanceof Date ? value : String(value);
131
- return <div>{dayjs(dateValue).format('dddd, MMM DD, YYYY hh:mm A')}</div>;
132
- } catch (error) {
133
- return <div>{String(value)}</div>;
134
- }
135
- }
136
- return <div className={className}>{String(value)}</div>;
137
- }
138
-
139
- if (isValue()) {
140
- return <ValueComponent
141
- value={typeof value === 'string' ? value : String(value)}
142
- property={property}
143
- />;
144
- }
145
-
146
- if (isBoolean()) {
147
- return (
148
- <BooleanComponent
149
- property={property}
150
- value={value as boolean}
151
- onSaveProperty={savePropertyValue}
152
- />
153
- );
154
- }
155
-
156
- if (isDateTime(value)) {
157
- return (
158
- <DateTimeComponent
159
- property={property}
160
- value={value as string}
161
- onSaveProperty={savePropertyValue}
162
- />
163
- );
164
- }
165
-
166
- if (isDate(value)) {
167
- return (
168
- <DateComponent
169
- property={property}
170
- value={value as string}
171
- onSaveProperty={savePropertyValue}
172
- />
173
- );
174
- }
175
-
176
- if (isTime(value)) {
177
- return (
178
- <TimeComponent
179
- property={property}
180
- value={value as string}
181
- onSaveProperty={savePropertyValue}
182
- />
183
- );
184
- }
185
-
186
- if (isNumber(value)) {
187
- return (
188
- <NumberComponent
189
- property={property}
190
- value={value as number}
191
- definition={definition}
192
- onSaveProperty={savePropertyValue}
193
- />
194
- );
195
- }
196
-
197
- if (isSelect()) {
198
- return (
199
- <SelectComponent
200
- property={property}
201
- value={value as string}
202
- definition={{
203
- values: definition.values || [],
204
- style: definition.style
205
- }}
206
- onSaveProperty={savePropertyValue}
207
- />
208
- );
209
- }
210
-
211
- if (isURL(String(value)) && state.configuration?.enableUrlMarkup) {
212
- return (
213
- <UrlComponent
214
- property={property}
215
- value={String(value)}
216
- onCreateEntity={onCreateEntity}
217
- />
218
- );
219
- }
220
-
221
- if (isText(value) && definition.type.includes('TextArea')) {
222
- return (
223
- <TextComponent
224
- type="textarea"
225
- property={property}
226
- value={value as string}
227
- definition={{
228
- minLength: definition.minLength,
229
- maxLength: definition.maxLength,
230
- regex: definition.regex,
231
- dateFormat: definition.dateFormat
232
- }}
233
- placeholder={placeholder}
234
- onSaveProperty={savePropertyValue}
235
- />
236
- );
237
- }
238
-
239
- return (
240
- <TextComponent
241
- property={property}
242
- value={value as string}
243
- definition={{
244
- minLength: definition.minLength,
245
- maxLength: definition.maxLength,
246
- regex: definition.regex,
247
- dateFormat: definition.dateFormat
248
- }}
249
- placeholder={placeholder}
250
- onSaveProperty={savePropertyValue}
251
- />
252
- );
253
- };
254
-
255
- export default EntityPropertyInstance;
@@ -1,95 +0,0 @@
1
- import React, { useState, useMemo, useContext } from 'react';
2
- import { useTranslation } from 'react-i18next';
3
- import { Tag, Select, Flex } from 'antd';
4
- import { ProfileManagerContext } from '../Shell';
5
- import { useStateStore } from '../store';
6
-
7
- interface EntityTypeProps {
8
- entity: {
9
- '@type': string[];
10
- };
11
- onUpdateEntity: (data: { property: string; value: string[] }) => void;
12
- }
13
-
14
- export const EntityType: React.FC<EntityTypeProps> = ({ entity, onUpdateEntity }) => {
15
- const [selectedClass, setSelectedClass] = useState<string | undefined>(undefined);
16
- const profileManager = useContext(ProfileManagerContext);
17
- const state = useStateStore();
18
- const { t } = useTranslation();
19
-
20
- const classes = useMemo(() => {
21
- return profileManager?.getClasses().map((c: string) => ({ value: c, label: c })) || [];
22
- }, [profileManager]);
23
-
24
- const types = useMemo(() => {
25
- return entity['@type'];
26
- }, [entity]);
27
-
28
- const closable = useMemo(() => {
29
- return entity['@type'].length > 1;
30
- }, [entity]);
31
-
32
- const getTypeLabelFromProfile = (type: string) => {
33
- return profileManager?.getTypeLabel(type) || type;
34
- };
35
-
36
- const handleSave = (newClass: string) => {
37
- if (!newClass) return;
38
- onUpdateEntity({
39
- property: '@type',
40
- value: [...entity['@type'], newClass],
41
- });
42
- setSelectedClass('');
43
- };
44
-
45
- const handleDelete = (typeToDelete: string) => {
46
- const updatedTypes = entity['@type'].filter(t => t !== typeToDelete);
47
- onUpdateEntity({
48
- property: '@type',
49
- value: updatedTypes,
50
- });
51
- setSelectedClass('');
52
- };
53
-
54
- return (
55
- <Flex className="flex-row">
56
- <div className="min-w-32 w-1/3 xl:w-1/5 flex flex-col describo-property-name">@type</div>
57
- <Flex className="w-2/3 xl:w-4/5 flex-row flex-wrap">
58
- {types.map((etype) => (
59
- <Tag
60
- key={etype}
61
- closable={closable}
62
- onClose={() => handleDelete(etype)}
63
- style={{
64
- backgroundColor: '#f0f0f0',
65
- borderRadius: '16px',
66
- padding: '0 12px',
67
- height: '32px',
68
- display: 'flex',
69
- alignItems: 'center',
70
- margin: '4px',
71
- }}
72
- >
73
- {getTypeLabelFromProfile(etype)}
74
- </Tag>
75
- ))}
76
- {!state.configuration?.readonly && (
77
- <Select
78
- value={selectedClass}
79
- onChange={(value) => handleSave(value)}
80
- placeholder={t("select_a_class_to_add")}
81
- style={{ width: 250, margin: '4px', height: '32px' }}
82
- >
83
- {classes.map((classOption: { value: string; label: string }) => (
84
- <Select.Option key={classOption.value} value={classOption.value}>
85
- {classOption.label}
86
- </Select.Option>
87
- ))}
88
- </Select>
89
- )}
90
- </Flex>
91
- </Flex>
92
- );
93
- };
94
-
95
- export default EntityType;
@@ -1,37 +0,0 @@
1
- import React from 'react';
2
- import { Typography } from 'antd';
3
- import RenderTypes from './RenderTypes';
4
-
5
- interface ItemLinkProps {
6
- entity: {
7
- '@id': string;
8
- '@type': string[];
9
- name: string;
10
- };
11
- onLoadEntity: (data: { id: string }) => void;
12
- className?: string; // Add this line
13
- }
14
-
15
- export const ItemLink: React.FC<ItemLinkProps> = ({ entity, onLoadEntity, className }) => {
16
- const handleLoadEntity = () => {
17
- onLoadEntity({ id: entity['@id'] });
18
- };
19
-
20
- return (
21
- <div className={`flex flex-col m-4 w-full ${className || ''}`} onClick={handleLoadEntity}>
22
- <Typography.Text type="secondary" style={{ fontSize: '0.75rem' }} className="pb-1 mb-1 border-b border-black/20">
23
- {decodeURIComponent(entity['@id'])}
24
- </Typography.Text>
25
- <div className="flex flex-row space-x-2 items-center">
26
- <div className="text-base flex flex-row space-x-1">
27
- <RenderTypes types={entity['@type']} />
28
- </div>
29
- <Typography.Text strong>
30
- {entity.name}
31
- </Typography.Text>
32
- </div>
33
- </div>
34
- );
35
- };
36
-
37
- export default ItemLink;
@@ -1,43 +0,0 @@
1
- import type { Meta, StoryObj } from '@storybook/react';
2
- import PaginateLinkedEntities from './PaginateLinkedEntities';
3
- import Chance from 'chance';
4
- import range from 'lodash/range';
5
-
6
- const chance = new Chance();
7
-
8
- const meta: Meta<typeof PaginateLinkedEntities> = {
9
- component: PaginateLinkedEntities,
10
- argTypes: {
11
- onLoadEntity: { action: 'loadEntity' },
12
- },
13
- };
14
-
15
- export default meta;
16
- type Story = StoryObj<typeof PaginateLinkedEntities>;
17
-
18
- function generateEntities(limit: number) {
19
- return range(0, limit).map((i) => ({
20
- idx: i,
21
- value: {
22
- '@id': chance.url(),
23
- '@type': ['File'],
24
- name: `/path/to/file/${chance.word()}`,
25
- },
26
- }));
27
- }
28
-
29
- export const ValidEntityInputWithOneEntity: Story = {
30
- args: {
31
- readonly: false,
32
- property: 'something',
33
- entities: generateEntities(1),
34
- },
35
- };
36
-
37
- export const ValidEntityInputWithOneHundredEntities: Story = {
38
- args: {
39
- readonly: false,
40
- property: 'something',
41
- entities: generateEntities(100),
42
- },
43
- };
@@ -1,141 +0,0 @@
1
- import React, { useState, useEffect } from 'react';
2
- import { Input, Pagination } from 'antd';
3
- import { useTranslation } from 'react-i18next';
4
- import { useStateStore } from '../store';
5
- import ItemLink from './ItemLink';
6
- import RenderLinkedItem from './RenderLinkedItem';
7
-
8
- interface PaginateLinkedEntitiesProps {
9
- entities: Array<{
10
- idx: number;
11
- value: {
12
- '@id': string;
13
- '@type': string[];
14
- name: string;
15
- };
16
- }>;
17
- property: string;
18
- readonly?: boolean;
19
- className?: string;
20
- onLoadEntity: (data: { id: string }) => void;
21
- onUnlinkEntity: (data: { property: string; tgtEntityId: string }) => void;
22
- }
23
-
24
- const PaginateLinkedEntities: React.FC<PaginateLinkedEntitiesProps> = ({
25
- entities,
26
- property,
27
- readonly = false,
28
- className = '',
29
- onLoadEntity,
30
- onUnlinkEntity
31
- }) => {
32
- const { t } = useTranslation();
33
- const editorState = useStateStore();
34
- const [filter, setFilter] = useState<string>('');
35
- const [pageSize] = useState(10);
36
- const [currentPage, setCurrentPage] = useState(
37
- editorState.editorState.latest()[property]?.paginator?.currentPage ?? 1
38
- );
39
- const [displayEntities, setDisplayEntities] = useState<typeof entities>([]);
40
- const [total, setTotal] = useState(entities.length);
41
-
42
- useEffect(() => {
43
- setTotal(entities.length);
44
- setCurrentPage(editorState.editorState.latest()[property]?.paginator?.currentPage ?? 1);
45
- filterAndChunkEntitiesForDisplay();
46
- }, [entities]);
47
-
48
- const filterAndChunkEntitiesForDisplay = () => {
49
- if (total < pageSize) {
50
- setCurrentPage(1);
51
- }
52
-
53
- const offset = (currentPage - 1) * pageSize;
54
- let filteredEntities = entities;
55
-
56
- if (filter) {
57
- const re = new RegExp(filter, 'i');
58
- filteredEntities = entities.filter(
59
- (e) => e.value?.name?.match(re) || e.value?.['@id']?.match(re)
60
- );
61
- setTotal(filteredEntities.length);
62
- } else {
63
- setTotal(entities.length);
64
- }
65
-
66
- setDisplayEntities(filteredEntities.slice(offset, offset + pageSize));
67
-
68
- const currentState = editorState.editorState.latest();
69
- if (currentPage !== currentState[property]?.paginator?.currentPage) {
70
- currentState[property] = {
71
- paginator: {
72
- currentPage: currentPage,
73
- },
74
- };
75
- editorState.editorState.update(currentState);
76
- }
77
- };
78
-
79
- useEffect(() => {
80
- filterAndChunkEntitiesForDisplay();
81
- }, [filter, currentPage]);
82
-
83
- const handlePageChange = (_event: React.ChangeEvent<unknown>, page: number) => {
84
- setCurrentPage(page);
85
- };
86
-
87
- const handleFilterChange = (event: React.ChangeEvent<HTMLInputElement>) => {
88
- setFilter(event.target.value);
89
- };
90
-
91
- return (
92
- <div className="flex flex-col">
93
- <div className="flex flex-row justify-center pt-2 mb-4">
94
- <Pagination
95
- current={currentPage}
96
- pageSize={pageSize}
97
- total={total}
98
- onChange={setCurrentPage}
99
- showSizeChanger={false}
100
- hideOnSinglePage={true}
101
- showTotal={(total) => t('pagination_total', { total })}
102
- />
103
- </div>
104
- <div className="flex flex-row space-x-2 items-center">
105
- <div className="flex-grow">
106
- <Input.Search
107
- value={filter}
108
- onChange={handleFilterChange}
109
- onSearch={filterAndChunkEntitiesForDisplay}
110
- placeholder={t('filter_the_entities') || 'Filter the entities'}
111
- />
112
- </div>
113
- </div>
114
- <div className="flex flex-col pt-2">
115
- {displayEntities.map((entity) => (
116
- <RenderLinkedItem
117
- key={entity.value['@id']}
118
- entity={entity.value}
119
- property={property}
120
- readonly={readonly}
121
- onLoadEntity={onLoadEntity}
122
- onUnlinkEntity={onUnlinkEntity}
123
- />
124
- ))}
125
- </div>
126
- <div className="flex flex-row justify-center pt-2">
127
- <Pagination
128
- current={currentPage}
129
- pageSize={pageSize}
130
- total={total}
131
- onChange={setCurrentPage}
132
- showSizeChanger={false}
133
- hideOnSinglePage={true}
134
- showTotal={(total) => t('pagination_total', { total })}
135
- />
136
- </div>
137
- </div>
138
- );
139
- };
140
-
141
- export default PaginateLinkedEntities;
@@ -1,39 +0,0 @@
1
- import React, { useState, useMemo } from 'react';
2
-
3
- interface PropertyHelpProps {
4
- help?: string;
5
- }
6
-
7
- export const PropertyHelp: React.FC<PropertyHelpProps> = ({ help }) => {
8
- const [showMore, setShowMore] = useState(false);
9
- const length = 100;
10
-
11
- const showToggle = useMemo(() => {
12
- return help ? help.length > length : false;
13
- }, [help]);
14
-
15
- const displayHelp = useMemo(() => {
16
- if (!help) return '';
17
- if (showMore) return help;
18
- return help.slice(0, length);
19
- }, [help, showMore]);
20
-
21
- if (!showToggle) {
22
- return (
23
- <div className="text-gray-600 font-light text-sm pr-1 describo-property-help">
24
- {displayHelp}
25
- </div>
26
- );
27
- }
28
-
29
- return (
30
- <div
31
- className="text-gray-600 font-light text-sm pr-1 cursor-pointer describo-property-help-more"
32
- onClick={() => setShowMore(!showMore)}
33
- >
34
- {displayHelp} {!showMore && <span>...</span>}
35
- </div>
36
- );
37
- };
38
-
39
- export default PropertyHelp;