Skip to content
This repository was archived by the owner on Sep 8, 2025. It is now read-only.

Commit 97d2d49

Browse files
committed
iiii
1 parent 6e1a684 commit 97d2d49

26 files changed

Lines changed: 2372 additions & 655 deletions

client/.env

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
CLIENT_URL=http://localhost:3000
2-
VITE_APP_BASE_URL= http://localhost:5053
1+
#CLIENT_URL=http://localhost:3000
2+
#VITE_APP_BASE_URL= http://localhost:5053
33

4-
#VITE_APP_BASE_URL=https://backend-admin.axleshift.com
5-
#CLIENT_URL=https://backend-admin.axleshift.com
4+
VITE_APP_BASE_URL=https://backend-admin.axleshift.com
5+
CLIENT_URL=https://backend-admin.axleshift.com
66

client/src/App.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ const Forgotpass = React.lazy(() => import("./views/pages/profile/forgotpass"));
1616
const Resetpass = React.lazy(() => import("./views/pages/profile/resetpass"));
1717
const OTP = React.lazy(()=> import ("./views/pages/profile/OTP"));
1818
const TermsAccept = React.lazy(()=> import('./views/pages/LegalPanel/agreement/termandaccept'));
19-
19+
const ComplainsExternalEmployees = React.lazy(() => import('./views/pages/LegalPanel/complains/employeesexternalcomplain'));
2020
const AppContent = () => {
2121
const { isColorModeSet, setColorMode } = useColorModes("coreui-free-react-admin-template-theme");
2222
const storedTheme = useSelector((state) => state.changeState.theme);
@@ -59,6 +59,7 @@ const AppContent = () => {
5959
<Route path="/forgotpass" element={<Forgotpass />} />
6060
<Route path="/resetpass/:id/:token" element={<Resetpass />} />
6161
<Route path="/termsaccept/:id/:token" element={<TermsAccept />} />
62+
<Route path="/employeesExternalComplain/:id/:token" element={<ComplainsExternalEmployees/>} />
6263
<Route path="/register" element={<Register />} />
6364
<Route path="/404" element={<Page404 />} />
6465
<Route path="/500" element={<Page500 />} />

client/src/_nav.js

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -449,35 +449,35 @@ const _nav = () => {
449449
to:'/monitoring'
450450
},
451451

452-
{
453-
component: CNavItem,
454-
name:'Agreement',
455-
icon: <FontAwesomeIcon icon={faBullhorn} style={{ marginRight: '8px' }} />,
456-
to:'/agreement'
457-
},
452+
// {
453+
// component: CNavItem,
454+
// name:'Agreement',
455+
// icon: <FontAwesomeIcon icon={faBullhorn} style={{ marginRight: '8px' }} />,
456+
// to:'/agreement'
457+
// },
458458

459-
{
460-
component: CNavItem,
461-
name:'AgreementDetails',
462-
icon: <FontAwesomeIcon icon={faBullhorn} style={{ marginRight: '8px' }} />,
463-
to:'/agreementdetail'
464-
},
459+
// {
460+
// component: CNavItem,
461+
// name:'AgreementDetails',
462+
// icon: <FontAwesomeIcon icon={faBullhorn} style={{ marginRight: '8px' }} />,
463+
// to:'/agreementdetail'
464+
// },
465465

466-
{
467-
component: CNavItem,
468-
name:'AgreementSuccess',
469-
icon: <FontAwesomeIcon icon={faBullhorn} style={{ marginRight: '8px' }} />,
470-
to:'/agreementsuccess'
471-
},
466+
// {
467+
// component: CNavItem,
468+
// name:'AgreementSuccess',
469+
// icon: <FontAwesomeIcon icon={faBullhorn} style={{ marginRight: '8px' }} />,
470+
// to:'/agreementsuccess'
471+
// },
472472

473473

474474

475-
{
476-
component: CNavItem,
477-
name:'Admin Agreement Creation',
478-
icon: <FontAwesomeIcon icon={faBullhorn} style={{ marginRight: '8px' }} />,
479-
to:'/adminagreementcreation'
480-
},
475+
// {
476+
// component: CNavItem,
477+
// name:'Admin Agreement Creation',
478+
// icon: <FontAwesomeIcon icon={faBullhorn} style={{ marginRight: '8px' }} />,
479+
// to:'/adminagreementcreation'
480+
// },
481481
{
482482
component: CNavItem,
483483
name:'Complains',

client/src/components/permissionConfigAdmin.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@ const accessPermissions = {
55
Core: ['/coredash', '/shipment', '/insight', ],
66
Finance: ['/financedash', '/monthly' ],
77
Logistics: ['/logisticdash', '/vehicles'],
8-
Administrative: ['/employeedash', '/restore', '/registernew', '/PendingRequest', '/AccessReview',]
8+
Administrative: ['/employeedash', '/restore', '/registernew', '/PendingRequest', '/AccessReview','/employeescomplains',]
99
}
1010
};
1111

1212
// Pages that are always permitted
13-
const alwaysPermitted = ['/profile', '/Settings', '/changepass', '/button', '/request'];
13+
const alwaysPermitted = ['/profile', '/Settings', '/changepass', '/button', '/request',"/employeescomplains"];
1414

1515
export { accessPermissions, alwaysPermitted };

client/src/routes.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ const AgreementDetail = React.lazy(() => import('./views/pages/LegalPanel/agreem
7878
const Agreementsuccess = React.lazy(() => import('./views/pages/LegalPanel/agreement/agreementsuccess'));
7979

8080
const Complains = React.lazy(() => import('./views/pages/LegalPanel/complains'));
81+
const ComplainsEmployees = React.lazy(() => import('./views/pages/LegalPanel/complains/employeescomplains'));
82+
const HrComplains = React.lazy(() => import('./views/pages/LegalPanel/complains/hrComplains'));
8183

8284
const routes = [
8385
{ path: '/', exact: true, name: 'Home' },
@@ -157,6 +159,8 @@ const routes = [
157159
{ path: '/agreementsuccess', name: 'Agreement Success', element: <ProtectedRoute><Agreementsuccess /></ProtectedRoute> },
158160

159161
{ path: '/complains', name: 'Complains', element: <ProtectedRoute><Complains /></ProtectedRoute> },
162+
{ path: '/employeescomplains', name: 'Complains', element: <ProtectedRoute><ComplainsEmployees /></ProtectedRoute> },
163+
{ path: '/hrcomplains', name: 'Complains', element: <ProtectedRoute><HrComplains /></ProtectedRoute> },
160164
];
161165

162166
export default routes;
Lines changed: 0 additions & 247 deletions
Original file line numberDiff line numberDiff line change
@@ -1,248 +1 @@
1-
// AdminAgreementCreate.jsx
2-
import React, { useState, useEffect } from 'react';
3-
import axios from 'axios';
4-
import MDEditor from '@uiw/react-md-editor';
51

6-
const AdminAgreementCreate = () => {
7-
const [stores, setStores] = useState([]);
8-
const [storeId, setStoreId] = useState('');
9-
const [agreementType, setAgreementType] = useState('Terms & Conditions');
10-
const [agreementVersion, setAgreementVersion] = useState('1.0');
11-
const [agreementContent, setAgreementContent] = useState('');
12-
13-
const [loading, setLoading] = useState(false);
14-
const [success, setSuccess] = useState(false);
15-
const [error, setError] = useState(null);
16-
const [createdAgreementId, setCreatedAgreementId] = useState(null);
17-
18-
// For notification step
19-
const [showNotify, setShowNotify] = useState(false);
20-
const [recipientEmail, setRecipientEmail] = useState('');
21-
const [recipientName, setRecipientName] = useState('');
22-
const [notifySuccess, setNotifySuccess] = useState(false);
23-
24-
useEffect(() => {
25-
// Fetch stores for dropdown
26-
const fetchStores = async () => {
27-
try {
28-
const response = await axios.get('/api/stores');
29-
setStores(response.data.stores);
30-
} catch (err) {
31-
setError('Failed to load stores');
32-
}
33-
};
34-
35-
fetchStores();
36-
}, []);
37-
38-
const handleSubmit = async (e) => {
39-
e.preventDefault();
40-
41-
if (!storeId || !agreementType || !agreementContent || !agreementVersion) {
42-
setError('All fields are required');
43-
return;
44-
}
45-
46-
setLoading(true);
47-
setError(null);
48-
49-
try {
50-
const response = await axios.post('/api/agreements/create', {
51-
storeId,
52-
agreementType,
53-
agreementContent,
54-
agreementVersion
55-
});
56-
57-
setSuccess(true);
58-
setCreatedAgreementId(response.data.agreement.id);
59-
setShowNotify(true);
60-
61-
// Get store details for notification
62-
const store = stores.find(s => s._id === storeId);
63-
if (store && store.contactEmail) {
64-
setRecipientEmail(store.contactEmail);
65-
setRecipientName(store.contactName || '');
66-
}
67-
} catch (err) {
68-
setError('Failed to create agreement. Please try again.');
69-
} finally {
70-
setLoading(false);
71-
}
72-
};
73-
74-
const handleSendNotification = async (e) => {
75-
e.preventDefault();
76-
77-
if (!recipientEmail) {
78-
setError('Email address is required');
79-
return;
80-
}
81-
82-
setLoading(true);
83-
setError(null);
84-
85-
try {
86-
await axios.post(`/api/agreements/notify/${createdAgreementId}`, {
87-
email: recipientEmail,
88-
name: recipientName
89-
});
90-
91-
setNotifySuccess(true);
92-
} catch (err) {
93-
setError('Failed to send notification. Please try again.');
94-
} finally {
95-
setLoading(false);
96-
}
97-
};
98-
99-
if (notifySuccess) {
100-
return (
101-
<div className="agreement-create">
102-
<div className="success-container card">
103-
<h2>Agreement Created & Notification Sent!</h2>
104-
<p>The store has been notified about the new agreement.</p>
105-
<button
106-
className="btn btn-primary"
107-
onClick={() => {
108-
setSuccess(false);
109-
setShowNotify(false);
110-
setNotifySuccess(false);
111-
setCreatedAgreementId(null);
112-
setAgreementContent('');
113-
setStoreId('');
114-
}}
115-
>
116-
Create Another Agreement
117-
</button>
118-
</div>
119-
</div>
120-
);
121-
}
122-
123-
if (showNotify && createdAgreementId) {
124-
return (
125-
<div className="agreement-create">
126-
<h2>Send Agreement Notification</h2>
127-
128-
<div className="card">
129-
<form onSubmit={handleSendNotification}>
130-
<div className="form-group">
131-
<label htmlFor="recipientEmail">Recipient Email:</label>
132-
<input
133-
type="email"
134-
id="recipientEmail"
135-
value={recipientEmail}
136-
onChange={(e) => setRecipientEmail(e.target.value)}
137-
required
138-
/>
139-
</div>
140-
141-
<div className="form-group">
142-
<label htmlFor="recipientName">Recipient Name:</label>
143-
<input
144-
type="text"
145-
id="recipientName"
146-
value={recipientName}
147-
onChange={(e) => setRecipientName(e.target.value)}
148-
/>
149-
</div>
150-
151-
{error && <div className="error">{error}</div>}
152-
153-
<div className="action-buttons">
154-
<button
155-
type="button"
156-
className="btn"
157-
onClick={() => setShowNotify(false)}
158-
disabled={loading}
159-
>
160-
Back
161-
</button>
162-
<button
163-
type="submit"
164-
className="btn btn-primary"
165-
disabled={loading}
166-
>
167-
{loading ? 'Sending...' : 'Send Notification'}
168-
</button>
169-
</div>
170-
</form>
171-
</div>
172-
</div>
173-
);
174-
}
175-
176-
return (
177-
<div className="agreement-create">
178-
<h2>Create New Agreement</h2>
179-
180-
<div className="card">
181-
<form onSubmit={handleSubmit}>
182-
<div className="form-group">
183-
<label htmlFor="storeId">Store:</label>
184-
<select
185-
id="storeId"
186-
value={storeId}
187-
onChange={(e) => setStoreId(e.target.value)}
188-
required
189-
>
190-
<option value="">Select a store</option>
191-
{stores.map(store => (
192-
<option key={store._id} value={store._id}>
193-
{store.name}
194-
</option>
195-
))}
196-
</select>
197-
</div>
198-
199-
<div className="form-group">
200-
<label htmlFor="agreementType">Agreement Type:</label>
201-
<select
202-
id="agreementType"
203-
value={agreementType}
204-
onChange={(e) => setAgreementType(e.target.value)}
205-
required
206-
>
207-
<option value="Terms & Conditions">Terms & Conditions</option>
208-
<option value="Contract">Contract</option>
209-
<option value="Privacy Policy">Privacy Policy</option>
210-
</select>
211-
</div>
212-
213-
<div className="form-group">
214-
<label htmlFor="agreementVersion">Version:</label>
215-
<input
216-
type="text"
217-
id="agreementVersion"
218-
value={agreementVersion}
219-
onChange={(e) => setAgreementVersion(e.target.value)}
220-
required
221-
/>
222-
</div>
223-
224-
<div className="form-group">
225-
<label htmlFor="agreementContent">Agreement Content:</label>
226-
<MDEditor
227-
value={agreementContent}
228-
onChange={setAgreementContent}
229-
height={400}
230-
/>
231-
</div>
232-
233-
{error && <div className="error">{error}</div>}
234-
235-
<button
236-
type="submit"
237-
className="btn btn-primary"
238-
disabled={loading}
239-
>
240-
{loading ? 'Creating...' : 'Create Agreement'}
241-
</button>
242-
</form>
243-
</div>
244-
</div>
245-
);
246-
};
247-
248-
export default AdminAgreementCreate;

0 commit comments

Comments
 (0)