@eclipse-docks/core 0.7.137 → 0.7.140

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/dist/api/index.js +3 -3
  2. package/dist/{api-3h__hDci.js → api-BZXW896G.js} +122 -49
  3. package/dist/api-BZXW896G.js.map +1 -0
  4. package/dist/components/filebrowser.d.ts +12 -1
  5. package/dist/components/filebrowser.d.ts.map +1 -1
  6. package/dist/components/tasks.d.ts.map +1 -1
  7. package/dist/core/filesys/common.d.ts +1 -0
  8. package/dist/core/filesys/common.d.ts.map +1 -1
  9. package/dist/{filebrowser.de-LWsrI9xj.js → filebrowser.de-BfFcNr19.js} +13 -3
  10. package/dist/{filebrowser.de-LWsrI9xj.js.map → filebrowser.de-BfFcNr19.js.map} +1 -1
  11. package/dist/{filebrowser.en-C02vpzAs.js → filebrowser.en-CLd5Mccb.js} +13 -3
  12. package/dist/{filebrowser.en-C02vpzAs.js.map → filebrowser.en-CLd5Mccb.js.map} +1 -1
  13. package/dist/fs-access-B1bmJ5U0.js +2 -0
  14. package/dist/{fs-access-Cjcg0_Me.js → fs-access-CrktZo-_.js} +2 -1
  15. package/dist/fs-access-CrktZo-_.js.map +1 -0
  16. package/dist/index.js +3 -3
  17. package/dist/parts/index.js +1 -1
  18. package/dist/{parts-DMjNqL4o.js → parts-KvjEFJ7v.js} +4 -4
  19. package/dist/parts-KvjEFJ7v.js.map +1 -0
  20. package/dist/webawesome-C0Da7hPu.js.map +1 -1
  21. package/dist/widget-DUR6wxME.js.map +1 -1
  22. package/package.json +2 -2
  23. package/src/components/filebrowser.de.json +6 -1
  24. package/src/components/filebrowser.en.json +6 -1
  25. package/src/components/filebrowser.ts +120 -28
  26. package/src/components/tasks.ts +16 -15
  27. package/src/core/filesys/common.ts +2 -1
  28. package/dist/api-3h__hDci.js.map +0 -1
  29. package/dist/fs-access-Cjcg0_Me.js.map +0 -1
  30. package/dist/fs-access-Dp9Fwsxk.js +0 -2
  31. package/dist/parts-DMjNqL4o.js.map +0 -1
package/dist/api/index.js CHANGED
@@ -1,7 +1,7 @@
1
- import { $ as COMMAND_SAVE, A as VIEW_LOG_TERMINAL, C as TOOLBAR_FULLSCREEN, D as TOOLBAR_TASKS, E as TOOLBAR_LAYOUT_SWITCHER, F as formDialog, G as sanitizeHtml, H as DocksDialogContent, I as formDialogRequired, J as extensionRegistry, L as validateFormDialogFields, M as navigableInfoDialog, N as confirmDialog, O as TOOLBAR_THEME_SWITCHER, P as infoDialog, Q as appSettings, R as promptDialog, S as TOOLBAR_FAST_VIEWS, T as TOOLBAR_LANGUAGE_SELECTOR, U as DocksElement, V as dialogService, W as parseMarkdownHtml, X as taskService, Y as esmShService, Z as TOPIC_SETTINGS_CHANGED, _ as CTXMENU_FILEBROWSER_DELETE, _t as TOOLBAR_MAIN, a as renderDropdownItem, at as PANEL_BOTTOM, b as SYSTEM_DEFAULT_FILE_ICONS, c as parseIconSpec, ct as SIDEBAR_MAIN, d as DocksContainer, dt as SYSTEM_ATTRIBUTIONS, et as HIDE_DOT_RESOURCE, f as ABOUT_TAB_ATTRIBUTIONS, ft as SYSTEM_LAYOUTS, g as ATTRIBUTION_FONT_AWESOME, gt as TOOLBAR_BOTTOM_END, h as ATTRIBUTION_ECLIPSE_DOCKS, ht as TOOLBAR_BOTTOM_CENTER, i as renderDropdownContributions, it as EDITOR_AREA_MAIN, j as filebrowserDialog, k as VIEW_FILEBROWSER, l as versionInfoDialog, lt as SIDEBAR_MAIN_BOTTOM, m as ABOUT_TAB_RELEASE, mt as TOOLBAR_BOTTOM, n as renderCommandContribution, o as renderDropdownSubmenu, ot as SIDEBAR_AUXILIARY, p as ABOUT_TAB_PACKAGES, pt as SYSTEM_VIEWS, r as renderDropdownContribution, rt as ABOUT_TABS, s as icon, st as SIDEBAR_AUXILIARY_BOTTOM, t as handleDropdownWaSelect, tt as MouseButton, u as DocksPart, ut as SIDEBAR_MAIN_TOOLBAR, v as CTXMENU_FILEBROWSER_RENAME, vt as TOOLBAR_MAIN_CENTER, w as TOOLBAR_INFO, x as TOOLBAR_ACTIVE_PART_NAME, y as SIDEBAR_TOOLBAR_EXTENSIONS, yt as TOOLBAR_MAIN_RIGHT, z as appLoaderService } from "../parts-DMjNqL4o.js";
1
+ import { $ as COMMAND_SAVE, A as VIEW_LOG_TERMINAL, C as TOOLBAR_FULLSCREEN, D as TOOLBAR_TASKS, E as TOOLBAR_LAYOUT_SWITCHER, F as formDialog, G as sanitizeHtml, H as DocksDialogContent, I as formDialogRequired, J as extensionRegistry, L as validateFormDialogFields, M as navigableInfoDialog, N as confirmDialog, O as TOOLBAR_THEME_SWITCHER, P as infoDialog, Q as appSettings, R as promptDialog, S as TOOLBAR_FAST_VIEWS, T as TOOLBAR_LANGUAGE_SELECTOR, U as DocksElement, V as dialogService, W as parseMarkdownHtml, X as taskService, Y as esmShService, Z as TOPIC_SETTINGS_CHANGED, _ as CTXMENU_FILEBROWSER_DELETE, _t as TOOLBAR_MAIN, a as renderDropdownItem, at as PANEL_BOTTOM, b as SYSTEM_DEFAULT_FILE_ICONS, c as parseIconSpec, ct as SIDEBAR_MAIN, d as DocksContainer, dt as SYSTEM_ATTRIBUTIONS, et as HIDE_DOT_RESOURCE, f as ABOUT_TAB_ATTRIBUTIONS, ft as SYSTEM_LAYOUTS, g as ATTRIBUTION_FONT_AWESOME, gt as TOOLBAR_BOTTOM_END, h as ATTRIBUTION_ECLIPSE_DOCKS, ht as TOOLBAR_BOTTOM_CENTER, i as renderDropdownContributions, it as EDITOR_AREA_MAIN, j as filebrowserDialog, k as VIEW_FILEBROWSER, l as versionInfoDialog, lt as SIDEBAR_MAIN_BOTTOM, m as ABOUT_TAB_RELEASE, mt as TOOLBAR_BOTTOM, n as renderCommandContribution, o as renderDropdownSubmenu, ot as SIDEBAR_AUXILIARY, p as ABOUT_TAB_PACKAGES, pt as SYSTEM_VIEWS, r as renderDropdownContribution, rt as ABOUT_TABS, s as icon, st as SIDEBAR_AUXILIARY_BOTTOM, t as handleDropdownWaSelect, tt as MouseButton, u as DocksPart, ut as SIDEBAR_MAIN_TOOLBAR, v as CTXMENU_FILEBROWSER_RENAME, vt as TOOLBAR_MAIN_CENTER, w as TOOLBAR_INFO, x as TOOLBAR_ACTIVE_PART_NAME, y as SIDEBAR_TOOLBAR_EXTENSIONS, yt as TOOLBAR_MAIN_RIGHT, z as appLoaderService } from "../parts-KvjEFJ7v.js";
2
2
  import { i as setLogLevel, n as defaultLogger, o as rootContext, s as uiContext, t as createLogger } from "../logger-CiT0Cc4g.js";
3
3
  import { C as overrideContributionTargets, E as toastWarning, S as listContributionNameRemaps, T as toastInfo, a as TOPIC_COMMAND_REGISTERED, b as applyConfigNameRemaps, c as EMPTY_SIGNALPORT, d as activeSelectionSignal, f as activeTasksSignal, g as contributionRegistry, h as TOPIC_CONTRIBUTEIONS_CHANGED, i as CommandStack, l as activeEditorSignal, m as perspectiveSwitchedSignal, n as watchSignal, o as commandRegistry, p as partDirtySignal, r as CommandRegistry, s as registerAll, t as DocksWidget, u as activePartSignal, w as toastError, x as contributionTargetMappingRegistry } from "../widget-DUR6wxME.js";
4
4
  import { n as subscribe, r as unsubscribe, t as publish } from "../events-BAE5R6TH.js";
5
- import { a as File, c as StringFile, f as WorkspaceService, i as Directory, l as TOPIC_WORKSPACE_CHANGED, m as persistenceService, o as FileContentType, p as workspaceService, r as CompositeDirectory, t as FileSysDirHandleResource, u as TOPIC_WORKSPACE_CONNECTED } from "../fs-access-Cjcg0_Me.js";
6
- import { _ as createLazyLabel, a as DocksStandardLayout, c as LAYOUT_PANEL_OPTIONS, d as findStandardLayout, f as layoutIdToPanelVisibility, g as editorRegistry, h as treeNodeComparator, i as createJsRuntime, l as LAYOUT_PANEL_SETTINGS_KEY, m as resolveStoredPanelVisibility, n as getFrameworkConfig, o as registerLicenseAttribution, p as resolveInitialPanelVisibilityFromApp, r as runJavaScriptCode, s as DEFAULT_LAYOUT_PANEL_VISIBILITY, t as configureFramework, u as LEGACY_PREFERRED_LAYOUT_KEY, v as i18n } from "../api-3h__hDci.js";
5
+ import { a as File, c as StringFile, f as WorkspaceService, i as Directory, l as TOPIC_WORKSPACE_CHANGED, m as persistenceService, o as FileContentType, p as workspaceService, r as CompositeDirectory, t as FileSysDirHandleResource, u as TOPIC_WORKSPACE_CONNECTED } from "../fs-access-CrktZo-_.js";
6
+ import { _ as createLazyLabel, a as DocksStandardLayout, c as LAYOUT_PANEL_OPTIONS, d as findStandardLayout, f as layoutIdToPanelVisibility, g as editorRegistry, h as treeNodeComparator, i as createJsRuntime, l as LAYOUT_PANEL_SETTINGS_KEY, m as resolveStoredPanelVisibility, n as getFrameworkConfig, o as registerLicenseAttribution, p as resolveInitialPanelVisibilityFromApp, r as runJavaScriptCode, s as DEFAULT_LAYOUT_PANEL_VISIBILITY, t as configureFramework, u as LEGACY_PREFERRED_LAYOUT_KEY, v as i18n } from "../api-BZXW896G.js";
7
7
  export { ABOUT_TABS, ABOUT_TAB_ATTRIBUTIONS, ABOUT_TAB_PACKAGES, ABOUT_TAB_RELEASE, ATTRIBUTION_ECLIPSE_DOCKS, ATTRIBUTION_FONT_AWESOME, COMMAND_SAVE, CTXMENU_FILEBROWSER_DELETE, CTXMENU_FILEBROWSER_RENAME, CommandRegistry, CommandStack, CompositeDirectory, DEFAULT_LAYOUT_PANEL_VISIBILITY, Directory, DocksContainer, DocksDialogContent, DocksElement, DocksPart, DocksStandardLayout, DocksWidget, EDITOR_AREA_MAIN, EMPTY_SIGNALPORT, File, FileContentType, FileSysDirHandleResource, HIDE_DOT_RESOURCE, LAYOUT_PANEL_OPTIONS, LAYOUT_PANEL_SETTINGS_KEY, LEGACY_PREFERRED_LAYOUT_KEY, MouseButton, PANEL_BOTTOM, SIDEBAR_AUXILIARY, SIDEBAR_AUXILIARY_BOTTOM, SIDEBAR_MAIN, SIDEBAR_MAIN_BOTTOM, SIDEBAR_MAIN_TOOLBAR, SIDEBAR_TOOLBAR_EXTENSIONS, SYSTEM_ATTRIBUTIONS, SYSTEM_DEFAULT_FILE_ICONS, SYSTEM_LAYOUTS, SYSTEM_VIEWS, StringFile, TOOLBAR_ACTIVE_PART_NAME, TOOLBAR_BOTTOM, TOOLBAR_BOTTOM_CENTER, TOOLBAR_BOTTOM_END, TOOLBAR_FAST_VIEWS, TOOLBAR_FULLSCREEN, TOOLBAR_INFO, TOOLBAR_LANGUAGE_SELECTOR, TOOLBAR_LAYOUT_SWITCHER, TOOLBAR_MAIN, TOOLBAR_MAIN_CENTER, TOOLBAR_MAIN_RIGHT, TOOLBAR_TASKS, TOOLBAR_THEME_SWITCHER, TOPIC_COMMAND_REGISTERED, TOPIC_CONTRIBUTEIONS_CHANGED, TOPIC_SETTINGS_CHANGED, TOPIC_WORKSPACE_CHANGED, TOPIC_WORKSPACE_CONNECTED, VIEW_FILEBROWSER, VIEW_LOG_TERMINAL, WorkspaceService, activeEditorSignal, activePartSignal, activeSelectionSignal, activeTasksSignal, appLoaderService, appSettings, applyConfigNameRemaps, commandRegistry, configureFramework, confirmDialog, contributionRegistry, contributionTargetMappingRegistry, createJsRuntime, createLazyLabel, createLogger, dialogService, editorRegistry, esmShService, extensionRegistry, filebrowserDialog, findStandardLayout, formDialog, formDialogRequired, getFrameworkConfig, handleDropdownWaSelect, i18n, icon, infoDialog, layoutIdToPanelVisibility, listContributionNameRemaps, defaultLogger as logger, navigableInfoDialog, overrideContributionTargets, parseIconSpec, parseMarkdownHtml, partDirtySignal, persistenceService, perspectiveSwitchedSignal, promptDialog, publish, registerAll, registerLicenseAttribution, renderCommandContribution, renderDropdownContribution, renderDropdownContributions, renderDropdownItem, renderDropdownSubmenu, resolveInitialPanelVisibilityFromApp, resolveStoredPanelVisibility, rootContext, runJavaScriptCode, sanitizeHtml, setLogLevel, subscribe, taskService, toastError, toastInfo, toastWarning, treeNodeComparator, uiContext, unsubscribe, validateFormDialogFields, versionInfoDialog, watchSignal, workspaceService };
@@ -1,8 +1,8 @@
1
- import { A as VIEW_LOG_TERMINAL, B as deleteIndexedDbWorkspaceData, C as TOOLBAR_FULLSCREEN, D as TOOLBAR_TASKS, E as TOOLBAR_LAYOUT_SWITCHER, J as extensionRegistry, K as keyBindingManager, N as confirmDialog, O as TOOLBAR_THEME_SWITCHER, Q as appSettings, R as promptDialog, S as TOOLBAR_FAST_VIEWS, T as TOOLBAR_LANGUAGE_SELECTOR, U as DocksElement, X as taskService, Y as esmShService, Z as TOPIC_SETTINGS_CHANGED, _t as TOOLBAR_MAIN, a as renderDropdownItem, at as PANEL_BOTTOM, ct as SIDEBAR_MAIN, d as DocksContainer, dt as SYSTEM_ATTRIBUTIONS, f as ABOUT_TAB_ATTRIBUTIONS, ft as SYSTEM_LAYOUTS, g as ATTRIBUTION_FONT_AWESOME, gt as TOOLBAR_BOTTOM_END, h as ATTRIBUTION_ECLIPSE_DOCKS, ht as TOOLBAR_BOTTOM_CENTER, it as EDITOR_AREA_MAIN, j as filebrowserDialog, k as VIEW_FILEBROWSER, l as versionInfoDialog, lt as SIDEBAR_MAIN_BOTTOM, m as ABOUT_TAB_RELEASE, mt as TOOLBAR_BOTTOM, nt as constants_exports, o as renderDropdownSubmenu, ot as SIDEBAR_AUXILIARY, p as ABOUT_TAB_PACKAGES, q as TOPIC_EXTENSIONS_CHANGED, r as renderDropdownContribution, rt as ABOUT_TABS, s as icon, st as SIDEBAR_AUXILIARY_BOTTOM, t as handleDropdownWaSelect, u as DocksPart, ut as SIDEBAR_MAIN_TOOLBAR, vt as TOOLBAR_MAIN_CENTER, w as TOOLBAR_INFO, x as TOOLBAR_ACTIVE_PART_NAME, y as SIDEBAR_TOOLBAR_EXTENSIONS, yt as TOOLBAR_MAIN_RIGHT, z as appLoaderService } from "./parts-DMjNqL4o.js";
1
+ import { A as VIEW_LOG_TERMINAL, B as deleteIndexedDbWorkspaceData, C as TOOLBAR_FULLSCREEN, D as TOOLBAR_TASKS, E as TOOLBAR_LAYOUT_SWITCHER, J as extensionRegistry, K as keyBindingManager, N as confirmDialog, O as TOOLBAR_THEME_SWITCHER, Q as appSettings, R as promptDialog, S as TOOLBAR_FAST_VIEWS, T as TOOLBAR_LANGUAGE_SELECTOR, U as DocksElement, X as taskService, Y as esmShService, Z as TOPIC_SETTINGS_CHANGED, _t as TOOLBAR_MAIN, a as renderDropdownItem, at as PANEL_BOTTOM, ct as SIDEBAR_MAIN, d as DocksContainer, dt as SYSTEM_ATTRIBUTIONS, f as ABOUT_TAB_ATTRIBUTIONS, ft as SYSTEM_LAYOUTS, g as ATTRIBUTION_FONT_AWESOME, gt as TOOLBAR_BOTTOM_END, h as ATTRIBUTION_ECLIPSE_DOCKS, ht as TOOLBAR_BOTTOM_CENTER, it as EDITOR_AREA_MAIN, j as filebrowserDialog, k as VIEW_FILEBROWSER, l as versionInfoDialog, lt as SIDEBAR_MAIN_BOTTOM, m as ABOUT_TAB_RELEASE, mt as TOOLBAR_BOTTOM, nt as constants_exports, o as renderDropdownSubmenu, ot as SIDEBAR_AUXILIARY, p as ABOUT_TAB_PACKAGES, q as TOPIC_EXTENSIONS_CHANGED, r as renderDropdownContribution, rt as ABOUT_TABS, s as icon, st as SIDEBAR_AUXILIARY_BOTTOM, t as handleDropdownWaSelect, u as DocksPart, ut as SIDEBAR_MAIN_TOOLBAR, vt as TOOLBAR_MAIN_CENTER, w as TOOLBAR_INFO, x as TOOLBAR_ACTIVE_PART_NAME, y as SIDEBAR_TOOLBAR_EXTENSIONS, yt as TOOLBAR_MAIN_RIGHT, z as appLoaderService } from "./parts-KvjEFJ7v.js";
2
2
  import { a as unregisterLogHandler, o as rootContext, r as registerLogHandler, s as uiContext, t as createLogger } from "./logger-CiT0Cc4g.js";
3
3
  import { E as toastWarning, T as toastInfo, d as activeSelectionSignal, f as activeTasksSignal, g as contributionRegistry, h as TOPIC_CONTRIBUTEIONS_CHANGED, n as watchSignal, s as registerAll, t as DocksWidget, u as activePartSignal, v as getContributionVisible, w as toastError } from "./widget-DUR6wxME.js";
4
4
  import { n as subscribe, t as publish } from "./events-BAE5R6TH.js";
5
- import { a as File, d as UnavailableWorkspaceFolderDirectory, i as Directory, l as TOPIC_WORKSPACE_CHANGED, o as FileContentType, p as workspaceService, s as Resource, u as TOPIC_WORKSPACE_CONNECTED } from "./fs-access-Cjcg0_Me.js";
5
+ import { a as File, d as UnavailableWorkspaceFolderDirectory, i as Directory, l as TOPIC_WORKSPACE_CHANGED, o as FileContentType, p as workspaceService, s as Resource, u as TOPIC_WORKSPACE_CONNECTED } from "./fs-access-CrktZo-_.js";
6
6
  import "./widgets-A9XMOA_j.js";
7
7
  import { css, html, nothing, render } from "lit";
8
8
  import { signal } from "@lit-labs/signals";
@@ -302,10 +302,70 @@ var treeNodeComparator = (c1, c2) => {
302
302
  var _DocksFileBrowser;
303
303
  var logger$1 = createLogger("DocksFileBrowser");
304
304
  var t$6 = await i18n(/* #__PURE__ */ Object.assign({
305
- "./filebrowser.de.json": () => import("./filebrowser.de-LWsrI9xj.js"),
306
- "./filebrowser.en.json": () => import("./filebrowser.en-C02vpzAs.js")
305
+ "./filebrowser.de.json": () => import("./filebrowser.de-BfFcNr19.js"),
306
+ "./filebrowser.en.json": () => import("./filebrowser.en-CLd5Mccb.js")
307
307
  }));
308
308
  var WORKSPACE_CHANGED_DEBOUNCE_MS = 250;
309
+ function readFileEntry(entry) {
310
+ return new Promise((resolve, reject) => entry.file(resolve, reject));
311
+ }
312
+ /** `readEntries` returns at most 100 entries and must be called until an empty batch. */
313
+ function readAllDirectoryEntries(reader) {
314
+ return new Promise((resolve, reject) => {
315
+ const all = [];
316
+ const readBatch = () => {
317
+ reader.readEntries((batch) => {
318
+ if (batch.length === 0) {
319
+ resolve(all);
320
+ return;
321
+ }
322
+ all.push(...batch);
323
+ readBatch();
324
+ }, reject);
325
+ };
326
+ readBatch();
327
+ });
328
+ }
329
+ async function appendDroppedEntry(entry, uploads, onFileFound, parentPath = "") {
330
+ const relativePath = parentPath ? `${parentPath}/${entry.name}` : entry.name;
331
+ if (entry.isFile) {
332
+ try {
333
+ uploads.push({
334
+ relativePath,
335
+ file: await readFileEntry(entry)
336
+ });
337
+ onFileFound?.(uploads.length);
338
+ } catch (error) {
339
+ logger$1.error(`Failed to read dropped file "${relativePath}":`, error);
340
+ }
341
+ return;
342
+ }
343
+ if (!entry.isDirectory) return;
344
+ let children;
345
+ try {
346
+ children = await readAllDirectoryEntries(entry.createReader());
347
+ } catch (error) {
348
+ logger$1.error(`Failed to read dropped folder "${relativePath}":`, error);
349
+ return;
350
+ }
351
+ for (const child of children) await appendDroppedEntry(child, uploads, onFileFound, relativePath);
352
+ }
353
+ /**
354
+ * Folder structure is only exposed through `webkitGetAsEntry()`; `dataTransfer.files` lists a dropped
355
+ * folder as a single unreadable file. Entries must be captured before the first `await`, because the
356
+ * drag data store becomes inaccessible once the drop handler yields.
357
+ */
358
+ async function collectDroppedUploads(dataTransfer, onFileFound) {
359
+ const entries = Array.from(dataTransfer.items ?? []).filter((item) => item.kind === "file").map((item) => item.webkitGetAsEntry?.() ?? null).filter((entry) => entry !== null);
360
+ const files = Array.from(dataTransfer.files ?? []);
361
+ if (entries.length === 0) return files.map((file) => ({
362
+ relativePath: file.webkitRelativePath || file.name,
363
+ file
364
+ }));
365
+ const uploads = [];
366
+ for (const entry of entries) await appendDroppedEntry(entry, uploads, onFileFound);
367
+ return uploads;
368
+ }
309
369
  var DocksFileBrowser = class DocksFileBrowser extends DocksPart {
310
370
  static {
311
371
  _DocksFileBrowser = this;
@@ -746,15 +806,17 @@ var DocksFileBrowser = class DocksFileBrowser extends DocksPart {
746
806
  if (!targetDir) return;
747
807
  const types = e.dataTransfer.types;
748
808
  if (types.includes("Files")) {
749
- const files = Array.from(e.dataTransfer.files);
750
- if (files.length === 0) return;
751
- await this.handleFilesDrop(files, targetDir);
752
- return;
753
- }
754
- if (types.includes("application/x-workspace-file")) {
755
- await this.handleWorkspaceDrop(e, targetDir);
809
+ const dataTransfer = e.dataTransfer;
810
+ await taskService.runAsync(t$6.DROP_UPLOAD_TASK, async (progress) => {
811
+ const uploads = await collectDroppedUploads(dataTransfer, (count) => {
812
+ progress.message = t$6.DROP_SCANNING({ count: String(count) });
813
+ });
814
+ if (uploads.length === 0) return;
815
+ await this.handleFilesDrop(uploads, targetDir, progress);
816
+ });
756
817
  return;
757
818
  }
819
+ if (types.includes("application/x-workspace-file")) await this.handleWorkspaceDrop(e, targetDir);
758
820
  };
759
821
  treeElement.removeEventListener("dragover", dragOverHandler);
760
822
  treeElement.removeEventListener("dragenter", dragEnterHandler);
@@ -829,43 +891,51 @@ var DocksFileBrowser = class DocksFileBrowser extends DocksPart {
829
891
  } catch (err) {
830
892
  logger$1.debug("Failed to resolve cross-connection info for DnD", err);
831
893
  }
832
- for (const { path, resource } of sources) try {
833
- const move = await moveWithinSameBackend(resource);
834
- await workspaceService.copyResource(resource, targetDir, { move });
835
- processed++;
836
- } catch (error) {
837
- logger$1.error(`Failed to handle workspace drop for "${path}":`, error);
838
- failed++;
839
- }
894
+ await taskService.runAsync(t$6.DROP_COPY_TASK, async (progress) => {
895
+ const onFile = (targetPath) => {
896
+ progress.message = targetPath;
897
+ };
898
+ for (const { path, resource } of sources) try {
899
+ const move = await moveWithinSameBackend(resource);
900
+ await workspaceService.copyResource(resource, targetDir, {
901
+ move,
902
+ onFile
903
+ });
904
+ processed++;
905
+ } catch (error) {
906
+ logger$1.error(`Failed to handle workspace drop for "${path}":`, error);
907
+ failed++;
908
+ }
909
+ });
840
910
  logger$1.info(`Workspace drop completed: ${processed}/${sources.length} items ${failed > 0 ? `, ${failed} failed` : ""}`);
841
911
  await this.loadWorkspace(this.workspaceDir, true);
842
912
  }
843
- async handleFilesDrop(files, targetDir) {
844
- const total = files.length;
913
+ async handleFilesDrop(uploads, targetDir, progress) {
914
+ const total = uploads.length;
845
915
  let processed = 0;
846
916
  let failed = 0;
847
917
  let skipped = 0;
848
- for (const file of files) try {
849
- const targetPath = this.buildTargetPath(targetDir, file.name);
850
- if (await this.workspaceDir.getResource(targetPath)) {
851
- if (!await confirmDialog(t$6.FILE_EXISTS_OVERWRITE({ fileName: file.name }))) {
852
- skipped++;
853
- continue;
918
+ progress.totalSteps = total;
919
+ for (const [index, { relativePath, file }] of uploads.entries()) {
920
+ progress.currentStep = index + 1;
921
+ progress.message = relativePath;
922
+ try {
923
+ if (await targetDir.getResource(relativePath)) {
924
+ if (!await confirmDialog(t$6.FILE_EXISTS_OVERWRITE({ fileName: relativePath }))) {
925
+ skipped++;
926
+ continue;
927
+ }
854
928
  }
929
+ await (await targetDir.getResource(relativePath, { create: true })).saveContents(file);
930
+ processed++;
931
+ } catch (error) {
932
+ logger$1.error(`Failed to upload ${relativePath}:`, error);
933
+ failed++;
855
934
  }
856
- await (await this.workspaceDir.getResource(targetPath, { create: true })).saveContents(file);
857
- processed++;
858
- } catch (error) {
859
- logger$1.error(`Failed to upload ${file.name}:`, error);
860
- failed++;
861
935
  }
862
936
  logger$1.info(`Uploaded ${processed}/${total} files${skipped > 0 ? `, ${skipped} skipped` : ""}${failed > 0 ? `, ${failed} failed` : ""}`);
863
937
  await this.loadWorkspace(this.workspaceDir);
864
938
  }
865
- buildTargetPath(targetDir, fileName) {
866
- const dirPath = targetDir.getWorkspacePath();
867
- return dirPath ? `${dirPath}/${fileName}` : fileName;
868
- }
869
939
  renderContent() {
870
940
  return html`
871
941
  <div class="tree" ${ref(this.treeRef)} style="--drop-files-text: '${t$6.DROP_FILES_HERE}'">
@@ -972,6 +1042,16 @@ contributionRegistry.registerContribution(TOOLBAR_BOTTOM_CENTER, {
972
1042
  component: "<docks-tasks></docks-tasks>"
973
1043
  });
974
1044
  var progressDialogContainer = null;
1045
+ /** Percentage (0-100) of a task, or `undefined` when its progress is indefinite. */
1046
+ function taskPercent(task) {
1047
+ if (task.progress >= 0) return task.progress;
1048
+ if (task.totalSteps > 0) return Math.round(task.currentStep / task.totalSteps * 100);
1049
+ }
1050
+ function renderProgressBar(task, label = "") {
1051
+ const percent = task && taskPercent(task);
1052
+ if (percent === void 0) return html`<wa-progress-bar indeterminate></wa-progress-bar>`;
1053
+ return html`<wa-progress-bar value="${percent}">${label}</wa-progress-bar>`;
1054
+ }
975
1055
  function getProgressDialogContainer() {
976
1056
  if (!progressDialogContainer) {
977
1057
  progressDialogContainer = document.createElement("div");
@@ -1081,9 +1161,7 @@ function updateProgressDialog(forceOpen = false) {
1081
1161
 
1082
1162
  <div class="progress-dialog-content">
1083
1163
  ${tasks.map((taskProgress) => {
1084
- const hasProgress = taskProgress.progress >= 0 || taskProgress.totalSteps > 0;
1085
- const progress = taskProgress.progress >= 0 ? taskProgress.progress : taskProgress.totalSteps > 0 ? Math.round(taskProgress.currentStep / taskProgress.totalSteps * 100) : 0;
1086
- const showSteps = taskProgress.progress < 0 && taskProgress.totalSteps > 0;
1164
+ const steps = taskProgress.progress < 0 && taskProgress.totalSteps > 0 ? `${taskProgress.currentStep}/${taskProgress.totalSteps} - ` : "";
1087
1165
  return html`
1088
1166
  <div class="tasitem">
1089
1167
  <div class="tasheader">
@@ -1096,13 +1174,7 @@ function updateProgressDialog(forceOpen = false) {
1096
1174
  </div>
1097
1175
  </div>
1098
1176
  <div class="tasprogress">
1099
- ${hasProgress ? html`
1100
- <wa-progress-bar value="${progress}">
1101
- ${showSteps ? `${taskProgress.currentStep}/${taskProgress.totalSteps} - ` : ""}${progress}%
1102
- </wa-progress-bar>
1103
- ` : html`
1104
- <wa-progress-bar indeterminate></wa-progress-bar>
1105
- `}
1177
+ ${renderProgressBar(taskProgress, `${steps}${taskPercent(taskProgress)}%`)}
1106
1178
  </div>
1107
1179
  </div>
1108
1180
  `;
@@ -1167,7 +1239,8 @@ var DocksTasks = class DocksTasks extends DocksElement {
1167
1239
  }
1168
1240
  render() {
1169
1241
  activeTasksSignal.get();
1170
- const taskCount = taskService.getActiveTasks().length;
1242
+ const tasks = taskService.getActiveTasks();
1243
+ const taskCount = tasks.length;
1171
1244
  if (taskCount === 0) return html``;
1172
1245
  return html`
1173
1246
  <div class="tasindicator" @click=${this.handleIndicatorClick} title="${t$5.ACTIVE_TASKS_TITLE({ taskCount: taskCount.toString() })}">
@@ -1176,7 +1249,7 @@ var DocksTasks = class DocksTasks extends DocksElement {
1176
1249
  label="${t$5.ACTIVE_TASKS}"
1177
1250
  ></wa-spinner>
1178
1251
  <wa-badge appearance="outlined" variant="neutral" pill>${taskCount}</wa-badge>
1179
- <div class="tasbar-wrap"><wa-progress-bar indeterminate></wa-progress-bar></div>
1252
+ <div class="tasbar-wrap">${renderProgressBar(taskCount === 1 ? tasks[0] : void 0)}</div>
1180
1253
  </div>
1181
1254
  `;
1182
1255
  }
@@ -4733,4 +4806,4 @@ function getFrameworkConfig() {
4733
4806
  //#endregion
4734
4807
  export { createLazyLabel as _, DocksStandardLayout as a, LAYOUT_PANEL_OPTIONS as c, findStandardLayout as d, layoutIdToPanelVisibility as f, editorRegistry as g, treeNodeComparator as h, createJsRuntime as i, LAYOUT_PANEL_SETTINGS_KEY as l, resolveStoredPanelVisibility as m, getFrameworkConfig as n, registerLicenseAttribution as o, resolveInitialPanelVisibilityFromApp as p, runJavaScriptCode as r, DEFAULT_LAYOUT_PANEL_VISIBILITY as s, configureFramework as t, LEGACY_PREFERRED_LAYOUT_KEY as u, i18n as v };
4735
4808
 
4736
- //# sourceMappingURL=api-3h__hDci.js.map
4809
+ //# sourceMappingURL=api-BZXW896G.js.map