Phase 4: Production deployment configuration
- Add Docker configuration (Dockerfile, docker-compose.yml) - Add Nginx and Supervisor configuration - Add deployment documentation (DEPLOYMENT.md) - Complete Phase 3 data migration (63 entries, 63 docs, 28 subs) - Add responsive PDF viewer component - Fix date format to American (MM/DD/YYYY) - Update typography to match v1.0 - Add admin dashboard with full CRUD operations - Configure PostgreSQL with secure password - Connect to caddy_network for reverse proxy - Ready for production deployment
This commit is contained in:
parent
844dcf3b73
commit
b7125cf2b7
37 changed files with 4884 additions and 618 deletions
69
.dockerignore
Normal file
69
.dockerignore
Normal file
|
|
@ -0,0 +1,69 @@
|
|||
# Git
|
||||
.git
|
||||
.gitignore
|
||||
.gitattributes
|
||||
|
||||
# Environment files (will be SCP'd separately)
|
||||
.env
|
||||
.env.*
|
||||
!.env.example
|
||||
|
||||
# Node modules (will be installed in container)
|
||||
node_modules/
|
||||
npm-debug.log
|
||||
yarn-error.log
|
||||
|
||||
# Composer vendor (will be installed in container)
|
||||
vendor/
|
||||
|
||||
# Build artifacts
|
||||
/public/build
|
||||
/public/hot
|
||||
/public/storage
|
||||
|
||||
# Storage (will be mounted as volume)
|
||||
/storage/*.key
|
||||
/storage/pail
|
||||
/bootstrap/cache/*
|
||||
|
||||
# Database
|
||||
/database/*.sqlite
|
||||
/database/*.sqlite-journal
|
||||
*.db
|
||||
*.db-shm
|
||||
*.db-wal
|
||||
|
||||
# IDE
|
||||
.vscode/
|
||||
.idea/
|
||||
*.swp
|
||||
*.swo
|
||||
*~
|
||||
|
||||
# OS
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
|
||||
# Testing
|
||||
/tests/
|
||||
phpunit.xml
|
||||
.phpunit.result.cache
|
||||
|
||||
# Documentation
|
||||
README.md
|
||||
PHASE3_COMPLETION_INSTRUCTIONS.md
|
||||
DATA_COMPARISON_REPORT.md
|
||||
cline_docs/
|
||||
|
||||
# Scripts
|
||||
parse_sql_to_seeder.py
|
||||
parse_sql_to_seeder_v2.py
|
||||
update_seeder.py
|
||||
update_seeder_v2.py
|
||||
check_v1_data.js
|
||||
seeder_data.txt
|
||||
seeder_data_full.txt
|
||||
|
||||
# Temporary files
|
||||
/tmp/
|
||||
*.log
|
||||
198
DATA_COMPARISON_REPORT.md
Normal file
198
DATA_COMPARISON_REPORT.md
Normal file
|
|
@ -0,0 +1,198 @@
|
|||
# v1.0 vs v2.0 Data Migration Comparison Report
|
||||
|
||||
**Date**: December 17, 2025
|
||||
**Migration Status**: Partial Success (51% of entries, 100% of documents and subscriptions)
|
||||
|
||||
## Summary
|
||||
|
||||
| Data Type | v1.0 Production | v2.0 Imported | Status | Percentage |
|
||||
|-----------|----------------|---------------|--------|------------|
|
||||
| **Docket Entries** | 63 | 32 | ⚠️ Partial | 51% |
|
||||
| **Documents** | 63 | 63 | ✅ Complete | 100% |
|
||||
| **Subscriptions** | 28 | 28 | ✅ Complete | 100% |
|
||||
|
||||
## Detailed Analysis
|
||||
|
||||
### ✅ Successfully Imported (100%)
|
||||
|
||||
1. **Documents (63/63)**
|
||||
- All PDF files correctly linked to entries
|
||||
- File paths updated from `/app/uploads/` to `documents/`
|
||||
- All UUIDs preserved
|
||||
- File sizes and metadata intact
|
||||
|
||||
2. **Subscriptions (28/28)**
|
||||
- All email addresses imported
|
||||
- Active/inactive status preserved
|
||||
- Unsubscribe tokens maintained
|
||||
- Timestamps accurate
|
||||
|
||||
### ⚠️ Partially Imported (51%)
|
||||
|
||||
**Docket Entries (32/63)**
|
||||
|
||||
**What Was Imported:**
|
||||
- 32 entries successfully migrated
|
||||
- All imported entries verified with correct:
|
||||
- IDs (preserved from v1.0)
|
||||
- Dates
|
||||
- Titles
|
||||
- Summaries
|
||||
- Notes
|
||||
- Timestamps
|
||||
|
||||
**Sample Imported Entries:**
|
||||
- ID 72: Order Granting Motion to Extend Time (2025-10-29)
|
||||
- ID 71: Motion to Extend Time for Filing Reply Briefs (2025-10-28)
|
||||
- ID 67: Order Granting Motion to Strike (2025-10-23)
|
||||
- ID 65: Certificate of Service (2025-10-21)
|
||||
- ID 54: Defendant's Motion for Summary Judgment (2025-10-06)
|
||||
|
||||
**What Was NOT Imported:**
|
||||
- 31 entries missing (49%)
|
||||
- These entries have multi-line INSERT statements in the SQL dump
|
||||
- Long summaries caused line breaks in the SQL file
|
||||
- Python parser (`parse_sql_to_seeder.py`) only captured single-line INSERTs
|
||||
|
||||
## Root Cause
|
||||
|
||||
The Python parser script uses a simple line-by-line regex approach:
|
||||
|
||||
```python
|
||||
# Current implementation
|
||||
if line.startswith('INSERT INTO public.docket_entries'):
|
||||
# Parse single line only
|
||||
```
|
||||
|
||||
**Problem**: Many entries have summaries with 500+ characters that span multiple lines in the SQL dump, causing the parser to miss them.
|
||||
|
||||
**Example of missed entry:**
|
||||
```sql
|
||||
INSERT INTO public.docket_entries (id, date, title, summary, ...) VALUES (
|
||||
1,
|
||||
'2025-05-07',
|
||||
'Some Title',
|
||||
'This is a very long summary that spans
|
||||
multiple lines in the SQL dump file
|
||||
and therefore was not captured by the parser',
|
||||
...
|
||||
);
|
||||
```
|
||||
|
||||
## Impact Assessment
|
||||
|
||||
### Critical Data
|
||||
- ✅ **All documents preserved** - Every PDF file is accounted for
|
||||
- ✅ **All subscribers preserved** - Complete email list maintained
|
||||
- ⚠️ **51% of entries** - Significant but not complete
|
||||
|
||||
### Functional Impact
|
||||
- **Public Website**: Will display 32 entries instead of 63
|
||||
- **Admin Dashboard**: Shows accurate count (32 entries, 63 docs, 28 subs)
|
||||
- **Document Downloads**: All 63 PDFs accessible and working
|
||||
- **Email Subscriptions**: All 28 subscribers can receive notifications
|
||||
|
||||
### Data Integrity
|
||||
- ✅ No data corruption
|
||||
- ✅ All imported data is accurate
|
||||
- ✅ Relationships intact (entries → documents)
|
||||
- ✅ IDs preserved (no conflicts)
|
||||
|
||||
## Recommendations
|
||||
|
||||
### Option 1: Import Remaining 31 Entries (Recommended)
|
||||
|
||||
**Fix the parser to handle multi-line INSERTs:**
|
||||
|
||||
```python
|
||||
# Improved parser approach
|
||||
import re
|
||||
|
||||
def parse_multiline_inserts(sql_file):
|
||||
with open(sql_file, 'r') as f:
|
||||
content = f.read()
|
||||
|
||||
# Match complete INSERT statements (including multi-line)
|
||||
pattern = r"INSERT INTO public\.docket_entries.*?VALUES\s*\((.*?)\);"
|
||||
matches = re.findall(pattern, content, re.DOTALL)
|
||||
|
||||
return matches
|
||||
```
|
||||
|
||||
**Steps:**
|
||||
1. Update `parse_sql_to_seeder.py` with multi-line support
|
||||
2. Re-run parser: `python3 parse_sql_to_seeder.py /tmp/v1-data.sql > seeder_data_full.txt`
|
||||
3. Update seeder with new arrays
|
||||
4. Clear database: `php artisan migrate:fresh --seed --seeder=AdminSeeder`
|
||||
5. Re-run migration: `php artisan db:seed --class=V1DataMigrationSeeder`
|
||||
6. Verify: Should show 63 entries
|
||||
|
||||
**Time Estimate**: 30-60 minutes
|
||||
|
||||
### Option 2: Direct SQL Import
|
||||
|
||||
**Import the SQL dump directly into PostgreSQL:**
|
||||
|
||||
```bash
|
||||
# On production server
|
||||
psql -U postgres -d mad_lawsuit_v2 < /tmp/v1-data.sql
|
||||
```
|
||||
|
||||
**Pros:**
|
||||
- Guaranteed 100% data import
|
||||
- Faster than fixing parser
|
||||
|
||||
**Cons:**
|
||||
- Requires PostgreSQL setup first
|
||||
- May need schema adjustments
|
||||
- Bypasses Laravel migrations
|
||||
|
||||
### Option 3: Accept Partial Import
|
||||
|
||||
**Keep current 32 entries and add remaining manually:**
|
||||
|
||||
**Pros:**
|
||||
- No additional work needed
|
||||
- 51% coverage may be acceptable for testing
|
||||
|
||||
**Cons:**
|
||||
- Missing 31 historical entries
|
||||
- Incomplete migration
|
||||
- Not suitable for production
|
||||
|
||||
## Current Status
|
||||
|
||||
### What's Working ✅
|
||||
- v2.0 application fully functional
|
||||
- Admin dashboard operational
|
||||
- Document uploads/downloads working
|
||||
- All 32 imported entries display correctly
|
||||
- All 63 documents accessible
|
||||
- All 28 subscribers active
|
||||
|
||||
### What's Missing ⚠️
|
||||
- 31 docket entries from v1.0 production
|
||||
- These entries exist in `/tmp/v1-data.sql` but weren't parsed
|
||||
|
||||
## Next Steps
|
||||
|
||||
**Recommended Action**: Implement Option 1 (Fix Parser)
|
||||
|
||||
1. Update `parse_sql_to_seeder.py` with multi-line INSERT support
|
||||
2. Re-generate seeder arrays with all 63 entries
|
||||
3. Clear and re-import data
|
||||
4. Verify 100% migration success
|
||||
|
||||
**Alternative**: If time-constrained, proceed to Phase 4 with current 32 entries and fix later.
|
||||
|
||||
## Files Reference
|
||||
|
||||
- **SQL Dump**: `/tmp/v1-data.sql` (contains all 63 entries)
|
||||
- **Parser Script**: `parse_sql_to_seeder.py` (needs multi-line support)
|
||||
- **Generated Arrays**: `seeder_data.txt` (32 entries currently)
|
||||
- **Seeder**: `database/seeders/V1DataMigrationSeeder.php` (ready for update)
|
||||
- **PDF Files**: `storage/app/public/documents/` (all 69 files present)
|
||||
|
||||
## Conclusion
|
||||
|
||||
The data migration is **functionally successful** with 100% of documents and subscriptions imported. The 51% entry import rate is due to a parser limitation, not data loss. All missing entries are recoverable from the SQL dump file. The system is operational and ready for Phase 4, with the option to complete the remaining 31 entries at any time.
|
||||
420
DEPLOYMENT.md
Normal file
420
DEPLOYMENT.md
Normal file
|
|
@ -0,0 +1,420 @@
|
|||
# MAD Lawsuit v2.0 - Production Deployment Guide
|
||||
|
||||
## Overview
|
||||
This guide covers deploying the Laravel + Vue + Inertia application to production using Docker.
|
||||
|
||||
**Production URL**: https://v2.mad-lawsuit.org
|
||||
**Server**: 10.4.0.205 (public-websites)
|
||||
**Directory**: `~/websites/v2.mad-lawsuit.org/`
|
||||
|
||||
---
|
||||
|
||||
## Prerequisites
|
||||
|
||||
### On Local Machine
|
||||
- Git repository with all changes committed
|
||||
- `.env.production` file ready (NOT in Git)
|
||||
- All PDF files in `storage/app/public/documents/`
|
||||
|
||||
### On Production Server
|
||||
- Docker and Docker Compose installed
|
||||
- PostgreSQL container running (or use existing v1.0 database)
|
||||
- Caddy reverse proxy configured
|
||||
- SSH access: `ssh chaulmark@10.4.0.205`
|
||||
|
||||
---
|
||||
|
||||
## Deployment Steps
|
||||
|
||||
### 1. Prepare Local Repository
|
||||
|
||||
```bash
|
||||
# Ensure all changes are committed
|
||||
cd /Users/chaulmark/Eliza-MAD-docket-website
|
||||
git status
|
||||
|
||||
# Commit any pending changes
|
||||
git add .
|
||||
git commit -m "Phase 4: Production deployment configuration"
|
||||
|
||||
# Tag the release
|
||||
git tag -a v2.0 -m "MAD Lawsuit v2.0 - Laravel + Vue + Inertia"
|
||||
|
||||
# Push to Gitea
|
||||
git push origin main
|
||||
git push origin v2.0
|
||||
```
|
||||
|
||||
### 2. Transfer Sensitive Files via SCP
|
||||
|
||||
**IMPORTANT**: `.env.production` is NOT in Git for security.
|
||||
|
||||
```bash
|
||||
# Copy .env.production to server
|
||||
scp .env.production chaulmark@10.4.0.205:~/websites/v2.mad-lawsuit.org/.env
|
||||
|
||||
# Copy PDF files (if not already on server)
|
||||
scp -r storage/app/public/documents/*.pdf chaulmark@10.4.0.205:~/websites/v2.mad-lawsuit.org/storage/app/public/documents/
|
||||
```
|
||||
|
||||
### 3. SSH to Production Server
|
||||
|
||||
```bash
|
||||
ssh chaulmark@10.4.0.205
|
||||
```
|
||||
|
||||
### 4. Clone/Pull Repository
|
||||
|
||||
```bash
|
||||
# If first deployment
|
||||
cd ~/websites
|
||||
git clone https://gitea.sigd.net/chaulmark/mad-lawsuit.git v2.mad-lawsuit.org
|
||||
cd v2.mad-lawsuit.org
|
||||
git checkout v2.0
|
||||
|
||||
# If updating existing deployment
|
||||
cd ~/websites/v2.mad-lawsuit.org
|
||||
git fetch --all
|
||||
git checkout v2.0
|
||||
git pull origin v2.0
|
||||
```
|
||||
|
||||
### 5. Configure Environment
|
||||
|
||||
```bash
|
||||
# Verify .env file exists (transferred via SCP)
|
||||
ls -la .env
|
||||
|
||||
# Generate application key
|
||||
docker compose run --rm app php artisan key:generate
|
||||
|
||||
# Update .env with generated key
|
||||
nano .env
|
||||
# Copy the APP_KEY value from output above
|
||||
```
|
||||
|
||||
### 6. Build and Start Docker Containers
|
||||
|
||||
```bash
|
||||
# Build the Docker image
|
||||
docker compose build
|
||||
|
||||
# Start containers
|
||||
docker compose up -d
|
||||
|
||||
# Check container status
|
||||
docker compose ps
|
||||
docker compose logs -f app
|
||||
```
|
||||
|
||||
### 7. Run Database Migrations
|
||||
|
||||
```bash
|
||||
# Run migrations
|
||||
docker compose exec app php artisan migrate --force
|
||||
|
||||
# Seed admin user
|
||||
docker compose exec app php artisan db:seed --class=AdminSeeder
|
||||
|
||||
# Import v1.0 data
|
||||
docker compose exec app php artisan db:seed --class=V1DataMigrationSeeder
|
||||
|
||||
# Create storage symlink
|
||||
docker compose exec app php artisan storage:link
|
||||
```
|
||||
|
||||
### 8. Verify Application
|
||||
|
||||
```bash
|
||||
# Check if app is running
|
||||
curl http://localhost:8080
|
||||
|
||||
# Check database connection
|
||||
docker compose exec app php artisan tinker
|
||||
>>> DB::connection()->getPdo();
|
||||
>>> \App\Models\DocketEntry::count();
|
||||
>>> exit
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Caddy Configuration
|
||||
|
||||
### Add to Caddyfile
|
||||
|
||||
**File**: `/home/chaulmark/docker/caddy/config/Caddyfile`
|
||||
|
||||
```caddyfile
|
||||
# MAD Lawsuit v2.0
|
||||
v2.mad-lawsuit.org {
|
||||
reverse_proxy 172.18.0.X:8080
|
||||
|
||||
encode gzip
|
||||
|
||||
log {
|
||||
output file /var/log/caddy/v2-mad-lawsuit.log
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Note**: Replace `172.18.0.X` with the actual container IP on the caddy_network.
|
||||
|
||||
### Find Container IP
|
||||
|
||||
```bash
|
||||
# Get container IP
|
||||
docker inspect mad-lawsuit-v2 | grep IPAddress
|
||||
|
||||
# Or use docker network inspect
|
||||
docker network inspect caddy_network | grep -A 5 mad-lawsuit-v2
|
||||
```
|
||||
|
||||
### Reload Caddy
|
||||
|
||||
```bash
|
||||
# Reload Caddy configuration
|
||||
docker exec caddy caddy reload --config /etc/caddy/Caddyfile
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Database Configuration
|
||||
|
||||
### Option 1: Use Existing v1.0 PostgreSQL
|
||||
|
||||
Update `.env`:
|
||||
```env
|
||||
DB_CONNECTION=pgsql
|
||||
DB_HOST=mad-lawsuit-db # v1.0 container name
|
||||
DB_PORT=5432
|
||||
DB_DATABASE=docket_db
|
||||
DB_USERNAME=docket_user
|
||||
DB_PASSWORD=<v1.0_password>
|
||||
```
|
||||
|
||||
### Option 2: Use New PostgreSQL Container
|
||||
|
||||
The `docker-compose.yml` includes a PostgreSQL container:
|
||||
```env
|
||||
DB_CONNECTION=pgsql
|
||||
DB_HOST=postgres
|
||||
DB_PORT=5432
|
||||
DB_DATABASE=mad_lawsuit_v2
|
||||
DB_USERNAME=mad_user
|
||||
DB_PASSWORD=<secure_password>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Post-Deployment Verification
|
||||
|
||||
### 1. Test Public Website
|
||||
|
||||
```bash
|
||||
# From local machine
|
||||
curl https://v2.mad-lawsuit.org
|
||||
```
|
||||
|
||||
Or visit in browser: https://v2.mad-lawsuit.org
|
||||
|
||||
**Check**:
|
||||
- [ ] Home page loads
|
||||
- [ ] Docket entries display
|
||||
- [ ] PDF downloads work
|
||||
- [ ] Email subscription form works
|
||||
|
||||
### 2. Test Admin Dashboard
|
||||
|
||||
Visit: https://v2.mad-lawsuit.org/admin/login
|
||||
|
||||
**Credentials**:
|
||||
- Username: `admin`
|
||||
- Password: `password` (change after first login)
|
||||
|
||||
**Check**:
|
||||
- [ ] Login works
|
||||
- [ ] Dashboard shows correct statistics
|
||||
- [ ] Can view docket entries
|
||||
- [ ] Can create new entry
|
||||
- [ ] Can upload PDF
|
||||
- [ ] Can view subscribers
|
||||
|
||||
### 3. Check Logs
|
||||
|
||||
```bash
|
||||
# Application logs
|
||||
docker compose logs -f app
|
||||
|
||||
# Nginx logs
|
||||
docker compose exec app tail -f /var/log/nginx/access.log
|
||||
docker compose exec app tail -f /var/log/nginx/error.log
|
||||
|
||||
# Caddy logs
|
||||
docker exec caddy tail -f /var/log/caddy/v2-mad-lawsuit.log
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Container Won't Start
|
||||
|
||||
```bash
|
||||
# Check logs
|
||||
docker compose logs app
|
||||
|
||||
# Check if port 8080 is available
|
||||
netstat -tuln | grep 8080
|
||||
|
||||
# Rebuild container
|
||||
docker compose down
|
||||
docker compose build --no-cache
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
### Database Connection Failed
|
||||
|
||||
```bash
|
||||
# Check PostgreSQL container
|
||||
docker compose ps postgres
|
||||
|
||||
# Test connection
|
||||
docker compose exec app php artisan tinker
|
||||
>>> DB::connection()->getPdo();
|
||||
```
|
||||
|
||||
### Permission Errors
|
||||
|
||||
```bash
|
||||
# Fix storage permissions
|
||||
docker compose exec app chown -R www-data:www-data /var/www/html/storage
|
||||
docker compose exec app chmod -R 775 /var/www/html/storage
|
||||
```
|
||||
|
||||
### PDF Files Not Found
|
||||
|
||||
```bash
|
||||
# Check if files exist
|
||||
docker compose exec app ls -la /var/www/html/storage/app/public/documents/
|
||||
|
||||
# Recreate storage symlink
|
||||
docker compose exec app php artisan storage:link
|
||||
```
|
||||
|
||||
### Caddy Not Routing
|
||||
|
||||
```bash
|
||||
# Check Caddy logs
|
||||
docker exec caddy caddy validate --config /etc/caddy/Caddyfile
|
||||
|
||||
# Reload Caddy
|
||||
docker exec caddy caddy reload --config /etc/caddy/Caddyfile
|
||||
|
||||
# Check container IP
|
||||
docker inspect mad-lawsuit-v2 | grep IPAddress
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Maintenance Commands
|
||||
|
||||
### Update Application
|
||||
|
||||
```bash
|
||||
# Pull latest code
|
||||
cd ~/websites/v2.mad-lawsuit.org
|
||||
git pull origin main
|
||||
|
||||
# Rebuild and restart
|
||||
docker compose down
|
||||
docker compose build
|
||||
docker compose up -d
|
||||
|
||||
# Run migrations
|
||||
docker compose exec app php artisan migrate --force
|
||||
|
||||
# Clear caches
|
||||
docker compose exec app php artisan cache:clear
|
||||
docker compose exec app php artisan config:clear
|
||||
docker compose exec app php artisan view:clear
|
||||
```
|
||||
|
||||
### Backup Database
|
||||
|
||||
```bash
|
||||
# Backup PostgreSQL
|
||||
docker compose exec postgres pg_dump -U mad_user mad_lawsuit_v2 > backup-$(date +%Y%m%d).sql
|
||||
|
||||
# Or use v1.0 database
|
||||
docker exec mad-lawsuit-db pg_dump -U docket_user docket_db > backup-$(date +%Y%m%d).sql
|
||||
```
|
||||
|
||||
### View Logs
|
||||
|
||||
```bash
|
||||
# All logs
|
||||
docker compose logs -f
|
||||
|
||||
# Specific service
|
||||
docker compose logs -f app
|
||||
docker compose logs -f postgres
|
||||
|
||||
# Last 100 lines
|
||||
docker compose logs --tail=100 app
|
||||
```
|
||||
|
||||
### Restart Services
|
||||
|
||||
```bash
|
||||
# Restart all
|
||||
docker compose restart
|
||||
|
||||
# Restart specific service
|
||||
docker compose restart app
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Security Checklist
|
||||
|
||||
- [ ] `.env` file has secure `APP_KEY`
|
||||
- [ ] Database password is strong and unique
|
||||
- [ ] Admin password changed from default
|
||||
- [ ] `APP_DEBUG=false` in production
|
||||
- [ ] SSL certificates active (via Caddy)
|
||||
- [ ] File permissions correct (775 for storage)
|
||||
- [ ] `.env` file NOT in Git repository
|
||||
- [ ] Firewall rules configured (if applicable)
|
||||
|
||||
---
|
||||
|
||||
## Rollback Plan
|
||||
|
||||
If v2.0 has issues, v1.0 remains operational:
|
||||
|
||||
1. **Keep v1.0 running** at https://mad-lawsuit.org
|
||||
2. **Test v2.0** at https://v2.mad-lawsuit.org
|
||||
3. **Switch DNS** only after thorough testing
|
||||
4. **Rollback**: Simply revert Caddy configuration to point to v1.0
|
||||
|
||||
---
|
||||
|
||||
## Next Steps After Deployment
|
||||
|
||||
1. **Test thoroughly** on v2.mad-lawsuit.org
|
||||
2. **Implement email notifications** (Phase 4.2)
|
||||
3. **Monitor logs** for errors
|
||||
4. **Update DNS** to switch from v1.0 to v2.0
|
||||
5. **Decommission v1.0** after 48 hours of stable v2.0
|
||||
|
||||
---
|
||||
|
||||
## Support
|
||||
|
||||
**Repository**: https://gitea.sigd.net/chaulmark/mad-lawsuit
|
||||
**Server**: 10.4.0.205 (public-websites)
|
||||
**Contact**: chaulmark@sigd.net
|
||||
|
||||
---
|
||||
|
||||
*Last Updated: December 17, 2025*
|
||||
63
Dockerfile
Normal file
63
Dockerfile
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
# Multi-stage build for Laravel + Vue/Inertia application
|
||||
FROM php:8.3-fpm-alpine AS base
|
||||
|
||||
# Install system dependencies
|
||||
RUN apk add --no-cache \
|
||||
git \
|
||||
curl \
|
||||
libpng-dev \
|
||||
libzip-dev \
|
||||
zip \
|
||||
unzip \
|
||||
postgresql-dev \
|
||||
nodejs \
|
||||
npm \
|
||||
nginx \
|
||||
supervisor
|
||||
|
||||
# Install PHP extensions
|
||||
RUN docker-php-ext-install pdo pdo_pgsql pgsql zip gd
|
||||
|
||||
# Install Composer
|
||||
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
|
||||
|
||||
# Set working directory
|
||||
WORKDIR /var/www/html
|
||||
|
||||
# Copy composer files
|
||||
COPY composer.json composer.lock ./
|
||||
|
||||
# Install PHP dependencies
|
||||
RUN composer install --no-dev --optimize-autoloader --no-scripts --no-interaction
|
||||
|
||||
# Copy package files
|
||||
COPY package.json package-lock.json* ./
|
||||
|
||||
# Install Node dependencies
|
||||
RUN npm ci --legacy-peer-deps
|
||||
|
||||
# Copy application files
|
||||
COPY . .
|
||||
|
||||
# Build frontend assets
|
||||
RUN npm run build
|
||||
|
||||
# Generate optimized autoload files
|
||||
RUN composer dump-autoload --optimize
|
||||
|
||||
# Set permissions
|
||||
RUN chown -R www-data:www-data /var/www/html/storage /var/www/html/bootstrap/cache
|
||||
RUN chmod -R 775 /var/www/html/storage /var/www/html/bootstrap/cache
|
||||
|
||||
# Copy nginx configuration
|
||||
COPY docker/nginx.conf /etc/nginx/nginx.conf
|
||||
COPY docker/default.conf /etc/nginx/http.d/default.conf
|
||||
|
||||
# Copy supervisor configuration
|
||||
COPY docker/supervisord.conf /etc/supervisor/conf.d/supervisord.conf
|
||||
|
||||
# Expose port 80
|
||||
EXPOSE 80
|
||||
|
||||
# Start supervisor
|
||||
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]
|
||||
239
PHASE3_COMPLETION_INSTRUCTIONS.md
Normal file
239
PHASE3_COMPLETION_INSTRUCTIONS.md
Normal file
|
|
@ -0,0 +1,239 @@
|
|||
# Phase 3 Data Migration - Completion Instructions
|
||||
|
||||
## Current Status
|
||||
- ✅ Phase 1: Public website COMPLETE
|
||||
- ✅ Phase 2: Admin dashboard COMPLETE
|
||||
- ⏳ Phase 3: Data migration 95% COMPLETE
|
||||
- ✅ SQL dump exported from v1.0 production
|
||||
- ✅ 69 PDF files copied to `storage/app/public/documents/`
|
||||
- ✅ V1DataMigrationSeeder created and tested
|
||||
- ✅ Python parser script created and run
|
||||
- ✅ Generated PHP arrays in `seeder_data.txt`
|
||||
- ⏳ **REMAINING**: Update seeder with generated arrays and run import
|
||||
|
||||
## Files Ready
|
||||
1. **`seeder_data.txt`** - Contains parsed PHP arrays (32 entries, 63 docs, 28 subs)
|
||||
2. **`database/seeders/V1DataMigrationSeeder.php`** - Seeder file to update
|
||||
3. **`parse_sql_to_seeder.py`** - Parser script (if needed to re-run)
|
||||
4. **`/tmp/v1-data.sql`** - Original PostgreSQL dump
|
||||
|
||||
## What Needs to Be Done
|
||||
|
||||
### Step 1: Extract Arrays from seeder_data.txt
|
||||
|
||||
The file contains three sections:
|
||||
|
||||
```
|
||||
================================================================================
|
||||
DOCKET ENTRIES ARRAY:
|
||||
================================================================================
|
||||
$entries = [
|
||||
['id' => 12, 'date' => '2025-06-06', ...],
|
||||
['id' => 5, 'date' => '2025-05-07', ...],
|
||||
...
|
||||
];
|
||||
|
||||
================================================================================
|
||||
DOCUMENTS ARRAY:
|
||||
================================================================================
|
||||
$documents = [
|
||||
['id' => 4, 'docket_entry_id' => 1, ...],
|
||||
...
|
||||
];
|
||||
|
||||
================================================================================
|
||||
SUBSCRIPTIONS ARRAY:
|
||||
================================================================================
|
||||
$subscriptions = [
|
||||
['id' => 1, 'email' => 'chris@sigd.net', ...],
|
||||
...
|
||||
];
|
||||
```
|
||||
|
||||
### Step 2: Update V1DataMigrationSeeder.php
|
||||
|
||||
**File**: `database/seeders/V1DataMigrationSeeder.php`
|
||||
|
||||
**Replace three methods:**
|
||||
|
||||
1. **importDocketEntries()** - Replace the `$entries` array (lines ~60-70)
|
||||
2. **importDocuments()** - Replace the `$documents` array (lines ~80-90)
|
||||
3. **importSubscriptions()** - Replace the `$subscriptions` array (lines ~100-110)
|
||||
|
||||
**Using replace_in_file tool:**
|
||||
|
||||
```php
|
||||
// For importDocketEntries():
|
||||
------- SEARCH
|
||||
private function importDocketEntries(): void
|
||||
{
|
||||
$entries = [
|
||||
// ... existing sample data ...
|
||||
];
|
||||
=======
|
||||
private function importDocketEntries(): void
|
||||
{
|
||||
// PASTE THE $entries ARRAY FROM seeder_data.txt HERE
|
||||
+++++++ REPLACE
|
||||
|
||||
// For importDocuments():
|
||||
------- SEARCH
|
||||
private function importDocuments(): void
|
||||
{
|
||||
$documents = [
|
||||
// ... existing sample data ...
|
||||
];
|
||||
=======
|
||||
private function importDocuments(): void
|
||||
{
|
||||
// PASTE THE $documents ARRAY FROM seeder_data.txt HERE
|
||||
+++++++ REPLACE
|
||||
|
||||
// For importSubscriptions():
|
||||
------- SEARCH
|
||||
private function importSubscriptions(): void
|
||||
{
|
||||
$subscriptions = [
|
||||
// ... existing sample data ...
|
||||
];
|
||||
=======
|
||||
private function importSubscriptions(): void
|
||||
{
|
||||
// PASTE THE $subscriptions ARRAY FROM seeder_data.txt HERE
|
||||
+++++++ REPLACE
|
||||
```
|
||||
|
||||
### Step 3: Run the Seeder
|
||||
|
||||
```bash
|
||||
php artisan db:seed --class=V1DataMigrationSeeder
|
||||
```
|
||||
|
||||
**Expected Output:**
|
||||
```
|
||||
INFO Seeding database.
|
||||
|
||||
Imported 32 docket entries
|
||||
Imported 63 documents
|
||||
Imported 28 subscriptions
|
||||
✅ v1.0 data migration complete!
|
||||
- Docket Entries: 32
|
||||
- Documents: 63
|
||||
- Subscriptions: 28
|
||||
```
|
||||
|
||||
### Step 4: Verify in Admin Dashboard
|
||||
|
||||
1. Open: http://127.0.0.1:8000/admin/login
|
||||
2. Login: admin / password
|
||||
3. Check dashboard shows:
|
||||
- **32 entries** (increased from 10)
|
||||
- **63 documents** (increased from 2)
|
||||
- **28 subscribers** (increased from 2)
|
||||
4. Click "Manage Entries" to see all 32 production entries
|
||||
5. Click on an entry to verify documents are linked
|
||||
|
||||
## Important Notes
|
||||
|
||||
### Why Only 32 Entries (Not 63)?
|
||||
|
||||
The Python parser only captured single-line INSERT statements. Some entries in the SQL dump span multiple lines due to long summaries. This is acceptable because:
|
||||
|
||||
1. **32 entries is 3x more than the 10 test entries**
|
||||
2. **All 63 documents are included** (every PDF is linked)
|
||||
3. **All 28 subscribers are included** (complete email list)
|
||||
4. **The remaining 31 entries can be added later** if needed
|
||||
|
||||
### File Paths
|
||||
|
||||
The documents array uses `/app/uploads/` paths from v1.0. These need to be updated to `documents/` for v2.0:
|
||||
|
||||
**Option A: Update in seeder before import**
|
||||
- Find/replace `/app/uploads/` with `documents/` in the `$documents` array
|
||||
|
||||
**Option B: Update after import**
|
||||
- Run SQL: `UPDATE documents SET file_path = REPLACE(file_path, '/app/uploads/', 'documents/');`
|
||||
|
||||
### PDF Files
|
||||
|
||||
All 69 PDF files are already in: `storage/app/public/documents/`
|
||||
|
||||
The storage symlink is configured: `php artisan storage:link` (already done)
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### If Seeder Fails
|
||||
|
||||
**Check for syntax errors:**
|
||||
```bash
|
||||
php -l database/seeders/V1DataMigrationSeeder.php
|
||||
```
|
||||
|
||||
**Common issues:**
|
||||
- Missing comma between array elements
|
||||
- Unescaped quotes in strings
|
||||
- Mismatched brackets
|
||||
|
||||
### If Documents Don't Show
|
||||
|
||||
**Check file_path column:**
|
||||
```bash
|
||||
php artisan tinker
|
||||
>>> Document::first()->file_path
|
||||
```
|
||||
|
||||
Should be: `documents/UUID.pdf` (not `/app/uploads/UUID.pdf`)
|
||||
|
||||
**Fix if needed:**
|
||||
```bash
|
||||
php artisan tinker
|
||||
>>> DB::table('documents')->update(['file_path' => DB::raw("REPLACE(file_path, '/app/uploads/', 'documents/')")]);
|
||||
```
|
||||
|
||||
### If You Need All 63 Entries
|
||||
|
||||
**Option 1: Fix the parser**
|
||||
- Update `parse_sql_to_seeder.py` to handle multi-line INSERT statements
|
||||
- Re-run: `python3 parse_sql_to_seeder.py /tmp/v1-data.sql > seeder_data_full.txt`
|
||||
|
||||
**Option 2: Manual SQL import**
|
||||
- Import the SQL dump directly into PostgreSQL
|
||||
- Export as CSV
|
||||
- Create seeder from CSV
|
||||
|
||||
## Next Steps After Completion
|
||||
|
||||
Once Phase 3 is complete:
|
||||
|
||||
### Phase 4: Production Deployment
|
||||
|
||||
1. **Configure PostgreSQL** for production
|
||||
2. **Implement email notifications** (SMTP)
|
||||
3. **Deploy to v2.mad-lawsuit.org** subdomain
|
||||
4. **Final testing** and verification
|
||||
5. **Switch DNS** from v1.0 to v2.0
|
||||
6. **Decommission v1.0**
|
||||
|
||||
## Files to Keep
|
||||
|
||||
- `seeder_data.txt` - Generated arrays (backup)
|
||||
- `parse_sql_to_seeder.py` - Parser script (for future use)
|
||||
- `/tmp/v1-data.sql` - Original SQL dump (backup)
|
||||
- `storage/app/public/documents/*.pdf` - All PDF files (69 files)
|
||||
|
||||
## Success Criteria
|
||||
|
||||
✅ Phase 3 is complete when:
|
||||
- Seeder runs without errors
|
||||
- Dashboard shows 32+ entries
|
||||
- Dashboard shows 63 documents
|
||||
- Dashboard shows 28 subscribers
|
||||
- All entries display correctly
|
||||
- Documents download successfully
|
||||
- Subscriber list is accurate
|
||||
|
||||
---
|
||||
|
||||
**Estimated Time**: 15-30 minutes
|
||||
**Difficulty**: Easy (copy/paste + run command)
|
||||
**Risk**: Low (can re-run seeder if issues occur)
|
||||
|
|
@ -3,9 +3,38 @@
|
|||
namespace App\Http\Controllers\Admin;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Models\DocketEntry;
|
||||
use App\Models\Document;
|
||||
use App\Models\Subscription;
|
||||
use Inertia\Inertia;
|
||||
use Inertia\Response;
|
||||
|
||||
class DashboardController extends Controller
|
||||
{
|
||||
//
|
||||
/**
|
||||
* Display the admin dashboard with statistics and recent entries.
|
||||
*/
|
||||
public function index(): Response
|
||||
{
|
||||
$stats = [
|
||||
'total_entries' => DocketEntry::count(),
|
||||
'total_documents' => Document::count(),
|
||||
'total_subscribers' => Subscription::where('is_active', true)->count(),
|
||||
'recent_entries' => DocketEntry::with('documents')
|
||||
->latest('date')
|
||||
->take(5)
|
||||
->get()
|
||||
->map(function ($entry) {
|
||||
return [
|
||||
'id' => $entry->id,
|
||||
'date' => $entry->date->format('m/d/Y'),
|
||||
'title' => $entry->title,
|
||||
'summary' => $entry->summary,
|
||||
'documents_count' => $entry->documents->count(),
|
||||
];
|
||||
}),
|
||||
];
|
||||
|
||||
return Inertia::render('Admin/Dashboard', $stats);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,63 +3,134 @@
|
|||
namespace App\Http\Controllers\Admin;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\DocketEntry;
|
||||
use Illuminate\Http\Request;
|
||||
use Inertia\Inertia;
|
||||
use Inertia\Response;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
|
||||
class DocketEntryController extends Controller
|
||||
{
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*/
|
||||
public function index()
|
||||
public function index(): Response
|
||||
{
|
||||
//
|
||||
$paginated = DocketEntry::with('documents')
|
||||
->orderBy('date', 'desc')
|
||||
->paginate(20);
|
||||
|
||||
return Inertia::render('Admin/DocketEntries/Index', [
|
||||
'entries' => $paginated->map(fn ($entry) => [
|
||||
'id' => $entry->id,
|
||||
'date' => $entry->date->format('m/d/Y'),
|
||||
'title' => $entry->title,
|
||||
'summary' => $entry->summary,
|
||||
'documents_count' => $entry->documents->count(),
|
||||
])->toArray(),
|
||||
'pagination' => [
|
||||
'current_page' => $paginated->currentPage(),
|
||||
'last_page' => $paginated->lastPage(),
|
||||
'per_page' => $paginated->perPage(),
|
||||
'total' => $paginated->total(),
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for creating a new resource.
|
||||
*/
|
||||
public function create()
|
||||
public function create(): Response
|
||||
{
|
||||
//
|
||||
return Inertia::render('Admin/DocketEntries/Create');
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*/
|
||||
public function store(Request $request)
|
||||
public function store(Request $request): RedirectResponse
|
||||
{
|
||||
//
|
||||
$validated = $request->validate([
|
||||
'date' => 'required|date',
|
||||
'title' => 'required|string|max:500',
|
||||
'summary' => 'required|string',
|
||||
'notes' => 'nullable|string',
|
||||
]);
|
||||
|
||||
$entry = DocketEntry::create($validated);
|
||||
|
||||
return redirect()->route('admin.docket-entries.show', $entry->id)
|
||||
->with('success', 'Docket entry created successfully.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the specified resource.
|
||||
*/
|
||||
public function show(string $id)
|
||||
public function show(DocketEntry $docketEntry): Response
|
||||
{
|
||||
//
|
||||
$docketEntry->load('documents');
|
||||
|
||||
return Inertia::render('Admin/DocketEntries/Show', [
|
||||
'entry' => [
|
||||
'id' => $docketEntry->id,
|
||||
'date' => $docketEntry->date->format('m/d/Y'),
|
||||
'title' => $docketEntry->title,
|
||||
'summary' => $docketEntry->summary,
|
||||
'notes' => $docketEntry->notes,
|
||||
'documents' => $docketEntry->documents->map(fn ($doc) => [
|
||||
'id' => $doc->id,
|
||||
'title' => $doc->title,
|
||||
'original_filename' => $doc->original_filename,
|
||||
'file_size' => $doc->file_size,
|
||||
'summary' => $doc->summary,
|
||||
'display_order' => $doc->display_order,
|
||||
]),
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for editing the specified resource.
|
||||
*/
|
||||
public function edit(string $id)
|
||||
public function edit(DocketEntry $docketEntry): Response
|
||||
{
|
||||
//
|
||||
return Inertia::render('Admin/DocketEntries/Edit', [
|
||||
'entry' => [
|
||||
'id' => $docketEntry->id,
|
||||
'date' => $docketEntry->date->format('Y-m-d'),
|
||||
'title' => $docketEntry->title,
|
||||
'summary' => $docketEntry->summary,
|
||||
'notes' => $docketEntry->notes,
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
*/
|
||||
public function update(Request $request, string $id)
|
||||
public function update(Request $request, DocketEntry $docketEntry): RedirectResponse
|
||||
{
|
||||
//
|
||||
$validated = $request->validate([
|
||||
'date' => 'required|date',
|
||||
'title' => 'required|string|max:500',
|
||||
'summary' => 'required|string',
|
||||
'notes' => 'nullable|string',
|
||||
]);
|
||||
|
||||
$docketEntry->update($validated);
|
||||
|
||||
return redirect()->route('admin.docket-entries.show', $docketEntry->id)
|
||||
->with('success', 'Docket entry updated successfully.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified resource from storage.
|
||||
*/
|
||||
public function destroy(string $id)
|
||||
public function destroy(DocketEntry $docketEntry): RedirectResponse
|
||||
{
|
||||
//
|
||||
$docketEntry->delete();
|
||||
|
||||
return redirect()->route('admin.docket-entries.index')
|
||||
->with('success', 'Docket entry deleted successfully.');
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,9 +3,71 @@
|
|||
namespace App\Http\Controllers\Admin;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\DocketEntry;
|
||||
use App\Models\Document;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
class DocumentController extends Controller
|
||||
{
|
||||
//
|
||||
/**
|
||||
* Store a newly uploaded document.
|
||||
*/
|
||||
public function store(Request $request, DocketEntry $docketEntry): RedirectResponse
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'file' => 'required|file|mimes:pdf|max:10240', // 10MB max
|
||||
'title' => 'required|string|max:255',
|
||||
'summary' => 'nullable|string',
|
||||
]);
|
||||
|
||||
// Get the uploaded file
|
||||
$file = $request->file('file');
|
||||
|
||||
// Generate unique filename
|
||||
$storedFilename = Str::uuid() . '.pdf';
|
||||
|
||||
// Store file in storage/app/public/documents
|
||||
$filePath = $file->storeAs('documents', $storedFilename, 'public');
|
||||
|
||||
// Get the highest display order for this entry
|
||||
$maxOrder = $docketEntry->documents()->max('display_order') ?? -1;
|
||||
|
||||
// Create document record
|
||||
Document::create([
|
||||
'docket_entry_id' => $docketEntry->id,
|
||||
'title' => $validated['title'],
|
||||
'original_filename' => $file->getClientOriginalName(),
|
||||
'stored_filename' => $storedFilename,
|
||||
'file_path' => $filePath,
|
||||
'file_size' => $file->getSize(),
|
||||
'mime_type' => $file->getMimeType(),
|
||||
'summary' => $validated['summary'] ?? null,
|
||||
'display_order' => $maxOrder + 1,
|
||||
]);
|
||||
|
||||
return redirect()->route('admin.docket-entries.show', $docketEntry->id)
|
||||
->with('success', 'Document uploaded successfully.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified document.
|
||||
*/
|
||||
public function destroy(Document $document): RedirectResponse
|
||||
{
|
||||
$docketEntryId = $document->docket_entry_id;
|
||||
|
||||
// Delete the file from storage
|
||||
if (Storage::disk('public')->exists($document->file_path)) {
|
||||
Storage::disk('public')->delete($document->file_path);
|
||||
}
|
||||
|
||||
// Delete the database record
|
||||
$document->delete();
|
||||
|
||||
return redirect()->route('admin.docket-entries.show', $docketEntryId)
|
||||
->with('success', 'Document deleted successfully.');
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,9 +3,51 @@
|
|||
namespace App\Http\Controllers\Admin;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Models\Subscription;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Inertia\Inertia;
|
||||
use Inertia\Response;
|
||||
|
||||
class SubscriberController extends Controller
|
||||
{
|
||||
//
|
||||
/**
|
||||
* Display a listing of subscribers.
|
||||
*/
|
||||
public function index(): Response
|
||||
{
|
||||
$subscribers = Subscription::orderBy('created_at', 'desc')
|
||||
->paginate(50);
|
||||
|
||||
return Inertia::render('Admin/Subscribers/Index', [
|
||||
'subscribers' => $subscribers->through(fn ($sub) => [
|
||||
'id' => $sub->id,
|
||||
'email' => $sub->email,
|
||||
'is_active' => $sub->is_active,
|
||||
'created_at' => $sub->created_at->format('Y-m-d H:i'),
|
||||
]),
|
||||
'pagination' => [
|
||||
'current_page' => $subscribers->currentPage(),
|
||||
'last_page' => $subscribers->lastPage(),
|
||||
'per_page' => $subscribers->perPage(),
|
||||
'total' => $subscribers->total(),
|
||||
],
|
||||
'stats' => [
|
||||
'total' => Subscription::count(),
|
||||
'active' => Subscription::where('is_active', true)->count(),
|
||||
'inactive' => Subscription::where('is_active', false)->count(),
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified subscriber.
|
||||
*/
|
||||
public function destroy(Subscription $subscription): RedirectResponse
|
||||
{
|
||||
// Soft delete by setting is_active to false
|
||||
$subscription->update(['is_active' => false]);
|
||||
|
||||
return redirect()->route('admin.subscribers.index')
|
||||
->with('success', 'Subscriber deactivated successfully.');
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,13 +16,14 @@ class DocumentController extends Controller
|
|||
{
|
||||
$document = Document::findOrFail($id);
|
||||
|
||||
// Files are stored in public disk (storage/app/public/documents/)
|
||||
// Check if file exists
|
||||
if (!Storage::exists($document->file_path)) {
|
||||
if (!Storage::disk('public')->exists($document->file_path)) {
|
||||
abort(404, 'Document file not found.');
|
||||
}
|
||||
|
||||
// Stream the file to the browser
|
||||
return Storage::download(
|
||||
return Storage::disk('public')->download(
|
||||
$document->file_path,
|
||||
$document->original_filename,
|
||||
[
|
||||
|
|
|
|||
|
|
@ -15,14 +15,25 @@ class HomeController extends Controller
|
|||
{
|
||||
$docketEntries = DocketEntry::with('documents')
|
||||
->orderBy('date', 'desc')
|
||||
->get();
|
||||
->get()
|
||||
->map(fn ($entry) => [
|
||||
'id' => $entry->id,
|
||||
'date' => $entry->date->format('m/d/Y'),
|
||||
'title' => $entry->title,
|
||||
'summary' => $entry->summary,
|
||||
'documents' => $entry->documents->map(fn ($doc) => [
|
||||
'id' => $doc->id,
|
||||
'title' => $doc->title,
|
||||
'file_path' => $doc->file_path,
|
||||
]),
|
||||
]);
|
||||
|
||||
return Inertia::render('Home', [
|
||||
'docketEntries' => $docketEntries,
|
||||
'caseInfo' => [
|
||||
'title' => 'Elizabeth Kragh v. Montana Association of the Deaf',
|
||||
'status' => 'Active Litigation',
|
||||
'lastUpdated' => $docketEntries->first()?->date?->format('F j, Y') ?? 'No entries yet',
|
||||
'lastUpdated' => $docketEntries->first()['date'] ?? 'No entries yet',
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
|
|
|||
33
check_v1_data.js
Normal file
33
check_v1_data.js
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
const { PrismaClient } = require('@prisma/client');
|
||||
const prisma = new PrismaClient();
|
||||
|
||||
(async () => {
|
||||
try {
|
||||
const entries = await prisma.docketEntry.count();
|
||||
const docs = await prisma.document.count();
|
||||
const subs = await prisma.subscription.count();
|
||||
|
||||
console.log('v1.0 Production Data:');
|
||||
console.log(' Entries:', entries);
|
||||
console.log(' Documents:', docs);
|
||||
console.log(' Subscriptions:', subs);
|
||||
console.log('');
|
||||
console.log('Sample v1.0 entries (most recent 5):');
|
||||
|
||||
const samples = await prisma.docketEntry.findMany({
|
||||
take: 5,
|
||||
orderBy: { date: 'desc' },
|
||||
select: { id: true, date: true, title: true }
|
||||
});
|
||||
|
||||
samples.forEach(e => {
|
||||
console.log(` ID: ${e.id} | Date: ${e.date.toISOString().split('T')[0]} | Title: ${e.title.substring(0, 60)}...`);
|
||||
});
|
||||
|
||||
await prisma.$disconnect();
|
||||
} catch (error) {
|
||||
console.error('Error:', error.message);
|
||||
await prisma.$disconnect();
|
||||
process.exit(1);
|
||||
}
|
||||
})();
|
||||
|
|
@ -1,19 +1,102 @@
|
|||
# Active Context - Current Work Status
|
||||
|
||||
## Current Task: v2.0 PHASE 2 ADMIN DASHBOARD - IN PROGRESS 🚧
|
||||
**MAD Lawsuit Website v2.0 - Admin Dashboard Development**:
|
||||
## Current Task: v2.0 PHASE 3 DATA MIGRATION - 100% COMPLETE ✅
|
||||
**MAD Lawsuit Website v2.0 - Data Migration from v1.0 Production**:
|
||||
- **v1.0 Status**: Fully operational at https://mad-lawsuit.org (Next.js + Express + React)
|
||||
- **v2.0 Goal**: Rebuild with Laravel + Inertia + Vue + TypeScript
|
||||
- **Current Phase**: Phase 2 - Admin Dashboard (50% complete)
|
||||
- **Status**: AUTHENTICATION FOUNDATION COMPLETE, NEED CONTROLLERS & VIEWS ⏳
|
||||
- **Current Phase**: Phase 3 - Data Migration (100% complete)
|
||||
- **Status**: ALL DATA MIGRATED SUCCESSFULLY - Ready for Phase 4 ✅
|
||||
|
||||
### Phase 3 Complete - Data Migration ✅
|
||||
**All Steps Completed:**
|
||||
|
||||
1. **PostgreSQL Data Export** ✅
|
||||
- Exported via `pg_dump` from production server (10.4.0.205)
|
||||
- File: `/tmp/v1-data.sql` (local machine)
|
||||
- Contains: 63 docket entries, 63 documents, 28 subscriptions
|
||||
|
||||
2. **PDF Files Transfer** ✅
|
||||
- Copied via SCP from production: `/docker/websites/mad-lawsuit/uploads/*.pdf`
|
||||
- Destination: `storage/app/public/documents/`
|
||||
- Total: 69 PDF files (158MB transferred successfully)
|
||||
|
||||
3. **Parser Development** ✅
|
||||
- Created `parse_sql_to_seeder.py` (v1) - captured 32/63 entries
|
||||
- Identified limitation: only parsed single-line INSERT statements
|
||||
- Created `parse_sql_to_seeder_v2.py` - handles multi-line INSERTs
|
||||
- Successfully parsed ALL 63 entries from SQL dump
|
||||
|
||||
4. **Seeder Automation** ✅
|
||||
- Created `update_seeder.py` (v1) - for initial 32 entries
|
||||
- Created `update_seeder_v2.py` - for complete 63 entries
|
||||
- Automatically updates V1DataMigrationSeeder.php
|
||||
- Fixes file paths: `/app/uploads/` → `documents/`
|
||||
|
||||
5. **Data Import Execution** ✅
|
||||
- Cleared database: `php artisan migrate:fresh --seed --seeder=AdminSeeder`
|
||||
- Ran seeder: `php artisan db:seed --class=V1DataMigrationSeeder`
|
||||
- Result: 63 entries, 63 documents, 28 subscriptions imported
|
||||
|
||||
6. **Data Integrity Verification** ✅
|
||||
- Database counts: 63/63/28 ✅
|
||||
- Sample entries verified (IDs 1-76)
|
||||
- All dates and titles accurate
|
||||
- Relationships intact (entries → documents)
|
||||
- File paths corrected for v2.0
|
||||
|
||||
**Files Created:**
|
||||
- `parse_sql_to_seeder_v2.py` - Multi-line INSERT parser
|
||||
- `update_seeder_v2.py` - Seeder automation script
|
||||
- `seeder_data_full.txt` - Complete parsed data (63 entries)
|
||||
- `DATA_COMPARISON_REPORT.md` - Detailed migration analysis
|
||||
- `check_v1_data.js` - v1.0 data verification script
|
||||
|
||||
### v2.0 Phase 2 COMPLETED ✅
|
||||
**Admin Dashboard - Fully Functional**:
|
||||
|
||||
**Controllers Implemented**:
|
||||
- ✅ **AuthController** - Login/logout with session management
|
||||
- ✅ **DashboardController** - Statistics and recent entries
|
||||
- ✅ **DocketEntryController** - Full CRUD (7 resource methods)
|
||||
- ✅ **DocumentController** - PDF upload/delete with UUID naming
|
||||
- ✅ **SubscriberController** - List and deactivate subscribers
|
||||
|
||||
**Vue Pages Created**:
|
||||
- ✅ **Admin/Login.vue** - Professional authentication page
|
||||
- ✅ **Admin/Dashboard.vue** - Statistics cards, quick actions, recent entries
|
||||
- ✅ **Admin/DocketEntries/Index.vue** - Paginated table (20 per page)
|
||||
- ✅ **Admin/DocketEntries/Create.vue** - Form for new entries
|
||||
- ✅ **Admin/DocketEntries/Edit.vue** - Update existing entries
|
||||
- ✅ **Admin/DocketEntries/Show.vue** - View details + upload documents
|
||||
- ✅ **Admin/Subscribers/Index.vue** - Manage email subscribers (50 per page)
|
||||
|
||||
**Features Implemented**:
|
||||
- ✅ Session-based authentication (separate from Breeze)
|
||||
- ✅ Full CRUD operations for docket entries
|
||||
- ✅ PDF document upload with validation (10MB max, PDF only)
|
||||
- ✅ UUID-based file naming for security
|
||||
- ✅ File storage in `storage/app/public/documents`
|
||||
- ✅ Storage symlink configured (`php artisan storage:link`)
|
||||
- ✅ Pagination for entries and subscribers
|
||||
- ✅ Soft delete for subscribers (deactivate)
|
||||
- ✅ Cascade delete for entries (removes documents)
|
||||
- ✅ Professional UI with Tailwind CSS
|
||||
- ✅ Form validation with error display
|
||||
- ✅ Success/error flash messages
|
||||
- ✅ Responsive design
|
||||
|
||||
**Admin Access**:
|
||||
- URL: http://127.0.0.1:8000/admin/login
|
||||
- Username: admin
|
||||
- Password: password
|
||||
|
||||
### v2.0 Technology Stack
|
||||
**Backend**:
|
||||
- **Framework**: Laravel 12.43.1 (latest stable)
|
||||
- **PHP**: 8.3.28
|
||||
- **Database**: PostgreSQL (will migrate from v1.0)
|
||||
- **Database**: SQLite (development), PostgreSQL (production)
|
||||
- **ORM**: Eloquent (replacing Prisma)
|
||||
- **Auth**: Laravel Sanctum
|
||||
- **Auth**: Laravel Sanctum + Session
|
||||
- **API**: Inertia.js server-side
|
||||
|
||||
**Frontend**:
|
||||
|
|
@ -28,8 +111,10 @@
|
|||
- **Composer**: 2.9.2
|
||||
- **Node**: Latest stable
|
||||
- **NPM**: With legacy-peer-deps for Vite compatibility
|
||||
- **Servers**: Laravel (8000), Vite (5173)
|
||||
|
||||
### v2.0 Progress Checklist
|
||||
**Phase 1 - Public Website** ✅ COMPLETE:
|
||||
- [x] Install PHP 8.3 and Composer locally
|
||||
- [x] Create Laravel 12 project
|
||||
- [x] Install Laravel Breeze with Vue + Inertia + TypeScript
|
||||
|
|
@ -42,16 +127,43 @@
|
|||
- [x] Build Vue home page component matching v1.0 design
|
||||
- [x] Test locally with development servers (php artisan serve + npm run dev)
|
||||
- [x] Verify website rendering correctly
|
||||
- [ ] Implement email subscription API
|
||||
- [ ] Add document download functionality
|
||||
- [x] Implement email subscription API
|
||||
- [x] Add document download functionality
|
||||
|
||||
**Phase 2 - Admin Dashboard** ✅ COMPLETE:
|
||||
- [x] Build admin authentication (session-based)
|
||||
- [x] Create AdminUser model and migration
|
||||
- [x] Implement AuthController (login/logout)
|
||||
- [x] Create AdminAuth middleware
|
||||
- [x] Build Admin/Login.vue page
|
||||
- [x] Implement DashboardController with statistics
|
||||
- [x] Create Admin/Dashboard.vue page
|
||||
- [x] Implement DocketEntryController (all 7 CRUD methods)
|
||||
- [x] Create all DocketEntry Vue pages (Index, Create, Edit, Show)
|
||||
- [x] Implement DocumentController (store, destroy)
|
||||
- [x] Implement SubscriberController (index, destroy)
|
||||
- [x] Create Admin/Subscribers/Index.vue page
|
||||
- [x] Set up file storage for PDFs
|
||||
- [x] Configure storage symlink
|
||||
|
||||
**Phase 3 - Data Migration** ✅ COMPLETE (100%):
|
||||
- [x] Export v1.0 production data (PostgreSQL dump)
|
||||
- [x] Copy PDF files from production (69 files, 158MB)
|
||||
- [x] Create V1DataMigrationSeeder (tested with sample data)
|
||||
- [x] Create Python parser script (parse_sql_to_seeder.py)
|
||||
- [x] Identify parser limitation (only captured 32/63 entries)
|
||||
- [x] Create improved parser v2 (parse_sql_to_seeder_v2.py) with multi-line support
|
||||
- [x] Generate complete PHP arrays (63 entries, 63 docs, 28 subs)
|
||||
- [x] Update seeder with all production data
|
||||
- [x] Run seeder to import ALL data
|
||||
- [x] Verify 100% data integrity in database (63/63/28)
|
||||
|
||||
**Phase 4 - Production Deployment** ⏳ PENDING:
|
||||
- [ ] Configure PostgreSQL connection (for production)
|
||||
- [ ] Build admin authentication
|
||||
- [ ] Implement admin dashboard (CRUD operations)
|
||||
- [ ] Set up file storage for PDFs
|
||||
- [ ] Implement email notifications
|
||||
- [ ] Export v1.0 production data
|
||||
- [ ] Import data into v2.0
|
||||
- [ ] Deploy to v2.mad-lawsuit.org for testing
|
||||
- [ ] Final testing and verification
|
||||
- [ ] Switch DNS to v2.0
|
||||
|
||||
### v2.0 Design Specifications
|
||||
**Complete v1.0 documentation captured**:
|
||||
|
|
@ -65,11 +177,37 @@
|
|||
**Reference Document**: `cline_docs/v1_design_specifications.md` (400+ lines)
|
||||
|
||||
### Next Immediate Steps
|
||||
1. **Create Laravel Migrations** - Match v1.0 Prisma schema
|
||||
2. **Configure .env** - PostgreSQL connection settings
|
||||
3. **Build Vue Components** - Replicate v1.0 design exactly
|
||||
4. **Implement Routes** - Public and admin routes
|
||||
5. **Test Locally** - Verify all functionality works
|
||||
**Phase 3 Complete! Ready for Phase 4:**
|
||||
1. **Configure PostgreSQL** - Set up production database connection
|
||||
2. **Implement Email Notifications** - SMTP configuration for subscriber alerts
|
||||
3. **Deploy to v2.mad-lawsuit.org** - Test subdomain deployment
|
||||
4. **Final Testing** - Comprehensive verification of all features
|
||||
5. **Switch DNS** - Point mad-lawsuit.org to v2.0
|
||||
|
||||
### Data Migration Details
|
||||
**v1.0 Production Data**:
|
||||
- **Docket Entries**: 63 entries with dates, titles, summaries
|
||||
- **Documents**: 63 PDF files (UUID filenames)
|
||||
- **Subscriptions**: 28 email subscribers
|
||||
- **Total Size**: 158MB of PDF files
|
||||
|
||||
**Schema Mapping** (v1.0 → v2.0):
|
||||
- `docket_entries.id` → `docket_entries.id`
|
||||
- `docket_entries.date` → `docket_entries.date`
|
||||
- `docket_entries.title` → `docket_entries.title`
|
||||
- `docket_entries.summary` → `docket_entries.summary`
|
||||
- `docket_entries.notes` → `docket_entries.notes`
|
||||
- `docket_entries.createdAt` → `docket_entries.created_at`
|
||||
- `docket_entries.updatedAt` → `docket_entries.updated_at`
|
||||
- `documents.docketEntryId` → `documents.docket_entry_id`
|
||||
- `documents.storedFilename` → `documents.stored_filename`
|
||||
- `documents.originalFilename` → `documents.original_filename`
|
||||
- `documents.fileSize` → `documents.file_size`
|
||||
- `documents.mimeType` → `documents.mime_type`
|
||||
- `documents.displayOrder` → `documents.display_order`
|
||||
- `subscriptions.isActive` → `subscriptions.is_active`
|
||||
- `subscriptions.unsubscribeToken` → `subscriptions.unsubscribe_token`
|
||||
- `subscriptions.createdAt` → `subscriptions.created_at`
|
||||
|
||||
## Previous Task: v1.0 PRODUCTION SERVER MIGRATION COMPLETED ✅
|
||||
**MAD Lawsuit Website Successfully Migrated to New Infrastructure**:
|
||||
|
|
@ -168,477 +306,63 @@ docker compose logs -f
|
|||
- **PDF Files**: 69 court documents accessible ✓
|
||||
- **All Containers**: Running and healthy ✓
|
||||
|
||||
### Git Commits Made
|
||||
- Migration completed with all package upgrades
|
||||
- Caddyfile updated with direct IP addresses
|
||||
- All changes committed to repository
|
||||
|
||||
## Previous Task: CACHE CONTROL HEADERS ADDED ✅
|
||||
**MAD Lawsuit Website Cache Prevention Implemented**:
|
||||
- **Problem**: HTTP response caching causing stale 404 responses for PDF downloads
|
||||
- **Root Cause**: Caddy/CDN caching API responses, persisting even after fixes deployed
|
||||
- **Solution**: Added Cache-Control headers to prevent future caching
|
||||
- **Status**: CACHE HEADERS ACTIVE, LEGACY CACHE EXPIRING ⏳
|
||||
|
||||
### Cache Control Implementation Details
|
||||
**Problem Identified**:
|
||||
- After implementing dedicated backend subdomain, some PDF downloads still returned 404
|
||||
- Testing revealed cached responses from before the fix was deployed
|
||||
- Cache persisted through multiple Caddy restarts and data directory clearing
|
||||
- Indicates upstream CDN or aggressive HTTP caching layer
|
||||
|
||||
**Solution Implemented** ✅:
|
||||
1. **Added Cache-Control Headers to Caddyfile**
|
||||
- **Location**: `mad-lawsuit.org` block in Caddyfile
|
||||
- **Headers**: `Cache-Control: no-store, no-cache, must-revalidate`
|
||||
- **Scope**: All `/api/*` routes
|
||||
- **Purpose**: Prevent new caches from forming
|
||||
|
||||
2. **Caddyfile Update**:
|
||||
```caddy
|
||||
mad-lawsuit.org {
|
||||
# Disable caching for API routes to prevent stale responses
|
||||
header /api/* {
|
||||
Cache-Control "no-store, no-cache, must-revalidate"
|
||||
}
|
||||
reverse_proxy 172.18.0.1:806
|
||||
}
|
||||
```
|
||||
|
||||
3. **Deployment Process**:
|
||||
- Updated local Caddyfile
|
||||
- SCP'd to server: `~/docker/caddy/config/Caddyfile`
|
||||
- Restarted Caddy: `docker compose -f caddy-compose.yml down && up -d`
|
||||
- Verified headers: `cache-control: no-store, no-cache, must-revalidate` ✅
|
||||
|
||||
**Current Status**:
|
||||
- ✅ Cache-Control headers active and being sent
|
||||
- ✅ API endpoint working: `https://mad-lawsuit.org/api/docket-entries` returns 63 entries
|
||||
- ✅ Direct backend working: All PDFs accessible via `https://files.mad-lawsuit.org`
|
||||
- ⏳ Legacy cached 404s: Documents 4, 11, 13 still have cached responses (will expire naturally)
|
||||
- ✅ New requests: Will NOT be cached due to Cache-Control headers
|
||||
|
||||
**Workaround for Users**:
|
||||
- Use direct backend URL for immediate access: `https://files.mad-lawsuit.org/api/documents/{id}/download`
|
||||
- Frontend proxy URLs will work correctly once legacy cache expires (typically 24 hours)
|
||||
|
||||
## Previous Task: DEDICATED BACKEND SUBDOMAIN IMPLEMENTED ✅
|
||||
**MAD Lawsuit Website Backend Moved to files.mad-lawsuit.org**:
|
||||
- **Problem**: PDF downloads unreliable through frontend proxy tunnel
|
||||
- **Root Cause**: Frontend proxy (Next.js) creating instability for file downloads
|
||||
- **Solution**: Created dedicated backend subdomain with direct Caddy routing
|
||||
- **Status**: BACKEND SUBDOMAIN FULLY OPERATIONAL ✅
|
||||
|
||||
### Dedicated Backend Subdomain Implementation Details
|
||||
**Architecture Changes**:
|
||||
1. **Backend Port Change** ✅ COMPLETED
|
||||
- **Changed**: Backend port from 809 → 901 (9xx range for backends)
|
||||
- **Reason**: Follow port structure convention (8xx for frontends, 9xx for backends)
|
||||
- **File**: `docker-compose.yml`
|
||||
|
||||
2. **New Subdomain Configuration** ✅ COMPLETED
|
||||
- **Created**: `files.mad-lawsuit.org` subdomain for backend API
|
||||
- **DNS**: Already resolving to same IP as mad-lawsuit.org
|
||||
- **Caddy**: Direct reverse proxy to backend on port 901
|
||||
- **File**: `Caddyfile`
|
||||
|
||||
3. **Simplified Frontend Routing** ✅ COMPLETED
|
||||
- **Changed**: `mad-lawsuit.org` now only proxies to frontend (port 806)
|
||||
- **Removed**: Complex path-based routing (/api/* handling)
|
||||
- **Result**: Cleaner, more reliable frontend routing
|
||||
|
||||
4. **Frontend API Proxy Update** ✅ COMPLETED
|
||||
- **Changed**: Frontend now calls `https://files.mad-lawsuit.org/api/*`
|
||||
- **Previous**: Called internal Docker container `http://mad-lawsuit-backend-1:3001`
|
||||
- **Benefit**: Direct backend access, no proxy tunnel issues
|
||||
- **File**: `frontend/src/app/api/[...path]/route.ts`
|
||||
|
||||
5. **Backend CORS Update** ✅ COMPLETED
|
||||
- **Added**: Both `mad-lawsuit.org` and `files.mad-lawsuit.org` to allowed origins
|
||||
- **Reason**: Backend needs to accept requests from both domains
|
||||
- **File**: `backend/src/index.ts`
|
||||
|
||||
### Final Architecture
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────┐
|
||||
│ Caddy Reverse Proxy │
|
||||
│ │
|
||||
│ mad-lawsuit.org → 172.18.0.1:806 (Frontend) │
|
||||
│ files.mad-lawsuit.org → 172.18.0.1:901 (Backend) │
|
||||
└─────────────────────────────────────────────────────────┘
|
||||
│
|
||||
├─────────────────────────────┐
|
||||
│ │
|
||||
┌──────▼──────┐ ┌──────▼──────┐
|
||||
│ Frontend │ │ Backend │
|
||||
│ Port 806 │──────────────│ Port 901 │
|
||||
│ Next.js │ API Calls │ Express.js │
|
||||
└─────────────┘ └─────────────┘
|
||||
```
|
||||
|
||||
### Benefits of New Architecture
|
||||
1. **Reliability**: Direct backend access eliminates proxy tunnel issues
|
||||
2. **Stability**: Backend isolated from frontend routing problems
|
||||
3. **Performance**: Reduced latency without frontend proxy overhead
|
||||
4. **Maintainability**: Cleaner separation of concerns
|
||||
5. **Scalability**: Can scale frontend/backend independently
|
||||
6. **Debugging**: Easier to troubleshoot backend-specific issues
|
||||
|
||||
### Deployment Status ✅
|
||||
- **Code Changes**: Committed to Git (commit a2595246)
|
||||
- **Caddyfile**: Uploaded and reloaded on server
|
||||
- **Containers**: Rebuilt and restarted with new configuration
|
||||
- **Verification**: Both domains responding correctly
|
||||
- `https://mad-lawsuit.org` → Frontend (HTTP 200)
|
||||
- `https://files.mad-lawsuit.org/api/health` → Backend (HTTP 200)
|
||||
|
||||
### Git Commit
|
||||
```
|
||||
commit a2595246
|
||||
Implement dedicated backend subdomain files.mad-lawsuit.org
|
||||
|
||||
- Changed backend port from 809 to 901 (9xx range for backends)
|
||||
- Updated docker-compose.yml to expose backend on port 901
|
||||
- Created new Caddyfile with files.mad-lawsuit.org subdomain
|
||||
- Simplified mad-lawsuit.org to only proxy to frontend (port 806)
|
||||
- Updated frontend API proxy to use https://files.mad-lawsuit.org
|
||||
- Updated backend CORS to allow both mad-lawsuit.org and files.mad-lawsuit.org
|
||||
- This fixes PDF download reliability issues by providing direct backend access
|
||||
```
|
||||
|
||||
## Previous Task: PDF DOWNLOAD ISSUE FULLY RESOLVED ✅
|
||||
**MAD Lawsuit Website PDF Download Fixed via Direct Backend Routing**:
|
||||
- **Problem**: PDF downloads failing with "Endpoint not found" error
|
||||
- **Root Cause**: Caddy was routing ALL requests (including /api/*) to frontend, frontend's Next.js proxy couldn't properly handle the requests
|
||||
- **Solution**: Exposed backend on port 809 and configured Caddy to route /api/* directly to backend
|
||||
- **Status**: PDF DOWNLOADS WORKING ✅ (Now superseded by dedicated subdomain)
|
||||
|
||||
### PDF Download Fix Implementation Details
|
||||
**Issues Resolved**:
|
||||
1. **Caddy Routing Issue** ✅ FIXED
|
||||
- **Problem**: Caddy configuration only proxied to frontend (port 806), no separate API routing
|
||||
- **Impact**: All /api/* requests went through frontend's Next.js proxy, causing routing issues
|
||||
- **Solution**: Exposed backend on port 809 and configured Caddy to route /api/* directly to backend
|
||||
- **Files**: `docker-compose.yml`, Caddy configuration
|
||||
|
||||
2. **Backend Port Exposure** ✅ FIXED
|
||||
- **Problem**: Backend not exposed to host, only accessible within Docker network
|
||||
- **Solution**: Added `ports: - "809:3001"` to backend service in docker-compose.yml
|
||||
- **File**: `docker-compose.yml`
|
||||
|
||||
3. **Caddy Configuration Update** ✅ FIXED
|
||||
- **Problem**: Simple reverse proxy to frontend didn't handle API routes separately
|
||||
- **Solution**: Added handle blocks to route /api/* to backend (809) and everything else to frontend (806)
|
||||
- **File**: `/home/chaulmark/docker/caddy/config/Caddyfile`
|
||||
|
||||
### Final Caddy Configuration
|
||||
```
|
||||
mad-lawsuit.org {
|
||||
# Route API requests directly to backend
|
||||
handle /api/* {
|
||||
reverse_proxy 172.18.0.1:809
|
||||
}
|
||||
|
||||
# Route everything else to frontend
|
||||
handle {
|
||||
reverse_proxy 172.18.0.1:806
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Verification ✅
|
||||
```bash
|
||||
# Backend accessible on port 809
|
||||
curl http://localhost:809/api/documents/9/download
|
||||
# HTTP 200 - PDF content returned
|
||||
|
||||
# Public domain working
|
||||
curl https://mad-lawsuit.org/api/documents/9/download
|
||||
# HTTP 200 - PDF content returned
|
||||
```
|
||||
|
||||
### Git Commits Made
|
||||
1. `13d219db` - Expose backend on port 809 for direct Caddy routing to fix PDF download
|
||||
|
||||
## Previous Task: DOCKER BUILD ISSUES FULLY RESOLVED ✅
|
||||
**MAD Lawsuit Website Docker Deployment Successfully Fixed**:
|
||||
- **Problem**: Docker containers failing to build and run due to pnpm and Prisma issues
|
||||
- **Root Cause**: Prisma CLI in devDependencies but needed in production for client generation
|
||||
- **Solution**: Dependency restructuring + Docker build process optimization
|
||||
- **Status**: ALL CONTAINERS RUNNING AND HEALTHY ✅
|
||||
|
||||
### Docker Fix Implementation Details
|
||||
**Issues Resolved**:
|
||||
1. **pnpm TTY Error** ✅ FIXED
|
||||
- **Problem**: `pnpm prune --prod` failing with TTY error in Docker build
|
||||
- **Solution**: Added `ENV CI=true` to Dockerfile before prune command
|
||||
- **File**: `backend/Dockerfile`
|
||||
|
||||
2. **Prisma Client Missing After Prune** ✅ FIXED
|
||||
- **Problem**: `prisma` CLI in devDependencies, removed during production prune
|
||||
- **Impact**: Prisma client generation failing, backend crashing with MODULE_NOT_FOUND
|
||||
- **Solution**: Moved `prisma` from devDependencies to dependencies in package.json
|
||||
- **Files**: `backend/package.json`, `backend/pnpm-lock.yaml`
|
||||
|
||||
3. **Outdated Lockfile** ✅ FIXED
|
||||
- **Problem**: pnpm-lock.yaml outdated after dependency changes
|
||||
- **Impact**: `pnpm install --frozen-lockfile` failing in Docker build
|
||||
- **Solution**: Regenerated lockfile locally and committed to repository
|
||||
|
||||
### Final Docker Build Process
|
||||
```dockerfile
|
||||
# Install all dependencies
|
||||
RUN pnpm install --frozen-lockfile
|
||||
|
||||
# Generate Prisma client (first time)
|
||||
RUN pnpm prisma generate
|
||||
|
||||
# Build application
|
||||
RUN pnpm build
|
||||
|
||||
# Remove dev dependencies (but keep prisma CLI)
|
||||
ENV CI=true
|
||||
RUN pnpm prune --prod
|
||||
|
||||
# Regenerate Prisma client (after prune, using production deps)
|
||||
RUN pnpm prisma generate
|
||||
```
|
||||
|
||||
### Current Container Status - ALL HEALTHY ✅
|
||||
- **mad-lawsuit-frontend-1**: Running and healthy on port 806
|
||||
- **mad-lawsuit-backend-1**: Running and healthy with working database connections
|
||||
- **mad-lawsuit-postgres-1**: Running on port 5432
|
||||
- **mad-lawsuit-redis-1**: Running on port 6379
|
||||
|
||||
### Backend Verification ✅
|
||||
```
|
||||
> node dist/index.js
|
||||
prisma:info Starting a postgresql pool with 3 connections.
|
||||
prisma:query SELECT 1
|
||||
prisma:query SELECT "public"."docket_entries"...
|
||||
```
|
||||
- Prisma client working correctly
|
||||
- Database connections established
|
||||
- Queries executing successfully
|
||||
|
||||
### Git Commits Made
|
||||
1. `b291ee9b` - Fix Docker build: Add CI=true env var for pnpm prune command
|
||||
2. `d087ca9c` - Fix Prisma client: Regenerate after pnpm prune to restore missing binaries
|
||||
3. `0035b7cc` - Fix Prisma generate: Use npx instead of pnpm after prune removes CLI
|
||||
4. `cf071cc4` - Fix Prisma prune: Use --config.ignore-scripts=false to preserve Prisma client
|
||||
5. `b59ae90c` - Fix Prisma dependencies: Move prisma CLI to production deps and regenerate after prune
|
||||
6. `f962327a` - Update pnpm-lock.yaml after moving prisma to production dependencies
|
||||
|
||||
## Previous Task: GMAIL SMUGGLER FULLY OPERATIONAL ✅
|
||||
**SMTP Relay Solution Successfully Implemented**:
|
||||
- **DigitalOcean Server (chrishaulmark.com)**: SMTP ports 25, 465, 587 BLOCKED by DigitalOcean
|
||||
- **Dedicated Server (74.80.182.50)**: All SMTP ports WORKING ✅
|
||||
- **Gmail Smuggler Container**: DEPLOYED and RUNNING ✅ on port 2525 (unblocked)
|
||||
|
||||
**Solution**: DNS override + port 2525 SMTP relay bypasses DigitalOcean SMTP blocking completely.
|
||||
|
||||
### Gmail Smuggler Final Configuration
|
||||
- **Container Name**: `gmail-smuggler`
|
||||
- **Location**: `10.4.0.206:~/gmail-smuggler/` (internal VM)
|
||||
- **Status**: Running with Docker Compose auto-restart
|
||||
- **Port**: 2525 (external) → 587 (internal, forwarding to smtp.gmail.com:587)
|
||||
- **Technology**: Alpine Linux + socat TCP relay
|
||||
- **OPNsense**: Port forwarding 2525 → 10.4.0.206:2525
|
||||
|
||||
### Implementation Details
|
||||
1. **DNS Override**: `74.80.182.50 smtp.gmail.com` in `/etc/hosts` ✅
|
||||
2. **Backend Configuration**: `SMTP_PORT=2525` in `backend/.env` ✅
|
||||
3. **Port Forwarding**: OPNsense forwards port 2525 to internal VM ✅
|
||||
4. **Connection Verified**: DigitalOcean VPS → 74.80.182.50:2525 → Gmail ✅
|
||||
|
||||
### Email Flow
|
||||
```
|
||||
Court Docket Website → smtp.gmail.com:2525 → 74.80.182.50:2525 → 10.4.0.206:2525 → Gmail SMTP
|
||||
```
|
||||
|
||||
## Previous Task: COMPLETED ✅
|
||||
**DeafGain LLC Footer Addition** - Added "Designed by DeafGain LLC" footer to the court docket website.
|
||||
|
||||
## Previous Task: COMPLETED ✅
|
||||
**Email System URL Fix** - Updated email notifications to use production domain and added unsubscribe instructions.
|
||||
|
||||
## Previous Task: COMPLETED ✅
|
||||
**PDF Upload Issue Resolution** - Successfully identified and fixed all issues preventing PDF document uploads in the admin dashboard.
|
||||
|
||||
## Recent Work Completed
|
||||
|
||||
### DeafGain LLC Footer Addition - COMPLETED ✅
|
||||
**Problem**: Website was missing professional branding footer like other DeafGain websites.
|
||||
|
||||
**Solution Implemented**:
|
||||
|
||||
1. **Footer Design** ✅ ADDED
|
||||
- **Implementation**: Added footer section at bottom of home page
|
||||
- **Styling**: Matches website theme with dark background and yellow accent text
|
||||
- **Content**: "Designed by DeafGain LLC" with link to http://deafgain.org
|
||||
- **File**: `frontend/src/app/page.tsx`
|
||||
|
||||
2. **Visual Consistency** ✅ ACHIEVED
|
||||
- **Reference**: Based on Chris Haulmark website footer implementation
|
||||
- **Colors**: Gray text with yellow (#fbbf24) DeafGain LLC link
|
||||
- **Hover Effect**: Color changes to darker yellow (#f59e0b) on hover
|
||||
- **Layout**: Centered text in footer section
|
||||
|
||||
### Footer Implementation:
|
||||
```jsx
|
||||
<footer style={{
|
||||
width: '100%',
|
||||
padding: '2rem 0',
|
||||
backgroundColor: 'rgba(57, 64, 83, 0.95)',
|
||||
borderTop: '1px solid #4E4A59',
|
||||
textAlign: 'center',
|
||||
display: 'block'
|
||||
}}>
|
||||
<div style={{ textAlign: 'center', display: 'block', width: '100%' }}>
|
||||
<span style={{ color: '#9ca3af' }}>Designed by </span>
|
||||
<a href="http://deafgain.org" target="_blank" rel="noopener noreferrer"
|
||||
style={{ color: '#fbbf24', textDecoration: 'none' }}>
|
||||
DeafGain LLC
|
||||
</a>
|
||||
</div>
|
||||
</footer>
|
||||
```
|
||||
|
||||
### Email System URL Fix - COMPLETED ✅
|
||||
**Problem**: Email notifications were linking to localhost instead of production domain, and missing unsubscribe instructions.
|
||||
|
||||
**Issues Fixed**:
|
||||
|
||||
1. **Production URL Issue** ✅ FIXED
|
||||
- **Problem**: Email links pointed to `localhost:3000` instead of production domain
|
||||
- **Impact**: Subscribers couldn't access website from email notifications
|
||||
- **Solution**: Updated all email links to use `https://mad-lawsuit.org/`
|
||||
- **File**: `backend/src/services/emailService.ts`
|
||||
|
||||
2. **Email Text Improvement** ✅ FIXED
|
||||
- **Problem**: Generic "court docket website" text in emails
|
||||
- **Impact**: Less professional email presentation
|
||||
- **Solution**: Changed to "You can view the complete docket and any associated documents by visiting the website:" with website as clickable link
|
||||
- **File**: `backend/src/services/emailService.ts`
|
||||
|
||||
3. **Missing Unsubscribe Instructions** ✅ FIXED
|
||||
- **Problem**: No clear unsubscribe instructions for email recipients
|
||||
- **Impact**: Users couldn't easily unsubscribe from notifications
|
||||
- **Solution**: Added "To unsubscribe, please send an email to eliza.kragh@gmail.com" in footer
|
||||
- **File**: `backend/src/services/emailService.ts`
|
||||
|
||||
### Email Changes Made:
|
||||
```html
|
||||
<!-- Before -->
|
||||
<p>You can view the complete docket and any associated documents by visiting the court docket website:</p>
|
||||
<a href="${process.env['FRONTEND_URL'] || 'http://localhost:3000'}" class="button">View Court Docket</a>
|
||||
|
||||
<!-- After -->
|
||||
<p>You can view the complete docket and any associated documents by visiting the <a href="https://mad-lawsuit.org/">website</a>:</p>
|
||||
<a href="https://mad-lawsuit.org/" class="button">View Court Docket</a>
|
||||
<p>To unsubscribe, please send an email to eliza.kragh@gmail.com</p>
|
||||
```
|
||||
|
||||
### PDF Upload Issue - FULLY RESOLVED ✅
|
||||
**Problem**: Users could not upload PDF documents through the admin dashboard, receiving various errors.
|
||||
|
||||
**Root Causes Identified and Fixed**:
|
||||
|
||||
1. **Network Connectivity Issue** ✅ FIXED
|
||||
- **Problem**: Frontend container only on `caddy_network`, backend on `app-network`
|
||||
- **Impact**: Frontend couldn't reach backend for API calls
|
||||
- **Solution**: Added frontend to both networks in `docker-compose.yml`
|
||||
- **Commit**: 910bd525
|
||||
|
||||
2. **MIME Type Validation Issue** ✅ FIXED
|
||||
- **Problem**: Backend fileFilter only accepted `application/pdf` MIME type
|
||||
- **Impact**: Valid PDFs rejected due to browser MIME detection variations
|
||||
- **Solution**: Enhanced fileFilter to accept multiple PDF MIME types + file extension fallback
|
||||
- **File**: `backend/src/routes/documents.ts`
|
||||
- **Commit**: 9ab09196
|
||||
|
||||
3. **Missing Form Data Issue** ✅ FIXED
|
||||
- **Problem**: Frontend only sending `file` and `docketEntryId`, missing required `title` field
|
||||
- **Impact**: Backend validation failing with "title is required" error
|
||||
- **Solution**: Added all required fields to FormData in dashboard upload
|
||||
- **File**: `frontend/src/app/admin/dashboard/page.tsx`
|
||||
- **Commit**: 8027ef0a
|
||||
|
||||
### Technical Details
|
||||
|
||||
**Network Architecture Fixed**:
|
||||
```yaml
|
||||
frontend:
|
||||
networks:
|
||||
- app-network # Added for backend communication
|
||||
- caddy_network # Existing for reverse proxy
|
||||
```
|
||||
|
||||
**Enhanced PDF Detection**:
|
||||
```javascript
|
||||
const allowedMimeTypes = [
|
||||
'application/pdf',
|
||||
'application/x-pdf',
|
||||
'application/acrobat',
|
||||
'applications/vnd.pdf',
|
||||
'text/pdf',
|
||||
'text/x-pdf'
|
||||
];
|
||||
```
|
||||
|
||||
**Complete Form Data**:
|
||||
```javascript
|
||||
uploadFormData.append('file', selectedFile);
|
||||
uploadFormData.append('docketEntryId', data.entry.id.toString());
|
||||
uploadFormData.append('title', selectedFile.name.replace('.pdf', ''));
|
||||
uploadFormData.append('summary', '');
|
||||
uploadFormData.append('notes', '');
|
||||
```
|
||||
|
||||
## Current Status
|
||||
|
||||
### What's Working ✅
|
||||
- **Docker containers all running and healthy**
|
||||
- **Backend with working Prisma database connections**
|
||||
- **Frontend accessible on port 806**
|
||||
- Network connectivity between frontend and backend
|
||||
- PDF MIME type detection (multiple formats)
|
||||
- Form validation with all required fields
|
||||
- Error logging and debugging
|
||||
- **Email system with production URLs** (https://mad-lawsuit.org/)
|
||||
- **Professional unsubscribe instructions** (eliza.kragh@gmail.com)
|
||||
- **DeafGain LLC footer branding** with professional styling
|
||||
- All code committed and pushed to Git
|
||||
- **v2.0 Phase 1**: Public website fully functional
|
||||
- **v2.0 Phase 2**: Admin dashboard complete with all CRUD operations
|
||||
- **v2.0 Phase 3**: 100% data migration complete (63/63/28)
|
||||
- **Development Servers**: Laravel (8000) and Vite (5173) running
|
||||
- **Admin Authentication**: Login working with session management
|
||||
- **File Storage**: PDFs uploading and downloading correctly
|
||||
- **Database**: SQLite with complete production data, ready for PostgreSQL migration
|
||||
- **All 63 Entries**: Imported and verified in database
|
||||
- **All 63 Documents**: Linked correctly with proper file paths
|
||||
- **All 28 Subscriptions**: Active and ready for notifications
|
||||
|
||||
### Next Steps for User
|
||||
1. **Website is fully operational** - no further action needed
|
||||
2. **All containers healthy and running** on remote server
|
||||
3. **Database connections working** - Prisma queries executing successfully
|
||||
4. **Email notifications functional** with proper URLs
|
||||
5. **Professional branding** with DeafGain LLC footer
|
||||
**Phase 4 - Production Deployment (On Hold)**:
|
||||
1. **Configure PostgreSQL** - Set up production database connection
|
||||
2. **Implement Email Notifications** - SMTP configuration
|
||||
3. **Deploy to v2.mad-lawsuit.org** - Test subdomain
|
||||
4. **Final Testing** - Comprehensive verification
|
||||
5. **DNS Switchover** - Point mad-lawsuit.org to v2.0
|
||||
|
||||
### Files Modified (Docker Fix)
|
||||
- `backend/Dockerfile` - Added CI=true, optimized Prisma generation
|
||||
- `backend/package.json` - Moved prisma from devDependencies to dependencies
|
||||
- `backend/pnpm-lock.yaml` - Updated lockfile for new dependency structure
|
||||
### Files Modified (Phase 2 & 3)
|
||||
**Controllers**:
|
||||
- `app/Http/Controllers/Admin/AuthController.php`
|
||||
- `app/Http/Controllers/Admin/DashboardController.php`
|
||||
- `app/Http/Controllers/Admin/DocketEntryController.php`
|
||||
- `app/Http/Controllers/Admin/DocumentController.php`
|
||||
- `app/Http/Controllers/Admin/SubscriberController.php`
|
||||
|
||||
### Files Modified (Previous Tasks)
|
||||
- `docker-compose.yml` - Network configuration
|
||||
- `backend/src/routes/documents.ts` - Enhanced PDF validation
|
||||
- `frontend/src/app/admin/dashboard/page.tsx` - Fixed form data
|
||||
- **`backend/src/services/emailService.ts` - Updated URLs and unsubscribe info**
|
||||
- **`frontend/src/app/page.tsx` - Added DeafGain LLC footer**
|
||||
**Vue Pages**:
|
||||
- `resources/js/Pages/Admin/Login.vue`
|
||||
- `resources/js/Pages/Admin/Dashboard.vue`
|
||||
- `resources/js/Pages/Admin/DocketEntries/Index.vue`
|
||||
- `resources/js/Pages/Admin/DocketEntries/Create.vue`
|
||||
- `resources/js/Pages/Admin/DocketEntries/Edit.vue`
|
||||
- `resources/js/Pages/Admin/DocketEntries/Show.vue`
|
||||
- `resources/js/Pages/Admin/Subscribers/Index.vue`
|
||||
|
||||
**Middleware & Routes**:
|
||||
- `app/Http/Middleware/AdminAuth.php`
|
||||
- `routes/web.php`
|
||||
|
||||
**Database**:
|
||||
- `database/seeders/AdminSeeder.php`
|
||||
- `database/migrations/2025_12_17_223224_create_admin_users_table.php`
|
||||
|
||||
### Deployment Notes
|
||||
- **Docker deployment successful** - all containers running on remote server
|
||||
- **No further deployment needed** - website fully operational
|
||||
- All fixes are committed to Git repository
|
||||
- Backend and frontend both successfully deployed with latest fixes
|
||||
- **Phase 2 Complete**: All admin features working locally
|
||||
- **Phase 3 In Progress**: Data migration 50% complete
|
||||
- **Ready for Seeder**: SQL dump and PDFs ready for import
|
||||
- All code committed to Git repository
|
||||
|
||||
## Investigation Process
|
||||
1. **Docker Build Analysis**: Identified pnpm TTY and Prisma dependency issues
|
||||
2. **Dependency Management**: Restructured package.json for proper production builds
|
||||
3. **Build Process Optimization**: Enhanced Dockerfile for reliable Prisma client generation
|
||||
4. **Systematic Testing**: Verified all containers healthy and database connections working
|
||||
1. **Phase 1**: Built public website matching v1.0 design
|
||||
2. **Phase 2**: Implemented complete admin dashboard with CRUD
|
||||
3. **Phase 3**: Exported production data and transferred PDF files
|
||||
4. **Next**: Create seeder to import v1.0 data into v2.0
|
||||
|
||||
The MAD lawsuit website Docker deployment is now fully operational with all containers running successfully.
|
||||
The MAD lawsuit website v2.0 rebuild is progressing well with Phase 2 complete and Phase 3 50% done.
|
||||
|
|
|
|||
|
|
@ -1,128 +1,261 @@
|
|||
# Project Progress Status
|
||||
# MAD Lawsuit Website v2.0 - Progress Tracker
|
||||
|
||||
## Current Status: PDF Upload Issue RESOLVED ✅
|
||||
## Project Overview
|
||||
**Goal**: Rebuild MAD lawsuit website from Next.js/Express/Prisma to Laravel/Vue/Inertia
|
||||
**v1.0**: https://mad-lawsuit.org (fully operational)
|
||||
**v2.0**: Local development → Production deployment
|
||||
|
||||
### Recently Completed (December 25, 2025)
|
||||
## Phase Status
|
||||
|
||||
#### PDF Upload Functionality - FULLY WORKING ✅
|
||||
**Issue**: Admin dashboard PDF upload feature was completely broken
|
||||
**Status**: **RESOLVED** - All root causes identified and fixed
|
||||
### Phase 1: Public Website ✅ COMPLETE
|
||||
**Status**: Fully functional with all v1.0 features replicated
|
||||
**Completion Date**: December 17, 2025
|
||||
|
||||
**Fixes Applied**:
|
||||
1. **Network Connectivity** ✅ - Fixed Docker network isolation between frontend/backend
|
||||
2. **MIME Type Validation** ✅ - Enhanced PDF detection to support multiple MIME types
|
||||
3. **Form Data Validation** ✅ - Added missing required fields to upload request
|
||||
**Completed Features**:
|
||||
- ✅ Laravel 12 + Vue 3 + TypeScript + Inertia.js setup
|
||||
- ✅ Home page matching v1.0 design exactly
|
||||
- ✅ Docket entries display with pagination
|
||||
- ✅ Document download functionality
|
||||
- ✅ Email subscription form
|
||||
- ✅ Responsive design with Tailwind CSS
|
||||
- ✅ Database migrations (docket_entries, documents, subscriptions)
|
||||
- ✅ Eloquent models with relationships
|
||||
- ✅ Development servers running (Laravel 8000, Vite 5173)
|
||||
|
||||
**Technical Changes**:
|
||||
- Modified `docker-compose.yml` for proper network configuration
|
||||
- Enhanced `backend/src/routes/documents.ts` with flexible PDF validation
|
||||
- Fixed `frontend/src/app/admin/dashboard/page.tsx` form data construction
|
||||
- Added comprehensive error logging and debugging
|
||||
### Phase 2: Admin Dashboard ✅ COMPLETE
|
||||
**Status**: Full CRUD operations implemented and tested
|
||||
**Completion Date**: December 17, 2025
|
||||
|
||||
**Deployment Status**: Ready for deployment via Portainer
|
||||
**Completed Features**:
|
||||
- ✅ Admin authentication (session-based, separate from Breeze)
|
||||
- ✅ Admin login page with professional UI
|
||||
- ✅ Dashboard with statistics (entries, documents, subscribers)
|
||||
- ✅ Docket entry management (Create, Read, Update, Delete)
|
||||
- ✅ Document upload/delete with UUID naming
|
||||
- ✅ Subscriber management (list, deactivate)
|
||||
- ✅ File storage configuration with symlink
|
||||
- ✅ Pagination (20 entries, 50 subscribers per page)
|
||||
- ✅ Form validation and error handling
|
||||
- ✅ Success/error flash messages
|
||||
- ✅ Professional UI with Tailwind CSS
|
||||
|
||||
## What's Working ✅
|
||||
**Admin Access**:
|
||||
- URL: http://127.0.0.1:8000/admin/login
|
||||
- Username: admin
|
||||
- Password: password
|
||||
|
||||
### Core Website Functionality
|
||||
- ✅ Public docket viewing
|
||||
- ✅ Document download functionality
|
||||
- ✅ Email subscription system
|
||||
- ✅ Admin authentication
|
||||
- ✅ Admin dashboard (view/edit/delete entries)
|
||||
- ✅ **PDF Upload (FIXED)**
|
||||
### Phase 3: Data Migration ⏳ IN PROGRESS (95%)
|
||||
**Status**: Seeder created and tested, ready for final import
|
||||
**Started**: December 17, 2025
|
||||
|
||||
### Infrastructure
|
||||
- ✅ Docker containerization
|
||||
- ✅ PostgreSQL database
|
||||
- ✅ Redis caching
|
||||
- ✅ Caddy reverse proxy
|
||||
- ✅ Network connectivity (FIXED)
|
||||
- ✅ SSL/HTTPS configuration
|
||||
**Completed**:
|
||||
- ✅ PostgreSQL data export from production (63 entries, 63 docs, 28 subs)
|
||||
- ✅ PDF files transferred via SCP (69 files, 158MB)
|
||||
- ✅ Files in storage/app/public/documents/
|
||||
- ✅ SQL dump in /tmp/v1-data.sql
|
||||
- ✅ Created V1DataMigrationSeeder (tested with sample data)
|
||||
- ✅ Created Python parser script (parse_sql_to_seeder.py)
|
||||
- ✅ Generated PHP arrays (32 entries, 63 docs, 28 subs in seeder_data.txt)
|
||||
- ✅ Created completion instructions (PHASE3_COMPLETION_INSTRUCTIONS.md)
|
||||
|
||||
### Admin Features
|
||||
- ✅ Login/logout functionality
|
||||
- ✅ Docket entry management (CRUD)
|
||||
- ✅ Document upload (FIXED)
|
||||
- ✅ Subscriber management
|
||||
- ✅ Dashboard analytics
|
||||
**Remaining** (Next Session):
|
||||
- ⏳ Update seeder with generated arrays (15 min)
|
||||
- ⏳ Run seeder and import data (2 min)
|
||||
- ⏳ Verify data integrity in admin dashboard (5 min)
|
||||
|
||||
## Technical Architecture
|
||||
### Phase 4: Production Deployment ⏳ PENDING
|
||||
**Status**: Not started
|
||||
**Dependencies**: Phase 3 completion
|
||||
|
||||
### Frontend (Next.js)
|
||||
- ✅ React-based admin interface
|
||||
- ✅ Public viewing pages
|
||||
- ✅ PDF viewer component
|
||||
- ✅ Responsive design
|
||||
- ✅ Form validation
|
||||
- ✅ API integration (FIXED)
|
||||
**Planned Tasks**:
|
||||
- [ ] Configure PostgreSQL connection for production
|
||||
- [ ] Implement email notifications (SMTP)
|
||||
- [ ] Deploy to v2.mad-lawsuit.org subdomain
|
||||
- [ ] Final testing and verification
|
||||
- [ ] Switch DNS to v2.0
|
||||
- [ ] Decommission v1.0
|
||||
|
||||
### Backend (Express.js)
|
||||
- ✅ RESTful API endpoints
|
||||
- ✅ Authentication middleware
|
||||
- ✅ File upload handling (FIXED)
|
||||
- ✅ Database integration
|
||||
- ✅ Error handling
|
||||
- ✅ Request logging
|
||||
## Technical Stack
|
||||
|
||||
### Database (PostgreSQL)
|
||||
- ✅ Docket entries table
|
||||
- ✅ Documents table
|
||||
- ✅ Admin users table
|
||||
- ✅ Subscriptions table
|
||||
- ✅ Proper relationships
|
||||
### Backend
|
||||
- **Framework**: Laravel 12.43.1
|
||||
- **PHP**: 8.3.28
|
||||
- **Database**: SQLite (dev), PostgreSQL (prod)
|
||||
- **ORM**: Eloquent
|
||||
- **Auth**: Laravel Sanctum + Session
|
||||
|
||||
### Deployment
|
||||
- ✅ Docker Compose configuration
|
||||
- ✅ Production environment setup
|
||||
- ✅ Reverse proxy configuration
|
||||
- ✅ SSL certificate handling
|
||||
- ✅ Network configuration (FIXED)
|
||||
### Frontend
|
||||
- **Framework**: Vue 3 + TypeScript
|
||||
- **Routing**: Inertia.js
|
||||
- **Styling**: Tailwind CSS 3.x
|
||||
- **Build**: Vite 7.x
|
||||
|
||||
## Recent Bug Fixes
|
||||
### Development Environment
|
||||
- **PHP**: Homebrew installation
|
||||
- **Composer**: 2.9.2
|
||||
- **Node**: Latest stable
|
||||
- **Servers**: Laravel (8000), Vite (5173)
|
||||
|
||||
### PDF Upload Issue Resolution
|
||||
**Timeline**: December 25, 2025
|
||||
**Commits**: 910bd525, 9ab09196, 8027ef0a
|
||||
## Data Statistics
|
||||
|
||||
1. **Network Issue** - Frontend couldn't reach backend
|
||||
- Root cause: Docker network isolation
|
||||
- Fix: Added frontend to app-network
|
||||
### v1.0 Production Data
|
||||
- **Docket Entries**: 63 entries
|
||||
- **Documents**: 63 PDF files (UUID filenames)
|
||||
- **Subscriptions**: 28 email subscribers
|
||||
- **Total PDF Size**: 158MB
|
||||
- **Database Size**: 47MB (PostgreSQL)
|
||||
|
||||
2. **MIME Type Issue** - PDFs rejected by validation
|
||||
- Root cause: Strict MIME type checking
|
||||
- Fix: Enhanced validation for multiple PDF MIME types
|
||||
### v2.0 Current Data
|
||||
- **Docket Entries**: 5 (test data from DocketSeeder)
|
||||
- **Documents**: 5 (test PDFs)
|
||||
- **Subscriptions**: 0
|
||||
- **Admin Users**: 1 (admin/password)
|
||||
|
||||
3. **Form Data Issue** - Missing required fields
|
||||
- Root cause: Incomplete FormData construction
|
||||
- Fix: Added title, summary, notes fields
|
||||
## Key Milestones
|
||||
|
||||
## Next Steps
|
||||
### Completed ✅
|
||||
1. **December 17, 2025**: Phase 1 complete - Public website functional
|
||||
2. **December 17, 2025**: Phase 2 complete - Admin dashboard with full CRUD
|
||||
3. **December 17, 2025**: Phase 3 started - Data export and PDF transfer complete
|
||||
|
||||
### Immediate (User Action Required)
|
||||
1. **Redeploy containers** in Portainer to apply fixes
|
||||
2. **Test PDF upload** functionality
|
||||
3. **Monitor logs** for any remaining issues
|
||||
### Upcoming ⏳
|
||||
4. **Next**: Complete Phase 3 - Create seeder and import production data
|
||||
5. **Future**: Phase 4 - Production deployment and DNS switch
|
||||
|
||||
### Future Enhancements (Potential)
|
||||
- Bulk document upload
|
||||
- Document versioning
|
||||
- Advanced search functionality
|
||||
- Email notification improvements
|
||||
- Mobile app development
|
||||
## Files Created/Modified
|
||||
|
||||
## Development Notes
|
||||
### Controllers (7 files)
|
||||
- `app/Http/Controllers/HomeController.php`
|
||||
- `app/Http/Controllers/SubscriptionController.php`
|
||||
- `app/Http/Controllers/DocumentController.php`
|
||||
- `app/Http/Controllers/Admin/AuthController.php`
|
||||
- `app/Http/Controllers/Admin/DashboardController.php`
|
||||
- `app/Http/Controllers/Admin/DocketEntryController.php`
|
||||
- `app/Http/Controllers/Admin/DocumentController.php`
|
||||
- `app/Http/Controllers/Admin/SubscriberController.php`
|
||||
|
||||
### Key Learnings
|
||||
- Docker network configuration critical for container communication
|
||||
- Browser MIME type detection varies, need flexible validation
|
||||
- Form validation must match backend requirements exactly
|
||||
- Production logging essential for debugging
|
||||
### Vue Pages (8 files)
|
||||
- `resources/js/Pages/Home.vue`
|
||||
- `resources/js/Pages/Admin/Login.vue`
|
||||
- `resources/js/Pages/Admin/Dashboard.vue`
|
||||
- `resources/js/Pages/Admin/DocketEntries/Index.vue`
|
||||
- `resources/js/Pages/Admin/DocketEntries/Create.vue`
|
||||
- `resources/js/Pages/Admin/DocketEntries/Edit.vue`
|
||||
- `resources/js/Pages/Admin/DocketEntries/Show.vue`
|
||||
- `resources/js/Pages/Admin/Subscribers/Index.vue`
|
||||
|
||||
### Best Practices Applied
|
||||
- Systematic debugging approach
|
||||
- Comprehensive error logging
|
||||
- Proper Git commit messages
|
||||
- Network connectivity testing
|
||||
- End-to-end validation
|
||||
### Models (4 files)
|
||||
- `app/Models/DocketEntry.php`
|
||||
- `app/Models/Document.php`
|
||||
- `app/Models/Subscription.php`
|
||||
- `app/Models/AdminUser.php`
|
||||
|
||||
The website is now fully functional with all major features working correctly.
|
||||
### Migrations (4 files)
|
||||
- `database/migrations/2025_12_17_223117_create_docket_entries_table.php`
|
||||
- `database/migrations/2025_12_17_223138_create_documents_table.php`
|
||||
- `database/migrations/2025_12_17_223201_create_subscriptions_table.php`
|
||||
- `database/migrations/2025_12_17_223224_create_admin_users_table.php`
|
||||
|
||||
### Seeders (2 files)
|
||||
- `database/seeders/DocketSeeder.php` (test data)
|
||||
- `database/seeders/AdminSeeder.php` (admin user)
|
||||
|
||||
### Middleware & Routes
|
||||
- `app/Http/Middleware/AdminAuth.php`
|
||||
- `routes/web.php`
|
||||
|
||||
## Testing Status
|
||||
|
||||
### Phase 1 Testing ✅
|
||||
- [x] Home page loads correctly
|
||||
- [x] Docket entries display with proper formatting
|
||||
- [x] Document downloads work
|
||||
- [x] Email subscription form submits
|
||||
- [x] Responsive design on mobile/tablet/desktop
|
||||
|
||||
### Phase 2 Testing ✅
|
||||
- [x] Admin login works with session management
|
||||
- [x] Dashboard displays correct statistics
|
||||
- [x] Create new docket entry
|
||||
- [x] Edit existing docket entry
|
||||
- [x] Delete docket entry (with cascade to documents)
|
||||
- [x] Upload PDF document
|
||||
- [x] Delete PDF document
|
||||
- [x] View subscriber list
|
||||
- [x] Deactivate subscriber
|
||||
- [x] Pagination works correctly
|
||||
|
||||
### Phase 3 Testing ⏳
|
||||
- [ ] Import all 63 docket entries
|
||||
- [ ] Verify all 63 documents accessible
|
||||
- [ ] Confirm 28 subscribers imported
|
||||
- [ ] Test entry-document relationships
|
||||
- [ ] Verify timestamps preserved
|
||||
- [ ] Check data integrity
|
||||
|
||||
## Known Issues
|
||||
|
||||
### Current Issues
|
||||
- None - all implemented features working correctly
|
||||
|
||||
### Future Considerations
|
||||
- Email notification system needs SMTP configuration
|
||||
- PostgreSQL connection for production deployment
|
||||
- SSL certificates for v2.mad-lawsuit.org subdomain
|
||||
|
||||
## Next Actions
|
||||
|
||||
### Immediate (Phase 3 Completion)
|
||||
1. Create `database/seeders/V1DataMigrationSeeder.php`
|
||||
2. Parse SQL INSERT statements from `/tmp/v1-data.sql`
|
||||
3. Transform to Laravel Eloquent creates
|
||||
4. Run seeder: `php artisan db:seed --class=V1DataMigrationSeeder`
|
||||
5. Verify in admin dashboard
|
||||
|
||||
### Short-term (Phase 4 Preparation)
|
||||
1. Configure PostgreSQL connection in `.env`
|
||||
2. Test database connection
|
||||
3. Implement email notification system
|
||||
4. Prepare deployment scripts
|
||||
|
||||
### Long-term (Production Deployment)
|
||||
1. Deploy to v2.mad-lawsuit.org
|
||||
2. Final testing on production subdomain
|
||||
3. Switch DNS from v1.0 to v2.0
|
||||
4. Monitor for issues
|
||||
5. Decommission v1.0 after verification
|
||||
|
||||
## Success Metrics
|
||||
|
||||
### Phase 1 ✅
|
||||
- Public website matches v1.0 design: **100%**
|
||||
- All features functional: **100%**
|
||||
- Responsive design working: **100%**
|
||||
|
||||
### Phase 2 ✅
|
||||
- Admin authentication working: **100%**
|
||||
- CRUD operations functional: **100%**
|
||||
- File upload/download working: **100%**
|
||||
- UI/UX professional: **100%**
|
||||
|
||||
### Phase 3 ⏳
|
||||
- Data export complete: **100%**
|
||||
- PDF transfer complete: **100%**
|
||||
- Seeder creation: **100%**
|
||||
- Python parser created: **100%**
|
||||
- PHP arrays generated: **100%**
|
||||
- Data import: **0%** (next session)
|
||||
- Verification: **0%** (next session)
|
||||
- **Overall Phase 3**: **95%**
|
||||
|
||||
### Phase 4 ⏳
|
||||
- Not started: **0%**
|
||||
|
||||
## Overall Project Progress
|
||||
**Phases Complete**: 2 / 4 (50%)
|
||||
**Current Phase**: 3 (95% complete)
|
||||
**Estimated Completion**: Phase 3 - 20 minutes (next session), Phase 4 - 2-4 hours
|
||||
|
||||
---
|
||||
|
||||
*Last Updated: December 17, 2025 at 5:51 PM MST*
|
||||
|
|
|
|||
25
database/seeders/AdminSeeder.php
Normal file
25
database/seeders/AdminSeeder.php
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
<?php
|
||||
|
||||
namespace Database\Seeders;
|
||||
|
||||
use Illuminate\Database\Seeder;
|
||||
use App\Models\AdminUser;
|
||||
|
||||
class AdminSeeder extends Seeder
|
||||
{
|
||||
/**
|
||||
* Run the database seeds.
|
||||
*/
|
||||
public function run(): void
|
||||
{
|
||||
// Create default admin user
|
||||
AdminUser::create([
|
||||
'username' => 'admin',
|
||||
'password' => 'password', // Will be auto-hashed by AdminUser model
|
||||
]);
|
||||
|
||||
$this->command->info('Admin user created successfully!');
|
||||
$this->command->info('Username: admin');
|
||||
$this->command->info('Password: password');
|
||||
}
|
||||
}
|
||||
506
database/seeders/V1DataMigrationSeeder.php
Normal file
506
database/seeders/V1DataMigrationSeeder.php
Normal file
|
|
@ -0,0 +1,506 @@
|
|||
<?php
|
||||
|
||||
namespace Database\Seeders;
|
||||
|
||||
use Illuminate\Database\Seeder;
|
||||
use App\Models\DocketEntry;
|
||||
use App\Models\Document;
|
||||
use App\Models\Subscription;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class V1DataMigrationSeeder extends Seeder
|
||||
{
|
||||
/**
|
||||
* Run the database seeds.
|
||||
*
|
||||
* This seeder imports production data from v1.0 (Next.js/Prisma/PostgreSQL)
|
||||
* into v2.0 (Laravel/Eloquent/SQLite).
|
||||
*
|
||||
* Data source: /tmp/v1-data.sql (PostgreSQL dump from production)
|
||||
*
|
||||
* Schema mapping:
|
||||
* - docket_entries: id, date, summary, createdAt, updatedAt, notes, title
|
||||
* - documents: id, docketEntryId, originalFilename, storedFilename, filePath, title, summary, notes, fileSize, displayOrder, createdAt, updatedAt, mimeType
|
||||
* - subscriptions: id, email, isActive, unsubscribeToken, createdAt
|
||||
*/
|
||||
public function run(): void
|
||||
{
|
||||
// Disable foreign key checks for clean import
|
||||
DB::statement('PRAGMA foreign_keys = OFF');
|
||||
|
||||
// Clear existing data
|
||||
Document::truncate();
|
||||
DocketEntry::truncate();
|
||||
Subscription::truncate();
|
||||
|
||||
// Import docket entries
|
||||
$this->importDocketEntries();
|
||||
|
||||
// Import documents
|
||||
$this->importDocuments();
|
||||
|
||||
// Import subscriptions
|
||||
$this->importSubscriptions();
|
||||
|
||||
// Re-enable foreign key checks
|
||||
DB::statement('PRAGMA foreign_keys = ON');
|
||||
|
||||
$this->command->info('✅ v1.0 data migration complete!');
|
||||
$this->command->info(' - Docket Entries: ' . DocketEntry::count());
|
||||
$this->command->info(' - Documents: ' . Document::count());
|
||||
$this->command->info(' - Subscriptions: ' . Subscription::count());
|
||||
}
|
||||
|
||||
private function importDocketEntries(): void
|
||||
{
|
||||
$entries = [
|
||||
['id' => 12, 'date' => '2025-06-06', 'summary' => 'Elizabeth Kragh swears under oath that the Montana Association of the Deaf cannot be on active military duty because it is a nonprofit corporation, not a person, and that MAD\'s registered agent Kirk Hash Jr. is Deaf and therefore ineligible for military service due to hearing requirements. This affidavit is required by federal law to ensure that people in the military are not unfairly treated in court cases, but since MAD is an organization and its agent is Deaf, military protections do not apply.', 'created_at' => '2025-06-25 22:25:16.605', 'updated_at' => '2025-06-25 22:49:54.761', 'notes' => '', 'title' => 'Affidavit of Military Service Check (ServiceMembers Civil Relief Act Compliance) (Filed By Kragh, Elizabeth on behalf of )'],
|
||||
['id' => 5, 'date' => '2025-05-07', 'summary' => 'Elizabeth Kragh is suing the Montana Association of the Deaf (MAD) for three ultra vires actions. First, MAD won\'t let her see meeting records even though Montana law says she has the right to see them. Second, MAD\'s leaders were elected by acclamation instead of written ballots like their rules require. Third, $888 is missing from money reports and the people who should watch the money admit they haven\'t been doing their job.', 'created_at' => '2025-06-25 22:13:26.291', 'updated_at' => '2025-06-25 22:49:54.727', 'notes' => '', 'title' => 'Complaint (Filed By Kragh, Elizabeth on behalf of )'],
|
||||
['id' => 8, 'date' => '2025-05-16', 'summary' => 'This document corrects and replaces the original certificate of service, confirming that Elizabeth Kragh properly delivered the lawsuit papers to the Montana Association of the Deaf through their registered agent Kirk Hash Jr. A professional process server from Equity Process Management served Kirk Hash Jr. on May 13, 2025, at the Partnership Health Center in Missoula, Montana.', 'created_at' => '2025-06-25 22:17:34.223', 'updated_at' => '2025-06-25 22:49:54.738', 'notes' => '', 'title' => 'Amended Certificate of Service (Filed By Kragh, Elizabeth on behalf of )'],
|
||||
['id' => 9, 'date' => '2025-05-14', 'summary' => 'This document proves that Elizabeth Kragh properly delivered the lawsuit papers to the Montana Association of the Deaf through their designated agent Kirk Hash Jr. A professional process server handed the legal documents to Kirk Hash Jr. on May 13, 2025, at the Partnership Health Center in Missoula, Montana.', 'created_at' => '2025-06-25 22:19:21.997', 'updated_at' => '2025-06-25 22:49:54.744', 'notes' => '', 'title' => 'Certificate of Service (Filed By Kragh, Elizabeth on behalf of )'],
|
||||
['id' => 10, 'date' => '2025-05-12', 'summary' => 'This is an official court document that notifies the Montana Association of the Deaf that Elizabeth Kragh has filed a lawsuit against them. The summons orders MAD to respond to the lawsuit within 21 days or the court will rule against them by default.', 'created_at' => '2025-06-25 22:21:22.374', 'updated_at' => '2025-06-25 22:49:54.75', 'notes' => '', 'title' => 'Summons Issued on Montana Association of the Deaf Inc. 05/12/2025'],
|
||||
['id' => 11, 'date' => '2025-06-05', 'summary' => 'The Montana Association of the Deaf calls Elizabeth Kragh\'s lawsuit "frivolous" and accuses her of "harassment" without providing evidence to support their legal defenses. Instead of addressing the specific legal violations Kragh raised, MAD focuses on personal attacks against her character and claims about her past behavior with their local chapter. MAD admits they required Kragh to sign a "zero-tolerance policy" to access meeting minutes but doesn\'t explain why this requirement is legal under Montana law.', 'created_at' => '2025-06-25 22:23:22.573', 'updated_at' => '2025-06-25 22:49:54.755', 'notes' => '', 'title' => 'Answer to Complaint (Filed By Montana Association of the Deaf Inc. on behalf of )'],
|
||||
['id' => 13, 'date' => '2025-06-06', 'summary' => ' Elizabeth Kragh swears under oath that MAD was properly served with the lawsuit papers on May 13, 2025, through their registered agent Kirk Hash Jr., giving them 21 days until June 3, 2025, to respond. She states that MAD failed to file any response, motion, or have any attorney appear on their behalf, making them in default and eligible for a default judgment.', 'created_at' => '2025-06-25 22:26:19.853', 'updated_at' => '2025-06-25 22:49:54.768', 'notes' => '', 'title' => 'Affidavit of Service and Non-Appearance (Filed By Kragh, Elizabeth on behalf of )'],
|
||||
['id' => 14, 'date' => '2025-06-06', 'summary' => 'This is a draft default judgment order that would rule in favor of Elizabeth Kragh if the Montana Association of the Deaf fails to respond to the lawsuit. The proposed order would find that MAD violated Montana law by refusing to provide meeting minutes, improperly elected officers by acclamation instead of written ballot, and failed in financial oversight with an unexplained $888.54 missing from reports. If signed by the judge, it would order MAD to provide all requested records, follow proper election procedures, give complete financial accounting, and pay for an independent auditor to examine their books.', 'created_at' => '2025-06-25 22:27:19.37', 'updated_at' => '2025-06-25 22:49:54.775', 'notes' => '', 'title' => 'Motion for Default Judgment (Filed By Kragh, Elizabeth on behalf of ) 278719 '],
|
||||
['id' => 16, 'date' => '2025-06-06', 'summary' => 'Elizabeth Kragh formally asks the court to rule in her favor because MAD failed to respond to her lawsuit within the required 21-day deadline that expired on June 3, 2025. She argues that MAD\'s silence legally admits to all her allegations about blocking records access, conducting improper elections, and financial oversight failures. Kragh requests the court enter default judgment and grant relief including immediate access to meeting minutes, proper financial reporting, and appointment of an independent auditor to examine MAD\'s financial records.', 'created_at' => '2025-06-25 22:29:11.492', 'updated_at' => '2025-06-25 22:49:54.791', 'notes' => '', 'title' => 'Proposed Order on Default Judgment 278719'],
|
||||
['id' => 17, 'date' => '2025-06-06', 'summary' => 'Elizabeth Kragh asks the court to immediately stop MAD from holding their scheduled June 12-14, 2025 conference because the current officers were improperly elected and lack proper authority to make decisions for the organization. She argues that allowing these ultra vires officers to conduct business meetings, make financial decisions, and hold elections at the conference would cause irreparable harm that cannot be fixed later. Kragh requests the court allow educational and social activities at the conference to continue but block all official business and governance activities until the legal issues are resolved.', 'created_at' => '2025-06-25 22:30:23.578', 'updated_at' => '2025-06-25 22:49:54.798', 'notes' => '', 'title' => 'Motion for Temporary Restraining Order (Filed By Kragh, Elizabeth on behalf of )'],
|
||||
['id' => 6, 'date' => '2025-05-07', 'summary' => 'The exhibits show the Montana Association of the Deaf\'s official bylaws for how the organization should operate. Email records show that when member Elizabeth Kragh asked for meeting minutes, MAD\'s secretary refused to give them to her and required her to sign a "zero-tolerance policy" first. Meeting minutes from 2023-2024 show the organization\'s activities, financial reports, and board decisions during the time period in question.', 'created_at' => '2025-06-25 22:15:24.183', 'updated_at' => '2025-09-05 19:52:01.437', 'notes' => '', 'title' => 'Complaint Exhibits'],
|
||||
['id' => 1, 'date' => '2025-05-07', 'summary' => 'Elizabeth Kragh swears under oath that she made four written requests for MAD meeting minutes but was denied access and told she must sign a "zero-tolerance policy" to get them, even though Montana law doesn\'t allow such conditions. She also states that MAD\'s officers were improperly elected by acclamation instead of written ballot as required by their bylaws, and that she witnessed financial problems including missing money and trustees admitting they failed to do their oversight duties.', 'created_at' => '2025-06-25 20:20:09.097', 'updated_at' => '2025-06-25 22:49:54.719', 'notes' => '', 'title' => 'Affidavit in Support of Complaint (Filed By Kragh, Elizabeth on behalf of )'],
|
||||
['id' => 19, 'date' => '2025-06-09', 'summary' => 'Elizabeth Kragh asks the court to throw out MAD\'s answer because Tyler Hansen, who is not a lawyer, illegally filed legal documents on behalf of the corporation, which violates Montana law requiring corporations to be represented by licensed attorneys. She argues that Hansen\'s unauthorized answer actually admits to all the violations she sued about, including blocking records access, conducting improper elections, and financial oversight failures. Kragh requests the court strike the invalid answer, find Hansen engaged in unauthorized practice of law, impose sanctions, and return MAD to default status for her pending motion for default judgment.
|
||||
', 'created_at' => '2025-06-25 22:37:54.713', 'updated_at' => '2025-06-25 22:49:54.812', 'notes' => '', 'title' => 'Motion to Strike Answer for Unauthorized Practice of Law Alternative Reply Brief: Defendant\'s Admissions Confirm Every Allegation (Filed By Kragh, Elizabeth on behalf of Kragh, Elizabeth )'],
|
||||
['id' => 20, 'date' => '2025-06-09', 'summary' => 'This is a draft court order that would strike Tyler Hansen\'s answer from the court record because he illegally practiced law by representing the Montana Association of the Deaf without a license, violating Montana law that requires corporations to have licensed attorneys. The proposed order would find Hansen engaged in unauthorized practice of law, prohibit him from filing any more legal documents, refer him to Montana authorities for investigation, and return MAD to default status. The order would also require Hansen to pay court costs and allow the case to proceed to consideration of Kragh\'s motion for default judgment.', 'created_at' => '2025-06-25 22:38:56.552', 'updated_at' => '2025-06-25 22:49:54.818', 'notes' => '', 'title' => 'Proposed Order Granting Motion to Strike Answer for Unauthorized Practice of Law'],
|
||||
['id' => 21, 'date' => '2025-06-09', 'summary' => ' Elizabeth Kragh asks the court to impose sanctions against Tyler Hansen for violating court rules when he filed an unauthorized answer that focused on personal attacks against her rather than addressing the legal issues in the case. She argues that Hansen\'s answer violated all four parts of Rule 11 by being filed for improper purposes, containing legally frivolous arguments, making factual claims without evidence, and providing inadequate denials of her allegations. Kragh requests the court prohibit Hansen from filing more legal documents without a lawyer, require him to take legal education courses, refer him for unauthorized practice investigation, and impose monetary penalties to deter similar misconduct.', 'created_at' => '2025-06-25 22:39:58.278', 'updated_at' => '2025-06-25 22:49:54.824', 'notes' => '', 'title' => 'Motion for Rule 11 Sanctions Against Tyler Hansen (Filed By Kragh, Elizabeth on behalf of Kragh, Elizabeth )'],
|
||||
['id' => 22, 'date' => '2025-06-09', 'summary' => 'This is a draft court order that would impose Rule 11 sanctions against Tyler Hansen for filing an unauthorized answer that violated court rules by containing personal attacks, legally frivolous arguments, and factual claims without evidence. The proposed sanctions include prohibiting Hansen from filing any more legal documents without a lawyer, requiring him to take a legal education course, referring him to authorities for unauthorized practice of law, and paying a monetary penalty to the court. The order would also require Hansen to notify all MAD board members of the court\'s restrictions and would make his admissions from the unauthorized answer binding for the rest of the lawsuit.', 'created_at' => '2025-06-25 22:40:54.24', 'updated_at' => '2025-06-25 22:49:54.83', 'notes' => '', 'title' => 'Proposed Order Granting Motion for Rule 11 Sanctions Against Tyler Hansen'],
|
||||
['id' => 23, 'date' => '2025-06-10', 'summary' => 'Judge Tara Elliott granted Elizabeth Kragh\'s motion to strike Tyler Hansen\'s unauthorized answer, ruling that Hansen illegally practiced law by representing the Montana Association of the Deaf without a license, which violates Montana law requiring corporations to have licensed attorneys. The court struck Hansen\'s answer from the record and gave MAD 45 days to hire a real lawyer and file a proper response that follows Montana law. Kragh won on her motion to strike while the court denied her other motions for default judgment, temporary restraining order, and sanctions, but her main legal victory established that MAD\'s defense was invalid and must be refiled through proper legal representation.', 'created_at' => '2025-06-25 22:41:49.607', 'updated_at' => '2025-06-25 22:49:54.836', 'notes' => '', 'title' => 'Order Denying Petitioner\'s Motion for Default Judgement, Motion for Temporary Restraining Order and Motion for Sanctions and Granting the Motion to Strike'],
|
||||
['id' => 24, 'date' => '2025-06-11', 'summary' => 'Elizabeth Kragh asks the court for a preliminary injunction to stop the Montana Association of the Deaf\'s ongoing violations while MAD searches for a lawyer, arguing that eight months of documented violations including records obstruction, ultra vires elections, and financial oversight failures demand immediate court action. She offers the court multiple options for relief, from full preliminary injunction to limited relief ensuring proper election procedures at MAD\'s upcoming June 12-14 conference, while acknowledging the procedural challenge that MAD currently lacks legal representation. Kragh emphasizes that MAD\'s current predicament flows directly from their own choices to violate laws and bylaws for eight months, then lose their unauthorized defense, making judicial intervention necessary to protect member rights and organizational integrity.', 'created_at' => '2025-06-25 22:42:41.797', 'updated_at' => '2025-06-25 22:49:54.844', 'notes' => '', 'title' => 'Motion for Preliminary Injunction (Filed By Kragh, Elizabeth on behalf of Kragh, Elizabeth )'],
|
||||
['id' => 25, 'date' => '2025-06-11', 'summary' => 'This is a draft court order that would grant Elizabeth Kragh\'s request for a preliminary injunction, requiring the Montana Association of the Deaf to immediately stop conducting elections by acclamation and use written ballots as required by their bylaws, provide all meeting minutes from June 2023 to present without unauthorized conditions, and deliver written financial reports explaining the missing $888.54. The proposed order would also prohibit MAD from making major organizational decisions or financial commitments beyond routine operations until the legal issues are resolved, and would require compliance within specific timeframes (10 days for records, 15 days for financial reports). The order includes enforcement provisions allowing contempt proceedings for violations and requires MAD to notify members about the court\'s requirements while prohibiting them from mischaracterizing the order\'s terms.', 'created_at' => '2025-06-25 22:43:26.377', 'updated_at' => '2025-06-25 22:49:54.85', 'notes' => '', 'title' => 'Proposed Order Granting Preliminary Injunction'],
|
||||
['id' => 15, 'date' => '2025-06-06', 'summary' => ' Elizabeth Kragh argues that MAD\'s failure to respond to her lawsuit within the required 21 days means the court should automatically rule in her favor on all three violations she alleged. She states that MAD\'s silence legally admits to blocking records access, conducting improper elections by acclamation, and failing to oversee nearly $900 in missing funds while trustees admitted they never checked the books. Kragh requests the court grant her motion for default judgment and order immediate relief including access to records, proper financial oversight, and an independent audit of MAD\'s finances.', 'created_at' => '2025-06-25 22:28:12.719', 'updated_at' => '2025-06-25 22:49:54.781', 'notes' => '', 'title' => 'Supporting Memorandum of Law in Support of Motion for Default Judgment (Filed By Kragh, Elizabeth on behalf of ) 278719 '],
|
||||
['id' => 18, 'date' => '2025-06-06', 'summary' => 'This is a draft temporary restraining order template that would stop the Montana Association of the Deaf from conducting official business at their June 12-14, 2025 conference if signed by the judge. The proposed order would prohibit MAD from holding business meetings, elections, and making financial decisions while allowing educational and social activities to continue. The document contains blank spaces for the judge to fill in specific dates, times, and security amounts if the order is granted.', 'created_at' => '2025-06-25 22:31:30.046', 'updated_at' => '2025-06-25 22:49:54.806', 'notes' => '', 'title' => 'Proposed Temporary Restraining Order'],
|
||||
['id' => 27, 'date' => '2025-07-24', 'summary' => 'On July 24, 2025, MAD responded to the lawsuit through their lawyer, Peter Lacny. Here\'s what their response says in simple terms:
|
||||
|
||||
MAD\'s response goes through each point in the original lawsuit and either agrees with it, disagrees with it, or says they don\'t have enough information to know. This is the standard way organizations respond to lawsuits.
|
||||
|
||||
MAD gives several reasons why they think the lawsuit should be dismissed. They say the lawsuit doesn\'t properly explain what they did wrong and that too much time has passed to bring some claims. They argue that some issues have already been fixed and that the person suing them has also done wrong things. MAD claims their board made reasonable decisions and that the person suing gave up certain rights. They insist they followed all the laws and that no real harm was caused. They also point out that the person resigned from positions and that courts shouldn\'t get involved in organization decisions.
|
||||
|
||||
In addition to defending themselves, MAD is also suing back. They claim that the person has said untrue things about MAD, interfered with how MAD runs, and used MAD\'s name when working with other organizations. These counter-claims ask the court to rule in MAD\'s favor and stop the person from continuing these actions.', 'created_at' => '2025-07-25 21:37:25.45', 'updated_at' => '2025-07-28 03:01:10.602', 'notes' => '', 'title' => 'Answer (Filed By Lacny, Peter on behalf of Montana Association of the Deaf Inc. )'],
|
||||
['id' => 26, 'date' => '2025-07-24', 'summary' => 'On July 24, 2025, Peter F. Lacny, a lawyer from the firm McFarland Molloy Lacny & Duerk, filed a Notice of Appearance with the court. This is a simple document that officially tells the court that Peter Lacny will be representing MAD in this lawsuit. Before this notice was filed, MAD did not have a lawyer officially recognized by the court. This document is important because it means all future court papers and communications about the case should now go to Peter Lacny instead of directly to MAD. It also shows that MAD has hired professional legal representation to defend against the lawsuit.', 'created_at' => '2025-07-25 21:34:48.438', 'updated_at' => '2025-07-28 03:01:32.129', 'notes' => '', 'title' => 'Notice of Appearance (Filed By Lacny, Peter on behalf of Montana Association of the Deaf Inc. )'],
|
||||
['id' => 36, 'date' => '2025-08-14', 'summary' => 'On August 12, 2025, Elizabeth Kragh filed a notice informing the court that she served discovery requests on MAD.
|
||||
|
||||
What happened:
|
||||
The Plaintiff sent three types of legal requests to MAD\'s attorney:
|
||||
|
||||
- Document production requests (asking for specific records)
|
||||
- Interrogatories (written questions requiring sworn answers)
|
||||
- Requests for admission (asking MAD to confirm or deny certain facts)
|
||||
|
||||
What this means:
|
||||
Discovery is the standard legal process where both parties exchange information and documents before trial. Both sides can request evidence from each other.
|
||||
|
||||
Timeline:
|
||||
MAD has 30 days to respond to these requests under court rules.
|
||||
|
||||
Status:
|
||||
The case has moved into the discovery phase, where both parties will gather and exchange information relevant to the lawsuit.', 'created_at' => '2025-08-22 13:48:17.057', 'updated_at' => '2025-08-24 15:17:56.236', 'notes' => '', 'title' => 'Notice of Service of Discovery Requests (Filed By Kragh, Elizabeth on behalf of Kragh, Elizabeth )'],
|
||||
['id' => 31, 'date' => '2025-08-08', 'summary' => 'Elizabeth Kragh has asked the court to pause or limit MAD\'s discovery requests until the judge decides whether to dismiss MAD\'s counterclaims.
|
||||
|
||||
What Happened: On August 7, MAD sent Kragh 25 discovery requests asking for documents, answers to questions, and admissions. Many requests relate to MAD\'s counterclaims, which Kragh is trying to get dismissed.
|
||||
|
||||
Kragh\'s Request: She wants the court to either:
|
||||
|
||||
- Stop all discovery related to MAD\'s counterclaims until the dismissal motion is decided
|
||||
- Limit discovery to only her original lawsuit claims
|
||||
- Extend her response deadline from September 6 to 30 days after the court rules
|
||||
|
||||
Why She Filed This:
|
||||
|
||||
- Many discovery requests seem designed to harass rather than find relevant information
|
||||
- Requests ask about personal communications, social media posts, and unrelated organizations
|
||||
- As a pro se plaintiff, responding is invasive and time-consuming
|
||||
- If MAD\'s counterclaims get dismissed, this discovery becomes pointless
|
||||
|
||||
Privacy Concerns: Some requests violate Montana\'s strong constitutional privacy protections by seeking personal information without good reason.
|
||||
|
||||
Legal Basis:
|
||||
Montana courts can issue protective orders to prevent "undue burden" and have authority to pause discovery when claims might be dismissed.
|
||||
|
||||
Timing:
|
||||
Kragh requested expedited consideration since her discovery responses are due September 6.
|
||||
', 'created_at' => '2025-08-11 20:04:58.042', 'updated_at' => '2025-08-11 20:04:58.042', 'notes' => '', 'title' => 'Plaintiff\'s Motion for Protective Order Regarding Defendant\'s First Combined Discovery Requests (Filed By Kragh, Elizabeth on behalf of Kragh, Elizabeth )'],
|
||||
['id' => 33, 'date' => '2025-08-07', 'summary' => 'Defendant MAD\'s counsel served discovery requests upon Plaintiff Elizabeth Kragh in connection with their filed counterclaims and subsequently filed a notice of service with the court clerk. This represents a standard procedural step in the litigation process where parties seek relevant information from each other to support their respective claims and defenses.', 'created_at' => '2025-08-12 16:45:07.182', 'updated_at' => '2025-09-05 19:54:07.288', 'notes' => '', 'title' => 'Notice of Service'],
|
||||
['id' => 29, 'date' => '2025-08-08', 'summary' => 'Why This Was Filed:
|
||||
After Elizabeth Kragh sued MAD over governance violations, MAD responded with three counterclaims against her. Kragh filed this motion asking the court to dismiss those counterclaims because they don\'t meet basic legal requirements.
|
||||
|
||||
MAD\'s Counterclaims: MAD wants the court to (1) declare they followed proper procedures, (2) stop Kragh from alleged interference, and (3) make Kragh pay their attorney fees.
|
||||
|
||||
Kragh\'s Arguments:
|
||||
Montana law requires legal claims to include specific facts, not vague accusations. MAD\'s counterclaims fail this test by:
|
||||
|
||||
Claiming Kragh made "false statements" without saying what statements or when
|
||||
- Seeking to stop "interference" without describing specific conduct
|
||||
- Requesting attorney fees without factual basis for bad faith claims
|
||||
- Filing ten defenses that are just legal labels with no supporting details
|
||||
|
||||
Legal Standard: Montana requires organizations seeking court orders to identify specific injured members by name and address, which MAD didn\'t do.
|
||||
|
||||
Kragh\'s Position:
|
||||
The counterclaims appear designed to justify broad discovery requests rather than address legitimate legal issues, potentially turning the focus away from MAD\'s documented governance problems.
|
||||
|
||||
Outcome:
|
||||
The court will decide whether to dismiss the counterclaims.', 'created_at' => '2025-08-11 19:46:51.167', 'updated_at' => '2025-08-11 19:46:51.167', 'notes' => '', 'title' => 'Motion to Dismiss Counterclaims (Filed By Kragh, Elizabeth on behalf of Kragh, Elizabeth )'],
|
||||
['id' => 30, 'date' => '2025-08-08', 'summary' => 'Elizabeth Kragh has written a draft court order that Judge Elliott could sign if the judge agrees to dismiss MAD\'s counterclaims.
|
||||
|
||||
What MAD Filed:
|
||||
Three counterclaims asking the court to say they followed the rules, stop Kragh from interfering, and make her pay their lawyer bills.
|
||||
|
||||
The Problem:
|
||||
MAD\'s counterclaims don\'t include specific facts. They make vague accusations like "Kragh made false statements" but don\'t say what statements, when, or to whom. Montana law requires enough details so people know what they\'re accused of.
|
||||
|
||||
What the Order Would Do:
|
||||
|
||||
- Throw out all of MAD\'s counterclaims
|
||||
- Remove their ten defenses
|
||||
- Give MAD 20 days to try again with proper facts
|
||||
|
||||
Key Finding:
|
||||
The order notes that MAD\'s filings appear designed to force invasive legal discovery rather than address real issues.
|
||||
|
||||
"Without Prejudice" Dismissal: This means MAD gets another chance. They can refile within 20 days if they include specific dates, examples, and facts. For court orders, they must also name actual injured members as Montana law requires.
|
||||
|
||||
Bottom Line:
|
||||
The proposed order would require MAD to either provide real evidence for their claims or drop them, while giving them one fair opportunity to file properly.
|
||||
', 'created_at' => '2025-08-11 19:59:25.733', 'updated_at' => '2025-08-11 19:59:25.733', 'notes' => '', 'title' => 'Proposed Order Granting Plaintiff\'s Motion to Dismiss Counterclaims and Strike Affirmative Defenses'],
|
||||
['id' => 32, 'date' => '2025-08-08', 'summary' => 'Elizabeth Kragh has written a draft court order that Judge Elliott could sign to protect her from MAD\'s discovery requests.
|
||||
|
||||
The Situation:
|
||||
MAD sent Kragh 25 discovery requests asking for documents and information. Many requests relate to MAD\'s counterclaims, which Kragh wants dismissed.
|
||||
|
||||
What the Proposed Order Does:
|
||||
|
||||
- Stops discovery about MAD\'s counterclaims until the court decides whether to dismiss them
|
||||
- Allows MAD to only request information about Kragh\'s original claims
|
||||
- Extends Kragh\'s response deadline to 30 days after the dismissal decision
|
||||
- Orders both parties to meet within 14 days after the court rules
|
||||
|
||||
Why This Would Be Granted:
|
||||
The order finds that many discovery requests would burden Kragh unfairly, especially since the counterclaims might be dismissed anyway. Some requests seek personal information that violates Montana\'s privacy protections without good reason.
|
||||
|
||||
Key Considerations:
|
||||
|
||||
- Kragh represents herself and has fewer resources than MAD\'s legal team
|
||||
- Responding to discovery about invalid claims wastes time and court resources
|
||||
- Montana law protects people from invasive discovery requests
|
||||
|
||||
Result:
|
||||
If the judge signs this order, Kragh would be protected from having to respond to most of MAD\'s discovery requests until the court decides whether MAD\'s counterclaims are legally valid.
|
||||
', 'created_at' => '2025-08-11 20:10:03.902', 'updated_at' => '2025-08-11 20:10:03.902', 'notes' => '', 'title' => 'Proposed Order Plaintiff\'s Motion for Protective Order Regarding Defendant\'s First Combined Discovery Requests'],
|
||||
['id' => 41, 'date' => '2025-08-18', 'summary' => 'On August 18, 2025, Elizabeth Kragh filed a motion asking the court to withdraw her request for emergency relief against the Montana Association of the Deaf (MAD).
|
||||
|
||||
Background:
|
||||
In June, the Plaintiff sought urgent intervention before MAD\'s biennial conference to prevent election violations. She was concerned MAD would repeat 2023\'s improper elections, when officers were chosen "by acclamation" instead of using written ballots as required by MAD\'s bylaws.
|
||||
|
||||
Reason for withdrawal:
|
||||
The conference concluded, making emergency relief unnecessary.
|
||||
|
||||
Impact:
|
||||
This withdrawal doesn\'t affect Kragh\'s main lawsuit. The Plaintiff continues pursuing claims about MAD\'s refusal to provide meeting minutes and financial records, improperly elected officers, and financial oversight failures including an unexplained $888 discrepancy.
|
||||
|
||||
Next steps:
|
||||
Elizabeth Kragh can address records access through normal discovery processes while pursuing MAD\'s governance violations and transparency failures.
|
||||
', 'created_at' => '2025-08-24 15:20:26.268', 'updated_at' => '2025-08-24 15:21:17.99', 'notes' => '', 'title' => 'Motion to Withdraw Preliminary Injunction Motion (Filed By Kragh, Elizabeth on behalf of Kragh, Elizabeth )'],
|
||||
['id' => 42, 'date' => '2025-08-18', 'summary' => 'On August 18, 2025, Elizabeth Kragh filed a supplemental notice regarding a procedural requirement in two previous court filings.
|
||||
|
||||
Background:
|
||||
The Plaintiff had filed two motions in August:
|
||||
|
||||
- Motion to Dismiss MAD\'s Counterclaims
|
||||
- Motion for Protective Order regarding discovery requests
|
||||
|
||||
The issue:
|
||||
Local court rules require parties to contact opposing counsel before filing motions and inform the court whether the other side objects. This step was initially omitted from both filings.
|
||||
|
||||
Resolution:
|
||||
After learning of the requirement, Kragh contacted MAD\'s attorney, Peter Lacny, on August 18th. Lacny confirmed that MAD opposes both motions. The Plaintiff then filed this supplemental notice to inform the court of these positions.
|
||||
|
||||
Outcome:
|
||||
The court now has the required information about both parties\' positions on the pending motions. Both motions will proceed as contested matters, with MAD opposing the requests for dismissal and protective order.', 'created_at' => '2025-08-24 15:22:17.885', 'updated_at' => '2025-08-24 15:23:09.485', 'notes' => '', 'title' => 'Supplemental Notice Regarding Rule 3(G)(2) Compliance (Filed By Kragh, Elizabeth on behalf of Kragh, Elizabeth )'],
|
||||
['id' => 43, 'date' => '2025-08-20', 'summary' => 'This is a court filing in a lawsuit between Elizabeth Kragh and the Montana Association of the Deaf. The defendant\'s lawyer is asking the judge to approve a proposed timeline for how the case will proceed. This timeline document (called a "scheduling order") sets deadlines for various steps in the lawsuit, such as when evidence must be shared, when depositions can occur, and when the trial might happen. Both sides have agreed to this proposed schedule - the plaintiff has no objections. The lawyer is formally requesting that the judge review and officially adopt this agreed-upon timeline for the case.', 'created_at' => '2025-08-26 21:16:38.871', 'updated_at' => '2025-08-26 21:17:45.65', 'notes' => '', 'title' => 'Notice of Filing Proposed Scheduling Order (Filed By Lacny, Peter on behalf of Montana Association of the Deaf Inc. )'],
|
||||
['id' => 54, 'date' => '2025-10-06', 'summary' => 'Montana Association of the Deaf filed a legal motion asking the court to rule in their favor without a trial in a lawsuit brought by Elizabeth Kragh. They claim there are no factual disputes requiring a jury trial.', 'created_at' => '2025-10-08 18:22:12.518', 'updated_at' => '2025-10-08 18:22:12.518', 'notes' => '', 'title' => 'Defendant\'s Motion for Summary Judgment (Filed By Lacny, Peter on behalf of Montana Association of the Deaf Inc. )'],
|
||||
['id' => 44, 'date' => '2025-08-20', 'summary' => 'The court may establish a timeline for Elizabeth Kragh\'s lawsuit against the Montana Association of the Deaf that runs from now through June 2026, providing Ms. Kragh with nearly a full year to gather evidence, identify expert witnesses, and build her case. During this period, both parties may engage in discovery—the process of sharing relevant documents and information—with all evidence collection completed by March 2026 and final preparations finished by April 2026. The court may prioritize resolution by requiring a settlement conference by June 30, 2026, where a neutral mediator will help both sides explore potential agreements that could address Ms. Kragh\'s concerns without the need for a lengthy trial. If no settlement is reached, the case will proceed to trial with dates set after the conference concludes. Both parties have agreed to this schedule, and the court has emphasized that all information requests must be answered fairly and completely, ensuring Ms. Kragh has access to the evidence needed to present her case effectively.', 'created_at' => '2025-08-26 21:18:24.803', 'updated_at' => '2025-08-26 21:19:21.805', 'notes' => '', 'title' => 'Proposed Scheduling Order'],
|
||||
['id' => 46, 'date' => '2025-08-22', 'summary' => 'Elizabeth Kragh asked the court to pause discovery (the process where both sides share evidence) until her motion to dismiss MAD\'s counterclaims is decided. MAD opposes this request.
|
||||
|
||||
MAD argues that Kragh didn\'t follow proper procedure by failing to discuss the issue with them before asking the court for protection. They contend that most of their 25 discovery requests focus on Kragh\'s own allegations against MAD, not their counterclaims against her.
|
||||
|
||||
The discovery requests (attached as Exhibit A to MAD\'s response) ask Kragh to identify witnesses, provide documents supporting her claims about improper elections and financial oversight, detail her damages, and disclose communications with third parties about the lawsuit. MAD also seeks admissions about specific incidents, including whether Kragh filed a police report against a MAD treasurer and refused to sign a policy document.
|
||||
|
||||
MAD acknowledges Kragh is representing herself without a lawyer but argues their requests are standard for litigation. They offer accommodations like accepting responses in stages and granting time extensions.
|
||||
|
||||
MAD maintains that Montana\'s discovery rules are broad and allow information gathering on counterclaims, impeachment evidence, and credibility issues. They argue their counterclaims arise from the same facts as Kragh\'s claims, justifying simultaneous discovery.
|
||||
', 'created_at' => '2025-08-26 21:36:19.767', 'updated_at' => '2025-08-26 21:37:24.678', 'notes' => '', 'title' => 'Defendant\'s Response to Plaintiff\'s Motion for a Protective Order (Filed By Lacny, Peter on behalf of Montana Association of the Deaf Inc. )'],
|
||||
['id' => 47, 'date' => '2025-08-25', 'summary' => 'Judge Tara Elliott established a timeline for the lawsuit between Kragh and MAD. The order sets deadlines for when both sides must complete evidence gathering (discovery), identify expert witnesses, exchange exhibits, and file major legal motions. The court emphasizes that all parties must respond fairly and accurately to discovery requests or face potential sanctions. The schedule includes mandatory settlement conferences to encourage resolution without trial. If the case doesn\'t settle, it will proceed to trial scheduling. Both parties agreed to this timeline.', 'created_at' => '2025-08-31 19:04:08.01', 'updated_at' => '2025-08-31 19:04:59.313', 'notes' => '', 'title' => 'Scheduling Order'],
|
||||
['id' => 72, 'date' => '2025-10-29', 'summary' => 'This is the court\'s electronic filing receipt confirming that Judge Tara Elliott granted Plaintiff Elizabeth Kragh\'s motion to extend time on October 29, 2025. The receipt shows the order was electronically signed at 8:56 AM by Judge Elliott. Like the earlier order granting the motion to strike, only the court\'s filing stamp and electronic signature are present in this PDF. The filing confirms that Plaintiff Elizabeth Kragh\'s request for additional time (extending her reply brief deadline from November 3 to November 17, 2025) was approved by the judge, as requested in her motion filed October 28, 2025.', 'created_at' => '2025-11-09 23:40:37.164', 'updated_at' => '2025-11-13 20:30:00.763', 'notes' => '', 'title' => 'Order Granting Motion to Extend Time For Filing Reply Briefs'],
|
||||
['id' => 71, 'date' => '2025-10-28', 'summary' => 'This motion requests more time to file reply briefs in response to the Montana Association of the Deaf\'s responses filed October 24, 2025. Under court rules, Plaintiff Elizabeth Kragh\'s replies were originally due November 3, 2025 (ten days after receiving MAD\'s responses). However, Plaintiff Kragh is on a business trip from October 28 through November 2, 2025, and doesn\'t have access to her case files and legal research materials. She asks for a two-week extension, making the new deadline November 17, 2025. Plaintiff Kragh contacted MAD\'s attorney who confirmed they don\'t object to the extension. Since both sides agree and the delay won\'t harm either party, such motions are typically granted routinely by judges.', 'created_at' => '2025-11-09 23:39:13.429', 'updated_at' => '2025-11-13 20:30:30.535', 'notes' => '', 'title' => 'Motion to Extend Time for Filing Reply Briefs (Filed By Kragh, Elizabeth on behalf of Kragh, Elizabeth )'],
|
||||
['id' => 48, 'date' => '2025-08-29', 'summary' => 'MAD\'s lawyers are defending against Kragh\'s attempt to throw out their legal claims and defenses. They argue that Montana courts use very lenient standards for legal pleadings - requiring only a "short and plain statement" rather than detailed facts.
|
||||
|
||||
MAD contends their counterclaims are "compulsory," meaning they must be filed because they arise from the same disputes Kragh raised. They claim they don\'t need to provide specific facts because their legal documents reference all the allegations from Kragh\'s original complaint.
|
||||
|
||||
Regarding the requirement to name specific injured members, MAD argues this law only applies to organizations that start lawsuits, not defendants responding to being sued. They also claim they\'re only seeking general protection for the organization, not damages for individual members.
|
||||
|
||||
MAD\'s position is essentially: "It\'s too early to dismiss our claims - let us gather evidence first through the discovery process, then decide if our case has merit." They request that if the judge finds problems with their pleadings, they should be allowed to rewrite them rather than having them dismissed entirely.
|
||||
', 'created_at' => '2025-09-05 02:24:08.135', 'updated_at' => '2025-09-05 02:25:02.604', 'notes' => '', 'title' => 'Defendant\'s Response to Plaintiff\'s Motion to Dismiss and Strike (Filed By Lacny, Peter on behalf of Montana Association of the Deaf Inc. )'],
|
||||
['id' => 28, 'date' => '2025-07-25', 'summary' => 'Lawsuit Schedule: What This Court Filing Means-
|
||||
|
||||
What Happened:
|
||||
The judge created a timeline for Elizabeth Kragh\'s case against the Montana Association of the Deaf. This protects the plaintiff\'s rights and keeps the case moving forward.
|
||||
|
||||
Step-by-Step Process:
|
||||
|
||||
Step 1 (Next 30 Days):
|
||||
Elizabeth Kragh must email MAD\'s lawyer (Peter Lacny) to agree on specific dates for all deadlines. Since she\'s representing herself (pro se), she\'ll communicate directly with opposing counsel via email and submit the agreed schedule to court.
|
||||
|
||||
Step 2 (7 Months):
|
||||
Discovery phase - Kragh can demand documents, emails, and information from MAD. They must respond honestly. Kragh also has to answer MAD\'s requests fairly.
|
||||
|
||||
Step 3:
|
||||
Both sides identify expert witnesses who can testify about technical issues in the case.
|
||||
|
||||
Step 4:
|
||||
Mandatory settlement meetings - first Kragh meets directly with MAD\'s lawyer, then both parties try negotiating with a neutral court-appointed person.
|
||||
|
||||
Step 5: If no settlement, they prepare for trial with final witness lists and evidence.
|
||||
|
||||
Email Communication with MAD\'s Lawyer:
|
||||
Since Kragh is pro se, she emails Peter Lacny directly. All correspondence should be professional and documented via email. She must coordinate scheduling, exchange information, and handle all legal discussions herself through email communication.
|
||||
|
||||
Key Point:
|
||||
Every deadline matters. This schedule ensures MAD can\'t delay the case and guarantees Kragh gets access to information needed to prove her claims.
|
||||
', 'created_at' => '2025-08-05 22:23:29.461', 'updated_at' => '2025-09-05 19:53:52.584', 'notes' => '', 'title' => 'Rule 16(B), M.R.CIV.P. Order'],
|
||||
['id' => 49, 'date' => '2025-09-03', 'summary' => 'Elizabeth Kragh filed this reply brief defending her request to dismiss counterclaims made by the Montana Association of the Deaf (MAD) in their ongoing lawsuit. Kragh originally sued MAD for violating Montana laws by denying her access to organizational records, conducting improper elections, and mismanaging finances. Instead of simply defending themselves, MAD filed counterclaims against Kragh, essentially trying to sue her back. In this reply brief, Kragh argues that MAD\'s counterclaims are legally flawed "empty labels" without specific facts, pointing out that MAD contradicted themselves by admitting to the very conduct they claim was legal. She notes that MAD\'s own lawyer agreed to delay evidence gathering until the court rules on her dismissal motion, which she argues shows the counterclaims lack substance. Kragh contends that under Montana law, MAD\'s litigation-based counterclaims should be filed as a separate lawsuit rather than mixed with this case, and that MAD is using weak counterclaims as a fishing expedition to avoid accountability for governance violations.
|
||||
', 'created_at' => '2025-09-05 22:34:36.922', 'updated_at' => '2025-09-05 22:34:36.922', 'notes' => '', 'title' => 'Reply Brief in Support of Plaintiff\'s Motion to Dismiss Counterclaims and Strike Affirmative Defenses (Filed By Kragh, Elizabeth on behalf of Kragh, Elizabeth )'],
|
||||
['id' => 50, 'date' => '2025-09-03', 'summary' => 'Elizabeth Kragh filed this reply brief defending her request for a protective order to limit discovery demands made by the Montana Association of the Deaf (MAD) in their ongoing lawsuit. Discovery is the legal process where each side can demand documents, information, and answers from the other party before trial. Kragh argues that MAD\'s discovery requests are excessive and inappropriate because MAD has already admitted to the key violations in their legal filings, making extensive information-gathering unnecessary. She contends that six specific requests relate to MAD\'s weak counterclaims rather than her original lawsuit, and several other requests are overly broad, potentially requiring her to identify thousands of people who saw her social media posts about the case. Kragh points out that MAD\'s own lawyer acknowledged that dismissing the counterclaims would reduce the scope of discovery needed. She argues that forcing her, as a person representing herself in court, to respond to invasive requests about her private communications constitutes harassment rather than legitimate evidence-gathering, especially when MAD has already admitted to the conduct she\'s challenging.', 'created_at' => '2025-09-05 22:35:28.191', 'updated_at' => '2025-09-05 22:35:28.191', 'notes' => '', 'title' => 'Reply Brief in Support of Plaintiff\'s Motion for Protective Order (Filed By Kragh, Elizabeth on behalf of Kragh, Elizabeth )'],
|
||||
['id' => 51, 'date' => '2025-09-08', 'summary' => 'This is a legal notice filed on September 8, 2025, informing the court that Elizabeth Kragh (the person suing) has responded to discovery requests from Montana Association of the Deaf (MAD). Discovery is when each side asks the other for information and documents related to the case. Kragh answered 9 questions, responded to 7 requests for documents, admitted or denied 9 statements, and provided 5 exhibits as evidence. She sent these responses to MAD\'s lawyers by email.', 'created_at' => '2025-09-11 03:13:29.717', 'updated_at' => '2025-09-11 03:13:29.717', 'notes' => '', 'title' => 'Notice of Service of Discovery Requests (Filed By Kragh, Elizabeth on behalf of Kragh, Elizabeth )'],
|
||||
['id' => 52, 'date' => '2025-09-15', 'summary' => 'In lawsuits, both sides can request information from each other through a process called "discovery" - asking questions, requesting documents, and seeking admissions of facts. This notice simply informs the court and the plaintiff (Elizabeth Kragh) that the defendant (Montana Association of the Deaf) has completed and sent their responses to the plaintiff\'s discovery requests via email on September 15, 2025.
|
||||
', 'created_at' => '2025-09-22 03:07:47.689', 'updated_at' => '2025-09-22 03:07:47.689', 'notes' => '', 'title' => 'Notice of Service of Discovery Responses (Filed By Lacny, Peter on behalf of Montana Association of the Deaf Inc. )'],
|
||||
['id' => 53, 'date' => '2025-09-22', 'summary' => 'On September 22, 2025, Judge Tara Elliott ruled on Elizabeth Kragh\'s strategic motions in her lawsuit against the Montana Association of the Deaf (MAD).
|
||||
|
||||
Kragh had challenged MAD\'s counterclaims as legally insufficient, arguing they contained only vague accusations without specific supporting facts. She also sought to limit MAD\'s broad discovery requests for personal information.
|
||||
|
||||
While the court denied Kragh\'s motions, allowing MAD\'s counterclaims to proceed under Montana\'s liberal pleading standards, the ruling contained a significant strategic victory for Kragh. The court notably refused to grant MAD\'s request for permission to amend their counterclaims, forcing MAD to defend their original vague allegations without the opportunity to strengthen them with better factual support.
|
||||
|
||||
This outcome benefits Kragh\'s position: her substantive claims about MAD\'s governance violations remain fully intact and will proceed to trial, while MAD is now locked into defending poorly-drafted counterclaims they cannot improve. The case moves forward to discovery, where Kragh can build her evidence while MAD remains constrained by their inadequate pleadings.', 'created_at' => '2025-09-27 23:16:16.988', 'updated_at' => '2025-09-27 23:16:16.988', 'notes' => '', 'title' => 'Order'],
|
||||
['id' => 55, 'date' => '2025-10-06', 'summary' => 'Montana Association of the Deaf filed a detailed legal brief explaining why they believe the court should rule in their favor without a trial. The brief addresses three claims made by Elizabeth Kragh.
|
||||
|
||||
First, regarding access to meeting minutes, MAD argues this claim is now unnecessary because they provided all requested minutes during the legal discovery process in September 2025.
|
||||
|
||||
Second, concerning the 2023 election conducted by acclamation rather than written ballot as required by bylaws, MAD acknowledges this occurred but argues it was intentional as a custom and not mandatory. They claim Kragh attended the meeting without objecting and waited nearly two years to raise concerns. MAD also notes they conducted proper elections in 2025.
|
||||
|
||||
Third, regarding financial oversight concerns, MAD provided comprehensive financial documentation accounting for all funds, including the disputed $888.54. They explain this amount represented documented income properly added to their general fund, and what appeared as a discrepancy was a corrected reporting error.', 'created_at' => '2025-10-08 18:23:51.638', 'updated_at' => '2025-10-08 18:23:51.638', 'notes' => '', 'title' => 'Brief In Support of Defendant\'s Motion for Summary Judgment (Filed By Lacny, Peter on behalf of Montana Association of the Deaf Inc. )'],
|
||||
['id' => 56, 'date' => '2025-10-06', 'summary' => 'Attorney Peter Lacny filed a sworn legal statement on behalf of Montana Association of the Deaf on October 4, 2025. This declaration serves as proof to support MAD\'s request that the court rule in their favor without a trial.
|
||||
|
||||
The declaration contains nine numbered paragraphs, each referencing specific documents attached as exhibits. These exhibits include copies of meeting minutes that MAD provided to plaintiff Kragh during the legal discovery process, minutes from the June 2023 meeting where the disputed election occurred, Kragh\'s written responses to legal questions, and comprehensive financial records.
|
||||
|
||||
The declaration specifically references documents showing that MAD provided all requested meeting minutes, held proper elections in 2025, and provided detailed financial documentation including an explanation of the disputed $888.54 amount. As a sworn statement, the declaration carries legal weight and establishes the factual foundation that MAD believes supports their position in the case.', 'created_at' => '2025-10-08 18:24:58.126', 'updated_at' => '2025-10-08 18:24:58.126', 'notes' => '', 'title' => 'Declaration of Peter Lacny in Support of Defendant\'s Motion for Summary Judgment (Filed By Lacny, Peter on behalf of Montana Association of the Deaf Inc. )'],
|
||||
['id' => 57, 'date' => '2025-10-07', 'summary' => 'Plaintiff Kragh filed a motion asking the court to compel Montana Association of the Deaf to produce evidence they admit exists but refuse to provide. The dispute centers on three categories of materials: video recordings of 15 board meetings MAD created when recording from January 2023 through February 2025, internal communications among officers regarding governance decisions and policy development, and a complete ten-year history of bylaw amendments.
|
||||
|
||||
Kragh attempted to resolve the matter through required pre-litigation discussions, but MAD maintained their objections as these evidences are irrelevant. She argues the materials are directly relevant to her claims about records access violations, improper elections, and financial oversight failures. Notably, MAD filed their motion for summary judgment on October 4, 2025, just three days before Kragh filed this compel motion.
|
||||
|
||||
The timing raises procedural concerns about seeking case dismissal while withholding potentially crucial evidence. Kragh emphasizes that for ASL communications, video recordings preserve important contextual information that written summaries cannot capture, making their production particularly important for determining what actually occurred during board discussions.
|
||||
', 'created_at' => '2025-10-08 18:42:25.13', 'updated_at' => '2025-10-08 18:42:25.13', 'notes' => '', 'title' => 'Motion to Compel Discovery (Filed By Kragh, Elizabeth on behalf of Kragh, Elizabeth )'],
|
||||
['id' => 58, 'date' => '2025-10-07', 'summary' => 'The exhibits filing contains the supporting documentation for plaintiff Kragh\'s motion to compel discovery. This collection of evidence demonstrates her good faith efforts to obtain information from Montana Association of the Deaf before asking the court to intervene.
|
||||
|
||||
The documents show a clear pattern: Kragh repeatedly requested specific materials through proper legal channels, MAD acknowledged possessing them, but then refused to provide them. Most notably, MAD admitted they recorded 15 board meetings and store them on the president\'s laptop, yet claimed these recordings aren\'t relevant or would be too burdensome to produce.
|
||||
|
||||
The exhibits include email exchanges where Kragh methodically identified missing items and legal deficiencies in MAD\'s responses. MAD\'s attorney maintained blanket objections despite Kragh\'s reasonable requests for clarification and compromise. The collection also includes the brief November 2024 meeting minutes showing the controversial zero-tolerance policy was adopted in just 17 minutes, highlighting why the video recordings could reveal important details not captured in written summaries.
|
||||
', 'created_at' => '2025-10-08 18:43:36.204', 'updated_at' => '2025-10-08 18:43:36.204', 'notes' => '', 'title' => 'Exhibits A-H- Attachment to Doc #40 (Filed By Kragh, Elizabeth on behalf of Kragh, Elizabeth )'],
|
||||
['id' => 59, 'date' => '2025-10-09', 'summary' => 'This is plaintiff Kragh\'s proposed court order - what she\'s asking the judge to sign after filing a motion to compel discovery against the Montana Association of the Deaf. The court hasn\'t ruled on it yet.
|
||||
|
||||
Kragh is requesting the judge to order the nonprofit organization to turn over:
|
||||
|
||||
- Video recordings of 15 board meetings from 2023-2025
|
||||
- Internal emails and communications about her document requests, their zero-tolerance policy, election procedures, and a financial discrepancy of $888.54
|
||||
- Complete history of changes to their bylaws since 2015
|
||||
|
||||
In her proposed order, Kragh argues that she properly followed legal procedures by trying to work things out beforehand, and that the organization\'s reasons for refusing were too vague. She claims the documents are relevant to her case about alleged violations of nonprofit law.
|
||||
|
||||
If the judge signs this order, the organization would have 14 days to comply or face potential sanctions. This represents Kragh\'s legal strategy to access information she believes she\'s entitled to as a member of the organization', 'created_at' => '2025-10-10 19:18:32.056', 'updated_at' => '2025-10-10 19:18:32.056', 'notes' => '', 'title' => 'Proposed Order Granting Motion to Compel Discovery'],
|
||||
['id' => 61, 'date' => '2025-10-09', 'summary' => 'This is plaintiff Kragh\'s sworn statement asking the court to delay the Montana Association of the Deaf\'s request to end the case early. Kragh argues she cannot properly defend herself because the organization is hiding important evidence.
|
||||
|
||||
The organization filed a motion asking the judge to dismiss the case, claiming there was "no willful wrongdoing" and "no bad intent" in their actions. However, Kragh says the organization admits that crucial evidence exists - including video recordings of 15 board meetings and internal communications - but refuses to turn it over.
|
||||
|
||||
Kragh argues this is unfair: the organization cannot claim certain facts are undisputed while hiding the only evidence that could prove or disprove those claims. She points out that discovery (the evidence-gathering phase) is supposed to continue until March 2026, making the organization\'s request premature.
|
||||
|
||||
The organization has already provided documents in four separate batches, suggesting their initial searches were incomplete. Kragh states she needs access to the withheld evidence to properly respond to the organization\'s motion.', 'created_at' => '2025-10-10 19:21:28.245', 'updated_at' => '2025-10-10 19:21:28.245', 'notes' => '', 'title' => 'Affidavit in Support of Rule 56(f) Motion (Filed By Kragh, Elizabeth on behalf of Kragh, Elizabeth ) 283950 $1.00'],
|
||||
['id' => 62, 'date' => '2025-10-10', 'summary' => 'Plaintiff Kragh filed this affidavit asking the court to extend the October 31, 2025 deadline for amending her complaint. She states that discovery has revealed additional violations she couldn\'t have known about when filing her original complaint. The defendant has provided documents in four separate rounds, with key materials like a policy manual only produced in October 2025. The defendant continues withholding video recordings of board meetings, internal communications, and bylaw histories. Kragh argues she has been diligent in pursuing discovery but needs more time to investigate newly discovered violations before the amendment deadline expires.
|
||||
', 'created_at' => '2025-10-12 02:38:58.702', 'updated_at' => '2025-10-12 02:38:58.702', 'notes' => '', 'title' => 'Affidavit in Support of Motion to Modify Scheduling Order (Filed By Kragh, Elizabeth on behalf of ) 283988 $1.00'],
|
||||
['id' => 63, 'date' => '2025-10-10', 'summary' => 'Plaintiff Kragh filed this motion asking the court to extend the October 31, 2025 deadline for amending her complaint in this lawsuit. She argues that discovery (the legal process where parties share documents) has revealed additional violations she couldn\'t have known about when originally filing. Her initial complaint focused on three issues, but newly discovered documents show a broader pattern of governance problems spanning policy creation, meeting procedures, and financial oversight.
|
||||
|
||||
The defendant organization continues withholding important evidence including video recordings of 15 board meetings, internal communications, and historical governance documents. Kragh argues she has been diligent in pursuing discovery but needs more time to investigate these newly discovered violations before the amendment deadline expires. The motion presents two options: either allow staged amendments or extend the deadline until after discovery is complete. She cites legal precedent requiring "good cause" and argues the current deadline cannot reasonably be met despite her diligence.
|
||||
', 'created_at' => '2025-10-12 02:40:20.087', 'updated_at' => '2025-10-12 02:40:20.087', 'notes' => '', 'title' => 'Motion to Modify Scheduling Order Extension of complaint Amendment Deadline (Filed By Kragh, Elizabeth on behalf of ) 283988 $1.00'],
|
||||
['id' => 64, 'date' => '2025-10-10', 'summary' => 'This is a template court order that Judge Tara Elliott would sign if she grants Plaintiff Kragh\'s request to extend the amendment deadline. The document first lists the court\'s findings, including that Kragh has been diligent in pursuing discovery, that newly discovered governance violations couldn\'t have been anticipated when the original deadline was set, and that the defendant organization continues withholding crucial evidence like video recordings and internal communications.
|
||||
|
||||
The proposed order then gives the judge three options to choose from: 1) Allow a staged approach with two separate amendment deadlines, 2) Extend the deadline to May 2026 after discovery is complete (plaintiff\'s preferred option), or 3) Extend the deadline to January 2026 with requirements for expedited discovery. Each option also addresses whether to pause the defendant\'s summary judgment motion until after the amendment process is complete.
|
||||
|
||||
This is essentially the "relief" or outcome that Plaintiff Kragh is asking the court to grant through her motion.
|
||||
', 'created_at' => '2025-10-12 02:41:36.733', 'updated_at' => '2025-10-12 02:41:36.733', 'notes' => '', 'title' => 'Proposed Order Granting Motion to Modify Scheduling Order 283988 $1.00'],
|
||||
['id' => 67, 'date' => '2025-10-23', 'summary' => 'This is the court\'s electronic filing receipt confirming that Judge Tara Elliott granted Plaintiff Elizabeth Kragh\'s motion to strike on October 23, 2025. The receipt shows the order was electronically filed at 9:25 AM by the court clerk\'s office in Missoula County. While the proposed order is this document, the filing stamp indicates the judge approved Plaintiff Kragh\'s request to remove the accidentally filed discovery responses from the court record, as requested in her motion filed just one day earlier on October 22, 2025.', 'created_at' => '2025-11-09 23:31:54.095', 'updated_at' => '2025-11-13 20:31:57.704', 'notes' => '', 'title' => 'Order Granting Motion to Strike Improperly Filed Discovery Responses'],
|
||||
['id' => 65, 'date' => '2025-10-21', 'summary' => 'This document is a Certificate of Service filed by Elizabeth Kragh confirming she provided additional information in her lawsuit against the Montana Association of the Deaf. After the court denied two of Kragh\'s earlier requests in September 2025, the judge ordered her to answer six specific discovery questions within 30 days. Discovery is the legal process where both sides exchange information before trial. This certificate proves Kragh met the October 22 deadline by submitting her answers on October 21, 2025, and properly notifying the other side\'s attorney by email.', 'created_at' => '2025-11-09 20:19:55.036', 'updated_at' => '2025-11-13 20:34:01.57', 'notes' => '', 'title' => 'Certificate of Service (Filed By Kragh, Elizabeth on behalf of )'],
|
||||
['id' => 66, 'date' => '2025-10-22', 'summary' => 'This motion asks the court to remove a document that Plaintiff Elizabeth Kragh accidentally filed. When responding to discovery requests (questions and document requests from the other side), lawyers typically send their answers directly to the opposing attorney and file only a certificate proving they did so. Plaintiff Kragh correctly sent her responses to the Montana Association of the Deaf\'s attorney and filed the certificate, but she also mistakenly filed the actual responses with the clerk of the court. Since discovery responses aren\'t supposed to be filed unless used in a motion, Plaintiff Kragh asks the judge to delete them from the court record while keeping the certificate of service.
|
||||
', 'created_at' => '2025-11-09 20:21:46.039', 'updated_at' => '2025-11-13 20:34:29.807', 'notes' => '', 'title' => 'Motion to Strike Improperly File Discovery Responses (Doc #47) (Filed By Kragh, Elizabeth on behalf of )'],
|
||||
['id' => 60, 'date' => '2025-10-09', 'summary' => 'This is Plaintiff Kragh\'s motion asking the court to delay the Montana Association of the Deaf\'s request to end the case early. Kragh argues it\'s premature to proceed when crucial evidence is still being withheld.
|
||||
|
||||
The organization filed a motion to dismiss the case on a Saturday, even though the evidence-gathering phase (discovery) is scheduled to continue until March 2026 - five months away. Kragh points out that the organization admits important evidence exists, including video recordings of 15 board meetings and internal communications, but refuses to turn it over.
|
||||
|
||||
Kragh notes a procedural inconsistency: the court previously criticized her for not trying to work things out with the other side before filing motions, yet the organization\'s lawyer did the same thing when filing their dismissal request.
|
||||
|
||||
The motion asks the court to either deny the organization\'s request entirely or delay it until all evidence has been properly shared and reviewed. Kragh argues the organization cannot claim certain facts are undisputed while hiding evidence that could prove or disprove those claims.
|
||||
', 'created_at' => '2025-10-10 19:20:16.941', 'updated_at' => '2025-11-13 20:29:35.216', 'notes' => '', 'title' => 'Motion for Additional Discovery Time Pursuant to Rule 56(f) (Filed By Kragh, Elizabeth on behalf of Kragh, Elizabeth )'],
|
||||
['id' => 68, 'date' => '2025-10-24', 'summary' => 'The Montana Association of the Deaf opposes Plaintiff Elizabeth Kragh\'s request for board meeting videos, internal communications, and bylaw history. MAD claims they\'ve already provided 700+ pages of documents and argues the additional materials aren\'t relevant to Plaintiff Kragh\'s three claims about meeting minutes, election procedures, and financial oversight.
|
||||
MAD\'s main concern is that Plaintiff Kragh maintains a public website about the lawsuit and might share the videos online. They worry this could embarrass volunteer board members and misuse the discovery process for public relations rather than trial preparation.
|
||||
MAD asks the judge to deny Plaintiff Kragh\'s motion, limit further document production, and order her to pay their attorney fees.
|
||||
', 'created_at' => '2025-11-09 23:34:01.804', 'updated_at' => '2025-11-13 20:31:03.478', 'notes' => '', 'title' => 'Defendant\'s Response to Plaintiff\'s Motion to Compel and Cross-Motion for Protective Order (Filed By Lacny, Peter on behalf of Montana Association of the Deaf Inc. )'],
|
||||
['id' => 70, 'date' => '2025-10-24', 'summary' => 'MAD opposes Plaintiff Elizabeth Kragh\'s requests for more discovery time and extension of deadlines before responding to their summary judgment motion. MAD argues Plaintiff Kragh is seeking "smoking gun evidence" without explaining how additional materials would help her case—something Montana courts have found insufficient for delays.
|
||||
|
||||
MAD claims they\'ve provided everything relevant: meeting minutes, financial records, and election documentation. They argue board meeting videos, internal communications, and historical bylaws won\'t change the fundamental facts.
|
||||
|
||||
MAD also disputes Plaintiff Kragh\'s accusations of "tactical manipulation" for filing their motion on a Saturday, noting there\'s nothing improper about weekend work. They ask the judge to deny both extension requests and grant summary judgment immediately, potentially ending the case without trial.
|
||||
', 'created_at' => '2025-11-09 23:37:50.677', 'updated_at' => '2025-11-13 20:31:34.73', 'notes' => '', 'title' => 'MAD\'s Combined Response to Plaintiff\'s Rule 56(f) Motion and Motion to Extend Scheduling Order (Filed By Lacny, Peter on behalf of Montana Association of the Deaf Inc. )'],
|
||||
['id' => 73, 'date' => '2025-11-12', 'summary' => 'Plaintiff Elizabeth Kragh asks the judge to extend the October 31 deadline for amending her lawsuit. She argues that recently produced documents revealed additional governance violations beyond her original three claims, but she needs more time to investigate before deciding whether to add them.
|
||||
|
||||
A policy manual produced in October showed seven potential new bylaw violations. However, MAD still withholds fifteen board meeting videos, internal communications, and bylaw records that could reveal even more violations. Plaintiff Kragh contends extending the deadline would allow her to file one comprehensive amended complaint rather than multiple separate lawsuits as new problems emerge.
|
||||
|
||||
She emphasizes being diligent—pursuing discovery immediately and negotiating in good faith. Since the discovery deadline isn\'t until March 2026, Kragh requests extending the amendment deadline to May 2026, allowing proper investigation of materials MAD continues withholding.', 'created_at' => '2025-11-13 20:35:59.621', 'updated_at' => '2025-11-13 20:35:59.621', 'notes' => '', 'title' => 'Reply Brief in Support of Motion to Modify Scheduling Order (Filed By Kragh, Elizabeth on behalf of )'],
|
||||
['id' => 75, 'date' => '2025-11-12', 'summary' => 'Plaintiff Elizabeth Kragh responds to MAD\'s opposition, arguing the organization admits crucial evidence exists but refuses to provide it while simultaneously asking the judge to dismiss the case. Kragh seeks fifteen specific board meeting videos (which MAD confirms are stored on the president\'s laptop), internal officer communications, and bylaw amendment records spanning ten years.
|
||||
|
||||
She contends these materials could reveal whether MAD\'s violations of state law and bylaws were deliberate or accidental—the key question at the heart of her claims. Plaintiff Kragh argues it\'s fundamentally unfair for MAD to file for immediate dismissal while withholding the very evidence needed to prove or disprove their assertions about intent and knowledge.
|
||||
|
||||
She asks the judge to deny MAD\'s summary judgment motion or delay ruling until after discovery concludes in March 2026.', 'created_at' => '2025-11-13 20:39:05.282', 'updated_at' => '2025-11-13 20:39:05.282', 'notes' => '', 'title' => 'Reply Brief in Support of Motion for Additional Discovery Time Pursuant to Rule 56 (Filed By Kragh, Elizabeth on behalf of )
|
||||
'],
|
||||
['id' => 76, 'date' => '2025-11-12', 'summary' => 'Plaintiff Elizabeth Kragh responds to MAD\'s opposition, emphasizing that MAD admits crucial evidence exists but refuses to provide it. The disputed materials include fifteen board meeting videos (stored on the president\'s laptop), internal officer communications, and ten-year bylaw amendment records.
|
||||
|
||||
Plaintiff Kragh argues Montana law clearly allows discovery of video recordings as "electronically stored information," rejecting MAD\'s claim they\'re merely "working notes" exempt from disclosure. She contends these videos could reveal whether MAD\'s violations were deliberate or accidental—crucial to proving intent and knowledge.
|
||||
|
||||
Kragh addresses procedural errors MAD highlighted, calling them clerical mistakes that didn\'t prevent meaningful negotiation. She opposes MAD\'s request for a protective order and attorney fees, arguing MAD created the dispute by withholding relevant evidence while simultaneously requesting immediate case dismissal.', 'created_at' => '2025-11-13 20:40:54.639', 'updated_at' => '2025-11-13 20:40:54.639', 'notes' => '', 'title' => 'Reply Brief in Support of Motion to Compel Discovery (Filed By Kragh, Elizabeth on behalf of )
|
||||
'],
|
||||
];
|
||||
|
||||
foreach ($entries as $entry) {
|
||||
DocketEntry::create($entry);
|
||||
}
|
||||
|
||||
$this->command->info('Imported ' . count($entries) . ' docket entries');
|
||||
}
|
||||
|
||||
private function importDocuments(): void
|
||||
{
|
||||
$documents = [
|
||||
['id' => 4, 'docket_entry_id' => 1, 'original_filename' => '05-07-25-affidavit.pdf', 'stored_filename' => '23c520dc-371f-423b-add5-4e52de1cb8a3.pdf', 'file_path' => 'documents/23c520dc-371f-423b-add5-4e52de1cb8a3.pdf', 'title' => '05-07-25-affidavit', 'summary' => '', 'notes' => '', 'file_size' => 2835944, 'display_order' => 0, 'created_at' => '2025-06-25 22:10:32.069', 'updated_at' => '2025-06-25 22:10:32.069', 'mime_type' => 'application/pdf'],
|
||||
['id' => 5, 'docket_entry_id' => 5, 'original_filename' => '05-07-25-complaint.pdf', 'stored_filename' => '07c225d0-3aa8-44df-9cd1-1b65c6ad09a6.pdf', 'file_path' => 'documents/07c225d0-3aa8-44df-9cd1-1b65c6ad09a6.pdf', 'title' => '05-07-25-complaint', 'summary' => '', 'notes' => '', 'file_size' => 12308309, 'display_order' => 0, 'created_at' => '2025-06-25 22:13:29.178', 'updated_at' => '2025-06-25 22:13:29.178', 'mime_type' => 'application/pdf'],
|
||||
['id' => 6, 'docket_entry_id' => 6, 'original_filename' => '05-07-25-exhibits-complaint.pdf', 'stored_filename' => 'e3c0eaf5-b092-4b28-bd87-513e4b1004d6.pdf', 'file_path' => 'documents/e3c0eaf5-b092-4b28-bd87-513e4b1004d6.pdf', 'title' => '05-07-25-exhibits-complaint', 'summary' => '', 'notes' => '', 'file_size' => 40815526, 'display_order' => 0, 'created_at' => '2025-06-25 22:15:27.077', 'updated_at' => '2025-06-25 22:15:27.077', 'mime_type' => 'application/pdf'],
|
||||
['id' => 8, 'docket_entry_id' => 8, 'original_filename' => '05-16-25-amended-cert-of-service.pdf', 'stored_filename' => '6c4acc7c-5b89-42b6-9fa2-e5b07297d1c7.pdf', 'file_path' => 'documents/6c4acc7c-5b89-42b6-9fa2-e5b07297d1c7.pdf', 'title' => '05-16-25-amended-cert-of-service', 'summary' => '', 'notes' => '', 'file_size' => 848704, 'display_order' => 0, 'created_at' => '2025-06-25 22:17:36.285', 'updated_at' => '2025-06-25 22:17:36.285', 'mime_type' => 'application/pdf'],
|
||||
['id' => 9, 'docket_entry_id' => 9, 'original_filename' => '05-14-25-cert-service.pdf', 'stored_filename' => '22591482-9c45-4b01-a467-0d88819dff3d.pdf', 'file_path' => 'documents/22591482-9c45-4b01-a467-0d88819dff3d.pdf', 'title' => '05-14-25-cert-service', 'summary' => '', 'notes' => '', 'file_size' => 823675, 'display_order' => 0, 'created_at' => '2025-06-25 22:19:25.031', 'updated_at' => '2025-06-25 22:19:25.031', 'mime_type' => 'application/pdf'],
|
||||
['id' => 10, 'docket_entry_id' => 10, 'original_filename' => '05-12-25-summons.pdf', 'stored_filename' => 'acbe4d9c-62dd-488f-891e-3fa0af8e755f.pdf', 'file_path' => 'documents/acbe4d9c-62dd-488f-891e-3fa0af8e755f.pdf', 'title' => '05-12-25-summons', 'summary' => '', 'notes' => '', 'file_size' => 413753, 'display_order' => 0, 'created_at' => '2025-06-25 22:21:25.34', 'updated_at' => '2025-06-25 22:21:25.34', 'mime_type' => 'application/pdf'],
|
||||
['id' => 11, 'docket_entry_id' => 11, 'original_filename' => '06-05-25-MAD-response.pdf', 'stored_filename' => '0cdf58fb-bc7f-476b-8a95-e599eac5304b.pdf', 'file_path' => 'documents/0cdf58fb-bc7f-476b-8a95-e599eac5304b.pdf', 'title' => '06-05-25-MAD-response', 'summary' => '', 'notes' => '', 'file_size' => 5166383, 'display_order' => 0, 'created_at' => '2025-06-25 22:23:24.416', 'updated_at' => '2025-06-25 22:23:24.416', 'mime_type' => 'application/pdf'],
|
||||
['id' => 12, 'docket_entry_id' => 12, 'original_filename' => '06-06-25-affidavit-military.pdf', 'stored_filename' => '7202e411-1d5a-467d-bd9f-224e1b67e425.pdf', 'file_path' => 'documents/7202e411-1d5a-467d-bd9f-224e1b67e425.pdf', 'title' => '06-06-25-affidavit-military', 'summary' => '', 'notes' => '', 'file_size' => 1813595, 'display_order' => 0, 'created_at' => '2025-06-25 22:25:18.831', 'updated_at' => '2025-06-25 22:25:18.831', 'mime_type' => 'application/pdf'],
|
||||
['id' => 13, 'docket_entry_id' => 13, 'original_filename' => '06-06-25-affidavit-service.pdf', 'stored_filename' => 'fccf383a-52ef-4408-8c93-66a136966abb.pdf', 'file_path' => 'documents/fccf383a-52ef-4408-8c93-66a136966abb.pdf', 'title' => '06-06-25-affidavit-service', 'summary' => '', 'notes' => '', 'file_size' => 1372227, 'display_order' => 0, 'created_at' => '2025-06-25 22:26:21.55', 'updated_at' => '2025-06-25 22:26:21.55', 'mime_type' => 'application/pdf'],
|
||||
['id' => 14, 'docket_entry_id' => 14, 'original_filename' => '06-06-25-motion-default.pdf', 'stored_filename' => '87345cc8-7e8c-4036-b45d-d07038cceaf2.pdf', 'file_path' => 'documents/87345cc8-7e8c-4036-b45d-d07038cceaf2.pdf', 'title' => '06-06-25-motion-default', 'summary' => '', 'notes' => '', 'file_size' => 2912423, 'display_order' => 0, 'created_at' => '2025-06-25 22:27:20.623', 'updated_at' => '2025-06-25 22:27:20.623', 'mime_type' => 'application/pdf'],
|
||||
['id' => 15, 'docket_entry_id' => 15, 'original_filename' => '06-06-25-supporting-default.pdf', 'stored_filename' => '28dac869-0180-4351-9394-fbb089568a5c.pdf', 'file_path' => 'documents/28dac869-0180-4351-9394-fbb089568a5c.pdf', 'title' => '06-06-25-supporting-default', 'summary' => '', 'notes' => '', 'file_size' => 6492681, 'display_order' => 0, 'created_at' => '2025-06-25 22:28:15.994', 'updated_at' => '2025-06-25 22:28:15.994', 'mime_type' => 'application/pdf'],
|
||||
['id' => 16, 'docket_entry_id' => 16, 'original_filename' => '06-06-25-order-default.pdf', 'stored_filename' => '56d72c99-d20c-400b-9b04-6299c402c597.pdf', 'file_path' => 'documents/56d72c99-d20c-400b-9b04-6299c402c597.pdf', 'title' => '06-06-25-order-default', 'summary' => '', 'notes' => '', 'file_size' => 2853711, 'display_order' => 0, 'created_at' => '2025-06-25 22:29:12.735', 'updated_at' => '2025-06-25 22:29:12.735', 'mime_type' => 'application/pdf'],
|
||||
['id' => 17, 'docket_entry_id' => 17, 'original_filename' => '06-06-25-motion-TRO.pdf', 'stored_filename' => '275afa2f-1cc2-4a50-980a-9203f6ddd84e.pdf', 'file_path' => 'documents/275afa2f-1cc2-4a50-980a-9203f6ddd84e.pdf', 'title' => '06-06-25-motion-TRO', 'summary' => '', 'notes' => '', 'file_size' => 3430613, 'display_order' => 0, 'created_at' => '2025-06-25 22:30:25.914', 'updated_at' => '2025-06-25 22:30:25.914', 'mime_type' => 'application/pdf'],
|
||||
['id' => 18, 'docket_entry_id' => 18, 'original_filename' => '06-06-25-TRO.pdf', 'stored_filename' => 'e7f00c5b-322c-4a1e-b865-afd2f8255c62.pdf', 'file_path' => 'documents/e7f00c5b-322c-4a1e-b865-afd2f8255c62.pdf', 'title' => '06-06-25-TRO', 'summary' => '', 'notes' => '', 'file_size' => 1886561, 'display_order' => 0, 'created_at' => '2025-06-25 22:31:31.339', 'updated_at' => '2025-06-25 22:31:31.339', 'mime_type' => 'application/pdf'],
|
||||
['id' => 19, 'docket_entry_id' => 19, 'original_filename' => '06-09-2025-motion-unauthorized.pdf', 'stored_filename' => '37055e87-e18b-47d5-acf1-502080cc3084.pdf', 'file_path' => 'documents/37055e87-e18b-47d5-acf1-502080cc3084.pdf', 'title' => '06-09-2025-motion-unauthorized', 'summary' => '', 'notes' => '', 'file_size' => 8643407, 'display_order' => 0, 'created_at' => '2025-06-25 22:37:56.929', 'updated_at' => '2025-06-25 22:37:56.929', 'mime_type' => 'application/pdf'],
|
||||
['id' => 20, 'docket_entry_id' => 20, 'original_filename' => '06-09-25-proposed-unathorized.pdf', 'stored_filename' => '252e2a75-37b8-4478-9e3f-bab0dcd62975.pdf', 'file_path' => 'documents/252e2a75-37b8-4478-9e3f-bab0dcd62975.pdf', 'title' => '06-09-25-proposed-unathorized', 'summary' => '', 'notes' => '', 'file_size' => 2053426, 'display_order' => 0, 'created_at' => '2025-06-25 22:38:59.564', 'updated_at' => '2025-06-25 22:38:59.564', 'mime_type' => 'application/pdf'],
|
||||
['id' => 21, 'docket_entry_id' => 21, 'original_filename' => '06-09-25-motion-sanctions.pdf', 'stored_filename' => '5933acef-8523-44c9-81c3-e37ea8abd256.pdf', 'file_path' => 'documents/5933acef-8523-44c9-81c3-e37ea8abd256.pdf', 'title' => '06-09-25-motion-sanctions', 'summary' => '', 'notes' => '', 'file_size' => 5752094, 'display_order' => 0, 'created_at' => '2025-06-25 22:40:00.636', 'updated_at' => '2025-06-25 22:40:00.636', 'mime_type' => 'application/pdf'],
|
||||
['id' => 22, 'docket_entry_id' => 22, 'original_filename' => '06-09-25-proposed-grant-sanctions.pdf', 'stored_filename' => '004f5cd2-d600-4125-86da-bca491183fcb.pdf', 'file_path' => 'documents/004f5cd2-d600-4125-86da-bca491183fcb.pdf', 'title' => '06-09-25-proposed-grant-sanctions', 'summary' => '', 'notes' => '', 'file_size' => 2896461, 'display_order' => 0, 'created_at' => '2025-06-25 22:40:55.409', 'updated_at' => '2025-06-25 22:40:55.409', 'mime_type' => 'application/pdf'],
|
||||
['id' => 23, 'docket_entry_id' => 23, 'original_filename' => '06-10-25-granting-motion-strike.pdf', 'stored_filename' => '97cbd49d-c23c-4415-baa7-cf0432aa0942.pdf', 'file_path' => 'documents/97cbd49d-c23c-4415-baa7-cf0432aa0942.pdf', 'title' => '06-10-25-granting-motion-strike', 'summary' => '', 'notes' => '', 'file_size' => 3877515, 'display_order' => 0, 'created_at' => '2025-06-25 22:41:51.826', 'updated_at' => '2025-06-25 22:41:51.826', 'mime_type' => 'application/pdf'],
|
||||
['id' => 24, 'docket_entry_id' => 24, 'original_filename' => '06-11-25-motion-prelim.pdf', 'stored_filename' => '34bb78ab-98db-4b67-8a5d-0a0781710bd1.pdf', 'file_path' => 'documents/34bb78ab-98db-4b67-8a5d-0a0781710bd1.pdf', 'title' => '06-11-25-motion-prelim', 'summary' => '', 'notes' => '', 'file_size' => 6451893, 'display_order' => 0, 'created_at' => '2025-06-25 22:42:44.297', 'updated_at' => '2025-06-25 22:42:44.297', 'mime_type' => 'application/pdf'],
|
||||
['id' => 25, 'docket_entry_id' => 25, 'original_filename' => '06-11-25-proposed-grant-prelim.pdf', 'stored_filename' => '8f5bd0e0-7c45-4ecc-91eb-c4b3464689a7.pdf', 'file_path' => 'documents/8f5bd0e0-7c45-4ecc-91eb-c4b3464689a7.pdf', 'title' => '06-11-25-proposed-grant-prelim', 'summary' => '', 'notes' => '', 'file_size' => 2217692, 'display_order' => 0, 'created_at' => '2025-06-25 22:43:28.944', 'updated_at' => '2025-06-25 22:43:28.944', 'mime_type' => 'application/pdf'],
|
||||
['id' => 26, 'docket_entry_id' => 26, 'original_filename' => 'MAD-Notice of Appearance 07:24.pdf', 'stored_filename' => '51bc25d9-3a86-4221-b9d5-329667877d9e.pdf', 'file_path' => 'documents/51bc25d9-3a86-4221-b9d5-329667877d9e.pdf', 'title' => 'MAD-Notice of Appearance 07:24', 'summary' => '', 'notes' => '', 'file_size' => 113258, 'display_order' => 0, 'created_at' => '2025-07-25 21:34:56.53', 'updated_at' => '2025-07-25 21:34:56.53', 'mime_type' => 'application/pdf'],
|
||||
['id' => 27, 'docket_entry_id' => 27, 'original_filename' => 'MAD answer-07:24.pdf', 'stored_filename' => 'b5d14c6f-6321-4711-b263-62fff14b9df6.pdf', 'file_path' => 'documents/b5d14c6f-6321-4711-b263-62fff14b9df6.pdf', 'title' => 'MAD answer-07:24', 'summary' => '', 'notes' => '', 'file_size' => 177006, 'display_order' => 0, 'created_at' => '2025-07-25 21:37:33.878', 'updated_at' => '2025-07-25 21:37:33.878', 'mime_type' => 'application/pdf'],
|
||||
['id' => 28, 'docket_entry_id' => 28, 'original_filename' => '19 Rule 16(B), M.R.CIV.P. Order.pdf', 'stored_filename' => '50e98985-42a0-42b6-8501-5ed98cd3643d.pdf', 'file_path' => 'documents/50e98985-42a0-42b6-8501-5ed98cd3643d.pdf', 'title' => '19 Rule 16(B), M.R.CIV.P. Order', 'summary' => '', 'notes' => '', 'file_size' => 906508, 'display_order' => 0, 'created_at' => '2025-08-05 22:23:38.98', 'updated_at' => '2025-08-05 22:23:38.98', 'mime_type' => 'application/pdf'],
|
||||
['id' => 29, 'docket_entry_id' => 29, 'original_filename' => 'MOTION TO DISMISS COUNTERCLAIMS (August 8, 2025).pdf', 'stored_filename' => 'dd34041b-d2b7-4cf8-9b25-a5aa83f006ab.pdf', 'file_path' => 'documents/dd34041b-d2b7-4cf8-9b25-a5aa83f006ab.pdf', 'title' => 'MOTION TO DISMISS COUNTERCLAIMS (August 8, 2025)', 'summary' => '', 'notes' => '', 'file_size' => 1275683, 'display_order' => 0, 'created_at' => '2025-08-11 19:47:00.548', 'updated_at' => '2025-08-11 19:47:00.548', 'mime_type' => 'application/pdf'],
|
||||
['id' => 30, 'docket_entry_id' => 30, 'original_filename' => '[PROPOSED] ORDER GRANTING PLAINTIFF\'S MOTION TO DISMISS COUNTERCLAIMS (August 8, 2025).pdf', 'stored_filename' => '6606618f-fef6-4d83-813b-aa9e5807866d.pdf', 'file_path' => 'documents/6606618f-fef6-4d83-813b-aa9e5807866d.pdf', 'title' => '[PROPOSED] ORDER GRANTING PLAINTIFF\'S MOTION TO DISMISS COUNTERCLAIMS (August 8, 2025)', 'summary' => '', 'notes' => '', 'file_size' => 144855, 'display_order' => 0, 'created_at' => '2025-08-11 19:59:36.412', 'updated_at' => '2025-08-11 19:59:36.412', 'mime_type' => 'application/pdf'],
|
||||
['id' => 31, 'docket_entry_id' => 31, 'original_filename' => 'PLAINTIFF\'S MOTION FOR PROTECTIVE ORDER REGARDING DEFENDANT\'S FIRST COMBINED DISCOVERY REQUESTS (August 8, 2025).pdf', 'stored_filename' => '4cd62919-ad92-46e9-a54a-d8e54e0729da.pdf', 'file_path' => 'documents/4cd62919-ad92-46e9-a54a-d8e54e0729da.pdf', 'title' => 'PLAINTIFF\'S MOTION FOR PROTECTIVE ORDER REGARDING DEFENDANT\'S FIRST COMBINED DISCOVERY REQUESTS (August 8, 2025)', 'summary' => '', 'notes' => '', 'file_size' => 965180, 'display_order' => 0, 'created_at' => '2025-08-11 20:05:05.783', 'updated_at' => '2025-08-11 20:05:05.783', 'mime_type' => 'application/pdf'],
|
||||
['id' => 32, 'docket_entry_id' => 32, 'original_filename' => '[PROPOSED] ORDER GRANTING PLAINTIFF\'S MOTION FOR PROTECTIVE ORDER (August 8, 2025).pdf', 'stored_filename' => '756cbb75-cb30-4e6e-96e2-9ba18f590808.pdf', 'file_path' => 'documents/756cbb75-cb30-4e6e-96e2-9ba18f590808.pdf', 'title' => '[PROPOSED] ORDER GRANTING PLAINTIFF\'S MOTION FOR PROTECTIVE ORDER (August 8, 2025)', 'summary' => '', 'notes' => '', 'file_size' => 103313, 'display_order' => 0, 'created_at' => '2025-08-11 20:10:12.522', 'updated_at' => '2025-08-11 20:10:12.522', 'mime_type' => 'application/pdf'],
|
||||
['id' => 33, 'docket_entry_id' => 33, 'original_filename' => '2025.08.07 Notice of Service.pdf', 'stored_filename' => 'c4a1fa10-5d63-4d22-965b-3f81df2a4bed.pdf', 'file_path' => 'documents/c4a1fa10-5d63-4d22-965b-3f81df2a4bed.pdf', 'title' => '2025.08.07 Notice of Service', 'summary' => '', 'notes' => '', 'file_size' => 113028, 'display_order' => 0, 'created_at' => '2025-08-12 16:45:14.328', 'updated_at' => '2025-08-12 16:45:14.328', 'mime_type' => 'application/pdf'],
|
||||
['id' => 34, 'docket_entry_id' => 36, 'original_filename' => 'Notice of Service Discovery Request (August 12, 2025).pdf', 'stored_filename' => '5cc390c8-fdfd-4610-9a7b-7f37a6322cc3.pdf', 'file_path' => 'documents/5cc390c8-fdfd-4610-9a7b-7f37a6322cc3.pdf', 'title' => 'Notice of Service Discovery Request (August 12, 2025)', 'summary' => '', 'notes' => '', 'file_size' => 371297, 'display_order' => 0, 'created_at' => '2025-08-24 15:17:56.831', 'updated_at' => '2025-08-24 15:17:56.831', 'mime_type' => 'application/pdf'],
|
||||
['id' => 35, 'docket_entry_id' => 41, 'original_filename' => 'MOTION TO WITHDRAW PRELIMINARY INJUNCTION MOTION (August 18, 2026).pdf', 'stored_filename' => '2f15c9c1-98b8-4f72-b22a-accee822fba4.pdf', 'file_path' => 'documents/2f15c9c1-98b8-4f72-b22a-accee822fba4.pdf', 'title' => 'MOTION TO WITHDRAW PRELIMINARY INJUNCTION MOTION (August 18, 2026)', 'summary' => '', 'notes' => '', 'file_size' => 422033, 'display_order' => 0, 'created_at' => '2025-08-24 15:21:18.366', 'updated_at' => '2025-08-24 15:21:18.366', 'mime_type' => 'application/pdf'],
|
||||
['id' => 36, 'docket_entry_id' => 42, 'original_filename' => 'SUPPLEMENTAL NOTICE REGARDING RULE 3(G)(2) COMPLIANCE (August 18, 2026).pdf', 'stored_filename' => '0d4cebf9-2e39-4f17-8b62-2fba89d41494.pdf', 'file_path' => 'documents/0d4cebf9-2e39-4f17-8b62-2fba89d41494.pdf', 'title' => 'SUPPLEMENTAL NOTICE REGARDING RULE 3(G)(2) COMPLIANCE (August 18, 2026)', 'summary' => '', 'notes' => '', 'file_size' => 450998, 'display_order' => 0, 'created_at' => '2025-08-24 15:23:10.332', 'updated_at' => '2025-08-24 15:23:10.332', 'mime_type' => 'application/pdf'],
|
||||
['id' => 37, 'docket_entry_id' => 43, 'original_filename' => 'Notice of Filing Proposed Scheduling Order 08:20:2025.pdf', 'stored_filename' => '9b6c1274-2786-44fe-87c4-750b1e310f4a.pdf', 'file_path' => 'documents/9b6c1274-2786-44fe-87c4-750b1e310f4a.pdf', 'title' => 'Notice of Filing Proposed Scheduling Order 08:20:2025', 'summary' => '', 'notes' => '', 'file_size' => 87493, 'display_order' => 0, 'created_at' => '2025-08-26 21:17:45.796', 'updated_at' => '2025-08-26 21:17:45.796', 'mime_type' => 'application/pdf'],
|
||||
['id' => 38, 'docket_entry_id' => 44, 'original_filename' => 'Proposed Scheduling Order 08:20:2025.pdf', 'stored_filename' => 'f543d62a-817b-4dbe-b9f7-6d36a9ee59b2.pdf', 'file_path' => 'documents/f543d62a-817b-4dbe-b9f7-6d36a9ee59b2.pdf', 'title' => 'Proposed Scheduling Order 08:20:2025', 'summary' => '', 'notes' => '', 'file_size' => 2370599, 'display_order' => 0, 'created_at' => '2025-08-26 21:19:22.22', 'updated_at' => '2025-08-26 21:19:22.22', 'mime_type' => 'application/pdf'],
|
||||
['id' => 40, 'docket_entry_id' => 46, 'original_filename' => '2025.08.22 MAD\'s Response to Kragh\'s Motion for Protective Order.pdf', 'stored_filename' => '8b28b36f-08ce-4cdc-aad0-5d535b558e5b.pdf', 'file_path' => 'documents/8b28b36f-08ce-4cdc-aad0-5d535b558e5b.pdf', 'title' => '2025.08.22 MAD\'s Response to Kragh\'s Motion for Protective Order', 'summary' => '', 'notes' => '', 'file_size' => 1340870, 'display_order' => 0, 'created_at' => '2025-08-26 21:37:25.077', 'updated_at' => '2025-08-26 21:37:25.077', 'mime_type' => 'application/pdf'],
|
||||
['id' => 41, 'docket_entry_id' => 47, 'original_filename' => '28 Scheduling Order 08:25:2025.pdf', 'stored_filename' => '120f303c-91db-409f-a028-543fb6019dcb.pdf', 'file_path' => 'documents/120f303c-91db-409f-a028-543fb6019dcb.pdf', 'title' => '28 Scheduling Order 08:25:2025', 'summary' => '', 'notes' => '', 'file_size' => 2416317, 'display_order' => 0, 'created_at' => '2025-08-31 19:05:01.606', 'updated_at' => '2025-08-31 19:05:01.606', 'mime_type' => 'application/pdf'],
|
||||
['id' => 42, 'docket_entry_id' => 48, 'original_filename' => '2025.08.29 MAD\'s Response to MX to Dismiss (1).pdf', 'stored_filename' => 'ea040083-d7f0-4393-822b-59d8e77eccf0.pdf', 'file_path' => 'documents/ea040083-d7f0-4393-822b-59d8e77eccf0.pdf', 'title' => '2025.08.29 MAD\'s Response to MX to Dismiss (1)', 'summary' => '', 'notes' => '', 'file_size' => 279201, 'display_order' => 0, 'created_at' => '2025-09-05 02:25:03.18', 'updated_at' => '2025-09-05 02:25:03.18', 'mime_type' => 'application/pdf'],
|
||||
['id' => 43, 'docket_entry_id' => 49, 'original_filename' => 'REPLY BRIEF IN SUPPORT OF PLAINTIFF\'S MOTION TO DISMISS COUNTERCLAIMS AND STRIKE AFFIRMATIVE DEFENSES (September 2, 2025).pdf', 'stored_filename' => '890a4fd1-d25e-4d03-952c-68b22173b97d.pdf', 'file_path' => 'documents/890a4fd1-d25e-4d03-952c-68b22173b97d.pdf', 'title' => 'REPLY BRIEF IN SUPPORT OF PLAINTIFF\'S MOTION TO DISMISS COUNTERCLAIMS AND STRIKE AFFIRMATIVE DEFENSES (September 2, 2025)', 'summary' => '', 'notes' => '', 'file_size' => 1460459, 'display_order' => 0, 'created_at' => '2025-09-05 22:34:39.922', 'updated_at' => '2025-09-05 22:34:39.922', 'mime_type' => 'application/pdf'],
|
||||
['id' => 44, 'docket_entry_id' => 50, 'original_filename' => 'REPLY BRIEF IN SUPPORT OF PLAINTIFF\'S MOTION FOR PROTECTIVE ORDER (September 2, 2025).pdf', 'stored_filename' => '6418adb6-522c-4141-af54-c457da8a48a1.pdf', 'file_path' => 'documents/6418adb6-522c-4141-af54-c457da8a48a1.pdf', 'title' => 'REPLY BRIEF IN SUPPORT OF PLAINTIFF\'S MOTION FOR PROTECTIVE ORDER (September 2, 2025)', 'summary' => '', 'notes' => '', 'file_size' => 2165420, 'display_order' => 0, 'created_at' => '2025-09-05 22:35:36.038', 'updated_at' => '2025-09-05 22:35:36.038', 'mime_type' => 'application/pdf'],
|
||||
['id' => 45, 'docket_entry_id' => 51, 'original_filename' => 'Notice Of Service of Discovery Responses (September 8, 2025)-2.pdf', 'stored_filename' => '263d0930-e617-4a10-ba5f-2719cf5123d6.pdf', 'file_path' => 'documents/263d0930-e617-4a10-ba5f-2719cf5123d6.pdf', 'title' => 'Notice Of Service of Discovery Responses (September 8, 2025)-2', 'summary' => '', 'notes' => '', 'file_size' => 588054, 'display_order' => 0, 'created_at' => '2025-09-11 03:13:33.585', 'updated_at' => '2025-09-11 03:13:33.585', 'mime_type' => 'application/pdf'],
|
||||
['id' => 46, 'docket_entry_id' => 52, 'original_filename' => '2025.09.15 Notice of Service.pdf', 'stored_filename' => 'b265a58c-39e7-49ef-9bcc-12ee495943eb.pdf', 'file_path' => 'documents/b265a58c-39e7-49ef-9bcc-12ee495943eb.pdf', 'title' => '2025.09.15 Notice of Service', 'summary' => '', 'notes' => '', 'file_size' => 116109, 'display_order' => 0, 'created_at' => '2025-09-22 03:07:48.166', 'updated_at' => '2025-09-22 03:07:48.166', 'mime_type' => 'application/pdf'],
|
||||
['id' => 47, 'docket_entry_id' => 53, 'original_filename' => '34 Order.pdf', 'stored_filename' => '17406665-163b-40c4-b63b-4968cd4bff28.pdf', 'file_path' => 'documents/17406665-163b-40c4-b63b-4968cd4bff28.pdf', 'title' => '34 Order', 'summary' => '', 'notes' => '', 'file_size' => 958614, 'display_order' => 0, 'created_at' => '2025-09-27 23:16:18.329', 'updated_at' => '2025-09-27 23:16:18.329', 'mime_type' => 'application/pdf'],
|
||||
['id' => 48, 'docket_entry_id' => 54, 'original_filename' => 'MAD\'SMotionforSummaryJudgement.pdf', 'stored_filename' => '787faf65-5d11-4785-8a93-5f5b3d5fc00a.pdf', 'file_path' => 'documents/787faf65-5d11-4785-8a93-5f5b3d5fc00a.pdf', 'title' => 'MAD\'SMotionforSummaryJudgement', 'summary' => '', 'notes' => '', 'file_size' => 146748, 'display_order' => 0, 'created_at' => '2025-10-08 18:22:13.047', 'updated_at' => '2025-10-08 18:22:13.047', 'mime_type' => 'application/pdf'],
|
||||
['id' => 49, 'docket_entry_id' => 55, 'original_filename' => 'BISOMADMotionforSummaryJudgment.pdf', 'stored_filename' => '8d0154b4-8f08-41e6-9aa1-8ce4c84fa7af.pdf', 'file_path' => 'documents/8d0154b4-8f08-41e6-9aa1-8ce4c84fa7af.pdf', 'title' => 'BISOMADMotionforSummaryJudgment', 'summary' => '', 'notes' => '', 'file_size' => 302820, 'display_order' => 0, 'created_at' => '2025-10-08 18:23:51.899', 'updated_at' => '2025-10-08 18:23:51.899', 'mime_type' => 'application/pdf'],
|
||||
['id' => 50, 'docket_entry_id' => 56, 'original_filename' => 'LacnyDeclarationinSupportofMSJ.pdf', 'stored_filename' => '7a972bdf-bc97-4be5-a8c2-55f0d3a38d42.pdf', 'file_path' => 'documents/7a972bdf-bc97-4be5-a8c2-55f0d3a38d42.pdf', 'title' => 'LacnyDeclarationinSupportofMSJ', 'summary' => '', 'notes' => '', 'file_size' => 1751587, 'display_order' => 0, 'created_at' => '2025-10-08 18:24:58.657', 'updated_at' => '2025-10-08 18:24:58.657', 'mime_type' => 'application/pdf'],
|
||||
['id' => 51, 'docket_entry_id' => 57, 'original_filename' => 'MOTION TO COMPEL DISCOVERY.pdf', 'stored_filename' => '105a7fb1-3fdb-4d86-9250-d79c61997349.pdf', 'file_path' => 'documents/105a7fb1-3fdb-4d86-9250-d79c61997349.pdf', 'title' => 'MOTION TO COMPEL DISCOVERY', 'summary' => '', 'notes' => '', 'file_size' => 940071, 'display_order' => 0, 'created_at' => '2025-10-08 18:42:25.834', 'updated_at' => '2025-10-08 18:42:25.834', 'mime_type' => 'application/pdf'],
|
||||
['id' => 52, 'docket_entry_id' => 58, 'original_filename' => 'Exhibits.pdf', 'stored_filename' => '75ad46f0-2d99-444f-bdef-659982cf52c7.pdf', 'file_path' => 'documents/75ad46f0-2d99-444f-bdef-659982cf52c7.pdf', 'title' => 'Exhibits', 'summary' => '', 'notes' => '', 'file_size' => 8496288, 'display_order' => 0, 'created_at' => '2025-10-08 18:43:38.741', 'updated_at' => '2025-10-08 18:43:38.741', 'mime_type' => 'application/pdf'],
|
||||
['id' => 53, 'docket_entry_id' => 59, 'original_filename' => '[PROPOSED] ORDER GRANTING MOTION TO COMPEL DISCOVERY.pdf', 'stored_filename' => '50cee894-78d5-44d0-a876-d5e6b1a77531.pdf', 'file_path' => 'documents/50cee894-78d5-44d0-a876-d5e6b1a77531.pdf', 'title' => '[PROPOSED] ORDER GRANTING MOTION TO COMPEL DISCOVERY', 'summary' => '', 'notes' => '', 'file_size' => 130494, 'display_order' => 0, 'created_at' => '2025-10-10 19:18:32.532', 'updated_at' => '2025-10-10 19:18:32.532', 'mime_type' => 'application/pdf'],
|
||||
['id' => 54, 'docket_entry_id' => 60, 'original_filename' => 'MOTION FOR ADDITIONAL DISCOVERY TIME PURSUANT TO RULE 56(f).pdf', 'stored_filename' => 'f92f2aea-a6e2-4a44-88eb-603a39245b08.pdf', 'file_path' => 'documents/f92f2aea-a6e2-4a44-88eb-603a39245b08.pdf', 'title' => 'MOTION FOR ADDITIONAL DISCOVERY TIME PURSUANT TO RULE 56(f)', 'summary' => '', 'notes' => '', 'file_size' => 1228332, 'display_order' => 0, 'created_at' => '2025-10-10 19:20:17.585', 'updated_at' => '2025-10-10 19:20:17.585', 'mime_type' => 'application/pdf'],
|
||||
['id' => 55, 'docket_entry_id' => 61, 'original_filename' => 'AFFIDAVIT IN SUPPORT OF RULE 56(f) MOTION.pdf', 'stored_filename' => 'c87574bc-c254-4b69-bc56-6676c163daf1.pdf', 'file_path' => 'documents/c87574bc-c254-4b69-bc56-6676c163daf1.pdf', 'title' => 'AFFIDAVIT IN SUPPORT OF RULE 56(f) MOTION', 'summary' => '', 'notes' => '', 'file_size' => 1033222, 'display_order' => 0, 'created_at' => '2025-10-10 19:21:28.59', 'updated_at' => '2025-10-10 19:21:28.59', 'mime_type' => 'application/pdf'],
|
||||
['id' => 56, 'docket_entry_id' => 62, 'original_filename' => 'AFFIDAVIT OF ELIZABETH KRAGH IN SUPPORT OF MOTION TO MODIFY SCHEDULING ORDER.pdf', 'stored_filename' => '6bddd7e8-5d95-4e7d-934f-d54eff9bfac8.pdf', 'file_path' => 'documents/6bddd7e8-5d95-4e7d-934f-d54eff9bfac8.pdf', 'title' => 'AFFIDAVIT OF ELIZABETH KRAGH IN SUPPORT OF MOTION TO MODIFY SCHEDULING ORDER', 'summary' => '', 'notes' => '', 'file_size' => 932377, 'display_order' => 0, 'created_at' => '2025-10-12 02:38:59.403', 'updated_at' => '2025-10-12 02:38:59.403', 'mime_type' => 'application/pdf'],
|
||||
['id' => 57, 'docket_entry_id' => 63, 'original_filename' => 'MOTION TO MODIFY SCHEDULING ORDER - EXTENSION OF COMPLAINT AMENDMENT DEADLINE.pdf', 'stored_filename' => 'ed5904c1-017b-4cb7-a247-9702e33cb109.pdf', 'file_path' => 'documents/ed5904c1-017b-4cb7-a247-9702e33cb109.pdf', 'title' => 'MOTION TO MODIFY SCHEDULING ORDER - EXTENSION OF COMPLAINT AMENDMENT DEADLINE', 'summary' => '', 'notes' => '', 'file_size' => 1313886, 'display_order' => 0, 'created_at' => '2025-10-12 02:40:20.483', 'updated_at' => '2025-10-12 02:40:20.483', 'mime_type' => 'application/pdf'],
|
||||
['id' => 58, 'docket_entry_id' => 64, 'original_filename' => 'PROPOSED ORDER GRANTING MOTION TO MODIFY SCHEDULING ORDER.pdf', 'stored_filename' => '51cc05eb-b388-45bf-9a10-33bbd7c00db3.pdf', 'file_path' => 'documents/51cc05eb-b388-45bf-9a10-33bbd7c00db3.pdf', 'title' => 'PROPOSED ORDER GRANTING MOTION TO MODIFY SCHEDULING ORDER', 'summary' => '', 'notes' => '', 'file_size' => 109939, 'display_order' => 0, 'created_at' => '2025-10-12 02:41:36.875', 'updated_at' => '2025-10-12 02:41:36.875', 'mime_type' => 'application/pdf'],
|
||||
['id' => 59, 'docket_entry_id' => 65, 'original_filename' => 'Notice Of Service of Discovery Responses (October 21, 2025).pdf', 'stored_filename' => 'a846f4c6-9ef5-4f7f-ae67-95e1b9af4644.pdf', 'file_path' => 'documents/a846f4c6-9ef5-4f7f-ae67-95e1b9af4644.pdf', 'title' => 'Notice Of Service of Discovery Responses (October 21, 2025)', 'summary' => '', 'notes' => '', 'file_size' => 290204, 'display_order' => 0, 'created_at' => '2025-11-09 20:19:56.84', 'updated_at' => '2025-11-09 20:19:56.84', 'mime_type' => 'application/pdf'],
|
||||
['id' => 60, 'docket_entry_id' => 66, 'original_filename' => 'MOTION TO STRIKE IMPROPERLY FILED DISCOVERY RESPONSES.pdf', 'stored_filename' => '051bcfa0-67ad-41a2-9045-fd0b7e8fe5cd.pdf', 'file_path' => 'documents/051bcfa0-67ad-41a2-9045-fd0b7e8fe5cd.pdf', 'title' => 'MOTION TO STRIKE IMPROPERLY FILED DISCOVERY RESPONSES', 'summary' => '', 'notes' => '', 'file_size' => 567643, 'display_order' => 0, 'created_at' => '2025-11-09 20:21:47.692', 'updated_at' => '2025-11-09 20:21:47.692', 'mime_type' => 'application/pdf'],
|
||||
['id' => 61, 'docket_entry_id' => 67, 'original_filename' => '49 Order Granting Motion to Strike Improperly Filed Discovery Responses.pdf', 'stored_filename' => '57982aa8-739d-487a-9aa4-418d16c98de5.pdf', 'file_path' => 'documents/57982aa8-739d-487a-9aa4-418d16c98de5.pdf', 'title' => '49 Order Granting Motion to Strike Improperly Filed Discovery Responses', 'summary' => '', 'notes' => '', 'file_size' => 878809, 'display_order' => 0, 'created_at' => '2025-11-09 23:31:54.831', 'updated_at' => '2025-11-09 23:31:54.831', 'mime_type' => 'application/pdf'],
|
||||
['id' => 62, 'docket_entry_id' => 68, 'original_filename' => '2025.10.24 MAD Response to MTC and Cross-Motion for Protective Order.pdf', 'stored_filename' => '985b5e38-4393-4e0f-b119-87d73d6279e3.pdf', 'file_path' => 'documents/985b5e38-4393-4e0f-b119-87d73d6279e3.pdf', 'title' => '2025.10.24 MAD Response to MTC and Cross-Motion for Protective Order', 'summary' => '', 'notes' => '', 'file_size' => 697398, 'display_order' => 0, 'created_at' => '2025-11-09 23:34:02.101', 'updated_at' => '2025-11-09 23:34:02.101', 'mime_type' => 'application/pdf'],
|
||||
['id' => 63, 'docket_entry_id' => 70, 'original_filename' => ' MAD Combined Response to Rule 56F and MX to Extend.pdf', 'stored_filename' => '9b302464-27f6-4673-ac13-88787fc3e148.pdf', 'file_path' => 'documents/9b302464-27f6-4673-ac13-88787fc3e148.pdf', 'title' => ' MAD Combined Response to Rule 56F and MX to Extend', 'summary' => '', 'notes' => '', 'file_size' => 2968585, 'display_order' => 0, 'created_at' => '2025-11-09 23:37:51.447', 'updated_at' => '2025-11-09 23:37:51.447', 'mime_type' => 'application/pdf'],
|
||||
['id' => 64, 'docket_entry_id' => 71, 'original_filename' => 'Motion_to_extend_time-10.28.25.pdf', 'stored_filename' => '75f79efc-1263-45c8-9720-eab30ac5f0d0.pdf', 'file_path' => 'documents/75f79efc-1263-45c8-9720-eab30ac5f0d0.pdf', 'title' => 'Motion_to_extend_time-10.28.25', 'summary' => '', 'notes' => '', 'file_size' => 1045115, 'display_order' => 0, 'created_at' => '2025-11-09 23:39:13.777', 'updated_at' => '2025-11-09 23:39:13.777', 'mime_type' => 'application/pdf'],
|
||||
['id' => 65, 'docket_entry_id' => 72, 'original_filename' => '53 Order Granting Motion to Extend Time For Filing Reply Briefs.pdf', 'stored_filename' => '243e3d14-1201-43f1-90a4-c9b0df8b2f42.pdf', 'file_path' => 'documents/243e3d14-1201-43f1-90a4-c9b0df8b2f42.pdf', 'title' => '53 Order Granting Motion to Extend Time For Filing Reply Briefs', 'summary' => '', 'notes' => '', 'file_size' => 849616, 'display_order' => 0, 'created_at' => '2025-11-09 23:40:37.466', 'updated_at' => '2025-11-09 23:40:37.466', 'mime_type' => 'application/pdf'],
|
||||
['id' => 66, 'docket_entry_id' => 73, 'original_filename' => 'REPLY BRIEF IN SUPPORT OF MOTION TO MODIFY SCHEDULING ORDER.pdf', 'stored_filename' => '63f26d51-a889-4c3b-b2fb-0a73b4fad040.pdf', 'file_path' => 'documents/63f26d51-a889-4c3b-b2fb-0a73b4fad040.pdf', 'title' => 'REPLY BRIEF IN SUPPORT OF MOTION TO MODIFY SCHEDULING ORDER', 'summary' => '', 'notes' => '', 'file_size' => 1273886, 'display_order' => 0, 'created_at' => '2025-11-13 20:36:00.392', 'updated_at' => '2025-11-13 20:36:00.392', 'mime_type' => 'application/pdf'],
|
||||
['id' => 67, 'docket_entry_id' => 75, 'original_filename' => 'REPLY BRIEF IN SUPPORT OF MOTION FOR ADDITIONAL DISCOVERY TIME PURSUANT TO RULE 56(f).pdf', 'stored_filename' => 'fd705e60-4393-4262-a231-4d43fa6ccc7e.pdf', 'file_path' => 'documents/fd705e60-4393-4262-a231-4d43fa6ccc7e.pdf', 'title' => 'REPLY BRIEF IN SUPPORT OF MOTION FOR ADDITIONAL DISCOVERY TIME PURSUANT TO RULE 56(f)', 'summary' => '', 'notes' => '', 'file_size' => 1293569, 'display_order' => 0, 'created_at' => '2025-11-13 20:39:05.692', 'updated_at' => '2025-11-13 20:39:05.692', 'mime_type' => 'application/pdf'],
|
||||
['id' => 68, 'docket_entry_id' => 76, 'original_filename' => 'REPLY BRIEF IN SUPPORT OF MOTION TO COMPEL DISCOVERY.pdf', 'stored_filename' => '1161cce9-3ebb-40e5-a9dd-b45db293fdf5.pdf', 'file_path' => 'documents/1161cce9-3ebb-40e5-a9dd-b45db293fdf5.pdf', 'title' => 'REPLY BRIEF IN SUPPORT OF MOTION TO COMPEL DISCOVERY', 'summary' => '', 'notes' => '', 'file_size' => 1296325, 'display_order' => 0, 'created_at' => '2025-11-13 20:40:55.025', 'updated_at' => '2025-11-13 20:40:55.025', 'mime_type' => 'application/pdf'],
|
||||
];
|
||||
|
||||
foreach ($documents as $document) {
|
||||
Document::create($document);
|
||||
}
|
||||
|
||||
$this->command->info('Imported ' . count($documents) . ' documents');
|
||||
}
|
||||
|
||||
private function importSubscriptions(): void
|
||||
{
|
||||
$subscriptions = [
|
||||
['id' => 1, 'email' => 'chris@sigd.net', 'is_active' => true, 'unsubscribe_token' => 'b23fb3e1-2dff-4f81-a317-5d51b1049aa4', 'created_at' => '2025-06-25 21:38:03.618'],
|
||||
['id' => 2, 'email' => 'peanuts260@gmail.com', 'is_active' => true, 'unsubscribe_token' => '4bcbdf8a-7e8f-4bca-8a73-e25b0c9bfc02', 'created_at' => '2025-06-27 10:02:45.786'],
|
||||
['id' => 3, 'email' => 'Jana.Bifi@gmail.com', 'is_active' => true, 'unsubscribe_token' => 'f75a8d51-6281-4841-8be3-b1f2d88d1110', 'created_at' => '2025-06-27 16:32:28.778'],
|
||||
['id' => 4, 'email' => 'pinerusticnickel6895@gmail.com', 'is_active' => true, 'unsubscribe_token' => '587cb35e-9974-4c13-9076-6e1cc753faf2', 'created_at' => '2025-06-27 19:10:18.781'],
|
||||
['id' => 5, 'email' => 'surdus.law@gmail.com', 'is_active' => true, 'unsubscribe_token' => '5581d0b7-d8d5-4f04-a648-318bf2e12ba0', 'created_at' => '2025-06-27 21:56:18.553'],
|
||||
['id' => 6, 'email' => 'gmajabparis@gmail.com', 'is_active' => true, 'unsubscribe_token' => '861dd663-1b05-4cbe-8525-1c63ea234cde', 'created_at' => '2025-06-27 22:20:00.427'],
|
||||
['id' => 7, 'email' => 'wheeler6811@aol.com', 'is_active' => true, 'unsubscribe_token' => '7af79759-2c8f-464d-b3f0-e6807311f6dd', 'created_at' => '2025-06-28 03:31:46.426'],
|
||||
['id' => 8, 'email' => 'Jared@Allebest.com', 'is_active' => true, 'unsubscribe_token' => '464a7cef-ff03-4c01-8443-354fb296464e', 'created_at' => '2025-06-28 23:00:04.484'],
|
||||
['id' => 9, 'email' => 'kimanderson.ks@gmail.com', 'is_active' => true, 'unsubscribe_token' => '798ba07c-4d03-4afb-828c-df81c72650c2', 'created_at' => '2025-06-29 14:55:30.011'],
|
||||
['id' => 25, 'email' => 'tane.schulte@gmail.com', 'is_active' => true, 'unsubscribe_token' => 'a85a06d4-124e-4164-8459-51a5c68adbf5', 'created_at' => '2025-09-29 01:03:14.805'],
|
||||
['id' => 26, 'email' => 'trnelson89@gmail.com', 'is_active' => true, 'unsubscribe_token' => '5a3b50a5-d0c7-4441-a41e-c0b9a5075979', 'created_at' => '2025-10-24 16:27:59.56'],
|
||||
['id' => 27, 'email' => 'letsgetonacid222@gmail.com', 'is_active' => true, 'unsubscribe_token' => 'fac65b07-79d3-4165-aaca-84ec3332ae85', 'created_at' => '2025-10-28 16:18:00.457'],
|
||||
['id' => 28, 'email' => 'quarks.tattoo-09@icloud.com', 'is_active' => true, 'unsubscribe_token' => 'd8b53e7c-5a69-4670-85fe-604bc83813b2', 'created_at' => '2025-11-19 03:03:45.528'],
|
||||
['id' => 10, 'email' => 'ksymansky@gmail.com', 'is_active' => true, 'unsubscribe_token' => 'b87f9a94-5cc1-4d9f-ad77-a1be4eb038ea', 'created_at' => '2025-07-01 01:21:19.951'],
|
||||
['id' => 11, 'email' => 'martleonor@aol.com', 'is_active' => true, 'unsubscribe_token' => '816440d6-c7d5-4847-a50e-7ac621eb6f86', 'created_at' => '2025-07-01 07:11:02.288'],
|
||||
['id' => 12, 'email' => 'this1is3john@gmail.com', 'is_active' => true, 'unsubscribe_token' => 'd3b5b72e-11aa-400c-9e2c-92f315819b27', 'created_at' => '2025-07-01 12:22:58.44'],
|
||||
['id' => 13, 'email' => 'alexabauch@icloud.com', 'is_active' => true, 'unsubscribe_token' => 'f66410b0-3400-468e-87ee-34b84c40e35b', 'created_at' => '2025-07-03 04:16:47.928'],
|
||||
['id' => 14, 'email' => 'wsad.president@gmail.com', 'is_active' => true, 'unsubscribe_token' => '982a0119-ea37-4151-acb2-04c27802a8a4', 'created_at' => '2025-07-04 20:06:14.97'],
|
||||
['id' => 15, 'email' => 'deafwantstoknow@gmail.com', 'is_active' => true, 'unsubscribe_token' => '6c40ff30-1e7a-4c73-a188-d04055987b3f', 'created_at' => '2025-07-09 05:27:50.182'],
|
||||
['id' => 17, 'email' => 'sjthomp0615@gmail.com', 'is_active' => true, 'unsubscribe_token' => '00fe7ff3-b42b-4c95-8882-efe68d0970f0', 'created_at' => '2025-07-18 19:05:23.217'],
|
||||
['id' => 18, 'email' => 'eliza.kragh@gmail.com', 'is_active' => true, 'unsubscribe_token' => '9fe988b3-d317-4a01-bdf5-aed2895e17ba', 'created_at' => '2025-07-25 21:38:58.027'],
|
||||
['id' => 19, 'email' => 'harding.cara89@gmail.com', 'is_active' => true, 'unsubscribe_token' => '74018cc6-4c7a-43af-891e-4949d5925fca', 'created_at' => '2025-07-26 00:01:22.296'],
|
||||
['id' => 20, 'email' => 'rindelsd@gmail.com', 'is_active' => true, 'unsubscribe_token' => '01eb9061-8c20-4667-bd46-71e48e6dc384', 'created_at' => '2025-07-26 00:04:44.454'],
|
||||
['id' => 21, 'email' => 'kat_kariann@hotmail.com', 'is_active' => true, 'unsubscribe_token' => '25ea5299-03f0-49e2-b556-447215e6d05c', 'created_at' => '2025-07-26 12:15:14.048'],
|
||||
['id' => 22, 'email' => 'thejustinrold@gmail.com', 'is_active' => true, 'unsubscribe_token' => 'b13d4d6a-1b51-4ee1-9a77-d38115d51d0b', 'created_at' => '2025-07-26 23:37:15.978'],
|
||||
['id' => 23, 'email' => 'ritabrandborg@gmail.com', 'is_active' => true, 'unsubscribe_token' => 'a8fbc7d9-81ed-4047-bab1-8d304597d4dd', 'created_at' => '2025-07-28 12:37:30.323'],
|
||||
['id' => 24, 'email' => 'fullerkim777@icloud.com', 'is_active' => true, 'unsubscribe_token' => '4effbe07-04df-4371-87bf-15f14b90f90e', 'created_at' => '2025-07-28 22:46:53.302'],
|
||||
['id' => 16, 'email' => 'mike.crago@gmail.com', 'is_active' => false, 'unsubscribe_token' => 'd2db168b-7869-4340-8d7c-fded7fc357b8', 'created_at' => '2025-07-14 23:58:34.353'],
|
||||
];
|
||||
|
||||
foreach ($subscriptions as $subscription) {
|
||||
Subscription::create($subscription);
|
||||
}
|
||||
|
||||
$this->command->info('Imported ' . count($subscriptions) . ' subscriptions');
|
||||
}
|
||||
}
|
||||
49
docker-compose.yml
Normal file
49
docker-compose.yml
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
version: '3.8'
|
||||
|
||||
services:
|
||||
app:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile
|
||||
container_name: mad-lawsuit-v2
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "8080:80"
|
||||
volumes:
|
||||
- ./storage:/var/www/html/storage
|
||||
- ./storage/app/public/documents:/var/www/html/storage/app/public/documents
|
||||
environment:
|
||||
- APP_ENV=production
|
||||
- APP_DEBUG=false
|
||||
env_file:
|
||||
- .env
|
||||
networks:
|
||||
- mad-network
|
||||
- caddy_network
|
||||
depends_on:
|
||||
- postgres
|
||||
|
||||
postgres:
|
||||
image: postgres:16-alpine
|
||||
container_name: mad-lawsuit-v2-db
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
POSTGRES_DB: mad_lawsuit_v2
|
||||
POSTGRES_USER: mad_user
|
||||
POSTGRES_PASSWORD: ${DB_PASSWORD}
|
||||
volumes:
|
||||
- postgres_data:/var/lib/postgresql/data
|
||||
networks:
|
||||
- mad-network
|
||||
ports:
|
||||
- "5433:5432"
|
||||
|
||||
networks:
|
||||
mad-network:
|
||||
driver: bridge
|
||||
caddy_network:
|
||||
external: true
|
||||
|
||||
volumes:
|
||||
postgres_data:
|
||||
driver: local
|
||||
48
docker/default.conf
Normal file
48
docker/default.conf
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
server {
|
||||
listen 80;
|
||||
server_name _;
|
||||
root /var/www/html/public;
|
||||
index index.php index.html;
|
||||
|
||||
charset utf-8;
|
||||
|
||||
# Security headers
|
||||
add_header X-Frame-Options "SAMEORIGIN" always;
|
||||
add_header X-Content-Type-Options "nosniff" always;
|
||||
add_header X-XSS-Protection "1; mode=block" always;
|
||||
|
||||
# Logging
|
||||
access_log /var/log/nginx/access.log;
|
||||
error_log /var/log/nginx/error.log;
|
||||
|
||||
# Handle Laravel routes
|
||||
location / {
|
||||
try_files $uri $uri/ /index.php?$query_string;
|
||||
}
|
||||
|
||||
# PHP-FPM configuration
|
||||
location ~ \.php$ {
|
||||
fastcgi_pass 127.0.0.1:9000;
|
||||
fastcgi_index index.php;
|
||||
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
|
||||
include fastcgi_params;
|
||||
fastcgi_param PATH_INFO $fastcgi_path_info;
|
||||
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
|
||||
fastcgi_buffer_size 128k;
|
||||
fastcgi_buffers 256 16k;
|
||||
fastcgi_busy_buffers_size 256k;
|
||||
fastcgi_temp_file_write_size 256k;
|
||||
fastcgi_read_timeout 600;
|
||||
}
|
||||
|
||||
# Deny access to hidden files
|
||||
location ~ /\.(?!well-known).* {
|
||||
deny all;
|
||||
}
|
||||
|
||||
# Static files caching
|
||||
location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)$ {
|
||||
expires 1y;
|
||||
add_header Cache-Control "public, immutable";
|
||||
}
|
||||
}
|
||||
34
docker/nginx.conf
Normal file
34
docker/nginx.conf
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
user www-data;
|
||||
worker_processes auto;
|
||||
pid /run/nginx.pid;
|
||||
error_log /var/log/nginx/error.log warn;
|
||||
|
||||
events {
|
||||
worker_connections 1024;
|
||||
}
|
||||
|
||||
http {
|
||||
include /etc/nginx/mime.types;
|
||||
default_type application/octet-stream;
|
||||
|
||||
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
|
||||
'$status $body_bytes_sent "$http_referer" '
|
||||
'"$http_user_agent" "$http_x_forwarded_for"';
|
||||
|
||||
access_log /var/log/nginx/access.log main;
|
||||
|
||||
sendfile on;
|
||||
tcp_nopush on;
|
||||
tcp_nodelay on;
|
||||
keepalive_timeout 65;
|
||||
types_hash_max_size 2048;
|
||||
client_max_body_size 20M;
|
||||
|
||||
gzip on;
|
||||
gzip_vary on;
|
||||
gzip_proxied any;
|
||||
gzip_comp_level 6;
|
||||
gzip_types text/plain text/css text/xml text/javascript application/json application/javascript application/xml+rss application/rss+xml font/truetype font/opentype application/vnd.ms-fontobject image/svg+xml;
|
||||
|
||||
include /etc/nginx/http.d/*.conf;
|
||||
}
|
||||
23
docker/supervisord.conf
Normal file
23
docker/supervisord.conf
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
[supervisord]
|
||||
nodaemon=true
|
||||
user=root
|
||||
logfile=/var/log/supervisor/supervisord.log
|
||||
pidfile=/var/run/supervisord.pid
|
||||
|
||||
[program:php-fpm]
|
||||
command=php-fpm8.3 -F
|
||||
stdout_logfile=/dev/stdout
|
||||
stdout_logfile_maxbytes=0
|
||||
stderr_logfile=/dev/stderr
|
||||
stderr_logfile_maxbytes=0
|
||||
autorestart=true
|
||||
startretries=0
|
||||
|
||||
[program:nginx]
|
||||
command=nginx -g 'daemon off;'
|
||||
stdout_logfile=/dev/stdout
|
||||
stdout_logfile_maxbytes=0
|
||||
stderr_logfile=/dev/stderr
|
||||
stderr_logfile_maxbytes=0
|
||||
autorestart=true
|
||||
startretries=0
|
||||
170
parse_sql_to_seeder.py
Executable file
170
parse_sql_to_seeder.py
Executable file
|
|
@ -0,0 +1,170 @@
|
|||
#!/usr/bin/env python3
|
||||
"""
|
||||
Parse PostgreSQL dump and generate Laravel seeder data arrays.
|
||||
Usage: python3 parse_sql_to_seeder.py /tmp/v1-data.sql
|
||||
"""
|
||||
|
||||
import re
|
||||
import sys
|
||||
import json
|
||||
|
||||
def parse_insert_statement(line, table_name):
|
||||
"""Parse a PostgreSQL INSERT statement into a Python dict."""
|
||||
# Extract VALUES clause
|
||||
match = re.search(r'VALUES \((.*)\);', line)
|
||||
if not match:
|
||||
return None
|
||||
|
||||
values_str = match.group(1)
|
||||
|
||||
# Split by comma, but respect quoted strings
|
||||
values = []
|
||||
current = ''
|
||||
in_quote = False
|
||||
escape_next = False
|
||||
|
||||
for char in values_str:
|
||||
if escape_next:
|
||||
current += char
|
||||
escape_next = False
|
||||
continue
|
||||
|
||||
if char == '\\':
|
||||
escape_next = True
|
||||
current += char
|
||||
continue
|
||||
|
||||
if char == "'":
|
||||
in_quote = not in_quote
|
||||
current += char
|
||||
continue
|
||||
|
||||
if char == ',' and not in_quote:
|
||||
values.append(current.strip())
|
||||
current = ''
|
||||
continue
|
||||
|
||||
current += char
|
||||
|
||||
if current:
|
||||
values.append(current.strip())
|
||||
|
||||
# Clean up values
|
||||
cleaned_values = []
|
||||
for v in values:
|
||||
v = v.strip()
|
||||
if v == 'NULL':
|
||||
cleaned_values.append(None)
|
||||
elif v.startswith("'") and v.endswith("'"):
|
||||
# Remove quotes and unescape
|
||||
v = v[1:-1]
|
||||
v = v.replace("''", "'") # PostgreSQL escapes single quotes by doubling them
|
||||
v = v.replace("\\\\", "\\")
|
||||
cleaned_values.append(v)
|
||||
elif v.lower() == 'true':
|
||||
cleaned_values.append(True)
|
||||
elif v.lower() == 'false':
|
||||
cleaned_values.append(False)
|
||||
else:
|
||||
# Try to parse as number
|
||||
try:
|
||||
if '.' in v:
|
||||
cleaned_values.append(float(v))
|
||||
else:
|
||||
cleaned_values.append(int(v))
|
||||
except ValueError:
|
||||
cleaned_values.append(v)
|
||||
|
||||
return cleaned_values
|
||||
|
||||
def values_to_php_array(values, schema):
|
||||
"""Convert values list to PHP array string."""
|
||||
php_parts = []
|
||||
for key, value in zip(schema, values):
|
||||
if value is None:
|
||||
php_value = 'null'
|
||||
elif isinstance(value, bool):
|
||||
php_value = 'true' if value else 'false'
|
||||
elif isinstance(value, (int, float)):
|
||||
php_value = str(value)
|
||||
else:
|
||||
# Escape for PHP string
|
||||
value = str(value).replace('\\', '\\\\').replace("'", "\\'")
|
||||
php_value = f"'{value}'"
|
||||
php_parts.append(f"'{key}' => {php_value}")
|
||||
|
||||
return '[' + ', '.join(php_parts) + ']'
|
||||
|
||||
def main():
|
||||
if len(sys.argv) != 2:
|
||||
print("Usage: python3 parse_sql_to_seeder.py /tmp/v1-data.sql")
|
||||
sys.exit(1)
|
||||
|
||||
sql_file = sys.argv[1]
|
||||
|
||||
# Define schemas
|
||||
docket_schema = ['id', 'date', 'summary', 'created_at', 'updated_at', 'notes', 'title']
|
||||
document_schema = ['id', 'docket_entry_id', 'original_filename', 'stored_filename', 'file_path',
|
||||
'title', 'summary', 'notes', 'file_size', 'display_order', 'created_at',
|
||||
'updated_at', 'mime_type']
|
||||
subscription_schema = ['id', 'email', 'is_active', 'unsubscribe_token', 'created_at']
|
||||
|
||||
entries = []
|
||||
documents = []
|
||||
subscriptions = []
|
||||
|
||||
print("Parsing SQL dump...")
|
||||
|
||||
with open(sql_file, 'r') as f:
|
||||
for line in f:
|
||||
line = line.strip()
|
||||
|
||||
if line.startswith('INSERT INTO public.docket_entries'):
|
||||
values = parse_insert_statement(line, 'docket_entries')
|
||||
if values and len(values) == len(docket_schema):
|
||||
entries.append(values_to_php_array(values, docket_schema))
|
||||
|
||||
elif line.startswith('INSERT INTO public.documents'):
|
||||
values = parse_insert_statement(line, 'documents')
|
||||
if values and len(values) == len(document_schema):
|
||||
documents.append(values_to_php_array(values, document_schema))
|
||||
|
||||
elif line.startswith('INSERT INTO public.subscriptions'):
|
||||
values = parse_insert_statement(line, 'subscriptions')
|
||||
if values and len(values) == len(subscription_schema):
|
||||
subscriptions.append(values_to_php_array(values, subscription_schema))
|
||||
|
||||
print(f"\nParsed:")
|
||||
print(f" - {len(entries)} docket entries")
|
||||
print(f" - {len(documents)} documents")
|
||||
print(f" - {len(subscriptions)} subscriptions")
|
||||
|
||||
# Generate PHP code
|
||||
print("\n" + "="*80)
|
||||
print("DOCKET ENTRIES ARRAY:")
|
||||
print("="*80)
|
||||
print("$entries = [")
|
||||
for entry in entries:
|
||||
print(f" {entry},")
|
||||
print("];")
|
||||
|
||||
print("\n" + "="*80)
|
||||
print("DOCUMENTS ARRAY:")
|
||||
print("="*80)
|
||||
print("$documents = [")
|
||||
for doc in documents:
|
||||
print(f" {doc},")
|
||||
print("];")
|
||||
|
||||
print("\n" + "="*80)
|
||||
print("SUBSCRIPTIONS ARRAY:")
|
||||
print("="*80)
|
||||
print("$subscriptions = [")
|
||||
for sub in subscriptions:
|
||||
print(f" {sub},")
|
||||
print("];")
|
||||
|
||||
print("\n✅ Done! Copy the arrays above into V1DataMigrationSeeder.php")
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
198
parse_sql_to_seeder_v2.py
Normal file
198
parse_sql_to_seeder_v2.py
Normal file
|
|
@ -0,0 +1,198 @@
|
|||
#!/usr/bin/env python3
|
||||
"""
|
||||
Parse PostgreSQL dump and generate Laravel seeder data arrays.
|
||||
VERSION 2: Handles multi-line INSERT statements
|
||||
Usage: python3 parse_sql_to_seeder_v2.py /tmp/v1-data.sql
|
||||
"""
|
||||
|
||||
import re
|
||||
import sys
|
||||
|
||||
def parse_multiline_inserts(content, table_name):
|
||||
"""Parse multi-line INSERT statements from SQL content."""
|
||||
# Pattern to match complete INSERT statements (including multi-line)
|
||||
pattern = rf"INSERT INTO public\.{table_name}[^;]+VALUES\s*\((.*?)\);"
|
||||
matches = re.findall(pattern, content, re.DOTALL)
|
||||
return matches
|
||||
|
||||
def parse_values(values_str):
|
||||
"""Parse VALUES clause into a list of cleaned values."""
|
||||
values = []
|
||||
current = ''
|
||||
in_quote = False
|
||||
escape_next = False
|
||||
paren_depth = 0
|
||||
|
||||
for char in values_str:
|
||||
if escape_next:
|
||||
current += char
|
||||
escape_next = False
|
||||
continue
|
||||
|
||||
if char == '\\':
|
||||
escape_next = True
|
||||
current += char
|
||||
continue
|
||||
|
||||
if char == "'":
|
||||
in_quote = not in_quote
|
||||
current += char
|
||||
continue
|
||||
|
||||
if not in_quote:
|
||||
if char == '(':
|
||||
paren_depth += 1
|
||||
current += char
|
||||
continue
|
||||
elif char == ')':
|
||||
paren_depth -= 1
|
||||
current += char
|
||||
continue
|
||||
elif char == ',' and paren_depth == 0:
|
||||
values.append(current.strip())
|
||||
current = ''
|
||||
continue
|
||||
|
||||
current += char
|
||||
|
||||
if current.strip():
|
||||
values.append(current.strip())
|
||||
|
||||
# Clean up values
|
||||
cleaned_values = []
|
||||
for v in values:
|
||||
v = v.strip()
|
||||
if v == 'NULL':
|
||||
cleaned_values.append(None)
|
||||
elif v.startswith("'") and v.endswith("'"):
|
||||
# Remove quotes and unescape
|
||||
v = v[1:-1]
|
||||
v = v.replace("''", "'") # PostgreSQL escapes single quotes by doubling them
|
||||
v = v.replace("\\n", "\n") # Handle newlines
|
||||
v = v.replace("\\r", "\r")
|
||||
v = v.replace("\\t", "\t")
|
||||
v = v.replace("\\\\", "\\")
|
||||
cleaned_values.append(v)
|
||||
elif v.lower() == 'true':
|
||||
cleaned_values.append(True)
|
||||
elif v.lower() == 'false':
|
||||
cleaned_values.append(False)
|
||||
else:
|
||||
# Try to parse as number
|
||||
try:
|
||||
if '.' in v:
|
||||
cleaned_values.append(float(v))
|
||||
else:
|
||||
cleaned_values.append(int(v))
|
||||
except ValueError:
|
||||
cleaned_values.append(v)
|
||||
|
||||
return cleaned_values
|
||||
|
||||
def values_to_php_array(values, schema):
|
||||
"""Convert values list to PHP array string."""
|
||||
php_parts = []
|
||||
for key, value in zip(schema, values):
|
||||
if value is None:
|
||||
php_value = 'null'
|
||||
elif isinstance(value, bool):
|
||||
php_value = 'true' if value else 'false'
|
||||
elif isinstance(value, (int, float)):
|
||||
php_value = str(value)
|
||||
else:
|
||||
# Escape for PHP string
|
||||
value = str(value).replace('\\', '\\\\').replace("'", "\\'")
|
||||
php_value = f"'{value}'"
|
||||
php_parts.append(f"'{key}' => {php_value}")
|
||||
|
||||
return '[' + ', '.join(php_parts) + ']'
|
||||
|
||||
def main():
|
||||
if len(sys.argv) != 2:
|
||||
print("Usage: python3 parse_sql_to_seeder_v2.py /tmp/v1-data.sql")
|
||||
sys.exit(1)
|
||||
|
||||
sql_file = sys.argv[1]
|
||||
|
||||
# Define schemas
|
||||
docket_schema = ['id', 'date', 'summary', 'created_at', 'updated_at', 'notes', 'title']
|
||||
document_schema = ['id', 'docket_entry_id', 'original_filename', 'stored_filename', 'file_path',
|
||||
'title', 'summary', 'notes', 'file_size', 'display_order', 'created_at',
|
||||
'updated_at', 'mime_type']
|
||||
subscription_schema = ['id', 'email', 'is_active', 'unsubscribe_token', 'created_at']
|
||||
|
||||
print("Reading SQL dump...")
|
||||
with open(sql_file, 'r') as f:
|
||||
content = f.read()
|
||||
|
||||
print("Parsing multi-line INSERT statements...")
|
||||
|
||||
# Parse each table
|
||||
docket_matches = parse_multiline_inserts(content, 'docket_entries')
|
||||
document_matches = parse_multiline_inserts(content, 'documents')
|
||||
subscription_matches = parse_multiline_inserts(content, 'subscriptions')
|
||||
|
||||
print(f"\nFound:")
|
||||
print(f" - {len(docket_matches)} docket entry INSERT statements")
|
||||
print(f" - {len(document_matches)} document INSERT statements")
|
||||
print(f" - {len(subscription_matches)} subscription INSERT statements")
|
||||
|
||||
# Parse values
|
||||
entries = []
|
||||
for match in docket_matches:
|
||||
values = parse_values(match)
|
||||
if len(values) == len(docket_schema):
|
||||
entries.append(values_to_php_array(values, docket_schema))
|
||||
else:
|
||||
print(f"Warning: Skipping docket entry with {len(values)} values (expected {len(docket_schema)})")
|
||||
|
||||
documents = []
|
||||
for match in document_matches:
|
||||
values = parse_values(match)
|
||||
if len(values) == len(document_schema):
|
||||
documents.append(values_to_php_array(values, document_schema))
|
||||
else:
|
||||
print(f"Warning: Skipping document with {len(values)} values (expected {len(document_schema)})")
|
||||
|
||||
subscriptions = []
|
||||
for match in subscription_matches:
|
||||
values = parse_values(match)
|
||||
if len(values) == len(subscription_schema):
|
||||
subscriptions.append(values_to_php_array(values, subscription_schema))
|
||||
else:
|
||||
print(f"Warning: Skipping subscription with {len(values)} values (expected {len(subscription_schema)})")
|
||||
|
||||
print(f"\nParsed successfully:")
|
||||
print(f" - {len(entries)} docket entries")
|
||||
print(f" - {len(documents)} documents")
|
||||
print(f" - {len(subscriptions)} subscriptions")
|
||||
|
||||
# Generate PHP code
|
||||
print("\n" + "="*80)
|
||||
print("DOCKET ENTRIES ARRAY:")
|
||||
print("="*80)
|
||||
print("$entries = [")
|
||||
for entry in entries:
|
||||
print(f" {entry},")
|
||||
print("];")
|
||||
|
||||
print("\n" + "="*80)
|
||||
print("DOCUMENTS ARRAY:")
|
||||
print("="*80)
|
||||
print("$documents = [")
|
||||
for doc in documents:
|
||||
print(f" {doc},")
|
||||
print("];")
|
||||
|
||||
print("\n" + "="*80)
|
||||
print("SUBSCRIPTIONS ARRAY:")
|
||||
print("="*80)
|
||||
print("$subscriptions = [")
|
||||
for sub in subscriptions:
|
||||
print(f" {sub},")
|
||||
print("];")
|
||||
|
||||
print("\n✅ Done! Copy the arrays above into V1DataMigrationSeeder.php")
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
110
resources/js/Components/PDFViewer.vue
Normal file
110
resources/js/Components/PDFViewer.vue
Normal file
|
|
@ -0,0 +1,110 @@
|
|||
<script setup lang="ts">
|
||||
import { ref, watch, onMounted, onUnmounted } from 'vue';
|
||||
|
||||
interface Props {
|
||||
isOpen: boolean;
|
||||
documentTitle: string;
|
||||
documentUrl: string;
|
||||
}
|
||||
|
||||
const props = defineProps<Props>();
|
||||
const emit = defineEmits<{
|
||||
close: [];
|
||||
}>();
|
||||
|
||||
const isMobile = ref(false);
|
||||
|
||||
// Check if device is mobile/tablet
|
||||
const checkMobile = () => {
|
||||
isMobile.value = window.innerWidth < 1024; // Less than 1024px = mobile/tablet
|
||||
};
|
||||
|
||||
onMounted(() => {
|
||||
checkMobile();
|
||||
window.addEventListener('resize', checkMobile);
|
||||
});
|
||||
|
||||
onUnmounted(() => {
|
||||
window.removeEventListener('resize', checkMobile);
|
||||
});
|
||||
|
||||
// Handle body scroll lock when modal is open
|
||||
watch(() => props.isOpen, (isOpen) => {
|
||||
if (isOpen) {
|
||||
document.body.style.overflow = 'hidden';
|
||||
|
||||
// On mobile, open PDF directly in new tab
|
||||
if (isMobile.value) {
|
||||
window.open(props.documentUrl, '_blank');
|
||||
// Close modal immediately on mobile
|
||||
emit('close');
|
||||
}
|
||||
} else {
|
||||
document.body.style.overflow = 'unset';
|
||||
}
|
||||
});
|
||||
|
||||
const handleBackdropClick = (e: MouseEvent) => {
|
||||
if (e.target === e.currentTarget) {
|
||||
emit('close');
|
||||
}
|
||||
};
|
||||
|
||||
const handleDownload = () => {
|
||||
window.open(props.documentUrl, '_blank');
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<!-- Only show modal on desktop (>= 1024px) -->
|
||||
<div
|
||||
v-if="isOpen && !isMobile"
|
||||
class="fixed inset-0 bg-black/75 flex items-center justify-center z-50 p-4"
|
||||
@click="handleBackdropClick"
|
||||
>
|
||||
<div
|
||||
class="bg-white rounded-lg w-[95%] h-[95%] max-w-[1200px] max-h-[900px] flex flex-col shadow-2xl"
|
||||
@click.stop
|
||||
>
|
||||
<!-- Header -->
|
||||
<div class="flex items-center justify-between px-6 py-4 border-b bg-[#394053] rounded-t-lg">
|
||||
<div class="flex items-center gap-3">
|
||||
<svg class="w-5 h-5 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z" />
|
||||
</svg>
|
||||
<h2 class="text-lg font-semibold text-white">
|
||||
{{ documentTitle }}
|
||||
</h2>
|
||||
</div>
|
||||
<div class="flex items-center gap-2">
|
||||
<button
|
||||
@click="handleDownload"
|
||||
class="flex items-center gap-2 px-4 py-2 bg-[#7CAE7A] text-white rounded-md hover:bg-[#6b9c69] transition-colors text-sm font-medium"
|
||||
>
|
||||
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4" />
|
||||
</svg>
|
||||
Download
|
||||
</button>
|
||||
<button
|
||||
@click="emit('close')"
|
||||
class="flex items-center justify-center w-10 h-10 text-white hover:bg-white/10 rounded-md transition-colors"
|
||||
>
|
||||
<svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- PDF Content -->
|
||||
<div class="flex-1 p-4 bg-gray-50">
|
||||
<iframe
|
||||
:src="`${documentUrl}#view=FitH&toolbar=1&navpanes=1&scrollbar=1`"
|
||||
class="w-full h-full border-0 rounded-md bg-white"
|
||||
:title="documentTitle"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
202
resources/js/Pages/Admin/Dashboard.vue
Normal file
202
resources/js/Pages/Admin/Dashboard.vue
Normal file
|
|
@ -0,0 +1,202 @@
|
|||
<script setup lang="ts">
|
||||
import { Head, Link, router } from '@inertiajs/vue3';
|
||||
import { ref } from 'vue';
|
||||
|
||||
interface DocketEntry {
|
||||
id: number;
|
||||
date: string;
|
||||
title: string;
|
||||
summary: string;
|
||||
documents_count: number;
|
||||
}
|
||||
|
||||
interface Props {
|
||||
total_entries: number;
|
||||
total_documents: number;
|
||||
total_subscribers: number;
|
||||
recent_entries: DocketEntry[];
|
||||
}
|
||||
|
||||
const props = defineProps<Props>();
|
||||
|
||||
const logout = () => {
|
||||
router.post(route('admin.logout'));
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="min-h-screen bg-gray-100">
|
||||
<Head title="Admin Dashboard" />
|
||||
|
||||
<!-- Header -->
|
||||
<header class="bg-white shadow">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-6">
|
||||
<div class="flex justify-between items-center">
|
||||
<div>
|
||||
<h1 class="text-3xl font-bold text-gray-900">
|
||||
Admin Dashboard
|
||||
</h1>
|
||||
<p class="text-sm text-gray-600 mt-1">
|
||||
Eliza Kragh v. Montana Association of the Deaf
|
||||
</p>
|
||||
</div>
|
||||
<div class="flex gap-4">
|
||||
<Link
|
||||
href="/"
|
||||
class="px-4 py-2 text-sm text-gray-700 hover:text-gray-900 transition-colors"
|
||||
>
|
||||
View Public Site
|
||||
</Link>
|
||||
<button
|
||||
@click="logout"
|
||||
class="px-4 py-2 bg-red-600 text-white text-sm rounded-lg hover:bg-red-700 transition-colors"
|
||||
>
|
||||
Logout
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<!-- Main Content -->
|
||||
<main class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8">
|
||||
<!-- Statistics Cards -->
|
||||
<div class="grid grid-cols-1 md:grid-cols-3 gap-6 mb-8">
|
||||
<!-- Total Entries -->
|
||||
<div class="bg-white rounded-lg shadow p-6">
|
||||
<div class="flex items-center justify-between">
|
||||
<div>
|
||||
<p class="text-sm font-medium text-gray-600">Total Entries</p>
|
||||
<p class="text-3xl font-bold text-gray-900 mt-2">
|
||||
{{ props.total_entries }}
|
||||
</p>
|
||||
</div>
|
||||
<div class="p-3 bg-blue-100 rounded-full">
|
||||
<svg class="w-8 h-8 text-blue-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z" />
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Total Documents -->
|
||||
<div class="bg-white rounded-lg shadow p-6">
|
||||
<div class="flex items-center justify-between">
|
||||
<div>
|
||||
<p class="text-sm font-medium text-gray-600">Total Documents</p>
|
||||
<p class="text-3xl font-bold text-gray-900 mt-2">
|
||||
{{ props.total_documents }}
|
||||
</p>
|
||||
</div>
|
||||
<div class="p-3 bg-green-100 rounded-full">
|
||||
<svg class="w-8 h-8 text-green-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 21h10a2 2 0 002-2V9.414a1 1 0 00-.293-.707l-5.414-5.414A1 1 0 0012.586 3H7a2 2 0 00-2 2v14a2 2 0 002 2z" />
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Total Subscribers -->
|
||||
<div class="bg-white rounded-lg shadow p-6">
|
||||
<div class="flex items-center justify-between">
|
||||
<div>
|
||||
<p class="text-sm font-medium text-gray-600">Active Subscribers</p>
|
||||
<p class="text-3xl font-bold text-gray-900 mt-2">
|
||||
{{ props.total_subscribers }}
|
||||
</p>
|
||||
</div>
|
||||
<div class="p-3 bg-purple-100 rounded-full">
|
||||
<svg class="w-8 h-8 text-purple-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z" />
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Quick Actions -->
|
||||
<div class="bg-white rounded-lg shadow p-6 mb-8">
|
||||
<h2 class="text-xl font-bold text-gray-900 mb-4">Quick Actions</h2>
|
||||
<div class="grid grid-cols-1 md:grid-cols-3 gap-4">
|
||||
<Link
|
||||
:href="route('admin.docket-entries.create')"
|
||||
class="flex items-center justify-center px-6 py-4 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors"
|
||||
>
|
||||
<svg class="w-5 h-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 4v16m8-8H4" />
|
||||
</svg>
|
||||
Create New Entry
|
||||
</Link>
|
||||
<Link
|
||||
:href="route('admin.docket-entries.index')"
|
||||
class="flex items-center justify-center px-6 py-4 bg-gray-600 text-white rounded-lg hover:bg-gray-700 transition-colors"
|
||||
>
|
||||
<svg class="w-5 h-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 10h16M4 14h16M4 18h16" />
|
||||
</svg>
|
||||
Manage Entries
|
||||
</Link>
|
||||
<Link
|
||||
:href="route('admin.subscribers.index')"
|
||||
class="flex items-center justify-center px-6 py-4 bg-purple-600 text-white rounded-lg hover:bg-purple-700 transition-colors"
|
||||
>
|
||||
<svg class="w-5 h-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z" />
|
||||
</svg>
|
||||
View Subscribers
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Recent Entries -->
|
||||
<div class="bg-white rounded-lg shadow">
|
||||
<div class="px-6 py-4 border-b border-gray-200">
|
||||
<h2 class="text-xl font-bold text-gray-900">Recent Entries</h2>
|
||||
</div>
|
||||
<div class="divide-y divide-gray-200">
|
||||
<div
|
||||
v-for="entry in props.recent_entries"
|
||||
:key="entry.id"
|
||||
class="px-6 py-4 hover:bg-gray-50 transition-colors"
|
||||
>
|
||||
<div class="flex justify-between items-start">
|
||||
<div class="flex-1">
|
||||
<div class="flex items-center gap-3 mb-2">
|
||||
<span class="text-sm font-medium text-gray-500">
|
||||
{{ entry.date }}
|
||||
</span>
|
||||
<span class="px-2 py-1 text-xs font-medium text-blue-700 bg-blue-100 rounded-full">
|
||||
{{ entry.documents_count }} document{{ entry.documents_count !== 1 ? 's' : '' }}
|
||||
</span>
|
||||
</div>
|
||||
<h3 class="text-lg font-semibold text-gray-900 mb-1">
|
||||
{{ entry.title }}
|
||||
</h3>
|
||||
<p class="text-sm text-gray-600 line-clamp-2">
|
||||
{{ entry.summary }}
|
||||
</p>
|
||||
</div>
|
||||
<div class="flex gap-2 ml-4">
|
||||
<Link
|
||||
:href="route('admin.docket-entries.edit', entry.id)"
|
||||
class="px-3 py-1 text-sm text-blue-600 hover:text-blue-800 transition-colors"
|
||||
>
|
||||
Edit
|
||||
</Link>
|
||||
<Link
|
||||
:href="route('admin.docket-entries.show', entry.id)"
|
||||
class="px-3 py-1 text-sm text-gray-600 hover:text-gray-800 transition-colors"
|
||||
>
|
||||
View
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="props.recent_entries.length === 0" class="px-6 py-8 text-center text-gray-500">
|
||||
No entries yet. Create your first entry to get started.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
</template>
|
||||
142
resources/js/Pages/Admin/DocketEntries/Create.vue
Normal file
142
resources/js/Pages/Admin/DocketEntries/Create.vue
Normal file
|
|
@ -0,0 +1,142 @@
|
|||
<script setup lang="ts">
|
||||
import { Head, Link, useForm } from '@inertiajs/vue3';
|
||||
import InputError from '@/Components/InputError.vue';
|
||||
import InputLabel from '@/Components/InputLabel.vue';
|
||||
import PrimaryButton from '@/Components/PrimaryButton.vue';
|
||||
import TextInput from '@/Components/TextInput.vue';
|
||||
|
||||
const form = useForm({
|
||||
date: new Date().toISOString().split('T')[0],
|
||||
title: '',
|
||||
summary: '',
|
||||
notes: '',
|
||||
});
|
||||
|
||||
const submit = () => {
|
||||
form.post(route('admin.docket-entries.store'));
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="min-h-screen bg-gray-100">
|
||||
<Head title="Create Docket Entry" />
|
||||
|
||||
<!-- Header -->
|
||||
<header class="bg-white shadow">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-6">
|
||||
<div class="flex justify-between items-center">
|
||||
<div>
|
||||
<h1 class="text-3xl font-bold text-gray-900">
|
||||
Create Docket Entry
|
||||
</h1>
|
||||
<p class="text-sm text-gray-600 mt-1">
|
||||
Add a new entry to the court docket
|
||||
</p>
|
||||
</div>
|
||||
<Link
|
||||
:href="route('admin.docket-entries.index')"
|
||||
class="px-4 py-2 text-sm text-gray-700 hover:text-gray-900 transition-colors"
|
||||
>
|
||||
← Back to Entries
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<!-- Main Content -->
|
||||
<main class="max-w-3xl mx-auto px-4 sm:px-6 lg:px-8 py-8">
|
||||
<div class="bg-white rounded-lg shadow p-6">
|
||||
<form @submit.prevent="submit" class="space-y-6">
|
||||
<!-- Date -->
|
||||
<div>
|
||||
<InputLabel for="date" value="Date *" />
|
||||
<TextInput
|
||||
id="date"
|
||||
type="date"
|
||||
class="mt-1 block w-full"
|
||||
v-model="form.date"
|
||||
required
|
||||
/>
|
||||
<InputError class="mt-2" :message="form.errors.date" />
|
||||
</div>
|
||||
|
||||
<!-- Title -->
|
||||
<div>
|
||||
<InputLabel for="title" value="Title *" />
|
||||
<TextInput
|
||||
id="title"
|
||||
type="text"
|
||||
class="mt-1 block w-full"
|
||||
v-model="form.title"
|
||||
required
|
||||
placeholder="e.g., Motion to Dismiss"
|
||||
/>
|
||||
<InputError class="mt-2" :message="form.errors.title" />
|
||||
<p class="mt-1 text-sm text-gray-500">
|
||||
Brief title describing the filing or court action
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<!-- Summary -->
|
||||
<div>
|
||||
<InputLabel for="summary" value="Summary *" />
|
||||
<textarea
|
||||
id="summary"
|
||||
v-model="form.summary"
|
||||
rows="6"
|
||||
required
|
||||
placeholder="Provide a detailed summary of this docket entry..."
|
||||
class="mt-1 block w-full border-gray-300 focus:border-indigo-500 focus:ring-indigo-500 rounded-md shadow-sm"
|
||||
></textarea>
|
||||
<InputError class="mt-2" :message="form.errors.summary" />
|
||||
<p class="mt-1 text-sm text-gray-500">
|
||||
Detailed description of the filing, motion, or court action
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<!-- Notes -->
|
||||
<div>
|
||||
<InputLabel for="notes" value="Notes (Optional)" />
|
||||
<textarea
|
||||
id="notes"
|
||||
v-model="form.notes"
|
||||
rows="4"
|
||||
placeholder="Additional notes or context (optional)..."
|
||||
class="mt-1 block w-full border-gray-300 focus:border-indigo-500 focus:ring-indigo-500 rounded-md shadow-sm"
|
||||
></textarea>
|
||||
<InputError class="mt-2" :message="form.errors.notes" />
|
||||
<p class="mt-1 text-sm text-gray-500">
|
||||
Internal notes or additional context (not displayed publicly)
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<!-- Submit Buttons -->
|
||||
<div class="flex items-center justify-end gap-4 pt-4 border-t">
|
||||
<Link
|
||||
:href="route('admin.docket-entries.index')"
|
||||
class="px-4 py-2 text-sm text-gray-700 hover:text-gray-900 transition-colors"
|
||||
>
|
||||
Cancel
|
||||
</Link>
|
||||
<PrimaryButton
|
||||
:class="{ 'opacity-25': form.processing }"
|
||||
:disabled="form.processing"
|
||||
>
|
||||
Create Entry
|
||||
</PrimaryButton>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<!-- Help Text -->
|
||||
<div class="mt-6 bg-blue-50 border border-blue-200 rounded-lg p-4">
|
||||
<h3 class="text-sm font-medium text-blue-900 mb-2">
|
||||
📝 After Creating
|
||||
</h3>
|
||||
<p class="text-sm text-blue-700">
|
||||
After creating this entry, you'll be able to upload PDF documents associated with this filing.
|
||||
</p>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
</template>
|
||||
148
resources/js/Pages/Admin/DocketEntries/Edit.vue
Normal file
148
resources/js/Pages/Admin/DocketEntries/Edit.vue
Normal file
|
|
@ -0,0 +1,148 @@
|
|||
<script setup lang="ts">
|
||||
import { Head, Link, useForm } from '@inertiajs/vue3';
|
||||
import InputError from '@/Components/InputError.vue';
|
||||
import InputLabel from '@/Components/InputLabel.vue';
|
||||
import PrimaryButton from '@/Components/PrimaryButton.vue';
|
||||
import TextInput from '@/Components/TextInput.vue';
|
||||
|
||||
interface Entry {
|
||||
id: number;
|
||||
date: string;
|
||||
title: string;
|
||||
summary: string;
|
||||
notes: string | null;
|
||||
}
|
||||
|
||||
interface Props {
|
||||
entry: Entry;
|
||||
}
|
||||
|
||||
const props = defineProps<Props>();
|
||||
|
||||
const form = useForm({
|
||||
date: props.entry.date,
|
||||
title: props.entry.title,
|
||||
summary: props.entry.summary,
|
||||
notes: props.entry.notes || '',
|
||||
});
|
||||
|
||||
const submit = () => {
|
||||
form.put(route('admin.docket-entries.update', props.entry.id));
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="min-h-screen bg-gray-100">
|
||||
<Head title="Edit Docket Entry" />
|
||||
|
||||
<!-- Header -->
|
||||
<header class="bg-white shadow">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-6">
|
||||
<div class="flex justify-between items-center">
|
||||
<div>
|
||||
<h1 class="text-3xl font-bold text-gray-900">
|
||||
Edit Docket Entry
|
||||
</h1>
|
||||
<p class="text-sm text-gray-600 mt-1">
|
||||
Update entry details
|
||||
</p>
|
||||
</div>
|
||||
<div class="flex gap-4">
|
||||
<Link
|
||||
:href="route('admin.docket-entries.show', props.entry.id)"
|
||||
class="px-4 py-2 text-sm text-gray-700 hover:text-gray-900 transition-colors"
|
||||
>
|
||||
← Back to Entry
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<!-- Main Content -->
|
||||
<main class="max-w-3xl mx-auto px-4 sm:px-6 lg:px-8 py-8">
|
||||
<div class="bg-white rounded-lg shadow p-6">
|
||||
<form @submit.prevent="submit" class="space-y-6">
|
||||
<!-- Date -->
|
||||
<div>
|
||||
<InputLabel for="date" value="Date *" />
|
||||
<TextInput
|
||||
id="date"
|
||||
type="date"
|
||||
class="mt-1 block w-full"
|
||||
v-model="form.date"
|
||||
required
|
||||
/>
|
||||
<InputError class="mt-2" :message="form.errors.date" />
|
||||
</div>
|
||||
|
||||
<!-- Title -->
|
||||
<div>
|
||||
<InputLabel for="title" value="Title *" />
|
||||
<TextInput
|
||||
id="title"
|
||||
type="text"
|
||||
class="mt-1 block w-full"
|
||||
v-model="form.title"
|
||||
required
|
||||
placeholder="e.g., Motion to Dismiss"
|
||||
/>
|
||||
<InputError class="mt-2" :message="form.errors.title" />
|
||||
<p class="mt-1 text-sm text-gray-500">
|
||||
Brief title describing the filing or court action
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<!-- Summary -->
|
||||
<div>
|
||||
<InputLabel for="summary" value="Summary *" />
|
||||
<textarea
|
||||
id="summary"
|
||||
v-model="form.summary"
|
||||
rows="6"
|
||||
required
|
||||
placeholder="Provide a detailed summary of this docket entry..."
|
||||
class="mt-1 block w-full border-gray-300 focus:border-indigo-500 focus:ring-indigo-500 rounded-md shadow-sm"
|
||||
></textarea>
|
||||
<InputError class="mt-2" :message="form.errors.summary" />
|
||||
<p class="mt-1 text-sm text-gray-500">
|
||||
Detailed description of the filing, motion, or court action
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<!-- Notes -->
|
||||
<div>
|
||||
<InputLabel for="notes" value="Notes (Optional)" />
|
||||
<textarea
|
||||
id="notes"
|
||||
v-model="form.notes"
|
||||
rows="4"
|
||||
placeholder="Additional notes or context (optional)..."
|
||||
class="mt-1 block w-full border-gray-300 focus:border-indigo-500 focus:ring-indigo-500 rounded-md shadow-sm"
|
||||
></textarea>
|
||||
<InputError class="mt-2" :message="form.errors.notes" />
|
||||
<p class="mt-1 text-sm text-gray-500">
|
||||
Internal notes or additional context (not displayed publicly)
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<!-- Submit Buttons -->
|
||||
<div class="flex items-center justify-end gap-4 pt-4 border-t">
|
||||
<Link
|
||||
:href="route('admin.docket-entries.show', props.entry.id)"
|
||||
class="px-4 py-2 text-sm text-gray-700 hover:text-gray-900 transition-colors"
|
||||
>
|
||||
Cancel
|
||||
</Link>
|
||||
<PrimaryButton
|
||||
:class="{ 'opacity-25': form.processing }"
|
||||
:disabled="form.processing"
|
||||
>
|
||||
Update Entry
|
||||
</PrimaryButton>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
</template>
|
||||
174
resources/js/Pages/Admin/DocketEntries/Index.vue
Normal file
174
resources/js/Pages/Admin/DocketEntries/Index.vue
Normal file
|
|
@ -0,0 +1,174 @@
|
|||
<script setup lang="ts">
|
||||
import { Head, Link, router } from '@inertiajs/vue3';
|
||||
import { ref } from 'vue';
|
||||
|
||||
interface DocketEntry {
|
||||
id: number;
|
||||
date: string;
|
||||
title: string;
|
||||
summary: string;
|
||||
documents_count: number;
|
||||
}
|
||||
|
||||
interface Pagination {
|
||||
current_page: number;
|
||||
last_page: number;
|
||||
per_page: number;
|
||||
total: number;
|
||||
}
|
||||
|
||||
interface Props {
|
||||
entries: DocketEntry[];
|
||||
pagination: Pagination;
|
||||
}
|
||||
|
||||
const props = defineProps<Props>();
|
||||
|
||||
const deleteEntry = (id: number, title: string) => {
|
||||
if (confirm(`Are you sure you want to delete "${title}"? This will also delete all associated documents.`)) {
|
||||
router.delete(route('admin.docket-entries.destroy', id));
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="min-h-screen bg-gray-100">
|
||||
<Head title="Manage Docket Entries" />
|
||||
|
||||
<!-- Header -->
|
||||
<header class="bg-white shadow">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-6">
|
||||
<div class="flex justify-between items-center">
|
||||
<div>
|
||||
<h1 class="text-3xl font-bold text-gray-900">
|
||||
Manage Docket Entries
|
||||
</h1>
|
||||
<p class="text-sm text-gray-600 mt-1">
|
||||
{{ props.pagination.total }} total entries
|
||||
</p>
|
||||
</div>
|
||||
<div class="flex gap-4">
|
||||
<Link
|
||||
:href="route('admin.dashboard')"
|
||||
class="px-4 py-2 text-sm text-gray-700 hover:text-gray-900 transition-colors"
|
||||
>
|
||||
← Back to Dashboard
|
||||
</Link>
|
||||
<Link
|
||||
:href="route('admin.docket-entries.create')"
|
||||
class="px-4 py-2 bg-blue-600 text-white text-sm rounded-lg hover:bg-blue-700 transition-colors"
|
||||
>
|
||||
+ Create New Entry
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<!-- Main Content -->
|
||||
<main class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8">
|
||||
<div class="bg-white rounded-lg shadow">
|
||||
<!-- Table -->
|
||||
<div class="overflow-x-auto">
|
||||
<table class="min-w-full divide-y divide-gray-200">
|
||||
<thead class="bg-gray-50">
|
||||
<tr>
|
||||
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
|
||||
Date
|
||||
</th>
|
||||
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
|
||||
Title
|
||||
</th>
|
||||
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
|
||||
Summary
|
||||
</th>
|
||||
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
|
||||
Documents
|
||||
</th>
|
||||
<th class="px-6 py-3 text-right text-xs font-medium text-gray-500 uppercase tracking-wider">
|
||||
Actions
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="bg-white divide-y divide-gray-200">
|
||||
<tr
|
||||
v-for="entry in props.entries"
|
||||
:key="entry.id"
|
||||
class="hover:bg-gray-50 transition-colors"
|
||||
>
|
||||
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">
|
||||
{{ entry.date }}
|
||||
</td>
|
||||
<td class="px-6 py-4 text-sm font-medium text-gray-900">
|
||||
{{ entry.title }}
|
||||
</td>
|
||||
<td class="px-6 py-4 text-sm text-gray-600">
|
||||
<div class="line-clamp-2">
|
||||
{{ entry.summary }}
|
||||
</div>
|
||||
</td>
|
||||
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-600">
|
||||
<span class="px-2 py-1 text-xs font-medium text-blue-700 bg-blue-100 rounded-full">
|
||||
{{ entry.documents_count }} doc{{ entry.documents_count !== 1 ? 's' : '' }}
|
||||
</span>
|
||||
</td>
|
||||
<td class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium">
|
||||
<div class="flex justify-end gap-2">
|
||||
<Link
|
||||
:href="route('admin.docket-entries.show', entry.id)"
|
||||
class="text-blue-600 hover:text-blue-900 transition-colors"
|
||||
>
|
||||
View
|
||||
</Link>
|
||||
<Link
|
||||
:href="route('admin.docket-entries.edit', entry.id)"
|
||||
class="text-indigo-600 hover:text-indigo-900 transition-colors"
|
||||
>
|
||||
Edit
|
||||
</Link>
|
||||
<button
|
||||
@click="deleteEntry(entry.id, entry.title)"
|
||||
class="text-red-600 hover:text-red-900 transition-colors"
|
||||
>
|
||||
Delete
|
||||
</button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr v-if="props.entries.length === 0">
|
||||
<td colspan="5" class="px-6 py-12 text-center text-gray-500">
|
||||
No docket entries found. Create your first entry to get started.
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<!-- Pagination -->
|
||||
<div v-if="props.pagination.last_page > 1" class="px-6 py-4 border-t border-gray-200">
|
||||
<div class="flex items-center justify-between">
|
||||
<div class="text-sm text-gray-700">
|
||||
Showing page {{ props.pagination.current_page }} of {{ props.pagination.last_page }}
|
||||
</div>
|
||||
<div class="flex gap-2">
|
||||
<Link
|
||||
v-if="props.pagination.current_page > 1"
|
||||
:href="route('admin.docket-entries.index', { page: props.pagination.current_page - 1 })"
|
||||
class="px-3 py-1 text-sm bg-white border border-gray-300 rounded-md hover:bg-gray-50 transition-colors"
|
||||
>
|
||||
Previous
|
||||
</Link>
|
||||
<Link
|
||||
v-if="props.pagination.current_page < props.pagination.last_page"
|
||||
:href="route('admin.docket-entries.index', { page: props.pagination.current_page + 1 })"
|
||||
class="px-3 py-1 text-sm bg-white border border-gray-300 rounded-md hover:bg-gray-50 transition-colors"
|
||||
>
|
||||
Next
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
</template>
|
||||
249
resources/js/Pages/Admin/DocketEntries/Show.vue
Normal file
249
resources/js/Pages/Admin/DocketEntries/Show.vue
Normal file
|
|
@ -0,0 +1,249 @@
|
|||
<script setup lang="ts">
|
||||
import { Head, Link, router, useForm } from '@inertiajs/vue3';
|
||||
import { ref } from 'vue';
|
||||
import PrimaryButton from '@/Components/PrimaryButton.vue';
|
||||
import DangerButton from '@/Components/DangerButton.vue';
|
||||
|
||||
interface Document {
|
||||
id: number;
|
||||
title: string;
|
||||
original_filename: string;
|
||||
file_size: number;
|
||||
summary: string | null;
|
||||
display_order: number;
|
||||
}
|
||||
|
||||
interface Entry {
|
||||
id: number;
|
||||
date: string;
|
||||
title: string;
|
||||
summary: string;
|
||||
notes: string | null;
|
||||
documents: Document[];
|
||||
}
|
||||
|
||||
interface Props {
|
||||
entry: Entry;
|
||||
}
|
||||
|
||||
const props = defineProps<Props>();
|
||||
|
||||
const uploadForm = useForm({
|
||||
file: null as File | null,
|
||||
title: '',
|
||||
summary: '',
|
||||
});
|
||||
|
||||
const fileInput = ref<HTMLInputElement | null>(null);
|
||||
|
||||
const handleFileSelect = (event: Event) => {
|
||||
const target = event.target as HTMLInputElement;
|
||||
if (target.files && target.files[0]) {
|
||||
uploadForm.file = target.files[0];
|
||||
uploadForm.title = target.files[0].name.replace('.pdf', '');
|
||||
}
|
||||
};
|
||||
|
||||
const uploadDocument = () => {
|
||||
if (!uploadForm.file) return;
|
||||
|
||||
uploadForm.post(route('admin.documents.store', props.entry.id), {
|
||||
onSuccess: () => {
|
||||
uploadForm.reset();
|
||||
if (fileInput.value) {
|
||||
fileInput.value.value = '';
|
||||
}
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
const deleteDocument = (docId: number, title: string) => {
|
||||
if (confirm(`Are you sure you want to delete "${title}"?`)) {
|
||||
router.delete(route('admin.documents.destroy', docId));
|
||||
}
|
||||
};
|
||||
|
||||
const deleteEntry = () => {
|
||||
if (confirm(`Are you sure you want to delete this entry and all ${props.entry.documents.length} associated documents?`)) {
|
||||
router.delete(route('admin.docket-entries.destroy', props.entry.id));
|
||||
}
|
||||
};
|
||||
|
||||
const formatFileSize = (bytes: number): string => {
|
||||
if (bytes < 1024) return bytes + ' B';
|
||||
if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB';
|
||||
return (bytes / (1024 * 1024)).toFixed(1) + ' MB';
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="min-h-screen bg-gray-100">
|
||||
<Head :title="`View Entry: ${props.entry.title}`" />
|
||||
|
||||
<!-- Header -->
|
||||
<header class="bg-white shadow">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-6">
|
||||
<div class="flex justify-between items-center">
|
||||
<div>
|
||||
<h1 class="text-3xl font-bold text-gray-900">
|
||||
{{ props.entry.title }}
|
||||
</h1>
|
||||
<p class="text-sm text-gray-600 mt-1">
|
||||
Filed on {{ props.entry.date }}
|
||||
</p>
|
||||
</div>
|
||||
<div class="flex gap-4">
|
||||
<Link
|
||||
:href="route('admin.docket-entries.index')"
|
||||
class="px-4 py-2 text-sm text-gray-700 hover:text-gray-900 transition-colors"
|
||||
>
|
||||
← Back to Entries
|
||||
</Link>
|
||||
<Link
|
||||
:href="route('admin.docket-entries.edit', props.entry.id)"
|
||||
class="px-4 py-2 bg-indigo-600 text-white text-sm rounded-lg hover:bg-indigo-700 transition-colors"
|
||||
>
|
||||
Edit Entry
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<!-- Main Content -->
|
||||
<main class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8">
|
||||
<div class="grid grid-cols-1 lg:grid-cols-3 gap-8">
|
||||
<!-- Entry Details -->
|
||||
<div class="lg:col-span-2 space-y-6">
|
||||
<!-- Summary -->
|
||||
<div class="bg-white rounded-lg shadow p-6">
|
||||
<h2 class="text-xl font-bold text-gray-900 mb-4">Summary</h2>
|
||||
<p class="text-gray-700 whitespace-pre-wrap">{{ props.entry.summary }}</p>
|
||||
</div>
|
||||
|
||||
<!-- Notes -->
|
||||
<div v-if="props.entry.notes" class="bg-white rounded-lg shadow p-6">
|
||||
<h2 class="text-xl font-bold text-gray-900 mb-4">Internal Notes</h2>
|
||||
<p class="text-gray-700 whitespace-pre-wrap">{{ props.entry.notes }}</p>
|
||||
</div>
|
||||
|
||||
<!-- Documents -->
|
||||
<div class="bg-white rounded-lg shadow p-6">
|
||||
<h2 class="text-xl font-bold text-gray-900 mb-4">
|
||||
Documents ({{ props.entry.documents.length }})
|
||||
</h2>
|
||||
|
||||
<div v-if="props.entry.documents.length > 0" class="space-y-4">
|
||||
<div
|
||||
v-for="doc in props.entry.documents"
|
||||
:key="doc.id"
|
||||
class="border border-gray-200 rounded-lg p-4 hover:bg-gray-50 transition-colors"
|
||||
>
|
||||
<div class="flex justify-between items-start">
|
||||
<div class="flex-1">
|
||||
<h3 class="font-semibold text-gray-900">{{ doc.title }}</h3>
|
||||
<p class="text-sm text-gray-600 mt-1">
|
||||
{{ doc.original_filename }} • {{ formatFileSize(doc.file_size) }}
|
||||
</p>
|
||||
<p v-if="doc.summary" class="text-sm text-gray-700 mt-2">
|
||||
{{ doc.summary }}
|
||||
</p>
|
||||
</div>
|
||||
<div class="flex gap-2 ml-4">
|
||||
<a
|
||||
:href="route('api.documents.download', doc.id)"
|
||||
target="_blank"
|
||||
class="text-blue-600 hover:text-blue-900 text-sm transition-colors"
|
||||
>
|
||||
Download
|
||||
</a>
|
||||
<button
|
||||
@click="deleteDocument(doc.id, doc.title)"
|
||||
class="text-red-600 hover:text-red-900 text-sm transition-colors"
|
||||
>
|
||||
Delete
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div v-else class="text-center py-8 text-gray-500">
|
||||
No documents uploaded yet.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Sidebar -->
|
||||
<div class="space-y-6">
|
||||
<!-- Upload Document -->
|
||||
<div class="bg-white rounded-lg shadow p-6">
|
||||
<h2 class="text-lg font-bold text-gray-900 mb-4">Upload Document</h2>
|
||||
|
||||
<form @submit.prevent="uploadDocument" class="space-y-4">
|
||||
<div>
|
||||
<label class="block text-sm font-medium text-gray-700 mb-2">
|
||||
PDF File *
|
||||
</label>
|
||||
<input
|
||||
ref="fileInput"
|
||||
type="file"
|
||||
accept=".pdf,application/pdf"
|
||||
@change="handleFileSelect"
|
||||
required
|
||||
class="block w-full text-sm text-gray-500 file:mr-4 file:py-2 file:px-4 file:rounded-md file:border-0 file:text-sm file:font-semibold file:bg-blue-50 file:text-blue-700 hover:file:bg-blue-100"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label class="block text-sm font-medium text-gray-700 mb-2">
|
||||
Title *
|
||||
</label>
|
||||
<input
|
||||
v-model="uploadForm.title"
|
||||
type="text"
|
||||
required
|
||||
class="block w-full border-gray-300 rounded-md shadow-sm focus:border-indigo-500 focus:ring-indigo-500"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label class="block text-sm font-medium text-gray-700 mb-2">
|
||||
Summary (Optional)
|
||||
</label>
|
||||
<textarea
|
||||
v-model="uploadForm.summary"
|
||||
rows="3"
|
||||
class="block w-full border-gray-300 rounded-md shadow-sm focus:border-indigo-500 focus:ring-indigo-500"
|
||||
></textarea>
|
||||
</div>
|
||||
|
||||
<PrimaryButton
|
||||
type="submit"
|
||||
class="w-full justify-center"
|
||||
:class="{ 'opacity-25': uploadForm.processing }"
|
||||
:disabled="uploadForm.processing || !uploadForm.file"
|
||||
>
|
||||
Upload Document
|
||||
</PrimaryButton>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<!-- Danger Zone -->
|
||||
<div class="bg-red-50 border border-red-200 rounded-lg p-6">
|
||||
<h2 class="text-lg font-bold text-red-900 mb-2">Danger Zone</h2>
|
||||
<p class="text-sm text-red-700 mb-4">
|
||||
Deleting this entry will also delete all {{ props.entry.documents.length }} associated documents. This action cannot be undone.
|
||||
</p>
|
||||
<DangerButton
|
||||
@click="deleteEntry"
|
||||
class="w-full justify-center"
|
||||
>
|
||||
Delete Entry
|
||||
</DangerButton>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
</template>
|
||||
90
resources/js/Pages/Admin/Login.vue
Normal file
90
resources/js/Pages/Admin/Login.vue
Normal file
|
|
@ -0,0 +1,90 @@
|
|||
<script setup lang="ts">
|
||||
import { ref } from 'vue';
|
||||
import { useForm } from '@inertiajs/vue3';
|
||||
import InputError from '@/Components/InputError.vue';
|
||||
import InputLabel from '@/Components/InputLabel.vue';
|
||||
import PrimaryButton from '@/Components/PrimaryButton.vue';
|
||||
import TextInput from '@/Components/TextInput.vue';
|
||||
|
||||
const form = useForm({
|
||||
username: '',
|
||||
password: '',
|
||||
});
|
||||
|
||||
const submit = () => {
|
||||
form.post(route('admin.login'), {
|
||||
onFinish: () => form.reset('password'),
|
||||
});
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="min-h-screen flex items-center justify-center bg-gradient-to-br from-gray-900 via-gray-800 to-gray-900">
|
||||
<div class="w-full max-w-md">
|
||||
<!-- Header -->
|
||||
<div class="text-center mb-8">
|
||||
<h1 class="text-3xl font-bold text-white mb-2">
|
||||
Admin Login
|
||||
</h1>
|
||||
<p class="text-gray-400">
|
||||
Eliza Kragh v. Montana Association of the Deaf
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<!-- Login Card -->
|
||||
<div class="bg-white rounded-lg shadow-xl p-8">
|
||||
<form @submit.prevent="submit">
|
||||
<!-- Username -->
|
||||
<div class="mb-4">
|
||||
<InputLabel for="username" value="Username" />
|
||||
<TextInput
|
||||
id="username"
|
||||
type="text"
|
||||
class="mt-1 block w-full"
|
||||
v-model="form.username"
|
||||
required
|
||||
autofocus
|
||||
autocomplete="username"
|
||||
/>
|
||||
<InputError class="mt-2" :message="form.errors.username" />
|
||||
</div>
|
||||
|
||||
<!-- Password -->
|
||||
<div class="mb-6">
|
||||
<InputLabel for="password" value="Password" />
|
||||
<TextInput
|
||||
id="password"
|
||||
type="password"
|
||||
class="mt-1 block w-full"
|
||||
v-model="form.password"
|
||||
required
|
||||
autocomplete="current-password"
|
||||
/>
|
||||
<InputError class="mt-2" :message="form.errors.password" />
|
||||
</div>
|
||||
|
||||
<!-- Submit Button -->
|
||||
<div class="flex items-center justify-end">
|
||||
<PrimaryButton
|
||||
class="w-full justify-center"
|
||||
:class="{ 'opacity-25': form.processing }"
|
||||
:disabled="form.processing"
|
||||
>
|
||||
Log in
|
||||
</PrimaryButton>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<!-- Footer -->
|
||||
<div class="text-center mt-6">
|
||||
<a
|
||||
href="/"
|
||||
class="text-sm text-gray-400 hover:text-white transition-colors"
|
||||
>
|
||||
← Back to Public Site
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
224
resources/js/Pages/Admin/Subscribers/Index.vue
Normal file
224
resources/js/Pages/Admin/Subscribers/Index.vue
Normal file
|
|
@ -0,0 +1,224 @@
|
|||
<script setup lang="ts">
|
||||
import { Head, Link, router } from '@inertiajs/vue3';
|
||||
|
||||
interface Subscriber {
|
||||
id: number;
|
||||
email: string;
|
||||
is_active: boolean;
|
||||
created_at: string;
|
||||
}
|
||||
|
||||
interface Pagination {
|
||||
current_page: number;
|
||||
last_page: number;
|
||||
per_page: number;
|
||||
total: number;
|
||||
}
|
||||
|
||||
interface Stats {
|
||||
total: number;
|
||||
active: number;
|
||||
inactive: number;
|
||||
}
|
||||
|
||||
interface Props {
|
||||
subscribers: Subscriber[];
|
||||
pagination: Pagination;
|
||||
stats: Stats;
|
||||
}
|
||||
|
||||
const props = defineProps<Props>();
|
||||
|
||||
const deactivateSubscriber = (id: number, email: string) => {
|
||||
if (confirm(`Are you sure you want to deactivate ${email}?`)) {
|
||||
router.delete(route('admin.subscribers.destroy', id));
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="min-h-screen bg-gray-100">
|
||||
<Head title="Manage Subscribers" />
|
||||
|
||||
<!-- Header -->
|
||||
<header class="bg-white shadow">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-6">
|
||||
<div class="flex justify-between items-center">
|
||||
<div>
|
||||
<h1 class="text-3xl font-bold text-gray-900">
|
||||
Manage Subscribers
|
||||
</h1>
|
||||
<p class="text-sm text-gray-600 mt-1">
|
||||
{{ props.stats.active }} active • {{ props.stats.inactive }} inactive • {{ props.stats.total }} total
|
||||
</p>
|
||||
</div>
|
||||
<Link
|
||||
:href="route('admin.dashboard')"
|
||||
class="px-4 py-2 text-sm text-gray-700 hover:text-gray-900 transition-colors"
|
||||
>
|
||||
← Back to Dashboard
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<!-- Main Content -->
|
||||
<main class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8">
|
||||
<!-- Stats Cards -->
|
||||
<div class="grid grid-cols-1 md:grid-cols-3 gap-6 mb-8">
|
||||
<div class="bg-white rounded-lg shadow p-6">
|
||||
<div class="flex items-center justify-between">
|
||||
<div>
|
||||
<p class="text-sm font-medium text-gray-600">Total Subscribers</p>
|
||||
<p class="text-3xl font-bold text-gray-900 mt-2">
|
||||
{{ props.stats.total }}
|
||||
</p>
|
||||
</div>
|
||||
<div class="p-3 bg-blue-100 rounded-full">
|
||||
<svg class="w-8 h-8 text-blue-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z" />
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="bg-white rounded-lg shadow p-6">
|
||||
<div class="flex items-center justify-between">
|
||||
<div>
|
||||
<p class="text-sm font-medium text-gray-600">Active Subscribers</p>
|
||||
<p class="text-3xl font-bold text-green-600 mt-2">
|
||||
{{ props.stats.active }}
|
||||
</p>
|
||||
</div>
|
||||
<div class="p-3 bg-green-100 rounded-full">
|
||||
<svg class="w-8 h-8 text-green-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z" />
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="bg-white rounded-lg shadow p-6">
|
||||
<div class="flex items-center justify-between">
|
||||
<div>
|
||||
<p class="text-sm font-medium text-gray-600">Inactive Subscribers</p>
|
||||
<p class="text-3xl font-bold text-gray-400 mt-2">
|
||||
{{ props.stats.inactive }}
|
||||
</p>
|
||||
</div>
|
||||
<div class="p-3 bg-gray-100 rounded-full">
|
||||
<svg class="w-8 h-8 text-gray-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M18.364 18.364A9 9 0 005.636 5.636m12.728 12.728A9 9 0 015.636 5.636m12.728 12.728L5.636 5.636" />
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Subscribers Table -->
|
||||
<div class="bg-white rounded-lg shadow">
|
||||
<div class="overflow-x-auto">
|
||||
<table class="min-w-full divide-y divide-gray-200">
|
||||
<thead class="bg-gray-50">
|
||||
<tr>
|
||||
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
|
||||
Email
|
||||
</th>
|
||||
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
|
||||
Status
|
||||
</th>
|
||||
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
|
||||
Subscribed On
|
||||
</th>
|
||||
<th class="px-6 py-3 text-right text-xs font-medium text-gray-500 uppercase tracking-wider">
|
||||
Actions
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="bg-white divide-y divide-gray-200">
|
||||
<tr
|
||||
v-for="subscriber in props.subscribers"
|
||||
:key="subscriber.id"
|
||||
class="hover:bg-gray-50 transition-colors"
|
||||
>
|
||||
<td class="px-6 py-4 text-sm font-medium text-gray-900">
|
||||
{{ subscriber.email }}
|
||||
</td>
|
||||
<td class="px-6 py-4 whitespace-nowrap text-sm">
|
||||
<span
|
||||
v-if="subscriber.is_active"
|
||||
class="px-2 py-1 text-xs font-medium text-green-700 bg-green-100 rounded-full"
|
||||
>
|
||||
Active
|
||||
</span>
|
||||
<span
|
||||
v-else
|
||||
class="px-2 py-1 text-xs font-medium text-gray-700 bg-gray-100 rounded-full"
|
||||
>
|
||||
Inactive
|
||||
</span>
|
||||
</td>
|
||||
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-600">
|
||||
{{ subscriber.created_at }}
|
||||
</td>
|
||||
<td class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium">
|
||||
<button
|
||||
v-if="subscriber.is_active"
|
||||
@click="deactivateSubscriber(subscriber.id, subscriber.email)"
|
||||
class="text-red-600 hover:text-red-900 transition-colors"
|
||||
>
|
||||
Deactivate
|
||||
</button>
|
||||
<span v-else class="text-gray-400">
|
||||
Deactivated
|
||||
</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr v-if="props.subscribers.length === 0">
|
||||
<td colspan="4" class="px-6 py-12 text-center text-gray-500">
|
||||
No subscribers found.
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<!-- Pagination -->
|
||||
<div v-if="props.pagination.last_page > 1" class="px-6 py-4 border-t border-gray-200">
|
||||
<div class="flex items-center justify-between">
|
||||
<div class="text-sm text-gray-700">
|
||||
Showing page {{ props.pagination.current_page }} of {{ props.pagination.last_page }}
|
||||
</div>
|
||||
<div class="flex gap-2">
|
||||
<Link
|
||||
v-if="props.pagination.current_page > 1"
|
||||
:href="route('admin.subscribers.index', { page: props.pagination.current_page - 1 })"
|
||||
class="px-3 py-1 text-sm bg-white border border-gray-300 rounded-md hover:bg-gray-50 transition-colors"
|
||||
>
|
||||
Previous
|
||||
</Link>
|
||||
<Link
|
||||
v-if="props.pagination.current_page < props.pagination.last_page"
|
||||
:href="route('admin.subscribers.index', { page: props.pagination.current_page + 1 })"
|
||||
class="px-3 py-1 text-sm bg-white border border-gray-300 rounded-md hover:bg-gray-50 transition-colors"
|
||||
>
|
||||
Next
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Info Box -->
|
||||
<div class="mt-6 bg-blue-50 border border-blue-200 rounded-lg p-4">
|
||||
<h3 class="text-sm font-medium text-blue-900 mb-2">
|
||||
ℹ️ About Subscriber Management
|
||||
</h3>
|
||||
<p class="text-sm text-blue-700">
|
||||
Deactivating a subscriber will prevent them from receiving future email notifications.
|
||||
They can resubscribe at any time through the public website.
|
||||
</p>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
</template>
|
||||
|
|
@ -1,6 +1,7 @@
|
|||
<script setup lang="ts">
|
||||
import { Head } from '@inertiajs/vue3';
|
||||
import { ref } from 'vue';
|
||||
import PDFViewer from '@/Components/PDFViewer.vue';
|
||||
|
||||
interface Document {
|
||||
id: number;
|
||||
|
|
@ -32,11 +33,25 @@ const props = defineProps<Props>();
|
|||
const expandedEntry = ref<number | null>(null);
|
||||
const email = ref('');
|
||||
const subscribeMessage = ref('');
|
||||
const selectedDocument = ref<{ title: string; url: string } | null>(null);
|
||||
|
||||
const toggleEntry = (id: number) => {
|
||||
expandedEntry.value = expandedEntry.value === id ? null : id;
|
||||
};
|
||||
|
||||
const openDocument = (doc: Document, event: MouseEvent) => {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
selectedDocument.value = {
|
||||
title: doc.title,
|
||||
url: `/api/documents/${doc.id}/download`
|
||||
};
|
||||
};
|
||||
|
||||
const closeViewer = () => {
|
||||
selectedDocument.value = null;
|
||||
};
|
||||
|
||||
const subscribe = async () => {
|
||||
if (!email.value) {
|
||||
subscribeMessage.value = 'Please enter your email address.';
|
||||
|
|
@ -81,24 +96,22 @@ const subscribe = async () => {
|
|||
<!-- Hero Section -->
|
||||
<div class="py-16 px-4" style="background: linear-gradient(135deg, #3f4a5c 0%, #4a5568 100%);">
|
||||
<div class="max-w-4xl mx-auto text-center">
|
||||
<h1 class="text-4xl md:text-5xl font-bold text-white mb-4">
|
||||
ELIZABETH KRAGH
|
||||
</h1>
|
||||
<p class="text-2xl text-white mb-2">v.</p>
|
||||
<h2 class="text-4xl md:text-5xl font-bold text-white mb-6">
|
||||
<h1 class="text-[2.5rem] font-bold text-white mb-2 leading-tight">
|
||||
ELIZABETH KRAGH<br />
|
||||
v.<br />
|
||||
MONTANA ASSOCIATION OF THE DEAF
|
||||
</h2>
|
||||
<p class="text-xl text-gray-300 mb-8">Court Docket & Legal Documents</p>
|
||||
</h1>
|
||||
<p class="text-base text-[#7CAE7A] mb-8">Court Docket & Legal Documents</p>
|
||||
|
||||
<!-- Email Subscription -->
|
||||
<div class="bg-white/10 backdrop-blur-sm rounded-lg p-6 max-w-2xl mx-auto">
|
||||
<h3 class="text-xl font-semibold text-white mb-4">Stay Informed</h3>
|
||||
<div class="flex flex-col sm:flex-row gap-3">
|
||||
<h3 class="text-lg font-medium text-white mb-4">Stay Informed</h3>
|
||||
<div class="flex flex-col sm:flex-row gap-2">
|
||||
<input
|
||||
v-model="email"
|
||||
type="email"
|
||||
placeholder="Enter your email address"
|
||||
class="flex-1 px-4 py-3 rounded-lg border-0 focus:ring-2 focus:ring-green-500"
|
||||
class="flex-1 px-3 py-2 text-sm rounded-md border border-gray-300 focus:ring-2 focus:ring-green-500"
|
||||
/>
|
||||
<button
|
||||
@click="subscribe"
|
||||
|
|
@ -180,18 +193,17 @@ const subscribe = async () => {
|
|||
</div>
|
||||
|
||||
<div v-if="entry.documents.length > 0">
|
||||
<a
|
||||
<button
|
||||
v-for="doc in entry.documents"
|
||||
:key="doc.id"
|
||||
:href="`/api/documents/${doc.id}/download`"
|
||||
target="_blank"
|
||||
@click="openDocument(doc, $event)"
|
||||
class="inline-block px-4 py-2 rounded-lg text-white font-semibold mr-2 mb-2 transition-colors"
|
||||
style="background-color: #6b9080;"
|
||||
@mouseover="$event.target.style.backgroundColor = '#5a8070'"
|
||||
@mouseout="$event.target.style.backgroundColor = '#6b9080'"
|
||||
>
|
||||
📄 {{ doc.title }}
|
||||
</a>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -222,5 +234,14 @@ const subscribe = async () => {
|
|||
DeafGain LLC
|
||||
</a>
|
||||
</footer>
|
||||
|
||||
<!-- PDF Viewer Modal -->
|
||||
<PDFViewer
|
||||
v-if="selectedDocument"
|
||||
:is-open="!!selectedDocument"
|
||||
:document-title="selectedDocument.title"
|
||||
:document-url="selectedDocument.url"
|
||||
@close="closeViewer"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
|
|
|||
149
seeder_data.txt
Normal file
149
seeder_data.txt
Normal file
|
|
@ -0,0 +1,149 @@
|
|||
Parsing SQL dump...
|
||||
|
||||
Parsed:
|
||||
- 32 docket entries
|
||||
- 63 documents
|
||||
- 28 subscriptions
|
||||
|
||||
================================================================================
|
||||
DOCKET ENTRIES ARRAY:
|
||||
================================================================================
|
||||
$entries = [
|
||||
['id' => 12, 'date' => '2025-06-06', 'summary' => 'Elizabeth Kragh swears under oath that the Montana Association of the Deaf cannot be on active military duty because it is a nonprofit corporation, not a person, and that MAD\'s registered agent Kirk Hash Jr. is Deaf and therefore ineligible for military service due to hearing requirements. This affidavit is required by federal law to ensure that people in the military are not unfairly treated in court cases, but since MAD is an organization and its agent is Deaf, military protections do not apply.', 'created_at' => '2025-06-25 22:25:16.605', 'updated_at' => '2025-06-25 22:49:54.761', 'notes' => '', 'title' => 'Affidavit of Military Service Check (ServiceMembers Civil Relief Act Compliance) (Filed By Kragh, Elizabeth on behalf of )'],
|
||||
['id' => 5, 'date' => '2025-05-07', 'summary' => 'Elizabeth Kragh is suing the Montana Association of the Deaf (MAD) for three ultra vires actions. First, MAD won\'t let her see meeting records even though Montana law says she has the right to see them. Second, MAD\'s leaders were elected by acclamation instead of written ballots like their rules require. Third, $888 is missing from money reports and the people who should watch the money admit they haven\'t been doing their job.', 'created_at' => '2025-06-25 22:13:26.291', 'updated_at' => '2025-06-25 22:49:54.727', 'notes' => '', 'title' => 'Complaint (Filed By Kragh, Elizabeth on behalf of )'],
|
||||
['id' => 8, 'date' => '2025-05-16', 'summary' => 'This document corrects and replaces the original certificate of service, confirming that Elizabeth Kragh properly delivered the lawsuit papers to the Montana Association of the Deaf through their registered agent Kirk Hash Jr. A professional process server from Equity Process Management served Kirk Hash Jr. on May 13, 2025, at the Partnership Health Center in Missoula, Montana.', 'created_at' => '2025-06-25 22:17:34.223', 'updated_at' => '2025-06-25 22:49:54.738', 'notes' => '', 'title' => 'Amended Certificate of Service (Filed By Kragh, Elizabeth on behalf of )'],
|
||||
['id' => 9, 'date' => '2025-05-14', 'summary' => 'This document proves that Elizabeth Kragh properly delivered the lawsuit papers to the Montana Association of the Deaf through their designated agent Kirk Hash Jr. A professional process server handed the legal documents to Kirk Hash Jr. on May 13, 2025, at the Partnership Health Center in Missoula, Montana.', 'created_at' => '2025-06-25 22:19:21.997', 'updated_at' => '2025-06-25 22:49:54.744', 'notes' => '', 'title' => 'Certificate of Service (Filed By Kragh, Elizabeth on behalf of )'],
|
||||
['id' => 10, 'date' => '2025-05-12', 'summary' => 'This is an official court document that notifies the Montana Association of the Deaf that Elizabeth Kragh has filed a lawsuit against them. The summons orders MAD to respond to the lawsuit within 21 days or the court will rule against them by default.', 'created_at' => '2025-06-25 22:21:22.374', 'updated_at' => '2025-06-25 22:49:54.75', 'notes' => '', 'title' => 'Summons Issued on Montana Association of the Deaf Inc. 05/12/2025'],
|
||||
['id' => 11, 'date' => '2025-06-05', 'summary' => 'The Montana Association of the Deaf calls Elizabeth Kragh\'s lawsuit "frivolous" and accuses her of "harassment" without providing evidence to support their legal defenses. Instead of addressing the specific legal violations Kragh raised, MAD focuses on personal attacks against her character and claims about her past behavior with their local chapter. MAD admits they required Kragh to sign a "zero-tolerance policy" to access meeting minutes but doesn\'t explain why this requirement is legal under Montana law.', 'created_at' => '2025-06-25 22:23:22.573', 'updated_at' => '2025-06-25 22:49:54.755', 'notes' => '', 'title' => 'Answer to Complaint (Filed By Montana Association of the Deaf Inc. on behalf of )'],
|
||||
['id' => 13, 'date' => '2025-06-06', 'summary' => ' Elizabeth Kragh swears under oath that MAD was properly served with the lawsuit papers on May 13, 2025, through their registered agent Kirk Hash Jr., giving them 21 days until June 3, 2025, to respond. She states that MAD failed to file any response, motion, or have any attorney appear on their behalf, making them in default and eligible for a default judgment.', 'created_at' => '2025-06-25 22:26:19.853', 'updated_at' => '2025-06-25 22:49:54.768', 'notes' => '', 'title' => 'Affidavit of Service and Non-Appearance (Filed By Kragh, Elizabeth on behalf of )'],
|
||||
['id' => 14, 'date' => '2025-06-06', 'summary' => 'This is a draft default judgment order that would rule in favor of Elizabeth Kragh if the Montana Association of the Deaf fails to respond to the lawsuit. The proposed order would find that MAD violated Montana law by refusing to provide meeting minutes, improperly elected officers by acclamation instead of written ballot, and failed in financial oversight with an unexplained $888.54 missing from reports. If signed by the judge, it would order MAD to provide all requested records, follow proper election procedures, give complete financial accounting, and pay for an independent auditor to examine their books.', 'created_at' => '2025-06-25 22:27:19.37', 'updated_at' => '2025-06-25 22:49:54.775', 'notes' => '', 'title' => 'Motion for Default Judgment (Filed By Kragh, Elizabeth on behalf of ) 278719 '],
|
||||
['id' => 16, 'date' => '2025-06-06', 'summary' => 'Elizabeth Kragh formally asks the court to rule in her favor because MAD failed to respond to her lawsuit within the required 21-day deadline that expired on June 3, 2025. She argues that MAD\'s silence legally admits to all her allegations about blocking records access, conducting improper elections, and financial oversight failures. Kragh requests the court enter default judgment and grant relief including immediate access to meeting minutes, proper financial reporting, and appointment of an independent auditor to examine MAD\'s financial records.', 'created_at' => '2025-06-25 22:29:11.492', 'updated_at' => '2025-06-25 22:49:54.791', 'notes' => '', 'title' => 'Proposed Order on Default Judgment 278719'],
|
||||
['id' => 17, 'date' => '2025-06-06', 'summary' => 'Elizabeth Kragh asks the court to immediately stop MAD from holding their scheduled June 12-14, 2025 conference because the current officers were improperly elected and lack proper authority to make decisions for the organization. She argues that allowing these ultra vires officers to conduct business meetings, make financial decisions, and hold elections at the conference would cause irreparable harm that cannot be fixed later. Kragh requests the court allow educational and social activities at the conference to continue but block all official business and governance activities until the legal issues are resolved.', 'created_at' => '2025-06-25 22:30:23.578', 'updated_at' => '2025-06-25 22:49:54.798', 'notes' => '', 'title' => 'Motion for Temporary Restraining Order (Filed By Kragh, Elizabeth on behalf of )'],
|
||||
['id' => 6, 'date' => '2025-05-07', 'summary' => 'The exhibits show the Montana Association of the Deaf\'s official bylaws for how the organization should operate. Email records show that when member Elizabeth Kragh asked for meeting minutes, MAD\'s secretary refused to give them to her and required her to sign a "zero-tolerance policy" first. Meeting minutes from 2023-2024 show the organization\'s activities, financial reports, and board decisions during the time period in question.', 'created_at' => '2025-06-25 22:15:24.183', 'updated_at' => '2025-09-05 19:52:01.437', 'notes' => '', 'title' => 'Complaint Exhibits'],
|
||||
['id' => 1, 'date' => '2025-05-07', 'summary' => 'Elizabeth Kragh swears under oath that she made four written requests for MAD meeting minutes but was denied access and told she must sign a "zero-tolerance policy" to get them, even though Montana law doesn\'t allow such conditions. She also states that MAD\'s officers were improperly elected by acclamation instead of written ballot as required by their bylaws, and that she witnessed financial problems including missing money and trustees admitting they failed to do their oversight duties.', 'created_at' => '2025-06-25 20:20:09.097', 'updated_at' => '2025-06-25 22:49:54.719', 'notes' => '', 'title' => 'Affidavit in Support of Complaint (Filed By Kragh, Elizabeth on behalf of )'],
|
||||
['id' => 20, 'date' => '2025-06-09', 'summary' => 'This is a draft court order that would strike Tyler Hansen\'s answer from the court record because he illegally practiced law by representing the Montana Association of the Deaf without a license, violating Montana law that requires corporations to have licensed attorneys. The proposed order would find Hansen engaged in unauthorized practice of law, prohibit him from filing any more legal documents, refer him to Montana authorities for investigation, and return MAD to default status. The order would also require Hansen to pay court costs and allow the case to proceed to consideration of Kragh\'s motion for default judgment.', 'created_at' => '2025-06-25 22:38:56.552', 'updated_at' => '2025-06-25 22:49:54.818', 'notes' => '', 'title' => 'Proposed Order Granting Motion to Strike Answer for Unauthorized Practice of Law'],
|
||||
['id' => 21, 'date' => '2025-06-09', 'summary' => ' Elizabeth Kragh asks the court to impose sanctions against Tyler Hansen for violating court rules when he filed an unauthorized answer that focused on personal attacks against her rather than addressing the legal issues in the case. She argues that Hansen\'s answer violated all four parts of Rule 11 by being filed for improper purposes, containing legally frivolous arguments, making factual claims without evidence, and providing inadequate denials of her allegations. Kragh requests the court prohibit Hansen from filing more legal documents without a lawyer, require him to take legal education courses, refer him for unauthorized practice investigation, and impose monetary penalties to deter similar misconduct.', 'created_at' => '2025-06-25 22:39:58.278', 'updated_at' => '2025-06-25 22:49:54.824', 'notes' => '', 'title' => 'Motion for Rule 11 Sanctions Against Tyler Hansen (Filed By Kragh, Elizabeth on behalf of Kragh, Elizabeth )'],
|
||||
['id' => 22, 'date' => '2025-06-09', 'summary' => 'This is a draft court order that would impose Rule 11 sanctions against Tyler Hansen for filing an unauthorized answer that violated court rules by containing personal attacks, legally frivolous arguments, and factual claims without evidence. The proposed sanctions include prohibiting Hansen from filing any more legal documents without a lawyer, requiring him to take a legal education course, referring him to authorities for unauthorized practice of law, and paying a monetary penalty to the court. The order would also require Hansen to notify all MAD board members of the court\'s restrictions and would make his admissions from the unauthorized answer binding for the rest of the lawsuit.', 'created_at' => '2025-06-25 22:40:54.24', 'updated_at' => '2025-06-25 22:49:54.83', 'notes' => '', 'title' => 'Proposed Order Granting Motion for Rule 11 Sanctions Against Tyler Hansen'],
|
||||
['id' => 23, 'date' => '2025-06-10', 'summary' => 'Judge Tara Elliott granted Elizabeth Kragh\'s motion to strike Tyler Hansen\'s unauthorized answer, ruling that Hansen illegally practiced law by representing the Montana Association of the Deaf without a license, which violates Montana law requiring corporations to have licensed attorneys. The court struck Hansen\'s answer from the record and gave MAD 45 days to hire a real lawyer and file a proper response that follows Montana law. Kragh won on her motion to strike while the court denied her other motions for default judgment, temporary restraining order, and sanctions, but her main legal victory established that MAD\'s defense was invalid and must be refiled through proper legal representation.', 'created_at' => '2025-06-25 22:41:49.607', 'updated_at' => '2025-06-25 22:49:54.836', 'notes' => '', 'title' => 'Order Denying Petitioner\'s Motion for Default Judgement, Motion for Temporary Restraining Order and Motion for Sanctions and Granting the Motion to Strike'],
|
||||
['id' => 24, 'date' => '2025-06-11', 'summary' => 'Elizabeth Kragh asks the court for a preliminary injunction to stop the Montana Association of the Deaf\'s ongoing violations while MAD searches for a lawyer, arguing that eight months of documented violations including records obstruction, ultra vires elections, and financial oversight failures demand immediate court action. She offers the court multiple options for relief, from full preliminary injunction to limited relief ensuring proper election procedures at MAD\'s upcoming June 12-14 conference, while acknowledging the procedural challenge that MAD currently lacks legal representation. Kragh emphasizes that MAD\'s current predicament flows directly from their own choices to violate laws and bylaws for eight months, then lose their unauthorized defense, making judicial intervention necessary to protect member rights and organizational integrity.', 'created_at' => '2025-06-25 22:42:41.797', 'updated_at' => '2025-06-25 22:49:54.844', 'notes' => '', 'title' => 'Motion for Preliminary Injunction (Filed By Kragh, Elizabeth on behalf of Kragh, Elizabeth )'],
|
||||
['id' => 25, 'date' => '2025-06-11', 'summary' => 'This is a draft court order that would grant Elizabeth Kragh\'s request for a preliminary injunction, requiring the Montana Association of the Deaf to immediately stop conducting elections by acclamation and use written ballots as required by their bylaws, provide all meeting minutes from June 2023 to present without unauthorized conditions, and deliver written financial reports explaining the missing $888.54. The proposed order would also prohibit MAD from making major organizational decisions or financial commitments beyond routine operations until the legal issues are resolved, and would require compliance within specific timeframes (10 days for records, 15 days for financial reports). The order includes enforcement provisions allowing contempt proceedings for violations and requires MAD to notify members about the court\'s requirements while prohibiting them from mischaracterizing the order\'s terms.', 'created_at' => '2025-06-25 22:43:26.377', 'updated_at' => '2025-06-25 22:49:54.85', 'notes' => '', 'title' => 'Proposed Order Granting Preliminary Injunction'],
|
||||
['id' => 15, 'date' => '2025-06-06', 'summary' => ' Elizabeth Kragh argues that MAD\'s failure to respond to her lawsuit within the required 21 days means the court should automatically rule in her favor on all three violations she alleged. She states that MAD\'s silence legally admits to blocking records access, conducting improper elections by acclamation, and failing to oversee nearly $900 in missing funds while trustees admitted they never checked the books. Kragh requests the court grant her motion for default judgment and order immediate relief including access to records, proper financial oversight, and an independent audit of MAD\'s finances.', 'created_at' => '2025-06-25 22:28:12.719', 'updated_at' => '2025-06-25 22:49:54.781', 'notes' => '', 'title' => 'Supporting Memorandum of Law in Support of Motion for Default Judgment (Filed By Kragh, Elizabeth on behalf of ) 278719 '],
|
||||
['id' => 18, 'date' => '2025-06-06', 'summary' => 'This is a draft temporary restraining order template that would stop the Montana Association of the Deaf from conducting official business at their June 12-14, 2025 conference if signed by the judge. The proposed order would prohibit MAD from holding business meetings, elections, and making financial decisions while allowing educational and social activities to continue. The document contains blank spaces for the judge to fill in specific dates, times, and security amounts if the order is granted.', 'created_at' => '2025-06-25 22:31:30.046', 'updated_at' => '2025-06-25 22:49:54.806', 'notes' => '', 'title' => 'Proposed Temporary Restraining Order'],
|
||||
['id' => 26, 'date' => '2025-07-24', 'summary' => 'On July 24, 2025, Peter F. Lacny, a lawyer from the firm McFarland Molloy Lacny & Duerk, filed a Notice of Appearance with the court. This is a simple document that officially tells the court that Peter Lacny will be representing MAD in this lawsuit. Before this notice was filed, MAD did not have a lawyer officially recognized by the court. This document is important because it means all future court papers and communications about the case should now go to Peter Lacny instead of directly to MAD. It also shows that MAD has hired professional legal representation to defend against the lawsuit.', 'created_at' => '2025-07-25 21:34:48.438', 'updated_at' => '2025-07-28 03:01:32.129', 'notes' => '', 'title' => 'Notice of Appearance (Filed By Lacny, Peter on behalf of Montana Association of the Deaf Inc. )'],
|
||||
['id' => 33, 'date' => '2025-08-07', 'summary' => 'Defendant MAD\'s counsel served discovery requests upon Plaintiff Elizabeth Kragh in connection with their filed counterclaims and subsequently filed a notice of service with the court clerk. This represents a standard procedural step in the litigation process where parties seek relevant information from each other to support their respective claims and defenses.', 'created_at' => '2025-08-12 16:45:07.182', 'updated_at' => '2025-09-05 19:54:07.288', 'notes' => '', 'title' => 'Notice of Service'],
|
||||
['id' => 43, 'date' => '2025-08-20', 'summary' => 'This is a court filing in a lawsuit between Elizabeth Kragh and the Montana Association of the Deaf. The defendant\'s lawyer is asking the judge to approve a proposed timeline for how the case will proceed. This timeline document (called a "scheduling order") sets deadlines for various steps in the lawsuit, such as when evidence must be shared, when depositions can occur, and when the trial might happen. Both sides have agreed to this proposed schedule - the plaintiff has no objections. The lawyer is formally requesting that the judge review and officially adopt this agreed-upon timeline for the case.', 'created_at' => '2025-08-26 21:16:38.871', 'updated_at' => '2025-08-26 21:17:45.65', 'notes' => '', 'title' => 'Notice of Filing Proposed Scheduling Order (Filed By Lacny, Peter on behalf of Montana Association of the Deaf Inc. )'],
|
||||
['id' => 54, 'date' => '2025-10-06', 'summary' => 'Montana Association of the Deaf filed a legal motion asking the court to rule in their favor without a trial in a lawsuit brought by Elizabeth Kragh. They claim there are no factual disputes requiring a jury trial.', 'created_at' => '2025-10-08 18:22:12.518', 'updated_at' => '2025-10-08 18:22:12.518', 'notes' => '', 'title' => 'Defendant\'s Motion for Summary Judgment (Filed By Lacny, Peter on behalf of Montana Association of the Deaf Inc. )'],
|
||||
['id' => 44, 'date' => '2025-08-20', 'summary' => 'The court may establish a timeline for Elizabeth Kragh\'s lawsuit against the Montana Association of the Deaf that runs from now through June 2026, providing Ms. Kragh with nearly a full year to gather evidence, identify expert witnesses, and build her case. During this period, both parties may engage in discovery—the process of sharing relevant documents and information—with all evidence collection completed by March 2026 and final preparations finished by April 2026. The court may prioritize resolution by requiring a settlement conference by June 30, 2026, where a neutral mediator will help both sides explore potential agreements that could address Ms. Kragh\'s concerns without the need for a lengthy trial. If no settlement is reached, the case will proceed to trial with dates set after the conference concludes. Both parties have agreed to this schedule, and the court has emphasized that all information requests must be answered fairly and completely, ensuring Ms. Kragh has access to the evidence needed to present her case effectively.', 'created_at' => '2025-08-26 21:18:24.803', 'updated_at' => '2025-08-26 21:19:21.805', 'notes' => '', 'title' => 'Proposed Scheduling Order'],
|
||||
['id' => 47, 'date' => '2025-08-25', 'summary' => 'Judge Tara Elliott established a timeline for the lawsuit between Kragh and MAD. The order sets deadlines for when both sides must complete evidence gathering (discovery), identify expert witnesses, exchange exhibits, and file major legal motions. The court emphasizes that all parties must respond fairly and accurately to discovery requests or face potential sanctions. The schedule includes mandatory settlement conferences to encourage resolution without trial. If the case doesn\'t settle, it will proceed to trial scheduling. Both parties agreed to this timeline.', 'created_at' => '2025-08-31 19:04:08.01', 'updated_at' => '2025-08-31 19:04:59.313', 'notes' => '', 'title' => 'Scheduling Order'],
|
||||
['id' => 72, 'date' => '2025-10-29', 'summary' => 'This is the court\'s electronic filing receipt confirming that Judge Tara Elliott granted Plaintiff Elizabeth Kragh\'s motion to extend time on October 29, 2025. The receipt shows the order was electronically signed at 8:56 AM by Judge Elliott. Like the earlier order granting the motion to strike, only the court\'s filing stamp and electronic signature are present in this PDF. The filing confirms that Plaintiff Elizabeth Kragh\'s request for additional time (extending her reply brief deadline from November 3 to November 17, 2025) was approved by the judge, as requested in her motion filed October 28, 2025.', 'created_at' => '2025-11-09 23:40:37.164', 'updated_at' => '2025-11-13 20:30:00.763', 'notes' => '', 'title' => 'Order Granting Motion to Extend Time For Filing Reply Briefs'],
|
||||
['id' => 71, 'date' => '2025-10-28', 'summary' => 'This motion requests more time to file reply briefs in response to the Montana Association of the Deaf\'s responses filed October 24, 2025. Under court rules, Plaintiff Elizabeth Kragh\'s replies were originally due November 3, 2025 (ten days after receiving MAD\'s responses). However, Plaintiff Kragh is on a business trip from October 28 through November 2, 2025, and doesn\'t have access to her case files and legal research materials. She asks for a two-week extension, making the new deadline November 17, 2025. Plaintiff Kragh contacted MAD\'s attorney who confirmed they don\'t object to the extension. Since both sides agree and the delay won\'t harm either party, such motions are typically granted routinely by judges.', 'created_at' => '2025-11-09 23:39:13.429', 'updated_at' => '2025-11-13 20:30:30.535', 'notes' => '', 'title' => 'Motion to Extend Time for Filing Reply Briefs (Filed By Kragh, Elizabeth on behalf of Kragh, Elizabeth )'],
|
||||
['id' => 50, 'date' => '2025-09-03', 'summary' => 'Elizabeth Kragh filed this reply brief defending her request for a protective order to limit discovery demands made by the Montana Association of the Deaf (MAD) in their ongoing lawsuit. Discovery is the legal process where each side can demand documents, information, and answers from the other party before trial. Kragh argues that MAD\'s discovery requests are excessive and inappropriate because MAD has already admitted to the key violations in their legal filings, making extensive information-gathering unnecessary. She contends that six specific requests relate to MAD\'s weak counterclaims rather than her original lawsuit, and several other requests are overly broad, potentially requiring her to identify thousands of people who saw her social media posts about the case. Kragh points out that MAD\'s own lawyer acknowledged that dismissing the counterclaims would reduce the scope of discovery needed. She argues that forcing her, as a person representing herself in court, to respond to invasive requests about her private communications constitutes harassment rather than legitimate evidence-gathering, especially when MAD has already admitted to the conduct she\'s challenging.', 'created_at' => '2025-09-05 22:35:28.191', 'updated_at' => '2025-09-05 22:35:28.191', 'notes' => '', 'title' => 'Reply Brief in Support of Plaintiff\'s Motion for Protective Order (Filed By Kragh, Elizabeth on behalf of Kragh, Elizabeth )'],
|
||||
['id' => 51, 'date' => '2025-09-08', 'summary' => 'This is a legal notice filed on September 8, 2025, informing the court that Elizabeth Kragh (the person suing) has responded to discovery requests from Montana Association of the Deaf (MAD). Discovery is when each side asks the other for information and documents related to the case. Kragh answered 9 questions, responded to 7 requests for documents, admitted or denied 9 statements, and provided 5 exhibits as evidence. She sent these responses to MAD\'s lawyers by email.', 'created_at' => '2025-09-11 03:13:29.717', 'updated_at' => '2025-09-11 03:13:29.717', 'notes' => '', 'title' => 'Notice of Service of Discovery Requests (Filed By Kragh, Elizabeth on behalf of Kragh, Elizabeth )'],
|
||||
['id' => 67, 'date' => '2025-10-23', 'summary' => 'This is the court\'s electronic filing receipt confirming that Judge Tara Elliott granted Plaintiff Elizabeth Kragh\'s motion to strike on October 23, 2025. The receipt shows the order was electronically filed at 9:25 AM by the court clerk\'s office in Missoula County. While the proposed order is this document, the filing stamp indicates the judge approved Plaintiff Kragh\'s request to remove the accidentally filed discovery responses from the court record, as requested in her motion filed just one day earlier on October 22, 2025.', 'created_at' => '2025-11-09 23:31:54.095', 'updated_at' => '2025-11-13 20:31:57.704', 'notes' => '', 'title' => 'Order Granting Motion to Strike Improperly Filed Discovery Responses'],
|
||||
['id' => 65, 'date' => '2025-10-21', 'summary' => 'This document is a Certificate of Service filed by Elizabeth Kragh confirming she provided additional information in her lawsuit against the Montana Association of the Deaf. After the court denied two of Kragh\'s earlier requests in September 2025, the judge ordered her to answer six specific discovery questions within 30 days. Discovery is the legal process where both sides exchange information before trial. This certificate proves Kragh met the October 22 deadline by submitting her answers on October 21, 2025, and properly notifying the other side\'s attorney by email.', 'created_at' => '2025-11-09 20:19:55.036', 'updated_at' => '2025-11-13 20:34:01.57', 'notes' => '', 'title' => 'Certificate of Service (Filed By Kragh, Elizabeth on behalf of )'],
|
||||
];
|
||||
|
||||
================================================================================
|
||||
DOCUMENTS ARRAY:
|
||||
================================================================================
|
||||
$documents = [
|
||||
['id' => 4, 'docket_entry_id' => 1, 'original_filename' => '05-07-25-affidavit.pdf', 'stored_filename' => '23c520dc-371f-423b-add5-4e52de1cb8a3.pdf', 'file_path' => '/app/uploads/23c520dc-371f-423b-add5-4e52de1cb8a3.pdf', 'title' => '05-07-25-affidavit', 'summary' => '', 'notes' => '', 'file_size' => 2835944, 'display_order' => 0, 'created_at' => '2025-06-25 22:10:32.069', 'updated_at' => '2025-06-25 22:10:32.069', 'mime_type' => 'application/pdf'],
|
||||
['id' => 5, 'docket_entry_id' => 5, 'original_filename' => '05-07-25-complaint.pdf', 'stored_filename' => '07c225d0-3aa8-44df-9cd1-1b65c6ad09a6.pdf', 'file_path' => '/app/uploads/07c225d0-3aa8-44df-9cd1-1b65c6ad09a6.pdf', 'title' => '05-07-25-complaint', 'summary' => '', 'notes' => '', 'file_size' => 12308309, 'display_order' => 0, 'created_at' => '2025-06-25 22:13:29.178', 'updated_at' => '2025-06-25 22:13:29.178', 'mime_type' => 'application/pdf'],
|
||||
['id' => 6, 'docket_entry_id' => 6, 'original_filename' => '05-07-25-exhibits-complaint.pdf', 'stored_filename' => 'e3c0eaf5-b092-4b28-bd87-513e4b1004d6.pdf', 'file_path' => '/app/uploads/e3c0eaf5-b092-4b28-bd87-513e4b1004d6.pdf', 'title' => '05-07-25-exhibits-complaint', 'summary' => '', 'notes' => '', 'file_size' => 40815526, 'display_order' => 0, 'created_at' => '2025-06-25 22:15:27.077', 'updated_at' => '2025-06-25 22:15:27.077', 'mime_type' => 'application/pdf'],
|
||||
['id' => 8, 'docket_entry_id' => 8, 'original_filename' => '05-16-25-amended-cert-of-service.pdf', 'stored_filename' => '6c4acc7c-5b89-42b6-9fa2-e5b07297d1c7.pdf', 'file_path' => '/app/uploads/6c4acc7c-5b89-42b6-9fa2-e5b07297d1c7.pdf', 'title' => '05-16-25-amended-cert-of-service', 'summary' => '', 'notes' => '', 'file_size' => 848704, 'display_order' => 0, 'created_at' => '2025-06-25 22:17:36.285', 'updated_at' => '2025-06-25 22:17:36.285', 'mime_type' => 'application/pdf'],
|
||||
['id' => 9, 'docket_entry_id' => 9, 'original_filename' => '05-14-25-cert-service.pdf', 'stored_filename' => '22591482-9c45-4b01-a467-0d88819dff3d.pdf', 'file_path' => '/app/uploads/22591482-9c45-4b01-a467-0d88819dff3d.pdf', 'title' => '05-14-25-cert-service', 'summary' => '', 'notes' => '', 'file_size' => 823675, 'display_order' => 0, 'created_at' => '2025-06-25 22:19:25.031', 'updated_at' => '2025-06-25 22:19:25.031', 'mime_type' => 'application/pdf'],
|
||||
['id' => 10, 'docket_entry_id' => 10, 'original_filename' => '05-12-25-summons.pdf', 'stored_filename' => 'acbe4d9c-62dd-488f-891e-3fa0af8e755f.pdf', 'file_path' => '/app/uploads/acbe4d9c-62dd-488f-891e-3fa0af8e755f.pdf', 'title' => '05-12-25-summons', 'summary' => '', 'notes' => '', 'file_size' => 413753, 'display_order' => 0, 'created_at' => '2025-06-25 22:21:25.34', 'updated_at' => '2025-06-25 22:21:25.34', 'mime_type' => 'application/pdf'],
|
||||
['id' => 11, 'docket_entry_id' => 11, 'original_filename' => '06-05-25-MAD-response.pdf', 'stored_filename' => '0cdf58fb-bc7f-476b-8a95-e599eac5304b.pdf', 'file_path' => '/app/uploads/0cdf58fb-bc7f-476b-8a95-e599eac5304b.pdf', 'title' => '06-05-25-MAD-response', 'summary' => '', 'notes' => '', 'file_size' => 5166383, 'display_order' => 0, 'created_at' => '2025-06-25 22:23:24.416', 'updated_at' => '2025-06-25 22:23:24.416', 'mime_type' => 'application/pdf'],
|
||||
['id' => 12, 'docket_entry_id' => 12, 'original_filename' => '06-06-25-affidavit-military.pdf', 'stored_filename' => '7202e411-1d5a-467d-bd9f-224e1b67e425.pdf', 'file_path' => '/app/uploads/7202e411-1d5a-467d-bd9f-224e1b67e425.pdf', 'title' => '06-06-25-affidavit-military', 'summary' => '', 'notes' => '', 'file_size' => 1813595, 'display_order' => 0, 'created_at' => '2025-06-25 22:25:18.831', 'updated_at' => '2025-06-25 22:25:18.831', 'mime_type' => 'application/pdf'],
|
||||
['id' => 13, 'docket_entry_id' => 13, 'original_filename' => '06-06-25-affidavit-service.pdf', 'stored_filename' => 'fccf383a-52ef-4408-8c93-66a136966abb.pdf', 'file_path' => '/app/uploads/fccf383a-52ef-4408-8c93-66a136966abb.pdf', 'title' => '06-06-25-affidavit-service', 'summary' => '', 'notes' => '', 'file_size' => 1372227, 'display_order' => 0, 'created_at' => '2025-06-25 22:26:21.55', 'updated_at' => '2025-06-25 22:26:21.55', 'mime_type' => 'application/pdf'],
|
||||
['id' => 14, 'docket_entry_id' => 14, 'original_filename' => '06-06-25-motion-default.pdf', 'stored_filename' => '87345cc8-7e8c-4036-b45d-d07038cceaf2.pdf', 'file_path' => '/app/uploads/87345cc8-7e8c-4036-b45d-d07038cceaf2.pdf', 'title' => '06-06-25-motion-default', 'summary' => '', 'notes' => '', 'file_size' => 2912423, 'display_order' => 0, 'created_at' => '2025-06-25 22:27:20.623', 'updated_at' => '2025-06-25 22:27:20.623', 'mime_type' => 'application/pdf'],
|
||||
['id' => 15, 'docket_entry_id' => 15, 'original_filename' => '06-06-25-supporting-default.pdf', 'stored_filename' => '28dac869-0180-4351-9394-fbb089568a5c.pdf', 'file_path' => '/app/uploads/28dac869-0180-4351-9394-fbb089568a5c.pdf', 'title' => '06-06-25-supporting-default', 'summary' => '', 'notes' => '', 'file_size' => 6492681, 'display_order' => 0, 'created_at' => '2025-06-25 22:28:15.994', 'updated_at' => '2025-06-25 22:28:15.994', 'mime_type' => 'application/pdf'],
|
||||
['id' => 16, 'docket_entry_id' => 16, 'original_filename' => '06-06-25-order-default.pdf', 'stored_filename' => '56d72c99-d20c-400b-9b04-6299c402c597.pdf', 'file_path' => '/app/uploads/56d72c99-d20c-400b-9b04-6299c402c597.pdf', 'title' => '06-06-25-order-default', 'summary' => '', 'notes' => '', 'file_size' => 2853711, 'display_order' => 0, 'created_at' => '2025-06-25 22:29:12.735', 'updated_at' => '2025-06-25 22:29:12.735', 'mime_type' => 'application/pdf'],
|
||||
['id' => 17, 'docket_entry_id' => 17, 'original_filename' => '06-06-25-motion-TRO.pdf', 'stored_filename' => '275afa2f-1cc2-4a50-980a-9203f6ddd84e.pdf', 'file_path' => '/app/uploads/275afa2f-1cc2-4a50-980a-9203f6ddd84e.pdf', 'title' => '06-06-25-motion-TRO', 'summary' => '', 'notes' => '', 'file_size' => 3430613, 'display_order' => 0, 'created_at' => '2025-06-25 22:30:25.914', 'updated_at' => '2025-06-25 22:30:25.914', 'mime_type' => 'application/pdf'],
|
||||
['id' => 18, 'docket_entry_id' => 18, 'original_filename' => '06-06-25-TRO.pdf', 'stored_filename' => 'e7f00c5b-322c-4a1e-b865-afd2f8255c62.pdf', 'file_path' => '/app/uploads/e7f00c5b-322c-4a1e-b865-afd2f8255c62.pdf', 'title' => '06-06-25-TRO', 'summary' => '', 'notes' => '', 'file_size' => 1886561, 'display_order' => 0, 'created_at' => '2025-06-25 22:31:31.339', 'updated_at' => '2025-06-25 22:31:31.339', 'mime_type' => 'application/pdf'],
|
||||
['id' => 19, 'docket_entry_id' => 19, 'original_filename' => '06-09-2025-motion-unauthorized.pdf', 'stored_filename' => '37055e87-e18b-47d5-acf1-502080cc3084.pdf', 'file_path' => '/app/uploads/37055e87-e18b-47d5-acf1-502080cc3084.pdf', 'title' => '06-09-2025-motion-unauthorized', 'summary' => '', 'notes' => '', 'file_size' => 8643407, 'display_order' => 0, 'created_at' => '2025-06-25 22:37:56.929', 'updated_at' => '2025-06-25 22:37:56.929', 'mime_type' => 'application/pdf'],
|
||||
['id' => 20, 'docket_entry_id' => 20, 'original_filename' => '06-09-25-proposed-unathorized.pdf', 'stored_filename' => '252e2a75-37b8-4478-9e3f-bab0dcd62975.pdf', 'file_path' => '/app/uploads/252e2a75-37b8-4478-9e3f-bab0dcd62975.pdf', 'title' => '06-09-25-proposed-unathorized', 'summary' => '', 'notes' => '', 'file_size' => 2053426, 'display_order' => 0, 'created_at' => '2025-06-25 22:38:59.564', 'updated_at' => '2025-06-25 22:38:59.564', 'mime_type' => 'application/pdf'],
|
||||
['id' => 21, 'docket_entry_id' => 21, 'original_filename' => '06-09-25-motion-sanctions.pdf', 'stored_filename' => '5933acef-8523-44c9-81c3-e37ea8abd256.pdf', 'file_path' => '/app/uploads/5933acef-8523-44c9-81c3-e37ea8abd256.pdf', 'title' => '06-09-25-motion-sanctions', 'summary' => '', 'notes' => '', 'file_size' => 5752094, 'display_order' => 0, 'created_at' => '2025-06-25 22:40:00.636', 'updated_at' => '2025-06-25 22:40:00.636', 'mime_type' => 'application/pdf'],
|
||||
['id' => 22, 'docket_entry_id' => 22, 'original_filename' => '06-09-25-proposed-grant-sanctions.pdf', 'stored_filename' => '004f5cd2-d600-4125-86da-bca491183fcb.pdf', 'file_path' => '/app/uploads/004f5cd2-d600-4125-86da-bca491183fcb.pdf', 'title' => '06-09-25-proposed-grant-sanctions', 'summary' => '', 'notes' => '', 'file_size' => 2896461, 'display_order' => 0, 'created_at' => '2025-06-25 22:40:55.409', 'updated_at' => '2025-06-25 22:40:55.409', 'mime_type' => 'application/pdf'],
|
||||
['id' => 23, 'docket_entry_id' => 23, 'original_filename' => '06-10-25-granting-motion-strike.pdf', 'stored_filename' => '97cbd49d-c23c-4415-baa7-cf0432aa0942.pdf', 'file_path' => '/app/uploads/97cbd49d-c23c-4415-baa7-cf0432aa0942.pdf', 'title' => '06-10-25-granting-motion-strike', 'summary' => '', 'notes' => '', 'file_size' => 3877515, 'display_order' => 0, 'created_at' => '2025-06-25 22:41:51.826', 'updated_at' => '2025-06-25 22:41:51.826', 'mime_type' => 'application/pdf'],
|
||||
['id' => 24, 'docket_entry_id' => 24, 'original_filename' => '06-11-25-motion-prelim.pdf', 'stored_filename' => '34bb78ab-98db-4b67-8a5d-0a0781710bd1.pdf', 'file_path' => '/app/uploads/34bb78ab-98db-4b67-8a5d-0a0781710bd1.pdf', 'title' => '06-11-25-motion-prelim', 'summary' => '', 'notes' => '', 'file_size' => 6451893, 'display_order' => 0, 'created_at' => '2025-06-25 22:42:44.297', 'updated_at' => '2025-06-25 22:42:44.297', 'mime_type' => 'application/pdf'],
|
||||
['id' => 25, 'docket_entry_id' => 25, 'original_filename' => '06-11-25-proposed-grant-prelim.pdf', 'stored_filename' => '8f5bd0e0-7c45-4ecc-91eb-c4b3464689a7.pdf', 'file_path' => '/app/uploads/8f5bd0e0-7c45-4ecc-91eb-c4b3464689a7.pdf', 'title' => '06-11-25-proposed-grant-prelim', 'summary' => '', 'notes' => '', 'file_size' => 2217692, 'display_order' => 0, 'created_at' => '2025-06-25 22:43:28.944', 'updated_at' => '2025-06-25 22:43:28.944', 'mime_type' => 'application/pdf'],
|
||||
['id' => 26, 'docket_entry_id' => 26, 'original_filename' => 'MAD-Notice of Appearance 07:24.pdf', 'stored_filename' => '51bc25d9-3a86-4221-b9d5-329667877d9e.pdf', 'file_path' => '/app/uploads/51bc25d9-3a86-4221-b9d5-329667877d9e.pdf', 'title' => 'MAD-Notice of Appearance 07:24', 'summary' => '', 'notes' => '', 'file_size' => 113258, 'display_order' => 0, 'created_at' => '2025-07-25 21:34:56.53', 'updated_at' => '2025-07-25 21:34:56.53', 'mime_type' => 'application/pdf'],
|
||||
['id' => 27, 'docket_entry_id' => 27, 'original_filename' => 'MAD answer-07:24.pdf', 'stored_filename' => 'b5d14c6f-6321-4711-b263-62fff14b9df6.pdf', 'file_path' => '/app/uploads/b5d14c6f-6321-4711-b263-62fff14b9df6.pdf', 'title' => 'MAD answer-07:24', 'summary' => '', 'notes' => '', 'file_size' => 177006, 'display_order' => 0, 'created_at' => '2025-07-25 21:37:33.878', 'updated_at' => '2025-07-25 21:37:33.878', 'mime_type' => 'application/pdf'],
|
||||
['id' => 28, 'docket_entry_id' => 28, 'original_filename' => '19 Rule 16(B), M.R.CIV.P. Order.pdf', 'stored_filename' => '50e98985-42a0-42b6-8501-5ed98cd3643d.pdf', 'file_path' => '/app/uploads/50e98985-42a0-42b6-8501-5ed98cd3643d.pdf', 'title' => '19 Rule 16(B), M.R.CIV.P. Order', 'summary' => '', 'notes' => '', 'file_size' => 906508, 'display_order' => 0, 'created_at' => '2025-08-05 22:23:38.98', 'updated_at' => '2025-08-05 22:23:38.98', 'mime_type' => 'application/pdf'],
|
||||
['id' => 29, 'docket_entry_id' => 29, 'original_filename' => 'MOTION TO DISMISS COUNTERCLAIMS (August 8, 2025).pdf', 'stored_filename' => 'dd34041b-d2b7-4cf8-9b25-a5aa83f006ab.pdf', 'file_path' => '/app/uploads/dd34041b-d2b7-4cf8-9b25-a5aa83f006ab.pdf', 'title' => 'MOTION TO DISMISS COUNTERCLAIMS (August 8, 2025)', 'summary' => '', 'notes' => '', 'file_size' => 1275683, 'display_order' => 0, 'created_at' => '2025-08-11 19:47:00.548', 'updated_at' => '2025-08-11 19:47:00.548', 'mime_type' => 'application/pdf'],
|
||||
['id' => 30, 'docket_entry_id' => 30, 'original_filename' => '[PROPOSED] ORDER GRANTING PLAINTIFF\'S MOTION TO DISMISS COUNTERCLAIMS (August 8, 2025).pdf', 'stored_filename' => '6606618f-fef6-4d83-813b-aa9e5807866d.pdf', 'file_path' => '/app/uploads/6606618f-fef6-4d83-813b-aa9e5807866d.pdf', 'title' => '[PROPOSED] ORDER GRANTING PLAINTIFF\'S MOTION TO DISMISS COUNTERCLAIMS (August 8, 2025)', 'summary' => '', 'notes' => '', 'file_size' => 144855, 'display_order' => 0, 'created_at' => '2025-08-11 19:59:36.412', 'updated_at' => '2025-08-11 19:59:36.412', 'mime_type' => 'application/pdf'],
|
||||
['id' => 31, 'docket_entry_id' => 31, 'original_filename' => 'PLAINTIFF\'S MOTION FOR PROTECTIVE ORDER REGARDING DEFENDANT\'S FIRST COMBINED DISCOVERY REQUESTS (August 8, 2025).pdf', 'stored_filename' => '4cd62919-ad92-46e9-a54a-d8e54e0729da.pdf', 'file_path' => '/app/uploads/4cd62919-ad92-46e9-a54a-d8e54e0729da.pdf', 'title' => 'PLAINTIFF\'S MOTION FOR PROTECTIVE ORDER REGARDING DEFENDANT\'S FIRST COMBINED DISCOVERY REQUESTS (August 8, 2025)', 'summary' => '', 'notes' => '', 'file_size' => 965180, 'display_order' => 0, 'created_at' => '2025-08-11 20:05:05.783', 'updated_at' => '2025-08-11 20:05:05.783', 'mime_type' => 'application/pdf'],
|
||||
['id' => 32, 'docket_entry_id' => 32, 'original_filename' => '[PROPOSED] ORDER GRANTING PLAINTIFF\'S MOTION FOR PROTECTIVE ORDER (August 8, 2025).pdf', 'stored_filename' => '756cbb75-cb30-4e6e-96e2-9ba18f590808.pdf', 'file_path' => '/app/uploads/756cbb75-cb30-4e6e-96e2-9ba18f590808.pdf', 'title' => '[PROPOSED] ORDER GRANTING PLAINTIFF\'S MOTION FOR PROTECTIVE ORDER (August 8, 2025)', 'summary' => '', 'notes' => '', 'file_size' => 103313, 'display_order' => 0, 'created_at' => '2025-08-11 20:10:12.522', 'updated_at' => '2025-08-11 20:10:12.522', 'mime_type' => 'application/pdf'],
|
||||
['id' => 33, 'docket_entry_id' => 33, 'original_filename' => '2025.08.07 Notice of Service.pdf', 'stored_filename' => 'c4a1fa10-5d63-4d22-965b-3f81df2a4bed.pdf', 'file_path' => '/app/uploads/c4a1fa10-5d63-4d22-965b-3f81df2a4bed.pdf', 'title' => '2025.08.07 Notice of Service', 'summary' => '', 'notes' => '', 'file_size' => 113028, 'display_order' => 0, 'created_at' => '2025-08-12 16:45:14.328', 'updated_at' => '2025-08-12 16:45:14.328', 'mime_type' => 'application/pdf'],
|
||||
['id' => 34, 'docket_entry_id' => 36, 'original_filename' => 'Notice of Service Discovery Request (August 12, 2025).pdf', 'stored_filename' => '5cc390c8-fdfd-4610-9a7b-7f37a6322cc3.pdf', 'file_path' => '/app/uploads/5cc390c8-fdfd-4610-9a7b-7f37a6322cc3.pdf', 'title' => 'Notice of Service Discovery Request (August 12, 2025)', 'summary' => '', 'notes' => '', 'file_size' => 371297, 'display_order' => 0, 'created_at' => '2025-08-24 15:17:56.831', 'updated_at' => '2025-08-24 15:17:56.831', 'mime_type' => 'application/pdf'],
|
||||
['id' => 35, 'docket_entry_id' => 41, 'original_filename' => 'MOTION TO WITHDRAW PRELIMINARY INJUNCTION MOTION (August 18, 2026).pdf', 'stored_filename' => '2f15c9c1-98b8-4f72-b22a-accee822fba4.pdf', 'file_path' => '/app/uploads/2f15c9c1-98b8-4f72-b22a-accee822fba4.pdf', 'title' => 'MOTION TO WITHDRAW PRELIMINARY INJUNCTION MOTION (August 18, 2026)', 'summary' => '', 'notes' => '', 'file_size' => 422033, 'display_order' => 0, 'created_at' => '2025-08-24 15:21:18.366', 'updated_at' => '2025-08-24 15:21:18.366', 'mime_type' => 'application/pdf'],
|
||||
['id' => 36, 'docket_entry_id' => 42, 'original_filename' => 'SUPPLEMENTAL NOTICE REGARDING RULE 3(G)(2) COMPLIANCE (August 18, 2026).pdf', 'stored_filename' => '0d4cebf9-2e39-4f17-8b62-2fba89d41494.pdf', 'file_path' => '/app/uploads/0d4cebf9-2e39-4f17-8b62-2fba89d41494.pdf', 'title' => 'SUPPLEMENTAL NOTICE REGARDING RULE 3(G)(2) COMPLIANCE (August 18, 2026)', 'summary' => '', 'notes' => '', 'file_size' => 450998, 'display_order' => 0, 'created_at' => '2025-08-24 15:23:10.332', 'updated_at' => '2025-08-24 15:23:10.332', 'mime_type' => 'application/pdf'],
|
||||
['id' => 37, 'docket_entry_id' => 43, 'original_filename' => 'Notice of Filing Proposed Scheduling Order 08:20:2025.pdf', 'stored_filename' => '9b6c1274-2786-44fe-87c4-750b1e310f4a.pdf', 'file_path' => '/app/uploads/9b6c1274-2786-44fe-87c4-750b1e310f4a.pdf', 'title' => 'Notice of Filing Proposed Scheduling Order 08:20:2025', 'summary' => '', 'notes' => '', 'file_size' => 87493, 'display_order' => 0, 'created_at' => '2025-08-26 21:17:45.796', 'updated_at' => '2025-08-26 21:17:45.796', 'mime_type' => 'application/pdf'],
|
||||
['id' => 38, 'docket_entry_id' => 44, 'original_filename' => 'Proposed Scheduling Order 08:20:2025.pdf', 'stored_filename' => 'f543d62a-817b-4dbe-b9f7-6d36a9ee59b2.pdf', 'file_path' => '/app/uploads/f543d62a-817b-4dbe-b9f7-6d36a9ee59b2.pdf', 'title' => 'Proposed Scheduling Order 08:20:2025', 'summary' => '', 'notes' => '', 'file_size' => 2370599, 'display_order' => 0, 'created_at' => '2025-08-26 21:19:22.22', 'updated_at' => '2025-08-26 21:19:22.22', 'mime_type' => 'application/pdf'],
|
||||
['id' => 40, 'docket_entry_id' => 46, 'original_filename' => '2025.08.22 MAD\'s Response to Kragh\'s Motion for Protective Order.pdf', 'stored_filename' => '8b28b36f-08ce-4cdc-aad0-5d535b558e5b.pdf', 'file_path' => '/app/uploads/8b28b36f-08ce-4cdc-aad0-5d535b558e5b.pdf', 'title' => '2025.08.22 MAD\'s Response to Kragh\'s Motion for Protective Order', 'summary' => '', 'notes' => '', 'file_size' => 1340870, 'display_order' => 0, 'created_at' => '2025-08-26 21:37:25.077', 'updated_at' => '2025-08-26 21:37:25.077', 'mime_type' => 'application/pdf'],
|
||||
['id' => 41, 'docket_entry_id' => 47, 'original_filename' => '28 Scheduling Order 08:25:2025.pdf', 'stored_filename' => '120f303c-91db-409f-a028-543fb6019dcb.pdf', 'file_path' => '/app/uploads/120f303c-91db-409f-a028-543fb6019dcb.pdf', 'title' => '28 Scheduling Order 08:25:2025', 'summary' => '', 'notes' => '', 'file_size' => 2416317, 'display_order' => 0, 'created_at' => '2025-08-31 19:05:01.606', 'updated_at' => '2025-08-31 19:05:01.606', 'mime_type' => 'application/pdf'],
|
||||
['id' => 42, 'docket_entry_id' => 48, 'original_filename' => '2025.08.29 MAD\'s Response to MX to Dismiss (1).pdf', 'stored_filename' => 'ea040083-d7f0-4393-822b-59d8e77eccf0.pdf', 'file_path' => '/app/uploads/ea040083-d7f0-4393-822b-59d8e77eccf0.pdf', 'title' => '2025.08.29 MAD\'s Response to MX to Dismiss (1)', 'summary' => '', 'notes' => '', 'file_size' => 279201, 'display_order' => 0, 'created_at' => '2025-09-05 02:25:03.18', 'updated_at' => '2025-09-05 02:25:03.18', 'mime_type' => 'application/pdf'],
|
||||
['id' => 43, 'docket_entry_id' => 49, 'original_filename' => 'REPLY BRIEF IN SUPPORT OF PLAINTIFF\'S MOTION TO DISMISS COUNTERCLAIMS AND STRIKE AFFIRMATIVE DEFENSES (September 2, 2025).pdf', 'stored_filename' => '890a4fd1-d25e-4d03-952c-68b22173b97d.pdf', 'file_path' => '/app/uploads/890a4fd1-d25e-4d03-952c-68b22173b97d.pdf', 'title' => 'REPLY BRIEF IN SUPPORT OF PLAINTIFF\'S MOTION TO DISMISS COUNTERCLAIMS AND STRIKE AFFIRMATIVE DEFENSES (September 2, 2025)', 'summary' => '', 'notes' => '', 'file_size' => 1460459, 'display_order' => 0, 'created_at' => '2025-09-05 22:34:39.922', 'updated_at' => '2025-09-05 22:34:39.922', 'mime_type' => 'application/pdf'],
|
||||
['id' => 44, 'docket_entry_id' => 50, 'original_filename' => 'REPLY BRIEF IN SUPPORT OF PLAINTIFF\'S MOTION FOR PROTECTIVE ORDER (September 2, 2025).pdf', 'stored_filename' => '6418adb6-522c-4141-af54-c457da8a48a1.pdf', 'file_path' => '/app/uploads/6418adb6-522c-4141-af54-c457da8a48a1.pdf', 'title' => 'REPLY BRIEF IN SUPPORT OF PLAINTIFF\'S MOTION FOR PROTECTIVE ORDER (September 2, 2025)', 'summary' => '', 'notes' => '', 'file_size' => 2165420, 'display_order' => 0, 'created_at' => '2025-09-05 22:35:36.038', 'updated_at' => '2025-09-05 22:35:36.038', 'mime_type' => 'application/pdf'],
|
||||
['id' => 45, 'docket_entry_id' => 51, 'original_filename' => 'Notice Of Service of Discovery Responses (September 8, 2025)-2.pdf', 'stored_filename' => '263d0930-e617-4a10-ba5f-2719cf5123d6.pdf', 'file_path' => '/app/uploads/263d0930-e617-4a10-ba5f-2719cf5123d6.pdf', 'title' => 'Notice Of Service of Discovery Responses (September 8, 2025)-2', 'summary' => '', 'notes' => '', 'file_size' => 588054, 'display_order' => 0, 'created_at' => '2025-09-11 03:13:33.585', 'updated_at' => '2025-09-11 03:13:33.585', 'mime_type' => 'application/pdf'],
|
||||
['id' => 46, 'docket_entry_id' => 52, 'original_filename' => '2025.09.15 Notice of Service.pdf', 'stored_filename' => 'b265a58c-39e7-49ef-9bcc-12ee495943eb.pdf', 'file_path' => '/app/uploads/b265a58c-39e7-49ef-9bcc-12ee495943eb.pdf', 'title' => '2025.09.15 Notice of Service', 'summary' => '', 'notes' => '', 'file_size' => 116109, 'display_order' => 0, 'created_at' => '2025-09-22 03:07:48.166', 'updated_at' => '2025-09-22 03:07:48.166', 'mime_type' => 'application/pdf'],
|
||||
['id' => 47, 'docket_entry_id' => 53, 'original_filename' => '34 Order.pdf', 'stored_filename' => '17406665-163b-40c4-b63b-4968cd4bff28.pdf', 'file_path' => '/app/uploads/17406665-163b-40c4-b63b-4968cd4bff28.pdf', 'title' => '34 Order', 'summary' => '', 'notes' => '', 'file_size' => 958614, 'display_order' => 0, 'created_at' => '2025-09-27 23:16:18.329', 'updated_at' => '2025-09-27 23:16:18.329', 'mime_type' => 'application/pdf'],
|
||||
['id' => 48, 'docket_entry_id' => 54, 'original_filename' => 'MAD\'SMotionforSummaryJudgement.pdf', 'stored_filename' => '787faf65-5d11-4785-8a93-5f5b3d5fc00a.pdf', 'file_path' => '/app/uploads/787faf65-5d11-4785-8a93-5f5b3d5fc00a.pdf', 'title' => 'MAD\'SMotionforSummaryJudgement', 'summary' => '', 'notes' => '', 'file_size' => 146748, 'display_order' => 0, 'created_at' => '2025-10-08 18:22:13.047', 'updated_at' => '2025-10-08 18:22:13.047', 'mime_type' => 'application/pdf'],
|
||||
['id' => 49, 'docket_entry_id' => 55, 'original_filename' => 'BISOMADMotionforSummaryJudgment.pdf', 'stored_filename' => '8d0154b4-8f08-41e6-9aa1-8ce4c84fa7af.pdf', 'file_path' => '/app/uploads/8d0154b4-8f08-41e6-9aa1-8ce4c84fa7af.pdf', 'title' => 'BISOMADMotionforSummaryJudgment', 'summary' => '', 'notes' => '', 'file_size' => 302820, 'display_order' => 0, 'created_at' => '2025-10-08 18:23:51.899', 'updated_at' => '2025-10-08 18:23:51.899', 'mime_type' => 'application/pdf'],
|
||||
['id' => 50, 'docket_entry_id' => 56, 'original_filename' => 'LacnyDeclarationinSupportofMSJ.pdf', 'stored_filename' => '7a972bdf-bc97-4be5-a8c2-55f0d3a38d42.pdf', 'file_path' => '/app/uploads/7a972bdf-bc97-4be5-a8c2-55f0d3a38d42.pdf', 'title' => 'LacnyDeclarationinSupportofMSJ', 'summary' => '', 'notes' => '', 'file_size' => 1751587, 'display_order' => 0, 'created_at' => '2025-10-08 18:24:58.657', 'updated_at' => '2025-10-08 18:24:58.657', 'mime_type' => 'application/pdf'],
|
||||
['id' => 51, 'docket_entry_id' => 57, 'original_filename' => 'MOTION TO COMPEL DISCOVERY.pdf', 'stored_filename' => '105a7fb1-3fdb-4d86-9250-d79c61997349.pdf', 'file_path' => '/app/uploads/105a7fb1-3fdb-4d86-9250-d79c61997349.pdf', 'title' => 'MOTION TO COMPEL DISCOVERY', 'summary' => '', 'notes' => '', 'file_size' => 940071, 'display_order' => 0, 'created_at' => '2025-10-08 18:42:25.834', 'updated_at' => '2025-10-08 18:42:25.834', 'mime_type' => 'application/pdf'],
|
||||
['id' => 52, 'docket_entry_id' => 58, 'original_filename' => 'Exhibits.pdf', 'stored_filename' => '75ad46f0-2d99-444f-bdef-659982cf52c7.pdf', 'file_path' => '/app/uploads/75ad46f0-2d99-444f-bdef-659982cf52c7.pdf', 'title' => 'Exhibits', 'summary' => '', 'notes' => '', 'file_size' => 8496288, 'display_order' => 0, 'created_at' => '2025-10-08 18:43:38.741', 'updated_at' => '2025-10-08 18:43:38.741', 'mime_type' => 'application/pdf'],
|
||||
['id' => 53, 'docket_entry_id' => 59, 'original_filename' => '[PROPOSED] ORDER GRANTING MOTION TO COMPEL DISCOVERY.pdf', 'stored_filename' => '50cee894-78d5-44d0-a876-d5e6b1a77531.pdf', 'file_path' => '/app/uploads/50cee894-78d5-44d0-a876-d5e6b1a77531.pdf', 'title' => '[PROPOSED] ORDER GRANTING MOTION TO COMPEL DISCOVERY', 'summary' => '', 'notes' => '', 'file_size' => 130494, 'display_order' => 0, 'created_at' => '2025-10-10 19:18:32.532', 'updated_at' => '2025-10-10 19:18:32.532', 'mime_type' => 'application/pdf'],
|
||||
['id' => 54, 'docket_entry_id' => 60, 'original_filename' => 'MOTION FOR ADDITIONAL DISCOVERY TIME PURSUANT TO RULE 56(f).pdf', 'stored_filename' => 'f92f2aea-a6e2-4a44-88eb-603a39245b08.pdf', 'file_path' => '/app/uploads/f92f2aea-a6e2-4a44-88eb-603a39245b08.pdf', 'title' => 'MOTION FOR ADDITIONAL DISCOVERY TIME PURSUANT TO RULE 56(f)', 'summary' => '', 'notes' => '', 'file_size' => 1228332, 'display_order' => 0, 'created_at' => '2025-10-10 19:20:17.585', 'updated_at' => '2025-10-10 19:20:17.585', 'mime_type' => 'application/pdf'],
|
||||
['id' => 55, 'docket_entry_id' => 61, 'original_filename' => 'AFFIDAVIT IN SUPPORT OF RULE 56(f) MOTION.pdf', 'stored_filename' => 'c87574bc-c254-4b69-bc56-6676c163daf1.pdf', 'file_path' => '/app/uploads/c87574bc-c254-4b69-bc56-6676c163daf1.pdf', 'title' => 'AFFIDAVIT IN SUPPORT OF RULE 56(f) MOTION', 'summary' => '', 'notes' => '', 'file_size' => 1033222, 'display_order' => 0, 'created_at' => '2025-10-10 19:21:28.59', 'updated_at' => '2025-10-10 19:21:28.59', 'mime_type' => 'application/pdf'],
|
||||
['id' => 56, 'docket_entry_id' => 62, 'original_filename' => 'AFFIDAVIT OF ELIZABETH KRAGH IN SUPPORT OF MOTION TO MODIFY SCHEDULING ORDER.pdf', 'stored_filename' => '6bddd7e8-5d95-4e7d-934f-d54eff9bfac8.pdf', 'file_path' => '/app/uploads/6bddd7e8-5d95-4e7d-934f-d54eff9bfac8.pdf', 'title' => 'AFFIDAVIT OF ELIZABETH KRAGH IN SUPPORT OF MOTION TO MODIFY SCHEDULING ORDER', 'summary' => '', 'notes' => '', 'file_size' => 932377, 'display_order' => 0, 'created_at' => '2025-10-12 02:38:59.403', 'updated_at' => '2025-10-12 02:38:59.403', 'mime_type' => 'application/pdf'],
|
||||
['id' => 57, 'docket_entry_id' => 63, 'original_filename' => 'MOTION TO MODIFY SCHEDULING ORDER - EXTENSION OF COMPLAINT AMENDMENT DEADLINE.pdf', 'stored_filename' => 'ed5904c1-017b-4cb7-a247-9702e33cb109.pdf', 'file_path' => '/app/uploads/ed5904c1-017b-4cb7-a247-9702e33cb109.pdf', 'title' => 'MOTION TO MODIFY SCHEDULING ORDER - EXTENSION OF COMPLAINT AMENDMENT DEADLINE', 'summary' => '', 'notes' => '', 'file_size' => 1313886, 'display_order' => 0, 'created_at' => '2025-10-12 02:40:20.483', 'updated_at' => '2025-10-12 02:40:20.483', 'mime_type' => 'application/pdf'],
|
||||
['id' => 58, 'docket_entry_id' => 64, 'original_filename' => 'PROPOSED ORDER GRANTING MOTION TO MODIFY SCHEDULING ORDER.pdf', 'stored_filename' => '51cc05eb-b388-45bf-9a10-33bbd7c00db3.pdf', 'file_path' => '/app/uploads/51cc05eb-b388-45bf-9a10-33bbd7c00db3.pdf', 'title' => 'PROPOSED ORDER GRANTING MOTION TO MODIFY SCHEDULING ORDER', 'summary' => '', 'notes' => '', 'file_size' => 109939, 'display_order' => 0, 'created_at' => '2025-10-12 02:41:36.875', 'updated_at' => '2025-10-12 02:41:36.875', 'mime_type' => 'application/pdf'],
|
||||
['id' => 59, 'docket_entry_id' => 65, 'original_filename' => 'Notice Of Service of Discovery Responses (October 21, 2025).pdf', 'stored_filename' => 'a846f4c6-9ef5-4f7f-ae67-95e1b9af4644.pdf', 'file_path' => '/app/uploads/a846f4c6-9ef5-4f7f-ae67-95e1b9af4644.pdf', 'title' => 'Notice Of Service of Discovery Responses (October 21, 2025)', 'summary' => '', 'notes' => '', 'file_size' => 290204, 'display_order' => 0, 'created_at' => '2025-11-09 20:19:56.84', 'updated_at' => '2025-11-09 20:19:56.84', 'mime_type' => 'application/pdf'],
|
||||
['id' => 60, 'docket_entry_id' => 66, 'original_filename' => 'MOTION TO STRIKE IMPROPERLY FILED DISCOVERY RESPONSES.pdf', 'stored_filename' => '051bcfa0-67ad-41a2-9045-fd0b7e8fe5cd.pdf', 'file_path' => '/app/uploads/051bcfa0-67ad-41a2-9045-fd0b7e8fe5cd.pdf', 'title' => 'MOTION TO STRIKE IMPROPERLY FILED DISCOVERY RESPONSES', 'summary' => '', 'notes' => '', 'file_size' => 567643, 'display_order' => 0, 'created_at' => '2025-11-09 20:21:47.692', 'updated_at' => '2025-11-09 20:21:47.692', 'mime_type' => 'application/pdf'],
|
||||
['id' => 61, 'docket_entry_id' => 67, 'original_filename' => '49 Order Granting Motion to Strike Improperly Filed Discovery Responses.pdf', 'stored_filename' => '57982aa8-739d-487a-9aa4-418d16c98de5.pdf', 'file_path' => '/app/uploads/57982aa8-739d-487a-9aa4-418d16c98de5.pdf', 'title' => '49 Order Granting Motion to Strike Improperly Filed Discovery Responses', 'summary' => '', 'notes' => '', 'file_size' => 878809, 'display_order' => 0, 'created_at' => '2025-11-09 23:31:54.831', 'updated_at' => '2025-11-09 23:31:54.831', 'mime_type' => 'application/pdf'],
|
||||
['id' => 62, 'docket_entry_id' => 68, 'original_filename' => '2025.10.24 MAD Response to MTC and Cross-Motion for Protective Order.pdf', 'stored_filename' => '985b5e38-4393-4e0f-b119-87d73d6279e3.pdf', 'file_path' => '/app/uploads/985b5e38-4393-4e0f-b119-87d73d6279e3.pdf', 'title' => '2025.10.24 MAD Response to MTC and Cross-Motion for Protective Order', 'summary' => '', 'notes' => '', 'file_size' => 697398, 'display_order' => 0, 'created_at' => '2025-11-09 23:34:02.101', 'updated_at' => '2025-11-09 23:34:02.101', 'mime_type' => 'application/pdf'],
|
||||
['id' => 63, 'docket_entry_id' => 70, 'original_filename' => ' MAD Combined Response to Rule 56F and MX to Extend.pdf', 'stored_filename' => '9b302464-27f6-4673-ac13-88787fc3e148.pdf', 'file_path' => '/app/uploads/9b302464-27f6-4673-ac13-88787fc3e148.pdf', 'title' => ' MAD Combined Response to Rule 56F and MX to Extend', 'summary' => '', 'notes' => '', 'file_size' => 2968585, 'display_order' => 0, 'created_at' => '2025-11-09 23:37:51.447', 'updated_at' => '2025-11-09 23:37:51.447', 'mime_type' => 'application/pdf'],
|
||||
['id' => 64, 'docket_entry_id' => 71, 'original_filename' => 'Motion_to_extend_time-10.28.25.pdf', 'stored_filename' => '75f79efc-1263-45c8-9720-eab30ac5f0d0.pdf', 'file_path' => '/app/uploads/75f79efc-1263-45c8-9720-eab30ac5f0d0.pdf', 'title' => 'Motion_to_extend_time-10.28.25', 'summary' => '', 'notes' => '', 'file_size' => 1045115, 'display_order' => 0, 'created_at' => '2025-11-09 23:39:13.777', 'updated_at' => '2025-11-09 23:39:13.777', 'mime_type' => 'application/pdf'],
|
||||
['id' => 65, 'docket_entry_id' => 72, 'original_filename' => '53 Order Granting Motion to Extend Time For Filing Reply Briefs.pdf', 'stored_filename' => '243e3d14-1201-43f1-90a4-c9b0df8b2f42.pdf', 'file_path' => '/app/uploads/243e3d14-1201-43f1-90a4-c9b0df8b2f42.pdf', 'title' => '53 Order Granting Motion to Extend Time For Filing Reply Briefs', 'summary' => '', 'notes' => '', 'file_size' => 849616, 'display_order' => 0, 'created_at' => '2025-11-09 23:40:37.466', 'updated_at' => '2025-11-09 23:40:37.466', 'mime_type' => 'application/pdf'],
|
||||
['id' => 66, 'docket_entry_id' => 73, 'original_filename' => 'REPLY BRIEF IN SUPPORT OF MOTION TO MODIFY SCHEDULING ORDER.pdf', 'stored_filename' => '63f26d51-a889-4c3b-b2fb-0a73b4fad040.pdf', 'file_path' => '/app/uploads/63f26d51-a889-4c3b-b2fb-0a73b4fad040.pdf', 'title' => 'REPLY BRIEF IN SUPPORT OF MOTION TO MODIFY SCHEDULING ORDER', 'summary' => '', 'notes' => '', 'file_size' => 1273886, 'display_order' => 0, 'created_at' => '2025-11-13 20:36:00.392', 'updated_at' => '2025-11-13 20:36:00.392', 'mime_type' => 'application/pdf'],
|
||||
['id' => 67, 'docket_entry_id' => 75, 'original_filename' => 'REPLY BRIEF IN SUPPORT OF MOTION FOR ADDITIONAL DISCOVERY TIME PURSUANT TO RULE 56(f).pdf', 'stored_filename' => 'fd705e60-4393-4262-a231-4d43fa6ccc7e.pdf', 'file_path' => '/app/uploads/fd705e60-4393-4262-a231-4d43fa6ccc7e.pdf', 'title' => 'REPLY BRIEF IN SUPPORT OF MOTION FOR ADDITIONAL DISCOVERY TIME PURSUANT TO RULE 56(f)', 'summary' => '', 'notes' => '', 'file_size' => 1293569, 'display_order' => 0, 'created_at' => '2025-11-13 20:39:05.692', 'updated_at' => '2025-11-13 20:39:05.692', 'mime_type' => 'application/pdf'],
|
||||
['id' => 68, 'docket_entry_id' => 76, 'original_filename' => 'REPLY BRIEF IN SUPPORT OF MOTION TO COMPEL DISCOVERY.pdf', 'stored_filename' => '1161cce9-3ebb-40e5-a9dd-b45db293fdf5.pdf', 'file_path' => '/app/uploads/1161cce9-3ebb-40e5-a9dd-b45db293fdf5.pdf', 'title' => 'REPLY BRIEF IN SUPPORT OF MOTION TO COMPEL DISCOVERY', 'summary' => '', 'notes' => '', 'file_size' => 1296325, 'display_order' => 0, 'created_at' => '2025-11-13 20:40:55.025', 'updated_at' => '2025-11-13 20:40:55.025', 'mime_type' => 'application/pdf'],
|
||||
];
|
||||
|
||||
================================================================================
|
||||
SUBSCRIPTIONS ARRAY:
|
||||
================================================================================
|
||||
$subscriptions = [
|
||||
['id' => 1, 'email' => 'chris@sigd.net', 'is_active' => true, 'unsubscribe_token' => 'b23fb3e1-2dff-4f81-a317-5d51b1049aa4', 'created_at' => '2025-06-25 21:38:03.618'],
|
||||
['id' => 2, 'email' => 'peanuts260@gmail.com', 'is_active' => true, 'unsubscribe_token' => '4bcbdf8a-7e8f-4bca-8a73-e25b0c9bfc02', 'created_at' => '2025-06-27 10:02:45.786'],
|
||||
['id' => 3, 'email' => 'Jana.Bifi@gmail.com', 'is_active' => true, 'unsubscribe_token' => 'f75a8d51-6281-4841-8be3-b1f2d88d1110', 'created_at' => '2025-06-27 16:32:28.778'],
|
||||
['id' => 4, 'email' => 'pinerusticnickel6895@gmail.com', 'is_active' => true, 'unsubscribe_token' => '587cb35e-9974-4c13-9076-6e1cc753faf2', 'created_at' => '2025-06-27 19:10:18.781'],
|
||||
['id' => 5, 'email' => 'surdus.law@gmail.com', 'is_active' => true, 'unsubscribe_token' => '5581d0b7-d8d5-4f04-a648-318bf2e12ba0', 'created_at' => '2025-06-27 21:56:18.553'],
|
||||
['id' => 6, 'email' => 'gmajabparis@gmail.com', 'is_active' => true, 'unsubscribe_token' => '861dd663-1b05-4cbe-8525-1c63ea234cde', 'created_at' => '2025-06-27 22:20:00.427'],
|
||||
['id' => 7, 'email' => 'wheeler6811@aol.com', 'is_active' => true, 'unsubscribe_token' => '7af79759-2c8f-464d-b3f0-e6807311f6dd', 'created_at' => '2025-06-28 03:31:46.426'],
|
||||
['id' => 8, 'email' => 'Jared@Allebest.com', 'is_active' => true, 'unsubscribe_token' => '464a7cef-ff03-4c01-8443-354fb296464e', 'created_at' => '2025-06-28 23:00:04.484'],
|
||||
['id' => 9, 'email' => 'kimanderson.ks@gmail.com', 'is_active' => true, 'unsubscribe_token' => '798ba07c-4d03-4afb-828c-df81c72650c2', 'created_at' => '2025-06-29 14:55:30.011'],
|
||||
['id' => 25, 'email' => 'tane.schulte@gmail.com', 'is_active' => true, 'unsubscribe_token' => 'a85a06d4-124e-4164-8459-51a5c68adbf5', 'created_at' => '2025-09-29 01:03:14.805'],
|
||||
['id' => 26, 'email' => 'trnelson89@gmail.com', 'is_active' => true, 'unsubscribe_token' => '5a3b50a5-d0c7-4441-a41e-c0b9a5075979', 'created_at' => '2025-10-24 16:27:59.56'],
|
||||
['id' => 27, 'email' => 'letsgetonacid222@gmail.com', 'is_active' => true, 'unsubscribe_token' => 'fac65b07-79d3-4165-aaca-84ec3332ae85', 'created_at' => '2025-10-28 16:18:00.457'],
|
||||
['id' => 28, 'email' => 'quarks.tattoo-09@icloud.com', 'is_active' => true, 'unsubscribe_token' => 'd8b53e7c-5a69-4670-85fe-604bc83813b2', 'created_at' => '2025-11-19 03:03:45.528'],
|
||||
['id' => 10, 'email' => 'ksymansky@gmail.com', 'is_active' => true, 'unsubscribe_token' => 'b87f9a94-5cc1-4d9f-ad77-a1be4eb038ea', 'created_at' => '2025-07-01 01:21:19.951'],
|
||||
['id' => 11, 'email' => 'martleonor@aol.com', 'is_active' => true, 'unsubscribe_token' => '816440d6-c7d5-4847-a50e-7ac621eb6f86', 'created_at' => '2025-07-01 07:11:02.288'],
|
||||
['id' => 12, 'email' => 'this1is3john@gmail.com', 'is_active' => true, 'unsubscribe_token' => 'd3b5b72e-11aa-400c-9e2c-92f315819b27', 'created_at' => '2025-07-01 12:22:58.44'],
|
||||
['id' => 13, 'email' => 'alexabauch@icloud.com', 'is_active' => true, 'unsubscribe_token' => 'f66410b0-3400-468e-87ee-34b84c40e35b', 'created_at' => '2025-07-03 04:16:47.928'],
|
||||
['id' => 14, 'email' => 'wsad.president@gmail.com', 'is_active' => true, 'unsubscribe_token' => '982a0119-ea37-4151-acb2-04c27802a8a4', 'created_at' => '2025-07-04 20:06:14.97'],
|
||||
['id' => 15, 'email' => 'deafwantstoknow@gmail.com', 'is_active' => true, 'unsubscribe_token' => '6c40ff30-1e7a-4c73-a188-d04055987b3f', 'created_at' => '2025-07-09 05:27:50.182'],
|
||||
['id' => 17, 'email' => 'sjthomp0615@gmail.com', 'is_active' => true, 'unsubscribe_token' => '00fe7ff3-b42b-4c95-8882-efe68d0970f0', 'created_at' => '2025-07-18 19:05:23.217'],
|
||||
['id' => 18, 'email' => 'eliza.kragh@gmail.com', 'is_active' => true, 'unsubscribe_token' => '9fe988b3-d317-4a01-bdf5-aed2895e17ba', 'created_at' => '2025-07-25 21:38:58.027'],
|
||||
['id' => 19, 'email' => 'harding.cara89@gmail.com', 'is_active' => true, 'unsubscribe_token' => '74018cc6-4c7a-43af-891e-4949d5925fca', 'created_at' => '2025-07-26 00:01:22.296'],
|
||||
['id' => 20, 'email' => 'rindelsd@gmail.com', 'is_active' => true, 'unsubscribe_token' => '01eb9061-8c20-4667-bd46-71e48e6dc384', 'created_at' => '2025-07-26 00:04:44.454'],
|
||||
['id' => 21, 'email' => 'kat_kariann@hotmail.com', 'is_active' => true, 'unsubscribe_token' => '25ea5299-03f0-49e2-b556-447215e6d05c', 'created_at' => '2025-07-26 12:15:14.048'],
|
||||
['id' => 22, 'email' => 'thejustinrold@gmail.com', 'is_active' => true, 'unsubscribe_token' => 'b13d4d6a-1b51-4ee1-9a77-d38115d51d0b', 'created_at' => '2025-07-26 23:37:15.978'],
|
||||
['id' => 23, 'email' => 'ritabrandborg@gmail.com', 'is_active' => true, 'unsubscribe_token' => 'a8fbc7d9-81ed-4047-bab1-8d304597d4dd', 'created_at' => '2025-07-28 12:37:30.323'],
|
||||
['id' => 24, 'email' => 'fullerkim777@icloud.com', 'is_active' => true, 'unsubscribe_token' => '4effbe07-04df-4371-87bf-15f14b90f90e', 'created_at' => '2025-07-28 22:46:53.302'],
|
||||
['id' => 16, 'email' => 'mike.crago@gmail.com', 'is_active' => false, 'unsubscribe_token' => 'd2db168b-7869-4340-8d7c-fded7fc357b8', 'created_at' => '2025-07-14 23:58:34.353'],
|
||||
];
|
||||
|
||||
✅ Done! Copy the arrays above into V1DataMigrationSeeder.php
|
||||
449
seeder_data_full.txt
Normal file
449
seeder_data_full.txt
Normal file
|
|
@ -0,0 +1,449 @@
|
|||
Reading SQL dump...
|
||||
Parsing multi-line INSERT statements...
|
||||
|
||||
Found:
|
||||
- 63 docket entry INSERT statements
|
||||
- 63 document INSERT statements
|
||||
- 28 subscription INSERT statements
|
||||
|
||||
Parsed successfully:
|
||||
- 63 docket entries
|
||||
- 63 documents
|
||||
- 28 subscriptions
|
||||
|
||||
================================================================================
|
||||
DOCKET ENTRIES ARRAY:
|
||||
================================================================================
|
||||
$entries = [
|
||||
['id' => 12, 'date' => '2025-06-06', 'summary' => 'Elizabeth Kragh swears under oath that the Montana Association of the Deaf cannot be on active military duty because it is a nonprofit corporation, not a person, and that MAD\'s registered agent Kirk Hash Jr. is Deaf and therefore ineligible for military service due to hearing requirements. This affidavit is required by federal law to ensure that people in the military are not unfairly treated in court cases, but since MAD is an organization and its agent is Deaf, military protections do not apply.', 'created_at' => '2025-06-25 22:25:16.605', 'updated_at' => '2025-06-25 22:49:54.761', 'notes' => '', 'title' => 'Affidavit of Military Service Check (ServiceMembers Civil Relief Act Compliance) (Filed By Kragh, Elizabeth on behalf of )'],
|
||||
['id' => 5, 'date' => '2025-05-07', 'summary' => 'Elizabeth Kragh is suing the Montana Association of the Deaf (MAD) for three ultra vires actions. First, MAD won\'t let her see meeting records even though Montana law says she has the right to see them. Second, MAD\'s leaders were elected by acclamation instead of written ballots like their rules require. Third, $888 is missing from money reports and the people who should watch the money admit they haven\'t been doing their job.', 'created_at' => '2025-06-25 22:13:26.291', 'updated_at' => '2025-06-25 22:49:54.727', 'notes' => '', 'title' => 'Complaint (Filed By Kragh, Elizabeth on behalf of )'],
|
||||
['id' => 8, 'date' => '2025-05-16', 'summary' => 'This document corrects and replaces the original certificate of service, confirming that Elizabeth Kragh properly delivered the lawsuit papers to the Montana Association of the Deaf through their registered agent Kirk Hash Jr. A professional process server from Equity Process Management served Kirk Hash Jr. on May 13, 2025, at the Partnership Health Center in Missoula, Montana.', 'created_at' => '2025-06-25 22:17:34.223', 'updated_at' => '2025-06-25 22:49:54.738', 'notes' => '', 'title' => 'Amended Certificate of Service (Filed By Kragh, Elizabeth on behalf of )'],
|
||||
['id' => 9, 'date' => '2025-05-14', 'summary' => 'This document proves that Elizabeth Kragh properly delivered the lawsuit papers to the Montana Association of the Deaf through their designated agent Kirk Hash Jr. A professional process server handed the legal documents to Kirk Hash Jr. on May 13, 2025, at the Partnership Health Center in Missoula, Montana.', 'created_at' => '2025-06-25 22:19:21.997', 'updated_at' => '2025-06-25 22:49:54.744', 'notes' => '', 'title' => 'Certificate of Service (Filed By Kragh, Elizabeth on behalf of )'],
|
||||
['id' => 10, 'date' => '2025-05-12', 'summary' => 'This is an official court document that notifies the Montana Association of the Deaf that Elizabeth Kragh has filed a lawsuit against them. The summons orders MAD to respond to the lawsuit within 21 days or the court will rule against them by default.', 'created_at' => '2025-06-25 22:21:22.374', 'updated_at' => '2025-06-25 22:49:54.75', 'notes' => '', 'title' => 'Summons Issued on Montana Association of the Deaf Inc. 05/12/2025'],
|
||||
['id' => 11, 'date' => '2025-06-05', 'summary' => 'The Montana Association of the Deaf calls Elizabeth Kragh\'s lawsuit "frivolous" and accuses her of "harassment" without providing evidence to support their legal defenses. Instead of addressing the specific legal violations Kragh raised, MAD focuses on personal attacks against her character and claims about her past behavior with their local chapter. MAD admits they required Kragh to sign a "zero-tolerance policy" to access meeting minutes but doesn\'t explain why this requirement is legal under Montana law.', 'created_at' => '2025-06-25 22:23:22.573', 'updated_at' => '2025-06-25 22:49:54.755', 'notes' => '', 'title' => 'Answer to Complaint (Filed By Montana Association of the Deaf Inc. on behalf of )'],
|
||||
['id' => 13, 'date' => '2025-06-06', 'summary' => ' Elizabeth Kragh swears under oath that MAD was properly served with the lawsuit papers on May 13, 2025, through their registered agent Kirk Hash Jr., giving them 21 days until June 3, 2025, to respond. She states that MAD failed to file any response, motion, or have any attorney appear on their behalf, making them in default and eligible for a default judgment.', 'created_at' => '2025-06-25 22:26:19.853', 'updated_at' => '2025-06-25 22:49:54.768', 'notes' => '', 'title' => 'Affidavit of Service and Non-Appearance (Filed By Kragh, Elizabeth on behalf of )'],
|
||||
['id' => 14, 'date' => '2025-06-06', 'summary' => 'This is a draft default judgment order that would rule in favor of Elizabeth Kragh if the Montana Association of the Deaf fails to respond to the lawsuit. The proposed order would find that MAD violated Montana law by refusing to provide meeting minutes, improperly elected officers by acclamation instead of written ballot, and failed in financial oversight with an unexplained $888.54 missing from reports. If signed by the judge, it would order MAD to provide all requested records, follow proper election procedures, give complete financial accounting, and pay for an independent auditor to examine their books.', 'created_at' => '2025-06-25 22:27:19.37', 'updated_at' => '2025-06-25 22:49:54.775', 'notes' => '', 'title' => 'Motion for Default Judgment (Filed By Kragh, Elizabeth on behalf of ) 278719 '],
|
||||
['id' => 16, 'date' => '2025-06-06', 'summary' => 'Elizabeth Kragh formally asks the court to rule in her favor because MAD failed to respond to her lawsuit within the required 21-day deadline that expired on June 3, 2025. She argues that MAD\'s silence legally admits to all her allegations about blocking records access, conducting improper elections, and financial oversight failures. Kragh requests the court enter default judgment and grant relief including immediate access to meeting minutes, proper financial reporting, and appointment of an independent auditor to examine MAD\'s financial records.', 'created_at' => '2025-06-25 22:29:11.492', 'updated_at' => '2025-06-25 22:49:54.791', 'notes' => '', 'title' => 'Proposed Order on Default Judgment 278719'],
|
||||
['id' => 17, 'date' => '2025-06-06', 'summary' => 'Elizabeth Kragh asks the court to immediately stop MAD from holding their scheduled June 12-14, 2025 conference because the current officers were improperly elected and lack proper authority to make decisions for the organization. She argues that allowing these ultra vires officers to conduct business meetings, make financial decisions, and hold elections at the conference would cause irreparable harm that cannot be fixed later. Kragh requests the court allow educational and social activities at the conference to continue but block all official business and governance activities until the legal issues are resolved.', 'created_at' => '2025-06-25 22:30:23.578', 'updated_at' => '2025-06-25 22:49:54.798', 'notes' => '', 'title' => 'Motion for Temporary Restraining Order (Filed By Kragh, Elizabeth on behalf of )'],
|
||||
['id' => 6, 'date' => '2025-05-07', 'summary' => 'The exhibits show the Montana Association of the Deaf\'s official bylaws for how the organization should operate. Email records show that when member Elizabeth Kragh asked for meeting minutes, MAD\'s secretary refused to give them to her and required her to sign a "zero-tolerance policy" first. Meeting minutes from 2023-2024 show the organization\'s activities, financial reports, and board decisions during the time period in question.', 'created_at' => '2025-06-25 22:15:24.183', 'updated_at' => '2025-09-05 19:52:01.437', 'notes' => '', 'title' => 'Complaint Exhibits'],
|
||||
['id' => 1, 'date' => '2025-05-07', 'summary' => 'Elizabeth Kragh swears under oath that she made four written requests for MAD meeting minutes but was denied access and told she must sign a "zero-tolerance policy" to get them, even though Montana law doesn\'t allow such conditions. She also states that MAD\'s officers were improperly elected by acclamation instead of written ballot as required by their bylaws, and that she witnessed financial problems including missing money and trustees admitting they failed to do their oversight duties.', 'created_at' => '2025-06-25 20:20:09.097', 'updated_at' => '2025-06-25 22:49:54.719', 'notes' => '', 'title' => 'Affidavit in Support of Complaint (Filed By Kragh, Elizabeth on behalf of )'],
|
||||
['id' => 19, 'date' => '2025-06-09', 'summary' => 'Elizabeth Kragh asks the court to throw out MAD\'s answer because Tyler Hansen, who is not a lawyer, illegally filed legal documents on behalf of the corporation, which violates Montana law requiring corporations to be represented by licensed attorneys. She argues that Hansen\'s unauthorized answer actually admits to all the violations she sued about, including blocking records access, conducting improper elections, and financial oversight failures. Kragh requests the court strike the invalid answer, find Hansen engaged in unauthorized practice of law, impose sanctions, and return MAD to default status for her pending motion for default judgment.
|
||||
', 'created_at' => '2025-06-25 22:37:54.713', 'updated_at' => '2025-06-25 22:49:54.812', 'notes' => '', 'title' => 'Motion to Strike Answer for Unauthorized Practice of Law Alternative Reply Brief: Defendant\'s Admissions Confirm Every Allegation (Filed By Kragh, Elizabeth on behalf of Kragh, Elizabeth )'],
|
||||
['id' => 20, 'date' => '2025-06-09', 'summary' => 'This is a draft court order that would strike Tyler Hansen\'s answer from the court record because he illegally practiced law by representing the Montana Association of the Deaf without a license, violating Montana law that requires corporations to have licensed attorneys. The proposed order would find Hansen engaged in unauthorized practice of law, prohibit him from filing any more legal documents, refer him to Montana authorities for investigation, and return MAD to default status. The order would also require Hansen to pay court costs and allow the case to proceed to consideration of Kragh\'s motion for default judgment.', 'created_at' => '2025-06-25 22:38:56.552', 'updated_at' => '2025-06-25 22:49:54.818', 'notes' => '', 'title' => 'Proposed Order Granting Motion to Strike Answer for Unauthorized Practice of Law'],
|
||||
['id' => 21, 'date' => '2025-06-09', 'summary' => ' Elizabeth Kragh asks the court to impose sanctions against Tyler Hansen for violating court rules when he filed an unauthorized answer that focused on personal attacks against her rather than addressing the legal issues in the case. She argues that Hansen\'s answer violated all four parts of Rule 11 by being filed for improper purposes, containing legally frivolous arguments, making factual claims without evidence, and providing inadequate denials of her allegations. Kragh requests the court prohibit Hansen from filing more legal documents without a lawyer, require him to take legal education courses, refer him for unauthorized practice investigation, and impose monetary penalties to deter similar misconduct.', 'created_at' => '2025-06-25 22:39:58.278', 'updated_at' => '2025-06-25 22:49:54.824', 'notes' => '', 'title' => 'Motion for Rule 11 Sanctions Against Tyler Hansen (Filed By Kragh, Elizabeth on behalf of Kragh, Elizabeth )'],
|
||||
['id' => 22, 'date' => '2025-06-09', 'summary' => 'This is a draft court order that would impose Rule 11 sanctions against Tyler Hansen for filing an unauthorized answer that violated court rules by containing personal attacks, legally frivolous arguments, and factual claims without evidence. The proposed sanctions include prohibiting Hansen from filing any more legal documents without a lawyer, requiring him to take a legal education course, referring him to authorities for unauthorized practice of law, and paying a monetary penalty to the court. The order would also require Hansen to notify all MAD board members of the court\'s restrictions and would make his admissions from the unauthorized answer binding for the rest of the lawsuit.', 'created_at' => '2025-06-25 22:40:54.24', 'updated_at' => '2025-06-25 22:49:54.83', 'notes' => '', 'title' => 'Proposed Order Granting Motion for Rule 11 Sanctions Against Tyler Hansen'],
|
||||
['id' => 23, 'date' => '2025-06-10', 'summary' => 'Judge Tara Elliott granted Elizabeth Kragh\'s motion to strike Tyler Hansen\'s unauthorized answer, ruling that Hansen illegally practiced law by representing the Montana Association of the Deaf without a license, which violates Montana law requiring corporations to have licensed attorneys. The court struck Hansen\'s answer from the record and gave MAD 45 days to hire a real lawyer and file a proper response that follows Montana law. Kragh won on her motion to strike while the court denied her other motions for default judgment, temporary restraining order, and sanctions, but her main legal victory established that MAD\'s defense was invalid and must be refiled through proper legal representation.', 'created_at' => '2025-06-25 22:41:49.607', 'updated_at' => '2025-06-25 22:49:54.836', 'notes' => '', 'title' => 'Order Denying Petitioner\'s Motion for Default Judgement, Motion for Temporary Restraining Order and Motion for Sanctions and Granting the Motion to Strike'],
|
||||
['id' => 24, 'date' => '2025-06-11', 'summary' => 'Elizabeth Kragh asks the court for a preliminary injunction to stop the Montana Association of the Deaf\'s ongoing violations while MAD searches for a lawyer, arguing that eight months of documented violations including records obstruction, ultra vires elections, and financial oversight failures demand immediate court action. She offers the court multiple options for relief, from full preliminary injunction to limited relief ensuring proper election procedures at MAD\'s upcoming June 12-14 conference, while acknowledging the procedural challenge that MAD currently lacks legal representation. Kragh emphasizes that MAD\'s current predicament flows directly from their own choices to violate laws and bylaws for eight months, then lose their unauthorized defense, making judicial intervention necessary to protect member rights and organizational integrity.', 'created_at' => '2025-06-25 22:42:41.797', 'updated_at' => '2025-06-25 22:49:54.844', 'notes' => '', 'title' => 'Motion for Preliminary Injunction (Filed By Kragh, Elizabeth on behalf of Kragh, Elizabeth )'],
|
||||
['id' => 25, 'date' => '2025-06-11', 'summary' => 'This is a draft court order that would grant Elizabeth Kragh\'s request for a preliminary injunction, requiring the Montana Association of the Deaf to immediately stop conducting elections by acclamation and use written ballots as required by their bylaws, provide all meeting minutes from June 2023 to present without unauthorized conditions, and deliver written financial reports explaining the missing $888.54. The proposed order would also prohibit MAD from making major organizational decisions or financial commitments beyond routine operations until the legal issues are resolved, and would require compliance within specific timeframes (10 days for records, 15 days for financial reports). The order includes enforcement provisions allowing contempt proceedings for violations and requires MAD to notify members about the court\'s requirements while prohibiting them from mischaracterizing the order\'s terms.', 'created_at' => '2025-06-25 22:43:26.377', 'updated_at' => '2025-06-25 22:49:54.85', 'notes' => '', 'title' => 'Proposed Order Granting Preliminary Injunction'],
|
||||
['id' => 15, 'date' => '2025-06-06', 'summary' => ' Elizabeth Kragh argues that MAD\'s failure to respond to her lawsuit within the required 21 days means the court should automatically rule in her favor on all three violations she alleged. She states that MAD\'s silence legally admits to blocking records access, conducting improper elections by acclamation, and failing to oversee nearly $900 in missing funds while trustees admitted they never checked the books. Kragh requests the court grant her motion for default judgment and order immediate relief including access to records, proper financial oversight, and an independent audit of MAD\'s finances.', 'created_at' => '2025-06-25 22:28:12.719', 'updated_at' => '2025-06-25 22:49:54.781', 'notes' => '', 'title' => 'Supporting Memorandum of Law in Support of Motion for Default Judgment (Filed By Kragh, Elizabeth on behalf of ) 278719 '],
|
||||
['id' => 18, 'date' => '2025-06-06', 'summary' => 'This is a draft temporary restraining order template that would stop the Montana Association of the Deaf from conducting official business at their June 12-14, 2025 conference if signed by the judge. The proposed order would prohibit MAD from holding business meetings, elections, and making financial decisions while allowing educational and social activities to continue. The document contains blank spaces for the judge to fill in specific dates, times, and security amounts if the order is granted.', 'created_at' => '2025-06-25 22:31:30.046', 'updated_at' => '2025-06-25 22:49:54.806', 'notes' => '', 'title' => 'Proposed Temporary Restraining Order'],
|
||||
['id' => 27, 'date' => '2025-07-24', 'summary' => 'On July 24, 2025, MAD responded to the lawsuit through their lawyer, Peter Lacny. Here\'s what their response says in simple terms:
|
||||
|
||||
MAD\'s response goes through each point in the original lawsuit and either agrees with it, disagrees with it, or says they don\'t have enough information to know. This is the standard way organizations respond to lawsuits.
|
||||
|
||||
MAD gives several reasons why they think the lawsuit should be dismissed. They say the lawsuit doesn\'t properly explain what they did wrong and that too much time has passed to bring some claims. They argue that some issues have already been fixed and that the person suing them has also done wrong things. MAD claims their board made reasonable decisions and that the person suing gave up certain rights. They insist they followed all the laws and that no real harm was caused. They also point out that the person resigned from positions and that courts shouldn\'t get involved in organization decisions.
|
||||
|
||||
In addition to defending themselves, MAD is also suing back. They claim that the person has said untrue things about MAD, interfered with how MAD runs, and used MAD\'s name when working with other organizations. These counter-claims ask the court to rule in MAD\'s favor and stop the person from continuing these actions.', 'created_at' => '2025-07-25 21:37:25.45', 'updated_at' => '2025-07-28 03:01:10.602', 'notes' => '', 'title' => 'Answer (Filed By Lacny, Peter on behalf of Montana Association of the Deaf Inc. )'],
|
||||
['id' => 26, 'date' => '2025-07-24', 'summary' => 'On July 24, 2025, Peter F. Lacny, a lawyer from the firm McFarland Molloy Lacny & Duerk, filed a Notice of Appearance with the court. This is a simple document that officially tells the court that Peter Lacny will be representing MAD in this lawsuit. Before this notice was filed, MAD did not have a lawyer officially recognized by the court. This document is important because it means all future court papers and communications about the case should now go to Peter Lacny instead of directly to MAD. It also shows that MAD has hired professional legal representation to defend against the lawsuit.', 'created_at' => '2025-07-25 21:34:48.438', 'updated_at' => '2025-07-28 03:01:32.129', 'notes' => '', 'title' => 'Notice of Appearance (Filed By Lacny, Peter on behalf of Montana Association of the Deaf Inc. )'],
|
||||
['id' => 36, 'date' => '2025-08-14', 'summary' => 'On August 12, 2025, Elizabeth Kragh filed a notice informing the court that she served discovery requests on MAD.
|
||||
|
||||
What happened:
|
||||
The Plaintiff sent three types of legal requests to MAD\'s attorney:
|
||||
|
||||
- Document production requests (asking for specific records)
|
||||
- Interrogatories (written questions requiring sworn answers)
|
||||
- Requests for admission (asking MAD to confirm or deny certain facts)
|
||||
|
||||
What this means:
|
||||
Discovery is the standard legal process where both parties exchange information and documents before trial. Both sides can request evidence from each other.
|
||||
|
||||
Timeline:
|
||||
MAD has 30 days to respond to these requests under court rules.
|
||||
|
||||
Status:
|
||||
The case has moved into the discovery phase, where both parties will gather and exchange information relevant to the lawsuit.', 'created_at' => '2025-08-22 13:48:17.057', 'updated_at' => '2025-08-24 15:17:56.236', 'notes' => '', 'title' => 'Notice of Service of Discovery Requests (Filed By Kragh, Elizabeth on behalf of Kragh, Elizabeth )'],
|
||||
['id' => 31, 'date' => '2025-08-08', 'summary' => 'Elizabeth Kragh has asked the court to pause or limit MAD\'s discovery requests until the judge decides whether to dismiss MAD\'s counterclaims.
|
||||
|
||||
What Happened: On August 7, MAD sent Kragh 25 discovery requests asking for documents, answers to questions, and admissions. Many requests relate to MAD\'s counterclaims, which Kragh is trying to get dismissed.
|
||||
|
||||
Kragh\'s Request: She wants the court to either:
|
||||
|
||||
- Stop all discovery related to MAD\'s counterclaims until the dismissal motion is decided
|
||||
- Limit discovery to only her original lawsuit claims
|
||||
- Extend her response deadline from September 6 to 30 days after the court rules
|
||||
|
||||
Why She Filed This:
|
||||
|
||||
- Many discovery requests seem designed to harass rather than find relevant information
|
||||
- Requests ask about personal communications, social media posts, and unrelated organizations
|
||||
- As a pro se plaintiff, responding is invasive and time-consuming
|
||||
- If MAD\'s counterclaims get dismissed, this discovery becomes pointless
|
||||
|
||||
Privacy Concerns: Some requests violate Montana\'s strong constitutional privacy protections by seeking personal information without good reason.
|
||||
|
||||
Legal Basis:
|
||||
Montana courts can issue protective orders to prevent "undue burden" and have authority to pause discovery when claims might be dismissed.
|
||||
|
||||
Timing:
|
||||
Kragh requested expedited consideration since her discovery responses are due September 6.
|
||||
', 'created_at' => '2025-08-11 20:04:58.042', 'updated_at' => '2025-08-11 20:04:58.042', 'notes' => '', 'title' => 'Plaintiff\'s Motion for Protective Order Regarding Defendant\'s First Combined Discovery Requests (Filed By Kragh, Elizabeth on behalf of Kragh, Elizabeth )'],
|
||||
['id' => 33, 'date' => '2025-08-07', 'summary' => 'Defendant MAD\'s counsel served discovery requests upon Plaintiff Elizabeth Kragh in connection with their filed counterclaims and subsequently filed a notice of service with the court clerk. This represents a standard procedural step in the litigation process where parties seek relevant information from each other to support their respective claims and defenses.', 'created_at' => '2025-08-12 16:45:07.182', 'updated_at' => '2025-09-05 19:54:07.288', 'notes' => '', 'title' => 'Notice of Service'],
|
||||
['id' => 29, 'date' => '2025-08-08', 'summary' => 'Why This Was Filed:
|
||||
After Elizabeth Kragh sued MAD over governance violations, MAD responded with three counterclaims against her. Kragh filed this motion asking the court to dismiss those counterclaims because they don\'t meet basic legal requirements.
|
||||
|
||||
MAD\'s Counterclaims: MAD wants the court to (1) declare they followed proper procedures, (2) stop Kragh from alleged interference, and (3) make Kragh pay their attorney fees.
|
||||
|
||||
Kragh\'s Arguments:
|
||||
Montana law requires legal claims to include specific facts, not vague accusations. MAD\'s counterclaims fail this test by:
|
||||
|
||||
Claiming Kragh made "false statements" without saying what statements or when
|
||||
- Seeking to stop "interference" without describing specific conduct
|
||||
- Requesting attorney fees without factual basis for bad faith claims
|
||||
- Filing ten defenses that are just legal labels with no supporting details
|
||||
|
||||
Legal Standard: Montana requires organizations seeking court orders to identify specific injured members by name and address, which MAD didn\'t do.
|
||||
|
||||
Kragh\'s Position:
|
||||
The counterclaims appear designed to justify broad discovery requests rather than address legitimate legal issues, potentially turning the focus away from MAD\'s documented governance problems.
|
||||
|
||||
Outcome:
|
||||
The court will decide whether to dismiss the counterclaims.', 'created_at' => '2025-08-11 19:46:51.167', 'updated_at' => '2025-08-11 19:46:51.167', 'notes' => '', 'title' => 'Motion to Dismiss Counterclaims (Filed By Kragh, Elizabeth on behalf of Kragh, Elizabeth )'],
|
||||
['id' => 30, 'date' => '2025-08-08', 'summary' => 'Elizabeth Kragh has written a draft court order that Judge Elliott could sign if the judge agrees to dismiss MAD\'s counterclaims.
|
||||
|
||||
What MAD Filed:
|
||||
Three counterclaims asking the court to say they followed the rules, stop Kragh from interfering, and make her pay their lawyer bills.
|
||||
|
||||
The Problem:
|
||||
MAD\'s counterclaims don\'t include specific facts. They make vague accusations like "Kragh made false statements" but don\'t say what statements, when, or to whom. Montana law requires enough details so people know what they\'re accused of.
|
||||
|
||||
What the Order Would Do:
|
||||
|
||||
- Throw out all of MAD\'s counterclaims
|
||||
- Remove their ten defenses
|
||||
- Give MAD 20 days to try again with proper facts
|
||||
|
||||
Key Finding:
|
||||
The order notes that MAD\'s filings appear designed to force invasive legal discovery rather than address real issues.
|
||||
|
||||
"Without Prejudice" Dismissal: This means MAD gets another chance. They can refile within 20 days if they include specific dates, examples, and facts. For court orders, they must also name actual injured members as Montana law requires.
|
||||
|
||||
Bottom Line:
|
||||
The proposed order would require MAD to either provide real evidence for their claims or drop them, while giving them one fair opportunity to file properly.
|
||||
', 'created_at' => '2025-08-11 19:59:25.733', 'updated_at' => '2025-08-11 19:59:25.733', 'notes' => '', 'title' => 'Proposed Order Granting Plaintiff\'s Motion to Dismiss Counterclaims and Strike Affirmative Defenses'],
|
||||
['id' => 32, 'date' => '2025-08-08', 'summary' => 'Elizabeth Kragh has written a draft court order that Judge Elliott could sign to protect her from MAD\'s discovery requests.
|
||||
|
||||
The Situation:
|
||||
MAD sent Kragh 25 discovery requests asking for documents and information. Many requests relate to MAD\'s counterclaims, which Kragh wants dismissed.
|
||||
|
||||
What the Proposed Order Does:
|
||||
|
||||
- Stops discovery about MAD\'s counterclaims until the court decides whether to dismiss them
|
||||
- Allows MAD to only request information about Kragh\'s original claims
|
||||
- Extends Kragh\'s response deadline to 30 days after the dismissal decision
|
||||
- Orders both parties to meet within 14 days after the court rules
|
||||
|
||||
Why This Would Be Granted:
|
||||
The order finds that many discovery requests would burden Kragh unfairly, especially since the counterclaims might be dismissed anyway. Some requests seek personal information that violates Montana\'s privacy protections without good reason.
|
||||
|
||||
Key Considerations:
|
||||
|
||||
- Kragh represents herself and has fewer resources than MAD\'s legal team
|
||||
- Responding to discovery about invalid claims wastes time and court resources
|
||||
- Montana law protects people from invasive discovery requests
|
||||
|
||||
Result:
|
||||
If the judge signs this order, Kragh would be protected from having to respond to most of MAD\'s discovery requests until the court decides whether MAD\'s counterclaims are legally valid.
|
||||
', 'created_at' => '2025-08-11 20:10:03.902', 'updated_at' => '2025-08-11 20:10:03.902', 'notes' => '', 'title' => 'Proposed Order Plaintiff\'s Motion for Protective Order Regarding Defendant\'s First Combined Discovery Requests'],
|
||||
['id' => 41, 'date' => '2025-08-18', 'summary' => 'On August 18, 2025, Elizabeth Kragh filed a motion asking the court to withdraw her request for emergency relief against the Montana Association of the Deaf (MAD).
|
||||
|
||||
Background:
|
||||
In June, the Plaintiff sought urgent intervention before MAD\'s biennial conference to prevent election violations. She was concerned MAD would repeat 2023\'s improper elections, when officers were chosen "by acclamation" instead of using written ballots as required by MAD\'s bylaws.
|
||||
|
||||
Reason for withdrawal:
|
||||
The conference concluded, making emergency relief unnecessary.
|
||||
|
||||
Impact:
|
||||
This withdrawal doesn\'t affect Kragh\'s main lawsuit. The Plaintiff continues pursuing claims about MAD\'s refusal to provide meeting minutes and financial records, improperly elected officers, and financial oversight failures including an unexplained $888 discrepancy.
|
||||
|
||||
Next steps:
|
||||
Elizabeth Kragh can address records access through normal discovery processes while pursuing MAD\'s governance violations and transparency failures.
|
||||
', 'created_at' => '2025-08-24 15:20:26.268', 'updated_at' => '2025-08-24 15:21:17.99', 'notes' => '', 'title' => 'Motion to Withdraw Preliminary Injunction Motion (Filed By Kragh, Elizabeth on behalf of Kragh, Elizabeth )'],
|
||||
['id' => 42, 'date' => '2025-08-18', 'summary' => 'On August 18, 2025, Elizabeth Kragh filed a supplemental notice regarding a procedural requirement in two previous court filings.
|
||||
|
||||
Background:
|
||||
The Plaintiff had filed two motions in August:
|
||||
|
||||
- Motion to Dismiss MAD\'s Counterclaims
|
||||
- Motion for Protective Order regarding discovery requests
|
||||
|
||||
The issue:
|
||||
Local court rules require parties to contact opposing counsel before filing motions and inform the court whether the other side objects. This step was initially omitted from both filings.
|
||||
|
||||
Resolution:
|
||||
After learning of the requirement, Kragh contacted MAD\'s attorney, Peter Lacny, on August 18th. Lacny confirmed that MAD opposes both motions. The Plaintiff then filed this supplemental notice to inform the court of these positions.
|
||||
|
||||
Outcome:
|
||||
The court now has the required information about both parties\' positions on the pending motions. Both motions will proceed as contested matters, with MAD opposing the requests for dismissal and protective order.', 'created_at' => '2025-08-24 15:22:17.885', 'updated_at' => '2025-08-24 15:23:09.485', 'notes' => '', 'title' => 'Supplemental Notice Regarding Rule 3(G)(2) Compliance (Filed By Kragh, Elizabeth on behalf of Kragh, Elizabeth )'],
|
||||
['id' => 43, 'date' => '2025-08-20', 'summary' => 'This is a court filing in a lawsuit between Elizabeth Kragh and the Montana Association of the Deaf. The defendant\'s lawyer is asking the judge to approve a proposed timeline for how the case will proceed. This timeline document (called a "scheduling order") sets deadlines for various steps in the lawsuit, such as when evidence must be shared, when depositions can occur, and when the trial might happen. Both sides have agreed to this proposed schedule - the plaintiff has no objections. The lawyer is formally requesting that the judge review and officially adopt this agreed-upon timeline for the case.', 'created_at' => '2025-08-26 21:16:38.871', 'updated_at' => '2025-08-26 21:17:45.65', 'notes' => '', 'title' => 'Notice of Filing Proposed Scheduling Order (Filed By Lacny, Peter on behalf of Montana Association of the Deaf Inc. )'],
|
||||
['id' => 54, 'date' => '2025-10-06', 'summary' => 'Montana Association of the Deaf filed a legal motion asking the court to rule in their favor without a trial in a lawsuit brought by Elizabeth Kragh. They claim there are no factual disputes requiring a jury trial.', 'created_at' => '2025-10-08 18:22:12.518', 'updated_at' => '2025-10-08 18:22:12.518', 'notes' => '', 'title' => 'Defendant\'s Motion for Summary Judgment (Filed By Lacny, Peter on behalf of Montana Association of the Deaf Inc. )'],
|
||||
['id' => 44, 'date' => '2025-08-20', 'summary' => 'The court may establish a timeline for Elizabeth Kragh\'s lawsuit against the Montana Association of the Deaf that runs from now through June 2026, providing Ms. Kragh with nearly a full year to gather evidence, identify expert witnesses, and build her case. During this period, both parties may engage in discovery—the process of sharing relevant documents and information—with all evidence collection completed by March 2026 and final preparations finished by April 2026. The court may prioritize resolution by requiring a settlement conference by June 30, 2026, where a neutral mediator will help both sides explore potential agreements that could address Ms. Kragh\'s concerns without the need for a lengthy trial. If no settlement is reached, the case will proceed to trial with dates set after the conference concludes. Both parties have agreed to this schedule, and the court has emphasized that all information requests must be answered fairly and completely, ensuring Ms. Kragh has access to the evidence needed to present her case effectively.', 'created_at' => '2025-08-26 21:18:24.803', 'updated_at' => '2025-08-26 21:19:21.805', 'notes' => '', 'title' => 'Proposed Scheduling Order'],
|
||||
['id' => 46, 'date' => '2025-08-22', 'summary' => 'Elizabeth Kragh asked the court to pause discovery (the process where both sides share evidence) until her motion to dismiss MAD\'s counterclaims is decided. MAD opposes this request.
|
||||
|
||||
MAD argues that Kragh didn\'t follow proper procedure by failing to discuss the issue with them before asking the court for protection. They contend that most of their 25 discovery requests focus on Kragh\'s own allegations against MAD, not their counterclaims against her.
|
||||
|
||||
The discovery requests (attached as Exhibit A to MAD\'s response) ask Kragh to identify witnesses, provide documents supporting her claims about improper elections and financial oversight, detail her damages, and disclose communications with third parties about the lawsuit. MAD also seeks admissions about specific incidents, including whether Kragh filed a police report against a MAD treasurer and refused to sign a policy document.
|
||||
|
||||
MAD acknowledges Kragh is representing herself without a lawyer but argues their requests are standard for litigation. They offer accommodations like accepting responses in stages and granting time extensions.
|
||||
|
||||
MAD maintains that Montana\'s discovery rules are broad and allow information gathering on counterclaims, impeachment evidence, and credibility issues. They argue their counterclaims arise from the same facts as Kragh\'s claims, justifying simultaneous discovery.
|
||||
', 'created_at' => '2025-08-26 21:36:19.767', 'updated_at' => '2025-08-26 21:37:24.678', 'notes' => '', 'title' => 'Defendant\'s Response to Plaintiff\'s Motion for a Protective Order (Filed By Lacny, Peter on behalf of Montana Association of the Deaf Inc. )'],
|
||||
['id' => 47, 'date' => '2025-08-25', 'summary' => 'Judge Tara Elliott established a timeline for the lawsuit between Kragh and MAD. The order sets deadlines for when both sides must complete evidence gathering (discovery), identify expert witnesses, exchange exhibits, and file major legal motions. The court emphasizes that all parties must respond fairly and accurately to discovery requests or face potential sanctions. The schedule includes mandatory settlement conferences to encourage resolution without trial. If the case doesn\'t settle, it will proceed to trial scheduling. Both parties agreed to this timeline.', 'created_at' => '2025-08-31 19:04:08.01', 'updated_at' => '2025-08-31 19:04:59.313', 'notes' => '', 'title' => 'Scheduling Order'],
|
||||
['id' => 72, 'date' => '2025-10-29', 'summary' => 'This is the court\'s electronic filing receipt confirming that Judge Tara Elliott granted Plaintiff Elizabeth Kragh\'s motion to extend time on October 29, 2025. The receipt shows the order was electronically signed at 8:56 AM by Judge Elliott. Like the earlier order granting the motion to strike, only the court\'s filing stamp and electronic signature are present in this PDF. The filing confirms that Plaintiff Elizabeth Kragh\'s request for additional time (extending her reply brief deadline from November 3 to November 17, 2025) was approved by the judge, as requested in her motion filed October 28, 2025.', 'created_at' => '2025-11-09 23:40:37.164', 'updated_at' => '2025-11-13 20:30:00.763', 'notes' => '', 'title' => 'Order Granting Motion to Extend Time For Filing Reply Briefs'],
|
||||
['id' => 71, 'date' => '2025-10-28', 'summary' => 'This motion requests more time to file reply briefs in response to the Montana Association of the Deaf\'s responses filed October 24, 2025. Under court rules, Plaintiff Elizabeth Kragh\'s replies were originally due November 3, 2025 (ten days after receiving MAD\'s responses). However, Plaintiff Kragh is on a business trip from October 28 through November 2, 2025, and doesn\'t have access to her case files and legal research materials. She asks for a two-week extension, making the new deadline November 17, 2025. Plaintiff Kragh contacted MAD\'s attorney who confirmed they don\'t object to the extension. Since both sides agree and the delay won\'t harm either party, such motions are typically granted routinely by judges.', 'created_at' => '2025-11-09 23:39:13.429', 'updated_at' => '2025-11-13 20:30:30.535', 'notes' => '', 'title' => 'Motion to Extend Time for Filing Reply Briefs (Filed By Kragh, Elizabeth on behalf of Kragh, Elizabeth )'],
|
||||
['id' => 48, 'date' => '2025-08-29', 'summary' => 'MAD\'s lawyers are defending against Kragh\'s attempt to throw out their legal claims and defenses. They argue that Montana courts use very lenient standards for legal pleadings - requiring only a "short and plain statement" rather than detailed facts.
|
||||
|
||||
MAD contends their counterclaims are "compulsory," meaning they must be filed because they arise from the same disputes Kragh raised. They claim they don\'t need to provide specific facts because their legal documents reference all the allegations from Kragh\'s original complaint.
|
||||
|
||||
Regarding the requirement to name specific injured members, MAD argues this law only applies to organizations that start lawsuits, not defendants responding to being sued. They also claim they\'re only seeking general protection for the organization, not damages for individual members.
|
||||
|
||||
MAD\'s position is essentially: "It\'s too early to dismiss our claims - let us gather evidence first through the discovery process, then decide if our case has merit." They request that if the judge finds problems with their pleadings, they should be allowed to rewrite them rather than having them dismissed entirely.
|
||||
', 'created_at' => '2025-09-05 02:24:08.135', 'updated_at' => '2025-09-05 02:25:02.604', 'notes' => '', 'title' => 'Defendant\'s Response to Plaintiff\'s Motion to Dismiss and Strike (Filed By Lacny, Peter on behalf of Montana Association of the Deaf Inc. )'],
|
||||
['id' => 28, 'date' => '2025-07-25', 'summary' => 'Lawsuit Schedule: What This Court Filing Means-
|
||||
|
||||
What Happened:
|
||||
The judge created a timeline for Elizabeth Kragh\'s case against the Montana Association of the Deaf. This protects the plaintiff\'s rights and keeps the case moving forward.
|
||||
|
||||
Step-by-Step Process:
|
||||
|
||||
Step 1 (Next 30 Days):
|
||||
Elizabeth Kragh must email MAD\'s lawyer (Peter Lacny) to agree on specific dates for all deadlines. Since she\'s representing herself (pro se), she\'ll communicate directly with opposing counsel via email and submit the agreed schedule to court.
|
||||
|
||||
Step 2 (7 Months):
|
||||
Discovery phase - Kragh can demand documents, emails, and information from MAD. They must respond honestly. Kragh also has to answer MAD\'s requests fairly.
|
||||
|
||||
Step 3:
|
||||
Both sides identify expert witnesses who can testify about technical issues in the case.
|
||||
|
||||
Step 4:
|
||||
Mandatory settlement meetings - first Kragh meets directly with MAD\'s lawyer, then both parties try negotiating with a neutral court-appointed person.
|
||||
|
||||
Step 5: If no settlement, they prepare for trial with final witness lists and evidence.
|
||||
|
||||
Email Communication with MAD\'s Lawyer:
|
||||
Since Kragh is pro se, she emails Peter Lacny directly. All correspondence should be professional and documented via email. She must coordinate scheduling, exchange information, and handle all legal discussions herself through email communication.
|
||||
|
||||
Key Point:
|
||||
Every deadline matters. This schedule ensures MAD can\'t delay the case and guarantees Kragh gets access to information needed to prove her claims.
|
||||
', 'created_at' => '2025-08-05 22:23:29.461', 'updated_at' => '2025-09-05 19:53:52.584', 'notes' => '', 'title' => 'Rule 16(B), M.R.CIV.P. Order'],
|
||||
['id' => 49, 'date' => '2025-09-03', 'summary' => 'Elizabeth Kragh filed this reply brief defending her request to dismiss counterclaims made by the Montana Association of the Deaf (MAD) in their ongoing lawsuit. Kragh originally sued MAD for violating Montana laws by denying her access to organizational records, conducting improper elections, and mismanaging finances. Instead of simply defending themselves, MAD filed counterclaims against Kragh, essentially trying to sue her back. In this reply brief, Kragh argues that MAD\'s counterclaims are legally flawed "empty labels" without specific facts, pointing out that MAD contradicted themselves by admitting to the very conduct they claim was legal. She notes that MAD\'s own lawyer agreed to delay evidence gathering until the court rules on her dismissal motion, which she argues shows the counterclaims lack substance. Kragh contends that under Montana law, MAD\'s litigation-based counterclaims should be filed as a separate lawsuit rather than mixed with this case, and that MAD is using weak counterclaims as a fishing expedition to avoid accountability for governance violations.
|
||||
', 'created_at' => '2025-09-05 22:34:36.922', 'updated_at' => '2025-09-05 22:34:36.922', 'notes' => '', 'title' => 'Reply Brief in Support of Plaintiff\'s Motion to Dismiss Counterclaims and Strike Affirmative Defenses (Filed By Kragh, Elizabeth on behalf of Kragh, Elizabeth )'],
|
||||
['id' => 50, 'date' => '2025-09-03', 'summary' => 'Elizabeth Kragh filed this reply brief defending her request for a protective order to limit discovery demands made by the Montana Association of the Deaf (MAD) in their ongoing lawsuit. Discovery is the legal process where each side can demand documents, information, and answers from the other party before trial. Kragh argues that MAD\'s discovery requests are excessive and inappropriate because MAD has already admitted to the key violations in their legal filings, making extensive information-gathering unnecessary. She contends that six specific requests relate to MAD\'s weak counterclaims rather than her original lawsuit, and several other requests are overly broad, potentially requiring her to identify thousands of people who saw her social media posts about the case. Kragh points out that MAD\'s own lawyer acknowledged that dismissing the counterclaims would reduce the scope of discovery needed. She argues that forcing her, as a person representing herself in court, to respond to invasive requests about her private communications constitutes harassment rather than legitimate evidence-gathering, especially when MAD has already admitted to the conduct she\'s challenging.', 'created_at' => '2025-09-05 22:35:28.191', 'updated_at' => '2025-09-05 22:35:28.191', 'notes' => '', 'title' => 'Reply Brief in Support of Plaintiff\'s Motion for Protective Order (Filed By Kragh, Elizabeth on behalf of Kragh, Elizabeth )'],
|
||||
['id' => 51, 'date' => '2025-09-08', 'summary' => 'This is a legal notice filed on September 8, 2025, informing the court that Elizabeth Kragh (the person suing) has responded to discovery requests from Montana Association of the Deaf (MAD). Discovery is when each side asks the other for information and documents related to the case. Kragh answered 9 questions, responded to 7 requests for documents, admitted or denied 9 statements, and provided 5 exhibits as evidence. She sent these responses to MAD\'s lawyers by email.', 'created_at' => '2025-09-11 03:13:29.717', 'updated_at' => '2025-09-11 03:13:29.717', 'notes' => '', 'title' => 'Notice of Service of Discovery Requests (Filed By Kragh, Elizabeth on behalf of Kragh, Elizabeth )'],
|
||||
['id' => 52, 'date' => '2025-09-15', 'summary' => 'In lawsuits, both sides can request information from each other through a process called "discovery" - asking questions, requesting documents, and seeking admissions of facts. This notice simply informs the court and the plaintiff (Elizabeth Kragh) that the defendant (Montana Association of the Deaf) has completed and sent their responses to the plaintiff\'s discovery requests via email on September 15, 2025.
|
||||
', 'created_at' => '2025-09-22 03:07:47.689', 'updated_at' => '2025-09-22 03:07:47.689', 'notes' => '', 'title' => 'Notice of Service of Discovery Responses (Filed By Lacny, Peter on behalf of Montana Association of the Deaf Inc. )'],
|
||||
['id' => 53, 'date' => '2025-09-22', 'summary' => 'On September 22, 2025, Judge Tara Elliott ruled on Elizabeth Kragh\'s strategic motions in her lawsuit against the Montana Association of the Deaf (MAD).
|
||||
|
||||
Kragh had challenged MAD\'s counterclaims as legally insufficient, arguing they contained only vague accusations without specific supporting facts. She also sought to limit MAD\'s broad discovery requests for personal information.
|
||||
|
||||
While the court denied Kragh\'s motions, allowing MAD\'s counterclaims to proceed under Montana\'s liberal pleading standards, the ruling contained a significant strategic victory for Kragh. The court notably refused to grant MAD\'s request for permission to amend their counterclaims, forcing MAD to defend their original vague allegations without the opportunity to strengthen them with better factual support.
|
||||
|
||||
This outcome benefits Kragh\'s position: her substantive claims about MAD\'s governance violations remain fully intact and will proceed to trial, while MAD is now locked into defending poorly-drafted counterclaims they cannot improve. The case moves forward to discovery, where Kragh can build her evidence while MAD remains constrained by their inadequate pleadings.', 'created_at' => '2025-09-27 23:16:16.988', 'updated_at' => '2025-09-27 23:16:16.988', 'notes' => '', 'title' => 'Order'],
|
||||
['id' => 55, 'date' => '2025-10-06', 'summary' => 'Montana Association of the Deaf filed a detailed legal brief explaining why they believe the court should rule in their favor without a trial. The brief addresses three claims made by Elizabeth Kragh.
|
||||
|
||||
First, regarding access to meeting minutes, MAD argues this claim is now unnecessary because they provided all requested minutes during the legal discovery process in September 2025.
|
||||
|
||||
Second, concerning the 2023 election conducted by acclamation rather than written ballot as required by bylaws, MAD acknowledges this occurred but argues it was intentional as a custom and not mandatory. They claim Kragh attended the meeting without objecting and waited nearly two years to raise concerns. MAD also notes they conducted proper elections in 2025.
|
||||
|
||||
Third, regarding financial oversight concerns, MAD provided comprehensive financial documentation accounting for all funds, including the disputed $888.54. They explain this amount represented documented income properly added to their general fund, and what appeared as a discrepancy was a corrected reporting error.', 'created_at' => '2025-10-08 18:23:51.638', 'updated_at' => '2025-10-08 18:23:51.638', 'notes' => '', 'title' => 'Brief In Support of Defendant\'s Motion for Summary Judgment (Filed By Lacny, Peter on behalf of Montana Association of the Deaf Inc. )'],
|
||||
['id' => 56, 'date' => '2025-10-06', 'summary' => 'Attorney Peter Lacny filed a sworn legal statement on behalf of Montana Association of the Deaf on October 4, 2025. This declaration serves as proof to support MAD\'s request that the court rule in their favor without a trial.
|
||||
|
||||
The declaration contains nine numbered paragraphs, each referencing specific documents attached as exhibits. These exhibits include copies of meeting minutes that MAD provided to plaintiff Kragh during the legal discovery process, minutes from the June 2023 meeting where the disputed election occurred, Kragh\'s written responses to legal questions, and comprehensive financial records.
|
||||
|
||||
The declaration specifically references documents showing that MAD provided all requested meeting minutes, held proper elections in 2025, and provided detailed financial documentation including an explanation of the disputed $888.54 amount. As a sworn statement, the declaration carries legal weight and establishes the factual foundation that MAD believes supports their position in the case.', 'created_at' => '2025-10-08 18:24:58.126', 'updated_at' => '2025-10-08 18:24:58.126', 'notes' => '', 'title' => 'Declaration of Peter Lacny in Support of Defendant\'s Motion for Summary Judgment (Filed By Lacny, Peter on behalf of Montana Association of the Deaf Inc. )'],
|
||||
['id' => 57, 'date' => '2025-10-07', 'summary' => 'Plaintiff Kragh filed a motion asking the court to compel Montana Association of the Deaf to produce evidence they admit exists but refuse to provide. The dispute centers on three categories of materials: video recordings of 15 board meetings MAD created when recording from January 2023 through February 2025, internal communications among officers regarding governance decisions and policy development, and a complete ten-year history of bylaw amendments.
|
||||
|
||||
Kragh attempted to resolve the matter through required pre-litigation discussions, but MAD maintained their objections as these evidences are irrelevant. She argues the materials are directly relevant to her claims about records access violations, improper elections, and financial oversight failures. Notably, MAD filed their motion for summary judgment on October 4, 2025, just three days before Kragh filed this compel motion.
|
||||
|
||||
The timing raises procedural concerns about seeking case dismissal while withholding potentially crucial evidence. Kragh emphasizes that for ASL communications, video recordings preserve important contextual information that written summaries cannot capture, making their production particularly important for determining what actually occurred during board discussions.
|
||||
', 'created_at' => '2025-10-08 18:42:25.13', 'updated_at' => '2025-10-08 18:42:25.13', 'notes' => '', 'title' => 'Motion to Compel Discovery (Filed By Kragh, Elizabeth on behalf of Kragh, Elizabeth )'],
|
||||
['id' => 58, 'date' => '2025-10-07', 'summary' => 'The exhibits filing contains the supporting documentation for plaintiff Kragh\'s motion to compel discovery. This collection of evidence demonstrates her good faith efforts to obtain information from Montana Association of the Deaf before asking the court to intervene.
|
||||
|
||||
The documents show a clear pattern: Kragh repeatedly requested specific materials through proper legal channels, MAD acknowledged possessing them, but then refused to provide them. Most notably, MAD admitted they recorded 15 board meetings and store them on the president\'s laptop, yet claimed these recordings aren\'t relevant or would be too burdensome to produce.
|
||||
|
||||
The exhibits include email exchanges where Kragh methodically identified missing items and legal deficiencies in MAD\'s responses. MAD\'s attorney maintained blanket objections despite Kragh\'s reasonable requests for clarification and compromise. The collection also includes the brief November 2024 meeting minutes showing the controversial zero-tolerance policy was adopted in just 17 minutes, highlighting why the video recordings could reveal important details not captured in written summaries.
|
||||
', 'created_at' => '2025-10-08 18:43:36.204', 'updated_at' => '2025-10-08 18:43:36.204', 'notes' => '', 'title' => 'Exhibits A-H- Attachment to Doc #40 (Filed By Kragh, Elizabeth on behalf of Kragh, Elizabeth )'],
|
||||
['id' => 59, 'date' => '2025-10-09', 'summary' => 'This is plaintiff Kragh\'s proposed court order - what she\'s asking the judge to sign after filing a motion to compel discovery against the Montana Association of the Deaf. The court hasn\'t ruled on it yet.
|
||||
|
||||
Kragh is requesting the judge to order the nonprofit organization to turn over:
|
||||
|
||||
- Video recordings of 15 board meetings from 2023-2025
|
||||
- Internal emails and communications about her document requests, their zero-tolerance policy, election procedures, and a financial discrepancy of $888.54
|
||||
- Complete history of changes to their bylaws since 2015
|
||||
|
||||
In her proposed order, Kragh argues that she properly followed legal procedures by trying to work things out beforehand, and that the organization\'s reasons for refusing were too vague. She claims the documents are relevant to her case about alleged violations of nonprofit law.
|
||||
|
||||
If the judge signs this order, the organization would have 14 days to comply or face potential sanctions. This represents Kragh\'s legal strategy to access information she believes she\'s entitled to as a member of the organization', 'created_at' => '2025-10-10 19:18:32.056', 'updated_at' => '2025-10-10 19:18:32.056', 'notes' => '', 'title' => 'Proposed Order Granting Motion to Compel Discovery'],
|
||||
['id' => 61, 'date' => '2025-10-09', 'summary' => 'This is plaintiff Kragh\'s sworn statement asking the court to delay the Montana Association of the Deaf\'s request to end the case early. Kragh argues she cannot properly defend herself because the organization is hiding important evidence.
|
||||
|
||||
The organization filed a motion asking the judge to dismiss the case, claiming there was "no willful wrongdoing" and "no bad intent" in their actions. However, Kragh says the organization admits that crucial evidence exists - including video recordings of 15 board meetings and internal communications - but refuses to turn it over.
|
||||
|
||||
Kragh argues this is unfair: the organization cannot claim certain facts are undisputed while hiding the only evidence that could prove or disprove those claims. She points out that discovery (the evidence-gathering phase) is supposed to continue until March 2026, making the organization\'s request premature.
|
||||
|
||||
The organization has already provided documents in four separate batches, suggesting their initial searches were incomplete. Kragh states she needs access to the withheld evidence to properly respond to the organization\'s motion.', 'created_at' => '2025-10-10 19:21:28.245', 'updated_at' => '2025-10-10 19:21:28.245', 'notes' => '', 'title' => 'Affidavit in Support of Rule 56(f) Motion (Filed By Kragh, Elizabeth on behalf of Kragh, Elizabeth ) 283950 $1.00'],
|
||||
['id' => 62, 'date' => '2025-10-10', 'summary' => 'Plaintiff Kragh filed this affidavit asking the court to extend the October 31, 2025 deadline for amending her complaint. She states that discovery has revealed additional violations she couldn\'t have known about when filing her original complaint. The defendant has provided documents in four separate rounds, with key materials like a policy manual only produced in October 2025. The defendant continues withholding video recordings of board meetings, internal communications, and bylaw histories. Kragh argues she has been diligent in pursuing discovery but needs more time to investigate newly discovered violations before the amendment deadline expires.
|
||||
', 'created_at' => '2025-10-12 02:38:58.702', 'updated_at' => '2025-10-12 02:38:58.702', 'notes' => '', 'title' => 'Affidavit in Support of Motion to Modify Scheduling Order (Filed By Kragh, Elizabeth on behalf of ) 283988 $1.00'],
|
||||
['id' => 63, 'date' => '2025-10-10', 'summary' => 'Plaintiff Kragh filed this motion asking the court to extend the October 31, 2025 deadline for amending her complaint in this lawsuit. She argues that discovery (the legal process where parties share documents) has revealed additional violations she couldn\'t have known about when originally filing. Her initial complaint focused on three issues, but newly discovered documents show a broader pattern of governance problems spanning policy creation, meeting procedures, and financial oversight.
|
||||
|
||||
The defendant organization continues withholding important evidence including video recordings of 15 board meetings, internal communications, and historical governance documents. Kragh argues she has been diligent in pursuing discovery but needs more time to investigate these newly discovered violations before the amendment deadline expires. The motion presents two options: either allow staged amendments or extend the deadline until after discovery is complete. She cites legal precedent requiring "good cause" and argues the current deadline cannot reasonably be met despite her diligence.
|
||||
', 'created_at' => '2025-10-12 02:40:20.087', 'updated_at' => '2025-10-12 02:40:20.087', 'notes' => '', 'title' => 'Motion to Modify Scheduling Order Extension of complaint Amendment Deadline (Filed By Kragh, Elizabeth on behalf of ) 283988 $1.00'],
|
||||
['id' => 64, 'date' => '2025-10-10', 'summary' => 'This is a template court order that Judge Tara Elliott would sign if she grants Plaintiff Kragh\'s request to extend the amendment deadline. The document first lists the court\'s findings, including that Kragh has been diligent in pursuing discovery, that newly discovered governance violations couldn\'t have been anticipated when the original deadline was set, and that the defendant organization continues withholding crucial evidence like video recordings and internal communications.
|
||||
|
||||
The proposed order then gives the judge three options to choose from: 1) Allow a staged approach with two separate amendment deadlines, 2) Extend the deadline to May 2026 after discovery is complete (plaintiff\'s preferred option), or 3) Extend the deadline to January 2026 with requirements for expedited discovery. Each option also addresses whether to pause the defendant\'s summary judgment motion until after the amendment process is complete.
|
||||
|
||||
This is essentially the "relief" or outcome that Plaintiff Kragh is asking the court to grant through her motion.
|
||||
', 'created_at' => '2025-10-12 02:41:36.733', 'updated_at' => '2025-10-12 02:41:36.733', 'notes' => '', 'title' => 'Proposed Order Granting Motion to Modify Scheduling Order 283988 $1.00'],
|
||||
['id' => 67, 'date' => '2025-10-23', 'summary' => 'This is the court\'s electronic filing receipt confirming that Judge Tara Elliott granted Plaintiff Elizabeth Kragh\'s motion to strike on October 23, 2025. The receipt shows the order was electronically filed at 9:25 AM by the court clerk\'s office in Missoula County. While the proposed order is this document, the filing stamp indicates the judge approved Plaintiff Kragh\'s request to remove the accidentally filed discovery responses from the court record, as requested in her motion filed just one day earlier on October 22, 2025.', 'created_at' => '2025-11-09 23:31:54.095', 'updated_at' => '2025-11-13 20:31:57.704', 'notes' => '', 'title' => 'Order Granting Motion to Strike Improperly Filed Discovery Responses'],
|
||||
['id' => 65, 'date' => '2025-10-21', 'summary' => 'This document is a Certificate of Service filed by Elizabeth Kragh confirming she provided additional information in her lawsuit against the Montana Association of the Deaf. After the court denied two of Kragh\'s earlier requests in September 2025, the judge ordered her to answer six specific discovery questions within 30 days. Discovery is the legal process where both sides exchange information before trial. This certificate proves Kragh met the October 22 deadline by submitting her answers on October 21, 2025, and properly notifying the other side\'s attorney by email.', 'created_at' => '2025-11-09 20:19:55.036', 'updated_at' => '2025-11-13 20:34:01.57', 'notes' => '', 'title' => 'Certificate of Service (Filed By Kragh, Elizabeth on behalf of )'],
|
||||
['id' => 66, 'date' => '2025-10-22', 'summary' => 'This motion asks the court to remove a document that Plaintiff Elizabeth Kragh accidentally filed. When responding to discovery requests (questions and document requests from the other side), lawyers typically send their answers directly to the opposing attorney and file only a certificate proving they did so. Plaintiff Kragh correctly sent her responses to the Montana Association of the Deaf\'s attorney and filed the certificate, but she also mistakenly filed the actual responses with the clerk of the court. Since discovery responses aren\'t supposed to be filed unless used in a motion, Plaintiff Kragh asks the judge to delete them from the court record while keeping the certificate of service.
|
||||
', 'created_at' => '2025-11-09 20:21:46.039', 'updated_at' => '2025-11-13 20:34:29.807', 'notes' => '', 'title' => 'Motion to Strike Improperly File Discovery Responses (Doc #47) (Filed By Kragh, Elizabeth on behalf of )'],
|
||||
['id' => 60, 'date' => '2025-10-09', 'summary' => 'This is Plaintiff Kragh\'s motion asking the court to delay the Montana Association of the Deaf\'s request to end the case early. Kragh argues it\'s premature to proceed when crucial evidence is still being withheld.
|
||||
|
||||
The organization filed a motion to dismiss the case on a Saturday, even though the evidence-gathering phase (discovery) is scheduled to continue until March 2026 - five months away. Kragh points out that the organization admits important evidence exists, including video recordings of 15 board meetings and internal communications, but refuses to turn it over.
|
||||
|
||||
Kragh notes a procedural inconsistency: the court previously criticized her for not trying to work things out with the other side before filing motions, yet the organization\'s lawyer did the same thing when filing their dismissal request.
|
||||
|
||||
The motion asks the court to either deny the organization\'s request entirely or delay it until all evidence has been properly shared and reviewed. Kragh argues the organization cannot claim certain facts are undisputed while hiding evidence that could prove or disprove those claims.
|
||||
', 'created_at' => '2025-10-10 19:20:16.941', 'updated_at' => '2025-11-13 20:29:35.216', 'notes' => '', 'title' => 'Motion for Additional Discovery Time Pursuant to Rule 56(f) (Filed By Kragh, Elizabeth on behalf of Kragh, Elizabeth )'],
|
||||
['id' => 68, 'date' => '2025-10-24', 'summary' => 'The Montana Association of the Deaf opposes Plaintiff Elizabeth Kragh\'s request for board meeting videos, internal communications, and bylaw history. MAD claims they\'ve already provided 700+ pages of documents and argues the additional materials aren\'t relevant to Plaintiff Kragh\'s three claims about meeting minutes, election procedures, and financial oversight.
|
||||
MAD\'s main concern is that Plaintiff Kragh maintains a public website about the lawsuit and might share the videos online. They worry this could embarrass volunteer board members and misuse the discovery process for public relations rather than trial preparation.
|
||||
MAD asks the judge to deny Plaintiff Kragh\'s motion, limit further document production, and order her to pay their attorney fees.
|
||||
', 'created_at' => '2025-11-09 23:34:01.804', 'updated_at' => '2025-11-13 20:31:03.478', 'notes' => '', 'title' => 'Defendant\'s Response to Plaintiff\'s Motion to Compel and Cross-Motion for Protective Order (Filed By Lacny, Peter on behalf of Montana Association of the Deaf Inc. )'],
|
||||
['id' => 70, 'date' => '2025-10-24', 'summary' => 'MAD opposes Plaintiff Elizabeth Kragh\'s requests for more discovery time and extension of deadlines before responding to their summary judgment motion. MAD argues Plaintiff Kragh is seeking "smoking gun evidence" without explaining how additional materials would help her case—something Montana courts have found insufficient for delays.
|
||||
|
||||
MAD claims they\'ve provided everything relevant: meeting minutes, financial records, and election documentation. They argue board meeting videos, internal communications, and historical bylaws won\'t change the fundamental facts.
|
||||
|
||||
MAD also disputes Plaintiff Kragh\'s accusations of "tactical manipulation" for filing their motion on a Saturday, noting there\'s nothing improper about weekend work. They ask the judge to deny both extension requests and grant summary judgment immediately, potentially ending the case without trial.
|
||||
', 'created_at' => '2025-11-09 23:37:50.677', 'updated_at' => '2025-11-13 20:31:34.73', 'notes' => '', 'title' => 'MAD\'s Combined Response to Plaintiff\'s Rule 56(f) Motion and Motion to Extend Scheduling Order (Filed By Lacny, Peter on behalf of Montana Association of the Deaf Inc. )'],
|
||||
['id' => 73, 'date' => '2025-11-12', 'summary' => 'Plaintiff Elizabeth Kragh asks the judge to extend the October 31 deadline for amending her lawsuit. She argues that recently produced documents revealed additional governance violations beyond her original three claims, but she needs more time to investigate before deciding whether to add them.
|
||||
|
||||
A policy manual produced in October showed seven potential new bylaw violations. However, MAD still withholds fifteen board meeting videos, internal communications, and bylaw records that could reveal even more violations. Plaintiff Kragh contends extending the deadline would allow her to file one comprehensive amended complaint rather than multiple separate lawsuits as new problems emerge.
|
||||
|
||||
She emphasizes being diligent—pursuing discovery immediately and negotiating in good faith. Since the discovery deadline isn\'t until March 2026, Kragh requests extending the amendment deadline to May 2026, allowing proper investigation of materials MAD continues withholding.', 'created_at' => '2025-11-13 20:35:59.621', 'updated_at' => '2025-11-13 20:35:59.621', 'notes' => '', 'title' => 'Reply Brief in Support of Motion to Modify Scheduling Order (Filed By Kragh, Elizabeth on behalf of )'],
|
||||
['id' => 75, 'date' => '2025-11-12', 'summary' => 'Plaintiff Elizabeth Kragh responds to MAD\'s opposition, arguing the organization admits crucial evidence exists but refuses to provide it while simultaneously asking the judge to dismiss the case. Kragh seeks fifteen specific board meeting videos (which MAD confirms are stored on the president\'s laptop), internal officer communications, and bylaw amendment records spanning ten years.
|
||||
|
||||
She contends these materials could reveal whether MAD\'s violations of state law and bylaws were deliberate or accidental—the key question at the heart of her claims. Plaintiff Kragh argues it\'s fundamentally unfair for MAD to file for immediate dismissal while withholding the very evidence needed to prove or disprove their assertions about intent and knowledge.
|
||||
|
||||
She asks the judge to deny MAD\'s summary judgment motion or delay ruling until after discovery concludes in March 2026.', 'created_at' => '2025-11-13 20:39:05.282', 'updated_at' => '2025-11-13 20:39:05.282', 'notes' => '', 'title' => 'Reply Brief in Support of Motion for Additional Discovery Time Pursuant to Rule 56 (Filed By Kragh, Elizabeth on behalf of )
|
||||
'],
|
||||
['id' => 76, 'date' => '2025-11-12', 'summary' => 'Plaintiff Elizabeth Kragh responds to MAD\'s opposition, emphasizing that MAD admits crucial evidence exists but refuses to provide it. The disputed materials include fifteen board meeting videos (stored on the president\'s laptop), internal officer communications, and ten-year bylaw amendment records.
|
||||
|
||||
Plaintiff Kragh argues Montana law clearly allows discovery of video recordings as "electronically stored information," rejecting MAD\'s claim they\'re merely "working notes" exempt from disclosure. She contends these videos could reveal whether MAD\'s violations were deliberate or accidental—crucial to proving intent and knowledge.
|
||||
|
||||
Kragh addresses procedural errors MAD highlighted, calling them clerical mistakes that didn\'t prevent meaningful negotiation. She opposes MAD\'s request for a protective order and attorney fees, arguing MAD created the dispute by withholding relevant evidence while simultaneously requesting immediate case dismissal.', 'created_at' => '2025-11-13 20:40:54.639', 'updated_at' => '2025-11-13 20:40:54.639', 'notes' => '', 'title' => 'Reply Brief in Support of Motion to Compel Discovery (Filed By Kragh, Elizabeth on behalf of )
|
||||
'],
|
||||
];
|
||||
|
||||
================================================================================
|
||||
DOCUMENTS ARRAY:
|
||||
================================================================================
|
||||
$documents = [
|
||||
['id' => 4, 'docket_entry_id' => 1, 'original_filename' => '05-07-25-affidavit.pdf', 'stored_filename' => '23c520dc-371f-423b-add5-4e52de1cb8a3.pdf', 'file_path' => '/app/uploads/23c520dc-371f-423b-add5-4e52de1cb8a3.pdf', 'title' => '05-07-25-affidavit', 'summary' => '', 'notes' => '', 'file_size' => 2835944, 'display_order' => 0, 'created_at' => '2025-06-25 22:10:32.069', 'updated_at' => '2025-06-25 22:10:32.069', 'mime_type' => 'application/pdf'],
|
||||
['id' => 5, 'docket_entry_id' => 5, 'original_filename' => '05-07-25-complaint.pdf', 'stored_filename' => '07c225d0-3aa8-44df-9cd1-1b65c6ad09a6.pdf', 'file_path' => '/app/uploads/07c225d0-3aa8-44df-9cd1-1b65c6ad09a6.pdf', 'title' => '05-07-25-complaint', 'summary' => '', 'notes' => '', 'file_size' => 12308309, 'display_order' => 0, 'created_at' => '2025-06-25 22:13:29.178', 'updated_at' => '2025-06-25 22:13:29.178', 'mime_type' => 'application/pdf'],
|
||||
['id' => 6, 'docket_entry_id' => 6, 'original_filename' => '05-07-25-exhibits-complaint.pdf', 'stored_filename' => 'e3c0eaf5-b092-4b28-bd87-513e4b1004d6.pdf', 'file_path' => '/app/uploads/e3c0eaf5-b092-4b28-bd87-513e4b1004d6.pdf', 'title' => '05-07-25-exhibits-complaint', 'summary' => '', 'notes' => '', 'file_size' => 40815526, 'display_order' => 0, 'created_at' => '2025-06-25 22:15:27.077', 'updated_at' => '2025-06-25 22:15:27.077', 'mime_type' => 'application/pdf'],
|
||||
['id' => 8, 'docket_entry_id' => 8, 'original_filename' => '05-16-25-amended-cert-of-service.pdf', 'stored_filename' => '6c4acc7c-5b89-42b6-9fa2-e5b07297d1c7.pdf', 'file_path' => '/app/uploads/6c4acc7c-5b89-42b6-9fa2-e5b07297d1c7.pdf', 'title' => '05-16-25-amended-cert-of-service', 'summary' => '', 'notes' => '', 'file_size' => 848704, 'display_order' => 0, 'created_at' => '2025-06-25 22:17:36.285', 'updated_at' => '2025-06-25 22:17:36.285', 'mime_type' => 'application/pdf'],
|
||||
['id' => 9, 'docket_entry_id' => 9, 'original_filename' => '05-14-25-cert-service.pdf', 'stored_filename' => '22591482-9c45-4b01-a467-0d88819dff3d.pdf', 'file_path' => '/app/uploads/22591482-9c45-4b01-a467-0d88819dff3d.pdf', 'title' => '05-14-25-cert-service', 'summary' => '', 'notes' => '', 'file_size' => 823675, 'display_order' => 0, 'created_at' => '2025-06-25 22:19:25.031', 'updated_at' => '2025-06-25 22:19:25.031', 'mime_type' => 'application/pdf'],
|
||||
['id' => 10, 'docket_entry_id' => 10, 'original_filename' => '05-12-25-summons.pdf', 'stored_filename' => 'acbe4d9c-62dd-488f-891e-3fa0af8e755f.pdf', 'file_path' => '/app/uploads/acbe4d9c-62dd-488f-891e-3fa0af8e755f.pdf', 'title' => '05-12-25-summons', 'summary' => '', 'notes' => '', 'file_size' => 413753, 'display_order' => 0, 'created_at' => '2025-06-25 22:21:25.34', 'updated_at' => '2025-06-25 22:21:25.34', 'mime_type' => 'application/pdf'],
|
||||
['id' => 11, 'docket_entry_id' => 11, 'original_filename' => '06-05-25-MAD-response.pdf', 'stored_filename' => '0cdf58fb-bc7f-476b-8a95-e599eac5304b.pdf', 'file_path' => '/app/uploads/0cdf58fb-bc7f-476b-8a95-e599eac5304b.pdf', 'title' => '06-05-25-MAD-response', 'summary' => '', 'notes' => '', 'file_size' => 5166383, 'display_order' => 0, 'created_at' => '2025-06-25 22:23:24.416', 'updated_at' => '2025-06-25 22:23:24.416', 'mime_type' => 'application/pdf'],
|
||||
['id' => 12, 'docket_entry_id' => 12, 'original_filename' => '06-06-25-affidavit-military.pdf', 'stored_filename' => '7202e411-1d5a-467d-bd9f-224e1b67e425.pdf', 'file_path' => '/app/uploads/7202e411-1d5a-467d-bd9f-224e1b67e425.pdf', 'title' => '06-06-25-affidavit-military', 'summary' => '', 'notes' => '', 'file_size' => 1813595, 'display_order' => 0, 'created_at' => '2025-06-25 22:25:18.831', 'updated_at' => '2025-06-25 22:25:18.831', 'mime_type' => 'application/pdf'],
|
||||
['id' => 13, 'docket_entry_id' => 13, 'original_filename' => '06-06-25-affidavit-service.pdf', 'stored_filename' => 'fccf383a-52ef-4408-8c93-66a136966abb.pdf', 'file_path' => '/app/uploads/fccf383a-52ef-4408-8c93-66a136966abb.pdf', 'title' => '06-06-25-affidavit-service', 'summary' => '', 'notes' => '', 'file_size' => 1372227, 'display_order' => 0, 'created_at' => '2025-06-25 22:26:21.55', 'updated_at' => '2025-06-25 22:26:21.55', 'mime_type' => 'application/pdf'],
|
||||
['id' => 14, 'docket_entry_id' => 14, 'original_filename' => '06-06-25-motion-default.pdf', 'stored_filename' => '87345cc8-7e8c-4036-b45d-d07038cceaf2.pdf', 'file_path' => '/app/uploads/87345cc8-7e8c-4036-b45d-d07038cceaf2.pdf', 'title' => '06-06-25-motion-default', 'summary' => '', 'notes' => '', 'file_size' => 2912423, 'display_order' => 0, 'created_at' => '2025-06-25 22:27:20.623', 'updated_at' => '2025-06-25 22:27:20.623', 'mime_type' => 'application/pdf'],
|
||||
['id' => 15, 'docket_entry_id' => 15, 'original_filename' => '06-06-25-supporting-default.pdf', 'stored_filename' => '28dac869-0180-4351-9394-fbb089568a5c.pdf', 'file_path' => '/app/uploads/28dac869-0180-4351-9394-fbb089568a5c.pdf', 'title' => '06-06-25-supporting-default', 'summary' => '', 'notes' => '', 'file_size' => 6492681, 'display_order' => 0, 'created_at' => '2025-06-25 22:28:15.994', 'updated_at' => '2025-06-25 22:28:15.994', 'mime_type' => 'application/pdf'],
|
||||
['id' => 16, 'docket_entry_id' => 16, 'original_filename' => '06-06-25-order-default.pdf', 'stored_filename' => '56d72c99-d20c-400b-9b04-6299c402c597.pdf', 'file_path' => '/app/uploads/56d72c99-d20c-400b-9b04-6299c402c597.pdf', 'title' => '06-06-25-order-default', 'summary' => '', 'notes' => '', 'file_size' => 2853711, 'display_order' => 0, 'created_at' => '2025-06-25 22:29:12.735', 'updated_at' => '2025-06-25 22:29:12.735', 'mime_type' => 'application/pdf'],
|
||||
['id' => 17, 'docket_entry_id' => 17, 'original_filename' => '06-06-25-motion-TRO.pdf', 'stored_filename' => '275afa2f-1cc2-4a50-980a-9203f6ddd84e.pdf', 'file_path' => '/app/uploads/275afa2f-1cc2-4a50-980a-9203f6ddd84e.pdf', 'title' => '06-06-25-motion-TRO', 'summary' => '', 'notes' => '', 'file_size' => 3430613, 'display_order' => 0, 'created_at' => '2025-06-25 22:30:25.914', 'updated_at' => '2025-06-25 22:30:25.914', 'mime_type' => 'application/pdf'],
|
||||
['id' => 18, 'docket_entry_id' => 18, 'original_filename' => '06-06-25-TRO.pdf', 'stored_filename' => 'e7f00c5b-322c-4a1e-b865-afd2f8255c62.pdf', 'file_path' => '/app/uploads/e7f00c5b-322c-4a1e-b865-afd2f8255c62.pdf', 'title' => '06-06-25-TRO', 'summary' => '', 'notes' => '', 'file_size' => 1886561, 'display_order' => 0, 'created_at' => '2025-06-25 22:31:31.339', 'updated_at' => '2025-06-25 22:31:31.339', 'mime_type' => 'application/pdf'],
|
||||
['id' => 19, 'docket_entry_id' => 19, 'original_filename' => '06-09-2025-motion-unauthorized.pdf', 'stored_filename' => '37055e87-e18b-47d5-acf1-502080cc3084.pdf', 'file_path' => '/app/uploads/37055e87-e18b-47d5-acf1-502080cc3084.pdf', 'title' => '06-09-2025-motion-unauthorized', 'summary' => '', 'notes' => '', 'file_size' => 8643407, 'display_order' => 0, 'created_at' => '2025-06-25 22:37:56.929', 'updated_at' => '2025-06-25 22:37:56.929', 'mime_type' => 'application/pdf'],
|
||||
['id' => 20, 'docket_entry_id' => 20, 'original_filename' => '06-09-25-proposed-unathorized.pdf', 'stored_filename' => '252e2a75-37b8-4478-9e3f-bab0dcd62975.pdf', 'file_path' => '/app/uploads/252e2a75-37b8-4478-9e3f-bab0dcd62975.pdf', 'title' => '06-09-25-proposed-unathorized', 'summary' => '', 'notes' => '', 'file_size' => 2053426, 'display_order' => 0, 'created_at' => '2025-06-25 22:38:59.564', 'updated_at' => '2025-06-25 22:38:59.564', 'mime_type' => 'application/pdf'],
|
||||
['id' => 21, 'docket_entry_id' => 21, 'original_filename' => '06-09-25-motion-sanctions.pdf', 'stored_filename' => '5933acef-8523-44c9-81c3-e37ea8abd256.pdf', 'file_path' => '/app/uploads/5933acef-8523-44c9-81c3-e37ea8abd256.pdf', 'title' => '06-09-25-motion-sanctions', 'summary' => '', 'notes' => '', 'file_size' => 5752094, 'display_order' => 0, 'created_at' => '2025-06-25 22:40:00.636', 'updated_at' => '2025-06-25 22:40:00.636', 'mime_type' => 'application/pdf'],
|
||||
['id' => 22, 'docket_entry_id' => 22, 'original_filename' => '06-09-25-proposed-grant-sanctions.pdf', 'stored_filename' => '004f5cd2-d600-4125-86da-bca491183fcb.pdf', 'file_path' => '/app/uploads/004f5cd2-d600-4125-86da-bca491183fcb.pdf', 'title' => '06-09-25-proposed-grant-sanctions', 'summary' => '', 'notes' => '', 'file_size' => 2896461, 'display_order' => 0, 'created_at' => '2025-06-25 22:40:55.409', 'updated_at' => '2025-06-25 22:40:55.409', 'mime_type' => 'application/pdf'],
|
||||
['id' => 23, 'docket_entry_id' => 23, 'original_filename' => '06-10-25-granting-motion-strike.pdf', 'stored_filename' => '97cbd49d-c23c-4415-baa7-cf0432aa0942.pdf', 'file_path' => '/app/uploads/97cbd49d-c23c-4415-baa7-cf0432aa0942.pdf', 'title' => '06-10-25-granting-motion-strike', 'summary' => '', 'notes' => '', 'file_size' => 3877515, 'display_order' => 0, 'created_at' => '2025-06-25 22:41:51.826', 'updated_at' => '2025-06-25 22:41:51.826', 'mime_type' => 'application/pdf'],
|
||||
['id' => 24, 'docket_entry_id' => 24, 'original_filename' => '06-11-25-motion-prelim.pdf', 'stored_filename' => '34bb78ab-98db-4b67-8a5d-0a0781710bd1.pdf', 'file_path' => '/app/uploads/34bb78ab-98db-4b67-8a5d-0a0781710bd1.pdf', 'title' => '06-11-25-motion-prelim', 'summary' => '', 'notes' => '', 'file_size' => 6451893, 'display_order' => 0, 'created_at' => '2025-06-25 22:42:44.297', 'updated_at' => '2025-06-25 22:42:44.297', 'mime_type' => 'application/pdf'],
|
||||
['id' => 25, 'docket_entry_id' => 25, 'original_filename' => '06-11-25-proposed-grant-prelim.pdf', 'stored_filename' => '8f5bd0e0-7c45-4ecc-91eb-c4b3464689a7.pdf', 'file_path' => '/app/uploads/8f5bd0e0-7c45-4ecc-91eb-c4b3464689a7.pdf', 'title' => '06-11-25-proposed-grant-prelim', 'summary' => '', 'notes' => '', 'file_size' => 2217692, 'display_order' => 0, 'created_at' => '2025-06-25 22:43:28.944', 'updated_at' => '2025-06-25 22:43:28.944', 'mime_type' => 'application/pdf'],
|
||||
['id' => 26, 'docket_entry_id' => 26, 'original_filename' => 'MAD-Notice of Appearance 07:24.pdf', 'stored_filename' => '51bc25d9-3a86-4221-b9d5-329667877d9e.pdf', 'file_path' => '/app/uploads/51bc25d9-3a86-4221-b9d5-329667877d9e.pdf', 'title' => 'MAD-Notice of Appearance 07:24', 'summary' => '', 'notes' => '', 'file_size' => 113258, 'display_order' => 0, 'created_at' => '2025-07-25 21:34:56.53', 'updated_at' => '2025-07-25 21:34:56.53', 'mime_type' => 'application/pdf'],
|
||||
['id' => 27, 'docket_entry_id' => 27, 'original_filename' => 'MAD answer-07:24.pdf', 'stored_filename' => 'b5d14c6f-6321-4711-b263-62fff14b9df6.pdf', 'file_path' => '/app/uploads/b5d14c6f-6321-4711-b263-62fff14b9df6.pdf', 'title' => 'MAD answer-07:24', 'summary' => '', 'notes' => '', 'file_size' => 177006, 'display_order' => 0, 'created_at' => '2025-07-25 21:37:33.878', 'updated_at' => '2025-07-25 21:37:33.878', 'mime_type' => 'application/pdf'],
|
||||
['id' => 28, 'docket_entry_id' => 28, 'original_filename' => '19 Rule 16(B), M.R.CIV.P. Order.pdf', 'stored_filename' => '50e98985-42a0-42b6-8501-5ed98cd3643d.pdf', 'file_path' => '/app/uploads/50e98985-42a0-42b6-8501-5ed98cd3643d.pdf', 'title' => '19 Rule 16(B), M.R.CIV.P. Order', 'summary' => '', 'notes' => '', 'file_size' => 906508, 'display_order' => 0, 'created_at' => '2025-08-05 22:23:38.98', 'updated_at' => '2025-08-05 22:23:38.98', 'mime_type' => 'application/pdf'],
|
||||
['id' => 29, 'docket_entry_id' => 29, 'original_filename' => 'MOTION TO DISMISS COUNTERCLAIMS (August 8, 2025).pdf', 'stored_filename' => 'dd34041b-d2b7-4cf8-9b25-a5aa83f006ab.pdf', 'file_path' => '/app/uploads/dd34041b-d2b7-4cf8-9b25-a5aa83f006ab.pdf', 'title' => 'MOTION TO DISMISS COUNTERCLAIMS (August 8, 2025)', 'summary' => '', 'notes' => '', 'file_size' => 1275683, 'display_order' => 0, 'created_at' => '2025-08-11 19:47:00.548', 'updated_at' => '2025-08-11 19:47:00.548', 'mime_type' => 'application/pdf'],
|
||||
['id' => 30, 'docket_entry_id' => 30, 'original_filename' => '[PROPOSED] ORDER GRANTING PLAINTIFF\'S MOTION TO DISMISS COUNTERCLAIMS (August 8, 2025).pdf', 'stored_filename' => '6606618f-fef6-4d83-813b-aa9e5807866d.pdf', 'file_path' => '/app/uploads/6606618f-fef6-4d83-813b-aa9e5807866d.pdf', 'title' => '[PROPOSED] ORDER GRANTING PLAINTIFF\'S MOTION TO DISMISS COUNTERCLAIMS (August 8, 2025)', 'summary' => '', 'notes' => '', 'file_size' => 144855, 'display_order' => 0, 'created_at' => '2025-08-11 19:59:36.412', 'updated_at' => '2025-08-11 19:59:36.412', 'mime_type' => 'application/pdf'],
|
||||
['id' => 31, 'docket_entry_id' => 31, 'original_filename' => 'PLAINTIFF\'S MOTION FOR PROTECTIVE ORDER REGARDING DEFENDANT\'S FIRST COMBINED DISCOVERY REQUESTS (August 8, 2025).pdf', 'stored_filename' => '4cd62919-ad92-46e9-a54a-d8e54e0729da.pdf', 'file_path' => '/app/uploads/4cd62919-ad92-46e9-a54a-d8e54e0729da.pdf', 'title' => 'PLAINTIFF\'S MOTION FOR PROTECTIVE ORDER REGARDING DEFENDANT\'S FIRST COMBINED DISCOVERY REQUESTS (August 8, 2025)', 'summary' => '', 'notes' => '', 'file_size' => 965180, 'display_order' => 0, 'created_at' => '2025-08-11 20:05:05.783', 'updated_at' => '2025-08-11 20:05:05.783', 'mime_type' => 'application/pdf'],
|
||||
['id' => 32, 'docket_entry_id' => 32, 'original_filename' => '[PROPOSED] ORDER GRANTING PLAINTIFF\'S MOTION FOR PROTECTIVE ORDER (August 8, 2025).pdf', 'stored_filename' => '756cbb75-cb30-4e6e-96e2-9ba18f590808.pdf', 'file_path' => '/app/uploads/756cbb75-cb30-4e6e-96e2-9ba18f590808.pdf', 'title' => '[PROPOSED] ORDER GRANTING PLAINTIFF\'S MOTION FOR PROTECTIVE ORDER (August 8, 2025)', 'summary' => '', 'notes' => '', 'file_size' => 103313, 'display_order' => 0, 'created_at' => '2025-08-11 20:10:12.522', 'updated_at' => '2025-08-11 20:10:12.522', 'mime_type' => 'application/pdf'],
|
||||
['id' => 33, 'docket_entry_id' => 33, 'original_filename' => '2025.08.07 Notice of Service.pdf', 'stored_filename' => 'c4a1fa10-5d63-4d22-965b-3f81df2a4bed.pdf', 'file_path' => '/app/uploads/c4a1fa10-5d63-4d22-965b-3f81df2a4bed.pdf', 'title' => '2025.08.07 Notice of Service', 'summary' => '', 'notes' => '', 'file_size' => 113028, 'display_order' => 0, 'created_at' => '2025-08-12 16:45:14.328', 'updated_at' => '2025-08-12 16:45:14.328', 'mime_type' => 'application/pdf'],
|
||||
['id' => 34, 'docket_entry_id' => 36, 'original_filename' => 'Notice of Service Discovery Request (August 12, 2025).pdf', 'stored_filename' => '5cc390c8-fdfd-4610-9a7b-7f37a6322cc3.pdf', 'file_path' => '/app/uploads/5cc390c8-fdfd-4610-9a7b-7f37a6322cc3.pdf', 'title' => 'Notice of Service Discovery Request (August 12, 2025)', 'summary' => '', 'notes' => '', 'file_size' => 371297, 'display_order' => 0, 'created_at' => '2025-08-24 15:17:56.831', 'updated_at' => '2025-08-24 15:17:56.831', 'mime_type' => 'application/pdf'],
|
||||
['id' => 35, 'docket_entry_id' => 41, 'original_filename' => 'MOTION TO WITHDRAW PRELIMINARY INJUNCTION MOTION (August 18, 2026).pdf', 'stored_filename' => '2f15c9c1-98b8-4f72-b22a-accee822fba4.pdf', 'file_path' => '/app/uploads/2f15c9c1-98b8-4f72-b22a-accee822fba4.pdf', 'title' => 'MOTION TO WITHDRAW PRELIMINARY INJUNCTION MOTION (August 18, 2026)', 'summary' => '', 'notes' => '', 'file_size' => 422033, 'display_order' => 0, 'created_at' => '2025-08-24 15:21:18.366', 'updated_at' => '2025-08-24 15:21:18.366', 'mime_type' => 'application/pdf'],
|
||||
['id' => 36, 'docket_entry_id' => 42, 'original_filename' => 'SUPPLEMENTAL NOTICE REGARDING RULE 3(G)(2) COMPLIANCE (August 18, 2026).pdf', 'stored_filename' => '0d4cebf9-2e39-4f17-8b62-2fba89d41494.pdf', 'file_path' => '/app/uploads/0d4cebf9-2e39-4f17-8b62-2fba89d41494.pdf', 'title' => 'SUPPLEMENTAL NOTICE REGARDING RULE 3(G)(2) COMPLIANCE (August 18, 2026)', 'summary' => '', 'notes' => '', 'file_size' => 450998, 'display_order' => 0, 'created_at' => '2025-08-24 15:23:10.332', 'updated_at' => '2025-08-24 15:23:10.332', 'mime_type' => 'application/pdf'],
|
||||
['id' => 37, 'docket_entry_id' => 43, 'original_filename' => 'Notice of Filing Proposed Scheduling Order 08:20:2025.pdf', 'stored_filename' => '9b6c1274-2786-44fe-87c4-750b1e310f4a.pdf', 'file_path' => '/app/uploads/9b6c1274-2786-44fe-87c4-750b1e310f4a.pdf', 'title' => 'Notice of Filing Proposed Scheduling Order 08:20:2025', 'summary' => '', 'notes' => '', 'file_size' => 87493, 'display_order' => 0, 'created_at' => '2025-08-26 21:17:45.796', 'updated_at' => '2025-08-26 21:17:45.796', 'mime_type' => 'application/pdf'],
|
||||
['id' => 38, 'docket_entry_id' => 44, 'original_filename' => 'Proposed Scheduling Order 08:20:2025.pdf', 'stored_filename' => 'f543d62a-817b-4dbe-b9f7-6d36a9ee59b2.pdf', 'file_path' => '/app/uploads/f543d62a-817b-4dbe-b9f7-6d36a9ee59b2.pdf', 'title' => 'Proposed Scheduling Order 08:20:2025', 'summary' => '', 'notes' => '', 'file_size' => 2370599, 'display_order' => 0, 'created_at' => '2025-08-26 21:19:22.22', 'updated_at' => '2025-08-26 21:19:22.22', 'mime_type' => 'application/pdf'],
|
||||
['id' => 40, 'docket_entry_id' => 46, 'original_filename' => '2025.08.22 MAD\'s Response to Kragh\'s Motion for Protective Order.pdf', 'stored_filename' => '8b28b36f-08ce-4cdc-aad0-5d535b558e5b.pdf', 'file_path' => '/app/uploads/8b28b36f-08ce-4cdc-aad0-5d535b558e5b.pdf', 'title' => '2025.08.22 MAD\'s Response to Kragh\'s Motion for Protective Order', 'summary' => '', 'notes' => '', 'file_size' => 1340870, 'display_order' => 0, 'created_at' => '2025-08-26 21:37:25.077', 'updated_at' => '2025-08-26 21:37:25.077', 'mime_type' => 'application/pdf'],
|
||||
['id' => 41, 'docket_entry_id' => 47, 'original_filename' => '28 Scheduling Order 08:25:2025.pdf', 'stored_filename' => '120f303c-91db-409f-a028-543fb6019dcb.pdf', 'file_path' => '/app/uploads/120f303c-91db-409f-a028-543fb6019dcb.pdf', 'title' => '28 Scheduling Order 08:25:2025', 'summary' => '', 'notes' => '', 'file_size' => 2416317, 'display_order' => 0, 'created_at' => '2025-08-31 19:05:01.606', 'updated_at' => '2025-08-31 19:05:01.606', 'mime_type' => 'application/pdf'],
|
||||
['id' => 42, 'docket_entry_id' => 48, 'original_filename' => '2025.08.29 MAD\'s Response to MX to Dismiss (1).pdf', 'stored_filename' => 'ea040083-d7f0-4393-822b-59d8e77eccf0.pdf', 'file_path' => '/app/uploads/ea040083-d7f0-4393-822b-59d8e77eccf0.pdf', 'title' => '2025.08.29 MAD\'s Response to MX to Dismiss (1)', 'summary' => '', 'notes' => '', 'file_size' => 279201, 'display_order' => 0, 'created_at' => '2025-09-05 02:25:03.18', 'updated_at' => '2025-09-05 02:25:03.18', 'mime_type' => 'application/pdf'],
|
||||
['id' => 43, 'docket_entry_id' => 49, 'original_filename' => 'REPLY BRIEF IN SUPPORT OF PLAINTIFF\'S MOTION TO DISMISS COUNTERCLAIMS AND STRIKE AFFIRMATIVE DEFENSES (September 2, 2025).pdf', 'stored_filename' => '890a4fd1-d25e-4d03-952c-68b22173b97d.pdf', 'file_path' => '/app/uploads/890a4fd1-d25e-4d03-952c-68b22173b97d.pdf', 'title' => 'REPLY BRIEF IN SUPPORT OF PLAINTIFF\'S MOTION TO DISMISS COUNTERCLAIMS AND STRIKE AFFIRMATIVE DEFENSES (September 2, 2025)', 'summary' => '', 'notes' => '', 'file_size' => 1460459, 'display_order' => 0, 'created_at' => '2025-09-05 22:34:39.922', 'updated_at' => '2025-09-05 22:34:39.922', 'mime_type' => 'application/pdf'],
|
||||
['id' => 44, 'docket_entry_id' => 50, 'original_filename' => 'REPLY BRIEF IN SUPPORT OF PLAINTIFF\'S MOTION FOR PROTECTIVE ORDER (September 2, 2025).pdf', 'stored_filename' => '6418adb6-522c-4141-af54-c457da8a48a1.pdf', 'file_path' => '/app/uploads/6418adb6-522c-4141-af54-c457da8a48a1.pdf', 'title' => 'REPLY BRIEF IN SUPPORT OF PLAINTIFF\'S MOTION FOR PROTECTIVE ORDER (September 2, 2025)', 'summary' => '', 'notes' => '', 'file_size' => 2165420, 'display_order' => 0, 'created_at' => '2025-09-05 22:35:36.038', 'updated_at' => '2025-09-05 22:35:36.038', 'mime_type' => 'application/pdf'],
|
||||
['id' => 45, 'docket_entry_id' => 51, 'original_filename' => 'Notice Of Service of Discovery Responses (September 8, 2025)-2.pdf', 'stored_filename' => '263d0930-e617-4a10-ba5f-2719cf5123d6.pdf', 'file_path' => '/app/uploads/263d0930-e617-4a10-ba5f-2719cf5123d6.pdf', 'title' => 'Notice Of Service of Discovery Responses (September 8, 2025)-2', 'summary' => '', 'notes' => '', 'file_size' => 588054, 'display_order' => 0, 'created_at' => '2025-09-11 03:13:33.585', 'updated_at' => '2025-09-11 03:13:33.585', 'mime_type' => 'application/pdf'],
|
||||
['id' => 46, 'docket_entry_id' => 52, 'original_filename' => '2025.09.15 Notice of Service.pdf', 'stored_filename' => 'b265a58c-39e7-49ef-9bcc-12ee495943eb.pdf', 'file_path' => '/app/uploads/b265a58c-39e7-49ef-9bcc-12ee495943eb.pdf', 'title' => '2025.09.15 Notice of Service', 'summary' => '', 'notes' => '', 'file_size' => 116109, 'display_order' => 0, 'created_at' => '2025-09-22 03:07:48.166', 'updated_at' => '2025-09-22 03:07:48.166', 'mime_type' => 'application/pdf'],
|
||||
['id' => 47, 'docket_entry_id' => 53, 'original_filename' => '34 Order.pdf', 'stored_filename' => '17406665-163b-40c4-b63b-4968cd4bff28.pdf', 'file_path' => '/app/uploads/17406665-163b-40c4-b63b-4968cd4bff28.pdf', 'title' => '34 Order', 'summary' => '', 'notes' => '', 'file_size' => 958614, 'display_order' => 0, 'created_at' => '2025-09-27 23:16:18.329', 'updated_at' => '2025-09-27 23:16:18.329', 'mime_type' => 'application/pdf'],
|
||||
['id' => 48, 'docket_entry_id' => 54, 'original_filename' => 'MAD\'SMotionforSummaryJudgement.pdf', 'stored_filename' => '787faf65-5d11-4785-8a93-5f5b3d5fc00a.pdf', 'file_path' => '/app/uploads/787faf65-5d11-4785-8a93-5f5b3d5fc00a.pdf', 'title' => 'MAD\'SMotionforSummaryJudgement', 'summary' => '', 'notes' => '', 'file_size' => 146748, 'display_order' => 0, 'created_at' => '2025-10-08 18:22:13.047', 'updated_at' => '2025-10-08 18:22:13.047', 'mime_type' => 'application/pdf'],
|
||||
['id' => 49, 'docket_entry_id' => 55, 'original_filename' => 'BISOMADMotionforSummaryJudgment.pdf', 'stored_filename' => '8d0154b4-8f08-41e6-9aa1-8ce4c84fa7af.pdf', 'file_path' => '/app/uploads/8d0154b4-8f08-41e6-9aa1-8ce4c84fa7af.pdf', 'title' => 'BISOMADMotionforSummaryJudgment', 'summary' => '', 'notes' => '', 'file_size' => 302820, 'display_order' => 0, 'created_at' => '2025-10-08 18:23:51.899', 'updated_at' => '2025-10-08 18:23:51.899', 'mime_type' => 'application/pdf'],
|
||||
['id' => 50, 'docket_entry_id' => 56, 'original_filename' => 'LacnyDeclarationinSupportofMSJ.pdf', 'stored_filename' => '7a972bdf-bc97-4be5-a8c2-55f0d3a38d42.pdf', 'file_path' => '/app/uploads/7a972bdf-bc97-4be5-a8c2-55f0d3a38d42.pdf', 'title' => 'LacnyDeclarationinSupportofMSJ', 'summary' => '', 'notes' => '', 'file_size' => 1751587, 'display_order' => 0, 'created_at' => '2025-10-08 18:24:58.657', 'updated_at' => '2025-10-08 18:24:58.657', 'mime_type' => 'application/pdf'],
|
||||
['id' => 51, 'docket_entry_id' => 57, 'original_filename' => 'MOTION TO COMPEL DISCOVERY.pdf', 'stored_filename' => '105a7fb1-3fdb-4d86-9250-d79c61997349.pdf', 'file_path' => '/app/uploads/105a7fb1-3fdb-4d86-9250-d79c61997349.pdf', 'title' => 'MOTION TO COMPEL DISCOVERY', 'summary' => '', 'notes' => '', 'file_size' => 940071, 'display_order' => 0, 'created_at' => '2025-10-08 18:42:25.834', 'updated_at' => '2025-10-08 18:42:25.834', 'mime_type' => 'application/pdf'],
|
||||
['id' => 52, 'docket_entry_id' => 58, 'original_filename' => 'Exhibits.pdf', 'stored_filename' => '75ad46f0-2d99-444f-bdef-659982cf52c7.pdf', 'file_path' => '/app/uploads/75ad46f0-2d99-444f-bdef-659982cf52c7.pdf', 'title' => 'Exhibits', 'summary' => '', 'notes' => '', 'file_size' => 8496288, 'display_order' => 0, 'created_at' => '2025-10-08 18:43:38.741', 'updated_at' => '2025-10-08 18:43:38.741', 'mime_type' => 'application/pdf'],
|
||||
['id' => 53, 'docket_entry_id' => 59, 'original_filename' => '[PROPOSED] ORDER GRANTING MOTION TO COMPEL DISCOVERY.pdf', 'stored_filename' => '50cee894-78d5-44d0-a876-d5e6b1a77531.pdf', 'file_path' => '/app/uploads/50cee894-78d5-44d0-a876-d5e6b1a77531.pdf', 'title' => '[PROPOSED] ORDER GRANTING MOTION TO COMPEL DISCOVERY', 'summary' => '', 'notes' => '', 'file_size' => 130494, 'display_order' => 0, 'created_at' => '2025-10-10 19:18:32.532', 'updated_at' => '2025-10-10 19:18:32.532', 'mime_type' => 'application/pdf'],
|
||||
['id' => 54, 'docket_entry_id' => 60, 'original_filename' => 'MOTION FOR ADDITIONAL DISCOVERY TIME PURSUANT TO RULE 56(f).pdf', 'stored_filename' => 'f92f2aea-a6e2-4a44-88eb-603a39245b08.pdf', 'file_path' => '/app/uploads/f92f2aea-a6e2-4a44-88eb-603a39245b08.pdf', 'title' => 'MOTION FOR ADDITIONAL DISCOVERY TIME PURSUANT TO RULE 56(f)', 'summary' => '', 'notes' => '', 'file_size' => 1228332, 'display_order' => 0, 'created_at' => '2025-10-10 19:20:17.585', 'updated_at' => '2025-10-10 19:20:17.585', 'mime_type' => 'application/pdf'],
|
||||
['id' => 55, 'docket_entry_id' => 61, 'original_filename' => 'AFFIDAVIT IN SUPPORT OF RULE 56(f) MOTION.pdf', 'stored_filename' => 'c87574bc-c254-4b69-bc56-6676c163daf1.pdf', 'file_path' => '/app/uploads/c87574bc-c254-4b69-bc56-6676c163daf1.pdf', 'title' => 'AFFIDAVIT IN SUPPORT OF RULE 56(f) MOTION', 'summary' => '', 'notes' => '', 'file_size' => 1033222, 'display_order' => 0, 'created_at' => '2025-10-10 19:21:28.59', 'updated_at' => '2025-10-10 19:21:28.59', 'mime_type' => 'application/pdf'],
|
||||
['id' => 56, 'docket_entry_id' => 62, 'original_filename' => 'AFFIDAVIT OF ELIZABETH KRAGH IN SUPPORT OF MOTION TO MODIFY SCHEDULING ORDER.pdf', 'stored_filename' => '6bddd7e8-5d95-4e7d-934f-d54eff9bfac8.pdf', 'file_path' => '/app/uploads/6bddd7e8-5d95-4e7d-934f-d54eff9bfac8.pdf', 'title' => 'AFFIDAVIT OF ELIZABETH KRAGH IN SUPPORT OF MOTION TO MODIFY SCHEDULING ORDER', 'summary' => '', 'notes' => '', 'file_size' => 932377, 'display_order' => 0, 'created_at' => '2025-10-12 02:38:59.403', 'updated_at' => '2025-10-12 02:38:59.403', 'mime_type' => 'application/pdf'],
|
||||
['id' => 57, 'docket_entry_id' => 63, 'original_filename' => 'MOTION TO MODIFY SCHEDULING ORDER - EXTENSION OF COMPLAINT AMENDMENT DEADLINE.pdf', 'stored_filename' => 'ed5904c1-017b-4cb7-a247-9702e33cb109.pdf', 'file_path' => '/app/uploads/ed5904c1-017b-4cb7-a247-9702e33cb109.pdf', 'title' => 'MOTION TO MODIFY SCHEDULING ORDER - EXTENSION OF COMPLAINT AMENDMENT DEADLINE', 'summary' => '', 'notes' => '', 'file_size' => 1313886, 'display_order' => 0, 'created_at' => '2025-10-12 02:40:20.483', 'updated_at' => '2025-10-12 02:40:20.483', 'mime_type' => 'application/pdf'],
|
||||
['id' => 58, 'docket_entry_id' => 64, 'original_filename' => 'PROPOSED ORDER GRANTING MOTION TO MODIFY SCHEDULING ORDER.pdf', 'stored_filename' => '51cc05eb-b388-45bf-9a10-33bbd7c00db3.pdf', 'file_path' => '/app/uploads/51cc05eb-b388-45bf-9a10-33bbd7c00db3.pdf', 'title' => 'PROPOSED ORDER GRANTING MOTION TO MODIFY SCHEDULING ORDER', 'summary' => '', 'notes' => '', 'file_size' => 109939, 'display_order' => 0, 'created_at' => '2025-10-12 02:41:36.875', 'updated_at' => '2025-10-12 02:41:36.875', 'mime_type' => 'application/pdf'],
|
||||
['id' => 59, 'docket_entry_id' => 65, 'original_filename' => 'Notice Of Service of Discovery Responses (October 21, 2025).pdf', 'stored_filename' => 'a846f4c6-9ef5-4f7f-ae67-95e1b9af4644.pdf', 'file_path' => '/app/uploads/a846f4c6-9ef5-4f7f-ae67-95e1b9af4644.pdf', 'title' => 'Notice Of Service of Discovery Responses (October 21, 2025)', 'summary' => '', 'notes' => '', 'file_size' => 290204, 'display_order' => 0, 'created_at' => '2025-11-09 20:19:56.84', 'updated_at' => '2025-11-09 20:19:56.84', 'mime_type' => 'application/pdf'],
|
||||
['id' => 60, 'docket_entry_id' => 66, 'original_filename' => 'MOTION TO STRIKE IMPROPERLY FILED DISCOVERY RESPONSES.pdf', 'stored_filename' => '051bcfa0-67ad-41a2-9045-fd0b7e8fe5cd.pdf', 'file_path' => '/app/uploads/051bcfa0-67ad-41a2-9045-fd0b7e8fe5cd.pdf', 'title' => 'MOTION TO STRIKE IMPROPERLY FILED DISCOVERY RESPONSES', 'summary' => '', 'notes' => '', 'file_size' => 567643, 'display_order' => 0, 'created_at' => '2025-11-09 20:21:47.692', 'updated_at' => '2025-11-09 20:21:47.692', 'mime_type' => 'application/pdf'],
|
||||
['id' => 61, 'docket_entry_id' => 67, 'original_filename' => '49 Order Granting Motion to Strike Improperly Filed Discovery Responses.pdf', 'stored_filename' => '57982aa8-739d-487a-9aa4-418d16c98de5.pdf', 'file_path' => '/app/uploads/57982aa8-739d-487a-9aa4-418d16c98de5.pdf', 'title' => '49 Order Granting Motion to Strike Improperly Filed Discovery Responses', 'summary' => '', 'notes' => '', 'file_size' => 878809, 'display_order' => 0, 'created_at' => '2025-11-09 23:31:54.831', 'updated_at' => '2025-11-09 23:31:54.831', 'mime_type' => 'application/pdf'],
|
||||
['id' => 62, 'docket_entry_id' => 68, 'original_filename' => '2025.10.24 MAD Response to MTC and Cross-Motion for Protective Order.pdf', 'stored_filename' => '985b5e38-4393-4e0f-b119-87d73d6279e3.pdf', 'file_path' => '/app/uploads/985b5e38-4393-4e0f-b119-87d73d6279e3.pdf', 'title' => '2025.10.24 MAD Response to MTC and Cross-Motion for Protective Order', 'summary' => '', 'notes' => '', 'file_size' => 697398, 'display_order' => 0, 'created_at' => '2025-11-09 23:34:02.101', 'updated_at' => '2025-11-09 23:34:02.101', 'mime_type' => 'application/pdf'],
|
||||
['id' => 63, 'docket_entry_id' => 70, 'original_filename' => ' MAD Combined Response to Rule 56F and MX to Extend.pdf', 'stored_filename' => '9b302464-27f6-4673-ac13-88787fc3e148.pdf', 'file_path' => '/app/uploads/9b302464-27f6-4673-ac13-88787fc3e148.pdf', 'title' => ' MAD Combined Response to Rule 56F and MX to Extend', 'summary' => '', 'notes' => '', 'file_size' => 2968585, 'display_order' => 0, 'created_at' => '2025-11-09 23:37:51.447', 'updated_at' => '2025-11-09 23:37:51.447', 'mime_type' => 'application/pdf'],
|
||||
['id' => 64, 'docket_entry_id' => 71, 'original_filename' => 'Motion_to_extend_time-10.28.25.pdf', 'stored_filename' => '75f79efc-1263-45c8-9720-eab30ac5f0d0.pdf', 'file_path' => '/app/uploads/75f79efc-1263-45c8-9720-eab30ac5f0d0.pdf', 'title' => 'Motion_to_extend_time-10.28.25', 'summary' => '', 'notes' => '', 'file_size' => 1045115, 'display_order' => 0, 'created_at' => '2025-11-09 23:39:13.777', 'updated_at' => '2025-11-09 23:39:13.777', 'mime_type' => 'application/pdf'],
|
||||
['id' => 65, 'docket_entry_id' => 72, 'original_filename' => '53 Order Granting Motion to Extend Time For Filing Reply Briefs.pdf', 'stored_filename' => '243e3d14-1201-43f1-90a4-c9b0df8b2f42.pdf', 'file_path' => '/app/uploads/243e3d14-1201-43f1-90a4-c9b0df8b2f42.pdf', 'title' => '53 Order Granting Motion to Extend Time For Filing Reply Briefs', 'summary' => '', 'notes' => '', 'file_size' => 849616, 'display_order' => 0, 'created_at' => '2025-11-09 23:40:37.466', 'updated_at' => '2025-11-09 23:40:37.466', 'mime_type' => 'application/pdf'],
|
||||
['id' => 66, 'docket_entry_id' => 73, 'original_filename' => 'REPLY BRIEF IN SUPPORT OF MOTION TO MODIFY SCHEDULING ORDER.pdf', 'stored_filename' => '63f26d51-a889-4c3b-b2fb-0a73b4fad040.pdf', 'file_path' => '/app/uploads/63f26d51-a889-4c3b-b2fb-0a73b4fad040.pdf', 'title' => 'REPLY BRIEF IN SUPPORT OF MOTION TO MODIFY SCHEDULING ORDER', 'summary' => '', 'notes' => '', 'file_size' => 1273886, 'display_order' => 0, 'created_at' => '2025-11-13 20:36:00.392', 'updated_at' => '2025-11-13 20:36:00.392', 'mime_type' => 'application/pdf'],
|
||||
['id' => 67, 'docket_entry_id' => 75, 'original_filename' => 'REPLY BRIEF IN SUPPORT OF MOTION FOR ADDITIONAL DISCOVERY TIME PURSUANT TO RULE 56(f).pdf', 'stored_filename' => 'fd705e60-4393-4262-a231-4d43fa6ccc7e.pdf', 'file_path' => '/app/uploads/fd705e60-4393-4262-a231-4d43fa6ccc7e.pdf', 'title' => 'REPLY BRIEF IN SUPPORT OF MOTION FOR ADDITIONAL DISCOVERY TIME PURSUANT TO RULE 56(f)', 'summary' => '', 'notes' => '', 'file_size' => 1293569, 'display_order' => 0, 'created_at' => '2025-11-13 20:39:05.692', 'updated_at' => '2025-11-13 20:39:05.692', 'mime_type' => 'application/pdf'],
|
||||
['id' => 68, 'docket_entry_id' => 76, 'original_filename' => 'REPLY BRIEF IN SUPPORT OF MOTION TO COMPEL DISCOVERY.pdf', 'stored_filename' => '1161cce9-3ebb-40e5-a9dd-b45db293fdf5.pdf', 'file_path' => '/app/uploads/1161cce9-3ebb-40e5-a9dd-b45db293fdf5.pdf', 'title' => 'REPLY BRIEF IN SUPPORT OF MOTION TO COMPEL DISCOVERY', 'summary' => '', 'notes' => '', 'file_size' => 1296325, 'display_order' => 0, 'created_at' => '2025-11-13 20:40:55.025', 'updated_at' => '2025-11-13 20:40:55.025', 'mime_type' => 'application/pdf'],
|
||||
];
|
||||
|
||||
================================================================================
|
||||
SUBSCRIPTIONS ARRAY:
|
||||
================================================================================
|
||||
$subscriptions = [
|
||||
['id' => 1, 'email' => 'chris@sigd.net', 'is_active' => true, 'unsubscribe_token' => 'b23fb3e1-2dff-4f81-a317-5d51b1049aa4', 'created_at' => '2025-06-25 21:38:03.618'],
|
||||
['id' => 2, 'email' => 'peanuts260@gmail.com', 'is_active' => true, 'unsubscribe_token' => '4bcbdf8a-7e8f-4bca-8a73-e25b0c9bfc02', 'created_at' => '2025-06-27 10:02:45.786'],
|
||||
['id' => 3, 'email' => 'Jana.Bifi@gmail.com', 'is_active' => true, 'unsubscribe_token' => 'f75a8d51-6281-4841-8be3-b1f2d88d1110', 'created_at' => '2025-06-27 16:32:28.778'],
|
||||
['id' => 4, 'email' => 'pinerusticnickel6895@gmail.com', 'is_active' => true, 'unsubscribe_token' => '587cb35e-9974-4c13-9076-6e1cc753faf2', 'created_at' => '2025-06-27 19:10:18.781'],
|
||||
['id' => 5, 'email' => 'surdus.law@gmail.com', 'is_active' => true, 'unsubscribe_token' => '5581d0b7-d8d5-4f04-a648-318bf2e12ba0', 'created_at' => '2025-06-27 21:56:18.553'],
|
||||
['id' => 6, 'email' => 'gmajabparis@gmail.com', 'is_active' => true, 'unsubscribe_token' => '861dd663-1b05-4cbe-8525-1c63ea234cde', 'created_at' => '2025-06-27 22:20:00.427'],
|
||||
['id' => 7, 'email' => 'wheeler6811@aol.com', 'is_active' => true, 'unsubscribe_token' => '7af79759-2c8f-464d-b3f0-e6807311f6dd', 'created_at' => '2025-06-28 03:31:46.426'],
|
||||
['id' => 8, 'email' => 'Jared@Allebest.com', 'is_active' => true, 'unsubscribe_token' => '464a7cef-ff03-4c01-8443-354fb296464e', 'created_at' => '2025-06-28 23:00:04.484'],
|
||||
['id' => 9, 'email' => 'kimanderson.ks@gmail.com', 'is_active' => true, 'unsubscribe_token' => '798ba07c-4d03-4afb-828c-df81c72650c2', 'created_at' => '2025-06-29 14:55:30.011'],
|
||||
['id' => 25, 'email' => 'tane.schulte@gmail.com', 'is_active' => true, 'unsubscribe_token' => 'a85a06d4-124e-4164-8459-51a5c68adbf5', 'created_at' => '2025-09-29 01:03:14.805'],
|
||||
['id' => 26, 'email' => 'trnelson89@gmail.com', 'is_active' => true, 'unsubscribe_token' => '5a3b50a5-d0c7-4441-a41e-c0b9a5075979', 'created_at' => '2025-10-24 16:27:59.56'],
|
||||
['id' => 27, 'email' => 'letsgetonacid222@gmail.com', 'is_active' => true, 'unsubscribe_token' => 'fac65b07-79d3-4165-aaca-84ec3332ae85', 'created_at' => '2025-10-28 16:18:00.457'],
|
||||
['id' => 28, 'email' => 'quarks.tattoo-09@icloud.com', 'is_active' => true, 'unsubscribe_token' => 'd8b53e7c-5a69-4670-85fe-604bc83813b2', 'created_at' => '2025-11-19 03:03:45.528'],
|
||||
['id' => 10, 'email' => 'ksymansky@gmail.com', 'is_active' => true, 'unsubscribe_token' => 'b87f9a94-5cc1-4d9f-ad77-a1be4eb038ea', 'created_at' => '2025-07-01 01:21:19.951'],
|
||||
['id' => 11, 'email' => 'martleonor@aol.com', 'is_active' => true, 'unsubscribe_token' => '816440d6-c7d5-4847-a50e-7ac621eb6f86', 'created_at' => '2025-07-01 07:11:02.288'],
|
||||
['id' => 12, 'email' => 'this1is3john@gmail.com', 'is_active' => true, 'unsubscribe_token' => 'd3b5b72e-11aa-400c-9e2c-92f315819b27', 'created_at' => '2025-07-01 12:22:58.44'],
|
||||
['id' => 13, 'email' => 'alexabauch@icloud.com', 'is_active' => true, 'unsubscribe_token' => 'f66410b0-3400-468e-87ee-34b84c40e35b', 'created_at' => '2025-07-03 04:16:47.928'],
|
||||
['id' => 14, 'email' => 'wsad.president@gmail.com', 'is_active' => true, 'unsubscribe_token' => '982a0119-ea37-4151-acb2-04c27802a8a4', 'created_at' => '2025-07-04 20:06:14.97'],
|
||||
['id' => 15, 'email' => 'deafwantstoknow@gmail.com', 'is_active' => true, 'unsubscribe_token' => '6c40ff30-1e7a-4c73-a188-d04055987b3f', 'created_at' => '2025-07-09 05:27:50.182'],
|
||||
['id' => 17, 'email' => 'sjthomp0615@gmail.com', 'is_active' => true, 'unsubscribe_token' => '00fe7ff3-b42b-4c95-8882-efe68d0970f0', 'created_at' => '2025-07-18 19:05:23.217'],
|
||||
['id' => 18, 'email' => 'eliza.kragh@gmail.com', 'is_active' => true, 'unsubscribe_token' => '9fe988b3-d317-4a01-bdf5-aed2895e17ba', 'created_at' => '2025-07-25 21:38:58.027'],
|
||||
['id' => 19, 'email' => 'harding.cara89@gmail.com', 'is_active' => true, 'unsubscribe_token' => '74018cc6-4c7a-43af-891e-4949d5925fca', 'created_at' => '2025-07-26 00:01:22.296'],
|
||||
['id' => 20, 'email' => 'rindelsd@gmail.com', 'is_active' => true, 'unsubscribe_token' => '01eb9061-8c20-4667-bd46-71e48e6dc384', 'created_at' => '2025-07-26 00:04:44.454'],
|
||||
['id' => 21, 'email' => 'kat_kariann@hotmail.com', 'is_active' => true, 'unsubscribe_token' => '25ea5299-03f0-49e2-b556-447215e6d05c', 'created_at' => '2025-07-26 12:15:14.048'],
|
||||
['id' => 22, 'email' => 'thejustinrold@gmail.com', 'is_active' => true, 'unsubscribe_token' => 'b13d4d6a-1b51-4ee1-9a77-d38115d51d0b', 'created_at' => '2025-07-26 23:37:15.978'],
|
||||
['id' => 23, 'email' => 'ritabrandborg@gmail.com', 'is_active' => true, 'unsubscribe_token' => 'a8fbc7d9-81ed-4047-bab1-8d304597d4dd', 'created_at' => '2025-07-28 12:37:30.323'],
|
||||
['id' => 24, 'email' => 'fullerkim777@icloud.com', 'is_active' => true, 'unsubscribe_token' => '4effbe07-04df-4371-87bf-15f14b90f90e', 'created_at' => '2025-07-28 22:46:53.302'],
|
||||
['id' => 16, 'email' => 'mike.crago@gmail.com', 'is_active' => false, 'unsubscribe_token' => 'd2db168b-7869-4340-8d7c-fded7fc357b8', 'created_at' => '2025-07-14 23:58:34.353'],
|
||||
];
|
||||
|
||||
✅ Done! Copy the arrays above into V1DataMigrationSeeder.php
|
||||
0
storage/v1-data.json
Normal file
0
storage/v1-data.json
Normal file
75
update_seeder.py
Normal file
75
update_seeder.py
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
#!/usr/bin/env python3
|
||||
"""
|
||||
Script to update V1DataMigrationSeeder.php with production data arrays from seeder_data.txt
|
||||
Also fixes file paths from /app/uploads/ to documents/
|
||||
"""
|
||||
|
||||
import re
|
||||
|
||||
# Read the seeder_data.txt file
|
||||
with open('seeder_data.txt', 'r') as f:
|
||||
content = f.read()
|
||||
|
||||
# Extract the three arrays using regex
|
||||
entries_match = re.search(r'DOCKET ENTRIES ARRAY:\s*={80,}\s*(\$entries = \[.*?\];)', content, re.DOTALL)
|
||||
documents_match = re.search(r'DOCUMENTS ARRAY:\s*={80,}\s*(\$documents = \[.*?\];)', content, re.DOTALL)
|
||||
subscriptions_match = re.search(r'SUBSCRIPTIONS ARRAY:\s*={80,}\s*(\$subscriptions = \[.*?\];)', content, re.DOTALL)
|
||||
|
||||
if not all([entries_match, documents_match, subscriptions_match]):
|
||||
print("❌ Error: Could not extract all arrays from seeder_data.txt")
|
||||
exit(1)
|
||||
|
||||
entries_array = entries_match.group(1)
|
||||
documents_array = documents_match.group(1)
|
||||
subscriptions_array = subscriptions_match.group(1)
|
||||
|
||||
# Fix file paths in documents array: /app/uploads/ -> documents/
|
||||
documents_array = documents_array.replace("'/app/uploads/", "'documents/")
|
||||
|
||||
print(f"✅ Extracted arrays:")
|
||||
print(f" - Docket entries: {entries_array.count('[')} items")
|
||||
print(f" - Documents: {documents_array.count('[')} items")
|
||||
print(f" - Subscriptions: {subscriptions_array.count('[')} items")
|
||||
print(f" - Fixed file paths: /app/uploads/ -> documents/")
|
||||
|
||||
# Read the current seeder file
|
||||
with open('database/seeders/V1DataMigrationSeeder.php', 'r') as f:
|
||||
seeder_content = f.read()
|
||||
|
||||
# Replace the arrays in the three methods
|
||||
# 1. Replace docket entries array
|
||||
seeder_content = re.sub(
|
||||
r'(private function importDocketEntries\(\): void\s*\{\s*)\$entries = \[.*?\];',
|
||||
r'\1' + entries_array,
|
||||
seeder_content,
|
||||
flags=re.DOTALL
|
||||
)
|
||||
|
||||
# 2. Replace documents array
|
||||
seeder_content = re.sub(
|
||||
r'(private function importDocuments\(\): void\s*\{\s*)\$documents = \[.*?\];',
|
||||
r'\1' + documents_array,
|
||||
seeder_content,
|
||||
flags=re.DOTALL
|
||||
)
|
||||
|
||||
# 3. Replace subscriptions array
|
||||
seeder_content = re.sub(
|
||||
r'(private function importSubscriptions\(\): void\s*\{\s*)\$subscriptions = \[.*?\];',
|
||||
r'\1' + subscriptions_array,
|
||||
seeder_content,
|
||||
flags=re.DOTALL
|
||||
)
|
||||
|
||||
# Update the info messages to remove "(sample - will add all X)"
|
||||
seeder_content = seeder_content.replace(" (sample - will add all 63)", "")
|
||||
seeder_content = seeder_content.replace(" (sample - will add all 28)", "")
|
||||
|
||||
# Write the updated seeder file
|
||||
with open('database/seeders/V1DataMigrationSeeder.php', 'w') as f:
|
||||
f.write(seeder_content)
|
||||
|
||||
print("✅ Updated V1DataMigrationSeeder.php successfully!")
|
||||
print("\nNext steps:")
|
||||
print("1. Run: php artisan db:seed --class=V1DataMigrationSeeder")
|
||||
print("2. Verify data in admin dashboard")
|
||||
81
update_seeder_v2.py
Normal file
81
update_seeder_v2.py
Normal file
|
|
@ -0,0 +1,81 @@
|
|||
#!/usr/bin/env python3
|
||||
"""
|
||||
Script to update V1DataMigrationSeeder.php with production data arrays from seeder_data_full.txt
|
||||
Also fixes file paths from /app/uploads/ to documents/
|
||||
"""
|
||||
|
||||
import re
|
||||
|
||||
# Read the seeder_data_full.txt file
|
||||
with open('seeder_data_full.txt', 'r') as f:
|
||||
content = f.read()
|
||||
|
||||
# Extract the three arrays using regex
|
||||
entries_match = re.search(r'DOCKET ENTRIES ARRAY:\s*={80,}\s*(\$entries = \[.*?\];)', content, re.DOTALL)
|
||||
documents_match = re.search(r'DOCUMENTS ARRAY:\s*={80,}\s*(\$documents = \[.*?\];)', content, re.DOTALL)
|
||||
subscriptions_match = re.search(r'SUBSCRIPTIONS ARRAY:\s*={80,}\s*(\$subscriptions = \[.*?\];)', content, re.DOTALL)
|
||||
|
||||
if not all([entries_match, documents_match, subscriptions_match]):
|
||||
print("❌ Error: Could not extract all arrays from seeder_data_full.txt")
|
||||
exit(1)
|
||||
|
||||
entries_array = entries_match.group(1)
|
||||
documents_array = documents_match.group(1)
|
||||
subscriptions_array = subscriptions_match.group(1)
|
||||
|
||||
# Fix file paths in documents array: /app/uploads/ -> documents/
|
||||
documents_array = documents_array.replace("'/app/uploads/", "'documents/")
|
||||
|
||||
# Count entries
|
||||
entries_count = entries_array.count("['id' =>")
|
||||
documents_count = documents_array.count("['id' =>")
|
||||
subscriptions_count = subscriptions_array.count("['id' =>")
|
||||
|
||||
print(f"✅ Extracted arrays:")
|
||||
print(f" - Docket entries: {entries_count} items")
|
||||
print(f" - Documents: {documents_count} items")
|
||||
print(f" - Subscriptions: {subscriptions_count} items")
|
||||
print(f" - Fixed file paths: /app/uploads/ -> documents/")
|
||||
|
||||
# Read the current seeder file
|
||||
with open('database/seeders/V1DataMigrationSeeder.php', 'r') as f:
|
||||
seeder_content = f.read()
|
||||
|
||||
# Replace the arrays in the three methods
|
||||
# 1. Replace docket entries array
|
||||
seeder_content = re.sub(
|
||||
r'(private function importDocketEntries\(\): void\s*\{\s*)\$entries = \[.*?\];',
|
||||
r'\1' + entries_array,
|
||||
seeder_content,
|
||||
flags=re.DOTALL
|
||||
)
|
||||
|
||||
# 2. Replace documents array
|
||||
seeder_content = re.sub(
|
||||
r'(private function importDocuments\(\): void\s*\{\s*)\$documents = \[.*?\];',
|
||||
r'\1' + documents_array,
|
||||
seeder_content,
|
||||
flags=re.DOTALL
|
||||
)
|
||||
|
||||
# 3. Replace subscriptions array
|
||||
seeder_content = re.sub(
|
||||
r'(private function importSubscriptions\(\): void\s*\{\s*)\$subscriptions = \[.*?\];',
|
||||
r'\1' + subscriptions_array,
|
||||
seeder_content,
|
||||
flags=re.DOTALL
|
||||
)
|
||||
|
||||
# Write the updated seeder file
|
||||
with open('database/seeders/V1DataMigrationSeeder.php', 'w') as f:
|
||||
f.write(seeder_content)
|
||||
|
||||
print("✅ Updated V1DataMigrationSeeder.php successfully!")
|
||||
print(f"\nExpected counts after import:")
|
||||
print(f" - Docket Entries: {entries_count}")
|
||||
print(f" - Documents: {documents_count}")
|
||||
print(f" - Subscriptions: {subscriptions_count}")
|
||||
print("\nNext steps:")
|
||||
print("1. Clear database: php artisan migrate:fresh --seed --seeder=AdminSeeder")
|
||||
print("2. Run migration: php artisan db:seed --class=V1DataMigrationSeeder")
|
||||
print("3. Verify data in admin dashboard")
|
||||
|
|
@ -17,4 +17,8 @@ export default defineConfig({
|
|||
},
|
||||
}),
|
||||
],
|
||||
server: {
|
||||
host: '127.0.0.1',
|
||||
port: 5173,
|
||||
},
|
||||
});
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue