@theseam/ui-common 1.0.2-beta.23 → 1.0.2-beta.26
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.
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ApolloLink, NetworkStatus, Observable as Observable$1 } from '@apollo/client/core';
|
|
2
|
-
import { print, visit as visit$1, parse, BREAK as BREAK$1, parseValue } from 'graphql';
|
|
2
|
+
import { print, visit as visit$1, parse, BREAK as BREAK$1, parseValue, Kind, valueFromASTUntyped } from 'graphql';
|
|
3
3
|
import { hasProperty, notNullOrUndefined, isNullOrUndefined, withoutProperty, wrapIntoObservable, withoutProperties } from '@theseam/ui-common/utils';
|
|
4
4
|
import { visit, BREAK } from 'graphql/language';
|
|
5
5
|
import * as i0 from '@angular/core';
|
|
@@ -538,39 +538,57 @@ const queryProcessingLink = new ApolloLink((operation, forward) => {
|
|
|
538
538
|
/**
|
|
539
539
|
* Creates a {@link SortsMapper} from a declarative field-name map.
|
|
540
540
|
*
|
|
541
|
-
*
|
|
542
|
-
*
|
|
541
|
+
* By default, `autoMap` is enabled: columns not listed in the field map
|
|
542
|
+
* are automatically mapped using their `prop` as the GQL field name,
|
|
543
|
+
* provided the column exists in the datatable and has `sortable` not
|
|
544
|
+
* explicitly set to `false`. This guards against stale sort preferences
|
|
545
|
+
* for removed columns.
|
|
546
|
+
*
|
|
547
|
+
* Each key in `fieldMap` must correspond to a datatable column `prop`
|
|
548
|
+
* value. The value controls how that column's sort is translated:
|
|
543
549
|
*
|
|
544
550
|
* - `string` – emits `{ [gqlField]: 'ASC' | 'DESC' }`
|
|
545
551
|
* - `null` – column is not sortable; the sort item is dropped
|
|
546
552
|
* - `function` – called with `(prop, context)` and may return a field
|
|
547
553
|
* name or `null` to drop the item dynamically
|
|
548
554
|
*
|
|
549
|
-
* In dev mode an error is thrown when a sort item's `prop` is not present
|
|
550
|
-
* in the map. In production the item is silently dropped.
|
|
551
|
-
*
|
|
552
555
|
* @example
|
|
553
|
-
* //
|
|
556
|
+
* // Auto-map all columns, override one
|
|
554
557
|
* const mapSorts = createSortsMapper<MyRow>({
|
|
555
|
-
*
|
|
556
|
-
* name: 'name',
|
|
558
|
+
* computedField: 'gql_computed_field',
|
|
557
559
|
* })
|
|
558
560
|
*
|
|
559
561
|
* @example
|
|
560
|
-
* //
|
|
562
|
+
* // Opt out of auto-mapping (explicit field map required)
|
|
561
563
|
* const mapSorts = createSortsMapper<MyRow>({
|
|
562
564
|
* id: 'id',
|
|
563
565
|
* name: 'name',
|
|
564
|
-
*
|
|
565
|
-
* context.extraVariables.useAlt ? 'altField' : prop,
|
|
566
|
-
* })
|
|
566
|
+
* }, { autoMap: false })
|
|
567
567
|
*/
|
|
568
|
-
function createSortsMapper(fieldMap) {
|
|
568
|
+
function createSortsMapper(fieldMap, options) {
|
|
569
|
+
const autoMap = options?.autoMap ?? true;
|
|
569
570
|
return (sorts, context) => {
|
|
570
571
|
const result = [];
|
|
571
572
|
for (const s of sorts) {
|
|
572
573
|
const prop = s?.prop;
|
|
573
574
|
if (!(prop in fieldMap)) {
|
|
575
|
+
if (autoMap) {
|
|
576
|
+
const columns = context.columns;
|
|
577
|
+
if (columns) {
|
|
578
|
+
const column = columns.find((c) => c.prop === prop);
|
|
579
|
+
if (column && column.sortable !== false) {
|
|
580
|
+
const dir = s?.dir?.toUpperCase();
|
|
581
|
+
result.push({ [prop]: dir });
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
else if (isDevMode()) {
|
|
585
|
+
// autoMap is enabled but no columns in context — likely a
|
|
586
|
+
// wiring issue where columns$ is not being piped through.
|
|
587
|
+
console.warn(`createSortsMapper: autoMap is enabled but no columns found in context for prop "${prop}". ` +
|
|
588
|
+
`Ensure columns are provided via MapperContext.`);
|
|
589
|
+
}
|
|
590
|
+
continue;
|
|
591
|
+
}
|
|
574
592
|
if (isDevMode()) {
|
|
575
593
|
throw new Error(`createSortsMapper: no mapping found for column prop "${prop}". ` +
|
|
576
594
|
`Add an entry to the field map or set the value to null to ignore it.`);
|
|
@@ -735,7 +753,7 @@ function observeRowsWithGqlInputsHandling(queryRef, rows, datatable, extraVariab
|
|
|
735
753
|
// only one setVariables call is made per event-loop turn.
|
|
736
754
|
const handleQueryInputs = combineLatest([extraVariables$, pageInfo$]).pipe(auditTime(0), switchMap(([_extraVariables, pageInfo]) => {
|
|
737
755
|
const context = { extraVariables: _extraVariables };
|
|
738
|
-
const sorts$ =
|
|
756
|
+
const sorts$ = _createSortsAndColumnsObservable(datatable$).pipe(switchMap(({ sorts, columns }) => wrapIntoObservable(sortsMapper(sorts, { ...context, columns }))));
|
|
739
757
|
const filterInfo$ = _createFilterStatesObservable(datatable$).pipe(switchMap((x) => mapFilterStates(x, filterStateMappers, context)),
|
|
740
758
|
// TODO: Remove when the datatable fixes the bug causing it to emit more than it should.
|
|
741
759
|
distinctUntilChanged((x, y) => JSON.stringify(x) === JSON.stringify(y)));
|
|
@@ -781,7 +799,7 @@ function observeRowsWithGqlInputsHandling(queryRef, rows, datatable, extraVariab
|
|
|
781
799
|
return of([]);
|
|
782
800
|
}), shareReplay({ bufferSize: 1, refCount: true }));
|
|
783
801
|
}
|
|
784
|
-
function
|
|
802
|
+
function _createSortsAndColumnsObservable(datatable$) {
|
|
785
803
|
// NOTE: There is a bug in our datatable wrapper that isn't propagating
|
|
786
804
|
// external sorting changes to the wrapped datatable component, which we observe
|
|
787
805
|
// sort events from. This workaround observes our wrapper's internal column
|
|
@@ -795,7 +813,12 @@ function _createSortsObservable(datatable$) {
|
|
|
795
813
|
}
|
|
796
814
|
return dt._columnsAlterationsManager.changes.pipe(map(() => (dt.externalSorting ? dt._sorts : dt.sorts)), startWith(dt.externalSorting ? dt._sorts : dt.sorts));
|
|
797
815
|
};
|
|
798
|
-
return datatable$.pipe(switchMap((dt) =>
|
|
816
|
+
return datatable$.pipe(switchMap((dt) => dt
|
|
817
|
+
? combineLatest([_observeSortsWorkaround(dt), dt.columns$]).pipe(map(([sorts, columns]) => ({ sorts, columns })))
|
|
818
|
+
: of({
|
|
819
|
+
sorts: [],
|
|
820
|
+
columns: [],
|
|
821
|
+
})), shareReplay({ bufferSize: 1, refCount: true }));
|
|
799
822
|
}
|
|
800
823
|
function _createFilterStatesObservable(datatable$) {
|
|
801
824
|
return datatable$.pipe(switchMap((dt) => (dt ? dt.filterStates : of([]))));
|
|
@@ -1841,6 +1864,8 @@ function filteredResults(items, args) {
|
|
|
1841
1864
|
}
|
|
1842
1865
|
|
|
1843
1866
|
class MockDatatable {
|
|
1867
|
+
_columnsSubject = new BehaviorSubject([]);
|
|
1868
|
+
columns$ = this._columnsSubject.asObservable();
|
|
1844
1869
|
_filterStatesSubject = new BehaviorSubject([]);
|
|
1845
1870
|
_sorts = [];
|
|
1846
1871
|
_rows = [];
|
|
@@ -1877,6 +1902,9 @@ class MockDatatable {
|
|
|
1877
1902
|
count: this._rows.length,
|
|
1878
1903
|
};
|
|
1879
1904
|
}
|
|
1905
|
+
setColumns(v) {
|
|
1906
|
+
this._columnsSubject.next(v);
|
|
1907
|
+
}
|
|
1880
1908
|
setSorts(v) {
|
|
1881
1909
|
this._sorts = v;
|
|
1882
1910
|
this.sort.emit({ sorts: this._sorts });
|
|
@@ -2002,10 +2030,38 @@ function _isOneOfIndices(indices, index) {
|
|
|
2002
2030
|
return false;
|
|
2003
2031
|
}
|
|
2004
2032
|
|
|
2033
|
+
/**
|
|
2034
|
+
* Extracts the effective field arguments from the top-level selections of a
|
|
2035
|
+
* processed query, merging inlined literal values back with the remaining
|
|
2036
|
+
* operation variables.
|
|
2037
|
+
*
|
|
2038
|
+
* When {@link queryProcessingLink} inlines a variable (e.g. `where`) into the
|
|
2039
|
+
* query AST, it removes that variable from `operation.variables`. A real
|
|
2040
|
+
* GraphQL server would still resolve the inlined literal when executing the
|
|
2041
|
+
* field resolver, but a mock link that only looks at `operation.variables`
|
|
2042
|
+
* would miss it. This function bridges that gap.
|
|
2043
|
+
*/
|
|
2044
|
+
function resolveEffectiveVariables(operation) {
|
|
2045
|
+
const merged = { ...operation.variables };
|
|
2046
|
+
const opDef = operation.query.definitions.find((d) => d.kind === Kind.OPERATION_DEFINITION);
|
|
2047
|
+
if (!opDef)
|
|
2048
|
+
return merged;
|
|
2049
|
+
for (const sel of opDef.selectionSet.selections) {
|
|
2050
|
+
if (sel.kind === Kind.FIELD && sel.arguments) {
|
|
2051
|
+
for (const arg of sel.arguments) {
|
|
2052
|
+
if (arg.value.kind !== Kind.VARIABLE) {
|
|
2053
|
+
merged[arg.name.value] = valueFromASTUntyped(arg.value, operation.variables);
|
|
2054
|
+
}
|
|
2055
|
+
}
|
|
2056
|
+
}
|
|
2057
|
+
}
|
|
2058
|
+
return merged;
|
|
2059
|
+
}
|
|
2005
2060
|
function mockGraphQLLink(options) {
|
|
2006
2061
|
return new ApolloLink((operation, forward) => {
|
|
2007
2062
|
return new Observable$1((subscriber) => {
|
|
2008
2063
|
const execute = () => {
|
|
2064
|
+
operation.variables = resolveEffectiveVariables(operation);
|
|
2009
2065
|
const response = options.resolve(operation);
|
|
2010
2066
|
operation.setContext({ response });
|
|
2011
2067
|
subscriber.next(response);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theseam-ui-common-graphql.mjs","sources":["../../../projects/ui-common/graphql/apollo-links/log-query-link.ts","../../../projects/ui-common/graphql/models/direction.ts","../../../projects/ui-common/graphql/models/hints-kind.ts","../../../projects/ui-common/graphql/models/query-processing-config.ts","../../../projects/ui-common/graphql/models/variable.ts","../../../projects/ui-common/graphql/utils/contains-variable.ts","../../../projects/ui-common/graphql/utils/gql-var.ts","../../../projects/ui-common/graphql/utils/inline-variables.ts","../../../projects/ui-common/graphql/utils/parse-comments.ts","../../../projects/ui-common/graphql/utils/parse-hints.ts","../../../projects/ui-common/graphql/utils/remove-variable-definition.ts","../../../projects/ui-common/graphql/utils/remove-variable-definitions-not-defined.ts","../../../projects/ui-common/graphql/utils/remove-variable.ts","../../../projects/ui-common/graphql/utils/to-gql.ts","../../../projects/ui-common/graphql/utils/hints-tokens-containing-hint.ts","../../../projects/ui-common/graphql/hints/transformers/inline-variable.transformer.ts","../../../projects/ui-common/graphql/hints/transformers/remove-not-defined.transformer.ts","../../../projects/ui-common/graphql/hints/inline-variable.hint-def.ts","../../../projects/ui-common/graphql/hints/remove-not-defined.hint-def.ts","../../../projects/ui-common/graphql/hints/index.ts","../../../projects/ui-common/graphql/apollo-links/query-processing-link.ts","../../../projects/ui-common/graphql/datatable/create-sorts-mapper.ts","../../../projects/ui-common/graphql/datatable/get-page-info.ts","../../../projects/ui-common/graphql/datatable/create-page-info-observable.ts","../../../projects/ui-common/graphql/datatable/map-filter-states.ts","../../../projects/ui-common/graphql/datatable/map-page-info.ts","../../../projects/ui-common/graphql/datatable/datatable-helpers.ts","../../../projects/ui-common/graphql/datatable/datatable-graphql-query-ref.ts","../../../projects/ui-common/graphql/datatable/datatable-graphql.service.ts","../../../projects/ui-common/graphql/datatable/map-search-date-columns-data-filter-state-to-gql.ts","../../../projects/ui-common/graphql/datatable/map-search-numeric-columns-data-filter-state-to-gql.ts","../../../projects/ui-common/graphql/datatable/map-search-text-columns-data-filter-state-to-gql.ts","../../../projects/ui-common/graphql/testing/base-schema-fragment.ts","../../../projects/ui-common/graphql/testing/filter-where.ts","../../../projects/ui-common/graphql/testing/skip-and-take.ts","../../../projects/ui-common/graphql/testing/sort-items.ts","../../../projects/ui-common/graphql/testing/filtered-results.ts","../../../projects/ui-common/graphql/testing/mock-datatable.ts","../../../projects/ui-common/graphql/testing/check-records-have-value.ts","../../../projects/ui-common/graphql/testing/mock-graphql-link.ts","../../../projects/ui-common/graphql/testing/create-mock-apollo-testing-provider.ts","../../../projects/ui-common/graphql/testing/data/simple-gql-test-data.ts","../../../projects/ui-common/graphql/theseam-ui-common-graphql.ts"],"sourcesContent":["import { ApolloLink } from '@apollo/client/core'\nimport { print } from 'graphql'\n\nexport interface LogQueryLinkOptions {\n beforeStyles?: string\n afterStyles?: string\n}\n\n/**\n * Wraps an Apollo link and logs the operation state immediately before and\n * after the wrapped link processes it.\n *\n * Useful for inspecting what `queryProcessingLink` does to a query:\n *\n * ```ts\n * link: concat(\n * logQueryLink(queryProcessingLink),\n * httpLink,\n * )\n * ```\n *\n * The output uses `console.log` with optional CSS styles so each snapshot\n * is easy to distinguish in the browser console. Tree-shaking will remove\n * this from production builds when it is not imported.\n */\nexport function logQueryLink(\n inner: ApolloLink,\n options?: LogQueryLinkOptions,\n): ApolloLink {\n const beforeStyles = options?.beforeStyles ?? 'color: cyan'\n const afterStyles = options?.afterStyles ?? 'color: limegreen'\n\n const beforeLink = new ApolloLink((operation, forward) => {\n // eslint-disable-next-line no-console\n console.log(\n `%c~~~BEFORE\\n${print(operation.query)}\\n${JSON.stringify(operation.variables, null, 2)}`,\n beforeStyles,\n )\n return forward(operation)\n })\n\n const afterLink = new ApolloLink((operation, forward) => {\n // eslint-disable-next-line no-console\n console.log(\n `%c~~~AFTER\\n${print(operation.query)}\\n${JSON.stringify(operation.variables, null, 2)}`,\n afterStyles,\n )\n return forward(operation)\n })\n\n return ApolloLink.from([beforeLink, inner, afterLink])\n}\n","export class GQLDirection {\n constructor(public readonly direction: string) {}\n public static readonly ASC = new GQLDirection('ASC')\n public static readonly DESC = new GQLDirection('DESC')\n}\n","import { Kind } from 'graphql'\n\nexport enum HintsKind {\n OperationDefinition = Kind.OPERATION_DEFINITION,\n Field = Kind.FIELD,\n VariableDefinition = Kind.VARIABLE_DEFINITION,\n Variable = Kind.VARIABLE,\n Argument = Kind.ARGUMENT,\n}\n","export const DEFAULT_TO_REMOVE_ON_UNDEFINED = ['where', 'order']\n\nexport interface QueryProcessingVariablesConfig {\n removeIfNotDefined?: string[]\n removeIfNotUsed?: string[]\n inline?: string[]\n}\n\nexport interface QueryProcessingConfig {\n variables: QueryProcessingVariablesConfig\n\n /**\n * If skip and take are found, they will be removed\n */\n disablePaging?: boolean\n}\n","export class GQLVariable {\n constructor(\n public readonly name: string,\n public readonly type: string,\n ) {}\n}\n","import { BREAK, DocumentNode, ValueNode, visit } from 'graphql/language'\n\nexport function containsVariable(\n node: DocumentNode | ValueNode,\n variableName: string,\n) {\n let found = false\n\n visit(node, {\n Variable(variable) {\n if (variableName === variable.name.value) {\n found = true\n return BREAK\n }\n },\n })\n\n return found\n}\n","export function gqlVar(varName: string): { gqlVar: string } {\n return { gqlVar: `$${varName}` }\n}\n","import { isDevMode } from '@angular/core'\n\nimport { hasProperty } from '@theseam/ui-common/utils'\nimport { BREAK, DocumentNode, ValueNode, visit } from 'graphql'\n\nexport function inlineVariable(\n query: DocumentNode,\n variableName: string,\n variableValue: ValueNode,\n): DocumentNode {\n // return visit(query, {\n // VariableDefinition(node) {\n // if (variableName === node.variable.name.value) {\n // console.log(node)\n // // found = true\n // console.log('insert', variableValue)\n // // return BREAK\n\n // // node.defaultValue = variableValue\n // return {\n // ...node,\n // defaultValue: variableValue\n // }\n // }\n // }\n // })\n\n // console.log('~inlineVariable', variableName, variableValue)\n\n // TODO: Decide if this is a good solution.\n if (\n hasProperty(variableValue as any, 'value') &&\n (variableValue as any).value === 'undefined'\n ) {\n if (isDevMode()) {\n // eslint-disable-next-line no-console\n console.warn(\n `Ignoring attempt to inline '${variableName}', because it is undefined.`,\n )\n }\n return visit(query, {\n SelectionSet(selectionSetNode) {\n return visit(selectionSetNode, {\n Variable(variableNode) {\n if (variableName === variableNode.name.value) {\n return null\n }\n },\n })\n },\n })\n }\n\n return visit(query, {\n SelectionSet(selectionSetNode) {\n return visit(selectionSetNode, {\n Variable(variableNode) {\n if (variableName === variableNode.name.value) {\n return variableValue\n }\n },\n })\n },\n })\n}\n","import { DocumentNode, Token } from 'graphql/language'\n\n// Based on Prettier's comment parsing.\n//\n// Source: https://github.com/prettier/prettier/blob/4e46f92b8648c7f25de62bfaf4368aa3f2e588d9/src/language-graphql/parser-graphql.js#L6\nexport function parseComments(ast: DocumentNode): Token[] {\n const comments: Token[] = []\n\n if (ast.loc === undefined) {\n return comments\n }\n\n const startToken = ast.loc.startToken\n let next = startToken.next\n while (next !== null && next.kind !== '<EOF>') {\n if (next.kind === 'Comment') {\n Object.assign(next, {\n // The Comment token's column starts _after_ the `#`,\n // but we need to make sure the node captures the `#`\n column: next.column - 1,\n })\n comments.push(next)\n }\n next = next.next\n }\n\n return comments\n}\n","import {\n ArgumentNode,\n BREAK,\n DocumentNode,\n FieldNode,\n OperationDefinitionNode,\n parse,\n Token,\n VariableDefinitionNode,\n VariableNode,\n visit,\n} from 'graphql'\n\nimport { notNullOrUndefined } from '@theseam/ui-common/utils'\n\nimport { HintsKind, HintsToken } from '../models'\nimport { parseComments } from './parse-comments'\n\nexport const HINT_PREFIX_REGEX = /^\\s*@gql-hint:.+/\nexport const HINT_NAMES_CAPTURE_REGEX = /^\\s*@gql-hint:([a-zA-z-\\d\\s]+)$/\n\n/**\n * If AST loc has startToken prop then return same AST else reparse with config\n * to contain comments and loc at each node.\n */\nexport function parseAst(ast: DocumentNode): DocumentNode {\n if (ast.loc === undefined) {\n throw Error(`Expected AST to have loc.`)\n }\n\n if (ast.loc.startToken !== undefined) {\n return ast\n }\n\n return parse(ast.loc.source)\n}\n\nexport function isCommentToken(token: Token): boolean {\n return token.kind === 'Comment'\n}\n\nexport function isHintToken(token: Token): boolean {\n return (\n (isCommentToken(token) &&\n (token.value?.match(HINT_PREFIX_REGEX)?.length || 0) > 0) ||\n false\n )\n}\n\nexport function isInlineComment(token: Token): boolean {\n return (\n isCommentToken(token) &&\n token.prev !== null &&\n token.prev.line === token.line\n )\n}\n\nexport function hintNamesFromHintToken(token: Token): string[] {\n const grp = token.value?.match(HINT_NAMES_CAPTURE_REGEX)\n if (grp === null || grp === undefined || grp.length === 0) {\n return []\n }\n return grp[1]\n .split(' ')\n .map((x) => x.trim())\n .filter((x) => x.length > 0)\n}\n\nexport function getTokenAppliesTo(token: Token): Token | null {\n if (isInlineComment(token)) {\n return token.prev\n }\n\n let t = token.next\n if (t?.kind === '$' && t.next?.kind === 'Name') {\n t = t.next\n }\n return t\n}\n\nexport function createHintsToken(\n token: Token,\n node: HintsToken['node'],\n kind: HintsKind,\n): HintsToken {\n return {\n node,\n hints: hintNamesFromHintToken(token),\n kind,\n }\n}\n\nexport function getHintsToken(\n token: Token,\n ast: DocumentNode,\n): HintsToken | null {\n // console.log('getHintsToken', token)\n const appliesTo = getTokenAppliesTo(token)\n if (appliesTo === null) {\n return null\n }\n\n let appliesToNode: HintsToken | null = null\n visit(ast, {\n OperationDefinition(node: OperationDefinitionNode) {\n if (node.loc?.start === appliesTo.start) {\n appliesToNode = createHintsToken(\n token,\n node,\n HintsKind.OperationDefinition,\n )\n return BREAK\n }\n },\n VariableDefinition(node: VariableDefinitionNode) {\n if (node.variable.name.loc?.start === appliesTo.start) {\n appliesToNode = createHintsToken(\n token,\n node,\n HintsKind.VariableDefinition,\n )\n return BREAK\n }\n },\n Variable(node: VariableNode) {\n if (node.name.loc?.start === appliesTo.start) {\n appliesToNode = createHintsToken(token, node, HintsKind.Variable)\n return BREAK\n }\n },\n Argument(node: ArgumentNode) {\n if (node.name.loc?.start === appliesTo.start) {\n appliesToNode = createHintsToken(token, node, HintsKind.Argument)\n return BREAK\n }\n },\n Field(node: FieldNode) {\n if (node.name.loc?.start === appliesTo.start) {\n appliesToNode = createHintsToken(token, node, HintsKind.Field)\n return BREAK\n }\n },\n })\n return appliesToNode\n}\n\nexport function parseHints(ast: DocumentNode): HintsToken[] {\n const _ast = parseAst(ast)\n // console.log('_ast', _ast)\n return parseComments(_ast)\n .filter(isHintToken)\n .map((r) => getHintsToken(r, _ast))\n .filter(notNullOrUndefined)\n}\n","import { DocumentNode, visit } from 'graphql'\n\nexport function removeVariableDefinition(\n query: DocumentNode,\n variableName: string,\n): DocumentNode {\n return visit(query, {\n VariableDefinition: {\n enter(variable) {\n const name = variable.variable.name.value\n if (name === variableName) {\n return null\n }\n },\n },\n })\n}\n","import { Operation } from '@apollo/client'\nimport { DocumentNode, OperationDefinitionNode, visit } from 'graphql'\n\nimport { isNullOrUndefined } from '@theseam/ui-common/utils'\n\nexport function removeVariableDefinitionsNotDefined(\n query: DocumentNode,\n node: OperationDefinitionNode,\n variables: Operation['variables'],\n) {\n return visit(query, {\n OperationDefinition(opDef) {\n if (opDef === node) {\n return visit(opDef, {\n VariableDefinition(varDef) {\n const name = varDef.variable.name.value\n if (isNullOrUndefined(variables[name])) {\n return null\n }\n },\n })\n }\n },\n })\n}\n","import { DocumentNode, visit } from 'graphql'\n\nexport function removeVariable(\n query: DocumentNode,\n variableName: string,\n): DocumentNode {\n return visit(query, {\n VariableDefinition: {\n enter(variable) {\n const name = variable.variable.name.value\n if (name === variableName) {\n return null\n }\n },\n },\n Argument: {\n enter(variable) {\n const name = variable.name.value\n if (name === variableName) {\n return null\n }\n },\n },\n })\n}\n","import { GQLDirection } from '../models'\n\n// Naive initial implementation. This is intended for dynamic values, such as\n// sorting and filtering. If you are defining a schema, use the gql template\n// function from 'apollo-angular'.\n//\n// TODO: Try to find a maintained library that will handle this. Ideally a\n// type-safe one, but that is becoming surprisingly harder to find than I\n// expected for GraphQL.\nexport function toGQL(json: any): string {\n // Handle primitive top-level values so callers can pass non-objects (e.g.\n // when inlining a String or Int variable directly into a query argument).\n if (json === null || json === undefined) {\n return 'null'\n }\n if (typeof json === 'string') {\n return `\"${json}\"`\n }\n if (typeof json === 'number' || typeof json === 'boolean') {\n return `${json}`\n }\n if (json instanceof GQLDirection) {\n return `${json.direction}`\n }\n if (Array.isArray(json)) {\n return `[${json.map((v) => toGQL(v)).join(',')}]`\n }\n\n const props: string[] = Object.keys(json).map((prop) => {\n const value = json[prop]\n let resultValue: string | undefined\n if (typeof value === 'string') {\n resultValue = `\"${value}\"`\n } else if (value instanceof GQLDirection) {\n resultValue = `${value.direction}`\n } else if (Array.isArray(value)) {\n resultValue = `[${value.map((v) => toGQL(v)).join(',')}]`\n } else if (typeof value === 'object') {\n if (Object.prototype.hasOwnProperty.call(value, 'gqlVar')) {\n resultValue = `${value.gqlVar}`\n } else {\n resultValue = toGQL(value)\n }\n } else {\n resultValue = `${value}`\n }\n if (typeof resultValue !== 'string') {\n throw Error(`Unexpected value.`)\n }\n return `${prop}: ${resultValue}`\n })\n return `{${props.join(', ')}}`\n}\n","import { HintsToken } from '../models'\n\nexport function hintsTokensContainingHint(\n hintsTokens: HintsToken[],\n hint: string,\n): HintsToken[] {\n return hintsTokens.filter((r) => r.hints.indexOf(hint) !== -1)\n}\n","import { parseValue, VariableDefinitionNode, VariableNode } from 'graphql'\n\nimport { withoutProperty } from '@theseam/ui-common/utils'\n\nimport {\n HintsKind,\n HintsToken,\n HintTransformer,\n HintTransformOperation,\n} from '../../models'\nimport { inlineVariable, removeVariableDefinition, toGQL } from '../../utils'\n\n/**\n * Inlines the variable's current value directly into the query AST and removes\n * the variable definition from the parameter list. The variable is also\n * removed from the operation's variables map so it is not sent to the server.\n *\n * Applies to VariableDefinition (comment above the `$var` in the parameter\n * list) or Variable (inline comment beside a `$var` usage in the query body).\n */\nexport const inlineVariableTransformer: HintTransformer = (\n operation: HintTransformOperation,\n hintsToken: HintsToken,\n): HintTransformOperation => {\n let varName: string | null = null\n\n if (hintsToken.kind === HintsKind.VariableDefinition) {\n varName = (hintsToken.node as VariableDefinitionNode).variable.name.value\n } else if (hintsToken.kind === HintsKind.Variable) {\n varName = (hintsToken.node as VariableNode).name.value\n }\n\n if (varName === null) {\n return operation\n }\n\n const varValue = operation.variables[varName]\n const newVariables = withoutProperty(operation.variables, varName)\n let query = removeVariableDefinition(operation.query, varName)\n query = inlineVariable(query, varName, parseValue(toGQL(varValue)))\n\n return { query, variables: newVariables }\n}\n","import { OperationDefinitionNode } from 'graphql'\n\nimport { isNullOrUndefined } from '@theseam/ui-common/utils'\n\nimport {\n HintsToken,\n HintTransformer,\n HintTransformOperation,\n} from '../../models'\nimport { removeVariable } from '../../utils'\n\n/**\n * Removes every variable from the query that is null or undefined in the\n * operation's variables map. Both the variable definition (from the parameter\n * list) and any argument usages in the query body are removed so the resulting\n * document remains valid.\n */\nexport const removeNotDefinedTransformer: HintTransformer = (\n operation: HintTransformOperation,\n hintsToken: HintsToken,\n): HintTransformOperation => {\n const operationNode = hintsToken.node as OperationDefinitionNode\n\n const undefinedVarNames = (operationNode.variableDefinitions ?? [])\n .filter((varDef) =>\n isNullOrUndefined(operation.variables[varDef.variable.name.value]),\n )\n .map((varDef) => varDef.variable.name.value)\n\n let query = operation.query\n for (const varName of undefinedVarNames) {\n query = removeVariable(query, varName)\n }\n\n return { query, variables: operation.variables }\n}\n","import { HintDefinition, HintsKind } from '../models'\nimport { inlineVariableTransformer } from './transformers/inline-variable.transformer'\n\n/**\n * Maps variable value to gql and inlines it into the query.\n */\nexport const inlineVariableHintDef: HintDefinition = {\n name: 'inline-variable',\n appliesTo: [HintsKind.Variable, HintsKind.VariableDefinition],\n transformer: inlineVariableTransformer,\n}\n","import { HintDefinition, HintsKind } from '../models'\nimport { removeNotDefinedTransformer } from './transformers/remove-not-defined.transformer'\n\n/**\n * Remove the variable from the query if it is not defined in the operation\n * variables.\n */\nexport const removeNotDefinedHintDef: HintDefinition = {\n name: 'remove-not-defined',\n appliesTo: [HintsKind.OperationDefinition],\n transformer: removeNotDefinedTransformer,\n}\n","// /**\n// * Remove the variable from the query if it is not defined in the operation\n// * variables.\n// *\n// * Applies to: OperationDefinition\n// */\n// export const GQL_HINT_REMOVE_NOT_DEFINED = 'remove-not-defined'\n\n// /**\n// * Maps variable value to gql and inlines it into the query.\n// *\n// * Applies to: Variable, VariableDefinition\n// */\n// export const GQL_HINT_INLINE_VARIABLE = 'inline-variable'\n\n// /**\n// * Remove variable definition from the query if it is not used by the operation.\n// *\n// * Applies to: VariableDefinition\n// */\n// // export const GQL_HINT_REMOVE_IF_NOT_USED = 'remove-if-not-used'\n\n// export const GQL_HINTS = [\n// // GQL_HINT_REMOVE_IF_NOT_USED,\n// GQL_HINT_REMOVE_NOT_DEFINED,\n// GQL_HINT_INLINE_VARIABLE\n// ]\n\nexport * from './transformers/inline-variable.transformer'\nexport * from './transformers/remove-not-defined.transformer'\n\nexport * from './inline-variable.hint-def'\nexport * from './remove-not-defined.hint-def'\n","import { ApolloLink } from '@apollo/client/core'\nimport { isNullOrUndefined, withoutProperty } from '@theseam/ui-common/utils'\nimport { parseValue } from 'graphql'\n\nimport { inlineVariableHintDef, removeNotDefinedHintDef } from '../hints'\nimport { QueryProcessingConfig } from '../models'\nimport {\n containsVariable,\n hintsTokensContainingHint,\n inlineVariable,\n parseAst,\n parseHints,\n removeVariable,\n removeVariableDefinition,\n toGQL,\n} from '../utils'\n\n/**\n * Apollo link that transforms GraphQL operations before they are sent.\n *\n * Two mechanisms are supported and can be combined freely:\n *\n * **Hint-based** — place `# @gql-hint: <name>` comments directly in the query.\n * Supported hints:\n * - `remove-not-defined` on the operation definition: removes every variable\n * whose value is null/undefined (definition + argument usage).\n * - `inline-variable` on a variable definition or usage: substitutes the\n * variable's current value directly into the query AST and removes it from\n * the variables map.\n *\n * **Config-based** — pass a `QueryProcessingConfig` via Apollo context under\n * the key `queryProcessingConfig`. Supported options:\n * - `variables.removeIfNotDefined`: remove named variables when null/undefined.\n * - `variables.removeIfNotUsed`: remove named variable definitions when the\n * variable is not referenced anywhere in the (possibly already-transformed)\n * query body.\n * - `variables.inline`: inline named variables into the query AST.\n *\n * Hints are applied first, then config-based processing.\n */\nexport const queryProcessingLink = new ApolloLink((operation, forward) => {\n const context = operation.getContext()\n const queryProcessingConfig: QueryProcessingConfig =\n context.queryProcessingConfig ?? {}\n\n // Reparse to ensure token/comment info is present for hint parsing.\n let _ast = parseAst(operation.query)\n const rules = parseHints(_ast)\n\n // ---- Hint: remove-not-defined ----------------------------------------\n for (const hintsToken of hintsTokensContainingHint(\n rules,\n removeNotDefinedHintDef.name,\n )) {\n const result = removeNotDefinedHintDef.transformer!(\n { query: _ast, variables: operation.variables },\n hintsToken,\n )\n _ast = result.query\n operation.variables = result.variables\n }\n\n // ---- Hint: inline-variable --------------------------------------------\n for (const hintsToken of hintsTokensContainingHint(\n rules,\n inlineVariableHintDef.name,\n )) {\n const result = inlineVariableHintDef.transformer!(\n { query: _ast, variables: operation.variables },\n hintsToken,\n )\n _ast = result.query\n operation.variables = result.variables\n }\n\n // ---- Config: removeIfNotDefined ---------------------------------------\n for (const varName of queryProcessingConfig?.variables?.removeIfNotDefined ??\n []) {\n if (isNullOrUndefined(operation.variables[varName])) {\n _ast = removeVariable(_ast, varName)\n }\n }\n\n // ---- Config: removeIfNotUsed -----------------------------------------\n // Intentionally runs after removeIfNotDefined so that variables which were\n // only referenced inside another (now-removed) variable can be cleaned up.\n for (const varName of queryProcessingConfig?.variables?.removeIfNotUsed ??\n []) {\n if (!containsVariable(_ast, varName)) {\n _ast = removeVariable(_ast, varName)\n }\n }\n\n // ---- Config: inline --------------------------------------------------\n for (const varName of queryProcessingConfig?.variables?.inline ?? []) {\n const varValue = operation.variables[varName]\n operation.variables = withoutProperty(operation.variables, varName)\n _ast = removeVariableDefinition(_ast, varName)\n _ast = inlineVariable(_ast, varName, parseValue(toGQL(varValue)))\n }\n\n operation.query = _ast\n\n return forward(operation)\n})\n","import { isDevMode } from '@angular/core'\n\nimport { SortItem } from '@theseam/ui-common/datatable'\n\nimport { SortsMapper, SortsMapperResult } from './datatable-helpers'\nimport { MapperContext } from './mapper-context'\n\n/**\n * A field mapping entry for {@link createSortsMapper}:\n *\n * - `string` – the GQL sort-field name to emit for this column\n * - `null` – column is not sortable; the sort item will be dropped\n * - `function` – `(prop, context) => string | null` for dynamic mapping\n * with access to {@link MapperContext}\n */\nexport type SortsMapperFieldEntry =\n | string\n | null\n | ((prop: string, context: MapperContext) => string | null)\n\n/**\n * A partial map from column prop names to their GQL sort fields.\n *\n * Each key must be a valid property of `TRow`, catching typos and\n * copy-paste errors at compile time. Only columns that actually need\n * sort mapping must be listed — unlisted columns are silently dropped\n * (or throw in dev mode).\n */\nexport type SortsMapperFieldMap<TRow extends Record<string, any>> = {\n [K in keyof TRow & string]?: SortsMapperFieldEntry\n}\n\n/**\n * Creates a {@link SortsMapper} from a declarative field-name map.\n *\n * Each key must correspond to a datatable column `prop` value. The value\n * controls how that column's sort is translated to a GQL sort object:\n *\n * - `string` – emits `{ [gqlField]: 'ASC' | 'DESC' }`\n * - `null` – column is not sortable; the sort item is dropped\n * - `function` – called with `(prop, context)` and may return a field\n * name or `null` to drop the item dynamically\n *\n * In dev mode an error is thrown when a sort item's `prop` is not present\n * in the map. In production the item is silently dropped.\n *\n * @example\n * // Simple static mapping\n * const mapSorts = createSortsMapper<MyRow>({\n * id: 'id',\n * name: 'name',\n * })\n *\n * @example\n * // Dynamic mapping with context access\n * const mapSorts = createSortsMapper<MyRow>({\n * id: 'id',\n * name: 'name',\n * computed: (prop, context) =>\n * context.extraVariables.useAlt ? 'altField' : prop,\n * })\n */\nexport function createSortsMapper<TRow extends Record<string, any>>(\n fieldMap: SortsMapperFieldMap<TRow>,\n): SortsMapper {\n return (sorts: SortItem[], context: MapperContext): SortsMapperResult => {\n const result: SortsMapperResult = []\n\n for (const s of sorts) {\n const prop = s?.prop as keyof TRow & string\n\n if (!(prop in fieldMap)) {\n if (isDevMode()) {\n throw new Error(\n `createSortsMapper: no mapping found for column prop \"${prop}\". ` +\n `Add an entry to the field map or set the value to null to ignore it.`,\n )\n }\n continue\n }\n\n const entry = fieldMap[prop]\n const dir = s?.dir?.toUpperCase()\n\n const gqlField =\n typeof entry === 'function' ? entry(prop, context) : entry\n\n if (gqlField === null) continue\n\n result.push({ [gqlField as string]: dir })\n }\n\n return result\n }\n}\n","import { TheSeamPageInfo } from '@theseam/ui-common/datatable'\n\nimport { GqlDatatableAccessor } from '../models/gql-datatable-accessor'\n\nexport const DEFAULT_PAGE_SIZE = 20\n\nexport function getPageInfo(\n datatable: GqlDatatableAccessor | null | undefined,\n defaultPageSize: number = DEFAULT_PAGE_SIZE,\n): TheSeamPageInfo {\n return {\n offset: datatable?.ngxDatatable?.offset ?? 0,\n pageSize: datatable?.ngxDatatable?.pageSize ?? defaultPageSize,\n limit: datatable?.ngxDatatable?.limit,\n count: datatable?.ngxDatatable?.count ?? 0,\n }\n}\n","import { EMPTY, Observable, Subscriber } from 'rxjs'\nimport { switchMap, tap } from 'rxjs/operators'\n\nimport { TheSeamPageInfo } from '@theseam/ui-common/datatable'\nimport { notNullOrUndefined } from '@theseam/ui-common/utils'\n\nimport { GqlDatatableAccessor } from '../models/gql-datatable-accessor'\nimport { getPageInfo } from './get-page-info'\n\nexport function createPageInfoObservable(\n datatable$: Observable<GqlDatatableAccessor | null | undefined>,\n defaultPageSize: number = 20,\n): Observable<TheSeamPageInfo> {\n return new Observable<TheSeamPageInfo>(\n (subscriber: Subscriber<TheSeamPageInfo>) => {\n let prev: TheSeamPageInfo | null = null\n const handlePageInfo = (pageInfo: TheSeamPageInfo | null) => {\n if (!_isPageInfoSame(prev, pageInfo)) {\n if (pageInfo !== null) {\n subscriber.next(pageInfo)\n }\n prev = pageInfo\n }\n }\n\n const dtSub = datatable$\n .pipe(\n switchMap((dt) => {\n if (!notNullOrUndefined(dt)) {\n handlePageInfo(null)\n return EMPTY\n }\n\n handlePageInfo(getPageInfo(dt, defaultPageSize))\n\n return dt.page.pipe(tap((p) => handlePageInfo(p)))\n }),\n )\n .subscribe()\n\n return () => {\n dtSub.unsubscribe()\n }\n },\n )\n}\n\nfunction _isPageInfoSame(\n prev: TheSeamPageInfo | null,\n curr: TheSeamPageInfo | null,\n): boolean {\n if (\n prev?.offset === curr?.offset &&\n prev?.pageSize === curr?.pageSize &&\n prev?.limit === curr?.limit &&\n prev?.count === curr?.count\n ) {\n return true\n }\n return false\n}\n","import { isDevMode } from '@angular/core'\nimport { from, Observable } from 'rxjs'\nimport { concatMap, filter, take, toArray } from 'rxjs/operators'\n\nimport { DataFilterState } from '@theseam/ui-common/data-filters'\nimport {\n notNullOrUndefined,\n wrapIntoObservable,\n} from '@theseam/ui-common/utils'\n\nimport { MapperContext } from './mapper-context'\n\nexport interface FilterStateMapperVariables {\n [name: string]: any\n}\n\nexport interface FilterStateMapperFilter {\n and?: FilterStateMapperFilter[]\n or?: FilterStateMapperFilter[]\n [name: string]: any\n}\n\nexport type FilterStateMapperResult = {\n filter: FilterStateMapperFilter\n variables: FilterStateMapperVariables\n} | null\n\n/**\n * A filter input type constrained to the field names of `T`.\n *\n * Use this as the building block for {@link TypedFilterStateMapperResult}\n * when you want compile-time checking that filter conditions only reference\n * real fields in the corresponding GQL input type.\n *\n * @example\n * type MyFilter = TypedFilterInput<'id' | 'name'>\n * // { id?: any; name?: any }\n */\nexport type TypedFilterInput<T extends string | number | symbol> = {\n [name in T]?: any\n}\n\n/**\n * A type-safe alternative to {@link FilterStateMapperResult} that constrains\n * filter field names to the union `T`.\n *\n * The filter can be either a direct field-condition object or a combined\n * object with `or`/`and` arrays:\n *\n * ```ts\n * // Direct field condition\n * { filter: { status: { eq: 'active' } }, variables: {} }\n *\n * // Combined (OR)\n * { filter: { or: [{ id: { lt: 30 } }, { name: { contains: 'foo' } }] }, variables: {} }\n * ```\n *\n * Because TypeScript uses structural typing, a mapper that returns\n * `TypedFilterStateMapperResult<'id' | 'name'>` is assignable to the\n * untyped {@link FilterStateMapper} signature without any cast.\n */\nexport type TypedFilterStateMapperResult<T extends string | number | symbol> = {\n filter:\n | {\n or?: TypedFilterInput<T>[]\n and?: TypedFilterInput<T>[]\n }\n | TypedFilterInput<T>\n variables: FilterStateMapperVariables\n} | null\n\nexport type FilterStateMapper = (\n filterState: DataFilterState,\n context: MapperContext,\n) =>\n | FilterStateMapperResult\n | Promise<FilterStateMapperResult>\n | Observable<FilterStateMapperResult>\nexport interface FilterStateMappers {\n [filterName: string]: FilterStateMapper\n}\n\nfunction resolveMapper(\n filterState: DataFilterState,\n filterStateMappers: FilterStateMappers,\n context: MapperContext,\n): Observable<FilterStateMapperResult> {\n const mapper = filterStateMappers[filterState.name]\n if (!notNullOrUndefined(mapper)) {\n throw Error(`Mapper for filter '${filterState.name}' not found.`)\n }\n\n return wrapIntoObservable(mapper(filterState, context)).pipe(\n // Require each mapper to complete.\n take(1),\n )\n}\n\nfunction resolveMappers(\n filterStates: DataFilterState[],\n filterStateMappers: FilterStateMappers,\n context: MapperContext,\n): Observable<Exclude<FilterStateMapperResult, null>[]> {\n return from(filterStates).pipe(\n concatMap((filterState) =>\n resolveMapper(filterState, filterStateMappers, context),\n ),\n filter(notNullOrUndefined),\n toArray(),\n )\n}\n\n/**\n * Combines multiple active filter results with AND so that all conditions must\n * be satisfied simultaneously (e.g. a search filter AND a status filter).\n */\nfunction mergeFilters(\n filters: FilterStateMapperFilter[],\n): FilterStateMapperFilter {\n return { and: filters }\n}\n\n/**\n * Merges variable objects.\n *\n * NOTE: This does not try to deep merge, so if two objects define the same\n * variable then the last object's value will be in the merged object. *In\n * devMode an error will be thrown.*\n */\nfunction mergeVariables(\n variableObjects: FilterStateMapperVariables[],\n): FilterStateMapperVariables {\n const variables: FilterStateMapperVariables = {}\n\n for (const v of variableObjects) {\n const props = Object.keys(v)\n\n if (isDevMode()) {\n for (const p of props) {\n if (notNullOrUndefined(variables[p]) && variables[p] !== v[p]) {\n // eslint-disable-next-line no-console\n console.warn(\n `Multiple filters adding the same variable with a different result. This could cause unexpected results.`,\n )\n break\n }\n }\n }\n\n for (const p of props) {\n variables[p] = v[p]\n }\n }\n\n return variables\n}\n\nfunction isEmptyFilter(mapperFilter: FilterStateMapperFilter): boolean {\n return Object.keys(mapperFilter).length === 0\n}\n\nexport async function mapFilterStates(\n filterStates: DataFilterState[],\n filterStateMappers: FilterStateMappers,\n context: MapperContext,\n): Promise<FilterStateMapperResult> {\n const results: FilterStateMapperFilter[] =\n (await resolveMappers(\n filterStates,\n filterStateMappers,\n context,\n ).toPromise()) ?? []\n\n if (results.length === 0) {\n return null\n }\n\n const filters = results\n .map((r: any) => r.filter)\n .filter(notNullOrUndefined)\n .filter((mapperFilter) => !isEmptyFilter(mapperFilter))\n\n const variableObjs = results\n .map((r: any) => r.variables)\n .filter(notNullOrUndefined)\n\n return {\n filter: mergeFilters(filters),\n variables: mergeVariables(variableObjs),\n }\n}\n","import { TheSeamPageInfo } from '@theseam/ui-common/datatable'\n\nexport interface PageInfoMapperResult {\n skip: number\n take: number\n}\nexport type PageInfoMapper = (pageInfo: TheSeamPageInfo) => PageInfoMapperResult\n\n/**\n * Maps to a range that fetches the page before the current page, the current\n * page, and the page after the current page.\n */\nexport function mapPageInfo(pageInfo: TheSeamPageInfo): PageInfoMapperResult {\n const _skip = pageInfo.offset * pageInfo.pageSize\n\n const skipWithWindowOffset = _skip - pageInfo.pageSize\n const takeOffset = skipWithWindowOffset < 0 ? skipWithWindowOffset : 0\n\n return {\n skip: Math.max(skipWithWindowOffset, 0),\n take: Math.max(pageInfo.pageSize * 3 + takeOffset, 0),\n }\n}\n","import {\n combineLatest,\n defer,\n EMPTY,\n Observable,\n of,\n Subject,\n Subscription,\n} from 'rxjs'\nimport {\n auditTime,\n catchError,\n distinctUntilChanged,\n finalize,\n map,\n shareReplay,\n startWith,\n switchMap,\n tap,\n} from 'rxjs/operators'\n\nimport { wrapIntoObservable } from '@theseam/ui-common/utils'\nimport { SortItem } from '@theseam/ui-common/datatable'\n\nimport { GqlDatatableAccessor, EmptyObject } from '../models'\nimport { createPageInfoObservable } from './create-page-info-observable'\nimport { DatatableGraphQLQueryRef } from './datatable-graphql-query-ref'\nimport { FilterStateMappers, mapFilterStates } from './map-filter-states'\nimport { mapPageInfo } from './map-page-info'\nimport { MapperContext } from './mapper-context'\n\nexport type SortsMapperResult = { [name: string]: any }[]\nexport type SortsMapper = (\n sorts: SortItem[],\n context: MapperContext,\n) =>\n | SortsMapperResult\n | Promise<SortsMapperResult>\n | Observable<SortsMapperResult>\n\nexport function observeRowsWithGqlInputsHandling<\n TData,\n TRow,\n GqlVariables extends EmptyObject,\n>(\n queryRef: DatatableGraphQLQueryRef<TData, GqlVariables, TRow>,\n rows: Observable<TRow[]>,\n datatable:\n | Observable<GqlDatatableAccessor | undefined>\n | Promise<GqlDatatableAccessor | undefined>\n | GqlDatatableAccessor,\n extraVariables:\n | Observable<Partial<GqlVariables>>\n | Promise<Partial<GqlVariables>>\n | Partial<GqlVariables>,\n sortsMapper: SortsMapper,\n filterStateMappers: FilterStateMappers,\n): Observable<TRow[]> {\n const datatable$ = wrapIntoObservable(datatable)\n const extraVariables$ =\n wrapIntoObservable<Partial<GqlVariables>>(extraVariables)\n\n // Only emit page changes past the first when paging is enabled. When paging\n // is disabled, all data is already in the buffer so there is no need to\n // re-query on page changes.\n const pageInfo$ = defer(() => {\n let firstEmit = true\n return createPageInfoObservable(datatable$).pipe(\n switchMap((pageInfo) => {\n if (!firstEmit && _isPagingDisabled(queryRef)) {\n return EMPTY\n }\n firstEmit = false\n return of(pageInfo)\n }),\n map(mapPageInfo),\n )\n })\n\n // Combines extraVariables and pageInfo, then derives sorts and filter state.\n // auditTime(0) debounces rapid synchronous emissions (e.g. at startup) so\n // only one setVariables call is made per event-loop turn.\n const handleQueryInputs = combineLatest([extraVariables$, pageInfo$]).pipe(\n auditTime(0),\n switchMap(([_extraVariables, pageInfo]) => {\n const context: MapperContext = { extraVariables: _extraVariables }\n\n const sorts$ = _createSortsObservable(datatable$).pipe(\n switchMap((m) => wrapIntoObservable(sortsMapper(m, context))),\n )\n\n const filterInfo$ = _createFilterStatesObservable(datatable$).pipe(\n switchMap((x) => mapFilterStates(x, filterStateMappers, context)),\n // TODO: Remove when the datatable fixes the bug causing it to emit more than it should.\n distinctUntilChanged((x, y) => JSON.stringify(x) === JSON.stringify(y)),\n )\n\n return combineLatest([sorts$, filterInfo$]).pipe(\n map(([sorts, filterInfo]) => ({\n extraVariables: _extraVariables,\n pageInfo,\n sorts,\n filterInfo,\n })),\n )\n }),\n tap((v) => {\n queryRef.setVariables({\n ...(v.extraVariables || {}),\n ...v.pageInfo,\n ...(v.sorts.length > 0 ? { order: v.sorts } : {}),\n ...(v.filterInfo?.variables || {}),\n ...(v.filterInfo?.filter ? { where: v.filterInfo.filter } : {}),\n } as any)\n }),\n )\n\n return defer(() => {\n // Observe the optional refresh-button patch attached externally to the\n // datatable instance. When the user triggers a refresh, refetch the data.\n let refreshBtnSub: Subscription = Subscription.EMPTY\n refreshBtnSub = datatable$\n .pipe(\n switchMap((dt) => {\n if (!dt || !(dt as any).__refreshPatch) {\n return EMPTY\n }\n return (dt as any).__refreshPatch.refreshTriggered.pipe(\n tap(() => queryRef.refetch(undefined, true)),\n )\n }),\n )\n .subscribe()\n\n // Bridge query-input changes to row emissions via a Subject so that the\n // rows observable is only subscribed once (on the first input change) and\n // then continues to receive updates as the live query produces new data.\n const _emitted = new Subject<boolean>()\n const handlerSub = handleQueryInputs.subscribe(() => _emitted.next(true))\n\n return _emitted.pipe(\n distinctUntilChanged(),\n switchMap(() => rows),\n finalize(() => {\n handlerSub.unsubscribe()\n refreshBtnSub.unsubscribe()\n }),\n )\n }).pipe(\n catchError((err) => {\n // eslint-disable-next-line no-console\n console.error(err)\n return of([] as TRow[])\n }),\n shareReplay({ bufferSize: 1, refCount: true }),\n )\n}\n\nfunction _createSortsObservable(\n datatable$: Observable<GqlDatatableAccessor | undefined>,\n) {\n // NOTE: There is a bug in our datatable wrapper that isn't propagating\n // external sorting changes to the wrapped datatable component, which we observe\n // sort events from. This workaround observes our wrapper's internal column\n // change events, which emit all changes to columns that our datatable tracks,\n // and reads sorts from our wrapper when externalSorting is enabled.\n const _observeSortsWorkaround = (\n dt: GqlDatatableAccessor,\n ): Observable<SortItem[]> => {\n if (!(dt as any)._columnsAlterationsManager) {\n // Fallback for environments (e.g. tests) where the internal manager\n // is not present.\n return dt.sort.pipe(\n map((v) => v.sorts),\n startWith(dt.sorts),\n )\n }\n return (dt as any)._columnsAlterationsManager.changes.pipe(\n map(() => (dt.externalSorting ? (dt as any)._sorts : dt.sorts)),\n startWith(dt.externalSorting ? (dt as any)._sorts : dt.sorts),\n )\n }\n\n return datatable$.pipe(\n switchMap((dt) => (dt ? _observeSortsWorkaround(dt) : of([]))),\n shareReplay({ bufferSize: 1, refCount: true }),\n )\n}\n\nfunction _createFilterStatesObservable(\n datatable$: Observable<GqlDatatableAccessor | undefined>,\n) {\n return datatable$.pipe(switchMap((dt) => (dt ? dt.filterStates : of([]))))\n}\n\nfunction _isPagingDisabled<TData, GqlVariables extends EmptyObject, TRow>(\n queryRef: DatatableGraphQLQueryRef<TData, GqlVariables, TRow>,\n): boolean {\n return queryRef.getQueryProcessingConfig()?.disablePaging ?? false\n}\n","import {\n BehaviorSubject,\n defer,\n from,\n isObservable,\n Observable,\n of,\n Subject,\n Subscriber,\n} from 'rxjs'\nimport {\n auditTime,\n filter,\n finalize,\n map,\n shareReplay,\n skip,\n startWith,\n switchMap,\n take,\n tap,\n} from 'rxjs/operators'\n\nimport {\n ApolloQueryResult,\n DocumentNode,\n NetworkStatus,\n TypedDocumentNode,\n} from '@apollo/client/core'\nimport {\n hasProperty,\n notNullOrUndefined,\n withoutProperties,\n} from '@theseam/ui-common/utils'\n\n// `isNetworkRequestInFlight` is only exported from the ES module subpath\n// `@apollo/client/core/networkStatus`, which can't be loaded by Jest's CJS\n// transform. Reimplementing it here keeps the logic accessible in tests.\nfunction isNetworkRequestInFlight(networkStatus?: NetworkStatus): boolean {\n return networkStatus ? networkStatus < NetworkStatus.ready : false\n}\nimport { QueryRef } from 'apollo-angular'\nimport { WatchQueryOptions } from 'apollo-angular'\nimport { GraphQLFormattedError } from 'graphql'\n\nimport { QueryProcessingConfig, EmptyObject } from '../models'\nimport { DEFAULT_PAGE_SIZE } from './get-page-info'\n\nexport interface DatatableGraphQLDataMapperResult<TRow = EmptyObject> {\n rows: TRow[]\n\n /**\n * If data is paged, this is the total number of unpaged rows.\n */\n totalCount?: number\n}\n\nexport type DatatableGraphQLDataMapper<TData, TRow = EmptyObject> = (\n data: TData,\n) =>\n | DatatableGraphQLDataMapperResult<TRow>\n | Promise<DatatableGraphQLDataMapperResult<TRow>>\n | Observable<DatatableGraphQLDataMapperResult<TRow>>\n\nexport type DatatableGraphQLVariables = {\n skip?: number\n take?: number\n} & EmptyObject\n\nexport type DatatableGraphQLErrorHandler = (\n error: readonly GraphQLFormattedError[],\n) => void\n\n/**\n * Maximum number of error recovery attempts before throwing.\n */\nexport const MAX_ERROR_RECOVERY_ATTEMPTS = 10\n\n/**\n * Partially wraps ApolloClient's QueryRef with datatable paging, loading\n * state, error handling, and debounced variable updates.\n */\nexport class DatatableGraphQLQueryRef<\n TData,\n TVariables extends DatatableGraphQLVariables = EmptyObject,\n TRow = EmptyObject,\n> {\n private readonly _variablesSubject = new BehaviorSubject<TVariables>(\n {} as TVariables,\n )\n private readonly _observingChangesSubject = new BehaviorSubject<boolean>(\n false,\n )\n private readonly _errorSubject = new Subject<\n readonly GraphQLFormattedError[]\n >()\n /**\n * Used to manually trigger a pending/loading state when we know a request is\n * coming but Apollo hasn't started it yet (e.g. after setVariables resolves to\n * a non-paging variable change while a request is already in-flight).\n */\n private readonly _manualPendingSubject = new BehaviorSubject<boolean>(false)\n private readonly _needToRequerySubject = new Subject<boolean>()\n\n /**\n * Temporary way of tracking total count when paging is disabled.\n */\n private _totalCount: number = DEFAULT_PAGE_SIZE\n\n private get _observingChanges(): boolean {\n return this._observingChangesSubject.value\n }\n private set _observingChanges(value: boolean) {\n this._observingChangesSubject.next(value)\n }\n\n private _variablesUpdatePending = false\n\n private readonly _valueChanges: Observable<ApolloQueryResult<TData>>\n\n public readonly loading$: Observable<boolean>\n\n /**\n * Emits whenever the query variables change.\n */\n public readonly variables$ = this._variablesSubject.asObservable()\n\n /**\n * Emits when a GraphQL error occurs.\n *\n * If nothing is subscribed to this, the `_defaultErrorHandler` is used\n * (if provided). Once subscribed, the subscriber is responsible for\n * handling the error.\n */\n public readonly error$ = this._errorSubject.asObservable()\n\n public get updatesPollDelay(): number {\n return this._updatesPollDelay\n }\n public get variablesUpdatePending(): boolean {\n return this._variablesUpdatePending\n }\n\n constructor(\n /** Original ApolloClient's QueryRef. */\n private readonly _queryRef: QueryRef<TData, TVariables>,\n /**\n * How long to wait (ms) before applying variable changes and refetching.\n */\n private readonly _updatesPollDelay: number = 500,\n /**\n * Default error handler used when no subscriber is listening to `error$`.\n */\n private readonly _defaultErrorHandler?: DatatableGraphQLErrorHandler,\n ) {\n this._variablesSubject.next(\n (this._queryRef as any).obsQuery.options.variables || {},\n )\n\n // Tracks whether the loading overlay should be held open until we know\n // whether the first response will trigger a follow-up requery (e.g. when\n // disablePaging is on and we first probe for totalCount). This prevents the\n // loading overlay from flickering off and back on.\n let hasEmittedTriggered = false\n const hasEmittedSubject = new BehaviorSubject<boolean>(false)\n\n const setHasEmitted = () => {\n if (hasEmittedTriggered) {\n return\n }\n hasEmittedTriggered = true\n const sub = this._needToRequerySubject.pipe(take(1)).subscribe(() => {\n hasEmittedSubject.next(true)\n sub.unsubscribe()\n })\n }\n\n this._valueChanges = defer(() => {\n let prev: Omit<TVariables, 'skip' | 'take'> | undefined\n const varChangesSub = this._variablesSubject\n .pipe(\n skip(1),\n tap(() => {\n this._variablesUpdatePending = true\n }),\n auditTime(this._updatesPollDelay),\n finalize(() => {\n // If the query stopped being observed before the debounce fired,\n // apply the pending variables now.\n if (this._variablesUpdatePending) {\n this.refetch()\n this._variablesUpdatePending = false\n }\n }),\n )\n .subscribe((variables) => {\n this._setVariablesImmediate(variables)\n const current = withoutProperties(this.getVariables(), [\n 'skip',\n 'take',\n ])\n const isVarsChanged =\n prev === undefined ||\n JSON.stringify(prev) !== JSON.stringify(current)\n prev = current as any\n this._variablesUpdatePending = false\n // When the non-paging variables change while Apollo is already\n // in setVariables state, manually signal a pending load so the\n // loading overlay doesn't disappear until the response arrives.\n if (\n isVarsChanged &&\n this._queryRef.getCurrentResult().networkStatus ===\n NetworkStatus.setVariables\n ) {\n this._manualPendingSubject.next(true)\n }\n })\n\n let repeatedErrors = 0\n this._observingChanges = true\n return this._queryRef.valueChanges.pipe(\n // Once a response lands (not in-flight), begin tracking whether the\n // initial load has truly completed (accounting for disablePaging requery).\n tap((v) =>\n !isNetworkRequestInFlight(v.networkStatus)\n ? setHasEmitted()\n : undefined,\n ),\n // Guard against infinite error loops when polling / retrying.\n tap((v) => {\n if (v.networkStatus === NetworkStatus.error) {\n repeatedErrors++\n if (repeatedErrors >= MAX_ERROR_RECOVERY_ATTEMPTS) {\n throw Error('Max error recovery attempts reached.')\n }\n } else if (v.networkStatus === NetworkStatus.ready) {\n repeatedErrors = 0\n }\n }),\n finalize(() => {\n varChangesSub.unsubscribe()\n this._observingChanges = false\n }),\n )\n }).pipe(shareReplay({ bufferSize: 1, refCount: true }))\n\n this.loading$ = this._observingChangesSubject.pipe(\n switchMap((observingChanges) => {\n if (!observingChanges) {\n return of(false)\n }\n\n return this._valueChanges.pipe(\n map((result) => result.loading),\n startWith(this._queryRef.getCurrentResult().loading),\n tap((loading) => {\n if (!loading) {\n this._manualPendingSubject.next(false)\n }\n }),\n // Swap the actual loading flag for the manual pending flag so that\n // we can hold the loading state open when needed.\n switchMap(() => this._manualPendingSubject),\n auditTime(0),\n shareReplay({ bufferSize: 1, refCount: true }),\n )\n }),\n // Keep loading=true until we've confirmed the first full load cycle\n // (including any disablePaging requery).\n switchMap((v) =>\n hasEmittedSubject.pipe(map((hasEmitted) => (hasEmitted ? v : true))),\n ),\n )\n }\n\n public rows(\n mapper: DatatableGraphQLDataMapper<TData, TRow>,\n ): Observable<TRow[]> {\n return this._rowsObservable(mapper)\n }\n\n private _rowsObservable(\n mapper: DatatableGraphQLDataMapper<TData, TRow>,\n ): Observable<TRow[]> {\n return new Observable<TRow[]>((subscriber: Subscriber<TRow[]>) => {\n const rowsBufferSubject = new BehaviorSubject<TRow[]>([])\n\n const querySub = this._valueChanges\n .pipe(\n filter((result) => !isNetworkRequestInFlight(result.networkStatus)),\n switchMap((result) => {\n if (result.data === undefined) {\n return of()\n }\n\n // Capture the skip offset *before* any variable changes that the\n // mapper might trigger (e.g. patchVariables for disablePaging).\n const querySkip = this._getVariablesFromQueryRef().skip\n\n const _result = this._handleResult(result)\n return this._resolveRowMapper(mapper(_result.data)).pipe(\n tap((mapperResult) => {\n const needsToRequery =\n this._needsToRequeryWithAllRecords(mapperResult)\n if (needsToRequery) {\n this.patchVariables({ take: mapperResult.totalCount } as any)\n }\n this._needToRequerySubject.next(needsToRequery)\n\n if (hasProperty(mapperResult, 'totalCount')) {\n this._totalCount = mapperResult.totalCount\n }\n\n let rows = rowsBufferSubject.value || []\n\n const hasTotalCount =\n mapperResult.totalCount !== undefined &&\n mapperResult.totalCount !== null\n\n // If the rows buffer is not the same size as totalCount, create\n // a fresh buffer (sparse array — unfilled slots are undefined,\n // which is what checkRecordsHaveValue expects).\n if (hasTotalCount) {\n if (mapperResult.totalCount !== rows.length) {\n rows = new Array<TRow>(mapperResult.totalCount || 0)\n }\n\n let startIndex = querySkip ?? 0\n if (this.getQueryProcessingConfig()?.disablePaging) {\n startIndex = 0\n }\n\n // Insert rows into the correct buffer positions.\n for (let i = 0; i < mapperResult.rows.length; i++) {\n rows[startIndex + i] = mapperResult.rows[i]\n }\n\n rows = [...rows]\n } else {\n rows = [...mapperResult.rows]\n }\n\n // ngx-datatable does row lookups in a WeakMap and my assumption\n // is that the pre-allocated empty objects seem to be getting\n // recognized as the same object, so to avoid that, we add a\n // unique property to each row.\n rows = rows.map((v, i) => ({\n ...v,\n __dt_id: `row-${i}`,\n }))\n\n rowsBufferSubject.next(rows)\n }),\n )\n }),\n )\n .subscribe()\n\n const rowsSub = rowsBufferSubject.subscribe(subscriber)\n\n return () => {\n querySub.unsubscribe()\n rowsSub.unsubscribe()\n\n rowsBufferSubject.next([])\n rowsBufferSubject.complete()\n }\n })\n }\n\n /**\n * Reads the result and returns it unchanged if no errors.\n *\n * On errors: emits them via `error$` and replaces any `null` data properties\n * with an empty collection shape `{ items: [], totalCount: 0 }` so mapper\n * functions can run safely without special-casing the error path.\n */\n private _handleResult(\n result: ApolloQueryResult<TData>,\n ): ApolloQueryResult<TData> {\n if (!result.errors || result.errors.length === 0) return result\n\n this._emitError(result.errors)\n\n const defaultDataPropValue = { items: [], totalCount: 0 }\n const data = Object.keys(result.data as any).reduce((acc, key) => {\n ;(acc as any)[key] =\n (result.data as any)[key] === null\n ? defaultDataPropValue\n : (result.data as any)[key]\n return acc\n }, {} as TData)\n\n return { ...result, data }\n }\n\n private _needsToRequeryWithAllRecords(\n data: DatatableGraphQLDataMapperResult<TRow>,\n ): boolean {\n if (!this.getQueryProcessingConfig()?.disablePaging) {\n return false\n }\n\n return (\n hasProperty(data, 'totalCount') &&\n hasProperty(data, 'rows') &&\n Array.isArray(data.rows) &&\n data.totalCount > data.rows.length &&\n this._totalCount !== data.totalCount\n )\n }\n\n private _resolveRowMapper(\n mapperReturn: ReturnType<DatatableGraphQLDataMapper<TData, TRow>>,\n ): Observable<DatatableGraphQLDataMapperResult<TRow>> {\n if (isObservable(mapperReturn)) {\n return mapperReturn.pipe(take(1))\n }\n\n return from(Promise.resolve(mapperReturn))\n }\n\n public getVariables(): TVariables {\n return this._variablesSubject.value\n }\n\n private _setVariablesImmediate(\n variables: TVariables,\n ): Promise<void | ApolloQueryResult<TData>> {\n const _vars = this._withVariableOverrides(variables)\n return this._queryRef.setVariables(_vars || ({} as TVariables))\n }\n\n private _patchVariablesImmediate(\n variables: Partial<TVariables>,\n ): Promise<void | ApolloQueryResult<TData>> {\n const _variables = {\n ...this.getVariables(),\n ...variables,\n }\n\n const _vars = this._withVariableOverrides(_variables)\n return this._queryRef.setVariables(_vars || ({} as TVariables))\n }\n\n public setVariables(variables: TVariables): void {\n this._variablesSubject.next(variables)\n if (!this._observingChanges) {\n this._setVariablesImmediate(variables)\n }\n }\n\n public patchVariables(variables: Partial<TVariables>): void {\n const _variables = {\n ...this.getVariables(),\n ...variables,\n }\n\n this._variablesSubject.next(_variables)\n if (!this._observingChanges) {\n this._setVariablesImmediate(_variables)\n }\n }\n\n public refetch(\n variables?: TVariables,\n showLoading = false,\n ): Promise<ApolloQueryResult<TData>> {\n const _vars = this._withVariableOverrides(variables)\n if (showLoading) {\n this._manualPendingSubject.next(true)\n }\n // NOTE: There seems to be a bug causing Apollo to not emit changes unless\n // getCurrentResult() is called. This setTimeout is a workaround.\n setTimeout(() => this._queryRef.getCurrentResult())\n return this._queryRef.refetch(_vars)\n }\n\n public setQuery(\n query: DocumentNode | TypedDocumentNode<TData, TVariables>,\n triggerRefetch: boolean = false,\n ): void {\n this._queryRef.setOptions({ query })\n if (triggerRefetch) {\n // Fake a variables update to share the debounce delay with setVariables.\n this.setVariables(this.getVariables())\n }\n }\n\n public getOptions(): WatchQueryOptions<TVariables, TData> | undefined {\n return (this._queryRef as any).obsQuery.options\n }\n\n public getQueryProcessingConfig(): QueryProcessingConfig | undefined {\n return this.getOptions()?.context?.queryProcessingConfig\n }\n\n /**\n * Returns the variables that were actually sent with the last request, read\n * directly from Apollo's observable query. This is more accurate than\n * `_variablesSubject.value` when variables can change between the debounce\n * firing and the response arriving.\n */\n private _getVariablesFromQueryRef(): TVariables {\n return (this._queryRef as any).obsQuery.variables\n }\n\n private _withVariableOverrides(\n variables?: TVariables,\n ): TVariables | undefined {\n if (\n !notNullOrUndefined(variables) &&\n !this.getQueryProcessingConfig()?.disablePaging\n ) {\n return undefined\n }\n\n const _vars = { ...(variables || {}) } as TVariables\n if (this.getQueryProcessingConfig()?.disablePaging) {\n _vars.take = this._totalCount\n }\n return _vars\n }\n\n private _emitError(error: readonly GraphQLFormattedError[]): void {\n this._errorSubject.next(error)\n if (this._defaultErrorHandler && !this._errorSubject.observed) {\n this._defaultErrorHandler(error)\n }\n }\n}\n","import { Inject, Injectable, InjectionToken, Optional } from '@angular/core'\n\nimport { OperationVariables } from '@apollo/client/core/types'\nimport { Apollo } from 'apollo-angular'\nimport { WatchQueryOptions } from 'apollo-angular'\n\nimport { QueryProcessingConfig, EmptyObject } from '../models'\nimport {\n DatatableGraphQLQueryRef,\n DatatableGraphQLVariables,\n} from './datatable-graphql-query-ref'\n\n/**\n * NOTE: Any of ApolloClient's WatchQueryOptions properties can be set, but I\n * think our components should only be providing `query` and `variables`. The\n * rest should be common options shared by all our app's datatables. This may\n * change if it is determined to be too restrictive.\n */\nexport type DatatableQueryOptions<\n TVariables extends OperationVariables = OperationVariables,\n TData = any,\n> = Pick<WatchQueryOptions<TVariables, TData>, 'query'> &\n Pick<WatchQueryOptions<TVariables, TData>, 'variables'> &\n Pick<WatchQueryOptions<TVariables, TData>, 'context'>\n\nexport interface DatatableGraphqlServiceConfig {\n /**\n * Polling interval time in milliseconds.\n */\n pollingIntervalTime?: number\n}\n\nexport const DATATABLE_GRAPHQL_SERVICE_CONFIG =\n new InjectionToken<DatatableGraphqlServiceConfig>(\n 'DATATABLE_GRAPHQL_SERVICE_CONFIG',\n )\n\nconst _CONFIG_DEFAULTS: DatatableGraphqlServiceConfig = {\n pollingIntervalTime: 1 * 60 * 1000,\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class DatatableGraphqlService {\n private readonly _config: DatatableGraphqlServiceConfig\n\n constructor(\n private readonly _apollo: Apollo,\n @Optional()\n @Inject(DATATABLE_GRAPHQL_SERVICE_CONFIG)\n _config?: DatatableGraphqlServiceConfig,\n ) {\n this._config = {\n ..._CONFIG_DEFAULTS,\n ...(_config || {}),\n }\n }\n\n public watchQuery<\n TData,\n TVariables extends DatatableGraphQLVariables = EmptyObject,\n TRow = EmptyObject,\n >(\n options: DatatableQueryOptions<TVariables>,\n queryProcessingConfig?: QueryProcessingConfig,\n ): DatatableGraphQLQueryRef<TData, TVariables, TRow> {\n const _options: WatchQueryOptions<TVariables, TData> = {\n useInitialLoading: true,\n ..._CONFIG_DEFAULTS,\n pollInterval: this._config.pollingIntervalTime,\n ...options,\n }\n\n if (queryProcessingConfig) {\n _options.context = {\n ...(_options.context || {}),\n queryProcessingConfig: {\n ...(_options.context?.queryProcessingConfig || {}),\n ...queryProcessingConfig,\n },\n }\n }\n\n const queryRef = this._apollo.watchQuery<TData, TVariables>(_options)\n\n return new DatatableGraphQLQueryRef(queryRef)\n }\n}\n","import {\n ColumnsDataFilterState,\n TheSeamColumnsDataFilterDateSearchFormState,\n TheSeamColumnsDataFilterDateSearchOptions,\n THESEAM_COLUMNS_DATA_FILTER_DATE_TEXT_SEARCH_TYPES,\n getFormattedDateForComparison,\n THESEAM_COLUMNS_DATA_FILTER_DATE_RANGE_SEARCH_TYPES,\n} from '@theseam/ui-common/datatable'\nimport { isNullOrUndefined, notNullOrUndefined } from '@theseam/ui-common/utils'\nimport { FilterStateMapperResult } from './map-filter-states'\nimport { MapperContext } from './mapper-context'\n\nexport const mapSearchDateColumnsDataFilterStateToGql = (\n filterState: ColumnsDataFilterState<\n TheSeamColumnsDataFilterDateSearchFormState,\n TheSeamColumnsDataFilterDateSearchOptions\n >,\n context: MapperContext<any>,\n): FilterStateMapperResult => {\n const formValue = filterState.state.formValue\n const options = filterState.state.options\n\n let filter = null\n\n if (\n isNullOrUndefined(filterState.state.prop) ||\n isNullOrUndefined(options) ||\n isNullOrUndefined(formValue) ||\n isNullOrUndefined(formValue.searchType)\n ) {\n return filter\n }\n\n if (\n THESEAM_COLUMNS_DATA_FILTER_DATE_TEXT_SEARCH_TYPES.includes(\n formValue.searchType,\n ) &&\n notNullOrUndefined(formValue.searchText)\n ) {\n const searchDate = getFormattedDateForComparison(\n formValue.searchText,\n options.dateType,\n true,\n )\n\n if (!isNaN(searchDate.valueOf())) {\n switch (formValue.searchType) {\n case 'eq': {\n let searchDateEnd\n if (options.dateType === 'datetime-local') {\n searchDateEnd = new Date(searchDate)\n searchDateEnd.setMinutes(searchDateEnd.getMinutes() + 1)\n } else if (options.dateType === 'date') {\n searchDateEnd = new Date(searchDate)\n searchDateEnd.setDate(searchDateEnd.getDate() + 1)\n }\n\n if (notNullOrUndefined(searchDateEnd)) {\n filter = {\n filter: {\n and: [\n {\n [filterState.state.prop]: { gte: searchDate.toISOString() },\n },\n {\n [filterState.state.prop]: {\n lt: searchDateEnd.toISOString(),\n },\n },\n ],\n },\n variables: {},\n }\n }\n\n break\n }\n case 'gt':\n case 'lte': {\n const comparator =\n formValue.searchType === 'gt'\n ? 'gte'\n : formValue.searchType === 'lte'\n ? 'lt'\n : null\n\n let searchDateEnd\n if (options.dateType === 'datetime-local') {\n searchDateEnd = new Date(searchDate)\n searchDateEnd.setMinutes(searchDateEnd.getMinutes() + 1)\n } else if (options.dateType === 'date') {\n searchDateEnd = new Date(searchDate)\n searchDateEnd.setDate(searchDateEnd.getDate() + 1)\n }\n\n if (\n notNullOrUndefined(comparator) &&\n notNullOrUndefined(searchDateEnd)\n ) {\n filter = {\n filter: {\n and: [\n {\n [filterState.state.prop]: {\n [comparator]: searchDateEnd.toISOString(),\n },\n },\n ],\n },\n variables: {},\n }\n }\n\n break\n }\n case 'lt':\n case 'gte': {\n filter = {\n filter: {\n and: [\n {\n [filterState.state.prop]: {\n [formValue.searchType]: searchDate.toISOString(),\n },\n },\n ],\n },\n variables: {},\n }\n\n break\n }\n default:\n break\n }\n }\n } else if (\n THESEAM_COLUMNS_DATA_FILTER_DATE_RANGE_SEARCH_TYPES.includes(\n formValue.searchType,\n ) &&\n notNullOrUndefined(formValue.fromText) &&\n notNullOrUndefined(formValue.toText)\n ) {\n const fromDate = getFormattedDateForComparison(\n formValue.fromText,\n options.dateType,\n true,\n )\n const toDate = getFormattedDateForComparison(\n formValue.toText,\n options.dateType,\n true,\n )\n\n if (!isNaN(fromDate.valueOf()) && !isNaN(toDate.valueOf())) {\n let toDateEnd\n if (options.dateType === 'datetime-local') {\n toDateEnd = new Date(toDate)\n toDateEnd.setMinutes(toDateEnd.getMinutes() + 1)\n } else if (options.dateType === 'date') {\n toDateEnd = new Date(toDate)\n toDateEnd.setDate(toDateEnd.getDate() + 1)\n }\n\n if (notNullOrUndefined(toDateEnd)) {\n if (formValue.searchType === 'between') {\n filter = {\n filter: {\n and: [\n { [filterState.state.prop]: { gte: fromDate.toISOString() } },\n { [filterState.state.prop]: { lt: toDateEnd.toISOString() } },\n ],\n },\n variables: {},\n }\n } else if (formValue.searchType === 'not-between') {\n filter = {\n filter: {\n or: [\n { [filterState.state.prop]: { lt: fromDate.toISOString() } },\n { [filterState.state.prop]: { gt: toDateEnd.toISOString() } },\n ],\n },\n variables: {},\n }\n }\n }\n }\n } else if (formValue.searchType === 'blank') {\n filter = {\n filter: {\n or: [{ [filterState.state.prop]: { eq: null } }],\n },\n variables: {},\n }\n } else if (formValue.searchType === 'not-blank') {\n filter = {\n filter: {\n and: [{ [filterState.state.prop]: { neq: null } }],\n },\n variables: {},\n }\n }\n\n return filter\n}\n","import {\n ColumnsDataFilterState,\n TheSeamColumnsDataFilterNumericSearchFormState,\n THESEAM_COLUMNS_DATA_FILTER_NUMERIC_TEXT_SEARCH_TYPES,\n THESEAM_COLUMNS_DATA_FILTER_NUMERIC_RANGE_SEARCH_TYPES,\n} from '@theseam/ui-common/datatable'\nimport { isNullOrUndefined, notNullOrUndefined } from '@theseam/ui-common/utils'\nimport { FilterStateMapperResult } from './map-filter-states'\nimport { MapperContext } from './mapper-context'\n\nexport const mapSearchNumericColumnsDataFilterStateToGql = (\n filterState: ColumnsDataFilterState<TheSeamColumnsDataFilterNumericSearchFormState>,\n context: MapperContext<any>,\n): FilterStateMapperResult => {\n let filter = null\n\n if (isNullOrUndefined(filterState.state.prop)) {\n return filter\n }\n\n if (\n notNullOrUndefined(filterState.state.formValue) &&\n notNullOrUndefined(filterState.state.formValue.searchType)\n ) {\n if (\n THESEAM_COLUMNS_DATA_FILTER_NUMERIC_TEXT_SEARCH_TYPES.includes(\n filterState.state.formValue.searchType,\n ) &&\n notNullOrUndefined(filterState.state.formValue.searchText)\n ) {\n const searchNumeric = parseFloat(filterState.state.formValue.searchText)\n\n if (!isNaN(searchNumeric)) {\n filter = {\n filter: {\n and: [\n {\n [filterState.state.prop]: {\n [filterState.state.formValue.searchType]: searchNumeric,\n },\n },\n ],\n },\n variables: {},\n }\n }\n } else if (\n THESEAM_COLUMNS_DATA_FILTER_NUMERIC_RANGE_SEARCH_TYPES.includes(\n filterState.state.formValue.searchType,\n ) &&\n notNullOrUndefined(filterState.state.formValue.fromText) &&\n notNullOrUndefined(filterState.state.formValue.toText)\n ) {\n const fromNumeric = parseFloat(filterState.state.formValue.fromText)\n\n const toNumeric = parseFloat(filterState.state.formValue.toText)\n\n if (!isNaN(fromNumeric) && !isNaN(toNumeric)) {\n if (filterState.state.formValue.searchType === 'between') {\n filter = {\n filter: {\n and: [\n { [filterState.state.prop]: { gte: fromNumeric } },\n { [filterState.state.prop]: { lte: toNumeric } },\n ],\n },\n variables: {},\n }\n } else if (filterState.state.formValue.searchType === 'not-between') {\n filter = {\n filter: {\n or: [\n { [filterState.state.prop]: { lt: fromNumeric } },\n { [filterState.state.prop]: { gt: toNumeric } },\n ],\n },\n variables: {},\n }\n }\n }\n } else if (filterState.state.formValue.searchType === 'blank') {\n filter = {\n filter: {\n or: [\n { [filterState.state.prop]: { eq: null } },\n { [filterState.state.prop]: { eq: '' } },\n ],\n },\n variables: {},\n }\n } else if (filterState.state.formValue.searchType === 'not-blank') {\n filter = {\n filter: {\n and: [\n { [filterState.state.prop]: { neq: null } },\n { [filterState.state.prop]: { neq: '' } },\n ],\n },\n variables: {},\n }\n }\n }\n\n return filter\n}\n","import {\n ColumnsDataFilterState,\n TheSeamColumnsDataFilterTextSearchFormState,\n THESEAM_COLUMNS_DATA_FILTER_TEXT_TEXT_SEARCH_TYPES,\n} from '@theseam/ui-common/datatable'\nimport { isNullOrUndefined, notNullOrUndefined } from '@theseam/ui-common/utils'\nimport { FilterStateMapperResult } from './map-filter-states'\nimport { MapperContext } from './mapper-context'\n\nexport const mapSearchTextColumnsDataFilterStateToGql = (\n filterState: ColumnsDataFilterState<TheSeamColumnsDataFilterTextSearchFormState>,\n context: MapperContext<any>,\n): FilterStateMapperResult => {\n let filter = null\n\n if (isNullOrUndefined(filterState.state.prop)) {\n return filter\n }\n\n if (\n notNullOrUndefined(filterState.state.formValue) &&\n notNullOrUndefined(filterState.state.formValue.searchType)\n ) {\n if (\n THESEAM_COLUMNS_DATA_FILTER_TEXT_TEXT_SEARCH_TYPES.includes(\n filterState.state.formValue.searchType,\n ) &&\n notNullOrUndefined(filterState.state.formValue.searchText)\n ) {\n filter = {\n filter: {\n and: [\n {\n [filterState.state.prop]: {\n [filterState.state.formValue.searchType]:\n filterState.state.formValue.searchText,\n },\n },\n ],\n },\n variables: {},\n }\n } else if (filterState.state.formValue.searchType === 'blank') {\n filter = {\n filter: {\n or: [\n { [filterState.state.prop]: { eq: null } },\n { [filterState.state.prop]: { eq: '' } },\n ],\n },\n variables: {},\n }\n } else if (filterState.state.formValue.searchType === 'not-blank') {\n filter = {\n filter: {\n and: [\n { [filterState.state.prop]: { neq: null } },\n { [filterState.state.prop]: { neq: '' } },\n ],\n },\n variables: {},\n }\n }\n }\n\n return filter\n}\n","import { gql } from 'apollo-angular'\n\nexport const baseSchemaFragment = gql`\n input ComparableInt32OperationFilterInput {\n eq: Int\n neq: Int\n in: [Int!]\n nin: [Int!]\n gt: Int\n ngt: Int\n gte: Int\n ngte: Int\n lt: Int\n nlt: Int\n lte: Int\n nlte: Int\n objectContains: String\n }\n\n input StringOperationFilterInput {\n and: [StringOperationFilterInput!]\n or: [StringOperationFilterInput!]\n eq: String\n neq: String\n contains: String\n ncontains: String\n in: [String]\n nin: [String]\n startsWith: String\n nstartsWith: String\n endsWith: String\n nendsWith: String\n objectContains: String\n }\n\n input ComparableDateTimeOffsetOperationFilterInput {\n eq: DateTime\n neq: DateTime\n in: [DateTime!]\n nin: [DateTime!]\n gt: DateTime\n ngt: DateTime\n gte: DateTime\n ngte: DateTime\n lt: DateTime\n nlt: DateTime\n lte: DateTime\n nlte: DateTime\n objectContains: String\n }\n\n input BooleanOperationFilterInput {\n eq: Boolean\n neq: Boolean\n objectContains: String\n }\n\n input ComparableNullableOfDateTimeOffsetOperationFilterInput {\n eq: DateTime\n neq: DateTime\n in: [DateTime]\n nin: [DateTime]\n gt: DateTime\n ngt: DateTime\n gte: DateTime\n ngte: DateTime\n lt: DateTime\n nlt: DateTime\n lte: DateTime\n nlte: DateTime\n objectContains: String\n }\n\n enum SortEnumType {\n ASC\n DESC\n }\n\n \"\"\"\n The \\`DateTime\\` scalar represents an ISO-8601 compliant date time type.\n \"\"\"\n scalar DateTime\n\n scalar Uuid\n\n \"\"\"\n The built-in \\`Decimal\\` scalar type.\n \"\"\"\n scalar Decimal\n\n \"\"\"\n The \\`Long\\` scalar type represents non-fractional signed whole 64-bit numeric values. Long can represent values between -(2^63) and 2^63 - 1.\n \"\"\"\n scalar Long\n\n \"\"\"\n Information about the offset pagination.\n \"\"\"\n type CollectionSegmentInfo {\n \"\"\"\n Indicates whether more items exist following the set defined by the clients arguments.\n \"\"\"\n hasNextPage: Boolean!\n\n \"\"\"\n Indicates whether more items exist prior the set defined by the clients arguments.\n \"\"\"\n hasPreviousPage: Boolean!\n }\n`\n","export type WhereArg = Record<string, any>\n\n/**\n * The set of leaf-level operator keys used by HotChocolate filter inputs\n * (e.g. StringOperationFilterInput, ComparableInt32OperationFilterInput).\n * Any key not in this set is treated as a field name, causing the evaluator\n * to recurse into `value[key]`.\n */\nconst OPERATOR_KEYS = new Set([\n 'eq',\n 'neq',\n 'gt',\n 'gte',\n 'lt',\n 'lte',\n 'ngt',\n 'ngte',\n 'nlt',\n 'nlte',\n 'in',\n 'nin',\n 'contains',\n 'ncontains',\n 'startsWith',\n 'nstartsWith',\n 'endsWith',\n 'nendsWith',\n 'objectContains',\n])\n\nfunction applyOperator(operator: string, value: any, operand: any): boolean {\n switch (operator) {\n case 'eq':\n return value === operand\n case 'neq':\n return value !== operand\n case 'gt':\n return value > operand\n case 'gte':\n return value >= operand\n case 'lt':\n return value < operand\n case 'lte':\n return value <= operand\n // Negated comparisons — logical complements of the above\n case 'ngt':\n return !(value > operand) // equivalent to lte\n case 'ngte':\n return !(value >= operand) // equivalent to lt\n case 'nlt':\n return !(value < operand) // equivalent to gte\n case 'nlte':\n return !(value <= operand) // equivalent to gt\n case 'in':\n return Array.isArray(operand) && operand.includes(value)\n case 'nin':\n return Array.isArray(operand) && !operand.includes(value)\n case 'contains':\n return (\n typeof value === 'string' &&\n typeof operand === 'string' &&\n value.includes(operand)\n )\n case 'ncontains':\n return (\n typeof value === 'string' &&\n typeof operand === 'string' &&\n !value.includes(operand)\n )\n case 'startsWith':\n return (\n typeof value === 'string' &&\n typeof operand === 'string' &&\n value.startsWith(operand)\n )\n case 'nstartsWith':\n return (\n typeof value === 'string' &&\n typeof operand === 'string' &&\n !value.startsWith(operand)\n )\n case 'endsWith':\n return (\n typeof value === 'string' &&\n typeof operand === 'string' &&\n value.endsWith(operand)\n )\n case 'nendsWith':\n return (\n typeof value === 'string' &&\n typeof operand === 'string' &&\n !value.endsWith(operand)\n )\n case 'objectContains': {\n // Custom Seam/HotChocolate operator: convert the field value to a string\n // and check if it contains the operand (case-insensitive, matching search UX).\n const strValue = value == null ? '' : String(value)\n const strOperand = operand == null ? '' : String(operand)\n return strValue.toLowerCase().includes(strOperand.toLowerCase())\n }\n default:\n throw new Error(`Unknown filter operator: \"${operator}\"`)\n }\n}\n\n/**\n * Recursively evaluates a HotChocolate-style filter against a value.\n *\n * Rules:\n * - `and` array: all sub-filters must pass (AND logic)\n * - `or` array: at least one sub-filter must pass (OR logic)\n * - Known operator keys (`eq`, `contains`, `gt`, ...): apply the operator to\n * the current `value`\n * - Any other key: treat as a field name; recurse with `value[key]` and the\n * nested filter\n * - All non-`and`/`or` conditions are implicitly ANDed together\n */\nfunction evaluateCondition(value: any, filter: any): boolean {\n if (filter === null || filter === undefined) {\n return true\n }\n\n if (Array.isArray(filter.and)) {\n if (!filter.and.every((f: any) => evaluateCondition(value, f))) {\n return false\n }\n }\n\n if (Array.isArray(filter.or)) {\n if (!filter.or.some((f: any) => evaluateCondition(value, f))) {\n return false\n }\n }\n\n for (const key of Object.keys(filter)) {\n if (key === 'and' || key === 'or') {\n continue\n }\n\n if (OPERATOR_KEYS.has(key)) {\n if (!applyOperator(key, value, filter[key])) {\n return false\n }\n } else {\n if (!evaluateCondition(value?.[key], filter[key])) {\n return false\n }\n }\n }\n\n return true\n}\n\n/**\n * Filters an array using a HotChocolate-style where clause.\n *\n * Top-level field conditions are implicitly ANDed. Use `and`/`or` arrays for\n * explicit logical grouping.\n *\n * @example\n * filterWhere(records, { name: { contains: 'foo' }, id: { gt: 5 } })\n * filterWhere(records, { or: [{ name: { eq: 'a' } }, { name: { eq: 'b' } }] })\n */\nexport function filterWhere<T>(data: T[], where: WhereArg): T[] {\n return data.filter((item) => evaluateCondition(item, where))\n}\n","export function skipAndTake<T>(data: T[], skip: number, take: number): T[] {\n if (skip < 0) {\n throw Error(`Invalid 'skip' value: ${skip}`)\n }\n\n // if (take > data.length) {\n // throw Error(`Invalid 'take' value: ${take}`)\n // }\n\n const tmp: T[] = []\n for (let i = skip; i < take + skip && i < data.length; i++) {\n tmp.push(data[i])\n }\n\n return tmp\n}\n","/**\n * A single sort clause in HotChocolate's order format.\n * Each object has exactly one key: the field name, with a value of 'ASC' or 'DESC'.\n *\n * @example { memberOrganizationName: 'ASC' }\n */\nexport type SortClause = Record<string, 'ASC' | 'DESC'>\n\n/**\n * Sorts an array by a HotChocolate-style `order` argument.\n *\n * Earlier entries in the array take higher sort precedence. When two records\n * are equal on all sort clauses they retain their original relative order\n * (stable sort).\n *\n * Handles strings (locale-aware), numbers/dates, booleans, and null/undefined\n * values (nulls sort last for both ASC and DESC).\n *\n * @example\n * sortItems(records, [{ name: 'ASC' }, { id: 'DESC' }])\n */\nexport function sortItems<T>(items: T[], order: SortClause[]): T[] {\n if (!order || order.length === 0) {\n return items\n }\n\n return [...items].sort((a, b) => {\n for (const clause of order) {\n const entries = Object.entries(clause)\n if (entries.length === 0) {\n continue\n }\n\n const [field, direction] = entries[0]\n const aVal = (a as any)[field]\n const bVal = (b as any)[field]\n\n // Nulls always sort last regardless of direction — check before inverting.\n const aNull = aVal == null\n const bNull = bVal == null\n if (aNull && bNull) continue\n if (aNull) return 1\n if (bNull) return -1\n\n const comparison = _compareNonNullValues(aVal, bVal)\n if (comparison !== 0) {\n return direction === 'DESC' ? -comparison : comparison\n }\n }\n\n return 0\n })\n}\n\nfunction _compareNonNullValues(a: any, b: any): number {\n if (typeof a === 'string' && typeof b === 'string') {\n return a.localeCompare(b)\n }\n\n if (a < b) return -1\n if (a > b) return 1\n return 0\n}\n","import { filterWhere, WhereArg } from './filter-where'\nimport { skipAndTake } from './skip-and-take'\nimport { sortItems, SortClause } from './sort-items'\n\nexport interface FilteredResultsPageInfo {\n hasNextPage: boolean\n hasPreviousPage: boolean\n}\n\nexport interface FilteredResults<T> {\n items: T[]\n pageInfo: FilteredResultsPageInfo\n totalCount: number\n}\n\nexport function filteredResults<T>(items: T[], args: any): FilteredResults<T> {\n let _items = items\n const where: WhereArg = args?.where\n if (where !== undefined) {\n _items = filterWhere(_items, where)\n }\n\n const order: SortClause[] = args?.order\n if (order !== undefined) {\n _items = sortItems(_items, order)\n }\n\n const totalCount = _items.length\n\n const skip = args?.skip ?? 0\n const take = args?.take ?? _items.length\n if (args?.skip !== undefined || args?.take !== undefined) {\n _items = skipAndTake(_items, skip, take)\n }\n\n const pageInfo: FilteredResultsPageInfo = {\n hasNextPage: skip + take < totalCount,\n hasPreviousPage: skip > 0,\n }\n\n return {\n items: _items,\n pageInfo,\n totalCount,\n }\n}\n","import { EventEmitter } from '@angular/core'\nimport { BehaviorSubject, Observable } from 'rxjs'\n\nimport { DataFilterState } from '@theseam/ui-common/data-filters'\nimport {\n SortEvent,\n SortItem,\n TheSeamPageInfo,\n} from '@theseam/ui-common/datatable'\n\nimport { GqlDatatableAccessor } from '../models'\n\nexport class MockDatatable implements GqlDatatableAccessor {\n private readonly _filterStatesSubject = new BehaviorSubject<\n DataFilterState[]\n >([])\n\n private _sorts: SortItem[] = []\n private _rows: any[] = []\n private _offset = 0\n private _rowHeight = 50\n private _bodyHeight = 500\n private _scrolledPosV = 0\n\n page = new EventEmitter<TheSeamPageInfo>()\n resize = new EventEmitter<any>()\n externalSorting = false\n\n sort: EventEmitter<SortEvent> = new EventEmitter<SortEvent>()\n get sorts(): SortItem[] {\n return this._sorts\n }\n set sorts(value: SortItem[]) {\n this._sorts = value\n }\n\n get pageInfo(): TheSeamPageInfo {\n return this.ngxDatatable\n }\n\n public readonly filterStates: Observable<DataFilterState[]> =\n this._filterStatesSubject.asObservable()\n\n static pageDefaults(dt: any, defaultPageSize: number = 20): TheSeamPageInfo {\n return {\n offset: (dt as any).ngxDatatable?.offset ?? 0,\n pageSize: (dt as any).ngxDatatable?.pageSize ?? defaultPageSize,\n limit: (dt as any).ngxDatatable?.limit,\n count: (dt as any).ngxDatatable?.count ?? 0,\n }\n }\n\n get ngxDatatable(): {\n offset: number\n pageSize: number\n limit?: number\n count: number\n } {\n return {\n offset: this.getPage(),\n pageSize: this.getPageSize(),\n count: this._rows.length,\n }\n }\n\n setSorts(v: SortItem[]): void {\n this._sorts = v\n this.sort.emit({ sorts: this._sorts })\n }\n\n setFilterStates(v: DataFilterState[]): void {\n this._filterStatesSubject.next(v)\n }\n\n getNumPages(): number {\n if (this._rows.length === 0) {\n return 1\n }\n const t = Math.ceil(this._rows.length / this.getPageSize())\n if (t <= 0) {\n return 1\n }\n return t\n }\n\n _calcPage(): number {\n // This page calculation could most likely be simplified.\n const bodyHeight = this._rowHeight * this.getPageSize()\n const visibleHeight = this._bodyHeight + this._scrolledPosV\n const pages = Math.floor(visibleHeight / bodyHeight)\n const overflow = visibleHeight - pages * bodyHeight\n const page = overflow > 1 ? pages + 1 : pages\n return page - 1\n }\n\n _calcScrolledPosV(): number {\n return this._offset * this._rowHeight\n }\n\n getPage(): number {\n return this._offset\n }\n\n setPage(v: number): void {\n let _v = v\n if (_v === this.getPage()) {\n return\n }\n\n if (_v > this.getNumPages() - 1) {\n // Should this throw an error instead?\n _v = this.getNumPages() - 1\n }\n\n this._offset = _v\n this._scrolledPosV = this._calcScrolledPosV()\n this.page.emit(this.ngxDatatable)\n }\n\n getPageSize(): number {\n return Math.floor(this._bodyHeight / this._rowHeight)\n }\n\n setRows(v: any[]): void {\n this._rows = v\n }\n\n setScrolledPosV(v: number): void {\n if (this._scrolledPosV === v) {\n return\n }\n const pageBefore = this.getPage()\n this._scrolledPosV = v\n this._offset = this._calcPage()\n if (this.getPage() !== pageBefore) {\n this.page.emit(this.ngxDatatable)\n }\n }\n\n /**\n * Returns the height of a row.\n *\n * NOTE: This will not be accurate if your rows do not use a single fixed\n * height for each row.\n */\n getRowHeight() {\n return this._rowHeight\n }\n}\n","import { notNullOrUndefined } from '@theseam/ui-common/utils'\n\nexport function checkRecordsHaveValue(\n arr: any[] | null,\n indices: (number | [startIndex: number, endIndex: number])[],\n testValueCheckProp: string | null = 'name',\n onlyCheckProvidedIndices: boolean = false,\n): void {\n if (indices.length > 0 && !Array.isArray(arr)) {\n throw Error(`Records array should be defined.`)\n }\n\n if (!Array.isArray(arr)) {\n return\n }\n\n for (let i = 0; i < arr.length; i++) {\n const item = arr[i]\n if (_isOneOfIndices(indices, i)) {\n if (!notNullOrUndefined(arr[i])) {\n throw Error(`Record at index '${i}' should be defined.`)\n }\n if (notNullOrUndefined(testValueCheckProp)) {\n const actualValue = item[testValueCheckProp]\n const expectedValue = `Item_${i}`\n if (actualValue !== expectedValue) {\n throw Error(\n `Record at index '${i}' should be '${expectedValue}', but is '${actualValue}'`,\n )\n }\n }\n } else {\n if (!onlyCheckProvidedIndices) {\n const isItemDefined = notNullOrUndefined(testValueCheckProp)\n ? notNullOrUndefined(item?.[testValueCheckProp])\n : notNullOrUndefined(item)\n if (isItemDefined) {\n throw Error(`Record at index '${i}' should not be defined.`)\n }\n }\n }\n }\n}\n\n/**\n * NOTE: This is a very niave implementation that could be improved.\n */\nfunction _isOneOfIndices(\n indices: (number | [startIndex: number, endIndex: number])[],\n index: number,\n): boolean {\n for (const r of indices) {\n if (Array.isArray(r)) {\n if (index >= r[0] && index <= r[1]) {\n return true\n }\n } else {\n if (index === r) {\n return true\n }\n }\n }\n\n return false\n}\n","import { ApolloLink, Observable, Operation } from '@apollo/client/core'\n\nexport interface MockGraphQLLinkOptions {\n resolve: (operation: Operation) => any\n delay?: number\n}\n\nexport function mockGraphQLLink(options: MockGraphQLLinkOptions) {\n return new ApolloLink((operation, forward) => {\n return new Observable((subscriber) => {\n const execute = () => {\n const response = options.resolve(operation)\n operation.setContext({ response })\n subscriber.next(response)\n subscriber.complete()\n }\n\n if (options.delay && options.delay > 0) {\n const timeoutId = setTimeout(execute, options.delay)\n return () => clearTimeout(timeoutId)\n }\n\n execute()\n return () => {}\n })\n })\n}\n","import { concat, InMemoryCache, Operation } from '@apollo/client'\nimport { provideApollo } from 'apollo-angular'\nimport { Provider } from '@angular/core'\n\nimport { queryProcessingLink } from '../apollo-links/query-processing-link'\nimport { mockGraphQLLink } from './mock-graphql-link'\n\nexport interface MockApolloTestingProviderOptions {\n resolve: (operation: Operation) => any\n delay?: number\n}\n\n/**\n * Creates Apollo providers configured like our apps, except with the Apollo\n * HttpLink replaced with a mock link that delegates to a `resolve` callback.\n * No GraphQL schema is required — the resolve function returns the response\n * directly, typically using `filteredResults` for sorting/filtering/paging.\n */\nexport function createMockApolloTestingProvider(\n options: MockApolloTestingProviderOptions,\n): Provider {\n return provideApollo(() => ({\n cache: new InMemoryCache(),\n link: concat(\n queryProcessingLink,\n mockGraphQLLink({\n resolve: options.resolve,\n delay: options.delay,\n }),\n ),\n defaultOptions: {\n watchQuery: {\n fetchPolicy: 'cache-and-network',\n errorPolicy: 'ignore',\n },\n query: {\n fetchPolicy: 'network-only',\n errorPolicy: 'all',\n },\n },\n }))\n}\n","import { gql } from 'apollo-angular'\n\nimport { filteredResults } from '../filtered-results'\n\nexport interface SimpleGqlTestRecord {\n id: number\n name: string\n}\n\nexport function createSimpleGqlTestRecord(num: number): SimpleGqlTestRecord {\n return { id: num, name: `Item_${num}` }\n}\n\nexport function createSimpleGqlTestRoot(numRecords: number) {\n const _records: SimpleGqlTestRecord[] = []\n for (let i = 0; i < numRecords; i++) {\n _records.push(createSimpleGqlTestRecord(i))\n }\n\n return {\n simpleGqlTestRecords: (args?: any) => filteredResults([..._records], args),\n }\n}\n\nexport const SIMPLE_GQL_TEST_QUERY = gql`\n query ExampleQuery(\n $skip: Int\n $take: Int\n $order: [SimpleGqlTestRecordSortInput!]\n $where: SimpleGqlTestRecordFilterInput\n ) {\n simpleGqlTestRecords(\n skip: $skip\n take: $take\n order: $order\n where: $where\n ) {\n items {\n id\n name\n }\n totalCount\n }\n }\n`\n\n/**\n * Like {@link SIMPLE_GQL_TEST_QUERY} but includes `$search: String` for use\n * with search filters that inline a `gqlVar('search')` reference via\n * `queryProcessingConfig.variables.inline`.\n */\nexport const SIMPLE_GQL_TEST_SEARCH_QUERY = gql`\n query ExampleQuery(\n $skip: Int\n $take: Int\n $order: [SimpleGqlTestRecordSortInput!]\n $where: SimpleGqlTestRecordFilterInput\n $search: String\n ) {\n simpleGqlTestRecords(\n skip: $skip\n take: $take\n order: $order\n where: $where\n ) {\n items {\n id\n name\n }\n totalCount\n }\n }\n`\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface SimpleGqlTestExtraVariables {}\n\nexport interface SimpleGqlTestVariables extends SimpleGqlTestExtraVariables {\n skip?: number\n take?: number\n order?: Partial<Record<keyof SimpleGqlTestRecord, 'ASC' | 'DESC'>>[]\n where?: any\n search?: string\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["visit","BREAK","Observable"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"theseam-ui-common-graphql.mjs","sources":["../../../projects/ui-common/graphql/apollo-links/log-query-link.ts","../../../projects/ui-common/graphql/models/direction.ts","../../../projects/ui-common/graphql/models/hints-kind.ts","../../../projects/ui-common/graphql/models/query-processing-config.ts","../../../projects/ui-common/graphql/models/variable.ts","../../../projects/ui-common/graphql/utils/contains-variable.ts","../../../projects/ui-common/graphql/utils/gql-var.ts","../../../projects/ui-common/graphql/utils/inline-variables.ts","../../../projects/ui-common/graphql/utils/parse-comments.ts","../../../projects/ui-common/graphql/utils/parse-hints.ts","../../../projects/ui-common/graphql/utils/remove-variable-definition.ts","../../../projects/ui-common/graphql/utils/remove-variable-definitions-not-defined.ts","../../../projects/ui-common/graphql/utils/remove-variable.ts","../../../projects/ui-common/graphql/utils/to-gql.ts","../../../projects/ui-common/graphql/utils/hints-tokens-containing-hint.ts","../../../projects/ui-common/graphql/hints/transformers/inline-variable.transformer.ts","../../../projects/ui-common/graphql/hints/transformers/remove-not-defined.transformer.ts","../../../projects/ui-common/graphql/hints/inline-variable.hint-def.ts","../../../projects/ui-common/graphql/hints/remove-not-defined.hint-def.ts","../../../projects/ui-common/graphql/hints/index.ts","../../../projects/ui-common/graphql/apollo-links/query-processing-link.ts","../../../projects/ui-common/graphql/datatable/create-sorts-mapper.ts","../../../projects/ui-common/graphql/datatable/get-page-info.ts","../../../projects/ui-common/graphql/datatable/create-page-info-observable.ts","../../../projects/ui-common/graphql/datatable/map-filter-states.ts","../../../projects/ui-common/graphql/datatable/map-page-info.ts","../../../projects/ui-common/graphql/datatable/datatable-helpers.ts","../../../projects/ui-common/graphql/datatable/datatable-graphql-query-ref.ts","../../../projects/ui-common/graphql/datatable/datatable-graphql.service.ts","../../../projects/ui-common/graphql/datatable/map-search-date-columns-data-filter-state-to-gql.ts","../../../projects/ui-common/graphql/datatable/map-search-numeric-columns-data-filter-state-to-gql.ts","../../../projects/ui-common/graphql/datatable/map-search-text-columns-data-filter-state-to-gql.ts","../../../projects/ui-common/graphql/testing/base-schema-fragment.ts","../../../projects/ui-common/graphql/testing/filter-where.ts","../../../projects/ui-common/graphql/testing/skip-and-take.ts","../../../projects/ui-common/graphql/testing/sort-items.ts","../../../projects/ui-common/graphql/testing/filtered-results.ts","../../../projects/ui-common/graphql/testing/mock-datatable.ts","../../../projects/ui-common/graphql/testing/check-records-have-value.ts","../../../projects/ui-common/graphql/testing/mock-graphql-link.ts","../../../projects/ui-common/graphql/testing/create-mock-apollo-testing-provider.ts","../../../projects/ui-common/graphql/testing/data/simple-gql-test-data.ts","../../../projects/ui-common/graphql/theseam-ui-common-graphql.ts"],"sourcesContent":["import { ApolloLink } from '@apollo/client/core'\nimport { print } from 'graphql'\n\nexport interface LogQueryLinkOptions {\n beforeStyles?: string\n afterStyles?: string\n}\n\n/**\n * Wraps an Apollo link and logs the operation state immediately before and\n * after the wrapped link processes it.\n *\n * Useful for inspecting what `queryProcessingLink` does to a query:\n *\n * ```ts\n * link: concat(\n * logQueryLink(queryProcessingLink),\n * httpLink,\n * )\n * ```\n *\n * The output uses `console.log` with optional CSS styles so each snapshot\n * is easy to distinguish in the browser console. Tree-shaking will remove\n * this from production builds when it is not imported.\n */\nexport function logQueryLink(\n inner: ApolloLink,\n options?: LogQueryLinkOptions,\n): ApolloLink {\n const beforeStyles = options?.beforeStyles ?? 'color: cyan'\n const afterStyles = options?.afterStyles ?? 'color: limegreen'\n\n const beforeLink = new ApolloLink((operation, forward) => {\n // eslint-disable-next-line no-console\n console.log(\n `%c~~~BEFORE\\n${print(operation.query)}\\n${JSON.stringify(operation.variables, null, 2)}`,\n beforeStyles,\n )\n return forward(operation)\n })\n\n const afterLink = new ApolloLink((operation, forward) => {\n // eslint-disable-next-line no-console\n console.log(\n `%c~~~AFTER\\n${print(operation.query)}\\n${JSON.stringify(operation.variables, null, 2)}`,\n afterStyles,\n )\n return forward(operation)\n })\n\n return ApolloLink.from([beforeLink, inner, afterLink])\n}\n","export class GQLDirection {\n constructor(public readonly direction: string) {}\n public static readonly ASC = new GQLDirection('ASC')\n public static readonly DESC = new GQLDirection('DESC')\n}\n","import { Kind } from 'graphql'\n\nexport enum HintsKind {\n OperationDefinition = Kind.OPERATION_DEFINITION,\n Field = Kind.FIELD,\n VariableDefinition = Kind.VARIABLE_DEFINITION,\n Variable = Kind.VARIABLE,\n Argument = Kind.ARGUMENT,\n}\n","export const DEFAULT_TO_REMOVE_ON_UNDEFINED = ['where', 'order']\n\nexport interface QueryProcessingVariablesConfig {\n removeIfNotDefined?: string[]\n removeIfNotUsed?: string[]\n inline?: string[]\n}\n\nexport interface QueryProcessingConfig {\n variables: QueryProcessingVariablesConfig\n\n /**\n * If skip and take are found, they will be removed\n */\n disablePaging?: boolean\n}\n","export class GQLVariable {\n constructor(\n public readonly name: string,\n public readonly type: string,\n ) {}\n}\n","import { BREAK, DocumentNode, ValueNode, visit } from 'graphql/language'\n\nexport function containsVariable(\n node: DocumentNode | ValueNode,\n variableName: string,\n) {\n let found = false\n\n visit(node, {\n Variable(variable) {\n if (variableName === variable.name.value) {\n found = true\n return BREAK\n }\n },\n })\n\n return found\n}\n","export function gqlVar(varName: string): { gqlVar: string } {\n return { gqlVar: `$${varName}` }\n}\n","import { isDevMode } from '@angular/core'\n\nimport { hasProperty } from '@theseam/ui-common/utils'\nimport { BREAK, DocumentNode, ValueNode, visit } from 'graphql'\n\nexport function inlineVariable(\n query: DocumentNode,\n variableName: string,\n variableValue: ValueNode,\n): DocumentNode {\n // return visit(query, {\n // VariableDefinition(node) {\n // if (variableName === node.variable.name.value) {\n // console.log(node)\n // // found = true\n // console.log('insert', variableValue)\n // // return BREAK\n\n // // node.defaultValue = variableValue\n // return {\n // ...node,\n // defaultValue: variableValue\n // }\n // }\n // }\n // })\n\n // console.log('~inlineVariable', variableName, variableValue)\n\n // TODO: Decide if this is a good solution.\n if (\n hasProperty(variableValue as any, 'value') &&\n (variableValue as any).value === 'undefined'\n ) {\n if (isDevMode()) {\n // eslint-disable-next-line no-console\n console.warn(\n `Ignoring attempt to inline '${variableName}', because it is undefined.`,\n )\n }\n return visit(query, {\n SelectionSet(selectionSetNode) {\n return visit(selectionSetNode, {\n Variable(variableNode) {\n if (variableName === variableNode.name.value) {\n return null\n }\n },\n })\n },\n })\n }\n\n return visit(query, {\n SelectionSet(selectionSetNode) {\n return visit(selectionSetNode, {\n Variable(variableNode) {\n if (variableName === variableNode.name.value) {\n return variableValue\n }\n },\n })\n },\n })\n}\n","import { DocumentNode, Token } from 'graphql/language'\n\n// Based on Prettier's comment parsing.\n//\n// Source: https://github.com/prettier/prettier/blob/4e46f92b8648c7f25de62bfaf4368aa3f2e588d9/src/language-graphql/parser-graphql.js#L6\nexport function parseComments(ast: DocumentNode): Token[] {\n const comments: Token[] = []\n\n if (ast.loc === undefined) {\n return comments\n }\n\n const startToken = ast.loc.startToken\n let next = startToken.next\n while (next !== null && next.kind !== '<EOF>') {\n if (next.kind === 'Comment') {\n Object.assign(next, {\n // The Comment token's column starts _after_ the `#`,\n // but we need to make sure the node captures the `#`\n column: next.column - 1,\n })\n comments.push(next)\n }\n next = next.next\n }\n\n return comments\n}\n","import {\n ArgumentNode,\n BREAK,\n DocumentNode,\n FieldNode,\n OperationDefinitionNode,\n parse,\n Token,\n VariableDefinitionNode,\n VariableNode,\n visit,\n} from 'graphql'\n\nimport { notNullOrUndefined } from '@theseam/ui-common/utils'\n\nimport { HintsKind, HintsToken } from '../models'\nimport { parseComments } from './parse-comments'\n\nexport const HINT_PREFIX_REGEX = /^\\s*@gql-hint:.+/\nexport const HINT_NAMES_CAPTURE_REGEX = /^\\s*@gql-hint:([a-zA-z-\\d\\s]+)$/\n\n/**\n * If AST loc has startToken prop then return same AST else reparse with config\n * to contain comments and loc at each node.\n */\nexport function parseAst(ast: DocumentNode): DocumentNode {\n if (ast.loc === undefined) {\n throw Error(`Expected AST to have loc.`)\n }\n\n if (ast.loc.startToken !== undefined) {\n return ast\n }\n\n return parse(ast.loc.source)\n}\n\nexport function isCommentToken(token: Token): boolean {\n return token.kind === 'Comment'\n}\n\nexport function isHintToken(token: Token): boolean {\n return (\n (isCommentToken(token) &&\n (token.value?.match(HINT_PREFIX_REGEX)?.length || 0) > 0) ||\n false\n )\n}\n\nexport function isInlineComment(token: Token): boolean {\n return (\n isCommentToken(token) &&\n token.prev !== null &&\n token.prev.line === token.line\n )\n}\n\nexport function hintNamesFromHintToken(token: Token): string[] {\n const grp = token.value?.match(HINT_NAMES_CAPTURE_REGEX)\n if (grp === null || grp === undefined || grp.length === 0) {\n return []\n }\n return grp[1]\n .split(' ')\n .map((x) => x.trim())\n .filter((x) => x.length > 0)\n}\n\nexport function getTokenAppliesTo(token: Token): Token | null {\n if (isInlineComment(token)) {\n return token.prev\n }\n\n let t = token.next\n if (t?.kind === '$' && t.next?.kind === 'Name') {\n t = t.next\n }\n return t\n}\n\nexport function createHintsToken(\n token: Token,\n node: HintsToken['node'],\n kind: HintsKind,\n): HintsToken {\n return {\n node,\n hints: hintNamesFromHintToken(token),\n kind,\n }\n}\n\nexport function getHintsToken(\n token: Token,\n ast: DocumentNode,\n): HintsToken | null {\n // console.log('getHintsToken', token)\n const appliesTo = getTokenAppliesTo(token)\n if (appliesTo === null) {\n return null\n }\n\n let appliesToNode: HintsToken | null = null\n visit(ast, {\n OperationDefinition(node: OperationDefinitionNode) {\n if (node.loc?.start === appliesTo.start) {\n appliesToNode = createHintsToken(\n token,\n node,\n HintsKind.OperationDefinition,\n )\n return BREAK\n }\n },\n VariableDefinition(node: VariableDefinitionNode) {\n if (node.variable.name.loc?.start === appliesTo.start) {\n appliesToNode = createHintsToken(\n token,\n node,\n HintsKind.VariableDefinition,\n )\n return BREAK\n }\n },\n Variable(node: VariableNode) {\n if (node.name.loc?.start === appliesTo.start) {\n appliesToNode = createHintsToken(token, node, HintsKind.Variable)\n return BREAK\n }\n },\n Argument(node: ArgumentNode) {\n if (node.name.loc?.start === appliesTo.start) {\n appliesToNode = createHintsToken(token, node, HintsKind.Argument)\n return BREAK\n }\n },\n Field(node: FieldNode) {\n if (node.name.loc?.start === appliesTo.start) {\n appliesToNode = createHintsToken(token, node, HintsKind.Field)\n return BREAK\n }\n },\n })\n return appliesToNode\n}\n\nexport function parseHints(ast: DocumentNode): HintsToken[] {\n const _ast = parseAst(ast)\n // console.log('_ast', _ast)\n return parseComments(_ast)\n .filter(isHintToken)\n .map((r) => getHintsToken(r, _ast))\n .filter(notNullOrUndefined)\n}\n","import { DocumentNode, visit } from 'graphql'\n\nexport function removeVariableDefinition(\n query: DocumentNode,\n variableName: string,\n): DocumentNode {\n return visit(query, {\n VariableDefinition: {\n enter(variable) {\n const name = variable.variable.name.value\n if (name === variableName) {\n return null\n }\n },\n },\n })\n}\n","import { Operation } from '@apollo/client'\nimport { DocumentNode, OperationDefinitionNode, visit } from 'graphql'\n\nimport { isNullOrUndefined } from '@theseam/ui-common/utils'\n\nexport function removeVariableDefinitionsNotDefined(\n query: DocumentNode,\n node: OperationDefinitionNode,\n variables: Operation['variables'],\n) {\n return visit(query, {\n OperationDefinition(opDef) {\n if (opDef === node) {\n return visit(opDef, {\n VariableDefinition(varDef) {\n const name = varDef.variable.name.value\n if (isNullOrUndefined(variables[name])) {\n return null\n }\n },\n })\n }\n },\n })\n}\n","import { DocumentNode, visit } from 'graphql'\n\nexport function removeVariable(\n query: DocumentNode,\n variableName: string,\n): DocumentNode {\n return visit(query, {\n VariableDefinition: {\n enter(variable) {\n const name = variable.variable.name.value\n if (name === variableName) {\n return null\n }\n },\n },\n Argument: {\n enter(variable) {\n const name = variable.name.value\n if (name === variableName) {\n return null\n }\n },\n },\n })\n}\n","import { GQLDirection } from '../models'\n\n// Naive initial implementation. This is intended for dynamic values, such as\n// sorting and filtering. If you are defining a schema, use the gql template\n// function from 'apollo-angular'.\n//\n// TODO: Try to find a maintained library that will handle this. Ideally a\n// type-safe one, but that is becoming surprisingly harder to find than I\n// expected for GraphQL.\nexport function toGQL(json: any): string {\n // Handle primitive top-level values so callers can pass non-objects (e.g.\n // when inlining a String or Int variable directly into a query argument).\n if (json === null || json === undefined) {\n return 'null'\n }\n if (typeof json === 'string') {\n return `\"${json}\"`\n }\n if (typeof json === 'number' || typeof json === 'boolean') {\n return `${json}`\n }\n if (json instanceof GQLDirection) {\n return `${json.direction}`\n }\n if (Array.isArray(json)) {\n return `[${json.map((v) => toGQL(v)).join(',')}]`\n }\n\n const props: string[] = Object.keys(json).map((prop) => {\n const value = json[prop]\n let resultValue: string | undefined\n if (typeof value === 'string') {\n resultValue = `\"${value}\"`\n } else if (value instanceof GQLDirection) {\n resultValue = `${value.direction}`\n } else if (Array.isArray(value)) {\n resultValue = `[${value.map((v) => toGQL(v)).join(',')}]`\n } else if (typeof value === 'object') {\n if (Object.prototype.hasOwnProperty.call(value, 'gqlVar')) {\n resultValue = `${value.gqlVar}`\n } else {\n resultValue = toGQL(value)\n }\n } else {\n resultValue = `${value}`\n }\n if (typeof resultValue !== 'string') {\n throw Error(`Unexpected value.`)\n }\n return `${prop}: ${resultValue}`\n })\n return `{${props.join(', ')}}`\n}\n","import { HintsToken } from '../models'\n\nexport function hintsTokensContainingHint(\n hintsTokens: HintsToken[],\n hint: string,\n): HintsToken[] {\n return hintsTokens.filter((r) => r.hints.indexOf(hint) !== -1)\n}\n","import { parseValue, VariableDefinitionNode, VariableNode } from 'graphql'\n\nimport { withoutProperty } from '@theseam/ui-common/utils'\n\nimport {\n HintsKind,\n HintsToken,\n HintTransformer,\n HintTransformOperation,\n} from '../../models'\nimport { inlineVariable, removeVariableDefinition, toGQL } from '../../utils'\n\n/**\n * Inlines the variable's current value directly into the query AST and removes\n * the variable definition from the parameter list. The variable is also\n * removed from the operation's variables map so it is not sent to the server.\n *\n * Applies to VariableDefinition (comment above the `$var` in the parameter\n * list) or Variable (inline comment beside a `$var` usage in the query body).\n */\nexport const inlineVariableTransformer: HintTransformer = (\n operation: HintTransformOperation,\n hintsToken: HintsToken,\n): HintTransformOperation => {\n let varName: string | null = null\n\n if (hintsToken.kind === HintsKind.VariableDefinition) {\n varName = (hintsToken.node as VariableDefinitionNode).variable.name.value\n } else if (hintsToken.kind === HintsKind.Variable) {\n varName = (hintsToken.node as VariableNode).name.value\n }\n\n if (varName === null) {\n return operation\n }\n\n const varValue = operation.variables[varName]\n const newVariables = withoutProperty(operation.variables, varName)\n let query = removeVariableDefinition(operation.query, varName)\n query = inlineVariable(query, varName, parseValue(toGQL(varValue)))\n\n return { query, variables: newVariables }\n}\n","import { OperationDefinitionNode } from 'graphql'\n\nimport { isNullOrUndefined } from '@theseam/ui-common/utils'\n\nimport {\n HintsToken,\n HintTransformer,\n HintTransformOperation,\n} from '../../models'\nimport { removeVariable } from '../../utils'\n\n/**\n * Removes every variable from the query that is null or undefined in the\n * operation's variables map. Both the variable definition (from the parameter\n * list) and any argument usages in the query body are removed so the resulting\n * document remains valid.\n */\nexport const removeNotDefinedTransformer: HintTransformer = (\n operation: HintTransformOperation,\n hintsToken: HintsToken,\n): HintTransformOperation => {\n const operationNode = hintsToken.node as OperationDefinitionNode\n\n const undefinedVarNames = (operationNode.variableDefinitions ?? [])\n .filter((varDef) =>\n isNullOrUndefined(operation.variables[varDef.variable.name.value]),\n )\n .map((varDef) => varDef.variable.name.value)\n\n let query = operation.query\n for (const varName of undefinedVarNames) {\n query = removeVariable(query, varName)\n }\n\n return { query, variables: operation.variables }\n}\n","import { HintDefinition, HintsKind } from '../models'\nimport { inlineVariableTransformer } from './transformers/inline-variable.transformer'\n\n/**\n * Maps variable value to gql and inlines it into the query.\n */\nexport const inlineVariableHintDef: HintDefinition = {\n name: 'inline-variable',\n appliesTo: [HintsKind.Variable, HintsKind.VariableDefinition],\n transformer: inlineVariableTransformer,\n}\n","import { HintDefinition, HintsKind } from '../models'\nimport { removeNotDefinedTransformer } from './transformers/remove-not-defined.transformer'\n\n/**\n * Remove the variable from the query if it is not defined in the operation\n * variables.\n */\nexport const removeNotDefinedHintDef: HintDefinition = {\n name: 'remove-not-defined',\n appliesTo: [HintsKind.OperationDefinition],\n transformer: removeNotDefinedTransformer,\n}\n","// /**\n// * Remove the variable from the query if it is not defined in the operation\n// * variables.\n// *\n// * Applies to: OperationDefinition\n// */\n// export const GQL_HINT_REMOVE_NOT_DEFINED = 'remove-not-defined'\n\n// /**\n// * Maps variable value to gql and inlines it into the query.\n// *\n// * Applies to: Variable, VariableDefinition\n// */\n// export const GQL_HINT_INLINE_VARIABLE = 'inline-variable'\n\n// /**\n// * Remove variable definition from the query if it is not used by the operation.\n// *\n// * Applies to: VariableDefinition\n// */\n// // export const GQL_HINT_REMOVE_IF_NOT_USED = 'remove-if-not-used'\n\n// export const GQL_HINTS = [\n// // GQL_HINT_REMOVE_IF_NOT_USED,\n// GQL_HINT_REMOVE_NOT_DEFINED,\n// GQL_HINT_INLINE_VARIABLE\n// ]\n\nexport * from './transformers/inline-variable.transformer'\nexport * from './transformers/remove-not-defined.transformer'\n\nexport * from './inline-variable.hint-def'\nexport * from './remove-not-defined.hint-def'\n","import { ApolloLink } from '@apollo/client/core'\nimport { isNullOrUndefined, withoutProperty } from '@theseam/ui-common/utils'\nimport { parseValue } from 'graphql'\n\nimport { inlineVariableHintDef, removeNotDefinedHintDef } from '../hints'\nimport { QueryProcessingConfig } from '../models'\nimport {\n containsVariable,\n hintsTokensContainingHint,\n inlineVariable,\n parseAst,\n parseHints,\n removeVariable,\n removeVariableDefinition,\n toGQL,\n} from '../utils'\n\n/**\n * Apollo link that transforms GraphQL operations before they are sent.\n *\n * Two mechanisms are supported and can be combined freely:\n *\n * **Hint-based** — place `# @gql-hint: <name>` comments directly in the query.\n * Supported hints:\n * - `remove-not-defined` on the operation definition: removes every variable\n * whose value is null/undefined (definition + argument usage).\n * - `inline-variable` on a variable definition or usage: substitutes the\n * variable's current value directly into the query AST and removes it from\n * the variables map.\n *\n * **Config-based** — pass a `QueryProcessingConfig` via Apollo context under\n * the key `queryProcessingConfig`. Supported options:\n * - `variables.removeIfNotDefined`: remove named variables when null/undefined.\n * - `variables.removeIfNotUsed`: remove named variable definitions when the\n * variable is not referenced anywhere in the (possibly already-transformed)\n * query body.\n * - `variables.inline`: inline named variables into the query AST.\n *\n * Hints are applied first, then config-based processing.\n */\nexport const queryProcessingLink = new ApolloLink((operation, forward) => {\n const context = operation.getContext()\n const queryProcessingConfig: QueryProcessingConfig =\n context.queryProcessingConfig ?? {}\n\n // Reparse to ensure token/comment info is present for hint parsing.\n let _ast = parseAst(operation.query)\n const rules = parseHints(_ast)\n\n // ---- Hint: remove-not-defined ----------------------------------------\n for (const hintsToken of hintsTokensContainingHint(\n rules,\n removeNotDefinedHintDef.name,\n )) {\n const result = removeNotDefinedHintDef.transformer!(\n { query: _ast, variables: operation.variables },\n hintsToken,\n )\n _ast = result.query\n operation.variables = result.variables\n }\n\n // ---- Hint: inline-variable --------------------------------------------\n for (const hintsToken of hintsTokensContainingHint(\n rules,\n inlineVariableHintDef.name,\n )) {\n const result = inlineVariableHintDef.transformer!(\n { query: _ast, variables: operation.variables },\n hintsToken,\n )\n _ast = result.query\n operation.variables = result.variables\n }\n\n // ---- Config: removeIfNotDefined ---------------------------------------\n for (const varName of queryProcessingConfig?.variables?.removeIfNotDefined ??\n []) {\n if (isNullOrUndefined(operation.variables[varName])) {\n _ast = removeVariable(_ast, varName)\n }\n }\n\n // ---- Config: removeIfNotUsed -----------------------------------------\n // Intentionally runs after removeIfNotDefined so that variables which were\n // only referenced inside another (now-removed) variable can be cleaned up.\n for (const varName of queryProcessingConfig?.variables?.removeIfNotUsed ??\n []) {\n if (!containsVariable(_ast, varName)) {\n _ast = removeVariable(_ast, varName)\n }\n }\n\n // ---- Config: inline --------------------------------------------------\n for (const varName of queryProcessingConfig?.variables?.inline ?? []) {\n const varValue = operation.variables[varName]\n operation.variables = withoutProperty(operation.variables, varName)\n _ast = removeVariableDefinition(_ast, varName)\n _ast = inlineVariable(_ast, varName, parseValue(toGQL(varValue)))\n }\n\n operation.query = _ast\n\n return forward(operation)\n})\n","import { isDevMode } from '@angular/core'\n\nimport { SortItem } from '@theseam/ui-common/datatable'\n\nimport { SortsMapper, SortsMapperResult } from './datatable-helpers'\nimport { MapperContext } from './mapper-context'\n\n/**\n * A field mapping entry for {@link createSortsMapper}:\n *\n * - `string` – the GQL sort-field name to emit for this column\n * - `null` – column is not sortable; the sort item will be dropped\n * - `function` – `(prop, context) => string | null` for dynamic mapping\n * with access to {@link MapperContext}\n */\nexport type SortsMapperFieldEntry =\n | string\n | null\n | ((prop: string, context: MapperContext) => string | null)\n\n/**\n * A partial map from column prop names to their GQL sort fields.\n *\n * Each key must be a valid property of `TRow`, catching typos and\n * copy-paste errors at compile time. Only columns that actually need\n * sort mapping must be listed — unlisted columns are silently dropped\n * (or throw in dev mode).\n */\nexport type SortsMapperFieldMap<TRow extends Record<string, any>> = {\n [K in keyof TRow & string]?: SortsMapperFieldEntry\n}\n\n/**\n * Options for {@link createSortsMapper}.\n */\nexport interface CreateSortsMapperOptions {\n /**\n * When `true` (the default), sort items whose `prop` is not listed in\n * the field map are automatically mapped using the prop value as the\n * GQL field name, provided a column with that prop exists in the\n * current datatable and has `sortable` not explicitly set to `false`.\n *\n * This eliminates boilerplate for the common case where column props\n * match GQL field names. The field map becomes an override/exclusion\n * map: list only columns that need a different GQL name or `null` to\n * suppress sorting.\n *\n * Set to `false` to require every sortable column to be explicitly\n * listed in the field map (with a dev-mode error for unmapped props).\n */\n autoMap?: boolean\n}\n\n/**\n * Creates a {@link SortsMapper} from a declarative field-name map.\n *\n * By default, `autoMap` is enabled: columns not listed in the field map\n * are automatically mapped using their `prop` as the GQL field name,\n * provided the column exists in the datatable and has `sortable` not\n * explicitly set to `false`. This guards against stale sort preferences\n * for removed columns.\n *\n * Each key in `fieldMap` must correspond to a datatable column `prop`\n * value. The value controls how that column's sort is translated:\n *\n * - `string` – emits `{ [gqlField]: 'ASC' | 'DESC' }`\n * - `null` – column is not sortable; the sort item is dropped\n * - `function` – called with `(prop, context)` and may return a field\n * name or `null` to drop the item dynamically\n *\n * @example\n * // Auto-map all columns, override one\n * const mapSorts = createSortsMapper<MyRow>({\n * computedField: 'gql_computed_field',\n * })\n *\n * @example\n * // Opt out of auto-mapping (explicit field map required)\n * const mapSorts = createSortsMapper<MyRow>({\n * id: 'id',\n * name: 'name',\n * }, { autoMap: false })\n */\nexport function createSortsMapper<TRow extends Record<string, any>>(\n fieldMap: SortsMapperFieldMap<TRow>,\n options?: CreateSortsMapperOptions,\n): SortsMapper {\n const autoMap = options?.autoMap ?? true\n\n return (sorts: SortItem[], context: MapperContext): SortsMapperResult => {\n const result: SortsMapperResult = []\n\n for (const s of sorts) {\n const prop = s?.prop as keyof TRow & string\n\n if (!(prop in fieldMap)) {\n if (autoMap) {\n const columns = context.columns\n if (columns) {\n const column = columns.find((c) => c.prop === prop)\n if (column && column.sortable !== false) {\n const dir = s?.dir?.toUpperCase()\n result.push({ [prop]: dir })\n }\n } else if (isDevMode()) {\n // autoMap is enabled but no columns in context — likely a\n // wiring issue where columns$ is not being piped through.\n console.warn(\n `createSortsMapper: autoMap is enabled but no columns found in context for prop \"${prop}\". ` +\n `Ensure columns are provided via MapperContext.`,\n )\n }\n continue\n }\n\n if (isDevMode()) {\n throw new Error(\n `createSortsMapper: no mapping found for column prop \"${prop}\". ` +\n `Add an entry to the field map or set the value to null to ignore it.`,\n )\n }\n continue\n }\n\n const entry = fieldMap[prop]\n const dir = s?.dir?.toUpperCase()\n\n const gqlField =\n typeof entry === 'function' ? entry(prop, context) : entry\n\n if (gqlField === null) continue\n\n result.push({ [gqlField as string]: dir })\n }\n\n return result\n }\n}\n","import { TheSeamPageInfo } from '@theseam/ui-common/datatable'\n\nimport { GqlDatatableAccessor } from '../models/gql-datatable-accessor'\n\nexport const DEFAULT_PAGE_SIZE = 20\n\nexport function getPageInfo(\n datatable: GqlDatatableAccessor | null | undefined,\n defaultPageSize: number = DEFAULT_PAGE_SIZE,\n): TheSeamPageInfo {\n return {\n offset: datatable?.ngxDatatable?.offset ?? 0,\n pageSize: datatable?.ngxDatatable?.pageSize ?? defaultPageSize,\n limit: datatable?.ngxDatatable?.limit,\n count: datatable?.ngxDatatable?.count ?? 0,\n }\n}\n","import { EMPTY, Observable, Subscriber } from 'rxjs'\nimport { switchMap, tap } from 'rxjs/operators'\n\nimport { TheSeamPageInfo } from '@theseam/ui-common/datatable'\nimport { notNullOrUndefined } from '@theseam/ui-common/utils'\n\nimport { GqlDatatableAccessor } from '../models/gql-datatable-accessor'\nimport { getPageInfo } from './get-page-info'\n\nexport function createPageInfoObservable(\n datatable$: Observable<GqlDatatableAccessor | null | undefined>,\n defaultPageSize: number = 20,\n): Observable<TheSeamPageInfo> {\n return new Observable<TheSeamPageInfo>(\n (subscriber: Subscriber<TheSeamPageInfo>) => {\n let prev: TheSeamPageInfo | null = null\n const handlePageInfo = (pageInfo: TheSeamPageInfo | null) => {\n if (!_isPageInfoSame(prev, pageInfo)) {\n if (pageInfo !== null) {\n subscriber.next(pageInfo)\n }\n prev = pageInfo\n }\n }\n\n const dtSub = datatable$\n .pipe(\n switchMap((dt) => {\n if (!notNullOrUndefined(dt)) {\n handlePageInfo(null)\n return EMPTY\n }\n\n handlePageInfo(getPageInfo(dt, defaultPageSize))\n\n return dt.page.pipe(tap((p) => handlePageInfo(p)))\n }),\n )\n .subscribe()\n\n return () => {\n dtSub.unsubscribe()\n }\n },\n )\n}\n\nfunction _isPageInfoSame(\n prev: TheSeamPageInfo | null,\n curr: TheSeamPageInfo | null,\n): boolean {\n if (\n prev?.offset === curr?.offset &&\n prev?.pageSize === curr?.pageSize &&\n prev?.limit === curr?.limit &&\n prev?.count === curr?.count\n ) {\n return true\n }\n return false\n}\n","import { isDevMode } from '@angular/core'\nimport { from, Observable } from 'rxjs'\nimport { concatMap, filter, take, toArray } from 'rxjs/operators'\n\nimport { DataFilterState } from '@theseam/ui-common/data-filters'\nimport {\n notNullOrUndefined,\n wrapIntoObservable,\n} from '@theseam/ui-common/utils'\n\nimport { MapperContext } from './mapper-context'\n\nexport interface FilterStateMapperVariables {\n [name: string]: any\n}\n\nexport interface FilterStateMapperFilter {\n and?: FilterStateMapperFilter[]\n or?: FilterStateMapperFilter[]\n [name: string]: any\n}\n\nexport type FilterStateMapperResult = {\n filter: FilterStateMapperFilter\n variables: FilterStateMapperVariables\n} | null\n\n/**\n * A filter input type constrained to the field names of `T`.\n *\n * Use this as the building block for {@link TypedFilterStateMapperResult}\n * when you want compile-time checking that filter conditions only reference\n * real fields in the corresponding GQL input type.\n *\n * @example\n * type MyFilter = TypedFilterInput<'id' | 'name'>\n * // { id?: any; name?: any }\n */\nexport type TypedFilterInput<T extends string | number | symbol> = {\n [name in T]?: any\n}\n\n/**\n * A type-safe alternative to {@link FilterStateMapperResult} that constrains\n * filter field names to the union `T`.\n *\n * The filter can be either a direct field-condition object or a combined\n * object with `or`/`and` arrays:\n *\n * ```ts\n * // Direct field condition\n * { filter: { status: { eq: 'active' } }, variables: {} }\n *\n * // Combined (OR)\n * { filter: { or: [{ id: { lt: 30 } }, { name: { contains: 'foo' } }] }, variables: {} }\n * ```\n *\n * Because TypeScript uses structural typing, a mapper that returns\n * `TypedFilterStateMapperResult<'id' | 'name'>` is assignable to the\n * untyped {@link FilterStateMapper} signature without any cast.\n */\nexport type TypedFilterStateMapperResult<T extends string | number | symbol> = {\n filter:\n | {\n or?: TypedFilterInput<T>[]\n and?: TypedFilterInput<T>[]\n }\n | TypedFilterInput<T>\n variables: FilterStateMapperVariables\n} | null\n\nexport type FilterStateMapper = (\n filterState: DataFilterState,\n context: MapperContext,\n) =>\n | FilterStateMapperResult\n | Promise<FilterStateMapperResult>\n | Observable<FilterStateMapperResult>\nexport interface FilterStateMappers {\n [filterName: string]: FilterStateMapper\n}\n\nfunction resolveMapper(\n filterState: DataFilterState,\n filterStateMappers: FilterStateMappers,\n context: MapperContext,\n): Observable<FilterStateMapperResult> {\n const mapper = filterStateMappers[filterState.name]\n if (!notNullOrUndefined(mapper)) {\n throw Error(`Mapper for filter '${filterState.name}' not found.`)\n }\n\n return wrapIntoObservable(mapper(filterState, context)).pipe(\n // Require each mapper to complete.\n take(1),\n )\n}\n\nfunction resolveMappers(\n filterStates: DataFilterState[],\n filterStateMappers: FilterStateMappers,\n context: MapperContext,\n): Observable<Exclude<FilterStateMapperResult, null>[]> {\n return from(filterStates).pipe(\n concatMap((filterState) =>\n resolveMapper(filterState, filterStateMappers, context),\n ),\n filter(notNullOrUndefined),\n toArray(),\n )\n}\n\n/**\n * Combines multiple active filter results with AND so that all conditions must\n * be satisfied simultaneously (e.g. a search filter AND a status filter).\n */\nfunction mergeFilters(\n filters: FilterStateMapperFilter[],\n): FilterStateMapperFilter {\n return { and: filters }\n}\n\n/**\n * Merges variable objects.\n *\n * NOTE: This does not try to deep merge, so if two objects define the same\n * variable then the last object's value will be in the merged object. *In\n * devMode an error will be thrown.*\n */\nfunction mergeVariables(\n variableObjects: FilterStateMapperVariables[],\n): FilterStateMapperVariables {\n const variables: FilterStateMapperVariables = {}\n\n for (const v of variableObjects) {\n const props = Object.keys(v)\n\n if (isDevMode()) {\n for (const p of props) {\n if (notNullOrUndefined(variables[p]) && variables[p] !== v[p]) {\n // eslint-disable-next-line no-console\n console.warn(\n `Multiple filters adding the same variable with a different result. This could cause unexpected results.`,\n )\n break\n }\n }\n }\n\n for (const p of props) {\n variables[p] = v[p]\n }\n }\n\n return variables\n}\n\nfunction isEmptyFilter(mapperFilter: FilterStateMapperFilter): boolean {\n return Object.keys(mapperFilter).length === 0\n}\n\nexport async function mapFilterStates(\n filterStates: DataFilterState[],\n filterStateMappers: FilterStateMappers,\n context: MapperContext,\n): Promise<FilterStateMapperResult> {\n const results: FilterStateMapperFilter[] =\n (await resolveMappers(\n filterStates,\n filterStateMappers,\n context,\n ).toPromise()) ?? []\n\n if (results.length === 0) {\n return null\n }\n\n const filters = results\n .map((r: any) => r.filter)\n .filter(notNullOrUndefined)\n .filter((mapperFilter) => !isEmptyFilter(mapperFilter))\n\n const variableObjs = results\n .map((r: any) => r.variables)\n .filter(notNullOrUndefined)\n\n return {\n filter: mergeFilters(filters),\n variables: mergeVariables(variableObjs),\n }\n}\n","import { TheSeamPageInfo } from '@theseam/ui-common/datatable'\n\nexport interface PageInfoMapperResult {\n skip: number\n take: number\n}\nexport type PageInfoMapper = (pageInfo: TheSeamPageInfo) => PageInfoMapperResult\n\n/**\n * Maps to a range that fetches the page before the current page, the current\n * page, and the page after the current page.\n */\nexport function mapPageInfo(pageInfo: TheSeamPageInfo): PageInfoMapperResult {\n const _skip = pageInfo.offset * pageInfo.pageSize\n\n const skipWithWindowOffset = _skip - pageInfo.pageSize\n const takeOffset = skipWithWindowOffset < 0 ? skipWithWindowOffset : 0\n\n return {\n skip: Math.max(skipWithWindowOffset, 0),\n take: Math.max(pageInfo.pageSize * 3 + takeOffset, 0),\n }\n}\n","import {\n combineLatest,\n defer,\n EMPTY,\n Observable,\n of,\n Subject,\n Subscription,\n} from 'rxjs'\nimport {\n auditTime,\n catchError,\n distinctUntilChanged,\n finalize,\n map,\n shareReplay,\n startWith,\n switchMap,\n tap,\n} from 'rxjs/operators'\n\nimport { wrapIntoObservable } from '@theseam/ui-common/utils'\nimport { SortItem, TheSeamDatatableColumn } from '@theseam/ui-common/datatable'\n\nimport { GqlDatatableAccessor, EmptyObject } from '../models'\nimport { createPageInfoObservable } from './create-page-info-observable'\nimport { DatatableGraphQLQueryRef } from './datatable-graphql-query-ref'\nimport { FilterStateMappers, mapFilterStates } from './map-filter-states'\nimport { mapPageInfo } from './map-page-info'\nimport { MapperContext } from './mapper-context'\n\nexport type SortsMapperResult = { [name: string]: any }[]\nexport type SortsMapper = (\n sorts: SortItem[],\n context: MapperContext,\n) =>\n | SortsMapperResult\n | Promise<SortsMapperResult>\n | Observable<SortsMapperResult>\n\nexport function observeRowsWithGqlInputsHandling<\n TData,\n TRow,\n GqlVariables extends EmptyObject,\n>(\n queryRef: DatatableGraphQLQueryRef<TData, GqlVariables, TRow>,\n rows: Observable<TRow[]>,\n datatable:\n | Observable<GqlDatatableAccessor | undefined>\n | Promise<GqlDatatableAccessor | undefined>\n | GqlDatatableAccessor,\n extraVariables:\n | Observable<Partial<GqlVariables>>\n | Promise<Partial<GqlVariables>>\n | Partial<GqlVariables>,\n sortsMapper: SortsMapper,\n filterStateMappers: FilterStateMappers,\n): Observable<TRow[]> {\n const datatable$ = wrapIntoObservable(datatable)\n const extraVariables$ =\n wrapIntoObservable<Partial<GqlVariables>>(extraVariables)\n\n // Only emit page changes past the first when paging is enabled. When paging\n // is disabled, all data is already in the buffer so there is no need to\n // re-query on page changes.\n const pageInfo$ = defer(() => {\n let firstEmit = true\n return createPageInfoObservable(datatable$).pipe(\n switchMap((pageInfo) => {\n if (!firstEmit && _isPagingDisabled(queryRef)) {\n return EMPTY\n }\n firstEmit = false\n return of(pageInfo)\n }),\n map(mapPageInfo),\n )\n })\n\n // Combines extraVariables and pageInfo, then derives sorts and filter state.\n // auditTime(0) debounces rapid synchronous emissions (e.g. at startup) so\n // only one setVariables call is made per event-loop turn.\n const handleQueryInputs = combineLatest([extraVariables$, pageInfo$]).pipe(\n auditTime(0),\n switchMap(([_extraVariables, pageInfo]) => {\n const context: MapperContext = { extraVariables: _extraVariables }\n\n const sorts$ = _createSortsAndColumnsObservable(datatable$).pipe(\n switchMap(({ sorts, columns }) =>\n wrapIntoObservable(sortsMapper(sorts, { ...context, columns })),\n ),\n )\n\n const filterInfo$ = _createFilterStatesObservable(datatable$).pipe(\n switchMap((x) => mapFilterStates(x, filterStateMappers, context)),\n // TODO: Remove when the datatable fixes the bug causing it to emit more than it should.\n distinctUntilChanged((x, y) => JSON.stringify(x) === JSON.stringify(y)),\n )\n\n return combineLatest([sorts$, filterInfo$]).pipe(\n map(([sorts, filterInfo]) => ({\n extraVariables: _extraVariables,\n pageInfo,\n sorts,\n filterInfo,\n })),\n )\n }),\n tap((v) => {\n queryRef.setVariables({\n ...(v.extraVariables || {}),\n ...v.pageInfo,\n ...(v.sorts.length > 0 ? { order: v.sorts } : {}),\n ...(v.filterInfo?.variables || {}),\n ...(v.filterInfo?.filter ? { where: v.filterInfo.filter } : {}),\n } as any)\n }),\n )\n\n return defer(() => {\n // Observe the optional refresh-button patch attached externally to the\n // datatable instance. When the user triggers a refresh, refetch the data.\n let refreshBtnSub: Subscription = Subscription.EMPTY\n refreshBtnSub = datatable$\n .pipe(\n switchMap((dt) => {\n if (!dt || !(dt as any).__refreshPatch) {\n return EMPTY\n }\n return (dt as any).__refreshPatch.refreshTriggered.pipe(\n tap(() => queryRef.refetch(undefined, true)),\n )\n }),\n )\n .subscribe()\n\n // Bridge query-input changes to row emissions via a Subject so that the\n // rows observable is only subscribed once (on the first input change) and\n // then continues to receive updates as the live query produces new data.\n const _emitted = new Subject<boolean>()\n const handlerSub = handleQueryInputs.subscribe(() => _emitted.next(true))\n\n return _emitted.pipe(\n distinctUntilChanged(),\n switchMap(() => rows),\n finalize(() => {\n handlerSub.unsubscribe()\n refreshBtnSub.unsubscribe()\n }),\n )\n }).pipe(\n catchError((err) => {\n // eslint-disable-next-line no-console\n console.error(err)\n return of([] as TRow[])\n }),\n shareReplay({ bufferSize: 1, refCount: true }),\n )\n}\n\nfunction _createSortsAndColumnsObservable(\n datatable$: Observable<GqlDatatableAccessor | undefined>,\n): Observable<{ sorts: SortItem[]; columns: TheSeamDatatableColumn[] }> {\n // NOTE: There is a bug in our datatable wrapper that isn't propagating\n // external sorting changes to the wrapped datatable component, which we observe\n // sort events from. This workaround observes our wrapper's internal column\n // change events, which emit all changes to columns that our datatable tracks,\n // and reads sorts from our wrapper when externalSorting is enabled.\n const _observeSortsWorkaround = (\n dt: GqlDatatableAccessor,\n ): Observable<SortItem[]> => {\n if (!(dt as any)._columnsAlterationsManager) {\n // Fallback for environments (e.g. tests) where the internal manager\n // is not present.\n return dt.sort.pipe(\n map((v) => v.sorts),\n startWith(dt.sorts),\n )\n }\n return (dt as any)._columnsAlterationsManager.changes.pipe(\n map(() => (dt.externalSorting ? (dt as any)._sorts : dt.sorts)),\n startWith(dt.externalSorting ? (dt as any)._sorts : dt.sorts),\n )\n }\n\n return datatable$.pipe(\n switchMap((dt) =>\n dt\n ? combineLatest([_observeSortsWorkaround(dt), dt.columns$]).pipe(\n map(([sorts, columns]) => ({ sorts, columns })),\n )\n : of({\n sorts: [] as SortItem[],\n columns: [] as TheSeamDatatableColumn[],\n }),\n ),\n shareReplay({ bufferSize: 1, refCount: true }),\n )\n}\n\nfunction _createFilterStatesObservable(\n datatable$: Observable<GqlDatatableAccessor | undefined>,\n) {\n return datatable$.pipe(switchMap((dt) => (dt ? dt.filterStates : of([]))))\n}\n\nfunction _isPagingDisabled<TData, GqlVariables extends EmptyObject, TRow>(\n queryRef: DatatableGraphQLQueryRef<TData, GqlVariables, TRow>,\n): boolean {\n return queryRef.getQueryProcessingConfig()?.disablePaging ?? false\n}\n","import {\n BehaviorSubject,\n defer,\n from,\n isObservable,\n Observable,\n of,\n Subject,\n Subscriber,\n} from 'rxjs'\nimport {\n auditTime,\n filter,\n finalize,\n map,\n shareReplay,\n skip,\n startWith,\n switchMap,\n take,\n tap,\n} from 'rxjs/operators'\n\nimport {\n ApolloQueryResult,\n DocumentNode,\n NetworkStatus,\n TypedDocumentNode,\n} from '@apollo/client/core'\nimport {\n hasProperty,\n notNullOrUndefined,\n withoutProperties,\n} from '@theseam/ui-common/utils'\n\n// `isNetworkRequestInFlight` is only exported from the ES module subpath\n// `@apollo/client/core/networkStatus`, which can't be loaded by Jest's CJS\n// transform. Reimplementing it here keeps the logic accessible in tests.\nfunction isNetworkRequestInFlight(networkStatus?: NetworkStatus): boolean {\n return networkStatus ? networkStatus < NetworkStatus.ready : false\n}\nimport { QueryRef } from 'apollo-angular'\nimport { WatchQueryOptions } from 'apollo-angular'\nimport { GraphQLFormattedError } from 'graphql'\n\nimport { QueryProcessingConfig, EmptyObject } from '../models'\nimport { DEFAULT_PAGE_SIZE } from './get-page-info'\n\nexport interface DatatableGraphQLDataMapperResult<TRow = EmptyObject> {\n rows: TRow[]\n\n /**\n * If data is paged, this is the total number of unpaged rows.\n */\n totalCount?: number\n}\n\nexport type DatatableGraphQLDataMapper<TData, TRow = EmptyObject> = (\n data: TData,\n) =>\n | DatatableGraphQLDataMapperResult<TRow>\n | Promise<DatatableGraphQLDataMapperResult<TRow>>\n | Observable<DatatableGraphQLDataMapperResult<TRow>>\n\nexport type DatatableGraphQLVariables = {\n skip?: number\n take?: number\n} & EmptyObject\n\nexport type DatatableGraphQLErrorHandler = (\n error: readonly GraphQLFormattedError[],\n) => void\n\n/**\n * Maximum number of error recovery attempts before throwing.\n */\nexport const MAX_ERROR_RECOVERY_ATTEMPTS = 10\n\n/**\n * Partially wraps ApolloClient's QueryRef with datatable paging, loading\n * state, error handling, and debounced variable updates.\n */\nexport class DatatableGraphQLQueryRef<\n TData,\n TVariables extends DatatableGraphQLVariables = EmptyObject,\n TRow = EmptyObject,\n> {\n private readonly _variablesSubject = new BehaviorSubject<TVariables>(\n {} as TVariables,\n )\n private readonly _observingChangesSubject = new BehaviorSubject<boolean>(\n false,\n )\n private readonly _errorSubject = new Subject<\n readonly GraphQLFormattedError[]\n >()\n /**\n * Used to manually trigger a pending/loading state when we know a request is\n * coming but Apollo hasn't started it yet (e.g. after setVariables resolves to\n * a non-paging variable change while a request is already in-flight).\n */\n private readonly _manualPendingSubject = new BehaviorSubject<boolean>(false)\n private readonly _needToRequerySubject = new Subject<boolean>()\n\n /**\n * Temporary way of tracking total count when paging is disabled.\n */\n private _totalCount: number = DEFAULT_PAGE_SIZE\n\n private get _observingChanges(): boolean {\n return this._observingChangesSubject.value\n }\n private set _observingChanges(value: boolean) {\n this._observingChangesSubject.next(value)\n }\n\n private _variablesUpdatePending = false\n\n private readonly _valueChanges: Observable<ApolloQueryResult<TData>>\n\n public readonly loading$: Observable<boolean>\n\n /**\n * Emits whenever the query variables change.\n */\n public readonly variables$ = this._variablesSubject.asObservable()\n\n /**\n * Emits when a GraphQL error occurs.\n *\n * If nothing is subscribed to this, the `_defaultErrorHandler` is used\n * (if provided). Once subscribed, the subscriber is responsible for\n * handling the error.\n */\n public readonly error$ = this._errorSubject.asObservable()\n\n public get updatesPollDelay(): number {\n return this._updatesPollDelay\n }\n public get variablesUpdatePending(): boolean {\n return this._variablesUpdatePending\n }\n\n constructor(\n /** Original ApolloClient's QueryRef. */\n private readonly _queryRef: QueryRef<TData, TVariables>,\n /**\n * How long to wait (ms) before applying variable changes and refetching.\n */\n private readonly _updatesPollDelay: number = 500,\n /**\n * Default error handler used when no subscriber is listening to `error$`.\n */\n private readonly _defaultErrorHandler?: DatatableGraphQLErrorHandler,\n ) {\n this._variablesSubject.next(\n (this._queryRef as any).obsQuery.options.variables || {},\n )\n\n // Tracks whether the loading overlay should be held open until we know\n // whether the first response will trigger a follow-up requery (e.g. when\n // disablePaging is on and we first probe for totalCount). This prevents the\n // loading overlay from flickering off and back on.\n let hasEmittedTriggered = false\n const hasEmittedSubject = new BehaviorSubject<boolean>(false)\n\n const setHasEmitted = () => {\n if (hasEmittedTriggered) {\n return\n }\n hasEmittedTriggered = true\n const sub = this._needToRequerySubject.pipe(take(1)).subscribe(() => {\n hasEmittedSubject.next(true)\n sub.unsubscribe()\n })\n }\n\n this._valueChanges = defer(() => {\n let prev: Omit<TVariables, 'skip' | 'take'> | undefined\n const varChangesSub = this._variablesSubject\n .pipe(\n skip(1),\n tap(() => {\n this._variablesUpdatePending = true\n }),\n auditTime(this._updatesPollDelay),\n finalize(() => {\n // If the query stopped being observed before the debounce fired,\n // apply the pending variables now.\n if (this._variablesUpdatePending) {\n this.refetch()\n this._variablesUpdatePending = false\n }\n }),\n )\n .subscribe((variables) => {\n this._setVariablesImmediate(variables)\n const current = withoutProperties(this.getVariables(), [\n 'skip',\n 'take',\n ])\n const isVarsChanged =\n prev === undefined ||\n JSON.stringify(prev) !== JSON.stringify(current)\n prev = current as any\n this._variablesUpdatePending = false\n // When the non-paging variables change while Apollo is already\n // in setVariables state, manually signal a pending load so the\n // loading overlay doesn't disappear until the response arrives.\n if (\n isVarsChanged &&\n this._queryRef.getCurrentResult().networkStatus ===\n NetworkStatus.setVariables\n ) {\n this._manualPendingSubject.next(true)\n }\n })\n\n let repeatedErrors = 0\n this._observingChanges = true\n return this._queryRef.valueChanges.pipe(\n // Once a response lands (not in-flight), begin tracking whether the\n // initial load has truly completed (accounting for disablePaging requery).\n tap((v) =>\n !isNetworkRequestInFlight(v.networkStatus)\n ? setHasEmitted()\n : undefined,\n ),\n // Guard against infinite error loops when polling / retrying.\n tap((v) => {\n if (v.networkStatus === NetworkStatus.error) {\n repeatedErrors++\n if (repeatedErrors >= MAX_ERROR_RECOVERY_ATTEMPTS) {\n throw Error('Max error recovery attempts reached.')\n }\n } else if (v.networkStatus === NetworkStatus.ready) {\n repeatedErrors = 0\n }\n }),\n finalize(() => {\n varChangesSub.unsubscribe()\n this._observingChanges = false\n }),\n )\n }).pipe(shareReplay({ bufferSize: 1, refCount: true }))\n\n this.loading$ = this._observingChangesSubject.pipe(\n switchMap((observingChanges) => {\n if (!observingChanges) {\n return of(false)\n }\n\n return this._valueChanges.pipe(\n map((result) => result.loading),\n startWith(this._queryRef.getCurrentResult().loading),\n tap((loading) => {\n if (!loading) {\n this._manualPendingSubject.next(false)\n }\n }),\n // Swap the actual loading flag for the manual pending flag so that\n // we can hold the loading state open when needed.\n switchMap(() => this._manualPendingSubject),\n auditTime(0),\n shareReplay({ bufferSize: 1, refCount: true }),\n )\n }),\n // Keep loading=true until we've confirmed the first full load cycle\n // (including any disablePaging requery).\n switchMap((v) =>\n hasEmittedSubject.pipe(map((hasEmitted) => (hasEmitted ? v : true))),\n ),\n )\n }\n\n public rows(\n mapper: DatatableGraphQLDataMapper<TData, TRow>,\n ): Observable<TRow[]> {\n return this._rowsObservable(mapper)\n }\n\n private _rowsObservable(\n mapper: DatatableGraphQLDataMapper<TData, TRow>,\n ): Observable<TRow[]> {\n return new Observable<TRow[]>((subscriber: Subscriber<TRow[]>) => {\n const rowsBufferSubject = new BehaviorSubject<TRow[]>([])\n\n const querySub = this._valueChanges\n .pipe(\n filter((result) => !isNetworkRequestInFlight(result.networkStatus)),\n switchMap((result) => {\n if (result.data === undefined) {\n return of()\n }\n\n // Capture the skip offset *before* any variable changes that the\n // mapper might trigger (e.g. patchVariables for disablePaging).\n const querySkip = this._getVariablesFromQueryRef().skip\n\n const _result = this._handleResult(result)\n return this._resolveRowMapper(mapper(_result.data)).pipe(\n tap((mapperResult) => {\n const needsToRequery =\n this._needsToRequeryWithAllRecords(mapperResult)\n if (needsToRequery) {\n this.patchVariables({ take: mapperResult.totalCount } as any)\n }\n this._needToRequerySubject.next(needsToRequery)\n\n if (hasProperty(mapperResult, 'totalCount')) {\n this._totalCount = mapperResult.totalCount\n }\n\n let rows = rowsBufferSubject.value || []\n\n const hasTotalCount =\n mapperResult.totalCount !== undefined &&\n mapperResult.totalCount !== null\n\n // If the rows buffer is not the same size as totalCount, create\n // a fresh buffer (sparse array — unfilled slots are undefined,\n // which is what checkRecordsHaveValue expects).\n if (hasTotalCount) {\n if (mapperResult.totalCount !== rows.length) {\n rows = new Array<TRow>(mapperResult.totalCount || 0)\n }\n\n let startIndex = querySkip ?? 0\n if (this.getQueryProcessingConfig()?.disablePaging) {\n startIndex = 0\n }\n\n // Insert rows into the correct buffer positions.\n for (let i = 0; i < mapperResult.rows.length; i++) {\n rows[startIndex + i] = mapperResult.rows[i]\n }\n\n rows = [...rows]\n } else {\n rows = [...mapperResult.rows]\n }\n\n // ngx-datatable does row lookups in a WeakMap and my assumption\n // is that the pre-allocated empty objects seem to be getting\n // recognized as the same object, so to avoid that, we add a\n // unique property to each row.\n rows = rows.map((v, i) => ({\n ...v,\n __dt_id: `row-${i}`,\n }))\n\n rowsBufferSubject.next(rows)\n }),\n )\n }),\n )\n .subscribe()\n\n const rowsSub = rowsBufferSubject.subscribe(subscriber)\n\n return () => {\n querySub.unsubscribe()\n rowsSub.unsubscribe()\n\n rowsBufferSubject.next([])\n rowsBufferSubject.complete()\n }\n })\n }\n\n /**\n * Reads the result and returns it unchanged if no errors.\n *\n * On errors: emits them via `error$` and replaces any `null` data properties\n * with an empty collection shape `{ items: [], totalCount: 0 }` so mapper\n * functions can run safely without special-casing the error path.\n */\n private _handleResult(\n result: ApolloQueryResult<TData>,\n ): ApolloQueryResult<TData> {\n if (!result.errors || result.errors.length === 0) return result\n\n this._emitError(result.errors)\n\n const defaultDataPropValue = { items: [], totalCount: 0 }\n const data = Object.keys(result.data as any).reduce((acc, key) => {\n ;(acc as any)[key] =\n (result.data as any)[key] === null\n ? defaultDataPropValue\n : (result.data as any)[key]\n return acc\n }, {} as TData)\n\n return { ...result, data }\n }\n\n private _needsToRequeryWithAllRecords(\n data: DatatableGraphQLDataMapperResult<TRow>,\n ): boolean {\n if (!this.getQueryProcessingConfig()?.disablePaging) {\n return false\n }\n\n return (\n hasProperty(data, 'totalCount') &&\n hasProperty(data, 'rows') &&\n Array.isArray(data.rows) &&\n data.totalCount > data.rows.length &&\n this._totalCount !== data.totalCount\n )\n }\n\n private _resolveRowMapper(\n mapperReturn: ReturnType<DatatableGraphQLDataMapper<TData, TRow>>,\n ): Observable<DatatableGraphQLDataMapperResult<TRow>> {\n if (isObservable(mapperReturn)) {\n return mapperReturn.pipe(take(1))\n }\n\n return from(Promise.resolve(mapperReturn))\n }\n\n public getVariables(): TVariables {\n return this._variablesSubject.value\n }\n\n private _setVariablesImmediate(\n variables: TVariables,\n ): Promise<void | ApolloQueryResult<TData>> {\n const _vars = this._withVariableOverrides(variables)\n return this._queryRef.setVariables(_vars || ({} as TVariables))\n }\n\n private _patchVariablesImmediate(\n variables: Partial<TVariables>,\n ): Promise<void | ApolloQueryResult<TData>> {\n const _variables = {\n ...this.getVariables(),\n ...variables,\n }\n\n const _vars = this._withVariableOverrides(_variables)\n return this._queryRef.setVariables(_vars || ({} as TVariables))\n }\n\n public setVariables(variables: TVariables): void {\n this._variablesSubject.next(variables)\n if (!this._observingChanges) {\n this._setVariablesImmediate(variables)\n }\n }\n\n public patchVariables(variables: Partial<TVariables>): void {\n const _variables = {\n ...this.getVariables(),\n ...variables,\n }\n\n this._variablesSubject.next(_variables)\n if (!this._observingChanges) {\n this._setVariablesImmediate(_variables)\n }\n }\n\n public refetch(\n variables?: TVariables,\n showLoading = false,\n ): Promise<ApolloQueryResult<TData>> {\n const _vars = this._withVariableOverrides(variables)\n if (showLoading) {\n this._manualPendingSubject.next(true)\n }\n // NOTE: There seems to be a bug causing Apollo to not emit changes unless\n // getCurrentResult() is called. This setTimeout is a workaround.\n setTimeout(() => this._queryRef.getCurrentResult())\n return this._queryRef.refetch(_vars)\n }\n\n public setQuery(\n query: DocumentNode | TypedDocumentNode<TData, TVariables>,\n triggerRefetch: boolean = false,\n ): void {\n this._queryRef.setOptions({ query })\n if (triggerRefetch) {\n // Fake a variables update to share the debounce delay with setVariables.\n this.setVariables(this.getVariables())\n }\n }\n\n public getOptions(): WatchQueryOptions<TVariables, TData> | undefined {\n return (this._queryRef as any).obsQuery.options\n }\n\n public getQueryProcessingConfig(): QueryProcessingConfig | undefined {\n return this.getOptions()?.context?.queryProcessingConfig\n }\n\n /**\n * Returns the variables that were actually sent with the last request, read\n * directly from Apollo's observable query. This is more accurate than\n * `_variablesSubject.value` when variables can change between the debounce\n * firing and the response arriving.\n */\n private _getVariablesFromQueryRef(): TVariables {\n return (this._queryRef as any).obsQuery.variables\n }\n\n private _withVariableOverrides(\n variables?: TVariables,\n ): TVariables | undefined {\n if (\n !notNullOrUndefined(variables) &&\n !this.getQueryProcessingConfig()?.disablePaging\n ) {\n return undefined\n }\n\n const _vars = { ...(variables || {}) } as TVariables\n if (this.getQueryProcessingConfig()?.disablePaging) {\n _vars.take = this._totalCount\n }\n return _vars\n }\n\n private _emitError(error: readonly GraphQLFormattedError[]): void {\n this._errorSubject.next(error)\n if (this._defaultErrorHandler && !this._errorSubject.observed) {\n this._defaultErrorHandler(error)\n }\n }\n}\n","import { Inject, Injectable, InjectionToken, Optional } from '@angular/core'\n\nimport { OperationVariables } from '@apollo/client/core/types'\nimport { Apollo } from 'apollo-angular'\nimport { WatchQueryOptions } from 'apollo-angular'\n\nimport { QueryProcessingConfig, EmptyObject } from '../models'\nimport {\n DatatableGraphQLQueryRef,\n DatatableGraphQLVariables,\n} from './datatable-graphql-query-ref'\n\n/**\n * NOTE: Any of ApolloClient's WatchQueryOptions properties can be set, but I\n * think our components should only be providing `query` and `variables`. The\n * rest should be common options shared by all our app's datatables. This may\n * change if it is determined to be too restrictive.\n */\nexport type DatatableQueryOptions<\n TVariables extends OperationVariables = OperationVariables,\n TData = any,\n> = Pick<WatchQueryOptions<TVariables, TData>, 'query'> &\n Pick<WatchQueryOptions<TVariables, TData>, 'variables'> &\n Pick<WatchQueryOptions<TVariables, TData>, 'context'>\n\nexport interface DatatableGraphqlServiceConfig {\n /**\n * Polling interval time in milliseconds.\n */\n pollingIntervalTime?: number\n}\n\nexport const DATATABLE_GRAPHQL_SERVICE_CONFIG =\n new InjectionToken<DatatableGraphqlServiceConfig>(\n 'DATATABLE_GRAPHQL_SERVICE_CONFIG',\n )\n\nconst _CONFIG_DEFAULTS: DatatableGraphqlServiceConfig = {\n pollingIntervalTime: 1 * 60 * 1000,\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class DatatableGraphqlService {\n private readonly _config: DatatableGraphqlServiceConfig\n\n constructor(\n private readonly _apollo: Apollo,\n @Optional()\n @Inject(DATATABLE_GRAPHQL_SERVICE_CONFIG)\n _config?: DatatableGraphqlServiceConfig,\n ) {\n this._config = {\n ..._CONFIG_DEFAULTS,\n ...(_config || {}),\n }\n }\n\n public watchQuery<\n TData,\n TVariables extends DatatableGraphQLVariables = EmptyObject,\n TRow = EmptyObject,\n >(\n options: DatatableQueryOptions<TVariables>,\n queryProcessingConfig?: QueryProcessingConfig,\n ): DatatableGraphQLQueryRef<TData, TVariables, TRow> {\n const _options: WatchQueryOptions<TVariables, TData> = {\n useInitialLoading: true,\n ..._CONFIG_DEFAULTS,\n pollInterval: this._config.pollingIntervalTime,\n ...options,\n }\n\n if (queryProcessingConfig) {\n _options.context = {\n ...(_options.context || {}),\n queryProcessingConfig: {\n ...(_options.context?.queryProcessingConfig || {}),\n ...queryProcessingConfig,\n },\n }\n }\n\n const queryRef = this._apollo.watchQuery<TData, TVariables>(_options)\n\n return new DatatableGraphQLQueryRef(queryRef)\n }\n}\n","import {\n ColumnsDataFilterState,\n TheSeamColumnsDataFilterDateSearchFormState,\n TheSeamColumnsDataFilterDateSearchOptions,\n THESEAM_COLUMNS_DATA_FILTER_DATE_TEXT_SEARCH_TYPES,\n getFormattedDateForComparison,\n THESEAM_COLUMNS_DATA_FILTER_DATE_RANGE_SEARCH_TYPES,\n} from '@theseam/ui-common/datatable'\nimport { isNullOrUndefined, notNullOrUndefined } from '@theseam/ui-common/utils'\nimport { FilterStateMapperResult } from './map-filter-states'\nimport { MapperContext } from './mapper-context'\n\nexport const mapSearchDateColumnsDataFilterStateToGql = (\n filterState: ColumnsDataFilterState<\n TheSeamColumnsDataFilterDateSearchFormState,\n TheSeamColumnsDataFilterDateSearchOptions\n >,\n context: MapperContext<any>,\n): FilterStateMapperResult => {\n const formValue = filterState.state.formValue\n const options = filterState.state.options\n\n let filter = null\n\n if (\n isNullOrUndefined(filterState.state.prop) ||\n isNullOrUndefined(options) ||\n isNullOrUndefined(formValue) ||\n isNullOrUndefined(formValue.searchType)\n ) {\n return filter\n }\n\n if (\n THESEAM_COLUMNS_DATA_FILTER_DATE_TEXT_SEARCH_TYPES.includes(\n formValue.searchType,\n ) &&\n notNullOrUndefined(formValue.searchText)\n ) {\n const searchDate = getFormattedDateForComparison(\n formValue.searchText,\n options.dateType,\n true,\n )\n\n if (!isNaN(searchDate.valueOf())) {\n switch (formValue.searchType) {\n case 'eq': {\n let searchDateEnd\n if (options.dateType === 'datetime-local') {\n searchDateEnd = new Date(searchDate)\n searchDateEnd.setMinutes(searchDateEnd.getMinutes() + 1)\n } else if (options.dateType === 'date') {\n searchDateEnd = new Date(searchDate)\n searchDateEnd.setDate(searchDateEnd.getDate() + 1)\n }\n\n if (notNullOrUndefined(searchDateEnd)) {\n filter = {\n filter: {\n and: [\n {\n [filterState.state.prop]: { gte: searchDate.toISOString() },\n },\n {\n [filterState.state.prop]: {\n lt: searchDateEnd.toISOString(),\n },\n },\n ],\n },\n variables: {},\n }\n }\n\n break\n }\n case 'gt':\n case 'lte': {\n const comparator =\n formValue.searchType === 'gt'\n ? 'gte'\n : formValue.searchType === 'lte'\n ? 'lt'\n : null\n\n let searchDateEnd\n if (options.dateType === 'datetime-local') {\n searchDateEnd = new Date(searchDate)\n searchDateEnd.setMinutes(searchDateEnd.getMinutes() + 1)\n } else if (options.dateType === 'date') {\n searchDateEnd = new Date(searchDate)\n searchDateEnd.setDate(searchDateEnd.getDate() + 1)\n }\n\n if (\n notNullOrUndefined(comparator) &&\n notNullOrUndefined(searchDateEnd)\n ) {\n filter = {\n filter: {\n and: [\n {\n [filterState.state.prop]: {\n [comparator]: searchDateEnd.toISOString(),\n },\n },\n ],\n },\n variables: {},\n }\n }\n\n break\n }\n case 'lt':\n case 'gte': {\n filter = {\n filter: {\n and: [\n {\n [filterState.state.prop]: {\n [formValue.searchType]: searchDate.toISOString(),\n },\n },\n ],\n },\n variables: {},\n }\n\n break\n }\n default:\n break\n }\n }\n } else if (\n THESEAM_COLUMNS_DATA_FILTER_DATE_RANGE_SEARCH_TYPES.includes(\n formValue.searchType,\n ) &&\n notNullOrUndefined(formValue.fromText) &&\n notNullOrUndefined(formValue.toText)\n ) {\n const fromDate = getFormattedDateForComparison(\n formValue.fromText,\n options.dateType,\n true,\n )\n const toDate = getFormattedDateForComparison(\n formValue.toText,\n options.dateType,\n true,\n )\n\n if (!isNaN(fromDate.valueOf()) && !isNaN(toDate.valueOf())) {\n let toDateEnd\n if (options.dateType === 'datetime-local') {\n toDateEnd = new Date(toDate)\n toDateEnd.setMinutes(toDateEnd.getMinutes() + 1)\n } else if (options.dateType === 'date') {\n toDateEnd = new Date(toDate)\n toDateEnd.setDate(toDateEnd.getDate() + 1)\n }\n\n if (notNullOrUndefined(toDateEnd)) {\n if (formValue.searchType === 'between') {\n filter = {\n filter: {\n and: [\n { [filterState.state.prop]: { gte: fromDate.toISOString() } },\n { [filterState.state.prop]: { lt: toDateEnd.toISOString() } },\n ],\n },\n variables: {},\n }\n } else if (formValue.searchType === 'not-between') {\n filter = {\n filter: {\n or: [\n { [filterState.state.prop]: { lt: fromDate.toISOString() } },\n { [filterState.state.prop]: { gt: toDateEnd.toISOString() } },\n ],\n },\n variables: {},\n }\n }\n }\n }\n } else if (formValue.searchType === 'blank') {\n filter = {\n filter: {\n or: [{ [filterState.state.prop]: { eq: null } }],\n },\n variables: {},\n }\n } else if (formValue.searchType === 'not-blank') {\n filter = {\n filter: {\n and: [{ [filterState.state.prop]: { neq: null } }],\n },\n variables: {},\n }\n }\n\n return filter\n}\n","import {\n ColumnsDataFilterState,\n TheSeamColumnsDataFilterNumericSearchFormState,\n THESEAM_COLUMNS_DATA_FILTER_NUMERIC_TEXT_SEARCH_TYPES,\n THESEAM_COLUMNS_DATA_FILTER_NUMERIC_RANGE_SEARCH_TYPES,\n} from '@theseam/ui-common/datatable'\nimport { isNullOrUndefined, notNullOrUndefined } from '@theseam/ui-common/utils'\nimport { FilterStateMapperResult } from './map-filter-states'\nimport { MapperContext } from './mapper-context'\n\nexport const mapSearchNumericColumnsDataFilterStateToGql = (\n filterState: ColumnsDataFilterState<TheSeamColumnsDataFilterNumericSearchFormState>,\n context: MapperContext<any>,\n): FilterStateMapperResult => {\n let filter = null\n\n if (isNullOrUndefined(filterState.state.prop)) {\n return filter\n }\n\n if (\n notNullOrUndefined(filterState.state.formValue) &&\n notNullOrUndefined(filterState.state.formValue.searchType)\n ) {\n if (\n THESEAM_COLUMNS_DATA_FILTER_NUMERIC_TEXT_SEARCH_TYPES.includes(\n filterState.state.formValue.searchType,\n ) &&\n notNullOrUndefined(filterState.state.formValue.searchText)\n ) {\n const searchNumeric = parseFloat(filterState.state.formValue.searchText)\n\n if (!isNaN(searchNumeric)) {\n filter = {\n filter: {\n and: [\n {\n [filterState.state.prop]: {\n [filterState.state.formValue.searchType]: searchNumeric,\n },\n },\n ],\n },\n variables: {},\n }\n }\n } else if (\n THESEAM_COLUMNS_DATA_FILTER_NUMERIC_RANGE_SEARCH_TYPES.includes(\n filterState.state.formValue.searchType,\n ) &&\n notNullOrUndefined(filterState.state.formValue.fromText) &&\n notNullOrUndefined(filterState.state.formValue.toText)\n ) {\n const fromNumeric = parseFloat(filterState.state.formValue.fromText)\n\n const toNumeric = parseFloat(filterState.state.formValue.toText)\n\n if (!isNaN(fromNumeric) && !isNaN(toNumeric)) {\n if (filterState.state.formValue.searchType === 'between') {\n filter = {\n filter: {\n and: [\n { [filterState.state.prop]: { gte: fromNumeric } },\n { [filterState.state.prop]: { lte: toNumeric } },\n ],\n },\n variables: {},\n }\n } else if (filterState.state.formValue.searchType === 'not-between') {\n filter = {\n filter: {\n or: [\n { [filterState.state.prop]: { lt: fromNumeric } },\n { [filterState.state.prop]: { gt: toNumeric } },\n ],\n },\n variables: {},\n }\n }\n }\n } else if (filterState.state.formValue.searchType === 'blank') {\n filter = {\n filter: {\n or: [\n { [filterState.state.prop]: { eq: null } },\n { [filterState.state.prop]: { eq: '' } },\n ],\n },\n variables: {},\n }\n } else if (filterState.state.formValue.searchType === 'not-blank') {\n filter = {\n filter: {\n and: [\n { [filterState.state.prop]: { neq: null } },\n { [filterState.state.prop]: { neq: '' } },\n ],\n },\n variables: {},\n }\n }\n }\n\n return filter\n}\n","import {\n ColumnsDataFilterState,\n TheSeamColumnsDataFilterTextSearchFormState,\n THESEAM_COLUMNS_DATA_FILTER_TEXT_TEXT_SEARCH_TYPES,\n} from '@theseam/ui-common/datatable'\nimport { isNullOrUndefined, notNullOrUndefined } from '@theseam/ui-common/utils'\nimport { FilterStateMapperResult } from './map-filter-states'\nimport { MapperContext } from './mapper-context'\n\nexport const mapSearchTextColumnsDataFilterStateToGql = (\n filterState: ColumnsDataFilterState<TheSeamColumnsDataFilterTextSearchFormState>,\n context: MapperContext<any>,\n): FilterStateMapperResult => {\n let filter = null\n\n if (isNullOrUndefined(filterState.state.prop)) {\n return filter\n }\n\n if (\n notNullOrUndefined(filterState.state.formValue) &&\n notNullOrUndefined(filterState.state.formValue.searchType)\n ) {\n if (\n THESEAM_COLUMNS_DATA_FILTER_TEXT_TEXT_SEARCH_TYPES.includes(\n filterState.state.formValue.searchType,\n ) &&\n notNullOrUndefined(filterState.state.formValue.searchText)\n ) {\n filter = {\n filter: {\n and: [\n {\n [filterState.state.prop]: {\n [filterState.state.formValue.searchType]:\n filterState.state.formValue.searchText,\n },\n },\n ],\n },\n variables: {},\n }\n } else if (filterState.state.formValue.searchType === 'blank') {\n filter = {\n filter: {\n or: [\n { [filterState.state.prop]: { eq: null } },\n { [filterState.state.prop]: { eq: '' } },\n ],\n },\n variables: {},\n }\n } else if (filterState.state.formValue.searchType === 'not-blank') {\n filter = {\n filter: {\n and: [\n { [filterState.state.prop]: { neq: null } },\n { [filterState.state.prop]: { neq: '' } },\n ],\n },\n variables: {},\n }\n }\n }\n\n return filter\n}\n","import { gql } from 'apollo-angular'\n\nexport const baseSchemaFragment = gql`\n input ComparableInt32OperationFilterInput {\n eq: Int\n neq: Int\n in: [Int!]\n nin: [Int!]\n gt: Int\n ngt: Int\n gte: Int\n ngte: Int\n lt: Int\n nlt: Int\n lte: Int\n nlte: Int\n objectContains: String\n }\n\n input StringOperationFilterInput {\n and: [StringOperationFilterInput!]\n or: [StringOperationFilterInput!]\n eq: String\n neq: String\n contains: String\n ncontains: String\n in: [String]\n nin: [String]\n startsWith: String\n nstartsWith: String\n endsWith: String\n nendsWith: String\n objectContains: String\n }\n\n input ComparableDateTimeOffsetOperationFilterInput {\n eq: DateTime\n neq: DateTime\n in: [DateTime!]\n nin: [DateTime!]\n gt: DateTime\n ngt: DateTime\n gte: DateTime\n ngte: DateTime\n lt: DateTime\n nlt: DateTime\n lte: DateTime\n nlte: DateTime\n objectContains: String\n }\n\n input BooleanOperationFilterInput {\n eq: Boolean\n neq: Boolean\n objectContains: String\n }\n\n input ComparableNullableOfDateTimeOffsetOperationFilterInput {\n eq: DateTime\n neq: DateTime\n in: [DateTime]\n nin: [DateTime]\n gt: DateTime\n ngt: DateTime\n gte: DateTime\n ngte: DateTime\n lt: DateTime\n nlt: DateTime\n lte: DateTime\n nlte: DateTime\n objectContains: String\n }\n\n enum SortEnumType {\n ASC\n DESC\n }\n\n \"\"\"\n The \\`DateTime\\` scalar represents an ISO-8601 compliant date time type.\n \"\"\"\n scalar DateTime\n\n scalar Uuid\n\n \"\"\"\n The built-in \\`Decimal\\` scalar type.\n \"\"\"\n scalar Decimal\n\n \"\"\"\n The \\`Long\\` scalar type represents non-fractional signed whole 64-bit numeric values. Long can represent values between -(2^63) and 2^63 - 1.\n \"\"\"\n scalar Long\n\n \"\"\"\n Information about the offset pagination.\n \"\"\"\n type CollectionSegmentInfo {\n \"\"\"\n Indicates whether more items exist following the set defined by the clients arguments.\n \"\"\"\n hasNextPage: Boolean!\n\n \"\"\"\n Indicates whether more items exist prior the set defined by the clients arguments.\n \"\"\"\n hasPreviousPage: Boolean!\n }\n`\n","export type WhereArg = Record<string, any>\n\n/**\n * The set of leaf-level operator keys used by HotChocolate filter inputs\n * (e.g. StringOperationFilterInput, ComparableInt32OperationFilterInput).\n * Any key not in this set is treated as a field name, causing the evaluator\n * to recurse into `value[key]`.\n */\nconst OPERATOR_KEYS = new Set([\n 'eq',\n 'neq',\n 'gt',\n 'gte',\n 'lt',\n 'lte',\n 'ngt',\n 'ngte',\n 'nlt',\n 'nlte',\n 'in',\n 'nin',\n 'contains',\n 'ncontains',\n 'startsWith',\n 'nstartsWith',\n 'endsWith',\n 'nendsWith',\n 'objectContains',\n])\n\nfunction applyOperator(operator: string, value: any, operand: any): boolean {\n switch (operator) {\n case 'eq':\n return value === operand\n case 'neq':\n return value !== operand\n case 'gt':\n return value > operand\n case 'gte':\n return value >= operand\n case 'lt':\n return value < operand\n case 'lte':\n return value <= operand\n // Negated comparisons — logical complements of the above\n case 'ngt':\n return !(value > operand) // equivalent to lte\n case 'ngte':\n return !(value >= operand) // equivalent to lt\n case 'nlt':\n return !(value < operand) // equivalent to gte\n case 'nlte':\n return !(value <= operand) // equivalent to gt\n case 'in':\n return Array.isArray(operand) && operand.includes(value)\n case 'nin':\n return Array.isArray(operand) && !operand.includes(value)\n case 'contains':\n return (\n typeof value === 'string' &&\n typeof operand === 'string' &&\n value.includes(operand)\n )\n case 'ncontains':\n return (\n typeof value === 'string' &&\n typeof operand === 'string' &&\n !value.includes(operand)\n )\n case 'startsWith':\n return (\n typeof value === 'string' &&\n typeof operand === 'string' &&\n value.startsWith(operand)\n )\n case 'nstartsWith':\n return (\n typeof value === 'string' &&\n typeof operand === 'string' &&\n !value.startsWith(operand)\n )\n case 'endsWith':\n return (\n typeof value === 'string' &&\n typeof operand === 'string' &&\n value.endsWith(operand)\n )\n case 'nendsWith':\n return (\n typeof value === 'string' &&\n typeof operand === 'string' &&\n !value.endsWith(operand)\n )\n case 'objectContains': {\n // Custom Seam/HotChocolate operator: convert the field value to a string\n // and check if it contains the operand (case-insensitive, matching search UX).\n const strValue = value == null ? '' : String(value)\n const strOperand = operand == null ? '' : String(operand)\n return strValue.toLowerCase().includes(strOperand.toLowerCase())\n }\n default:\n throw new Error(`Unknown filter operator: \"${operator}\"`)\n }\n}\n\n/**\n * Recursively evaluates a HotChocolate-style filter against a value.\n *\n * Rules:\n * - `and` array: all sub-filters must pass (AND logic)\n * - `or` array: at least one sub-filter must pass (OR logic)\n * - Known operator keys (`eq`, `contains`, `gt`, ...): apply the operator to\n * the current `value`\n * - Any other key: treat as a field name; recurse with `value[key]` and the\n * nested filter\n * - All non-`and`/`or` conditions are implicitly ANDed together\n */\nfunction evaluateCondition(value: any, filter: any): boolean {\n if (filter === null || filter === undefined) {\n return true\n }\n\n if (Array.isArray(filter.and)) {\n if (!filter.and.every((f: any) => evaluateCondition(value, f))) {\n return false\n }\n }\n\n if (Array.isArray(filter.or)) {\n if (!filter.or.some((f: any) => evaluateCondition(value, f))) {\n return false\n }\n }\n\n for (const key of Object.keys(filter)) {\n if (key === 'and' || key === 'or') {\n continue\n }\n\n if (OPERATOR_KEYS.has(key)) {\n if (!applyOperator(key, value, filter[key])) {\n return false\n }\n } else {\n if (!evaluateCondition(value?.[key], filter[key])) {\n return false\n }\n }\n }\n\n return true\n}\n\n/**\n * Filters an array using a HotChocolate-style where clause.\n *\n * Top-level field conditions are implicitly ANDed. Use `and`/`or` arrays for\n * explicit logical grouping.\n *\n * @example\n * filterWhere(records, { name: { contains: 'foo' }, id: { gt: 5 } })\n * filterWhere(records, { or: [{ name: { eq: 'a' } }, { name: { eq: 'b' } }] })\n */\nexport function filterWhere<T>(data: T[], where: WhereArg): T[] {\n return data.filter((item) => evaluateCondition(item, where))\n}\n","export function skipAndTake<T>(data: T[], skip: number, take: number): T[] {\n if (skip < 0) {\n throw Error(`Invalid 'skip' value: ${skip}`)\n }\n\n // if (take > data.length) {\n // throw Error(`Invalid 'take' value: ${take}`)\n // }\n\n const tmp: T[] = []\n for (let i = skip; i < take + skip && i < data.length; i++) {\n tmp.push(data[i])\n }\n\n return tmp\n}\n","/**\n * A single sort clause in HotChocolate's order format.\n * Each object has exactly one key: the field name, with a value of 'ASC' or 'DESC'.\n *\n * @example { memberOrganizationName: 'ASC' }\n */\nexport type SortClause = Record<string, 'ASC' | 'DESC'>\n\n/**\n * Sorts an array by a HotChocolate-style `order` argument.\n *\n * Earlier entries in the array take higher sort precedence. When two records\n * are equal on all sort clauses they retain their original relative order\n * (stable sort).\n *\n * Handles strings (locale-aware), numbers/dates, booleans, and null/undefined\n * values (nulls sort last for both ASC and DESC).\n *\n * @example\n * sortItems(records, [{ name: 'ASC' }, { id: 'DESC' }])\n */\nexport function sortItems<T>(items: T[], order: SortClause[]): T[] {\n if (!order || order.length === 0) {\n return items\n }\n\n return [...items].sort((a, b) => {\n for (const clause of order) {\n const entries = Object.entries(clause)\n if (entries.length === 0) {\n continue\n }\n\n const [field, direction] = entries[0]\n const aVal = (a as any)[field]\n const bVal = (b as any)[field]\n\n // Nulls always sort last regardless of direction — check before inverting.\n const aNull = aVal == null\n const bNull = bVal == null\n if (aNull && bNull) continue\n if (aNull) return 1\n if (bNull) return -1\n\n const comparison = _compareNonNullValues(aVal, bVal)\n if (comparison !== 0) {\n return direction === 'DESC' ? -comparison : comparison\n }\n }\n\n return 0\n })\n}\n\nfunction _compareNonNullValues(a: any, b: any): number {\n if (typeof a === 'string' && typeof b === 'string') {\n return a.localeCompare(b)\n }\n\n if (a < b) return -1\n if (a > b) return 1\n return 0\n}\n","import { filterWhere, WhereArg } from './filter-where'\nimport { skipAndTake } from './skip-and-take'\nimport { sortItems, SortClause } from './sort-items'\n\nexport interface FilteredResultsPageInfo {\n hasNextPage: boolean\n hasPreviousPage: boolean\n}\n\nexport interface FilteredResults<T> {\n items: T[]\n pageInfo: FilteredResultsPageInfo\n totalCount: number\n}\n\nexport function filteredResults<T>(items: T[], args: any): FilteredResults<T> {\n let _items = items\n const where: WhereArg = args?.where\n if (where !== undefined) {\n _items = filterWhere(_items, where)\n }\n\n const order: SortClause[] = args?.order\n if (order !== undefined) {\n _items = sortItems(_items, order)\n }\n\n const totalCount = _items.length\n\n const skip = args?.skip ?? 0\n const take = args?.take ?? _items.length\n if (args?.skip !== undefined || args?.take !== undefined) {\n _items = skipAndTake(_items, skip, take)\n }\n\n const pageInfo: FilteredResultsPageInfo = {\n hasNextPage: skip + take < totalCount,\n hasPreviousPage: skip > 0,\n }\n\n return {\n items: _items,\n pageInfo,\n totalCount,\n }\n}\n","import { EventEmitter } from '@angular/core'\nimport { BehaviorSubject, Observable } from 'rxjs'\n\nimport { DataFilterState } from '@theseam/ui-common/data-filters'\nimport {\n SortEvent,\n SortItem,\n TheSeamDatatableColumn,\n TheSeamPageInfo,\n} from '@theseam/ui-common/datatable'\n\nimport { GqlDatatableAccessor } from '../models'\n\nexport class MockDatatable implements GqlDatatableAccessor {\n private readonly _columnsSubject = new BehaviorSubject<\n TheSeamDatatableColumn[]\n >([])\n public readonly columns$: Observable<TheSeamDatatableColumn[]> =\n this._columnsSubject.asObservable()\n\n private readonly _filterStatesSubject = new BehaviorSubject<\n DataFilterState[]\n >([])\n\n private _sorts: SortItem[] = []\n private _rows: any[] = []\n private _offset = 0\n private _rowHeight = 50\n private _bodyHeight = 500\n private _scrolledPosV = 0\n\n page = new EventEmitter<TheSeamPageInfo>()\n resize = new EventEmitter<any>()\n externalSorting = false\n\n sort: EventEmitter<SortEvent> = new EventEmitter<SortEvent>()\n get sorts(): SortItem[] {\n return this._sorts\n }\n set sorts(value: SortItem[]) {\n this._sorts = value\n }\n\n get pageInfo(): TheSeamPageInfo {\n return this.ngxDatatable\n }\n\n public readonly filterStates: Observable<DataFilterState[]> =\n this._filterStatesSubject.asObservable()\n\n static pageDefaults(dt: any, defaultPageSize: number = 20): TheSeamPageInfo {\n return {\n offset: (dt as any).ngxDatatable?.offset ?? 0,\n pageSize: (dt as any).ngxDatatable?.pageSize ?? defaultPageSize,\n limit: (dt as any).ngxDatatable?.limit,\n count: (dt as any).ngxDatatable?.count ?? 0,\n }\n }\n\n get ngxDatatable(): {\n offset: number\n pageSize: number\n limit?: number\n count: number\n } {\n return {\n offset: this.getPage(),\n pageSize: this.getPageSize(),\n count: this._rows.length,\n }\n }\n\n setColumns(v: TheSeamDatatableColumn[]): void {\n this._columnsSubject.next(v)\n }\n\n setSorts(v: SortItem[]): void {\n this._sorts = v\n this.sort.emit({ sorts: this._sorts })\n }\n\n setFilterStates(v: DataFilterState[]): void {\n this._filterStatesSubject.next(v)\n }\n\n getNumPages(): number {\n if (this._rows.length === 0) {\n return 1\n }\n const t = Math.ceil(this._rows.length / this.getPageSize())\n if (t <= 0) {\n return 1\n }\n return t\n }\n\n _calcPage(): number {\n // This page calculation could most likely be simplified.\n const bodyHeight = this._rowHeight * this.getPageSize()\n const visibleHeight = this._bodyHeight + this._scrolledPosV\n const pages = Math.floor(visibleHeight / bodyHeight)\n const overflow = visibleHeight - pages * bodyHeight\n const page = overflow > 1 ? pages + 1 : pages\n return page - 1\n }\n\n _calcScrolledPosV(): number {\n return this._offset * this._rowHeight\n }\n\n getPage(): number {\n return this._offset\n }\n\n setPage(v: number): void {\n let _v = v\n if (_v === this.getPage()) {\n return\n }\n\n if (_v > this.getNumPages() - 1) {\n // Should this throw an error instead?\n _v = this.getNumPages() - 1\n }\n\n this._offset = _v\n this._scrolledPosV = this._calcScrolledPosV()\n this.page.emit(this.ngxDatatable)\n }\n\n getPageSize(): number {\n return Math.floor(this._bodyHeight / this._rowHeight)\n }\n\n setRows(v: any[]): void {\n this._rows = v\n }\n\n setScrolledPosV(v: number): void {\n if (this._scrolledPosV === v) {\n return\n }\n const pageBefore = this.getPage()\n this._scrolledPosV = v\n this._offset = this._calcPage()\n if (this.getPage() !== pageBefore) {\n this.page.emit(this.ngxDatatable)\n }\n }\n\n /**\n * Returns the height of a row.\n *\n * NOTE: This will not be accurate if your rows do not use a single fixed\n * height for each row.\n */\n getRowHeight() {\n return this._rowHeight\n }\n}\n","import { notNullOrUndefined } from '@theseam/ui-common/utils'\n\nexport function checkRecordsHaveValue(\n arr: any[] | null,\n indices: (number | [startIndex: number, endIndex: number])[],\n testValueCheckProp: string | null = 'name',\n onlyCheckProvidedIndices: boolean = false,\n): void {\n if (indices.length > 0 && !Array.isArray(arr)) {\n throw Error(`Records array should be defined.`)\n }\n\n if (!Array.isArray(arr)) {\n return\n }\n\n for (let i = 0; i < arr.length; i++) {\n const item = arr[i]\n if (_isOneOfIndices(indices, i)) {\n if (!notNullOrUndefined(arr[i])) {\n throw Error(`Record at index '${i}' should be defined.`)\n }\n if (notNullOrUndefined(testValueCheckProp)) {\n const actualValue = item[testValueCheckProp]\n const expectedValue = `Item_${i}`\n if (actualValue !== expectedValue) {\n throw Error(\n `Record at index '${i}' should be '${expectedValue}', but is '${actualValue}'`,\n )\n }\n }\n } else {\n if (!onlyCheckProvidedIndices) {\n const isItemDefined = notNullOrUndefined(testValueCheckProp)\n ? notNullOrUndefined(item?.[testValueCheckProp])\n : notNullOrUndefined(item)\n if (isItemDefined) {\n throw Error(`Record at index '${i}' should not be defined.`)\n }\n }\n }\n }\n}\n\n/**\n * NOTE: This is a very niave implementation that could be improved.\n */\nfunction _isOneOfIndices(\n indices: (number | [startIndex: number, endIndex: number])[],\n index: number,\n): boolean {\n for (const r of indices) {\n if (Array.isArray(r)) {\n if (index >= r[0] && index <= r[1]) {\n return true\n }\n } else {\n if (index === r) {\n return true\n }\n }\n }\n\n return false\n}\n","import { ApolloLink, Observable, Operation } from '@apollo/client/core'\nimport { Kind, OperationDefinitionNode, valueFromASTUntyped } from 'graphql'\n\nexport interface MockGraphQLLinkOptions {\n resolve: (operation: Operation) => any\n delay?: number\n}\n\n/**\n * Extracts the effective field arguments from the top-level selections of a\n * processed query, merging inlined literal values back with the remaining\n * operation variables.\n *\n * When {@link queryProcessingLink} inlines a variable (e.g. `where`) into the\n * query AST, it removes that variable from `operation.variables`. A real\n * GraphQL server would still resolve the inlined literal when executing the\n * field resolver, but a mock link that only looks at `operation.variables`\n * would miss it. This function bridges that gap.\n */\nfunction resolveEffectiveVariables(operation: Operation): Record<string, any> {\n const merged: Record<string, any> = { ...operation.variables }\n\n const opDef = operation.query.definitions.find(\n (d): d is OperationDefinitionNode => d.kind === Kind.OPERATION_DEFINITION,\n )\n if (!opDef) return merged\n\n for (const sel of opDef.selectionSet.selections) {\n if (sel.kind === Kind.FIELD && sel.arguments) {\n for (const arg of sel.arguments) {\n if (arg.value.kind !== Kind.VARIABLE) {\n merged[arg.name.value] = valueFromASTUntyped(\n arg.value,\n operation.variables,\n )\n }\n }\n }\n }\n\n return merged\n}\n\nexport function mockGraphQLLink(options: MockGraphQLLinkOptions) {\n return new ApolloLink((operation, forward) => {\n return new Observable((subscriber) => {\n const execute = () => {\n operation.variables = resolveEffectiveVariables(operation)\n const response = options.resolve(operation)\n operation.setContext({ response })\n subscriber.next(response)\n subscriber.complete()\n }\n\n if (options.delay && options.delay > 0) {\n const timeoutId = setTimeout(execute, options.delay)\n return () => clearTimeout(timeoutId)\n }\n\n execute()\n return () => {}\n })\n })\n}\n","import { concat, InMemoryCache, Operation } from '@apollo/client'\nimport { provideApollo } from 'apollo-angular'\nimport { Provider } from '@angular/core'\n\nimport { queryProcessingLink } from '../apollo-links/query-processing-link'\nimport { mockGraphQLLink } from './mock-graphql-link'\n\nexport interface MockApolloTestingProviderOptions {\n resolve: (operation: Operation) => any\n delay?: number\n}\n\n/**\n * Creates Apollo providers configured like our apps, except with the Apollo\n * HttpLink replaced with a mock link that delegates to a `resolve` callback.\n * No GraphQL schema is required — the resolve function returns the response\n * directly, typically using `filteredResults` for sorting/filtering/paging.\n */\nexport function createMockApolloTestingProvider(\n options: MockApolloTestingProviderOptions,\n): Provider {\n return provideApollo(() => ({\n cache: new InMemoryCache(),\n link: concat(\n queryProcessingLink,\n mockGraphQLLink({\n resolve: options.resolve,\n delay: options.delay,\n }),\n ),\n defaultOptions: {\n watchQuery: {\n fetchPolicy: 'cache-and-network',\n errorPolicy: 'ignore',\n },\n query: {\n fetchPolicy: 'network-only',\n errorPolicy: 'all',\n },\n },\n }))\n}\n","import { gql } from 'apollo-angular'\n\nimport { filteredResults } from '../filtered-results'\n\nexport interface SimpleGqlTestRecord {\n id: number\n name: string\n}\n\nexport function createSimpleGqlTestRecord(num: number): SimpleGqlTestRecord {\n return { id: num, name: `Item_${num}` }\n}\n\nexport function createSimpleGqlTestRoot(numRecords: number) {\n const _records: SimpleGqlTestRecord[] = []\n for (let i = 0; i < numRecords; i++) {\n _records.push(createSimpleGqlTestRecord(i))\n }\n\n return {\n simpleGqlTestRecords: (args?: any) => filteredResults([..._records], args),\n }\n}\n\nexport const SIMPLE_GQL_TEST_QUERY = gql`\n query ExampleQuery(\n $skip: Int\n $take: Int\n $order: [SimpleGqlTestRecordSortInput!]\n $where: SimpleGqlTestRecordFilterInput\n ) {\n simpleGqlTestRecords(\n skip: $skip\n take: $take\n order: $order\n where: $where\n ) {\n items {\n id\n name\n }\n totalCount\n }\n }\n`\n\n/**\n * Like {@link SIMPLE_GQL_TEST_QUERY} but includes `$search: String` for use\n * with search filters that inline a `gqlVar('search')` reference via\n * `queryProcessingConfig.variables.inline`.\n */\nexport const SIMPLE_GQL_TEST_SEARCH_QUERY = gql`\n query ExampleQuery(\n $skip: Int\n $take: Int\n $order: [SimpleGqlTestRecordSortInput!]\n $where: SimpleGqlTestRecordFilterInput\n $search: String\n ) {\n simpleGqlTestRecords(\n skip: $skip\n take: $take\n order: $order\n where: $where\n ) {\n items {\n id\n name\n }\n totalCount\n }\n }\n`\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface SimpleGqlTestExtraVariables {}\n\nexport interface SimpleGqlTestVariables extends SimpleGqlTestExtraVariables {\n skip?: number\n take?: number\n order?: Partial<Record<keyof SimpleGqlTestRecord, 'ASC' | 'DESC'>>[]\n where?: any\n search?: string\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["visit","BREAK","Observable"],"mappings":"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"}
|
package/graphql/index.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { DocumentNode, ValueNode, Token } from 'graphql/language';
|
|
|
3
3
|
import { DocumentNode as DocumentNode$1, ValueNode as ValueNode$1, OperationDefinitionNode, VariableDefinitionNode, VariableNode, ArgumentNode, FieldNode, Token as Token$1, GraphQLFormattedError } from 'graphql';
|
|
4
4
|
import { Operation } from '@apollo/client';
|
|
5
5
|
import { Observable } from 'rxjs';
|
|
6
|
-
import { DatatableComponent, SortItem, TheSeamPageInfo, ColumnsDataFilterState, TheSeamColumnsDataFilterDateSearchFormState, TheSeamColumnsDataFilterDateSearchOptions, TheSeamColumnsDataFilterNumericSearchFormState, TheSeamColumnsDataFilterTextSearchFormState, SortEvent } from '@theseam/ui-common/datatable';
|
|
6
|
+
import { DatatableComponent, TheSeamDatatableColumn, SortItem, TheSeamPageInfo, ColumnsDataFilterState, TheSeamColumnsDataFilterDateSearchFormState, TheSeamColumnsDataFilterDateSearchOptions, TheSeamColumnsDataFilterNumericSearchFormState, TheSeamColumnsDataFilterTextSearchFormState, SortEvent } from '@theseam/ui-common/datatable';
|
|
7
7
|
import * as apollo_angular from 'apollo-angular';
|
|
8
8
|
import { QueryRef, WatchQueryOptions, Apollo } from 'apollo-angular';
|
|
9
9
|
import { DataFilterState } from '@theseam/ui-common/data-filters';
|
|
@@ -124,7 +124,7 @@ declare class GQLVariable {
|
|
|
124
124
|
constructor(name: string, type: string);
|
|
125
125
|
}
|
|
126
126
|
|
|
127
|
-
type GqlDatatableAccessor = Pick<DatatableComponent, 'page' | 'sort' | 'sorts' | 'filterStates' | 'pageInfo' | 'externalSorting'> & {
|
|
127
|
+
type GqlDatatableAccessor = Pick<DatatableComponent, 'page' | 'sort' | 'sorts' | 'filterStates' | 'pageInfo' | 'externalSorting' | 'columns$'> & {
|
|
128
128
|
ngxDatatable: {
|
|
129
129
|
offset: number;
|
|
130
130
|
pageSize: number;
|
|
@@ -273,6 +273,7 @@ declare class DatatableGraphQLQueryRef<TData, TVariables extends DatatableGraphQ
|
|
|
273
273
|
|
|
274
274
|
type MapperContext<TExtraVariables = EmptyObject> = {
|
|
275
275
|
extraVariables: TExtraVariables;
|
|
276
|
+
columns?: TheSeamDatatableColumn[];
|
|
276
277
|
} & {
|
|
277
278
|
[name: string]: any;
|
|
278
279
|
};
|
|
@@ -361,37 +362,57 @@ type SortsMapperFieldEntry = string | null | ((prop: string, context: MapperCont
|
|
|
361
362
|
type SortsMapperFieldMap<TRow extends Record<string, any>> = {
|
|
362
363
|
[K in keyof TRow & string]?: SortsMapperFieldEntry;
|
|
363
364
|
};
|
|
365
|
+
/**
|
|
366
|
+
* Options for {@link createSortsMapper}.
|
|
367
|
+
*/
|
|
368
|
+
interface CreateSortsMapperOptions {
|
|
369
|
+
/**
|
|
370
|
+
* When `true` (the default), sort items whose `prop` is not listed in
|
|
371
|
+
* the field map are automatically mapped using the prop value as the
|
|
372
|
+
* GQL field name, provided a column with that prop exists in the
|
|
373
|
+
* current datatable and has `sortable` not explicitly set to `false`.
|
|
374
|
+
*
|
|
375
|
+
* This eliminates boilerplate for the common case where column props
|
|
376
|
+
* match GQL field names. The field map becomes an override/exclusion
|
|
377
|
+
* map: list only columns that need a different GQL name or `null` to
|
|
378
|
+
* suppress sorting.
|
|
379
|
+
*
|
|
380
|
+
* Set to `false` to require every sortable column to be explicitly
|
|
381
|
+
* listed in the field map (with a dev-mode error for unmapped props).
|
|
382
|
+
*/
|
|
383
|
+
autoMap?: boolean;
|
|
384
|
+
}
|
|
364
385
|
/**
|
|
365
386
|
* Creates a {@link SortsMapper} from a declarative field-name map.
|
|
366
387
|
*
|
|
367
|
-
*
|
|
368
|
-
*
|
|
388
|
+
* By default, `autoMap` is enabled: columns not listed in the field map
|
|
389
|
+
* are automatically mapped using their `prop` as the GQL field name,
|
|
390
|
+
* provided the column exists in the datatable and has `sortable` not
|
|
391
|
+
* explicitly set to `false`. This guards against stale sort preferences
|
|
392
|
+
* for removed columns.
|
|
393
|
+
*
|
|
394
|
+
* Each key in `fieldMap` must correspond to a datatable column `prop`
|
|
395
|
+
* value. The value controls how that column's sort is translated:
|
|
369
396
|
*
|
|
370
397
|
* - `string` – emits `{ [gqlField]: 'ASC' | 'DESC' }`
|
|
371
398
|
* - `null` – column is not sortable; the sort item is dropped
|
|
372
399
|
* - `function` – called with `(prop, context)` and may return a field
|
|
373
400
|
* name or `null` to drop the item dynamically
|
|
374
401
|
*
|
|
375
|
-
* In dev mode an error is thrown when a sort item's `prop` is not present
|
|
376
|
-
* in the map. In production the item is silently dropped.
|
|
377
|
-
*
|
|
378
402
|
* @example
|
|
379
|
-
* //
|
|
403
|
+
* // Auto-map all columns, override one
|
|
380
404
|
* const mapSorts = createSortsMapper<MyRow>({
|
|
381
|
-
*
|
|
382
|
-
* name: 'name',
|
|
405
|
+
* computedField: 'gql_computed_field',
|
|
383
406
|
* })
|
|
384
407
|
*
|
|
385
408
|
* @example
|
|
386
|
-
* //
|
|
409
|
+
* // Opt out of auto-mapping (explicit field map required)
|
|
387
410
|
* const mapSorts = createSortsMapper<MyRow>({
|
|
388
411
|
* id: 'id',
|
|
389
412
|
* name: 'name',
|
|
390
|
-
*
|
|
391
|
-
* context.extraVariables.useAlt ? 'altField' : prop,
|
|
392
|
-
* })
|
|
413
|
+
* }, { autoMap: false })
|
|
393
414
|
*/
|
|
394
|
-
declare function createSortsMapper<TRow extends Record<string, any>>(fieldMap: SortsMapperFieldMap<TRow
|
|
415
|
+
declare function createSortsMapper<TRow extends Record<string, any>>(fieldMap: SortsMapperFieldMap<TRow>, options?: CreateSortsMapperOptions): SortsMapper;
|
|
395
416
|
|
|
396
417
|
/**
|
|
397
418
|
* NOTE: Any of ApolloClient's WatchQueryOptions properties can be set, but I
|
|
@@ -505,6 +526,8 @@ interface FilteredResults<T> {
|
|
|
505
526
|
declare function filteredResults<T>(items: T[], args: any): FilteredResults<T>;
|
|
506
527
|
|
|
507
528
|
declare class MockDatatable implements GqlDatatableAccessor {
|
|
529
|
+
private readonly _columnsSubject;
|
|
530
|
+
readonly columns$: Observable<TheSeamDatatableColumn[]>;
|
|
508
531
|
private readonly _filterStatesSubject;
|
|
509
532
|
private _sorts;
|
|
510
533
|
private _rows;
|
|
@@ -527,6 +550,7 @@ declare class MockDatatable implements GqlDatatableAccessor {
|
|
|
527
550
|
limit?: number;
|
|
528
551
|
count: number;
|
|
529
552
|
};
|
|
553
|
+
setColumns(v: TheSeamDatatableColumn[]): void;
|
|
530
554
|
setSorts(v: SortItem[]): void;
|
|
531
555
|
setFilterStates(v: DataFilterState[]): void;
|
|
532
556
|
getNumPages(): number;
|
|
@@ -592,4 +616,4 @@ interface SimpleGqlTestVariables extends SimpleGqlTestExtraVariables {
|
|
|
592
616
|
}
|
|
593
617
|
|
|
594
618
|
export { DATATABLE_GRAPHQL_SERVICE_CONFIG, DEFAULT_PAGE_SIZE, DEFAULT_TO_REMOVE_ON_UNDEFINED, DatatableGraphQLQueryRef, DatatableGraphqlService, GQLDirection, GQLVariable, HINT_NAMES_CAPTURE_REGEX, HINT_PREFIX_REGEX, HintsKind, MAX_ERROR_RECOVERY_ATTEMPTS, MockDatatable, SIMPLE_GQL_TEST_QUERY, SIMPLE_GQL_TEST_SEARCH_QUERY, baseSchemaFragment, checkRecordsHaveValue, containsVariable, createHintsToken, createMockApolloTestingProvider, createSimpleGqlTestRecord, createSimpleGqlTestRoot, createSortsMapper, filterWhere, filteredResults, getHintsToken, getPageInfo, getTokenAppliesTo, gqlVar, hintNamesFromHintToken, hintsTokensContainingHint, inlineVariable, inlineVariableHintDef, inlineVariableTransformer, isCommentToken, isHintToken, isInlineComment, logQueryLink, mapFilterStates, mapSearchDateColumnsDataFilterStateToGql, mapSearchNumericColumnsDataFilterStateToGql, mapSearchTextColumnsDataFilterStateToGql, mockGraphQLLink, observeRowsWithGqlInputsHandling, parseAst, parseComments, parseHints, queryProcessingLink, removeNotDefinedHintDef, removeNotDefinedTransformer, removeVariable, removeVariableDefinition, removeVariableDefinitionsNotDefined, skipAndTake, sortItems, toGQL };
|
|
595
|
-
export type { DatatableGraphQLDataMapper, DatatableGraphQLDataMapperResult, DatatableGraphQLErrorHandler, DatatableGraphQLVariables, DatatableGraphqlServiceConfig, DatatableQueryOptions, EmptyObject, FilterStateMapper, FilterStateMapperFilter, FilterStateMapperResult, FilterStateMapperVariables, FilterStateMappers, FilteredResults, FilteredResultsPageInfo, GqlDatatableAccessor, HintDefinition, HintTransformOperation, HintTransformer, HintsToken, LogQueryLinkOptions, MapperContext, MockApolloTestingProviderOptions, MockGraphQLLinkOptions, QueryProcessingConfig, QueryProcessingVariablesConfig, SimpleGqlTestExtraVariables, SimpleGqlTestRecord, SimpleGqlTestVariables, SortClause, SortsMapper, SortsMapperFieldEntry, SortsMapperFieldMap, SortsMapperResult, TypedFilterInput, TypedFilterStateMapperResult, WhereArg };
|
|
619
|
+
export type { CreateSortsMapperOptions, DatatableGraphQLDataMapper, DatatableGraphQLDataMapperResult, DatatableGraphQLErrorHandler, DatatableGraphQLVariables, DatatableGraphqlServiceConfig, DatatableQueryOptions, EmptyObject, FilterStateMapper, FilterStateMapperFilter, FilterStateMapperResult, FilterStateMapperVariables, FilterStateMappers, FilteredResults, FilteredResultsPageInfo, GqlDatatableAccessor, HintDefinition, HintTransformOperation, HintTransformer, HintsToken, LogQueryLinkOptions, MapperContext, MockApolloTestingProviderOptions, MockGraphQLLinkOptions, QueryProcessingConfig, QueryProcessingVariablesConfig, SimpleGqlTestExtraVariables, SimpleGqlTestRecord, SimpleGqlTestVariables, SortClause, SortsMapper, SortsMapperFieldEntry, SortsMapperFieldMap, SortsMapperResult, TypedFilterInput, TypedFilterStateMapperResult, WhereArg };
|