@@ -325,6 +325,98 @@ function createItemStore() {
325325 } )
326326 }
327327
328+ function indentSelected ( ) {
329+ const sel = get ( selection )
330+ if ( sel . size === 0 ) return
331+
332+ const rootItems = get ( items )
333+ const zoomId = get ( zoomedItemId )
334+ const root = zoomId ? findItem ( rootItems , zoomId ) || rootItems : rootItems
335+ const flat = flattenVisibleTree ( root )
336+
337+ const idsInOrder = flat . filter ( item => sel . has ( item . id ) ) . map ( item => item . id )
338+
339+ for ( const id of idsInOrder ) {
340+ indentItem ( id )
341+ }
342+ }
343+
344+ function outdentSelected ( ) {
345+ const sel = get ( selection )
346+ if ( sel . size === 0 ) return
347+
348+ const rootItems = get ( items )
349+ const zoomId = get ( zoomedItemId )
350+ const root = zoomId ? findItem ( rootItems , zoomId ) || rootItems : rootItems
351+ const flat = flattenVisibleTree ( root )
352+
353+ const idsInOrder = flat . filter ( item => sel . has ( item . id ) ) . map ( item => item . id )
354+
355+ for ( const id of [ ...idsInOrder ] . reverse ( ) ) {
356+ outdentItem ( id )
357+ }
358+ }
359+
360+ function moveItemUp ( id ) {
361+ updateItems ( root => {
362+ const parent = findParent ( root , id )
363+ if ( ! parent ?. children ) return
364+
365+ const idx = findItemIndex ( parent , id )
366+ if ( idx <= 0 ) return
367+
368+ const temp = parent . children [ idx ]
369+ parent . children [ idx ] = parent . children [ idx - 1 ]
370+ parent . children [ idx - 1 ] = temp
371+ } )
372+ }
373+
374+ function moveItemDown ( id ) {
375+ updateItems ( root => {
376+ const parent = findParent ( root , id )
377+ if ( ! parent ?. children ) return
378+
379+ const idx = findItemIndex ( parent , id )
380+ if ( idx < 0 || idx >= parent . children . length - 1 ) return
381+
382+ const temp = parent . children [ idx ]
383+ parent . children [ idx ] = parent . children [ idx + 1 ]
384+ parent . children [ idx + 1 ] = temp
385+ } )
386+ }
387+
388+ function moveSelectedUp ( ) {
389+ const sel = get ( selection )
390+ if ( sel . size === 0 ) return
391+
392+ const rootItems = get ( items )
393+ const zoomId = get ( zoomedItemId )
394+ const root = zoomId ? findItem ( rootItems , zoomId ) || rootItems : rootItems
395+ const flat = flattenVisibleTree ( root )
396+
397+ const idsInOrder = flat . filter ( item => sel . has ( item . id ) ) . map ( item => item . id )
398+
399+ for ( const id of idsInOrder ) {
400+ moveItemUp ( id )
401+ }
402+ }
403+
404+ function moveSelectedDown ( ) {
405+ const sel = get ( selection )
406+ if ( sel . size === 0 ) return
407+
408+ const rootItems = get ( items )
409+ const zoomId = get ( zoomedItemId )
410+ const root = zoomId ? findItem ( rootItems , zoomId ) || rootItems : rootItems
411+ const flat = flattenVisibleTree ( root )
412+
413+ const idsInOrder = flat . filter ( item => sel . has ( item . id ) ) . map ( item => item . id )
414+
415+ for ( const id of [ ...idsInOrder ] . reverse ( ) ) {
416+ moveItemDown ( id )
417+ }
418+ }
419+
328420 function setSearch ( query ) {
329421 searchQuery . set ( query )
330422 }
@@ -594,6 +686,12 @@ function createItemStore() {
594686 toggleOpen,
595687 indentItem,
596688 outdentItem,
689+ indentSelected,
690+ outdentSelected,
691+ moveItemUp,
692+ moveItemDown,
693+ moveSelectedUp,
694+ moveSelectedDown,
597695 setSearch,
598696 clearSearch,
599697 select,
0 commit comments