Changelog
Cosa c'è di nuovo.
Ogni miglioramento alla piattaforma, come si spedisce.
· kamo-shared-library
Aggiunga le assegnazioni per membro e i progressi per documento
La riga del documento è la unione che rende N e-sign buste leggere come un unico pacchetto. Il conteggio del badge viene fuori dallo stato di assegnazione, non e-sign status: destinatario lo stato non ha VOIDED o EXPIRED, il vuoto non tocca mai le righe del destinatario, e un pacchetto di riconoscimento-solo non ha buste affatto.
· kamo-shared-library
Blocca il contenuto del pacchetto in versioni immutabili
ImgDat blob id e la sua SHA-256, non solo imgId — un Docs salvare indica lo stesso Img a nuovi byte, così imgId da solo avrebbe lasciato due membri firmare diversi documenti in ids identici. Istantanee anche il design, quindi l'esecuzione mai dipende dalla risoluzioneIl ritorno diDesignJson al nuovo layout.
· kamo-shared-library
Obiettivo di un pacchetto in reparti, tipi di lavoro o membri nominati
Formata su SystemUserAccess. Aggiunge il risolutore del pubblico a TeamMemberRepo, che era un'interfaccia vuota; il predicato ACTIVE + recordState è ciò che mantiene il personale terminato e i candidati non accompagnati da una consegna.
· kamo-shared-library
Aggiungi le entità del modello del pacchetto legale
Un pacchetto è un insieme ordinato di leganti più un pubblico. I riferimenti di Binder sono soft ids perché leganti sono selezionabili dall'utente e cascata i loro elementi. The l'attestazione è memorizzato in pieno con il suo hash — un puntatore non può dimostrare che un membro ha accettato.
· kamo-internal
Rendere il deposito del legante consapevole della sua collezione
Il negozio è un modulo singleton, quindi ora traccia la portata attiva, si schiarisce su un cambiamento di portata, e gocce stale in-flight risposte.
· DocsService
Elenca e crea leganti all'interno di una collezione
Scope la query visibile-binder al DocManager's (assocType, assocObject Id), timbri la portata su creare, lo eredita su duplicato, e urti last modified dalle mutazioni del prodotto che non scrivono mai la riga leganti.
· DocsService
Portare il campo di raccolta sul contratto del legante
· InitializerService
Riempire la collezione ogni legante esistente appartiene a
Deriva la portata dal Img del primo prodotto DOC; i leganti vuoti tornano a Il proprietario e' il mio dottore. Si applica NON NULL solo dopo il riempimento.
· kamo-shared-library
Visibilità del legante stretto a una raccolta di documenti
SostituisceVisibleToMember con una variante di portata e scende i due Trovatori non riferiti che ordinati dalla colonna data updated morta.
· kamo-shared-library
Dare un legante la raccolta del documento che appartiene a
Binders non aveva assoc scoping, quindi ogni DocManager ha reso lo stesso globale piscina per membro e un legante costruito sotto Marketing potrebbe essere riempito con HR documenti. Conserva l'Ordinale ImageAssocType per abbinare Img.assocId. Aggiunge anche un app-managed last modified: BaseEntity.dateUpdated is Quindi la lista e' ordinata e modificata e' sempre... sta ordinando da tempo di creazione.
· kamo-internal
Raggruppare i campi d'invito di riunione per significato quando massimizzato
Dividere la forma in metà uguali ha usato l'unità sbagliata. Ha allungato una data ingresso attraverso la metà della finestra e ha infilato la sua casella di tutti i giorni al bordo lontano, a sinistra due brevi ingressi di tempo che seguono diverse centinaia di pixel di nulla, e spinto Aggiungere una larghezza di finestra completa dai Reminders a cui appartiene — mentre i campi che leggere come un pensiero sedeva righe separate. Pretendiamo tracce fuori una griglia di 12 colonne, invece, dimensionato a quello che ogni campo è: Titolo larghezza totale, il campo di titolo Data + Tutto il giorno | Tempo | TZ l'intero cluster "quando" su una linea | URL di riunione dove si trova e come aderire Etichetta, voci e aggiunta in linea di flusso Reminders da solo ottiene una riga indietro: due brevi selezioni non costano più una linea ciascuno. Il fuso orario si allarga per assorbire le tracce del campo Time in un incontro di tutti i giorni quella linea copre ancora la larghezza. L'ordine di campo è intatto — il raggruppamento viene da spans, in modo che cosa si scheda attraverso rimane quello che si vede, in entrambi i layout.
· kamo-internal
Tenere l'originale citato fuori dal corpo modificabile
La risposta ha lasciato cadere l'intero messaggio citato nell'editor Quill come testo del corpo. Quill può solo modellare una semplice griglia, quindi ogni tabella di layout nella citazione era appiattiti in uno — e le tabelle di layout sono come firme e praticamente tutte la posta di vendita sono costruiti, motivo per cui una firma citata è tornato come un nudo griglia di celle senza alcun modo per ottenere la schiena originale. La citazione ora viaggia accanto al corpo piuttosto che dentro di esso. Rispondi, risponde-all e consegnalo in avanti come `quotedHtml`; il compositore lo mostra sotto firma, esattamente dove atterra nella mail inviata, reso attraverso la stessa iframe sabbiato utilizza il pannello di lettura — così sembra come ha fatto quando è arrivato, e il suo CSS non può penetrare nel compositore intorno a esso. All'atto dell'invio è allegato dopo la firma. È collassato per iniziare, perché su un lungo filo la citazione nanisce la risposta. Due azioni siedono accanto a esso: rimuoverlo dalla risposta, o spostarlo nel corpo come testo ordinario. Il secondo esiste perché togliere la citazione dall'editor ha tolto la capacità di tagliare un filo fino alla linea che viene risposto — facendo che costa ancora il layout, ma ora è una scelta esplicita piuttosto che default inevitabile. Sanitizzata mentre usciva. Anche l'instradamento della citazione intorno all'editor intorno alla pulizia implicita che l'editor stava facendo, quindi sanitizeEmailHtml ora corre su di esso prima che sia ri-sent. Deliberatamente NON mettere attraverso makeHtmlLegible: che la guardia giudica colore contro la tela bianca del compositore, che è giusto per il testo scritto lì e sbagliato per una citazione che mantiene il proprio <style> e rende sul proprio sfondo. Invertire Il testo bianco di una newsletter a tema oscuro l'avrebbe reso buio su strada. La citazione cavalca nell'istantanea della finestra degli strumenti in modo che una ricarica non lo perda, ed è concatenato sul corpo quando si salva una bozza — le bozze endpoint memorizza una corpo, e una bozza riaperto che tiene la citazione come testo batte perdendo il filo.
· kamo-internal
Abbina i campi invisibili all'incontro in due colonne quando massimizzato
Il modulo di invito impila otto righe a larghezza intera, che in una composizione massimizzata finestra ha spinto l'editor del corpo la maggior parte del modo fuori schermo mentre lasciando metà della larghezza della finestra vuota sia lato degli ingressi. Massimizzato, i campi ora fluiscono in due tracce nel loro ordine DOM esistente — Titolo|Date, Time|Timezone, Location|URL — halving l'altezza del modulo senza riordinare qualsiasi cosa o toccare il layout stretto. I ripetitori mantengono la larghezza completa in entrambi: l'elenco cresce una riga per promemoria, e la metà di una colonna renderebbe tutta la forma saltare in altezza ogni volta che uno è aggiunto. Le tracce sono minmax(0, 1fr) piuttosto che 1fr, o di default di una traccia di griglia min-width:auto si rifiuterebbe di ridurre al di sotto del suo contenuto e lasciare la riga URL inserire e generare pulsante passare oltre la metà della larghezza.
· ESigService
Applicare operazioni di pagina e modificatori al documento firmato
Il designer ha sempre offerto pagina ruotare, eliminare, riordinare e aggiungere-blank, più filigrana, numero di pagina e modifica etichette, e l'adulato non ne legge nessuno: esso valori di campo timbrati sulle pagine di origine e certificati allegati. Una pagina cancellato ancora spedito, una filigrana che hai configurato non è mai apparso. Tutto è ora applicato. La pipeline compone nell'ordine le aspettative di un lettore richiedono — pagine vuote inserito in modo che lo spazio indice del design corrisponda al documento, ogni pagina girata, dietro-modificatori disegnati, i valori di campo timbrati, i segni sopra-acqua disegnati, cancellati le pagine sono calate e il resto riordinato, i certificati allegati ultimo. Certificati non portare numero di pagina o filigrana: sono il record di audit del documento, Non ne fa parte. La numerazione della pagina viene risolta contro la sequenza finita, quindi un documento che cala un numero di pagina i suoi sopravvissuti 1..n piuttosto che lasciare un gap. Il designer ora risolve la sequenza identicamente (kamo-internal pageSequence.ts mirrors EsignPageLayout, caso per caso) quindi l'anteprima non può promettere un numero documento consegnato non porterà. I modificatori sono posizionati contro la pagina come il lettore lo vede, che su un girato pagina significa mappare le coordinate del display nello spazio dell'utente e pre-ritornare contenuto in modo che non esca da parte — EsignPageFrame lo fa, e la sua quattro rotazioni sono fissate da test di angolo. Le filigrane utilizzano il logo dell'org dal secchio a tema. La maggior parte delle org tiene SVG solo e PDFBox disegna raster, quindi SVG è codificato attraverso Batik con esterno il caricamento delle risorse rifiutato — un logo caricato è contenuto fornito dall'inquilino e rasterizzare non è sanificante. Un org senza logo non ottiene filigrana; il il segno di default della piattaforma non viene mai sostituito su un accordo di inquilino. Indurimento in tutto: il design JSON è parsed totalmente, quindi qualsiasi cosa malformata, fuori gamma o da un designer più nuovo è caduto piuttosto che gettato e le firme sono ancora a terra. Cancellare ogni pagina è rifiutato — PDF non ha validità il modulo zero-page e un accordo senza pagine non è un documento. Pagina inesorata attributi sono pinned prima che l'albero della pagina sia ristrutturato. Un campo su un cancellato pagina non è timbrata su un'altra pagina. Il testo mantiene i suoi accenti invece di essere appiattito a ASCII, per carattere, contro quello che il carattere può codificare. 59 test, 17 di loro guida PDFBox reale fine a fine e la lettura del risultato indietro.
· kamo-internal
Dare ogni finestra strumento popup 40px più spazio in entrambi gli assi
Ogni strumento predefinitoSize e minSize nel Registro di sistema cresce di 40x40, e il geometria che è stato hardcoded accanto si muove con esso piuttosto che alla deriva di accordo: - CalculatorTool's per-mode size table, che rispecchia il calcolatore default del registro. - Il recupero di AiChatWindow dalle dimensioni massime. A 420x520 era già capelli sotto il vecchio minimo; contro il nuovo 360x540 avrebbe restaurato la finestra più piccola di un drag-resize è permesso di farlo. - ripristinareWindows() ora riproduce una dimensione perseverata solo per uno strumento il lettore può effettivamente ridimensionare. Per uno strumento a dimensione fissa l'istantanea riecheggia semplicemente il default del Registro di sistema di qualsiasi build lo ha scritto, quindi una scheda di ricarica questo cambiamento avrebbe ripristinato il vecchio 320x650 e tenuto per il resto la sua vita. La stessa guardia fissa un caso che preveda questo cambiamento: una finestra il relèout era bloccato giù per adattarsi un breve viewport è stato persistito al dimensioni bloccate e non è mai cresciuto dopo. La posizione del dock — trovareDockX, relayoutWindows, il makeRoom rect e l'evidenza del motore hexhead — tutti misurano la geometria dal vivo, quindi seguono il nuove dimensioni con nulla da aggiornare. Corregge anche il pulsante AI chat massimizzare, che ha scelto la sua azione da `altezza > 800` mentre disegna la sua icona da `isMaximized`. Su qualsiasi vista più breve di 800px massimizzare non poteva mai soddisfare quella soglia, così il pulsante offerto per ripristinare e poi massimizzare di nuovo — la finestra non potrebbe essere è stato riportato giù. Entrambi ora leggono lo stesso valore.
· kamo-internal
Trascinare, tagliare, copiare e incollare chip destinatari tra A, Cc e Bcc
Trasferire qualcuno da To a Bcc significava eliminare il chip e digitare l'indirizzo di nuovo dalla memoria. I chip sono ora selezionabili e possono essere trascinati o portati avanti il clipboard da uno qualsiasi dei tre campi in qualsiasi altro. - click seleziona un chip; ctrl/cmd-click toggles e shift-click prende un intervallo. La scheda info si sposta dal clic al doppio clic, quindi un singolo clic può fare quello fa in ogni altro client di posta - raccogliere il chip. - trascina un chip o un'intera selezione in un altro campo. Ctrl o Alt tenuto lo rende una copia; una caretta di inserimento mostra dove atterra, e cadere all'interno lo stesso campo riordina. Un trascinamento multichip porta un conteggio piuttosto che mostrare - Ctrl+X / Ctrl+C / Ctrl+ V spostare chip tra i campi. testo/lamento è sempre scritto, quindi un chip trascinato o copiato nel corpo — o in un'altra posta cliente del tutto - arriva come una lista di indirizzi ordinaria; un sapore privato accanto mantiene il nome, la foto e il link di contatto per una pasta di nuovo in Kamo. - tastiera: le frecce camminano i chip (il cambiamento si estende), Ctrl+ A prende il campo, Elimina rimuove la selezione e atterra sul chip successivo, Escape torna a l'ingresso. Backspace in un ingresso vuoto ora passa all'ultimo chip invece di cancellarlo in modo diretto, quindi quello che sta per andare è visibile prima. - incollare i chip di input ogni indirizzo completo che trova, incluso un Una sola. Un frammento di tipo mezzo passa ancora all'ingresso del testo. La metà del campo trasversale ha bisogno dei tre campi per agire l'uno sull'altro, che un campo possedere solo la propria lista non può fare; RecipientTransferProvider detiene il registro ed esegue la mossa. Un campo reso senza di esso — l'editor di campagna utilizza uno da solo — mantiene la selezione, il riordino e la clipboard, e semplicemente ha dove trasferirsi. parse. L'elenco richiede ora un dominio piuttosto che solo un '@'. parseAddress è volutamente lax perché le chiavi di una cache di avatar da qualsiasi intestazione portato; un chip è qualcosa che cercheremo di consegnare, e incollare "bob@" prodotto uno che non potrebbe mai essere inviato.
· kamo-internal
Ruotare la sovrapposizione di campo con la pagina, contrassegnare le importazioni, i campi di ordine per la lettura
Tre cose che iniziano a importare solo una volta che un documento arriva portando quaranta campi rilevati invece di due posizionati a mano. Rotazione della pagina: ruotare una pagina ha girato la tela ma ha lasciato i campi e le annotazioni dietro, così hanno staccato il contenuto a cui erano ancorati. I due strati ora girare con la pagina, mantenendo le loro coordinate nello spazio non danneggiato della pagina perché è quello che il backend si posiziona contro. Ogni interazione del puntatore è mappato indietro dallo spazio dello schermo attraverso la nuova paginaAiutenti di geometria — trascinando, ridimensionare, annotare il disegno, e cadere un nuovo campo dalla cassetta degli strumenti — e unrotated: quelli sono posizionati contro il frame della pagina, non il suo contenuto. Marcatore non visualizzato: i campi auto-placed portano un anello schiacciato fino a quando l'utente clicca uno, quindi una grande importazione legge come una lista di controllo. Solo sessione, mai salvata. Ordine di lettura: i campi rilevati vengono ordinati lungo la pagina e attraverso ogni riga, con una tolleranza in modo da una riga leggermente disallineata ancora ordina da sinistra a destra. Widget ordine nel file è un artefatto autore-tool e spesso non è lettura ordine. Corregge anche una collisione di valore di opzione del mio fare: due pulsanti radio il cui corrispondenza delle didascalie stampate (due "Sì" su una domanda) sono stati dati lo stesso valore, e il firmatario accende un pulsante confrontando il valore del gruppo al pulsante, così entrambi avrebbero acceso subito.
· kamo-internal
Leggere le azioni di formato Acrobat quando si rilevano i campi riempibili
Acrobat memorizza il formato desiderato di un campo come JavaScript in /AA, che pdf.js superfici come azioni. Formato. Questa è la dichiarazione dell'autore piuttosto che un'ipotesi dal nome del campo, quindi ora supera il nome/caption heuristic: - AFNumber Format -> valuta quando trasporta una stringa di valuta, altro numero - AFDate Format/AFDate FormatEx -> data, AFTime Format -> ora - AFPercent Format -> numero - AFSpecial Format(n) -> zip / zip+4 / telefono / SSN - un'azione di calcolo significa che il campo è calcolato, quindi importa solo in sola lettura Inoltre: una firma o widget iniziale più sottile delle esigenze di controllo ora cresce verso l'alto dal suo bordo inferiore, dal momento che un campo di firma PDF è spesso solo alto come la regola stampata si siede e l'inchiostro appartiene sopra la linea; e un puro XFA documento viene segnalato come tale invece di leggere come "nessun campo riempibile", perché i suoi campi vivono in XML che il rilevamento di AcroForm non può vedere. Verificato contro pdf.js reale 4.10.38 accanto alla suite unità.
· kamo-internal
Inserire un nuovo link di incontro al coder del compositore
Aggiunge un'azione piè di pagina alla finestra di composizione che crea un incontro con la fornitore configurato dell'organizzazione e scrive il suo link di unione nel corpo dovunque sia il premuroso. Distinta dal meeting-invite da attivare accanto a esso: che allega un calendario invito con un tempo, partecipanti e promemoria, mentre questo è il solo clic "qui è una stanza, vieni ogni volta" caso che ha bisogno solo di un URL nella prosa. La carenza è tracciata attraverso il blur il clic altrimenti causerebbe, quindi il link terre dove il membro stava digitando piuttosto che in cima al messaggio. Il passo creato-e-linkify che il compositore invitato aveva già è ora condiviso, quindi c'è una definizione di come un incontro diventa un collegamento — Kamo /meet/join/hyid> redirect, che è provider-aware e firma membri Kamo in click time.
· kamo-internal
Ricostruire i campi AcroForm di un PDF riempibile come campi nativi di Kamo
L'apertura di un PDF modificabile nell'editor del documento legge ora il suo widget AcroForm annotazioni dal documento pdf.js e ricrea ciascuno come DesignField su la stessa pagina, alla stessa posizione e dimensione, con la corrispondenza più vicina Kamo tipo di campo. Su un design intatto i campi vengono posti automaticamente (uno disfare passo, con un'azione Annulla sul avviso); altrimenti la cassetta degli strumenti offre una finestra di dialogo che salta qualcosa già coperto da un campo posto. - app/lib/esign/acroform.ts: rilevamento puro. I lettini Widget vengono convertiti attraverso la pagina viewport quindi page /Rotate è onorato. Copripiumini strutturali Sig/Btn/Ch/Tx (push pulsanti e widget nascosti caduti); widget di testo ottenere un il passaggio semantico sopra la punta degli strumenti, il nome del campo e la didascalia stampata accanto a loro sulla pagina, quindi "Borrower Signature" diventa una casella di firma e "Data della gravidanza" una data. I pulsanti radio tengono le loro singole scatole e sono legato insieme attraverso un link condivisoGroupId. - DesignField acquisisce opzioni opzionali[], corrispondente al campo opzione contratto app signer già accetta; il pannello proprietà ora li modifica, e può anche riassegnare un campo ad un altro firmatario. Verificato contro pdf.js reale 4.10.38 parsing una forma reale pdf-lib-costruita, in Oltre alla suite.
· InitializerService
Creare la colonna e-mail search vector e il suo indice invertito
Non esisteva mai. EmailService V1 email metadata schema.sql lo dichiara, ma quella migrazione non è mai andata -- la tabella proveniva dalla scansione dell'entità di questo servizio, e SearchIndexEntity omette la campo perché Hibernate non può mappare TSVECTOR, così ddl-auto non poteva aggiungerlo. ****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** ogni messaggio, e perché l'UPDATE condivide una transazione con l'inserto di riga, anche l'inserto ripiegato. La tabella è sempre stata vuota e la ricerca e-mail è stata mai restituito un risultato.
· kamo-internal
Una scheda di contatto dietro ogni nome su un messaggio
Ogni persona mostrata in una visione di lettura era un vicolo cieco. A e Cc resi come displayNameFor(a).join(', ') — una parete virgola di nomi di visualizzazione senza indirizzo, no Hover, niente azioni. Tre cose si sono sbagliate. L'indirizzo era non recuperabile, e i nomi di visualizzazione sono testo intestazione controllato da aggressore, quindi due persone chiamate Chris erano indistinguibili e copiare l'indirizzo di qualcuno che era CC' significava aprire una risposta e controllare il chip. Tutto l'organizzazione già sa di quella persona — i registri dei colleghi, i libri di indirizzo, avatars, presenza dal vivo — risolve per indirizzo e nessuno di esso ha raggiunto lo schermo. E un filo di quattordici recipienti reso come una linea illeggibile. Hovering un nome ora apre una carta. La targa dell'indirizzo è il suo centrotavola piuttosto di un sottotitolo grigio, perché l'indirizzo è quello che la carta esiste per consegnare: larghezza piena, mono, parte locale in inchiostro e dominio più leggero, l'intero piatto una copia controllo che spazza l'accento dei messaggi su se stesso sul successo, e ancora selezionabile per chi preferisce trascinare. Intorno a esso, solo le righe che hanno qualcosa in loro: titolo di lavoro, datore di lavoro, dipartimento, numeri che comporre il softphone, estensione di un collega, e il loro tempo locale prima di chiamarli. I colleghi portano un punto di presenza dal vivo dalla presenza e dalla disponibilità esistenti contesti. I mittenti automatizzati dicono così, e un indirizzo no-replica non offre un rispondere alla casella di posta si rifiuterebbe. Le liste riscosse oltre cinque nomi crollano dietro un conteggio. I meccanici vivono in usoHoverCard, lontano dalla carta, perché nessuno di esso è su persone: hover intent così un puntatore che attraversa un intestazione non spara carte, un periodo di grazia vicino in modo che il percorso diagonale per la carta non lo scarta, uno carta aperta alla volta, ri-measurement quando il pannello scorre o il record atterra, e veri pulsanti in modo da tastiera e toccare raggiungere a tutti. Solo la messa a fuoco della tastiera apre — agendo su click focus aprirebbe la carta nello stesso segno del clic toggles it shut, e il chip sembrerebbe inerte a un mouse. I record provengono da corrispondenteStore, chiave per indirizzo e mai fusi su oggetti di messaggio: entrambe le viste di lista sondano ogni trenta secondi e sostituiscono il loro messaggi array all'ingrosso, che pulirebbe qualsiasi cosa portata lì due volte al minuto. A differenza di avatar che risolvono pigramente — un intero intestazione è prefetto quando un messaggio si apre, e hovering copre tutto ciò che mancava — quindi la carta è normalmente già riempito quando si anima. formatAgo si sposta da MemberItem in modo che il roster e la carta descrivono lo stesso l'assenza allo stesso modo.
· EmailService
Risolvere le persone dietro gli indirizzi su un messaggio
Un intestazione del messaggio conosce un indirizzo e qualsiasi nome del display il mittente ha scelto di accanto. L'organizzazione sa già molto di più — colleghi, indirizzo libri, estensioni, fusi orari e nessuno di essi raggiunse la cassetta postale. Risponde a un lotto di indirizzi con un gruppo di indirizzi. persona dietro ogni: collega (con titolo di lavoro, dipartimento, estensione, fuso orario e un membro id che sblocca la presenza e chat), contatto salvato (con il datore di lavoro, titolo e numeri), o un ESTERNO esplicito in modo che il chiamante possa memorizzare la risposta invece di ri-asking su ogni hover. Deliberatamente separato dal punto di estremità avatar piuttosto che piegato in esso. Che cosa? uno è due fasi per necessità — una full miss può significare DNS più quattro chiamate HTTP a terzi — e questa è una manciata di locale, indicizzato, org-scoped legge che può rispondere completamente alla prima chiamata. La condivisione di un punto finale costringerebbe la metà sincrona per ereditare un contratto "chiedi di nuovo più tardi" non ha bisogno. Registrato sull'indirizzo nudo e mai sul nome del display, che è testo controllato da un aggressore: un estraneo può impostare il loro nome reale di un collega, e questo disco porta l'estensione diretta del collega. Il normalizzatore che fa rispettare che ora è condiviso con l'avatar endpoint (MailboxAddress), così i due non possono allontanarsi e mancare le voci della cache. L'organizzazione viene dalla sessione, mai la richiesta — il punto finale risponde "questo inquilino ha un record per questo indirizzo", che è un'iscrizione Oracolo se il chiamante sceglie l'inquilino. Ids serializzare come stringhe: CockroachDB file ids eseguire oltre MAX SAFE INTEGER, e EmailService non ha un mapper globale a lungo termine perché gli uids dei messaggi sono lunghi la casella di posta anteriore tratta genuinamente come numeri.
· kamo-internal
La scheda Risorse è la libreria di documenti HR dell'org
Sostituisce il titolare delle risorse con DocManager su una raccolta di documenti proprie — ImageAssocType.HR RESOURCE, secchiello-resources — org-scoped il modo Marketing Materiali è, e deliberatamente separato da esso: un marketing flyer e un manuale del dipendente non appartengono in una libreria. Il tipo di assoc viene inviato come ORDINALE dell'enum (13), non il suo id (15). L'imaging backends risolvere con valori()[assocType] e i due diverge perché il enum skips id 6; inviare l'id scriverebbe in un secchio di un'altra collezione, che è come i Miei Docs superficie una volta spedito documenti che non poteva leggere indietro. HR RESOURCE ASSOC TYPE porta questo ragionamento accanto alla costante. DocsService e ConversionService sono stati ricostruiti per la nuova costante prima — la frontend è l'unica cosa che invia 13, quindi atterra ultimo.
· kamo-shared-library
Tipo di assoco HR RESOURCE per la libreria risorse HR
La scheda Risorse /hr pubblica manuali, politiche, forme e riferimenti materiale per tutta la squadra, e nessun tipo di assoc esistente si adatta: MY DOCS è un area propria della persona, il secchio di SYSTEM WIDE è modello e-sign, e MATERIALS è la biblioteca di marketing — un volantino e un manuale del dipendente non appartengono insieme. Org-scoped like MATERIALS, con delete/overwrite/cartelle su perché HR cura questo a mano. I tipi di Doc sono ammessi ma facoltativi (isAllowDocType=false, isAllowDocTypeOpt=true), quindi un org che vuole Handbook / Policy / Form categorie possono accenderli senza che ogni altro org sia costretto a depositare uno. Ultimo allegato, quindi nessun cambiamento ordinale esistente. Il suo ORDINAL è 13 mentre il suo id è 15 — gli skips enum id 6, e i chiamanti inviano l'ordinal, così i perni di prova 13 e ancora MATERIALI/CATALOG SOURCE entrambi i lati. Servizio di conversione e DocsService indice l'enum di ordinale e bisogno di ricostruzione prima di tutto invia 13, o valori()[13] getta sul loro array più breve.
· kamo-internal
Conchiglia del modulo delle risorse umane con cinque schede supportate
Aggiunge /hr con la pagina dei conti cromato nella sua forma arretrata (lo stesso /marketing già utilizza): un layout che possiede il gradiente eroe e scheda sottolineata bar, un indice che atterra sulla prima scheda raggiungibile, e una pagina per Panoramica, Partecipazione, Legale e Compliance, Formazione e Risorse. Due cancelli, entrambi necessari. organizzazione.is Hrs — il gioco HRS sotto /settings/account?tab=apps — rimbalza il percorso a casa quando l'applicazione è spenta, dal momento che con esso off /hr non è un luogo che esiste per l'org. Con l'app su, il undici diritti esistenti ServiceType.HRS decidono: un nuovo composto hasAnyHrRight cancello si unisce E ogni scheda porta un'altra scheda. O-gruppo predicato (HR non ha una sola vista proprio il modo in cui Marketing fa). Schede il membro non riesce sono nascosti dalla barra e rifiutato sulla voce URL diretta. Registra 'hr' nel registro nav sopra Impostazioni, predefinito al primario rotaia; la carta home-launchpad e l'ingresso-palette di comando seguono dal registro di sistema appartenenza. L'ordine del Registro di sistema governa solo i membri a prima corsa, tuttavia — ordinareZone ha allegato ids mai ordinati, così chiunque abbia mai toccato il loro nav avrebbe avuto le impostazioni HR *below*. mergeCanonicalOrder ora inserisce tali ids a la posizione che il registro chiede e usaHomeLayout usa la stessa regola, quindi la il collocamento dichiarato vale anche per i membri esistenti e ogni opzione futura. I corpi delle schede sono segnaposto: non esiste alcun modello di dati HR ovunque nel backend tuttavia (nessun dipendente, partecipazione, payroll, formazione o entità di conformità in SecurityService, APIService o la libreria condivisa), quindi ogni scheda si nomina e che cosa tratterà. Spettacolo in documenti/superpoteri/spec.
· kamo-internal
Completa la scheda Comunicazioni
Ogni sub-tab ora detiene i propri dati, e Tutti interlevono ogni canale entro la data. Note mantiene MediaStream, perché le note sono autorizzate qui — ma leggereOnlyChrome strisce le offerte sociali un record cliente non ha uso per: il PUBLIC / PRIVATE accessor nel compositore e su ogni post, il menu edit/delete dell'autore, e il tipo / commento / condividere la riga con il suo commento thread. Chat mantiene il live SocialConversationView. Tutti, Chiamate, Testi ed E-mail rendono il nuovo EmailEntry crolla un messaggio a una riga — mittente, soggetto, parole di apertura — e si espande in posizione. La corrispondenza di un lead può essere eseguita a centinaia di messaggi e renderli a piena altezza rende la scheda inutilizzabile. Il corpo non è agguato fino all'apertura della riga, perché ogni lettura è un round provider dal vivo viaggio; poi rende attraverso lo stesso SanitizedEmailRenderer /messages utilizza, quindi non c'è un secondo, percorso meno verificato per HTML non attendibile. Risolto lungo il percorso: voce del menu Modifica di PostCard chiamato handleMenuClose, quindi aveva mai aperto l'editore; e MediaStream ha abbandonato PostCard suPostDeleted / onPostUpdated interamente, quindi un post cancellato o modificato rimasto sullo schermo nel suo vecchio forma fino a un pieno carico. Hardcoded "Public"/"Private"/"Post" nel compositore ora utilizzare le chiavi del dizionario che già esistevano.
· SecurityService
Comunicazione unificata timeline API
E' il momento giusto. restituisce una pagina di data ordinato attraverso note, chiamate, segreteria, testi, e-mail e chat; ?channel= lo restringe. Tre fonti sono fuse. Chiamate, segreteria telefonica, testi ed e-mail provengono dal Le associazioni LEAD COMMUNICATIONS; note e chat vengono lette direttamente dal flusso mediatico di piombo e sessione sociale, perché entrambi sono già guidati — rispecchiarli avrebbe aggiunto un problema di consistenza a doppia scrittura e, senza back-fill, ha perso ogni nota e messaggio di chat che esiste già. Pagare è set di tasti, non compensare. Offset tra le fonti unite è pagina passata sbagliata uno: quante righe ogni fonte contribuisce varia, quindi "skip 25" non atterrare su rigorosamente più vecchio, quindi ogni pagina costa la stessa e nulla viene saltato o ripetuto anche quando diverse voci condividono un timestamp. L'autorizzazione rispecchia esattamente il cancello di coda di piombo, e deve — una voce è in gran parte il valore di contatto del piombo più il contenuto scambiato, quindi un chiamante senza VIEW LEAD CONTACT INFO Altri sul piombo di qualcun altro non devono essere in grado di leggere questo punto finale ciò che la vista di piombo mascherato tiene. Le negazioni sono verificate, non solo successi. Il endpoint del corpo e-mail risolve la casella di posta dall'associazione piuttosto che dal chiamante: la posta principale è org-wide, quindi il messaggio spesso vive in un casella di posta del collega, e UID sono unici solo all'interno di una cartella — un browser-driven fetch restituirebbe silenziosamente un messaggio non correlato dalla casella di posta dello spettatore. MediaAssetUrls estrae i costruttori avatar/image URL che erano privati di MediaStreamController, quindi un post autore rende identico nella scheda Note e La scheda Tutto.
· DaemonService
Guidare la spazzata di associazione mail-to-lead
5 minuti di zecca contro l'endpoint interno di e-mailService, specchio VoipGlobalSyncJob. Il programma vive qui perché EmailService gestisce diversi baccelli e un fagiolo @Scheduled ci avrebbe ogni replica spazzando ogni mailbox subito. @DisallowEsecuzione corrente più timeout HTTP finiti: una spazzata su ogni casella di posta può superare la zecca, e senza la guardia Quarzo impilare corre fino a quando ogni thread del lavoratore sedeva all'interno di EmailService. I timeouts importano per lo stesso ragione — con la guardia di concurrency al posto, una chiamata a tempo indeterminato fermare la spazzata da sempre correre di nuovo fino al pod riavviato.
· EmailService
Corrispondenza di piombo associato e fissare l'indice di spinta morto
Aggiunge la metà posta del piombo Comunicazione scheda, più l'ingestione di cui aveva bisogno esistere affatto. La piattaforma non ha nessuna spinta di posta di lavoro: IMAP IDLE è codificato a Dovecot, lì non è nessun cambio di grafico o orologio Gmail, e MessageIndexer scartato ogni notifica mai ricevuta perché l'editore IDLE ha omesso l'UID il suo uid <=0 guard rifiuta — ha anche risolto il membro dal mittente piuttosto del proprietario della cassetta postale. Entrambi sono fissati qui, ma un gancio su quel percorso da solo sarebbe ancora non hanno fatto nulla per la maggior parte degli inquilini, quindi l'associazione è guidata da una spazzata su ogni casella di posta tramite MailReader, che è fornitore-agnostico per costruzione. Le pagine spazzate su un timestamp, non un UID. Gli UID sono monotonici solo all'interno di un IMAP UIDVALIDITY epoca; un segno ad alta acqua ratcheting rischia di semplificare una casella di posta riesaminare è gratuito perché il collegamento è idempotent. Società AddressResolver implementa la regola del proprietario: non associare mai un messaggio dove l'indirizzo corrispondente del piombo e ogni altro partecipante sono tutti di proprietà dell'azienda — altrimenti l'aggiunta dell'indirizzo di lavoro di un collega a un piombo sarebbe esporre la loro posta interna. Manca CLOSED: un inventario che non poteva caricare risposte "non conosciute" e l'associazione è saltata, piuttosto che rispondere "esterni" e disattivare silenziosamente la guardia. # E' un cadavere per conto della casella di posta # lo tiene. Il punto finale ordinario risolve il provider per il chiamante e gli UID sono unici solo all'interno di una cartella, così mirando a UID di un altro membro restituisce un messaggio non correlato invece di un errore. L'autorizzazione vive in SecurityService, che risolve la casella di posta dall'associazione piuttosto che dal browser. Il collegamento al momento dell'invio è stato provato e rimosso: SMTP non restituisce né un messaggio-ID né un UID inviato, così ogni posta in uscita a un piombo collasso su un'associazione senza locatore per espandersi. La spazzata ce l'ha.

Il tuo universo ti sta aspettando.
Aggiungi i prodotti quando sei pronto: nessuna migrazione, nessun nuovo login, nessuna richiesta di pagamento.
Gratis per sempre — nessuna carta di credito richiesta