applications: add freifunk widgets app to customize the index page

This commit is contained in:
Manuel Munz 2012-09-17 14:20:36 +00:00
parent 2ad8d7fe61
commit 745920eb08
16 changed files with 465 additions and 0 deletions

View file

@ -0,0 +1,44 @@
--[[
LuCI - Lua Configuration Interface
Copyright 2012 Manuel Munz <freifunk at somakoma de>
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
]]--
local require = require
module "luci.controller.freifunk.widgets"
function index()
local page = node("admin", "freifunk", "widgets")
page.target = cbi("freifunk/widgets/widgets_overview")
page.title = _("Widgets")
page.i18n = "widgets"
page.order = 30
local page = node("admin", "freifunk", "widgets", "widget")
page.target = cbi("freifunk/widgets/widget")
page.leaf = true
local page = node("freifunk", "search_redirect")
page.target = call("search_redirect")
page.leaf = true
end
function search_redirect()
local dsp = require "luci.dispatcher"
local http = require "luci.http"
local engine = http.formvalue("engine")
local searchterms = http.formvalue("searchterms") or ""
if engine then
http.redirect(engine .. searchterms)
else
http.redirect(dsp.build_url())
end
end

View file

@ -0,0 +1,10 @@
local map, section = ...
local width = wdg:option(Value, "width", translate("Width"))
width.rmempty = true
local height = wdg:option(Value, "height", translate("Height"))
height.rmempty = true
local pr = wdg:option(Value, "paddingright", translate("Padding right"))
pr.rmempty = true

View file

@ -0,0 +1,28 @@
local map, section = ...
local utl = require "luci.util"
local fs = require "nixio.fs"
local file = "/usr/share/customtext/" .. arg[1] .. ".html"
local form, ferr = loadfile(utl.libpath() .. "/model/cbi/freifunk/widgets/heightwidth.lua")
if form then
setfenv(form, getfenv(1))(m, wdg)
end
t = wdg:option(TextValue, "_text")
t.rmempty = true
t.rows = 20
function t.cfgvalue()
return fs.readfile(file) or ""
end
function t.write(self, section, value)
return fs.writefile(file, value)
end
function t.remove(self, section)
return fs.unlink(file)
end

View file

@ -0,0 +1,10 @@
local map, section = ...
local utl = require "luci.util"
local form, ferr = loadfile(utl.libpath() .. "/model/cbi/freifunk/widgets/heightwidth.lua")
if form then
setfenv(form, getfenv(1))(m, wdg)
end
local url = wdg:option(Value, "url", translate("URL"))
url.default = "http://www.freifunk.net"

View file

@ -0,0 +1,22 @@
local map, section = ...
local utl = require "luci.util"
local form, ferr = loadfile(utl.libpath() .. "/model/cbi/freifunk/widgets/heightwidth.lua")
if form then
setfenv(form, getfenv(1))(m, wdg)
end
local url = wdg:option(Value, "url", translate("URL"))
url.default = "http://global.freifunk.net/rss/all/rss.xml"
local max = wdg:option(Value, "max", translate("Maximal entries to show"))
max.rmempty = true
max.default = "10"
max.datatype = "integer"
local cache = wdg:option(Value, "cache", translate("Cache Time"), translate("Cache downloaded feed for that many seconds."))
cache.rmempty = true
cache.default = "3600"
cache.datatype = "integer"

View file

@ -0,0 +1,12 @@
local map, section = ...
local utl = require "luci.util"
local form, ferr = loadfile(utl.libpath() .. "/model/cbi/freifunk/widgets/heightwidth.lua")
if form then
setfenv(form, getfenv(1))(m, wdg)
end
local engine = wdg:option(DynamicList, "engine", translate("Search Engine"),
translate("Use the form Name|URL, where URL must be a full URL to the search engine " ..
"including the query GET parameter, e.g. 'Google|http://www.google.de/search?q='")
)

View file

@ -0,0 +1,53 @@
--[[
LuCI - Lua Configuration Interface
Copyright 2012 Manuel Munz <freifunk at somakoma dot de>
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
]]--
local uci = require "luci.model.uci".cursor()
local dsp = require "luci.dispatcher"
local utl = require "luci.util"
local widget = uci:get("freifunk-widgets", arg[1], "template")
local title = uci:get("freifunk-widgets", arg[1], "title") or ""
m = Map("freifunk-widgets", translate("Widget"))
m.redirect = luci.dispatcher.build_url("admin/freifunk/widgets")
if not arg[1] or m.uci:get("freifunk-widgets", arg[1]) ~= "widget" then
luci.http.redirect(m.redirect)
return
end
wdg = m:section(NamedSection, arg[1], "widget", translate("Widget") .. " " .. title)
wdg.anonymous = true
wdg.addremove = false
local en = wdg:option(Flag, "enabled", translate("Enable"))
en.rmempty = false
local title = wdg:option(Value, "title", translate("Title"))
title.rmempty = true
local order = wdg:option(Value, "order", translate("Order"))
order.default = "100"
order.placeholder = "100"
order.datatype = "integer"
local form = loadfile(
utl.libpath() .. "/model/cbi/freifunk/widgets/%s.lua" % widget
)
if form then
setfenv(form, getfenv(1))(m, wdg)
end
return m

View file

@ -0,0 +1,82 @@
--[[
LuCI - Lua Configuration Interface
Copyright 2012 Manuel Munz <freifunk at somakoma dot de>
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
]]--
local uci = require "luci.model.uci".cursor()
local fs = require "luci.fs"
local utl = require "luci.util"
m = Map("freifunk-widgets", translate("Widgets"),
translate("Configure installed widgets."))
wdg = m:section(TypedSection, "widget", translate("Widgets"))
wdg.addremove = true
wdg.extedit = luci.dispatcher.build_url("admin/freifunk/widgets/widget/%s")
wdg.template = "cbi/tblsection"
wdg.sortable = true
--[[
function wdg.create(...)
local sid = TypedSection.create(...)
luci.http.redirect(wdg.extedit % sid)
end
]]--
local en = wdg:option(Flag, "enabled", translate("Enable"))
en.rmempty = false
--en.default = "0"
function en.cfgvalue(self, section)
return Flag.cfgvalue(self, section) or "0"
end
local tmpl = wdg:option(ListValue, "template", translate("Template"))
for k, v in ipairs(fs.dir('/usr/lib/lua/luci/view/freifunk/widgets/')) do
if v ~= "." and v ~= ".." then
tmpl:value(v)
end
end
local title = wdg:option(Value, "title", translate("Title"))
--title.rmempty = true
local order = wdg:option(Value, "order", translate("Order"))
order.default = "100"
order.placeholder = "100"
order.datatype = "integer"
local width = wdg:option(Value, "width", translate("Width"))
--width.rmempty = true
local height = wdg:option(Value, "height", translate("Height"))
--height.rmempty = true
local pr = wdg:option(Value, "paddingright", translate("Padding right"))
pr.rmempty = true
function m.on_commit(self)
-- clean custom text files for elements which may have been deleted
local dir = "/usr/share/customtext/"
local active = {}
uci:foreach("freifunk-widgets", "widget", function(s)
if s["template"] == "html" then
table.insert(active, s[".name"])
end
end )
for k, v in ipairs(fs.dir(dir)) do
filename = string.gsub(v, ".html", "")
if not utl.contains(active, filename) then
fs.unlink(dir .. v)
end
end
end
return m

View file

@ -0,0 +1 @@
<div style="clear:both"></div>

View file

@ -0,0 +1,28 @@
<%
--local utl = require "luci.util"
local fs = require "luci.fs"
local title = data.title
local file = "/usr/share/customtext/" .. name .. ".html"
local text = fs.readfile(file)
local width = data.width or "100%"
local pr = data.paddingright or "0"
if type(width) == "number" then
width = width .. "px"
end
%>
<div id="<%=name%>" style="width:<%=width%>;float:left">
<div style="padding-right: <%=pr%>">
<% if title then %>
<h2><%=title%></h2>
<% end %>
<% if text then %>
<%=text%>
<%else%>
<%:Could not load the custom text from%> "<%=file%>!"
<%end%>
<%=data.text%>
</div>
</div>

View file

@ -0,0 +1,31 @@
<%
local url = data['url']
local title = data['title'] or "No title set"
local height = data['height'] or "400px"
if type(height) == "number" then
height = height .. "px"
end
local width = data['width'] or "100%"
if type(width) == "number" then
width = width .. "px"
end
%>
<div id="<%=name%>" style="width:<%=width%>;float:left;">
<h2><%=title%></h2>
<% if not url then %>
<%:No url set.%>
<% else %>
<div style="height:<%=height%>;min-height:<%=height%>">
<object type="text/html" data="<%=url%>" width="100%" height="<%=height%>" name="widget_<%=name%>" id="widget_<%=name%>">
<param name="src" value="<%=url%>" />
<%:Sorry, your browser doesn't support the object tag and cannot display this page:%><br />
<a href="<%=url%>"><%=url%></a>
</object>
</div>
</div>
<%end%>

View file

@ -0,0 +1,70 @@
<%
local sys = require "luci.sys"
local utl = require "luci.util"
local fs = require "luci.fs"
local i18n = require "luci.i18n"
local url = data.url
local title = data.title or i18n.translate("RSS")
local max = tonumber(data.max) or 10
local rss
local pr = data.paddingright or "0"
local output = {}
local width = data.width or "100%"
if type(width) == "number" then
width = width .. "px"
end
local cachetime = tonumber(data.cache) or 3600
cachefile = "/tmp/" .. name .. ".cache"
%>
<div id="<%=name%>" style="width:<%=width%>;float:left">
<div style="padding-right: <%=pr%>">
<h2><%=title%></h2>
<% if not url then %>
<%:No url found in config%>
<% else
local mtime = luci.fs.mtime(cachefile) or 0
local now = os.time()
expire = mtime + cachetime
if not fs.access(cachefile) or expire < now then
rss = sys.httpget(url)
if #rss == 0 then
%>
<%:Could not get rss data from%> <a href="<%=url%>"><%=url%></a>
<%
else
local count = 0
for item in string.gmatch(rss, "<item>(.-)</item>") do
if count < max then
local title = item:match("<title>(.-)</title>")
local link = item:match("<link>(.-)</link>")
local desc = item:match("<description>(.-)</description>") or ""
if title and link then
table.insert(output, { title = utl.pcdata(title), link = utl.pcdata(link) })
end
count = count + 1
end
end
local file = io.open(cachefile, "w")
file:write(utl.serialize_data(output))
file:close()
end
else
local file = assert(io.open(cachefile))
output = utl.restore_data(file:read'*a')
end
end
if #output > 0 then
%>
<ul>
<%
for k, v in ipairs(output) do
%>
<li><a href="<%=v.link%>"><%=v.title%></a></li>
<% end %>
</ul>
</div>
</div>
<%end%>

View file

@ -0,0 +1,32 @@
<%
local utl = require "luci.util"
local title = luci.i18n.translate(data.title or "Search")
local width = data.width or "100%"
if type(width) == "number" then
width = width .. "px"
end
%>
<div id="<%=name%>" style="width:<%=width%>;float:left">
<h2><%=title%></h2>
<div id="form_<%=name%>">
<form name="searchform" id="search_<%=name%>" action="<%=luci.dispatcher.build_url('freifunk', 'search_redirect')%>">
<input type="text" name="searchterms" style="margin-bottom:15px; width: 90%"><br />
<%
local checked = " checked"
for k, v in ipairs(data.engine) do
local e = utl.split(v, "|")
local name = e[1]
local url = e[2]
if name and url then
%>
<input name="engine" type="radio" value="<%=url%>"<%=checked%>> <%=name%><br />
<% end
checked = ""
end
%>
<input type="submit" name="SearchSubmit" value="Search" style="margin-top: 15px">
</form>
</div>
</div>

View file

@ -0,0 +1,38 @@
config widget 'iframe_freifunk'
option template 'iframe'
option order '10'
option url 'http://www.freifunk.net'
option title 'Freifunk Homepage'
option height '500px'
option width '100%'
option enabled '0'
config widget 'rss_freifunk'
option template 'rssfeed'
option order '20'
option url 'http://global.freifunk.net/rss/all/rss.xml'
option max '10'
option cache '3600'
option enabled '0'
option title 'Globaler Freifunk RSS Feed'
config widget 'search'
option template 'search'
option enabled '0'
option order '30'
option title 'Search'
list engine 'Google|http://www.google.de/search?q='
list engine 'Freifunk Wiki|http://wiki.freifunk.net/index.php?search='
option width '50%'
option paddingright '8%'
config widget 'customtext'
option template 'html'
option width '50%'
option order '40'
option enabled '0'
config widget 'clear'
option enabled '0'
option template 'clear'
option order '50'

View file

@ -0,0 +1 @@
/usr/share/customtext

View file

@ -332,6 +332,9 @@ $(eval $(call application,firewall,Firmware and Portforwarding application,\
$(eval $(call application,freifunk-policyrouting,Policy routing for mesh traffic,\
+PACKAGE_luci-app-freifunk-policyrouting:freifunk-policyrouting))
$(eval $(call application,freifunk-widgets,Widgets for the Freifunk index page,\
+PACKAGE_luci-app-freifunk-widgets:luci-mod-freifunk))
$(eval $(call application,meshwizard, Shellscript based wizard to setup mesh networks,\
+PACKAGE_luci-app-freifunk-meshwizard:meshwizard))