@arsedizioni/ars-utils 22.5.12 → 22.5.14
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/clipper.common/README.md +9 -3
- package/fesm2022/arsedizioni-ars-utils-clipper.common.mjs +927 -712
- package/fesm2022/arsedizioni-ars-utils-clipper.common.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-clipper.ui.mjs +8 -8
- package/fesm2022/arsedizioni-ars-utils-clipper.ui.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-evolution.common.mjs +429 -211
- package/fesm2022/arsedizioni-ars-utils-evolution.common.mjs.map +1 -1
- package/package.json +1 -1
- package/types/arsedizioni-ars-utils-clipper.common.d.ts +201 -55
- package/types/arsedizioni-ars-utils-clipper.ui.d.ts +6 -6
- package/types/arsedizioni-ars-utils-evolution.common.d.ts +336 -57
|
@@ -1,15 +1,27 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { Signal, WritableSignal } from '@angular/core';
|
|
3
|
-
import { NameValueItem,
|
|
3
|
+
import { NameValueItem, LoginResult, ApiResult, FolderTree } from '@arsedizioni/ars-utils/core';
|
|
4
4
|
import { SendToDialogResult } from '@arsedizioni/ars-utils/ui';
|
|
5
5
|
import { HttpInterceptorFn } from '@angular/common/http';
|
|
6
6
|
import * as rxjs from 'rxjs';
|
|
7
|
+
import { Observable } from 'rxjs';
|
|
7
8
|
|
|
8
9
|
declare const ClipperMessages: {
|
|
9
10
|
/**
|
|
10
11
|
* Messages
|
|
11
12
|
*/
|
|
12
13
|
ERROR: string;
|
|
14
|
+
/**
|
|
15
|
+
* The session is gone: a 401 on a request that was not a login attempt.
|
|
16
|
+
* Emitted once per dead session by `clipperAuthInterceptor`, which re-arms on the first
|
|
17
|
+
* good response.
|
|
18
|
+
*/
|
|
19
|
+
ERROR_401: string;
|
|
20
|
+
/**
|
|
21
|
+
* The API is not answering: the interceptor has already sent the request three times over
|
|
22
|
+
* ten seconds. Emitted once, and re-armed on the first good response.
|
|
23
|
+
*/
|
|
24
|
+
ERROR_UNAVAILABLE: string;
|
|
13
25
|
SUCCESS: string;
|
|
14
26
|
SUCCESS_TOAST: string;
|
|
15
27
|
LOGIN_CHANGED: string;
|
|
@@ -191,10 +203,7 @@ interface ClipperLoginResult extends LoginResult<ClipperUserInfo> {
|
|
|
191
203
|
}
|
|
192
204
|
interface ClipperLoginInfo {
|
|
193
205
|
context?: ClipperUserInfo;
|
|
194
|
-
complianceContext?: any;
|
|
195
206
|
channels?: ClipperChannelSettings[];
|
|
196
|
-
oauth?: LoginOAuthType;
|
|
197
|
-
remember?: boolean;
|
|
198
207
|
}
|
|
199
208
|
declare enum ClipperQueryDocumentFlags {
|
|
200
209
|
None = 0,
|
|
@@ -319,6 +328,40 @@ interface ClipperDocumentRelevants {
|
|
|
319
328
|
hit: number;
|
|
320
329
|
chunks: number;
|
|
321
330
|
}
|
|
331
|
+
/** One delivery of a shared note by email, and whether the recipient opened it. */
|
|
332
|
+
interface ClipperDocumentNoteTracking {
|
|
333
|
+
id: string;
|
|
334
|
+
userMailId: number;
|
|
335
|
+
email?: string;
|
|
336
|
+
sentDate: Date;
|
|
337
|
+
openDate?: Date;
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* A shared note attached to a document.
|
|
341
|
+
*
|
|
342
|
+
* The library never creates or edits one -- notes belong to the application that owns the
|
|
343
|
+
* account -- but the API attaches them to documents and to `metadata()`, so the shape is
|
|
344
|
+
* declared here rather than letting a consumer read a response it cannot see.
|
|
345
|
+
*/
|
|
346
|
+
interface ClipperDocumentNote {
|
|
347
|
+
id?: number;
|
|
348
|
+
teamId?: string;
|
|
349
|
+
teamTitle?: string;
|
|
350
|
+
documentId?: string;
|
|
351
|
+
documentTitle?: string;
|
|
352
|
+
color?: string;
|
|
353
|
+
name?: string;
|
|
354
|
+
note?: string;
|
|
355
|
+
trackings?: ClipperDocumentNoteTracking[];
|
|
356
|
+
trackingsCount?: number;
|
|
357
|
+
trackingsOpenedCount?: number;
|
|
358
|
+
expiringDate?: Date;
|
|
359
|
+
isExpired?: boolean;
|
|
360
|
+
isTroubled?: boolean;
|
|
361
|
+
isMenuOpen?: boolean;
|
|
362
|
+
isOver?: boolean;
|
|
363
|
+
created?: Date;
|
|
364
|
+
}
|
|
322
365
|
interface ClipperDocumentInfo {
|
|
323
366
|
id?: string;
|
|
324
367
|
documentId?: string;
|
|
@@ -346,6 +389,7 @@ interface ClipperDocumentInfo {
|
|
|
346
389
|
originDescription?: string;
|
|
347
390
|
author?: string;
|
|
348
391
|
anchors?: ClipperDocumentAnchorInfo[];
|
|
392
|
+
notes?: ClipperDocumentNote[];
|
|
349
393
|
chunks?: ClipperDocumentAnchorInfo[];
|
|
350
394
|
chunksList?: string;
|
|
351
395
|
taxonomy?: string;
|
|
@@ -474,13 +518,15 @@ declare enum ClipperExportDocumentsFormat {
|
|
|
474
518
|
iCalendar = 2
|
|
475
519
|
}
|
|
476
520
|
interface ClipperExportDocumentsParams {
|
|
477
|
-
query
|
|
521
|
+
query?: ClipperSearchParams;
|
|
478
522
|
ids: string[];
|
|
479
523
|
format?: ClipperExportDocumentsFormat;
|
|
480
524
|
}
|
|
481
525
|
interface ClipperSendDocumentsByEmailParams extends SendToDialogResult {
|
|
482
526
|
ids?: string[];
|
|
527
|
+
isCalendar?: boolean;
|
|
483
528
|
public?: string;
|
|
529
|
+
userNoteId?: number;
|
|
484
530
|
}
|
|
485
531
|
interface ClipperDocumentStructure {
|
|
486
532
|
id: string;
|
|
@@ -688,9 +734,36 @@ declare class ClipperSearchUtils {
|
|
|
688
734
|
/**
|
|
689
735
|
* Builds the Clipper auth HTTP interceptor.
|
|
690
736
|
*
|
|
691
|
-
*
|
|
692
|
-
*
|
|
693
|
-
*
|
|
737
|
+
* Attaches the credentials and the service-worker bypass header to every request aimed at the
|
|
738
|
+
* Clipper API, and turns HTTP failures into broadcast messages — no UI dependency here.
|
|
739
|
+
*
|
|
740
|
+
* Takes the Clipper base URI and the service flags directly as arguments, captured in the closure,
|
|
741
|
+
* so it never injects `ClipperService`: registering it does not pull the whole Clipper service into
|
|
742
|
+
* the eager bundle. The debounce and the two notification latches live in that same closure, so two
|
|
743
|
+
* applications registering two interceptors never share them.
|
|
744
|
+
*
|
|
745
|
+
* ## What the statuses mean
|
|
746
|
+
*
|
|
747
|
+
* Aligned with the Clipper 7.5 API on 2026-08-25. The meaning of the status codes changed with the
|
|
748
|
+
* API: failures used to arrive as `200 OK` with `success: false`, and this interceptor had to guess.
|
|
749
|
+
* Now the status is the truth — a 401 on an already-authenticated request means the session is
|
|
750
|
+
* gone, a 403 means the permission is missing, and a 5xx means the server broke, which is not the
|
|
751
|
+
* same thing at all and must not sign the user out.
|
|
752
|
+
*
|
|
753
|
+
* A dead session is broadcast as `ClipperMessages.ERROR_401`, for the host application to handle
|
|
754
|
+
* centrally; every other failure stays a `ClipperMessages.ERROR` carrying a message. The two are
|
|
755
|
+
* separate because they call for opposite things: one returns to the sign-in page, the other shows
|
|
756
|
+
* a dialog and leaves the user where they are.
|
|
757
|
+
*
|
|
758
|
+
* Between them sits the third case, which is neither: the API is being replaced. A deployment
|
|
759
|
+
* answers with a 5xx that has no `ApiResult` envelope, or does not answer at all, for the few
|
|
760
|
+
* seconds the process takes to come back. That is not worth a dialog and not worth a redirect
|
|
761
|
+
* either, so the request is simply sent again — twice, five seconds apart — and only if the third
|
|
762
|
+
* attempt fails too does it become `ClipperMessages.ERROR_UNAVAILABLE`.
|
|
763
|
+
*
|
|
764
|
+
* `ClipperServiceFlags.NotifySystemErrors` still governs one narrow case, and only that one: a 5xx
|
|
765
|
+
* that DOES carry an envelope, i.e. a server error the API itself described. Without the flag it is
|
|
766
|
+
* swallowed, as it always was in this library.
|
|
694
767
|
*
|
|
695
768
|
* Register it with `withInterceptors`:
|
|
696
769
|
* @example
|
|
@@ -806,11 +879,16 @@ declare class ClipperDocumentsService {
|
|
|
806
879
|
index(id: string): rxjs.Observable<ApiResult<ClipperDocumentStructure>>;
|
|
807
880
|
/**
|
|
808
881
|
* Gets the last-update metadata for a document.
|
|
882
|
+
*
|
|
883
|
+
* The response carries two things, not one: the last-update string and the shared notes attached
|
|
884
|
+
* to the document. The second was long left undeclared here, so a consumer of this library could
|
|
885
|
+
* not see data the API had already sent it.
|
|
809
886
|
* @param id - The ID of the document.
|
|
810
|
-
* @returns An observable emitting the API result wrapping the last update string.
|
|
887
|
+
* @returns An observable emitting the API result wrapping the last update string and its notes.
|
|
811
888
|
*/
|
|
812
889
|
metadata(id: string): rxjs.Observable<ApiResult<{
|
|
813
890
|
item1?: string;
|
|
891
|
+
item2?: ClipperDocumentNote[];
|
|
814
892
|
}>>;
|
|
815
893
|
/**
|
|
816
894
|
* Queries document references, changes or jurisprudence depending on the requested mode.
|
|
@@ -907,74 +985,116 @@ declare class ClipperDocumentsService {
|
|
|
907
985
|
}
|
|
908
986
|
|
|
909
987
|
/**
|
|
910
|
-
* Authentication:
|
|
911
|
-
*
|
|
988
|
+
* Authentication: password login, e-mailed code confirmation, logout and session restore.
|
|
989
|
+
* The login context, the channels and the logged-in flag live in `ClipperCoreService`.
|
|
990
|
+
*
|
|
991
|
+
* Aligned with the Clipper 7.5 API on 2026-08-25. Everything here now goes through `/session/*`
|
|
992
|
+
* and an HttpOnly cookie: there is no bearer token, no `remember` credential the API can replay,
|
|
993
|
+
* and no OAuth token acquired by the caller — the external-provider flow is a full-page redirect
|
|
994
|
+
* handled server-side, and all that reaches this service is the `/session/me` call on the way back.
|
|
995
|
+
*
|
|
996
|
+
* This is a deliberately reduced subset of what the Clipper application itself does. Passkeys and
|
|
997
|
+
* the passwordless recovery code (`/session/otp`) are not here: a library whose job is showing
|
|
998
|
+
* documents signs in with a password, and an application that offers the other ways in owns them.
|
|
912
999
|
*/
|
|
913
1000
|
declare class ClipperLoginService {
|
|
914
1001
|
private readonly httpClient;
|
|
915
1002
|
private readonly broadcastService;
|
|
916
1003
|
private readonly splashService;
|
|
917
1004
|
private readonly core;
|
|
918
|
-
/**
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
*
|
|
925
|
-
*
|
|
1005
|
+
/** Whether {@link initialize} has already run. */
|
|
1006
|
+
private initialized;
|
|
1007
|
+
/**
|
|
1008
|
+
* Validates a context that survived a page refresh before trusting it.
|
|
1009
|
+
*
|
|
1010
|
+
* Called by `ClipperService.initialize`, right after `ClipperCoreService.initialize`, so a
|
|
1011
|
+
* consumer gets the restore for free and never has to know this method exists. The auth cookie is
|
|
1012
|
+
* HttpOnly and may have expired while the stored context lived on, so a stored context only ever
|
|
1013
|
+
* means "there WAS a session" — this is what turns it into "there is one".
|
|
1014
|
+
*
|
|
1015
|
+
* A host application that drives its own return from an external provider, or that starts on its
|
|
1016
|
+
* own sign-in page, should call `core.setLoggedIn(false)` before bootstrapping rather than let
|
|
1017
|
+
* this race its own restore.
|
|
1018
|
+
* @returns void
|
|
1019
|
+
*/
|
|
1020
|
+
initialize(): void;
|
|
1021
|
+
/**
|
|
1022
|
+
* Asks `/session/me` whether the restored session is still alive. On success the login is
|
|
1023
|
+
* finalised from the current claims; on a dead session the interceptor's 401 handling takes over.
|
|
1024
|
+
*
|
|
1025
|
+
* Nothing is cleared on failure, and that is deliberate: a failure here is not proof of a dead
|
|
1026
|
+
* session — the API may be unreachable, the proxy may have answered 502, the device may be
|
|
1027
|
+
* offline. Clearing on any of those would sign the user out with a perfectly valid cookie.
|
|
1028
|
+
* @returns void
|
|
1029
|
+
*/
|
|
1030
|
+
private restoreSession;
|
|
1031
|
+
/**
|
|
1032
|
+
* Authenticates the user with email and password.
|
|
1033
|
+
*
|
|
1034
|
+
* Nothing is replayed from a stored credential any more: the former "remember me" token, which
|
|
1035
|
+
* let the API sign a caller in from something kept for sixty days, is gone. A login always starts
|
|
1036
|
+
* from what the user just typed.
|
|
1037
|
+
* @param email - The user's email address.
|
|
1038
|
+
* @param password - The user's password.
|
|
1039
|
+
* @returns An observable emitting the API result wrapping the login result.
|
|
926
1040
|
*/
|
|
927
|
-
|
|
1041
|
+
login(email?: string, password?: string): Observable<ApiResult<ClipperLoginResult>>;
|
|
928
1042
|
/**
|
|
929
|
-
*
|
|
930
|
-
*
|
|
931
|
-
*
|
|
932
|
-
*
|
|
933
|
-
*
|
|
934
|
-
*
|
|
935
|
-
*
|
|
1043
|
+
* Confirms a pending e-mailed code challenge, which establishes the session.
|
|
1044
|
+
*
|
|
1045
|
+
* The address travels with the code because the API stores each code under the account it was
|
|
1046
|
+
* issued to: a code alone is not redeemable, which is what stops a guessed code from opening
|
|
1047
|
+
* whatever session happens to be pending. It also keeps the code out of the URL, where it used to
|
|
1048
|
+
* sit — `/login/confirm/{code}` put it in the path, and therefore in the server logs and in the
|
|
1049
|
+
* browser history.
|
|
1050
|
+
* @param code - The one-time confirmation code provided to the user.
|
|
1051
|
+
* @param email - The address the code was sent to.
|
|
936
1052
|
* @returns An observable emitting the API result wrapping the login result.
|
|
937
1053
|
*/
|
|
938
|
-
|
|
1054
|
+
confirm(code: string, email?: string): Observable<ApiResult<ClipperLoginResult>>;
|
|
939
1055
|
/**
|
|
940
|
-
*
|
|
941
|
-
*
|
|
942
|
-
* @param result - The login result returned by the API.
|
|
1056
|
+
* Logs the user out on the server and clears the local state.
|
|
1057
|
+
* @returns An observable that emits once the logout has been processed.
|
|
943
1058
|
*/
|
|
944
|
-
|
|
1059
|
+
logout(): Observable<ApiResult<unknown>>;
|
|
945
1060
|
/**
|
|
946
|
-
*
|
|
947
|
-
*
|
|
948
|
-
*
|
|
1061
|
+
* Reads the current session from the server, which resolves it from the auth cookie claims
|
|
1062
|
+
* without touching the database. Used to restore the state after a page refresh instead of
|
|
1063
|
+
* trusting what local storage holds, and to close an external-provider round-trip.
|
|
1064
|
+
* @returns An observable emitting the current session.
|
|
949
1065
|
*/
|
|
950
|
-
|
|
1066
|
+
me(): Observable<ApiResult<ClipperLoginResult>>;
|
|
951
1067
|
/**
|
|
952
|
-
*
|
|
953
|
-
*
|
|
954
|
-
*
|
|
1068
|
+
* Finalises the login flow after an authentication, a code confirmation or a session restore:
|
|
1069
|
+
* writes the context into the shared state, raises the logged-in signal, rebuilds the channel
|
|
1070
|
+
* list and announces `LOGIN_COMPLETED`.
|
|
1071
|
+
*
|
|
1072
|
+
* `loggingIn` is deliberately left alone. Whoever raised it lowers it — {@link restoreSession}
|
|
1073
|
+
* for a refresh, the host application for an external-login round-trip — because lowering it
|
|
1074
|
+
* here would drop the splash the instant the response arrived, before anything was on screen.
|
|
1075
|
+
* @param result - The login result returned by the API.
|
|
1076
|
+
* @param notify - Whether to broadcast `LOGIN_COMPLETED`. Defaults to `true`.
|
|
1077
|
+
* @returns void
|
|
955
1078
|
*/
|
|
956
|
-
|
|
1079
|
+
private completeLogin;
|
|
957
1080
|
/**
|
|
958
|
-
* Requests a new one-time password
|
|
959
|
-
* @param id - The repository ID
|
|
1081
|
+
* Requests a new one-time password used to authorise a binary download.
|
|
1082
|
+
* @param id - The repository ID of the binary the OTP is generated for.
|
|
960
1083
|
* @returns An observable emitting the API result wrapping the generated OTP info.
|
|
961
1084
|
*/
|
|
962
|
-
newOTP(id: string):
|
|
1085
|
+
newOTP(id: string): Observable<ApiResult<ClipperOTPInfo>>;
|
|
963
1086
|
/**
|
|
964
1087
|
* Persists the current login context to `localStorage`.
|
|
965
1088
|
* Delegates to `ClipperCoreService.storeContext()`.
|
|
1089
|
+
* @returns void
|
|
966
1090
|
*/
|
|
967
1091
|
storeContext(): void;
|
|
968
1092
|
/**
|
|
969
|
-
*
|
|
970
|
-
*
|
|
971
|
-
* @param result - The login result containing the new user context and channel settings.
|
|
972
|
-
*/
|
|
973
|
-
updateContext(result: ClipperLoginResult): void;
|
|
974
|
-
/**
|
|
975
|
-
* Clears all session-storage authentication keys and resets the login state.
|
|
1093
|
+
* Clears every trace of the current session on this device: the stored context, the logged-in
|
|
1094
|
+
* signal and the session-storage keys. Does NOT call the server — use {@link logout} for that.
|
|
976
1095
|
* Delegates to `ClipperCoreService.clear()`.
|
|
977
|
-
* @param clearOAuthToken -
|
|
1096
|
+
* @param clearOAuthToken - Whether to drop the legacy OAuth token too. Defaults to `true`.
|
|
1097
|
+
* @returns void
|
|
978
1098
|
*/
|
|
979
1099
|
clear(clearOAuthToken?: boolean): void;
|
|
980
1100
|
static ɵfac: i0.ɵɵFactoryDeclaration<ClipperLoginService, never>;
|
|
@@ -991,7 +1111,7 @@ declare class ClipperLoginService {
|
|
|
991
1111
|
*/
|
|
992
1112
|
declare class ClipperService {
|
|
993
1113
|
private readonly core;
|
|
994
|
-
/** Authentication: login/logout,
|
|
1114
|
+
/** Authentication: login/logout, e-mailed code confirmation, session restore, OTP. */
|
|
995
1115
|
readonly session: ClipperLoginService;
|
|
996
1116
|
/** Document search, references, export, working-documents bag and saved searches. */
|
|
997
1117
|
readonly documents: ClipperDocumentsService;
|
|
@@ -1030,10 +1150,12 @@ declare class ClipperService {
|
|
|
1030
1150
|
/** @returns A signal indicating whether tagging is allowed. */
|
|
1031
1151
|
get allowTags(): WritableSignal<boolean>;
|
|
1032
1152
|
/**
|
|
1033
|
-
* Initialises the application with the API base URI, optional app URI, and feature flags
|
|
1153
|
+
* Initialises the application with the API base URI, optional app URI, and feature flags, then
|
|
1154
|
+
* validates any session that survived a page refresh.
|
|
1034
1155
|
* @param serviceUri - The base URI of the Clipper REST API.
|
|
1035
1156
|
* @param appUri - Optional URI of the Clipper web application (used to build document links).
|
|
1036
1157
|
* @param flags - Feature flags that control service behaviour. Defaults to `ClipperServiceFlags.None`.
|
|
1158
|
+
* @returns void
|
|
1037
1159
|
*/
|
|
1038
1160
|
initialize(serviceUri: string, appUri?: string, flags?: ClipperServiceFlags): void;
|
|
1039
1161
|
/**
|
|
@@ -1077,6 +1199,16 @@ declare class ClipperCoreService {
|
|
|
1077
1199
|
* @returns The current login context, or `undefined` if not authenticated.
|
|
1078
1200
|
*/
|
|
1079
1201
|
get loginInfo(): ClipperLoginInfo | undefined;
|
|
1202
|
+
/**
|
|
1203
|
+
* Seeded from the stored context, which is the only trace a session leaves on this device: the
|
|
1204
|
+
* auth cookie is HttpOnly and unreadable from here. It means "there WAS a session", never "there
|
|
1205
|
+
* is one" -- `ClipperLoginService.initialize` validates it against `/session/me` before it is
|
|
1206
|
+
* trusted, and a failure there ends as a 401 that clears the session.
|
|
1207
|
+
*
|
|
1208
|
+
* It used to be seeded from a `clipper_oauth_token` session-storage key, which nothing has
|
|
1209
|
+
* written since the provider flow moved server-side: the flag was therefore false at every
|
|
1210
|
+
* bootstrap and the whole restore path could never run.
|
|
1211
|
+
*/
|
|
1080
1212
|
private readonly _loggedIn;
|
|
1081
1213
|
readonly loggedIn: Signal<boolean>;
|
|
1082
1214
|
readonly loggingIn: i0.WritableSignal<boolean>;
|
|
@@ -1094,6 +1226,10 @@ declare class ClipperCoreService {
|
|
|
1094
1226
|
* Ensures a login-info object exists and returns it for further mutation.
|
|
1095
1227
|
* Replaces the inline `if (!this._loginInfo) { ... }` guards now that the field
|
|
1096
1228
|
* is private to this service.
|
|
1229
|
+
*
|
|
1230
|
+
* Reads through the getter, never the field: the context is loaded from storage lazily, so a
|
|
1231
|
+
* caller that mutates before anyone has read would find the field empty and start from a blank
|
|
1232
|
+
* object, silently dropping a perfectly good stored context.
|
|
1097
1233
|
* @returns The existing login-info object, or a freshly created empty one.
|
|
1098
1234
|
*/
|
|
1099
1235
|
ensureLoginInfo(): ClipperLoginInfo;
|
|
@@ -1104,11 +1240,21 @@ declare class ClipperCoreService {
|
|
|
1104
1240
|
*/
|
|
1105
1241
|
setLoggedIn(value: boolean): void;
|
|
1106
1242
|
/**
|
|
1107
|
-
* Persists the current login context to `localStorage
|
|
1243
|
+
* Persists the current login context to `localStorage`, but only when there is a context to
|
|
1244
|
+
* persist. A login-info object with no `context` is not a session: it is the empty shell
|
|
1245
|
+
* `ensureLoginInfo` hands out before anything has been written into it, and storing it would leave
|
|
1246
|
+
* behind a key whose mere presence makes the next bootstrap declare the user logged in.
|
|
1108
1247
|
*/
|
|
1109
1248
|
storeContext(): void;
|
|
1110
1249
|
/**
|
|
1111
1250
|
* Updates the stored login context with the values from a fresh login result.
|
|
1251
|
+
*
|
|
1252
|
+
* Each half is written only when the server actually sent it. An absent `context` or `settings`
|
|
1253
|
+
* means "not carried by this response", never "the user has none": overwriting on absence is what
|
|
1254
|
+
* made a page refresh empty the channel list, because `/session/me` answers without the settings
|
|
1255
|
+
* and this method wrote that emptiness -- through `storeContext`, onto the disk, where it survived
|
|
1256
|
+
* the reload it was born in. An EMPTY array is a different matter and is stored as it comes: that
|
|
1257
|
+
* is the server saying the subscription really is gone.
|
|
1112
1258
|
* @param result - The login result containing the new user context and channel settings.
|
|
1113
1259
|
*/
|
|
1114
1260
|
updateContext(result: ClipperLoginResult): void;
|
|
@@ -1141,4 +1287,4 @@ declare class ClipperCoreService {
|
|
|
1141
1287
|
}
|
|
1142
1288
|
|
|
1143
1289
|
export { ClipperAccountService, ClipperAuthors, ClipperCalendarSearchParams, ClipperCalendarState, ClipperCalendarStates, ClipperChannel, ClipperChannelSettings, ClipperChannels, ClipperCoreService, ClipperDashboard, ClipperDocumentChangeReasons, ClipperDocumentContainer, ClipperDocumentsService, ClipperExportDocumentsFormat, ClipperFacet, ClipperLoginService, ClipperMessages, ClipperModel, ClipperModels, ClipperModule, ClipperModuleGroup, ClipperModuleGroups, ClipperModules, ClipperQueryDocumentFlags, ClipperQueryReferencesMode, ClipperRegions, ClipperSearchCalendarSnapshotResult, ClipperSearchFacetsSnapshot, ClipperSearchParams, ClipperSearchResult, ClipperSearchUtils, ClipperSectorTypes, ClipperSectors, ClipperSelectionMode, ClipperService, ClipperServiceFlags, ClipperSort, ClipperSources, ClipperUtils, clipperAuthInterceptor };
|
|
1144
|
-
export type { ClipperAvailableChannel, ClipperChannelSettingsItem, ClipperDashboardItem, ClipperDashboardModelItem, ClipperDeleteWorkingDocumentsParams, ClipperDocumentAnchorInfo, ClipperDocumentInfo, ClipperDocumentRelevantChunkHit, ClipperDocumentRelevants, ClipperDocumentStructure, ClipperDocumentUpdateStateParams, ClipperExportDocumentsParams, ClipperLoginInfo, ClipperLoginResult, ClipperOTPInfo, ClipperReferencesSearchParams, ClipperSearchCalendarSnapshotMonth, ClipperSearchFacet, ClipperSearchFacetGroup, ClipperSearchFacetsResult, ClipperSearchFilter, ClipperSendDocumentsByEmailParams, ClipperTaxonomyParams, ClipperTopicInfo, ClipperUserChannelInfo, ClipperUserInfo, ClipperUserSearch, ClipperUserTrialInfo, ClipperUserWorkingDocument, EditedEventArgs, SectorInfo };
|
|
1290
|
+
export type { ClipperAvailableChannel, ClipperChannelSettingsItem, ClipperDashboardItem, ClipperDashboardModelItem, ClipperDeleteWorkingDocumentsParams, ClipperDocumentAnchorInfo, ClipperDocumentInfo, ClipperDocumentNote, ClipperDocumentNoteTracking, ClipperDocumentRelevantChunkHit, ClipperDocumentRelevants, ClipperDocumentStructure, ClipperDocumentUpdateStateParams, ClipperExportDocumentsParams, ClipperLoginInfo, ClipperLoginResult, ClipperOTPInfo, ClipperReferencesSearchParams, ClipperSearchCalendarSnapshotMonth, ClipperSearchFacet, ClipperSearchFacetGroup, ClipperSearchFacetsResult, ClipperSearchFilter, ClipperSendDocumentsByEmailParams, ClipperTaxonomyParams, ClipperTopicInfo, ClipperUserChannelInfo, ClipperUserInfo, ClipperUserSearch, ClipperUserTrialInfo, ClipperUserWorkingDocument, EditedEventArgs, SectorInfo };
|
|
@@ -267,7 +267,7 @@ declare class ClipperSearchCalendarComponent {
|
|
|
267
267
|
* asynchronous continuation after the dynamic `import()` is outside the injection context, so an
|
|
268
268
|
* `inject()` added in there would have failed at runtime.
|
|
269
269
|
*/
|
|
270
|
-
declare class
|
|
270
|
+
declare class ClipperDocumentViewerService {
|
|
271
271
|
private readonly dialogService;
|
|
272
272
|
private readonly clipperService;
|
|
273
273
|
/**
|
|
@@ -284,8 +284,8 @@ declare class ClipperDocumentUtilsService {
|
|
|
284
284
|
* @returns void
|
|
285
285
|
*/
|
|
286
286
|
openDocument(documentId: string, query?: string, queryChunks?: string, selectionMode?: ClipperSelectionMode, selectableModules?: ClipperModule[], theme?: ThemeType, canHandleTooManyResults?: boolean, replaceUrl?: string): void;
|
|
287
|
-
static ɵfac: _angular_core.ɵɵFactoryDeclaration<
|
|
288
|
-
static ɵprov: _angular_core.ɵɵInjectableDeclaration<
|
|
287
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<ClipperDocumentViewerService, never>;
|
|
288
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<ClipperDocumentViewerService>;
|
|
289
289
|
}
|
|
290
290
|
/**
|
|
291
291
|
* Pure helpers on document data. Deliberately NOT a service: there is nothing to inject, and a
|
|
@@ -307,7 +307,7 @@ declare class ClipperSearchResultManager extends ClipperDocumentManager {
|
|
|
307
307
|
protected readonly destroyRef: DestroyRef;
|
|
308
308
|
protected readonly changeDetector: ChangeDetectorRef;
|
|
309
309
|
protected readonly breakpointObserver: BreakpointObserver;
|
|
310
|
-
protected readonly documentUtils:
|
|
310
|
+
protected readonly documentUtils: ClipperDocumentViewerService;
|
|
311
311
|
protected readonly themeService: ThemeService;
|
|
312
312
|
readonly screenService: ScreenService;
|
|
313
313
|
selection: SelectableModel<ClipperDocumentInfo, string> | undefined;
|
|
@@ -945,7 +945,7 @@ declare class ClipperDocumentComponent extends ClipperDocumentManager {
|
|
|
945
945
|
*/
|
|
946
946
|
open(documentId: string, query?: string, queryChunks?: string, newWindow?: boolean): void;
|
|
947
947
|
/**
|
|
948
|
-
* Opens a document inline via the {@link
|
|
948
|
+
* Opens a document inline via the {@link ClipperDocumentViewerService}.
|
|
949
949
|
* @param documentId - The id of the document to open.
|
|
950
950
|
* @param query - Optional free-text query for highlight.
|
|
951
951
|
* @param queryChunks - Optional chunk offsets for semantic highlight.
|
|
@@ -1297,5 +1297,5 @@ declare class ClipperSearchResultItemComponent {
|
|
|
1297
1297
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<ClipperSearchResultItemComponent, "clipper-search-result-item", never, { "parent": { "alias": "parent"; "required": true; "isSignal": true; }; "item": { "alias": "item"; "required": true; "isSignal": true; }; "actions": { "alias": "actions"; "required": true; "isSignal": true; }; "tileNoPictureUrl": { "alias": "tileNoPictureUrl"; "required": false; "isSignal": true; }; "tilePictureUrl": { "alias": "tilePictureUrl"; "required": false; "isSignal": true; }; "isSelectable": { "alias": "isSelectable"; "required": false; "isSignal": true; }; "isReadable": { "alias": "isReadable"; "required": false; "isSignal": true; }; "isReadableModel": { "alias": "isReadableModel"; "required": false; "isSignal": true; }; "displayModifiedTitle": { "alias": "displayModifiedTitle"; "required": false; "isSignal": true; }; "displayModelName": { "alias": "displayModelName"; "required": false; "isSignal": true; }; "displayDate": { "alias": "displayDate"; "required": false; "isSignal": true; }; "displayMode": { "alias": "displayMode"; "required": false; "isSignal": true; }; }, { "item": "itemChange"; }, never, never, true, never>;
|
|
1298
1298
|
}
|
|
1299
1299
|
|
|
1300
|
-
export { ClipperBrowserComponent, ClipperBrowserDialogComponent, ClipperDocumentComponent, ClipperDocumentIndexComponent, ClipperDocumentManager, ClipperDocumentMenuComponent,
|
|
1300
|
+
export { ClipperBrowserComponent, ClipperBrowserDialogComponent, ClipperDocumentComponent, ClipperDocumentIndexComponent, ClipperDocumentManager, ClipperDocumentMenuComponent, ClipperDocumentViewerService, ClipperDocumentsUtils, ClipperReferencesComponent, ClipperSearchCalendarComponent, ClipperSearchFacetsComponent, ClipperSearchFreeTextHelpComponent, ClipperSearchFreeTextQueryBuilderComponent, ClipperSearchResultItemComponent, ClipperSearchResultItemDisplayMode, ClipperSearchResultManager };
|
|
1301
1301
|
export type { ClipperBrowserDialogData, ClipperDocumentDialogData, ClipperDocumentIndexDialogData, ClipperDocumentIndexDialogResult, ClipperReferenceDialogResult, ClipperReferencesDialogData, SearchFreeTextQueryParams };
|