@@ -3,13 +3,15 @@ import { styled } from '@mui/material/styles';
33
44import { AppContext } from "../context/AppContext" ;
55
6+ import fileDownload from 'js-file-download' ;
7+
68import {
79 Button ,
810 DialogActions ,
911 DialogContent ,
1012 DialogContentText ,
11- DialogTitle ,
12- TextField ,
13+ DialogTitle , IconButton ,
14+ TextField , Tooltip ,
1315 Typography
1416} from "@mui/material" ;
1517import SkillCategoryCard from "../components/skill-category-card/SkillCategoryCard" ;
@@ -19,14 +21,15 @@ import {selectCsrfToken, selectOrderedSkills} from "../context/selectors";
1921import {
2022 createSkillCategory ,
2123 deleteSkillCategory ,
22- getSkillCategories
24+ getSkillCategories , getSkillsCsv
2325} from "../api/skillcategory" ;
2426import SkillCategoryNewDialog from "../components/skill-category-new-dialog/SkillCategoryNewDialog" ;
2527import { UPDATE_TOAST } from "../context/actions" ;
2628import Dialog from "@mui/material/Dialog" ;
2729import InputAdornment from "@mui/material/InputAdornment" ;
2830import { Search } from "@mui/icons-material" ;
2931import Autocomplete from "@mui/material/Autocomplete" ;
32+ import DownloadIcon from "@mui/icons-material/FileDownload" ;
3033
3134const PREFIX = 'SkillCategoriesPage' ;
3235const classes = {
@@ -110,6 +113,29 @@ const SkillCategoriesPage = () => {
110113 }
111114 }
112115
116+ const downloadSkills = useCallback ( async ( ) => {
117+ let res = await getSkillsCsv ( csrf ) ;
118+ if ( ! res . error && res . payload . data ) {
119+ fileDownload ( res . payload . data , "skill_records.csv" ) ;
120+ dispatch ( {
121+ type : UPDATE_TOAST ,
122+ payload : {
123+ severity : "success" ,
124+ toast : "Skills successfully exported"
125+ }
126+ } ) ;
127+ } else {
128+ dispatch ( {
129+ type : UPDATE_TOAST ,
130+ payload : {
131+ severity : "error" ,
132+ toast : "Failed to export skills"
133+ }
134+ } ) ;
135+ }
136+
137+ } , [ csrf , dispatch ] ) ;
138+
113139 const getFilteredCategories = useCallback ( ( ) => {
114140 if ( skillCategories ) {
115141 return skillCategories . filter ( category => {
@@ -136,6 +162,11 @@ const SkillCategoriesPage = () => {
136162 < div className = "skill-categories-header" >
137163 < Typography variant = "h4" > Skill Categories</ Typography >
138164 < div className = "skill-categories-actions" >
165+ < Tooltip title = "Download Skills" arrow >
166+ < IconButton onClick = { downloadSkills } >
167+ < DownloadIcon />
168+ </ IconButton >
169+ </ Tooltip >
139170 < TextField
140171 style = { { minWidth : "200px" } }
141172 label = "Search"
0 commit comments