diff --git a/.changeset/25921-collaboration-zero-consumer-exports.md b/.changeset/25921-collaboration-zero-consumer-exports.md index 2e16a6d109a..941bcf07f39 100644 --- a/.changeset/25921-collaboration-zero-consumer-exports.md +++ b/.changeset/25921-collaboration-zero-consumer-exports.md @@ -15,5 +15,5 @@ What leaves, and what to write instead: - 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` keyed by `userId` that you update from your realtime channel, or `PresenceProvider` with `useTenantPresence` / `useRecordPresence`, which the package keeps exporting. diff --git a/.changeset/25921-core-reset-action-key-warnings-off-barrel.md b/.changeset/25921-core-reset-action-key-warnings-off-barrel.md new file mode 100644 index 00000000000..b4e049eacbb --- /dev/null +++ b/.changeset/25921-core-reset-action-key-warnings-off-barrel.md @@ -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 + + + +**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. diff --git a/.changeset/25921-i18n-dead-public-form-keys.md b/.changeset/25921-i18n-dead-public-form-keys.md new file mode 100644 index 00000000000..0e4c16423bc --- /dev/null +++ b/.changeset/25921-i18n-dead-public-form-keys.md @@ -0,0 +1,12 @@ +--- +'@object-ui/i18n': patch +--- + +refactor(i18n)!: delete four `publicForm` keys that no screen reads + +Clause-②: no (narrowing) +Metadata-protocol: none + + + +**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. diff --git a/.changeset/25921-plugin-detail-reset-activity-warnings-off-barrel.md b/.changeset/25921-plugin-detail-reset-activity-warnings-off-barrel.md new file mode 100644 index 00000000000..f2041c414d3 --- /dev/null +++ b/.changeset/25921-plugin-detail-reset-activity-warnings-off-barrel.md @@ -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 + + + +**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. diff --git a/.changeset/25921-react-reset-visibility-warnings-off-barrel.md b/.changeset/25921-react-reset-visibility-warnings-off-barrel.md new file mode 100644 index 00000000000..f5f6c2bc03a --- /dev/null +++ b/.changeset/25921-react-reset-visibility-warnings-off-barrel.md @@ -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 + + + +**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. diff --git a/.changeset/25921-types-comment-search-result.md b/.changeset/25921-types-comment-search-result.md new file mode 100644 index 00000000000..cfc17dd7331 --- /dev/null +++ b/.changeset/25921-types-comment-search-result.md @@ -0,0 +1,14 @@ +--- +'@object-ui/types': patch +--- + +refactor(types)!: retire the zero-consumer `CommentSearchResult` interface + +Clause-②: no (narrowing) +Metadata-protocol: none + + + +**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 }`. diff --git a/ui/apps/console/src/__tests__/App.homePermissions-12700.test.tsx b/ui/apps/console/src/__tests__/App.homePermissions-12700.test.tsx index fd83cdda10d..a2b135b3b01 100644 --- a/ui/apps/console/src/__tests__/App.homePermissions-12700.test.tsx +++ b/ui/apps/console/src/__tests__/App.homePermissions-12700.test.tsx @@ -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 diff --git a/ui/packages/app-shell/src/layout/__tests__/UnifiedSidebar.navCanPermissions-12700.test.tsx b/ui/packages/app-shell/src/layout/__tests__/UnifiedSidebar.navCanPermissions-12700.test.tsx index 5373e28f6d9..edf3abc0dee 100644 --- a/ui/packages/app-shell/src/layout/__tests__/UnifiedSidebar.navCanPermissions-12700.test.tsx +++ b/ui/packages/app-shell/src/layout/__tests__/UnifiedSidebar.navCanPermissions-12700.test.tsx @@ -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>()), diff --git a/ui/packages/app-shell/src/providers/ExpressionProvider.visibleFaultDiagnostic.test.ts b/ui/packages/app-shell/src/providers/ExpressionProvider.visibleFaultDiagnostic.test.ts index f1047176fef..549a674a808 100644 --- a/ui/packages/app-shell/src/providers/ExpressionProvider.visibleFaultDiagnostic.test.ts +++ b/ui/packages/app-shell/src/providers/ExpressionProvider.visibleFaultDiagnostic.test.ts @@ -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'; diff --git a/ui/packages/app-shell/src/providers/__tests__/navigationVisibility-12700.test.ts b/ui/packages/app-shell/src/providers/__tests__/navigationVisibility-12700.test.ts index 7724ce635b4..46b3b012e2c 100644 --- a/ui/packages/app-shell/src/providers/__tests__/navigationVisibility-12700.test.ts +++ b/ui/packages/app-shell/src/providers/__tests__/navigationVisibility-12700.test.ts @@ -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, diff --git a/ui/packages/app-shell/src/providers/__tests__/navigationVisibility.bareCel-27457.test.ts b/ui/packages/app-shell/src/providers/__tests__/navigationVisibility.bareCel-27457.test.ts index c280a7d3005..58ff0edf360 100644 --- a/ui/packages/app-shell/src/providers/__tests__/navigationVisibility.bareCel-27457.test.ts +++ b/ui/packages/app-shell/src/providers/__tests__/navigationVisibility.bareCel-27457.test.ts @@ -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, diff --git a/ui/packages/app-shell/src/providers/__tests__/navigationVisibility.unboundScope-25892.test.tsx b/ui/packages/app-shell/src/providers/__tests__/navigationVisibility.unboundScope-25892.test.tsx index 7574c9f9383..1527befc1ec 100644 --- a/ui/packages/app-shell/src/providers/__tests__/navigationVisibility.unboundScope-25892.test.tsx +++ b/ui/packages/app-shell/src/providers/__tests__/navigationVisibility.unboundScope-25892.test.tsx @@ -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, diff --git a/ui/packages/app-shell/src/views/RecordDetailView.activityUnmappedType-5896.test.tsx b/ui/packages/app-shell/src/views/RecordDetailView.activityUnmappedType-5896.test.tsx index 99cee9cf559..5cfc34eec84 100644 --- a/ui/packages/app-shell/src/views/RecordDetailView.activityUnmappedType-5896.test.tsx +++ b/ui/packages/app-shell/src/views/RecordDetailView.activityUnmappedType-5896.test.tsx @@ -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>()), diff --git a/ui/packages/components/src/__tests__/page-node-visibility-fail-closed-13299.test.tsx b/ui/packages/components/src/__tests__/page-node-visibility-fail-closed-13299.test.tsx index 3b0b32cd763..99138fe1932 100644 --- a/ui/packages/components/src/__tests__/page-node-visibility-fail-closed-13299.test.tsx +++ b/ui/packages/components/src/__tests__/page-node-visibility-fail-closed-13299.test.tsx @@ -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'; diff --git a/ui/packages/components/src/__tests__/page-tabs-visible-when-fail-closed-13286.test.tsx b/ui/packages/components/src/__tests__/page-tabs-visible-when-fail-closed-13286.test.tsx index 7cebc7b74ea..7b819e75682 100644 --- a/ui/packages/components/src/__tests__/page-tabs-visible-when-fail-closed-13286.test.tsx +++ b/ui/packages/components/src/__tests__/page-tabs-visible-when-fail-closed-13286.test.tsx @@ -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'; diff --git a/ui/packages/components/src/__tests__/page-tabs-visible-when-fault-warning.test.tsx b/ui/packages/components/src/__tests__/page-tabs-visible-when-fault-warning.test.tsx index 9de6583803d..ea9644468a2 100644 --- a/ui/packages/components/src/__tests__/page-tabs-visible-when-fault-warning.test.tsx +++ b/ui/packages/components/src/__tests__/page-tabs-visible-when-fault-warning.test.tsx @@ -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 } }); diff --git a/ui/packages/core/src/actions/index.ts b/ui/packages/core/src/actions/index.ts index ab7e92720a2..dce6d6ab302 100644 --- a/ui/packages/core/src/actions/index.ts +++ b/ui/packages/core/src/actions/index.ts @@ -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'; diff --git a/ui/packages/i18n/src/locales/ar.ts b/ui/packages/i18n/src/locales/ar.ts index 31995007755..9dbbd11c222 100644 --- a/ui/packages/i18n/src/locales/ar.ts +++ b/ui/packages/i18n/src/locales/ar.ts @@ -3911,11 +3911,7 @@ const ar = { redirecting: "إعادة توجيه خلال {{seconds}} ثانية(ثوانٍ)…", redirectPending: "جارٍ إعادة التوجيه…", loading: "جارٍ تحميل النموذج…", - requiredHint: "* حقل مطلوب", requiredFields: "الحقول المطلوبة: {{fields}}", - consentRequired: "يرجى قبول سياسة الخصوصية للمتابعة.", - rateLimited: "خذ لحظة لمراجعة إجاباتك قبل الإرسال.", - redirectBlocked: "تم قبول الإرسال، لكن رابط إعادة التوجيه تم حظره لأسباب أمنية.", }, connectAgent: { disabled: { diff --git a/ui/packages/i18n/src/locales/de.ts b/ui/packages/i18n/src/locales/de.ts index e3bcb069bde..ef4e53f3830 100644 --- a/ui/packages/i18n/src/locales/de.ts +++ b/ui/packages/i18n/src/locales/de.ts @@ -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: { diff --git a/ui/packages/i18n/src/locales/en.ts b/ui/packages/i18n/src/locales/en.ts index c81b3097cc3..8846e82c33f 100644 --- a/ui/packages/i18n/src/locales/en.ts +++ b/ui/packages/i18n/src/locales/en.ts @@ -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: { diff --git a/ui/packages/i18n/src/locales/es.ts b/ui/packages/i18n/src/locales/es.ts index c29c501ee69..35aa33ebdb1 100644 --- a/ui/packages/i18n/src/locales/es.ts +++ b/ui/packages/i18n/src/locales/es.ts @@ -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: { diff --git a/ui/packages/i18n/src/locales/fr.ts b/ui/packages/i18n/src/locales/fr.ts index fa65c0ceb4c..68817218294 100644 --- a/ui/packages/i18n/src/locales/fr.ts +++ b/ui/packages/i18n/src/locales/fr.ts @@ -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: { diff --git a/ui/packages/i18n/src/locales/ja.ts b/ui/packages/i18n/src/locales/ja.ts index 618c5031d48..57bf0c5c2ae 100644 --- a/ui/packages/i18n/src/locales/ja.ts +++ b/ui/packages/i18n/src/locales/ja.ts @@ -3616,11 +3616,7 @@ const ja = { redirecting: "{{seconds}} 秒後にリダイレクトします…", redirectPending: "リダイレクトしています…", loading: "フォームを読み込み中…", - requiredHint: "* 必須項目", requiredFields: "必須項目: {{fields}}", - consentRequired: "続行するにはプライバシーポリシーに同意してください。", - rateLimited: "送信前に回答を確認してください。", - redirectBlocked: "送信は受理されましたが、リダイレクトURLはセキュリティのためブロックされました。", }, connectAgent: { disabled: { diff --git a/ui/packages/i18n/src/locales/ko.ts b/ui/packages/i18n/src/locales/ko.ts index c27dee39e6f..abbb6a1c072 100644 --- a/ui/packages/i18n/src/locales/ko.ts +++ b/ui/packages/i18n/src/locales/ko.ts @@ -3613,11 +3613,7 @@ const ko = { redirecting: "{{seconds}}초 후 리디렉션됩니다…", redirectPending: "리디렉션 중…", loading: "양식 로딩 중…", - requiredHint: "* 필수 필드", requiredFields: "필수 항목: {{fields}}", - consentRequired: "계속하려면 개인정보 처리방침에 동의하세요.", - rateLimited: "제출하기 전에 잠시 답변을 검토하세요.", - redirectBlocked: "제출이 수락되었지만 보안상의 이유로 리디렉션 URL이 차단되었습니다.", }, connectAgent: { disabled: { diff --git a/ui/packages/i18n/src/locales/pt.ts b/ui/packages/i18n/src/locales/pt.ts index a769b138e8b..e56072aadbc 100644 --- a/ui/packages/i18n/src/locales/pt.ts +++ b/ui/packages/i18n/src/locales/pt.ts @@ -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: { diff --git a/ui/packages/i18n/src/locales/ru.ts b/ui/packages/i18n/src/locales/ru.ts index 50b6d937510..b3e5fb767ff 100644 --- a/ui/packages/i18n/src/locales/ru.ts +++ b/ui/packages/i18n/src/locales/ru.ts @@ -3773,11 +3773,7 @@ const ru = { redirecting: "Перенаправление через {{seconds}} с…", redirectPending: "Перенаправление…", loading: "Загрузка формы…", - requiredHint: "* Обязательное поле", requiredFields: "Обязательные поля: {{fields}}", - consentRequired: "Пожалуйста, примите политику конфиденциальности.", - rateLimited: "Проверьте ответы перед отправкой.", - redirectBlocked: "Ответ принят, но URL перенаправления заблокирован по соображениям безопасности.", }, connectAgent: { disabled: { diff --git a/ui/packages/i18n/src/locales/zh.ts b/ui/packages/i18n/src/locales/zh.ts index 7d1cf817420..39b3c8d8b30 100644 --- a/ui/packages/i18n/src/locales/zh.ts +++ b/ui/packages/i18n/src/locales/zh.ts @@ -3805,11 +3805,7 @@ const zh = { redirecting: '将在 {{seconds}} 秒后跳转…', redirectPending: '正在跳转…', loading: '正在加载表单…', - requiredHint: '* 为必填项', requiredFields: '必填项:{{fields}}', - consentRequired: '请先勾选同意隐私政策。', - rateLimited: '请再花点时间核对一下您的填写内容,再点击提交。', - redirectBlocked: '提交成功,但出于安全考虑,跳转链接已被阻止。', }, connectAgent: { disabled: { diff --git a/ui/packages/plugin-detail/src/index.tsx b/ui/packages/plugin-detail/src/index.tsx index 86d579e1405..1463a822825 100644 --- a/ui/packages/plugin-detail/src/index.tsx +++ b/ui/packages/plugin-detail/src/index.tsx @@ -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 diff --git a/ui/packages/react/src/index.ts b/ui/packages/react/src/index.ts index e9043af974a..d5cf914b219 100644 --- a/ui/packages/react/src/index.ts +++ b/ui/packages/react/src/index.ts @@ -58,10 +58,10 @@ export { // The ENABLEMENT gate's opening line (objectui#6445). Exported beside its // sibling for the reason that one is: an app filtering these out of its // console transport filters by the constant, and a second line it cannot - // name is a second thing to hard-code. Not a second reporter — the emit, - // the dedupe `Set` and the reset above are still the only ones. + // name is a second thing to hard-code. Not a second reporter — the emit + // and the dedupe `Set` in `visibilityDiagnostic` are still the only ones. UNRESOLVABLE_ENABLEMENT_PREFIX, - __resetVisibilityPredicateWarnings, + // `__resetVisibilityPredicateWarnings` is test-only and stays off the barrel } from './utils/visibilityDiagnostic.js'; // The per-surface scope hint those two take (objectui#6487). Exported because // `@object-ui/app-shell` — a caller in another package — has to name its tier, diff --git a/ui/packages/types/src/__tests__/record-id-string-survivors-10078.test.ts b/ui/packages/types/src/__tests__/record-id-string-survivors-10078.test.ts index 56d84aee453..ea2b8d70d56 100644 --- a/ui/packages/types/src/__tests__/record-id-string-survivors-10078.test.ts +++ b/ui/packages/types/src/__tests__/record-id-string-survivors-10078.test.ts @@ -7,30 +7,28 @@ */ /** - * objectui#10078 - three more record-id declarations that the objectui#9511 - * ruling did not enumerate are strings too. + * objectui#10078 - more record-id declarations that the objectui#9511 ruling + * did not enumerate are strings too. * * ## What is pinned * * Director batch #195 item 1, letter A (objectui#9511) made a record id a * `string` wherever METADATA names one, and extended it as "the same * principle" to `CommentEntry.recordId` / `MentionNotification.recordId`. The - * three below are runtime / API shapes that ruling did not name; carrying the + * two below are runtime / API shapes that ruling did not name; carrying the * rule to them is the `domain:spec` seat's inheritance decision in the claim on - * objectui#10078. Each carries the same id with the old `string | number` + * objectui#10078. Each carried the same id with the old `string | number` * spelling: * - * - `CommentSearchResult.recordId` - the record a matching comment belongs to, - * copied from `CommentEntry.recordId` (already a string since objectui#9511); * - `RecordSubscription.recordId` - the record a notification bell is for; * - `DataSourceMutationEvent.id` - the record a `DataSource` write touched, the * same id the `update` / `delete` doors already take as a string. * - * All three are runtime / API shapes with NO zod mirror (nothing authors them + * Both are runtime / API shapes with NO zod mirror (nothing authors them * into JSON), so the compiler is the only face that can refuse a number, and * this file is where that refusal is asserted. * - * ⚠️ This file pins these three ONLY. Other record ids in this package still + * ⚠️ This file pins these two ONLY. Other record ids in this package still * admit a number and are out of its scope, so a green run here says nothing * about the rest of the family. * @@ -51,7 +49,7 @@ import { describe, it, expect } from 'vitest'; import { readFileSync } from 'node:fs'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; -import type { CommentSearchResult, RecordSubscription } from '../views'; +import type { RecordSubscription } from '../views'; import type { DataSourceMutationEvent } from '../data'; /* ------------------------------------------------------------------ * @@ -62,13 +60,11 @@ type Equal = (() => T extends X ? 1 : 2) extends (() => T extends Y ? 1 : 2) ? true : false; type Expect = T; -type _CommentSearchResultRecordIdIsAString = Expect>; type _RecordSubscriptionRecordIdIsAString = Expect>; /** Optional member: `NonNullable` strips the `undefined` that `?` adds. */ type _MutationEventIdIsAString = Expect, string>>; /** Stated separately so a degradation to `any` cannot pass the rows above. */ -type _CommentSearchResultRecordIdIsNotAny = Expect, false>>; type _RecordSubscriptionRecordIdIsNotAny = Expect, false>>; type _MutationEventIdIsNotAny = Expect, false>>; @@ -78,17 +74,14 @@ type _MutationEventIdIsNotAny = Expect = [ - ['views.ts', 'CommentSearchResult', 'recordId'], ['views.ts', 'RecordSubscription', 'recordId'], ['data.ts', 'DataSourceMutationEvent', 'id'], ]; @@ -144,7 +136,7 @@ describe('the census instrument can fire (controls)', () => { }); }); -describe('the three surviving record ids are strings (objectui#10078)', () => { +describe('the surviving record ids are strings (objectui#10078)', () => { for (const [file, iface, member] of SITES) { it(`\`${iface}.${member}\` declares the protocol string id`, () => { expect( diff --git a/ui/packages/types/src/index.ts b/ui/packages/types/src/index.ts index 81252c667fc..abd31697534 100644 --- a/ui/packages/types/src/index.ts +++ b/ui/packages/types/src/index.ts @@ -1071,7 +1071,6 @@ export type { ViewComponentSchema, CommentEntry, MentionNotification, - CommentSearchResult, ActivityEntry, // Feed / Chatter Protocol Types FeedItemType, diff --git a/ui/packages/types/src/views.ts b/ui/packages/types/src/views.ts index 785afe2da49..226369246b0 100644 --- a/ui/packages/types/src/views.ts +++ b/ui/packages/types/src/views.ts @@ -507,20 +507,6 @@ export interface MentionNotification { channels?: Array<'in_app' | 'email' | 'push'>; } -/** - * Comment search result - returned when searching comments across records - */ -export interface CommentSearchResult { - /** The matching comment */ - comment: CommentEntry; - /** Object name the comment belongs to */ - objectName: string; - /** Record ID the comment belongs to. A string, per the one record-id rule (objectui#9511, objectui#10078). */ - recordId: string; - /** Highlighted text snippet with search term marked */ - highlight?: string; -} - /** * Activity Entry - represents a single activity/field change on a record */