Jurnal de schimbări
Ce e nou.
Fiecare îmbunătățire a platformei, pe măsură ce se livrează.
· InitializerService
Dă un membru al echipei un manager
Adaugă MANAGER ID la membru echipă membru, o autoreferință nulă pentru raportare linie. Nimic nu este umplut: nici un manager este un răspuns complet, ambele în partea de sus a Graficul și pentru oricine pur și simplu neatribuit. DROP DEFAULT este declarația portantă, nu ADD COLUMN creează coloana mai întâi. O coloană alăturată Membrului, al cărui ID este INT8 DEFAULT unic rowid(), moștenește acest implicit, cu excepția cazului în care entitatea pini coloanaDefiniție, care ar marca fiecare rând existent cu un ID manager aleator. Orfanul și auto-referință matura ID-uri clare că o coloană implicită ar fi deja scris.
· InitializerService
Adaugă DEPTS.PARENT DEPT ID pentru departamentele cu cuiburi
Nulable cu nici un backfill - nul înseamnă nivel superior, care este ceea ce fiecare existent Departamentul a fost şi majoritatea vor rămâne. Declarat UUID simplu cu un DEFAULT DROP explicit. Cheia de la departamente UUID DEFAULT gen random uid(), și o coloană FK care moșteneşte că implicit devine ştampilat cu un părinte aleator pe fiecare rând existent, orfan toate acestea şi care nu reușește constrângerea care urmează.
· SecurityService
Fir departamentul mamă prin crearea și actualizarea
DepartmentService ia acum cererea DTO în loc de opt argumente poziţionale, asa ca parintele se alatura mai degraba incarcatura decat sa devina o noua intr-un rand de acelasi tip siruri de caractere. Org cercetează criteriile de evaluare mutante este neschimbată; chiria proprie părintelui Verificați viețile în serviciu alături de paznicul de ciclu.
· kamo-internal
Desenează departamente ca un grafic org cu un culegător părinte
Fila de departamente a fost o listă plană, astfel încât o org cu Operations > Customer Success > La bord n-avea cum să spună asta şi n-avea cum să-l vadă. Add/edit devine un departament părinte selectat, plasat cu numele deoarece creșterea copilului este mai degrabă structurale decât operaționale. Oferă copacului în ordine şi dezactivări departamentul în sine plus totul sub ea - acestea sunt exact alegerile serverul respinge, și oferind o alegere care eșuează întotdeauna este mai rău decât oferindu-l. Lista devine o coloană vertebrală org-chart. O coloană de cale ferată pe nivel, fiecare exact o pictogramă cip larg, astfel încât cotul unui rând aterizează pe centrul cipului părintelui său în loc de aproape Acesta; o cale ferată ultimul copil se oprește la colț mai degrabă decât rulează pe, care este ceea ce face ca capătul unei ramuri să fie vizibil fără a număra liniuţele. Celulele nu au pe verticală Padding -- șinele trebuie să atingă ambele margini sau linia se rupe la fiecare rând. Adâncimea citeste prin nuanta si greutatea de tip, nu dimensiunea chip, deoarece chips-uri uniforme sunt ceea ce face geometria șinei exacte. Antetele de coloană devin Labels Operator pe o bară îngheţată, înlocuirea hardcoded blue-50/indigo-50/gray-900 care a ignorat marca token. Clădirea copacilor locuieşte în DepartmentTree.ts aşa că cazurile ciudate trebuie să fie undeva. testate: un părinte eliminat de sub un copil redă mai degrabă la nivel superior decât dispariţie, şi un ciclu care a ajuns la masă face în loc să atârne pagina. Salvări eșuate raportează acum propria explicație a serverului. Corpul 4xx a fost aruncat. în favoarea liniei de stare, care s-ar fi transformat "un departament nu poate fi al său părinte în "Cerere rea.".
· kamo-shared-library
Lasă un departament să stea sub un departament părintesc
Departamentele au fost o listă plană, astfel încât o diagramă org cu Operations > Customer Success > La bord n-avea cum să spună asta. Departamentul câştigă o autoreferinţă opţională părinte; nul încă înseamnă nivel superior, care este ceea ce fiecare rând existent rămâne. Coloana FK pini coloanăDefiniție = "UUID." Stânga, Hibernate copii Definiția cheii primare menționate -- UUID DEFAULT gen random uid() -- pe FK, astfel încât un ddl-auto rula peste o populație de timbre DEPTS fiecare rând cu un părinte aleator Nu se potrivesc nici un departament și CONTRAINT ADD care urmează nu reușește. Sarcina părintească este validată în serviciu, nu doar cel care alege: cicluri (mersul pe jos de la părintele propus nu trebuie să ajungă la departament fiind mutat), un părinte într-o altă organizație, și un ID necunoscut sunt toate refuzate. Ştergerea unui departament îşi promovează copiii mai degrabă propriului părinte decât Le bloca în spatele unui indicator atârnând. ******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** argumente de poziție, care este ceea ce a făcut adăugarea a noua valoare de evitare.
· kamo-internal
Crește câmpurile To/Cc/Bcc la trei rânduri, apoi derulează
Câmpurile de primire din fereastra de unelte compus au fost un singur rând no wrap care a trebuit să fie târât lateral pentru a citi, și fereastra este 360px larg și nu redimensionabil, astfel încât o treime Adresa era deja ascunsă. Acum se înfăşoară: câmpul creşte la rând ca chips-uri umple lățimea, se oprește la trei rânduri, și suluri vertical trecut care cu un subțire Pergament. Adăugând un cip urmează intrarea în jos astfel încât îngrijirea rămâne vizibilă. Capac rând este un pixel max-înălțime, calculat de la înălțimea măsurată cip astfel încât întotdeauna tăieturi pe o limită rând Eticheta și butonul de contact pin la primul rând mai degrabă decât plutind în mijloc unui bloc de trei rânduri. Drops the now- Meaningless .
· kamo-internal
Face creație org supraviețuitoare, și oferă fiecare opțiune de branding în față
Vrăjitorul ar putea eșua un client în moduri nimic pe ecran explicat, și a cerut un fracţiune din ceea ce Setări → Comportament & Etichetare expune. Fiabilitate creație: - Logo și upload-uri de fundal a mers la /api/imagine/upload cu assocType "ORG LOGO" ImageAssocType constant, pe un obiectiv al cărui assocType este un ordinar numeric. Parser Înghițit eșecul și le-a depus ca MY DOCS, astfel încât branding în tăcere nu a existat niciodată. Ei acum să utilizeze obiectivele reale de branding org, un apel pe slot logo. - Telefonul/emailul creatorului ar putea fi doar 403: acest obiectiv necesită sesiune-org egal org membrilor, iar sesiunea este încă pe părintele. Mutat pe crea sarcina utilă. - Avertizare post-creare au fost colectate, trecut la / setup / dns ca un param interogare, și citit de Nimic. /setup/dns acum le redă. - Submit nu a fost niciodata re-validat, asa ca de compensare numele dupa atingerea Revizuire creat un org cu un titlu NULL și alias. - derivăConfigType citește intervalele de vârstă ALOCATE tipului de sucursală în locul celei selectate, Ştampilarea KIDS CLUB pe afaceri pentru adulţi - Variantele de culoare nu au fost niciodată derivate, intrările telefonice au fost nelegate împotriva VARCHAR(20), un vechi vârsta 403'd la depunere, și un domeniu luat a ieșit la suprafață ca un gol 500. Comportament & Etichetare site, e-mail de contact companie, identitate alb-etichetă, toate cele șapte profiluri sociale, opt etichete personalizate cu steagurile lor moștenite de la părinți, limba implicită și moneda, privat-org vizibilitate, filigran de fundal, cele trei selectoare de mărci-sursa, și toate cele patru sloturi logo. Doi pași noi (Labels, Preferințe); fusul orar trece la preferințe alături de frații săi. Toate acestea se bazează pe crearea de sarcină utilă, nu apeluri de urmărire: PATT /org/ {id} / ramura-titlu are aceeași sesiune-org verifica care a rupt actualizarea membru, și o tranzacție înseamnă răspunsurile fie tot pământul, fie niciunul. Indrumare si saritura: Fiecare intrare a ajutat textul bazat pe ceea ce face de fapt valoarea. Numai tipul și elementele de bază transporta Câmpuri necesare, iar acest lucru este declarat acum pe antetul de pas, în stepper, pe bara de nav, și în bara laterală De asemenea: setări nu mai distruge extensii de telefon org pe salvare, /api/generate-background este nu mai mult un proxy facturabil neautentificat, și proxy-org-by-ID încetează să corupă ID-uri int64.
· kamo-internal
Trimite butonul din spate al editorului de unde a venit membrul
Editorul de tapet era o fundătură, nu era cale de ieşire decât calea ferată. Ambele intrări puncte (cipul de top-bar acasă și header scurtătură profil membru) acum ștampila originea lor pe href, și editorul rezolvă că într-o pastila Back în rândul sprânceană: acasă se întoarce la bord, un profil se întoarce la membru A cui pagină a fost, folosind id-ul ştampilat mai degrabă decât presupunând că este Proprietarul tapetului. Un URL gol fără ştampilă se întoarce la profilul acestui membru. Find este verificat împotriva formei opac-id astfel încât un URL artizanal nu poate transforma buton într-o redirecționare arbitrară. Citirea ei are nevoie de SearchParams, deci pagina câștigă limita de suspans de care are nevoie Router-ul aplicației.
· kamo-internal
Arată o căsuță poștală primară sub numele de profil al membrului
O căsuţă poştală ţinută ca primar al cuiva este adresa acelei persoane, sugerând-o ca "Salles Desk" numele căsuţei poştale în locul persoanei. Rândul automat complet și destinatarul Ambii au citit acelaşi câmp, aşa că amândoi au greşit împreună. Directorul ia acum numele primar de membru înaintea afişajului cutiei poştale, și a atribuit numele de membru pentru o cutie poștală personală, al cărui singur asignat este al său Proprietar. Aliasurile și cutiile poștale partajate nu aparțin nimănui în mod special și păstrează propriul lor nume. Preferința este o listă pe sursă, astfel încât un suport care nu are Încă expediat câmpul pur și simplu cade înapoi la AfișareName.
· EmailService
Nume o cutie poștală primară după membrul care o deține
O cutie poştală pe care cineva o deţine ca primar este adresa acelei persoane, aşa că... prezentarea acesteia sub orice etichetă a cutiei poştale la ora de furnizare "Sales Desk" pentru o cutie care este pur și simplu Jane Doe's să compună automat şi pe cardul de primire. lista de cutii de mail poartă acum *************** pentru membrul cu atribuirea primară, pe care directorul de adrese org o preferă peste Afişajul personal al cutiei poştale. Doar principalul titular conteaza: o cutie postala cineva doar are acces la nu este al lor și păstrează propriul nume, și setările Tabelul încă redă afişarea Numelui oricum. Rezoluţia numelui se mută din serviciul Accessible MailboxService într-un ajutor comun Astfel, cele două suprafeţe nu pot fi de acord cu ceea ce se numeşte un membru.
· kamo-internal
Înregistrați paginile de comision în pagina de configurare și aterizare
Filele au existat, dar nimic legat de ele. - Nu. este exemplul prudent deja în acest repo: o pagină reală fără card, fără filă și nici o intrare navigabilă, accesibilă numai prin tastarea URL-ului. Contabilitatea și finanțele sunt propria secțiune și propriul subiect de navigare mai degrabă decât două mai multe intrări în contul meu. Subopţiunile nu poartă nici o poartă proprie, aşa că pliază astea. în ar fi forțat poarta de cont deschis la titularii de finanțare numai și le-a arătat patru link-uri pe care nu le pot folosi, acelaşi raţionament care împiedică conformitatea fi subiectul de securitate. Cu filele financiare în propria lor secțiune, Contul meu Poarta se întoarce la CONFIGURE SISTEM singur. Cardul personal al Comisiei este condiţionat ca privitorul să fie membru al echipei, oglindind propria poartă a filei. Un card care deschide o filă care nu va fi randată este Mai rău decât nici o carte.
· kamo-internal
Fila comisiilor membre și cele două file de cont financiar
Fila membru (numai pe cont propriu, membrii echipei): sold + registru, comandat oportunităţi, aranjamente de plată şi retrageri. Câştiguri din setări conturi Organizaţie Stripe and Commission Processor. Fila de membru este poartă pe isSelf și membru TIP, niciodată pe un dreapta. checkRight se întoarce adevărat pentru tot în mod activ Dumnezeu, și pagina lui POATE VERIFICA ALTE MEMBRI RUP cu drepturi nelegate, inclusiv O poartă dreaptă ar arăta una. soldul membrilor și detaliile bancare pentru oricine deține oricare dintre ele. "My Payouts," nu "My Bank." Membrii aproape niciodată nu au un cont Stripe și nu pot atașați unul dacă o fac: OAuth read write refuză conturile controlate de altul platforma. Platforma angajatorului lor creează un cont de plată numai pentru beneficiari și îşi verifică identitatea. Panoul spune ce colecţionează Stripe, că Stripe are nici o relație de sprijin cu ei, și că banii ia aproximativ 6-8 zile calendaristice pentru a ajunge - nici unul dintre acestea ar trebui să descopere după aceea. Organization Stripe este o listă de verificare ghidată, nu un formular, pentru că Stripe nu are API pentru a deveni o platformă Connect. Pasul 6 are mai degrabă un avertisment complet decât un indiciu: un org al cărui sold de dungi plătește automat pierde float comision înainte de a executa de locuri de muncă de eliberare, și fiecare transfer nu reușește apoi pentru fonduri insuficiente cu nici un eveniment Stripe să-l explice. Banii sunt o zecimală STRING end to end and is never Number ()-ed except to alege a culoare. Sumele negative sunt reale - un comision anulat devine o extragere - și codebase nu a avut nici o convenție pentru a arăta unul, astfel încât acestea să redă în ton eroare cu un minus explicit și un cip Draw. Sincronizare sub-tabe la ?sub=; SetăriView deține ?tab= și o rescrie la fiecare schimbare filă. Ruta BFF există deoarece serviciul Comisiei este exclusiv ClusterIP - fără ea întreaga caracteristică 404 în timp ce fiecare serviciu este sănătos și fiecare clădire este verde.
· kamo-internal
Dosare puteți acționa pe, mail puteți selecta
Faceţi clic dreapta pe orice dosar pentru acţiunile sale. antetul meniului nu este cromat se numește dosarul și arată live necitit/total, așa că Mark toate citite și Dosarul gol poate fi judecat înainte ca acestea să fie click mai degrabă decât după. Acţiunile care nu pot fi aplicate sunt demonstrate ca fiind cu handicap (nimic necitite, folder gol, built-in foldere păstra numele lor) în loc de a fi Goliți și ștergeți ruta printr-o confirmare construită pentru cromul de mail. Catalogul MUI de confirmare a aplicației necesită un cuvânt de provocare tipat fiecare timp; o provocare privind o acțiune recuperabilă antrenează numai persoanele să tasteze prin avertismente. Deci poarta e rezervată celor doi care distrug corespondenţa. pur și simplu consecinţă exact: orice altceva se mută la gunoi şi spune aşa. Dosare reordonate de drag, pe membru, stocate în UI-preferences comune masa astfel încât aranjamentul le urmează pe dispozitive. Ordinul este unul lista plană a numelor de dosare: frații sunt comparați doar între ei; astfel încât o listă comandă fiecare nivel, și un dosar care devine redenumit sau mutat cade înapoi la poziția sa naturală în loc de a corupe un copac. Picături la nivele diferite sunt ignorate Nici un fel. Selectarea mail-ului funcţionează acum modul în care selecţia funcţionează oriunde altundeva: comuta-clic pentru o gamă de la ancoră, cmd/ctrl-click pentru a alege unul, şi avatarul se transformă într-o cutie de checkbox pe hover mai degrabă decât impozitarea fiecare rând cu o coloană de checkbox permanentă. Acţiunile merg într-un bar care pluteşte peste listă și pleacă cu selecția, în loc de o bandă lipită în cromul care a împins lista pe fiecare căpuşă. De asemenea: Managing Folders footer este plecat poziția creează deja foldere CSS nu a putut face acest lucru pe cont propriu: într-un rând flex se rezolvă dimensiunea principală înainte de aliniere-self:stretch oferă elementul înălțimea sa, astfel încât aspectul pătrat a avut nici o înălțime pentru a obține o lățime de la. Acesta măsoară rândul în schimb.
· EmailService
Acţionează pe un dosar întreg, nu doar pe pagina pe care ai defilat-o
Marchează toate dosarele citite și goale sunt operațiuni la nivel de dosar clientul nu se poate exprima prin loting uids: ea deține doar vreodată pagina are defilat, astfel încât un dosar cu 4000 necitite ar lua 80 excursii rotunde și Încă mai lipseşte tot ce nu s-a încărcat. FolderManager câștigă setFolderSeen și golFolder. Calea IMAP se răstoarnă steaguri într-un apel de pe server și numai atinge mesaje care de fapt nu sunt de acord cu starea țintă serverul are deja și face fiecare client conectat resync pentru nimic. Graficul nu are echivalent în vrac, astfel încât se plimbă folderul și PPATCHes; filtrul se micşorează aşa cum merge, aşa că reciteste prima pagină în loc de paging cu $skip, care ar pas peste elemente lotul anterior doar Flipped din setul rezultat. Tavanul său de matura este înregistrat, niciodată tăcut. Golirea ţine gunoiul special: gunoiul este eliminat pe bune, toate celelalte Dosarul îşi mută conţinutul în gunoi şi rămâne de recuperat. DELETA graficului Deja se comportă aşa, aşa că nu există nume special acolo. Ambele Finalurile returnează câte mesaje s-au mişcat, astfel încât UI pot spune "marcat 240 citeste de la "nimic de facut" si publica doar un eveniment de schimbare cand Ceva chiar s-a schimbat.
· SecurityService
Releu orientat spre browser pentru caracteristica de comision
Rezolvă sesiunea, autorizează și relee la Serviciul Comisiei cu org și membru ştampilat de la acea sesiune nu de la nimic apelant trimis. Acest lucru este Singurele drepturi sunt verificate: SecurityService ruleaza orice Cerere ().PermitAll() cu manual-rulat pe manual auth, astfel încât un obiectiv care uită cecul său nu OPEN și este accesibil prin releul API public. Trei drepturi mai degrabă decât unul, astfel încât separarea sarcinilor este expresibilă: cu un singur Grant, oricine emite un comision ar putea elibera, de asemenea, plata și anula Ţineţi-l că există pentru a-i prinde. Acţiuni de mutare a banilor şi de destinare a plăţilor, refolosiţi cu greu sub imitaţie. Imperformation ments a full session as a arbitrare member, so without that reject un zeu admin ar putea intra ca cineva, punctul de plăți la propria bancă, se retrag, și Anulează cala. Proprietarul organizației este un titular implicit. Un nou drept este acordat nimeni în ziua în care se desfăşoară Astfel, fără o ramură a proprietarului, navele latente şi inaccesibile. /me/opportunities is served here in loc de releed, because SecurityService owns modelul de oportunități; înregistrarea acestor depozite și în serviciul Comisiei Ar da un model comun doi scriitori. Uneşte rândurile împărţite ale membrilor. cu rezervele în cazul în care acestea sunt agentul principal, pentru că agentul propriu comision produce nici un rând împărțit și o interogare verificarea doar o parte ascunde în tăcere Jumătate din câştigurile unui membru.
· kamo-shared-library
Găsiți comisionul unui membru împărțit pentru propria lor vedere comisioane
Org-scoped mai degrabă decât tastat numai pe membru: ORG ID este duplicat pe aceasta Masa astfel încât un rând nu poate fi citit cross-tenant prin ID, și un finder care a ignorat ar anula în liniște asta. Doar jumătate din "opportunităţile pe care le câştig" la agentul primar și nu produce nici un rând împărțit la toate, astfel încât apelanții trebuie să unească acest lucru cu propriile rezerve ale agentului. Documentat pe metoda astfel încât urmatorul apelant nu trimite un punct de vedere care ascunde în tăcere jumătate din câștigurile unui membru.
· kamo-internal
Asigurați-membru suprafață o rețea de date kamo reală
Pachetele membrilor au fost o listă de carduri cu nici o mișcare, care nu este modul în care restul De kamo looks. Aceasta este acum casa AG Grid: în așteptare și finalizate sub-tab-uri sincronizat cu ?sub, server-side paging end to end (page/size/status ajunge la DocsService mai degrabă decât felierea unui capac de 200 de rânduri), umplerea geamului în loc de dimensionare la rândurile sale, și nici un titlu Starea este citită dintr-o privire mai degrabă decât ca un chip gri: o dată scadentă poartă propria sa urgenţa şi aşteptarea şi schimbarea conţinutului sunt stări lizibile în loc de Cele ascunse. Moţiunea este reţinută şi poartă pe utilizareRedusMotion.
· kamo-internal
Arată numele membrului fără prefixul "Bună,"
· DocsService
Paginare pe server pentru listarea membrilor
Suprafaţa membru cerut MAX SIZE necondiţionat şi feliat rezultatul în browser-ul, astfel încât o grilă care a arătat o pagină a descărcat deja un întreg istoric de angajare pentru a-l construi. Ambele cititori membri iau acum pagina / dimensiunea și listarea paginilor în baza de date. Spec.status (un enum) devine Spec.status (un set) și parametrul de sârmă rămâne Acum acceptă un CSV. Acesta este punctul: grila de membru solicită un BUCKET și un filtru cu o singură valoare nu se poate exprima fără trei călătorii dus-întors per pagina. Un simbol parses la un set de un element, astfel încât rețeaua HR există status=Excuted is byte-identical on the wire and needed no change client. An Token necunoscut într-o listă este un 400 de nume de jeton, niciodată o picătură tăcut filtru: o rețea de conformitate care pretinde a fi filtrat în timp ce arată totul este cel mai rău rezultat disponibil. clemPage/clampSize sunt expuse astfel încât cititorii membri clemă prin regula SAME ca grilă HR în loc de a trece MAX SIZE literalmente, care este modul în care un "paginat" Obiectivul final devine în linişte unul nemărginit. ListMine transmite pagina fără Re-de conducere, astfel încât clema există o dată. Autorizaţia este neatinsă şi testele o fixează: criteriile finale ale membrilor rămân pe membruGuarded() + LegalAsignmentOwnnership, HR finals stay on pazad() + LegalPackageAccess, și cele trei noi @RequestParams sunt declarate ca fiind exact status/pagină/dimensiune Pe ea se numeşte o persoană. Nici o schimbare schema. Nicio entitate nouă. mvn -o test: 391 teste, 0 eșecuri, 0 erori (a fost 379).
· kamo-internal
Cardul de notificare prin e-mail personal înlocuiește fila Notificări
Ambele comutatoare se mișcă pe profilul meu în aceeași formă ca și cartea de parolă: o carte, o tigla pictogramă și să ajute textul pe rând, și un inset colorate care apare doar atunci când sunt ore liniștite. Fără antet Editare buton Cardul duce cu unde merge e-mail, pentru că este parte membrii greșesc: anunțurile sunt trimis la adresa de pe contul lor de UTILIZATOR, care numele de card, și niciodată la cutia poștală acest organizaţia le-a atribuit o cutie poştală pe care ar trebui să o semneze pentru a o citi, ceea ce este foarte important. Anunțul le spune să facă. Serviciul de securitate returnează adresa numai membrului aparține, astfel încât nota cade înapoi la un formular nedenumit în cazul în care este absent. Numai membrii echipei: notificatorul servește chat intern și bilete de sprijin, ceea ce face un membru simplu Nu lucrez. În afară de asta, din moment ce ruta preferată e pe mine şi pe altcineva. Profil aceste întrerupătoare ar edita propriile ore de linişte ale adminului.
· SecurityService
Expune e-mailul de utilizator-cont pe propriul profil membru
Cardul de notificare prin e-mail personal al profilului trebuie să menţioneze adresa de mesaje omise de fapt, ajunge, și că adresa este contul de utilizator lui Cutia poştală pe care organizaţia a desemnat-o. Returnat numai atunci când sesiunea este citit propriul rând membru. O adresă personală nu este ceva un administrator ar trebui să colecteze de pe profilul unui coleg, și nici un alt apelant are un motiv să-l doresc.
· kamo-internal
Grup de permisiuni contabile și financiare și acces de drept financiar la setările contului
Grupurile de securitate și administrare a accesului au existat doar în SecurityRoleManager ca liste de nume inline, deci JobTitleManager, DepartmentManager și RoluriPermisiiTab A băgat fiecare serviciu în general. În loc să adăugaţi o a patra copie, definițiile de grup trece la permisiuneGroups.ts și toți cei patru editori le citesc. isGeneralPermission este motivul pentru care contează: filtrarea numai pe!serviceType ar face un sculptat-out dreapta de două ori, o dată în general și o dată în propria sa Sectiunea, da un set de doua comutari independente. MembruPermisiiTab este în mod deliberat neatins - lista de permisiuni generale este un hardcoded read/write/delete/admin mock, nu date reale privind drepturile. /setări/cont și secțiunea sa de debarcare recunosc acum și drepturile financiare. Un controlor care deține doar MANAGE ORG FINANȚE ar fi redirecționat altfel direct înapoi la /setări; lărgirea numai una dintre cele două ar părăsi pagina accesibil prin URL, dar invizibil în navigaţie.
· InitializerService
Migrație pentru registrul de comisioane și tabele de plată Stripe
Oglinzi com.kamo.z.shared. commission. ddl-auto ar crea aceste din Adnotări oricum; explicit DDL este convenţia casei şi este ceea ce face forma care poate fi revăzută într-un singur loc, mai degrabă decât într-o duzină de clase de entități. având în vedere Regulamentul (CE) nr. Evenimentul singur. Fiecare organizație conduce propria platformă Stripe Connect, așa ID-urile evenimentului trebuie să fie unice într-un singur cont - LOAN STRIPE WEBHOOK Events Cheile de pe ID-ul gol și este sigur doar pentru că caracteristică are un singur cont Stripe. Aplicat împotriva prod; toate cele nouă mese și fiecare garda unic verificat prezent.
· SecurityService
Seed the finance rights on every branch model's ADMINISTRATOR
Cele trei drepturi ale comisiei poarta o caracteristică care nu a existat anterior, așa NEW RIGHT SEEDS în mod deliberat nu spune nimic despre ele - că mecanismul poartă un grantul existent, astfel încât o implementare să nu aibă acces niciodată la REMOVES în tăcere și să îl utilizeze Aici le-ar fi dat bani oamenilor care nu l-au avut. Ceea ce au nevoie în schimb este un implicit de tip rol, care nu a existat. Două părţi: - șablonSeedSetting Pentru câștiguri o supraîncărcare ImplicitRoleType acordarea finanțării drepturi numai pe șabloane ADMINITRATOR. ACORDAT, NU FORCE GRANIT: o ORG să fie în măsură să revoce un drept de la un administrator asupra membrului lor profil, și Force GRANTED suprascrie fiecare strat ulterior al cascadei. - asigurarea RoleTypeTemplates creează rândul ADMINISTRATOR pentru modelele care lipsesc unul. Rândurile de rol implicit sunt leneşe, create doar atunci când cineva salvează implicit un model, și sincronizareSecurityModelRoleRights iterează că masa - așa că fără aceasta implicit s-ar aplica fiecărui model de sucursală, cu excepția celor necustomizate; În tăcere, iar acestea sunt cele mai probabil să se bazeze pe as-is.
· kamo-shared-library
Registrul de comisie al membrilor echipei și domeniul de plată Stripe
Adds com.kamo.z.shared.commission: an append-justed registre, a per-member echilibru rând care există doar pentru a seriariza retragerile concomitente, Modelul de serie/punct de linie al procesorului Comisiei și Conectarea benzilor per-org entități de plată. Trei decizii care merită respectate: - Registrul este anexat numai şi îl aplică în Java (@PreUpdate/@PreRemove arunca). @Column (updatable=fals) face doar Hibernate omite o coloană din UPDATE, nu face scrie eșua, astfel încât o corecție vechi ar arata ca şi cum ar fi reuşit. Corectările inversează rândurile. - Disponibil vs în curs este o interogare asupra EFICACE AT, nu o mașină de stat. A comision emis astăzi cu scadenţa de luna viitoare trece la disponibil pe sale Propria, astfel încât nu există nici o matura care ar putea eșua și bloca bani ca în așteptare. - COMISIA MINTE BALANCE este redundantă cu registrul prin construcție. Acesta există deoarece un sold este un agregat și SELECT PENTRU UPDATE nu poate bloca o agregate; fără un singur rând pentru a lua PESSIMISTIC SCRITE pe, două concurente ambele retrageri trec de propria verificare a suficienţei. Banii sunt NUMERIC (19,4) pe tot parcursul, org ID-uri sunt coloane simple INT8 mai degrabă decât asocieri astfel încât înregistrările financiare să trăiască mai mult decât membrii churn, și ORG ID este duplicat pe rândurile de copii, astfel încât nici un rând să nu poată citi cross-tenant. De asemenea, adaugă trei drepturi (187-189) pentru suprafața financiară. Sunt despărţiţi. separarea sarcinilor este expresibilă: cu un drept persoana care emite o comision ar putea, de asemenea, elibera plata și anula cala care există Prinde-i. serviceType este nul în mod deliberat - un nou ServiceType s-ar grupa le în mod automat, dar le redați în nici un editor, deoarece numai secțiunile de aplicații apare atunci când org are acea aplicație activată. Schema aplicat prin KamoInitializer; toate cele nouă tabele verificate prezent în prod cu toate privilegiile pentru utilizatorul aplicației kamo.
· kamo-internal
Fold MFA în cardul de parolă și picătură fila de securitate Sign-in
Două locuri au pus o întrebare alături de parola de pe My Profile, într-o carte retitulată " Parola & Multi Factor Autentificare." Fluxul de înscriere se mută din filă în ************* fără crom aşa că redă mai degrabă ca un rând decât o pagină: pastila de stare, numerotate QR/secret și pași de cod într-un singur set, şi acelaşi dialog de recuperare de nezdruncinat. Antetul cardului nu poartă nici un buton Editare acum că acesta deţine două acţiuni independente "Întoarce-te." MAE rămâne singur pentru motivul pentru care fila a fost: SecurityService's MFA finals rezolva utilizatorul din sesiunea apelantului și să ia nici un parametru de utilizator, astfel încât un admin pe profilul altcuiva ar să-şi înregistreze propriul autentificator. Modificarea parolei este mai largă (MANAGE MINTE SECURITY, Dumnezeu), așa Doar acel rând face acolo. Parola de stat se mută la ParolaSecurityCard, care stabilește o ramură moartă pe drum: cardul vechi a comparat o *tradus* parolăError împotriva literals engleză, astfel "Persoana curentă este incorectă" N-a ajuns niciodată pe câmpul ala. Eroarea îşi poartă acum câmpul.
· kamo-internal
Sugerează cutiile poştale ale orgului, pseudonimele şi cutiile poştale partajate
Destinatarul autocompletat ştia doar contacte şi adrese răzuite din Trimis dosar, astfel încât propriile adrese ale organizației A trebuit să scriu din memorie. Fanii noi GET /api/email/dosar spre cele patru surse EmailService din spate acea pagină şi returnează o listă de adrese. Agregate server-side deoarece fiecare dintre aceste apeluri consumă propria cheie o singură dată; din browser ar fi Patru tururi OTK de fiecare dată când un compozitor se deschide. Fiecare sursă se degradează pe ea proprii, astfel încât un org al cărui furnizor nu are nici o furnizare încă devine pseudonimele sale. Lista este cached în memorie și potrivire locale orgi au zeci de acestea, nu mii, și un parametru de interogare per keystroke ar pune o rețea rotund excursie în față de sugestii browser-ul poate răspunde deja. Org se potriveşte cu vopseaua. imediat în timp ce contact și Sent-folder cauta sunt încă în zbor, și ele conduc căderea: este un set mic exact, și o adresă internă care De asemenea, se află într-o carte de contact ar trebui să citească ca caseta poștală, nu cartea de contact. Editarea cutiilor poștale în Setări scade cache-ul, astfel încât o nouă adresă este sugestivă fără o reîncărcare. E-mailservice de bază-URL și ajutatorii înainte muta din catch-toate ruta astfel noua rută îşi mentează OTK-ul în acelaşi mod în loc să păstreze o a doua copie.
· kamo-internal
O vizualizare cutie poștală, și o coloană care este toate lista
Conversational / Clasic toggle este plecat și fiecare membru devine Lista clasică. Conversaţia avea propria listă, propriul fir vedere și propria suprafață API pentru un al doilea mod de citire la fel e-mail amintit pe browser. Antetul listei a mers cu el. Numele dosarului, pictograma sa, descrierea sub ea și butonul de reîmprospătare au fost șase rems de crom deasupra unei liste care a vrut înălţimea, şi arborele folder spune deja care dosar este deschis. Căutare și panoul de filtrare muta la dosar bara laterală, deasupra etichetei Dosare, astfel încât coloana listă este nimic altceva lista. Butonul de reîmprospătare se întoarce lângă comutatorul cutie poștală ca o pătrat: elemente-stretch pe rând și aspect-pătrat pe buton face Înălţimea sa urmăreşte comutatorul şi lăţimea lui îi urmăreşte înălţimea. Stă jos. Lângă cartela single-mail de asemenea, astfel încât un membru fără o scădere nu pierde reîmprospătarea. Filtrele picatura la o coloana Bara laterală 320px. Un furnizor numai SMTP nu are bara laterală a dosarului, deci acolo panoul de căutare rămâne mai degrabă deasupra listei decât să dispară. Stringurile pentru suprafeţele îndepărtate sunt curăţate din toate cele 22 de localităţi din kamo-translation-dictionary (61fdfcf, împins mai întâi). firDetaliu de la/la/cc/noContent stay .
· SecurityService
Expune e-mailul de contact în registrul de departare
Centrul de Interacţiuni are nevoie de adresa unui membru pentru a pre-umple un compozitor şi Singurul obiectiv care a avut loc a fost cel al unui singur membru. cerere pe rând vizibil. EmbEmail este încorporat pe rândul membru lista Deja se încarcă, deci servirea aici nu costă nimic şi elimină N+1.
· kamo-internal
E-mail un membru direct de la rândul lor
Docul de acțiune al rândului ar putea chat, întâlni, forma și deschide un profil lucru pe care nu a putut face a fost să înceapă un e-mail, astfel încât să ajungă la un coleg prin e-mail a însemnat părăsirea panoului, deschiderea compozitorului şi rescrierea adresei lor. Adaugă un buton de mail alături de celelalte care deschide fereastra de instrument compozitor cu membrul deja în câmpul To. Adresa merge de-a lungul în sarcina utilă by-departament (EmbEmail este pe rândul membru, astfel încât nu costă suplimentar interogare) mai degrabă decât un pachet de detalii per rând, iar poarta modul / dreapta este soluţionat o dată în NavTopPanel în loc de per rând.

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