@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.
- package/dist/actions/activity-log/index.cjs +19 -0
- package/dist/actions/activity-log/index.d.ts +1 -0
- package/dist/actions/activity-log/index.mjs +10 -0
- package/dist/actions/rbac/index.cjs +130 -0
- package/dist/actions/rbac/index.d.ts +35 -0
- package/dist/actions/rbac/index.mjs +92 -0
- package/dist/actions/session-manager/index.cjs +99 -0
- package/dist/actions/session-manager/index.d.ts +21 -0
- package/dist/actions/session-manager/index.mjs +73 -0
- package/dist/index.cjs +68 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.mjs +90 -0
- package/dist/navigation.cjs +15 -1
- package/dist/navigation.mjs +17 -1
- package/dist/routes.cjs +31 -6
- package/dist/routes.mjs +34 -6
- package/dist/schema/activity-log.cjs +23 -0
- package/dist/schema/activity-log.d.ts +103 -0
- package/dist/schema/activity-log.mjs +15 -0
- package/dist/schema.cjs +16 -0
- package/dist/schema.d.ts +1 -0
- package/dist/schema.mjs +1 -0
- package/dist/ui/activity-log/components/ActivityStatsWidget.cjs +35 -0
- package/dist/ui/activity-log/components/ActivityStatsWidget.d.ts +2 -0
- package/dist/ui/activity-log/components/ActivityStatsWidget.mjs +15 -0
- package/dist/ui/activity-log/components/RecentLogsWidget.cjs +50 -0
- package/dist/ui/activity-log/components/RecentLogsWidget.d.ts +2 -0
- package/dist/ui/activity-log/components/RecentLogsWidget.mjs +29 -0
- package/dist/ui/activity-log/pages/log-list.cjs +61 -0
- package/dist/ui/activity-log/pages/log-list.d.ts +2 -0
- package/dist/ui/activity-log/pages/log-list.mjs +36 -0
- package/dist/ui/components/app-user.cjs +4 -5
- package/dist/ui/components/app-user.mjs +5 -7
- package/dist/ui/components/profile/components.cjs +4 -1
- package/dist/ui/components/profile/components.d.ts +4 -3
- package/dist/ui/components/profile/components.mjs +1 -0
- package/dist/ui/components/profile/link.cjs +10 -1
- package/dist/ui/components/profile/link.d.ts +2 -1
- package/dist/ui/components/profile/link.mjs +2 -1
- package/dist/ui/components/profile/page.cjs +4 -1
- package/dist/ui/components/profile/page.d.ts +2 -1
- package/dist/ui/components/profile/page.mjs +9 -2
- package/dist/ui/dashboard/page.cjs +6 -16
- package/dist/ui/dashboard/page.d.ts +1 -1
- package/dist/ui/dashboard/page.mjs +14 -6
- package/dist/ui/dashboard/widgets/WelcomeBackUserWidget.cjs +43 -0
- package/dist/ui/dashboard/widgets/WelcomeBackUserWidget.d.ts +2 -0
- package/dist/ui/dashboard/widgets/WelcomeBackUserWidget.mjs +18 -0
- package/dist/ui/rbac/pages/rbac-admin.cjs +328 -0
- package/dist/ui/rbac/pages/rbac-admin.d.ts +2 -0
- package/dist/ui/rbac/pages/rbac-admin.mjs +375 -0
- package/dist/ui/session-manager/components/sessions-list.cjs +160 -0
- package/dist/ui/session-manager/components/sessions-list.d.ts +13 -0
- package/dist/ui/session-manager/components/sessions-list.mjs +193 -0
- package/dist/ui/session-manager/pages/sessions-page.cjs +29 -0
- package/dist/ui/session-manager/pages/sessions-page.d.ts +2 -0
- package/dist/ui/session-manager/pages/sessions-page.mjs +9 -0
- package/locales/en/global.json +109 -1
- package/locales/pl/global.json +188 -0
- package/package.json +7 -6
- package/dist/ui/[...catchAll]/page.cjs +0 -127
- package/dist/ui/[...catchAll]/page.d.ts +0 -13
- package/dist/ui/[...catchAll]/page.mjs +0 -88
package/dist/navigation.cjs
CHANGED
|
@@ -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: {
|
package/dist/navigation.mjs
CHANGED
|
@@ -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
|
+
});
|
package/dist/schema.cjs
ADDED
|
@@ -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
|
+
});
|
package/dist/schema.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./schema/activity-log";
|
package/dist/schema.mjs
ADDED
|
@@ -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,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,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,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
|
+
}
|