(function (root, factory) {
if (typeof module === 'object' && module.exports) {
module.exports = factory(root);
return;
}
root.RelativePages = factory(root);
if (root.document) root.document.addEventListener('DOMContentLoaded', function () { root.RelativePages.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, node) { return documentRef ? (node || documentRef).querySelector(selector) : null; }
function queryAll(selector, node) { return documentRef ? Array.prototype.slice.call((node || documentRef).querySelectorAll(selector)) : []; }
function trim(value) { var text = String(value === undefined || value === null ? '' : value).trim(); return text || undefined; }
function queryParam(search, name) { return new URLSearchParams(String(search || '').replace(/^\?/, '')).get(name) || ''; }
function getCurrentGenealogyId(search) {
var page = query('[data-relative-page], [data-relative-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 queryParam(source, 'genealogyId') || (page && page.getAttribute('data-genealogy-id')) || '';
}
function toSafeNumber(value) {
var text = trim(value);
var number;
if (!text) return undefined;
number = Number(text);
return Number.isFinite(number) ? number : undefined;
}
function toSafeInteger(value) {
var number = toSafeNumber(value);
return Number.isInteger(number) && Number.isSafeInteger(number) ? number : undefined;
}
function buildRelativeRecordBody(values) {
var source = values || {};
var body = { relativeName: String(source.relativeName || '').trim() };
var fields = ['relationName', 'eventName', 'eventTime', 'recordContent', 'mediaOssIds', 'status'];
var amountText = trim(source.giftAmount);
var sortOrderText = trim(source.sortOrder);
fields.forEach(function (field) {
var value = trim(source[field]);
if (value !== undefined) body[field] = value;
});
if (amountText !== undefined) body.giftAmount = toSafeNumber(amountText);
if (sortOrderText !== undefined) body.sortOrder = toSafeInteger(sortOrderText);
return body;
}
function validateRelativeRecordBody(body) {
if (!body || !body.relativeName) 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, 'giftAmount') && body.giftAmount === undefined) return '礼金金额必须是数字';
if (Object.prototype.hasOwnProperty.call(body, 'sortOrder') && body.sortOrder === undefined) return '排序值必须是安全整数';
return '';
}
function normalizeRelativeList(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 stringify(value) { try { return typeof value === 'string' ? value : JSON.stringify(value); } catch (error) { return String(value); } }
function renderRelativeRecords(data) {
var container = query('[data-relative-list]');
var records = normalizeRelativeList(data);
if (!container) return;
if (!Array.isArray(data)) {
container.innerHTML = '
亲友往来响应未按 Apifox ListResult 返回数组,无法安全展示或操作记录。
';
return;
}
if (!records.length) {
container.innerHTML = '暂无亲友往来记录
';
return;
}
container.innerHTML = records.map(function (record, index) {
return '亲友往来 ' + (index + 1) + '
' + escapeHtml(stringify(record)) + '
';
}).join('');
}
function showMessage(message) { if (root.layui && root.layui.layer) root.layui.layer.msg(message); else 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 && typeof root.location.replace === 'function') root.location.replace('login.html');
else if (root.location) root.location.href = 'login.html';
return true;
}
function setFormStatus(message) { var target = query('[data-relative-form-status]'); if (target) target.textContent = message || ''; }
function setWritePending(value) { writePending = Boolean(value); queryAll('[data-relative-form] button, [data-relative-form] input, [data-relative-form] textarea').forEach(function (control) { control.disabled = writePending; }); }
function syncLinks(genealogyId) {
if (root.ProfileUI && root.ProfileUI.syncGenealogyContextLinks) { root.ProfileUI.syncGenealogyContextLinks(); return; }
queryAll('[data-genealogy-context-link]').forEach(function (link) { var href = link.getAttribute('href'); if (href) link.href = href.split('?')[0] + '?genealogyId=' + encodeURIComponent(genealogyId); });
}
function requireGenealogyId() {
var genealogyId = getCurrentGenealogyId();
var list = query('[data-relative-list]');
if (genealogyId) return genealogyId;
if (list) list.innerHTML = '等待家谱入口接口;请从具体家谱进入亲友往来。
';
setFormStatus('等待家谱入口接口;请从具体家谱进入亲友往来。');
showMessage('等待家谱入口接口;请从具体家谱进入亲友往来。');
return '';
}
async function loadRelativeRecords() {
var api = getApi();
var genealogyId;
if (redirectUnauthorized(api)) return;
genealogyId = requireGenealogyId();
if (!genealogyId) return;
syncLinks(genealogyId);
try { renderRelativeRecords(await api.relativeRecords(genealogyId)); }
catch (error) { if (!redirectUnauthorized(api, error)) { renderRelativeRecords(null); showMessage(error.message || '亲友往来加载失败'); } }
}
async function submitRelativeRecord(form) {
var api = getApi();
var genealogyId;
var values = {};
var body;
var validation;
if (writePending || redirectUnauthorized(api)) return;
genealogyId = requireGenealogyId();
if (!genealogyId) return;
queryAll('[name]', form).forEach(function (field) { values[field.name] = field.value; });
body = buildRelativeRecordBody(values);
validation = validateRelativeRecordBody(body);
if (validation) { setFormStatus(validation); return; }
setWritePending(true);
setFormStatus('正在保存亲友往来...');
try {
await api.createRelativeRecord(genealogyId, body);
if (root.location) root.location.href = 'profile-relative.html?genealogyId=' + encodeURIComponent(genealogyId);
} catch (error) {
if (!redirectUnauthorized(api, error)) setFormStatus(error.message || '亲友往来保存失败');
} finally { setWritePending(false); }
}
function init() {
var genealogyId;
if (!documentRef) return;
documentRef.addEventListener('submit', function (event) { var form = event.target.closest('[data-relative-form]'); if (form) { event.preventDefault(); submitRelativeRecord(form); } });
if (query('[data-relative-page]')) loadRelativeRecords();
if (query('[data-relative-edit-page]')) { genealogyId = requireGenealogyId(); if (genealogyId) syncLinks(genealogyId); }
}
return { getCurrentGenealogyId: getCurrentGenealogyId, buildRelativeRecordBody: buildRelativeRecordBody, validateRelativeRecordBody: validateRelativeRecordBody, normalizeRelativeList: normalizeRelativeList, shouldRedirectToLogin: shouldRedirectToLogin, init: init };
});