@sinequa/atomic-angular 2.15.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.15.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;
@@ -1551,7 +1590,7 @@ export declare class WorkspaceList {
1551
1590
  labelKey: string;
1552
1591
  }[];
1553
1592
  protected readonly viewMode: import("@angular/core").WritableSignal<ViewMode$1>;
1554
- protected readonly status: import("@angular/core").WritableSignal<"loading" | "ready" | "error">;
1593
+ protected readonly status: import("@angular/core").WritableSignal<"error" | "loading" | "ready">;
1555
1594
  protected readonly loadError: import("@angular/core").WritableSignal<Message | null>;
1556
1595
  protected readonly refreshError: import("@angular/core").WritableSignal<string | null>;
1557
1596
  protected readonly loadingMore: import("@angular/core").WritableSignal<boolean>;
@@ -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. */
@@ -2135,7 +2184,7 @@ export declare class WorkspaceEditDialog {
2135
2184
  protected readonly busy: import("@angular/core").WritableSignal<boolean>;
2136
2185
  protected readonly error: import("@angular/core").WritableSignal<WorkspaceErrorMessage | null>;
2137
2186
  protected readonly descriptionTooLong: import("@angular/core").Signal<boolean>;
2138
- protected readonly saveLabel: import("@angular/core").Signal<"documentWorkspaces.edit.creating" | "documentWorkspaces.edit.saving" | "documentWorkspaces.common.create" | "documentWorkspaces.common.save">;
2187
+ protected readonly saveLabel: import("@angular/core").Signal<"documentWorkspaces.common.save" | "documentWorkspaces.edit.creating" | "documentWorkspaces.edit.saving" | "documentWorkspaces.common.create">;
2139
2188
  /** What to resolve with once the native dialog has closed: the saved workspace, or the plain dismissal. */
2140
2189
  private outcome;
2141
2190
  constructor();
@@ -2192,7 +2241,7 @@ export declare class WorkspaceDetail {
2192
2241
  protected readonly query: import("@angular/core").WritableSignal<string>;
2193
2242
  /** The search box, bound to `query`. */
2194
2243
  protected readonly searchForm: import("@angular/forms/signals").FieldTree<string, string | number, "writable">;
2195
- protected readonly status: import("@angular/core").WritableSignal<"loading" | "ready" | "error">;
2244
+ protected readonly status: import("@angular/core").WritableSignal<"error" | "loading" | "ready">;
2196
2245
  protected readonly loadError: import("@angular/core").WritableSignal<Message | null>;
2197
2246
  protected readonly refreshError: import("@angular/core").WritableSignal<string | null>;
2198
2247
  protected readonly refreshing: import("@angular/core").WritableSignal<boolean>;
@@ -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;
@@ -2327,7 +2377,7 @@ export declare function injectWorkspaceMention(options?: WorkspaceMentionOptions
2327
2377
  /** The workspaces in each category — the whole list, not what the search left. */
2328
2378
  counts: import("@angular/core").Signal<import("@sinequa/atomic-angular/document-workspaces").WorkspaceTabCounts>;
2329
2379
  /** Whether the first page is loading, ready or failed. */
2330
- status: import("@angular/core").Signal<"loading" | "ready" | "error">;
2380
+ status: import("@angular/core").Signal<"error" | "loading" | "ready">;
2331
2381
  /** More workspaces than the loaded ones exist on the server: `loadMore()` fetches the next page. */
2332
2382
  hasMore: import("@angular/core").Signal<boolean>;
2333
2383
  /** The loading cap is reached: some workspaces will never be offered, search included. */
@@ -2374,7 +2424,7 @@ export declare const WORKSPACE_MENTION: InjectionToken<{
2374
2424
  /** The workspaces in each category — the whole list, not what the search left. */
2375
2425
  counts: import("@angular/core").Signal<import("@sinequa/atomic-angular/document-workspaces").WorkspaceTabCounts>;
2376
2426
  /** Whether the first page is loading, ready or failed. */
2377
- status: import("@angular/core").Signal<"loading" | "ready" | "error">;
2427
+ status: import("@angular/core").Signal<"error" | "loading" | "ready">;
2378
2428
  /** More workspaces than the loaded ones exist on the server: `loadMore()` fetches the next page. */
2379
2429
  hasMore: import("@angular/core").Signal<boolean>;
2380
2430
  /** The loading cap is reached: some workspaces will never be offered, search included. */
@@ -2525,7 +2575,7 @@ export declare class WorkspaceMention implements WorkspaceMentionApi, AfterConte
2525
2575
  labelKey: string;
2526
2576
  }[];
2527
2577
  readonly counts: import("@angular/core").Signal<import("@sinequa/atomic-angular/document-workspaces").WorkspaceTabCounts>;
2528
- readonly status: import("@angular/core").Signal<"loading" | "ready" | "error">;
2578
+ readonly status: import("@angular/core").Signal<"error" | "loading" | "ready">;
2529
2579
  readonly hasMore: import("@angular/core").Signal<boolean>;
2530
2580
  readonly truncated: import("@angular/core").Signal<boolean>;
2531
2581
  readonly loadingMore: import("@angular/core").Signal<boolean>;
@@ -2595,7 +2645,7 @@ export declare class WorkspaceMentionNew implements AfterContentInit {
2595
2645
  /** The button's colour scheme. */
2596
2646
  readonly scheme: import("@angular/core").InputSignal<"default" | "neutral" | null | undefined>;
2597
2647
  /** The button's size. */
2598
- readonly size: import("@angular/core").InputSignal<"sm" | "md" | "lg" | "small" | "xs" | "xsmall" | "medium" | "large" | null | undefined>;
2648
+ readonly size: import("@angular/core").InputSignal<"small" | "medium" | "md" | "lg" | "sm" | "xs" | "xsmall" | "large" | null | undefined>;
2599
2649
  private readonly mention;
2600
2650
  private readonly slot;
2601
2651
  /** Whether the host put its own content inside: the icon and the label then stay out. */
@@ -2638,7 +2688,7 @@ export declare class WorkspaceMentionRows {
2638
2688
  labelKey: string;
2639
2689
  }[];
2640
2690
  counts: import("@angular/core").Signal<import("@sinequa/atomic-angular/document-workspaces").WorkspaceTabCounts>;
2641
- status: import("@angular/core").Signal<"loading" | "ready" | "error">;
2691
+ status: import("@angular/core").Signal<"error" | "loading" | "ready">;
2642
2692
  hasMore: import("@angular/core").Signal<boolean>;
2643
2693
  truncated: import("@angular/core").Signal<boolean>;
2644
2694
  loadingMore: import("@angular/core").Signal<boolean>;
@@ -2660,9 +2710,9 @@ export declare class WorkspaceMentionRows {
2660
2710
  /** The search box of the enclosing `<workspace-mention>`: it narrows what the menu offers. */
2661
2711
  export declare class WorkspaceMentionSearch {
2662
2712
  /** The size of the box, as `<SearchInput>` sizes it. */
2663
- readonly size: import("@angular/core").InputSignal<"sm" | "md" | "lg" | null | undefined>;
2713
+ readonly size: import("@angular/core").InputSignal<"md" | "lg" | "sm" | null | undefined>;
2664
2714
  /** The size of the text, as `<SearchInput>` sizes it; follows `size` when absent. */
2665
- readonly textSize: import("@angular/core").InputSignal<"sm" | "base" | null | undefined>;
2715
+ readonly textSize: import("@angular/core").InputSignal<"base" | "sm" | null | undefined>;
2666
2716
  /** The hint shown in the empty box; the translated "Search workspace..." when absent. */
2667
2717
  readonly placeholder: import("@angular/core").InputSignal<string | undefined>;
2668
2718
  /** The accessible name of the box; the placeholder when absent. */
@@ -2709,7 +2759,7 @@ export declare class WorkspaceMentionSelectAll {
2709
2759
  labelKey: string;
2710
2760
  }[];
2711
2761
  counts: import("@angular/core").Signal<import("@sinequa/atomic-angular/document-workspaces").WorkspaceTabCounts>;
2712
- status: import("@angular/core").Signal<"loading" | "ready" | "error">;
2762
+ status: import("@angular/core").Signal<"error" | "loading" | "ready">;
2713
2763
  hasMore: import("@angular/core").Signal<boolean>;
2714
2764
  truncated: import("@angular/core").Signal<boolean>;
2715
2765
  loadingMore: import("@angular/core").Signal<boolean>;
@@ -2745,7 +2795,7 @@ export declare class WorkspaceMentionTabs {
2745
2795
  labelKey: string;
2746
2796
  }[];
2747
2797
  counts: import("@angular/core").Signal<import("@sinequa/atomic-angular/document-workspaces").WorkspaceTabCounts>;
2748
- status: import("@angular/core").Signal<"loading" | "ready" | "error">;
2798
+ status: import("@angular/core").Signal<"error" | "loading" | "ready">;
2749
2799
  hasMore: import("@angular/core").Signal<boolean>;
2750
2800
  truncated: import("@angular/core").Signal<boolean>;
2751
2801
  loadingMore: import("@angular/core").Signal<boolean>;
@@ -2790,14 +2840,14 @@ export declare const NEW_WORKSPACE_NAME_MAX = 50;
2790
2840
  */
2791
2841
  export declare class WorkspacePicker {
2792
2842
  /** `save` attaches `documents` to the chosen workspace; `move` takes `documentIds` from `fromWorkspaceId` to it. */
2793
- readonly mode: import("@angular/core").InputSignal<"save" | "move">;
2843
+ readonly mode: import("@angular/core").InputSignal<"move" | "save">;
2794
2844
  readonly documents: import("@angular/core").InputSignal<readonly PickerDocument[]>;
2795
2845
  readonly fromWorkspaceId: import("@angular/core").InputSignal<string | null>;
2796
2846
  readonly documentIds: import("@angular/core").InputSignal<readonly string[]>;
2797
2847
  /** The documents are in the workspace, and the check mark has been seen. */
2798
2848
  readonly completed: import("@angular/core").OutputEmitterRef<Workspace>;
2799
2849
  private readonly store;
2800
- protected readonly status: import("@angular/core").WritableSignal<"loading" | "ready" | "error">;
2850
+ protected readonly status: import("@angular/core").WritableSignal<"error" | "loading" | "ready">;
2801
2851
  protected readonly busyId: import("@angular/core").WritableSignal<string | null>;
2802
2852
  protected readonly doneId: import("@angular/core").WritableSignal<string | null>;
2803
2853
  protected readonly error: import("@angular/core").WritableSignal<Message | null>;