From ac9733c7243bde55178fe8715574f79a1e304ff2 Mon Sep 17 00:00:00 2001 From: masaton0216 Date: Mon, 3 Aug 2026 22:01:58 +0900 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20=E3=83=9A=E3=83=BC=E3=82=B8=E7=AE=A1?= =?UTF-8?q?=E7=90=86=20=E3=83=9A=E3=83=BC=E3=82=B8=E4=B8=80=E8=A6=A7?= =?UTF-8?q?=E3=81=A7=E8=A6=AA=E3=81=8C=E5=89=8A=E9=99=A4=E3=81=95=E3=82=8C?= =?UTF-8?q?=E3=81=9F=E5=AD=90=E3=83=9A=E3=83=BC=E3=82=B8=E3=81=8C=E8=A1=A8?= =?UTF-8?q?=E7=A4=BA=E3=81=95=E3=82=8C=E3=81=AA=E3=81=84=E4=B8=8D=E5=85=B7?= =?UTF-8?q?=E5=90=88=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/js/manage/page/index.js | 2 +- public/mix-manifest.json | 2 +- resources/js/manage/page/index.js | 19 +++++++++---------- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/public/js/manage/page/index.js b/public/js/manage/page/index.js index 1412047d7..d57e72eb0 100644 --- a/public/js/manage/page/index.js +++ b/public/js/manage/page/index.js @@ -1 +1 @@ -!function(){var e="connect.manage.page.treeState:"+window.location.pathname,t="connect-page-manage-tree-preload-style",a=!1;function n(){try{var t=sessionStorage.getItem(e);if(!t)return[];var a=JSON.parse(t);return a&&Array.isArray(a.collapsed_ids)?a.collapsed_ids.map(String):[]}catch(e){return[]}}function r(){return document.querySelector("[data-page-manage-tree]")}function i(e){return e?Array.from(e.querySelectorAll("tbody tr[data-page-id]")):[]}function d(t){try{if(!t.length)return void sessionStorage.removeItem(e);sessionStorage.setItem(e,JSON.stringify({collapsed_ids:t}))}catch(e){}}function o(){var e=document.getElementById(t);e&&e.remove()}function c(){if(a){var e=i(r());e.length&&d(e.filter((function(e){return"1"===e.dataset.hasChildren&&"0"===e.dataset.treeExpanded})).map((function(e){return e.dataset.pageId})))}}function u(e,t){e.dataset.treeExpanded=t?"1":"0";var a=e.querySelector("[data-page-tree-toggle]");if(a){var n=t?"子ページを折り畳む":"子ページを展開する";a.setAttribute("aria-expanded",t?"true":"false"),a.setAttribute("aria-label",n),a.setAttribute("title",n)}}function s(e,t){e.forEach((function(e){e.hidden=!function(e,t){for(var a=e.dataset.parentId;a;){var n=t.get(a);if(!n||"1"!==n.dataset.treeExpanded)return!1;a=n.dataset.parentId}return!0}(e,t)}))}!function(){var e=n();if(e.length){var a=e.map((function(e){return'[data-page-manage-tree] tbody tr[data-ancestor-ids~="'+e+'"]'}));if(a.length){var r=document.getElementById(t);r||((r=document.createElement("style")).id=t,document.head.appendChild(r)),r.textContent=a.join(",\n")+" { display: none; }"}else o()}else o()}(),window.connectPageManageTree={init:function(){if(!a){var e=i(r());if(e.length){a=!0;var t=new Map(e.map((function(e){return[e.dataset.pageId,e]}))),l=e.filter((function(e){return"1"===e.dataset.hasChildren})),f=n();l.forEach((function(a){u(a,!0);var n=a.querySelector("[data-page-tree-toggle]");n&&n.addEventListener("click",(function(){var n="1"===a.dataset.treeExpanded;u(a,!n),s(e,t),c()}))}));var g=[];f.forEach((function(e){var a=t.get(e);a&&"1"===a.dataset.hasChildren&&(u(a,!1),g.push(e))})),s(e,t),d(g),o()}}},saveState:c}}(); \ No newline at end of file +!function(){var e="connect.manage.page.treeState:"+window.location.pathname,t="connect-page-manage-tree-preload-style",a=!1;function n(){try{var t=sessionStorage.getItem(e);if(!t)return[];var a=JSON.parse(t);return a&&Array.isArray(a.collapsed_ids)?a.collapsed_ids.map(String):[]}catch(e){return[]}}function r(){return document.querySelector("[data-page-manage-tree]")}function i(e){return e?Array.from(e.querySelectorAll("tbody tr[data-page-id]")):[]}function o(t){try{if(!t.length)return void sessionStorage.removeItem(e);sessionStorage.setItem(e,JSON.stringify({collapsed_ids:t}))}catch(e){}}function d(){var e=document.getElementById(t);e&&e.remove()}function c(){if(a){var e=i(r());e.length&&o(e.filter((function(e){return"1"===e.dataset.hasChildren&&"0"===e.dataset.treeExpanded})).map((function(e){return e.dataset.pageId})))}}function s(e,t){e.dataset.treeExpanded=t?"1":"0";var a=e.querySelector("[data-page-tree-toggle]");if(a){var n=t?"子ページを折り畳む":"子ページを展開する";a.setAttribute("aria-expanded",t?"true":"false"),a.setAttribute("aria-label",n),a.setAttribute("title",n)}}function u(e,t){e.forEach((function(e){e.hidden=!function(e,t){return(e.dataset.ancestorIds||"").split(" ").filter(Boolean).every((function(e){var a=t.get(e);return!a||"1"===a.dataset.treeExpanded}))}(e,t)}))}!function(){var e=n();if(e.length){var a=e.map((function(e){return'[data-page-manage-tree] tbody tr[data-ancestor-ids~="'+e+'"]'}));if(a.length){var r=document.getElementById(t);r||((r=document.createElement("style")).id=t,document.head.appendChild(r)),r.textContent=a.join(",\n")+" { display: none; }"}else d()}else d()}(),window.connectPageManageTree={init:function(){if(!a){var e=i(r());if(e.length){a=!0;var t=new Map(e.map((function(e){return[e.dataset.pageId,e]}))),l=e.filter((function(e){return"1"===e.dataset.hasChildren})),f=n();l.forEach((function(a){s(a,!0);var n=a.querySelector("[data-page-tree-toggle]");n&&n.addEventListener("click",(function(){var n="1"===a.dataset.treeExpanded;s(a,!n),u(e,t),c()}))}));var g=[];f.forEach((function(e){var a=t.get(e);a&&"1"===a.dataset.hasChildren&&(s(a,!1),g.push(e))})),u(e,t),o(g),d()}}},saveState:c}}(); \ No newline at end of file diff --git a/public/mix-manifest.json b/public/mix-manifest.json index d64d5e167..66eee1be5 100644 --- a/public/mix-manifest.json +++ b/public/mix-manifest.json @@ -2,7 +2,7 @@ "/js/app.js": "/js/app.js?id=d37e2106d540855d1011725ff6dc8391", "/js/wysiwyg.js": "/js/wysiwyg.js?id=8a3ae361d356b17963d1073e631dff81", "/js/codemirror.js": "/js/codemirror.js?id=1648b8c7831f2474820107a74359317f", - "/js/manage/page/index.js": "/js/manage/page/index.js?id=0baec4e0bdc17faa6677a2d9c0bed29b", + "/js/manage/page/index.js": "/js/manage/page/index.js?id=2328c3465b2a0b89467b5f88ecda2893", "/css/app.css": "/css/app.css?id=d6fb0b661b1f484b915a1dd7c5d5f57c", "/fonts/vendor/@fortawesome/fontawesome-free/webfa-solid-900.woff2?2463b90d9a316e4e5294e6706b6a7a72": "/fonts/vendor/@fortawesome/fontawesome-free/webfa-solid-900.woff2?2463b90d9a316e4e5294e6706b6a7a72?id=109ad919b74a62a8a223361da1651bbc", "/fonts/vendor/@fortawesome/fontawesome-free/webfa-solid-900.ttf?2582b0e4bcf85eceead0de3fd9035c90": "/fonts/vendor/@fortawesome/fontawesome-free/webfa-solid-900.ttf?2582b0e4bcf85eceead0de3fd9035c90?id=8218477819a31609afa351933eebcdb4", diff --git a/resources/js/manage/page/index.js b/resources/js/manage/page/index.js index 46d32e9e2..aa10a5833 100644 --- a/resources/js/manage/page/index.js +++ b/resources/js/manage/page/index.js @@ -168,22 +168,21 @@ /** * 祖先の展開状態をたどり、対象行を表示すべきか判定する。 * + * parent_id カラムは実体(Nested Set の _lft/_rgt)とズレている場合があるため、 + * ちらつき防止スタイルと同じ data-ancestor-ids を判定に使う。 + * * @param {HTMLElement} row 対象の行 * @param {Map} rowMap ページIDと行要素の対応 * @returns {boolean} 表示対象なら true */ function isRowVisible(row, rowMap) { - let parentId = row.dataset.parentId; + const ancestorIds = (row.dataset.ancestorIds || '').split(' ').filter(Boolean); - while (parentId) { - const parentRow = rowMap.get(parentId); - if (!parentRow || parentRow.dataset.treeExpanded !== '1') { - return false; - } - parentId = parentRow.dataset.parentId; - } - - return true; + // 祖先が一覧内に無い場合は隠さず表示する(表示漏れを防ぐ)。 + return ancestorIds.every(function (ancestorId) { + const ancestorRow = rowMap.get(ancestorId); + return !ancestorRow || ancestorRow.dataset.treeExpanded === '1'; + }); } /** From f31dc37a0be7bd5ed66fb6c171d1f6be9dfb9196 Mon Sep 17 00:00:00 2001 From: masaton0216 Date: Mon, 3 Aug 2026 22:19:53 +0900 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20=E3=83=9A=E3=83=BC=E3=82=B8=E7=AE=A1?= =?UTF-8?q?=E7=90=86=20=E6=8A=98=E3=82=8A=E7=95=B3=E3=81=BF=E3=83=88?= =?UTF-8?q?=E3=82=B0=E3=83=AB=E3=82=92=E6=8C=81=E3=81=9F=E3=81=AA=E3=81=84?= =?UTF-8?q?=E7=A5=96=E5=85=88=E3=81=AE=E9=85=8D=E4=B8=8B=E3=81=A7=E8=A1=8C?= =?UTF-8?q?=E3=81=8C=E6=B6=88=E3=81=88=E3=82=8B=E4=B8=8D=E5=85=B7=E5=90=88?= =?UTF-8?q?=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 祖先行の data-tree-expanded は has_children="1" の行にしか設定されないため、 === '1' 判定では has_children="0" の祖先の配下が非表示になっていた。 明示的に折り畳まれている(=== '0')場合のみ隠すよう反転し、 applyPreloadStyle() が隠す集合と一致させる。 Co-Authored-By: Claude Opus 5 --- public/js/manage/page/index.js | 2 +- public/mix-manifest.json | 2 +- resources/js/manage/page/index.js | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/public/js/manage/page/index.js b/public/js/manage/page/index.js index d57e72eb0..e291dbf11 100644 --- a/public/js/manage/page/index.js +++ b/public/js/manage/page/index.js @@ -1 +1 @@ -!function(){var e="connect.manage.page.treeState:"+window.location.pathname,t="connect-page-manage-tree-preload-style",a=!1;function n(){try{var t=sessionStorage.getItem(e);if(!t)return[];var a=JSON.parse(t);return a&&Array.isArray(a.collapsed_ids)?a.collapsed_ids.map(String):[]}catch(e){return[]}}function r(){return document.querySelector("[data-page-manage-tree]")}function i(e){return e?Array.from(e.querySelectorAll("tbody tr[data-page-id]")):[]}function o(t){try{if(!t.length)return void sessionStorage.removeItem(e);sessionStorage.setItem(e,JSON.stringify({collapsed_ids:t}))}catch(e){}}function d(){var e=document.getElementById(t);e&&e.remove()}function c(){if(a){var e=i(r());e.length&&o(e.filter((function(e){return"1"===e.dataset.hasChildren&&"0"===e.dataset.treeExpanded})).map((function(e){return e.dataset.pageId})))}}function s(e,t){e.dataset.treeExpanded=t?"1":"0";var a=e.querySelector("[data-page-tree-toggle]");if(a){var n=t?"子ページを折り畳む":"子ページを展開する";a.setAttribute("aria-expanded",t?"true":"false"),a.setAttribute("aria-label",n),a.setAttribute("title",n)}}function u(e,t){e.forEach((function(e){e.hidden=!function(e,t){return(e.dataset.ancestorIds||"").split(" ").filter(Boolean).every((function(e){var a=t.get(e);return!a||"1"===a.dataset.treeExpanded}))}(e,t)}))}!function(){var e=n();if(e.length){var a=e.map((function(e){return'[data-page-manage-tree] tbody tr[data-ancestor-ids~="'+e+'"]'}));if(a.length){var r=document.getElementById(t);r||((r=document.createElement("style")).id=t,document.head.appendChild(r)),r.textContent=a.join(",\n")+" { display: none; }"}else d()}else d()}(),window.connectPageManageTree={init:function(){if(!a){var e=i(r());if(e.length){a=!0;var t=new Map(e.map((function(e){return[e.dataset.pageId,e]}))),l=e.filter((function(e){return"1"===e.dataset.hasChildren})),f=n();l.forEach((function(a){s(a,!0);var n=a.querySelector("[data-page-tree-toggle]");n&&n.addEventListener("click",(function(){var n="1"===a.dataset.treeExpanded;s(a,!n),u(e,t),c()}))}));var g=[];f.forEach((function(e){var a=t.get(e);a&&"1"===a.dataset.hasChildren&&(s(a,!1),g.push(e))})),u(e,t),o(g),d()}}},saveState:c}}(); \ No newline at end of file +!function(){var e="connect.manage.page.treeState:"+window.location.pathname,t="connect-page-manage-tree-preload-style",a=!1;function n(){try{var t=sessionStorage.getItem(e);if(!t)return[];var a=JSON.parse(t);return a&&Array.isArray(a.collapsed_ids)?a.collapsed_ids.map(String):[]}catch(e){return[]}}function r(){return document.querySelector("[data-page-manage-tree]")}function i(e){return e?Array.from(e.querySelectorAll("tbody tr[data-page-id]")):[]}function o(t){try{if(!t.length)return void sessionStorage.removeItem(e);sessionStorage.setItem(e,JSON.stringify({collapsed_ids:t}))}catch(e){}}function d(){var e=document.getElementById(t);e&&e.remove()}function c(){if(a){var e=i(r());e.length&&o(e.filter((function(e){return"1"===e.dataset.hasChildren&&"0"===e.dataset.treeExpanded})).map((function(e){return e.dataset.pageId})))}}function s(e,t){e.dataset.treeExpanded=t?"1":"0";var a=e.querySelector("[data-page-tree-toggle]");if(a){var n=t?"子ページを折り畳む":"子ページを展開する";a.setAttribute("aria-expanded",t?"true":"false"),a.setAttribute("aria-label",n),a.setAttribute("title",n)}}function u(e,t){e.forEach((function(e){e.hidden=!function(e,t){return(e.dataset.ancestorIds||"").split(" ").filter(Boolean).every((function(e){var a=t.get(e);return!a||"0"!==a.dataset.treeExpanded}))}(e,t)}))}!function(){var e=n();if(e.length){var a=e.map((function(e){return'[data-page-manage-tree] tbody tr[data-ancestor-ids~="'+e+'"]'}));if(a.length){var r=document.getElementById(t);r||((r=document.createElement("style")).id=t,document.head.appendChild(r)),r.textContent=a.join(",\n")+" { display: none; }"}else d()}else d()}(),window.connectPageManageTree={init:function(){if(!a){var e=i(r());if(e.length){a=!0;var t=new Map(e.map((function(e){return[e.dataset.pageId,e]}))),l=e.filter((function(e){return"1"===e.dataset.hasChildren})),f=n();l.forEach((function(a){s(a,!0);var n=a.querySelector("[data-page-tree-toggle]");n&&n.addEventListener("click",(function(){var n="1"===a.dataset.treeExpanded;s(a,!n),u(e,t),c()}))}));var g=[];f.forEach((function(e){var a=t.get(e);a&&"1"===a.dataset.hasChildren&&(s(a,!1),g.push(e))})),u(e,t),o(g),d()}}},saveState:c}}(); \ No newline at end of file diff --git a/public/mix-manifest.json b/public/mix-manifest.json index 66eee1be5..75b126c53 100644 --- a/public/mix-manifest.json +++ b/public/mix-manifest.json @@ -2,7 +2,7 @@ "/js/app.js": "/js/app.js?id=d37e2106d540855d1011725ff6dc8391", "/js/wysiwyg.js": "/js/wysiwyg.js?id=8a3ae361d356b17963d1073e631dff81", "/js/codemirror.js": "/js/codemirror.js?id=1648b8c7831f2474820107a74359317f", - "/js/manage/page/index.js": "/js/manage/page/index.js?id=2328c3465b2a0b89467b5f88ecda2893", + "/js/manage/page/index.js": "/js/manage/page/index.js?id=fcc08083204f8beb01ffa00fe8623f2e", "/css/app.css": "/css/app.css?id=d6fb0b661b1f484b915a1dd7c5d5f57c", "/fonts/vendor/@fortawesome/fontawesome-free/webfa-solid-900.woff2?2463b90d9a316e4e5294e6706b6a7a72": "/fonts/vendor/@fortawesome/fontawesome-free/webfa-solid-900.woff2?2463b90d9a316e4e5294e6706b6a7a72?id=109ad919b74a62a8a223361da1651bbc", "/fonts/vendor/@fortawesome/fontawesome-free/webfa-solid-900.ttf?2582b0e4bcf85eceead0de3fd9035c90": "/fonts/vendor/@fortawesome/fontawesome-free/webfa-solid-900.ttf?2582b0e4bcf85eceead0de3fd9035c90?id=8218477819a31609afa351933eebcdb4", diff --git a/resources/js/manage/page/index.js b/resources/js/manage/page/index.js index aa10a5833..79741ad00 100644 --- a/resources/js/manage/page/index.js +++ b/resources/js/manage/page/index.js @@ -178,10 +178,10 @@ function isRowVisible(row, rowMap) { const ancestorIds = (row.dataset.ancestorIds || '').split(' ').filter(Boolean); - // 祖先が一覧内に無い場合は隠さず表示する(表示漏れを防ぐ)。 + // 祖先行が無い/折り畳みトグルを持たない場合は隠さない(明示的に閉じている時だけ隠す)。 return ancestorIds.every(function (ancestorId) { const ancestorRow = rowMap.get(ancestorId); - return !ancestorRow || ancestorRow.dataset.treeExpanded === '1'; + return !ancestorRow || ancestorRow.dataset.treeExpanded !== '0'; }); }