mirror of
https://github.com/antos-rde/antosdk-apps.git
synced 2024-12-26 04:08:21 +01:00
support versionning in OnlyOffice
This commit is contained in:
parent
e3a22774aa
commit
882b57dd87
@ -10,6 +10,7 @@ way to work with multiple documents at the same time.
|
|||||||
![https://github.com/lxsang/antosdk-apps/blob/master/OnlyOffice/screenshot.png?raw=true](https://github.com/lxsang/antosdk-apps/blob/master/OnlyOffice/screenshot.png?raw=true)
|
![https://github.com/lxsang/antosdk-apps/blob/master/OnlyOffice/screenshot.png?raw=true](https://github.com/lxsang/antosdk-apps/blob/master/OnlyOffice/screenshot.png?raw=true)
|
||||||
|
|
||||||
## Change log
|
## Change log
|
||||||
|
- v 0.1.5a: Add document versionning support
|
||||||
- v 0.1.4a: If the iframe has the same origin with the parent, enable the focus event
|
- v 0.1.4a: If the iframe has the same origin with the parent, enable the focus event
|
||||||
- v 0.1.3a: Let backend generates document key, compatible with doc.iohub.dev/office
|
- v 0.1.3a: Let backend generates document key, compatible with doc.iohub.dev/office
|
||||||
- v 0.1.2a: generate document key based on username, file path and modified time
|
- v 0.1.2a: generate document key based on username, file path and modified time
|
||||||
|
@ -32,6 +32,67 @@ handle.token = function(data)
|
|||||||
return result(ret)
|
return result(ret)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
handle.history = function(data)
|
||||||
|
local file = vfs.ospath(data.file)
|
||||||
|
local history_file = vfs.ospath("home://.office/"..std.sha1(file).."/history.json")
|
||||||
|
if(ulib.exists(history_file)) then
|
||||||
|
local obj = JSON.decodeFile(history_file)
|
||||||
|
obj.hash = std.sha1(file)
|
||||||
|
return result(obj)
|
||||||
|
else
|
||||||
|
return error("No history found")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
handle.clean_up_version = function(basepath, h,v)
|
||||||
|
if not h then
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
if h.version == v then
|
||||||
|
return h
|
||||||
|
else
|
||||||
|
--delete this version
|
||||||
|
local cmd = 'rm '..basepath.."/"..h.key.."*"
|
||||||
|
print(cmd)
|
||||||
|
os.execute(cmd)
|
||||||
|
if h.previous then
|
||||||
|
return handle.clean_up_version(basepath, h.previous,v)
|
||||||
|
else
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
handle.restore = function(data)
|
||||||
|
local version = data.version
|
||||||
|
local file = vfs.ospath(data.file)
|
||||||
|
local basepath = vfs.ospath("home://.office/"..std.sha1(file))
|
||||||
|
if ulib.exists(basepath.."/history.json") then
|
||||||
|
local history = JSON.decodeFile(basepath.."/history.json")
|
||||||
|
local obj = handle.clean_up_version(basepath, history,version)
|
||||||
|
if obj then
|
||||||
|
-- restore the file
|
||||||
|
local cmd = 'cp '..basepath.."/"..obj.key..' "'..file..'"'
|
||||||
|
os.execute(cmd)
|
||||||
|
local cmd = 'rm '..basepath.."/"..obj.key
|
||||||
|
os.execute(cmd)
|
||||||
|
|
||||||
|
local f = io.open(basepath.."/history.json", "w")
|
||||||
|
if f then
|
||||||
|
f:write(JSON.encode(obj))
|
||||||
|
f:close()
|
||||||
|
return result("File restored")
|
||||||
|
else
|
||||||
|
return error("Cannot save history")
|
||||||
|
end
|
||||||
|
else
|
||||||
|
local cmd = "rm "..basepath.."/history.json"
|
||||||
|
os.execute(cmd)
|
||||||
|
return result("File restored")
|
||||||
|
end
|
||||||
|
else
|
||||||
|
return error("Unable to restore: no history meta-data found")
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
handle.duplicate = function(data)
|
handle.duplicate = function(data)
|
||||||
local file = vfs.ospath(data.as)
|
local file = vfs.ospath(data.as)
|
||||||
local tmpfile = "/tmp/"..std.sha1(file)
|
local tmpfile = "/tmp/"..std.sha1(file)
|
||||||
@ -67,8 +128,55 @@ handle.save = function()
|
|||||||
os.execute(cmd)
|
os.execute(cmd)
|
||||||
-- move file to correct position
|
-- move file to correct position
|
||||||
if ulib.exists(tmpfile) then
|
if ulib.exists(tmpfile) then
|
||||||
cmd = "mv "..tmpfile.." "..file
|
-- back up the file version
|
||||||
|
local history_dir = "home://.office"
|
||||||
|
vfs.mkdir(history_dir)
|
||||||
|
history_dir = history_dir.."/"..std.sha1(file)
|
||||||
|
vfs.mkdir(history_dir)
|
||||||
|
history_dir = vfs.ospath(history_dir)
|
||||||
|
-- backup old version
|
||||||
|
cmd = 'cp "'..file..'" "'..history_dir.."/"..data.key..'"'
|
||||||
os.execute(cmd)
|
os.execute(cmd)
|
||||||
|
-- create new version
|
||||||
|
local old_stat = ulib.file_stat(file)
|
||||||
|
cmd = 'mv "'..tmpfile..'" "'..file..'"'
|
||||||
|
os.execute(cmd)
|
||||||
|
-- get the new key
|
||||||
|
local stat = ulib.file_stat(file)
|
||||||
|
local new_key = std.sha1(file..":"..stat.mtime)
|
||||||
|
-- save changes
|
||||||
|
if(data.changesurl) then
|
||||||
|
cmd = "curl -o "..history_dir.."/"..new_key..'.zip "'..data.changesurl..'"'
|
||||||
|
os.execute(cmd)
|
||||||
|
end
|
||||||
|
-- now save version object
|
||||||
|
local history_file = history_dir.."/history.json"
|
||||||
|
local history = {}
|
||||||
|
if ulib.exists(history_file) then
|
||||||
|
history.previous = JSON.decodeFile(history_file)
|
||||||
|
history.version = history.previous.version + 1
|
||||||
|
else
|
||||||
|
history.version = 1
|
||||||
|
history.previous = {
|
||||||
|
key = data.key,
|
||||||
|
version = 0,
|
||||||
|
create = old_stat.mtime
|
||||||
|
}
|
||||||
|
end
|
||||||
|
history.key = new_key
|
||||||
|
history.changes = data.history.changes
|
||||||
|
history.serverVersion = data.history.serverVersion
|
||||||
|
history.create = stat.mtime
|
||||||
|
history.user = { id = ulib.uid(SESSION.user).id, name = SESSION.user }
|
||||||
|
-- save the history to file
|
||||||
|
local f = io.open(history_file, "w")
|
||||||
|
if f then
|
||||||
|
f:write(JSON.encode(history))
|
||||||
|
f:close()
|
||||||
|
|
||||||
|
else
|
||||||
|
return error("Cannot save history")
|
||||||
|
end
|
||||||
print("File "..file.." sync with remote")
|
print("File "..file.." sync with remote")
|
||||||
else
|
else
|
||||||
return error("Unable to download")
|
return error("Unable to download")
|
||||||
|
Binary file not shown.
@ -89,9 +89,9 @@ class OnlyOffice extends this.OS.application.BaseApplication
|
|||||||
open: () ->
|
open: () ->
|
||||||
return unless @currfile
|
return unless @currfile
|
||||||
@iframe = undefined
|
@iframe = undefined
|
||||||
|
@history = undefined
|
||||||
@exec("token", {file: @currfile.path})
|
@exec("token", {file: @currfile.path})
|
||||||
.then (d) =>
|
.then (d) =>
|
||||||
console.log(d)
|
|
||||||
return @error d.error if d.error
|
return @error d.error if d.error
|
||||||
@access_token = d.result.sid
|
@access_token = d.result.sid
|
||||||
@currfile.onready()
|
@currfile.onready()
|
||||||
@ -105,7 +105,11 @@ class OnlyOffice extends this.OS.application.BaseApplication
|
|||||||
events: {
|
events: {
|
||||||
onAppReady: (e) => @editorReady(e),
|
onAppReady: (e) => @editorReady(e),
|
||||||
onRequestCreateNew: () => @newDocument(),
|
onRequestCreateNew: () => @newDocument(),
|
||||||
onRequestSaveAs: (e) => @saveAs(e)
|
onRequestSaveAs: (e) => @saveAs(e),
|
||||||
|
onRequestHistory: () => @loadHistory(),
|
||||||
|
onRequestHistoryData: (e) => @loadHistoryData(e),
|
||||||
|
onRequestHistoryClose: (e) => @closeHistory(e),
|
||||||
|
onRequestRestore: (e) => @restoreVersion(e)
|
||||||
},
|
},
|
||||||
document: {
|
document: {
|
||||||
fileType: @currfile.ext,
|
fileType: @currfile.ext,
|
||||||
@ -130,6 +134,71 @@ class OnlyOffice extends this.OS.application.BaseApplication
|
|||||||
.catch (e) =>
|
.catch (e) =>
|
||||||
@error e.toString(), e
|
@error e.toString(), e
|
||||||
|
|
||||||
|
restoreVersion: (e) ->
|
||||||
|
return if e.data.version is @history.version
|
||||||
|
@exec("restore", { version: e.data.version, file: @currfile.path })
|
||||||
|
.then (d) =>
|
||||||
|
@error d.error if d.error
|
||||||
|
@notify d.result if d.result
|
||||||
|
@loadHistory()
|
||||||
|
.catch (e) =>
|
||||||
|
@error e.toString(),e
|
||||||
|
@loadHistory()
|
||||||
|
|
||||||
|
closeHistory: (e) ->
|
||||||
|
@open()
|
||||||
|
|
||||||
|
loadHistoryData: (e) ->
|
||||||
|
fn = (h,v) =>
|
||||||
|
return h if h.version is v
|
||||||
|
return fn h.previous, v if h.previous
|
||||||
|
return undefined
|
||||||
|
data = fn @history, e.data
|
||||||
|
@editor.setHistoryData({ error:__("No data found").__()}) unless data
|
||||||
|
path = "home://.office/#{@history.hash}"
|
||||||
|
hdata = {
|
||||||
|
changesUrl: "#{path}/#{data.key}.zip".asFileHandle().getlink()+ "?" + @access_token,
|
||||||
|
key: data.key,
|
||||||
|
url: "#{path}/#{data.key}".asFileHandle().getlink()+ "?" + @access_token,
|
||||||
|
version: data.version
|
||||||
|
}
|
||||||
|
if data.previous
|
||||||
|
hdata.previous = {
|
||||||
|
key: data.previous.key,
|
||||||
|
url: "#{path}/#{data.previous.key}".asFileHandle().getlink()+ "?" + @access_token
|
||||||
|
}
|
||||||
|
hdata.url = @currfile.getlink()+ "?" + @access_token if data.version is @history.version
|
||||||
|
# console.log(hdata)
|
||||||
|
@editor.setHistoryData {hdata}
|
||||||
|
|
||||||
|
loadHistory: () ->
|
||||||
|
@history = undefined
|
||||||
|
@exec("history", { file: @currfile.path })
|
||||||
|
.then (d) =>
|
||||||
|
return @editor.refreshHistory({error: d.error}) if d.error
|
||||||
|
@history = d.result
|
||||||
|
history = {}
|
||||||
|
history.currentVersion = d.result.version
|
||||||
|
history.history = []
|
||||||
|
fn = (list, obj) =>
|
||||||
|
list.push {
|
||||||
|
changes: obj.changes,
|
||||||
|
created: obj.create,
|
||||||
|
key: obj.key,
|
||||||
|
user: obj.user,
|
||||||
|
version: obj.version
|
||||||
|
}
|
||||||
|
return unless obj.previous
|
||||||
|
fn list, obj.previous
|
||||||
|
|
||||||
|
fn history.history, d.result
|
||||||
|
console.log history
|
||||||
|
@editor.refreshHistory(history)
|
||||||
|
|
||||||
|
.catch (e) =>
|
||||||
|
@editor.refreshHistory({ error: e.toString()})
|
||||||
|
@error e.toString(), e
|
||||||
|
|
||||||
getDocType: (ext) ->
|
getDocType: (ext) ->
|
||||||
return "word" if "doc,docx,epub,odt".split(",").includes(ext)
|
return "word" if "doc,docx,epub,odt".split(",").includes(ext)
|
||||||
return "cell" if "csv,ods,xls,xlsx".split(",").includes(ext)
|
return "cell" if "csv,ods,xls,xlsx".split(",").includes(ext)
|
||||||
|
@ -7,8 +7,8 @@
|
|||||||
"author": "Xuan Sang LE",
|
"author": "Xuan Sang LE",
|
||||||
"email": "mrsang@iohub.dev"
|
"email": "mrsang@iohub.dev"
|
||||||
},
|
},
|
||||||
"version":"0.1.4-a",
|
"version":"0.1.5-a",
|
||||||
"category":"Other",
|
"category":"Office",
|
||||||
"icon":"icon.png",
|
"icon":"icon.png",
|
||||||
"mimes":[
|
"mimes":[
|
||||||
"application/vnd.oasis.opendocument.text",
|
"application/vnd.oasis.opendocument.text",
|
||||||
|
@ -139,6 +139,36 @@
|
|||||||
"dependencies": [],
|
"dependencies": [],
|
||||||
"download": "https://raw.githubusercontent.com/lxsang/antosdk-apps/master/Katex/build/release/Katex.zip"
|
"download": "https://raw.githubusercontent.com/lxsang/antosdk-apps/master/Katex/build/release/Katex.zip"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"pkgname": "libjpeg",
|
||||||
|
"name": "libjpeg",
|
||||||
|
"description": "https://raw.githubusercontent.com/lxsang/antosdk-apps/master/libjpeg/README.md",
|
||||||
|
"category": "Library",
|
||||||
|
"author": "",
|
||||||
|
"version": "0.1.1-a",
|
||||||
|
"dependencies": [],
|
||||||
|
"download": "https://raw.githubusercontent.com/lxsang/antosdk-apps/master/libjpeg/build/release/libjpeg.zip"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pkgname": "libpdfjs",
|
||||||
|
"name": "PDF JS library",
|
||||||
|
"description": "https://raw.githubusercontent.com/lxsang/antosdk-apps/master/libpdfjs/README.md",
|
||||||
|
"category": "Library",
|
||||||
|
"author": "Xuan Sang LE",
|
||||||
|
"version": "2.6.347-r",
|
||||||
|
"dependencies": [],
|
||||||
|
"download": "https://raw.githubusercontent.com/lxsang/antosdk-apps/master/libpdfjs/build/release/libpdfjs.zip"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pkgname": "libwvnc",
|
||||||
|
"name": "libwvnc",
|
||||||
|
"description": "https://raw.githubusercontent.com/lxsang/antosdk-apps/master/libwvnc/README.md",
|
||||||
|
"category": "Library",
|
||||||
|
"author": "",
|
||||||
|
"version": "0.1.2-a",
|
||||||
|
"dependencies": ["libjpeg@0.1.1-a"],
|
||||||
|
"download": "https://raw.githubusercontent.com/lxsang/antosdk-apps/master/libwvnc/build/release/libwvnc.zip"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"pkgname": "LuaPlayground",
|
"pkgname": "LuaPlayground",
|
||||||
"name": "LuaPlayground",
|
"name": "LuaPlayground",
|
||||||
@ -163,9 +193,9 @@
|
|||||||
"pkgname": "OnlyOffice",
|
"pkgname": "OnlyOffice",
|
||||||
"name": "Office Suite",
|
"name": "Office Suite",
|
||||||
"description": "https://raw.githubusercontent.com/lxsang/antosdk-apps/master/OnlyOffice/README.md",
|
"description": "https://raw.githubusercontent.com/lxsang/antosdk-apps/master/OnlyOffice/README.md",
|
||||||
"category": "Other",
|
"category": "Office",
|
||||||
"author": "Xuan Sang LE",
|
"author": "Xuan Sang LE",
|
||||||
"version": "0.1.4-a",
|
"version": "0.1.5-a",
|
||||||
"dependencies": [],
|
"dependencies": [],
|
||||||
"download": "https://raw.githubusercontent.com/lxsang/antosdk-apps/master/OnlyOffice/build/release/OnlyOffice.zip"
|
"download": "https://raw.githubusercontent.com/lxsang/antosdk-apps/master/OnlyOffice/build/release/OnlyOffice.zip"
|
||||||
},
|
},
|
||||||
@ -215,7 +245,7 @@
|
|||||||
"description": "https://raw.githubusercontent.com/lxsang/antosdk-apps/master/ShowCase/README.md",
|
"description": "https://raw.githubusercontent.com/lxsang/antosdk-apps/master/ShowCase/README.md",
|
||||||
"category": "Other",
|
"category": "Other",
|
||||||
"author": "Xuan Sang LE",
|
"author": "Xuan Sang LE",
|
||||||
"version": "0.0.4-a",
|
"version": "0.0.5-a",
|
||||||
"dependencies": [],
|
"dependencies": [],
|
||||||
"download": "https://raw.githubusercontent.com/lxsang/antosdk-apps/master/ShowCase/build/release/ShowCase.zip"
|
"download": "https://raw.githubusercontent.com/lxsang/antosdk-apps/master/ShowCase/build/release/ShowCase.zip"
|
||||||
},
|
},
|
||||||
@ -259,36 +289,6 @@
|
|||||||
"dependencies": [],
|
"dependencies": [],
|
||||||
"download": "https://raw.githubusercontent.com/lxsang/antosdk-apps/master/VizApp/build/release/VizApp.zip"
|
"download": "https://raw.githubusercontent.com/lxsang/antosdk-apps/master/VizApp/build/release/VizApp.zip"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"pkgname": "libjpeg",
|
|
||||||
"name": "libjpeg",
|
|
||||||
"description": "https://raw.githubusercontent.com/lxsang/antosdk-apps/master/libjpeg/README.md",
|
|
||||||
"category": "Library",
|
|
||||||
"author": "",
|
|
||||||
"version": "0.1.1-a",
|
|
||||||
"dependencies": [],
|
|
||||||
"download": "https://raw.githubusercontent.com/lxsang/antosdk-apps/master/libjpeg/build/release/libjpeg.zip"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pkgname": "libpdfjs",
|
|
||||||
"name": "PDF JS library",
|
|
||||||
"description": "https://raw.githubusercontent.com/lxsang/antosdk-apps/master/libpdfjs/README.md",
|
|
||||||
"category": "Library",
|
|
||||||
"author": "Xuan Sang LE",
|
|
||||||
"version": "2.6.347-r",
|
|
||||||
"dependencies": [],
|
|
||||||
"download": "https://raw.githubusercontent.com/lxsang/antosdk-apps/master/libpdfjs/build/release/libpdfjs.zip"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pkgname": "libwvnc",
|
|
||||||
"name": "libwvnc",
|
|
||||||
"description": "https://raw.githubusercontent.com/lxsang/antosdk-apps/master/libwvnc/README.md",
|
|
||||||
"category": "Library",
|
|
||||||
"author": "",
|
|
||||||
"version": "0.1.2-a",
|
|
||||||
"dependencies": ["libjpeg@0.1.1-a"],
|
|
||||||
"download": "https://raw.githubusercontent.com/lxsang/antosdk-apps/master/libwvnc/build/release/libwvnc.zip"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"pkgname": "vTerm",
|
"pkgname": "vTerm",
|
||||||
"name": "Virtual Terminal",
|
"name": "Virtual Terminal",
|
||||||
|
Loading…
Reference in New Issue
Block a user