@ -1,21 +1,18 @@
< script lang = "ts" >
< script lang = "ts" setup >
import DiffFileTreeItem from './DiffFileTreeItem.vue' ;
import DiffFileTreeItem from './DiffFileTreeItem.vue' ;
import { loadMoreFiles } from '../features/repo-diff.ts' ;
import { loadMoreFiles } from '../features/repo-diff.ts' ;
import { toggleElem } from '../utils/dom.ts' ;
import { toggleElem } from '../utils/dom.ts' ;
import { diffTreeStore } from '../modules/stores.ts' ;
import { diffTreeStore } from '../modules/stores.ts' ;
import { setFileFolding } from '../features/file-fold.ts' ;
import { setFileFolding } from '../features/file-fold.ts' ;
import { computed , onMounted , onUnmounted } from 'vue' ;
const LOCAL _STORAGE _KEY = 'diff_file_tree_visible' ;
const LOCAL _STORAGE _KEY = 'diff_file_tree_visible' ;
export default {
const store = diffTreeStore ( ) ;
components : { DiffFileTreeItem } ,
data : ( ) => {
const fileTree = computed ( ( ) => {
return { store : diffTreeStore ( ) } ;
} ,
computed : {
fileTree ( ) {
const result = [ ] ;
const result = [ ] ;
for ( const file of this . store . files ) {
for ( const file of store . files ) {
/ / S p l i t f i l e i n t o d i r e c t o r i e s
/ / S p l i t f i l e i n t o d i r e c t o r i e s
const splits = file . Name . split ( '/' ) ;
const splits = file . Name . split ( '/' ) ;
let index = 0 ;
let index = 0 ;
@ -31,6 +28,11 @@ export default {
name : split ,
name : split ,
children : [ ] ,
children : [ ] ,
isFile ,
isFile ,
} as {
name : string ,
children : any [ ] ,
isFile : boolean ,
file ? : any ,
} ;
} ;
if ( isFile === true ) {
if ( isFile === true ) {
@ -74,42 +76,47 @@ export default {
/ / r e d u c e t h e d e p t h o f o u r t r e e .
/ / r e d u c e t h e d e p t h o f o u r t r e e .
mergeChildIfOnlyOneDir ( result ) ;
mergeChildIfOnlyOneDir ( result ) ;
return result ;
return result ;
} ,
} ) ;
} ,
mounted ( ) {
onMounted ( ( ) => {
/ / D e f a u l t t o t r u e i f u n s e t
/ / D e f a u l t t o t r u e i f u n s e t
this . store . fileTreeIsVisible = localStorage . getItem ( LOCAL _STORAGE _KEY ) !== 'false' ;
store . fileTreeIsVisible = localStorage . getItem ( LOCAL _STORAGE _KEY ) !== 'false' ;
document . querySelector ( '.diff-toggle-file-tree-button' ) . addEventListener ( 'click' , this . toggleVisibility ) ;
document . querySelector ( '.diff-toggle-file-tree-button' ) . addEventListener ( 'click' , toggleVisibility ) ;
this . hashChangeListener = ( ) => {
hashChangeListener ( ) ;
this . store . selectedItem = window . location . hash ;
window . addEventListener ( 'hashchange' , hashChangeListener ) ;
this . expandSelectedFile ( ) ;
} ) ;
} ;
this . hashChangeListener ( ) ;
onUnmounted ( ( ) => {
window . addEventListener ( 'hashchange' , this . hashChangeListener ) ;
document . querySelector ( '.diff-toggle-file-tree-button' ) . removeEventListener ( 'click' , toggleVisibility ) ;
} ,
window . removeEventListener ( 'hashchange' , hashChangeListener ) ;
unmounted ( ) {
} ) ;
document . querySelector ( '.diff-toggle-file-tree-button' ) . removeEventListener ( 'click' , this . toggleVisibility ) ;
window . removeEventListener ( 'hashchange' , this . hashChangeListener ) ;
function hashChangeListener ( ) {
} ,
store . selectedItem = window . location . hash ;
methods : {
expandSelectedFile ( ) ;
expandSelectedFile ( ) {
}
function expandSelectedFile ( ) {
/ / e x p a n d f i l e i f t h e s e l e c t e d f i l e i s f o l d e d
/ / e x p a n d f i l e i f t h e s e l e c t e d f i l e i s f o l d e d
if ( this . store . selectedItem ) {
if ( store . selectedItem ) {
const box = document . querySelector ( this . store . selectedItem ) ;
const box = document . querySelector ( store . selectedItem ) ;
const folded = box ? . getAttribute ( 'data-folded' ) === 'true' ;
const folded = box ? . getAttribute ( 'data-folded' ) === 'true' ;
if ( folded ) setFileFolding ( box , box . querySelector ( '.fold-file' ) , false ) ;
if ( folded ) setFileFolding ( box , box . querySelector ( '.fold-file' ) , false ) ;
}
}
} ,
}
toggleVisibility ( ) {
this . updateVisibility ( ! this . store . fileTreeIsVisible ) ;
function toggleVisibility ( ) {
} ,
updateVisibility ( ! store . fileTreeIsVisible ) ;
updateVisibility ( visible ) {
}
this . store . fileTreeIsVisible = visible ;
localStorage . setItem ( LOCAL _STORAGE _KEY , this . store . fileTreeIsVisible ) ;
function updateVisibility ( visible ) {
this . updateState ( this . store . fileTreeIsVisible ) ;
store . fileTreeIsVisible = visible ;
} ,
localStorage . setItem ( LOCAL _STORAGE _KEY , store . fileTreeIsVisible ) ;
updateState ( visible ) {
updateState ( store . fileTreeIsVisible ) ;
}
function updateState ( visible ) {
const btn = document . querySelector ( '.diff-toggle-file-tree-button' ) ;
const btn = document . querySelector ( '.diff-toggle-file-tree-button' ) ;
const [ toShow , toHide ] = btn . querySelectorAll ( '.icon' ) ;
const [ toShow , toHide ] = btn . querySelectorAll ( '.icon' ) ;
const tree = document . querySelector ( '#diff-file-tree' ) ;
const tree = document . querySelector ( '#diff-file-tree' ) ;
@ -118,13 +125,13 @@ export default {
toggleElem ( tree , visible ) ;
toggleElem ( tree , visible ) ;
toggleElem ( toShow , ! visible ) ;
toggleElem ( toShow , ! visible ) ;
toggleElem ( toHide , visible ) ;
toggleElem ( toHide , visible ) ;
} ,
}
loadMoreData ( ) {
loadMoreFiles ( this . store . linkLoadMore ) ;
function loadMoreData ( ) {
} ,
loadMoreFiles ( store . linkLoadMore ) ;
} ,
}
} ;
< / script >
< / script >
< template >
< template >
< div v-if ="store.fileTreeIsVisible" class="diff-file-tree-items" >
< div v-if ="store.fileTreeIsVisible" class="diff-file-tree-items" >
<!-- only render the tree if we 're visible. in many cases this is something that doesn' t change very often -- >
<!-- only render the tree if we 're visible. in many cases this is something that doesn' t change very often -- >
@ -134,6 +141,7 @@ export default {
< / div >
< / div >
< / div >
< / div >
< / template >
< / template >
< style scoped >
< style scoped >
. diff - file - tree - items {
. diff - file - tree - items {
display : flex ;
display : flex ;