summaryrefslogtreecommitdiffstats
path: root/apk-model.lua
diff options
context:
space:
mode:
authorTed Trask <ttrask01@yahoo.com>2016-01-28 21:03:07 +0000
committerTed Trask <ttrask01@yahoo.com>2016-01-28 21:03:07 +0000
commitc1faf5f4c95a2e3b43e65e84880b6d12f9067925 (patch)
treed6f5b9fc449671857fa3d2e8e584732c7d09cb7c /apk-model.lua
parent14e3d4fca8dceadce3d6a6a5bf2cc9f1bd4ad31d (diff)
downloadacf-apk-tools-c1faf5f4c95a2e3b43e65e84880b6d12f9067925.tar.bz2
acf-apk-tools-c1faf5f4c95a2e3b43e65e84880b6d12f9067925.tar.xz
Add server-side sorting, filtering, and pagination for available, making use of tablesorter in the HTML view
Diffstat (limited to 'apk-model.lua')
-rw-r--r--apk-model.lua75
1 files changed, 70 insertions, 5 deletions
diff --git a/apk-model.lua b/apk-model.lua
index f44e78d..e2626ce 100644
--- a/apk-model.lua
+++ b/apk-model.lua
@@ -172,21 +172,86 @@ mymodule.get_loaded_packages = function()
return cfe({ type="group", value={toplevel=top, dependent=depend}, label="Installed Packages" })
end
-mymodule.get_available_packages = function()
+mymodule.get_available_packages = function(self, clientdata)
repo = repository()
-- available are all except same version installed
- local available = cfe({ type="list", value={}, label="Available Packages" })
+ local retval = cfe({ type="group", value={}, label="Available Packages" })
+ retval.value.page = cfe({ value=0, label="Page Number", descr="0 indicates ALL", key=true })
+ retval.value.pagesize = cfe({ value=10, label="Page Size", key=true })
+ retval.value.rowcount = cfe({ value=0, label="Row Count" })
+ -- orderby must be an array of tables with column name and direction
+ retval.value.orderby = cfe({ type="structure", value={{column="name", direction="asc"}}, label="Order By", key=true })
+ -- filter is a table with a string filter for each column
+ retval.value.filter = cfe({ type="structure", value={name="", version=""}, label="Filter", key=true })
+ self.handle_clientdata(retval, clientdata)
+ retval.value.result = cfe({ type="structure", value={}, label="Available Packages" })
+
+ -- Process the incoming page data
+ local page = tonumber(retval.value.page.value) or 0
+ retval.value.page.value = page
+ local pagesize = tonumber(retval.value.pagesize.value) or 10
+ retval.value.pagesize.value = pagesize
+
+ local available = {}
for name,value in pairs(repo) do
if value.version and (not value.installed or value.upgrade) then
local temp = {}
temp.name = name
temp.version = value.version
temp.upgrade = value.upgrade
- available.value[#available.value + 1] = temp
+
+ -- Filter
+ for c,f in pairs(retval.value.filter.value) do
+ if temp[c] and f ~= "" and not string.find(temp[c], format.escapemagiccharacters(f)) then
+ temp = nil
+ break
+ end
+ end
+
+ available[#available + 1] = temp
+ end
+ end
+
+ -- Sort
+ if #available > 0 then
+ local function createsort(column, descending, equal)
+ return function(a,b)
+ if a[column] == b[column] then
+ return equal(a,b)
+ end
+ if descending then
+ return tostring(a[column]) > tostring(b[column])
+ end
+ return tostring(a[column]) < tostring(b[column])
+ end
end
+ local sortfunction = function(a,b) return false end
+ if #retval.value.orderby.value == 0 then
+ sortfunction = createsort("name", true, sortfunction)
+ else
+ local columns = {name=true, version=true, upgrade=true}
+ local directions = {desc=true, DESC=true}
+ for i=#retval.value.orderby.value,1,-1 do
+ local orderby = retval.value.orderby.value[i]
+ if columns[orderby.column] then
+ sortfunction = createsort(orderby.column, directions[orderby.direction], sortfunction)
+ end
+ end
+ end
+ table.sort(available, sortfunction)
+ end
+
+ -- Paginate
+ retval.value.rowcount.value = #available
+ if page > 0 then
+ for i=((page-1)*pagesize+1), (page*pagesize) do
+ retval.value.result.value[#retval.value.result.value+1] = available[i]
+ end
+ else
+ retval.value.result.value = available
end
- table.sort(available.value, function(a,b) return (a.name < b.name) end)
- return available
+
+ return retval
end
mymodule.get_delete_package = function(self, clientdata)