@theseam/ui-common 2.0.0 → 2.0.1-beta.95
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/ai/index.d.ts +363 -1
- package/carousel/index.d.ts +21 -1
- package/data-filters/index.d.ts +26 -7
- package/datatable/index.d.ts +299 -3
- package/datatable-alterations-display/index.d.ts +61 -1
- package/fesm2022/theseam-ui-common-ai.mjs +1368 -1
- package/fesm2022/theseam-ui-common-ai.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-carousel.mjs +48 -1
- package/fesm2022/theseam-ui-common-carousel.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-data-filters.mjs +90 -16
- package/fesm2022/theseam-ui-common-data-filters.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-datatable-alterations-display.mjs +197 -1
- package/fesm2022/theseam-ui-common-datatable-alterations-display.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-datatable.mjs +668 -4
- package/fesm2022/theseam-ui-common-datatable.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-file-input.mjs +156 -1
- package/fesm2022/theseam-ui-common-file-input.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-icon.mjs +72 -1
- package/fesm2022/theseam-ui-common-icon.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-table-cell-types.mjs +4 -0
- package/fesm2022/theseam-ui-common-table-cell-types.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-tooltip.mjs +110 -1
- package/fesm2022/theseam-ui-common-tooltip.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-widget.mjs +23 -1
- package/fesm2022/theseam-ui-common-widget.mjs.map +1 -1
- package/file-input/index.d.ts +78 -1
- package/icon/index.d.ts +33 -3
- package/package.json +3 -3
- package/tooltip/index.d.ts +40 -2
- package/widget/index.d.ts +17 -2
package/ai/index.d.ts
CHANGED
|
@@ -1,2 +1,364 @@
|
|
|
1
|
+
import { Observable, BehaviorSubject } from 'rxjs';
|
|
2
|
+
import * as i0 from '@angular/core';
|
|
3
|
+
import { AfterViewInit, OnDestroy, InjectionToken, Type } from '@angular/core';
|
|
4
|
+
import { TheSeamDatatableColumn, DatatableComponent, ColumnsAlterationState } from '@theseam/ui-common/datatable';
|
|
5
|
+
import { DatatableGraphQLQueryRef } from '@theseam/ui-common/graphql';
|
|
6
|
+
import * as _angular_cdk_testing from '@angular/cdk/testing';
|
|
7
|
+
import { ComponentHarness } from '@angular/cdk/testing';
|
|
8
|
+
import { FormGroup, FormControl } from '@angular/forms';
|
|
9
|
+
import { AlterationDisplayItem } from '@theseam/ui-common/datatable-alterations-display';
|
|
1
10
|
|
|
2
|
-
|
|
11
|
+
/**
|
|
12
|
+
* Implemented by components that contribute "what the user is currently looking at"
|
|
13
|
+
* to the AI chat assistant. Instances are registered with `TheSeamChatContextRegistry`
|
|
14
|
+
* (see chat-context-registry.service.ts) and read at chat-send time.
|
|
15
|
+
*
|
|
16
|
+
* `getContext()` returning null/undefined means "I have nothing useful to contribute
|
|
17
|
+
* right now"; the registry drops that entry from the snapshot.
|
|
18
|
+
*/
|
|
19
|
+
interface TheSeamChatContext {
|
|
20
|
+
/** Discriminator — used by the backend formatter table. e.g. 'datatable', 'modal'. */
|
|
21
|
+
readonly type: string;
|
|
22
|
+
/** When true, this context is included even while a 'modal'-typed context is registered. Default false. */
|
|
23
|
+
readonly alwaysVisible?: boolean;
|
|
24
|
+
getContext(): unknown | Promise<unknown>;
|
|
25
|
+
}
|
|
26
|
+
/** Wire-shape of one context entry sent to the backend. */
|
|
27
|
+
interface TheSeamChatContextPayload {
|
|
28
|
+
type: string;
|
|
29
|
+
data: unknown;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* A single conversation turn. Sent to the LLM via `chat()` and produced by
|
|
34
|
+
* `chat()` as the assistant response. Persisted history (with uid + created)
|
|
35
|
+
* is exposed separately via `ChatSessionMessage`.
|
|
36
|
+
*/
|
|
37
|
+
interface ChatMessage {
|
|
38
|
+
/** 'user' | 'assistant' in practice; widened to string for forward-compat. */
|
|
39
|
+
role: string;
|
|
40
|
+
content: string;
|
|
41
|
+
}
|
|
42
|
+
interface ChatSessionMessage {
|
|
43
|
+
uid: string;
|
|
44
|
+
role: string;
|
|
45
|
+
content: string;
|
|
46
|
+
/** ISO-8601 datetime of when the message was persisted. */
|
|
47
|
+
created: string;
|
|
48
|
+
}
|
|
49
|
+
interface ChatSession {
|
|
50
|
+
uid: string;
|
|
51
|
+
label: string;
|
|
52
|
+
created: string;
|
|
53
|
+
lastActivity: string;
|
|
54
|
+
leafMessageId: string | null;
|
|
55
|
+
messages: ChatSessionMessage[];
|
|
56
|
+
}
|
|
57
|
+
interface ChatSessionListItem {
|
|
58
|
+
uid: string;
|
|
59
|
+
label: string;
|
|
60
|
+
created: string;
|
|
61
|
+
lastActivity: string;
|
|
62
|
+
}
|
|
63
|
+
interface TheSeamAiChatRequest {
|
|
64
|
+
messages: ChatMessage[];
|
|
65
|
+
contexts?: TheSeamChatContextPayload[];
|
|
66
|
+
/** When null, the backend creates a new session and returns its uid. */
|
|
67
|
+
sessionId?: string | null;
|
|
68
|
+
/**
|
|
69
|
+
* Required when `sessionId` is set. The uid of the message the client
|
|
70
|
+
* believes is the current leaf. Backend returns 409 if it doesn't match.
|
|
71
|
+
*/
|
|
72
|
+
expectedLeafMessageId?: string | null;
|
|
73
|
+
}
|
|
74
|
+
interface ChatResponse {
|
|
75
|
+
content: string;
|
|
76
|
+
sessionId: string;
|
|
77
|
+
label: string;
|
|
78
|
+
leafMessageId: string;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Errored by `TheSeamAiProvider.chat()` when the server reports the
|
|
82
|
+
* session's leaf has advanced since the client last observed it (HTTP 409).
|
|
83
|
+
* The chat component catches this, reloads the session, and emits
|
|
84
|
+
* `(staleSession)`.
|
|
85
|
+
*/
|
|
86
|
+
declare class ChatSessionStaleError extends Error {
|
|
87
|
+
readonly sessionId: string;
|
|
88
|
+
readonly currentLeafMessageId: string | null;
|
|
89
|
+
constructor(sessionId: string, currentLeafMessageId: string | null);
|
|
90
|
+
}
|
|
91
|
+
interface TheSeamAiProvider {
|
|
92
|
+
/**
|
|
93
|
+
* Send a chat turn. Errors with `ChatSessionStaleError` when the session's
|
|
94
|
+
* leaf has advanced since the last observed state.
|
|
95
|
+
*
|
|
96
|
+
* Implementations should emit exactly once and complete.
|
|
97
|
+
*/
|
|
98
|
+
chat(request: TheSeamAiChatRequest): Observable<ChatResponse>;
|
|
99
|
+
/**
|
|
100
|
+
* Hook the chat component calls on mount to ask the provider what session
|
|
101
|
+
* to load. Default app implementation prefers a query-param session uid
|
|
102
|
+
* and falls back to the user's most recent session, but apps can override.
|
|
103
|
+
*/
|
|
104
|
+
getInitialSession(): Observable<ChatSession | null>;
|
|
105
|
+
/** Returns the user's most-recently-active session, or null if none exists. */
|
|
106
|
+
getRecentSession(): Observable<ChatSession | null>;
|
|
107
|
+
/** Loads a specific session with its active-path messages. */
|
|
108
|
+
getSession(uid: string): Observable<ChatSession>;
|
|
109
|
+
/** Returns session metadata for the user (no messages). */
|
|
110
|
+
listSessions(): Observable<ChatSessionListItem[]>;
|
|
111
|
+
/** Updates a session's user-visible label. */
|
|
112
|
+
renameSession(uid: string, label: string): Observable<void>;
|
|
113
|
+
/** Soft-deletes the session. */
|
|
114
|
+
deleteSession(uid: string): Observable<void>;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
declare class LmStudioAiProvider implements TheSeamAiProvider {
|
|
118
|
+
chat(request: TheSeamAiChatRequest): Observable<ChatResponse>;
|
|
119
|
+
getInitialSession(): Observable<ChatSession | null>;
|
|
120
|
+
getRecentSession(): Observable<ChatSession | null>;
|
|
121
|
+
getSession(_uid: string): Observable<ChatSession>;
|
|
122
|
+
listSessions(): Observable<ChatSessionListItem[]>;
|
|
123
|
+
renameSession(_uid: string, _label: string): Observable<void>;
|
|
124
|
+
deleteSession(_uid: string): Observable<void>;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
declare class OpenRouterAiProvider implements TheSeamAiProvider {
|
|
128
|
+
chat(request: TheSeamAiChatRequest): Observable<ChatResponse>;
|
|
129
|
+
getInitialSession(): Observable<ChatSession | null>;
|
|
130
|
+
getRecentSession(): Observable<ChatSession | null>;
|
|
131
|
+
getSession(_uid: string): Observable<ChatSession>;
|
|
132
|
+
listSessions(): Observable<ChatSessionListItem[]>;
|
|
133
|
+
renameSession(_uid: string, _label: string): Observable<void>;
|
|
134
|
+
deleteSession(_uid: string): Observable<void>;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
type MockResponse = string | ((messages: ChatMessage[]) => string);
|
|
138
|
+
interface MockAiProviderConfig {
|
|
139
|
+
response?: MockResponse;
|
|
140
|
+
initialSession?: ChatSession | null;
|
|
141
|
+
sessionsByUid?: ReadonlyMap<string, ChatSession>;
|
|
142
|
+
sessionsList?: ChatSessionListItem[];
|
|
143
|
+
/** First chat() call errors with this; subsequent calls succeed normally. */
|
|
144
|
+
throwOnFirstChat?: Error;
|
|
145
|
+
/** Artificial delay (ms) applied uniformly. Overridable per method. */
|
|
146
|
+
delayMs?: number;
|
|
147
|
+
delayMsByMethod?: Partial<Record<keyof TheSeamAiProvider, number>>;
|
|
148
|
+
}
|
|
149
|
+
type LegacyArg = MockAiProviderConfig | MockResponse | undefined;
|
|
150
|
+
declare class MockAiProvider implements TheSeamAiProvider {
|
|
151
|
+
private readonly _config;
|
|
152
|
+
private _throwOnNextChat?;
|
|
153
|
+
constructor(configOrLegacy?: LegacyArg);
|
|
154
|
+
chat(request: TheSeamAiChatRequest): Observable<ChatResponse>;
|
|
155
|
+
getInitialSession(): Observable<ChatSession | null>;
|
|
156
|
+
getRecentSession(): Observable<ChatSession | null>;
|
|
157
|
+
getSession(uid: string): Observable<ChatSession>;
|
|
158
|
+
listSessions(): Observable<ChatSessionListItem[]>;
|
|
159
|
+
renameSession(_uid: string, _label: string): Observable<void>;
|
|
160
|
+
deleteSession(_uid: string): Observable<void>;
|
|
161
|
+
private _withDelay;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
declare class TheSeamChatContextRegistry {
|
|
165
|
+
private readonly _contexts;
|
|
166
|
+
/**
|
|
167
|
+
* Register a context. Returns an unregister function — pair it with DestroyRef:
|
|
168
|
+
* inject(DestroyRef).onDestroy(registry.register(ctx))
|
|
169
|
+
*/
|
|
170
|
+
register(ctx: TheSeamChatContext): () => void;
|
|
171
|
+
unregister(ctx: TheSeamChatContext): void;
|
|
172
|
+
/**
|
|
173
|
+
* Resolve registered contexts to a wire-ready payload list. Applies the modal-mask
|
|
174
|
+
* rule (a `modal`-typed context hides others unless they set `alwaysVisible`) and
|
|
175
|
+
* drops entries whose `getContext()` returns null/undefined.
|
|
176
|
+
*/
|
|
177
|
+
snapshot(): Promise<TheSeamChatContextPayload[]>;
|
|
178
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TheSeamChatContextRegistry, never>;
|
|
179
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<TheSeamChatContextRegistry>;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
interface TheSeamDatatableChatContextOptions {
|
|
183
|
+
/** Optional human label, e.g. 'Bales'. Helps the LLM disambiguate when multiple datatables are registered. */
|
|
184
|
+
label?: string;
|
|
185
|
+
}
|
|
186
|
+
interface TheSeamDatatableChatContextData {
|
|
187
|
+
label?: string;
|
|
188
|
+
operationName: string;
|
|
189
|
+
query: string;
|
|
190
|
+
variables: Record<string, unknown>;
|
|
191
|
+
columns: {
|
|
192
|
+
prop: string | number | undefined;
|
|
193
|
+
name: string | undefined;
|
|
194
|
+
}[];
|
|
195
|
+
}
|
|
196
|
+
declare class TheSeamDatatableChatContext implements TheSeamChatContext {
|
|
197
|
+
private readonly _queryRef;
|
|
198
|
+
private readonly _columns;
|
|
199
|
+
private readonly _options;
|
|
200
|
+
readonly type = "datatable";
|
|
201
|
+
constructor(_queryRef: DatatableGraphQLQueryRef<any, any, any>, _columns: readonly TheSeamDatatableColumn[], _options?: TheSeamDatatableChatContextOptions);
|
|
202
|
+
getContext(): TheSeamDatatableChatContextData | null;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
type ChatContentSegment = {
|
|
206
|
+
type: 'markdown';
|
|
207
|
+
content: string;
|
|
208
|
+
} | {
|
|
209
|
+
type: 'custom-block';
|
|
210
|
+
tag: string;
|
|
211
|
+
content: string;
|
|
212
|
+
};
|
|
213
|
+
/**
|
|
214
|
+
* Splits a raw AI response string into an ordered array of segments.
|
|
215
|
+
* Fenced code blocks with `seam-` prefixed language tags become custom-block
|
|
216
|
+
* segments; everything else stays as markdown.
|
|
217
|
+
*/
|
|
218
|
+
declare function parseChatResponse(input: string): ChatContentSegment[];
|
|
219
|
+
|
|
220
|
+
interface ChatMessageDisplayModel {
|
|
221
|
+
/** Present for messages loaded from a persisted session. */
|
|
222
|
+
uid?: string;
|
|
223
|
+
/** 'user' | 'assistant' rendered specially; other roles fall through to a neutral style. */
|
|
224
|
+
role: string;
|
|
225
|
+
segments: ChatContentSegment[];
|
|
226
|
+
timestamp: Date;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
declare class TheSeamChatComponent implements AfterViewInit, OnDestroy {
|
|
230
|
+
private readonly _provider;
|
|
231
|
+
private readonly _chatContextRegistry;
|
|
232
|
+
private readonly _cdr;
|
|
233
|
+
private readonly _ngZone;
|
|
234
|
+
private _messageList?;
|
|
235
|
+
private _messageListScrollbar?;
|
|
236
|
+
private _chatInput?;
|
|
237
|
+
/**
|
|
238
|
+
* The session this chat should display.
|
|
239
|
+
*
|
|
240
|
+
* - `null` on first init: the component asks the provider for an initial
|
|
241
|
+
* session via `getInitialSession()` (default app behavior: prefers
|
|
242
|
+
* `?chatSession=<uid>`, falls back to the user's most recent session).
|
|
243
|
+
* - `null` after init: resets to a new empty chat. Equivalent to calling
|
|
244
|
+
* `newSession()`.
|
|
245
|
+
* - A session uid: loads and displays that session.
|
|
246
|
+
*
|
|
247
|
+
* Pair with `(sessionIdChange)` for two-way binding.
|
|
248
|
+
*/
|
|
249
|
+
readonly sessionId: i0.InputSignal<string | null>;
|
|
250
|
+
readonly placeholder: i0.InputSignal<string>;
|
|
251
|
+
/**
|
|
252
|
+
* Emits whenever the chat's active session changes — after the initial
|
|
253
|
+
* load resolves, after a send creates a new session, after the input is
|
|
254
|
+
* reassigned, or after `newSession()` clears the chat.
|
|
255
|
+
*/
|
|
256
|
+
readonly sessionIdChange: i0.OutputEmitterRef<string | null>;
|
|
257
|
+
/**
|
|
258
|
+
* Emits after the chat has recovered from a server-reported stale-leaf
|
|
259
|
+
* 409. The component has already reloaded the session and restored the
|
|
260
|
+
* user's typed text; consuming apps typically respond by surfacing a toast.
|
|
261
|
+
*/
|
|
262
|
+
readonly staleSession: i0.OutputEmitterRef<void>;
|
|
263
|
+
private _messages;
|
|
264
|
+
_displayMessages: ChatMessageDisplayModel[];
|
|
265
|
+
private readonly _pinnedThreshold;
|
|
266
|
+
private _isPinnedToBottom;
|
|
267
|
+
private _forceScrollOnNextResize;
|
|
268
|
+
private readonly _loadingSubject;
|
|
269
|
+
readonly loading$: Observable<boolean>;
|
|
270
|
+
private _currentSessionId;
|
|
271
|
+
private _currentLeafMessageId;
|
|
272
|
+
private _initialized;
|
|
273
|
+
private readonly _sessionLoadRequest$;
|
|
274
|
+
private readonly _destroy$;
|
|
275
|
+
private readonly _initialLoadingSubject;
|
|
276
|
+
readonly initialLoading$: Observable<boolean>;
|
|
277
|
+
constructor();
|
|
278
|
+
ngAfterViewInit(): void;
|
|
279
|
+
ngOnDestroy(): void;
|
|
280
|
+
/**
|
|
281
|
+
* Resets the chat to a new empty session. Idempotent — safe to call when
|
|
282
|
+
* the chat has no session loaded. Emits `(sessionIdChange)` with `null`.
|
|
283
|
+
*/
|
|
284
|
+
newSession(): void;
|
|
285
|
+
_onMessageSent(text: string): Promise<void>;
|
|
286
|
+
private _updatePinnedState;
|
|
287
|
+
private _maybeScrollToBottom;
|
|
288
|
+
private _scrollToBottom;
|
|
289
|
+
private _initialize;
|
|
290
|
+
private _reactToSessionInputChange;
|
|
291
|
+
private _applySession;
|
|
292
|
+
private _handleStaleSession;
|
|
293
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TheSeamChatComponent, never>;
|
|
294
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<TheSeamChatComponent, "seam-chat", never, { "sessionId": { "alias": "sessionId"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; }, { "sessionIdChange": "sessionIdChange"; "staleSession": "staleSession"; }, never, never, true, never>;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
declare const THESEAM_CHAT_PROVIDER: InjectionToken<TheSeamAiProvider>;
|
|
298
|
+
|
|
299
|
+
type ChatBlockRegistry = Map<string, Type<unknown>>;
|
|
300
|
+
declare const THESEAM_CHAT_BLOCK_REGISTRY: InjectionToken<ChatBlockRegistry>;
|
|
301
|
+
|
|
302
|
+
declare class TheSeamChatMessageHarness extends ComponentHarness {
|
|
303
|
+
static hostSelector: string;
|
|
304
|
+
private readonly _role;
|
|
305
|
+
private readonly _content;
|
|
306
|
+
getRole(): Promise<string>;
|
|
307
|
+
getText(): Promise<string>;
|
|
308
|
+
}
|
|
309
|
+
declare class TheSeamChatInputHarness extends ComponentHarness {
|
|
310
|
+
static hostSelector: string;
|
|
311
|
+
getSendButton(): Promise<_angular_cdk_testing.TestElement>;
|
|
312
|
+
isSendDisabled(): Promise<boolean>;
|
|
313
|
+
}
|
|
314
|
+
declare class TheSeamChatHarness extends ComponentHarness {
|
|
315
|
+
static hostSelector: string;
|
|
316
|
+
private readonly _messages;
|
|
317
|
+
private readonly _input;
|
|
318
|
+
private readonly _loading;
|
|
319
|
+
private readonly _initialLoading;
|
|
320
|
+
getMessages(): Promise<TheSeamChatMessageHarness[]>;
|
|
321
|
+
getMessageCount(): Promise<number>;
|
|
322
|
+
getInput(): Promise<TheSeamChatInputHarness>;
|
|
323
|
+
isLoading(): Promise<boolean>;
|
|
324
|
+
isInitialLoading(): Promise<boolean>;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
declare const assistantPrompt = "You are a helpful assistant that provides formatting json code for a datatable.\nA datatable is a table that displays data in rows and columns, similar to a spreadsheet, with column sorting and data filtering.\n\nYour job is not to provide a descriptive analysis of the request or any additional information. The user will ignore anything that is not a JSON object.\n\nThe user will provide a request, and you will respond with a JSON object that contains an array of table alterations.\nThe following is the typescript interface for a datatable column and the alterations you can make to it:\n\n```typescript\ninterface TableColumn {\n /** Column property */\n prop: string,\n /** Column name */\n name: string,\n /** Column cell type - determines filter type */\n cellType?: 'string' | 'integer' | 'decimal' | 'currency' | 'date' | 'phone',\n /** Whether the column is sortable */\n sortable?: boolean,\n /** Whether the column is filterable */\n filterable?: boolean,\n /** Whether the column is visible */\n visible?: boolean,\n /** Whether the column is resizable */\n resizable?: boolean,\n /** Whether the column is draggable */\n draggable?: boolean,\n /** Column width */\n width?: number,\n /** Column index */\n index?: number,\n}\n\ninterface SortItem {\n /** Column property */\n prop: string,\n /** Sort direction */\n dir: 'asc' | 'desc'\n}\n\ninterface SortState {\n /** The list of sorts */\n sorts: SortItem[]\n}\n\ninterface OrderRecord {\n /** Column property */\n columnProp: string,\n /** Column order, which is the index that it will be placed in the columns array. */\n index: number\n}\n\ninterface OrderState {\n /** The list of column order records */\n columns: OrderRecord[]\n}\n\ninterface WidthState {\n /** The column property that this width alteration applies to */\n columnProp: string\n /** The width of the column. Number is in pixels. */\n width?: number\n /** Whether the column can auto resize. Needs to be false to guarantee a specific width. */\n canAutoResize: boolean\n}\n\ninterface HideColumnState {\n /** The column property that this alteration applies to */\n columnProp: string\n /** Whether the column is hidden */\n hidden: boolean\n}\n\ninterface FilterState {\n /** The column property that this filter applies to */\n columnProp: string,\n /** The filter type based on column cellType */\n filterType: 'text' | 'numeric' | 'date',\n /** The filter operation */\n operation: string,\n /** The filter value (for single value operations) */\n value?: any,\n /** The from value (for range operations like 'between') */\n fromValue?: any,\n /** The to value (for range operations like 'between') */\n toValue?: any\n}\n\ninterface TableAlteration<TType extends string, TState> {\n /**\n * Unique identifier for the alteration.\n */\n id: string\n /**\n * The type of alteration.\n */\n type: TType\n /** The alteration state */\n state: TState\n}\n\n/**\n * Sort alteration for a datatable.\n * \"id\" should always be \"sort\" for this alteration.\n */\ntype SortAlteration = TableAlteration<'sort', SortState>\n\n/**\n * Order alteration for a datatable column.\n *\n * \"id\" should always be \"order\" for this alteration.\n */\ntype OrderAlteration = TableAlteration<'order', OrderState>\n\n/**\n * Width alteration for a datatable column.\n *\n * \"id\" should always be \"width-<prop>\" for this alteration. So, for example, if the column property is \"name\", the id would be \"width-name\".\n */\ntype WidthAlteration = TableAlteration<'width', WidthState>\n\n/**\n * Hide column alteration for a datatable column.\n *\n * \"id\" should always be \"hide-column-<prop>\" for this alteration. So, for example, if the column property is \"name\", the id would be \"hide-column-name\".\n */\ntype HideColumnAlteration = TableAlteration<'hide-column', HideColumnState>\n\n/**\n * Filter alteration for a datatable column.\n * \"id\" should be \"filter--<columnProp>\" for this alteration.\n * For example, if filtering the \"age\" column, the id would be \"filter--age\".\n */\ntype FilterAlteration = TableAlteration<'filter', FilterState>\n```\n\n## Filter Operations by Type\n\n### Text Filters (cellType: 'string', 'phone')\n- 'contains': Text contains the value (case-insensitive)\n- 'eq': Text equals the value exactly\n- 'neq': Text does not equal the value\n- 'ncontains': Text does not contain the value\n- 'blank': Field is empty/null\n- 'not-blank': Field is not empty/null\n\n### Numeric Filters (cellType: 'integer', 'decimal', 'currency')\n- 'eq': Equals the value\n- 'gt': Greater than the value\n- 'gte': Greater than or equal to the value\n- 'lt': Less than the value\n- 'lte': Less than or equal to the value\n- 'between': Between fromValue and toValue (inclusive)\n- 'not-between': Not between fromValue and toValue\n- 'blank': Field is empty/null\n- 'not-blank': Field is not empty/null\n\n### Date Filters (cellType: 'date')\n- 'eq': Date equals the value\n- 'gt': Date is after the value\n- 'gte': Date is on or after the value\n- 'lt': Date is before the value\n- 'lte': Date is on or before the value\n- 'between': Date is between fromValue and toValue (inclusive)\n- 'not-between': Date is not between fromValue and toValue\n- 'blank': Field is empty/null\n- 'not-blank': Field is not empty/null\n\n## Examples\n\nFilter age greater than 30:\n```json\n{\n \"id\": \"filter--age\",\n \"type\": \"filter\",\n \"state\": {\n \"columnProp\": \"age\",\n \"filterType\": \"numeric\",\n \"operation\": \"gt\",\n \"value\": 30\n }\n}\n```\n\nFilter color contains \"red\":\n```json\n{\n \"id\": \"filter--color\",\n \"type\": \"filter\",\n \"state\": {\n \"columnProp\": \"color\",\n \"filterType\": \"text\",\n \"operation\": \"contains\",\n \"value\": \"red\"\n }\n}\n```\n\nFilter age between 25 and 65:\n```json\n{\n \"id\": \"filter--age\",\n \"type\": \"filter\",\n \"state\": {\n \"columnProp\": \"age\",\n \"filterType\": \"numeric\",\n \"operation\": \"between\",\n \"fromValue\": 25,\n \"toValue\": 65\n }\n}\n```\n\nSort by name ascending:\n```json\n{\n \"id\": \"sort\",\n \"type\": \"sort\",\n \"state\": {\n \"sorts\": [\n {\n \"prop\": \"name\",\n \"dir\": \"asc\"\n }\n ]\n }\n}\n```\n\nHide the age column:\n```json\n{\n \"id\": \"hide-column-age\",\n \"type\": \"hide-column\",\n \"state\": {\n \"columnProp\": \"age\",\n \"hidden\": true\n }\n}\n```\n\nSet name column width to 300 pixels:\n```json\n{\n \"id\": \"width-name\",\n \"type\": \"width\",\n \"state\": {\n \"columnProp\": \"name\",\n \"width\": 300,\n \"canAutoResize\": false\n }\n}\n```\n\nReorder columns (name first, age second, color third):\n```json\n{\n \"id\": \"order\",\n \"type\": \"order\",\n \"state\": {\n \"columns\": [\n { \"columnProp\": \"name\", \"index\": 0 },\n { \"columnProp\": \"age\", \"index\": 1 },\n { \"columnProp\": \"color\", \"index\": 2 }\n ]\n }\n}\n```\n";
|
|
328
|
+
declare const getUserPrompt: (columns: any[], request: string) => string;
|
|
329
|
+
declare function parseResponse(responseContent: string, responseFormat: {
|
|
330
|
+
type: string;
|
|
331
|
+
} | undefined): any;
|
|
332
|
+
declare const THESEAM_DATATABLE_PROMPTER_PROVIDER: InjectionToken<TheSeamAiProvider>;
|
|
333
|
+
|
|
334
|
+
declare class TheSeamDatatablePrompterComponent {
|
|
335
|
+
private readonly _prefsAccessor;
|
|
336
|
+
private readonly _dtPrefsService;
|
|
337
|
+
private readonly _aiProvider;
|
|
338
|
+
readonly _loadingSubject: BehaviorSubject<boolean>;
|
|
339
|
+
readonly _altsDataSubject: BehaviorSubject<{
|
|
340
|
+
currentItems: AlterationDisplayItem[];
|
|
341
|
+
pendingItems: AlterationDisplayItem[];
|
|
342
|
+
} | undefined>;
|
|
343
|
+
readonly loading$: Observable<boolean>;
|
|
344
|
+
diffMode: 'auto' | 'manual';
|
|
345
|
+
compact: boolean;
|
|
346
|
+
set prompt(value: string | undefined | null);
|
|
347
|
+
set datatable(value: DatatableComponent | undefined | null);
|
|
348
|
+
get datatable(): DatatableComponent | undefined | null;
|
|
349
|
+
private _datatableSubject;
|
|
350
|
+
showAlts: boolean;
|
|
351
|
+
readonly _form: FormGroup<{
|
|
352
|
+
prompt: FormControl<string | null>;
|
|
353
|
+
}>;
|
|
354
|
+
_alterations$: Observable<ColumnsAlterationState[]>;
|
|
355
|
+
_alterationsDisplayItems$: Observable<AlterationDisplayItem[]>;
|
|
356
|
+
_pendingAlterationsSubject: BehaviorSubject<ColumnsAlterationState<any>[]>;
|
|
357
|
+
_pendingAlterationsDisplayItems$: Observable<AlterationDisplayItem[]>;
|
|
358
|
+
_onSubmit(): void;
|
|
359
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TheSeamDatatablePrompterComponent, never>;
|
|
360
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<TheSeamDatatablePrompterComponent, "seam-datatable-prompter", never, { "diffMode": { "alias": "diffMode"; "required": false; }; "compact": { "alias": "compact"; "required": false; }; "prompt": { "alias": "prompt"; "required": false; }; "datatable": { "alias": "datatable"; "required": false; }; "showAlts": { "alias": "showAlts"; "required": false; }; }, {}, never, never, true, never>;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
export { ChatSessionStaleError, LmStudioAiProvider, MockAiProvider, OpenRouterAiProvider, THESEAM_CHAT_BLOCK_REGISTRY, THESEAM_CHAT_PROVIDER, THESEAM_DATATABLE_PROMPTER_PROVIDER, TheSeamChatComponent, TheSeamChatContextRegistry, TheSeamChatHarness, TheSeamDatatableChatContext, TheSeamDatatablePrompterComponent, assistantPrompt, getUserPrompt, parseChatResponse, parseResponse };
|
|
364
|
+
export type { ChatBlockRegistry, ChatContentSegment, ChatMessage, ChatResponse, ChatSession, ChatSessionListItem, ChatSessionMessage, MockAiProviderConfig, TheSeamAiChatRequest, TheSeamAiProvider, TheSeamChatContext, TheSeamChatContextPayload, TheSeamDatatableChatContextData, TheSeamDatatableChatContextOptions };
|
package/carousel/index.d.ts
CHANGED
|
@@ -3,6 +3,8 @@ import { OnInit, OnDestroy, QueryList } from '@angular/core';
|
|
|
3
3
|
import * as _fortawesome_fontawesome_common_types from '@fortawesome/fontawesome-common-types';
|
|
4
4
|
import { NumberInput, BooleanInput } from '@angular/cdk/coercion';
|
|
5
5
|
import { Observable } from 'rxjs';
|
|
6
|
+
import * as _angular_cdk_testing from '@angular/cdk/testing';
|
|
7
|
+
import { ComponentHarness } from '@angular/cdk/testing';
|
|
6
8
|
|
|
7
9
|
declare class TheSeamCarouselSlideDirective {
|
|
8
10
|
private readonly template;
|
|
@@ -97,4 +99,22 @@ declare class TheSeamCarouselModule {
|
|
|
97
99
|
static ɵinj: i0.ɵɵInjectorDeclaration<TheSeamCarouselModule>;
|
|
98
100
|
}
|
|
99
101
|
|
|
100
|
-
|
|
102
|
+
declare class TheSeamCarouselHarness extends ComponentHarness {
|
|
103
|
+
static hostSelector: string;
|
|
104
|
+
_content: () => Promise<_angular_cdk_testing.TestElement>;
|
|
105
|
+
_prevSlideButton: () => Promise<_angular_cdk_testing.TestElement | null>;
|
|
106
|
+
_nextSlideButton: () => Promise<_angular_cdk_testing.TestElement | null>;
|
|
107
|
+
_playButton: () => Promise<_angular_cdk_testing.TestElement | null>;
|
|
108
|
+
_pauseButton: () => Promise<_angular_cdk_testing.TestElement | null>;
|
|
109
|
+
activeTileIndex(): Promise<string | null>;
|
|
110
|
+
goToPreviousSlide(): Promise<void>;
|
|
111
|
+
goToNextSlide(): Promise<void>;
|
|
112
|
+
goToSlide(index: number): Promise<void>;
|
|
113
|
+
hasPreviousSlideButton(): Promise<boolean>;
|
|
114
|
+
hasNextSlideButton(): Promise<boolean>;
|
|
115
|
+
hasSlideButton(index: number): Promise<boolean>;
|
|
116
|
+
hasSlideButtons(): Promise<boolean>;
|
|
117
|
+
hasAutoPlayToggleButton(): Promise<boolean>;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export { TheSeamCarouselComponent, TheSeamCarouselHarness, TheSeamCarouselModule, TheSeamCarouselSlideDirective };
|
package/data-filters/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { InjectionToken, OnInit, OnDestroy, TemplateRef } from '@angular/core';
|
|
2
|
+
import { InjectionToken, OnInit, OnDestroy, TemplateRef, OnChanges, AfterViewInit, ElementRef, SimpleChanges } from '@angular/core';
|
|
3
3
|
import { Observable } from 'rxjs';
|
|
4
4
|
import * as _theseam_ui_common_data_filters from '@theseam/ui-common/data-filters';
|
|
5
5
|
import { BooleanInput } from '@angular/cdk/coercion';
|
|
@@ -11,6 +11,8 @@ import * as i4 from '@angular/common';
|
|
|
11
11
|
import * as i6 from '@theseam/ui-common/form-field';
|
|
12
12
|
import * as i7 from '@fortawesome/angular-fontawesome';
|
|
13
13
|
import * as i8 from '@theseam/ui-common/toggle-group';
|
|
14
|
+
import * as i10 from '@theseam/ui-common/menu';
|
|
15
|
+
import * as i11 from '@theseam/ui-common/buttons';
|
|
14
16
|
|
|
15
17
|
type DataFilterFunction = <T>(data: T[]) => Observable<T[]>;
|
|
16
18
|
/**
|
|
@@ -172,6 +174,7 @@ declare class DataFilterTextComponent implements OnInit, OnDestroy, IDataFilter
|
|
|
172
174
|
static ɵcmp: i0.ɵɵComponentDeclaration<DataFilterTextComponent, "seam-data-filter-text", never, { "filterName": { "alias": "filterName"; "required": false; }; "properties": { "alias": "properties"; "required": false; }; "omitProperties": { "alias": "omitProperties"; "required": false; }; "exact": { "alias": "exact"; "required": false; }; "caseSensitive": { "alias": "caseSensitive"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "iconTpl": { "alias": "iconTpl"; "required": false; }; "value": { "alias": "value"; "required": false; }; }, {}, never, never, false, never>;
|
|
173
175
|
}
|
|
174
176
|
|
|
177
|
+
declare const DATA_FILTER_TOGGLE_BUTTON_DROPDOWN_TEXT = "Select Filter";
|
|
175
178
|
declare const DATA_FILTER_TOGGLE_BUTTON: any;
|
|
176
179
|
interface IToggleButton {
|
|
177
180
|
name: string;
|
|
@@ -183,10 +186,16 @@ interface IToggleButtonsFilterOptions extends ITextFilterOptions {
|
|
|
183
186
|
multiple: boolean;
|
|
184
187
|
buttons: IToggleButton[];
|
|
185
188
|
initialValue?: any;
|
|
189
|
+
maxWidth?: number;
|
|
190
|
+
/** The text shown when the button row is in the collapsed state and no filter is selected. */
|
|
191
|
+
filterDropdownLabel?: string;
|
|
192
|
+
/** When true, will prevent the button row from collapsing into a dropdown on smaller screen sizes. */
|
|
193
|
+
disableCollapse?: boolean;
|
|
186
194
|
}
|
|
187
195
|
declare const DefaultToggleButtonsFilterOptions: IToggleButtonsFilterOptions;
|
|
188
196
|
declare function toggleButtonsFilter(data: any[], values: string[], options?: IToggleButtonsFilterOptions): any[];
|
|
189
|
-
declare class DataFilterToggleButtonsComponent implements OnInit, OnDestroy, IDataFilter {
|
|
197
|
+
declare class DataFilterToggleButtonsComponent implements OnInit, OnChanges, OnDestroy, AfterViewInit, IDataFilter {
|
|
198
|
+
private _elementRef;
|
|
190
199
|
private _filterContainer;
|
|
191
200
|
private _filterOptions;
|
|
192
201
|
readonly name = "toggle-buttons";
|
|
@@ -200,22 +209,32 @@ declare class DataFilterToggleButtonsComponent implements OnInit, OnDestroy, IDa
|
|
|
200
209
|
buttons: IToggleButton[];
|
|
201
210
|
exact: boolean;
|
|
202
211
|
caseSensitive: boolean;
|
|
212
|
+
maxWidth: number | undefined;
|
|
213
|
+
filterDropdownLabel: string | undefined;
|
|
214
|
+
disableCollapse: boolean | undefined;
|
|
215
|
+
readonly isCollapsed: i0.WritableSignal<boolean>;
|
|
216
|
+
private _measureDiv;
|
|
217
|
+
private _resizeObserver;
|
|
203
218
|
set value(value: string | string[]);
|
|
204
219
|
readonly filterStateChanges: Observable<DataFilterState>;
|
|
205
|
-
|
|
220
|
+
activeFilterLabel: Observable<string>;
|
|
221
|
+
constructor(_elementRef: ElementRef<HTMLElement>, _filterContainer: DataFilterContainer, _filterOptions: IToggleButtonsFilterOptions | null);
|
|
206
222
|
ngOnInit(): void;
|
|
223
|
+
ngAfterViewInit(): void;
|
|
224
|
+
ngOnChanges(changes: SimpleChanges): void;
|
|
207
225
|
ngOnDestroy(): void;
|
|
208
226
|
private _optDefault;
|
|
209
227
|
get options(): IToggleButtonsFilterOptions;
|
|
210
228
|
filter<T>(data: T[]): Observable<T[]>;
|
|
229
|
+
private _updateCollapsed;
|
|
211
230
|
filterState(): DataFilterState;
|
|
212
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<DataFilterToggleButtonsComponent, [null, { optional: true; }]>;
|
|
213
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<DataFilterToggleButtonsComponent, "seam-data-filter-toggle-buttons", never, { "filterName": { "alias": "filterName"; "required": false; }; "properties": { "alias": "properties"; "required": false; }; "omitProperties": { "alias": "omitProperties"; "required": false; }; "multiple": { "alias": "multiple"; "required": false; }; "selectionToggleable": { "alias": "selectionToggleable"; "required": false; }; "buttons": { "alias": "buttons"; "required": false; }; "exact": { "alias": "exact"; "required": false; }; "caseSensitive": { "alias": "caseSensitive"; "required": false; }; "value": { "alias": "value"; "required": false; }; }, {}, never, never, false, never>;
|
|
231
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<DataFilterToggleButtonsComponent, [null, null, { optional: true; }]>;
|
|
232
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<DataFilterToggleButtonsComponent, "seam-data-filter-toggle-buttons", never, { "filterName": { "alias": "filterName"; "required": false; }; "properties": { "alias": "properties"; "required": false; }; "omitProperties": { "alias": "omitProperties"; "required": false; }; "multiple": { "alias": "multiple"; "required": false; }; "selectionToggleable": { "alias": "selectionToggleable"; "required": false; }; "buttons": { "alias": "buttons"; "required": false; }; "exact": { "alias": "exact"; "required": false; }; "caseSensitive": { "alias": "caseSensitive"; "required": false; }; "maxWidth": { "alias": "maxWidth"; "required": false; }; "filterDropdownLabel": { "alias": "filterDropdownLabel"; "required": false; }; "disableCollapse": { "alias": "disableCollapse"; "required": false; }; "value": { "alias": "value"; "required": false; }; }, {}, never, never, false, never>;
|
|
214
233
|
}
|
|
215
234
|
|
|
216
235
|
declare class TheSeamDataFiltersModule {
|
|
217
236
|
static ɵfac: i0.ɵɵFactoryDeclaration<TheSeamDataFiltersModule, never>;
|
|
218
|
-
static ɵmod: i0.ɵɵNgModuleDeclaration<TheSeamDataFiltersModule, [typeof DataFilterSearchComponent, typeof DataFilterTextComponent, typeof DataFilterToggleButtonsComponent], [typeof i4.CommonModule, typeof i5.ReactiveFormsModule, typeof i6.TheSeamFormFieldModule, typeof i7.FontAwesomeModule, typeof i8.TheSeamToggleGroupModule, typeof i9.TheSeamIconModule], [typeof DataFilterSearchComponent, typeof DataFilterTextComponent, typeof DataFilterToggleButtonsComponent]>;
|
|
237
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<TheSeamDataFiltersModule, [typeof DataFilterSearchComponent, typeof DataFilterTextComponent, typeof DataFilterToggleButtonsComponent], [typeof i4.CommonModule, typeof i5.ReactiveFormsModule, typeof i6.TheSeamFormFieldModule, typeof i7.FontAwesomeModule, typeof i8.TheSeamToggleGroupModule, typeof i9.TheSeamIconModule, typeof i10.TheSeamMenuModule, typeof i11.TheSeamButtonsModule], [typeof DataFilterSearchComponent, typeof DataFilterTextComponent, typeof DataFilterToggleButtonsComponent]>;
|
|
219
238
|
static ɵinj: i0.ɵɵInjectorDeclaration<TheSeamDataFiltersModule>;
|
|
220
239
|
}
|
|
221
240
|
|
|
@@ -228,5 +247,5 @@ interface IDataFilterDef<T = any> {
|
|
|
228
247
|
}
|
|
229
248
|
declare const THESEAM_DATA_FILTER_DEF: InjectionToken<IDataFilterDef<any>[]>;
|
|
230
249
|
|
|
231
|
-
export { DATA_FILTER_SEARCH, DATA_FILTER_TEXT, DATA_FILTER_TOGGLE_BUTTON, DataFilterSearchComponent, DataFilterTextComponent, DataFilterToggleButtonsComponent, DefaultSearchFilterOptions, DefaultTextFilterOptions, DefaultToggleButtonsFilterOptions, THESEAM_DATA_FILTER, THESEAM_DATA_FILTER_CONTAINER, THESEAM_DATA_FILTER_DEF, THESEAM_DATA_FILTER_OPTIONS, TheSeamDataFiltersModule, composeDataFilterStates, composeDataFilters, filterOperator, searchDataFilter, textDataFilter, toggleButtonsFilter };
|
|
250
|
+
export { DATA_FILTER_SEARCH, DATA_FILTER_TEXT, DATA_FILTER_TOGGLE_BUTTON, DATA_FILTER_TOGGLE_BUTTON_DROPDOWN_TEXT, DataFilterSearchComponent, DataFilterTextComponent, DataFilterToggleButtonsComponent, DefaultSearchFilterOptions, DefaultTextFilterOptions, DefaultToggleButtonsFilterOptions, THESEAM_DATA_FILTER, THESEAM_DATA_FILTER_CONTAINER, THESEAM_DATA_FILTER_DEF, THESEAM_DATA_FILTER_OPTIONS, TheSeamDataFiltersModule, composeDataFilterStates, composeDataFilters, filterOperator, searchDataFilter, textDataFilter, toggleButtonsFilter };
|
|
232
251
|
export type { DataFilter, DataFilterContainer, DataFilterFunction, DataFilterState, IDataFilter, IDataFilterDef, IDataFilterFunction, ISearchFilterOptions, ITextFilterOptions, IToggleButton, IToggleButtonsFilterOptions };
|