diff options
Diffstat (limited to 'apk-model.lua')
-rw-r--r-- | apk-model.lua | 75 |
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) |