import { postForm as postFormRequest } from '../core/app-http.js'; export const buildUrl = (appBase, path) => new URL(path, appBase).toString(); export const getAppBase = () => { const baseEl = document.querySelector('base'); if (baseEl && baseEl.href) { return baseEl.href; } return `${window.location.origin}/`; }; const resolveAppBaseUrl = () => { try { return new URL(getAppBase(), `${window.location.origin}/`); } catch { return new URL(`${window.location.origin}/`); } }; const normalizeBasePathname = (pathname) => { const trimmed = String(pathname ?? '').trim(); if (trimmed === '' || trimmed === '/') { return '/'; } return `/${trimmed.replace(/^\/+|\/+$/g, '')}/`; }; const toAppRelativePath = (pathname, appBasePathname) => { const normalizedPath = `/${String(pathname ?? '').replace(/^\/+/, '')}`; const normalizedBasePath = normalizeBasePathname(appBasePathname); let relativePath = normalizedPath; if (normalizedBasePath !== '/' && relativePath.startsWith(normalizedBasePath)) { relativePath = relativePath.slice(normalizedBasePath.length - 1); } else if (normalizedBasePath !== '/' && relativePath === normalizedBasePath.slice(0, -1)) { relativePath = '/'; } return relativePath.replace(/^\/+/, ''); }; const parseAppUrl = (value, baseUrl = resolveAppBaseUrl()) => { const raw = String(value ?? '').trim(); if (raw === '') { return null; } try { return new URL(raw, baseUrl); } catch { return null; } }; export const normalizeListReturnTarget = (sourceUrl = window.location.href) => { const appBaseUrl = resolveAppBaseUrl(); const parsed = parseAppUrl(sourceUrl, appBaseUrl); if (!parsed) { return ''; } const relativePath = toAppRelativePath(parsed.pathname, appBaseUrl.pathname); if (relativePath === '') { return ''; } const query = new URLSearchParams(parsed.search); query.delete('return'); const queryString = query.toString(); return `${relativePath}${queryString ? `?${queryString}` : ''}`; }; export const withReturnTarget = (targetUrl, returnTarget = '') => { const appBaseUrl = resolveAppBaseUrl(); const parsedTarget = parseAppUrl(targetUrl, appBaseUrl); if (!parsedTarget) { return String(targetUrl ?? ''); } if (parsedTarget.origin !== window.location.origin) { return String(targetUrl ?? ''); } const normalizedReturn = normalizeListReturnTarget(returnTarget); parsedTarget.searchParams.delete('return'); if (normalizedReturn !== '') { parsedTarget.searchParams.set('return', normalizedReturn); } return parsedTarget.toString(); }; export const withCurrentListReturn = (targetUrl) => withReturnTarget(targetUrl, window.location.href); export const escapeHtml = (value) => String(value ?? '').replace(/[&<>"']/g, (char) => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[char])); export const buildBadgeList = (items, options = {}) => { const { variant = 'neutral', primaryVariant = 'info', primaryTooltip = '' } = options; let list = items; let primary = ''; if (items && typeof items === 'object' && !Array.isArray(items)) { list = Array.isArray(items.items) ? items.items : []; primary = String(items.primary ?? ''); } if (!Array.isArray(list) || list.length === 0) {return '';} const tooltipAttr = primaryTooltip ? ` data-tooltip="${escapeHtml(primaryTooltip)}" data-tooltip-pos="top"` : ''; const badges = list.map((label) => { const labelText = String(label ?? ''); const isPrimary = primary !== '' && labelText === primary; const badgeVariant = isPrimary ? primaryVariant : variant; const badgeTooltip = isPrimary && primaryTooltip ? tooltipAttr : ''; return `${escapeHtml(labelText)}`; }).join(' '); return `