//////////////////////////////////////////////////////////////////////////////////////// //Page 전역 변수 //////////////////////////////////////////////////////////////////////////////////////// var checkedItemsMap = {}; // path를 키로 사용하여 폴더 간 체크 항목 누적 저장 var registeredItemsMap = {}; // 오른쪽 등록 목록 (path 기준 중복 방지) { name, path, fieldRoles } var currentPreviewItem = null; // 현재 Preview 중인 파일 정보 var currentUploadFolder = ""; // 업로드 모달에서 선택된 폴더 경로 var isCreatingNode = false; // 노드 생성 중 여부 var currentSelectedFolder = ""; // 메인 트리에서 선택된 폴더 경로 //////////////////////////////////////////////////////////////////////////////////////// //Document Ready //////////////////////////////////////////////////////////////////////////////////////// function execDocReady() { let pluginGroups = [ [ "../reference/light-blue/lib/vendor/jquery.ui.widget.js", "../reference/light-blue/lib/vendor/http_blueimp.github.io_JavaScript-Templates_js_tmpl.js", "../reference/light-blue/lib/vendor/http_blueimp.github.io_JavaScript-Load-Image_js_load-image.js", "../reference/light-blue/lib/vendor/http_blueimp.github.io_JavaScript-Canvas-to-Blob_js_canvas-to-blob.js", "../reference/light-blue/lib/jquery.iframe-transport.js", "../reference/light-blue/lib/jquery.fileupload.js", "../reference/light-blue/lib/jquery.fileupload-fp.js", "../reference/light-blue/lib/jquery.fileupload-ui.js", "../reference/lightblue4/docs/lib/widgster/widgster.js", "../reference/lightblue4/docs/lib/slimScroll/jquery.slimscroll.min.js", // JS tree "../reference/jquery-plugins/jstree-v.pre1.0/_lib/jquery.cookie.js", "../reference/jquery-plugins/jstree-v.pre1.0/_lib/jquery.hotkeys.js", "../reference/jquery-plugins/jstree-v.pre1.0/jquery.jstree.js" ], [ "../reference/jquery-plugins/dataTables-1.10.16/media/css/jquery.dataTables_lightblue4.css", "../reference/jquery-plugins/dataTables-1.10.16/extensions/Responsive/css/responsive.dataTables_lightblue4.css", "../reference/jquery-plugins/dataTables-1.10.16/extensions/Select/css/select.dataTables_lightblue4.css", "../reference/jquery-plugins/dataTables-1.10.16/media/js/jquery.dataTables.min.js", "../reference/jquery-plugins/dataTables-1.10.16/extensions/Responsive/js/dataTables.responsive.min.js", "../reference/jquery-plugins/dataTables-1.10.16/extensions/Select/js/dataTables.select.min.js", "../reference/jquery-plugins/dataTables-1.10.16/extensions/RowGroup/js/dataTables.rowsGroup.min.js", "../reference/jquery-plugins/dataTables-1.10.16/extensions/Buttons/js/dataTables.buttons.min.js", "../reference/jquery-plugins/dataTables-1.10.16/extensions/Buttons/js/buttons.html5.js", "../reference/jquery-plugins/dataTables-1.10.16/extensions/Buttons/js/buttons.print.js", "../reference/jquery-plugins/dataTables-1.10.16/extensions/Buttons/js/jszip.min.js", "../reference/jquery-plugins/dataTables-1.10.16/extensions/Buttons/js/pdfmake.min.js", "../reference/jquery-plugins/dataTables-1.10.16/extensions/Buttons/js/vfs_fonts.js" ], ["../arms/js/common/table_new.js"] ]; loadPluginGroupsParallelAndSequential(pluginGroups) .then(function () { console.log("모든 플러그인 로드 완료"); $(".widget").widgster(); setSideMenu("sidebar_menu_config", "sidebar_menu_config_vectorIndexing"); initVectorIndexTree(); initRegisteredTable(); btnClickEvent(); initFileUpload(); // slimScroll 적용 $("#vector_index_list").slimScroll({ height: "500px", railVisible: true, railColor: "#222", railOpacity: 0.3, wheelStep: 10, allowPageScroll: false, disableFadeOut: false }); $("#jsonPreviewArea").slimScroll({ height: "500px", railVisible: true, railColor: "#222", railOpacity: 0.3, wheelStep: 10, allowPageScroll: false, disableFadeOut: false }); }) .catch(function (error) { console.error("플러그인 로드 중 오류 발생", error); }); } //////////////////////////////////////////////////////////////////////////////////////// // 데이터 테이블 공통 콜백 //////////////////////////////////////////////////////////////////////////////////////// function dataTableClick(tempDataTable, selectedData) { let tableId = tempDataTable.context[0].sInstance; console.log("Table clicked: " + tableId); } function dataTableCallBack(settings, json) { } function dataTableDrawCallback(tableInfo) { $("#" + tableInfo.sInstance) .DataTable() .columns.adjust() .responsive.recalc(); } //////////////////////////////////////////////////////////////////////////////////////// // 공통 유틸 함수 //////////////////////////////////////////////////////////////////////////////////////// function renderValue(data) { return data ? "" + data + "" : "N/A"; } function isNdjsonFile(path) { return /\.ndjson$/i.test(path); } function getVectorApiUrl(path) { return isNdjsonFile(path) ? "/ai-api/admin/vector/ndjson" : "/ai-api/admin/vector"; } function escapeHtml(text) { var div = document.createElement("div"); div.appendChild(document.createTextNode(text)); return div.innerHTML; } //////////////////////////////////////////////////////////////////////////////////////// // Vector Index Tree (왼쪽 패널) //////////////////////////////////////////////////////////////////////////////////////// function initVectorIndexTree() { var $target = $("#vector_index_list"); if ($target.jstree(true)) { $target.jstree("destroy").html("

조회된 데이터가 없습니다.

"); } $.get("/ai-api/admin/filesystem/directories").done(function (response) { var list = Array.isArray(response) ? response : (response && Array.isArray(response.response)) ? response.response : []; var treeData = { data: { data: "Vector Indexing (root)", state: "open", attr: { rel: "drive" }, children: list.map(function (item) { return { data: item.fileName || item.name || item, attr: { rel: item.type }, metadata: { path: item.path, name: item.name } }; }) } }; // folder, drive 타입 노드에서 체크박스 숨김 (CSS) $("