diff --git a/resources/js/admin/user-editor.js b/resources/js/admin/user-editor.js new file mode 100644 index 0000000..1a770da --- /dev/null +++ b/resources/js/admin/user-editor.js @@ -0,0 +1,73 @@ +// 用户后台编辑 Alpine 组件,负责编辑弹窗提交、状态提示和保存中状态。 + +/** + * 读取 CSRF 令牌,供用户编辑 AJAX 请求使用。 + * + * @returns {string} + */ +function getCsrfToken() { + return document.querySelector('meta[name="csrf-token"]')?.getAttribute("content") ?? ""; +} + +/** + * 注册用户编辑弹窗组件。 + * + * @returns {void} + */ +function registerUserEditorComponent() { + document.addEventListener("alpine:init", () => { + window.Alpine.data("userEditor", () => ({ + showEditModal: false, + editingUser: {}, + editToast: false, + editToastOk: true, + editToastMsg: "", + editSaving: false, + + /** + * 提交用户编辑表单,并用弹窗内提示反馈保存结果。 + * + * @param {HTMLFormElement} formEl + * @returns {Promise} + */ + async submitEditUser(formEl) { + this.editSaving = true; + this.editToast = false; + + const formData = new FormData(formEl); + formData.append("_method", "PUT"); + + try { + const response = await fetch(this.editingUser.requestUrl, { + method: "POST", + headers: { + Accept: "application/json", + "X-CSRF-TOKEN": getCsrfToken(), + }, + body: formData, + }); + const json = await response.json(); + + this.editToastOk = json.status === "success"; + this.editToastMsg = json.message || (json.status === "success" ? "保存成功!" : "保存失败"); + this.editToast = true; + + if (json.status === "success") { + window.setTimeout(() => { + this.showEditModal = false; + }, 1500); + } + } catch (error) { + this.editToastOk = false; + this.editToastMsg = "网络请求异常,请检查连接后重试。"; + this.editToast = true; + console.error("Edit User Request Failed:", error); + } finally { + this.editSaving = false; + } + }, + })); + }); +} + +registerUserEditorComponent(); diff --git a/resources/js/app.js b/resources/js/app.js index 5334389..94ac488 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -11,6 +11,7 @@ import { bindAdminOpsControls } from './admin/ops.js'; import './admin/positions-inline-patch.js'; import { bindAdminRoomControls } from './admin/rooms.js'; import { bindAdminSignInRulesControls } from './admin/sign-in-rules.js'; +import './admin/user-editor.js'; // 后台共用入口只注册轻量事件代理,具体页面通过 data-* 属性决定是否响应。 bindAdminAiProvidersControls(); diff --git a/resources/views/admin/users/index.blade.php b/resources/views/admin/users/index.blade.php index 9fa3b21..a6215e1 100644 --- a/resources/views/admin/users/index.blade.php +++ b/resources/views/admin/users/index.blade.php @@ -321,57 +321,4 @@ - - @endsection