# Drive A cloud drive style **interface module** for ArozOS. A permission group whose default interface module is `Drive` signs in straight into it (from `/`), the same way groups can boot into the Desktop or the Dashboard. It can also be opened as a float window from the desktop. Everything lives in this folder. Drive adds **no backend code**: it uses the existing REST endpoints and its own AGI scripts in `backend/`. ## Files | Path | What it does | |---|---| | `init.agi` | Registers the module (`Group: "Interface Module"`). | | `index.html` | Shell: top bar, sidebar, card, app host, overlay layers. | | `css/drive.css` | Tokens for light / dark, layout, breakpoints, container queries. | | `js/icons.js` | Every glyph as inline SVG: interface icons and the file type tiles. | | `js/i18n.js` | `T(key, english, vars)` over `locale/drive.json`. | | `js/api.js` | All requests. REST when allowed, `backend/fs.agi` otherwise. | | `js/ui.js` | Toasts, menus with submenus, popovers, modals, folder picker. | | `js/app.js` | Boot, state, routing, views, top bar, sidebar, toolbar, keys. | | `js/listing.js` | List / grid, sorting, paging, selection, drag and drop, thumbnails. | | `js/actions.js` | Open / open with, download, move, copy, rename, trash, star, zip ... | | `js/transfers.js` | Uploads and server side operations, one progress panel. | | `js/share.js` | Share dialog (links, audience, password, expiry, QR). | | `js/details.js` | Details panel: General, Permissions, Activity, Versions. | | `js/preview.js` | Built-in previewer: images, video, audio, PDF, text. | | `js/apphost.js` | Runs web apps and System Settings inside the page. | | `js/settings.js` | Drive's own settings page (`#/settings`). | | `backend/prefs.agi` | Settings, starred items, open history (table `Drive`). | | `backend/scan.agi` | Recent files and the Documents / Photos / ... categories. | | `backend/fs.agi` | File operations for users without the File Manager permission. | | `locale/drive.json` | en-us, zh-tw, zh-hk, zh-cn, ja-jp, ko-kr. | ## Permissions and the two transports The file system and share endpoints (`/system/file_system/*`) sit behind the **File Manager** module permission. It is a "System Tools" module, so today everyone has it, but an administrator setup must not be assumed: - At boot `app.js` reads `/system/modules/list` and sets `DriveAPI.caps.fm` (File Manager) and `DriveAPI.caps.settings` (System Setting). A REST call that still answers `Permission Denied` switches to the reduced mode as well. - `backend/*.agi` is always reachable: an interface module grants access to its own folder. - Reduced mode (`fs.agi`) uses `filelib` / `ziplib` / `share` with the user's own file permissions. There is no trash (delete is permanent), folders cannot be renamed, uploads stop at 24 MB, and renaming or duplicating a file over 32 MB is refused (content is copied through memory). Copies and moves that keep the name go through a temporary zip and have no size limit. A banner tells the user. - Endpoints that need no module permission are used directly: media (`/media`), quota, user info, notifications, module list, share links. - System Settings only appears in the user menu when the user may open it. ## Document base `index.html` sets `` (the web root), like the desktop page. Hosted apps read and write their iframe `src` as web root relative paths (`ao_module_makeSingleInstance`, the `embedded.html` launchers of Code Studio, NotepadA, Movie ...), so they have to resolve the same way here. As a result: - Drive's own files are referenced as `Drive/...` and `DriveAPI.ROOT` is empty. - In-page links must go through `Drive.href(route)`; a bare `#/...` href would point at the web root page. - Bump the `?v=` query on the includes when shipping changed assets. ## App host `apphost.js` sets `window.isDesktopMode = true` (after Drive's own `ao_module.js` has loaded) and implements the float window API apps call on `parent`: `newFloatWindow`, `closeFwProcess`, `getFloatWindowByID`, `MoveFloatWindowToTop`, `setFloatWindowTitle`, `openFileWithModule`, `openModule`, `startFileOperation`, `toggleDesktopTheme`, and no-op stubs for sizing and pinning. Windows are tabs over the file area with the markup `.floatWindowWrapper > .floatWindow[windowId,parent,callback] > .fwtab > iframe`, which is what `ao_module.js` walks for window ids and parent callbacks. Theme changes are pushed to every hosted iframe through `desktopThemeChanged`. ## Routes `#/drive/`, `#/shared[?tab=byme]`, `#/recent`, `#/starred`, `#/trash`, `#/category/`, `#/search/?in=`, `#/settings`. ## Localisation Every string is `T("key", "English")`; English stays in the code as the fallback. When adding strings, add the key to all six languages in `locale/drive.json` (zh-hk mirrors zh-tw, like the File Manager). Server error messages are looked up as `srv/`. The language follows `localStorage.global_language`, the same setting System Settings writes. ## AGI gotchas met while writing the backend - POST fields become globals. Read them before declaring a variable of the same name (`var paths = []` is hoisted and wipes the field), and keep the `param()` helper's argument names unusual (`eval("name")` once returned the argument itself). - `sendOK()` replies plain text; the JSON client expects `sendJSONResp`. - `filelib` does not expose `readBinaryFile` / `writeBinaryFile`; the injected `_filelib_*` globals are used instead. - `ziplib.createZipFile([..])` rejects JS arrays (Otto exports `[]string`, the library only accepts `[]interface{}`); pass a single string.