Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
114 commits
Select commit Hold shift + click to select a range
cb12193
Added conflict and failure id types
5cript Oct 24, 2026
aa67634
Added the shared types of conflicts, failures, progress, stops and or…
5cript Oct 24, 2026
3b0d150
Told the local cause and the SFTP code of failed operations and entries
5cript Oct 24, 2026
baf093e
Gave the tracker view conflicts, failures, watch progress and orphane…
5cript Oct 24, 2026
fd27ae6
Gave uploads a progress callback and told why they failed
5cript Oct 24, 2026
8404bff
Let owners of queued operations observe their progress
5cript Oct 24, 2026
052ab62
Declared the origin and the listing and removal of orphaned instances…
5cript Oct 24, 2026
bb0b78a
Registered the conflict, failure, stopped and orphan RPCs on tracker …
5cript Oct 24, 2026
2f4690e
Added empty files for the file tracking helpers and their tests
5cript Oct 24, 2026
8e1371a
Recorded the remote origin in the instance metadata beside the legacy…
5cript Oct 24, 2026
a937481
Listed orphaned instances one by one with their copy, origin, size an…
5cript Oct 24, 2026
6149ef1
Removed one orphaned instance at a time, refusing live, locked and no…
5cript Oct 24, 2026
824034b
Told the owners of queued operations of their progress before their end
5cript Oct 24, 2026
83ac4d4
Tested that queued transfers report their progress to their observers
5cript Oct 24, 2026
bcf88ab
Listed conflicts per watch and path with the context to answer them
5cript Oct 24, 2026
d736bdd
Listed failed uploads per watch and path, counting attempts of a path
5cript Oct 24, 2026
6bbfc88
Suffixed the zero counters of the conflict and failure lists as unsigned
5cript Oct 24, 2026
17aa4b9
Measured the progress of a watch per burst, with bytes and files in f…
5cript Oct 24, 2026
be81b5f
Let the shared input file stream tell why its last open or read failed
5cript Oct 24, 2026
8a72e42
Classified system errors of local files as local file problems
5cript Oct 24, 2026
5a141c0
Told the local problem of uploads that cannot inspect, open or read t…
5cript Oct 24, 2026
a912154
Told the local problem or the server's code of each entry a bulk skipped
5cript Oct 24, 2026
94334b2
Mapped operation errors and skipped bulk entries to upload failure re…
5cript Oct 24, 2026
47d8105
Turned queue progress of bulk, directory and single uploads into uplo…
5cript Oct 24, 2026
8b1ecfa
Ended refused uploads as not queued, or cancelled when their source i…
5cript Oct 24, 2026
e7787bc
Told the tracker how far uploads are, why they failed and what the se…
5cript Oct 24, 2026
db8b432
Initialised every field of the transfer progress in the progress tests
5cript Oct 24, 2026
58ca142
Declared the pure file tracking model, attention, in-flight rows and …
5cript Oct 24, 2026
3bda223
Added the texts of the redesigned file tracking panel in English and …
5cript Oct 24, 2026
52c7652
Declared the file tracking store, tracker client, actions and dock ta…
5cript Oct 24, 2026
06e1c00
Declared the file tracking views as stubs and added the new sources t…
5cript Oct 24, 2026
693a076
Wired the new library styles, empty file tracking styles and the badg…
5cript Oct 24, 2026
6e03cab
Aligned the continuation lines of the file tracking doc comments
5cript Oct 24, 2026
8c89e1b
Moved the operation queue cards to the library progress bar
5cript Oct 24, 2026
a3a41ec
Moved the sync progress dialog's hash bar to the library progress bar
5cript Oct 24, 2026
57dd105
Removed the host progress bar, the library's replaces it
5cript Oct 24, 2026
3e9f0de
Listed server changes as conflicts per watch instead of asking one at…
5cript Oct 24, 2026
1945496
Forwarded the dock tab attention to the content panel manager
5cript Oct 24, 2026
9811e4f
Rewrote the file tracking panel as the outliner and detail facade
5cript Oct 24, 2026
7690662
Revealed file tracking items on the server in the remote file explore…
5cript Oct 24, 2026
5e30aac
Passed the file tracking tab activation to the content panel manager
5cript Oct 24, 2026
a64d157
Laid out the file tracking panel side by side, stacked below 520 px
5cript Oct 24, 2026
f66126d
Showed the client's translated error when deleting an orphaned copy f…
5cript Oct 24, 2026
103c8c0
Observed the shared group counts in the file tracking placeholder
5cript Oct 24, 2026
a675ae5
Kept the dock tab attention alive until the store and client are gone
5cript Oct 24, 2026
3305da5
Added a Lumino tab renderer that shows count badges from the title da…
5cript Oct 24, 2026
fc8767f
Styled the dock tab badges and the amber attention glow
5cript Oct 24, 2026
588b740
Showed the File Tracking attention on its dock tab and reported tab a…
5cript Oct 24, 2026
33e540d
Kept retried failures aside and told why unreadable local files fail
5cript Oct 24, 2026
6c0ee13
Listed failed uploads per watch with Retry and Dismiss
5cript Oct 24, 2026
745c688
Implemented the tracker client: events into the store, one method per…
5cript Oct 24, 2026
de27030
Projected the tracking model onto the observed items, groups and sele…
5cript Oct 24, 2026
f5115c9
Rendered the status and orphan glyphs of the file tracking outliner
5cript Oct 24, 2026
6d75878
Rendered the watch and orphan rows of the file tracking outliner
5cript Oct 24, 2026
b43c32a
Rendered the file tracking outliner with its filter, groups and keybo…
5cript Oct 24, 2026
39d2edf
Styled the file tracking outliner, its groups, rows and glyphs
5cript Oct 24, 2026
37844de
Implemented the file tracking texts with offset-driven clock times an…
5cript Oct 24, 2026
0709aa6
Implemented the file tracking model's groups, order and counts with t…
5cript Oct 24, 2026
07a5efe
Implemented the dock tab attention state with one pulse per burst and…
5cript Oct 24, 2026
319befc
Implemented the stable in-flight row layout with tests
5cript Oct 24, 2026
5ee2e23
Rendered the watch header with kind, status badge, actions and paths
5cript Oct 24, 2026
0bea314
Rendered the stop reason strip with Show and Open Again actions
5cript Oct 24, 2026
fe80422
Rendered the pinned sync progress block with stable in-flight rows
5cript Oct 24, 2026
cef6fc1
Composed the watch detail and rendered the orphaned copy detail
5cript Oct 24, 2026
35a7c21
Styled the file tracking detail pane, stop strip, progress block and …
5cript Oct 24, 2026
17311b3
Formatted the detail pane views with clang-format
5cript Oct 24, 2026
0438242
Left out the last-sync bar when the last sync ended no change
5cript Oct 24, 2026
8727d25
Implemented the file tracking item list box and its small button
5cript Oct 24, 2026
f639c24
Implemented the Conflicts and Failed tabs of the watch detail
5cript Oct 24, 2026
7c02093
Implemented the Options tab with the copy locks of the watch detail
5cript Oct 24, 2026
d64d1cd
Implemented the detail tab registry and the tab strip with mounted pa…
5cript Oct 24, 2026
7a66707
Styled the detail tabs, the item list boxes and the options grid
5cript Oct 24, 2026
be40af8
Kept the options rows mounted and followed the copy flag with attributes
5cript Oct 24, 2026
b1d2d26
Wrapped the row buttons earlier so failure reasons stay readable when…
5cript Oct 24, 2026
b99336e
Let the detail tab area shrink so its list boxes scroll on their own
5cript Oct 24, 2026
d91ff04
Showed the upload progress per watch, throttled to five snapshots a s…
5cript Oct 24, 2026
e951b68
Listed @lumino/virtualdom, which the dock tab badge renderer imports
5cript Oct 24, 2026
1657210
Added a pending selection that waits for the listing of its directory
5cript Oct 24, 2026
dfd6f91
Let a file explorer side navigate and select an item once it is listed
5cript Oct 24, 2026
176cb7b
Selected the item in the remote side on Reveal on Server
5cript Oct 24, 2026
e065f2b
Brought the File Explorer tab to the front on Reveal on Server
5cript Oct 24, 2026
b78bd88
Kept stopped watches listed with their reason until the user removes …
5cript Oct 24, 2026
6965d79
Listed the orphaned copies per instance, leaving out those of stopped…
5cript Oct 24, 2026
f26dec7
Showed the waiting-for-answer summary while every pending change wait…
5cript Oct 24, 2026
facadd9
Wrapped the conflict and failure lines instead of cutting them off
5cript Oct 24, 2026
3cc4cce
Showed stopped watches with the inactive icon, not a checkbox-like sq…
5cript Oct 24, 2026
e73dcb2
Removed ask, showProgress and showOrphanedCount from the tracker view
5cript Oct 24, 2026
b669853
Removed the answer RPC, Tracker::answer and the server changed questi…
5cript Oct 24, 2026
81fffe9
Removed the file tracking language keys of the old panel
5cript Oct 24, 2026
4273b30
Pointed the loader's hue ramp comment at the library's progress_color…
5cript Oct 24, 2026
9ab56fd
Gave conflict and failure rows their kind, attempts and local path as…
5cript Oct 24, 2026
a8fb98f
Gave the sync progress bars their raw byte counts as test hooks
5cript Oct 24, 2026
0cd18d2
Marked copies and stopped watches in the detail and the stop text as …
5cript Oct 24, 2026
3270baa
Selected a new watch in the file tracking panel while nothing is sele…
5cript Oct 24, 2026
fb82775
Gave log messages a toast choice that backend messages carry to the f…
5cript Oct 24, 2026
b8af311
Logged the failures of tracked uploads without a toast, the panel lis…
5cript Oct 24, 2026
36b493c
Logged failed reconnect attempts without a toast unless the cycle giv…
5cript Oct 24, 2026
b9a3ddc
Gave local scan errors their local cause, as for unlistable folders
5cript Oct 24, 2026
2984c11
Hid Open Local Item on watches whose item moved away or whose copy is…
5cript Oct 24, 2026
4c53149
Updated 5cript-nui-components to the merged file tracking components
5cript Oct 24, 2026
353eb0a
Added the shared types of batched conflict and failure removals
5cript Oct 24, 2026
c5a61e4
Sent conflict and failure removals as one message per action
5cript Oct 24, 2026
dbf89cc
Added a newest-first problem list with id lookup and page slices
5cript Oct 24, 2026
17c879a
Kept problems per watch and synced only the shown page of each list
5cript Oct 24, 2026
19f7db5
Paged the Conflicts and Failed tabs with the library pagination bar
5cript Oct 24, 2026
35abe7d
Named the problem list iterator type in camel case
5cript Oct 24, 2026
57a4c58
Synced the file tracking panel after every tracker event again
5cript Oct 24, 2026
7ba1a54
Updated Nui to v3.7.3 with the range tracking fixes
5cript Oct 24, 2026
df641b2
Synced the file tracking panel once per event burst again, fixed in N…
5cript Oct 24, 2026
cb279f5
Updated the bulk entry progress by the entries in flight, not every e…
5cript Oct 25, 2026
55c252c
Handed tracked upload progress to the queue without an extra end guard
5cript Oct 25, 2026
199b203
Refreshed the orphan items only when an entry starts or stops holding…
5cript Oct 25, 2026
7ff0c5c
Made the tracker's progress, orphan list and entry display cheaper an…
5cript Oct 25, 2026
bcb427b
Made the uncheckable change test wait for the report before src closes
5cript Oct 25, 2026
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
20 changes: 20 additions & 0 deletions _cmake/copy_styles_to_build_dir.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,11 @@ if (NOT OMIT_FRONTEND_BUILD)
"${CMAKE_BINARY_DIR}/styles/5cript-nui-components/collapsible_section.css"
"${CMAKE_BINARY_DIR}/styles/5cript-nui-components/checkbox.css"
"${CMAKE_BINARY_DIR}/styles/5cript-nui-components/toast.css"
"${CMAKE_BINARY_DIR}/styles/5cript-nui-components/progress_bar.css"
"${CMAKE_BINARY_DIR}/styles/5cript-nui-components/progress_ring.css"
"${CMAKE_BINARY_DIR}/styles/5cript-nui-components/badge.css"
"${CMAKE_BINARY_DIR}/styles/5cript-nui-components/tab_strip.css"
"${CMAKE_BINARY_DIR}/styles/5cript-nui-components/list_row.css"
"${CMAKE_BINARY_DIR}/styles/5cript-nui-components/themes/light.css"
COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_BINARY_DIR}/styles/nui-file-explorer"
COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_BINARY_DIR}/styles/5cript-nui-components"
Expand Down Expand Up @@ -51,6 +56,11 @@ if (NOT OMIT_FRONTEND_BUILD)
COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_SOURCE_DIR}/dependencies/5cript-nui-components/styles/collapsible_section.css" "${CMAKE_BINARY_DIR}/styles/5cript-nui-components/collapsible_section.css"
COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_SOURCE_DIR}/dependencies/5cript-nui-components/styles/checkbox.css" "${CMAKE_BINARY_DIR}/styles/5cript-nui-components/checkbox.css"
COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_SOURCE_DIR}/dependencies/5cript-nui-components/styles/toast.css" "${CMAKE_BINARY_DIR}/styles/5cript-nui-components/toast.css"
COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_SOURCE_DIR}/dependencies/5cript-nui-components/styles/progress_bar.css" "${CMAKE_BINARY_DIR}/styles/5cript-nui-components/progress_bar.css"
COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_SOURCE_DIR}/dependencies/5cript-nui-components/styles/progress_ring.css" "${CMAKE_BINARY_DIR}/styles/5cript-nui-components/progress_ring.css"
COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_SOURCE_DIR}/dependencies/5cript-nui-components/styles/badge.css" "${CMAKE_BINARY_DIR}/styles/5cript-nui-components/badge.css"
COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_SOURCE_DIR}/dependencies/5cript-nui-components/styles/tab_strip.css" "${CMAKE_BINARY_DIR}/styles/5cript-nui-components/tab_strip.css"
COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_SOURCE_DIR}/dependencies/5cript-nui-components/styles/list_row.css" "${CMAKE_BINARY_DIR}/styles/5cript-nui-components/list_row.css"
COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_SOURCE_DIR}/dependencies/5cript-nui-components/styles/themes/light.css" "${CMAKE_BINARY_DIR}/styles/5cript-nui-components/themes/light.css"
DEPENDS
"${CMAKE_SOURCE_DIR}/nui-file-explorer/styles/file_grid.css"
Expand All @@ -76,6 +86,11 @@ if (NOT OMIT_FRONTEND_BUILD)
"${CMAKE_SOURCE_DIR}/dependencies/5cript-nui-components/styles/collapsible_section.css"
"${CMAKE_SOURCE_DIR}/dependencies/5cript-nui-components/styles/checkbox.css"
"${CMAKE_SOURCE_DIR}/dependencies/5cript-nui-components/styles/toast.css"
"${CMAKE_SOURCE_DIR}/dependencies/5cript-nui-components/styles/progress_bar.css"
"${CMAKE_SOURCE_DIR}/dependencies/5cript-nui-components/styles/progress_ring.css"
"${CMAKE_SOURCE_DIR}/dependencies/5cript-nui-components/styles/badge.css"
"${CMAKE_SOURCE_DIR}/dependencies/5cript-nui-components/styles/tab_strip.css"
"${CMAKE_SOURCE_DIR}/dependencies/5cript-nui-components/styles/list_row.css"
"${CMAKE_SOURCE_DIR}/dependencies/5cript-nui-components/styles/themes/light.css"
)

Expand Down Expand Up @@ -105,6 +120,11 @@ if (NOT OMIT_FRONTEND_BUILD)
"${CMAKE_BINARY_DIR}/styles/5cript-nui-components/collapsible_section.css"
"${CMAKE_BINARY_DIR}/styles/5cript-nui-components/checkbox.css"
"${CMAKE_BINARY_DIR}/styles/5cript-nui-components/toast.css"
"${CMAKE_BINARY_DIR}/styles/5cript-nui-components/progress_bar.css"
"${CMAKE_BINARY_DIR}/styles/5cript-nui-components/progress_ring.css"
"${CMAKE_BINARY_DIR}/styles/5cript-nui-components/badge.css"
"${CMAKE_BINARY_DIR}/styles/5cript-nui-components/tab_strip.css"
"${CMAKE_BINARY_DIR}/styles/5cript-nui-components/list_row.css"
"${CMAKE_BINARY_DIR}/styles/5cript-nui-components/themes/light.css"
)
endif()
21 changes: 16 additions & 5 deletions backend/include/backend/file_tracking/batching_remote.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,22 @@ namespace FileTracking
*/
using OnUploadEntryEnded = std::function<void(std::size_t index, UploadEnd const& ended)>;

/**
* @brief Called on the strand while an upload of a bulk is on its way, with the entry's index, never after the
* bulk ended.
*/
using OnUploadEntryProgress = std::function<void(std::size_t index, UploadProgress const& progress)>;

/**
* @brief Queues the uploads of @p requests, regular files that may create the directories above their
* destination, as one operation.
* destination, as one operation. The index of an entry is that of its request. @p onProgress may be
* empty.
*/
virtual std::expected<void, std::string>
uploadAll(std::vector<UploadRequest> const& requests, OnUploadEntryEnded onEnded) = 0;
virtual std::expected<void, std::string> uploadAll(
std::vector<UploadRequest> const& requests,
OnUploadEntryEnded onEnded,
OnUploadEntryProgress onProgress
) = 0;

/**
* @brief Queues the deletes of @p paths as one operation, a directory only when it is empty.
Expand Down Expand Up @@ -95,9 +105,10 @@ namespace FileTracking
/**
* @brief Gathers @p request into the next batch. It goes on its own when it creates no missing directories,
* refreshes the listing, is no regular file, is a large one, continues a partial file or is alone in
* its batch.
* its batch. @p onProgress hears what the inner remote tells of it.
*/
std::expected<void, std::string> upload(UploadRequest const& request, OnUploadEnded onEnded) override;
std::expected<void, std::string>
upload(UploadRequest const& request, OnUploadEnded onEnded, OnUploadProgress onProgress) override;

/**
* @brief An upload still gathered ends as cancelled without being sent, one on its way is stopped by the inner
Expand Down
103 changes: 103 additions & 0 deletions backend/include/backend/file_tracking/bulk_entry_progress.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
#pragma once

#include <backend/file_tracking/tracker_remote.hpp>
#include <shared_data/file_operations/bulk_progress.hpp>
#include <shared_data/file_operations/transfer_progress.hpp>
#include <paths/paths.hpp>

#include <cstddef>
#include <cstdint>
#include <optional>
#include <vector>

namespace FileTracking
{
/**
* @brief Turns the successive progress the operation queue tells of one bulk or directory upload into the
* progress of each upload it carries, by the index of its request. An upload is told when its progress
* changed, from the moment it started on its way or ended.
*/
class BulkEntryProgress
{
public:
/**
* @brief An upload of a bulk of files. Its index is that of its request, which is its entry index in the
* bulk.
*/
struct File
{
Paths::LocalPath source;
/** @brief Its size when it was queued, until its transfer tells it. */
std::uint64_t sizeBytes{0};
};

/**
* @brief The progress of the upload at @p index.
*/
struct EntryProgress
{
std::size_t index{0};
UploadProgress progress{};
};

/**
* @brief A bulk of @p files.
*/
static BulkEntryProgress ofFiles(std::vector<File> files);

/**
* @brief The upload of the directory @p source to @p destination, the single upload at index 0. Its files
* and bytes are the entries below it the bulk is through with, the left out ones too, as the queue
* counts them.
*/
static BulkEntryProgress ofDirectory(Paths::LocalPath source, Paths::RemotePath destination);

/**
* @brief The uploads whose progress changed with @p progress, the next snapshot of the bulk, by index.
*/
std::vector<EntryProgress> update(SharedData::BulkProgress const& progress);

private:
struct Entry
{
File file;
/** @brief Seen on its way, it is done once it is no longer. */
bool started{false};
/** @brief Listed among the bulk's failed entries. */
bool leftOut{false};
/** @brief The last update that saw it on its way, 0 for none. */
std::uint64_t onItsWayIn{0u};
std::optional<UploadProgress> told{};
};

struct Directory
{
Paths::LocalPath source;
Paths::RemotePath destination;
std::optional<UploadProgress> told{};
};

BulkEntryProgress(std::vector<Entry> entries, std::optional<Directory> directory);

std::vector<EntryProgress> updateFiles(SharedData::BulkProgress const& progress);
std::vector<EntryProgress> updateDirectory(SharedData::BulkProgress const& progress);

private:
std::vector<Entry> entries_;
std::optional<Directory> directory_;
/** @brief The entries seen on their way that were not told done yet, by index. */
std::vector<std::size_t> started_{};
std::uint64_t updates_{0u};
};

/**
* @brief How far the single upload of the file or link @p source is, its transfer between its minimum and
* maximum at @p progress.
*/
UploadProgress uploadProgressOf(SharedData::TransferProgress const& progress, Paths::LocalPath const& source);

/**
* @brief Whether @p left and @p right tell the same.
*/
bool sameProgress(UploadProgress const& left, UploadProgress const& right);
}
Loading
Loading