fixing scroll bar
This commit is contained in:
parent
422ec731dd
commit
c750177fee
@ -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;
|
||||||
});
|
});
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user