0.16.1 — Kalender-Popover: Fixes
- Pointer-Cursor auf Kalender-Events: FullCalendar setzt bei
eventClick(statturl) keinen Hand-Cursor – jetzt per CSS ergänzt, damit Events sichtbar klickbar wirken. - Kodierung repariert: Tagebuch-Name/Titel zeigten texturierte Entities (
–statt „–"), weilget_the_title()durchwptexturizeläuft und die Werte pertextContentausgegeben werden. Jetzt serverseitig viahtml_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()undcannadaily_nav_entry_data()(liefert je nach Anzahl Tagebücher den Modus neu/direkt/Auswahl + die Tagebuch-Liste). Das Eintragsformular hat jetzt einen Anker#cd-entryfü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 mitcapture="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 inextendedProps. Dynamische Texte werden pertextContentgesetzt (keininnerHTML), 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 mitgeliefertenGLOSSAR.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 inGLOSSAR.mdjederzeit 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 inwp-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-HelperShare::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)mitsquare|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_redirectauftemplate_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 dieseCHANGELOG.mdals 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. ICalBuildererweitert:setDiaryEntries()(Einträge als VEVENTs) undsetUidSalt()— 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) incc_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=ID→ Tagebuchseite (changelog-artige Eintragsliste);?cd_grow=ID&cd_edit=ENTRY→ Eintrag 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 aufcc_entryumgestellt; 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ährtemupload_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, Aktionset_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-Metacc_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.cssin 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 🫙 inICalBuilder. - 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 inisExpired, 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.csskomplett 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 viahtml[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) inICalBuilder.php; PROPFIND-displayname/-Beschreibung + ICS-Dateiname inCalDAV/Server.php; Legal-Footer-Link im Shortcode (cannacal.io→weederkennen.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ürfunction_exists()-Detection durch Weederkennen): findet die Seite mit dem[autoflower_calendar]-Shortcode (Option-Cache + Revalidierung), hängt optional?nw_strain=IDan. - 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 separatebasis-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.