=== PB Gig Diary ===
Contributors: purebaltic
Tags: gig diary, band, music, setlist, google calendar
Requires at least: 6.3
Tested up to: 7.0
Requires PHP: 8.1
Stable tag: 3.7.38
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Gig management for working musicians. Publish gig listings, build setlists, sync to Google Calendar — all from your WordPress admin.

== Description ==

**PB Gig Diary** is a WordPress plugin built by working musicians, for working musicians. It keeps your gig diary, setlists, song library, and Google Calendar in sync — from a single, straightforward admin interface.

Whether you're a solo artist managing your own bookings or a booking agency handling multiple acts, PB Gig Diary brings everything together in one place. No spreadsheets, no double-entry, no missed dates.

= Free features =

* **Gig listings shortcode** — add `[pb_gig_diary]` to any page to display upcoming and past gigs automatically
* **Venue management** — store venue details, addresses, and contact information
* **Artist management** — manage one artist per free install
* **Status tracking** — confirmed, provisional, cancelled, and private gig statuses
* **Hide from website** — keep gigs in your diary without publishing them publicly

= Premium features (paid licence required) =

**Starter** — Google Calendar sync, artist shortcodes, import/export

**Pro** — Unavailability tracking, hidden fees and private notes, style editor

**Studio** — Songs library, setlist builder with drag-and-drop, public setlist pages, timing calculator, share setlist with band

**Agency** — All Studio features for up to 5, 15, or 50 artists from a single install, REST API for publishing to band websites

= Key features (paid) =

* **Google Calendar sync** — add or update a gig and the calendar updates automatically. Cancellations handled too.
* **Setlist builder** — build setlists with drag-and-drop ordering, copy sets between gigs, mark songs as played or dropped
* **Timing calculator** — enter your start time, gap between songs, and break between sets — projected finish time updates live
* **Public setlist pages** — every gig with a public setlist gets its own shareable page at `/setlist/{id}/`
* **Songs library** — full song catalogue with keys, durations, and original artists. Publish your repertoire via shortcode.
* **Share setlist** — one click generates a formatted text setlist ready to paste into WhatsApp or email
* **Import / Export** — CSV import and export for gigs, venues, artists, and songs
* **Style editor** — customise colours, fonts, and layout of your public gig listings without touching code
* **Multi-artist** (Agency) — manage multiple acts from one install with full data separation

= Shortcodes =

* `[pb_gig_diary]` — full upcoming and past gig listing
* `[pb_gig_diary upcoming_only="yes"]` — upcoming gigs only
* `[pb_gig_diary past_only="yes"]` — past gigs only
* `[pb_gig_diary count="5"]` — next 5 upcoming gigs
* `[pb_gig_diary year="2025"]` — all gigs from a specific year
* `[pb_gig_diary artist="haarlem"]` — filter by artist slug (Agency)
* `[pb_artist_repertoire]` — full song repertoire (Studio+)
* `[pb_artist_setlist gig_id=123]` — embed a setlist on any page (Studio+)

= For booking agencies =

PB Gig Diary Agency lets you manage all your acts from a single WordPress install. Each artist's data is fully separate. Gig listings and repertoires can be published to individual band websites via the REST API and free companion plugin.

Add a gig once — it appears on your agency site, the artist's own website, and their Google Calendar automatically.

= Privacy =

PB Gig Diary does not collect any personal data from your website visitors. Licence validation communicates with api.keygen.sh to verify your licence key. No visitor data is sent to any third party.

== Installation ==

1. Upload the `pb-gig-diary` folder to `/wp-content/plugins/`
2. Activate the plugin through the **Plugins** menu in WordPress
3. Navigate to **Gig Diary → Gigs** to add your first gig
4. Add `[pb_gig_diary]` to any page to display your gig listings
5. To unlock premium features, purchase a licence at [purebaltic.co.uk/gigdiary](https://purebaltic.co.uk/gigdiary) and enter your key under **Gig Diary → Settings → Licence**

== Frequently Asked Questions ==

= Does the plugin work without a licence? =

Yes — the free version includes the core gig listings shortcode with no licence required. Purchase a licence to unlock Google Calendar sync, setlists, songs library, and more.

= Will my plugin stop working when the licence expires? =

No. Your plugin continues to work indefinitely. After 12 months, updates and new features require a renewal at 50% of the original price — but everything you have keeps working.

= Can I use the plugin on multiple sites? =

Each licence covers one WordPress installation. For multiple sites, purchase a licence per site, or consider an Agency licence which supports multiple artists.

= What happens if I need to move to a new server? =

Deactivate your licence in the plugin settings, then reactivate it on your new server. Licences are machine-based and can be transferred.

= Does it work with my theme? =

Yes — PB Gig Diary works with any WordPress theme. The gig listings use minimal styling that inherits from your theme, with optional style customisation available on Pro and above.

= What version of WordPress and PHP do I need? =

PB Gig Diary requires WordPress 6.3 or above and PHP 8.1 or above.

= Is there a trial? =

A 14-day full-feature trial is available. In the meantime, the free version gives you a taste of the plugin with no licence required.

= How does Google Calendar sync work? =

You connect a Google Calendar during setup using a Google service account. When you add or update a gig in WordPress, PB Gig Diary automatically creates or updates the corresponding event in your calendar. Cancellations are handled too.

= Where can I get support? =

Visit [purebaltic.co.uk/gigdiary](https://purebaltic.co.uk/gigdiary) for documentation and support, or use the support forum on WordPress.org.

== Screenshots ==

1. Public gig listing — upcoming and past shows displayed automatically with venue details, status badges and setlist links
2. Gig diary admin — manage all your gigs with sortable columns, fee tracking, and quick actions
3. Setlist builder — drag-and-drop setlist with song library, timing calculator and projected end time
4. Songs library — full catalogue with musical keys, durations and original artists
5. Licence settings — tier badges, credit usage, pricing grid with Buy Now links
6. Public setlist page — clean shareable setlist page with sets, songs and durations

== External Services ==

PB Gig Diary (free version) does not connect to any external service, API, or third party. All gig, venue, and artist data is stored entirely in your WordPress database. No data is sent anywhere outside your own site.

== Changelog ==

= 3.7.38 =
* Fixed: two false-positive "unescaped DB parameter" warnings (class-gig-repository.php's get_upcoming/get_past, uninstall.php's table-drop loop) that had already been diagnosed and suppressed in the commercial build, but never propagated to this build — found via a fresh Plugin Check run, confirmed by cross-checking suppression-comment counts between both builds for every shared file.

= 3.7.37 =
* Added: one-time, idempotent migration carrying over existing values from the mr_-prefixed options renamed in 3.7.36 to their new pbgd_-prefixed names
* (includes/class-activator.php)

= 3.7.36 =
* Fixed: iCal feed's UID line and the gig-listing widget's time fragment were missing context-appropriate escaping — found in WP.org's second review round. The UID now uses the same ical_escape() helper already applied to SUMMARY/LOCATION/DESCRIPTION elsewhere in the same feed; the widget time is now wrapped in esc_html().
* Changed: all remaining mr_-prefixed option names and form-field/HTML-id names renamed to the pbgd_ prefix (mr_artist_name, mr_default_age_restriction, mr_default_country, plus several more found via a full sweep, not just the three the reviewer named as examples). No existing installs affected — confirmed with no live customers on these option names before renaming.
* (includes/class-feeds.php, public/class-widget.php, admin/class-admin-settings.php, admin/views/page-settings.php, admin/class-admin-page.php, includes/class-config.php, includes/class-activator.php, uninstall.php)

= 3.7.35 =
* Changed: setlist "Start time" control (dead code in this build, but kept in sync with the commercial build for consistency) updated to match the same fix — read-only, live-derived from the gig's Start time field rather than an independently-editable, never-actually-saved snapshot

= 3.7.34 =
* Changed: four global functions (gd_render_table, gd_map_url, gd_address_line, gd_extras in public/views/gig-table.php and gig-helpers.php) renamed to the pbgd_ prefix — found via a fresh Plugin Check run, missed by the earlier prefix rename since that pass specifically targeted pb_-prefixed names and never searched for gd_-prefixed ones
* Changed: suppressed a "development function" warning on the intentional, gated error_log() call added for uninstall.php's failure logging, with an explanatory comment rather than removing the diagnostic

= 3.7.33 =
* Fixed: a failed DROP TABLE during uninstall (e.g. a database user without DROP privilege) now logs to debug.log instead of failing silently — found via a real install where the mr_gigs/mr_venues/mr_artists tables survived a full deactivate+delete cycle while most options were correctly removed, which only makes sense if the table drop failed without anyone knowing

= 3.7.32 =
* Fixed: uninstall.php wasn't cleaning up several option rows (mr_default_song_gap, mr_default_set_break, plus a few defensive entries) — found via a real install, confirmed the uninstall mechanism itself works correctly, this was specifically about two settings orphaned by the 3.7.30 removal that were never added to the cleanup list

= 3.7.31 =
* Changed: Help tab no longer references any feature absent from this build — removed the Google Calendar Setup and Import sections (both reduced to a one-line "requires a paid licence" message anyway), removed Fee/Private notes/Unavailability rows from reference tables, removed a Google Calendar mention from the Getting Started steps and the artist name field's description, and removed the now-pointless tier badge from the Shortcodes table since every remaining shortcode is free

= 3.7.30 =
* Critical: Fee, Private notes, and Band Members Unavailability tracking removed entirely from this free version, rather than left unrestricted as in 3.7.27. Per the agreed feature set, these are Starter-tier-and-above features in the commercial product and should not appear in the free version at all — distinct from, and a step beyond, simply ensuring they weren't tier-gated.
* Removed: the "Add Unavailability" button, the Unavailability tab on the Gigs list, and the per-gig "Who is unavailable" member picker (and its now-unused settings field)
* Removed: two orphaned Setlist-only settings ("Default gap between songs", "Default break between sets") that had no working consumer in this version
* Fixed: a stale admin notice that still referenced unavailability tracking and hidden fees as Pro-exclusive — both are correctly Starter-tier and the wording was out of sync with the commercial build

= 3.7.29 =
* Fixed: gig form's Age restriction dropdown was missing the "All Ages/Licensed" preset, even though it's the site-wide default set in Settings — new gigs were defaulting into the free-text "Other…" field instead of a clean preset match

= 3.7.28 =
* Changed: AJAX action/hook names renamed to use the same distinctive prefix (pbgd_) as the rest of the plugin's identifiers — completes the naming-consistency work from 3.7.27

= 3.7.27 =
* Critical: removed all tier-based gating of built-in functionality (hidden fees/private notes fields, unavailability tracking, and a leftover free-tier artist restriction) in response to WordPress.org review feedback — none of this plugin's functionality is restricted by licence tier
* Removed: passwordless "magic login" link feature entirely — Gig Editor role now uses standard WordPress login only
* Fixed: explicit sanitisation added on an admin notice value (output was already escaped, but input sanitisation was missing)
* Fixed: all inline `<script>`/`<style>` tags moved to properly enqueued external files
* Changed: internal function and constant names renamed to use a longer, more distinctive prefix (pbgd_/PBGD_) to avoid any possible naming collision with other plugins — no functional or stored-data changes, this is a code-level rename only

= 3.7.26 =
* Fixed: "Translation loading triggered too early" notice (WordPress 6.7+) — plugin bootstrap moved from the `plugins_loaded` hook to `init`

= 3.7.25 =
* Changed: Fee and Private notes fields on the gig form are now a Starter-tier feature, matching the commercial version — they no longer appear in this free version, and any value submitted for them is not saved. If you were already using these fields, that data is preserved in the database but will be cleared the next time you save that gig while running this free version.
* Changed: comparison table updated to show Hidden fees & private notes under Starter rather than Pro

= 3.7.24 =
* Fixed: removed leftover premium-feature code that should not have shipped in the free version, including a reference that could trigger an error if accessed directly
* Added: new "Go Premium" tab under Settings, with a feature comparison table and links to the free trial and pricing
* Added: "Go Premium" link in the main menu
* Changed: Unavailability tracking now correctly shown as a Starter-tier feature, not Pro
* Improved: input sanitisation and nonce handling across several admin screens

= 3.7.23 =
* Help tab: CSS Class Reference is now collapsed by default
* Settings: artist-filter shortcode example correctly limited to tiers that support it

= 3.7.21 =
* Added: new "Next Gig" Gutenberg block for block-based themes that don't have the classic Widgets screen — available on every tier, same data as the existing shortcode/widget

= 3.7.20 =
* Fixed: Gig List block failing to appear in the block inserter on some block-based themes

= 3.7.0 =
* WP Plugin Checker compliance pass: bundled third-party JS/CSS locally instead of loading from a CDN; various output-escaping fixes

= 3.6.4 — 3.6.9 =
* Fixed iCal feed time labels showing an incorrect hour offset
* Added bulk delete for gigs and venues

= 2.9.0 =
* Gig list period filter — All, Upcoming, Past with correct sort order
* Default age restriction dropdown in General settings
* Artist name in General settings now syncs to Artists table
* DB schema fixed for fresh installs

= 2.8.4 =
* Self-hosted update mechanism — automatic updates via purebaltic.co.uk
* Flatpickr date/time picker bundled locally (WP.org compliance)
* All translatable strings corrected
* readme.txt and LICENSE.txt added

= 2.8.0 =
* WordPress.org compliance fixes
* Pure Baltic branding — admin menu icon and page heading icons
* WordPress.org banner and icon assets

= 2.7.5 =
* Stripe/Keygen commercial infrastructure
* Pricing grid with Buy Now buttons on licence tab
* Upgrade and downgrade warnings

= 2.6.x =
* Setlist timing calculator — start time, gap between songs, break between sets, projected end time
* Recording URL field with YouTube and SoundCloud auto-embed on public setlist page
* Share setlist button in admin setlist builder
* Feature gating per tier (Starter/Pro/Studio/Agency)
* Automatic permalink flush on version change

= 2.5.x =
* Public setlist pages at /setlist/{gig_id}/
* View setlist link on public gig listings
* Repertoire shortcode [pb_artist_repertoire]
* Setlist shortcode [pb_artist_setlist gig_id=123]
* Artist slug field in General settings

= 2.4.x =
* Setlist builder with drag-and-drop ordering
* Copy set between gigs
* Position-aware song insertion
* Set label editing

= 2.3.x =
* Songs library — full CRUD with active/inactive filter
* Songs import and export via CSV
* Song duration in H:MM:SS format

= 2.2.x =
* Google Calendar colour palette corrected to match Google API
* Unavailability tracking with band member assignment
* Inline venue editing with fee and timing columns

= 2.0.x =
* Multi-artist support with agency licence
* Per-artist Google Calendar configuration
* Artist filter on gig listings

= 1.0.0 =
* Initial release

== Upgrade Notice ==

= 2.7.8 =
Recommended update — adds branding assets and prepares for WordPress.org submission.
