Seeded section text should look like the form default state, not locked primary, and Customize stays on the kebab instead of unlocking the body. Co-authored-by: Cursor <cursoragent@cursor.com>
65 lines
2.8 KiB
TypeScript
65 lines
2.8 KiB
TypeScript
import type { CreateFlowState } from "../../app/(app)/create/types";
|
|
import type { CustomMethodCardFieldBlock } from "./customMethodCardFieldBlocks";
|
|
import { isCatalogMethodCardId } from "./customRuleFacets";
|
|
import { isCustomMethodCardId } from "./isCustomMethodCardId";
|
|
|
|
/**
|
|
* Create modals use {@link CustomMethodCardModalBody} when there are structured field
|
|
* blocks for this method id (wizard-finalized cards, final-review chip edits, etc.),
|
|
* including **proportion-only** layouts.
|
|
*
|
|
* Check persisted blocks **before** {@link isCustomMethodCardId}: `meta` can be absent
|
|
* while `customMethodCardFieldBlocksById[id]` is still populated (e.g. partial merges).
|
|
*
|
|
* Duplicating a preset registers `meta` for the clone but leaves blocks empty — those
|
|
* stubs keep the facet's structured edit fields until the user adds blocks (then this
|
|
* returns true once persisted blocks are non-empty).
|
|
*
|
|
* Non-empty **draft** blocks also win, including catalog ids after Customize
|
|
* Finalize (facet editors ignore array order).
|
|
*
|
|
* Catalog slugs (`video-meetings`, `signal`, …) may also have a meta row after
|
|
* Customize writes a title override. Those cards keep the facet section editors
|
|
* unless field blocks exist — matching catalog copy must not hide Core Principle /
|
|
* Logistics / etc.
|
|
*
|
|
* **View mode** (`modalEditUnlocked` false): when a **user-authored** card still has
|
|
* facet copy that matches empty preset seeds only (see
|
|
* `./methodCardFacetMatchesPresetForId`), route to {@link CustomMethodCardModalBody}
|
|
* so meta-only wizard cards show policy copy instead of empty section editors.
|
|
* Pass `customFacetDetailsMatchPreset: false` when the caller knows facet details
|
|
* were edited or cloned from a filled preset.
|
|
*
|
|
* Create-flow facet screens and final-review pass `modalEditUnlocked: true` so
|
|
* section fields stay editable on open (Customize is the kebab wizard).
|
|
*/
|
|
export function usesWizardFieldBlocksModalBody(args: {
|
|
methodId: string;
|
|
meta: CreateFlowState["customMethodCardMetaById"];
|
|
fieldBlocksById: CreateFlowState["customMethodCardFieldBlocksById"];
|
|
modalEditUnlocked: boolean;
|
|
draftFieldBlocks: readonly CustomMethodCardFieldBlock[] | null;
|
|
/** When strictly `true` and modal is read-only, use wizard body for custom cards with empty blocks. */
|
|
customFacetDetailsMatchPreset?: boolean;
|
|
}): boolean {
|
|
const persisted = args.fieldBlocksById?.[args.methodId];
|
|
if (Array.isArray(persisted) && persisted.length > 0) {
|
|
return true;
|
|
}
|
|
if (
|
|
args.draftFieldBlocks !== null &&
|
|
args.draftFieldBlocks.length > 0
|
|
) {
|
|
return true;
|
|
}
|
|
if (!isCustomMethodCardId(args.methodId, args.meta)) {
|
|
return false;
|
|
}
|
|
if (isCatalogMethodCardId(args.methodId)) {
|
|
return false;
|
|
}
|
|
return (
|
|
!args.modalEditUnlocked && args.customFacetDetailsMatchPreset === true
|
|
);
|
|
}
|