fixing scroll bar

This commit is contained in:
JokoPrasetio 2026-06-11 12:05:12 +07:00
parent 422ec731dd
commit c750177fee
2 changed files with 118 additions and 4 deletions

View File

@ -221,7 +221,7 @@
const paginationEl = document.getElementById('paginationControls'); const paginationEl = document.getElementById('paginationControls');
// === INITIALIZATION === // === INITIALIZATION ===
document.addEventListener('DOMContentLoaded', () => { document.addEventListener('DOMContentLoaded', () => {
fetchData(); loadAkreData().finally(() => fetchData());
initEventListeners(); initEventListeners();
initTooltips(); initTooltips();
}); });
@ -319,12 +319,13 @@
// MODE 1: SEARCH VIEW (Flat View - Langsung tampilkan semua file) // MODE 1: SEARCH VIEW (Flat View - Langsung tampilkan semua file)
if (keyword.length > 0) { if (keyword.length > 0) {
currentData.forEach(item => renderFileRow(tbody, item)); sortAkreItemsByJff(currentData).forEach(item => renderFileRow(tbody, item));
return; return;
} }
// MODE 2: TREE VIEW (All folders & files) // MODE 2: TREE VIEW (All folders & files)
const tree = buildTree(currentData); const orderedItems = sortAkreItemsByJff(currentData);
const tree = buildTree(orderedItems);
if (expandedFolders.size === 0) { if (expandedFolders.size === 0) {
expandAllFolders(tree, ''); expandAllFolders(tree, '');
} }
@ -398,7 +399,11 @@
} }
function renderTree(tbody, node, basePath, level) { function renderTree(tbody, node, basePath, level) {
const folderNames = Object.keys(node.folders || {}).sort(); const folderNames = Object.keys(node.folders || {}).sort((left, right) => {
const leftPath = basePath ? `${basePath}/${left}` : left;
const rightPath = basePath ? `${basePath}/${right}` : right;
return compareAkrePaths(leftPath, rightPath);
});
folderNames.forEach(folder => { folderNames.forEach(folder => {
const folderPath = basePath ? `${basePath}/${folder}` : folder; const folderPath = basePath ? `${basePath}/${folder}` : folder;
@ -683,6 +688,64 @@
let akreData = []; let akreData = [];
let akreLoaded = false; let akreLoaded = false;
let akreFlat = []; let akreFlat = [];
let akreOrderMap = new Map();
function buildAkreOrderMap() {
akreOrderMap = new Map();
(akreData || []).forEach((typeItem, typeIndex) => {
const typeName = String(typeItem?.name || '').trim();
if (!typeName) return;
akreOrderMap.set(typeName, [typeIndex, -1, -1]);
const segments = Array.isArray(typeItem?.segment) ? typeItem.segment : [];
segments.forEach((segment, segmentIndex) => {
const segmentName = String(segment?.name || '').trim();
if (!segmentName) return;
const segmentPath = `${typeName}/${segmentName}`;
akreOrderMap.set(segmentPath, [typeIndex, segmentIndex, -1]);
const children = Array.isArray(segment?.turunan) ? segment.turunan : [];
children.forEach((child, childIndex) => {
const childName = String(child?.name || '').trim();
if (!childName) return;
akreOrderMap.set(`${segmentPath}/${childName}`, [typeIndex, segmentIndex, childIndex]);
});
});
});
}
function getAkreFolderPathFromFile(filePath) {
const parts = String(filePath || '').split('/').filter(Boolean);
if (parts.length <= 1) return '';
parts.pop();
return parts.join('/');
}
function compareAkrePaths(leftPath, rightPath) {
const leftOrder = akreOrderMap.get(leftPath) || [Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER];
const rightOrder = akreOrderMap.get(rightPath) || [Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER];
for (let i = 0; i < 3; i++) {
if (leftOrder[i] !== rightOrder[i]) {
return leftOrder[i] - rightOrder[i];
}
}
return leftPath.localeCompare(rightPath, undefined, { numeric: true, sensitivity: 'base' });
}
function sortAkreItemsByJff(items = []) {
return [...items].sort((left, right) => {
const leftFolderPath = getAkreFolderPathFromFile(left?.file || '');
const rightFolderPath = getAkreFolderPathFromFile(right?.file || '');
const pathCompare = compareAkrePaths(leftFolderPath, rightFolderPath);
if (pathCompare !== 0) return pathCompare;
const leftName = String(left?.nama_dokumen || left?.file || '').toLowerCase();
const rightName = String(right?.nama_dokumen || right?.file || '').toLowerCase();
return leftName.localeCompare(rightName, undefined, { numeric: true, sensitivity: 'base' });
});
}
function loadAkreData(){ function loadAkreData(){
if(akreLoaded) return Promise.resolve(akreData); if(akreLoaded) return Promise.resolve(akreData);
@ -691,12 +754,14 @@
.then(data => { .then(data => {
akreData = Array.isArray(data) ? data : []; akreData = Array.isArray(data) ? data : [];
akreFlat = []; akreFlat = [];
buildAkreOrderMap();
akreLoaded = true; akreLoaded = true;
return akreData; return akreData;
}) })
.catch(() => { .catch(() => {
akreData = []; akreData = [];
akreFlat = []; akreFlat = [];
akreOrderMap = new Map();
akreLoaded = true; akreLoaded = true;
return akreData; return akreData;
}); });

View File

@ -21,6 +21,55 @@
<script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/toastify-js"></script> <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/toastify-js"></script>
<style> <style>
html,
body,
.body-wrapper,
.body-wrapper-inner,
.container-fluid {
scroll-behavior: smooth;
scrollbar-width: thin;
scrollbar-color: rgba(148, 163, 184, 0.5) transparent;
}
html::-webkit-scrollbar,
body::-webkit-scrollbar,
.body-wrapper::-webkit-scrollbar,
.body-wrapper-inner::-webkit-scrollbar,
.container-fluid::-webkit-scrollbar {
width: 6px;
height: 6px;
}
html::-webkit-scrollbar-track,
body::-webkit-scrollbar-track,
.body-wrapper::-webkit-scrollbar-track,
.body-wrapper-inner::-webkit-scrollbar-track,
.container-fluid::-webkit-scrollbar-track {
background: transparent;
border-radius: 999px;
}
html::-webkit-scrollbar-thumb,
body::-webkit-scrollbar-thumb,
.body-wrapper::-webkit-scrollbar-thumb,
.body-wrapper-inner::-webkit-scrollbar-thumb,
.container-fluid::-webkit-scrollbar-thumb {
background: rgba(148, 163, 184, 0.5);
border-radius: 999px;
border: 1px solid transparent;
background-clip: padding-box;
}
html::-webkit-scrollbar-thumb:hover,
body::-webkit-scrollbar-thumb:hover,
.body-wrapper::-webkit-scrollbar-thumb:hover,
.body-wrapper-inner::-webkit-scrollbar-thumb:hover,
.container-fluid::-webkit-scrollbar-thumb:hover {
background: rgba(100, 116, 139, 0.68);
border: 1px solid transparent;
background-clip: padding-box;
}
.modal, .modal,
.modal-content, .modal-content,
.modal-body, .modal-body,