Skip to content

Commit 99462b2

Browse files
committed
Add importer
1 parent c5a6256 commit 99462b2

File tree

8 files changed

+450
-19
lines changed

8 files changed

+450
-19
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"dev": "concurrently -k \"npm run build:watch\" \"npm run serve:dist\"",
1414
"format": "prettier --write \"src/**/*.{ts,tsx,js,jsx,json}\" && eslint src --fix",
1515
"lint": "eslint src",
16-
"serve:dist": "vite preview --strictPort --port 4173",
16+
"serve:dist": "vite preview --strictPort --port 4202",
1717
"typecheck": "tsc --noEmit"
1818
},
1919
"devDependencies": {

src/components/.gitkeep

Whitespace-only changes.
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
import { ChangeEvent, useState } from 'react'
2+
import { ProjectImporterComponentProps } from '@ds-wizard/plugin-sdk/elements'
3+
import { ProjectImporter } from '@ds-wizard/plugin-sdk/project-importer'
4+
import { SettingsData } from '../data/settings-data'
5+
import { importMaDMP } from '../importer/madmp-importer'
6+
7+
export default function ImporterComponent({
8+
onImport,
9+
}: ProjectImporterComponentProps<SettingsData, null>) {
10+
const [error, setError] = useState<string | null>(null)
11+
12+
const handleFileChange = (event: ChangeEvent<HTMLInputElement>) => {
13+
const file = event.target.files?.[0]
14+
if (!file) return
15+
16+
const reader = new FileReader()
17+
reader.onload = (e) => {
18+
try {
19+
const content = e.target?.result
20+
if (typeof content !== 'string') {
21+
throw new Error('File content is not a string')
22+
}
23+
24+
const json = JSON.parse(content)
25+
const importer = new ProjectImporter()
26+
27+
importMaDMP(importer, json)
28+
29+
setError(null)
30+
onImport(importer.getEvents())
31+
} catch {
32+
setError(
33+
'Error reading or parsing file. Make sure you selected a valid JSON document.',
34+
)
35+
}
36+
}
37+
reader.readAsText(file)
38+
}
39+
40+
return (
41+
<div className="col col-detail mx-auto">
42+
<div id="importer">
43+
<div className="mb-3">
44+
<h2>maDMP Importer</h2>
45+
</div>
46+
<div className="mb-3">
47+
{error && (
48+
<div id="error">
49+
<div className="alert alert-danger" role="alert" id="error-alert">
50+
{error}
51+
</div>
52+
</div>
53+
)}
54+
<div className="form-group">
55+
<label htmlFor="file-input" className="form-label">
56+
Select maDMP (JSON)
57+
</label>
58+
<input
59+
type="file"
60+
id="file-input"
61+
accept="application/json"
62+
className={`form-control${error ? ' is-invalid' : ''}`}
63+
onChange={handleFileChange}
64+
/>
65+
<p className="mt-2 text-muted">
66+
Choose a machine-actionable Data Management Plan in JSON format that
67+
conforms to the{' '}
68+
<a
69+
href="https://github.com/RDA-DMP-Common/RDA-DMP-Common-Standard"
70+
target="_blank"
71+
>
72+
RDA DMP Common Standard
73+
</a>
74+
.
75+
</p>
76+
</div>
77+
</div>
78+
</div>
79+
</div>
80+
)
81+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import React from 'react'
2+
import { SettingsData } from '@/data/settings-data'
3+
import { SettingsComponentProps } from '@ds-wizard/plugin-sdk/elements'
4+
5+
export default function SettingsComponent({
6+
settings,
7+
onSettingsChange,
8+
}: SettingsComponentProps<SettingsData>) {
9+
const rows = Math.min(12, Math.max(4, settings.extraKmPatterns.split('\n').length))
10+
11+
return (
12+
<div>
13+
<div className="form-group">
14+
<label>Additional KM Patterns:</label>
15+
<textarea
16+
className="form-control"
17+
rows={rows}
18+
value={settings.extraKmPatterns}
19+
onChange={(e: React.ChangeEvent<HTMLTextAreaElement>) =>
20+
onSettingsChange({ ...settings, extraKmPatterns: e.target.value })
21+
}
22+
/>
23+
<p className="text-muted mt-2">
24+
maDMP Importer works with Common DSW Knowledge Model (
25+
<code>dsw:root:^2.4.0</code>) and Life Sciences DSW Knowledge Model{' '}
26+
<code>dsw:lifesciencies:^2.4.0</code>. If you have knowledge models based on
27+
these, you can add them here so that they can work with maDMP Importer as well.
28+
Add one pattern per line.
29+
</p>
30+
</div>
31+
</div>
32+
)
33+
}

src/data/settings-data.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,14 @@ import { makeJsonCodec } from '@ds-wizard/plugin-sdk/utils'
33

44
// Define the plugin settings data here or delete if not needed
55

6-
export const SettingsDataSchema = z.object({})
6+
export const SettingsDataSchema = z.object({
7+
extraKmPatterns: z.string(),
8+
})
79

810
export type SettingsData = z.infer<typeof SettingsDataSchema>
911

10-
export const DefaultSettingsData: SettingsData = {}
12+
export const DefaultSettingsData: SettingsData = {
13+
extraKmPatterns: '',
14+
}
1115

1216
export const SettingsDataCodec = makeJsonCodec(SettingsDataSchema, DefaultSettingsData)

0 commit comments

Comments
 (0)