1
1
const DiskFileList = generateFileList ( 'disk' )
2
2
const BoardFileList = generateFileList ( 'board' )
3
3
4
- function generateFileList ( source ) {
4
+ function generateFileList ( source , selectedFiles ) {
5
+
5
6
return function FileList ( state , emit ) {
6
7
function onKeyEvent ( e ) {
7
8
if ( e . key . toLowerCase ( ) === 'enter' ) {
@@ -13,6 +14,8 @@ function generateFileList(source) {
13
14
}
14
15
}
15
16
17
+ /* template for new file item, with focussed input
18
+ ESC to cancel, ENTER to finish */
16
19
const newFileItem = html `
17
20
< div class ="item ">
18
21
< img class ="icon " src ="media/file.svg " />
@@ -26,6 +29,8 @@ function generateFileList(source) {
26
29
</ div >
27
30
</ div >
28
31
`
32
+ /* template for new folder item, with focussed input
33
+ ESC to cancel, ENTER to finish */
29
34
const newFolderItem = html `
30
35
< div class ="item ">
31
36
< img class ="icon " src ="media/folder.svg " />
@@ -39,22 +44,23 @@ function generateFileList(source) {
39
44
</ div >
40
45
</ div >
41
46
`
47
+
42
48
function dismissContextMenu ( e , item ) {
43
49
console . log ( "click action" , e , item )
44
50
e . stopPropagation ( )
45
- state . fileContextMenu = null
51
+ state . itemActionMenu = null
46
52
state . selectedFiles = [ ]
47
53
emit ( 'render' )
48
54
}
49
55
function triggerRemove ( ) {
50
56
emit ( 'remove-files' )
51
- state . fileContextMenu = null
57
+ state . itemActionMenu = null
52
58
emit ( 'render' )
53
59
}
54
60
function triggerRename ( item ) {
55
61
emit ( 'rename-file' , source , item )
56
62
57
- state . fileContextMenu = null
63
+ state . itemActionMenu = null
58
64
emit ( 'render' )
59
65
}
60
66
function triggerTransfer ( ) {
@@ -63,10 +69,11 @@ function generateFileList(source) {
63
69
} else {
64
70
emit ( 'download-files' )
65
71
}
66
- state . fileContextMenu = null
72
+ state . itemActionMenu = null
67
73
emit ( 'render' )
68
74
}
69
- function FileOptions ( item , i ) {
75
+
76
+ function ItemActions ( item , i ) {
70
77
const popupMenu = html `
71
78
< div class ="popup-menu ">
72
79
< div class ="popup-menu-item ${ state . isConnected ? '' : 'disabled' } " onclick =${ triggerTransfer } > < img src ="media/${ source === 'disk' ? 'upload' : 'download' } .svg " /> </ div >
@@ -91,7 +98,6 @@ function generateFileList(source) {
91
98
f => f . fileName === item . fileName && f . source === source
92
99
)
93
100
94
- const hasContextMenu = state . fileContextMenu && state . fileContextMenu . fileName === item . fileName && state . fileContextMenu . source === source
95
101
function renameItem ( e ) {
96
102
e . preventDefault ( )
97
103
emit ( 'rename-file' , source , item )
@@ -104,54 +110,72 @@ function generateFileList(source) {
104
110
if ( ! state . renamingFile ) emit ( `open-file` , source , item )
105
111
}
106
112
107
- function toggleContextMenu ( item , source , e ) {
113
+ function toggleActionsMenu ( item , source , e ) {
108
114
e . stopPropagation ( )
109
115
console . log ( "show file options" , item , source , e )
110
116
// const popupMenu = e.currentTarget.parentElement.querySelector('.popup-menu')
111
117
// popupMenu.classList.add('visible')
112
118
emit ( 'file-context-menu' , item , source , e )
113
119
}
120
+
121
+ function checkboxToggle ( item , source , e ) {
122
+ e . stopPropagation ( )
123
+ emit ( 'toggle-file-selection' , item , source , e )
124
+ }
125
+
114
126
let fileName = item . fileName
115
127
const isSelected = state . selectedFiles . find ( f => f . fileName === fileName )
116
128
117
129
if ( state . renamingFile == source && isSelected ) {
118
130
fileName = renamingFileItem
119
131
}
120
132
121
- contextMenuHtml = html ``
122
- if ( hasContextMenu ) {
123
- contextMenuHtml = html `${ FileOptions ( item , i ) } `
124
- }
133
+ // a context menu has been triggered
134
+ const contextMenuOpen = state . itemActionMenu != null
135
+
136
+ // only show the action menu on current item
137
+ const showActionMenu = state . itemActionMenu && state . itemActionMenu . fileName === item . fileName && state . itemActionMenu . source === source
138
+
139
+ // let actionMenuHtml = html``
140
+ // if (showActionMenu) {
141
+ const actionMenuHtml = showActionMenu ? html `${ ItemActions ( item , i ) } ` : html ``
142
+ // }
125
143
126
144
if ( item . type === 'folder' ) {
127
145
return html `
128
146
< div
129
- class ="item ${ isChecked ? 'selected' : '' } "
147
+ class ="item ${ isChecked ? 'selected' : '' } ${ showActionMenu ? 'actionable' : '' } "
130
148
onclick =${ ( e ) => emit ( 'toggle-file-selection' , item , source , e ) }
131
149
ondblclick =${ navigateToFolder }
132
150
>
133
151
< img class ="icon " src ="media/folder.svg " />
134
152
< div class ="text "> ${ fileName } </ div >
135
- < div class ="options " onclick =${ ( e ) => toggleContextMenu ( item , source , e ) } > }>
153
+ < div class ="options " onclick =${ ( e ) => toggleActionsMenu ( item , source , e ) } > }>
136
154
< img src ="media/more.svg " />
137
155
</ div >
138
- ${ contextMenuHtml }
156
+ < div class ="checkbox " onclick =${ ( e ) => checkboxToggle ( item , source , e ) } > }>
157
+ < img src ="media/unchecked.svg " />
158
+ </ div >
159
+ ${ actionMenuHtml }
139
160
</ div >
140
161
`
141
162
} else {
142
163
//<div class="options" onclick=${(e) => {contextualMenu(e, item)}}>
143
164
return html `
144
165
< div
145
- class ="item ${ isChecked ? 'selected' : '' } "
166
+ class ="item ${ isChecked ? 'selected' : '' } ${ showActionMenu ? 'actionable' : '' } "
146
167
onclick =${ ( e ) => emit ( 'toggle-file-selection' , item , source , e ) }
147
168
ondblclick =${ openFile }
148
169
>
149
170
< img class ="icon " src ="media/file.svg " />
150
171
< div class ="text "> ${ fileName } </ div >
151
- < div class ="options " onclick =${ ( e ) => toggleContextMenu ( item , source , e ) } >
172
+ < div class ="options " onclick =${ ( e ) => toggleActionsMenu ( item , source , e ) } >
152
173
< img src ="media/more.svg " />
153
174
</ div >
154
- ${ contextMenuHtml }
175
+ < div class ="checkbox " onclick =${ ( e ) => checkboxToggle ( item , source , e ) } > }>
176
+ < img src ="media/unchecked.svg " />
177
+ </ div >
178
+ ${ actionMenuHtml }
155
179
</ div >
156
180
`
157
181
}
0 commit comments