UiFileManager plugin
This commit is contained in:
parent
85790f8866
commit
f0b0f57643
24 changed files with 2541 additions and 0 deletions
194
plugins/UiFileManager/media/js/FileItemList.coffee
Normal file
194
plugins/UiFileManager/media/js/FileItemList.coffee
Normal file
|
@ -0,0 +1,194 @@
|
|||
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
|
Loading…
Add table
Add a link
Reference in a new issue