Changelog
Was ist neu?
Jede Verbesserung an der Plattform, wie sie geliefert wird.
· kamo-shared-library
Zeigen, was das Abschalten von fail-open kosten würde
kamo.entitlement.fail-open gewährt jede App, die die Planmatrix nie erwähnt. Es ist dokumentiert als temporäres Ventil für die Katalog-Verfüllung - schalten Sie es einmal aus Matrix ist gesät - aber nichts könnte die Frage beantworten, die entscheidet, ob Das Ausschalten ist sicher: Welche Mieter halten welche Apps nur deswegen. Flipping es blind hätte Apps weg von Live-Organisationen genommen haben, mit der erste Support-Ticket als Benachrichtigung. scailOpenGrants löst jede Organisation zweimal, einmal gewährt unerwähnt gebliebene Apps und einmal leugnen, und berichtet die Differenz. Es liest nicht das Leben flag, so gibt es die gleiche Antwort vor und nach dem Flip. Die Neuauflösung geht durch resolvePlan und nicht durch die Plan-ID direkt, Spiegelung der realen Pfade Fallback zu einem planCode Lookup - sonst ein Zuschuss, dass würde in der Tat überleben wird als Verlust gemeldet.
· kamo-internal
Zeigen Sie, ob jemand da ist, und ihre Erweiterung
Jede Zeile trägt jetzt einen Präsenzpunkt und Wort neben dem Namen, und seine Erweiterung in der Detailzeile - so dass die Auswahl einer Person nicht mehr bedeutet, einen Namen zu wählen und hoffen. Dies ist die eine Menschen Picker in der App, so landet es auf dem Manager Feld, E-Zeichen-Unterzeichner, Hinzufügen von Menschen zu einem Chat und Zuweisung Unterstützung gleichermaßen. Offline schlägt alles, was deklariert wurde. Verfügbarkeit_status bewegt sich nur auf Anmeldung, Anmelden und ein manuelles Toggle, so dass jemand, der sich nie abmeldet liest auf unbestimmte Zeit - zeigt, dass als grüner Punkt wäre zugesichert falsch über die eine Sache, für die der Punkt ist. Nicht verbundene zieht als Umrissring statt als gefüllter Punkt, so liest es sich als Abwesenheit statt als eine andere Statusfarbe. Ein Verzeichnis, das nie Präsenz hatte - eine In-Gedächtchen-Quelle hinter "fetcher" . zeigt keinen Indikator. Abwesend ist unbekannt, und unbekannt sollte nichts sagen anstatt zu behaupten, dass jeder offline ist.
· SecurityService
Verfügbarkeit, Präsenz und Erweiterung in einer Verzeichnisreihe tragen
Die Auswahl einer Person ist einfacher, wenn die Zeile sagt, ob sie da sind und wie sie erreiche sie, so dass jeder jetzt das trägt, was er zuletzt erklärt hat, ob irgendetwas von ihre ist tatsächlich verbunden, und ihre Arbeit Erweiterung, wenn sie eine haben. Verfügbarkeit und Anwesenheit sind beide hier, weil entweder allein irreführend: a.e"-Wert bewegt sich nur bei der Anmeldung, dem Aus- und Abschalten und einem manuellen Umschalten, also a Mitglied, das sich nie abmeldet, liest auf unbestimmte Zeit VERFÜG. Präsenz wird aus der PRESENCE gelesen:{memberId'-Schlüssel MediaService schreibt . Cross-Service lesen sich nennenswert. Die Alternativen waren eine HTTP-Rundreise zu MediaService bei jedem Tastendruck einer Suche oder Lesepräsenz im Browser, und der Browser nicht: ToolProviders macht das Tool Dock als Geschwister der Baum hält die Präsenz-Anbieter, so dass ein Picker in einem Support-Ticket geöffnet Fenster würde jeden Kollegen offline melden. Beide Dienste teilen sich den Redis-Gastgeber und Datenbank. Eine missglückte Suche liest sich eher als offline, als dass die Suche scheitert.
· BillingService
Kaufen Sie einen Block, wenn ein Opt-in org ausgeht
Läuft kurz nach dem nächtlichen Schnappschuss-Sweep, denn das ist es, was die Nutzungszahl, auf die es entscheidet, auf - Erweiterung gegen die gestrige Zahl würde kaufen ein blockieren jedes Mal einen Tag zu spät. Ein Block pro Lauf, nie eine Aufholjagd, und es stoppt an der Decke des Besitzers. Wenn eine Organisation weit über diese Decke ist das richtige Ergebnis ist, dass schreibt stoppen und jemand schaut es an, nicht, dass die Plattform leise kauft seinen Weg aus an ihre Kosten. Auto-Extierung auf ohne Obergrenze liest sich als deaktiviert und nicht unbegrenzt, weil eine abwesende Grenze viel eher ein Versehen als eine Absicht ist.
· InitializerService
Fügen Sie die Auto-Extensalgen Spalten hinzu
· kamo-shared-library
Opt-in Auto-Extsion mit einer Decke
Zwei Spalten auf dem Abonnement, das die Blöcke hält: ob eine andere zu kaufen eine automatisch, wenn die Organisation läuft aus Platz, und die meisten kann es je kaufen. Aus in der Standardeinstellung absichtlich - still zu erhöhen jemandes Rechnung ist schlimmer als ein hochladen, die mit einer Erklärung scheitert, so schalten Sie es auf ist der Eigentümer Handel ein wenig Geld dafür, dass man nie darüber nachdenken muss, und das ist nur ihr Handel machen. Eine Decke ist erforderlich, anstatt optional: ein automatischer Kauf ohne gebunden ist ein unbefristetes Bekenntnis zu einem Prozess, den niemand beobachtet.
· BillingService
Lassen Sie einen Katalog Preiswechsel tatsächlich erreichen Stripe
Die Preise sind unveränderlich und die Mapping-Karten halten eine Zeile pro (org, tip, code, Zyklus) hinter einem einzigartigen Schlüssel, so dass, sobald ein Preis existierte, könnte es sich nie ändern. A Preis-Editierung war eine permanente No-Op auf Einnahmen, und nichts berichtete es. StripePriceConconciler vergleicht jeden abgebildeten Preis mit dem, was der Katalog jetzt sagt und, wenn gefragt, zeigt die Kartierung auf einen frischen Streifenpreis mit dem alten ein archiviert - archiviert statt gelöscht, weil Stripe hält Abrechnung ein archivierter Preis für Abonnements bereits auf sie und lehnt es für neue, das ist genau das gewünschte Verhalten. Metering wird über durchgeführt, so ein dosierter Preis kann nicht wieder unmetered und stillschweigend aufhören Abrechnung Nutzung. Sie bewegt bestehende Abonnenten bewusst nicht auf den neuen Preis. Leise Re-Pricing einen Live-Kunden, weil jemand eine Katalogzeile bearbeitet hat, ist eine Gebühr Niemand genehmigt; ob Großvater ist eine kommerzielle Entscheidung, und die Tatsache, dass es nie eine Entscheidung war, was fehlte. Die Zählung noch auf der alte Preis wird stattdessen gemeldet. Ausgesetzte Report-only standardmäßig bei GET ************ mit der Repoint hinter einem expliziten POST.
· InitializerService
Fügen Sie die Spalten hinzu, die eine Preisänderung nachweisbar machen
Bestellung(0), null, keine Verfüllung - ein Nullbetrag lautet wie "wir wissen nicht, was dieser Preis wurde mit" und der Versöhner behandelt es als unbekannt und nicht als Drift.
· kamo-shared-library
Auf jeden einzelnen Streifenpreis eingezeichnet
Das Mapping gespeichert nur, welche Preis-ID zu verwenden, so dass eine Katalogpreisänderung könnte nicht einmal bemerkt werden. sicherstellen, PlanPrices kurz-circuited auf die Existenz der Reihe und der einzigartige Schlüssel verbot einen zweiten, was bedeutete, einen Plan von $72 auf $79 zu erhöhen die Marketing-Seite, das In-App-Zitat und den Plan DTO aktualisiert und geändert nichts über das, was jemand aufgeladen wurde - mit nichts Berichterstattung über die Divergenz. unit_amount_cents und Währung geben dem Versöhner etwas zum Vergleichen. Sowohl nullbar als auch linke NULL für bestehende Zeilen: null bedeutet "unbekannt", was wahr für jede Zeile vor der Spalte, und die Behandlung unbekannt als unpassend würde Erschaffen Sie jeden Preis im Anwesen auf der ersten Durchlauf.
· kamo-internal
Geben Sie die Speicherkapazität ein, die die Zusammenfassung jetzt zurückgibt
Hält den Kundenvertrag im Gleichschritt mit BillingService, die jetzt berichtet, was der Plan beinhaltet, welche Blöcke gekauft wurden, die kombinierte Decke und die Teil der neben den gelagerten Bytes. Das Panel, das es gibt, braucht eine neue Kopie, und Kamo-Translation-dictionary ist Mid-edit von einer anderen Sitzung, so dass die UI landet separat, anstatt fegen In-flight-Arbeit in diesem Repo.
· BillingService
Kapazität neben der Nutzung melden
Die Speicherplatte gemeldet Bytes gegen nichts überhaupt gespeichert - keine Zulage, kein Prozentsatz, kein Geld - also hatte ein Besitzer, der auf 400 GB schaute, keine Möglichkeit zu sagen ob das bequem war oder im Begriff, ihre Uploads zu stoppen. Ihr erstes Das Wissen um ein Problem wäre ein missglückter Upload gewesen. Die Zusammenfassung trägt nun, was der Plan beinhaltet, welche Blöcke gekauft wurden, die kombinierte Decke und die verwendete Fraktion, zuzüglich der Blockgröße und Preis so ein Oberfläche kann sagen, was ein anderer Block geben würde und kostet, ohne sie zu verknüpfungsen. Alles kommt aus den gleichen Katalogreihen, aus denen die Gebühr berechnet wird.
· kamo-shared-library
Geben Sie der Speicherzulage einen Effekt
Die Speicherung wurde über neunzehn Domains gemessen, nachts, mit einem Build-Versagen Deckungstest - und nichts irgendwo berechnet eine Zulage oder verweigert ein Byte. Die Speicherzahl des Plans war Daten, die niemand las, und die zusätzliche Speicher Add-on hatte überhaupt keinen Produkteffekt: Bezahlen änderte nichts und zahlte keine Kosten nichts. StorageQuotaService löst auf, was eine Organisation halten kann - der Plan pro Benutzer Zuschuss über seine Sitze gebündelt, plus die Blöcke, die es gekauft hat, und ImageService verweigert Inhalte, die darüber hinausgehen. Der Scheck sitzt nach der dedup Lookup, so dass das Wiederanbringen einer Datei, die die Plattform bereits hält, nie abgelehnt wird für den Raum; nur wirklich neue Bytes zählen. Es lebt hier und nicht in BillingService, weil die Dienste, die schreiben Bytes kann nicht jedes Aufruf einer Abrechnung API auf ihrem Upload-Pfad, und es wird von injiziert Feld statt durch den Konstruktor, weil ImageService von Hand an mehreren Stellen - ein Konstruktor-Argument ist die eine Bearbeitung, die kompiliert überall außer den Tests und dann nicht die Bild-Build. Zwei absichtliche Wege, falsch zu liegen. "GB" wird als Gibibyte gelesen, was ist, was ein Dateimanager bedeutet, wenn es GB und die großzügigere Lektüre ausdruckt. Und Organisation ohne Live-Abonnement oder einen Service ohne Quotenbohnen verkabelt, speichert genau wie zuvor: dieses Tor existiert, um einen zahlenden Kunden zu halten, was sie kauften, nicht um eine Abrechnungslücke in Datenverlust zu verwandeln. Lesungen sind nie gated Füllen Sie Ihren Speicher stoppt Sie das Hinzufügen von mehr, nie wegnimmt, was Sie haben.
· kamo-internal
Sagen Sie dem Antragsor, ob ihr Agent tatsächlich da ist
Ein stumherder Faden unterscheidet nicht "niemand hat sich das angeschaut" von "mein Agent trat weg", und die Wartete kann nicht sagen, welche. Der Hinweis unter der Konversation sagt, welche, und wenn die Antwort "nicht jetzt" ist es sagt, was passiert nächstes - die Nachricht ist empfangen und wird beantwortet, wenn sie zurück sind, eher als jemanden zu verlassen, der sich fragt, ob es überhaupt gelandet ist. Platziert unter dem Chat statt in der Kopfzeile, weil es antwortet "ist jeder wo?", welche Frage beim Tippen gestellt wird, nicht beim Scannen Metadaten des Tickets. Server-Antwort, nicht von der Anwesenheitskarte des Antragstellers gelesen: Präsenz ist Broadcast pro Organisation, so dass ein Kunde-Orgie-Mitglied wird vom Anbieter unterstützt org würde ihren Agenten als dauerhaft offline ansehen. Ein selbstbewusst falsch "sie sind weg" ist schlimmer als keine Ankündigung. Aus dem gleichen Grund hält eine gescheiterte Umfrage die letzte bekannte Antwort statt Flipping die Bekanntmachung. Befragt bei 30er Jahren und nur, während die Registerkarte sichtbar ist. Verfügbarkeit ist ein Komfort Signal, nicht eine Korrektheit ein, und ein Hintergrund Tab ist niemand beobachten.
· MediaService
Umwidmung erreicht den neuen Agenten, und der Antragde wird gesagt, wer da ist
Die Umwidmung erreichte niemanden. ZuweisungOpenedEinträge, die ein Kunde gestellt hat das Gespräch auf dem Bildschirm, und es ist, was wirft ein Ticket bei der Anmeldung noch die PREVIOUS Agentenmarke gehalten, so dass die neue bekam den Live-Push nur, wenn sie geschahen online, dass zweite, und nichts, wenn sie waren be-mitt. applyAssignment kläzt es jetzt, wann immer sich der Bevollmächtigte tatsächlich ändert, die die Übergabe haltbar macht, für wem sie jetzt gehört. GET ************ sagt der Person, die um Hilfe gebeten hat, ob die Person, die ihnen hilft, ist erreichbar. Beantwortete Serverseite absichtlich: Präsenz wird pro Organisation ausgestrahlt, so dass ein Kunden-Ordner keinen Agenten sehen kann der Provider org überhaupt und der Status würde "offline" für jeden einzelnen lesen Cross-Or-Gespräch. Gedakte zu den Leuten bereits im Gespräch Ticket-ID ist eine UUID, kein Geheimnis, und "ist diese Person an ihrem Schreibtisch" sollte nicht Antwort auf eine Vermutung.
· kamo-internal
Zuweisen Sie eine Chat-Anfrage, und weisen Sie aus der Liste
Zwei Lücken, gleiche Ursache - Zuordnung wurde als etwas behandelt, das zu einem passiert Ticket und nicht für ein Stück Arbeit. Der Zuweisungsknopf wurde für Pre-Tickets komplett ausgeblendet, also eine Live-Chat-Anfrage, der Fall, wo immer es auf die richtige Person zählt, hatte keine Möglichkeit zu sein Übergabe überhaupt. Dieser Ausschluss stammt aus, wenn eine Chat-Anfrage war noch nicht "a echtes Ticket" und Zuordnung passierte nur bei der Konversion. Es ist jetzt zuseigbar, und der Status überlebt, so dass er auch danach umgewandelt werden kann. Und die Zuordnung erforderte das Öffnen des Gesprächs zuerst, das die falsche Form ist für Triaging eine Warteschlange - die Person, die die Warteschlange arbeitet, ist oft nicht die Person, die sollte antworten. Die Zuweisung zur Zelle auf der Ticketliste ist nun die Steuerung: Schwebende Shows zuweisen oder neu zuweisen, klicken öffnet das Ticket den gleichen Picker verwendet wird. Der Zeilenklick öffnet noch das Gespräch. Die Antwort patcht seine eigene Zeile statt neu laden, so dass Zuweisung nicht verschieben Sie den Platz des Operators in einer gefilterten, sortierten, geposteten Warteschlange.
· kamo-internal
Quote-Engine für den Plan Picker, passend zu dem, was Stripe in Rechnung stellt
Die Arithmetik hinter einer Live-Lauf insgesamt, getrennt von jeder Komponente so die Zahlen können direkt getestet werden. Es spiegelt **************** genau: pro Sitz Add-ons-Skala mit Mitarbeiterzahl, flache Rechnung von Einheiten gekauft aber viele Menschen sind auf dem Plan, und Metered diejenigen sind benannt, anstatt Erraten. Diese Korrespondenz ist der Punkt. Beide Orte die Plattform zuvor zitiert ein Preis nicht einverstanden mit der Gebühr - die in-App-Bestellung Assistent hinzugefügt jedes Add-on einmal unabhängig von Sitzplätzen, und die öffentliche Seite in Rechnung gestellt eine organisationsweite Speicher-Pool pro Benutzer.
· BillingService
Machen Sie einen ersten Plan kaufbar, und Renditen reale Planpreise
Zwei Dinge haben eine Organisation gestoppt, die jemals ein erstes Abonnement gekauft hat. Planlisten waren nur über sub.marketId auf ein Abonnement erreichbar bereits gehalten, so dass ein Org mit keiner konnte nicht sehen, einen Plan irgendwo im Produkt. GET /api/billing/markets/for-org löst den Markt von der Anrufer Anspruch root - die gleiche Org, deren Free Plan bereits ihre Basis liefert, Pläne und Ansprüche können also nicht aus verschiedenen Katalogen kommen. Und der Plan DTO lesen ************ je Besiedelungen: sie sind NULL für jeden KamoCRM-Plan, weil der Sicker schreibt Preise in **************** Eine Kauffläche zeigt sich daher kein Preis, und das Konto verzeichnete eine Nullgebühr. Es liest jetzt den Preis Zeilen, mit den Planspalten als Fallback für Kataloge, die sie tragen. Belichtet auch die Add-on-Einheit Größe, so dass eine Kauffläche kann sagen "pro 10 GB" ohne Hardkodierung.
· kamo-internal
Gate bezahlt Aktionen auf einem lizenzierten Sitz, am Chokepoint
Fast jede gatterbare Aktion im Produkt - Wählen Sie eine Erweiterung, E-Mail an ein Mitglied, Öffnen Sie den KI-Assistenten, spielen Sie eine Aufnahme, beginnen Sie ein soziales Gespräch - ist eine nackte ************ und die Werkzeugbuchung hatten überhaupt kein Tor. Gating diese Anruf-Websites ein zu einer Zeit könnte nie vollständig sein: ein Disponent Später hinzugefügt, oder einfach verpasst, Routen gerade um es herum. Der Scheck lebt jetzt in ToolWindowsContext's Single Tool:open handler, so dass jeder Anrufer abgedeckt ist. Aktionen, die nie durch ein Werkzeugfenster passieren, werden dort eingesperrt, wo sie leben: Anhänge (einschließlich Drag-Drop und Paste, die die gleiche Fähigkeit von eine andere Route), das Wachsen eines Chats in eine Gruppe, und die Treffpunkte. Damit werden auch drei Ungereimtheiten beglichen, die die Prüfung ergab. Zwei der drei "Einladen zum Treffen" Einstiegspunkte überprüft Organisation.isMeet und die dritte tat nicht; zwei der drei E-Mail-Eingabepunkte überprüft ACCESS_MAIL und die dritte hat nicht; und die Wahl eines Mitglieds-Erweiterung aus dem Dienstplan hatte keine VOIP-Prüfung von irgendwelchen Art. Alle sind sich jetzt einig. Fähigkeiten standardmäßig gesperrt - während die erste Ladung im Flug ist, wenn der Anruf scheitert, und wenn ein älteres Backend das Feld weglässt. Vermutlich "erlaubt" würde Hand ausgezahlte Funktionen, das ist der Fehler, den der Anspruchspfad bereits einmal gemacht hat mit seinem Fazit-Open-Standard.
· SecurityService
Lösen Sie, was ein Mitglied tun kann, nicht nur, was ihr Plan beinhaltet
Feature Grants beschreiben einen Plan. Sie haben dieses Mitglied nie beschrieben, weil Konsolen-Gates-Navigation auf org-level org-level org.features - also ein Mitglied ohne Lizenz überhaupt sah jede App, auf die die Organisation Anspruch hatte, und die Mitglieder-Ebene Lizenzierung, die bereits in der Datenbank existierte, hatte keine Auswirkung auf irgendetwas. MemberCapabilities ist diese fehlende Antwort, einmal auf dem Server gelöst. Ein Mitglied ohne Sitz hält einen bewussten Boden: Text-Gespräch mit Teamkollegen, Unterstützung, ihr eigenes Profil, ihre eigene Abrechnung - genug, um einen Menschen zu erreichen und kaufen Sie eine Sitzlehne. Incoming-Nachricht Übersetzung bleibt auch auf, weil Lesen Sie wurden gesendet ist nicht ausgeben. Alles, was Geld kostet, ist aus. Eine aktive Org-Studie lizenziert alle im Org und nicht nur im Sitz Halter. Eine Probe- oder Org wird mit dem einzigen Sitz des Free Plans gesät, so gating die Studie über Lizenzen hätte bedeutet, dass der Besitzer allein das Produkt bewerten konnte während das Team, das sie eingeladen, es zu bewerten sah nichts. Login ist unberührt: Authentifizierung hat noch nie Rechnungszustand konsultiert und trotzdem tut es nicht. Der Verlust eines Sitzplatzes Funktionen, nie Zugriff.
· BillingService
Rechnung pro Einheit Add-ons von Einheiten gekauft, nicht nach Mitarbeiterzahl
Fäden Sie die neue Add-on-Menge durch Erstellen und Update ein: ein FLAT-Ad-Ad-on jetzt nimmt seine Stripe-Menge von dem, was das Abonnement tatsächlich gekauft, so vier 10 GB Speicher blockiert Rechnung als vier Blöcke anstatt einmal pro Sitz. Mengen werden gegen die aufgelösten Add-on-Codes auf dem Weg in gefiltert, so dass Abgestandene oder feindliche Körper kann eine Menge nicht gegen einen Code parken, den er nicht berechtigt war zu kaufen.
· InitializerService
Reprice Zusätzlicher Speicher als $2.50 pro 10 GB, org-widerzeit
Das Add-on beschrieb einen organisationsweiten gemeinsamen Pool und wurde dann zu Preisen angeboten USAGE_BASED bei $4 mit "25 GB" nur in Prosa angegeben. Nichts jemals vorgelegt ein Speicherzähler Ereignis, so dass es nichts abgerechnet; und hatte es angebracht worden, Streifen lehnt eine Menge zu einem dosierten Preis ab, so dass die Abonnement-Gewinnschaft haben würde geworfen. Inzwischen hat die öffentliche Seite es als "+$4 /user/Monat" wiedergegeben. Es ist jetzt FLAT mit unit_size 10 bei $2.50 . Blöcke der Besitzer kauft, preislich Gleichlich sind jedoch viele Menschen auf dem Plan. AddOnQuantityMigration fügt die beiden hinzu ungültige Spalten bei Order(0), bevor jeder Läufer eine Entität laden kann, die Karten sie.
· kamo-shared-library
Geben Sie Add-ons eine Einheitsgröße und eine kaufbare Menge
Eine Add-on-Einheit existierte immer nur als Prosa in ihrer Beschreibung ("Jede Einheit fügt 25 GB") und als Hardkodcode-Konstante in der Marketing-Website, so dass nichts könnte Rechnung dagegen. AbonnementEinträge erhalten Unit_size und Kontozuschreibung gewinnt addon_quantities - wie viele Einheiten von jedem Add-on das Abonnement gekauft. active_addon_codes bleibt die Berechtigung Quelle der Wahrheit, also nichts, was nur fragt "ist diese App gewährt" muss wissen, welche Mengenkarte existiert. Behebt auch das Angebot des Auftrags-Assistenten, der jedes Add-on einmal ohne Sitze hinzugefügt hat Faktor, obwohl die meisten PER_SEAT sind: ein 25-sitziger Auftrag mit vier Modulen zitiert $31 gegen die $775 Stripe würde in Rechnung stellen. Das Zitat folgt nun dem gleichen Preismodell die Gebühr tut, und lässt Metered Add-ons anstatt zu raten.
· kamo-internal
Wählen Sie den Agenten, um ein Ticket neu zuweisen, anstatt ihre ID
Ein Textfeld, in das Sie eine rohe Mitglieds-ID getippt haben, in das die "Kredit"-Adresse eingegeben wurde bedeutete bereits zu wissen, die ID der Person, die Sie wollten, für eine Aktion, deren ganze Zweck ist es, den Richtigen zu finden. Es verwendet jetzt MemberPickerDialog, der gleiche Picker hinter dem Manager-Feld auf einem Mitgliedsprofil und der One-Leute-Picker in dieser App. Seine Verzeichnis-Suche läuft serverseitig und passt zu Name, Alias, Arbeits- und Konto-E-Mail, Berufsbezeichnung und Abteilung, so "ana lending" findet die Ana in Lending; jede Zeile trägt genug, um Zwei Menschen gleichen Namens auseinander zu erzählen. Der aktuelle Bevollmächtigte ist über die Ergebnisse, so dass es nicht mitten in der Suche verloren. Mitglieder-IDs überschreiten den genauen Integer-Bereich von JavaScript, so dass die ID eine Zeichenkette von das Verzeichnis zum Draht.
· MediaService
Endpunkte für die automatische Übergabe
GET /sessions/chat/auto-open gibt die Chat-Gespräche des Kunden dieses Mitglieds zurück sollte erhöhen; POST /sessions/{guid'/auto-opened records, die es tat. Die langlebige Gegenstimd des Unterstützungsübergabe, und zwar aus dem gleichen Grund: die Entscheidung gehört zur Plattform, nicht zu einem Browser-Tab sessionStorage. Das Schreiben ist auf die eigene Mitgliederreihe des Anrufers ausgerichtet, so dass der Kunde eines Mitglieds kann nie in Rente gehen und die Serverzeit abstempelt und nicht einen Client-gelieferten Server-Zeit abstempelt Wert - der Vergleich ist gegen Nachrichten-Zeitstempel, die von derselben Uhr geschrieben wurden, und ein verzerrter Browser würde sonst entweder ein Gespräch für immer unterdrücken oder Re-raise es endlos. ChatAutoOpenHqlTest parsiert die Abfrage gegen das reale Entity-Modell und pingt die drei Prädikate existiert dafür. Spring Data validiert @Query nur im Kontext booten, so dass ein Tippfehler sonst als fehlgeschlagenes Start-up oder ein 500 auf einem Pfad auftauchen würde jedes Mitglied trifft bei der Anmeldung; der Test liest die Abfrage von der Anmerkung von Reflexion, so dass es nicht gegen eine abgestandene Kopie passieren kann.
· kamo-shared-library
Langlebbare Aufzeichnung eines Gesprächs, das der Klient selbst angesprochen hat
MediaSessionMitglied gewinnt AUTO_OPENED_AT, neben msgIdLastViewed, weil es die gleiches Korn - eine Tatsache über die Beziehung eines Mitglieds zu einer Sitzung. Das eine antwortet, "wie viel haben sie gelesen"; diese antwortet "wurden sie bereits gezeigt dies, ungefragt". Es ersetzt eine pro-tab sessionStorage-Flagge, die keine Aufzeichnung von irgendetwas war: ein zweites Gerät öffnete jedes Gespräch, das das erste bereits geplatzt hatte, und Clearing-Speicher verloren die Tatsache vollständig. findChatSessionsToAutoOpen gibt die Sitzungen mit etwas zurück, das das Mitglied hat nicht lesen, wo etwas seit der letzten Erhöhung angekommen ist - so ein Gespräch absichtlich ungelesene Haltestellen Wiedereröffnung auf jeder Ladung, sondern kommt zurück, wenn ein wirklich neue Botschaft landet. Nur Chat-Sessions; Support-Tickets haben eigene Übergabe. Die eigenen Botschaften des Mitglieds werden ausgeschlossen, und ein baumelnder msgIdLastViewed Pointer zählt als ungelesen und nicht als eingeholt, weil ein scalar Subquery über eine verschwundene Reihe ergibt NULL und würde als dauerhaft gelesen gelesen lesen.
· kamo-internal
Überholung des Präferenz-Panels
Vier Dropdowns und ein Schalter auf einem Panel gewaschen oben nach unten in der Miete Farbe mit voller Kraft, so dass jede Kontrolle ihren eigenen Hintergrund bekämpfte. Jeder wählen Sie versteckt drei oder vier Optionen hinter einem Klick und wiederholte die gleichen zwölf Linien des Grenzstylings. Die Platte ist jetzt eine Oberfläche, und die Farbe gehört zu dem, was ausgewählt wird. - Jede Option ist auf dem Bildschirm. Das sind vier Einstellungen mit drei bis fünf jeweils kurze Werte; sie anzuzeigen ist schneller zu verwenden als das Öffnen eines Menüs und eine Auswahlkomponente ersetzt vier Blöcke von doppeltem Styling. - Erinnerungszeit und Methode teilen sich eine Karte, denn keines bedeutet nichts ohne das andere. Reminder Offsets sind mono, passend zum Rest der Kalender Behandlung der Zeit. - Der Standard-Kalender zeigt seine Farbe, so wird es erkannt ist in der Sidebar und im Ereignisdialog und nicht nur mit Namen. - Der Kopf bleibt stehen, während der Körper scrollt - mit vier Abschnitten der Titel Sonst scrollt weg. Diese Einstellungen sparen auf Änderung ohne Taste zu drücken, und zuvor gesagt so mit einem nackten Spinner. Es gibt jetzt eine explizite "Saved", die nach verblasst ein paar Sekunden, weil es eine Quittung für die Änderung gerade gemacht, nicht ein ständiger Zustand des Panels. Abschnitte taumeln ein und die Bestätigungsfedern; beide werden unter unterdrückt bevorzugt-reduziert-Motion. Jeder String ist ein vorhandener Schlüssel. Verifiziert mit einer Produktion in einem losgelösten Werksbaum gebaut.
· kamo-internal
Ersetzen Sie die Mailbox Spinner mit einem Skelett, das zusammenbaut
Jeder Ladezustand auf /messages war ein Loader2 auf einer ansonsten leeren Schein - der Boot, die Nachrichtenliste, der Ordnerbaum, der Nachrichtenkörper und die nächste Seite Spanne an Ort und Stelle und erzählte dem Leser nichts über das, was kommen würde. Sie zeichnen jetzt das Ding, das lädt. Jeder Platzhalter kopiert die Geometrie von die Komponente, für die es steht, bis auf die 40px Avatar, der Ordner Einzug und die 104/120px-Nachrichtreihe, die aus dem realen Markup gemessen wird, so dass das Layout nicht bewegen, wenn die Daten landen. Eine Idee trägt die Bewegung: ein Band von Lichtkreuzen jeder Platzhalter von links nach rechts und beginnt einen Beat später auf jeder Reihe darunter, so das Highlight steigt als einziger Diagonalpass ab und nicht als jede Zeile blinkt auf der eigenen Uhr. Reihen steigen in der gleichen Reihenfolge. Das Licht wird von --accent-comms gemischt, dem eigenen Familienakzent des Nachrichtenmoduls, so liest es sich als dieses Produkt und nicht als generische Glosse. bevorzugt-reduziert-Bewegung gliedert das Ganze zu den Barren. Keine neuen Nachrichtenschlüssel: Die Platzhalter melden sich an, um Leser zu screenen durch die drei Ladestränge, die schon da waren.
· kamo-internal
Gäste aus dem Veranstaltungsdialog hinzufügen und entfernen
Das letzte, was der Dialog nicht tun konnte. Es konnte zeigen, wer schon auf eine Veranstaltung, aber es gab keine Möglichkeit, jemanden dort zu setzen - die einzige Gästekontrolle war "update and notify", die Re-Mails Menschen, die bereits eingeladen waren. Gäste werden per E-Mail hinzugefügt, mit ihrem RSVP als farbiger Punkt betitelt aufgeführt mit dem Staat, und entfernt auf Schwebe. Geben Sie einen Gast hinzu, anstatt Das Dialogfenster einreichen, weil Sie in der Mitte der Liste stehen und nicht fertig sind. Die Veranstalter ist gekennzeichnet und kann nicht mit einem gewöhnlichen Gast verwechselt werden. E-Mail-Validierung ist absichtlich freizügig: der eigentliche Test ist, ob Mail zu ihm springt, und ein strengeres Muster lehnt Adressen, die perfekt sind gültig. Es fängt einen offensichtlichen Tippfehler ein, mehr nicht. Der leere Staat lädt ein, anstatt sich zu entschuldigen. Streicher ausgeliefert vor diesem in kamo-translation-dictionary wirft auf einen Schlüssel fehlt von en.json und kamo-internal CI-Klone, die Repo zur Bauzeit, so dass die Landung diese erste hätte eine Kalenderseite, die stürzt ab. Verifiziert mit einer Produktion in einem abstehenden Werksbaum gebaut; eine weitere Sitzung hält das Ein-Baum-Schloss.
· EmailService
Die Gästeliste einer Veranstaltung verwalten
Der Dialog konnte anzeigen, wer bereits auf einer Veranstaltung war, aber nie hinzufügen oder entfernen jeder; die einzige Gastoperation war die Wiedernotifizierung von Menschen, die irgendwie waren schon da. Veranstaltungen akzeptieren nun eine Gästeliste, ersetzt Großhandel auf speichern. Ersetzen Sie eher als zusammenführen, weil der Dialog die Liste besitzt. Ein Gast, der dort entfernt wurde verschwinden hier. Eine Nullliste bedeutet "nicht geliefert" und verlässt die Gäste allein, was ein Client, der nur einen Titel redigiert, sendet. Zwei Dinge, die ein Kunde nicht zu behaupten bekommt, so dass weder von der Anfrage: die RSVP, die der Gast zu geben ist, und die Veranstalter-Flagge, die Aufzeichnungen, wer das Treffen genannt. Beide überleben eine Bearbeitung Zeilen statt sie zu aktualisieren würde jede Antwort zurücksetzen und die eine abstreifen Person erlaubt, die Veranstaltung abzusagen. Die Gäste kommen zusammengeknüpfst zurück. Ein Monat Blick zurückgibt hundert Veranstaltungen, und fragen pro Veranstaltung ist eine Abfrage pro Zeile. Das Löschen einer Veranstaltung entfernt nun zuerst seine Gäste. Sie tragen eine nicht-null Fremdschlüssel zurück zu ihm, so dass die Löschung entweder verwaist oder einmal gescheitert die Datenbank setzte die Referenz durch.
· kamo-shared-library
Batched Gast-Lookup, und delete-by-event
Der Ereignisdialog zeigt an, mit wem ein Ereignis ist, und der Listenendpunkt gibt einen Monat der Ereignisse zu einer Zeit. Die Frage nach Gästen pro Veranstaltung ist eine Abfrage pro Reihe; findByEventIdIn fragt einmal. deleteByEventId ist die erste Hälfte des Austausches einer Gästeliste Großhandel, und eine Veranstaltung ohne verwaiste Reihen zu entfernen, die eine nicht-null ausländische tragen Schlüssel zurück zu ihm.

Euer Universum wartet.
Fügen Sie Produkte hinzu, wann immer Sie möchten – keine Migration, keine neuen Anmeldungen.
Für immer kostenlos – keine Kreditkarte erforderlich