Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ node_modules
dist
dist-ssr
*.local
*.zip

# Editor directories and files
.vscode/*
Expand Down
101 changes: 101 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
# Changelog

All notable changes to this project will be documented in this file.

## [Unreleased]

### Added

- QDN filesystem backups now include both the filesystem snapshot and the private resource index so another node can restore the same local state.
- Startup now compares the local filesystem state against the published QDN backup and prompts to load the QDN version when they differ.
- Out-of-date QDN publish state now appears as a small notification badge instead of opening the publish diff immediately.
- Manual publish/import actions now clear stale publish notifications and keep the sync baseline aligned with the current filesystem state.

### Changed

- The `Sync filesystem backup` toggle now controls publish reminders, not startup restore checks.
- Auto-sync no longer interrupts the user as soon as a mismatch is detected; the diff is now opened from the notification badge.
- Private file display labels are kept separate from filesystem identity so private entries do not turn into phantom tree items.
- Filesystem size summaries continue to report the summed sizes of represented files, which can look large even though the QDN backup payload is metadata-only.
- Group mode now prefers the embedded/current group hint when Q-Manager loads inside Q-Chat, and the group picker shows per-group file counts sorted by the most-populated group first.

### Fixed

- Deleted private files no longer reappear in sync prompts because publish baselines are normalized from the current filesystem tree plus private index.
- Restore and publish diffs now compare the filesystem snapshot and private resource index together, which keeps backup decisions accurate.
- Startup restore prompting now works consistently even when auto-sync is disabled.
- Large private media previews remain separate from the backup snapshot flow, so preview cost is not the same thing as backup publish size.
- Successful private previews now refresh the cached thumbnail in the private index, so a better preview can replace a stale image thumbnail.
- Group publish actions now normalize group IDs before encryption and publish, which avoids string/number mismatches when selecting a group.
- Public group publishes now stay unencrypted, while private groups use `ENCRYPT_QORTAL_GROUP_DATA` and write matching entries into the private resource index.
- Public group files are no longer treated like private resources just because they belong to a group, so previews, thumbnails, and deletes follow the correct path.
- Group embed links and published identifiers now follow the Q-Chat-compatible `grp-q-manager_0_group_...` / `grp-q-manager_1_group_...` convention, which keeps private group embeds decryptable and public group files unencrypted.
- Group embed links now also carry the selected `groupId` as a compatibility hint, since the current Q-Chat image embed path decrypts against the active group context.
- Delete-from-QDN now batches multiple selected files through the multi-publish request instead of republishing tombstones one at a time.
- Discovery/import now prefers the group ID encoded in the identifier when reconstructing previously published group files, so they land in the correct group bucket instead of the first selected group.
- Private embed creation now prefers the file node's stored sharing key before querying resource properties, which keeps freshly published private image embeds consistent with the key used to encrypt them.
- Private and private-group publishes now encrypt the raw file bytes once and publish them as externally encrypted data, while file metadata continues to live in the private resource index.
- Right-click file menus now include a `copy embed link` action that uses the file's default name and the same embed-link logic as the file details dialog.
- The app shell now keeps its dark background filled in embedded Q-Chat layouts so the lower page area does not flash white while scrolling.
- Multi-file publish now updates the live filesystem tree incrementally, so all files in a batch stay visible after group/private publishes.
- The bulk-move modal now tolerates the group-map fallback state and always renders the active group's folder tree instead of assuming the tree is already an array.

### Notes

- The QDN backup is still an encrypted metadata snapshot, not the raw contents of every file in the filesystem.
- Legacy QDN backups remain readable.

## [0.2.0] - 2026-02-28

### Added

- Filesystem persistence now supports IndexedDB with localStorage backup/fallback behavior.
- Versioned/timestamped storage records for safer persistence reconciliation.
- QDN filesystem structure sync actions.
- Option to publish filesystem structure to QDN.
- Option to import filesystem structure from QDN.
- Option to discover previously published Q-Manager resources and import them into the UI.
- Automatic import destination folder: `Recovered Imports`.
- Multi-select file workflow with per-item checkboxes in the grid.
- Bulk selected-file action mode in bottom controls: `Move`, `Remove`, `Delete from QDN`.
- Bulk move modal for selected files with target folder selection.
- QDN tombstone delete flow by republishing each selected file identifier with `data64` for `"d"`.
- File preview support from the main grid.
- Right-click context menu action: `preview`.
- Double-click file behavior to open preview.
- Optional `Show thumbnails` checkbox above the main action controls.
- Image thumbnails in file tiles when thumbnail mode is enabled.
- File `displayName` support for UI labels (separate from published `name` / `identifier`).
- Right-click context menu action: `More info` modal with full known file metadata dump.
- Optional live metadata fetch from QDN resource properties (`GET_QDN_RESOURCE_PROPERTIES`) from the `More info` modal.
- Automatic metadata hydration back into file nodes from fetched properties (size, mime, display filename when appropriate).
- Selected-files footer now shows aggregated file size with unknown-count fallback.
- Per-file size display in selected file details dialog.
- File pinning support (`pin file` / `unpin file`) persisted in filesystem data.
- Visual pin badge on pinned file tiles.
- Extension-based preview inference and text preview mode (`.txt`, `.md`, `.json`, etc.).

### Changed

- IndexedDB is treated as the primary storage source, with localStorage retained as backup.
- Storage load flow now heals missing/failed IndexedDB state from localStorage fallback data when needed.
- Storage save flow now writes through a combined helper to reduce drift between stores.
- Folder/file tile visuals were refreshed for stronger readability and hierarchy.
- File rename behavior now updates `displayName` for files (folder rename behavior remains structural).
- Selection is cleared when switching top-level mode tabs (`public` / `private` / `groups`) or selected group.
- Missing/discovered file imports now attempt property hydration and use resolved filename for display labels.
- `remove directory` context action now uses a delete icon (pin icon reserved for pinning behavior).

### Fixed

- `utils.ts` TypeScript typing issues and Promise/file handling edge cases.
- Publish service default selection precedence bug in single publish flow.
- Publish service dropdown menu rendering/opacity issues in modal context.
- Better error fallback behavior for preview/thumbnails when media cannot be loaded.
- Custom button component now honors the `disabled` prop.
- Discovery/import now ignores tombstoned QDN resources by filtering very small (delete marker) resource sizes.
- Preview fallback now handles text-like resources better when MIME metadata is missing by deriving from filename extension.

### Notes

- QDN publish/import works with the in-memory filesystem state, not direct storage backend snapshots.
39 changes: 39 additions & 0 deletions QAPP_CORE_MIGRATION.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# qapp-core Migration Notes

## Status

- Branch: `spike/qapp-core-migration`
- Started migration by introducing a single request adapter:
- `src/qapp/request.ts`
- Major runtime request callsites now route through:
- `requestQortal(...)`

## Adapter Behavior

`requestQortal` resolves provider in this order:

1. `window.qappCore.request` / `window.QAppCore.request` / `window.qappCore.qortalRequest`
2. `window.qapp.request` / `window.qapp.qortalRequest`
3. legacy global `qortalRequest`

If none are available, it throws an explicit provider error.

## Migrated Files

- `src/App.jsx`
- `src/Manager.tsx`
- `src/storage.ts`
- `src/File.tsx`
- `src/ContextMenuPinnedFiles.tsx`
- `src/actions/PUBLISH_QDN_RESOURCE.jsx`
- `src/actions/PUBLISH_MULTIPLE_QDN_RESOURCES.jsx`
- `src/actions/CREATE_POLL.jsx`
- `src/actions/VOTE_ON_POLL.jsx`
- `src/actions/OPEN_NEW_TAB.jsx`

## Next Steps

1. Add actual `qapp-core` package wiring once target API surface is confirmed.
2. Replace direct feature assumptions with typed qapp-core service modules.
3. Add provider diagnostics in UI (which provider is active).
4. Add branch-level smoke tests for publish, decrypt/encrypt, filesystem import/export.
Binary file removed dist.zip
Binary file not shown.
38 changes: 28 additions & 10 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "QManager",
"name": "Q-Manager",
"private": true,
"version": "0.0.0",
"version": "0.2.7",
"type": "module",
"scripts": {
"dev": "vite",
Expand Down
Loading