react-repos 1.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/package.json +6 -9
- package/repos/task-common/README.md +63 -0
- package/repos/task-common/backend/.env.example +3 -0
- package/repos/task-common/backend/app.js +16 -0
- package/repos/task-common/backend/config/db.js +11 -0
- package/repos/task-common/backend/controllers/itemController.js +51 -0
- package/repos/task-common/backend/data/items.json +5 -0
- package/repos/task-common/backend/middleware/errorHandler.js +7 -0
- package/repos/task-common/backend/middleware/notFound.js +3 -0
- package/repos/task-common/backend/models/Item.js +16 -0
- package/repos/task-common/backend/package.json +22 -0
- package/repos/task-common/backend/pnpm-lock.yaml +970 -0
- package/repos/task-common/backend/routes/itemRoutes.js +9 -0
- package/repos/task-common/backend/scripts/seed.js +22 -0
- package/repos/task-common/backend/server.js +12 -0
- package/repos/task-common/backend/test/buildQuery.test.js +16 -0
- package/repos/task-common/backend/utils/buildQuery.js +15 -0
- package/repos/task-common/frontend/.env.example +2 -0
- package/repos/task-common/frontend/package.json +27 -0
- package/repos/task-common/frontend/pnpm-lock.yaml +12209 -0
- package/repos/task-common/frontend/public/index.html +14 -0
- package/repos/task-common/frontend/src/App.js +28 -0
- package/repos/task-common/frontend/src/App.test.js +14 -0
- package/repos/task-common/frontend/src/api/httpClient.js +14 -0
- package/repos/task-common/frontend/src/api/itemService.js +9 -0
- package/repos/task-common/frontend/src/components/common/Badge.js +12 -0
- package/repos/task-common/frontend/src/components/common/ConfirmDialog.js +8 -0
- package/repos/task-common/frontend/src/components/common/DataTable.js +9 -0
- package/repos/task-common/frontend/src/components/common/EmptyState.js +6 -0
- package/repos/task-common/frontend/src/components/common/ErrorAlert.js +6 -0
- package/repos/task-common/frontend/src/components/common/FilterBar.js +8 -0
- package/repos/task-common/frontend/src/components/common/LoadingState.js +5 -0
- package/repos/task-common/frontend/src/components/common/Modal.js +8 -0
- package/repos/task-common/frontend/src/components/common/PageHeader.js +8 -0
- package/repos/task-common/frontend/src/components/common/Pagination.js +10 -0
- package/repos/task-common/frontend/src/components/common/ProgressBar.js +9 -0
- package/repos/task-common/frontend/src/components/common/StatCard.js +8 -0
- package/repos/task-common/frontend/src/components/items/ItemCard.js +10 -0
- package/repos/task-common/frontend/src/components/items/ItemForm.js +18 -0
- package/repos/task-common/frontend/src/components/layout/AppLayout.js +11 -0
- package/repos/task-common/frontend/src/components/layout/Sidebar.js +23 -0
- package/repos/task-common/frontend/src/components/layout/Topbar.js +13 -0
- package/repos/task-common/frontend/src/config/theme.js +11 -0
- package/repos/task-common/frontend/src/context/ItemContext.js +9 -0
- package/repos/task-common/frontend/src/hooks/useItems.js +30 -0
- package/repos/task-common/frontend/src/hooks/usePagination.js +10 -0
- package/repos/task-common/frontend/src/index.js +11 -0
- package/repos/task-common/frontend/src/pages/DashboardPage.js +30 -0
- package/repos/task-common/frontend/src/pages/ItemsPage.js +36 -0
- package/repos/task-common/frontend/src/pages/ProfilePage.js +9 -0
- package/repos/task-common/frontend/src/utils/date.js +4 -0
- package/repos/task1/README.md +34 -0
- package/repos/task1/backend/.env.example +3 -0
- package/repos/task1/backend/app.js +17 -0
- package/repos/task1/backend/config/db.js +12 -0
- package/repos/task1/backend/controllers/taskController.js +68 -0
- package/repos/task1/backend/data/taskflow-data.json +14 -0
- package/repos/task1/backend/models/Task.js +21 -0
- package/repos/task1/backend/package-lock.json +1462 -0
- package/repos/task1/backend/package.json +25 -0
- package/repos/task1/backend/routes/taskRoutes.js +9 -0
- package/repos/task1/backend/scripts/seed.js +22 -0
- package/repos/task1/backend/server.js +12 -0
- package/repos/task1/frontend/README.md +70 -0
- package/repos/task1/frontend/package-lock.json +17515 -0
- package/repos/task1/frontend/package.json +43 -0
- package/repos/task1/frontend/public/favicon.ico +0 -0
- package/repos/task1/frontend/public/index.html +43 -0
- package/repos/task1/frontend/public/logo192.png +0 -0
- package/repos/task1/frontend/public/logo512.png +0 -0
- package/repos/task1/frontend/public/manifest.json +25 -0
- package/repos/task1/frontend/public/robots.txt +3 -0
- package/repos/task1/frontend/src/App.js +44 -0
- package/repos/task1/frontend/src/App.test.js +10 -0
- package/repos/task1/frontend/src/api/taskService.js +9 -0
- package/repos/task1/frontend/src/components/Dashboard.js +28 -0
- package/repos/task1/frontend/src/components/DashboardTable.js +29 -0
- package/repos/task1/frontend/src/components/Layout.js +15 -0
- package/repos/task1/frontend/src/components/Pagination.js +19 -0
- package/repos/task1/frontend/src/components/PriorityPill.js +4 -0
- package/repos/task1/frontend/src/components/Profile.js +4 -0
- package/repos/task1/frontend/src/components/Sidebar.js +26 -0
- package/repos/task1/frontend/src/components/StatCard.js +6 -0
- package/repos/task1/frontend/src/components/StatusPill.js +4 -0
- package/repos/task1/frontend/src/components/TaskCard.js +22 -0
- package/repos/task1/frontend/src/components/TaskFilters.js +11 -0
- package/repos/task1/frontend/src/components/TaskFormModal.js +35 -0
- package/repos/task1/frontend/src/components/Tasks.js +42 -0
- package/repos/task1/frontend/src/components/Topbar.js +18 -0
- package/repos/task1/frontend/src/components/theme.js +8 -0
- package/repos/task1/frontend/src/index.js +14 -0
- package/repos/task1/screenshots/add-task-form.jpg +0 -0
- package/repos/task1/screenshots/dashboard.jpg +0 -0
- package/repos/task1/screenshots/tasks.jpg +0 -0
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// Maps REST endpoints to the reusable item controller actions.
|
|
2
|
+
const express = require('express');
|
|
3
|
+
const controller = require('../controllers/itemController');
|
|
4
|
+
|
|
5
|
+
const router = express.Router();
|
|
6
|
+
router.route('/').get(controller.listItems).post(controller.createItem);
|
|
7
|
+
router.route('/:id').get(controller.getItem).put(controller.updateItem).patch(controller.updateItem).delete(controller.deleteItem);
|
|
8
|
+
|
|
9
|
+
module.exports = router;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// Replaces the collection with starter records for local development.
|
|
2
|
+
require('dotenv').config();
|
|
3
|
+
const mongoose = require('mongoose');
|
|
4
|
+
const connectDatabase = require('../config/db');
|
|
5
|
+
const Item = require('../models/Item');
|
|
6
|
+
const items = require('../data/items.json');
|
|
7
|
+
|
|
8
|
+
const seed = async () => {
|
|
9
|
+
try {
|
|
10
|
+
await connectDatabase();
|
|
11
|
+
await Item.deleteMany({});
|
|
12
|
+
await Item.insertMany(items);
|
|
13
|
+
console.log(`Seeded ${items.length} items`);
|
|
14
|
+
} catch (error) {
|
|
15
|
+
console.error(`Seed failed: ${error.message}`);
|
|
16
|
+
process.exitCode = 1;
|
|
17
|
+
} finally {
|
|
18
|
+
await mongoose.disconnect();
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
seed();
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// Loads environment values, connects MongoDB, and starts the HTTP server.
|
|
2
|
+
require('dotenv').config();
|
|
3
|
+
const app = require('./app');
|
|
4
|
+
const connectDatabase = require('./config/db');
|
|
5
|
+
|
|
6
|
+
const port = process.env.PORT || 5002;
|
|
7
|
+
connectDatabase()
|
|
8
|
+
.then(() => app.listen(port, () => console.log(`API running at http://localhost:${port}`)))
|
|
9
|
+
.catch((error) => {
|
|
10
|
+
console.error(`Startup failed: ${error.message}`);
|
|
11
|
+
process.exit(1);
|
|
12
|
+
});
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// Tests the query builder without requiring a running MongoDB instance.
|
|
2
|
+
const test = require('node:test');
|
|
3
|
+
const assert = require('node:assert/strict');
|
|
4
|
+
const { buildQuery, escapeRegex } = require('../utils/buildQuery');
|
|
5
|
+
|
|
6
|
+
test('buildQuery maps filters and search', () => {
|
|
7
|
+
const query = buildQuery({ priority: 'High', status: 'Done', search: 'API' });
|
|
8
|
+
assert.equal(query.priority, 'High');
|
|
9
|
+
assert.equal(query.status, 'Done');
|
|
10
|
+
assert.equal(query.$or.length, 2);
|
|
11
|
+
assert.equal(query.$or[0].name.test('api setup'), true);
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
test('escapeRegex neutralizes regex characters', () => {
|
|
15
|
+
assert.equal(escapeRegex('a+b?'), 'a\\+b\\?');
|
|
16
|
+
});
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// Converts common list query parameters into a safe Mongoose filter object.
|
|
2
|
+
const escapeRegex = (value = '') => value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
3
|
+
|
|
4
|
+
const buildQuery = ({ priority, status, search } = {}) => {
|
|
5
|
+
const query = {};
|
|
6
|
+
if (priority) query.priority = priority;
|
|
7
|
+
if (status) query.status = status;
|
|
8
|
+
if (search) {
|
|
9
|
+
const matcher = new RegExp(escapeRegex(search), 'i');
|
|
10
|
+
query.$or = [{ name: matcher }, { description: matcher }];
|
|
11
|
+
}
|
|
12
|
+
return query;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
module.exports = { buildQuery, escapeRegex };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "mern-common-frontend",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"dependencies": {
|
|
6
|
+
"@testing-library/jest-dom": "^6.9.1",
|
|
7
|
+
"@testing-library/react": "^16.3.0",
|
|
8
|
+
"axios": "^1.13.0",
|
|
9
|
+
"bootstrap": "^5.3.8",
|
|
10
|
+
"bootstrap-icons": "^1.13.1",
|
|
11
|
+
"react": "^19.2.0",
|
|
12
|
+
"react-dom": "^19.2.0",
|
|
13
|
+
"react-router-dom": "^6.30.2",
|
|
14
|
+
"react-scripts": "5.0.1"
|
|
15
|
+
},
|
|
16
|
+
"scripts": {
|
|
17
|
+
"start": "react-scripts start",
|
|
18
|
+
"build": "react-scripts build",
|
|
19
|
+
"test": "react-scripts test",
|
|
20
|
+
"eject": "react-scripts eject"
|
|
21
|
+
},
|
|
22
|
+
"eslintConfig": { "extends": ["react-app", "react-app/jest"] },
|
|
23
|
+
"browserslist": {
|
|
24
|
+
"production": [">0.2%", "not dead", "not op_mini all"],
|
|
25
|
+
"development": ["last 1 chrome version", "last 1 firefox version", "last 1 safari version"]
|
|
26
|
+
}
|
|
27
|
+
}
|