@sinequa/atomic-angular 1.16.0 → 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[]>;
@@ -245,6 +256,20 @@ interface UploadTrackerState {
245
256
  clearedCount: number;
246
257
  /** What the server last said about each job's indexing, 0-100: indexed files / files of the job. */
247
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;
248
273
  }
249
274
  declare const isFinished: (upload: TrackedUpload) => boolean;
250
275
  declare const isFailed: (upload: TrackedUpload) => boolean;
@@ -268,10 +293,13 @@ declare const UploadTrackerStore: _angular_core.Type<{
268
293
  connection: _angular_core.Signal<ConnectionNotice | null>;
269
294
  clearedCount: _angular_core.Signal<number>;
270
295
  jobIndexing: _angular_core.Signal<Record<string, number>>;
296
+ ignoredJobs: _angular_core.Signal<Record<string, true>>;
271
297
  active: _angular_core.Signal<boolean>;
272
298
  failed: _angular_core.Signal<TrackedUpload[]>;
273
299
  byStatus: _angular_core.Signal<Record<UploadStatus, TrackedUpload[]>>;
274
300
  allDone: _angular_core.Signal<boolean>;
301
+ settled: _angular_core.Signal<boolean>;
302
+ authorFailed: _angular_core.Signal<boolean>;
275
303
  progress: _angular_core.Signal<Record<string, PhaseProgress>>;
276
304
  indexedCount: _angular_core.Signal<number>;
277
305
  track: (files: TrackFileInput[], workspaceId: string, workspaceName: string) => void;
@@ -284,6 +312,7 @@ declare const UploadTrackerStore: _angular_core.Type<{
284
312
  }) => void;
285
313
  restart: (id: string) => void;
286
314
  applyJobs: (jobs: UploadJobStatus[]) => boolean;
315
+ applyRemoteJobs: (entries: RemoteJobEntry[]) => boolean;
287
316
  setConnection: (connection: ConnectionNotice | null) => void;
288
317
  remove: (id: string) => void;
289
318
  removeWorkspace: (workspaceId: string) => void;
@@ -294,6 +323,7 @@ declare const UploadTrackerStore: _angular_core.Type<{
294
323
  connection: ConnectionNotice | null;
295
324
  clearedCount: number;
296
325
  jobIndexing: Record<string, number>;
326
+ ignoredJobs: Record<string, true>;
297
327
  }>>;
298
328
 
299
329
  interface UploadTarget {
@@ -318,6 +348,10 @@ interface AddFilesOptions {
318
348
  * speaks for both. What the user sees lives in `UploadTrackerStore`; this
319
349
  * service only writes to it.
320
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
+ *
321
355
  * Root-scoped: an upload must outlive the view that started it. It registers its
322
356
  * window and auth listeners once, and removes them when the application is destroyed.
323
357
  */
@@ -359,7 +393,7 @@ declare class UploadService {
359
393
  addFiles(workspace: UploadTarget, files: File[], options: AddFilesOptions): string[];
360
394
  /**
361
395
  * Abandons a transfer and forgets it: stops it, and drops the file from the
362
- * tracker and from the workspace's cached documents. Works while it is sending
396
+ * tracker. Works while it is sending
363
397
  * and once it has failed; once the bytes are in, indexing is the server's and
364
398
  * there is nothing left to cancel.
365
399
  *
@@ -379,32 +413,33 @@ declare class UploadService {
379
413
  resumeStalled(): void;
380
414
  /**
381
415
  * Tells the service which workspace is open, so the status polling can be
382
- * scoped to it (the API documents that as the cheaper lookup) and refresh what
383
- * it shows. `null` when none is. Starts the polling when the workspace holds
384
- * documents that are not finished yet: a page reload loses every local tus
385
- * 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.
386
421
  */
387
422
  watch(workspaceId: string | null): void;
388
423
  startPolling(): void;
389
424
  stopPolling(): void;
390
425
  private startUpload;
391
- /** The key a cached document is followed by in the tracker. */
392
- private keyOf;
393
- /** The id the workspace store holds for the file followed under `key`. */
394
- private storedId;
395
- private patchStored;
396
426
  private markIndexing;
397
- private markComplete;
398
427
  private markError;
399
428
  private pollUploadStatus;
400
429
  private runPollTick;
401
430
  /**
402
- * The job-level status can finish a file the document listing has not reported
403
- * (no workspace open, or a listing that lags): mirror what the tracker now says
404
- * 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.
405
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. */
406
442
  private settleFinishedUploads;
407
- private applyDocumentStatuses;
408
443
  /** Transfers that spent their whole budget and are parked in the error state: what "N uploads paused" counts once retrying has stopped. */
409
444
  private stalledUploadCount;
410
445
  private publishConnection;
@@ -921,6 +956,7 @@ declare class WorkspaceList {
921
956
  selectedIds: string[];
922
957
  }>;
923
958
  private readonly dialogs;
959
+ private readonly uploads;
924
960
  private readonly transloco;
925
961
  protected readonly tabs: readonly {
926
962
  tab: WorkspaceTab;
@@ -1871,10 +1907,13 @@ declare class UploadTracker {
1871
1907
  connection: _angular_core.Signal<_sinequa_atomic_angular_document_workspaces.ConnectionNotice | null>;
1872
1908
  clearedCount: _angular_core.Signal<number>;
1873
1909
  jobIndexing: _angular_core.Signal<Record<string, number>>;
1910
+ ignoredJobs: _angular_core.Signal<Record<string, true>>;
1874
1911
  active: _angular_core.Signal<boolean>;
1875
1912
  failed: _angular_core.Signal<TrackedUpload[]>;
1876
1913
  byStatus: _angular_core.Signal<Record<UploadStatus, TrackedUpload[]>>;
1877
1914
  allDone: _angular_core.Signal<boolean>;
1915
+ settled: _angular_core.Signal<boolean>;
1916
+ authorFailed: _angular_core.Signal<boolean>;
1878
1917
  progress: _angular_core.Signal<Record<string, PhaseProgress>>;
1879
1918
  indexedCount: _angular_core.Signal<number>;
1880
1919
  track: (files: _sinequa_atomic_angular_document_workspaces.TrackFileInput[], workspaceId: string, workspaceName: string) => void;
@@ -1887,6 +1926,7 @@ declare class UploadTracker {
1887
1926
  }) => void;
1888
1927
  restart: (id: string) => void;
1889
1928
  applyJobs: (jobs: _sinequa_atomic.UploadJobStatus[]) => boolean;
1929
+ applyRemoteJobs: (entries: RemoteJobEntry[]) => boolean;
1890
1930
  setConnection: (connection: _sinequa_atomic_angular_document_workspaces.ConnectionNotice | null) => void;
1891
1931
  remove: (id: string) => void;
1892
1932
  removeWorkspace: (workspaceId: string) => void;
@@ -1897,6 +1937,7 @@ declare class UploadTracker {
1897
1937
  connection: _sinequa_atomic_angular_document_workspaces.ConnectionNotice | null;
1898
1938
  clearedCount: number;
1899
1939
  jobIndexing: Record<string, number>;
1940
+ ignoredJobs: Record<string, true>;
1900
1941
  }>;
1901
1942
  private readonly service;
1902
1943
  protected readonly mode: _angular_core.WritableSignal<Mode>;
@@ -1960,7 +2001,7 @@ declare class UploadTracker {
1960
2001
  protected onTransitionEnd(event: TransitionEvent): void;
1961
2002
  private clearHover;
1962
2003
  protected toggleExpanded(): void;
1963
- /** 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. */
1964
2005
  protected dismiss(): void;
1965
2006
  protected moveWorkspace(step: -1 | 1): void;
1966
2007
  protected isOpen(status: UploadStatus): boolean;
@@ -2024,6 +2065,8 @@ declare class UploadTrackerSection {
2024
2065
  protected readonly failed: _angular_core.Signal<boolean>;
2025
2066
  /** The bar: the phase's overall progress, or else the mean progress of the files in the section. */
2026
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;
2027
2070
  protected round(value: number): number;
2028
2071
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UploadTrackerSection, never>;
2029
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>;