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];