@withwiz/toolkit 0.2.0 → 0.2.2

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.
Files changed (95) hide show
  1. package/dist/auth/index.js +19 -19
  2. package/dist/chunk-7IY3RQQL.js +151 -0
  3. package/dist/chunk-GSUQE3SZ.js +225 -0
  4. package/dist/chunk-IPXPCBDO.js +127 -0
  5. package/dist/chunk-LJEGM4OO.js +136 -0
  6. package/dist/chunk-MAATEX2R.js +81 -0
  7. package/dist/chunk-NY5QXT33.js +31 -0
  8. package/dist/chunk-TH45RVP7.js +110 -0
  9. package/dist/components/ui/DataTable.d.ts +8 -103
  10. package/dist/components/ui/DataTable.js +17 -602
  11. package/dist/components/ui/data-table/DataTable.d.ts +2 -0
  12. package/dist/components/ui/data-table/DataTable.js +22 -0
  13. package/dist/components/ui/data-table/DataTableBody.d.ts +19 -0
  14. package/dist/components/ui/data-table/DataTableBody.js +10 -0
  15. package/dist/components/ui/data-table/DataTableBulkActions.d.ts +17 -0
  16. package/dist/components/ui/data-table/DataTableBulkActions.js +12 -0
  17. package/dist/components/ui/data-table/DataTableFilters.d.ts +15 -0
  18. package/dist/components/ui/data-table/DataTableFilters.js +13 -0
  19. package/dist/components/ui/data-table/DataTablePagination.d.ts +10 -0
  20. package/dist/components/ui/data-table/DataTablePagination.js +11 -0
  21. package/dist/components/ui/data-table/DataTableSearch.d.ts +24 -0
  22. package/dist/components/ui/data-table/DataTableSearch.js +12 -0
  23. package/dist/components/ui/data-table/index.d.ts +13 -0
  24. package/dist/components/ui/data-table/types.d.ts +115 -0
  25. package/dist/error/index.d.ts +0 -4
  26. package/dist/error/index.js +1 -69
  27. package/dist/geolocation/index.js +4 -4
  28. package/dist/geolocation/providers/index.js +4 -4
  29. package/dist/hooks/useDataTable.d.ts +45 -0
  30. package/dist/hooks/useDataTable.js +13 -11
  31. package/dist/utils/format-number.js +30 -4
  32. package/dist/utils/short-code-generator.js +36 -4
  33. package/dist/utils/url-normalizer.js +194 -10
  34. package/package.json +3 -2
  35. package/dist/chunk-5ATB5D6S.js +0 -40
  36. package/dist/chunk-6C7HQIX4.js +0 -13
  37. package/dist/chunk-7VJNLGAS.js +0 -110
  38. package/dist/chunk-7XFHGAJP.js +0 -0
  39. package/dist/chunk-A6EAAWMK.js +0 -50
  40. package/dist/chunk-COK4ZXNG.js +0 -0
  41. package/dist/chunk-EQYTE7WD.js +0 -139
  42. package/dist/chunk-FW3IEJ7H.js +0 -71
  43. package/dist/chunk-HGC4CCKB.js +0 -29
  44. package/dist/chunk-IAJNC34M.js +0 -102
  45. package/dist/chunk-JS5VI3OW.js +0 -143
  46. package/dist/chunk-MYLGYX4K.js +0 -57
  47. package/dist/chunk-TDZJ6SAI.js +0 -34
  48. package/dist/chunk-TEIYA7U4.js +0 -72
  49. package/dist/chunk-ULF5RDDX.js +0 -0
  50. package/dist/chunk-VWODEQ5C.js +0 -204
  51. package/dist/chunk-Y2TUZFCP.js +0 -0
  52. package/dist/chunk-YJ3TLEW3.js +0 -100
  53. package/dist/chunk-ZHVUK5OY.js +0 -314
  54. package/dist/chunk-ZZIKRBJU.js +0 -96
  55. package/dist/error/components/EmptyState.d.ts +0 -50
  56. package/dist/error/components/ErrorAlert.d.ts +0 -50
  57. package/dist/error/components/ErrorPage.d.ts +0 -39
  58. package/dist/error/components/LoadingState.d.ts +0 -37
  59. package/dist/error/components/index.d.ts +0 -13
  60. package/dist/error/components/index.js +0 -18
  61. package/dist/error/hooks/index.d.ts +0 -7
  62. package/dist/error/hooks/index.js +0 -14
  63. package/dist/error/hooks/useErrorHandler.d.ts +0 -67
  64. package/dist/error/hooks/useErrorHandler.js +0 -14
  65. package/dist/error/logging/error-logger.d.ts +0 -77
  66. package/dist/error/logging/error-logger.js +0 -10
  67. package/dist/error/logging/index.d.ts +0 -9
  68. package/dist/error/logging/index.js +0 -35
  69. package/dist/error/logging/transports/base.d.ts +0 -30
  70. package/dist/error/logging/transports/base.js +0 -7
  71. package/dist/error/logging/transports/console.d.ts +0 -40
  72. package/dist/error/logging/transports/console.js +0 -9
  73. package/dist/error/logging/transports/file.d.ts +0 -49
  74. package/dist/error/logging/transports/file.js +0 -8
  75. package/dist/error/logging/transports/index.d.ts +0 -12
  76. package/dist/error/logging/transports/index.js +0 -25
  77. package/dist/error/logging/transports/sentry.d.ts +0 -44
  78. package/dist/error/logging/transports/sentry.js +0 -9
  79. package/dist/error/logging/transports/slack.d.ts +0 -51
  80. package/dist/error/logging/transports/slack.js +0 -9
  81. package/dist/error/logging/types.d.ts +0 -83
  82. package/dist/error/logging/types.js +0 -7
  83. package/dist/error/recovery/circuit-breaker.d.ts +0 -85
  84. package/dist/error/recovery/circuit-breaker.js +0 -9
  85. package/dist/error/recovery/degradation.d.ts +0 -56
  86. package/dist/error/recovery/degradation.js +0 -7
  87. package/dist/error/recovery/fallback.d.ts +0 -55
  88. package/dist/error/recovery/fallback.js +0 -11
  89. package/dist/error/recovery/index.d.ts +0 -12
  90. package/dist/error/recovery/index.js +0 -26
  91. package/dist/error/recovery/retry.d.ts +0 -44
  92. package/dist/error/recovery/retry.js +0 -7
  93. package/dist/utils/shared-utils.d.ts +0 -25
  94. package/dist/utils/shared-utils.js +0 -43
  95. package/dist/{chunk-S73334QY.js → chunk-QF6FH4GZ.js} +3 -3
@@ -0,0 +1,81 @@
1
+ import {
2
+ formatLabel
3
+ } from "./chunk-NY5QXT33.js";
4
+ import {
5
+ LoadingBar
6
+ } from "./chunk-34WAGUT5.js";
7
+ import {
8
+ Button
9
+ } from "./chunk-L25BNU3E.js";
10
+
11
+ // src/components/ui/data-table/DataTableBulkActions.tsx
12
+ import { CheckSquare, Square, Loader2 } from "lucide-react";
13
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
14
+ function DataTableBulkActions({
15
+ bulkActions,
16
+ localSelectedIds,
17
+ dataLength,
18
+ bulkActionLoading,
19
+ onSelectAll,
20
+ onBulkAction,
21
+ labels
22
+ }) {
23
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
24
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-3 p-3 bg-muted rounded-lg", children: [
25
+ /* @__PURE__ */ jsx("div", { className: "flex flex-col sm:flex-row items-start sm:items-center gap-3", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
26
+ /* @__PURE__ */ jsxs(
27
+ Button,
28
+ {
29
+ "data-testid": "select-all-btn",
30
+ variant: "outline",
31
+ size: "sm",
32
+ onClick: () => {
33
+ const allSelected = localSelectedIds.length === dataLength && dataLength > 0;
34
+ onSelectAll(!allSelected);
35
+ },
36
+ className: "flex items-center gap-1 h-9 px-3",
37
+ children: [
38
+ localSelectedIds.length === dataLength && dataLength > 0 ? /* @__PURE__ */ jsx(CheckSquare, { className: "h-4 w-4" }) : /* @__PURE__ */ jsx(Square, { className: "h-4 w-4" }),
39
+ /* @__PURE__ */ jsx("span", { className: "hidden sm:inline", children: labels.selectAll }),
40
+ /* @__PURE__ */ jsx("span", { className: "sm:hidden", children: labels.selectAllShort })
41
+ ]
42
+ }
43
+ ),
44
+ /* @__PURE__ */ jsx("span", { className: "text-sm text-muted-foreground", children: formatLabel(labels.selected, { count: localSelectedIds.length, total: dataLength }) })
45
+ ] }) }),
46
+ localSelectedIds.length > 0 && /* @__PURE__ */ jsx("div", { className: "grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-6 gap-2", children: bulkActions.map((action) => {
47
+ var _a;
48
+ const isLoading = bulkActionLoading === action.key;
49
+ const isDisabled = !!bulkActionLoading || ((_a = action.disabled) == null ? void 0 : _a.call(action, localSelectedIds)) || localSelectedIds.length === 0;
50
+ return /* @__PURE__ */ jsxs(
51
+ Button,
52
+ {
53
+ "data-testid": `bulk-action-${action.key}`,
54
+ variant: action.variant || "outline",
55
+ size: "sm",
56
+ onClick: () => onBulkAction(action),
57
+ disabled: isDisabled,
58
+ className: "flex items-center gap-1 h-9 text-xs",
59
+ children: [
60
+ isLoading ? /* @__PURE__ */ jsx(Loader2, { className: "h-3 w-3 animate-spin" }) : action.icon,
61
+ /* @__PURE__ */ jsx("span", { className: "hidden sm:inline", children: isLoading ? labels.processing : action.label }),
62
+ /* @__PURE__ */ jsx("span", { className: "sm:hidden", children: isLoading ? "..." : action.label.split(" ")[0] })
63
+ ]
64
+ },
65
+ action.key
66
+ );
67
+ }) })
68
+ ] }),
69
+ bulkActionLoading && /* @__PURE__ */ jsxs("div", { className: "p-3 bg-muted/50 rounded-lg", children: [
70
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
71
+ /* @__PURE__ */ jsx(Loader2, { className: "h-4 w-4 animate-spin text-primary" }),
72
+ /* @__PURE__ */ jsx("span", { className: "text-sm text-muted-foreground", children: formatLabel(labels.processingItems, { count: localSelectedIds.length }) })
73
+ ] }),
74
+ /* @__PURE__ */ jsx(LoadingBar, { size: "sm", variant: "primary", className: "mt-2" })
75
+ ] })
76
+ ] });
77
+ }
78
+
79
+ export {
80
+ DataTableBulkActions
81
+ };
@@ -0,0 +1,31 @@
1
+ // src/components/ui/data-table/types.ts
2
+ var DEFAULT_LABELS = {
3
+ search: "Search",
4
+ filter: "Filter",
5
+ filterActive: "Active",
6
+ clearFilters: "Clear Filters",
7
+ selectAll: "Select All",
8
+ selectAllShort: "All",
9
+ selected: "{count} / {total} selected",
10
+ processing: "Processing...",
11
+ processingItems: "Processing {count} items...",
12
+ loading: "Loading data...",
13
+ perPage: "{size} per page",
14
+ all: "All",
15
+ min: "Min",
16
+ max: "Max",
17
+ previous: "Previous",
18
+ next: "Next",
19
+ showing: "Showing {start} to {end} of {total} results"
20
+ };
21
+ function formatLabel(template, values) {
22
+ return Object.entries(values).reduce(
23
+ (result, [key, value]) => result.replace(new RegExp(`\\{${key}\\}`, "g"), String(value)),
24
+ template
25
+ );
26
+ }
27
+
28
+ export {
29
+ DEFAULT_LABELS,
30
+ formatLabel
31
+ };
@@ -0,0 +1,110 @@
1
+ import {
2
+ formatLabel
3
+ } from "./chunk-NY5QXT33.js";
4
+ import {
5
+ Button
6
+ } from "./chunk-L25BNU3E.js";
7
+ import {
8
+ Input
9
+ } from "./chunk-RJUVBBZG.js";
10
+
11
+ // src/components/ui/data-table/DataTableSearch.tsx
12
+ import { isValidElement } from "react";
13
+ import { Filter } from "lucide-react";
14
+ import { jsx, jsxs } from "react/jsx-runtime";
15
+ function DataTableSearch({
16
+ onSearch,
17
+ onSearchValueChange,
18
+ searchValue,
19
+ searchPlaceholder,
20
+ labels,
21
+ filters,
22
+ onToggleFilters,
23
+ showFilters,
24
+ hasActiveFilters,
25
+ pagination,
26
+ createButton
27
+ }) {
28
+ const handleSearch = (e) => {
29
+ if (e.key === "Enter" && onSearch) {
30
+ onSearch(searchValue);
31
+ }
32
+ };
33
+ const handleSearchClick = () => {
34
+ if (onSearch) {
35
+ onSearch(searchValue);
36
+ }
37
+ };
38
+ const handleSearchInputChange = (value) => {
39
+ if (onSearchValueChange) {
40
+ onSearchValueChange(value);
41
+ }
42
+ };
43
+ return /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-3 p-3 bg-muted rounded-lg", children: /* @__PURE__ */ jsxs("div", { className: "flex flex-row items-center gap-2", children: [
44
+ onSearch && /* @__PURE__ */ jsxs("div", { className: "relative flex-1 min-w-0", children: [
45
+ /* @__PURE__ */ jsx(
46
+ Input,
47
+ {
48
+ "data-testid": "search-input",
49
+ placeholder: searchPlaceholder,
50
+ value: searchValue,
51
+ onChange: (e) => handleSearchInputChange(e.target.value),
52
+ onKeyPress: handleSearch,
53
+ className: "min-w-0 pr-20 h-10"
54
+ }
55
+ ),
56
+ /* @__PURE__ */ jsx(
57
+ Button,
58
+ {
59
+ "data-testid": "search-btn",
60
+ size: "sm",
61
+ onClick: handleSearchClick,
62
+ className: "absolute right-1 top-1/2 transform -translate-y-1/2 h-8 px-3 text-sm",
63
+ children: labels.search
64
+ }
65
+ )
66
+ ] }),
67
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 flex-shrink-0", children: [
68
+ filters.length > 0 && onToggleFilters && /* @__PURE__ */ jsxs(
69
+ Button,
70
+ {
71
+ "data-testid": "filter-toggle-btn",
72
+ variant: "outline",
73
+ size: "sm",
74
+ onClick: () => onToggleFilters(!showFilters),
75
+ className: "flex items-center gap-1 h-10 px-3",
76
+ children: [
77
+ /* @__PURE__ */ jsx(Filter, { className: "h-4 w-4" }),
78
+ /* @__PURE__ */ jsx("span", { className: "hidden sm:inline", children: labels.filter }),
79
+ hasActiveFilters && /* @__PURE__ */ jsx("span", { className: "ml-1 bg-primary text-primary-foreground text-xs px-1.5 py-0.5 rounded-full", children: labels.filterActive })
80
+ ]
81
+ }
82
+ ),
83
+ pagination && /* @__PURE__ */ jsx(
84
+ "select",
85
+ {
86
+ "data-testid": "page-size-select",
87
+ value: pagination.pageSize,
88
+ onChange: (e) => pagination.onPageSizeChange(Number(e.target.value)),
89
+ className: "border rounded px-3 py-2 text-sm bg-background h-10 min-w-[100px]",
90
+ children: (pagination.pageSizeOptions || [10, 20, 50]).map((size) => /* @__PURE__ */ jsx("option", { value: size, children: formatLabel(labels.perPage, { size }) }, size))
91
+ }
92
+ ),
93
+ createButton && (isValidElement(createButton) ? createButton : /* @__PURE__ */ jsx(
94
+ Button,
95
+ {
96
+ "data-testid": "create-btn",
97
+ onClick: createButton.onClick,
98
+ variant: "default",
99
+ size: "sm",
100
+ className: "flex-shrink-0 h-10 px-3",
101
+ children: createButton.label
102
+ }
103
+ ))
104
+ ] })
105
+ ] }) });
106
+ }
107
+
108
+ export {
109
+ DataTableSearch
110
+ };
@@ -1,103 +1,8 @@
1
- import { ReactNode } from "react";
2
- export interface DataTableLabels {
3
- search?: string;
4
- filter?: string;
5
- filterActive?: string;
6
- clearFilters?: string;
7
- selectAll?: string;
8
- selectAllShort?: string;
9
- selected?: string;
10
- processing?: string;
11
- processingItems?: string;
12
- loading?: string;
13
- perPage?: string;
14
- all?: string;
15
- min?: string;
16
- max?: string;
17
- previous?: string;
18
- next?: string;
19
- showing?: string;
20
- }
21
- export interface ColumnDef<T> {
22
- key: string;
23
- header: string;
24
- accessorKey?: keyof T;
25
- cell?: (item: T) => React.ReactNode;
26
- sortable?: boolean;
27
- width?: string;
28
- className?: string;
29
- hidden?: boolean;
30
- responsive?: {
31
- sm?: boolean;
32
- md?: boolean;
33
- lg?: boolean;
34
- xl?: boolean;
35
- };
36
- }
37
- export interface BulkAction {
38
- key: string;
39
- label: string;
40
- icon?: React.ReactNode;
41
- variant?: "default" | "destructive" | "outline" | "secondary" | "ghost" | "link";
42
- onClick: (selectedIds: string[]) => Promise<void>;
43
- disabled?: (selectedIds: string[]) => boolean;
44
- }
45
- export interface FilterConfig {
46
- key: string;
47
- label: string;
48
- type: 'text' | 'select' | 'date' | 'number' | 'switch' | 'range';
49
- options?: {
50
- value: string;
51
- label: string;
52
- }[];
53
- placeholder?: string;
54
- className?: string;
55
- inputType?: 'text' | 'number' | 'date';
56
- minPlaceholder?: string;
57
- maxPlaceholder?: string;
58
- }
59
- export interface PaginationConfig {
60
- page: number;
61
- pageSize: number;
62
- total: number;
63
- pageSizeOptions?: number[];
64
- onPageChange: (page: number) => void;
65
- onPageSizeChange: (pageSize: number) => void;
66
- }
67
- export interface SortConfig {
68
- sort: string;
69
- order: 'asc' | 'desc';
70
- onSortChange: (sort: string, order: 'asc' | 'desc') => void;
71
- }
72
- export interface DataTableProps<T> {
73
- data: T[];
74
- columns: ColumnDef<T>[];
75
- loading?: boolean;
76
- error?: string | null;
77
- pagination?: PaginationConfig;
78
- sort?: SortConfig;
79
- bulkActions?: BulkAction[];
80
- filters?: FilterConfig[];
81
- filterValues?: Record<string, any>;
82
- onFilterChange?: (key: string, value: any) => void;
83
- onClearFilters?: () => void;
84
- selectable?: boolean;
85
- onSelectionChange?: (selectedIds: string[]) => void;
86
- selectedIds?: string[];
87
- getRowId: (item: T) => string;
88
- className?: string;
89
- emptyMessage?: string;
90
- searchPlaceholder?: string;
91
- onSearch?: (search: string) => void;
92
- onSearchValueChange?: (searchValue: string) => void;
93
- searchValue?: string;
94
- showFilters?: boolean;
95
- onToggleFilters?: (show: boolean) => void;
96
- createButton?: ReactNode | {
97
- label: string;
98
- onClick: () => void;
99
- };
100
- /** i18n labels - 미제공 시 영어 기본값 사용 */
101
- labels?: Partial<DataTableLabels>;
102
- }
103
- export declare function DataTable<T>({ data, columns, loading, error, pagination, sort, bulkActions, filters, filterValues, onFilterChange, onClearFilters, selectable, onSelectionChange, selectedIds, getRowId, className, emptyMessage, searchPlaceholder, onSearch, onSearchValueChange, searchValue, showFilters, onToggleFilters, createButton, labels: customLabels, }: DataTableProps<T>): import("react/jsx-runtime").JSX.Element;
1
+ /**
2
+ * DataTable
3
+ *
4
+ * 하위 호환성을 위한 re-export wrapper
5
+ * 실제 구현은 ./data-table/ 디렉토리에 위치
6
+ */
7
+ export { DataTable } from "./data-table";
8
+ export type { DataTableLabels, ColumnDef, BulkAction, FilterConfig, PaginationConfig, SortConfig, DataTableProps, } from "./data-table";