Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 431c31a95b | |||
| c5d8a34296 | |||
| bd8c5f2340 | |||
| ead5bbcd2c | |||
| e51b087545 | |||
| 1c93c82ef5 |
+155
@@ -9,6 +9,161 @@ Format: [Keep a Changelog 1.1.0](https://keepachangelog.com/en/1.1.0/) — versi
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## [3.4.1] — 2026-05-27
|
||||||
|
|
||||||
|
### Fixed — Restore button now sends you to the Active tab where the restored note lives
|
||||||
|
|
||||||
|
After v3.4.0 introduced the Active/Completed tab strip, clicking **Restore** on a completed note appeared to "do something" but the restored note never showed up. David reported it as *"the complete log does not return to active."*
|
||||||
|
|
||||||
|
Root cause: the Restore action handler in `wp_notes_page_callback()` (line ~1340) was the **only** action handler in the file without a `wp_redirect() + exit;` after its `update_option()` calls — every other handler (new note, mark-as-done single, mark-as-done bulk) had one. So Restore was relying on the page falling through and re-rendering, which used to work when both Active and Completed sections rendered on the same page (the user could just glance up to see the restored note in the Active section). v3.4.0's single-pane tab render exposed the latent bug: after Restore, the URL still said `?tab=completed`, so only Completed re-rendered (minus the now-restored note), and the restored note was invisible on Active.
|
||||||
|
|
||||||
|
Fix: add the missing redirect to `admin.php?page=wp-notes` (which defaults to the Active tab) after the restore completes. The restored note now appears in its new home immediately.
|
||||||
|
|
||||||
|
### Files changed
|
||||||
|
|
||||||
|
- `wp-notes.php` — `wp_notes_page_callback()` Restore handler: added `wp_redirect(admin_url('admin.php?page=wp-notes')); exit;` after the two `update_option()` calls. Five-line change plus a load-bearing comment explaining the bug history so future-Claude doesn't reintroduce it.
|
||||||
|
- Plugin header `Version: 3.4.0 → 3.4.1`; `WP_NOTES_VERSION` constant updated to match. PATCH bump (bug fix, no API or behavioural changes beyond the fix itself).
|
||||||
|
|
||||||
|
### Not changed
|
||||||
|
|
||||||
|
- The other three action handlers (new note, mark-as-done) — they already had correct redirects; no need to touch.
|
||||||
|
- Storage model, tab structure, CSS — all unchanged from v3.4.0.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [3.4.0] — 2026-05-27
|
||||||
|
|
||||||
|
### Added — Active / Completed tabs on the My Log page
|
||||||
|
|
||||||
|
The main Logbook page used to render two stacked sections — Active notes from `wp_notes` above, Completed notes from `wp_done_notes` below. As the lists grew, this became a "wall of stacked sections" with Completed pushing content off the visible fold and users having to scroll past it to scan their active work.
|
||||||
|
|
||||||
|
v3.4.0 replaces the stacked layout with a **single-pane tabbed view** using WordPress's native `subsubsub` filter-tab pattern (the same one Posts / Comments / Plugins admin pages use):
|
||||||
|
|
||||||
|
- **Two tabs**: `Active (N)` and `Completed (M)`. Counts in the labels match the actual list lengths.
|
||||||
|
- **URL-driven state**: `?page=wp-notes&tab=active` (default) and `?page=wp-notes&tab=completed`. Bookmarkable, refresh-stable, back-button works. Invalid tab values fall back to Active server-side.
|
||||||
|
- **No JavaScript**: each tab is a hyperlink. WP-admin core CSS handles the `.subsubsub` and `.current` styling; we just add a small top/bottom margin block.
|
||||||
|
- **Single-pane render**: only the selected tab's section is in the DOM, so no flash-of-wrong-content and no wasted markup.
|
||||||
|
- **"Add a Note" form stays visible on both tabs** — even from Completed you can think of something new to log.
|
||||||
|
|
||||||
|
This was flagged in the 2026-05-25 UX audit as the highest-payoff next move (Tier 3 item #7). When the v4 roadmap's timer / `time_logged` field ships, the tab structure can extend naturally to three tabs (TODO / IN PROGRESS / Completed) in the same place; for now, without that field, an IN PROGRESS tab would always be empty, so v3.4.0 ships the 2-tab version that matches the current data model.
|
||||||
|
|
||||||
|
### Files changed
|
||||||
|
|
||||||
|
- `wp-notes.php` — `wp_notes_page_callback()`: tab detection from `$_GET['tab']` (sanitized + whitelisted), `subsubsub` markup with link-builder via `add_query_arg`, single-pane conditional render of either the active or completed section. Replaces the previous two-stacked-section block.
|
||||||
|
- `inc/wp-notes-styles.php` — minor spacing (`margin: 12px 0 18px`) on `.subsubsub` so the tab strip has breathing room.
|
||||||
|
- Plugin header `Version: 3.3.5 → 3.4.0`; `WP_NOTES_VERSION` constant updated to match. MINOR bump (new feature, no breaking changes).
|
||||||
|
|
||||||
|
### Not changed
|
||||||
|
|
||||||
|
- Storage model — Active and Completed remain in their separate options (`wp_notes`, `wp_done_notes`).
|
||||||
|
- The `wp_notes_display_notes($type)` function in `inc/wp-notes-display.php` — already accepts the section type, no signature change needed.
|
||||||
|
- No new DB writes, schema changes, AJAX endpoints, or dependencies.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [3.3.5] — 2026-05-25
|
||||||
|
|
||||||
|
### Changed — Admin-menu icon
|
||||||
|
The WordPress admin sidebar icon for Logbook is now
|
||||||
|
**`dashicons-book-alt`** (a closed book) instead of the generic
|
||||||
|
cog wheel (`dashicons-admin-generic`). The closed-book glyph is the
|
||||||
|
most literal possible match for the word "logbook" in the Dashicons
|
||||||
|
set — reinforces the brand identity at the first place users see
|
||||||
|
the plugin every day.
|
||||||
|
|
||||||
|
If you'd prefer a different icon, the line lives in
|
||||||
|
`wp-notes.php → wp_notes_admin_menu()` as the 7th arg to
|
||||||
|
`add_menu_page()`. Alternatives worth considering:
|
||||||
|
`dashicons-edit` (pencil), `dashicons-clipboard` (clipboard),
|
||||||
|
`dashicons-welcome-write-blog` (pencil over paper),
|
||||||
|
`dashicons-format-aside` (notes glyph). Full list at
|
||||||
|
https://developer.wordpress.org/resource/dashicons/
|
||||||
|
|
||||||
|
### Version bump
|
||||||
|
- wp-notes.php header 3.3.4 → 3.3.5
|
||||||
|
- WP_NOTES_VERSION constant 3.3.4 → 3.3.5
|
||||||
|
- About page version-history leads with v3.3.5; v3.3.4 demoted.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [3.3.4] — 2026-05-25
|
||||||
|
|
||||||
|
**Repo renamed on Gitea: `a-wp-notes-v3` → `a-logbook`.** Also the
|
||||||
|
local working folder on M3: `/Users/ranger/scripts/Gitea/a-logbook`
|
||||||
|
(was `a-wp-notes-v3-archive`). The old repo name was a holdover
|
||||||
|
from the v3-of-A-WP-Notes archival era; with the plugin firmly
|
||||||
|
identifying as Logbook now, the repo and folder names should match.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- **`inc/wp-notes-updater.php`** — `WP_NOTES_GITEA_REPO` constant
|
||||||
|
updated from `a-wp-notes-v3` to `a-logbook`. The update checker
|
||||||
|
now hits `https://git.davidtkeane.com/api/v1/repos/ranger/a-logbook/...`
|
||||||
|
on every check. (The constant remains override-able via
|
||||||
|
`define()` in `wp-config.php` if the repo ever moves again.)
|
||||||
|
- **`inc/wp-notes-about.php`** — "View the full CHANGELOG.md →"
|
||||||
|
link on the version-history card updated to the new repo path.
|
||||||
|
- **Local working folder on M3** renamed to `a-logbook` to match
|
||||||
|
the Gitea repo name. `.git/config` survived the move intact;
|
||||||
|
remote URL updated separately.
|
||||||
|
|
||||||
|
### Unchanged (zero-migration commitment continues)
|
||||||
|
- Plugin slug (`wp-notes`).
|
||||||
|
- Plugin text domain (`a-wp-notes`).
|
||||||
|
- All internal function names, constants (`WP_NOTES_*`), DB option
|
||||||
|
keys, user_meta keys, file names inside the plugin
|
||||||
|
(`wp-notes.php`, `inc/wp-notes-*.php`).
|
||||||
|
- Historical CHANGELOG references to `a-wp-notes-v3` (e.g. in the
|
||||||
|
v3.2.0 entry) stay as historical truth.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [3.3.3] — 2026-05-25
|
||||||
|
|
||||||
|
**Verification bump.** Pure version increment to test the end-to-end
|
||||||
|
"Check now" flow against the now-publicly-hosted Gitea repo. No
|
||||||
|
functional changes. David's Local install (running v3.3.2) should
|
||||||
|
now see *"v3.3.3 available — Download .zip"* in the Settings →
|
||||||
|
Updates panel once "Check now" is clicked, confirming the update
|
||||||
|
mechanism works against a real version delta. After the test, he
|
||||||
|
can `git pull` to land on v3.3.3 and watch the same panel flip back
|
||||||
|
to *"You are up to date (v3.3.3)"*.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [3.3.2] — 2026-05-25
|
||||||
|
|
||||||
|
### Fixed — update checker now works with tag-only workflows
|
||||||
|
The v3.3.0 update checker only queried Gitea's `/releases/latest`
|
||||||
|
endpoint, which requires a **formal Release object** (created via
|
||||||
|
the Gitea web UI with optional notes + zip assets). A plain
|
||||||
|
`git tag v3.3.x && git push --tags` from the terminal doesn't
|
||||||
|
create that Release object — so the checker kept returning *"No
|
||||||
|
releases tagged on the Gitea repo yet"* even when tags clearly
|
||||||
|
existed.
|
||||||
|
|
||||||
|
`wp_notes_fetch_latest_release()` now falls back to the
|
||||||
|
`/tags?limit=1` endpoint when `/releases/latest` returns 404 (or
|
||||||
|
any non-200). It synthesises a release-like payload from the
|
||||||
|
newest tag — `tag_name`, an `html_url` pointing at the tag view,
|
||||||
|
the tag message as the body, and an empty `assets[]` array so the
|
||||||
|
existing download-URL logic falls through to Gitea's source-archive
|
||||||
|
URL pattern (`/archive/<tag>.zip`).
|
||||||
|
|
||||||
|
**Net effect:** the "Check now" button now finds the latest version
|
||||||
|
whether David creates formal Gitea Releases OR just pushes tags
|
||||||
|
with `git push --tags`. No workflow change required.
|
||||||
|
|
||||||
|
### Known limitation (not a bug — flagged for awareness)
|
||||||
|
The Gitea repo `ranger/a-wp-notes-v3` is currently **private**.
|
||||||
|
Anonymous API requests get a 404 (Gitea's standard behaviour to
|
||||||
|
avoid leaking the existence of private repos). The updater code is
|
||||||
|
correct, but it can't actually reach the API on a private repo
|
||||||
|
without authentication. **Fix:** change the repo visibility to
|
||||||
|
public on Gitea (Settings → Visibility) — appropriate anyway for a
|
||||||
|
GPL-licensed plugin headed for the WordPress.org marketplace.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## [3.3.1] — 2026-05-25
|
## [3.3.1] — 2026-05-25
|
||||||
|
|
||||||
**Naming: dropped the `WP` prefix. The plugin is now just `Logbook`.**
|
**Naming: dropped the `WP` prefix. The plugin is now just `Logbook`.**
|
||||||
|
|||||||
+18
-2
@@ -125,7 +125,23 @@ function wp_notes_about_page() {
|
|||||||
<h2>Version history</h2>
|
<h2>Version history</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<span class="ver">v3.3.1</span> — 25 May 2026 <span class="latest">latest</span><br>
|
<span class="ver">v3.3.5</span> — 25 May 2026 <span class="latest">latest</span><br>
|
||||||
|
New admin-menu icon: closed-book (<code>dashicons-book-alt</code>) replaces the generic cog wheel. Visually reinforces the “Logbook” identity in the WP sidebar.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<span class="ver">v3.3.4</span> — 25 May 2026<br>
|
||||||
|
Repo renamed on Gitea: <code>a-wp-notes-v3</code> → <code>a-logbook</code>. The plugin’s update checker and the “View on Gitea” / “View all releases” / “View full CHANGELOG” links now point at the new path. Local folder also renamed to <code>a-logbook</code>. The plugin’s internal storage and slugs are unchanged — no data migration.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<span class="ver">v3.3.3</span> — 25 May 2026<br>
|
||||||
|
Pure version bump to verify the end-to-end “Check now” flow against a publicly-hosted Gitea repo. No functional changes. If you can see this line, you successfully pulled the test release.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<span class="ver">v3.3.2</span> — 25 May 2026<br>
|
||||||
|
Update checker now falls back to Gitea's <code>/tags</code> endpoint when no formal Release object exists for the latest tag. Means a plain <code>git tag && git push --tags</code> is enough to make the “Check now” button report a new version — no need to manually create a Release in the Gitea web UI.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<span class="ver">v3.3.1</span> — 25 May 2026<br>
|
||||||
Dropped the <code>WP</code> prefix — the plugin is now just <strong>Logbook</strong>. Cleaner name, also clears a potential WordPress.org trademark-policy hurdle if/when the plugin ever lands on the marketplace.
|
Dropped the <code>WP</code> prefix — the plugin is now just <strong>Logbook</strong>. Cleaner name, also clears a potential WordPress.org trademark-policy hurdle if/when the plugin ever lands on the marketplace.
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@@ -153,7 +169,7 @@ function wp_notes_about_page() {
|
|||||||
Basic note functionality with the dashboard widget and styling options.
|
Basic note functionality with the dashboard widget and styling options.
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<a class="wp-notes-about-changelog-link" href="https://git.davidtkeane.com/ranger/a-wp-notes-v3/src/branch/main/CHANGELOG.md" target="_blank" rel="noopener">View the full CHANGELOG.md →</a>
|
<a class="wp-notes-about-changelog-link" href="https://git.davidtkeane.com/ranger/a-logbook/src/branch/main/CHANGELOG.md" target="_blank" rel="noopener">View the full CHANGELOG.md →</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -198,6 +198,14 @@ function wp_notes_admin_styles() {
|
|||||||
color: #3c763d;
|
color: #3c763d;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* v3.4.0 — Active/Completed tab strip on the My Log page.
|
||||||
|
WP-admin core already styles .subsubsub and .current;
|
||||||
|
we only need to add breathing room above + below. */
|
||||||
|
.wp-notes-page .subsubsub,
|
||||||
|
.wrap > .subsubsub {
|
||||||
|
margin: 12px 0 18px;
|
||||||
|
}
|
||||||
|
|
||||||
/* Responsive Design */
|
/* Responsive Design */
|
||||||
@media screen and (max-width: 782px) {
|
@media screen and (max-width: 782px) {
|
||||||
.wp-notes-formatting {
|
.wp-notes-formatting {
|
||||||
|
|||||||
+32
-11
@@ -18,7 +18,7 @@ if ( ! defined( 'ABSPATH' ) ) { exit; }
|
|||||||
// Gitea repo coordinates — change here if the repo ever moves.
|
// Gitea repo coordinates — change here if the repo ever moves.
|
||||||
if ( ! defined( 'WP_NOTES_GITEA_HOST' ) ) { define( 'WP_NOTES_GITEA_HOST', 'https://git.davidtkeane.com' ); }
|
if ( ! defined( 'WP_NOTES_GITEA_HOST' ) ) { define( 'WP_NOTES_GITEA_HOST', 'https://git.davidtkeane.com' ); }
|
||||||
if ( ! defined( 'WP_NOTES_GITEA_OWNER' ) ) { define( 'WP_NOTES_GITEA_OWNER', 'ranger' ); }
|
if ( ! defined( 'WP_NOTES_GITEA_OWNER' ) ) { define( 'WP_NOTES_GITEA_OWNER', 'ranger' ); }
|
||||||
if ( ! defined( 'WP_NOTES_GITEA_REPO' ) ) { define( 'WP_NOTES_GITEA_REPO', 'a-wp-notes-v3' ); }
|
if ( ! defined( 'WP_NOTES_GITEA_REPO' ) ) { define( 'WP_NOTES_GITEA_REPO', 'a-logbook' ); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convenience: full web URL of the repo / its releases page.
|
* Convenience: full web URL of the repo / its releases page.
|
||||||
@@ -48,18 +48,44 @@ function wp_notes_fetch_latest_release( $force_refresh = false ) {
|
|||||||
if ( is_array( $cached ) ) { return $cached; }
|
if ( is_array( $cached ) ) { return $cached; }
|
||||||
}
|
}
|
||||||
|
|
||||||
$api_url = WP_NOTES_GITEA_HOST . '/api/v1/repos/' . WP_NOTES_GITEA_OWNER . '/' . WP_NOTES_GITEA_REPO . '/releases/latest';
|
$base_api = WP_NOTES_GITEA_HOST . '/api/v1/repos/' . WP_NOTES_GITEA_OWNER . '/' . WP_NOTES_GITEA_REPO;
|
||||||
$response = wp_remote_get( $api_url, array( 'timeout' => 8 ) );
|
|
||||||
|
|
||||||
|
// Try /releases/latest first — that's the canonical endpoint when David
|
||||||
|
// has published a formal Gitea Release via the web UI (with notes + zip
|
||||||
|
// assets attached).
|
||||||
|
$response = wp_remote_get( $base_api . '/releases/latest', array( 'timeout' => 8 ) );
|
||||||
if ( is_wp_error( $response ) ) {
|
if ( is_wp_error( $response ) ) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
$code = (int) wp_remote_retrieve_response_code( $response );
|
$code = (int) wp_remote_retrieve_response_code( $response );
|
||||||
|
$body = ( $code === 200 ) ? json_decode( wp_remote_retrieve_body( $response ), true ) : null;
|
||||||
|
|
||||||
// 404 = repo has no releases yet, OR private. Cache briefly and surface
|
// Fallback: if no formal Release exists (typical for tag-only workflows
|
||||||
// a friendly status to the UI.
|
// where you `git tag v3.3.1 && git push --tags` without using the web
|
||||||
if ( $code !== 200 ) {
|
// UI), hit /tags instead and synthesise a release-like payload from the
|
||||||
|
// newest tag. Gitea's /tags endpoint sorts by creation order, so [0] is
|
||||||
|
// the most recent.
|
||||||
|
if ( $code !== 200 || ! is_array( $body ) || empty( $body['tag_name'] ) ) {
|
||||||
|
$tags_response = wp_remote_get( $base_api . '/tags?limit=1', array( 'timeout' => 8 ) );
|
||||||
|
if ( ! is_wp_error( $tags_response )
|
||||||
|
&& (int) wp_remote_retrieve_response_code( $tags_response ) === 200 ) {
|
||||||
|
$tags = json_decode( wp_remote_retrieve_body( $tags_response ), true );
|
||||||
|
if ( is_array( $tags ) && ! empty( $tags[0]['name'] ) ) {
|
||||||
|
$body = array(
|
||||||
|
'tag_name' => $tags[0]['name'],
|
||||||
|
'html_url' => wp_notes_gitea_repo_url() . '/src/tag/' . rawurlencode( $tags[0]['name'] ),
|
||||||
|
'body' => isset( $tags[0]['message'] ) ? $tags[0]['message'] : '',
|
||||||
|
'published_at' => isset( $tags[0]['commit']['created'] ) ? $tags[0]['commit']['created'] : null,
|
||||||
|
'assets' => array(),
|
||||||
|
);
|
||||||
|
$code = 200;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Still nothing usable? Surface a friendly status and short-cache.
|
||||||
|
if ( $code !== 200 || ! is_array( $body ) || empty( $body['tag_name'] ) ) {
|
||||||
$info = array(
|
$info = array(
|
||||||
'version' => null,
|
'version' => null,
|
||||||
'html_url' => wp_notes_gitea_releases_url(),
|
'html_url' => wp_notes_gitea_releases_url(),
|
||||||
@@ -72,11 +98,6 @@ function wp_notes_fetch_latest_release( $force_refresh = false ) {
|
|||||||
return $info;
|
return $info;
|
||||||
}
|
}
|
||||||
|
|
||||||
$body = json_decode( wp_remote_retrieve_body( $response ), true );
|
|
||||||
if ( ! is_array( $body ) || empty( $body['tag_name'] ) ) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// "v3.3.0" → "3.3.0" so version_compare() against WP_NOTES_VERSION works cleanly.
|
// "v3.3.0" → "3.3.0" so version_compare() against WP_NOTES_VERSION works cleanly.
|
||||||
$version = ltrim( (string) $body['tag_name'], 'vV' );
|
$version = ltrim( (string) $body['tag_name'], 'vV' );
|
||||||
|
|
||||||
|
|||||||
+54
-13
@@ -5,7 +5,7 @@
|
|||||||
* Plugin Name: Logbook
|
* Plugin Name: Logbook
|
||||||
* Plugin URI: https://icanhelp.ie/wp-notes
|
* Plugin URI: https://icanhelp.ie/wp-notes
|
||||||
* Description: A lightweight task & logbook plugin for WordPress. Log your daily work, mark tasks done, and keep a tidy record inside the dashboard. Perfect for freelancers showing clients what's been delivered and students proving work to teachers.
|
* Description: A lightweight task & logbook plugin for WordPress. Log your daily work, mark tasks done, and keep a tidy record inside the dashboard. Perfect for freelancers showing clients what's been delivered and students proving work to teachers.
|
||||||
* Version: 3.3.1
|
* Version: 3.4.1
|
||||||
* Requires at least: 5.0
|
* Requires at least: 5.0
|
||||||
* Requires PHP: 7.2
|
* Requires PHP: 7.2
|
||||||
* Author: IR240474
|
* Author: IR240474
|
||||||
@@ -33,7 +33,7 @@ if (!isset($wp_notes_init)) {
|
|||||||
$wp_notes_init = true;
|
$wp_notes_init = true;
|
||||||
|
|
||||||
// Plugin Constants
|
// Plugin Constants
|
||||||
if (!defined('WP_NOTES_VERSION')) define('WP_NOTES_VERSION', '3.3.1');
|
if (!defined('WP_NOTES_VERSION')) define('WP_NOTES_VERSION', '3.4.1');
|
||||||
if (!defined('WP_NOTES_FILE')) define('WP_NOTES_FILE', __FILE__);
|
if (!defined('WP_NOTES_FILE')) define('WP_NOTES_FILE', __FILE__);
|
||||||
if (!defined('WP_NOTES_PATH')) define('WP_NOTES_PATH', plugin_dir_path(__FILE__));
|
if (!defined('WP_NOTES_PATH')) define('WP_NOTES_PATH', plugin_dir_path(__FILE__));
|
||||||
if (!defined('WP_NOTES_URL')) define('WP_NOTES_URL', plugin_dir_url(__FILE__));
|
if (!defined('WP_NOTES_URL')) define('WP_NOTES_URL', plugin_dir_url(__FILE__));
|
||||||
@@ -174,7 +174,7 @@ function wp_notes_admin_menu() {
|
|||||||
'manage_options',
|
'manage_options',
|
||||||
'wp-notes',
|
'wp-notes',
|
||||||
'wp_notes_page_callback',
|
'wp_notes_page_callback',
|
||||||
'dashicons-admin-generic',
|
'dashicons-book-alt', // closed book — reinforces the "logbook" identity
|
||||||
3
|
3
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -832,6 +832,14 @@ function wp_notes_page_callback() {
|
|||||||
$total_notes = count($notes);
|
$total_notes = count($notes);
|
||||||
$total_done = count($done_notes);
|
$total_done = count($done_notes);
|
||||||
|
|
||||||
|
// v3.4.0 — which tab is selected? Default 'active'. Whitelist-only.
|
||||||
|
$current_tab = isset($_GET['tab']) ? sanitize_key(wp_unslash($_GET['tab'])) : 'active';
|
||||||
|
if (!in_array($current_tab, array('active', 'completed'), true)) {
|
||||||
|
$current_tab = 'active';
|
||||||
|
}
|
||||||
|
$active_tab_url = esc_url(add_query_arg(array('page' => 'wp-notes', 'tab' => 'active'), admin_url('admin.php')));
|
||||||
|
$completed_tab_url = esc_url(add_query_arg(array('page' => 'wp-notes', 'tab' => 'completed'), admin_url('admin.php')));
|
||||||
|
|
||||||
// Get user settings
|
// Get user settings
|
||||||
$settings = get_option('wp_notes_settings', array(
|
$settings = get_option('wp_notes_settings', array(
|
||||||
'default_font' => 'Arial',
|
'default_font' => 'Arial',
|
||||||
@@ -1005,15 +1013,36 @@ function wp_notes_page_callback() {
|
|||||||
|
|
||||||
<!-- Notes List -->
|
<!-- Notes List -->
|
||||||
<h2>Log entries</h2>
|
<h2>Log entries</h2>
|
||||||
<!-- Active Notes List -->
|
|
||||||
<div class="wp-notes-active" id="active-notes">
|
|
||||||
<?php wp_notes_display_notes('active'); ?>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Completed Notes List -->
|
<!-- v3.4.0 — WP-native subsubsub tab strip. Single-pane: only the
|
||||||
<div class="wp-notes-completed" id="completed-notes">
|
selected tab's section is rendered below. URL-driven state
|
||||||
<?php wp_notes_display_notes('completed'); ?>
|
(?tab=active|completed) so it's bookmarkable + refresh-stable.
|
||||||
</div>
|
WP-admin core supplies .subsubsub and .current styling. -->
|
||||||
|
<ul class="subsubsub">
|
||||||
|
<li>
|
||||||
|
<a href="<?php echo $active_tab_url; ?>"<?php echo $current_tab === 'active' ? ' class="current"' : ''; ?>>
|
||||||
|
<?php esc_html_e('Active', 'a-wp-notes'); ?>
|
||||||
|
<span class="count">(<?php echo (int) $total_notes; ?>)</span>
|
||||||
|
</a> |
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="<?php echo $completed_tab_url; ?>"<?php echo $current_tab === 'completed' ? ' class="current"' : ''; ?>>
|
||||||
|
<?php esc_html_e('Completed', 'a-wp-notes'); ?>
|
||||||
|
<span class="count">(<?php echo (int) $total_done; ?>)</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<div style="clear:both;"></div>
|
||||||
|
|
||||||
|
<?php if ($current_tab === 'active') : ?>
|
||||||
|
<div class="wp-notes-active" id="active-notes">
|
||||||
|
<?php wp_notes_display_notes('active'); ?>
|
||||||
|
</div>
|
||||||
|
<?php else : ?>
|
||||||
|
<div class="wp-notes-completed" id="completed-notes">
|
||||||
|
<?php wp_notes_display_notes('completed'); ?>
|
||||||
|
</div>
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
<!-- Footer: support link (lives at the BOTTOM, not the top) -->
|
<!-- Footer: support link (lives at the BOTTOM, not the top) -->
|
||||||
<p class="wp-notes-footer-support">
|
<p class="wp-notes-footer-support">
|
||||||
@@ -1313,7 +1342,7 @@ function wp_notes_handle_actions() {
|
|||||||
$done_notes = get_option('wp_done_notes', array());
|
$done_notes = get_option('wp_done_notes', array());
|
||||||
$current_user = wp_get_current_user();
|
$current_user = wp_get_current_user();
|
||||||
$new_done_notes = array();
|
$new_done_notes = array();
|
||||||
|
|
||||||
foreach ($done_notes as $key => $note) {
|
foreach ($done_notes as $key => $note) {
|
||||||
if (in_array($key, $_POST['done_ids'])) {
|
if (in_array($key, $_POST['done_ids'])) {
|
||||||
$note['last_modified'] = current_time('mysql');
|
$note['last_modified'] = current_time('mysql');
|
||||||
@@ -1323,9 +1352,21 @@ function wp_notes_handle_actions() {
|
|||||||
$new_done_notes[] = $note;
|
$new_done_notes[] = $note;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
update_option('wp_notes', $notes);
|
update_option('wp_notes', $notes);
|
||||||
update_option('wp_done_notes', $new_done_notes);
|
update_option('wp_done_notes', $new_done_notes);
|
||||||
|
|
||||||
|
// v3.4.1 fix: redirect to the Active tab so the restored note is
|
||||||
|
// visible in its new home. Without this redirect, the page falls
|
||||||
|
// through and re-renders with the URL's current ?tab=completed,
|
||||||
|
// so the user sees Completed (minus the now-restored note) and
|
||||||
|
// can't see the restored note on Active. The other action
|
||||||
|
// handlers above (new note, mark-as-done single, mark-as-done
|
||||||
|
// bulk) all redirect; restore was the odd one out. Pre-v3.4.0
|
||||||
|
// this was masked because both sections rendered on the same
|
||||||
|
// page — the v3.4.0 single-pane tab render exposed it.
|
||||||
|
wp_redirect(admin_url('admin.php?page=wp-notes'));
|
||||||
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle edit note action
|
// Handle edit note action
|
||||||
|
|||||||
Reference in New Issue
Block a user