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

    Arată ce ar costa oprirea eșuării

    kamo.entitlement.fail-deschis acordă orice aplicație pe care matricea planului nu o menționează niciodată. Este documentat ca o supapa temporara pentru catalogul backfill Matricea este însămânțată dar nimic nu ar putea răspunde la întrebarea care decide dacă Oprirea este sigură: pe care chiriașii le dețin pe care le aplică numai din cauza acesteia. Flipping-l orb ar fi luat aplicații departe de organizații live, cu primul bilet de sprijin ca notificare. eșueazăGrants rezolvă fiecare organizație de două ori, odată ce acordă aplicații nemenționate şi o dată le-a negat şi a raportat diferenţa. Nu citeşte în direct. steag, astfel încât să ofere același răspuns înainte și după flip. Re-rezoluția trece prin planul de rezoluție mai degrabă decât id planul direct, oglindirea cărarea reală de rezervă la un planCode lookup De fapt, supravieţuirea e raportată ca pierdere.

  2. · kamo-internal

    Arată dacă cineva este acolo, și extinderea lor

    Fiecare rând poartă acum un punct de prezenţă şi un cuvânt lângă nume, şi extinderea lui. în linia de detaliu Sperând. Acesta este cel care alege oameni în aplicație, așa că aterizează pe Manager domeniu, e-semnari, adăugarea de oameni la un chat și atribuirea de sprijin deopotrivă. Offline bate tot ce a fost declarat. disponibilitatea status se deplasează numai pe sign-in; semn-out și un comutator manual, astfel încât cineva care nu semnează niciodată citiri AVAILEBILE pe termen nedefinit Un lucru punct este pentru. Desene neconectate ca un inel contur mai degrabă decât un Punct umplut, așa că se citește ca absența în loc de o altă culoare stare. Un director care nu a avut niciodata prezenta nu arată niciun indicator. Absentul este necunoscut şi necunoscutul nu trebuie să spună nimic. În loc să pretindă că toată lumea este offline.

  3. · SecurityService

    Păstrați disponibilitatea, prezența și extinderea pe un rând director

    A alege o persoană este mai ușor atunci când rândul spune dacă acestea sunt acolo și cum să ajunge la ei, astfel încât fiecare poartă acum ceea ce au declarat ultima dată, dacă ceva de a lor este de fapt conectat, și extinderea lor de lucru atunci când au unul. Disponibilitatea şi prezenţa sunt aici pentru că fiecare singur induce în eroare: disponibilitatea status se mișcă doar pe sign-in, sign-out și un comutator manual, astfel încât membru care nu semnează niciodată, citeşte " AVAILABIL" pe termen nelimitat. Prezenţa este citită din PREŞENŢA: {membri} Key MediaService scrie serviciul încrucişat merită numit. Alternativele au fost o călătorie dus-întors HTTP la MediaService pe fiecare apăsare de tastatură a unei căutări sau a unei prezenţe în browser, și browserul nu poate: ToolProviders redă docul instrument ca un frate al copac care deține furnizorii de prezență, astfel încât un culegător deschis în interiorul unui bilet de sprijin Fereastra ar raporta fiecare coleg offline. Ambele servicii împart gazda Redis şi baza de date. O căutare eşuată arată mai degrabă ca offline decât că nu a reuşit căutarea.

  4. · BillingService

    Cumpăraţi un bloc atunci când un org optat rămâne fără spaţiu

    Rulează la scurt timp după matura instantaneu noapte, pentru că este ceea ce produce cifra de utilizare se decide cu privire la extinderea față de numărul de ieri ar cumpăra o blocați o zi târziu de fiecare dată. Un bloc pe alergare, niciodată o explozie de prindere, și se oprește la plafonul proprietarului. Dacă o organizaţie a trecut de acel plafon, rezultatul corect este că scrierile se opresc. si cineva se uita la ea, nu ca platforma cumpara in liniste drumul la lor cheltuieli. Auto-extindere pe cu nici un plafon citește mai degrabă ca dezactivat decât nelimitat, deoarece o limită absentă este mult mai probabil să fie o supraveghere decât o intenție.

  5. · InitializerService

    Adaugă coloanele de extensie automată

  6. · kamo-shared-library

    Opţiune automată cu tavan

    Două coloane pe abonamentul care deține blocuri: dacă să cumpere un alt unul automat atunci când organizația rămâne fără cameră, și cel mai mult poate Niciodată să cumperi. Off în mod implicit pe scop upload care nu reușește cu o explicație, așa că de cotitură pe este proprietarul de tranzacționare o puţini bani pentru că nu trebuie să se gândească la asta, şi asta e doar meseria lor. Fă-o. Un plafon este necesar mai degrabă decât opțional: o achiziție automată cu nr. Legat este un angajament deschis pentru un proces nimeni nu se uita.

  7. · BillingService

    Lasă o modificare de preț catalog de fapt ajunge la Stripe

    Preţurile la dungi sunt imuabile, iar cartografierea conţine un rând pe (org, tip, cod, ciclu) în spatele unei chei unice, astfel încât odată ce un preț a existat nu ar putea schimba. A Editarea prețurilor a fost un permanent no-op pe venituri, și nimic nu a raportat. StripePriceReconciler compară fiecare preț cartografiat cu ceea ce catalogul acum spune și, atunci când este cerut să, indică cartografierea la un preț Stripe proaspăt cu vechiul o arhivat un preț arhivat pentru abonamente deja pe ea și îl refuză pentru cele noi; care este exact comportamentul dorit. Contorizarea se efectuează peste, astfel încât un metru prețul nu poate reveni fără control și în tăcere opri utilizarea facturii. În mod deliberat nu mută abonaţii existenţi pe noul preţ. În linişte. Recuperarea unui client live pentru că cineva editat un rând catalog este o taxă nimeni autorizat; dacă bunicul este o decizie comercială și Faptul că nu a fost niciodată o decizie este ceea ce lipsea. Contele încă pe Preţul vechi este raportat în schimb. Raport depus numai implicit la GET ******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************* Repunctează în spatele unui Post explicit.

  8. · InitializerService

    Adaugă coloanele care fac o schimbare de preț detectabilă

    Ordinul [0), nulable, no backfill acest pret a fost creat cu" si reconcilier-l trateaza mai degraba ca necunoscut decat ca o derivă.

  9. · kamo-shared-library

    Înregistrați cu ce preț a fost creat fiecare dungă

    Cartografiere stocate numai ce id preț de utilizat, astfel încât o modificare de preț catalog ar putea nici măcar să fie observat. asiguraţi-vă că planulpreţuri scurtcircuitate la existenţa rândului şi cheia unică a interzis un al doilea, ceea ce a însemnat ridicarea unui plan de la $72 la $79 a actualizat pagina de marketing, cotația în aplicație și planul DTO și a schimbat nimic despre ceea ce cineva a fost taxat cu nimic de raportare divergența. unit amount cents și valută da reconcilier ceva pentru a compara cu. Atât nullable cât și stânga NULL pentru rândurile existente: nul înseamnă "necunoscut," care este adevărat pentru fiecare rând care precede coloana, și tratarea necunoscut ca neuniform ar recreaţi fiecare preţ din proprietate în prima cursă.

  10. · kamo-internal

    Tastați capacitatea de stocare sumarul întoarce acum

    Mentine contractul client in pas cu BillingService, care acum raportează ce planul include, ce blocuri au fost cumpărate, plafonul combinat și fracția utilizată alături de octeții depozitați. Panou care redă are nevoie de o copie nouă, și kamo-translation-dictionary este Mid-edit de o altă sesiune, astfel încât IU aterizează separat, mai degrabă decât matura munca în zbor în acel repo.

  11. · BillingService

    Capacitatea de raportare alături de utilizare

    Panoul de stocare a raportat octeți stocate împotriva nimic, la toate nici un procent, nici bani fie că a fost confortabil sau pe cale de a opri încărcarea lor. Primul lor cunoașterea unei probleme ar fi fost o încărcare eșuată. Rezumatul poartă acum ceea ce planul include, ce blocuri au fost cumpărate, plafon combinat și fracția utilizată, plus dimensiunea blocului și prețul astfel a Suprafaţa poate spune ce alt bloc ar da şi costă fără să-l codeze. Totul provine din aceleaşi rânduri de catalog din care se plăteşte taxa.

  12. · kamo-shared-library

    Dați un efect indemnizației de depozitare

    Depozitarea a fost măsurată pe 19 domenii, noaptea, cu un fail-failing test de acoperire Figura de stocare a planului a fost datele pe care nimeni nu le-a citit, iar Depozitarea suplimentară add-on nu a avut niciun efect asupra produsului: plata nu a schimbat nimic și nu a plătit costuri Nimic. StorageQuotaService rezolvă ceea ce o organizație poate deține alocație cumulată pe scaunele sale, plus blocurile pe care le-a cumpărat și ImageService refuză conținutul care l-ar depăși. Cecul stă după Lookup dedup, așa că re-ataşarea unui fișier platforma deține deja nu este niciodată refuzat pentru spațiu; doar octeți cu adevărat noi contează. Locuieşte aici mai degrabă decât în BillingService pentru că serviciile care scriu octeți nu pot apela fiecare o facturare API pe calea lor de încărcare, și este injectat de domeniu mai degrabă decât prin constructor deoarece ImageService este asamblat de mână în mai multe locuri peste tot, cu excepția testelor și apoi nu se construiește imaginea. Două moduri deliberate de a greşi. "GB" este citit ca un gibibyte, care este ceea ce o administratorul de fișiere înseamnă atunci când imprima GB și citirea mai generoasă. Şi... organizație fără abonament live, sau un serviciu cu nici o cotă de fasole cu fir, magazine exact ca înainte: această poartă există pentru a deține un client plătitor la ceea ce au cumpărat, nu pentru a transforma un decalaj de facturare în pierderi de date. Citirile nu sunt niciodată poartate Umplerea depozitului te oprește să adaugi mai mult, nu ia niciodată ceea ce ai.

  13. · kamo-internal

    Spune-i solicitantului dacă agentul lor este de fapt acolo

    Un fir tăcut nu distinge "nimeni nu s-a uitat la asta" de "agentul meu" "şi persoana care aşteaptă nu ştie care." Anunțul în temeiul conversație spune care, și când răspunsul este "nu acum" se spune ce se întâmplă următorul Decât să las pe cineva să se întrebe dacă a aterizat. Plasat sub chat mai degrabă decât în antet pentru că răspunde "este oricine acolo?" care este întrebarea pusă în timp ce tastaţi, nu în timp ce scanaţi metadatele biletului. Server-a răspuns, nu a citit din harta de prezență a solicitantului: prezența este difuzat pe organizație, astfel încât un client-org membru fiind ajutat de furnizor org ar vedea agentul lor ca permanent offline. Un greșit cu încredere "sunt E mai rău decât nu se ştie. Din acelaşi motiv pentru care un sondaj eşuat păstrează ultimul Răspuns cunoscut în loc de flipping anunț. Pollat la 30 de ani și numai în timp ce fila este vizibilă. Disponibilitatea este un confort semnal, nu o corectitudine unul, și o filă fundal nu este nimeni vizionarea.

  14. · MediaService

    Reatribuirea ajunge la noul agent, iar solicitantului i se spune cine este acolo

    Reatribuirea nu a ajuns la nimeni. Inregistrare deschisAt inregistrari pe care un client le-a pus conversația de pe ecran, și este ceea ce ridică un bilet la sign-in dar încă mai deținea ștampila agentului anterior, astfel încât cel nou a primit împingerea live numai dacă S-a întâmplat să fie online în acea secundă, şi nimic dacă ar fi fost. semnat. AplicăAtribuirea îl șterge acum ori de câte ori cesionarul se schimbă efectiv, Ceea ce face ca predarea să fie durabilă pentru oricine o deţine acum. GET *************** spune persoanei care a cerut ajutor dacă persoana care le ajută este accesibilă. Adresa serverului a răspuns intenționat: prezența este difuzat pe organizație, astfel încât un client-org solicitant nu poate vedea un agent în org furnizor la toate și statutul ar citi "offline" pentru fiecare Conversaţie încrucişată. Domeniul de aplicare pentru oamenii care deja în conversație a Id bilet este un UUID, nu un secret, și "este această persoană la biroul lor" nu ar trebui Răspunde la o presupunere.

  15. · kamo-internal

    Atribuiți o cerere de chat și atribuiți din lista de bilete

    Două goluri, aceeaşi cauză. mai degrabă bilet decât o bucată de muncă. Butonul de atribuire a fost ascuns pentru pre-bilete pur și simplu, astfel încât o cerere de chat live, cazul în care obtinerea-l la persoana potrivita conteaza cel mai mult, nu a avut nici o modalitate de a fi Predat deloc. Această excludere datează de la momentul în care o cerere de chat nu a fost încă "a Bilete reale" și misiune sa întâmplat doar pe conversie. Este atribuibil acum, Și statutul supraviețuiește, astfel încât acesta poate fi încă convertit după aceea. Și atribuirea necesar deschiderea conversației mai întâi, care este forma greșită pentru triaj o coadă de așteptare Ar trebui să răspundă. Cel de pe lista de bilete este acum controlul: hovering spectacole atribui sau reasigna, click deschide același picker bilet utilizarea ferestrei. Clicul pe rând încă deschide conversaţia. Răspunsul patch-uri propriul rând, mai degrabă decât reîncărcare, astfel încât atribuirea nu Mută locul operatorului într-o coadă filtrată, sortate, paginată.

  16. · kamo-internal

    Citate motor pentru picker plan, potrivire ceea ce va factura Stripe

    Aritmetica din spatele unui total de rulare live, păstrat în afară de orice componentă, astfel încât numerele pot fi testate direct. Oglinzile astea... exact: pe loc add-ons scala cu headcount, plat cele factura de unități cumpărate oricat de multi oameni sunt in plan, si cei masurati sunt numiti mai degraba decat Am ghicit. Această corespondență este punctul. Ambele locuri ale platformei au fost citate anterior prețul nu a fost de acord cu taxa indiferent de locuri, iar pagina publică facturat un bazin de stocare la nivel de organizație pe utilizator.

  17. · BillingService

    Faceți un prim plan purchasable, și returnați prețurile reale plan

    Două lucruri au oprit o organizaţie să cumpere un prim abonament. Lista de planuri a fost accesibil numai prin sub.marketId pe un abonament org deja a avut loc, astfel încât un org cu nici unul nu a putut vedea un plan oriunde în produsul. GET /api/billing/markets/for-org rezolvă piața de la apelantului radacina dreptului Astfel, planurile și drepturile nu pot proveni din cataloage diferite. Şi planul pe care DTO l-a citit... populează vreodată: sunt NULL pentru fiecare plan KamoCRM, pentru că semănătorul scrie Preţuri în *************** O suprafață de cumpărare a arătat, prin urmare, Nici un preţ, iar contul a înregistrat o taxă nulă. Acum citeşte preţul. rânduri, cu coloanele de plan ca o rezervă pentru cataloagele care le transportă. De asemenea, expune dimensiunea unității suplimentare astfel încât o suprafață de cumpărare poate spune "per 10 GB" fără să-l codeze.

  18. · kamo-internal

    Acţiuni plătite pe un scaun licenţiat, la punctul de sufocare

    Aproape fiecare acţiune la poartă în produs deschide asistentul AI, pune o înregistrare, începe o conversație socială Şi registrul sculelor nu avea nicio poartă. Gating aceste locuri de apel unul la un moment dat nu ar putea fi complet: un dispecer adăugat mai târziu, sau pur și simplu ratat, rute direct în jurul ei. Cecul acum trăiește în ToolWindowsContext este un singur instrument:deschis handler, deci fiecare apelant este acoperit. Acţiunile care nu trec niciodată printr-o fereastră de unelte sunt purtate acolo unde trăiesc: Ataşamente (inclusiv picătura de drag şi pasta, care sunt aceeaşi capacitate prin un alt traseu), extinderea unui chat într-un grup și punctele de intrare ale reuniunii. Acest lucru rezolvă, de asemenea, trei neconcordanțe constatate în cadrul auditului. Doi din trei "invitaţi la întâlnire" au fost verificate punctele de intrare. isMeet şi al treilea nu; două dintre cele trei puncte de intrare prin e-mail verificate ACCES MAIL și al treilea a făcut nu; și formarea extensiei unui membru din listă nu a avut nici o verificare VOIP de orice Un fel. Toţi sunt de acord. Capabilități implicite de blocare eșuează, și dacă un backend mai vechi omite domeniul. Cred că "permis" ar mâna în afara caracteristicilor plătite, care este greșeala calea de drepturi deja făcută o dată cu defectul sau implicit.

  19. · SecurityService

    Rezolva ce poate face un membru, nu doar ceea ce include planul lor

    Granturile de caracteristici descriu un plan. Ei nu au descris acest membru, deoarece consola poarta de navigare pe org-nivel org.features Am văzut fiecare aplicaţie la care organizaţia avea dreptul. licențierea care exista deja în baza de date nu a avut niciun efect asupra nimic. MemberCapability este acel răspuns lipsă, rezolvat o dată pe server. Membru fără scaun păstrează un etaj deliberat: conversație text cu colegii de echipă, sprijin, propriul lor profil, propria lor facturare Cumpără-ţi un loc în spate. Traducere de intrare-mesaj rămâne pe prea, deoarece citirea ceea ce Ai fost trimis nu este cheltuieli. Tot ce costă bani pentru a rula este oprit. Un proces activ de org licențiază toată lumea în org mai degrabă decât doar scaunul Deţinătorul. Un org de încercare este însămânțat cu un singur scaun a Planului liber, astfel încât Gating proces pe licențe ar fi însemnat proprietarul singur ar putea evalua produsul În timp ce echipa au invitat să-l evalueze nu a văzut nimic. Autentificare este neatins: autentificarea nu a consultat niciodată starea de facturare și încă Nu. Pierderea unui loc de cost caracteristici, nu acces.

  20. · BillingService

    Factură pe unitate adăugată de unități cumpărate, nu prin numărătoare

    Filează noua cantitate adăugată prin crearea și actualizarea: o completare FLAT acum ia cantitatea de dungi din ceea ce a cumpărat de fapt, astfel încât patru 10 GB blocuri de stocare factura ca patru blocuri mai degrabă decât o dată pe scaun. Cantitățile sunt filtrate în funcție de codurile ad- on rezolvate pe drum, astfel încât organism vechi sau ostil nu poate parca o cantitate pe un cod nu a avut dreptul Pentru a cumpăra.

  21. · InitializerService

    Repreț depozitare suplimentară ca $2.50 la 10 GB, org-la nivelul întreg

    Add-on-ul a descris un grup de organizare comun și a fost apoi la preț USAGE BASED la $4 cu "25 GB" menționat numai în proza. Nimic nu a prezentat vreodată o eveniment contor de stocare, astfel încât facturat nimic; și dacă ar fi fost atașat, Stripe respinge o cantitate la un preț contorizat, astfel încât crea abonament ar avea Aruncat. Între timp, pagina publică l-a transformat în "+4 $ /utilizator/lună." Acesta este acum FLAT cu unitatea size 10 la $2.50 Blocuri proprietarul cumpără, preț La fel ca multe persoane sunt pe plan. AddOnQuantityMigration adaugă cele două Articolul 4 alineatul (1) litera (c) din CRR Ei.

  22. · kamo-shared-library

    Adaugă o unitate de mărime și o cantitate de purchasable

    Unitatea add-on a existat doar vreodată ca proza în interiorul descrierii sale ("Fiecare unitate adaugă 25 GB") și ca o constantă hardcoded în site-ul de marketing, astfel încât nimic nu ar putea Factură împotriva ei. AbonareAddOn events unit size, and AccountAbonare câștiguri addon quantities Active addon coduri rămâne sursa de drept al adevărului, astfel încât nimic care numai întreabă "este această aplicație acordată" trebuie să știe harta cantității există. De asemenea, fixează citatul vrăjitorului de ordine, care a adăugat fiecare adăugare o dată fără locuri factor chiar dacă majoritatea sunt PER SEAT: o comandă de 25 de locuri cu patru module a fost Citat 31 dolari împotriva 775 dolari Stripe ar factura. Citatul urmează acum acelaşi model de preț taxa nu, și omite contorizate add-ons mai degrabă decât ghicitul.

  23. · kamo-internal

    Alege agentul pentru a transfera un bilet la, în loc de tastarea ID-ul lor

    Asignați și reasignați ați deschis o casetă de text în care ați tastat un membru brut id. a însemnat deja cunoașterea ID-ul persoanei pe care o doreai, pentru o acțiune a cărui întreg Scopul este găsirea celui potrivit. Acesta folosește acum MemberPickerDialog, același culegător în spatele domeniului Manager pe o profilul membrilor și cel care alege oameni în această aplicație. Căutarea directorului său se execută server-side și meciuri pe nume, alias, e-mail de lucru și cont, titlu de loc de muncă și Departamentul, așa că "ana împrumut" găsește Ana în împrumut; fiecare rând poartă suficient pentru a Spune două persoane cu același nume în afară. Atribuit curent este fixat deasupra rezultate, astfel încât nu este pierdut mijlocul de căutare. Id-urile membrilor depășesc gama completă exactă JavaScript, astfel încât ID-ul rămâne un șir de directorul către sârmă.

  24. · MediaService

    Puncte finale pentru predarea automată de sign-in

    GET /sesiuni/chat/auto-deschis returnează conversaţiile pe chat ale clientului acestui membru ar trebui să ridice; Post / sessions/{guid}/auto-deschise înregistrări că a făcut-o. Durabilitatea opozabilă a predării sprijinului și din același motiv: decizia aparține platformei, nu sesiunii unui browserStorage. Scrierea este domină la rândul de membru al apelantului, astfel încât clientul unui membru nu pot să mă retrag niciodată de pe serverul altuia, ci de pe serverul unui client. valoarea și un browser skewed ar altfel fie suprima o conversație pentru totdeauna sau Re-raise-l la nesfârșit. ChatAutoOpenHqlTest pares interogarea împotriva modelului de entitate reală și pins Trei predicate pentru care există. Datele de primăvară validează doar @Query la context boot, astfel încât o scriere ar apărea altfel ca o pornire eșuată sau un 500 pe o cale fiecare membru lovește la sign-in; testul citește interogarea de adnotare prin Reflectare astfel încât să nu poată trece împotriva unei copii vechi.

  25. · kamo-shared-library

    Inregistrare durabila a unei conversatii pe care clientul a ridicat-o de la sine

    MediaSessionMember câştiguri AUTO OPENED AT, alături de msgIdLastViewed deoarece este același grăunte Acela. răspunsuri "cât de mult au citit"; acesta răspunde "au fost deja afișate Acest lucru, neîntrebat." Aceasta înlocuiește o sesiune per-tabStorage pavilion, care nu a fost o înregistrare de nimic: a al doilea dispozitiv re-deschis fiecare conversație prima a apărut deja, și de compensare depozitare pierdut în întregime. găsiChatSesssionsToAutoOpen returnează sesiunile care dețin ceva ce membrul are nu a citit în cazul în care ceva a sosit de la ultima raise lăsat în mod deliberat necitite se oprește din nou pe fiecare sarcină, dar vine înapoi atunci când o un mesaj cu adevărat nou aterizează. Numai sesiuni de chat; bilete de sprijin au propriile lor Predarea. Mesajele proprii ale membrului sunt excluse, iar un msgIdLastViewed pointerul contează mai degrabă ca necitit decât ca prins-up, pentru că o subquery scalar peste un rând dispărut produce NULL și ar citi ca citit permanent.

  26. · kamo-internal

    Revizuire panoul de preferințe

    Patru picături și un comutator pe un panou spălat de sus în jos în chiriaș culoare la putere maximă, astfel încât fiecare control a luptat propriul fundal. Fiecare selectați trei sau patru opțiuni ascunse în spatele unui clic și a repetat aceleași douăsprezece linii de stil de frontieră. Panou este o suprafață acum, iar culoarea aparține pe orice este selectat. - Toate opţiunile sunt pe ecran. Acestea sunt patru setări cu trei până la cinci valori scurte fiecare; arată-le este mai rapid de utilizat decât deschiderea unui meniu, și o componentă Choice înlocuiește patru blocuri de styling duplicat. - Reamintire timp și metodă partajați o carte, pentru că nici nu înseamnă nimic fără celălalt. Offset-urile de reamintire sunt mono, potrivire restul calendar de tratament de timp. - Calendarul implicit îşi arată culoarea, deci este recunoscut în acelaşi mod este în bara laterală și dialogul de eveniment, mai degrabă decât numai după nume. - antetul rămâne pus în timp ce corpul suluri În caz contrar, defilează departe. Aceste setări salvează la schimbare fără buton pentru a apăsa, și a spus anterior cu un spinner gol. Există acum un explicit "Saved," care dispare după câteva secunde pentru că este o chitanţă pentru schimbarea făcută, nu un starea permanentă a panoului. Secțiunile se clatină și arcurile de confirmare; ambele sunt suprimate sub preferă mişcarea redusă. Fiecare şir este o cheie existentă. Verificat cu o clădire de producție într-un copac de lucru detașat.

  27. · kamo-internal

    Înlocuiți cutia poștală spinners cu un schelet care asamblează

    Fiecare stare de încărcare pe /mesaje a fost un Încărcător2 pe o pantă altfel goală boot, lista de mesaje, arborele de dosar, corpul de mesaje și pagina următoare toate Întinde-te şi nu-i spune cititorului nimic despre ce va urma. Acum desenează chestia care se încarcă. Fiecare titular copiază geometria componenta în care se află, până la 40px avatar, liniuța dosarului și rândul de mesaj 104/120px măsurat pe marca reală, astfel încât aspectul nu mutați atunci când datele aterizează. O idee poartă mişcarea: o bandă de cruci de lumină fiecare locand la stânga la dreapta și începe o bătaie mai târziu pe fiecare rând de mai jos, așa Punctul culminant coboară stiva ca o singură trecere diagonală mai degrabă decât fiecare rând intermitent pe propriul ceas. Rândurile se ridică la locul lor în aceeaşi ordine. Lumina este amestecată de --accent-comms, propriul accent de familie al modulului de mesaje, așa că se citește ca acest produs mai degrabă decât un luciu generic. preferă mișcarea redusă Aplatizează totul la baruri încă. Nici o nouă cheie mesaj: titularii se anunță pentru a ecrana cititorii prin cele trei sfori de încărcare care erau deja acolo.

  28. · kamo-internal

    Adaugă și elimină oaspeții din dialogul evenimentului

    Ultimul lucru pe care dialogul nu a putut face. S-ar putea afișa cine era deja pe un eveniment, dar nu a existat nici o modalitate de a pune pe nimeni acolo a fost "actualizare și notificare," care re-mailuri oameni care au fost deja invitați. Oaspeții sunt adăugați prin e-mail, enumerate cu lor RSVP ca un punct colorat intitulat cu statul, și eliminate pe hover. Introduceți adaugă un oaspete mai degrabă decât depunerea dialogului, pentru că sunteți mai degrabă mijlocul-listă decât terminat. ă organizatorul este marcat și nu poate fi confundat cu un oaspete obișnuit. Validarea e-mailului este permisivă în mod deliberat: testul real este dacă e-mailul şi un model mai strict respinge adresele care sunt perfecte valid. Prinde o greşeală evidentă, nimic mai mult. Statul gol nu-şi cere scuze. Strings expediate înainte de acest lucru în kamo-translation-dictionary aruncă pe o cheie lipsă de la clone CI en.json și kamo-internă care repo la timpul de construcție, astfel încât aterizarea acest prim ar fi expediat o pagină de calendar care accidente. Verificat cu o construcție de producție într-un copac de lucru detașat; o altă sesiune Ţine încuietoarea din copac.

  29. · EmailService

    Gestionați lista de invitați a unui eveniment

    Dialogul ar putea arăta cine a fost deja pe un eveniment, dar nu adăuga sau elimina Singura operaţiune a fost re-notificarea oamenilor care au fost cumva Deja acolo. Evenimentele acceptă acum o listă de invitați, înlocuit en-gros pe economie. Înlocuiește mai degrabă decât fuzionarea, deoarece dialogul deține lista dispar aici. O listă nulă înseamnă "nu este furnizată" și lasă oaspeții singur, care este ceea ce un client editarea doar un titlu trimite. Două lucruri un client nu ajunge să afirme, astfel încât nici nu este citit off cerere: RSVP, care este invitatul de a da, și steagul organizatorului; care înregistrează cine a convocat întâlnirea. Ambele supraviețui o editare rânduri în loc de actualizarea acestora ar reseta fiecare răspuns și benzi cel persoana a permis anularea evenimentului. Oaspeții vin înapoi stors. O vedere de o lună întoarce o sută de evenimente, și cere per eveniment este o cerere pe rând. Ștergerea unui eveniment acum elimină oaspeții săi mai întâi. Ei au un non-null Cheie străină înapoi la ea, astfel încât șterge fie le orfan sau a eșuat o dată baza de date a aplicat referinţa.

  30. · kamo-shared-library

    Cautare de oaspeți și ștergeți-de-eveniment

    Dialogul evenimentului arată cu cine este un eveniment, iar obiectivul listei întoarce lună de evenimente la un moment dat. Solicitarea de oaspeți pentru fiecare eveniment este o cerere pe rând; Găseşte-l pe EventIdIn întreabă o dată. StergeByEventId este prima jumătate a înlocuirii unei liste de invitați en-gros și de a elimina un eveniment fara randuri orfane care transporta un strain non-null Cheia înapoi la ea.

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