Changelog
Was ist neu?
Jede Verbesserung an der Plattform, wie sie geliefert wird.
· kamo-shared-library
Addieren Sie pro Mitglied Zuweisungen und Fortschritt pro dokumentieren
Die Dokumentzeile ist die Verbindung, die N E-Zeichen Umschläge als ein Paket lesen lässt. Die Abzeichenzahl kommt vom Zuweisungsstatus, nicht E-Zeichen Status: Empfänger status hat keine VOIDED oder EXPIRED, leeriert niemals Empfängerzeilen und Nur ein Paket hat keine Umschläge.
· kamo-shared-library
Paketinhalte in unmutbare Versionen einfrieren
Pins die ImgDat Blob-ID und seine SHA-256, nicht nur imgId . ein Docs speichern weist den gleichen Img auf neue Bytes, so dass imgId allein zwei Mitglieder unterschreiben lassen würden verschiedene Dokumente unter identischen IDs. Schnappt auch das Design, also Ausführung hängt nie von resolveDesignJson Fall-back auf das neueste Layout.
· kamo-shared-library
Zielen Sie ein Paket an Abteilungen, Jobtypen oder benannte Mitglieder
Geformt auf SystemUserAccess. Fügt den Publikumslöser zu TeamMemberRepo hinzu, der war eine leere Schnittstelle; das ACTIVE + recordState-Panzer ist, was hält gekündigte Mitarbeiter und nicht eingestellte Kandidaten aus einer Lieferung.
· kamo-shared-library
Fügen Sie die rechtlichen Paketvorlagen Entitäten
Ein Paket ist ein bestelltes Set von Ordnern plus ein Publikum. Binder Referenzen sind weiche IDs, weil Binder sind Benutzer-Löschbar und Kaskaden ihre Elemente. Die die Formulierung der Betestation ist mit ihrem hash in voller Länge gespeichert - ein Hinweis kann nicht nachweisen was ein Mitglied zustimmte.
· kamo-internal
Machen Sie den Binderladen auf seine Kollektion aufmerksam
Der Store ist ein Modul Singleton, so dass es jetzt verfolgt den aktiven Umfang, kläre auf eine Umfangsänderung und lässt abgestandene Reaktionen an Bord fallen.
· DocsService
Ordner in einer Sammlung auflisten und erstellen
Sweite die Abfrage des Sichtbuchs auf die DocManager (AssocObjectId), Stempelt den Umfang auf erstellen, erbt es auf Duplikat, und Unebenheiten last_modifiziert von den item Mutationen, die nie schreiben die Ordner Zeile.
· DocsService
Tragen Sie den Erfassungsumfang auf dem Bindedrahtvertrag
· InitializerService
Die Sammlung jedes vorhandenen Bindemittels nachfüllen
Enterhält den Umfang aus dem ersten DOC-Element Img; leere Ordner fallen zurück auf die My Docs des Besitzers. Bewerben NICHT NULL nur nach der Verfüllung.
· kamo-shared-library
Schmale Bindemittel-Spannung zu einer Dokumentensammlung
Ersetzen Sie findVisibleToMember durch eine Zielfernung und lässt die beiden fallen unreferenzierte Sucher, die nach der toten date_updated-Spalte sortiert sind.
· kamo-shared-library
Geben Sie einem Ordner die Dokumentensammlung, zu der er gehört
Binder hatten keine assoc Soping, so dass jeder DocManager die gleiche globale gemacht pro Mitglied Pool und ein unter Marketing gebauter Ordner könnten mit HR gefüllt werden Dokumente. Speichert das ImageAssocType ordinal, um Img.assocId zu entsprechen. Fügt auch eine App-veralterte last_modifiziert: BaseEntity.dateUpdated ist **************** also hat die Liste immer mal verändert Sortieren durch Schöpfungszeit.
· kamo-internal
Gruppe der Meeting-einladen Felder durch Bedeutung, wenn maximiert
Die Aufteilung der Form in gleiche Hälften verwendet die falsche Einheit. Es streckte ein Datum Eingabe über die Hälfte des Fensters und strandete seine Ganztags-Box am weiten Rand, links zwei kurze Zeiteingänge hinterher mehrere hundert Pixel von nichts, und geschoben Fügen Sie eine volle Fenster-Breite aus der Erinnerungen gehört es zu - während Felder, die lesen, wie ein Gedanke saß Reihen auseinander. Claim Tracks aus einem 12-spalten Gitter statt, dimensioniert, was jedes Feld ist: Titel volle Breite, das Headline-Feld Datum + Ganzer | Zeit | TZ der ganze "Wann"-Cluster auf einer Linie Standort | Treffen URL, wo es ist und wie man sich anschließt Erinnerungen Label, Einträge und fließende Inline hinzufügen Die Erinnerungen allein erhalten eine Reihe zurück: Zwei kurze Auswahlen kosten keine Linie mehr. Die Zeitzone erweitert sich, um die Spuren des Time-Feldes auf einem ganztägigen Treffen zu absorbieren, so Diese Linie überspannt immer noch die Breite. Feldordnung ist unberührt - die Gruppierung kommt von Spannweiten, so dass, was Sie Registerkarte durch bleibt, was Sie sehen, in beiden Layouts.
· kamo-internal
Halten Sie das zitierte Original aus dem editierbaren Körper
Die Antwort ließ die ganze zitierte Nachricht als Bodytext in den Quill-Editor fallen. Quill kann nur ein einfaches Gitter modellieren, so dass jede Layout-Tabelle im Angebot war in eins abgeflacht und Layout-Tische sind, wie Signaturen und praktisch alle Marketing-Mail werden gebaut, weshalb eine zitierte Unterschrift als nackt zurückkam Gitter von Zellen ohne Möglichkeit, das Original zurück zu bekommen. Das Zitat reist nun eher neben dem Körper als in ihm. Antwort, Antwort-alle und nach vorne übergeben es als "quotedHtml"; der Komponist zeigt es unter der Signatur, genau dort, wo sie in der verschickten Post landet, durch die gleiche Sandbox iframe die Leseweite verwendet - so sieht es aus, wie es tat, als es ankam, und seine CSS kann nicht in den Komponisten um ihn herum durchsickern. Beim Senden ist es angefügt nach der Unterschrift. Es ist zusammengebrochen, um zu beginnen, weil auf einem langen Thread das Zitat die Antwort in den Schatten stellt. Zwei Aktionen sitzen daneben: Entfernen Sie es aus der Antwort, oder bewegen Sie es in den Körper als gewöhnlicher Text. Die zweite existiert, weil das Ausziehen des Zitats aus dem Herausgeber nahm die Fähigkeit, einen Faden auf die Linie zu trimmen beantwortet - tun dass immer noch kostet das Layout, aber es ist jetzt eine explizite Wahl, anstatt der unvermeidbarer Zahlungsausfall. Auf dem Weg nach draußen angedeutet. Das Angebot um den Editor herum Routing hat es auch geroutet um die implizite Schrubben der Herausgeber tat, so zu sanitizeEmailHtml jetzt läuft darauf, bevor es wieder gesendet wird. Bewusst NICHT durch makeHtmlLegible setzen: dass Wache Richter Farbe gegen die weiße Leinwand des Komponisten, die für den dort geschriebenen Text richtig und falsch ist für ein Zitat, das seinen eigenen <style> behält und auf seinem eigenen Hintergrund wiedergibt. Inverting Der weiße Text eines dunklen Newsletters hätte ihn dunkel-auf-dunkel gemacht. Das Angebot reitet in der Tool-Fenster-Schnappschuss, so dass ein Reload nicht verlieren, und ist konatiert auf den Körper beim Speichern eines Entwurfs - die Entwürfe Endpunkt speichert ein Körper, und ein wiedereröffneter Entwurf hält das Zitat als Text schlägt verlieren den Faden.
· kamo-internal
Paaren Sie die Sitzung-einladen Felder in zwei Spalten, wenn maximiert
Die Einladungsform stapelt acht Reihen in voller Breite, die in einer maximierten Kompoute Fenster schob den Körper-Editor die meisten der Weg aus dem Bildschirm beim Verlassen der Hälfte der Fenstersbreite leere auf beiden Seiten der Eingänge. Maximiert fließen die Felder nun in zwei Spuren in ihrer bestehenden DOM-Reihenfolge Titel|Date, Time|Timezone, Location|URL - Halbierung der Formhöhe ohne Alles neu ordnen oder das schmale Layout berühren. Erinnerungen behalten die volle Breite in beiden: die Liste wächst eine Reihe pro Erinnerung, und eine halbe Spalte würde die ganze Form Sprung in der Höhe jedes Mal, wenn man hinzugefügt wird. Tracks sind minmax(0, 1fr) anstatt 1fr, oder die Standardeinstellung einer Gitterspur min-breite:auto würde sich weigern, unter seinem Inhalt zu schrumpfen und lassen Sie die URL-Reihe Eingabe und Generieren Taste drücken Sie über die Hälfte der Breite.
· ESigService
Seitengänge und Modifikatoren auf das signierte Dokument anwenden
Der Designer hat immer Seite drehen, löschen, neu ordnen und hinzufügen-blank angeboten, plus Wasserzeichen, Seitennummern- und Labelmodifikatoren, und die abgeflachte lesen nichts davon: es Die Feldwerte auf die Quellseiten und die beigefügten Zertifikate. Eine Seite Sie gelöscht noch ausgeliefert, ein Wasserzeichen, das Sie konfiguriert nie erschienen. Alles ist jetzt angewendet. Die Pipeline ergibt sich in der Reihenfolge, die die Erwartungen eines Lesers erfordern - leere Seiten eingefügt, so dass der Indexraum des Designs mit dem Dokument übereinstimmt, jede Seite umgedreht, Hintermodifier gezeichnet, Feldwerte gestempelt, über Wasserzeichen gezeichnet, gelöscht Seiten fallen gelassen und der Rest neu geordnet, Zertifikate angehängt. Zertifikate keine Seitennummer oder Wasserzeichen tragen: Sie sind die Prüfungsaufzeichnung des Dokuments, nicht Teil davon. Seitennummerierung wird gegen die fertige Reihenfolge gelöst, so ein Dokument, dass Drops eine Seitennummern seiner Überlebenden 1..n anstatt eine Lücke zu hinterlassen. Der Designer löst diese Sequenz nun identisch auf (kamo-interne pageSequence.ts Spiegel EsignPageLayout, Fall für Fall) so dass die Vorschau nicht versprechen kann eine Zahl Zugestellte Dokumente werden nicht mitgeführt. Modifikatoren werden gegen die Seite platziert, wie der Leser es sieht, die auf einem gedreht Seite bedeutet Mapping-Display-Koordinaten zurück in den Benutzer-Raum und Vordrehen der Inhalt, damit es nicht seitlich herauskommt. EsignPageFrame tut das, und seine Vier Umdrehungen werden durch Ecktests gepinnt. Wasserzeichen verwenden das org-eigene Logo aus dem Thema Eimer. Die meisten Orgs halten SVG nur und PDFBox zieht Raster, so dass SVG durch Batik mit extern transcodiert wird Ressourcenladung verweigert - ein hochgeladenes Logo ist von Mietern gelieferten Inhalt und Rasterisieren ist nicht hygienisch. Ein Org ohne Logo bekommt kein Wasserzeichen; das Die Standardmarke der Plattform wird niemals durch die Vereinbarung eines Mieters ersetzt. Durchgehend verhärten: Design JSON ist total geparst, also alles missgebildet, aus der Reichweite oder von einem neueren Designer wird fallen gelassen, anstatt geworfen und die Unterschriften landen noch. Das Löschen jeder Seite wird verweigert - PDF hat keine Gültigkeit Null-Seiten-Formular und eine Vereinbarung ohne Seiten ist kein Dokument. Vererbte Seite Attribute werden gepinnt, bevor der Seitenbaum neu strukturiert wird. Ein Feld auf einem gelöschten Seite ist nicht auf eine andere Seite gestempelt. Text behält seine Akzente statt abgeflacht zu ASCII, pro Zeichen, gegen das, was die Schriftart encodieren kann. 59 Tests, davon 17 mit realer PDFBox-Ende und das Ergebnis zurück lesen.
· kamo-internal
Geben Sie jedem Popup-Tool-Fenster 40px mehr Platz in beiden Achsen
Die Standardeinstellung jedes Werkzeugs Größe und minSize in der Registry wächst um 40x40, und die Geometrie, die neben ihm hartcodiert wurde bewegt sich mit ihm statt Driften aus dem Abkommen heraus: - CalculatorTools pro Mode-Generable-Tabelle, die die des Rechners widerspiegelt Registrierungsvorausfall. - AiChatWindow's Restaurat-von-maximierte Größe. Bei 420x520 war es bereits ein Haare unter dem alten Minimum; gegen die neue 360x540 würde es wiederhergestellt haben das Fenster kleiner als ein Drag-Resize ist erlaubt, es zu machen. - WiederherstellungWindows() spielt jetzt eine durchgehaltene Größe nur für ein Werkzeug des Lesers kann tatsächlich die Größe ändern. Für ein Fixed-Size-Tool hallt der Schnappschuss nur zurück die Registry-Standard von dem, was auch immer es geschrieben, so eine Registerkarte nachladen über diese Änderung würde die alte 320x650 wiederhergestellt und hielt es für den Rest der sein Leben. Derselbe Wächter behebt einen Fall, der dieser Änderung vorausgeht: ein Fenster die Staffelung hatte eingespannt, um einen kurzen Blickhafen passen wurde an der geklemmte Größe und wuchs danach nie wieder auf. Die eigene Platzierung des Docks - findDockX, relayoutWindows, der makeRoom Rect und die Vermeidung des Hexhead-Motors - alle messen Live-Geometrie, so dass sie folgen neue Größen mit nichts zu aktualisieren. Behebt auch die KI-Chat maximieren Taste, die ihre Aktion aus gewählt "Höhe 800" beim Zeichnen seiner Ikone von "isMaximized". Auf jedem Aussichtsplatz kürzer als 800px Maximierung konnte nie diese Schwelle zu befriedigen, so dass die Button angeboten, um wiederherzustellen und dann wieder maximiert - das Fenster konnte nicht sein überhaupt wieder nach unten gebracht. Beide lesen nun den gleichen Wert.
· kamo-internal
Zwischen To, Cc und Bcc Empfängerchips ziehen, schneiden, kopieren und einfügen
Jemanden von To nach Bcc zu bewegen bedeutete, den Chip zu löschen und die Adresse einzugeben wieder aus dem Gedächtnis. Chips sind jetzt wählbar und können gezogen oder weitergetragen werden die Zwischenablage von einem der drei Felder in ein anderes. - klicken Sie wählt einen Chip aus; ctrl/cmd-Klick-Klicken und Shift-Klick nimmt eine Reichweite. Die Info-Karte bewegt sich von Klick auf Doppelklick, so dass ein einzelner Klick tun kann, was es tut in jedem anderen Mail-Client - holen Sie den Chip ab. - einen Chip oder eine ganze Auswahl in ein anderes Feld ziehen. Strg oder Alt gehalten macht es eine Kopie; eine eingefügte Caret zeigt, wo sie landen wird, und fallen in die im selben Feld neu ordnet. Ein Multi-Chip-Drag trägt eine Zählung, anstatt die - Strg+X / Strg+C / Strg+V-Steul-Chips zwischen Feldern bewegen. geschrieben, so dass ein Chip in den Körper geschleppt oder kopiert - oder in eine andere Mail Client ganz - kommt als gewöhnliche Adressliste an; eine private Note daneben behält Name, Foto und Kontaktlink für eine Paste zurück in Kamo. - Tastatur: Pfeile gehen die Chips (Schicht aus), Strg+A nimmt das Feld, Löschen entfernt die Auswahl und landet auf dem nächsten Chip, Escape kehrt zurück die Eingabe. Backspace in einer leeren Eingabe tritt jetzt auf den letzten Chip statt es komplett zu löschen, also ist das, was zu gehen wird, zuerst sichtbar. - Einfügen in die Eingabe-Chips jede vollständige Adresse findet, einschließlich einer Einzelne. Ein halb getipptes Fragment fällt noch bis zur Texteingabe durch. Die feldübergreifende Hälfte braucht die drei Felder, um aufeinander einzugehen, was ein Feld ist Nur eine eigene Liste zu besitzen, kann nicht; RecipientTransferProvider hält die Registrierung und führt den Umzug aus. Ein Feld ohne es gerendert - der Kampagnen-Editor verwendet ein auf seine eigene hält Auswahl, Neubestellung und die Zwischenablage, und hat einfach nirgendwo zu übertragen. parseRecipientList benötigt jetzt eine Domain und nicht nur ein '@'. parseAddress ist absichtlich lax, weil es Schlüssel ein Avatar-Cache aus was auch immer ein Kopf. getragen; ein Chip ist etwas, was wir versuchen zu liefern, und Einfügen "bob@" produziert eine, die nie gesendet werden konnte.
· kamo-internal
Drehen Sie das Feld Overlay mit der Seite, Flagge ungelesene Importe, Bestellfelder zum Lesen
Drei Dinge, die erst dann anfangen zu spielen, wenn ein Dokument mit vierzig ankommt erkannte Felder anstelle von zwei handplatzierten. Seitenrotation: Eine Seite drehen drehte die Leinwand, aber linke Felder und Anmerkungen Hinter, so rutschten sie von dem Inhalt, in dem sie verankert waren. Die beiden Schichten jetzt mit der Seite drehen, ihre Koordinaten im eigenen ungedrehten Raum der Seite halten denn das ist es, wogegen sich der Backend positioniert. Jede Pointer-Interaktion ist kartografiert zurück aus dem Bildschirm Raum durch die neue SeiteGeometrie Helfer - ziehen, Größenrechung, Anmerkungszeichnung und Fallenlassen eines neuen Feldes aus der Werkzeugkiste ungerotiert: Diese werden nicht dem Seitenrahmen gegenübergestellt, nicht dem Inhalt. Unreviewed Marker: Auto platzierte Felder tragen einen gestrichelten Ring, bis der Benutzer klickt Ein, so liest sich ein großer Import als Checkliste. Session-only, nie gespeichert. Leseauftrag: erkannte Felder werden über die Seite und über jede Zeile sortiert, mit einer Toleranz, so dass eine leicht falsch ausgerichtete Reihe immer noch von links nach rechts sortiert. Widget order in der Datei ist ein Autorenwerkzeug-Artefakt und oft keine Lesereihenfolge. Behebt auch eine Option-Wert-Kollision von mir selbst gemacht: zwei Radio-Tasten, deren gedruckte Bildunterschriften entsprechen (zwei "Ja" auf eine Frage) wurden den gleichen Wert gegeben, und der Unterzeichner zündet eine Taste an, indem er den Gruppenwert mit dem eigenen der Taste vergleicht, so hätten beide auf einmal geleuchtet.
· kamo-internal
Lesen Sie Acrobat-Format-Aktionen beim Erkennen von ausfüllbaren Feldern
Acrobat speichert das vorgesehene Format eines Feldes als JavaScript in /AA, das pdf.js Oberflächen als Aktionen.Format. Das ist eher die Erklärung des Autors als eine Vermutung vom Feldnamen, so dass es jetzt den Namen/Beschriftung heuristic übertrumpft: - AFNumber_Format -- Währung, wenn es einen Währungsstring trägt, sonst Nummer - AFDate_Format/AFDate_FormatEx -" Datum, AFTime_Format -" Zeit - AFPercent_Format --Nummer - AFSpecial_Format(n) -- zip / zip+4 / Telefon / SSN - eine Calculate-Aktion bedeutet, dass das Feld berechnet wird, so importiert es read-only Auch: eine Signatur oder ein erstes Widget dünner als die Steuerung braucht jetzt wächst von seiner unteren Kante nach oben, da ein PDF-Signatur-Feld oft nur so hoch ist als gedruckte Regel sitzt es auf und Tinte gehört über die Linie; und eine reine XFA Dokument wird als solches gemeldet, anstatt als "keine ausfüllenden Felder" zu lesen, weil seine Felder leben in XML, das AcroForm-Erkennung nicht sehen kann. Verifiziert gegen echte pdf.js 4.10.38 neben der Einheit Suite.
· kamo-internal
Fügen Sie einen neuen Sitzungslink beim Programmierer des Komponisten ein
Fügt eine Fußstütze Aktion, um das komponierende Fenster, das eine Sitzung mit der schafft Organisation konfigurierten Anbieter und schreibt seine Join-Link in den Körper wo der Skeil ist. Abgemerkt vom Meeting-Einladungs-Keebel daneben: Das heftet einen Kalender Einladung mit einer Zeit, Teilnehmer und Erinnerungen, während dies der One-Click ist "Hier ist ein Raum, kommen wann immer" Fall, der nur eine URL in der Prosa benötigt. Der Caret wird über die Unschärfe verfolgt, die der Klick sonst verursachen würde, so dass die Link Länder, in denen das Mitglied nicht an der Spitze der Nachricht, sondern auch an der Spitze der Nachricht tippt. Der create-and-linkify-Schritt, den der einladende Komponist bereits hatte, wird nun geteilt, also es gibt eine Definition, wie ein Treffen zu einem Link wird. Kamo's eigene /meet/join/<id&id" umleiten, das ist Provider-bewusst und unterschreibt Kamo-Mitglieder in Klicken Sie die Zeit.
· kamo-internal
Bauen Sie die AcroForm-Felder von PDF als native Kamo-Felder neu
Öffnen eines editierbaren PDF im Dokumenteneditor liest jetzt sein AcroForm Widget Anmerkungen aus dem pdf.js-Dokument und erstellt jedes als DesignField auf die gleiche Seite, an der gleichen Position und Größe, mit der nächsten passenden Kamo Feldtyp. Bei einem unberührten Design werden die Felder automatisch platziert (eines Schritt rückgängig machen, mit einer Undo-Aktion auf der Bekanntmachung); ansonsten bietet die Toolbox Überprüfung Dialog, der alles überspringt, was bereits von einem platzierten Feld abgedeckt. - app/lib/esign/acroform.ts: pure Erkennung. Widget-Rets werden durch die Seite viewport so Seite /Rotate wird geehrt. Strukturkarte für die Deckung Sig/Btn/Ch/Tx (Push-Buttons und versteckte Widgets fallengelassen); Text-Widgets erhalten ein semantischer Pass über die Tooltip, den Feldnamen und die daneben gedruckte Beschriftung auf der Seite, so dass "Borrower Signature" wird eine Signatur-Box und "Signature Date" ein Datum. Radio-Tasten halten ihre einzelnen Boxen und sind zusammengebunden durch eine gemeinsame verbundene GruppeId. - DesignField gewinnt optionale Optionen[], passend zum Feldoptionsvertrag Signer-App akzeptiert bereits; die Eigenschaften-Panel jetzt bearbeitet sie, und kann auch einem anderen Unterzeichner ein Feld zuweisen. Verifiziert gegen reale pdf.js 4.10.38 Parsing eine echte pdf-lib-Form, in Ergänzung zur Einheit-Suite.
· InitializerService
Erstellen Sie die E-Mail search_vector-Spalte und ihren invertierten Index
************ hat es nie gegeben. E-MailService ist selbst V1__email_metadata_schema.sql erklärt es, aber diese Migration ist nie vergangen -- die Tabelle kam von diesem Dienst-Einheit-Scan, und SearchIndexEntity lässt die Feld, weil Hibernate nicht Karte TSVECTOR, so ddl-auto konnte es nicht hinzufügen. ************ ist daher mit SQLSTATE 42703 gescheitert jede Nachricht, und weil diese UPDATE eine Transaktion mit der Zeileneinlage teilt, der Einsatz auch zurückgerollt. Die Tabelle war immer leer und E-Mail-Suche hat nie ein Ergebnis zurückgegeben.
· kamo-internal
Eine Kontaktkarte hinter jedem Namen auf einer Nachricht
Jede Person, die in einer gelesenen Ansicht gezeigt wurde, war eine Sackgasse. Zu und Cc als displayNameFor(a).join(', ') - eine Komma-Wand von Anzeigenamen ohne Adresse, nein Schwebe, keine Aktionen. Drei Dinge waren damit falsch. Die Adresse war unwiederholbar, und Display-Namen sind Angreifer-gesteuerte Header-Text, so zwei Leute, die Chris genannt wurden, waren ununterscheidbar und kopierten die Adresse von jemandem wer CC war, bedeutete, eine Antwort zu öffnen und den Chip zu inspizieren. Alles die Organisation weiß bereits über diese Person - Kollegen Aufzeichnungen, Adressbücher, Avatare, Live-Präsenz - löst sich durch Adresse und nichts davon erreicht den Bildschirm. Und ein vierzehn-empfänger Thread als eine unlesbare Linie gerendert. Das Schweben eines Namens öffnet jetzt eine Karte. Die Adressplatte ist vielmehr ihr Herzstück als ein grauer Untertitel, denn die Adresse ist die Karte, die es gibt: volle Breite, Mono, Lokalteil in Tinte und Domain-Feuer, die ganze Platte eine Kopie Steuerung, die die Nachrichten Beton über sich selbst auf Erfolg fegt, und immer noch wählbar für jeden, der lieber ziehen würde. Um ihn herum, nur Reihen, die haben etwas in ihnen: Berufsbezeichnung, Arbeitgeber, Abteilung, Nummern, die die Softphone, die Erweiterung eines Kollegen und ihre Ortszeit, bevor Sie sie anrufen. Kollegen tragen einen Live-Präsenzpunkt aus der bestehenden Präsenz und Verfügbarkeit Kontexte. Automatisierte Absender sagen dies, und eine No-Reply-Adresse bietet keine antworten, die Mailbox würde sich verweigern. Empfängerlisten der vergangenen fünf Namen kollabieren hinter einer Zählung. Die Mechaniker leben in der AnwendungHoverCard, weg von der Karte, denn nichts davon ist über Menschen: Schwebe Absicht, so dass ein Zeiger über einen Kopfball nicht feuert Karten, eine enge Gnadenfrist, so dass der diagonale Weg zur Karte nicht abweist, eine Karte zu einer Zeit geöffnet, Re-Maßnahme, wenn die Palette scrollt oder die Aufzeichnung landet, und echte Tasten, so Tastatur und berühren erreichen es überhaupt. Nur Tastatur-Fokus öffnet - Handeln auf Klick-Fokus würde die Karte in der gleichen Zecke öffnen schaltet es geschlossen, und der Chip würde träge zu einer Maus aussehen. Aufzeichnungen kommen von correspondentStore, durch Adressen schlüsseliert und nie auf Nachrichtenobjekte: beide Listenansichten Umfrage alle dreißig Sekunden und ersetzen ihre Message Array Großhandel, die alles wischen würde, was dort zweimal pro Minute getragen. Im Gegensatz zu Avataren lösen sie faul - ein ganzer Kopfball wird vorab gewertet, wenn eine Nachricht öffnet, und schweben deckt alles, was verpasst - so ist die Karte in der Regel bereits gefüllt, wenn es animiert. formatAgo bewegt sich aus MemberItem, so dass der Dienstplan und die Karte beschreiben das gleiche Abwesenheit auf die gleiche Weise.
· EmailService
Lösen Sie die Menschen hinter den Adressen auf eine Nachricht
Ein Nachrichtenkopf kennt eine Adresse und welchen Display-Namen auch immer der Absender gewählt hat daneben gestellt. Die Organisation weiß schon viel mehr - Kollegen, Adresse Bücher, Erweiterungen, Zeitzonen - und nichts davon hat den Briefkasten erreicht. POST ************ beantwortet einen Stapel Adressen mit der Person hinter jedem: Kollege (mit Berufsbezeichnung, Abteilung, Verlängerung, Zeitzone und eine Mitglieds-ID, die Präsenz und Chat entsperrt), gespeicherten Kontakt (mit Arbeitgeber, Titel und Zahlen), oder ein explizites EXTERNAL, damit der Anrufer die Antwort einzahlen kann anstatt auf jedem Schwebe zu wiederholen. Bewusst vom Avatar-Endpunkt trennen, anstatt in ihn gefaltet. Das man ist zwei-Phasen notwendig - ein voller Fehlschlag kann bedeuten, DNS plus vier HTTP-Anrufe zu Dritte - und dies ist eine Handvoll von lokalen, indiziert, org-scoped liest, dass kann auf den ersten Anruf vollständig antworten. Das Teilen eines Endpunktes würde die Synchrone Hälfte, um einen "Ach-erneueren"-Vertrag zu erben, den es nicht braucht. Beschriftet auf die bloße Adresse und nie auf dem Display-Namen, der ist Angreifergesteuerter Text: Ein Außenstehender kann ihren auf den echten Namen eines Kollegen setzen, und diese Aufzeichnung trägt die direkte Erweiterung dieses Kollegen. Der Normalisator das erzwingt, das jetzt mit dem Avatar-Endpunkt (MailboxAddress) geteilt wird, also Die beiden können nicht auseinander driften und die Cache-Einträge des anderen verfehlen. Die Organisation kommt aus der Sitzung, nie die Anfrage - der Endpunkt antwortet "Haltet dieser Mieter einen Rekord für diese Adresse", die eine Mitgliedschaft ist Orakel, wenn der Anrufer den Mieter auswählt. Ids serialize als Strings: CockroachDB-Reihen-IDs laufen an MAX_SAFE_INTEGER vorbei und EmailService hat keinen globalen Long-to-String Mapper, weil Nachrichten-Uids lang sind die Mailbox Frontend wirklich behandelt als Zahlen.
· kamo-internal
Ressourcen-Tab ist die HR-Dokumentenbibliothek der org
Ersetzt den Ressourcen-Platzhalter durch DocManager auf einer Dokumentensammlung von eigene "ImageAssocType.HR_RESOURCE, Bucket Imaging-hr-Resources" org-scoped die Art und Weise Marketing Materials ist, und bewusst von ihm trennen: ein Marketing Flyer und Mitarbeiterhandbuch gehören nicht in eine Bibliothek. Der af.- () der enum wird als ORDINAL des enums gesendet, nicht seine ID (15). Die Bildgebung Backends lösen es mit values()[assocType] und die beiden divergieren, weil die enum überspringt id 6; Senden der ID würde in den Eimer einer anderen Sammlung schreiben, so kann die My Docs Oberfläche nach dem Versand von Dokumenten nicht mehr lesen. HR_RESOURCE_ASSOC_TYPE trägt diese Argumentation neben der Konstante. DocsService und ConversionService wurden für die neue Konstante neu aufgebaut. Frontend ist das einzige, was 13 sendet, so dass es zuletzt landet.
· kamo-shared-library
HR_RESOURCE assoc Typ für die org HR Ressourcen Bibliothek
Der Reiter /hr Ressourcen veröffentlicht Handbücher, Richtlinien, Formulare und Referenzen Material für das gesamte Team, und keine vorhandene assoc-Typ passt: MY_DOCS ist ein Der eigene Bereich, der Schaufel von SYSTEM_WIDE ist E-Sign-Vorlagen und MATERIALS ist die Marketing-Bibliothek - ein Flyer und ein Mitarbeiterhandbuch gehören nicht zusammen. Org-scoped wie MATERIALS, mit Lösch/Überschreiben/Ordner auf, weil HR-Kurate dies von Hand. Doc-Typen sind erlaubt, aber optional (isAllowDocType=false, isAllowDocTypeOpt=true), also ein Org, das Handbook / Policy / Form will Kategorien können sie einschalten, ohne dass jede andere Org gezwungen wird, eine Datei einzureichen. Zuletzt angefügt, also keine vorhandenen ordinalen Verschiebungen. Sein ORDINAL ist 13, während seine ID ist 15 - das enum überspringt id 6, und Anrufer senden das Ordinal, so dass die Test-Pins 13 und verankert MATERIALS/CATALOG_SOURCE auf beiden Seiten. ConversionService und DocsService indexieren Sie die enum by ordinal und müssen umgebaut werden, bevor alles sendet 13, oder Werte()[13] wirft auf ihr kürzeres Array.
· kamo-internal
Human Resources Modul Shell mit fünf Route-Backed Tabs
Fügt /hr mit der Konten-Seite Chrom in seiner Route-Backed-Form (die gleiche /Marketing bereits verwendet): ein Layout, das den Gradienten Helden und unterstrichen Tab bar, ein Index, der auf der ersten erreichbaren Registerkarte landet, und eine Seite für Übersicht, Beratung, Recht & Compliance, Training und Ressourcen. Zwei Tore, beide erforderlich. organisatorisch.isHrs - die HRS toggle under /settings/account?tab=apps - prallt der Weg nach Hause ab, wenn die App ausgeschaltet ist, da mit ihm off /hr ist nicht ein Ort, der für die org existiert. Mit der App auf, die elf bestehende ServiceType.HRS-Rechte entscheiden: eine neue hatAnyHrRight-Verbindung Tor verbindet **************** und jeder Tab trägt eine OR-Gruppe Prädikat (HR hat keine einheitliche Ansicht richtig, wie Marketing tut). Tabs die Mitgliederausfälle werden aus der Bar ausgeblendet und auf direkten URL-Eintrag verweigert. Registriert 'Sthr' in der näuslichen Registry über Einstellungen, die in der primären rail; die Home-Launft-Karte und der Befehlspalette-Eintrag folgen aus der Registrierung Mitgliedschaft. Registrierungsbestellung allein regelt nur First-Run-Mitglieder, obwohl orderZone anhängte nie arrangierte ids, so dass jeder, der jemals ihr neigenes berührt hatte hätte HR *unter* Einstellungen. mergeCanonicalOrder jetzt fügt solche IDs ein die Position, die die Registrierung fragt und verwendenHomeLayout verwendet die gleiche Regel, so dass die deklarierte Platzierung gilt für bestehende Mitglieder und auch für jede zukünftige Option. Tab-Körper sind Platzhalter: Es gibt kein HR-Datenmodell irgendwo im Backend noch (kein Mitarbeiter, Anwesenheit, Gehaltsabrechnung, Schulung oder Compliance-Einheit in SecurityService, APIService oder die gemeinsame Bibliothek), so dass jede Registerkarte selbst und was es halten wird. Spec in docs/superpowers/specs.
· kamo-internal
Komplettiert die Registerkarte Kommunikation
Jeder Sub-Tab hat nun seine eigenen Daten, und Alle verzahnen sich jeden Kanal nach Datum. Anmerkungen behält MediaStream, weil Anmerkungen hier verfasst werden, aber lesen SieOnlyChrome Streifen die sozialen Ermächtigungen eine Kundendaten hat keine Verwendung für: die PUBLIC / PRIVATE Accessor im Komponisten und auf jedem Beitrag, der Autor bearbeiten/löschen Menü, und die like / comment / share row mit seinem Kommentar-Thread. Chat hält das Leben SocialConversationView. Alle, Anrufe, Texte und E-Mails machen die neue EmailEntry bricht eine Nachricht an eine Zeile - Absender, Betreff, öffnende Worte . und expandiert an Ort und Stelle. Die Korrespondenz eines Leads kann zu Hunderten von Nachrichten laufen und sie in voller Höhe zu machen die Registerkarte unbrauchbar. Der Körper ist nicht geholt, bis die Zeile geöffnet wird, denn jede Lektüre ist ein Live-Anbieter rund Reise; es macht dann durch die gleichen SanitizedEmailRenderer / Nachrichten verwendet, so gibt es keinen zweiten, weniger geprüften Pfad für nicht vertrauenswürdiges HTML. Behoben auf dem Weg: PostCard's Edit Menüpunkt genannt handleMenuClose, so hatte es öffnete nie den Editor; und MediaStream ließ PostCard's onPostDeleted / aufPostUpdated vollständig, so dass eine gelöschte oder bearbeitete Beitrag blieb auf dem Bildschirm in seiner alten formen bis zu einer vollständigen Nachladung. Hardcoded "Public"/"Private"/"Post" im Komponisten Verwenden Sie nun die Wörterbuch-Schlüssel, die bereits existierten.
· SecurityService
Unified communications timeline API
GET ************ gibt eine datumsbestellung quer zurück Notizen, Anrufe, Voicemails, Texte, E-Mails und Chat; ?channel= verengt es. Drei Quellen werden zusammengeführt. Anrufe, Voicemails, Texte und E-Mails kommen von der LEAD_COMMUNICATIONS Verbände; Anmerkungen und Chat werden direkt von der Lead-Medien-Stream und Social-Sitzung, weil beide sind bereits Lead-Key-Sitzung Sie zu spiegeln, hätte ein Dual-Schreib-Konsistenz-Problem hinzugefügt und, ohne zurückfüllen, jede Notiz und Chat-Nachricht verloren, die bereits existiert. Paging ist Keyset, nicht Offset. Offset über verschmolzene Quellen ist falsche Vergangenheit Seite ein: wie viele Zeilen jede Quelle beiträgt variiert, so dass "Skip 25" nicht auf streng älter, so dass jede Seite gleich viel kostet und nichts übersprungen oder wiederholt wird auch wenn mehrere Einträge einen Zeitstempel teilen. Die Genehmigung spiegelt das Blei-Detail-Gatter genau, und hat zu . weitgehend der Lead-eigenen Kontaktwert plus den Content ausgetauscht, so dass ein Anrufer ohne VIEW_LEAD_CONTACT_INFO_OTHERS auf der Führung eines anderen darf nicht in der Lage sein, lesen Sie aus diesem Endpunkt, was die maskierte Bleiansicht zurückhält. Dementis werden geprüft, nicht nur Erfolge. Der E-Mail-Körper-Endpunkt löst die Mailbox des Vereins statt vom Anrufer: Lead Mail ist org-weit, so dass die Nachricht oft in einem Die Mailbox des Kollegen und UIDs sind nur innerhalb eines Ordners einzigartig - ein Browser-gesteuert holen würde still eine nicht verwandte Nachricht aus dem eigenen Mailbox des Betrachters zurück. MediaAssetUrls extrahiert die Avatar/Image URL-Builder, die privat waren MediaStreamController, so dass ein Beitrag Autor macht identisch in der Registerkarte Notizen und die Registerkarte Alles.
· DaemonService
Fahren Sie die Mail-to-Lead-Verein Sweep
Fünf-Minuten-Tick gegen den internen Sweep-Endpunkt von EmailService, Spiegelung VoipGlobalSyncJob. Der Zeitplan lebt hier, weil E-MailService mehrere läuft Hülsen und eine @Scheduled Bean dort würde jede Replik fegen jede Briefkasten auf einmal. @DisallowConcurrentExecution plus endliche HTTP Timeouts: ein Sweep over every Mailbox kann die Zecke überschreiten, und ohne die Wache Quarz würde Stapel läuft, bis jeder Arbeiter-Thread saß im EmailService. Die Timeouts sind für dasselbe wichtig Vernunft - mit dem Concurrency Guard an Ort und Stelle, würde ein unbefristeter Anruf verhindern, dass der Sweep jemals wieder läuft, bis die Hülse neu gestartet ist.
· EmailService
Associate Lead Korrespondenz, und beheben Sie die tote Push-Indexer
Fügt die Mail die Hälfte der Lead Communications Registerkarte, plus die Aufnahme es benötigt überhaupt zu existieren. Die Plattform hat keinen funktionierenden Mail-Push: IMAP IDLE ist nach Dovecot fest codiert, da ist keine Graph Änderung-Benachrichtigung oder Google Mail-Uhr, und MessageIndexer verworfen jede Benachrichtigung, die sie jemals erhalten hat, weil der IDLE-Publisher die UID weggelassen hat sein uid<=0 Wache lehnt ab - es hat auch das Mitglied vom Absender eher gelöst als der Briefkastenbesitzer. Beide sind hier fixiert, aber ein Haken auf diesem Weg allein wäre immer noch nichts für die meisten Mieter getan, so Verein wird durch einen Sweep angetrieben über jede Mailbox über MailReader, die durch Konstruktion anbieter-agnostisch ist. Die Sweep-Seiten auf einem Zeitstempel, nicht eine UID. UIDs sind nur innerhalb eines monoton IMAP UIDVALIDITY Epoche; eine ratschende Hochwassermarke droht, eine Mailbox zum Schweigen zu bringen erneute Prüfung ist kostenlos, weil das Verlinken idempotent ist. CompanyAddressResolver setzt die Regel des Eigentümers um: Niemals eine Nachricht assoziieren wobei die Adresse des Leads und alle anderen Teilnehmer sind Unternehmen im Besitz - anderweitig die Arbeitsadresse eines Kollegen zu einer Führungsrolle hinzufügen würde ihre internen Post aussetzen. Es scheitert GESCHICHTIGT: ein Inventar, das es nicht laden konnte antwortet "unbekannt" und Assoziation wird übersprungen, anstatt "extern" zu antworten und stillschweigend die Wache deaktivieren. **************** holt einen Körper im Auftrag des Briefkastens, der hält es. Der gewöhnliche Endpunkt löst den Anbieter für den Anrufer und UIDs sind nur innerhalb eines Ordners einzigartig, so dass es auf die UID eines anderen Mitglieds zielt unzusammenhängende Nachricht anstelle eines Fehlers. Zulassung lebt in SecurityService, die die Mailbox vom Verein und nicht vom Browser löst. Linking zum Senden wurde ausprobiert und entfernt: SMTP gibt keine Message-ID zurück noch ein gesendetes UID, so dass jede ausgehende Post an eine Leitung auf einen Verband zusammenbrach ohne Ortungsgerät, um zu erweitern. Der Sweep besitzt es.

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