@arqel-dev/ui 0.15.0 → 0.15.1
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/README.md +1 -1
- package/dist/{AreaChart-NMQ2RQGA.js → AreaChart-JAZ6LUYG.js} +8 -4
- package/dist/AreaChart-JAZ6LUYG.js.map +1 -0
- package/dist/ArqelCreatePage-UZAHV4DK.js +8 -0
- package/dist/{ArqelCreatePage-MV4JN2MO.js.map → ArqelCreatePage-UZAHV4DK.js.map} +1 -1
- package/dist/ArqelDashboardPage-Z5R4XSH4.js +6 -0
- package/dist/{ArqelDashboardPage-QK3BYVK3.js.map → ArqelDashboardPage-Z5R4XSH4.js.map} +1 -1
- package/dist/ArqelEditPage-RRYFYOTC.js +8 -0
- package/dist/{ArqelShowPage-5WWUSYC7.js.map → ArqelEditPage-RRYFYOTC.js.map} +1 -1
- package/dist/ArqelIndexPage-RGZWKKAX.js +12 -0
- package/dist/{ArqelIndexPage-R6JL5KOH.js.map → ArqelIndexPage-RGZWKKAX.js.map} +1 -1
- package/dist/ArqelShowPage-TVCJAV2F.js +6 -0
- package/dist/{ArqelEditPage-7J3IS2BR.js.map → ArqelShowPage-TVCJAV2F.js.map} +1 -1
- package/dist/{BarChart-KLHKTLO2.js → BarChart-E52NJSJE.js} +8 -4
- package/dist/BarChart-E52NJSJE.js.map +1 -0
- package/dist/{DonutChart-L56R4QF2.js → DonutChart-IGSF4LEB.js} +3 -3
- package/dist/{DonutChart-L56R4QF2.js.map → DonutChart-IGSF4LEB.js.map} +1 -1
- package/dist/{FormRenderer-BJBRIkfH.d.ts → FormRenderer-By8fZp4t.d.ts} +2 -0
- package/dist/{LineChart-GHMPHFZZ.js → LineChart-RRPGAZON.js} +8 -4
- package/dist/LineChart-RRPGAZON.js.map +1 -0
- package/dist/PieChart-SGN7V5LQ.js +4 -0
- package/dist/{PieChart-T2VQOFPP.js.map → PieChart-SGN7V5LQ.js.map} +1 -1
- package/dist/{RadarChart-CSWR5AO7.js → RadarChart-3AOM736J.js} +8 -4
- package/dist/RadarChart-3AOM736J.js.map +1 -0
- package/dist/action.js +2 -2
- package/dist/{chunk-FP5R6WED.js → chunk-2JUWLJ3K.js} +21 -13
- package/dist/chunk-2JUWLJ3K.js.map +1 -0
- package/dist/{chunk-BJER6TOI.js → chunk-3VSDQCFO.js} +3 -3
- package/dist/{chunk-BJER6TOI.js.map → chunk-3VSDQCFO.js.map} +1 -1
- package/dist/{chunk-N5U2BB6T.js → chunk-4VWNBMMA.js} +8 -6
- package/dist/chunk-4VWNBMMA.js.map +1 -0
- package/dist/{chunk-ZAM5TUPP.js → chunk-CMNZLA32.js} +60 -25
- package/dist/chunk-CMNZLA32.js.map +1 -0
- package/dist/{chunk-CVAMCRLL.js → chunk-EG2DASKR.js} +8 -4
- package/dist/chunk-EG2DASKR.js.map +1 -0
- package/dist/{chunk-DSULVRB6.js → chunk-GJ2FKAOM.js} +5 -3
- package/dist/chunk-GJ2FKAOM.js.map +1 -0
- package/dist/{chunk-FV7RESKL.js → chunk-HNUUZEOL.js} +28 -16
- package/dist/chunk-HNUUZEOL.js.map +1 -0
- package/dist/{chunk-37FLEB4N.js → chunk-IO6RMVUF.js} +8 -4
- package/dist/chunk-IO6RMVUF.js.map +1 -0
- package/dist/{chunk-4I5S6MH3.js → chunk-LLANMODS.js} +4 -4
- package/dist/{chunk-4I5S6MH3.js.map → chunk-LLANMODS.js.map} +1 -1
- package/dist/{chunk-N6WLCHQE.js → chunk-Q7WGPKUN.js} +6 -4
- package/dist/chunk-Q7WGPKUN.js.map +1 -0
- package/dist/{chunk-AZICSFBA.js → chunk-S5UNPCMQ.js} +112 -38
- package/dist/chunk-S5UNPCMQ.js.map +1 -0
- package/dist/{chunk-MTNFFSVA.js → chunk-SK6H7ARE.js} +5 -3
- package/dist/chunk-SK6H7ARE.js.map +1 -0
- package/dist/{chunk-PSPJA5U6.js → chunk-WMOBLT3Z.js} +10 -5
- package/dist/chunk-WMOBLT3Z.js.map +1 -0
- package/dist/{chunk-C5H44NSP.js → chunk-WZRPGPLH.js} +10 -5
- package/dist/chunk-WZRPGPLH.js.map +1 -0
- package/dist/{chunk-UXN67E5L.js → chunk-YQ6KXR3U.js} +8 -10
- package/dist/chunk-YQ6KXR3U.js.map +1 -0
- package/dist/{chunk-HSDZM4AM.js → chunk-YYQ45W25.js} +37 -24
- package/dist/chunk-YYQ45W25.js.map +1 -0
- package/dist/flash.js +1 -1
- package/dist/form.d.ts +3 -1
- package/dist/form.js +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +9 -9
- package/dist/pages.js +16 -16
- package/dist/palette.js +1 -1
- package/dist/resource.js +2 -2
- package/dist/shell.js +8 -4
- package/dist/shell.js.map +1 -1
- package/dist/table.js +1 -1
- package/dist/utility.js +1 -1
- package/dist/widgets.js +2 -2
- package/package.json +6 -6
- package/dist/AreaChart-NMQ2RQGA.js.map +0 -1
- package/dist/ArqelCreatePage-MV4JN2MO.js +0 -8
- package/dist/ArqelDashboardPage-QK3BYVK3.js +0 -6
- package/dist/ArqelEditPage-7J3IS2BR.js +0 -8
- package/dist/ArqelIndexPage-R6JL5KOH.js +0 -12
- package/dist/ArqelShowPage-5WWUSYC7.js +0 -6
- package/dist/BarChart-KLHKTLO2.js.map +0 -1
- package/dist/LineChart-GHMPHFZZ.js.map +0 -1
- package/dist/PieChart-T2VQOFPP.js +0 -4
- package/dist/RadarChart-CSWR5AO7.js.map +0 -1
- package/dist/chunk-37FLEB4N.js.map +0 -1
- package/dist/chunk-AZICSFBA.js.map +0 -1
- package/dist/chunk-C5H44NSP.js.map +0 -1
- package/dist/chunk-CVAMCRLL.js.map +0 -1
- package/dist/chunk-DSULVRB6.js.map +0 -1
- package/dist/chunk-FP5R6WED.js.map +0 -1
- package/dist/chunk-FV7RESKL.js.map +0 -1
- package/dist/chunk-HSDZM4AM.js.map +0 -1
- package/dist/chunk-MTNFFSVA.js.map +0 -1
- package/dist/chunk-N5U2BB6T.js.map +0 -1
- package/dist/chunk-N6WLCHQE.js.map +0 -1
- package/dist/chunk-PSPJA5U6.js.map +0 -1
- package/dist/chunk-UXN67E5L.js.map +0 -1
- package/dist/chunk-ZAM5TUPP.js.map +0 -1
package/README.md
CHANGED
|
@@ -14,7 +14,7 @@ Structural React components for [Arqel](https://arqel.dev) admin panels.
|
|
|
14
14
|
|
|
15
15
|
```bash
|
|
16
16
|
pnpm add @arqel-dev/ui @arqel-dev/react @arqel-dev/hooks @arqel-dev/types
|
|
17
|
-
pnpm add @inertiajs/react react react-dom @
|
|
17
|
+
pnpm add @inertiajs/react react react-dom @tanstack/react-table lucide-react recharts
|
|
18
18
|
```
|
|
19
19
|
|
|
20
20
|
## Usage
|
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
import { toRowShape, colorFor } from './chunk-L3JBBN4H.js';
|
|
2
|
+
import { useArqelLocale } from '@arqel-dev/react/utils';
|
|
3
|
+
import { useMemo } from 'react';
|
|
2
4
|
import { ResponsiveContainer, AreaChart as AreaChart$1, CartesianGrid, XAxis, YAxis, Tooltip, Legend, Area } from 'recharts';
|
|
3
5
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
4
6
|
|
|
5
7
|
function AreaChart({ chartData, height, showLegend, showGrid }) {
|
|
6
8
|
const rows = toRowShape(chartData);
|
|
9
|
+
const locale = useArqelLocale();
|
|
10
|
+
const nf = useMemo(() => new Intl.NumberFormat(locale), [locale]);
|
|
7
11
|
return /* @__PURE__ */ jsx("div", { "data-testid": "chart-area", style: { width: "100%", height }, children: /* @__PURE__ */ jsx(ResponsiveContainer, { width: "100%", height: "100%", children: /* @__PURE__ */ jsxs(AreaChart$1, { data: rows, children: [
|
|
8
12
|
showGrid ? /* @__PURE__ */ jsx(CartesianGrid, { strokeDasharray: "3 3" }) : null,
|
|
9
13
|
/* @__PURE__ */ jsx(XAxis, { dataKey: "name" }),
|
|
10
|
-
/* @__PURE__ */ jsx(YAxis, {}),
|
|
11
|
-
/* @__PURE__ */ jsx(Tooltip, {}),
|
|
14
|
+
/* @__PURE__ */ jsx(YAxis, { tickFormatter: (v) => nf.format(Number(v)) }),
|
|
15
|
+
/* @__PURE__ */ jsx(Tooltip, { formatter: (v) => nf.format(Number(v)) }),
|
|
12
16
|
showLegend ? /* @__PURE__ */ jsx(Legend, {}) : null,
|
|
13
17
|
chartData.datasets.map((ds, i) => {
|
|
14
18
|
const color = colorFor(ds, i);
|
|
@@ -29,5 +33,5 @@ function AreaChart({ chartData, height, showLegend, showGrid }) {
|
|
|
29
33
|
}
|
|
30
34
|
|
|
31
35
|
export { AreaChart };
|
|
32
|
-
//# sourceMappingURL=AreaChart-
|
|
33
|
-
//# sourceMappingURL=AreaChart-
|
|
36
|
+
//# sourceMappingURL=AreaChart-JAZ6LUYG.js.map
|
|
37
|
+
//# sourceMappingURL=AreaChart-JAZ6LUYG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/widgets/charts/AreaChart.tsx"],"names":["RechartsAreaChart"],"mappings":";;;;;;AAcO,SAAS,UAAU,EAAE,SAAA,EAAW,MAAA,EAAQ,UAAA,EAAY,UAAS,EAAkB;AACpF,EAAA,MAAM,IAAA,GAAO,WAAW,SAAS,CAAA;AACjC,EAAA,MAAM,SAAS,cAAA,EAAe;AAC9B,EAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,MAAM,IAAI,IAAA,CAAK,aAAa,MAAM,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAChE,EAAA,2BACG,KAAA,EAAA,EAAI,aAAA,EAAY,cAAa,KAAA,EAAO,EAAE,OAAO,MAAA,EAAQ,MAAA,IACpD,QAAA,kBAAA,GAAA,CAAC,mBAAA,EAAA,EAAoB,OAAM,MAAA,EAAO,MAAA,EAAO,QACvC,QAAA,kBAAA,IAAA,CAACA,WAAA,EAAA,EAAkB,MAAM,IAAA,EACtB,QAAA,EAAA;AAAA,IAAA,QAAA,mBAAW,GAAA,CAAC,aAAA,EAAA,EAAc,eAAA,EAAgB,KAAA,EAAM,CAAA,GAAK,IAAA;AAAA,oBACtD,GAAA,CAAC,KAAA,EAAA,EAAM,OAAA,EAAQ,MAAA,EAAO,CAAA;AAAA,oBACtB,GAAA,CAAC,KAAA,EAAA,EAAM,aAAA,EAAe,CAAC,CAAA,KAAM,GAAG,MAAA,CAAO,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,CAAA;AAAA,oBACnD,GAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAW,CAAC,CAAA,KAAM,GAAG,MAAA,CAAO,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,CAAA;AAAA,IAChD,UAAA,mBAAa,GAAA,CAAC,MAAA,EAAA,EAAO,CAAA,GAAK,IAAA;AAAA,IAC1B,SAAA,CAAU,QAAA,CAAS,GAAA,CAAI,CAAC,IAAI,CAAA,KAAM;AACjC,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,EAAA,EAAI,CAAC,CAAA;AAC5B,MAAA,uBACE,GAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UAEC,IAAA,EAAK,UAAA;AAAA,UACL,OAAA,EAAS,UAAU,CAAC,CAAA,CAAA;AAAA,UACpB,MAAM,EAAA,CAAG,KAAA;AAAA,UACT,MAAA,EAAQ,KAAA;AAAA,UACR,IAAA,EAAM,KAAA;AAAA,UACN,WAAA,EAAa;AAAA,SAAA;AAAA,QANR,EAAA,CAAG;AAAA,OAOV;AAAA,IAEJ,CAAC;AAAA,GAAA,EACH,GACF,CAAA,EACF,CAAA;AAEJ","file":"AreaChart-JAZ6LUYG.js","sourcesContent":["import { useArqelLocale } from '@arqel-dev/react/utils';\nimport { useMemo } from 'react';\nimport {\n Area,\n CartesianGrid,\n Legend,\n AreaChart as RechartsAreaChart,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport { type ChartSubProps, colorFor, toRowShape } from '../types';\n\nexport function AreaChart({ chartData, height, showLegend, showGrid }: ChartSubProps) {\n const rows = toRowShape(chartData);\n const locale = useArqelLocale();\n const nf = useMemo(() => new Intl.NumberFormat(locale), [locale]);\n return (\n <div data-testid=\"chart-area\" style={{ width: '100%', height }}>\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <RechartsAreaChart data={rows}>\n {showGrid ? <CartesianGrid strokeDasharray=\"3 3\" /> : null}\n <XAxis dataKey=\"name\" />\n <YAxis tickFormatter={(v) => nf.format(Number(v))} />\n <Tooltip formatter={(v) => nf.format(Number(v))} />\n {showLegend ? <Legend /> : null}\n {chartData.datasets.map((ds, i) => {\n const color = colorFor(ds, i);\n return (\n <Area\n key={ds.label}\n type=\"monotone\"\n dataKey={`dataset${i}`}\n name={ds.label}\n stroke={color}\n fill={color}\n fillOpacity={0.3}\n />\n );\n })}\n </RechartsAreaChart>\n </ResponsiveContainer>\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { ArqelCreatePage as default } from './chunk-IO6RMVUF.js';
|
|
2
|
+
import './chunk-MXUXMHOK.js';
|
|
3
|
+
import './chunk-MZMYV43C.js';
|
|
4
|
+
import './chunk-CMNZLA32.js';
|
|
5
|
+
import './chunk-H23VX3RR.js';
|
|
6
|
+
import './chunk-B7ULUJVO.js';
|
|
7
|
+
//# sourceMappingURL=ArqelCreatePage-UZAHV4DK.js.map
|
|
8
|
+
//# sourceMappingURL=ArqelCreatePage-UZAHV4DK.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"ArqelCreatePage-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"ArqelCreatePage-UZAHV4DK.js"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { ArqelDashboardPage as default } from './chunk-3VSDQCFO.js';
|
|
2
|
+
import './chunk-YYQ45W25.js';
|
|
3
|
+
import './chunk-WMOBLT3Z.js';
|
|
4
|
+
import './chunk-B7ULUJVO.js';
|
|
5
|
+
//# sourceMappingURL=ArqelDashboardPage-Z5R4XSH4.js.map
|
|
6
|
+
//# sourceMappingURL=ArqelDashboardPage-Z5R4XSH4.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"ArqelDashboardPage-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"ArqelDashboardPage-Z5R4XSH4.js"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { ArqelEditPage as default } from './chunk-YQ6KXR3U.js';
|
|
2
|
+
import './chunk-MXUXMHOK.js';
|
|
3
|
+
import './chunk-MZMYV43C.js';
|
|
4
|
+
import './chunk-CMNZLA32.js';
|
|
5
|
+
import './chunk-H23VX3RR.js';
|
|
6
|
+
import './chunk-B7ULUJVO.js';
|
|
7
|
+
//# sourceMappingURL=ArqelEditPage-RRYFYOTC.js.map
|
|
8
|
+
//# sourceMappingURL=ArqelEditPage-RRYFYOTC.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"ArqelEditPage-RRYFYOTC.js"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { ArqelIndexPage as default } from './chunk-LLANMODS.js';
|
|
2
|
+
import './chunk-EG2DASKR.js';
|
|
3
|
+
import './chunk-S5UNPCMQ.js';
|
|
4
|
+
import './chunk-RMPOR2YZ.js';
|
|
5
|
+
import './chunk-2JUWLJ3K.js';
|
|
6
|
+
import './chunk-3HN4ARGG.js';
|
|
7
|
+
import './chunk-MZMYV43C.js';
|
|
8
|
+
import './chunk-CMNZLA32.js';
|
|
9
|
+
import './chunk-H23VX3RR.js';
|
|
10
|
+
import './chunk-B7ULUJVO.js';
|
|
11
|
+
//# sourceMappingURL=ArqelIndexPage-RGZWKKAX.js.map
|
|
12
|
+
//# sourceMappingURL=ArqelIndexPage-RGZWKKAX.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"ArqelIndexPage-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"ArqelIndexPage-RGZWKKAX.js"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"ArqelShowPage-TVCJAV2F.js"}
|
|
@@ -1,19 +1,23 @@
|
|
|
1
1
|
import { toRowShape, colorFor } from './chunk-L3JBBN4H.js';
|
|
2
|
+
import { useArqelLocale } from '@arqel-dev/react/utils';
|
|
3
|
+
import { useMemo } from 'react';
|
|
2
4
|
import { ResponsiveContainer, BarChart as BarChart$1, CartesianGrid, XAxis, YAxis, Tooltip, Legend, Bar } from 'recharts';
|
|
3
5
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
4
6
|
|
|
5
7
|
function BarChart({ chartData, height, showLegend, showGrid }) {
|
|
6
8
|
const rows = toRowShape(chartData);
|
|
9
|
+
const locale = useArqelLocale();
|
|
10
|
+
const nf = useMemo(() => new Intl.NumberFormat(locale), [locale]);
|
|
7
11
|
return /* @__PURE__ */ jsx("div", { "data-testid": "chart-bar", style: { width: "100%", height }, children: /* @__PURE__ */ jsx(ResponsiveContainer, { width: "100%", height: "100%", children: /* @__PURE__ */ jsxs(BarChart$1, { data: rows, children: [
|
|
8
12
|
showGrid ? /* @__PURE__ */ jsx(CartesianGrid, { strokeDasharray: "3 3" }) : null,
|
|
9
13
|
/* @__PURE__ */ jsx(XAxis, { dataKey: "name" }),
|
|
10
|
-
/* @__PURE__ */ jsx(YAxis, {}),
|
|
11
|
-
/* @__PURE__ */ jsx(Tooltip, {}),
|
|
14
|
+
/* @__PURE__ */ jsx(YAxis, { tickFormatter: (v) => nf.format(Number(v)) }),
|
|
15
|
+
/* @__PURE__ */ jsx(Tooltip, { formatter: (v) => nf.format(Number(v)) }),
|
|
12
16
|
showLegend ? /* @__PURE__ */ jsx(Legend, {}) : null,
|
|
13
17
|
chartData.datasets.map((ds, i) => /* @__PURE__ */ jsx(Bar, { dataKey: `dataset${i}`, name: ds.label, fill: colorFor(ds, i) }, ds.label))
|
|
14
18
|
] }) }) });
|
|
15
19
|
}
|
|
16
20
|
|
|
17
21
|
export { BarChart };
|
|
18
|
-
//# sourceMappingURL=BarChart-
|
|
19
|
-
//# sourceMappingURL=BarChart-
|
|
22
|
+
//# sourceMappingURL=BarChart-E52NJSJE.js.map
|
|
23
|
+
//# sourceMappingURL=BarChart-E52NJSJE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/widgets/charts/BarChart.tsx"],"names":["RechartsBarChart"],"mappings":";;;;;;AAcO,SAAS,SAAS,EAAE,SAAA,EAAW,MAAA,EAAQ,UAAA,EAAY,UAAS,EAAkB;AACnF,EAAA,MAAM,IAAA,GAAO,WAAW,SAAS,CAAA;AACjC,EAAA,MAAM,SAAS,cAAA,EAAe;AAC9B,EAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,MAAM,IAAI,IAAA,CAAK,aAAa,MAAM,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAChE,EAAA,2BACG,KAAA,EAAA,EAAI,aAAA,EAAY,aAAY,KAAA,EAAO,EAAE,OAAO,MAAA,EAAQ,MAAA,IACnD,QAAA,kBAAA,GAAA,CAAC,mBAAA,EAAA,EAAoB,OAAM,MAAA,EAAO,MAAA,EAAO,QACvC,QAAA,kBAAA,IAAA,CAACA,UAAA,EAAA,EAAiB,MAAM,IAAA,EACrB,QAAA,EAAA;AAAA,IAAA,QAAA,mBAAW,GAAA,CAAC,aAAA,EAAA,EAAc,eAAA,EAAgB,KAAA,EAAM,CAAA,GAAK,IAAA;AAAA,oBACtD,GAAA,CAAC,KAAA,EAAA,EAAM,OAAA,EAAQ,MAAA,EAAO,CAAA;AAAA,oBACtB,GAAA,CAAC,KAAA,EAAA,EAAM,aAAA,EAAe,CAAC,CAAA,KAAM,GAAG,MAAA,CAAO,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,CAAA;AAAA,oBACnD,GAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAW,CAAC,CAAA,KAAM,GAAG,MAAA,CAAO,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,CAAA;AAAA,IAChD,UAAA,mBAAa,GAAA,CAAC,MAAA,EAAA,EAAO,CAAA,GAAK,IAAA;AAAA,IAC1B,SAAA,CAAU,SAAS,GAAA,CAAI,CAAC,IAAI,CAAA,qBAC3B,GAAA,CAAC,GAAA,EAAA,EAAmB,OAAA,EAAS,CAAA,OAAA,EAAU,CAAC,IAAI,IAAA,EAAM,EAAA,CAAG,OAAO,IAAA,EAAM,QAAA,CAAS,IAAI,CAAC,CAAA,EAAA,EAAtE,EAAA,CAAG,KAAsE,CACpF;AAAA,GAAA,EACH,GACF,CAAA,EACF,CAAA;AAEJ","file":"BarChart-E52NJSJE.js","sourcesContent":["import { useArqelLocale } from '@arqel-dev/react/utils';\nimport { useMemo } from 'react';\nimport {\n Bar,\n CartesianGrid,\n Legend,\n BarChart as RechartsBarChart,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport { type ChartSubProps, colorFor, toRowShape } from '../types';\n\nexport function BarChart({ chartData, height, showLegend, showGrid }: ChartSubProps) {\n const rows = toRowShape(chartData);\n const locale = useArqelLocale();\n const nf = useMemo(() => new Intl.NumberFormat(locale), [locale]);\n return (\n <div data-testid=\"chart-bar\" style={{ width: '100%', height }}>\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <RechartsBarChart data={rows}>\n {showGrid ? <CartesianGrid strokeDasharray=\"3 3\" /> : null}\n <XAxis dataKey=\"name\" />\n <YAxis tickFormatter={(v) => nf.format(Number(v))} />\n <Tooltip formatter={(v) => nf.format(Number(v))} />\n {showLegend ? <Legend /> : null}\n {chartData.datasets.map((ds, i) => (\n <Bar key={ds.label} dataKey={`dataset${i}`} name={ds.label} fill={colorFor(ds, i)} />\n ))}\n </RechartsBarChart>\n </ResponsiveContainer>\n </div>\n );\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { PieChart } from './chunk-
|
|
1
|
+
import { PieChart } from './chunk-WZRPGPLH.js';
|
|
2
2
|
import './chunk-L3JBBN4H.js';
|
|
3
3
|
import { jsx } from 'react/jsx-runtime';
|
|
4
4
|
|
|
@@ -7,5 +7,5 @@ function DonutChart(props) {
|
|
|
7
7
|
}
|
|
8
8
|
|
|
9
9
|
export { DonutChart };
|
|
10
|
-
//# sourceMappingURL=DonutChart-
|
|
11
|
-
//# sourceMappingURL=DonutChart-
|
|
10
|
+
//# sourceMappingURL=DonutChart-IGSF4LEB.js.map
|
|
11
|
+
//# sourceMappingURL=DonutChart-IGSF4LEB.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/widgets/charts/DonutChart.tsx"],"names":[],"mappings":";;;;AAOO,SAAS,WAAW,KAAA,EAAsB;AAC/C,EAAA,2BAAQ,QAAA,EAAA,EAAU,GAAG,OAAO,WAAA,EAAa,EAAA,EAAI,QAAO,aAAA,EAAc,CAAA;AACpE","file":"DonutChart-
|
|
1
|
+
{"version":3,"sources":["../src/widgets/charts/DonutChart.tsx"],"names":[],"mappings":";;;;AAOO,SAAS,WAAW,KAAA,EAAsB;AAC/C,EAAA,2BAAQ,QAAA,EAAA,EAAU,GAAG,OAAO,WAAA,EAAa,EAAA,EAAI,QAAO,aAAA,EAAc,CAAA;AACpE","file":"DonutChart-IGSF4LEB.js","sourcesContent":["import type { ChartSubProps } from '../types';\nimport { PieChart } from './PieChart';\n\n/**\n * DonutChart is a PieChart with a non-zero innerRadius. We delegate so the\n * Recharts primitives stay in one chunk per shape (pie ≡ donut visually).\n */\nexport function DonutChart(props: ChartSubProps) {\n return <PieChart {...props} innerRadius={60} testId=\"chart-donut\" />;\n}\n"]}
|
|
@@ -24,6 +24,8 @@ interface FieldRendererProps {
|
|
|
24
24
|
className?: string | undefined;
|
|
25
25
|
inputId?: string | undefined;
|
|
26
26
|
describedBy?: string | undefined;
|
|
27
|
+
/** Whether the field is in an error state (sets `aria-invalid` on the input). */
|
|
28
|
+
invalid?: boolean | undefined;
|
|
27
29
|
}
|
|
28
30
|
declare function FieldRenderer(props: FieldRendererProps): ReactNode;
|
|
29
31
|
|
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
import { toRowShape, colorFor } from './chunk-L3JBBN4H.js';
|
|
2
|
+
import { useArqelLocale } from '@arqel-dev/react/utils';
|
|
3
|
+
import { useMemo } from 'react';
|
|
2
4
|
import { ResponsiveContainer, LineChart as LineChart$1, CartesianGrid, XAxis, YAxis, Tooltip, Legend, Line } from 'recharts';
|
|
3
5
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
4
6
|
|
|
5
7
|
function LineChart({ chartData, height, showLegend, showGrid }) {
|
|
6
8
|
const rows = toRowShape(chartData);
|
|
9
|
+
const locale = useArqelLocale();
|
|
10
|
+
const nf = useMemo(() => new Intl.NumberFormat(locale), [locale]);
|
|
7
11
|
return /* @__PURE__ */ jsx("div", { "data-testid": "chart-line", style: { width: "100%", height }, children: /* @__PURE__ */ jsx(ResponsiveContainer, { width: "100%", height: "100%", children: /* @__PURE__ */ jsxs(LineChart$1, { data: rows, children: [
|
|
8
12
|
showGrid ? /* @__PURE__ */ jsx(CartesianGrid, { strokeDasharray: "3 3" }) : null,
|
|
9
13
|
/* @__PURE__ */ jsx(XAxis, { dataKey: "name" }),
|
|
10
|
-
/* @__PURE__ */ jsx(YAxis, {}),
|
|
11
|
-
/* @__PURE__ */ jsx(Tooltip, {}),
|
|
14
|
+
/* @__PURE__ */ jsx(YAxis, { tickFormatter: (v) => nf.format(Number(v)) }),
|
|
15
|
+
/* @__PURE__ */ jsx(Tooltip, { formatter: (v) => nf.format(Number(v)) }),
|
|
12
16
|
showLegend ? /* @__PURE__ */ jsx(Legend, {}) : null,
|
|
13
17
|
chartData.datasets.map((ds, i) => /* @__PURE__ */ jsx(
|
|
14
18
|
Line,
|
|
@@ -26,5 +30,5 @@ function LineChart({ chartData, height, showLegend, showGrid }) {
|
|
|
26
30
|
}
|
|
27
31
|
|
|
28
32
|
export { LineChart };
|
|
29
|
-
//# sourceMappingURL=LineChart-
|
|
30
|
-
//# sourceMappingURL=LineChart-
|
|
33
|
+
//# sourceMappingURL=LineChart-RRPGAZON.js.map
|
|
34
|
+
//# sourceMappingURL=LineChart-RRPGAZON.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/widgets/charts/LineChart.tsx"],"names":["RechartsLineChart"],"mappings":";;;;;;AAcO,SAAS,UAAU,EAAE,SAAA,EAAW,MAAA,EAAQ,UAAA,EAAY,UAAS,EAAkB;AACpF,EAAA,MAAM,IAAA,GAAO,WAAW,SAAS,CAAA;AACjC,EAAA,MAAM,SAAS,cAAA,EAAe;AAC9B,EAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,MAAM,IAAI,IAAA,CAAK,aAAa,MAAM,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAChE,EAAA,2BACG,KAAA,EAAA,EAAI,aAAA,EAAY,cAAa,KAAA,EAAO,EAAE,OAAO,MAAA,EAAQ,MAAA,IACpD,QAAA,kBAAA,GAAA,CAAC,mBAAA,EAAA,EAAoB,OAAM,MAAA,EAAO,MAAA,EAAO,QACvC,QAAA,kBAAA,IAAA,CAACA,WAAA,EAAA,EAAkB,MAAM,IAAA,EACtB,QAAA,EAAA;AAAA,IAAA,QAAA,mBAAW,GAAA,CAAC,aAAA,EAAA,EAAc,eAAA,EAAgB,KAAA,EAAM,CAAA,GAAK,IAAA;AAAA,oBACtD,GAAA,CAAC,KAAA,EAAA,EAAM,OAAA,EAAQ,MAAA,EAAO,CAAA;AAAA,oBACtB,GAAA,CAAC,KAAA,EAAA,EAAM,aAAA,EAAe,CAAC,CAAA,KAAM,GAAG,MAAA,CAAO,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,CAAA;AAAA,oBACnD,GAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAW,CAAC,CAAA,KAAM,GAAG,MAAA,CAAO,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,CAAA;AAAA,IAChD,UAAA,mBAAa,GAAA,CAAC,MAAA,EAAA,EAAO,CAAA,GAAK,IAAA;AAAA,IAC1B,SAAA,CAAU,QAAA,CAAS,GAAA,CAAI,CAAC,IAAI,CAAA,qBAC3B,GAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QAEC,IAAA,EAAK,UAAA;AAAA,QACL,OAAA,EAAS,UAAU,CAAC,CAAA,CAAA;AAAA,QACpB,MAAM,EAAA,CAAG,KAAA;AAAA,QACT,MAAA,EAAQ,QAAA,CAAS,EAAA,EAAI,CAAC,CAAA;AAAA,QACtB,WAAA,EAAa,CAAA;AAAA,QACb,GAAA,EAAK;AAAA,OAAA;AAAA,MANA,EAAA,CAAG;AAAA,KAQX;AAAA,GAAA,EACH,GACF,CAAA,EACF,CAAA;AAEJ","file":"LineChart-RRPGAZON.js","sourcesContent":["import { useArqelLocale } from '@arqel-dev/react/utils';\nimport { useMemo } from 'react';\nimport {\n CartesianGrid,\n Legend,\n Line,\n LineChart as RechartsLineChart,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport { type ChartSubProps, colorFor, toRowShape } from '../types';\n\nexport function LineChart({ chartData, height, showLegend, showGrid }: ChartSubProps) {\n const rows = toRowShape(chartData);\n const locale = useArqelLocale();\n const nf = useMemo(() => new Intl.NumberFormat(locale), [locale]);\n return (\n <div data-testid=\"chart-line\" style={{ width: '100%', height }}>\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <RechartsLineChart data={rows}>\n {showGrid ? <CartesianGrid strokeDasharray=\"3 3\" /> : null}\n <XAxis dataKey=\"name\" />\n <YAxis tickFormatter={(v) => nf.format(Number(v))} />\n <Tooltip formatter={(v) => nf.format(Number(v))} />\n {showLegend ? <Legend /> : null}\n {chartData.datasets.map((ds, i) => (\n <Line\n key={ds.label}\n type=\"monotone\"\n dataKey={`dataset${i}`}\n name={ds.label}\n stroke={colorFor(ds, i)}\n strokeWidth={2}\n dot={false}\n />\n ))}\n </RechartsLineChart>\n </ResponsiveContainer>\n </div>\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"PieChart-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"PieChart-SGN7V5LQ.js"}
|
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
import { toRowShape, colorFor } from './chunk-L3JBBN4H.js';
|
|
2
|
+
import { useArqelLocale } from '@arqel-dev/react/utils';
|
|
3
|
+
import { useMemo } from 'react';
|
|
2
4
|
import { ResponsiveContainer, RadarChart as RadarChart$1, PolarGrid, PolarAngleAxis, PolarRadiusAxis, Radar, Tooltip, Legend } from 'recharts';
|
|
3
5
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
4
6
|
|
|
5
7
|
function RadarChart({ chartData, height, showLegend, showGrid }) {
|
|
6
8
|
const rows = toRowShape(chartData);
|
|
9
|
+
const locale = useArqelLocale();
|
|
10
|
+
const nf = useMemo(() => new Intl.NumberFormat(locale), [locale]);
|
|
7
11
|
return /* @__PURE__ */ jsx("div", { "data-testid": "chart-radar", style: { width: "100%", height }, children: /* @__PURE__ */ jsx(ResponsiveContainer, { width: "100%", height: "100%", children: /* @__PURE__ */ jsxs(RadarChart$1, { data: rows, children: [
|
|
8
12
|
showGrid ? /* @__PURE__ */ jsx(PolarGrid, {}) : null,
|
|
9
13
|
/* @__PURE__ */ jsx(PolarAngleAxis, { dataKey: "name" }),
|
|
10
|
-
/* @__PURE__ */ jsx(PolarRadiusAxis, {}),
|
|
14
|
+
/* @__PURE__ */ jsx(PolarRadiusAxis, { tickFormatter: (v) => nf.format(Number(v)) }),
|
|
11
15
|
chartData.datasets.map((ds, i) => {
|
|
12
16
|
const color = colorFor(ds, i);
|
|
13
17
|
return /* @__PURE__ */ jsx(
|
|
@@ -22,11 +26,11 @@ function RadarChart({ chartData, height, showLegend, showGrid }) {
|
|
|
22
26
|
ds.label
|
|
23
27
|
);
|
|
24
28
|
}),
|
|
25
|
-
/* @__PURE__ */ jsx(Tooltip, {}),
|
|
29
|
+
/* @__PURE__ */ jsx(Tooltip, { formatter: (v) => nf.format(Number(v)) }),
|
|
26
30
|
showLegend ? /* @__PURE__ */ jsx(Legend, {}) : null
|
|
27
31
|
] }) }) });
|
|
28
32
|
}
|
|
29
33
|
|
|
30
34
|
export { RadarChart };
|
|
31
|
-
//# sourceMappingURL=RadarChart-
|
|
32
|
-
//# sourceMappingURL=RadarChart-
|
|
35
|
+
//# sourceMappingURL=RadarChart-3AOM736J.js.map
|
|
36
|
+
//# sourceMappingURL=RadarChart-3AOM736J.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/widgets/charts/RadarChart.tsx"],"names":["RechartsRadarChart"],"mappings":";;;;;;AAcO,SAAS,WAAW,EAAE,SAAA,EAAW,MAAA,EAAQ,UAAA,EAAY,UAAS,EAAkB;AACrF,EAAA,MAAM,IAAA,GAAO,WAAW,SAAS,CAAA;AACjC,EAAA,MAAM,SAAS,cAAA,EAAe;AAC9B,EAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,MAAM,IAAI,IAAA,CAAK,aAAa,MAAM,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEhE,EAAA,2BACG,KAAA,EAAA,EAAI,aAAA,EAAY,eAAc,KAAA,EAAO,EAAE,OAAO,MAAA,EAAQ,MAAA,IACrD,QAAA,kBAAA,GAAA,CAAC,mBAAA,EAAA,EAAoB,OAAM,MAAA,EAAO,MAAA,EAAO,QACvC,QAAA,kBAAA,IAAA,CAACA,YAAA,EAAA,EAAmB,MAAM,IAAA,EACvB,QAAA,EAAA;AAAA,IAAA,QAAA,mBAAW,GAAA,CAAC,aAAU,CAAA,GAAK,IAAA;AAAA,oBAC5B,GAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAQ,MAAA,EAAO,CAAA;AAAA,oBAC/B,GAAA,CAAC,eAAA,EAAA,EAAgB,aAAA,EAAe,CAAC,CAAA,KAAM,GAAG,MAAA,CAAO,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,CAAA;AAAA,IAC5D,SAAA,CAAU,QAAA,CAAS,GAAA,CAAI,CAAC,IAAI,CAAA,KAAM;AACjC,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,EAAA,EAAI,CAAC,CAAA;AAC5B,MAAA,uBACE,GAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UAEC,OAAA,EAAS,UAAU,CAAC,CAAA,CAAA;AAAA,UACpB,MAAM,EAAA,CAAG,KAAA;AAAA,UACT,MAAA,EAAQ,KAAA;AAAA,UACR,IAAA,EAAM,KAAA;AAAA,UACN,WAAA,EAAa;AAAA,SAAA;AAAA,QALR,EAAA,CAAG;AAAA,OAMV;AAAA,IAEJ,CAAC,CAAA;AAAA,oBACD,GAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAW,CAAC,CAAA,KAAM,GAAG,MAAA,CAAO,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,CAAA;AAAA,IAChD,UAAA,mBAAa,GAAA,CAAC,MAAA,EAAA,EAAO,CAAA,GAAK;AAAA,GAAA,EAC7B,GACF,CAAA,EACF,CAAA;AAEJ","file":"RadarChart-3AOM736J.js","sourcesContent":["import { useArqelLocale } from '@arqel-dev/react/utils';\nimport { useMemo } from 'react';\nimport {\n Legend,\n PolarAngleAxis,\n PolarGrid,\n PolarRadiusAxis,\n Radar,\n RadarChart as RechartsRadarChart,\n ResponsiveContainer,\n Tooltip,\n} from 'recharts';\nimport { type ChartSubProps, colorFor, toRowShape } from '../types';\n\nexport function RadarChart({ chartData, height, showLegend, showGrid }: ChartSubProps) {\n const rows = toRowShape(chartData);\n const locale = useArqelLocale();\n const nf = useMemo(() => new Intl.NumberFormat(locale), [locale]);\n\n return (\n <div data-testid=\"chart-radar\" style={{ width: '100%', height }}>\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <RechartsRadarChart data={rows}>\n {showGrid ? <PolarGrid /> : null}\n <PolarAngleAxis dataKey=\"name\" />\n <PolarRadiusAxis tickFormatter={(v) => nf.format(Number(v))} />\n {chartData.datasets.map((ds, i) => {\n const color = colorFor(ds, i);\n return (\n <Radar\n key={ds.label}\n dataKey={`dataset${i}`}\n name={ds.label}\n stroke={color}\n fill={color}\n fillOpacity={0.3}\n />\n );\n })}\n <Tooltip formatter={(v) => nf.format(Number(v))} />\n {showLegend ? <Legend /> : null}\n </RechartsRadarChart>\n </ResponsiveContainer>\n </div>\n );\n}\n"]}
|
package/dist/action.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export { ActionButton, ActionFormModal, ActionMenu, ConfirmDialog } from './chunk-
|
|
1
|
+
export { ActionButton, ActionFormModal, ActionMenu, ConfirmDialog } from './chunk-2JUWLJ3K.js';
|
|
2
2
|
import './chunk-3HN4ARGG.js';
|
|
3
3
|
import './chunk-MZMYV43C.js';
|
|
4
|
-
import './chunk-
|
|
4
|
+
import './chunk-CMNZLA32.js';
|
|
5
5
|
export { Button, buttonVariants } from './chunk-H23VX3RR.js';
|
|
6
6
|
import './chunk-B7ULUJVO.js';
|
|
7
7
|
//# sourceMappingURL=action.js.map
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, Sheet, SheetContent, SheetHeader, SheetTitle } from './chunk-3HN4ARGG.js';
|
|
2
2
|
import { FormActions } from './chunk-MZMYV43C.js';
|
|
3
|
-
import { FormRenderer } from './chunk-
|
|
3
|
+
import { FormRenderer } from './chunk-CMNZLA32.js';
|
|
4
4
|
import { Button } from './chunk-H23VX3RR.js';
|
|
5
5
|
import { cn } from './chunk-B7ULUJVO.js';
|
|
6
|
+
import { useArqelTranslations } from '@arqel-dev/react/utils';
|
|
6
7
|
import { useState, useMemo, useEffect } from 'react';
|
|
7
8
|
import { XIcon } from 'lucide-react';
|
|
8
9
|
import { Dialog as Dialog$1 } from 'radix-ui';
|
|
9
10
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
10
|
-
import { useArqelTranslations } from '@arqel-dev/react/utils';
|
|
11
11
|
|
|
12
12
|
function Dialog({
|
|
13
13
|
...props
|
|
@@ -150,6 +150,7 @@ function ActionFormModal({
|
|
|
150
150
|
errors = {},
|
|
151
151
|
initialValues = {}
|
|
152
152
|
}) {
|
|
153
|
+
const t = useArqelTranslations();
|
|
153
154
|
const [values, setValues] = useState(initialValues);
|
|
154
155
|
const size = action.modalSize ?? "md";
|
|
155
156
|
const schema = useMemo(
|
|
@@ -193,7 +194,7 @@ function ActionFormModal({
|
|
|
193
194
|
{
|
|
194
195
|
processing,
|
|
195
196
|
submitLabel: action.label,
|
|
196
|
-
extra: /* @__PURE__ */ jsx(DialogClose, { asChild: true, children: /* @__PURE__ */ jsx(Button, { type: "button", variant: "ghost", disabled: processing, children: "Cancel" }) })
|
|
197
|
+
extra: /* @__PURE__ */ jsx(DialogClose, { asChild: true, children: /* @__PURE__ */ jsx(Button, { type: "button", variant: "ghost", disabled: processing, children: t("form.cancel", "Cancel") }) })
|
|
197
198
|
}
|
|
198
199
|
)
|
|
199
200
|
]
|
|
@@ -229,11 +230,17 @@ function ConfirmDialog({
|
|
|
229
230
|
config?.description && /* @__PURE__ */ jsx(DialogDescription, { children: config.description })
|
|
230
231
|
] }),
|
|
231
232
|
requiresText !== void 0 && /* @__PURE__ */ jsxs("label", { className: "flex flex-col gap-1 text-xs text-muted-foreground", children: [
|
|
232
|
-
/* @__PURE__ */
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
233
|
+
/* @__PURE__ */ jsx("span", { children: (() => {
|
|
234
|
+
const [before, after] = t(
|
|
235
|
+
"arqel.messages.type_to_confirm",
|
|
236
|
+
"Type :value to confirm"
|
|
237
|
+
).split(":value");
|
|
238
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
239
|
+
before,
|
|
240
|
+
/* @__PURE__ */ jsx("code", { className: "font-mono text-foreground", children: requiresText }),
|
|
241
|
+
after
|
|
242
|
+
] });
|
|
243
|
+
})() }),
|
|
237
244
|
/* @__PURE__ */ jsx(
|
|
238
245
|
"input",
|
|
239
246
|
{
|
|
@@ -355,6 +362,7 @@ function ActionMenu({
|
|
|
355
362
|
trigger,
|
|
356
363
|
className
|
|
357
364
|
}) {
|
|
365
|
+
const t = useArqelTranslations();
|
|
358
366
|
const [confirmAction, setConfirmAction] = useState(null);
|
|
359
367
|
const [formAction, setFormAction] = useState(null);
|
|
360
368
|
const [sheetOpen, setSheetOpen] = useState(false);
|
|
@@ -393,7 +401,7 @@ function ActionMenu({
|
|
|
393
401
|
onInvoke(action);
|
|
394
402
|
}
|
|
395
403
|
};
|
|
396
|
-
const triggerNode = trigger ?? /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "icon-touch", "aria-label": "Actions", children: "\u22EF" });
|
|
404
|
+
const triggerNode = trigger ?? /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "icon-touch", "aria-label": t("arqel.actions.menu", "Actions"), children: "\u22EF" });
|
|
397
405
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
398
406
|
/* @__PURE__ */ jsx("div", { "data-arqel-action-dropdown": "", className: "hidden md:contents", children: /* @__PURE__ */ jsxs(DropdownMenu, { children: [
|
|
399
407
|
/* @__PURE__ */ jsx(DropdownMenuTrigger, { asChild: true, children: triggerNode }),
|
|
@@ -421,7 +429,7 @@ function ActionMenu({
|
|
|
421
429
|
"button",
|
|
422
430
|
{
|
|
423
431
|
type: "button",
|
|
424
|
-
"aria-label": "Actions",
|
|
432
|
+
"aria-label": t("arqel.actions.menu", "Actions"),
|
|
425
433
|
className: "inline-flex size-11 items-center justify-center rounded-md text-lg hover:bg-accent",
|
|
426
434
|
onClick: () => setSheetOpen(true),
|
|
427
435
|
children: "\u22EF"
|
|
@@ -433,7 +441,7 @@ function ActionMenu({
|
|
|
433
441
|
side: "bottom",
|
|
434
442
|
className: "max-h-[80vh] gap-0 overflow-y-auto pb-[env(safe-area-inset-bottom)]",
|
|
435
443
|
children: [
|
|
436
|
-
/* @__PURE__ */ jsx(SheetHeader, { className: "px-4 pt-4 pb-2", children: /* @__PURE__ */ jsx(SheetTitle, { children: "Actions" }) }),
|
|
444
|
+
/* @__PURE__ */ jsx(SheetHeader, { className: "px-4 pt-4 pb-2", children: /* @__PURE__ */ jsx(SheetTitle, { children: t("arqel.actions.menu", "Actions") }) }),
|
|
437
445
|
/* @__PURE__ */ jsx("div", { className: "flex flex-col px-2 pb-2", children: actions.map((action) => /* @__PURE__ */ jsx(
|
|
438
446
|
"button",
|
|
439
447
|
{
|
|
@@ -489,5 +497,5 @@ function ActionMenu({
|
|
|
489
497
|
}
|
|
490
498
|
|
|
491
499
|
export { ActionButton, ActionFormModal, ActionMenu, ConfirmDialog };
|
|
492
|
-
//# sourceMappingURL=chunk-
|
|
493
|
-
//# sourceMappingURL=chunk-
|
|
500
|
+
//# sourceMappingURL=chunk-2JUWLJ3K.js.map
|
|
501
|
+
//# sourceMappingURL=chunk-2JUWLJ3K.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/shadcn/ui/dialog.tsx","../src/action/ActionFormModal.tsx","../src/action/ConfirmDialog.tsx","../src/action/ActionButton.tsx","../src/action/ActionMenu.tsx"],"names":["DialogPrimitive","jsx","jsxs","useArqelTranslations","useState","Fragment"],"mappings":"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","file":"chunk-2JUWLJ3K.js","sourcesContent":["import * as React from \"react\"\nimport { XIcon } from \"lucide-react\"\nimport { Dialog as DialogPrimitive } from \"radix-ui\"\n\nimport { cn } from \"@/utils/cn\"\nimport { Button } from \"@/shadcn/ui/button\"\n\nfunction Dialog({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />\n}\n\nfunction DialogTrigger({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />\n}\n\nfunction DialogPortal({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />\n}\n\nfunction DialogClose({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />\n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n return (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n className={cn(\n \"fixed inset-0 z-50 bg-black/50 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DialogContent({\n className,\n children,\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n showCloseButton?: boolean\n}) {\n return (\n <DialogPortal data-slot=\"dialog-portal\">\n <DialogOverlay />\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n className={cn(\n \"fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border bg-background p-6 shadow-lg duration-200 outline-none data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 sm:max-w-lg\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close\n data-slot=\"dialog-close\"\n className=\"absolute top-4 right-4 rounded-xs opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\"\n >\n <XIcon />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPortal>\n )\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-header\"\n className={cn(\"flex flex-col gap-2 text-center sm:text-left\", className)}\n {...props}\n />\n )\n}\n\nfunction DialogFooter({\n className,\n showCloseButton = false,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n showCloseButton?: boolean\n}) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn(\n \"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close asChild>\n <Button variant=\"outline\">Close</Button>\n </DialogPrimitive.Close>\n )}\n </div>\n )\n}\n\nfunction DialogTitle({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn(\"text-lg leading-none font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n}\n","/**\n * `<ActionFormModal>` — modal hosting a `<FormRenderer>` for an Action's\n * companion form (see `arqel-dev/actions` `HasForm`).\n *\n * Action form fields are a flat list — Action FormSchema is built\n * inline from the `ActionFormField[]` since layout components don't\n * apply at this scale. Submit fires `onSubmit(values)`; the parent\n * (typically `useAction`) handles invocation + loading.\n */\n\nimport { useArqelTranslations } from '@arqel-dev/react/utils';\nimport type { ActionSchema, ModalSize } from '@arqel-dev/types/actions';\nimport type { FieldSchema } from '@arqel-dev/types/fields';\nimport type { FormSchema } from '@arqel-dev/types/forms';\nimport { useMemo, useState } from 'react';\nimport { FormActions } from '../form/FormActions.js';\nimport { FormRenderer } from '../form/FormRenderer.js';\nimport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from '../shadcn/ui/dialog.js';\nimport { cn } from '../utils/cn.js';\nimport { Button } from './Button.js';\n\nexport interface ActionFormModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n action: ActionSchema;\n fields: FieldSchema[];\n onSubmit: (values: Record<string, unknown>) => void;\n processing?: boolean;\n errors?: Record<string, string[]> | undefined;\n initialValues?: Record<string, unknown>;\n}\n\nconst SIZE_CLASSES: Record<ModalSize, string> = {\n sm: 'sm:max-w-[24rem]',\n md: 'sm:max-w-[32rem]',\n lg: 'sm:max-w-[44rem]',\n xl: 'sm:max-w-[56rem]',\n full: 'sm:max-w-[90vw] h-[90vh]',\n};\n\nexport function ActionFormModal({\n open,\n onOpenChange,\n action,\n fields,\n onSubmit,\n processing = false,\n errors = {},\n initialValues = {},\n}: ActionFormModalProps) {\n const t = useArqelTranslations();\n const [values, setValues] = useState<Record<string, unknown>>(initialValues);\n const size = action.modalSize ?? 'md';\n\n const schema: FormSchema = useMemo(\n () => ({\n schema: (action.form ?? []).map((entry) => ({\n kind: 'field' as const,\n name: entry.name,\n type: entry.type,\n })),\n columns: 1,\n model: null,\n inline: false,\n disabled: false,\n }),\n [action.form],\n );\n\n return (\n <Dialog open={open} onOpenChange={(next) => onOpenChange(next)}>\n <DialogContent className={cn('overflow-auto', SIZE_CLASSES[size])}>\n <DialogHeader>\n <DialogTitle>{action.label}</DialogTitle>\n </DialogHeader>\n <form\n className=\"flex flex-col gap-4\"\n onSubmit={(e) => {\n e.preventDefault();\n onSubmit(values);\n }}\n >\n <FormRenderer\n schema={schema}\n fields={fields}\n values={values}\n errors={errors}\n onChange={(name, value) => setValues((prev) => ({ ...prev, [name]: value }))}\n disabled={processing}\n />\n <FormActions\n processing={processing}\n submitLabel={action.label}\n extra={\n <DialogClose asChild>\n <Button type=\"button\" variant=\"ghost\" disabled={processing}>\n {t('form.cancel', 'Cancel')}\n </Button>\n </DialogClose>\n }\n />\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n","/**\n * `<ConfirmDialog>` — confirmation modal driven by the shadcn (Radix) Dialog.\n *\n * Phase 1 supports the canonical `ConfirmationConfig`:\n * - heading / description\n * - color (destructive | warning | info) — drives submit button variant\n * - submit / cancel labels\n * - \"type to confirm\" via `requiresText` (submit stays disabled until\n * the typed value matches exactly)\n *\n * Keyboard: Escape cancels (Radix built-in dismiss); Enter inside the\n * type-to-confirm input fires confirm when the value matches.\n */\n\nimport { useArqelTranslations } from '@arqel-dev/react/utils';\nimport type { ConfirmationConfig } from '@arqel-dev/types/actions';\nimport { useEffect, useState } from 'react';\nimport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '../shadcn/ui/dialog.js';\nimport { Button, type ButtonProps } from './Button.js';\n\nexport interface ConfirmDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n config?: ConfirmationConfig | undefined;\n onConfirm: () => void;\n processing?: boolean;\n}\n\nconst COLOR_VARIANT: Record<NonNullable<ConfirmationConfig['color']>, ButtonProps['variant']> = {\n destructive: 'destructive',\n warning: 'default',\n info: 'default',\n};\n\nexport function ConfirmDialog({\n open,\n onOpenChange,\n config,\n onConfirm,\n processing = false,\n}: ConfirmDialogProps) {\n const t = useArqelTranslations();\n const [typed, setTyped] = useState('');\n\n useEffect(() => {\n if (!open) setTyped('');\n }, [open]);\n\n const requiresText = config?.requiresText;\n const submitDisabled = processing || (requiresText !== undefined && typed !== requiresText);\n const variant = COLOR_VARIANT[config?.color ?? 'destructive'];\n // Precedence: explicit config > shared translation > English fallback.\n const submitLabel =\n config?.submitLabel ??\n (config?.color === 'info'\n ? t('arqel.actions.confirm', 'Confirm')\n : t('arqel.actions.delete', 'Delete'));\n const cancelLabel = config?.cancelLabel ?? t('arqel.actions.cancel', 'Cancel');\n\n return (\n <Dialog open={open} onOpenChange={(next) => onOpenChange(next)}>\n <DialogContent className=\"sm:max-w-[28rem]\" showCloseButton={false}>\n <DialogHeader>\n <DialogTitle>\n {config?.heading ?? t('arqel.messages.delete_confirm', 'Are you sure?')}\n </DialogTitle>\n {config?.description && <DialogDescription>{config.description}</DialogDescription>}\n </DialogHeader>\n {requiresText !== undefined && (\n <label className=\"flex flex-col gap-1 text-xs text-muted-foreground\">\n <span>\n {(() => {\n // Render the required value as inline <code> while keeping the\n // surrounding prompt translatable: split the localized string on\n // its :value placeholder and splice the <code> element in.\n const [before, after] = t(\n 'arqel.messages.type_to_confirm',\n 'Type :value to confirm',\n ).split(':value');\n return (\n <>\n {before}\n <code className=\"font-mono text-foreground\">{requiresText}</code>\n {after}\n </>\n );\n })()}\n </span>\n <input\n type=\"text\"\n ref={(el) => el?.focus()}\n value={typed}\n onChange={(e) => setTyped(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && !submitDisabled) {\n e.preventDefault();\n onConfirm();\n }\n }}\n className=\"h-9 rounded-md border border-input bg-background px-3 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n />\n </label>\n )}\n <DialogFooter>\n <DialogClose asChild>\n <Button type=\"button\" variant=\"ghost\" disabled={processing}>\n {cancelLabel}\n </Button>\n </DialogClose>\n <Button type=\"button\" variant={variant} disabled={submitDisabled} onClick={onConfirm}>\n {processing ? t('form.saving', 'Working…') : submitLabel}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","/**\n * `<ActionButton>` — renders an `ActionSchema` as a button.\n *\n * Behaviour matrix:\n * - `requiresConfirmation` only → opens ConfirmDialog\n * - `form` only → opens ActionFormModal\n * - both → ConfirmDialog first, then form\n * - neither → fires `onInvoke` immediately\n *\n * `onInvoke` receives optional form data so parents (typically using\n * `useAction()` from @arqel-dev/hooks) can dispatch the underlying request.\n */\n\nimport type { ActionColor, ActionSchema, ActionVariant } from '@arqel-dev/types/actions';\nimport type { FieldSchema } from '@arqel-dev/types/fields';\nimport { useState } from 'react';\nimport { ActionFormModal } from './ActionFormModal.js';\nimport { Button, type ButtonProps } from './Button.js';\nimport { ConfirmDialog } from './ConfirmDialog.js';\n\nexport interface ActionButtonProps {\n action: ActionSchema;\n /**\n * Field schemas for the form modal (resolved server-side from\n * `Action::form` via `FieldSchemaSerializer`). Optional override — when\n * omitted the component reads `action.formFields`, the canonical payload\n * shipped by `Action::toArray()` (#213).\n */\n formFields?: FieldSchema[] | undefined;\n onInvoke: (formValues?: Record<string, unknown>) => void;\n processing?: boolean;\n errors?: Record<string, string[]>;\n size?: ButtonProps['size'];\n className?: string;\n}\n\nconst COLOR_TO_VARIANT: Record<ActionColor, ButtonProps['variant']> = {\n primary: 'default',\n secondary: 'outline',\n destructive: 'destructive',\n success: 'default',\n warning: 'default',\n info: 'default',\n};\n\nconst VARIANT_OVERRIDE: Partial<Record<ActionVariant, ButtonProps['variant']>> = {\n default: 'default',\n outline: 'outline',\n ghost: 'ghost',\n destructive: 'destructive',\n};\n\nexport function ActionButton({\n action,\n formFields,\n onInvoke,\n processing = false,\n errors,\n size = 'default',\n className,\n}: ActionButtonProps) {\n const [confirmOpen, setConfirmOpen] = useState(false);\n const [formOpen, setFormOpen] = useState(false);\n\n // Prefer an explicit prop; otherwise read the schema shipped by\n // `Action::toArray()` so the modal renders real inputs (#213).\n const resolvedFormFields = formFields ?? action.formFields ?? [];\n\n const variant: ButtonProps['variant'] =\n VARIANT_OVERRIDE[action.variant] ?? COLOR_TO_VARIANT[action.color];\n\n const handleClick = () => {\n if (action.disabled) return;\n if (action.requiresConfirmation) {\n setConfirmOpen(true);\n } else if (action.form && action.form.length > 0) {\n setFormOpen(true);\n } else {\n onInvoke();\n }\n };\n\n const handleConfirm = () => {\n setConfirmOpen(false);\n if (action.form && action.form.length > 0) {\n setFormOpen(true);\n } else {\n onInvoke();\n }\n };\n\n const handleFormSubmit = (values: Record<string, unknown>) => {\n onInvoke(values);\n setFormOpen(false);\n };\n\n return (\n <>\n <Button\n variant={variant}\n size={size}\n disabled={action.disabled === true || processing}\n title={action.tooltip}\n onClick={handleClick}\n className={className}\n >\n {action.label}\n </Button>\n {action.requiresConfirmation && (\n <ConfirmDialog\n open={confirmOpen}\n onOpenChange={setConfirmOpen}\n config={action.confirmation}\n onConfirm={handleConfirm}\n processing={processing}\n />\n )}\n {action.form && action.form.length > 0 && (\n <ActionFormModal\n open={formOpen}\n onOpenChange={setFormOpen}\n action={action}\n fields={resolvedFormFields}\n onSubmit={handleFormSubmit}\n processing={processing}\n errors={errors}\n />\n )}\n </>\n );\n}\n","/**\n * `<ActionMenu>` — renders a list of actions inline (≤ `inlineThreshold`)\n * or collapses them into a shadcn (Radix) dropdown menu when the list grows.\n *\n * Each menu item delegates to `<ActionButton>` so confirmation /\n * form-modal behaviour is consistent across surfaces. The dropdown\n * trigger is rendered as a ghost icon button by default; callers can\n * supply a custom `trigger` slot.\n */\n\nimport { useArqelTranslations } from '@arqel-dev/react/utils';\nimport type { ActionSchema } from '@arqel-dev/types/actions';\nimport type { FieldSchema } from '@arqel-dev/types/fields';\nimport { type ReactNode, useState } from 'react';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '../shadcn/ui/dropdown-menu.js';\nimport { Sheet, SheetContent, SheetHeader, SheetTitle } from '../shadcn/ui/sheet.js';\nimport { cn } from '../utils/cn.js';\nimport { ActionButton } from './ActionButton.js';\nimport { ActionFormModal } from './ActionFormModal.js';\nimport { Button } from './Button.js';\nimport { ConfirmDialog } from './ConfirmDialog.js';\n\n/** Does this action need a gate (confirm/form) before invoking? */\nfunction actionHasForm(action: ActionSchema): boolean {\n return Array.isArray(action.form) && action.form.length > 0;\n}\n\nexport interface ActionMenuProps {\n actions: ActionSchema[];\n /**\n * Optional per-action override map keyed by action name. When an action\n * is absent here, `<ActionButton>` falls back to the action's own\n * `formFields` payload shipped by `Action::toArray()` (#213).\n */\n formFieldsByAction?: Record<string, FieldSchema[]>;\n onInvoke: (action: ActionSchema, formValues?: Record<string, unknown>) => void;\n inlineThreshold?: number;\n processing?: boolean;\n trigger?: ReactNode;\n className?: string;\n}\n\nexport function ActionMenu({\n actions,\n formFieldsByAction = {},\n onInvoke,\n inlineThreshold = 3,\n processing = false,\n trigger,\n className,\n}: ActionMenuProps) {\n const t = useArqelTranslations();\n // Which dropdown action (if any) is currently driving a confirm dialog /\n // form modal. The modals are mounted as siblings of the menu so they\n // survive the menu closing on `onSelect`.\n const [confirmAction, setConfirmAction] = useState<ActionSchema | null>(null);\n const [formAction, setFormAction] = useState<ActionSchema | null>(null);\n // The mobile bottom-sheet is controlled so selecting an item can close it\n // (mirroring the Dropdown's onSelect auto-close).\n const [sheetOpen, setSheetOpen] = useState(false);\n\n if (actions.length === 0) return null;\n\n if (actions.length <= inlineThreshold) {\n return (\n <div className={cn('flex flex-wrap items-center gap-1', className)}>\n {actions.map((action) => (\n <ActionButton\n key={action.name}\n action={action}\n formFields={formFieldsByAction[action.name]}\n onInvoke={(values) => onInvoke(action, values)}\n processing={processing}\n size=\"sm\"\n // 44px touch target on mobile (WCAG 2.5.5); dense 32px on >=md.\n className=\"h-11 md:h-8\"\n />\n ))}\n </div>\n );\n }\n\n const handleSelect = (action: ActionSchema) => {\n if (action.disabled) return;\n // Mirror ActionButton's gating: confirmation first, then form, else\n // invoke directly. The modals open as siblings of the (now closing)\n // menu so destructive/form actions never fire without a gate (#229,\n // #231).\n if (action.requiresConfirmation) {\n setConfirmAction(action);\n } else if (actionHasForm(action)) {\n setFormAction(action);\n } else {\n onInvoke(action);\n }\n };\n\n const handleConfirm = () => {\n const action = confirmAction;\n setConfirmAction(null);\n if (!action) return;\n if (actionHasForm(action)) {\n setFormAction(action);\n } else {\n onInvoke(action);\n }\n };\n\n // One visual trigger shared by both presentation surfaces. The Dropdown\n // wraps it via DropdownMenuTrigger (asChild); the Sheet opens it on click.\n const triggerNode = trigger ?? (\n <Button variant=\"ghost\" size=\"icon-touch\" aria-label={t('arqel.actions.menu', 'Actions')}>\n ⋯\n </Button>\n );\n\n return (\n <>\n {/* Desktop (>=md): the Radix dropdown popper, unchanged. */}\n <div data-arqel-action-dropdown=\"\" className=\"hidden md:contents\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>{triggerNode}</DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"end\"\n sideOffset={6}\n className={cn('min-w-[12rem]', className)}\n >\n {actions.map((action) => (\n <DropdownMenuItem\n key={action.name}\n disabled={action.disabled === true}\n variant={action.color === 'destructive' ? 'destructive' : 'default'}\n onSelect={() => handleSelect(action)}\n >\n {action.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n\n {/* Mobile (<md): a full-width bottom sheet with >=44px items. */}\n <div className=\"md:hidden\">\n <Sheet open={sheetOpen} onOpenChange={setSheetOpen}>\n <button\n type=\"button\"\n aria-label={t('arqel.actions.menu', 'Actions')}\n className=\"inline-flex size-11 items-center justify-center rounded-md text-lg hover:bg-accent\"\n onClick={() => setSheetOpen(true)}\n >\n ⋯\n </button>\n <SheetContent\n side=\"bottom\"\n className=\"max-h-[80vh] gap-0 overflow-y-auto pb-[env(safe-area-inset-bottom)]\"\n >\n <SheetHeader className=\"px-4 pt-4 pb-2\">\n <SheetTitle>{t('arqel.actions.menu', 'Actions')}</SheetTitle>\n </SheetHeader>\n <div className=\"flex flex-col px-2 pb-2\">\n {actions.map((action) => (\n <button\n key={action.name}\n type=\"button\"\n data-arqel-sheet-action=\"\"\n disabled={action.disabled === true}\n className={cn(\n 'flex min-h-11 w-full items-center rounded-md px-3 text-left text-sm hover:bg-accent disabled:pointer-events-none disabled:opacity-50',\n action.color === 'destructive' && 'text-destructive',\n )}\n onClick={() => {\n setSheetOpen(false);\n handleSelect(action);\n }}\n >\n {action.label}\n </button>\n ))}\n </div>\n </SheetContent>\n </Sheet>\n </div>\n\n {confirmAction && (\n <ConfirmDialog\n open\n onOpenChange={(next) => {\n if (!next) setConfirmAction(null);\n }}\n config={confirmAction.confirmation}\n onConfirm={handleConfirm}\n processing={processing}\n />\n )}\n {formAction && (\n <ActionFormModal\n open\n onOpenChange={(next) => {\n if (!next) setFormAction(null);\n }}\n action={formAction}\n fields={formFieldsByAction[formAction.name] ?? formAction.formFields ?? []}\n onSubmit={(values) => {\n const action = formAction;\n setFormAction(null);\n onInvoke(action, values);\n }}\n processing={processing}\n />\n )}\n </>\n );\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DashboardGrid } from './chunk-
|
|
1
|
+
import { DashboardGrid } from './chunk-YYQ45W25.js';
|
|
2
2
|
import { usePage, router } from '@inertiajs/react';
|
|
3
3
|
import { jsx } from 'react/jsx-runtime';
|
|
4
4
|
|
|
@@ -31,5 +31,5 @@ function ArqelDashboardPage() {
|
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
export { ArqelDashboardPage };
|
|
34
|
-
//# sourceMappingURL=chunk-
|
|
35
|
-
//# sourceMappingURL=chunk-
|
|
34
|
+
//# sourceMappingURL=chunk-3VSDQCFO.js.map
|
|
35
|
+
//# sourceMappingURL=chunk-3VSDQCFO.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/pages/ArqelDashboardPage.tsx"],"names":[],"mappings":";;;;AA0Be,SAAR,kBAAA,GAAmD;AACxD,EAAA,MAAM,EAAE,SAAA,EAAW,YAAA,EAAa,GAAI,SAAiC,CAAE,KAAA;AAEvE,EAAA,MAAM,kBAAA,GAAqB,CAAC,IAAA,EAAc,KAAA,KAAyB;AACjE,IAAA,MAAM,OAAA,GAAU,gBAAgB,EAAC;AACjC,IAAA,MAAM,IAAA,GAAgC,EAAE,GAAG,OAAA,EAAQ;AACnD,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,IAAQ,UAAU,EAAA,EAAI;AACzD,MAAA,OAAO,KAAK,IAAI,CAAA;AAAA,IAClB,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,IAAI,CAAA,GAAI,KAAA;AAAA,IACf;AAEA,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,IAAA,IAAQ,CAAA,kBAAA,EAAqB,UAAU,EAAE,CAAA,CAAA;AAChE,IAAA,MAAM,MAAA,GAAU,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAE,MAAA,GAAS,CAAA,GAAI,EAAE,OAAA,EAAS,IAAA,EAAK,GAAI,EAAC;AAEpE,IAAA,MAAA,CAAO,GAAA,CAAI,MAAM,MAAA,EAAQ;AAAA,MACvB,aAAA,EAAe,IAAA;AAAA,MACf,cAAA,EAAgB,IAAA;AAAA,MAChB,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,YAAA,EAAc,gBAAgB,EAAC;AAAA,MAC/B,cAAA,EAAgB;AAAA;AAAA,GAClB;AAEJ","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/pages/ArqelDashboardPage.tsx"],"names":[],"mappings":";;;;AA0Be,SAAR,kBAAA,GAAmD;AACxD,EAAA,MAAM,EAAE,SAAA,EAAW,YAAA,EAAa,GAAI,SAAiC,CAAE,KAAA;AAEvE,EAAA,MAAM,kBAAA,GAAqB,CAAC,IAAA,EAAc,KAAA,KAAyB;AACjE,IAAA,MAAM,OAAA,GAAU,gBAAgB,EAAC;AACjC,IAAA,MAAM,IAAA,GAAgC,EAAE,GAAG,OAAA,EAAQ;AACnD,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,IAAQ,UAAU,EAAA,EAAI;AACzD,MAAA,OAAO,KAAK,IAAI,CAAA;AAAA,IAClB,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,IAAI,CAAA,GAAI,KAAA;AAAA,IACf;AAEA,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,IAAA,IAAQ,CAAA,kBAAA,EAAqB,UAAU,EAAE,CAAA,CAAA;AAChE,IAAA,MAAM,MAAA,GAAU,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAE,MAAA,GAAS,CAAA,GAAI,EAAE,OAAA,EAAS,IAAA,EAAK,GAAI,EAAC;AAEpE,IAAA,MAAA,CAAO,GAAA,CAAI,MAAM,MAAA,EAAQ;AAAA,MACvB,aAAA,EAAe,IAAA;AAAA,MACf,cAAA,EAAgB,IAAA;AAAA,MAChB,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,YAAA,EAAc,gBAAgB,EAAC;AAAA,MAC/B,cAAA,EAAgB;AAAA;AAAA,GAClB;AAEJ","file":"chunk-3VSDQCFO.js","sourcesContent":["/**\n * Default Inertia page for `arqel::dashboard`.\n *\n * Bridges the Inertia payload emitted by\n * `Arqel\\Widgets\\Http\\Controllers\\DashboardController::show` into the\n * existing `<DashboardGrid>` component. The grid already handles the\n * heading/description chrome, the filter bar and the responsive\n * widget grid (column spans, polling, deferred fetch), so this page\n * only owns one piece of glue: lifting filter state up into the URL\n * so deep-link refreshes rehydrate cleanly.\n *\n * Filter changes navigate via `router.get(path, { filters: ... })`,\n * matching `DashboardController::show` which reads\n * `$request->input('filters', [])` and forwards it as `filterValues`.\n */\n\nimport { router, usePage } from '@inertiajs/react';\nimport type { JSX } from 'react';\nimport { DashboardGrid, type DashboardPayload } from '../widgets/index.js';\n\ninterface ArqelDashboardPageProps {\n dashboard: DashboardPayload;\n filterValues?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\nexport default function ArqelDashboardPage(): JSX.Element {\n const { dashboard, filterValues } = usePage<ArqelDashboardPageProps>().props;\n\n const handleFilterChange = (name: string, value: unknown): void => {\n const current = filterValues ?? {};\n const next: Record<string, unknown> = { ...current };\n if (value === undefined || value === null || value === '') {\n delete next[name];\n } else {\n next[name] = value;\n }\n\n const path = dashboard.path ?? `/admin/dashboards/${dashboard.id}`;\n const params = (Object.keys(next).length > 0 ? { filters: next } : {}) as never;\n\n router.get(path, params, {\n preserveState: true,\n preserveScroll: true,\n replace: true,\n });\n };\n\n return (\n <DashboardGrid\n dashboard={dashboard}\n filterValues={filterValues ?? {}}\n onFilterChange={handleFilterChange}\n />\n );\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CommandPalette } from './chunk-
|
|
1
|
+
import { CommandPalette } from './chunk-HNUUZEOL.js';
|
|
2
2
|
import { resolveLucideIcon } from './chunk-RMPOR2YZ.js';
|
|
3
3
|
import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetDescription } from './chunk-3HN4ARGG.js';
|
|
4
4
|
import { Button } from './chunk-H23VX3RR.js';
|
|
@@ -11,6 +11,7 @@ import { Slot, Tooltip as Tooltip$1 } from 'radix-ui';
|
|
|
11
11
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
12
12
|
import { useNavigation } from '@arqel-dev/hooks';
|
|
13
13
|
import { useTheme } from '@arqel-dev/react/providers';
|
|
14
|
+
import { useArqelTranslations } from '@arqel-dev/react/utils';
|
|
14
15
|
|
|
15
16
|
var MOBILE_BREAKPOINT = 768;
|
|
16
17
|
function useIsMobile() {
|
|
@@ -485,7 +486,7 @@ function AppShell({
|
|
|
485
486
|
children: [
|
|
486
487
|
/* @__PURE__ */ jsx(CommandPalette, {}),
|
|
487
488
|
topbar,
|
|
488
|
-
/* @__PURE__ */ jsx("main", { className: "min-w-0 flex-1", children }),
|
|
489
|
+
/* @__PURE__ */ jsx("main", { className: "min-w-0 flex-1 p-4 md:p-6", children }),
|
|
489
490
|
footer
|
|
490
491
|
]
|
|
491
492
|
}
|
|
@@ -507,7 +508,7 @@ function AppShell({
|
|
|
507
508
|
sidebar,
|
|
508
509
|
/* @__PURE__ */ jsxs(SidebarInset, { children: [
|
|
509
510
|
topbar,
|
|
510
|
-
/* @__PURE__ */ jsx("main", { className: "min-w-0 flex-1", children }),
|
|
511
|
+
/* @__PURE__ */ jsx("main", { className: "min-w-0 flex-1 p-4 md:p-6", children }),
|
|
511
512
|
footer
|
|
512
513
|
] })
|
|
513
514
|
]
|
|
@@ -609,6 +610,7 @@ function Topbar({
|
|
|
609
610
|
className
|
|
610
611
|
}) {
|
|
611
612
|
const { resolved, toggle } = useTheme();
|
|
613
|
+
const t = useArqelTranslations();
|
|
612
614
|
return /* @__PURE__ */ jsxs(
|
|
613
615
|
"header",
|
|
614
616
|
{
|
|
@@ -634,7 +636,7 @@ function Topbar({
|
|
|
634
636
|
{
|
|
635
637
|
variant: "ghost",
|
|
636
638
|
size: "icon",
|
|
637
|
-
"aria-label":
|
|
639
|
+
"aria-label": resolved === "dark" ? t("arqel.aria.theme_toggle_light", "Switch to light theme") : t("arqel.aria.theme_toggle_dark", "Switch to dark theme"),
|
|
638
640
|
onClick: toggle,
|
|
639
641
|
children: /* @__PURE__ */ jsx("span", { "aria-hidden": "true", children: resolved === "dark" ? "\u2600" : "\u263E" })
|
|
640
642
|
}
|
|
@@ -647,5 +649,5 @@ function Topbar({
|
|
|
647
649
|
}
|
|
648
650
|
|
|
649
651
|
export { AppShell, Footer, MainContent, Sidebar2 as Sidebar, Topbar };
|
|
650
|
-
//# sourceMappingURL=chunk-
|
|
651
|
-
//# sourceMappingURL=chunk-
|
|
652
|
+
//# sourceMappingURL=chunk-4VWNBMMA.js.map
|
|
653
|
+
//# sourceMappingURL=chunk-4VWNBMMA.js.map
|