123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- <script type="text/javascript">
- RED.nodes.registerType('ui-page', {
- category: 'config',
- defaults: {
- name: {
- value: RED._('@flowfuse/node-red-dashboard/ui-page:ui-page.label.pageName'),
- required: true
- },
- ui: {
- type: 'ui-base',
- value: '',
- required: true
- },
- path: {
- value: -1,
- required: false
- },
- icon: {
- value: 'home',
- required: false
- },
- layout: {
- value: '',
- required: true
- },
- theme: {
- type: 'ui-theme',
- value: 'default',
- required: true
- },
- order: {
- value: -1
- },
- className: { value: '' },
- visible: { value: 'true' },
- disabled: { value: 'false' }
- },
- oneditprepare: function () {
- if (this.path === -1) {
- // we have no path set yet
- let pageCount = 0
- RED.nodes.eachConfig((cNode) => {
- pageCount += cNode.type === 'ui-page' ? 1 : 0
- })
- this.path = '/page' + (pageCount + 1)
- $('#node-config-input-path').val(this.path)
- }
-
- $('#node-config-input-layout').typedInput({
- type: 'layout',
- types: [{
- value: 'layout',
- options: [
- { value: 'grid', label: RED._('@flowfuse/node-red-dashboard/ui-page:ui-page.label.grid') },
- { value: 'flex', label: RED._('@flowfuse/node-red-dashboard/ui-page:ui-page.label.fixed') },
- { value: 'tabs', label: RED._('@flowfuse/node-red-dashboard/ui-page:ui-page.label.tabs') },
- { value: 'notebook', label: RED._('@flowfuse/node-red-dashboard/ui-page:ui-page.label.notebook') }
- ]
- }],
- typeField: '#node-input-layoutType'
- })
-
- // backwards compatibility - because NR can't do boolean values on dropdowns
- if (this.visible === false || this.visible === 'false') {
- this.visible = false
- $('#node-config-input-visible').val('false')
- } else {
- this.visible = true
- $('#node-config-input-visible').val('true')
- }
-
- // backwards compatibility
- if (this.disabled === 'true' || this.disabled === true) {
- this.disabled = true
- $('#node-config-input-disabled').val('true')
- } else {
- this.disabled = false
- $('#node-config-input-disabled').val('false')
- }
- },
- oneditsave: function () {
- // convert string to boolean
- const visible = $('#node-config-input-visible').val()
- if (visible === 'true') {
- this.visible = true
- } else {
- this.visible = false
- }
-
- // convert string to boolean
- const disabled = $('#node-config-input-disabled').val()
- if (disabled === 'true') {
- this.disabled = true
- } else {
- this.disabled = false
- }
- },
- label: function () {
- const baseNode = RED.nodes.node(this.ui)
- const base = baseNode ? baseNode.path : '/'
- const path = this.path || ''
- return `${this.name} [${base}${path}]` || 'UI Page'
- }
- })
- </script>
-
- <script type="text/html" data-template-name="ui-page">
- <div class="form-row">
- <label for="node-config-input-name"><i class="w-16 fa fa-tag"></i> <span data-i18n="node-red:common.label.name"></label>
- <input type="text" id="node-config-input-name" data-i18n="[placeholder]node-red:common.label.name">
- </div>
- <div class="form-row">
- <label for="node-config-input-ui"><i class="w-16 fa fa-sitemap"></i> <span data-i18n="ui-page.label.ui"></label>
- <input type="text" id="node-config-input-ui">
- </div>
- <div class="form-row">
- <label for="node-config-input-path"><i class="w-16 fa fa-link"></i> <span data-i18n="ui-page.label.path"></label>
- <input type="text" id="node-config-input-path">
- </div>
- <div class="form-row">
- <label for="node-config-input-icon"><i class="w-16 fa fa-home"></i> <span data-i18n="ui-page.label.icon"></label>
- <input type="text" id="node-config-input-icon">
- </div>
- <div class="form-row">
- <label for="node-config-input-theme"><i class="w-16 fa fa-paint-brush"></i> <span data-i18n="ui-page.label.theme"></label>
- <input type="text" id="node-config-input-theme">
- </div>
- <div class="form-row">
- <label for="node-config-input-layout"><i class="w-16 fa fa-th"></i> <span data-i18n="ui-page.label.layout"></label>
- <input type="text" id="node-config-input-layout">
- <input type="hidden" id="node-config-input-layoutType">
- </div>
- <div class="form-row" id="text-row-class">
- <label for="node-config-input-className"><i class="w-16 fa fa-code"></i> <span data-i18n="ui-page.label.class"></label>
- <input type="text" id="node-config-input-className" data-i18n="[placeholder]ui-page.label.classNamePlaceholder"/>
- </div>
- <div class="form-row" style="font-weight: 600;">
- <i class="w-16 fa fa-eye"></i> <span data-i18n="ui-page.label.defaultState">
- </div>
- <div class="form-row">
- <div style="display: flex; align-items: center; gap: 2px;">
- <label for="node-config-input-visible" style="margin-bottom: 0" data-i18n="ui-page.label.visibility"></label>
- <select id="node-config-input-visible" style="width: 150px;">
- <option value="true" data-i18n="ui-page.label.visible"></option>
- <option value="false" data-i18n="ui-page.label.hidden"></option>
- </select>
- </div>
- </div>
- <div class="form-row">
- <div style="display: flex; align-items: center; gap: 2px;">
- <label for="node-config-input-disabled" style="margin-bottom: 0" data-i18n="ui-page.label.interactivity"></label>
- <select id="node-config-input-disabled" style="width: 150px;">
- <option value="false" data-i18n="ui-page.label.active"></option>
- <option value="true" data-i18n="ui-page.label.disabled"></option>
- </select>
- </div>
- </div>
- <div class="form-row">
- <button onclick="RED.sidebar.show('dashboard-2.0')" class="editor-button editor-button-small" data-i18n="ui-page.label.openDashboardSidebar"></button>
- </div>
-
- </script>
|