@fayz-ai/plugin-courses 0.8.0 → 0.8.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/dist/index.cjs +16 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -8
- package/dist/index.js.map +1 -1
- package/dist/pages/CoursesListPage.d.ts.map +1 -1
- package/dist/pages/FinancialPage.d.ts.map +1 -1
- package/package.json +5 -5
- package/src/index.ts +17 -5
- package/src/pages/CoursesListPage.tsx +19 -6
- package/src/pages/FinancialPage.tsx +5 -0
package/dist/index.cjs
CHANGED
|
@@ -336,6 +336,8 @@ function CoursesListPage() {
|
|
|
336
336
|
const shellOwnsHeader = ui.useModuleLayout() === "tabs";
|
|
337
337
|
const [courses$1, setCourses] = React2__namespace.useState(null);
|
|
338
338
|
const [creating, setCreating] = React2__namespace.useState(false);
|
|
339
|
+
const guardCourses = saas.useLimitGuard("courses");
|
|
340
|
+
const can = saas.usePermissionOptional();
|
|
339
341
|
const load = React2__namespace.useCallback(async () => {
|
|
340
342
|
setCourses(await courses.getCoursesProvider().listCourses());
|
|
341
343
|
}, []);
|
|
@@ -343,24 +345,27 @@ function CoursesListPage() {
|
|
|
343
345
|
void load();
|
|
344
346
|
}, [load]);
|
|
345
347
|
async function onCreate() {
|
|
348
|
+
if (!can("courses", "create")) return;
|
|
349
|
+
if (await guardCourses() === "blocked") return;
|
|
346
350
|
setCreating(true);
|
|
347
351
|
try {
|
|
348
352
|
const course = await courses.getCoursesProvider().createCourse({
|
|
349
353
|
title: t("courses.editor.untitledCourse") || "Untitled course",
|
|
350
354
|
status: "draft"
|
|
351
355
|
});
|
|
356
|
+
saas.invalidateLimit("courses");
|
|
352
357
|
navigateTo(`/courses/${course.id}`);
|
|
353
358
|
} finally {
|
|
354
359
|
setCreating(false);
|
|
355
360
|
}
|
|
356
361
|
}
|
|
357
362
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto max-w-6xl p-6 md:p-8", children: [
|
|
358
|
-
shellOwnsHeader ? /* @__PURE__ */ jsxRuntime.jsx(ui.PageHeaderActions, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { onClick: onCreate, disabled: creating, children: t("courses.new") || "New course" }) }) : /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-6 flex items-center justify-between", children: [
|
|
363
|
+
shellOwnsHeader ? /* @__PURE__ */ jsxRuntime.jsx(ui.PageHeaderActions, { children: /* @__PURE__ */ jsxRuntime.jsx(saas.PermissionGate, { feature: "courses", action: "create", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { onClick: onCreate, disabled: creating, children: t("courses.new") || "New course" }) }) }) : /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-6 flex items-center justify-between", children: [
|
|
359
364
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
360
365
|
/* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-2xl font-bold text-foreground", children: t("courses.title") || "Courses" }),
|
|
361
366
|
courses$1 && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1 text-sm text-muted-foreground", children: (t("courses.count") || "{count} courses").replace("{count}", String(courses$1.length)) })
|
|
362
367
|
] }),
|
|
363
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Button, { onClick: onCreate, disabled: creating, children: t("courses.new") || "New course" })
|
|
368
|
+
/* @__PURE__ */ jsxRuntime.jsx(saas.PermissionGate, { feature: "courses", action: "create", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { onClick: onCreate, disabled: creating, children: t("courses.new") || "New course" }) })
|
|
364
369
|
] }),
|
|
365
370
|
courses$1 && courses$1.length === 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-xl border border-dashed border-border p-12 text-center text-muted-foreground", children: t("courses.empty") || "No courses yet. Create your first one." }),
|
|
366
371
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3", children: courses$1?.map((course) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
@@ -1022,13 +1027,14 @@ function createCoursesPlugin(options) {
|
|
|
1022
1027
|
const base = options?.navPosition ?? 1;
|
|
1023
1028
|
const section = options?.navSection ?? "main";
|
|
1024
1029
|
const modules = options?.modules ?? {};
|
|
1030
|
+
const labels = options?.labels ?? {};
|
|
1025
1031
|
const navigation = [
|
|
1026
1032
|
{ section, position: base, label: options?.navLabel ?? "Courses", route: "/courses", icon: "BookOpen", permission: read("courses") },
|
|
1027
|
-
...modules.membersArea ? [{ section, position: base + 1, label: "Members area", route: "/courses/members", icon: "GraduationCap", permission: read("courses") }] : [],
|
|
1028
|
-
...modules.sales ? [{ section, position: base + 2, label: "Sales", route: "/courses/sales", icon: "TrendingUp", permission: read("courses.sales") }] : [],
|
|
1029
|
-
...modules.subscriptions ? [{ section, position: base + 3, label: "Subscriptions", route: "/courses/subscriptions", icon: "Repeat", permission: read("courses.sales") }] : [],
|
|
1030
|
-
...modules.financial ? [{ section, position: base + 4, label: "Financial", route: "/courses/financial", icon: "CreditCard", permission: read("courses.finance") }] : [],
|
|
1031
|
-
...modules.reports ? [{ section, position: base + 5, label: "Reports", route: "/courses/reports", icon: "BarChart3", permission: read("courses.sales") }] : []
|
|
1033
|
+
...modules.membersArea ? [{ section, position: base + 1, label: labels.membersArea ?? "Members area", route: "/courses/members", icon: "GraduationCap", permission: read("courses") }] : [],
|
|
1034
|
+
...modules.sales ? [{ section, position: base + 2, label: labels.sales ?? "Sales", route: "/courses/sales", icon: "TrendingUp", permission: read("courses.sales") }] : [],
|
|
1035
|
+
...modules.subscriptions ? [{ section, position: base + 3, label: labels.subscriptions ?? "Subscriptions", route: "/courses/subscriptions", icon: "Repeat", permission: read("courses.sales") }] : [],
|
|
1036
|
+
...modules.financial ? [{ section, position: base + 4, label: labels.financial ?? "Financial", route: "/courses/financial", icon: "CreditCard", permission: read("courses.finance") }] : [],
|
|
1037
|
+
...modules.reports ? [{ section, position: base + 5, label: labels.reports ?? "Reports", route: "/courses/reports", icon: "BarChart3", permission: read("courses.sales") }] : []
|
|
1032
1038
|
];
|
|
1033
1039
|
const routes = [
|
|
1034
1040
|
// Static segments outscore the `:id` param in the saas router, so these
|
|
@@ -1059,6 +1065,9 @@ function createCoursesPlugin(options) {
|
|
|
1059
1065
|
{ id: "courses.sales", label: "Sales", group: "Courses" },
|
|
1060
1066
|
{ id: "courses.finance", label: "Financial", group: "Courses" }
|
|
1061
1067
|
],
|
|
1068
|
+
declaredLimits: [
|
|
1069
|
+
{ key: "courses", label: "Courses", table: "plg_courses_courses" }
|
|
1070
|
+
],
|
|
1062
1071
|
navigation,
|
|
1063
1072
|
routes,
|
|
1064
1073
|
widgets: [],
|