Add Campaigns module for grouping short links.
Deploy Ladill Link / deploy (push) Successful in 1m26s

Let accounts organise links by promo or launch, attach or detach links, and view combined click totals from the sidebar.
This commit is contained in:
isaacclad
2026-07-16 20:43:11 +00:00
parent 32a174c826
commit f45fdcd159
13 changed files with 702 additions and 2 deletions
@@ -0,0 +1,42 @@
<div>
<label for="name" class="block text-sm font-medium text-slate-700">Name</label>
<input type="text" name="name" id="name" required value="{{ old('name', $campaign->name) }}"
class="mt-1 block w-full rounded-lg border-slate-300 shadow-sm focus:border-emerald-500 focus:ring-emerald-500"
placeholder="e.g. Product launch · April">
@error('name')<p class="mt-1 text-sm text-red-600">{{ $message }}</p>@enderror
</div>
<div>
<label for="description" class="block text-sm font-medium text-slate-700">Description <span class="font-normal text-slate-400">(optional)</span></label>
<textarea name="description" id="description" rows="3"
class="mt-1 block w-full rounded-lg border-slate-300 shadow-sm focus:border-emerald-500 focus:ring-emerald-500"
placeholder="What this campaign is for">{{ old('description', $campaign->description) }}</textarea>
@error('description')<p class="mt-1 text-sm text-red-600">{{ $message }}</p>@enderror
</div>
<div>
<label for="status" class="block text-sm font-medium text-slate-700">Status</label>
<select name="status" id="status" class="mt-1 block w-full rounded-lg border-slate-300 shadow-sm focus:border-emerald-500 focus:ring-emerald-500">
@foreach (\App\Models\Campaign::STATUSES as $value => $label)
<option value="{{ $value }}" @selected(old('status', $campaign->status ?? 'active') === $value)>{{ $label }}</option>
@endforeach
</select>
@error('status')<p class="mt-1 text-sm text-red-600">{{ $message }}</p>@enderror
</div>
<div class="grid gap-4 sm:grid-cols-2">
<div>
<label for="starts_at" class="block text-sm font-medium text-slate-700">Starts <span class="font-normal text-slate-400">(optional)</span></label>
<input type="date" name="starts_at" id="starts_at"
value="{{ old('starts_at', optional($campaign->starts_at)->format('Y-m-d')) }}"
class="mt-1 block w-full rounded-lg border-slate-300 shadow-sm focus:border-emerald-500 focus:ring-emerald-500">
@error('starts_at')<p class="mt-1 text-sm text-red-600">{{ $message }}</p>@enderror
</div>
<div>
<label for="ends_at" class="block text-sm font-medium text-slate-700">Ends <span class="font-normal text-slate-400">(optional)</span></label>
<input type="date" name="ends_at" id="ends_at"
value="{{ old('ends_at', optional($campaign->ends_at)->format('Y-m-d')) }}"
class="mt-1 block w-full rounded-lg border-slate-300 shadow-sm focus:border-emerald-500 focus:ring-emerald-500">
@error('ends_at')<p class="mt-1 text-sm text-red-600">{{ $message }}</p>@enderror
</div>
</div>