@memberjunction/ng-entity-viewer 0.0.1 → 2.121.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/README.md +224 -43
  2. package/dist/lib/entity-cards/entity-cards.component.d.ts +163 -0
  3. package/dist/lib/entity-cards/entity-cards.component.d.ts.map +1 -0
  4. package/dist/lib/entity-cards/entity-cards.component.js +797 -0
  5. package/dist/lib/entity-cards/entity-cards.component.js.map +1 -0
  6. package/dist/lib/entity-grid/entity-grid.component.d.ts +216 -0
  7. package/dist/lib/entity-grid/entity-grid.component.d.ts.map +1 -0
  8. package/dist/lib/entity-grid/entity-grid.component.js +676 -0
  9. package/dist/lib/entity-grid/entity-grid.component.js.map +1 -0
  10. package/dist/lib/entity-record-detail-panel/entity-record-detail-panel.component.d.ts +182 -0
  11. package/dist/lib/entity-record-detail-panel/entity-record-detail-panel.component.d.ts.map +1 -0
  12. package/dist/lib/entity-record-detail-panel/entity-record-detail-panel.component.js +787 -0
  13. package/dist/lib/entity-record-detail-panel/entity-record-detail-panel.component.js.map +1 -0
  14. package/dist/lib/entity-viewer/entity-viewer.component.d.ts +252 -0
  15. package/dist/lib/entity-viewer/entity-viewer.component.d.ts.map +1 -0
  16. package/dist/lib/entity-viewer/entity-viewer.component.js +883 -0
  17. package/dist/lib/entity-viewer/entity-viewer.component.js.map +1 -0
  18. package/dist/lib/pagination/pagination.component.d.ts +60 -0
  19. package/dist/lib/pagination/pagination.component.d.ts.map +1 -0
  20. package/dist/lib/pagination/pagination.component.js +199 -0
  21. package/dist/lib/pagination/pagination.component.js.map +1 -0
  22. package/dist/lib/pill/pill.component.d.ts +58 -0
  23. package/dist/lib/pill/pill.component.d.ts.map +1 -0
  24. package/dist/lib/pill/pill.component.js +125 -0
  25. package/dist/lib/pill/pill.component.js.map +1 -0
  26. package/dist/lib/types.d.ts +316 -0
  27. package/dist/lib/types.d.ts.map +1 -0
  28. package/dist/lib/types.js +30 -0
  29. package/dist/lib/types.js.map +1 -0
  30. package/dist/lib/utils/highlight.util.d.ts +69 -0
  31. package/dist/lib/utils/highlight.util.d.ts.map +1 -0
  32. package/dist/lib/utils/highlight.util.js +214 -0
  33. package/dist/lib/utils/highlight.util.js.map +1 -0
  34. package/dist/module.d.ts +38 -0
  35. package/dist/module.d.ts.map +1 -0
  36. package/dist/module.js +83 -0
  37. package/dist/module.js.map +1 -0
  38. package/dist/public-api.d.ts +16 -0
  39. package/dist/public-api.d.ts.map +1 -0
  40. package/dist/public-api.js +20 -0
  41. package/dist/public-api.js.map +1 -0
  42. package/package.json +45 -6
@@ -0,0 +1,316 @@
1
+ import { EntityInfo, CompositeKey } from '@memberjunction/core';
2
+ import { BaseEntity } from '@memberjunction/core';
3
+ /**
4
+ * View modes supported by the EntityViewer component
5
+ */
6
+ export type EntityViewMode = 'grid' | 'cards';
7
+ /**
8
+ * Behavior when a record is selected
9
+ */
10
+ export type RecordSelectionBehavior = 'emit-only' | 'show-detail' | 'emit-and-detail';
11
+ /**
12
+ * Field display type for smart rendering in cards
13
+ */
14
+ export type CardFieldType = 'number' | 'boolean' | 'text' | 'date';
15
+ /**
16
+ * Color categories for status pills based on semantic meaning
17
+ */
18
+ export type PillColorType = 'success' | 'warning' | 'danger' | 'info' | 'neutral';
19
+ /**
20
+ * Metadata for a field to display in a card
21
+ */
22
+ export interface CardDisplayField {
23
+ /** Field name from the entity */
24
+ name: string;
25
+ /** Display type for rendering */
26
+ type: CardFieldType;
27
+ /** Human-readable label */
28
+ label: string;
29
+ }
30
+ /**
31
+ * Auto-generated card template based on entity metadata
32
+ */
33
+ export interface CardTemplate {
34
+ /** Primary title field name */
35
+ titleField: string;
36
+ /** Secondary subtitle field name */
37
+ subtitleField: string | null;
38
+ /** Description/notes field name */
39
+ descriptionField: string | null;
40
+ /** Display fields with type information for smart rendering */
41
+ displayFields: CardDisplayField[];
42
+ /**
43
+ * Array of thumbnail field names in priority order
44
+ * Per-record fallback: if the first field is empty, try the next, etc.
45
+ */
46
+ thumbnailFields: string[];
47
+ /** Badge/priority field name */
48
+ badgeField: string | null;
49
+ }
50
+ /**
51
+ * Column definition for the grid view
52
+ */
53
+ export interface GridColumnDef {
54
+ /** Field name from the entity */
55
+ field: string;
56
+ /** Column header text */
57
+ headerName: string;
58
+ /** Column width in pixels */
59
+ width?: number;
60
+ /** Minimum column width */
61
+ minWidth?: number;
62
+ /** Maximum column width */
63
+ maxWidth?: number;
64
+ /** Whether column is sortable */
65
+ sortable?: boolean;
66
+ /** Whether column is filterable */
67
+ filter?: boolean;
68
+ /** Whether column is resizable */
69
+ resizable?: boolean;
70
+ /** Whether to hide this column */
71
+ hide?: boolean;
72
+ /** Custom cell renderer type */
73
+ cellRenderer?: string;
74
+ /** Value formatter function name */
75
+ valueFormatter?: string;
76
+ }
77
+ /**
78
+ * Event emitted when a record is selected (clicked)
79
+ */
80
+ export interface RecordSelectedEvent {
81
+ /** The selected entity record */
82
+ record: BaseEntity;
83
+ /** The entity metadata */
84
+ entity: EntityInfo;
85
+ /** The composite key of the record */
86
+ compositeKey: CompositeKey;
87
+ }
88
+ /**
89
+ * Event emitted when a record should be opened (double-click or open button)
90
+ */
91
+ export interface RecordOpenedEvent {
92
+ /** The entity record to open */
93
+ record: BaseEntity;
94
+ /** The entity metadata */
95
+ entity: EntityInfo;
96
+ /** The composite key of the record */
97
+ compositeKey: CompositeKey;
98
+ }
99
+ /**
100
+ * Event emitted when data is loaded
101
+ */
102
+ export interface DataLoadedEvent {
103
+ /** Total number of records available */
104
+ totalRowCount: number;
105
+ /** Number of records currently loaded */
106
+ loadedRowCount: number;
107
+ /** Time taken to load in milliseconds */
108
+ loadTime: number;
109
+ /** The loaded records - allows parent to access records for state restoration */
110
+ records: BaseEntity[];
111
+ }
112
+ /**
113
+ * Event emitted when filtered count changes
114
+ */
115
+ export interface FilteredCountChangedEvent {
116
+ /** Number of records after filtering */
117
+ filteredCount: number;
118
+ /** Total number of records before filtering */
119
+ totalCount: number;
120
+ }
121
+ /**
122
+ * Sort direction for server-side sorting
123
+ */
124
+ export type SortDirection = 'asc' | 'desc' | null;
125
+ /**
126
+ * Sort state for a column
127
+ */
128
+ export interface SortState {
129
+ /** Field name to sort by */
130
+ field: string;
131
+ /** Sort direction */
132
+ direction: SortDirection;
133
+ }
134
+ /**
135
+ * Event emitted when sort changes in the grid
136
+ */
137
+ export interface SortChangedEvent {
138
+ /** The new sort state (null if no sorting) */
139
+ sort: SortState | null;
140
+ }
141
+ /**
142
+ * Pagination state for server-side paging
143
+ */
144
+ export interface PaginationState {
145
+ /** Current page number (0-based) */
146
+ currentPage: number;
147
+ /** Number of records per page */
148
+ pageSize: number;
149
+ /** Total number of records available (from server) */
150
+ totalRecords: number;
151
+ /** Whether there are more records to load */
152
+ hasMore: boolean;
153
+ /** Whether data is currently being loaded */
154
+ isLoading: boolean;
155
+ }
156
+ /**
157
+ * Event emitted when pagination changes
158
+ */
159
+ export interface PaginationChangedEvent {
160
+ /** The new pagination state */
161
+ pagination: PaginationState;
162
+ }
163
+ /**
164
+ * Event emitted when requesting to load more data
165
+ */
166
+ export interface LoadMoreEvent {
167
+ /** Current page being requested (0-based) */
168
+ page: number;
169
+ /** Page size */
170
+ pageSize: number;
171
+ }
172
+ /**
173
+ * Column configuration from a User View's GridState
174
+ * Matches the format stored in UserView.GridState JSON
175
+ */
176
+ export interface ViewColumnConfig {
177
+ /** Entity field ID */
178
+ ID?: string;
179
+ /** Field name */
180
+ Name: string;
181
+ /** Display name for column header */
182
+ DisplayName?: string;
183
+ /** Whether the column is hidden */
184
+ hidden?: boolean;
185
+ /** Column width in pixels */
186
+ width?: number;
187
+ /** Column order index */
188
+ orderIndex?: number;
189
+ }
190
+ /**
191
+ * Sort configuration from a User View's GridState
192
+ * Matches the format stored in UserView.GridState.sortSettings
193
+ */
194
+ export interface ViewSortConfig {
195
+ /** Field name to sort by */
196
+ field: string;
197
+ /** Sort direction - 'asc' or 'desc' */
198
+ dir: 'asc' | 'desc';
199
+ }
200
+ /**
201
+ * Grid state configuration from a User View
202
+ * Matches the JSON structure stored in UserView.GridState
203
+ */
204
+ export interface ViewGridStateConfig {
205
+ /** Column visibility, width, and order settings */
206
+ columnSettings?: ViewColumnConfig[];
207
+ /** Sort settings */
208
+ sortSettings?: ViewSortConfig[];
209
+ /** Filter settings (Kendo format) */
210
+ filter?: object;
211
+ }
212
+ /**
213
+ * Event emitted when grid state changes (column resize, reorder, etc.)
214
+ */
215
+ export interface GridStateChangedEvent {
216
+ /** The updated grid state */
217
+ gridState: ViewGridStateConfig;
218
+ /** What changed: 'columns', 'sort', 'filter' */
219
+ changeType: 'columns' | 'sort' | 'filter';
220
+ }
221
+ /**
222
+ * Configuration options for the EntityViewer component
223
+ */
224
+ export interface EntityViewerConfig {
225
+ /**
226
+ * Whether to show the filter input box
227
+ * @default true
228
+ */
229
+ showFilter?: boolean;
230
+ /**
231
+ * Whether to show the view mode toggle (grid/cards)
232
+ * @default true
233
+ */
234
+ showViewModeToggle?: boolean;
235
+ /**
236
+ * Behavior when a record is selected
237
+ * @default 'emit-only'
238
+ */
239
+ selectionBehavior?: RecordSelectionBehavior;
240
+ /**
241
+ * Initial view mode
242
+ * @default 'grid'
243
+ */
244
+ defaultViewMode?: EntityViewMode;
245
+ /**
246
+ * Whether to enable multi-select
247
+ * @default false
248
+ */
249
+ enableMultiSelect?: boolean;
250
+ /**
251
+ * Maximum number of records to load per page
252
+ * @default 100
253
+ */
254
+ pageSize?: number;
255
+ /**
256
+ * Whether to show record count in header
257
+ * @default true
258
+ */
259
+ showRecordCount?: boolean;
260
+ /**
261
+ * Placeholder text for the filter input
262
+ * @default 'Filter records...'
263
+ */
264
+ filterPlaceholder?: string;
265
+ /**
266
+ * Debounce time for filter input in milliseconds
267
+ * @default 250
268
+ */
269
+ filterDebounceMs?: number;
270
+ /**
271
+ * Custom grid column definitions (optional - auto-generated if not provided)
272
+ */
273
+ gridColumns?: GridColumnDef[];
274
+ /**
275
+ * Custom card template (optional - auto-generated if not provided)
276
+ */
277
+ cardTemplate?: CardTemplate;
278
+ /**
279
+ * Height of the component (CSS value)
280
+ * @default '100%'
281
+ */
282
+ height?: string;
283
+ /**
284
+ * Whether to use server-side filtering via UserSearchString
285
+ * When true, filter text is sent to the server for SQL-based filtering
286
+ * When false, filtering is done client-side on loaded records
287
+ * @default true
288
+ */
289
+ serverSideFiltering?: boolean;
290
+ /**
291
+ * Whether to use server-side sorting via OrderBy
292
+ * When true, sort changes trigger a new server request
293
+ * When false, sorting is done client-side by AG Grid
294
+ * @default true
295
+ */
296
+ serverSideSorting?: boolean;
297
+ /**
298
+ * Whether to show pagination controls
299
+ * @default true
300
+ */
301
+ showPagination?: boolean;
302
+ /**
303
+ * Default sort field when loading data
304
+ */
305
+ defaultSortField?: string;
306
+ /**
307
+ * Default sort direction when loading data
308
+ * @default 'asc'
309
+ */
310
+ defaultSortDirection?: SortDirection;
311
+ }
312
+ /**
313
+ * Default configuration values
314
+ */
315
+ export declare const DEFAULT_VIEWER_CONFIG: Required<EntityViewerConfig>;
316
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Default configuration values
3
+ */
4
+ export const DEFAULT_VIEWER_CONFIG = {
5
+ showFilter: true,
6
+ showViewModeToggle: true,
7
+ selectionBehavior: 'emit-only',
8
+ defaultViewMode: 'grid',
9
+ enableMultiSelect: false,
10
+ pageSize: 100,
11
+ showRecordCount: true,
12
+ filterPlaceholder: 'Filter records...',
13
+ filterDebounceMs: 250,
14
+ gridColumns: [],
15
+ cardTemplate: {
16
+ titleField: '',
17
+ subtitleField: null,
18
+ descriptionField: null,
19
+ displayFields: [],
20
+ thumbnailFields: [],
21
+ badgeField: null
22
+ },
23
+ height: '100%',
24
+ serverSideFiltering: true,
25
+ serverSideSorting: true,
26
+ showPagination: true,
27
+ defaultSortField: '',
28
+ defaultSortDirection: 'asc'
29
+ };
30
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAiWA;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAiC;IACjE,UAAU,EAAE,IAAI;IAChB,kBAAkB,EAAE,IAAI;IACxB,iBAAiB,EAAE,WAAW;IAC9B,eAAe,EAAE,MAAM;IACvB,iBAAiB,EAAE,KAAK;IACxB,QAAQ,EAAE,GAAG;IACb,eAAe,EAAE,IAAI;IACrB,iBAAiB,EAAE,mBAAmB;IACtC,gBAAgB,EAAE,GAAG;IACrB,WAAW,EAAE,EAAE;IACf,YAAY,EAAE;QACZ,UAAU,EAAE,EAAE;QACd,aAAa,EAAE,IAAI;QACnB,gBAAgB,EAAE,IAAI;QACtB,aAAa,EAAE,EAAE;QACjB,eAAe,EAAE,EAAE;QACnB,UAAU,EAAE,IAAI;KACjB;IACD,MAAM,EAAE,MAAM;IACd,mBAAmB,EAAE,IAAI;IACzB,iBAAiB,EAAE,IAAI;IACvB,cAAc,EAAE,IAAI;IACpB,gBAAgB,EAAE,EAAE;IACpB,oBAAoB,EAAE,KAAK;CAC5B,CAAC"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * HighlightUtil - Utility class for highlighting search matches in text
3
+ *
4
+ * This class provides methods to:
5
+ * 1. Check if text matches a search term (with SQL-style % wildcard support)
6
+ * 2. Highlight matching portions of text with HTML markup
7
+ *
8
+ * The key distinction is that highlighting should only occur when the text
9
+ * actually matches the search pattern. For wildcard searches like "food%ass",
10
+ * the text must contain "food" followed by "ass" in order - we shouldn't
11
+ * highlight partial matches that don't satisfy the full pattern.
12
+ */
13
+ export declare class HighlightUtil {
14
+ /**
15
+ * Check if a value matches the search term (supports SQL-style % wildcards)
16
+ * This is used for filtering records.
17
+ *
18
+ * @param value The text value to check
19
+ * @param searchTerm The search term (may include % wildcards)
20
+ * @returns true if the value matches the search pattern
21
+ */
22
+ static matches(value: string, searchTerm: string): boolean;
23
+ /**
24
+ * Highlight matching text in a string based on the filter text.
25
+ * IMPORTANT: Only highlights if the text actually matches the pattern.
26
+ * For wildcard searches, all segments must be present in order.
27
+ *
28
+ * @param text The text to highlight
29
+ * @param searchTerm The search term (may include % wildcards)
30
+ * @param escapeHtml Whether to escape HTML characters (default: true)
31
+ * @returns HTML string with highlighted matches, or the original text if no match
32
+ */
33
+ static highlight(text: string, searchTerm: string, escapeHtml?: boolean): string;
34
+ /**
35
+ * Highlight a simple (non-wildcard) search term
36
+ */
37
+ private static highlightSimple;
38
+ /**
39
+ * Highlight a wildcard search term (segments separated by %)
40
+ * Only highlights segments that appear in the correct order
41
+ */
42
+ private static highlightWildcard;
43
+ /**
44
+ * Find all positions of segments in text (for simple highlighting)
45
+ */
46
+ private static findMatchPositions;
47
+ /**
48
+ * Find positions of segments that appear in order (for wildcard highlighting)
49
+ * This ensures we only highlight the segments that form the actual match
50
+ */
51
+ private static findOrderedMatchPositions;
52
+ /**
53
+ * Merge overlapping or adjacent ranges
54
+ */
55
+ private static mergeOverlappingRanges;
56
+ /**
57
+ * Build the final highlighted string from match ranges
58
+ */
59
+ private static buildHighlightedString;
60
+ /**
61
+ * Escape special regex characters
62
+ */
63
+ private static escapeRegex;
64
+ /**
65
+ * Escape HTML special characters to prevent XSS
66
+ */
67
+ static escapeHtml(text: string): string;
68
+ }
69
+ //# sourceMappingURL=highlight.util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"highlight.util.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/highlight.util.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,qBAAa,aAAa;IACxB;;;;;;;OAOG;IACH,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO;IAgC1D;;;;;;;;;OASG;IACH,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,GAAE,OAAc,GAAG,MAAM;IAwBtF;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,eAAe;IAa9B;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAgBhC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAkBjC;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,yBAAyB;IAmBxC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAmBrC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAyBrC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,WAAW;IAI1B;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;CAcxC"}
@@ -0,0 +1,214 @@
1
+ /**
2
+ * HighlightUtil - Utility class for highlighting search matches in text
3
+ *
4
+ * This class provides methods to:
5
+ * 1. Check if text matches a search term (with SQL-style % wildcard support)
6
+ * 2. Highlight matching portions of text with HTML markup
7
+ *
8
+ * The key distinction is that highlighting should only occur when the text
9
+ * actually matches the search pattern. For wildcard searches like "food%ass",
10
+ * the text must contain "food" followed by "ass" in order - we shouldn't
11
+ * highlight partial matches that don't satisfy the full pattern.
12
+ */
13
+ export class HighlightUtil {
14
+ /**
15
+ * Check if a value matches the search term (supports SQL-style % wildcards)
16
+ * This is used for filtering records.
17
+ *
18
+ * @param value The text value to check
19
+ * @param searchTerm The search term (may include % wildcards)
20
+ * @returns true if the value matches the search pattern
21
+ */
22
+ static matches(value, searchTerm) {
23
+ if (!value || !searchTerm)
24
+ return false;
25
+ const lowerValue = value.toLowerCase();
26
+ const lowerTerm = searchTerm.toLowerCase().trim();
27
+ if (!lowerTerm.includes('%')) {
28
+ // No wildcards - simple substring match
29
+ return lowerValue.includes(lowerTerm);
30
+ }
31
+ // Split by % to get fragments that must appear in order
32
+ const fragments = lowerTerm.split('%').filter(s => s.length > 0);
33
+ if (fragments.length === 0) {
34
+ // Just wildcards, matches everything
35
+ return true;
36
+ }
37
+ // Each fragment must appear in the value, in order
38
+ let searchStartIndex = 0;
39
+ for (const fragment of fragments) {
40
+ const foundIndex = lowerValue.indexOf(fragment, searchStartIndex);
41
+ if (foundIndex === -1) {
42
+ return false;
43
+ }
44
+ searchStartIndex = foundIndex + fragment.length;
45
+ }
46
+ return true;
47
+ }
48
+ /**
49
+ * Highlight matching text in a string based on the filter text.
50
+ * IMPORTANT: Only highlights if the text actually matches the pattern.
51
+ * For wildcard searches, all segments must be present in order.
52
+ *
53
+ * @param text The text to highlight
54
+ * @param searchTerm The search term (may include % wildcards)
55
+ * @param escapeHtml Whether to escape HTML characters (default: true)
56
+ * @returns HTML string with highlighted matches, or the original text if no match
57
+ */
58
+ static highlight(text, searchTerm, escapeHtml = true) {
59
+ if (!text)
60
+ return '';
61
+ if (!searchTerm || searchTerm.trim() === '') {
62
+ return escapeHtml ? this.escapeHtml(text) : text;
63
+ }
64
+ const trimmedSearch = searchTerm.trim();
65
+ // First check if this text actually matches the pattern
66
+ if (!this.matches(text, trimmedSearch)) {
67
+ // No match - return text without highlighting
68
+ return escapeHtml ? this.escapeHtml(text) : text;
69
+ }
70
+ // Text matches - now apply highlighting
71
+ if (!trimmedSearch.includes('%')) {
72
+ // Simple case: no wildcards, highlight the exact match
73
+ return this.highlightSimple(text, trimmedSearch, escapeHtml);
74
+ }
75
+ // Wildcard case: highlight each segment that appears in order
76
+ return this.highlightWildcard(text, trimmedSearch, escapeHtml);
77
+ }
78
+ /**
79
+ * Highlight a simple (non-wildcard) search term
80
+ */
81
+ static highlightSimple(text, searchTerm, escapeHtml) {
82
+ const regex = new RegExp(`(${this.escapeRegex(searchTerm)})`, 'gi');
83
+ if (escapeHtml) {
84
+ // Need to escape HTML first, then apply highlighting
85
+ // Find all match positions first
86
+ const matches = this.findMatchPositions(text, [searchTerm]);
87
+ return this.buildHighlightedString(text, matches, true);
88
+ }
89
+ else {
90
+ return text.replace(regex, '<span class="highlight-match">$1</span>');
91
+ }
92
+ }
93
+ /**
94
+ * Highlight a wildcard search term (segments separated by %)
95
+ * Only highlights segments that appear in the correct order
96
+ */
97
+ static highlightWildcard(text, searchTerm, escapeHtml) {
98
+ const segments = searchTerm.split('%').filter(s => s.length > 0);
99
+ if (segments.length === 0) {
100
+ return escapeHtml ? this.escapeHtml(text) : text;
101
+ }
102
+ // Find positions of each segment in order (only the first occurrence that maintains order)
103
+ const matches = this.findOrderedMatchPositions(text, segments);
104
+ if (matches.length === 0) {
105
+ return escapeHtml ? this.escapeHtml(text) : text;
106
+ }
107
+ return this.buildHighlightedString(text, matches, escapeHtml);
108
+ }
109
+ /**
110
+ * Find all positions of segments in text (for simple highlighting)
111
+ */
112
+ static findMatchPositions(text, segments) {
113
+ const matches = [];
114
+ const lowerText = text.toLowerCase();
115
+ for (const segment of segments) {
116
+ const lowerSegment = segment.toLowerCase();
117
+ let searchStart = 0;
118
+ while (searchStart < lowerText.length) {
119
+ const idx = lowerText.indexOf(lowerSegment, searchStart);
120
+ if (idx === -1)
121
+ break;
122
+ matches.push({ start: idx, end: idx + segment.length });
123
+ searchStart = idx + 1;
124
+ }
125
+ }
126
+ return this.mergeOverlappingRanges(matches);
127
+ }
128
+ /**
129
+ * Find positions of segments that appear in order (for wildcard highlighting)
130
+ * This ensures we only highlight the segments that form the actual match
131
+ */
132
+ static findOrderedMatchPositions(text, segments) {
133
+ const matches = [];
134
+ const lowerText = text.toLowerCase();
135
+ let searchStart = 0;
136
+ for (const segment of segments) {
137
+ const lowerSegment = segment.toLowerCase();
138
+ const idx = lowerText.indexOf(lowerSegment, searchStart);
139
+ if (idx === -1) {
140
+ // This shouldn't happen if matches() returned true, but be safe
141
+ return [];
142
+ }
143
+ matches.push({ start: idx, end: idx + segment.length });
144
+ searchStart = idx + segment.length;
145
+ }
146
+ return this.mergeOverlappingRanges(matches);
147
+ }
148
+ /**
149
+ * Merge overlapping or adjacent ranges
150
+ */
151
+ static mergeOverlappingRanges(matches) {
152
+ if (matches.length === 0)
153
+ return [];
154
+ // Sort by start position
155
+ matches.sort((a, b) => a.start - b.start);
156
+ const merged = [];
157
+ for (const match of matches) {
158
+ if (merged.length === 0 || merged[merged.length - 1].end < match.start) {
159
+ merged.push({ ...match });
160
+ }
161
+ else {
162
+ // Extend the previous range if overlapping
163
+ merged[merged.length - 1].end = Math.max(merged[merged.length - 1].end, match.end);
164
+ }
165
+ }
166
+ return merged;
167
+ }
168
+ /**
169
+ * Build the final highlighted string from match ranges
170
+ */
171
+ static buildHighlightedString(text, ranges, escapeHtml) {
172
+ let result = '';
173
+ let lastEnd = 0;
174
+ for (const range of ranges) {
175
+ // Add text before this match
176
+ const before = text.substring(lastEnd, range.start);
177
+ result += escapeHtml ? this.escapeHtml(before) : before;
178
+ // Add highlighted match
179
+ const match = text.substring(range.start, range.end);
180
+ result += '<span class="highlight-match">';
181
+ result += escapeHtml ? this.escapeHtml(match) : match;
182
+ result += '</span>';
183
+ lastEnd = range.end;
184
+ }
185
+ // Add remaining text
186
+ const remaining = text.substring(lastEnd);
187
+ result += escapeHtml ? this.escapeHtml(remaining) : remaining;
188
+ return result;
189
+ }
190
+ /**
191
+ * Escape special regex characters
192
+ */
193
+ static escapeRegex(str) {
194
+ return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
195
+ }
196
+ /**
197
+ * Escape HTML special characters to prevent XSS
198
+ */
199
+ static escapeHtml(text) {
200
+ if (typeof document !== 'undefined') {
201
+ const div = document.createElement('div');
202
+ div.textContent = text;
203
+ return div.innerHTML;
204
+ }
205
+ // Fallback for SSR
206
+ return text
207
+ .replace(/&/g, '&amp;')
208
+ .replace(/</g, '&lt;')
209
+ .replace(/>/g, '&gt;')
210
+ .replace(/"/g, '&quot;')
211
+ .replace(/'/g, '&#039;');
212
+ }
213
+ }
214
+ //# sourceMappingURL=highlight.util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"highlight.util.js","sourceRoot":"","sources":["../../../src/lib/utils/highlight.util.ts"],"names":[],"mappings":"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"}