diff --git a/bundles/org.openhab.ui/web/src/components/rule/action-module-wizard.vue b/bundles/org.openhab.ui/web/src/components/rule/action-module-wizard.vue index ccc0c6b522..574cd0389a 100644 --- a/bundles/org.openhab.ui/web/src/components/rule/action-module-wizard.vue +++ b/bundles/org.openhab.ui/web/src/components/rule/action-module-wizard.vue @@ -33,30 +33,43 @@ </f7-list> </f7-block> <f7-block class="no-margin no-padding" v-else-if="category === 'item'"> + <f7-list> + <f7-list-item radio :checked="itemEventType === 'command'" name="MediaEventType" title="send a command to" @click="updateItemEventType('command')" /> + <f7-list-item radio :checked="itemEventType === 'update'" name="MediaEventType" title="update the state of" @click="updateItemEventType('update')" /> + </f7-list> <f7-list> <item-picker :value="currentModule.configuration.itemName" title="Item" @input="(val) => $set(currentModule.configuration, 'itemName', val)" @itemSelected="(value) => { $set(this, 'currentItem', value); updateItemEventType('command') }" /> </f7-list> <f7-list> <f7-list-input + v-if="itemEventType === 'command'" label="Command to send" name="command" type="text" :value="currentModule.configuration.command" @blur="(evt) => $set(currentModule.configuration, 'command', evt.target.value)" /> + <f7-list-input + v-else-if="itemEventType === 'update'" + label="to state" + name="state" + type="text" + :value="currentModule.configuration.state" + @blur="(evt) => $set(currentModule.configuration, 'state', evt.target.value)" + /> </f7-list> - <f7-list v-if="commandSuggestions.length"> + <f7-list v-if="itemEventType === 'command' && commandSuggestions.length"> <f7-list-item radio :checked="currentModule.configuration.command === suggestion.command" v-for="suggestion in commandSuggestions" :key="suggestion.command" :title="suggestion.label" @click="$set(currentModule.configuration, 'command', suggestion.command)" /> </f7-list> - <!-- <f7-block v-if="currentItem && (currentItem.type === 'Dimmer' || currentItem.type === 'Rollershutter' || (currentItem.type === 'Number' && currentItem.stateDescription && currentItem.stateDescription.minimum !== undefined))"> + <!-- <f7-block v-if="itemEventType === 'command' && currentItem && (currentItem.type === 'Dimmer' || currentItem.type === 'Rollershutter' || (currentItem.type === 'Number' && currentItem.stateDescription && currentItem.stateDescription.minimum !== undefined))"> <f7-range :value="currentModule.configuration.command" @range:changed="(val) => $set(currentModule.configuration, 'command', val)" :min="(currentItem.stateDescription && currentItem.stateDescription.minimum) ? currentItem.stateDescription.minimum : 0" :max="(currentItem.stateDescription && currentItem.stateDescription.maximum) ? currentItem.stateDescription.maximum : 100" :step="(currentItem.stateDescription && currentItem.stateDescription.step) ? currentItem.stateDescription.step : 1" :scale="true" :label="true" :scaleSubSteps="5" /> </f7-block> --> - <f7-list v-if="currentItem && currentItem.type === 'Color'" media-list> + <f7-list v-if="itemEventType === 'command' && currentItem && currentItem.type === 'Color'" media-list> <f7-list-input media-item type="colorpicker" label="Pick a color" :color-picker-params="{ targetEl: '#color-picker-value', targetElSetBackgroundColor: true, @@ -206,7 +219,12 @@ export default { this.itemEventType = type switch (type) { case 'command': - this.$emit('typeSelect', 'core.ItemCommandAction') + this.$emit('typeSelect', 'core.ItemCommandAction', true) + if (this.currentItem) this.$set(this.currentModule, 'configuration', Object.assign({}, { itemName: this.currentItem.name })) + break + case 'update': + this.$emit('typeSelect', 'core.ItemStateUpdateAction', true) + if (this.currentItem) this.$set(this.currentModule, 'configuration', Object.assign({}, { itemName: this.currentItem.name })) break } }, @@ -214,10 +232,10 @@ export default { this.rulesEventType = type switch (type) { case 'run': - this.$emit('typeSelect', 'core.RunRuleAction') + this.$emit('typeSelect', 'core.RunRuleAction', true) break case 'enable': - this.$emit('typeSelect', 'core.RuleEnablementAction') + this.$emit('typeSelect', 'core.RuleEnablementAction', true) break } }, @@ -225,10 +243,10 @@ export default { this.mediaEventType = type switch (type) { case 'say': - this.$emit('typeSelect', 'media.SayAction') + this.$emit('typeSelect', 'media.SayAction', true) break case 'play': - this.$emit('typeSelect', 'media.PlayAction') + this.$emit('typeSelect', 'media.PlayAction', true) break } }, diff --git a/bundles/org.openhab.ui/web/src/pages/settings/rules/module-description-suggestions.js b/bundles/org.openhab.ui/web/src/pages/settings/rules/module-description-suggestions.js index bbfeb2607a..2c62ece7f0 100644 --- a/bundles/org.openhab.ui/web/src/pages/settings/rules/module-description-suggestions.js +++ b/bundles/org.openhab.ui/web/src/pages/settings/rules/module-description-suggestions.js @@ -67,6 +67,9 @@ export default { case 'core.ItemCommandAction': if (!config.itemName || !config.command) return moduleType.label return 'Send command ' + config.command + ' to ' + config.itemName + case 'core.ItemStateUpdateAction': + if (!config.itemName || !config.state) return moduleType.label + return 'Update the state of ' + config.itemName + ' to ' + config.state case 'media.SayAction': if (!config.text) return moduleType.label return 'Say "' + config.text + '"' diff --git a/bundles/org.openhab.ui/web/src/pages/settings/rules/rules-list.vue b/bundles/org.openhab.ui/web/src/pages/settings/rules/rules-list.vue index aa2427a55b..f17efd022c 100644 --- a/bundles/org.openhab.ui/web/src/pages/settings/rules/rules-list.vue +++ b/bundles/org.openhab.ui/web/src/pages/settings/rules/rules-list.vue @@ -181,7 +181,6 @@ export default { }, startEventSource () { this.eventSource = this.$oh.sse.connect('/rest/events?topics=openhab/rules/*/*', null, (event) => { - console.log(event) const topicParts = event.topic.split('/') switch (topicParts[3]) { case 'added': @@ -191,8 +190,11 @@ export default { break case 'state': const rule = this.rules.find((r) => r.uid === topicParts[2]) + const newStatus = JSON.parse(event.payload) if (!rule) break - this.$set(rule, 'status', JSON.parse(event.payload)) + if (rule.status.status !== newStatus.status) rule.status.status = newStatus.status + if (rule.status.statusDetail !== newStatus.statusDetail) rule.status.statusDetail = newStatus.statusDetail + if (rule.status.description !== newStatus.description) rule.status.description = newStatus.description } }) }, diff --git a/bundles/org.openhab.ui/web/src/pages/settings/rules/script/script-edit.vue b/bundles/org.openhab.ui/web/src/pages/settings/rules/script/script-edit.vue index 2535ad4537..120dcafdd5 100644 --- a/bundles/org.openhab.ui/web/src/pages/settings/rules/script/script-edit.vue +++ b/bundles/org.openhab.ui/web/src/pages/settings/rules/script/script-edit.vue @@ -31,15 +31,22 @@ <script-general-settings v-else-if="createMode" :createMode="true" :rule="rule" /> <f7-block class="block-narrow" v-if="newScript"> <f7-col> - <f7-block-title medium class="margin-bottom">Script Language</f7-block-title> + <f7-list media-list> + <f7-block-title medium class="margin-bottom">Scripting Method</f7-block-title> + <f7-list-item media-item radio radio-icon="start" + title="Design with Blockly" + footer="A beginner-friendly way to build scripts visually by assembling blocks" + :value="'application/javascript+blockly'" :checked="mode === 'application/javascript+blockly'" + @change="mode = 'application/javascript+blockly'"> + <img src="res/img/blockly.svg" height="32" width="32" slot="media" /> + </f7-list-item> + </f7-list> + <f7-block-footer class="margin-vertical">or choose the scripting language:</f7-block-footer> <f7-list media-list> <f7-list-item media-item radio radio-icon="start" :value="mode" :checked="mode === language.contentType" @change="mode = language.contentType" v-for="language in languages" :key="language.contentType" :title="language.name" :after="language.version" :footer="language.contentType"></f7-list-item> - <!-- <f7-list-item media-item radio radio-icon="start" - :value="mode" :checked="mode === 'application/vnd.openhab.blockly.rule'" @change="mode = 'application/vnd.openhab.blockly.rule'" - :title="'Blockly editor'"></f7-list-item> --> </f7-list> </f7-col> </f7-block> @@ -169,7 +176,7 @@ export default { actions: [], tags: ['Script'] } - this.mode = 'application/javascript' + this.mode = 'application/javascript+blockly' this.$oh.api.get('/rest/module-types/script.ScriptAction').then((data) => { this.$set(this, 'scriptModuleType', data) this.$set(this, 'languages', @@ -203,7 +210,7 @@ export default { script: '' } } - if (this.mode === 'application/vnd.openhab.blockly.rule') { + if (this.mode === 'application/javascript+blockly') { actionModule.configuration.type = 'application/javascript' actionModule.configuration.blockSource = '<xml xmlns="https://developers.google.com/blockly/xml"></xml>' } @@ -348,7 +355,6 @@ export default { }, startEventSource () { this.eventSource = this.$oh.sse.connect('/rest/events?topics=openhab/rules/' + this.ruleId + '/*', null, (event) => { - console.log(event) const topicParts = event.topic.split('/') switch (topicParts[3]) { case 'state':