@kartverket/backstage-plugin-risk-scorecard 2.1.5 → 2.1.6
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.
- package/dist/components/scenarioTable/ScenarioTable.esm.js +9 -2
- package/dist/components/scenarioTable/ScenarioTable.esm.js.map +1 -1
- package/dist/components/scenarioTable/ScenarioTableRow.esm.js +13 -5
- package/dist/components/scenarioTable/ScenarioTableRow.esm.js.map +1 -1
- package/dist/utils/hooks.esm.js +42 -14
- package/dist/utils/hooks.esm.js.map +1 -1
- package/package.json +1 -1
|
@@ -39,11 +39,17 @@ const ScenarioTable = ({ riSc }) => {
|
|
|
39
39
|
);
|
|
40
40
|
setTempScenarios([...updatedScenarios, ...scenariosNotInTemp]);
|
|
41
41
|
}, [riSc.scenarios, updateStatus.isSuccess]);
|
|
42
|
-
const
|
|
42
|
+
const moveRowLocal = (dragIndex, hoverIndex) => {
|
|
43
43
|
const updatedScenarios = [...tempScenarios];
|
|
44
44
|
const [removed] = updatedScenarios.splice(dragIndex, 1);
|
|
45
45
|
updatedScenarios.splice(hoverIndex, 0, removed);
|
|
46
46
|
setTempScenarios(updatedScenarios);
|
|
47
|
+
};
|
|
48
|
+
const moveRowFinal = (dragIndex, dropIndex) => {
|
|
49
|
+
const updatedScenarios = [...tempScenarios];
|
|
50
|
+
const [removed] = updatedScenarios.splice(dragIndex, 1);
|
|
51
|
+
updatedScenarios.splice(dropIndex, 0, removed);
|
|
52
|
+
setTempScenarios(updatedScenarios);
|
|
47
53
|
const updatedRiSc = {
|
|
48
54
|
...riSc,
|
|
49
55
|
scenarios: updatedScenarios
|
|
@@ -141,7 +147,8 @@ const ScenarioTable = ({ riSc }) => {
|
|
|
141
147
|
index: idx,
|
|
142
148
|
scenario,
|
|
143
149
|
viewRow: openScenarioDrawer,
|
|
144
|
-
|
|
150
|
+
moveRowFinal,
|
|
151
|
+
moveRowLocal,
|
|
145
152
|
isLastRow: idx === riSc.scenarios.length - 1,
|
|
146
153
|
isEditing
|
|
147
154
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScenarioTable.esm.js","sources":["../../../src/components/scenarioTable/ScenarioTable.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react';\nimport { Box, Button, Paper, Typography } from '@material-ui/core';\nimport TableRow from '@mui/material/TableRow';\nimport Table from '@mui/material/Table';\nimport TableBody from '@mui/material/TableBody';\nimport TableCell from '@mui/material/TableCell';\nimport TableContainer from '@mui/material/TableContainer';\nimport TableHead from '@mui/material/TableHead';\nimport { ScenarioTableRow } from './ScenarioTableRow';\nimport AddCircle from '@material-ui/icons/AddCircle';\nimport AddCircleOutlineIcon from '@material-ui/icons/AddCircleOutline';\nimport { useTableStyles } from './ScenarioTableStyles';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../utils/translations';\nimport { useScenario } from '../../contexts/ScenarioContext';\nimport { RiSc, RiScWithMetadata } from '../../utils/types';\nimport { useFontStyles } from '../../utils/style';\nimport { useRiScs } from '../../contexts/RiScContext';\nimport { DndProvider } from 'react-dnd';\nimport { HTML5Backend } from 'react-dnd-html5-backend';\nimport { CheckCircle, Edit } from '@mui/icons-material';\n\ninterface ScenarioTableProps {\n riSc: RiSc;\n}\n\nexport const ScenarioTable = ({ riSc }: ScenarioTableProps) => {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n const { label } = useFontStyles();\n const { titleBox, rowBorder, tableCell, tableCellTitle, tableCellDragIcon } =\n useTableStyles();\n const { openNewScenarioWizard, openScenarioDrawer } = useScenario();\n const [tempScenarios, setTempScenarios] = useState(riSc.scenarios);\n const { updateRiSc, updateStatus } = useRiScs();\n\n useEffect(() => {\n if (!updateStatus.isSuccess) {\n return;\n }\n const updatedScenarios = tempScenarios\n .map(scenario => {\n const ordered = riSc.scenarios.find(s => s.ID === scenario.ID);\n return ordered ? ordered : null;\n })\n .filter(scenario => scenario !== null) as RiSc['scenarios'];\n\n const scenariosNotInTemp = riSc.scenarios.filter(\n scenario => !updatedScenarios.find(s => s.ID === scenario.ID),\n );\n\n setTempScenarios([...updatedScenarios, ...scenariosNotInTemp]);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [riSc.scenarios, updateStatus.isSuccess]);\n\n const moveRow = (dragIndex: number, hoverIndex: number) => {\n const updatedScenarios = [...tempScenarios];\n const [removed] = updatedScenarios.splice(dragIndex, 1);\n updatedScenarios.splice(hoverIndex, 0, removed);\n setTempScenarios(updatedScenarios);\n\n const updatedRiSc = {\n ...riSc,\n scenarios: updatedScenarios,\n };\n\n updateRiSc(updatedRiSc, () => {});\n };\n\n const [isEditing, setIsEditing] = useState<boolean>(false);\n\n return (\n <>\n <Paper>\n <Box className={titleBox}>\n <Typography variant=\"h5\" style={{ padding: '1rem', marginBottom: 0 }}>\n {t('scenarioTable.title')}\n </Typography>\n\n {riSc.scenarios.length > 0 && (\n <Box\n style={{\n display: 'flex',\n justifyContent: 'flex-end',\n alignItems: 'center',\n paddingRight: '1rem',\n }}\n >\n <Button\n startIcon={<AddCircle />}\n variant=\"text\"\n color=\"primary\"\n onClick={openNewScenarioWizard}\n >\n {t('scenarioTable.addScenarioButton')}\n </Button>\n <Button\n startIcon={isEditing ? <CheckCircle /> : <Edit />}\n variant=\"text\"\n color=\"primary\"\n onClick={() =>\n isEditing ? setIsEditing(false) : setIsEditing(true)\n }\n >\n {isEditing\n ? t('scenarioTable.doneEditing')\n : t('scenarioTable.editButton')}\n </Button>\n </Box>\n )}\n </Box>\n {riSc.scenarios.length === 0 ? (\n <Box\n style={{\n display: 'flex',\n justifyContent: 'center',\n padding: '1rem',\n }}\n >\n <Button\n startIcon={<AddCircleOutlineIcon />}\n variant=\"contained\"\n color=\"primary\"\n onClick={openNewScenarioWizard}\n style={{\n display: 'flex',\n padding: '0.5rem 1rem 0.5rem 1rem',\n justifyContent: 'center',\n }}\n >\n {t('scenarioTable.addScenarioButton')}\n </Button>\n </Box>\n ) : (\n <>\n <TableContainer style={{ overflow: 'auto' }} component={Paper}>\n <Table>\n <TableHead style={{ whiteSpace: 'nowrap' }}>\n <TableRow className={rowBorder}>\n {isEditing && <TableCell className={tableCellDragIcon} />}\n <TableCell className={tableCellTitle}>\n <Typography\n className={label}\n style={{ paddingBottom: 0 }}\n >\n {t('dictionary.title')}\n </Typography>\n </TableCell>\n <TableCell className={tableCell}>\n <Typography\n className={label}\n style={{ paddingBottom: 0 }}\n >\n {t('dictionary.initialRisk')}\n </Typography>\n </TableCell>\n\n <TableCell className={tableCell}>\n <Typography\n className={label}\n style={{ paddingBottom: 0 }}\n >\n {t('dictionary.measures')}\n </Typography>\n </TableCell>\n <TableCell className={tableCell}>\n <Typography\n className={label}\n style={{ paddingBottom: 0 }}\n >\n {t('dictionary.restRisk')}\n </Typography>\n </TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {tempScenarios.map((scenario, idx) => (\n <ScenarioTableRow\n key={scenario.ID}\n index={idx}\n scenario={scenario}\n viewRow={openScenarioDrawer}\n moveRow={moveRow}\n isLastRow={idx === riSc.scenarios.length - 1}\n isEditing={isEditing}\n />\n ))}\n </TableBody>\n </Table>\n </TableContainer>\n </>\n )}\n </Paper>\n </>\n );\n};\n\ninterface ScenarioTableWrapperProps {\n riSc: RiScWithMetadata;\n}\n\nexport const ScenarioTableWrapper = ({ riSc }: ScenarioTableWrapperProps) => {\n return (\n <DndProvider backend={HTML5Backend}>\n <ScenarioTable key={riSc.id} riSc={riSc.content} />\n </DndProvider>\n );\n};\n"],"names":["React"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ScenarioTable.esm.js","sources":["../../../src/components/scenarioTable/ScenarioTable.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react';\nimport { Box, Button, Paper, Typography } from '@material-ui/core';\nimport TableRow from '@mui/material/TableRow';\nimport Table from '@mui/material/Table';\nimport TableBody from '@mui/material/TableBody';\nimport TableCell from '@mui/material/TableCell';\nimport TableContainer from '@mui/material/TableContainer';\nimport TableHead from '@mui/material/TableHead';\nimport { ScenarioTableRow } from './ScenarioTableRow';\nimport AddCircle from '@material-ui/icons/AddCircle';\nimport AddCircleOutlineIcon from '@material-ui/icons/AddCircleOutline';\nimport { useTableStyles } from './ScenarioTableStyles';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../utils/translations';\nimport { useScenario } from '../../contexts/ScenarioContext';\nimport { RiSc, RiScWithMetadata } from '../../utils/types';\nimport { useFontStyles } from '../../utils/style';\nimport { useRiScs } from '../../contexts/RiScContext';\nimport { DndProvider } from 'react-dnd';\nimport { HTML5Backend } from 'react-dnd-html5-backend';\nimport { CheckCircle, Edit } from '@mui/icons-material';\n\ninterface ScenarioTableProps {\n riSc: RiSc;\n}\n\nexport const ScenarioTable = ({ riSc }: ScenarioTableProps) => {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n const { label } = useFontStyles();\n const { titleBox, rowBorder, tableCell, tableCellTitle, tableCellDragIcon } =\n useTableStyles();\n const { openNewScenarioWizard, openScenarioDrawer } = useScenario();\n const [tempScenarios, setTempScenarios] = useState(riSc.scenarios);\n const { updateRiSc, updateStatus } = useRiScs();\n\n useEffect(() => {\n if (!updateStatus.isSuccess) {\n return;\n }\n const updatedScenarios = tempScenarios\n .map(scenario => {\n const ordered = riSc.scenarios.find(s => s.ID === scenario.ID);\n return ordered ? ordered : null;\n })\n .filter(scenario => scenario !== null) as RiSc['scenarios'];\n\n const scenariosNotInTemp = riSc.scenarios.filter(\n scenario => !updatedScenarios.find(s => s.ID === scenario.ID),\n );\n\n setTempScenarios([...updatedScenarios, ...scenariosNotInTemp]);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [riSc.scenarios, updateStatus.isSuccess]);\n\n const moveRowLocal = (dragIndex: number, hoverIndex: number) => {\n const updatedScenarios = [...tempScenarios];\n const [removed] = updatedScenarios.splice(dragIndex, 1);\n updatedScenarios.splice(hoverIndex, 0, removed);\n setTempScenarios(updatedScenarios);\n };\n\n const moveRowFinal = (dragIndex: number, dropIndex: number) => {\n const updatedScenarios = [...tempScenarios];\n const [removed] = updatedScenarios.splice(dragIndex, 1);\n updatedScenarios.splice(dropIndex, 0, removed);\n setTempScenarios(updatedScenarios);\n\n const updatedRiSc = {\n ...riSc,\n scenarios: updatedScenarios,\n };\n updateRiSc(updatedRiSc, () => {});\n };\n\n const [isEditing, setIsEditing] = useState<boolean>(false);\n\n return (\n <>\n <Paper>\n <Box className={titleBox}>\n <Typography variant=\"h5\" style={{ padding: '1rem', marginBottom: 0 }}>\n {t('scenarioTable.title')}\n </Typography>\n\n {riSc.scenarios.length > 0 && (\n <Box\n style={{\n display: 'flex',\n justifyContent: 'flex-end',\n alignItems: 'center',\n paddingRight: '1rem',\n }}\n >\n <Button\n startIcon={<AddCircle />}\n variant=\"text\"\n color=\"primary\"\n onClick={openNewScenarioWizard}\n >\n {t('scenarioTable.addScenarioButton')}\n </Button>\n <Button\n startIcon={isEditing ? <CheckCircle /> : <Edit />}\n variant=\"text\"\n color=\"primary\"\n onClick={() =>\n isEditing ? setIsEditing(false) : setIsEditing(true)\n }\n >\n {isEditing\n ? t('scenarioTable.doneEditing')\n : t('scenarioTable.editButton')}\n </Button>\n </Box>\n )}\n </Box>\n {riSc.scenarios.length === 0 ? (\n <Box\n style={{\n display: 'flex',\n justifyContent: 'center',\n padding: '1rem',\n }}\n >\n <Button\n startIcon={<AddCircleOutlineIcon />}\n variant=\"contained\"\n color=\"primary\"\n onClick={openNewScenarioWizard}\n style={{\n display: 'flex',\n padding: '0.5rem 1rem 0.5rem 1rem',\n justifyContent: 'center',\n }}\n >\n {t('scenarioTable.addScenarioButton')}\n </Button>\n </Box>\n ) : (\n <>\n <TableContainer style={{ overflow: 'auto' }} component={Paper}>\n <Table>\n <TableHead style={{ whiteSpace: 'nowrap' }}>\n <TableRow className={rowBorder}>\n {isEditing && <TableCell className={tableCellDragIcon} />}\n <TableCell className={tableCellTitle}>\n <Typography\n className={label}\n style={{ paddingBottom: 0 }}\n >\n {t('dictionary.title')}\n </Typography>\n </TableCell>\n <TableCell className={tableCell}>\n <Typography\n className={label}\n style={{ paddingBottom: 0 }}\n >\n {t('dictionary.initialRisk')}\n </Typography>\n </TableCell>\n\n <TableCell className={tableCell}>\n <Typography\n className={label}\n style={{ paddingBottom: 0 }}\n >\n {t('dictionary.measures')}\n </Typography>\n </TableCell>\n <TableCell className={tableCell}>\n <Typography\n className={label}\n style={{ paddingBottom: 0 }}\n >\n {t('dictionary.restRisk')}\n </Typography>\n </TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {tempScenarios.map((scenario, idx) => (\n <ScenarioTableRow\n key={scenario.ID}\n index={idx}\n scenario={scenario}\n viewRow={openScenarioDrawer}\n moveRowFinal={moveRowFinal}\n moveRowLocal={moveRowLocal}\n isLastRow={idx === riSc.scenarios.length - 1}\n isEditing={isEditing}\n />\n ))}\n </TableBody>\n </Table>\n </TableContainer>\n </>\n )}\n </Paper>\n </>\n );\n};\n\ninterface ScenarioTableWrapperProps {\n riSc: RiScWithMetadata;\n}\n\nexport const ScenarioTableWrapper = ({ riSc }: ScenarioTableWrapperProps) => {\n return (\n <DndProvider backend={HTML5Backend}>\n <ScenarioTable key={riSc.id} riSc={riSc.content} />\n </DndProvider>\n );\n};\n"],"names":["React"],"mappings":"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"}
|
|
@@ -15,7 +15,8 @@ const ScenarioTableRow = ({
|
|
|
15
15
|
scenario,
|
|
16
16
|
viewRow,
|
|
17
17
|
index,
|
|
18
|
-
|
|
18
|
+
moveRowFinal,
|
|
19
|
+
moveRowLocal,
|
|
19
20
|
isLastRow,
|
|
20
21
|
isEditing
|
|
21
22
|
}) => {
|
|
@@ -44,17 +45,24 @@ const ScenarioTableRow = ({
|
|
|
44
45
|
const isMovingDown = dragIndex < hoverIndex && hoverClientY < hoverMiddleY;
|
|
45
46
|
const isMovingUp = dragIndex > hoverIndex && hoverClientY > hoverMiddleY;
|
|
46
47
|
if (isMovingDown || isMovingUp) return;
|
|
47
|
-
|
|
48
|
+
moveRowLocal(dragIndex, hoverIndex);
|
|
48
49
|
item.index = hoverIndex;
|
|
49
50
|
}
|
|
50
51
|
});
|
|
51
|
-
const [{ isDragging }, drag, preview] = useDrag({
|
|
52
|
+
const [{ isDragging }, drag, preview] = useDrag(() => ({
|
|
52
53
|
type: "row",
|
|
53
|
-
item: { index },
|
|
54
|
+
item: { index, originalIndex: index },
|
|
55
|
+
end: (item, monitor) => {
|
|
56
|
+
if (monitor.didDrop()) {
|
|
57
|
+
const finalIndex = item.index;
|
|
58
|
+
const { originalIndex } = item;
|
|
59
|
+
moveRowFinal(originalIndex, finalIndex);
|
|
60
|
+
}
|
|
61
|
+
},
|
|
54
62
|
collect: (monitor) => ({
|
|
55
63
|
isDragging: monitor.isDragging()
|
|
56
64
|
})
|
|
57
|
-
});
|
|
65
|
+
}));
|
|
58
66
|
preview(drop(ref));
|
|
59
67
|
const remainingActions = scenario.actions.filter(
|
|
60
68
|
(a) => a.status !== "Completed"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScenarioTableRow.esm.js","sources":["../../../src/components/scenarioTable/ScenarioTableRow.tsx"],"sourcesContent":["import React, { useRef } from 'react';\nimport { useDrag, useDrop } from 'react-dnd';\nimport TableRow from '@mui/material/TableRow';\nimport TableCell from '@mui/material/TableCell';\nimport { IconButton, Paper, Typography } from '@material-ui/core';\nimport DragIndicatorIcon from '@mui/icons-material/DragIndicator';\nimport { Scenario } from '../../utils/types';\nimport { useTableStyles } from './ScenarioTableStyles';\nimport {\n deleteScenario,\n getConsequenceLevel,\n getProbabilityLevel,\n getRiskMatrixColor,\n} from '../../utils/utilityfunctions';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../utils/translations';\nimport DeleteIcon from '@mui/icons-material/Delete';\nimport { useRiScs } from '../../contexts/RiScContext';\n\ninterface ScenarioTableRowProps {\n scenario: Scenario;\n viewRow: (id: string) => void;\n index: number;\n
|
|
1
|
+
{"version":3,"file":"ScenarioTableRow.esm.js","sources":["../../../src/components/scenarioTable/ScenarioTableRow.tsx"],"sourcesContent":["import React, { useRef } from 'react';\nimport { useDrag, useDrop } from 'react-dnd';\nimport TableRow from '@mui/material/TableRow';\nimport TableCell from '@mui/material/TableCell';\nimport { IconButton, Paper, Typography } from '@material-ui/core';\nimport DragIndicatorIcon from '@mui/icons-material/DragIndicator';\nimport { Scenario } from '../../utils/types';\nimport { useTableStyles } from './ScenarioTableStyles';\nimport {\n deleteScenario,\n getConsequenceLevel,\n getProbabilityLevel,\n getRiskMatrixColor,\n} from '../../utils/utilityfunctions';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../utils/translations';\nimport DeleteIcon from '@mui/icons-material/Delete';\nimport { useRiScs } from '../../contexts/RiScContext';\n\ninterface ScenarioTableRowProps {\n scenario: Scenario;\n viewRow: (id: string) => void;\n index: number;\n moveRowFinal: (dragIndex: number, dropIndex: number) => void;\n moveRowLocal: (dragIndex: number, hoverIndex: number) => void;\n isLastRow?: boolean;\n isEditing: boolean;\n}\n\nexport const ScenarioTableRow = ({\n scenario,\n viewRow,\n index,\n moveRowFinal,\n moveRowLocal,\n isLastRow,\n isEditing,\n}: ScenarioTableRowProps) => {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n const {\n riskColor,\n rowBackground,\n rowBorder,\n tableCell,\n tableCellTitle,\n tableCellContainer,\n } = useTableStyles();\n\n const { selectedRiSc: riSc, updateRiSc } = useRiScs();\n\n const ref = useRef<HTMLTableRowElement>(null);\n\n const [, drop] = useDrop({\n accept: 'row',\n hover(item: { index: number }, monitor) {\n if (!ref.current) return;\n\n const dragIndex = item.index;\n const hoverIndex = index;\n if (dragIndex === hoverIndex) return;\n\n const hoverBoundingRect = ref.current?.getBoundingClientRect();\n const hoverMiddleY =\n (hoverBoundingRect.bottom - hoverBoundingRect.top) / 2;\n const clientOffset = monitor.getClientOffset();\n const hoverClientY = clientOffset!.y - hoverBoundingRect.top;\n\n const isMovingDown =\n dragIndex < hoverIndex && hoverClientY < hoverMiddleY;\n const isMovingUp = dragIndex > hoverIndex && hoverClientY > hoverMiddleY;\n if (isMovingDown || isMovingUp) return;\n\n moveRowLocal(dragIndex, hoverIndex);\n\n item.index = hoverIndex;\n },\n });\n\n const [{ isDragging }, drag, preview] = useDrag(() => ({\n type: 'row',\n item: { index, originalIndex: index },\n\n end: (item, monitor) => {\n if (monitor.didDrop()) {\n const finalIndex = item.index;\n const { originalIndex } = item;\n\n moveRowFinal(originalIndex, finalIndex);\n }\n },\n\n collect: monitor => ({\n isDragging: monitor.isDragging(),\n }),\n }));\n\n preview(drop(ref));\n\n const remainingActions = scenario.actions.filter(\n a => a.status !== 'Completed',\n );\n\n return (\n <TableRow\n ref={ref}\n className={`${isLastRow ? undefined : rowBorder} ${rowBackground}`}\n onClick={() => viewRow(scenario.ID)}\n style={{ opacity: isDragging ? 0.5 : 1 }}\n >\n {isEditing && (\n <TableCell>\n <IconButton size=\"small\" ref={drag}>\n <DragIndicatorIcon\n aria-label=\"Drag\"\n sx={{ cursor: isDragging ? 'grabbing' : 'grab' }}\n />\n </IconButton>\n </TableCell>\n )}\n <TableCell className={tableCellTitle}>\n <Typography color=\"primary\" style={{ fontWeight: 600 }}>\n {scenario.title}\n </Typography>\n </TableCell>\n <TableCell className={tableCell}>\n <div className={tableCellContainer}>\n <Paper\n className={riskColor}\n style={{\n backgroundColor: getRiskMatrixColor(scenario.risk),\n }}\n />\n {t('scenarioTable.columns.probabilityChar')}:\n {getProbabilityLevel(scenario.risk)}{' '}\n {t('scenarioTable.columns.consequenceChar')}:\n {getConsequenceLevel(scenario.risk)}\n </div>\n </TableCell>\n <TableCell className={tableCell}>\n <div className={tableCellContainer}>\n {(() => {\n if (remainingActions.length > 0) {\n return (\n <>\n {remainingActions.length}{' '}\n {t('dictionary.planned').toLowerCase()}\n </>\n );\n }\n\n if (scenario.actions.length > 0) {\n return t('dictionary.completed');\n }\n\n return t('scenarioTable.noActions');\n })()}\n </div>\n </TableCell>\n <TableCell className={tableCell}>\n <div className={tableCellContainer}>\n <Paper\n className={riskColor}\n style={{\n backgroundColor: getRiskMatrixColor(scenario.remainingRisk),\n }}\n />\n {t('scenarioTable.columns.probabilityChar')}:\n {getProbabilityLevel(scenario.remainingRisk)}{' '}\n {t('scenarioTable.columns.consequenceChar')}:\n {getConsequenceLevel(scenario.remainingRisk)}\n </div>\n </TableCell>\n {isEditing && (\n <TableCell>\n <IconButton\n size=\"small\"\n onClick={() => deleteScenario(riSc, updateRiSc, scenario)}\n >\n <DeleteIcon />\n </IconButton>\n </TableCell>\n )}\n </TableRow>\n );\n};\n"],"names":["React"],"mappings":"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"}
|
package/dist/utils/hooks.esm.js
CHANGED
|
@@ -41,6 +41,8 @@ const useAuthenticatedFetch = () => {
|
|
|
41
41
|
return [submitResponse, displaySubmitResponse];
|
|
42
42
|
};
|
|
43
43
|
const [response, setResponse] = useResponse();
|
|
44
|
+
const configApi = useApi(configApiRef);
|
|
45
|
+
const isDevelopment = () => configApi.getString("auth.environment") === "development";
|
|
44
46
|
const fullyAuthenticatedFetch = (uri, method, onSuccess, onError, body) => {
|
|
45
47
|
Promise.all([
|
|
46
48
|
identityApi.getCredentials(),
|
|
@@ -116,22 +118,48 @@ const useAuthenticatedFetch = () => {
|
|
|
116
118
|
riScToDTOString(selectedRiSc.content, false, profile)
|
|
117
119
|
);
|
|
118
120
|
});
|
|
119
|
-
const fetchRiScs = (onSuccess, onError) =>
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
121
|
+
const fetchRiScs = (onSuccess, onError) => {
|
|
122
|
+
if (isDevelopment()) {
|
|
123
|
+
fullyAuthenticatedFetch(
|
|
124
|
+
uriToFetchAllRiScs,
|
|
125
|
+
"GET",
|
|
126
|
+
onSuccess,
|
|
127
|
+
(_, rejectedLogin) => {
|
|
128
|
+
if (onError) onError(rejectedLogin);
|
|
129
|
+
}
|
|
130
|
+
);
|
|
131
|
+
} else {
|
|
132
|
+
googleAuthenticatedFetch(
|
|
133
|
+
uriToFetchAllRiScs,
|
|
134
|
+
"GET",
|
|
135
|
+
onSuccess,
|
|
136
|
+
(_, rejectedLogin) => {
|
|
137
|
+
if (onError) onError(rejectedLogin);
|
|
138
|
+
}
|
|
139
|
+
);
|
|
125
140
|
}
|
|
126
|
-
|
|
127
|
-
const fetchSopsConfig = (onSuccess, onError) =>
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
141
|
+
};
|
|
142
|
+
const fetchSopsConfig = (onSuccess, onError) => {
|
|
143
|
+
if (isDevelopment()) {
|
|
144
|
+
fullyAuthenticatedFetch(
|
|
145
|
+
sopsUri,
|
|
146
|
+
"GET",
|
|
147
|
+
(res) => onSuccess(res),
|
|
148
|
+
(error, rejectedLogin) => {
|
|
149
|
+
if (onError) onError(error, rejectedLogin);
|
|
150
|
+
}
|
|
151
|
+
);
|
|
152
|
+
} else {
|
|
153
|
+
googleAuthenticatedFetch(
|
|
154
|
+
sopsUri,
|
|
155
|
+
"GET",
|
|
156
|
+
(res) => onSuccess(res),
|
|
157
|
+
(error, rejectedLogin) => {
|
|
158
|
+
if (onError) onError(error, rejectedLogin);
|
|
159
|
+
}
|
|
160
|
+
);
|
|
133
161
|
}
|
|
134
|
-
|
|
162
|
+
};
|
|
135
163
|
const putSopsConfig = (sopsConfig, onSuccess, onError) => fullyAuthenticatedFetch(
|
|
136
164
|
sopsUri,
|
|
137
165
|
"PUT",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.esm.js","sources":["../../src/utils/hooks.ts"],"sourcesContent":["import { useEntity } from '@backstage/plugin-catalog-react';\nimport { useCallback, useState, useEffect, useRef } from 'react';\nimport {\n configApiRef,\n fetchApiRef,\n githubAuthApiRef,\n googleAuthApiRef,\n identityApiRef,\n useApi,\n} from '@backstage/core-plugin-api';\nimport {\n DifferenceDTO,\n GithubRepoInfo,\n RiSc,\n RiScWithMetadata,\n SubmitResponseObject,\n} from './types';\nimport {\n CreateRiScResultDTO,\n OpenPullRequestForSopsConfigResponseBody,\n ProcessRiScResultDTO,\n profileInfoToDTOString,\n PublishRiScResultDTO,\n RiScContentResultDTO,\n riScToDTOString,\n SopsConfigCreateResponse,\n SopsConfigRequestBody,\n SopsConfigResultDTO,\n sopsConfigToDTOString,\n SopsConfigUpdateResponse,\n} from './DTOs';\nimport { latestSupportedVersion } from './constants';\n\nexport const useGithubRepositoryInformation = (): GithubRepoInfo => {\n const [, org, repo] =\n useEntity().entity.metadata.annotations?.['backstage.io/view-url'].match(\n /github\\.com\\/([^\\/]+)\\/([^\\/]+)/,\n ) || [];\n\n return {\n owner: org,\n name: repo,\n };\n};\n\nexport const useAuthenticatedFetch = () => {\n const repoInformation = useGithubRepositoryInformation();\n const googleApi = useApi(googleAuthApiRef);\n const gitHubApi = useApi(githubAuthApiRef);\n const identityApi = useApi(identityApiRef);\n const { fetch } = useApi(fetchApiRef);\n const backendUrl = useApi(configApiRef).getString('backend.baseUrl');\n const riScUri = `${backendUrl}/api/proxy/risc-proxy/api/risc/${repoInformation.owner}/${repoInformation.name}`;\n const sopsUri = `${backendUrl}/api/proxy/risc-proxy/api/sops/${repoInformation.owner}/${repoInformation.name}`;\n const openPullRequestForSopsConfigUri = (branch: string) =>\n `${sopsUri}/openPullRequest/${branch}`;\n const uriToFetchAllRiScs = `${riScUri}/${latestSupportedVersion}/all`;\n const uriToFetchDifference = (id: string) => `${riScUri}/${id}/difference`;\n const uriToFetchRiSc = (id: string) => `${riScUri}/${id}`;\n const uriToPublishRiSc = (id: string) => `${riScUri}/publish/${id}`;\n\n const useResponse = (): [\n SubmitResponseObject | null,\n (submitStatus: SubmitResponseObject | null) => void,\n ] => {\n const [submitResponse, setSubmitResponse] =\n useState<SubmitResponseObject | null>(null);\n // use callback to avoid infinite loop\n const displaySubmitResponse = useCallback(\n (submitStatus: SubmitResponseObject | null) => {\n setSubmitResponse(submitStatus);\n setTimeout(() => {\n setSubmitResponse(null);\n }, 10000);\n },\n [],\n );\n\n return [submitResponse, displaySubmitResponse];\n };\n\n const [response, setResponse] = useResponse();\n\n const fullyAuthenticatedFetch = <T, K>(\n uri: string,\n method: 'POST' | 'PUT',\n onSuccess: (response: T) => void,\n onError: (error: K, rejectedLogin: boolean) => void,\n body?: string,\n ) => {\n Promise.all([\n identityApi.getCredentials(),\n googleApi.getAccessToken([\n 'https://www.googleapis.com/auth/cloudkms',\n 'https://www.googleapis.com/auth/cloud-platform',\n 'https://www.googleapis.com/auth/cloudplatformprojects.readonly',\n ]),\n gitHubApi.getAccessToken(['repo']),\n ])\n .then(([idToken, googleAccessToken, gitHubAccessToken]) => {\n fetch(uri, {\n method: method,\n headers: {\n Authorization: `Bearer ${idToken.token}`,\n 'GCP-Access-Token': googleAccessToken,\n 'GitHub-Access-Token': gitHubAccessToken,\n 'Content-Type': 'application/json',\n },\n body: body,\n }).then(res => {\n if (!res.ok) {\n return res\n .json()\n .then(json => json as K)\n .then(typedJson => onError(typedJson, false))\n .catch(error => onError(error, false));\n }\n return res\n .json()\n .then(json => json as T)\n .then(typedJson => onSuccess(typedJson));\n });\n })\n .catch(error => {\n if (error.name === 'RejectedError') {\n onError(error, true);\n } else {\n onError(error, false);\n }\n });\n };\n\n const googleAuthenticatedFetch = <T, K>(\n uri: string,\n method: 'GET',\n onSuccess: (response: T) => void,\n onError: (error: K, rejectedLogin: boolean) => void,\n body?: string,\n ) => {\n Promise.all([\n identityApi.getCredentials(),\n googleApi.getAccessToken([\n 'https://www.googleapis.com/auth/cloudkms',\n 'https://www.googleapis.com/auth/cloud-platform',\n 'https://www.googleapis.com/auth/cloudplatformprojects.readonly',\n ]),\n ])\n .then(([idToken, googleAccessToken]) => {\n fetch(uri, {\n method: method,\n headers: {\n Authorization: `Bearer ${idToken.token}`,\n 'GCP-Access-Token': googleAccessToken,\n 'Content-Type': 'application/json',\n },\n body: body,\n }).then(res => {\n if (!res.ok) {\n return res\n .json()\n .then(json => json as K)\n .then(typedJson => onError(typedJson, false))\n .catch(error => onError(error, false));\n }\n return res\n .json()\n .then(json => json as T)\n .then(typedJson => onSuccess(typedJson));\n });\n })\n .catch(error => {\n if (error.name === 'RejectedError') {\n onError(error, true);\n } else {\n onError(error, false);\n }\n });\n };\n\n const fetchDifference = (\n selectedRiSc: RiScWithMetadata,\n onSuccess: (response: DifferenceDTO) => void,\n onError?: (loginRejected: boolean) => void,\n ) =>\n identityApi.getProfileInfo().then(profile => {\n fullyAuthenticatedFetch<DifferenceDTO, DifferenceDTO>(\n uriToFetchDifference(selectedRiSc.id),\n 'POST',\n onSuccess,\n (_, rejectedLogin) => {\n if (onError) onError(rejectedLogin);\n },\n riScToDTOString(selectedRiSc.content, false, profile),\n );\n });\n\n const fetchRiScs = (\n onSuccess: (response: RiScContentResultDTO[]) => void,\n onError?: (loginRejected: boolean) => void,\n ) =>\n googleAuthenticatedFetch<RiScContentResultDTO[], RiScContentResultDTO[]>(\n uriToFetchAllRiScs,\n 'GET',\n onSuccess,\n (_, rejectedLogin) => {\n if (onError) onError(rejectedLogin);\n },\n );\n\n const fetchSopsConfig = (\n onSuccess: (response: SopsConfigResultDTO) => void,\n onError?: (error: SopsConfigResultDTO, loginRejected: boolean) => void,\n ) =>\n googleAuthenticatedFetch<SopsConfigResultDTO, SopsConfigResultDTO>(\n sopsUri,\n 'GET',\n res => onSuccess(res),\n (error, rejectedLogin) => {\n if (onError) onError(error, rejectedLogin);\n },\n );\n\n const putSopsConfig = (\n sopsConfig: SopsConfigRequestBody,\n onSuccess: (response: SopsConfigCreateResponse) => void,\n onError?: (error: ProcessRiScResultDTO, loginRejected: boolean) => void,\n ) =>\n fullyAuthenticatedFetch<SopsConfigCreateResponse, SopsConfigCreateResponse>(\n sopsUri,\n 'PUT',\n res => {\n setResponse(res);\n if (onSuccess) onSuccess(res);\n },\n (error, rejectedLogin) => {\n if (onError) onError(error, rejectedLogin);\n },\n sopsConfigToDTOString(sopsConfig),\n );\n\n const postSopsConfig = (\n sopsConfig: SopsConfigRequestBody,\n branch: string,\n onSuccess: (response: SopsConfigUpdateResponse) => void,\n onError?: (error: ProcessRiScResultDTO, loginRejected: boolean) => void,\n ) =>\n fullyAuthenticatedFetch<SopsConfigUpdateResponse, ProcessRiScResultDTO>(\n `${sopsUri}?ref=${branch}`,\n 'POST',\n res => {\n setResponse(res);\n if (onSuccess) onSuccess(res);\n },\n (error, rejectedLogin) => {\n if (onError) onError(error, rejectedLogin);\n },\n sopsConfigToDTOString(sopsConfig),\n );\n\n const postOpenPullRequestForSopsConfig = (\n branch: string,\n onSuccess: (response: OpenPullRequestForSopsConfigResponseBody) => void,\n onError?: (error: ProcessRiScResultDTO, loginRejected: boolean) => void,\n ) =>\n fullyAuthenticatedFetch<\n OpenPullRequestForSopsConfigResponseBody,\n ProcessRiScResultDTO\n >(\n openPullRequestForSopsConfigUri(branch),\n 'POST',\n res => {\n setResponse(res);\n if (onSuccess) onSuccess(res);\n },\n (error, rejectedLogin) => {\n if (onError) onError(error, rejectedLogin);\n },\n );\n\n const publishRiScs = (\n riScId: string,\n onSuccess?: (response: PublishRiScResultDTO) => void,\n onError?: (error: ProcessRiScResultDTO, loginRejected: boolean) => void,\n ) =>\n identityApi.getProfileInfo().then(profile =>\n fullyAuthenticatedFetch<PublishRiScResultDTO, ProcessRiScResultDTO>(\n uriToPublishRiSc(riScId),\n 'POST',\n res => {\n setResponse(res);\n if (onSuccess) onSuccess(res);\n },\n (error, rejectedLogin) => {\n if (onError) onError(error, rejectedLogin);\n },\n profileInfoToDTOString(profile),\n ),\n );\n\n const postRiScs = (\n riSc: RiSc,\n generateDefault: boolean,\n onSuccess?: (response: CreateRiScResultDTO) => void,\n onError?: (error: ProcessRiScResultDTO, loginRejected: boolean) => void,\n ) =>\n identityApi.getProfileInfo().then(profile =>\n fullyAuthenticatedFetch<CreateRiScResultDTO, ProcessRiScResultDTO>(\n `${riScUri}?generateDefault=${generateDefault}`,\n 'POST',\n res => {\n setResponse(res);\n if (onSuccess) onSuccess(res);\n },\n (error, rejectedLogin) => {\n if (onError) onError(error, rejectedLogin);\n },\n riScToDTOString(riSc, true, profile),\n ),\n );\n\n const putRiScs = (\n riSc: RiScWithMetadata,\n onSuccess?: (response: ProcessRiScResultDTO | PublishRiScResultDTO) => void,\n onError?: (error: ProcessRiScResultDTO, loginRejected: boolean) => void,\n ) => {\n identityApi.getProfileInfo().then(profile =>\n fullyAuthenticatedFetch<\n ProcessRiScResultDTO | PublishRiScResultDTO,\n ProcessRiScResultDTO\n >(\n uriToFetchRiSc(riSc.id),\n 'PUT',\n res => {\n setResponse(res);\n if (onSuccess) onSuccess(res);\n },\n (error, rejectedLogin) => {\n if (onError) onError(error, rejectedLogin);\n },\n riScToDTOString(riSc.content, riSc.isRequiresNewApproval!!, profile),\n ),\n );\n };\n\n return {\n fetchRiScs,\n fetchSopsConfig,\n postRiScs,\n putRiScs,\n publishRiScs,\n response,\n setResponse,\n fetchDifference,\n putSopsConfig,\n postSopsConfig,\n postOpenPullRequestForSopsConfig,\n };\n};\n\nexport const useIsMounted = () => {\n const mountedRef = useRef(false);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n return useCallback(() => mountedRef.current, []);\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hooks.esm.js","sources":["../../src/utils/hooks.ts"],"sourcesContent":["import { useEntity } from '@backstage/plugin-catalog-react';\nimport { useCallback, useState, useEffect, useRef } from 'react';\nimport {\n configApiRef,\n fetchApiRef,\n githubAuthApiRef,\n googleAuthApiRef,\n identityApiRef,\n useApi,\n} from '@backstage/core-plugin-api';\nimport {\n DifferenceDTO,\n GithubRepoInfo,\n RiSc,\n RiScWithMetadata,\n SubmitResponseObject,\n} from './types';\nimport {\n CreateRiScResultDTO,\n OpenPullRequestForSopsConfigResponseBody,\n ProcessRiScResultDTO,\n profileInfoToDTOString,\n PublishRiScResultDTO,\n RiScContentResultDTO,\n riScToDTOString,\n SopsConfigCreateResponse,\n SopsConfigRequestBody,\n SopsConfigResultDTO,\n sopsConfigToDTOString,\n SopsConfigUpdateResponse,\n} from './DTOs';\nimport { latestSupportedVersion } from './constants';\n\nexport const useGithubRepositoryInformation = (): GithubRepoInfo => {\n const [, org, repo] =\n useEntity().entity.metadata.annotations?.['backstage.io/view-url'].match(\n /github\\.com\\/([^\\/]+)\\/([^\\/]+)/,\n ) || [];\n\n return {\n owner: org,\n name: repo,\n };\n};\n\nexport const useAuthenticatedFetch = () => {\n const repoInformation = useGithubRepositoryInformation();\n const googleApi = useApi(googleAuthApiRef);\n const gitHubApi = useApi(githubAuthApiRef);\n const identityApi = useApi(identityApiRef);\n const { fetch } = useApi(fetchApiRef);\n const backendUrl = useApi(configApiRef).getString('backend.baseUrl');\n const riScUri = `${backendUrl}/api/proxy/risc-proxy/api/risc/${repoInformation.owner}/${repoInformation.name}`;\n const sopsUri = `${backendUrl}/api/proxy/risc-proxy/api/sops/${repoInformation.owner}/${repoInformation.name}`;\n const openPullRequestForSopsConfigUri = (branch: string) =>\n `${sopsUri}/openPullRequest/${branch}`;\n const uriToFetchAllRiScs = `${riScUri}/${latestSupportedVersion}/all`;\n const uriToFetchDifference = (id: string) => `${riScUri}/${id}/difference`;\n const uriToFetchRiSc = (id: string) => `${riScUri}/${id}`;\n const uriToPublishRiSc = (id: string) => `${riScUri}/publish/${id}`;\n\n const useResponse = (): [\n SubmitResponseObject | null,\n (submitStatus: SubmitResponseObject | null) => void,\n ] => {\n const [submitResponse, setSubmitResponse] =\n useState<SubmitResponseObject | null>(null);\n // use callback to avoid infinite loop\n const displaySubmitResponse = useCallback(\n (submitStatus: SubmitResponseObject | null) => {\n setSubmitResponse(submitStatus);\n setTimeout(() => {\n setSubmitResponse(null);\n }, 10000);\n },\n [],\n );\n\n return [submitResponse, displaySubmitResponse];\n };\n\n const [response, setResponse] = useResponse();\n\n const configApi = useApi(configApiRef);\n const isDevelopment = () =>\n configApi.getString('auth.environment') === 'development';\n\n const fullyAuthenticatedFetch = <T, K>(\n uri: string,\n method: 'GET' | 'POST' | 'PUT',\n onSuccess: (response: T) => void,\n onError: (error: K, rejectedLogin: boolean) => void,\n body?: string,\n ) => {\n Promise.all([\n identityApi.getCredentials(),\n googleApi.getAccessToken([\n 'https://www.googleapis.com/auth/cloudkms',\n 'https://www.googleapis.com/auth/cloud-platform',\n 'https://www.googleapis.com/auth/cloudplatformprojects.readonly',\n ]),\n gitHubApi.getAccessToken(['repo']),\n ])\n .then(([idToken, googleAccessToken, gitHubAccessToken]) => {\n fetch(uri, {\n method: method,\n headers: {\n Authorization: `Bearer ${idToken.token}`,\n 'GCP-Access-Token': googleAccessToken,\n 'GitHub-Access-Token': gitHubAccessToken,\n 'Content-Type': 'application/json',\n },\n body: body,\n }).then(res => {\n if (!res.ok) {\n return res\n .json()\n .then(json => json as K)\n .then(typedJson => onError(typedJson, false))\n .catch(error => onError(error, false));\n }\n return res\n .json()\n .then(json => json as T)\n .then(typedJson => onSuccess(typedJson));\n });\n })\n .catch(error => {\n if (error.name === 'RejectedError') {\n onError(error, true);\n } else {\n onError(error, false);\n }\n });\n };\n\n const googleAuthenticatedFetch = <T, K>(\n uri: string,\n method: 'GET',\n onSuccess: (response: T) => void,\n onError: (error: K, rejectedLogin: boolean) => void,\n body?: string,\n ) => {\n Promise.all([\n identityApi.getCredentials(),\n googleApi.getAccessToken([\n 'https://www.googleapis.com/auth/cloudkms',\n 'https://www.googleapis.com/auth/cloud-platform',\n 'https://www.googleapis.com/auth/cloudplatformprojects.readonly',\n ]),\n ])\n .then(([idToken, googleAccessToken]) => {\n fetch(uri, {\n method: method,\n headers: {\n Authorization: `Bearer ${idToken.token}`,\n 'GCP-Access-Token': googleAccessToken,\n 'Content-Type': 'application/json',\n },\n body: body,\n }).then(res => {\n if (!res.ok) {\n return res\n .json()\n .then(json => json as K)\n .then(typedJson => onError(typedJson, false))\n .catch(error => onError(error, false));\n }\n return res\n .json()\n .then(json => json as T)\n .then(typedJson => onSuccess(typedJson));\n });\n })\n .catch(error => {\n if (error.name === 'RejectedError') {\n onError(error, true);\n } else {\n onError(error, false);\n }\n });\n };\n\n const fetchDifference = (\n selectedRiSc: RiScWithMetadata,\n onSuccess: (response: DifferenceDTO) => void,\n onError?: (loginRejected: boolean) => void,\n ) =>\n identityApi.getProfileInfo().then(profile => {\n fullyAuthenticatedFetch<DifferenceDTO, DifferenceDTO>(\n uriToFetchDifference(selectedRiSc.id),\n 'POST',\n onSuccess,\n (_, rejectedLogin) => {\n if (onError) onError(rejectedLogin);\n },\n riScToDTOString(selectedRiSc.content, false, profile),\n );\n });\n\n const fetchRiScs = (\n onSuccess: (response: RiScContentResultDTO[]) => void,\n onError?: (loginRejected: boolean) => void,\n ) => {\n if (isDevelopment()) {\n fullyAuthenticatedFetch<RiScContentResultDTO[], RiScContentResultDTO[]>(\n uriToFetchAllRiScs,\n 'GET',\n onSuccess,\n (_, rejectedLogin) => {\n if (onError) onError(rejectedLogin);\n },\n );\n } else {\n googleAuthenticatedFetch<RiScContentResultDTO[], RiScContentResultDTO[]>(\n uriToFetchAllRiScs,\n 'GET',\n onSuccess,\n (_, rejectedLogin) => {\n if (onError) onError(rejectedLogin);\n },\n );\n }\n };\n\n const fetchSopsConfig = (\n onSuccess: (response: SopsConfigResultDTO) => void,\n onError?: (error: SopsConfigResultDTO, loginRejected: boolean) => void,\n ) => {\n if (isDevelopment()) {\n fullyAuthenticatedFetch<SopsConfigResultDTO, SopsConfigResultDTO>(\n sopsUri,\n 'GET',\n res => onSuccess(res),\n (error, rejectedLogin) => {\n if (onError) onError(error, rejectedLogin);\n },\n );\n } else {\n googleAuthenticatedFetch<SopsConfigResultDTO, SopsConfigResultDTO>(\n sopsUri,\n 'GET',\n res => onSuccess(res),\n (error, rejectedLogin) => {\n if (onError) onError(error, rejectedLogin);\n },\n );\n }\n };\n\n const putSopsConfig = (\n sopsConfig: SopsConfigRequestBody,\n onSuccess: (response: SopsConfigCreateResponse) => void,\n onError?: (error: ProcessRiScResultDTO, loginRejected: boolean) => void,\n ) =>\n fullyAuthenticatedFetch<SopsConfigCreateResponse, SopsConfigCreateResponse>(\n sopsUri,\n 'PUT',\n res => {\n setResponse(res);\n if (onSuccess) onSuccess(res);\n },\n (error, rejectedLogin) => {\n if (onError) onError(error, rejectedLogin);\n },\n sopsConfigToDTOString(sopsConfig),\n );\n\n const postSopsConfig = (\n sopsConfig: SopsConfigRequestBody,\n branch: string,\n onSuccess: (response: SopsConfigUpdateResponse) => void,\n onError?: (error: ProcessRiScResultDTO, loginRejected: boolean) => void,\n ) =>\n fullyAuthenticatedFetch<SopsConfigUpdateResponse, ProcessRiScResultDTO>(\n `${sopsUri}?ref=${branch}`,\n 'POST',\n res => {\n setResponse(res);\n if (onSuccess) onSuccess(res);\n },\n (error, rejectedLogin) => {\n if (onError) onError(error, rejectedLogin);\n },\n sopsConfigToDTOString(sopsConfig),\n );\n\n const postOpenPullRequestForSopsConfig = (\n branch: string,\n onSuccess: (response: OpenPullRequestForSopsConfigResponseBody) => void,\n onError?: (error: ProcessRiScResultDTO, loginRejected: boolean) => void,\n ) =>\n fullyAuthenticatedFetch<\n OpenPullRequestForSopsConfigResponseBody,\n ProcessRiScResultDTO\n >(\n openPullRequestForSopsConfigUri(branch),\n 'POST',\n res => {\n setResponse(res);\n if (onSuccess) onSuccess(res);\n },\n (error, rejectedLogin) => {\n if (onError) onError(error, rejectedLogin);\n },\n );\n\n const publishRiScs = (\n riScId: string,\n onSuccess?: (response: PublishRiScResultDTO) => void,\n onError?: (error: ProcessRiScResultDTO, loginRejected: boolean) => void,\n ) =>\n identityApi.getProfileInfo().then(profile =>\n fullyAuthenticatedFetch<PublishRiScResultDTO, ProcessRiScResultDTO>(\n uriToPublishRiSc(riScId),\n 'POST',\n res => {\n setResponse(res);\n if (onSuccess) onSuccess(res);\n },\n (error, rejectedLogin) => {\n if (onError) onError(error, rejectedLogin);\n },\n profileInfoToDTOString(profile),\n ),\n );\n\n const postRiScs = (\n riSc: RiSc,\n generateDefault: boolean,\n onSuccess?: (response: CreateRiScResultDTO) => void,\n onError?: (error: ProcessRiScResultDTO, loginRejected: boolean) => void,\n ) =>\n identityApi.getProfileInfo().then(profile =>\n fullyAuthenticatedFetch<CreateRiScResultDTO, ProcessRiScResultDTO>(\n `${riScUri}?generateDefault=${generateDefault}`,\n 'POST',\n res => {\n setResponse(res);\n if (onSuccess) onSuccess(res);\n },\n (error, rejectedLogin) => {\n if (onError) onError(error, rejectedLogin);\n },\n riScToDTOString(riSc, true, profile),\n ),\n );\n\n const putRiScs = (\n riSc: RiScWithMetadata,\n onSuccess?: (response: ProcessRiScResultDTO | PublishRiScResultDTO) => void,\n onError?: (error: ProcessRiScResultDTO, loginRejected: boolean) => void,\n ) => {\n identityApi.getProfileInfo().then(profile =>\n fullyAuthenticatedFetch<\n ProcessRiScResultDTO | PublishRiScResultDTO,\n ProcessRiScResultDTO\n >(\n uriToFetchRiSc(riSc.id),\n 'PUT',\n res => {\n setResponse(res);\n if (onSuccess) onSuccess(res);\n },\n (error, rejectedLogin) => {\n if (onError) onError(error, rejectedLogin);\n },\n riScToDTOString(riSc.content, riSc.isRequiresNewApproval!!, profile),\n ),\n );\n };\n\n return {\n fetchRiScs,\n fetchSopsConfig,\n postRiScs,\n putRiScs,\n publishRiScs,\n response,\n setResponse,\n fetchDifference,\n putSopsConfig,\n postSopsConfig,\n postOpenPullRequestForSopsConfig,\n };\n};\n\nexport const useIsMounted = () => {\n const mountedRef = useRef(false);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n return useCallback(() => mountedRef.current, []);\n};\n"],"names":[],"mappings":"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"}
|