123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- class FileItemList extends Class
- constructor: (@inner_path) ->
- @items = []
- @updating = false
- @files_modified = {}
- @dirs_modified = {}
- @files_added = {}
- @dirs_added = {}
- @files_optional = {}
- @items_by_name = {}
- # Update item list
- update: (cb) ->
- @updating = true
- @logStart("Updating dirlist")
- Page.cmd "dirList", {inner_path: @inner_path, stats: true}, (res) =>
- if res.error
- @error = res.error
- else
- @error = null
- pattern_ignore = RegExp("^" + Page.site_info.content?.ignore)
- @items.splice(0, @items.length) # Remove all items
- @items_by_name = {}
- for row in res
- row.type = @getFileType(row)
- row.inner_path = @inner_path + row.name
- if Page.site_info.content?.ignore and row.inner_path.match(pattern_ignore)
- row.ignored = true
- @items.push(row)
- @items_by_name[row.name] = row
- @sort()
- if Page.site_info?.settings?.own
- @updateAddedFiles()
- @updateOptionalFiles =>
- @updating = false
- cb?()
- @logEnd("Updating dirlist", @inner_path)
- Page.projector.scheduleRender()
- @updateModifiedFiles =>
- Page.projector.scheduleRender()
- updateModifiedFiles: (cb) =>
- # Add modified attribute to changed files
- Page.cmd "siteListModifiedFiles", [], (res) =>
- @files_modified = {}
- @dirs_modified = {}
- for inner_path in res.modified_files
- @files_modified[inner_path] = true
- dir_inner_path = ""
- dir_parts = inner_path.split("/")
- for dir_part in dir_parts[..-2]
- if dir_inner_path
- dir_inner_path += "/#{dir_part}"
- else
- dir_inner_path = dir_part
- @dirs_modified[dir_inner_path] = true
- cb?()
- # Update newly added items list since last sign
- updateAddedFiles: =>
- Page.cmd "fileGet", "content.json", (res) =>
- if not res
- return false
- content = JSON.parse(res)
- # Check new files
- if not content.files?
- return false
- @files_added = {}
- for file in @items
- if file.name == "content.json" or file.is_dir
- continue
- if not content.files[@inner_path + file.name]
- @files_added[@inner_path + file.name] = true
- # Check new dirs
- @dirs_added = {}
- dirs_content = {}
- for file_name of Object.assign({}, content.files, content.files_optional)
- if not file_name.startsWith(@inner_path)
- continue
- pattern = new RegExp("#{@inner_path}(.*?)/")
- match = file_name.match(pattern)
- if not match
- continue
- dirs_content[match[1]] = true
- for file in @items
- if not file.is_dir
- continue
- if not dirs_content[file.name]
- @dirs_added[@inner_path + file.name] = true
- # Update optional files list
- updateOptionalFiles: (cb) =>
- Page.cmd "optionalFileList", {filter: ""}, (res) =>
- @files_optional = {}
- for optional_file in res
- @files_optional[optional_file.inner_path] = optional_file
- @addOptionalFilesToItems()
- cb?()
- # Add optional files to item list
- addOptionalFilesToItems: =>
- is_added = false
- for inner_path, optional_file of @files_optional
- if optional_file.inner_path.startsWith(@inner_path)
- if @getDirectory(optional_file.inner_path) == @inner_path
- # Add optional file to list
- file_name = @getFileName(optional_file.inner_path)
- if not @items_by_name[file_name]
- row = {
- "name": file_name, "type": "file", "optional_empty": true,
- "size": optional_file.size, "is_dir": false, "inner_path": optional_file.inner_path
- }
- @items.push(row)
- @items_by_name[file_name] = row
- is_added = true
- else
- # Add optional dir to list
- dir_name = optional_file.inner_path.replace(@inner_path, "").match(/(.*?)\//, "")?[1]
- if dir_name and not @items_by_name[dir_name]
- row = {
- "name": dir_name, "type": "dir", "optional_empty": true,
- "size": 0, "is_dir": true, "inner_path": optional_file.inner_path
- }
- @items.push(row)
- @items_by_name[dir_name] = row
- is_added = true
- if is_added
- @sort()
- getFileType: (file) =>
- if file.is_dir
- return "dir"
- else
- return "unknown"
- getDirectory: (inner_path) ->
- if inner_path.indexOf("/") != -1
- return inner_path.replace(/^(.*\/)(.*?)$/, "$1")
- else
- return ""
- getFileName: (inner_path) ->
- return inner_path.replace(/^(.*\/)(.*?)$/, "$2")
- isModified: (inner_path) =>
- return @files_modified[inner_path] or @dirs_modified[inner_path]
- isAdded: (inner_path) =>
- return @files_added[inner_path] or @dirs_added[inner_path]
- hasPermissionDelete: (file) =>
- if file.type in ["dir", "parent"]
- return false
- if file.inner_path == "content.json"
- return false
- optional_info = @getOptionalInfo(file.inner_path)
- if optional_info and optional_info.downloaded_percent > 0
- return true
- else
- return Page.site_info?.settings?.own
- getOptionalInfo: (inner_path) =>
- return @files_optional[inner_path]
- sort: =>
- @items.sort (a, b) ->
- return (b.is_dir - a.is_dir) || a.name.localeCompare(b.name)
- window.FileItemList = FileItemList
|