Skip to content

Commit 35fd9b2

Browse files
authored
MMT-4012: Add Scheme Selector to Keyword Manager page (#1352)
* MMT-4012: Add Scheme Selector for Keyword Manager * MMT-4012: Remove scss file * MMT-4012: Fixed tests * MMT-4012: Fix tests, add onHandleChange * MMT-4012: Fix tests * MMT-4012: Restructure tests * MMT-4012: Update tests * MMT-4012: From main * MMT-4012: Add tests * MMT-4012: Revert test page route * MMT-4012: Revert change for test page * MMT-4012: Updated km page * MMT-4012: Update kmsUrl * MMT-4012: Fix tests * MMT-4012: Updated for feedbacks * MMT-4012: Add test
1 parent 5f3dad1 commit 35fd9b2

File tree

6 files changed

+947
-5
lines changed

6 files changed

+947
-5
lines changed
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
import React, { useState, useEffect } from 'react'
2+
import PropTypes from 'prop-types'
3+
import Select from 'react-select'
4+
import Row from 'react-bootstrap/Row'
5+
import Col from 'react-bootstrap/Col'
6+
import getKmsConceptSchemes from '@/js/utils/getKmsConceptSchemes'
7+
8+
/**
9+
* KmsConceptSchemeSelector component
10+
*
11+
* This component renders a dropdown selector for KMS concept schemes.
12+
* It fetches the schemes based on the provided version and allows the user to select one.
13+
*
14+
* @param {Object} props - Component props
15+
* @param {string} props.version - The version of KMS to fetch schemes for
16+
* @param {function} props.onSchemeSelect - Callback function triggered when a scheme is selected
17+
*/
18+
const KmsConceptSchemeSelector = ({ version, onSchemeSelect }) => {
19+
// State for storing the list of schemes
20+
const [schemes, setSchemes] = useState([])
21+
// State for storing the currently selected scheme
22+
const [selectedScheme, setSelectedScheme] = useState(null)
23+
// State for tracking loading status
24+
const [loading, setLoading] = useState(true)
25+
26+
useEffect(() => {
27+
/**
28+
* Fetches the concept schemes for the given version
29+
*/
30+
const fetchSchemes = async () => {
31+
if (!version) {
32+
// Reset states if no version is provided
33+
setSchemes([])
34+
setSelectedScheme(null)
35+
setLoading(false)
36+
onSchemeSelect(null)
37+
38+
return
39+
}
40+
41+
try {
42+
// Fetch schemes from the API
43+
const result = await getKmsConceptSchemes(version)
44+
// Transform the schemes into options for the dropdown
45+
const options = result.schemes.map((scheme) => ({
46+
value: scheme.name,
47+
label: scheme.name,
48+
updateDate: scheme.updateDate,
49+
csvHeaders: scheme.csvHeaders
50+
}))
51+
// Sort options alphabetically
52+
options.sort((a, b) => a.value.localeCompare(b.value, undefined, { sensitivity: 'base' }))
53+
54+
setSchemes(options)
55+
56+
// Select the first option
57+
if (options.length > 0) {
58+
const firstOption = options[0]
59+
setSelectedScheme(firstOption)
60+
onSchemeSelect({
61+
name: firstOption.value,
62+
longName: firstOption.label,
63+
updateDate: firstOption.updateDate,
64+
csvHeaders: firstOption.csvHeaders
65+
})
66+
}
67+
68+
setLoading(false)
69+
} catch (error) {
70+
console.error('Error fetching schemes:', error)
71+
setLoading(false)
72+
}
73+
}
74+
75+
fetchSchemes()
76+
}, [version])
77+
78+
/**
79+
* Handles the change event when a new scheme is selected
80+
* @param {Object} selectedOption - The selected scheme option
81+
*/
82+
const handleChange = (selectedOption) => {
83+
setSelectedScheme(selectedOption)
84+
85+
onSchemeSelect({
86+
name: selectedOption.value,
87+
longName: selectedOption.label,
88+
updateDate: selectedOption.updateDate,
89+
csvHeaders: selectedOption.csvHeaders
90+
})
91+
}
92+
93+
return (
94+
<Row className="mb-4">
95+
<Col>
96+
<div className="rounded p-3">
97+
<Select
98+
isLoading={loading}
99+
options={schemes}
100+
value={selectedScheme}
101+
onChange={handleChange}
102+
placeholder="Loading schemes..."
103+
/>
104+
</div>
105+
</Col>
106+
</Row>
107+
)
108+
}
109+
110+
KmsConceptSchemeSelector.propTypes = {
111+
version: PropTypes.shape({
112+
version: PropTypes.string,
113+
version_type: PropTypes.string
114+
}),
115+
onSchemeSelect: PropTypes.func
116+
}
117+
118+
KmsConceptSchemeSelector.defaultProps = {
119+
version: null,
120+
onSchemeSelect: () => {}
121+
}
122+
123+
export default KmsConceptSchemeSelector

0 commit comments

Comments
 (0)