applications: add freifunk widgets app to customize the index page
This commit is contained in:
parent
2ad8d7fe61
commit
745920eb08
16 changed files with 465 additions and 0 deletions
|
@ -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
|
|
@ -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
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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"
|
|
@ -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"
|
||||||
|
|
||||||
|
|
|
@ -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='")
|
||||||
|
)
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
<div style="clear:both"></div>
|
|
@ -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>
|
|
@ -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%>
|
|
@ -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%>
|
|
@ -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>
|
|
@ -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'
|
|
@ -0,0 +1 @@
|
||||||
|
/usr/share/customtext
|
|
@ -332,6 +332,9 @@ $(eval $(call application,firewall,Firmware and Portforwarding application,\
|
||||||
$(eval $(call application,freifunk-policyrouting,Policy routing for mesh traffic,\
|
$(eval $(call application,freifunk-policyrouting,Policy routing for mesh traffic,\
|
||||||
+PACKAGE_luci-app-freifunk-policyrouting:freifunk-policyrouting))
|
+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,\
|
$(eval $(call application,meshwizard, Shellscript based wizard to setup mesh networks,\
|
||||||
+PACKAGE_luci-app-freifunk-meshwizard:meshwizard))
|
+PACKAGE_luci-app-freifunk-meshwizard:meshwizard))
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue