Mergi la conținut
KAMOUniverse

Jurnal de schimbări

Ce e nou.

Fiecare îmbunătățire a platformei, pe măsură ce se livrează.

  1. · kamo-shared-library

    Pagina și filtrați cotațiile unui cont în baza de date

    Un punct de vedere cont are nevoie de fiecare citat pe toate pistele sale. Încărcare le pentru a face o pagină degradează în fiecare lună contul este în uz, și orice total afișat ar acoperi doar ceea ce a fost adus Interogatoriul este nativ pentru că citatul deține doar un leadId moale, cu nici o asociere să se alăture prin; se alătură leads.uid = commerce quotes.lead id și lights pe lead.cont uid. Tragerea conduce contului într-o listă IN nu ar supraviețui o carte mare de afaceri. Fiecare filtru este un predicat nul-păzit, astfel încât o interogare servește grila nefiltrate și orice combinație de filtre mai degrabă decât o metodă per permutare. Sortare chei sunt permise-lista: valoarea ajunge la un ordin nativ BY, astfel acceptând un numele de câmp arbitrar de la client ar fi un punct de injectare. Proiecţia listă, de asemenea, câştiguri trimiseAt, acceptateAt, versiunea şi opţiunea/line conta o imagine de ansamblu este citit pentru "cât timp a fost acest lucru, a făcut-o teren," care precedent Câmpurile nu au putut răspunde.

  2. · kamo-signer-monorepo

    Arată agentul desemnat pe copia clientului

    Potrivit previzualizarea personalului: antetul de litere nume org, aceasta nume persoana de a cere.

  3. · kamo-internal

    Arată agentul desemnat pe previzualizare

    Un panou "Contactul dvs." de mai sus subsolul nume, titlu, telefon și e-mail ştie pe cine să întrebe despre preţ. Absent în întregime atunci când plumbul nu este alocat.

  4. · SecurityService

    Rezolvați agentul alături de client, dintr-o căutare plumb

    Ambele blocuri vin de pe aceeași pistă, astfel încât controlorii să-l aducă o dată și derivă fiecare mai degrabă decât lovind serviciul de două ori pe redă. Încă telescopizat în ambele locuri; pe pagina publică domeniul de aplicare vine de la propria organizație a link-ului.

  5. · kamo-shared-library

    Numele agentului desemnat de plumb pe document

    În antet se identifică org, dar un client cu o întrebare despre un preț necesită persoana care deține relația. Citatul poartă acum agentul desemnat al liderului. numele, titlul postului, e-mailul şi telefonul de serviciu. Numai datele de contact de lucru: un citat poartă identitatea de afaceri a agentului, niciodată un numărul personal care se întâmplă să stea pe dosarul lor membru. Titlul locului de muncă preferă jobTitluOfficial, care este ceea ce org a ales să tipărească, înainte de titlul legat de locuri de muncă. Un plumb nealocat, sau un agent cu nimic înregistrat, nu produce mai degrabă nici un bloc decât un "Contactul tău" se îndreaptă spre spaţiul gol. Refolosirea rezoluţiei numelui *************** aceeaşi cale LeadController Deja se utilizează pentru ofițerul de împrumut atribuit, astfel încât cota nume agentul exact ca Restul vederii principale.

  6. · kamo-internal

    Reatribuirea agentului care deține o oportunitate

    Dialogul aprobului câştigă un agent culegător, extras din aceeaşi piscină. validează contra. Coloana Agent Grila arată acum cine HOLDS oportunitate, cu o chihlimbar "Reatribuit din ..." titlu atunci când nu mai este agentul care a cerut Controlul de plumb-header urmează și el. A fost cheia de pe solicitant, care după o reatribuire ar fi oferit dialogul de extensie a agentului care nu mai deține și-l ascunde de cel care face și porțile backend acest obiectiv al titularului, astfel încât oferta s-ar fi încheiat cu 403.

  7. · SecurityService

    Reatribuiți agentul exploatație, și e-mail toată lumea afectează

    Un agresor poate da acum o oportunitate unui alt agent. Solicitantul este niciodata rescrise Ambele nume, așa că șase luni mai târziu recordul arată că sa mutat mai degrabă decât Am citit ca şi cum noul agent a cerut-o. Proprietatea de extindere, lider control și masca de detaliu toate urmați suportul acum; filtrul "agent" se potrivește Fie sfârșitul unei reatribuiri, pentru că ascunde de agentul care a găsit-o și De la agentul care-l deține sunt ambele răspunsuri greșite. Nouă notificări acoperă ciclul de viață. Cererile și cererile de prelungire se referă la toată lumea care le poate decide ambele drepturi de decizie, deoarece un membru care poate doar negarea nu ar fi altfel învățat o cerere există pentru a nega. Decizii și editare du-te la titular, solicitantul inițial atunci când aceasta diferă, și fiecare coleg pe o comision împărțit; o editare în plus mail-uri oricine a deplasat, pentru că pierde o parte comision în tăcere este exact ceea ce aceste e-mailuri sunt pentru. Două lucruri sunt purtătoare de sarcină în modul în care trimiterea este secvențiată: - Rezoluţia şi redarea au loc cu precizie, în cadrul tranzacţiei apelantului, în timp ce entitatea deține în continuare valorile pe care le are emailul. aprobareExtensie() șterge câmpurile de extensie imediat după, astfel încât o citire ulterioară ar descrie "nu timp suplimentar" pe un e-mail al cărui subiect este cât timp a fost acordat. - Sending aşteaptă pentru *************** Anunţarea unei decizii că un eșec mai târziu se rostogolește înapoi ar lăsa agenți care dețin un e-mail pentru o aprobarea care nu s-a întâmplat niciodată, iar după finalizare mai degrabă decât dupăCommit înseamnă Conexiunea bazei de date este eliberată înainte de începerea HTTP. Valorile de detaliu-table sunt scăpate în momentul în care acestea introduc harta: numele membrilor sunt org-intrat text liber, tabelul este injectat ca HTML brut, iar randorul scapă Nimic. O editare care schimbă nimic nu trimite nici un e-mail, și o rezervare PELLING nu trimite nici un "actualizat" 60 de teste.

  8. · EmailService

    Previzualizare probe pentru cele nouă notificări de oportunitate

    Fără un braț aici admin Email șabloane editor redă fiecare titular gol, astfel încât oricine personalizarea acestor nouă ar fi editarea unui schelet gol. Un braț pentru toate nouă: ele împărtășesc o variabilă stabilită prin proiectare, astfel încât o singură hartă eșantion Fiecare dintre ei este credincios. Hartă.ofEntries deoarece Hartă.of caps la zece perechile şi setul sunt mai mari decât atât.

  9. · InitializerService

    Reasignabil agent primar pe o oportunitate rezervată

    PRIMARY AGENT MBER ID este cel care deţine oportunitatea acum; CERED BY MBER ID este lăsat neatins pentru totdeauna. Nulable with no backfill on intented "niciodată realocat" și copierea cererii în rândurile existente ar distruge această distincție pe fiecare rezervație care precede coloana. Aplicat împotriva producției la 2026-08-04; coloana și indicele verificate prezent.

  10. · kamo-shared-library

    Reasignabil agent primar și nouă șabloane de notificare

    Un aprobator poate oferi o oportunitate Agent. PRIMARY AGENT MBER ID este cel care îl deține acum; CERERID BY MBER ID este niciodată scris din nou, pentru că cine a găsit afacere este un fapt despre trecut și Suprascrierea ar şterge singura înregistrare pe care agentul original a adus-o. Null înseamnă "niciodată redistribuit," care este o declarație diferită de "repartizat" Înapoi la solicitant" AgentAgentMemberId () este titularul, și este ceea ce decide acum cine ar putea cere o extensie și care antetul principal tratează ca proprietarul. Odată o oportunitate Se mișcă, cererea inițială este un nume în istorie, nu o cerere pe ea. Nouă șabloane canonice acoperă ciclul de viață: o cerere sau o cerere de prelungire merge tuturor celor care o pot decide; fiecare aprobare, negare, editare, decizie de prelungire, Expiră și aproape merge la agentul care o deține, agentul care a întrebat dacă este acum Altcineva, şi fiecare coleg dintr-un comision împărţit. Ele împart o coajă generată astfel încât aspectul nu poate aluneca între ele, și unul set variabil astfel încât un șablon poate referi nimic fără o schimbare Java de potrivire RĂZBOIUL, şi trimite un e-mail citind "rezervat până.".

  11. · kamo-internal

    Comisioane globale, neplata de piață și nicio unitate preselectată

    Trei schimbări în modul în care este capturat comisionul. Nimic nu mai este pre-selectat. Procent/Amont și o singură dată/Recurgerea ambelor incepe sa deconectezi fiecare comision impartit, astfel incat fiecare dintre state de tipul sau, deoarece Cineva a spus asta. Un "Procent" preselectat este imposibil de distins de un considerat alegerea, și diferența între 15% dintr-o vânzare și 15 dolari este întreaga plată. Trimite rămâne dezactivat până când un rând început este terminat. Aprobatorul este acum de acord cu o comisie OVERALL. vânzarea către agentul solicitant și grupul pe care îl împart, din care: Despărţirile pentru fiecare coleg sunt sculptate. Apare în dialogurile de aprobare și editare și ca o coloană din lista rezervată, iar o piață poate transporta un implicit care o preumple. Neplatele pieței preumple numai omologarea. Însămânţarea unei editări de pe piaţă ar fi lasa o salvare care a fost despre data ștampila pe un comision nimeni nu a fost de acord, și ar fi face "fără comision" imposibil de păstrat. Curățarea unei figuri preumplute trimite acum o Clear Commission explicit, urmărită împotriva a ceea ce formularul OPENED cu mai degrabă decât ce este stocat Serverul îl pune la loc. De asemenea: un default pe jumătate umplut de piață acum blochează salvarea în loc de a fi scăzut și raportat ca succes; coloana privind comisionul nu mai inventează "o singură dată" când nu a fost stabilită cadența; sumele împărțite în vârful instrumentului folosesc aceeași formatare de bani ca coloana; și Adăugați piața șterge câmpurile de cotare pe care le-a moștenit de la ultima Editat pe piaţă.

  12. · SecurityService

    De acord cu o comisie generală la aprobare, însămânțată de pe piață

    Aprobatorul înregistrează acum cât plăteşte organizaţia pe vânzarea către solicitant. Agent şi grupul lor. Omite-l pe aprobare și se aplică neplata de piață a plumbului Asta face ca piaţa să fie mai degrabă o problemă decât o sugestie. UI onoruri. Comisia aplică cele trei domenii împreună și nu le unește niciodată pe teren cu ceea ce este stocat. Combinând pare inofensiv și nu este: o editare care transportă doar o tipul de acţiune ar răsturna un depozit 15 de la cincisprezece la sută la cincisprezece dolari, re-denominând o plată nimeni nu a vrut să atingă. Un nevalabil sau semiconfigurat implicit al pieței este înregistrat și ignorat mai degrabă decât Aruncat. Un implicit este comoditatea, nu legea, și unul salvat prin alte căi cu o cifră nonsens nu trebuie să se transforme într-o pană de piață de neaprobat Aprobatorul poate încă să tasteze o comisie, iar aprobarea fără una este legitimă. ClearComisie este onorată înainte de toate, inclusiv incapacitatea de piață: un aprob care şterge o cifră preumplută a luat o decizie, şi în linişte Dacă o punem înapoi, ar fi inversat. 49 teste, inclusiv căi clare, paznicul de fuziune, și ambele cazuri rele-default.

  13. · InitializerService

    Coloanele Comisiei pentru oportunități rezervate și neplata pieței

    Șase coloane anulate: comisionul global a convenit asupra unei oportunități rezervate; și starea de nerambursare a pieței care o completează înainte de aprobare. NUMERIC (19,4) pentru a se potrivi tabel divizat Aplicat împotriva producției la 2026-08-04; toate cele șase sunt prezente verificate.

  14. · kamo-shared-library

    Comisionul global pentru o vânzare și neplata de piață pentru aceasta

    O oportunitate rezervată înregistrează acum ceea ce organizaţia plăteşte din vânzare agentul solicitant și grupul cu care împărtășesc potul per-colega Din care sunt sculptate fragmentele. O piață de plumb are un implicit care o preumple atunci când se acordă o omologare. Fiecare coloană poate fi anulată fără a fi implicită. O rezervare pe care nimeni nu a aprobat-o. comisionul convenit și o piață care nu a configurat una nu are implicit; scrierea unui zero în oricare ar pune o cifră nimeni nu a ales pe un record de plată. Trei domenii de cerere nu ar fi fost suficient. Un JSON nul și un câmp absent sunt același lucru după deserializarea, și absența înseamnă deja alte două lucrurile de aici Deci, ClearComisie spune îndepărtarea cu voce tare; fără ea un agresor care șterge un Comisia devine tăcere, și pe aprobarea implicit tocmai au eliminat vine înapoi. LeadIdentity câștigă default-urile de pe piață și gindIdentități acum descrie La stânga. Scris ca calea implicită l.market.x, Hibernate emite un INNER se alăture și fiecare plumb cu nici o piață iese din proiecție în întregime ar fi apărut ca "unnamed lead" pe exact rândurile nimeni nu se uită la de două ori.

  15. · kamo-internal

    Render detalii clientului pe previzualizare, de la plumb

    Îndepărtarea câmpurilor de destinatar al citatului a rămas "pregătite pentru" gol, deoarece Numele de client provine doar dintr-un cont legat și cotațiile ridicate de plumb nu au niciuna. Previzualizarea printează acum blocul pe care serverul îl asamblează din plumb. Compania conduce. în cazul în care există o menţionate mai jos Du-l.

  16. · kamo-signer-monorepo

    Arată detaliile clientului pe copia clientului

    Compania conduce blocul atunci când există o afaceri, cu contactul numit sub ea. Se potriveşte exact cu previzualizarea personalului.

  17. · SecurityService

    Rezolvați plumbul destinatarului atât pentru personal, cât și pentru opiniile clienților

    Org-scop în ambele locuri. Pe pagina publică, domeniul de aplicare vine de la propria legătură de acțiune organizaţie, astfel încât un semn nu poate ieşi la suprafaţă o pistă aparţinând altui chiriaş.

  18. · kamo-shared-library

    Pune detaliile clientului pe document, citeşte plumbul

    Dropping câmpurile de destinatar proprii ale cotației a lăsat documentul cu nimic de spus despre clientul: numele clientului a venit doar dintr-un cont legat, care a crescut cu plumb cotații nu au, așa că "pregătit pentru" tipărit gol. Destinatarul este acum asamblat din numele de plumb, companie, adresa, telefon, e-mail. Este un lookup mai degrabă decât o alăturare pentru că citatul păstrează în mod deliberat doar un moale LeadId așa modulul de plumb rămâne independent de implementat, astfel încât controlorii rezolva Și treceți blocul în. O jumătate de plumb umplut este cazul normal, nu excepția: conduce ajunge de la furnizori cu indiferent de sursa capturată. Adresa se prăbușește la o singură linie și sare peste ceea ce este Lipseşte, aşa că un lider care ţine doar un oraş printează "London" în loc de " Londra." O pistă. care nu pot fi citite randamente nici un bloc mai degrabă decât aruncarea ar trebui să fie șterse.

  19. · kamo-internal

    Mută citatele din comerț și pe primul loc

    Citaţii stăteau în conducta de comerţ, lângă comenzi şi căruţe, mai degrabă decât lângă Sunt pentru clienţi. Ei trăiesc acum pe plumb: o filă de citat imediat după Client Lead Date, afișate numai în cazul în care piața le permite. Pagina de citat singur este plecat mai degrabă decât păstrat în spatele unui steag furnizează antetul, identitatea clientului, comunicările și documentele sale, astfel încât al doilea layout record pe partea de sus a care duplicat crom și împărțit istoria clientului În două. Selectarea unui citat alunecă lista și editorul în, și antetul de plumb nu iese niciodată din ecran. Filele de comunicaţii şi Docs sunt retrase din acelaşi motiv. Piețele câștigă un comutator Enable Cites și termenii impliciti cu care încep cotațiile lor. Fără EDIT QUOTE TERMS câmpul de termeni este dezactivat și omis din sarcina utilă; serverul o benzi prea, deoarece o intrare dezactivat este prezentare, nu de aplicare. Sub-tab ID-uri pierde "cote"; testul de regresie acum afirmă proprietatea generală tab trecut primul păstrează propriul index numirea unei file care nu mai există.

  20. · SecurityService

    Expuneți setările de cotație per piață; aplicați termenii grant

    market-config spune acum punctul de vedere principal dacă să ofere o filă quotes și ce formulare a noul citat începe cu, iar obiectivele de piață se rotunjesc în ambele domenii. Termenii de editare sunt deposedat server-side pentru apelanți fără EDIT QUOTE TERMS. Dezactivarea domeniu în UI este prezentare; un PATT manual nu trebuie să poată rescrie org Nici formularea legală.

  21. · kamo-shared-library

    Citările aparţin pistelor, configurate pe piaţă

    Citaţiile au fost un artefact comercial-pipeline, care le-a pus lângă comenzi şi căruţe mai degrabă În afară de clientul pentru care sunt. Ei atârnă acum de plumb: piața decide dacă conduce poate transporta cotații la toate, și termenii impliciti fiecare citat în care Piaţa începe cu asta. Pe piață, mai degrabă decât per org, deoarece un birou ipotecar emite estimări ale împrumuturilor în cadrul TRID și nu are nici un folos pentru un citat generic, în timp ce o piață de servicii trăiește pe ele. Termenii poartă angajamentul juridic al org-ului, astfel încât plecarea de la formularea pieței pe o singură cotaţia este propria subvenţie Un câmp nul înseamnă deja "pleacă" neschimbat "la actualizare, care este ceea ce permite controler-l benzi pentru apelanți fără Corect. De asemenea, scade numele/adresa/telefonul propriu al destinatarului citat: plumbul deține deja Detaliile clientului, și instantaneu le duplicat un record editat în altă parte care ar Deviază de la ea. Schema aplicată de KamoInitializer înainte de această comitere; coloane verificate.

  22. · SecurityService

    Rezervă, aprobare și audit

    Suprafață REST în spatele/liders/opportunities/rezervat și opțiunea de rezervă controlul în antetul de plumb, plus serviciul care deține invarianții. Drepturi, aplicate explicit deoarece acest serviciu ruleaza permisAll with no @EnableMetode view OPPORTUNIties fiecare citire CREATE OPPORTUNIties ridica o cerere, și cere mai mult timp pe cont propriu EDIT OPPORTUNITĂȚI de aprobare, editare, închidere, decizie privind o prelungire DELETE OPPORTUNIties "Deny Oportunity," pe care UI pune în spatele unei confirmări Negare este terminal, dar nu distructiv: rezervarea, scindările și întregul său Istoria rămâne lizibilă în fila respinsă. Acesta este punctul de a nega mai degrabă decât ştergerea. Detalii care merită păstrate: - Obiectivul final este lizibil numai cu CREATE, deoarece butonul trebuie să știu ce stat de a face Agentul primeşte o proiecţie îngustă. Comisia împarte și justifică faptul că Vederea există pentru a proteja nu sunt dezvăluite de poarta lărgită. Rebuilt ca un permis-listă, astfel încât un câmp adăugat mai târziu nu se poate scurge prin omisiune. - Lista mascheaza contactul si compania pe conduce nealocate pentru membrii fara VEDE UNASsignED LEADS, potrivire LeadController. Cine a pretins ceea ce nu este secret; perspectiva este. - Extinderea este poarta de a fi agentul care deține rezervarea, fără Dumnezeu bypass: deținerea unei rezerve este un fapt de identitate, nu un drept, și o extensia este depusă pe numele solicitantului. - O rezervare expirată care se extinde repornește mai degrabă decât reia, așa rezervatPână la rezervareDe la + aprobat Zilele continuă să dețină actualizarea () re-derives sfârșitul de la început, și un început vechi ar șterge în tăcere grantul. - Pool-ul împărţit în funcţie de comision este deţinătorul REVIZUIRE LEADS plus toţi proprietarii/adminii subvenţionaţi, identic cu ceea ce oferă criteriul final de selecție. Calculând-o de la tabelul de drepturi singur a făcut livrare oferă un proprietar backend apoi respins. - Expirare este o matura programat astfel încât file pot pagina pe o coloană reală, dar fiecare DTO raportează zileRămâne împotriva ceasului bazei de date, deci citirile sunt corecte între matura indiferent. 36 de teste acoperă ciclul de viață, aritmetica datei și regulile de divizare.

  23. · InitializerService

    Tabele pentru rezervările de oportunitate de plumb

    Mirrors LeadOpportunityReservation, LeadOpportunity CommissionsSplit și În biblioteca kamo-împărtăşită. DDL-auto: actualizare ar creați-le din entitățile oricum; DDL explicit este convenția casei şi face forma să poată fi revăzută aici în loc să fie inferabilă doar din adnotări. Aplicat împotriva producției la 2026-08-04 există, deținută de utilizatorul aplicației.

  24. · kamo-shared-library

    Entități pentru rezervarea de oportunități de lider în timp-boxed

    Un agent deține o creanță exclusivă privind închiderea unei conduceri pentru o fereastră delimitată; o Granturi, editări sau negări aprobate, iar colegilor li se poate oferi o parte din Comisia. Trei tabele: rezervarea, comisionul său se împarte și o Apendice-doar pista de audit. Puncte de proiectare care poartă încărcătură: - Lead, organizare și referințe membre sunt coloane simple id cu nici un străin Chei, potrivire Lead history și Lead task. Traseul trebuie să trăiască mai mult decât plumb ștergere și churn membru fără a fi în măsură să-l blocheze sau cascada. - dbNow() folosește CAST (acum() AS timestamp). CockroachDB e gol acum. care Hibernate 6 materializeaza ca un Instant care nu poate fi aruncat la declarat LocalDateTime citire parser ':' ca un prefix parametru. Nici nu apare la momentul compilării. - Lista de pagini utilizează mai degrabă JpaSpecificationExecutor decât JPQL cu (:param IS NULL SAU ...) gardieni, deoarece CockroachDB respinge o legătură netipificată parametrul într-un test NULL NULL gol. - LeadIdentity este o proiecţie, nu entitatea Lead: Hărţi de plumb patru @ManyToOne asociații care nu sunt în stare de nerambursare pentru EAGER, astfel încât listarea 100 de rezerve pe entitate ar foc sute de selecții pentru date grila nu arată. - Ordinele cronologie istorie de (dateCreated DESC, id DESC). CockroachDB acum () este marca de timp a tranzacției, astfel încât rândurile scrise de o editare să o împartă exact; fără a rupe legătura o pistă de audit se remaniere între sarcini pagină. Nu există stereotipuri aici plăteşte pentru scanarea depozitului.

  25. · kamo-internal

    Adresați-vă cota la o persoană; sumar se oprește costurile de înălțime antet

    Mutarea rezumatului din coloana din dreapta a fixat lățimea, dar a cumpărat-o înapoi ca o trupa sub titlu. Acum se află în decalajul care a existat deja între titlu și acțiunile rapide, așa că nu costă deloc spațiu. Acest decalaj este finit, așa că mai puține arată în linie iar restul staţi la un click distanţă. acţiuni. Acesta rămâne vizibil la fiecare lățime, mai degrabă decât să dispară pe ecrane înguste. De asemenea, cotația câștigă destinatarul său: pentru cine este, opțional, adresa și telefonul lor. Acestea conduc prima secțiune pentru că este primul lucru pe care îl decideți, și când o contul este legat câmpul de nume arată ce altfel ar cădea înapoi la. ă blocul de previzualizare "Pregătite pentru" redă toate cele trei și reflectă ceea ce este tastat mai degrabă decât ce a fost salvat ultima dată.

  26. · kamo-shared-library

    Adresați-vă unui citat cuiva care nu este încă un cont

    Destinatarul a fost derivat numai dintr-un cont legat, astfel încât orice cotație ridicată pentru o prospect Documentul nu a spus pentru cine era. Citatul poartă acum numele, adresa şi telefonul destinatarului. Ce? personalul tastat câștigă peste contul legat: au spus ce ar trebui să fie tipărit, și un contul redenumit mai târziu nu trebuie să rescrie în tăcere un citat care a fost deja trimis. Adresă este liberă, deoarece formatele poștale nu sunt suficient de uniforme pentru a fi împărțite în domenii care funcţionează la nivel internaţional şi printează aşa cum este scris. O revizuire îl poartă pe destinatar înainte aceeași ofertă, aceeași persoană. Schema aplicată de KamoInitializer înainte de această comitere; coloane verificate prezent.

  27. · kamo-internal

    Deschide profilul unui membru din rândul lor

    Adaugă o a patra acțiune la doc hover rândului, care leagă Nu-ţi face griji. Este un NextLink real mai degrabă decât un handler click, astfel încât click-mijloc și "deschis în tab nou" se comporta și garda de navigare repo nu-hard Satisfăcut; panoul se închide pe navigație astfel încât corpul său de defilare blocare nu Să supravieţuieşti schimbării rutei. Acţiunea este poarta modul în care porţile destinaţiei în sine: setările membre pagina va redirectioneaza spre propriul profil daca nu tineti MANAGE MINTE, MANAGE MINTE SECURITY, CONFIGURE SISTEM, EDIT MINTE ACCESS LEVEL, ALLOW PROMOTING AMINTES sau *************** (sau Dumnezeu / platforma admin). Fără una dintre ele pictograma este mai degrabă ascuns decât oferit ca un mort Sfarsit. Propriul tău rând o arată mereu.

  28. · kamo-internal

    Fail the build when a component calls a key messages/ does not define

    next-intl renders the key path verbatim for a missing key, and messages/ is gitignored here — populated at image-build time from kamo-translation-dictionary — so a rename that lands in only one of the two repos ships as visible gibberish with nothing to catch it. That is how the department contact fields came to render **************** on the settings screen, and how the entire HMDA demographics form (39 labels) shipped against a namespace that only contained `lar`. scripts/check-i18n-keys.mjs resolves each translator binding's namespace, then checks every literal key, the static prefix of every template-literal key, and the values passed against the {placeholders} in the message — in both directions, since an unsupplied ICU argument throws MissingValueError and an unused one silently drops data. It understands ICU brace escaping and plural sub-messages, and treats <tag> as a placeholder only for t.rich/t.markup. 1737 files in ~1.4s. Wired into `npm test` and into the Dockerfile ahead of the build, with --require-messages there so a skipped dictionary sync fails loudly instead of turning the guard into a no-op. Typing t() against `typeof en` was tried first and rejected: a JSON import widens values to `string`, so next-intl cannot infer placeholders and rejects correct calls like t('...range', {start, end, total}); it also tripled typecheck time (81s -> 249s) and would have needed ~150 edits to non-buggy code. Call-site fixes for what it found: - dropped a `default:` option passed to t() in the chat components and LanguageButton; next-intl has no such fallback option, so it was dead weight. - commerce lowStock passed {count} for {available}, MultiFileUploader {types} for {list}, and audioVideo master volume {pct} for {percent} — all three threw at format time. - DnsSetupStudio passed a {domain} its subtitle does not use.

  29. · kamo-internal

    Opţiuni Pin/unpin Nav de la navs şi pad de lansare acasă

    Membrii ar putea muta o opțiune între bara laterală și bara de sus, dar niciodată Ia unul din navs în întregime. Adaugă un al treilea loc de plasare și două moduri de a ajunge la ea, ambele de conducere același meniu comun: - click dreapta pe o optiune mobila in NavPri/NavTop: meniul de plasare se deschide la - controlul colÅ£ului pe fiecare geam home-lansare: un cip liniÅ£it care citeste în cazul în care opțiunea stă în prezent și se extinde pe hover, deschiderea aceluiași meniu Unpinned nu este niciodată o fundătură. Placa de lansare de acasă acum redă din fiecare poartă opţiune mai degrabă decât uniunea celor două navs, astfel încât o opţiune necrescută păstrează vedere care pini înapoi; paleta de comandă face același lucru, și fiecare schimbare ridică o denumire de pâine prăjită anulată în cazul în care opțiunea a mers. Planul de navigare pagina setărilor crește o coloană de potrivire Unpinned. Rezolvatorul păstrează invariant său şi o NONE explicită bate acum un ordin zonal vechi, astfel încât un un pin supravieţuieşte o pată Scris înainte. Modelele stocate prin moștenire nu au intrări și soluții NONE Exact ca înainte; Resetat la Standard nu poate lăsa nimic neatins. Acoperite prin noi teste pentru a rezolva NavLayout, care nu au avut nici unul.

  30. · kamo-internal

    Ascunde departamentele goale, mută filtrul de stare în Directory

    - Departamentele fără membri nu mai fac. Obiectivul final al departamentului întoarce fiecare departament din org inclusiv cele goale, astfel încât lista a fost arată secțiuni care nu ar putea conține pe nimeni. Per-departament "nu Locatarul membrilor merge cu ei, fiind inaccesibil acum. - Filtrul All/Online/Offline se mișcă de la antetul la nivelul panoului de dedesubt banda fila, astfel încât să stea în zona proprie Directory cu lista filtre în loc să apară pentru a filtra întregul panou (nu s-a aplicat niciodată Chats sau Mobile Access). - Starea goala sugereaza ajustarea cautarii/filtru numai cand este aplicat efectiv; un org fără membri nu are nimic de ajustat.

Universul tău te așteaptă.

Începeți gratuit în câteva minute.Adăugați produse oricând sunteți pregătit — fără migrare, fără autentificări noi.

Gratuit pentru totdeauna — nu este necesar un card de credit