luci-app-example: add app
add a minimalistic example app for modern js-based apps Signed-off-by: Andreas Bräu <ab@andi95.de>
This commit is contained in:
parent
63034c3607
commit
02a86624ec
10 changed files with 346 additions and 0 deletions
11
applications/luci-app-example/Makefile
Normal file
11
applications/luci-app-example/Makefile
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
# See /LICENSE for more information.
|
||||||
|
# This is free software, licensed under the GNU General Public License v2.
|
||||||
|
|
||||||
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
|
LUCI_TITLE:=LuCI example app for js based luci
|
||||||
|
LUCI_DEPENDS:=+luci-base
|
||||||
|
|
||||||
|
include ../../luci.mk
|
||||||
|
|
||||||
|
# call BuildPackage - OpenWrt buildroot signature
|
11
applications/luci-app-example/README.md
Normal file
11
applications/luci-app-example/README.md
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
# Example app for js based Luci
|
||||||
|
|
||||||
|
This app is meant to be a kind of template, example or starting point for developing new luci apps.
|
||||||
|
|
||||||
|
It provides two pages in the admin backend. One is based on a view with a form and makes use of internal models. The other one uses the `E()`-method to create more flexibel pages.
|
||||||
|
|
||||||
|
The view based page is used to modify the example configuration.
|
||||||
|
|
||||||
|
The html view page just shows the configured values.
|
||||||
|
|
||||||
|
The configuration is stored in `/etc/config/example`.
|
|
@ -0,0 +1,36 @@
|
||||||
|
'use strict';
|
||||||
|
'require view';
|
||||||
|
'require form';
|
||||||
|
|
||||||
|
return view.extend({
|
||||||
|
render: function() {
|
||||||
|
var m, s, o;
|
||||||
|
|
||||||
|
m = new form.Map('example', _('Example Form'),
|
||||||
|
_('Example Form Configuration.'));
|
||||||
|
|
||||||
|
s = m.section(form.TypedSection, 'first', _('first section'));
|
||||||
|
s.anonymous = true;
|
||||||
|
|
||||||
|
s.option(form.Value, 'first_option', _('First Option'),
|
||||||
|
_('Input for the first option'));
|
||||||
|
|
||||||
|
s = m.section(form.TypedSection, 'second', _('second section'));
|
||||||
|
s.anonymous = true;
|
||||||
|
|
||||||
|
o = s.option(form.Flag, 'flag', _('Flag Option'),
|
||||||
|
_('A boolean option'));
|
||||||
|
o.default = '1';
|
||||||
|
o.rmempty = false;
|
||||||
|
|
||||||
|
o = s.option(form.ListValue, 'select', _('Select Option'),
|
||||||
|
_('A select option'));
|
||||||
|
o.placeholder = 'placeholder';
|
||||||
|
o.value('key1', 'value1');
|
||||||
|
o.value('key2', 'value2');
|
||||||
|
o.rmempty = false;
|
||||||
|
o.editable = true;
|
||||||
|
|
||||||
|
return m.render();
|
||||||
|
},
|
||||||
|
});
|
|
@ -0,0 +1,30 @@
|
||||||
|
'use strict';
|
||||||
|
'require uci';
|
||||||
|
'require view';
|
||||||
|
|
||||||
|
return view.extend({
|
||||||
|
handleSaveApply: null,
|
||||||
|
handleSave: null,
|
||||||
|
handleReset: null,
|
||||||
|
load: function() {
|
||||||
|
return Promise.all([
|
||||||
|
uci.load('example')
|
||||||
|
]);
|
||||||
|
},
|
||||||
|
render: function(data) {
|
||||||
|
var body = E([
|
||||||
|
E('h2', _('Example HTML Page'))
|
||||||
|
]);
|
||||||
|
var sections = uci.sections('example');
|
||||||
|
var listContainer = E('div');
|
||||||
|
var list = E('ul');
|
||||||
|
list.appendChild(E('li', { 'class': 'css-class' }, ['First Option in first section: ', E('em', {}, [sections[0].first_option])]));
|
||||||
|
list.appendChild(E('li', { 'class': 'css-class' }, ['Flag in second section: ', E('em', {}, [sections[1].flag])]));
|
||||||
|
list.appendChild(E('li', { 'class': 'css-class' }, ['Select in second section: ', E('em', {}, [sections[1].select])]));
|
||||||
|
listContainer.appendChild(list);
|
||||||
|
body.appendChild(listContainer);
|
||||||
|
console.log(sections);
|
||||||
|
return body;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
71
applications/luci-app-example/po/de/example.po
Normal file
71
applications/luci-app-example/po/de/example.po
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
#
|
||||||
|
# Translators:
|
||||||
|
# Andi Bräu <freifunk@andi95.de>, 2021
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Last-Translator: Andi Bräu <freifunk@andi95.de>, 2021\n"
|
||||||
|
"Language-Team: German (https://www.transifex.com/forderverein-freie-netzwerke-ev/teams/126043/de/)\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Language: de\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
|
||||||
|
#: utils/luci-app-example/htdocs/luci-static/resources/view/example/form.js:22
|
||||||
|
msgid "A boolean option"
|
||||||
|
msgstr "Eine boolsche Option"
|
||||||
|
|
||||||
|
#: utils/luci-app-example/htdocs/luci-static/resources/view/example/form.js:27
|
||||||
|
msgid "A select option"
|
||||||
|
msgstr "Eine Auswahloption"
|
||||||
|
|
||||||
|
#: utils/luci-app-example/root/usr/share/luci/menu.d/luci-app-example.json:3
|
||||||
|
msgid "Example"
|
||||||
|
msgstr "Beispiel"
|
||||||
|
|
||||||
|
#: utils/luci-app-example/htdocs/luci-static/resources/view/example/form.js:9
|
||||||
|
msgid "Example Form"
|
||||||
|
msgstr "Beispielformular"
|
||||||
|
|
||||||
|
#: utils/luci-app-example/htdocs/luci-static/resources/view/example/form.js:10
|
||||||
|
msgid "Example Form Configuration."
|
||||||
|
msgstr "Beispielformularkonfiguration"
|
||||||
|
|
||||||
|
#: utils/luci-app-example/htdocs/luci-static/resources/view/example/htmlview.js:16
|
||||||
|
msgid "Example HTML Page"
|
||||||
|
msgstr "Beispiel-HTML-Seite"
|
||||||
|
|
||||||
|
#: utils/luci-app-example/htdocs/luci-static/resources/view/example/form.js:15
|
||||||
|
msgid "First Option"
|
||||||
|
msgstr "Erste Option"
|
||||||
|
|
||||||
|
#: utils/luci-app-example/htdocs/luci-static/resources/view/example/form.js:21
|
||||||
|
msgid "Flag Option"
|
||||||
|
msgstr "Kennzeichenoption"
|
||||||
|
|
||||||
|
#: utils/luci-app-example/root/usr/share/luci/menu.d/luci-app-example.json:14
|
||||||
|
msgid "Form View"
|
||||||
|
msgstr "Formularansicht"
|
||||||
|
|
||||||
|
#: utils/luci-app-example/root/usr/share/rpcd/acl.d/luci-app-example.json:3
|
||||||
|
msgid "Grant UCI access to LuCI app ecample"
|
||||||
|
msgstr "UCI-Zugriff für LuCI Beispielanwendung gewähren"
|
||||||
|
|
||||||
|
#: utils/luci-app-example/root/usr/share/luci/menu.d/luci-app-example.json:23
|
||||||
|
msgid "HTML Page"
|
||||||
|
msgstr "HTML Seite"
|
||||||
|
|
||||||
|
#: utils/luci-app-example/htdocs/luci-static/resources/view/example/form.js:16
|
||||||
|
msgid "Input for the first option"
|
||||||
|
msgstr "Eingabe für die erste Option"
|
||||||
|
|
||||||
|
#: utils/luci-app-example/htdocs/luci-static/resources/view/example/form.js:26
|
||||||
|
msgid "Select Option"
|
||||||
|
msgstr "Auswahloption"
|
||||||
|
|
||||||
|
#: utils/luci-app-example/htdocs/luci-static/resources/view/example/form.js:12
|
||||||
|
msgid "first section"
|
||||||
|
msgstr "Erste Sektion"
|
||||||
|
|
||||||
|
#: utils/luci-app-example/htdocs/luci-static/resources/view/example/form.js:18
|
||||||
|
msgid "second section"
|
||||||
|
msgstr "Zweite Sektion"
|
62
applications/luci-app-example/po/en/example.po
Normal file
62
applications/luci-app-example/po/en/example.po
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
msgid ""
|
||||||
|
msgstr "Content-Type: text/plain; charset=UTF-8"
|
||||||
|
|
||||||
|
#: utils/luci-app-example/htdocs/luci-static/resources/view/example/form.js:22
|
||||||
|
msgid "A boolean option"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: utils/luci-app-example/htdocs/luci-static/resources/view/example/form.js:27
|
||||||
|
msgid "A select option"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: utils/luci-app-example/root/usr/share/luci/menu.d/luci-app-example.json:3
|
||||||
|
msgid "Example"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: utils/luci-app-example/htdocs/luci-static/resources/view/example/form.js:9
|
||||||
|
msgid "Example Form"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: utils/luci-app-example/htdocs/luci-static/resources/view/example/form.js:10
|
||||||
|
msgid "Example Form Configuration."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: utils/luci-app-example/htdocs/luci-static/resources/view/example/htmlview.js:16
|
||||||
|
msgid "Example HTML Page"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: utils/luci-app-example/htdocs/luci-static/resources/view/example/form.js:15
|
||||||
|
msgid "First Option"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: utils/luci-app-example/htdocs/luci-static/resources/view/example/form.js:21
|
||||||
|
msgid "Flag Option"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: utils/luci-app-example/root/usr/share/luci/menu.d/luci-app-example.json:14
|
||||||
|
msgid "Form View"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: utils/luci-app-example/root/usr/share/rpcd/acl.d/luci-app-example.json:3
|
||||||
|
msgid "Grant UCI access to LuCI app ecample"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: utils/luci-app-example/root/usr/share/luci/menu.d/luci-app-example.json:23
|
||||||
|
msgid "HTML Page"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: utils/luci-app-example/htdocs/luci-static/resources/view/example/form.js:16
|
||||||
|
msgid "Input for the first option"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: utils/luci-app-example/htdocs/luci-static/resources/view/example/form.js:26
|
||||||
|
msgid "Select Option"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: utils/luci-app-example/htdocs/luci-static/resources/view/example/form.js:12
|
||||||
|
msgid "first section"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: utils/luci-app-example/htdocs/luci-static/resources/view/example/form.js:18
|
||||||
|
msgid "second section"
|
||||||
|
msgstr ""
|
62
applications/luci-app-example/po/templates/example.pot
Normal file
62
applications/luci-app-example/po/templates/example.pot
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
msgid ""
|
||||||
|
msgstr "Content-Type: text/plain; charset=UTF-8"
|
||||||
|
|
||||||
|
#: utils/luci-app-example/htdocs/luci-static/resources/view/example/form.js:22
|
||||||
|
msgid "A boolean option"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: utils/luci-app-example/htdocs/luci-static/resources/view/example/form.js:27
|
||||||
|
msgid "A select option"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: utils/luci-app-example/root/usr/share/luci/menu.d/luci-app-example.json:3
|
||||||
|
msgid "Example"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: utils/luci-app-example/htdocs/luci-static/resources/view/example/form.js:9
|
||||||
|
msgid "Example Form"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: utils/luci-app-example/htdocs/luci-static/resources/view/example/form.js:10
|
||||||
|
msgid "Example Form Configuration."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: utils/luci-app-example/htdocs/luci-static/resources/view/example/htmlview.js:16
|
||||||
|
msgid "Example HTML Page"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: utils/luci-app-example/htdocs/luci-static/resources/view/example/form.js:15
|
||||||
|
msgid "First Option"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: utils/luci-app-example/htdocs/luci-static/resources/view/example/form.js:21
|
||||||
|
msgid "Flag Option"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: utils/luci-app-example/root/usr/share/luci/menu.d/luci-app-example.json:14
|
||||||
|
msgid "Form View"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: utils/luci-app-example/root/usr/share/rpcd/acl.d/luci-app-example.json:3
|
||||||
|
msgid "Grant UCI access to LuCI app ecample"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: utils/luci-app-example/root/usr/share/luci/menu.d/luci-app-example.json:23
|
||||||
|
msgid "HTML Page"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: utils/luci-app-example/htdocs/luci-static/resources/view/example/form.js:16
|
||||||
|
msgid "Input for the first option"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: utils/luci-app-example/htdocs/luci-static/resources/view/example/form.js:26
|
||||||
|
msgid "Select Option"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: utils/luci-app-example/htdocs/luci-static/resources/view/example/form.js:12
|
||||||
|
msgid "first section"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: utils/luci-app-example/htdocs/luci-static/resources/view/example/form.js:18
|
||||||
|
msgid "second section"
|
||||||
|
msgstr ""
|
|
@ -0,0 +1,8 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
touch /etc/config/example
|
||||||
|
uci set example.first=first
|
||||||
|
uci set example.second=second
|
||||||
|
uci commit
|
||||||
|
|
||||||
|
return 0
|
|
@ -0,0 +1,30 @@
|
||||||
|
{
|
||||||
|
"admin/example/": {
|
||||||
|
"title": "Example",
|
||||||
|
"order": 60,
|
||||||
|
"action": {
|
||||||
|
"type": "firstchild"
|
||||||
|
},
|
||||||
|
"depends": {
|
||||||
|
"acl": [ "luci-app-example" ]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"admin/example/form": {
|
||||||
|
"title": "Form View",
|
||||||
|
"order": 1,
|
||||||
|
"action": {
|
||||||
|
"type": "view",
|
||||||
|
"path": "example/form"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"admin/example/html": {
|
||||||
|
"title": "HTML Page",
|
||||||
|
"order": 2,
|
||||||
|
"action": {
|
||||||
|
"type": "view",
|
||||||
|
"path": "example/htmlview"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
{
|
||||||
|
"luci-app-example": {
|
||||||
|
"description": "Grant UCI access to LuCI app ecample",
|
||||||
|
"read": {
|
||||||
|
"ubus": {
|
||||||
|
"uci": [
|
||||||
|
"get"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"uci": [
|
||||||
|
"example"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"write": {
|
||||||
|
"ubus": {
|
||||||
|
"uci": [
|
||||||
|
"set", "commit"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"uci": [
|
||||||
|
"example"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue