(function (root, factory) { if (typeof module === 'object' && module.exports) { module.exports = factory(root); return; } root.MemoPages = factory(root); if (root.document) { root.document.addEventListener('DOMContentLoaded', function () { root.MemoPages.init(); }); } })(typeof globalThis !== 'undefined' ? globalThis : window, function (root) { 'use strict'; var documentRef = root.document; var writePending = false; function getApi() { return root.GenealogyApi && root.GenealogyApi.defaultClient; } function query(selector, rootNode) { return documentRef ? (rootNode || documentRef).querySelector(selector) : null; } function queryAll(selector, rootNode) { return documentRef ? Array.prototype.slice.call((rootNode || documentRef).querySelectorAll(selector)) : []; } function trimOrUndefined(value) { var text = String(value === undefined || value === null ? '' : value).trim(); return text || undefined; } function toSafeIntegerOrUndefined(value) { var text = trimOrUndefined(value); var number; if (!text) return undefined; number = Number(text); return Number.isInteger(number) && Number.isSafeInteger(number) ? number : undefined; } function getQueryParam(search, name) { var params = new URLSearchParams(String(search || '').replace(/^\?/, '')); return params.get(name) || ''; } function getCurrentGenealogyId(search) { var page = query('[data-memo-page], [data-memo-edit-page]'); var source = search === undefined && root.location ? root.location.search : search; var profileGenealogyId; if (search === undefined && root.ProfileUI && root.ProfileUI.getGenealogyId) { profileGenealogyId = root.ProfileUI.getGenealogyId(); if (profileGenealogyId) return profileGenealogyId; } return getQueryParam(source, 'genealogyId') || (page && page.getAttribute('data-genealogy-id')) || ''; } function buildMemoBody(values) { var source = values || {}; var body = { memoTitle: String(source.memoTitle || '').trim() }; var fields = ['memoContent', 'remindTime', 'completed', 'mediaOssIds', 'status']; var sortOrderText = trimOrUndefined(source.sortOrder); fields.forEach(function (field) { var value = trimOrUndefined(source[field]); if (value !== undefined) body[field] = value; }); if (sortOrderText !== undefined) body.sortOrder = toSafeIntegerOrUndefined(sortOrderText); return body; } function validateMemoBody(body) { if (!body || !body.memoTitle) return '请填写备忘标题'; if (body.mediaOssIds !== undefined && !/^[1-9][0-9]*(,[1-9][0-9]*)*$/.test(body.mediaOssIds)) { return '附件 OSS ID 请使用英文逗号分隔的正整数'; } if (Object.prototype.hasOwnProperty.call(body, 'sortOrder') && body.sortOrder === undefined) return '排序值必须是安全整数'; return ''; } function normalizeMemoList(data) { return Array.isArray(data) ? data : []; } function escapeHtml(value) { return String(value === undefined || value === null ? '' : value) .replace(/&/g, '&') .replace(//g, '>') .replace(/"/g, '"') .replace(/'/g, '''); } function stringifyMemo(memo) { try { return typeof memo === 'string' ? memo : JSON.stringify(memo); } catch (error) { return String(memo); } } function renderMemos(data) { var container = query('[data-memo-list]'); var memos = normalizeMemoList(data); if (!container) return; if (!Array.isArray(data)) { container.innerHTML = '
备忘录响应未按 Apifox ListResult 返回数组,无法安全展示或操作记录。
'; return; } if (!memos.length) { container.innerHTML = '
暂无备忘录
'; return; } // ListResult 的元素 DTO 尚未展开,不能假设 memoId、标题或权限字段。 container.innerHTML = memos.map(function (memo, index) { return '

备忘录 ' + (index + 1) + '

' + escapeHtml(stringifyMemo(memo)) + '

'; }).join(''); } function showMessage(message) { if (root.layui && root.layui.layer) { root.layui.layer.msg(message); return; } if (root.alert) root.alert(message); } function shouldRedirectToLogin(api, error) { var status = error && (error.status || error.code); return !api || !api.getToken || !api.getToken() || Number(status) === 401; } function redirectUnauthorized(api, error) { if (!shouldRedirectToLogin(api, error)) return false; if (api && api.clearToken) api.clearToken(); if (!root.location) return true; if (typeof root.location.replace === 'function') { root.location.replace('login.html'); return true; } root.location.href = 'login.html'; return true; } function getFormValues(form) { var values = {}; queryAll('[name]', form).forEach(function (field) { values[field.name] = field.value; }); return values; } function setFormStatus(message) { var status = query('[data-memo-form-status]'); if (status) status.textContent = message || ''; } function setWritePending(pending) { writePending = Boolean(pending); queryAll('[data-memo-form] button, [data-memo-form] input, [data-memo-form] textarea, [data-memo-form] select').forEach(function (control) { control.disabled = writePending; }); } function syncGenealogyLinks(genealogyId) { if (root.ProfileUI && root.ProfileUI.syncGenealogyContextLinks) { root.ProfileUI.syncGenealogyContextLinks(); return; } queryAll('[data-genealogy-context-link]').forEach(function (link) { var href = link.getAttribute('href'); var base; if (!href || href === '#') return; base = href.split('?')[0]; link.href = base + '?genealogyId=' + encodeURIComponent(genealogyId); }); } function renderNoContext() { var list = query('[data-memo-list]'); if (list) list.innerHTML = '
等待家谱入口接口;请从具体家谱进入备忘录。
'; setFormStatus('等待家谱入口接口;请从具体家谱进入备忘录。'); } function requireGenealogyId() { var genealogyId = getCurrentGenealogyId(); if (!genealogyId) { renderNoContext(); showMessage('等待家谱入口接口;请从具体家谱进入备忘录。'); } return genealogyId; } function buildListUrl(genealogyId) { return 'profile-memo.html?genealogyId=' + encodeURIComponent(genealogyId); } async function loadMemos() { var api = getApi(); var genealogyId; if (redirectUnauthorized(api)) return; genealogyId = requireGenealogyId(); if (!genealogyId) return; syncGenealogyLinks(genealogyId); try { renderMemos(await api.memos(genealogyId)); } catch (error) { if (redirectUnauthorized(api, error)) return; renderMemos(null); showMessage(error.message || '备忘录加载失败'); } } async function submitMemo(form) { var api = getApi(); var genealogyId; var body; var validation; if (writePending || redirectUnauthorized(api)) return; genealogyId = requireGenealogyId(); if (!genealogyId) return; body = buildMemoBody(getFormValues(form)); validation = validateMemoBody(body); if (validation) { setFormStatus(validation); return; } setWritePending(true); setFormStatus('正在保存备忘录...'); try { await api.createMemo(genealogyId, body); if (root.location) root.location.href = buildListUrl(genealogyId); } catch (error) { if (redirectUnauthorized(api, error)) return; setFormStatus(error.message || '备忘录保存失败'); } finally { setWritePending(false); } } function bindActions() { if (!documentRef) return; documentRef.addEventListener('submit', function (event) { var form = event.target.closest('[data-memo-form]'); if (!form) return; event.preventDefault(); submitMemo(form); }); } function init() { var genealogyId; if (!documentRef) return; bindActions(); if (query('[data-memo-page]')) loadMemos(); if (query('[data-memo-edit-page]')) { genealogyId = requireGenealogyId(); if (genealogyId) syncGenealogyLinks(genealogyId); } } return { getCurrentGenealogyId: getCurrentGenealogyId, buildMemoBody: buildMemoBody, validateMemoBody: validateMemoBody, normalizeMemoList: normalizeMemoList, shouldRedirectToLogin: shouldRedirectToLogin, init: init }; });