From 3e9b246b1daf1a6eaaacb6bad33381100754b83d Mon Sep 17 00:00:00 2001 From: Luke Melia Date: Tue, 20 Jan 2026 17:45:28 -0500 Subject: [PATCH] Basic ability to choose a file for a linksTo(FileDef) field - Improves cache invalidation when linked-to files haven't been indexed yet --- packages/base/card-api.gts | 11 +-- packages/base/links-to-editor.gts | 13 ++- packages/base/links-to-many-component.gts | 9 +- .../operator-mode/choose-file-modal.gts | 18 ++-- packages/host/app/services/store.ts | 26 ++++++ .../acceptance/interact-submode-test.gts | 52 ++++++++++- .../tests/helpers/interact-submode-setup.gts | 38 ++++++-- .../components/card-basics-test.gts | 11 +-- .../host/tests/integration/realm-test.gts | 42 +++++++++ .../host/tests/integration/store-test.gts | 31 +++++++ packages/runtime-common/document.ts | 9 +- packages/runtime-common/error.ts | 2 +- packages/runtime-common/file-def-map.ts | 38 ++++++++ packages/runtime-common/index-runner.ts | 38 +------- packages/runtime-common/index.ts | 7 ++ .../runtime-common/realm-index-updater.ts | 11 +++ packages/runtime-common/realm.ts | 88 ++----------------- 17 files changed, 280 insertions(+), 164 deletions(-) create mode 100644 packages/runtime-common/file-def-map.ts diff --git a/packages/base/card-api.gts b/packages/base/card-api.gts index 273c39401e..1711c68fcc 100644 --- a/packages/base/card-api.gts +++ b/packages/base/card-api.gts @@ -1318,9 +1318,8 @@ class LinksTo implements Field { format: Format | undefined, defaultFormat: Format, isComputed: boolean, - isFileDef: boolean, ) { - return (format ?? defaultFormat) === 'edit' && !isComputed && !isFileDef; + return (format ?? defaultFormat) === 'edit' && !isComputed; } function getChildFormat( format: Format | undefined, @@ -1354,9 +1353,7 @@ class LinksTo implements Field { {{#if - (shouldRenderEditor - @format defaultFormats.cardDef isComputed isFileDef - ) + (shouldRenderEditor @format defaultFormats.cardDef isComputed) }} ; + model: Box; field: Field; typeConstraint?: ResolvedCodeRef; createCard?: CreateCardFn; @@ -166,6 +167,14 @@ export class LinksToEditor extends GlimmerComponent { } private chooseCard = restartableTask(async () => { + if (isFileDefConstructor(this.args.field.card as typeof BaseDef)) { + let file = await chooseFile(); + if (file) { + this.args.model.value = file; + } + return; + } + let type = identifyCard(this.args.field.card) ?? baseCardRef; if (this.args.typeConstraint) { type = await getNarrowestType(this.args.typeConstraint, type, myLoader()); diff --git a/packages/base/links-to-many-component.gts b/packages/base/links-to-many-component.gts index 2a6b173fd2..438c2017be 100644 --- a/packages/base/links-to-many-component.gts +++ b/packages/base/links-to-many-component.gts @@ -482,9 +482,8 @@ function shouldRenderEditor( format: Format | undefined, defaultFormat: Format, isComputed: boolean, - isFileDef: boolean, ) { - return (format ?? defaultFormat) === 'edit' && !isComputed && !isFileDef; + return (format ?? defaultFormat) === 'edit' && !isComputed; } const componentCache = initSharedState( 'linksToManyComponentCache', @@ -519,11 +518,7 @@ export function getLinksToManyComponent({ let linksToManyComponent = class LinksToManyComponent extends GlimmerComponent {