Add HL3D branding, Etsy Live/Draft paging and Projects lifecycle
Deploy HickLab3D Dashboard / Deploy to production (push) Failing after 23s

Replace the old touchmark/PNG identity with the supplied lockup and
monogram, segmented role-aware navigation, Live/Draft listing filters
with generation-based cache invalidation, and admin Projects covering
immutable file revisions, listing live pointers, and exact-decimal
filament/packaging/shipping costing. Additive schema only; no Etsy
publication. Isolated clone tests: 301 tests, 1162 assertions.
This commit is contained in:
2026-11-08 12:50:56 +00:00
parent c8c5822166
commit d4928789c4
83 changed files with 5808 additions and 84 deletions
+21
View File
@@ -10,6 +10,12 @@ use App\Http\Controllers\IntegrationSettingsController;
use App\Http\Controllers\NotificationController;
use App\Http\Controllers\Parcel2GoConnectionController;
use App\Http\Controllers\PrinterController;
use App\Http\Controllers\ProjectController;
use App\Http\Controllers\ProjectCostSnapshotController;
use App\Http\Controllers\ProjectFileController;
use App\Http\Controllers\ProjectListingLinkController;
use App\Http\Controllers\ProjectReleaseController;
use App\Http\Controllers\ProjectRevisionController;
use App\Http\Controllers\ScheduleSettingsController;
use App\Http\Controllers\ShippingController;
use App\Http\Controllers\UserController;
@@ -49,6 +55,21 @@ Route::middleware(['auth', EnsureAccountActive::class])->group(function (): void
Route::get('/dryer/status', [DryerController::class, 'status'])->name('dryer.status');
Route::post('/dryer/control', [DryerController::class, 'control'])->name('dryer.control');
Route::post('/dryer/faults/acknowledge', [DryerController::class, 'acknowledge'])->name('dryer.acknowledge');
Route::get('/projects', [ProjectController::class, 'index'])->name('projects.index');
Route::get('/projects/create', [ProjectController::class, 'create'])->name('projects.create');
Route::post('/projects', [ProjectController::class, 'store'])->name('projects.store');
Route::get('/projects/{project}', [ProjectController::class, 'show'])->name('projects.show');
Route::get('/projects/{project}/edit', [ProjectController::class, 'edit'])->name('projects.edit');
Route::patch('/projects/{project}', [ProjectController::class, 'update'])->name('projects.update');
Route::post('/projects/{project}/archive', [ProjectController::class, 'archive'])->name('projects.archive');
Route::post('/projects/{project}/revisions', [ProjectRevisionController::class, 'store'])->name('projects.revisions.store');
Route::post('/projects/{project}/revisions/{revision}/approve', [ProjectRevisionController::class, 'approve'])->name('projects.revisions.approve');
Route::get('/projects/{project}/files/{file}/download', [ProjectFileController::class, 'download'])->name('projects.files.download');
Route::post('/projects/{project}/listings', [ProjectListingLinkController::class, 'store'])->name('projects.listings.store');
Route::delete('/projects/{project}/listings/{listingLink}', [ProjectListingLinkController::class, 'destroy'])->name('projects.listings.destroy');
Route::post('/projects/{project}/cost-snapshots', [ProjectCostSnapshotController::class, 'store'])->name('projects.cost-snapshots.store');
Route::post('/projects/{project}/listings/{listingLink}/release', [ProjectReleaseController::class, 'store'])->name('projects.listings.release');
Route::post('/projects/{project}/listings/{listingLink}/revert', [ProjectReleaseController::class, 'revert'])->name('projects.listings.revert');
Route::get('/users', [UserController::class, 'index'])->name('users.index');
Route::post('/users', [UserController::class, 'store'])->name('users.store');
Route::patch('/users/{user}', [UserController::class, 'update'])->name('users.update');