@sinequa/atomic-angular 2.14.0 → 2.16.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sinequa/atomic-angular",
3
- "version": "2.14.0",
3
+ "version": "2.16.0",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -35,7 +35,7 @@
35
35
  "@angular/core": "^22.0.0",
36
36
  "@angular/aria": "^22.2.0",
37
37
  "@sinequa/galactik": "^2.0.0",
38
- "@sinequa/atomic": ">=2.10.0",
38
+ "@sinequa/atomic": ">=2.16.0",
39
39
  "vanilla-calendar-pro": "^3.4.0",
40
40
  "chart.js": "^4.4.0",
41
41
  "chartjs-chart-matrix": "^3.0.0",
@@ -16,11 +16,21 @@ interface Workspace {
16
16
  color: WorkspaceColor;
17
17
  description: string;
18
18
  tags: string[];
19
- documentCount: number;
19
+ /**
20
+ * Documents in the workspace. `undefined` until known: the search that lists the workspaces
21
+ * does not count them, the one that lists a workspace's content does.
22
+ */
23
+ documentCount?: number;
20
24
  creatorId: string;
21
25
  ownerIds: string[];
22
26
  readerIds: string[];
23
27
  currentUserRole: WorkspaceRole;
28
+ /**
29
+ * Whether `creatorId`, `ownerIds` and `readerIds` hold the real lists. The search that lists
30
+ * workspaces does not return them (only the create/update calls do), so a workspace read that
31
+ * way has them empty: sending those empty lists back would wipe the real ones.
32
+ */
33
+ membersKnown: boolean;
24
34
  }
25
35
  /** Lifecycle of a document being added: `null` (or absent) once it is indexed. */
26
36
  type DocumentStatus = "uploading" | "indexing" | "error";
@@ -148,6 +158,11 @@ interface ConnectionNotice {
148
158
  */
149
159
  retry?(): void;
150
160
  }
161
+ /**
162
+ * Query web service the agent-workspace search runs on. The server answers with its own
163
+ * document-upload query whatever name is sent, but the request still has to carry one.
164
+ */
165
+ declare const WORKSPACES_QUERY_NAME = "query_Web";
151
166
  /**
152
167
  * Most workspaces the list keeps loaded: "load more" stops there, so the list never puts an
153
168
  * unbounded number of cards in the DOM. Past it, {@link WorkspacesStore.truncated} is true.
@@ -168,6 +183,10 @@ interface WorkspacesState {
168
183
  documentPagination: Record<string, Pagination>;
169
184
  /** Ids ticked in the "+"/"@" mention pickers — shared between every picker instance. */
170
185
  selectedIds: string[];
186
+ /** What the list's search box asked the server for ("" = every workspace). Reloads and "load more" keep it. */
187
+ searchText: string;
188
+ /** What each open workspace's search box asked the server for, by workspace id. Refreshes keep it. */
189
+ documentSearch: Record<string, string>;
171
190
  }
172
191
  interface CreateWorkspaceInput {
173
192
  name: string;
@@ -185,8 +204,9 @@ interface RemoveWorkspacesResult {
185
204
  }[];
186
205
  }
187
206
  /**
188
- * Workspaces and their documents, backed by the container-management API
189
- * (`@sinequa/atomic`'s `*Container*` functions).
207
+ * Workspaces and their documents. They are read through the agent-workspace search
208
+ * (`fetchWorkspaces`, `fetchWorkspace`, `fetchWorkspaceContent` of `@sinequa/atomic`) and written
209
+ * through the workspace management endpoints (create, update, delete, documents).
190
210
  *
191
211
  * Root-scoped on purpose: the workspace list, the mention picker and the
192
212
  * save/move picker are separate components that have to see the same cache and
@@ -207,6 +227,8 @@ export declare const WorkspacesStore: import("@angular/core").Type<{
207
227
  documents: import("@angular/core").Signal<Record<string, WorkspaceDocument[]>>;
208
228
  documentPagination: import("@angular/core").Signal<Record<string, Pagination>>;
209
229
  selectedIds: import("@angular/core").Signal<string[]>;
230
+ searchText: import("@angular/core").Signal<string>;
231
+ documentSearch: import("@angular/core").Signal<Record<string, string>>;
210
232
  hasMore: import("@angular/core").Signal<boolean>;
211
233
  truncated: import("@angular/core").Signal<boolean>;
212
234
  selectedCount: import("@angular/core").Signal<number>;
@@ -216,6 +238,7 @@ export declare const WorkspacesStore: import("@angular/core").Type<{
216
238
  hasMoreDocuments: (workspaceId: string) => boolean;
217
239
  ensureLoaded: () => Promise<Workspace[]>;
218
240
  reload: () => Promise<Workspace[]>;
241
+ search: (text: string) => Promise<Workspace[]>;
219
242
  loadMore: () => Promise<Workspace[]>;
220
243
  fetch: (id: string) => Promise<Workspace>;
221
244
  create: ({ name, description, tags, owners, readers }: CreateWorkspaceInput) => Promise<Workspace>;
@@ -223,6 +246,8 @@ export declare const WorkspacesStore: import("@angular/core").Type<{
223
246
  remove: (ids: string[]) => Promise<RemoveWorkspacesResult>;
224
247
  forget: (id: string) => void;
225
248
  loadDocuments: (workspaceId: string, signal?: AbortSignal) => Promise<WorkspaceDocument[]>;
249
+ searchDocuments: (workspaceId: string, text: string, signal?: AbortSignal) => Promise<WorkspaceDocument[]>;
250
+ resetDocumentSearch: (workspaceId: string) => void;
226
251
  loadMoreDocuments: (workspaceId: string) => Promise<WorkspaceDocument[]>;
227
252
  addDocuments: (workspaceId: string, documents: WorkspaceDocument[]) => void;
228
253
  discardDocuments: (workspaceId: string, documentIds: string[]) => void;
@@ -240,6 +265,8 @@ export declare const WorkspacesStore: import("@angular/core").Type<{
240
265
  documents: Record<string, WorkspaceDocument[]>;
241
266
  documentPagination: Record<string, Pagination>;
242
267
  selectedIds: string[];
268
+ searchText: string;
269
+ documentSearch: Record<string, string>;
243
270
  }>>;
244
271
  interface TrackerWorkspace {
245
272
  id: string;
@@ -968,6 +995,11 @@ type WorkspaceSearchFields = "name" | "name+description";
968
995
  interface WorkspaceFilterOptions {
969
996
  /** What the query is matched against. Read reactively; the name only when absent. */
970
997
  fields?: () => WorkspaceSearchFields;
998
+ /**
999
+ * The server does the searching: `filtered` then keeps only the tab and does not narrow by the query itself
1000
+ * (the list it reads is already the answer). The query is still there for the search box and the highlighting.
1001
+ */
1002
+ serverSide?: boolean;
971
1003
  }
972
1004
  /**
973
1005
  * The workspace list's tab and search box, and the list they produce.
@@ -1509,6 +1541,8 @@ export declare class WorkspaceList {
1509
1541
  documents: import("@angular/core").Signal<Record<string, import("@sinequa/atomic-angular/document-workspaces").WorkspaceDocument[]>>;
1510
1542
  documentPagination: import("@angular/core").Signal<Record<string, import("@sinequa/atomic-angular/document-workspaces").Pagination>>;
1511
1543
  selectedIds: import("@angular/core").Signal<string[]>;
1544
+ searchText: import("@angular/core").Signal<string>;
1545
+ documentSearch: import("@angular/core").Signal<Record<string, string>>;
1512
1546
  hasMore: import("@angular/core").Signal<boolean>;
1513
1547
  truncated: import("@angular/core").Signal<boolean>;
1514
1548
  selectedCount: import("@angular/core").Signal<number>;
@@ -1518,6 +1552,7 @@ export declare class WorkspaceList {
1518
1552
  hasMoreDocuments: (workspaceId: string) => boolean;
1519
1553
  ensureLoaded: () => Promise<Workspace[]>;
1520
1554
  reload: () => Promise<Workspace[]>;
1555
+ search: (text: string) => Promise<Workspace[]>;
1521
1556
  loadMore: () => Promise<Workspace[]>;
1522
1557
  fetch: (id: string) => Promise<Workspace>;
1523
1558
  create: ({ name, description, tags, owners, readers }: import("@sinequa/atomic-angular/document-workspaces").CreateWorkspaceInput) => Promise<Workspace>;
@@ -1525,6 +1560,8 @@ export declare class WorkspaceList {
1525
1560
  remove: (ids: string[]) => Promise<import("@sinequa/atomic-angular/document-workspaces").RemoveWorkspacesResult>;
1526
1561
  forget: (id: string) => void;
1527
1562
  loadDocuments: (workspaceId: string, signal?: AbortSignal) => Promise<import("@sinequa/atomic-angular/document-workspaces").WorkspaceDocument[]>;
1563
+ searchDocuments: (workspaceId: string, text: string, signal?: AbortSignal) => Promise<import("@sinequa/atomic-angular/document-workspaces").WorkspaceDocument[]>;
1564
+ resetDocumentSearch: (workspaceId: string) => void;
1528
1565
  loadMoreDocuments: (workspaceId: string) => Promise<import("@sinequa/atomic-angular/document-workspaces").WorkspaceDocument[]>;
1529
1566
  addDocuments: (workspaceId: string, documents: import("@sinequa/atomic-angular/document-workspaces").WorkspaceDocument[]) => void;
1530
1567
  discardDocuments: (workspaceId: string, documentIds: string[]) => void;
@@ -1542,6 +1579,8 @@ export declare class WorkspaceList {
1542
1579
  documents: Record<string, import("@sinequa/atomic-angular/document-workspaces").WorkspaceDocument[]>;
1543
1580
  documentPagination: Record<string, import("@sinequa/atomic-angular/document-workspaces").Pagination>;
1544
1581
  selectedIds: string[];
1582
+ searchText: string;
1583
+ documentSearch: Record<string, string>;
1545
1584
  }>;
1546
1585
  private readonly uploads;
1547
1586
  private readonly injector;
@@ -1568,6 +1607,7 @@ export declare class WorkspaceList {
1568
1607
  protected readonly selection: import("@sinequa/atomic-angular/document-workspaces").Selection<Workspace>;
1569
1608
  private readonly liveRefresh;
1570
1609
  constructor();
1610
+ private search;
1571
1611
  /** Shows what is cached at once and refreshes behind it, or loads for the first time. */
1572
1612
  protected load(): Promise<void>;
1573
1613
  private refresh;
@@ -2005,8 +2045,17 @@ export declare class ShareDialog {
2005
2045
  protected readonly staged: import("@angular/core").WritableSignal<PickedPrincipal[]>;
2006
2046
  protected readonly adding: import("@angular/core").WritableSignal<boolean>;
2007
2047
  protected readonly busy: import("@angular/core").WritableSignal<boolean>;
2048
+ /** The people with access are being read: the search that lists workspaces does not return them. */
2049
+ protected readonly loadingMembers: import("@angular/core").WritableSignal<boolean>;
2008
2050
  protected readonly error: import("@angular/core").WritableSignal<WorkspaceErrorMessage | null>;
2009
2051
  constructor();
2052
+ /**
2053
+ * The search that lists the workspaces returns who the caller is, not who else has access. An update
2054
+ * that changes nothing answers with the whole workspace: that is where the people come from.
2055
+ * Until then the dialog writes nothing, since the API replaces the owners and readers wholesale.
2056
+ */
2057
+ private loadMembers;
2058
+ protected reloadMembers(): void;
2010
2059
  protected add(): Promise<void>;
2011
2060
  protected change(id: string, role: AssignableRole | "remove"): Promise<void>;
2012
2061
  /** One write at a time: the arrays it sends are built from the workspace as it is now. */
@@ -2216,6 +2265,7 @@ export declare class WorkspaceDetail {
2216
2265
  protected readonly selection: import("@sinequa/atomic-angular/document-workspaces").Selection<WorkspaceDocument>;
2217
2266
  private readonly liveRefresh;
2218
2267
  constructor();
2268
+ private search;
2219
2269
  private open;
2220
2270
  /**
2221
2271
  * Leaving from here: once the background refresh found the workspace gone,
@@ -2278,7 +2328,7 @@ interface MentionItem {
2278
2328
  name: string;
2279
2329
  description: string;
2280
2330
  color: WorkspaceColor;
2281
- documentCount: number;
2331
+ documentCount?: number;
2282
2332
  /** The current user's role on it: a host can mark the read-only rows (`reader`) without hiding them. */
2283
2333
  currentUserRole: WorkspaceRole;
2284
2334
  selected: boolean;