* luci/libs/cbi: implement file browse fields
authorJo-Philipp Wich <jow@openwrt.org>
Fri, 10 Oct 2008 21:52:22 +0000 (21:52 +0000)
committerJo-Philipp Wich <jow@openwrt.org>
Fri, 10 Oct 2008 21:52:22 +0000 (21:52 +0000)
* luci/modules/admin-full: add file browse controller

libs/cbi/htdocs/luci-static/resources/cbi.js
libs/cbi/luasrc/cbi.lua
libs/cbi/luasrc/view/cbi/browser.htm [new file with mode: 0644]
libs/cbi/luasrc/view/cbi/filebrowser.htm [new file with mode: 0644]
modules/admin-full/luasrc/controller/admin/filebrowser.lua [new file with mode: 0644]

index d7bc74b..4b1849b 100644 (file)
@@ -167,3 +167,13 @@ function cbi_combobox_init(id, values, def, man) {
        });
        cbi_combobox(id, values, def, man);
 }
        });
        cbi_combobox(id, values, def, man);
 }
+
+function cbi_filebrowser(id, url, defpath) {
+       var field   = document.getElementById(id);
+       var browser = window.open(
+               url + ( field.value || defpath || '' ) + '?field=' + id,
+               "luci_filebrowser", "width=300,height=400,left=100,top=200,scrollbars=yes"
+       );
+
+       browser.focus();
+}
index 176fa45..eed2b64 100644 (file)
@@ -1395,6 +1395,12 @@ function FileUpload.__init__(self, ...)
        end
 end
 
        end
 end
 
+function FileUpload.formcreated(self, section)
+       return AbstractValue.formcreated(self, section) or
+               luci.http.formvalue("cbi.rlf."..section.."."..self.option) or
+               luci.http.formvalue("cbi.rlf."..section.."."..self.option..".x")
+end
+
 function FileUpload.cfgvalue(self, section)
        local val = AbstractValue.cfgvalue(self, section)
        if val and luci.fs.access(val) then
 function FileUpload.cfgvalue(self, section)
        local val = AbstractValue.cfgvalue(self, section)
        if val and luci.fs.access(val) then
@@ -1422,3 +1428,11 @@ function FileUpload.remove(self, section)
        if val and luci.fs.access(val) then luci.fs.unlink(val) end
        return AbstractValue.remove(self, section)
 end
        if val and luci.fs.access(val) then luci.fs.unlink(val) end
        return AbstractValue.remove(self, section)
 end
+
+
+FileBrowser = class(AbstractValue)
+
+function FileBrowser.__init__(self, ...)
+       AbstractValue.__init__(self, ...)
+       self.template = "cbi/browser"
+end
diff --git a/libs/cbi/luasrc/view/cbi/browser.htm b/libs/cbi/luasrc/view/cbi/browser.htm
new file mode 100644 (file)
index 0000000..1982fcb
--- /dev/null
@@ -0,0 +1,23 @@
+<%#
+LuCI - Lua Configuration Interface
+Copyright 2008 Steven Barth <steven@midlink.org>
+Copyright 2008 Jo-Philipp Wich <xm@leipzig.freifunk.net>
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+$Id$
+
+-%>
+
+<%
+       local t = require("luci.tools.webadmin")
+       local v = self:cfgvalue(section)
+-%>
+<%+cbi/valueheader%>
+       <input class="cbi-input-text" type="text"<%= attr("value", v) .. attr("name", cbid) .. attr("id", cbid) %> />
+       <input class="cbi-input-image" type="image" value="<%:cbi_browser%>" onclick="cbi_filebrowser('<%=cbid%>','<%=luci.dispatcher.build_url("admin", "filebrowser")%>'<%=self.default_path and ", '"..self.default_path.."'"%>);return false" alt="<%:cbi_browser%>" title="<%:cbi_browser%>" src="<%=resource%>/cbi/folder.png" style="vertical-align:bottom" />
+<%+cbi/valuefooter%>
diff --git a/libs/cbi/luasrc/view/cbi/filebrowser.htm b/libs/cbi/luasrc/view/cbi/filebrowser.htm
new file mode 100644 (file)
index 0000000..0e223a9
--- /dev/null
@@ -0,0 +1,122 @@
+<%#
+LuCI - Lua Configuration Interface
+Copyright 2008 Steven Barth <steven@midlink.org>
+Copyright 2008 Jo-Philipp Wich <xm@leipzig.freifunk.net>
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+$Id$
+
+-%>
+
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+    <title>Filebrowser - LuCI</title>
+       <style type="text/css">
+               #path, #listing {
+                       font-size: 85%;
+               }
+
+               ul {
+                       padding-left: 0;
+                       list-style-type: none;
+               }
+
+               li img {
+                       vertical-align: bottom;
+                       margin-right: 0.2em;
+               }
+       </style>
+
+       <script type="text/javascript">
+               function callback(path) {
+                       if( window.opener ) {
+                               var input = window.opener.document.getElementById('<%=luci.http.formvalue('field')%>');
+                               if( input ) {
+                                       input.value = path;
+                                       window.close();
+                               }
+                       }
+               }
+       </script>
+</head>
+<body>
+       <%
+               require("luci.fs")
+               require("luci.http")
+               require("luci.dispatcher")
+
+               local field   = luci.http.formvalue('field')
+               local request = luci.dispatcher.context.path
+               local path    = { '' }
+
+               for i = 3, #request do
+                       if request[i] ~= '..' and #request[i] > 0 then
+                               path[#path+1] = request[i]
+                       end
+               end
+
+               local filepath = table.concat( path, '/' )
+               local filestat = luci.fs.stat( filepath )
+               local baseurl  = luci.dispatcher.build_url('admin', 'filebrowser')
+
+               if filestat and filestat.type == "regular" then
+                       table.remove( path, #path )
+                       filepath = table.concat( path, '/' ) .. '/'
+               elseif not ( filestat and filestat.type == "directory" ) then
+                       path     = { '' }
+                       filepath = '/'
+               else
+                       filepath = filepath .. '/'
+               end
+
+               local entries = luci.fs.dir(filepath)
+       -%>
+    <div id="path">
+               Location:
+               <% for i, dir in ipairs(path) do %>
+                       <% if i == 1 then %>
+                               <a href="<%=baseurl%>?field=<%=field%>">(root)</a>
+                       <% elseif next(path, i) then %>
+                               <% baseurl = baseurl .. '/' .. dir %>
+                               / <a href="<%=baseurl%>?field=<%=field%>"><%=dir%></a>
+                       <% else %>
+                               <% baseurl = baseurl .. '/' .. dir %>
+                               / <%=dir%>
+                       <% end %>
+               <% end %>
+       </div>
+
+       <hr />
+
+       <div id="listing">
+               <ul>
+                       <% for _, e in luci.util.vspairs(entries) do
+                           local stat = luci.fs.stat(filepath..e)
+                               if e ~= '.' and e ~= '..' and stat and stat.type == 'directory' then
+                       -%>
+                               <li class="dir">
+                                       <img src="/luci-static/resources/cbi/folder.png" alt="Directory" />
+                                       <a href="<%=baseurl%>/<%=e%>?field=<%=field%>"><%=e%>/</a>
+                               </li>
+                       <% end end -%>
+
+                       <% for _, e in luci.util.vspairs(entries) do
+                           local stat = luci.fs.stat(filepath..e)
+                               if stat and stat.type ~= 'directory' then
+                       -%>
+                               <li class="file">
+                                       <img src="/luci-static/resources/cbi/file.png" alt="File" />
+                                       <a href="#" onclick="callback('<%=filepath..e%>')"><%=e%></a>
+                               </li>
+                       <% end end -%>
+               </ul>
+       </div>
+</body>
+</html>
diff --git a/modules/admin-full/luasrc/controller/admin/filebrowser.lua b/modules/admin-full/luasrc/controller/admin/filebrowser.lua
new file mode 100644 (file)
index 0000000..d83139f
--- /dev/null
@@ -0,0 +1,20 @@
+--[[
+LuCI - Lua Configuration Interface
+
+Copyright 2008 Steven Barth <steven@midlink.org>
+Copyright 2008 Jo-Philipp Wich <xm@leipzig.freifunk.net>
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+$Id$
+]]--
+
+module("luci.controller.admin.filebrowser", package.seeall)
+
+function index()
+       entry( {"admin", "filebrowser"}, template("cbi/filebrowser") ).leaf = true
+end