11import { DefaultButton ,
2- DialogFooter ,
3- Dropdown ,
4- IDropdownOption ,
5- Label ,
6- MessageBar ,
7- PrimaryButton } from '@fluentui/react' ;
2+ DialogFooter ,
3+ Dropdown ,
4+ IDropdownOption ,
5+ Label ,
6+ MessageBar ,
7+ PrimaryButton } from '@fluentui/react' ;
88import { translateMessage } from '../../../../utils/translate-messages' ;
99import { useEffect , useState } from 'react' ;
1010import { IResourceLink } from '../../../../../types/resources' ;
@@ -19,97 +19,97 @@ interface EditScopePanelProps {
1919}
2020
2121const EditScopePanel : React . FC < EditScopePanelProps > = ( { closePopup } ) => {
22- const dispatch = useAppDispatch ( ) ;
23- const [ selectedItems , setSelectedItems ] = useState < IResourceLink [ ] > ( [ ] ) ;
24- const [ selectedScope , setSelectedScope ] = useState < PERMS_SCOPE | null > ( null ) ;
25- const [ dropdownKey , setDropdownKey ] = useState ( 0 ) ;
26- const [ pendingChanges , setPendingChanges ] = useState < IResourceLink [ ] > ( [ ] ) ;
27- const { collections, saved } = useAppSelector ( ( state ) => state . collections ) ;
28- const items = collections && collections . length > 0 ? collections . find ( k => k . isDefault ) ! . paths : [ ] ;
22+ const dispatch = useAppDispatch ( ) ;
23+ const [ selectedItems , setSelectedItems ] = useState < IResourceLink [ ] > ( [ ] ) ;
24+ const [ selectedScope , setSelectedScope ] = useState < PERMS_SCOPE | null > ( null ) ;
25+ const [ dropdownKey , setDropdownKey ] = useState ( 0 ) ;
26+ const [ pendingChanges , setPendingChanges ] = useState < IResourceLink [ ] > ( [ ] ) ;
27+ const { collections, saved } = useAppSelector ( ( state ) => state . collections ) ;
28+ const items = collections && collections . length > 0 ? collections . find ( k => k . isDefault ) ! . paths : [ ] ;
2929
30- useEffect ( ( ) => {
31- if ( saved ) {
32- setSelectedItems ( [ ] ) ;
33- setSelectedScope ( null ) ;
34- setPendingChanges ( [ ] ) ;
35- }
36- } , [ saved ] ) ;
30+ useEffect ( ( ) => {
31+ if ( saved ) {
32+ setSelectedItems ( [ ] ) ;
33+ setSelectedScope ( null ) ;
34+ setPendingChanges ( [ ] ) ;
35+ }
36+ } , [ saved ] ) ;
3737
38- const columns = [
39- { key : 'url' , name : 'URL' , fieldName : 'url' , minWidth : 300 , maxWidth : 1100 , isResizable : true } ,
40- { key : 'scope' , name : 'Scope' , fieldName : 'scope' , minWidth : 150 , maxWidth : 200 , isResizable : true }
41- ] ;
38+ const columns = [
39+ { key : 'url' , name : 'URL' , fieldName : 'url' , minWidth : 300 , maxWidth : 1100 , isResizable : true } ,
40+ { key : 'scope' , name : 'Scope' , fieldName : 'scope' , minWidth : 150 , maxWidth : 200 , isResizable : true }
41+ ] ;
4242
43- const handleScopeChange = ( _event : React . FormEvent < HTMLDivElement > , option ?: IDropdownOption ) => {
44- if ( ! option ) { return ; }
45- const newScope = option . key as PERMS_SCOPE ;
46- const updatedSelectedItems = selectedItems . map ( item => ( { ...item , scope : newScope } ) ) ;
47- setSelectedItems ( updatedSelectedItems ) ;
48- const newPendingChanges = [ ...pendingChanges ] ;
49- updatedSelectedItems . forEach ( updatedItem => {
50- const index = newPendingChanges . findIndex ( item => item . key === updatedItem . key ) ;
51- if ( index > - 1 ) {
52- newPendingChanges [ index ] = updatedItem ;
53- } else {
54- newPendingChanges . push ( updatedItem ) ;
55- }
56- } ) ;
57- setPendingChanges ( newPendingChanges ) ;
58- setSelectedScope ( null ) ;
59- setDropdownKey ( prevKey => prevKey + 1 ) ;
60- } ;
43+ const handleScopeChange = ( _event : React . FormEvent < HTMLDivElement > , option ?: IDropdownOption ) => {
44+ if ( ! option ) { return ; }
45+ const newScope = option . key as PERMS_SCOPE ;
46+ const updatedSelectedItems = selectedItems . map ( item => ( { ...item , scope : newScope } ) ) ;
47+ setSelectedItems ( updatedSelectedItems ) ;
48+ const newPendingChanges = [ ...pendingChanges ] ;
49+ updatedSelectedItems . forEach ( updatedItem => {
50+ const index = newPendingChanges . findIndex ( item => item . key === updatedItem . key ) ;
51+ if ( index > - 1 ) {
52+ newPendingChanges [ index ] = updatedItem ;
53+ } else {
54+ newPendingChanges . push ( updatedItem ) ;
55+ }
56+ } ) ;
57+ setPendingChanges ( newPendingChanges ) ;
58+ setSelectedScope ( null ) ;
59+ setDropdownKey ( prevKey => prevKey + 1 ) ;
60+ } ;
6161
62- const saveAllScopes = ( ) => {
63- if ( pendingChanges . length > 0 ) {
64- dispatch ( resetSaveState ( ) ) ;
62+ const saveAllScopes = ( ) => {
63+ if ( pendingChanges . length > 0 ) {
64+ dispatch ( resetSaveState ( ) ) ;
6565
66- const updatedItems = items . map ( item =>
67- pendingChanges . find ( changedItem => changedItem . key === item . key ) || item
68- ) ;
66+ const updatedItems = items . map ( item =>
67+ pendingChanges . find ( changedItem => changedItem . key === item . key ) || item
68+ ) ;
6969
70- dispatch ( updateResourcePaths ( updatedItems ) ) ;
71- }
72- } ;
70+ dispatch ( updateResourcePaths ( updatedItems ) ) ;
71+ }
72+ } ;
7373
74- return (
75- < >
76- < MessageBar isMultiline = { true } >
77- { translateMessage ( 'edit query scopes' ) }
78- < span style = { { fontWeight : 'bold' } } > { translateMessage ( 'Save all' ) } </ span >
79- </ MessageBar >
74+ return (
75+ < >
76+ < MessageBar isMultiline = { true } >
77+ { translateMessage ( 'edit query scopes' ) }
78+ < span style = { { fontWeight : 'bold' } } > { translateMessage ( 'Save all' ) } </ span >
79+ </ MessageBar >
8080
81- < div style = { { display : 'flex' , justifyContent : 'flex-end' , alignItems : 'center' , padding : '10px 0px' } } >
82- < Label style = { { marginRight : '16px' } } > { translateMessage ( 'Change scope to: ' ) } </ Label >
83- < Dropdown
84- key = { dropdownKey }
85- placeholder = { translateMessage ( '[Select one scope]' ) }
86- options = { scopeOptions . map ( option =>
87- ( { key : option . key , text : formatScopeLabel ( option . key as PERMS_SCOPE ) } ) ) }
88- onChange = { handleScopeChange }
89- selectedKey = { selectedScope }
90- disabled = { selectedItems . length === 0 }
91- styles = { { dropdown : { width : 200 } } }
92- />
93- </ div >
94- < div style = { { height : '80vh' } } >
95- < Paths
96- resources = { items . map ( item => pendingChanges . find ( change => change . key === item . key ) || item ) }
97- columns = { columns }
98- isSelectable = { true }
99- onSelectionChange = { ( selected ) => setSelectedItems ( selected as IResourceLink [ ] ) }
100- />
101- </ div >
81+ < div style = { { display : 'flex' , justifyContent : 'flex-end' , alignItems : 'center' , padding : '10px 0px' } } >
82+ < Label style = { { marginRight : '16px' } } > { translateMessage ( 'Change scope to: ' ) } </ Label >
83+ < Dropdown
84+ key = { dropdownKey }
85+ placeholder = { translateMessage ( '[Select one scope]' ) }
86+ options = { scopeOptions . map ( option =>
87+ ( { key : option . key , text : formatScopeLabel ( option . key as PERMS_SCOPE ) } ) ) }
88+ onChange = { handleScopeChange }
89+ selectedKey = { selectedScope }
90+ disabled = { selectedItems . length === 0 }
91+ styles = { { dropdown : { width : 200 } } }
92+ />
93+ </ div >
94+ < div style = { { height : '80vh' } } >
95+ < Paths
96+ resources = { items . map ( item => pendingChanges . find ( change => change . key === item . key ) || item ) }
97+ columns = { columns }
98+ isSelectable = { true }
99+ onSelectionChange = { ( selected ) => setSelectedItems ( selected as IResourceLink [ ] ) }
100+ />
101+ </ div >
102102
103- < DialogFooter styles = { { actionsRight : { bottom : 0 , justifyContent : 'start' } } } >
104- < PrimaryButton onClick = { saveAllScopes } disabled = { pendingChanges . length === 0 } >
105- { translateMessage ( 'Save all' ) }
106- </ PrimaryButton >
107- < DefaultButton onClick = { closePopup } >
108- { translateMessage ( 'Close' ) }
109- </ DefaultButton >
110- </ DialogFooter >
111- </ >
112- ) ;
103+ < DialogFooter styles = { { actionsRight : { bottom : 0 , justifyContent : 'start' } } } >
104+ < PrimaryButton onClick = { saveAllScopes } disabled = { pendingChanges . length === 0 } >
105+ { translateMessage ( 'Save all' ) }
106+ </ PrimaryButton >
107+ < DefaultButton onClick = { closePopup } >
108+ { translateMessage ( 'Close' ) }
109+ </ DefaultButton >
110+ </ DialogFooter >
111+ </ >
112+ ) ;
113113} ;
114114
115115export default EditScopePanel ;
0 commit comments