Files
ladill-care/resources/views/care/integrations/edit.blade.php
T
isaaccladandCursor 30b96b3956
Deploy Ladill Care / deploy (push) Successful in 49s
Replace native browser confirms with Ladill confirm dialogs.
Appointment cancel and other destructive actions now use the shared modal UI instead of window.confirm.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-12 17:51:13 +00:00

133 lines
8.3 KiB
PHP

<x-app-layout title="Integrations">
<x-settings.page title="Messaging integrations">
<p class="text-sm text-slate-600">
Connect your own <a href="https://sms.ladill.com" target="_blank" rel="noopener" class="text-teal-700 underline">Ladill SMS</a>
and <a href="https://bird.ladill.com" target="_blank" rel="noopener" class="text-teal-700 underline">Ladill Bird</a>
API keys so patient messages bill your wallets and send under your brand.
</p>
@if (! $canManage)
<p class="mt-4 rounded-lg border border-amber-200 bg-amber-50 px-4 py-3 text-sm text-amber-800">You can view integrations, but only admins can change credentials.</p>
@endif
<div class="mt-6 space-y-6">
<x-settings.card title="Ladill SMS" description="Paste an SMS API key (lsk_sms_live_…) and an approved sender ID from sms.ladill.com.">
@if ($credential->hasValidSms())
<div class="mb-4 rounded-lg border border-emerald-200 bg-emerald-50 px-3 py-2 text-sm text-emerald-800">
Connected · key {{ $credential->sms_api_key_prefix }} · sender <strong>{{ $credential->sms_sender_id }}</strong>
@if ($credential->sms_validated_at)
· validated {{ $credential->sms_validated_at->diffForHumans() }}
@endif
</div>
@elseif ($credential->sms_status === \App\Models\MessagingCredential::STATUS_INVALID)
<div class="mb-4 rounded-lg border border-rose-200 bg-rose-50 px-3 py-2 text-sm text-rose-800">
{{ $credential->sms_last_error ?: 'SMS credentials are invalid.' }}
</div>
@endif
@if ($canManage)
<form method="POST" action="{{ route('care.integrations.sms.save') }}" class="space-y-4">
@csrf
<div>
<label class="block text-sm font-medium text-slate-700">SMS API key</label>
<input type="password" name="sms_api_key" autocomplete="off" required
placeholder="lsk_sms_live_…"
class="mt-1 w-full rounded-lg border-slate-300 font-mono text-sm">
</div>
<div>
<label class="block text-sm font-medium text-slate-700">Sender ID</label>
<input type="text" name="sms_sender_id" maxlength="11" required
value="{{ old('sms_sender_id', $credential->sms_sender_id) }}"
placeholder="Approved sender ID"
class="mt-1 w-full rounded-lg border-slate-300 text-sm">
<p class="mt-1 text-xs text-slate-500">Must match an approved sender ID on your SMS service (or the platform default).</p>
</div>
<div class="flex flex-wrap gap-2">
<button type="submit" class="btn-primary">Validate &amp; save</button>
</div>
</form>
@if ($credential->sms_api_key_encrypted || $credential->hasValidSms())
<div class="mt-3">
<x-confirm-dialog
name="disconnect-sms"
title="Disconnect Ladill SMS?"
message="Patient SMS will stop working until you connect a new key."
:action="route('care.integrations.sms.disconnect')"
confirm-label="Disconnect SMS"
>
<x-slot:trigger>
<button type="button" class="text-sm text-rose-700 hover:underline">Disconnect SMS</button>
</x-slot:trigger>
</x-confirm-dialog>
</div>
@endif
@endif
</x-settings.card>
<x-settings.card title="Ladill Bird" description="Paste a Bird API key (lsk_live_…) plus a from address on a verified domain from bird.ladill.com.">
@if ($credential->hasValidBird())
<div class="mb-4 rounded-lg border border-emerald-200 bg-emerald-50 px-3 py-2 text-sm text-emerald-800">
Connected · key {{ $credential->bird_api_key_prefix }} · from
<strong>{{ $credential->bird_from_name ? $credential->bird_from_name.' <'.$credential->bird_from_email.'>' : $credential->bird_from_email }}</strong>
@if ($credential->bird_validated_at)
· validated {{ $credential->bird_validated_at->diffForHumans() }}
@endif
</div>
@elseif ($credential->bird_status === \App\Models\MessagingCredential::STATUS_INVALID)
<div class="mb-4 rounded-lg border border-rose-200 bg-rose-50 px-3 py-2 text-sm text-rose-800">
{{ $credential->bird_last_error ?: 'Bird credentials are invalid.' }}
</div>
@endif
@if ($canManage)
<form method="POST" action="{{ route('care.integrations.bird.save') }}" class="space-y-4">
@csrf
<div>
<label class="block text-sm font-medium text-slate-700">Bird API key</label>
<input type="password" name="bird_api_key" autocomplete="off" required
placeholder="lsk_live_…"
class="mt-1 w-full rounded-lg border-slate-300 font-mono text-sm">
</div>
<div>
<label class="block text-sm font-medium text-slate-700">From email</label>
<input type="email" name="bird_from_email" required
value="{{ old('bird_from_email', $credential->bird_from_email) }}"
placeholder="clinic@yourdomain.com"
class="mt-1 w-full rounded-lg border-slate-300 text-sm">
</div>
<div>
<label class="block text-sm font-medium text-slate-700">From name</label>
<input type="text" name="bird_from_name" maxlength="100"
value="{{ old('bird_from_name', $credential->bird_from_name) }}"
placeholder="{{ $organization->name }}"
class="mt-1 w-full rounded-lg border-slate-300 text-sm">
</div>
<div class="flex flex-wrap gap-2">
<button type="submit" class="btn-primary">Validate &amp; save</button>
</div>
</form>
@if ($credential->bird_api_key_encrypted || $credential->hasValidBird())
<div class="mt-3">
<x-confirm-dialog
name="disconnect-bird"
title="Disconnect Ladill Bird?"
message="Patient email will stop working until you connect a new key."
:action="route('care.integrations.bird.disconnect')"
confirm-label="Disconnect Bird"
>
<x-slot:trigger>
<button type="button" class="text-sm text-rose-700 hover:underline">Disconnect Bird</button>
</x-slot:trigger>
</x-confirm-dialog>
</div>
@endif
@endif
</x-settings.card>
</div>
<p class="mt-6 text-sm text-slate-500">
<a href="{{ route('care.settings') }}" class="text-teal-700 underline"> Back to facility settings</a>
</p>
</x-settings.page>
</x-app-layout>