Skip to content

Commit fd454d2

Browse files
committed
v0.1.28
1 parent a919595 commit fd454d2

File tree

11 files changed

+666
-372
lines changed

11 files changed

+666
-372
lines changed

CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,16 @@
22

33
All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/).
44

5+
## [0.1.28] - 2025-06-25
6+
7+
## Added
8+
- Calendar Scheduling and Notification configuration.
9+
- Locales.
10+
11+
### Changed
12+
13+
### Fixed
14+
515
## [0.1.27] - 2025-06-04
616

717
## Added

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ homepage = "https://stalw.art"
77
keywords = ["web", "admin", "email", "mail", "server"]
88
categories = ["email"]
99
license = "AGPL-3.0-only OR LicenseRef-SEL"
10-
version = "0.1.27"
10+
version = "0.1.28"
1111
edition = "2021"
1212
resolver = "2"
1313

src/components/icon.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -836,3 +836,19 @@ pub fn IconPlayCircle(
836836
</SvgWrapper>
837837
}
838838
}
839+
840+
#[component]
841+
pub fn IconCalendarDays(
842+
#[prop(optional)] size: Option<usize>,
843+
#[prop(attrs)] attrs: Vec<(&'static str, Attribute)>,
844+
) -> impl IntoView {
845+
view! {
846+
<SvgWrapper size attrs>
847+
<path
848+
stroke-linecap="round"
849+
stroke-linejoin="round"
850+
d="M6.75 3v2.25M17.25 3v2.25M3 18.75V7.5a2.25 2.25 0 0 1 2.25-2.25h13.5A2.25 2.25 0 0 1 21 7.5v11.25m-18 0A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75m-18 0v-7.5A2.25 2.25 0 0 1 5.25 9h13.5A2.25 2.25 0 0 1 21 11.25v7.5m-9-6h.008v.008H12v-.008ZM12 15h.008v.008H12V15Zm0 2.25h.008v.008H12v-.008ZM9.75 15h.008v.008H9.75V15Zm0 2.25h.008v.008H9.75v-.008ZM7.5 15h.008v.008H7.5V15Zm0 2.25h.008v.008H7.5v-.008Zm6.75-4.5h.008v.008h-.008v-.008Zm0 2.25h.008v.008h-.008V15Zm0 2.25h.008v.008h-.008v-.008Zm2.25-4.5h.008v.008H16.5v-.008Zm0 2.25h.008v.008H16.5V15Z"
851+
></path>
852+
</SvgWrapper>
853+
}
854+
}

src/pages/config/mod.rs

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,9 @@ use crate::{
1515
components::{
1616
form::input::{Duration, Rate},
1717
icon::{
18-
IconCircleStack, IconCodeBracket, IconHandRaised, IconInbox, IconInboxArrowDown,
19-
IconInboxStack, IconKey, IconServer, IconServerStack, IconShieldCheck, IconSignal,
18+
IconCalendarDays, IconCircleStack, IconCodeBracket, IconHandRaised, IconInbox,
19+
IconInboxArrowDown, IconInboxStack, IconKey, IconServer, IconServerStack,
20+
IconShieldCheck, IconSignal,
2021
},
2122
layout::{LayoutBuilder, MenuItem},
2223
},
@@ -361,16 +362,8 @@ impl LayoutBuilder {
361362
.insert(true)
362363
.insert(true)
363364
.create("WebDAV")
364-
.create("Settings")
365365
.route("/webdav/edit")
366366
.insert(true)
367-
.create("CalDAV")
368-
.route("/caldav/edit")
369-
.insert(true)
370-
.create("CardDAV")
371-
.route("/carddav/edit")
372-
.insert(true)
373-
.insert(true)
374367
.create("Settings")
375368
.route("/http-settings/edit")
376369
.insert(true)
@@ -491,6 +484,22 @@ impl LayoutBuilder {
491484
.route("/imap-rate-limit/edit")
492485
.insert(true)
493486
.insert(true)
487+
// Groupware
488+
.create("Collaboration")
489+
.icon(view! { <IconCalendarDays/> })
490+
.create("Calendar")
491+
.route("/calendar/edit")
492+
.insert(true)
493+
.create("Scheduling")
494+
.route("/scheduling/edit")
495+
.insert(true)
496+
.create("Notifications")
497+
.route("/alarms/edit")
498+
.insert(true)
499+
.create("Contacts")
500+
.route("/contacts/edit")
501+
.insert(true)
502+
.insert(true)
494503
// Security
495504
.create("Security")
496505
.icon(view! { <IconHandRaised/> })

src/pages/config/schema/smtp.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -452,6 +452,15 @@ impl Builder<Schemas, ()> {
452452
.typ(Type::Boolean)
453453
.input_check([], [Validator::Required])
454454
.build()
455+
.new_field("resolver.edns")
456+
.label("Enable EDNS")
457+
.help(concat!(
458+
"Whether to enable EDNS (Extension Mechanisms for DNS) support"
459+
))
460+
.default("true")
461+
.typ(Type::Boolean)
462+
.input_check([], [Validator::Required])
463+
.build()
455464
.new_field("resolver.concurrency")
456465
.label("Concurrent Requests")
457466
.help(concat!(
@@ -502,6 +511,7 @@ impl Builder<Schemas, ()> {
502511
"resolver.attempts",
503512
"resolver.preserve-intermediates",
504513
"resolver.try-tcp-on-error",
514+
"resolver.edns",
505515
])
506516
.build()
507517
.build()

src/pages/config/schema/spamfilter.rs

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -964,10 +964,7 @@ impl Builder<Schemas, ()> {
964964
.new_id_field()
965965
.label("Domain Name")
966966
.help("The domain name to be added to the URL redirectors list")
967-
.input_check(
968-
[Transformer::Trim],
969-
[Validator::Required, Validator::IsRegex],
970-
)
967+
.input_check([Transformer::Trim], [Validator::Required])
971968
.build()
972969
.new_form_section()
973970
.field("_id")
@@ -985,10 +982,7 @@ impl Builder<Schemas, ()> {
985982
.new_id_field()
986983
.label("Domain Name")
987984
.help("The domain name to be added to the trusted domains list")
988-
.input_check(
989-
[Transformer::Trim],
990-
[Validator::Required, Validator::IsRegex],
991-
)
985+
.input_check([Transformer::Trim], [Validator::Required])
992986
.build()
993987
.new_form_section()
994988
.field("_id")
@@ -1006,10 +1000,7 @@ impl Builder<Schemas, ()> {
10061000
.new_id_field()
10071001
.label("Domain Name")
10081002
.help("The domain name to be added to the blocked domains list")
1009-
.input_check(
1010-
[Transformer::Trim],
1011-
[Validator::Required, Validator::IsRegex],
1012-
)
1003+
.input_check([Transformer::Trim], [Validator::Required])
10131004
.build()
10141005
.new_form_section()
10151006
.field("_id")
@@ -1027,10 +1018,7 @@ impl Builder<Schemas, ()> {
10271018
.new_id_field()
10281019
.label("E-mail Address")
10291020
.help("The e-mail address to be added to the SPAM trap list")
1030-
.input_check(
1031-
[Transformer::Trim],
1032-
[Validator::Required, Validator::IsRegex],
1033-
)
1021+
.input_check([Transformer::Trim], [Validator::Required])
10341022
.build()
10351023
.new_form_section()
10361024
.field("_id")

src/pages/config/schema/tracing.rs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -674,6 +674,13 @@ pub static EVENT_NAMES: &[&str] = &[
674674
"auth.success",
675675
"auth.token-expired",
676676
"auth.too-many-attempts",
677+
"calendar.alarm-failed",
678+
"calendar.alarm-recipient-override",
679+
"calendar.alarm-sent",
680+
"calendar.alarm-skipped",
681+
"calendar.itip-message-error",
682+
"calendar.itip-message-received",
683+
"calendar.itip-message-sent",
677684
"calendar.rule-expansion-error",
678685
"cluster.message-invalid",
679686
"cluster.message-received",
@@ -909,6 +916,7 @@ pub static EVENT_NAMES: &[&str] = &[
909916
"manage.not-supported",
910917
"message-ingest.duplicate",
911918
"message-ingest.error",
919+
"message-ingest.fts-index",
912920
"message-ingest.ham",
913921
"message-ingest.imap-append",
914922
"message-ingest.jmap-append",
@@ -1126,6 +1134,7 @@ pub static EVENT_NAMES: &[&str] = &[
11261134
"spam.pyzor",
11271135
"spam.pyzor-error",
11281136
"spam.train",
1137+
"spam.train-account",
11291138
"spam.train-balance",
11301139
"spam.train-error",
11311140
"spf.fail",
@@ -1156,11 +1165,10 @@ pub static EVENT_NAMES: &[&str] = &[
11561165
"store.foundationdb-error",
11571166
"store.http-store-error",
11581167
"store.http-store-fetch",
1159-
"store.ldap-bind",
11601168
"store.ldap-error",
11611169
"store.ldap-query",
1170+
"store.ldap-warning",
11621171
"store.mysql-error",
1163-
"store.nats-error",
11641172
"store.not-configured",
11651173
"store.not-found",
11661174
"store.not-supported",
@@ -1172,11 +1180,10 @@ pub static EVENT_NAMES: &[&str] = &[
11721180
"store.sql-query",
11731181
"store.sqlite-error",
11741182
"store.unexpected-error",
1175-
"task-queue.bayes-train",
11761183
"task-queue.blob-not-found",
1177-
"task-queue.index",
1178-
"task-queue.locked",
11791184
"task-queue.metadata-not-found",
1185+
"task-queue.task-acquired",
1186+
"task-queue.task-locked",
11801187
"telemetry.alert",
11811188
"telemetry.journal-error",
11821189
"telemetry.log-error",

0 commit comments

Comments
 (0)