Salta al contenuto
KAMOUniverse

Changelog

Cosa c'è di nuovo.

Ogni miglioramento alla piattaforma, come si spedisce.

  1. · 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.

  2. · 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à.

  3. · 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.

  4. · 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.

  5. · 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.

  6. · 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).

  7. · 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.

  8. · 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.

  9. · 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.

  10. · 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.

  11. · 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.

  12. · 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.

  13. · 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.

  14. · 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à.

  15. · 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.

  16. · 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.

  17. · 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.

  18. · 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.

  19. · 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.

  20. · kamo-internal

    Ridurre le etichette nav a Opportunità e Crediti

  21. · 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.

  22. · 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.

  23. · 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.

  24. · 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.

  25. · 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.

  26. · 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.

  27. · 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.

  28. · 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.

  29. · 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.

  30. · 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