Direkt zum Inhalt
KAMOUniverse

Changelog

Was ist neu?

Jede Verbesserung an der Plattform, wie sie geliefert wird.

  1. · InitializerService

    Geben Sie einem Teammitglied einen Manager

    Fügt MANAGER_ID zu member_team_member hinzu, eine annchbare Selbstreferenz für die Berichterstattung Linie. Nichts ist verfüllt: kein Manager ist eine vollständige Antwort, sowohl an der Spitze der Diagramm und für alle, die einfach nicht zugeordnet sind. Der DROP DEFAULT ist die tragende Anweisung, nicht der ADD COLUMN . ddl-auto: update erstellt die Spalte zuerst. Eine Kolumne zu Member, dessen ID INT8 DEFAULT ist unique_rowid(), erbt diese Standardeinstellung, es sei denn, die Entität pins columnDefinition, die würde jede vorhandene Zeile mit einer zufälligen Manager-ID abstempeln. Das Waisenkind und die Selbstreferenz fegt klare IDs, die eine säumige Spalte bereits geschrieben hätte.

  2. · InitializerService

    DEPTS.PARENT_DEPT_ID für verschachtelte Abteilungen hinzufügen

    Nullable ohne Backfill -- Null bedeutet Top-Level, das ist, was jeder bestehende Abteilung war und die meisten werden bleiben. Erklärt einfach UUID mit einem expliziten DROP DEFAULT. Abteilungen Schlüssel aus UUID DEFAULT gen_random_uuid(), und eine FK-Spalte, die diese Standardeinstellung erbt mit einem zufälligen Elternteil auf jeder bestehenden Zeile gestempelt, verwaist alle von ihnen und Versagen der Zwänge, die folgt.

  3. · SecurityService

    Die Elternabteilung durch Erstellen und Aktualisieren einfäden

    DepartmentService nimmt nun seine Anfrage DTO statt acht positionelle Argumente, so der Elternteil schließt sich der Nutzlast, anstatt immer ein neunter in einer Reihe von gleich-typischen Saiten. Org Soping auf den mutierenden Endpunkten ist unverändert; die eigene Mietung der Eltern überprüfen Sie das Leben im Service neben dem Fahrradwächter.

  4. · kamo-internal

    Zeichnen Abteilungen als Org-Chart mit einem Eltern-Picker

    Die Registerkarte Abteilungen war eine flache Liste, so ein org mit Operationen. Onboarding hatte keine Möglichkeit, dies zu sagen und keine Möglichkeit, es zu sehen. Add/edit bekommt eine Mutterabteilung auswählen, mit dem Namen platziert, weil Abstammung ist strukturell und nicht funktionsfähig. Es bietet den Baum in Render-Reihenfolge und deaktiviert die Abteilung selbst plus alles unter ihm -- das sind genau die Entscheidungen der Server lehnt ab, und eine Wahl anzubieten, die immer versagt, ist schlimmer, als sie nicht anzubieten. Die Liste wird zu einem org-Chart Stachel. Eine Schienensäule pro Ebene, jedes genau ein Symbol chip wide, so dass der Ellenbogen einer Reihe auf der Mitte des Chips der Mutter landet, anstatt in der Nähe it; eine letzte Kinderschiene hält an der Ecke, anstatt weiterzulaufen, was auch immer macht das Ende eines Zweiges sichtbar, ohne Eingerückte zu zählen. Zellen tragen keine vertikale Polsterung -- die Schienen müssen beide Kanten oder die Linienbrüche an jeder Reihe erreichen. Tiefe liest durch Tönung und Typ Gewicht, nicht Chip-Größe, da einheitliche Chips sind, was die Schienengeometrie genau machen. Säulenkopf werden Operator Labels auf einer mattierten Bar, ersetzte die Marke Token mit der Marke. Baumbau lebt in AbteilungTree.ts, so dass die unangenehmen Fälle haben irgendwo zu sein getestet: Ein Elternteil aus unter einem Kind gelöscht macht auf Top-Ebene statt Verschwinden, und ein Zyklus, der die Tabelle erreicht macht statt hängen die Seite. Gescheiterte Speicher melden nun die eigene Erklärung des Servers. Der 4xx-Körper wurde fallen gelassen zugunsten der Statuszeile, die gedreht hätte "eine Abteilung kann nicht sein eigenes Eltern" in "Bad Request".

  5. · kamo-shared-library

    Lassen Sie eine Abteilung unter einer Elternabteilung sitzen

    Abteilungen waren eine flache Liste, so ein Org-Diagramm mit Operationen. Onboarding hatte keine Möglichkeit, dies zu sagen. Abteilung gewinnt eine optionale Selbstreferenzierung Elternteil; Null bedeutet immer noch Top-Level, was jede bestehende Zeile bleibt. Die FK-Spalte pins columnDefinition = "UUID". Links aus, Hibernate kopiert die referenziert primäre Schlüssel-Definition -- UUID DEFAULT gen_random_uuid() -- auf die FK, so dass ein ddl-auto über eine besiedelte DEPTS-Briefmarke jede Zeile mit einem zufälligen Elternteil Die Anpassung an keine Abteilung und die folgende ADD CONSTRAINT scheitert. Der Elternauftrag wird im Service validiert, nicht nur der Picker: Selbsteltern, Zyklen (Zu Fuß nach oben von der vorgeschlagenen Elternteil muss nicht die Abteilung zu erreichen umgezogen), ein Elternteil in einer anderen Organisation und eine unbekannte ID werden alle abgelehnt. Das Löschen einer Abteilung fördert seine Kinder zu ihren eigenen Eltern statt strandet hinter einem baumelnden Hinweis. **************** nehmen Sie jetzt ihre Anfrage DTO statt acht Positionsargumente, was das Hinzufügen eines neunten zu vermeiden lohnte.

  6. · kamo-internal

    Die Felder To/Cc/Bcc zu drei Zeilen wachsen, dann scrollen

    Die Empfängerfelder im Compose-Tool-Fenster waren eine einzelne nowrap-Reihe, die sein musste Seitwärts gezogen zu lesen, und das Fenster ist 360px breit und nicht resizierbar, so ein Drittel Adresse war bereits aus den Augen. Sie jetzt wickeln: Das Feld wächst eine Reihe zu einer Zeit als Chips füllen Sie die Breite, stoppt an drei Reihen, und scrollt vertikal an, dass mit einem schlanken Scrollbar. Das Hinzufügen eines Chips folgt der Eingabe nach unten, so dass der Caret sichtbar bleibt. Die Zeilenkappe ist eine Pixel max-Höhe, berechnet von der gemessenen Chiphöhe, so dass es immer schneidet an einer Zeilengrenze - ein maximierter Komponist und eine maßstabsgetreue Browser-Schrift bewegen sie beide. Das Etikett und die Kontakte Button-Pin in die erste Zeile anstatt in der Mitte schweben eines dreireihigen Blocks. Drops die jetzt besinnliche uneinsichtige "Mode"-Requisite und die horizontale Drag-to-Scroll, für die sie existierte.

  7. · kamo-internal

    Machen Sie org Kreation überlebensfähig, und bieten jede Branding-Option im Voraus

    Der Assistent könnte einen Kunden in einer Weise nicht auf dem Bildschirm erklärt scheitern, und es bat um eine Fraktion von dem, was Einstellungen - Behavior & Labeling aussetzt. Erstellungssicherheit: - Logo- und Hintergrund-Uploads gingen an /api/imaging/upload mit assocType "ORG_LOGO" - nicht an ImageAssocType Konstante, auf einem Endpunkt, dessen assocType ein numerisches Ordinal ist. Der Parser schluckte das Versagen und reichte sie als MY_DOCS ein, so dass das Branding stillschweigend nie existierte. Sie jetzt verwenden Sie die real org Branding Endpoints, einen Aufruf pro Logo-Slot. - Das Telefon/E-Mail des Schöpfers PUT konnte immer nur 403: dieser Endpunkt erfordert Session-Org gleich die org des Mitglieds, und die Sitzung ist immer noch auf der Eltern. Bewegt auf die erstellende Nutzlast. - Post-Creh-Warnungen wurden gesammelt, an /setup/dns als Abfrageparam weitergegeben und von nichts. /setup/dns macht sie jetzt wieder. - Submit wurde nie wiedervalidiert, so Clearing der Name nach Erreichen Review erstellt eine org mit ein NULL-Titel und Alias. - ableitenConfigType lesen Sie die ALLOWED-Altersstufen des Zweigtyps anstelle der gewählten, Stempeln von KIDS_CLUB auf Erwachsenenunternehmen - was die E-Mail- und Telefonkontenwiederherstellung deaktiviert. - Farbvarianten wurden nie abgeleitet, Telefoneingänge wurden gegen VARCHAR(20), abgestanden Alter-Reihe 403'd auf Vorlage, und eine genommene Domain aufgetaucht als nackte 500. Verhalten & Kennzeichnung Parität - alles außer den beiden Hypotheken-Kennungen: Website, Firmenkontakt E-Mail, White-Label-Identität, alle sieben sozialen Profile, die acht eigene Labels mit ihren Erb-von-Eltern-Flaggen, Standardsprache und Währung, Private-Or Sichtbarkeit, Hintergrund-Wasserzeichen, die drei Marken-Selektoren und alle vier Logo-Slots. Zwei neue Schritte (Labels, Einstellungen); Zeitzone bewegt sich zu Einstellungen neben ihren Geschwistern. Alles fährt auf der Kassen-Niveau, nicht auf Anschlussaufrufe: PATCH /org/{id'/branch-titles hat die gleiche Session-Or-Prüfung, die das Mitglieder-Update brach, und eine Transaktion bedeutet die Antworten entweder alle Land oder keiner tun. Führung und Überspringbarkeit: Jede Eingabe hat Hilfe Text geerdet, was der Wert tatsächlich tut. Nur Type und Basics tragen erforderlichen Feldern, und das ist jetzt auf der Step-Header, im Stepper, auf der nwehren, und in der Sidebar mit "Skip for now" auf jedem optionalen Schritt. Außerdem: Einstellungen zerstört nicht mehr org Telefon-Erweiterungen auf speichern, /api/generate-background ist keine länger ein nicht authentifizierter abrufbarer Proxy, und der org-by-id Proxy stoppt, int64 IDs zu korrumpieren.

  8. · kamo-internal

    Schicken Sie die Back-Button des Editors, von wo das Mitglied kam

    Der Wallpaper-Editor war eine Sackgasse - kein Ausweg, sondern die nivellierte Schiene. Beide Eintrag Punkte (die Heimat Top-Bar-Chip und das Mitglied Profil Header Verknüpfung) jetzt stempeln ihre Herkunft auf dem href, und der Redakteur löst, dass in eine zurück Pille in der Augenbrauenreihe: Nach Hause kehrt zum Armaturenbrett zurück, ein Profil kehrt zum Mitglied zurück wessen Seite es war, mit der gestempelten ID anstatt davon auszugehen, dass es die Tapete's Besitzer. Eine nackte URL ohne Stempel fällt auf das Profil dieses Mitglieds zurück. fromId wird gegen die undurchsichtige Form überprüft, so dass eine handwerkliche URL nicht die Button in eine beliebige Umleitung. Lesen Sie es braucht verwendenSearchParams, so dass die Seite Gewinnt die Suspense Grenze der App Router erfordert.

  9. · kamo-internal

    Zeig eine primäre Mailbox unter dem Profilnamen ihres Mitglieds

    Ein Briefkasten, der als primäre von jemandem gehalten wird, ist die Adresse dieser Person, also schlägt sie vor als "Vertriebsschalter" - was auch immer es zufällig als vorgesehen war benennt die Mailbox anstelle der Person. Die Autocomplete-Reihe und der Empfänger Karte beide lasen das gleiche Feld, so dass beide zusammen falsch waren. Das Verzeichnis nimmt jetzt primärMemberName vor der Mailbox-AnzeigeName, und zugewiesenMemberName für eine persönliche Mailbox, deren einziger Empfänger ist seine Besitzer. Aliasen und gemeinsame Briefkästen gehören zu niemandem im Besonderen und halten ihren eigenen Namen. Die Präferenz ist eine pro-source-Liste, so ein Backend, das nicht noch das Feld ausgeliefert fällt einfach zurück auf displayName.

  10. · EmailService

    Benennen Sie eine primäre Mailbox nach dem Mitglied, das sie hält

    Ein Briefkasten jemand hält, wie ihre primäre ist die Adresse dieser Person, so die Darstellung unter dem, was auch immer das Briefkasten bei der Bereitstellungszeit gekennzeichnet war "Sales Desk" für eine Box, die einfach Jane Doe ist . falsch nennt die Person in der Sie machen Autocomplete und auf der Empfängerkarte. listMailboxen trägt jetzt ************ für das Mitglied mit die primäre Zuordnung, die das org-Adressverzeichnis gegenüber dem bevorzugt Mailbox's eigene AnzeigeName. Nur der Primärhalter zählt: ein Mailbox Jemand lediglich hat Zugriff auf ist nicht ihnen und behält seinen eigenen Namen, und die Einstellungen Tabelle gibt den Display-Namen in die eine oder andere Richtung wieder. Die Namensauflösung wird von AccessibleMailboxService in einen gemeinsamen Helfer so dass die beiden Oberflächen nicht darüber streiten können, wie ein Mitglied genannt wird.

  11. · kamo-internal

    Registrieren Sie die Kommissionsseiten in den Einstellungen nörn und Landing Page

    Die Tabs gab es, aber nichts mit ihnen verbunden. ************ ist das warnende Beispiel bereits in diesem Repo: eine echte Seite ohne Karte, ohne Tab und kein nav-Eintrag, erreichbar nur durch Eingabe der URL. Accounting & Finance ist sein eigener Abschnitt und sein eigenes nützen Thema statt zwei weitere Einträge unter Mein Konto. Sub-Optionen tragen kein eigenes Tor, so Falten diese in würde das Konto Tor offen für Finanz-only-Inhaber gezwungen haben und zeigte sie vier Links, die sie nicht verwenden können - die gleiche Argumentation, die phi-Compliance aus hält das Sicherheitsthema. Mit den Finanz-Tabs in ihrem eigenen Abschnitt, das Mein Konto Gate geht zurück zu CONFIGURE_SYSTEM allein. Die persönliche Kommissionskarte ist an die Bedingung geknüpft, dass der Betrachter ein Teammitglied ist, Spiegelung des Tabs eigenes Tor. Eine Karte, die eine Registerkarte öffnet, die nicht gerendert ist schlimmer als keine Karte.

  12. · kamo-internal

    Mitgliedskommissionen Registerkarte und die beiden Finanz-Konto-Tabs

    Reiter (selbstverständlich, nur Teammitglieder): Balance + Ledger, in Auftrag gegeben Chancen, Auszahlung Setup und Auszahlungen. Kontoeinstellungen gewinnen Organisation Streifen und Kommissionsverarbeiter. Der Reiter des Mitglieds ist auf istSelf und das Mitglied TYPE, nie auf einer rechten Seite. checkRight kehrt für alles im aktiven Gott-Modus wahr, und die Seite kannAngelegenheitOtherMemberAccount ORs in unzusammenhängenden Rechten einschließlich ************ - so würde ein richtiges Tor hier eines zeigen Die Kontostände und Bankdaten der Mitglieder für jeden, der eine von ihnen hält. 'Meine Auszahlungen', nicht 'Meine Bank'. Mitglieder haben fast nie ein Stripe-Konto und können nicht fügen Sie eins an, wenn sie es tun: OAuth read_write verweigert Konten von einem anderen kontrolliert Plattform. Die Plattform ihres Arbeitgebers erstellt ein Auszahlungskonto nur Empfänger und sie überprüfen ihre Identität. Das Panel gibt an, was Stripe sammelt, das Stripe hat keine Support-Beziehung mit ihnen, und das Geld dauert etwa 6-8 Kalendertage anzukommen - nichts davon sollten sie danach entdecken. Organisation Stripe ist eine geführte Checkliste, kein Formular, weil Stripe keine API hat um eine Connect-Plattform zu werden. Schritt 6 enthält eine vollständige Warnung statt eines Hinweises: ein Org, dessen Stripe-Saldo auszahlt automatisch verliert den Provisions-Float bevor die Freigabe Job läuft, und jede Übertragung dann scheitert für unzureichende Mittel ohne Stripe-Ereignis, um es zu erklären. Geld ist eine Dezimal-STRING Ende zu Ende und ist nie Number()-ed außer zu wählen Farbe. Negative Beträge sind real - eine ungültige Provision wird ein Unentschieden - und die codebase hatte keine Konvention, um eine zu zeigen, so dass sie im Fehlerton mit ein explizites Minus und ein Draw-Chip. Sub-Tabs synchronisieren mit ?sub=; SettingsView besitzt ?tab= und schreibt es auf jede Registerkarte um. Die BFF-Route existiert, weil CommissionService ClusterIP-only ist - ohne sie ganzes Feature 404s, während jeder Service ist gesund und jeder Build ist grün.

  13. · kamo-internal

    Ordner, auf die Sie einbewerben können, Mails können Sie auswählen

    Rechtsklicken Sie auf einen Ordner für seine Aktionen. Der Menükopf ist nicht chrom es benennt den Ordner und zeigt seine Live ungelesen/total, so Mark alle lesen und Leerer Ordner kann beurteilt werden, bevor sie angeklickt werden, anstatt nach. Aktionen, die nicht gelten können, werden mit dem Grund deaktiviert angezeigt (nichts ungelesene, Ordnerleer leer, eingebaute Ordner behalten ihre Namen) statt Leer und Löschen Route durch eine Bestätigung für die Mail-Chrom gebaut. Die app-weite MUI ConfirmationDialog fordert eine getippte Herausforderung Wort jeder Zeit; eine Herausforderung auf einer erzielbaren Aktion nur Züge Menschen zu tippen durch Warnungen. So ist das Tor für die beiden reserviert, die Post zerstören Sprechen Sie einen Ordner und Entleeren von Trash - und beide nennen die Konsequenz genau: Alles andere bewegt sich zu Trash und sagt es. Ordner nachbestellen per Drag, pro Mitglied, gespeichert in den gemeinsamen ui-Präferenzen Tabelle, so dass die Anordnung folgt ihnen über Geräte. Die Reihenfolge ist eine flache Liste der Ordnernamen: Geschwister werden nur miteinander verglichen, so eine Liste bestellt jede Ebene, und ein Ordner, der umbenannt oder verschoben wird fällt zurück zu seiner natürlichen Position, anstatt einen Baum zu korrumpieren. Drops Über Ebenen werden ignoriert - das wäre ein Reparent auf dem Mail-Server, keine Sorte. Die Auswahl von Mails funktioniert nun so, wie die Auswahl überall sonst funktioniert: Shift-Klick für einen Bereich vom Anker, cmd/ctrl-Klick, um einen herauszusuchen, und der Avatar verwandelt sich in eine Checkbox auf Schwebe, anstatt jede Zeile zu besteuern mit einer permanenten Checkbox-Spalte. Die Aktionen fahren in einer Bar, die schwimmt über die Liste und verlässt mit der Auswahl, anstelle eines Streifens verkeilt in den Chrom, der die Liste nach unten auf jede Zecke geschoben. Auch: die Manage Folders Fußzeilen ist weg - der Knopf neben den Ordnern Überschrift erstellt bereits Ordner - und der Refresh-Button ist schließlich quadratisch. CSS konnte das nicht alleine tun: In einer Flex-Reihe löst sich die Hauptgröße vor align-self:Stretch gibt dem Gegenstand seine Höhe, so Aspekt-Quadrat hatte keine Höhe, um eine Breite abzuleiten. Stattdessen misst er den Streit.

  14. · EmailService

    Handeln Sie auf einen ganzen Ordner, nicht nur die Seite, die Sie gescrollt

    Markieren Sie alle gelesen und Leer Ordner sind ordnerweite Operationen der Client kann nicht ausdrücken durch Stapeln uids: es hält immer nur die Seite, die es hat gescrollt, so dass ein Ordner mit 4.000 ungelesenen 80 Rundreisen machen würde und immer noch alles vermissen, was es nie geladen hat. FolderManager gewinnt setFolderSeen und emptyFolder. Der IMAP-Pfad kippt Flags in einem serverseitigen Anruf und berührt nur Nachrichten, die tatsächlich nicht mit dem Zielzustand - eine Decke gesetztFlags neu schreibt Flaggen Server hat bereits und macht jeden angeschlossenen Client umsonst. Graph hat keine Bulk-Äquivalent, so geht es den Ordner und PATCHes; die Filter schrumpft, wie es geht, so liest es die erste Seite statt paging mit $skip, die über Elemente der vorherigen Charge nur Schritt würde Aus dem Ergebnissatz ausgeflippt. Seine Schwung Decke ist protokolliert, nie still. Leeren hält Trash besonders: Müll ist für real, jeder andere Ordner verschiebt seinen Inhalt in Papierkorb und bleibt erneuerbar. Graph's DELETE verhält sich bereits so, also kein Ordner-Name-Sonder-Casing gibt. Beide Endpunkte geben zurück, wie viele Nachrichten verschoben, so dass die Benutzeroberfläche sagen kann "markiert 240 lesen" von "nichts zu tun", und veröffentlichen Sie nur eine Änderung Ereignis, wenn etwas hat sich tatsächlich geändert.

  15. · SecurityService

    Browser-Relais für die Provisionsfunktion

    Löst die Sitzung, autorisiert und an CommissionService mit der org weiterleitet und Mitglied gestempelt von dieser Sitzung - nie von etwas, das der Anrufer gesendet. Das ist die einzigen Platzrechte sind geprüft: SecurityService führt anyRequest().permitAll() mit handgerollter Person und einem neuen Auftragsteller, also ein Endpunkt, der seinen Scheck vergisst, verfehlt OPEN und ist über das öffentliche API-Relais erreichbar. Drei Rechte statt eines, so dass Trennung von Pflichten ausdrücklich ist: mit einem einzigen grant, wer eine Provision ausgibt, könnte auch die Auszahlung freigeben und die stornieren halten, die existiert, um sie zu fangen. Geldbewegungen und Auszahlungs-Dörse-Aktionen hart-verweigern unter Imitation. Imitation prägt eine volle Sitzung als willkürliches Mitglied, so ohne diese Ablehnung ein Gott Admin könnte als jemand eingeben, Punkt Auszahlungen bei ihrer eigenen Bank, zurückziehen, und brechen Sie den Halt auf. Der Eigentümer der Organisation ist ein impliziter Inhaber. Ein brandneues Recht wird eingeräumt Niemand an dem Tag, an dem es entfaltet - auch für jeden, der die Funktion einschalten könnte also ohne einen Eignerzweig die Funktion Schiffe ruhend und unerreichbar. /me/opportunities wird hier serviert, anstatt weitergeleitet, weil SecurityService besitzt das Modell der Möglichkeiten; auch die Registrierung dieser Projektarchive in CommissionService würde ein Shared-Bibliothek Modell zwei Autoren geben. Es Gewerkschaften der Mitglieder gespaltenen Streitigkeiten mit den Reservierungen, wo sie der primäre Agent sind, weil der Agenten eigenen Provision produziert keine geteilte Zeile und eine Abfrage, die nur eine Seite überprüft, versteckt sich leise Die Einnahmen eines halben Mitglieds.

  16. · kamo-shared-library

    Finden Sie ein Mitglied der Kommission Splits für ihre eigenen Provisionen Ansicht

    Org-scoped anstatt auf das Mitglied nur eingelassen: ORG_ID wird darauf dupliziert Tabelle so eine Zeile kann nie gelesen werden Cross-Tenant von id, und ein Sucher, der es ignoriert würde das stillschweigend rückgängig machen. Nur die Hälfte der "Möglichkeiten, die ich verdiene" - die Reservierungs-Level-Kommission gehört an den Hauptvermittler und produziert keine geteilte Reihe überhaupt, so Anrufer müssen diese Gewerkschaft mit den eigenen Reservierungen dieses Agenten. Dokumentiert auf der Methode, so dass der nächste Anrufer nicht versenden eine Ansicht, die stillschweigend versteckt die Einnahmen eines Mitglieds.

  17. · kamo-internal

    Machen Sie die Mitgliederoberfläche zu einem echten Kamo-Datengitter

    Die Pakete des Mitglieds waren eine Kartenliste ohne Bewegung, was nicht der Rest ist von Kamo-Looks. Dies ist jetzt das Haus AG-Netz: Ausstehende und Fertige Sub-Tabs synchronisiert mit ?sub=, serverseitiges paging Ende zum Ende (page/size/Status erreichen DocsService anstatt eine 200-Reihen-Kappe zu schneiden), die Pane zu füllen, anstatt die Größe in ihre Reihen zu schneiden, und kein Titel - die Einstellungen Registerkarte bereits benennt es. Status liest sich auf einen Blick und nicht als grauer Chip: Ein Fälligkeitsdatum trägt seine eigene Dringlichkeit, und Wartezeiten auf-andere und inhaltsgeändert sind lesbare Zustände statt Verborgene. Bewegung wird zurückgehalten und auf useReducedMotion gated.

  18. · kamo-internal

    Zeigen Sie den Namen des Mitglieds ohne "Hi", Präfix

  19. · DocsService

    Serverseitige Abtaging für die Mitgliederzuweisung

    Die Mitgliedsoberfläche fragte nach MAX_SIZE bedingungslos und schnitt das Ergebnis in der Browser, so dass ein Raster, das eine Seite zeigte, hatte bereits eine ganze heruntergeladen Beschäftigungsgeschichte, um es zu bauen. Beide Mitglieder-Leser nehmen jetzt Seite/Größe und die Auflistung der Seiten in der Datenbank. Spec.status (one enum) wird zu Spec.statuses (ein Set) und der Drahtparameter bleibt "Status", jetzt eine CSV annehmen. Das ist der Punkt: Das Mitgliedsraster fragt nach einem BUCKET - die drei OPEN_STATEN, die noch Arbeit schulden, oder die vier Terminals . und ein Single-Wert-Filter kann auch ohne drei Rundfahrten pro Seite. Ein Token analysiert zu einem Ein-Element-Set, so dass das HR-Grid vorhanden ist status=EXECUTED ist äude-identisch auf dem Draht und benötigte keine Client-Wechsel. unbekannte Token in einer Liste ist ein 400 Benennung des Token, nie eine still fallen gelassen filter: ein Konformitätsraster, das behauptet, gefiltert zu werden, während alles zeigt das schlechteste verfügbare Ergebnis. clampPage/clampSize sind belichtet, so dass die Mitgliedsleser die SAME-Regel durchgreifen als HR-Gitter statt der Weitergabe MAX_SIZE wörtlich, das ist, wie ein "paged" endpoint leise wird ein grenzenloses. listMine vorwärts seine paging ohne Re-Derivierung, so dass die Klemme einmal existiert. Die Genehmigung ist unangetastet und die Tests heften es: Mitglied Endpunkte bleiben auf memberGuarded() + LegalAssignmentOwnership, HR-Endpunkte bleiben auf bewacht() + LegalPackageAccess und die drei neuen @RequestParams werden namentlich geltend gemacht genau status/page/size - der ganze Grund, warum diese Oberfläche sicher ist, ist, dass nichts darauf benennt eine Person. Keine Schemaänderung. Keine neue Einheit. mvn -o Test: 391 Tests, 0 Ausfälle, 0 Fehler (war 379).

  20. · kamo-internal

    Persönliche E-Mail-Benachrichtigungskarte ersetzt die Registerkarte Benachrichtigungen

    Beide Schalter bewegen sich auf Mein Profil in der gleichen Form wie die Passwortkarte: eine Karte, eine Symbol-Fliese und helfen Text pro Zeile, und eine getönte Einlage, die nur erscheint, wenn ruhige Stunden sind auf. Keine Header Edit - die Schalter speichern sich, debounced, genau wie der Tab tat. Die Karte führt mit, wo die Mail geht, denn das ist das Teil Mitglieder falsch: Mitteilungen sind an die Adresse auf ihrem USER-Konto, die die Karte benennt, und niemals an die Mailbox gesendet Organisation zugewiesen ihnen - ein Mailbox, das sie müssten sich anmelden, um zu lesen, das ist die Sache die Mitteilung sagt ihnen zu tun. SecurityService gibt diese Adresse nur an das Mitglied es gehört zu, so fällt die Note zurück zu einer unbenannten Form, wenn sie abwesend ist. Nur Teammitglieder: der Notifier bedient interne Chat- und Support-Tickets, was ein einfaches Mitglied tut nicht in arbeiten. Selbst-nur neben, da die Präferenz Route ist me-scoped und auf jemand anderes Profil diese Schalter würden die eigenen ruhigen Stunden des Admins zu bearbeiten.

  21. · SecurityService

    Entwenden Sie die Benutzer-Akcount-E-Mail auf Ihrem eigenen Mitgliedsprofil

    Die persönliche E-Mail-Benachrichtigungskarte des Profils muss die Adresse verpasste Mitteilungen benennen tatsächlich erreichen, und diese Adresse ist das Benutzerkonto - nicht das Feld "E-Mail" daneben, das ist die Mailbox, die diese Organisation dem Mitglied zugewiesen hat. Zurückgeschickt nur, wenn die Sitzung eine eigene Mitgliedsreihe liest. Eine persönliche Adresse ist nichts Ein Admin sollte das Profil eines Kollegen abziehen, und kein anderer Anrufer hat einen Grund, es zu wollen.

  22. · kamo-internal

    Accounting & Finance Berechtigungsgruppe und Finanzrecht Zugriff auf Kontoeinstellungen

    Die Access Security und Administration Gruppen existierten nur in SecurityRoleManager als Inline-Namenslisten, also JobTitleManager, DepartmentManager und RolesPermissionsTab lumped jeden ServiceType-less rechts in General. Anstatt ein viertes Exemplar hinzuzufügen, die Gruppendefinitionen bewegen sich zu permissionGroups.ts und alle vier Redakteure lesen sie. isGeneralPermission ist der Grund, der zählt: Filterung auf !serviceType würde ein geschnitztes Recht zweimal machen, einmal im Allgemeinen und einmal in seinem eigenen Abschnitt, so dass eine Einstellung zwei unabhängige Kipps. MembershipPermissionsTab ist absichtlich unangetastet - seine allgemeine Berechtigungen Liste ist ein hartkodierter Lese-/Schreiben/Löschen/Admin-Mock, keine echten Rechte. /settings/account und sein Landeteil räumen nun auch die Finanzierungsrechte ein. Ein Controller, der nur MANAGE_ORG_FINANCES hält, würde sonst umgeleitet direkt zurück zu /Einsätze; Verbreiterung nur einer der beiden würde die Seite verlassen erreichbar per URL, aber im niv unsichtbar.

  23. · InitializerService

    Migration für die Provisionsvorträge und Stripe-Auszahlungstabellen

    Spiegel com.kamo.z.shared.commission. ddl-auto würde diese aus der Anmerkungen sowieso; die explizite DDL ist die Hauskonvention und macht die Form an einem Ort und nicht in einem Dutzend Entitätsklassen überprüfbar. COMMISSION_STRIPE_WEBHOOK_EVENT ist ein Tasteneindruck (ORG_ID, STRIPE_EVENT_ID), nicht auf die Veranstaltung id allein. Jede Organisation betreibt ihre eigene Stripe Connect-Plattform, so Event-IDs müssen nur innerhalb eines Kontos einzigartig sein - LOAN_STRIPE_WEBHOOK_EVENTS Tasten auf der nackten ID und ist nur deshalb sicher Funktion hat ein einziges Stripe-Konto. Gegen Prod angewandt; alle neun Tische und jede einzigartige Wache überprüft vorhanden.

  24. · SecurityService

    Die Finanzierungsrechte an der ADMINISTRATOR-Vorlage jedes Zweigmodells

    Die drei Kommissionsrechte Gate eine Funktion, die vorher nicht existierte, so NEW_RIGHT_SEEDS sagt absichtlich nichts über sie - dieser Mechanismus trägt eine bestehende Zuschuss vorwärts, so dass eine Einsatz nie still REMOVES Zugriff, und mit ihm hier würde Geld bewegende Macht an Leute übergeben, die sie nie hatten. Was sie stattdessen brauchen, ist ein Rollen-Typ-Standard, der nicht existierte. Zwei Teile: - templateSeedSettingFor gewinnt eine DefaultRoleType Überlastung der Finanzierung Rechte nur an ADMINISTRATOR-Vorlagen. GRANTED, nicht FORCE_GRANTED: ein Org muss bleiben in der Lage, ein Geld rechts von einem Administrator auf ihr Mitglied zu widerrufen Profil, und FORCE_GRANTED überschreibt jede spätere Schicht des Wasserfalls. - sicherstellen, dass die ADMINISTRATOR-Reihe für Modelle, denen eines fehlt, die eine Funktion erstellt. Standard-Rollenzeilen sind faul, erstellt nur, wenn jemand die Standardeinstellungen eines Modells speichert, und syncSecurityModelRoleRights iterates diese Tabelle - ohne diese Die Voreinstellung würde für jedes Zweigmodell gelten, außer für die nie eingewohnten, schweigend, und das sind diejenigen, auf die man sich am ehesten verlassen wird.

  25. · kamo-shared-library

    Team-Mitglied Provisions- und Stripe-Auszahlungs-Domain

    Fügt com.kamo.z.shared.commission hinzu: ein Append-only signiertes Ledger, ein pro Mitglied Balance-Zeile, die nur existiert, um gleichzeitige Entnahmen zu serialisieren, die Kommission Prozessor Batch/Line-item-Modell und das pro-Ort Stripe Connect Auszahlungsunternehmen. Drei Entscheidungen, die es wert sind, behalten zu werden: - Das Ledger ist anhänglich und setzt es in Java durch (@PreUpdate/@PreRemove zu werfen). @Column(updatable=false) macht Hibernate nur eine Spalte aus der UPDATE, es macht nicht das Schreiben scheitern, so dass eine abgestandene Korrektur aussehen würde wie es gelungen ist. Korrekturen sind Rückwärtsstränge. - Verfügbar vs pending ist eine Abfrage über EFFECTIVE_AT, nicht eine Zustandmaschine. A Provision ausgestellt heute mit dem nächsten Monat Fälligkeit bewegt sich auf seine eigenem, so dass keine Sweep existiert, die scheitern könnte und Strand Geld als anhängig. - COMMISSION_MEMBER_BALANCE ist mit dem Ledger durch Konstruktion redundant. Es existiert, weil ein Waage ein Aggregat ist und SELECT FOR UPDATE nicht sperren kann aggregativ; ohne eine Zeile, um PESSIMISTIC_WRITE aufzunehmen, zwei gleichzeitig Abhebungen bestehen beide ihre eigene Sündprüfung. Geld ist NUMERIC(19,4) durchgehend, org IDs sind einfache INT8 Spalten anstatt Verbände so finanzielle Aufzeichnungen überleben Mitglieder Churn, und ORG_ID wird dupliziert auf Kinderreihen, so dass kein Single-Rhe holen kann Cross-Mieter lesen. Fügt auch drei Rechte (187-189) für die Finanzfläche hinzu. Sie sind so gespalten Trennung der Pflichten ist ausdrücklich: mit einem Recht die Person, die eine Provision könnte auch die Auszahlung freigeben und stornieren Sie den Halt, der existiert, serviceType ist absichtlich null - ein neuer ServiceType würde Gruppe sie automatisch aber machen sie in keinem Editor, da nur App-Sektionen erscheinen, wenn die org diese App aktiviert hat. Schema über KamoInitializer angewendet; alle neun Tabellen in Prod vorhanden mit ALLEN Berechtigungen für den Kamo-App-Benutzer.

  26. · kamo-internal

    Falten Sie MFA in die Passwortkarte und lassen Sie die Registerkarte Anmelde-Sicherheit

    Zwei Orte stellten eine Frage - wie komme ich in dieses Konto - so der zweite Faktor lebt jetzt neben dem Passwort auf Mein Profil, in einer Karte mit dem Umtitel "Passwort & Multi Factor Authentication". Der Anmeldefluss bewegt sich aus der Registerkarte in **************** chrom-frei, so dass es gibt als Zeile statt als Seite ab: Statuspille, nummerierte QR/Sekret und Codeschritte in einem Einschub, und derselbe unverständliche Wiederherstellungs-Code-Dialog. Der Kartenkopf trägt keine Edit-Taste jetzt, dass es besitzt zwei unabhängige Aktionen - die Passwort-Reihe hat ihr eigenes "Passwort ändern", die MFA-Reihe ihre eigene "Turn on". MFA bleibt selbst-only aus dem Grund, der Tab war: SecurityService MFA Endpunkte lösen den Benutzer aus der Sitzung des Anrufers und nehmen Sie keinen Benutzerparameter, so dass ein Admin auf dem Profil eines anderen würde werden Sie ihre eigenen Authentifizierung einschreiben. Passwort-Änderung ist breiter (MANAGE_MEMBER_SECURITY, Gott), so dass Zeile allein gibt. Passwort-State wechselt zur PasswordSecurityCard, die einen toten Zweig auf dem Weg fixiert: die alte Karte im Vergleich eines *übersetzten* PasswortersErr gegenüber englischen Literalen, so dass "aktuelles Passwort falsch ist" nie erreichte das Feld, zu dem es gehörte. Der Fehler trägt nun sein Feld.

  27. · kamo-internal

    Die eigenen Mailboxen, Aliasnamen und gemeinsame Postfächer der Orgs

    Der Empfänger Autocomplete kannte nur Kontakte und Adressen aus der Gespeicherte Mappe, so dass die eigenen Adressen der Organisation - alles verwaltet auf ************ - musste aus dem Gedächtnis getippt werden. Neue GET /api/email/Verzeichnis-Fans zu den vier EmailService-Quellen hinter diese Seite und gibt eine entduzierte Adressliste zurück. Aggregated Server-Seite, weil Jeder dieser Anrufe verbraucht seine eigene Einmal-Taste; aus dem Browser wäre es vier OTK Rundreisen jedes Mal, wenn ein Komponist öffnet. Jede Quelle degradiert auf seine . Die Liste ist im Speicher zwischengespeichert und lokal abgestimmt orgs haben Dutzende von diesen, nicht Tausende, und ein Abfrageparameter pro Tastendruck würde eine Netzwerk-Rundreise in setzen vor Vorschlägen kann der Browser bereits antworten. Org passt also Farbe sofort, während der Kontakt und Sent-Lodling-Suche noch im Flug sind, und sie führen den Dropdown: es ist eine kleine genaue Menge, und eine interne Adresse, dass sitzt auch in einem Kontaktbuch sollte als Mailbox gelesen werden, nicht die Kontaktkarte. Das Bearbeiten von Mailboxen in den Einstellungen lässt den Cache fallen, so dass eine neue Adresse angezeigt wird ohne Nachladen. Die Basis-URL- und Vorwärtshilfen von EmailService bewegen sich so aus der Catch-All-Route die neue Route prägt ihr OTK auf die gleiche Weise, anstatt eine zweite Kopie zu behalten.

  28. · kamo-internal

    Eine Mailbox-Ansicht und eine Spalte, die alle Liste ist

    Der Conversational/Classic Toggle ist weg und jedes Mitglied bekommt die klassische Liste. Gesprächsansicht trug eine eigene Liste, einen eigenen Faden Pane und seine eigene API-Oberfläche für eine zweite Art, das gleiche zu lesen mail - alles gelöscht, zusammen mit dem localStorage-Modus ist es erinnert pro Browser. Der Kopf der Listenspalte ging mit. Der Ordnername, sein Icon, Beschreibung unter ihm und die Refresh-Taste waren sechs rems von Chrom über eine Liste, die die Höhe wollte, und der Ordnerbaum sagt bereits welcher Ordner geöffnet ist. Suchen und das Filterfeld in den Ordner bewegen Sidebar, über dem Etikett Ordner, so dass die Listenspalte ist nichts anderes Liste. Der Refresh-Button kehrt neben dem Mailbox-Sender als quadratisch: Elemente-Stretch auf der Zeile und Aspekt-Quadrat auf der Taste machen seine Höhenspur der Schalter und seine Breite Spur seiner Höhe. Es sitzt neben der Single-Mailbox-Karte auch, so dass ein Mitglied ohne Dropdown verliert nicht die Auffrischung. Filter fallen auf eine Spalte - zwei Auswahlen nebeneinander passen nicht 320px Sidebar. Ein SMTP-only-Anbieter hat keine Ordner Sidebar, so dass es das Suchfeld bleibt über der Liste, anstatt zu verschwinden. Schnüre für die entfernten Flächen werden von allen 22 Orten in geschrubbt kamo-translation-dictionary (61fdfcf, zuerst geschoben). from/to/cc/noContent bleiben - die Lead-Kommunikations-Registerkarte macht sie.

  29. · SecurityService

    Kontakt-E-Mail aus der Dienststelle

    Das Interaktionszentrum benötigt die Adresse eines Mitglieds, um einen Komponisten vorzubefüllen und der einzige Endpunkt, der einen trug, war das ein-köpfige Detail holen. Anfrage pro sichtbarer Reihe. EmbEmail ist in die Mitgliedsreihe eingebettet, die die Liste schon lädt, also kostet es hier nichts zu servieren und entfernt das N+1.

  30. · kamo-internal

    E-Mail an ein Mitglied direkt aus der Reihe

    Das Aktionsdock der Reihe konnte chatten, sich treffen, wählen und ein Profil öffnen - das eine Sache, die es nicht tun konnte, war eine E-Mail zu starten, so erreichen einen Kollegen per Post bedeutete, das Panel zu verlassen, den Komponisten zu öffnen und seine Adresse neu zu tippen. Fügt eine Mail-Taste neben den anderen, die das Composer-Tool-Fenster öffnet mit dem Mitglied bereits im To-Feld. Die Adresse fährt im by-department-Numload (EmbEmail ist in der Mitgliedszeile, so dass es keine Extrakosten kostet Abfrage) anstatt einer pro-Reihe Detail holen, und das Modul / rechts Tor ist einmal in NavTopPanel statt pro Zeile behoben.

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