Salta al contenuto
KAMOUniverse

Changelog

Cosa c'è di nuovo.

Ogni miglioramento alla piattaforma, come si spedisce.

  1. · EmailService

    Leggi un evento da id

    La pagina principale detiene un evento di callback e vuole riaprirlo nella stessa dialogo il calendario utilizza, quindi deve essere in grado di prendere l'evento da solo. Scoperto esattamente come la lista — i calendari del membro più il l'organizzazione — così un id appartenente al calendario di qualcun altro legge come assente piuttosto che come proibito.

  2. · kamo-internal

    Le note galleggianti diventano una seconda classe di esagonale

    Teste di Hex ora indietro due tipi di finestra: le finestre dello strumento di popup sempre fatto, e le note galleggianti. Minimize sostituisce il vecchio roll-up — un minimizzato appiccicoso lascia il sovrapposizione del tutto e atterra nella testa di esagonale molo che indossa il proprio colore di nota, dove il popover è aperto/chiuso e get-to-goal guidare esattamente come guidare una finestra strumento. L'integrazione è il contratto dell'evento, niente di più: le teste sono chiave finestra id, così le note prendono un `floating-note: spazio id condiviso e rispondere `tool:focus` / `tool:close` per il proprio. `tool:requestClose` non è volutamente vetoed — che veto protegge bozze insenti, e un autosaves appiccicosa e vampate su smontabile. Anche: - L'intera barra del titolo trascina. Il titolo è un'etichetta piuttosto che un input, che è quello che rubava ogni pixel ma l'angolo in alto a sinistra; doppio clic rinomina, doppio clic in qualsiasi altro luogo massimizza. - Massimizzare a schermo intero, dal pulsante o un doppio clic. - Un biglietto è vivo in un posto o nell'altro, mai entrambi. Mentre galleggiava, la sua carta in /notes è dimmersa e inerte (solo re-attacca soggiorni dal vivo) e il distacco dall'editor chiude l'editor. "Apri nelle note" consegna nota indietro e chiude il appiccicoso. - Il portellone di fondo era un singolo booleano, quindi una nota riportava indietro una la seconda volta non è mai stata riaperta. E 'chiamato per id ora. - Una sinistra appiccicosa minimizzò la sua testa dopo una ricarica, e un legacy `collapsed` sticky migra per minimizzare piuttosto che svanire.

  3. · kamo-internal

    Un controllo che realmente apre ciò che ha prodotto l'evento

    La descrizione del callback ha portato "Apri il lead: /leads/view/123" come testo, e testo in un'area di testo non può essere cliccato — la finestra di dialogo evento modifica la sua descrizione in uno, in modo che quel percorso non avrebbe mai potuto essere un collegamento lì. La destinazione è stata sul deepLink dell'evento da quando è stata aggiunta la colonna; questo è la convenienza che lo usa. La finestra di dialogo lo offre accanto al tipo dell'evento, il agenda view offre sotto la descrizione, e entrambi passare attraverso il router piuttosto che caricare un documento, perché può essere aperto su qualsiasi pagina e una la navigazione sarebbe abbattere qualsiasi altra cosa il membro ha intenzione di. Chiuso deepLink piuttosto che off callbacks in particolare, quindi qualsiasi cosa produce eventi successivi ottiene il controllo senza toccare questa finestra di dialogo. L'etichetta legge "Apri guidare" quando l'origine è un callback e "Open" altrimenti.

  4. · kamo-internal

    Callbacks sul calendario, e un marcatore sulla lista

    Due modi per vedere una chiamata che hai promesso di fare senza aprire il comando. Sul calendario, un callback ottiene il proprio elemento linea piuttosto che guardare come qualsiasi altro appuntamento — una chiamata che deve qualcuno è un diverso tipo di obbligo da un incontro che hai accettato di partecipare, e una visione che li rende identici ti fa leggere ogni titolo per dirglielo. La vista del mese crolla un giorno chiama in una riga leggendo quanti ci sono, perché una cella si adatta a circa tre chip e una mattinata intensa di chiamate altrimenti spingere ogni incontro sotto un "+4 di più". La settimana visualizza i nomi "Lead Callback" e mette il piombo nella Hover, dal momento che il blocco è un paio di caratteri di larghezza in quello zoom. Il giorno e l'ordine del giorno vista hanno spazio per entrambi e mostrare entrambi. Sulla lista delle piste, una pista con una chiamata eccezionale porta un marcatore del telefono nella cellulare id pinned, colorato da come preme: grigio al giorno o più fuori, ambra oggi, rosso una volta che il tempo è passato con nessuno marcarlo contattato. Suggerimento impulsi, che è lo stato che vale la pena catturare mentre scorre. Più di una chiamata una pista mostra un conteggio. Urgency è letto nei giorni del calendario piuttosto che ore trascorso, perché questo è ciò "oggi" significa per la persona che legge la lista: una chiamata alle 9 di domani non è urgente alle 17:00 di oggi anche se è a sedici ore di distanza, e una chiamata di 9:00 oggi è urgente a 8am anche se è un'ora di distanza.

  5. · SecurityService

    Riepilogo delle chiamate per il marcatore della lista dei lead

    Risposte che portano hanno una chiamata ancora in attesa, e quando il più presto è dovuto, per l'organizzazione del chiamante in una sola richiesta. Il suo punto di vista piuttosto che campo sul piombo: i callbacks cambiano sul proprio programma, quindi piegandoli in il payload di piombo significherebbe una unione su ogni query di piombo o un marcatore stante.

  6. · kamo-shared-library

    In attesa di un'intera organizzazione in una sola domanda

    Nutri il marcatore di callback della lista dei lead. La griglia tiene ogni comando membro può vedere, quindi chiedere per lead sarebbe una richiesta per riga per rendere uno colonna; questa è la stessa domanda fatta una volta. Solo un metodo di repository — nessun cambiamento di entità o colonna, quindi niente qui è armato contro lo schema.

  7. · kamo-internal

    Un centro di notifica, in ogni pagina

    I Reminders non dovevano arrivare. Il popup del calendario era un semplice allarme nel l'angolo superiore di qualsiasi pagina è stato aperto, è scomparso su un timer, e qualcosa sollevato mentre il membro era altrove è stato semplicemente perso — la presa pubblica, e una pubblicazione nessuno è abbonato a successo e scompare. Quindi le notifiche sono ora memorizzate e pubblicate, e il browser legge entrambi attraverso un contesto montato sopra l'intero albero. Cosa arriva mentre sei qui è spinto; quello che è arrivato mentre non è stato rivendicato il prossimo connessione, una volta, quindi due schede che si aprono insieme non sollevano entrambi lo stesso mucchio. Il ponte si trova in un angolo del viewport, sopra qualsiasi pagina è sotto. Carte pila piuttosto che elenco — quattro promemoria che atterraggio insieme, che è quello che un evento aziendale più il vostro incontro lo fa, altrimenti prendere la destra terzo dello schermo — e l'hovering i fan fuori. Ogni carta conduce con la cosa ogni notifica in questo prodotto ha in comune: un orologio. Conta fino al evento, offre ora, più tardi o meno, e drena una rotaia come proprie corse di benvenuto fuori, che si ferma mentre lo stai leggendo. Scorrere a destra per esserne liberato. Tutto il resto è dietro i due menu: snooze di cinque, dieci, quindici, trenta, un'ora, o fino a cinque minuti prima dell'inizio della cosa; mute questo tipo di notifica outright; aprire le impostazioni. Produttori-forniti azioni cavalcare lungo, così un callback offre il numero di piombo e un incontro offre il suo link di unione. Collegamenti passare attraverso il router, mai un carico di documento — il ponte può sparare in qualsiasi momento e una navigazione qui distruggerebbe una bozza inviolenta. La campana nella parte superiore del nav è cromata fissa per lo stesso motivo l'orologio di conformità è: una campana che qualcuno può dispiegare e poi non essere detto nulla è peggio di nessuno. Dietro di esso c'è la storia, filtrata per genere o da non letto, con do-not-disturb dove un membro nota il rumore. La scheda dice anche a te. TabAttention già lampeggiato il titolo e badged il favicon per chat, lead e supporto; notifiche non lette unirsi a esso, sopra chat perché sono in tempo — un promemoria che una chiamata è dovuta in cinque minuti fermate essere utile a cinque minuti da ora. I suoni sono sintetizzati piuttosto che caricati, quindi la prima notifica di una sessione non è quello silenzioso su una connessione lenta. Le notifiche desktop vengono sollevate solo quando la scheda è nascosta, e il permesso viene chiesto al momento in cui il membro gira l'accensione piuttosto che sul carico di pagina, che è il modello browser sopprime e le persone negano in modo riflessivo.

  8. · SecurityService

    Un callback che torna al comando

    Il callback ha già raggiunto il calendario del membro, come evento dal titolo "Lead Callback" con il loro commento nella descrizione. Niente ha detto di chi l'ha chiamata. nulla ha detto quale numero comporre, e nulla ha portato alla ribalta — quindi un membro guardare il loro calendario doveva andare e trovare il piombo a mano, che è il cercare la voce del calendario esisteva per salvarli. Ora porta il nome del protagonista nel titolo, il loro numero nella posizione, e un sito-relativo profondo link alla guida sull'evento e nella sua descrizione. La descrizione ripete deliberatamente i dettagli di contatto: si legge un calendario dove il CRM non è, e un callback non si può agire senza aprire un altro l'applicazione è un promemoria di andare a cercare qualcosa. La pagina principale ora compone un callback nella finestra di dialogo eventi del calendario, quindi la richiesta può portare un intero evento — titolo, ospiti, promemoria, colore — e questo passa tutto. Ogni campo ma l'istante è facoltativo; un chiamante che invia solo i tre originali ancora ottiene un correttamente intitolato, correttamente collegato ingresso costruito dal piombo. Risolvere un callback ritira la sua notifica e cancellare il suo evento. Altrimenti una chiamata fatta a due minuti dopo lascia una carta ancora chiederlo, e uno snoozed che torna domani per chiedere di nuovo.

  9. · InitializerService

    Tavole di notifica degli utenti e colonne di origine di un evento

    Due metà di una caratteristica. Un callback in programma su un lead è specchiato sul il calendario del membro di programmazione, e il punto dello specchio è quello di tornare al piombo — così calendar events porta source type, source id e deep link, e il la notifica da essa riporta gli stessi tre in avanti. Ordine 0: CalendarEvent mappa le tre nuove colonne dal momento in cui questa costruzione inizia, così ogni corridore che carica un evento li emette nella sua SELECT e ddl-auto non li ha ancora aggiunti. Ordinato tardi non avrebbe mai eseguito. Applicato e verificato contro Yugabyte 2026-08-13.

  10. · kamo-shared-library

    Centro di notifica dei membri e origine di un evento

    Aggiunge laNotificazione e laNotificazione membriPreferenza: una riga per membro per notificazione, perché letto, respinto e snoozed sono risposte per persona e un riga condivisa non ha nessun posto dove metterli. Le preferenze coprono i due metà separatamente — muti, ore tranquille e non disturbo sono applicati quando la notifica è sollevato; il suono, il volume e le notifiche desktop sono proprietà del browser. CalendarioEvent guadagna SOURCE TYPE, SOURCE ID e DEEP LINK così un evento fatto da un il servizio può riportare a qualsiasi cosa sia. Un callback di piombo rispecchiato su un il calendario era precedentemente intitolato "Lead Callback" e non ha puntato nulla, quindi un membro Guardarlo doveva andare a trovare il piombo a mano. CalendarEventReminderRepository guadagna per-event lookups e fetches il possedere calendario con un promemoria dovuto, che è ciò che consente la consegna fan-out chiedere se un evento appartiene all'organizzazione senza una query per promemoria. Schema applicato da KamoInitializer's MemberNotificationMigration e verificato in Yugabyte prima di atterrare.

  11. · kamo-internal

    Note di distacco in bastoncini galleggianti trascinabili

    Ogni nota nella lista (e l'editor) ottiene un controllo del distacco che lo apre su una sovrapposizione su schermo. Qualsiasi numero può galleggiare in una volta; ciascuno può essere trascinato ovunque, ridimensionato da qualsiasi bordo o angolo giù ad un pavimento 220x170, rotolato fino alla sua barra titolo, ricolore, e modificato in posizione. Posizionamento, dimensione, impilamento e colore persistono nel DB-backed ui-preferences store sotto un `floatingNotes` key - lo stesso meccanismo nav layout utilizza. Quel negozio, non sessioneStorage, è il punto: stickies devono sopravvivere firma fuori e indietro, e logout cancella sessioneStorage All'ingrosso. Note: - Il testo appiccicoso è sempre vicino al nero, quindi ogni sfondo selezionabile è tenuto sopra un rapporto di contrasto 7:1 contro di esso da un test unitario. La tavolozza non può in seguito illeggibile. - L'editing in linea è offerto solo per le note il cui stato Lexical memorizzato non porta alcuna formattazione; nulla più ricco si apre sola lettura piuttosto che essere appiattito da un giro di testo normale. - note.color era in precedenza un esagonale caduto in uno slot className, dove non ha reso niente. È ora una tavolozza id risolta in linea sfondo, e una carta colorata spilla il suo testo scuro modo scuro non può vernice bianca su pastello. - L'overlay è portato a <body>; la scatola dei contenuti della shell è overflow:auto e altrimenti la clip.

  12. · EmailService

    Un intero per il distintivo della posta, e contare che il percorso dell'indice vale

    Tre cose, tutto su sapere piuttosto che supporre. Il distintivo non letto nav-top ha preso l'intero albero della cartella e ha scelto INBOX da il risultato — il più costoso chiamare il backend di posta fa, per rendere un numero. MailReader ha portato getUnreadCount per esattamente questo dato che è stato scritto (a singolo STATUS sui provider IMAP, un campo in linea sul grafico) e niente mai l'ha esposto su HTTP. Ora si'. Si tratta di un sentiero di ritorno che spara solo quando la presa non letta ha fallito, quindi è raro ed è stato costoso esattamente quando le cose stavano già andando storte. L'elenco sostenuto dall'indice riporta ora perché ha fatto o non ha servito, come E l'attuatore espone le metriche, quindi... i contatori possono essere letti. Il rapporto tra servito a modseq moved è il numero che dice se quel percorso guadagna la sua complessità, e non è rispondebile leggendo codice: una cartella invalida il proprio checkpoint non appena qualcuno legge un messaggio in esso, così il tasso di successo è un fatto su come i membri si muovono attraverso la loro posta. The prova che i rapporti sono ora un enum piuttosto che un booleano, quindi ogni rifiuto è attribuito al posto del lumped insieme, e le prove affermano la ragione specifica — un test che accettava qualsiasi rifiuto avrebbe permesso a quei secchi di derivare in sciocchezze. Inoltre corregge un test sfacciato ho visto fallire tre volte questo pomeriggio e che è non mio: ImapIdleRegistryTest ha inquinato un mock con il timeout di Mockito() per vedere il async close land, e su una macchina carica che scade mentre la chiusura è semplicemente in coda dietro la creazione del thread. Non funziona come "interazione zero", che legge come un registro rotto ed è davvero una CPU occupato. Ora aspetta un latch che si sveglia l'immediato close() è inserito, abbinando il test di sibling due metodi giù, e la filettatura parcheggiata viene interrotta in un blocco finalmente — una corsa non riuscita utilizzata per la perdita un filo non demonio che dorme per trenta secondi e rallenta tutto dopo esso, compreso il prossimo tentativo allo stesso test. Tre suite complete contemporaneamente: 257 passato, tre volte più.

  13. · kamo-internal

    Cromato di marca intorno a una tavola di redazione nella sala firma

    La scrivania è stata stagnata con il colore dell'org ed è andata scura in entrambi i temi, che ha messo il marchio sotto il documento e ha lasciato il cromo neutro — esattamente all'indietro. Invertito: - CHROME è il primario dell'org su ogni lato della pagina: intestazione, docket ferrovia e dock. Ogni segno su di esso è bianco, attraverso una scala di token (--legal-on-chrome / -dim / -faint / -line) così tre regioni non possono ciascuno inventare la propria idea di "testo secondario sul marchio". - LA DESK è una tavola di abbozzo — grigio molto chiaro regolata con un 45 gradi reticolo asonometrico, in gradienti CSS puri (nessun asset, nessuna richiesta, scale a qualsiasi viewport). sottofondo-attaccamento: locale lega il reticolo al contenuto scorrettato in modo da viaggiare con le pagine. Non è deliberatamente derivato da --colore-primario: un white-label org con un primario pallido lavare la superficie il documento si trova su, e la pagina deve leggere come carta su una superficie di lavoro, mai come carta sul marchio. Il reticolo è ciò separa il bordo della pagina dallo sfondo, quindi nessun bordo è disegnato. - L'ombra della pagina è ora due getti — uno largo morbido per ascensore, un buio stretto uno per il bordo del foglio. Una sola sfocatura su una superficie leggera si legge come una smudge invece di una pagina. - Un nodo completo è solido WHITE con il colore dell'org al suo interno, invertendo nodo e rotaia esattamente quando il membro banche il lavoro. Verde ci sarebbe un terzo colore che combatte il marchio per un significato. - L'attestazione si è spostata sulla stessa scheda di un foglio bianco con la stessa sollevare, perché la dichiarazione è uno strumento troppo e cadere in una pianura pannello letto come avendo lasciato la stanza. Una DOCK, sempre. Un passo di documento possiede la barra inferiore — solo sa se sta mostrando un girante, un cancello di consenso, una superficie di firma o un firma catturata — in modo che il mago le mani il suo Indietro e il prossimo controlli invece di impilare un secondo bar sotto il primo, e disegna il dock solo sulla fase di attestazione. GuideBar ha guadagnato un `brand` tono e un inizio slot per quello: sul marchio dipinge il cromo, gocce il bordo e ombra che avrebbe tagliato la stanza a metà, invertisce il suo anello e testo a bianco, e la sua pillola legge nel colore dell'org. Il suo allDone halo era un hardcoded signer-app blu, invisibile su un bacino colorato. Il caricamento, la mancata sessione, il consenso e le porte di passaggio ora tengono la scrivania sotto di loro e il molo sotto, quindi la stanza non perde mai un muro di metà flusso e Back è raggiungibile da uno schermo il membro altrimenti non può lasciare.

  14. · EmailService

    Prova una cartella invariata con HIGHESTMODSEQ, poi servirla dall'indice

    Attiva l'elenco dei messaggi indicizzati, fissando la cosa che l'ha reso pericoloso piuttosto che lanciando la bandiera. Il vecchio controllo comparato conta messaggi e UIDNEXT. Entrambi sono ciechi a una bandiera muoversi, e niente ri-indicizza un messaggio quando qualcuno lo legge sul loro telefono, quindi una cartella che passa il controllo potrebbe essere servita con lo stato di lettura di ogni messaggio congelato al momento in cui è arrivato — una casella di posta che mostra la lettura come non letto. Questo è perché ha spedito disabili. CONDSTORE ha il numero che si muove. HIGHESTMODSEQ è a livello di cartella e avanza su qualsiasi cosa: un arrivo, un expunge, una bandiera impostata da qualsiasi cliente ovunque. Così "a modseq N i nuovi messaggi K sono stati indicizzati" più un nuovo modseq di N è una prova che nulla è cambiato da allora, bandiere incluse. Verificato sul server live prima di costruire su di esso — /usr/libexec/dovecot/imap (2.3.20) trasporta CONDSTORE, QRESYNC e LIST-STATUS. UIDVALIDITY è controllato insieme, dal momento che un server che cambia ha rinumerato la cartella e nulla indicizzato sotto vecchio valore descrive la stessa posta. Il proprio STATUS di Jakarta Mail chiede solo i cinque articoli classici, quindi il la formula estesa è emessa direttamente e la risposta qui presentata — in prova, contro dati del filo letterale, perché quel numero è l'intero argomento di sicurezza. Il checkpoint vive in Redis, non in un tavolo. È un marcatore di sincronizzazione il cui corretto il comportamento sulla perdita è "dimenticare e rileggere", quindi un'entità bibliotecaria condivisa, una migrazione e una corsa KamoInitializer sarebbe il prezzo sbagliato per esso. Nessun lavoro di riempimento, deliberatamente. Quando la prova fallisce la richiesta legge da IMAP esattamente come prima e consegna il risultato per essere indicizzato, quindi le cartelle si riempiono come sono esaminati — lo stesso ordine in cui si tratta di questioni rapide e nulla che può correre via attraverso ogni casella di posta sulla piattaforma. Questo è anche il motivo per cui sarebbe stato inutile prima: l'indice ha tenuto 31 righe in totale. Due ordini sono importanti e entrambi falliscono in una sola direzione. Il modseq memorizzato è quella letta prima della fetch, mai dopo, quindi un cambiamento che atterra le foglie di metà fetch il punto di controllo dietro la realtà e costa un fetch sprecato — il contrario si accoppierebbe un modseq dall'aspetto attuale con posta stante. E le righe già nell'indice hanno solo le loro bandiere aggiornate, mai il loro corpo, perché una riga l'indice completo ha scritto porta la ricerca del testo è costruito da, e la ricostruzione da una busta sarebbe Abbandona tranquillamente i messaggi dalla ricerca, rendendo la lista più veloce.

  15. · kamo-shared-library

    La mappa è answered, ora che la colonna esiste

    KamoInitializer ha aggiunto... Non e' vero. verificato in Yugabyte: boolean, default falso, niente nulli). Mapping è sicuro ora e non era prima — fullTextSearch è un nativo SELECT * le cui file Hibernate idrata in questa classe, quindi una colonna tabella manca rompe email di ricerca stessa, non solo scrive. Ecco perché è andata così. E' tornato qualche ora fa. SearchIndexService lo registra da qui in poi, quindi nuovi messaggi indicizzati portano tutti tre bandiere IMAP piuttosto che due.

  16. · EmailService

    Servire un elenco di cartelle dall'indice quando può dimostrare che è corrente

    Le righe dietro un elenco di messaggi sono già in Postgres — l'indice di metadati contiene mittente, soggetto, data, dimensione, allegato e bandiere per ogni messaggio che ha visto. Leggere una pagina da lì è una domanda; leggerlo da IMAP è un SELECT più una cinquantina di busta FETCH e rende il server costruire l'indice della casella di posta a Rispondi. Quello che ha fermato chiunque lo usava non era velocità, ma fiducia. L'indice è riempito da un push indexer che funziona solo mentre qualcuno ha la casella di posta aperta, quindi è permesso di essere arbitrariamente stantio, e nulla distingueva una cartella corrente da uno stallo. Uno STATUS li distingue. È la domanda più economica IMAP risposte — no SELECT, nessun dato di messaggio — e restituisce il numero di messaggio della cartella e il relativo prossimo UID. L'indice viene utilizzato solo quando entrambi corrispondono a quello che contiene: il conteggio cattura nulla aggiunto o rimosso, e maxUid + 1 == UIDNEXT cattura il caso un conteggio non può vedere, dove sono arrivati quanti sono stati eliminati. UIDNEXT si muove solo in avanti, quindi un'append l'indice ha perso le foglie che ha infilato sopra il più alto UID l'indice Lo sa. Ogni altro risultato rientra in IMAP: una cartella mancante, un server che decodifica STATUS, un indice vuoto, un errore di database. Il risultato peggiore disponibile è il comportamento che esisteva prima di questo. Una cartella che non riesce il test si guarisce quando il messaggio successivo arriva e viene indicizzato. Per impostazione predefinita, dietro le quinte... marcatore dipende da search index.is answered, che non esiste fino a quando KamoInitializer ha funzionato. Accendere è allora un atto deliberato piuttosto che un effetto collaterale di una distribuzione. L'accordo predicato è dove sbagliare mostra a qualcuno la posta sbagliata, quindi è puro, pacchetto-privato e testato da quella direzione — ogni caso chiede se può usare l'indice quando non deve.

  17. · InitializerService

    Aggiungi is answered all'indice di ricerca della posta

    Aggiungo che l'indice registra tutti e tre. Bandiere IMAP piuttosto che due. L'elenco dei messaggi disegna un marcatore di risposta da questo uno, e l'elenco indicizzato in EmailService non può essere acceso fino a quando il la colonna esiste. Ordine 0, per il solito motivo: SearchIndexEntity mappa la colonna dal momento la biblioteca condivisa che lo trasporta è costruito, così ogni corridore che carica quell'entità emette nel suo SELECT e ddl-auto non può aggiungerlo per noi. Un corridore tardivo non avrebbe mai eseguito — un precedente sarebbe morto su "colonna non esiste" e prendere la corsa con esso. Nullable con un default FALSE e un riempimento di righe esistenti. Non leggere dai server di posta: il falso è già giusto per la stragrande maggioranza di messaggi, e il percorso di lettura rifiuta di servire qualsiasi cartella che non può dimostrare concorda con il server circa, quindi una riga che è stante qui è una riga che non sarà uso. La ri-indicizzazione lo corregge.

  18. · kamo-shared-library

    Registra se un messaggio è stato risposto nell'indice di posta

    email metadata.search index ha portato is read ed is starred dal momento che era creato ma mai la terza bandiera IMAP, \Answered. Questo è stato innocuo mentre indice alimentato solo ricerca full-text, che non si preoccupa di esso. Si smette di essere innocuo ora che l'indice può servire una pagina di una cartella direttamente: la lista dei messaggi disegna il suo marcatore di risposta da questa bandiera, quindi una riga servito da un indice senza di esso dichiarerebbe, silenziosamente ed erroneamente, che il membro non aveva mai risposto a quel messaggio. La colonna è aggiunta da KamoInitializer's **************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** non esiste fino a che questo non sia scaduto — ecco perché il cammino di lettura che ne ha bisogno è dietro una bandiera che si disattiva.

  19. · kamo-internal

    Indicatore orologio usura lo stesso impulso come legale & conformità

    L'orologio del pugno ha respirato un bagliore radiale rosso mentre gli obblighi di distintivo tre pixel a sinistra pulsato due anelli in espansione. Entrambi i controlli chiedono membro di andare a fare qualcosa, e due animazioni diverse che chiudono insieme leggere come due sistemi non correlati — ognuno ha imparato separatamente. Un'animazione dell'anello ora serve entrambi, quindi il keyframe viene rinominato gli obblighi che esso ha avviato. Il movimento ridotto li degrada ancora in modo diverso, perché non perdono la stessa quantità: il tasso e il errore colore ancora dire "si deve qualcosa", quindi quegli anelli semplicemente si fermano; niente altro sullo schermo dice "sei fuori orario", in modo che uno tiene un singolo anello aperto a un'intensità costante e scende quello che segue.

  20. · kamo-internal

    Sullo schermo non è lo stesso come letto

    Una conversazione di supporto è stata contrassegnata leggere l'istante la sua finestra caricata, quindi quella tipo di finestra che non deve contare come letto — il tipo che si solleva, da un l'assegnazione, una riassegnazione, o una risposta in arrivo — ha cancellato il distintivo prima il membro aveva guardato qualcosa. isFocused non può dire quelli a parte: è derivato da z-order, e una finestra che appena aperto è più in alto per costruzione. Il mousedown della shell e touchstart sono gli unici segnali nel sistema che significa che una persona ha fatto qualcosa, quindi il fornitore ora li annuncia come strumento:userFocus da un posto entrambi terra. Da questo, la regola che il membro ha descritto: aperto deliberatamente letto non appena si carica risuscitato da sé non letto fino a toccare toccato leggere, entrambi i francobolli riassegnato a voi illeggi di nuovo, nessun nuovo messaggio richiesto Due francobolli, perché ci sono due modi per essere illeggi e ognuno deve essere chiarito: markAsRead avanza il puntatore di lettura oltre i messaggi del richiedente, e l'assegnazione-aperto ritira la consegna. AssignedTicketOpener non timbra più i consegna quando alza una finestra — che era il bug in miniatura, un riconoscere che l'agente aveva visto qualcosa che non avevano visto. Il suo per-tab la guardia trasporta invece il peso. TicketChat obbedisce alla finestra piuttosto che decidere per sé, anche per messaggi che arrivano mentre è aperto: una risposta atterraggio in una conversazione il membro sta leggendo, uno sbarco dietro di loro non è.

  21. · MediaService

    Unread significa che il richiedente ha parlato, o il biglietto è appena diventato il vostro

    Il distintivo ha contato "i biglietti vivi nessuno ha raccolto, più quelli che tengo" — messaggio-blind, ed è caduto solo quando un biglietto ha raggiunto uno stato terminale. Quindi... si sedette a cinque su una lista che non ha segnato nulla, e l'apertura di una conversazione spostata Nemmeno io. Ora conta quello che dice: conversazioni con qualcosa in loro per questo membro da leggere. Entrambe le metà del vecchio predicato sono sparite. Unread è una query nativa condivisa con la lista dei biglietti, quindi il numero e le righe contrassegnate sono lo stesso fatto piuttosto che due approssimazioni che si sono allontanate due volte. Ritirare una consegna ora trasmette il distintivo. È uno dei due modi conversazione smette di essere illecito, e senza la trasmissione il numero rimasto messo per il caso senza nuovi messaggi in esso — che è precisamente il caso timbro di consegna esiste per. Le prove proprie del distintivo si muovono con esso: non si bloccano più due HQL metà ma affermano che cosa il numero significa — una conversazione l'altro lato ha scritto in conti, uno solo consegnati conta anche con nulla di nuovo in esso, e ogni biglietto conta una volta tuttavia molti modi si qualifica.

  22. · kamo-shared-library

    Una definizione di una conversazione di supporto non letto

    Il distintivo navtop e la lista dei biglietti sono due volte allontanati rispondendo domande diverse. findUnreadStateForViewer è la risposta unica entrambi ora letto, così non possono di nuovo disaccordi. Unread significa che l'altro lato della conversazione ha parlato e non hai guardato. Per l'agente assegnato che è specificamente il REQUESTOR parlando — un la nota del collega sullo stesso biglietto non è qualcosa a cui l'agente deve una risposta, Quindi non alza nessuna bandiera. Per il richiedente è chiunque sul lato di supporto. Chiunque altrimenti non è una festa per la conversazione e non vede nulla, ecco perché la query è portata da un ruolo piuttosto che da org: una richiesta cross-org è risposta da un agente in un org diverso dalla persona che l'ha alzata, quindi nessuna delle due parti è org identifica entrambi. handoverUnread è il secondo modo per essere illeggi, senza nuovi messaggi coinvolti. Essere consegnato una conversazione è la stessa cosa che non avete visto, quindi una riassegnamento atterra non letto tuttavia vecchio il suo ultimo messaggio — altrimenti un biglietto spostato a voi al mattino rimane invisibile fino a quando il cliente non capita di parlare di nuovo. incaricoAperto già portato esattamente quello: sgomberato su ogni (re)assegnazione, timbrato solo una volta che l'agente lo ha davvero messo sullo schermo. I soggiorni RESOLVED sono ammissibili di proposito. Un richiedente risponde a qualcosa di un agente marcato risolto è il caso più vale la pena passare, e quello che sarebbe altrimenti essere silenziosamente caduto; solo CLOSED e VOID la finiscono.

  23. · kamo-internal

    Dare alla rotaia espansa una barra di scorrimento invece di frecce finali

    Le frecce su / giù esistono perché una rotaia collassata è 80px di piastrelle senza stanza da spendere per qualsiasi altra cosa. Espanso, la rotaia è 248px e le opzioni leggere come un elenco — là le frecce sono lo strumento peggiore: dicono solo "più in quel modo", dove una barra di scorrimento dice quanto più e dove in esso già sono, e galleggiano in cima a due file invece di sedersi accanto loro. Così il pergamenatore ora prende un `affordance`, e NavPri chiede per la barra di scorrimento ogni volta che il binario è largo (espansione costante o un hover-peek live). Tutto il resto della striscia è invariato in entrambe le modalità: afferrare e rovesciare, la ruota, toccare e scorrere l'opzione della pagina corrente in vista. Due dettagli le forze di commutazione: - il bordo morbido sta giù, perché una maschera dipinge la barra di scorrimento di un elemento insieme al suo contenuto, e una dissolvenza sopra le estremità della barra si intende accompagnare sembra un difetto di rendering; - "Afferra a scivolare" ora ignora una stampa che atterra sulla grondaia. Chrome fornisce puntatore giù là, quindi senza che uno trascinamento del pollice spostato la striscia due volte — il browser scorrendolo in un modo e il maniglia della pentola l'altro.

  24. · kamo-internal

    Utilizzare i loghi reali del fornitore payroll sulle schede del fornitore

    Aggiunge i dieci beni del venditore e li rende al posto della lettera segnaposto. Questi sono WORDMARKS, non icone quadrate come il set del provider di posta elettronica, e loro i rapporti di aspetto vanno da 0.72:1 (Dayforce, più alto che largo) a 6.2:1 (Paychex). Le schede e-mail ' 44px tile quadrato sarebbe schiacciare la maggior parte di loro e ridurre il largo uno a uno striscio illeggibile, e un confine disegnato intorno a un wordmark si legge come un errore piuttosto che una cornice. Così il marchio ora rende a un HEIGHT fisso con larghezza automatica e la sua propria rapporto di aspetto, tappato così Paychex non può dominare una carta. Un'altezza costante attraverso dieci forme diverse è ciò che rende la griglia aspetto deliberato. Ogni risorsa dimensioni intrinseche di viewBox sono registrate accanto al suo percorso perché prossimo/immagine ha bisogno di loro di riservare la scatola corretta — consegna un quadrato per un asset 6:1 reintroduce esattamente la distorsione che questo evita. Sulla scheda il logo prende la propria fila sopra il nome e lo stato chip, piuttosto che sedersi accanto a loro come un'icona sarebbe. Il logo è marcato decorativo ovunque il nome del fornitore sia reso accanto ad esso, in modo che un lettore di schermo legge il nome una volta piuttosto che due volte; il segno di lettere piastrelle soggiorni per GENERIC CSV, che è uno stato di connessione piuttosto che un fornitore e ha Nessuna risorsa.

  25. · kamo-shared-library

    Assicurarsi se un biglietto è uno degli elementi che il badge di supporto conta

    Il distintivo navtop e la lista dei biglietti rispondevano a diverse domande e Nessuno lo sapeva. Il distintivo conta oggetti in attesa di attenzione — travolgentemente biglietti che nessuno ha ancora ritirato, che è un fatto circa il TICKET. La lista contrassegnati messaggi di chat non letti, un fatto circa la sua CONVERSATION. Quindi il distintivo ha letto "5" su una lista che non ha segnato nulla, e i due numeri non avevano visibile rapporto. ha bisognoAttention porta il test di appartenenza del distintivo per fila, in modo che la lista può segnare esattamente ciò che il distintivo conta. unseenCount soggiorna: "qualcuno ha detto qualcosa che non hai letto" vale ancora la pena mostrare, e non è la stessa "nessuno si sta occupando di questo".

  26. · kamo-internal

    Payroll Provider Setup, e mappare le persone a pagare l'iscrizione

    Sostituisce il segnaposto HRS Panoramica scheda con la cosa reale. La scheda è ora "Provider Setup" e lo schermo è "Payroll Provider Setup", seguendo il schermo del provider di posta elettronica è modellato su — il tasto della scheda rimane "overview" in modo che il menu impostazioni, la scheda di lancio e ogni segnalibro esistente continuano a funzionare. Costruito in modo che un amministratore HR senza background tecnico possa rispondere a tre domande senza fare nessuno: è questo collegato, ha sincronizzato, ed è Qualcosa non va in questo momento. - Le carte del fornitore mostrano ciò che ogni fornitore può effettivamente fare PRIMA dei commit di org, quindi scegliere è un confronto piuttosto che un'ipotesi, e una capacità assente è visibile sul davanti invece di scoperto il giorno del libro paga. - Il modulo delle credenziali è reso dallo schema del campo di BACKEND. Aggiungere un campo a un venditore è un cambiamento Java invece di un nuovo componente React — il e-mail schermo manoscrive un componente per fornitore e ha dodici. - I segreti non vengono mai rimandati al browser, solo una bandiera "questa è impostata" e una scatola vuota significa invariata piuttosto che chiara. - Il pannello sanitario conduce con le due ore di strada silenziosamente non riescono a raggiungere payroll — persone non mappate e codici di guadagno non mappati — perché entrambi sono invisibile al momento e solo superficie come un reclamo di pagamento. - Una corsa parziale è il suo colore. "412 di 415 persone" non è un successo e non un fallimento, e rendendolo come nasconde tre persone non pagate. - Eseguire i dettagli la persona e la correzione, non una traccia stack. I codici di rilascio vengono dal server come token stabili e sono localizzati qui. L'iscrizione guadagna la colonna di mappatura payroll, perché iscriversi a qualcuno e dire a payroll chi sono è un lavoro. Auto-match propone l'esatta postazione di lavoro l'uguaglianza e un umano conferma — un nome non è un'identità, e un collegamento sbagliato manda le ore di una persona alla paga di un'altra persona. Un fornitore già reclamato record rimane visibile ma insopportabile. Quella schermata non aveva alcuna traduzione a tutti e reso crudo 19-digit membro ids; entrambi fissi, con il display-name lookup estratto ad un gancio da ogni timecard schermo ha lo stesso gap. Piattaforma avanzata config guadagna i sette venditori payroll dove Kamo detiene uno registrazione partner. Deliberatamente nessuna carta per Dayforce, Workday o UKG: essi rilasciare credenziali per cliente, e lo schermo rende una scheda per ogni enum costante, quindi uno per loro sarebbe un modulo che nessun operatore potrebbe riempire. RoleRightType mirror guadagna 197, 198 e 199 — i primi due server esistevano e già mancavano qui, quindi checkRight non aveva alcun tipo di riferimento.

  27. · InitializerService

    Indice e REVOKE le tabelle payroll-provider

    Ciò che Hibernate non può esprimere per i nuovi tavoli hr timecard payroll *. Due RIVOKE. PayrollDispatch e PayrollSyncIssue rifiutano aggiornamenti ed elimina in Java tramite @PreUpdate/@PreRemove, ma le callback dell'entità fuoco solo per le righe caricato in un contesto di persistenza — massa JPQL, deleteAllInBatch() e SQL nativo camminare dritto oltre loro. Un tentativo di trasmissione payroll è un evento di denaro, e prove su una sincronizzazione completa deve sopravvivere per essere prova. Due indici parziali, che l'entità non può portare perché hanno predicati: la lista di lavoro della spazzata (orgs con sincronizzazione abilitata e una sincronizzazione due, una piccola minoranza di righe) e errori di sincronizzazione per-membro (ERROR righe, inferiori numeri da INFO circa per la dimensione del roster). Applicato e verificato contro Yugabyte.

  28. · kamo-internal

    Dimensione di un allegato da ciò che l'API del fornitore trasporta effettivamente

    Il compositore ha tenuto ogni DM sociale ad un appartamento di 10 MB, che è la foto di Telegram limite applicato a quattro fornitori che non lo condividono. Ogni ora ottiene il proprio soffitto, e all'interno di un fornitore ogni tipo di media ottiene il proprio dove l'API li divide: Telegramma 10 MB foto, 50 MB documento/video/audio (sendPhoto vs sendDocument) Messenger 25 MB, lo stesso per ogni tipo Instagram immagine 8 MB, 25 MB video/audio/file Discord 8 MB (il soffitto bot upload) X nessun allegato a tutti sconosciuto 8 MB, il più stretto di quanto sopra Questi sono i limiti dell'API a cui ogni adattatore, NON dell'app di consumo dello stesso nome. I due differiscono e conta: App di Messenger sollevato file condivisione a 100 MB mentre la sua Invia API è documentata a 25 MB, ed è l'API numero che decide se il cliente riceve il file. Immergersi nell'app figura avrebbe il compositore accettare qualcosa Meta poi rifiuta, molto dopo L'agente ha detto che e' uscito. X non ottiene alcuna clip di carta piuttosto che uno che rifiuta tutto: XAdapter's sendImage e sendMedia entrambi falliscono per inviareTesto — il caricamento dei media era fuori v1 — quindi un file allegato non andrebbe da nessuna parte mentre la didascalia arrivò da solo. Il proprio ProviderCapabilities dice lo stesso. AttachmentPolicy cresce `maxBytesByClass` per questo, keyed da un nuovo quattrovalore AttachmentClass (immagine/video/audio/file) che corrisponde a come i fornitori si dividono endpoints e come MediaService tratti i media in uscita. SVG è un file in entrambi.

  29. · DaemonService

    Lavoro di sincronizzazione payroll-provider notturno

    Guida TimecardService # Che si sincronizza # ogni organizzazione la cui prossima sincronizzazione è dovuta. Cron vive qui piuttosto che in TimecardService perché questa distribuzione è RollingUpdate con maxSurge 1, quindi due pod si sovrappongono su ogni rollout e un Il metodo @Scheduled spara due volte — che per una sincronizzazione payroll significa due spinte di le stesse ore. DaemonService è repliche 1, strategia Recreate. Programmato alle 03:00, quaranta minuti dopo la timecard spazza: chiudi aperto sposta e rileva le eccezioni, e l'invio di ore a un fornitore di payroll prima hanno eseguito trasmetterebbe numeri che stanno per cambiare. Rifiuta di funzionare su un mlos vuoto. interno-auth-secret piuttosto che registrare un falso successo — una sincronizzazione payroll che tranquillamente mai gira sembra esattamente come uno che non ha trovato nulla da fare, e la differenza è un periodo di pagamento di ore che mai ha raggiunto il fornitore.

  30. · SecurityService

    Il limite di autorizzazione per la configurazione del fornitore di payroll

    Relays the new********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** raggiungerlo. TimecardService detiene il motore e nessuna sessione; sessione e decide. SecurityService gestisce qualsiasiRequest().permitAll() con laminato a mano per-handler auth, quindi un handler che dimentica la sua guardia non è debole controllato — è incontrollato e raggiungibile da internet pubblico. Mapped sotto il prefisso /api/security/payroll esistente di proposito: kamo-internal raggiungerlo attraverso un percorso BFF catch-all, e un nuovo prefisso 404 nel browser mentre ogni servizio è sano e ogni costruzione è verde. Quattro livelli: - MANAGE PAYROLL PROVIDER (199) scrive credenziali e collega o disconnette Auth. Questa è la capacità di decidere dove le ore di un'organizzazione sono trasmesso, motivo per cui è suo diritto. - MANAGE HRS SETTINGS (45) legge la connessione e la sua salute. - MANAGE TIMECARDS (183) copre la mappatura dei dipendenti e la cronologia della sincronizzazione. - FINALIZE PAY PERIODS (198) trasmette un lotto impegnato — lo stesso livello di commettere l'esportazione, perché è lo stesso atto. Test Connection siede con la scrittura destra piuttosto che quella letta: è un chiamata in uscita fatta con le credenziali memorizzate, e lasciare chiunque può visualizzare il pagina fuoco li consegna un modo per sondare il venditore del libro paga di org. Lo scambio OAuth non trasmette un org id. TimecardService lo tira fuori lo stato firmato HMAC, quindi un codice ottenuto per un inquilino non può essere riscattato contro un altro anche da un chiamante che tiene il diritto in entrambi. Aggiunge put/delete a TimecardServiceClient, che aveva solo ottenere/post.

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