OpenCalendar

Kalender Ansicht

Die Kalender Ansicht führt Termine mehrerer Kalender-Instanzen in einer gemeinsamen responsiven Darstellung zusammen. Sie kann direkt in der Symcon-Kachelvisualisierung oder über eine WebContent-Variable in IPSView verwendet werden.

Voraussetzungen

Schnellstart für die Kachelvisualisierung

  1. Über Instanz hinzufügen eine Instanz Kalender Ansicht erstellen.
  2. In der Liste Kalender für jede gewünschte Zeile eine Kalender-Instanz auswählen und Aktiviert einschalten.
  3. Standardansicht, Kachel-Schriftgröße, geladenen Terminzeitraum und maximale Terminanzahl festlegen. Die Kachel-Schriftgröße kann zwischen 50 und 200 Prozent eingestellt werden; 100 Prozent entspricht der bisherigen Darstellung.
  4. Den aufklappbaren Bereich Anzeigeoptionen öffnen. Dort sind die allgemeinen Zusatzinformationen wie Wochenenden, Kalendername, Ort und Beschreibung sowie die ansichtsspezifische Matrix für Terminanzahl, Kalenderwoche und Tageszahl gebündelt. Für die Listenansicht werden dort zusätzlich die gewünschten Listenspalten und die Bedienelemente der Listenansicht gewählt.
  5. Über Ansichtszeiträume die sichtbare Länge jeder Darstellung festlegen.
  6. Die Konfiguration übernehmen und Kalender synchronisieren ausführen.
  7. Die Instanz in der Symcon-Kachelvisualisierung platzieren.

Mit Alle Kalenderinstanzen auswählen werden alle im System vorhandenen Kalender-Instanzen im aktuell geöffneten Konfigurationsformular eingetragen und aktiviert. Die Aktion ist eine Komfortfunktion, wenn viele Kalender auf einmal ausgewählt werden sollen oder die Liste unvollständig ist. Eine vorhandene individuelle Auswahl im Formular wird dabei ersetzt. Die Änderung wird erst mit Übernehmen dauerhaft in der Instanzkonfiguration gespeichert. Eine verlorene gespeicherte Auswahl wird unabhängig davon bereits automatisch aus der internen Sicherung wiederhergestellt, soweit diese verfügbar ist.

Funktionsumfang

Google-, Microsoft-, Apple-iCloud- und CalDAV-Serienvorkommnisse können einzeln, ab dem ausgewählten Vorkommnis oder als vollständige Serie bearbeitet und gelöscht werden, sofern die Wiederholungsregel verlustfrei geteilt werden kann. Beim Bearbeiten teilt OpenCalendar die bestehende Serie am gewählten Vorkommnis: Der vordere Serienteil bleibt unverändert, ab dem gewählten Termin entsteht ein neuer Serienteil mit den Änderungen. Bereits vorhandene Ausnahmen ab diesem Termin werden dabei zurückgesetzt. Beim Löschen beendet OpenCalendar die bestehende Serie direkt vor dem gewählten Vorkommnis; beim ersten Vorkommnis wird die komplette Serie entfernt. Bei nummerierten Serien wird beim Teilen nur die verbleibende Anzahl in den neuen Serienteil übernommen.

Einzeltermine sowie unterstützte Bereiche von Serienterminen können im Bearbeitungsdialog in einen anderen, in dieser Kalender Ansicht ausgewählten und beschreibbaren Kalender verschoben werden. Bei einer Serie kann Nur diesen Termin als einzelner Termin ins Ziel verschoben werden. Diesen und alle folgenden Termine sowie die Gesamte Serie lassen sich verschieben, wenn der Quellkalender den jeweiligen Schreibumfang erlaubt, die Wiederholungsregel verlustfrei bearbeitbar ist und der Zielkalender neue Serientermine anlegen kann. Komplexe oder nicht verlustfrei übertragbare Erinnerungseinstellungen blockieren den Vorgang.

Dazu wird im Feld Kalender ein anderes Ziel gewählt; die Schaltfläche Speichern wechselt dann auf Verschieben. OpenCalendar legt den Termin zuerst im Zielkalender an und löscht ihn erst anschließend im Quellkalender. Schlägt das Löschen im Quellkalender fehl, versucht OpenCalendar zunächst, den gerade im Ziel angelegten Termin wieder zu löschen. Nur wenn auch dieser Rollback scheitert, bleibt die Zielkopie bestehen und der Anwender wird aufgefordert, beide Kalender zu prüfen. Providerübergreifendes Verschieben, beispielsweise Google → Microsoft oder CalDAV → Google, ist damit möglich. Provider-spezifische Zusatzdaten, die OpenCalendar nicht im gemeinsamen Terminmodell führt, werden dabei nicht übertragen.

Aufgabentermine bedienen

Im Dialog Termin erstellen beziehungsweise Termin bearbeiten aktiviert Aufgabentermin die Aufgabenfunktion. Das Datum bleibt frei wählbar; OpenCalendar setzt den Termin automatisch auf ganztägig und deaktiviert Jahresereignisse. Ein Aufgabentermin dauert genau einen Tag und kann auch eine Wiederholung erhalten. Im Kalender kennzeichnet [OC:TODO] eine offene und [OC:DONE] eine erledigte Aufgabe. Die Kalenderansicht stellt sie weiterhin mit einem Kästchen dar; beim Kalenderanbieter wird bewusst nur die ASCII-kompatible Kennzeichnung gespeichert.

In den Termindetails steht für offene Aufgaben Als erledigt markieren zur Verfügung. Bei erledigten Aufgaben wird daraus Aufgabe wieder öffnen. Eine offene Aufgabe mit einem Datum vor heute wird beim lokalen Tageswechsel oder bei der nächsten Synchronisation als echter Kalendertermin auf heute verschoben. Erledigte Aufgaben verbleiben an ihrem Datum. Bei Aufgabenserien legt die Option Geplante Folgetermine mitverschieben fest, ob der restliche Serienplan beim Nachziehen unverändert bleibt oder ab dem überfälligen Vorkommnis gemeinsam verschoben wird. Die Option steht nur bei Kalendern mit Unterstützung für Diesen und alle folgenden Termine bereit. Damit funktionieren Aufgabentermine auch im IPSView-Client und ohne eine zusätzliche Aufgaben-API oder weitere OAuth-Berechtigungen.

Auch beim manuellen Ändern des Datums gilt diese Auswahl: Mit Häkchen werden der ausgewählte und alle folgenden Termine verschoben, beim ersten Termin also die gesamte Serie. Bereits einzeln angepasste folgende Vorkommnisse werden dabei zurückgesetzt. Der Hinweis im Bearbeitungsdialog folgt der Auswahl. Das reine Erledigen ohne Datumsänderung betrifft weiterhin nur die ausgewählte Aufgabe.

Die Auswahl gilt auch beim Wechsel in einen anderen Kalender: Mit Geplante Folgetermine mitverschieben werden das ausgewählte und alle folgenden Vorkommnisse als Serie übertragen, beim ersten Termin also die gesamte Serie. Ohne Häkchen wird nur das geöffnete Vorkommnis als Einzeltermin übertragen. Das Ziel muss Serien anlegen können. Erst nach erfolgreicher Erstellung im Ziel wird der übertragene Serienteil an der Quelle entfernt; bei einem Fehler greift die bestehende Rücknahme des Zieltermins. Offene Aufgaben bleiben offen.

Das Datum darf auch nach hinten verschoben werden. Liegt eine offene Aufgabe danach in der Vergangenheit, greift bei der nächsten Synchronisation wieder das automatische Nachziehen auf heute; mit aktiviertem Häkchen wird dabei auch der verbleibende Serienteil mitverschoben.

Soll ein überfälliges Vorkommnis ohne Mitverschieben auf heute nachgezogen werden, während zwischen beiden Daten bereits weitere Serientermine liegen, wird dieses Vorkommnis als einzelner offener Aufgabentermin weitergeführt. Der verbleibende Serienplan bleibt dadurch exakt erhalten; insbesondere Microsoft 365 muss kein Vorkommnis über ein anderes Serienelement verschieben. In der OpenCalendar-Ansicht kennzeichnet ein zusätzlicher Pfeil (☐ ↻) diesen nachgezogenen Einzeltermin; in den Termindetails wird er als Aus Serie nachgezogen bezeichnet.

Diese Serienzuordnung bleibt erhalten, wenn die offene Aufgabe zeitweise außerhalb des geladenen Datumsbereichs liegt. Erst eine bestätigte Erledigung oder Löschung (beziehungsweise das Entfernen der Aufgabenkennzeichnung) gibt die Ursprungsserie wieder frei. Vorübergehende Abfragefehler lösen diese Zuordnung nicht auf.

Beim Kalenderwechsel bleibt eine erfolgreich übertragene Aufgabe auch dann im Ziel erhalten, wenn das Nachladen der Quelle nach ihrer bestätigten Löschung fehlschlägt. In diesem Fall die Synchronisation wiederholen, nicht den Termin erneut verschieben.

Die Funktion setzt einen beschreibbaren Kalender voraus und unterstützt bewusst nur eintägige ganztägige Termine. In externen Kalenderprogrammen bleiben die Marker im Titel sichtbar. Google Tasks und andere Aufgabenlisten werden nicht importiert oder synchronisiert.

Einstellungen

Eigenschaft Beschreibung
Kalender Ausgewählte Kalender-Instanzen und ihre Aktivierung
Standardansicht Agenda, Liste, Tage, Woche oder Monat; wird nur verwendet, solange der jeweilige Client noch keinen eigenen Ansichtsstand gespeichert hat
Vergangene/Zukünftige Tage Datenzeitraum, aus dem Termine für alle Darstellungen geladen und zusammengeführt werden
Maximale Termine Obergrenze der in einer Antwort verarbeiteten Termine
Anzeigeoptionen → Allgemein Wochenenden, Kalendername, Anlass bei Jahresereignissen, Ort und Beschreibung zentral im aufklappbaren Bereich konfigurieren
Anzeigeoptionen → Terminanzahl Je Ansicht separat für Agenda, Tage und Woche; im Monat wird keine Tages-Terminanzahl eingeblendet
Anzeigeoptionen → Kalenderwoche Je Ansicht separat für Agenda, Liste, Tage, Woche und Monat
Anzeigeoptionen → Tageszahl Je Ansicht separat für Agenda, Liste, Tage, Woche und Monat
Anzeigeoptionen → Listenansicht Bedienelemente der Listenansicht ein-/ausblenden; Zeitraum und Ansichtswechsel bleiben sichtbar
Anzeigeoptionen → Listenspalten Legt fest, welche Datenfelder in der Listenansicht als Spalten erscheinen; der Anlass von Jahresereignissen kann als eigene Spalte eingeblendet werden
Ansichtszeiträume Sichtbare Länge jeder Ansicht im aufklappbaren Bereich; Agenda/Liste/Tage in Tagen, Woche in Wochen und Monat in Monaten
IPSView → Stilquelle Gemeinsame Stilquelle für die IPSView-Ausgabe: Benutzerdefiniert, IPSView-Medium, Style Profile V1 oder eine der festen Vorgaben
IPSView → Transparenter Hintergrund Macht ausschließlich den äußeren View-Hintergrund transparent; die übrigen Flächen behalten ihre Stilwerte
IPSView → Schrift-/Stilwerte Schriftfamilie, Schriftschnitt, Größe, Skalierung, Farben, Transparenzen, Rahmen, Schatten und Effekte; bei Vorgaben als wirksame schreibgeschützte Vorschau
IPSView → Native Farben 109 native IPSView-Farbfelder in 15 Gruppen; im benutzerdefinierten Stil einzeln über Abweichend überschreibbar, bei anderen Stilquellen als aufgelöste Werte schreibgeschützt

Die Kalenderwoche erscheint in der Wochenansicht in der Zeitraumüberschrift. In der Tage-Ansicht werden bei einem Wochenwechsel beide Kalenderwochen angegeben, beispielsweise KW 33/34. Die Agenda erhält beim Beginn einer neuen sichtbaren Kalenderwoche einen dezenten KW-Trenner. In der Monatsansicht steht die KW am Montag als erstem Tag der jeweiligen ISO-Kalenderwoche, auch wenn dieser Montag noch zum Vor- oder bereits zum Folgemonat gehört. Die Tageszahl wird in Agenda, Tage- und Wochenansicht in der vorhandenen Tagesüberschrift und im Monat dezent beim Tagesdatum dargestellt. In der Listenansicht werden Kalenderwoche und Tageszahl bei Aktivierung als eigene, schmale Spalten ausgegeben.

Die zuletzt am jeweiligen Browser/Monitor gewählte Ansicht und das zugehörige Bezugsdatum werden clientseitig und instanzbezogen gespeichert. Dadurch bleiben beispielsweise Liste und gewählter Zeitraum auch erhalten, wenn eine Kalendersynchronisation die IPSView-Seite neu lädt. Unterschiedliche Monitore können unabhängig voneinander verschiedene Ansichten verwenden. Die konfigurierte Standardansicht dient weiterhin als Ausgangswert für neue Clients.

Jeder gleichzeitig geöffnete Client lädt außerdem ausschließlich den Terminbereich, den seine eigene Ansicht gerade benötigt. Ein PC kann deshalb beispielsweise eine andere Woche anzeigen als ein Smartphone, ohne dass beide Ansichten ihren geladenen Zeitraum gegenseitig überschreiben. Ungültige oder übergroße Bereichsanfragen werden abgewiesen, statt stillschweigend einen anderen Standardzeitraum zurückzugeben.

Über das Kalenderfilter-Symbol in der Toolbar lassen sich die in der Kalender-Ansicht konfigurierten Kalender clientseitig ein- oder ausblenden. Es können einzelne, mehrere, alle oder keine Kalender gewählt werden. Der Filter verändert weder die Instanzkonfiguration noch die Synchronisation und wird pro Browser/Monitor zusammen mit dem Ansichtsstand gespeichert. Dadurch können Kachel und unterschiedliche IPSView-Clients unabhängig voneinander verschiedene Kalenderkombinationen anzeigen.

Alle eingebetteten Dialoge verwenden ein gemeinsames responsives OpenCalendar-Modaldesign. Kopf- und Aktionsbereich bleiben bei kleinen Darstellungsflächen sichtbar, während nur der Inhaltsbereich scrollt. Einheitliche Größenklassen, Abstände, Schließen-Schaltflächen, Fokusdarstellung, Popup-Farben, Rahmen und Schatten gelten gleichermaßen für Kachelvisualisierung und IPSView.

Erstellen- und Bearbeitungsdialoge werden bereits eingeblendet, bevor aufwendigere Dialogdaten vollständig vorbereitet sind. Beim Erstellen erscheint das Grundformular sofort; Wiederholungs- und Erinnerungsoptionen werden direkt anschließend initialisiert. Beim Bearbeiten werden zunächst die bereits synchronisierten Termindaten schreibgeschützt angezeigt, während OpenCalendar die aktuelle Provider-Identität einschließlich schreibrelevanter Daten wie ETag erneut verifiziert. Erst nach erfolgreicher Provider-Antwort wird der Editor freigeschaltet. Dadurch bleibt die bestehende Schreibsicherheit erhalten, ohne dass der Dialog während der Provider-Abfrage unsichtbar bleibt.

Ein Klick auf einen Termin öffnet zunächst eine reine Termindetail-Ansicht mit Kalender, Beginn, Ende, Ort und Beschreibung. Bei unterstützten Google-, Microsoft-, Apple-iCloud- und CalDAV-Serienvorkommnissen stehen beim Bearbeiten und Löschen Nur diesen Termin, Diesen und alle folgenden Termine und Gesamte Serie zur Wahl. Für die vollständige Serie lädt OpenCalendar zuerst den Parent-Termin; bei CalDAV wird die bereits beim Synchronisieren bekannte Kalenderobjekt-URL direkt verwendet, sodass keine erneute UID-Suche notwendig ist. Bei „Diesen und alle folgenden Termine“ werden zusätzlich das konkrete Zielvorkommnis und die verbleibende Serienlänge verifiziert, bevor der Editor geöffnet wird. Unterstützte RRULEs werden nur geteilt, wenn OpenCalendar sie verlustfrei abbilden kann; komplexere Regeln werden nicht automatisch vereinfacht. Bei CalDAV wird beim Bearbeiten zunächst der neue zukünftige Serienteil angelegt und erst danach die ursprüngliche Ressource gekürzt. Bei Microsoft-Onlinebesprechungen und Serien mit Anhängen wird kein neuer Serienteil erzeugt, um Besprechungs- oder Anhangsdaten nicht zu beschädigen. Schreibgeschützte Kalender bleiben geschützt.

Beim Erstellen eines Termins bieten beschreibbare Google-, Microsoft-, Apple-iCloud- und CalDAV-Kalender zusätzlich den Bereich Wiederholen. Unterstützt werden tägliche, wöchentliche, monatliche und jährliche Serien, ein frei wählbares Intervall, bei wöchentlichen Serien mehrere Wochentage sowie die Endarten Nie, Nach Anzahl und Am Datum. Die Serienoption erscheint nur bei Kalendern, deren Provider das Anlegen von Serienterminen ausdrücklich unterstützt. Für zeitgebundene Google-Serien wird die Kalenderzeitzone verwendet; bei Microsoft und CalDAV dient die Zeitzone des Clients als Rückfallwert, wenn der Kalender selbst keine Zeitzone bereitstellt. CalDAV-Serien werden mit TZID und passendem VTIMEZONE gespeichert.

Jährlich wiederkehrende persönliche Ereignisse können im selben Termin-Dialog über Jahresereignis als Geburtstag, Jahrestag, Hochzeitstag oder Todestag markiert werden. Sobald ein Typ gewählt ist, wird das zugehörige Ausgangsdatum hinterlegt und OpenCalendar legt den Termin als ganztägige jährliche Serie an. Tag und Monat des im Kalender gewählten Termins werden dabei als Datums-Vorschlag übernommen. Typ und Ausgangsdatum werden ausschließlich als lokale OpenCalendar-Metainformation gespeichert; der sichtbare Terminname beim Provider bleibt unverändert. In den OpenCalendar-Ansichten wird die Zahl der vergangenen Jahre dynamisch ergänzt, beispielsweise Max Mustermann (33J). Beim Bearbeiten eines einzelnen Serienvorkommnisses bleibt die Jahresereignis-Information geschützt; geändert werden kann sie beim vollständigen Serientermin.

Erinnerungen werden ebenfalls providerübergreifend bearbeitet. Google sowie Apple-iCloud/CalDAV können in OpenCalendar bis zu fünf einfache Erinnerungen relativ zum Terminbeginn verwalten; über Erinnerung hinzufügen lassen sich weitere Zeitpunkte ergänzen und einzeln wieder entfernen. Microsoft bleibt bei einer Erinnerung pro Termin. Beim Verschieben in einen Kalender mit kleinerem Limit wird keine Erinnerung stillschweigend verworfen: Der Vorgang wird abgelehnt, bis die Anzahl passend reduziert wurde. Nicht verlustfrei abbildbare Provider-Konfigurationen bleiben weiterhin als komplex geschützt und werden nicht automatisch vereinfacht.

Beim Löschen erscheint eine eigene OpenCalendar-Bestätigung mit Terminname und Zeitraum. Die native Browser-Abfrage wird nicht verwendet; Abbrechen kehrt zum zuvor geöffneten Detail- oder Bearbeitungsdialog zurück.

Die Listenansicht verzichtet bewusst auf Karten und zusätzliche Gruppierungen. Jeder Termin wird in einer einfachen Tabellenzeile dargestellt; der schmale Farbbalken übernimmt die Farbe des jeweiligen Kalenders. Datum, Beginn, Ende, Titel, Anlass, Kalendername, Ort und Beschreibung können unabhängig voneinander als Spalten ein- oder ausgeblendet werden. Optional lassen sich in dieser Ansicht die Schaltflächen für Zurück, Heute, Weiter, Termin erstellen und Aktualisieren ausblenden. Die Zeitraumüberschrift und die Auswahl der Ansichten bleiben dabei sichtbar, damit die Listenansicht jederzeit verlassen werden kann.

Der aufklappbare Bereich Ansichtszeiträume steuert die sichtbare Länge der einzelnen Darstellungen und gleichzeitig die Schrittweite der Vor-/Zurück-Navigation. Agenda, Liste und Tage-Ansicht verwenden Tage, die Wochenansicht verwendet Wochen und die Monatsansicht Monate. Der sichtbare Zeitraum und der oben konfigurierte Datenzeitraum sind unabhängig voneinander. Sollen Termine im gesamten sichtbaren Zeitraum vorhanden sein, muss der Datenzeitraum Vergangene/Zukünftige Tage diesen Bereich ebenfalls abdecken.

Die ausgewählten Kalender werden intern seitenweise gelesen. Dies geschieht automatisch und ermöglicht auch bei umfangreichen Kalendern den Aufbau der Ansicht, ohne Symcons Größenlimit für einzelne PHP-Rückgaben zu überschreiten.

Einrichtung in IPSView

  1. Den Bereich IPSView in der Instanzkonfiguration öffnen.
  2. IPSView-HTML-Ausgabe bereitstellen aktivieren.
  3. Unter Stilquelle direkt den gewünschten Stil wählen:
    • Benutzerdefinierter Stil,
    • IPSView-Standardstil aus einem .ipsView-Medienobjekt,
    • Helle Vorgabe oder Dunkle Vorgabe als kompatible Standardquellen,
    • Stilprofil aus einem Style-Profile-V1-Medienobjekt,
    • Hell, Dunkel, Warm, Kühl, Erdig, Wasser oder Sonnig als zentrale IPSView-Vorgaben.
  4. Bei IPSView-Standardstil das Medienobjekt mit der gewünschten .ipsView-Datei auswählen. Bei Stilprofil das Medienobjekt mit dem vollständigen validierten Style Profile V1 auswählen.
  5. Bei allen nicht benutzerdefinierten Quellen werden darunter die aktuell wirksamen Farben, Deckkräfte, Schriftwerte, Rahmen, Schatten, Effekte und nativen IPSView-Farben schreibgeschützt angezeigt. Dadurch bleiben vorhandene eigene Einstellungen beim Ausprobieren einer Vorgabe unverändert.
  6. Soll eine Vorgabe angepasst werden, In benutzerdefinierten Stil übernehmen wählen. Die aktuell wirksamen Werte werden vollständig in die benutzerdefinierten Felder kopiert und die Stilquelle wechselt auf Benutzerdefinierter Stil. Anschließend können die Werte frei verändert werden.
  7. Im benutzerdefinierten Stil stehen die zentralen IPSView-Schriften Roboto, Roboto Mono, Open Sans, PT Sans, Dancing Script, Bebas Neue, Indie Flower und Segment7 zur Verfügung. Der Schriftschnitt wird passend zur gewählten Schrift angeboten und ebenfalls beim Übernehmen einer Vorgabe kopiert.
  8. Mit Transparenter Hintergrund festlegen, ob die umgebende IPSView sichtbar bleiben soll. Diese Einstellung ist global und wird beim Kopieren eines Stils nicht verändert.
  9. Farbbalkenbreite einstellen und die Konfiguration übernehmen.
  10. Unterhalb der Instanz wird die String-Variable IPSView-Kalender mit der Darstellung Webinhalt angelegt.
  11. Im IPSView Designer ein Steuerelement vom Typ HTML-Box einfügen und die Variable IPSView-Kalender als ID auswählen.
  12. Als HTML-Renderer Browser des Clients oder Automatisch verwenden. Der einfache native HTML-Renderer genügt nicht, weil Navigation, Ansichtswechsel und Terminbearbeitung JavaScript verwenden.

Native IPSView-Farben und Vererbung

Der gemeinsame IPSViewStyleConfigurationHelper bildet die 109 bekannten nativen IPSView-Farbfelder in 15 Gruppen ab: Basis, Assoziationen, Tabs, Switch, Slider, Fortschrittsanzeige, Kreis, Flow, Gauge, Schatten/Raster, Dialog, Chart, Schedule, Event und Kalender. Diese nativen Felder werden nicht als zweiter, unabhängiger Stil gepflegt. Sie erben standardmäßig aus den semantischen Designrollen und folgen dadurch automatisch einer geänderten Grundfarbe oder Vorgabe.

Im benutzerdefinierten Stil kann ein einzelnes natives Feld mit Abweichend von dieser Vererbung gelöst und mit einer eigenen Farbe versehen werden. Wird die Farbe eines bisher geerbten Feldes manuell geändert, aktiviert OpenCalendar die Abweichung automatisch. Wird Abweichend wieder deaktiviert, wird der gespeicherte Override entfernt und das Feld übernimmt wieder den aus der semantischen Rolle abgeleiteten Wert. Bei IPSView-Medium, Stilprofil und festen Vorgaben zeigt die Konfiguration die vollständig aufgelösten nativen Werte nur lesend an.

ColorView und ColorPage haben unterschiedliche Aufgaben. ColorView ist der Hintergrund der gesamten View, ColorPage der Seitenhintergrund. Enthält ein als Stilquelle gewähltes .ipsView-Dokument kein ColorView, verwendet OpenCalendar für den View-Hintergrund den IPSView-Standard #404040; ColorPage wird nicht als Ersatz herangezogen. Der optionale Transparente Hintergrund betrifft ausschließlich den äußeren View-Hintergrund und ändert diese Farblogik nicht.

Style-Profile-Kompatibilität

Die Kalender Ansicht ist Referenz-Consumer für Style Profile V1 des IPSViewAssistant. Ein dort exportiertes Profil kann als Symcon-Dokumentmedium hinterlegt und anschließend direkt über Stilprofil ausgewählt werden. Der zentrale IPSViewStyleConfigurationHelper übernimmt den vollständigen portablen Snapshot einschließlich der nativen IPSView-Theme-Daten.

OpenCalendar berücksichtigt dabei Farben und ihre jeweils unabhängigen Deckkräfte, Schriftfamilie, Schriftschnitt, Basisschriftgröße und Skalierung, Eckenradius, Rahmen- und Linienstärke, Schattenparameter, Inaktivitätsdeckkraft und Verlaufsstärke. Fett, Kursiv und Fett kursiv werden in der IPSView-Ausgabe ebenfalls angewendet. Popups verwenden die Profilwerte für Hintergrund, Rahmen und Schatten; die responsive Darstellung bleibt davon unabhängig erhalten.

Ein vollständiges, unverändert aus dem IPSViewAssistant exportiertes Referenzprofil liegt unter tests/fixtures/ipsview-assistant-style-profile-v1.json. Der Ende-zu-Ende-Test prüft, dass dieses Profil über den tatsächlich vendorten Style-Helper aufgelöst wird und danach weiterhin verlustfrei als kanonisches Style Profile V1 validiert und serialisiert werden kann.

Kalender- und Terminfarben bleiben von der globalen Stilquelle unabhängig. Die Stilquelle steuert das gemeinsame Erscheinungsbild der View – Hintergründe, Bedienelemente, Texte, Rahmen, Popups, Schatten und semantische Statusfarben – aber nicht die fachlichen Farben der einzelnen Kalender.

Agenda, Listen-, Tage-, Wochen- und Monatsansicht funktionieren direkt in der IPSView-HTML-Box. In beschreibbaren Kalendern lassen sich dort außerdem Termine erstellen, bearbeiten, zwischen beschreibbaren Kalendern verschieben und löschen. Die kompakte Schaltfläche + Termin bleibt sichtbar, ist ohne beschreibbaren Kalender jedoch deaktiviert.

Wird die IPSView-Ausgabe später deaktiviert, bleibt die vorhandene Variable mit ihrer Objekt-ID, Position und bestehenden Verknüpfungen erhalten, wird aber nicht mehr aktualisiert. In der Instanz erscheint dann eine eigene Löschaktion. Erst nach ausdrücklicher Bestätigung wird die Variable entfernt.

IPSView-Verbindung absichern

IPSView stellt die Symcon-HTML-SDK-Funktion requestAction() nicht bereit. OpenCalendar verwendet deshalb eine instanzbezogene WebHook-Brücke mit einem zufälligen, persistent gespeicherten Zugriffstoken. Akzeptiert werden nur die benötigten Aktionen zum Laden, Synchronisieren und Bearbeiten von Terminen per POST.

Das Token ist Bestandteil der erzeugten WebContent-Seite und sollte wie die IPSView-/Symcon-Verbindung geschützt werden. Für Zugriffe außerhalb des eigenen Netzes sollte ausschließlich HTTPS oder Symcon Connect verwendet werden.

Die IPSView-Option Seite skalieren wird laut IPSView-Hersteller nur von mobilen Clients unterstützt und hat unter Windows keine Wirkung. Schriftgröße und Stilskalierung werden deshalb direkt auf den Kalenderinhalt angewendet.

Fehlerbehebung

Problem Prüfung
Keine Termine sichtbar Kalenderauswahl, Aktivierung, Zeitraum und letzte Synchronisation der Kalender-Instanzen prüfen
Synchronisation schlägt fehl Jede ausgewählte Kalender-Instanz einzeln synchronisieren und anschließend das zugehörige Kalender Konto testen
Schaltfläche „+ Termin“ ist deaktiviert Mindestens einen ausgewählten Kalender mit Schreibrechten verwenden; ICS/Webcal ist immer schreibgeschützt
IPSView zeigt nur statisches oder unvollständiges HTML Im IPSView-Steuerelement Browser des Clients oder Automatisch als Renderer wählen
IPSView-Inhalt ist veraltet IPSView-HTML neu generieren ausführen und prüfen, ob die Ausgabe aktiviert ist
IPSView-Stil zeigt andere Werte als erwartet Prüfen, welche Stilquelle aktiv ist. Bei einer Vorgabe zeigen die Felder die wirksamen Werte schreibgeschützt; eigene Änderungen sind erst nach In benutzerdefinierten Stil übernehmen möglich. Bei einem einzelnen nativen Farbfeld zusätzlich prüfen, ob Abweichend aktiv ist oder das Feld noch dem geerbten semantischen Wert folgt
Kalenderauswahl ist leer oder unvollständig Alle Kalenderinstanzen auswählen verwenden, die gewünschte Auswahl anpassen und anschließend Übernehmen

PHP-Befehlsreferenz

In den folgenden Beispielen ist 12345 die Instanz-ID der Kalender Ansicht. Bei allen Funktionen mit einem optionalen Parameter CalendarInstanceID wird der Wert 0 bewusst mit angegeben: 0 berücksichtigt alle in dieser Kalender Ansicht ausgewählten Kalender. Eine konkrete Kalender-Instanz-ID, beispielsweise 23456, beschränkt die Abfrage auf genau diesen ausgewählten Kalender.

Der Modul-Prefix lautet IPSKALVIEW. Die folgenden Befehle bilden die offiziell unterstützte Skript-API der Kalender Ansicht. Symcon-Lebenszyklusmethoden und interne Visualisierungs-Callbacks wie Create(), ApplyChanges(), RequestAction() oder Initialize() gehören nicht zu dieser Befehlsreferenz.

// Alle ausgewählten Kalender synchronisieren.
$success = IPSKALVIEW_SynchronizeCalendars(12345);

// Im geöffneten Konfigurationsformular alle Kalenderinstanzen zur Auswahl vorbereiten.
// Anschließend muss die Konfiguration mit „Übernehmen“ gespeichert werden.
$success = IPSKALVIEW_SelectAllCalendars(12345);

// Den kompletten aggregierten Visualisierungszustand als JSON abrufen.
// Enthalten sind events, calendars, eventRange und settings.
$state = IPSKALVIEW_GetAggregatedEvents(12345);

// Alle Termine eines lokalen Kalendertags providerübergreifend abrufen.
$appointments = IPSKALVIEW_GetDayAppointments(12345, '2026-08-11', 0);

// Optional nur Termine einer ausgewählten Kalenderinstanz (z. B. ID 23456).
$appointments = IPSKALVIEW_GetDayAppointments(12345, '2026-08-11', 23456);

// Alle Termine eines inklusiven lokalen Datumsbereichs providerübergreifend abrufen.
$appointments = IPSKALVIEW_GetAppointments(12345, '2026-08-11', '2026-08-17', 0);

// Auch die vollständige Bereichsabfrage kann nach Kalenderinstanz gefiltert werden.
$appointments = IPSKALVIEW_GetAppointments(12345, '2026-08-11', '2026-08-17', 23456);

// Kompakte Tagesliste: summary, start, end, startTime, endTime, hasReminder und calendarName.
$appointments = IPSKALVIEW_GetDayAppointmentsCompact(12345, '2026-08-11', 0);

// Optional nur Termine einer ausgewählten Kalenderinstanz (z. B. ID 23456).
$appointments = IPSKALVIEW_GetDayAppointmentsCompact(12345, '2026-08-11', 23456);

// Kompakte Terminliste für einen inklusiven Datumsbereich.
$appointments = IPSKALVIEW_GetAppointmentsCompact(12345, '2026-08-11', '2026-08-17', 0);

// Auch beim Datumsbereich kann optional nach Kalenderinstanz gefiltert werden.
$appointments = IPSKALVIEW_GetAppointmentsCompact(12345, '2026-08-11', '2026-08-17', 23456);

// Anzahl der Termine eines Tages oder Datumsbereichs ermitteln.
$count = IPSKALVIEW_GetDayAppointmentCount(12345, '2026-08-11', 0);
$count = IPSKALVIEW_GetAppointmentCount(12345, '2026-08-11', '2026-08-17', 0);

// Optional kann auch bei den Zählfunktionen nach Kalenderinstanz gefiltert werden.
$count = IPSKALVIEW_GetDayAppointmentCount(12345, '2026-08-11', 23456);

// Alle heute noch laufenden oder bevorstehenden Termine abrufen bzw. zählen.
$appointments = IPSKALVIEW_GetRemainingDayAppointments(12345, 0);
$count = IPSKALVIEW_GetRemainingDayAppointmentCount(12345, 0);

// Den nächsten noch nicht begonnenen Termin abrufen.
$appointment = IPSKALVIEW_GetNextAppointment(12345, 0);

// Alle aktuell laufenden Termine abrufen oder direkt zählen.
$appointments = IPSKALVIEW_GetCurrentAppointments(12345, 0);
$count = IPSKALVIEW_GetCurrentAppointmentCount(12345, 0);

// Alle Termine abrufen bzw. zählen, die innerhalb der nächsten 24 Stunden beginnen.
$appointments = IPSKALVIEW_GetUpcomingAppointments(12345, 24, 0);
$count = IPSKALVIEW_GetUpcomingAppointmentCount(12345, 24, 0);

// Dieselbe 24-Stunden-Abfrage in der kompakten Darstellung.
$appointments = IPSKALVIEW_GetUpcomingAppointmentsCompact(12345, 24, 0);

// Die nächsten drei noch nicht begonnenen Termine abrufen.
$appointments = IPSKALVIEW_GetNextAppointments(12345, 3, 0);

// Die nächsten drei Termine in der kompakten Darstellung abrufen.
$appointments = IPSKALVIEW_GetNextAppointmentsCompact(12345, 3, 0);

// Alle Jahresereignisse aus allen ausgewählten Kalendern.
$annualEvents = IPSKALVIEW_GetAnniversaryList(12345, 0, 0, '');

// Nur Hochzeitstage der nächsten frei gewählten 90 Tage.
$weddings = IPSKALVIEW_GetAnniversaryList(12345, 0, 90, 'wedding');

// Nur Todestage aus Kalenderinstanz 23456, ohne Zeitbegrenzung.
$deathAnniversaries = IPSKALVIEW_GetAnniversaryList(12345, 23456, 0, 'death');

// Die kompatible Geburtstagsfunktion bleibt erhalten.
$birthdays = IPSKALVIEW_GetBirthdayList(12345, 0, 45);

// Alle exakt bestimmbaren Reminder eines lokalen Kalendertags abrufen.
$reminders = IPSKALVIEW_GetDayReminders(12345, '2026-08-11', 0);

// Reminder eines inklusiven lokalen Datumsbereichs abrufen.
// Der Zeitraum bezieht sich auf den Reminder-Zeitpunkt, nicht auf den Terminbeginn.
$reminders = IPSKALVIEW_GetReminders(12345, '2026-08-11', '2026-08-17', 0);

// Reminder abrufen, die innerhalb der nächsten 30 Minuten fällig werden.
$reminders = IPSKALVIEW_GetUpcomingReminders(12345, 30, 0);

// Den nächsten noch nicht ausgelösten Reminder abrufen.
$reminder = IPSKALVIEW_GetNextReminder(12345, 0);

// Reminder abrufen, die in den letzten zwei Minuten fällig wurden.
// reminderId kann im aufrufenden Skript zur Duplikaterkennung gespeichert werden.
$reminders = IPSKALVIEW_GetDueReminders(12345, 2, 0);

// Alle Reminder-Funktionen können optional auf eine ausgewählte Kalenderinstanz gefiltert werden.
$reminders = IPSKALVIEW_GetUpcomingReminders(12345, 30, 23456);

// Metadaten aller in dieser Ansicht ausgewählten Kalender abrufen.
$calendars = IPSKALVIEW_GetSelectedCalendars(12345);

// Den aktuellen eigenständigen HTML-Inhalt für IPSView abrufen.
$html = IPSKALVIEW_GetIPSViewHTML(12345);

// Die vorhandene IPSView-WebContent-Variable unter Beibehaltung ihrer Objekt-ID neu rendern.
$success = IPSKALVIEW_RegenerateIPSViewHTML(12345);

GetAggregatedEvents() behält seinen Namen aus Kompatibilitätsgründen. Die Funktion liefert keinen nackten Termin-Array, sondern den vollständigen initialen Visualisierungszustand mit events, calendars, eventRange und settings. Für gezielte Skriptabfragen sind die Termin-, Zähl-, Jahresereignis- und Reminder-Funktionen darunter die stabilere Schnittstelle.

GetDayAppointments() und GetAppointments() verwenden ausschließlich die in dieser Kalender Ansicht ausgewählten Kalender und führen deren lokal zwischengespeicherte Termine providerübergreifend zusammen. Der Bereich wird unabhängig von den Visualisierungseinstellungen Vergangene Tage, Zukünftige Tage und Maximale Termine abgefragt. Verfügbar sind dabei die Termine, die die jeweiligen Kalender-Instanzen bereits in ihrem eigenen Synchronisationszeitraum gecached haben. GetAppointments() behandelt das angegebene Enddatum inklusiv. Ganztagstermine berücksichtigen weiterhin das providerseitig exklusive Enddatum korrekt. Jeder Eintrag enthält zusätzlich calendarInstanceId, calendarName, calendarColor und canWrite. Als letztes optionales Argument kann bei beiden Funktionen die Instanz-ID eines ausgewählten Kalenders angegeben werden. Der Standardwert 0 liefert alle ausgewählten Kalender.

Die Funktionen liefern JSON. Beispiel:

$appointments = json_decode(
    IPSKALVIEW_GetDayAppointments(12345, date('Y-m-d'), 0),
    true,
    512,
    JSON_THROW_ON_ERROR
);

Für einfache Skripte stehen zusätzlich GetDayAppointmentsCompact(), GetAppointmentsCompact(), GetUpcomingAppointmentsCompact() und GetNextAppointmentsCompact() bereit. Sie verwenden dieselben Auswahl-, Zeitfenster- und Mengenregeln wie ihre vollständigen Gegenstücke, liefern pro Termin aber ausschließlich summary, start, end, startTime, endTime, hasReminder und calendarName. start und end sind dabei immer lokale Datumswerte im Format YYYY-MM-DD. Bei zeitgebundenen Terminen enthalten startTime und endTime die lokale Uhrzeit im Format HH:MM. Ganztagstermine liefern die lokalisierte Bezeichnung Ganztägig/All day als startTime, einen leeren endTime-Wert und in end das sichtbare inklusive Enddatum statt der providerseitig technischen exklusiven Endgrenze. hasReminder ist ein boolescher Wert und zeigt an, ob für den Termin eine wirksame Erinnerung konfiguriert ist; dabei werden auch aktive Kalender-Standarderinnerungen und komplexe Provider-Erinnerungen berücksichtigt. calendarName enthält immer den Namen des Quellkalenders und ist insbesondere bei CalendarInstanceID = 0 zur Zuordnung zusammengeführter Termine gedacht. Als letztes optionales Argument kann bei allen Compact-Funktionen die Instanz-ID eines in dieser Kalender Ansicht ausgewählten Kalenders angegeben werden. 0 liefert alle ausgewählten Kalender. Eine konkrete ID filtert ausschließlich auf diesen Kalender; eine nicht ausgewählte oder unbekannte ID liefert ein leeres JSON-Array.

Für typische Symcon-Skripte stehen zusätzlich Komfortfunktionen zur Verfügung. GetDayAppointmentCount() und GetAppointmentCount() liefern direkt eine Zahl, ohne dass die Terminliste zuvor in PHP dekodiert werden muss. Beide akzeptieren optional eine ausgewählte Kalenderinstanz als Filter.

GetRemainingDayAppointments() liefert alle Termine des heutigen Tages, die zum Abfragezeitpunkt noch nicht beendet sind. Laufende und ganztägige Termine werden dabei mit berücksichtigt. GetRemainingDayAppointmentCount() liefert für dieselbe Auswahl direkt die Anzahl. Auch diese beiden Funktionen können optional auf eine ausgewählte Kalenderinstanz eingeschränkt werden.

GetCurrentAppointments() liefert ausschließlich Termine, die gerade laufen. GetCurrentAppointmentCount() liefert für dieselbe Auswahl direkt die Anzahl. GetNextAppointment() ist bewusst davon getrennt und liefert den nächsten noch nicht begonnenen Termin aus dem lokal synchronisierten Zukunftsbestand. Ist kein kommender Termin im Cache vorhanden, wird JSON null zurückgegeben. GetNextAppointments() liefert entsprechend die nächsten 1 bis 1000 noch nicht begonnenen Termine als Liste. GetNextAppointmentsCompact() verwendet dieselbe Auswahl und Mengenbegrenzung, reduziert die Einträge jedoch auf die oben beschriebene kompakte Darstellung. Alle Funktionen unterstützen den optionalen Kalenderfilter.

GetUpcomingAppointments() liefert Termine, die innerhalb der angegebenen nächsten Stunden beginnen. Bereits laufende Termine werden bewusst nicht berücksichtigt und können über GetCurrentAppointments() abgefragt werden. Das Zeitfenster darf 1 bis 26280 Stunden betragen und kann über Mitternacht sowie mehrere Kalendertage reichen. GetUpcomingAppointmentsCompact() verwendet exakt dasselbe Zeitfenster und liefert die kompakte Darstellung. GetUpcomingAppointmentCount() liefert für dieselbe Auswahl direkt die Anzahl. Alle drei Funktionen unterstützen den optionalen Kalenderfilter.

GetAnniversaryList() liefert die von OpenCalendar verwalteten Jahresereignisse unabhängig vom normalen Synchronisationszeitraum der Terminansicht. Das erste optionale Argument ist die Kalenderinstanz: 0 berücksichtigt alle in dieser Kalender Ansicht ausgewählten Kalender, eine konkrete Instanz-ID nur diesen Kalender. Das zweite optionale Argument ist die frei wählbare Anzahl der nächsten Tage. 0 liefert alle hinterlegten Jahresereignisse, jeder positive Wert filtert auf Einträge, deren nächstes Vorkommnis innerhalb dieses Zeitraums liegt. Das dritte optionale Argument filtert auf birthday, anniversary, wedding oder death; ein leerer Wert liefert alle Typen. Pro Eintrag werden name, anniversaryType, anniversaryDate, nextDate, years, displayName, daysUntil, calendarInstanceId, calendarName und calendarColor geliefert. Geburtstage enthalten zusätzlich birthDate, nextBirthday und age. GetBirthdayList() bleibt als kompatibler Spezialfall für Geburtstage erhalten.

Für Reminder stehen fünf providerübergreifende Lesefunktionen bereit. GetDayReminders() und GetReminders() liefern alle Erinnerungen, deren effektiver Reminder-Zeitpunkt auf den angegebenen Tag bzw. in den inklusiven Datumsbereich fällt. Der Termin selbst kann dabei später beginnen. GetUpcomingReminders() liefert Erinnerungen, die innerhalb der nächsten angegebenen Minuten fällig werden. GetNextReminder() liefert den nächsten exakt bestimmbaren Reminder oder JSON null. GetDueReminders() ist für zyklische Skripte gedacht und liefert ausschließlich Reminder, die innerhalb der angegebenen Toleranz bereits fällig geworden sind; zukünftige Reminder werden dabei nicht vorzeitig ausgegeben.

Jeder Reminder-Eintrag enthält reminderId, summary, calendarInstanceId, calendarName, calendarColor, start, startTimestamp, allDay, location, reminderMode, minutesBeforeStart, reminderTimestamp, reminderDateTime, reminderIndex und reminderCount. Ein Termin mit mehreren Erinnerungen erzeugt für jeden exakt bestimmbaren Auslösezeitpunkt einen eigenen API-Eintrag. Die Einträge tragen dabei reminderMode = multiple; bei einem Kalenderstandard bleibt der Modus default, auch wenn dieser mehrere konkrete Auslösezeitpunkte enthält. reminderId bleibt bei unverändertem Termin und Reminder stabil und kann vom aufrufenden Skript gespeichert werden, um bei überlappenden zyklischen Abfragen eine doppelte Verarbeitung zu vermeiden. Deaktivierte Reminder sowie komplexe Provider-Konfigurationen, für die OpenCalendar keine exakten providerneutralen Auslösezeitpunkte bestimmen kann, werden bewusst nicht erfunden und daher von diesen Reminder-APIs ausgelassen. Alle fünf Funktionen unterstützen den optionalen Kalenderfilter.

GetSelectedCalendars() liefert die in der Instanz ausgewählten und aktivierten Kalender als JSON. Neben instanceId, name, color, canWrite, timezone, den Serientermin-Fähigkeiten und maxReminders enthält jeder Eintrag zusätzlich provider, lastSynchronization, status und lastError. provider ist ein stabiler Schlüssel mit apple, caldav, google, microsoft, ics oder unknown. lastSynchronization ist der Unix-Zeitstempel der letzten erfolgreichen Synchronisation und bleibt 0, solange noch keine erfolgreiche Synchronisation stattgefunden hat. status enthält den numerischen Symcon-Instanzstatus; lastError ist leer, wenn kein letzter Synchronisationsfehler gespeichert ist. Der nur im Browser gesetzte temporäre Kalenderfilter verändert diese konfigurierte Auswahl nicht.

SelectAllCalendars() trägt alle vorhandenen Kalender-Instanzen ausschließlich in das aktuell geöffnete Konfigurationsformular ein und aktiviert sie dort. Eine bereits im Formular vorhandene individuelle Auswahl wird ersetzt. Die Auswahl wird erst durch Übernehmen dauerhaft gespeichert. Die Funktion liefert false, wenn keine Kalender-Instanz vorhanden ist.

RegenerateIPSViewHTML() rendert den Inhalt der bestehenden IPSView-WebContent-Variable neu, ohne deren Objekt-ID, Position oder bestehende Verknüpfungen zu verändern. Die Funktion liefert false, wenn die IPSView-HTML-Ausgabe deaktiviert ist oder der Inhalt nicht aktualisiert werden konnte.

Technische Hinweise

Kachel und IPSView-Seite werden aus derselben Asset-Struktur unter visualization/ erzeugt. Die vendorten Helper VisualizationThemeHelper, IPSViewFontCatalogHelper, IPSViewStylePresetHelper, IPSViewStyleProfileHelper, IPSViewStyleHelper und IPSViewHTMLPageHelper sorgen für gemeinsame Symcon-Designvariablen, Schriftkatalog, Presets, Style-Profile, IPSView-Stilrollen und die kontrollierte Verwaltung der WebContent-Variable. IPSViewControlThemeHelper und IPSViewStyleConfigurationHelper ergänzen den vollständigen nativen 109-Farben-Katalog samt Vererbung und gezielten Overrides. Kalender- und Terminfarben bleiben davon unabhängige fachliche Inhaltsfarben.

Tagesübersicht der Kalenderansichten

In der Monatsansicht öffnet ein Klick auf die Tageszahl oder einen freien Bereich der Tageszelle die Tagesübersicht; der Hinweis + weitere bleibt ebenfalls direkt anklickbar. In der Tage-, Wochen- und Arbeitswochenansicht öffnet ein Klick auf einen freien Bereich des jeweiligen Tages dieselbe Tagesübersicht. In der Agenda öffnet die Tagesüberschrift die gleiche Übersicht und ist auch per Tastatur mit Eingabe- oder Leertaste bedienbar. Die Übersicht zeigt alle Termine des Tages, ganztägige zuerst und anschließend zeitgebundene chronologisch, sowie die Terminanzahl. Ein Klick auf einen Termin öffnet zunächst die Termindetail-Ansicht. Von dort kann ein schreibbarer Einzeltermin gezielt bearbeitet werden. Ist mindestens ein beschreibbarer Kalender verfügbar, kann über Termin an diesem Tag erstellen direkt ein neuer Termin für den ausgewählten Tag angelegt werden. Für einen zukünftigen ausgewählten Tag wird 09:00 Uhr vorgeschlagen; für den heutigen Tag wird nach Möglichkeit die nächste volle Stunde verwendet. Kurz vor Mitternacht bleibt der Start am aktuellen Tag, statt auf eine bereits vergangene Uhrzeit zurückzufallen. Der zusätzliche Floating-Button zum Erstellen eines Termins bleibt in Agenda und Liste als direkter Schnellzugriff sichtbar.