Changelog
Was ist neu?
Jede Verbesserung an der Plattform, wie sie geliefert wird.
· SecurityService
Die Berechtigungsgrenze für die Einrichtung von Lohnabrechnungsanbietern
Relays die neue ************ Oberfläche und erzwingt, wer kann es zu erreichen. TimecardService hält den Motor und keine Sitzung; diese hält die Sitzung und entscheidet. SecurityService läuft anrequest().permitAll() mit Handgerollt pro Handler auth, so dass ein Handler, der seine Wache vergisst, nicht schwach ist kontrolliert - es ist unkontrolliert und aus dem öffentlichen Internet zu erreichen. Gemaegt unter dem bestehenden /api/security/payroll prefix absichtlich: kamo-intern erreicht es durch eine Catch-all BFF-Route, und ein neues Präfix würde 404 in der Browser, während jeder Dienst ist gesund und jeder Build ist grün. Vier Stufen: - MANAGE_PAYROLL_PROVIDER (199) schreibt Anmeldeinformationen und verbindet oder trennt OAuth. Dies ist die Fähigkeit, zu entscheiden, wo die Stunden einer Organisation sind übertragen, deshalb ist es sein eigenes Recht. - MANAGE_HRS_SETTINGS (45) liest die Verbindung und ihre Gesundheit. - MANAGE_TIMECARDS (183) deckt Mitarbeiter-Mapping und Synchronisierungshistorie ab. - FINALIZE_PAY_PERIODS (198) überträgt eine engagierte Charge - die gleiche Stufe wie den Export zu begehen, weil es der gleiche Akt ist. Test Connection sitzt mit dem Schreiben rechts statt der gelesenen: es ist ein ausgehende Anruf mit gespeicherten Anmeldeinformationen gemacht, und lassen Sie jeden, der die anzeigen kann Seite Feuer es gibt ihnen eine Möglichkeit, die Org Lohnabrechnung Anbieter zu ergründen. Die OAuth-Austausche leitet KEINE org-ID weiter. TimecardService nimmt es aus der HMAC-signierte Zustand, so dass ein Code für einen Mieter erhalten kann nicht eingelöst werden gegen einen anderen sogar von einem Anrufer, der das Recht in beiden hält. Fügt Put/Löge zu TimecardServiceClient hinzu, der nur erhalten/post hatte.
· kamo-shared-library
Die Payroll-Provider-Domain hinter der Zeitkarten-Engine
Fügt die Persistenz Wirbelsäule für die Verbindung einer Organisation Timecards zu einem Gehaltsabrechnungssystem von Drittanbietern: die Verbindung und ihre verschlüsselte pro-Org-Konfiguration, die OAuth Grant, der Member-to-Provider-Mitarbeiter-Link, die Earning-Code-Karte, und die beiden Append-only-Aufzeichnungen (Versweiden und Synchronisationsprobleme), die machen eine synchronisierbare Nachhinein. Kept inside com.kamo.z.shared.hr.timecard anstatt ein neues Paket auf Zweck: Ein neues Shared-lib-Paket muss drei separaten expliziten @EnableJpaRepositories Listen, und das Weglassen eines abgebrochen einen Service-Kontext - oder, in KamoInitializer, brach den Lauf ab, während noch BUILD SUCCESS berichtet. Anmerkungen zur Form: - PayrollProviderType verwendet das bereits dokumentierte Token-Vokabular ************ (ADP_WFN, PAYCHEX, GUSTO, ...). Eine zweite Rechtschreibung für den gleichen Anbieter würde Exporthistorie ohne Fehler aufteilen überall. ADP_RUN und QUICKBOOKS werden gehalten, weil der Lohn-Export-Bildschirm hat sie angeboten, da es ausgeliefert, so lebende Reihen können sie tragen. - Mitarbeiter-Links werden vom Anbieter, nicht durch Verbindung, so wechseln Anbieter und Rückwärtssing wirft die Mapping-Arbeit nicht weg. ZWEI einzigartige Einschränkungen: Eines hält ein Mitglied an, das zwei Links hält, der andere stoppt zwei Mitglieder beanspruchen einen Provider-Mitarbeiter - dass man eine Doppelbezahlung verhindert. - PayrollDispatch und PayrollSyncIssue sind WORM. Eine Gehaltsabrechnungsübermittlung Versuch ist ein Geld Ereignis; "wir haben es geschickt, dann haben wir es wieder" ist die Tatsache, eine Versöhnung braucht. - Credentials live in ONE verschlüsselt config_json blob anstatt einer Spalte pro Feld, so dass das Hinzufügen eines Anbieters ist keine Schemaänderung, die jeden Dienst wiederbewaffnet. RoleRightType gewinnt MANAGE_PAYROLL_PROVIDER (199) - absichtlich NICHT die legacy MANAGE_PAYROLL (40), das heute nichts abstört und bereits von gehalten wird unbekannte Anzahl von Mitgliedern; Wiederverwendung würde es Hand Drittanbieter-Gehaltsabrechnung Anmeldeinformationen zu jedem Rate-Viewing-Rechtshalter auf dem Boot, der es ausgeliefert. PlatformOProviderType gewinnt die sieben Lohnabrechnungsanbieter, bei denen Kamo einen hält Partnerregistrierung (ids 11-17). Dayforce, Workday und UKG stellen Anmeldeinformationen aus pro Kunde und absichtlich keine Konstante: der Plattform-Bildschirm macht eine Karte für jede Konstante, so dass eine für sie wäre ein Formular kein Betreiber könnte ausfüllen. Behebt auch eine abgestandene Behauptung in BillingDelegationModeTest: begehen 9276487 absichtlich gemacht REQUIRES_APPROVAL erlauben Gruppen (der Ausschluss gemacht Zulassungsweg unerreichbar), aber ließ den Test behauptet das alte Verhalten, so die Suite ist seither rot auf main. Schema hat sich vor diesem Vorstoß in Yugabyte beworben und verifiziert.
· kamo-internal
Eine Wand bei "jetzt" und eine Karte, die einen abgesagten Punsch erklärt
Niemand kann die Zeit aufzeichnen, die er noch nicht gearbeitet hat. Eine Kante ziehen, ein gleiten ganze Spannweite, Nudging mit den Pfeiltasten, dem Magneten, dem Rechtsklick-Block und das Handbuch hinzufügen Dialog alle stoppen in der aktuellen Minute auf der heutigen Zeile, und ein Zukunft Tag akzeptiert nichts überhaupt. Der Teil von heute, der nicht passiert ist geschlüpft, weil "Sie nicht ziehen eine Pille hier" muss sichtbar sein VOR jemand Kontrolle, nicht in der Regel. Der Server hat bereits einen Schlag eingefügt oder korrigiert Vergangenheit jetzt, die ist genau warum der Kunde dies brauchte: ohne die Wand gelang der Schlepper, Pille saß dort suchen inszeniert, und die ganze speichern scheiterte am Ende mit einem Nachricht über einen Schlag, den das Mitglied nicht finden konnte. Der Magnet bekommt die gleiche Wand. Ein Schlag, der in Zukunft von einem falschen Gerät hinterlassen wird Uhr war ein legitimes Schnappziel, so dass eine Kante nach vorne gezogen werden konnte und landen irgendwo die speichern würde verweigern. Und die Bestätigungskarte bleibt jetzt offen, wenn ein Punch CANCELS aus dem vor ihr, die TimecardService begann tun heute Morgen für jede Umkehrung innerhalb eines Minute. Ohne dass das Mitglied eine Taste drückt, beobachtet den Staat Snap zurück genau, wo es begonnen hat, und vernünftigerweise schließt die Taste ist gebrochen. In dass die Karte lässt seine Picker und seine Aktion Kopie, zeigt einen Satz und eine Taste, und stoppt Entlassung auf dem Hintergrund - die streunenden klicken, dass so oft folgt eine Bestätigung darf nicht schließen die einzige Erklärung, was passiert ist.
· kamo-internal
Geben Sie die Unterstützung und soziale Fenster der Mitglied Chat-Komponist
Ein Support-Ticket und ein Social DM sind dasselbe wie ein Mitgliedschat Mediensitzung mit Nachrichten darauf - aber sie wurden durch eine nackte beantwortet Textfeld. Ein Agent konnte einen Screenshot von einem Kunden geschickt werden und hatte keine Möglichkeit um einen zurück zu senden: keine Attach-Taste, kein Drag-Drop, keine Paste, kein Emoji, und ein Input, der nicht über eine Linie hinaus wachsen würde. Beide machen nun den Komponist des Mitglieds-Chats, also die Upload-Maschine, Befestigungsstab, das Transfer-Panel, der Emoji-Picker und Enter-to-send sind eine Umsetzung in allen drei Bereichen. Erhalten und gesendete Anhänge Render in die Blasen über den gleichen AttachmentChip. Zwei Dinge, die das Tabbed-Unterstützungsfenster ins Offene herausgezwungen hat: - Entwürfe werden pro Gespräch geparkt (useDraftParking). Ein Komponist dient mehrere Tickets und die Senden Beiträge an wer auch immer auf dem Bildschirm ist, so dass ein Entwurf links in der Box ist ein Kunde Worte auf einen anderen ausgerichtet. Rückwürfe nach einem Senden nimmt die Taste, mit der der gesendet wurde, oder das Wechseln Tabs mitten im Flug würde wischen die Antwort, die an jemand anderen getippt wird. - Inszenierte Anlagen werden auch pro Sitzung abgehalten. Eine flache Liste legte einen Kunden Datei in der Tray eines anderen und lädt es dort; uploadAll richtet sich jetzt an die Sitzung die Dateien inszeniert wurden, was auch immer Registerkarte ist im Blick, wenn es landet. Soziale Antworten sind auf eine Datei von 10 MB gedeckelt: eine Nachricht trägt eine einzige MediaObjSocialRef, so dass ein zweiter Anhang gespeichert und nie weitergeleitet werden konnte, und 10 MB ist die engste Anbieter-Denpest, die wir durch senden. Verweigerung in der Komponist schlägt es leise zu verlieren. Ein fehlgeschlagener Senden wird nun separat von einem fehlgeschlagenen Upload gemeldet - die Dateien sind Die Botschaft ist es nicht, und der Entwurf ist immer noch da, um es noch einmal zu versuchen.
· kamo-internal
Speed dial listet die Diensterweiterungen der org
Der Tab lieferte sechs erfundene Einträge - Verkaufsteam auf 1001, ein Konferenzraum permanent klingeln - so Wählen man erreicht, was passiert ist, um zu beantworten, dass Erweiterung, und die BLF-Abzeichen berichtet Präsenz nichts wurde abonniert. Es liest jetzt /api/security/departments und listet jede Abteilung auf, die die org hat gegeben eine Erweiterung, sortiert nach Titel, mit der Außennummer unten, wenn Eins ist gesetzt. Lade-, Leer- und Retryable-Fehler-Staaten ersetzen die Kacheln, die könnte nie leer sein. Das GET ist org-scoped und braucht kein Recht, und es brennt nur einmal, wenn der Tab zum ersten Mal geöffnet wird.
· kamo-internal
Chat, Social, ai-chat und komponieren Sie Fenster zur Unterstützungsgröße
Das Support-Ticket-Fenster öffnet sich bei 460px, während Mitglied Chat, Social Chat, AI-Chat und der E-Mail-Komponist saß alle bei 360-420. Gleiches Dock, gleiche Art von Inhalten - sie teilen Sie sich jetzt die 460px-Voreinstellung des Unterstützungsfensters (und einen 420px-Boden für den resizable die), so dass sich eine Reihe offener Werkzeugfenster anstelle von Treppenstufen aneinander reihen.
· kamo-internal
Zeigt unsichtbare Nachrichten auf jeder Warteschlange-Reihe an, nicht nur bei uns verbundene
Das Abzeichen und die Reihentönung waren schon da - sie waren einfach nie bevölkert für die meisten der Liste. erhaltenUnreadSnur für die Live-Karte pro Sitzung lesen, die aus der eigenen Mitgliedschaftsreihe des Zuschauers abgeleitet ist, also ein Ticket, das sie nicht hatten verbunden konnte nie leuchten. Auf dieser Warteschlange, die das meiste davon ist, und die Nichtssignierte Tickets, die niemand abgeholt hat, sind sowohl die Mehrheit als auch die Reihen, die die meisten brauchen die Flagge. Es bevorzugt nun die Live-Karte, die maßgeblich für Gespräche der Betrachter ist ist in und aktualisiert sich über STOMP, sobald sie lesen oder eine Antwort landet, und fällt zurück zur Anzahl der Server pro Ticket für alles andere. Die beiden können nicht sein Blind eingegliedert: Die Live-Karte trägt immer nur Sitzungen, die noch ungelesen sind Nachrichten, so "lesen Sie eine Sekunde vor" und "nie gezählt" sind ununterscheidbar in es - daher die kleine Reihe von Gesprächen während dieses Besuchs geöffnet, die hält eine Reihe, die das Mitglied gerade liest, vom Bleiben bis zum nächsten Reload. Die Liste liest sich auch neu, wenn die Unterstützung anstehende Zählung bewegt. Für eine Gespräch, das der Zuschauer nicht beigetreten ist, es gibt keinen Live-Kanal, der jemals den Schnappschuss korrigieren - das ungelesene Thema erreicht nur die Leute in der Sitzung, die auf einer Warteschlange ist niemand - und pendingCount ist das eine Signal, das erreicht jedes unterstützende Mitglied der Org.
· MediaService
Stempelungesehenes zählt auf der Ticketliste und hält die Warteschlange live
getTickets lädt jetzt eine unsichtbare Nachricht pro Zeile für den Anrufer, neben der Besucher rudert es bereits auf diese Weise, und erhalten TicketDetail berechnet seine eigene bevor der Leser markante "MarkeAsRead" landet - so kann das Fenster zeigen, was angekommen ist sie waren weg, anstatt eine Zahl der Akt der Öffnung es bereits Null. Schließt auch die Signallücke, die die Warteschlange veralten ließ. Eine Botschaft in einer Unterstützung Konversation verschiet die Warteschlange für jedes unterstützende Mitglied der Org, nicht nur die Leute in dieser Sitzung - das ist genau, wer die pro Sitzung ungelesen Thema erreicht NICHT. Die anstehende Austragung bereits gefeuert, wenn ein Public-Chat-Besucher gesendet und wenn ein Agent markiert lesen; ein Mitglied antwortet von innerhalb der App war das Loch, so dass eine In-App-Unterstützung Konversation gewinnen konnte Nachrichten mit nichts sagen, dass jeder Agent Bildschirm wieder zu suchen. SupportUnseenCountSqlTest pins die Abfrageform. Jede Klausel darin ist Trage- und keines davon ist in einem vorbeiziehenden Bau sichtbar: einen Fehler machen und die Warteschlange macht immer noch, nur mit Zählungen, die leise falsch sind.
· kamo-shared-library
Ungesehene Nachrichten für einen Betrachter zählen, der nicht im Gespräch ist
Unread wurde immer von der eigenen MediaSessionMember-Reihe des Betrachters abgeleitet, also Ein Gespräch, das sie nicht beigetreten waren, produzierte überhaupt keinen Zähler. Auf einer Support-Warteschlange das ist die meisten davon - 27 der 37 Live-Tickets sind nicht zugeteilt, und 26 von denen haben genau ein Sitzungsmitglied, die Person, die um Hilfe gebeten. Die sind genau die Reihen, die am meisten brauchen Beflaggung, und sie waren diejenigen, die strukturell konnte keine Flagge tragen: niemand hatte sich ihnen angeschlossen, so gab es keine Leser für sie ungelesen werden. countUnseenBySessionForViewer beantwortet die Frage, die eine Warteschlange stattdessen stellt. Die LEFT JOIN auf Mitgliedschaft ist der ganze Trick: ohne Mitgliedschaftsreihe gibt es keine . . Die Anzeige ist die Wahrheit, der Betrachter ist hat keines davon gesehen. Eine Abfrage pro Seite, passend, wie der Besucher Reihen neben es ist bereits Bulk-Loading. Systemereignisse sind ausgeschlossen. Eine Statusänderung oder eine Umwidmung ist Buchhaltung über das Gespräch, und Zählen es leuchtet Zeilen, wo niemand hat tatsächlich sagte alles, schlimmer als gar kein Abzeichen auf einem Bildschirm, dessen Job ist die Entscheidung was braucht eine Antwort. SupportTicketDTO.unseenCount ist auf der Liste und Detail liest und links bevölkert null überall sonst, weil "unse gesehen" ist eine Tatsache über einen Betrachter und eine Zahl erfunden für einen Anrufer, der nicht nach einem fragte, wäre einfach falsch.
· kamo-internal
Löschen, Magnete, ein Rechtsklick-Menü, und eine Uhr, die fragt, welche
Sechs Ergänzungen zum Periodendiagramm und der nwehrtaktischen. DELETE entfernt die fokussierte Pille. Backspace auch, weil auf einem Mac der Schlüssel mit der Bezeichnung "Löschen" IS Backspace und bietet nur Löschen bedeutet, dass die Verknüpfung tut nicht auf einem Laptop existieren. Es entleert beide Schläge der Spanne, so das Löschen einer Mahlzeit lässt die Arbeit auf beiden Seiten kontinuierlich - das ist, was es für die bedeutet Mahlzeit nicht passiert haben. Inszeniert wie jede andere Bearbeitung; nichts ist geschrieben bis sparen. Eine GUIDELINE folgt dem Etikett über jede Zeile, mit der Minute, in der es in einem ist Chip an der Spitze. Seine Aufgabe ist es zu sagen, wo ein Klick landen würde, und das ist die gleiche Minute an jedem Tag in der Periode. Abgemessen an einem Track-Element eher als der Container, dessen Box enthält den Tag-Name und Gesamt-Spalten es würde eine Minute nach ihrer Breite melden, die das Mitglied nicht sehen kann RIGHT-CLICK überall an einem Tag öffnet ein Menü, das einen 15-Minuten-Block von arbeitete Zeit, Mahlzeit oder Pause, wo der Zeiger war. Zwei Schläge, nicht einer: eine Spannweite ist ein Paar, und ein einsamer Opener zieht eine Pille, die bis Mitternacht läuft. Beachten Sie, dass eine Mahlzeit block OPENS mit MEAL_OUT - eine Mahlzeit wird als Taktung aus der Arbeit und zurück aufgezeichnet in, und immer, dass das Paar rückwärts dreht sich um den Tag. MAGNETS: eine Kante innerhalb von fünf Minuten von einem anderen Schlag schnappt auf seine gezogen exakte Minute, absichtlich umgeht die Ein-Minuten-Lücke, die die Klemme hält. Das Lücke stoppt eine Kante, die seinen Nachbarn überquert; hier ist die ganze Absicht für die beiden zu treffen, und eine Kante, die nur eine Minute kurz landen kann nie eine Lücke schließen. Fünf Minuten bei einem zweitägigen Zoom ist ein paar Pixel, so ohne einen Magneten "Make this break end when the next one starts" ist eine Aufgabe, die niemand erledigen kann mit einem Zeiger. Und wenn der Magnet zwei Spannweiten der SAME Art Kante zu Kante landet, MERGE in der gleichen Geste: die Uhr-out und die Uhr-in, die jetzt teilen sich eine Minute stoppen Wahr zu sein, und beide sind nichtig. Verschiedene Arten verschmelzen nie - ein Schichtendes genau wenn eine Mahlzeit beginnt, ist nicht eine Spanne, es ist die beiden Dinge, die tatsächlich passiert. Dies brauchte die Art inGraphPunches zu Tie-Break auf dem Original Minute: zwei zufällige Kanten müssen ihre chronologische Reihenfolge oder Paarung halten tauscht sie aus, erzeugt eine Nullbreiten-Spannung und einen verirrten Ösen, und die Pille verschwindet im Moment treffen sich die beiden. DREI PILL COLOURS, und sich durch mehr als Farbton - solide Arbeit in der Marke Primäre, Mahlzeit in der HRS Bernstein gebändert, brechen fein gestreift in violett. Farbe allein scheitert die 8% der Männer mit einem rot-grünen Mangel und scheitert jeder auf einem Projektor; jemand sollte in der Lage sein, eine unbezahlte Mahlzeit von einer bezahlten Pause in einem zu erzählen Schwarz-Weiß-Ausdruck. THE NAV CLOCK ASKS WHICH PUNCH. "Clock out" ist drei verschiedene Akte, und was ist im Angebot hängt davon ab, wo das Mitglied steht: arbeiten, können sie die beenden Schicht, gehen Sie zu einer Mahlzeit oder eine Pause; auf eine Mahlzeit oder eine Pause, kommen zurück ist die Standard und das Ende der Verschiebung ist immer noch da, weil die Menschen gerade verlassen vom Mittagessen. Das in einen Knopf zu falten ist, wie jemand seinen Tag beendet, wenn sie wollten zum Mittagessen gehen - eine unbezahlte Stunde, die sie nicht zurückbekommen und Fehlen-Punch Ausnahme auf dem Weg. Die Karte re-skins zu der ausgewählten Aktion in die gleichen drei Farben, die der Graph verwendet, sagt, wie lange sie in ihrem gewesen sind Aktueller Zustand, und das niv dot berichtet jetzt, welche der drei Staaten es ist. Ein abwesender "Status" vom Server wird als "der Boolean ist alles, was wir haben" gelesen, nicht als AUS zu lesen würde "Clock in" für jemanden im mittleren Schichtplan anbieten Länge des Einsatzfensters.
· SecurityService
Die Schlaglücke zurückverlagern
Passthrough für POST /punches/{id'/void, die Löschtaste des Editors und die Maschinen hinter der Zusammenbringung von zwei angrenzenden Spannweiten. Dieselbe Autorität wie /korrekt, und aus dem gleichen Grund: ein EMPLOYEE kann ihre eigener Punch, weil ein Mitglied, das nicht sagen kann, "dass doppelte Hahn nie passiert ist" hat keine Möglichkeit, eine Aufzeichnung zu korrigieren, für die sie der einzige Zeuge sind. Was sie nicht können, ist machen es zählen - die Leere landet auf einer Zeitkarte, die sich noch durch die Zulassungskette, und der Grund ist obligatorisch auf jedem Weg. Der Schauspieler ist gestempelt von der SESSION, nie aus dem Körper; ein körperbetonter Schauspieler ist ein Körper-gelieferte Unterschrift auf jemand anderes Lohn-Rekord. Zwei Tests, ziehen in entgegengesetzte Richtungen, weil dieser Service läuft anyRequest().permitAll() mit Hand-gerollt pro Handler auth: es muss eine ablehnen Kollege Punch, ohne jemals die Staffel zu erreichen, und es muss die zugeben, die Unterwerfen sich selbst, überhaupt keine Rechte zu haben.
· kamo-shared-library
Ein Schlag kann gelöscht werden, ohne gelöscht zu werden
Vier nichtigbare Spalten und ein zweiter Schreib-einmal Übergang auf TimecardPunch. A void sagt, der Punsch hätte nie existieren dürfen - ein doppelter Hahn auf die Uhr, verlassene Pause, oder die Naht zwischen zwei Spannen der Timecard-Editor hat nur zu einem verschmolzen. Das ist weder eine Korrektur ("Dies geschah, bei einem anderen time", die eine Ersatzreihe hinterlässt) noch ein Lösen: ersetztByPunchId bedeutet "Lesen Sie stattdessen diese andere Reihe", und hier gibt es keine andere Zeile. Die Reihe überlebt, aufgelöst, mit ihrem Autor und seinem Grund daneben. Ein Lohn Rekord, der gemacht werden kann, um einen Schlag zu vergessen ist genau die Unzulänglichkeit, die sich verschiebt die Belastung für den Arbeitgeber unter Anderson v. Mt. Clemens Töpferei, also die einzige Sache, die eine Lücke entfernt, ist der Effekt des Stempels auf die Berechnung. zwangWorm() Genehmigungen nichtig erklärtZu den gleichen Bedingungen wie ersetztByPunchId zu einem Wert, einmal - und lehnt eine Leere ohne Grund. Un-voiding an Ort und Stelle ist absichtlich unmöglich: Wiedereinführung eines Schlages bedeutet Einsetzen eines, das geht seine eigene Reihe und seine eigene Erklärung. **************** ist kein Bequemlichkeit. Die ungefilterte Variante ist falsch für die Entscheidung Takt Zustand: ein übergürpelte Reihe hält ihre ORIGINAL-Instantität, so dass ein Clock-out rückwärts korrigiert wird verlässt den toten Streit spätestens von aufgetretenAtUtc, und eine nicht annständige Reihe bleibt spätestens bis etwas Neuerer gelocht wird. Entweder antwortet man: "Sind Sie auf der Uhr?" aus einer Aufzeichnung, die nicht mehr existiert. Nach der Entity-Change-Regel: Shared-lib lokal installiert, KI Migration geschrieben und RUN gegen 192.168.4.22:5433 mit allen vier ALTERn angewandt, und nur dann ist dies geschoben, so dass kein Dienst kann gegen eine bauen ungewandertes Schema.
· InitializerService
Die leeren Spalten auf hr_timecard_punch
Spiegelt vier neue nicht abwendbare Spalten auf der TimecardPunch Entität. Eine Leere ist weder ein Lösen noch eine Korrektur: Es heißt, der Punch hätte nie existieren dürfen - ein doppelter Tipp auf die Uhr, eine verlassene Pause oder die Naht zwischen zwei Spannweiten der Herausgeber ist zu einem verschmolzen. SUPERSEDED_BY_PUNCH_ID kann es nicht ausdrücken, weil diese Spalte bedeutet "lese diese andere Zeile statt" und es gibt keine andere Reihe. Alle vier sind NULLABLE, was ist, was macht diese sicher auf einer bevölkerten Tabelle: CockroachDB lehnt ADD COLUMN ab ... NOT NULL auf einem nicht-leeren Tisch und rollt die ganze Aussage zurück, so dass ein NOT NULL-Sleichmarker als WARN protokolliert würde, übersprungen, und leise abwesend. Sie gehen ERSTE in diesem Läufer, vor den Indizes und REVOKEs es bereits trägt, aus dem Grund @Order(0) existiert: der Moment Shared-lib Karten eine Spalte, jeder Läufer, der die Punch-Entität lädt, sendet es in seinem SELECT, und ein Spalte-add bestellt spät läuft überhaupt nie - ein früheres Leser stirbt auf "Spalne existiert nicht" und nimmt den Initialisator mit. Laufen Sie gegen 192.168.4.22:5433, alle vier angewendet.
· kamo-internal
Zeigen Sie den Markt Onboarding Panel, wenn keine CRM-Märkte vorhanden sind
/leads gerenderte das Bleigitter mit einer leeren, deaktivierten Markt-Tab-Leiste für eine org das noch nie einen CRM-Markt konfiguriert hatte. Es zeigt jetzt die gleiche Onboarding-Panel /Commerce zeigt für fehlende Handelsmärkte - extrahiert zu MarketOnboardingEmptyState, so dass die beiden identisch bleiben - angetrieben von der CRM-Lead Märkte von den Einstellungen - Client Relationship Manager, nicht die Handelsmärkte, und zeigt auf den Reiter CRM Markets & Fields. Die Schritte und die Einstellungen CTA werden nur Mitgliedern angezeigt, die CRM verwalten können Einstellungen; alle anderen erhalten die vorhandene Check-Back-Later-Kopie.
· kamo-internal
Die Periodengrafik und eine Zeitkarte, die Sie als Entwurf bearbeiten
Ersetzt die Ein-Tages-Timeline auf ************ durch einen ganze Bezahlperiode, und ändert, was Bearbeitung man fühlt sich an. Die Pillen tragen keinen Text. Sie trugen ihre eigene Zeit, und ein Etikett ist 60px breit, wie lang das, was es beschreibt, war - also eine zehnminütige Pause und ein Vier-Stunden-Schicht zog die gleiche Pille, und die eine Eigenschaft eine Zeitleiste hat, dass ein Tabelle nicht (Breite bedeutet Dauer) war die Eigenschaft, die es weggeworfen. Beide Zeiten leben jetzt in einem Tooltip, der den Anfang, das Ende und die Spannweite zwischen sie, und folgt der Kante, die mit einer Auslese gezogen, die aktualisiert, wie es bewegt sich. Ecken sind 2,5px: genug, um die mechanische Härte abzubauen, nicht genug, um eine Fünf-Minuten-Pille in eine Raute zu runden. Die Stunden-Header-Etiketten jede Stunde, jeder drehte sich um eine Vierteldrehung gegen den Uhrzeigersinn so alle vierundzwanzig fit. Vier Etiketten im Abstand von sechs Stunden können niemandem sagen, ob eine Pille beginnt um 9 oder 10, das ist die einzige Frage, die der Kopf ist da Antwort jetzt, dass die Pillen unbeschriftet sind. Jeder Tag in der Zeit bekommt einen Streit, INCLUDING Tage, die noch nicht passiert sind. Ein Diagramm, das nur Tage mit Daten zeichnet, kann keinen fehlenden Punch zeigen, und die Fehlen Punch ist die häufigste Sache falsch mit einer Zeitkarte: die Lücke ist die Finden, und eine Feststellung braucht eine Reihe zu erscheinen. Künftige Tage werden eher ausgebrütet als nur gedimmt "noch nicht" und "niemand aufgezeichnet etwas" sind anders Fakten. Drags Snap zur MINUTE. Fünf-Minuten-Schnappen konnte nicht ausdrücken 9:02, so ein Uhr, die zwei Minuten aus war konnte nicht korrigiert werden und jede korrigierte Zeit erworben eine Rundheit, die als Schätzung lesen. Rundung ist eine Lohnpolitik der Motor gilt mit Neutralität Berichterstattung dahinter; ein Schieberegler darf nicht gelten zweitens, unsichtbar. Pfeiltasten um eine Minute, Shift um fünfzehn, Alt nimmt ein Ende für sich - ein zeiger kann keine Minute auf einer Strecke ausdrücken, wo ein minute ist unter einem Pixel. Und Redaktion ist jetzt ein Entwurf. Ziehen verwendet, um die obligatorische Grundangabe Dialog öffnen auf jeder Version: Fixieren einen Tag mit drei falschen Schlägen bedeutete drei schreiben Erklärungen, jede eine Variante von "die Uhr war falsch", und ein echter Schutz unter Anderson v. Mt. Clemens Pottery verwandelte sich in eine Kiste, die Menschen getippt "Korrektierung" in zu machen, damit es weg. Ein Schutz, den jeder zu besiegen lernt schützt niemanden. Bearbeitet jetzt frei inszeniert und eine Erklärung ist gesammelt auf speichern - immer noch obligatorisch, noch auf jedem Schlag die speichern Berührungen aufgezeichnet, aber einmal gefragt, wenn jemand wirklich weiß, was er getan hat. Nichts ist geschrieben bis dahin. Unterstützung von Änderungen: - app/lib/timecardGraph.ts hält jede Entscheidung, die der Graph trifft - Paarung, Klemmen, Schnappen, die DST-sichere Instant-Shift - als reine Funktionen, weil Entscheidung über eine Lohnbilanz, die nur durch Ziehen etwas überprüft werden kann mit der Maus ist eine Entscheidung, die niemand kontrolliert. 34 Tests. - fetchRange fällt zurück auf pro Tag liest auf einem 404, so dass die Registerkarte nicht gebrochen ist für wer es zwischen dem SecurityService-Einsatz und diesem lädt. - das Add-a-Time-Feld Rundreisen durch lokale Wand-Uhr. Es machte eine UTC Scheibe in eine datetime-lokale Eingabe und parsierte das Ergebnis wieder als lokal, so jeder Besuch auf dem Feld bewegt die Zeit durch die Zone Offset in der Stille.
· SecurityService
Staffelung des Editors Zeitraums
Durchgehen für GET /members/{id'/range, die Periodengrafik gelesen. von/zu Nur weitergeleitet, wenn vorhanden, so dass TimecardService kann die eigene Vergütung des Mitglieds zu lösen Zeitraum -Fortierung "?from=&to==" würde an leere Strings stromabwärts binden und stillschweigend besiegen, dass Standard für jede Org mit einem Pay-Kalender. Identität wird mit resolveRole und ohne Recht überprüft, genau wie /day bereits tut. Die beiden Anforderungen ziehen in entgegengesetzte Richtungen und ein rechtsbasiertes Tor bekommt nur eine davon: Es darf nicht zu einer Art werden, die Stunden eines Kollegen zu lesen, und es muss nicht dazu kommen, muss das Subjekt selbst zulassen, das NICHTS hält, weil ein Mitglied in der RESTRICTED tier hat überhaupt keine Rechte und hat immer noch ein gesetzliches Recht auf ihre eigene Platte. TimecardRangeAuthTest deckt beide Richtungen plus die Abfrage Gebäude, weil dieser Service läuft anyRequest().permitAll() mit handgerollten pro Handler auth ein Mapping, das seine Kontrolle vergisst, ist über das öffentliche Internet erreichbar APIService's Wildcard vorwärts.
· kamo-internal
Heisieren Sie ein Support-Gespräch, wenn jemand antwortet in sie
Das Schließen eines Unterstützungsfensters bedeutet nicht, das Gespräch zu verlassen, aber es wurde als behandelt wenn es so wäre. ChatNotificationListener kehrte früh auf jeden SUPPORT_TICKET zurück Benachrichtigung richtig, da ein Ticket kein einfaches Chatfenster öffnen darf, aber es hinterließ Unterstützung ohne Live-Wiedereröffnung überhaupt. Wer auch immer ihr Panel geschlossen hat, die meisten oft die Person, die um Hilfe gebeten, nachdem sie gefragt hatte, einfach nie sah die Antwort. Es öffnet sich nun stattdessen das Unterstützungsfenster, adressiert durch die Ticket-ID die Benachrichtigung trägt; das Tool-Shop dedupes auf ticketId, so ein Fenster bereits nach oben ist fokussiert und nicht dupliziert. AutoOpenUnreadSupportChats ist die langlebige Hälfte, für eine Antwort, die angekommen, während sie wurden ausgezeichnet - der Live-Push ist Core NATS ohne Wiederholung. Bewusst getrennt von ZugeteiltesTicketOpener: dass man antwortet "diese Arbeit gehört jetzt dir", dieser antwortet "jemand hat dir etwas gesagt", und für einen Antraggeber der erste Es passiert nie. Beide erkennen durch die gleiche auto-opened Rekord die Chat-Pfad verwendet, so dass ein zweites Gerät nicht wiedergegeben, was das erste gezeigt hat. ChatsListe nimmt jetzt ticketId direkt aus dem Aktivitätsrahmen. Synthesizing Support-Reihe ohne eine produziert eine Zeile, die nicht geöffnet werden konnte, so hatte die Liste den Rahmen wegzuwerfen und die ganze Seite noch einmal zu lesen, um ihn zu bekommen.
· MediaService
Ein Gespräch, viele Hände - verbinden Sie sich auf offen, nennen Sie jede Nachricht, öffnen Sie auf eine Antwort
Ein Support-Ticket wird von wem auch immer hilft, nicht nur von wem es ist derzeit mit gestempelt. Zuordnung entscheidet, wem das Werk angeboten wird und wessen list es erscheint in; es war nie dazu gedacht, eine Sperre für das Gespräch zu sein. Das Öffnen eines Tickets schließt sich nun der Mediensitzung an. Vorher, ein Agent, der eine eröffnet Ticket aus der Warteschlange, die ihnen nicht zugeordnet wurde, konnte in sie eingeben . nichts lehnte die Nachricht, aber sie waren nicht ein Mitglied der Sitzung, so dass die Konversation erschien nie in ihren Chats - Unterstützung, keine Antwort jemals erreicht sie, und der Antragsteller "ist mein Agent hier" nicht zählen sie. Sie waren In einem Raum, in dem sie sich nicht unterhalten haben. Wer beitreten darf, ist die gleiche Bevölkerung, die kann das Ticket bereits in der Warteschlange sehen: die Leute, die sich bereits im Gespräch befinden, plus ACCEPT_SUPPORT_TICKETS oder MANAGE_SUPPORT im zugewiesenen Org. Alle anderen wird nun abgelehnt - dieser Endpunkt hat bisher jedes Ticket auf dem Bahnsteig serviert jedes authentifizierte Mitglied, das eine UUID erraten könnte, über Organisationen, und die Join Gate hätte das vom Lesen eines fremden Gesprächs auf in sie geschrieben. Jede Nachricht trägt jetzt einen Namen. AbsenderName wurde sofort abgelesen Member.usernameAlias, ein optionaler Spitzname, der auf fast jedes Mitglied abgesetzt wird, so es serialisiert als Null und der Chat gemacht Nachrichten ohne Namensnennung an alle. Das ist am schlimmsten in einem Support-Ticket, wo mehr als ein Agent sein kann Beantworten und der Kunde hat keine andere Möglichkeit zu sagen, wer mit ihm spricht. MemberDisplayNames - bereits an anderer Stelle in diesem Controller eingesetzt - fällt zurück der richtige Name. Die gleiche Rohlektüre war Blanking zugewiesen-Agent Namen, Ticket Geschichte Akteure, System-Event-Akteure, die Agent-Verfügbarkeit Bekanntmachung und die Berichterstattungstabelle. Ein geschlossenes Fenster bedeutet nicht mehr eine verlorene Antwort. Die Meldung über eingehende Mitteilung trägt die Ticket-ID, so dass der Kunde das Gespräch, das es sagt, erhöhen kann Sie über, und /sessions/support/auto-open ist die langlebige Hälfte für eine Antwort, die kam, während Sie angemeldet waren, die Nachricht-Seite Gegenstück von zugewiesen-unöffnet, die immer nur die Arbeit abdeckte, die den Besitzer wechselte und so nie gefeuert für die Person, die um Hilfe gebeten. Tests: ChatListNativeAliasCaseTest heftet das Zitat der Spalte der Feed-Abfragen an Aliasen, die nichts anderes fangen kann - der Ausfallmodus ist eine stille Null, nicht ein Typfehler oder eine Ausnahme. SupportAutoOpenHqlTest analysiert die neue Abfrage das reale Entitätsmodell, da Spring Data nur beim Booten ein @Query validiert und Dieser wohnt in der gemeinsamen Bibliothek, wo ein Tippfehler jeden Dienst abnimmt.
· kamo-internal
Linkierbare Tabs, ein funktionierende Mitglied hinzufügen und eine vollständige Historie-Registerkarte
Jeder Tab auf /account/view/{id] ist jetzt eine echte Route Rest sind Links, die jemand senden, Lesezeichen oder landen kann. Alte ?tab= Links umleiten zum passenden. Jeder Tab lädt seine eigenen Daten, so dass die Eröffnung eines Kontos nicht mehr wartet auf die Daten jedes Tabs, bevor Sie etwas davon anzeigen. Fügen Sie Mitglied öffnete ein "coming soon" Toast. Es öffnet jetzt den gleichen Picker der Manager Feld verwendet, suchen jedes Mitglied der Organisation und nicht nur Mitarbeiter Die Person, die für ein Konto bezahlt, steht häufig nicht auf der Gehaltsabrechnung. Menschen schon jetzt auf dem Konto bleiben sichtbar, aber nicht abgeholt mit dem Grund, weil ein Name, der ist einfach fehlt von einer Suche liest sich als kaputt Picker. Set-as-primary und entfernen auch, entfernen Sie hinter einer Bestätigung, die sagt, was es tut und nicht löschen. Sowohl die Tabelle als auch die Picker-Marke, welche Art von Person jede Zeile ist. Ohne sie Mitglied und ein Teammitglied lesen identisch und die Liste impliziert leise alle auf es funktioniert hier. Die Mitgliedsreihen geben jetzt auch alle Render: die vom Typ beanspruchten Schlüssel endpoint hat nie gesendet, so dass jeder Name zeigte "---" und nichts konnte entfernt werden die Zeilen-ID, die der Anruf entfernen muss, war eines der erfundenen Felder. Die Lead-Ansicht's History Panel wird EntityHistoryPanel, mit dem neuen geteilt Kontoverlaufs-Tab: gleiche Filter, gleiches Paging, gleiche leere Zustände. Was bleibt mit Jeder Anrufer ist nur, wo das Futter kommt und was seine IDs bedeuten.
· InitializerService
ACCOUNT_HISTORY erstellen
Spiegelt die AccountHistory Entität in Kamo-shared-Bibliothek. explizit geschrieben anstatt auf ddl-auto verlassen, weil die Standardeinstellungen wichtig sind: ID und DATE_CREATED Datenbank-Standards tragen, so dass eine einfache SQL-Einlage funktioniert, ohne sie zu benennen, die Die generierte DDL von Hibernate funktioniert nicht. Keine fremden Schlüssel, absichtlich - der Log überlebt, was er beschreibt. Ein Konto kann zusammengeführt werden und ein Mitglied kann die Org verlassen, ohne dass die Löschung ausfällt oder Aufzeichnungen über das, was sie mit ihnen verschwanden.
· SecurityService
Endpunkte der Kontohistorie, echte Mitgliedsreihen, ein All-members-Verzeichnis
Die Kontoansicht kann nun sagen, was mit einem Konto passiert ist und wer darauf ist. - Jede Mutation auf der Kontooberfläche zeichnet Geschichte auf: erstellen, Feldbearbeitungen, soft delete, merge (was die Timeline des Verlierers eher auf den Überlebenden verschiebt als fallenlassen), Adressen, Notizen und das Mitglied addiert/entfernt/primäre Pfade. GET-Kunden/{uid'/Geschichte und /history/Filter spiegeln die Bleiendpunkte Anfrage für Anfrage, weil eine Komponente in der internen Website liest beides. - getCustomerMitglieder gibt zurück, was eine Mitgliedsreihe gerendert werden muss: das Display Name, Avatar, Berufsbezeichnung und istTeamMitglied. Beide Arten von Menschen gehören auf eine Konto - der zahlende ist häufig nicht auf der Gehaltsliste - und ohne Flagge die beiden lesen identisch. - updateCustomerMembers akzeptiert IDs als Strings (eine unique_rowid() Vergangenheit MAX_SAFE_INTEGER kommt anders abgerundet an, löscht das primäre Mitglied, wenn die Reihe entfernt wird ihnen gehört ihnen und mutiert nicht mehr das Waisenumbeschleunigung Sammlung neben dem Repository schreibt. - Die Verzeichnissuche nimmt scope=all, über jedes Mitglied der Org statt die Personalliste, und jede Zeile sagt, welche Art es ist. Die Endpunkt-Ratsche erfährt DenyUnsige nicht: Sie lädt die Sitzung und gibt 401 zurück ohne eine, oder 403 ohne das Recht, so ein Handler, der mit ihm öffnet getan hat streng mehr als einen Anrufer zu lösen. Zwanzig Basiseinträge wurden nur aufgelistet weil der Scan den Wächter, der bereits da war, nicht sehen konnte.
· kamo-shared-library
Ein Audit-Trail für Konten und ein Verzeichnis, das Nicht-Personal enthält
ACCOUNT_HISTORY zeichnet auf, was mit einem Konto passiert, wie LEAD_HISTORY aufzeichnet was passiert mit einem Lead - absichtlich die gleichen Spalten, weil die internen Website macht jetzt sowohl durch eine Komponente und eine zweite Form würde gezwungen haben eine zweite. - AccountHistory + Repository + AccountHistoryService: snapshot/diff über ein Feld Registrierung, plus einmalige Ereignisse für die Dinge, die keine Feldbearbeitung sind (ein Mitglied Beitritt, eine Blei- oder Bestellung ankommen, eine Verschmelzung). Aufnahme wirft nie: ein Audit schreiben, dass Fehler dürfen nicht nehmen Sie die Operation war es Prüfung. - AccountHistoryFieldRegistry ist der einzige Ort, an dem ein geschlagenes Feld deklariert wird. Laufende Summen sind absichtlich abwesend - sie bewegen sich als Nebeneffekt von Aufträgen, die bereits ihre eigenen Veranstaltungen bekommen. - LeadService schreibt nun die Hälfte eines Lead-Links. Eine Führung an eine Konto ist ein Akt in zwei Timelines, und die Aufnahme in nur einem bedeutet, welche auch immer Seite, die Sie betrachten, ist diejenige, die es nicht erwähnt. Ein Vorsprung bewegte sich zwischen Konten schreibt an beide. - CommerceService erfasst ORDER_PLACED / _LINKED / _UNLINKED / _STATUS_CHANGED gegen das Einkaufskonto. Schweigen Sie, wenn eine Bestellung keine Käufer hat. - ************ die Personalverzeichnis-Suche Verbreitet auf jedes Mitglied eines Orgs, für Kommissioner, die sich nicht für einen Kollegen entscheiden. Gebracht im Gleichschritt mit TeamMemberRepo.searchDirectory Begriff für Laufzeit, einschließlich der LEFT JOIN Teammitglied, das Berufsbezeichnung und Abteilung für die Mitarbeiter sucht hält in den Ergebnissen. activeOnly kann nur für Zeilen sprechen, die einen Beschäftigungsstatus haben, so Mitglieder ohne eine durchlaufen, anstatt als "nicht beschäftigt" gelesen. - member.getPhoneExtension: getPhone() flacht auf die Zahl ab, so dass die Erweiterung unerreichbar von außerhalb der Klasse.
· kamo-internal
Bestätigen Sie eine Uhr in/out vor dem Schreiben des Punzes
Die niv-Uhr gestanzt direkt aus dem Klick. Jede zweite Kontrolle in dieser Bar ist idempotent oder trivial unerlösbar; ein Schlag ist eine Lohn-Rekord, die danach nur ein HR-Admin mit einem obligatorischen schriftlichen Grund kann korrigieren - und die Taste sitzt ein Pixel von Logout. Es wirft jetzt TimecardPunchConfirmDialog, gebaut, um den Standard der NewSupportRequestPopup und absichtlich keine Kopie davon: Diese Karte ist eine Warnung das unterbricht, so dass es atmet, weigert sich, verweigert seine Kulisse und Arme seine Tasten spät. Dieser wurde mit einem Klick gefragt, so dass er sich sofort ärgert und auf Escape schließt und auf dem Hintergrund. Grün für in, Bernstein für aus, weil die beiden Ergebnisse haben getrennt werden, bevor ein Wort gelesen wird. Sein Herzstück ist eine Uhr, die zum ZWEITE tickt, und die Kopie sagt direkt dass die aufgezeichnete Zeit der Moment der Bestätigung ist und nicht der Moment auf Bildschirm während der Entscheidung - der Punkt ist, dass zögert ist kostenlos und nichts ist geschrieben, bis Sie so sagen. Die erste Zecke ist auf die zweite Grenze ausgerichtet, so die Auslesung stimmt mit jeder anderen Uhr auf dem Bildschirm des Mitglieds statt Landung, wo immer der Klick hat. Verhalten, das sich mit ihm veränderte: - der idempotency-Schlüssel wird geprägt, wenn der Dialog OPENS und für einen erneuten Versuch wiederverwendet. Pro-Versuch-Tasten waren der Fehler, der dies verhindert: eine Anfrage, die aus zeitlich ausgeschaltet kann gut sind gelandet, und das Wiedererprobieren unter einem frischen Schlüssel ist ein zweiter Schlag auf einer Lohnbilanz. - die Aktion ist zur offenen Zeit eingefroren, so dass eine 60er-Umfrage die Uhr unter die Karte (ein Schlag von ihrem Handy) kann die Frage nicht Mitte-Antwort ändern. - der optimistische Flip ist weg. Es existierte, weil der Schlag abgefeuert der Klick; das Mitglied sieht jetzt eine Karte, die bleibt, bis der Server antwortet, so ein Der Staat wäre nur eine Chance, den falschen zu zeigen. - ein misslungener Schlag hält die Karte offen und sagt es. Leise eine Ikone umkehren ist keine Möglichkeit, über einen Schlag zu lernen, der nicht passiert ist - das taucht Tage später auf als fehlender Ausnahme auf der Zeitkarte. - Identitätswechsel (god-mode sudo, Session Switch) lässt eine offene Bestätigung fallen, die sonst den Schlag des vorherigen Mitglieds gegen den neuen schreiben würden.
· kamo-internal
Segmentierte Statusfilter anstelle der Auswahl
Pending/Complete/All sind drei kurze Peers, die auf einer Linie passen, so ein Dropdown versteckte zwei von ihnen hinter einem Klick und verbrachte ein Etikett und ein 170px gut, um nichts zu sagen. Eine geschlossene Auswahl kann auch nicht antworten "meiner ich mir an alles?", ohne es zu öffnen. SegmentedFilter wird geteilt: exklusive ToggleButtonGroup, Akzent als a CSS var so jede Oberfläche behält seine Identität, und die Null, dass exklusive Modus Hände zurück, wenn das ausgewählte Segment neu angeklickt wird verworfen filter hat immer einen Wert. Zugeteilte Ausbildung bekommt es auch, in --Training-Marke: die beiden Paneele teilen sich einen Tab-Streifen, und eine von ihnen Ein Dropdown zu halten würde sich wie zwei verschiedene Produkte lesen.
· kamo-internal
Schieben Sie ein überfülltes n nav statt Zerkleinern seiner Optionen
Pinning mehr Optionen als ein Navi kann zeigen, gequetscht die Fliesen aus der Form: beide Streifen waren rohe Überlauf-Boxen und die Fliesen sind bieg Kinder mit nein flex-schrumpfen ihre eigenen, so dass die obere Bar verzerrt sie (und versteckte seine scrollbar, Schlucken Optionen ohne Zeichen, dass sie existierten) während der rail zeichnete eine 12px Scrollbar über seinen eigenen Gradienten. Beide Navi machen nun ihre beweglichen Optionen durch NavOverflowScroller: Fliesen halten ihre Grundfläche, Ende Pfeile und eine weiche Kante verblassen nur auf der Seite, die noch etwas zu erreichen hat, und der Streifen kann geblättert, gehalten, Rädern, mit Schwung geworfen oder geschleppt. Die Option der aktuellen Seite ist gescrollt zurück in Sicht bei der Ankunft, und die obere Bar feste Chrom keine länger teilt den Fehlbetrag mit dem einen Kind, das ihn aufnehmen kann. Ziehen Sie eine Option und Schieben der Streifen sind die gleiche Geste auf einem überfüllt nav, so dass ein überfülltes Navi stellt sich hinter einem kurzen Halt neu. Dieser Halt verzichtt die Mousedown von dnd-kit, anstatt mit seiner "Verspätung" Einschränkung: die Verzögerungsbeschränkung aktiviert sich auf dem Zeitschaltpunkt allein und dnd-kit unterdrückt den Klick einer Presse, die Aktivierung erreicht, die stoppte jeden leicht langsamen Klick auf eine nav-Option von der Navigation.
· kamo-marketing
Verzeichnis der Sammlungsdetails in 19 weiteren Sprachen
Die Synchronisation beendet, so dass die 2.400-Detail-Seiten, die nicht für mit indiziert waren Englische Körperkopie hat jetzt echte Übersetzungen und kann indiziert werden. Gemessen quer durch 21 Orte: Jeder landet zwischen 0,0% und 8,8% der Sammlung Werte identisch mit Englisch, außer sw und ta bei genau 100.0% haben keinen Provider, so TranslateService zurückgegeben den Quelltext und die laufen schrieb Englisch zurück unter dem Anschein des Erfolgs. COLLECTION_CONTENT_LOCALES ist daher abgeleitet, nicht gelistet: jede beworbene locale minus der No-Provider-Set. sw behält seinen Noindex nur auf Detail-Seiten seine Basis-Bundle ist echte Swahili, so dass seine statischen Seiten indiziert bleiben - und ta bekommt keine Roboter-Richtlinie überhaupt, weil es bereits Kanonen für die Engländer Original und stapeln Noindex an der Spitze würde zwei widersprüchliche Signale senden über ein Teil des Inhalts.
· kamo-shared-library
Per-member überfällige Rollup für die Compliance-Matrix
Die Matrix der HR-Überblick verzweigt sich auf .row.overdue - 0, aber die rechtliche und Schulung Rollups mit diesem Feld gebunden zu 0 - ein Zweig, der könnte nie genommen werden, so dass diese beiden Domains konnte immer nur zeigen, Bernstein oder grün und "sortiert schlimmstes Erster" degenerierte. Das (Mitglied, Status) Histogramm kann es nicht beantworten: es trägt keine dueAt. So jeder Repository gewinnt eine gruppierte Zählung, deren Prädiktat Charakter-für-Zeichen ist die eine in countOverdueForOrg, plus GROUP BY teamMemberId. Das Teilen des Prädikats ist was macht die pro-Mitglieder Zahlen Summe auf die Org-Ebene Zählung oben gemacht sie. Nur Abfragemethoden. Keine Entity-Änderung, keine DDL, Version bleibt 1.5.0. Anrufer besitzen das offene Set, und die beiden sind NICHT die gleichen: legale Pässe OPEN_STATES, Training besteht REMINDABLE_STATES. AWAITING_GRADING ist offen, aber schuldet dem Mitglied nichts, und es überfällig zu zählen würde die legale reproduzieren Der AWAITING_OTHERS-Fehler des Moduls, der den Mitgliedern sagte, dass sie Wochen zu spät gekommen seien, für immer.
· kamo-internal
Erstellen Sie die Übersichtskarte als Bericht über die anderen vier
Vollbreite Meldekonsole: Masthead-Auslese, vier Tab-Säulen, die bedarfs-aufmerksamkeits-Leuts, die Personal-Compliance-Matrix und eine Tätigkeit Schiene. Nur lese - jede Aktion ist ein tiefer Link in den Besitz-Tab.
· kamo-internal
Übersicht Aufmerksamkeit Ledger, Compliance-Matrix und Aktivitätsschiene
verwendenMemberNames Quellen /api/security/members/names anstatt des Briefes .../org-config shape: org-config gibt nie eine Mitgliederliste zurück (bestätigt durch Lesen LegalPackageDialog.tsx und TrainingAssignDialog.tsx, die nur Abteilungen/jobTitles parsen von ihm), während /members/names der Endpunkt ist, der bereits für die ID-to-Name-Auflösung gebaut wurde und bereits die gleiche Weise von HypothekAppsApi.memberNames() verwendet.
· kamo-internal
Übersicht Mastkopf und die vier Tab-Säulen

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