From 64c422378f0552ad74a9cc96578755fb99e80d23 Mon Sep 17 00:00:00 2001 From: jade Date: Thu, 20 Aug 2026 09:22:03 +0900 Subject: [PATCH] feat(scaffold): add native folder picker for Workspace Path selection - Added /api/v1/scaffold/browse-folder endpoint in ScaffoldingController to open native JFileChooser. - Updated scaffold.html to use the new API for both Pod Module and Tool Function. - Fixed JS event listener bug where workspacePath changes only affected Pod Module. --- .../presentation/ScaffoldingController.java | 27 ++++++- .../main/resources/static/admin/scaffold.html | 77 +++++++++++++++++-- 2 files changed, 95 insertions(+), 9 deletions(-) diff --git a/dap-gateway/src/main/java/io/shinhanlife/dap/mcg/presentation/ScaffoldingController.java b/dap-gateway/src/main/java/io/shinhanlife/dap/mcg/presentation/ScaffoldingController.java index ce888fa9..c7edfdbd 100644 --- a/dap-gateway/src/main/java/io/shinhanlife/dap/mcg/presentation/ScaffoldingController.java +++ b/dap-gateway/src/main/java/io/shinhanlife/dap/mcg/presentation/ScaffoldingController.java @@ -67,12 +67,37 @@ public class ScaffoldingController { String date = req.get("date"); if (date == null || date.trim().isEmpty()) date = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy.MM.dd")); - return PodScaffolder.scaffoldPod(moduleName, port, shortName, author, date); + String defaultWorkspace = "c:\\eGovFrameDev-4.3.1-64bit\\workspace-egov\\dap-was-dapmt"; + String workspacePath = req.getOrDefault("workspacePath", defaultWorkspace); + if (workspacePath.trim().isEmpty()) { + workspacePath = defaultWorkspace; + } + System.setProperty("AXHUB_SOURCE_DIR", workspacePath); + + return PodScaffolder.scaffoldPod(moduleName, port, shortName, author, date); } catch (Exception e) { return "오류 발생: " + e.getMessage(); } } + @GetMapping("/browse-folder") + public String browseFolder() { + try { + System.setProperty("java.awt.headless", "false"); + javax.swing.JFileChooser chooser = new javax.swing.JFileChooser(); + chooser.setCurrentDirectory(new java.io.File("c:\\eGovFrameDev-4.3.1-64bit\\workspace-egov")); + chooser.setDialogTitle("Select Workspace Folder"); + chooser.setFileSelectionMode(javax.swing.JFileChooser.DIRECTORIES_ONLY); + chooser.setAcceptAllFileFilterUsed(false); + if (chooser.showOpenDialog(null) == javax.swing.JFileChooser.APPROVE_OPTION) { + return chooser.getSelectedFile().getAbsolutePath(); + } + } catch (Exception e) { + return "Error: " + e.getMessage(); + } + return ""; + } + @PostMapping("/tool") public String scaffoldTool(@RequestBody Map req) { try { diff --git a/dap-gateway/src/main/resources/static/admin/scaffold.html b/dap-gateway/src/main/resources/static/admin/scaffold.html index b61aea09..2b4f5072 100644 --- a/dap-gateway/src/main/resources/static/admin/scaffold.html +++ b/dap-gateway/src/main/resources/static/admin/scaffold.html @@ -797,6 +797,35 @@
+
+
+ + + +
직접 경로를 붙여넣거나 우측 [폴더 선택] 버튼을 눌러 선택하세요.
+
+
@@ -834,8 +863,23 @@
+
직접 경로를 붙여넣거나 우측 [폴더 선택] 버튼을 눌러 선택하세요.
@@ -1536,7 +1580,7 @@ document.addEventListener('DOMContentLoaded', function() { const loadModules = () => { - const workspacePath = document.querySelector('input[name="workspacePath"]')?.value || ''; + const workspacePath = document.querySelector('#toolForm input[name="workspacePath"]')?.value || document.querySelector('input[name="workspacePath"]')?.value || ''; fetch(`/api/v1/scaffold/modules?workspacePath=${encodeURIComponent(workspacePath)}`) .then(res => res.json()) .then(modules => { @@ -1551,11 +1595,11 @@ .catch(err => console.error('Failed to load modules:', err)); }; loadModules(); - const wsInput = document.querySelector('input[name="workspacePath"]'); - if (wsInput) { - wsInput.addEventListener('change', loadModules); - wsInput.addEventListener('blur', loadModules); // Typing custom path and clicking away - } + const wsInputs = document.querySelectorAll('input[name="workspacePath"]'); + wsInputs.forEach(wsInput => { + wsInput.addEventListener('change', loadModules); + wsInput.addEventListener('blur', loadModules); + }); }); handleFormSubmit('podForm', '/api/v1/scaffold/pod'); @@ -1626,7 +1670,7 @@ async function loadUseCasesForSelection() { const moduleName = document.getElementById('targetModuleSelect').value; - const workspacePath = document.querySelector('input[name="workspacePath"]')?.value || ''; + const workspacePath = document.querySelector('#toolForm input[name="workspacePath"]')?.value || document.querySelector('input[name="workspacePath"]')?.value || ''; const categoryKey = document.querySelector('#toolForm [name="categoryKey"]').value.trim(); const select = document.getElementById('toolGroupUseCaseSelect'); select.innerHTML = ''; @@ -1643,7 +1687,7 @@ async function loadCategoriesForSelection() { const moduleName = document.getElementById('targetModuleSelect').value; - const workspacePath = document.querySelector('input[name="workspacePath"]')?.value || ''; + const workspacePath = document.querySelector('#toolForm input[name="workspacePath"]')?.value || document.querySelector('input[name="workspacePath"]')?.value || ''; const select = document.getElementById('domainCategorySelect'); const nameInput = document.getElementById('domainCategoryName'); select.innerHTML = ''; @@ -2348,5 +2392,22 @@ } + +