@fluid-app/rep-widgets 0.1.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/AlertWidget-2JHMNYIY.js +5 -0
- package/dist/AlertWidget-2JHMNYIY.js.map +1 -0
- package/dist/AlertWidget-VHXWOKM4.cjs +18 -0
- package/dist/AlertWidget-VHXWOKM4.cjs.map +1 -0
- package/dist/CalendarWidget-AQ7PVNSI.cjs +18 -0
- package/dist/CalendarWidget-AQ7PVNSI.cjs.map +1 -0
- package/dist/CalendarWidget-E54LNKCG.js +5 -0
- package/dist/CalendarWidget-E54LNKCG.js.map +1 -0
- package/dist/CarouselWidget-IPPFSXDZ.js +8 -0
- package/dist/CarouselWidget-IPPFSXDZ.js.map +1 -0
- package/dist/CarouselWidget-ZG6LJJXG.cjs +21 -0
- package/dist/CarouselWidget-ZG6LJJXG.cjs.map +1 -0
- package/dist/CatchUpWidget-CSSQMPPA.cjs +18 -0
- package/dist/CatchUpWidget-CSSQMPPA.cjs.map +1 -0
- package/dist/CatchUpWidget-HYJRKFN3.js +5 -0
- package/dist/CatchUpWidget-HYJRKFN3.js.map +1 -0
- package/dist/ChartWidget-MBLGRSJQ.cjs +19 -0
- package/dist/ChartWidget-MBLGRSJQ.cjs.map +1 -0
- package/dist/ChartWidget-OL5DRMGA.js +6 -0
- package/dist/ChartWidget-OL5DRMGA.js.map +1 -0
- package/dist/ContainerWidget-DETCLP52.js +8 -0
- package/dist/ContainerWidget-DETCLP52.js.map +1 -0
- package/dist/ContainerWidget-XQDJSJXO.cjs +21 -0
- package/dist/ContainerWidget-XQDJSJXO.cjs.map +1 -0
- package/dist/EmbedWidget-HTR2MJ25.cjs +16 -0
- package/dist/EmbedWidget-HTR2MJ25.cjs.map +1 -0
- package/dist/EmbedWidget-O2XFGDJS.js +3 -0
- package/dist/EmbedWidget-O2XFGDJS.js.map +1 -0
- package/dist/ImageWidget-L2MIYWTE.cjs +17 -0
- package/dist/ImageWidget-L2MIYWTE.cjs.map +1 -0
- package/dist/ImageWidget-RF6XKPPV.js +4 -0
- package/dist/ImageWidget-RF6XKPPV.js.map +1 -0
- package/dist/LayoutWidget-4XISA6RO.cjs +20 -0
- package/dist/LayoutWidget-4XISA6RO.cjs.map +1 -0
- package/dist/LayoutWidget-WZSMZLLM.js +7 -0
- package/dist/LayoutWidget-WZSMZLLM.js.map +1 -0
- package/dist/ListWidget-XY5C3P3C.cjs +19 -0
- package/dist/ListWidget-XY5C3P3C.cjs.map +1 -0
- package/dist/ListWidget-ZFRV6DKI.js +6 -0
- package/dist/ListWidget-ZFRV6DKI.js.map +1 -0
- package/dist/MySiteWidget-75NJUIWV.js +5 -0
- package/dist/MySiteWidget-75NJUIWV.js.map +1 -0
- package/dist/MySiteWidget-CBDKQT35.cjs +18 -0
- package/dist/MySiteWidget-CBDKQT35.cjs.map +1 -0
- package/dist/NestedWidget-N4I7LOVX.js +6 -0
- package/dist/NestedWidget-N4I7LOVX.js.map +1 -0
- package/dist/NestedWidget-VO3YYOOH.cjs +19 -0
- package/dist/NestedWidget-VO3YYOOH.cjs.map +1 -0
- package/dist/QuickShareWidget-3VGSFY4J.js +4 -0
- package/dist/QuickShareWidget-3VGSFY4J.js.map +1 -0
- package/dist/QuickShareWidget-VHDB5SYT.cjs +17 -0
- package/dist/QuickShareWidget-VHDB5SYT.cjs.map +1 -0
- package/dist/RecentActivityWidget-3KAR64SB.js +5 -0
- package/dist/RecentActivityWidget-3KAR64SB.js.map +1 -0
- package/dist/RecentActivityWidget-X5UABJHL.cjs +18 -0
- package/dist/RecentActivityWidget-X5UABJHL.cjs.map +1 -0
- package/dist/SpacerWidget-K7CXVECO.cjs +16 -0
- package/dist/SpacerWidget-K7CXVECO.cjs.map +1 -0
- package/dist/SpacerWidget-ODKNZAND.js +3 -0
- package/dist/SpacerWidget-ODKNZAND.js.map +1 -0
- package/dist/TableWidget-MDEBHVIA.cjs +20 -0
- package/dist/TableWidget-MDEBHVIA.cjs.map +1 -0
- package/dist/TableWidget-W6LL5FLE.js +7 -0
- package/dist/TableWidget-W6LL5FLE.js.map +1 -0
- package/dist/TextWidget-D72TL53O.js +4 -0
- package/dist/TextWidget-D72TL53O.js.map +1 -0
- package/dist/TextWidget-DYINWJGB.cjs +17 -0
- package/dist/TextWidget-DYINWJGB.cjs.map +1 -0
- package/dist/ToDoWidget-DH544SJH.cjs +18 -0
- package/dist/ToDoWidget-DH544SJH.cjs.map +1 -0
- package/dist/ToDoWidget-LCAYWRVH.js +5 -0
- package/dist/ToDoWidget-LCAYWRVH.js.map +1 -0
- package/dist/VideoWidget-VHAZTNLI.js +4 -0
- package/dist/VideoWidget-VHAZTNLI.js.map +1 -0
- package/dist/VideoWidget-YLRKZ27S.cjs +17 -0
- package/dist/VideoWidget-YLRKZ27S.cjs.map +1 -0
- package/dist/chunk-2KQFMF6L.js +413 -0
- package/dist/chunk-2KQFMF6L.js.map +1 -0
- package/dist/chunk-3CUVGQQI.cjs +15 -0
- package/dist/chunk-3CUVGQQI.cjs.map +1 -0
- package/dist/chunk-3RV7AYQZ.js +149 -0
- package/dist/chunk-3RV7AYQZ.js.map +1 -0
- package/dist/chunk-4M2A5W2D.cjs +42 -0
- package/dist/chunk-4M2A5W2D.cjs.map +1 -0
- package/dist/chunk-4XJCU4HY.js +248 -0
- package/dist/chunk-4XJCU4HY.js.map +1 -0
- package/dist/chunk-5HHN5MRZ.js +11 -0
- package/dist/chunk-5HHN5MRZ.js.map +1 -0
- package/dist/chunk-6GF46P3S.js +33 -0
- package/dist/chunk-6GF46P3S.js.map +1 -0
- package/dist/chunk-7JIRJTGY.js +32 -0
- package/dist/chunk-7JIRJTGY.js.map +1 -0
- package/dist/chunk-7XWMJDFE.js +443 -0
- package/dist/chunk-7XWMJDFE.js.map +1 -0
- package/dist/chunk-C7A3OMIF.cjs +446 -0
- package/dist/chunk-C7A3OMIF.cjs.map +1 -0
- package/dist/chunk-CEZOXMO6.js +377 -0
- package/dist/chunk-CEZOXMO6.js.map +1 -0
- package/dist/chunk-CM7D7WGL.cjs +36 -0
- package/dist/chunk-CM7D7WGL.cjs.map +1 -0
- package/dist/chunk-D4ULCQ42.cjs +353 -0
- package/dist/chunk-D4ULCQ42.cjs.map +1 -0
- package/dist/chunk-DKGP3DTX.cjs +389 -0
- package/dist/chunk-DKGP3DTX.cjs.map +1 -0
- package/dist/chunk-DM2JDG3D.js +318 -0
- package/dist/chunk-DM2JDG3D.js.map +1 -0
- package/dist/chunk-DW6V4ZCT.cjs +140 -0
- package/dist/chunk-DW6V4ZCT.cjs.map +1 -0
- package/dist/chunk-E4MY6TUE.cjs +255 -0
- package/dist/chunk-E4MY6TUE.cjs.map +1 -0
- package/dist/chunk-EHSWARYY.js +39 -0
- package/dist/chunk-EHSWARYY.js.map +1 -0
- package/dist/chunk-EUOP3MWJ.cjs +118 -0
- package/dist/chunk-EUOP3MWJ.cjs.map +1 -0
- package/dist/chunk-F3SFIX7U.cjs +58 -0
- package/dist/chunk-F3SFIX7U.cjs.map +1 -0
- package/dist/chunk-F63VY23B.js +174 -0
- package/dist/chunk-F63VY23B.js.map +1 -0
- package/dist/chunk-FSLUSFJ2.cjs +75 -0
- package/dist/chunk-FSLUSFJ2.cjs.map +1 -0
- package/dist/chunk-GA52TZC4.js +133 -0
- package/dist/chunk-GA52TZC4.js.map +1 -0
- package/dist/chunk-GRFCSQ2M.js +13 -0
- package/dist/chunk-GRFCSQ2M.js.map +1 -0
- package/dist/chunk-HBRGW3CJ.js +383 -0
- package/dist/chunk-HBRGW3CJ.js.map +1 -0
- package/dist/chunk-HDA2ZOV2.cjs +13 -0
- package/dist/chunk-HDA2ZOV2.cjs.map +1 -0
- package/dist/chunk-HQVTEFSO.js +386 -0
- package/dist/chunk-HQVTEFSO.js.map +1 -0
- package/dist/chunk-IU657MP5.js +270 -0
- package/dist/chunk-IU657MP5.js.map +1 -0
- package/dist/chunk-IY3BNQ5Y.js +24 -0
- package/dist/chunk-IY3BNQ5Y.js.map +1 -0
- package/dist/chunk-J2FIIZSN.js +137 -0
- package/dist/chunk-J2FIIZSN.js.map +1 -0
- package/dist/chunk-JRBJXVXL.cjs +251 -0
- package/dist/chunk-JRBJXVXL.cjs.map +1 -0
- package/dist/chunk-JYWKXNUO.cjs +37 -0
- package/dist/chunk-JYWKXNUO.cjs.map +1 -0
- package/dist/chunk-KE27RJ3X.cjs +954 -0
- package/dist/chunk-KE27RJ3X.cjs.map +1 -0
- package/dist/chunk-M4J3OZJF.cjs +152 -0
- package/dist/chunk-M4J3OZJF.cjs.map +1 -0
- package/dist/chunk-MKUJOEAC.cjs +178 -0
- package/dist/chunk-MKUJOEAC.cjs.map +1 -0
- package/dist/chunk-MNRHGJDQ.cjs +225 -0
- package/dist/chunk-MNRHGJDQ.cjs.map +1 -0
- package/dist/chunk-MNWWZGL2.js +14 -0
- package/dist/chunk-MNWWZGL2.js.map +1 -0
- package/dist/chunk-MWED53XR.js +115 -0
- package/dist/chunk-MWED53XR.js.map +1 -0
- package/dist/chunk-NCQQI2T2.cjs +386 -0
- package/dist/chunk-NCQQI2T2.cjs.map +1 -0
- package/dist/chunk-NGYR4RQF.js +476 -0
- package/dist/chunk-NGYR4RQF.js.map +1 -0
- package/dist/chunk-NNJDJNSY.cjs +197 -0
- package/dist/chunk-NNJDJNSY.cjs.map +1 -0
- package/dist/chunk-NOZVVD6G.cjs +26 -0
- package/dist/chunk-NOZVVD6G.cjs.map +1 -0
- package/dist/chunk-NUG3DWF7.js +55 -0
- package/dist/chunk-NUG3DWF7.js.map +1 -0
- package/dist/chunk-NXAZEYLC.cjs +136 -0
- package/dist/chunk-NXAZEYLC.cjs.map +1 -0
- package/dist/chunk-PNVBMN27.cjs +380 -0
- package/dist/chunk-PNVBMN27.cjs.map +1 -0
- package/dist/chunk-RKDOQV4T.js +73 -0
- package/dist/chunk-RKDOQV4T.js.map +1 -0
- package/dist/chunk-RMZFC7HF.cjs +17 -0
- package/dist/chunk-RMZFC7HF.cjs.map +1 -0
- package/dist/chunk-SBHL3GFW.js +40 -0
- package/dist/chunk-SBHL3GFW.js.map +1 -0
- package/dist/chunk-TFJQ4525.cjs +416 -0
- package/dist/chunk-TFJQ4525.cjs.map +1 -0
- package/dist/chunk-VBJ5FT4C.cjs +273 -0
- package/dist/chunk-VBJ5FT4C.cjs.map +1 -0
- package/dist/chunk-VZFL5BZM.js +222 -0
- package/dist/chunk-VZFL5BZM.js.map +1 -0
- package/dist/chunk-W7VPL5I4.js +252 -0
- package/dist/chunk-W7VPL5I4.js.map +1 -0
- package/dist/chunk-XALQ3ANE.cjs +34 -0
- package/dist/chunk-XALQ3ANE.cjs.map +1 -0
- package/dist/chunk-YCYKV5KF.cjs +43 -0
- package/dist/chunk-YCYKV5KF.cjs.map +1 -0
- package/dist/chunk-YJZGIS4L.cjs +479 -0
- package/dist/chunk-YJZGIS4L.cjs.map +1 -0
- package/dist/chunk-YU5DAILW.cjs +14 -0
- package/dist/chunk-YU5DAILW.cjs.map +1 -0
- package/dist/chunk-YY5WLV63.js +951 -0
- package/dist/chunk-YY5WLV63.js.map +1 -0
- package/dist/chunk-ZS7C474P.js +3 -0
- package/dist/chunk-ZS7C474P.js.map +1 -0
- package/dist/chunk-ZSUGXJWD.js +194 -0
- package/dist/chunk-ZSUGXJWD.js.map +1 -0
- package/dist/chunk-ZWFK5UUU.js +11 -0
- package/dist/chunk-ZWFK5UUU.js.map +1 -0
- package/dist/components/index.cjs +17 -0
- package/dist/components/index.cjs.map +1 -0
- package/dist/components/index.d.cts +8 -0
- package/dist/components/index.d.ts +8 -0
- package/dist/components/index.js +4 -0
- package/dist/components/index.js.map +1 -0
- package/dist/contexts/index.cjs +29 -0
- package/dist/contexts/index.cjs.map +1 -0
- package/dist/contexts/index.d.cts +73 -0
- package/dist/contexts/index.d.ts +73 -0
- package/dist/contexts/index.js +4 -0
- package/dist/contexts/index.js.map +1 -0
- package/dist/core/index.cjs +55 -0
- package/dist/core/index.cjs.map +1 -0
- package/dist/core/index.d.cts +64 -0
- package/dist/core/index.d.ts +64 -0
- package/dist/core/index.js +6 -0
- package/dist/core/index.js.map +1 -0
- package/dist/ui/index.cjs +80 -0
- package/dist/ui/index.cjs.map +1 -0
- package/dist/ui/index.d.cts +69 -0
- package/dist/ui/index.d.ts +69 -0
- package/dist/ui/index.js +7 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/widgets/index.cjs +217 -0
- package/dist/widgets/index.cjs.map +1 -0
- package/dist/widgets/index.d.cts +397 -0
- package/dist/widgets/index.d.ts +397 -0
- package/dist/widgets/index.js +59 -0
- package/dist/widgets/index.js.map +1 -0
- package/package.json +99 -0
- package/styles/globals.css +20 -0
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunk3CUVGQQI_cjs = require('./chunk-3CUVGQQI.cjs');
|
|
4
|
+
var chunkCM7D7WGL_cjs = require('./chunk-CM7D7WGL.cjs');
|
|
5
|
+
var lucideReact = require('lucide-react');
|
|
6
|
+
var reactQuery = require('@tanstack/react-query');
|
|
7
|
+
var context = require('@fluid-app/rep-core/data-sources/context');
|
|
8
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
9
|
+
|
|
10
|
+
var todoKeys = {
|
|
11
|
+
all: ["todos"],
|
|
12
|
+
list: () => [...todoKeys.all, "list"]
|
|
13
|
+
};
|
|
14
|
+
function useTodos() {
|
|
15
|
+
const { baseUrl, getApiHeaders } = context.useDataSourceConfig();
|
|
16
|
+
return reactQuery.useQuery({
|
|
17
|
+
queryKey: todoKeys.list(),
|
|
18
|
+
queryFn: async ({ signal }) => {
|
|
19
|
+
const url = baseUrl ? `${baseUrl}/tasks` : "/tasks";
|
|
20
|
+
const response = await fetch(url, {
|
|
21
|
+
headers: {
|
|
22
|
+
"content-type": "application/json",
|
|
23
|
+
...getApiHeaders?.()
|
|
24
|
+
},
|
|
25
|
+
signal
|
|
26
|
+
});
|
|
27
|
+
if (!response.ok) {
|
|
28
|
+
throw new Error(`Failed to fetch todos: ${response.status}`);
|
|
29
|
+
}
|
|
30
|
+
const data = await response.json();
|
|
31
|
+
return transformTodos(data);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
function transformTodos(rawData) {
|
|
36
|
+
return rawData.map((todo) => ({
|
|
37
|
+
id: todo.id,
|
|
38
|
+
body: todo.body,
|
|
39
|
+
dueAt: todo.due_at,
|
|
40
|
+
completedAt: todo.completed_at,
|
|
41
|
+
createdAt: todo.created_at,
|
|
42
|
+
contactName: todo.contact ? `${todo.contact.first_name} ${todo.contact.last_name}` : null
|
|
43
|
+
}));
|
|
44
|
+
}
|
|
45
|
+
function ToDoWidget({
|
|
46
|
+
// Title defaults
|
|
47
|
+
titleEnabled = true,
|
|
48
|
+
titleText = "To-Do",
|
|
49
|
+
titleFontSize = "lg",
|
|
50
|
+
titleColor = "foreground",
|
|
51
|
+
// Styling defaults
|
|
52
|
+
background = {
|
|
53
|
+
type: "solid",
|
|
54
|
+
color: "background"
|
|
55
|
+
},
|
|
56
|
+
textColor = "foreground",
|
|
57
|
+
accentColor = "primary",
|
|
58
|
+
padding = 4,
|
|
59
|
+
borderRadius = "md",
|
|
60
|
+
// Content defaults
|
|
61
|
+
maxItems = 5,
|
|
62
|
+
className,
|
|
63
|
+
...props
|
|
64
|
+
}) {
|
|
65
|
+
const backgroundColor = background.color || "background";
|
|
66
|
+
const backgroundImage = (background.resource?.image_url || background.resource?.imageUrl) && background.type === "image" ? `url(${background.resource.image_url || background.resource.imageUrl})` : "none";
|
|
67
|
+
const { data: todos = [], isLoading, isError } = useTodos();
|
|
68
|
+
const displayTodos = todos.length > 0 ? todos : [];
|
|
69
|
+
const activeTodos = displayTodos.filter((todo) => !todo.completedAt);
|
|
70
|
+
const todosToShow = activeTodos.slice(0, maxItems);
|
|
71
|
+
const remainingCount = activeTodos.length - todosToShow.length;
|
|
72
|
+
const isEmpty = activeTodos.length === 0;
|
|
73
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
74
|
+
"div",
|
|
75
|
+
{
|
|
76
|
+
className: `overflow-hidden rounded-${borderRadius} bg-${backgroundColor} text-${textColor} p-${padding} ${className ?? ""}`,
|
|
77
|
+
style: { backgroundImage },
|
|
78
|
+
...props,
|
|
79
|
+
children: [
|
|
80
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-3 flex items-center justify-between", children: [
|
|
81
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-3", children: titleEnabled && titleText && /* @__PURE__ */ jsxRuntime.jsx(
|
|
82
|
+
"h2",
|
|
83
|
+
{
|
|
84
|
+
className: `text-${titleFontSize} font-bold text-${titleColor}`,
|
|
85
|
+
children: titleText
|
|
86
|
+
}
|
|
87
|
+
) }),
|
|
88
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
89
|
+
!isEmpty && !isLoading && /* @__PURE__ */ jsxRuntime.jsx("span", { className: `text-2xl font-bold text-${accentColor}`, children: activeTodos.length }),
|
|
90
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
91
|
+
"div",
|
|
92
|
+
{
|
|
93
|
+
className: `flex h-10 w-10 shrink-0 items-center justify-center`,
|
|
94
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ListChecks, { className: `h-5 w-5 text-${accentColor}-foreground` })
|
|
95
|
+
}
|
|
96
|
+
)
|
|
97
|
+
] })
|
|
98
|
+
] }),
|
|
99
|
+
isLoading ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex min-h-[120px] items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-6 w-6 animate-spin rounded-full border-2 border-current border-t-transparent" }) }) : isError ? (
|
|
100
|
+
/* Error state */
|
|
101
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunk3CUVGQQI_cjs.ErrorState, {})
|
|
102
|
+
) : isEmpty ? (
|
|
103
|
+
/* Empty state */
|
|
104
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col items-center justify-center py-8", children: /* @__PURE__ */ jsxRuntime.jsx("p", { className: `text-center text-${textColor}/60`, children: "You've got nothing else To-Do!" }) })
|
|
105
|
+
) : (
|
|
106
|
+
/* Todo List */
|
|
107
|
+
/* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
108
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col", children: todosToShow.map((todo, index) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
109
|
+
"div",
|
|
110
|
+
{
|
|
111
|
+
className: `flex items-center gap-3 py-2.5 ${index !== todosToShow.length - 1 ? `border-b border-${textColor}/10` : ""}`,
|
|
112
|
+
children: [
|
|
113
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
114
|
+
"input",
|
|
115
|
+
{
|
|
116
|
+
type: "checkbox",
|
|
117
|
+
className: `h-5 w-5 rounded-full border-2 border-${textColor}/30 bg-transparent`,
|
|
118
|
+
checked: !!todo.completedAt,
|
|
119
|
+
readOnly: true
|
|
120
|
+
}
|
|
121
|
+
),
|
|
122
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "line-clamp-1 flex-1 text-sm", children: todo.body })
|
|
123
|
+
]
|
|
124
|
+
},
|
|
125
|
+
todo.id
|
|
126
|
+
)) }),
|
|
127
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-2 flex items-center justify-between", children: [
|
|
128
|
+
remainingCount > 0 && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: `text-sm text-${textColor}/50 underline`, children: [
|
|
129
|
+
remainingCount,
|
|
130
|
+
" more task",
|
|
131
|
+
remainingCount > 1 ? "s" : ""
|
|
132
|
+
] }),
|
|
133
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "ml-auto", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Plus, { className: `h-5 w-5 text-${textColor}/50` }) })
|
|
134
|
+
] })
|
|
135
|
+
] })
|
|
136
|
+
)
|
|
137
|
+
]
|
|
138
|
+
}
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
var toDoWidgetPropertySchema = {
|
|
142
|
+
widgetType: "ToDoWidget",
|
|
143
|
+
displayName: "To-Do Widget",
|
|
144
|
+
tabsConfig: [{ id: "styling", label: "Styling" }],
|
|
145
|
+
fields: [
|
|
146
|
+
// Styling Tab - Title Group
|
|
147
|
+
{
|
|
148
|
+
key: "titleEnabled",
|
|
149
|
+
label: "Widget Title",
|
|
150
|
+
type: "boolean",
|
|
151
|
+
description: "Enable the title displayed above the todo list",
|
|
152
|
+
defaultValue: true,
|
|
153
|
+
tab: "styling",
|
|
154
|
+
group: "Title"
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
key: "titleText",
|
|
158
|
+
label: "Title",
|
|
159
|
+
type: "text",
|
|
160
|
+
description: "Title text displayed above the todo list",
|
|
161
|
+
defaultValue: "To-Do",
|
|
162
|
+
tab: "styling",
|
|
163
|
+
group: "Title",
|
|
164
|
+
requiresKeyToBeTrue: "titleEnabled"
|
|
165
|
+
},
|
|
166
|
+
chunkCM7D7WGL_cjs.getFontSizeField({
|
|
167
|
+
key: "titleFontSize",
|
|
168
|
+
label: "Title Font Size",
|
|
169
|
+
description: "Font size for the widget title",
|
|
170
|
+
defaultValue: "xl",
|
|
171
|
+
tab: "styling",
|
|
172
|
+
group: "Title",
|
|
173
|
+
requiresKeyToBeTrue: "titleEnabled"
|
|
174
|
+
}),
|
|
175
|
+
chunkCM7D7WGL_cjs.getColorField({
|
|
176
|
+
key: "titleColor",
|
|
177
|
+
label: "Title Color",
|
|
178
|
+
description: "Color for the widget title",
|
|
179
|
+
defaultValue: "foreground",
|
|
180
|
+
tab: "styling",
|
|
181
|
+
group: "Title",
|
|
182
|
+
requiresKeyToBeTrue: "titleEnabled"
|
|
183
|
+
}),
|
|
184
|
+
// Styling Tab - Design Group
|
|
185
|
+
{
|
|
186
|
+
type: "background",
|
|
187
|
+
key: "background",
|
|
188
|
+
label: "Background",
|
|
189
|
+
description: "Background for the widget container",
|
|
190
|
+
defaultValue: "background",
|
|
191
|
+
tab: "styling",
|
|
192
|
+
group: "Design"
|
|
193
|
+
},
|
|
194
|
+
chunkCM7D7WGL_cjs.getColorField({
|
|
195
|
+
key: "textColor",
|
|
196
|
+
label: "Text Color",
|
|
197
|
+
description: "Default text color for todo items",
|
|
198
|
+
defaultValue: "foreground",
|
|
199
|
+
tab: "styling",
|
|
200
|
+
group: "Design"
|
|
201
|
+
}),
|
|
202
|
+
chunkCM7D7WGL_cjs.getColorField({
|
|
203
|
+
key: "accentColor",
|
|
204
|
+
label: "Accent Color",
|
|
205
|
+
description: "Color used for count badge and icon",
|
|
206
|
+
defaultValue: "primary",
|
|
207
|
+
tab: "styling",
|
|
208
|
+
group: "Design"
|
|
209
|
+
}),
|
|
210
|
+
{
|
|
211
|
+
key: "separator",
|
|
212
|
+
type: "separator",
|
|
213
|
+
label: "Separator",
|
|
214
|
+
tab: "styling",
|
|
215
|
+
group: "Design"
|
|
216
|
+
},
|
|
217
|
+
{
|
|
218
|
+
key: "maxItems",
|
|
219
|
+
label: "Max Items",
|
|
220
|
+
type: "number",
|
|
221
|
+
description: "Maximum number of todo items to display",
|
|
222
|
+
min: 1,
|
|
223
|
+
max: 20,
|
|
224
|
+
step: 1,
|
|
225
|
+
defaultValue: 5,
|
|
226
|
+
tab: "styling",
|
|
227
|
+
group: "Design"
|
|
228
|
+
},
|
|
229
|
+
chunkCM7D7WGL_cjs.getPaddingField({
|
|
230
|
+
key: "padding",
|
|
231
|
+
label: "Padding",
|
|
232
|
+
description: "Padding around the widget container",
|
|
233
|
+
defaultValue: 4,
|
|
234
|
+
tab: "styling",
|
|
235
|
+
group: "Design"
|
|
236
|
+
}),
|
|
237
|
+
chunkCM7D7WGL_cjs.getBorderRadiusField({
|
|
238
|
+
key: "borderRadius",
|
|
239
|
+
label: "Border Radius",
|
|
240
|
+
description: "Border radius for the widget container",
|
|
241
|
+
defaultValue: "md",
|
|
242
|
+
tab: "styling",
|
|
243
|
+
group: "Design"
|
|
244
|
+
})
|
|
245
|
+
]
|
|
246
|
+
};
|
|
247
|
+
|
|
248
|
+
exports.ToDoWidget = ToDoWidget;
|
|
249
|
+
exports.toDoWidgetPropertySchema = toDoWidgetPropertySchema;
|
|
250
|
+
//# sourceMappingURL=chunk-JRBJXVXL.cjs.map
|
|
251
|
+
//# sourceMappingURL=chunk-JRBJXVXL.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/use-todos.ts","../src/widgets/ToDoWidget.tsx"],"names":["useDataSourceConfig","useQuery","jsxs","jsx","ListChecks","ErrorState","Fragment","Plus","getFontSizeField","getColorField","getPaddingField","getBorderRadiusField"],"mappings":"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","file":"chunk-JRBJXVXL.cjs","sourcesContent":["import { useQuery } from \"@tanstack/react-query\";\nimport { useDataSourceConfig } from \"@fluid-app/rep-core/data-sources/context\";\n\n// Query key factory\nexport const todoKeys = {\n all: [\"todos\"] as const,\n list: () => [...todoKeys.all, \"list\"] as const,\n};\n\n// API types matching the Fluid API response\nexport type TodoContact = {\n id: number;\n first_name: string;\n last_name: string;\n};\n\nexport type ApiTodo = {\n id: number;\n body: string;\n due_at: string | null;\n completed_at: string | null;\n created_at: string;\n contact: TodoContact | null;\n};\n\n// Transformed todo for display\nexport type Todo = {\n id: number;\n body: string;\n dueAt: string | null;\n completedAt: string | null;\n createdAt: string;\n contactName: string | null;\n};\n\nexport function useTodos() {\n const { baseUrl, getApiHeaders } = useDataSourceConfig();\n\n return useQuery({\n queryKey: todoKeys.list(),\n queryFn: async ({ signal }): Promise<Todo[]> => {\n const url = baseUrl ? `${baseUrl}/tasks` : \"/tasks\";\n const response = await fetch(url, {\n headers: {\n \"content-type\": \"application/json\",\n ...getApiHeaders?.(),\n },\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch todos: ${response.status}`);\n }\n\n const data: ApiTodo[] = await response.json();\n return transformTodos(data);\n },\n });\n}\n\nfunction transformTodos(rawData: ApiTodo[]): Todo[] {\n return rawData.map((todo) => ({\n id: todo.id,\n body: todo.body,\n dueAt: todo.due_at,\n completedAt: todo.completed_at,\n createdAt: todo.created_at,\n contactName: todo.contact\n ? `${todo.contact.first_name} ${todo.contact.last_name}`\n : null,\n }));\n}\n","import type { ComponentProps } from \"react\";\nimport type {\n BackgroundValue,\n BorderRadiusOptions,\n ColorOptions,\n FontSizeOptions,\n PaddingOptions,\n} from \"@fluid-app/rep-core/types\";\nimport type { WidgetPropertySchema } from \"@fluid-app/rep-core/registries\";\nimport {\n getBorderRadiusField,\n getColorField,\n getFontSizeField,\n getPaddingField,\n} from \"../core/fields\";\nimport { ListChecks, Plus } from \"lucide-react\";\nimport { useTodos } from \"../hooks/use-todos\";\nimport { ErrorState } from \"../components/error-state\";\n\ntype ToDoWidgetProps = ComponentProps<\"div\"> & {\n // Title\n titleEnabled?: boolean;\n titleText?: string;\n titleFontSize?: FontSizeOptions;\n titleColor?: ColorOptions;\n\n // Styling\n background?: BackgroundValue;\n textColor?: ColorOptions;\n accentColor?: ColorOptions;\n padding?: PaddingOptions;\n borderRadius?: BorderRadiusOptions;\n\n // Content\n maxItems?: number;\n};\n\nexport function ToDoWidget({\n // Title defaults\n titleEnabled = true,\n titleText = \"To-Do\",\n titleFontSize = \"lg\",\n titleColor = \"foreground\",\n\n // Styling defaults\n background = {\n type: \"solid\",\n color: \"background\",\n },\n textColor = \"foreground\",\n accentColor = \"primary\",\n padding = 4,\n borderRadius = \"md\",\n\n // Content defaults\n maxItems = 5,\n\n className,\n ...props\n}: ToDoWidgetProps) {\n const backgroundColor = background.color || \"background\";\n const backgroundImage =\n (background.resource?.image_url || background.resource?.imageUrl) &&\n background.type === \"image\"\n ? `url(${background.resource.image_url || background.resource.imageUrl})`\n : \"none\";\n const { data: todos = [], isLoading, isError } = useTodos();\n\n // Use API data if available, otherwise fall back to demo data\n const displayTodos = todos.length > 0 ? todos : [];\n\n // Filter out completed tasks\n const activeTodos = displayTodos.filter((todo) => !todo.completedAt);\n const todosToShow = activeTodos.slice(0, maxItems);\n const remainingCount = activeTodos.length - todosToShow.length;\n const isEmpty = activeTodos.length === 0;\n\n return (\n <div\n className={`overflow-hidden rounded-${borderRadius} bg-${backgroundColor} text-${textColor} p-${padding} ${className ?? \"\"}`}\n style={{ backgroundImage }}\n {...props}\n >\n {/* Header */}\n <div className=\"mb-3 flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n {titleEnabled && titleText && (\n <h2\n className={`text-${titleFontSize} font-bold text-${titleColor}`}\n >\n {titleText}\n </h2>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n {!isEmpty && !isLoading && (\n <span className={`text-2xl font-bold text-${accentColor}`}>\n {activeTodos.length}\n </span>\n )}\n <div\n className={`flex h-10 w-10 shrink-0 items-center justify-center`}\n >\n <ListChecks className={`h-5 w-5 text-${accentColor}-foreground`} />\n </div>\n </div>\n </div>\n\n {/* Loading state */}\n {isLoading ? (\n <div className=\"flex min-h-[120px] items-center justify-center\">\n <div className=\"h-6 w-6 animate-spin rounded-full border-2 border-current border-t-transparent\" />\n </div>\n ) : isError ? (\n /* Error state */\n <ErrorState />\n ) : isEmpty ? (\n /* Empty state */\n <div className=\"flex flex-col items-center justify-center py-8\">\n <p className={`text-center text-${textColor}/60`}>\n You've got nothing else To-Do!\n </p>\n </div>\n ) : (\n /* Todo List */\n <>\n <div className=\"flex flex-col\">\n {todosToShow.map((todo, index) => (\n <div\n key={todo.id}\n className={`flex items-center gap-3 py-2.5 ${\n index !== todosToShow.length - 1\n ? `border-b border-${textColor}/10`\n : \"\"\n }`}\n >\n <input\n type=\"checkbox\"\n className={`h-5 w-5 rounded-full border-2 border-${textColor}/30 bg-transparent`}\n checked={!!todo.completedAt}\n readOnly\n />\n <span className=\"line-clamp-1 flex-1 text-sm\">{todo.body}</span>\n </div>\n ))}\n </div>\n\n {/* Footer */}\n <div className=\"mt-2 flex items-center justify-between\">\n {remainingCount > 0 && (\n <span className={`text-sm text-${textColor}/50 underline`}>\n {remainingCount} more task{remainingCount > 1 ? \"s\" : \"\"}\n </span>\n )}\n <div className=\"ml-auto\">\n <Plus className={`h-5 w-5 text-${textColor}/50`} />\n </div>\n </div>\n </>\n )}\n </div>\n );\n}\n\nexport const toDoWidgetPropertySchema: WidgetPropertySchema = {\n widgetType: \"ToDoWidget\",\n displayName: \"To-Do Widget\",\n tabsConfig: [{ id: \"styling\", label: \"Styling\" }],\n fields: [\n // Styling Tab - Title Group\n {\n key: \"titleEnabled\",\n label: \"Widget Title\",\n type: \"boolean\",\n description: \"Enable the title displayed above the todo list\",\n defaultValue: true,\n tab: \"styling\",\n group: \"Title\",\n },\n {\n key: \"titleText\",\n label: \"Title\",\n type: \"text\",\n description: \"Title text displayed above the todo list\",\n defaultValue: \"To-Do\",\n tab: \"styling\",\n group: \"Title\",\n requiresKeyToBeTrue: \"titleEnabled\",\n },\n getFontSizeField({\n key: \"titleFontSize\",\n label: \"Title Font Size\",\n description: \"Font size for the widget title\",\n defaultValue: \"xl\",\n tab: \"styling\",\n group: \"Title\",\n requiresKeyToBeTrue: \"titleEnabled\",\n }),\n getColorField({\n key: \"titleColor\",\n label: \"Title Color\",\n description: \"Color for the widget title\",\n defaultValue: \"foreground\",\n tab: \"styling\",\n group: \"Title\",\n requiresKeyToBeTrue: \"titleEnabled\",\n }),\n\n // Styling Tab - Design Group\n {\n type: \"background\",\n key: \"background\",\n label: \"Background\",\n description: \"Background for the widget container\",\n defaultValue: \"background\",\n tab: \"styling\",\n group: \"Design\",\n },\n getColorField({\n key: \"textColor\",\n label: \"Text Color\",\n description: \"Default text color for todo items\",\n defaultValue: \"foreground\",\n tab: \"styling\",\n group: \"Design\",\n }),\n getColorField({\n key: \"accentColor\",\n label: \"Accent Color\",\n description: \"Color used for count badge and icon\",\n defaultValue: \"primary\",\n tab: \"styling\",\n group: \"Design\",\n }),\n {\n key: \"separator\",\n type: \"separator\",\n label: \"Separator\",\n tab: \"styling\",\n group: \"Design\",\n },\n {\n key: \"maxItems\",\n label: \"Max Items\",\n type: \"number\",\n description: \"Maximum number of todo items to display\",\n min: 1,\n max: 20,\n step: 1,\n defaultValue: 5,\n tab: \"styling\",\n group: \"Design\",\n },\n getPaddingField({\n key: \"padding\",\n label: \"Padding\",\n description: \"Padding around the widget container\",\n defaultValue: 4,\n tab: \"styling\",\n group: \"Design\",\n }),\n getBorderRadiusField({\n key: \"borderRadius\",\n label: \"Border Radius\",\n description: \"Border radius for the widget container\",\n defaultValue: \"md\",\n tab: \"styling\",\n group: \"Design\",\n }),\n ],\n} as const satisfies WidgetPropertySchema;\n"]}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var react = require('react');
|
|
4
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
5
|
+
|
|
6
|
+
// src/contexts/RegistryContext.tsx
|
|
7
|
+
var RegistryContext = react.createContext(
|
|
8
|
+
void 0
|
|
9
|
+
);
|
|
10
|
+
function RegistryProvider({
|
|
11
|
+
registry,
|
|
12
|
+
children
|
|
13
|
+
}) {
|
|
14
|
+
const parentRegistry = react.useContext(RegistryContext);
|
|
15
|
+
const contextValue = registry ?? parentRegistry;
|
|
16
|
+
if (!contextValue) {
|
|
17
|
+
throw new Error(
|
|
18
|
+
"RegistryProvider requires a registry prop or must be nested within another RegistryProvider."
|
|
19
|
+
);
|
|
20
|
+
}
|
|
21
|
+
return /* @__PURE__ */ jsxRuntime.jsx(RegistryContext.Provider, { value: contextValue, children });
|
|
22
|
+
}
|
|
23
|
+
function useRegistry() {
|
|
24
|
+
const registry = react.useContext(RegistryContext);
|
|
25
|
+
if (!registry) {
|
|
26
|
+
throw new Error(
|
|
27
|
+
"useRegistry must be used within a RegistryProvider with a registry prop."
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
return registry;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
exports.RegistryContext = RegistryContext;
|
|
34
|
+
exports.RegistryProvider = RegistryProvider;
|
|
35
|
+
exports.useRegistry = useRegistry;
|
|
36
|
+
//# sourceMappingURL=chunk-JYWKXNUO.cjs.map
|
|
37
|
+
//# sourceMappingURL=chunk-JYWKXNUO.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/contexts/RegistryContext.tsx"],"names":["createContext","useContext"],"mappings":";;;;;;AAwCO,IAAM,eAAA,GAAkBA,mBAAA;AAAA,EAC7B;AACF;AAWO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,QAAA;AAAA,EACA;AACF,CAAA,EAA0B;AAExB,EAAA,MAAM,cAAA,GAAiBC,iBAAW,eAAe,CAAA;AACjD,EAAA,MAAM,eAAe,QAAA,IAAY,cAAA;AAEjC,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAEA,EAAA,sCACG,eAAA,CAAgB,QAAA,EAAhB,EAAyB,KAAA,EAAO,cAC9B,QAAA,EACH,CAAA;AAEJ;AAMO,SAAS,WAAA,GAA8B;AAC5C,EAAA,MAAM,QAAA,GAAWA,iBAAW,eAAe,CAAA;AAE3C,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAEA,EAAA,OAAO,QAAA;AACT","file":"chunk-JYWKXNUO.cjs","sourcesContent":["import {\n createContext,\n useContext,\n type ComponentType,\n type ReactNode,\n} from \"react\";\nimport type { WidgetSchema } from \"@fluid-app/rep-core/types\";\n\n/**\n * Base props interface for widget components.\n * All widgets receive at least these props from the ScreenRenderer.\n */\nexport interface WidgetBaseProps {\n readonly widget: WidgetSchema;\n readonly path?: readonly number[];\n}\n\n/**\n * Generic widget component type.\n * Widgets receive WidgetBaseProps and may have additional props.\n */\nexport type WidgetComponent<P extends WidgetBaseProps = WidgetBaseProps> =\n ComponentType<P>;\n\n/**\n * Registry mapping widget type names to their components.\n * The keys are widget type strings (e.g., \"TextWidget\", \"ButtonWidget\").\n * Using WidgetComponent for the value type provides better type safety than `any`.\n */\nexport type WidgetRegistry = Readonly<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Widget props vary by type\n Record<string, WidgetComponent<any>>\n>;\n\n/**\n * Context for providing the widget registry to all components in the tree.\n * This eliminates prop drilling and makes the registry accessible anywhere.\n *\n * Default to undefined - registry must be provided by a RegistryProvider.\n */\nexport const RegistryContext = createContext<WidgetRegistry | undefined>(\n undefined,\n);\n\nexport interface RegistryProviderProps {\n registry?: WidgetRegistry;\n children: ReactNode;\n}\n\n/**\n * Provider component that makes the widget registry available to all descendants.\n * A registry must be provided either via props or by nesting within another RegistryProvider.\n */\nexport function RegistryProvider({\n registry,\n children,\n}: RegistryProviderProps) {\n // If no registry provided, inherit from parent provider\n const parentRegistry = useContext(RegistryContext);\n const contextValue = registry ?? parentRegistry;\n\n if (!contextValue) {\n throw new Error(\n \"RegistryProvider requires a registry prop or must be nested within another RegistryProvider.\",\n );\n }\n\n return (\n <RegistryContext.Provider value={contextValue}>\n {children}\n </RegistryContext.Provider>\n );\n}\n\n/**\n * Hook to access the widget registry from anywhere in the component tree.\n * Must be used within a RegistryProvider that has a registry prop.\n */\nexport function useRegistry(): WidgetRegistry {\n const registry = useContext(RegistryContext);\n\n if (!registry) {\n throw new Error(\n \"useRegistry must be used within a RegistryProvider with a registry prop.\",\n );\n }\n\n return registry;\n}\n"]}
|