@memberjunction/ng-action-gallery 5.43.0 → 5.45.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.
@@ -1 +1 @@
1
- {"version":3,"file":"action-gallery.component.d.ts","sourceRoot":"","sources":["../../src/lib/action-gallery.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,SAAS,EAAa,UAAU,EAAE,MAAM,eAAe,CAAC;AACjH,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAW,eAAe,EAAgE,MAAM,MAAM,CAAC;AAG9G,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;;AAEtI,MAAM,WAAW,mBAAmB;IAClC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAkB,SAAQ,cAAc;IACvD,UAAU,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACnC,WAAW,CAAC,EAAE,wBAAwB,EAAE,CAAC;IACzC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,qBAMa,sBAAuB,YAAW,MAAM,EAAE,SAAS;IACrD,MAAM,EAAE,mBAAmB,CASlC;IAEO,kBAAkB,EAAE,MAAM,EAAE,CAAM;IACjC,cAAc,+BAAsC;IACpD,eAAe,iCAAwC;IACvD,mBAAmB,+BAAsC;IAEtB,WAAW,EAAE,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAGvF,OAAO,CAAC,QAAQ,CAAuB;IACvC,QAAQ,uCAAgD;IACxD,WAAW,4CAAqD;IAChE,gBAAgB,uCAAgD;IAChE,aAAa,kCAA2C;IACxD,iBAAiB,0BAAsC;IACvD,SAAS,mCAAgD;IACzD,UAAU,2BAAuC;IACjD,gBAAgB,+BAA+C;IAG/D,aAAa,6BAAuB;IAGpC,kBAAkB,cAAqB;IACvC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAQ;IACpC,YAAY,UAAS;IAGrB,YAAY,SAAK;IACjB,cAAc,sBAA6B;;IAI3C,QAAQ;IAgCR,WAAW;IAKL,QAAQ;IAkDd,OAAO,CAAC,iBAAiB;IA4DzB,OAAO,CAAC,eAAe;IAiBvB,oBAAoB,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM;IAQpD,OAAO,CAAC,aAAa;IA0BrB,OAAO,CAAC,eAAe;IAKvB,cAAc,CAAC,UAAU,EAAE,MAAM;IAIjC,sBAAsB,CAAC,UAAU,EAAE,MAAM;IAQzC,cAAc;IAKR,oBAAoB,CAAC,MAAM,EAAE,iBAAiB;IAS9C,iBAAiB,CAAC,MAAM,EAAE,iBAAiB;IAiCjD,qBAAqB,CAAC,MAAM,EAAE,iBAAiB;IAgC/C,UAAU,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK;IAW/C,WAAW;IAOX,kBAAkB,IAAI,cAAc,EAAE;IAKtC,aAAa,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM;yCAzWlC,sBAAsB;2CAAtB,sBAAsB;CAiYlC"}
1
+ {"version":3,"file":"action-gallery.component.d.ts","sourceRoot":"","sources":["../../src/lib/action-gallery.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,SAAS,EAAa,UAAU,EAAE,MAAM,eAAe,CAAC;AACjH,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAW,eAAe,EAAgE,MAAM,MAAM,CAAC;AAG9G,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;;AAEtI,MAAM,WAAW,mBAAmB;IAClC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAkB,SAAQ,cAAc;IACvD,UAAU,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACnC,WAAW,CAAC,EAAE,wBAAwB,EAAE,CAAC;IACzC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,qBAMa,sBAAuB,YAAW,MAAM,EAAE,SAAS;IACrD,MAAM,EAAE,mBAAmB,CASlC;IAEO,kBAAkB,EAAE,MAAM,EAAE,CAAM;IACjC,cAAc,+BAAsC;IACpD,eAAe,iCAAwC;IACvD,mBAAmB,+BAAsC;IAEtB,WAAW,EAAE,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAGvF,OAAO,CAAC,QAAQ,CAAuB;IACvC,QAAQ,uCAAgD;IACxD,WAAW,4CAAqD;IAChE,gBAAgB,uCAAgD;IAChE,aAAa,kCAA2C;IACxD,iBAAiB,0BAAsC;IACvD,SAAS,mCAAgD;IACzD,UAAU,2BAAuC;IACjD,gBAAgB,+BAA+C;IAG/D,aAAa,6BAAuB;IAGpC,kBAAkB,cAAqB;IACvC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAQ;IACpC,YAAY,UAAS;IAGrB,YAAY,SAAK;IACjB,cAAc,sBAA6B;;IAI3C,QAAQ;IAgCR,WAAW;IAKL,QAAQ;IAkDd,OAAO,CAAC,iBAAiB;IA4DzB,OAAO,CAAC,eAAe;IAiBvB,oBAAoB,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM;IAQpD,OAAO,CAAC,aAAa;IA0BrB,OAAO,CAAC,eAAe;IAKvB,cAAc,CAAC,UAAU,EAAE,MAAM;IAIjC,sBAAsB,CAAC,UAAU,EAAE,MAAM;IAQzC,cAAc;IAKR,oBAAoB,CAAC,MAAM,EAAE,iBAAiB;IAS9C,iBAAiB,CAAC,MAAM,EAAE,iBAAiB;IAiCjD,qBAAqB,CAAC,MAAM,EAAE,iBAAiB;IAgC/C,UAAU,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK;IAc/C,WAAW;IAQX,kBAAkB,IAAI,cAAc,EAAE;IAKtC,aAAa,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM;yCA7WlC,sBAAsB;2CAAtB,sBAAsB;CAqYlC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=action-gallery.component.dom.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-gallery.component.dom.test.d.ts","sourceRoot":"","sources":["../../src/lib/action-gallery.component.dom.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,138 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { CommonModule } from '@angular/common';
3
+ import { FormsModule, ReactiveFormsModule } from '@angular/forms';
4
+ import { MJButtonDirective, MJEmptyStateComponent } from '@memberjunction/ng-ui-components';
5
+ import { SharedGenericModule } from '@memberjunction/ng-shared-generic';
6
+ import { renderComponentFixture, query, queryAll, text, attr, hasClass, click, useFakeGlobalProvider } from '@memberjunction/ng-test-utils';
7
+ import { ActionGalleryComponent } from './action-gallery.component';
8
+ /**
9
+ * DOM spec for <mj-action-gallery>.
10
+ *
11
+ * Two surfaces are covered:
12
+ * - config-driven chrome (theme/selection-mode classes, search-header gate, category-sidebar
13
+ * gate, view-toggle) — renders purely from the `config` @Input.
14
+ * - the DATA path (action cards, the count stat, the category tree). The component loads via a
15
+ * bare `new RunView()`, which resolves the process-global `RunView.Provider`. We do NOT touch
16
+ * the component — instead the data-path block installs a fake `RunView.Provider` for its
17
+ * duration (and restores the prior one afterward), so loadData()'s `new RunView()` picks up
18
+ * canned actions/categories with no backend. This is a TEST-ONLY seam; production code is
19
+ * unchanged. (The cleaner fix would be to route the component through `[Provider]`/
20
+ * `ProviderToUse`, but that is a deliberate production refactor we are not doing here.)
21
+ */
22
+ const MOD = {
23
+ imports: [CommonModule, FormsModule, ReactiveFormsModule, MJButtonDirective, MJEmptyStateComponent, SharedGenericModule],
24
+ declarations: [ActionGalleryComponent],
25
+ };
26
+ const cfg = (over = {}) => ({
27
+ selectionMode: false,
28
+ multiSelect: false,
29
+ showCategories: true,
30
+ showSearch: true,
31
+ defaultView: 'grid',
32
+ gridColumns: 3,
33
+ enableQuickTest: true,
34
+ theme: 'light',
35
+ ...over,
36
+ });
37
+ describe('ActionGalleryComponent (DOM — config-driven chrome)', () => {
38
+ describe('container classes', () => {
39
+ it('does not apply the dark-theme class for a light theme', () => {
40
+ const f = renderComponentFixture(ActionGalleryComponent, { ...MOD, inputs: { config: cfg({ theme: 'light' }) } });
41
+ expect(hasClass(f, '.action-gallery', 'dark-theme')).toBe(false);
42
+ });
43
+ it('applies the dark-theme class for a dark theme', () => {
44
+ const f = renderComponentFixture(ActionGalleryComponent, { ...MOD, inputs: { config: cfg({ theme: 'dark' }) } });
45
+ expect(hasClass(f, '.action-gallery', 'dark-theme')).toBe(true);
46
+ });
47
+ it('applies the selection-mode class when selectionMode is on', () => {
48
+ const f = renderComponentFixture(ActionGalleryComponent, { ...MOD, inputs: { config: cfg({ selectionMode: true }) } });
49
+ expect(hasClass(f, '.action-gallery', 'selection-mode')).toBe(true);
50
+ });
51
+ });
52
+ describe('search header gate', () => {
53
+ it('renders the search header with its input when showSearch is true', () => {
54
+ const f = renderComponentFixture(ActionGalleryComponent, { ...MOD, inputs: { config: cfg({ showSearch: true }) } });
55
+ expect(query(f, '.gallery-header')).not.toBeNull();
56
+ expect(attr(f, '.search-input', 'placeholder')).toBe('Search actions by name, description, or category...');
57
+ });
58
+ it('hides the search header when showSearch is false', () => {
59
+ const f = renderComponentFixture(ActionGalleryComponent, { ...MOD, inputs: { config: cfg({ showSearch: false }) } });
60
+ expect(query(f, '.gallery-header')).toBeNull();
61
+ });
62
+ });
63
+ describe('category sidebar gate', () => {
64
+ it('renders the category sidebar when showCategories is true', () => {
65
+ const f = renderComponentFixture(ActionGalleryComponent, { ...MOD, inputs: { config: cfg({ showCategories: true }) } });
66
+ expect(query(f, '.category-sidebar')).not.toBeNull();
67
+ expect(hasClass(f, '.gallery-content', 'no-categories')).toBe(false);
68
+ });
69
+ it('hides the category sidebar and flags the content no-categories when showCategories is false', () => {
70
+ const f = renderComponentFixture(ActionGalleryComponent, { ...MOD, inputs: { config: cfg({ showCategories: false }) } });
71
+ expect(query(f, '.category-sidebar')).toBeNull();
72
+ expect(hasClass(f, '.gallery-content', 'no-categories')).toBe(true);
73
+ });
74
+ });
75
+ describe('view toggle', () => {
76
+ it('renders the view-toggle button showing the grid icon by default', () => {
77
+ const f = renderComponentFixture(ActionGalleryComponent, { ...MOD, inputs: { config: cfg({ defaultView: 'grid' }) } });
78
+ const btn = query(f, '.view-toggle button');
79
+ expect(btn).not.toBeNull();
80
+ expect(btn.querySelector('.fa-th')).not.toBeNull();
81
+ });
82
+ it('switches the icon from grid to list when toggled', () => {
83
+ const f = renderComponentFixture(ActionGalleryComponent, { ...MOD, inputs: { config: cfg({ defaultView: 'grid' }) } });
84
+ click(f, '.view-toggle button'); // toggleViewMode()
85
+ f.detectChanges();
86
+ const btn = query(f, '.view-toggle button');
87
+ expect(btn.querySelector('.fa-list')).not.toBeNull();
88
+ expect(btn.querySelector('.fa-th')).toBeNull();
89
+ });
90
+ });
91
+ describe('data path (fed via a test-only global provider)', () => {
92
+ const ACTIONS = [
93
+ { ID: 'a1', Name: 'Send Email', Category: 'Communication', Description: 'Sends an email' },
94
+ { ID: 'a2', Name: 'Create Invoice', Category: 'Finance', Description: 'Creates an invoice' },
95
+ ];
96
+ const CATEGORIES = [
97
+ { ID: 'c1', Name: 'Communication', ParentID: null },
98
+ { ID: 'c2', Name: 'Finance', ParentID: null },
99
+ ];
100
+ // loadData() runs RunViews([Actions, Action Categories]) in ngOnInit; return the right rows
101
+ // per EntityName.
102
+ const byEntity = (p) => (p.EntityName === 'MJ: Actions' ? ACTIONS : p.EntityName === 'MJ: Action Categories' ? CATEGORIES : []);
103
+ // The component uses a bare `new RunView()`, which reads the global RunView.Provider — not an
104
+ // @Input. useFakeGlobalProvider() registers the save/restore (scoped to this describe, so the
105
+ // chrome tests above still run against the unset-data world) and returns an installer.
106
+ const installProvider = useFakeGlobalProvider();
107
+ async function renderLoaded(rows = byEntity, config = cfg()) {
108
+ installProvider({ runViewResults: rows });
109
+ const f = renderComponentFixture(ActionGalleryComponent, { ...MOD, inputs: { config } });
110
+ await new Promise((r) => setTimeout(r, 0)); // let loadData's RunViews promise resolve
111
+ f.detectChanges();
112
+ return f;
113
+ }
114
+ it('renders one action card per loaded action, with name and category badge', async () => {
115
+ const f = await renderLoaded();
116
+ const cards = queryAll(f, '.action-card');
117
+ expect(cards.length).toBe(2);
118
+ expect(queryAll(f, '.action-name').map((e) => e.textContent?.trim())).toEqual(['Send Email', 'Create Invoice']);
119
+ expect(queryAll(f, '.category-badge').map((e) => e.textContent?.trim())).toEqual(['Communication', 'Finance']);
120
+ });
121
+ it('shows the count stat reflecting the loaded actions', async () => {
122
+ const f = await renderLoaded();
123
+ expect(text(f, '.stat-item')).toContain('2 of 2 actions');
124
+ });
125
+ it('builds the category tree from the loaded categories', async () => {
126
+ const f = await renderLoaded();
127
+ const names = queryAll(f, '.category-sidebar .category-name').map((e) => e.textContent?.trim());
128
+ expect(names).toContain('Communication');
129
+ expect(names).toContain('Finance');
130
+ });
131
+ it('shows the empty state when the provider returns no actions', async () => {
132
+ const f = await renderLoaded(() => []);
133
+ expect(query(f, 'mj-empty-state')).not.toBeNull();
134
+ expect(query(f, '.action-card')).toBeNull();
135
+ });
136
+ });
137
+ });
138
+ //# sourceMappingURL=action-gallery.component.dom.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-gallery.component.dom.test.js","sourceRoot":"","sources":["../../src/lib/action-gallery.component.dom.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, it, expect } from 'vitest';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { MJButtonDirective, MJEmptyStateComponent } from '@memberjunction/ng-ui-components';\nimport { SharedGenericModule } from '@memberjunction/ng-shared-generic';\nimport { renderComponentFixture, query, queryAll, text, attr, hasClass, click, useFakeGlobalProvider } from '@memberjunction/ng-test-utils';\nimport { ActionGalleryComponent, ActionGalleryConfig } from './action-gallery.component';\nimport type { RunViewParams } from '@memberjunction/core';\n\n/**\n * DOM spec for <mj-action-gallery>.\n *\n * Two surfaces are covered:\n * - config-driven chrome (theme/selection-mode classes, search-header gate, category-sidebar\n * gate, view-toggle) — renders purely from the `config` @Input.\n * - the DATA path (action cards, the count stat, the category tree). The component loads via a\n * bare `new RunView()`, which resolves the process-global `RunView.Provider`. We do NOT touch\n * the component — instead the data-path block installs a fake `RunView.Provider` for its\n * duration (and restores the prior one afterward), so loadData()'s `new RunView()` picks up\n * canned actions/categories with no backend. This is a TEST-ONLY seam; production code is\n * unchanged. (The cleaner fix would be to route the component through `[Provider]`/\n * `ProviderToUse`, but that is a deliberate production refactor we are not doing here.)\n */\n\nconst MOD = {\n imports: [CommonModule, FormsModule, ReactiveFormsModule, MJButtonDirective, MJEmptyStateComponent, SharedGenericModule],\n declarations: [ActionGalleryComponent],\n};\n\nconst cfg = (over: Partial<ActionGalleryConfig> = {}): ActionGalleryConfig => ({\n selectionMode: false,\n multiSelect: false,\n showCategories: true,\n showSearch: true,\n defaultView: 'grid',\n gridColumns: 3,\n enableQuickTest: true,\n theme: 'light',\n ...over,\n});\n\ndescribe('ActionGalleryComponent (DOM — config-driven chrome)', () => {\n describe('container classes', () => {\n it('does not apply the dark-theme class for a light theme', () => {\n const f = renderComponentFixture(ActionGalleryComponent, { ...MOD, inputs: { config: cfg({ theme: 'light' }) } });\n expect(hasClass(f, '.action-gallery', 'dark-theme')).toBe(false);\n });\n\n it('applies the dark-theme class for a dark theme', () => {\n const f = renderComponentFixture(ActionGalleryComponent, { ...MOD, inputs: { config: cfg({ theme: 'dark' }) } });\n expect(hasClass(f, '.action-gallery', 'dark-theme')).toBe(true);\n });\n\n it('applies the selection-mode class when selectionMode is on', () => {\n const f = renderComponentFixture(ActionGalleryComponent, { ...MOD, inputs: { config: cfg({ selectionMode: true }) } });\n expect(hasClass(f, '.action-gallery', 'selection-mode')).toBe(true);\n });\n });\n\n describe('search header gate', () => {\n it('renders the search header with its input when showSearch is true', () => {\n const f = renderComponentFixture(ActionGalleryComponent, { ...MOD, inputs: { config: cfg({ showSearch: true }) } });\n expect(query(f, '.gallery-header')).not.toBeNull();\n expect(attr(f, '.search-input', 'placeholder')).toBe('Search actions by name, description, or category...');\n });\n\n it('hides the search header when showSearch is false', () => {\n const f = renderComponentFixture(ActionGalleryComponent, { ...MOD, inputs: { config: cfg({ showSearch: false }) } });\n expect(query(f, '.gallery-header')).toBeNull();\n });\n });\n\n describe('category sidebar gate', () => {\n it('renders the category sidebar when showCategories is true', () => {\n const f = renderComponentFixture(ActionGalleryComponent, { ...MOD, inputs: { config: cfg({ showCategories: true }) } });\n expect(query(f, '.category-sidebar')).not.toBeNull();\n expect(hasClass(f, '.gallery-content', 'no-categories')).toBe(false);\n });\n\n it('hides the category sidebar and flags the content no-categories when showCategories is false', () => {\n const f = renderComponentFixture(ActionGalleryComponent, { ...MOD, inputs: { config: cfg({ showCategories: false }) } });\n expect(query(f, '.category-sidebar')).toBeNull();\n expect(hasClass(f, '.gallery-content', 'no-categories')).toBe(true);\n });\n });\n\n describe('view toggle', () => {\n it('renders the view-toggle button showing the grid icon by default', () => {\n const f = renderComponentFixture(ActionGalleryComponent, { ...MOD, inputs: { config: cfg({ defaultView: 'grid' }) } });\n const btn = query(f, '.view-toggle button');\n expect(btn).not.toBeNull();\n expect(btn!.querySelector('.fa-th')).not.toBeNull();\n });\n\n it('switches the icon from grid to list when toggled', () => {\n const f = renderComponentFixture(ActionGalleryComponent, { ...MOD, inputs: { config: cfg({ defaultView: 'grid' }) } });\n click(f, '.view-toggle button'); // toggleViewMode()\n f.detectChanges();\n const btn = query(f, '.view-toggle button')!;\n expect(btn.querySelector('.fa-list')).not.toBeNull();\n expect(btn.querySelector('.fa-th')).toBeNull();\n });\n });\n\n describe('data path (fed via a test-only global provider)', () => {\n const ACTIONS = [\n { ID: 'a1', Name: 'Send Email', Category: 'Communication', Description: 'Sends an email' },\n { ID: 'a2', Name: 'Create Invoice', Category: 'Finance', Description: 'Creates an invoice' },\n ];\n const CATEGORIES = [\n { ID: 'c1', Name: 'Communication', ParentID: null },\n { ID: 'c2', Name: 'Finance', ParentID: null },\n ];\n\n // loadData() runs RunViews([Actions, Action Categories]) in ngOnInit; return the right rows\n // per EntityName.\n const byEntity = (p: RunViewParams) => (p.EntityName === 'MJ: Actions' ? ACTIONS : p.EntityName === 'MJ: Action Categories' ? CATEGORIES : []);\n\n // The component uses a bare `new RunView()`, which reads the global RunView.Provider — not an\n // @Input. useFakeGlobalProvider() registers the save/restore (scoped to this describe, so the\n // chrome tests above still run against the unset-data world) and returns an installer.\n const installProvider = useFakeGlobalProvider();\n\n async function renderLoaded(rows: (p: RunViewParams) => unknown[] = byEntity, config = cfg()) {\n installProvider({ runViewResults: rows });\n const f = renderComponentFixture(ActionGalleryComponent, { ...MOD, inputs: { config } });\n await new Promise((r) => setTimeout(r, 0)); // let loadData's RunViews promise resolve\n f.detectChanges();\n return f;\n }\n\n it('renders one action card per loaded action, with name and category badge', async () => {\n const f = await renderLoaded();\n const cards = queryAll(f, '.action-card');\n expect(cards.length).toBe(2);\n expect(queryAll(f, '.action-name').map((e) => e.textContent?.trim())).toEqual(['Send Email', 'Create Invoice']);\n expect(queryAll(f, '.category-badge').map((e) => e.textContent?.trim())).toEqual(['Communication', 'Finance']);\n });\n\n it('shows the count stat reflecting the loaded actions', async () => {\n const f = await renderLoaded();\n expect(text(f, '.stat-item')).toContain('2 of 2 actions');\n });\n\n it('builds the category tree from the loaded categories', async () => {\n const f = await renderLoaded();\n const names = queryAll(f, '.category-sidebar .category-name').map((e) => e.textContent?.trim());\n expect(names).toContain('Communication');\n expect(names).toContain('Finance');\n });\n\n it('shows the empty state when the provider returns no actions', async () => {\n const f = await renderLoaded(() => []);\n expect(query(f, 'mj-empty-state')).not.toBeNull();\n expect(query(f, '.action-card')).toBeNull();\n });\n });\n});\n"]}
@@ -132,22 +132,13 @@ function ActionGalleryComponent_Conditional_5_Template(rf, ctx) { if (rf & 1) {
132
132
  } }
133
133
  function ActionGalleryComponent_Conditional_7_Template(rf, ctx) { if (rf & 1) {
134
134
  const _r8 = i0.ɵɵgetCurrentView();
135
- i0.ɵɵelementStart(0, "div", 7);
136
- i0.ɵɵelement(1, "i", 34);
137
- i0.ɵɵelementStart(2, "h3");
138
- i0.ɵɵtext(3, "No actions found");
135
+ i0.ɵɵelementStart(0, "mj-empty-state", 34);
136
+ i0.ɵɵlistener("Action", function ActionGalleryComponent_Conditional_7_Template_mj_empty_state_Action_0_listener() { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.clearSearch()); });
139
137
  i0.ɵɵelementEnd();
140
- i0.ɵɵelementStart(4, "p");
141
- i0.ɵɵtext(5, "Try adjusting your search criteria or selecting a different category");
142
- i0.ɵɵelementEnd();
143
- i0.ɵɵelementStart(6, "button", 35);
144
- i0.ɵɵlistener("click", function ActionGalleryComponent_Conditional_7_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.clearSearch()); });
145
- i0.ɵɵtext(7, "Clear Search");
146
- i0.ɵɵelementEnd()();
147
138
  } }
148
139
  function ActionGalleryComponent_Conditional_10_For_2_Conditional_8_Template(rf, ctx) { if (rf & 1) {
149
- i0.ɵɵelementStart(0, "span", 44);
150
- i0.ɵɵelement(1, "i", 54);
140
+ i0.ɵɵelementStart(0, "span", 43);
141
+ i0.ɵɵelement(1, "i", 53);
151
142
  i0.ɵɵtext(2);
152
143
  i0.ɵɵelementEnd();
153
144
  } if (rf & 2) {
@@ -157,14 +148,14 @@ function ActionGalleryComponent_Conditional_10_For_2_Conditional_8_Template(rf,
157
148
  } }
158
149
  function ActionGalleryComponent_Conditional_10_For_2_Conditional_10_Template(rf, ctx) { if (rf & 1) {
159
150
  const _r11 = i0.ɵɵgetCurrentView();
160
- i0.ɵɵelementStart(0, "button", 55);
151
+ i0.ɵɵelementStart(0, "button", 54);
161
152
  i0.ɵɵlistener("click", function ActionGalleryComponent_Conditional_10_For_2_Conditional_10_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r11); const action_r10 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.testAction(action_r10, $event)); });
162
- i0.ɵɵelement(1, "i", 56);
153
+ i0.ɵɵelement(1, "i", 55);
163
154
  i0.ɵɵelementEnd();
164
155
  } }
165
156
  function ActionGalleryComponent_Conditional_10_For_2_Conditional_16_Template(rf, ctx) { if (rf & 1) {
166
- i0.ɵɵelementStart(0, "span", 51);
167
- i0.ɵɵelement(1, "i", 57);
157
+ i0.ɵɵelementStart(0, "span", 50);
158
+ i0.ɵɵelement(1, "i", 56);
168
159
  i0.ɵɵtext(2);
169
160
  i0.ɵɵelementEnd();
170
161
  } if (rf & 2) {
@@ -173,8 +164,8 @@ function ActionGalleryComponent_Conditional_10_For_2_Conditional_16_Template(rf,
173
164
  i0.ɵɵtextInterpolate1(" ", (action_r10.parameters == null ? null : action_r10.parameters.length) || 0, " params ");
174
165
  } }
175
166
  function ActionGalleryComponent_Conditional_10_For_2_Conditional_17_Template(rf, ctx) { if (rf & 1) {
176
- i0.ɵɵelementStart(0, "span", 51);
177
- i0.ɵɵelement(1, "i", 58);
167
+ i0.ɵɵelementStart(0, "span", 50);
168
+ i0.ɵɵelement(1, "i", 57);
178
169
  i0.ɵɵtext(2);
179
170
  i0.ɵɵelementEnd();
180
171
  } if (rf & 2) {
@@ -183,8 +174,8 @@ function ActionGalleryComponent_Conditional_10_For_2_Conditional_17_Template(rf,
183
174
  i0.ɵɵtextInterpolate1(" ", (action_r10.resultCodes == null ? null : action_r10.resultCodes.length) || 0, " results ");
184
175
  } }
185
176
  function ActionGalleryComponent_Conditional_10_For_2_Conditional_18_Template(rf, ctx) { if (rf & 1) {
186
- i0.ɵɵelementStart(0, "span", 51);
187
- i0.ɵɵelement(1, "i", 59);
177
+ i0.ɵɵelementStart(0, "span", 50);
178
+ i0.ɵɵelement(1, "i", 58);
188
179
  i0.ɵɵtext(2);
189
180
  i0.ɵɵelementEnd();
190
181
  } if (rf & 2) {
@@ -193,18 +184,18 @@ function ActionGalleryComponent_Conditional_10_For_2_Conditional_18_Template(rf,
193
184
  i0.ɵɵtextInterpolate1(" ", action_r10.Type, " ");
194
185
  } }
195
186
  function ActionGalleryComponent_Conditional_10_For_2_Conditional_19_Conditional_1_For_6_Conditional_5_Template(rf, ctx) { if (rf & 1) {
196
- i0.ɵɵelementStart(0, "span", 65);
187
+ i0.ɵɵelementStart(0, "span", 64);
197
188
  i0.ɵɵtext(1, "Required");
198
189
  i0.ɵɵelementEnd();
199
190
  } }
200
191
  function ActionGalleryComponent_Conditional_10_For_2_Conditional_19_Conditional_1_For_6_Template(rf, ctx) { if (rf & 1) {
201
- i0.ɵɵelementStart(0, "div", 62)(1, "span", 63);
192
+ i0.ɵɵelementStart(0, "div", 61)(1, "span", 62);
202
193
  i0.ɵɵtext(2);
203
194
  i0.ɵɵelementEnd();
204
- i0.ɵɵelementStart(3, "span", 64);
195
+ i0.ɵɵelementStart(3, "span", 63);
205
196
  i0.ɵɵtext(4);
206
197
  i0.ɵɵelementEnd();
207
- i0.ɵɵconditionalCreate(5, ActionGalleryComponent_Conditional_10_For_2_Conditional_19_Conditional_1_For_6_Conditional_5_Template, 2, 0, "span", 65);
198
+ i0.ɵɵconditionalCreate(5, ActionGalleryComponent_Conditional_10_For_2_Conditional_19_Conditional_1_For_6_Conditional_5_Template, 2, 0, "span", 64);
208
199
  i0.ɵɵelementEnd();
209
200
  } if (rf & 2) {
210
201
  const param_r12 = ctx.$implicit;
@@ -216,12 +207,12 @@ function ActionGalleryComponent_Conditional_10_For_2_Conditional_19_Conditional_
216
207
  i0.ɵɵconditional(param_r12.IsRequired ? 5 : -1);
217
208
  } }
218
209
  function ActionGalleryComponent_Conditional_10_For_2_Conditional_19_Conditional_1_Template(rf, ctx) { if (rf & 1) {
219
- i0.ɵɵelementStart(0, "div", 60)(1, "h4");
220
- i0.ɵɵelement(2, "i", 57);
210
+ i0.ɵɵelementStart(0, "div", 59)(1, "h4");
211
+ i0.ɵɵelement(2, "i", 56);
221
212
  i0.ɵɵtext(3, " Parameters ");
222
213
  i0.ɵɵelementEnd();
223
- i0.ɵɵelementStart(4, "div", 61);
224
- i0.ɵɵrepeaterCreate(5, ActionGalleryComponent_Conditional_10_For_2_Conditional_19_Conditional_1_For_6_Template, 6, 3, "div", 62, _forTrack1);
214
+ i0.ɵɵelementStart(4, "div", 60);
215
+ i0.ɵɵrepeaterCreate(5, ActionGalleryComponent_Conditional_10_For_2_Conditional_19_Conditional_1_For_6_Template, 6, 3, "div", 61, _forTrack1);
225
216
  i0.ɵɵelementEnd()();
226
217
  } if (rf & 2) {
227
218
  const action_r10 = i0.ɵɵnextContext(2).$implicit;
@@ -229,10 +220,10 @@ function ActionGalleryComponent_Conditional_10_For_2_Conditional_19_Conditional_
229
220
  i0.ɵɵrepeater(action_r10.parameters);
230
221
  } }
231
222
  function ActionGalleryComponent_Conditional_10_For_2_Conditional_19_Conditional_2_For_6_Template(rf, ctx) { if (rf & 1) {
232
- i0.ɵɵelementStart(0, "div", 67)(1, "span", 68);
223
+ i0.ɵɵelementStart(0, "div", 66)(1, "span", 67);
233
224
  i0.ɵɵtext(2);
234
225
  i0.ɵɵelementEnd();
235
- i0.ɵɵelementStart(3, "span", 69);
226
+ i0.ɵɵelementStart(3, "span", 68);
236
227
  i0.ɵɵtext(4);
237
228
  i0.ɵɵelementEnd()();
238
229
  } if (rf & 2) {
@@ -243,12 +234,12 @@ function ActionGalleryComponent_Conditional_10_For_2_Conditional_19_Conditional_
243
234
  i0.ɵɵtextInterpolate(code_r13.Description);
244
235
  } }
245
236
  function ActionGalleryComponent_Conditional_10_For_2_Conditional_19_Conditional_2_Template(rf, ctx) { if (rf & 1) {
246
- i0.ɵɵelementStart(0, "div", 60)(1, "h4");
247
- i0.ɵɵelement(2, "i", 58);
237
+ i0.ɵɵelementStart(0, "div", 59)(1, "h4");
238
+ i0.ɵɵelement(2, "i", 57);
248
239
  i0.ɵɵtext(3, " Result Codes ");
249
240
  i0.ɵɵelementEnd();
250
- i0.ɵɵelementStart(4, "div", 66);
251
- i0.ɵɵrepeaterCreate(5, ActionGalleryComponent_Conditional_10_For_2_Conditional_19_Conditional_2_For_6_Template, 5, 2, "div", 67, _forTrack1);
241
+ i0.ɵɵelementStart(4, "div", 65);
242
+ i0.ɵɵrepeaterCreate(5, ActionGalleryComponent_Conditional_10_For_2_Conditional_19_Conditional_2_For_6_Template, 5, 2, "div", 66, _forTrack1);
252
243
  i0.ɵɵelementEnd()();
253
244
  } if (rf & 2) {
254
245
  const action_r10 = i0.ɵɵnextContext(2).$implicit;
@@ -256,9 +247,9 @@ function ActionGalleryComponent_Conditional_10_For_2_Conditional_19_Conditional_
256
247
  i0.ɵɵrepeater(action_r10.resultCodes);
257
248
  } }
258
249
  function ActionGalleryComponent_Conditional_10_For_2_Conditional_19_Template(rf, ctx) { if (rf & 1) {
259
- i0.ɵɵelementStart(0, "div", 52);
260
- i0.ɵɵconditionalCreate(1, ActionGalleryComponent_Conditional_10_For_2_Conditional_19_Conditional_1_Template, 7, 0, "div", 60);
261
- i0.ɵɵconditionalCreate(2, ActionGalleryComponent_Conditional_10_For_2_Conditional_19_Conditional_2_Template, 7, 0, "div", 60);
250
+ i0.ɵɵelementStart(0, "div", 51);
251
+ i0.ɵɵconditionalCreate(1, ActionGalleryComponent_Conditional_10_For_2_Conditional_19_Conditional_1_Template, 7, 0, "div", 59);
252
+ i0.ɵɵconditionalCreate(2, ActionGalleryComponent_Conditional_10_For_2_Conditional_19_Conditional_2_Template, 7, 0, "div", 59);
262
253
  i0.ɵɵelementEnd();
263
254
  } if (rf & 2) {
264
255
  const action_r10 = i0.ɵɵnextContext().$implicit;
@@ -268,7 +259,7 @@ function ActionGalleryComponent_Conditional_10_For_2_Conditional_19_Template(rf,
268
259
  i0.ɵɵconditional(action_r10.resultCodes && action_r10.resultCodes.length > 0 ? 2 : -1);
269
260
  } }
270
261
  function ActionGalleryComponent_Conditional_10_For_2_Conditional_20_Template(rf, ctx) { if (rf & 1) {
271
- i0.ɵɵelementStart(0, "div", 53);
262
+ i0.ɵɵelementStart(0, "div", 52);
272
263
  i0.ɵɵelement(1, "i", 18);
273
264
  i0.ɵɵelementEnd();
274
265
  } if (rf & 2) {
@@ -278,33 +269,33 @@ function ActionGalleryComponent_Conditional_10_For_2_Conditional_20_Template(rf,
278
269
  } }
279
270
  function ActionGalleryComponent_Conditional_10_For_2_Template(rf, ctx) { if (rf & 1) {
280
271
  const _r9 = i0.ɵɵgetCurrentView();
281
- i0.ɵɵelementStart(0, "div", 38);
272
+ i0.ɵɵelementStart(0, "div", 37);
282
273
  i0.ɵɵlistener("mouseenter", function ActionGalleryComponent_Conditional_10_For_2_Template_div_mouseenter_0_listener() { const action_r10 = i0.ɵɵrestoreView(_r9).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.hoveredAction = action_r10.ID); })("mouseleave", function ActionGalleryComponent_Conditional_10_For_2_Template_div_mouseleave_0_listener() { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.hoveredAction = null); })("click", function ActionGalleryComponent_Conditional_10_For_2_Template_div_click_0_listener() { const action_r10 = i0.ɵɵrestoreView(_r9).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleActionSelection(action_r10)); });
283
- i0.ɵɵelementStart(1, "div", 39);
274
+ i0.ɵɵelementStart(1, "div", 38);
284
275
  i0.ɵɵlistener("click", function ActionGalleryComponent_Conditional_10_For_2_Template_div_click_1_listener($event) { const action_r10 = i0.ɵɵrestoreView(_r9).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); ctx_r1.toggleActionExpanded(action_r10); return i0.ɵɵresetView($event.stopPropagation()); });
285
- i0.ɵɵelementStart(2, "div", 40);
276
+ i0.ɵɵelementStart(2, "div", 39);
286
277
  i0.ɵɵelement(3, "i");
287
278
  i0.ɵɵelementEnd();
288
- i0.ɵɵelementStart(4, "div", 41)(5, "h3", 42);
279
+ i0.ɵɵelementStart(4, "div", 40)(5, "h3", 41);
289
280
  i0.ɵɵtext(6);
290
281
  i0.ɵɵelementEnd();
291
- i0.ɵɵelementStart(7, "div", 43);
292
- i0.ɵɵconditionalCreate(8, ActionGalleryComponent_Conditional_10_For_2_Conditional_8_Template, 3, 1, "span", 44);
282
+ i0.ɵɵelementStart(7, "div", 42);
283
+ i0.ɵɵconditionalCreate(8, ActionGalleryComponent_Conditional_10_For_2_Conditional_8_Template, 3, 1, "span", 43);
293
284
  i0.ɵɵelementEnd()();
294
- i0.ɵɵelementStart(9, "div", 45);
295
- i0.ɵɵconditionalCreate(10, ActionGalleryComponent_Conditional_10_For_2_Conditional_10_Template, 2, 0, "button", 46);
296
- i0.ɵɵelement(11, "i", 47);
285
+ i0.ɵɵelementStart(9, "div", 44);
286
+ i0.ɵɵconditionalCreate(10, ActionGalleryComponent_Conditional_10_For_2_Conditional_10_Template, 2, 0, "button", 45);
287
+ i0.ɵɵelement(11, "i", 46);
297
288
  i0.ɵɵelementEnd()();
298
- i0.ɵɵelementStart(12, "div", 48)(13, "p", 49);
289
+ i0.ɵɵelementStart(12, "div", 47)(13, "p", 48);
299
290
  i0.ɵɵtext(14);
300
291
  i0.ɵɵelementEnd();
301
- i0.ɵɵelementStart(15, "div", 50);
302
- i0.ɵɵconditionalCreate(16, ActionGalleryComponent_Conditional_10_For_2_Conditional_16_Template, 3, 1, "span", 51);
303
- i0.ɵɵconditionalCreate(17, ActionGalleryComponent_Conditional_10_For_2_Conditional_17_Template, 3, 1, "span", 51);
304
- i0.ɵɵconditionalCreate(18, ActionGalleryComponent_Conditional_10_For_2_Conditional_18_Template, 3, 1, "span", 51);
292
+ i0.ɵɵelementStart(15, "div", 49);
293
+ i0.ɵɵconditionalCreate(16, ActionGalleryComponent_Conditional_10_For_2_Conditional_16_Template, 3, 1, "span", 50);
294
+ i0.ɵɵconditionalCreate(17, ActionGalleryComponent_Conditional_10_For_2_Conditional_17_Template, 3, 1, "span", 50);
295
+ i0.ɵɵconditionalCreate(18, ActionGalleryComponent_Conditional_10_For_2_Conditional_18_Template, 3, 1, "span", 50);
305
296
  i0.ɵɵelementEnd()();
306
- i0.ɵɵconditionalCreate(19, ActionGalleryComponent_Conditional_10_For_2_Conditional_19_Template, 3, 2, "div", 52);
307
- i0.ɵɵconditionalCreate(20, ActionGalleryComponent_Conditional_10_For_2_Conditional_20_Template, 2, 4, "div", 53);
297
+ i0.ɵɵconditionalCreate(19, ActionGalleryComponent_Conditional_10_For_2_Conditional_19_Template, 3, 2, "div", 51);
298
+ i0.ɵɵconditionalCreate(20, ActionGalleryComponent_Conditional_10_For_2_Conditional_20_Template, 2, 4, "div", 52);
308
299
  i0.ɵɵelementEnd();
309
300
  } if (rf & 2) {
310
301
  const action_r10 = ctx.$implicit;
@@ -334,8 +325,8 @@ function ActionGalleryComponent_Conditional_10_For_2_Template(rf, ctx) { if (rf
334
325
  i0.ɵɵconditional(ctx_r1.config.selectionMode ? 20 : -1);
335
326
  } }
336
327
  function ActionGalleryComponent_Conditional_10_Template(rf, ctx) { if (rf & 1) {
337
- i0.ɵɵelementStart(0, "div", 36);
338
- i0.ɵɵrepeaterCreate(1, ActionGalleryComponent_Conditional_10_For_2_Template, 21, 24, "div", 37, _forTrack1);
328
+ i0.ɵɵelementStart(0, "div", 35);
329
+ i0.ɵɵrepeaterCreate(1, ActionGalleryComponent_Conditional_10_For_2_Template, 21, 24, "div", 36, _forTrack1);
339
330
  i0.ɵɵpipe(3, "async");
340
331
  i0.ɵɵelementEnd();
341
332
  } if (rf & 2) {
@@ -346,13 +337,13 @@ function ActionGalleryComponent_Conditional_10_Template(rf, ctx) { if (rf & 1) {
346
337
  } }
347
338
  function ActionGalleryComponent_Conditional_15_For_13_Conditional_11_Template(rf, ctx) { if (rf & 1) {
348
339
  const _r16 = i0.ɵɵgetCurrentView();
349
- i0.ɵɵelementStart(0, "button", 55);
340
+ i0.ɵɵelementStart(0, "button", 54);
350
341
  i0.ɵɵlistener("click", function ActionGalleryComponent_Conditional_15_For_13_Conditional_11_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r16); const action_r15 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.testAction(action_r15, $event)); });
351
- i0.ɵɵelement(1, "i", 56);
342
+ i0.ɵɵelement(1, "i", 55);
352
343
  i0.ɵɵelementEnd();
353
344
  } }
354
345
  function ActionGalleryComponent_Conditional_15_For_13_Conditional_12_Template(rf, ctx) { if (rf & 1) {
355
- i0.ɵɵelementStart(0, "div", 53);
346
+ i0.ɵɵelementStart(0, "div", 52);
356
347
  i0.ɵɵelement(1, "i", 18);
357
348
  i0.ɵɵelementEnd();
358
349
  } if (rf & 2) {
@@ -362,25 +353,25 @@ function ActionGalleryComponent_Conditional_15_For_13_Conditional_12_Template(rf
362
353
  } }
363
354
  function ActionGalleryComponent_Conditional_15_For_13_Template(rf, ctx) { if (rf & 1) {
364
355
  const _r14 = i0.ɵɵgetCurrentView();
365
- i0.ɵɵelementStart(0, "div", 77);
356
+ i0.ɵɵelementStart(0, "div", 76);
366
357
  i0.ɵɵlistener("click", function ActionGalleryComponent_Conditional_15_For_13_Template_div_click_0_listener() { const action_r15 = i0.ɵɵrestoreView(_r14).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleActionSelection(action_r15)); });
367
- i0.ɵɵelementStart(1, "span", 71);
358
+ i0.ɵɵelementStart(1, "span", 70);
368
359
  i0.ɵɵelement(2, "i");
369
360
  i0.ɵɵtext(3);
370
361
  i0.ɵɵelementEnd();
371
- i0.ɵɵelementStart(4, "span", 72);
362
+ i0.ɵɵelementStart(4, "span", 71);
372
363
  i0.ɵɵtext(5);
373
364
  i0.ɵɵelementEnd();
374
- i0.ɵɵelementStart(6, "span", 73);
365
+ i0.ɵɵelementStart(6, "span", 72);
375
366
  i0.ɵɵtext(7);
376
367
  i0.ɵɵelementEnd();
377
- i0.ɵɵelementStart(8, "span", 74);
368
+ i0.ɵɵelementStart(8, "span", 73);
378
369
  i0.ɵɵtext(9);
379
370
  i0.ɵɵelementEnd();
380
- i0.ɵɵelementStart(10, "span", 75);
381
- i0.ɵɵconditionalCreate(11, ActionGalleryComponent_Conditional_15_For_13_Conditional_11_Template, 2, 0, "button", 46);
371
+ i0.ɵɵelementStart(10, "span", 74);
372
+ i0.ɵɵconditionalCreate(11, ActionGalleryComponent_Conditional_15_For_13_Conditional_11_Template, 2, 0, "button", 45);
382
373
  i0.ɵɵelementEnd();
383
- i0.ɵɵconditionalCreate(12, ActionGalleryComponent_Conditional_15_For_13_Conditional_12_Template, 2, 4, "div", 53);
374
+ i0.ɵɵconditionalCreate(12, ActionGalleryComponent_Conditional_15_For_13_Conditional_12_Template, 2, 4, "div", 52);
384
375
  i0.ɵɵelementEnd();
385
376
  } if (rf & 2) {
386
377
  const action_r15 = ctx.$implicit;
@@ -402,22 +393,22 @@ function ActionGalleryComponent_Conditional_15_For_13_Template(rf, ctx) { if (rf
402
393
  i0.ɵɵconditional(ctx_r1.config.selectionMode ? 12 : -1);
403
394
  } }
404
395
  function ActionGalleryComponent_Conditional_15_Template(rf, ctx) { if (rf & 1) {
405
- i0.ɵɵelementStart(0, "div", 9)(1, "div", 70)(2, "span", 71);
396
+ i0.ɵɵelementStart(0, "div", 9)(1, "div", 69)(2, "span", 70);
406
397
  i0.ɵɵtext(3, "Name");
407
398
  i0.ɵɵelementEnd();
408
- i0.ɵɵelementStart(4, "span", 72);
399
+ i0.ɵɵelementStart(4, "span", 71);
409
400
  i0.ɵɵtext(5, "Category");
410
401
  i0.ɵɵelementEnd();
411
- i0.ɵɵelementStart(6, "span", 73);
402
+ i0.ɵɵelementStart(6, "span", 72);
412
403
  i0.ɵɵtext(7, "Type");
413
404
  i0.ɵɵelementEnd();
414
- i0.ɵɵelementStart(8, "span", 74);
405
+ i0.ɵɵelementStart(8, "span", 73);
415
406
  i0.ɵɵtext(9, "Parameters");
416
407
  i0.ɵɵelementEnd();
417
- i0.ɵɵelementStart(10, "span", 75);
408
+ i0.ɵɵelementStart(10, "span", 74);
418
409
  i0.ɵɵtext(11, "Actions");
419
410
  i0.ɵɵelementEnd()();
420
- i0.ɵɵrepeaterCreate(12, ActionGalleryComponent_Conditional_15_For_13_Template, 13, 11, "div", 76, _forTrack1);
411
+ i0.ɵɵrepeaterCreate(12, ActionGalleryComponent_Conditional_15_For_13_Template, 13, 11, "div", 75, _forTrack1);
421
412
  i0.ɵɵpipe(14, "async");
422
413
  i0.ɵɵelementEnd();
423
414
  } if (rf & 2) {
@@ -722,8 +713,12 @@ export class ActionGalleryComponent {
722
713
  }
723
714
  this.actionTestRequested.emit(action);
724
715
  }
716
+ // Backs the no-results empty-state "Clear Filters" CTA: resets every dimension
717
+ // the list narrows on — search AND the selected category — so the CTA actually
718
+ // returns results instead of appearing to do nothing.
725
719
  clearSearch() {
726
720
  this.searchControl.reset();
721
+ this.selectedCategory$.next('all');
727
722
  if (this.searchInput) {
728
723
  this.searchInput.nativeElement.focus();
729
724
  }
@@ -760,7 +755,7 @@ export class ActionGalleryComponent {
760
755
  } if (rf & 2) {
761
756
  let _t;
762
757
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.searchInput = _t.first);
763
- } }, inputs: { config: "config", preSelectedActions: "preSelectedActions" }, outputs: { actionSelected: "actionSelected", actionsSelected: "actionsSelected", actionTestRequested: "actionTestRequested" }, standalone: false, decls: 20, vars: 34, consts: [["searchInput", ""], [1, "action-gallery"], [1, "gallery-header"], [1, "gallery-content"], [1, "category-sidebar"], [1, "actions-container"], [1, "loading-state"], [1, "empty-state"], [1, "actions-grid", 3, "grid-template-columns"], [1, "actions-list"], [1, "header-content"], [1, "search-section"], [1, "search-input-wrapper"], [1, "fa-solid", "fa-search"], ["placeholder", "Search actions by name, description, or category...", 1, "mj-input", "search-input", 3, "formControl"], [1, "header-actions"], [1, "view-toggle"], ["mjButton", "", "size", "sm", 3, "click", "title"], [1, "fa-solid"], [1, "stats"], [1, "stat-item"], [1, "fa-solid", "fa-bolt"], [1, "category-tree"], [1, "category-item", 3, "selected", "has-children"], [1, "category-item", 3, "click"], [1, "category-header"], [1, "category-name"], [1, "category-count"], [1, "fa-solid", "fa-chevron-right", "expand-icon", 3, "expanded"], [1, "sub-categories"], [1, "fa-solid", "fa-chevron-right", "expand-icon", 3, "click"], [1, "category-item", "sub-category", 3, "selected"], [1, "category-item", "sub-category", 3, "click"], ["text", "Loading actions...", "size", "large"], [1, "fa-solid", "fa-search-minus"], ["mjButton", "", 3, "click"], [1, "actions-grid"], [1, "action-card", 3, "expanded", "selected", "animate", "hover"], [1, "action-card", 3, "mouseenter", "mouseleave", "click"], [1, "card-header", 3, "click"], [1, "action-icon"], [1, "action-info"], [1, "action-name"], [1, "action-meta"], [1, "category-badge"], [1, "card-actions"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "Test this action"], [1, "fa-solid", "expand-indicator"], [1, "card-body"], [1, "action-description"], [1, "action-stats"], [1, "stat"], [1, "card-details"], [1, "selection-indicator"], [1, "fa-solid", "fa-folder"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "Test this action", 3, "click"], [1, "fa-solid", "fa-play"], [1, "fa-solid", "fa-sliders"], [1, "fa-solid", "fa-code-branch"], [1, "fa-solid", "fa-tag"], [1, "detail-section"], [1, "parameters-list"], [1, "parameter-item"], [1, "param-name"], [1, "param-type"], [1, "param-required"], [1, "result-codes-list"], [1, "result-code-item"], [1, "code-value"], [1, "code-desc"], [1, "list-header"], [1, "col-name"], [1, "col-category"], [1, "col-type"], [1, "col-params"], [1, "col-actions"], [1, "list-item", 3, "selected"], [1, "list-item", 3, "click"]], template: function ActionGalleryComponent_Template(rf, ctx) { if (rf & 1) {
758
+ } }, inputs: { config: "config", preSelectedActions: "preSelectedActions" }, outputs: { actionSelected: "actionSelected", actionsSelected: "actionsSelected", actionTestRequested: "actionTestRequested" }, standalone: false, decls: 20, vars: 34, consts: [["searchInput", ""], [1, "action-gallery"], [1, "gallery-header"], [1, "gallery-content"], [1, "category-sidebar"], [1, "actions-container"], [1, "loading-state"], ["Variant", "no-results", "Title", "No actions found", "Message", "Try adjusting your search criteria or selecting a different category", "ActionText", "Clear Filters"], [1, "actions-grid", 3, "grid-template-columns"], [1, "actions-list"], [1, "header-content"], [1, "search-section"], [1, "search-input-wrapper"], [1, "fa-solid", "fa-search"], ["placeholder", "Search actions by name, description, or category...", 1, "mj-input", "search-input", 3, "formControl"], [1, "header-actions"], [1, "view-toggle"], ["mjButton", "", "size", "sm", 3, "click", "title"], [1, "fa-solid"], [1, "stats"], [1, "stat-item"], [1, "fa-solid", "fa-bolt"], [1, "category-tree"], [1, "category-item", 3, "selected", "has-children"], [1, "category-item", 3, "click"], [1, "category-header"], [1, "category-name"], [1, "category-count"], [1, "fa-solid", "fa-chevron-right", "expand-icon", 3, "expanded"], [1, "sub-categories"], [1, "fa-solid", "fa-chevron-right", "expand-icon", 3, "click"], [1, "category-item", "sub-category", 3, "selected"], [1, "category-item", "sub-category", 3, "click"], ["text", "Loading actions...", "size", "large"], ["Variant", "no-results", "Title", "No actions found", "Message", "Try adjusting your search criteria or selecting a different category", "ActionText", "Clear Filters", 3, "Action"], [1, "actions-grid"], [1, "action-card", 3, "expanded", "selected", "animate", "hover"], [1, "action-card", 3, "mouseenter", "mouseleave", "click"], [1, "card-header", 3, "click"], [1, "action-icon"], [1, "action-info"], [1, "action-name"], [1, "action-meta"], [1, "category-badge"], [1, "card-actions"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "Test this action"], [1, "fa-solid", "expand-indicator"], [1, "card-body"], [1, "action-description"], [1, "action-stats"], [1, "stat"], [1, "card-details"], [1, "selection-indicator"], [1, "fa-solid", "fa-folder"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "Test this action", 3, "click"], [1, "fa-solid", "fa-play"], [1, "fa-solid", "fa-sliders"], [1, "fa-solid", "fa-code-branch"], [1, "fa-solid", "fa-tag"], [1, "detail-section"], [1, "parameters-list"], [1, "parameter-item"], [1, "param-name"], [1, "param-type"], [1, "param-required"], [1, "result-codes-list"], [1, "result-code-item"], [1, "code-value"], [1, "code-desc"], [1, "list-header"], [1, "col-name"], [1, "col-category"], [1, "col-type"], [1, "col-params"], [1, "col-actions"], [1, "list-item", 3, "selected"], [1, "list-item", 3, "click"]], template: function ActionGalleryComponent_Template(rf, ctx) { if (rf & 1) {
764
759
  i0.ɵɵelementStart(0, "div", 1);
765
760
  i0.ɵɵconditionalCreate(1, ActionGalleryComponent_Conditional_1_Template, 19, 16, "div", 2);
766
761
  i0.ɵɵelementStart(2, "div", 3);
@@ -768,7 +763,7 @@ export class ActionGalleryComponent {
768
763
  i0.ɵɵelementStart(4, "div", 5);
769
764
  i0.ɵɵconditionalCreate(5, ActionGalleryComponent_Conditional_5_Template, 2, 0, "div", 6);
770
765
  i0.ɵɵpipe(6, "async");
771
- i0.ɵɵconditionalCreate(7, ActionGalleryComponent_Conditional_7_Template, 8, 0, "div", 7);
766
+ i0.ɵɵconditionalCreate(7, ActionGalleryComponent_Conditional_7_Template, 1, 0, "mj-empty-state", 7);
772
767
  i0.ɵɵpipe(8, "async");
773
768
  i0.ɵɵpipe(9, "async");
774
769
  i0.ɵɵconditionalCreate(10, ActionGalleryComponent_Conditional_10_Template, 4, 4, "div", 8);
@@ -799,11 +794,11 @@ export class ActionGalleryComponent {
799
794
  i0.ɵɵconditional(!i0.ɵɵpipeBind1(11, 18, ctx.isLoading$) && i0.ɵɵpipeBind1(12, 20, ctx.viewMode$) === "grid" && i0.ɵɵpipeBind1(13, 22, ctx.filteredActions$) && i0.ɵɵpipeBind1(14, 24, ctx.filteredActions$).length > 0 ? 10 : -1);
800
795
  i0.ɵɵadvance(5);
801
796
  i0.ɵɵconditional(!i0.ɵɵpipeBind1(16, 26, ctx.isLoading$) && i0.ɵɵpipeBind1(17, 28, ctx.viewMode$) === "list" && i0.ɵɵpipeBind1(18, 30, ctx.filteredActions$) && i0.ɵɵpipeBind1(19, 32, ctx.filteredActions$).length > 0 ? 15 : -1);
802
- } }, dependencies: [i1.DefaultValueAccessor, i1.NgControlStatus, i1.FormControlDirective, i2.MJButtonDirective, i3.LoadingComponent, i4.AsyncPipe], encapsulation: 2 }); }
797
+ } }, dependencies: [i1.DefaultValueAccessor, i1.NgControlStatus, i1.FormControlDirective, i2.MJButtonDirective, i2.MJEmptyStateComponent, i3.LoadingComponent, i4.AsyncPipe], encapsulation: 2 }); }
803
798
  }
804
799
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ActionGalleryComponent, [{
805
800
  type: Component,
806
- args: [{ standalone: false, selector: 'mj-action-gallery', template: "<div class=\"action-gallery\" [class.dark-theme]=\"config.theme === 'dark'\" [class.selection-mode]=\"config.selectionMode\">\n <!-- Gallery Header -->\n @if (config.showSearch) {\n <div class=\"gallery-header\">\n <div class=\"header-content\">\n <div class=\"search-section\">\n <div class=\"search-input-wrapper\">\n <i class=\"fa-solid fa-search\"></i>\n <input\n #searchInput\n class=\"mj-input search-input\"\n [formControl]=\"searchControl\"\n placeholder=\"Search actions by name, description, or category...\"\n />\n </div>\n </div>\n \n <div class=\"header-actions\">\n <div class=\"view-toggle\">\n <button mjButton\n size=\"sm\"\n (click)=\"toggleViewMode()\"\n [title]=\"(viewMode$ | async) === 'grid' ? 'Switch to list view' : 'Switch to grid view'\">\n <i class=\"fa-solid\" [class.fa-th]=\"(viewMode$ | async) === 'grid'\" [class.fa-list]=\"(viewMode$ | async) === 'list'\"></i>\n </button>\n </div>\n <div class=\"stats\">\n <span class=\"stat-item\">\n <i class=\"fa-solid fa-bolt\"></i>\n {{ (filteredActions$ | async)?.length }} of {{ totalActions }} actions\n </span>\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- Main Content -->\n <div class=\"gallery-content\" [class.no-categories]=\"!config.showCategories\">\n <!-- Category Sidebar -->\n @if (config.showCategories) {\n <div class=\"category-sidebar\">\n <div class=\"category-tree\">\n @for (category of categoryTree$ | async; track category.id) {\n <div class=\"category-item\" \n [class.selected]=\"(selectedCategory$ | async) === category.id\"\n [class.has-children]=\"category.children && category.children.length > 0\"\n (click)=\"selectCategory(category.id)\">\n \n <div class=\"category-header\">\n <i class=\"fa-solid {{ category.icon }} category-icon\"></i>\n <span class=\"category-name\">{{ category.name }}</span>\n <span class=\"category-count\">{{ category.count }}</span>\n @if (category.children && category.children.length > 0) {\n <i class=\"fa-solid fa-chevron-right expand-icon\" \n [class.expanded]=\"expandedCategories.has(category.id)\"\n (click)=\"toggleCategoryExpanded(category.id); $event.stopPropagation()\"></i>\n }\n </div>\n \n <!-- Sub-categories -->\n @if (category.children && expandedCategories.has(category.id)) {\n <div class=\"sub-categories\">\n @for (subCategory of category.children; track subCategory.id) {\n <div class=\"category-item sub-category\" \n [class.selected]=\"(selectedCategory$ | async) === subCategory.id\"\n (click)=\"selectCategory(subCategory.id); $event.stopPropagation()\">\n <div class=\"category-header\">\n <i class=\"fa-solid {{ subCategory.icon }} category-icon\"></i>\n <span class=\"category-name\">{{ subCategory.name }}</span>\n <span class=\"category-count\">{{ subCategory.count }}</span>\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Actions Display -->\n <div class=\"actions-container\">\n <!-- Loading State -->\n @if (isLoading$ | async) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading actions...\" size=\"large\"></mj-loading>\n </div>\n }\n\n <!-- Empty State -->\n @if (!(isLoading$ | async) && (filteredActions$ | async)?.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-search-minus\"></i>\n <h3>No actions found</h3>\n <p>Try adjusting your search criteria or selecting a different category</p>\n <button mjButton (click)=\"clearSearch()\">Clear Search</button>\n </div>\n }\n\n <!-- Grid View -->\n @if (!(isLoading$ | async) && (viewMode$ | async) === 'grid' && (filteredActions$ | async) && (filteredActions$ | async)!.length > 0) {\n <div class=\"actions-grid\" \n [style.grid-template-columns]=\"'repeat(' + (config.gridColumns || 3) + ', 1fr)'\">\n \n @for (action of filteredActions$ | async; track action.ID) {\n <div class=\"action-card\" \n [class.expanded]=\"action.expanded\"\n [class.selected]=\"action.selected\"\n [class.animate]=\"animateCards\"\n [class.hover]=\"hoveredAction === action.ID\"\n (mouseenter)=\"hoveredAction = action.ID\"\n (mouseleave)=\"hoveredAction = null\"\n (click)=\"toggleActionSelection(action)\">\n \n <!-- Card Header -->\n <div class=\"card-header\" (click)=\"toggleActionExpanded(action); $event.stopPropagation()\">\n <div class=\"action-icon\">\n <i class=\"fa-solid {{ getActionIcon(action) }}\"></i>\n </div>\n <div class=\"action-info\">\n <h3 class=\"action-name\">{{ action.Name }}</h3>\n <div class=\"action-meta\">\n @if (action.Category) {\n <span class=\"category-badge\">\n <i class=\"fa-solid fa-folder\"></i>\n {{ action.Category }}\n </span>\n }\n </div>\n </div>\n <div class=\"card-actions\">\n @if (config.enableQuickTest) {\n <button mjButton\n variant=\"flat\"\n size=\"sm\"\n (click)=\"testAction(action, $event)\"\n title=\"Test this action\">\n <i class=\"fa-solid fa-play\"></i>\n </button>\n }\n <i class=\"fa-solid expand-indicator\"\n [class.fa-chevron-down]=\"!action.expanded\"\n [class.fa-chevron-up]=\"action.expanded\"></i>\n </div>\n </div>\n \n <!-- Card Body -->\n <div class=\"card-body\">\n <p class=\"action-description\">{{ action.Description || 'No description available' }}</p>\n \n <!-- Quick Stats -->\n <div class=\"action-stats\">\n @if (action.parameters?.length) {\n <span class=\"stat\">\n <i class=\"fa-solid fa-sliders\"></i>\n {{ action.parameters?.length || 0 }} params\n </span>\n }\n @if (action.resultCodes?.length) {\n <span class=\"stat\">\n <i class=\"fa-solid fa-code-branch\"></i>\n {{ action.resultCodes?.length || 0 }} results\n </span>\n }\n @if (action.Type) {\n <span class=\"stat\">\n <i class=\"fa-solid fa-tag\"></i>\n {{ action.Type }}\n </span>\n }\n </div>\n </div>\n \n <!-- Expanded Details -->\n @if (action.expanded) {\n <div class=\"card-details\">\n <!-- Parameters -->\n @if (action.parameters && action.parameters.length > 0) {\n <div class=\"detail-section\">\n <h4>\n <i class=\"fa-solid fa-sliders\"></i>\n Parameters\n </h4>\n <div class=\"parameters-list\">\n @for (param of action.parameters; track param.ID) {\n <div class=\"parameter-item\">\n <span class=\"param-name\">{{ param.Name }}</span>\n <span class=\"param-type\">{{ param.Type }}</span>\n @if (param.IsRequired) {\n <span class=\"param-required\">Required</span>\n }\n </div>\n }\n </div>\n </div>\n }\n \n <!-- Result Codes -->\n @if (action.resultCodes && action.resultCodes.length > 0) {\n <div class=\"detail-section\">\n <h4>\n <i class=\"fa-solid fa-code-branch\"></i>\n Result Codes\n </h4>\n <div class=\"result-codes-list\">\n @for (code of action.resultCodes; track code.ID) {\n <div class=\"result-code-item\">\n <span class=\"code-value\">{{ code.ResultCode }}</span>\n <span class=\"code-desc\">{{ code.Description }}</span>\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n \n <!-- Selection Indicator -->\n @if (config.selectionMode) {\n <div class=\"selection-indicator\">\n <i class=\"fa-solid\" [class.fa-check-circle]=\"action.selected\" [class.fa-circle]=\"!action.selected\"></i>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- List View -->\n @if (!(isLoading$ | async) && (viewMode$ | async) === 'list' && (filteredActions$ | async) && (filteredActions$ | async)!.length > 0) {\n <div class=\"actions-list\">\n \n <div class=\"list-header\">\n <span class=\"col-name\">Name</span>\n <span class=\"col-category\">Category</span>\n <span class=\"col-type\">Type</span>\n <span class=\"col-params\">Parameters</span>\n <span class=\"col-actions\">Actions</span>\n </div>\n \n @for (action of filteredActions$ | async; track action.ID) {\n <div class=\"list-item\" \n [class.selected]=\"action.selected\"\n (click)=\"toggleActionSelection(action)\">\n \n <span class=\"col-name\">\n <i class=\"fa-solid {{ getActionIcon(action) }} action-icon\"></i>\n {{ action.Name }}\n </span>\n <span class=\"col-category\">{{ action.Category || '-' }}</span>\n <span class=\"col-type\">{{ action.Type || '-' }}</span>\n <span class=\"col-params\">{{ action.parameters?.length || 0 }}</span>\n <span class=\"col-actions\">\n @if (config.enableQuickTest) {\n <button mjButton\n variant=\"flat\"\n size=\"sm\"\n (click)=\"testAction(action, $event)\"\n title=\"Test this action\">\n <i class=\"fa-solid fa-play\"></i>\n </button>\n }\n </span>\n \n <!-- Selection Indicator -->\n @if (config.selectionMode) {\n <div class=\"selection-indicator\">\n <i class=\"fa-solid\" [class.fa-check-circle]=\"action.selected\" [class.fa-circle]=\"!action.selected\"></i>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n</div>\n\n", styles: ["/* Action Gallery Component Styles */\n"] }]
801
+ args: [{ standalone: false, selector: 'mj-action-gallery', template: "<div class=\"action-gallery\" [class.dark-theme]=\"config.theme === 'dark'\" [class.selection-mode]=\"config.selectionMode\">\n <!-- Gallery Header -->\n @if (config.showSearch) {\n <div class=\"gallery-header\">\n <div class=\"header-content\">\n <div class=\"search-section\">\n <div class=\"search-input-wrapper\">\n <i class=\"fa-solid fa-search\"></i>\n <input\n #searchInput\n class=\"mj-input search-input\"\n [formControl]=\"searchControl\"\n placeholder=\"Search actions by name, description, or category...\"\n />\n </div>\n </div>\n \n <div class=\"header-actions\">\n <div class=\"view-toggle\">\n <button mjButton\n size=\"sm\"\n (click)=\"toggleViewMode()\"\n [title]=\"(viewMode$ | async) === 'grid' ? 'Switch to list view' : 'Switch to grid view'\">\n <i class=\"fa-solid\" [class.fa-th]=\"(viewMode$ | async) === 'grid'\" [class.fa-list]=\"(viewMode$ | async) === 'list'\"></i>\n </button>\n </div>\n <div class=\"stats\">\n <span class=\"stat-item\">\n <i class=\"fa-solid fa-bolt\"></i>\n {{ (filteredActions$ | async)?.length }} of {{ totalActions }} actions\n </span>\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- Main Content -->\n <div class=\"gallery-content\" [class.no-categories]=\"!config.showCategories\">\n <!-- Category Sidebar -->\n @if (config.showCategories) {\n <div class=\"category-sidebar\">\n <div class=\"category-tree\">\n @for (category of categoryTree$ | async; track category.id) {\n <div class=\"category-item\" \n [class.selected]=\"(selectedCategory$ | async) === category.id\"\n [class.has-children]=\"category.children && category.children.length > 0\"\n (click)=\"selectCategory(category.id)\">\n \n <div class=\"category-header\">\n <i class=\"fa-solid {{ category.icon }} category-icon\"></i>\n <span class=\"category-name\">{{ category.name }}</span>\n <span class=\"category-count\">{{ category.count }}</span>\n @if (category.children && category.children.length > 0) {\n <i class=\"fa-solid fa-chevron-right expand-icon\" \n [class.expanded]=\"expandedCategories.has(category.id)\"\n (click)=\"toggleCategoryExpanded(category.id); $event.stopPropagation()\"></i>\n }\n </div>\n \n <!-- Sub-categories -->\n @if (category.children && expandedCategories.has(category.id)) {\n <div class=\"sub-categories\">\n @for (subCategory of category.children; track subCategory.id) {\n <div class=\"category-item sub-category\" \n [class.selected]=\"(selectedCategory$ | async) === subCategory.id\"\n (click)=\"selectCategory(subCategory.id); $event.stopPropagation()\">\n <div class=\"category-header\">\n <i class=\"fa-solid {{ subCategory.icon }} category-icon\"></i>\n <span class=\"category-name\">{{ subCategory.name }}</span>\n <span class=\"category-count\">{{ subCategory.count }}</span>\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Actions Display -->\n <div class=\"actions-container\">\n <!-- Loading State -->\n @if (isLoading$ | async) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading actions...\" size=\"large\"></mj-loading>\n </div>\n }\n\n <!-- Empty State -->\n @if (!(isLoading$ | async) && (filteredActions$ | async)?.length === 0) {\n <mj-empty-state\n Variant=\"no-results\"\n Title=\"No actions found\"\n Message=\"Try adjusting your search criteria or selecting a different category\"\n ActionText=\"Clear Filters\"\n (Action)=\"clearSearch()\" />\n }\n\n <!-- Grid View -->\n @if (!(isLoading$ | async) && (viewMode$ | async) === 'grid' && (filteredActions$ | async) && (filteredActions$ | async)!.length > 0) {\n <div class=\"actions-grid\" \n [style.grid-template-columns]=\"'repeat(' + (config.gridColumns || 3) + ', 1fr)'\">\n \n @for (action of filteredActions$ | async; track action.ID) {\n <div class=\"action-card\" \n [class.expanded]=\"action.expanded\"\n [class.selected]=\"action.selected\"\n [class.animate]=\"animateCards\"\n [class.hover]=\"hoveredAction === action.ID\"\n (mouseenter)=\"hoveredAction = action.ID\"\n (mouseleave)=\"hoveredAction = null\"\n (click)=\"toggleActionSelection(action)\">\n \n <!-- Card Header -->\n <div class=\"card-header\" (click)=\"toggleActionExpanded(action); $event.stopPropagation()\">\n <div class=\"action-icon\">\n <i class=\"fa-solid {{ getActionIcon(action) }}\"></i>\n </div>\n <div class=\"action-info\">\n <h3 class=\"action-name\">{{ action.Name }}</h3>\n <div class=\"action-meta\">\n @if (action.Category) {\n <span class=\"category-badge\">\n <i class=\"fa-solid fa-folder\"></i>\n {{ action.Category }}\n </span>\n }\n </div>\n </div>\n <div class=\"card-actions\">\n @if (config.enableQuickTest) {\n <button mjButton\n variant=\"flat\"\n size=\"sm\"\n (click)=\"testAction(action, $event)\"\n title=\"Test this action\">\n <i class=\"fa-solid fa-play\"></i>\n </button>\n }\n <i class=\"fa-solid expand-indicator\"\n [class.fa-chevron-down]=\"!action.expanded\"\n [class.fa-chevron-up]=\"action.expanded\"></i>\n </div>\n </div>\n \n <!-- Card Body -->\n <div class=\"card-body\">\n <p class=\"action-description\">{{ action.Description || 'No description available' }}</p>\n \n <!-- Quick Stats -->\n <div class=\"action-stats\">\n @if (action.parameters?.length) {\n <span class=\"stat\">\n <i class=\"fa-solid fa-sliders\"></i>\n {{ action.parameters?.length || 0 }} params\n </span>\n }\n @if (action.resultCodes?.length) {\n <span class=\"stat\">\n <i class=\"fa-solid fa-code-branch\"></i>\n {{ action.resultCodes?.length || 0 }} results\n </span>\n }\n @if (action.Type) {\n <span class=\"stat\">\n <i class=\"fa-solid fa-tag\"></i>\n {{ action.Type }}\n </span>\n }\n </div>\n </div>\n \n <!-- Expanded Details -->\n @if (action.expanded) {\n <div class=\"card-details\">\n <!-- Parameters -->\n @if (action.parameters && action.parameters.length > 0) {\n <div class=\"detail-section\">\n <h4>\n <i class=\"fa-solid fa-sliders\"></i>\n Parameters\n </h4>\n <div class=\"parameters-list\">\n @for (param of action.parameters; track param.ID) {\n <div class=\"parameter-item\">\n <span class=\"param-name\">{{ param.Name }}</span>\n <span class=\"param-type\">{{ param.Type }}</span>\n @if (param.IsRequired) {\n <span class=\"param-required\">Required</span>\n }\n </div>\n }\n </div>\n </div>\n }\n \n <!-- Result Codes -->\n @if (action.resultCodes && action.resultCodes.length > 0) {\n <div class=\"detail-section\">\n <h4>\n <i class=\"fa-solid fa-code-branch\"></i>\n Result Codes\n </h4>\n <div class=\"result-codes-list\">\n @for (code of action.resultCodes; track code.ID) {\n <div class=\"result-code-item\">\n <span class=\"code-value\">{{ code.ResultCode }}</span>\n <span class=\"code-desc\">{{ code.Description }}</span>\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n \n <!-- Selection Indicator -->\n @if (config.selectionMode) {\n <div class=\"selection-indicator\">\n <i class=\"fa-solid\" [class.fa-check-circle]=\"action.selected\" [class.fa-circle]=\"!action.selected\"></i>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- List View -->\n @if (!(isLoading$ | async) && (viewMode$ | async) === 'list' && (filteredActions$ | async) && (filteredActions$ | async)!.length > 0) {\n <div class=\"actions-list\">\n \n <div class=\"list-header\">\n <span class=\"col-name\">Name</span>\n <span class=\"col-category\">Category</span>\n <span class=\"col-type\">Type</span>\n <span class=\"col-params\">Parameters</span>\n <span class=\"col-actions\">Actions</span>\n </div>\n \n @for (action of filteredActions$ | async; track action.ID) {\n <div class=\"list-item\" \n [class.selected]=\"action.selected\"\n (click)=\"toggleActionSelection(action)\">\n \n <span class=\"col-name\">\n <i class=\"fa-solid {{ getActionIcon(action) }} action-icon\"></i>\n {{ action.Name }}\n </span>\n <span class=\"col-category\">{{ action.Category || '-' }}</span>\n <span class=\"col-type\">{{ action.Type || '-' }}</span>\n <span class=\"col-params\">{{ action.parameters?.length || 0 }}</span>\n <span class=\"col-actions\">\n @if (config.enableQuickTest) {\n <button mjButton\n variant=\"flat\"\n size=\"sm\"\n (click)=\"testAction(action, $event)\"\n title=\"Test this action\">\n <i class=\"fa-solid fa-play\"></i>\n </button>\n }\n </span>\n \n <!-- Selection Indicator -->\n @if (config.selectionMode) {\n <div class=\"selection-indicator\">\n <i class=\"fa-solid\" [class.fa-check-circle]=\"action.selected\" [class.fa-circle]=\"!action.selected\"></i>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n</div>\n\n", styles: ["/* Action Gallery Component Styles */\n"] }]
807
802
  }], () => [], { config: [{
808
803
  type: Input
809
804
  }], preSelectedActions: [{
@@ -1 +1 @@
1
- {"version":3,"file":"action-gallery.component.js","sourceRoot":"","sources":["../../src/lib/action-gallery.component.ts","../../src/lib/action-gallery.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, OnDestroy, ViewChild, ElementRef } from '@angular/core';\nimport { FormControl } from '@angular/forms';\nimport { Subject, BehaviorSubject, combineLatest, debounceTime, distinctUntilChanged, takeUntil } from 'rxjs';\nimport { RunView } from '@memberjunction/core';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { MJActionEntity, MJActionCategoryEntity, MJActionParamEntity, MJActionResultCodeEntity } from '@memberjunction/core-entities';\n\nexport interface ActionGalleryConfig {\n selectionMode?: boolean;\n multiSelect?: boolean;\n showCategories?: boolean;\n showSearch?: boolean;\n defaultView?: 'grid' | 'list';\n gridColumns?: number;\n enableQuickTest?: boolean;\n theme?: 'light' | 'dark';\n}\n\nexport interface CategoryNode {\n id: string;\n name: string;\n parent?: string;\n children?: CategoryNode[];\n count?: number;\n icon?: string;\n}\n\nexport interface ActionWithDetails extends MJActionEntity {\n parameters?: MJActionParamEntity[];\n resultCodes?: MJActionResultCodeEntity[];\n expanded?: boolean;\n selected?: boolean;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-action-gallery',\n templateUrl: './action-gallery.component.html',\n styleUrls: ['./action-gallery.component.css']\n})\nexport class ActionGalleryComponent implements OnInit, OnDestroy {\n @Input() config: ActionGalleryConfig = {\n selectionMode: false,\n multiSelect: false,\n showCategories: true,\n showSearch: true,\n defaultView: 'grid',\n gridColumns: 3,\n enableQuickTest: true,\n theme: 'light'\n };\n \n @Input() preSelectedActions: string[] = [];\n @Output() actionSelected = new EventEmitter<MJActionEntity>();\n @Output() actionsSelected = new EventEmitter<MJActionEntity[]>();\n @Output() actionTestRequested = new EventEmitter<MJActionEntity>();\n \n @ViewChild('searchInput', { static: false }) searchInput: ElementRef<HTMLInputElement>;\n \n // State management\n private destroy$ = new Subject<void>();\n actions$ = new BehaviorSubject<ActionWithDetails[]>([]);\n categories$ = new BehaviorSubject<MJActionCategoryEntity[]>([]);\n filteredActions$ = new BehaviorSubject<ActionWithDetails[]>([]);\n categoryTree$ = new BehaviorSubject<CategoryNode[]>([]);\n selectedCategory$ = new BehaviorSubject<string>('all');\n viewMode$ = new BehaviorSubject<'grid' | 'list'>('grid');\n isLoading$ = new BehaviorSubject<boolean>(false);\n selectedActions$ = new BehaviorSubject<Set<string>>(new Set());\n \n // Form controls\n searchControl = new FormControl('');\n \n // UI state\n expandedCategories = new Set<string>();\n hoveredAction: string | null = null;\n animateCards = false;\n \n // Statistics\n totalActions = 0;\n categoryCounts = new Map<string, number>();\n \n constructor() {}\n \n ngOnInit() {\n // Set initial view mode\n this.viewMode$.next(this.config.defaultView || 'grid');\n \n // Load data\n this.loadData();\n \n // Set up filtering\n combineLatest([\n this.actions$,\n this.searchControl.valueChanges.pipe(\n debounceTime(300),\n distinctUntilChanged()\n ),\n this.selectedCategory$\n ]).pipe(\n takeUntil(this.destroy$)\n ).subscribe(([actions, searchTerm, category]) => {\n this.filterActions(actions, searchTerm || '', category);\n });\n \n // Initialize with pre-selected actions\n if (this.preSelectedActions.length > 0) {\n this.selectedActions$.next(new Set(this.preSelectedActions));\n }\n \n // Enable animations after initial load\n setTimeout(() => {\n this.animateCards = true;\n }, 100);\n }\n \n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n \n async loadData() {\n this.isLoading$.next(true);\n \n try {\n const rv = new RunView();\n \n // Load actions and categories in parallel\n const [actionsResult, categoriesResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Actions',\n ResultType: 'entity_object',\n OrderBy: 'Category, Name',\n MaxRows: 5000\n },\n {\n EntityName: 'MJ: Action Categories',\n ResultType: 'entity_object',\n OrderBy: 'Name',\n MaxRows: 1000\n }\n ]);\n \n if (actionsResult.Success && categoriesResult.Success) {\n const actions = actionsResult.Results as MJActionEntity[] || [];\n const categories = categoriesResult.Results as MJActionCategoryEntity[] || [];\n \n // Process actions\n const actionsWithDetails = actions.map(action => ({\n ...action,\n expanded: false,\n selected: this.preSelectedActions.some(id => UUIDsEqual(id, action.ID))\n } as ActionWithDetails));\n \n this.actions$.next(actionsWithDetails);\n this.totalActions = actions.length;\n \n // Process categories\n this.categories$.next(categories);\n this.buildCategoryTree(categories, actions);\n \n // Initial filter\n this.filterActions(actionsWithDetails, '', 'all');\n }\n } catch (error) {\n console.error('Error loading gallery data:', error);\n } finally {\n this.isLoading$.next(false);\n }\n }\n \n private buildCategoryTree(categories: MJActionCategoryEntity[], actions: MJActionEntity[]) {\n // Count actions per category\n this.categoryCounts.clear();\n actions.forEach(action => {\n const count = this.categoryCounts.get(action.Category || 'Uncategorized') || 0;\n this.categoryCounts.set(action.Category || 'Uncategorized', count + 1);\n });\n \n // Build tree structure\n const nodeMap = new Map<string, CategoryNode>();\n const rootNodes: CategoryNode[] = [];\n \n // Create nodes\n categories.forEach(cat => {\n const node: CategoryNode = {\n id: cat.ID,\n name: cat.Name,\n parent: cat.ParentID || undefined,\n children: [],\n count: this.categoryCounts.get(cat.Name) || 0,\n icon: this.getCategoryIcon(cat.Name)\n };\n nodeMap.set(cat.ID, node);\n });\n \n // Build hierarchy\n nodeMap.forEach(node => {\n if (node.parent && nodeMap.has(node.parent)) {\n const parent = nodeMap.get(node.parent)!;\n parent.children!.push(node);\n // Accumulate counts up the tree\n parent.count = (parent.count || 0) + (node.count || 0);\n } else {\n rootNodes.push(node);\n }\n });\n \n // Add \"All\" category at the top\n const allNode: CategoryNode = {\n id: 'all',\n name: 'All Actions',\n count: this.totalActions,\n icon: 'fa-th'\n };\n \n // Add \"Uncategorized\" if needed\n const uncategorizedCount = this.categoryCounts.get('Uncategorized') || 0;\n if (uncategorizedCount > 0) {\n const uncategorizedNode: CategoryNode = {\n id: 'uncategorized',\n name: 'Uncategorized',\n count: uncategorizedCount,\n icon: 'fa-question-circle'\n };\n rootNodes.push(uncategorizedNode);\n }\n \n this.categoryTree$.next([allNode, ...rootNodes]);\n }\n \n private getCategoryIcon(categoryName: string): string {\n const iconMap: { [key: string]: string } = {\n 'Data': 'fa-database',\n 'Communication': 'fa-envelope',\n 'Integration': 'fa-plug',\n 'Security': 'fa-shield',\n 'Workflow': 'fa-project-diagram',\n 'AI': 'fa-brain',\n 'Files': 'fa-file',\n 'Utilities': 'fa-tools',\n 'System': 'fa-cog',\n 'Analytics': 'fa-chart-line'\n };\n \n return iconMap[categoryName] || 'fa-folder';\n }\n \n getCategoryIconClass(category: CategoryNode): string {\n // Ensure we have a valid icon\n if (!category.icon) {\n return 'fa-solid fa-folder category-icon';\n }\n return `fa-solid ${category.icon} category-icon`;\n }\n \n private filterActions(actions: ActionWithDetails[], searchTerm: string, category: string) {\n let filtered = [...actions];\n \n // Category filter\n if (category && category !== 'all') {\n if (category === 'uncategorized') {\n filtered = filtered.filter(a => !a.Category);\n } else {\n const categoryName = this.getCategoryName(category);\n filtered = filtered.filter(a => a.Category === categoryName);\n }\n }\n \n // Search filter\n if (searchTerm) {\n const term = searchTerm.toLowerCase();\n filtered = filtered.filter(action => \n action.Name.toLowerCase().includes(term) ||\n action.Description?.toLowerCase().includes(term) ||\n action.Category?.toLowerCase().includes(term)\n );\n }\n \n this.filteredActions$.next(filtered);\n }\n \n private getCategoryName(categoryId: string): string {\n const category = this.categories$.value.find(c => UUIDsEqual(c.ID, categoryId));\n return category?.Name || '';\n }\n \n selectCategory(categoryId: string) {\n this.selectedCategory$.next(categoryId);\n }\n \n toggleCategoryExpanded(categoryId: string) {\n if (this.expandedCategories.has(categoryId)) {\n this.expandedCategories.delete(categoryId);\n } else {\n this.expandedCategories.add(categoryId);\n }\n }\n \n toggleViewMode() {\n const currentMode = this.viewMode$.value;\n this.viewMode$.next(currentMode === 'grid' ? 'list' : 'grid');\n }\n \n async toggleActionExpanded(action: ActionWithDetails) {\n action.expanded = !action.expanded;\n \n // Load details if expanding and not already loaded\n if (action.expanded && !action.parameters) {\n await this.loadActionDetails(action);\n }\n }\n \n async loadActionDetails(action: ActionWithDetails) {\n const rv = new RunView();\n \n try {\n const [paramsResult, resultCodesResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Action Params',\n ExtraFilter: `ActionID='${action.ID}'`,\n OrderBy: 'Sequence',\n ResultType: 'entity_object',\n MaxRows: 100\n },\n {\n EntityName: 'MJ: Action Result Codes',\n ExtraFilter: `ActionID='${action.ID}'`,\n OrderBy: 'ResultCode',\n ResultType: 'entity_object',\n MaxRows: 100\n }\n ]);\n \n if (paramsResult.Success) {\n action.parameters = paramsResult.Results as MJActionParamEntity[] || [];\n }\n \n if (resultCodesResult.Success) {\n action.resultCodes = resultCodesResult.Results as MJActionResultCodeEntity[] || [];\n }\n } catch (error) {\n console.error('Error loading action details:', error);\n }\n }\n \n toggleActionSelection(action: ActionWithDetails) {\n if (!this.config.selectionMode) return;\n \n const selected = this.selectedActions$.value;\n \n if (!this.config.multiSelect) {\n // Single select mode\n selected.clear();\n if (!action.selected) {\n selected.add(action.ID);\n action.selected = true;\n this.actionSelected.emit(action);\n }\n } else {\n // Multi-select mode\n if (action.selected) {\n selected.delete(action.ID);\n action.selected = false;\n } else {\n selected.add(action.ID);\n action.selected = true;\n }\n }\n \n this.selectedActions$.next(new Set(selected));\n \n if (this.config.multiSelect) {\n const selectedActions = this.actions$.value.filter(a => selected.has(a.ID));\n this.actionsSelected.emit(selectedActions);\n }\n }\n \n testAction(action: MJActionEntity, event: Event) {\n event.stopPropagation();\n \n if (this.config.enableQuickTest) {\n // TODO: Implement test harness integration\n console.log('Test action:', action.Name);\n }\n \n this.actionTestRequested.emit(action);\n }\n \n clearSearch() {\n this.searchControl.reset();\n if (this.searchInput) {\n this.searchInput.nativeElement.focus();\n }\n }\n \n getSelectedActions(): MJActionEntity[] {\n const selected = this.selectedActions$.value;\n return this.actions$.value.filter(a => selected.has(a.ID));\n }\n \n getActionIcon(action: MJActionEntity): string {\n const typeIcons: { [key: string]: string } = {\n 'Create': 'fa-plus-circle',\n 'Update': 'fa-edit',\n 'Delete': 'fa-trash',\n 'Query': 'fa-search',\n 'Process': 'fa-cogs',\n 'Email': 'fa-envelope',\n 'Report': 'fa-file-alt',\n 'Export': 'fa-file-export',\n 'Import': 'fa-file-import',\n 'API': 'fa-plug',\n 'Script': 'fa-code'\n };\n \n for (const [key, icon] of Object.entries(typeIcons)) {\n if (action.Name.toLowerCase().includes(key.toLowerCase()) || \n action.Type?.toLowerCase().includes(key.toLowerCase())) {\n return icon;\n }\n }\n \n return 'fa-bolt';\n }\n}","<div class=\"action-gallery\" [class.dark-theme]=\"config.theme === 'dark'\" [class.selection-mode]=\"config.selectionMode\">\n <!-- Gallery Header -->\n @if (config.showSearch) {\n <div class=\"gallery-header\">\n <div class=\"header-content\">\n <div class=\"search-section\">\n <div class=\"search-input-wrapper\">\n <i class=\"fa-solid fa-search\"></i>\n <input\n #searchInput\n class=\"mj-input search-input\"\n [formControl]=\"searchControl\"\n placeholder=\"Search actions by name, description, or category...\"\n />\n </div>\n </div>\n \n <div class=\"header-actions\">\n <div class=\"view-toggle\">\n <button mjButton\n size=\"sm\"\n (click)=\"toggleViewMode()\"\n [title]=\"(viewMode$ | async) === 'grid' ? 'Switch to list view' : 'Switch to grid view'\">\n <i class=\"fa-solid\" [class.fa-th]=\"(viewMode$ | async) === 'grid'\" [class.fa-list]=\"(viewMode$ | async) === 'list'\"></i>\n </button>\n </div>\n <div class=\"stats\">\n <span class=\"stat-item\">\n <i class=\"fa-solid fa-bolt\"></i>\n {{ (filteredActions$ | async)?.length }} of {{ totalActions }} actions\n </span>\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- Main Content -->\n <div class=\"gallery-content\" [class.no-categories]=\"!config.showCategories\">\n <!-- Category Sidebar -->\n @if (config.showCategories) {\n <div class=\"category-sidebar\">\n <div class=\"category-tree\">\n @for (category of categoryTree$ | async; track category.id) {\n <div class=\"category-item\" \n [class.selected]=\"(selectedCategory$ | async) === category.id\"\n [class.has-children]=\"category.children && category.children.length > 0\"\n (click)=\"selectCategory(category.id)\">\n \n <div class=\"category-header\">\n <i class=\"fa-solid {{ category.icon }} category-icon\"></i>\n <span class=\"category-name\">{{ category.name }}</span>\n <span class=\"category-count\">{{ category.count }}</span>\n @if (category.children && category.children.length > 0) {\n <i class=\"fa-solid fa-chevron-right expand-icon\" \n [class.expanded]=\"expandedCategories.has(category.id)\"\n (click)=\"toggleCategoryExpanded(category.id); $event.stopPropagation()\"></i>\n }\n </div>\n \n <!-- Sub-categories -->\n @if (category.children && expandedCategories.has(category.id)) {\n <div class=\"sub-categories\">\n @for (subCategory of category.children; track subCategory.id) {\n <div class=\"category-item sub-category\" \n [class.selected]=\"(selectedCategory$ | async) === subCategory.id\"\n (click)=\"selectCategory(subCategory.id); $event.stopPropagation()\">\n <div class=\"category-header\">\n <i class=\"fa-solid {{ subCategory.icon }} category-icon\"></i>\n <span class=\"category-name\">{{ subCategory.name }}</span>\n <span class=\"category-count\">{{ subCategory.count }}</span>\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Actions Display -->\n <div class=\"actions-container\">\n <!-- Loading State -->\n @if (isLoading$ | async) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading actions...\" size=\"large\"></mj-loading>\n </div>\n }\n\n <!-- Empty State -->\n @if (!(isLoading$ | async) && (filteredActions$ | async)?.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-search-minus\"></i>\n <h3>No actions found</h3>\n <p>Try adjusting your search criteria or selecting a different category</p>\n <button mjButton (click)=\"clearSearch()\">Clear Search</button>\n </div>\n }\n\n <!-- Grid View -->\n @if (!(isLoading$ | async) && (viewMode$ | async) === 'grid' && (filteredActions$ | async) && (filteredActions$ | async)!.length > 0) {\n <div class=\"actions-grid\" \n [style.grid-template-columns]=\"'repeat(' + (config.gridColumns || 3) + ', 1fr)'\">\n \n @for (action of filteredActions$ | async; track action.ID) {\n <div class=\"action-card\" \n [class.expanded]=\"action.expanded\"\n [class.selected]=\"action.selected\"\n [class.animate]=\"animateCards\"\n [class.hover]=\"hoveredAction === action.ID\"\n (mouseenter)=\"hoveredAction = action.ID\"\n (mouseleave)=\"hoveredAction = null\"\n (click)=\"toggleActionSelection(action)\">\n \n <!-- Card Header -->\n <div class=\"card-header\" (click)=\"toggleActionExpanded(action); $event.stopPropagation()\">\n <div class=\"action-icon\">\n <i class=\"fa-solid {{ getActionIcon(action) }}\"></i>\n </div>\n <div class=\"action-info\">\n <h3 class=\"action-name\">{{ action.Name }}</h3>\n <div class=\"action-meta\">\n @if (action.Category) {\n <span class=\"category-badge\">\n <i class=\"fa-solid fa-folder\"></i>\n {{ action.Category }}\n </span>\n }\n </div>\n </div>\n <div class=\"card-actions\">\n @if (config.enableQuickTest) {\n <button mjButton\n variant=\"flat\"\n size=\"sm\"\n (click)=\"testAction(action, $event)\"\n title=\"Test this action\">\n <i class=\"fa-solid fa-play\"></i>\n </button>\n }\n <i class=\"fa-solid expand-indicator\"\n [class.fa-chevron-down]=\"!action.expanded\"\n [class.fa-chevron-up]=\"action.expanded\"></i>\n </div>\n </div>\n \n <!-- Card Body -->\n <div class=\"card-body\">\n <p class=\"action-description\">{{ action.Description || 'No description available' }}</p>\n \n <!-- Quick Stats -->\n <div class=\"action-stats\">\n @if (action.parameters?.length) {\n <span class=\"stat\">\n <i class=\"fa-solid fa-sliders\"></i>\n {{ action.parameters?.length || 0 }} params\n </span>\n }\n @if (action.resultCodes?.length) {\n <span class=\"stat\">\n <i class=\"fa-solid fa-code-branch\"></i>\n {{ action.resultCodes?.length || 0 }} results\n </span>\n }\n @if (action.Type) {\n <span class=\"stat\">\n <i class=\"fa-solid fa-tag\"></i>\n {{ action.Type }}\n </span>\n }\n </div>\n </div>\n \n <!-- Expanded Details -->\n @if (action.expanded) {\n <div class=\"card-details\">\n <!-- Parameters -->\n @if (action.parameters && action.parameters.length > 0) {\n <div class=\"detail-section\">\n <h4>\n <i class=\"fa-solid fa-sliders\"></i>\n Parameters\n </h4>\n <div class=\"parameters-list\">\n @for (param of action.parameters; track param.ID) {\n <div class=\"parameter-item\">\n <span class=\"param-name\">{{ param.Name }}</span>\n <span class=\"param-type\">{{ param.Type }}</span>\n @if (param.IsRequired) {\n <span class=\"param-required\">Required</span>\n }\n </div>\n }\n </div>\n </div>\n }\n \n <!-- Result Codes -->\n @if (action.resultCodes && action.resultCodes.length > 0) {\n <div class=\"detail-section\">\n <h4>\n <i class=\"fa-solid fa-code-branch\"></i>\n Result Codes\n </h4>\n <div class=\"result-codes-list\">\n @for (code of action.resultCodes; track code.ID) {\n <div class=\"result-code-item\">\n <span class=\"code-value\">{{ code.ResultCode }}</span>\n <span class=\"code-desc\">{{ code.Description }}</span>\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n \n <!-- Selection Indicator -->\n @if (config.selectionMode) {\n <div class=\"selection-indicator\">\n <i class=\"fa-solid\" [class.fa-check-circle]=\"action.selected\" [class.fa-circle]=\"!action.selected\"></i>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- List View -->\n @if (!(isLoading$ | async) && (viewMode$ | async) === 'list' && (filteredActions$ | async) && (filteredActions$ | async)!.length > 0) {\n <div class=\"actions-list\">\n \n <div class=\"list-header\">\n <span class=\"col-name\">Name</span>\n <span class=\"col-category\">Category</span>\n <span class=\"col-type\">Type</span>\n <span class=\"col-params\">Parameters</span>\n <span class=\"col-actions\">Actions</span>\n </div>\n \n @for (action of filteredActions$ | async; track action.ID) {\n <div class=\"list-item\" \n [class.selected]=\"action.selected\"\n (click)=\"toggleActionSelection(action)\">\n \n <span class=\"col-name\">\n <i class=\"fa-solid {{ getActionIcon(action) }} action-icon\"></i>\n {{ action.Name }}\n </span>\n <span class=\"col-category\">{{ action.Category || '-' }}</span>\n <span class=\"col-type\">{{ action.Type || '-' }}</span>\n <span class=\"col-params\">{{ action.parameters?.length || 0 }}</span>\n <span class=\"col-actions\">\n @if (config.enableQuickTest) {\n <button mjButton\n variant=\"flat\"\n size=\"sm\"\n (click)=\"testAction(action, $event)\"\n title=\"Test this action\">\n <i class=\"fa-solid fa-play\"></i>\n </button>\n }\n </span>\n \n <!-- Selection Indicator -->\n @if (config.selectionMode) {\n <div class=\"selection-indicator\">\n <i class=\"fa-solid\" [class.fa-check-circle]=\"action.selected\" [class.fa-circle]=\"!action.selected\"></i>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n</div>\n\n"]}
1
+ {"version":3,"file":"action-gallery.component.js","sourceRoot":"","sources":["../../src/lib/action-gallery.component.ts","../../src/lib/action-gallery.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, OnDestroy, ViewChild, ElementRef } from '@angular/core';\nimport { FormControl } from '@angular/forms';\nimport { Subject, BehaviorSubject, combineLatest, debounceTime, distinctUntilChanged, takeUntil } from 'rxjs';\nimport { RunView } from '@memberjunction/core';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { MJActionEntity, MJActionCategoryEntity, MJActionParamEntity, MJActionResultCodeEntity } from '@memberjunction/core-entities';\n\nexport interface ActionGalleryConfig {\n selectionMode?: boolean;\n multiSelect?: boolean;\n showCategories?: boolean;\n showSearch?: boolean;\n defaultView?: 'grid' | 'list';\n gridColumns?: number;\n enableQuickTest?: boolean;\n theme?: 'light' | 'dark';\n}\n\nexport interface CategoryNode {\n id: string;\n name: string;\n parent?: string;\n children?: CategoryNode[];\n count?: number;\n icon?: string;\n}\n\nexport interface ActionWithDetails extends MJActionEntity {\n parameters?: MJActionParamEntity[];\n resultCodes?: MJActionResultCodeEntity[];\n expanded?: boolean;\n selected?: boolean;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-action-gallery',\n templateUrl: './action-gallery.component.html',\n styleUrls: ['./action-gallery.component.css']\n})\nexport class ActionGalleryComponent implements OnInit, OnDestroy {\n @Input() config: ActionGalleryConfig = {\n selectionMode: false,\n multiSelect: false,\n showCategories: true,\n showSearch: true,\n defaultView: 'grid',\n gridColumns: 3,\n enableQuickTest: true,\n theme: 'light'\n };\n \n @Input() preSelectedActions: string[] = [];\n @Output() actionSelected = new EventEmitter<MJActionEntity>();\n @Output() actionsSelected = new EventEmitter<MJActionEntity[]>();\n @Output() actionTestRequested = new EventEmitter<MJActionEntity>();\n \n @ViewChild('searchInput', { static: false }) searchInput: ElementRef<HTMLInputElement>;\n \n // State management\n private destroy$ = new Subject<void>();\n actions$ = new BehaviorSubject<ActionWithDetails[]>([]);\n categories$ = new BehaviorSubject<MJActionCategoryEntity[]>([]);\n filteredActions$ = new BehaviorSubject<ActionWithDetails[]>([]);\n categoryTree$ = new BehaviorSubject<CategoryNode[]>([]);\n selectedCategory$ = new BehaviorSubject<string>('all');\n viewMode$ = new BehaviorSubject<'grid' | 'list'>('grid');\n isLoading$ = new BehaviorSubject<boolean>(false);\n selectedActions$ = new BehaviorSubject<Set<string>>(new Set());\n \n // Form controls\n searchControl = new FormControl('');\n \n // UI state\n expandedCategories = new Set<string>();\n hoveredAction: string | null = null;\n animateCards = false;\n \n // Statistics\n totalActions = 0;\n categoryCounts = new Map<string, number>();\n \n constructor() {}\n \n ngOnInit() {\n // Set initial view mode\n this.viewMode$.next(this.config.defaultView || 'grid');\n \n // Load data\n this.loadData();\n \n // Set up filtering\n combineLatest([\n this.actions$,\n this.searchControl.valueChanges.pipe(\n debounceTime(300),\n distinctUntilChanged()\n ),\n this.selectedCategory$\n ]).pipe(\n takeUntil(this.destroy$)\n ).subscribe(([actions, searchTerm, category]) => {\n this.filterActions(actions, searchTerm || '', category);\n });\n \n // Initialize with pre-selected actions\n if (this.preSelectedActions.length > 0) {\n this.selectedActions$.next(new Set(this.preSelectedActions));\n }\n \n // Enable animations after initial load\n setTimeout(() => {\n this.animateCards = true;\n }, 100);\n }\n \n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n \n async loadData() {\n this.isLoading$.next(true);\n \n try {\n const rv = new RunView();\n \n // Load actions and categories in parallel\n const [actionsResult, categoriesResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Actions',\n ResultType: 'entity_object',\n OrderBy: 'Category, Name',\n MaxRows: 5000\n },\n {\n EntityName: 'MJ: Action Categories',\n ResultType: 'entity_object',\n OrderBy: 'Name',\n MaxRows: 1000\n }\n ]);\n \n if (actionsResult.Success && categoriesResult.Success) {\n const actions = actionsResult.Results as MJActionEntity[] || [];\n const categories = categoriesResult.Results as MJActionCategoryEntity[] || [];\n \n // Process actions\n const actionsWithDetails = actions.map(action => ({\n ...action,\n expanded: false,\n selected: this.preSelectedActions.some(id => UUIDsEqual(id, action.ID))\n } as ActionWithDetails));\n \n this.actions$.next(actionsWithDetails);\n this.totalActions = actions.length;\n \n // Process categories\n this.categories$.next(categories);\n this.buildCategoryTree(categories, actions);\n \n // Initial filter\n this.filterActions(actionsWithDetails, '', 'all');\n }\n } catch (error) {\n console.error('Error loading gallery data:', error);\n } finally {\n this.isLoading$.next(false);\n }\n }\n \n private buildCategoryTree(categories: MJActionCategoryEntity[], actions: MJActionEntity[]) {\n // Count actions per category\n this.categoryCounts.clear();\n actions.forEach(action => {\n const count = this.categoryCounts.get(action.Category || 'Uncategorized') || 0;\n this.categoryCounts.set(action.Category || 'Uncategorized', count + 1);\n });\n \n // Build tree structure\n const nodeMap = new Map<string, CategoryNode>();\n const rootNodes: CategoryNode[] = [];\n \n // Create nodes\n categories.forEach(cat => {\n const node: CategoryNode = {\n id: cat.ID,\n name: cat.Name,\n parent: cat.ParentID || undefined,\n children: [],\n count: this.categoryCounts.get(cat.Name) || 0,\n icon: this.getCategoryIcon(cat.Name)\n };\n nodeMap.set(cat.ID, node);\n });\n \n // Build hierarchy\n nodeMap.forEach(node => {\n if (node.parent && nodeMap.has(node.parent)) {\n const parent = nodeMap.get(node.parent)!;\n parent.children!.push(node);\n // Accumulate counts up the tree\n parent.count = (parent.count || 0) + (node.count || 0);\n } else {\n rootNodes.push(node);\n }\n });\n \n // Add \"All\" category at the top\n const allNode: CategoryNode = {\n id: 'all',\n name: 'All Actions',\n count: this.totalActions,\n icon: 'fa-th'\n };\n \n // Add \"Uncategorized\" if needed\n const uncategorizedCount = this.categoryCounts.get('Uncategorized') || 0;\n if (uncategorizedCount > 0) {\n const uncategorizedNode: CategoryNode = {\n id: 'uncategorized',\n name: 'Uncategorized',\n count: uncategorizedCount,\n icon: 'fa-question-circle'\n };\n rootNodes.push(uncategorizedNode);\n }\n \n this.categoryTree$.next([allNode, ...rootNodes]);\n }\n \n private getCategoryIcon(categoryName: string): string {\n const iconMap: { [key: string]: string } = {\n 'Data': 'fa-database',\n 'Communication': 'fa-envelope',\n 'Integration': 'fa-plug',\n 'Security': 'fa-shield',\n 'Workflow': 'fa-project-diagram',\n 'AI': 'fa-brain',\n 'Files': 'fa-file',\n 'Utilities': 'fa-tools',\n 'System': 'fa-cog',\n 'Analytics': 'fa-chart-line'\n };\n \n return iconMap[categoryName] || 'fa-folder';\n }\n \n getCategoryIconClass(category: CategoryNode): string {\n // Ensure we have a valid icon\n if (!category.icon) {\n return 'fa-solid fa-folder category-icon';\n }\n return `fa-solid ${category.icon} category-icon`;\n }\n \n private filterActions(actions: ActionWithDetails[], searchTerm: string, category: string) {\n let filtered = [...actions];\n \n // Category filter\n if (category && category !== 'all') {\n if (category === 'uncategorized') {\n filtered = filtered.filter(a => !a.Category);\n } else {\n const categoryName = this.getCategoryName(category);\n filtered = filtered.filter(a => a.Category === categoryName);\n }\n }\n \n // Search filter\n if (searchTerm) {\n const term = searchTerm.toLowerCase();\n filtered = filtered.filter(action => \n action.Name.toLowerCase().includes(term) ||\n action.Description?.toLowerCase().includes(term) ||\n action.Category?.toLowerCase().includes(term)\n );\n }\n \n this.filteredActions$.next(filtered);\n }\n \n private getCategoryName(categoryId: string): string {\n const category = this.categories$.value.find(c => UUIDsEqual(c.ID, categoryId));\n return category?.Name || '';\n }\n \n selectCategory(categoryId: string) {\n this.selectedCategory$.next(categoryId);\n }\n \n toggleCategoryExpanded(categoryId: string) {\n if (this.expandedCategories.has(categoryId)) {\n this.expandedCategories.delete(categoryId);\n } else {\n this.expandedCategories.add(categoryId);\n }\n }\n \n toggleViewMode() {\n const currentMode = this.viewMode$.value;\n this.viewMode$.next(currentMode === 'grid' ? 'list' : 'grid');\n }\n \n async toggleActionExpanded(action: ActionWithDetails) {\n action.expanded = !action.expanded;\n \n // Load details if expanding and not already loaded\n if (action.expanded && !action.parameters) {\n await this.loadActionDetails(action);\n }\n }\n \n async loadActionDetails(action: ActionWithDetails) {\n const rv = new RunView();\n \n try {\n const [paramsResult, resultCodesResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Action Params',\n ExtraFilter: `ActionID='${action.ID}'`,\n OrderBy: 'Sequence',\n ResultType: 'entity_object',\n MaxRows: 100\n },\n {\n EntityName: 'MJ: Action Result Codes',\n ExtraFilter: `ActionID='${action.ID}'`,\n OrderBy: 'ResultCode',\n ResultType: 'entity_object',\n MaxRows: 100\n }\n ]);\n \n if (paramsResult.Success) {\n action.parameters = paramsResult.Results as MJActionParamEntity[] || [];\n }\n \n if (resultCodesResult.Success) {\n action.resultCodes = resultCodesResult.Results as MJActionResultCodeEntity[] || [];\n }\n } catch (error) {\n console.error('Error loading action details:', error);\n }\n }\n \n toggleActionSelection(action: ActionWithDetails) {\n if (!this.config.selectionMode) return;\n \n const selected = this.selectedActions$.value;\n \n if (!this.config.multiSelect) {\n // Single select mode\n selected.clear();\n if (!action.selected) {\n selected.add(action.ID);\n action.selected = true;\n this.actionSelected.emit(action);\n }\n } else {\n // Multi-select mode\n if (action.selected) {\n selected.delete(action.ID);\n action.selected = false;\n } else {\n selected.add(action.ID);\n action.selected = true;\n }\n }\n \n this.selectedActions$.next(new Set(selected));\n \n if (this.config.multiSelect) {\n const selectedActions = this.actions$.value.filter(a => selected.has(a.ID));\n this.actionsSelected.emit(selectedActions);\n }\n }\n \n testAction(action: MJActionEntity, event: Event) {\n event.stopPropagation();\n \n if (this.config.enableQuickTest) {\n // TODO: Implement test harness integration\n console.log('Test action:', action.Name);\n }\n \n this.actionTestRequested.emit(action);\n }\n \n // Backs the no-results empty-state \"Clear Filters\" CTA: resets every dimension\n // the list narrows on — search AND the selected category — so the CTA actually\n // returns results instead of appearing to do nothing.\n clearSearch() {\n this.searchControl.reset();\n this.selectedCategory$.next('all');\n if (this.searchInput) {\n this.searchInput.nativeElement.focus();\n }\n }\n \n getSelectedActions(): MJActionEntity[] {\n const selected = this.selectedActions$.value;\n return this.actions$.value.filter(a => selected.has(a.ID));\n }\n \n getActionIcon(action: MJActionEntity): string {\n const typeIcons: { [key: string]: string } = {\n 'Create': 'fa-plus-circle',\n 'Update': 'fa-edit',\n 'Delete': 'fa-trash',\n 'Query': 'fa-search',\n 'Process': 'fa-cogs',\n 'Email': 'fa-envelope',\n 'Report': 'fa-file-alt',\n 'Export': 'fa-file-export',\n 'Import': 'fa-file-import',\n 'API': 'fa-plug',\n 'Script': 'fa-code'\n };\n \n for (const [key, icon] of Object.entries(typeIcons)) {\n if (action.Name.toLowerCase().includes(key.toLowerCase()) || \n action.Type?.toLowerCase().includes(key.toLowerCase())) {\n return icon;\n }\n }\n \n return 'fa-bolt';\n }\n}","<div class=\"action-gallery\" [class.dark-theme]=\"config.theme === 'dark'\" [class.selection-mode]=\"config.selectionMode\">\n <!-- Gallery Header -->\n @if (config.showSearch) {\n <div class=\"gallery-header\">\n <div class=\"header-content\">\n <div class=\"search-section\">\n <div class=\"search-input-wrapper\">\n <i class=\"fa-solid fa-search\"></i>\n <input\n #searchInput\n class=\"mj-input search-input\"\n [formControl]=\"searchControl\"\n placeholder=\"Search actions by name, description, or category...\"\n />\n </div>\n </div>\n \n <div class=\"header-actions\">\n <div class=\"view-toggle\">\n <button mjButton\n size=\"sm\"\n (click)=\"toggleViewMode()\"\n [title]=\"(viewMode$ | async) === 'grid' ? 'Switch to list view' : 'Switch to grid view'\">\n <i class=\"fa-solid\" [class.fa-th]=\"(viewMode$ | async) === 'grid'\" [class.fa-list]=\"(viewMode$ | async) === 'list'\"></i>\n </button>\n </div>\n <div class=\"stats\">\n <span class=\"stat-item\">\n <i class=\"fa-solid fa-bolt\"></i>\n {{ (filteredActions$ | async)?.length }} of {{ totalActions }} actions\n </span>\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- Main Content -->\n <div class=\"gallery-content\" [class.no-categories]=\"!config.showCategories\">\n <!-- Category Sidebar -->\n @if (config.showCategories) {\n <div class=\"category-sidebar\">\n <div class=\"category-tree\">\n @for (category of categoryTree$ | async; track category.id) {\n <div class=\"category-item\" \n [class.selected]=\"(selectedCategory$ | async) === category.id\"\n [class.has-children]=\"category.children && category.children.length > 0\"\n (click)=\"selectCategory(category.id)\">\n \n <div class=\"category-header\">\n <i class=\"fa-solid {{ category.icon }} category-icon\"></i>\n <span class=\"category-name\">{{ category.name }}</span>\n <span class=\"category-count\">{{ category.count }}</span>\n @if (category.children && category.children.length > 0) {\n <i class=\"fa-solid fa-chevron-right expand-icon\" \n [class.expanded]=\"expandedCategories.has(category.id)\"\n (click)=\"toggleCategoryExpanded(category.id); $event.stopPropagation()\"></i>\n }\n </div>\n \n <!-- Sub-categories -->\n @if (category.children && expandedCategories.has(category.id)) {\n <div class=\"sub-categories\">\n @for (subCategory of category.children; track subCategory.id) {\n <div class=\"category-item sub-category\" \n [class.selected]=\"(selectedCategory$ | async) === subCategory.id\"\n (click)=\"selectCategory(subCategory.id); $event.stopPropagation()\">\n <div class=\"category-header\">\n <i class=\"fa-solid {{ subCategory.icon }} category-icon\"></i>\n <span class=\"category-name\">{{ subCategory.name }}</span>\n <span class=\"category-count\">{{ subCategory.count }}</span>\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Actions Display -->\n <div class=\"actions-container\">\n <!-- Loading State -->\n @if (isLoading$ | async) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading actions...\" size=\"large\"></mj-loading>\n </div>\n }\n\n <!-- Empty State -->\n @if (!(isLoading$ | async) && (filteredActions$ | async)?.length === 0) {\n <mj-empty-state\n Variant=\"no-results\"\n Title=\"No actions found\"\n Message=\"Try adjusting your search criteria or selecting a different category\"\n ActionText=\"Clear Filters\"\n (Action)=\"clearSearch()\" />\n }\n\n <!-- Grid View -->\n @if (!(isLoading$ | async) && (viewMode$ | async) === 'grid' && (filteredActions$ | async) && (filteredActions$ | async)!.length > 0) {\n <div class=\"actions-grid\" \n [style.grid-template-columns]=\"'repeat(' + (config.gridColumns || 3) + ', 1fr)'\">\n \n @for (action of filteredActions$ | async; track action.ID) {\n <div class=\"action-card\" \n [class.expanded]=\"action.expanded\"\n [class.selected]=\"action.selected\"\n [class.animate]=\"animateCards\"\n [class.hover]=\"hoveredAction === action.ID\"\n (mouseenter)=\"hoveredAction = action.ID\"\n (mouseleave)=\"hoveredAction = null\"\n (click)=\"toggleActionSelection(action)\">\n \n <!-- Card Header -->\n <div class=\"card-header\" (click)=\"toggleActionExpanded(action); $event.stopPropagation()\">\n <div class=\"action-icon\">\n <i class=\"fa-solid {{ getActionIcon(action) }}\"></i>\n </div>\n <div class=\"action-info\">\n <h3 class=\"action-name\">{{ action.Name }}</h3>\n <div class=\"action-meta\">\n @if (action.Category) {\n <span class=\"category-badge\">\n <i class=\"fa-solid fa-folder\"></i>\n {{ action.Category }}\n </span>\n }\n </div>\n </div>\n <div class=\"card-actions\">\n @if (config.enableQuickTest) {\n <button mjButton\n variant=\"flat\"\n size=\"sm\"\n (click)=\"testAction(action, $event)\"\n title=\"Test this action\">\n <i class=\"fa-solid fa-play\"></i>\n </button>\n }\n <i class=\"fa-solid expand-indicator\"\n [class.fa-chevron-down]=\"!action.expanded\"\n [class.fa-chevron-up]=\"action.expanded\"></i>\n </div>\n </div>\n \n <!-- Card Body -->\n <div class=\"card-body\">\n <p class=\"action-description\">{{ action.Description || 'No description available' }}</p>\n \n <!-- Quick Stats -->\n <div class=\"action-stats\">\n @if (action.parameters?.length) {\n <span class=\"stat\">\n <i class=\"fa-solid fa-sliders\"></i>\n {{ action.parameters?.length || 0 }} params\n </span>\n }\n @if (action.resultCodes?.length) {\n <span class=\"stat\">\n <i class=\"fa-solid fa-code-branch\"></i>\n {{ action.resultCodes?.length || 0 }} results\n </span>\n }\n @if (action.Type) {\n <span class=\"stat\">\n <i class=\"fa-solid fa-tag\"></i>\n {{ action.Type }}\n </span>\n }\n </div>\n </div>\n \n <!-- Expanded Details -->\n @if (action.expanded) {\n <div class=\"card-details\">\n <!-- Parameters -->\n @if (action.parameters && action.parameters.length > 0) {\n <div class=\"detail-section\">\n <h4>\n <i class=\"fa-solid fa-sliders\"></i>\n Parameters\n </h4>\n <div class=\"parameters-list\">\n @for (param of action.parameters; track param.ID) {\n <div class=\"parameter-item\">\n <span class=\"param-name\">{{ param.Name }}</span>\n <span class=\"param-type\">{{ param.Type }}</span>\n @if (param.IsRequired) {\n <span class=\"param-required\">Required</span>\n }\n </div>\n }\n </div>\n </div>\n }\n \n <!-- Result Codes -->\n @if (action.resultCodes && action.resultCodes.length > 0) {\n <div class=\"detail-section\">\n <h4>\n <i class=\"fa-solid fa-code-branch\"></i>\n Result Codes\n </h4>\n <div class=\"result-codes-list\">\n @for (code of action.resultCodes; track code.ID) {\n <div class=\"result-code-item\">\n <span class=\"code-value\">{{ code.ResultCode }}</span>\n <span class=\"code-desc\">{{ code.Description }}</span>\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n \n <!-- Selection Indicator -->\n @if (config.selectionMode) {\n <div class=\"selection-indicator\">\n <i class=\"fa-solid\" [class.fa-check-circle]=\"action.selected\" [class.fa-circle]=\"!action.selected\"></i>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- List View -->\n @if (!(isLoading$ | async) && (viewMode$ | async) === 'list' && (filteredActions$ | async) && (filteredActions$ | async)!.length > 0) {\n <div class=\"actions-list\">\n \n <div class=\"list-header\">\n <span class=\"col-name\">Name</span>\n <span class=\"col-category\">Category</span>\n <span class=\"col-type\">Type</span>\n <span class=\"col-params\">Parameters</span>\n <span class=\"col-actions\">Actions</span>\n </div>\n \n @for (action of filteredActions$ | async; track action.ID) {\n <div class=\"list-item\" \n [class.selected]=\"action.selected\"\n (click)=\"toggleActionSelection(action)\">\n \n <span class=\"col-name\">\n <i class=\"fa-solid {{ getActionIcon(action) }} action-icon\"></i>\n {{ action.Name }}\n </span>\n <span class=\"col-category\">{{ action.Category || '-' }}</span>\n <span class=\"col-type\">{{ action.Type || '-' }}</span>\n <span class=\"col-params\">{{ action.parameters?.length || 0 }}</span>\n <span class=\"col-actions\">\n @if (config.enableQuickTest) {\n <button mjButton\n variant=\"flat\"\n size=\"sm\"\n (click)=\"testAction(action, $event)\"\n title=\"Test this action\">\n <i class=\"fa-solid fa-play\"></i>\n </button>\n }\n </span>\n \n <!-- Selection Indicator -->\n @if (config.selectionMode) {\n <div class=\"selection-indicator\">\n <i class=\"fa-solid\" [class.fa-check-circle]=\"action.selected\" [class.fa-circle]=\"!action.selected\"></i>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n</div>\n\n"]}
package/dist/module.d.ts CHANGED
@@ -7,7 +7,7 @@ import * as i5 from "@memberjunction/ng-ai-test-harness";
7
7
  import * as i6 from "@memberjunction/ng-shared-generic";
8
8
  export declare class ActionGalleryModule {
9
9
  static ɵfac: i0.ɵɵFactoryDeclaration<ActionGalleryModule, never>;
10
- static ɵmod: i0.ɵɵNgModuleDeclaration<ActionGalleryModule, [typeof i1.ActionGalleryComponent], [typeof i2.CommonModule, typeof i3.FormsModule, typeof i3.ReactiveFormsModule, typeof i4.MJButtonDirective, typeof i5.AITestHarnessModule, typeof i6.SharedGenericModule], [typeof i1.ActionGalleryComponent]>;
10
+ static ɵmod: i0.ɵɵNgModuleDeclaration<ActionGalleryModule, [typeof i1.ActionGalleryComponent], [typeof i2.CommonModule, typeof i3.FormsModule, typeof i3.ReactiveFormsModule, typeof i4.MJButtonDirective, typeof i4.MJEmptyStateComponent, typeof i5.AITestHarnessModule, typeof i6.SharedGenericModule], [typeof i1.ActionGalleryComponent]>;
11
11
  static ɵinj: i0.ɵɵInjectorDeclaration<ActionGalleryModule>;
12
12
  }
13
13
  //# sourceMappingURL=module.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":";;;;;;;AAiBA,qBAqBa,mBAAmB;yCAAnB,mBAAmB;0CAAnB,mBAAmB;0CAAnB,mBAAmB;CAAI"}
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":";;;;;;;AAiBA,qBAsBa,mBAAmB;yCAAnB,mBAAmB;0CAAnB,mBAAmB;0CAAnB,mBAAmB;CAAI"}
package/dist/module.js CHANGED
@@ -2,7 +2,7 @@ import { NgModule } from '@angular/core';
2
2
  import { CommonModule } from '@angular/common';
3
3
  import { FormsModule, ReactiveFormsModule } from '@angular/forms';
4
4
  // MJ UI Components
5
- import { MJButtonDirective } from '@memberjunction/ng-ui-components';
5
+ import { MJButtonDirective, MJEmptyStateComponent } from '@memberjunction/ng-ui-components';
6
6
  // MemberJunction
7
7
  import { AITestHarnessModule } from '@memberjunction/ng-ai-test-harness';
8
8
  import { SharedGenericModule } from '@memberjunction/ng-shared-generic';
@@ -19,6 +19,7 @@ export class ActionGalleryModule {
19
19
  ], imports: [CommonModule,
20
20
  FormsModule,
21
21
  ReactiveFormsModule,
22
+ MJEmptyStateComponent,
22
23
  // MemberJunction
23
24
  AITestHarnessModule,
24
25
  SharedGenericModule] }); }
@@ -35,6 +36,7 @@ export class ActionGalleryModule {
35
36
  ReactiveFormsModule,
36
37
  // MJ UI
37
38
  MJButtonDirective,
39
+ MJEmptyStateComponent,
38
40
  // MemberJunction
39
41
  AITestHarnessModule,
40
42
  SharedGenericModule
@@ -52,6 +54,7 @@ export class ActionGalleryModule {
52
54
  ReactiveFormsModule,
53
55
  // MJ UI
54
56
  MJButtonDirective,
57
+ MJEmptyStateComponent,
55
58
  // MemberJunction
56
59
  AITestHarnessModule,
57
60
  SharedGenericModule], exports: [ActionGalleryComponent] }); })();
@@ -1 +1 @@
1
- {"version":3,"file":"module.js","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAElE,mBAAmB;AACnB,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAErE,iBAAiB;AACjB,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAExE,aAAa;AACb,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAExE,WAAW;AACX,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;;AAuBjF,MAAM,OAAO,mBAAmB;oHAAnB,mBAAmB;mEAAnB,mBAAmB;wEAJnB;YACT,0BAA0B;SAC3B,YAdC,YAAY;YACZ,WAAW;YACX,mBAAmB;YAGnB,iBAAiB;YACjB,mBAAmB;YACnB,mBAAmB;;iFASV,mBAAmB;cArB/B,QAAQ;eAAC;gBACR,YAAY,EAAE;oBACZ,sBAAsB;iBACvB;gBACD,OAAO,EAAE;oBACP,YAAY;oBACZ,WAAW;oBACX,mBAAmB;oBACnB,QAAQ;oBACR,iBAAiB;oBACjB,iBAAiB;oBACjB,mBAAmB;oBACnB,mBAAmB;iBACpB;gBACD,OAAO,EAAE;oBACP,sBAAsB;iBACvB;gBACD,SAAS,EAAE;oBACT,0BAA0B;iBAC3B;aACF;;wFACY,mBAAmB,mBAnB5B,sBAAsB,aAGtB,YAAY;QACZ,WAAW;QACX,mBAAmB;QACnB,QAAQ;QACR,iBAAiB;QACjB,iBAAiB;QACjB,mBAAmB;QACnB,mBAAmB,aAGnB,sBAAsB","sourcesContent":["import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\n\n// MJ UI Components\nimport { MJButtonDirective } from '@memberjunction/ng-ui-components';\n\n// MemberJunction\nimport { AITestHarnessModule } from '@memberjunction/ng-ai-test-harness';\nimport { SharedGenericModule } from '@memberjunction/ng-shared-generic';\n\n// Components\nimport { ActionGalleryComponent } from './lib/action-gallery.component';\n\n// Services\nimport { ActionGalleryDialogService } from './lib/action-gallery-dialog.service';\n\n@NgModule({\n declarations: [\n ActionGalleryComponent\n ],\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n // MJ UI\n MJButtonDirective,\n // MemberJunction\n AITestHarnessModule,\n SharedGenericModule\n ],\n exports: [\n ActionGalleryComponent\n ],\n providers: [\n ActionGalleryDialogService\n ]\n})\nexport class ActionGalleryModule { }"]}
1
+ {"version":3,"file":"module.js","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAElE,mBAAmB;AACnB,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAE5F,iBAAiB;AACjB,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAExE,aAAa;AACb,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAExE,WAAW;AACX,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;;AAwBjF,MAAM,OAAO,mBAAmB;oHAAnB,mBAAmB;mEAAnB,mBAAmB;wEAJnB;YACT,0BAA0B;SAC3B,YAfC,YAAY;YACZ,WAAW;YACX,mBAAmB;YAGnB,qBAAqB;YACrB,iBAAiB;YACjB,mBAAmB;YACnB,mBAAmB;;iFASV,mBAAmB;cAtB/B,QAAQ;eAAC;gBACR,YAAY,EAAE;oBACZ,sBAAsB;iBACvB;gBACD,OAAO,EAAE;oBACP,YAAY;oBACZ,WAAW;oBACX,mBAAmB;oBACnB,QAAQ;oBACR,iBAAiB;oBACjB,qBAAqB;oBACrB,iBAAiB;oBACjB,mBAAmB;oBACnB,mBAAmB;iBACpB;gBACD,OAAO,EAAE;oBACP,sBAAsB;iBACvB;gBACD,SAAS,EAAE;oBACT,0BAA0B;iBAC3B;aACF;;wFACY,mBAAmB,mBApB5B,sBAAsB,aAGtB,YAAY;QACZ,WAAW;QACX,mBAAmB;QACnB,QAAQ;QACR,iBAAiB;QACjB,qBAAqB;QACrB,iBAAiB;QACjB,mBAAmB;QACnB,mBAAmB,aAGnB,sBAAsB","sourcesContent":["import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\n\n// MJ UI Components\nimport { MJButtonDirective, MJEmptyStateComponent } from '@memberjunction/ng-ui-components';\n\n// MemberJunction\nimport { AITestHarnessModule } from '@memberjunction/ng-ai-test-harness';\nimport { SharedGenericModule } from '@memberjunction/ng-shared-generic';\n\n// Components\nimport { ActionGalleryComponent } from './lib/action-gallery.component';\n\n// Services\nimport { ActionGalleryDialogService } from './lib/action-gallery-dialog.service';\n\n@NgModule({\n declarations: [\n ActionGalleryComponent\n ],\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n // MJ UI\n MJButtonDirective,\n MJEmptyStateComponent,\n // MemberJunction\n AITestHarnessModule,\n SharedGenericModule\n ],\n exports: [\n ActionGalleryComponent\n ],\n providers: [\n ActionGalleryDialogService\n ]\n})\nexport class ActionGalleryModule { }"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memberjunction/ng-action-gallery",
3
- "version": "5.43.0",
3
+ "version": "5.45.0",
4
4
  "description": "MemberJunction Action Gallery - A beautiful, filterable gallery component for browsing and selecting actions",
5
5
  "main": "./dist/public-api.js",
6
6
  "typings": "./dist/public-api.d.ts",
@@ -33,13 +33,13 @@
33
33
  "@angular/animations": "21.1.3"
34
34
  },
35
35
  "dependencies": {
36
- "@memberjunction/core": "5.43.0",
37
- "@memberjunction/core-entities": "5.43.0",
38
- "@memberjunction/global": "5.43.0",
39
- "@memberjunction/ng-ai-test-harness": "5.43.0",
40
- "@memberjunction/ng-container-directives": "5.43.0",
41
- "@memberjunction/ng-shared-generic": "5.43.0",
42
- "@memberjunction/ng-ui-components": "5.43.0",
36
+ "@memberjunction/core": "5.45.0",
37
+ "@memberjunction/core-entities": "5.45.0",
38
+ "@memberjunction/global": "5.45.0",
39
+ "@memberjunction/ng-ai-test-harness": "5.45.0",
40
+ "@memberjunction/ng-container-directives": "5.45.0",
41
+ "@memberjunction/ng-shared-generic": "5.45.0",
42
+ "@memberjunction/ng-ui-components": "5.45.0",
43
43
  "rxjs": "^7.8.2",
44
44
  "tslib": "^2.8.1"
45
45
  },