inventrack 3.0.0

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 (55) hide show
  1. package/README.md +25 -0
  2. package/api/index.js +13 -0
  3. package/backend/README.md +35 -0
  4. package/backend/data/db.json +1239 -0
  5. package/backend/package-lock.json +532 -0
  6. package/backend/package.json +8 -0
  7. package/frontend/README.md +22 -0
  8. package/frontend/assets/Icon.png +0 -0
  9. package/frontend/assets/IconSort.png +0 -0
  10. package/frontend/assets/activity-1.png +0 -0
  11. package/frontend/assets/activity-2.png +0 -0
  12. package/frontend/assets/activity-3.png +0 -0
  13. package/frontend/assets/activity-4.png +0 -0
  14. package/frontend/assets/card-icon-1.png +0 -0
  15. package/frontend/assets/card-icon-2.png +0 -0
  16. package/frontend/assets/card-icon-3.png +0 -0
  17. package/frontend/assets/card-icon-4.png +0 -0
  18. package/frontend/assets/login.png +0 -0
  19. package/frontend/assets/logo.png +0 -0
  20. package/frontend/categories.html +143 -0
  21. package/frontend/css/all.min.css +9 -0
  22. package/frontend/css/bootstrap.min.css +6 -0
  23. package/frontend/css/categories.css +359 -0
  24. package/frontend/css/dashboard.css +373 -0
  25. package/frontend/css/inventoryInsights.css +308 -0
  26. package/frontend/css/inventoryOverview.css +353 -0
  27. package/frontend/css/orders.css +632 -0
  28. package/frontend/css/products.css +364 -0
  29. package/frontend/css/signin.css +120 -0
  30. package/frontend/css/style.css +282 -0
  31. package/frontend/css/suppliers.css +136 -0
  32. package/frontend/dashboard.html +160 -0
  33. package/frontend/index.html +124 -0
  34. package/frontend/inventoryInsights.html +182 -0
  35. package/frontend/inventoryOverview.html +187 -0
  36. package/frontend/js/api.js +55 -0
  37. package/frontend/js/auth.js +70 -0
  38. package/frontend/js/bootstrap.bundle.min.js +7 -0
  39. package/frontend/js/categories.js +356 -0
  40. package/frontend/js/dashboard.js +341 -0
  41. package/frontend/js/inventoryInsights.js +396 -0
  42. package/frontend/js/inventoryOverview.js +503 -0
  43. package/frontend/js/orders.js +662 -0
  44. package/frontend/js/products.js +650 -0
  45. package/frontend/js/suppliers.js +535 -0
  46. package/frontend/js/utils.js +234 -0
  47. package/frontend/orders.html +216 -0
  48. package/frontend/products.html +152 -0
  49. package/frontend/suppliers.html +175 -0
  50. package/frontend/webfonts/fa-brands-400.woff2 +0 -0
  51. package/frontend/webfonts/fa-regular-400.woff2 +0 -0
  52. package/frontend/webfonts/fa-solid-900.woff2 +0 -0
  53. package/frontend/webfonts/fa-v4compatibility.woff2 +0 -0
  54. package/package.json +38 -0
  55. package/vercel.json +18 -0
@@ -0,0 +1,359 @@
1
+ /* ========================
2
+ Categories Page Styles
3
+ Matches dashboard.css conventions
4
+ ======================== */
5
+
6
+ /* Page Title */
7
+ .page-title {
8
+ margin: 20px 0px;
9
+ }
10
+
11
+ /* Search Card */
12
+ .search-card {
13
+ padding: var(--space-4) var(--space-5);
14
+ box-shadow: var(--shadow-sm);
15
+ border: none;
16
+ }
17
+
18
+ .search-wrapper {
19
+ width: 100%;
20
+ max-width: 460px;
21
+ }
22
+
23
+ .search-icon {
24
+ color: var(--primary);
25
+ font-size: 16px;
26
+ }
27
+
28
+ .search-input {
29
+ border: none;
30
+ outline: none;
31
+ background: transparent;
32
+ width: 100%;
33
+ color: var(--text-primary);
34
+ font-size: 14px;
35
+ }
36
+
37
+ .search-input::placeholder {
38
+ color: var(--text-muted);
39
+ }
40
+
41
+ /* Add Category Button */
42
+ .add-category-btn {
43
+ padding: var(--space-3) var(--space-6);
44
+ border: none;
45
+ background-color: var(--primary);
46
+ color: var(--text-white);
47
+ border-radius: var(--radius-md);
48
+ font-weight: 600;
49
+ transition: var(--transition-fast);
50
+ cursor: pointer;
51
+ }
52
+
53
+ .add-category-btn:hover {
54
+ background-color: var(--primary-hover);
55
+ }
56
+
57
+ .add-category-btn i {
58
+ color: var(--text-white);
59
+ }
60
+
61
+ /* Categories Table Card */
62
+ .categories-card {
63
+ width: 100%;
64
+ box-shadow: var(--shadow-sm);
65
+ border: none;
66
+ border-radius: var(--radius-lg);
67
+ overflow: hidden;
68
+ background-color: var(--bg-card);
69
+ }
70
+
71
+ .categories-table thead th {
72
+ background: #f3f4f6;
73
+ font-size: 12px;
74
+ text-transform: uppercase;
75
+ color: var(--text-secondary);
76
+ padding: 16px;
77
+ font-weight: 700;
78
+ letter-spacing: 0.04em;
79
+ }
80
+
81
+ .categories-table tbody td {
82
+ padding: 18px 16px;
83
+ border-top: 1px solid #eee;
84
+ vertical-align: middle;
85
+ }
86
+
87
+ /* Category Cell (icon + name) */
88
+ .category-cell {
89
+ display: flex;
90
+ align-items: center;
91
+ gap: 12px;
92
+ }
93
+
94
+ .category-icon {
95
+ width: 40px;
96
+ height: 40px;
97
+ border-radius: var(--radius-sm);
98
+ display: flex;
99
+ align-items: center;
100
+ justify-content: center;
101
+ flex-shrink: 0;
102
+ }
103
+
104
+ .icon-purple-bg {
105
+ background-color: var(--icon-purple-bg);
106
+ }
107
+ .icon-purple-bg i {
108
+ color: var(--primary);
109
+ }
110
+
111
+ .icon-green-bg {
112
+ background-color: var(--icon-green-bg);
113
+ }
114
+ .icon-green-bg i {
115
+ color: var(--success-dark);
116
+ }
117
+
118
+ .icon-yellow-bg {
119
+ background-color: var(--icon-yellow-bg);
120
+ }
121
+ .icon-yellow-bg i {
122
+ color: var(--warning-dark);
123
+ }
124
+
125
+ .icon-blue-bg {
126
+ background-color: var(--icon-blue-bg);
127
+ }
128
+ .icon-blue-bg i {
129
+ color: var(--info-dark);
130
+ }
131
+
132
+ .icon-red-bg {
133
+ background-color: var(--icon-red-bg);
134
+ }
135
+ .icon-red-bg i {
136
+ color: var(--danger-dark);
137
+ }
138
+
139
+ .category-name {
140
+ font-weight: 700;
141
+ color: var(--text-primary);
142
+ }
143
+
144
+ /* Description */
145
+ .category-desc {
146
+ color: var(--text-secondary);
147
+ max-width: 340px;
148
+ }
149
+
150
+ /* Products count */
151
+ .products-count {
152
+ font-weight: 700;
153
+ color: var(--primary);
154
+ }
155
+
156
+ /* Status badges */
157
+ .cat-status {
158
+ padding: 5px 14px;
159
+ border-radius: 20px;
160
+ font-size: 12px;
161
+ font-weight: 600;
162
+ }
163
+
164
+ .cat-status.active {
165
+ background-color: var(--success-bg);
166
+ color: var(--success-dark);
167
+ }
168
+
169
+ .cat-status.inactive {
170
+ background-color: var(--bg-soft);
171
+ color: var(--text-secondary);
172
+ border: 1px solid var(--border-light);
173
+ }
174
+
175
+ /* Action Buttons */
176
+ .action-btn {
177
+ width: 34px;
178
+ height: 34px;
179
+ border: none;
180
+ border-radius: var(--radius-sm);
181
+ display: inline-flex;
182
+ align-items: center;
183
+ justify-content: center;
184
+ cursor: pointer;
185
+ transition: var(--transition-fast);
186
+ }
187
+
188
+ .edit-btn {
189
+ background-color: var(--primary-soft);
190
+ color: var(--primary);
191
+ }
192
+
193
+ .edit-btn:hover {
194
+ background-color: var(--primary-light);
195
+ color: var(--text-white);
196
+ }
197
+
198
+ .delete-btn {
199
+ background-color: var(--danger-bg);
200
+ color: var(--danger);
201
+ }
202
+
203
+ .delete-btn:hover {
204
+ background-color: var(--danger);
205
+ color: var(--text-white);
206
+ }
207
+
208
+ /* Table Footer & Pagination — matches dashboard.css */
209
+ /* .table-footer {
210
+ display: flex;
211
+ justify-content: space-between;
212
+ align-items: center;
213
+ padding: 16px;
214
+ border-top: 1px solid #eee;
215
+ color: var(--text-secondary);
216
+ font-size: 13px;
217
+ }
218
+
219
+ .pagination button {
220
+ border: none;
221
+ background: none;
222
+ margin: 0 4px;
223
+ padding: 6px 10px;
224
+ border-radius: 6px;
225
+ cursor: pointer;
226
+ color: var(--text-secondary);
227
+ transition: var(--transition-fast);
228
+ }
229
+
230
+ .pagination button:hover {
231
+ background-color: var(--bg-hover);
232
+ }
233
+
234
+ .pagination .active {
235
+ background: var(--primary-soft);
236
+ color: var(--primary);
237
+ font-weight: bold;
238
+ } */
239
+
240
+ /* ========================
241
+ Modal
242
+ ======================== */
243
+ .hidden {
244
+ display: none !important;
245
+ }
246
+
247
+ .modal-overlay-bg {
248
+ position: fixed;
249
+ inset: 0;
250
+ background: rgba(0, 0, 0, 0.45);
251
+ z-index: 999;
252
+ }
253
+
254
+ .custom-modal {
255
+ position: fixed;
256
+ inset: 0;
257
+ z-index: 1000;
258
+ display: flex;
259
+ justify-content: center;
260
+ align-items: center;
261
+ padding: 20px;
262
+ }
263
+
264
+ .modal-box {
265
+ width: 100%;
266
+ max-width: 600px;
267
+ background: #fff;
268
+ border-radius: 16px;
269
+ padding: 24px;
270
+ box-shadow: 0 10px 35px rgba(0, 0, 0, 0.15);
271
+ }
272
+
273
+ .modal-close {
274
+ border: none;
275
+ background: transparent;
276
+ font-size: 22px;
277
+ cursor: pointer;
278
+ }
279
+
280
+ .page-btn {
281
+ border: 1px solid #ddd;
282
+ background: #fff;
283
+ padding: 6px 12px;
284
+ border-radius: 8px;
285
+ cursor: pointer;
286
+ }
287
+
288
+ .page-btn.active {
289
+ background: var(--primary);
290
+ color: #fff;
291
+ border-color: var(--primary);
292
+ }
293
+
294
+ .page-btn:disabled {
295
+ opacity: 0.5;
296
+ cursor: not-allowed;
297
+ }
298
+
299
+ @keyframes modalIn {
300
+ from {
301
+ opacity: 0;
302
+ transform: translateY(-12px);
303
+ }
304
+ to {
305
+ opacity: 1;
306
+ transform: translateY(0);
307
+ }
308
+ }
309
+
310
+ .modal-close {
311
+ background: var(--bg-soft);
312
+ border: none;
313
+ border-radius: var(--radius-sm);
314
+ width: 32px;
315
+ height: 32px;
316
+ cursor: pointer;
317
+ color: var(--text-secondary);
318
+ font-size: 16px;
319
+ display: flex;
320
+ align-items: center;
321
+ justify-content: center;
322
+ transition: var(--transition-fast);
323
+ }
324
+
325
+ .modal-close:hover {
326
+ background: var(--danger-bg);
327
+ color: var(--danger);
328
+ }
329
+
330
+ .cat-input {
331
+ border: 1px solid var(--border-light);
332
+ border-radius: var(--radius-sm);
333
+ padding: var(--space-2) var(--space-3);
334
+ width: 100%;
335
+ color: var(--text-primary);
336
+ background: var(--bg-soft);
337
+ transition: var(--transition-fast);
338
+ }
339
+
340
+ .cat-input:focus {
341
+ outline: none;
342
+ border-color: var(--primary-light);
343
+ background: var(--bg-card);
344
+ box-shadow: 0 0 0 3px rgba(124, 58, 237, 0.1);
345
+ }
346
+
347
+ .cancel-btn {
348
+ padding: var(--space-3) var(--space-6);
349
+ border: 1px solid var(--border-light);
350
+ background: transparent;
351
+ color: var(--text-secondary);
352
+ border-radius: var(--radius-md);
353
+ cursor: pointer;
354
+ transition: var(--transition-fast);
355
+ }
356
+
357
+ .cancel-btn:hover {
358
+ background: var(--bg-hover);
359
+ }
@@ -0,0 +1,373 @@
1
+ /*y Dashboard */
2
+
3
+ .page-title {
4
+ margin: 20px 0px;
5
+ }
6
+
7
+ .card {
8
+ width: 24%;
9
+ padding: var(--space-5) var(--space-5);
10
+ box-shadow: var(--shadow-sm);
11
+ border: none;
12
+ }
13
+ .icon-purple,
14
+ .products-status {
15
+ background: var(--icon-purple-bg);
16
+ padding: 8px;
17
+ border-radius: var(--radius-sm);
18
+ }
19
+ .icon-yellow,
20
+ .stock-status {
21
+ background: var(--icon-yellow-bg);
22
+ padding: 8px;
23
+ border-radius: var(--radius-sm);
24
+ }
25
+ .icon-blue,
26
+ .supplier-status {
27
+ background: var(--icon-blue-bg);
28
+ padding: 8px;
29
+ border-radius: var(--radius-sm);
30
+ }
31
+ .icon-green,
32
+ .inventory-status {
33
+ background: var(--icon-green-bg);
34
+ padding: 8px;
35
+ border-radius: var(--radius-sm);
36
+ }
37
+
38
+ .card i {
39
+ color: var(--success);
40
+ }
41
+
42
+ .icon-red {
43
+ background: var(--icon-red-bg);
44
+ padding: 8px;
45
+ border-radius: var(--radius-sm);
46
+ }
47
+
48
+ .inventory-chart {
49
+ width: 60%;
50
+ background-color: var(--bg-card);
51
+ border-radius: var(--radius-lg);
52
+ }
53
+ .top-caption small {
54
+ background-color: var(--bg-soft);
55
+ padding: var(--space-2) var(--space-5);
56
+ border-radius: var(--radius-md);
57
+ }
58
+ .inventory-chart .container {
59
+ height: 80%;
60
+ }
61
+ .chart-col {
62
+ max-width: 8%;
63
+ }
64
+ .level {
65
+ min-height: 5px;
66
+ border-top-left-radius: var(--radius-md);
67
+ border-top-right-radius: var(--radius-md);
68
+ width: 60px;
69
+ background-color: var(--primary);
70
+ }
71
+
72
+ .recent-activity {
73
+ width: 35%;
74
+ height: 100%;
75
+ background-color: var(--bg-card);
76
+ border-radius: var(--radius-lg);
77
+ }
78
+ .activities {
79
+ padding-top: 15px;
80
+ width: 100%;
81
+ min-height: 180px;
82
+ }
83
+ .activities .icon {
84
+ width: 10%;
85
+ margin-right: 10px;
86
+ }
87
+ .activity-caption span {
88
+ font-size: 12px;
89
+ }
90
+
91
+ .low-wtock-preview {
92
+ width: 100%;
93
+ }
94
+
95
+ .low-stock-header {
96
+ width: 90%;
97
+ }
98
+ .bulk-order-btn {
99
+ padding: var(--space-2) var(--space-8);
100
+ border: none;
101
+ background-color: var(--primary);
102
+ color: var(--text-white) !important;
103
+ transition: var(--transition-fast);
104
+ border-radius: var(--radius-md);
105
+ }
106
+ .bulk-order-btn:hover {
107
+ background-color: var(--primary-hover);
108
+ }
109
+ .bulk-order-btn i {
110
+ color: white;
111
+ }
112
+
113
+ .low-stock-card {
114
+ max-width: 980px;
115
+ margin: 30px auto;
116
+ background: #fff;
117
+ border-radius: 20px;
118
+ box-shadow: var(--bs-box-shadow-lg);
119
+ overflow: hidden;
120
+ }
121
+
122
+ .table thead th {
123
+ background: #f3f4f6;
124
+ padding: 16px;
125
+ }
126
+
127
+ .table tbody td {
128
+ padding: 18px;
129
+ border-top: 1px solid #eee;
130
+ }
131
+
132
+ .product-cell {
133
+ display: flex;
134
+ align-items: center;
135
+ gap: 12px;
136
+ }
137
+
138
+ .product-icon {
139
+ width: 40px;
140
+ height: 40px;
141
+ background: #e9eff1;
142
+ border-radius: 10px;
143
+ display: flex;
144
+ align-items: center;
145
+ justify-content: center;
146
+ }
147
+ .product-icon i {
148
+ color: #555;
149
+ }
150
+
151
+ .product-info h6 {
152
+ margin: 0;
153
+ font-weight: 700;
154
+ }
155
+
156
+ .stock-critical {
157
+ color: #c7485b !important;
158
+ font-weight: bold;
159
+ }
160
+
161
+ .stock-normal {
162
+ color: #5d5a85 !important;
163
+ font-weight: bold;
164
+ }
165
+
166
+ .status {
167
+ padding: 5px 12px;
168
+ border-radius: 20px;
169
+ font-size: 12px;
170
+ font-weight: bold;
171
+ }
172
+
173
+ .critical {
174
+ background: #f59aaa;
175
+ color: #7a1c2d;
176
+ }
177
+ .out {
178
+ background: #5b0018;
179
+ color: #fff;
180
+ }
181
+ .low {
182
+ background: #dad5f5;
183
+ color: #5e5a84;
184
+ }
185
+
186
+ .reorder-btn {
187
+ background: var(--primary);
188
+ color: white;
189
+ border: none;
190
+ padding: 6px 16px;
191
+ border-radius: 20px;
192
+ font-weight: bold;
193
+ transition: var(--transition-fast);
194
+ }
195
+ .reorder-btn:hover {
196
+ background-color: var(--primary-hover);
197
+ }
198
+ .table-footer {
199
+ display: flex;
200
+ justify-content: space-between;
201
+ padding: 16px;
202
+ }
203
+ .table-footer i {
204
+ color: #555 !important;
205
+ }
206
+
207
+
208
+ @media (max-width: 992px) {
209
+ .summary-cards {
210
+ flex-wrap: wrap;
211
+ gap: 20px !important;
212
+ }
213
+
214
+ .card {
215
+ width: calc(50% - 10px);
216
+ min-width: 240px;
217
+ }
218
+ .low-wtock-preview {
219
+ width: 100%;
220
+ }
221
+ .low-stock-card {
222
+ width: 100% !important;
223
+ }
224
+ .table-responsive {
225
+ width: 100%;
226
+ }
227
+ .table {
228
+ width: 100%;
229
+ }
230
+ }
231
+
232
+ @media (max-width: 768px) {
233
+ .summary-cards {
234
+ gap: 16px;
235
+ }
236
+
237
+ .card {
238
+ width: 100%;
239
+ margin-bottom: 12px;
240
+ }
241
+
242
+ .statistics {
243
+ flex-direction: column;
244
+ gap: 24px;
245
+ }
246
+
247
+ .inventory-chart,
248
+ .recent-activity {
249
+ width: 100% !important;
250
+ }
251
+
252
+ .inventory-chart {
253
+ padding: 20px !important;
254
+ }
255
+
256
+ .inventory-chart .container {
257
+ height: auto !important;
258
+ flex-wrap: wrap;
259
+ gap: 16px 12px;
260
+ justify-content: center !important;
261
+ }
262
+
263
+ .chart-col {
264
+ width: 30%;
265
+ min-width: 80px;
266
+ align-items: center;
267
+ }
268
+
269
+ .level {
270
+ width: 100% !important;
271
+ height: 140px !important;
272
+ min-height: unset !important;
273
+ }
274
+
275
+ .chart-col small {
276
+ margin-top: 8px;
277
+ text-align: center;
278
+ white-space: normal;
279
+ }
280
+
281
+ .recent-activity {
282
+ padding: 20px !important;
283
+ }
284
+
285
+ .activities .container {
286
+ margin-bottom: 16px;
287
+ }
288
+
289
+ .activity-caption p {
290
+ margin: 0;
291
+ font-size: 0.95rem;
292
+ }
293
+
294
+ .activity-caption span {
295
+ font-size: 0.8rem;
296
+ opacity: 0.8;
297
+ }
298
+
299
+ .low-stock-header {
300
+ flex-direction: column;
301
+ align-items: flex-start;
302
+ gap: 16px;
303
+ margin-bottom: 20px;
304
+ }
305
+
306
+ .bulk-order-btn {
307
+ width: 100%;
308
+ padding: 12px;
309
+ font-size: 1rem;
310
+ }
311
+
312
+ .low-stock-card {
313
+ margin: 0 8px 24px;
314
+ border-radius: 12px;
315
+ }
316
+
317
+ .table-responsive {
318
+ overflow-x: auto;
319
+ width: 100%;
320
+ }
321
+
322
+ .table {
323
+ width: 100%;
324
+ }
325
+
326
+ .table thead th,
327
+ .table tbody td {
328
+ padding: 12px 10px;
329
+ font-size: 0.92rem;
330
+ }
331
+
332
+ .product-cell {
333
+ min-width: 180px;
334
+ }
335
+
336
+ .status {
337
+ padding: 4px 10px;
338
+ font-size: 0.8rem;
339
+ }
340
+
341
+ .reorder-btn {
342
+ padding: 6px 12px;
343
+ font-size: 0.85rem;
344
+ white-space: nowrap;
345
+ }
346
+
347
+ .table-footer {
348
+ flex-direction: column;
349
+ align-items: flex-start;
350
+ gap: 12px;
351
+ padding: 16px 12px;
352
+ font-size: 0.9rem;
353
+ }
354
+
355
+ .pagination {
356
+ width: 100%;
357
+ justify-content: center;
358
+ }
359
+
360
+ .pagination button {
361
+ min-width: 34px;
362
+ padding: 6px 10px;
363
+ font-size: 0.9rem;
364
+ }
365
+
366
+ .page-title h1 {
367
+ font-size: 1.8rem;
368
+ }
369
+
370
+ .page-title p {
371
+ font-size: 0.95rem;
372
+ }
373
+ }