@jameskabz/nextcraft-ui 0.7.4 → 0.8.0
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/dist/components/craft-card.cjs +2 -2
- package/dist/components/craft-card.cjs.map +1 -1
- package/dist/components/craft-card.js +2 -2
- package/dist/components/craft-card.js.map +1 -1
- package/dist/components/craft-data-table-filters.cjs +184 -0
- package/dist/components/craft-data-table-filters.cjs.map +1 -0
- package/dist/components/craft-data-table-filters.d.cts +58 -0
- package/dist/components/craft-data-table-filters.d.ts +58 -0
- package/dist/components/craft-data-table-filters.js +160 -0
- package/dist/components/craft-data-table-filters.js.map +1 -0
- package/dist/components/craft-data-table-header.cjs +1 -1
- package/dist/components/craft-data-table-header.cjs.map +1 -1
- package/dist/components/craft-data-table-header.js +1 -1
- package/dist/components/craft-data-table-header.js.map +1 -1
- package/dist/components/craft-data-table.cjs +11 -8
- package/dist/components/craft-data-table.cjs.map +1 -1
- package/dist/components/craft-data-table.js +11 -8
- package/dist/components/craft-data-table.js.map +1 -1
- package/dist/components/craft-filter-bar.cjs +75 -5
- package/dist/components/craft-filter-bar.cjs.map +1 -1
- package/dist/components/craft-filter-bar.d.cts +29 -3
- package/dist/components/craft-filter-bar.d.ts +29 -3
- package/dist/components/craft-filter-bar.js +75 -5
- package/dist/components/craft-filter-bar.js.map +1 -1
- package/dist/components/craft-loader.cjs +1 -1
- package/dist/components/craft-loader.cjs.map +1 -1
- package/dist/components/craft-loader.js +1 -1
- package/dist/components/craft-loader.js.map +1 -1
- package/dist/index.cjs +3 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/styles.css +44 -5
- package/package.json +1 -1
|
@@ -45,8 +45,8 @@ function CraftCard({
|
|
|
45
45
|
intensityClasses[intensity],
|
|
46
46
|
"bg-linear-to-br from-[rgb(var(--nc-accent-1)/0.15)] via-[rgb(var(--nc-accent-2)/0.10)] to-[rgb(var(--nc-accent-3)/0.15)]",
|
|
47
47
|
bordered ? "border-2 border-[rgb(var(--nc-accent-1)/0.3)]" : "border-0",
|
|
48
|
-
elevated ? "shadow-[0_8px_32px_rgba(0,0,0,0.3)] hover:shadow-[0_8px_40px_rgba(0,0,0,0.
|
|
49
|
-
"before:absolute before:inset-0 before:bg-linear-to-br before:from-white/
|
|
48
|
+
elevated ? "shadow-[0_8px_32px_rgba(0,0,0,0.3)] hover:shadow-[0_8px_40px_rgba(0,0,0,0.6)]" : "shadow-none",
|
|
49
|
+
"before:absolute before:inset-0 before:bg-linear-to-br before:from-white/4 before:to-transparent before:opacity-0 hover:before:opacity-40 before:transition-opacity before:duration-300",
|
|
50
50
|
"transition-all duration-300",
|
|
51
51
|
className
|
|
52
52
|
),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/craft-card.tsx"],"sourcesContent":["import { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\n\nexport type CraftCardProps = React.HTMLAttributes<HTMLDivElement> & {\n tone?: ThemeName;\n elevated?: boolean;\n intensity?: \"subtle\" | \"medium\" | \"strong\";\n bordered?: boolean;\n};\n\nconst intensityClasses: Record<NonNullable<CraftCardProps[\"intensity\"]>, string> = {\n subtle: \"backdrop-blur-md bg-opacity-50\",\n medium: \"backdrop-blur-xl bg-opacity-70\",\n strong: \"backdrop-blur-2xl bg-opacity-90\",\n};\n\nexport function CraftCard({\n className,\n tone,\n elevated = true,\n intensity = \"medium\",\n bordered = true,\n children,\n ...props\n}: CraftCardProps) {\n return (\n <div\n className={cn(\n \"relative overflow-hidden rounded-3xl p-6 text-[rgb(var(--nc-fg))]\",\n intensityClasses[intensity],\n \"bg-linear-to-br from-[rgb(var(--nc-accent-1)/0.15)] via-[rgb(var(--nc-accent-2)/0.10)] to-[rgb(var(--nc-accent-3)/0.15)]\",\n bordered ? \"border-2 border-[rgb(var(--nc-accent-1)/0.3)]\" : \"border-0\",\n elevated\n ? \"shadow-[0_8px_32px_rgba(0,0,0,0.3)] hover:shadow-[0_8px_40px_rgba(0,0,0,0.
|
|
1
|
+
{"version":3,"sources":["../../src/components/craft-card.tsx"],"sourcesContent":["import { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\n\nexport type CraftCardProps = React.HTMLAttributes<HTMLDivElement> & {\n tone?: ThemeName;\n elevated?: boolean;\n intensity?: \"subtle\" | \"medium\" | \"strong\";\n bordered?: boolean;\n};\n\nconst intensityClasses: Record<NonNullable<CraftCardProps[\"intensity\"]>, string> = {\n subtle: \"backdrop-blur-md bg-opacity-50\",\n medium: \"backdrop-blur-xl bg-opacity-70\",\n strong: \"backdrop-blur-2xl bg-opacity-90\",\n};\n\nexport function CraftCard({\n className,\n tone,\n elevated = true,\n intensity = \"medium\",\n bordered = true,\n children,\n ...props\n}: CraftCardProps) {\n return (\n <div\n className={cn(\n \"relative overflow-hidden rounded-3xl p-6 text-[rgb(var(--nc-fg))]\",\n intensityClasses[intensity],\n \"bg-linear-to-br from-[rgb(var(--nc-accent-1)/0.15)] via-[rgb(var(--nc-accent-2)/0.10)] to-[rgb(var(--nc-accent-3)/0.15)]\",\n bordered ? \"border-2 border-[rgb(var(--nc-accent-1)/0.3)]\" : \"border-0\",\n elevated\n ? \"shadow-[0_8px_32px_rgba(0,0,0,0.3)] hover:shadow-[0_8px_40px_rgba(0,0,0,0.6)]\"\n : \"shadow-none\",\n \"before:absolute before:inset-0 before:bg-linear-to-br before:from-white/4 before:to-transparent before:opacity-0 hover:before:opacity-40 before:transition-opacity before:duration-300\",\n \"transition-all duration-300\",\n className\n )}\n data-nc-theme={tone}\n {...props}\n >\n <div className=\"relative z-10\">{children}</div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA0CM;AA1CN,gBAAmB;AAUnB,MAAM,mBAA6E;AAAA,EACjF,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AACV;AAEO,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX;AAAA,EACA,GAAG;AACL,GAAmB;AACjB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW;AAAA,QACT;AAAA,QACA,iBAAiB,SAAS;AAAA,QAC1B;AAAA,QACA,WAAW,kDAAkD;AAAA,QAC7D,WACI,kFACA;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,iBAAe;AAAA,MACd,GAAG;AAAA,MAEJ,sDAAC,SAAI,WAAU,iBAAiB,UAAS;AAAA;AAAA,EAC3C;AAEJ;","names":[]}
|
|
@@ -22,8 +22,8 @@ function CraftCard({
|
|
|
22
22
|
intensityClasses[intensity],
|
|
23
23
|
"bg-linear-to-br from-[rgb(var(--nc-accent-1)/0.15)] via-[rgb(var(--nc-accent-2)/0.10)] to-[rgb(var(--nc-accent-3)/0.15)]",
|
|
24
24
|
bordered ? "border-2 border-[rgb(var(--nc-accent-1)/0.3)]" : "border-0",
|
|
25
|
-
elevated ? "shadow-[0_8px_32px_rgba(0,0,0,0.3)] hover:shadow-[0_8px_40px_rgba(0,0,0,0.
|
|
26
|
-
"before:absolute before:inset-0 before:bg-linear-to-br before:from-white/
|
|
25
|
+
elevated ? "shadow-[0_8px_32px_rgba(0,0,0,0.3)] hover:shadow-[0_8px_40px_rgba(0,0,0,0.6)]" : "shadow-none",
|
|
26
|
+
"before:absolute before:inset-0 before:bg-linear-to-br before:from-white/4 before:to-transparent before:opacity-0 hover:before:opacity-40 before:transition-opacity before:duration-300",
|
|
27
27
|
"transition-all duration-300",
|
|
28
28
|
className
|
|
29
29
|
),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/craft-card.tsx"],"sourcesContent":["import { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\n\nexport type CraftCardProps = React.HTMLAttributes<HTMLDivElement> & {\n tone?: ThemeName;\n elevated?: boolean;\n intensity?: \"subtle\" | \"medium\" | \"strong\";\n bordered?: boolean;\n};\n\nconst intensityClasses: Record<NonNullable<CraftCardProps[\"intensity\"]>, string> = {\n subtle: \"backdrop-blur-md bg-opacity-50\",\n medium: \"backdrop-blur-xl bg-opacity-70\",\n strong: \"backdrop-blur-2xl bg-opacity-90\",\n};\n\nexport function CraftCard({\n className,\n tone,\n elevated = true,\n intensity = \"medium\",\n bordered = true,\n children,\n ...props\n}: CraftCardProps) {\n return (\n <div\n className={cn(\n \"relative overflow-hidden rounded-3xl p-6 text-[rgb(var(--nc-fg))]\",\n intensityClasses[intensity],\n \"bg-linear-to-br from-[rgb(var(--nc-accent-1)/0.15)] via-[rgb(var(--nc-accent-2)/0.10)] to-[rgb(var(--nc-accent-3)/0.15)]\",\n bordered ? \"border-2 border-[rgb(var(--nc-accent-1)/0.3)]\" : \"border-0\",\n elevated\n ? \"shadow-[0_8px_32px_rgba(0,0,0,0.3)] hover:shadow-[0_8px_40px_rgba(0,0,0,0.
|
|
1
|
+
{"version":3,"sources":["../../src/components/craft-card.tsx"],"sourcesContent":["import { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\n\nexport type CraftCardProps = React.HTMLAttributes<HTMLDivElement> & {\n tone?: ThemeName;\n elevated?: boolean;\n intensity?: \"subtle\" | \"medium\" | \"strong\";\n bordered?: boolean;\n};\n\nconst intensityClasses: Record<NonNullable<CraftCardProps[\"intensity\"]>, string> = {\n subtle: \"backdrop-blur-md bg-opacity-50\",\n medium: \"backdrop-blur-xl bg-opacity-70\",\n strong: \"backdrop-blur-2xl bg-opacity-90\",\n};\n\nexport function CraftCard({\n className,\n tone,\n elevated = true,\n intensity = \"medium\",\n bordered = true,\n children,\n ...props\n}: CraftCardProps) {\n return (\n <div\n className={cn(\n \"relative overflow-hidden rounded-3xl p-6 text-[rgb(var(--nc-fg))]\",\n intensityClasses[intensity],\n \"bg-linear-to-br from-[rgb(var(--nc-accent-1)/0.15)] via-[rgb(var(--nc-accent-2)/0.10)] to-[rgb(var(--nc-accent-3)/0.15)]\",\n bordered ? \"border-2 border-[rgb(var(--nc-accent-1)/0.3)]\" : \"border-0\",\n elevated\n ? \"shadow-[0_8px_32px_rgba(0,0,0,0.3)] hover:shadow-[0_8px_40px_rgba(0,0,0,0.6)]\"\n : \"shadow-none\",\n \"before:absolute before:inset-0 before:bg-linear-to-br before:from-white/4 before:to-transparent before:opacity-0 hover:before:opacity-40 before:transition-opacity before:duration-300\",\n \"transition-all duration-300\",\n className\n )}\n data-nc-theme={tone}\n {...props}\n >\n <div className=\"relative z-10\">{children}</div>\n </div>\n );\n}\n"],"mappings":"AA0CM;AA1CN,SAAS,UAAU;AAUnB,MAAM,mBAA6E;AAAA,EACjF,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AACV;AAEO,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX;AAAA,EACA,GAAG;AACL,GAAmB;AACjB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,iBAAiB,SAAS;AAAA,QAC1B;AAAA,QACA,WAAW,kDAAkD;AAAA,QAC7D,WACI,kFACA;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,iBAAe;AAAA,MACd,GAAG;AAAA,MAEJ,8BAAC,SAAI,WAAU,iBAAiB,UAAS;AAAA;AAAA,EAC3C;AAEJ;","names":[]}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
"use client";
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
|
+
var craft_data_table_filters_exports = {};
|
|
21
|
+
__export(craft_data_table_filters_exports, {
|
|
22
|
+
CraftDataTableFilters: () => CraftDataTableFilters
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(craft_data_table_filters_exports);
|
|
25
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
26
|
+
var import_cn = require("../utils/cn");
|
|
27
|
+
var import_craft_button = require("../components/craft-button");
|
|
28
|
+
var import_craft_input = require("../components/craft-input");
|
|
29
|
+
var import_craft_select = require("../components/craft-select");
|
|
30
|
+
function CraftDataTableFilters({
|
|
31
|
+
title,
|
|
32
|
+
description,
|
|
33
|
+
searchValue,
|
|
34
|
+
onSearchChange,
|
|
35
|
+
searchPlaceholder = "Search...",
|
|
36
|
+
showSearch = true,
|
|
37
|
+
addButton,
|
|
38
|
+
selectFilters,
|
|
39
|
+
onSelectFiltersChange,
|
|
40
|
+
dateFilters,
|
|
41
|
+
onDateFiltersChange,
|
|
42
|
+
showFilters = true,
|
|
43
|
+
showClear = true,
|
|
44
|
+
clearLabel = "Clear filters",
|
|
45
|
+
onClearFilters,
|
|
46
|
+
showFileUpload = false,
|
|
47
|
+
fileUploadAccept,
|
|
48
|
+
fileUploadMaxSize,
|
|
49
|
+
onFilesSelected,
|
|
50
|
+
totalItems,
|
|
51
|
+
itemLabel = "items",
|
|
52
|
+
tone,
|
|
53
|
+
className
|
|
54
|
+
}) {
|
|
55
|
+
var _a, _b;
|
|
56
|
+
const hasSelects = Boolean(selectFilters && selectFilters.length > 0);
|
|
57
|
+
const hasDates = Boolean(dateFilters && dateFilters.length > 0);
|
|
58
|
+
const hasFilters = showFilters && (hasSelects || hasDates);
|
|
59
|
+
const updateSelectFilter = (index, value) => {
|
|
60
|
+
if (!selectFilters || !onSelectFiltersChange) return;
|
|
61
|
+
const next = selectFilters.map(
|
|
62
|
+
(filter, idx) => idx === index ? { ...filter, value } : filter
|
|
63
|
+
);
|
|
64
|
+
onSelectFiltersChange(next);
|
|
65
|
+
};
|
|
66
|
+
const updateDateFilter = (index, key, value) => {
|
|
67
|
+
if (!dateFilters || !onDateFiltersChange) return;
|
|
68
|
+
const next = dateFilters.map(
|
|
69
|
+
(filter, idx) => idx === index ? { ...filter, [key]: value } : filter
|
|
70
|
+
);
|
|
71
|
+
onDateFiltersChange(next);
|
|
72
|
+
};
|
|
73
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
74
|
+
"div",
|
|
75
|
+
{
|
|
76
|
+
className: (0, import_cn.cn)(
|
|
77
|
+
"rounded-3xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] p-4 text-[rgb(var(--nc-fg))] shadow-[0_12px_36px_rgba(0,0,0,0.2)] backdrop-blur-2xl",
|
|
78
|
+
className
|
|
79
|
+
),
|
|
80
|
+
"data-nc-theme": tone,
|
|
81
|
+
children: [
|
|
82
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex flex-wrap items-center justify-between gap-4", children: [
|
|
83
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
|
|
84
|
+
title && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h3", { className: "text-lg font-semibold", children: title }),
|
|
85
|
+
description && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm text-[rgb(var(--nc-fg-muted))]", children: description }),
|
|
86
|
+
typeof totalItems === "number" && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", { className: "text-xs text-[rgb(var(--nc-fg-muted))]", children: [
|
|
87
|
+
totalItems,
|
|
88
|
+
" ",
|
|
89
|
+
itemLabel
|
|
90
|
+
] })
|
|
91
|
+
] }),
|
|
92
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-3", children: [
|
|
93
|
+
showFileUpload && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
94
|
+
import_craft_input.CraftInput,
|
|
95
|
+
{
|
|
96
|
+
type: "file",
|
|
97
|
+
accept: fileUploadAccept,
|
|
98
|
+
onChange: (event) => {
|
|
99
|
+
const files = event.target.files;
|
|
100
|
+
if (!files || files.length === 0) return;
|
|
101
|
+
if (typeof fileUploadMaxSize === "number" && files[0] && files[0].size > fileUploadMaxSize) {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
onFilesSelected == null ? void 0 : onFilesSelected(files);
|
|
105
|
+
event.currentTarget.value = "";
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
),
|
|
109
|
+
addButton ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
110
|
+
import_craft_button.CraftButton,
|
|
111
|
+
{
|
|
112
|
+
type: "button",
|
|
113
|
+
variant: (_a = addButton.variant) != null ? _a : "outline",
|
|
114
|
+
size: (_b = addButton.size) != null ? _b : "sm",
|
|
115
|
+
disabled: addButton.disabled,
|
|
116
|
+
onClick: addButton.onClick,
|
|
117
|
+
children: addButton.label
|
|
118
|
+
}
|
|
119
|
+
) : null,
|
|
120
|
+
showClear && onClearFilters ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_craft_button.CraftButton, { type: "button", variant: "ghost", onClick: onClearFilters, children: clearLabel }) : null
|
|
121
|
+
] })
|
|
122
|
+
] }),
|
|
123
|
+
(showSearch || hasFilters) && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "mt-4 grid gap-4", children: [
|
|
124
|
+
showSearch && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
125
|
+
import_craft_input.CraftInput,
|
|
126
|
+
{
|
|
127
|
+
type: "search",
|
|
128
|
+
placeholder: searchPlaceholder,
|
|
129
|
+
value: searchValue != null ? searchValue : "",
|
|
130
|
+
onChange: (event) => onSearchChange == null ? void 0 : onSearchChange(event.target.value),
|
|
131
|
+
tone
|
|
132
|
+
}
|
|
133
|
+
),
|
|
134
|
+
hasFilters && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex flex-wrap items-end gap-3", children: [
|
|
135
|
+
selectFilters == null ? void 0 : selectFilters.map((filter, index) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("label", { className: "grid gap-2 text-xs", children: [
|
|
136
|
+
filter.label ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-[rgb(var(--nc-fg-muted))]", children: filter.label }) : null,
|
|
137
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
138
|
+
import_craft_select.CraftSelect,
|
|
139
|
+
{
|
|
140
|
+
value: filter.value,
|
|
141
|
+
disabled: filter.disabled,
|
|
142
|
+
onChange: (event) => updateSelectFilter(index, event.target.value),
|
|
143
|
+
children: [
|
|
144
|
+
filter.placeholder ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("option", { value: "", children: filter.placeholder }) : null,
|
|
145
|
+
filter.options.map((option) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("option", { value: option.value, children: option.label }, String(option.value)))
|
|
146
|
+
]
|
|
147
|
+
}
|
|
148
|
+
)
|
|
149
|
+
] }, filter.key)),
|
|
150
|
+
dateFilters == null ? void 0 : dateFilters.map((filter, index) => {
|
|
151
|
+
var _a2, _b2;
|
|
152
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "grid gap-2 text-xs", children: [
|
|
153
|
+
filter.label ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-[rgb(var(--nc-fg-muted))]", children: filter.label }) : null,
|
|
154
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
155
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
156
|
+
import_craft_input.CraftInput,
|
|
157
|
+
{
|
|
158
|
+
type: "date",
|
|
159
|
+
value: (_a2 = filter.from) != null ? _a2 : "",
|
|
160
|
+
onChange: (event) => updateDateFilter(index, "from", event.target.value)
|
|
161
|
+
}
|
|
162
|
+
),
|
|
163
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
164
|
+
import_craft_input.CraftInput,
|
|
165
|
+
{
|
|
166
|
+
type: "date",
|
|
167
|
+
value: (_b2 = filter.to) != null ? _b2 : "",
|
|
168
|
+
onChange: (event) => updateDateFilter(index, "to", event.target.value)
|
|
169
|
+
}
|
|
170
|
+
)
|
|
171
|
+
] })
|
|
172
|
+
] }, filter.key);
|
|
173
|
+
})
|
|
174
|
+
] })
|
|
175
|
+
] })
|
|
176
|
+
]
|
|
177
|
+
}
|
|
178
|
+
);
|
|
179
|
+
}
|
|
180
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
181
|
+
0 && (module.exports = {
|
|
182
|
+
CraftDataTableFilters
|
|
183
|
+
});
|
|
184
|
+
//# sourceMappingURL=craft-data-table-filters.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/craft-data-table-filters.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\nimport { CraftButton, type CraftButtonProps } from \"@/components/craft-button\";\nimport { CraftInput } from \"@/components/craft-input\";\nimport { CraftSelect } from \"@/components/craft-select\";\n\nexport type CraftDataTableFilterSelectOption = {\n label: React.ReactNode;\n value: string;\n};\n\nexport type CraftDataTableFilterSelect = {\n key: string;\n label?: React.ReactNode;\n value: string;\n placeholder?: string;\n options: CraftDataTableFilterSelectOption[];\n disabled?: boolean;\n};\n\nexport type CraftDataTableFilterDate = {\n key: string;\n label?: React.ReactNode;\n from?: string;\n to?: string;\n};\n\nexport type CraftDataTableFiltersProps = {\n title?: React.ReactNode;\n description?: React.ReactNode;\n\n searchValue?: string;\n onSearchChange?: (value: string) => void;\n searchPlaceholder?: string;\n showSearch?: boolean;\n\n addButton?: {\n label: React.ReactNode;\n icon?: React.ReactNode | string;\n variant?: CraftButtonProps[\"variant\"];\n size?: CraftButtonProps[\"size\"];\n disabled?: boolean;\n onClick: () => void;\n };\n\n selectFilters?: CraftDataTableFilterSelect[];\n onSelectFiltersChange?: (filters: CraftDataTableFilterSelect[]) => void;\n\n dateFilters?: CraftDataTableFilterDate[];\n onDateFiltersChange?: (filters: CraftDataTableFilterDate[]) => void;\n\n showFilters?: boolean;\n\n showClear?: boolean;\n clearLabel?: React.ReactNode;\n onClearFilters?: () => void;\n\n showFileUpload?: boolean;\n fileUploadAccept?: string;\n fileUploadMaxSize?: number;\n onFilesSelected?: (files: FileList) => void;\n\n totalItems?: number;\n itemLabel?: string;\n\n tone?: ThemeName;\n className?: string;\n};\n\nexport function CraftDataTableFilters({\n title,\n description,\n searchValue,\n onSearchChange,\n searchPlaceholder = \"Search...\",\n showSearch = true,\n addButton,\n selectFilters,\n onSelectFiltersChange,\n dateFilters,\n onDateFiltersChange,\n showFilters = true,\n showClear = true,\n clearLabel = \"Clear filters\",\n onClearFilters,\n showFileUpload = false,\n fileUploadAccept,\n fileUploadMaxSize,\n onFilesSelected,\n totalItems,\n itemLabel = \"items\",\n tone,\n className,\n}: CraftDataTableFiltersProps) {\n const hasSelects = Boolean(selectFilters && selectFilters.length > 0);\n const hasDates = Boolean(dateFilters && dateFilters.length > 0);\n const hasFilters = showFilters && (hasSelects || hasDates);\n\n const updateSelectFilter = (index: number, value: string) => {\n if (!selectFilters || !onSelectFiltersChange) return;\n const next = selectFilters.map((filter, idx) =>\n idx === index ? { ...filter, value } : filter\n );\n onSelectFiltersChange(next);\n };\n\n const updateDateFilter = (\n index: number,\n key: \"from\" | \"to\",\n value: string\n ) => {\n if (!dateFilters || !onDateFiltersChange) return;\n const next = dateFilters.map((filter, idx) =>\n idx === index ? { ...filter, [key]: value } : filter\n );\n onDateFiltersChange(next);\n };\n\n return (\n <div\n className={cn(\n \"rounded-3xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] p-4 text-[rgb(var(--nc-fg))] shadow-[0_12px_36px_rgba(0,0,0,0.2)] backdrop-blur-2xl\",\n className\n )}\n data-nc-theme={tone}\n >\n <div className=\"flex flex-wrap items-center justify-between gap-4\">\n <div>\n {title && <h3 className=\"text-lg font-semibold\">{title}</h3>}\n {description && (\n <p className=\"text-sm text-[rgb(var(--nc-fg-muted))]\">\n {description}\n </p>\n )}\n {typeof totalItems === \"number\" && (\n <p className=\"text-xs text-[rgb(var(--nc-fg-muted))]\">\n {totalItems} {itemLabel}\n </p>\n )}\n </div>\n\n <div className=\"flex items-center gap-3\">\n {showFileUpload && (\n <CraftInput\n type=\"file\"\n accept={fileUploadAccept}\n onChange={(event) => {\n const files = event.target.files;\n if (!files || files.length === 0) return;\n if (\n typeof fileUploadMaxSize === \"number\" &&\n files[0] &&\n files[0].size > fileUploadMaxSize\n ) {\n return;\n }\n onFilesSelected?.(files);\n event.currentTarget.value = \"\";\n }}\n />\n )}\n\n {addButton ? (\n <CraftButton\n type=\"button\"\n variant={addButton.variant ?? \"outline\"}\n size={addButton.size ?? \"sm\"}\n disabled={addButton.disabled}\n onClick={addButton.onClick}\n >\n {addButton.label}\n </CraftButton>\n ) : null}\n\n {showClear && onClearFilters ? (\n <CraftButton type=\"button\" variant=\"ghost\" onClick={onClearFilters}>\n {clearLabel}\n </CraftButton>\n ) : null}\n </div>\n </div>\n\n {(showSearch || hasFilters) && (\n <div className=\"mt-4 grid gap-4\">\n {showSearch && (\n <CraftInput\n type=\"search\"\n placeholder={searchPlaceholder}\n value={searchValue ?? \"\"}\n onChange={(event) => onSearchChange?.(event.target.value)}\n tone={tone}\n />\n )}\n\n {hasFilters && (\n <div className=\"flex flex-wrap items-end gap-3\">\n {selectFilters?.map((filter, index) => (\n <label key={filter.key} className=\"grid gap-2 text-xs\">\n {filter.label ? (\n <span className=\"text-[rgb(var(--nc-fg-muted))]\">\n {filter.label}\n </span>\n ) : null}\n <CraftSelect\n value={filter.value}\n disabled={filter.disabled}\n onChange={(event) =>\n updateSelectFilter(index, event.target.value)\n }\n >\n {filter.placeholder ? (\n <option value=\"\">{filter.placeholder}</option>\n ) : null}\n {filter.options.map((option) => (\n <option key={String(option.value)} value={option.value}>\n {option.label}\n </option>\n ))}\n </CraftSelect>\n </label>\n ))}\n\n {dateFilters?.map((filter, index) => (\n <div key={filter.key} className=\"grid gap-2 text-xs\">\n {filter.label ? (\n <span className=\"text-[rgb(var(--nc-fg-muted))]\">\n {filter.label}\n </span>\n ) : null}\n <div className=\"flex items-center gap-2\">\n <CraftInput\n type=\"date\"\n value={filter.from ?? \"\"}\n onChange={(event) =>\n updateDateFilter(index, \"from\", event.target.value)\n }\n />\n <CraftInput\n type=\"date\"\n value={filter.to ?? \"\"}\n onChange={(event) =>\n updateDateFilter(index, \"to\", event.target.value)\n }\n />\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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","names":["_a","_b"]}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { ThemeName } from '../theme/theme-context.cjs';
|
|
4
|
+
import { CraftButtonProps } from './craft-button.cjs';
|
|
5
|
+
|
|
6
|
+
type CraftDataTableFilterSelectOption = {
|
|
7
|
+
label: React.ReactNode;
|
|
8
|
+
value: string;
|
|
9
|
+
};
|
|
10
|
+
type CraftDataTableFilterSelect = {
|
|
11
|
+
key: string;
|
|
12
|
+
label?: React.ReactNode;
|
|
13
|
+
value: string;
|
|
14
|
+
placeholder?: string;
|
|
15
|
+
options: CraftDataTableFilterSelectOption[];
|
|
16
|
+
disabled?: boolean;
|
|
17
|
+
};
|
|
18
|
+
type CraftDataTableFilterDate = {
|
|
19
|
+
key: string;
|
|
20
|
+
label?: React.ReactNode;
|
|
21
|
+
from?: string;
|
|
22
|
+
to?: string;
|
|
23
|
+
};
|
|
24
|
+
type CraftDataTableFiltersProps = {
|
|
25
|
+
title?: React.ReactNode;
|
|
26
|
+
description?: React.ReactNode;
|
|
27
|
+
searchValue?: string;
|
|
28
|
+
onSearchChange?: (value: string) => void;
|
|
29
|
+
searchPlaceholder?: string;
|
|
30
|
+
showSearch?: boolean;
|
|
31
|
+
addButton?: {
|
|
32
|
+
label: React.ReactNode;
|
|
33
|
+
icon?: React.ReactNode | string;
|
|
34
|
+
variant?: CraftButtonProps["variant"];
|
|
35
|
+
size?: CraftButtonProps["size"];
|
|
36
|
+
disabled?: boolean;
|
|
37
|
+
onClick: () => void;
|
|
38
|
+
};
|
|
39
|
+
selectFilters?: CraftDataTableFilterSelect[];
|
|
40
|
+
onSelectFiltersChange?: (filters: CraftDataTableFilterSelect[]) => void;
|
|
41
|
+
dateFilters?: CraftDataTableFilterDate[];
|
|
42
|
+
onDateFiltersChange?: (filters: CraftDataTableFilterDate[]) => void;
|
|
43
|
+
showFilters?: boolean;
|
|
44
|
+
showClear?: boolean;
|
|
45
|
+
clearLabel?: React.ReactNode;
|
|
46
|
+
onClearFilters?: () => void;
|
|
47
|
+
showFileUpload?: boolean;
|
|
48
|
+
fileUploadAccept?: string;
|
|
49
|
+
fileUploadMaxSize?: number;
|
|
50
|
+
onFilesSelected?: (files: FileList) => void;
|
|
51
|
+
totalItems?: number;
|
|
52
|
+
itemLabel?: string;
|
|
53
|
+
tone?: ThemeName;
|
|
54
|
+
className?: string;
|
|
55
|
+
};
|
|
56
|
+
declare function CraftDataTableFilters({ title, description, searchValue, onSearchChange, searchPlaceholder, showSearch, addButton, selectFilters, onSelectFiltersChange, dateFilters, onDateFiltersChange, showFilters, showClear, clearLabel, onClearFilters, showFileUpload, fileUploadAccept, fileUploadMaxSize, onFilesSelected, totalItems, itemLabel, tone, className, }: CraftDataTableFiltersProps): react_jsx_runtime.JSX.Element;
|
|
57
|
+
|
|
58
|
+
export { type CraftDataTableFilterDate, type CraftDataTableFilterSelect, type CraftDataTableFilterSelectOption, CraftDataTableFilters, type CraftDataTableFiltersProps };
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { ThemeName } from '../theme/theme-context.js';
|
|
4
|
+
import { CraftButtonProps } from './craft-button.js';
|
|
5
|
+
|
|
6
|
+
type CraftDataTableFilterSelectOption = {
|
|
7
|
+
label: React.ReactNode;
|
|
8
|
+
value: string;
|
|
9
|
+
};
|
|
10
|
+
type CraftDataTableFilterSelect = {
|
|
11
|
+
key: string;
|
|
12
|
+
label?: React.ReactNode;
|
|
13
|
+
value: string;
|
|
14
|
+
placeholder?: string;
|
|
15
|
+
options: CraftDataTableFilterSelectOption[];
|
|
16
|
+
disabled?: boolean;
|
|
17
|
+
};
|
|
18
|
+
type CraftDataTableFilterDate = {
|
|
19
|
+
key: string;
|
|
20
|
+
label?: React.ReactNode;
|
|
21
|
+
from?: string;
|
|
22
|
+
to?: string;
|
|
23
|
+
};
|
|
24
|
+
type CraftDataTableFiltersProps = {
|
|
25
|
+
title?: React.ReactNode;
|
|
26
|
+
description?: React.ReactNode;
|
|
27
|
+
searchValue?: string;
|
|
28
|
+
onSearchChange?: (value: string) => void;
|
|
29
|
+
searchPlaceholder?: string;
|
|
30
|
+
showSearch?: boolean;
|
|
31
|
+
addButton?: {
|
|
32
|
+
label: React.ReactNode;
|
|
33
|
+
icon?: React.ReactNode | string;
|
|
34
|
+
variant?: CraftButtonProps["variant"];
|
|
35
|
+
size?: CraftButtonProps["size"];
|
|
36
|
+
disabled?: boolean;
|
|
37
|
+
onClick: () => void;
|
|
38
|
+
};
|
|
39
|
+
selectFilters?: CraftDataTableFilterSelect[];
|
|
40
|
+
onSelectFiltersChange?: (filters: CraftDataTableFilterSelect[]) => void;
|
|
41
|
+
dateFilters?: CraftDataTableFilterDate[];
|
|
42
|
+
onDateFiltersChange?: (filters: CraftDataTableFilterDate[]) => void;
|
|
43
|
+
showFilters?: boolean;
|
|
44
|
+
showClear?: boolean;
|
|
45
|
+
clearLabel?: React.ReactNode;
|
|
46
|
+
onClearFilters?: () => void;
|
|
47
|
+
showFileUpload?: boolean;
|
|
48
|
+
fileUploadAccept?: string;
|
|
49
|
+
fileUploadMaxSize?: number;
|
|
50
|
+
onFilesSelected?: (files: FileList) => void;
|
|
51
|
+
totalItems?: number;
|
|
52
|
+
itemLabel?: string;
|
|
53
|
+
tone?: ThemeName;
|
|
54
|
+
className?: string;
|
|
55
|
+
};
|
|
56
|
+
declare function CraftDataTableFilters({ title, description, searchValue, onSearchChange, searchPlaceholder, showSearch, addButton, selectFilters, onSelectFiltersChange, dateFilters, onDateFiltersChange, showFilters, showClear, clearLabel, onClearFilters, showFileUpload, fileUploadAccept, fileUploadMaxSize, onFilesSelected, totalItems, itemLabel, tone, className, }: CraftDataTableFiltersProps): react_jsx_runtime.JSX.Element;
|
|
57
|
+
|
|
58
|
+
export { type CraftDataTableFilterDate, type CraftDataTableFilterSelect, type CraftDataTableFilterSelectOption, CraftDataTableFilters, type CraftDataTableFiltersProps };
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { cn } from "../utils/cn";
|
|
4
|
+
import { CraftButton } from "../components/craft-button";
|
|
5
|
+
import { CraftInput } from "../components/craft-input";
|
|
6
|
+
import { CraftSelect } from "../components/craft-select";
|
|
7
|
+
function CraftDataTableFilters({
|
|
8
|
+
title,
|
|
9
|
+
description,
|
|
10
|
+
searchValue,
|
|
11
|
+
onSearchChange,
|
|
12
|
+
searchPlaceholder = "Search...",
|
|
13
|
+
showSearch = true,
|
|
14
|
+
addButton,
|
|
15
|
+
selectFilters,
|
|
16
|
+
onSelectFiltersChange,
|
|
17
|
+
dateFilters,
|
|
18
|
+
onDateFiltersChange,
|
|
19
|
+
showFilters = true,
|
|
20
|
+
showClear = true,
|
|
21
|
+
clearLabel = "Clear filters",
|
|
22
|
+
onClearFilters,
|
|
23
|
+
showFileUpload = false,
|
|
24
|
+
fileUploadAccept,
|
|
25
|
+
fileUploadMaxSize,
|
|
26
|
+
onFilesSelected,
|
|
27
|
+
totalItems,
|
|
28
|
+
itemLabel = "items",
|
|
29
|
+
tone,
|
|
30
|
+
className
|
|
31
|
+
}) {
|
|
32
|
+
var _a, _b;
|
|
33
|
+
const hasSelects = Boolean(selectFilters && selectFilters.length > 0);
|
|
34
|
+
const hasDates = Boolean(dateFilters && dateFilters.length > 0);
|
|
35
|
+
const hasFilters = showFilters && (hasSelects || hasDates);
|
|
36
|
+
const updateSelectFilter = (index, value) => {
|
|
37
|
+
if (!selectFilters || !onSelectFiltersChange) return;
|
|
38
|
+
const next = selectFilters.map(
|
|
39
|
+
(filter, idx) => idx === index ? { ...filter, value } : filter
|
|
40
|
+
);
|
|
41
|
+
onSelectFiltersChange(next);
|
|
42
|
+
};
|
|
43
|
+
const updateDateFilter = (index, key, value) => {
|
|
44
|
+
if (!dateFilters || !onDateFiltersChange) return;
|
|
45
|
+
const next = dateFilters.map(
|
|
46
|
+
(filter, idx) => idx === index ? { ...filter, [key]: value } : filter
|
|
47
|
+
);
|
|
48
|
+
onDateFiltersChange(next);
|
|
49
|
+
};
|
|
50
|
+
return /* @__PURE__ */ jsxs(
|
|
51
|
+
"div",
|
|
52
|
+
{
|
|
53
|
+
className: cn(
|
|
54
|
+
"rounded-3xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] p-4 text-[rgb(var(--nc-fg))] shadow-[0_12px_36px_rgba(0,0,0,0.2)] backdrop-blur-2xl",
|
|
55
|
+
className
|
|
56
|
+
),
|
|
57
|
+
"data-nc-theme": tone,
|
|
58
|
+
children: [
|
|
59
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center justify-between gap-4", children: [
|
|
60
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
61
|
+
title && /* @__PURE__ */ jsx("h3", { className: "text-lg font-semibold", children: title }),
|
|
62
|
+
description && /* @__PURE__ */ jsx("p", { className: "text-sm text-[rgb(var(--nc-fg-muted))]", children: description }),
|
|
63
|
+
typeof totalItems === "number" && /* @__PURE__ */ jsxs("p", { className: "text-xs text-[rgb(var(--nc-fg-muted))]", children: [
|
|
64
|
+
totalItems,
|
|
65
|
+
" ",
|
|
66
|
+
itemLabel
|
|
67
|
+
] })
|
|
68
|
+
] }),
|
|
69
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
|
|
70
|
+
showFileUpload && /* @__PURE__ */ jsx(
|
|
71
|
+
CraftInput,
|
|
72
|
+
{
|
|
73
|
+
type: "file",
|
|
74
|
+
accept: fileUploadAccept,
|
|
75
|
+
onChange: (event) => {
|
|
76
|
+
const files = event.target.files;
|
|
77
|
+
if (!files || files.length === 0) return;
|
|
78
|
+
if (typeof fileUploadMaxSize === "number" && files[0] && files[0].size > fileUploadMaxSize) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
onFilesSelected == null ? void 0 : onFilesSelected(files);
|
|
82
|
+
event.currentTarget.value = "";
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
),
|
|
86
|
+
addButton ? /* @__PURE__ */ jsx(
|
|
87
|
+
CraftButton,
|
|
88
|
+
{
|
|
89
|
+
type: "button",
|
|
90
|
+
variant: (_a = addButton.variant) != null ? _a : "outline",
|
|
91
|
+
size: (_b = addButton.size) != null ? _b : "sm",
|
|
92
|
+
disabled: addButton.disabled,
|
|
93
|
+
onClick: addButton.onClick,
|
|
94
|
+
children: addButton.label
|
|
95
|
+
}
|
|
96
|
+
) : null,
|
|
97
|
+
showClear && onClearFilters ? /* @__PURE__ */ jsx(CraftButton, { type: "button", variant: "ghost", onClick: onClearFilters, children: clearLabel }) : null
|
|
98
|
+
] })
|
|
99
|
+
] }),
|
|
100
|
+
(showSearch || hasFilters) && /* @__PURE__ */ jsxs("div", { className: "mt-4 grid gap-4", children: [
|
|
101
|
+
showSearch && /* @__PURE__ */ jsx(
|
|
102
|
+
CraftInput,
|
|
103
|
+
{
|
|
104
|
+
type: "search",
|
|
105
|
+
placeholder: searchPlaceholder,
|
|
106
|
+
value: searchValue != null ? searchValue : "",
|
|
107
|
+
onChange: (event) => onSearchChange == null ? void 0 : onSearchChange(event.target.value),
|
|
108
|
+
tone
|
|
109
|
+
}
|
|
110
|
+
),
|
|
111
|
+
hasFilters && /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-end gap-3", children: [
|
|
112
|
+
selectFilters == null ? void 0 : selectFilters.map((filter, index) => /* @__PURE__ */ jsxs("label", { className: "grid gap-2 text-xs", children: [
|
|
113
|
+
filter.label ? /* @__PURE__ */ jsx("span", { className: "text-[rgb(var(--nc-fg-muted))]", children: filter.label }) : null,
|
|
114
|
+
/* @__PURE__ */ jsxs(
|
|
115
|
+
CraftSelect,
|
|
116
|
+
{
|
|
117
|
+
value: filter.value,
|
|
118
|
+
disabled: filter.disabled,
|
|
119
|
+
onChange: (event) => updateSelectFilter(index, event.target.value),
|
|
120
|
+
children: [
|
|
121
|
+
filter.placeholder ? /* @__PURE__ */ jsx("option", { value: "", children: filter.placeholder }) : null,
|
|
122
|
+
filter.options.map((option) => /* @__PURE__ */ jsx("option", { value: option.value, children: option.label }, String(option.value)))
|
|
123
|
+
]
|
|
124
|
+
}
|
|
125
|
+
)
|
|
126
|
+
] }, filter.key)),
|
|
127
|
+
dateFilters == null ? void 0 : dateFilters.map((filter, index) => {
|
|
128
|
+
var _a2, _b2;
|
|
129
|
+
return /* @__PURE__ */ jsxs("div", { className: "grid gap-2 text-xs", children: [
|
|
130
|
+
filter.label ? /* @__PURE__ */ jsx("span", { className: "text-[rgb(var(--nc-fg-muted))]", children: filter.label }) : null,
|
|
131
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
132
|
+
/* @__PURE__ */ jsx(
|
|
133
|
+
CraftInput,
|
|
134
|
+
{
|
|
135
|
+
type: "date",
|
|
136
|
+
value: (_a2 = filter.from) != null ? _a2 : "",
|
|
137
|
+
onChange: (event) => updateDateFilter(index, "from", event.target.value)
|
|
138
|
+
}
|
|
139
|
+
),
|
|
140
|
+
/* @__PURE__ */ jsx(
|
|
141
|
+
CraftInput,
|
|
142
|
+
{
|
|
143
|
+
type: "date",
|
|
144
|
+
value: (_b2 = filter.to) != null ? _b2 : "",
|
|
145
|
+
onChange: (event) => updateDateFilter(index, "to", event.target.value)
|
|
146
|
+
}
|
|
147
|
+
)
|
|
148
|
+
] })
|
|
149
|
+
] }, filter.key);
|
|
150
|
+
})
|
|
151
|
+
] })
|
|
152
|
+
] })
|
|
153
|
+
]
|
|
154
|
+
}
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
export {
|
|
158
|
+
CraftDataTableFilters
|
|
159
|
+
};
|
|
160
|
+
//# sourceMappingURL=craft-data-table-filters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/craft-data-table-filters.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\nimport { CraftButton, type CraftButtonProps } from \"@/components/craft-button\";\nimport { CraftInput } from \"@/components/craft-input\";\nimport { CraftSelect } from \"@/components/craft-select\";\n\nexport type CraftDataTableFilterSelectOption = {\n label: React.ReactNode;\n value: string;\n};\n\nexport type CraftDataTableFilterSelect = {\n key: string;\n label?: React.ReactNode;\n value: string;\n placeholder?: string;\n options: CraftDataTableFilterSelectOption[];\n disabled?: boolean;\n};\n\nexport type CraftDataTableFilterDate = {\n key: string;\n label?: React.ReactNode;\n from?: string;\n to?: string;\n};\n\nexport type CraftDataTableFiltersProps = {\n title?: React.ReactNode;\n description?: React.ReactNode;\n\n searchValue?: string;\n onSearchChange?: (value: string) => void;\n searchPlaceholder?: string;\n showSearch?: boolean;\n\n addButton?: {\n label: React.ReactNode;\n icon?: React.ReactNode | string;\n variant?: CraftButtonProps[\"variant\"];\n size?: CraftButtonProps[\"size\"];\n disabled?: boolean;\n onClick: () => void;\n };\n\n selectFilters?: CraftDataTableFilterSelect[];\n onSelectFiltersChange?: (filters: CraftDataTableFilterSelect[]) => void;\n\n dateFilters?: CraftDataTableFilterDate[];\n onDateFiltersChange?: (filters: CraftDataTableFilterDate[]) => void;\n\n showFilters?: boolean;\n\n showClear?: boolean;\n clearLabel?: React.ReactNode;\n onClearFilters?: () => void;\n\n showFileUpload?: boolean;\n fileUploadAccept?: string;\n fileUploadMaxSize?: number;\n onFilesSelected?: (files: FileList) => void;\n\n totalItems?: number;\n itemLabel?: string;\n\n tone?: ThemeName;\n className?: string;\n};\n\nexport function CraftDataTableFilters({\n title,\n description,\n searchValue,\n onSearchChange,\n searchPlaceholder = \"Search...\",\n showSearch = true,\n addButton,\n selectFilters,\n onSelectFiltersChange,\n dateFilters,\n onDateFiltersChange,\n showFilters = true,\n showClear = true,\n clearLabel = \"Clear filters\",\n onClearFilters,\n showFileUpload = false,\n fileUploadAccept,\n fileUploadMaxSize,\n onFilesSelected,\n totalItems,\n itemLabel = \"items\",\n tone,\n className,\n}: CraftDataTableFiltersProps) {\n const hasSelects = Boolean(selectFilters && selectFilters.length > 0);\n const hasDates = Boolean(dateFilters && dateFilters.length > 0);\n const hasFilters = showFilters && (hasSelects || hasDates);\n\n const updateSelectFilter = (index: number, value: string) => {\n if (!selectFilters || !onSelectFiltersChange) return;\n const next = selectFilters.map((filter, idx) =>\n idx === index ? { ...filter, value } : filter\n );\n onSelectFiltersChange(next);\n };\n\n const updateDateFilter = (\n index: number,\n key: \"from\" | \"to\",\n value: string\n ) => {\n if (!dateFilters || !onDateFiltersChange) return;\n const next = dateFilters.map((filter, idx) =>\n idx === index ? { ...filter, [key]: value } : filter\n );\n onDateFiltersChange(next);\n };\n\n return (\n <div\n className={cn(\n \"rounded-3xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] p-4 text-[rgb(var(--nc-fg))] shadow-[0_12px_36px_rgba(0,0,0,0.2)] backdrop-blur-2xl\",\n className\n )}\n data-nc-theme={tone}\n >\n <div className=\"flex flex-wrap items-center justify-between gap-4\">\n <div>\n {title && <h3 className=\"text-lg font-semibold\">{title}</h3>}\n {description && (\n <p className=\"text-sm text-[rgb(var(--nc-fg-muted))]\">\n {description}\n </p>\n )}\n {typeof totalItems === \"number\" && (\n <p className=\"text-xs text-[rgb(var(--nc-fg-muted))]\">\n {totalItems} {itemLabel}\n </p>\n )}\n </div>\n\n <div className=\"flex items-center gap-3\">\n {showFileUpload && (\n <CraftInput\n type=\"file\"\n accept={fileUploadAccept}\n onChange={(event) => {\n const files = event.target.files;\n if (!files || files.length === 0) return;\n if (\n typeof fileUploadMaxSize === \"number\" &&\n files[0] &&\n files[0].size > fileUploadMaxSize\n ) {\n return;\n }\n onFilesSelected?.(files);\n event.currentTarget.value = \"\";\n }}\n />\n )}\n\n {addButton ? (\n <CraftButton\n type=\"button\"\n variant={addButton.variant ?? \"outline\"}\n size={addButton.size ?? \"sm\"}\n disabled={addButton.disabled}\n onClick={addButton.onClick}\n >\n {addButton.label}\n </CraftButton>\n ) : null}\n\n {showClear && onClearFilters ? (\n <CraftButton type=\"button\" variant=\"ghost\" onClick={onClearFilters}>\n {clearLabel}\n </CraftButton>\n ) : null}\n </div>\n </div>\n\n {(showSearch || hasFilters) && (\n <div className=\"mt-4 grid gap-4\">\n {showSearch && (\n <CraftInput\n type=\"search\"\n placeholder={searchPlaceholder}\n value={searchValue ?? \"\"}\n onChange={(event) => onSearchChange?.(event.target.value)}\n tone={tone}\n />\n )}\n\n {hasFilters && (\n <div className=\"flex flex-wrap items-end gap-3\">\n {selectFilters?.map((filter, index) => (\n <label key={filter.key} className=\"grid gap-2 text-xs\">\n {filter.label ? (\n <span className=\"text-[rgb(var(--nc-fg-muted))]\">\n {filter.label}\n </span>\n ) : null}\n <CraftSelect\n value={filter.value}\n disabled={filter.disabled}\n onChange={(event) =>\n updateSelectFilter(index, event.target.value)\n }\n >\n {filter.placeholder ? (\n <option value=\"\">{filter.placeholder}</option>\n ) : null}\n {filter.options.map((option) => (\n <option key={String(option.value)} value={option.value}>\n {option.label}\n </option>\n ))}\n </CraftSelect>\n </label>\n ))}\n\n {dateFilters?.map((filter, index) => (\n <div key={filter.key} className=\"grid gap-2 text-xs\">\n {filter.label ? (\n <span className=\"text-[rgb(var(--nc-fg-muted))]\">\n {filter.label}\n </span>\n ) : null}\n <div className=\"flex items-center gap-2\">\n <CraftInput\n type=\"date\"\n value={filter.from ?? \"\"}\n onChange={(event) =>\n updateDateFilter(index, \"from\", event.target.value)\n }\n />\n <CraftInput\n type=\"date\"\n value={filter.to ?? \"\"}\n onChange={(event) =>\n updateDateFilter(index, \"to\", event.target.value)\n }\n />\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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","names":["_a","_b"]}
|
|
@@ -30,7 +30,7 @@ const paddingClasses = {
|
|
|
30
30
|
comfortable: "px-8 py-5"
|
|
31
31
|
};
|
|
32
32
|
const variantClasses = {
|
|
33
|
-
default: "border-b border-[rgb(var(--nc-
|
|
33
|
+
default: "border-b border-[rgb(var(--nc-accent-1)/0.25)] bg-linear-to-r from-[rgb(var(--nc-accent-1)/0.08)] via-[rgb(var(--nc-accent-2)/0.05)] to-[rgb(var(--nc-accent-3)/0.08)]",
|
|
34
34
|
minimal: "border-b border-[rgb(var(--nc-border)/0.25)] bg-transparent"
|
|
35
35
|
};
|
|
36
36
|
function CraftDataTableHeader({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/craft-data-table-header.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\n\nexport type CraftDataTableHeaderProps = {\n title?: React.ReactNode;\n description?: React.ReactNode;\n actions?: React.ReactNode;\n filters?: React.ReactNode;\n tone?: ThemeName;\n variant?: \"default\" | \"minimal\";\n padding?: \"compact\" | \"normal\" | \"comfortable\";\n className?: string;\n};\n\nconst paddingClasses: Record<NonNullable<CraftDataTableHeaderProps[\"padding\"]>, string> = {\n compact: \"px-4 py-3\",\n normal: \"px-6 py-4\",\n comfortable: \"px-8 py-5\",\n};\n\nconst variantClasses: Record<NonNullable<CraftDataTableHeaderProps[\"variant\"]>, string> = {\n default:\n \"border-b border-[rgb(var(--nc-
|
|
1
|
+
{"version":3,"sources":["../../src/components/craft-data-table-header.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\n\nexport type CraftDataTableHeaderProps = {\n title?: React.ReactNode;\n description?: React.ReactNode;\n actions?: React.ReactNode;\n filters?: React.ReactNode;\n tone?: ThemeName;\n variant?: \"default\" | \"minimal\";\n padding?: \"compact\" | \"normal\" | \"comfortable\";\n className?: string;\n};\n\nconst paddingClasses: Record<NonNullable<CraftDataTableHeaderProps[\"padding\"]>, string> = {\n compact: \"px-4 py-3\",\n normal: \"px-6 py-4\",\n comfortable: \"px-8 py-5\",\n};\n\nconst variantClasses: Record<NonNullable<CraftDataTableHeaderProps[\"variant\"]>, string> = {\n default:\n \"border-b border-[rgb(var(--nc-accent-1)/0.25)] bg-linear-to-r from-[rgb(var(--nc-accent-1)/0.08)] via-[rgb(var(--nc-accent-2)/0.05)] to-[rgb(var(--nc-accent-3)/0.08)]\",\n minimal: \"border-b border-[rgb(var(--nc-border)/0.25)] bg-transparent\",\n};\n\nexport function CraftDataTableHeader({\n title,\n description,\n actions,\n filters,\n tone,\n variant = \"default\",\n padding = \"normal\",\n className,\n}: CraftDataTableHeaderProps) {\n if (!title && !description && !actions && !filters) return null;\n\n return (\n <div\n className={cn(\n \"flex flex-wrap items-start justify-between gap-4\",\n paddingClasses[padding],\n variantClasses[variant],\n className\n )}\n data-nc-theme={tone}\n >\n <div className=\"space-y-1\">\n {title ? <h3 className=\"text-lg font-semibold\">{title}</h3> : null}\n {description ? (\n <p className=\"text-sm text-[rgb(var(--nc-fg-muted))]\">{description}</p>\n ) : null}\n </div>\n <div className=\"flex flex-wrap items-center gap-3\">\n {filters}\n {actions}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAoDM;AAhDN,gBAAmB;AAcnB,MAAM,iBAAoF;AAAA,EACxF,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,aAAa;AACf;AAEA,MAAM,iBAAoF;AAAA,EACxF,SACE;AAAA,EACF,SAAS;AACX;AAEO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,UAAU;AAAA,EACV;AACF,GAA8B;AAC5B,MAAI,CAAC,SAAS,CAAC,eAAe,CAAC,WAAW,CAAC,QAAS,QAAO;AAE3D,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW;AAAA,QACT;AAAA,QACA,eAAe,OAAO;AAAA,QACtB,eAAe,OAAO;AAAA,QACtB;AAAA,MACF;AAAA,MACA,iBAAe;AAAA,MAEf;AAAA,qDAAC,SAAI,WAAU,aACZ;AAAA,kBAAQ,4CAAC,QAAG,WAAU,yBAAyB,iBAAM,IAAQ;AAAA,UAC7D,cACC,4CAAC,OAAE,WAAU,0CAA0C,uBAAY,IACjE;AAAA,WACN;AAAA,QACA,6CAAC,SAAI,WAAU,qCACZ;AAAA;AAAA,UACA;AAAA,WACH;AAAA;AAAA;AAAA,EACF;AAEJ;","names":[]}
|
|
@@ -7,7 +7,7 @@ const paddingClasses = {
|
|
|
7
7
|
comfortable: "px-8 py-5"
|
|
8
8
|
};
|
|
9
9
|
const variantClasses = {
|
|
10
|
-
default: "border-b border-[rgb(var(--nc-
|
|
10
|
+
default: "border-b border-[rgb(var(--nc-accent-1)/0.25)] bg-linear-to-r from-[rgb(var(--nc-accent-1)/0.08)] via-[rgb(var(--nc-accent-2)/0.05)] to-[rgb(var(--nc-accent-3)/0.08)]",
|
|
11
11
|
minimal: "border-b border-[rgb(var(--nc-border)/0.25)] bg-transparent"
|
|
12
12
|
};
|
|
13
13
|
function CraftDataTableHeader({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/craft-data-table-header.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\n\nexport type CraftDataTableHeaderProps = {\n title?: React.ReactNode;\n description?: React.ReactNode;\n actions?: React.ReactNode;\n filters?: React.ReactNode;\n tone?: ThemeName;\n variant?: \"default\" | \"minimal\";\n padding?: \"compact\" | \"normal\" | \"comfortable\";\n className?: string;\n};\n\nconst paddingClasses: Record<NonNullable<CraftDataTableHeaderProps[\"padding\"]>, string> = {\n compact: \"px-4 py-3\",\n normal: \"px-6 py-4\",\n comfortable: \"px-8 py-5\",\n};\n\nconst variantClasses: Record<NonNullable<CraftDataTableHeaderProps[\"variant\"]>, string> = {\n default:\n \"border-b border-[rgb(var(--nc-
|
|
1
|
+
{"version":3,"sources":["../../src/components/craft-data-table-header.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\n\nexport type CraftDataTableHeaderProps = {\n title?: React.ReactNode;\n description?: React.ReactNode;\n actions?: React.ReactNode;\n filters?: React.ReactNode;\n tone?: ThemeName;\n variant?: \"default\" | \"minimal\";\n padding?: \"compact\" | \"normal\" | \"comfortable\";\n className?: string;\n};\n\nconst paddingClasses: Record<NonNullable<CraftDataTableHeaderProps[\"padding\"]>, string> = {\n compact: \"px-4 py-3\",\n normal: \"px-6 py-4\",\n comfortable: \"px-8 py-5\",\n};\n\nconst variantClasses: Record<NonNullable<CraftDataTableHeaderProps[\"variant\"]>, string> = {\n default:\n \"border-b border-[rgb(var(--nc-accent-1)/0.25)] bg-linear-to-r from-[rgb(var(--nc-accent-1)/0.08)] via-[rgb(var(--nc-accent-2)/0.05)] to-[rgb(var(--nc-accent-3)/0.08)]\",\n minimal: \"border-b border-[rgb(var(--nc-border)/0.25)] bg-transparent\",\n};\n\nexport function CraftDataTableHeader({\n title,\n description,\n actions,\n filters,\n tone,\n variant = \"default\",\n padding = \"normal\",\n className,\n}: CraftDataTableHeaderProps) {\n if (!title && !description && !actions && !filters) return null;\n\n return (\n <div\n className={cn(\n \"flex flex-wrap items-start justify-between gap-4\",\n paddingClasses[padding],\n variantClasses[variant],\n className\n )}\n data-nc-theme={tone}\n >\n <div className=\"space-y-1\">\n {title ? <h3 className=\"text-lg font-semibold\">{title}</h3> : null}\n {description ? (\n <p className=\"text-sm text-[rgb(var(--nc-fg-muted))]\">{description}</p>\n ) : null}\n </div>\n <div className=\"flex flex-wrap items-center gap-3\">\n {filters}\n {actions}\n </div>\n </div>\n );\n}\n"],"mappings":";AAoDM,SACW,KADX;AAhDN,SAAS,UAAU;AAcnB,MAAM,iBAAoF;AAAA,EACxF,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,aAAa;AACf;AAEA,MAAM,iBAAoF;AAAA,EACxF,SACE;AAAA,EACF,SAAS;AACX;AAEO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,UAAU;AAAA,EACV;AACF,GAA8B;AAC5B,MAAI,CAAC,SAAS,CAAC,eAAe,CAAC,WAAW,CAAC,QAAS,QAAO;AAE3D,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,eAAe,OAAO;AAAA,QACtB,eAAe,OAAO;AAAA,QACtB;AAAA,MACF;AAAA,MACA,iBAAe;AAAA,MAEf;AAAA,6BAAC,SAAI,WAAU,aACZ;AAAA,kBAAQ,oBAAC,QAAG,WAAU,yBAAyB,iBAAM,IAAQ;AAAA,UAC7D,cACC,oBAAC,OAAE,WAAU,0CAA0C,uBAAY,IACjE;AAAA,WACN;AAAA,QACA,qBAAC,SAAI,WAAU,qCACZ;AAAA;AAAA,UACA;AAAA,WACH;AAAA;AAAA;AAAA,EACF;AAEJ;","names":[]}
|