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

    Un domeniu este revendicat prin dovedirea acestuia, nu prin tastarea acestuia

    Trei reguli, şi au sens doar împreună. **Naming un domeniu nu pretinde nimic.** Un FQDN a fost la nivel global unic aici, astfel încât prima organizație pentru a introduce "acme.com" blocat fiecare alte unul compania care deține de fapt acme.com, care apoi a avut nici un fel în. Cineva care a dovedit nimic nu trebuie să poată nega un domeniu pentru cineva care Poate. Rândurile duble între organizaţii sunt acum legale; o repetare în cadrul uneia organizarea este încă refuzat, pentru că este o greșeală cu nici un sens mai degrabă decât o cerere concurentă. ** Doar un domeniu verificat.** gindByDomain acum necesită proprietate verified pe rândul de sus, astfel încât o gazdă merge la organizația care a dovedit controlul DNS-ul lui mai degrabă decât celui care l-a scris primul. Fără această pereche prima regula ar fi o ușă deschisă: revendica unelebank.com și așteptați. Un alias îi moşteneşte verificarea părintelui care este citită pe părinți explicite se alăture, niciodată ca d.parinte.proprietateVerified, care Hibernate emite ca un amestec interior peste intreaga interogare si ar scadea fiecare Rândul Apex. **Verificarea ia domeniul de pe oricine altcineva.** setOwnershipVerified revocă același FQDN oriunde altundeva este deținut, astfel încât există cel mult un titular la o Timpul. Aceasta nu este o curtoazie: două rânduri verificate sunt atât routable, și Rezolvatorul ar preda traficul la care baza de date a revenit prima. An organizaţie care a verificat un domeniu anul trecut şi a lăsat să dispară ar Continuă să primeşti corespondenţa celui care o deţine acum. Verificarea DNS a ratatului merge cu ea, deoarece descrie un nume de gazdă care nu mai arată spre ei. Permiterea duplicate apoi rupe fiecare aspect care a presupus un rând, și unul dintre Acestea nu au fost un accident, ci o deturnare: UpsertDomain se potrivesc cu numele domeniului și apoi a redistribuit ceea ce a găsit organizaţiei de chemare, aşa că un upsert ar fi luat în liniște domeniul altei organizații departe de ea. Este Organizare-scop acum. Restul găsițiByDomain, actualizareSslInfoByDomain, transferDomainOwnnership rând verificat și în alt mod ia cel mai mic ID, astfel încât proprietarul unui domeniu nu poate schimbare între două cereri. Left as Opţional legations they would have swing E o idee bună.

  2. · SecurityService

    Asigură implicitul pe ecranul de casă pe membru

    Citește pe POST/PUT /modele de securitate și Put /master-model și emis din Setări /aplicate-modelului astfel încât coajă poate decide unde un membru aterizează pe "/." O aplicaţie separatăAcasăScreenDefaults mai degrabă decât trei mai multe poziţionale argumente privind o metodă de serviciu care ia deja cincisprezece. Cheile absente sunt lăsate Singur decât resetat, astfel încât un client care postează un model de securitate fără să știe despre acest domeniu nu poate mana linistit fiecare membru al modelului lor launchpad înapoi sau ia-l departe. /modelul aplicat se normalizeaza pe cale de ieșire și în. REquires CHILD ORG Proprietatea reţine un ecran de acasă, aşa că o coloană nulă pe un rând scris înainte de aceasta Livrate, sau ceva nerecunoscut, citit ca tabla de lansare. Clientul e al meu. Retragerea este aceeași valoare, astfel încât cele două nu pot fi de acord.

  3. · kamo-shared-library

    Un model de securitate spune unde fiecare tip de membru aterizează pe "/"

    Trei coloane despre ChildOrg SecurityModel Nu-ţi face griji. Default org downner home screen. Fiecare deține HOME SCREEN DEFAULT sau REQUIRES CHILD ORG OWNERShip; al doilea reţine Launchpad până când acel membru deține o organizație proprie. Trei mai degrabă decât unul, deoarece cele trei tipuri de membri sunt trei locuri de muncă diferite: același model de rutină vrea un membru simplu împins în crearea propriului lor organizare în timp ce membrii și proprietarii echipei sale merg direct la locul de muncă. Despărţirea Oglinzile applies to members / team members / downners exact. VARCHAR, nu un enum ordinal A treia opțiune se introduce oriunde, dar nu la sfârșit. SetHomeScreenDefaults este un setter vizat în forma de setAllowRootSubdomenii mai degrabă decât trei parametri poziţionali pe modul de actualizare, care ia deja 15. Null înseamnă "lasă-l pe ăsta în pace," deci un apelant care ştie despre unul din Cei trei nu-i pot reseta pe ceilalţi. normalizeazăHomeScreenDefault nu reușește Open și este testat pentru ea: numai șir exact întoarce cerința, deoarece alternativa ia ecranul de acasă al unui membru departe și o scriere sau un client vechi nu trebuie să fie în măsură să facă asta accidental.

  4. · InitializerService

    Cele trei coloane home-screen per-membru pe un model de securitate

    COPILUL ORG SECURITY MODELS câştigă DEFAULT MINTE HOME SCREEN, Default team member home screen şi default org downner home screen. Fiecare deține HOME SCREEN DEFAULT (launchpad) sau REQUIRES CHILD ORG OWNTERShip, care Îl reţine până când acel membru deţine o organizaţie proprie. Clauza DEFAULT este partea portantă, nu ADD COLUMN. Coloanele sunt NU NULL și proprietatea nu este goală, deci implicit este ceea ce umple fiecare modelul de securitate existent în aceeași declarație Valoarea permisivă, pentru că implicit opus ar lua tabla de lansare departe Din fiecare membru al fiecărui model în momentul în care a fugit. Ordinul (0) pentru motivul obișnuit: entitatea care transportă aceste câmpuri este încărcat de fiecare serviciu Java, astfel încât un alergător mai devreme ar muri pe "coloană nu există" înainte de a se ajunge la o migraţie întârziată. Declaraţiile SET NULL repară cazul în care a creat ddl-auto Hibernate coloana întâi, din coloana entitățiiDefiniție, fără constrângere. Fiecare este precedată de propria sa UPDATE de compensare nulă, deoarece SET NULL este refuzat în timp ce orice rând deține încă o nulă .

  5. · kamo-internal

    O listă cu ce a găsit scanarea, lângă ce foloseşti

    Sectiunea de marca /retea/creare devine trei benzi cu aceeasi forma: ceea ce site-ul dvs. are pe stânga, ceea ce organizația dumneavoastră folosește pe dreapta. Logos. Erau două şine peste aceiaşi candidaţi, unul pe slot, clasat Diferit, astfel încât o companie cu patru logo-uri părea să aibă opt, și Întrebarea a fost pusă invers. Un membru nu se uită la o balustradă şi întreabă "care dintre acestea este logo-ul meu complet"; ei se uită la propriul lor semn și spun "că unul este cea completă." Deci, este o listă a logo-uri site-ului, fiecare rând care transportă ambele destinatii Setat ca Full, Setat ca simplu pentru că este singurul lucru despre un fișier logo pe care nu îl puteți vedea uitându-vă la el Şi singurul lucru de care îi pasă slotului simplu. Marcat, niciodată filtrat: ascunde rasters de la slot simplu ascuns logo-ul companiei pe exact site-urile Scanarea a funcţionat cel mai bine. Lista pași cu săgeți sus/jos și spune cât de multe acolo sunt, așa că "este logo-ul meu aici" este răspunde prin căutarea. Au revenit trecutul. Vrăjitorul de 12 paşi a adunat tapeturi şi Rescrierea de o pagină le-a scăzut; scanarea a fost deja găsirea eroului unei companii Imagini și apoi oferă nicăieri să-l pună. Aceeaşi bandă: imagini scanate pe stânga, încărcarea și ordinea de funcționare pe dreapta, cu alegerea filigranului de mai jos Odată ce e ceva de ştampilat. Culorile sunt adoptate mai degrabă decât oferite. O scanare terminată stabileşte perechea găsită. şi culegătorii rămân în direct. Gărzile sunt tot riscul, deci sunt pure şi testate în scanAutoApply.ts: o dată pe rezultat scanare, și niciodată peste o culoare Creatorul a atins Tot aici: - "Pentru cine e asta" este absent in intregime, pana cand nu exista Ceva în ea pentru a răspunde. A fost redarea unui card gol înainte de un tip a fost ales, și din nou pentru modele care rezolva fiecare întrebare de conformitate ei înșiși. - Previzualizare live arată logo-ul FULL, partea de sus stânga a zonei de conținut de mai sus un text fals, în cazul în care un ecran de sign-in pune. Barul de deasupra este navigarea bar și arată marca este singurul loc unde un creator poate spune pe care l-au umplut. - "Sigla Compact" este "Simple logo" oriunde este citit, aici și în Getting A început vrăjitorul. Identificatorii interni sunt lăsaţi în pace. - "Short Name" este "Organization Name (Short Version) ." - Site-ul spune clar că nu aveți nevoie de unul, mai degrabă decât lăsând absența a unui asterisc roşu pentru a transmite mesajul.

  6. · kamo-internal

    Ecranul de pornire implicit per membru

    Un model de securitate spune acum în cazul în care fiecare dintre cele trei tipuri de membri aterizează atunci când acestea Deschide "/." Două valori: HOME SCREEN DEFAULT este tabla de lansare toată lumea are întotdeauna a avut, și REQUIRES CHILD ORG OWNERISHAT Îl reţine până când acel membru deţine un organizarea propriilor lor Link-ul de organizare-rețea părăsește bara de sus până când au unul. Trei coloane mai degrabă decât una, oglindirea APPLIES TO MEMBERS / TEAM MEMBERS / DOWENS, pentru că același model de rutină vrea un membru simplu împins în crearea propriei organizaţii în timp ce membrii echipei şi proprietarii ei merg la muncă. Regula este pură și testată în aplicația/lib/homeScreenGate.ts: care coloană se aplică; si ceea ce conteaza ca detine o organizatie (un proprietar al orga ei sunt deja în interior nu a creat unul Eşec. Deschide la fiecare pas. Doar coarda exactă închide poarta; o coloană nulă, o valoare nerecunoscută, un pachet de modele aplicate eșuat și o rețea de negăsit toate citit ca "nu," pentru că luând ecranul de acasă cuiva departe pe puterea de o cerere care nu a răspuns nu este ceva de făcut. Un context, montat deasupra navs și pagina, mai degrabă decât cârligul în ambele locuri: NavTop și launchpad au nevoie de același răspuns pe fiecare încărcare pagină, și două copii ar costa două călătorii dus-întors și ar putea să nu fie de acord cu lungimea unuia. Launchpad în mod deliberat nu așteaptă pe ea pagina din spatele unui /aplicat-model aduce pentru a cruța o mână de ei un scurt flash este comerţul greşit.

  7. · kamo-internal

    Creează - mi libertatea Org devine un widget în trei etape

    Widget încorporat întregul de CreateOrgForm previzualizare, contorul de disponibilitatea 756px. Rândurile HomeGrid sunt minmax (unit, auto), și că mai degrabă decât un plafon, astfel încât un geam al cărui conținut nu se poate micșora crește rândul: "Widget" redat ca o formă lungă pe pagină. Acesta este acum calea rapidă a fost întotdeauna descris ca. Trei etape adresa, review totul altceva exact ca laWizardFormData a trimis întotdeauna pentru un creator care Am sărit peste treptele alea. Marcarea, aplicațiile și conformitatea sunt finalizate ulterior în Noul vrăjitor al Orga începe. /Rețea/creare este neschimbată și încă solicită Totul în faţă. Pasul de tip este o căutare, nu o grilă de carduri. În aranjamentul dens al widget-ului grila este o carte pe rând, astfel încât un chiriaș cu treizeci de tipuri de sucursale este optsprezece sute pixeli de cărţi Căutarea face pasul o înălțime fixă la patru tipuri sau trei sute. Tot aici: - WidgetFrame ia un maxHeightPx opțional, și acest widget trece propria sa PanelHeightPx (jumătateRows), astfel încât fereastra este dimensiunea pe care membrul a dat-o și suluri Mai degrabă decât să crească. Opțional, astfel încât nici un alt comportament widget modificări. WidgetComponentProps câștigă jumătateRows pentru a face acest lucru posibil. - Previzualizare alias acum citește KamoCRM.com/o/<alias> pe ambele suprafețe care arată Acesta, printr-un singur ajutor în loc de fiecare clădire coarda în sine. DISPLAY NUMAI /api/org/curent sunt neatinse în mod deliberat și o lansare încă aterizează pe Intern. Un domeniu personalizat încă arată ca sine. - Aportul /tipuri de ramuri/creatabile și mișcarea parsing la un modul partajat și cârlig, din moment ce ambele tip-pickers nevoie de ea și poartă, de asemenea, părinților context subdomeniu. Care stabilește o suprapunere live: OrgTypePicker construit BranchTypeData de două ori și cele două copii deja plutiseră pe coerciție matrice. - spațiu de lucruUrl se mută din CreateOrgForm astfel încât widget-ul să poată construi un spațiu de lucru link fără importul întregului formular de pagină. - Următorul/link pentru saltul "deschide pagina completă." navigaţia de verificare-client a ratat Ancoră brută deoarece regexul are nevoie de <a și href pe o singură linie. Guards, TSC și 4.039 teste verzi; tastele dicționarului împins mai întâi.

  8. · kamo-internal

    Noțiuni de bază card început pe pagina de aterizare Setări

    Adaugă un card de grup esențial care leagă /setări/vrăjitoare, potrivire MakeCard idiom folosit de frații săi. Tastele dicționarului deja împinse Nu-ţi face griji

  9. · kamo-internal

    O SEND TO AI comuta pe formularul de raport

    Aliniată pe rândul "Ce raportezi?" Se deschide o sesiune pe o mașină care deține acreditări de grup, și a Comutatorul care şi-a amintit ultima sa poziţie va trimite în cele din urmă ceva pe care nimeni nu l-a trimis. menit să trimită. În acest sens, raportul este transmis direct: si citit de operatorul care a trimis-o. Desenat numai pentru un detinator de MANAGE SISTEM BUGS, citit de la serverul-rezolvat Platform RightsContext pentru o platformă dreapta la toate, deci cer ar fi ascuns comutatorul de la fiecare administratorul platformei. Aceasta este crom, fie un fel: obiectivul Serviciului de securitate stă sub un nivel de clasă @RequirePlatformRight și refuză oricine altcineva cu un 403. Cererea poartă un buletin de eroare şi nimic altceva. Formularul nu are cutie promptă, nu picker model și nici un picker captură de ecran, astfel încât serverul alege toate acestea; asamblarea unei sarcini utile aici ar fi pus aceste opțiuni în browser, în cazul în care membru care deține dreptul le-ar putea edita. Hand-off ruleaza dupa upload-uri, nu alaturi de ei. Orice este atașat în acest moment, și o sesiune începută devreme ar fi Lucrez la jumătate de raport. O expediţie care eşuează încă îşi aplică statutul, aşa că raportul este In Progress până când butonul este apăsat din nou şi un reporter poate edita doar unul care este încă nou: fereastra își amintește ce a scris ultima dată și sare peste re-salvare redundant, sau rejudecarea ar raporta că un raport salvat ar putea nu va fi salvată şi niciodată nu va mai încerca lucrul care a eşuat.

  10. · SecurityService

    Trimite la AI direct de pe formularul de raport

    Un titular de manager SISTEM BUGS primește un SEND TO AI comuta pe Bug Raport şi prezentarea împreună cu acesta a raportului către o sesiune fără dialog triage între. Noul obiectiv nu ia nici un organism, și că este punctul. Formularul nu are nici o promptitudine cutie, nici un picker model și nici un picker captură de ecran, astfel încât instrucțiunile, modelul, efortul, capturi de ecran și statutul sunt fiecare dintre ele alese aici un apelant trecut poarta nu poate exprima nimic dialogul nu a putut, ceea ce face întrerupătorul este mai îngust decât suprafaţa în care se află. Apoi merge prin expediere () neschimbată, astfel încât accelerația, rândul de audit scris înainte de apel de rețea, și verificarea de proprietate capturi de ecran sunt aceleași, nu o secundă Copiere pentru a păstra în pas. Păzit de clasa *************** dialogul Deja stă dedesubt. Consola ascunde comutatorul de oricine altcineva, dar că este cromat: un raport transmis cu steagul de un membru fără drept este refuzat cu un 403 aici și ajunge la nici o sesiune. "Deja vizualizat" este un fapt pe-membru și nu poate fi scris pentru toată lumea PlatformRightsRezolvator răspunde "acest membru îl deține," niciodată "cine îl deține." Deci, citirea este înregistrată pentru operatorul care a cerut expedierea, înainte de apel de rețea mai degrabă decât după aceasta (poate dura două minute și poate eșua) și IN PROGRESS este ceea ce ia raportul de pe insigna oricărui alt manager.

  11. · kamo-internal

    Noțiuni de bază Wizard de configurare la /settings/wizard

    Transformă cele nouă trepte de vrăjitor mutate într-un editor peste organizația membru este deja semnat. Fiecare pas se hrănește acum valoarea sa din org viu date (utilizateOrgContext, GET /api/security/org/{id}, /api/security/fetures, sau UtilizațiModelul aplicat după caz) și salvează până la atingerea obiectivului care deține deja setarea "Salvați & continuați"; "Schimbați acest pas" înregistrează progrese fără scris. - orgSettingsSave.ts: pe trepte tipuri de sarcină utilă (StepSavePayloads) și a general saveStep (cheie, orgId, valoare) expediere, tastat fără - orgDetails.ts: aport comun pentru câmpurile de org Clasa de organizare nu poartă (contact, etichete, descriere etc.). - vrăjitorSteps.tsx / StepRail.tsx / page.tsx: masa de pas, întotdeauna- șină clickable, și coajă (BrandScanProvider, inert în timpul salvărilor). - IdentityStep picaturi Nu-ţi face griji. controalele sunt Setări - > Domains/Behavior & Labeling Territory acum. - BackgroundsStep piese existente + sloturi noi împreună, deoarece /backgrounds/commit înlocuiește întreaga comandă și comitere doar nouă fișierele ar fi șters slideshow-ul existent al unei organizații. - conformationWizard.ts: wided get ComplianceStepUi's parametru to the cinci domenii pe care le citește de fapt, astfel încât etapa de conformitate poate numi cu Utilizați Setări AplicateModel în loc de un Create-time BranchTypeData. - api.ts: constructie exportataCustomLabels pentru reutilizare de catre economizorul de etichete.

  12. · kamo-internal

    Eroul /copilot și ambele coduri de scanare transporta marca cameleon prea

    au fost ultimele două site-uri, și nici nu a putut lua doar noul Src neschimbat, deoarece arta este o siluetă transparentă 127x102 unde rasterul era un pătrat opac. Copilot Hero. faianţă, astfel încât marca este Cutia de umplutură, astfel inset nu poate trăi pe placa în sine. Placa câştigă şi ea. o umplutură translucidă: obişnuia să fie pictograma şi una necompletată părăseşte graniţa şi Umbra picăturii nu prezintă nimic. QrFrame, ambele coduri. Două soluţii: - Semnul este alb, iar un cod QR este imprimat pe alb. Ca expediate a fost un Logo invizibil stând într-o gaură spartă din cod. emis <image> conduce la negru și lasă knockout-urile transparente. Are a fi CSS În acest fel este un document izolat care nu moștenește nici o culoare. - 48x39, nu 48x48. qrcode.reacta hardcodes conservaAspectRatio="none" pe care element, astfel încât caseta ESTE raportul aspect și un pătrat unul strivit marca. ă Cutia mai îngustă micşorează şi gaura excavată la ~2,9% din cod, sub 3,5% a fost înainte și departe în interiorul ceea ce nivelul M poate pierde și încă scanare. Verificat prin redarea QRCodeSVG cu aceste recuzite exacte și rasterizarea acestuia: marca citeste clar la centru si excavarea nu curata tiparul gasitorului. Ambele coduri, nu doar Instalează și propriile documente QrFrame spun să reziste styling fie site-ul apel individual.

  13. · kamo-internal

    Schimbă marca aplicației mobile pentru Cameleon SVG în șină și acasă

    raster. Ambele desenează acum arta KamoMobileApp ca vector. Checked in as SVG because that is what the mark is: a single white siluete with Knockout-uri transparente. Trecut prin svgo la 2 decimal precizie primul, care este fără pierderi pentru geometria acestei urme, dar ia fișierul de la 675 KB la 106 KB (~23 KB peste sârmă, o dată comprimată) ~5k segmente de urme. Două lucruri nu trec peste: - Cutia. VizualizareBox este 127x102, astfel încât o lățime pătrată / înălțime o strivește. Fiecare cele trei locuri de apel devine o cutie 127:102 dimensiunea pentru a menține înălțimea optică a glifului unde era PNG-ul căptuşit. - Optimizarea imaginii. vector, astfel încât fără ea cererea este o excursie dus-întors că mâinile înapoi aceleași octeți. Copilot Hero și centrul QR folosesc încă pictograma.png la propriile dimensiuni; raster rămâne.

  14. · kamo-internal

    Creează widget-ul meu Free Org

    Nave la fel CreateOrgForm pagina /rețea/creează, în sale widget layout, ca o casă-lansare widget (org.create) poarta pe Create free org widget. Ultima înregistrare: este o invitaţie permanentă, nu un panou de timp critic. Nici o poartă nu creează o organizație nu este o aplicaţie, iar cele cinci drepturi reprezintă întreaga decizie. De asemenea, oglindește CREATE FREE ORG WIDGET și cei patru copii politici în ierarhia drepturilor TS întreținută manual (205 - > 210 margini), care widgetPolicy.test.ts cinci forme de afirmaţii necesită pentru fiecare widget înregistrat.

  15. · KlusterServices

    Deschide Trimite către AI într-o filă de sesiune VS Code, nu o fereastră Konsole

    O expediere începe acum o sesiune de bază și mâinile VS Cod sesiunea sa ID, în loc să ruleze CLI într-o fereastră terminală: Trecerea prompt la URI în schimb este o capcană: apelurile de extensie SetInputText și nu trimite niciodată, și sinteza o întoarcere este imposibil în timp ce Dulapul KDE ţine strânsoarea X. O sesiune care este deja RUNNING nu mai are nimic să se supună, care este ceea ce face ca predarea să funcționeze cu nimeni la mașină. Patru lucruri masurate in loc sa fie explicate: - cwd trebuie să fie realpath[workspace Folders[0]), NU părintele comun acest lucru a utilizat înainte. Panoul gazduieste radacinile in sine la primul dosar si listeaza numai sesiuni pe care le găsește acolo, astfel încât o sesiune a început oriunde altundeva este invizibil fereastra este menita sa se deschida in Celălalt. În schimb, depozitele rămân accesibile. --add-dir este VARIADIC și a fost consumul prompt, așa că sesiunile au venit cu un compozitor gol. Lista de dosare merge acum primul, închis de steaguri după ea. - O lansare nu poate imprima nici un mâner, sau unul marcat " (a se lăsa) trimite un prompt pentru a începe." Amandoua inseamna ca mesajul nu a ajuns niciodata, asa ca ambele sunt oprite si rejudecate mai degraba decât deschis în fața operatorului ca o filă goală. - Panoul nu poate deține un agent de fundal, și unul terminat rămâne rezident, așa Un observator îl opreşte după ce terminăm treaba. Redeschide fila apoi reia Sesiune normală, conversaţie întreagă intactă. Confirmarea este acum transcrierea adresată prin ID-ul sesiunii, care elimină JSON-escaped-needle căutare care a raportat expediate livrate ca eșecuri.

  16. · kamo-internal

    /rețea/creare este o pagină; cei doisprezece pași se deplasează la /setings/wizard

    CreateOrgForm.tsx este o componentă cu două layout-uri (page/widget), construit din Task 7/8's CreateOrgFields model, grupuri de teren și OrgBrandPreview. page.tsx este acum doar Învelişul complet în jurul lui. Fişierele vechilor vrăjitori, plus mişcarea Stepper/stepIcons app/setings/wizard, unde Task 12 le rewires in the Getting Started Configuration Wizard; SucursalaTypeStep, MemberInfoStep, ReviewStep, StepNavigation, AnulareModal și SessionStorage-backed useWizardForm carlig sunt retrase pur și simplu, deoarece o singură pagină crea Nu există pași pentru a naviga între și nimic stânga pentru a salva un proiect de. Fiecare import relativ din fișierele mutate care indică la ../ui/*, ../brandscan/*, .././tipuri, .././validare, .././appSelections, .././conformityWizard sau .././hooks/* este rescrisă forma absolută @/app/rețea/creare/..., deoarece componentele/ui și componentele/marcile pot rămâne pus (componentele câmpului supraviețuitor încă le folosesc) și rezolva doar un singur director în sus de la vechea locaţie a treptelor. cârlige/utilizareWizardForm.ts este mai degrabă tăiat decât șters: tests /submitWizard.test.ts imports FreshWizardData de ea și trebuie să rămână verde și needitate, astfel încât fișierul păstrează că un export (și INITIAL DATA de care are nevoie) și scade orice altceva care nu mai are un apelant. Două remedieri de corectitudine găsite în revizuire înainte de cabluri componentele câmpului în sus: - CreateOrgForm's onChange is now preferentially stabil through rends (requestScan read through) un ref în loc de o utilizareCallback dependență) într-o rețea de dependență effect, și cerereScan propria identitate se schimbă pe fiecare brand completat scanare, care ar fi re-ar fi re-focat ambele efecte pe fiecare scanare mai degrabă decât numai pe schimbări reale de intrare. - DropZone ia un prop cu handicap real (tabIndex=-1, manipulatori paziti, cu handicap nativ la dosar buton de intrare și de rezervă) în loc de a se baza doar pe un strămoș pointer-evenimente-nici unul, care nu face nimic pentru activarea tastaturii; fir prin sloturi logo BrandFields ," astfel încât un formular blocat de fapt blochează utilizatorii de tastatură prea. /Rețea/creare?proaspete=1 devine simplă /rețea/creare în FirstOrgCta.tsx și rețea/page.tsx: forma de o singură pagină începe de la inițialăCreateOrgFields () pe fiecare munte, mai degrabă decât restaurarea unui SesiuneStorage proiect, astfel încât param nu are nimic de făcut.

  17. · kamo-internal

    Grupuri de teren reutilizabile și previzualizarea live brand

    Extrage intrările din BranchTypeStep, BasicsStep, LogoStep, ColorsStep, AppsStep and AgeRestrictionsPas în cinci componente controlate ale câmpului (OrgTypePicker, IdentityFields, BrandFields, ApppSwitches, ComplianceFields) că ambele / rețea / crea-ca-o pagină și widget-ul launchpad pot reda, lasand in urma incadrarea pasului (header, buton saritura, navigare). Adaugă OrgBrandPreview, un brand in miniatura condus de previewPalette (), care verifică orice culoare autorizată de creator înainte de a atinge un stil atribut și cade înapoi la variabilele CSS platforma. Câmpuri de identitate și OrgTypePicker au fost ajustate la mijlocul sarcinii pentru Aterizare suplimentară. paralel: OrgTypePicker capturează acum subdomeniu subdomeniu subdomeniu al orgului părinte context alături de tipul de sucursală, și IdentityFields consultă webAliasPossible() în loc de re-conducere, oferind calea web-alias numai atunci când este cu adevărat disponibil. Sarcina 8 a echipei ************* plan.

  18. · kamo-internal

    Noțiuni de bază început butonul Wizard de configurare cu o frontieră atenție

    Adaugă punctul de intrare al launchpad-ului în vrajitorul de configurare: un proprietar-numai, drepturi-gated pilulă care citește "Getting Started Configuration Wizard (x/9 pași complet) ," plasat Prima dată în rândul pastilelor înaintea Widget-urilor mele. Returnează nul până când proprietarul org + dreptul + încărcat-summary + nu-finite poarta rezolva, astfel încât să nu clipește pentru un proprietar al cărui Organizația a terminat deja configurarea. Granița poartă un conic-gradient continuu Sheen plus o box-umbre respirație în propria organizație -- culoare-primar, și nu mai animează (în timp ce stau vizibil cu două tonuri) sub preferi-reduce-motion.

  19. · kamo-internal

    Noțiuni de bază expert model pas și client

    Adaugă modelul pas-client (app/lib/orgSetupWizard.ts), un API subțire client pentru GET/PUT/DELETE /api/security/org-setup-wizard (app/lib/orgSetupWizardApi.ts) şi utilizareaOrgSetupWizard Pagina vrăjitor și butonul de lansare va construi atât pe. Logica pura traieste în aplicație/lib mai degrabă decât lângă pagină deoarece aplicații/setări/** și App/hooks/** nu sunt incluse în lista de autorizare Vitest. isWizardFinished este decis numai de serverul completatAt zăvor, nu numărând pașii completați, astfel încât butonul launchpad rămâne plecat pentru o organizație care a terminat deja chiar și după ce lista de pași crește. normaliza Sumar este total peste intrare necunoscut și picături pas chei Clientul nu recunoaşte. utilizareOrgSetupWizard păstrează este cunoscută.

  20. · SecurityService

    Adăugați servicii de progres și obiective în spatele expertului Getting Start

    Org-scoped GET/PUT/DELETE under /api/security/org-setup-wizard track which of the nouă Noțiuni de bază pașii de pornire o organizație a finalizat. O citire nu creează un rând, și completatAt este un set de blocare stocate o dată când ultimul pas remarcabil aterizează - supraviețuiește atât ne-completarea un pas și lista de pas în creștere mai târziu, astfel încât o organizație terminat butonul de lansare nu reapare niciodată.

  21. · kamo-internal

    Panoul maximizat măreşte în conversaţia pe care ai ales-o

    Comutarea conversațiilor în vizualizarea maximizată a fost un ghiont 8px și o decolorare 180ms Destul de aproape de nimic încât geamul să arate ca şi cum ar fi fost pur şi simplu revopsit. Acum citeste ca ajunge undeva: conversatia vine de la 6% sub marime cu o creştere scurtă şi aterizează în geam, opacă devreme, aşa că este lizibilă în timp ce este încă în mișcare, pe o curbă care petrece cea mai mare parte a călătoriei sale în față și apoi se stabilește. Forma este dictată de baraca Z mai degrabă decât ales. Faceți clic pe un rând navigator focalizează noua fereastră, astfel încât intrarea este pictată Peste ieşire, şi care decide Ambele jumătăţi: - Intrarea poate creşte în geam, dar nu trece niciodată. Învelişul maximizat este o element fix dimensiunea viewport și nimic aici pini documentul Deversare, astfel încât o sosire care depaseste 1 vopsele în afara televizoare. - Ieşirea deţine toată mărimea şi dispare. În timp ce intrarea este încă sub-scale nu acoperă geamul și de ieșire este singurul lucru din spatele ea, atât de micsorare, încât ar deschide o margine de fundal în jurul unei ferestre MAXIMIZED o pâlpâire, nu adâncime. Este liber să se estompeze deoarece intrare este opac peste ea cu mult înainte să dispară. Această regulă de acoperire este aritmetică, nu gust, deci este un test: estompa trebuie E mai bine decât cei care vin. Încă doi pini constrângerile care sunt invizibile până când acestea pauză își retrage rolul și, în caz contrar, l-ar redirecționa la mijlocul zborului. Mişcarea redusă păstrează Pur şi simplu. Întâmplător, rezolvă un lucru mai mic: sosirea era de 200 ms într-o fază de 180 ms, Aşa că i s-a dat ţinta până la 20 ms.

  22. · kamo-internal

    Widget-uri cu trei coloane și dimensiuni minime per widget

    WidgetWidth Widgetth la 1 declara minWidth/minHeight. widgetMinSize (definiție) convertește într-o podea PaneSize (sau nulă atunci când nimic nu este declarat), oferind ambele axe un etaj chiar și atunci când numai unul este declarat etaje la propria dimensiune implicită. Fire care podea din registru prin fiecare consumator care dimensiuni sau redimensionează un geam: utilizează dimensiuneaHomePanesOf/setSize, dragul lui PaneChrome ȘI tastatură redimensiona căi (toate cele trei clemă apeluri), SortabilCard, acasă pagina sortate-grid widget read site-ul, și setările-pagină aspect Previzualizare. Trupa de widget în pagină. tsx este neatins intentionat întotdeauna redă la WidgetDefaultSize și niciodată nu citește stocate preferințele, astfel încât un implicit declarat satisface deja propriul etaj. Nici un widget în registru declară lățimea 3 sau un minim încă; care este munca mai târziu. Acest lucru lărgeşte doar vocabularul şi leagă maşina.

  23. · kamo-internal

    Atingeți un logo urmărit manual și descărcați fișierul convertit

    Patru lucruri pe convertorul raster-to-vector și slotul logo simplu. Barul de pergament al opţiunilor raster este de trei ori mai larg. teren pe, și regulile au fost doar webkit-ul, astfel încât Firefox nu a avut niciodată un bar stilat, la toate PergamentWidth/scrollbarColor poartă acum aceeași intenție acolo. **O sursă care are deja un fundal transparent este lăsată în pace.** Picurătorul de ochi folosit pentru a returna cu bucurie o culoare pentru un pixel transparent: o panza premultiplicat alfa, astfel fiecare dintre ele citește înapoi ca (0,0, 0), și cules unul a spus conducta fundal era negru. Apoi a şters părţile întunecate ale logo-ului. Faceți clic pe transparență acum Aşa spune în loc să aleg. Fixarea de potrivire server-side este în vector service. **O baghetă și o perie, fiecare putând adăuga sau elimina.** Eliminarea automată face două lucruri greşite. de multe ori suficient pentru a avea nevoie de argumentarea cu: un fundal care se scurge într-o parte închisă a design, și o bucată de design care împărtășește culoarea fundalului și merge cu ea. ă bagheta ia o întreagă regiune contiguă într-un singur clic; pensula ia tot ce este târât peste. Fiecare operațiune se rezolvă împotriva culturii ORIGINAL, niciodată curentul tăiat-out. Asta este ceea ce face "+" posibil la toate pentru a găsi, dar originalul are încă culoarea. De asemenea, face ca operaţiunile să poată fi redate, aşa că Nudging o setare după re-run-uri îndepărtarea fără a arunca corecțiile. Editează vopsea local pentru feedback instant; numai rezultatul stabilit trece firul, și numai alfa Masca, ca un PNG 8 biți gri de câteva sute de octeți. **Un buton de descărcare lângă logo-ul simplu**, astfel încât membrul poate păstra SVG convertorul produs dintr-o găleată nu se pot uita. Extensia vine de la sniffing octeți, nu denumire stocată: acel slot scrie fiecare încărcare pe un logo fix. tasta svg indiferent de tip, așa tema.kamocrm.com servește PNG bytes dintr-un nume .svg pentru orice org care a stabilit un logo înainte de aceasta convertorul exista. Adus într-o pată mai degrabă decât legate, pentru că o origine încrucișată În loc să-l salvați, nu se va lua în considerare și ar deschide fișierul.

  24. · kamo-internal

    Set de câmp de o pagină și implicitele care înlocuiesc etapele retrase

    CreateOrgFields este ceea ce noua pagină / formă de rețea/creare de fapt întreabă pentru: un tip de ramură, nume, alias, întrerupătoarele aplicației și o mână opțională câmpuri. toWizardFormData completează tot ceea ce a folosit vrăjitorul în 12 paşi colecta, dar această pagină nu arată, folosind exact ceea ce sărind peste fiecare dintre cele pașii utilizați pentru a trimite (bindPhone/bindEmail adevărat, contact/etichete goale, filigran FULL, brand sources COMPANY) astfel încât un org creat aici este imposibil de distins de la Unul a făcut vechiul mod de cineva care a completat doar ceea ce era necesar. cuBranchType păstrează, de asemenea, părinteAliasId indicat la o opțiune selectată model oferă de fapt (ROOT prima dată când este permis, altfel primul personalizat al modelului alias) Nu a văzut niciodată foc, și fără un echivalent aici crea blocuri OrgReadyness pentru totdeauna pe un câmp această pagină nu cere despre orice tip de ramură a cărui opțiunea părinte este ROOT.

  25. · kamo-shared-library

    Creați drepturile mele widget Free Org și Noțiuni de bază expert progres

    Adaugă RoleRightType 288-292 (CREATE FREE ORG WIDGET și cele patru ADDED/OPȚIONAL/ Copii politici obligatorii/mobile), atârnaţi de CREATE CHILD ORG (131). Adaugă OrgSetupWizardStep, enum-ul de nouă paşi care susţine configurarea de pornire Vrăjitorul, şi *************** cartografierea org setup wizard progress table from Task 2. De asemenea, actualizări RoleRightHierarchyTest a fixat forma taxonomiei (278/205/35/38 -> 283/210/36/37): CREATE CHILD ORG a fost o rădăcină independentă și câștigă primul său copil aici, mutându-l în rădăcini Cu găleată de copii, potrivirea acestui fișier Convenția stabilită de înregistrare a fiecărui transport de widget în acest test.

  26. · kamo-internal

    Dimensiunea minimă per-pană, aplicată pe citire și pe drag

    Threads an opţional ajutor redimension-delta, precum și cele două funcții de citire / scriere preferințe în model de geam de lansare pur. Înapoi compatibil: fiecare apelant existent omite argumentul şi păstrează comportamentul de astăzi, deoarece clemăPaneSize cade Înapoi la toată reţeaua. se furnizează minimum per-pană. Podeaua este aplicata pe result valoarea magazinului lui PaneSize, nu numai in Manipulatorii de dragon, deci preferinţele unui membru înregistrate înainte ca un geam să aibă minim (sau înainte de a fi ridicat) devine tras înapoi pe citire.

  27. · SecurityService

    Pune un buget în timp real pe retrimite-verificare

    Obiectivul final nu a avut nicio limită. *** ecranul de înregistrare cerut înainte de a permite butonul de resend nu a fost niciodată citit aici cerere corp este de trei domenii de JSON și nimic pe server cautat o sarcină utilă postarea direct la acest URL a fost deja nelimitat. VerificareResendRateLimiter inlocuieste cu un buget serverul detine: a 60s racire luate ca un singur SET NX astfel încât replicile de curse nu pot ambele câștig, 5/oră și 15/zi pe adresă și 20/oră pe IP public. Verificat Inainte de org si cautare utilizator si tastati pe adresa submisa, deci a sonda costă bugetul dacă există sau nu contul și 429 nu să devină oracolul de existenţă a contului că obiectivul final este atent "dacă aceasta există "răspuns pentru a evita. Fereastra IP este omisă pentru o adresă non-publică: nedeterminată nu trebuie colaps într-o singură cheie comună pentru fiecare înregistrat. Redis-backed deoarece Acest serviciu rulează replici, și nu se deschide pe o pană Redis. O respingere răspunde 429 cu Retry-După și retryAfterSeconds, astfel încât ecranul poate conta în jos împotriva acestui ceas mai degrabă decât ghici în sine.

  28. · InitializerService

    Creați org setup wizard progress pentru expertul Start

  29. · kamo-internal

    Anul de org stabilit este opțional, și face nesetat ca absent

    Nimic pe server nu a cerut-o vreodată. Coloana este nulabilă. parser hărţi o valoare goală pentru nul, şi patchOrganization aplica numai cheile un organism PUT menţionează, aşa că "ani Est": nul este un deliberat clar. Singura poartă era Acest vrăjitor validează baza, care a blocat întregul pas de bază până la un an. a fost ales. O mulțime de clienți reali nu au nici un răspuns (un nou LLC, un fill divizie în mijlocul anului, oricine care pur și simplu nu știe), astfel încât poarta doar le-a învățat să inventează una. Aruncă-l; câmpul păstrează eticheta fără asterisc și câștigă același "Opţional." FieldHint fiecare alt câmp opţional de pe treaptă are deja. Repara motivul pentru care nimeni nu a observat că câmpul era deja anulat: Org DTO parsed yearEst cu un gol *************** şi coerciție rulează ÎNAINTE de opționalitate, astfel încât numărul (null) === 0 și fiecare org fără a anul a sosit ca fondat în anul zero. A rămas invizibilă pentru că afişează site-uri de paza pe adevar si 0 este fals primul site care a verificat Preproces nul și "" înapoi la nedefinite, normaliza la fel în organizație. de la JSON, și lărgiți Reţeaua/tema DTO pentru a admite nul care de fapt ajunge. Cele două site-uri de afișare care au utilizat Falsy-și redă este ceea ce ar fi pictat un 0 gol în sertar. ă setările formează acum traseele de salvare prin parseYearEst, astfel încât o cutie goală curăță valoarea pe scop mai degrabă decât prin JSON.stringify transformarea NaN în nul.

  30. · kamo-internal

    Arată unui membru doar filele care sunt ale lor pentru a vedea

    Trei suprafeţe de setare a membrilor au fost deschise oamenilor nu pot însemna nimic Pentru. Fiecare poartă este pe TIPUL MEMBRU sau pe aplicațiile orgului, niciodată la checkRight Description POATE VERIFICA ALTE MEMBRI RUP cu drepturi care nu au nicio legătură cu Subiectul *************** printre ei). a luaMemberType () implicit pentru "MINTE," astfel încât fiecare dintre ele nu reușește închis într-o sesiune a cărui tip nu a rezolvat încă. Planuri și facturi: numai membrii echipei. Planul, abonamentele, facturile, metodele de plată și sediul sunt toate ale întreprinderii; un membru simplu nu deţine niciuna, aşa că fila le arăta banii companiei. Gate pe VĂZĂTOR, astfel încât un proprietar de deschidere pagina altcuiva păstrează administrativ calea. Cardul /setarea este poarta la fel nu va face este mai rău decât nici un card, exact ca comisiile lângă ea. Ringtones & Alerte: poartă cu aceeași condiție ca pictograma telefonică NavTop, care este acum o funcție (hasPhoneAccess) mai degrabă decât două copii ale aceleiași &&. Subtab-ul nu este altceva decât configuraţia telefonului pe care pictograma îl deschide care ton de apel, care dispozitiv, cât de tare controale înmânate care nu pot schimba nimic din ce vor auzi vreodată. Audio, Video iar sunetele evenimentului sunt neatinse: acestea sunt dispozitivele de întâlnire și propriile aplicații Sunete de notificare, pe care le are fiecare membru. Legal & Compliance: membrii echipei și o org cu aplicațiile Docs și HR. În loc să conecteze noile condiţii, ele se pliază în aplicaţiile legaleBadgeTo, pe care butonul de semnătură NavTop și furnizorul de conte în spatele insignei deja Împărţim. Acest buton este un link direct la această filă, astfel încât o a patra copie a condiţie ar lăsa să trăiască mai mult decât propria destinaţie şi picătură membru pe lor profil cu nici o explicație; furnizorul merge liniștit cu aceeași condiție în loc de a deține un abonament STOMP și un sondaj de 60 de secunde pentru un număr care este 0 prin construcție.

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