@memberjunction/ng-action-gallery 5.43.0 → 5.44.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.
- package/dist/lib/action-gallery.component.d.ts.map +1 -1
- package/dist/lib/action-gallery.component.dom.test.d.ts +2 -0
- package/dist/lib/action-gallery.component.dom.test.d.ts.map +1 -0
- package/dist/lib/action-gallery.component.dom.test.js +138 -0
- package/dist/lib/action-gallery.component.dom.test.js.map +1 -0
- package/dist/lib/action-gallery.component.js +73 -78
- package/dist/lib/action-gallery.component.js.map +1 -1
- package/dist/module.d.ts +1 -1
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +4 -1
- package/dist/module.js.map +1 -1
- package/package.json +8 -8
|
@@ -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;
|
|
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 @@
|
|
|
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, "
|
|
136
|
-
i0.ɵɵ
|
|
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",
|
|
150
|
-
i0.ɵɵelement(1, "i",
|
|
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",
|
|
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",
|
|
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",
|
|
167
|
-
i0.ɵɵelement(1, "i",
|
|
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",
|
|
177
|
-
i0.ɵɵelement(1, "i",
|
|
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",
|
|
187
|
-
i0.ɵɵelement(1, "i",
|
|
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",
|
|
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",
|
|
192
|
+
i0.ɵɵelementStart(0, "div", 61)(1, "span", 62);
|
|
202
193
|
i0.ɵɵtext(2);
|
|
203
194
|
i0.ɵɵelementEnd();
|
|
204
|
-
i0.ɵɵelementStart(3, "span",
|
|
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",
|
|
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",
|
|
220
|
-
i0.ɵɵelement(2, "i",
|
|
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",
|
|
224
|
-
i0.ɵɵrepeaterCreate(5, ActionGalleryComponent_Conditional_10_For_2_Conditional_19_Conditional_1_For_6_Template, 6, 3, "div",
|
|
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",
|
|
223
|
+
i0.ɵɵelementStart(0, "div", 66)(1, "span", 67);
|
|
233
224
|
i0.ɵɵtext(2);
|
|
234
225
|
i0.ɵɵelementEnd();
|
|
235
|
-
i0.ɵɵelementStart(3, "span",
|
|
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",
|
|
247
|
-
i0.ɵɵelement(2, "i",
|
|
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",
|
|
251
|
-
i0.ɵɵrepeaterCreate(5, ActionGalleryComponent_Conditional_10_For_2_Conditional_19_Conditional_2_For_6_Template, 5, 2, "div",
|
|
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",
|
|
260
|
-
i0.ɵɵconditionalCreate(1, ActionGalleryComponent_Conditional_10_For_2_Conditional_19_Conditional_1_Template, 7, 0, "div",
|
|
261
|
-
i0.ɵɵconditionalCreate(2, ActionGalleryComponent_Conditional_10_For_2_Conditional_19_Conditional_2_Template, 7, 0, "div",
|
|
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",
|
|
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",
|
|
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",
|
|
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",
|
|
276
|
+
i0.ɵɵelementStart(2, "div", 39);
|
|
286
277
|
i0.ɵɵelement(3, "i");
|
|
287
278
|
i0.ɵɵelementEnd();
|
|
288
|
-
i0.ɵɵelementStart(4, "div",
|
|
279
|
+
i0.ɵɵelementStart(4, "div", 40)(5, "h3", 41);
|
|
289
280
|
i0.ɵɵtext(6);
|
|
290
281
|
i0.ɵɵelementEnd();
|
|
291
|
-
i0.ɵɵelementStart(7, "div",
|
|
292
|
-
i0.ɵɵconditionalCreate(8, ActionGalleryComponent_Conditional_10_For_2_Conditional_8_Template, 3, 1, "span",
|
|
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",
|
|
295
|
-
i0.ɵɵconditionalCreate(10, ActionGalleryComponent_Conditional_10_For_2_Conditional_10_Template, 2, 0, "button",
|
|
296
|
-
i0.ɵɵelement(11, "i",
|
|
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",
|
|
289
|
+
i0.ɵɵelementStart(12, "div", 47)(13, "p", 48);
|
|
299
290
|
i0.ɵɵtext(14);
|
|
300
291
|
i0.ɵɵelementEnd();
|
|
301
|
-
i0.ɵɵelementStart(15, "div",
|
|
302
|
-
i0.ɵɵconditionalCreate(16, ActionGalleryComponent_Conditional_10_For_2_Conditional_16_Template, 3, 1, "span",
|
|
303
|
-
i0.ɵɵconditionalCreate(17, ActionGalleryComponent_Conditional_10_For_2_Conditional_17_Template, 3, 1, "span",
|
|
304
|
-
i0.ɵɵconditionalCreate(18, ActionGalleryComponent_Conditional_10_For_2_Conditional_18_Template, 3, 1, "span",
|
|
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",
|
|
307
|
-
i0.ɵɵconditionalCreate(20, ActionGalleryComponent_Conditional_10_For_2_Conditional_20_Template, 2, 4, "div",
|
|
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",
|
|
338
|
-
i0.ɵɵrepeaterCreate(1, ActionGalleryComponent_Conditional_10_For_2_Template, 21, 24, "div",
|
|
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",
|
|
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",
|
|
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",
|
|
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",
|
|
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",
|
|
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",
|
|
362
|
+
i0.ɵɵelementStart(4, "span", 71);
|
|
372
363
|
i0.ɵɵtext(5);
|
|
373
364
|
i0.ɵɵelementEnd();
|
|
374
|
-
i0.ɵɵelementStart(6, "span",
|
|
365
|
+
i0.ɵɵelementStart(6, "span", 72);
|
|
375
366
|
i0.ɵɵtext(7);
|
|
376
367
|
i0.ɵɵelementEnd();
|
|
377
|
-
i0.ɵɵelementStart(8, "span",
|
|
368
|
+
i0.ɵɵelementStart(8, "span", 73);
|
|
378
369
|
i0.ɵɵtext(9);
|
|
379
370
|
i0.ɵɵelementEnd();
|
|
380
|
-
i0.ɵɵelementStart(10, "span",
|
|
381
|
-
i0.ɵɵconditionalCreate(11, ActionGalleryComponent_Conditional_15_For_13_Conditional_11_Template, 2, 0, "button",
|
|
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",
|
|
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",
|
|
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",
|
|
399
|
+
i0.ɵɵelementStart(4, "span", 71);
|
|
409
400
|
i0.ɵɵtext(5, "Category");
|
|
410
401
|
i0.ɵɵelementEnd();
|
|
411
|
-
i0.ɵɵelementStart(6, "span",
|
|
402
|
+
i0.ɵɵelementStart(6, "span", 72);
|
|
412
403
|
i0.ɵɵtext(7, "Type");
|
|
413
404
|
i0.ɵɵelementEnd();
|
|
414
|
-
i0.ɵɵelementStart(8, "span",
|
|
405
|
+
i0.ɵɵelementStart(8, "span", 73);
|
|
415
406
|
i0.ɵɵtext(9, "Parameters");
|
|
416
407
|
i0.ɵɵelementEnd();
|
|
417
|
-
i0.ɵɵelementStart(10, "span",
|
|
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",
|
|
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"], [
|
|
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,
|
|
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
|
package/dist/module.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":";;;;;;;AAiBA,
|
|
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] }); })();
|
package/dist/module.js.map
CHANGED
|
@@ -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;
|
|
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.
|
|
3
|
+
"version": "5.44.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.
|
|
37
|
-
"@memberjunction/core-entities": "5.
|
|
38
|
-
"@memberjunction/global": "5.
|
|
39
|
-
"@memberjunction/ng-ai-test-harness": "5.
|
|
40
|
-
"@memberjunction/ng-container-directives": "5.
|
|
41
|
-
"@memberjunction/ng-shared-generic": "5.
|
|
42
|
-
"@memberjunction/ng-ui-components": "5.
|
|
36
|
+
"@memberjunction/core": "5.44.0",
|
|
37
|
+
"@memberjunction/core-entities": "5.44.0",
|
|
38
|
+
"@memberjunction/global": "5.44.0",
|
|
39
|
+
"@memberjunction/ng-ai-test-harness": "5.44.0",
|
|
40
|
+
"@memberjunction/ng-container-directives": "5.44.0",
|
|
41
|
+
"@memberjunction/ng-shared-generic": "5.44.0",
|
|
42
|
+
"@memberjunction/ng-ui-components": "5.44.0",
|
|
43
43
|
"rxjs": "^7.8.2",
|
|
44
44
|
"tslib": "^2.8.1"
|
|
45
45
|
},
|