New Sieve GUI improvements #80

This commit is contained in:
the-djmaze 2024-09-23 03:54:31 +02:00
parent ffc2da33f8
commit 0bd3804265
48 changed files with 181 additions and 144 deletions

View file

@ -43,11 +43,12 @@ class FlagCommand extends ActionCommand
if (args[0] instanceof GrammarQuotedString) { if (args[0] instanceof GrammarQuotedString) {
this._variablename = args[0]; this._variablename = args[0];
} }
if (args[1] instanceof GrammarString) { args[0] = args[1];
this.list_of_flags = args[1]; }
} if (args[0] instanceof GrammarStringList) {
} else if (args[0] instanceof GrammarString) {
this.list_of_flags = args[0]; this.list_of_flags = args[0];
} else if (args[0]) {
this.list_of_flags.push(args[0]);
} }
} }
} }

View file

@ -18,7 +18,7 @@ export class GrammarString /*extends String*/
{ {
constructor(value = '') constructor(value = '')
{ {
this._value = value; this._value = value.toString ? value.toString() : value;
} }
toString() toString()
@ -227,6 +227,7 @@ export class GrammarStringList extends Array
{ {
toString() toString()
{ {
// if there is only a single string, the brackets are optional
if (1 < this.length) { if (1 < this.length) {
return '[' + this.join(',') + ']'; return '[' + this.join(',') + ']';
} }
@ -235,7 +236,7 @@ export class GrammarStringList extends Array
push(value) push(value)
{ {
if (!(value instanceof GrammarString)) { if (!(value instanceof GrammarQuotedString)) {
value = new GrammarQuotedString(value); value = new GrammarQuotedString(value);
} }
super.push(value); super.push(value);

View file

@ -134,7 +134,7 @@ export class SieveScriptPopupView extends rl.pluginPopupView {
templateName(obj) { templateName(obj) {
const id = 'Sieve' + obj.constructor.name; const id = 'Sieve' + obj.constructor.name;
return document.getElementById(id) ? id : null; return document.getElementById(id) ? id : 'SieveCommand';
} }
beforeShow(oScript) { beforeShow(oScript) {

View file

@ -34,3 +34,16 @@
height: 300px; height: 300px;
font-family: var(--fontMono); font-family: var(--fontMono);
} }
.sieve-block {
border: 1px solid var(--border-color, #ddd);
margin: 1em 0;
padding: 0.5em;
}
.sieve-block > div {
padding-left:2em;
}
.sieve-block > details > div {
padding-left:1em;
}

View file

@ -1,4 +1,4 @@
<!-- rfc5232 --> <!-- rfc5232 -->
addflag addflag
<input type="text" name="_variablename" data-bind="textInput: _variablename"> <input type="text" data-bind="textInput: variablename">
<textarea name="source">GrammarStringList</textarea> <input type="text" data-bind="textInput: list_of_flags" pattern='".+"|\[".+"(,".+")*\]'>

View file

@ -1,5 +1,5 @@
<!-- rfc5293 --> <!-- rfc5293 -->
addheader addheader
<label><input type="checkbox" name="last"> last</label> <label><input type="checkbox"> last</label>
<input type="text" name="field_name" data-bind="textInput: field_name"> <input type="text" data-bind="textInput: field_name">
<input type="text" name="value" data-bind="textInput: value"> <input type="text" data-bind="textInput: value">

View file

@ -1,13 +1,13 @@
<!-- rfc5228 --> <!-- rfc5228 -->
address address
<select name="address_part"> <select>
<option>:localpart</option> <option>:localpart</option>
<option>:domain</option> <option>:domain</option>
<option>:all</option> <option>:all</option>
</select> </select>
<textarea name="header_list">GrammarStringList</textarea> <input type="text" data-bind="textInput: header_list" pattern='".+"|\[".+"(,".+")*\]'>
<textarea name="key_list">GrammarStringList</textarea> <input type="text" data-bind="textInput: key_list" pattern='".+"|\[".+"(,".+")*\]'>
<input type="number" name="index"> <input type="number">
<input type="checkbox" name="last"> <input type="checkbox">
// mime // mime
// anychild // anychild

View file

@ -1,4 +1,4 @@
<!-- rfc5173 --> <!-- rfc5173 -->
body body
body_transform = ''; // :raw, :content <string-list>, :text body_transform = ''; // :raw, :content <string-list>, :text
<textarea name="key_list">GrammarStringList</textarea> <input type="text" data-bind="textInput: key_list" pattern='".+"|\[".+"(,".+")*\]'>

View file

@ -1,5 +1,5 @@
<!-- rfc5260 --> <!-- rfc5260 -->
currentdate currentdate
<input type="text" name="zone" data-bind="textInput: zone"> <input type="text" data-bind="textInput: zone">
<input type="text" name="date_part" data-bind="textInput: date_part"> <input type="text" data-bind="textInput: date_part">
<textarea name="key_list">GrammarStringList</textarea> <input type="text" data-bind="textInput: key_list" pattern='".+"|\[".+"(,".+")*\]'>

View file

@ -1,9 +1,9 @@
<!-- rfc5260 --> <!-- rfc5260 -->
date date
<input type="text" name="zone" data-bind="textInput: zone"> <input type="text" data-bind="textInput: zone">
<label><input type="checkbox" name="originalzone"> originalzone</label> <label><input type="checkbox"> originalzone</label>
<input type="text" name="header_name" data-bind="textInput: header_name"> <input type="text" data-bind="textInput: header_name">
<input type="text" name="date_part" data-bind="textInput: date_part"> <input type="text" data-bind="textInput: date_part">
<textarea name="key_list">GrammarStringList</textarea> <input type="text" data-bind="textInput: key_list" pattern='".+"|\[".+"(,".+")*\]'>
<input type="number" name="index"> <input type="number">
<label><input type="checkbox" name="last"> last</label> <label><input type="checkbox"> last</label>

View file

@ -1,13 +1,13 @@
<!-- rfc5293 --> <!-- rfc5293 -->
deleteheader deleteheader
<input type="number" name="index"> <input type="number">
<label><input type="checkbox" name="last"> last</label> <label><input type="checkbox"> last</label>
comparator = '', comparator = '',
<select name="match_type"> <select>
<option>:is</option> <option>:is</option>
<option>:contains</option> <option>:contains</option>
<option>:matches</option> <option>:matches</option>
<option data-bind="visible root.capa.extlists">:list</option> <option data-bind="visible root.capa.extlists">:list</option>
</select> </select>
<input type="text" name="field_name" data-bind="textInput: field_name"> <input type="text" data-bind="textInput: field_name">
<textarea name="source">GrammarStringList</textarea> <input type="text" data-bind="textInput: source" pattern='".+"|\[".+"(,".+")*\]'>

View file

@ -1,8 +1,12 @@
<!-- rfc5228 --> <!-- rfc5228 -->
elsif <div class="sieve-block">
<div data-bind="template: {name: $root.templateName(test), data: test}"></div> <details>
{ <summary data-bind="text: 'elsif ' + test"></summary>
<div style="padding-left:4em" data-bind="foreach: commands"> <div data-bind="template: {name: $root.templateName(test), data: test}"></div>
<div data-bind="template: {name: $root.templateName($data)}"></div> </details>
</div> {
} <div data-bind="foreach: commands">
<div data-bind="template: {name: $root.templateName($data)}"></div>
</div>
}
</div>

View file

@ -1,7 +1,9 @@
<!-- rfc5228 --> <!-- rfc5228 -->
else <div class="sieve-block">
{ <span>else</span>
<div style="padding-left:4em" data-bind="foreach: commands"> {
<div data-bind="template: {name: $root.templateName($data)}"></div> <div data-bind="foreach: commands">
</div> <div data-bind="template: {name: $root.templateName($data)}"></div>
} </div>
}
</div>

View file

@ -1,4 +1,4 @@
<!-- rfc5703 --> <!-- rfc5703 -->
enclose enclose
<input type="text" name="_subject" data-bind="textInput: _subject"> <input type="text" data-bind="textInput: _subject">
<textarea name="source">GrammarStringList</textarea> <input type="text" data-bind="textInput: source" pattern='".+"|\[".+"(,".+")*\]'>

View file

@ -1,9 +1,9 @@
<!-- rfc5228 --> <!-- rfc5228 -->
envelope envelope
<select name="address_part"> <select>
<option>:localpart</option> <option>:localpart</option>
<option>:domain</option> <option>:domain</option>
<option>:all</option> <option>:all</option>
</select> </select>
<textarea name="envelope_part">GrammarStringList</textarea> <input type="text" data-bind="textInput: envelope_part" pattern='".+"|\[".+"(,".+")*\]'>
<textarea name="key_list">GrammarStringList</textarea> <input type="text" data-bind="textInput: key_list" pattern='".+"|\[".+"(,".+")*\]'>

View file

@ -1,4 +1,4 @@
<!-- rfc5183 --> <!-- rfc5183 -->
environment environment
<input type="text" name="name" data-bind="textInput: name"> <input type="text" data-bind="textInput: name">
<textarea name="key_list">GrammarStringList</textarea> <input type="text" data-bind="textInput: key_list" pattern='".+"|\[".+"(,".+")*\]'>

View file

@ -1,3 +1,3 @@
<!-- rfc5429 --> <!-- rfc5429 -->
ereject ereject
<input type="text" name="_reason" data-bind="textInput: _reason"> <input type="text" data-bind="textInput: _reason">

View file

@ -1,3 +1,3 @@
<!-- rfc5463 --> <!-- rfc5463 -->
error error
<input type="text" name="message" data-bind="textInput: message"> <input type="text" data-bind="textInput: message">

View file

@ -1,5 +1,5 @@
<!-- rfc5228 --> <!-- rfc5228 -->
exists exists
<textarea name="header_names">GrammarStringList</textarea> <input type="text" data-bind="textInput: header_names" pattern='".+"|\[".+"(,".+")*\]'>
// mime // mime
// anychild // anychild

View file

@ -1,5 +1,5 @@
<!-- rfc5703 --> <!-- rfc5703 -->
extracttext extracttext
modifiers = []; modifiers = [];
<input type="number" name="_first"> <input type="number">
<input type="text" name="varname" data-bind="textInput: varname"> <input type="text" data-bind="textInput: varname">

View file

@ -1,5 +1,5 @@
<!-- rfc5228 --> <!-- rfc5228 -->
fileinto fileinto
<input type="text" data-bind="textInput: mailbox">
<label data-bind="root.capa.copy"><input type="checkbox" data-bind="checked: copy"> copy</label><!-- rfc3894 --> <label data-bind="root.capa.copy"><input type="checkbox" data-bind="checked: copy"> copy</label><!-- rfc3894 -->
<label data-bind="root.capa.mailbox"><input type="checkbox" data-bind="checked: create"> create</label><!-- rfc5490 --> <label data-bind="root.capa.mailbox"><input type="checkbox" data-bind="checked: create"> create</label><!-- rfc5490 -->
<input type="text" data-bind="textInput: mailbox">

View file

@ -1,4 +1,4 @@
<!-- rfc5703 --> <!-- rfc5703 -->
foreverypart foreverypart
<input type="text" name="_name" data-bind="textInput: _name"> <input type="text" data-bind="textInput: _name">
<div data-bind="template: { name: 'SieveCommand', foreach: commands, as: 'command' }"></div> <div data-bind="template: { name: 'SieveCommand', foreach: commands, as: 'command' }"></div>

View file

@ -1,3 +1,3 @@
<!-- rfc6609 --> <!-- rfc6609 -->
global global
<textarea name="source">GrammarStringList</textarea> <input type="text" data-bind="textInput: source" pattern='".+"|\[".+"(,".+")*\]'>

View file

@ -1,4 +1,4 @@
<!-- rfc5232 --> <!-- rfc5232 -->
hasflag hasflag
<textarea name="variable_list">GrammarStringList</textarea> <input type="text" data-bind="textInput: variable_list" pattern='".+"|\[".+"(,".+")*\]'>
<textarea name="list_of_flags">GrammarStringList</textarea> <input type="text" data-bind="textInput: list_of_flags" pattern='".+"|\[".+"(,".+")*\]'>

View file

@ -1,25 +1,35 @@
<!-- rfc5228 --> <!-- rfc5228 -->
header <input type="text" data-bind="textInput: header_names" pattern='".+"|\[".+"(,".+")*\]'>
<textarea name="header_names" data-bind="textInput: header_names">GrammarStringList</textarea> <br/>
<select name="match_type" data-bind="value: match_type"> <select data-bind="value: match_type">
<option>:is</option> <option>:is</option>
<option>:contains</option> <option>:contains</option>
<option>:matches</option> <option>:matches</option>
</select> </select>
<!-- <br/>
<select name="address_part" data-bind="value: address_part"> <!--
<option>:localpart</option> <select data-bind="value: address_part">
<option>:domain</option> <option>:localpart</option>
<option>:all</option> <option>:domain</option>
</select> <option>:all</option>
--> </select>
<textarea name="key_list" data-bind="textInput: key_list">GrammarStringList</textarea> -->
<input type="number" name="index" data-bind="textInput: index"> <br/>
<label><input type="checkbox" name="last"> last</label> <input type="text" data-bind="textInput: key_list" pattern='".+"|\[".+"(,".+")*\]'>
<label><input type="checkbox" name="mime"> mime</label> <br/>
<label><input type="checkbox" name="anychild"> anychild</label> <input type="number" data-bind="textInput: index">
<!-- when ":mime" is used: --> <br/>
<label><input type="checkbox" name="type"> type</label> <label><input type="checkbox"> last</label>
<label><input type="checkbox" name="subtype"> subtype</label> <br/>
<label><input type="checkbox" name="contenttype"> contenttype</label> <label><input type="checkbox"> mime</label>
<textarea name="param" data-bind="textInput: param">GrammarStringList</textarea> <br/>
<label><input type="checkbox"> anychild</label>
<br/>
<!-- when ":mime" is used: -->
<label><input type="checkbox"> type</label>
<br/>
<label><input type="checkbox"> subtype</label>
<br/>
<label><input type="checkbox"> contenttype</label>
<br/>
<input type="text" data-bind="textInput: param" pattern='".+"|\[".+"(,".+")*\]'>

View file

@ -1,3 +1,3 @@
<!-- rfc5463 --> <!-- rfc5463 -->
ihave ihave
<textarea name="capabilities">GrammarStringList</textarea> <input type="text" data-bind="textInput: capabilities" pattern='".+"|\[".+"(,".+")*\]'>

View file

@ -1,8 +1,12 @@
<!-- rfc5228 --> <!-- rfc5228 -->
if <div class="sieve-block">
<div data-bind="template: {name: $root.templateName(test), data: test}"></div> <details>
{ <summary data-bind="text: 'if ' + test"></summary>
<div style="padding-left:4em" data-bind="foreach: commands"> <div data-bind="template: {name: $root.templateName(test), data: test}"></div>
<div data-bind="template: {name: $root.templateName($data)}"></div> </details>
</div> {
} <div data-bind="foreach: commands">
<div data-bind="template: {name: $root.templateName($data)}"></div>
</div>
}
</div>

View file

@ -1,6 +1,6 @@
<!-- rfc6609 --> <!-- rfc6609 -->
include include
<label><input type="checkbox" name="global"> global</label> // ':personal' / ':global'; <label><input type="checkbox"> global</label> // ':personal' / ':global';
<label><input type="checkbox" name="once"> once</label> <label><input type="checkbox"> once</label>
<label><input type="checkbox" name="optional"> optional</label> <label><input type="checkbox"> optional</label>
<input type="text" name="value" data-bind="textInput: value"> <input type="text" data-bind="textInput: value">

View file

@ -1,3 +1,3 @@
<!-- rfc5490 --> <!-- rfc5490 -->
mailboxexists mailboxexists
<textarea name="mailbox_names">GrammarStringList</textarea> <input type="text" data-bind="textInput: mailbox_names" pattern='".+"|\[".+"(,".+")*\]'>

View file

@ -1,4 +1,4 @@
<!-- rfc5490 --> <!-- rfc5490 -->
metadataexists metadataexists
<input type="text" name="mailbox" data-bind="textInput: mailbox"> <input type="text" data-bind="textInput: mailbox">
<textarea name="annotation_names">GrammarStringList</textarea> <input type="text" data-bind="textInput: annotation_names" pattern='".+"|\[".+"(,".+")*\]'>

View file

@ -1,5 +1,5 @@
<!-- rfc5490 --> <!-- rfc5490 -->
metadata metadata
<input type="text" name="mailbox" data-bind="textInput: mailbox"> <input type="text" data-bind="textInput: mailbox">
<input type="text" name="annotation_name" data-bind="textInput: annotation_name"> <input type="text" data-bind="textInput: annotation_name">
<textarea name="key_list">GrammarStringList</textarea> <input type="text" data-bind="textInput: key_list" pattern='".+"|\[".+"(,".+")*\]'>

View file

@ -1,7 +1,7 @@
<!-- rfc5435 --> <!-- rfc5435 -->
notify notify
<input type="text" name="_method" data-bind="textInput: _method"> <input type="text" data-bind="textInput: _method">
<input type="text" name="_from" data-bind="textInput: _from"> <input type="text" data-bind="textInput: _from">
<input type="number" name="_importance"> <input type="number">
<textarea name="source">GrammarStringList</textarea> <input type="text" data-bind="textInput: source" pattern='".+"|\[".+"(,".+")*\]'>
<input type="text" name="_message" data-bind="textInput: _message"> <input type="text" data-bind="textInput: _message">

View file

@ -1,5 +1,5 @@
<!-- rfc5435 --> <!-- rfc5435 -->
notifymethodcapability notifymethodcapability
<input type="text" name="notification_uri" data-bind="textInput: notification_uri"> <input type="text" data-bind="textInput: notification_uri">
<input type="text" name="notification_capability" data-bind="textInput: notification_capability"> <input type="text" data-bind="textInput: notification_capability">
<textarea name="key_list">GrammarStringList</textarea> <input type="text" data-bind="textInput: key_list" pattern='".+"|\[".+"(,".+")*\]'>

View file

@ -1,3 +1,3 @@
<!-- rfc5429 --> <!-- rfc5429 -->
reject reject
<input type="text" name="_reason" data-bind="textInput: _reason"> <input type="text" data-bind="textInput: _reason">

View file

@ -1,4 +1,4 @@
<!-- rfc5232 --> <!-- rfc5232 -->
removeflag removeflag
<input type="text" name="_variablename" data-bind="textInput: _variablename"> <input type="text" data-bind="textInput: variablename">
<textarea name="source">GrammarStringList</textarea> <input type="text" data-bind="textInput: list_of_flags" pattern='".+"|\[".+"(,".+")*\]'>

View file

@ -1,6 +1,6 @@
<!-- rfc5703 --> <!-- rfc5703 -->
replace replace
<label><input type="checkbox" name="mime"> mime</label> <label><input type="checkbox"> mime</label>
<input type="text" name="_subject" data-bind="textInput: _subject"> <input type="text" data-bind="textInput: _subject">
<input type="text" name="_from" data-bind="textInput: _from"> <input type="text" data-bind="textInput: _from">
<input type="text" name="replacement" data-bind="textInput: replacement"> <input type="text" data-bind="textInput: replacement">

View file

@ -1,3 +1,3 @@
<!-- rfc5490 --> <!-- rfc5490 -->
servermetadataexists servermetadataexists
<textarea name="annotation_names">GrammarStringList</textarea> <input type="text" data-bind="textInput: annotation_names" pattern='".+"|\[".+"(,".+")*\]'>

View file

@ -1,4 +1,4 @@
<!-- rfc5490 --> <!-- rfc5490 -->
servermetadata servermetadata
<input type="text" name="annotation_name" data-bind="textInput: annotation_name"> <input type="text" data-bind="textInput: annotation_name">
<textarea name="key_list">GrammarStringList</textarea> <input type="text" data-bind="textInput: key_list" pattern='".+"|\[".+"(,".+")*\]'>

View file

@ -1,5 +1,5 @@
<!-- rfc5229 --> <!-- rfc5229 -->
set set
modifiers = []; modifiers = [];
<input type="text" name="_name" data-bind="textInput: _name"> <input type="text" data-bind="textInput: _name">
<input type="text" name="_value" data-bind="textInput: _value"> <input type="text" data-bind="textInput: _value">

View file

@ -1,4 +1,4 @@
<!-- rfc5232 --> <!-- rfc5232 -->
setflag setflag
<input type="text" name="_variablename" data-bind="textInput: _variablename"> <input type="text" data-bind="textInput: variablename">
<textarea name="source">GrammarStringList</textarea> <input type="text" data-bind="textInput: list_of_flags" pattern='".+"|\[".+"(,".+")*\]'>

View file

@ -1,7 +1,7 @@
<!-- rfc5228 --> <!-- rfc5228 -->
size size
<select name="mode"> <select>
<option>:over</option> <option>:over</option>
<option>:under</option> <option>:under</option>
</select> </select>
<input type="number" name="limit"> <input type="number">

View file

@ -1,4 +1,4 @@
<!-- rfc5235 --> <!-- rfc5235 -->
spamtest spamtest
<input type="number" name="percent"> <input type="number">
<input type="text" name="value" data-bind="textInput: value"> <input type="text" data-bind="textInput: value">

View file

@ -1,4 +1,4 @@
<!-- rfc5229 --> <!-- rfc5229 -->
string string
<textarea name="source">GrammarStringList</textarea> <input type="text" data-bind="textInput: source" pattern='".+"|\[".+"(,".+")*\]'>
<textarea name="key_list">GrammarStringList</textarea> <input type="text" data-bind="textInput: key_list" pattern='".+"|\[".+"(,".+")*\]'>

View file

@ -1,10 +1,10 @@
<!-- rfc5230 --> <!-- rfc5230 -->
vacation vacation
<input type="number" name="_days"> <input type="number">
<input type="number" name="_seconds"> <input type="number">
<input type="text" name="_subject" data-bind="textInput: _subject"> <input type="text" data-bind="textInput: _subject">
<input type="text" name="_from" data-bind="textInput: _from"> <input type="text" data-bind="textInput: _from">
<textarea name="source">GrammarStringList</textarea> <input type="text" data-bind="textInput: source" pattern='".+"|\[".+"(,".+")*\]'>
<label><input type="checkbox" name="mime"> mime</label> <label><input type="checkbox"> mime</label>
<input type="text" name="_handle" data-bind="textInput: _handle"> <input type="text" data-bind="textInput: _handle">
<input type="text" name="_reason" data-bind="textInput: _reason"> // QuotedString / MultiLine <input type="text" data-bind="textInput: _reason"> // QuotedString / MultiLine

View file

@ -1,3 +1,3 @@
<!-- rfc6134 --> <!-- rfc6134 -->
validextlist validextlist
<textarea name="ext_list_names">GrammarStringList</textarea> <input type="text" data-bind="textInput: ext_list_names" pattern='".+"|\[".+"(,".+")*\]'>

View file

@ -1,3 +1,3 @@
<!-- rfc5435 --> <!-- rfc5435 -->
validnotifymethod validnotifymethod
<textarea name="notification_uris">GrammarStringList</textarea> <input type="text" data-bind="textInput: notification_uris" pattern='".+"|\[".+"(,".+")*\]'>

View file

@ -1,3 +1,3 @@
<!-- rfc5235 --> <!-- rfc5235 -->
virustest virustest
<input type="text" name="value" data-bind="textInput: value"> // 1 - 5 <input type="text" data-bind="textInput: value"> // 1 - 5

View file

@ -0,0 +1,2 @@
<!-- for every command that has no template -->
<div data-bind="text: $data"></div>