「MediaWiki:Forum.js」の版間の差分

編集の要約なし
編集の要約なし
 
(同じ利用者による、間の1版が非表示)
266行目: 266行目:
                         const source = await (await fetch(mw.config.get('wgScript') + `?title=${mw.config.get('wgPageName')}&action=raw`)).text();
                         const source = await (await fetch(mw.config.get('wgScript') + `?title=${mw.config.get('wgPageName')}&action=raw`)).text();
                         const newText = source.replace(new RegExp(`(\\{\\{post\\|(.*?)\\|${postId}\\|(.*?)\\|4=)((.|\n)*?)(}})`), '$1[Deleted]$6');
                         const newText = source.replace(new RegExp(`(\\{\\{post\\|(.*?)\\|${postId}\\|(.*?)\\|4=)((.|\n)*?)(}})`), '$1[Deleted]$6');
                         fetch('/mediawiki/forum-proxy.php', {
                         fetch('/wiki/forum-proxy.php', {
                             method: 'POST',
                             method: 'POST',
                             headers: { 'Content-Type': 'application/json' },
                             headers: { 'Content-Type': 'application/json' },
288行目: 288行目:
                         const threadName = mw.config.get('wgPageName').replace(mw.forum.toppage + '/', '');
                         const threadName = mw.config.get('wgPageName').replace(mw.forum.toppage + '/', '');
                         if (!confirm(`スレッド「${threadName}」を削除しますか?\nこの操作は取り消せません。`)) return;
                         if (!confirm(`スレッド「${threadName}」を削除しますか?\nこの操作は取り消せません。`)) return;
                         fetch('/mediawiki/forum-proxy.php', {
                         fetch('/wiki/forum-proxy.php', {
                             method: 'POST',
                             method: 'POST',
                             headers: { 'Content-Type': 'application/json' },
                             headers: { 'Content-Type': 'application/json' },
400行目: 400行目:
                             const anonParam = isAnon ? '|anon=1' : '';
                             const anonParam = isAnon ? '|anon=1' : '';
                             content += `{{post|${mw.forum.username}|1|{{subst:#timel:Y/m/d H:i:s}}|4=${document.querySelector('#wpTextbox1').value}${anonParam}}}`;
                             content += `{{post|${mw.forum.username}|1|{{subst:#timel:Y/m/d H:i:s}}|4=${document.querySelector('#wpTextbox1').value}${anonParam}}}`;
                             fetch('/mediawiki/forum-proxy.php', {
                             fetch('/wiki/forum-proxy.php', {
                                 method: 'POST',
                                 method: 'POST',
                                 headers: { 'Content-Type': 'application/json' },
                                 headers: { 'Content-Type': 'application/json' },
510行目: 510行目:
                             postBody.appendtext = `\n{{post|${mw.forum.username}|${lp}|{{subst:#timel:Y/m/d H:i:s}}|4=${document.querySelector('#wpTextbox1').value}${document.querySelector('#f-reply-cb').checked ? '|re=' + document.querySelector('#f-reply').value : ''}${anonParam}}}`;
                             postBody.appendtext = `\n{{post|${mw.forum.username}|${lp}|{{subst:#timel:Y/m/d H:i:s}}|4=${document.querySelector('#wpTextbox1').value}${document.querySelector('#f-reply-cb').checked ? '|re=' + document.querySelector('#f-reply').value : ''}${anonParam}}}`;
                         }
                         }
                         fetch('/mediawiki/forum-proxy.php', {
                         fetch('/wiki/forum-proxy.php', {
                             method: 'POST',
                             method: 'POST',
                             headers: { 'Content-Type': 'application/json' },
                             headers: { 'Content-Type': 'application/json' },
587行目: 587行目:


                         const showPopup = (anchorEl, postId) => {
                         const showPopup = (anchorEl, postId) => {
                            const target = document.querySelector(`#post-${postId}`);
    const target = document.querySelector(`#post-${postId}`);
                            if (!target) return;
    if (!target) return;


                            // 対象投稿をクローンしてポップアップに表示
    // 対象投稿をクローンしてポップアップに表示
                            // 編集・削除リンクは除いてすっきり見せる
    const clone = target.cloneNode(true);
                            const clone = target.cloneNode(true);
    clone.querySelectorAll('a[href*="fedit"], span[style*="#d33"]').forEach(el => el.remove());
                            clone.querySelectorAll('a[href*="fedit"], span[style*="#d33"]').forEach(el => el.remove());
    popup.innerHTML = '';
                            popup.innerHTML = '';
    popup.appendChild(clone);
                            popup.appendChild(clone);


                            // ポップアップの位置をリンクの近くに配置
    // ポップアップの位置をリンクの近くに配置(モバイル対応)
                            const rect = anchorEl.getBoundingClientRect();
    const rect = anchorEl.getBoundingClientRect();
                            const popupHeight = 200; // 表示前は高さ不明なので仮値
    const viewportWidth = window.innerWidth;
                            const spaceBelow = window.innerHeight - rect.bottom;
    const viewportHeight = window.innerHeight;
                            const top = spaceBelow > popupHeight
   
                                ? rect.bottom + 4         // 下に余裕あり → リンクの下
    // ポップアップの最大幅を画面幅の90%に制限
                                : rect.top - popupHeight; // 余裕なし → リンクの上
    const maxWidth = Math.min(480, viewportWidth * 0.9);
                            popup.style.left = Math.min(rect.left, window.innerWidth - 500) + 'px';
    popup.style.maxWidth = maxWidth + 'px';
                            popup.style.top  = Math.max(4, top) + 'px';
   
                            popup.style.display = 'block';
    // 一度表示して実際の高さを取得
                        };
    popup.style.display = 'block';
    popup.style.visibility = 'hidden';
    const popupHeight = popup.offsetHeight;
    popup.style.visibility = 'visible';
   
    // 縦位置:下に余裕があれば下、なければ上
    const spaceBelow = viewportHeight - rect.bottom;
    const top = spaceBelow > popupHeight + 10
        ? rect.bottom + 4
        : Math.max(4, rect.top - popupHeight - 4);
   
    // 横位置:画面からはみ出ないように調整
    let left = rect.left;
    if (left + maxWidth > viewportWidth - 10) {
        left = viewportWidth - maxWidth - 10;
    }
    if (left < 10) {
        left = 10;
    }
   
    popup.style.left = left + 'px';
    popup.style.top = top + 'px';
};


                         const hidePopup = () => {
                         const hidePopup = () => {