Changelog
Cosa c'è di nuovo.
Ogni miglioramento alla piattaforma, come si spedisce.
· InitializerService
Acquisti i report e le righe del cruscotto, e smettere di vedere VIEW DASHBOARD
VIEW DASHBOARD (0), VIEW REPORTS (1) e EXPORT REPORTI (2) sono stati eliminati da RoleRightType oggi, insieme alle due pagine che hanno chiamato. Questo rimuove ciò che essi a sinistra, attraverso entrambe le codifiche. Non e' vero. VIEW DASHBOARD tra i diritti concesso ad ogni nuova organizzazione, quindi esce anche. Questo era l'unico riferimento fuori di un sito di definizione, e il compilatore è ciò che l'ha trovato — un promemoria che grepping per un nome giusto e la lettura dell'enum non sono la stessa ricerca. VIEW TASKS è deliberatamente assente dal purge: app/tasks sembra identico al pagine cancellate nella fonte ma è prevista per essere completata. Id 0 è un vero id — il predicato lo elenca esplicitamente, e qualsiasi cosa in questo percorso che appoggiato sulla veridicità sarebbe silenziosamente saltare le file di VIEW DASHBOARD.
· kamo-shared-library
Elimina VIEW DASHBOARD, VIEW REPORTS e EXPORT REPORTI
Tutte e tre le pagine di nome che esistevano sul disco e non erano supportate da niente: app/dashboard reso i post campione direttamente da i18n, app/reports importati framer-motion e next-intl e nessun dato, e non ci sono report motore o percorso di esportazione ovunque nella piattaforma. Nessuna pagina è stata collegata da navRegistry e nessuna AppType rivendicata loro — la prova che ha mantenuto vivi i diritti di referral-code, dal momento che MARKETING pubblicizza quelli come COMPLETATO. VIEW TASKS (120) è stato triaged accanto a questi ed è volutamente tenuto. app/tasks è indistinguibile dagli altri due nella fonte — irraggiungibile, indissolubile, puro useState, i18n tradotto in 22 lingue — ed è previsto per essere completato. Uno è abbandonato e uno è il prossimo sulla mappa stradale, e solo il proprietario del prodotto sapeva quale. La tassonomia 193/130/33/30 diventa 190/129/32/29, 61 radici. Tutti e quattro i numeri si muovono: uno standalone, una radice che perde il suo unico figlio, e quel bambino. Ids 0, 1 e 2 sono bruciati. Si noti che 0 è un vero id — VIEW DASHBOARD è stato il primo diritto mai dichiarato — così qualsiasi predicato che tocca questi deve includere zero piuttosto che appoggiarsi alla verità.
· kamo-internal
Le icone dell'app sulla procedura guidata Apps & Features
La procedura guidata creare-network ha disegnato ogni app come la prima lettera del suo nome, quindi la la stessa app era un negozio su Impostazioni -> Caratteristiche e una "S" qui. Le icone già esistevano -- erano bloccati all'interno dell'icona locale di FeaturesManagerMap. Ho spostato il tavolo per... chiave di ServiceType, e ha indicato entrambe le superfici in modo che non possano derivare. Aggiunto il due app la schermata Caratteristiche non ha mai avuto voci per (CALCULATOR prende il nav rail's Calcola, FEED prende DynamicFeed), gli alias deprecati e un app-grid fallback -- stessa forma di nav/settingsTopicIcons.ts. Ogni glifo è piatto var (--colore-primario) se l'app è acceso o spento: venti i prodotti che arrivano nel proprio colore si leggerebbero come una nota di riscatto. On/off rimane con la tinta piastrelle e l'interruttore. Il test di guardia fallisce la costruzione se un Live ServiceType non ha icona -- altrimenti un app appena catalogata navi come una piazza anonime grigio e nulla si lamenta.
· kamo-internal
Un sovrapposizione di colore solido per il logo dello schermo di carico
Aggiunge "Schermo di caricamento Overlay" direttamente sotto la home page uno su con le stesse tredici opzioni. applicando al logo sullo schermo mostrato tra navigazione di pagina. Predefinito Niente overlay, quindi niente cambia per un org che non apre mai il campo. La sua impostazione piuttosto che una condivisa con la home page, perché i due superfici hanno sfondi opposti: una testata bianca e una sfumatura scura. L'ombra che legge su uno è raramente l'ombra che legge sull'altro, e una singola impostazione costringerebbe una scelta che è sbagliato da qualche parte. The accenno sotto ogni dice così. Il tipo è ora LogoOverlay, non HomeLogoOverlay — governa due superfici, e un tipo chiamato per uno di loro sarebbe maledescriversi sia entro una settimana. The vocabolario, il risolutore e l'elenco delle opzioni sono condivisi; solo la colonna Ogni superficie legge è diversa, quindi i colori non possono allontanarsi. caricamento.tsx legge OrgContext direttamente piuttosto che attraverso il lancio gancio: monta durante la navigazione e non deve mai essere la cosa che rompe un passaggio pagina. Un org mancante non significa overlay, che è il default Comunque. Le due righe di sola lettura rendono identico, quindi ora condividono una aiutante invece di portare una copia ciascuno. Richiede la colonna caricamento logo overlay (KamoInitializer, applicato) e un SecurityService ricostruito contro l'entità condivisa-lib.
· InitializerService
Aggiungi la colonna caricamento logo overlay
Seconda superficie per la funzione overlay logo: la schermata di carico mostrata tra le pagine di navigazione, accanto alla home page masthead. Entrambi gli ALTER vivono in un solo corridore perché sono una caratteristica con una vocabolario, e qualcuno che cerca o dovrebbe trovare entrambi. La stessa forma il suo fratellino — nullable, no backfill, no DEFAULT, da un valore assente e NONE significa la stessa cosa per ogni cliente. La guardia alla deriva ora itera i campi di sovrapposizione dell'entità invece di nominare una, quindi una terza superficie non può essere aggiunta all'entità senza un ALTER. Si'. anche pin una dichiarazione per colonna: un singolo ALTER condiviso sarebbe tranquillamente lasciare l'altra colonna non ricreata.
· kamo-shared-library
Portare la sovrapposizione del logo dello schermo di carico sull'organizzazione
Lo stesso vocabolario overlay come homeLogoOverlay, applicato invece al logo sulla schermata di caricamento mostrata tra navigazione di pagina, più il suo ramo in il percorso di patch generico. Una colonna propria piuttosto che una impostazione condivisa, perché i due superfici hanno sfondi opposti: la home page masthead è bianca e la lo schermo di caricamento è un gradiente scuro, quindi l'ombra che legge su uno è raramente l'ombra che legge sull'altro. Un org che vuole entrambi due risposte. Null si risolve a NONE sul client, quindi ogni org esistente inizia senza overlay e non ha bisogno di backfill. La colonna caricamento logo overlay è già applicato (KamoInitializer, OrgHomeLogoOverlayMigration).
· kamo-internal
Scegli l'agente assegnato dalla directory, non un dropdown
Il campo Agente Assigned è ora lo stesso controllo di Manager su un membro profilo: un campo di sola lettura che apre il selezionatore membro ricercabile. Un calo potrebbe solo tenere una pagina, e la lista dietro questo è stato caricato tutto su ogni vista di piombo se o non qualcuno ha aperto la carta — due fetches di directory per carico di pagina, uno dei quali era morto da quando il campo ha cambiato le mani. L'ammissibilità è invariata nella sostanza e meglio applicata: il raccoglitore chiede directory per i titolari di VIEW LEADS, che è la stessa destra il vecchio endpoint risolto, e rimane sui membri del team perché questo è l'ambito predefinito. The "tenere l'assegnatore corrente selezionabile" caso speciale è andato con il dropdown — il picker pins la scelta corrente sopra i risultati, in modo da sopravvivere una ricerca invece di avere bisogno di un'opzione fatta a mano. Una firma funziona ora. L'opzione vuota è sempre esistita ma la patch è crollata esso a non definita, che costruireUpdateLeadRequest skips, in modo da scegliere esso ha inviato patch vuota e il piombo ha mantenuto il suo proprietario. The picker's Remove invia il file vuoto il server ora legge come un'istanza esplicita.
· SecurityService
Limitare la ricerca dei membri ai titolari di un dato diritto
Il picker dell'assegnazione principale ha bisogno della directory per restituire solo le persone che possono effettivamente lavorare un piombo, quindi /team-members/search prende un richiesto. An il nome non riconosciuto è un 400 piuttosto che un parametro ignorato: cadere silenziosamente un filtro allarga un limite di autorizzazione, che è il modo sbagliato per fallire. A destra nessuno detiene restituisce una pagina vuota senza querying, dal momento che l'alternativa è una lista vuota IN il database non parse. Chi detiene un diritto si muove in RightHolderResolver, che l'eredità Il punto finale assegnabile-membri ora utilizza anche. La passeggiata era già copiata dall'altra parte cinque siti di chiamata e i due lead-assegnation devono concordare su chi può ricevere una pista — meglio che siano d'accordo facendo la stessa domanda che che oggi tiene lo stesso codice. I restanti tre sono intatti.
· kamo-shared-library
Lasciare che il filtro directory di destra, e lasciare che un piombo sia senza firma
Due cose di cui ha bisogno il picker. Le query della directory prendono un set permesso-id in modo che un chiamante possa restringere la ricerca alla gente una cosa può effettivamente essere dato a — assegnando una pista a qualcuno senza VIEW LEADS lo parcheggia dove non possono aprirlo. Il set è calcolato in Java piuttosto che unirsi qui perché un diritto è tenuto sia da una riga di diritti o da un ruolo di sovvenzione-tutto, e il secondo non ha fila da trovare. Viaggia con un bandiera non rigata e non è mai vuota: IN () è un errore di sintassi sul Postgres filo, quindi il caso dell'intera directory passa un segnaposto invece di niente. E updateLead ora legge un assente id e uno vuoto come diverso richieste, il modo in cui già fa per il paese e la lingua. Una patch trasporta solo i campi che significa cambiare, quindi senza quella distinzione non c'era modo di dire "nessuno possiede questo piombo" — la corda vuota cadde attraverso lo stesso ramo come campo mancante e l'unssign silenziosamente non ha fatto nulla. L'apertura riga di assegnazione è chiuso piuttosto che sostituito, dal momento che un LeadAssignment sempre nomina un membro e non c'è più uno da nominare.
· kamo-internal
Gli editori dicono "Enforced as MANAGE TIMECARDS" invece di "Non ancora applicato"
Un chip portava due diverse verità e fuorviante in direzioni opposte. Unbuild non significa che nulla controlli il diritto e la concessione non fa nulla. Superato significa che la capacità è reale e gated, sotto il nome di un altro diritto — concedendo questo uno ancora non fa nulla, ma cancellarlo sarebbe sbagliato e l'amministratore ha bisogno sapere quale diritto concedere invece. Le quattro voci sono quelle che l'audit ha stabilito: VIEW SCHEDULES e MANAGE SCHEDULES sotto MANAGE TIMECARDS, perché la scheda di partecipazione si apriva VIEW SCHEDULES e ogni scheda HR è stato in seguito dato un proprio diritto; e DELETE EMPLOYE sotto MANAGE MEMBERS, perché un dipendente è un membro con un rapporto di lavoro e non c'è dipendente CRUD endpoint. La lista è curata a mano, a differenza di quella generata che annota, e deliberatamente così: Nessun analizzatore può dire "superato" da "nessuno costruito ancora". L'adesione non rimuovere un diritto da UNENFORCED RIGHTS — niente passa a un controllo in entrambi i modi — quindi la prova di parità con l'audit commesso è intatta. Due guardie mantengono l'annotazione di marcire in un commento stante. Un diritto che è genuinamente applicato non può mai essere etichettato superato, che metterebbe due chip contraddittorio su un interruttore. E il diritto di copertura non deve essere di per sé decorativo: il messaggio è "grant X invece", quindi un X morto invierebbe amministratore un passo avanti da un permesso di lavoro. Questo valeva la pena di fare prima delle prossime terre di destra HR. Due di questi quattro erano uno verificare di essere cancellato durante l'audit proprio perché l'editor ha detto Erano morti.
· kamo-shared-library
Portare la home page logo overlay su Organizzazione
Il colore solido un org può dipingere sopra il logo della testata sulla home page kamo-internal, più il suo ramo nel percorso generico patch in modo che il PUT /org/{id} persiste a fianco di bgWatermark. Conserva un token — PRIMARY DARKER, non 004ba0 — risolto contro questo org i propri colori al render time, quindi un org che in seguito rebrands mantiene un overlay che corrisponde ancora al posto di un'esa congelata quando qualcuno l'ha scelto. Pianura String piuttosto che un enum, quindi un token futuro non ha bisogno di CHECK-constraint spazzare. Null si risolve a NONE sul client, motivo per cui ogni esistente org inizia senza sovrapposizione e non ha bisogno di backfill. La colonna home logo overlay è già applicata (KamoInitializer, OrgHomeLogoOverlayMigration) — questo campo mappa una colonna che esiste, non un servizio SELECT in un errore di query.
· InitializerService
Aggiungi la colonna home logo overlay
Backs the Home Page Logo Overlay impostazione: il colore solido un org può dipingere sopra il logo della testata sulla home page kamo-internal. Contiene un token piuttosto che un esagonale, quindi il sovrapposizione si risolve contro il la tavolozza di org al tempo di rendering e sopravvive a un rebrand. VARCHAR Plain piuttosto che un enum, quindi un token successivo non ha bisogno di una spazzata di controllo CHECK. Nullable, no backfill, no DEFAULT: ogni cliente risolve un valore assente a NONE, che è esattamente quello che ogni org sembrava prima della colonna esisteva, quindi un backfill scriveva righe per nessun cambiamento di comportamento. @Order(0) per la convenzione colonna-add — il momento in cui condiviso-lib entità mappa questa colonna, ogni secondo corridore che carica un'Organizzazione attraverso JPA lo emette nel suo SELECT, quindi una migrazione tardiva sarebbe E' passato da un corridore che moriva per primo. Il test è una guardia alla deriva, non un test unitario: i servizi funzionano ddl-auto: nessuno, così un campo entità senza un ALTER corrispondente inizia sano e muore tempo di query — e per Organizzazione che significa risoluzione org, login e branding attraverso la piattaforma. Questo lo rende un fallimento di costruzione invece.
· kamo-internal
Lasciare un org dipingere il logo home page un colore solido
Aggiunge "Home Page Logo Overlay" a Branding su ****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** Watermark: No Overlay, White, Black e ogni passo dell'org rampe primarie e secondarie. Impostare e il logo della testata in alto a sinistra della home page rende una silhouette solida in quel colore. Predefinito è Niente overlay, quindi niente cambia per un org che non apre mai il campo. Ciò che è conservato è un TOKEN, non un hex — PRIMARY DARKER, mai #004ba0 — risolto contro la tavolozza dell'org al momento del render. Un org che rebrands mantiene un sovrapposizione che corrisponde ancora ai suoi colori, invece di un esago congelato nel momento in cui qualcuno l'ha scelto da una discesa. logoOverlay.ts possiede che il vocabolario e la risoluzione, allo stesso modo watermark.ts possiede il La filigrana. Tre dettagli degni di sapere: - Le ombre scure esistevano già sul filo. Il backend ha mandato tutti cinque passi di ogni rampa per tutto il tempo che EmbColorPalette ha, ma Organizzazione.daJSON ha mappato solo tre, quindi coloreDark/colorDarker E' caduto sul pavimento. Sono trasportati ora, che è ciò che dà token più scuri un colore a cui risolvere. - ThemeLogo lo fa con una maschera CSS, non un filtro. Un filtro può solo spingere i colori esistenti intorno e non può raggiungere un obiettivo arbitrario, così l'alfa del logo diventa una maschera e il colore è dipinto dietro. Il <img> rimane montato e semplicemente invisibile: è l'unico fonte del naturaleSize il blocco di dimensionamento dipende da, e mantiene occupando la sua casella normale esatto in modo che lo strato mascherato può riempirlo. Callers che non passano overlayColore rendono byte-identalmente a prima. - Un token di marca la cui ombra l'org non si risolve mai piuttosto che tornare a un'ombra vicina. Vedere il logo già aveva battiti vedendo un colore nessuno scelse. Richiede la colonna home logo overlay (KamoInitializer, applicato) e un SecurityService ricostruito contro l'entità condivisa-lib; fino a che non atterra il campo legge e salva come No Overlay piuttosto che errore.
· InitializerService
Purge VIEW EMAIL LOGS righe, e fermare un test marcire quando gli ordinali si spostano
VIEW EMAIL LOGS (64) è stato cancellato da RoleRightType oggi per la denominazione di una caratteristica che non è mai stato costruito. Ciò rimuove ciò che ha lasciato — misurato in 42 righe di ruolo, 33 righe applicate e 8 righe dei modelli — attraverso entrambe le codifica, dal momento che la tabella dei modelli memorizza l'enum NAME mentre il resto memorizza l'ID intero. Dovevo sistemare lo stesso cambiamento, e... la ragione vale la pena mantenere. Ha affermato che il suo esempio giusto aveva id!= ordinale, sorvegliato da "il test è solo significativo" che detiene. Rimuovere id 64 spostati ogni più tardi ordinale, e il suo ordinale. La guardia ha sparato. Se la guardia non fosse stata lì, il test avrebbe continuato a passare mentre non provare nulla, che è il risultato peggiore. Ora sceglie il suo testimone a runtime — qualsiasi diritto che ha un antenato e il cui id differisce dal suo ordinale — quindi nessuna cancellazione futura può tranquillamente scavare fuori. Cancellazione i diritti sono ora abbastanza di routine che un esempio hardcoded è una responsabilità.
· kamo-shared-library
Elimina VIEW EMAIL LOGS, che nomina una funzione nessuno costruito
Nessun registro e-mail esiste ovunque nella piattaforma: nessuna tabella in qualsiasi schema, nessun endpoint tra i 21 controller di EmailService, nessun UI e nessun riferimento nel frontend — non anche il controlloDiritto che MANAGE EMAIL ACCOUNTS almeno aveva. La piattaforma fa tronchi modello dove li ha, con phone call log, img log downloads, phi access log e contact sync logs tutti presenti; email non ha equivalenti. Questo è il caso CREATE CHANNELS — il sostantivo non esiste — piuttosto che MANAGE MEETINGS caso in cui il sostantivo è modellato e solo il verbo non è esposto. La tassonomia 194/131/33/30 diventa 193/130/33/30. Solo il numero del bambino si muove: ACCESS MAIL mantiene i suoi altri quattro figli, quindi rimane una radice con figli. Id 64 è bruciato. Le righe memorizzate vengono rimosse da EmailLogsRightPurgeMigration.
· kamo-internal
Metti il compositore di nota in cima a Tutte le Comunicazioni
Il compositore esisteva solo nel sottotab Note, quindi scrivendo una nota su quello che stavi leggendo significava lasciare la scheda su cui stavi leggendo. Tutti ora trasporta lo stesso PostComposer — stesso piombo, stessa nota visibile — e la linea temporale qui sotto si rifà alla sua nuova pagina in luogo quando uno atterra, mantenendo le righe sullo schermo invece di lampeggiare indietro a un girante.
· kamo-internal
Scegli le app del nuovo org durante la creazione
Aggiunge un passo Apps & Caratteristiche tra Tipo e Fondamenti. Elenca le app modello di sicurezza del tipo di ramo scelto offre in realtà -- quelli forzati come "Sempre inclusi" senza interruttore per discutere, quelli opzionali come interruttori preimpostati sul modello di default -- e invia le risposte con il creato. Tipo è quello che decide quali applicazioni esistono tra cui scegliere, quindi il passo siede a destra dopo. Chiedere "che cosa farà questo business in realtà" mentre quello è ancora il soggetto non costa nulla al cliente; chiederlo dopo otto schermi di branding avrebbe letto come un secondo, configurazione non correlata. Scritto per qualcuno che non ha mai usato la piattaforma: l'intestazione spiega che cosa è un'applicazione e che lo spegni solo lo nasconde, ogni riga trasporta la descrizione in lingua normale dell'app, "Normally on"/"Normally off" dice da dove proviene la preselezione, e c'è un modo per tornare set consigliato. Nulla qui è richiesto e la recensione elenca le applicazioni aprirà con il nome -- un conteggio è un numero che nessuno può controllare, e questo è l'ultima schermata prima di creare irreversibile. Le selezioni sono contrassegnate dal nome ServiceType e da una chiave assente significa "qualunque cosa il modello consiglia", su entrambi i lati del filo. Riselezione del SAME tipo di ramo mantiene le risposte piuttosto che ricostruire i default: BranchTypeStep riemette la sua selezione ogni volta che il passo viene rivisitato, quindi l'ingenuo la versione annulla silenziosamente l'intero passaggio da un clic sul passaggio prima E' cosi'. Scegliere un tipo diverso si ricostruisce, perché l'elenco app viene sostituito All'ingrosso. Anche blocca la descrizione dell'app su Impostazioni -> Conto - > Tipi di ramo a due Linee. Le descrizioni quelle righe mostrano ora eseguire a poche frasi così un il lettore non tecnico può agire su di loro, e unclamato girano ogni crollato riga in un blocco a tre linee.
· SecurityService
Lascia che il creatore scelga le app del nuovo org
La procedura guidata di creazione di rete ottiene un passo Apps & Features, e questo è il metà che lo rende reale. /branch-types/creatable ora descrive le applicazioni di sicurezza di ogni tipo di ramo modello offerte -- quelli forzati come `required`, OPTIONAL * con il modello proprio predefinito -- in modo che il wizard possa rendere il passo prima che l'org esiste. Si'. deve venire da qui: gli endpoint che descrivono le applicazioni sono oggetto di un org esistente e gated su CONFIGURE SYSTEM, un diritto alla persona che crea un ramo spesso non tiene nel genitore org. Le app NON DISPONIBILI sono omesso completamente piuttosto che mostrato grigiato. La creazione di payload guadagni `appSelections` ({ServiceType: boolean}), e la nuovo org è fornito da esso nella transazione di creazione, accanto al valutazione del ruolo-templato: stesso tipo di cose, e o tutto il paese o il org non è creato. La parte che vale la pena di leggere due volte è che un'applicazione che viene spenta ottiene ancora un OrgFeature Row. Fino ad ora un nuovo org non ha alcuna riga caratteristica affatto e erano riempito in pigrizia la prima volta che qualcuno ha aperto Impostazioni -> Apps -- un loop che permette tutto il modello non blocco outright. Quindi... OPTIONAL DEFAULT DISABLED, un amministratore che dice esplicitamente "offrire questo, ma iniziare è stato silenziosamente promosso a ON per ogni bambino org mai creato. Scrivere una riga inattiva è ciò che rende la scelta bastone, perché quel loop crea solo righe per tipi che non trova nessuno per. È anche per questo che non può essere un miglior sforzo dopo passo impegno: il fallback non lascerebbe le app azzeccate, li lascerebbe al contrario di quello che il creatore ha chiesto. Deliberatamente stretto in tre posti. Un org senza modello applicato è lasciato su il percorso pigro -- computeDisponibilitàMap risponde OPTIONAL DEFAULT DISABLE per tutto ciò che c'è, e materializzando che avrebbe dato a qualcuno uno spazio di lavoro dove non c'è niente e niente dice perché. Una selezione che nomina un app modello non offre è ignorato, non rifiutato: il mago mantiene la sua bozza in storage sessione, quindi un amministratore restringere il modello di midsession non deve costare un cliente loro creare. E una null appSelezioni non è "nessuna app" -- è un client più vecchio, e ogni applicazione rientra nel modello predefinito.
· kamo-shared-library
Riscrivere la copia del catalogo app per le persone che lo leggono
Il nome e la descrizione del display su ServiceType sono l'unica descrizione un'app che la maggior parte delle persone vede mai: un amministratore org su Impostazioni -> App e funzionalità, a amministratore madre-org decidere che cosa il suo bambino org può utilizzare sui tipi di ramo schermo, e ora chiunque stia creando un'organizzazione nella procedura guidata di rete... qualcuno che in genere non ha mai usato la piattaforma prima. Due cose erano sbagliate con quella copia, e entrambi i clienti costo. Descrisse l'attuazione. "Ai-powered assistente con chat, RAG integrazione", "Voice Over IP PBX Phone System", "Video ospitato conferencing, "archiviazione di documenti personali con la modifica di Docs", "Falls torna all'organizzazione madre SMTP quando disabilitato" -- accurato a un ingegnere, e nessun aiuto a un proprietario di affari decidere se vogliono la cosa. Peggio, ha presentato la propria implementazione di Kamo come l'intera app. E-Mail, Telefono e riunioni sono ciascuno un fornitore astrazione -- EmailProviderType, VoipProviderTipo e MeetingProviderTipo ogni nave un fornitore di Kamo Google Workspace / Microsoft 365 / Zoho / Exchange / IMAP, RingCentral e Squadre Telefono, Zoom e Squadre. "E-Mail - E-Mail Hosting" legge come "tick this se vuoi che Kamo ospita la tua posta", così ogni org già su Workspace o 365 aveva un motivo per decoder un app costruito per esattamente loro. Inoltre riempie due vuoti genuini la copia mai menzionata: HR possiede il legale e il personale dei documenti di divulgazione deve leggere e firmare, e Marketing invia all'ingrosso e gocciolare le campagne e-mail. ServiceTypeCustomerCopia Perni di prova entrambi gli errori in modo che non possano tornare indietro. I nomi costanti sono intatti... E' il momento giusto. persiste il nome come una stringa, quindi un rinominare silenziosamente riassegna ogni I contributi del modello di sicurezza.
· kamo-internal
Ridurre le etichette nav a Opportunità e Crediti
· SecurityService
Proteggere gli account dio nell'elenco degli amministratori della piattaforma
I diritti della piattaforma di un account dio possono essere modificati solo da un altro dio, e da un dio account non può mai essere rimosso dalla lista — da chiunque, compreso un altro dio. Dio è l'identità di rottura della piattaforma: i suoi titolari sono ciò che rimane quando tutto il resto è stato mal configurato. Un amministratore in possesso MANAGE PLATFORM ADMINS ma non Dio potrebbe altrimenti raggiungere in un account dio e togliere i suoi diritti, che è proprio la modifica che disarmerebbe le persone in grado di annullarlo. La rimozione è assoluta perché la riga che va via spoglia ogni diritto subito; cambiare i diritti rimane possibile, ma solo tra pari. Il test di peerage è User.isGod sul chiamante, non una finestra open God-mode: essere Dio è ciò che ti rende l'obiettivo è uguale qui, mentre la finestra è circa Usando deliberatamente quel potere altrove. isGod(Member) non chiude nella direzione di protezione — un membro il cui utente record non può essere letto è trattato come dio, quindi una riga illeggibile è lasciata sola piuttosto che modificato sulla forza di una ricerca che non ha funzionato. Il chiamante la propria bandiera fallisce dall'altra parte, dal momento che permette solo controlli. Riguarda tutti e tre i percorsi di scrittura, incluso il punto finale aggiuntivo, che sostituisce diritti su un re-add e altrimenti sarebbe un modo intorno alla regola.
· kamo-internal
Gli account di Dio sono protetti nella lista degli amministratori della piattaforma
Due regole che il server applica e questo solo rispecchia: la piattaforma di un account dio i diritti possono essere cambiati da un altro dio e nessun altro, e un account dio può mai essere rimosso dalla lista — non da un altro dio, non da solo. Dio è l'identità della vetroresina, quindi i suoi titolari sono l'ultima via di ritorno quando tutto il resto è stato mal configurato. Un amministratore in possesso MANAGE PLATFORM ADMINS ma non Dio potrebbe altrimenti raggiungere in un account dio e strip it, che è l'unica modifica che disarma le persone che lo avrebbero annullato. Entrambi i controlli sono disabilitati con la ragione attaccata piuttosto che nascosta — un controllo che svanisce legge come una caratteristica mancante, che si spiega legge di regola. Il chip "+N more" porta la stessa serratura, dal momento che apre la stessa dialogo.
· SecurityService
Cuocere l'ordine di sfondo dell'org in config.json
kamo-login, kamo-register, il sito di marketing e KamoMeet tutti leggono tema secchio config.json per backgroundImageCount; sfondoOrdina ora corre accanto a esso, così la scelta sequenziale/shuffle di org-wide raggiunge tutti 4 sulla prossima disposizione tematica. Solo i due valori noti sono emessi — qualsiasi altra cosa è omessa in modo da cliente torna alla sequenziale piuttosto che leggere un valore che non fa riconoscere. L'org PUT rifiuta un valore non riconosciuto.
· kamo-shared-library
Colonna di sfondo order per l'ordine di presentazione pubblica
Nullable VARCHAR; null si risolve sequenziale su ogni cliente, che è quello che ogni org aveva prima che la colonna esistesse. Plain String piuttosto che un enum così una modalità successiva non ha bisogno di una spazzata CHECK-constraint. Lo specchio ALTER è già stato eseguito attraverso KamoInitializer e colonna è confermato presente in Yugabyte, quindi questo non è armato.
· InitializerService
Perseguire le righe memorizzate per i due diritti di note in pensione
SHARE NOTES (72) e MANAGE NOTES SETTINGS (73) sono stati eliminati da RoleRightType oggi per non avere alcuna caratteristica a cancello. Questo rimuove quello che hanno lasciato dietro, contato e collegato alla stessa corsa piuttosto che sinistra per RoleRightsSyncService per spazzare silenziosamente su qualche avvio successivo SecurityService. Misurato prima di scriverlo: 84 righe sulle tabelle dei ruoli, 16 righe dei modelli, 94 righe applicate, e nessuno a livello di dipartimento, livello di lavoro o membro. Entrambi codificano di nuovo. Le tabelle dei diritti e l'istantanea applicata memorizzano l' intero Memorizza il nome enum. Uno id-keyed DELETE non corrisponderebbe nulla sulla tabella dei modelli e il successo del report, lasciare 16 file per i diritti che non si risolvono più ad essere letti nella forza-regola mappa su ogni ricalcolo — che non è ipotetico, è quello che è successo a 24 delle 150 righe la pulizia del canale di chat era destinata a rimuovere. Nessun cancello di semina e nessun cancello di verifica, a differenza del seme di incontro: la cancellazione di un diritto non può rimuovere l'accesso di qualcuno, perche' niente li legge mai. Questo è ciò che li ha fatti in primo luogo.
· kamo-shared-library
Elimina SHARE NOTES e MANAGE NOTES SETTINGS, che non nomina nulla
Le note sono reali, e a partire da oggi completamente gated — VIEW, CREATE, EDIT e DELETE sono applicato su ogni punto finale di KBService's NotesController. Questi due non avevano niente a nome. Non esiste una condivisione modellata da nessuna parte nella piattaforma: nessuna colonna su Nota, nessun campo su NoteDTO, nessuna tabella note shares — le tabelle note sono note, note tags, note versioni e note embedding records — nessun punto finale tra i dieci e nessun UI. I tre "share" colpiscono a FloatingNote. tsx sono prose e quelli in servizio sono il nome del pacchetto com.kamo.z.shared. L'architettura punta allo stesso modo: a La chiave del contenuto di nota deriva dal suo proprietario, quindi condividere uno è un ri-keying problema piuttosto che un punto finale mancante. MANAGE NOTES SETTINGS non ha alcuna superficie delle impostazioni — nessuna scheda sotto impostazioni/funzioni, nessun percorso sotto app/impostazioni, nessuna tabella di configurazione, nessuna entità di configurazione, nessun riferimento da nessuna parte nel frontend. Questo è il caso CREATE CHANNELS, dove il sostantivo non esiste, e deliberatamente non il caso MANAGE MEETINGS tenuto la scorsa settimana, dove il sostantivo è modellato — MeetingStatus ha già CANCELLED e ENDED, e WebinarService guida entrambi — e solo il verbo è inesposto. Il test che indica la tassonomia porta il ragionamento. La tassonomia 196/132/33/31 diventa 194/131/33/30, 63 radici. Due numeri si muovono piuttosto di tre: SHARE NOTES era uno dei quattro figli di VIEW NOTES, quindi VIEW NOTES rimane un root-with-children invece di collassare il modo in cui ACCESS CHAT ha fatto. Ids 72-73 sono bruciati. RoleRightTypeIdConverter persiste il id, quindi un diritto futuro riusare uno avrebbe ereditato qualsiasi cosa quelle righe significate nelle org che li avevano acceso. Le righe memorizzate vengono rimosse da NotesRightsPurgeMigration.
· InitializerService
Aggiungi orgs.background order
Nullable VARCHAR(20), nessun backfill e nessun DEFAULT — ogni cliente risolve un valore assente alla sequenziale, che è il comportamento che ogni org aveva prima che la colonna esistesse. @Order(0) per la convenzione colonna-add: una volta che l'entità condivisa-lib mappa esso, qualsiasi secondo corridore caricamento un Organizzazione lo emette nella sua SELECT.
· kamo-marketing
Leggi il conteggio di fondo reale dell'org e l'ordine di gioco
L'eroe probed per bg/1.webp e poi hardcoded tre cornici, quindi un org con più mai mostrato loro e la rotazione modulo'd LOCAL BGS.length indipendentemente da quante immagini erano in realtà. Ora legge config.json come ogni altra superficie di Kamo, e onora l'ambientazione dell'org.
· kamo-register
Onora l'ordine di presentazione sequenziale/shuffle
Stesso contratto config.json di kamo-login: backgroundOrder guida tutti tre sfondi di registrazione, mancante chiave rimane sequenziale.
· kamo-login
Onora l'ordine di presentazione sequenziale/shuffle
config.json ora trasporta backgroundOrder accanto backgroundImageCount. Shuffle re-randomette su ogni anticipo e non ripete mai la cornice su schermo; una chiave assente rimane sequenziale, che è quello che ogni org aveva. I due schermi Swiper mantengono il loro crossfade ma guidano il proprio timer quando ripieno — Swiper autoplay solo mai passi avanti una diapositiva.

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