Skip to content

Commit 4760a0b

Browse files
KiloCopilot
andcommitted
chore: release v1.1.3
- Move unreleased changes to [1.1.3] - 2026-07-21 - Fix CHANGELOG duplicate section headings and non-standard sections - Bump plugin and package versions to 1.1.3 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 088e0de commit 4760a0b

4 files changed

Lines changed: 47 additions & 56 deletions

File tree

CHANGELOG.md

Lines changed: 42 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
### Added
11+
12+
### Changed
13+
14+
### Fixed
15+
16+
### Security
17+
18+
## [1.1.3] - 2026-07-21
19+
1020
### Added
1121
- **JWT-authenticated REST API for campaign scheduling (#118)**
1222
- New `mail-system/v1` REST namespace: `GET /lists`, `POST /campaigns`, `GET /campaigns/{id}`, and `POST /campaigns/{id}/cancel`
@@ -43,23 +53,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
4353
- Records the first open timestamp and total pixel load count without storing IP addresses or user-agent data
4454
- Shows unique opens, open rates, and per-recipient sent/open timestamps in the Queue overview and campaign detail screens
4555
- Includes a database upgrade to schema version 1.7.0, unit coverage, and an in-product caveat explaining image blocking, privacy proxy, and prefetch limitations
46-
47-
### Fixed
48-
- **Bulk actions Apply button not showing** — on the Subscribers page, if a browser restored the bulk actions dropdown's previous value on page load/refresh without firing a `change` event, the Apply button stayed hidden even though a bulk action was selected and subscribers were checked. The button's visibility is now synced on page load, not only on `change`.
49-
- **Opt-in confirmation email wrappers** — confirmation emails now apply the configured email header and footer and replace wrapper template variables (`{first_name}`, `{last_name}`, `{email}`, `{unsubscribe_link}`, `{unsubscribe_url}`) before sending.
50-
- **SMTP password encryption delimiter handling** — encrypted payloads now encode the IV separately before adding the delimiter and still support legacy raw-IV payloads, preventing rare decrypt failures when random IV bytes contained the delimiter sequence.
51-
- **Database repair notice persisting infinitely** — when clicking "Repair Database Now", if the required database table or column did not exist (or `ALTER TABLE` silently failed), the repair notice was shown on every page load indefinitely. The handler now calls `MSKD_Activator::activate()` (which uses `dbDelta` to create missing tables and columns), verifies the schema afterwards, and — if still failing — shows an actionable error notice with the database error message. The schema check also now correctly detects a missing table (not just a missing column).
52-
- **Scheduling/queue timezone mixing** — the scheduling and queue system wrote datetimes from three different bases (WP-local `current_time`, UTC `gmdate`, and the MySQL `CURRENT_TIMESTAMP` default), then compared and rendered them as if identical. On sites whose WordPress timezone differs from UTC, this produced a phantom offset between the Queue "Created" and "Scheduled for" columns and broke retry/stuck-recovery timing (retries landed in the past and fired immediately). Retry `scheduled_at` and the stuck-recovery threshold now use the new site-local `mskd_local_time_from_timestamp()` helper, and campaign/queue `created_at` is set explicitly via `mskd_current_time_normalized()` instead of the DB-server-timezone default, so all writes, comparisons, and display share one convention.
53-
- **Email preview opening in a new tab** — email preview forms (campaign/queue detail and compose wizard) targeted a runtime-generated browsing-context name and then renamed the iframe to match, which is racy and often failed to bind, causing the preview to open in a new tab instead of inline. Preview iframes now render a stable server-side `name`, and the hidden preview form submits to that existing target.
54-
55-
### Changed
56-
- **Renamed plugin slug** from `mail-system-by-katsarov-design` to `mail-system`. Updated main plugin file, all language files (`.pot`, `.po`, `.mo`), text domain references across all PHP source files, `package.json`, `bin/create-release.sh`, and documentation headers. DB table names, option keys, hooks, and constants are unchanged.
57-
- **Delete Inactive Subscribers button** now also deletes subscribers with `unsubscribed` status, in addition to `inactive` (unconfirmed). Updated button description, confirmation dialog, and success messages accordingly. Translations updated for Bulgarian and German.
58-
59-
### Fixed
60-
- Fixed undefined variable `$class` (should be `$class_name`) in test bootstrap autoloader, which caused PHP 8.1 test failures due to undefined variable warnings being converted to exceptions.
61-
62-
### Added
6356
- **Bulk Subscriber Status Actions**
6457
- New "Set active" and "Set inactive" options in the bulk actions dropdown on the Subscribers page
6558
- Available whenever there are editable database subscribers to select, even if no lists exist yet
@@ -86,15 +79,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
8679
- Proper database cleanup (subscribers, list associations, and queue items)
8780
- Full translations in Bulgarian and German with pluralization support
8881

82+
### Changed
83+
- **Renamed plugin slug** from `mail-system-by-katsarov-design` to `mail-system`. Updated main plugin file, all language files (`.pot`, `.po`, `.mo`), text domain references across all PHP source files, `package.json`, `bin/create-release.sh`, and documentation headers. DB table names, option keys, hooks, and constants are unchanged.
84+
- **Delete Inactive Subscribers button** now also deletes subscribers with `unsubscribed` status, in addition to `inactive` (unconfirmed). Updated button description, confirmation dialog, and success messages accordingly. Translations updated for Bulgarian and German.
85+
8986
### Fixed
90-
- **Compose Wizard Step 1 Validation**
91-
- Fixed bug where "Please select at least one list" alert incorrectly appeared when clicking Continue in step 1
92-
- List validation now only triggers in step 3 where list selection is available
87+
- **Bulk actions Apply button not showing** — on the Subscribers page, if a browser restored the bulk actions dropdown's previous value on page load/refresh without firing a `change` event, the Apply button stayed hidden even though a bulk action was selected and subscribers were checked. The button's visibility is now synced on page load, not only on `change`.
88+
- **Opt-in confirmation email wrappers** — confirmation emails now apply the configured email header and footer and replace wrapper template variables (`{first_name}`, `{last_name}`, `{email}`, `{unsubscribe_link}`, `{unsubscribe_url}`) before sending.
89+
- **SMTP password encryption delimiter handling** — encrypted payloads now encode the IV separately before adding the delimiter and still support legacy raw-IV payloads, preventing rare decrypt failures when random IV bytes contained the delimiter sequence.
90+
- **Database repair notice persisting infinitely** — when clicking "Repair Database Now", if the required database table or column did not exist (or `ALTER TABLE` silently failed), the repair notice was shown on every page load indefinitely. The handler now calls `MSKD_Activator::activate()` (which uses `dbDelta` to create missing tables and columns), verifies the schema afterwards, and — if still failing — shows an actionable error notice with the database error message. The schema check also now correctly detects a missing table (not just a missing column).
91+
- **Scheduling/queue timezone mixing** — the scheduling and queue system wrote datetimes from three different bases (WP-local `current_time`, UTC `gmdate`, and the MySQL `CURRENT_TIMESTAMP` default), then compared and rendered them as if identical. On sites whose WordPress timezone differs from UTC, this produced a phantom offset between the Queue "Created" and "Scheduled for" columns and broke retry/stuck-recovery timing (retries landed in the past and fired immediately). Retry `scheduled_at` and the stuck-recovery threshold now use the new site-local `mskd_local_time_from_timestamp()` helper, and campaign/queue `created_at` is set explicitly via `mskd_current_time_normalized()` instead of the DB-server-timezone default, so all writes, comparisons, and display share one convention.
92+
- **Email preview opening in a new tab** — email preview forms (campaign/queue detail and compose wizard) targeted a runtime-generated browsing-context name and then renamed the iframe to match, which is racy and often failed to bind, causing the preview to open in a new tab instead of inline. Preview iframes now render a stable server-side `name`, and the hidden preview form submits to that existing target.
93+
- Fixed undefined variable `$class` (should be `$class_name`) in test bootstrap autoloader, which caused PHP 8.1 test failures due to undefined variable warnings being converted to exceptions.
94+
- **Compose Wizard Step 1 Validation** — fixed bug where "Please select at least one list" alert incorrectly appeared when clicking Continue in step 1. List validation now only triggers in step 3 where list selection is available.
9395

9496
## [1.1.1] - 2025-12-19
9597

9698
### Added
97-
9899
- **Lists Column in Subscribers Page** (Issue #84)
99100
- New "Lists" column displaying which list(s) each subscriber belongs to
100101
- Multiple lists are stacked vertically for easy readability
@@ -150,11 +151,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
150151
- Fixed variable naming to avoid overriding WordPress globals
151152
- Fixed indentation (spaces to tabs) in admin partials
152153
- Added proper Yoda condition checks
153-
154-
### Performance
155-
- Improved performance when handling large email campaigns through batch processing
156-
- Reduced database queries by batching operations
157-
- Prevents memory issues when processing large subscriber lists
154+
- **Performance improvements**
155+
- Improved performance when handling large email campaigns through batch processing
156+
- Reduced database queries by batching operations
157+
- Prevents memory issues when processing large subscriber lists
158158

159159
### Fixed
160160
- **Dedupe Subscribers in Campaign Queue**
@@ -187,6 +187,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
187187
- Fixed duplicate message definitions in `bg_BG.po` and `de_DE.po` preventing compilation
188188
- Corrected corrupted headers in German translation file
189189
- Recompiled MO files for both languages
190+
- **Missing Translation**
191+
- Added missing translation for "Total Subscribers" in Bulgarian language
192+
- **Corrupted Bulgarian Translations** (PR #90)
193+
- Removed msgcat merge markers that were showing in the UI
194+
- Cleaned 9 translation entries with embedded `#-#-#-#-#` markers
195+
- Recompiled Bulgarian MO file
190196

191197
### Security
192198
- **Critical XSS Vulnerability Fix**
@@ -201,21 +207,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
201207
- Fixed unsanitized GET parameters in nonce verification
202208
- Improved REMOTE_ADDR handling with proper validation
203209

204-
### Fixed
205-
- **Missing Translation**
206-
- Added missing translation for "Total Subscribers" in Bulgarian language
207-
- **Corrupted Bulgarian Translations** (PR #90)
208-
- Removed msgcat merge markers that were showing in the UI
209-
- Cleaned 9 translation entries with embedded `#-#-#-#-#` markers
210-
- Recompiled Bulgarian MO file
211-
212-
### Planned
213-
- Open and click statistics
214-
- A/B testing
215-
- Integration with popular SMTP plugins
216-
217-
---
218-
219210
## [1.1.0] - 2025-11-28
220211

221212
### Added
@@ -319,15 +310,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
319310
- Dashboard with general statistics
320311
- WP-Cron warning (shown only within the plugin)
321312
- System cron recommendation
322-
323-
### Technical Details
324-
- Requires PHP 7.4+
325-
- Requires WordPress 5.0+
326-
- Uses SMTP for sending (configurable)
327-
- 4 new database tables (mskd_subscribers, mskd_lists, mskd_subscriber_list, mskd_queue)
328-
- Automatic table creation on activation
329-
- Automatic cron job scheduling on activation
330-
- Automatic cron job removal on deactivation
313+
- **Technical requirements**
314+
- Requires PHP 7.4+
315+
- Requires WordPress 5.0+
316+
- Uses SMTP for sending (configurable)
317+
- 4 new database tables (mskd_subscribers, mskd_lists, mskd_subscriber_list, mskd_queue)
318+
- Automatic table creation on activation
319+
- Automatic cron job scheduling on activation
320+
- Automatic cron job removal on deactivation
331321

332322
---
333323

@@ -337,7 +327,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
337327
- **Minor** (0.X.0) - New features, backward compatible
338328
- **Patch** (0.0.X) - Bug fixes, backward compatible
339329

340-
[Unreleased]: https://github.com/katsarov-design/mail-system/compare/1.1.2...HEAD
330+
[Unreleased]: https://github.com/katsarov-design/mail-system/compare/1.1.3...HEAD
331+
[1.1.3]: https://github.com/katsarov-design/mail-system/compare/1.1.2...1.1.3
341332
[1.1.2]: https://github.com/katsarov-design/mail-system/compare/1.1.1...1.1.2
342333
[1.1.1]: https://github.com/katsarov-design/mail-system/compare/1.1.0...1.1.1
343334
[1.1.0]: https://github.com/katsarov-design/mail-system/compare/1.0.0...1.1.0

mail-system.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* Plugin Name: Mail System by Katsarov Design
44
* Plugin URI: https://katsarov.design/plugins/mail-system
55
* Description: Email newsletter management system with subscribers, lists, and sending queue.
6-
* Version: 1.1.2
6+
* Version: 1.1.3
77
* Requires at least: 5.0
88
* Requires PHP: 7.4
99
* Author: Katsarov Design
@@ -24,7 +24,7 @@
2424
/**
2525
* Plugin constants
2626
*/
27-
define( 'MSKD_VERSION', '1.1.2' );
27+
define( 'MSKD_VERSION', '1.1.3' );
2828
define( 'MSKD_PLUGIN_DIR', plugin_dir_path( __FILE__ ) );
2929
define( 'MSKD_PLUGIN_URL', plugin_dir_url( __FILE__ ) );
3030
define( 'MSKD_PLUGIN_BASENAME', plugin_basename( __FILE__ ) );

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "mail-system",
3-
"version": "1.1.2",
3+
"version": "1.1.3",
44
"description": "WordPress Mail System Plugin by Katsarov Design",
55
"main": "mail-system.php",
66
"scripts": {

0 commit comments

Comments
 (0)