@@ -115,8 +115,16 @@ const TimetableBoardWrapper = ({
115115 [ selectedTimetableItemIds ]
116116 ) ;
117117
118+ const removeAndUnselectTrains = useCallback (
119+ ( timetableItemIds : TimetableItemId [ ] ) => {
120+ removeTimetableItems ( timetableItemIds ) ;
121+ setSelectedTimetableItemIds ( [ ] ) ;
122+ } ,
123+ [ removeTimetableItems , setSelectedTimetableItemIds ]
124+ ) ;
125+
118126 const ctrlC = useCallback (
119- ( event : KeyboardEvent < Element > ) => {
127+ ( event : KeyboardEvent ) => {
120128 if ( ! event . repeat && event . ctrlKey && event . key === 'c' ) {
121129 copyTimetableItemsToClipboard ( selectedTimetableItemIds , timetableItems ) ;
122130 }
@@ -125,7 +133,7 @@ const TimetableBoardWrapper = ({
125133 ) ;
126134
127135 const ctrlV = useCallback (
128- async ( event : KeyboardEvent < Element > ) => {
136+ async ( event : KeyboardEvent ) => {
129137 if ( ! event . repeat && event . ctrlKey && event . key === 'v' ) {
130138 const clipboardContent = await navigator . clipboard . readText ( ) ;
131139 const data = JSON . parse ( clipboardContent ) ;
@@ -143,6 +151,16 @@ const TimetableBoardWrapper = ({
143151 [ navigator . clipboard , timetableId ]
144152 ) ;
145153
154+ const ctrlX = useCallback (
155+ ( event : KeyboardEvent ) => {
156+ if ( ! event . repeat && event . ctrlKey && event . key === 'x' ) {
157+ copyTimetableItemsToClipboard ( selectedTimetableItemIds , timetableItems ) ;
158+ removeAndUnselectTrains ( selectedTimetableItemIds ) ;
159+ }
160+ } ,
161+ [ selectedTimetableItemIds , timetableItems ]
162+ ) ;
163+
146164 useEffect ( ( ) => {
147165 document . addEventListener ( 'keydown' , ctrlC ) ;
148166 return ( ) => document . removeEventListener ( 'keydown' , ctrlC ) ;
@@ -153,6 +171,11 @@ const TimetableBoardWrapper = ({
153171 return ( ) => document . removeEventListener ( 'keydown' , ctrlV ) ;
154172 } , [ ctrlV ] ) ;
155173
174+ useEffect ( ( ) => {
175+ document . addEventListener ( 'keydown' , ctrlX ) ;
176+ return ( ) => document . removeEventListener ( 'keydown' , ctrlX ) ;
177+ } , [ ctrlX ] ) ;
178+
156179 // --- BOARD WRAPPER TITLE MANAGEMENT -------------------------
157180 const computedItemLabel = useCallback ( ( ) => {
158181 if ( totalTrainScheduleCount === 0 && totalPacedTrainCount === 0 )
@@ -217,14 +240,6 @@ const TimetableBoardWrapper = ({
217240 }
218241 } ;
219242
220- const removeAndUnselectTrains = useCallback (
221- ( timetableItemIds : TimetableItemId [ ] ) => {
222- removeTimetableItems ( timetableItemIds ) ;
223- setSelectedTimetableItemIds ( [ ] ) ;
224- } ,
225- [ removeTimetableItems , setSelectedTimetableItemIds ]
226- ) ;
227-
228243 const handleTrainsDelete = async ( currentSelectedTrainId ?: TrainId ) => {
229244 const itemsCount = selectedTimetableItemIds . length ;
230245
0 commit comments