The GitHub Actions job "Required Checks" on texera.git/main has failed.
Run started by GitHub user github-merge-queue[bot] (triggered by 
github-merge-queue[bot]).

Head commit for run:
dcb25efa9e1d4321b7b99459db4ee777f37cbaff / Tanishq Gandhi 
<[email protected]>
feat(frontend): add a folder option to the upload panel's file picker (#8428)

### What changes were proposed in this PR?

The upload panel on a dataset's or model's **Versions & Files** tab said
*"Drag & drop file/folder to upload"*, and dragging a folder did work —
but the button beside it could only pick files. Uploading a folder was
possible only by dragging one in, which rules out a maximised window, a
laptop with nothing to drag from, and keyboard use.

The panel now offers **Upload Files** and **Upload Folder**.

Two buttons rather than one, because a file input cannot do both: a
folder can only be chosen when the input carries `webkitdirectory`, and
that attribute *switches the dialog's mode* rather than widening it —
with it the OS dialog picks only directories, without it only files.
Drag & drop can accept either because it is a different API: a drop
carries entries that report `isFile`/`isDirectory`, while an input hands
back a flat `FileList`. Google Drive, Dropbox and OneDrive all split the
same choice in two.

The panel keeps one hidden input per mode and both buttons feed the same
handler.

`fileDropped`'s tail — size limits, conflict resolution, existing-file
skipping, the banner — is now a shared `addSelection`, so both routes
behave identically.

**Before** — one button, files only:

<img width="368" height="167" alt="issue7-1-upload-panel-before"
src="https://github.com/user-attachments/assets/a6f0a743-0c2b-4adc-bb35-88be8fb05db9";
/>


**After** — the folder route is reachable without dragging:
<img width="368" height="167" alt="issue7-1-upload-panel-after"
src="https://github.com/user-attachments/assets/eee6a5be-0368-46dc-ac0b-42e8abf2fad5";
/>



https://github.com/user-attachments/assets/93fe4a26-1a1d-45d0-92ca-27febdd75dd2





### Any related issues, documentation, discussions?

Closes #8387.

### How was this PR tested?

`files-uploader.component.spec.ts` and
`version-uploader.component.spec.ts`, 108 passed. Four new
cases:

- one picker per mode, asserting only the folder input carries
`webkitdirectory`
- each button opens its own picker, and not the other
- **a picked folder keeps its structure** — `readings/2026/a.csv` rather
than `a.csv`
- a picked loose file uses its bare name, which is what it carries

One existing case, `opens the file selector from the drop-zone button`,
asserted the button clicked
`ngx-file-drop`'s hidden input. That input is no longer the picker, so
it is replaced by the two cases
above.

```
cd frontend
npx ng test --include 
src/app/dashboard/component/user/files-uploader/files-uploader.component.spec.ts
 \
  --include 
src/app/dashboard/component/user/version-uploader/version-uploader.component.spec.ts
```

Checked end-to-end against a local stack by picking a real folder
through the new button:

```
readings/
├── notes.md
└── 2026/{a.csv,b.csv}

staged -> readings/notes.md, readings/2026/a.csv, readings/2026/b.csv
```

Full relative paths, nested folder included — identical to dropping the
same folder in.

### Was this PR authored or co-authored using generative AI tooling?

Generated-by: Claude Code (Opus 5)

Report URL: https://github.com/apache/texera/actions/runs/33915986556

With regards,
GitHub Actions via GitBox

Reply via email to