2026-08-14 13:04:55 +01:00
{{define "webmail_rules.html"}}
<!DOCTYPE html>
< html lang = "en" data-bs-theme = "dark" >
< head >
< meta charset = "UTF-8" >
< meta name = "viewport" content = "width=device-width, initial-scale=1.0" >
2026-08-15 21:49:25 +01:00
< title > Settings - Webmail</ title >
2026-08-14 13:04:55 +01:00
< link href = "/webmail/static/vendor/bootstrap/css/bootstrap.min.css" rel = "stylesheet" >
< link href = "/webmail/static/vendor/bootstrap-icons/font/bootstrap-icons.css" rel = "stylesheet" >
2026-08-15 21:49:25 +01:00
< link href = "/webmail/static/vendor/quill/quill.snow.css" rel = "stylesheet" >
2026-08-14 13:04:55 +01:00
< style >
body { background-color : #1a1a1a ; color : #e0e0e0 ; }
. table-dark { --bs-table-bg : #2d2d2d ; --bs-table-border-color : #404040 ; }
</ style >
2026-08-15 21:49:25 +01:00
{{template "webmail_settings_style" .}}
< style >
. condition-row { background-color : #262626 ; }
. chip-input { min-height : calc ( 1.75 em + .5 rem + 2 px ); background-color : #1a1a1a ; border-color : #404040 ; cursor : text ; }
. chip-input input { background : transparent ; color : #e0e0e0 ; }
. chip-item { font-weight : normal ; }
. chip-item . bi-x { cursor : pointer ; }
. action-extra-fields > div { display : none ; }
</ style >
2026-08-14 13:04:55 +01:00
</ head >
< body >
{{template "csrf_script" .}}
2026-08-15 21:49:25 +01:00
< nav class = "navbar navbar-expand-lg navbar-dark bg-dark" >
2026-08-14 13:04:55 +01:00
< div class = "container-fluid" >
< span class = "navbar-brand mb-0 h1" >< i class = "bi bi-inbox-fill me-2" ></ i > Webmail < small class = "text-muted" > {{.mailbox.Email}}</ small ></ span >
< div class = "navbar-nav flex-row gap-2 ms-auto" >
< a href = "/webmail/mail/INBOX" class = "btn btn-outline-light btn-sm" >< i class = "bi bi-envelope me-1" ></ i > Mail</ a >
< button type = "button" onclick = "openCompose('/webmail/mail/compose')" class = "btn btn-outline-light btn-sm" >< i class = "bi bi-pencil-square me-1" ></ i > Compose</ button >
< form method = "post" action = "/webmail/logout" class = "d-inline" >
< button type = "submit" class = "btn btn-outline-light btn-sm" >< i class = "bi bi-box-arrow-right me-1" ></ i > Sign out</ button >
</ form >
</ div >
</ div >
</ nav >
< div class = "toast-container position-fixed top-0 end-0 p-3" style = "z-index: 1090;" >
{{range .flashes}}
2026-08-15 16:31:27 +01:00
< div class = "toast align-items-center text-bg-{{if eq .Category " error "}} danger {{ else }}{{. Category }}{{ end }} border-0 " role = "alert" aria-live = "assertive" aria-atomic = "true" >
2026-08-14 13:04:55 +01:00
< div class = "d-flex" >
< div class = "toast-body" >
< i class = "bi bi-{{if eq .Category " error "}} exclamation-triangle {{ else if eq . Category " success "}} check-circle {{ else }} info-circle {{ end }} me-2 " ></ i >
{{.Message}}
</ div >
< button type = "button" class = "btn-close btn-close-white me-2 m-auto" data-bs-dismiss = "toast" aria-label = "Close" ></ button >
</ div >
</ div >
{{end}}
</ div >
2026-08-15 21:49:25 +01:00
< div id = "settingsPanelRoot" >
< div class = "settings-card" id = "settingsPanel" >
< div class = "settings-card-header" >
< h5 class = "mb-0" >< i class = "bi bi-sliders me-2" ></ i > Settings</ h5 >
< button type = "button" class = "btn-close btn-close-white" onclick = "closeSettings()" aria-label = "Close" ></ button >
2026-08-14 13:04:55 +01:00
</ div >
2026-08-15 21:49:25 +01:00
< div class = "settings-card-body" >
{{template "webmail_settings_nav" .}}
< div class = "settings-body" >
< div class = "alert alert-info" >
< i class = "bi bi-info-circle me-2" ></ i > Rules run in priority order (lowest first) at delivery time; the first match wins.
</ div >
2026-08-14 13:04:55 +01:00
2026-08-15 21:49:25 +01:00
< div class = "card mb-4" >
< div class = "card-header" >< h6 class = "mb-0" >< i class = "bi bi-{{if .editing}}pencil{{else}}plus-circle{{end}} me-2" ></ i > {{if .editing}}Edit Rule{{else}}Add Rule{{end}}</ h6 ></ div >
< div class = "card-body" >
< form method = "POST" action = "/webmail/rules/save" id = "ruleForm" >
< input type = "hidden" name = "rule_id" value = "{{if .editing}}{{.editing.ID}}{{end}}" >
2026-08-14 13:04:55 +01:00
2026-08-15 21:49:25 +01:00
< div class = "mb-3" >
< label class = "form-label" > Rule name</ label >
< input type = "text" class = "form-control form-control-sm" name = "name" value = "{{if .editing}}{{.editing.Name}}{{end}}" placeholder = "e.g. Invoices to Accounting" style = "max-width: 360px;" >
</ div >
< div class = "row g-2 align-items-end mb-2" >
< div class = "col-auto" >
< label class = "form-label" > Priority</ label >
< input type = "number" class = "form-control form-control-sm" name = "priority" value = "{{if .editing}}{{.editing.Priority}}{{else}}0{{end}}" style = "width: 90px;" >
</ div >
< div class = "col-auto" >
< label class = "form-label" > Match</ label >
< select class = "form-select form-select-sm" name = "match_type" id = "rule_match_type" >
< option value = "all" {{ if ne . editing_match_type " any "}} selected {{ end }} > ALL of the following (AND)</ option >
< option value = "any" {{ if eq . editing_match_type " any "}} selected {{ end }} > ANY of the following (OR)</ option >
</ select >
</ div >
{{if .editing}}
< div class = "col-auto" >
< div class = "form-check mt-4" >
< input class = "form-check-input" type = "checkbox" name = "is_active" id = "rule_is_active" value = "1" {{ if . editing . IsActive }} checked {{ end }} >
< label class = "form-check-label" for = "rule_is_active" > Enabled</ label >
</ div >
</ div >
{{end}}
</ div >
< div id = "conditions_container" ></ div >
< button type = "button" id = "add_condition" class = "btn btn-outline-light btn-sm mb-3" >< i class = "bi bi-plus-lg me-1" ></ i > Add condition</ button >
< hr >
< div class = "row g-2 align-items-end" >
< div class = "col-auto" >
< label class = "form-label" > Then</ label >
< select class = "form-select form-select-sm" name = "action" id = "rule_action" >
< option value = "move_to_folder" {{ if or ( not . editing ) ( eq . editing . Action " move_to_folder ")}} selected {{ end }} > Move to folder</ option >
< option value = "mark_as_spam" {{ if and . editing ( eq . editing . Action " mark_as_spam ")}} selected {{ end }} > Mark as Junk</ option >
< option value = "delete" {{ if and . editing ( eq . editing . Action " delete ")}} selected {{ end }} > Delete</ option >
< option value = "mark_read" {{ if and . editing ( eq . editing . Action " mark_read ")}} selected {{ end }} > Mark as read</ option >
< option value = "forward" {{ if and . editing ( eq . editing . Action " forward ")}} selected {{ end }} > Forward to...</ option >
</ select >
</ div >
< div class = "col-auto action-extra-fields" >
< div class = "action-field-move_to_folder" >
< label class = "form-label" > Folder name</ label >
< input type = "text" class = "form-control form-control-sm" name = "action_value" id = "rule_action_value_folder" placeholder = "folder name" value = "{{if and .editing (eq .editing.Action " move_to_folder ")}}{{. editing . ActionValue }}{{ end }}" >
</ div >
< div class = "action-field-forward" >
< label class = "form-label" > Forward to</ label >
< input type = "email" class = "form-control form-control-sm" name = "action_value" id = "rule_action_value_forward" disabled placeholder = "someone@example.com" value = "{{if and .editing (eq .editing.Action " forward ")}}{{. editing . ActionValue }}{{ end }}" >
< div class = "form-check mt-1" >
< input class = "form-check-input" type = "checkbox" name = "keep_copy" id = "rule_keep_copy" value = "1" {{ if or ( not . editing ) ( ne . editing . Action " forward ") . editing . ActionOptions . KeepCopy }} checked {{ end }} >
< label class = "form-check-label small" for = "rule_keep_copy" > Also keep a copy in this mailbox</ label >
</ div >
</ div >
</ div >
< div class = "col-auto" >
< button type = "submit" class = "btn btn-success" >< i class = "bi bi-funnel me-2" ></ i > {{if .editing}}Update Rule{{else}}Add Rule{{end}}</ button >
{{if .editing}}< a href = "/webmail/rules" class = "btn btn-outline-secondary" > Cancel</ a > {{end}}
</ div >
</ div >
</ form >
< template id = "condition_row_template" >
< div class = "row g-2 align-items-start mb-2 condition-row border rounded p-2" style = "border-color: #404040 !important;" >
< div class = "col-auto" >
< select class = "form-select form-select-sm cond-field" name = "condition_field" style = "width: 150px;" >
< option value = "from" > From</ option >
< option value = "to" > To</ option >
< option value = "subject" > Subject</ option >
< option value = "body" > Body</ option >
< option value = "has_attachment" > Has attachment</ option >
< option value = "recipient_type" > I'm on the</ option >
</ select >
</ div >
< div class = "col-auto cond-op-wrap" style = "width: 140px;" >
< select class = "form-select form-select-sm cond-op" name = "condition_op" >
< option value = "contains" > contains</ option >
< option value = "equals" > equals</ option >
< option value = "starts_with" > starts with</ option >
</ select >
</ div >
< div class = "col cond-value-area" style = "min-width: 220px;" >
< div class = "chip-input form-control form-control-sm d-flex flex-wrap gap-1" ></ div >
< select class = "form-select form-select-sm cond-fixed-select d-none" ></ select >
< input type = "hidden" class = "cond-value-hidden" name = "condition_value" >
</ div >
< div class = "col-auto" >
< button type = "button" class = "btn btn-outline-danger btn-sm remove-condition" title = "Remove condition" >< i class = "bi bi-x-lg" ></ i ></ button >
</ div >
</ div >
</ template >
< script type = "application/json" id = "editingConditionsData" >{{. editing_conditions_json }}</ script >
2026-08-14 13:04:55 +01:00
</ div >
2026-08-15 21:49:25 +01:00
</ div >
2026-08-14 13:04:55 +01:00
2026-08-15 21:49:25 +01:00
< div class = "card" >
< div class = "card-header" >< h6 class = "mb-0" >< i class = "bi bi-list-ul me-2" ></ i > Existing Rules</ h6 ></ div >
< div class = "card-body p-0" >
{{if .rules}}
< div class = "table-responsive" >
< table class = "table table-dark table-hover mb-0" >
< thead >< tr >< th > Priority</ th >< th > Name</ th >< th > Condition</ th >< th > Action</ th >< th > Status</ th >< th > Actions</ th ></ tr ></ thead >
< tbody >
{{range .rules}}
< tr >
< td > {{.Priority}}</ td >
< td > {{if .Name}}{{.Name}}{{else}}< span class = "text-muted" > (unnamed)</ span > {{end}}</ td >
< td >< code class = "small" > {{ruleSummary .}}</ code ></ td >
< td >
{{if eq .Action "move_to_folder"}}Move to < strong > {{.ActionValue}}</ strong >
{{else if eq .Action "mark_as_spam"}}< span class = "text-warning" > Mark as Junk</ span >
{{else if eq .Action "delete"}}< span class = "text-danger" > Delete</ span >
{{else if eq .Action "forward"}}Forward to < strong > {{.ActionValue}}</ strong > {{if not .ActionOptions.KeepCopy}} < span class = "text-muted" > (no local copy)</ span > {{end}}
{{else}}Mark as read{{end}}
</ td >
< td >
< form method = "post" action = "/webmail/rules/{{.ID}}/toggle" class = "d-inline" >
< button type = "submit" class = "btn btn-sm {{if .IsActive}}btn-success{{else}}btn-secondary{{end}}" title = "Click to {{if .IsActive}}disable{{else}}enable{{end}}" > {{if .IsActive}}Active{{else}}Inactive{{end}}</ button >
</ form >
</ td >
< td class = "d-flex gap-1" >
< a href = "/webmail/rules?edit={{.ID}}" class = "btn btn-outline-secondary btn-sm" title = "Edit" >< i class = "bi bi-pencil" ></ i ></ a >
< form method = "post" action = "/webmail/rules/{{.ID}}/remove" class = "d-inline" >
< button type = "submit" class = "btn btn-outline-danger btn-sm" title = "Remove" data-confirm = "Remove this rule?" >< i class = "bi bi-trash" ></ i ></ button >
</ form >
</ td >
</ tr >
{{end}}
</ tbody >
</ table >
2026-08-14 13:04:55 +01:00
</ div >
2026-08-15 21:49:25 +01:00
{{else}}
< div class = "text-center py-5" >
< i class = "bi bi-funnel text-muted" style = "font-size: 3rem;" ></ i >
< h6 class = "text-muted mt-3" > No rules yet</ h6 >
< p class = "text-muted small" > Add one above to automatically sort or act on incoming mail.</ p >
2026-08-14 13:04:55 +01:00
</ div >
2026-08-15 21:49:25 +01:00
{{end}}
2026-08-14 13:04:55 +01:00
</ div >
</ div >
</ div >
</ div >
</ div >
2026-08-15 21:49:25 +01:00
</ div >
2026-08-14 13:04:55 +01:00
< div class = "modal fade" id = "confirmationModal" tabindex = "-1" aria-hidden = "true" >
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
< h5 class = "modal-title" >< i class = "bi bi-question-circle me-2" ></ i > Confirm Action</ h5 >
< button type = "button" class = "btn-close" data-bs-dismiss = "modal" aria-label = "Close" ></ button >
</ div >
< div class = "modal-body" id = "confirmationModalBody" > Are you sure you want to proceed?</ div >
< div class = "modal-footer" >
< button type = "button" class = "btn btn-secondary" data-bs-dismiss = "modal" > Cancel</ button >
< button type = "button" class = "btn btn-danger" id = "confirmationModalConfirm" > Confirm</ button >
</ div >
</ div >
</ div >
</ div >
{{template "compose_widget" .}}
< script src = "/webmail/static/vendor/bootstrap/js/bootstrap.bundle.min.js" ></ script >
2026-08-15 21:49:25 +01:00
< script src = "/webmail/static/vendor/quill/quill.js" ></ script >
{{template "webmail_settings_script" .}}
2026-08-14 13:04:55 +01:00
</ body >
</ html >
{{end}}