', { class: 'nrdb2-sb-info' }).text(`${groups.length} Groups`).appendTo(titleRow)
+
+ // adds groups within this page
+ titleRow.click(titleToggle(item.id, groupsList, chevron))
+ const groupsOL = addGroupOrderingList(item.id, groupsList, groups, widgetsByGroup)
+
+ // page - actions
+ const actions = $('', { class: 'nrdb2-sb-list-header-actions' }).appendTo(titleRow)
+ addRowActions(actions, item, groupsOL)
+ addRowStateOptions(actions, item)
+ }
},
sortItems: function (items) {
// track any changes
@@ -1159,15 +1212,20 @@
}
})
- Object.values(pages).sort((a, b) => a.order - b.order).forEach(function (page) {
- const groups = groupsByPage[page.id] || []
- if (RED._db2debug) { console.log('dashboard 2: ui_base.html: buildLayoutOrderEditor: adding groups', groups) }
- if (page) {
- pagesOL.editableList('addItem', page)
- }
- // groups.forEach(() => {
+ const items = {
+ ...pages,
+ ...links
+ }
- // })
+ Object.values(items).sort((a, b) => a.order - b.order).forEach(function (item) {
+ let groups = []
+ if (item.type === 'ui-page' && item.id) {
+ if (RED._db2debug) { console.log('dashboard 2: ui_base.html: buildLayoutOrderEditor: adding groups', groups) }
+ groups = groupsByPage[item.id] || []
+ }
+ if (item) {
+ pagesOL.editableList('addItem', item)
+ }
})
// add Unattached Groups to the bottom
diff --git a/nodes/config/ui_base.js b/nodes/config/ui_base.js
index 0129c40b..e32de057 100644
--- a/nodes/config/ui_base.js
+++ b/nodes/config/ui_base.js
@@ -231,7 +231,7 @@ module.exports = function (RED) {
const pageNodes = []
const themes = []
RED.nodes.eachNode(n => {
- if (n.type === 'ui-page') {
+ if (n.type === 'ui-page' || n.type === 'ui-link') {
pageNodes.push(n)
} else if (n.type === 'ui-base' && n.id !== node.id) {
baseNodes.push(n)
@@ -880,7 +880,7 @@ module.exports = function (RED) {
// map pages by their ID
if (page && !node.ui.pages.has(page?.id)) {
- const { _user, type, ...p } = page
+ const { _users, ...p } = page
node.ui.pages.set(page.id, p)
}
diff --git a/nodes/config/ui_link.html b/nodes/config/ui_link.html
new file mode 100644
index 00000000..c2e30e29
--- /dev/null
+++ b/nodes/config/ui_link.html
@@ -0,0 +1,108 @@
+
+
+
diff --git a/nodes/config/ui_link.js b/nodes/config/ui_link.js
new file mode 100644
index 00000000..fb422665
--- /dev/null
+++ b/nodes/config/ui_link.js
@@ -0,0 +1,63 @@
+module.exports = function (RED) {
+ /**
+ *
+ * @param {*} config
+ */
+ function UILinkNode (config) {
+ RED.nodes.createNode(this, config)
+ const node = this
+
+ node.on('close', function (removed, done) {
+ node.deregister() // deregister self
+ done()
+ })
+
+ // handle bad typing in Node-RED
+ if (!('disabled' in config)) {
+ // ensure we have a value
+ config.disabled = false
+ } else {
+ // ensure we have a boolean
+ config.disabled = (config.disabled === 'true' || config.disabled === true)
+ }
+ if (!('visible' in config)) {
+ // ensure we have a value
+ config.visible = true
+ } else {
+ // ensure we have a boolean
+ config.visible = (config.visible === 'true' || config.visible === true)
+ }
+
+ const ui = RED.nodes.getNode(config.ui)
+
+ // register self
+ ui.register(config)
+
+ /**
+ * Function for widgets to register themselves with this page
+ * Calls the parent UI Base "register" function and registers this page,
+ * along with the widget
+ * @param {*} widget
+ */
+ node.register = function (group, widgetNode, widgetConfig, widgetEvents) {
+ const link = config
+ if (ui) {
+ ui.register(link, group, widgetNode, widgetConfig, widgetEvents)
+ } else {
+ node.error(`Error registering Widget - ${widgetNode.name || widgetNode.id}. No parent ui-base node found for ui-link node: ${(link.name || link.id)}`)
+ }
+ }
+ node.deregister = function (group, widgetNode) {
+ const link = config
+ if (ui) {
+ ui.deregister(link, group, widgetNode)
+ }
+ }
+
+ // Return the UI Base Node this page lives in
+ node.getBase = function () {
+ return RED.nodes.getNode(config.ui)
+ }
+ }
+ RED.nodes.registerType('ui-link', UILinkNode)
+}
diff --git a/nodes/config/ui_page.html b/nodes/config/ui_page.html
index d7e12b30..4780835e 100644
--- a/nodes/config/ui_page.html
+++ b/nodes/config/ui_page.html
@@ -60,12 +60,12 @@
})
// backwards compatibility
- if (this.visible === undefined) {
+ if (this.visible === undefined || this.visible === 'true') {
this.visible = true
$('#node-config-input-visible').val('true')
}
// backwards compatibility
- if (this.disabled === undefined) {
+ if (this.disabled === undefined || this.visible === 'false') {
this.disabled = false
$('#node-config-input-disabled').val('false')
}
diff --git a/package.json b/package.json
index a7b41c75..ccc33058 100644
--- a/package.json
+++ b/package.json
@@ -112,6 +112,7 @@
"nodes": {
"ui-base": "nodes/config/ui_base.js",
"ui-page": "nodes/config/ui_page.js",
+ "ui-link": "nodes/config/ui_link.js",
"ui-group": "nodes/config/ui_group.js",
"ui-theme": "nodes/config/ui_theme.js",
"ui-form": "nodes/widgets/ui_form.js",
diff --git a/ui/src/debug/Debug.vue b/ui/src/debug/Debug.vue
index 4567d42c..fb4e7094 100644
--- a/ui/src/debug/Debug.vue
+++ b/ui/src/debug/Debug.vue
@@ -43,7 +43,7 @@
- Show Groups
+ Show Groups
diff --git a/ui/src/layouts/Baseline.vue b/ui/src/layouts/Baseline.vue
index 2c8829f6..c593592f 100644
--- a/ui/src/layouts/Baseline.vue
+++ b/ui/src/layouts/Baseline.vue
@@ -35,7 +35,8 @@
:disabled="page.disabled || undefined"
:prepend-icon="`mdi-${page.icon?.replace(/^mdi-/, '') || 'home'}`"
:title="getPageLabel(page)"
- :to="{name: page.route.name}" link
+ :href="page.type === 'ui-link' ? page.path : null"
+ :to="page.type === 'ui-page' ? { name: page.route.name } : null"
:data-nav="page.id"
@click="closeNavigationDrawer()"
/>