diff --git a/backend/imk-backend/src/admin/admin.service.ts b/backend/imk-backend/src/admin/admin.service.ts index 3a1e5d1..38d5ceb 100644 --- a/backend/imk-backend/src/admin/admin.service.ts +++ b/backend/imk-backend/src/admin/admin.service.ts @@ -126,12 +126,36 @@ export class AdminService { }); } - async createUser(createUserDto: CreateUserDto) { - const hashedPassword = await bcrypt.hash(createUserDto.password, 10); + // async createUser(createUserDto: CreateUserDto) { + // const hashedPassword = await bcrypt.hash(createUserDto.password, 10); + // return this.prisma.user.create({ + // data: { + // ...createUserDto, + // password: hashedPassword, + // }, + // }); + // } + + async createUser(userData: { + name: string; + email: string; + password: string; + isAdmin: boolean; + }) { + const hashedPassword = await bcrypt.hash(userData.password, 10); + return this.prisma.user.create({ data: { - ...createUserDto, + name: userData.name, + email: userData.email, password: hashedPassword, + isAdmin: userData.isAdmin, + }, + select: { + id: true, + name: true, + email: true, + isAdmin: true, }, }); } diff --git a/backend/imk-backend/src/dto/create-user.dto.ts b/backend/imk-backend/src/dto/create-user.dto.ts index 4652d2c..8cf8a74 100644 --- a/backend/imk-backend/src/dto/create-user.dto.ts +++ b/backend/imk-backend/src/dto/create-user.dto.ts @@ -1,4 +1,4 @@ -import { IsString, IsEmail, MinLength } from 'class-validator'; +import { IsString, IsEmail, MinLength, IsBoolean } from 'class-validator'; export class CreateUserDto { @IsString() @@ -10,4 +10,7 @@ export class CreateUserDto { @IsString() @MinLength(6) password: string; + + @IsBoolean() + isAdmin: boolean = false; } diff --git a/frontend/colorScheme b/frontend/colorScheme new file mode 100644 index 0000000..a421bc2 --- /dev/null +++ b/frontend/colorScheme @@ -0,0 +1,98 @@ +##color scheme across all components based on the Home page design. + +-- + We can create a colors file to maintain consistency + color.js +export const colors = { + primary: { + light: '#3B82F6', // blue-500 + DEFAULT: '#2563EB', // blue-600 + dark: '#1D4ED8', // blue-700 + darker: '#1E40AF' // blue-800 + }, + background: { + light: '#F9FAFB', // gray-50 + DEFAULT: '#F3F4F6', // gray-100 + dark: '#E5E7EB' // gray-200 + }, + text: { + primary: '#1F2937', // gray-800 + secondary: '#4B5563', // gray-600 + light: '#9CA3AF' // gray-400 + }, + white: '#FFFFFF', + black: '#000000' +} +-- + +-- +common component style +common.js +export const commonStyles = { + // Container + container: "container mx-auto px-4", + + // Section Headers + sectionHeader: "text-center mb-16", + sectionTitle: "text-3xl md:text-4xl font-bold text-gray-800 mb-4", + sectionDivider: "w-24 h-1 bg-blue-600 mx-auto", + + // Cards + card: "bg-white rounded-xl shadow-lg hover:shadow-xl transition-all duration-300", + + // Buttons + primaryButton: "bg-blue-600 hover:bg-blue-700 text-white px-8 py-3 rounded-full font-semibold transition-colors duration-300", + secondaryButton: "bg-white/10 hover:bg-white/20 text-white px-8 py-3 rounded-full font-semibold transition-colors duration-300", + + // Gradients + primaryGradient: "bg-gradient-to-r from-blue-900/90 to-blue-600/80", + + // Text + heading1: "text-4xl md:text-6xl font-bold", + heading2: "text-3xl md:text-4xl font-bold", + heading3: "text-2xl font-semibold", + paragraph: "text-gray-600" +} +-- + +-- +reusable section header component +SectionHeader.jsx +// Reusable section header component +export function SectionHeader({ title, subtitle }) { + return ( +
+

+ {title} +

+
+ {subtitle && ( +

+ {subtitle} +

+ )} +
+ ); +} + +-- +reusable button component +// Reusable button component +export function Button({ variant = 'primary', children, ...props }) { + const baseStyles = "px-8 py-3 rounded-full font-semibold transition-colors duration-300"; + const variants = { + primary: "bg-blue-600 hover:bg-blue-700 text-white", + secondary: "bg-white/10 hover:bg-white/20 text-white", + outline: "border-2 border-blue-600 text-blue-600 hover:bg-blue-50" + }; + + return ( + + ); +} +-- diff --git a/frontend/imk/package-lock.json b/frontend/imk/package-lock.json index 8a75bc6..4487d37 100644 --- a/frontend/imk/package-lock.json +++ b/frontend/imk/package-lock.json @@ -11,6 +11,7 @@ "@headlessui/react": "^1.7.17", "@heroicons/react": "^2.0.18", "axios": "^1.7.7", + "framer-motion": "^11.11.10", "jwt-decode": "^4.0.0", "react": "^18.2.0", "react-dom": "^18.2.0", @@ -2160,6 +2161,30 @@ "url": "https://github.com/sponsors/rawify" } }, + "node_modules/framer-motion": { + "version": "11.11.10", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.11.10.tgz", + "integrity": "sha512-061Bt1jL/vIm+diYIiA4dP/Yld7vD47ROextS7ESBW5hr4wQFhxB5D5T5zAc3c/5me3cOa+iO5LqhA38WDln/A==", + "dependencies": { + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -4105,6 +4130,11 @@ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", "dev": true }, + "node_modules/tslib": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==" + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", diff --git a/frontend/imk/package.json b/frontend/imk/package.json index 30c07aa..0191693 100644 --- a/frontend/imk/package.json +++ b/frontend/imk/package.json @@ -13,6 +13,7 @@ "@headlessui/react": "^1.7.17", "@heroicons/react": "^2.0.18", "axios": "^1.7.7", + "framer-motion": "^11.11.10", "jwt-decode": "^4.0.0", "react": "^18.2.0", "react-dom": "^18.2.0", diff --git a/frontend/imk/src/components/adminPanel/AdminPanel.jsx b/frontend/imk/src/components/adminPanel/AdminPanel.jsx index e0b5b0a..6404f15 100644 --- a/frontend/imk/src/components/adminPanel/AdminPanel.jsx +++ b/frontend/imk/src/components/adminPanel/AdminPanel.jsx @@ -1,7 +1,7 @@ import { useState, useEffect } from 'react'; -import { getAllUsers, getAllDocuments, getUserInfo } from '../../services/api'; +import { getAllUsers, getAllDocuments, getUserInfo, createUser } from '../../services/api'; import DocumentUpload from '../documentUpload/DocumentUpload'; -import UserCreate from '../UserCreate'; +//import UserCreate from '../UserCreate'; import { useNavigate } from 'react-router-dom'; function AdminPanel() { @@ -12,6 +12,12 @@ function AdminPanel() { const [loading, setLoading] = useState(true); const [error, setError] = useState(''); const [isAdmin, setIsAdmin] = useState(false); + const [newUser, setNewUser] = useState({ + name: '', + email: '', + password: '', + isAdmin: false + }); useEffect(() => { checkAdminStatus(); @@ -36,6 +42,7 @@ function AdminPanel() { if (isAdmin) { fetchData(); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [activeTab, isAdmin]); const fetchData = async () => { @@ -70,6 +77,23 @@ function AdminPanel() { return null; } + const handleCreateUser = async (e) => { + e.preventDefault(); + try { + await createUser(newUser); + setNewUser({ + name: '', + email: '', + password: '', + isAdmin: false // Reset isAdmin too + }); + fetchData(); + } catch (err) { + setError('Failed to create user'); + } + }; + + return (
@@ -165,37 +189,78 @@ function AdminPanel() { )} {activeTab === 'users' && ( -
-
-
- - - - - - - - - - {users.map((user) => ( - - - - - - ))} - -
NameEmailRole
{user.name}{user.email} - - {user.isAdmin ? 'Admin' : 'User'} - -
-
-
-
- -
-
+ <> +
+
+ setNewUser({ ...newUser, name: e.target.value })} + className="rounded border p-2" + /> + setNewUser({ ...newUser, email: e.target.value })} + className="rounded border p-2" + /> + setNewUser({ ...newUser, password: e.target.value })} + className="rounded border p-2" + /> +
+ setNewUser({ ...newUser, isAdmin: e.target.checked })} + className="mr-2" + /> + +
+ +
+
+ + + + + + + + + + + + {users.map((user) => ( + + + + + + + ))} + +
NameEmailAdmin StatusActions
{user.name}{user.email} + + {user.isAdmin ? 'Admin' : 'User'} + + + {/* Add actions if needed */} +
+ )} {activeTab === 'upload' && } diff --git a/frontend/imk/src/components/lab/lab.jsx b/frontend/imk/src/components/lab/lab.jsx index b499612..f50cef7 100644 --- a/frontend/imk/src/components/lab/lab.jsx +++ b/frontend/imk/src/components/lab/lab.jsx @@ -1,122 +1,237 @@ -import { useEffect } from "react"; -import "./lab.css"; +// import { useEffect } from 'react'; + +// export default function Lab() { +// useEffect(() => { +// window.scrollTo({ top: 0, behavior: "smooth" }) +// }, []) + +// return ( +//
+// {/* Header */} +//
+//

+// во нашата лабораторија се вршат +//

+//
+ +// {/* Main Content */} +//
+// {/* Concrete Testing Section */} +//
+//
+//

+// +// Испитувањето на бетон +// +// е важен процес кој се користи за да се оцени квалитетот и издржливоста на бетонски конструкции. +//

+//

+// Испитувањето на бетонот е неопходен процес за осигурување на квалитет и безбедност на градежните проекти и инфраструктурата воопшто. +// Тоа помага во отстранивање на недостатоците и намалување на ризиците од евентуални пропаднувања на конструкциите. +//

+//
+//
+// Испитување на бетон +//
+//
+ +// {/* Ore and Metal Testing Section */} +//
+//
+// Испитување на руди и метали +//
+//
+//

+// +// Испитувањето на руди, метали и троски +// +// е важен процес во областа на геолошкото и металуршко инженерство, со цел да се анализираат и одредат својствата и составот на суровините и производите. +//

+//

+// Овие испитувања се изведуваат за да се осигура квалитетот и спецификациите на материјалите, како и за да се обезбеди безбедно и ефикасно користење и обработка на руди, метали и троски во различни индустрии и апликации. +//

+//
+ +//
+ +// {/* Steel Testing Section */} +//
+ +//
+//

+// +// Испитувањето на челик +// +// е важен процес за одредување на квалитетот, издржливоста и други механички својства на челикот, кој се користи во разни индустрии и конструкции. +//

+//

+// Испитувањето на челик е неопходен процес за да се обезбеди квалитетот и безбедноста на производите и конструкциите кои го користат, како и за да се уверите дека челикот одговара на спецификациите и стандардите. +//

+//
+ +//
+// Испитување на челик +//
+//
+ +// {/* Laboratory Extraction Section */} +//
+//
+// Лабораториска екстракција +//
+//
+//

+// +// Лабораториската екстракција +// +// на метали или неметали од руди и троски е процес кој се користи за да се изолираат и оддели материјалите од суровините или отпадните производи, како што се рудите или троските, со цел да се добие чист метал или неметал. +//

+//
+ +//
+//
+//
+// ); +// } +import { useEffect } from 'react'; export default function Lab() { - useEffect(() => { window.scrollTo({ top: 0, behavior: "smooth" }) }, []) return ( - <> -
-
-

во нашата лабораторија се вршат

+
+
+ {/* Header */} +
+

+ во нашата лабораторија се вршат +

+
-
-
-
-

- Испитувањето на бетон е важен процес кој се - користи за да се оцени квалитетот и издржливоста на бетонски - конструкции. -

-

- Испитувањето на бетонот е неопходен процес за осигурување на - квалитет и безбедност на градежните проекти и инфраструктурата - воопшто. Тоа помага во отстранивање на недостатоците и - намалување на ризиците од евентуални пропаднувања на - конструкциите. -

+ {/* Main Content */} +
+ {/* Concrete Testing Section */} +
+
+

+ Испитувањето на бетон +

+
+

+ е важен процес кој се користи за да се оцени квалитетот и издржливоста на бетонски конструкции. +

+

+ Испитувањето на бетонот е неопходен процес за осигурување на квалитет и безбедност на градежните проекти и инфраструктурата воопшто. + Тоа помага во отстранивање на недостатоците и намалување на ризиците од евентуални пропаднувања на конструкциите. +

+
-
- -
-
-
-
- + Испитување на бетон
-
- -

- Геотехничките испитувања се однесуваат на - процесот на испитување и анализирање на геолошките и - геотехничките својства на земјиштето за да се одреди неговата - способност да ги поддржат инфраструктурните конструкции и - проекти. -

-

- Геотехничките испитувања помагаат во разбирањето на - геотехничките услови на градежното место и обезбедуваат - информации за дизајнирање и изградба на стабилни и издржливи - инфраструктурни објекти и конструкции. -

-
-
-
-

- Испитувањето на руди, метали и троски е важен - процес во областа на геолошкото и металуршко инженерство, со цел - да се анализираат и одредат својствата и составот на суровините - и производите. -

-

- Овие испитувања се изведуваат за да се осигура квалитетот и - спецификациите на материјалите, како и за да се обезбеди - безбедно и ефикасно користење и обработка на руди, метали и - троски во различни индустрии и апликации. -

+ + {/* Ore and Metal Testing Section */} +
+
+

+ Испитувањето на руди, метали и троски +

+
+

+ е важен процес во областа на геолошкото и металуршко инженерство, со цел да се анализираат и одредат својствата и составот на суровините и производите. +

+

+ Овие испитувања се изведуваат за да се осигура квалитетот и спецификациите на материјалите, како и за да се обезбеди безбедно и ефикасно користење и обработка на руди, метали и троски во различни индустрии и апликации. +

+
-
- +
+ Испитување на руди и метали
-
-
- + {/* Steel Testing Section */} +
+
+

+ Испитувањето на челик +

+
+

+ е важен процес за одредување на квалитетот, издржливоста и други механички својства на челикот, кој се користи во разни индустрии и конструкции. +

+

+ Испитувањето на челик е неопходен процес за да се обезбеди квалитетот и безбедноста на производите и конструкциите кои го користат, како и за да се уверите дека челикот одговара на спецификациите и стандардите. +

+
- -
-

- Испитувањето на челик е важен процес за - одредување на квалитетот, издржливоста и други механички - својства на челикот, кој се користи во разни индустрии и - конструкции. -

-

- Испитувањето на челик е неопходен процес за да се обезбеди - квалитетот и безбедноста на производите и конструкциите кои го - користат, како и за да се уверите дека челикот одговара на - спецификациите и стандардите. -

+
+ Испитување на челик
-
-
-

- Лабораториската екстракција на метали или - неметали од руди и троски е процес кој се користи за да се - изолираат и оддели материјалите од суровините или отпадните - производи, како што се рудите или троските, со цел да се добие - чист метал или неметал. -

+ {/* Laboratory Extraction Section */} +
+
+

+ Лабораториската екстракција +

+
+

+ на метали или неметали од руди и троски е процес кој се користи за да се изолираат и оддели материјалите од суровините или отпадните производи, како што се рудите или троските, со цел да се добие чист метал или неметал. +

+
-
- +
+ Лабораториска екстракција
-
- +
+
); -} +} \ No newline at end of file diff --git a/frontend/imk/src/components/navbar/Navbar.jsx b/frontend/imk/src/components/navbar/Navbar.jsx index ac36e82..71fb13a 100644 --- a/frontend/imk/src/components/navbar/Navbar.jsx +++ b/frontend/imk/src/components/navbar/Navbar.jsx @@ -2,7 +2,7 @@ import { useState } from "react"; import { Dialog } from "@headlessui/react"; import { Bars3Icon, XMarkIcon } from "@heroicons/react/24/outline"; import { NavLink } from "react-router-dom"; -import "./navbar.css"; + const navigation = [ { name: "Дома", href: "/" }, { name: "За нас", href: "/about" }, @@ -17,107 +17,117 @@ export default function Navbar() { const [mobileMenuOpen, setMobileMenuOpen] = useState(false); return ( - <> -
-
-
- - -
- -
- - ИМК - {/* */} - - -
-
-
-
- {navigation.map((item) => ( - setMobileMenuOpen(false)} - > - {item.name} - - ))} -
-
-
-
-
-
-
-
- +
+ + + +
); -} +} \ No newline at end of file diff --git a/frontend/imk/src/pages/aboutpage/About.jsx b/frontend/imk/src/pages/aboutpage/About.jsx index 8f2cb03..eadd8bb 100644 --- a/frontend/imk/src/pages/aboutpage/About.jsx +++ b/frontend/imk/src/pages/aboutpage/About.jsx @@ -1,124 +1,195 @@ -import './about.css' +// import './about.css' +// export default function About() { + + +// return ( +// <> +//
+ + +// {/*
*/} +//
+//

За нас

+//

Компанијата Испитување на материјали и консултантство ДООЕЛ е основана во 2021 година. Главната дејност на ИМК ДООЕЛ е лабораториски испитувања во +// областа на градежништвото и индустријата, како и консултантски услуги во областа на индустријата. Со успешното работење во своите области и +// стручниот кадар кој компанијата го поседува, во 2022 година за компанијата интерес пројавува потенцијален партнер од Швајцарија. Во 2023 +// година компанијата ИМК ДООЕЛ од домашна компанија прераснува во интернационална компанија со добивање на партнер од Швајцарија и +// прераснува во ИМК ДОО. Во истата година компанијата добива финансиска поддршка од старт ап фондот СЕКО, фонд кој го препозна квалитетот и +// визијата кој го поседуваат двајца млади претпиемачи. Лабораторијата е комплетно опремена да одговори на секој предизвик во областа на +// испитувањето на квалитетот на материјалите во градежната индсутрија со најмодерни инструменти за теренско и лабораториско испитување. +// Испитувањето на материјалите се врши според најнови EN и МКС стандарди.

+//
+ + + + + + +//
+//
+//

Станете дел од нашиот тим

+ +//
+//
+//
+//
+// +//
+// +//
+//
+//
+// +//
+// +//
+//
+//
+// +//
+// +//
+//
+ +//
+// +//
+//