diff --git a/public/js/manage/page/index.js b/public/js/manage/page/index.js index 1412047d7..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 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||"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 d64d5e167..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=0baec4e0bdc17faa6677a2d9c0bed29b", + "/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 46d32e9e2..79741ad00 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 !== '0'; + }); } /**