123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- const statestore = require('../store/state.js')
- const { appendTopic } = require('../utils/index.js')
-
- module.exports = function (RED) {
- function ButtonNode (config) {
- // create node in Node-RED
- RED.nodes.createNode(this, config)
- const node = this
-
- // which group are we rendering this widget
- const group = RED.nodes.getNode(config.group)
-
- const beforeSend = async function (msg) {
- let error = null
-
- // retrieve the payload we're sending from this button
- let payloadType = config.payloadType
- let payload = config.payload
-
- if (payloadType === 'flow' || payloadType === 'global') {
- try {
- const parts = RED.util.normalisePropertyExpression(payload)
- if (parts.length === 0) {
- throw new Error()
- }
- payload = RED.util.evaluateNodeProperty(payload, payloadType, node)
- } catch (err) {
- node.warn('Invalid payload property expression - defaulting to node id')
- payload = node.id
- payloadType = 'str'
- }
- } else if (payloadType === 'date') {
- payload = Date.now()
- } else {
- try {
- payload = RED.util.evaluateNodeProperty(payload, payloadType, node)
- } catch (err) {
- error = err
- if (payloadType === 'bin') {
- node.error('Badly formatted buffer')
- } else {
- node.error(err, payload)
- }
- }
- }
-
- msg.payload = payload
-
- const updates = msg.ui_update
-
- if (updates) {
- // dynamic properties
- if (typeof updates.label !== 'undefined') {
- // dynamically set "label" property
- statestore.set(group.getBase(), node, msg, 'label', updates.label)
- }
- if (typeof updates.icon !== 'undefined') {
- // dynamically set "icon" property
- statestore.set(group.getBase(), node, msg, 'icon', updates.icon)
- }
- if (typeof updates.iconPosition !== 'undefined') {
- // dynamically set "iconPosition" property
- statestore.set(group.getBase(), node, msg, 'iconPosition', updates.iconPosition)
- }
- if (typeof updates.buttonColor !== 'undefined') {
- // dynamically set "buttonColor" property
- statestore.set(group.getBase(), node, msg, 'buttonColor', updates.buttonColor)
- }
- if (typeof updates.textColor !== 'undefined') {
- // dynamically set "textColor" property
- statestore.set(group.getBase(), node, msg, 'textColor', updates.textColor)
- }
- if (typeof updates.iconColor !== 'undefined') {
- // dynamically set "iconColor" property
- statestore.set(group.getBase(), node, msg, 'iconColor', updates.iconColor)
- }
- }
-
- if (!error) {
- return msg
- } else {
- node.error(error)
- return null
- }
- }
-
- const evts = {
- onAction: true,
- beforeSend,
- onInput: async function (msg) {
- if (config.emulateClick) {
- msg = await beforeSend(msg)
-
- if (config.topic || config.topicType) {
- msg = await appendTopic(RED, config, node, msg)
- }
-
- node.send(msg)
- }
- }
- }
-
- // inform the dashboard UI that we are adding this node
- if (group) {
- group.register(node, config, evts)
- } else {
- node.error('No group configured')
- }
- }
-
- RED.nodes.registerType('ui-button', ButtonNode)
- }
|