fix: 提醒流程指引页面等待图片上传完成
This commit is contained in:
@@ -2,7 +2,7 @@
|
|||||||
<link rel="stylesheet" href="{{ asset('vendor/drawflow/drawflow.min.css') }}">
|
<link rel="stylesheet" href="{{ asset('vendor/drawflow/drawflow.min.css') }}">
|
||||||
<script src="{{ asset('vendor/drawflow/drawflow.min.js') }}"></script>
|
<script src="{{ asset('vendor/drawflow/drawflow.min.js') }}"></script>
|
||||||
|
|
||||||
<div class="guide-flow-page space-y-4">
|
<div class="guide-flow-page space-y-4" data-guide-flow-component-id="{{ $this->getId() }}">
|
||||||
{{-- Header actions --}}
|
{{-- Header actions --}}
|
||||||
<div class="flex gap-2">
|
<div class="flex gap-2">
|
||||||
{{ $this->createPageAction }}
|
{{ $this->createPageAction }}
|
||||||
@@ -195,6 +195,7 @@
|
|||||||
<script>
|
<script>
|
||||||
(function () {
|
(function () {
|
||||||
const componentId = @js($this->getId());
|
const componentId = @js($this->getId());
|
||||||
|
const pendingImageSelector = 'figure[data-trix-attachment][data-trix-serialize="false"][data-trix-content-type^="image/"]';
|
||||||
|
|
||||||
function escHtml(str) {
|
function escHtml(str) {
|
||||||
return String(str)
|
return String(str)
|
||||||
@@ -202,6 +203,58 @@
|
|||||||
.replace(/>/g,'>').replace(/"/g,'"');
|
.replace(/>/g,'>').replace(/"/g,'"');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getGuideFlowComponentId() {
|
||||||
|
return document.querySelector('.guide-flow-page[data-guide-flow-component-id]')?.dataset.guideFlowComponentId ?? null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function hasPendingImageUploads(form) {
|
||||||
|
if (!form?.querySelector('.fi-fo-rich-editor')) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return form.querySelector(pendingImageSelector) !== null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function notifyPendingImageUploads() {
|
||||||
|
if (typeof window.FilamentNotification !== 'function') {
|
||||||
|
window.alert('图片仍在上传,请等待上传完成后再保存。');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
new window.FilamentNotification()
|
||||||
|
.title('图片未上传完成')
|
||||||
|
.body('请等待图片上传完成后再保存。')
|
||||||
|
.warning()
|
||||||
|
.send();
|
||||||
|
}
|
||||||
|
|
||||||
|
function registerUploadReminder() {
|
||||||
|
if (window.__guideFlowUploadReminderRegistered) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
window.__guideFlowUploadReminderRegistered = true;
|
||||||
|
|
||||||
|
document.addEventListener('submit', (event) => {
|
||||||
|
const form = event.target;
|
||||||
|
const activeComponentId = getGuideFlowComponentId();
|
||||||
|
|
||||||
|
if (!(form instanceof HTMLFormElement) || !activeComponentId) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const actionModal = form.querySelector(`[data-fi-modal-id="${activeComponentId}-action"]`);
|
||||||
|
|
||||||
|
if (!actionModal || !hasPendingImageUploads(form)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
event.preventDefault();
|
||||||
|
event.stopImmediatePropagation();
|
||||||
|
notifyPendingImageUploads();
|
||||||
|
}, true);
|
||||||
|
}
|
||||||
|
|
||||||
function ensureArrowMarker() {
|
function ensureArrowMarker() {
|
||||||
if (document.getElementById('df-arrow-defs')) return;
|
if (document.getElementById('df-arrow-defs')) return;
|
||||||
const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
|
const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
|
||||||
@@ -413,12 +466,16 @@
|
|||||||
|
|
||||||
document.addEventListener('DOMContentLoaded', () => {
|
document.addEventListener('DOMContentLoaded', () => {
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
|
registerUploadReminder();
|
||||||
registerLivewireListener();
|
registerLivewireListener();
|
||||||
init();
|
init();
|
||||||
}, 50);
|
}, 50);
|
||||||
});
|
});
|
||||||
document.addEventListener('livewire:navigated', () => {
|
document.addEventListener('livewire:navigated', () => {
|
||||||
setTimeout(init, 50);
|
setTimeout(() => {
|
||||||
|
registerUploadReminder();
|
||||||
|
init();
|
||||||
|
}, 50);
|
||||||
});
|
});
|
||||||
})();
|
})();
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
45
tests/Feature/ManageGuidePagesUploadReminderTest.php
Normal file
45
tests/Feature/ManageGuidePagesUploadReminderTest.php
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Tests\Feature;
|
||||||
|
|
||||||
|
use App\Filament\Resources\GuideResource;
|
||||||
|
use App\Models\Guide;
|
||||||
|
use App\Models\User;
|
||||||
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||||
|
use PHPUnit\Framework\Attributes\Test;
|
||||||
|
use Spatie\Permission\Models\Permission;
|
||||||
|
use Tests\TestCase;
|
||||||
|
|
||||||
|
class ManageGuidePagesUploadReminderTest extends TestCase
|
||||||
|
{
|
||||||
|
use RefreshDatabase;
|
||||||
|
|
||||||
|
#[Test]
|
||||||
|
public function it_renders_the_pending_image_upload_save_reminder_on_manage_guide_pages(): void
|
||||||
|
{
|
||||||
|
config(['app.env' => 'local']);
|
||||||
|
|
||||||
|
$user = User::factory()->create();
|
||||||
|
|
||||||
|
Permission::findOrCreate('guide.view', 'web');
|
||||||
|
Permission::findOrCreate('guide.update', 'web');
|
||||||
|
$user->givePermissionTo(['guide.view', 'guide.update']);
|
||||||
|
|
||||||
|
$guide = Guide::create([
|
||||||
|
'name' => '测试指引',
|
||||||
|
'category' => 'operation',
|
||||||
|
'status' => 'draft',
|
||||||
|
'created_by' => $user->id,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$response = $this
|
||||||
|
->actingAs($user)
|
||||||
|
->get(GuideResource::getUrl('manage-pages', ['record' => $guide]));
|
||||||
|
|
||||||
|
$response->assertOk();
|
||||||
|
$response->assertSee('data-guide-flow-component-id="', false);
|
||||||
|
$response->assertSee('hasPendingImageUploads', false);
|
||||||
|
$response->assertSee('图片仍在上传,请等待上传完成后再保存。');
|
||||||
|
$response->assertSee('图片未上传完成');
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user