1 $group
2 #
3 # dependencies
4 # . g/js/wz/core.js.ittf
5 # . g/js/wz/contextMenu.js.ittf
6 # params
7 # { props
8 # string key
9 # { app
10 # { filesystem
11 # func getFolderRoot
12 # func folderContextmenuItems
13 # func fileContextmenuItems
14 # func populateFolderItem
15 # func createFolder
16 # func createFile
17 # func deleteFolder
18 # func deleteFile
19 # func updateFile
20 # func rename
21 # func copyCutStart
22 # func pasteTo
23 class TreeView : wz.EventTarget
24 ctor
25 param props
26 set this.events
27 [
28 @ 'expand'
29 @ 'change'
30 @ 'collapse'
31 @ 'select'
32 set this.props = props
33 set this.key = props.key || 'default'
34 set this.app = props.app
35 set this.filesystem = props.filesystem
36 set this.handlers = {}
37 set this.selectedTreeNode = null
38 m render
39 param rootItem
40 param callback
41 if typeof callback === 'undefined'
42 set callback = rootItem
43 set rootItem = null
44 # set this.rootNode = new TreeNode(data, this)
45 if this.filesystem
46 _ this.filesystem.getFolderRoot
47 a_cb_throw( data )
48 # log 'TreeView.folderRoot', data
49 set this.rootNode = new TreeNode(data, this)
50 r_cb( this.rootNode.render() )
51 elif rootItem
52 set this.rootNode = new TreeNode(rootItem, this)
53 r_cb( this.rootNode.render() )
54 else
55 _ callback
56 {
57 @ message 'TreeView.render error: no data for treeNode'
58 m handleContextMenu
59 param payload
60 # log 'handleContextMenu.payload', payload, payload.data
61 if this.filesystem
62 if payload.data.isFolder
63 _ this.handleContextMenuFolder
64 @ payload
65 else
66 _ this.handleContextMenuFile
67 @ payload
68 m handleContextMenuFolder
69 param context
70 var that = this
71 if !this.contextmenuFolder
72 set this.contextmenuFolder
73 new wz.ContextMenu
74 {
75 @ menusContainerId this.props.formsContainerId
76 _ this.contextmenuFolder.create
77 {
78 { menu
79 @ id (this.props.id || 'treeview') + '-contextmenuFolder'
80 @ items
81 _ this.filesystem.folderContextmenuItems
82 @ context.treeNode
83 @ onClick
84 =>
85 param data
86 # log 'handleContextMenu_ittfDocument.onClick', data
87 if data.command === 'rename'
88 _ data.payload.treeNode.renameStart
89 elif data.command === 'create folder'
90 _ this.createFolder
91 @ data.payload.treeNode
92 elif data.command === 'create file'
93 _ this.createFile
94 @ data.payload.treeNode
95 elif data.command === 'clone repo'
96 _ this.cloneRepo
97 @ data.payload.treeNode
98 elif data.command === 'checkout repo'
99 _ this.checkoutRepo
100 @ data.payload.treeNode
101 elif data.command === 'copy' || data.command === 'cut'
102 _ this.copyCutStart
103 @ data.payload.treeNode
104 @ data.command
105 elif data.command === 'paste'
106 _ this.pasteTo
107 @ data.payload.treeNode
108 elif data.command === 'delete'
109 _ this.deleteFolder
110 @ data.payload.treeNode
111 else
112 _ this.contextmenuFolder.replace
113 {
114 @ items
115 _ this.filesystem.folderContextmenuItems
116 @ context.treeNode
117 _ this.contextmenuFolder.handleRightClick
118 @ event
119 {
120 @ data context.data
121 @ treeNode context.treeNode
122 set this.contextmenuFolder.onClose
123 =>
124 _ wz.removeClass
125 @ context.treeNode.contentEl
126 @ 'tree-node-context-menu-on'
127 m handleContextMenuFile
128 param context
129 var that = this
130 if !this.contextmenuFile
131 set this.contextmenuFile
132 new wz.ContextMenu
133 {
134 @ menusContainerId this.props.formsContainerId
135 _ this.contextmenuFile.create
136 {
137 { menu
138 @ id (this.props.id || 'treeview') + '-contextmenuFile'
139 @ items
140 _ this.filesystem.fileContextmenuItems
141 @ context.treeNode
142 @ onClick
143 =>
144 param data
145 # log 'handleContextMenu_ittfDocument.onClick', data
146 if data.command === 'rename'
147 _ data.payload.treeNode.renameStart
148 elif data.command === 'copy' || data.command === 'cut'
149 _ this.copyCutStart
150 @ data.payload.treeNode
151 @ data.command
152 elif data.command === 'paste'
153 _ this.pasteTo
154 @ data.payload.treeNode
155 elif data.command === 'delete'
156 _ this.deleteFile
157 @ data.payload.treeNode
158 else
159 _ this.contextmenuFile.replace
160 {
161 @ items
162 _ this.filesystem.fileContextmenuItems
163 @ context.treeNode
164 _ this.contextmenuFile.handleRightClick
165 @ event
166 {
167 @ data context.data
168 @ treeNode context.treeNode
169 set this.contextmenuFile.onClose
170 =>
171 _ wz.removeClass
172 @ context.treeNode.contentEl
173 @ 'tree-node-context-menu-on'
174 m populate
175 param treeNode
176 param callback
177 _ this.filesystem.populateFolderItem
178 @ treeNode.item
179 a_cb_throw( populatedItem )
180 # log 'TreeView.populate', populatedItem
181 _ treeNode.replace
182 @ populatedItem
183 if callback
184 r_cb()
185 m selectTreeNode
186 param treeNode
187 set this.selectedTreeNode = treeNode
188 emit( select-tree-node)
189 @ key this.key
190 @ treeNode treeNode
191 m createFolder
192 param treeNode
193 var createExec
194 =>
195 _ this.filesystem.createFolder
196 @ treeNode.item
197 a_cb_throw( newItem)
198 log 'createFolder.1', newItem
199 var newNode
200 _ treeNode.addItem
201 @ newItem
202 _ treeNode.expand
203 _ newNode.renameStart
204 if !treeNode.item.loadedAt
205 log 'createFolder.populate'
206 _ this.populate
207 @ treeNode
208 a_cb_throw()
209 _ createExec
210 else
211 _ createExec
212 m deleteFolder
213 param treeNode
214 _ this.filesystem.deleteFolder
215 @ treeNode.item
216 a_cb_throw( result)
217 _ treeNode.remove
218 m createFile
219 param treeNode
220 var createExec
221 =>
222 _ this.filesystem.createFile
223 @ treeNode.item
224 a_cb_throw( newItem)
225 var newNode
226 _ treeNode.addItem
227 @ newItem
228 _ treeNode.expand
229 _ newNode.renameStart
230 if !treeNode.item.loadedAt
231 _ this.populate
232 @ treeNode
233 a_cb_throw()
234 _ createExec
235 else
236 _ createExec
237 m cloneRepo
238 param treeNode
239 var cloneExec
240 async=>
241 _ await gitClone
242 {
243 @ filepath treeNode.item.path
244 @ glEventHub glEventHub
245 #
246 _ this.filesystem.cloneFolder
247 @ treeNode.item
248 a_cb_throw( newItem)
249 log 'cloneFolder.1', newItem
250 var newNode
251 _ treeNode.addItem
252 @ newItem
253 _ treeNode.expand
254 _ newNode.renameStart
255 if !treeNode.item.loadedAt
256 log 'cloneFolder.populate'
257 _ this.populate
258 @ treeNode
259 a_cb_throw()
260 _ cloneExec
261 else
262 _ cloneExec
263 m checkoutRepo
264 param treeNode
265 var checkoutExec
266 async=>
267 _ await gitCheckout
268 {
269 @ filepath treeNode.item.path
270 @ glEventHub glEventHub
271 #
272 _ this.filesystem.checkoutFolder
273 @ treeNode.item
274 a_cb_throw( newItem)
275 log 'checkoutFolder.1', newItem
276 var newNode
277 _ treeNode.addItem
278 @ newItem
279 _ treeNode.expand
280 _ newNode.renameStart
281 if !treeNode.item.loadedAt
282 log 'checkoutFolder.populate'
283 _ this.populate
284 @ treeNode
285 a_cb_throw()
286 _ checkoutExec
287 else
288 _ checkoutExec
289 m updateFile
290 param treeNode
291 param newContent
292 _ this.filesystem.updateFile
293 @ treeNode.item
294 @ newContent
295 a_cb_throw( result)
296 set treeNode.item.content = newContent
297 emit( tree-node-updated)
298 @ key this.key
299 @ treeNode treeNode
300 m deleteFile
301 param treeNode
302 _ this.filesystem.deleteFile
303 @ treeNode.item
304 a_cb_throw( result)
305 _ treeNode.remove
306 m rename
307 param treeNode
308 param newName
309 param callback
310 _ this.filesystem.rename
311 @ treeNode.item
312 @ newName
313 @ callback
314 m copyCutStart
315 param treeNode
316 param oper
317 _ treeNode.copyCutStart
318 @ oper
319 _ this.filesystem.copyCutStart
320 @ treeNode.item
321 @ treeNode
322 @ oper
323 m pasteTo
324 param treeNode
325 _ this.filesystem.pasteTo
326 @ treeNode.item
327 a_cb_throw( from)
328 log 'treeView.pasteTo', 'from', from, 'to', treeNode.item
329 if from.action === 'copyFile' || from.action === 'copyFolder'
330 var newItem
331 _ itemUtils.cloneItem
332 @ from.context.item
333 _ itemUtils.setDirname
334 @ newItem
335 @ treeNode.item.dirname
336 _ treeNode.addItem
337 @ newItem
338 _ from.context.copyCutFinish
339 if from.action === 'moveFile' || from.action === 'moveFolder'
340 var newItem
341 _ itemUtils.cloneItem
342 @ from.context.item
343 _ itemUtils.setDirname
344 @ newItem
345 @ treeNode.item.dirname
346 _ treeNode.addItem
347 @ newItem
348 _ from.context.remove