diff --git a/Docify/api/api.lua b/Docify/api/api.lua index fc01c80..5f44aba 100644 --- a/Docify/api/api.lua +++ b/Docify/api/api.lua @@ -1 +1,249 @@ -result("Hello from server side") \ No newline at end of file +local arg = ... + +ulib = require("ulib") +sqlite = modules.sqlite() +vfs = require("vfs") + +local handle = {} +local docpath = nil +local dbpath = nil + +local result = function(data) + return { + error = false, + result = data + } +end + +local error = function(data) + return { + error = data, + result = false + } +end + +local mkdirp =function(p) + if not vfs.exists(p) then + if not vfs.mkdir(p) then + return false, error("Unable to create directory: "..p) + end + end + return true, nil +end + +handle.init = function(args) + + local r, e = mkdirp(docpath) + if not r then return e end + + r, e = mkdirp(docpath.."/unclassified") + if not r then return e end + + r, e = mkdirp(docpath.."/cache") + if not r then return e end + + local db = sqlite._getdb(vfs.ospath(dbpath)) + if not db then + return error("Unable to initialized database "..dbpath) + end + local sql + -- check if table exists + if sqlite.hasTable(db, "categories") == 0 then + -- create the table + sql = [[ + CREATE TABLE "categories" ( + "id" INTEGER, + "name" TEXT NOT NULL, + PRIMARY KEY("id" AUTOINCREMENT) + ); + ]] + if sqlite.query(db, sql) ~= 1 then + sqlite.dbclose(db) + return error("Unable to create table categories") + end + -- insert unknown category + sql = [[ + INSERT INTO categories("id","name") VALUES (0,'Uncategoried'); + ]] + if sqlite.query(db, sql) ~= 1 then + sqlite.dbclose(db) + return error("Unable to create default category") + end + end + + if sqlite.hasTable(db, "owners") == 0 then + -- create the table + sql = [[ + CREATE TABLE "owners" ( + "id" INTEGER, + "name" TEXT NOT NULL, + PRIMARY KEY("id" AUTOINCREMENT) + ); + ]] + if sqlite.query(db, sql) ~= 1 then + sqlite.dbclose(db) + return error("Unable to create table owners") + end + -- insert unknown category + sql = [[ + INSERT INTO owners("id","name") VALUES (0,'None'); + ]] + if sqlite.query(db, sql) ~= 1 then + sqlite.dbclose(db) + return error("Unable to create default None owner") + end + end + + if sqlite.hasTable(db, "docs") == 0 then + -- create the table + sql = [[ + CREATE TABLE "docs" ( + "id" INTEGER, + "name" TEXT NOT NULL, + "ctime" INTEGER, + "day" INTEGER, + "month" INTEGER, + "year" INTEGER, + "cid" INTEGER DEFAULT 0, + "oid" INTEGER DEFAULT 0, + "file" TEXT NOT NULL, + "tags" TEXT, + "note" TEXT, + "mtime" INTEGER, + FOREIGN KEY("oid") REFERENCES "owners"("id") ON DELETE SET DEFAULT ON UPDATE NO ACTION, + FOREIGN KEY("cid") REFERENCES "categories"("id") ON DELETE SET DEFAULT ON UPDATE NO ACTION, + PRIMARY KEY("id" AUTOINCREMENT) + ); + ]] + if sqlite.query(db, sql) ~= 1 then + sqlite.dbclose(db) + return error("Unable to create table docs") + end + end + sqlite.dbclose(db) + return result("Docify initialized") +end + +handle.fetch = function(table) + local db = sqlite._getdb(vfs.ospath(dbpath)) + if not db then + return error("Unable to get database "..dbpath) + end + local r = sqlite.select(db, table, "*", "1=1") + sqlite.dbclose(db) + if r == nil then + return error("Unable to fetch data from "..table) + else + return result(r) + end +end + +handle.insert = function(param) + local db = sqlite._getdb(vfs.ospath(dbpath)) + if not db then + return error("Unable to get database "..dbpath) + end + local keys = {} + local values = {} + for k,v in pairs(param.data) do + if k ~= "id" then + table.insert(keys,k) + if type(v) == "number" then + table.insert(values, v) + elseif type(v) == "boolean" then + table.insert( values, v and 1 or 0 ) + else + local t = "\""..v:gsub('"', '""').."\"" + table.insert(values,t) + end + end + end + local sql = "INSERT INTO "..param.table.." ("..table.concat(keys,',')..') VALUES (' + sql = sql..table.concat(values,',')..');' + local r = sqlite.query(db, sql) + sqlite.dbclose(db) + if r == nil then + return error("Unable to insert data to "..param.table) + else + return result("Data inserted") + end +end + +handle.preview = function(path) + -- convert -resize 300x500 noel.pdf[0] thumb.png + local name = std.sha1(path:gsub(docpath,""))..".png" + -- try to find the thumb + local tpath = docpath.."/cache/"..name + if not vfs.exists(tpath) then + -- regenerate thumb + local cmd = "convert -resize 200x500 "..vfs.ospath(path).."[0] "..vfs.ospath(tpath) + os.execute(cmd) + end + + if vfs.exists(tpath) then + --local cmd = "rm "..vfs.ospath(tpath) + --os.execute(cmd) + return result("exist") + else + return error("do not exist") + end +end + +handle.update = function(param) + if not param.data.id or param.data.id == 0 then + return error("Record id is 0 or not found") + end + local db = sqlite._getdb(vfs.ospath(dbpath)) + if not db then + return error("Unable to get database "..dbpath) + end + local lst = {} + for k,v in pairs(param.data) do + if(type(v)== "number") then + table.insert(lst,k.."="..v) + elseif type(v) == "boolean" then + table.insert( lst, k.."="..(v and 1 or 0) ) + else + table.insert(lst,k.."=\""..v:gsub('"', '""').."\"") + end + end + + local sql = "UPDATE "..param.table.." SET "..table.concat(lst,",").." WHERE id="..param.data.id..";" + local r = sqlite.query(db, sql) + sqlite.dbclose(db) + if r == nil then + return error("Unable to update data to "..param.table) + else + return result("Data Updated") + end +end + +handle.delete = function(param) + if param.id == 0 then + return error("Record with id = 0 cannot be deleted") + end + + local db = sqlite._getdb(vfs.ospath(dbpath)) + if not db then + return error("Unable to get database "..dbpath) + end + local sql = "DELETE FROM "..param.table.." WHERE id="..param.id..";" + local r = sqlite.query(db, sql) + sqlite.dbclose(db) + if r == nil then + return error("Unable to delete data from "..param.table) + else + return result("Data deleted") + end +end + + +if arg.action and handle[arg.action] then + -- check if the database exits + docpath = arg.docpath + dbpath = docpath.."/docify.db" + + return handle[arg.action](arg.args) +else + return error("Invalid action parameter") +end \ No newline at end of file diff --git a/Docify/assets/scheme.html b/Docify/assets/scheme.html index 250512d..840e102 100644 --- a/Docify/assets/scheme.html +++ b/Docify/assets/scheme.html @@ -3,18 +3,18 @@
- - -
- - - - -
+ +
+ +
+ + + +
diff --git a/Docify/build/debug/api.lua b/Docify/build/debug/api.lua new file mode 100644 index 0000000..1b11aee --- /dev/null +++ b/Docify/build/debug/api.lua @@ -0,0 +1,249 @@ +local arg = ... + +ulib = require("ulib") +sqlite = modules.sqlite() +vfs = require("vfs") + +local handle = {} +local docpath = nil +local dbpath = nil + +local result = function(data) + return { + error = false, + result = data + } +end + +local error = function(data) + return { + error = data, + result = false + } +end + +local mkdirp =function(p) + if not vfs.exists(p) then + if not vfs.mkdir(p) then + return false, error("Unable to create directory: "..p) + end + end + return true, nil +end + +handle.init = function(args) + + local r, e = mkdirp(docpath) + if not r then return e end + + r, e = mkdirp(docpath.."/unclassified") + if not r then return e end + + r, e = mkdirp(docpath.."/cache") + if not r then return e end + + local db = sqlite._getdb(vfs.ospath(dbpath)) + if not db then + return error("Unable to initialized database "..dbpath) + end + local sql + -- check if table exists + if sqlite.hasTable(db, "categories") == 0 then + -- create the table + sql = [[ + CREATE TABLE "categories" ( + "id" INTEGER, + "name" TEXT NOT NULL, + PRIMARY KEY("id" AUTOINCREMENT) + ); + ]] + if sqlite.query(db, sql) ~= 1 then + sqlite.dbclose(db) + return error("Unable to create table categories") + end + -- insert unknown category + sql = [[ + INSERT INTO categories("id","name") VALUES (0,'Uncategoried'); + ]] + if sqlite.query(db, sql) ~= 1 then + sqlite.dbclose(db) + return error("Unable to create default category") + end + end + + if sqlite.hasTable(db, "owners") == 0 then + -- create the table + sql = [[ + CREATE TABLE "owners" ( + "id" INTEGER, + "name" TEXT NOT NULL, + PRIMARY KEY("id" AUTOINCREMENT) + ); + ]] + if sqlite.query(db, sql) ~= 1 then + sqlite.dbclose(db) + return error("Unable to create table owners") + end + -- insert unknown category + sql = [[ + INSERT INTO owners("id","name") VALUES (0,'None'); + ]] + if sqlite.query(db, sql) ~= 1 then + sqlite.dbclose(db) + return error("Unable to create default None owner") + end + end + + if sqlite.hasTable(db, "docs") == 0 then + -- create the table + sql = [[ + CREATE TABLE "docs" ( + "id" INTEGER, + "name" TEXT NOT NULL, + "ctime" INTEGER, + "day" INTEGER, + "month" INTEGER, + "year" INTEGER, + "cid" INTEGER DEFAULT 0, + "oid" INTEGER DEFAULT 0, + "file" TEXT NOT NULL, + "tags" TEXT, + "note" TEXT, + "mtime" INTEGER, + FOREIGN KEY("oid") REFERENCES "owners"("id") ON DELETE SET DEFAULT ON UPDATE NO ACTION, + FOREIGN KEY("cid") REFERENCES "categories"("id") ON DELETE SET DEFAULT ON UPDATE NO ACTION, + PRIMARY KEY("id" AUTOINCREMENT) + ); + ]] + if sqlite.query(db, sql) ~= 1 then + sqlite.dbclose(db) + return error("Unable to create table docs") + end + end + sqlite.dbclose(db) + return result("Docify initialized") +end + +handle.fetch = function(table) + local db = sqlite._getdb(vfs.ospath(dbpath)) + if not db then + return error("Unable to get database "..dbpath) + end + local r = sqlite.select(db, table, "*", "1=1") + sqlite.dbclose(db) + if r == nil then + return error("Unable to fetch data from "..table) + else + return result(r) + end +end + +handle.insert = function(param) + local db = sqlite._getdb(vfs.ospath(dbpath)) + if not db then + return error("Unable to get database "..dbpath) + end + local keys = {} + local values = {} + for k,v in pairs(param.data) do + if k ~= "id" then + table.insert(keys,k) + if type(v) == "number" then + table.insert(values, v) + elseif type(v) == "boolean" then + table.insert( values, v and 1 or 0 ) + else + local t = "\""..v:gsub('"', '""').."\"" + table.insert(values,t) + end + end + end + local sql = "INSERT INTO "..param.table.." ("..table.concat(keys,',')..') VALUES (' + sql = sql..table.concat(values,',')..');' + local r = sqlite.query(db, sql) + sqlite.dbclose(db) + if r == nil then + return error("Unable to insert data to "..param.table) + else + return result("Data inserted") + end +end + +handle.preview = function(path) + -- convert -resize 300x500 noel.pdf[0] thumb.png + local name = std.sha1(path:gsub(docpath,""))..".png" + -- try to find the thumb + local tpath = docpath.."/cache/"..name + if not vfs.exists(tpath) then + -- regenerate thumb + local cmd = "convert -resize 200x500 "..vfs.ospath(path).."[0] "..vfs.ospath(tpath) + os.execute(cmd) + end + + if vfs.exists(tpath) then + local cmd = "rm "..vfs.ospath(tpath) + os.execute(cmd) + return result("exist") + else + return error("do not exist") + end +end + +handle.update = function(param) + if not param.data.id or param.data.id == 0 then + return error("Record id is 0 or not found") + end + local db = sqlite._getdb(vfs.ospath(dbpath)) + if not db then + return error("Unable to get database "..dbpath) + end + local lst = {} + for k,v in pairs(param.data) do + if(type(v)== "number") then + table.insert(lst,k.."="..v) + elseif type(v) == "boolean" then + table.insert( lst, k.."="..(v and 1 or 0) ) + else + table.insert(lst,k.."=\""..v:gsub('"', '""').."\"") + end + end + + local sql = "UPDATE "..param.table.." SET "..table.concat(lst,",").." WHERE id="..param.data.id..";" + local r = sqlite.query(db, sql) + sqlite.dbclose(db) + if r == nil then + return error("Unable to update data to "..param.table) + else + return result("Data Updated") + end +end + +handle.delete = function(param) + if param.id == 0 then + return error("Record with id = 0 cannot be deleted") + end + + local db = sqlite._getdb(vfs.ospath(dbpath)) + if not db then + return error("Unable to get database "..dbpath) + end + local sql = "DELETE FROM "..param.table.." WHERE id="..param.id..";" + local r = sqlite.query(db, sql) + sqlite.dbclose(db) + if r == nil then + return error("Unable to delete data from "..param.table) + else + return result("Data deleted") + end +end + + +if arg.action and handle[arg.action] then + -- check if the database exits + docpath = arg.docpath + dbpath = docpath.."/docify.db" + + return handle[arg.action](arg.args) +else + return error("Invalid action parameter") +end \ No newline at end of file diff --git a/Docify/build/debug/main.css b/Docify/build/debug/main.css index 49cdd80..bef144d 100644 --- a/Docify/build/debug/main.css +++ b/Docify/build/debug/main.css @@ -1,5 +1,5 @@ afx-app-window[data-id = "Docify"] .header .label-text { - font-weight: bold !important; + font-weight: bold; } \ No newline at end of file diff --git a/Docify/build/debug/main.js b/Docify/build/debug/main.js index 30402b1..39fd3c8 100644 --- a/Docify/build/debug/main.js +++ b/Docify/build/debug/main.js @@ -1,12 +1,456 @@ (function() { - var Docify; + var DocDialog, Docify, FilePreviewDialog, OwnerDialog; + + OwnerDialog = class OwnerDialog extends this.OS.GUI.BasicDialog { + constructor() { + super("OwnerDialog", OwnerDialog.scheme); + } + + main() { + super.main(); + this.oview = this.find("ownview"); + this.oview.buttons = [ + { + text: "", + iconclass: "fa fa-plus-circle", + onbtclick: (e) => { + return this.openDialog("PromptDialog", + { + title: __("Owner"), + label: __("Name") + }).then((d) => { + return this.parent.exec("insert", + { + table: "owners", + data: { + name: d + } + }).then((r) => { + if (r.error) { + return this.error(r.error); + } + return this.owner_refresh(); + }).catch((e) => { + return this.error(__("Unable to insert owner: {0}", + e.toString()), + e); + }); + }).catch((e) => { + return this.error(e.toString(), + e); + }); + } + }, + { + text: "", + iconclass: "fa fa-minus-circle", + onbtclick: (e) => { + var item; + item = this.oview.selectedItem; + if (!item) { + return; + } + return this.ask({ + text: __("Do you realy want to delete: `{0}`", + item.data.text) + }).then((d) => { + if (!d) { + return; + } + return this.parent.exec("delete", + { + table: "owners", + id: parseInt(item.data.id) + }).then((d) => { + if (d.error) { + return this.error(d.error); + } + return this.owner_refresh(); + }).catch((e) => { + return this.error(__("Unable delete category: {0}", + e.toString()), + e); + }); + }); + } + }, + { + text: "", + iconclass: "fa fa-pencil-square-o", + onbtclick: (e) => { + var item; + item = this.oview.selectedItem; + if (!item) { + return; + } + return this.openDialog("PromptDialog", + { + title: __("Owner"), + label: __("Name"), + value: item.data.name + }).then((d) => { + return this.parent.exec("update", + { + table: "owners", + data: { + id: parseInt(item.data.id), + name: d + } + }).then((r) => { + if (r.error) { + return this.error(r.error); + } + return this.owner_refresh(); + }).catch((e) => { + return this.error(__("Unable to update owner: {0}", + e.toString()), + e); + }); + }).catch((e) => { + return this.error(e.toString()); + }); + } + } + ]; + return this.owner_refresh(); + } + + owner_refresh() { + return this.parent.exec("fetch", "owners").then((d) => { + var i, len, ref, v; + ref = d.result; + for (i = 0, len = ref.length; i < len; i++) { + v = ref[i]; + v.text = v.name; + } + return this.oview.data = d.result; + }).catch((err) => { + return this.error(__("Unable to fetch owners: {0}", err.toString()), e); + }); + } + + }; + + OwnerDialog.scheme = ` + + + +`; + + DocDialog = class DocDialog extends this.OS.GUI.BasicDialog { + constructor() { + super("DocDialog", DocDialog.scheme); + } + + main() { + super.main(); + return this.find("file-list").buttons = [ + { + text: "", + iconclass: "fa fa-plus-circle", + onbtclick: (e) => {} + }, + { + text: "", + iconclass: "fa fa-minus-circle", + onbtclick: (e) => {} + } + ]; + } + + }; + + DocDialog.scheme = ` + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
`; + + FilePreviewDialog = class FilePreviewDialog extends this.OS.GUI.BasicDialog { + constructor() { + super("FilePreviewDialog", FilePreviewDialog.scheme); + } + + main() { + super.main(); + this.flist = this.find("file-list"); + this.flist.onlistselect = (e) => { + // console.log e.data.item.data + return this.parent.exec("preview", e.data.item.data.path).then((d) => { + return console.log(d); + }).catch((e) => { + return this.error(e.toString(), e); + }); + }; + return this.refresh(); + } + + refresh() { + return `${this.parent.setting.docpath}/unclassified`.asFileHandle().read().then((d) => { + var i, len, ref, v; + if (d.error) { + return this.parent.error(d.error); + } + ref = d.result; + for (i = 0, len = ref.length; i < len; i++) { + v = ref[i]; + v.text = v.filename; + } + return this.flist.data = d.result; + }).catch((e) => { + return this.error(__("Unable to fetch unclassified file list: {0}", e.toString()), e); + }); + } + + }; + + FilePreviewDialog.scheme = ` + + + + + + +
+ +
+
+
`; Docify = class Docify extends this.OS.application.BaseApplication { constructor(args) { super("Docify", args); } - main() {} + main() { + this.catview = this.find("catview"); + this.catview.buttons = [ + { + text: "", + iconclass: "fa fa-plus-circle", + onbtclick: (e) => { + return this.openDialog("PromptDialog", + { + title: __("Category"), + label: __("Name") + }).then((d) => { + return this.exec("insert", + { + table: "categories", + data: { + name: d + } + }).then((r) => { + if (r.error) { + return this.error(r.error); + } + return this.cat_refresh(); + }).catch((e) => { + return this.error(__("Unable to insert category: {0}", + e.toString())); + }); + }).catch((e) => { + return this.error(e.toString()); + }); + } + }, + { + text: "", + iconclass: "fa fa-minus-circle", + onbtclick: (e) => { + var item; + item = this.catview.selectedItem; + if (!item) { + return; + } + return this.ask({ + text: __("Do you realy want to delete: `{0}`", + item.data.text) + }).then((d) => { + if (!d) { + return; + } + return this.exec("delete", + { + table: "categories", + id: parseInt(item.data.id) + }).then((d) => { + if (d.error) { + return this.error(d.error); + } + return this.cat_refresh(); + }).catch((e) => { + return this.error(__("Unable delete category: {0}", + e.toString())); + }); + }); + } + }, + { + text: "", + iconclass: "fa fa-pencil-square-o", + onbtclick: (e) => { + var item; + item = this.catview.selectedItem; + if (!item) { + return; + } + return this.openDialog("PromptDialog", + { + title: __("Category"), + label: __("Name"), + value: item.data.name + }).then((d) => { + return this.exec("update", + { + table: "categories", + data: { + id: parseInt(item.data.id), + name: d + } + }).then((r) => { + if (r.error) { + return this.error(r.error); + } + return this.cat_refresh(); + }).catch((e) => { + return this.error(__("Unable to update category: {0}", + e.toString())); + }); + }).catch((e) => { + return this.error(e.toString()); + }); + } + } + ]; + this.find("bt-add-doc").onbtclick = (e) => { + return this.openDialog(new DocDialog()); + }; + return this.initialize(); + } + + cat_refresh() { + return this.exec("fetch", "categories").then((d) => { + var i, len, ref, v; + ref = d.result; + for (i = 0, len = ref.length; i < len; i++) { + v = ref[i]; + v.text = v.name; + } + return this.catview.data = d.result; + }).catch((err) => { + return this.error(__("Unable to fetch categories: {0}", err.toString())); + }); + } + + initialize() { + // Check if we have configured docpath + if (this.setting.docpath) { + // check data base + return this.initdb(); + } else { + // ask user to choose a docpath + return this.openDialog("FileDialog", { + title: __("Please select a doc path"), + mimes: ['dir'] + }).then((d) => { + this.setting.docpath = d.file.path; + this._api.setting(); + return this.initdb(); + }).catch((msg) => { + return this.error(msg.toString(), msg); + }); + } + } + + exec(action, args) { + var cmd; + cmd = { + path: `${this.path()}/api.lua`, + parameters: { + action: action, + docpath: this.setting.docpath, + args: args + } + }; + return this.call(cmd); + } + + initdb() { + if (!this.setting.docpath) { + return this.error(__("No configured docpath")); + } + // fetch the categories from the database + return this.exec("init").then((d) => { + if (d.error) { + return this.error(d.error); + } + this.notify(d.result); + // load categories + return this.cat_refresh(); + }).catch((e) => { + return this.error(__("Unable to init database: {0}", e.toString())); + }); + } + + menu() { + return [ + { + text: "__(View)", + nodes: [ + { + text: "__(Owners)", + id: "owners", + shortcut: "A-O" + }, + { + text: "__(Preview)", + id: "preview", + shortcut: "A-P" + } + ], + onchildselect: (e) => { + return this.fileMenuHandle(e.data.item.data.id); + } + } + ]; + } + + fileMenuHandle(id) { + switch (id) { + case "owners": + return this.openDialog(new OwnerDialog(), { + title: __("Owners") + }); + case "preview": + return this.openDialog(new FilePreviewDialog()); + } + } }; diff --git a/Docify/build/debug/scheme.html b/Docify/build/debug/scheme.html index 250512d..840e102 100644 --- a/Docify/build/debug/scheme.html +++ b/Docify/build/debug/scheme.html @@ -3,18 +3,18 @@
- - -
- - - - -
+ +
+ +
+ + + +
diff --git a/Docify/coffees/dialogs.coffee b/Docify/coffees/dialogs.coffee new file mode 100644 index 0000000..82bdd80 --- /dev/null +++ b/Docify/coffees/dialogs.coffee @@ -0,0 +1,161 @@ +class OwnerDialog extends this.OS.GUI.BasicDialog + constructor: () -> + super "OwnerDialog", OwnerDialog.scheme + + main: () -> + super.main() + @oview = @find("ownview") + @oview.buttons = [ + { + text: "", + iconclass: "fa fa-plus-circle", + onbtclick: (e) => + @openDialog("PromptDialog", { title: __("Owner"), label: __("Name")}) + .then (d) => + @parent.exec("insert", { table: "owners", data: { name: d } }) + .then (r) => + return @error r.error if r.error + @owner_refresh() + .catch (e) => @error __("Unable to insert owner: {0}", e.toString()),e + .catch (e) => @error e.toString(),e + }, + { + text: "", + iconclass: "fa fa-minus-circle", + onbtclick: (e) => + item = @oview.selectedItem + return unless item + @ask({ text:__("Do you realy want to delete: `{0}`", item.data.text)}) + .then (d) => + return unless d + @parent.exec("delete", {table:"owners", id: parseInt(item.data.id)}) + .then (d) => + return @error d.error if d.error + @owner_refresh() + .catch (e) => + @error __("Unable delete category: {0}", e.toString()), e + }, + { + text: "", + iconclass: "fa fa-pencil-square-o", + onbtclick: (e) => + item = @oview.selectedItem + return unless item + @openDialog("PromptDialog", { title: __("Owner"), label: __("Name"), value: item.data.name }) + .then (d) => + @parent.exec("update", { table: "owners", data: { id: parseInt(item.data.id), name: d } }) + .then (r) => + return @error r.error if r.error + @owner_refresh() + .catch (e) => @error __("Unable to update owner: {0}", e.toString()), e + .catch (e) => @error e.toString() + } + ] + @owner_refresh() + + owner_refresh: () -> + @parent.exec("fetch", "owners") + .then (d) => + v.text = v.name for v in d.result + @oview.data = d.result + .catch (err) => @error __("Unable to fetch owners: {0}", err.toString()), e + +OwnerDialog.scheme = """ + + + + + +""" + +class DocDialog extends this.OS.GUI.BasicDialog + constructor: () -> + super "DocDialog", DocDialog.scheme + + main: () -> + super.main() + @find("file-list").buttons = [ + { + text: "", + iconclass: "fa fa-plus-circle", + onbtclick: (e) => + }, + { + text: "", + iconclass: "fa fa-minus-circle", + onbtclick: (e) => + } + ] + +DocDialog.scheme = """ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+""" + +class FilePreviewDialog extends this.OS.GUI.BasicDialog + constructor: () -> + super "FilePreviewDialog", FilePreviewDialog.scheme + + main: () -> + super.main() + @flist = @find("file-list") + @flist.onlistselect = (e) => + # console.log e.data.item.data + @parent.exec("preview", e.data.item.data.path) + .then (d) => + console.log d + .catch (e) => + @error e.toString(), e + @refresh() + + refresh: () -> + "#{@parent.setting.docpath}/unclassified".asFileHandle().read() + .then (d) => + return @parent.error d.error if d.error + v.text = v.filename for v in d.result + @flist.data = d.result + .catch (e) => + @error __("Unable to fetch unclassified file list: {0}", e.toString()), e + +FilePreviewDialog.scheme = """ + + + + + + + +
+ +
+
+
+""" \ No newline at end of file diff --git a/Docify/coffees/main.coffee b/Docify/coffees/main.coffee index 962d0a6..35ac037 100644 --- a/Docify/coffees/main.coffee +++ b/Docify/coffees/main.coffee @@ -3,5 +3,119 @@ class Docify extends this.OS.application.BaseApplication super "Docify", args main: () -> + + @catview = @find "catview" + @catview.buttons = [ + { + text: "", + iconclass: "fa fa-plus-circle", + onbtclick: (e) => + @openDialog("PromptDialog", { title: __("Category"), label: __("Name")}) + .then (d) => + @exec("insert", { table: "categories", data: { name: d } }) + .then (r) => + return @error r.error if r.error + @cat_refresh() + .catch (e) => @error __("Unable to insert category: {0}", e.toString()) + .catch (e) => @error e.toString() + }, + { + text: "", + iconclass: "fa fa-minus-circle", + onbtclick: (e) => + item = @catview.selectedItem + return unless item + @ask({ text:__("Do you realy want to delete: `{0}`", item.data.text)}) + .then (d) => + return unless d + @exec("delete", {table:"categories", id: parseInt(item.data.id)}) + .then (d) => + return @error d.error if d.error + @cat_refresh() + .catch (e) => + @error __("Unable delete category: {0}", e.toString()) + }, + { + text: "", + iconclass: "fa fa-pencil-square-o", + onbtclick: (e) => + item = @catview.selectedItem + return unless item + @openDialog("PromptDialog", { title: __("Category"), label: __("Name"), value: item.data.name }) + .then (d) => + @exec("update", { table: "categories", data: { id: parseInt(item.data.id), name: d } }) + .then (r) => + return @error r.error if r.error + @cat_refresh() + .catch (e) => @error __("Unable to update category: {0}", e.toString()) + .catch (e) => @error e.toString() + } + ] + + @find("bt-add-doc").onbtclick = (e) => + @openDialog new DocDialog + + @initialize() + + cat_refresh: () -> + @exec("fetch", "categories") + .then (d) => + v.text = v.name for v in d.result + @catview.data = d.result + .catch (err) => @error __("Unable to fetch categories: {0}", err.toString()) + + initialize: () -> + # Check if we have configured docpath + if @setting.docpath + # check data base + @initdb() + else + # ask user to choose a docpath + @openDialog "FileDialog", { title:__("Please select a doc path"), mimes: ['dir'] } + .then (d) => + @setting.docpath = d.file.path + @_api.setting() + @initdb() + .catch (msg) => @error msg.toString(), msg + + exec: (action, args) -> + cmd = + path: "#{@path()}/api.lua", + parameters: + action: action, + docpath: @setting.docpath, + args: args + return @call(cmd) + + initdb: () -> + return @error __("No configured docpath") unless @setting.docpath + # fetch the categories from the database + @exec("init") + .then (d) => + return @error d.error if d.error + @notify d.result + # load categories + @cat_refresh() + .catch (e) => + @error __("Unable to init database: {0}", e.toString()) + + menu: () -> + [ + { + text: "__(View)", + nodes: [ + { text: "__(Owners)", id:"owners", shortcut: "A-O"}, + { text: "__(Preview)", id:"preview", shortcut: "A-P"} + ], + onchildselect: (e) => @fileMenuHandle e.data.item.data.id + } + ] + + fileMenuHandle:(id) -> + switch id + when "owners" + @openDialog new OwnerDialog(), { title: __("Owners")} + when "preview" + @openDialog new FilePreviewDialog() this.OS.register "Docify", Docify \ No newline at end of file diff --git a/Docify/project.json b/Docify/project.json index a9578c5..3aa0f1e 100644 --- a/Docify/project.json +++ b/Docify/project.json @@ -3,6 +3,6 @@ "root": "home://workspace/antosdk-apps/Docify", "css": ["css/main.css"], "javascripts": [], - "coffees": ["coffees/main.coffee"], + "coffees": ["coffees/dialogs.coffee", "coffees/main.coffee"], "copies": ["assets/scheme.html", "api/api.lua", "package.json", "README.md"] } \ No newline at end of file