From c66acc8671312e3ff919f3f2ed4995f6fd27f086 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 26 May 2026 02:51:27 +0000 Subject: [PATCH 1/4] fix: remove nested ternary lint errors in badge renderers Agent-Logs-Url: https://github.com/tailor-platform/app-shell/sessions/39e6cbe3-aed8-4324-b389-3e9b483b1488 Co-authored-by: IzumiSy <982850+IzumiSy@users.noreply.github.com> --- .../core/src/components/data-table/cell-renderers.tsx | 7 ++++++- .../components/description-card/field-renderers.tsx | 11 ++++++----- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/packages/core/src/components/data-table/cell-renderers.tsx b/packages/core/src/components/data-table/cell-renderers.tsx index 38a923b7..27077d26 100644 --- a/packages/core/src/components/data-table/cell-renderers.tsx +++ b/packages/core/src/components/data-table/cell-renderers.tsx @@ -132,7 +132,12 @@ function renderDate(value: unknown, options: DateCellOptions | undefined): React } function renderBadge(value: unknown, options: BadgeCellOptions | undefined): ReactNode { - const items = Array.isArray(value) ? value : value != null ? [value] : []; + let items: unknown[] = []; + if (Array.isArray(value)) { + items = value; + } else if (value != null) { + items = [value]; + } const nonEmpty = items.filter((v) => v != null && v !== ""); if (nonEmpty.length === 0) return PLACEHOLDER; return ; diff --git a/packages/core/src/components/description-card/field-renderers.tsx b/packages/core/src/components/description-card/field-renderers.tsx index 84a9bdee..f6853d14 100644 --- a/packages/core/src/components/description-card/field-renderers.tsx +++ b/packages/core/src/components/description-card/field-renderers.tsx @@ -336,11 +336,12 @@ function TextFieldRenderer({ field }: { field: ResolvedField }) { * Render a badge field */ function BadgeFieldRenderer({ field }: { field: ResolvedField }) { - const values = Array.isArray(field.value) - ? (field.value as unknown[]) - : field.value != null - ? [field.value] - : []; + let values: unknown[] = []; + if (Array.isArray(field.value)) { + values = field.value as unknown[]; + } else if (field.value != null) { + values = [field.value]; + } if (values.every((v) => isEmpty(v))) { return {EMPTY_DASH}; From e5018b068d3cbd7bbaee9ac5e80b8f7f35076ff7 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 26 May 2026 02:56:07 +0000 Subject: [PATCH 2/4] refactor: extract badge value array helpers Agent-Logs-Url: https://github.com/tailor-platform/app-shell/sessions/58d57f76-d092-450b-aa21-d0e80b8e3945 Co-authored-by: IzumiSy <982850+IzumiSy@users.noreply.github.com> --- .../src/components/data-table/cell-renderers.tsx | 13 +++++++------ .../components/description-card/field-renderers.tsx | 13 +++++++------ 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/packages/core/src/components/data-table/cell-renderers.tsx b/packages/core/src/components/data-table/cell-renderers.tsx index 27077d26..abac04f3 100644 --- a/packages/core/src/components/data-table/cell-renderers.tsx +++ b/packages/core/src/components/data-table/cell-renderers.tsx @@ -61,6 +61,12 @@ function toDate(value: unknown): Date | null { return null; } +function toValueArray(value: unknown): unknown[] { + if (Array.isArray(value)) return value; + if (value != null) return [value]; + return []; +} + function renderText(value: unknown): ReactNode { switch (true) { case isEmpty(value): @@ -132,12 +138,7 @@ function renderDate(value: unknown, options: DateCellOptions | undefined): React } function renderBadge(value: unknown, options: BadgeCellOptions | undefined): ReactNode { - let items: unknown[] = []; - if (Array.isArray(value)) { - items = value; - } else if (value != null) { - items = [value]; - } + const items = toValueArray(value); const nonEmpty = items.filter((v) => v != null && v !== ""); if (nonEmpty.length === 0) return PLACEHOLDER; return ; diff --git a/packages/core/src/components/description-card/field-renderers.tsx b/packages/core/src/components/description-card/field-renderers.tsx index f6853d14..f0c9c8e8 100644 --- a/packages/core/src/components/description-card/field-renderers.tsx +++ b/packages/core/src/components/description-card/field-renderers.tsx @@ -206,6 +206,12 @@ function formatAddress(value: unknown): string[] { return [String(value)]; } +function toValueArray(value: unknown): unknown[] { + if (Array.isArray(value)) return value; + if (value != null) return [value]; + return []; +} + // ============================================================================ // COPY BUTTON // ============================================================================ @@ -336,12 +342,7 @@ function TextFieldRenderer({ field }: { field: ResolvedField }) { * Render a badge field */ function BadgeFieldRenderer({ field }: { field: ResolvedField }) { - let values: unknown[] = []; - if (Array.isArray(field.value)) { - values = field.value as unknown[]; - } else if (field.value != null) { - values = [field.value]; - } + const values = toValueArray(field.value); if (values.every((v) => isEmpty(v))) { return {EMPTY_DASH}; From 812a8728f137930acf1b68f7e097b9c708980297 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 26 May 2026 03:09:47 +0000 Subject: [PATCH 3/4] refactor: share badge value normalization helper Agent-Logs-Url: https://github.com/tailor-platform/app-shell/sessions/147602b9-ba2c-4aa1-aed6-71a4315bebd5 Co-authored-by: IzumiSy <982850+IzumiSy@users.noreply.github.com> --- packages/core/src/components/badge-list.tsx | 8 +++++++- .../core/src/components/data-table/cell-renderers.tsx | 8 +------- .../src/components/description-card/field-renderers.tsx | 9 +-------- 3 files changed, 9 insertions(+), 16 deletions(-) diff --git a/packages/core/src/components/badge-list.tsx b/packages/core/src/components/badge-list.tsx index e9e0df53..4ab7c22b 100644 --- a/packages/core/src/components/badge-list.tsx +++ b/packages/core/src/components/badge-list.tsx @@ -61,6 +61,12 @@ export function resolveBadgeLabel( return options?.badgeLabelMap?.[value]; } +export function toValueArray(value: unknown): unknown[] { + if (Array.isArray(value)) return value; + if (value != null) return [value]; + return []; +} + // ============================================================================ // BADGE LIST COMPONENT // ============================================================================ @@ -95,7 +101,7 @@ export function BadgeList({ resolveLabel: resolveLabelProp, badgeClassName, }: BadgeListProps): React.ReactNode { - const values = Array.isArray(value) ? value : [value]; + const values = toValueArray(value); const nonEmpty = values.filter((v) => v != null && v !== ""); if (nonEmpty.length === 0) return null; diff --git a/packages/core/src/components/data-table/cell-renderers.tsx b/packages/core/src/components/data-table/cell-renderers.tsx index abac04f3..83596e88 100644 --- a/packages/core/src/components/data-table/cell-renderers.tsx +++ b/packages/core/src/components/data-table/cell-renderers.tsx @@ -1,6 +1,6 @@ import type { ReactNode } from "react"; import { Link } from "react-router"; -import { BadgeList } from "@/components/badge-list"; +import { BadgeList, toValueArray } from "@/components/badge-list"; import type { BadgeCellOptions, Column, @@ -61,12 +61,6 @@ function toDate(value: unknown): Date | null { return null; } -function toValueArray(value: unknown): unknown[] { - if (Array.isArray(value)) return value; - if (value != null) return [value]; - return []; -} - function renderText(value: unknown): ReactNode { switch (true) { case isEmpty(value): diff --git a/packages/core/src/components/description-card/field-renderers.tsx b/packages/core/src/components/description-card/field-renderers.tsx index f0c9c8e8..413b1ad4 100644 --- a/packages/core/src/components/description-card/field-renderers.tsx +++ b/packages/core/src/components/description-card/field-renderers.tsx @@ -2,11 +2,10 @@ import * as React from "react"; import { Link } from "react-router"; -import { BadgeList } from "../badge-list"; +import { BadgeList, resolveBadgeLabel, toValueArray } from "../badge-list"; import { Tooltip } from "../tooltip"; import { Copy, Check, ExternalLink } from "lucide-react"; import type { ResolvedField, DateFormat } from "./types"; -import { resolveBadgeLabel } from "../badge-list"; import { useDescriptionCardT } from "./i18n"; // ============================================================================ @@ -206,12 +205,6 @@ function formatAddress(value: unknown): string[] { return [String(value)]; } -function toValueArray(value: unknown): unknown[] { - if (Array.isArray(value)) return value; - if (value != null) return [value]; - return []; -} - // ============================================================================ // COPY BUTTON // ============================================================================ From d699326b77ba19217df762dc96a75af5a8c9f107 Mon Sep 17 00:00:00 2001 From: IzumiSy Date: Tue, 26 May 2026 12:22:25 +0900 Subject: [PATCH 4/4] Add doc comment to toValueArray function --- packages/core/src/components/badge-list.tsx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/core/src/components/badge-list.tsx b/packages/core/src/components/badge-list.tsx index 4ab7c22b..4df72fd4 100644 --- a/packages/core/src/components/badge-list.tsx +++ b/packages/core/src/components/badge-list.tsx @@ -61,6 +61,11 @@ export function resolveBadgeLabel( return options?.badgeLabelMap?.[value]; } +/** + * Normalize a value into an array. If the value is already an array, return it + * as-is. If it is a non-null single value, wrap it in an array. Otherwise + * return an empty array. + */ export function toValueArray(value: unknown): unknown[] { if (Array.isArray(value)) return value; if (value != null) return [value];