@sinequa/atomic-angular 1.15.1 → 1.17.0

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.
@@ -42,7 +42,7 @@
42
42
  "roleShared": "Geteilt",
43
43
  "searchPlaceholder": "Arbeitsbereich suchen...",
44
44
  "selectedCount": "{count, plural, one {{count} ausgewählt} other {{count} ausgewählt}}",
45
- "subtitle": "Organisieren Sie Dokumente in wiederverwendbaren Sets.",
45
+ "subtitle": "Laden Sie Ihre Dokumente hoch, indizieren und teilen Sie sie.",
46
46
  "tabAll": "Alle Arbeitsbereiche",
47
47
  "tabEditor": "Bearbeiter",
48
48
  "tabReader": "Leser",
@@ -126,7 +126,7 @@
126
126
  },
127
127
  "share": {
128
128
  "accessCount": "{count, plural, one {{count} Person hat Zugriff} other {{count} Personen haben Zugriff}}",
129
- "accessNotice": "Einige Dokumente dieses Arbeitsbereichs sind möglicherweise nicht für alle Benutzer zugänglich, mit denen er geteilt wird. Dokumente aus freigegebenen Laufwerken oder externen Quellen unterliegen weiterhin ihren ursprünglichen Zugriffsberechtigungen. Lokal von Ihrem Gerät hochgeladene Dateien bleiben über den geteilten Arbeitsbereich stets zugänglich.",
129
+ "accessNotice": "Benutzer, die zu diesem Arbeitsbereich hinzugefügt werden, erhalten Zugriff auf alle hochgeladenen Dokumente, die auch in ihren Suchergebnissen erscheinen.",
130
130
  "addPeople": "Personen hinzufügen",
131
131
  "adding": "Wird hinzugefügt…",
132
132
  "changeRole": "Rolle von {name} ändern",
@@ -197,6 +197,8 @@
197
197
  "cancelUpload": "Hochladen abbrechen",
198
198
  "retryUpload": "Hochladen erneut versuchen",
199
199
  "retryAll": "Alle erneut versuchen",
200
+ "remoteUpload": "Upload eines anderen Benutzers",
201
+ "ownUpload": "Ihr Upload",
200
202
  "workspaceIndexed": "{name}: indiziert"
201
203
  },
202
204
  "picker": {
@@ -42,7 +42,7 @@
42
42
  "roleShared": "Shared",
43
43
  "searchPlaceholder": "Search workspace...",
44
44
  "selectedCount": "{count, plural, one {{count} selected} other {{count} selected}}",
45
- "subtitle": "Organize documents into reusable sets.",
45
+ "subtitle": "Upload, index and share your documents.",
46
46
  "tabAll": "All Workspaces",
47
47
  "tabEditor": "Editor",
48
48
  "tabReader": "Reader",
@@ -126,7 +126,7 @@
126
126
  },
127
127
  "share": {
128
128
  "accessCount": "{count, plural, one {{count} person has access} other {{count} people have access}}",
129
- "accessNotice": "Some documents in this workspace may not be accessible to all shared users. Documents from shared drives or external sources remain subject to their original access permissions. Locally uploaded files from your personal device will always be accessible through the shared workspace.",
129
+ "accessNotice": "Users added to this workspace get access to all its uploaded documents, which will also appear in their search results.",
130
130
  "addPeople": "Add people",
131
131
  "adding": "Adding…",
132
132
  "changeRole": "Change the role of {name}",
@@ -197,6 +197,8 @@
197
197
  "cancelUpload": "Cancel upload",
198
198
  "retryUpload": "Retry upload",
199
199
  "retryAll": "Retry all",
200
+ "remoteUpload": "Upload by another user",
201
+ "ownUpload": "Your upload",
200
202
  "workspaceIndexed": "{name}: indexed"
201
203
  },
202
204
  "picker": {
@@ -42,7 +42,7 @@
42
42
  "roleShared": "Partagée",
43
43
  "searchPlaceholder": "Rechercher un espace de travail...",
44
44
  "selectedCount": "{count, plural, one {{count} sélectionnée} many {{count} sélectionnées} other {{count} sélectionnées}}",
45
- "subtitle": "Organisez vos documents en ensembles réutilisables.",
45
+ "subtitle": "Téléversez, indexez et partagez vos documents.",
46
46
  "tabAll": "Tous les espaces de travail",
47
47
  "tabEditor": "Éditeur",
48
48
  "tabReader": "Lecteur",
@@ -126,7 +126,7 @@
126
126
  },
127
127
  "share": {
128
128
  "accessCount": "{count, plural, one {{count} personne a accès} many {{count} personnes ont accès} other {{count} personnes ont accès}}",
129
- "accessNotice": "Certains documents de cet espace de travail peuvent ne pas être accessibles à tous les utilisateurs avec qui il est partagé. Les documents provenant de lecteurs partagés ou de sources externes restent soumis à leurs autorisations d’accès d’origine. Les fichiers téléversés depuis votre appareil personnel resteront toujours accessibles via l’espace de travail partagé.",
129
+ "accessNotice": "Les utilisateurs ajoutés à cet espace de travail ont accès à tous ses documents téléversés, qui apparaîtront aussi dans leurs résultats de recherche.",
130
130
  "addPeople": "Ajouter des personnes",
131
131
  "adding": "Ajout…",
132
132
  "changeRole": "Changer le rôle de {name}",
@@ -197,6 +197,8 @@
197
197
  "cancelUpload": "Annuler le téléversement",
198
198
  "retryUpload": "Réessayer le téléversement",
199
199
  "retryAll": "Tout réessayer",
200
+ "remoteUpload": "Envoi d'un autre utilisateur",
201
+ "ownUpload": "Votre envoi",
200
202
  "workspaceIndexed": "{name} : indexé"
201
203
  },
202
204
  "picker": {
@@ -42,7 +42,7 @@
42
42
  "roleShared": "共有",
43
43
  "searchPlaceholder": "ワークスペースを検索...",
44
44
  "selectedCount": "{count, plural, other {{count} 件選択中}}",
45
- "subtitle": "ドキュメントを再利用可能なセットに整理します。",
45
+ "subtitle": "ドキュメントをアップロードし、インデックス化して共有します。",
46
46
  "tabAll": "すべてのワークスペース",
47
47
  "tabEditor": "編集者",
48
48
  "tabReader": "閲覧者",
@@ -126,7 +126,7 @@
126
126
  },
127
127
  "share": {
128
128
  "accessCount": "{count, plural, other {{count} 人がアクセスできます}}",
129
- "accessNotice": "このワークスペース内の一部のドキュメントは、共有されたすべてのユーザーがアクセスできるとは限りません。共有ドライブや外部ソースのドキュメントには、元のアクセス権限が引き続き適用されます。お使いの端末からアップロードされたファイルは、共有ワークスペースから常にアクセスできます。",
129
+ "accessNotice": "このワークスペースに追加されたユーザーは、アップロードされたすべてのドキュメントにアクセスでき、それらは検索結果にも表示されます。",
130
130
  "addPeople": "ユーザーを追加",
131
131
  "adding": "追加しています…",
132
132
  "changeRole": "{name} のロールを変更",
@@ -197,6 +197,8 @@
197
197
  "cancelUpload": "アップロードをキャンセル",
198
198
  "retryUpload": "アップロードを再試行",
199
199
  "retryAll": "すべて再試行",
200
+ "remoteUpload": "他のユーザーによるアップロード",
201
+ "ownUpload": "あなたのアップロード",
200
202
  "workspaceIndexed": "{name}: インデックス済み"
201
203
  },
202
204
  "picker": {
@@ -39,9 +39,8 @@ interface WorkspaceDocument {
39
39
  */
40
40
  createdAt?: string;
41
41
  /**
42
- * Bytes. Only set for a document the user is uploading in this session (from
43
- * `File.size`): neither the documents listing nor the upload-status endpoint
44
- * serves a size (swagger `ContainerDocumentViewModel`, checked 2026-09-30).
42
+ * Bytes. Neither the documents listing nor the upload-status endpoint serves a
43
+ * size (swagger `ContainerDocumentViewModel`, checked 2026-09-30): unset for now.
45
44
  */
46
45
  size?: number;
47
46
  /** Not served by the listing either; kept for a "source" column when a backend provides one. */
@@ -105,6 +104,18 @@ interface TrackedUpload {
105
104
  message?: string;
106
105
  /** An `error` that sending the file again could fix (a lost connection), as opposed to one the server will keep refusing. */
107
106
  retryable: boolean;
107
+ /**
108
+ * Set on a row that does not come from this client's own transfers but from the
109
+ * status API: a job (or one of its failed files) started elsewhere. A job row is
110
+ * the whole job — the API gives no list of its files — so it has no `name`, and
111
+ * nothing here can cancel or retry it.
112
+ */
113
+ remote?: RemoteUpload;
114
+ }
115
+ /** What the tracker knows about a row it only learned from the status API. */
116
+ interface RemoteUpload {
117
+ /** The current user started this job (from another tab, or before a page reload). */
118
+ mine: boolean;
108
119
  }
109
120
  /** What to tell the tracker when files start. */
110
121
  interface TrackFileInput {
@@ -186,8 +197,8 @@ interface RemoveWorkspacesResult {
186
197
  * touches the cache once the server has answered, so a rejected call leaves
187
198
  * the state as it was — the call site reports the error.
188
199
  *
189
- * `addDocuments` alone stays purely local: it is the upload flow's optimistic
190
- * pre-transfer cache update.
200
+ * `addDocuments`, `discardDocuments` and `patchDocument` stay purely local. The upload
201
+ * flow no longer uses them: the list is the index, and only the listing writes to it.
191
202
  */
192
203
  declare const WorkspacesStore: _angular_core.Type<{
193
204
  workspaces: _angular_core.Signal<Workspace[]>;
@@ -211,7 +222,8 @@ declare const WorkspacesStore: _angular_core.Type<{
211
222
  create: ({ name, description, tags, owners, readers }: CreateWorkspaceInput) => Promise<Workspace>;
212
223
  update: (id: string, patch: UpdateContainerInput) => Promise<Workspace | null>;
213
224
  remove: (ids: string[]) => Promise<RemoveWorkspacesResult>;
214
- loadDocuments: (workspaceId: string) => Promise<WorkspaceDocument[]>;
225
+ forget: (id: string) => void;
226
+ loadDocuments: (workspaceId: string, signal?: AbortSignal) => Promise<WorkspaceDocument[]>;
215
227
  loadMoreDocuments: (workspaceId: string) => Promise<WorkspaceDocument[]>;
216
228
  addDocuments: (workspaceId: string, documents: WorkspaceDocument[]) => void;
217
229
  discardDocuments: (workspaceId: string, documentIds: string[]) => void;
@@ -244,6 +256,20 @@ interface UploadTrackerState {
244
256
  clearedCount: number;
245
257
  /** What the server last said about each job's indexing, 0-100: indexed files / files of the job. */
246
258
  jobIndexing: Record<string, number>;
259
+ /**
260
+ * Jobs the user got rid of — closed, cancelled, cleared. The status API keeps listing a
261
+ * job for a while after it ends, so without this a job closed by hand would come
262
+ * straight back as an upload started elsewhere. Survives `reset()`, on purpose.
263
+ */
264
+ ignoredJobs: Record<string, true>;
265
+ }
266
+ /** A job the status API reports that this client did not start — or no longer remembers starting. */
267
+ interface RemoteJobEntry {
268
+ job: UploadJobStatus;
269
+ workspaceId: string;
270
+ workspaceName: string;
271
+ /** The current user started the job (`initiatedBy` is the current user's id). */
272
+ mine: boolean;
247
273
  }
248
274
  declare const isFinished: (upload: TrackedUpload) => boolean;
249
275
  declare const isFailed: (upload: TrackedUpload) => boolean;
@@ -267,10 +293,13 @@ declare const UploadTrackerStore: _angular_core.Type<{
267
293
  connection: _angular_core.Signal<ConnectionNotice | null>;
268
294
  clearedCount: _angular_core.Signal<number>;
269
295
  jobIndexing: _angular_core.Signal<Record<string, number>>;
296
+ ignoredJobs: _angular_core.Signal<Record<string, true>>;
270
297
  active: _angular_core.Signal<boolean>;
271
298
  failed: _angular_core.Signal<TrackedUpload[]>;
272
299
  byStatus: _angular_core.Signal<Record<UploadStatus, TrackedUpload[]>>;
273
300
  allDone: _angular_core.Signal<boolean>;
301
+ settled: _angular_core.Signal<boolean>;
302
+ authorFailed: _angular_core.Signal<boolean>;
274
303
  progress: _angular_core.Signal<Record<string, PhaseProgress>>;
275
304
  indexedCount: _angular_core.Signal<number>;
276
305
  track: (files: TrackFileInput[], workspaceId: string, workspaceName: string) => void;
@@ -283,6 +312,7 @@ declare const UploadTrackerStore: _angular_core.Type<{
283
312
  }) => void;
284
313
  restart: (id: string) => void;
285
314
  applyJobs: (jobs: UploadJobStatus[]) => boolean;
315
+ applyRemoteJobs: (entries: RemoteJobEntry[]) => boolean;
286
316
  setConnection: (connection: ConnectionNotice | null) => void;
287
317
  remove: (id: string) => void;
288
318
  removeWorkspace: (workspaceId: string) => void;
@@ -293,6 +323,7 @@ declare const UploadTrackerStore: _angular_core.Type<{
293
323
  connection: ConnectionNotice | null;
294
324
  clearedCount: number;
295
325
  jobIndexing: Record<string, number>;
326
+ ignoredJobs: Record<string, true>;
296
327
  }>>;
297
328
 
298
329
  interface UploadTarget {
@@ -317,6 +348,10 @@ interface AddFilesOptions {
317
348
  * speaks for both. What the user sees lives in `UploadTrackerStore`; this
318
349
  * service only writes to it.
319
350
  *
351
+ * It never writes a file into a workspace's list: the list is the index, and a file
352
+ * enters it only once the container listing returns it. What the service does for the
353
+ * list is re-read that listing while something is in progress.
354
+ *
320
355
  * Root-scoped: an upload must outlive the view that started it. It registers its
321
356
  * window and auth listeners once, and removes them when the application is destroyed.
322
357
  */
@@ -358,7 +393,7 @@ declare class UploadService {
358
393
  addFiles(workspace: UploadTarget, files: File[], options: AddFilesOptions): string[];
359
394
  /**
360
395
  * Abandons a transfer and forgets it: stops it, and drops the file from the
361
- * tracker and from the workspace's cached documents. Works while it is sending
396
+ * tracker. Works while it is sending
362
397
  * and once it has failed; once the bytes are in, indexing is the server's and
363
398
  * there is nothing left to cancel.
364
399
  *
@@ -378,32 +413,33 @@ declare class UploadService {
378
413
  resumeStalled(): void;
379
414
  /**
380
415
  * Tells the service which workspace is open, so the status polling can be
381
- * scoped to it (the API documents that as the cheaper lookup) and refresh what
382
- * it shows. `null` when none is. Starts the polling when the workspace holds
383
- * documents that are not finished yet: a page reload loses every local tus
384
- * handle, so the listing is the only way to know.
416
+ * scoped to it (the API documents that as the cheaper lookup) and re-read its
417
+ * listing. `null` when none is. Starts the polling: a page reload loses every
418
+ * local tus handle and the listing no longer says what is in progress, so the
419
+ * status API is the only way to know. The loop stops by itself after one tick
420
+ * when nothing is.
385
421
  */
386
422
  watch(workspaceId: string | null): void;
387
423
  startPolling(): void;
388
424
  stopPolling(): void;
389
425
  private startUpload;
390
- /** The key a cached document is followed by in the tracker. */
391
- private keyOf;
392
- /** The id the workspace store holds for the file followed under `key`. */
393
- private storedId;
394
- private patchStored;
395
426
  private markIndexing;
396
- private markComplete;
397
427
  private markError;
398
428
  private pollUploadStatus;
399
429
  private runPollTick;
400
430
  /**
401
- * The job-level status can finish a file the document listing has not reported
402
- * (no workspace open, or a listing that lags): mirror what the tracker now says
403
- * onto the cached document and release the poller's hold on it.
431
+ * The jobs of the response the panel should show although this client did not send
432
+ * them. The server decides which ones the response holds — those in progress or just
433
+ * ended, on the workspaces the user can write to — so none is filtered by role or date
434
+ * here; only, with a workspace open, those that belong to it are kept. Whether the user
435
+ * started one is read from `initiatedBy`, which is their `userId`, so it holds after a
436
+ * page reload too.
404
437
  */
438
+ private remoteJobs;
439
+ /** Re-reads the workspace's listing. @returns Whether it differs from what was shown. */
440
+ private refreshListing;
441
+ /** The job-level status can finish a file this client was still holding the poller for: release it. */
405
442
  private settleFinishedUploads;
406
- private applyDocumentStatuses;
407
443
  /** Transfers that spent their whole budget and are parked in the error state: what "N uploads paused" counts once retrying has stopped. */
408
444
  private stalledUploadCount;
409
445
  private publishConnection;
@@ -868,7 +904,9 @@ type ViewMode$1 = "grid" | "list";
868
904
  * Each time it is shown it refreshes: workspaces created by others since the last
869
905
  * time appear, and the document counts match the server. The list already on
870
906
  * screen stays until the answer lands, and a failure leaves it untouched behind
871
- * an inline error.
907
+ * an inline error. While it stays shown, it keeps polling in the background
908
+ * (`injectLiveRefresh`) so a workspace created by someone else — one the current
909
+ * user only reads, say — appears on its own, with no action needed.
872
910
  */
873
911
  declare class WorkspaceList {
874
912
  /** A workspace was chosen for opening. */
@@ -897,7 +935,8 @@ declare class WorkspaceList {
897
935
  create: ({ name, description, tags, owners, readers }: _sinequa_atomic_angular_document_workspaces.CreateWorkspaceInput) => Promise<Workspace>;
898
936
  update: (id: string, patch: _sinequa_atomic.UpdateContainerInput) => Promise<Workspace | null>;
899
937
  remove: (ids: string[]) => Promise<_sinequa_atomic_angular_document_workspaces.RemoveWorkspacesResult>;
900
- loadDocuments: (workspaceId: string) => Promise<_sinequa_atomic_angular_document_workspaces.WorkspaceDocument[]>;
938
+ forget: (id: string) => void;
939
+ loadDocuments: (workspaceId: string, signal?: AbortSignal) => Promise<_sinequa_atomic_angular_document_workspaces.WorkspaceDocument[]>;
901
940
  loadMoreDocuments: (workspaceId: string) => Promise<_sinequa_atomic_angular_document_workspaces.WorkspaceDocument[]>;
902
941
  addDocuments: (workspaceId: string, documents: _sinequa_atomic_angular_document_workspaces.WorkspaceDocument[]) => void;
903
942
  discardDocuments: (workspaceId: string, documentIds: string[]) => void;
@@ -917,6 +956,7 @@ declare class WorkspaceList {
917
956
  selectedIds: string[];
918
957
  }>;
919
958
  private readonly dialogs;
959
+ private readonly uploads;
920
960
  private readonly transloco;
921
961
  protected readonly tabs: readonly {
922
962
  tab: WorkspaceTab;
@@ -936,6 +976,7 @@ declare class WorkspaceList {
936
976
  clearQuery: () => void;
937
977
  };
938
978
  protected readonly selection: _sinequa_atomic_angular_document_workspaces.Selection<Workspace>;
979
+ private readonly liveRefresh;
939
980
  constructor();
940
981
  /** Shows what is cached at once and refreshes behind it, or loads for the first time. */
941
982
  protected load(): Promise<void>;
@@ -1123,6 +1164,9 @@ type ViewMode = "grid" | "list";
1123
1164
  * shown: it says what the user asked for (`back`, `deleted`, `askFollowUp`) and whoever
1124
1165
  * hosts it decides. The document open in the preview is the `previewedDocumentId` model.
1125
1166
  *
1167
+ * While a workspace stays open, it keeps polling its documents in the background
1168
+ * (`injectLiveRefresh`), so a document another user adds to it shows up on its own.
1169
+ *
1126
1170
  * Only someone who can write sees the edit, share, delete, upload and select controls.
1127
1171
  */
1128
1172
  declare class WorkspaceDetail {
@@ -1153,6 +1197,8 @@ declare class WorkspaceDetail {
1153
1197
  protected readonly refreshing: _angular_core.WritableSignal<boolean>;
1154
1198
  protected readonly loadingMore: _angular_core.WritableSignal<boolean>;
1155
1199
  protected readonly loadMoreError: _angular_core.WritableSignal<string | null>;
1200
+ /** The background refresh found the workspace gone from the server (deleted elsewhere). */
1201
+ protected readonly deletedElsewhere: _angular_core.WritableSignal<boolean>;
1156
1202
  protected readonly workspace: _angular_core.Signal<Workspace | undefined>;
1157
1203
  protected readonly documents: _angular_core.Signal<WorkspaceDocument[]>;
1158
1204
  protected readonly previewed: _angular_core.Signal<WorkspaceDocument | null>;
@@ -1167,8 +1213,15 @@ declare class WorkspaceDetail {
1167
1213
  protected readonly filtered: _angular_core.Signal<WorkspaceDocument[]>;
1168
1214
  private readonly writable;
1169
1215
  protected readonly selection: _sinequa_atomic_angular_document_workspaces.Selection<WorkspaceDocument>;
1216
+ private readonly liveRefresh;
1170
1217
  constructor();
1171
1218
  private open;
1219
+ /**
1220
+ * Leaving from here: once the background refresh found the workspace gone,
1221
+ * the cache still holds it (so its name kept showing) — drop it now, so a
1222
+ * stale card does not show it back on the list.
1223
+ */
1224
+ protected leave(): void;
1172
1225
  /** Reads the workspace (when it is not cached) and its documents, for the workspace currently shown. */
1173
1226
  protected load(): Promise<void>;
1174
1227
  /** Reads the documents again without leaving the view; a failure leaves the ones shown as they are. */
@@ -1854,10 +1907,13 @@ declare class UploadTracker {
1854
1907
  connection: _angular_core.Signal<_sinequa_atomic_angular_document_workspaces.ConnectionNotice | null>;
1855
1908
  clearedCount: _angular_core.Signal<number>;
1856
1909
  jobIndexing: _angular_core.Signal<Record<string, number>>;
1910
+ ignoredJobs: _angular_core.Signal<Record<string, true>>;
1857
1911
  active: _angular_core.Signal<boolean>;
1858
1912
  failed: _angular_core.Signal<TrackedUpload[]>;
1859
1913
  byStatus: _angular_core.Signal<Record<UploadStatus, TrackedUpload[]>>;
1860
1914
  allDone: _angular_core.Signal<boolean>;
1915
+ settled: _angular_core.Signal<boolean>;
1916
+ authorFailed: _angular_core.Signal<boolean>;
1861
1917
  progress: _angular_core.Signal<Record<string, PhaseProgress>>;
1862
1918
  indexedCount: _angular_core.Signal<number>;
1863
1919
  track: (files: _sinequa_atomic_angular_document_workspaces.TrackFileInput[], workspaceId: string, workspaceName: string) => void;
@@ -1870,6 +1926,7 @@ declare class UploadTracker {
1870
1926
  }) => void;
1871
1927
  restart: (id: string) => void;
1872
1928
  applyJobs: (jobs: _sinequa_atomic.UploadJobStatus[]) => boolean;
1929
+ applyRemoteJobs: (entries: RemoteJobEntry[]) => boolean;
1873
1930
  setConnection: (connection: _sinequa_atomic_angular_document_workspaces.ConnectionNotice | null) => void;
1874
1931
  remove: (id: string) => void;
1875
1932
  removeWorkspace: (workspaceId: string) => void;
@@ -1880,6 +1937,7 @@ declare class UploadTracker {
1880
1937
  connection: _sinequa_atomic_angular_document_workspaces.ConnectionNotice | null;
1881
1938
  clearedCount: number;
1882
1939
  jobIndexing: Record<string, number>;
1940
+ ignoredJobs: Record<string, true>;
1883
1941
  }>;
1884
1942
  private readonly service;
1885
1943
  protected readonly mode: _angular_core.WritableSignal<Mode>;
@@ -1943,7 +2001,7 @@ declare class UploadTracker {
1943
2001
  protected onTransitionEnd(event: TransitionEvent): void;
1944
2002
  private clearHover;
1945
2003
  protected toggleExpanded(): void;
1946
- /** Minimizes while there is work going on; once everything is over, closes for good. */
2004
+ /** Minimizes while there is work going on; once everything is over (failures included), closes for good. */
1947
2005
  protected dismiss(): void;
1948
2006
  protected moveWorkspace(step: -1 | 1): void;
1949
2007
  protected isOpen(status: UploadStatus): boolean;
@@ -2007,6 +2065,8 @@ declare class UploadTrackerSection {
2007
2065
  protected readonly failed: _angular_core.Signal<boolean>;
2008
2066
  /** The bar: the phase's overall progress, or else the mean progress of the files in the section. */
2009
2067
  protected readonly average: _angular_core.Signal<number>;
2068
+ /** The translation key standing for a row with no file name: a job started elsewhere. Only read when `name` is empty. */
2069
+ protected label(upload: TrackedUpload): string;
2010
2070
  protected round(value: number): number;
2011
2071
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UploadTrackerSection, never>;
2012
2072
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<UploadTrackerSection, "upload-tracker-section", never, { "status": { "alias": "status"; "required": true; "isSignal": true; }; "uploads": { "alias": "uploads"; "required": true; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "progress": { "alias": "progress"; "required": false; "isSignal": true; }; }, { "toggle": "toggle"; "discard": "discard"; "retry": "retry"; }, never, never, true, never>;