Przejdź do treści
KAMOUniverse

Changelog

Co nowego.

Każde ulepszenie platformy, jak to wysyła.

  1. · EmailService

    Przeczytaj jedno wydarzenie przez Id

    Strona prowadząca zawiera wydarzenie callback id i chce ją ponownie otworzyć w tym samym miejscu Oknem dialogowym używa kalendarza, więc musi być w stanie samodzielnie pojąć zdarzenie. Skutkowane dokładnie tak, jak lista — własne kalendarze członka plus Organizacja jest taka, że id należący do czyjegoś kalendarza odczytuje się jako nieobecne Zamiast jako zakazane.

  2. · kamo-internal

    Pływające nuty stają się drugą klasą sześciokątną głową

    Głowy sześciokątne teraz z powrotem dwa rodzaje okna: wyskakujące okna narzędziowe Zawsze robiły to i unoszące się notatki. Minimalizacja zastępuje stary roll-up — a Zminimalizowana lepka pozostawia całkowicie nakładkę i ląduje w głowie sześciokątnej Dok noszący własny kolor nuty, gdzie wyskakująco / zamyka i Pojedź go dokładnie tak, jak napędzają okno narzędzia. Integracja jest kontraktem na wydarzenie, nic więcej: głowy są kluczowe Okna id, więc notatki robią w środku "pływającą":-id>" inamespace Dzielona przestrzeń i dziewczyna i odpowiedź „tool: focus” / „tool”: closea dla własnej. "Nastolatek: requestClose" celowo nie jest zawetowany - że weto chroni Niewysłane szkice, lepkie autosaves i płyną na unmount. Również: - Cały tytułowy pasek przeciąga. Tytuł jest etykietą, a nie wejściem, To jest to, co kradnie każdy piksel, z wyjątkiem lewego górnego rogu; Kliknij dwukrotnie, zmienia nazwy, klikając dwukrotnie dowolne miejsce w przypadku maksymalizacji. - Zmaksymalizuj do pełnego ekranu, z przycisku lub kliknij dwukrotnie. - Notatka jest na żywo w jednym lub drugim miejscu, nigdy o jedno i drugie. Podczas pływania, jego karta w /notach jest przyciemniana i obojętna (tylko ponowne przymocowanie pobytów na żywo) i Oderwać od redaktora zamyka redaktora. "Otwórz w banknotach" ręce Odwróć uwagę i zamyka lepkie. - Zatrzask głębokiego łącza był pojedynczym booleanem, więc notatka z powrotem Drugi raz nigdy nie został ponownie otwarty. Jest teraz kluczowany na id. - lepka lewa zminimalizowana ponownie wygłasza głowę po przeładunku i a Dziedzictwo „ulepszone” migruje, aby zminimalizować, a nie znikać.

  3. · kamo-internal

    Kontrola, która faktycznie otwiera to, co spowodowało wydarzenie

    Opis callback zawierał "Otwórz prowadzenie: /leads/view/123" jako tekst, oraz Tekst w galerii tekstowej nie można kliknąć — okno dialogowe zdarzenia edytuje jego opis w Po pierwsze, więc ta ścieżka nigdy nie mogłaby być tam łącznikiem. Miejsce docelowe znajdowało się na deepLink zdarzenia od czasu dodania kolumny; to Jest to afordona, która z niej korzysta. Dialog zawiera je obok rodzaju wydarzenia, Widok porządku obrad oferuje go w opisie, a oba przechodzą przez router Zamiast załadywać dokument, ponieważ może być otwarty na dowolnej stronie i Nawigacja zburzyłaby wszystko, co członek ma. Kluczowy od deepLink, a nie odłączenia zwrotów, więc cokolwiek wytwarza Następne wydarzenia przejmują kontrolę bez dotykania tego dialogu. Etykieta brzmi: "Otwarte Ołów", gdy pochodzenie jest callback i "Otwórz" w przeciwnym razie.

  4. · kamo-internal

    Odwoły w kalendarzu i znacznik na liście

    Dwa sposoby, aby zobaczyć wezwanie, które obiecałeś wykonać bez otwierania czołówki. W kalendarzu oddzwoń dostaje własny element linii, a nie wygląda jak każdy Inne spotkanie - wezwanie, które jesteś komuś winien, jest innym rodzajem obowiązku Ze spotkania, w którym zgodziłeś się wziąć udział, i pogląd, który czyni je identycznie Czytasz każdy tytuł, aby je odróżnić. Widok miesiąca załamuje się dzień Wzywa do jednej linii, czytając, ile ich jest, ponieważ komórka pasuje do około trzech Chipy i pracowity poranek wezwań w przeciwnym razie popchnęłyby każde spotkanie pod koniec "+4 więcej". Tydzień nazywa go "Lead Callback" i stawia prowadzenie w Zawisł, ponieważ blok jest kilka znaków szerokich w tym zoomie. Dzień i porządek obrad Widoki mają miejsce dla obu i pokaż oba. Na liście leadów trop z wyjątkowym połączeniem zawiera znacznik telefonu w Przypięte limfocyty jd, zabarwione tym, jak jest naciśnięcie: szary dzień lub więcej na zewnątrz, bursztynowy Dzisiaj czerwony raz minie z czasem, a nikt go nie zaznaczy. Zaległe pulsy, które są stanem, który warto złapać podczas przewijania. Więcej niż jeden telefon Prowadzący pokazuje liczenie. Pilna jest odczytywane w dniach kalendarzowych, a nie godzinach, ponieważ to jest to, co "Dzisiaj" oznacza osobę czytającą listę: jutrzejszy telefon o 9 rano nie jest pilny Dziś o 17:00 jest już od szesnastu godzin, a dziś telefon o 9 rano jest pilny. 8am, choć jest godzina drogi.

  5. · SecurityService

    Podsumowanie Callback dla znacznika listy leadów

    Odpowiedzi, które prowadzą, mają jeszcze na oczekiwanie, a kiedy najsłyszą będzie należna, W jednym wniosku z jednej prośbie jest organizacja dzwoniącza. Własny punkt końcowy, a nie Pole na czołówce: callbacki zmieniają się na własnym harmonogramie, więc składając je w ładowność ołowiu oznaczałaby połączenie na każdym zapytaniu prowadzącym lub nieświeży znacznik.

  6. · kamo-shared-library

    Rozpędzane oddzwonienia dla całej organizacji w jednym zapytaniu

    Nakarmia znaczniki na limierze na rzędzie. Sieć utrzymuje każdy trop, który jest Członek może zobaczyć, więc proszenie na ołów byłoby żądaniem na wiersz, aby go oddać Kolumna; to jest to samo pytanie zadane raz. Tylko metoda repozytorium – żadna istota ani kolumna nie zmienia się, więc nic tutaj nie jest uzbrojone - Na schematę.

  7. · kamo-internal

    Centrum powiadomień, na każdej stronie

    Przypomnienia nie miały dokąd dotrzeć. Wyskakujące okienka w kalendarzu było zwykłym alarmem w W górnym rogu którego strony stało się otwarte, zniknęła na zegarze, i Wszystko podniesione, gdy członek był gdzie indziej, było po prostu zagubione – gniazdo Publikuje, a publikacja nie jest subskrybowana, aby odnieść sukces i zniknie. Tak więc powiadomienia są teraz przechowywane i publikowane, a przeglądarka czyta obie W jednym kontekście zamontowanym nad całym drzewem. Co przychodzi, gdy jesteś Tutaj jest popychany; to, co dotarło, gdy nie byłeś, jest zgłaszane na następny Połączenie, raz, więc dwie karty otwierające się razem nie podnoszą tej samej sterty. Talia znajduje się w rogu widoku, nad jakąkolwiek stroną pod spodem. Karty stosują się zamiast listy - cztery przypomnienia lądujące razem, co jest tym, co Wydarzenie firmowe plus własne spotkanie to robi, w przeciwnym razie wziąłby prawo Trzecia część ekranu - i unosi się ich fantazjami. Każda karta prowadzi z tym czymś Każde powiadomienie w tym produkcie ma ze sobą wspólnego: zegar. Odlicza się do Impreza, oferuje teraz, później lub wcale, i osusza szynę w miarę własnych przebiegów powitania Wychodzi, co zatrzymuje się, gdy to czytasz. Przesuń w prawo, aby się go pozbyć. Wszystko inne stoi za dwoma menu: drzemka przez pięć, dziesięć, piętnaście, trzydzieści, Godzina, albo do pięciu minut przed rozpoczęciem tego wszystkiego; wyciszaj tego rodzaju Powiadomienie jawnie; otwórz ustawienia. Zadowolone przez producentów akcje jeżdżą wzdłuż, Tak więc callback oferuje numer prowadzący, a spotkanie oferuje jego link łączący. Linki Przejście przez router, nigdy nie ładować dokumentu – pokład może strzelać w dowolnym momencie I nawigacja tutaj zburzyłaby niewysłany szkic. dzwonek w górnej nav jest stały chromowany z tego samego powodu, gdy zegar zgodności Jest to: dzwonek, który ktoś może się rozpiąć, a potem nie powiedziano, że nic jest gorsze niż żadne. Za nią jest historia, filtrowana przez rodzaj lub przez nieprzeczytany, z do-not-disturb Gdzie członek zauważa hałas. Tacza też mówi. TabAttention już przebłysła tytuł i oznaczyła favicon dla czatu, leadów i wsparcia; nieprzeczytane powiadomienia dołączają do niego, powyżej czatu Ponieważ są one czasowe – przypomnienie, że połączenie jest należne w ciągu pięciu minut Przyjemne są pięć minut od teraz. Dźwięki są syntetyzowane, a nie obciążone, więc pierwsze powiadomienie o sesji Nie jest cicho na powolnym powiązaniu. Powiadomienia na pulpicie są podnoszone tylko Kiedy zakładka jest ukryta, a pozwolenie jest zadane w momencie, gdy członek się odwraca Włączenie zamiast obciążenia strony, które jest wzorem przeglądarki tłumią Ludzie odruchowo zaprzeczają.

  8. · SecurityService

    Oddzwoń, która prowadzi z powrotem na prowadzenie

    Callback dotarł już do kalendarza członka, jako wydarzenie zatytułowane "Lead Callback" z ich komentarzem w opisie. Nic nie mówi, czyja to było wezwanie, Nic nie mówi, jaki numer wybrać, a nic nie doprowadziło z powrotem do czołówki – więc członek Patrząc na ich kalendarz musiał przejść i znaleźć trop ręcznie, który jest Wyszukiwarka wpisu kalendarza istniała, aby je zapisać. Teraz nosi nazwę czołówki w tytule, ich numer w lokalizacji i a. Strona-relacyjny głęboki link z powrotem do czołówki na wydarzenie i w jego opisie. Opis celowo powtarza dane kontaktowe: Kalendarz jest czytany Tam, gdzie CRM nie jest, a oddzwonij nie można działać bez otwarcia innego Aplikacja jest przypomnieniem, aby iść i poszukać czegoś w górę. Strona prowadząca teraz komponuje oddzwoń w oknie dialogowym z własnym wydarzeniem kalendarza, więc Żądanie może mieć całe wydarzenie — tytuł gości, przypomnienia, kolor — i to Wszystko mija. Każde pole oprócz chwili jest opcjonalne; dzwoniąc, który Wysyła tylko oryginalna trójka, która nadal otrzymuje poprawnie zatytułowaną, odpowiednio połączona Wejście zbudowane z czołówki. Rozwiązywanie połączenia zwrotnego wycofuje powiadomienie, a także anulowanie wydarzenia. W przeciwnym razie połączenie wykonane po dwóch minutach pozostawia kartę, która wciąż o nią prosi, i Uranował, który wraca jutro, by zapytać ponownie.

  9. · InitializerService

    Tabele powiadomień członkowskich oraz kolumny pochodzenia wydarzenia

    Dwie połówki jednej funkcji. Oddzwonie zaplanowane na smyczy jest odzwierciedlone na Kalendarz planowania członka, a punktem lustra jest powrót do lead — tak kalendarz_eventy przenoszą source_type, source_id i deep_link, oraz Powiadomienie podniesione z niego niesie ze sobą te same trzy. Zamówienie 0: CalendarEvent mapuje trzy nowe kolumny od momentu tej budowy Zaczyna się, więc każdy biegacz, który ładuje wydarzenie, emituje je w swoim SELECT i ddl-auto nie może ich jeszcze dodać. Zamówione spóźnienie, że nigdy nie wykona. Zastosowano i zweryfikowane przeciwko Yugabyte 2026-08-13.

  10. · kamo-shared-library

    Centrum powiadomień członkowskich i pochodzenie wydarzenia

    Dodaje MemberNotification i MemberNotificationPreferencje: jeden wiersz na członka na członka Powiadomienie, ponieważ czytaj, odrzucone i drzemane są odpowiedzią na osobę i Wspólny rząd nie ma gdzie ich umieścić. Preferencje pokrywają dwie połowy oddzielnie — mutes, spokojne godziny i nie-niezakłócane są stosowane, gdy powiadomienie jest Podniesione; powiadomienia dźwiękowe, głośności i desktop to właściwości przeglądarki. CalendarEvent zyskuje SOURCE_TYPE, SOURCE_ID i DEEP_LINK, więc wydarzenie wykonane przez Obsługa może doprowadzić do tego, o czym jest. Ołów oddzwoniłowy odbity na Kalendarz był wcześniej zatytułowany "Lead Callback" i nigdzie nie wskazał, więc członek Patrzenie na to musiało iść i znaleźć ołów ręcznie. CalendarEventReminderRepository zyskuje na miejscu wyszukiwania i pobiera własne Kalendarz z należytym przypomnieniem, który jest tym, co pozwala na zapytanie fan-out dostawy Czy zdarzenie należy do organizacji bez pytania na przypomnienie. Schemat stosowany przez KamoInitializer MemberNotificationMigration i zweryfikowany w Yugabyte przed tym wylądował.

  11. · kamo-internal

    Oderwowanie nut na draggable, resizable floating stickies

    Każda notatka na liście (i edytorze) otrzymuje kontrolę oderwania, która ją wybucha Na nakładkę na ekranie. Każda liczba może unosić się na raz; każda może być Przeciągnięty w dowolnym miejscu, przewymiarowany z dowolnej krawędzi lub narożnika w dół do podłogi 220x170, Zwinięty do paska tytułowego, wyrewolucjonowany i edytowany na miejscu. Umieszczenie, rozmiar, układanie i kolor utrzymują się w dowolnym miejscu w dowolnym przypadku DB Sklep z grafem ui-preferences pod kluczem „floatingUNotes” – ten sam mechanizm: Utwór nav wykorzystuje. Ten sklep, a nie sessionStorage, jest punktem: stickies Trzeba przetrwać wylogowanie się i powrót, a wylogowanie oczyszcza sesjęStorage Sprzedaż hurtowa. Uwagi: - Przyklejony tekst jest zawsze prawie czarny, więc każde wybrane tło jest utrzymywane powyżej współczynnika kontrastu 7:1 w stosunku do niego przez test jednostkowy. Paleta nie może Odpłyn nieczytelności później. Edycja Inline jest oferowana tylko dla notatek, których stan Lexical Nie ma formatowania; wszystko, co bogatsze otwiera tylko do odczytu, a nie jest Skompowane przez zwykłą podróż w obie strony. - nota.Kolor był wcześniej sześciokątem wrzuconym do gniazda klasyName, gdzie to jest Nic nie zrobił. Jest to teraz paleta id rozwiązana do inline Tło, a kolorowa karta przypina swój tekst ciemny, więc tryb ciemny nie może Farba biała na pastelu. - Nakładka jest nakreślana do "body"; pole zawartości powłoki jest Przepełnij:auto i w przeciwnym razie przycina go.

  12. · EmailService

    Jedna liczba cząstw dla odznaki pocztowej i policz, ile jest warta ścieżka indeksu

    Trzy rzeczy, a wszystko o tym, że wiedzą, a nie zakładają. Odznaka nieodreadna nav-top wyrwał całe drzewo folderów i wybrała INBOX z Rezultat – najdroższy telefon pocztowy, aby wykonać numer. MailReader przeniósł getUnreadCountza za to właśnie od czasu jego napisania (a Pojedynczy STATUS na dostawcach IMAP, pole inline na Graph) i nic nigdy Ujawnił go przez HTTP. Teraz tak jest. Jest to ścieżka awaryjna, która strzela tylko wtedy, gdy Nieodczytane gniazdo zawiodło, więc jest rzadkie i było drogie dokładnie, gdy Sprawy już się układały źle. Notowanie za pomocą indeksu informuje teraz, dlaczego nie służył lub nie służył, za - a siłownik eksponuje metryki, więc Licznikach można odczytać. Stosunek do modseq_moved to liczba, która mówi Czy ta ścieżka zapewnia jej złożoność, a nie jest odpowiedzialność, czytając Kod: folder unieważnia własny punkt kontrolny, gdy tylko ktoś odczyta wiadomość W nim wskaźnik trafień jest faktem o tym, jak członkowie poruszają się przez pocztę. A w pog, w pog, w pot w/, w pot w, w pot w, w pot w/, w pot w, w pot w, pot w, w Dowody na to, że raporty są teraz enum, a nie boolean, więc każda odmowa jest Przydzielone zamiast łączyć się, a testy potwierdzają konkretny powód — Test, który zaakceptował jakąkolwiek odmowę, pozwoliłby tym wiadrom dryfować w nonsens. Naprawia również łuszczący się test, który obserwowałem, zawiodłem trzy razy tego popołudnia, a który jest Nie mój: ImapIdleRegistryTest zalikł makietę z przedziałem czasu Mockito (), aby zobaczyć async zamyka ziemię, a na załadowanej maszynie, która wygasa, gdy zamknięcie jest po prostu Stawiony za stworzeniu nici. Zawodzi jako "zero interakcja", które brzmi jak Zepsuty rejestr i jest naprawdę zajętym procesorem. Teraz czeka na zatrzask, który się budzi Wprowadza się do chwili zamknięcia(), dopasowując test rodzeństwa dwie metody w dół, oraz Zaparkowana nić zostaje przerwana w końcu bloku - nieudany bieg używany do wycieku Jedno śpiący non-daemon nici przez trzydzieści sekund i spowolnić wszystko po W tym kolejna próba tego samego testu. Trzy pełne apartamenty biegają Równocześnie: 257 przelatanych, trzy razy więcej.

  13. · kamo-internal

    Marka chroma wokół zarządu w pokoju podpisu

    Biurko było przyciemnione kolorem orgi i zmrokuło się w obu tematach, które umieściły markę pod dokumentem i pozostawiły chrome neutralne - Dokładnie do tyłu. Odwrócono: - CHROME jest głównym orgi po każdej stronie strony: nagłówek, docket - Kolej i dok. Każdy ślad na nim jest biały, przez jedną tokenową drabinę (--legal-on-chrome / -dim / -faint / -line) więc trzy regiony nie mogą się pokonywać Wymyśl ich własny pomysł „wtórny tekst na markę”. - DESK jest deską kreślarską — bardzo jasnoszary rządzi z 45 stopni Sekty aksonometryczne, w czystych gradientach CSS (brak zasobów, bez żądania, skale Do dowolnego portu widokowego). Zaczepianie w tle: lokalne wiąże kratkę z Przejrzała zawartość, więc podróżuje ze stronami. To celowo nie jest Wywodzący się z --kolorowo-pierwotny: biały org z bladą pierwotną Umyj powierzchnię, na której znajduje się dokument, a strona musi być odczytana jako papier Na powierzchni roboczej, nigdy jako papier o marce. Statyka jest tym, co Oddziela krawędź strony od tła, więc nie jest rysowana granica. - Cień strony to teraz dwa odlewy - szeroki miękki dla podnoszenia, ciasno Jeden dla krawędzi arkusza. Jedno rozmycie na powierzchni światła odczytuje się jako Smudge zamiast strony. - Kompletny węzeł doku jest solidny WHITE z kolorem org w środku, Odwrócenie węzłów i kolei dokładnie wtedy, gdy członkowie bankują pracę. Zielony Byłby trzeci kolor walczący z marką o jedno znaczenie. - Poświadczenie przesunęło się na tę samą deskę co biały arkusz z tym samym Podnieś, ponieważ oświadczenie jest również instrumentem i spada na równinę Panel odczytał jako opuszczenie pokoju. Jeden dzwonek, zawsze. Dokument jest właścicielem dolnego paska - tylko on wie Niezależnie od tego, czy pokazuje przędzarkę, bramę zgody, powierzchnię podpisu czy Przechwycony podpis - więc czarodziej podaje swój Back i Next sterowanie DOWN Zamiast układać drugi pasek pod pierwszym i rysować dok Sama sama tylko na etapie poświadczania. GuideBar zyskał „markowy ton” i a Gniazdo startowe do tego: na marce maluje chrom, upuszcza granicę i Cień, który przeciąłby pokój na pół, odwrócił jego pierścień i skreślił na biało, A jej pigułka czyta się w kolorze org. Jego allDone halo było zakodowane w twardo Sygnalista-app niebieski, niewidoczny na kolorowym doku. Bramy załadunkowe, nieudanej sesji, zgody i step-upu teraz trzymają biurko Pod nimi i dok pod ziemią, więc pokój nigdy nie traci ściany w połowie przepływu A Wstecz jest dostępny z ekranu, którego członek w przeciwnym razie nie może opuścić.

  14. · EmailService

    Udowodnij folder bez zmian z HIGHESTMODSEQ, a następnie podawaj go z indeksu

    Wpisuje listę wiadomości wspieranych przez indeks, naprawiając to, co czyniło ją niebezpieczną Zamiast przerzucać flagę. Stara czekowa porównana wiadomość liczy się i UIDNEXT. Obaj są ślepi na flagę Poruszając się i nic nie zmienia wiadomości, gdy ktoś czyta ją na telefonie, więc folder, który sprawdza się, może być obsługiwany z stanem odczytu każdej wiadomości Zamrożony w momencie, gdy przybył – skrzynka odbiorcza pokazująca pocztę lekturą jako nieprzeczytaną. To jest Dlaczego został wysłany niepełnosprawny. CONDSTORE ma numer, który się porusza. HIGHESTMODSEQ jest w całym folderze i Prowadzą się na wszystko w ogóle: przybycie, wymazanie, flaga ustawiona od dowolnego klienta Wszędzie indziej. Tak więc "w modseq N najnowsze wiadomości K zostały zindeksowane" plus świeży modseq N jest dowodem na to, że od tego czasu nic się nie zmieniło, w tym flagi. Zweryfikowany na temat serwer na żywo przed budowaniem na nim — /usr/libexec/dovecot/imap (2.3.20) CONDSTORE, QRESYNC i LIST-STATUS. UIDVIDIDITY jest sprawdzany obok, ponieważ Serwer, który go zmienia, zmienił numer danych i nic indeksowanego pod Stara wartość opisuje tę samą pocztę. STATUS Dżakarta Mail prosi tylko o pięć klasycznych przedmiotów, więc Formularz wydawany jest bezpośrednio, a odpowiedzi przedstawione tutaj – w trakcie testu, przeciwko Dosłowne dane z drutu, ponieważ ta jedna liczba jest całym argumentem bezpieczeństwa. Punkt kontrolny mieszka w Redis, a nie w tabeli. Jest to znacznik synchronizacji, którego poprawność Zachowanie na stratach jest "zapomnij o tym i ponownie przeczytaj", więc jednostka biblioteka współdzielona, Migracja i bieg KamoInitializer byłyby za to niewłaściwą ceną. Bez pracy zasyłej, celowo. Gdy dowód nie powiedzia się, żądanie odczytuje z IMAP Dokładnie tak, jak wcześniej i podaje wynik z powrotem, aby zostać zindeksowany, więc foldery wypełniają jako Patrzy się na nie – ten sam porządek, w którym jest szybka, i nic, co Może uciec na każdą skrzynkę pocztę na platformie. To również odnosi się do tego, dlaczego Byłoby to wcześniej bezcelowe: indeks posiadał łącznie 31 rzędów. Dwa zamówienia mają znaczenie i oba zawodzą tylko w jednym kierunku. Przechowywane modseq jest Ten czytał przed posłem, nigdy po tym, więc zmiana lądowania w środku opuszcza Punkt kontrolny stojący za rzeczywistością i kosztuje jeden zmarnowany pobranie - odwrotna para Aktualny modseq z nieświeżą pocztą. A wiersze już w indeksie mają tylko ich flagi zostały zaktualizowane, nigdy ich ciało, ponieważ rzęd, który napisał pełny indekser Przenosi wyszukiwanie tekstu jest zbudowane, a odbudowanie go z koperty Spokojnie wyrzucają wiadomości z wyszukiwania, jednocześnie szybciej sprawiając, że lista jest szybsza.

  15. · kamo-shared-library

    Mapa jest/na odpowiedzi, teraz, gdy kolumna istnieje

    KamoInitializer dodany w dniu 2026-08-13 - zweryfikowane w Yugabyte: boolean, default Fałszywy, bez nulls). Mapowanie jest teraz bezpieczne i nie było to wcześniej - fullTextSearch jest Natywnie SELECT - którego wiersze Hibernacja nawadnia się w tej klasie, więc kolumna jest Brak tablicy, w których nie ma breaks, wyszukiwanie e-mail, a nie tylko pisze. Dlatego tak się potoczyło Wylot i wrócił kilka godzin temu. SearchIndexService rejestruje go z tej chwili, więc nowo indeksowane wiadomości niosą wszystkie Trzy flagi IMAP, a nie dwie.

  16. · EmailService

    Podawaj listę folderów z indeksu, gdy może udowodnić, że jest aktualny

    Wiersze za listą wiadomości są już w Postgres - indeks metadanych przechowuje nadawca, temat, datę, rozmiar, załącznik i flagi dla każdej wiadomości, którą ma Widoczne było to. Czytanie strony z niej jest jednym zapytaniem; czytanie jej z IMAP jest SELECT plus pięćdziesięciu koperty FETCH i sprawia, że serwer buduje indeks skrzynki pocztowej na Odpowiedz. To, co powstrzymało każdego, kto go używał, to nie prędkość, ale zaufanie. Indeks jest wypełniony przez Popychaj indekser, który działa tylko wtedy, gdy ktoś ma otwartą skrzynkę pocztową, więc jest Dozwolone do arbitralnego bycia nieświeżym i nic nie odróżnia bieżącego folderu od Nieświeży. Jeden STATUS je wyróżnia. Jest to najtańsza odpowiedź IMAP – nie SELECT, brak danych wiadomości — i zwraca liczbę wiadomości folderu i następny UID. Indeks jest używany tylko wtedy, gdy oba pasują do tego, co posiada: liczba połowów Wszystko dodane lub usunięte, a maxUid + 1 UIDNEXT łapie etui na temat liczby Nie widzi, gdzie przybyło tyle, ile zostało usuniętych. UIDNEXT tylko idzie do przodu, więc Dodatki, które nie trafił indeksu, pozostawia go powyżej najwyższego UID indeksu Wie, że wie. Każdy inny wynik wraca do IMAP: brakujący folder, serwer, który dekoduje STATUS, pusty indeks, błąd bazy danych. Najgorszym dostępnym rezultatem jest Zachowanie, które istniało wcześniej. Folder, który nie zda egzaminu leczy się sam Kiedy pojawia się następna wiadomość i jest indeksowana. Wyłączone domyślnie za - ponieważ odpowiedź Wskaźnik zależy od search_index.is_answered, który nie istnieje, dopóki nie KamoInitializer już działa. Włączanie go jest wtedy celowym aktem, a nie Efekt uboczny rozmieszczenia. Orzeczony umowa jest tam, gdzie bycie źle pokazuje komuś niewłaściwą pocztę, więc Jest czysty, pakowy-prywatny i testowany z tego kierunku - każdy przypadek pyta, czy Może korzystać z indeksu, gdy nie może.

  17. · InitializerService

    Dodaj is_answered do indeksu wyszukiwania poczty

    Dodaje - tak więc indeks rekorduje wszystkie trzy Flagi IMAP zamiast dwóch. Lista wiadomości rysuje z tego znacznik odpowiedzi Po pierwsze, a notowania za pomocą indeksu w EmailService nie mogą być włączone, dopóki nie - Kolumna istnieje. Zamów 0, z zwykłego powodu: SearchIndexEntity mapuje kolumnę od chwili obecnej Zbudowana jest wspólna biblioteka, więc każdy biegacz, który ładuje ten podmiot Emisja go w swoim SELECT i ddl-auto nie mogą dodać go dla nas. Późno zamówiony biegacz Nigdy nie wykona egzekucji – wcześniej umarłby na „kolumnie nie istnieje” i Ucień z nim bieg. Nullable z domyślnym FALSE i zasypaniem istniejących wierszy. Nie czytaj z powrotem Z serwerów pocztowych: false jest już odpowiedni dla przytłaczającej większości Wiadomości, a ścieżka odczytu odmawia podania jakiegokolwiek folderu, którego nie może jej udowodnić. zgadza się z serwerem, więc wiersz, który jest nieświeży tutaj, to rząd, w którym nie będzie Używaj. Ponowne doprecajowanie go poprawia.

  18. · kamo-shared-library

    Rekord, czy wiadomość została udzielona w indeksie pocztowym

    e-mail_metadata.search_index przeniósł się is_read i is_starred od czasu, gdy był Stworzona, ale nigdy trzecia flaga IMAP, odsłuszona. To było nieszkodliwe, gdy Indeks zasilał tylko wyszukiwanie pełnotekstowe, co nie dba o to. Przestanie być nieszkodliwe teraz, gdy indeks może obsługiwać stronę folderu Bezpośrednio: lista wiadomości pobiera swój znacznik odpowiedzi z tej flagi, więc wiersz Służył z indeksu bez niego stwierdzałby, po cichu i niesłusznie, że Posłownik nigdy nie odpowiedział na tę wiadomość. Kolumna jest dodawana przez KamoInitializer's - i Nie istnieje, dopóki to nie uniknie – dlatego ścieżka odczytu, która jej potrzebuje, jest Za flagą, która nie wysiada.

  19. · kamo-internal

    Wskaźnik zegara zużywa ten sam puls, co zgodność z przepisami

    Zegar dziurkaczy tchnął czerwoną, promieniową świecę, podczas gdy obowiązki odznaiają trzy Piksele do lewej pulsowały dwa rozszerzające się pierścienie. Obie kontrole pytają o Członek, aby coś zrobić, i dwie różne animacje, które się zamykają Przeczytaj razem jako dwa niepowiązane systemy - każdy z nich uczony osobno. Animacja jednego pierścienia służy teraz obu, więc klatka klucza jest przemianowana na Obowiązki cechują się, że się zaczęło. Zmniejszony ruch nadal je degraduje Inaczej, ponieważ nie tracą tej samej ilości: odznaka się liczy i Błąd nadal mówi "jest coś winien", więc te pierścienie po prostu się zatrzymają; nic Na ekranie mówi "jesteś poza zegarem", więc jeden trzyma pojedyncza Pierścień otwarty z stałą intensywnością i upuszcza jeden z nich.

  20. · kamo-internal

    Na ekranie nie jest to samo, co czytanie

    Rozmowa wsparcia została oznaczona, odczytano natychmiast jej okno załadowane, więc to Coś w rodzaju okna, które nie może się nie liczyć jako czytane – takie, które samo podnosi się, z a Przypisanie, przypisanie lub przybycie odpowiedzi – oczyściło odznakę przed Posłonowi spojrzał na wszystko. iFocused nie może odróżnić tych od siebie: pochodzi z z-order i okno, które Właśnie otwarta jest najgórą przez budowę. Myszka i przystawka powłoki są Jedyne sygnały w systemie, które oznaczają, że dana osoba coś zrobiła, więc dostawca Teraz ogłasza je jako narzędzie:userFocus z jednego miejsca obydwoma ziemią. Z tego, reguła opisana przez członka: Otwarte celowo czytane, gdy tylko się załaduje Podniesiony przez siebie nieprzeczytany, aż dotkniony Dotknięty odczyt, oba stemple Przeniesiony do Ciebie ponownie nieprzeczytany, nie jest wymagana żadna nowa wiadomość Dwa znaczki, ponieważ istnieją dwa sposoby nieprzeczytania i każdy musi zostać oczyszczony: MarkAsCzytaj przesuń odczytywane przez wiadomości żądającego, oraz Otwarte zadania przechodzi na emeryturę. AssignedTicketOpener nie oznacza już Przekazywanie, gdy podnosi okno - to był błąd w miniaturze, Przyznając, że agent widział coś, czego nie widział. Jego per-tab Zamiast tego straż niesie ciężar. TicketChat jest posłuszny okno, zamiast decydować o sobie, w tym Wiadomości, które przychodzą, gdy są otwarte: punkt zwrotny w rozmowie Czownikiem jest członkini, jeden lądowanie za nimi nie jest.

  21. · MediaService

    Nieprzeczytany oznacza, że zażądał odzył, lub bilet właśnie stał się Twój

    Odznaka liczyła "nawecz bilety, których nikt nie odebrał, plus te, które trzymam" - Prześledzona wiadomością, a ona spadła tylko wtedy, gdy bilet osiągnął status terminala. Tak, więc Usiadła o piątej nad listą, która nic nie oznaczała, a otwarcie rozmowy poruszyło się Ani też. Teraz liczy się to, co mówi: rozmowy z czymś w nich Ten członek do czytania. Obie połówki starego orzecznika zniknęły. Unread to jedno natywne zapytanie udostępnione Lista biletów, więc liczba i oznaczone wiersze są tym samym faktem, a nie Dwa przybliżenia, które dryfowały dwa razy. Przejmowanie się na emeryturę nadaje teraz odznakę. Jest to jeden z dwóch sposobów Rozmowa przestaje być nieprzeczytana, a bez transmisji numer pozostał na miejscu W przypadku braku nowych komunikatów w nim – co jest dokładnie w tym przypadku Znaczek przekazania istnieje dla. Odznaki poruszają się wraz z nią: nie mają już dwóch połówek HQL, ale twierdzą Co oznacza liczba – rozmowa druga strona napisała w liczbach, jedna tylko Przekazywany liczy się nawet z niczym nowym, a każdy bilet liczy się raz Jakkolwiek wiele sposobów się kwalifikuje.

  22. · kamo-shared-library

    Jedna z definicji nieprzeczytanej rozmowy poparcia

    Odznaka navtop i lista biletów dwukrotnie się od siebie oddaliły, odpowiadając. Różne pytania. ZnajdźUreadStateForViewer jest pojedynczą odpowiedzią, którą teraz czytamy, Nie mogą się ponownie nie zgodzić. Nieprzeczytany oznacza, że druga strona rozmowy przemówiła, a ty nie patrzyłeś. Dla przydzielonego agenta, który jest w szczególności REQUESTOR, mówiący — a Notatka kolegi na tym samym bilecie nie jest czymś, na co agent odpowiada, Nie podnosi więc flagi. Dla wnioskodawcy jest to każdy po stronie wsparcia. Każdy Inaczej nie jest stroną rozmowy i nic nie widzi, dlatego zapytanie Jest on eliminowany przez rolę, a nie przez org: na wniosek cross-org odpowiada agent W innym orgu niż osoba, która go wychowała, więc ani strony org nie Identyfikuje oba. PrzejścieUnread jest drugim sposobem, aby być nieprzeczytanym, bez żadnych nowych wiadomości. Bycie rozdanem rozmową jest tym, czego nie widziałeś, więc Przesunięcie wyłapuje nieprzeczytane, ale stare jest jego ostatnia wiadomość – w przeciwnym razie bilet został przeniesiony Do ciebie rano pozostaje niewidoczny, dopóki klient nie przemówi ponownie. przyp.nia,Otwarcie już dokładnie to: oczyszczenie z każdego (ponownego) przydziału, Opieczętowany tylko wtedy, gdy agent naprawdę umieści go na ekranie. RESOLVED pozostaje uprawniony do celowego. Prośba o odpowiedź na coś agenta Oznaczone rozwiązanie jest sprawą najbardziej wartą dotarcia, a ten, który by to zrobił. W przeciwnym razie należy po cichu upuszczać; tylko zamknięte i VOID go kończą.

  23. · kamo-internal

    Daj rozszerzoną szynę zamiast strzałek końcowych

    Strzały w górę / w dół istnieją, ponieważ zawalona szyna to 80px płytki bez Pomieszczenie do wydania na cokolwiek innego. Rozszerzona, szyna wynosi 248px i opcje Czytaj także jako lista – tam strzałki są gorszym instrumentem: mówią tylko "więcej w ten sposób", gdzie pasek przewijania mówi, o ile więcej i gdzie w nim jesteś Są już, i unoszą się na dwa rzędy zamiast siedzieć obok - Idzą. Więc scroller teraz bierze "affordance", a NavPri prosi o pasek przewijania Za każdym razem, gdy szyna jest szeroka (trwała ekspansja lub żywy unoszący się-peek). Wszystko inne o pasku jest niezmienione w obu trybach: chwytanie i rzucanie, Koło, dotknij i przewijając opcję bieżącej strony w widoku. Dwa szczegóły dotyczące sił przełącznika: - miękka krawędź stoi, ponieważ maska maluje pasek przewijania elementu Wraz z jego treścią i blaknięciem nad końkami baru oznacza to Aby towarzyszyć wygląda jak wada renderingu; - zachwyć się teraz ignoruje prasę, która ląduje na rynsztoku. Chrome Dostarcza tam pointer, więc bez niego jeden przeciągnięcie kciuka ruszył Pasek dwa razy — przeglądarka przewija go w jedną stronę i uchwyt na patelnię Drugi.

  24. · kamo-internal

    Użyj prawdziwych logo dostawców płac na kartach dostawców

    Dodaje dziesięć aktywów dostawców i renderuje je w miejsce znaku literowego Zapasy. Są to WORDMARKS, a nie kwadratowe ikony, takie jak zestaw dostawcy poczty e-mail, i ich Współczucia kształtów wynoszą od 0,72:1 (Dayforce, wyższy niż szeroki) do 6,21 (Paychex). Płytka kwadratowa kart e-mail 44px zgnieci większość z nich i zmniejszy szerokość Swoimy do nieczytelnego rozmazu, a granica narysowana wokół znaku słownego brzmi jak Błędy zamiast ramki. Znak renderuje teraz w stałej górze HEIGHT z automatyczną szerokością i własną Współczynnik proporcji, ograniczony, więc Paychex nie może zdominować karty. Jedna konsekwentna wysokość W dziesięciu różnych kształtach sprawia, że siatka wygląda na celową. Każdy składnik aktywów Wymiary wewnętrzne viewBox są rejestrowane wzdłuż jego ścieżki, ponieważ następny / obraz Potrzebują, aby zarezerwować odpowiednie pole — wręczając mu kwadrat dla zasobu 6:1 Powstawa dokładnie to zniekształcenie, którego to unika. Na karcie logo bierze własny wiersz nad nazwą i chipem statusu, a raczej Zamiast siedzieć obok nich, jak ikona. Logo jest oznaczone dekoracyjne wszędzie tam, gdzie nazwa dostawcy jest renderowana obok niego, Tak więc czytnik ekranu odczytuje nazwę raz, a nie dwa razy; płytka z napisem Pobyty dla GENERIC_CSV, który jest stanem połączenia, a nie dostawcą i ma Nie ma aktywów.

  25. · kamo-shared-library

    Noś, czy bilet jest jednym z przedmiotów, które liczy odznaka podparcia

    Odznaka navtop i lista biletów odpowiadały na różne pytania i Nikt nie mógł powiedzieć. Odznaka liczy przedmioty oczekujące na uwagę - w przeważającej mierze Bilety nikt jeszcze nie odebrał, co jest faktem o BILECJI. Lista Oznaczone nieprzeczytane wiadomości na czacie, fakt o jej CONVERSATION. Więc odznaka czyta "5" nad listą, która nic nie oznaczała, a te dwie liczby nie miały żadnych widocznych Relacja. Potrzeba Uwaga przeprowadza własny test członkowski na odznakę w wierszu, więc lista może Oznacz dokładnie, co liczy odznaka. niewidocznePostępujeTK: "Ktoś powiedział Coś, czego nie przeczytałeś" jest warte pokazania, a to nie to samo To coś, co „nikt nie radzi sobie z tym”.

  26. · kamo-internal

    Utworzenie dostawcy płac i mapowanie osób do listy płac na rejestrację

    Zastępuje zakładkę zastępczy HRS Overview na rzeczywistą rzecz. Zakładka jest już teraz "Provider Setup" i ekran to "Ustawienie dostawcy płatności", po tym jak Ekran dostawcy poczty e-mail jest wzorowany - klucza tabu pozostaje "przegląd" więc Menu ustawień, karta startowa i każda istniejąca zakładka nadal działają. Zbudowany tak, aby administrator HR bezzałogowego tła technicznego mógł odpowiedzieć na trzy Pytania bez zadawania nikomu: czy to jest połączone, czy to zsynchronizowało, i jest Teraz wszystko, co jest złe, dobrze. - Karty dostawcy pokazują, co każdy sprzedawca może zrobić przed zatwierczeniem orgi, Wybór jest raczej porównaniem niż zgadywaniem, a nieobecna zdolność to Widoczne z przodu zamiast odkrywać w dniu płac. - Forma uwierzytelniania jest renderowana z schematu pola BACKEND. Dodawanie a Pole do sprzedawcy to jedna zmiana języka Java zamiast nowego komponentu React — Ekran e-mail ręcznie zapisuje jeden komponent na dostawcę i ma dwanaście. - Tajemnice nigdy nie są wysyłane z powrotem do przeglądarki, tylko flaga "to jest ustawiona" i Pudełko puste oznacza raczej niezmienione niż przezroczyste. - Panel zdrowia prowadzi z dwoma drogami godzinami po cichu, nie dociera Płace - rozpakowane osoby i niemappede kody zarobkowe - ponieważ oba są Niewidoczne w tym czasie i tylko widoczne jako skarga o wypłatę. - Częściowy bieg to jego własny kolor. "412 z 415 osób" nie jest sukcesem, nie Porażka i oddanie jej, jak to się dzieje, że ukrywa trzech nieopłaconych ludzi. - Uruchamiaj szczegóły nazw osoby i poprawki, a nie śladu stosu. Kody emisji są Z serwera jako stabilne tokeny i są zlokalizowane tutaj. Zapisy zyskują kolumnę mapowania listy płac, ponieważ rekrutacja kogoś i Mówienie, kim są, to jedna praca. Automat proponuje dokładny e-mail Równość i potwierdza człowiek – imię nie jest tożsamością i złym ogniwem Wysyła godziny jednej osoby do wynagrodzenia innej osoby. Już uznany dostawca Rekord pozostaje widoczny, ale nie do zauważenia. Ten ekran również nie miał żadnych tłumaczeń i renderował surowy 19-cyfrowy członek Ids; oba naprawione, z nazwą wyświetlacza wyekstrahowaną na hak od każdego Ekran kartki zegara ma tę samą lukę. Zaawansowana konfiguracja platformy zyskuje siedmiu dostawców płac, w których Kamo posiada jeden Rejestracja partnera. Namyślnie nie ma karty dla Dayforce, Workday lub UKG: Wydawanie poświadczeń na klienta, a ekran renderuje kartę dla każdej enum Stałe, więc jeden dla nich byłby formularzem, którego żaden operator nie mógłby wypełnić. RoleRightType mirror zyskuje 197, 198 i 199 – dwa pierwsze istniały po stronie serwera I już tu zabrakło, więc kontrolna nie miała żadnego wpisu.

  27. · InitializerService

    Indeks i REVOKE tabele płac-provider

    Co Hibernate nie może wyrazić dla nowych tabel hr_timecard_payroll_. Dwa REVOKEs. PayrollDispatch i PayrollSjncsssue odmów aktualizacje i usuwa w nim Java przez "PreUpdate / PrereUzupełnienie, ale oddzwonienia do jednostki strzelają tylko dla rzędów Załadowany w kontekście trwałości — masowe JPQL, usuwanieAllInBatch() i natywnych SQL Spacer prosto obok nich. Próba transmisji płac jest wydarzeniem finansowym, a Dowody na temat ukończonej synchronizacji muszą przetrwać, aby być dowodem. Dwa indeksy częściowe, które jednostka nie może przenosić, ponieważ mają predykty: Lista prac zamiatania (orgs z włączoną synchronizacją i zsynchronizowanym, małym Mniejszość wierszy) i błędy synchronizacji naczłonkowe (rzędyERROR, przewyższane przez INFO Mniej więcej w rozmiarze składu). Stosowany i zweryfikowany przeciwko Yugabyte.

  28. · kamo-internal

    Rozmiar załącznika według tego, co faktycznie posiada API dostawcy

    Kompozytor trzymał każdy DM towarzyski na płaski 10 MB, co jest zdjęciem Telegrama Limit stosowany do czterech dostawców, którzy go nie udostępniają. Każdy z nich ma teraz swoje własne sufit, a w ramach dostawcy każdy typ nośnika ma swój własny, gdzie API Dzieli je: Telegram 10 MB zdjęcie, 50 MB dokumentu/wideo/audio (sendPhoto vs sendDocument) Messenger 25 MB, taki sam dla każdego rodzaju Instagram 8 MB obrazu, 25 MB wideo/audio/plik Discord 8 MB (sufit typu bot upload) X bez załączników w ogóle Nieznany 8 MB, najwęższy z powyższych Są to granice API, które umieszczają każdy wpis w adaptera, NIE z aplikacji konsumenckiej To samo imię. Oba różnią się i mają znaczenie: aplikacja Messengera podniesiona plik Udostępnianie do 100 MB, podczas gdy jego Send API jest udokumentowane pod numerem 25 MB i jest to API Numer, który decyduje o tym, czy klient otrzyma plik. Sizing do aplikacji Postać sprawi, że kompozytor zaakceptuje coś, co Meta, a następnie odmawia, długo po Agentowi powiedziano, że wyszedł. X nie dostaje spinacza do papieru, a nie takiego, który odrzuca wszystko: XAdapter WyślijImage i sendMedia, które trafią do SendText - przesłane media nie było Zakres v1 - więc dołączony plik nie poszedłby donikąd, gdy pojawił się podpis - Sam w pojedynkę. Własny dostawcaCapabilities mówi to samo. AttachmentPolityka rośnie w tym celu, w tym celu, kluczowany przez nową czterowartość Klasa załączników (obraz/wideo/audio/plik), która pasuje do tego, jak dostawcy dzielą się swoimi Punkty końcowe i jak MediaService prowadzi media wychodzące. SVG jest plikiem w obu.

  29. · DaemonService

    Nightly payroll-provider syncc pracy

    Napędy TimecardService's - które synchronizują się Każda organizacja, której następna synchronizacja jest należna. Cron mieszka tutaj, a nie w TimecardService, ponieważ to wdrożenie jest RollingUpdate z maxSurge 1, więc dwie kapsuły pokrywają się na każdym rolloutie i a Metoda zaplanowana dwukrotnie się rozpala – co dla synchronizacji płac oznacza dwa impulsy W tych samych godzinach. DaemonService to repliki 1, strategia Recreate. Zaplanowane o 03:00, czterdzieści minut po zamiataniu karty czasowej: te zamknięte Przesuwanie i wykrywanie wyjątków oraz wysyłanie godzin do dostawcy płac przed Przekażą liczby, które wkrótce się zmienią. Odmawia biegania na pustym mlos.internal-auth-secret, zamiast wycinać false Sukces - synchronizacja płac, która po cichu nigdy nie działa, wygląda dokładnie tak, jak Nie znaleziono nic do zrobienia, a różnica polega na okresie płatności, w którym nigdy nie Dotarł do dostawcy.

  30. · SecurityService

    Na granicy autoryzacji konfiguracji dostawcy płac

    Przekaźnikuje nową powierzchnię i egzekwuje, kto może - Dojście do niego. TimecardService posiada silnik i nie ma sesji; to jest Sesja i decyduje. SecurityService uruchamia dowolną żądzę (.. nastarczujAll() z ręcznie walcowane na ręczny auth, więc opiekun, który zapomina, że jego straż nie jest słaby Kontrolowany – jest niekontrolowany i osiągalny z publicznego Internetu. Nakreślony pod istniejącym prefiksem /api/payrolla celowo: kamo-internal Dotarł do niego przez całą trasę BFF, a nowy prefiks miałby 404 w Przeglądarka, podczas gdy każda usługa jest zdrowa, a każda budowa jest zielona. Cztery poziomy: - MANAGE_PAYROLL_PROVIDER (199) pisze referencje i łączy lub rozłącza OAuth. Jest to zdolność do decydowania o tym, gdzie godziny organizacji są Przekazywana, dlatego jest ona sama w sobie. - MANAGE_HRS_SETTINGS (45) odczytuje połączenie i jego zdrowie. - MANAGE_TIMECARDS (183) obejmuje mapowanie pracowników i historię synchronizacji. - FINALIZE_PAY_PERIODS (198) przekazuje zamierzoną partię — ten sam poziom, co Popełnianie eksportu, ponieważ jest to ten sam czyn. Test Connection znajduje się z odpowiednim napisem, a nie z odczytu: jest to Wychodzące połączenie wykonane z przechowywanych poświadczeń i umożliwienie każdemu, kto może zobaczyć Wystrzelenie strony daje im sposób na zbadanie dostawcy płac org. Wymiana OAuth nie wysyła do przodu org id. TimecardService wyjmuje go z Państwo podpisane przez HMAC, więc kod uzyskany dla jednego najemcy nie może zostać wykorzystany Na innego nawet przez dzwoniciela trzymającego prawo w obu. Dodaje put/delete do TimecardServiceClient, który miał tylko get/post.

Twój wszechświat czeka.

Rozpocznij bezpłatnie w kilka minut.Dodaj produkty, kiedy tylko będziesz gotowy — bez migracji, bez nowych logowań.

Bezpłatne na zawsze — nie wymaga karty kredytowej