update to turftracking
This commit is contained in:
14
README.md
14
README.md
@@ -1,6 +1,6 @@
|
|||||||
# TurfTracker - Professional Lawn Care Management
|
# TurfTracking - Professional Lawn Care Management
|
||||||
|
|
||||||
TurfTracker is a comprehensive web application designed for homeowners to track and manage their lawn care activities including fertilizer applications, weed control, mowing schedules, and equipment management.
|
TurfTracking is a comprehensive web application designed for homeowners to track and manage their lawn care activities including fertilizer applications, weed control, mowing schedules, and equipment management.
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
@@ -76,7 +76,7 @@ TurfTracker is a comprehensive web application designed for homeowners to track
|
|||||||
|
|
||||||
- Docker and Docker Compose
|
- Docker and Docker Compose
|
||||||
- Traefik reverse proxy running with `proxy` network
|
- Traefik reverse proxy running with `proxy` network
|
||||||
- DNS pointing `turftracker.kaspers.us` to your server
|
- DNS pointing `turftracker.kaspers.us` to your server (or your chosen domain)
|
||||||
- Git
|
- Git
|
||||||
|
|
||||||
### Traefik Configuration Notes
|
### Traefik Configuration Notes
|
||||||
@@ -92,7 +92,7 @@ This application is pre-configured for deployment behind Traefik with:
|
|||||||
1. **Clone the repository**
|
1. **Clone the repository**
|
||||||
```bash
|
```bash
|
||||||
git clone <repository-url>
|
git clone <repository-url>
|
||||||
cd turftracker
|
cd turftracking
|
||||||
```
|
```
|
||||||
|
|
||||||
2. **Environment Configuration**
|
2. **Environment Configuration**
|
||||||
@@ -235,8 +235,8 @@ If you have an Authentik instance for SSO:
|
|||||||
|
|
||||||
3. **In Authentik Applications:**
|
3. **In Authentik Applications:**
|
||||||
- Create new Application
|
- Create new Application
|
||||||
- Set Name: `TurfTracker`
|
- Set Name: `TurfTracking`
|
||||||
- Set Slug: `turftracker`
|
- Set Slug: `turftracking`
|
||||||
- Set Provider: (select the provider created above)
|
- Set Provider: (select the provider created above)
|
||||||
|
|
||||||
**Scopes Required:** `openid profile email`
|
**Scopes Required:** `openid profile email`
|
||||||
@@ -244,7 +244,7 @@ If you have an Authentik instance for SSO:
|
|||||||
## Application Structure
|
## Application Structure
|
||||||
|
|
||||||
```
|
```
|
||||||
turftracker/
|
turftracking/
|
||||||
├── backend/ # Node.js API server
|
├── backend/ # Node.js API server
|
||||||
│ ├── src/
|
│ ├── src/
|
||||||
│ │ ├── routes/ # API endpoints
|
│ │ ├── routes/ # API endpoints
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "turftracker-backend",
|
"name": "turftracking-backend",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "Backend API for TurfTracker lawn care management application",
|
"description": "Backend API for TurfTracking lawn care management application",
|
||||||
"main": "src/app.js",
|
"main": "src/app.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "node src/app.js",
|
"start": "node src/app.js",
|
||||||
@@ -38,6 +38,6 @@
|
|||||||
"fertilizer",
|
"fertilizer",
|
||||||
"turf management"
|
"turf management"
|
||||||
],
|
],
|
||||||
"author": "TurfTracker Team",
|
"author": "TurfTracking Team",
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
}
|
}
|
||||||
@@ -136,7 +136,7 @@ process.on('SIGINT', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
app.listen(PORT, '0.0.0.0', () => {
|
app.listen(PORT, '0.0.0.0', () => {
|
||||||
console.log(`TurfTracker API server running on port ${PORT}`);
|
console.log(`TurfTracking API server running on port ${PORT}`);
|
||||||
console.log(`Environment: ${process.env.NODE_ENV || 'development'}`);
|
console.log(`Environment: ${process.env.NODE_ENV || 'development'}`);
|
||||||
});
|
});
|
||||||
// Disable etags and set no-store by default to avoid stale cached API responses
|
// Disable etags and set no-store by default to avoid stale cached API responses
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "turftracker-frontend",
|
"name": "turftracking-frontend",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "Frontend React application for TurfTracker lawn care management",
|
"description": "Frontend React application for TurfTracking lawn care management",
|
||||||
"private": true,
|
"private": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@testing-library/jest-dom": "^5.17.0",
|
"@testing-library/jest-dom": "^5.17.0",
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
|
<link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
<meta name="theme-color" content="#059669" />
|
<meta name="theme-color" content="#059669" />
|
||||||
<meta name="description" content="TurfTracker - Professional lawn care management and tracking application" />
|
<meta name="description" content="TurfTracking - Professional lawn care management and tracking application" />
|
||||||
<link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
|
<link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
|
||||||
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
|
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
|
||||||
|
|
||||||
@@ -17,9 +17,9 @@
|
|||||||
<!-- Progressive Web App meta tags -->
|
<!-- Progressive Web App meta tags -->
|
||||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||||
<meta name="apple-mobile-web-app-status-bar-style" content="default">
|
<meta name="apple-mobile-web-app-status-bar-style" content="default">
|
||||||
<meta name="apple-mobile-web-app-title" content="TurfTracker">
|
<meta name="apple-mobile-web-app-title" content="TurfTracking">
|
||||||
|
|
||||||
<title>TurfTracker - Lawn Care Management</title>
|
<title>TurfTracking - Lawn Care Management</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<noscript>You need to enable JavaScript to run this app.</noscript>
|
<noscript>You need to enable JavaScript to run this app.</noscript>
|
||||||
@@ -29,7 +29,7 @@
|
|||||||
<div id="loading-indicator" class="fixed inset-0 flex items-center justify-center bg-green-50 z-50">
|
<div id="loading-indicator" class="fixed inset-0 flex items-center justify-center bg-green-50 z-50">
|
||||||
<div class="text-center">
|
<div class="text-center">
|
||||||
<div class="animate-spin rounded-full h-12 w-12 border-b-2 border-green-600 mx-auto mb-4"></div>
|
<div class="animate-spin rounded-full h-12 w-12 border-b-2 border-green-600 mx-auto mb-4"></div>
|
||||||
<h2 class="text-xl font-semibold text-green-800">TurfTracker</h2>
|
<h2 class="text-xl font-semibold text-green-800">TurfTracking</h2>
|
||||||
<p class="text-green-600">Loading your lawn care dashboard...</p>
|
<p class="text-green-600">Loading your lawn care dashboard...</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ const AuthLayout = ({ children }) => {
|
|||||||
/>
|
/>
|
||||||
</svg>
|
</svg>
|
||||||
</div>
|
</div>
|
||||||
<h1 className="text-3xl font-bold text-gray-900 mb-2">TurfTracker</h1>
|
<h1 className="text-3xl font-bold text-gray-900 mb-2">TurfTracking</h1>
|
||||||
<p className="text-lg text-gray-600">Professional Lawn Care Management</p>
|
<p className="text-lg text-gray-600">Professional Lawn Care Management</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -145,7 +145,7 @@ const Layout = ({ children }) => {
|
|||||||
/>
|
/>
|
||||||
<div className="fixed inset-y-0 left-0 flex w-64 flex-col bg-white shadow-xl">
|
<div className="fixed inset-y-0 left-0 flex w-64 flex-col bg-white shadow-xl">
|
||||||
<div className="flex h-16 items-center justify-between px-6 border-b border-gray-200">
|
<div className="flex h-16 items-center justify-between px-6 border-b border-gray-200">
|
||||||
<h1 className="text-xl font-bold text-primary-600">TurfTracker</h1>
|
<h1 className="text-xl font-bold text-primary-600">TurfTracking</h1>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
className="text-gray-400 hover:text-gray-600"
|
className="text-gray-400 hover:text-gray-600"
|
||||||
@@ -244,7 +244,7 @@ const Layout = ({ children }) => {
|
|||||||
<div className="hidden lg:fixed lg:inset-y-0 lg:flex lg:w-64 lg:flex-col">
|
<div className="hidden lg:fixed lg:inset-y-0 lg:flex lg:w-64 lg:flex-col">
|
||||||
<div className="flex min-h-0 flex-1 flex-col bg-white border-r border-gray-200">
|
<div className="flex min-h-0 flex-1 flex-col bg-white border-r border-gray-200">
|
||||||
<div className="flex h-16 items-center px-6 border-b border-gray-200">
|
<div className="flex h-16 items-center px-6 border-b border-gray-200">
|
||||||
<h1 className="text-xl font-bold text-primary-600">TurfTracker</h1>
|
<h1 className="text-xl font-bold text-primary-600">TurfTracking</h1>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<nav className="flex-1 space-y-1 px-4 py-6">
|
<nav className="flex-1 space-y-1 px-4 py-6">
|
||||||
@@ -337,7 +337,7 @@ const Layout = ({ children }) => {
|
|||||||
<Bars3Icon className="h-6 w-6" />
|
<Bars3Icon className="h-6 w-6" />
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<h1 className="text-lg font-semibold text-gray-900">TurfTracker</h1>
|
<h1 className="text-lg font-semibold text-gray-900">TurfTracking</h1>
|
||||||
|
|
||||||
<div className="flex items-center space-x-4">
|
<div className="flex items-center space-x-4">
|
||||||
<button className="text-gray-400 hover:text-gray-500">
|
<button className="text-gray-400 hover:text-gray-500">
|
||||||
|
|||||||
Reference in New Issue
Block a user