Jurnal de schimbări
Ce e nou.
Fiecare îmbunătățire a platformei, pe măsură ce se livrează.
· kamo-internal
Cascadă, adăugaţi acţiuni în vrac, explicaţi regula
Cascada scoate în evidenţă acum călătoreşte în lanţ în loc să lumineze fiecare afectat vâsleşte imediat. Ancestorii activați sosesc deja cel mai apropiat-primul, astfel încât indexul este distanța parcursă în susul copacului și fiecare rând întârzie cu 90ms în spatele ultimului privindu-l mutându-l pe copil la bunic este ceea ce învaţă regula, care a flash-ul simultan citeşte ca o eroare. Încă instant sub preferă-redusă mișcare. Grant toate / Eliminați toate pe o ramură, afișat numai atunci când acestea ar schimba ceva. Tradus prin aplicareToggle per dreapta, mai degrabă decât scrierea setărilor direct: a acțiunea în masă nu trebuie să devină o a doua punere în aplicare a normelor privind cascadele; se îndepărtează de cel singur în drepturiHierarchy.ts. Pastila acordată/totală este acum întotdeauna pe un rând părinte, mai degrabă decât numai atunci când S-a prăbuşit, este cea mai rapidă lectură a ceea ce oferă de fapt o ramură. De asemenea, face ierarhia Heading/HierarchyBody, care angajamentul anterior adăugat dicţionarul şi apoi nu l-am folosit niciodată. Arătat doar deasupra unui grup care are de fapt cuibăritul; un banner care apare peste tot este unul care învaţă să sară. rightsTreeForest.test.ts accelerează conducerea ancorării copacului și a tipurilor de ramură % editor: un drept al cărui părinte este filtrat din grupul curent ataşat sau devine o rădăcină. Cealaltă rundă face o permisiune de acordare dispar de la editor cu nimic pentru a indica aceasta si-l este accesibil în practică, deoarece EDIT QUOTE TERMS este declarat CRM în timp ce MANage părinte QUOTES este POS.
· kamo-internal
Arată și aplică ierarhia permisiunii în toți cei cinci editori
Cinci editori au acordat 199 de drepturi ca cinci liste plate de cutii de cecuri, și nici unul dintre au arătat că un drept poate fi o condiție prealabilă pentru altul. Acordarea unui copil fără ca părintele său să arate exact ca acordarea unei permisiuni de lucru modul în care fila Legal & Compliance avea nevoie de două drepturi și nici un editor nu a putut spune acest lucru. Drepturi Copacul redă copacul: indentare cu o coloană vertebrală conector, colapsabilă ramuri, o pastila acordata/total pe ramura, cautare care tine stramosii unui meci vizibil, și o cascadă care este animat deoarece animația este ceea ce învață regula Subtree, ambele cu un toast desfacut numind exact ceea ce sa mutat. Onoare preferă mişcarea redusă. De asemenea, se oprește minciuna despre trei state editorii nu ar putea exprima: drepturile blocat de modelul de securitate al Orga, rânduri moștenite acordate-dar-inert al căror părinte este Negat, și 58 de drepturi care sunt acordate, dar poarta nimic oriunde. Un admin nu a putut anterior spune o permisiune reală de la un titular. Regulile cascadei trăiesc în app/lib/rightsHierarchy.ts, oglindită de Java Role RightType. O copie a unei reguli de securitate este o datorie, astfel încât testul parității citește sursa Java și nu reușește pe orice divergență, mai degrabă decât încredere convenție. Editorul șablonului de tip ramură primește comanda și indentarea, dar păstrează control propriu și NU auto-casadă: acestea sunt valori de forță, absolute și aplicat după fiecare nivel, astfel încât în cascadă le-ar rescrie în tăcere un deliberat Suprascrie. Relaţia părintească este încă aplicată acolo la momentul rezoluţiei. Proiectare + auditul reproductibil: documente/superputeri/Specii/
· SecurityService
Normalizarea membrilor suprascrie împotriva ierarhiei
Dreptul direct al membrilor trece acum prin RightsHierarchy. normalizează nivelul înainte de sunt persistate: un copil acordat isi trage stramosii pana la acord la membru nivel, un părinte negat împinge NUKE în suburbie acolo. Server-side mai degrabă decât încredere editor, deoarece acest obiectiv este accesibil direct. Un nivel stocat cu un copil, dar nu cu părintele său este exact ceea ce rezolvator de închidere benzi de trecere mai târziu UI a arătat ca acordat, cu nimic să-l explice. Colectat într-o hartă mai întâi astfel încât ierarhia vede întregul nivel la o dată; normalizarea intrării prin intrare ar depinde de ordinul trimis de client.
· InitializerService
Strămoșii Backfill astfel încât închiderea nu poate elimina accesul
Serviciul Aplicat pentru Drepturi Membre neagă acum orice drept al cărui lanţ părinte nu este Acordat. Fiecare rând scris înainte ca ierarhia să existe nu ştie nimic despre Strămoși, deci un rol care deține managerul SUBSCRIPtion PLANS fără ACCES COMMERCE în întregime normală până acum, ar pierde la următoarea recalculare. Peste 13 organizații vii care este o pană de curent, nu o migrare. Aduce toate cele patru niveluri (org roluri, departamente, titluri de locuri de muncă, abonamente membre) în sus la invariant căile de scris menține acum, folosind aceeași regulă: o acordat Descendentul îşi trage strămoşii până la aprobare. Pasul 2 este cel care de fapt previne pană de curent se răstoarnă în mod explicit un strămoș DEENIED la acordat, deoarece rândurile care există supraviețuiesc etapei 1 neatinse și închiderea ar revoca apoi fiecare Descendent sub ei. Modelele de securitate NU sunt atinse în mod deliberat: o forță NUKE pe un părinte este un administrator care oprește intenționat un subarbore și încheie onorarea Aceasta este caracteristica. Pasul 3 este un GATE, nu o linie de jurnal: acesta reverifică invariant și nu rulează dacă orice nivel încă deține un descendent acordat sub un strămoș nerambursat. A Migrația care a raportat succesul cu o încălcare lăsată în urmă ar preda problema pentru rezolvator, în cazul în care se suprafeţe ca un membru pierde în linişte un permisiunea cu nimic să-l explice.
· kamo-shared-library
Ierarhia părinte/copil pentru toate cele 199 de drepturi
RoleRightType a declarat un domeniu "părint" și un parent public () de ani de zile. Fiecare constantă a trecut nulă şi nimic nu l-a numit vreodată. Acest lucru se termină că schele: 135 copii, 34 rădăcini, 30 independente, adâncimea maximă 3, derivată dintr-un auditarea tuturor celor 199 de drepturi peste 15 081 fişiere sursă în cele 40 de repo. DOUĂ puncte de aplicare, iar divizarea este proiectul: normalizarea nivelului () este authoring. Acesta face ONE nivel auto-consistent Copilul isi trage stramosii la acest nivel, un parinte negat impinge NUKE jos Subtree acolo. Aplicat în rol, departament și locuri de muncă-titlu scrie căi. Deoarece fiecare nivel rămâne coerent, un titlu de locuri de muncă care acordă un copil, de asemenea, acordă Părintele ACOLO, și cascada existentă deja permite mai specific nivelul bate un departament care a negat. Nici o regulă de prioritate încrucişată nu a fost şi cascada este neatinsă. appleClosure () este Rezoluția, anexată după aplicarea TemplateReguli. Este o plasa de siguranta pentru singurele doua lucruri autor nu poate ajunge: un model de securitate Force NUKE pe un părinte (absolut, aplicat ultima, astfel încât fără aceasta un forțat-off Părintele îşi lasă copiii acordaţi) şi rânduri scrise înainte de toate acestea. Două perechi rămân deliberat PLAT deoarece separarea sarcinilor depinde de aceasta: APROBARE TIMECARD ADJUSTMENTS / FINALIZE PAY PERIODS și APROVE ORG PAYOUTS as un frate al MANAGE ORG FINANȚĂRI, mai degrabă decât copilul său ar obliga fiecare beneficiar să fie şi emitent. Proiectare: kamo-internă Nu-ţi face griji
· kamo-internal
Repictează memento-ul în culoarea orgului, deschide opțiunile sale în loc
Cardul este culoarea primară a organizației acum, cu fiecare semn pe ea tras în --la-primar, mai degrabă decât un literal alb palid primar poate redeclară că un jeton și muta întreaga carte. Chipsuri, șine şi graniţele sunt amestecate de culoare de la acelaşi jeton, astfel încât acestea să rămână lizibile nici un fel. Acţiunea principală este o pastila inversat, potrivire idiom semnarea legal Eroul foloseşte deja un buton pe o bandă colorată. Accentul a dispărut; pictograma poartă deja un fel, și un a doua culoare pe o carte colorată doar noroiat. Suprataxa este excepţia şi se răstoarnă mai degrabă decât se înroșește: culoarea roșie pe o org arbitrară este de necitit. Meniurile sale Snooze și More au fost MUI Menus, care portal la documentul și aduce un pergament cu ei. Încuietoarea aia e plină: ascunsă şi compensată Padding-dreptate pe document.corp, și padding corpul se mișcă fiecare poziție fixă element de pe pagina de Sideways momentul în care cineva a ajuns pentru Snooze, și meniul acoperit cardul aparţinea. Ambele sunt un panou de linie acum, extinderea în interiorul cardului cu Declanşatorul a fost aprins la stânga. Nici un portal, nici o blocare pergament, nimic de acoperit.
· kamo-internal
Setări juridice și de conformitate tab cu textul juridic implicit al org
O nouă filă pe /setings/fetures/hrs holding Implicit Legal Text, legată de meniul setărilor și tabla de lansare a setărilor. Crearea unui pachet privind /h/juridic-conformare începe acum de la ea, iar acest câmp este cu trei rânduri mai înalt. Corect. Pagina de setări HRS ca un întreg acum REFUZE LA RENDER fără MANAGE HRS SETTINGS mai degrabă decât numai redirecționarea: redirecționarea este un efect, așa că nu poate rula până după o redă, și fiecare filă a fost pictura Mount-time incarcatura pentru un membru care nu detine dreptul. Noua filă În plus, are nevoie de Manage LEGAL AND COMPLIANCE, ținută identică în trei locuri (pagina, link-ul meniu, carte de lansare) și fixat de un test, deoarece un link oferit la cineva pagina nu va face fila pentru deschide Furnizor Setare în schimb: ConfigurăriView rezolvă un ?tab necunoscut= pentru a indexa 0 mai degrabă decât eroare. Dialogul seminte numai implicit în timp ce autorul nu a tastat se rezolvă după ce ar putea fi deja scris. SeedDefaultAttestation is a pure ajutor astfel încât regula este testabil, și se aplică în afara actualizării de stat: Reacţionează dublu-invocă actualizări în dezvoltare, care a lăsat instantaneu însămânţat avansat și al doilea apel refuza propria schimbare. Un EDIT nu re-seeds. Pachetul poartă propria formulare și îl suprascrie ar rescrie ceea ce publicul unei versiuni publicate este cerut să fie de acord cu.
· kamo-internal
Text bogat în lipicios și previzualizări, și un mod puteți comuta
O notă spune acum dacă este text bogat sau text simplu, și atât editorul şi lipiciul plutitor îl poate schimba. Nota plutitoare în modul bogat înglobează aceeași utilizare editor /note, așa are fiecare unealtă pe care pagina completă o are îmbrăcată în culoarea ei. prin intermediul unui nou suport opţional pentru KbARTYEditor. Recuzita este aditiv: absent, editorul arata exact așa cum a făcut-o, astfel încât cunoștințele Baza e neatinsă. Bara de unelte se înfăşoară şi se derulează în loc să împingă scrie o zonă îngustă. Comutarea bogat -> simplu cere mai întâi, și spune clar că formatarea este aruncat și nu poate fi recuperat în timp ce textul este păstrat. Nu este Modul simplu ascuns nu are unde să-l pună, astfel încât conversia, de asemenea, fotografii o versiune, lăsând formatarea veche recuperabilă din istorie. Bogaţii pur şi simplu pornesc uneltele şi nu trebuie avertizaţi. Previzualizări pe cardurile de perete și jetoane de lansare arată acum real conţinut mai degrabă decât o linie aplatizată. Ei fac printr-un standalone lexicalToHtml mai degrabă decât un caz lexical montat: un perete este de zeci de cărți, și fiecare altfel ar trage în întregul editor runtime la afişează un paragraf. Această ieșire este injectat, și conținutul nota este membru autorizat și adesea lipit în, astfel încât este partea sensibilă la securitate și a fost scris test-primul javascript: și date: (inclusiv tab- și caz-obfuscate), escaladarea citezelor în interiorul href, și moștenire prime-HTML note prezentate ca text, mai degrabă decât redate. În timp ce o căutare rulează cărțile păstrează previzualizarea simplu evidențiat: Marcarea hit-ului contează mai mult mijlocul de cercetare, și nu poate evidenția redate HTML fără a reface ceea ce a fost doar serializat. De asemenea: notele plutitoare poartă fundalul configurabil al orgului filigran, acelaşi pe care îl folosesc paginile de conţinut, onorând org bgSetarea semnului de apă inclusiv NONE. Sized as a parts of the note so it deține la orice dimensiune, și un pic mai puternic decât paginile utilizate pentru că lipicios stă pe hârtie saturată mai degrabă decât aproape alb.
· KBService
Carry o notă bogat-text / mod simplu-text prin API
Creați onoruri modul solicitat și implicit la bogat, potrivire editor o notă este creat în. Actualizarea e nulă ca oricare alta. Câmp privind acest obiectiv, astfel încât un apelant trimite numai { isRichText } nu goleşte biletul. DTO citește prin esteRichTextOrDefault(), astfel încât un rând care într-un fel S-a raportat ca fiind bogat. Erring to keep formatarea este direcția sigură: opusul ar prezenta o formatare Notă ca simplu și invitați membrul să-l aplatizeze.
· InitializerService
Adaugă coloana is rich text, implicită și backfilled la bogată
Dacă o notă este editată ca text bogat sau text simplu nu poate fi citit înapoi din conținutul său: o notă bogată nimeni nu a formatat încă este octe-for-byte Una simplă. Fără o coloană editorul pierde bara de instrumente de fiecare dată Biletul este redeschis. TRUE implicit, care este, de asemenea, ceea ce permite YugabyteDB adăuga coloana la a Masa care are deja rânduri. TRUE în mod specific pentru că fiecare notă scrisă înainte de a exista coloana a fost autor în editorul bogat a fost Doar editorul era acolo, astfel încât backfilling la FALSE ar arăta formatat note ca simplu și oferă să le aplatizeze. @Order(0) pentru motivul obișnuit: momentul partajat-lib cartografiază coloana; fiecare alergător care încarcă o notă o SELECTEAZĂ, astfel încât o migrare târziu nu este niciodată Atins. Vapoare cu apărătoare în derivă acest pachet folosește numele entității, în loc să-l reafirme, și a fost verificat prin rupere Numele şi vederea eşuează. Aplicat împotriva Yugabyte: coloana prezentă ca Boolean implicit adevărat, toate rândurile existente backfuld to true, no NULLs.
· kamo-shared-library
O notă înregistrează dacă este bogat text sau text simplu
Modul nu poate fi derivat din conținut. O notă bogată a membrului nu formatate încă serializes byte-for-byte identic cu unul simplu ambele sunt un document lexical de paragrafe nestilate Pentru a-l păstra, editorul îşi pierde bara de unelte de fiecare dată când biletul este redeschis. Implicite la bogat, iar coloana este backfulled to TRUE, deoarece fiecare notă care precede steagul a fost scris în editorul bogat; a fost singurul Una era. Reumplerea la FALSE va prezenta note formatate ca simple şi invită-l pe membru să-i aplatizeze. Nullable intentioned, with isRichTextOrDefault() reading a un unset flag as Bogat: un rând care cumva scapa de backfill ar trebui sa greseasca spre pastrarea formatarea, nu aruncarea ei.
· kamo-internal
O pagină pentru notificări și controale asupra acestora
Pagina de notificări a purtat un antet de propria butoane pilula în interiorul unui card de frontieră browser, fiecare ecran de setări) este introdus de către erou gradient brand cu un Săgeată din spate şi un bar sub el. Se citea ca în altă parte în produs. Acesta Acum poartă aceeași antet, cu numărătoare necitită ca subtitrare și cele două acțiuni care funcționează pe lista ca butoane albe eroului. Sub ea, două file: Notificări și Setări. Configurările sunt cele care folosit pentru a fi o filă pe propriul profil al membrului la /setings/member/{id}?tab= notificări care pun controalele asupra notificărilor pe un ecran diferit din notificări ei înșiși menţionat celălalt. Un membru care deschide clopotul pentru că nu se va opri este acum deja pe pagina care o poate opri. NOTIFICARE TABS, astfel încât bara și suprafețele care se leagă adânc în ea nu poate aluneca pe o valoare care alege nimic. Ambele suprafeţe care au legătură cu vechea locaţie (acţiunea Setări pentru puntea prăjită, propriul buton Setări al paginii, acum o filă) mergeți la NOTIFICation SETTINGS HREF. An vechi semn de carte a URL-ului membru încă rezolvă prima fila pentru o Copia Quick Tips care atârna de pe tab-ul vechi (setări.notări.help.*) este nu a fost preluat: sertarul de ajutor este un SetăriView. Niciuna. Cheile sunt lăsate în dicţionar mai degrabă decât frecate.
· DocsService
GET/PATCH textul legal implicit al orgului
/api/docs/legale/setări, în spatele aceleiași pâlnii păzite () ca oricare alta cartografiere pe acest controler. Citirea NU creează un rând: se rezolvă la LegalDefaults atunci când orga are Niciuna. Asta ţine sămânţa editorului de pachete să nu aibă efecte secundare. acopera organizatiile create dupa semintele KamoInitializer fugit S-a materializat la prima salvare, unde aparţine un scris. Setul corect este în mod deliberat mai larg decât obiectivele finale ale pachetului." Acest obiectiv este atinsă din fila privind setările juridice și de conformitate (MANAGE HRS SETTINGS) și de la editorul de pachete (MANAGE LEGAL AND COMPLIANCE); fie numai dreptul 403 un ecran pe un câmp pe care îl deţine. Sigur de lărgit pentru că este un șir de nivel de org a cazanului pini că lărgirea nu ajunge lista / crea / audiență-previzualizare. PATCH semantics: un câmp absent este neatins, un șir gol este un deliberat Liber. Publică deja refuză o atestare în alb, astfel încât numai un implicit șters îl face pe autor să-şi scrie propriul lor autor.
· InitializerService
Seed fiecare organizație un text legal implicit
Un hr legal settings rând per org, unic pe org id, transportă Nu-ţi face griji. Inserat-ONLY, niciodată un actualizat. O org care și-a editat propria formulare o deține; o rescriere tăcută a propoziţiei poporului său este solicitată legal ar fi cel mai rău comportament posibil pentru acest șir de caractere. Şi asta înseamnă Idepotentul alergător. Orgi create DUPĂ aceste rulaje sunt acoperite de DocsServiciul citit toamna mai degrabă decât prin furnizarea de org, astfel încât o cale viitoare de aprovizionare care a uitat Apelul nu poate trimite un org al cărui text legal implicit este gol. Ambele declarații retry 40001: o aruncare de la un CommandLineRunner anulează întregul iniţializatorul şi sare peste fiecare alergător comandat după el.
· kamo-shared-library
Textul juridic implicit la nivel de Org
LegalSettings este un rând pe organizație care poartă formularea unui NOU legal Pachetul începe cu. Este un DEFAULT, niciodată o referință live: crearea unui Pachetul copiaza textul, si publicarea ingheata acea copie pe o versiune, asa ca Editarea aici nu poate modifica un pachet care există sau cineva are deja Am fost de acord. LegalDefaults deține formularea platformei într-un singur loc. KamoInitializer Seminte, DocsService citit refren și câmpul de setări toate se leagă de ea trei literali ar pluti și orgi fiecare parte a migrației ar atunci nu sunt de acord cu privire la ceea ce este implicit.
· kamo-internal
Istoria devine o pagină, iar clopotul sună
Clopotul a deschis un popover, care este forma potrivită pentru "ce s-a întâmplat" şi cel greşit pentru "ce a spus acel memento marţi." Un panou agățat de un bara de unelte nu poate fi paginată, nu poate fi filtrată fără aglomerare, și închide atunci când faceți clic pe orice Nimic altceva. Totul deja citit a fost, în practică, plecat. Ăsta e un sărac. proprietatea pentru înregistrarea a ceea ce cererea a spus cuiva. /Notificare este acest record. Este mai degrabă o cronologie decât o listă, deoarece notificările sunt evenimente și întrebarea pe care un membru o aduce este aproape întotdeauna "când": o coloană vertebrală de zile cu notificările agățat de pe ea, fiecare punct în propria culoare, astfel încât o lună de istorie citește ca benzi înainte de un singur Cuvântul este citit. Rândurile necitite poartă pământul şi le citesc pe cele care poartă doar punctul, care este diferenţa scanată. Calea ferată filtru îngustează ceea ce coloana vertebrală deține mai degrabă decât reordonarea ea un număr împotriva fiecăruia. Gruparea de zi este mai degrabă conştientă de calendar decât de ore scurse: la jumătatea anului La miezul nopții, ceva de acum patru ore sa întâmplat ieri, și "acum 4h" nu este ceea ce o persoană care o caută va scana. Tot ce serverul nu a putut data este ținut și grupat separat, unde nu poate pretinde o zi în care nu poate aparține. Clopotul este acum o legătură, insignat ca celelalte două semne de atenție în bar așa Toţi trei citesc la fel. Ceea ce diferă este mișcarea, și în mod deliberat: o documente remarcabile și un ceas care rulează sunt stări, și ei pulsa un inel care spune "încă adevărat." O notificare necitită este un eveniment, și ce face un clopot atunci când Un eveniment se întâmplă este inel. Aşa că se leagănă, a lovit o dată şi s-a aşezat, amplitudinea jumătate → 9° → 6° → 3° → 1,5°, pivotând la coroană pentru că un clopot atârnă şi apoi se odihneşte patru secunde. Un clopot care nu s-ar opri ar fi o alarmă, Şi contele de lângă el spune deja că chestia asta persistă.
· EmailService
O istorie paginată, filtrabilă
Centrul ar putea răspunde la o întrebare: cea mai recentă sută, necitită sau nu, fără nici o cale de a cere ceea ce fusese deja citit. Deci, orice un membru a văzut a fost, în practică, plecat Cererea a spus cuiva. GET /api/notificări / pagini de navigare, raportează totalul, contează fiecare tip pentru o filtra șină, și ia un statut de toate, necitite sau citite. Lista existentă rămâne Așa cum a fost: umple puntea live, care vrea cele mai noi puține și nimic altceva. Construit din predicate mai degrabă decât o interogare per combinație de filtre; și în mod deliberat nu de la (:kind IS NULL SAU ...) a făcut fiecare căutare calendar 500, și un predicat omis nu poate face asta.
· kamo-shared-library
Fie ca istoria să fie interogată prin specificaţii
Filtrați istoricul navigabil în funcție de natură și dacă a fost sau nu o notificare să citească și să combine liber o întrebare plină de (:kind IS NULL SAU N. kind =: kind). Al doilea este ceea ce a făcut fiecare căutare calendar răspuns 500: un parametru nul soseşte netipat şi PostgreSQL refuză declaraţia. O specificație Omite prezicerile mai degrabă decât să treacă un nul, astfel încât vina nu se poate repeta aici.
· kamo-internal
Reconstruiește /notes ca un perete de hârtie cu un editor de pană
Pagina a fost ultimul ecran încă pe albastru gri-600/gray-50 brut în timp ce Totul în jurul ei sa mutat la sistemul de case, și fiecare dintre sale ~100 Acesta a ignorat, de asemenea, - Accent-cunoaștere," semnul de accent rezervat pentru exact Acest modul. Refacere în jurul metaforei datele deja poartă: paleta este post-it prin construcție, astfel încât notele să redă ca hârtie înclinat per-id determinist care se îndreaptă pe hover, un cap pin pe fixat notiţe în biletul lui. O notă necolorată primeşte hârtie simplă mai degrabă decât rezolvaStickyColor () lui lamaie toamna, care ar altfel picta tot peretele galben și petrece paleta înainte de membru ales Orice. Bandele urmează tipul activ în loc de a fi fixate, astfel încât numai un separator costă spaţiu când spune ceva adevărat: recreere sub un fel de dată, iniţiale sub un fel de titlu, frecvenţă deschisă sub un fel de număr de vizualizări. De asemenea, adaugă: o paletă de comandă ( ceasuri și statistici de perete, multi-selectate cu acțiuni de schimb și în vrac; tastatură nav (/ în propria formă a zidului, și stări separate goale vs nu-rezultate. Editorul deschide acum lângă perete pe un separator dragable mai degrabă decât inlocuirea paginii, si este tastata de nota ID, asa ca schimbarea notelor o reseteaza. Filtrarea, sortarea, bandarea, echilibrarea zidăriei și geometria hârtiei app/lib/noteWall.ts în spatele a 48 de teste unitare. Conținutul bazat pe noteCard Parser este plecat CreațiElement, astfel încât o notă a cărui conținutPlain a fost anulat pe salvează a făcut nici o previzualizare la toate server-side. Elimină NOTĂ SORT OPŢIONS, care a expediat etichete de tip hard-codate în limba engleză în toate cele 22 de localuri.
· kamo-internal
Pin și unpin o notă din lipicioase sale plutitoare
Lipicios ar putea recolora, redenumi, minimiza, maximiza și închide o notă, dar nu-l pini, deci pinning a însemnat merge înapoi la /notes pentru un singur lucru Nota este deja în fața ta pentru. Prinderea este o proprietate a biletului mai degrabă decât a lipicios, astfel încât comuta scrie direct la bilet și înapoi prin cache-ul comun. Asta este. ce-l face să aterizeze peste tot în acelaşi timp: lista de note şi notele fixate banda de pe placa de lansare acasă (în cazul în care acesta rămâne ascuns până când lipicios este închis, ca înainte). Optimist, și pune pin înapoi în cazul în care scrie nu. Reutilizează componentele.notes.card.pin / .unpin și aceeași pictogramă a editorului Un ac înseamnă un singur lucru pe toate cele trei suprafeţe. Fără noi sfori.
· kamo-internal
O fereastră liniştită de ore, care reglementează ambele canale de notificare
Erau doi. Perechea de lângă partea de sus a paginii a redus la tăcere cardurile în aplicație; Perechea de jos a redus la tăcere mesajele pierdute. Nimic pe ecran nu a spus au fost lucruri diferite, astfel încât un membru stabilirea ore liniștite a trebuit să observe al doilea set a existat și a stabilit prea Ei au umplut deja în seara, a fost greșit. Fereastra de sus este acum singura, și scrie ambele. Sunt depozitate. prin diferite servicii e-mail ore pe Ui-preference MediaService citește de două ori, ceea ce este exact instalaţia de care un membru nu ar trebui să ştie niciodată. Cele două magazine sunt reconciliate o dată, pe sarcină, deoarece un membru poate ajunge cu un Fereastra pe o parte şi nu pe cealaltă. Oricare este setat câștigă: o fereastră de e-mail este adoptată atunci când partea din aplicație nu are nici unul, astfel încât nimeni nu configurat este aruncat În caz contrar, fereastra în aplicație este împinsă spre exterior astfel încât un singur control pe Ecranul spune adevărul despre ambele canale. Preferința de e-mail este deținută de panou acum mai degrabă decât de propria secțiune. Două componente debouncing scrie la aceeași cheie stocate ar cursa și ar putea persistă o jumătate de formă, și MediaService citește un câmp absent ca un implicit membru nu a ales niciodată.
· kamo-internal
Două sensuri de 100% o lățime de lectură, și întregul panou
Procentul de resetare la o bază de referință: pagina a crescut la vedere, dar a acoperit la 920px, care pe un monitor larg lasă foaia plutitoare într-o mulțime de Birou gol. Acest capac este în mod deliberat o pagină de scrisoare întinsă peste o Spectacolul de 34 inch este un document mai rău, nu unul mai mare, deoarece ochiul nu poate urmări o linie atât de lungă Citind printuri fine sau lucrând o formă densă, vor spaţiul pe care îl au. Deci, există acum două, și un comuta în pick-uri capsule care: pagina lățimea lizibilă, plafonat la 920. La ce se deschide geamul. lățimea umple geamul, mai puțin un șanț 24px astfel încât umbra foii nu este Clipped against the edge and the page reads as seted as quether decât tăiat. Ele sunt un MOD, nu două opriri pe scara de zoom, deoarece acestea sunt intenţii diferite mai degrabă decât magnificări diferite. Zoom multiplis oricare ar fi linia de bază este activă, astfel încât citirea rămâne onest cu privire la cel este un multiplu de, și + / − încă de lucru de la oricare. Comutarea LANDS de bază pe ea "Fit to wide" that a lăsat un zoom de 250% aplicat pe partea de sus nu s-ar potrivi nimic, iar membrul a cerut o lățime, nu un multiplicator de unul. Comutatorul este un buton cu PRESIUNE SE FACE mai degrabă decât ceea ce este în prezent pe: "Fit to Withth" în pagina modul, "Resetați vizualizarea" în modul lățime. Ambele chei au existat deja și sunt fără gol în toate cele 22 de localităţi. maxPageWidthPentru a acoperi marginile în încercări: un ecran NaN de măsurare cade înapoi la capacul lizibil, mai degrabă decât ajunge la PdfPages ca maxPageWidth și nimic, și un geam prăbușit nu se întoarce o lățime prea mică Citeşte. Un test acuri faptul că pe un geam mai îngust decât capacul cele două modurile converg spre interiorul jgheabului Design în jurul valorii.
· kamo-internal
Reîmprospătează ceasul NavTop în momentul în care editorul salvează
Viteză pumn un membru este în prezent cronometrat sub le lasă deja OFF server-side: RosterService.clockState citește cele mai recente pumn Live și skips Rânduri anulate, astfel încât nici un ceas-out este scris și nu este nevoie. Un SHIFT out aici ar fi mai rău decât inutil SHIFT IN ar pereche cu a fost doar anulat, astfel încât aterizează ca un orfan și ridică excepția lipsă-punch editorul există pentru a șterge. Ceea ce a fost de fapt greșit a fost indicatorul. Sondează la etajul 60 cu nr. semnal de la editor, așa că după ștergerea intrării au fost cronometrate sub membrul a privit cromul spunând că sunt pe ceas. Editorul anunță acum o salvare care a scris ceva și controlul re-citește. Concediat de la care sa oprit la jumătatea drumului încă a schimbat recordul, și că este cazul în care o Insigna veche este cel mai greu de observat. Evenimentul poartă membrul editatId deoarece ceasul NavTop este egocentric (fetchMyClockState ia nici un membru id) în timp ce același editor este utilizat de HR împotriva altor membri la /hr/attendance. Ar trebuiRefreshClock Pentru comparare ca STRINGS și refuză un număr, din motivul parseClockState oferă deja: id-urile sunt valori unice rowid () care depăşesc MAX SAFE INTEGER și doi membri pot rotunji la acelaşi număr. Nu repară browser-ul celuilalt membru atunci când HR editează cardul lor Cronometrul. Ora.
· kamo-internal
Zoom documentul, și apuca-l să-l mute
O capsulă plutitoare în partea de jos-dreapta a panoului de documente: −, curent procentul, +. READOUT ESTE RESETUL un al treilea control pentru ceva ce membrul vrea doar o dată ce pot deja Vezi că nu sunt 100%, şi unde caută să verifice este numărul. Este un buton real cu o etichetă, astfel încât tastatura și cititorii ecranului ajunge la ea. 100% înseamnă FIT-TO-PANE, nu dimensiunea reală. scala PdfPages deja calculează, iar punctul de vedere al membrului a început în ceea ce Adică atunci când apasă "100%." Etapele sunt multiplicative (x1,25), nu ±0,25: o etapă fixă este un sfert din pagină la 100% și o a șaisprezecea parte din ea la 400%, astfel încât zoom înapoi de departe în ar lua o duzină de prese. ă matematica este în app/lib/pdfZoom.ts cu teste, inclusiv că + apoi − întoarce Exact unde ai fost și că un NaN cade înapoi pentru a se potrivi mai degrabă decât ajungând la PdfPages ca la scară = naturalScale * NaN şi arată exact ca documentul care nu se încarcă. Trage la PAN, oriunde nu este ceva ce operezi. UtilizațiDragToPan scrie defilareLeft/scrollTop mai degrabă decât transformarea conținutului, astfel încât moșteneşte bordurile containerului, barele de defilare şi comportamentul roţilor gratuit și axa orizontală pur și simplu nu face nimic până când pagina este mai largă decât Panou, fără nici o condiție oriunde să spun așa. Refuză să înceapă. intrare, textarea, selectați, buton, a[href], etichetă, [rol=radiogrup] și rest: acestea sunt cutiile de semnătură, câmpurile de text și grupurile de căsuțe de cecuri Câmpul interactiv redă butoanele capsulei de zoom. Indicatorul este capturat pe drum în jos astfel încât un drag care lasă panoul ține de urmărire şi încă se termină curat. Doar gura. Atingeți deja pan-uri nativ cu impuls și cauciuc-banding că nici un handler aici se poate reproduce, și deturnarea ar face document mai rău pe dispozitivele în cazul în care glisarea este gestul natural. Un aranjament fix vine cu aceasta: PdfPages centre pagini cu ECHILAŢI pe ambele părţi Ajunge. Zooming trecut lățimea ferestrei ar fi pus marja stângă a fiecare pagina permanent la îndemână. Învelișul de pagini crește acum la cel mai mare pagină ( Cearceaf rămâne în interiorul zonei defilabile.
· kamo-internal
Note cretate pe tabla de lansare, rotirea culorilor și o trimitere corespunzătoare
Trei lucruri. Notele pinned ajung la placa de lansare. Fiecare notă prins pe /notes devine o chip acolo in propria culoare lipicios, cu o scurta previzualizare; click pe unul Îl ridică pe suprapus şi un colţ de control îl deschide complet. În schimb, editorul pentru lucrurile pe care un lipicios nu le poate face. O notă care este Flotarea continuă este lăsată pe ecranul membrilor, și listarea ar oferi aceeași notă de două ori, aceeași regulă care face /notes card merge inert. Închiderea lipicioasa pune cipul înapoi. Trupa face doar atunci când opțiunea note a supraviețuit propria poartă a navei, așa că Nu decide nimic despre acces pe cont propriu, și preferă suprapunerea lui copie cache a unei note astfel încât un cip nu prezintă un titlu sau culoare de la înainte A fost ridicat. Notiţele noi se rotesc prin paleta. Fiecare se deschide pe culoare după cea mai recentă notă a membrului CREAT, ambalaj la sfârșitul anului, astfel încât un perete de lipiciuri nu este niciodată un bloc de galben identic. Am şters notiţele ei înşişi mai degrabă decât un contor stocat, aşa că rămâne chiar peste dispozitive și sesiuni cu nimic suplimentar pentru a persista; un nesetat sau nerecunoscut culoarea anterioară reporneşte rotaţia în loc să ghicească. Închizând un bilet, acum îl mototoleşte. Un ritm de anticipare, apoi scrunches, se rotește și cade, lăsând un puf de resturi de hârtie în propria culoare peste spaţiul lăsat. Resturile sunt redate de strat, nu Notă: un copil moștenește transformarea de ieșire a biletului și se va micșora cu ea în loc să explodeze spre exterior, astfel încât nota mâinile peste ultima dreptunghi și culoare pe cale de ieșire. O nota maximizata izbucneste peste viewport întreg mai degrabă decât dimensiunea ar restabili până la; un minim una nu se sparge deloc, care nu are spațiu pe ecran pentru a exploda peste; și Prefera-reduce-motion devine o paletă simplă, fără resturi. Scatter este un haşiş determinist, nu math.random, care ar re-rula fiecare remiză şi Enervează resturile la mijlocul zborului.
· kamo-internal
Setări de notificare pe toată lățimea, cu un model de lucru
A fost o coloană 760px de rânduri de comutare, care se citește ca un formular pentru a completa mai degrabă decât ceva pentru a tona şi pe un ecran larg stânga două treimi din pagina gol în timp ce lista de tipuri de notificare a fugit de pe partea de jos. Adevărata întrebare a paginii nu este "care sunt setările mele," ci "cât de greu este acest lucru cerere permis să mă întrerupi," așa că acum se deschide prin a răspunde că într-o propoziţie asamblată din valorile live desktop, în afara orelor liniștite și dă lățimea celor patru decizii în spatele ei: pe care căi, unde vor ateriza, când vor sta liniştiţi şi ce este merită spus despre. Piesa centrală este o scenă: viewport-ul propriu al aplicației în miniatură, pictată în jetoanele intunecate ale puntii de notificare in timp ce pagina din jurul ei ramane lumina, pentru ca că este contrastul exact o notificare reală face atunci când ajunge peste o ecran de lucru. Colțul este ales făcând clic pe colț, iar cardul Arcuri mai degrabă decât tăiere, astfel încât controlul și consecințele sale sunt una gest. Patru cvadrante bat o picătură aici: alegerea este spațială, și Cuvintele "jos dreapta" sunt o hartă mai proastă a unui ecran decât o imagine a unuia. În afară de asta, Arată-mi ridică o notificare reală în puntea reală la membrii propriul sunet, colț și timpul de concediere. O pagină de setări pentru notificări ar trebui să fi capabil de a vă arăta o notificare, și o batjocură ar fi o imagine de o singură PreviewToast pune o carte de aruncat prin puntea reală, scris nimic, publicarea nimic, și nu ajunge niciodată la centru. Genul a devenit gresie în cazul în care întreaga tigla este comutatorul, mai degrabă decât rânduri cu a 34px comuta la dreapta departe, și secțiunea de e-mail a adoptat propriul panou Rânduri, astfel încât se citește ca parte a paginii mai degrabă decât o carte care rătăcit în. Nu-nu-tulburare apare acum o dată. Acesta a fost în banda rezumat și din nou în carte liniștită Trăieşte cu rezumatul, Care este lucrul pe care îl schimbă; cardul liniștit este lăsat la tipul programat.
· kamo-internal
Notificările devin o filă pe profilul propriu al membrului
Ei au fost o pagină proprie la /setări/notificări, care a pus o preferință despre o persoană undeva, alta decât pagina despre acea persoană și a plecat switch-uri de e-mail omise pe fila de profil, astfel încât cele două jumătăți ale "cum mi se spune lucruri" a trăit pe diferite ecrane. Ambele sunt aici acum, pe - Da. Comutatoarele de e-mail păstrează comportamentul lor exact Me-scoped traseu, aceeași debușă și keenalive culoare și sunt retractate cu Sectiunea si randurile primitive ale comisiei de notificare, astfel incat acestea sa citeasca ca parte din ea Mai degrabă decât ca o carte care rătăcit în. Ei rămân o secţiune distinctă şi spun: acest canal ajunge la tine atunci când aplicația este închisă, este scris de o serviciu diferit, și păstrează propriile ore liniștite. Folding cele două seturi de ore într-un singur control ar schimba în tăcere ceea ce unul dintre ei guvernează. Tabula este numai de sine, pentru că fiecare preferință din spatele ei este citit și scris prin intermediul me-scoped rute Telespectatorul apare pentru a le edita pe ale lor. Aduce adresa contului. în loc să-l ia din fila de profil: setări tab-uri monta una la a timp, astfel încât o valoare ridicată de la un frate ar fi lipsește exact atunci când un membru a deschis această filă mai întâi, care dintr-un link de Setări de notificare este de fiecare dată. Traseul vechi este plecat, împreună cu setări-meniu subiect, și cele trei suprafețe care legat de ea construi acum calea printr-un ajutor în trei locuri este o rută care în cele din urmă nu este de acord cu ea însăși.
· kamo-internal
Semnează un pachet la /setări/semne, pe o rută proprie
Semnarea a fost inline pe fila de profil a membrului, astfel încât documentul așezat sub setări fila bandă ȘI banda de conformitate sub-tab și că fila de ajutor panou fiind rugat să citească, și două antete. Este acum *************** Pagina moșteneşte NavTop şi NavPri ca orice alt ecran și trupa de erou vrăjitor este singurul header. Terminarea sau plecarea se întoarce la E o nebunie. a venit de la, pe găleată pachetul a fost în. Lista navigheaza cu ecran, astfel încât browser înapoi trebuie să vină înapoi la lista. Allowlist a trebuit să se mişte cu ea. În cazul în care se utilizează o metodă de testare, se utilizează o metodă de testare pentru a verifica dacă se utilizează o metodă de testare de testare. prefix-se potrivesc și neagă în mod implicit, și este ceea ce un membru al cărui Locurile de muncă s-au încheiat. Fără să se stabilească/semne pe ea, a Fostul angajat ar putea deschide lista lor de pachete și să fie returnate direct înapoi să-l de către TwirtMethershipGuard momentul în care au făcut clic într-o singură redirecționarea buclei pe suprafața exactă pe care există nivelul respectiv pentru a rămâne accesibil; Deoarece confirmările de conformitate sunt unul dintre cele două lucruri pe care le protejează. startswith: Nici o poartă pe pagina în sine, în mod deliberat. Un membru care îşi execută propriul membru contract de muncă nu deține nici un drept HR și niciodată nu va ELIBERATE LA EI şi fiecare obiectiv din spatele ei este auto-scopizat în DocsService (Atribuirea legalăOwnership, nu pachet juridicAccess), astfel încât sesiunea decide A cui misiune este şi a altcuiva răspunde 404. Un /settings / semn cu nici o misiune se întoarce pe listă mai degrabă decât raportarea unei erori: nu este nimic pe pagina fara unul si nici o cale pentru membrul să-l furnizeze acolo. Un uid malformat arată eroarea, pentru că Ar ascunde o legătură proastă cineva este pe cale să trimită din nou.
· kamo-internal
Amintiți-vă dimensiunea și poziția fiecărei note plutitoare pe dispozitiv
Redeschizând o notă detaşată, acum o pune înapoi exact unde a fost lăsată. dimensiunea a fost la stânga, pe acel ecran. Plasarea este pe dispozitiv, în mod deliberat. Care note sunt plutitoare este un proprietatea membrului și rămâne server-side în UI-preferences, așa că le urmează peste tot; în cazul în care o notă SITS este o proprietate a ecranului în față de ei, și un aspect care se potriveste unui 27" desktop este greșit pe o Laptop. Deci, plasamentele trăiesc în Storage locale, domeniu de aplicare de membru, deoarece unul browserul este un singur dispozitiv, dar poate fi mai mult de o persoană. Plasamente supravieţui lipicioase în scop de închidere o notă păstrează sale geometrie, care este întregul punct și evacuează locul cel mai puțin recent mai întâi și o notă care se elimină (sau 404 la restaurare) dă fanta imediat. Două lucruri pe care trebuia să le îndreptăm: - logout face un en-gros localStorage.clear(), care ar fi scăzut structura fiecărui semn-out. Acum capturează şi restabileşte această cheie la fel cum o face deja pentru ascunzătoarea cu legături adânci. Notă id-uri și Doar coordonatele, niciodată conţinut. - hidratarea așteaptă ID-ul membru în loc de rulare la Mount. Locurile sunt membre-scoped, astfel încât restaurarea înainte de a ști cine este ar ignora în tăcere aspectul acestui dispozitiv și cad înapoi la geometria dispozitivului încrucişat. Precedenta la restaurare este plasarea acestui dispozitiv, altfel oricare ar fi preferinţe încrucişate transportate ultima dată la un layout sănătos mai degrabă decât la o asietă și fie un fel este re-clamped la actualul punct de vedere.
· kamo-internal
De plumb pe un apel înapoi este citit, nu amintite și un apel poate fi redeschis
Două lucruri, ambele despre un eveniment calendar fiind un loc slab pentru a păstra o copie a recordul altcuiva. Dialogul evenimentului citeşte acum rezultatul de la CRM. Numele său, numărul de apel, e-mail, cel mai bun timp pentru a apela apelul înapoi id evenimentul deja magazine. Ceea ce nu face este să arate o copie înghețat în momentul în care apelul a fost rezervat, care este ceea ce descrierea utilizată pentru transporta și ceea ce ar fi spus în liniște un membru să sune un număr nimeni nu a avut a răspuns în săptămâni. Descrierea este acum propria notă a membrului și nimic altfel, care nu poate fi vechi pentru că nu a fost niciodată o copie a nimic. Şi un apel în aşteptare poate fi deschis de pe prima pagină. Faceți clic pe unul redeschide același eveniment calendar în același dialog, astfel încât locul un membru merge să se uite la o Apelul promis este locul unde îl pot muta. Salvarea trece prin Serviciul de Securitate mai degrabă decât API calendar, pentru că apelul de înregistrare și evenimentul sunt două vederi de o promisiune și numai serviciul care deține ambele le poate muta împreună Chemarea este o amintire asupra căreia nu citeşte nimeni. Rândul în sine este de control; butoanele rezolva lângă ea opriți clic, așa Nimeni nu marchează un apel contactat în timp ce vrea să-l citească.

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