=== Aprus Appointment Calendar ===
Contributors: aprus
Donate link: https://ko-fi.com/aprus
Tags: appointments, booking, calendar, schedule, reservations
Requires at least: 6.2
Tested up to: 7.0
Requires PHP: 7.4
Stable tag: 2.5.0
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Lightweight, free appointment booking calendar. Shortcode, widget, Gutenberg block. Drag-select availability in admin. English & Polish.

== Description ==

**Aprus Appointment Calendar** is a lightweight, no-frills booking plugin. You set your opening hours, drag-select the exact slots you want to be bookable, and clients book through a clean calendar embedded anywhere on your site.

= Features =

* **Two client views** — monthly calendar and weekly column layout
* **Embed anywhere** — `[apruapca_calendar]` shortcode, classic widget or Gutenberg block (`Aprus Appointment Calendar` / `Aprus Appointment Calendar (columns)`)
* **Admin availability grid** — drag-select a rectangle over slots to open or close them in bulk. Booked slots are protected from accidental change.
* **Appointment duration + break** — control slot generation with duration and buffer between visits
* **Working days & hours** — per-day-of-week toggle, lead time (earliest booking), calendar range (how far ahead)
* **Booking popover** — hover a booked slot in admin to see client details and cancel with one click; cancellation sends an e-mail notification
* **Automatic locale** — Polish or English based on WordPress site language, English by default
* **Respects your WP settings** — `start_of_week` (Monday vs Sunday), `time_format` (24h / 12h AM-PM)
* **E-mail notifications** — customer + admin messages via `wp_mail()`
* **No accounts required** — clients book by e-mail

= Free and open source =

The plugin is fully free — no premium tier, no artificially blocked features. If you find it useful, you can [buy me a coffee on Ko-fi](https://ko-fi.com/aprus) or on [buycoffee.to](https://buycoffee.to/aprus). It helps me keep the project maintained.

= Privacy =

The plugin stores appointment data (name, e-mail, phone, note, date, time) in your own WordPress database. Nothing is sent to third-party servers. E-mails go through the standard `wp_mail()` function.

== Installation ==

1. Upload the plugin folder to `/wp-content/plugins/` or install from **Plugins → Add New → Upload**
2. Activate **Aprus Appointment Calendar** in the Plugins list
3. Open **Appointments → Settings**, adjust hours / duration / working days
4. Open **Appointments → Calendar** and drag over slots to open them for clients
5. Add the shortcode `[apruapca_calendar]` (or `[apruapca_calendar view="columns"]`) to any page/post, or drop the block/widget on your site

== Frequently Asked Questions ==

= How do I display the weekly column view? =

Use `[apruapca_calendar view="columns"]` in the shortcode, or pick **Aprus Appointment Calendar (columns)** in the block editor / widgets.

= Can clients see all slots by default? =

No. In this plugin nothing is bookable until you explicitly open slots in **Appointments → Calendar**. Drag over the slots you want to make available.

= Can I cancel a booking? =

Yes. In **Appointments → Calendar**, hover a blue (booked) slot — a popover appears with client details and a "Cancel booking" button. The client gets an e-mail notification. You can also cancel from **Appointments → Bookings**.

= Does it support 12-hour time format? =

Yes. The calendar reads your **Settings → General → Time format** — `H:i` shows 24-hour times (`13:00`), `g:i a` shows 12-hour (`1:00 pm`).

= Does the week start on Monday or Sunday? =

Whatever you set in **Settings → General → Week starts on**.

= Does the plugin phone home / call external services? =

No. All data stays in your WordPress database. E-mails use `wp_mail()`.

== Screenshots ==

1. Monthly calendar view for clients — pick a day, then a time slot
2. Weekly column view — days as columns, slots as rows
3. Admin availability grid — drag-select to open/close many slots at once
4. Hover a booked slot to see client details and cancel with one click
5. Plugin settings

== Changelog ==

= 2.5.0 =
* Month view now colours each day by availability — days with open slots get a green tint and dot, fully-booked days are greyed out and not clickable, with a small legend below the calendar
* Redesigned the empty "no free slots" state (centred icon + message) instead of a cramped line of text
* Spam / bot protection for the public booking form, all configurable under Settings → Spam protection (on by default, no external services): honeypot field, time trap (rejects submits faster than a human — default 3s) and a per-IP rate limit (default 5 bookings / 60 min)
* Unique prefixes across the whole plugin, per WordPress.org review feedback: functions, classes, constants, options, hooks, nonces, AJAX actions, menu slugs, script/style handles, widget id, block namespaces and the custom table renamed from the 3-letter `sac` prefix to `apruapca` (8 chars)
* Renamed the shortcode from the generic `[appointment_calendar]` to `[apruapca_calendar]` for the same uniqueness requirement
* Wrap global variables in `uninstall.php` in a prefixed function
* Refreshed the front-end booking form — a summary chip with calendar icon for the chosen slot, uppercase field labels with clearer spacing, larger inputs, and a redesigned confirmation / error message (status icon, subtle fade-in, no empty space reserved before a booking is made)
* Verified on a clean WP_DEBUG install — no notices, warnings or deprecations across activation, front-end views, all AJAX endpoints, the full booking lifecycle, settings save and uninstall

= 2.4.4 =
* Pass all Plugin Check audits: WordPress coding standards, i18n compliance, DB safety, output escaping
* Migrate SQL queries to modern `%i` identifier placeholder (requires WordPress 6.2+)
* All translatable strings go through `__()` with English source (Poedit / GlotPress friendly)
* Add `translators:` comments on placeholders in e-mail templates
* Replace `date()` with `gmdate()` for timezone-safe date math
* Ordered sprintf placeholders (`%1$s, %2$s`) in all multi-arg strings

= 2.4.3 =
* Switch to WordPress standard i18n with .pot / .po / .mo files (in `/languages/`)
* All source strings are English; Polish translation shipped as `aprus-appointment-calendar-pl_PL.mo`
* Localized month and weekday labels use WordPress core translations via `wp_date()`
* Full code comments translated to English

= 2.4.2 =
* Fix layout shift after selecting a day in the monthly view (theme CSS interference)
* `overflow: hidden` on the calendar card so nothing escapes
* `min-width: 0` on grid children — prevents column widening under long content

= 2.4.0 =
* Respect WordPress `start_of_week` — Monday or Sunday
* Respect WordPress `time_format` — 24h / 12h AM-PM in slot labels and popover
* Minor CSS reset to prevent themes from breaking labels and headings

= 2.3.0 =
* Full visual redesign — modern colour palette, spacing, typography

= 2.2.0 =
* Admin availability: rubber-band rectangle selection (mouse drag or touch)
* Auto-jump on first load to the first week with clickable slots
* Stronger `user-select: none` to stop theme CSS from breaking drag

= 2.1.0 =
* Booking popover on hover (client details + cancel)
* Cancel booking endpoint with customer e-mail notification
* Full i18n — auto-detected Polish / English

= 2.0.0 =
* New availability model — nothing is bookable by default; admin opens slots explicitly
* Add appointment duration + buffer settings

= 1.0.0 =
* First release

== Upgrade Notice ==

= 2.4.2 =
Layout fix — a full-height card is guaranteed to contain the calendar with no column overflow.
