diff --git a/app/Entities/Tools/PageEditActivity.php b/app/Entities/Tools/PageEditActivity.php index a88dea830..2e620aa2c 100644 --- a/app/Entities/Tools/PageEditActivity.php +++ b/app/Entities/Tools/PageEditActivity.php @@ -43,6 +43,16 @@ class PageEditActivity return trans('entities.pages_draft_edit_active.message', ['start' => $userMessage, 'time' => $timeMessage]); } + /** + * Check if the page has been updated since the draft has been saved. + * + * @return bool + */ + public function hasPageBeenUpdatedSinceDraftSaved(PageRevision $draft): bool + { + return $draft->page->updated_at->timestamp >= $draft->updated_at->timestamp; + } + /** * Get the message to show when the user will be editing one of their drafts. * diff --git a/app/Http/Controllers/PageController.php b/app/Http/Controllers/PageController.php index 853ac28fc..4818b5211 100644 --- a/app/Http/Controllers/PageController.php +++ b/app/Http/Controllers/PageController.php @@ -258,6 +258,23 @@ class PageController extends Controller return $this->jsonError(trans('errors.guests_cannot_save_drafts'), 500); } + // Check for active editing or time conflict + $warnings = []; + $jsonResponseWarning = ''; + $editActivity = new PageEditActivity($page); + if ($editActivity->hasActiveEditing()) { + $warnings[] = $editActivity->activeEditingMessage(); + } + $userDraft = $this->pageRepo->getUserDraft($page); + if ($userDraft !== null) { + if ($editActivity->hasPageBeenUpdatedSinceDraftSaved($userDraft)) { + $warnings[] = $editActivity->getEditingActiveDraftMessage($userDraft); + } + } + if (count($warnings) > 0) { + $jsonResponseWarning = implode("\n", $warnings); + } + $draft = $this->pageRepo->updatePageDraft($page, $request->only(['name', 'html', 'markdown'])); $updateTime = $draft->updated_at->timestamp; @@ -265,6 +282,7 @@ class PageController extends Controller return response()->json([ 'status' => 'success', 'message' => trans('entities.pages_edit_draft_save_at'), + 'warning' => $jsonResponseWarning, 'timestamp' => $updateTime, ]); } diff --git a/resources/js/components/page-editor.js b/resources/js/components/page-editor.js index f66e23b19..e753b58e1 100644 --- a/resources/js/components/page-editor.js +++ b/resources/js/components/page-editor.js @@ -119,6 +119,9 @@ class PageEditor { } this.draftNotifyChange(`${resp.data.message} ${Dates.utcTimeStampToLocalTime(resp.data.timestamp)}`); this.autoSave.last = Date.now(); + if (resp.data.warning.length > 0) { + window.$events.emit('warning', resp.data.warning); + } } catch (err) { // Save the editor content in LocalStorage as a last resort, just in case. try {