[#18] Add editor for disable_on_match_messages

resolves #18

Signed-off-by: Knut Ahlers <knut@ahlers.me>
This commit is contained in:
Knut Ahlers 2022-06-17 18:32:32 +02:00
parent 6e10143969
commit 40b2e9b21c
Signed by: luzifer
GPG key ID: 0066F03ED215AD7D

View file

@ -125,7 +125,10 @@
<hr> <hr>
<b-tabs content-class="mt-3"> <b-tabs
content-class="mt-3"
small
>
<b-tab> <b-tab>
<div slot="title"> <div slot="title">
Matcher <b-badge>{{ countRuleMatchers }}</b-badge> Matcher <b-badge>{{ countRuleMatchers }}</b-badge>
@ -188,6 +191,7 @@
/> />
</b-form-group> </b-form-group>
</b-tab> </b-tab>
<b-tab> <b-tab>
<div slot="title"> <div slot="title">
Cooldown <b-badge>{{ countRuleCooldowns }}</b-badge> Cooldown <b-badge>{{ countRuleCooldowns }}</b-badge>
@ -254,6 +258,7 @@
/> />
</b-form-group> </b-form-group>
</b-tab> </b-tab>
<b-tab> <b-tab>
<div slot="title"> <div slot="title">
Conditions <b-badge>{{ countRuleConditions }}</b-badge> Conditions <b-badge>{{ countRuleConditions }}</b-badge>
@ -344,6 +349,58 @@
/> />
</b-form-group> </b-form-group>
</b-tab> </b-tab>
<b-tab>
<div slot="title">
Exceptions <b-badge>{{ countRuleExceptions }}</b-badge>
</div>
<b-list-group flush>
<b-list-group-item>
<b-input-group>
<b-form-input
v-model="models.addException"
:state="!!models.addException__validation"
@keyup="validateExceptionRegex"
@paste="validateExceptionRegex"
@keyup.enter="addException"
/>
<b-input-group-append>
<b-button
variant="success"
:disabled="!models.addException__validation"
@click="addException"
>
<font-awesome-icon
fixed-width
class="mr-1"
:icon="['fas', 'plus']"
/>
Add
</b-button>
</b-input-group-append>
</b-input-group>
</b-list-group-item>
<b-list-group-item
v-for="ex in models.rule.disable_on_match_messages"
:key="ex"
class="d-flex align-items-center align-middle"
>
<code class="mr-auto">{{ ex }}</code>
<b-button
size="sm"
variant="danger"
@click="removeException(ex)"
>
<font-awesome-icon
fixed-width
:icon="['fas', 'minus']"
/>
</b-button>
</b-list-group-item>
</b-list-group>
</b-tab>
</b-tabs> </b-tabs>
</b-col> </b-col>
@ -604,6 +661,10 @@ export default {
return count return count
}, },
countRuleExceptions() {
return (this.models.rule?.disable_on_match_messages || []).length
},
countRuleMatchers() { countRuleMatchers() {
let count = 0 let count = 0
count += this.models.rule.match_channels ? 1 : 0 count += this.models.rule.match_channels ? 1 : 0
@ -627,6 +688,7 @@ export default {
filter: '', filter: '',
models: { models: {
addAction: '', addAction: '',
addException: '',
rule: {}, rule: {},
}, },
@ -679,6 +741,18 @@ export default {
this.models.rule.actions.push({ attributes: {}, type: this.models.addAction }) this.models.rule.actions.push({ attributes: {}, type: this.models.addAction })
}, },
addException() {
this.validateRegex(this.models.addException, false)
.then(ok => {
if (!ok) {
return
}
this.models.rule.disable_on_match_messages.push(this.models.addException)
this.models.addException = ''
})
},
deleteRule(uuid) { deleteRule(uuid) {
this.$bvModal.msgBoxConfirm('Do you really want to delete this rule?', { this.$bvModal.msgBoxConfirm('Do you really want to delete this rule?', {
buttonSize: 'sm', buttonSize: 'sm',
@ -843,6 +917,10 @@ export default {
this.models.rule.actions = this.models.rule.actions.filter((_, i) => i !== idx) this.models.rule.actions = this.models.rule.actions.filter((_, i) => i !== idx)
}, },
removeException(ex) {
this.models.rule.disable_on_match_messages = this.models.rule.disable_on_match_messages.filter(r => r !== ex)
},
saveRule(evt) { saveRule(evt) {
if (!this.validateRule()) { if (!this.validateRule()) {
evt.preventDefault() evt.preventDefault()
@ -1004,19 +1082,31 @@ export default {
return Boolean(duration.match(/^(?:\d+(?:s|m|h))+$/)) return Boolean(duration.match(/^(?:\d+(?:s|m|h))+$/))
}, },
validateExceptionRegex() {
return this.validateRegex(this.models.addException, false)
.then(res => Vue.set(this.models, 'addException__validation', res))
},
validateMatcherRegex() { validateMatcherRegex() {
if (this.models.rule.match_message === '') { if (this.models.rule.match_message === '') {
Vue.set(this.models.rule, 'match_message__validation', true) Vue.set(this.models.rule, 'match_message__validation', true)
return return
} }
return axios.put(`config-editor/validate-regex?regexp=${encodeURIComponent(this.models.rule.match_message)}`) return this.validateRegex(this.models.rule.match_message, true)
.then(() => { .then(res => Vue.set(this.models.rule, 'match_message__validation', res))
Vue.set(this.models.rule, 'match_message__validation', true) },
})
.catch(() => { validateRegex(regex, allowEmpty = true) {
Vue.set(this.models.rule, 'match_message__validation', false) if (regex === '' && !allowEmpty) {
return new Promise(resolve => {
resolve(false)
}) })
}
return axios.put(`config-editor/validate-regex?regexp=${encodeURIComponent(regex)}`)
.then(() => true)
.catch(() => false)
}, },
validateRule() { validateRule() {