@pipe0/react 0.2.14 → 0.2.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/dist/components/compound/pipe-catalog/empty.mjs.map +1 -1
- package/dist/components/compound/pipe-catalog/input-field-filter.mjs.map +1 -1
- package/dist/components/compound/pipe-catalog/output-field-filter.mjs.map +1 -1
- package/dist/components/compound/pipe-catalog/provider-filter.mjs.map +1 -1
- package/dist/components/compound/pipe-catalog/root.mjs.map +1 -1
- package/dist/components/compound/pipe-catalog/tag-filter.mjs.map +1 -1
- package/dist/components/compound/search-catalog/output-field-filter.mjs.map +1 -1
- package/dist/components/compound/search-catalog/root.mjs.map +1 -1
- package/dist/components/compound/search-catalog/tag-filter.mjs.map +1 -1
- package/dist/components/compound/searches-catalog/output-field-filter.mjs.map +1 -1
- package/dist/components/compound/searches-catalog/provider-filter.mjs.map +1 -1
- package/dist/components/compound/searches-catalog/root.mjs.map +1 -1
- package/dist/components/compound/searches-catalog/tag-filter.mjs.map +1 -1
- package/dist/components/defaults/adapters/fields-select-input.mjs +3 -2
- package/dist/components/defaults/adapters/fields-select-input.mjs.map +1 -1
- package/dist/components/defaults/adapters/pipes-run-if-input.mjs +13 -3
- package/dist/components/defaults/adapters/pipes-run-if-input.mjs.map +1 -1
- package/dist/components/defaults/catalog/card-primitives.d.mts.map +1 -1
- package/dist/components/defaults/catalog/card-primitives.mjs.map +1 -1
- package/dist/hooks/use-pipe-catalog-table.d.mts +15 -9
- package/dist/hooks/use-pipe-catalog-table.d.mts.map +1 -1
- package/dist/hooks/use-pipe-catalog-table.mjs +29 -5
- package/dist/hooks/use-pipe-catalog-table.mjs.map +1 -1
- package/dist/hooks/use-search-catalog-table.d.mts +7 -1
- package/dist/hooks/use-search-catalog-table.d.mts.map +1 -1
- package/dist/hooks/use-search-catalog-table.mjs +24 -5
- package/dist/hooks/use-search-catalog-table.mjs.map +1 -1
- package/dist/styles/pipe0-form.css +1 -1
- package/dist/types/catalog-adapters.d.mts +13 -1
- package/dist/types/catalog-adapters.d.mts.map +1 -1
- package/dist/widgets/avatar-group.d.mts.map +1 -1
- package/dist/widgets/avatar-group.mjs +45 -23
- package/dist/widgets/avatar-group.mjs.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"empty.mjs","names":[],"sources":["../../../../src/components/compound/pipe-catalog/empty.tsx"],"sourcesContent":["import { mergeProps } from \"@base-ui/react/merge-props\";\nimport { useRender } from \"@base-ui/react/use-render\";\nimport { useCatalogConfig } from \"../../../context/catalog-config-context.js\";\nimport { usePipeCatalogContext } from \"../../../context/pipe-catalog-context.js\";\nimport { DefaultEmptyState } from \"../../defaults/catalog/empty-state.js\";\n\nexport interface PipeCatalogEmptyState {\n visible: boolean;\n}\n\nexport interface PipeCatalogEmptyProps\n extends useRender.ComponentProps<\"div\", PipeCatalogEmptyState> {}\n\nexport function PipeCatalogEmpty({ children, className, render, ...props }: PipeCatalogEmptyProps) {\n const { components } = useCatalogConfig();\n const ctx = usePipeCatalogContext();\n const visible = ctx.table.getRowModel().rows.length === 0;\n\n const EmptyState = components?.EmptyState;\n const defaultBody = EmptyState ? (\n <EmptyState>{children}</EmptyState>\n ) : (\n <DefaultEmptyState
|
|
1
|
+
{"version":3,"file":"empty.mjs","names":[],"sources":["../../../../src/components/compound/pipe-catalog/empty.tsx"],"sourcesContent":["import { mergeProps } from \"@base-ui/react/merge-props\";\nimport { useRender } from \"@base-ui/react/use-render\";\nimport { useCatalogConfig } from \"../../../context/catalog-config-context.js\";\nimport { usePipeCatalogContext } from \"../../../context/pipe-catalog-context.js\";\nimport { DefaultEmptyState } from \"../../defaults/catalog/empty-state.js\";\n\nexport interface PipeCatalogEmptyState {\n visible: boolean;\n}\n\nexport interface PipeCatalogEmptyProps\n extends useRender.ComponentProps<\"div\", PipeCatalogEmptyState> {}\n\nexport function PipeCatalogEmpty({ children, className, render, ...props }: PipeCatalogEmptyProps) {\n const { components } = useCatalogConfig();\n const ctx = usePipeCatalogContext();\n const visible = ctx.table.getRowModel().rows.length === 0;\n\n const EmptyState = components?.EmptyState;\n const defaultBody = EmptyState ? (\n <EmptyState>{children}</EmptyState>\n ) : (\n <DefaultEmptyState>\n {children ?? \"No pipes found. Try adjusting your filters.\"}\n </DefaultEmptyState>\n );\n\n const element = useRender({\n defaultTagName: \"div\",\n render,\n state: { visible },\n props: mergeProps<\"div\">(\n {\n className,\n children: defaultBody,\n ...({ \"data-p0\": \"catalog-empty\" } as Record<string, string>),\n },\n props,\n ),\n });\n\n if (!visible) return null;\n return element;\n}\n"],"mappings":";;;;;;;;AAaA,SAAgB,iBAAiB,EAAE,UAAU,WAAW,QAAQ,GAAG,SAAgC;CACjG,MAAM,EAAE,eAAe,kBAAkB;CAEzC,MAAM,UADM,uBAAuB,CACf,MAAM,aAAa,CAAC,KAAK,WAAW;CAExD,MAAM,aAAa,YAAY;CAS/B,MAAM,UAAU,UAAU;EACxB,gBAAgB;EAChB;EACA,OAAO,EAAE,SAAS;EAClB,OAAO,WACL;GACE;GACA,UAfc,aAClB,oBAAC,YAAD,EAAa,UAAsB,IAEnC,oBAAC,mBAAD,YACG,YAAY,+CACK;GAWV,WAAW;GAClB,EACD,MACD;EACF,CAAC;AAEF,KAAI,CAAC,QAAS,QAAO;AACrB,QAAO"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input-field-filter.mjs","names":[],"sources":["../../../../src/components/compound/pipe-catalog/input-field-filter.tsx"],"sourcesContent":["import { useRender } from \"@base-ui/react/use-render\";\nimport { ArrowUp } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport type { FilterSelectOption } from \"../../defaults/catalog/filter-select.js\";\nimport { type ColumnFilterState, PipeCatalogColumnFilter } from \"./column-filter.js\";\n\nexport interface PipeCatalogInputFieldFilterProps {\n options?: ReadonlyArray<FilterSelectOption>;\n placeholder?: ReactNode;\n className?: string;\n render?: useRender.ComponentProps<\"div\", ColumnFilterState>[\"render\"];\n}\n\nconst DEFAULT_PLACEHOLDER = (\n <span className=\"pz:inline-flex pz:items-center pz:gap-1.5\">\n <ArrowUp className=\"pz:size-4\" /> Input fields\n </span>\n);\n\nexport function PipeCatalogInputFieldFilter({\n options,\n placeholder = DEFAULT_PLACEHOLDER,\n className,\n render,\n}: PipeCatalogInputFieldFilterProps) {\n return (\n <PipeCatalogColumnFilter\n id=\"inputFields\"\n placeholder={placeholder}\n options={options}\n className={className}\n render={render}\n />\n );\n}\n"],"mappings":";;;;;AAaA,MAAM,sBACJ,qBAAC,QAAD;CAAM,WAAU;WAAhB,CACE,oBAAC,SAAD,EAAS,WAAU,aAAc,mBAC5B;;AAGT,SAAgB,4BAA4B,EAC1C,SACA,cAAc,qBACd,WACA,UACmC;AACnC,QACE,oBAAC,yBAAD;EACE,IAAG;EACU;EACJ;EACE;EACH;EACR"}
|
|
1
|
+
{"version":3,"file":"input-field-filter.mjs","names":[],"sources":["../../../../src/components/compound/pipe-catalog/input-field-filter.tsx"],"sourcesContent":["import type { useRender } from \"@base-ui/react/use-render\";\nimport { ArrowUp } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport type { FilterSelectOption } from \"../../defaults/catalog/filter-select.js\";\nimport { type ColumnFilterState, PipeCatalogColumnFilter } from \"./column-filter.js\";\n\nexport interface PipeCatalogInputFieldFilterProps {\n options?: ReadonlyArray<FilterSelectOption>;\n placeholder?: ReactNode;\n className?: string;\n render?: useRender.ComponentProps<\"div\", ColumnFilterState>[\"render\"];\n}\n\nconst DEFAULT_PLACEHOLDER = (\n <span className=\"pz:inline-flex pz:items-center pz:gap-1.5\">\n <ArrowUp className=\"pz:size-4\" /> Input fields\n </span>\n);\n\nexport function PipeCatalogInputFieldFilter({\n options,\n placeholder = DEFAULT_PLACEHOLDER,\n className,\n render,\n}: PipeCatalogInputFieldFilterProps) {\n return (\n <PipeCatalogColumnFilter\n id=\"inputFields\"\n placeholder={placeholder}\n options={options}\n className={className}\n render={render}\n />\n );\n}\n"],"mappings":";;;;;AAaA,MAAM,sBACJ,qBAAC,QAAD;CAAM,WAAU;WAAhB,CACE,oBAAC,SAAD,EAAS,WAAU,aAAc,mBAC5B;;AAGT,SAAgB,4BAA4B,EAC1C,SACA,cAAc,qBACd,WACA,UACmC;AACnC,QACE,oBAAC,yBAAD;EACE,IAAG;EACU;EACJ;EACE;EACH;EACR"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output-field-filter.mjs","names":[],"sources":["../../../../src/components/compound/pipe-catalog/output-field-filter.tsx"],"sourcesContent":["import { useRender } from \"@base-ui/react/use-render\";\nimport { ArrowDown } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport type { FilterSelectOption } from \"../../defaults/catalog/filter-select.js\";\nimport { type ColumnFilterState, PipeCatalogColumnFilter } from \"./column-filter.js\";\n\nexport interface PipeCatalogOutputFieldFilterProps {\n options?: ReadonlyArray<FilterSelectOption>;\n placeholder?: ReactNode;\n className?: string;\n render?: useRender.ComponentProps<\"div\", ColumnFilterState>[\"render\"];\n}\n\nconst DEFAULT_PLACEHOLDER = (\n <span className=\"pz:inline-flex pz:items-center pz:gap-1.5\">\n <ArrowDown className=\"pz:size-4\" /> Output fields\n </span>\n);\n\nexport function PipeCatalogOutputFieldFilter({\n options,\n placeholder = DEFAULT_PLACEHOLDER,\n className,\n render,\n}: PipeCatalogOutputFieldFilterProps) {\n return (\n <PipeCatalogColumnFilter\n id=\"outputFields\"\n placeholder={placeholder}\n options={options}\n className={className}\n render={render}\n />\n );\n}\n"],"mappings":";;;;;AAaA,MAAM,sBACJ,qBAAC,QAAD;CAAM,WAAU;WAAhB,CACE,oBAAC,WAAD,EAAW,WAAU,aAAc,oBAC9B;;AAGT,SAAgB,6BAA6B,EAC3C,SACA,cAAc,qBACd,WACA,UACoC;AACpC,QACE,oBAAC,yBAAD;EACE,IAAG;EACU;EACJ;EACE;EACH;EACR"}
|
|
1
|
+
{"version":3,"file":"output-field-filter.mjs","names":[],"sources":["../../../../src/components/compound/pipe-catalog/output-field-filter.tsx"],"sourcesContent":["import type { useRender } from \"@base-ui/react/use-render\";\nimport { ArrowDown } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport type { FilterSelectOption } from \"../../defaults/catalog/filter-select.js\";\nimport { type ColumnFilterState, PipeCatalogColumnFilter } from \"./column-filter.js\";\n\nexport interface PipeCatalogOutputFieldFilterProps {\n options?: ReadonlyArray<FilterSelectOption>;\n placeholder?: ReactNode;\n className?: string;\n render?: useRender.ComponentProps<\"div\", ColumnFilterState>[\"render\"];\n}\n\nconst DEFAULT_PLACEHOLDER = (\n <span className=\"pz:inline-flex pz:items-center pz:gap-1.5\">\n <ArrowDown className=\"pz:size-4\" /> Output fields\n </span>\n);\n\nexport function PipeCatalogOutputFieldFilter({\n options,\n placeholder = DEFAULT_PLACEHOLDER,\n className,\n render,\n}: PipeCatalogOutputFieldFilterProps) {\n return (\n <PipeCatalogColumnFilter\n id=\"outputFields\"\n placeholder={placeholder}\n options={options}\n className={className}\n render={render}\n />\n );\n}\n"],"mappings":";;;;;AAaA,MAAM,sBACJ,qBAAC,QAAD;CAAM,WAAU;WAAhB,CACE,oBAAC,WAAD,EAAW,WAAU,aAAc,oBAC9B;;AAGT,SAAgB,6BAA6B,EAC3C,SACA,cAAc,qBACd,WACA,UACoC;AACpC,QACE,oBAAC,yBAAD;EACE,IAAG;EACU;EACJ;EACE;EACH;EACR"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-filter.mjs","names":[],"sources":["../../../../src/components/compound/pipe-catalog/provider-filter.tsx"],"sourcesContent":["import { useRender } from \"@base-ui/react/use-render\";\nimport { getProviderEntry, type ProviderName } from \"@pipe0/base\";\nimport { Building2 } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport { usePipeCatalogContext } from \"../../../context/pipe-catalog-context.js\";\nimport type { FilterSelectOption } from \"../../defaults/catalog/filter-select.js\";\nimport { type ColumnFilterState, PipeCatalogColumnFilter } from \"./column-filter.js\";\n\nexport interface PipeCatalogProviderFilterProps {\n options?: ReadonlyArray<FilterSelectOption>;\n placeholder?: ReactNode;\n className?: string;\n render?: useRender.ComponentProps<\"div\", ColumnFilterState>[\"render\"];\n}\n\nconst DEFAULT_PLACEHOLDER = (\n <span className=\"pz:inline-flex pz:items-center pz:gap-1.5\">\n <Building2 className=\"pz:size-4\" /> Provider\n </span>\n);\n\nexport function PipeCatalogProviderFilter({\n options,\n placeholder = DEFAULT_PLACEHOLDER,\n className,\n render,\n}: PipeCatalogProviderFilterProps) {\n const ctx = usePipeCatalogContext();\n // Provider option labels carry the logo image so the default <Select> shows\n // the brand mark — matches what dash users expect from this filter.\n const resolvedOptions =\n options ??\n ctx.sortedProviderEntries.map(([name]) => ({\n label: name,\n value: name,\n imageSrc: getProviderEntry(name as ProviderName)?.logoUrl,\n }));\n\n return (\n <PipeCatalogColumnFilter\n id=\"providers\"\n placeholder={placeholder}\n options={resolvedOptions}\n className={className}\n render={render}\n />\n );\n}\n"],"mappings":";;;;;;;AAeA,MAAM,sBACJ,qBAAC,QAAD;CAAM,WAAU;WAAhB,CACE,oBAAC,WAAD,EAAW,WAAU,aAAc,eAC9B;;AAGT,SAAgB,0BAA0B,EACxC,SACA,cAAc,qBACd,WACA,UACiC;CACjC,MAAM,MAAM,uBAAuB;AAWnC,QACE,oBAAC,yBAAD;EACE,IAAG;EACU;EACb,SAXF,WACA,IAAI,sBAAsB,KAAK,CAAC,WAAW;GACzC,OAAO;GACP,OAAO;GACP,UAAU,iBAAiB,KAAqB,EAAE;GACnD,EAAE;EAOU;EACH;EACR"}
|
|
1
|
+
{"version":3,"file":"provider-filter.mjs","names":[],"sources":["../../../../src/components/compound/pipe-catalog/provider-filter.tsx"],"sourcesContent":["import type { useRender } from \"@base-ui/react/use-render\";\nimport { getProviderEntry, type ProviderName } from \"@pipe0/base\";\nimport { Building2 } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport { usePipeCatalogContext } from \"../../../context/pipe-catalog-context.js\";\nimport type { FilterSelectOption } from \"../../defaults/catalog/filter-select.js\";\nimport { type ColumnFilterState, PipeCatalogColumnFilter } from \"./column-filter.js\";\n\nexport interface PipeCatalogProviderFilterProps {\n options?: ReadonlyArray<FilterSelectOption>;\n placeholder?: ReactNode;\n className?: string;\n render?: useRender.ComponentProps<\"div\", ColumnFilterState>[\"render\"];\n}\n\nconst DEFAULT_PLACEHOLDER = (\n <span className=\"pz:inline-flex pz:items-center pz:gap-1.5\">\n <Building2 className=\"pz:size-4\" /> Provider\n </span>\n);\n\nexport function PipeCatalogProviderFilter({\n options,\n placeholder = DEFAULT_PLACEHOLDER,\n className,\n render,\n}: PipeCatalogProviderFilterProps) {\n const ctx = usePipeCatalogContext();\n // Provider option labels carry the logo image so the default <Select> shows\n // the brand mark — matches what dash users expect from this filter.\n const resolvedOptions =\n options ??\n ctx.sortedProviderEntries.map(([name]) => ({\n label: name,\n value: name,\n imageSrc: getProviderEntry(name as ProviderName)?.logoUrl,\n }));\n\n return (\n <PipeCatalogColumnFilter\n id=\"providers\"\n placeholder={placeholder}\n options={resolvedOptions}\n className={className}\n render={render}\n />\n );\n}\n"],"mappings":";;;;;;;AAeA,MAAM,sBACJ,qBAAC,QAAD;CAAM,WAAU;WAAhB,CACE,oBAAC,WAAD,EAAW,WAAU,aAAc,eAC9B;;AAGT,SAAgB,0BAA0B,EACxC,SACA,cAAc,qBACd,WACA,UACiC;CACjC,MAAM,MAAM,uBAAuB;AAWnC,QACE,oBAAC,yBAAD;EACE,IAAG;EACU;EACb,SAXF,WACA,IAAI,sBAAsB,KAAK,CAAC,WAAW;GACzC,OAAO;GACP,OAAO;GACP,UAAU,iBAAiB,KAAqB,EAAE;GACnD,EAAE;EAOU;EACH;EACR"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"root.mjs","names":[],"sources":["../../../../src/components/compound/pipe-catalog/root.tsx"],"sourcesContent":["import { useRender } from \"@base-ui/react/use-render\";\nimport type { CatalogFilter } from \"@pipe0/base\";\nimport type { ColumnFilter } from \"@tanstack/react-table\";\nimport type { ReactNode, SyntheticEvent } from \"react\";\nimport { useMemo, useState } from \"react\";\nimport {\n CatalogProvider,\n CatalogRoot,\n useCatalogConfig,\n} from \"../../../context/catalog-config-context.js\";\nimport {\n PipeCatalogContext,\n type PipeCatalogContextValue,\n} from \"../../../context/pipe-catalog-context.js\";\nimport {\n type UsePipeCatalogTableReturn,\n usePipeCatalogTable,\n} from \"../../../hooks/use-pipe-catalog-table.js\";\nimport type {\n CatalogClassNames,\n CatalogComponentOverrides,\n PipeCardData,\n} from \"../../../types/catalog-adapters.js\";\nimport { DefaultCatalogRoot } from \"../../defaults/catalog/layout.js\";\nimport { PipeCatalogActiveFilters } from \"./active-filters.js\";\nimport { PipeCatalogCategoryFilter } from \"./category-filter.js\";\nimport { PipeCatalogColumnFilters } from \"./column-filters.js\";\nimport { PipeCatalogEmpty } from \"./empty.js\";\nimport { PipeCatalogList } from \"./list.js\";\nimport { PipeCatalogSearchFilter } from \"./search-filter.js\";\n\ninterface CustomizationProps {\n classNames?: CatalogClassNames;\n components?: CatalogComponentOverrides;\n className?: string;\n /** Render slot for the outer wrapper. */\n render?: useRender.ComponentProps<\"div\">[\"render\"];\n}\n\ninterface SelectionProps {\n /** Fires on click / keyboard activation of any `<PipeCatalogCard>`. */\n onSelectPipe?: (pipe: PipeCardData, e: SyntheticEvent) => void;\n}\n\nexport interface PipeCatalogInstanceProps extends CustomizationProps, SelectionProps {\n /** Caller-owned hook return — pass when you need to read state outside the tree. */\n context: UsePipeCatalogTableReturn;\n children?: ReactNode;\n}\n\nexport interface PipeCatalogZeroConfigProps extends CustomizationProps, SelectionProps {\n /** Optional whitelist/blacklist applied before the user-facing filters. */\n filter?: CatalogFilter;\n initialColumnFilters?: ColumnFilter[];\n children?: ReactNode;\n}\n\nexport type PipeCatalogProps = PipeCatalogInstanceProps | PipeCatalogZeroConfigProps;\n\n/**\n * Compound root for the pipe catalog.\n *\n * Two modes:\n * - Caller-owned: `<PipeCatalog context={usePipeCatalogTable()}>...</PipeCatalog>`\n * - Zero-config: `<PipeCatalog filter={...} />` — a fresh hook is created internally.\n *\n * Children are optional. With no children, the default tree renders a\n * functional, neutrally-styled catalog: search filter, category filter,\n * column filters, active-filter pills, list, empty state.\n */\nexport function PipeCatalog(props: PipeCatalogProps) {\n if (\"context\" in props) {\n return <PipeCatalogWithContext {...props} />;\n }\n return <PipeCatalogZeroConfig {...props} />;\n}\n\nfunction PipeCatalogZeroConfig({
|
|
1
|
+
{"version":3,"file":"root.mjs","names":[],"sources":["../../../../src/components/compound/pipe-catalog/root.tsx"],"sourcesContent":["import type { useRender } from \"@base-ui/react/use-render\";\nimport type { CatalogFilter } from \"@pipe0/base\";\nimport type { ColumnFilter } from \"@tanstack/react-table\";\nimport type { ReactNode, SyntheticEvent } from \"react\";\nimport { useMemo, useState } from \"react\";\nimport {\n CatalogProvider,\n CatalogRoot,\n useCatalogConfig,\n} from \"../../../context/catalog-config-context.js\";\nimport {\n PipeCatalogContext,\n type PipeCatalogContextValue,\n} from \"../../../context/pipe-catalog-context.js\";\nimport {\n type UsePipeCatalogTableReturn,\n usePipeCatalogTable,\n} from \"../../../hooks/use-pipe-catalog-table.js\";\nimport type {\n CatalogClassNames,\n CatalogComponentOverrides,\n PipeCardData,\n} from \"../../../types/catalog-adapters.js\";\nimport { DefaultCatalogRoot } from \"../../defaults/catalog/layout.js\";\nimport { PipeCatalogActiveFilters } from \"./active-filters.js\";\nimport { PipeCatalogCategoryFilter } from \"./category-filter.js\";\nimport { PipeCatalogColumnFilters } from \"./column-filters.js\";\nimport { PipeCatalogEmpty } from \"./empty.js\";\nimport { PipeCatalogList } from \"./list.js\";\nimport { PipeCatalogSearchFilter } from \"./search-filter.js\";\n\ninterface CustomizationProps {\n classNames?: CatalogClassNames;\n components?: CatalogComponentOverrides;\n className?: string;\n /** Render slot for the outer wrapper. */\n render?: useRender.ComponentProps<\"div\">[\"render\"];\n}\n\ninterface SelectionProps {\n /** Fires on click / keyboard activation of any `<PipeCatalogCard>`. */\n onSelectPipe?: (pipe: PipeCardData, e: SyntheticEvent) => void;\n}\n\nexport interface PipeCatalogInstanceProps extends CustomizationProps, SelectionProps {\n /** Caller-owned hook return — pass when you need to read state outside the tree. */\n context: UsePipeCatalogTableReturn;\n children?: ReactNode;\n}\n\nexport interface PipeCatalogZeroConfigProps extends CustomizationProps, SelectionProps {\n /** Optional whitelist/blacklist applied before the user-facing filters. */\n filter?: CatalogFilter;\n initialColumnFilters?: ColumnFilter[];\n children?: ReactNode;\n}\n\nexport type PipeCatalogProps = PipeCatalogInstanceProps | PipeCatalogZeroConfigProps;\n\n/**\n * Compound root for the pipe catalog.\n *\n * Two modes:\n * - Caller-owned: `<PipeCatalog context={usePipeCatalogTable()}>...</PipeCatalog>`\n * - Zero-config: `<PipeCatalog filter={...} />` — a fresh hook is created internally.\n *\n * Children are optional. With no children, the default tree renders a\n * functional, neutrally-styled catalog: search filter, category filter,\n * column filters, active-filter pills, list, empty state.\n */\nexport function PipeCatalog(props: PipeCatalogProps) {\n if (\"context\" in props) {\n return <PipeCatalogWithContext {...props} />;\n }\n return <PipeCatalogZeroConfig {...props} />;\n}\n\nfunction PipeCatalogZeroConfig({\n filter,\n initialColumnFilters,\n ...rest\n}: PipeCatalogZeroConfigProps) {\n const context = usePipeCatalogTable({ filter, initialColumnFilters });\n return <PipeCatalogWithContext context={context} {...rest} />;\n}\n\nfunction PipeCatalogWithContext({\n context,\n children,\n className,\n classNames,\n components,\n onSelectPipe,\n render,\n}: PipeCatalogInstanceProps) {\n const hasLocalOverrides = classNames || components;\n const [expandedCardId, setExpandedCardId] = useState<string | null>(null);\n\n const value = useMemo<PipeCatalogContextValue>(\n () => ({\n ...context,\n onSelectCard: onSelectPipe,\n expandedCardId,\n setExpandedCardId,\n }),\n [context, onSelectPipe, expandedCardId],\n );\n\n const inner = (\n <PipeCatalogContext.Provider value={value}>\n <PipeCatalogShell className={className} render={render}>\n {children}\n </PipeCatalogShell>\n </PipeCatalogContext.Provider>\n );\n\n if (hasLocalOverrides) {\n return (\n <CatalogRoot>\n <CatalogProvider classNames={classNames} components={components}>\n {inner}\n </CatalogProvider>\n </CatalogRoot>\n );\n }\n return <CatalogRoot>{inner}</CatalogRoot>;\n}\n\nfunction PipeCatalogShell({\n children,\n className,\n render,\n}: {\n children?: ReactNode;\n className?: string;\n render?: useRender.ComponentProps<\"div\">[\"render\"];\n}) {\n useCatalogConfig();\n const body =\n children !== undefined ? (\n children\n ) : (\n <>\n <PipeCatalogSearchFilter />\n <PipeCatalogCategoryFilter />\n <PipeCatalogColumnFilters />\n <PipeCatalogActiveFilters />\n <PipeCatalogList />\n <PipeCatalogEmpty />\n </>\n );\n return (\n <DefaultCatalogRoot className={className} render={render}>\n {body}\n </DefaultCatalogRoot>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAsEA,SAAgB,YAAY,OAAyB;AACnD,KAAI,aAAa,MACf,QAAO,oBAAC,wBAAD,EAAwB,GAAI,OAAS;AAE9C,QAAO,oBAAC,uBAAD,EAAuB,GAAI,OAAS;;AAG7C,SAAS,sBAAsB,EAC7B,QACA,sBACA,GAAG,QAC0B;AAE7B,QAAO,oBAAC,wBAAD;EAAwB,SADf,oBAAoB;GAAE;GAAQ;GAAsB,CAAC;EACpB,GAAI;EAAQ;;AAG/D,SAAS,uBAAuB,EAC9B,SACA,UACA,WACA,YACA,YACA,cACA,UAC2B;CAC3B,MAAM,oBAAoB,cAAc;CACxC,MAAM,CAAC,gBAAgB,qBAAqB,SAAwB,KAAK;CAEzE,MAAM,QAAQ,eACL;EACL,GAAG;EACH,cAAc;EACd;EACA;EACD,GACD;EAAC;EAAS;EAAc;EAAe,CACxC;CAED,MAAM,QACJ,oBAAC,mBAAmB,UAApB;EAAoC;YAClC,oBAAC,kBAAD;GAA6B;GAAmB;GAC7C;GACgB;EACS;AAGhC,KAAI,kBACF,QACE,oBAAC,aAAD,YACE,oBAAC,iBAAD;EAA6B;EAAwB;YAClD;EACe,GACN;AAGlB,QAAO,oBAAC,aAAD,YAAc,OAAoB;;AAG3C,SAAS,iBAAiB,EACxB,UACA,WACA,UAKC;AACD,mBAAkB;AAclB,QACE,oBAAC,oBAAD;EAA+B;EAAmB;YAblD,aAAa,SACX,WAEA;GACE,oBAAC,yBAAD,EAA2B;GAC3B,oBAAC,2BAAD,EAA6B;GAC7B,oBAAC,0BAAD,EAA4B;GAC5B,oBAAC,0BAAD,EAA4B;GAC5B,oBAAC,iBAAD,EAAmB;GACnB,oBAAC,kBAAD,EAAoB;GACnB;EAKgB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tag-filter.mjs","names":[],"sources":["../../../../src/components/compound/pipe-catalog/tag-filter.tsx"],"sourcesContent":["import { useRender } from \"@base-ui/react/use-render\";\nimport { Tag } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport type { FilterSelectOption } from \"../../defaults/catalog/filter-select.js\";\nimport { type ColumnFilterState, PipeCatalogColumnFilter } from \"./column-filter.js\";\n\nexport interface PipeCatalogTagFilterProps {\n options?: ReadonlyArray<FilterSelectOption>;\n placeholder?: ReactNode;\n className?: string;\n render?: useRender.ComponentProps<\"div\", ColumnFilterState>[\"render\"];\n}\n\nconst DEFAULT_PLACEHOLDER = (\n <span className=\"pz:inline-flex pz:items-center pz:gap-1.5\">\n <Tag className=\"pz:size-4\" /> Tag\n </span>\n);\n\nexport function PipeCatalogTagFilter({\n options,\n placeholder = DEFAULT_PLACEHOLDER,\n className,\n render,\n}: PipeCatalogTagFilterProps) {\n return (\n <PipeCatalogColumnFilter\n id=\"tags\"\n placeholder={placeholder}\n options={options}\n className={className}\n render={render}\n />\n );\n}\n"],"mappings":";;;;;AAaA,MAAM,sBACJ,qBAAC,QAAD;CAAM,WAAU;WAAhB,CACE,oBAAC,KAAD,EAAK,WAAU,aAAc,UACxB;;AAGT,SAAgB,qBAAqB,EACnC,SACA,cAAc,qBACd,WACA,UAC4B;AAC5B,QACE,oBAAC,yBAAD;EACE,IAAG;EACU;EACJ;EACE;EACH;EACR"}
|
|
1
|
+
{"version":3,"file":"tag-filter.mjs","names":[],"sources":["../../../../src/components/compound/pipe-catalog/tag-filter.tsx"],"sourcesContent":["import type { useRender } from \"@base-ui/react/use-render\";\nimport { Tag } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport type { FilterSelectOption } from \"../../defaults/catalog/filter-select.js\";\nimport { type ColumnFilterState, PipeCatalogColumnFilter } from \"./column-filter.js\";\n\nexport interface PipeCatalogTagFilterProps {\n options?: ReadonlyArray<FilterSelectOption>;\n placeholder?: ReactNode;\n className?: string;\n render?: useRender.ComponentProps<\"div\", ColumnFilterState>[\"render\"];\n}\n\nconst DEFAULT_PLACEHOLDER = (\n <span className=\"pz:inline-flex pz:items-center pz:gap-1.5\">\n <Tag className=\"pz:size-4\" /> Tag\n </span>\n);\n\nexport function PipeCatalogTagFilter({\n options,\n placeholder = DEFAULT_PLACEHOLDER,\n className,\n render,\n}: PipeCatalogTagFilterProps) {\n return (\n <PipeCatalogColumnFilter\n id=\"tags\"\n placeholder={placeholder}\n options={options}\n className={className}\n render={render}\n />\n );\n}\n"],"mappings":";;;;;AAaA,MAAM,sBACJ,qBAAC,QAAD;CAAM,WAAU;WAAhB,CACE,oBAAC,KAAD,EAAK,WAAU,aAAc,UACxB;;AAGT,SAAgB,qBAAqB,EACnC,SACA,cAAc,qBACd,WACA,UAC4B;AAC5B,QACE,oBAAC,yBAAD;EACE,IAAG;EACU;EACJ;EACE;EACH;EACR"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output-field-filter.mjs","names":[],"sources":["../../../../src/components/compound/search-catalog/output-field-filter.tsx"],"sourcesContent":["import { useRender } from \"@base-ui/react/use-render\";\nimport { ArrowDown } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport type { FilterSelectOption } from \"../../defaults/catalog/filter-select.js\";\nimport { type ColumnFilterState, SearchCatalogColumnFilter } from \"./column-filter.js\";\n\nexport interface SearchCatalogOutputFieldFilterProps {\n options?: ReadonlyArray<FilterSelectOption>;\n placeholder?: ReactNode;\n className?: string;\n render?: useRender.ComponentProps<\"div\", ColumnFilterState>[\"render\"];\n}\n\nconst DEFAULT_PLACEHOLDER = (\n <span className=\"pz:inline-flex pz:items-center pz:gap-1.5\">\n <ArrowDown className=\"pz:size-4\" /> Output fields\n </span>\n);\n\nexport function SearchCatalogOutputFieldFilter({\n options,\n placeholder = DEFAULT_PLACEHOLDER,\n className,\n render,\n}: SearchCatalogOutputFieldFilterProps) {\n return (\n <SearchCatalogColumnFilter\n id=\"outputFields\"\n placeholder={placeholder}\n options={options}\n className={className}\n render={render}\n />\n );\n}\n"],"mappings":";;;;;AAaA,MAAM,sBACJ,qBAAC,QAAD;CAAM,WAAU;WAAhB,CACE,oBAAC,WAAD,EAAW,WAAU,aAAc,oBAC9B;;AAGT,SAAgB,+BAA+B,EAC7C,SACA,cAAc,qBACd,WACA,UACsC;AACtC,QACE,oBAAC,2BAAD;EACE,IAAG;EACU;EACJ;EACE;EACH;EACR"}
|
|
1
|
+
{"version":3,"file":"output-field-filter.mjs","names":[],"sources":["../../../../src/components/compound/search-catalog/output-field-filter.tsx"],"sourcesContent":["import type { useRender } from \"@base-ui/react/use-render\";\nimport { ArrowDown } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport type { FilterSelectOption } from \"../../defaults/catalog/filter-select.js\";\nimport { type ColumnFilterState, SearchCatalogColumnFilter } from \"./column-filter.js\";\n\nexport interface SearchCatalogOutputFieldFilterProps {\n options?: ReadonlyArray<FilterSelectOption>;\n placeholder?: ReactNode;\n className?: string;\n render?: useRender.ComponentProps<\"div\", ColumnFilterState>[\"render\"];\n}\n\nconst DEFAULT_PLACEHOLDER = (\n <span className=\"pz:inline-flex pz:items-center pz:gap-1.5\">\n <ArrowDown className=\"pz:size-4\" /> Output fields\n </span>\n);\n\nexport function SearchCatalogOutputFieldFilter({\n options,\n placeholder = DEFAULT_PLACEHOLDER,\n className,\n render,\n}: SearchCatalogOutputFieldFilterProps) {\n return (\n <SearchCatalogColumnFilter\n id=\"outputFields\"\n placeholder={placeholder}\n options={options}\n className={className}\n render={render}\n />\n );\n}\n"],"mappings":";;;;;AAaA,MAAM,sBACJ,qBAAC,QAAD;CAAM,WAAU;WAAhB,CACE,oBAAC,WAAD,EAAW,WAAU,aAAc,oBAC9B;;AAGT,SAAgB,+BAA+B,EAC7C,SACA,cAAc,qBACd,WACA,UACsC;AACtC,QACE,oBAAC,2BAAD;EACE,IAAG;EACU;EACJ;EACE;EACH;EACR"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"root.mjs","names":[],"sources":["../../../../src/components/compound/search-catalog/root.tsx"],"sourcesContent":["import { useRender } from \"@base-ui/react/use-render\";\nimport type { CatalogFilter } from \"@pipe0/base\";\nimport type { ColumnFilter } from \"@tanstack/react-table\";\nimport type { ReactNode, SyntheticEvent } from \"react\";\nimport { useMemo, useState } from \"react\";\nimport {\n CatalogProvider,\n CatalogRoot,\n useCatalogConfig,\n} from \"../../../context/catalog-config-context.js\";\nimport {\n SearchCatalogContext,\n type SearchCatalogContextValue,\n} from \"../../../context/search-catalog-context.js\";\nimport {\n type UseSearchCatalogTableReturn,\n useSearchCatalogTable,\n} from \"../../../hooks/use-search-catalog-table.js\";\nimport type {\n CatalogClassNames,\n CatalogComponentOverrides,\n SearchCardData,\n} from \"../../../types/catalog-adapters.js\";\nimport { DefaultCatalogRoot } from \"../../defaults/catalog/layout.js\";\nimport { SearchCatalogActiveFilters } from \"./active-filters.js\";\nimport { SearchCatalogCategoryFilter } from \"./category-filter.js\";\nimport { SearchCatalogColumnFilters } from \"./column-filters.js\";\nimport { SearchCatalogEmpty } from \"./empty.js\";\nimport { SearchCatalogList } from \"./list.js\";\nimport { SearchCatalogSearchFilter } from \"./search-filter.js\";\n\ninterface CustomizationProps {\n classNames?: CatalogClassNames;\n components?: CatalogComponentOverrides;\n className?: string;\n render?: useRender.ComponentProps<\"div\">[\"render\"];\n}\n\ninterface SelectionProps {\n /** Fires on click / keyboard activation of any `<SearchCatalogCard>`. */\n onSelectSearch?: (search: SearchCardData, e: SyntheticEvent) => void;\n}\n\nexport interface SearchCatalogInstanceProps extends CustomizationProps, SelectionProps {\n context: UseSearchCatalogTableReturn;\n children?: ReactNode;\n}\n\nexport interface SearchCatalogZeroConfigProps extends CustomizationProps, SelectionProps {\n filter?: CatalogFilter;\n initialColumnFilters?: ColumnFilter[];\n children?: ReactNode;\n}\n\nexport type SearchCatalogProps = SearchCatalogInstanceProps | SearchCatalogZeroConfigProps;\n\nexport function SearchCatalog(props: SearchCatalogProps) {\n if (\"context\" in props) {\n return <SearchCatalogWithContext {...props} />;\n }\n return <SearchCatalogZeroConfig {...props} />;\n}\n\nfunction SearchCatalogZeroConfig({
|
|
1
|
+
{"version":3,"file":"root.mjs","names":[],"sources":["../../../../src/components/compound/search-catalog/root.tsx"],"sourcesContent":["import type { useRender } from \"@base-ui/react/use-render\";\nimport type { CatalogFilter } from \"@pipe0/base\";\nimport type { ColumnFilter } from \"@tanstack/react-table\";\nimport type { ReactNode, SyntheticEvent } from \"react\";\nimport { useMemo, useState } from \"react\";\nimport {\n CatalogProvider,\n CatalogRoot,\n useCatalogConfig,\n} from \"../../../context/catalog-config-context.js\";\nimport {\n SearchCatalogContext,\n type SearchCatalogContextValue,\n} from \"../../../context/search-catalog-context.js\";\nimport {\n type UseSearchCatalogTableReturn,\n useSearchCatalogTable,\n} from \"../../../hooks/use-search-catalog-table.js\";\nimport type {\n CatalogClassNames,\n CatalogComponentOverrides,\n SearchCardData,\n} from \"../../../types/catalog-adapters.js\";\nimport { DefaultCatalogRoot } from \"../../defaults/catalog/layout.js\";\nimport { SearchCatalogActiveFilters } from \"./active-filters.js\";\nimport { SearchCatalogCategoryFilter } from \"./category-filter.js\";\nimport { SearchCatalogColumnFilters } from \"./column-filters.js\";\nimport { SearchCatalogEmpty } from \"./empty.js\";\nimport { SearchCatalogList } from \"./list.js\";\nimport { SearchCatalogSearchFilter } from \"./search-filter.js\";\n\ninterface CustomizationProps {\n classNames?: CatalogClassNames;\n components?: CatalogComponentOverrides;\n className?: string;\n render?: useRender.ComponentProps<\"div\">[\"render\"];\n}\n\ninterface SelectionProps {\n /** Fires on click / keyboard activation of any `<SearchCatalogCard>`. */\n onSelectSearch?: (search: SearchCardData, e: SyntheticEvent) => void;\n}\n\nexport interface SearchCatalogInstanceProps extends CustomizationProps, SelectionProps {\n context: UseSearchCatalogTableReturn;\n children?: ReactNode;\n}\n\nexport interface SearchCatalogZeroConfigProps extends CustomizationProps, SelectionProps {\n filter?: CatalogFilter;\n initialColumnFilters?: ColumnFilter[];\n children?: ReactNode;\n}\n\nexport type SearchCatalogProps = SearchCatalogInstanceProps | SearchCatalogZeroConfigProps;\n\nexport function SearchCatalog(props: SearchCatalogProps) {\n if (\"context\" in props) {\n return <SearchCatalogWithContext {...props} />;\n }\n return <SearchCatalogZeroConfig {...props} />;\n}\n\nfunction SearchCatalogZeroConfig({\n filter,\n initialColumnFilters,\n ...rest\n}: SearchCatalogZeroConfigProps) {\n const context = useSearchCatalogTable({ filter, initialColumnFilters });\n return <SearchCatalogWithContext context={context} {...rest} />;\n}\n\nfunction SearchCatalogWithContext({\n context,\n children,\n className,\n classNames,\n components,\n onSelectSearch,\n render,\n}: SearchCatalogInstanceProps) {\n const hasLocalOverrides = classNames || components;\n const [expandedCardId, setExpandedCardId] = useState<string | null>(null);\n\n const value = useMemo<SearchCatalogContextValue>(\n () => ({\n ...context,\n onSelectCard: onSelectSearch,\n expandedCardId,\n setExpandedCardId,\n }),\n [context, onSelectSearch, expandedCardId],\n );\n\n const inner = (\n <SearchCatalogContext.Provider value={value}>\n <SearchCatalogShell className={className} render={render}>\n {children}\n </SearchCatalogShell>\n </SearchCatalogContext.Provider>\n );\n if (hasLocalOverrides) {\n return (\n <CatalogRoot>\n <CatalogProvider classNames={classNames} components={components}>\n {inner}\n </CatalogProvider>\n </CatalogRoot>\n );\n }\n return <CatalogRoot>{inner}</CatalogRoot>;\n}\n\nfunction SearchCatalogShell({\n children,\n className,\n render,\n}: {\n children?: ReactNode;\n className?: string;\n render?: useRender.ComponentProps<\"div\">[\"render\"];\n}) {\n useCatalogConfig();\n const body =\n children !== undefined ? (\n children\n ) : (\n <>\n <SearchCatalogSearchFilter />\n <SearchCatalogCategoryFilter />\n <SearchCatalogColumnFilters />\n <SearchCatalogActiveFilters />\n <SearchCatalogList />\n <SearchCatalogEmpty />\n </>\n );\n return (\n <DefaultCatalogRoot className={className} render={render}>\n {body}\n </DefaultCatalogRoot>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;AAwDA,SAAgB,cAAc,OAA2B;AACvD,KAAI,aAAa,MACf,QAAO,oBAAC,0BAAD,EAA0B,GAAI,OAAS;AAEhD,QAAO,oBAAC,yBAAD,EAAyB,GAAI,OAAS;;AAG/C,SAAS,wBAAwB,EAC/B,QACA,sBACA,GAAG,QAC4B;AAE/B,QAAO,oBAAC,0BAAD;EAA0B,SADjB,sBAAsB;GAAE;GAAQ;GAAsB,CAAC;EACpB,GAAI;EAAQ;;AAGjE,SAAS,yBAAyB,EAChC,SACA,UACA,WACA,YACA,YACA,gBACA,UAC6B;CAC7B,MAAM,oBAAoB,cAAc;CACxC,MAAM,CAAC,gBAAgB,qBAAqB,SAAwB,KAAK;CAEzE,MAAM,QAAQ,eACL;EACL,GAAG;EACH,cAAc;EACd;EACA;EACD,GACD;EAAC;EAAS;EAAgB;EAAe,CAC1C;CAED,MAAM,QACJ,oBAAC,qBAAqB,UAAtB;EAAsC;YACpC,oBAAC,oBAAD;GAA+B;GAAmB;GAC/C;GACkB;EACS;AAElC,KAAI,kBACF,QACE,oBAAC,aAAD,YACE,oBAAC,iBAAD;EAA6B;EAAwB;YAClD;EACe,GACN;AAGlB,QAAO,oBAAC,aAAD,YAAc,OAAoB;;AAG3C,SAAS,mBAAmB,EAC1B,UACA,WACA,UAKC;AACD,mBAAkB;AAclB,QACE,oBAAC,oBAAD;EAA+B;EAAmB;YAblD,aAAa,SACX,WAEA;GACE,oBAAC,2BAAD,EAA6B;GAC7B,oBAAC,6BAAD,EAA+B;GAC/B,oBAAC,4BAAD,EAA8B;GAC9B,oBAAC,4BAAD,EAA8B;GAC9B,oBAAC,mBAAD,EAAqB;GACrB,oBAAC,oBAAD,EAAsB;GACrB;EAKgB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tag-filter.mjs","names":[],"sources":["../../../../src/components/compound/search-catalog/tag-filter.tsx"],"sourcesContent":["import { useRender } from \"@base-ui/react/use-render\";\nimport { Tag } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport type { FilterSelectOption } from \"../../defaults/catalog/filter-select.js\";\nimport { type ColumnFilterState, SearchCatalogColumnFilter } from \"./column-filter.js\";\n\nexport interface SearchCatalogTagFilterProps {\n options?: ReadonlyArray<FilterSelectOption>;\n placeholder?: ReactNode;\n className?: string;\n render?: useRender.ComponentProps<\"div\", ColumnFilterState>[\"render\"];\n}\n\nconst DEFAULT_PLACEHOLDER = (\n <span className=\"pz:inline-flex pz:items-center pz:gap-1.5\">\n <Tag className=\"pz:size-4\" /> Tag\n </span>\n);\n\nexport function SearchCatalogTagFilter({\n options,\n placeholder = DEFAULT_PLACEHOLDER,\n className,\n render,\n}: SearchCatalogTagFilterProps) {\n return (\n <SearchCatalogColumnFilter\n id=\"tags\"\n placeholder={placeholder}\n options={options}\n className={className}\n render={render}\n />\n );\n}\n"],"mappings":";;;;;AAaA,MAAM,sBACJ,qBAAC,QAAD;CAAM,WAAU;WAAhB,CACE,oBAAC,KAAD,EAAK,WAAU,aAAc,UACxB;;AAGT,SAAgB,uBAAuB,EACrC,SACA,cAAc,qBACd,WACA,UAC8B;AAC9B,QACE,oBAAC,2BAAD;EACE,IAAG;EACU;EACJ;EACE;EACH;EACR"}
|
|
1
|
+
{"version":3,"file":"tag-filter.mjs","names":[],"sources":["../../../../src/components/compound/search-catalog/tag-filter.tsx"],"sourcesContent":["import type { useRender } from \"@base-ui/react/use-render\";\nimport { Tag } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport type { FilterSelectOption } from \"../../defaults/catalog/filter-select.js\";\nimport { type ColumnFilterState, SearchCatalogColumnFilter } from \"./column-filter.js\";\n\nexport interface SearchCatalogTagFilterProps {\n options?: ReadonlyArray<FilterSelectOption>;\n placeholder?: ReactNode;\n className?: string;\n render?: useRender.ComponentProps<\"div\", ColumnFilterState>[\"render\"];\n}\n\nconst DEFAULT_PLACEHOLDER = (\n <span className=\"pz:inline-flex pz:items-center pz:gap-1.5\">\n <Tag className=\"pz:size-4\" /> Tag\n </span>\n);\n\nexport function SearchCatalogTagFilter({\n options,\n placeholder = DEFAULT_PLACEHOLDER,\n className,\n render,\n}: SearchCatalogTagFilterProps) {\n return (\n <SearchCatalogColumnFilter\n id=\"tags\"\n placeholder={placeholder}\n options={options}\n className={className}\n render={render}\n />\n );\n}\n"],"mappings":";;;;;AAaA,MAAM,sBACJ,qBAAC,QAAD;CAAM,WAAU;WAAhB,CACE,oBAAC,KAAD,EAAK,WAAU,aAAc,UACxB;;AAGT,SAAgB,uBAAuB,EACrC,SACA,cAAc,qBACd,WACA,UAC8B;AAC9B,QACE,oBAAC,2BAAD;EACE,IAAG;EACU;EACJ;EACE;EACH;EACR"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output-field-filter.mjs","names":[],"sources":["../../../../src/components/compound/searches-catalog/output-field-filter.tsx"],"sourcesContent":["import { useRender } from \"@base-ui/react/use-render\";\nimport { ArrowDown } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport type { FilterSelectOption } from \"../../defaults/catalog/filter-select.js\";\nimport { type ColumnFilterState, SearchesCatalogColumnFilter } from \"./column-filter.js\";\n\nexport interface SearchesCatalogOutputFieldFilterProps {\n options?: ReadonlyArray<FilterSelectOption>;\n placeholder?: ReactNode;\n className?: string;\n render?: useRender.ComponentProps<\"div\", ColumnFilterState>[\"render\"];\n}\n\nconst DEFAULT_PLACEHOLDER = (\n <span className=\"pz:inline-flex pz:items-center pz:gap-1.5\">\n <ArrowDown className=\"pz:size-4\" /> Output fields\n </span>\n);\n\nexport function SearchesCatalogOutputFieldFilter({\n options,\n placeholder = DEFAULT_PLACEHOLDER,\n className,\n render,\n}: SearchesCatalogOutputFieldFilterProps) {\n return (\n <SearchesCatalogColumnFilter\n id=\"outputFields\"\n placeholder={placeholder}\n options={options}\n className={className}\n render={render}\n />\n );\n}\n"],"mappings":";;;;;AAaA,MAAM,sBACJ,qBAAC,QAAD;CAAM,WAAU;WAAhB,CACE,oBAAC,WAAD,EAAW,WAAU,aAAc,oBAC9B;;AAGT,SAAgB,iCAAiC,EAC/C,SACA,cAAc,qBACd,WACA,UACwC;AACxC,QACE,oBAAC,6BAAD;EACE,IAAG;EACU;EACJ;EACE;EACH;EACR"}
|
|
1
|
+
{"version":3,"file":"output-field-filter.mjs","names":[],"sources":["../../../../src/components/compound/searches-catalog/output-field-filter.tsx"],"sourcesContent":["import type { useRender } from \"@base-ui/react/use-render\";\nimport { ArrowDown } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport type { FilterSelectOption } from \"../../defaults/catalog/filter-select.js\";\nimport { type ColumnFilterState, SearchesCatalogColumnFilter } from \"./column-filter.js\";\n\nexport interface SearchesCatalogOutputFieldFilterProps {\n options?: ReadonlyArray<FilterSelectOption>;\n placeholder?: ReactNode;\n className?: string;\n render?: useRender.ComponentProps<\"div\", ColumnFilterState>[\"render\"];\n}\n\nconst DEFAULT_PLACEHOLDER = (\n <span className=\"pz:inline-flex pz:items-center pz:gap-1.5\">\n <ArrowDown className=\"pz:size-4\" /> Output fields\n </span>\n);\n\nexport function SearchesCatalogOutputFieldFilter({\n options,\n placeholder = DEFAULT_PLACEHOLDER,\n className,\n render,\n}: SearchesCatalogOutputFieldFilterProps) {\n return (\n <SearchesCatalogColumnFilter\n id=\"outputFields\"\n placeholder={placeholder}\n options={options}\n className={className}\n render={render}\n />\n );\n}\n"],"mappings":";;;;;AAaA,MAAM,sBACJ,qBAAC,QAAD;CAAM,WAAU;WAAhB,CACE,oBAAC,WAAD,EAAW,WAAU,aAAc,oBAC9B;;AAGT,SAAgB,iCAAiC,EAC/C,SACA,cAAc,qBACd,WACA,UACwC;AACxC,QACE,oBAAC,6BAAD;EACE,IAAG;EACU;EACJ;EACE;EACH;EACR"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-filter.mjs","names":[],"sources":["../../../../src/components/compound/searches-catalog/provider-filter.tsx"],"sourcesContent":["import { useRender } from \"@base-ui/react/use-render\";\nimport { getProviderEntry, type ProviderName } from \"@pipe0/base\";\nimport { Building2 } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport { useSearchesCatalogContext } from \"../../../context/searches-catalog-context.js\";\nimport type { FilterSelectOption } from \"../../defaults/catalog/filter-select.js\";\nimport { type ColumnFilterState, SearchesCatalogColumnFilter } from \"./column-filter.js\";\n\nexport interface SearchesCatalogProviderFilterProps {\n options?: ReadonlyArray<FilterSelectOption>;\n placeholder?: ReactNode;\n className?: string;\n render?: useRender.ComponentProps<\"div\", ColumnFilterState>[\"render\"];\n}\n\nconst DEFAULT_PLACEHOLDER = (\n <span className=\"pz:inline-flex pz:items-center pz:gap-1.5\">\n <Building2 className=\"pz:size-4\" /> Provider\n </span>\n);\n\nexport function SearchesCatalogProviderFilter({\n options,\n placeholder = DEFAULT_PLACEHOLDER,\n className,\n render,\n}: SearchesCatalogProviderFilterProps) {\n const ctx = useSearchesCatalogContext();\n const resolvedOptions =\n options ??\n ctx.sortedProviderEntries.map(([name]) => ({\n label: name,\n value: name,\n imageSrc: getProviderEntry(name as ProviderName)?.logoUrl,\n }));\n\n return (\n <SearchesCatalogColumnFilter\n id=\"providers\"\n placeholder={placeholder}\n options={resolvedOptions}\n className={className}\n render={render}\n />\n );\n}\n"],"mappings":";;;;;;;AAeA,MAAM,sBACJ,qBAAC,QAAD;CAAM,WAAU;WAAhB,CACE,oBAAC,WAAD,EAAW,WAAU,aAAc,eAC9B;;AAGT,SAAgB,8BAA8B,EAC5C,SACA,cAAc,qBACd,WACA,UACqC;CACrC,MAAM,MAAM,2BAA2B;AASvC,QACE,oBAAC,6BAAD;EACE,IAAG;EACU;EACb,SAXF,WACA,IAAI,sBAAsB,KAAK,CAAC,WAAW;GACzC,OAAO;GACP,OAAO;GACP,UAAU,iBAAiB,KAAqB,EAAE;GACnD,EAAE;EAOU;EACH;EACR"}
|
|
1
|
+
{"version":3,"file":"provider-filter.mjs","names":[],"sources":["../../../../src/components/compound/searches-catalog/provider-filter.tsx"],"sourcesContent":["import type { useRender } from \"@base-ui/react/use-render\";\nimport { getProviderEntry, type ProviderName } from \"@pipe0/base\";\nimport { Building2 } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport { useSearchesCatalogContext } from \"../../../context/searches-catalog-context.js\";\nimport type { FilterSelectOption } from \"../../defaults/catalog/filter-select.js\";\nimport { type ColumnFilterState, SearchesCatalogColumnFilter } from \"./column-filter.js\";\n\nexport interface SearchesCatalogProviderFilterProps {\n options?: ReadonlyArray<FilterSelectOption>;\n placeholder?: ReactNode;\n className?: string;\n render?: useRender.ComponentProps<\"div\", ColumnFilterState>[\"render\"];\n}\n\nconst DEFAULT_PLACEHOLDER = (\n <span className=\"pz:inline-flex pz:items-center pz:gap-1.5\">\n <Building2 className=\"pz:size-4\" /> Provider\n </span>\n);\n\nexport function SearchesCatalogProviderFilter({\n options,\n placeholder = DEFAULT_PLACEHOLDER,\n className,\n render,\n}: SearchesCatalogProviderFilterProps) {\n const ctx = useSearchesCatalogContext();\n const resolvedOptions =\n options ??\n ctx.sortedProviderEntries.map(([name]) => ({\n label: name,\n value: name,\n imageSrc: getProviderEntry(name as ProviderName)?.logoUrl,\n }));\n\n return (\n <SearchesCatalogColumnFilter\n id=\"providers\"\n placeholder={placeholder}\n options={resolvedOptions}\n className={className}\n render={render}\n />\n );\n}\n"],"mappings":";;;;;;;AAeA,MAAM,sBACJ,qBAAC,QAAD;CAAM,WAAU;WAAhB,CACE,oBAAC,WAAD,EAAW,WAAU,aAAc,eAC9B;;AAGT,SAAgB,8BAA8B,EAC5C,SACA,cAAc,qBACd,WACA,UACqC;CACrC,MAAM,MAAM,2BAA2B;AASvC,QACE,oBAAC,6BAAD;EACE,IAAG;EACU;EACb,SAXF,WACA,IAAI,sBAAsB,KAAK,CAAC,WAAW;GACzC,OAAO;GACP,OAAO;GACP,UAAU,iBAAiB,KAAqB,EAAE;GACnD,EAAE;EAOU;EACH;EACR"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"root.mjs","names":[],"sources":["../../../../src/components/compound/searches-catalog/root.tsx"],"sourcesContent":["import { useRender } from \"@base-ui/react/use-render\";\nimport type { CatalogFilter } from \"@pipe0/base\";\nimport type { ColumnFilter } from \"@tanstack/react-table\";\nimport type { ReactNode, SyntheticEvent } from \"react\";\nimport { useMemo, useState } from \"react\";\nimport {\n CatalogProvider,\n CatalogRoot,\n useCatalogConfig,\n} from \"../../../context/catalog-config-context.js\";\nimport {\n SearchesCatalogContext,\n type SearchesCatalogContextValue,\n} from \"../../../context/searches-catalog-context.js\";\nimport {\n type UseSearchesCatalogTableReturn,\n useSearchesCatalogTable,\n} from \"../../../hooks/use-searches-catalog-table.js\";\nimport type {\n CatalogClassNames,\n CatalogComponentOverrides,\n SearchesCardData,\n} from \"../../../types/catalog-adapters.js\";\nimport { DefaultCatalogRoot } from \"../../defaults/catalog/layout.js\";\nimport { SearchesCatalogActiveFilters } from \"./active-filters.js\";\nimport { SearchesCatalogCategoryFilter } from \"./category-filter.js\";\nimport { SearchesCatalogColumnFilters } from \"./column-filters.js\";\nimport { SearchesCatalogEmpty } from \"./empty.js\";\nimport { SearchesCatalogList } from \"./list.js\";\nimport { SearchesCatalogSearchFilter } from \"./search-filter.js\";\n\ninterface CustomizationProps {\n classNames?: CatalogClassNames;\n components?: CatalogComponentOverrides;\n className?: string;\n render?: useRender.ComponentProps<\"div\">[\"render\"];\n}\n\ninterface SelectionProps {\n /** Fires on click / keyboard activation of any `<SearchesCatalogCard>`. */\n onSelectSearches?: (searches: SearchesCardData, e: SyntheticEvent) => void;\n}\n\nexport interface SearchesCatalogInstanceProps extends CustomizationProps, SelectionProps {\n context: UseSearchesCatalogTableReturn;\n children?: ReactNode;\n}\n\nexport interface SearchesCatalogZeroConfigProps extends CustomizationProps, SelectionProps {\n filter?: CatalogFilter;\n initialColumnFilters?: ColumnFilter[];\n children?: ReactNode;\n}\n\nexport type SearchesCatalogProps = SearchesCatalogInstanceProps | SearchesCatalogZeroConfigProps;\n\nexport function SearchesCatalog(props: SearchesCatalogProps) {\n if (\"context\" in props) {\n return <SearchesCatalogWithContext {...props} />;\n }\n return <SearchesCatalogZeroConfig {...props} />;\n}\n\nfunction SearchesCatalogZeroConfig({\n filter,\n initialColumnFilters,\n ...rest\n}: SearchesCatalogZeroConfigProps) {\n const context = useSearchesCatalogTable({ filter, initialColumnFilters });\n return <SearchesCatalogWithContext context={context} {...rest} />;\n}\n\nfunction SearchesCatalogWithContext({\n context,\n children,\n className,\n classNames,\n components,\n onSelectSearches,\n render,\n}: SearchesCatalogInstanceProps) {\n const hasLocalOverrides = classNames || components;\n const [expandedCardId, setExpandedCardId] = useState<string | null>(null);\n\n const value = useMemo<SearchesCatalogContextValue>(\n () => ({\n ...context,\n onSelectCard: onSelectSearches,\n expandedCardId,\n setExpandedCardId,\n }),\n [context, onSelectSearches, expandedCardId],\n );\n\n const inner = (\n <SearchesCatalogContext.Provider value={value}>\n <SearchesCatalogShell className={className} render={render}>\n {children}\n </SearchesCatalogShell>\n </SearchesCatalogContext.Provider>\n );\n if (hasLocalOverrides) {\n return (\n <CatalogRoot>\n <CatalogProvider classNames={classNames} components={components}>\n {inner}\n </CatalogProvider>\n </CatalogRoot>\n );\n }\n return <CatalogRoot>{inner}</CatalogRoot>;\n}\n\nfunction SearchesCatalogShell({\n children,\n className,\n render,\n}: {\n children?: ReactNode;\n className?: string;\n render?: useRender.ComponentProps<\"div\">[\"render\"];\n}) {\n useCatalogConfig();\n const body =\n children !== undefined ? (\n children\n ) : (\n <>\n <SearchesCatalogSearchFilter />\n <SearchesCatalogCategoryFilter />\n <SearchesCatalogColumnFilters />\n <SearchesCatalogActiveFilters />\n <SearchesCatalogList />\n <SearchesCatalogEmpty />\n </>\n );\n return (\n <DefaultCatalogRoot className={className} render={render}>\n {body}\n </DefaultCatalogRoot>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;AAwDA,SAAgB,gBAAgB,OAA6B;AAC3D,KAAI,aAAa,MACf,QAAO,oBAAC,4BAAD,EAA4B,GAAI,OAAS;AAElD,QAAO,oBAAC,2BAAD,EAA2B,GAAI,OAAS;;AAGjD,SAAS,0BAA0B,EACjC,QACA,sBACA,GAAG,QAC8B;AAEjC,QAAO,oBAAC,4BAAD;EAA4B,SADnB,wBAAwB;GAAE;GAAQ;GAAsB,CAAC;EACpB,GAAI;EAAQ;;AAGnE,SAAS,2BAA2B,EAClC,SACA,UACA,WACA,YACA,YACA,kBACA,UAC+B;CAC/B,MAAM,oBAAoB,cAAc;CACxC,MAAM,CAAC,gBAAgB,qBAAqB,SAAwB,KAAK;CAEzE,MAAM,QAAQ,eACL;EACL,GAAG;EACH,cAAc;EACd;EACA;EACD,GACD;EAAC;EAAS;EAAkB;EAAe,CAC5C;CAED,MAAM,QACJ,oBAAC,uBAAuB,UAAxB;EAAwC;YACtC,oBAAC,sBAAD;GAAiC;GAAmB;GACjD;GACoB;EACS;AAEpC,KAAI,kBACF,QACE,oBAAC,aAAD,YACE,oBAAC,iBAAD;EAA6B;EAAwB;YAClD;EACe,GACN;AAGlB,QAAO,oBAAC,aAAD,YAAc,OAAoB;;AAG3C,SAAS,qBAAqB,EAC5B,UACA,WACA,UAKC;AACD,mBAAkB;AAclB,QACE,oBAAC,oBAAD;EAA+B;EAAmB;YAblD,aAAa,SACX,WAEA;GACE,oBAAC,6BAAD,EAA+B;GAC/B,oBAAC,+BAAD,EAAiC;GACjC,oBAAC,8BAAD,EAAgC;GAChC,oBAAC,8BAAD,EAAgC;GAChC,oBAAC,qBAAD,EAAuB;GACvB,oBAAC,sBAAD,EAAwB;GACvB;EAKgB"}
|
|
1
|
+
{"version":3,"file":"root.mjs","names":[],"sources":["../../../../src/components/compound/searches-catalog/root.tsx"],"sourcesContent":["import type { useRender } from \"@base-ui/react/use-render\";\nimport type { CatalogFilter } from \"@pipe0/base\";\nimport type { ColumnFilter } from \"@tanstack/react-table\";\nimport type { ReactNode, SyntheticEvent } from \"react\";\nimport { useMemo, useState } from \"react\";\nimport {\n CatalogProvider,\n CatalogRoot,\n useCatalogConfig,\n} from \"../../../context/catalog-config-context.js\";\nimport {\n SearchesCatalogContext,\n type SearchesCatalogContextValue,\n} from \"../../../context/searches-catalog-context.js\";\nimport {\n type UseSearchesCatalogTableReturn,\n useSearchesCatalogTable,\n} from \"../../../hooks/use-searches-catalog-table.js\";\nimport type {\n CatalogClassNames,\n CatalogComponentOverrides,\n SearchesCardData,\n} from \"../../../types/catalog-adapters.js\";\nimport { DefaultCatalogRoot } from \"../../defaults/catalog/layout.js\";\nimport { SearchesCatalogActiveFilters } from \"./active-filters.js\";\nimport { SearchesCatalogCategoryFilter } from \"./category-filter.js\";\nimport { SearchesCatalogColumnFilters } from \"./column-filters.js\";\nimport { SearchesCatalogEmpty } from \"./empty.js\";\nimport { SearchesCatalogList } from \"./list.js\";\nimport { SearchesCatalogSearchFilter } from \"./search-filter.js\";\n\ninterface CustomizationProps {\n classNames?: CatalogClassNames;\n components?: CatalogComponentOverrides;\n className?: string;\n render?: useRender.ComponentProps<\"div\">[\"render\"];\n}\n\ninterface SelectionProps {\n /** Fires on click / keyboard activation of any `<SearchesCatalogCard>`. */\n onSelectSearches?: (searches: SearchesCardData, e: SyntheticEvent) => void;\n}\n\nexport interface SearchesCatalogInstanceProps extends CustomizationProps, SelectionProps {\n context: UseSearchesCatalogTableReturn;\n children?: ReactNode;\n}\n\nexport interface SearchesCatalogZeroConfigProps extends CustomizationProps, SelectionProps {\n filter?: CatalogFilter;\n initialColumnFilters?: ColumnFilter[];\n children?: ReactNode;\n}\n\nexport type SearchesCatalogProps = SearchesCatalogInstanceProps | SearchesCatalogZeroConfigProps;\n\nexport function SearchesCatalog(props: SearchesCatalogProps) {\n if (\"context\" in props) {\n return <SearchesCatalogWithContext {...props} />;\n }\n return <SearchesCatalogZeroConfig {...props} />;\n}\n\nfunction SearchesCatalogZeroConfig({\n filter,\n initialColumnFilters,\n ...rest\n}: SearchesCatalogZeroConfigProps) {\n const context = useSearchesCatalogTable({ filter, initialColumnFilters });\n return <SearchesCatalogWithContext context={context} {...rest} />;\n}\n\nfunction SearchesCatalogWithContext({\n context,\n children,\n className,\n classNames,\n components,\n onSelectSearches,\n render,\n}: SearchesCatalogInstanceProps) {\n const hasLocalOverrides = classNames || components;\n const [expandedCardId, setExpandedCardId] = useState<string | null>(null);\n\n const value = useMemo<SearchesCatalogContextValue>(\n () => ({\n ...context,\n onSelectCard: onSelectSearches,\n expandedCardId,\n setExpandedCardId,\n }),\n [context, onSelectSearches, expandedCardId],\n );\n\n const inner = (\n <SearchesCatalogContext.Provider value={value}>\n <SearchesCatalogShell className={className} render={render}>\n {children}\n </SearchesCatalogShell>\n </SearchesCatalogContext.Provider>\n );\n if (hasLocalOverrides) {\n return (\n <CatalogRoot>\n <CatalogProvider classNames={classNames} components={components}>\n {inner}\n </CatalogProvider>\n </CatalogRoot>\n );\n }\n return <CatalogRoot>{inner}</CatalogRoot>;\n}\n\nfunction SearchesCatalogShell({\n children,\n className,\n render,\n}: {\n children?: ReactNode;\n className?: string;\n render?: useRender.ComponentProps<\"div\">[\"render\"];\n}) {\n useCatalogConfig();\n const body =\n children !== undefined ? (\n children\n ) : (\n <>\n <SearchesCatalogSearchFilter />\n <SearchesCatalogCategoryFilter />\n <SearchesCatalogColumnFilters />\n <SearchesCatalogActiveFilters />\n <SearchesCatalogList />\n <SearchesCatalogEmpty />\n </>\n );\n return (\n <DefaultCatalogRoot className={className} render={render}>\n {body}\n </DefaultCatalogRoot>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;AAwDA,SAAgB,gBAAgB,OAA6B;AAC3D,KAAI,aAAa,MACf,QAAO,oBAAC,4BAAD,EAA4B,GAAI,OAAS;AAElD,QAAO,oBAAC,2BAAD,EAA2B,GAAI,OAAS;;AAGjD,SAAS,0BAA0B,EACjC,QACA,sBACA,GAAG,QAC8B;AAEjC,QAAO,oBAAC,4BAAD;EAA4B,SADnB,wBAAwB;GAAE;GAAQ;GAAsB,CAAC;EACpB,GAAI;EAAQ;;AAGnE,SAAS,2BAA2B,EAClC,SACA,UACA,WACA,YACA,YACA,kBACA,UAC+B;CAC/B,MAAM,oBAAoB,cAAc;CACxC,MAAM,CAAC,gBAAgB,qBAAqB,SAAwB,KAAK;CAEzE,MAAM,QAAQ,eACL;EACL,GAAG;EACH,cAAc;EACd;EACA;EACD,GACD;EAAC;EAAS;EAAkB;EAAe,CAC5C;CAED,MAAM,QACJ,oBAAC,uBAAuB,UAAxB;EAAwC;YACtC,oBAAC,sBAAD;GAAiC;GAAmB;GACjD;GACoB;EACS;AAEpC,KAAI,kBACF,QACE,oBAAC,aAAD,YACE,oBAAC,iBAAD;EAA6B;EAAwB;YAClD;EACe,GACN;AAGlB,QAAO,oBAAC,aAAD,YAAc,OAAoB;;AAG3C,SAAS,qBAAqB,EAC5B,UACA,WACA,UAKC;AACD,mBAAkB;AAclB,QACE,oBAAC,oBAAD;EAA+B;EAAmB;YAblD,aAAa,SACX,WAEA;GACE,oBAAC,6BAAD,EAA+B;GAC/B,oBAAC,+BAAD,EAAiC;GACjC,oBAAC,8BAAD,EAAgC;GAChC,oBAAC,8BAAD,EAAgC;GAChC,oBAAC,qBAAD,EAAuB;GACvB,oBAAC,sBAAD,EAAwB;GACvB;EAKgB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tag-filter.mjs","names":[],"sources":["../../../../src/components/compound/searches-catalog/tag-filter.tsx"],"sourcesContent":["import { useRender } from \"@base-ui/react/use-render\";\nimport { Tag } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport type { FilterSelectOption } from \"../../defaults/catalog/filter-select.js\";\nimport { type ColumnFilterState, SearchesCatalogColumnFilter } from \"./column-filter.js\";\n\nexport interface SearchesCatalogTagFilterProps {\n options?: ReadonlyArray<FilterSelectOption>;\n placeholder?: ReactNode;\n className?: string;\n render?: useRender.ComponentProps<\"div\", ColumnFilterState>[\"render\"];\n}\n\nconst DEFAULT_PLACEHOLDER = (\n <span className=\"pz:inline-flex pz:items-center pz:gap-1.5\">\n <Tag className=\"pz:size-4\" /> Tag\n </span>\n);\n\nexport function SearchesCatalogTagFilter({\n options,\n placeholder = DEFAULT_PLACEHOLDER,\n className,\n render,\n}: SearchesCatalogTagFilterProps) {\n return (\n <SearchesCatalogColumnFilter\n id=\"tags\"\n placeholder={placeholder}\n options={options}\n className={className}\n render={render}\n />\n );\n}\n"],"mappings":";;;;;AAaA,MAAM,sBACJ,qBAAC,QAAD;CAAM,WAAU;WAAhB,CACE,oBAAC,KAAD,EAAK,WAAU,aAAc,UACxB;;AAGT,SAAgB,yBAAyB,EACvC,SACA,cAAc,qBACd,WACA,UACgC;AAChC,QACE,oBAAC,6BAAD;EACE,IAAG;EACU;EACJ;EACE;EACH;EACR"}
|
|
1
|
+
{"version":3,"file":"tag-filter.mjs","names":[],"sources":["../../../../src/components/compound/searches-catalog/tag-filter.tsx"],"sourcesContent":["import type { useRender } from \"@base-ui/react/use-render\";\nimport { Tag } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport type { FilterSelectOption } from \"../../defaults/catalog/filter-select.js\";\nimport { type ColumnFilterState, SearchesCatalogColumnFilter } from \"./column-filter.js\";\n\nexport interface SearchesCatalogTagFilterProps {\n options?: ReadonlyArray<FilterSelectOption>;\n placeholder?: ReactNode;\n className?: string;\n render?: useRender.ComponentProps<\"div\", ColumnFilterState>[\"render\"];\n}\n\nconst DEFAULT_PLACEHOLDER = (\n <span className=\"pz:inline-flex pz:items-center pz:gap-1.5\">\n <Tag className=\"pz:size-4\" /> Tag\n </span>\n);\n\nexport function SearchesCatalogTagFilter({\n options,\n placeholder = DEFAULT_PLACEHOLDER,\n className,\n render,\n}: SearchesCatalogTagFilterProps) {\n return (\n <SearchesCatalogColumnFilter\n id=\"tags\"\n placeholder={placeholder}\n options={options}\n className={className}\n render={render}\n />\n );\n}\n"],"mappings":";;;;;AAaA,MAAM,sBACJ,qBAAC,QAAD;CAAM,WAAU;WAAhB,CACE,oBAAC,KAAD,EAAK,WAAU,aAAc,UACxB;;AAGT,SAAgB,yBAAyB,EACvC,SACA,cAAc,qBACd,WACA,UACgC;AAChC,QACE,oBAAC,6BAAD;EACE,IAAG;EACU;EACJ;EACE;EACH;EACR"}
|
|
@@ -4,11 +4,12 @@ import { jsx } from "react/jsx-runtime";
|
|
|
4
4
|
|
|
5
5
|
//#region src/components/defaults/adapters/fields-select-input.tsx
|
|
6
6
|
function FieldsSelectInputAdapter(field) {
|
|
7
|
+
const entries = useMemo(() => field.value ?? [], [field.value]);
|
|
7
8
|
return /* @__PURE__ */ jsx("div", {
|
|
8
9
|
"data-p0": "input",
|
|
9
10
|
children: /* @__PURE__ */ jsx(SuggestCombobox, {
|
|
10
|
-
value: useMemo(() =>
|
|
11
|
-
onChange: (next) => field.setValue(next.map((field_name) => ({ field_name }))
|
|
11
|
+
value: useMemo(() => entries.map((f) => f.field_name), [entries]),
|
|
12
|
+
onChange: (next) => field.setValue(next.map((field_name) => entries.find((e) => e.field_name === field_name) ?? { field_name })),
|
|
12
13
|
options: field.meta.options ?? [],
|
|
13
14
|
maxItems: field.meta.maxItems,
|
|
14
15
|
disableSearch: field.meta.disableSearch,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fields-select-input.mjs","names":[],"sources":["../../../../src/components/defaults/adapters/fields-select-input.tsx"],"sourcesContent":["import { useMemo } from \"react\";\nimport type { FieldHandle } from \"../../../types/field-handle.js\";\nimport { SuggestCombobox } from \"../../internal/combobox/suggest-combobox.js\";\n\nexport function FieldsSelectInputAdapter(field: FieldHandle<\"fields_select_input\">) {\n const
|
|
1
|
+
{"version":3,"file":"fields-select-input.mjs","names":[],"sources":["../../../../src/components/defaults/adapters/fields-select-input.tsx"],"sourcesContent":["import { useMemo } from \"react\";\nimport type { FieldHandle } from \"../../../types/field-handle.js\";\nimport { SuggestCombobox } from \"../../internal/combobox/suggest-combobox.js\";\n\n// Aliasable variants (meta.withAlias) store `{ field_name, alias? }` entries —\n// editing the selection must keep an entry's stored alias, so re-selection\n// reuses the existing entry instead of rebuilding a bare `{ field_name }`.\ntype FieldsSelectEntry = { field_name: string; alias?: string };\n\nexport function FieldsSelectInputAdapter(field: FieldHandle<\"fields_select_input\">) {\n const entries = useMemo<FieldsSelectEntry[]>(() => field.value ?? [], [field.value]);\n const selected = useMemo(() => entries.map((f) => f.field_name), [entries]);\n\n return (\n <div data-p0=\"input\">\n <SuggestCombobox\n value={selected}\n onChange={(next) =>\n field.setValue(\n next.map(\n (field_name) => entries.find((e) => e.field_name === field_name) ?? { field_name },\n ),\n )\n }\n options={field.meta.options ?? []}\n maxItems={field.meta.maxItems}\n disableSearch={field.meta.disableSearch}\n ariaInvalid={!!field.error}\n placeholder={field.meta.placeholder ?? \"Select fields…\"}\n emptyLabel=\"No fields available\"\n reorderable\n />\n </div>\n );\n}\n"],"mappings":";;;;;AASA,SAAgB,yBAAyB,OAA2C;CAClF,MAAM,UAAU,cAAmC,MAAM,SAAS,EAAE,EAAE,CAAC,MAAM,MAAM,CAAC;AAGpF,QACE,oBAAC,OAAD;EAAK,WAAQ;YACX,oBAAC,iBAAD;GACE,OALW,cAAc,QAAQ,KAAK,MAAM,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC;GAMrE,WAAW,SACT,MAAM,SACJ,KAAK,KACF,eAAe,QAAQ,MAAM,MAAM,EAAE,eAAe,WAAW,IAAI,EAAE,YAAY,CACnF,CACF;GAEH,SAAS,MAAM,KAAK,WAAW,EAAE;GACjC,UAAU,MAAM,KAAK;GACrB,eAAe,MAAM,KAAK;GAC1B,aAAa,CAAC,CAAC,MAAM;GACrB,aAAa,MAAM,KAAK,eAAe;GACvC,YAAW;GACX;GACA;EACE"}
|
|
@@ -34,6 +34,13 @@ const OPERATORS_BY_TYPE = {
|
|
|
34
34
|
json: [],
|
|
35
35
|
unknown: []
|
|
36
36
|
};
|
|
37
|
+
/**
|
|
38
|
+
* json fields carry no VALUE operators (a json cell can't be compared as a
|
|
39
|
+
* primitive) but their STATUS is a first-class condition target — "count if
|
|
40
|
+
* status(person_profile_match) eq failed" is the canonical freshness pattern.
|
|
41
|
+
* The editor locks such fields to the status property.
|
|
42
|
+
*/
|
|
43
|
+
const isStatusOnlyField = (type) => type === "json";
|
|
37
44
|
const EMPTY_CONDITION = {
|
|
38
45
|
field_name: "",
|
|
39
46
|
property: "value",
|
|
@@ -284,9 +291,11 @@ function ConditionRow({ condition, index, eligibleFields, fieldsByName, isFirst,
|
|
|
284
291
|
disabled: !hasEligibleFields,
|
|
285
292
|
onValueChange: (v) => {
|
|
286
293
|
if (v === null) return;
|
|
294
|
+
const statusOnly = isStatusOnlyField(fieldsByName.get(v)?.type);
|
|
287
295
|
onUpdate(index, {
|
|
288
296
|
...condition,
|
|
289
297
|
field_name: v,
|
|
298
|
+
...statusOnly ? { property: "status" } : {},
|
|
290
299
|
operator: "eq",
|
|
291
300
|
value: ""
|
|
292
301
|
});
|
|
@@ -304,7 +313,7 @@ function ConditionRow({ condition, index, eligibleFields, fieldsByName, isFirst,
|
|
|
304
313
|
children: [
|
|
305
314
|
"No fields available",
|
|
306
315
|
" ",
|
|
307
|
-
/* @__PURE__ */ jsx(HoverInfo, { children: "
|
|
316
|
+
/* @__PURE__ */ jsx(HoverInfo, { children: "No condition-capable fields exist yet. JSON fields support status conditions only; their values cannot be compared directly." })
|
|
308
317
|
]
|
|
309
318
|
})] }),
|
|
310
319
|
(isTextMode || selectedField?.type) && /* @__PURE__ */ jsxs(Fragment$1, { children: [
|
|
@@ -328,7 +337,7 @@ function ConditionRow({ condition, index, eligibleFields, fieldsByName, isFirst,
|
|
|
328
337
|
className: "pz:w-28",
|
|
329
338
|
"aria-invalid": !!propertyError,
|
|
330
339
|
children: /* @__PURE__ */ jsx(SelectValue, {})
|
|
331
|
-
}), /* @__PURE__ */ jsxs(SelectContent, { children: [/* @__PURE__ */ jsx(SelectItem, {
|
|
340
|
+
}), /* @__PURE__ */ jsxs(SelectContent, { children: [!isStatusOnlyField(selectedField?.type) && /* @__PURE__ */ jsx(SelectItem, {
|
|
332
341
|
value: "value",
|
|
333
342
|
children: "value"
|
|
334
343
|
}), /* @__PURE__ */ jsx(SelectItem, {
|
|
@@ -379,7 +388,8 @@ function ConditionRow({ condition, index, eligibleFields, fieldsByName, isFirst,
|
|
|
379
388
|
* wrapping adapters own where that block lives in their payload.
|
|
380
389
|
*/
|
|
381
390
|
function ConditionBlockEditor({ value, onChange, fields, form, conditionsPath, fieldNameMode = "select", fieldNamePlaceholder, fieldNameSuggestions, properties, inputFields, searchSecrets, searchConstants }) {
|
|
382
|
-
const
|
|
391
|
+
const statusOffered = (properties ?? ["value", "status"]).includes("status");
|
|
392
|
+
const eligibleFields = useMemo(() => fields.filter((f) => OPERATORS_BY_TYPE[f.type].length > 0 || statusOffered && isStatusOnlyField(f.type)), [fields, statusOffered]);
|
|
383
393
|
const fieldsByName = useMemo(() => new Map(fields.map((f) => [f.fieldName, f])), [fields]);
|
|
384
394
|
const addBlock = useCallback(() => {
|
|
385
395
|
onChange({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipes-run-if-input.mjs","names":[],"sources":["../../../../src/components/defaults/adapters/pipes-run-if-input.tsx"],"sourcesContent":["import {\n type ConditionBlockMeta,\n type ConditionOperators,\n type ConstantSuggestion,\n type PipeRunIf,\n type PipesFieldDefinitionWithName,\n type PipesRunIfMeta,\n type RecordFieldType,\n RUN_IF_OPERATOR_LABELS,\n RUN_IF_STATUS_OPERATORS,\n RUN_IF_VALUE_OPERATORS,\n type SecretSuggestion,\n type StoreOption,\n} from \"@pipe0/base\";\nimport { useCallback, useMemo } from \"react\";\nimport { useFieldError } from \"../../../hooks/use-field-error.js\";\nimport { cn } from \"../../../lib/utils.js\";\nimport type { FieldHandle } from \"../../../types/field-handle.js\";\nimport type { FormHandle } from \"../../../types/form-handle.js\";\nimport { HoverInfo } from \"../../hover-info.js\";\nimport { SuggestCombobox } from \"../../internal/combobox/suggest-combobox.js\";\nimport { FieldLegend } from \"../../internal/field-legend.js\";\nimport { IconPlus } from \"../../internal/icons.js\";\nimport { LiquidEditor } from \"../../internal/LiquidEditor/LiquidEditor.js\";\nimport { Badge } from \"../../ui/badge.js\";\nimport { Button } from \"../../ui/button.js\";\nimport { Input } from \"../../ui/input.js\";\nimport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../../ui/select.js\";\nimport { FieldSectionEnumeration } from \"../field-section-enumeration.js\";\n\n// Use a loose type for internal manipulation since the discriminated union\n// is strict about property/operator/value combinations.\ntype Condition = {\n field_name: string;\n property: string;\n operator: string;\n value: unknown;\n};\n\n// Loose shape of a bare condition block ({logic, conditions}) — the run-if\n// `when` block, and an effect's `config.where`. The editor below is shared by\n// both; the strict discriminated-union types live in @pipe0/base.\ntype ConditionBlockValue = {\n logic: \"and\" | \"or\";\n conditions: Condition[];\n};\n\nconst OPERATORS_BY_TYPE: Record<RecordFieldType, ConditionOperators[]> = {\n string: [\"eq\", \"neq\", \"contains\", \"matches\"],\n number: [\"eq\", \"neq\", \"gt\", \"gte\", \"lt\", \"lte\"],\n boolean: [\"eq\", \"neq\"],\n json: [],\n unknown: [],\n};\n\nconst EMPTY_CONDITION: Condition = {\n field_name: \"\",\n property: \"value\",\n operator: \"eq\",\n value: \"\",\n};\n\nconst CONNECTOR_GAP = 32;\n\n/**\n * Maps a fetched field-name suggestion's `data.type` (stringly, from\n * `sheetColumnsOptionsDef`) to an operator list. Unknown/dynamic/json types\n * return `undefined` — callers keep the FULL operator set, since a free-typed\n * column name must never be hard-restricted.\n */\nfunction operatorsForSuggestion(\n suggestion: StoreOption | undefined,\n): ConditionOperators[] | undefined {\n const type = suggestion?.data?.type;\n if (!type || !(type in OPERATORS_BY_TYPE)) return undefined;\n const operators = OPERATORS_BY_TYPE[type as RecordFieldType];\n return operators.length > 0 ? operators : undefined;\n}\n\ntype MetaField = {\n fieldName: string;\n fieldLabel: string;\n type: RecordFieldType;\n format: string | null;\n};\n\nfunction ConditionRow({\n condition,\n index,\n eligibleFields,\n fieldsByName,\n isFirst,\n isLast,\n logic,\n form,\n conditionsPath,\n fieldNameMode,\n fieldNamePlaceholder,\n fieldNameSuggestions,\n showStatusProperty,\n inputFields,\n searchSecrets,\n searchConstants,\n onUpdate,\n onRemove,\n onAddCondition,\n onLogicChange,\n}: {\n condition: Condition;\n index: number;\n eligibleFields: MetaField[];\n fieldsByName: ReadonlyMap<string, MetaField>;\n isFirst: boolean;\n isLast: boolean;\n logic: PipeRunIf[\"when\"][\"logic\"];\n form: FormHandle;\n conditionsPath: string;\n fieldNameMode: \"select\" | \"text\";\n fieldNamePlaceholder?: string;\n /** Fetched `field_name` suggestions (text mode) — upgrades the free-text input to a combobox. */\n fieldNameSuggestions?: StoreOption[];\n showStatusProperty: boolean;\n inputFields?: PipesFieldDefinitionWithName[];\n searchSecrets?: (query: string) => Promise<SecretSuggestion[]>;\n searchConstants?: (query: string) => Promise<ConstantSuggestion[]>;\n onUpdate: (index: number, condition: Condition) => void;\n onRemove: (index: number) => void;\n onAddCondition: () => void;\n onLogicChange: (logic: PipeRunIf[\"when\"][\"logic\"]) => void;\n}) {\n const conditionPath = `${conditionsPath}.${index}`;\n const valueError = useFieldError(form, `${conditionPath}.value`);\n const fieldNameError = useFieldError(form, `${conditionPath}.field_name`);\n const operatorError = useFieldError(form, `${conditionPath}.operator`);\n const propertyError = useFieldError(form, `${conditionPath}.property`);\n\n const showConnector = !(isFirst && isLast);\n const isTextMode = fieldNameMode === \"text\";\n const hasEligibleFields = eligibleFields.length > 0;\n const selectedField = condition.field_name ? fieldsByName.get(condition.field_name) : undefined;\n\n const matchedSuggestion = useMemo(\n () =>\n isTextMode && condition.field_name\n ? fieldNameSuggestions?.find((s) => s.value === condition.field_name)\n : undefined,\n [isTextMode, condition.field_name, fieldNameSuggestions],\n );\n\n const availableOperators = useMemo(() => {\n if (condition.property === \"status\") {\n return RUN_IF_STATUS_OPERATORS.map((op) => ({\n value: op,\n label: RUN_IF_OPERATOR_LABELS[op],\n }));\n }\n const valueOperators = RUN_IF_VALUE_OPERATORS.map((op) => ({\n value: op,\n label: RUN_IF_OPERATOR_LABELS[op],\n }));\n if (isTextMode) {\n // Free-text field names target a sheet whose column types are unknown —\n // offer the full operator set, narrowed only when the typed name matches\n // a fetched suggestion with a known type.\n const suggested = operatorsForSuggestion(matchedSuggestion);\n return suggested\n ? valueOperators.filter((op) => suggested.includes(op.value))\n : valueOperators;\n }\n if (!selectedField?.type) return [];\n return valueOperators.filter((op) => OPERATORS_BY_TYPE[selectedField.type].includes(op.value));\n }, [condition.property, selectedField, isTextMode, matchedSuggestion]);\n\n const renderValueInput = () => {\n if (!isTextMode && (!condition.field_name || !selectedField)) {\n return <Input className=\"pz:w-32\" placeholder=\"\" disabled aria-invalid={!!valueError} />;\n }\n\n if (isTextMode && condition.property !== \"status\") {\n if (inputFields) {\n return (\n <div\n className={cn(\n \"pz:w-64 pz:rounded-md pz:border pz:border-input pz:bg-transparent\",\n valueError && \"pz:border-destructive\",\n )}\n >\n <LiquidEditor\n value={String(condition.value ?? \"\")}\n onChange={(v) => onUpdate(index, { ...condition, value: v })}\n inputFields={inputFields}\n searchSecrets={searchSecrets}\n searchConstants={searchConstants}\n placeholder=\"\"\n hideLegend\n />\n </div>\n );\n }\n return (\n <Input\n className=\"pz:w-32\"\n aria-invalid={!!valueError}\n value={String(condition.value ?? \"\")}\n onChange={(e) => onUpdate(index, { ...condition, value: e.target.value })}\n placeholder=\"\"\n />\n );\n }\n\n if (condition.property === \"status\") {\n return (\n <Select\n value={String(condition.value) || null}\n onValueChange={(v) => onUpdate(index, { ...condition, value: v })}\n >\n <SelectTrigger className=\"pz:w-32\" aria-invalid={!!valueError}>\n <SelectValue placeholder=\"--status--\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"completed\">completed</SelectItem>\n <SelectItem value=\"skipped\">skipped</SelectItem>\n <SelectItem value=\"failed\">failed</SelectItem>\n <SelectItem value=\"no_result\">no_result</SelectItem>\n </SelectContent>\n </Select>\n );\n }\n\n if (selectedField?.type === \"boolean\") {\n return (\n <Select\n value={String(condition.value)}\n onValueChange={(v) => onUpdate(index, { ...condition, value: v })}\n >\n <SelectTrigger className=\"pz:w-24\" aria-invalid={!!valueError}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"true\">true</SelectItem>\n <SelectItem value=\"false\">false</SelectItem>\n </SelectContent>\n </Select>\n );\n }\n\n if (selectedField?.type === \"number\") {\n return (\n <Input\n type=\"number\"\n className=\"pz:w-32\"\n aria-invalid={!!valueError}\n value={String(Number(condition.value ?? 0))}\n onChange={(e) =>\n onUpdate(index, {\n ...condition,\n value: Number(e.target.value) || 0,\n })\n }\n placeholder=\"\"\n />\n );\n }\n\n return (\n <Input\n className=\"pz:w-32\"\n aria-invalid={!!valueError}\n value={String(condition.value ?? \"\")}\n onChange={(e) => onUpdate(index, { ...condition, value: e.target.value })}\n placeholder=\"\"\n />\n );\n };\n\n const errorMessage = valueError || fieldNameError || operatorError || propertyError;\n\n return (\n <div>\n <div className={cn(\"pz:relative\", showConnector && \"pz:pl-17\")}>\n {showConnector && (\n <>\n {isFirst ? (\n <div\n className=\"pz:absolute pz:left-7 pz:w-10 pz:border-l-2 pz:border-t-2 pz:border-input pz:rounded-tl-lg pz:pointer-events-none\"\n style={{ top: \"50%\", bottom: -CONNECTOR_GAP }}\n />\n ) : (\n <div\n className=\"pz:absolute pz:left-7 pz:w-10 pz:border-l-2 pz:border-b-2 pz:border-input pz:rounded-bl-lg pz:pointer-events-none\"\n style={{ top: -CONNECTOR_GAP, bottom: \"50%\" }}\n />\n )}\n {!isFirst && !isLast && (\n <div\n className=\"pz:absolute pz:left-7 pz:border-l-2 pz:border-input pz:pointer-events-none\"\n style={{ top: \"50%\", bottom: -CONNECTOR_GAP }}\n />\n )}\n {!isFirst && (\n <div\n className=\"pz:absolute pz:left-7 pz:z-10\"\n style={{\n top: -CONNECTOR_GAP / 2,\n transform: \"translate(-50%, -50%)\",\n }}\n >\n <Select value={logic} onValueChange={(v) => onLogicChange(v as \"and\" | \"or\")}>\n <SelectTrigger className=\"pz:w-17 pz:h-6 pz:text-xs pz:bg-background pz:hover:bg-accent\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectGroup>\n <SelectItem value=\"and\">AND</SelectItem>\n <SelectItem value=\"or\">OR</SelectItem>\n </SelectGroup>\n </SelectContent>\n </Select>\n </div>\n )}\n </>\n )}\n <div className=\"pz:flex pz:flex-wrap pz:items-center pz:gap-2\">\n <FieldSectionEnumeration index={index} onRemove={onRemove} />\n {isTextMode ? (\n fieldNameSuggestions && fieldNameSuggestions.length > 0 ? (\n // Fetched target-sheet columns available → suggest combobox.\n // `allowCreate` keeps any literal column name typeable.\n <div className=\"pz:min-w-40\">\n <SuggestCombobox\n single\n value={condition.field_name ? [condition.field_name] : []}\n onChange={(next) => {\n const fieldName = next[next.length - 1] ?? \"\";\n const suggested = operatorsForSuggestion(\n fieldNameSuggestions.find((s) => s.value === fieldName),\n );\n const operatorStillValid =\n !suggested || suggested.includes(condition.operator as ConditionOperators);\n onUpdate(index, {\n ...condition,\n field_name: fieldName,\n ...(operatorStillValid ? {} : { operator: \"eq\", value: \"\" }),\n });\n }}\n options={fieldNameSuggestions}\n allowCreate\n ariaInvalid={!!fieldNameError}\n placeholder={fieldNamePlaceholder ?? \"column\"}\n emptyLabel=\"No columns found\"\n />\n </div>\n ) : (\n <Input\n className=\"pz:w-40\"\n aria-invalid={!!fieldNameError}\n value={condition.field_name}\n onChange={(e) => onUpdate(index, { ...condition, field_name: e.target.value })}\n placeholder={fieldNamePlaceholder ?? \"column\"}\n />\n )\n ) : (\n <>\n <Select\n value={condition.field_name || null}\n disabled={!hasEligibleFields}\n onValueChange={(v) => {\n if (v === null) return;\n onUpdate(index, {\n ...condition,\n field_name: v,\n operator: \"eq\",\n value: \"\",\n });\n }}\n >\n <SelectTrigger className=\"pz:w-40\" aria-invalid={!!fieldNameError}>\n <SelectValue placeholder=\"Select field\" />\n </SelectTrigger>\n <SelectContent>\n {eligibleFields.map((f) => (\n <SelectItem key={f.fieldName} value={f.fieldName}>\n {f.fieldLabel || f.fieldName}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {!hasEligibleFields && (\n <span className=\"pz:text-xs pz:text-muted-foreground\">\n No fields available{\" \"}\n <HoverInfo>\n Conditions require plain fields. JSON fields are not allowed.\n </HoverInfo>\n </span>\n )}\n </>\n )}\n\n {(isTextMode || selectedField?.type) && (\n <>\n {showStatusProperty && (\n <>\n <Badge\n variant=\"secondary\"\n className=\"pz:bg-accent pz:border pz:border-input pz:font-normal pz:text-muted-foreground pz:h-8\"\n >\n 's\n </Badge>\n <Select\n defaultValue=\"value\"\n value={condition.property}\n onValueChange={(v) => {\n if (v === null) return;\n onUpdate(index, {\n ...condition,\n property: v,\n operator: \"eq\",\n value: \"\",\n });\n }}\n >\n <SelectTrigger className=\"pz:w-28\" aria-invalid={!!propertyError}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"value\">value</SelectItem>\n <SelectItem value=\"status\">status</SelectItem>\n </SelectContent>\n </Select>\n </>\n )}\n\n <Select\n value={condition.operator}\n onValueChange={(v) =>\n onUpdate(index, {\n ...condition,\n operator: v as ConditionOperators,\n })\n }\n >\n <SelectTrigger className=\"pz:w-28\" aria-invalid={!!operatorError}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {availableOperators.map((op) => (\n <SelectItem key={op.value} value={op.value}>\n {op.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n\n {renderValueInput()}\n </>\n )}\n </div>\n {errorMessage && (\n <span\n className=\"pz:text-destructive pz:text-xs pz:font-medium pz:mt-1 pz:block\"\n role=\"alert\"\n >\n {errorMessage}\n </span>\n )}\n </div>\n {isLast && (\n <div className=\"pz:flex pz:items-center pz:gap-2\">\n <Button type=\"button\" variant=\"link\" size=\"xs\" onClick={onAddCondition}>\n <IconPlus />\n New rule\n </Button>\n </div>\n )}\n </div>\n );\n}\n\n/**\n * Presentational condition-block editor shared by the pipe run-if gate and by\n * effects that filter rows by a condition (e.g. `rows:remove@1`'s `where`).\n * Operates on a bare `{logic, conditions}` block via `value`/`onChange`; the\n * wrapping adapters own where that block lives in their payload.\n */\nexport function ConditionBlockEditor({\n value,\n onChange,\n fields,\n form,\n conditionsPath,\n fieldNameMode = \"select\",\n fieldNamePlaceholder,\n fieldNameSuggestions,\n properties,\n inputFields,\n searchSecrets,\n searchConstants,\n}: {\n value: ConditionBlockValue | null;\n onChange: (value: ConditionBlockValue | null) => void;\n fields: MetaField[];\n form: FormHandle;\n // Field-error path of the conditions array (e.g. `run_if.when.conditions` or\n // `config.where.conditions`).\n conditionsPath: string;\n // \"text\" renders field_name as a free-form column name (the condition\n // targets a sheet whose columns are unknown at config time).\n fieldNameMode?: \"select\" | \"text\";\n fieldNamePlaceholder?: string;\n // Fetched target-sheet column suggestions (text mode only) — when non-empty\n // the free-text field name upgrades to a suggest combobox.\n fieldNameSuggestions?: StoreOption[];\n // Which condition properties are offered; defaults to value + status.\n properties?: (\"value\" | \"status\")[];\n // When present, string values render a LiquidEditor with the `/` picker.\n inputFields?: PipesFieldDefinitionWithName[];\n searchSecrets?: (query: string) => Promise<SecretSuggestion[]>;\n searchConstants?: (query: string) => Promise<ConstantSuggestion[]>;\n}) {\n // Built once and reused across every condition row, instead of each row\n // scanning `fields` linearly. With N rows and M fields this turns O(N·M)\n // lookups into O(N+M).\n const eligibleFields = useMemo(\n () => fields.filter((f) => OPERATORS_BY_TYPE[f.type].length > 0),\n [fields],\n );\n const fieldsByName = useMemo(() => new Map(fields.map((f) => [f.fieldName, f])), [fields]);\n\n const addBlock = useCallback(() => {\n onChange({ logic: \"and\", conditions: [{ ...EMPTY_CONDITION }] });\n }, [onChange]);\n\n const updateCondition = (index: number, condition: Condition) => {\n if (!value) return;\n const newConditions = [...value.conditions];\n newConditions[index] = condition;\n onChange({ ...value, conditions: newConditions });\n };\n\n const removeCondition = (index: number) => {\n if (!value) return;\n if (value.conditions.length <= 1) {\n onChange(null);\n return;\n }\n onChange({ ...value, conditions: value.conditions.filter((_, i) => i !== index) });\n };\n\n const addCondition = () => {\n if (!value) return;\n onChange({ ...value, conditions: [...value.conditions, { ...EMPTY_CONDITION }] });\n };\n\n const changeLogic = (logic: \"and\" | \"or\") => {\n if (!value) return;\n onChange({ ...value, logic });\n };\n\n return (\n <div data-p0=\"input\">\n {!value ? (\n <div className=\"pz:flex pz:items-center\">\n <Button type=\"button\" variant=\"link\" size=\"xs\" className=\"pz:px-0\" onClick={addBlock}>\n <IconPlus />\n New rule\n </Button>\n </div>\n ) : (\n <div className=\"pz:flex pz:flex-col pz:gap-8\">\n {value.conditions.map((condition, idx) => (\n <ConditionRow\n key={idx}\n condition={condition}\n index={idx}\n eligibleFields={eligibleFields}\n fieldsByName={fieldsByName}\n isFirst={idx === 0}\n isLast={idx === value.conditions.length - 1}\n logic={value.logic}\n form={form}\n conditionsPath={conditionsPath}\n fieldNameMode={fieldNameMode}\n fieldNamePlaceholder={fieldNamePlaceholder}\n fieldNameSuggestions={fieldNameSuggestions}\n showStatusProperty={(properties ?? [\"value\", \"status\"]).includes(\"status\")}\n inputFields={inputFields}\n searchSecrets={searchSecrets}\n searchConstants={searchConstants}\n onUpdate={updateCondition}\n onRemove={removeCondition}\n onAddCondition={addCondition}\n onLogicChange={changeLogic}\n />\n ))}\n {fieldNameMode === \"text\" && inputFields && (\n <FieldLegend entries={[{ key: \"/\", label: \"to insert a reference\" }]} />\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport function PipesRunIfInputAdapter(field: FieldHandle<\"pipes_run_if_input\">) {\n const pipeRunIf = field.value as PipeRunIf | null;\n const meta = field.meta as PipesRunIfMeta;\n\n return (\n <ConditionBlockEditor\n value={(pipeRunIf?.when as ConditionBlockValue | undefined) ?? null}\n onChange={(block) => field.setValue(block ? { action: \"run\", when: block } : null)}\n fields={meta.fields}\n form={field.form}\n conditionsPath={`${field.path}.when.conditions`}\n />\n );\n}\n\nexport function ConditionBlockInputAdapter(field: FieldHandle<\"condition_block_input\">) {\n const block = field.value as ConditionBlockValue | null;\n const meta = field.meta as ConditionBlockMeta;\n\n return (\n <ConditionBlockEditor\n value={block}\n onChange={(next) => field.setValue(next)}\n fields={meta.fields}\n form={field.form}\n conditionsPath={`${field.path}.conditions`}\n fieldNameMode={meta.fieldNameMode}\n fieldNamePlaceholder={meta.fieldNamePlaceholder}\n fieldNameSuggestions={meta.options}\n properties={meta.properties}\n inputFields={meta.inputFields}\n searchSecrets={field.searchSecrets}\n searchConstants={field.searchConstants}\n />\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAsDA,MAAM,oBAAmE;CACvE,QAAQ;EAAC;EAAM;EAAO;EAAY;EAAU;CAC5C,QAAQ;EAAC;EAAM;EAAO;EAAM;EAAO;EAAM;EAAM;CAC/C,SAAS,CAAC,MAAM,MAAM;CACtB,MAAM,EAAE;CACR,SAAS,EAAE;CACZ;AAED,MAAM,kBAA6B;CACjC,YAAY;CACZ,UAAU;CACV,UAAU;CACV,OAAO;CACR;AAED,MAAM,gBAAgB;;;;;;;AAQtB,SAAS,uBACP,YACkC;CAClC,MAAM,OAAO,YAAY,MAAM;AAC/B,KAAI,CAAC,QAAQ,EAAE,QAAQ,mBAAoB,QAAO;CAClD,MAAM,YAAY,kBAAkB;AACpC,QAAO,UAAU,SAAS,IAAI,YAAY;;AAU5C,SAAS,aAAa,EACpB,WACA,OACA,gBACA,cACA,SACA,QACA,OACA,MACA,gBACA,eACA,sBACA,sBACA,oBACA,aACA,eACA,iBACA,UACA,UACA,gBACA,iBAuBC;CACD,MAAM,gBAAgB,GAAG,eAAe,GAAG;CAC3C,MAAM,aAAa,cAAc,MAAM,GAAG,cAAc,QAAQ;CAChE,MAAM,iBAAiB,cAAc,MAAM,GAAG,cAAc,aAAa;CACzE,MAAM,gBAAgB,cAAc,MAAM,GAAG,cAAc,WAAW;CACtE,MAAM,gBAAgB,cAAc,MAAM,GAAG,cAAc,WAAW;CAEtE,MAAM,gBAAgB,EAAE,WAAW;CACnC,MAAM,aAAa,kBAAkB;CACrC,MAAM,oBAAoB,eAAe,SAAS;CAClD,MAAM,gBAAgB,UAAU,aAAa,aAAa,IAAI,UAAU,WAAW,GAAG;CAEtF,MAAM,oBAAoB,cAEtB,cAAc,UAAU,aACpB,sBAAsB,MAAM,MAAM,EAAE,UAAU,UAAU,WAAW,GACnE,QACN;EAAC;EAAY,UAAU;EAAY;EAAqB,CACzD;CAED,MAAM,qBAAqB,cAAc;AACvC,MAAI,UAAU,aAAa,SACzB,QAAO,wBAAwB,KAAK,QAAQ;GAC1C,OAAO;GACP,OAAO,uBAAuB;GAC/B,EAAE;EAEL,MAAM,iBAAiB,uBAAuB,KAAK,QAAQ;GACzD,OAAO;GACP,OAAO,uBAAuB;GAC/B,EAAE;AACH,MAAI,YAAY;GAId,MAAM,YAAY,uBAAuB,kBAAkB;AAC3D,UAAO,YACH,eAAe,QAAQ,OAAO,UAAU,SAAS,GAAG,MAAM,CAAC,GAC3D;;AAEN,MAAI,CAAC,eAAe,KAAM,QAAO,EAAE;AACnC,SAAO,eAAe,QAAQ,OAAO,kBAAkB,cAAc,MAAM,SAAS,GAAG,MAAM,CAAC;IAC7F;EAAC,UAAU;EAAU;EAAe;EAAY;EAAkB,CAAC;CAEtE,MAAM,yBAAyB;AAC7B,MAAI,CAAC,eAAe,CAAC,UAAU,cAAc,CAAC,eAC5C,QAAO,oBAAC,OAAD;GAAO,WAAU;GAAU,aAAY;GAAG;GAAS,gBAAc,CAAC,CAAC;GAAc;AAG1F,MAAI,cAAc,UAAU,aAAa,UAAU;AACjD,OAAI,YACF,QACE,oBAAC,OAAD;IACE,WAAW,GACT,qEACA,cAAc,wBACf;cAED,oBAAC,cAAD;KACE,OAAO,OAAO,UAAU,SAAS,GAAG;KACpC,WAAW,MAAM,SAAS,OAAO;MAAE,GAAG;MAAW,OAAO;MAAG,CAAC;KAC/C;KACE;KACE;KACjB,aAAY;KACZ;KACA;IACE;AAGV,UACE,oBAAC,OAAD;IACE,WAAU;IACV,gBAAc,CAAC,CAAC;IAChB,OAAO,OAAO,UAAU,SAAS,GAAG;IACpC,WAAW,MAAM,SAAS,OAAO;KAAE,GAAG;KAAW,OAAO,EAAE,OAAO;KAAO,CAAC;IACzE,aAAY;IACZ;;AAIN,MAAI,UAAU,aAAa,SACzB,QACE,qBAAC,QAAD;GACE,OAAO,OAAO,UAAU,MAAM,IAAI;GAClC,gBAAgB,MAAM,SAAS,OAAO;IAAE,GAAG;IAAW,OAAO;IAAG,CAAC;aAFnE,CAIE,oBAAC,eAAD;IAAe,WAAU;IAAU,gBAAc,CAAC,CAAC;cACjD,oBAAC,aAAD,EAAa,aAAY,cAAe;IAC1B,GAChB,qBAAC,eAAD;IACE,oBAAC,YAAD;KAAY,OAAM;eAAY;KAAsB;IACpD,oBAAC,YAAD;KAAY,OAAM;eAAU;KAAoB;IAChD,oBAAC,YAAD;KAAY,OAAM;eAAS;KAAmB;IAC9C,oBAAC,YAAD;KAAY,OAAM;eAAY;KAAsB;IACtC,IACT;;AAIb,MAAI,eAAe,SAAS,UAC1B,QACE,qBAAC,QAAD;GACE,OAAO,OAAO,UAAU,MAAM;GAC9B,gBAAgB,MAAM,SAAS,OAAO;IAAE,GAAG;IAAW,OAAO;IAAG,CAAC;aAFnE,CAIE,oBAAC,eAAD;IAAe,WAAU;IAAU,gBAAc,CAAC,CAAC;cACjD,oBAAC,aAAD,EAAe;IACD,GAChB,qBAAC,eAAD,aACE,oBAAC,YAAD;IAAY,OAAM;cAAO;IAAiB,GAC1C,oBAAC,YAAD;IAAY,OAAM;cAAQ;IAAkB,EAC9B,IACT;;AAIb,MAAI,eAAe,SAAS,SAC1B,QACE,oBAAC,OAAD;GACE,MAAK;GACL,WAAU;GACV,gBAAc,CAAC,CAAC;GAChB,OAAO,OAAO,OAAO,UAAU,SAAS,EAAE,CAAC;GAC3C,WAAW,MACT,SAAS,OAAO;IACd,GAAG;IACH,OAAO,OAAO,EAAE,OAAO,MAAM,IAAI;IAClC,CAAC;GAEJ,aAAY;GACZ;AAIN,SACE,oBAAC,OAAD;GACE,WAAU;GACV,gBAAc,CAAC,CAAC;GAChB,OAAO,OAAO,UAAU,SAAS,GAAG;GACpC,WAAW,MAAM,SAAS,OAAO;IAAE,GAAG;IAAW,OAAO,EAAE,OAAO;IAAO,CAAC;GACzE,aAAY;GACZ;;CAIN,MAAM,eAAe,cAAc,kBAAkB,iBAAiB;AAEtE,QACE,qBAAC,OAAD,aACE,qBAAC,OAAD;EAAK,WAAW,GAAG,eAAe,iBAAiB,WAAW;YAA9D;GACG,iBACC;IACG,UACC,oBAAC,OAAD;KACE,WAAU;KACV,OAAO;MAAE,KAAK;MAAO,QAAQ,CAAC;MAAe;KAC7C,IAEF,oBAAC,OAAD;KACE,WAAU;KACV,OAAO;MAAE,KAAK,CAAC;MAAe,QAAQ;MAAO;KAC7C;IAEH,CAAC,WAAW,CAAC,UACZ,oBAAC,OAAD;KACE,WAAU;KACV,OAAO;MAAE,KAAK;MAAO,QAAQ,CAAC;MAAe;KAC7C;IAEH,CAAC,WACA,oBAAC,OAAD;KACE,WAAU;KACV,OAAO;MACL,KAAK,CAAC,gBAAgB;MACtB,WAAW;MACZ;eAED,qBAAC,QAAD;MAAQ,OAAO;MAAO,gBAAgB,MAAM,cAAc,EAAkB;gBAA5E,CACE,oBAAC,eAAD;OAAe,WAAU;iBACvB,oBAAC,aAAD,EAAe;OACD,GAChB,oBAAC,eAAD,YACE,qBAAC,aAAD,aACE,oBAAC,YAAD;OAAY,OAAM;iBAAM;OAAgB,GACxC,oBAAC,YAAD;OAAY,OAAM;iBAAK;OAAe,EAC1B,KACA,EACT;;KACL;IAEP;GAEL,qBAAC,OAAD;IAAK,WAAU;cAAf;KACE,oBAAC,yBAAD;MAAgC;MAAiB;MAAY;KAC5D,aACC,wBAAwB,qBAAqB,SAAS,IAGpD,oBAAC,OAAD;MAAK,WAAU;gBACb,oBAAC,iBAAD;OACE;OACA,OAAO,UAAU,aAAa,CAAC,UAAU,WAAW,GAAG,EAAE;OACzD,WAAW,SAAS;QAClB,MAAM,YAAY,KAAK,KAAK,SAAS,MAAM;QAC3C,MAAM,YAAY,uBAChB,qBAAqB,MAAM,MAAM,EAAE,UAAU,UAAU,CACxD;QACD,MAAM,qBACJ,CAAC,aAAa,UAAU,SAAS,UAAU,SAA+B;AAC5E,iBAAS,OAAO;SACd,GAAG;SACH,YAAY;SACZ,GAAI,qBAAqB,EAAE,GAAG;UAAE,UAAU;UAAM,OAAO;UAAI;SAC5D,CAAC;;OAEJ,SAAS;OACT;OACA,aAAa,CAAC,CAAC;OACf,aAAa,wBAAwB;OACrC,YAAW;OACX;MACE,IAEN,oBAAC,OAAD;MACE,WAAU;MACV,gBAAc,CAAC,CAAC;MAChB,OAAO,UAAU;MACjB,WAAW,MAAM,SAAS,OAAO;OAAE,GAAG;OAAW,YAAY,EAAE,OAAO;OAAO,CAAC;MAC9E,aAAa,wBAAwB;MACrC,IAGJ,8CACE,qBAAC,QAAD;MACE,OAAO,UAAU,cAAc;MAC/B,UAAU,CAAC;MACX,gBAAgB,MAAM;AACpB,WAAI,MAAM,KAAM;AAChB,gBAAS,OAAO;QACd,GAAG;QACH,YAAY;QACZ,UAAU;QACV,OAAO;QACR,CAAC;;gBAVN,CAaE,oBAAC,eAAD;OAAe,WAAU;OAAU,gBAAc,CAAC,CAAC;iBACjD,oBAAC,aAAD,EAAa,aAAY,gBAAiB;OAC5B,GAChB,oBAAC,eAAD,YACG,eAAe,KAAK,MACnB,oBAAC,YAAD;OAA8B,OAAO,EAAE;iBACpC,EAAE,cAAc,EAAE;OACR,EAFI,EAAE,UAEN,CACb,EACY,EACT;SACR,CAAC,qBACA,qBAAC,QAAD;MAAM,WAAU;gBAAhB;OAAsD;OAChC;OACpB,oBAAC,WAAD,YAAW,iEAEC;OACP;QAER;MAGH,cAAc,eAAe,SAC7B;MACG,sBACC,8CACE,oBAAC,OAAD;OACE,SAAQ;OACR,WAAU;iBACX;OAEO,GACR,qBAAC,QAAD;OACE,cAAa;OACb,OAAO,UAAU;OACjB,gBAAgB,MAAM;AACpB,YAAI,MAAM,KAAM;AAChB,iBAAS,OAAO;SACd,GAAG;SACH,UAAU;SACV,UAAU;SACV,OAAO;SACR,CAAC;;iBAVN,CAaE,oBAAC,eAAD;QAAe,WAAU;QAAU,gBAAc,CAAC,CAAC;kBACjD,oBAAC,aAAD,EAAe;QACD,GAChB,qBAAC,eAAD,aACE,oBAAC,YAAD;QAAY,OAAM;kBAAQ;QAAkB,GAC5C,oBAAC,YAAD;QAAY,OAAM;kBAAS;QAAmB,EAChC,IACT;SACR;MAGL,qBAAC,QAAD;OACE,OAAO,UAAU;OACjB,gBAAgB,MACd,SAAS,OAAO;QACd,GAAG;QACH,UAAU;QACX,CAAC;iBANN,CASE,oBAAC,eAAD;QAAe,WAAU;QAAU,gBAAc,CAAC,CAAC;kBACjD,oBAAC,aAAD,EAAe;QACD,GAChB,oBAAC,eAAD,YACG,mBAAmB,KAAK,OACvB,oBAAC,YAAD;QAA2B,OAAO,GAAG;kBAClC,GAAG;QACO,EAFI,GAAG,MAEP,CACb,EACY,EACT;;MAER,kBAAkB;MAClB;KAED;;GACL,gBACC,oBAAC,QAAD;IACE,WAAU;IACV,MAAK;cAEJ;IACI;GAEL;KACL,UACC,oBAAC,OAAD;EAAK,WAAU;YACb,qBAAC,QAAD;GAAQ,MAAK;GAAS,SAAQ;GAAO,MAAK;GAAK,SAAS;aAAxD,CACE,oBAAC,UAAD,EAAY,cAEL;;EACL,EAEJ;;;;;;;;AAUV,SAAgB,qBAAqB,EACnC,OACA,UACA,QACA,MACA,gBACA,gBAAgB,UAChB,sBACA,sBACA,YACA,aACA,eACA,mBAsBC;CAID,MAAM,iBAAiB,cACf,OAAO,QAAQ,MAAM,kBAAkB,EAAE,MAAM,SAAS,EAAE,EAChE,CAAC,OAAO,CACT;CACD,MAAM,eAAe,cAAc,IAAI,IAAI,OAAO,KAAK,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC;CAE1F,MAAM,WAAW,kBAAkB;AACjC,WAAS;GAAE,OAAO;GAAO,YAAY,CAAC,EAAE,GAAG,iBAAiB,CAAC;GAAE,CAAC;IAC/D,CAAC,SAAS,CAAC;CAEd,MAAM,mBAAmB,OAAe,cAAyB;AAC/D,MAAI,CAAC,MAAO;EACZ,MAAM,gBAAgB,CAAC,GAAG,MAAM,WAAW;AAC3C,gBAAc,SAAS;AACvB,WAAS;GAAE,GAAG;GAAO,YAAY;GAAe,CAAC;;CAGnD,MAAM,mBAAmB,UAAkB;AACzC,MAAI,CAAC,MAAO;AACZ,MAAI,MAAM,WAAW,UAAU,GAAG;AAChC,YAAS,KAAK;AACd;;AAEF,WAAS;GAAE,GAAG;GAAO,YAAY,MAAM,WAAW,QAAQ,GAAG,MAAM,MAAM,MAAM;GAAE,CAAC;;CAGpF,MAAM,qBAAqB;AACzB,MAAI,CAAC,MAAO;AACZ,WAAS;GAAE,GAAG;GAAO,YAAY,CAAC,GAAG,MAAM,YAAY,EAAE,GAAG,iBAAiB,CAAC;GAAE,CAAC;;CAGnF,MAAM,eAAe,UAAwB;AAC3C,MAAI,CAAC,MAAO;AACZ,WAAS;GAAE,GAAG;GAAO;GAAO,CAAC;;AAG/B,QACE,oBAAC,OAAD;EAAK,WAAQ;YACV,CAAC,QACA,oBAAC,OAAD;GAAK,WAAU;aACb,qBAAC,QAAD;IAAQ,MAAK;IAAS,SAAQ;IAAO,MAAK;IAAK,WAAU;IAAU,SAAS;cAA5E,CACE,oBAAC,UAAD,EAAY,cAEL;;GACL,IAEN,qBAAC,OAAD;GAAK,WAAU;aAAf,CACG,MAAM,WAAW,KAAK,WAAW,QAChC,oBAAC,cAAD;IAEa;IACX,OAAO;IACS;IACF;IACd,SAAS,QAAQ;IACjB,QAAQ,QAAQ,MAAM,WAAW,SAAS;IAC1C,OAAO,MAAM;IACP;IACU;IACD;IACO;IACA;IACtB,qBAAqB,cAAc,CAAC,SAAS,SAAS,EAAE,SAAS,SAAS;IAC7D;IACE;IACE;IACjB,UAAU;IACV,UAAU;IACV,gBAAgB;IAChB,eAAe;IACf,EArBK,IAqBL,CACF,EACD,kBAAkB,UAAU,eAC3B,oBAAC,aAAD,EAAa,SAAS,CAAC;IAAE,KAAK;IAAK,OAAO;IAAyB,CAAC,EAAI,EAEtE;;EAEJ;;AAIV,SAAgB,uBAAuB,OAA0C;CAC/E,MAAM,YAAY,MAAM;CACxB,MAAM,OAAO,MAAM;AAEnB,QACE,oBAAC,sBAAD;EACE,OAAQ,WAAW,QAA4C;EAC/D,WAAW,UAAU,MAAM,SAAS,QAAQ;GAAE,QAAQ;GAAO,MAAM;GAAO,GAAG,KAAK;EAClF,QAAQ,KAAK;EACb,MAAM,MAAM;EACZ,gBAAgB,GAAG,MAAM,KAAK;EAC9B;;AAIN,SAAgB,2BAA2B,OAA6C;CACtF,MAAM,QAAQ,MAAM;CACpB,MAAM,OAAO,MAAM;AAEnB,QACE,oBAAC,sBAAD;EACE,OAAO;EACP,WAAW,SAAS,MAAM,SAAS,KAAK;EACxC,QAAQ,KAAK;EACb,MAAM,MAAM;EACZ,gBAAgB,GAAG,MAAM,KAAK;EAC9B,eAAe,KAAK;EACpB,sBAAsB,KAAK;EAC3B,sBAAsB,KAAK;EAC3B,YAAY,KAAK;EACjB,aAAa,KAAK;EAClB,eAAe,MAAM;EACrB,iBAAiB,MAAM;EACvB"}
|
|
1
|
+
{"version":3,"file":"pipes-run-if-input.mjs","names":[],"sources":["../../../../src/components/defaults/adapters/pipes-run-if-input.tsx"],"sourcesContent":["import {\n type ConditionBlockMeta,\n type ConditionOperators,\n type ConstantSuggestion,\n type PipeRunIf,\n type PipesFieldDefinitionWithName,\n type PipesRunIfMeta,\n type RecordFieldType,\n RUN_IF_OPERATOR_LABELS,\n RUN_IF_STATUS_OPERATORS,\n RUN_IF_VALUE_OPERATORS,\n type SecretSuggestion,\n type StoreOption,\n} from \"@pipe0/base\";\nimport { useCallback, useMemo } from \"react\";\nimport { useFieldError } from \"../../../hooks/use-field-error.js\";\nimport { cn } from \"../../../lib/utils.js\";\nimport type { FieldHandle } from \"../../../types/field-handle.js\";\nimport type { FormHandle } from \"../../../types/form-handle.js\";\nimport { HoverInfo } from \"../../hover-info.js\";\nimport { SuggestCombobox } from \"../../internal/combobox/suggest-combobox.js\";\nimport { FieldLegend } from \"../../internal/field-legend.js\";\nimport { IconPlus } from \"../../internal/icons.js\";\nimport { LiquidEditor } from \"../../internal/LiquidEditor/LiquidEditor.js\";\nimport { Badge } from \"../../ui/badge.js\";\nimport { Button } from \"../../ui/button.js\";\nimport { Input } from \"../../ui/input.js\";\nimport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../../ui/select.js\";\nimport { FieldSectionEnumeration } from \"../field-section-enumeration.js\";\n\n// Use a loose type for internal manipulation since the discriminated union\n// is strict about property/operator/value combinations.\ntype Condition = {\n field_name: string;\n property: string;\n operator: string;\n value: unknown;\n};\n\n// Loose shape of a bare condition block ({logic, conditions}) — the run-if\n// `when` block, and an effect's `config.where`. The editor below is shared by\n// both; the strict discriminated-union types live in @pipe0/base.\ntype ConditionBlockValue = {\n logic: \"and\" | \"or\";\n conditions: Condition[];\n};\n\nconst OPERATORS_BY_TYPE: Record<RecordFieldType, ConditionOperators[]> = {\n string: [\"eq\", \"neq\", \"contains\", \"matches\"],\n number: [\"eq\", \"neq\", \"gt\", \"gte\", \"lt\", \"lte\"],\n boolean: [\"eq\", \"neq\"],\n json: [],\n unknown: [],\n};\n\n/**\n * json fields carry no VALUE operators (a json cell can't be compared as a\n * primitive) but their STATUS is a first-class condition target — \"count if\n * status(person_profile_match) eq failed\" is the canonical freshness pattern.\n * The editor locks such fields to the status property.\n */\nconst isStatusOnlyField = (type: RecordFieldType | undefined): boolean => type === \"json\";\n\nconst EMPTY_CONDITION: Condition = {\n field_name: \"\",\n property: \"value\",\n operator: \"eq\",\n value: \"\",\n};\n\nconst CONNECTOR_GAP = 32;\n\n/**\n * Maps a fetched field-name suggestion's `data.type` (stringly, from\n * `sheetColumnsOptionsDef`) to an operator list. Unknown/dynamic/json types\n * return `undefined` — callers keep the FULL operator set, since a free-typed\n * column name must never be hard-restricted.\n */\nfunction operatorsForSuggestion(\n suggestion: StoreOption | undefined,\n): ConditionOperators[] | undefined {\n const type = suggestion?.data?.type;\n if (!type || !(type in OPERATORS_BY_TYPE)) return undefined;\n const operators = OPERATORS_BY_TYPE[type as RecordFieldType];\n return operators.length > 0 ? operators : undefined;\n}\n\ntype MetaField = {\n fieldName: string;\n fieldLabel: string;\n type: RecordFieldType;\n format: string | null;\n};\n\nfunction ConditionRow({\n condition,\n index,\n eligibleFields,\n fieldsByName,\n isFirst,\n isLast,\n logic,\n form,\n conditionsPath,\n fieldNameMode,\n fieldNamePlaceholder,\n fieldNameSuggestions,\n showStatusProperty,\n inputFields,\n searchSecrets,\n searchConstants,\n onUpdate,\n onRemove,\n onAddCondition,\n onLogicChange,\n}: {\n condition: Condition;\n index: number;\n eligibleFields: MetaField[];\n fieldsByName: ReadonlyMap<string, MetaField>;\n isFirst: boolean;\n isLast: boolean;\n logic: PipeRunIf[\"when\"][\"logic\"];\n form: FormHandle;\n conditionsPath: string;\n fieldNameMode: \"select\" | \"text\";\n fieldNamePlaceholder?: string;\n /** Fetched `field_name` suggestions (text mode) — upgrades the free-text input to a combobox. */\n fieldNameSuggestions?: StoreOption[];\n showStatusProperty: boolean;\n inputFields?: PipesFieldDefinitionWithName[];\n searchSecrets?: (query: string) => Promise<SecretSuggestion[]>;\n searchConstants?: (query: string) => Promise<ConstantSuggestion[]>;\n onUpdate: (index: number, condition: Condition) => void;\n onRemove: (index: number) => void;\n onAddCondition: () => void;\n onLogicChange: (logic: PipeRunIf[\"when\"][\"logic\"]) => void;\n}) {\n const conditionPath = `${conditionsPath}.${index}`;\n const valueError = useFieldError(form, `${conditionPath}.value`);\n const fieldNameError = useFieldError(form, `${conditionPath}.field_name`);\n const operatorError = useFieldError(form, `${conditionPath}.operator`);\n const propertyError = useFieldError(form, `${conditionPath}.property`);\n\n const showConnector = !(isFirst && isLast);\n const isTextMode = fieldNameMode === \"text\";\n const hasEligibleFields = eligibleFields.length > 0;\n const selectedField = condition.field_name ? fieldsByName.get(condition.field_name) : undefined;\n\n const matchedSuggestion = useMemo(\n () =>\n isTextMode && condition.field_name\n ? fieldNameSuggestions?.find((s) => s.value === condition.field_name)\n : undefined,\n [isTextMode, condition.field_name, fieldNameSuggestions],\n );\n\n const availableOperators = useMemo(() => {\n if (condition.property === \"status\") {\n return RUN_IF_STATUS_OPERATORS.map((op) => ({\n value: op,\n label: RUN_IF_OPERATOR_LABELS[op],\n }));\n }\n const valueOperators = RUN_IF_VALUE_OPERATORS.map((op) => ({\n value: op,\n label: RUN_IF_OPERATOR_LABELS[op],\n }));\n if (isTextMode) {\n // Free-text field names target a sheet whose column types are unknown —\n // offer the full operator set, narrowed only when the typed name matches\n // a fetched suggestion with a known type.\n const suggested = operatorsForSuggestion(matchedSuggestion);\n return suggested\n ? valueOperators.filter((op) => suggested.includes(op.value))\n : valueOperators;\n }\n if (!selectedField?.type) return [];\n return valueOperators.filter((op) => OPERATORS_BY_TYPE[selectedField.type].includes(op.value));\n }, [condition.property, selectedField, isTextMode, matchedSuggestion]);\n\n const renderValueInput = () => {\n if (!isTextMode && (!condition.field_name || !selectedField)) {\n return <Input className=\"pz:w-32\" placeholder=\"\" disabled aria-invalid={!!valueError} />;\n }\n\n if (isTextMode && condition.property !== \"status\") {\n if (inputFields) {\n return (\n <div\n className={cn(\n \"pz:w-64 pz:rounded-md pz:border pz:border-input pz:bg-transparent\",\n valueError && \"pz:border-destructive\",\n )}\n >\n <LiquidEditor\n value={String(condition.value ?? \"\")}\n onChange={(v) => onUpdate(index, { ...condition, value: v })}\n inputFields={inputFields}\n searchSecrets={searchSecrets}\n searchConstants={searchConstants}\n placeholder=\"\"\n hideLegend\n />\n </div>\n );\n }\n return (\n <Input\n className=\"pz:w-32\"\n aria-invalid={!!valueError}\n value={String(condition.value ?? \"\")}\n onChange={(e) => onUpdate(index, { ...condition, value: e.target.value })}\n placeholder=\"\"\n />\n );\n }\n\n if (condition.property === \"status\") {\n return (\n <Select\n value={String(condition.value) || null}\n onValueChange={(v) => onUpdate(index, { ...condition, value: v })}\n >\n <SelectTrigger className=\"pz:w-32\" aria-invalid={!!valueError}>\n <SelectValue placeholder=\"--status--\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"completed\">completed</SelectItem>\n <SelectItem value=\"skipped\">skipped</SelectItem>\n <SelectItem value=\"failed\">failed</SelectItem>\n <SelectItem value=\"no_result\">no_result</SelectItem>\n </SelectContent>\n </Select>\n );\n }\n\n if (selectedField?.type === \"boolean\") {\n return (\n <Select\n value={String(condition.value)}\n onValueChange={(v) => onUpdate(index, { ...condition, value: v })}\n >\n <SelectTrigger className=\"pz:w-24\" aria-invalid={!!valueError}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"true\">true</SelectItem>\n <SelectItem value=\"false\">false</SelectItem>\n </SelectContent>\n </Select>\n );\n }\n\n if (selectedField?.type === \"number\") {\n return (\n <Input\n type=\"number\"\n className=\"pz:w-32\"\n aria-invalid={!!valueError}\n value={String(Number(condition.value ?? 0))}\n onChange={(e) =>\n onUpdate(index, {\n ...condition,\n value: Number(e.target.value) || 0,\n })\n }\n placeholder=\"\"\n />\n );\n }\n\n return (\n <Input\n className=\"pz:w-32\"\n aria-invalid={!!valueError}\n value={String(condition.value ?? \"\")}\n onChange={(e) => onUpdate(index, { ...condition, value: e.target.value })}\n placeholder=\"\"\n />\n );\n };\n\n const errorMessage = valueError || fieldNameError || operatorError || propertyError;\n\n return (\n <div>\n <div className={cn(\"pz:relative\", showConnector && \"pz:pl-17\")}>\n {showConnector && (\n <>\n {isFirst ? (\n <div\n className=\"pz:absolute pz:left-7 pz:w-10 pz:border-l-2 pz:border-t-2 pz:border-input pz:rounded-tl-lg pz:pointer-events-none\"\n style={{ top: \"50%\", bottom: -CONNECTOR_GAP }}\n />\n ) : (\n <div\n className=\"pz:absolute pz:left-7 pz:w-10 pz:border-l-2 pz:border-b-2 pz:border-input pz:rounded-bl-lg pz:pointer-events-none\"\n style={{ top: -CONNECTOR_GAP, bottom: \"50%\" }}\n />\n )}\n {!isFirst && !isLast && (\n <div\n className=\"pz:absolute pz:left-7 pz:border-l-2 pz:border-input pz:pointer-events-none\"\n style={{ top: \"50%\", bottom: -CONNECTOR_GAP }}\n />\n )}\n {!isFirst && (\n <div\n className=\"pz:absolute pz:left-7 pz:z-10\"\n style={{\n top: -CONNECTOR_GAP / 2,\n transform: \"translate(-50%, -50%)\",\n }}\n >\n <Select value={logic} onValueChange={(v) => onLogicChange(v as \"and\" | \"or\")}>\n <SelectTrigger className=\"pz:w-17 pz:h-6 pz:text-xs pz:bg-background pz:hover:bg-accent\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectGroup>\n <SelectItem value=\"and\">AND</SelectItem>\n <SelectItem value=\"or\">OR</SelectItem>\n </SelectGroup>\n </SelectContent>\n </Select>\n </div>\n )}\n </>\n )}\n <div className=\"pz:flex pz:flex-wrap pz:items-center pz:gap-2\">\n <FieldSectionEnumeration index={index} onRemove={onRemove} />\n {isTextMode ? (\n fieldNameSuggestions && fieldNameSuggestions.length > 0 ? (\n // Fetched target-sheet columns available → suggest combobox.\n // `allowCreate` keeps any literal column name typeable.\n <div className=\"pz:min-w-40\">\n <SuggestCombobox\n single\n value={condition.field_name ? [condition.field_name] : []}\n onChange={(next) => {\n const fieldName = next[next.length - 1] ?? \"\";\n const suggested = operatorsForSuggestion(\n fieldNameSuggestions.find((s) => s.value === fieldName),\n );\n const operatorStillValid =\n !suggested || suggested.includes(condition.operator as ConditionOperators);\n onUpdate(index, {\n ...condition,\n field_name: fieldName,\n ...(operatorStillValid ? {} : { operator: \"eq\", value: \"\" }),\n });\n }}\n options={fieldNameSuggestions}\n allowCreate\n ariaInvalid={!!fieldNameError}\n placeholder={fieldNamePlaceholder ?? \"column\"}\n emptyLabel=\"No columns found\"\n />\n </div>\n ) : (\n <Input\n className=\"pz:w-40\"\n aria-invalid={!!fieldNameError}\n value={condition.field_name}\n onChange={(e) => onUpdate(index, { ...condition, field_name: e.target.value })}\n placeholder={fieldNamePlaceholder ?? \"column\"}\n />\n )\n ) : (\n <>\n <Select\n value={condition.field_name || null}\n disabled={!hasEligibleFields}\n onValueChange={(v) => {\n if (v === null) return;\n // A json field supports only status conditions — lock the\n // property on selection so the row stays authorable.\n const statusOnly = isStatusOnlyField(fieldsByName.get(v)?.type);\n onUpdate(index, {\n ...condition,\n field_name: v,\n ...(statusOnly ? { property: \"status\" } : {}),\n operator: \"eq\",\n value: \"\",\n });\n }}\n >\n <SelectTrigger className=\"pz:w-40\" aria-invalid={!!fieldNameError}>\n <SelectValue placeholder=\"Select field\" />\n </SelectTrigger>\n <SelectContent>\n {eligibleFields.map((f) => (\n <SelectItem key={f.fieldName} value={f.fieldName}>\n {f.fieldLabel || f.fieldName}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {!hasEligibleFields && (\n <span className=\"pz:text-xs pz:text-muted-foreground\">\n No fields available{\" \"}\n <HoverInfo>\n No condition-capable fields exist yet. JSON fields support status conditions\n only; their values cannot be compared directly.\n </HoverInfo>\n </span>\n )}\n </>\n )}\n\n {(isTextMode || selectedField?.type) && (\n <>\n {showStatusProperty && (\n <>\n <Badge\n variant=\"secondary\"\n className=\"pz:bg-accent pz:border pz:border-input pz:font-normal pz:text-muted-foreground pz:h-8\"\n >\n 's\n </Badge>\n <Select\n defaultValue=\"value\"\n value={condition.property}\n onValueChange={(v) => {\n if (v === null) return;\n onUpdate(index, {\n ...condition,\n property: v,\n operator: \"eq\",\n value: \"\",\n });\n }}\n >\n <SelectTrigger className=\"pz:w-28\" aria-invalid={!!propertyError}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {/* A json field's value cannot be compared — only its\n status is a condition target, so `value` is not\n offered at all. */}\n {!isStatusOnlyField(selectedField?.type) && (\n <SelectItem value=\"value\">value</SelectItem>\n )}\n <SelectItem value=\"status\">status</SelectItem>\n </SelectContent>\n </Select>\n </>\n )}\n\n <Select\n value={condition.operator}\n onValueChange={(v) =>\n onUpdate(index, {\n ...condition,\n operator: v as ConditionOperators,\n })\n }\n >\n <SelectTrigger className=\"pz:w-28\" aria-invalid={!!operatorError}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {availableOperators.map((op) => (\n <SelectItem key={op.value} value={op.value}>\n {op.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n\n {renderValueInput()}\n </>\n )}\n </div>\n {errorMessage && (\n <span\n className=\"pz:text-destructive pz:text-xs pz:font-medium pz:mt-1 pz:block\"\n role=\"alert\"\n >\n {errorMessage}\n </span>\n )}\n </div>\n {isLast && (\n <div className=\"pz:flex pz:items-center pz:gap-2\">\n <Button type=\"button\" variant=\"link\" size=\"xs\" onClick={onAddCondition}>\n <IconPlus />\n New rule\n </Button>\n </div>\n )}\n </div>\n );\n}\n\n/**\n * Presentational condition-block editor shared by the pipe run-if gate and by\n * effects that filter rows by a condition (e.g. `rows:remove@1`'s `where`).\n * Operates on a bare `{logic, conditions}` block via `value`/`onChange`; the\n * wrapping adapters own where that block lives in their payload.\n */\nexport function ConditionBlockEditor({\n value,\n onChange,\n fields,\n form,\n conditionsPath,\n fieldNameMode = \"select\",\n fieldNamePlaceholder,\n fieldNameSuggestions,\n properties,\n inputFields,\n searchSecrets,\n searchConstants,\n}: {\n value: ConditionBlockValue | null;\n onChange: (value: ConditionBlockValue | null) => void;\n fields: MetaField[];\n form: FormHandle;\n // Field-error path of the conditions array (e.g. `run_if.when.conditions` or\n // `config.where.conditions`).\n conditionsPath: string;\n // \"text\" renders field_name as a free-form column name (the condition\n // targets a sheet whose columns are unknown at config time).\n fieldNameMode?: \"select\" | \"text\";\n fieldNamePlaceholder?: string;\n // Fetched target-sheet column suggestions (text mode only) — when non-empty\n // the free-text field name upgrades to a suggest combobox.\n fieldNameSuggestions?: StoreOption[];\n // Which condition properties are offered; defaults to value + status.\n properties?: (\"value\" | \"status\")[];\n // When present, string values render a LiquidEditor with the `/` picker.\n inputFields?: PipesFieldDefinitionWithName[];\n searchSecrets?: (query: string) => Promise<SecretSuggestion[]>;\n searchConstants?: (query: string) => Promise<ConstantSuggestion[]>;\n}) {\n // Built once and reused across every condition row, instead of each row\n // scanning `fields` linearly. With N rows and M fields this turns O(N·M)\n // lookups into O(N+M). A field is eligible when it supports at least one\n // offered property: value operators exist for its type, or the status\n // property is offered and the field is status-capable (json fields).\n const statusOffered = (properties ?? [\"value\", \"status\"]).includes(\"status\");\n const eligibleFields = useMemo(\n () =>\n fields.filter(\n (f) => OPERATORS_BY_TYPE[f.type].length > 0 || (statusOffered && isStatusOnlyField(f.type)),\n ),\n [fields, statusOffered],\n );\n const fieldsByName = useMemo(() => new Map(fields.map((f) => [f.fieldName, f])), [fields]);\n\n const addBlock = useCallback(() => {\n onChange({ logic: \"and\", conditions: [{ ...EMPTY_CONDITION }] });\n }, [onChange]);\n\n const updateCondition = (index: number, condition: Condition) => {\n if (!value) return;\n const newConditions = [...value.conditions];\n newConditions[index] = condition;\n onChange({ ...value, conditions: newConditions });\n };\n\n const removeCondition = (index: number) => {\n if (!value) return;\n if (value.conditions.length <= 1) {\n onChange(null);\n return;\n }\n onChange({ ...value, conditions: value.conditions.filter((_, i) => i !== index) });\n };\n\n const addCondition = () => {\n if (!value) return;\n onChange({ ...value, conditions: [...value.conditions, { ...EMPTY_CONDITION }] });\n };\n\n const changeLogic = (logic: \"and\" | \"or\") => {\n if (!value) return;\n onChange({ ...value, logic });\n };\n\n return (\n <div data-p0=\"input\">\n {!value ? (\n <div className=\"pz:flex pz:items-center\">\n <Button type=\"button\" variant=\"link\" size=\"xs\" className=\"pz:px-0\" onClick={addBlock}>\n <IconPlus />\n New rule\n </Button>\n </div>\n ) : (\n <div className=\"pz:flex pz:flex-col pz:gap-8\">\n {value.conditions.map((condition, idx) => (\n <ConditionRow\n key={idx}\n condition={condition}\n index={idx}\n eligibleFields={eligibleFields}\n fieldsByName={fieldsByName}\n isFirst={idx === 0}\n isLast={idx === value.conditions.length - 1}\n logic={value.logic}\n form={form}\n conditionsPath={conditionsPath}\n fieldNameMode={fieldNameMode}\n fieldNamePlaceholder={fieldNamePlaceholder}\n fieldNameSuggestions={fieldNameSuggestions}\n showStatusProperty={(properties ?? [\"value\", \"status\"]).includes(\"status\")}\n inputFields={inputFields}\n searchSecrets={searchSecrets}\n searchConstants={searchConstants}\n onUpdate={updateCondition}\n onRemove={removeCondition}\n onAddCondition={addCondition}\n onLogicChange={changeLogic}\n />\n ))}\n {fieldNameMode === \"text\" && inputFields && (\n <FieldLegend entries={[{ key: \"/\", label: \"to insert a reference\" }]} />\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport function PipesRunIfInputAdapter(field: FieldHandle<\"pipes_run_if_input\">) {\n const pipeRunIf = field.value as PipeRunIf | null;\n const meta = field.meta as PipesRunIfMeta;\n\n return (\n <ConditionBlockEditor\n value={(pipeRunIf?.when as ConditionBlockValue | undefined) ?? null}\n onChange={(block) => field.setValue(block ? { action: \"run\", when: block } : null)}\n fields={meta.fields}\n form={field.form}\n conditionsPath={`${field.path}.when.conditions`}\n />\n );\n}\n\nexport function ConditionBlockInputAdapter(field: FieldHandle<\"condition_block_input\">) {\n const block = field.value as ConditionBlockValue | null;\n const meta = field.meta as ConditionBlockMeta;\n\n return (\n <ConditionBlockEditor\n value={block}\n onChange={(next) => field.setValue(next)}\n fields={meta.fields}\n form={field.form}\n conditionsPath={`${field.path}.conditions`}\n fieldNameMode={meta.fieldNameMode}\n fieldNamePlaceholder={meta.fieldNamePlaceholder}\n fieldNameSuggestions={meta.options}\n properties={meta.properties}\n inputFields={meta.inputFields}\n searchSecrets={field.searchSecrets}\n searchConstants={field.searchConstants}\n />\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"card-primitives.d.mts","names":[],"sources":["../../../../src/components/defaults/catalog/card-primitives.tsx"],"mappings":";;;;;;;UAYiB,gBAAA,SAAyB,cAAA;EACxC,OAAA,IAAW,CAAA,EAAG,UAAA,CAAW,cAAA;AAAA;;AAD3B;;;;;;;;iBAagB,WAAA,CAAA;EAAc,SAAA;EAAW,OAAA;EAAS,QAAA;EAAA,GAAa;AAAA,GAAQ,gBAAA,GAAgB,oBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,KA+B3E,sBAAA;AAAA,UAEK,sBAAA,SACP,SAAA,CAAU,cAAA,QAAsB,sBAAA;AAAA,iBAE1B,iBAAA,CAAA;EAAoB,MAAA;EAAQ,SAAA;EAAA,GAAc;AAAA,GAAS,sBAAA,GAAsB,OAAA,CAAA,YAAA,mBAAA,OAAA,CAAA,qBAAA;AAAA,UAoBxE,qBAAA;EACf,KAAA;AAAA;AAAA,UAGe,qBAAA,SACP,SAAA,CAAU,cAAA,OAAqB,qBAAA;AAAA,iBAEzB,gBAAA,CAAA;
|
|
1
|
+
{"version":3,"file":"card-primitives.d.mts","names":[],"sources":["../../../../src/components/defaults/catalog/card-primitives.tsx"],"mappings":";;;;;;;UAYiB,gBAAA,SAAyB,cAAA;EACxC,OAAA,IAAW,CAAA,EAAG,UAAA,CAAW,cAAA;AAAA;;AAD3B;;;;;;;;iBAagB,WAAA,CAAA;EAAc,SAAA;EAAW,OAAA;EAAS,QAAA;EAAA,GAAa;AAAA,GAAQ,gBAAA,GAAgB,oBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,KA+B3E,sBAAA;AAAA,UAEK,sBAAA,SACP,SAAA,CAAU,cAAA,QAAsB,sBAAA;AAAA,iBAE1B,iBAAA,CAAA;EAAoB,MAAA;EAAQ,SAAA;EAAA,GAAc;AAAA,GAAS,sBAAA,GAAsB,OAAA,CAAA,YAAA,mBAAA,OAAA,CAAA,qBAAA;AAAA,UAoBxE,qBAAA;EACf,KAAA;AAAA;AAAA,UAGe,qBAAA,SACP,SAAA,CAAU,cAAA,OAAqB,qBAAA;AAAA,iBAEzB,gBAAA,CAAA;EAAmB,QAAA;EAAU,MAAA;EAAQ,SAAA;EAAA,GAAc;AAAA,GAAS,qBAAA,GAAqB,OAAA,CAAA,YAAA,mBAAA,OAAA,CAAA,qBAAA;AAAA,UA2BhF,2BAAA;EACf,WAAA;AAAA;AAAA,UAGe,2BAAA,SACP,SAAA,CAAU,cAAA,MAAoB,2BAAA;AAAA,iBAExB,sBAAA,CAAA;EACd,QAAA;EACA,MAAA;EACA,SAAA;EAAA,GACG;AAAA,GACF,2BAAA,GAA2B,OAAA,CAAA,YAAA,mBAAA,OAAA,CAAA,qBAAA;AAAA,UA2Bb,sBAAA,SAA+B,cAAA;AAAA,iBAEhC,iBAAA,CAAA;EAAoB,SAAA;EAAW,QAAA;EAAA,GAAa;AAAA,GAAQ,sBAAA,GAAsB,oBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,UAoBzE,qBAAA,SAA8B,IAAA,CAAK,cAAA,QAAsB,MAAA;EACxE,IAAA;AAAA;AAAA,iBAGc,gBAAA,CAAA;EACd,SAAA;EACA,OAAA;EACA,IAAA;EACA,OAAA;EAAA,GACG;AAAA,GACF,qBAAA,GAAqB,oBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"card-primitives.mjs","names":[],"sources":["../../../../src/components/defaults/catalog/card-primitives.tsx"],"sourcesContent":["import { mergeProps } from \"@base-ui/react/merge-props\";\nimport { useRender } from \"@base-ui/react/use-render\";\nimport { Children, type ComponentProps, type MouseEvent } from \"react\";\nimport { useAnyCatalogCardOptional } from \"../../../context/catalog-card-context.js\";\nimport { useCatalogConfig } from \"../../../context/catalog-config-context.js\";\nimport { cn } from \"../../../lib/utils.js\";\nimport { Button } from \"../../ui/button.js\";\n\n/* -------------------------------------------------------------------------- */\n/* Card root */\n/* -------------------------------------------------------------------------- */\n\nexport interface CatalogCardProps extends ComponentProps<\"div\"> {\n onClick?: (e: MouseEvent<HTMLDivElement>) => void;\n}\n\n/**\n * Bare flat card container. Defaults are structural only (flex column) so\n * consumers can override paddings/colors/borders via `classNames.card` or\n * `className` without fighting the cascade.\n *\n * Most consumers use `<PipeCatalogCard>` / `<SearchCatalogCard>` /\n * `<SearchesCatalogCard>` instead, which provides the card context for\n * self-binding child primitives.\n */\nexport function CatalogCard({ className, onClick, children, ...rest }: CatalogCardProps) {\n const { classNames } = useCatalogConfig();\n const interactive = !!onClick;\n return (\n <div\n data-p0=\"catalog-card\"\n role={interactive ? \"button\" : undefined}\n tabIndex={interactive ? 0 : undefined}\n onClick={onClick}\n onKeyDown={\n interactive\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onClick?.(e as unknown as MouseEvent<HTMLDivElement>);\n }\n }\n : undefined\n }\n className={cn(\"pz:flex pz:flex-col\", classNames?.card, className)}\n {...rest}\n >\n {children}\n </div>\n );\n}\n\n/* -------------------------------------------------------------------------- */\n/* Card header */\n/* -------------------------------------------------------------------------- */\n\nexport type CatalogCardHeaderState = {};\n\nexport interface CatalogCardHeaderProps\n extends useRender.ComponentProps<\"div\", CatalogCardHeaderState> {}\n\nexport function CatalogCardHeader({ render, className, ...props }: CatalogCardHeaderProps) {\n const { classNames } = useCatalogConfig();\n return useRender({\n defaultTagName: \"div\",\n render,\n state: {} as CatalogCardHeaderState,\n props: mergeProps<\"div\">(\n {\n className: cn(\"pz:flex pz:items-start pz:gap-2\", classNames?.cardHeader, className),\n ...({ \"data-p0\": \"catalog-card-header\" } as Record<string, string>),\n },\n props,\n ),\n });\n}\n\n/* -------------------------------------------------------------------------- */\n/* Card title — self-binds to card.label */\n/* -------------------------------------------------------------------------- */\n\nexport interface CatalogCardTitleState {\n label: string;\n}\n\nexport interface CatalogCardTitleProps\n extends useRender.ComponentProps<\"h3\", CatalogCardTitleState> {}\n\nexport function CatalogCardTitle({
|
|
1
|
+
{"version":3,"file":"card-primitives.mjs","names":[],"sources":["../../../../src/components/defaults/catalog/card-primitives.tsx"],"sourcesContent":["import { mergeProps } from \"@base-ui/react/merge-props\";\nimport { useRender } from \"@base-ui/react/use-render\";\nimport { Children, type ComponentProps, type MouseEvent } from \"react\";\nimport { useAnyCatalogCardOptional } from \"../../../context/catalog-card-context.js\";\nimport { useCatalogConfig } from \"../../../context/catalog-config-context.js\";\nimport { cn } from \"../../../lib/utils.js\";\nimport { Button } from \"../../ui/button.js\";\n\n/* -------------------------------------------------------------------------- */\n/* Card root */\n/* -------------------------------------------------------------------------- */\n\nexport interface CatalogCardProps extends ComponentProps<\"div\"> {\n onClick?: (e: MouseEvent<HTMLDivElement>) => void;\n}\n\n/**\n * Bare flat card container. Defaults are structural only (flex column) so\n * consumers can override paddings/colors/borders via `classNames.card` or\n * `className` without fighting the cascade.\n *\n * Most consumers use `<PipeCatalogCard>` / `<SearchCatalogCard>` /\n * `<SearchesCatalogCard>` instead, which provides the card context for\n * self-binding child primitives.\n */\nexport function CatalogCard({ className, onClick, children, ...rest }: CatalogCardProps) {\n const { classNames } = useCatalogConfig();\n const interactive = !!onClick;\n return (\n <div\n data-p0=\"catalog-card\"\n role={interactive ? \"button\" : undefined}\n tabIndex={interactive ? 0 : undefined}\n onClick={onClick}\n onKeyDown={\n interactive\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onClick?.(e as unknown as MouseEvent<HTMLDivElement>);\n }\n }\n : undefined\n }\n className={cn(\"pz:flex pz:flex-col\", classNames?.card, className)}\n {...rest}\n >\n {children}\n </div>\n );\n}\n\n/* -------------------------------------------------------------------------- */\n/* Card header */\n/* -------------------------------------------------------------------------- */\n\nexport type CatalogCardHeaderState = {};\n\nexport interface CatalogCardHeaderProps\n extends useRender.ComponentProps<\"div\", CatalogCardHeaderState> {}\n\nexport function CatalogCardHeader({ render, className, ...props }: CatalogCardHeaderProps) {\n const { classNames } = useCatalogConfig();\n return useRender({\n defaultTagName: \"div\",\n render,\n state: {} as CatalogCardHeaderState,\n props: mergeProps<\"div\">(\n {\n className: cn(\"pz:flex pz:items-start pz:gap-2\", classNames?.cardHeader, className),\n ...({ \"data-p0\": \"catalog-card-header\" } as Record<string, string>),\n },\n props,\n ),\n });\n}\n\n/* -------------------------------------------------------------------------- */\n/* Card title — self-binds to card.label */\n/* -------------------------------------------------------------------------- */\n\nexport interface CatalogCardTitleState {\n label: string;\n}\n\nexport interface CatalogCardTitleProps\n extends useRender.ComponentProps<\"h3\", CatalogCardTitleState> {}\n\nexport function CatalogCardTitle({ children, render, className, ...props }: CatalogCardTitleProps) {\n const { classNames } = useCatalogConfig();\n const card = useAnyCatalogCardOptional()?.card;\n const label = (card?.label ?? \"\") as string;\n return useRender({\n defaultTagName: \"h3\",\n render,\n state: { label },\n props: mergeProps<\"h3\">(\n {\n className: cn(\n \"pz:text-sm pz:font-semibold pz:leading-tight pz:m-0 pz:line-clamp-2 pz:flex-1\",\n classNames?.cardLabel,\n className,\n ),\n children: children ?? label,\n ...({ \"data-p0\": \"catalog-card-title\" } as Record<string, string>),\n },\n props,\n ),\n });\n}\n\n/* -------------------------------------------------------------------------- */\n/* Card description — self-binds to card.description */\n/* -------------------------------------------------------------------------- */\n\nexport interface CatalogCardDescriptionState {\n description: string;\n}\n\nexport interface CatalogCardDescriptionProps\n extends useRender.ComponentProps<\"p\", CatalogCardDescriptionState> {}\n\nexport function CatalogCardDescription({\n children,\n render,\n className,\n ...props\n}: CatalogCardDescriptionProps) {\n const { classNames } = useCatalogConfig();\n const card = useAnyCatalogCardOptional()?.card;\n const description = (card?.description ?? \"\") as string;\n return useRender({\n defaultTagName: \"p\",\n render,\n state: { description },\n props: mergeProps<\"p\">(\n {\n className: cn(\n \"pz:text-xs pz:text-muted-foreground pz:m-0 pz:line-clamp-2\",\n classNames?.cardDescription,\n className,\n ),\n children: children ?? description,\n ...({ \"data-p0\": \"catalog-card-description\" } as Record<string, string>),\n },\n props,\n ),\n });\n}\n\n/* -------------------------------------------------------------------------- */\n/* Card badges row + single badge button */\n/* -------------------------------------------------------------------------- */\n\nexport interface CatalogCardBadgesProps extends ComponentProps<\"div\"> {}\n\nexport function CatalogCardBadges({ className, children, ...rest }: CatalogCardBadgesProps) {\n const { classNames } = useCatalogConfig();\n const visible = Children.toArray(children);\n if (visible.length === 0) return null;\n return (\n <div\n data-p0=\"catalog-card-badges\"\n className={cn(\n \"pz:flex pz:flex-wrap pz:gap-1.5 pz:items-center\",\n classNames?.cardBadges,\n className,\n )}\n onClick={(e) => e.stopPropagation()}\n {...rest}\n >\n {visible}\n </div>\n );\n}\n\nexport interface CatalogCardBadgeProps extends Omit<ComponentProps<typeof Button>, \"size\"> {\n size?: \"xs\" | \"sm\";\n}\n\nexport function CatalogCardBadge({\n className,\n variant = \"outline\",\n size = \"xs\",\n onClick,\n ...rest\n}: CatalogCardBadgeProps) {\n const { classNames } = useCatalogConfig();\n return (\n <Button\n data-p0=\"catalog-card-badge\"\n variant={variant}\n size={size}\n className={cn(classNames?.badge, className)}\n onClick={(e) => {\n e.stopPropagation();\n onClick?.(e);\n }}\n {...rest}\n />\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAyBA,SAAgB,YAAY,EAAE,WAAW,SAAS,UAAU,GAAG,QAA0B;CACvF,MAAM,EAAE,eAAe,kBAAkB;CACzC,MAAM,cAAc,CAAC,CAAC;AACtB,QACE,oBAAC,OAAD;EACE,WAAQ;EACR,MAAM,cAAc,WAAW;EAC/B,UAAU,cAAc,IAAI;EACnB;EACT,WACE,eACK,MAAM;AACL,OAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,MAAE,gBAAgB;AAClB,cAAU,EAA2C;;MAGzD;EAEN,WAAW,GAAG,uBAAuB,YAAY,MAAM,UAAU;EACjE,GAAI;EAEH;EACG;;AAaV,SAAgB,kBAAkB,EAAE,QAAQ,WAAW,GAAG,SAAiC;CACzF,MAAM,EAAE,eAAe,kBAAkB;AACzC,QAAO,UAAU;EACf,gBAAgB;EAChB;EACA,OAAO,EAAE;EACT,OAAO,WACL;GACE,WAAW,GAAG,mCAAmC,YAAY,YAAY,UAAU;GAC7E,WAAW;GAClB,EACD,MACD;EACF,CAAC;;AAcJ,SAAgB,iBAAiB,EAAE,UAAU,QAAQ,WAAW,GAAG,SAAgC;CACjG,MAAM,EAAE,eAAe,kBAAkB;CAEzC,MAAM,SADO,2BAA2B,EAAE,OACrB,SAAS;AAC9B,QAAO,UAAU;EACf,gBAAgB;EAChB;EACA,OAAO,EAAE,OAAO;EAChB,OAAO,WACL;GACE,WAAW,GACT,iFACA,YAAY,WACZ,UACD;GACD,UAAU,YAAY;GAChB,WAAW;GAClB,EACD,MACD;EACF,CAAC;;AAcJ,SAAgB,uBAAuB,EACrC,UACA,QACA,WACA,GAAG,SAC2B;CAC9B,MAAM,EAAE,eAAe,kBAAkB;CAEzC,MAAM,eADO,2BAA2B,EAAE,OACf,eAAe;AAC1C,QAAO,UAAU;EACf,gBAAgB;EAChB;EACA,OAAO,EAAE,aAAa;EACtB,OAAO,WACL;GACE,WAAW,GACT,8DACA,YAAY,iBACZ,UACD;GACD,UAAU,YAAY;GAChB,WAAW;GAClB,EACD,MACD;EACF,CAAC;;AASJ,SAAgB,kBAAkB,EAAE,WAAW,UAAU,GAAG,QAAgC;CAC1F,MAAM,EAAE,eAAe,kBAAkB;CACzC,MAAM,UAAU,SAAS,QAAQ,SAAS;AAC1C,KAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,QACE,oBAAC,OAAD;EACE,WAAQ;EACR,WAAW,GACT,mDACA,YAAY,YACZ,UACD;EACD,UAAU,MAAM,EAAE,iBAAiB;EACnC,GAAI;YAEH;EACG;;AAQV,SAAgB,iBAAiB,EAC/B,WACA,UAAU,WACV,OAAO,MACP,SACA,GAAG,QACqB;CACxB,MAAM,EAAE,eAAe,kBAAkB;AACzC,QACE,oBAAC,QAAD;EACE,WAAQ;EACC;EACH;EACN,WAAW,GAAG,YAAY,OAAO,UAAU;EAC3C,UAAU,MAAM;AACd,KAAE,iBAAiB;AACnB,aAAU,EAAE;;EAEd,GAAI;EACJ"}
|