Журнал изменений
Что нового.
Каждое усовершенствование платформы, как только она появится.
· kamo-signer-monorepo
Показать назначенного агента на копии клиента
Соответствует предварительному просмотру персонала: бланки наименований организации, это имена человека, чтобы спросить.
· kamo-internal
Показать назначенного агента на предварительном просмотре
Панель «Ваш контакт» над нижним колонтитулом — имя, название, телефон и электронная почта — так что клиент Мы знаем, кого спросить о цене. Отсутствует полностью, когда лидерство не назначено.
· SecurityService
Разрешить агента вместе с клиентом, от одного ведущего поиска
Оба блока отходят от одного и того же свинца, поэтому контроллеры берут его один раз и выводят каждый из них. От него вместо того, чтобы ударить по сервису дважды за рендер. По-прежнему орг-скап в обоих места; на публичной странице область исходит от собственной организации ссылки.
· kamo-shared-library
Наименование агента свинца в документе
Заголовок идентифицирует организацию, но у клиента возникает вопрос о ценовых потребностях. Человек, который владеет отношениями. Цитата теперь несет назначенного агента свинца - Имя, должность, рабочая почта и рабочий телефон. Контактные данные только для работы: цитата несет в себе бизнес-идентификацию агента, никогда не Личный номер, который находится в их записи. Название работы предпочитает jobTitleOfficial, который организация выбрала для печати, перед связанным JobTitle. Неназначенный лид или агент, у которого ничего не записано, не дает никакого блока, а не является одним из основных компонентов. "Ваш контакт" направляется через пустое пространство. Разрешение имени повторно использует **************** тот же путь уже использует для назначенного сотрудника по кредиту, поэтому цитата называет агента точно так же, как Остальная часть ведущего взгляда.
· kamo-internal
Переназначьте агента, у которого есть возможность
Диалог одобрителя получает агента, выбранного из того же пула бэкэнда. валидирует против. Колонка Агента сетки теперь показывает, кто имеет возможность, с янтарной подписью «Снят с ...», когда это больше не агент, который Запрашивающий остается на записи и в истории в любом случае. Контроль за головкой также следует за держателем. Он отключил запрашивающего, который после переназначения предложил бы агенту расширить диалог Тот, кто больше не владеет им и скрывает его от того, кто это делает, и задние ворота Это конечная точка на держателе, поэтому предложение закончилось бы на 403.
· SecurityService
Переназначьте управляющего и напишите всем, кого это касается
Одобритель теперь может дать возможность другому агенту. Запрашивающий является Никогда не переписывайтесь — AppPrimaryAgent записывает этот шаг как свой собственный исторический ряд. Оба названия, так что шесть месяцев спустя запись показывает, что он двигался, а не Читаю так, как будто его попросил новый агент. Владение расширением, руководитель контроль и маска детали теперь следуют за держателем; фильтр «Агент» совпадает Окончание переназначения, потому что оно скрывается от агента, который его нашел. От агента, который держит его оба неправильные ответы. Девять уведомлений охватывают жизненный цикл. Запросы и запросы на продление идут на каждый, кто может их решить, — оба права на принятие решений, поскольку член, который может только Отрицание никогда бы не узнало, что существует просьба отрицать. Решения и правки идут держателю, первоначальному запрашивающему, когда это отличается, и каждому коллеге по разделение комиссии; редактирование дополнительно отправляет письма тем, кого оно переместило, потому что проигрывает Комиссионное молчание — это именно то, для чего предназначены эти электронные письма. Две вещи являются несущими в том, как посылка секвенирована: - Разрешение и рендеринг происходят БОЛЬШЕ, внутри транзакции абонента, в то время как Компания по-прежнему сохраняет ценности, о которых идет речь в электронной почте. Утвердить продление() поля расширения сразу после этого, поэтому в последующем чтении будет описано "нет" дополнительное время" на электронную почту, тема которой - сколько времени было предоставлено. The SENDING Waits For **************** Объявление решения что более поздний отказ оставит агентов, держащих электронное письмо для Одобрение, которое никогда не случалось, и после завершения, а не после завершения означает Подключение к базе данных высвобождается до запуска исходящего HTTP. Значения подробных таблиц ускользают в точке, в которой они входят в карту: имена членов введённый в форму свободный текст, таблица вводится как сырой HTML, и рендер ускользает Ничего. Редактирование, которое ничего не меняет, не отправляет почту и резервирование PENDING Он не посылает никаких «обновлений» — никому еще не сказали, что он существует. 60 тестов.
· EmailService
Просмотр образцов для девяти уведомлений о возможностях
Без руки здесь администратор Email Templates редактор отображает каждый заполнитель Так что любой, кто настроит эти девять, будет редактировать пустой скелет. Одна рука для всех девяти: они имеют общую переменную, установленную по дизайну, поэтому одна карта образца И каждый из них – верный. Map.ofEntries потому что Map.of caps в десять Пары и набор больше, чем это.
· InitializerService
Переназначенный первичный агент по зарезервированной возможности
PRIMARY AGENT MEMBER ID - это тот, кто имеет возможность сейчас; REQUESTED BY MEMBER ID Остается нетронутым навсегда. Nullable with no backfill on purpose — нулевые значения «никогда не переназначен», и копирование запрашивающего в существующие строки уничтожит Это различие в каждой оговорке, предшествующей колонке. Применяется против производства 2026-08-04; колонка и индекс проверены.
· kamo-shared-library
Переназначенный основной агент и девять шаблонов уведомлений
Одобритель может передать возможность — и комиссию с ней — другому. Агент. PRIMARY AGENT MEMBER ID - это тот, кто держит его сейчас; REQUESTED BY MEMBER ID Никогда больше не писал, потому что тот, кто нашел сделку, является фактом о прошлом. Перезапись стерла бы единственную запись, которую принес ей первоначальный агент. Null означает «никогда не переназначенный», что отличается от «переназначенный». «Назад к запрашивающему» — поэтому существующие строки оставляют в покое, а не заполняют обратно. AgentMemberId () является держателем, и это то, что теперь решает, кто может попросить. Расширение и кто главный заголовок относится как владелец. Однажды возможность оригинальное имя в истории, а не претензия на него. Девять канонических шаблонов охватывают жизненный цикл: запрос или запрос на продление для всех, кто может принять решение; каждое одобрение, отказ, редактирование, решение о продлении; истекает и закрывается агент, держащий его, агент, который спросил, является ли это сейчас Кто-то другой, и каждый коллега по комиссии разделился. Они делят одну сгенерированную оболочку, поэтому макет не может дрейфовать между ними, и одна Настройка переменной, чтобы шаблон мог ссылаться на что угодно без соответствующего изменения Java - что имеет значение, потому что отсутствующая переменная отображается в виде пустой строки с только Предупредите и отправьте электронное письмо с надписью «резервировано до».
· kamo-internal
Общая комиссия, дефолты рынка и отсутствие выбранных единиц
Три изменения в способе захвата комиссии. Предвыборов больше нет. Процент/сумма и одноразовый/повторяющийся Начните расстраиваться на каждом разделении комиссии, поэтому каждая из них указывает свой тип, потому что Кто-то так сказал. Предварительно выбранный «процент» неотличим от рассматриваемого Разница между 15% от продажи и $15 - это вся выплата. Отправка остается отключенной до тех пор, пока не закончится начатый ряд. Утверждающий теперь соглашается на ОБОЛЬШУЮ комиссию — что организация платит за Продажа запрашивающему агенту и группе, с которой они делятся. Разрывы между коллегами вырезаны. Он появляется в диалогах утверждения и редактирования и как столбец в зарезервированном списке, и рынок может нести дефолт, который предварительно заполняет его. Рыночные дефолты предварительно заполняют только ПРОВОД. Посещение правки с рынка будет Пусть экономия, которая была о дате штамп на комиссии никто не согласился, и будет Сделать «без комиссии» невозможно. Очистка предварительно заполненной фигуры теперь отправляет Явная четкая комиссия, отслеженная относительно того, с какой формой OPENED, а не что хранится — в противном случае удаление предварительно заполненного по умолчанию ничего не отправляет и Сервер услужливо возвращает его обратно. Полузаполненный дефолт рынка теперь блокирует сбережения вместо того, чтобы упасть и сообщили об успехе; колонка комиссии больше не изобретает "одноразовый", когда не было установлено каденции; разделенные суммы в инструменте используют то же форматирование денег, что и и Add Market очищает поля котировок, которые он унаследовал от последнего Отредактированный рынок.
· SecurityService
Согласовать общую комиссию при одобрении, посеянную с рынка
Одобритель теперь записывает, что организация платит при продаже запрашивающему Агент и его группа. Откажитесь от него на одобрение, и на рынке свинца применяется дефолт - Это то, что заставляет рынок устанавливать дефолт, а не только предложение. Это честь. Комиссия устанавливает три поля вместе и никогда не объединяет их полевыми методами. с тем, что хранится. Слияние выглядит безвредным и не является: редактирование несет только Тип акции перевернет хранящиеся 15 с пятнадцати процентов до пятнадцати долларов. Переназначение выплаты, которую никто не хотел трогать. Недействительный или наполовину сконфигурированный рыночный дефолт регистрируется и игнорируется, а не брошен. Дефолт — это удобство, а не закон, и один из них спасен другим путем. с нелепой фигурой не должно перерасти в неодобряемое перебои рынка — Утверждающий все еще может ввести комиссию, и утверждение без нее является законным. Четкая комиссия выполняется раньше всего, включая дефолт рынка: Одобритель, который удаляет предварительно заполненную фигуру, принял решение и тихо Положив его обратно, вы повернете его обратно. 49 испытаний, включая четкие пути, охрану слияния и оба случая неисправности.
· InitializerService
Комиссионные столбцы для резервных возможностей и рыночных дефолтов
Шесть нулевых колонок: общая комиссия согласовала зарезервированную возможность, и рынок по умолчанию, который предварительно заполняет его при одобрении. NUMERIC (19,4), чтобы соответствовать Разделенная таблица — деньги являются точными десятичными или комиссионными спорами. Применяется против производства 2026-08-04 гг.; все шесть подтверждены.
· kamo-shared-library
Общая комиссия по продаже и дефолты рынка по ней
Зарезервированная возможность теперь записывает, что организация платит из продажи. Запрашивающий агент и группа, с которой они делятся, — кастрюля для коллеги Расколы вырезаны из. Ведущий рынок несет дефолт, который предварительно заполняет его, когда Одобрение предоставляется. Каждый столбец является нулевым без дефолта. Оговорка, которую никто не одобрил, не имеет согласованная комиссия и рынок, который не настроен, не имеет дефолта; Написание нуля в любой из них поставит цифру, которую никто не выбрал, на рекорд выплат. Трех заявок было бы недостаточно. Поле JSON и отсутствующее поле То же самое происходит после десериализации, и отсутствие уже означает два других. вещи здесь — «использовать дефолт рынка» на одобрении, «оставить его в покое» на правке. Так ясно, что комиссия говорит удаление вслух; без него одобритель, который удаляет Комиссия получает молчание, и после одобрения дефолта, который они только что очистили, возвращается. LeadIdentity выигрывает рыночные дефолты, а findIdentities теперь прописывает его Слева. Написанный как неявный путь l.market.x, Hibernate излучает INNER. присоединяйтесь, и каждое лидерство без рынка полностью выпадает из прогноза. Это было бы «неназванным лидером» в тех же рядах, на которые никто не смотрит дважды.
· kamo-internal
Отображение деталей клиента на предварительном просмотре, от лидера
Удаление собственных полей адресата цитаты оставило «Подготовлено» пустым, потому что Имя клиента когда-либо исходило только из связанного аккаунта, а котировки, полученные от потенциальных клиентов, не имеют ни одного. Предварительный просмотр теперь печатает блок, который сервер собирает из свинца. Компания возглавляет когда есть один — цитата бизнесу адресована бизнесу, с контактом ниже — затем адрес, телефон и электронная почта, каждый опущен, когда лидерство не Неси его.
· kamo-signer-monorepo
Показать детали клиента в копии клиента
Компания возглавляет блок, когда он есть — цитата для бизнеса адресована Бизнес, с контактом под ним. Точно соответствует предварительному просмотру персонала.
· SecurityService
Решите лидерство адресата как по мнению персонала, так и по мнению клиентов
Орг-спот в обоих местах. На публичной странице область исходит от собственной ссылки на акции организация, поэтому токен никогда не может выдать лидерство, принадлежащее другому арендатору.
· kamo-shared-library
Поместите детали клиента в документ, прочитайте заглавие
Опускание собственных полей адресата цитаты оставило документ без слов Клиент: имя клиента когда-либо исходило только из связанного аккаунта, который лидировал по котировкам не имеют, поэтому «подготовьтесь» распечатать бланки. Адресат теперь собирается из ведущего — имени, компании, адреса, телефона, электронной почты. Это поиск, а не присоединение, потому что цитата намеренно сохраняет только мягкий свинцовый модуль остается независимо развертываемым, поэтому контроллеры решают его и пропустить блок внутрь. Полузаполненный лид - это нормальный случай, а не исключение: лиды поступают от продавцов с Независимо от того, какой источник был захвачен. Адрес сжимается до одной строки и пропускает то, что Пропал, так что свинец, держащий только город, печатает "Лондон", а не "Лондон". Ведущий «То, что не может быть прочитано, не приводит к блоку, а не бросает» — цитата, которая привела Удаленный должен по-прежнему отображаться.
· kamo-internal
Переместить цитаты из торговли и на лидерство
Цитаты сидели в торговом трубопроводе, рядом с заказами и тележками, а не рядом с торговыми сетями. Клиент, для которого они предназначены. Теперь они живут на свинце: вкладка «Цитаты» непосредственно после Client Lead Данные показываются только там, где рынок позволяет их. Отдельная страница цитаты исчезла, а не осталась за флагом - лидерство уже предоставляет заголовок, личность клиента, его сообщения и документы, поэтому Второй макет записи поверх этого дублировал хром и разделил историю клиента. Через два. Выбор цитаты выдвигает список и редактор, а заголовок заголовка Никогда не покидайте экран. Закладки «Связь» и «Документы» отбрасываются по той же причине. Рынки получают переключатель Enable Quotes, и условия по умолчанию начинаются с их котировок. Без EDIT QUOTE TERMS поле терминов отключено и исключено из полезной нагрузки; Сервер также удаляет его, поскольку отключенный вход представляет собой представление, а не принудительное исполнение. Sub-tab ids теряют «цитаты»; его регрессионный тест теперь утверждает общее свойство вкладка мимо первой сохраняет свой собственный индекс — поэтому она по-прежнему защищает баг отказов без Назовите вкладку, которой больше не существует.
· SecurityService
Настройки котировок на рынке; обеспечение соблюдения условий предоставления
market-config теперь говорит о том, стоит ли предлагать вкладку Quotes и какую формулировку Новая котировка начинается с, и рынок конечных точек туда и обратно оба поля. Редактирование терминов осуществляется на стороне сервера для абонентов без EDIT QUOTE TERMS. отключать поле в UI представляет собой представление; ручной PATCH не должен быть в состоянии переписать Юридическая формулировка тоже.
· kamo-shared-library
Котировки принадлежат лидам, настроенным на рынок
Цитаты были коммерческим артефактом, который поставил их рядом с заказами и тележками. Кроме клиента, для которого они предназначены. Теперь они висят на волоске: рынок решает могут ли его лиды вообще нести котировки, и термины по умолчанию каждой цитаты в этом Рынок начинается с На рынок, а не на организацию, потому что ипотечный стол выдает кредитные оценки в соответствии с TRID и не имеет смысла для общей цитаты, в то время как рынок услуг живет на них. Условия несут юридическое обязательство организации, поэтому отход от рыночной формулировки на одном языке. Собственный грант — EDIT QUOTE TERMS. Поле нулевых терминов уже означало "уйти" «без изменений» в обновлении, что позволяет контроллеру удалять его для абонентов без Точно. Также выпадает собственное имя получателя цитаты / адрес / телефон: лид уже держит Детали клиента и их моментальный снимок дублировали запись, отредактированную в другом месте, которая отклоняться от него. Схема, примененная KamoInitializer перед этим обязательством; колонки проверены.
· SecurityService
Резервирование, утверждение и аудит потенциальных претензий
Поверхность REST позади /свинцов / возможностей / резервных и резервных возможностей управление в заголовке, плюс сервис, который владеет инвариантами. Права, соблюдаемые явно, потому что эта услуга работает в разрешении @EnableMethodSecurity — недостающая проверка — это недостающий контроль, а не отказ по умолчанию: VIEW OPPORTUNITIES Каждое чтение CREATE OPPORTUNITIES - поднимите запрос и попросите больше времени самостоятельно EDIT OPPORTUNITIES утверждение, редактирование, закрытие, решение о продлении DELETE OPPORTUNITIES "Deny Opportunity", которую UI ставит за подтверждение Отрицание является непреодолимым, но не разрушительным: резервация, ее расколы и все История остается читаемой на вкладке «Отказано». В этом и заключается суть отрицания. чем удаление. Детали, которые стоит сохранить: Конечная точка заголовка читается только с помощью CREATE, так как кнопка должна Знать, какое состояние передать, но звонящий без ВИЭ, который не является холдингом Агент получает суженную проекцию. Комиссия разделила и обосновала, что VIEW существует для защиты не раскрываются расширенными воротами. Восстановленный как Список разрешений, поэтому поле, добавленное позже, не может просочиться без пропуска. Список маскирует контакт и компанию на неназначенных лидах для членов без VIEW UNASSIGNED LEADS, соответствующий LeadController. Кто утверждает, что не является Тайна: перспектива есть. Расширение связано с тем, что он является агентом, который держит резервацию, без бога. шунтирование: проведение бронирования является фактом идентификации, а не правом, и Продление подается под именем заявителя. Пропущенная оговорка, которая получает расширенный перезапуск, а не резюме, поэтому Зарезервирован до == Зарезервирован от + утвержден Days Keeps Holding (обновление) Конец с самого начала, а несвежий старт молча стер бы грант. - Комиссионно-раздельный пул - держатели VIEW LEADS плюс все владельцы/администраторы грантов, Идентично тому, что предлагает конечная точка выбора. Вычисление из таблицы прав И только после того, как он был отвергнут, он сделал предложение владельцу. - Expiry - это плановая развертка, так что вкладки могут начинаться на реальной колонке, но каждый DTO сообщает дни Оставайтесь против часов базы данных, поэтому показания верны Вне зависимости от того, что между ними. 36 тестов охватывают жизненный цикл, арифметику даты и правила разделения.
· InitializerService
Таблицы для резервирования потенциальных возможностей
Зеркала LeadOpportunityReservation, LeadOpportunityCommissionSplit ******************* в камо-общей библиотеке. ddl-auto: обновление В любом случае создайте их из объектов; явный DDL - это соглашение о доме. и делает форму обзорной здесь, а не только выводимой из аннотаций. Применяется против производства по 2026-08-04 — все три таблицы и каждый индекс существуют, принадлежат пользователю приложения.
· kamo-shared-library
Субъекты, имеющие временные рамки для резервирования потенциальных возможностей
Агент ставит исключительную претензию на закрытие зацепки для ограниченного окна; утверждает гранты, редактирует или отрицает их, а коллегам может быть предложена доля комиссии. Три стола: резервация, разделение комиссии и Аудиторский след только в приложении. Точки проектирования, которые являются несущими: Ссылки на лидеров, организации и членов - это простые колонки идентификаторов без иностранных ссылок. ключи, соответствующие LEAD HISTORY и LEAD TASK. Тропа должна пережить свинец Удаление и отток членов не могут ни блокировать, ни каскадировать его. - dbNow() использует временную метку CAST(now() AS). CockroachDB's bare now() - TIMESTAMPTZ, «Hibernate 6» материализуется как «Мгновение, которое не может быть отброшено к объявленному». LocalDateTime — и сокращенное обозначение::timestamp искажается родным запросом Парсер, читающий «:» как префикс параметра. Они не появляются во время компиляции. Страничный список использует JpaSpecificationExecutor, а не JPQL. (:param IS NULL или ...) охраняет, потому что CockroachDB отклоняет нетипичную связь. параметр в голом IS NULL тесте. LeadIdentity — это проекция, а не Lead entity: Lead maps four ассоциации, которые не выполняют обязательства перед EAGER, поэтому включение 100 оговорок организацией Запускайте сотни отборов для данных, которые сетка никогда не показывает. - Историческая временная шкала по заказам (dateCreated DESC, id DESC). CockroachDB's Now является меткой времени транзакции, поэтому строки, написанные одним редактированием, делятся ею точно; Без тай-брейка аудиторский след перетасовывает себя между загрузками страниц. Никаких стереотипов здесь — хозяйская услуга декларирует бобы, поэтому никакой другой услуги нет. платит за сканирование хранилища.
· kamo-internal
Адрес цитаты человеку; резюме перестает стоить высоту заголовка
Перемещение резюме из правой колонки фиксировало ширину, но выкупило его обратно в качестве Группа под названием. Теперь он находится в разрыве, который уже существовал между титулом и титулом. Быстрые действия, так что это вообще не стоит места. Эта пропасть конечна, поэтому меньше показывают в линию а остальные остаются в одном клике - заказ несет двенадцать и будет вытеснять действия. Он остается видимым на каждой ширине, а не исчезает на узких экранах. Цитата также получает своего адресата: для кого она, необязательно их адрес и телефон. Они возглавляют первый раздел, потому что это первое, что вы решаете, и когда Учетная запись связана с полем имени показывает, к чему она в противном случае вернулась бы. The Блок предварительного просмотра «Подготовлен к» отображает все три и отражает то, что набирается скорее То, что было спасено в последний раз.
· kamo-shared-library
Отправить цитату кому-то, кто еще не является аккаунтом
Адресат был получен исключительно из связанной учетной записи, поэтому любая цитата, поднятая для Проспект — а это большинство из них — напечатал чистую строку «Подготовлено» и готово В документе не сказано, для кого это было. Цитата теперь имеет имя, адрес и телефон получателя. Что? сотрудники набрали выигрыши по связанному счету: они сказали, что должно быть напечатано, и Аккаунт, переименованный позже, не должен молча переписывать цитату, которая уже была отправлена. Адрес является свободной формой, потому что почтовые форматы недостаточно однородны, чтобы разделиться на поля Работает на международном уровне, печатает как написано. Пересмотр осуществляется адресатом Вперед — то же предложение, тот же человек. Схема, примененная KamoInitializer перед этим обязательством; столбцы проверены наличием.
· kamo-internal
Откройте профиль участника из своего ряда
Добавляет четвертое действие в парящий док строки, ссылаясь на **************************** Это реальный NextLink, а не обработчик кликов, поэтому кликните посередине и "открытый в новой вкладке" ведет себя, а охранник РЕПО остается удовлетворены; панель закрывается навигацией, поэтому блокировка прокрутки тела не Пережить изменение маршрута. Действие закрыто так, как сами ворота назначения: настройки участника Страница перенаправляет вас в ваш профиль, если вы не используете MANAGE MEMBERS MANAGE MEMBER SECURITY, CONFIGURE SYSTEM, EDIT MEMBER ACCESS LEVEL, ALLOW PROMOTING MEMBERS или **************** (или бог/платформа) администратор. Без одного из них икона скрыта, а не предлагается как мертвая. Конец. Собственный ряд всегда показывает это.
· kamo-internal
Fail the build when a component calls a key messages/ does not define
next-intl renders the key path verbatim for a missing key, and messages/ is gitignored here — populated at image-build time from kamo-translation-dictionary — so a rename that lands in only one of the two repos ships as visible gibberish with nothing to catch it. That is how the department contact fields came to render **************** on the settings screen, and how the entire HMDA demographics form (39 labels) shipped against a namespace that only contained `lar`. scripts/check-i18n-keys.mjs resolves each translator binding's namespace, then checks every literal key, the static prefix of every template-literal key, and the values passed against the {placeholders} in the message — in both directions, since an unsupplied ICU argument throws MissingValueError and an unused one silently drops data. It understands ICU brace escaping and plural sub-messages, and treats <tag> as a placeholder only for t.rich/t.markup. 1737 files in ~1.4s. Wired into `npm test` and into the Dockerfile ahead of the build, with --require-messages there so a skipped dictionary sync fails loudly instead of turning the guard into a no-op. Typing t() against `typeof en` was tried first and rejected: a JSON import widens values to `string`, so next-intl cannot infer placeholders and rejects correct calls like t('...range', {start, end, total}); it also tripled typecheck time (81s -> 249s) and would have needed ~150 edits to non-buggy code. Call-site fixes for what it found: - dropped a `default:` option passed to t() in the chat components and LanguageButton; next-intl has no such fallback option, so it was dead weight. - commerce lowStock passed {count} for {available}, MultiFileUploader {types} for {list}, and audioVideo master volume {pct} for {percent} — all three threw at format time. - DnsSetupStudio passed a {domain} its subtitle does not use.
· kamo-internal
Параметры Pin/unpin nav от navs и домашней стартовой площадки
Участники могут перемещать опцию между боковой и верхней планкой, но никогда Вытащите один из них полностью. Добавлено третье размещение — НИКОГДА, «невинтовано» — и два способа добраться до него, оба за рулем одного и того же общего меню: - щелкните правой кнопкой мыши подвижную опцию в NavPri/NavTop: меню размещения открывается на - контроль угла на каждой панели домашней панели запуска: тихий чип, который считывает где опция в настоящее время сидит и расширяется на виселице, открывая одно и то же меню Незавершенный никогда не является тупиком. Домашняя стартовая площадка теперь отображается из каждого закрытого опцион, а не объединение двух навов, поэтому незакрепленный вариант сохраняет Панель, которая зажимает его обратно; палитра команд делает то же самое, и каждое изменение Он поднимает тост, называя, где был выбор. Навигационный план На странице настроек растет соответствующая колонка Unpinned. Решитель сохраняет свой инвариант - каждый закрытый вариант в одном ведре - и явный NONE теперь бьет несвежий порядок зоны, так что unpin выживает капля Написано до него. Наследственные сохраненные макеты не имеют ни одной записи и разрешают Как и прежде, перезагрузка до стандарта никогда не может оставить что-либо незакрепленным. покрытый новыми тестами для разрешения NavLayout, которых не было.
· kamo-internal
Скрыть пустые отделы, перенести фильтр состояния в каталог
- Отделы без членов больше не работают. Конечная точка отдела возвращает все отделы в организации, включая пустые, так что список был Показать разделы, которые не могут содержать никого. Отделение "нет" Заполнитель "члена" идет с ними, будучи недостижимым сейчас. Фильтр All/Online/Offline перемещается из заголовка всей панели вниз полоска вкладки, поэтому она находится в собственной области каталога с реестром фильтры вместо того, чтобы фильтровать всю панель (она никогда не применялась к фильтру). Чаты или мобильный доступ. Пустое состояние предполагает только корректировку поиска / фильтра, когда вы На самом деле применяется; организации, не имеющей членов, нечего корректировать.
· kamo-internal
Rebuild the slideout as one continuous surface
Member rows now form the department body directly — no card-on-card nesting — and departments run full-bleed with sticky bands, reclaiming ~30px of row width and cutting the chrome before the first member from 228px to ~170px. Layout - Delete the card-in-card stack: rows are flat, hairline-separated, full width. - Sticky department band (ink on an 8% primary tint, never white-on-primary) carrying the disclosure chevron, a live presence meter, an online/total fraction and a Select toggle. Drops the identical per-department Group icon. - One background instead of three stacked gradients; one scroll-edge cue. - Status is carried by a dot on the avatar plus a word only when it adds information, replacing five per-row encodings of the same value. Behavior - Row click opens the 1:1 chat. It previously did nothing: MemberList never passed onClick, so a fully-styled clickable row was inert. - Restore the All/Online/Offline filter, which only existed inside MemberList's header — a branch the live panel never rendered (showHeader={false}), leaving statusFilter pinned to 'all'. Lifted into NavTopPanel beside the search field. - Multi-select gains real affordances: a Select toggle per band, ctrl/cmd-click, and touch long-press; a selection bar rises from the first selection. - One hoisted MeetingDialog instead of one mounted per row, and ownMemberId is threaded down instead of every row fetching /api/user-info. Motion - MotionConfig reducedMotion="user", plus prefers-reduced-motion guards on the CSS keyframes it cannot reach. - Staggered section entrance, framer height-collapse with a rotating chevron, layout-spring row reflow, odometer counts, unread pop, directional tab slides. Accessibility - Real disclosure semantics, ul/li rows, one stretched row button with sibling (not nested) actions, focus trap with focus restore, arrow-key navigation, a polite live region for selection, and >=24px targets. - The panel openers in NavTop were non-focusable Boxes; they are buttons now. - Chats rows were click-only divs with no keyboard path; they are list items with real buttons and accessible names. Theming - New --on-primary token so white text on a light tenant primary is fixable. - Shared availability palette ends the NavTop/MemberItem hue drift, and the hairlines stop referencing --color-primary-rgb, a variable never defined. - Relative timestamps go through Intl on the app locale instead of emitting hardcoded English, and last-active labels tick again via one shared 30s clock.

Ваша вселенная ждет.
Начните бесплатно через несколько минут. Добавляйте продукты, когда будете готовы — без миграции, без новых логинов.
Бесплатно навсегда — не требуется кредитная карта