From 7b829087d91e009b81109b2c36ea58b9597a7664 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Thu, 12 Mar 2026 21:22:44 +0000 Subject: [PATCH] Autosave: 20260312-212244 --- .perm_test_apache | 0 .perm_test_exec | 0 backend/src/db/migrations/1773330455690.js | 32 ++++++++++++++++++++++ fix.sql | 1 + frontend/src/menuAside.ts | 15 ++++++++-- frontend/src/pages/log-work.tsx | 32 ++++++++++++++++++++++ frontend/src/pages/my-logs.tsx | 32 ++++++++++++++++++++++ 7 files changed, 109 insertions(+), 3 deletions(-) create mode 100644 .perm_test_apache create mode 100644 .perm_test_exec create mode 100644 backend/src/db/migrations/1773330455690.js create mode 100644 fix.sql create mode 100644 frontend/src/pages/log-work.tsx create mode 100644 frontend/src/pages/my-logs.tsx diff --git a/.perm_test_apache b/.perm_test_apache new file mode 100644 index 0000000..e69de29 diff --git a/.perm_test_exec b/.perm_test_exec new file mode 100644 index 0000000..e69de29 diff --git a/backend/src/db/migrations/1773330455690.js b/backend/src/db/migrations/1773330455690.js new file mode 100644 index 0000000..1935fd8 --- /dev/null +++ b/backend/src/db/migrations/1773330455690.js @@ -0,0 +1,32 @@ +module.exports = { + async up(queryInterface, Sequelize) { + await queryInterface.createTable("usersCustom_permissionsPermissions", { + id: { + type: Sequelize.DataTypes.UUID, + defaultValue: Sequelize.DataTypes.UUIDV4, + primaryKey: true, + }, + users_custom_permissionsId: { + type: Sequelize.DataTypes.UUID, + references: { + model: "users", + key: "id", + }, + onDelete: "CASCADE", + }, + permissionId: { + type: Sequelize.DataTypes.UUID, + references: { + model: "permissions", + key: "id", + }, + onDelete: "CASCADE", + }, + createdAt: { type: Sequelize.DataTypes.DATE }, + updatedAt: { type: Sequelize.DataTypes.DATE }, + }); + }, + async down(queryInterface, Sequelize) { + await queryInterface.dropTable("usersCustom_permissionsPermissions"); + } +}; \ No newline at end of file diff --git a/fix.sql b/fix.sql new file mode 100644 index 0000000..23b96f4 --- /dev/null +++ b/fix.sql @@ -0,0 +1 @@ +ALTER TABLE "usersCustom_permissionsPermissions" ADD COLUMN "permissionId" UUID REFERENCES "permissions"(id); diff --git a/frontend/src/menuAside.ts b/frontend/src/menuAside.ts index c2be1fd..d1c52aa 100644 --- a/frontend/src/menuAside.ts +++ b/frontend/src/menuAside.ts @@ -8,6 +8,17 @@ const menuAside: MenuAsideItem[] = [ label: 'Dashboard', }, + { + href: '/log-work', + label: 'Log Work', + icon: icon.mdiPencil, + }, + { + href: '/my-logs', + label: 'My Logs', + icon: icon.mdiViewList, + }, + { href: '/users/users-list', label: 'Users', @@ -74,9 +85,7 @@ const menuAside: MenuAsideItem[] = [ }, { href: '/job_logs/job_logs-list', - label: 'Job logs', - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore + label: 'All Job Logs', icon: 'mdiClipboardTextClock' in icon ? icon['mdiClipboardTextClock' as keyof typeof icon] : icon.mdiTable ?? icon.mdiTable, permissions: 'READ_JOB_LOGS' }, diff --git a/frontend/src/pages/log-work.tsx b/frontend/src/pages/log-work.tsx new file mode 100644 index 0000000..24ca416 --- /dev/null +++ b/frontend/src/pages/log-work.tsx @@ -0,0 +1,32 @@ +import { mdiPencil, mdiChartTimelineVariant } from '@mdi/js'; +import Head from 'next/head'; +import React, { ReactElement } from 'react'; +import CardBox from '../components/CardBox'; +import LayoutAuthenticated from '../layouts/Authenticated'; +import SectionMain from '../components/SectionMain'; +import SectionTitleLineWithButton from '../components/SectionTitleLineWithButton'; +import { getPageTitle } from '../config'; + +const LogWorkPage = () => { + return ( + <> + + {getPageTitle('Log Work')} + + + + {''} + + +

Work log form goes here.

+
+
+ + ); +}; + +LogWorkPage.getLayout = function getLayout(page: ReactElement) { + return {page}; +}; + +export default LogWorkPage; diff --git a/frontend/src/pages/my-logs.tsx b/frontend/src/pages/my-logs.tsx new file mode 100644 index 0000000..53578ba --- /dev/null +++ b/frontend/src/pages/my-logs.tsx @@ -0,0 +1,32 @@ +import { mdiViewList, mdiChartTimelineVariant } from '@mdi/js'; +import Head from 'next/head'; +import React, { ReactElement } from 'react'; +import CardBox from '../components/CardBox'; +import LayoutAuthenticated from '../layouts/Authenticated'; +import SectionMain from '../components/SectionMain'; +import SectionTitleLineWithButton from '../components/SectionTitleLineWithButton'; +import { getPageTitle } from '../config'; + +const MyLogsPage = () => { + return ( + <> + + {getPageTitle('My Logs')} + + + + {''} + + +

List of my job logs.

+
+
+ + ); +}; + +MyLogsPage.getLayout = function getLayout(page: ReactElement) { + return {page}; +}; + +export default MyLogsPage;