Move Team, Security, and Webhooks under Meet Settings.
Deploy Ladill Meet / deploy (push) Successful in 50s

Drop them from the admin sidebar, surface Team on the settings page, remove
the unused branches message, and add Settings back-links on those screens.
This commit is contained in:
isaacclad
2026-07-16 00:25:26 +00:00
parent d940ac768e
commit 23e355259b
8 changed files with 26 additions and 30 deletions
@@ -4,7 +4,6 @@ namespace App\Http\Controllers\Meet;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Http\Controllers\Meet\Concerns\ScopesToAccount; use App\Http\Controllers\Meet\Concerns\ScopesToAccount;
use App\Models\Branch;
use App\Services\Meet\AuditLogger; use App\Services\Meet\AuditLogger;
use App\Services\Meet\MeetPermissions; use App\Services\Meet\MeetPermissions;
use App\Services\Meet\SecurityPolicyService; use App\Services\Meet\SecurityPolicyService;
@@ -23,14 +22,9 @@ class SettingsController extends Controller
$organization = $this->organization($request); $organization = $this->organization($request);
$canManage = app(MeetPermissions::class)->can($this->member($request), 'settings.manage'); $canManage = app(MeetPermissions::class)->can($this->member($request), 'settings.manage');
$branchCount = Branch::owned($this->ownerRef($request))
->where('organization_id', $organization->id)
->count();
return view('meet.settings.edit', [ return view('meet.settings.edit', [
'organization' => $organization, 'organization' => $organization,
'canManage' => $canManage, 'canManage' => $canManage,
'branchCount' => $branchCount,
'isAdmin' => app(MeetPermissions::class)->isAdmin($this->member($request)), 'isAdmin' => app(MeetPermissions::class)->isAdmin($this->member($request)),
'orgTypes' => [ 'orgTypes' => [
'business' => 'Business', 'business' => 'Business',
@@ -1,5 +1,8 @@
<x-app-layout title="Add member"> <x-app-layout title="Add member">
<div class="mx-auto max-w-lg"> <div class="mx-auto max-w-lg">
<div class="mb-4 text-sm text-slate-500">
<a href="{{ route('meet.members.index') }}" class="font-medium text-indigo-600 hover:text-indigo-800"> Team</a>
</div>
<h1 class="text-xl font-semibold text-slate-900">Invite team member</h1> <h1 class="text-xl font-semibold text-slate-900">Invite team member</h1>
<form method="POST" x-data action="{{ route('meet.members.store') }}" class="mt-6 space-y-4 rounded-2xl border border-slate-200 bg-white p-6"> <form method="POST" x-data action="{{ route('meet.members.store') }}" class="mt-6 space-y-4 rounded-2xl border border-slate-200 bg-white p-6">
@@ -36,16 +39,6 @@
</select> </select>
</div> </div>
<div>
<label class="block text-sm font-medium text-slate-700">Branch (optional)</label>
<select name="branch_id" class="mt-1 w-full rounded-lg border-slate-300 text-sm">
<option value="">All branches</option>
@foreach ($branches as $branch)
<option value="{{ $branch->id }}" @selected(old('branch_id') == $branch->id)>{{ $branch->name }}</option>
@endforeach
</select>
</div>
<button type="submit" class="btn-primary">Send invitation</button> <button type="submit" class="btn-primary">Send invitation</button>
</form> </form>
</div> </div>
@@ -1,4 +1,7 @@
<x-app-layout title="Team members"> <x-app-layout title="Team members">
<div class="mb-4 text-sm text-slate-500">
<a href="{{ route('meet.settings') }}" class="font-medium text-indigo-600 hover:text-indigo-800"> Settings</a>
</div>
<div class="flex items-center justify-between"> <div class="flex items-center justify-between">
<h1 class="text-xl font-semibold text-slate-900">Team members</h1> <h1 class="text-xl font-semibold text-slate-900">Team members</h1>
<a href="{{ route('meet.members.create') }}" class="btn-primary">Add member</a> <a href="{{ route('meet.members.create') }}" class="btn-primary">Add member</a>
@@ -7,7 +10,7 @@
<div class="mt-4 overflow-hidden rounded-2xl border border-slate-200 bg-white"> <div class="mt-4 overflow-hidden rounded-2xl border border-slate-200 bg-white">
<table class="min-w-full text-sm"> <table class="min-w-full text-sm">
<thead class="bg-slate-50 text-left text-xs uppercase text-slate-500"> <thead class="bg-slate-50 text-left text-xs uppercase text-slate-500">
<tr><th class="px-4 py-3">Member</th><th class="px-4 py-3">Role</th><th class="px-4 py-3">Branch</th><th class="px-4 py-3"></th></tr> <tr><th class="px-4 py-3">Member</th><th class="px-4 py-3">Role</th><th class="px-4 py-3"></th></tr>
</thead> </thead>
<tbody class="divide-y divide-slate-50"> <tbody class="divide-y divide-slate-50">
@foreach ($members as $member) @foreach ($members as $member)
@@ -19,7 +22,6 @@
<tr> <tr>
<td class="px-4 py-3 text-sm">{{ $display }}</td> <td class="px-4 py-3 text-sm">{{ $display }}</td>
<td class="px-4 py-3">{{ $roles[$member->role] ?? $member->role }}</td> <td class="px-4 py-3">{{ $roles[$member->role] ?? $member->role }}</td>
<td class="px-4 py-3">{{ $member->branch?->name ?? 'All branches' }}</td>
<td class="px-4 py-3 text-right"> <td class="px-4 py-3 text-right">
@if ($member->user_ref !== auth()->user()->public_id) @if ($member->user_ref !== auth()->user()->public_id)
<x-confirm-dialog <x-confirm-dialog
@@ -1,5 +1,8 @@
<x-app-layout title="Calendar"> <x-app-layout title="Calendar">
<x-settings.page title="Calendar integration" description="Sync scheduled meetings to your calendar."> <x-settings.page title="Calendar integration" description="Sync scheduled meetings to your calendar.">
<div class="mb-4 text-sm text-slate-500">
<a href="{{ route('meet.settings') }}" class="font-medium text-indigo-600 hover:text-indigo-800"> Settings</a>
</div>
<x-settings.card title="Connections"> <x-settings.card title="Connections">
<ul class="space-y-3 text-sm"> <ul class="space-y-3 text-sm">
<li class="flex flex-wrap items-center justify-between gap-3 rounded-xl border border-slate-100 bg-slate-50 px-4 py-3"> <li class="flex flex-wrap items-center justify-between gap-3 rounded-xl border border-slate-100 bg-slate-50 px-4 py-3">
+8 -3
View File
@@ -52,8 +52,15 @@
</form> </form>
@if ($isAdmin ?? false) @if ($isAdmin ?? false)
<x-settings.card title="Advanced" description="Security, calendar sync, and webhook integrations."> <x-settings.card title="Organization admin" description="Team access, security, calendar sync, and integrations.">
<ul class="space-y-3 text-sm"> <ul class="space-y-3 text-sm">
<li class="flex flex-wrap items-start justify-between gap-3 rounded-xl border border-slate-100 bg-slate-50 px-4 py-3">
<div>
<p class="font-semibold text-slate-900">Team</p>
<p class="mt-0.5 text-slate-600">Invite members and assign roles for this Meet organization.</p>
</div>
<a href="{{ route('meet.members.index') }}" class="shrink-0 font-semibold text-indigo-600 hover:text-indigo-700">Manage</a>
</li>
<li class="flex flex-wrap items-start justify-between gap-3 rounded-xl border border-slate-100 bg-slate-50 px-4 py-3"> <li class="flex flex-wrap items-start justify-between gap-3 rounded-xl border border-slate-100 bg-slate-50 px-4 py-3">
<div> <div>
<p class="font-semibold text-slate-900">Security policy</p> <p class="font-semibold text-slate-900">Security policy</p>
@@ -78,7 +85,5 @@
</ul> </ul>
</x-settings.card> </x-settings.card>
@endif @endif
<p class="text-sm text-slate-500">{{ $branchCount }} branch(es) configured.</p>
</x-settings.page> </x-settings.page>
</x-app-layout> </x-app-layout>
@@ -1,5 +1,8 @@
<x-app-layout title="Security settings"> <x-app-layout title="Security settings">
<x-settings.page title="Meeting security" description="Organization-wide defaults for {{ $organization->name }}."> <x-settings.page title="Meeting security" description="Organization-wide defaults for {{ $organization->name }}.">
<div class="mb-4 text-sm text-slate-500">
<a href="{{ route('meet.settings') }}" class="font-medium text-indigo-600 hover:text-indigo-800"> Settings</a>
</div>
<form method="POST" action="{{ route('meet.settings.security.update') }}"> <form method="POST" action="{{ route('meet.settings.security.update') }}">
@csrf @method('PUT') @csrf @method('PUT')
@@ -1,5 +1,8 @@
<x-app-layout title="Webhooks"> <x-app-layout title="Webhooks">
<x-settings.page title="Webhooks" description="Notify sibling Ladill apps when meetings change."> <x-settings.page title="Webhooks" description="Notify sibling Ladill apps when meetings change.">
<div class="mb-4 text-sm text-slate-500">
<a href="{{ route('meet.settings') }}" class="font-medium text-indigo-600 hover:text-indigo-800"> Settings</a>
</div>
<x-settings.card title="Add endpoint"> <x-settings.card title="Add endpoint">
<form method="POST" action="{{ route('meet.settings.webhooks.store') }}" class="space-y-4"> <form method="POST" action="{{ route('meet.settings.webhooks.store') }}" class="space-y-4">
@csrf @csrf
+2 -9
View File
@@ -40,19 +40,12 @@
if ($permissions->isAdmin($member)) { if ($permissions->isAdmin($member)) {
$adminNav[] = ['name' => 'Usage', 'route' => route('meet.admin.usage'), 'active' => request()->routeIs('meet.admin.*'), $adminNav[] = ['name' => 'Usage', 'route' => route('meet.admin.usage'), 'active' => request()->routeIs('meet.admin.*'),
'icon' => '<path stroke-linecap="round" stroke-linejoin="round" d="M12 6v12m-3-2.818.879.659c1.171.879 3.07.879 4.242 0 1.172-.879 1.172-2.303 0-3.182C13.536 12.219 12.768 12 12 12c-.725 0-1.45-.22-2.003-.659-1.106-.879-1.106-2.303 0-3.182s2.9-.879 4.006 0l.415.33M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />']; 'icon' => '<path stroke-linecap="round" stroke-linejoin="round" d="M12 6v12m-3-2.818.879.659c1.171.879 3.07.879 4.242 0 1.172-.879 1.172-2.303 0-3.182C13.536 12.219 12.768 12 12 12c-.725 0-1.45-.22-2.003-.659-1.106-.879-1.106-2.303 0-3.182s2.9-.879 4.006 0l.415.33M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />'];
$adminNav[] = ['name' => 'Security', 'route' => route('meet.settings.security'), 'active' => request()->routeIs('meet.settings.security*'),
'icon' => '<path stroke-linecap="round" stroke-linejoin="round" d="M9 12.75 11.25 15 15 9.75m-3-7.036A11.959 11.959 0 0 1 3.598 6 11.99 11.99 0 0 0 3 9.749c0 5.592 3.824 10.29 9 11.623 5.176-1.332 9-6.03 9-11.622 0-1.31-.21-2.571-.598-3.751h-.152c-3.196 0-6.1-1.248-8.25-3.285Z" />'];
$adminNav[] = ['name' => 'Calendar', 'route' => route('meet.settings.calendar'), 'active' => request()->routeIs('meet.settings.calendar*'),
'icon' => '<path stroke-linecap="round" stroke-linejoin="round" d="M6.75 3v2.25M17.25 3v2.25M3 18.75V7.5a2.25 2.25 0 0 1 2.25-2.25h13.5A2.25 2.25 0 0 1 21 7.5v11.25m-18 0A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75m-18 0v-7.5A2.25 2.25 0 0 1 5.25 9h13.5A2.25 2.25 0 0 1 21 11.25v7.5" />'];
$adminNav[] = ['name' => 'Webhooks', 'route' => route('meet.settings.webhooks'), 'active' => request()->routeIs('meet.settings.webhooks*'),
'icon' => '<path stroke-linecap="round" stroke-linejoin="round" d="M13.19 8.688a4.5 4.5 0 0 1 1.242 7.244l-4.5 4.5a4.5 4.5 0 0 1-6.364-6.364l1.757-1.757m13.35-.622 1.757-1.757a4.5 4.5 0 0 0-6.364-6.364l-4.5 4.5a4.5 4.5 0 0 0 1.242 7.244" />'];
$adminNav[] = ['name' => 'Contacts', 'route' => route('meet.contacts.groups'), 'active' => request()->routeIs('meet.contacts.*'), $adminNav[] = ['name' => 'Contacts', 'route' => route('meet.contacts.groups'), 'active' => request()->routeIs('meet.contacts.*'),
'icon' => '<path stroke-linecap="round" stroke-linejoin="round" d="M15 19.128a9.38 9.38 0 0 0 2.625.372 9.337 9.337 0 0 0 4.121-.952 4.125 4.125 0 0 0-7.533-2.493M15 19.128v-.003c0-1.113-.285-2.16-.786-3.07M15 19.128v.106A12.318 12.318 0 0 1 8.624 21c-2.331 0-4.512-.645-6.374-1.766l-.001-.109a6.375 6.375 0 0 1 11.964-3.07M12 6.375a3.375 3.375 0 1 1-6.75 0 3.375 3.375 0 0 1 6.75 0Zm8.25 2.25a2.625 2.625 0 1 1-5.25 0 2.625 2.625 0 0 1 5.25 0Z" />']; 'icon' => '<path stroke-linecap="round" stroke-linejoin="round" d="M15 19.128a9.38 9.38 0 0 0 2.625.372 9.337 9.337 0 0 0 4.121-.952 4.125 4.125 0 0 0-7.533-2.493M15 19.128v-.003c0-1.113-.285-2.16-.786-3.07M15 19.128v.106A12.318 12.318 0 0 1 8.624 21c-2.331 0-4.512-.645-6.374-1.766l-.001-.109a6.375 6.375 0 0 1 11.964-3.07M12 6.375a3.375 3.375 0 1 1-6.75 0 3.375 3.375 0 0 1 6.75 0Zm8.25 2.25a2.625 2.625 0 1 1-5.25 0 2.625 2.625 0 0 1 5.25 0Z" />'];
$adminNav[] = ['name' => 'Team', 'route' => route('meet.members.index'), 'active' => request()->routeIs('meet.members.*'),
'icon' => '<path stroke-linecap="round" stroke-linejoin="round" d="M18 18.72a9.094 9.094 0 0 0 3.741-.479 3 3 0 0 0-4.682-2.72m.94 3.198.001.031c0 .225-.012.447-.037.666A11.944 11.944 0 0 1 12 21c-2.17 0-4.207-.576-5.963-1.584A6.062 6.062 0 0 1 6 18.719m12 0a5.971 5.971 0 0 0-.941-3.197m0 0A5.995 5.995 0 0 0 12 12.75a5.995 5.995 0 0 0-5.058 2.772m0 0a3 3 0 0 0-4.681 2.72 8.986 8.986 0 0 0 3.74.477m.94-3.197a5.971 5.971 0 0 0-.94 3.197M15 6.75a3 3 0 1 1-6 0 3 3 0 0 1 6 0Zm6 3a2.25 2.25 0 1 1-4.5 0 2.25 2.25 0 0 1 4.5 0Zm-13.5 0a2.25 2.25 0 1 1-4.5 0 2.25 2.25 0 0 1 4.5 0Z" />'];
} }
$settingsActive = request()->routeIs('meet.settings*'); // Team, Security, Calendar, and Webhooks live under Settings (not as top-level admin items).
$settingsActive = request()->routeIs('meet.settings*', 'meet.members.*');
@endphp @endphp
<nav class="flex-1 space-y-0.5 overflow-y-auto px-3 py-4"> <nav class="flex-1 space-y-0.5 overflow-y-auto px-3 py-4">