feat: add CopyAssignmentLinkAction and CopyAttendanceLinkAction for sharing assignment and attendance links

This commit is contained in:
Yoga Pangestu 2026-03-30 14:17:33 +07:00
parent ca90c308f1
commit 7bebb127eb
4 changed files with 96 additions and 10 deletions

View File

@ -0,0 +1,40 @@
<?php
namespace App\Filament\Resources\Learning\ClassSessions\Actions;
use App\Filament\Support\SystemNotification;
use App\Models\ClassSession;
use Filament\Actions\Action;
class CopyAssignmentLinkAction extends Action
{
public static function getDefaultName(): ?string
{
return 'copyAssignmentLink';
}
protected function setUp(): void
{
parent::setUp();
$this->label('Salin Tautan')
->color('gray')
->icon('heroicon-o-clipboard-document')
->action(function (array $arguments, $livewire) {
$course = $livewire->course;
$session = ClassSession::find($arguments['session'] ?? null);
$url = route('share.assignment', [
'course' => $course->id,
'session_id' => $session ? $session->id : null,
]);
$livewire->js("if (navigator.clipboard) { navigator.clipboard.writeText('{$url}').catch(() => {}); }");
SystemNotification::success(
'Tautan Berhasil Disalin ✨',
'Tautan telah disalin ke clipboard dan siap untuk dibagikan.'
)->send();
});
}
}

View File

@ -0,0 +1,38 @@
<?php
namespace App\Filament\Resources\Learning\ClassSessions\Actions;
use App\Filament\Support\SystemNotification;
use App\Models\ClassSession;
use Filament\Actions\Action;
class CopyAttendanceLinkAction extends Action
{
public static function getDefaultName(): ?string
{
return 'copyAttendanceLink';
}
protected function setUp(): void
{
parent::setUp();
$this->label('Salin Tautan')
->color('gray')
->icon('heroicon-o-clipboard-document')
->action(function (array $arguments, $livewire) {
$course = $livewire->course;
$session = ClassSession::find($arguments['session'] ?? null);
$date = $session ? $session->date->toDateString() : null;
$url = route('share.attendance', ['course' => $course->id, 'date' => $date]);
$livewire->js("if (navigator.clipboard) { navigator.clipboard.writeText('{$url}').catch(() => {}); }");
SystemNotification::success(
'Tautan Berhasil Disalin ✨',
'Tautan telah disalin ke clipboard dan siap untuk dibagikan.'
)->send();
});
}
}

View File

@ -21,9 +21,17 @@ protected function setUp(): void
->icon('heroicon-o-paper-airplane')
->color(Color::Fuchsia)
->link()
->requiresConfirmation()
->modalIcon('heroicon-o-paper-airplane')
->modalHeading('Bagikan Info Tugas')
->modalDescription('Pilih metode untuk membagikan tautan publik status pengumpulan tugas sesi ini.')
->modalSubmitActionLabel('Ke WhatsApp')
->modalCancelAction(false)
->extraModalFooterActions([
CopyAssignmentLinkAction::make(),
])
->action(function (array $arguments, $livewire) {
$course = $livewire->course;
$session = ClassSession::find($arguments['session'] ?? null);
$url = route('share.assignment', [
@ -39,10 +47,6 @@ protected function setUp(): void
<<<JS
const text = {$escapedText};
const url = 'https://wa.me/?text=' + encodeURIComponent(text);
if (navigator.clipboard) {
navigator.clipboard.writeText(text).catch(() => {});
}
window.open(url, '_blank');
JS
);

View File

@ -21,9 +21,17 @@ protected function setUp(): void
->icon('heroicon-o-share')
->color(Color::Teal)
->link()
->requiresConfirmation()
->modalIcon('heroicon-o-share')
->modalHeading('Bagikan Info Presensi')
->modalDescription('Pilih metode untuk membagikan tautan publik status presensi sesi ini.')
->modalSubmitActionLabel('Ke WhatsApp')
->modalCancelAction(false)
->extraModalFooterActions([
CopyAttendanceLinkAction::make(),
])
->action(function (array $arguments, $livewire) {
$course = $livewire->course;
$session = ClassSession::find($arguments['session'] ?? null);
$date = $session ? $session->date->toDateString() : null;
@ -37,10 +45,6 @@ protected function setUp(): void
<<<JS
const text = {$escapedText};
const url = 'https://wa.me/?text=' + encodeURIComponent(text);
if (navigator.clipboard) {
navigator.clipboard.writeText(text).catch(() => {});
}
window.open(url, '_blank');
JS
);