Änderungsprotokoll¶
Änderungen, die in Apps auf Basis von Coworkee Handlungsbedarf auslösen. Neueste zuerst.
0.0.1.33 (2026-10-17)¶
Breaking Changes¶
- Migration nötig: ein gefilterter eindeutiger Index
IX_Themes_Nameaufcw.Themes(eingebaute Themes,TenantIdnull) und die Spaltecw.ChatAttachments.ThumbnailKey. Der Index verhindert, dass zwei App-Instanzen die eingebauten Themes auf SQL Server und SQLite doppelt anlegen (Postgres lehnte das schon ab); der Seed räumt solche Doppel nicht mehr auf. Meldet die Migration einen doppelten Schlüssel, lösch zuerst die überzählige eingebaute Zeile. - Wiederherstellen aus dem Verlauf prüft seine Vorschau:
EntityHistoryPreviewDto.VersionundEntityHistoryRestoreRequest.Versionsind neu;POST /api/v1/history/{set}/{id}/restoreantwortet409, wenn die Version fehlt oder sich der Datensatz seit der Vorschau geändert hat. Verlaufsdialog, Rückgängig im Audit-Log und das AirWorks-Datensatzfenster zeigen dann die neue Vorschau. EigeneIEntityHistoryApi-Implementierungen und direkte API-Aufrufe geben die Version weiter; OpenAPI-Snapshots und SDKs neu erzeugen. Siehe Auditing. Coworkee.Chathängt vonCoworkee.BackgroundJobsab und bringt SkiaSharp (MIT) mit seinen nativen Linux-Bibliotheken für die Vorschaubilder.
Neu¶
coworkee updatefügt einzelne Zeilen selbst ein (Regelartinsertionsinupgrade-rules.json: nach der ersten Zeile, die zu einem Muster passt, mit deren Einrückung, übersprungen, wo die Zeile schon steht;--dry-runlistet sie nur). Der Schritt von 0.0.1.32 (builder.ConfigureContainer(new DefaultServiceProviderFactory());insrc/*.Migrations/Program.cs) passiert jetzt automatisch.- Neue Apps haben eine
AGENTS.mdmit den Regeln für Coding-Agenten (Aufbau, Pflichtmuster, Fallstricke, Migrationen, Tests, CLI und MCP) und eineCLAUDE.md, die sie einbindet. Bestehende Apps übernehmen sie aus einer neuen App mit denselben Optionen. - AirWorks: Der Theme- und der Mail-Vorlagen-Editor der Verwaltung sind die Seiten der Web-App in einem Fenster, wenn die BFF die Web-App kennt (
embedOr), die TypeScript-Editoren bleiben der Ersatz; Workflow-Designer öffnet Elsa Studio in einem Browser-Tab (Workflows.Elsa.Manage); das Datensatzfenster hat In der Web-App öffnen (die Seite des Treffers der globalen Suche). Neuer TextschlüsselOpen in the web app. Coworkee:Auth:FrameAncestors: Origins, die die Kontoseiten des Auth-Servers einrahmen dürfen (Standard: keine), damit ein AirWorks-Fenster die Anmeldeseite einer eingebetteten Webseite zeigen kann. Nur auf derselben Site; siehe AirWorks.app.UseCoworkeeSecurityHeaders()(Coworkee.Bff) schickt eine Content-Security-Policy für den Blazor-WebAssembly-Client (frame-ancestors ausCoworkee:Bff:FrameAncestors, MudEx-Dateivorschauen aus blob- und data-URLs, Hot Reload in Development),nosniffund eine Referrer-Policy; weitere Quellen pro Direktive oder eine eigene Policy überCoworkee:Bff:SecurityHeaders. Der Web-Host der Vorlage nutzt es; bestehende Apps ergänzen es vorUseStaticFilesund entfernen eine selbst geschriebene Policy. Apps mit der Cloud-Auswahl des Files-Moduls ergänzen deren Hosts. Siehe Sicherheits-Header der Web-App.Coworkee:Bff:MaxRequestBodySizebegrenzt, was der Web-Host an die API weiterleitet; ohne den Wert haben seine weitergeleiteten Routen keine Grenze und die API prüft ihre eigene. Ein selbst geschriebenesConfigureKestrel(k => k.Limits.MaxRequestBodySize = ...)im Web- oder AirWorks-Host ist unnötig und kann weg.builder.AddCoworkeeMigrations<TDbContext>(...)undhost.RunCoworkeeMigrationsAsync()(Coworkee.Identity.Setup) sind der Migrations-Host: migrieren mit Wiederholungen (Migrations:Attempts), die Entwicklungsbenutzer oder den ersten Administrator eines Deployments seeden, die Entwicklungsbenutzer im Stand halten, Keycloak abgleichen, dazu die Container-Korrektur von 0.0.1.32. Die Vorlage nutzt es; bestehende Apps ersetzen damit ihre selbst geschriebenesrc/*.Migrations/Program.cs, damit spätere Korrekturen mit dem Paket kommen (coworkee updateweist darauf hin). Siehe Migrationen und Seed.- Chat-Bilder bekommen ein kleines WebP, das der Server erzeugt (höchstens 480 px, aufrecht gedreht,
GET /api/v1/chat/attachments/{id}/thumbnail,ChatAttachmentDto.HasThumbnail); die Nachrichtenliste zeigt es, ein Klick öffnet die ganze Datei. - Jede Chat-Datei öffnet sich im MudEx-Datei-Viewer (
MudExFileDisplay), auch ein Upload vor dem Senden. Die Regel für eigene Seiten steht unter Dateien. - Die Policy von
UseCoworkeeSecurityHeaderserlaubt die CDNs, von denen der Datei-Viewer seine Viewer lädt (Coworkee:Bff:SecurityHeaders:FileViewerCdns: jsDelivr, esm.sh, unpkg), inscript-src,style-srcundconnect-src, damit Word, Excel, Karten und die anderen Viewer ohne weiteres Zutun gehen; leere die Liste für eine Policy ohne Fremd-Skript. Siehe Sicherheits-Header der Web-App. - In einen Chat hochgeladene, aber nie gesendete Dateien werden nach
Coworkee:Chat:UnsentAttachmentLifetimegelöscht (Standard 24 Stunden, ein stündlicher Job).
Korrekturen¶
- Die SDK-Seite beschrieb ein
sdk/openapi.jsonmit Snapshot-Test und einen Client insdk/typescript, die das Template nie hatte; sie zeigt beides jetzt als Rezept für Apps, die es brauchen. npm run buildvon@coworkee/clientund@coworkee/airworksleert zuerstdist, damit Pakete keine Dateien entfernter Quellen mehr mitnehmen.- Die eingebauten Themes Coworkee, Forest und Sunset erreichen WCAG AA beim Button-Text im hellen Modus (etwas dunklere Primär- oder Sekundärfarbe); der Kontrasttest prüft jedes eingebaute Theme.
- Der Datei-Viewer gibt eine private Datei nie an den Online-Office-Viewer von Microsoft.
- Dateien, die der Web-Host weiterleitet, behalten ihre eigene Sandbox-Policy:
UseCoworkeeSecurityHeaderssetzt die App-Policy nur bei Antworten ohne eigene (vorher trugen weitergeleitete Dateien beide). - Die Inhalts-Endpunkte von Dateien, öffentlichen Dateien, Chat-Dateien und Vorschaubildern beantworten
HEAD, das der Bild-Viewer zuerst schickt (bisher 405).
0.0.1.32 (2026-10-17)¶
Korrekturen¶
- Die Migrationen eines lokalen Laufs stürzten seit 0.0.1.31 beim Start ab: Sie laufen als Development, und dessen Prüfung der Dienste scheitert an den MVC-Diensten von OData in einem Host ohne Web-Umgebung. Die Vorlage baut den Container der Migrationen mit den Produktions-Standards; bestehende Apps ergänzen
builder.ConfigureContainer(new DefaultServiceProviderFactory());nachHost.CreateApplicationBuilder(args)insrc/*.Migrations/Program.cs(coworkee updateweist darauf hin).
0.0.1.31 (2026-10-17)¶
Breaking Changes¶
- Migration nötig (Apps mit Chat): Direkt- und Gruppenchats bringen die Tabellen
cw.ChatConversations,cw.ChatMembers,cw.ChatReactions,cw.ChatAttachmentsund neue Spalten voncw.ChatMessages. Frühere Direktnachrichten wandern beim nächsten Start in Unterhaltungen; Gelesenes bleibt gelesen. Coworkee.Chathängt vonCoworkee.Storageab (Anhänge) und referenziertCoworkee.Notifications(Benachrichtigungen bei Erwähnungen, wenn das Modul da ist).- Chat-Verträge:
ChatMessageDto.ToUserIdist nullable (leer in Gruppen), das DTO hat neue Eigenschaften (ConversationId,Html,Source,EditedAt,Deleted,ReplyTo,Reactions,Attachments,HasEntityMentions);ChatReadDtohatConversationId.IChatApihat die Mitglieder für Unterhaltungen dazubekommen; eigene Implementierungen ergänzen sie. Neue Endpunkte unter/api/v1/chat/chats,/messagesund/attachments: OpenAPI-Snapshots und SDKs neu erzeugen. Die Klartext-Endpunkte pro Person bleiben. UserAvataröffnet ein Menü mit Chat und Profil für andere Personen, wenn der Benutzer chatten darf (OfferChat, Standardtrue); setzeOfferChat="false", wo der Avatar in etwas sitzt, das auf Klicks reagiert. Neue Bibliotheksseitepersonunter/people/{id}.
Neu¶
- Acht weitere eingebaute Themes, jeweils mit heller und dunkler Palette, eigener Schrift, Radius und Optionen: Octo, Code, Arctic, Vampire, Solar, Atom, Paper und Aubergine (CLI/Spec
theme, Template, Studio-Galerie). Ihr Text erfüllt den Kontrast nach WCAG AA. Siehe Theming. - Das Setup-Token ist bei einem lokalen Lauf leicht zu finden: Der AppHost gibt allen Diensten dasselbe Token und zeigt es, solange das System nicht eingerichtet ist, in seiner Konsole (
coworkee run), im Log der API und im Aspire-Dashboard (Link Setup mit Token an der Web-Ressource, Eigenschaft Setup token an der API). Coworkee Studio zeigt es mit Kopier-Knopf in der Lauf-Karte und unter Meine Apps;coworkee deploynennt<APP>_SETUP_TOKEN, wenn kein Administrator gesetzt ist./setup?token=...füllt das Token ein. Siehe Setup-Assistent oder Seed. @coworkee/airworks: Eingang (coworkee.inbox, Genehmigungen und Benachrichtigungen) ersetztnotificationsApp; Datensätze mit einem Datensatzfenster (coworkee.record: Felder, Verlauf mit Rückgängig und Wiederherstellen, Workflow); das Profil ist der erste Tab der Einstellungen (profileAppentfällt,renderProfilebleibt); die API-Dokumentation liegt in der Administration (Überwachung). Apps, dienotificationsApp,profileAppoderapiDocsAppeinzeln registriert haben, nehmendefaultAppsoder die neuen Namen.- Seiten der Web-App in AirWorks-Fenstern:
embedApp,openWebPage;CoworkeeLayoutzeigt mit?embed=1nur die Seite.BffOptions.WebAppUrl(alsappUrlvon/bff/user) undBffOptions.FrameAncestors(diese Origins dürfen die Seiten einrahmen; dasX-Frame-Optionsdes Antiforgery entfällt dann);AddAirWorkssetzt beides unter Aspire. - Badges auf den Kacheln von Eingang und Chat mit
setBadgevon AirWorks (AirWorks 0.5; ältere Versionen zeigen keine). - Chat: Gruppenchats (Name, Personen hinzufügen und entfernen, austreten), formatierte Nachrichten mit dem Rich-Text-Editor (Enter sendet),
@-Erwähnungen von Personen (Link auf die Person, Benachrichtigung für Mitglieder des Chats) und#-Erwähnungen von Datensätzen aus der globalen Suche (nur für Leser sichtbar, deren Suche sie findet, sonst eingeschränkt), Antworten, Emoji-Reaktionen, eigene Nachrichten bearbeiten und löschen, Dateien und Bilder per Button, Drag-and-drop oder Einfügen mit Upload-Fortschritt (nur für Mitglieder, EinstellungChat.MaxAttachmentMb, ErweiterungIChatAttachmentScanner), Lesebestätigungen pro Leser, Tipp-Anzeige und Suche im Chat. Der Server bereinigt jede Nachricht. Siehe Chat. - Mini-Chats: ein Dock unten rechts mit bis zu drei einklappbaren Chatfenstern (ungelesene Nachrichten im minimierten Zustand, Im Chat öffnen, pro Benutzer über ein Neuladen hinweg gemerkt, auf dem Handy bildschirmfüllend). Sie öffnen sich von der Chatseite, der Befehlspalette (Chatten mit…,
@name), jedem Avatar, der Personenseite, der Snackbar einer neuen Nachricht und Erwähnungs-Benachrichtigungen.ChatDocköffnet sie aus eigenen Komponenten. RichTextEditornimmtTools(Werkzeugleiste) undPlaceholder.
Korrekturen¶
- Eine neue App zeigte lokal ihre Setup-Seite, statt mit den Entwicklungsbenutzern anzumelden: Das Migrationsprojekt hat kein Launch-Profil und lief als Production, also fiel
DemoSeedweg.AddMigrationsgibt den Migrationen eines lokalen Laufs die Umgebung des AppHosts mit (DOTNET_ENVIRONMENT). - Die Setup-Seite eines bereits eingerichteten Systems führt zur App; ein offener Setup-Tab wechselt zur App, sobald er wieder den Fokus bekommt oder ein anderer Tab das Setup abschließt.
- Eingebaute Themes standen doppelt in der Liste, wenn Anfragen sie gleichzeitig anlegten (SQL Server und SQLite lassen im eindeutigen Index leere Mandanten mehrfach zu). Das Anlegen läuft pro Prozess nur einmal gleichzeitig und entfernt solche Kopien (die Kopie, die eine Organisation nutzt, bleibt).
0.0.1.30 (2026-10-16)¶
Neu¶
- Das Audit-Log macht Änderungen von Entity-Sets mit
AddEntityHistoryrückgängig: pro Eintrag Diese Änderung rückgängig machen, Stand vor dieser Änderung wiederherstellen, Datensatz wiederherstellen (Soft Delete) und Verlauf des Datensatzes öffnen, über die Vorschau und das Wiederherstellen des Verlaufs.EntityHistoryRestoreRequesthat einenMode(After,Before,Undo), die Vorschau markiert Felder, die ein späterer Eintrag geändert hat (ChangedLater), undGET /api/v1/historylistet die lesbaren Sets.IEntityHistoryApihatGetSetsAsync(eigene Implementierungen ergänzen es).
0.0.1.29 (2026-10-16)¶
Neu¶
- Workflow-Zustand als Filter auf dem Server: Jede OData-Menge, deren Entität einen Workflow hat, bekommt die virtuellen Eigenschaften
WorkflowStateundWorkflowAwaitsMefür$filterund$orderby(eine nach Mandant gefilterte Unterabfrage oder dieMirrorTo-Spalte) und eine FacetteWorkflowStatemit den Zuständen der Definition und Wartet auf meine Genehmigung; beide brauchenWorkflows.View.CoworkeeWorkflowColumnfürCoworkeeDataTablefiltert, sortiert und gruppiert danach;WorkflowState<T>.WithColor(...)färbt einen Zustand. ErsetzeTemplateColumn+CoworkeeWorkflowActionsdurch<CoworkeeWorkflowColumn T="..." EntityType="..." />. - OData-Mengen können berechnete Eigenschaften anderer Module tragen (
IODataComputedPropertySource,ODataComputedProperty): in$filter/$orderbygebunden, nie serialisiert, optional mit Facette. Die OData-Route konfiguriert jetzt die Bibliothek selbst statt NextendedsAddODataAuto.
Korrekturen¶
SyncDevelopmentUsersAsync()läuft für die Migrationen eines lokalen Aspire-Laufs: Das Migrationsprojekt hat kein Startprofil und lief als Production, dort fand der Abgleich nie statt.AddMigrationssetzt in lokalen EntwicklungsläufenCoworkee:Identity:SyncDevelopmentUsers; der Abgleich läuft in Development oder mit dieser Einstellung.SyncDevelopmentUsersAsync()gibt Seed-Benutzern auch die seitdem im Seed ergänzten Rollen und Seed-Rollen die ergänzten Berechtigungen (nur in Development, entfernt wird nichts); so bekommt eine früher eingerichtete Datenbank z. B. eine neue Rolle eines Demo-Benutzers und neue Workflow-Berechtigungen einer Demo-Rolle.
0.0.1.28 (2026-10-16)¶
Breaking Changes¶
- Migration nötig (Apps mit Reporting): neue Tabelle
cw.DashboardReports. IReportsApihatGetDashboardAsyncundSetDashboardAsyncbekommen; eigene Implementierungen ergänzen sie. Neue Endpunkte unter/api/v1/reports/dashboard: OpenAPI-Snapshots und SDKs neu erzeugen.AddCommandPaletteEntitySetundCommandPaletteEntitySet<T>sind entfernt: Die Befehlspalette findet Datensätze über die neue globale Suche des Servers. Registriere das Set neben seinem OData-Set, z. B.services.AddGlobalSearch<Product>(s => s.Fields(p => p.Name, p => p.Barcode).Page("/catalog/products"))(coworkee updatezeigt auf die alten Aufrufe).- Neue Endpunkte
/api/v1/search,/api/v1/search/streamund/api/v1/search/providers: OpenAPI-Snapshots und SDKs neu erzeugen. ICoworkeeApihatGetMailTemplateHistoryAsyncbekommen; eigene Implementierungen ergänzen es.- MudBlazor.Extensions 9.11.4 und MudExRichTextEditor 9.5.5: Apps, die MudBlazor.Extensions selbst festlegen, gehen auf 9.11.4.
Neu¶
- Ein Bericht als Dashboard: jeder Benutzer kann einen Bericht zu seinem Dashboard machen, Inhaber der neuen Berechtigung
Reports.Dashboardzum Standard der Organisation; die Wahl des Benutzers gewinnt.ReportDashboardzeigt es live an und fällt auf das eigene Dashboard der App zurück. Die Dashboard-Seite des Templates nutzt es, führt Dashboard vor Berichte auf, und die Einrichtung mit Beispielen macht Catalog overview zum Dashboard der Organisation. Siehe Ein Bericht als Dashboard. - Globale Suche: eine Suche über Benutzer, Rollen, Gruppen, Dateien, Berichte, Chats und die eigenen Sets der App (
AddGlobalSearch<T>für OData-Sets,IGlobalSearchProviderfür alles andere,AddGlobalSearchIndexfür einen Elasticsearch-Alias). Anfang vor Teil,"exakt", Typfilter wieusers:maxund Ids; Bewertungen über Provider hinweg vergleichbar, ein Timeout pro Provider, dieselben Berechtigungen, Organisation und Zeilenregeln wie die OData-Listen. Die Befehlspalette zeigt die Treffer Gruppe für Gruppe, sobald sie da sind,/search?q=listet alle mit einem Filter pro Typ,GET /api/v1/search/streamstreamt JSON-Zeilen durch das BFF, und das MCP-Toolglobal_searchgibt sie an KI-Clients. Siehe Globale Suche. - Die Dateiseite öffnet die Vorschau von
?file={id}. - Beispiele der Vorlage: Marken, Produkte und Dokumente sind in der globalen Suche.
coworkee module addundcoworkee entity addtragen erzeugte Entitäten mit Texteigenschaften in die globale Suche ein (AddGlobalSearch<T>mit diesen Feldern und der Listenseite).- Einstellung Rich-Text-Editor:
Editors.RichTextEditor(TipTap, der Standard, oder Quill) wählt den Editor für jeden Rich-Text-Editor der Bibliothek;RichTextEditorbringt dieselbe Wahl auf eigene Seiten. Mail-Platzhalter funktionieren in beiden als Erwähnungen. Siehe Mailing. - Mail-Vorlageneditor: Der Editor füllt das Fenster, ein Vorschau-Panel folgt jeder Änderung (Desktop- oder Telefonbreite, helles oder dunkles Mailprogramm, Zeile im Posteingang), Versionsverlauf mit Zeilenvergleich und Wiederherstellen (
GET /api/v1/mail/templates/{name}/{culture}/history), Schutz vor dem Verlassen mit ungespeicherten Änderungen, Sprach-Chips neben dem Titel und eine durchsuchbare Platzhalterliste. - Workflow-Designer:
Coworkee.Workflows.Elsa.Studiohostet Elsa Studio als eigene App, die sich am Auth-Server anmeldet (BerechtigungWorkflows.Elsa.Manage) und mit der Elsa-API der API arbeitet;app.AddElsaStudio<T>()(oderAddProjects()für*_ElsaStudio) verdrahtet Client, API-Adresse und den Link zum Designer,coworkee deploy --without elsastudiolässt ihn weg. Template-OptionelsaStudio(--elsa-studio). Siehe Elsa Studio.
Korrekturen¶
- Dialoge und Seitenleisten der Bibliothek (Import-Assistent, Kampagnen-Assistent, Theme, Logo, Code-Editor, API-Schlüssel, Workflow-Kommentar) tragen die Startklasse von MudBlazor.Extensions und erscheinen damit erst an ihrer endgültigen Position, statt zuerst kurz in der Mitte aufzublitzen. Eigene Dialoge, die du mit
ShowExAsyncoderShowSideSheetAsyncöffnest, setzenClass="@MudExCss.Classes.Dialog.Initial"an ihremMudDialog. - Der Eingang für Genehmigungen zeigt Titel, Details und Frist einer Genehmigung in eigenen Zeilen.
- Apps mit
Coworkee.Workflows.Elsabehalten die Eigenschaftsnamen ihrer Validierungsfehler (Brand.Name); die Elsa-API (FastEndpoints) hatte FluentValidation für jeden Validator auf camelCase umgestellt (brand.Name). - Die Endpunkte von Elsa (
/api/elsa/...) landen nicht mehr im OpenAPI-Dokument der App: OpenAPI-Snapshots und SDKs von Apps mitCoworkee.Workflows.Elsaneu erzeugen.
0.0.1.27 (2026-10-16)¶
Korrekturen¶
- Links auf Adressen des Servers (z. B. Anmelden am Ende der Einrichtung,
/bff/login) laden wieder vom Server; seit die Seiten der Bibliothek eine Sammelroute haben, zeigte die App dafür Not found.. In Apps ist nichts zu ändern.
0.0.1.26 (2026-10-16)¶
Breaking Changes¶
ICoworkeeApihatGetSystemStatusAsyncdazubekommen; eigene Implementierungen ergänzen es.- Seiten der Bibliothek unter eigenem Präfix: die Admin-Seiten der Bibliothek liegen jetzt unter
/cw/admin/...statt/admin/...(CoworkeeClientOptions.PagePrefix,""behält die alten Adressen); alte Adressen leiten weiter. Die Seiten der Bibliothek haben keine@page-Routen mehr, eine Sammelseite (/{*Path}) zeigt sie: eine App mit eigener Sammelseite bekommt eine mehrdeutige Route. Apps ersetzen oder schalten Seiten per Schlüssel ab (options.Pages), siehe Komponenten ersetzen. - Deployments nehmen die Tools des App-Hosts mit: Ein veröffentlichter App-Host deployt jetzt auch Keycloak, Grafana, WebDataStudio, LibreTranslate und AspireUI. Apps aus einem älteren Template übernehmen drei Dinge aus einem neuen: in
Migrations/Program.csden Seed ausInitialAdmin.From(configuration)(mitDemoSeed.ConfigureDeployment) undReconcileKeycloakRealmAsync(), inServiceDefaults/Extensions.csden Grafana-Exporter pro Signal mitGRAFANA_OTLP_PROTOCOLund inAppHost.csapp.Deploys(...)für Ollama undaspireUi.WithCoworkee(app)für AspireUI.KeycloakRealmliegt jetzt inCoworkee.Contracts.Identity. - Migration nötig: neue Tabellen
cw.PushSubscriptions(Notifications),cw.DataTransferJobsundcw.ImportProfiles(OData, also jede App). Workflows und Webhooks bringen eigene Tabellen mit, wenn eine App sie aufnimmt. ICoworkeeApihatAddMailTemplateLanguageAsync,GetPushSettingsAsync,SavePushSubscriptionAsyncundDeletePushSubscriptionAsyncdazubekommen; eigene Implementierungen ergänzen sie.Notificationerbt jetzt vonAggregateRoot(sie löstNotificationCreatedaus, solange Push eingerichtet ist). Das Schema ändert sich dadurch nicht.IODataClient.ExportAsyncundImportAsyncentfernt: NutzeIDataTransferApi(Export der aktuellen Ansicht in drei Formaten, der Import-Assistent). EigeneIODataClient-Fakes streichen die beiden Methoden.ODataImportRegistrationhatCreate,UpdateundDeletestattSend;AddODataImportnimmt für Ändern und Rückgängig(Guid? id, row) => commandund optional einen Lösch-Command.CoworkeeODataModulehängt vonCoworkeeBackgroundJobsModuleab: Importe und große Exporte laufen als Jobs. Apps aus dem Template haben es bereits (Mailing); Test-Hosts setzenCoworkee:Jobs:ConnectionStringNameund legen ihre Tabellen vorUseCoworkee()an.- Der Import-Button von
CoworkeeDataTableöffnet den Import-Assistenten, statt sofort eine Excel-Datei hochzuladen; Excel-, CSV- und JSON-Exporte von OData-Sets kommen mit den sichtbaren Spalten vom Server. - Smartphone-Layout: Apps ergänzen
viewport-fit=coverim Viewport-Tag vonApp.razor(coworkee updateerledigt das). - Neue Endpunkte (Push, Sprachen von Mail-Vorlagen, Import und Export, Verlauf, Workflows, Webhooks): OpenAPI-Snapshots und SDKs neu erzeugen.
coworkee update kennt all das (Upgrade-Regeln von 0.0.1.26).
Neu¶
- Template-Beispiele: die Befehlspalette bietet Neues Produkt (öffnet den Dialog über
/catalog/products?new=true) und findet Produkte nach Name oder Barcode. - Webhooks: Secret erneuern: ein neues Geheimnis, einmal angezeigt; das alte signiert für
Coworkee:Webhooks:SecretGracePeriod(24 h) mit, siehe Webhooks. Zwei neue Spalten incw.WebhookSubscriptions(Apps mit Webhooks brauchen eine Migration). - Workflow-Chips in Tabellen laden die Zustände einer Seite in einer Anfrage (
POST /api/v1/workflows/{entityType}/states,IWorkflowApi.GetStatesAsync) statt einer pro Zeile; eigeneIWorkflowApi-Implementierungen ergänzen die Methode. - Schieberegler in Spaltenfiltern: zwischen auf Zahlen- und Datumsspalten regelt zwischen kleinstem und größtem Wert, den der Server meldet; eine Spalte mit Datums- oder Zahlenbereich-Facette (etwa das Bestelldatum der Demo) zeigt deren Histogramm und Regler statt einer Checkbox pro Bucket.
- Systemstatus-Seite für die Systemorganisation (
/cw/admin/system-status): Versionen, Datenbank und ausstehende Migrationen, Outbox, Hintergrundjobs mit den letzten Fehlern, Mail, Echtzeit, Redis, Dateien, Übersetzung und KI; Module und Apps steuern Karten überISystemStatusContributorbei, siehe Admin-Oberfläche. - Workflows und Genehmigungen (
Coworkee.Workflows, optional): Zustände und abgesicherte Übergänge pro Entitätstyp, Genehmigungen durch Rollen oder Benutzer mit Frist, Erinnerung und Eskalation, eine Historie, die KomponentenCoworkeeWorkflow,CoworkeeWorkflowActionsundCoworkeeWorkflowTimelineund die Seite Genehmigungen, siehe Workflows und Genehmigungen. - Elsa-Workflows (
Coworkee.Workflows.Elsa, optional): Elsa Workflows 3 in der API mit Coworkee-Aktivitäten und -Triggern, siehe Elsa-Workflows. - Webhooks (
Coworkee.Webhooks, optional): Endpunkte pro Organisation bekommen signierte Ereignisse (im Stil von Standard Webhooks) zu Änderungen freigeschalteter Entity-Sets, Workflow-Übergängen und eigenen Ereignissen der App, beschränkt auf das, was der Besitzer des Endpunkts lesen darf; Wiederholungen mit Backoff, Abschalten nach wiederholten Fehlern, Zustellprotokoll, Testereignisse und erneute Zustellung unter/admin/webhooks, Schutz vor SSRF. Siehe Webhooks. - Import-Assistent pro Entity-Set: CSV, Excel und JSON, erkannte Kodierung, Trennzeichen und Kopfzeile, Spaltenzuordnung mit Vorschlägen und gespeicherten Zuordnungen, Umwandlung in der Sprache der Datei, Vorschau mit der Validierung der Commands, Anlegen, Ändern per Schlüssel oder beides, Probelauf, Hintergrundjob mit Live-Fortschritt, Datei der fehlerhaften Zeilen und Rückgängig für den letzten Import, siehe Import und Export. Admin-Seite Import und Export (
/admin/data-transfer, BerechtigungDataTransfer.Use; gib sie den Rollen, die sie sehen sollen). Exporte der aktuellen Ansicht als Excel, CSV oder JSON (format,columns); mehr alsCoworkee:OData:BackgroundExportRowsZeilen (10 000) laufen als Job mit Download-Hinweis. - Verlauf eines Datensatzes und Wiederherstellen (
AddEntityHistory,History="true"anCoworkeeDataTable,CoworkeeEntityHistory): Zeitleiste mit Wort-Diff, Wiederherstellen eines Stands oder eines einzelnen Felds mit Vorschau, gelöschte Datensätze vonISoftDelete-Sets kommen zurück, siehe Audit. - Befehlspalette (Strg+K): Seiten, Datensätze, Aktionen und der Assistent als Rückfall, erweiterbar mit
AddCommandPaletteProvider, siehe Befehlspalette. - Smartphone-Layout der Blazor-Shell und der Anmeldeseiten: Überlaufmenü in der App-Leiste, Navigation als Overlay, Bearbeitungsblätter im Vollbild, Facetten-Menüs als Sheets von unten, fixierte Zeilenaktionen, 44-px-Touchziele und Safe Areas, siehe Smartphones, installierbare App und Push.
- Installierbare App:
<Coworkee.Bff.Pwa.CoworkeePwa />im Head vonApp.razorverlinkt das Web-Manifest in den Farben des Themes;Coworkee.Bffliefert Manifest, Service Worker (er speichert nur die Offline-Seite), Icon und Offline-Seite; Update- und Installationshinweise in der App. - Web-Push für die Benachrichtigungen:
options.UsePush()in Aspire oderCoworkee:Notifications:Push:PublicKey/PrivateKey; Benutzer schalten es pro Gerät auf der Benachrichtigungsseite ein. - Sprachen von Mail-Vorlagen: Sprache hinzufügen unter Administration > Mail-Vorlagen legt eine Variante für eine später eingeschaltete Sprache an, kopiert oder maschinell übersetzt (nur Texte, Tags und Platzhalter bleiben), und entfernt sie wieder, siehe Mailing. Eine Mail in einer Sprache ohne Variante nutzt vor Englisch die Standardsprache (Organisation, System, Sprachen-Seite;
IDefaultLanguage); die maschinelle Übersetzung steht anderen Modulen alsIMachineTranslatorzur Verfügung. - Deployment: Der App-Host veröffentlicht für Docker Compose, Azure Container Apps oder Kubernetes (öffentliche Adressen, Token-Zertifikate, Setup-Token, der erste Administrator und der Mailserver als Parameter, stabile Volumes, feste Ports); die Tools des App-Hosts (Keycloak mit seinem Realm, Grafana mit den Dashboards der App, WebDataStudio, LibreTranslate, Ollama, AspireUI) kommen mit Volumes und öffentlichen Adressen mit, jedes lässt sich weglassen (
DeployTool,coworkee deploy --without), Mailpit nur mit--with mailpit;coworkee deploy compose|azure|k8sfragt nach Administrator und Mailserver und listet am Ende jede Adresse und die Anmeldung; Coworkee Studio bietet nach dem Erstellen einer App Deployen an; Token-Zertifikate können als Base64 aus einem Secret kommen. Nur Dienste, die Jobs verarbeiten, legen das Hangfire-Schema an. Siehe Deployment. - CLI:
coworkee add/removeschalten Template-Optionen in einer bestehenden App ein oder aus (in deine Dateien zusammengeführt, Konflikte als.rej, Optionen in.coworkee/app.json),coworkee updatewendet die Upgrade-Regeln der Versionen dazwischen an,coworkee db reset|seed|backup|restore,coworkee entity import --from db|openapi|csv, sechs Startvorlagen (coworkee specs list|show,coworkee new --template-spec), Optionen--workflows,--elsa,--webhooksund--pwa(standardmäßig an). MCP-Werkzeugeadd_optionundimport_entities. Siehe Kommandozeile und Startvorlagen. - Studio: eine bestehende App öffnen und ändern, Meine Apps (starten, stoppen, Links), Mit einer Vorlage starten, Entity-Diagramm (ziehen, Referenzen zeichnen, automatisch anordnen, PNG-Export) und Entity-Import mit Vorschau.
- Template: Die Beispielprodukte werden weich gelöscht und zeigen mit Audit ihren Verlauf und kommen zurück; das Dashboard funktioniert mit SQLite (dort kam 500); Demo-Benutzer werden nur in Development angelegt, Migrationen warten auf die Datenbank.
coworkee doctorvergleicht in einer App Versionen: dotnet-ef mit EF Core, Aspire-CLI mit dem Aspire-SDK des App-Hosts, coworkee mitCoworkeeVersion, und findet belegte Ports der Startprofile, jeweils mit Lösung.- Entwicklungsbenutzer bleiben aktuell:
SyncDevelopmentUsersAsync()(nur in Development) legt Seed-Benutzer und -Rollen an, die einer früher eingerichteten Datenbank fehlen, und setzt das Passwort der Seed-Benutzer wieder auf das geseedete; der Migrations-Host des Templates ruft es nachSeedCoworkeeIdentityAsync()auf, so kommen Änderungen anDemoUsers.csin einer bestehenden Datenbank an.
0.0.1.25 (2026-10-15)¶
Nur Korrekturen: Das Skript des Ladebildschirms ist eine eigene Datei, damit eine strikte CSP es ausführt, und App-Seiten gehen mit Cache-Control: no-cache, no-store raus. In Apps ist nichts zu ändern.
0.0.1.24 (2026-10-15)¶
Breaking Changes¶
ClientEntityIndicatorentfernt: Jede Datentabelle einer gespiegelten Menge zeigt denClientEntitySwitchin ihrer Werkzeugleiste (hinzugefügt vonAddCoworkeeClientEntities). Entferne die Zeilen<ClientEntityIndicator>und einen eigenen Vergleichen-Knopf aus deinen Seiten.ODataPicker.Margin(undOptionalODataPicker.Margin) ist jetztMargin?: Ohne Wert folgt der Picker der Dichte des Themes. Code, der den Wert alsMarginliest, ergänzt?? Margin.Dense.CliOption(Coworkee.Cli.Spec) hat den KonstruktorparameterDependsOndazubekommen,OptionDependencydie EigenschaftOr: quellkompatibel, aber binär inkompatibel für Werkzeuge, die gegen ein älteres Coworkee.Cli.Spec kompiliert sind.LoadingScreenDtohat den positionalen ParameterSignedIndazubekommen; OpenAPI-Snapshots und SDKs neu erzeugen.- Enums in jedem
MudExObjectEditwerden mit demEnumEditordargestellt (lokalisierte Beschriftungen ausEnumLabels,[Flags]als Mehrfachauswahl der Einzelbit-Mitglieder), nullbare Enums mit dem leerbarenNullableEnumEditor. EinRenderWithder Meta gewinnt weiterhin. --sign-in-mediamit dem LayoutCardwird ignoriert (nicht übergeben, nicht kopiert), außer--loading-screen SignInMediazeigt das Medium hinter dem Ladebildschirm.
Neu¶
- Ladebildschirm in den Farben des Themes mit dem echten Download-Fortschritt, einer freundlichen Fehlermeldung, wenn der Start scheitert, sowie Farbmodus, Theme und Sprache des Benutzers, siehe Theming. Jede App ergänzt eine Zeile als erste Zeile von
<body>inMyApp.Web/App.razor:<Coworkee.Bff.CoworkeeLoadingScreen Logo="coworkee-icon.svg" />. Der Hintergrund (Animated,SignInMedia,Plain) wird auf der Karte Anmeldeseite gewählt, in Aspire mitoptions.SignIn.LoadingScreen, in der CLI mit--loading-screen. Die Seite geht jetzt mitCache-Control: no-cache, no-storehinaus; das Logo kommt von/bff/loading-screen/logo, das Skript von/bff/loading-screen/script.js(kein Inline-Skript, Apps mit strenger Content-Security-Policy laufen weiter). - Öffentliche Dateien: Manager machen eine Datei öffentlich (
PUT /api/v1/files/{id}/public, Leiste des Dateimanagers, Vorschau); jeder lädt sie überGET /api/v1/files/public/{id}/{name}, etwa als Medium der Anmeldeseite oder des Ladebildschirms, gewählt mit Aus Dateien wählen. Das Modell hatStoredFile.IsPublicdazubekommen: Apps mit dem Files-Modul fügen eine Migration hinzu. - Seitenmodus von Datentabellen:
CoworkeeDataTable.PageMode(Pager,EndlessScroll) und die EinstellungDataTable.DefaultPageMode(global und pro Benutzer), siehe Datentabelle. - Client-Entity-Schalter in der Werkzeugleiste gespiegelter Tabellen: Suche im Browser oder auf dem Server, Synchronisierungsstand als Ring, Vergleichen und das Schnellere wählen nimmt die schnellere Seite; die Wahl bleibt pro Benutzer erhalten.
ImageDataUrlEditlädt mitMudExUploadEdithoch; Enums erhalten überall denEnumEditor(siehe Breaking Changes).- Die Texte der MudBlazor.Extensions-Komponenten, die die Bibliothek zeigt (Upload-Feld, Stil- und Cron-Editor, Dateimanager, Dateivorschau), werden in allen Sprachen mitgeliefert; ihre gespeicherten maschinellen Übersetzungen werden beim nächsten Start ersetzt.
- CLI und Studio: Optionen, die eine andere brauchen (
--airworks-packagesohne--airworks,--ai-provider,--ai-modelund--ai-endpointohne--ai,--backupaußerhalb von Postgres,--sign-in-mediamit dem LayoutCard, außer der Ladebildschirm zeigt es,--sign-in-media-sideohne Medium), gehen nicht mehr an das Template; die CLI warnt (coworkee spec validateebenso) und das Studio blendet ihre Karten aus. Anmeldemedien einesCard-Layouts werden deshalb nicht mehr in die App kopiert. Neu:coworkee spec showund eine Spezifikation aus dem Studio, die jedes Bibliotheksmodul mittrue/falsenennt;coworkee optionsgibtNeeds:und die Webseiten der mitgebrachten Produkte aus, die Studio-Karten zeigen Symbole und Öffnen-Knöpfe, siehe CLI.
0.0.1.23 und älter¶
Breaking Changes¶
IMailSender: Die Schnittstelle verlangt jetztQueueAsync(to, template, model, culture, campaignId, cancellationToken)mit sechs Parametern. Die Überladung mit fünf Parametern ist eine Default-Methode, dienullals Kampagne übergibt. Eigene Implementierungen (Testdoubles, Wrapper) implementieren die Methode mit sechs Parametern; Aufrufer bleiben unverändert.IMailTemplateRenderer: hatRenderContentAsync(content, layout, model, cancellationToken)dazubekommen, das mit einem bereits aufgelösten Layout rendert (der Kampagnen-Job löst damit Vorlage und Layout einmal pro Lauf auf). Eigene Implementierungen ergänzen die Methode; Aufrufer bleiben unverändert.- Positionale Records haben Parameter dazubekommen:
MailTemplateSummaryDto(IsCustom,Description),MailTemplateDto(IsCustom) undOutgoingMailDto(CampaignId). Code, der sie positional erzeugt oder dekonstruiert, und generierte Clients brauchen die neuen Parameter. OpenAPI-Snapshots und SDKs neu erzeugen. - Entfernt mit der Übernahme von MudEx 9.11.3:
ChipListEditor,CronEditor,CronScheduleundSettingsFormRules.WrapInColumns. String-Listen werden alsMudExTagField<string>dargestellt,[Cron]alsMudExCronEdit; verwende diese direkt.
Neu¶
- AirWorks-Client: Chat, Berichte mit Designer, Assistent, die Administrations-Apps (
adminApps) und Realtime, siehe AirWorks-Client. Erzeugte Apps nehmen@coworkee/clientund@coworkee/airworksaus den Tarballs im Template; jedes Release veröffentlicht sie zusätzlich auf npm (--airworks-packages npm).coworkee new --template-sourceträgt den lokalen Paketordner in dienuget.configder App ein. Apps aus der ersten AirWorks-Version:...adminAppsinClientApp/src/main.tsergänzen und für die Dateivorschau das MudEx-Hosting des Templates übernehmen (mudex-webcomponents,vite.config.ts,.dat-Content-Type inProgram.cs). - Mail-Kampagnen mit Empfänger-Voreinstellungen, gespeicherten Abfragen und manueller Auswahl, geplantem Versand und einer Bestätigungsseite für die Abmeldung, siehe Mailing.
- Eigene Mail-Vorlagen mit visuellem und Quelltext-Editor sowie eine
CodeEditor-Komponente auf Basis von Monaco. - Änderungen am Entitätsmodell für Kampagnen, Empfängerlisten und eigene Vorlagen: Füge deiner App eine Migration hinzu.