forked from baron/baron-sso
dev 병합 code-check 오류 수정
This commit is contained in:
@@ -561,10 +561,7 @@ function AppLayout() {
|
||||
</button>
|
||||
|
||||
{isProfileOpen ? (
|
||||
<div
|
||||
role="menu"
|
||||
className={shellLayoutClasses.profileMenu}
|
||||
>
|
||||
<div role="menu" className={shellLayoutClasses.profileMenu}>
|
||||
<p className="text-xs uppercase tracking-[0.16em] text-muted-foreground">
|
||||
{t("ui.dev.profile.menu_title", "Account")}
|
||||
</p>
|
||||
|
||||
@@ -5,13 +5,17 @@ import {
|
||||
} from "../../../../common/ui/badge";
|
||||
import { cn } from "../../lib/utils";
|
||||
|
||||
export interface BadgeProps
|
||||
extends React.HTMLAttributes<HTMLDivElement> {
|
||||
export interface BadgeProps extends React.HTMLAttributes<HTMLDivElement> {
|
||||
variant?: CommonBadgeVariant;
|
||||
}
|
||||
|
||||
function Badge({ className, variant, ...props }: BadgeProps) {
|
||||
return <div className={cn(getCommonBadgeClasses({ variant }), className)} {...props} />;
|
||||
return (
|
||||
<div
|
||||
className={cn(getCommonBadgeClasses({ variant }), className)}
|
||||
{...props}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
export { Badge };
|
||||
|
||||
@@ -10,39 +10,28 @@ import {
|
||||
import { cn } from "../../lib/utils";
|
||||
|
||||
function Card({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {
|
||||
return (
|
||||
<div
|
||||
className={cn(commonCardClass, className)}
|
||||
{...props}
|
||||
/>
|
||||
);
|
||||
return <div className={cn(commonCardClass, className)} {...props} />;
|
||||
}
|
||||
|
||||
function CardHeader({
|
||||
className,
|
||||
...props
|
||||
}: React.HTMLAttributes<HTMLDivElement>) {
|
||||
return (
|
||||
<div className={cn(commonCardHeaderClass, className)} {...props} />
|
||||
);
|
||||
return <div className={cn(commonCardHeaderClass, className)} {...props} />;
|
||||
}
|
||||
|
||||
function CardTitle({
|
||||
className,
|
||||
...props
|
||||
}: React.HTMLAttributes<HTMLHeadingElement>) {
|
||||
return (
|
||||
<h3 className={cn(commonCardTitleClass, className)} {...props} />
|
||||
);
|
||||
return <h3 className={cn(commonCardTitleClass, className)} {...props} />;
|
||||
}
|
||||
|
||||
function CardDescription({
|
||||
className,
|
||||
...props
|
||||
}: React.HTMLAttributes<HTMLParagraphElement>) {
|
||||
return (
|
||||
<p className={cn(commonCardDescriptionClass, className)} {...props} />
|
||||
);
|
||||
return <p className={cn(commonCardDescriptionClass, className)} {...props} />;
|
||||
}
|
||||
|
||||
function CardContent({
|
||||
@@ -56,9 +45,7 @@ function CardFooter({
|
||||
className,
|
||||
...props
|
||||
}: React.HTMLAttributes<HTMLDivElement>) {
|
||||
return (
|
||||
<div className={cn(commonCardFooterClass, className)} {...props} />
|
||||
);
|
||||
return <div className={cn(commonCardFooterClass, className)} {...props} />;
|
||||
}
|
||||
|
||||
export {
|
||||
|
||||
@@ -10,10 +10,7 @@ const Input = React.forwardRef<HTMLInputElement, InputProps>(
|
||||
return (
|
||||
<input
|
||||
type={type}
|
||||
className={cn(
|
||||
commonInputClass,
|
||||
className,
|
||||
)}
|
||||
className={cn(commonInputClass, className)}
|
||||
ref={ref}
|
||||
{...props}
|
||||
/>
|
||||
|
||||
@@ -368,7 +368,10 @@ function TenantListPage() {
|
||||
const importParentOptionGroups =
|
||||
buildTenantImportParentOptionGroups(allTenants);
|
||||
const tenantSortResolvers = React.useMemo<
|
||||
SortResolverMap<TenantSummary & { recursiveMemberCount: number }, TenantSortKey>
|
||||
SortResolverMap<
|
||||
TenantSummary & { recursiveMemberCount: number },
|
||||
TenantSortKey
|
||||
>
|
||||
>(
|
||||
() => ({
|
||||
recursiveMemberCount: (tenant) => tenant.recursiveMemberCount,
|
||||
|
||||
@@ -89,9 +89,8 @@ function UserListPage() {
|
||||
Record<string, boolean>
|
||||
>({});
|
||||
const [selectedUserIds, setSelectedUserIds] = React.useState<string[]>([]);
|
||||
const [sortConfig, setSortConfig] = React.useState<SortConfig<UserSortKey> | null>(
|
||||
null,
|
||||
);
|
||||
const [sortConfig, setSortConfig] =
|
||||
React.useState<SortConfig<UserSortKey> | null>(null);
|
||||
|
||||
const limit = 1000;
|
||||
const offset = (page - 1) * limit;
|
||||
@@ -224,20 +223,22 @@ function UserListPage() {
|
||||
: null;
|
||||
|
||||
const rawItems = query.data?.items ?? [];
|
||||
const userSortResolvers = React.useMemo<SortResolverMap<UserSummary, UserSortKey>>(
|
||||
const userSortResolvers = React.useMemo<
|
||||
SortResolverMap<UserSummary, UserSortKey>
|
||||
>(
|
||||
() =>
|
||||
userSchema.reduce<SortResolverMap<UserSummary, UserSortKey>>(
|
||||
(accumulator, field) => ({
|
||||
...accumulator,
|
||||
[field.key]: (user) => {
|
||||
(accumulator, field) => {
|
||||
accumulator[field.key] = (user) => {
|
||||
const value = user.metadata?.[field.key];
|
||||
return typeof value === "string" ||
|
||||
typeof value === "number" ||
|
||||
typeof value === "boolean"
|
||||
? value
|
||||
: null;
|
||||
},
|
||||
}),
|
||||
};
|
||||
return accumulator;
|
||||
},
|
||||
{
|
||||
name_email: (user) =>
|
||||
`${user.name ?? ""} ${user.email ?? ""} ${user.phone ?? ""}`,
|
||||
|
||||
@@ -26,8 +26,7 @@
|
||||
--input: 215 25% 24%;
|
||||
--ring: 209 79% 52%;
|
||||
--radius: 0.75rem;
|
||||
--app-background-image:
|
||||
radial-gradient(
|
||||
--app-background-image: radial-gradient(
|
||||
circle at 10% 18%,
|
||||
rgba(54, 211, 153, 0.16),
|
||||
transparent 28%
|
||||
|
||||
@@ -1,7 +1,4 @@
|
||||
import {
|
||||
type RouteObject,
|
||||
createBrowserRouter,
|
||||
} from "react-router-dom";
|
||||
import { type RouteObject, createBrowserRouter } from "react-router-dom";
|
||||
import AppLayout from "../components/layout/AppLayout";
|
||||
import AuditLogsPage from "../features/audit/AuditLogsPage";
|
||||
import AuthCallbackPage from "../features/auth/AuthCallbackPage";
|
||||
|
||||
@@ -436,10 +436,7 @@ function AppLayout() {
|
||||
/>
|
||||
</button>
|
||||
{isProfileMenuOpen ? (
|
||||
<div
|
||||
role="menu"
|
||||
className={shellLayoutClasses.profileMenu}
|
||||
>
|
||||
<div role="menu" className={shellLayoutClasses.profileMenu}>
|
||||
<p className="text-xs uppercase tracking-[0.16em] text-muted-foreground">
|
||||
{t("ui.dev.profile.menu_title", "Account")}
|
||||
</p>
|
||||
|
||||
@@ -5,13 +5,17 @@ import {
|
||||
} from "../../../../common/ui/badge";
|
||||
import { cn } from "../../lib/utils";
|
||||
|
||||
export interface BadgeProps
|
||||
extends React.HTMLAttributes<HTMLDivElement> {
|
||||
export interface BadgeProps extends React.HTMLAttributes<HTMLDivElement> {
|
||||
variant?: CommonBadgeVariant;
|
||||
}
|
||||
|
||||
function Badge({ className, variant, ...props }: BadgeProps) {
|
||||
return <div className={cn(getCommonBadgeClasses({ variant }), className)} {...props} />;
|
||||
return (
|
||||
<div
|
||||
className={cn(getCommonBadgeClasses({ variant }), className)}
|
||||
{...props}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
export { Badge };
|
||||
|
||||
@@ -10,39 +10,28 @@ import {
|
||||
import { cn } from "../../lib/utils";
|
||||
|
||||
function Card({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {
|
||||
return (
|
||||
<div
|
||||
className={cn(commonCardClass, className)}
|
||||
{...props}
|
||||
/>
|
||||
);
|
||||
return <div className={cn(commonCardClass, className)} {...props} />;
|
||||
}
|
||||
|
||||
function CardHeader({
|
||||
className,
|
||||
...props
|
||||
}: React.HTMLAttributes<HTMLDivElement>) {
|
||||
return (
|
||||
<div className={cn(commonCardHeaderClass, className)} {...props} />
|
||||
);
|
||||
return <div className={cn(commonCardHeaderClass, className)} {...props} />;
|
||||
}
|
||||
|
||||
function CardTitle({
|
||||
className,
|
||||
...props
|
||||
}: React.HTMLAttributes<HTMLHeadingElement>) {
|
||||
return (
|
||||
<h3 className={cn(commonCardTitleClass, className)} {...props} />
|
||||
);
|
||||
return <h3 className={cn(commonCardTitleClass, className)} {...props} />;
|
||||
}
|
||||
|
||||
function CardDescription({
|
||||
className,
|
||||
...props
|
||||
}: React.HTMLAttributes<HTMLParagraphElement>) {
|
||||
return (
|
||||
<p className={cn(commonCardDescriptionClass, className)} {...props} />
|
||||
);
|
||||
return <p className={cn(commonCardDescriptionClass, className)} {...props} />;
|
||||
}
|
||||
|
||||
function CardContent({
|
||||
@@ -56,9 +45,7 @@ function CardFooter({
|
||||
className,
|
||||
...props
|
||||
}: React.HTMLAttributes<HTMLDivElement>) {
|
||||
return (
|
||||
<div className={cn(commonCardFooterClass, className)} {...props} />
|
||||
);
|
||||
return <div className={cn(commonCardFooterClass, className)} {...props} />;
|
||||
}
|
||||
|
||||
export {
|
||||
|
||||
@@ -10,10 +10,7 @@ const Input = React.forwardRef<HTMLInputElement, InputProps>(
|
||||
return (
|
||||
<input
|
||||
type={type}
|
||||
className={cn(
|
||||
commonInputClass,
|
||||
className,
|
||||
)}
|
||||
className={cn(commonInputClass, className)}
|
||||
ref={ref}
|
||||
{...props}
|
||||
/>
|
||||
|
||||
@@ -129,7 +129,10 @@ function summarizeSeries(rows: RPUsageDailyMetric[]): SeriesSummary[] {
|
||||
} satisfies SeriesSummary);
|
||||
current.loginRequests += row.loginRequests;
|
||||
current.otherRequests += row.otherRequests;
|
||||
current.uniqueSubjects = Math.max(current.uniqueSubjects, row.uniqueSubjects);
|
||||
current.uniqueSubjects = Math.max(
|
||||
current.uniqueSubjects,
|
||||
row.uniqueSubjects,
|
||||
);
|
||||
bySeries.set(key, current);
|
||||
}
|
||||
return Array.from(bySeries.values())
|
||||
@@ -153,12 +156,10 @@ function buildMultiLineSeries(rows: RPUsageDailyMetric[]): MultiLineSeries[] {
|
||||
>();
|
||||
|
||||
for (const row of rows) {
|
||||
const current =
|
||||
byClient.get(row.clientId) ??
|
||||
{
|
||||
clientLabel: row.clientName || row.clientId,
|
||||
byDate: new Map<string, DailyPoint>(),
|
||||
};
|
||||
const current = byClient.get(row.clientId) ?? {
|
||||
clientLabel: row.clientName || row.clientId,
|
||||
byDate: new Map<string, DailyPoint>(),
|
||||
};
|
||||
const point =
|
||||
current.byDate.get(row.date) ??
|
||||
({
|
||||
@@ -173,7 +174,9 @@ function buildMultiLineSeries(rows: RPUsageDailyMetric[]): MultiLineSeries[] {
|
||||
}
|
||||
|
||||
return Array.from(byClient.entries())
|
||||
.sort((left, right) => left[1].clientLabel.localeCompare(right[1].clientLabel))
|
||||
.sort((left, right) =>
|
||||
left[1].clientLabel.localeCompare(right[1].clientLabel),
|
||||
)
|
||||
.map(([clientId, entry], index) => ({
|
||||
key: clientId,
|
||||
clientLabel: entry.clientLabel,
|
||||
@@ -307,10 +310,7 @@ function RPUsageMixedChart({
|
||||
if (daily.length === 0) {
|
||||
return (
|
||||
<div className="flex min-h-[210px] items-center justify-center text-sm text-muted-foreground">
|
||||
{t(
|
||||
"msg.dev.dashboard.chart.empty",
|
||||
"표시할 RP 이용 집계가 없습니다.",
|
||||
)}
|
||||
{t("msg.dev.dashboard.chart.empty", "표시할 RP 이용 집계가 없습니다.")}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -477,11 +477,15 @@ function RPUsageMixedChart({
|
||||
<div key={item.key} className="flex min-w-0 items-center gap-2">
|
||||
<span className="truncate font-medium">{item.clientLabel}</span>
|
||||
<span className="ml-auto whitespace-nowrap tabular-nums">
|
||||
{t("ui.dev.dashboard.chart.series", "로그인 {{login}} / 기타 {{other}} / 사용자 {{subjects}}", {
|
||||
login: item.loginRequests.toLocaleString(),
|
||||
other: item.otherRequests.toLocaleString(),
|
||||
subjects: item.uniqueSubjects.toLocaleString(),
|
||||
})}
|
||||
{t(
|
||||
"ui.dev.dashboard.chart.series",
|
||||
"로그인 {{login}} / 기타 {{other}} / 사용자 {{subjects}}",
|
||||
{
|
||||
login: item.loginRequests.toLocaleString(),
|
||||
other: item.otherRequests.toLocaleString(),
|
||||
subjects: item.uniqueSubjects.toLocaleString(),
|
||||
},
|
||||
)}
|
||||
</span>
|
||||
</div>
|
||||
))}
|
||||
@@ -582,9 +586,11 @@ function DashboardPage() {
|
||||
"msg.dev.dashboard.chart.unavailable_with_reason",
|
||||
"RP 이용 통계 API 응답을 확인할 수 없습니다. {{reason}}",
|
||||
{
|
||||
reason: usageErrorMessage || t("err.common.unknown", "알 수 없는 오류"),
|
||||
reason:
|
||||
usageErrorMessage ||
|
||||
t("err.common.unknown", "알 수 없는 오류"),
|
||||
},
|
||||
);
|
||||
);
|
||||
const isAllClientsSelected = selectedClientIds.length === 0;
|
||||
|
||||
const toggleClientSelection = (clientId: string) => {
|
||||
@@ -712,9 +718,7 @@ function DashboardPage() {
|
||||
</div>
|
||||
|
||||
{usageQuery.isError ? (
|
||||
<div className="text-sm text-muted-foreground">
|
||||
{usageErrorText}
|
||||
</div>
|
||||
<div className="text-sm text-muted-foreground">{usageErrorText}</div>
|
||||
) : isAllClientsSelected ? (
|
||||
<RPUsageMixedChart rows={filteredUsageRows} period={period} />
|
||||
) : (
|
||||
@@ -762,10 +766,7 @@ function DashboardPage() {
|
||||
</div>
|
||||
<div className="rounded-xl border border-border/60 bg-secondary/30 p-4">
|
||||
<p className="text-sm text-muted-foreground">
|
||||
{t(
|
||||
"ui.dev.dashboard.distribution.headless",
|
||||
"Headless Login",
|
||||
)}
|
||||
{t("ui.dev.dashboard.distribution.headless", "Headless Login")}
|
||||
</p>
|
||||
<p className="mt-2 text-2xl font-semibold tabular-nums">
|
||||
{distribution.headlessClients.toLocaleString()}
|
||||
@@ -817,10 +818,7 @@ function DashboardPage() {
|
||||
"Server side App (Headless Login)",
|
||||
)
|
||||
: client.type === "private"
|
||||
? t(
|
||||
"ui.dev.clients.type.private",
|
||||
"Server side App",
|
||||
)
|
||||
? t("ui.dev.clients.type.private", "Server side App")
|
||||
: t("ui.dev.clients.type.pkce", "PKCE")}
|
||||
</p>
|
||||
<p>
|
||||
|
||||
@@ -26,8 +26,7 @@
|
||||
--input: 215 25% 24%;
|
||||
--ring: 209 79% 52%;
|
||||
--radius: 0.75rem;
|
||||
--app-background-image:
|
||||
radial-gradient(
|
||||
--app-background-image: radial-gradient(
|
||||
circle at 10% 18%,
|
||||
rgba(54, 211, 153, 0.16),
|
||||
transparent 28%
|
||||
|
||||
@@ -421,10 +421,7 @@ function AppLayout() {
|
||||
/>
|
||||
</button>
|
||||
{isProfileMenuOpen ? (
|
||||
<div
|
||||
role="menu"
|
||||
className={shellLayoutClasses.profileMenu}
|
||||
>
|
||||
<div role="menu" className={shellLayoutClasses.profileMenu}>
|
||||
<p className="text-xs uppercase tracking-[0.16em] text-muted-foreground">
|
||||
{t("ui.dev.profile.menu_title", "Account")}
|
||||
</p>
|
||||
|
||||
@@ -5,13 +5,17 @@ import {
|
||||
} from "../../../../common/ui/badge";
|
||||
import { cn } from "../../lib/utils";
|
||||
|
||||
export interface BadgeProps
|
||||
extends React.HTMLAttributes<HTMLDivElement> {
|
||||
export interface BadgeProps extends React.HTMLAttributes<HTMLDivElement> {
|
||||
variant?: CommonBadgeVariant;
|
||||
}
|
||||
|
||||
function Badge({ className, variant, ...props }: BadgeProps) {
|
||||
return <div className={cn(getCommonBadgeClasses({ variant }), className)} {...props} />;
|
||||
return (
|
||||
<div
|
||||
className={cn(getCommonBadgeClasses({ variant }), className)}
|
||||
{...props}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
export { Badge };
|
||||
|
||||
@@ -10,39 +10,28 @@ import {
|
||||
import { cn } from "../../lib/utils";
|
||||
|
||||
function Card({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {
|
||||
return (
|
||||
<div
|
||||
className={cn(commonCardClass, className)}
|
||||
{...props}
|
||||
/>
|
||||
);
|
||||
return <div className={cn(commonCardClass, className)} {...props} />;
|
||||
}
|
||||
|
||||
function CardHeader({
|
||||
className,
|
||||
...props
|
||||
}: React.HTMLAttributes<HTMLDivElement>) {
|
||||
return (
|
||||
<div className={cn(commonCardHeaderClass, className)} {...props} />
|
||||
);
|
||||
return <div className={cn(commonCardHeaderClass, className)} {...props} />;
|
||||
}
|
||||
|
||||
function CardTitle({
|
||||
className,
|
||||
...props
|
||||
}: React.HTMLAttributes<HTMLHeadingElement>) {
|
||||
return (
|
||||
<h3 className={cn(commonCardTitleClass, className)} {...props} />
|
||||
);
|
||||
return <h3 className={cn(commonCardTitleClass, className)} {...props} />;
|
||||
}
|
||||
|
||||
function CardDescription({
|
||||
className,
|
||||
...props
|
||||
}: React.HTMLAttributes<HTMLParagraphElement>) {
|
||||
return (
|
||||
<p className={cn(commonCardDescriptionClass, className)} {...props} />
|
||||
);
|
||||
return <p className={cn(commonCardDescriptionClass, className)} {...props} />;
|
||||
}
|
||||
|
||||
function CardContent({
|
||||
@@ -56,9 +45,7 @@ function CardFooter({
|
||||
className,
|
||||
...props
|
||||
}: React.HTMLAttributes<HTMLDivElement>) {
|
||||
return (
|
||||
<div className={cn(commonCardFooterClass, className)} {...props} />
|
||||
);
|
||||
return <div className={cn(commonCardFooterClass, className)} {...props} />;
|
||||
}
|
||||
|
||||
export {
|
||||
|
||||
@@ -10,10 +10,7 @@ const Input = React.forwardRef<HTMLInputElement, InputProps>(
|
||||
return (
|
||||
<input
|
||||
type={type}
|
||||
className={cn(
|
||||
commonInputClass,
|
||||
className,
|
||||
)}
|
||||
className={cn(commonInputClass, className)}
|
||||
ref={ref}
|
||||
{...props}
|
||||
/>
|
||||
|
||||
Reference in New Issue
Block a user