Changelog
Cosa c'è di nuovo.
Ogni miglioramento alla piattaforma, come si spedisce.
· kamo-internal
Dare le opzioni Linux un Tux che hops
L'icona accanto a "Linux Desktop" e "Dev Machine" era una statica 18.6 KB Pinguino. È ora un vettore 1.4 KB che rimbalza, costruito da piano Geometria ellisse quindi legge ancora come un pinguino al 16 px i pulsanti Fallo entrare. L'animazione è CSS keyframes all'interno dello SVG stesso. Browser eseguire quelli per un file caricato tramite <img>, quindi questo non costa JS, nessun re-render e nessun seconda richiesta, e gli onori preferiscono-ridotta-mozione da solo. Lui sa due volte e poi riposa, perché un pinguino che rimbalza perpetuamente accanto a un nav l'etichetta è agitante piuttosto che affascinante. Vector piuttosto che un GIF perché quattro colori piatti e nessun gradiente è il caso vettori vincere outright: 555 bytes gzipped contro 19.7 KB per lo stesso 26 cornici come un 64 px GIF, e esatto ad ogni dimensione invece di morbido su un pannello retina. WebP Animated era peggio del GIF qui — una tavolozza è quello che vuole il colore piatto, e i predittori di WebP non hanno nulla con cui lavorare. L'Amministratore Card aveva una sua copia del <img> piuttosto che chiamare il wrapper condiviso, quindi l'opera aveva due case e questo swap avrebbe necessario due modifiche. Ora chiama LinuxDesktopNavIcon.
· DocsService
Annuncia un classico salvataggio al membro che l'ha fatto
Un WOPI salvato su una versione CLASSIC ora pubblica docs.classic-saved.{memberId} così l'editor PDF di Kamo, se è aperto sulla versione compilabile, può redraw le pagine sui campi siedono invece di mostrare quelli che sono stati posti sopra. Core NATS e a monte, in corrispondenza del distintivo di allenamento: si tratta di una nudge live, non un tronco durevole. Un membro la cui presa è giù manca e vede corretto la prossima volta che aprono il documento, che è il comportamento senza alcun di questo. Ids vanno sul filo come stringhe. Sono nel 1964s oltre 2^53 e un numero nudo è arrotondato da JSON.parse — l'editore avrebbe poi confrontato contro un id che fa non esistere e ignorare ogni frame che è stato inviato. Nulla nel percorso di annuncio può fallire il salvataggio: i byte sono già memorizzati, e un 500 qui direbbe al membro la loro modifica è stata persa quando non era.
· MediaService
Relè "la versione classica è stata appena salvata" all'editor
DocsService pubblica docs.classic-saved.{memberId} dopo un WOPI salvare terre su una versione CLASSIC; questo lo mette su /topic/docs/saves/{memberId} sul STOMP collegare l'app già detiene, quindi un editor PDF Kamo aperto sul redraws versione compilabile invece di sedersi sulle pagine i campi erano posto sopra. Costruito come il gemello del relè di formazione deliberatamente — stesso nucleo NATS, stesso una regola del soggetto, stessa destinazione per membro — perché un relè con la sua proprie modalità di fallimento sarebbe un secondo insieme per imparare per nessun guadagno. L'argomento è custodito per membro su SEND così come SUBSCRIBE. Non l'ho custodito pubblicare una mappa in diretta di cui il collega sta modificando quale documento, e un telaio forgiato renderebbe l'editor di qualcun altro scarto campo non salvato posizionamenti e ricarica.
· DocsService
Salva Come rami un nuovo originale, non una nuova copia di uno
PutRelativeFile è stato unimplementato, quindi "Save As" nell'editor LibreOffice ha fatto Niente. Ora fa ciò che il membro significa per esso: i byte diventano un nuovo marchio ORIGINALE, come se avessero caricato il file, e quell'originale immediatamente ottiene la sua versione CLASSIC — che è l'id consegnato all'editore. Risparmio come quindi li atterra esattamente dove caricare e aprire avrebbe: un originale intatto, e una copia classica che stanno modificando. Ritornare la nuova fonte WOPI originale invece metterebbe l'editor dritto tornare a scrivere sopra un upload, che è la cosa che questo modello esiste per fermare. L'intestazione suggerito-target non si fida di essere un nome di file. Docs invia UTF-8 piuttosto che la UTF-7 modificata la spec chiede, e molto spesso invia solo un'estensione che significa "stesso nome, nuovo formato" — preso a valore nominale che produce documenti letteralmente denominati ".docx". getWopiBaseUrl è condiviso piuttosto che copiato: una copia derivata seconda mano l'editor un host callback il suo token non è mai stato coniato.
· InitializerService
Spostare i disegni esistenti su file FORM FILLABLE
Prima che le versioni esistessero, mettendo campi di forma su un documento allegato un esign templates riga direttamente all'originale, e la scheda Modificata era "originali che per caso hanno un design". Un design ora appartiene a un derivato riga e Originals detiene solo quello che è stato caricato — così senza questo, ogni documento un membro aveva già messo i campi sulle soste che appaiono sotto Modificato. Derives le righe mancanti, quindi ridefinisce i modelli a loro. Entrambi idempotent ai propri termini: l'inserto è custodito da NON EXISTS, e una volta i nomi img id di un modello la riga derivata non corrisponde più a quella originale Id. La riga derivata condivide il dat id originale piuttosto che copiare byte, per la stessa ragione che la deriva dal vivo fa — nulla scrive un ImgDat al posto. Applicato a prod avanti a questa spinta: 4 documenti derivati, 4 modelli rinominato, 0 lasciato in attesa, ciascuno condividendo i suoi byte originali.
· kamo-internal
Cucito 13% dei riquadri di un membro con un colore, e offrire vetro ovunque
Due cose. Una condivisione del LAUNCHPAD arretrato. Su un primo carico di un membro — una volta ogni — il pannello ottiene una probabilità del 13% di un colore di tavolozza casuale. Abbastanza che la maggior parte delle persone trova uno o due vetri colorati e la pagina ha una certa vita in esso; pochi abbastanza che non legge mai come una qualcuno ha preso per loro. Ogni pannello che dipinge è loro per cambiare o cancellare da quel momento. Mai due volte, e la bandiera lo dice piuttosto che il vuoto di `colors`: un membro il cui il rotolo non ha dipinto nulla, o chi ha sgomberato ciò che ha dipinto, è ancora stato seme, e rivederli sul prossimo carico ridipingerebbero un launchpad che avevano deliberatamente fatto Giusto. Si accende solo una volta che il riquadro elenco è COMPLETE — widget risolti, note prese, opzioni nav gated — perché un riquadro che non era apparso ancora perdere la sua unica possibilità, e scrive subito piuttosto che attraverso il debunce, cancellando tutto il debounce stava trattenendo: quella scrittura in attesa porta un'istantanea pre-sposta e annulla la una scrittura che non ha una seconda possibilità. GLASS è un COLORE ORA. Il pannello traslucido del prodotto è uno swatch, quindi un galleggiante nota può essere riportata al materiale ogni altro elemento sulla pagina indossa — quello superficie un membro non poteva tornare al look originale. Sostituisce il menu "no colore" swatch, che non significava mai colore: su una nota significava il giallo predefinito, che è un orologio che si trova su ciò che fa. Un colore UNSET mantiene esattamente ciò che è sempre significato, quindi nulla scritto prima che la tavolozza esistesse è tranquillamente riverniciato. Il suo bg e bordo sono esagonale reale di proposito. Quindici posti prendono il bordo del colore risolto per una barra di scorrimento, una regola, un caret o un chip, e la testa di esagonale del bacino si nutre di bg attraverso un'esa oscurante; un valore traslucido cadrebbe da tutti loro come un colore di caduta. Solo carta stessa è in scatola speciale. E rimane fuori da STICKY PALETTE, quindi una nuova nota non può mai ruotare in esso — uno che è venuto fuori traslucido per caso avrebbe letto come uno che non è riuscito carico.
· kamo-internal
Un menu Modifica, e modificato come propri record
"Open in Docs" e "Edit PDF" sono andati. Ogni riga ha Modifica, che offre "Edit In Formable Mode" sempre e "Edit in Classic Mode" solo dove LibreOffice editor può aprire il file. L'ultima bandiera viene dal server per documento piuttosto che dal nome del file qui: una riga compilabile riporta il estensione di qualsiasi cosa si basa attualmente, quindi derivante nel browser si sbaglia nel momento in cui esiste una versione classica. La scheda Modificata è ora una query piuttosto che una vista. Una volta era ****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** versione modificata è una fila propria, che la query originale ora esclude. Ogni riga porta un badge Classico o Form Fillable, in una colonna mostrata solo su Quella scheda. Apertura o editor deriva la versione di cui ha bisogno se non c'è ancora uno, quindi l'elenco modificato è invalidato sulla via d'uscita se il membro è o meno Guardalo.
· DocsService
Derive versioni modificate invece di modificare originali
L'apertura di un documento nell'editor di LibreOffice non passa più le mani sopra originale. Ne deriva la versione CLASSIC del documento, una volta, riutilizzato ogni tempo dopo, e reso irripetibile da un indice unico parziale — e modifica che invece, che è ciò che mantiene la scheda Originals tenendo gli byte il membro caricata. POST /api/docs/form-fillable/{id} fa lo stesso per la riga Apre l'editor PDF di Kamo. Deriving non costa nulla fino a quando non deve: una nuova versione punti al originale ImgDat esistente, e saveImgContent scrive una fresca sul primo salvare, quindi la copia possiede i suoi byte dal momento in cui differisce e mai prima. Un classico salva rebases la riga compilabile sul nuovo byte. I campi sono indirizzati per posizione di pagina e non sono deliberatamente spostati con loro: un modificare che le pagine di riflusso possono spostarle male, che è il commercio preso in consegna rifiutando di lasciare un membro modificare un documento che hanno già messo i campi. A ribase fallito è registrato e ingoiato — una riga compilabile stallo è ancora apribile, e perdere la semplice modifica classica ad esso sarebbe peggio. La mappatura sessione-map-to-KToken ora ha una sola implementazione piuttosto che una per controller: decide quale autorizzazione porta una richiesta, e due copie sono due possibilità per uno di smettere di leggere la sicurezzaLivello e distribuire PUBLIC.
· InitializerService
Aggiungi imgs.modified kind e imgs.original img id
Entrambi rimangono nullable — null kind significa che la fila è un originale, quindi c'è niente da riempire e niente passo NON NULL, a differenza della normale forma a colonna. L'indice parziale dell'UNIQUE è "alla maggior parte una versione di ogni tipo per originale" regola messa dove non può essere regata: due schede mancanti entrambi lo stesso ricerca ed entrambi derivanti altrimenti lascerebbe un membro con due classici copie e nessun modo per sapere quale delle loro modifiche ha raggiunto. Applicato a Yugabyte prima di questa spinta, per l'ordinazione che ha preso leganti down: l'entità condivisa-lib mappa entrambe le colonne al momento della spedizione.
· kamo-shared-library
Dividi un documento nelle sue versioni originali e modificate
imgs.modified kind + imgs.original img id. Null tipo significa che la fila è una originale — il byte un membro caricato — che è la lettura corretta per ogni riga che predate questo ed è il motivo per cui nessuna colonna ha bisogno di un backfill. Una riga derivata risolve i suoi byte attraverso un ImgDat piuttosto che attraverso original img id, quindi il riferimento è nullable e non incascato di proposito: tracciare un originale rimuove i suoi metadati, non il suo contenuto, e le sue versioni Continua a lavorare.
· kamo-internal
Pani ridimensionabili e ricolorabili — e note a spillo uniscono alla griglia
FOUR THINGS, una griglia. CUSTOM SIZING. Un widget può ora dichiarare `custom`, e tutti e cinque fanno. La larghezza del registro e altezza rimanere il DEFAULT — personalizzato aggiunge una maniglia, non prende il design l'opinione di distanza — e ciò che il membro lo trascina a è memorizzato contro il loro record membro, così un widget che hanno reso più alto è più alto ovunque si firmano. Il manico è tastiera resizable too: è l'unico modo per cambiare le dimensioni di un pannello, e lasciarlo solo puntatore chi non può usare un topo con qualsiasi cosa la loro organizzazione abbia scelto. E' la terza volta. La traccia della griglia è ora mezza unità, che è ciò che lascia un riquadro app essere più breve di un widget: due app piastrelle stack in altezza un widget occupa. Due. righe più il divario tra di loro è ancora 236px — l'altezza di una scheda di lancio ha sempre è stato — così nient'altro sulla pagina spostata. I riquadri di app ridimensionano solo per riga; una scheda di app per colonna è il ritmo del launchpad, e una piastrella di lancio a due colonne è un buco nel griglia con un'icona in esso. Docs, Calculator e Supporto iniziano due file di altezza perché loro carta È una lista; tutto il resto inizia a metà fila e scende a una forma compatta che mostra l'icona e il nome senza un blurb clipped mid-sentence. COLORE BACKGROUND. La tavolozza note, il menu note, su ogni riquadro. Dipinto BEHIND il vetro proprio di pane piuttosto che su di esso — una carta di lanciatore è traslucida dal design, in modo da tinting la carta laverebbe il colore a nulla. Un widget prende il controllo INTO proprio intestazione, perché ha già i controlli in quell'angolo e un sovrapposizione sarebbe atterrare in alto della sua pagina frecce; una scheda app e una nota ottenere l'angolo sovrapposizione, e il pin chip passi da parte per fare spazio. NOTE PINNED Sono PANES. Erano una band sopra la griglia, il che significava che un membro poteva organizzare ogni riquadro sulla pagina tranne quelli. Ora sono trascinati, ridimensionati e colorati come qualsiasi altra cosa, e ancora un clic da essere raccolto come un galleggiante appiccicoso. Una nota che è galleggiante mantiene la sua fessura, grigiata e inerte, piuttosto che svanire: rimuoverla era ordinato e sbagliato — il pannello che il membro aveva posizionato è scomparso, tutto dopo di esso saltato una fila, e chiudendo l'appiccicoso ha riavvolto l'intero launchpad. Il controllo del colore scrive alla NOTA, non al ripostiglio, quindi una nota non è gialla in due posti e blu in un terzo.
· kamo-internal
Dite a tutti quando un evento invita l'organizzazione
· kamo-shared-library
Contare gli ospiti di un evento senza caricarli
· kamo-internal
Invita reparti, tipi di lavoro e tutta l'organizzazione
· kamo-internal
Offrire reparti e tipi di lavoro, e scegliere diversi subito
· kamo-internal
Altri tre widget — posta non letta, conduce l'azione di bisogno, la cartolina di oggi
Il sistema di widget pagato per sé: ciascuno di questi è una voce del Registro di sistema e un componente, ereditare la griglia, il trascinamento, l'ordine, lo spettacolo/hide per-membro, le impostazioni schermo e la politica a cinque diritti senza uno di quei luoghi che imparano il suo nome. UNREAD MAIL prende il suo conto dal websocket EmailService già spinge e la sua buste dall'indice dei metadati, perché un pannello che è sullo schermo tutto il giorno non deve spendere un bilancio di connessione IMAP di un membro su un riassunto. Il numero è quindi mai stale e la lista di tanto in tanto è, che è il modo giusto. LEADS NEEDING AZIONE gradisce di conseguenza — le chiamate già mancate, poi le chiamate verso essere, allora i lead il cui commento mancante sta bloccando questo membro di accettare di più. Si legge attraverso il punto finale della griglia EXISTING piuttosto che un nuovo, deliberatamente: un secondo percorso dovrebbe ri-applicare il piano di autorizzazione e il §164.312(b) PHI record di accesso, e uno che si è sbagliato subtly sarebbe un buco di audit che sembra esattamente come una funzione di lavoro. TODAY's TIMECARD mostra dove il membro sta, che cosa hanno effettivamente lavorato (meals e le interruzioni prese, motivo per cui deriva dai pugni piuttosto che da tempo trascorso), ogni pugno sul record, e il pulsante pugno. E ancora chiede prima scrive, attraverso la stessa finestra di dialogo di conferma che il controllo nav utilizza — un pugno è un record salariale solo un amministratore HR con una ragione scritta può correggere. Quel widget aveva anche bisogno del sistema per crescere una cosa: una disponibilità HOOK. Se membro pugni un orologio è un fatto di lavoro persistito piuttosto che un diritto, quindi ha e offrire un orologio a qualcuno che non pugni uno sarebbe peggio che nessun widget affatto. Una risposta nulla mentre è sconosciuto è portante di carico — il launchpad aspetta su di esso piuttosto che rendere un riquadro e portarlo via di nuovo. /messages ora apre un messaggio da ?folder=&uid=. Il widget di posta consegna quel link e, come il calendario prima di esso, ogni elemento in esso precedentemente atterrato sulla cartella e ha lasciato il membro per ritrovare la cosa da soli.
· SecurityService
Seed the mail and lead widgets, e aggiungere un seme universale per la timecard uno
I widget di posta e di piombo seguono i loro diritti di dati esattamente come quelli del calendario fanno — ACCESS MAIL e VIEW LEADS — in modo che un titolare non acquisisca dati che non potrebbero già raggiungere e i widget non spediscono invisibili. Il widget timecard non ha alcun diritto di ereditare da, perché i propri pugni di un membro sono gated dalla loro iscrizione perseverata piuttosto che da un diritto. Lo vedo da MANAGE TIMECARDS l'avrebbe consegnato agli amministratori delle risorse umane, che per lo più non lo fanno pugno un orologio, e a nessuno che lo fa. UNIVERSALLY SEED RIGHTS è quel gap, con un volutamente alto bar scritto nel suo javadoc: un diritto appartiene lì SOLO quando il capacità dietro di esso è recintato da qualcosa di diverso da un diritto, in modo da concederlo a tutti non danno niente che non potevano già fare. Non è una scorciatoia Vorremmo che la maggior parte della gente lo avesse. REQUIRED è escluso da ciascuno di questi, come ovunque: è l'unica politica che prende la scelta di un membro, e questa è la decisione di un'organizzazione di prendere.
· EmailService
Servire la home-page illeggi digest dall'indice, mai da IMAP
Un widget sulla home page è sullo schermo per tutti tutti i giorni, sia che nessuno è la lettura di posta — e le connessioni IMAP di un membro sono un bilancio condiviso di dieci per utente e IP per l'intero pod. Quindi il digest non letto legge e-mail metadata.search index e NON passa al server di posta come fa giustamente il client di posta; un widget che ha speso una connessione per carico home-page sarebbe affamare il client riassume. La conseguenza è che il LIST è fresco come l'ultima sincronizzazione, e il widget è costruito intorno a questo: il conteggio accanto a esso proviene dal live ilread snapshot websocket già spinge, così il numero persone agire su non è mai stallo anche quando Le buste sono a pochi minuti di distanza. Si riferisce anche se la casella di posta è mai stata indicizzato, perché 'nessuna posta non letta' e 'nessuno ha aperto questa casella di posta' sono gli stessi immagine e fatti molto diversi. Avvolto solo. body text è nell'indice e non è volutamente inviato: una home page è la superficie più sopra la spalla del prodotto.
· kamo-shared-library
Altri tre widget di casa, e quello che non può avere un genitore
La posta non letta si blocca da ACCESS MAIL e porta-needing-action da VIEW LEADS, entrambi da la stessa regola dei widget del calendario: un widget è gated dal diritto che governa i dati che mostra, così la concessione del widget non può mai essere un modo intorno a quel cancello. TIMECARD TODAY WIDGET è l'eccezione, ed è deliberata. Un membro i pugni non sono modellati come un diritto ovunque in questa piattaforma — l'iscrizione è un fatto dell'occupazione persistito proprio perché un diritto sarebbe trapelare assegna-tutto il ruolo, la modalità dio e il modello di baby-org, e sarebbe svanito da un membro terminato esattamente quando le risorse umane devono produrre la loro scheda temporale finale. Il cancello sul che i dati sono quindi più forti di un diritto, non mancante, e il widget onora prima che venga. Piuttosto che forzare un genitore sbagliato o eliminare tranquillamente invariante, il test ora prende una lista dei permessi NOMED con la ragione attaccata. I totali si spostano a 218/155/33/30 e 63 radici.
· kamo-internal
Servizi di ricerca e tipi di lavoro accanto alle persone
· kamo-internal
Modellare il pubblico ospite di un evento sul client
· EmailService
Pubblica e accetta il pubblico ospite di un evento
· EmailService
Materializzare il pubblico di un evento nelle sue file ospiti
· EmailService
Risolvere il pubblico ospite di un evento nelle persone
· kamo-shared-library
Mappa il pubblico ospite di un evento e la fonte di ogni partecipante
· InitializerService
Aggiungi il DDL per il pubblico ospite di un evento
· kamo-internal
Metta widget dal vivo sul launchpad, a partire da due strisce del calendario
Un widget è un riquadro live che condivide la griglia, il trascinamento e l'ordine con l'app carte piuttosto che sedersi accanto a loro. Aggiungere il prossimo è una singola voce del Registro di sistema più un componente: eredita la griglia, il per-member show/hide, la schermata delle impostazioni e la politica a cinque diritti senza uno di quei luoghi che imparano il suo nome. La muratura della lavagna doveva andare. Masonry posiziona elementi in colonne indipendenti, quindi nulla in esso può mai essere due colonne larghe, e un sistema di widget la cui dimensione più ampia è "tutti loro" non possono vivere lì. Una vera griglia restituisce un UNIT — una colonna di larghezza, una fila di altezza — che significa la stessa cosa a una carta e a un widget, che è quello lascia un membro trascinare uno oltre l'altro e ancora ottenere una pagina che si allinea. Non denso auto-flusso: densi spazi vuoti di backfill tirando gli elementi successivi nei fori precedenti, e l'ordine qui è del membro. Widgets in posizione da loro organizzazione render in loro propria banda ABOVE il griglia ordinabile. Lasciarli entrare e semplicemente rifiutarsi di prenderli sarebbe ancora lasciare un riquadro mobile essere caduto di fronte a uno — lo stesso risultato che la politica esiste prevenire, raggiunto dall'altra parte. Mostra/nascosta è memorizzato come DIVIAZIONI, non come un elenco di ciò che è in. Memorizzare 'questi sono accesi' congelare la pagina di un membro al momento dell'ultimo toccato: un widget aggiunto al piattaforma il mese prossimo, o appena concesso loro, non sarebbe mai apparire. Memorizzare solo dove differiscono dalla loro organizzazione significa che i default continuano a scorrere, e Richiesto sovrascrive un 'off' memorizzato in modo che un cambiamento di politica raggiunga esattamente i membri che era mirato. I due widget del calendario mostrano ONE EVENT PER UNIT OF WIDTH — quattro lato per lato su un ampio launchpad, uno su un telefono — con frecce che camminano attraverso il resto nelle pagine di quello stesso taglia. Le fessure sono misurate dall'elemento piuttosto che leggere un breakpoint, quindi un widget in una griglia stretta o in uno zoom strano viene detto la verità. Eventi in corso portano in diretta barra di avanzamento, e ogni decisione 'sta succedendo ora' compensata dall'orologio del server: un dispositivo in esecuzione quattro minuti veloce non deve mostrare una riunione in corso prima che qualcuno è in Ecco. Le modifiche arrivano su una connessione STOMP condivisa per tuttavia molti widget sono sul pagina, con un sondaggio di cinque minuti e un refetch sul tab focus sotto di esso. ****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** launchpad non lascia traccia di uno per design. Solo auto: la disposizione di un membro è memorizzata contro la loro sessione. Ogni interruttore che rifiuta di muoversi dice perché, a causa di tre le quattro politiche sono l'organizzazione e non il membro. /calendar ora apre un evento da ?eventId=. Entrambi i widget e le schede di notifica distribuire quel link, e fino ad ora è atterrato sul mese attuale senza indicazione che evento era destinato.
· SecurityService
Seed i widget del calendario a tutti coloro che possono già leggere il calendario
Entrambi i widget mostrano un membro esattamente ciò che /calendar li mostra già, quindi un calendario lettore non acquisisce dati che non potrebbero raggiungere — che è ciò che rende questo un seme sicuro piuttosto che una sovvenzione. Senza di esso i widgets spedirebbero spento per ogni organizzazione sulla piattaforma e terra invisibile. ADDED, seme OPTIONAL e MOVABLE. REQUIRED deliberatamente non lo fa: porta via un la capacità del membro di cancellare la propria home page, e nessuna distribuzione ha il diritto di fare quella scelta per un'organizzazione — un amministratore lo accende quando si intende. NEW RIGHT SEEDS si trasferisce a Map.ofEntries; Map.of supera a dieci coppie e questo è Tredici.
· EmailService
Servire e annunciare i widget del calendario home-page
CalendarWidgetService risponde a ciò che un widget ha effettivamente bisogno e la pagina del calendario haEarlier/hasLater così una freccia grigi fuori invece di offrire una pagina vuota. The due ambiti sono disgiunti di proposito — il calendario condiviso dell'organizzazione per uno widget, il membro per l'altro — quindi una riunione aziendale appare una volta piuttosto che su entrambi i riquadri fianco a fianco. Né il calendario né il membro id venire dalla richiesta: il chiamante passa l'org della sessione e il membro e il servizio risolve il resto, quindi una richiesta di nominare qualsiasi altra cosa non ha nulla da dire. CalendarChangePublisher spinge ogni scrittura a /topic/calendar/org/δorgId> o Sempre dopo l'impegno. Pubblicazione in linea inviare il nudge mentre la scrittura non è commessa, e un widget che risponde a una nudge da la rilettura sarebbe gara la transazione e di solito vincere — arrossando con lo stato esso già avuto e mai più sentito parlare del cambiamento. Entrambe le destinazioni sono sorvegliate in WebSocketConfig, la cui guardia per-org è ora un elenco prefisso come quello per-membro.
· kamo-shared-library
Dare a ogni widget di casa una politica di cinque-destra, e pagina il calendario per esso
Dieci diritti arrivano come due blocchi a cinque diritti — uno per widget — sospeso VIEW CALENDAR, perché un widget deve essere gated dal diritto che governa i dati mostra o la concessione del widget è un modo intorno a quel cancello. Ogni blocco è il widget se stesso più le quattro politiche ogni widget porta: Aggiunto da Default, Opzionale, Richiesto e vivibile. I suffissi sono un contratto, non uno stile di denominazione: il widget il risolutore deriva tutti e quattro dal nome del genitore, quindi un widget di spedizione tre loro tratterebbe silenziosamente il quarto come off per tutti con nulla da concedere. RoleRightHierarchyTest ora spills che forma per ogni widget ci sarà mai. I totali di tassonomia spillati si spostano a 203/141/32/30 e 62 radici, che raccoglie anche OVERRIDE CHAT POLICY — aggiunta in 85b6607 senza aggiornare i conti, quindi la prova stava fallendo a HEAD. tre o quattro eventi e camminano da ora, e servire che da findVisibleToMemberInRange avrebbe letto l'intero calendario di un membro su ogni home-page caricare e ogni nudge websocket per gettare quasi tutto. La pagina di apertura è l'unica query keyed su endTime, quindi un evento già in corso rimane sul widget invece di cadere dal momento in cui inizia.

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