Changelog CannaCal

0.16.1 — Kalender-Popover: Fixes

  • Pointer-Cursor auf Kalender-Events: FullCalendar setzt bei eventClick (statt url) keinen Hand-Cursor – jetzt per CSS ergänzt, damit Events sichtbar klickbar wirken.
  • Kodierung repariert: Tagebuch-Name/Titel zeigten texturierte Entities ( statt „–"), weil get_the_title() durch wptexturize läuft und die Werte per textContent ausgegeben werden. Jetzt serverseitig via html_entity_decode() zu echten UTF-8-Zeichen dekodiert (Name, Plan-Titel, Eintragszeile).

0.17.0 — Mobile Grow-Navigation + Foto-Auswahl

  • Helfer für die kontextabhängige Mobil-Navigation (von Weederkennen genutzt, lose gekoppelt): cannadaily_is_grow_page(), cannadaily_grow_entry_url() und cannadaily_nav_entry_data() (liefert je nach Anzahl Tagebücher den Modus neu/direkt/Auswahl + die Tagebuch-Liste). Das Eintragsformular hat jetzt einen Anker #cd-entry für den Direktsprung.
  • Foto-Upload „Instagram-like": statt des nackten Datei-Felds zwei Buttons 📷 Kamera und 🖼️ Galerie, die denselben (versteckten) cd_photo-Input auslösen — Kamera mit capture="environment", Galerie ohne. Sofort-Vorschau, Server-Validierung und EXIF-Strippung unverändert. Ein Foto pro Eintrag wie bisher.

0.16.0 — Web-Kalender: Event-Popover

  • Klick auf einen Kalender-Eintrag öffnet ein Popover (FullCalendar-eventClick) mit Titel, Datum, Tagebuch-Badge und Typ (📋 Plan-Schritt / 📓 Tagebuch-Eintrag) sowie einem Button „Zum Tagebuch öffnen" (Detailseite des jeweiligen Grows via ?cd_grow=ID). Schließt bei Außenklick/ESC, bleibt im Viewport.
  • Dafür tragen die Kalender-Events jetzt growId + Detail-URL in extendedProps. Dynamische Texte werden per textContent gesetzt (kein innerHTML), da Titel aus Nutzer-Notizen stammen. Styling über --nw-*-Tokens inkl. Dark-Theme.

0.15.0 — Grow-Glossar

  • Neuer Shortcode [canna_glossar]: öffentliches Endnutzer-Fachlexikon für den Autoflower-Anbau (Pflanzentypen, Phasen, Licht/Klima, Training, Pflanzenteile, Substrat/Nährstoffe, Recht/KCanG) aus der mitgelieferten GLOSSAR.md. Alphabetisch sortiert, A–Z-Sprungnavigation, Live-Suchfilter und Anker je Begriff (Deep-Link, z. B. …/glossar/#term-autoflower).
  • Eigenständig, keine Kopplung an navweed (eigene Datei, eigener Inhalt). Styling über die --nw-*-Tokens inkl. Dark-Theme; standalone greifen die Fallback-Farben. Inhalt in GLOSSAR.md jederzeit erweiterbar.

0.14.6 — FullCalendar update-sicher laden

  • Der Web-Kalender ([canna_daily_calendar]) sucht die self-hosted FullCalendar-Datei jetzt zuerst im Plugin (assets/vendor/) und sonst in wp-content/uploads/cannacal/ — letzteres überlebt Plugin-Updates (im Plugin-Ordner würde die Datei bei jedem Update überschrieben). Gilt auch für die Locales-Datei.
  • Admin-Hinweis + READ_ME aktualisiert (empfohlener Ablageort = uploads/cannacal/).

0.14.5 — CannaDaily-Teilen mit Social-Icon-Reihe

  • In der Teilen-Box (Eintrag & Grow) jetzt die gleiche Icon-Reihe wie bei navweed: **Kopieren · X · Mastodon · Sharepic 1:1 · 4:5** (Icons 1.9rem, Buttons 44px). Kopieren/Mastodon via kleinem JS (diary.js).
  • Sharepics (1:1 + 4:5) werden beim Teilen erzeugt (Share::buildSharepics), damit die Download-Links sofort funktionieren; URL-Helper Share::sharepicUrl().

0.14.4 — Sharepic-Text repariert + Layout + Sorten-Vorbefüllung

  • Sharepic-Text gefixt: HTML-Entities (z. B. → „–") werden dekodiert, Emojis/Symbole entfernt (GD-Schrift hat dafür keine Glyphen → vorher Müllzeichen wie „đ"/„Ś"), sauberes Kürzen ohne kaputte Zeichen.
  • Layout/Schrift: Kicker „CANNADAILY" + großer Titel + Akzent-Subzeile (wie bei den Reviews), deutlich größere Schrift; Bug behoben (Sorte im Grow-Sharepic). Footer „weederkennen.de".
  • Setup-Vorbefüllung: kommt der Nutzer über „Jetzt growen" von einer Sorte (?cd_strain_pre=ID), ist die Sorte im Tagebuch-Setup bereits ausgewählt.

0.14.3 — Sharepic sichtbar machen

  • Auf der geteilten Seite (/geteilt/…) wird das Sharepic jetzt inline angezeigt (1:1 als Hero-Bild), nicht nur als Download. Die 4:5-Variante bleibt als Download.
  • In der Teilen-Box im Tagebuch gibt es einen klaren Link „👁️ Vorschau & Sharepic öffnen ↗" zum geteilten Link — so findet man das Bild sofort.

0.14.2 — Sharepic auch im Hochformat (4:5)

  • Zusätzlich zum quadratischen Sharepic (1:1) gibt es jetzt eine 4:5-Variante (1080×1350) je geteiltem Eintrag/Grow. Auf der geteilten Seite stehen beide als Download („Quadrat (1:1)" · „Hochformat (4:5)").
  • Share::sharepic($type, $post, $ratio) mit square|portrait; Foto-Band + Textbereich passen sich der Höhe an.

0.14.1 — Foto-Upload: Sofort-Vorschau

  • Beim Tagebuch-Eintrag zeigt das Foto-Feld jetzt direkt nach der Auswahl ein Thumbnail + Dateiname/Größe (assets/js/diary.js), mit „✕ Foto entfernen". Der Upload passiert weiterhin beim Speichern — aber der Nutzer sieht sofort, dass ein Bild gewählt ist.
  • Client-Warnung bei falschem Typ (nur JPG/PNG/WebP) oder > 5 MB, damit nicht still verworfen wird.

0.14.0 — Tagebuch teilen (Eintrag & Grow, mit Bild)

  • Öffentliches Teilen wie bei Reviews (includes/Share.php): pro Element ein geheimer Token + Opt-in (cc_shared), Route /geteilt/(eintrag|grow)/{token}/ mit öffentlicher Seite + OG-Tags + GD-Sharepic.
  • Einheit: beides — einzelner Eintrag (Datum, Notiz, Foto, Wetter; Foto-Option cc_share_photo) und ganzes Tagebuch/Grow (Titelbild, Sorte, Run, Stats, letzte Einträge).
  • Teilen-UI im Tagebuch: je Eintrag „🔗 Eintrag teilen" (mit „Foto mitteilen") und „🔗 Ganzes Tagebuch teilen"; jeweils Link anzeigen + „Nicht mehr teilen" (zieht den öffentlichen Zugriff zurück).
  • Sharepic: 1080², Foto als Cover-Band oben + Text (TTF mit System-Font-Fallback), Footer „weederkennen.de".
  • Hinweis: Geteilte Links sind über das Token öffentlich erreichbar (kein Login) — bewusst, wie bei den Reviews. Nach Update den Permalink-Cache ggf. einmal neu speichern (neue Route).

0.13.2 — Changelog-Anzeige: neueste Version oben

  • [cannacal_changelog] rendert die Versionen jetzt neueste zuerst (Sektionen werden im Renderer umgedreht; die Datei bleibt chronologisch, neue Einträge weiterhin unten anhängbar).

0.13.1 — Härtung: persönliche Seiten leiten auf Login

  • Gäste werden auf [canna_daily] / [canna_daily_dashboard] / [canna_daily_calendar]-Seiten jetzt **hart zur Login-Seite umgeleitet** (auth_redirect auf template_redirect), statt nur eine Hinweis-Zeile zu zeigen.
  • Kein bekanntes Datenleck vorher: anonyme Abrufe zeigten bereits nur den Login-Hinweis (Shortcodes prüfen Login), Seiten sind noindex,nofollow. Diese Änderung macht das Verhalten konsistent mit dem Weederkennen-Katalog und robuster gegenüber Caching.
  • Hinweis: Nach Deploy den Seiten-Cache leeren (PWA/Cache-Plugin), damit eine evtl. gecachte Hinweis-Seite durch den Redirect ersetzt wird.

0.13.0 — Changelog-Shortcode/Block

  • Neuer Shortcode [cannacal_changelog] + Block „CannaCal Changelog" (includes/Changelog.php): rendert diese CHANGELOG.md als HTML (Überschriften, Listen, fett, code). Vorher gab es das nur als Datei – der Shortcode wurde daher nicht interpretiert. Pendant zu Weederkennens [navweed_changelog].

0.12.0 — Feinschliff CannaDaily

  • Button-Schrift weiß: Anchor-Buttons (z. B. „Neues Tagebuch") erzwingen jetzt weiße Schrift auf Grün — die Theme-Linkfarbe (blau) wurde per Spezifität überschrieben.
  • Redirect nach Eintrag: zeigt zuverlässig zurück auf die Grow-Tagebuchseite (deterministisch über die Detailseiten-URL) statt über Referer/Home auf dem Weederkennen-Dashboard zu landen. Nach „Tagebuch löschen" → Übersichtsseite.
  • Grow-Run-Nummer: Setup-Feld „Dein Grow-Run (Nummer)" (Auto-Vorschlag = nächster Lauf, anpassbar), gespeichert als cc_run; Anzeige als „Run #N" auf Dashboard-Karte und Tagebuch-Kopf.
  • Plan-Abgleich: Unter der Eintrags-Eingabe erscheint der heutige Plan-Hinweis, wenn für den Grow-Tag eine Aufgabe ansteht (z. B. Düngen) — „📋 Heute im Plan (Tag X): …" (aus dem GrowSchedule).

0.11.0 — Web-Kalender (Gesamt-Kalender im Frontend, iCal optional)

  • Neuer Shortcode [canna_daily_calendar] + Block „CannaDaily Kalender": zeigt den Gesamt-Kalender des Nutzers direkt auf der Website — alle Tagebücher (Anbau-Plan ab jeweiligem Start + alle Einträge), farbig je Grow. Damit wird das iCal-Abo optional (bleibt aber bestehen).
  • Renderer: FullCalendar v6 (MIT), self-hosted unter assets/vendor/fullcalendar.min.js (assets/js/calendar.js, Monats-/Listen-Ansicht). Events werden serverseitig aggregiert und inline geliefert (kein externer Request, nur eigene Daten, login-gated).
  • Graceful Fallback: fehlt die FullCalendar-Datei, rendert PHP automatisch eine Agenda-Liste (kommende Termine) — nie leer. Admin-Hinweis + Anleitung unter assets/vendor/READ_ME_FULLCALENDAR.txt.
  • Die FullCalendar-Datei kann ich nicht mitliefern (MIT-Lizenz, aber aus der Build-Umgebung nicht beschaffbar); einmalig herunterladen + ablegen (Pfad/Anleitung beigelegt).

0.10.0 — Seiten-Split: Übersicht vs. Detailseite

  • Neuer Übersichts-Shortcode [canna_daily_dashboard] + Block „CannaDaily Übersicht": zeigt nur die Tagebuch-Karten. Damit kannst du eine Übersichtsseite bauen mit [autoflower_calendar] + [canna_daily_dashboard] (Kalender + alle Tagebücher nebeneinander).
  • Die Karten verlinken auf die Detailseite mit [canna_daily] (auto-erkannt über den Shortcode, Option-Cache). Das einzelne Tagebuch + Einträge + Bearbeiten leben dort.
  • Back-Links („← Alle Tagebücher") führen zur Übersichtsseite, sofern vorhanden.
  • [canna_daily] bleibt abwärtskompatibel: ohne Übersichtsseite zeigt es weiterhin selbst das Dashboard.

0.9.0 — Pro-Grow-Kalenderfeed (Einträge im Kalender)

  • Neuer privater, tokengeschützter ICS-Feed je Tagebuch: Route /grow-kalender/{token}/ (includes/GrowFeed.php). Enthält Anbau-Schema (ab dem Startdatum dieses Grows) + Tagebuch-Einträge als Termine + die wöchentliche Erinnerung.
  • ICalBuilder erweitert: setDiaryEntries() (Einträge als VEVENTs) und setUidSalt() — Letzteres gibt jedem Grow eindeutige Event-UIDs, damit zwei Grows mit gleichem Startdatum (z. B. dieselbe Sorte in- & outdoor) sich in Kalender-Apps nicht überlagern.
  • Abo-Link in der Tagebuchseite (aufklappbar). Token = Bearer-Geheimnis (Tagebuch ist privat → Link nicht öffentlich teilen). Rewrite-Regel wird nach dem Update einmalig automatisch geflusht.
  • Der bestehende anonyme Datums-Kalender (/kalender/{base64}/) bleibt unverändert.

0.8.0 — Mehrere Tagebücher, Dashboard, editierbare Einträge (Refactor)

  • Einträge sind jetzt ein eigener CPT cc_entry (post_parent = Tagebuch) statt JSON-Meta — Grundlage für Bearbeiten pro Eintrag und späteres Teilen (analog Reviews). Einmalige, idempotente Migration der alten JSON-Einträge (cc_entries) in cc_entry-Posts; Roh-JSON bleibt als Fallback erhalten.
  • Mehrere Tagebücher parallel je Nutzer (z. B. gleiche Sorte in- & outdoor).
  • [canna_daily] ist jetzt ein Router: ohne Auswahl → Dashboard (Karten je Tagebuch mit Cover, „Tag X" seit Keimstart und Eintrags-Anzahl, Button „Neues Tagebuch"); ?cd_grow=IDTagebuchseite (changelog-artige Eintragsliste); ?cd_grow=ID&cd_edit=ENTRYEintrag bearbeiten; sonst Setup.
  • Jeder Eintrag editierbar (Datum, Notiz, Foto ersetzen/entfernen) und einzeln löschbar; Titelbild weiterhin pro Tagebuch markierbar. Alle Aktionen führen die konkrete Grow-/Eintrags-ID mit (Eigentümer-geprüft).
  • Read-API cannacal_user_strain_photo() und DSGVO-Eraser auf cc_entry umgestellt; Foto-Upload/EXIF-Strip/ Wetter-Stempel unverändert, hängen jetzt am Eintrag.
  • Teilen pro Eintrag ist damit vorbereitet, aber noch nicht gebaut (Folge-Schritt).

0.7.0 — Gutenberg-Blöcke (neben den Shortcodes)

  • Zwei dynamische Blöcke als dünne Hülle um die bestehenden Shortcodes (kein Markup-Duplikat, kein Build-Step – reines wp.*-JS): includes/Blocks.php + assets/js/blocks.js.
  • „CannaCal Grow-Kalender" (cannacal/calendar, render = cannacal_render_shortcode), mit optionalem Überschrift-Attribut.
  • „CannaDaily Tagebuch" (cannacal/diary, render = cannadaily_render_shortcode).
  • Im Editor je ein Platzhalter (Live-Vorschau nicht sinnvoll: Kalender braucht JS, Tagebuch Login); das Frontend rendert das echte Widget. Shortcodes bleiben unverändert nutzbar.

0.6.0 — CannaDaily Phase 2a: Fotos + Sorten-Verknüpfung (Quelle)

  • Foto-Upload pro Eintrag (media_handle_upload, multipart): Typ (jpg/png/webp) + Größe (≤ 5 MB) serverseitig geprüft, Attachment am Grow. Abonnenten-Upload via temporär gewährtem upload_files.
  • EXIF/GPS-Strip beim Upload (GD-Neukodierung) — kein Grow-Standort in den Metadaten.
  • Grow ↔ Sorte: cc_strain_ref (nw_strain-ID), Sortenwahl im Setup per Weederkennen-REST-Autocomplete (/wp-json/navweed/v1/strains, diary.js). Nur wenn Weederkennen aktiv (sonst Feld ausgeblendet → standalone).
  • Titelbild: Nutzer markiert ein Eintrags-Foto (cc_cover, Aktion set_cover, Eigentümer-geprüft).
  • Read-API cannacal_user_strain_photo($userId, $strainId) (global, helpers.php): liefert Titelbild, sonst neuestes Foto — Grundlage für Phase 2b (Anzeige in Weederkennen-Review + Sharepic).
  • DSGVO: Grow-Attachments werden bei „Grow löschen" und im Personal-Data-Eraser mitgelöscht.
  • Noch offen (2b): Anzeige des Fotos in der Weederkennen-Review und auf dem Sharepic (Opt-in) — separater Schritt im navweed-Plugin.

0.5.0 — CannaDaily: Standort (Photon) + DWD-Wetter

  • Standort-Autocomplete im Setup (outdoor): custom Photon-Feld (OpenStreetMap, kein Key, kein Google), assets/js/diary.js. Auswahl speichert Ort-Label + lat/lng (+ PLZ) ins Meta — datensparsam, debounced (ab 3 Zeichen). Ausrichtung (Himmelsrichtung) bleibt separat. Bewusst kein ACF (komplett custom).
  • DWD-Wetter pro Eintrag: neuer WeatherProvider (includes/WeatherProvider.php) holt das Tageswetter via Bright Sky (DWD Open Data) für die Koordinaten des Grows und stempelt es an jeden neuen Outdoor-Eintrag (Emoji + Lage + Temperatur + Luftfeuchte). Transient-Cache (6 h) pro Ort/Tag, graceful: kein/kaputtes Ergebnis → Eintrag ohne Wetter.
  • Anzeige: Wetter-Chip je Eintrag; Pflicht-Attribution „DWD via Bright Sky · OpenStreetMap/Photon".
  • Hinweis: Photon/Bright Sky sind öffentliche Dritt-Instanzen (Rate-Limit, self-hostbar) — für DSGVO/Last ggf. später Self-Host. Foto-Upload weiterhin offen (Phase 2).

0.4.0 — CannaDaily: Grow-Tagebuch (MVP, ohne Wetter)

  • Neues, eigenständiges Tagebuch auf WP-Core (CPT cc_grow, post_author = Nutzer; Einträge als JSON-Meta cc_entries). Kein eigenes Login, keine Weederkennen-Kopplung. (includes/Diary.php)
  • Shortcode [canna_daily] (frontend/diary.php): nur eingeloggt; Setup (indoor/outdoor; bei outdoor PLZ + Ausrichtung; Startdatum rückdatierbar bis 30 Tage), datierte Text-Einträge, Eintragsliste (neueste zuerst), „Grow löschen". Formulare per Nonce + PRG-Redirect.
  • CSS assets/css/diary.css in den Weederkennen-Tokens (--nw-* mit Fallbacks) inkl. Dunkel-Mode.
  • Wöchentliche Tagebuch-Erinnerung im Kalender-Feed: wiederkehrendes Event (RRULE:FREQ=WEEKLY;COUNT=16) ab Tag 7 — zustandslos, in jedem generierten ICS (ICalBuilder).
  • DSGVO: in den WP-Personal-Data-Eraser eingehängt (löscht alle Grows eines Nutzers).
  • Bewusst noch NICHT enthalten: Wetter-Stempel (DWD). Grund: das im Konzept geplante Bündeln der PLZ→Koordinaten-CSV ist aus der Build-Umgebung nicht möglich → Geocoding-Quelle muss vor 0.5.0 entschieden werden (siehe CannaCal_Konzept_Tagebuch.md). Foto-Upload ebenfalls Phase 2.

0.3.1 — Startdatum: Rückdatieren möglich

  • Startdatum-Feld erlaubt jetzt Vergangenheitsdaten bis 30 Tage zurück („schon angesetzt"), statt nur ab heute (shortcode.php: min = heute−30). Label klarer: „Wann hast du die Samen angesetzt – oder wann planst du es?".
  • Bewusst keine separate Checkbox: das Datum kodiert geplant (Zukunft) vs. bereits gestartet (Vergangenheit) — keine redundante zweite Bedienlogik.
  • Hinweis: Rückdatieren verkürzt die verbleibende Link-Gültigkeit (145 Tage ab Startdatum).

0.3.0 — Nachernte: Fermentierung + Curing (+4 Wochen)

  • Schema um eine zweistufige Nachernte verlängert (Tag 85 → ~113):
  • Stufe 1 Fermentierung (Tag 85 Start, Tag 92 Woche 1, tägliches Burpen).
  • Stufe 2 Curing (Tag 99 Beginn, Tag 106 Woche 3, Tag 113 abgeschlossen).
  • Neue Phasen fermentation + curing (GrowSchedule::getPhases()), Emoji 🫙 in ICalBuilder.
  • Der „nächster Zyklus"-Hinweis + §34-Hinweis wandern ans neue Ende (Tag 113).
  • Gekoppelter Pflicht-Fix: Abo-Ablauf von 90 → 145 Tage angehoben (Server::EXPIRY_DAYS, genutzt in isExpired, PROPFIND-Fenster und Fehlertext) — sonst stürben die Curing-Events hinter der alten 90-Tage-Grenze. Frontend (frontend.js EXPIRY_DAYS, Shortcode-Anzeige „145 Tage", Termin-Zähler) synchron nachgezogen.

0.2.0 — Weederkennen-Integration (Phase 1a + 1b)

Design (1a)

  • assets/css/frontend.css komplett von der eigenen --cc-*-Glassmorphism-Optik auf die Weederkennen-Tokens (--nw-green, --nw-line, --nw-surface-soft, --nw-ink, --nw-star, --nw-radius*) umgestellt — flach, ohne Gradients/Glow/Float-Animation.
  • Tokens werden per var(--nw-*, fallback) referenziert: mit aktivem Weederkennen erbt das Widget dessen Marke; Dunkel-Mode via html[data-nw-theme="dark"]-Overrides; standalone greifen die Fallbacks.

Branding (1a)

  • iCal-Feed rebranded: PRODID, X-WR-CALNAME, UID-Domain (@weederkennen.de) und Footer (🌐 weederkennen.de) in ICalBuilder.php; PROPFIND-displayname/-Beschreibung + ICS-Dateiname in CalDAV/Server.php; Legal-Footer-Link im Shortcode (cannacal.ioweederkennen.de).
  • Naming „CannaCal" → „Weederkennen Grow" (im Feed/Abo sichtbar).

Kopplung (1b)

  • Neuer globaler Helper cannacal_calendar_page_url(int $strainId = 0) (frontend/helpers.php, bewusst global für function_exists()-Detection durch Weederkennen): findet die Seite mit dem [autoflower_calendar]-Shortcode (Option-Cache + Revalidierung), hängt optional ?nw_strain=ID an.
  • Shortcode nimmt den Sorten-Kontext (?nw_strain) auf und zeigt ihn als Chip „Für deine Sorte: …"; cached zugleich die eigene Seiten-ID für den Helper.
  • Gegenstück in Weederkennen (strain-view.php, ab navweed 0.35.7): CTA „🌱 Grow-Kalender starten" nur auf Autoflower-Sorten, function_exists()-gekapselt.

0.1.0 — Erststand (Bestandsaufnahme)

  • Autoflower-Grow-Kalender als CalDAV/ICS-Abo.
  • Rewrite-Route /kalender/{base64-datum}/; CalDAV-Server (GET/HEAD/OPTIONS/PROPFIND), Slug- Decode + checkdate-Validierung, 90-Tage-Ablauf (410).
  • RFC-5545-iCal: All-Day-VEVENTs, 24h-VALARM, Text-Escaping, 75-Oktett-Folding, Europe/Berlin.
  • Statisches Schema (GrowSchedule): ~25 Events, Phasen Vorbereitung→Ernte, Biobizz-Düngung, Ernte-Fenster Tag 70–85 (bewusst beibehalten).
  • Per-Tag-Content-Blöcke infotainment + werbepartner (JSON in wp_options); basis = Event- eigene Beschreibung (die separate basis-Option ist vestigial/ungenutzt).
  • Shortcode [autoflower_calendar] (Datum → URL, Kopieren, Plattform-Tabs); Admin mit 2 Tabs.
  • Moderne Code-Basis: Namespace CannaCal\, declare(strict_types=1), OOP/Singleton.
Nach oben scrollen