Commit graph

518 commits

Author SHA1 Message Date
Jo-Philipp Wich
37422e891a luci-base: revise array sorting
Refactor various sort operations throughout luci-base to use the new
L.naturalCompare() comparator function.

This primarily ensures that embedded numbers are sorted numerically and
not in a lexicographical way.

It also simplifies some code as a side effect.

Ref: #5899
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2022-07-27 17:32:58 +02:00
Jo-Philipp Wich
8199b2ce9a luci-base: luci.js: add array sort utilities
Add two new utility functions L.naturalCompare() and L.sortedArray() to
simplify sorting arrays naturally.

Ref: #5899
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2022-07-27 17:31:01 +02:00
Jo-Philipp Wich
25dcd0b77c luci-base: uci.js: prevent sending empty uci set operations
Under certain circumstances, a staged uci option value might get unset
again before saving the config, leaving an empty section change set
behind, causing the save call to send an empty uci set request via rpc,
triggering an ubus code 4 (Resource not found) error.

In particular this prevented bridge VLANs from getting saved properly.

Fixes: #5876
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2022-07-23 00:10:17 +02:00
Jo-Philipp Wich
2771360108 luci-base: form.js: fix removing just created named GridSection
Since the `handleModalSave()` handler of the GridSection class invokes
`handleModalCancel()` after saving the data but before removing the
`addedSection` property, the `handleModalCancel` handler incorrectly
removed the uci section that has just been created.

This bug didn't affect anonymous GridSections because after saving the
id of the created section changes, causing the remove command to fail,
but for named ones with stable section IDs, the bug manifested.

Solve the issue by passing a flag to `handleModalCancel()` indicating
whether the method was called from a safe operation and use it do
decide whether to delete the new staged uci section or not.

Fixes: #5760
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2022-07-22 23:41:05 +02:00
y04
37477ca614
luci-base: optimized icons filesizes
Optimized PNG filesize without any quality loss.

Signed-off-by: Alexander Semukhin <semukhin@mail.com>
2022-06-25 01:45:55 +02:00
Jo-Philipp Wich
8effea58d7 luci-base: network.js: consider uci config for Device.getType()/getParent()
For network devices declared in uci but not yet created by netifd, the
runtime status information will be unavailable, causing methods such as
`getType()` to assume plain ethernet interfaces and `getParent()` to fail
resolving parent devices.

Fall back to infer the information from uci configuration settings in such
cases to give accurate type hints to callers.

In particular, this prevents LuCI from turning wireless target networks
containing a to-be-created bridge device into bridges themselves.

Fixes: https://github.com/openwrt/packages/issues/18768
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2022-06-16 09:52:36 +02:00
Jo-Philipp Wich
d6dbedd9e2 luci-base: ui.js: add required CSS class to dynlist widget
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2022-05-17 21:48:01 +02:00
Jo-Philipp Wich
9c136c9bea luci-base: form.js: minor tweaks for mobile styling
- Annotate gridsection textvalue cells as CBI.DummyValue widgets
 - Replace `<br>` elements with newlines in `stripTags()`

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2022-05-17 15:07:48 +02:00
Jo-Philipp Wich
b6ae1d4f4a luci-base: form.js: trim option description
If a whitespace-only description is set on an element, the CSS :empty
selector will not match, causing description icons to be shown when
there's no actual content.

To avoid that, trim the description string when building the element.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2022-05-16 16:12:01 +02:00
Jo-Philipp Wich
4e090e38d2 luci-base: luci.js: remove wrong CSS class from page footer
The `control-group` class is meant for gapless grouping of inputs with
buttons, while the page actions are just distinct buttons in a row.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2022-05-16 16:04:56 +02:00
Jo-Philipp Wich
e4e001b596 luci-base: form.js: remove stray <br> elements from section placeholder
Theme CSS styles shoudl take care of introducing padding as needed.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2022-05-16 16:03:14 +02:00
Jo-Philipp Wich
3be479446b luci-base: form.js: save parent map on opening nested modal map
Before opening (rendering) a nested modal map, make sure to save the parent
modal map in order to persist any structural uci changes, such as newly added
anonymous sections to prevent the nested map from operating on stale values
or ephemeral config section IDs.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2022-05-16 13:43:09 +02:00
Jo-Philipp Wich
f24606b1ff luci-base: form.js: handle SectionValue objects in GridSection modals
The existing logic for cloning section options into the modal form section
container did not properly handle SectionValue objects. Introduce a new
`cloneOptions()` helper to recursively traverse and properly clowning
such nested sections.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2022-05-16 13:40:49 +02:00
Jo-Philipp Wich
0c81e25faa luci-base: form.js: reset parent maps on returning from nested section modal
The nested section modal might have changed values also covered/displayed by
the parent map, so ensure to reload all parent maps in the current modal
view stack to ensure that no stale values are shown on return.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2022-05-16 13:39:36 +02:00
Jo-Philipp Wich
818776451d luci-base: form.js: allow overriding section placeholder of TableSections
The existing implementation was hardcoding the empty TableSection placeholder
instead of invoking `renderSectionPlaceholder()` which might be overridden by
various forms.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2022-05-16 13:35:18 +02:00
Jo-Philipp Wich
733ee9a7b6 luci-base: ui.js: warn about connectivity loss on changing iface settings
If specific settings such as the protocol, IP address or netmask of an
interface the user is connected to are changed, the apply/rollback
mechanism might interfere. Display an additional warning dialog in this
case, instructing the user to manually reconnect and offering to continue
with a less safe unchecked apply mechanism.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2022-05-16 13:35:18 +02:00
Jo-Philipp Wich
8583efb5a9 luci-base: ui.js: make "Apply unchecked" available from the changes dialog
Previously, "Apply unchecked" was only possible from the save action of CBI
maps, allow to invoke it from the configuration change dialog as well.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2022-05-06 13:42:55 +02:00
Jo-Philipp Wich
b6797821b8 luci-base: ui.js: gracefully handle failing confirm calls on rollback
Do not abort the poll loop if some confirm request attempts fail, which
might happen when the device starts rolling back its configuration.

Before that fix, the rollback information dialog offering an unchecked
apply was not reliably presented in such situations.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2022-05-06 13:42:54 +02:00
Jo-Philipp Wich
f2fa59e89a luci-base: form.js: rework stacked modal CBI map logic
Only stack a new modal CBI map on top of the currently displayed modal one
if the related map or section differs. This prevents misbehavior when
switching the protocol of interfaces.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2022-05-06 13:42:54 +02:00
Jo-Philipp Wich
180d39dcd2 luci-base: ui: resolve aliases and rewrites on obtaining menu node children
Extend LuCI.ui.menu.getChildren() to resolve aliases and rewrites prior to
returning the menu nodes. This allows aliasing entire menu trees instead of
just single pages.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2022-04-28 16:06:25 +02:00
Jo-Philipp Wich
d29400ea09 luci-base: ui: fix null access in ui.Table.update()
Fixes: #5702
Fixes: e0e6989a4a ("luci-base: introduce new LuCI.ui.Table class")
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2022-02-27 20:33:02 +01:00
Jo-Philipp Wich
d8ed1e7b7d luci-base: form.js: add column sorting to TableSections and GridSections
Add ability to reorder TableSection and GridSection rows by clicking on
column headers.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2022-02-24 23:45:18 +01:00
Jo-Philipp Wich
e0e6989a4a luci-base: introduce new LuCI.ui.Table class
Introduce a new `LuCI.ui.Table` class to simplify generating HTML tables
for data output and turn the existing `cbi_update_table()` procedure into
a wrapper around this new facility.

Tables generated by the new class closely resemble the old markup but
provide additional sorting capabilities.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2022-02-24 23:45:17 +01:00
Jo-Philipp Wich
5663fd596b luci-base: properly handle promise targets in Request.request()
Under some circumstances, ubus RPC requests may be initiated while LuCI is
still resolving the `rpcBaseURL` value. In this situation, the `target`
argument of the `request()` call will be a pending promise object which
results in an invalid URL when serialized by `expandURL()`, leading to an
`Failed to execute 'open' on 'XMLHttpRequest': Invalid URL` exception.

This commonly occured on the index status page which immediately initiates
ubus RPC calls on load to discover existing status page partials.

Solve the issue by filtering the given `target` argument through
`Promise.resolve()` before expanding the URL and initiating the actual
request.

Fixes: #3747
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2022-02-21 14:59:16 +01:00
Jo-Philipp Wich
21784446c1 luci-app-firewall: fix setting unspecified zone on forwardings
Fixes: #5685
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2022-02-16 00:27:37 +01:00
Jo-Philipp Wich
63d9bcb682 luci.js: remove unsafe fallback code from dom.parse()
Do not fallback to .innerHTML if DOMParser() failed for whatever reason.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2021-12-23 17:09:13 +01:00
Jo-Philipp Wich
993151504e luci-base: form.js: do not execute embedded script code in stripTags()
Instead of relying on .innerHTML which executes embedded script code to
parse a given HTML fragment, use dom.parse() which utilizies DOMParser()
internally in order to extract textContent in a safe manner.

Fixes: FS#4199
Ref: https://bugs.openwrt.org/index.php?do=details&task_id=4199
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2021-12-23 17:08:21 +01:00
Jo-Philipp Wich
008bd89310 luci-base: cbi.js: properly handle non-strings in %h and %q formats
Only replace null, objects and function values with the empty string but
return booleans and numbers as strings.

Spotted while debugging #5587.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2021-12-09 16:25:50 +01:00
Jo-Philipp Wich
604c009059 luci-base: ui.js: avoid error tooltips overlapping dropdowns
Fixes: #5588
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2021-12-09 15:29:36 +01:00
Jo-Philipp Wich
f5fbecf132 luci-base: form.js: implement AbstractValue.retain property
The new `retain` boolean property controls whether the related option value
is purged from the configuration when the dependencies of the option are
not satisifed.

Ref: #5579
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2021-12-09 15:11:07 +01:00
Jo-Philipp Wich
ff4f52983e
Merge pull request #5540 from jow-/wireguard-peer-gridsection
Implement nested grid section support and use it for wireguard peer config
2021-12-02 10:54:36 +01:00
Jo-Philipp Wich
e982c05671 luci-base: cbi.js: properly handle falsy values in cbi_update_table()
Fixes: #5544
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2021-11-23 19:12:18 +01:00
Jo-Philipp Wich
1c798d1a08 luci-base: form.js: allow nesting Grid and Table sections
Implement a simple view stack within the modal overlay to allow the modal
edit dialog of a table or grid section to render another table or grid
section which recursively opens another modal edit dialog.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2021-11-22 09:43:29 +01:00
Jo-Philipp Wich
6507b1f04b
Merge pull request #5442 from lvoegl/validation-error-popup-message
luci-base: show validation message in save error
2021-11-18 11:39:45 +01:00
Jo-Philipp Wich
de4c4f7fd4 luci-base: luci.js: fix undefined variable access in Request.request()
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2021-11-16 13:06:03 +01:00
Jo-Philipp Wich
a812b26cb8 luci-base: widget.js: use firewall.getZoneColorStyle() in zone widgets
Use the new `firewall.getZoneColorStyle()` helper to apply background
color styles.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2021-11-11 13:00:50 +01:00
Jo-Philipp Wich
d775279dbd luci-base: firewall.js: add getZoneColorStyle() helper
The getZoneColorStyle() function will produce CSS style properties that
describe the color value of the zone. The color declaration is divided
into a CSS variable called `--zone-color-rgb` which holds the RGB value
of the color and a `background-color` property assigning these values
as background property.

This allows themes to override the color with derived values, e.g. by
applying an alpha channel.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2021-11-11 13:00:50 +01:00
Jo-Philipp Wich
d4092b15ce luci-base: network.js: ignore wireless ifname patterns on retrieving devices
Only treat the given identifier as Linux netdev name if we can find a
corresponding entry in the device info cache and do not consider strings
starting with "wlan", "ath" or "wl" to be existing devices.

This fixes incorrectly adding wireless sections as ifnames to network
interfaces when the wifi-iface section name begins with one of the
`iface_patterns_wireless` patterns.

Fixes: #5069
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2021-11-10 11:57:43 +01:00
Jo-Philipp Wich
21995f0cf3 luci-base: tools.widgets: adjust zone selector dropdown markup
No functional changes but required for styling rules.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2021-11-10 11:57:43 +01:00
Jo-Philipp Wich
ad360ec00a luci-base: add legacy directory, file and device validator JS stubs
Fixes: #5466
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2021-10-28 15:08:35 +02:00
Lukas Voegl
735d949bfc luci-base: show validation message in error
Signed-off-by: Lukas Voegl <lvoegl@tdt.de>
2021-10-26 12:31:05 +02:00
Jo-Philipp Wich
63034c3607 luci-base: remove further related section types on deleting network
When removing a `config interface` section in `/etc/config/network`, drop
related `rule` and `rule6` sections too, as well as related `dhcp` sections
in `/etc/config/dhcp`.

Ref: https://forum.openwrt.org/t/grooming-etc-config/109764/7
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2021-10-22 19:44:43 +02:00
Jo-Philipp Wich
e4d24f07c9 luci-base: dispatcher: rework dispatching and menu filtering logic
- Prefer nodes that do not require authentication over nodes that do
 - Honour ACL dependencies while resolving firstchild nodes
 - Consider currently active session while scanning menu tree instead
   of only loading effective ACLs when a login node is encountered
 - Do not consider nodes for firstchild dispatching which specify a
   special "firstchild_ineligible" property
 - Hide menu nodes that have no accessible children

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2021-10-11 20:38:04 +02:00
Jo-Philipp Wich
0a31efc858 luci-base: cbi.js: use IEC 80000-13 units to format base 2 byte values
Fixes: #5354
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2021-10-08 20:53:45 +02:00
Jo-Philipp Wich
df75163e68 luci-base: form.js: add drag-drop sorting support for mobile
Fixes: #5416
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2021-10-08 16:54:38 +02:00
Vladislav Grigoryev
376af36975 luci-base: support loopback by widgets.NetworkSelect
Support the "loopback" interface by "widgets.NetworkSelect".
Enable the "loopback" option to include this interface.
Can be used to configure interface binding for services.

Signed-off-by: Vladislav Grigoryev <vg.aetera@gmail.com>
2021-08-15 02:56:45 +03:00
Jo-Philipp Wich
6045f584ce
Merge pull request #5239 from aparcar/seconds 2021-08-11 18:57:20 +02:00
Florian Eckert
d81564e064
Merge pull request #5154 from TDT-AG/pr/20210628-luci-compat
luci-base: prevent empty field for adding new entry
2021-08-11 09:35:24 +02:00
Helge Mader
58447640eb luci-base: prevent empty field for adding new entry
Signed-off-by: Florian Eckert <fe@dev.tdt.de>
2021-08-11 08:48:41 +02:00
Paul Spooren
292e198884 luci-base: fix request timeout docstring
The `timeout` is defined in milliseconds, not seconds.

Signed-off-by: Paul Spooren <mail@aparcar.org>
2021-08-09 09:39:21 -10:00