Files
Shaarli_bm_theme/shaarli-pro/dist/search.min.js
T
bruno 5d7255cc22
CI / build (push) Failing after 4m54s
Add built JS assets to distributable
2026-08-09 21:14:35 -04:00

1 line
12 KiB
JavaScript

document.addEventListener("DOMContentLoaded",()=>{"use strict";const e=window.ShaarliProUtils||{escapeHtml:function(e){if(null==e)return"";const t=document.createElement("div");return t.textContent=String(e),t.innerHTML},isTagHidden:function(){return!1},filterHiddenTags:function(e){return e||[]}},t=(window.ShaarliProI18n,window.ShaarliProA11y||{focusFirst:function(){},trapFocus:function(){return function(){}}});let n=null,a=null;try{const f=document.getElementById("search-overlay"),h=document.querySelectorAll("[data-search-toggle]"),m=document.getElementById("search-modal-input"),p=document.getElementById("search-results"),y=document.getElementById("search-tags-btn"),v=document.getElementById("search-all-btn"),b=document.getElementById("search-notes-btn"),k=document.getElementById("search-form");let w="search",E=-1,$=null,L=null,S=null;function A(t,n){if(!n||0===n.length)return e.escapeHtml(t);const a=e.escapeHtml(t),r=n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),s=new RegExp(`(${r})`,"gi");return a.replace(s,"<mark>$1</mark>")}function I(e,t){return!t||0===t.length||e.toLowerCase().includes(t.toLowerCase())}function C(){if(S)return S;try{const t=new Set,n=n=>{if("string"!=typeof n)return;const a=n.trim();a&&!a.includes("•")&&(e.isTagHidden(a)||t.add(a))};return document.querySelectorAll(".link-tag[data-tag], .tag-item[data-tag], [data-tag-name]").forEach(e=>{n(e.getAttribute("data-tag")||e.getAttribute("data-tag-name"))}),document.querySelectorAll(".link-tag-link, .tag-link, .cloud-tag").forEach(e=>{n(e.textContent)}),S=Array.from(t).sort((e,t)=>e.toLowerCase().localeCompare(t.toLowerCase())),S}catch(e){return console.error("Failed to fetch tags:",e),[]}}async function q(){if(L)return L;try{const t=document.querySelectorAll(".link-outer");if(t.length>0)return L=Array.from(t).map(t=>({id:t.dataset.id,isNote:(t.querySelector(".link-title")?.getAttribute("title")||"").toLowerCase().includes("note"),title:t.querySelector(".link-title a")?.textContent||t.querySelector(".link-title")?.textContent||"",url:t.querySelector(".link-url a")?.href||t.querySelector(".link-title a")?.href||"",tags:e.filterHiddenTags(Array.from(t.querySelectorAll(".link-tag[data-tag]")).map(e=>(e.getAttribute("data-tag")||"").trim()).filter(Boolean)),description:t.querySelector(".link-description")?.textContent||""})),L}catch(e){console.error("Failed to fetch bookmarks:",e)}return[]}function B(e){var t=window.ShaarliProI18n||{t:function(e){return e}};return"tags"===e?t.t("Search in tags..."):"notes"===e?t.t("Search in notes..."):t.t("Search in bookmarks and notes...")}function H(t,n,a="search"){if(!p)return;if(0===t.length){if(n&&n.length>0){const t="tags"===a?"tags":"notes"===a?"notes":"bookmarks/notes";p.innerHTML=`\n <div class="search-no-results">\n No ${t} found for "<strong>${e.escapeHtml(n)}</strong>"\n </div>\n `}else p.innerHTML=`\n <div class="search-results-empty">\n <span class="search-results-hint">${B(a)}</span>\n </div>\n `;return}let r;r="tags"===a?t.slice(0,15).map((t,a)=>{const r=A(e.escapeHtml(t),n);return`\n <div class="search-result-item${a===E?" selected":""}" \n data-index="${a}" \n data-tag="${e.escapeHtml(t)}">\n <div class="search-result-item-content">\n <i class="mdi mdi-tag-outline search-result-icon"></i>\n <span class="search-result-text">${r}</span>\n </div>\n </div>\n `}).join(""):t.slice(0,12).map((t,a)=>{const r=A(e.escapeHtml(t.title),n),s=t.description?A(e.escapeHtml(t.description),n):"",i=t.isNote?"note":"bookmark",o=t.isNote?"mdi-note-text-outline":"mdi-bookmark-outline",l=(t.tags||[]).slice(0,4).map(t=>`<span class="search-result-tag">${A(e.escapeHtml(t),n)}</span>`).join("");return`\n <div class="search-result-item${a===E?" selected":""}" \n data-index="${a}" \n data-url="${e.escapeHtml(t.url)}"\n data-id="${t.id}">\n <div class="search-result-item-content">\n <i class="mdi ${o} search-result-icon"></i>\n <div class="search-result-main">\n <span class="search-result-text">${r}</span>\n <span class="search-result-kind">${i}</span>\n </div>\n </div>\n ${s?`<div class="search-result-sub">${s}</div>`:""}\n ${l?`<div class="search-result-tags">${l}</div>`:""}\n </div>\n `}).join(""),p.innerHTML=r,p.querySelectorAll(".search-result-item").forEach(e=>{e.addEventListener("click",()=>{if("tags"===a){const t=e.dataset.tag;t&&(window.location.href=shaarli.basePath+"/?searchtags="+encodeURIComponent(t))}else{const t=e.dataset.url;t&&(window.location.href=t)}})})}async function N(e){const t=(e||"").trim();if("tags"===w){const e=C();if(!t)return void H(e.slice(0,15),"","tags");return void H(e.filter(e=>I(e,t)),t,"tags")}const n=await q(),a="notes"===w?n.filter(e=>e.isNote):n;if(!t)return void H(a.slice(0,12),"",w);H(a.filter(e=>[e.title,e.url,e.description,(e.tags||[]).join(" ")].join(" ").toLowerCase().includes(t.toLowerCase())),t,w)}function T(e){const t=p?.querySelectorAll(".search-result-item");t&&0!==t.length&&(e<0&&(e=t.length-1),e>=t.length&&(e=0),E=e,t.forEach((e,t)=>{e.classList.toggle("selected",t===E)}),t[E]?.scrollIntoView({block:"nearest"}))}function P(){const e=p?.querySelector(".search-result-item.selected");if(e){const t=e.dataset.tag;if(t)return window.location.href=shaarli.basePath+"/?searchtags="+encodeURIComponent(t),!0;const n=e.dataset.url;if(n)return window.location.href=n,!0}return!1}function x(e="search"){f?.classList.add("show"),E=-1,setTimeout(()=>{U(e),m?.focus(),n=t.trapFocus(f)},100)}function D(){f?.classList.remove("show"),E=-1,"function"==typeof n&&(n(),n=null)}function K(){const e="undefined"!=typeof shaarli&&shaarli.basePath?shaarli.basePath:"",t=(m?.value||"").trim();if(!(E>=0&&P()))return t?void(window.location.href="tags"!==w?"notes"!==w?`${e}/?searchterm=${encodeURIComponent(t)}`:`${e}/?searchterm=${encodeURIComponent(t)}&searchtags=note`:`${e}/?searchtags=${encodeURIComponent(t)}`):"tags"===w?void(window.location.href=`${e}/tags/cloud`):void(window.location.href=`${e}/`)}function U(e){["search","tags","notes"].includes(e)||(e="search"),w=e,v?.classList.toggle("active","search"===e),y?.classList.toggle("active","tags"===e),b?.classList.toggle("active","notes"===e),v?.setAttribute("aria-pressed",String("search"===e)),y?.setAttribute("aria-pressed",String("tags"===e)),b?.setAttribute("aria-pressed",String("notes"===e)),v?.setAttribute("aria-selected",String("search"===e)),y?.setAttribute("aria-selected",String("tags"===e)),b?.setAttribute("aria-selected",String("notes"===e)),m&&(m.name="tags"===e?"searchtags":"searchterm",m.placeholder=B(e),N(m.value))}h.forEach(e=>{e.addEventListener("click",()=>x("search"))}),f?.addEventListener("click",e=>{e.target===f&&D()}),y?.addEventListener("click",e=>{e.preventDefault(),U("tags")}),v?.addEventListener("click",e=>{e.preventDefault(),U("search")}),b?.addEventListener("click",e=>{e.preventDefault(),U("notes")}),k?.addEventListener("submit",e=>{e.preventDefault(),K()}),m?.addEventListener("input",e=>{const t=e.target.value;clearTimeout($),$=setTimeout(()=>{E=-1,N(t)},150)}),document.addEventListener("keydown",e=>{const t=f?.classList.contains("show"),n=e.target,a=Boolean(n&&("INPUT"===n.tagName||"TEXTAREA"===n.tagName||"SELECT"===n.tagName||n.isContentEditable||"function"==typeof n.closest&&n.closest(".toastui-editor-defaultUI, .toastui-editor-main, .toastui-editor-contents, .CodeMirror")));if("Escape"===e.key)return t&&(D(),e.preventDefault()),void d();if(t&&e.target===m)switch(e.key){case"ArrowDown":e.preventDefault(),T(E+1);break;case"ArrowUp":e.preventDefault(),T(E-1);break;case"Enter":e.preventDefault(),K()}else a||e.ctrlKey||e.metaKey||e.altKey||"s"!==e.key&&"S"!==e.key||(e.preventDefault(),x("search")),a||e.ctrlKey||e.metaKey||e.altKey||"t"!==e.key&&"T"!==e.key||(e.preventDefault(),x("tags")),a||e.ctrlKey||e.metaKey||e.altKey||"n"!==e.key&&"N"!==e.key||(e.preventDefault(),x("notes"))})}catch(F){console.error("Search overlay initialization failed:",F)}const r=document.getElementById("filter-toggle-btn"),s=document.getElementById("filter-panel"),i=document.getElementById("filter-close-btn"),o=document.getElementById("filter-private"),l=document.getElementById("filter-public"),c=document.getElementById("filter-untagged");function d(){s&&(s.classList.remove("show"),s.setAttribute("aria-hidden","true"),r?.setAttribute("aria-expanded","false"),"function"==typeof a&&(a(),a=null))}function u(){const e=o?.checked||!1,t=l?.checked||!1,n=c?.checked||!1;let a="undefined"!=typeof shaarli&&shaarli.basePath?shaarli.basePath:"";const r="undefined"!=typeof shaarli&&shaarli.visibility?shaarli.visibility:"",s="undefined"!=typeof shaarli&&shaarli.untaggedonly||!1;let i=a+"/",d="all";e?d="private":t&&(d="public"),i="private"===d?a+"/admin/visibility/private":"public"===d?a+"/admin/visibility/public":r&&""!==r?a+"/admin/visibility/all":n!==s?a+"/untagged-only":a+"/",window.location.href=i}r?.addEventListener("click",e=>{e.stopPropagation(),function(){if(!s)return;const e=s.classList.toggle("show");s.setAttribute("aria-hidden",String(!e)),r?.setAttribute("aria-expanded",String(e)),e?(t.focusFirst(s),a=t.trapFocus(s)):"function"==typeof a&&(a(),a=null)}()}),i?.addEventListener("click",d),document.addEventListener("click",e=>{if(s?.classList.contains("show")){const t=r&&(e.target===r||r.contains(e.target));s.contains(e.target)||t||d()}}),o?.addEventListener("change",e=>{e.target.checked&&l&&(l.checked=!1),u()}),l?.addEventListener("change",e=>{e.target.checked&&o&&(o.checked=!1),u()}),c?.addEventListener("change",()=>{u()}),function(){const e="undefined"!=typeof shaarli&&shaarli.visibility?shaarli.visibility:"",t=!("undefined"==typeof shaarli||!shaarli.untaggedonly)&&shaarli.untaggedonly;let n="private"===e,a="public"===e,s=!0===t;o&&n&&(o.checked=!0),l&&a&&(l.checked=!0),c&&s&&(c.checked=!0);const i=n||a||s;if(r&&i&&(r.classList.add("has-active-filter"),!r.querySelector(".filter-badge"))){const e=document.createElement("span");e.className="filter-badge",r.appendChild(e)}if(i&&!document.getElementById("filter-info-banner")){let e=0;const t=document.querySelector(".paging-stats strong:last-child"),r=document.querySelectorAll(".link-outer").length;t?e=parseInt(t.textContent)||0:r>0&&(e=r);const i=null!==document.querySelector(".empty-state")||0===e;let o="",l="";n?o="<strong>private</strong>":a&&(o="<strong>public</strong>"),s&&(l="<strong>without any tag</strong>");let c="";var d=window.ShaarliProI18n||{t:function(e){return e}};if(i)c=d.t("Nothing found.");else{const t=1===e?d.t("result"):d.t("results"),n=d.t("with status");o&&l?c=`${e} ${t} ${n} ${o} ${l}`:o?c=`${e} ${t} ${n} ${o}`:l&&(c=`${e} ${t} ${l}`)}if(c){const e="undefined"!=typeof shaarli&&shaarli.basePath?shaarli.basePath:"",t=document.createElement("div");t.id="filter-info-banner",t.className="filter-info-banner"+(i?" empty-results":""),t.innerHTML=`\n <div class="filter-info-content">\n <span>${c}</span>\n </div>\n <button type="button" class="filter-clear-btn" id="filter-clear-btn" title="${d.t("Clear filters")}">\n <i class="mdi mdi-close"></i>\n <span>${d.t("Clear")}</span>\n </button>\n `;const r=document.querySelector(".content-toolbar"),o=document.getElementById("linklist"),l=document.querySelector(".empty-state");r&&r.parentNode?r.parentNode.insertBefore(t,r.nextSibling):l&&l.parentNode?l.parentNode.insertBefore(t,l):o&&o.insertBefore(t,o.firstChild),document.getElementById("filter-clear-btn")?.addEventListener("click",()=>{window.location.href=n||a?e+"/admin/visibility/all":s?e+"/untagged-only":e+"/"})}}}();const g=document.querySelector(".filter-input");g&&g.closest("form")?.addEventListener("submit",e=>{e.preventDefault();const t=g.value;t&&t>0&&(window.location.href=shaarli.basePath+"/links-per-page?nb="+t)})});