Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .changeset/25921-collaboration-zero-consumer-exports.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
---
'@object-ui/collaboration': patch
---
Expand All @@ -15,5 +15,5 @@

- FROM `useCommentSearch` TO a `useMemo` over your own comment list that keeps the entries whose `text` or `author` contains the trimmed, lower-cased query.
- FROM `CommentSearchConfig` TO `{ comments: CommentEntry[] }`, with `CommentEntry` from `@object-ui/types`.
- FROM `CommentSearchReturn` TO the shape your own search state returns; the result rows can keep using `CommentSearchResult` from `@object-ui/types`.
- FROM `CommentSearchReturn` TO the shape your own search state returns; type the result rows with a local interface, `{ comment: CommentEntry; objectName: string; recordId: string; highlight?: string }` (`CommentSearchResult` leaves `@object-ui/types` in the same release).
- FROM `createPresenceUpdater` TO a `Map<string, PresenceUser>` keyed by `userId` that you update from your realtime channel, or `PresenceProvider` with `useTenantPresence` / `useRecordPresence`, which the package keeps exporting.
14 changes: 14 additions & 0 deletions .changeset/25921-core-reset-action-key-warnings-off-barrel.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
'@object-ui/core': patch
---

refactor(core)!: take the test-only `resetActionKeyWarnings` off the package entry

Clause-②: no (narrowing)
Metadata-protocol: none

<!-- adr-0087: not-required (runtime-export-retired @object-ui/core#resetActionKeyWarnings) the retired operand is a test seam that clears a warn-once memo; nothing in the workspace or in hotcrm imported it from the package entry, and no packages/spec schema, registered node type, conversion surface or stored shape names it, so there is nothing for `objectstack migrate meta` to rewrite -->

**BREAKING** for a host that imports `resetActionKeyWarnings` from `@object-ui/core`. It cleared the once-per-key memo behind the unknown-action-key warning and existed for tests; core's own tests reach it through the module that declares it. The other ten names of that module (`ACTION_DEF_KEYS`, `SPEC_ACTION_KEYS`, `NAVIGATION_ALIAS_KEYS`, `HOST_DISPATCH_ACTION_KEYS`, `RETIRED_ACTION_KEYS`, `KNOWN_ACTION_KEYS`, `classifyActionKeys`, `warnOnUnknownActionKeys`, `hasDeprecatedObjectParams`, `warnOnDeprecatedObjectParams`) stay exported unchanged, and the warning itself still fires once per key.

- FROM `resetActionKeyWarnings()` in a test TO a fresh module instance per test (`vi.resetModules()` before importing `@object-ui/core`), or no reset at all when the test asserts the first warning only.
12 changes: 12 additions & 0 deletions .changeset/25921-i18n-dead-public-form-keys.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
'@object-ui/i18n': patch
---

refactor(i18n)!: delete four `publicForm` keys that no screen reads

Clause-②: no (narrowing)
Metadata-protocol: none

<!-- adr-0087: not-required (no-migration-prescription) the four deleted keys are message strings in the built-in locale packs that no t() call site in the workspace or in hotcrm reads (the embeddable form draws its own English literals instead); they are not metadata, no packages/spec schema or stored shape names them, and a host that kept its own text under these keys keeps it in its own resources -->

**BREAKING** only for TypeScript code that names one of the deleted keys through the pack-derived key type (`TranslationKeys`): `publicForm.consentRequired`, `publicForm.rateLimited`, `publicForm.redirectBlocked` and `publicForm.requiredHint` leave all ten packs (ar, de, en, es, fr, ja, ko, pt, ru, zh). No translation call read them. `EmbeddableForm` in `@object-ui/plugin-form` draws the same wording as hard-coded English defaults for `consentRequired`, `rateLimited` and `requiredHint`, and shows `redirectBlocked` only when the form author supplies `texts.redirectBlocked`; those defaults were never localised through these keys and stay un-localised English after this change. An author localises them per form through `config.texts`. The form page's other `publicForm` keys (`submit`, `submitting`, `poweredBy`, `thankYouTitle`, `thankYouMessage`, `redirecting`, `redirectPending`, `loading`, `requiredFields`) are unchanged.
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
'@object-ui/plugin-detail': patch
---

refactor(plugin-detail)!: take the test-only `resetUnknownActivityTypeWarnings` off the package entry

Clause-②: no (narrowing)
Metadata-protocol: none

<!-- adr-0087: not-required (runtime-export-retired @object-ui/plugin-detail#resetUnknownActivityTypeWarnings) the retired operand is a test seam that clears the warn-once bucket of the unmapped activity-type diagnostic; no shipped code in the workspace or in hotcrm called it, and no packages/spec schema, registered node type, conversion surface or stored shape names it, so there is nothing for `objectstack migrate meta` to rewrite -->

**BREAKING** for a host that imports `resetUnknownActivityTypeWarnings` from `@object-ui/plugin-detail`. It existed for tests; the one workspace test outside the package now imports it from the module that declares it. `ACTIVITY_TYPE_TO_FEED_TYPE`, `UNMAPPED_ACTIVITY_FEED_TYPE`, `activityRowToFeedItem` and `isRefusedFeedRead` stay exported unchanged, and the diagnostic still warns once per unmapped type.

- FROM `resetUnknownActivityTypeWarnings()` in a test TO a fresh module instance per test (`vi.resetModules()` before importing `@object-ui/plugin-detail`), or an activity type unique to that test.
14 changes: 14 additions & 0 deletions .changeset/25921-react-reset-visibility-warnings-off-barrel.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
'@object-ui/react': patch
---

refactor(react)!: take the test-only `__resetVisibilityPredicateWarnings` off the package entry

Clause-②: no (narrowing)
Metadata-protocol: none

<!-- adr-0087: not-required (runtime-export-retired @object-ui/react#__resetVisibilityPredicateWarnings) the retired operand is a test seam that clears the once-per-predicate dedupe of the unresolvable-visibility report; no shipped code in the workspace or in hotcrm called it, and no packages/spec schema, registered node type, conversion surface or stored shape names it, so there is nothing for `objectstack migrate meta` to rewrite -->

**BREAKING** for a host that imports `__resetVisibilityPredicateWarnings` from `@object-ui/react`. The double-underscore name already marked it as a test seam; the workspace tests that used it now import it from the module that declares it. `reportUnresolvableVisibilityPredicate`, `formatUnresolvableVisibilityMessage`, `UNRESOLVABLE_VISIBILITY_PREFIX`, `UNRESOLVABLE_ENABLEMENT_PREFIX` and the `PredicateScopeTier` type stay exported unchanged, and the report still dedupes per predicate.

- FROM `__resetVisibilityPredicateWarnings()` in a test TO a fresh module instance per test (`vi.resetModules()` before importing `@object-ui/react`), or a predicate source string unique to that test so the dedupe cannot hide its line.
14 changes: 14 additions & 0 deletions .changeset/25921-types-comment-search-result.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
'@object-ui/types': patch
---

refactor(types)!: retire the zero-consumer `CommentSearchResult` interface

Clause-②: no (narrowing)
Metadata-protocol: none

<!-- adr-0087: not-required (runtime-export-retired @object-ui/types#CommentSearchResult) the retired operand is a TypeScript interface for a cross-record comment search result; its only producer, the `useCommentSearch` hook of `@object-ui/collaboration`, already retired, and nothing in the workspace or in hotcrm reads the type; no packages/spec schema, registered node type, conversion surface or stored shape names it, so there is nothing for `objectstack migrate meta` to rewrite -->

**BREAKING** for a host that imports the type `CommentSearchResult` from `@object-ui/types`. It described the hits of a comment search the packages no longer ship. `CommentEntry`, `MentionNotification` and `ActivityEntry` stay exported unchanged.

- FROM `CommentSearchResult` TO a local interface in your own code: `{ comment: CommentEntry; objectName: string; recordId: string; highlight?: string }`.
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@ import { describe, it, expect, vi, beforeEach, afterEach, type MockInstance } fr
import { render, screen, cleanup, waitFor, act } from '@testing-library/react';
import { useContext, type ReactNode } from 'react';
import { useNavigate } from 'react-router-dom';
import { MetadataCtx, type MetadataContextValue, __resetVisibilityPredicateWarnings } from '@object-ui/react';
import { MetadataCtx, type MetadataContextValue } from '@object-ui/react';
import { __resetVisibilityPredicateWarnings } from '../../../../packages/react/src/utils/visibilityDiagnostic';
import { usePermissions, type MePermissionsResponse } from '@object-ui/permissions';
// Not on the package's entry: the context object itself, read by its module id
// (`@object-ui/permissions` resolves to `packages/permissions/src`, so this is
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ import { render, screen, waitFor, act } from '@testing-library/react';
import { MemoryRouter } from 'react-router-dom';
import type { NavigationItem } from '@object-ui/types';
import { MePermissionsProvider, type MePermissionsResponse } from '@object-ui/permissions';
import { __resetVisibilityPredicateWarnings } from '@object-ui/react';
import { __resetVisibilityPredicateWarnings } from '../../../../react/src/utils/visibilityDiagnostic';

vi.mock('@object-ui/i18n', async (importOriginal) => ({
...(await importOriginal<Record<string, unknown>>()),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,8 +69,8 @@ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
import { ExpressionEvaluator } from '@object-ui/core';
import {
UNRESOLVABLE_VISIBILITY_PREFIX,
__resetVisibilityPredicateWarnings,
} from '@object-ui/react';
import { __resetVisibilityPredicateWarnings } from '../../../react/src/utils/visibilityDiagnostic';
import { hasVisibleNavigationItems } from '@object-ui/layout';
import { buildExpressionScope, evaluateVisibility } from './ExpressionProvider';

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@

import { describe, it, expect, vi, beforeEach, afterEach, type MockInstance } from 'vitest';
import { toEvalPermissions } from '@objectstack/formula';
import { __resetVisibilityPredicateWarnings } from '@object-ui/react';
import { __resetVisibilityPredicateWarnings } from '../../../../react/src/utils/visibilityDiagnostic';
import {
createExpressionEvaluator,
evaluateNavigationVisibility,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
*/

import { describe, it, expect, vi, beforeEach, afterEach, type MockInstance } from 'vitest';
import { __resetVisibilityPredicateWarnings } from '@object-ui/react';
import { __resetVisibilityPredicateWarnings } from '../../../../react/src/utils/visibilityDiagnostic';
import {
createExpressionEvaluator,
evaluateNavigationVisibility,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
import { describe, it, expect, vi, beforeEach, afterEach, type MockInstance } from 'vitest';
import React from 'react';
import { renderHook } from '@testing-library/react';
import { __resetVisibilityPredicateWarnings } from '@object-ui/react';
import { __resetVisibilityPredicateWarnings } from '../../../../react/src/utils/visibilityDiagnostic';
import {
ExpressionProvider,
createExpressionEvaluator,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,8 +100,8 @@ vi.mock('@object-ui/plugin-detail', async (importOriginal) => {

import {
UNMAPPED_ACTIVITY_FEED_TYPE,
resetUnknownActivityTypeWarnings,
} from '@object-ui/plugin-detail';
import { resetUnknownActivityTypeWarnings } from '../../../plugin-detail/src/renderers/recordActivityFeed';

vi.mock('@object-ui/auth', async (importOriginal) => ({
...(await importOriginal<Record<string, unknown>>()),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ import {
RecordContextProvider,
SchemaRenderer,
UNRESOLVABLE_VISIBILITY_PREFIX,
__resetVisibilityPredicateWarnings,
} from '@object-ui/react';
import { __resetVisibilityPredicateWarnings } from '../../../react/src/utils/visibilityDiagnostic';
import { RelatedCountStore } from '../hooks/related-count-store';
// Module-scope import (not `beforeAll`) — objectui#3010/#3021.
import '../renderers';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,8 @@ import {
PageVariablesProvider,
usePageVariables,
UNRESOLVABLE_VISIBILITY_PREFIX,
__resetVisibilityPredicateWarnings,
} from '@object-ui/react';
import { __resetVisibilityPredicateWarnings } from '../../../react/src/utils/visibilityDiagnostic';
// Module-scope import (not `beforeAll`) — objectui#3010/#3021.
import '../renderers';

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,8 @@ import type { PublicBlockNodeOf } from '@object-ui/types';
import {
SchemaRenderer,
UNRESOLVABLE_VISIBILITY_PREFIX,
__resetVisibilityPredicateWarnings,
} from '@object-ui/react';
import { __resetVisibilityPredicateWarnings } from '../../../react/src/utils/visibilityDiagnostic';
import '../renderers';

const tabsSchema = (items: any[]): PublicBlockNodeOf<'page:tabs'> => ({ type: 'page:tabs', id: 'tabs', properties: { items } });
Expand Down
14 changes: 13 additions & 1 deletion ui/packages/core/src/actions/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,19 @@

export * from './ActionRunner.js';
export * from './ActionEngine.js';
export * from './actionKeys.js';
export {
ACTION_DEF_KEYS,
SPEC_ACTION_KEYS,
NAVIGATION_ALIAS_KEYS,
HOST_DISPATCH_ACTION_KEYS,
RETIRED_ACTION_KEYS,
KNOWN_ACTION_KEYS,
classifyActionKeys,
warnOnUnknownActionKeys,
hasDeprecatedObjectParams,
warnOnDeprecatedObjectParams,
// `resetActionKeyWarnings` is test-only and stays off the barrel
} from './actionKeys.js';
export * from './TransactionManager.js';
export * from './UndoManager.js';
export * from './bulkFastPath.js';
Expand Down
4 changes: 0 additions & 4 deletions ui/packages/i18n/src/locales/ar.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3911,11 +3911,7 @@ const ar = {
redirecting: "إعادة توجيه خلال {{seconds}} ثانية(ثوانٍ)…",
redirectPending: "جارٍ إعادة التوجيه…",
loading: "جارٍ تحميل النموذج…",
requiredHint: "* حقل مطلوب",
requiredFields: "الحقول المطلوبة: {{fields}}",
consentRequired: "يرجى قبول سياسة الخصوصية للمتابعة.",
rateLimited: "خذ لحظة لمراجعة إجاباتك قبل الإرسال.",
redirectBlocked: "تم قبول الإرسال، لكن رابط إعادة التوجيه تم حظره لأسباب أمنية.",
},
connectAgent: {
disabled: {
Expand Down
4 changes: 0 additions & 4 deletions ui/packages/i18n/src/locales/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3614,11 +3614,7 @@ const de = {
redirecting: "Weiterleitung in {{seconds}} Sekunden…",
redirectPending: "Weiterleitung…",
loading: "Formular wird geladen…",
requiredHint: "* Pflichtfeld",
requiredFields: "Pflichtfelder: {{fields}}",
consentRequired: "Bitte akzeptieren Sie die Datenschutzrichtlinie, um fortzufahren.",
rateLimited: "Bitte nehmen Sie sich einen Moment, um Ihre Antworten zu überprüfen, bevor Sie absenden.",
redirectBlocked: "Einreichung akzeptiert, aber die Weiterleitungs-URL wurde aus Sicherheitsgründen blockiert.",
},
connectAgent: {
disabled: {
Expand Down
4 changes: 0 additions & 4 deletions ui/packages/i18n/src/locales/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4371,14 +4371,10 @@ const en = {
// countdown and carries a `{{seconds}}` hole this page has no value for.
redirectPending: 'Redirecting…',
loading: 'Loading form…',
requiredHint: '* Required field',
// The console form page's client-side refusal when required rows are empty
// (objectui#11071). `{{fields}}` is the empty rows' labels joined with a
// comma; the colon, its spacing and the order are the pack's.
requiredFields: 'Required: {{fields}}',
consentRequired: 'Please accept the privacy policy to continue.',
rateLimited: 'Please take a moment to review your answers before submitting.',
redirectBlocked: 'Submission accepted, but the redirect URL was blocked for security.',
},
connectAgent: {
disabled: {
Expand Down
4 changes: 0 additions & 4 deletions ui/packages/i18n/src/locales/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3689,11 +3689,7 @@ const es = {
redirecting: "Redirigiendo en {{seconds}} segundos…",
redirectPending: "Redirigiendo…",
loading: "Cargando formulario…",
requiredHint: "* Campo obligatorio",
requiredFields: "Campos obligatorios: {{fields}}",
consentRequired: "Acepte la política de privacidad para continuar.",
rateLimited: "Tómese un momento para revisar sus respuestas antes de enviar.",
redirectBlocked: "Envío aceptado, pero la URL de redirección fue bloqueada por seguridad.",
},
connectAgent: {
disabled: {
Expand Down
4 changes: 0 additions & 4 deletions ui/packages/i18n/src/locales/fr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3685,11 +3685,7 @@ const fr = {
redirecting: "Redirection dans {{seconds}} seconde(s)…",
redirectPending: "Redirection…",
loading: "Chargement du formulaire…",
requiredHint: "* Champ obligatoire",
requiredFields: "Champs obligatoires : {{fields}}",
consentRequired: "Veuillez accepter la politique de confidentialité pour continuer.",
rateLimited: "Prenez un moment pour vérifier vos réponses avant d'envoyer.",
redirectBlocked: "Soumission acceptée, mais l'URL de redirection a été bloquée pour des raisons de sécurité.",
},
connectAgent: {
disabled: {
Expand Down
4 changes: 0 additions & 4 deletions ui/packages/i18n/src/locales/ja.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3616,11 +3616,7 @@ const ja = {
redirecting: "{{seconds}} 秒後にリダイレクトします…",
redirectPending: "リダイレクトしています…",
loading: "フォームを読み込み中…",
requiredHint: "* 必須項目",
requiredFields: "必須項目: {{fields}}",
consentRequired: "続行するにはプライバシーポリシーに同意してください。",
rateLimited: "送信前に回答を確認してください。",
redirectBlocked: "送信は受理されましたが、リダイレクトURLはセキュリティのためブロックされました。",
},
connectAgent: {
disabled: {
Expand Down
4 changes: 0 additions & 4 deletions ui/packages/i18n/src/locales/ko.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3613,11 +3613,7 @@ const ko = {
redirecting: "{{seconds}}초 후 리디렉션됩니다…",
redirectPending: "리디렉션 중…",
loading: "양식 로딩 중…",
requiredHint: "* 필수 필드",
requiredFields: "필수 항목: {{fields}}",
consentRequired: "계속하려면 개인정보 처리방침에 동의하세요.",
rateLimited: "제출하기 전에 잠시 답변을 검토하세요.",
redirectBlocked: "제출이 수락되었지만 보안상의 이유로 리디렉션 URL이 차단되었습니다.",
},
connectAgent: {
disabled: {
Expand Down
4 changes: 0 additions & 4 deletions ui/packages/i18n/src/locales/pt.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3684,11 +3684,7 @@ const pt = {
redirecting: "Redirecionando em {{seconds}} segundo(s)…",
redirectPending: "Redirecionando…",
loading: "Carregando formulário…",
requiredHint: "* Campo obrigatório",
requiredFields: "Campos obrigatórios: {{fields}}",
consentRequired: "Por favor, aceite a política de privacidade para continuar.",
rateLimited: "Reserve um momento para revisar suas respostas antes de enviar.",
redirectBlocked: "Envio aceito, mas a URL de redirecionamento foi bloqueada por segurança.",
},
connectAgent: {
disabled: {
Expand Down
4 changes: 0 additions & 4 deletions ui/packages/i18n/src/locales/ru.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3773,11 +3773,7 @@ const ru = {
redirecting: "Перенаправление через {{seconds}} с…",
redirectPending: "Перенаправление…",
loading: "Загрузка формы…",
requiredHint: "* Обязательное поле",
requiredFields: "Обязательные поля: {{fields}}",
consentRequired: "Пожалуйста, примите политику конфиденциальности.",
rateLimited: "Проверьте ответы перед отправкой.",
redirectBlocked: "Ответ принят, но URL перенаправления заблокирован по соображениям безопасности.",
},
connectAgent: {
disabled: {
Expand Down
4 changes: 0 additions & 4 deletions ui/packages/i18n/src/locales/zh.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3805,11 +3805,7 @@ const zh = {
redirecting: '将在 {{seconds}} 秒后跳转…',
redirectPending: '正在跳转…',
loading: '正在加载表单…',
requiredHint: '* 为必填项',
requiredFields: '必填项:{{fields}}',
consentRequired: '请先勾选同意隐私政策。',
rateLimited: '请再花点时间核对一下您的填写内容,再点击提交。',
redirectBlocked: '提交成功,但出于安全考虑,跳转链接已被阻止。',
},
connectAgent: {
disabled: {
Expand Down
6 changes: 1 addition & 5 deletions ui/packages/plugin-detail/src/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -82,16 +82,12 @@ export {
* that needs a `FeedItem` from a `sys_activity` row calls
* `activityRowToFeedItem`; there is no supported way to assemble one from the
* table by hand, because that is precisely what drifted.
*
* `resetUnknownActivityTypeWarnings` comes with it: the warn-once bucket is
* module state, so any surface that ASSERTS the diagnostic needs the same test
* seam the block's own tests use.
*/
export {
ACTIVITY_TYPE_TO_FEED_TYPE,
UNMAPPED_ACTIVITY_FEED_TYPE,
activityRowToFeedItem,
resetUnknownActivityTypeWarnings,
// `resetUnknownActivityTypeWarnings` is test-only and stays off the barrel
// objectui#11195: the refused-read verdict joins the reading for the same
// reason. `RecordDetailView` reads the same two tables, and a refusal it
// judged differently would show "no permission" on one surface and "no
Expand Down
Loading
Loading