From 2eff121d86427f3a8f5e67b56e4967b1cac40966 Mon Sep 17 00:00:00 2001 From: Gayan Sandamal Date: Mon, 7 Oct 2024 11:31:18 +0530 Subject: [PATCH 01/14] Implementation of dialog groups for all the layout types --- .../fixtures/flows/dashboard-controls.json | 167 ++++++++++++++++++ cypress/tests/widgets/control.spec.js | 15 ++ docs/nodes/config/ui-group.md | 2 +- docs/nodes/widgets/ui-control.md | 17 ++ nodes/config/locales/en-US/ui_group.html | 49 ++++- nodes/config/locales/en-US/ui_group.json | 5 +- nodes/config/ui_group.html | 14 +- ui/src/layouts/DialogGroup.vue | 54 ++++++ ui/src/layouts/Flex.vue | 21 +++ ui/src/layouts/Grid.vue | 23 ++- ui/src/layouts/Notebook.vue | 21 +++ ui/src/layouts/Tabs.vue | 21 +++ ui/src/widgets/ui-control/UIControl.vue | 15 ++ 13 files changed, 417 insertions(+), 7 deletions(-) create mode 100644 ui/src/layouts/DialogGroup.vue diff --git a/cypress/fixtures/flows/dashboard-controls.json b/cypress/fixtures/flows/dashboard-controls.json index 85d7311af..f23ee7730 100644 --- a/cypress/fixtures/flows/dashboard-controls.json +++ b/cypress/fixtures/flows/dashboard-controls.json @@ -446,6 +446,173 @@ "visible": "true", "disabled": "false" }, + { + "id": "dashboard-ui-group-dialog-show", + "type": "ui-group", + "name": "Dialog Controls", + "page": "dashboard-ui-page-controls", + "width": "6", + "height": "1", + "order": -1, + "showTitle": true, + "className": "", + "visible": "true", + "disabled": "false", + "groupType": "default" + }, + { + "id": "dashboard-ui-group-dialog", + "type": "ui-group", + "name": "Dialog Group", + "page": "dashboard-ui-page-controls", + "width": "6", + "height": "1", + "order": -1, + "showTitle": true, + "className": "", + "visible": "true", + "disabled": "false", + "groupType": "dialog" + }, + { + "id": "dashboard-ui-button-int-group-dialog-show", + "type": "ui-button", + "z": "188402caa4d5b857", + "group": "dashboard-ui-group-dialog-show", + "name": "", + "label": "Dialog: Group - Show", + "order": -1, + "width": 0, + "height": 0, + "emulateClick": false, + "tooltip": "", + "color": "", + "bgcolor": "", + "className": "", + "icon": "", + "iconPosition": "left", + "payload": "{\"groups\":{\"show-dialog\":[\"Controls:Dialog Group\"]}}", + "payloadType": "json", + "topic": "topic", + "topicType": "msg", + "buttonColor": "", + "textColor": "", + "iconColor": "", + "x": 180, + "y": 780, + "wires": [ + [ + "dashboard-ui-control-dialog" + ] + ] + }, + { + "id": "dashboard-ui-button-int-group-dialog-hide", + "type": "ui-button", + "z": "188402caa4d5b857", + "group": "dashboard-ui-group-dialog-show", + "name": "", + "label": "Dialog: Group - Hide", + "order": -1, + "width": 0, + "height": 0, + "emulateClick": false, + "tooltip": "", + "color": "", + "bgcolor": "", + "className": "", + "icon": "", + "iconPosition": "left", + "payload": "{\"groups\":{\"hide-dialog\":[\"Controls:Dialog Group\"]}}", + "payloadType": "json", + "topic": "topic", + "topicType": "msg", + "buttonColor": "", + "textColor": "", + "iconColor": "", + "x": 180, + "y": 820, + "wires": [ + [ + "dashboard-ui-control-dialog" + ] + ] + }, + { + "id": "dashboard-ui-control-dialog", + "type": "ui-control", + "z": "188402caa4d5b857", + "name": "", + "ui": "dashboard-ui-base", + "events": "all", + "x": 460, + "y": 780, + "wires": [ + [] + ] + }, + { + "id": "dashboard-ui-form-group-dialog", + "type": "ui-form", + "z": "188402caa4d5b857", + "name": "", + "group": "dashboard-ui-group-dialog", + "label": "", + "order": -1, + "width": 0, + "height": 0, + "options": [ + { + "label": "First Name", + "key": "firstname", + "type": "text", + "required": true, + "rows": null + }, + { + "label": "Last Name", + "key": "lastname", + "type": "text", + "required": false, + "rows": null + }, + { + "label": "Email", + "key": "email", + "type": "email", + "required": true, + "rows": null + }, + { + "label": "Phone", + "key": "phone", + "type": "text", + "required": true, + "rows": null + } + ], + "formValue": { + "firstname": "", + "lastname": "", + "email": "", + "phone": "" + }, + "payload": "", + "submit": "Submit", + "cancel": "Reset", + "resetOnSubmit": true, + "topic": "topic", + "topicType": "msg", + "splitLayout": "", + "className": "", + "passthru": false, + "dropdownOptions": [], + "x": 230, + "y": 880, + "wires": [ + [] + ] + }, { "id": "dashboard-ui-control-interactivity", "type": "ui-control", diff --git a/cypress/tests/widgets/control.spec.js b/cypress/tests/widgets/control.spec.js index ba9604608..3a836af06 100644 --- a/cypress/tests/widgets/control.spec.js +++ b/cypress/tests/widgets/control.spec.js @@ -148,3 +148,18 @@ describe('Node-RED Dashboard 2.0 - Control - Enable/Disable', () => { cy.get('[data-nav="dashboard-ui-page-2"]').should('not.have.class', 'v-list-item--disabled') }) }) + +describe('Node-RED Dashboard 2.0 - Control - Show/Hide Dialog', () => { + beforeEach(() => { + cy.deployFixture('dashboard-controls') + cy.visit('/dashboard/controls') + }) + + it('can hide and show a particular dialog group', () => { + cy.clickAndWait(cy.get('#nrdb-ui-widget-dashboard-ui-button-int-group-dialog-show')) + cy.get('#nrdb-ui-widget-dashboard-ui-form-group-dialog').should('exist') + + cy.clickAndWait(cy.get('.v-dialog .v-card-item > .v-card-item__append > button')) + cy.get('#nrdb-ui-widget-dashboard-ui-form-group-dialog').should('not.exist') + }) +}) diff --git a/docs/nodes/config/ui-group.md b/docs/nodes/config/ui-group.md index 376277908..c3900b4e4 100644 --- a/docs/nodes/config/ui-group.md +++ b/docs/nodes/config/ui-group.md @@ -5,7 +5,7 @@ props: Page: The Page (ui-page) that this group will render on. Size: The width and height of the group. Height will always be reinforced by this value, the height is generally a minimum height, and will extend to fit it's content. Class: Any custom CSS classes you wish to add to the Group. - Default State:

Both of these can be overridden by the user at runtime using a ui-control node.

+ Default State:

Both of these can be overridden by the user at runtime using a ui-control node.

--- diff --git a/nodes/config/locales/en-US/ui_group.json b/nodes/config/locales/en-US/ui_group.json index 65332191d..c940211d7 100644 --- a/nodes/config/locales/en-US/ui_group.json +++ b/nodes/config/locales/en-US/ui_group.json @@ -14,7 +14,10 @@ "interactivity": "Interactivity", "active": "Active", "disabled": "Disabled", - "openDashboardSidebar": "Open Dashboard 2.0 Sidebar" + "openDashboardSidebar": "Open Dashboard 2.0 Sidebar", + "type": "Type", + "typeDefault": "Default", + "typeDialog": "Dialog" } } } \ No newline at end of file diff --git a/nodes/config/ui_group.html b/nodes/config/ui_group.html index eae33fb17..e728b1da2 100644 --- a/nodes/config/ui_group.html +++ b/nodes/config/ui_group.html @@ -13,7 +13,8 @@ showTitle: { value: true }, // show title on group card className: { value: '' }, visible: { value: true }, - disabled: { value: false } + disabled: { value: false }, + groupType: { value: 'default' } }, label: function () { const page = RED.nodes.node(this.page)?.name || '' @@ -45,6 +46,8 @@ this.disabled = true $('#node-config-input-disabled').val('true') } + + $('#node-config-input-groupType').val(this.groupType || 'default') }, oneditsave: function () { // convert string to boolean @@ -110,6 +113,15 @@ +
+
+ + +
+
diff --git a/ui/src/layouts/DialogGroup.vue b/ui/src/layouts/DialogGroup.vue new file mode 100644 index 000000000..74befc492 --- /dev/null +++ b/ui/src/layouts/DialogGroup.vue @@ -0,0 +1,54 @@ + + + + diff --git a/ui/src/layouts/Flex.vue b/ui/src/layouts/Flex.vue index 6ef255057..d5fb4b25b 100644 --- a/ui/src/layouts/Flex.vue +++ b/ui/src/layouts/Flex.vue @@ -31,6 +31,21 @@ :state="widget.state" /> +
+
+ + + +
+
@@ -38,12 +53,14 @@ import { mapGetters, mapState } from 'vuex' import BaselineLayout from './Baseline.vue' +import DialogGroup from './DialogGroup.vue' import WidgetGroup from './Group.vue' export default { name: 'LayoutFlex', components: { BaselineLayout, + DialogGroup, WidgetGroup }, data () { @@ -71,6 +88,10 @@ export default { }) return groups }, + dialogGroups () { + const groups = this.groupsByPage(this.$route.meta.id).filter((g) => g.groupType === 'dialog') + return groups + }, pageWidgets: function () { return this.widgetsByPage(this.$route.meta.id) }, diff --git a/ui/src/layouts/Grid.vue b/ui/src/layouts/Grid.vue index caf3c3b1e..392827914 100644 --- a/ui/src/layouts/Grid.vue +++ b/ui/src/layouts/Grid.vue @@ -31,6 +31,21 @@ :state="widget.state" /> +
+
+ + + +
+
@@ -38,6 +53,7 @@ import Responsiveness from '../mixins/responsiveness.js' import BaselineLayout from './Baseline.vue' +import DialogGroup from './DialogGroup.vue' import WidgetGroup from './Group.vue' // eslint-disable-next-line import/order, sort-imports @@ -47,6 +63,7 @@ export default { name: 'LayoutGrid', components: { BaselineLayout, + DialogGroup, WidgetGroup }, mixins: [Responsiveness], @@ -60,7 +77,7 @@ export default { // only show hte groups that haven't had their "visible" property set to false .filter((g) => { if ('visible' in g) { - return g.visible + return g.visible && g.groupType !== 'dialog' } return true }) @@ -69,6 +86,10 @@ export default { }) return groups }, + dialogGroups () { + const groups = this.groupsByPage(this.$route.meta.id).filter((g) => g.groupType === 'dialog') + return groups + }, pageWidgets: function () { return this.widgetsByPage(this.$route.meta.id) }, diff --git a/ui/src/layouts/Notebook.vue b/ui/src/layouts/Notebook.vue index ee70c2ce0..243bdc7de 100644 --- a/ui/src/layouts/Notebook.vue +++ b/ui/src/layouts/Notebook.vue @@ -30,6 +30,21 @@ :state="widget.state" /> +
+
+ + + +
+
@@ -39,12 +54,14 @@ import { mapGetters, mapState } from 'vuex' import Responsiveness from '../mixins/responsiveness.js' import BaselineLayout from './Baseline.vue' +import DialogGroup from './DialogGroup.vue' import WidgetGroup from './Group.vue' export default { name: 'LayoutFlex', components: { BaselineLayout, + DialogGroup, WidgetGroup }, mixins: [Responsiveness], @@ -73,6 +90,10 @@ export default { }) return groups }, + dialogGroups () { + const groups = this.groupsByPage(this.$route.meta.id).filter((g) => g.groupType === 'dialog') + return groups + }, pageWidgets: function () { return this.widgetsByPage(this.$route.meta.id) }, diff --git a/ui/src/layouts/Tabs.vue b/ui/src/layouts/Tabs.vue index 02e59c19a..ed0086c74 100644 --- a/ui/src/layouts/Tabs.vue +++ b/ui/src/layouts/Tabs.vue @@ -32,6 +32,21 @@ +
+
+ + + +
+
@@ -41,6 +56,7 @@ import Responsiveness from '../mixins/responsiveness.js' // eslint-disable-next-line import/order import BaselineLayout from './Baseline.vue' +import DialogGroup from './DialogGroup.vue' import WidgetGroup from './Group.vue' // eslint-disable-next-line import/order, sort-imports @@ -50,6 +66,7 @@ export default { name: 'LayoutTabs', components: { BaselineLayout, + DialogGroup, WidgetGroup }, mixins: [Responsiveness], @@ -77,6 +94,10 @@ export default { }) return groups }, + dialogGroups () { + const groups = this.groupsByPage(this.$route.meta.id).filter((g) => g.groupType === 'dialog') + return groups + }, pageWidgets: function () { return this.widgetsByPage(this.$route.meta.id) }, diff --git a/ui/src/widgets/ui-control/UIControl.vue b/ui/src/widgets/ui-control/UIControl.vue index 4a25c9872..6530b24b5 100644 --- a/ui/src/widgets/ui-control/UIControl.vue +++ b/ui/src/widgets/ui-control/UIControl.vue @@ -197,6 +197,21 @@ export default { setGroup(name, 'disabled', false) }) } + if ('show-dialog' in payload.groups) { + // we are setting showDialog: true + payload.groups['show-dialog'].forEach((name) => { + // Append the timestamp with the boolean value to + // detect the "show-dialog" trigger from the Vue UI, + // as the dialog can also be closed directly from the UI. + setGroup(name, 'showDialog', `true-${Date.now().toString()}`) + }) + } + if ('hide-dialog' in payload.groups) { + // we are setting showDialog: false + payload.groups['hide-dialog'].forEach((name) => { + setGroup(name, 'showDialog', `false-${Date.now().toString()}`) + }) + } } if ('url' in payload) { From a373f271507083f77e3b7a1b25fd9c0e439bc66b Mon Sep 17 00:00:00 2001 From: Gayan Sandamal Date: Mon, 7 Oct 2024 11:34:56 +0530 Subject: [PATCH 02/14] Fixes --- ui/src/layouts/Flex.vue | 2 +- ui/src/layouts/Notebook.vue | 2 +- ui/src/layouts/Tabs.vue | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ui/src/layouts/Flex.vue b/ui/src/layouts/Flex.vue index d5fb4b25b..cd97869e5 100644 --- a/ui/src/layouts/Flex.vue +++ b/ui/src/layouts/Flex.vue @@ -79,7 +79,7 @@ export default { // only show hte groups that haven't had their "visible" property set to false .filter((g) => { if ('visible' in g) { - return g.visible + return g.visible && g.groupType !== 'dialog' } return true }) diff --git a/ui/src/layouts/Notebook.vue b/ui/src/layouts/Notebook.vue index 243bdc7de..e42ff0db7 100644 --- a/ui/src/layouts/Notebook.vue +++ b/ui/src/layouts/Notebook.vue @@ -81,7 +81,7 @@ export default { // only show the groups that haven't had their "visible" property set to false .filter((g) => { if ('visible' in g) { - return g.visible + return g.visible && g.groupType !== 'dialog' } return true }) diff --git a/ui/src/layouts/Tabs.vue b/ui/src/layouts/Tabs.vue index ed0086c74..224aafcb7 100644 --- a/ui/src/layouts/Tabs.vue +++ b/ui/src/layouts/Tabs.vue @@ -85,7 +85,7 @@ export default { // only show hte groups that haven't had their "visible" property set to false .filter((g) => { if ('visible' in g) { - return g.visible + return g.visible && g.groupType !== 'dialog' } return true }) From fe57f8a1b19e66cb56d64e0980398c70ffa09ea9 Mon Sep 17 00:00:00 2001 From: Gayan Sandamal Date: Mon, 7 Oct 2024 11:43:34 +0530 Subject: [PATCH 03/14] test update --- cypress/tests/widgets/control.spec.js | 30 +++++++++++++-------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/cypress/tests/widgets/control.spec.js b/cypress/tests/widgets/control.spec.js index 3a836af06..45fb61636 100644 --- a/cypress/tests/widgets/control.spec.js +++ b/cypress/tests/widgets/control.spec.js @@ -102,6 +102,21 @@ describe('Node-RED Dashboard 2.0 - Control - Show/Hide', () => { }) }) +describe('Node-RED Dashboard 2.0 - Control - Show/Hide Dialog', () => { + beforeEach(() => { + cy.deployFixture('dashboard-controls') + cy.visit('/dashboard/controls') + }) + + it('can hide and show a particular dialog group', () => { + cy.clickAndWait(cy.get('#nrdb-ui-widget-dashboard-ui-button-int-group-dialog-show')) + cy.get('#nrdb-ui-widget-dashboard-ui-form-group-dialog').should('exist') + + cy.clickAndWait(cy.get('.v-dialog .v-card-item > .v-card-item__append > button')) + cy.get('#nrdb-ui-widget-dashboard-ui-form-group-dialog').should('not.exist') + }) +}) + describe('Node-RED Dashboard 2.0 - Control - Enable/Disable', () => { beforeEach(() => { cy.deployFixture('dashboard-controls') @@ -148,18 +163,3 @@ describe('Node-RED Dashboard 2.0 - Control - Enable/Disable', () => { cy.get('[data-nav="dashboard-ui-page-2"]').should('not.have.class', 'v-list-item--disabled') }) }) - -describe('Node-RED Dashboard 2.0 - Control - Show/Hide Dialog', () => { - beforeEach(() => { - cy.deployFixture('dashboard-controls') - cy.visit('/dashboard/controls') - }) - - it('can hide and show a particular dialog group', () => { - cy.clickAndWait(cy.get('#nrdb-ui-widget-dashboard-ui-button-int-group-dialog-show')) - cy.get('#nrdb-ui-widget-dashboard-ui-form-group-dialog').should('exist') - - cy.clickAndWait(cy.get('.v-dialog .v-card-item > .v-card-item__append > button')) - cy.get('#nrdb-ui-widget-dashboard-ui-form-group-dialog').should('not.exist') - }) -}) From 8635a604b8acc2dc8436d0d76761c8e1fcaa8875 Mon Sep 17 00:00:00 2001 From: Gayan Sandamal Date: Mon, 7 Oct 2024 12:15:44 +0530 Subject: [PATCH 04/14] increased waiting time of show dialog --- cypress/tests/widgets/control.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cypress/tests/widgets/control.spec.js b/cypress/tests/widgets/control.spec.js index 45fb61636..b760a0dda 100644 --- a/cypress/tests/widgets/control.spec.js +++ b/cypress/tests/widgets/control.spec.js @@ -109,7 +109,7 @@ describe('Node-RED Dashboard 2.0 - Control - Show/Hide Dialog', () => { }) it('can hide and show a particular dialog group', () => { - cy.clickAndWait(cy.get('#nrdb-ui-widget-dashboard-ui-button-int-group-dialog-show')) + cy.clickAndWait(cy.get('#nrdb-ui-widget-dashboard-ui-button-int-group-dialog-show'), 1000) cy.get('#nrdb-ui-widget-dashboard-ui-form-group-dialog').should('exist') cy.clickAndWait(cy.get('.v-dialog .v-card-item > .v-card-item__append > button')) From 1eaca7d72b0eca1cfde973a4fa7fcdb716e4415a Mon Sep 17 00:00:00 2001 From: Gayan Sandamal Date: Tue, 8 Oct 2024 00:08:20 +0530 Subject: [PATCH 05/14] PR review fixes --- .../fixtures/flows/dashboard-controls.json | 167 ------------------ cypress/tests/widgets/control.spec.js | 15 -- docs/nodes/config/ui-group.md | 5 +- docs/nodes/widgets/ui-control.md | 15 -- nodes/config/locales/en-US/ui_group.html | 14 +- nodes/config/ui_base.html | 2 +- nodes/config/ui_group.html | 16 +- ui/src/widgets/ui-control/UIControl.vue | 50 +++--- 8 files changed, 48 insertions(+), 236 deletions(-) diff --git a/cypress/fixtures/flows/dashboard-controls.json b/cypress/fixtures/flows/dashboard-controls.json index f23ee7730..85d7311af 100644 --- a/cypress/fixtures/flows/dashboard-controls.json +++ b/cypress/fixtures/flows/dashboard-controls.json @@ -446,173 +446,6 @@ "visible": "true", "disabled": "false" }, - { - "id": "dashboard-ui-group-dialog-show", - "type": "ui-group", - "name": "Dialog Controls", - "page": "dashboard-ui-page-controls", - "width": "6", - "height": "1", - "order": -1, - "showTitle": true, - "className": "", - "visible": "true", - "disabled": "false", - "groupType": "default" - }, - { - "id": "dashboard-ui-group-dialog", - "type": "ui-group", - "name": "Dialog Group", - "page": "dashboard-ui-page-controls", - "width": "6", - "height": "1", - "order": -1, - "showTitle": true, - "className": "", - "visible": "true", - "disabled": "false", - "groupType": "dialog" - }, - { - "id": "dashboard-ui-button-int-group-dialog-show", - "type": "ui-button", - "z": "188402caa4d5b857", - "group": "dashboard-ui-group-dialog-show", - "name": "", - "label": "Dialog: Group - Show", - "order": -1, - "width": 0, - "height": 0, - "emulateClick": false, - "tooltip": "", - "color": "", - "bgcolor": "", - "className": "", - "icon": "", - "iconPosition": "left", - "payload": "{\"groups\":{\"show-dialog\":[\"Controls:Dialog Group\"]}}", - "payloadType": "json", - "topic": "topic", - "topicType": "msg", - "buttonColor": "", - "textColor": "", - "iconColor": "", - "x": 180, - "y": 780, - "wires": [ - [ - "dashboard-ui-control-dialog" - ] - ] - }, - { - "id": "dashboard-ui-button-int-group-dialog-hide", - "type": "ui-button", - "z": "188402caa4d5b857", - "group": "dashboard-ui-group-dialog-show", - "name": "", - "label": "Dialog: Group - Hide", - "order": -1, - "width": 0, - "height": 0, - "emulateClick": false, - "tooltip": "", - "color": "", - "bgcolor": "", - "className": "", - "icon": "", - "iconPosition": "left", - "payload": "{\"groups\":{\"hide-dialog\":[\"Controls:Dialog Group\"]}}", - "payloadType": "json", - "topic": "topic", - "topicType": "msg", - "buttonColor": "", - "textColor": "", - "iconColor": "", - "x": 180, - "y": 820, - "wires": [ - [ - "dashboard-ui-control-dialog" - ] - ] - }, - { - "id": "dashboard-ui-control-dialog", - "type": "ui-control", - "z": "188402caa4d5b857", - "name": "", - "ui": "dashboard-ui-base", - "events": "all", - "x": 460, - "y": 780, - "wires": [ - [] - ] - }, - { - "id": "dashboard-ui-form-group-dialog", - "type": "ui-form", - "z": "188402caa4d5b857", - "name": "", - "group": "dashboard-ui-group-dialog", - "label": "", - "order": -1, - "width": 0, - "height": 0, - "options": [ - { - "label": "First Name", - "key": "firstname", - "type": "text", - "required": true, - "rows": null - }, - { - "label": "Last Name", - "key": "lastname", - "type": "text", - "required": false, - "rows": null - }, - { - "label": "Email", - "key": "email", - "type": "email", - "required": true, - "rows": null - }, - { - "label": "Phone", - "key": "phone", - "type": "text", - "required": true, - "rows": null - } - ], - "formValue": { - "firstname": "", - "lastname": "", - "email": "", - "phone": "" - }, - "payload": "", - "submit": "Submit", - "cancel": "Reset", - "resetOnSubmit": true, - "topic": "topic", - "topicType": "msg", - "splitLayout": "", - "className": "", - "passthru": false, - "dropdownOptions": [], - "x": 230, - "y": 880, - "wires": [ - [] - ] - }, { "id": "dashboard-ui-control-interactivity", "type": "ui-control", diff --git a/cypress/tests/widgets/control.spec.js b/cypress/tests/widgets/control.spec.js index b760a0dda..ba9604608 100644 --- a/cypress/tests/widgets/control.spec.js +++ b/cypress/tests/widgets/control.spec.js @@ -102,21 +102,6 @@ describe('Node-RED Dashboard 2.0 - Control - Show/Hide', () => { }) }) -describe('Node-RED Dashboard 2.0 - Control - Show/Hide Dialog', () => { - beforeEach(() => { - cy.deployFixture('dashboard-controls') - cy.visit('/dashboard/controls') - }) - - it('can hide and show a particular dialog group', () => { - cy.clickAndWait(cy.get('#nrdb-ui-widget-dashboard-ui-button-int-group-dialog-show'), 1000) - cy.get('#nrdb-ui-widget-dashboard-ui-form-group-dialog').should('exist') - - cy.clickAndWait(cy.get('.v-dialog .v-card-item > .v-card-item__append > button')) - cy.get('#nrdb-ui-widget-dashboard-ui-form-group-dialog').should('not.exist') - }) -}) - describe('Node-RED Dashboard 2.0 - Control - Enable/Disable', () => { beforeEach(() => { cy.deployFixture('dashboard-controls') diff --git a/docs/nodes/config/ui-group.md b/docs/nodes/config/ui-group.md index c3900b4e4..9af7a40e4 100644 --- a/docs/nodes/config/ui-group.md +++ b/docs/nodes/config/ui-group.md @@ -2,10 +2,11 @@ description: Group your widgets effectively in Node-RED Dashboard 2.0 for better organization and user navigation. props: Name: Descriptive name for this group, will show in the Node-RED Editor and as a label in the Dashboard. - Page: The Page (ui-page) that this group will render on. + Page: The Page (ui-page) that this group will render on. + Type: Controls whether the group appears as a default group or as a dialog, which needs to be triggered manually using ui-control. You can choose between 'Default' and 'Dialog' types. Size: The width and height of the group. Height will always be reinforced by this value, the height is generally a minimum height, and will extend to fit it's content. Class: Any custom CSS classes you wish to add to the Group. - Default State:
  • Visibility - Defines the default visibility of this group.
  • Interactivity - Controls whether the group and it's contents are disabled/enabled when the page is loaded.
  • Type - Controls whether the group appears as a default group or as a dialog, which needs to be triggered manually using ui-control. You can choose between 'Default' and 'Dialog' types.

Both of these can be overridden by the user at runtime using a ui-control node.

+ Default State:
  • Visibility - Defines the default visibility of this group.
  • Interactivity - Controls whether the group and it's contents are disabled/enabled when the page is loaded.

Both of these can be overridden by the user at runtime using a ui-control node.

--- diff --git a/nodes/config/ui_base.html b/nodes/config/ui_base.html index aa3953925..3de08dfea 100644 --- a/nodes/config/ui_base.html +++ b/nodes/config/ui_base.html @@ -989,7 +989,7 @@ const titleRow = $('
', { class: 'nrdb2-sb-list-header nrdb2-sb-groups-list-header' }).appendTo(container) $('').appendTo(titleRow) const chevron = $('', { style: 'width:10px;' }).appendTo(titleRow) - const groupicon = 'fa-table' + const groupicon = group.node.groupType === 'dialog' ? 'fa-window-restore' : 'fa-table' $('', { class: 'nrdb2-sb-icon nrdb2-sb-group-icon fa ' + groupicon }).appendTo(titleRow) $('', { class: 'nrdb2-sb-title' }).text(group.name || group.id).appendTo(titleRow) $('', { class: 'nrdb2-sb-info' }).text(`${widgets.length} Widgets`).appendTo(titleRow) diff --git a/nodes/config/ui_group.html b/nodes/config/ui_group.html index e728b1da2..b7a20b6c3 100644 --- a/nodes/config/ui_group.html +++ b/nodes/config/ui_group.html @@ -78,6 +78,13 @@
+
+ + +
@@ -113,15 +120,6 @@
-
-
- - -
-
diff --git a/ui/src/widgets/ui-control/UIControl.vue b/ui/src/widgets/ui-control/UIControl.vue index 6530b24b5..a53254050 100644 --- a/ui/src/widgets/ui-control/UIControl.vue +++ b/ui/src/widgets/ui-control/UIControl.vue @@ -1,4 +1,5 @@ From 72dc19fc4726d9dfd170685f31030eefc202c92e Mon Sep 17 00:00:00 2001 From: Joe Pavitt Date: Wed, 9 Oct 2024 16:24:56 +0100 Subject: [PATCH 12/14] Use FlowViewer, not hardcoded screenshot and inline JSON --- docs/examples/group-dialog-type.json | 215 ++++++++++++++++ docs/nodes/config/ui-group.md | 233 +----------------- .../node-examples/ui-group-type-flow.png | Bin 64234 -> 0 bytes 3 files changed, 224 insertions(+), 224 deletions(-) create mode 100644 docs/examples/group-dialog-type.json delete mode 100644 docs/public/images/node-examples/ui-group-type-flow.png diff --git a/docs/examples/group-dialog-type.json b/docs/examples/group-dialog-type.json new file mode 100644 index 000000000..71e5fdc0f --- /dev/null +++ b/docs/examples/group-dialog-type.json @@ -0,0 +1,215 @@ +[ + { + "id": "0aa38a714b8a3d67", + "type": "ui-form", + "z": "9337c17e1a7f6875", + "name": "", + "group": "c7871ac53089d535", + "label": "New User", + "order": 1, + "width": 0, + "height": 0, + "options": [ + { + "label": "Name", + "key": "name", + "type": "text", + "required": true, + "rows": null + }, + { + "label": "Admin", + "key": "isAdmin", + "type": "switch", + "required": false, + "rows": null + } + ], + "formValue": { + "name": "", + "isAdmin": false + }, + "payload": "", + "submit": "Add", + "cancel": "clear", + "resetOnSubmit": true, + "topic": "topic", + "topicType": "msg", + "splitLayout": "", + "className": "", + "passthru": false, + "dropdownOptions": [], + "x": 220, + "y": 100, + "wires": [ + [ + "adbd76ecf97076a1" + ] + ] + }, + { + "id": "fa4925a5253341ce", + "type": "ui-control", + "z": "9337c17e1a7f6875", + "name": "", + "ui": "c2e1aa56f50f03bd", + "events": "all", + "x": 580, + "y": 100, + "wires": [ + [] + ] + }, + { + "id": "adbd76ecf97076a1", + "type": "change", + "z": "9337c17e1a7f6875", + "name": "Hide Dialog", + "rules": [ + { + "t": "set", + "p": "payload", + "pt": "msg", + "to": "{\"groups\":{\"hide\":[\"Active Development:Dialog Group\"]}}", + "tot": "json" + } + ], + "action": "", + "property": "", + "from": "", + "to": "", + "reg": false, + "x": 390, + "y": 100, + "wires": [ + [ + "fa4925a5253341ce", + "b9d77a856b1be020" + ] + ] + }, + { + "id": "294ac777d99f5789", + "type": "ui-button", + "z": "9337c17e1a7f6875", + "group": "497106faf38a5190", + "name": "", + "label": "Add User (Dialog)", + "order": 1, + "width": 0, + "height": 0, + "emulateClick": false, + "tooltip": "", + "color": "", + "bgcolor": "", + "className": "", + "icon": "", + "iconPosition": "left", + "payload": "{\"groups\":{\"show\":[\"Active Development:Dialog Group\"]}}", + "payloadType": "json", + "topic": "topic", + "topicType": "msg", + "buttonColor": "", + "textColor": "", + "iconColor": "", + "x": 370, + "y": 140, + "wires": [ + [ + "fa4925a5253341ce", + "b9d77a856b1be020" + ] + ] + }, + { + "id": "b9d77a856b1be020", + "type": "debug", + "z": "9337c17e1a7f6875", + "name": "debug 2572", + "active": true, + "tosidebar": true, + "console": false, + "tostatus": false, + "complete": "false", + "statusVal": "", + "statusType": "auto", + "x": 590, + "y": 140, + "wires": [] + }, + { + "id": "c7871ac53089d535", + "type": "ui-group", + "name": "Dialog Group", + "page": "22b5519aa675ad88", + "width": "6", + "height": "1", + "order": 1, + "showTitle": true, + "className": "", + "visible": "true", + "disabled": "false", + "groupType": "dialog" + }, + { + "id": "c2e1aa56f50f03bd", + "type": "ui-base", + "name": "Dashboard", + "path": "/dashboard", + "includeClientData": true, + "acceptsClientConfig": [ + "ui-control", + "ui-notification" + ], + "showPathInSidebar": false, + "showPageTitle": false, + "navigationStyle": "icon", + "titleBarStyle": "default" + }, + { + "id": "497106faf38a5190", + "type": "ui-group", + "name": "Button Groups", + "page": "22b5519aa675ad88", + "width": "6", + "height": "1", + "order": 10, + "showTitle": true, + "className": "", + "visible": "true", + "disabled": "false" + }, + { + "id": "22b5519aa675ad88", + "type": "ui-page", + "name": "Active Development", + "ui": "c2e1aa56f50f03bd", + "path": "/active-development", + "icon": "forum", + "layout": "grid", + "theme": "129e99574def90a3", + "order": 1, + "className": "", + "visible": "true", + "disabled": "false" + }, + { + "id": "129e99574def90a3", + "type": "ui-theme", + "name": "Custom Theme", + "colors": { + "surface": "#000000", + "primary": "#ff4000", + "bgPage": "#f0f0f0", + "groupBg": "#ffffff", + "groupOutline": "#d9d9d9" + }, + "sizes": { + "pagePadding": "24px", + "groupGap": "12px", + "groupBorderRadius": "9px", + "widgetGap": "6px", + "density": "default" + } + } +] \ No newline at end of file diff --git a/docs/nodes/config/ui-group.md b/docs/nodes/config/ui-group.md index 6aaa80f9d..aa847d95a 100644 --- a/docs/nodes/config/ui-group.md +++ b/docs/nodes/config/ui-group.md @@ -10,6 +10,14 @@ props: --- # Config: UI Group `ui-group` @@ -37,227 +45,4 @@ _Example of how the type 'Default' option looks_ ![Example of how the type 'Dialog' option looks](/images/node-examples/ui-group-type-dialog.png "Example of how the type 'Dialog' option looks"){data-zoomable} _Example of how the type 'Dialog' option looks_ -![Example of the flow of the group type configurations](/images/node-examples/ui-group-type-flow.png "Example of the flow of the group type configurations"){data-zoomable} -_Example of the flow of the group type configurations_ - -
- Example for a Dialog Group: - - ```json -[ - { - "id": "0aa38a714b8a3d67", - "type": "ui-form", - "z": "9337c17e1a7f6875", - "name": "", - "group": "c7871ac53089d535", - "label": "New User", - "order": 1, - "width": 0, - "height": 0, - "options": [ - { - "label": "Name", - "key": "name", - "type": "text", - "required": true, - "rows": null - }, - { - "label": "Admin", - "key": "isAdmin", - "type": "switch", - "required": false, - "rows": null - } - ], - "formValue": { - "name": "", - "isAdmin": false - }, - "payload": "", - "submit": "Add", - "cancel": "clear", - "resetOnSubmit": true, - "topic": "topic", - "topicType": "msg", - "splitLayout": "", - "className": "", - "passthru": false, - "dropdownOptions": [], - "x": 220, - "y": 100, - "wires": [ - [ - "adbd76ecf97076a1" - ] - ] - }, - { - "id": "fa4925a5253341ce", - "type": "ui-control", - "z": "9337c17e1a7f6875", - "name": "", - "ui": "c2e1aa56f50f03bd", - "events": "all", - "x": 580, - "y": 100, - "wires": [ - [] - ] - }, - { - "id": "adbd76ecf97076a1", - "type": "change", - "z": "9337c17e1a7f6875", - "name": "Hide Dialog", - "rules": [ - { - "t": "set", - "p": "payload", - "pt": "msg", - "to": "{\"groups\":{\"hide\":[\"Active Development:Dialog Group\"]}}", - "tot": "json" - } - ], - "action": "", - "property": "", - "from": "", - "to": "", - "reg": false, - "x": 390, - "y": 100, - "wires": [ - [ - "fa4925a5253341ce", - "b9d77a856b1be020" - ] - ] - }, - { - "id": "294ac777d99f5789", - "type": "ui-button", - "z": "9337c17e1a7f6875", - "group": "497106faf38a5190", - "name": "", - "label": "Add User (Dialog)", - "order": 1, - "width": 0, - "height": 0, - "emulateClick": false, - "tooltip": "", - "color": "", - "bgcolor": "", - "className": "", - "icon": "", - "iconPosition": "left", - "payload": "{\"groups\":{\"show\":[\"Active Development:Dialog Group\"]}}", - "payloadType": "json", - "topic": "topic", - "topicType": "msg", - "buttonColor": "", - "textColor": "", - "iconColor": "", - "x": 370, - "y": 140, - "wires": [ - [ - "fa4925a5253341ce", - "b9d77a856b1be020" - ] - ] - }, - { - "id": "b9d77a856b1be020", - "type": "debug", - "z": "9337c17e1a7f6875", - "name": "debug 2572", - "active": true, - "tosidebar": true, - "console": false, - "tostatus": false, - "complete": "false", - "statusVal": "", - "statusType": "auto", - "x": 590, - "y": 140, - "wires": [] - }, - { - "id": "c7871ac53089d535", - "type": "ui-group", - "name": "Dialog Group", - "page": "22b5519aa675ad88", - "width": "6", - "height": "1", - "order": 1, - "showTitle": true, - "className": "", - "visible": "true", - "disabled": "false", - "groupType": "dialog" - }, - { - "id": "c2e1aa56f50f03bd", - "type": "ui-base", - "name": "Dashboard", - "path": "/dashboard", - "includeClientData": true, - "acceptsClientConfig": [ - "ui-control", - "ui-notification" - ], - "showPathInSidebar": false, - "showPageTitle": false, - "navigationStyle": "icon", - "titleBarStyle": "default" - }, - { - "id": "497106faf38a5190", - "type": "ui-group", - "name": "Button Groups", - "page": "22b5519aa675ad88", - "width": "6", - "height": "1", - "order": 10, - "showTitle": true, - "className": "", - "visible": "true", - "disabled": "false" - }, - { - "id": "22b5519aa675ad88", - "type": "ui-page", - "name": "Active Development", - "ui": "c2e1aa56f50f03bd", - "path": "/active-development", - "icon": "forum", - "layout": "grid", - "theme": "129e99574def90a3", - "order": 1, - "className": "", - "visible": "true", - "disabled": "false" - }, - { - "id": "129e99574def90a3", - "type": "ui-theme", - "name": "Custom Theme", - "colors": { - "surface": "#000000", - "primary": "#ff4000", - "bgPage": "#f0f0f0", - "groupBg": "#ffffff", - "groupOutline": "#d9d9d9" - }, - "sizes": { - "pagePadding": "24px", - "groupGap": "12px", - "groupBorderRadius": "9px", - "widgetGap": "6px", - "density": "default" - } - } -] -``` -
\ No newline at end of file + \ No newline at end of file diff --git a/docs/public/images/node-examples/ui-group-type-flow.png b/docs/public/images/node-examples/ui-group-type-flow.png deleted file mode 100644 index 18377a923bba3f7ef3458254ed94f2d5b3fc5497..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64234 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 Jbu-uKe*m;+%{>4B From 9f55d1754ebc126ce6b9a1c839de52488d4a6e46 Mon Sep 17 00:00:00 2001 From: Joe Pavitt Date: Wed, 9 Oct 2024 16:27:14 +0100 Subject: [PATCH 13/14] Tidy some docs grammar --- docs/nodes/config/ui-group.md | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/docs/nodes/config/ui-group.md b/docs/nodes/config/ui-group.md index aa847d95a..bb10d7682 100644 --- a/docs/nodes/config/ui-group.md +++ b/docs/nodes/config/ui-group.md @@ -30,17 +30,14 @@ Each group is rendered within a `ui-page` as part of a [Layout](../../contributi ## Type -Title: **Group Type** +Defines how the group will be displayed. Either as a regular (**Default**) group or as a **Dialog** group. A 'Default' group is visible by default, while a 'Dialog' group must be triggered manually using the `ui-control` node ([see documentation](/nodes/widgets/ui-control.html#show-hide)). You can choose between these two options based on your layout needs. -Defines how the group will be displayed. Either as a regular (**Default**) group or as a **Dialog** group. A 'Default' group is visible by default, while a 'Dialog' group must be triggered manually using the `ui-control` node [See the documentation](/nodes/widgets/ui-control.html#show-hide). You can choose between these two options based on your layout needs. - -### Default Groups: +### Default Groups ![Example of how the type 'Default' option looks](/images/node-examples/ui-group-type-default.png "Example of how the type 'Default' option looks"){data-zoomable} _Example of how the type 'Default' option looks_ - -### Dialog Groups: +### Dialog Groups ![Example of how the type 'Dialog' option looks](/images/node-examples/ui-group-type-dialog.png "Example of how the type 'Dialog' option looks"){data-zoomable} _Example of how the type 'Dialog' option looks_ From 4a9749d80e3063cd763da61f453874efedc593c6 Mon Sep 17 00:00:00 2001 From: Joe Pavitt Date: Wed, 9 Oct 2024 16:43:23 +0100 Subject: [PATCH 14/14] Minor in-editor help improvement --- nodes/config/locales/en-US/ui_group.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes/config/locales/en-US/ui_group.html b/nodes/config/locales/en-US/ui_group.html index 1797dd691..d50d848e7 100644 --- a/nodes/config/locales/en-US/ui_group.html +++ b/nodes/config/locales/en-US/ui_group.html @@ -15,7 +15,7 @@

Properties

option
- Controls whether the group appears as a default group or as a dialog, which needs to be triggered manually using ui-control. You can choose between Default and Dialog types. + Controls whether the group appears as a default, inline, group or is rendered as a modal/dialog. IN the latter case, you can use a ui-control to open/close the dialog.
Size