@arch-cadre/panel 0.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/dist/actions/activity-log/index.cjs +19 -0
  2. package/dist/actions/activity-log/index.d.ts +1 -0
  3. package/dist/actions/activity-log/index.mjs +10 -0
  4. package/dist/actions/rbac/index.cjs +130 -0
  5. package/dist/actions/rbac/index.d.ts +35 -0
  6. package/dist/actions/rbac/index.mjs +92 -0
  7. package/dist/actions/session-manager/index.cjs +99 -0
  8. package/dist/actions/session-manager/index.d.ts +21 -0
  9. package/dist/actions/session-manager/index.mjs +73 -0
  10. package/dist/index.cjs +68 -1
  11. package/dist/index.d.ts +6 -0
  12. package/dist/index.mjs +90 -0
  13. package/dist/navigation.cjs +15 -1
  14. package/dist/navigation.mjs +17 -1
  15. package/dist/routes.cjs +31 -6
  16. package/dist/routes.mjs +34 -6
  17. package/dist/schema/activity-log.cjs +23 -0
  18. package/dist/schema/activity-log.d.ts +103 -0
  19. package/dist/schema/activity-log.mjs +15 -0
  20. package/dist/schema.cjs +16 -0
  21. package/dist/schema.d.ts +1 -0
  22. package/dist/schema.mjs +1 -0
  23. package/dist/ui/activity-log/components/ActivityStatsWidget.cjs +35 -0
  24. package/dist/ui/activity-log/components/ActivityStatsWidget.d.ts +2 -0
  25. package/dist/ui/activity-log/components/ActivityStatsWidget.mjs +15 -0
  26. package/dist/ui/activity-log/components/RecentLogsWidget.cjs +50 -0
  27. package/dist/ui/activity-log/components/RecentLogsWidget.d.ts +2 -0
  28. package/dist/ui/activity-log/components/RecentLogsWidget.mjs +29 -0
  29. package/dist/ui/activity-log/pages/log-list.cjs +61 -0
  30. package/dist/ui/activity-log/pages/log-list.d.ts +2 -0
  31. package/dist/ui/activity-log/pages/log-list.mjs +36 -0
  32. package/dist/ui/components/app-user.cjs +4 -5
  33. package/dist/ui/components/app-user.mjs +5 -7
  34. package/dist/ui/components/profile/components.cjs +4 -1
  35. package/dist/ui/components/profile/components.d.ts +4 -3
  36. package/dist/ui/components/profile/components.mjs +1 -0
  37. package/dist/ui/components/profile/link.cjs +10 -1
  38. package/dist/ui/components/profile/link.d.ts +2 -1
  39. package/dist/ui/components/profile/link.mjs +2 -1
  40. package/dist/ui/components/profile/page.cjs +4 -1
  41. package/dist/ui/components/profile/page.d.ts +2 -1
  42. package/dist/ui/components/profile/page.mjs +9 -2
  43. package/dist/ui/dashboard/page.cjs +6 -16
  44. package/dist/ui/dashboard/page.d.ts +1 -1
  45. package/dist/ui/dashboard/page.mjs +14 -6
  46. package/dist/ui/dashboard/widgets/WelcomeBackUserWidget.cjs +43 -0
  47. package/dist/ui/dashboard/widgets/WelcomeBackUserWidget.d.ts +2 -0
  48. package/dist/ui/dashboard/widgets/WelcomeBackUserWidget.mjs +18 -0
  49. package/dist/ui/rbac/pages/rbac-admin.cjs +328 -0
  50. package/dist/ui/rbac/pages/rbac-admin.d.ts +2 -0
  51. package/dist/ui/rbac/pages/rbac-admin.mjs +375 -0
  52. package/dist/ui/session-manager/components/sessions-list.cjs +160 -0
  53. package/dist/ui/session-manager/components/sessions-list.d.ts +13 -0
  54. package/dist/ui/session-manager/components/sessions-list.mjs +193 -0
  55. package/dist/ui/session-manager/pages/sessions-page.cjs +29 -0
  56. package/dist/ui/session-manager/pages/sessions-page.d.ts +2 -0
  57. package/dist/ui/session-manager/pages/sessions-page.mjs +9 -0
  58. package/locales/en/global.json +109 -1
  59. package/locales/pl/global.json +188 -0
  60. package/package.json +7 -6
  61. package/dist/ui/[...catchAll]/page.cjs +0 -127
  62. package/dist/ui/[...catchAll]/page.d.ts +0 -13
  63. package/dist/ui/[...catchAll]/page.mjs +0 -88
@@ -23,8 +23,22 @@ const navigation = exports.navigation = {
23
23
  title: (0, _intl.i18n)("Module Manager"),
24
24
  url: "/modules",
25
25
  icon: "solar:settings-bold-duotone",
26
- roles: ["admin"],
26
+ // roles: ["admin"],
27
27
  permissions: ["system:modules"]
28
+ }, {
29
+ id: "activity-logs-nav",
30
+ title: (0, _intl.i18n)("Activity Logs"),
31
+ url: "/activity-logs",
32
+ icon: "solar:condicioner-2-bold-duotone",
33
+ // roles: ["admin"],
34
+ permissions: ["system:activity-logs"]
35
+ }, {
36
+ id: "rbac-admin-nav",
37
+ title: (0, _intl.i18n)("Roles & Permissions"),
38
+ url: "/rbac",
39
+ icon: "solar:shield-keyhole-bold-duotone",
40
+ // roles: ["admin"],
41
+ permissions: ["system:rbac"]
28
42
  }]
29
43
  },
30
44
  settings: {
@@ -21,8 +21,24 @@ export const navigation = {
21
21
  title: i18n("Module Manager"),
22
22
  url: "/modules",
23
23
  icon: "solar:settings-bold-duotone",
24
- roles: ["admin"],
24
+ // roles: ["admin"],
25
25
  permissions: ["system:modules"]
26
+ },
27
+ {
28
+ id: "activity-logs-nav",
29
+ title: i18n("Activity Logs"),
30
+ url: "/activity-logs",
31
+ icon: "solar:condicioner-2-bold-duotone",
32
+ // roles: ["admin"],
33
+ permissions: ["system:activity-logs"]
34
+ },
35
+ {
36
+ id: "rbac-admin-nav",
37
+ title: i18n("Roles & Permissions"),
38
+ url: "/rbac",
39
+ icon: "solar:shield-keyhole-bold-duotone",
40
+ // roles: ["admin"],
41
+ permissions: ["system:rbac"]
26
42
  }
27
43
  ]
28
44
  },
package/dist/routes.cjs CHANGED
@@ -7,9 +7,12 @@ exports.publicRoutes = exports.privateRoutes = exports.apiRoutes = void 0;
7
7
  var _server = require("@arch-cadre/modules/server");
8
8
  var _dynamic = _interopRequireDefault(require("next/dynamic"));
9
9
  var _server2 = require("next/server");
10
+ var _logList = _interopRequireDefault(require("./ui/activity-log/pages/log-list.cjs"));
10
11
  var _page = _interopRequireDefault(require("./ui/components/profile/page.cjs"));
11
12
  var _page2 = _interopRequireDefault(require("./ui/modules/docs/page.cjs"));
12
13
  var _page3 = _interopRequireDefault(require("./ui/modules/page.cjs"));
14
+ var _rbacAdmin = _interopRequireDefault(require("./ui/rbac/pages/rbac-admin.cjs"));
15
+ var _sessionsPage = _interopRequireDefault(require("./ui/session-manager/pages/sessions-page.cjs"));
13
16
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
14
17
  const KryoLayout = (0, _dynamic.default)(() => Promise.resolve().then(() => require("./ui/layout.cjs")));
15
18
  const DashboardPage = (0, _dynamic.default)(() => Promise.resolve().then(() => require("./ui/dashboard/page.cjs")));
@@ -22,31 +25,53 @@ const privateRoutes = exports.privateRoutes = [{
22
25
  component: DashboardPage,
23
26
  layout: KryoLayout,
24
27
  auth: true,
25
- roles: ["admin"]
28
+ roles: ["admin", "user"]
26
29
  }, {
27
30
  path: "/profile",
28
31
  component: _page.default,
29
32
  auth: true,
30
33
  roles: ["admin", "user"]
34
+ }, {
35
+ id: "user-sessions",
36
+ path: "/sessions",
37
+ component: _sessionsPage.default,
38
+ layout: KryoLayout,
39
+ auth: true,
40
+ roles: ["admin", "user"]
41
+ }, {
42
+ id: "activity-logs",
43
+ path: "/activity-logs",
44
+ component: _logList.default,
45
+ layout: KryoLayout,
46
+ auth: true,
47
+ permissions: ["system:activity-logs"]
48
+ }, {
49
+ id: "rbac-admin",
50
+ path: "/rbac",
51
+ component: _rbacAdmin.default,
52
+ layout: KryoLayout,
53
+ auth: true,
54
+ roles: ["admin", "user"],
55
+ permissions: ["system:rbac"]
31
56
  }, {
32
57
  path: "/settings",
33
58
  component: GlobalSettingsPage,
34
59
  layout: KryoLayout,
35
60
  auth: true,
36
- roles: ["admin"]
61
+ roles: ["admin", "user"]
37
62
  }, {
38
63
  path: "/settings/panel/config",
39
64
  component: KryoPanelSettingsPage,
40
65
  layout: KryoLayout,
41
66
  auth: true,
42
- roles: ["admin"]
67
+ roles: ["admin", "user"]
43
68
  }, {
44
69
  id: "module-admin",
45
70
  path: "/modules",
46
71
  component: _page3.default,
47
72
  layout: KryoLayout,
48
73
  auth: true,
49
- roles: ["admin"],
74
+ roles: ["admin", "user"],
50
75
  permissions: ["system:modules"]
51
76
  }, {
52
77
  id: "module-docs",
@@ -54,13 +79,13 @@ const privateRoutes = exports.privateRoutes = [{
54
79
  component: _page2.default,
55
80
  layout: KryoLayout,
56
81
  auth: true,
57
- roles: ["admin"]
82
+ roles: ["admin", "user"]
58
83
  }];
59
84
  const apiRoutes = exports.apiRoutes = [{
60
85
  id: "module-status-api",
61
86
  path: "/api/system/modules/:id/status",
62
87
  auth: true,
63
- roles: ["admin"],
88
+ roles: ["admin", "user"],
64
89
  permissions: ["system:modules"],
65
90
  handler: async (_req, {
66
91
  params
package/dist/routes.mjs CHANGED
@@ -1,9 +1,12 @@
1
1
  import { getModuleStatus } from "@arch-cadre/modules/server";
2
2
  import dynamic from "next/dynamic";
3
3
  import { NextResponse } from "next/server";
4
+ import ActivityLogPage from "./ui/activity-log/pages/log-list.mjs";
4
5
  import ProfileSettingsPage from "./ui/components/profile/page.mjs";
5
6
  import ModuleDocsPage from "./ui/modules/docs/page.mjs";
6
7
  import ModuleAdminPage from "./ui/modules/page.mjs";
8
+ import RbacAdminPage from "./ui/rbac/pages/rbac-admin.mjs";
9
+ import SessionsSettingsPage from "./ui/session-manager/pages/sessions-page.mjs";
7
10
  const KryoLayout = dynamic(() => import("./ui/layout.mjs"));
8
11
  const DashboardPage = dynamic(() => import("./ui/dashboard/page.mjs"));
9
12
  const KryoPanelSettingsPage = dynamic(() => import("./ui/settings-page.mjs"));
@@ -16,7 +19,7 @@ export const privateRoutes = [
16
19
  component: DashboardPage,
17
20
  layout: KryoLayout,
18
21
  auth: true,
19
- roles: ["admin"]
22
+ roles: ["admin", "user"]
20
23
  },
21
24
  {
22
25
  path: "/profile",
@@ -24,19 +27,44 @@ export const privateRoutes = [
24
27
  auth: true,
25
28
  roles: ["admin", "user"]
26
29
  },
30
+ {
31
+ id: "user-sessions",
32
+ path: "/sessions",
33
+ component: SessionsSettingsPage,
34
+ layout: KryoLayout,
35
+ auth: true,
36
+ roles: ["admin", "user"]
37
+ },
38
+ {
39
+ id: "activity-logs",
40
+ path: "/activity-logs",
41
+ component: ActivityLogPage,
42
+ layout: KryoLayout,
43
+ auth: true,
44
+ permissions: ["system:activity-logs"]
45
+ },
46
+ {
47
+ id: "rbac-admin",
48
+ path: "/rbac",
49
+ component: RbacAdminPage,
50
+ layout: KryoLayout,
51
+ auth: true,
52
+ roles: ["admin", "user"],
53
+ permissions: ["system:rbac"]
54
+ },
27
55
  {
28
56
  path: "/settings",
29
57
  component: GlobalSettingsPage,
30
58
  layout: KryoLayout,
31
59
  auth: true,
32
- roles: ["admin"]
60
+ roles: ["admin", "user"]
33
61
  },
34
62
  {
35
63
  path: "/settings/panel/config",
36
64
  component: KryoPanelSettingsPage,
37
65
  layout: KryoLayout,
38
66
  auth: true,
39
- roles: ["admin"]
67
+ roles: ["admin", "user"]
40
68
  },
41
69
  {
42
70
  id: "module-admin",
@@ -44,7 +72,7 @@ export const privateRoutes = [
44
72
  component: ModuleAdminPage,
45
73
  layout: KryoLayout,
46
74
  auth: true,
47
- roles: ["admin"],
75
+ roles: ["admin", "user"],
48
76
  permissions: ["system:modules"]
49
77
  },
50
78
  {
@@ -53,7 +81,7 @@ export const privateRoutes = [
53
81
  component: ModuleDocsPage,
54
82
  layout: KryoLayout,
55
83
  auth: true,
56
- roles: ["admin"]
84
+ roles: ["admin", "user"]
57
85
  }
58
86
  ];
59
87
  export const apiRoutes = [
@@ -61,7 +89,7 @@ export const apiRoutes = [
61
89
  id: "module-status-api",
62
90
  path: "/api/system/modules/:id/status",
63
91
  auth: true,
64
- roles: ["admin"],
92
+ roles: ["admin", "user"],
65
93
  permissions: ["system:modules"],
66
94
  handler: async (_req, { params }) => {
67
95
  const status = await getModuleStatus(params.id);
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.activityLogsTable = void 0;
7
+ var _server = require("@arch-cadre/core/server");
8
+ var _pgCore = require("drizzle-orm/pg-core");
9
+ const activityLogsTable = exports.activityLogsTable = (0, _pgCore.pgTable)("activity_logs", {
10
+ id: (0, _pgCore.text)("id").$defaultFn(() => crypto.randomUUID()).notNull().primaryKey(),
11
+ userId: (0, _pgCore.text)("user_id").references(() => _server.userTable.id, {
12
+ onDelete: "set null"
13
+ }),
14
+ action: (0, _pgCore.text)("action").notNull(),
15
+ // np. "blog.post.created"
16
+ description: (0, _pgCore.text)("description").notNull(),
17
+ // np. "Użytkownik dodał komentarz"
18
+ metadata: (0, _pgCore.jsonb)("metadata"),
19
+ // dodatkowe dane (np. ID posta)
20
+ createdAt: (0, _pgCore.timestamp)("created_at", {
21
+ precision: 3
22
+ }).notNull().defaultNow()
23
+ });
@@ -0,0 +1,103 @@
1
+ export declare const activityLogsTable: import("drizzle-orm/pg-core").PgTableWithColumns<{
2
+ name: "activity_logs";
3
+ schema: undefined;
4
+ columns: {
5
+ id: import("drizzle-orm/pg-core").PgColumn<{
6
+ name: string;
7
+ tableName: "activity_logs";
8
+ dataType: "string";
9
+ data: string;
10
+ driverParam: string;
11
+ notNull: true;
12
+ hasDefault: true;
13
+ isPrimaryKey: true;
14
+ isAutoincrement: false;
15
+ hasRuntimeDefault: true;
16
+ enumValues: [string, ...string[]];
17
+ baseColumn: never;
18
+ identity: undefined;
19
+ generated: undefined;
20
+ }, {}>;
21
+ userId: import("drizzle-orm/pg-core").PgColumn<{
22
+ name: string;
23
+ tableName: "activity_logs";
24
+ dataType: "string";
25
+ data: string;
26
+ driverParam: string;
27
+ notNull: false;
28
+ hasDefault: false;
29
+ isPrimaryKey: false;
30
+ isAutoincrement: false;
31
+ hasRuntimeDefault: false;
32
+ enumValues: [string, ...string[]];
33
+ baseColumn: never;
34
+ identity: undefined;
35
+ generated: undefined;
36
+ }, {}>;
37
+ action: import("drizzle-orm/pg-core").PgColumn<{
38
+ name: string;
39
+ tableName: "activity_logs";
40
+ dataType: "string";
41
+ data: string;
42
+ driverParam: string;
43
+ notNull: true;
44
+ hasDefault: false;
45
+ isPrimaryKey: false;
46
+ isAutoincrement: false;
47
+ hasRuntimeDefault: false;
48
+ enumValues: [string, ...string[]];
49
+ baseColumn: never;
50
+ identity: undefined;
51
+ generated: undefined;
52
+ }, {}>;
53
+ description: import("drizzle-orm/pg-core").PgColumn<{
54
+ name: string;
55
+ tableName: "activity_logs";
56
+ dataType: "string";
57
+ data: string;
58
+ driverParam: string;
59
+ notNull: true;
60
+ hasDefault: false;
61
+ isPrimaryKey: false;
62
+ isAutoincrement: false;
63
+ hasRuntimeDefault: false;
64
+ enumValues: [string, ...string[]];
65
+ baseColumn: never;
66
+ identity: undefined;
67
+ generated: undefined;
68
+ }, {}>;
69
+ metadata: import("drizzle-orm/pg-core").PgColumn<{
70
+ name: string;
71
+ tableName: "activity_logs";
72
+ dataType: "object json";
73
+ data: unknown;
74
+ driverParam: unknown;
75
+ notNull: false;
76
+ hasDefault: false;
77
+ isPrimaryKey: false;
78
+ isAutoincrement: false;
79
+ hasRuntimeDefault: false;
80
+ enumValues: undefined;
81
+ baseColumn: never;
82
+ identity: undefined;
83
+ generated: undefined;
84
+ }, {}>;
85
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
86
+ name: string;
87
+ tableName: "activity_logs";
88
+ dataType: "object date";
89
+ data: Date;
90
+ driverParam: string;
91
+ notNull: true;
92
+ hasDefault: true;
93
+ isPrimaryKey: false;
94
+ isAutoincrement: false;
95
+ hasRuntimeDefault: false;
96
+ enumValues: undefined;
97
+ baseColumn: never;
98
+ identity: undefined;
99
+ generated: undefined;
100
+ }, {}>;
101
+ };
102
+ dialect: "pg";
103
+ }>;
@@ -0,0 +1,15 @@
1
+ import { userTable } from "@arch-cadre/core/server";
2
+ import { jsonb, pgTable, text, timestamp } from "drizzle-orm/pg-core";
3
+ export const activityLogsTable = pgTable("activity_logs", {
4
+ id: text("id").$defaultFn(() => crypto.randomUUID()).notNull().primaryKey(),
5
+ userId: text("user_id").references(() => userTable.id, {
6
+ onDelete: "set null"
7
+ }),
8
+ action: text("action").notNull(),
9
+ // np. "blog.post.created"
10
+ description: text("description").notNull(),
11
+ // np. "Użytkownik dodał komentarz"
12
+ metadata: jsonb("metadata"),
13
+ // dodatkowe dane (np. ID posta)
14
+ createdAt: timestamp("created_at", { precision: 3 }).notNull().defaultNow()
15
+ });
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ var _activityLog = require("./schema/activity-log.cjs");
7
+ Object.keys(_activityLog).forEach(function (key) {
8
+ if (key === "default" || key === "__esModule") return;
9
+ if (key in exports && exports[key] === _activityLog[key]) return;
10
+ Object.defineProperty(exports, key, {
11
+ enumerable: true,
12
+ get: function () {
13
+ return _activityLog[key];
14
+ }
15
+ });
16
+ });
@@ -0,0 +1 @@
1
+ export * from "./schema/activity-log";
@@ -0,0 +1 @@
1
+ export * from "./schema/activity-log.mjs";
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ module.exports = ActivityStatsWidget;
7
+ var _server = require("@arch-cadre/core/server");
8
+ var _server2 = require("@arch-cadre/intl/server");
9
+ var _ui = require("@arch-cadre/ui");
10
+ var _drizzleOrm = require("drizzle-orm");
11
+ var _lucideReact = require("lucide-react");
12
+ var React = _interopRequireWildcard(require("react"));
13
+ var _activityLog = require("../../../schema/activity-log.cjs");
14
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
15
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
16
+ async function ActivityStatsWidget() {
17
+ const {
18
+ t
19
+ } = await (0, _server2.getTranslation)();
20
+ const [result] = await _server.db.select({
21
+ count: (0, _drizzleOrm.sql)`count(*)`
22
+ }).from(_activityLog.activityLogsTable).where((0, _drizzleOrm.sql)`DATE(${_activityLog.activityLogsTable.createdAt}) = CURRENT_DATE`);
23
+ const count = result?.count || 0;
24
+ return /* @__PURE__ */React.createElement(_ui.Card, null, /* @__PURE__ */React.createElement(_ui.CardHeader, {
25
+ className: "flex flex-row items-center justify-between space-y-0 pb-2"
26
+ }, /* @__PURE__ */React.createElement(_ui.CardTitle, {
27
+ className: "text-sm font-medium"
28
+ }, t("Events Today")), /* @__PURE__ */React.createElement(_lucideReact.Activity, {
29
+ className: "h-4 w-4 text-muted-foreground"
30
+ })), /* @__PURE__ */React.createElement(_ui.CardContent, null, /* @__PURE__ */React.createElement("div", {
31
+ className: "text-2xl font-bold"
32
+ }, count), /* @__PURE__ */React.createElement("p", {
33
+ className: "text-xs text-muted-foreground"
34
+ }, t("System activities recorded today"))));
35
+ }
@@ -0,0 +1,2 @@
1
+ import * as React from "react";
2
+ export default function ActivityStatsWidget(): Promise<React.JSX.Element>;
@@ -0,0 +1,15 @@
1
+ import { db } from "@arch-cadre/core/server";
2
+ import { getTranslation } from "@arch-cadre/intl/server";
3
+ import { Card, CardContent, CardHeader, CardTitle } from "@arch-cadre/ui";
4
+ import { sql } from "drizzle-orm";
5
+ import { Activity } from "lucide-react";
6
+ import * as React from "react";
7
+ import { activityLogsTable } from "../../../schema/activity-log.mjs";
8
+ export default async function ActivityStatsWidget() {
9
+ const { t } = await getTranslation();
10
+ const [result] = await db.select({
11
+ count: sql`count(*)`
12
+ }).from(activityLogsTable).where(sql`DATE(${activityLogsTable.createdAt}) = CURRENT_DATE`);
13
+ const count = result?.count || 0;
14
+ return /* @__PURE__ */ React.createElement(Card, null, /* @__PURE__ */ React.createElement(CardHeader, { className: "flex flex-row items-center justify-between space-y-0 pb-2" }, /* @__PURE__ */ React.createElement(CardTitle, { className: "text-sm font-medium" }, t("Events Today")), /* @__PURE__ */ React.createElement(Activity, { className: "h-4 w-4 text-muted-foreground" })), /* @__PURE__ */ React.createElement(CardContent, null, /* @__PURE__ */ React.createElement("div", { className: "text-2xl font-bold" }, count), /* @__PURE__ */ React.createElement("p", { className: "text-xs text-muted-foreground" }, t("System activities recorded today"))));
15
+ }
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ module.exports = RecentLogsWidget;
7
+ var _server = require("@arch-cadre/core/server");
8
+ var _server2 = require("@arch-cadre/intl/server");
9
+ var _ui = require("@arch-cadre/ui");
10
+ var _drizzleOrm = require("drizzle-orm");
11
+ var React = _interopRequireWildcard(require("react"));
12
+ var _activityLog = require("../../../schema/activity-log.cjs");
13
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
14
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
15
+ async function RecentLogsWidget() {
16
+ const {
17
+ t
18
+ } = await (0, _server2.getTranslation)();
19
+ const logs = await _server.db.select({
20
+ id: _activityLog.activityLogsTable.id,
21
+ action: _activityLog.activityLogsTable.action,
22
+ description: _activityLog.activityLogsTable.description,
23
+ createdAt: _activityLog.activityLogsTable.createdAt,
24
+ user: {
25
+ name: _server.userTable.name,
26
+ image: _server.userTable.image
27
+ }
28
+ }).from(_activityLog.activityLogsTable).leftJoin(_server.userTable, (0, _drizzleOrm.eq)(_activityLog.activityLogsTable.userId, _server.userTable.id)).orderBy((0, _drizzleOrm.desc)(_activityLog.activityLogsTable.createdAt)).limit(5);
29
+ return /* @__PURE__ */React.createElement(_ui.Card, null, /* @__PURE__ */React.createElement(_ui.CardHeader, null, /* @__PURE__ */React.createElement(_ui.CardTitle, null, t("Recent Activity")), /* @__PURE__ */React.createElement(_ui.CardDescription, null, t("The latest events from your system."))), /* @__PURE__ */React.createElement(_ui.CardContent, {
30
+ className: "grid gap-8"
31
+ }, logs.map(log => /* @__PURE__ */React.createElement("div", {
32
+ key: log.id,
33
+ className: "flex items-center gap-4"
34
+ }, /* @__PURE__ */React.createElement(_ui.Avatar, {
35
+ className: "h-9 w-9"
36
+ }, /* @__PURE__ */React.createElement(_ui.AvatarImage, {
37
+ src: log.user?.image || "",
38
+ alt: "Avatar"
39
+ }), /* @__PURE__ */React.createElement(_ui.AvatarFallback, null, log.user?.name?.substring(0, 2).toUpperCase() || "SY")), /* @__PURE__ */React.createElement("div", {
40
+ className: "grid gap-1"
41
+ }, /* @__PURE__ */React.createElement("p", {
42
+ className: "text-sm font-medium leading-none"
43
+ }, log.description), /* @__PURE__ */React.createElement("p", {
44
+ className: "text-sm text-muted-foreground"
45
+ }, new Date(log.createdAt).toLocaleString())), /* @__PURE__ */React.createElement("div", {
46
+ className: "ml-auto font-medium text-xs text-muted-foreground"
47
+ }, log.action))), logs.length === 0 && /* @__PURE__ */React.createElement("div", {
48
+ className: "text-center py-4 text-muted-foreground"
49
+ }, t("No recent activity found."))));
50
+ }
@@ -0,0 +1,2 @@
1
+ import * as React from "react";
2
+ export default function RecentLogsWidget(): Promise<React.JSX.Element>;
@@ -0,0 +1,29 @@
1
+ import { db, userTable } from "@arch-cadre/core/server";
2
+ import { getTranslation } from "@arch-cadre/intl/server";
3
+ import {
4
+ Avatar,
5
+ AvatarFallback,
6
+ AvatarImage,
7
+ Card,
8
+ CardContent,
9
+ CardDescription,
10
+ CardHeader,
11
+ CardTitle
12
+ } from "@arch-cadre/ui";
13
+ import { desc, eq } from "drizzle-orm";
14
+ import * as React from "react";
15
+ import { activityLogsTable } from "../../../schema/activity-log.mjs";
16
+ export default async function RecentLogsWidget() {
17
+ const { t } = await getTranslation();
18
+ const logs = await db.select({
19
+ id: activityLogsTable.id,
20
+ action: activityLogsTable.action,
21
+ description: activityLogsTable.description,
22
+ createdAt: activityLogsTable.createdAt,
23
+ user: {
24
+ name: userTable.name,
25
+ image: userTable.image
26
+ }
27
+ }).from(activityLogsTable).leftJoin(userTable, eq(activityLogsTable.userId, userTable.id)).orderBy(desc(activityLogsTable.createdAt)).limit(5);
28
+ return /* @__PURE__ */ React.createElement(Card, null, /* @__PURE__ */ React.createElement(CardHeader, null, /* @__PURE__ */ React.createElement(CardTitle, null, t("Recent Activity")), /* @__PURE__ */ React.createElement(CardDescription, null, t("The latest events from your system."))), /* @__PURE__ */ React.createElement(CardContent, { className: "grid gap-8" }, logs.map((log) => /* @__PURE__ */ React.createElement("div", { key: log.id, className: "flex items-center gap-4" }, /* @__PURE__ */ React.createElement(Avatar, { className: "h-9 w-9" }, /* @__PURE__ */ React.createElement(AvatarImage, { src: log.user?.image || "", alt: "Avatar" }), /* @__PURE__ */ React.createElement(AvatarFallback, null, log.user?.name?.substring(0, 2).toUpperCase() || "SY")), /* @__PURE__ */ React.createElement("div", { className: "grid gap-1" }, /* @__PURE__ */ React.createElement("p", { className: "text-sm font-medium leading-none" }, log.description), /* @__PURE__ */ React.createElement("p", { className: "text-sm text-muted-foreground" }, new Date(log.createdAt).toLocaleString())), /* @__PURE__ */ React.createElement("div", { className: "ml-auto font-medium text-xs text-muted-foreground" }, log.action))), logs.length === 0 && /* @__PURE__ */ React.createElement("div", { className: "text-center py-4 text-muted-foreground" }, t("No recent activity found."))));
29
+ }
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ module.exports = ActivityLogPage;
7
+ var _server = require("@arch-cadre/intl/server");
8
+ var _ui = require("@arch-cadre/ui");
9
+ var _table = require("@arch-cadre/ui/components/table");
10
+ var React = _interopRequireWildcard(require("react"));
11
+ var _activityLog = require("../../../actions/activity-log/index.cjs");
12
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
13
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
14
+ async function ActivityLogPage() {
15
+ const logs = await (0, _activityLog.getActivityLogs)();
16
+ const {
17
+ t
18
+ } = await (0, _server.getTranslation)();
19
+ return /* @__PURE__ */React.createElement("div", {
20
+ className: "space-y-6"
21
+ }, /* @__PURE__ */React.createElement("div", {
22
+ className: "space-y-1"
23
+ }, /* @__PURE__ */React.createElement("h2", {
24
+ className: "text-3xl font-bold tracking-tight"
25
+ }, t("Activity")), /* @__PURE__ */React.createElement("p", {
26
+ className: "text-muted-foreground text-sm"
27
+ }, t("Real-time audit log of all system events."))), /* @__PURE__ */React.createElement("div", {
28
+ className: "border rounded-xl bg-card overflow-hidden"
29
+ }, /* @__PURE__ */React.createElement(_table.Table, null, /* @__PURE__ */React.createElement(_table.TableHeader, {
30
+ className: "bg-muted/50"
31
+ }, /* @__PURE__ */React.createElement(_table.TableRow, null, /* @__PURE__ */React.createElement(_table.TableHead, null, t("Event")), /* @__PURE__ */React.createElement(_table.TableHead, null, t("User")), /* @__PURE__ */React.createElement(_table.TableHead, null, t("Details")), /* @__PURE__ */React.createElement(_table.TableHead, {
32
+ className: "text-right"
33
+ }, t("Time")))), /* @__PURE__ */React.createElement(_table.TableBody, null, logs.map(({
34
+ log,
35
+ user
36
+ }) => /* @__PURE__ */React.createElement(_table.TableRow, {
37
+ key: log.id
38
+ }, /* @__PURE__ */React.createElement(_table.TableCell, null, /* @__PURE__ */React.createElement("div", {
39
+ className: "flex items-center gap-2"
40
+ }, /* @__PURE__ */React.createElement("div", {
41
+ className: `p-1.5 rounded-md ${log.action.includes("created") ? "bg-green-500/10 text-green-600" : "bg-blue-500/10 text-blue-600"}`
42
+ }, /* @__PURE__ */React.createElement(_ui.Icon, {
43
+ icon: log.action.includes("comment") ? "solar:chat-line-broken" : "solar:file-text-broken",
44
+ className: "size-4"
45
+ })), /* @__PURE__ */React.createElement("span", {
46
+ className: "font-mono text-xs font-bold"
47
+ }, log.action))), /* @__PURE__ */React.createElement(_table.TableCell, null, /* @__PURE__ */React.createElement("div", {
48
+ className: "flex flex-col"
49
+ }, /* @__PURE__ */React.createElement("span", {
50
+ className: "text-sm font-medium"
51
+ }, user?.name || t("System")), /* @__PURE__ */React.createElement("span", {
52
+ className: "text-[10px] text-muted-foreground"
53
+ }, user?.email || t("automated-task")))), /* @__PURE__ */React.createElement(_table.TableCell, {
54
+ className: "text-sm"
55
+ }, log.description), /* @__PURE__ */React.createElement(_table.TableCell, {
56
+ className: "text-right text-xs text-muted-foreground"
57
+ }, new Date(log.createdAt).toLocaleString()))), logs.length === 0 && /* @__PURE__ */React.createElement(_table.TableRow, null, /* @__PURE__ */React.createElement(_table.TableCell, {
58
+ colSpan: 4,
59
+ className: "text-center py-20 text-muted-foreground italic"
60
+ }, t("No activity recorded yet.")))))));
61
+ }
@@ -0,0 +1,2 @@
1
+ import * as React from "react";
2
+ export default function ActivityLogPage(): Promise<React.JSX.Element>;
@@ -0,0 +1,36 @@
1
+ import { getTranslation } from "@arch-cadre/intl/server";
2
+ import { Icon } from "@arch-cadre/ui";
3
+ import {
4
+ Table,
5
+ TableBody,
6
+ TableCell,
7
+ TableHead,
8
+ TableHeader,
9
+ TableRow
10
+ } from "@arch-cadre/ui/components/table";
11
+ import * as React from "react";
12
+ import { getActivityLogs } from "../../../actions/activity-log/index.mjs";
13
+ export default async function ActivityLogPage() {
14
+ const logs = await getActivityLogs();
15
+ const { t } = await getTranslation();
16
+ return /* @__PURE__ */ React.createElement("div", { className: "space-y-6" }, /* @__PURE__ */ React.createElement("div", { className: "space-y-1" }, /* @__PURE__ */ React.createElement("h2", { className: "text-3xl font-bold tracking-tight" }, t("Activity")), /* @__PURE__ */ React.createElement("p", { className: "text-muted-foreground text-sm" }, t("Real-time audit log of all system events."))), /* @__PURE__ */ React.createElement("div", { className: "border rounded-xl bg-card overflow-hidden" }, /* @__PURE__ */ React.createElement(Table, null, /* @__PURE__ */ React.createElement(TableHeader, { className: "bg-muted/50" }, /* @__PURE__ */ React.createElement(TableRow, null, /* @__PURE__ */ React.createElement(TableHead, null, t("Event")), /* @__PURE__ */ React.createElement(TableHead, null, t("User")), /* @__PURE__ */ React.createElement(TableHead, null, t("Details")), /* @__PURE__ */ React.createElement(TableHead, { className: "text-right" }, t("Time")))), /* @__PURE__ */ React.createElement(TableBody, null, logs.map(({ log, user }) => /* @__PURE__ */ React.createElement(TableRow, { key: log.id }, /* @__PURE__ */ React.createElement(TableCell, null, /* @__PURE__ */ React.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React.createElement(
17
+ "div",
18
+ {
19
+ className: `p-1.5 rounded-md ${log.action.includes("created") ? "bg-green-500/10 text-green-600" : "bg-blue-500/10 text-blue-600"}`
20
+ },
21
+ /* @__PURE__ */ React.createElement(
22
+ Icon,
23
+ {
24
+ icon: log.action.includes("comment") ? "solar:chat-line-broken" : "solar:file-text-broken",
25
+ className: "size-4"
26
+ }
27
+ )
28
+ ), /* @__PURE__ */ React.createElement("span", { className: "font-mono text-xs font-bold" }, log.action))), /* @__PURE__ */ React.createElement(TableCell, null, /* @__PURE__ */ React.createElement("div", { className: "flex flex-col" }, /* @__PURE__ */ React.createElement("span", { className: "text-sm font-medium" }, user?.name || t("System")), /* @__PURE__ */ React.createElement("span", { className: "text-[10px] text-muted-foreground" }, user?.email || t("automated-task")))), /* @__PURE__ */ React.createElement(TableCell, { className: "text-sm" }, log.description), /* @__PURE__ */ React.createElement(TableCell, { className: "text-right text-xs text-muted-foreground" }, new Date(log.createdAt).toLocaleString()))), logs.length === 0 && /* @__PURE__ */ React.createElement(TableRow, null, /* @__PURE__ */ React.createElement(
29
+ TableCell,
30
+ {
31
+ colSpan: 4,
32
+ className: "text-center py-20 text-muted-foreground italic"
33
+ },
34
+ t("No activity recorded yet.")
35
+ ))))));
36
+ }