@memberjunction/ng-scheduling 5.21.0 → 5.23.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.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/index.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ describe('@memberjunction/ng-scheduling', () => {
3
+ it('should have a passing test', () => {
4
+ expect(true).toBe(true);
5
+ });
6
+ });
7
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/__tests__/index.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE9C,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { describe, it, expect } from 'vitest';\n\ndescribe('@memberjunction/ng-scheduling', () => {\n it('should have a passing test', () => {\n expect(true).toBe(true);\n });\n});\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=scheduled-job-service.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduled-job-service.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/scheduled-job-service.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,142 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ /**
3
+ * Tests for ScheduledJobService caching, loading, and delegation logic.
4
+ */
5
+ vi.mock('@angular/core', () => ({
6
+ Injectable: () => (target) => target,
7
+ }));
8
+ // Shared mock for RunView.RunView method — we reassign per test
9
+ const mockRunViewMethod = vi.fn();
10
+ // Shared mock for entity Load
11
+ const mockEntityLoad = vi.fn().mockResolvedValue(true);
12
+ vi.mock('@memberjunction/core', () => ({
13
+ Metadata: function Metadata() {
14
+ return {
15
+ GetEntityObject: vi.fn().mockResolvedValue({
16
+ Load: mockEntityLoad,
17
+ ID: 'job-001',
18
+ Name: 'Test Job',
19
+ }),
20
+ };
21
+ },
22
+ RunView: function RunView() {
23
+ return { RunView: mockRunViewMethod };
24
+ },
25
+ }));
26
+ vi.mock('@memberjunction/core-entities', () => ({
27
+ MJScheduledJobEntity: class {
28
+ },
29
+ MJScheduledJobTypeEntity: class {
30
+ },
31
+ MJScheduledJobRunEntity: class {
32
+ },
33
+ }));
34
+ import { ScheduledJobService } from '../lib/services/scheduled-job.service';
35
+ describe('ScheduledJobService', () => {
36
+ let service;
37
+ beforeEach(() => {
38
+ vi.clearAllMocks();
39
+ mockEntityLoad.mockResolvedValue(true);
40
+ service = new ScheduledJobService();
41
+ });
42
+ describe('initial state', () => {
43
+ it('should have empty JobTypes initially', () => {
44
+ expect(service.JobTypes).toEqual([]);
45
+ });
46
+ });
47
+ describe('LoadJobTypes', () => {
48
+ it('should load job types from RunView on first call', async () => {
49
+ const mockTypes = [{ ID: 't1', Name: 'Type A' }, { ID: 't2', Name: 'Type B' }];
50
+ mockRunViewMethod.mockResolvedValue({ Success: true, Results: mockTypes });
51
+ const result = await service.LoadJobTypes();
52
+ expect(result).toEqual(mockTypes);
53
+ expect(service.JobTypes).toEqual(mockTypes);
54
+ expect(mockRunViewMethod).toHaveBeenCalledTimes(1);
55
+ });
56
+ it('should return cached data on subsequent calls without re-fetching', async () => {
57
+ const mockTypes = [{ ID: 't1', Name: 'Type A' }];
58
+ mockRunViewMethod.mockResolvedValue({ Success: true, Results: mockTypes });
59
+ await service.LoadJobTypes();
60
+ const result2 = await service.LoadJobTypes();
61
+ expect(result2).toEqual(mockTypes);
62
+ expect(mockRunViewMethod).toHaveBeenCalledTimes(1);
63
+ });
64
+ it('should deduplicate concurrent calls (promise sharing)', async () => {
65
+ const mockTypes = [{ ID: 't1', Name: 'Type A' }];
66
+ mockRunViewMethod.mockResolvedValue({ Success: true, Results: mockTypes });
67
+ const [r1, r2] = await Promise.all([service.LoadJobTypes(), service.LoadJobTypes()]);
68
+ expect(r1).toEqual(mockTypes);
69
+ expect(r2).toEqual(mockTypes);
70
+ expect(mockRunViewMethod).toHaveBeenCalledTimes(1);
71
+ });
72
+ it('should return empty array when RunView fails', async () => {
73
+ mockRunViewMethod.mockResolvedValue({ Success: false, Results: [] });
74
+ const result = await service.LoadJobTypes();
75
+ expect(result).toEqual([]);
76
+ });
77
+ it('should call RunView with correct params', async () => {
78
+ mockRunViewMethod.mockResolvedValue({ Success: true, Results: [] });
79
+ await service.LoadJobTypes();
80
+ expect(mockRunViewMethod).toHaveBeenCalledWith(expect.objectContaining({
81
+ EntityName: 'MJ: Scheduled Job Types',
82
+ OrderBy: 'Name',
83
+ ResultType: 'entity_object',
84
+ }));
85
+ });
86
+ });
87
+ describe('ClearCache', () => {
88
+ it('should clear cached job types', async () => {
89
+ mockRunViewMethod.mockResolvedValue({ Success: true, Results: [{ ID: 't1' }] });
90
+ await service.LoadJobTypes();
91
+ expect(service.JobTypes).toHaveLength(1);
92
+ service.ClearCache();
93
+ expect(service.JobTypes).toEqual([]);
94
+ });
95
+ it('should force re-fetch after clear', async () => {
96
+ mockRunViewMethod
97
+ .mockResolvedValueOnce({ Success: true, Results: [{ ID: 't1' }] })
98
+ .mockResolvedValueOnce({ Success: true, Results: [{ ID: 't1' }, { ID: 't2' }] });
99
+ await service.LoadJobTypes();
100
+ service.ClearCache();
101
+ await service.LoadJobTypes();
102
+ expect(service.JobTypes).toHaveLength(2);
103
+ expect(mockRunViewMethod).toHaveBeenCalledTimes(2);
104
+ });
105
+ });
106
+ describe('LoadJob', () => {
107
+ it('should load a single job by ID', async () => {
108
+ const result = await service.LoadJob('job-001');
109
+ expect(result).not.toBeNull();
110
+ });
111
+ it('should return null when job load fails', async () => {
112
+ mockEntityLoad.mockResolvedValueOnce(false);
113
+ const result = await service.LoadJob('nonexistent');
114
+ expect(result).toBeNull();
115
+ });
116
+ });
117
+ describe('LoadJobRuns', () => {
118
+ it('should load runs with correct filter and ordering', async () => {
119
+ const mockRuns = [{ ID: 'run-1' }, { ID: 'run-2' }];
120
+ mockRunViewMethod.mockResolvedValue({ Success: true, Results: mockRuns });
121
+ const result = await service.LoadJobRuns('job-001');
122
+ expect(result).toEqual(mockRuns);
123
+ expect(mockRunViewMethod).toHaveBeenCalledWith(expect.objectContaining({
124
+ EntityName: 'MJ: Scheduled Job Runs',
125
+ ExtraFilter: "ScheduledJobID='job-001'",
126
+ OrderBy: 'StartedAt DESC',
127
+ MaxRows: 10,
128
+ }));
129
+ });
130
+ it('should respect custom maxRows', async () => {
131
+ mockRunViewMethod.mockResolvedValue({ Success: true, Results: [] });
132
+ await service.LoadJobRuns('job-001', 25);
133
+ expect(mockRunViewMethod).toHaveBeenCalledWith(expect.objectContaining({ MaxRows: 25 }));
134
+ });
135
+ it('should return empty array on failure', async () => {
136
+ mockRunViewMethod.mockResolvedValue({ Success: false, Results: [] });
137
+ const result = await service.LoadJobRuns('job-001');
138
+ expect(result).toEqual([]);
139
+ });
140
+ });
141
+ });
142
+ //# sourceMappingURL=scheduled-job-service.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduled-job-service.test.js","sourceRoot":"","sources":["../../src/__tests__/scheduled-job-service.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, it, expect, vi, beforeEach } from 'vitest';\n\n/**\n * Tests for ScheduledJobService caching, loading, and delegation logic.\n */\n\nvi.mock('@angular/core', () => ({\n Injectable: () => (target: Function) => target,\n}));\n\n// Shared mock for RunView.RunView method — we reassign per test\nconst mockRunViewMethod = vi.fn();\n// Shared mock for entity Load\nconst mockEntityLoad = vi.fn().mockResolvedValue(true);\n\nvi.mock('@memberjunction/core', () => ({\n Metadata: function Metadata() {\n return {\n GetEntityObject: vi.fn().mockResolvedValue({\n Load: mockEntityLoad,\n ID: 'job-001',\n Name: 'Test Job',\n }),\n };\n },\n RunView: function RunView() {\n return { RunView: mockRunViewMethod };\n },\n}));\n\nvi.mock('@memberjunction/core-entities', () => ({\n MJScheduledJobEntity: class {},\n MJScheduledJobTypeEntity: class {},\n MJScheduledJobRunEntity: class {},\n}));\n\nimport { ScheduledJobService } from '../lib/services/scheduled-job.service';\n\ndescribe('ScheduledJobService', () => {\n let service: ScheduledJobService;\n\n beforeEach(() => {\n vi.clearAllMocks();\n mockEntityLoad.mockResolvedValue(true);\n service = new ScheduledJobService();\n });\n\n describe('initial state', () => {\n it('should have empty JobTypes initially', () => {\n expect(service.JobTypes).toEqual([]);\n });\n });\n\n describe('LoadJobTypes', () => {\n it('should load job types from RunView on first call', async () => {\n const mockTypes = [{ ID: 't1', Name: 'Type A' }, { ID: 't2', Name: 'Type B' }];\n mockRunViewMethod.mockResolvedValue({ Success: true, Results: mockTypes });\n\n const result = await service.LoadJobTypes();\n expect(result).toEqual(mockTypes);\n expect(service.JobTypes).toEqual(mockTypes);\n expect(mockRunViewMethod).toHaveBeenCalledTimes(1);\n });\n\n it('should return cached data on subsequent calls without re-fetching', async () => {\n const mockTypes = [{ ID: 't1', Name: 'Type A' }];\n mockRunViewMethod.mockResolvedValue({ Success: true, Results: mockTypes });\n\n await service.LoadJobTypes();\n const result2 = await service.LoadJobTypes();\n expect(result2).toEqual(mockTypes);\n expect(mockRunViewMethod).toHaveBeenCalledTimes(1);\n });\n\n it('should deduplicate concurrent calls (promise sharing)', async () => {\n const mockTypes = [{ ID: 't1', Name: 'Type A' }];\n mockRunViewMethod.mockResolvedValue({ Success: true, Results: mockTypes });\n\n const [r1, r2] = await Promise.all([service.LoadJobTypes(), service.LoadJobTypes()]);\n expect(r1).toEqual(mockTypes);\n expect(r2).toEqual(mockTypes);\n expect(mockRunViewMethod).toHaveBeenCalledTimes(1);\n });\n\n it('should return empty array when RunView fails', async () => {\n mockRunViewMethod.mockResolvedValue({ Success: false, Results: [] });\n const result = await service.LoadJobTypes();\n expect(result).toEqual([]);\n });\n\n it('should call RunView with correct params', async () => {\n mockRunViewMethod.mockResolvedValue({ Success: true, Results: [] });\n await service.LoadJobTypes();\n expect(mockRunViewMethod).toHaveBeenCalledWith(expect.objectContaining({\n EntityName: 'MJ: Scheduled Job Types',\n OrderBy: 'Name',\n ResultType: 'entity_object',\n }));\n });\n });\n\n describe('ClearCache', () => {\n it('should clear cached job types', async () => {\n mockRunViewMethod.mockResolvedValue({ Success: true, Results: [{ ID: 't1' }] });\n await service.LoadJobTypes();\n expect(service.JobTypes).toHaveLength(1);\n\n service.ClearCache();\n expect(service.JobTypes).toEqual([]);\n });\n\n it('should force re-fetch after clear', async () => {\n mockRunViewMethod\n .mockResolvedValueOnce({ Success: true, Results: [{ ID: 't1' }] })\n .mockResolvedValueOnce({ Success: true, Results: [{ ID: 't1' }, { ID: 't2' }] });\n\n await service.LoadJobTypes();\n service.ClearCache();\n await service.LoadJobTypes();\n\n expect(service.JobTypes).toHaveLength(2);\n expect(mockRunViewMethod).toHaveBeenCalledTimes(2);\n });\n });\n\n describe('LoadJob', () => {\n it('should load a single job by ID', async () => {\n const result = await service.LoadJob('job-001');\n expect(result).not.toBeNull();\n });\n\n it('should return null when job load fails', async () => {\n mockEntityLoad.mockResolvedValueOnce(false);\n const result = await service.LoadJob('nonexistent');\n expect(result).toBeNull();\n });\n });\n\n describe('LoadJobRuns', () => {\n it('should load runs with correct filter and ordering', async () => {\n const mockRuns = [{ ID: 'run-1' }, { ID: 'run-2' }];\n mockRunViewMethod.mockResolvedValue({ Success: true, Results: mockRuns });\n\n const result = await service.LoadJobRuns('job-001');\n expect(result).toEqual(mockRuns);\n expect(mockRunViewMethod).toHaveBeenCalledWith(expect.objectContaining({\n EntityName: 'MJ: Scheduled Job Runs',\n ExtraFilter: \"ScheduledJobID='job-001'\",\n OrderBy: 'StartedAt DESC',\n MaxRows: 10,\n }));\n });\n\n it('should respect custom maxRows', async () => {\n mockRunViewMethod.mockResolvedValue({ Success: true, Results: [] });\n await service.LoadJobRuns('job-001', 25);\n expect(mockRunViewMethod).toHaveBeenCalledWith(expect.objectContaining({ MaxRows: 25 }));\n });\n\n it('should return empty array on failure', async () => {\n mockRunViewMethod.mockResolvedValue({ Success: false, Results: [] });\n const result = await service.LoadJobRuns('job-001');\n expect(result).toEqual([]);\n });\n });\n});\n"]}
@@ -1,6 +1,6 @@
1
1
  import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, } from '@angular/core';
2
2
  import * as i0 from "@angular/core";
3
- import * as i1 from "@progress/kendo-angular-dialog";
3
+ import * as i1 from "@memberjunction/ng-ui-components";
4
4
  import * as i2 from "../panels/scheduled-job-editor/scheduled-job-editor.component";
5
5
  export class ScheduledJobDialogComponent {
6
6
  Visible = false;
@@ -25,7 +25,7 @@ export class ScheduledJobDialogComponent {
25
25
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ScheduledJobDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
26
26
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: ScheduledJobDialogComponent, isStandalone: false, selector: "mj-scheduled-job-dialog", inputs: { Visible: "Visible", ScheduledJobID: "ScheduledJobID", JobTypeID: "JobTypeID", DefaultConfiguration: "DefaultConfiguration", HideJobType: "HideJobType", Width: "Width" }, outputs: { Close: "Close" }, ngImport: i0, template: `
27
27
  @if (Visible) {
28
- <kendo-dialog [title]="DialogTitle" (close)="OnClose()" [width]="Width">
28
+ <mj-dialog [Visible]="true" [Title]="DialogTitle" (Close)="OnClose()" [Width]="Width">
29
29
  <mj-scheduled-job-editor
30
30
  [ScheduledJobID]="ScheduledJobID"
31
31
  [JobTypeID]="JobTypeID"
@@ -35,9 +35,9 @@ export class ScheduledJobDialogComponent {
35
35
  (Deleted)="OnDeleted($event)"
36
36
  (Cancelled)="OnClose()">
37
37
  </mj-scheduled-job-editor>
38
- </kendo-dialog>
38
+ </mj-dialog>
39
39
  }
40
- `, isInline: true, dependencies: [{ kind: "component", type: i1.DialogComponent, selector: "kendo-dialog", inputs: ["actions", "actionsLayout", "autoFocusedElement", "title", "width", "minWidth", "maxWidth", "height", "minHeight", "maxHeight", "animation", "themeColor"], outputs: ["action", "close"], exportAs: ["kendoDialog"] }, { kind: "component", type: i2.ScheduledJobEditorComponent, selector: "mj-scheduled-job-editor", inputs: ["ScheduledJobID", "JobTypeID", "DefaultConfiguration", "HideJobType"], outputs: ["Saved", "Deleted", "Cancelled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
40
+ `, isInline: true, dependencies: [{ kind: "component", type: i1.MJDialogComponent, selector: "mj-dialog", inputs: ["Visible", "Title", "Width", "Height", "Size", "Closeable", "MinWidth"], outputs: ["Close"] }, { kind: "component", type: i2.ScheduledJobEditorComponent, selector: "mj-scheduled-job-editor", inputs: ["ScheduledJobID", "JobTypeID", "DefaultConfiguration", "HideJobType"], outputs: ["Saved", "Deleted", "Cancelled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
41
41
  }
42
42
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ScheduledJobDialogComponent, decorators: [{
43
43
  type: Component,
@@ -46,7 +46,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
46
46
  standalone: false,
47
47
  template: `
48
48
  @if (Visible) {
49
- <kendo-dialog [title]="DialogTitle" (close)="OnClose()" [width]="Width">
49
+ <mj-dialog [Visible]="true" [Title]="DialogTitle" (Close)="OnClose()" [Width]="Width">
50
50
  <mj-scheduled-job-editor
51
51
  [ScheduledJobID]="ScheduledJobID"
52
52
  [JobTypeID]="JobTypeID"
@@ -56,7 +56,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
56
56
  (Deleted)="OnDeleted($event)"
57
57
  (Cancelled)="OnClose()">
58
58
  </mj-scheduled-job-editor>
59
- </kendo-dialog>
59
+ </mj-dialog>
60
60
  }
61
61
  `,
62
62
  changeDetection: ChangeDetectionStrategy.OnPush,
@@ -1 +1 @@
1
- {"version":3,"file":"scheduled-job-dialog.component.js","sourceRoot":"","sources":["../../../src/lib/dialogs/scheduled-job-dialog.component.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,SAAS,EACT,KAAK,EACL,MAAM,EACN,YAAY,EACZ,uBAAuB,GAC1B,MAAM,eAAe,CAAC;;;;AA8BvB,MAAM,OAAO,2BAA2B;IAC3B,OAAO,GAAG,KAAK,CAAC;IAChB,cAAc,GAAkB,IAAI,CAAC;IACrC,SAAS,GAAkB,IAAI,CAAC;IAChC,oBAAoB,GAAkB,IAAI,CAAC;IAC3C,WAAW,GAAG,KAAK,CAAC;IACpB,KAAK,GAAG,GAAG,CAAC;IAEX,KAAK,GAAG,IAAI,YAAY,EAA4B,CAAC;IAE/D,IAAW,WAAW;QAClB,OAAO,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,iBAAiB,CAAC;IACrE,CAAC;IAEM,OAAO;QACV,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACtC,CAAC;IAEM,OAAO,CAAC,GAAyB;QACpC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IAC/C,CAAC;IAEM,SAAS,CAAC,MAAc;QAC3B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC;uGAxBQ,2BAA2B;2FAA3B,2BAA2B,qSAjB1B;;;;;;;;;;;;;;KAcT;;2FAGQ,2BAA2B;kBApBvC,SAAS;mBAAC;oBACP,QAAQ,EAAE,yBAAyB;oBACnC,UAAU,EAAE,KAAK;oBACjB,QAAQ,EAAE;;;;;;;;;;;;;;KAcT;oBACD,eAAe,EAAE,uBAAuB,CAAC,MAAM;iBAClD;;sBAEI,KAAK;;sBACL,KAAK;;sBACL,KAAK;;sBACL,KAAK;;sBACL,KAAK;;sBACL,KAAK;;sBAEL,MAAM","sourcesContent":["import {\n Component,\n Input,\n Output,\n EventEmitter,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { MJScheduledJobEntity } from '@memberjunction/core-entities';\n\n/** Result emitted when the dialog closes */\nexport interface ScheduledJobDialogResult {\n Saved: boolean;\n Job?: MJScheduledJobEntity;\n Deleted?: boolean;\n}\n\n@Component({\n selector: 'mj-scheduled-job-dialog',\n standalone: false,\n template: `\n @if (Visible) {\n <kendo-dialog [title]=\"DialogTitle\" (close)=\"OnClose()\" [width]=\"Width\">\n <mj-scheduled-job-editor\n [ScheduledJobID]=\"ScheduledJobID\"\n [JobTypeID]=\"JobTypeID\"\n [DefaultConfiguration]=\"DefaultConfiguration\"\n [HideJobType]=\"HideJobType\"\n (Saved)=\"OnSaved($event)\"\n (Deleted)=\"OnDeleted($event)\"\n (Cancelled)=\"OnClose()\">\n </mj-scheduled-job-editor>\n </kendo-dialog>\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ScheduledJobDialogComponent {\n @Input() Visible = false;\n @Input() ScheduledJobID: string | null = null;\n @Input() JobTypeID: string | null = null;\n @Input() DefaultConfiguration: string | null = null;\n @Input() HideJobType = false;\n @Input() Width = 580;\n\n @Output() Close = new EventEmitter<ScheduledJobDialogResult>();\n\n public get DialogTitle(): string {\n return this.ScheduledJobID ? 'Edit Schedule' : 'Create Schedule';\n }\n\n public OnClose(): void {\n this.Close.emit({ Saved: false });\n }\n\n public OnSaved(job: MJScheduledJobEntity): void {\n this.Close.emit({ Saved: true, Job: job });\n }\n\n public OnDeleted(_jobID: string): void {\n this.Close.emit({ Saved: false, Deleted: true });\n }\n}\n"]}
1
+ {"version":3,"file":"scheduled-job-dialog.component.js","sourceRoot":"","sources":["../../../src/lib/dialogs/scheduled-job-dialog.component.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,SAAS,EACT,KAAK,EACL,MAAM,EACN,YAAY,EACZ,uBAAuB,GAC1B,MAAM,eAAe,CAAC;;;;AA8BvB,MAAM,OAAO,2BAA2B;IAC3B,OAAO,GAAG,KAAK,CAAC;IAChB,cAAc,GAAkB,IAAI,CAAC;IACrC,SAAS,GAAkB,IAAI,CAAC;IAChC,oBAAoB,GAAkB,IAAI,CAAC;IAC3C,WAAW,GAAG,KAAK,CAAC;IACpB,KAAK,GAAG,GAAG,CAAC;IAEX,KAAK,GAAG,IAAI,YAAY,EAA4B,CAAC;IAE/D,IAAW,WAAW;QAClB,OAAO,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,iBAAiB,CAAC;IACrE,CAAC;IAEM,OAAO;QACV,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACtC,CAAC;IAEM,OAAO,CAAC,GAAyB;QACpC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IAC/C,CAAC;IAEM,SAAS,CAAC,MAAc;QAC3B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC;uGAxBQ,2BAA2B;2FAA3B,2BAA2B,qSAjB1B;;;;;;;;;;;;;;KAcT;;2FAGQ,2BAA2B;kBApBvC,SAAS;mBAAC;oBACP,QAAQ,EAAE,yBAAyB;oBACnC,UAAU,EAAE,KAAK;oBACjB,QAAQ,EAAE;;;;;;;;;;;;;;KAcT;oBACD,eAAe,EAAE,uBAAuB,CAAC,MAAM;iBAClD;;sBAEI,KAAK;;sBACL,KAAK;;sBACL,KAAK;;sBACL,KAAK;;sBACL,KAAK;;sBACL,KAAK;;sBAEL,MAAM","sourcesContent":["import {\n Component,\n Input,\n Output,\n EventEmitter,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { MJScheduledJobEntity } from '@memberjunction/core-entities';\n\n/** Result emitted when the dialog closes */\nexport interface ScheduledJobDialogResult {\n Saved: boolean;\n Job?: MJScheduledJobEntity;\n Deleted?: boolean;\n}\n\n@Component({\n selector: 'mj-scheduled-job-dialog',\n standalone: false,\n template: `\n @if (Visible) {\n <mj-dialog [Visible]=\"true\" [Title]=\"DialogTitle\" (Close)=\"OnClose()\" [Width]=\"Width\">\n <mj-scheduled-job-editor\n [ScheduledJobID]=\"ScheduledJobID\"\n [JobTypeID]=\"JobTypeID\"\n [DefaultConfiguration]=\"DefaultConfiguration\"\n [HideJobType]=\"HideJobType\"\n (Saved)=\"OnSaved($event)\"\n (Deleted)=\"OnDeleted($event)\"\n (Cancelled)=\"OnClose()\">\n </mj-scheduled-job-editor>\n </mj-dialog>\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ScheduledJobDialogComponent {\n @Input() Visible = false;\n @Input() ScheduledJobID: string | null = null;\n @Input() JobTypeID: string | null = null;\n @Input() DefaultConfiguration: string | null = null;\n @Input() HideJobType = false;\n @Input() Width = 580;\n\n @Output() Close = new EventEmitter<ScheduledJobDialogResult>();\n\n public get DialogTitle(): string {\n return this.ScheduledJobID ? 'Edit Schedule' : 'Create Schedule';\n }\n\n public OnClose(): void {\n this.Close.emit({ Saved: false });\n }\n\n public OnSaved(job: MJScheduledJobEntity): void {\n this.Close.emit({ Saved: true, Job: job });\n }\n\n public OnDeleted(_jobID: string): void {\n this.Close.emit({ Saved: false, Deleted: true });\n }\n}\n"]}
@@ -5,12 +5,11 @@ import * as i3 from "./slide-panel/scheduled-job-slide-panel.component";
5
5
  import * as i4 from "./dialogs/scheduled-job-dialog.component";
6
6
  import * as i5 from "@angular/common";
7
7
  import * as i6 from "@angular/forms";
8
- import * as i7 from "@progress/kendo-angular-dialog";
9
- import * as i8 from "@progress/kendo-angular-buttons";
10
- import * as i9 from "@memberjunction/ng-shared-generic";
8
+ import * as i7 from "@memberjunction/ng-shared-generic";
9
+ import * as i8 from "@memberjunction/ng-ui-components";
11
10
  export declare class SchedulingModule {
12
11
  static ɵfac: i0.ɵɵFactoryDeclaration<SchedulingModule, never>;
13
- static ɵmod: i0.ɵɵNgModuleDeclaration<SchedulingModule, [typeof i1.ScheduledJobEditorComponent, typeof i2.ScheduledJobSummaryComponent, typeof i3.ScheduledJobSlidePanelComponent, typeof i4.ScheduledJobDialogComponent], [typeof i5.CommonModule, typeof i6.FormsModule, typeof i7.DialogModule, typeof i8.ButtonsModule, typeof i9.SharedGenericModule], [typeof i1.ScheduledJobEditorComponent, typeof i2.ScheduledJobSummaryComponent, typeof i3.ScheduledJobSlidePanelComponent, typeof i4.ScheduledJobDialogComponent]>;
12
+ static ɵmod: i0.ɵɵNgModuleDeclaration<SchedulingModule, [typeof i1.ScheduledJobEditorComponent, typeof i2.ScheduledJobSummaryComponent, typeof i3.ScheduledJobSlidePanelComponent, typeof i4.ScheduledJobDialogComponent], [typeof i5.CommonModule, typeof i6.FormsModule, typeof i7.SharedGenericModule, typeof i8.MJDialogComponent], [typeof i1.ScheduledJobEditorComponent, typeof i2.ScheduledJobSummaryComponent, typeof i3.ScheduledJobSlidePanelComponent, typeof i4.ScheduledJobDialogComponent]>;
14
13
  static ɵinj: i0.ɵɵInjectorDeclaration<SchedulingModule>;
15
14
  }
16
15
  //# sourceMappingURL=scheduling.module.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"scheduling.module.d.ts","sourceRoot":"","sources":["../../src/lib/scheduling.module.ts"],"names":[],"mappings":";;;;;;;;;;AAYA,qBAqBa,gBAAgB;yCAAhB,gBAAgB;0CAAhB,gBAAgB;0CAAhB,gBAAgB;CAAG"}
1
+ {"version":3,"file":"scheduling.module.d.ts","sourceRoot":"","sources":["../../src/lib/scheduling.module.ts"],"names":[],"mappings":";;;;;;;;;AAWA,qBAoBa,gBAAgB;yCAAhB,gBAAgB;0CAAhB,gBAAgB;0CAAhB,gBAAgB;CAAG"}
@@ -1,9 +1,8 @@
1
1
  import { NgModule } from '@angular/core';
2
2
  import { CommonModule } from '@angular/common';
3
3
  import { FormsModule } from '@angular/forms';
4
- import { DialogModule } from '@progress/kendo-angular-dialog';
5
- import { ButtonsModule } from '@progress/kendo-angular-buttons';
6
4
  import { SharedGenericModule } from '@memberjunction/ng-shared-generic';
5
+ import { MJDialogComponent } from '@memberjunction/ng-ui-components';
7
6
  import { ScheduledJobEditorComponent } from './panels/scheduled-job-editor/scheduled-job-editor.component';
8
7
  import { ScheduledJobSummaryComponent } from './panels/scheduled-job-summary/scheduled-job-summary.component';
9
8
  import { ScheduledJobSlidePanelComponent } from './slide-panel/scheduled-job-slide-panel.component';
@@ -16,17 +15,15 @@ export class SchedulingModule {
16
15
  ScheduledJobSlidePanelComponent,
17
16
  ScheduledJobDialogComponent], imports: [CommonModule,
18
17
  FormsModule,
19
- DialogModule,
20
- ButtonsModule,
21
- SharedGenericModule], exports: [ScheduledJobEditorComponent,
18
+ SharedGenericModule,
19
+ MJDialogComponent], exports: [ScheduledJobEditorComponent,
22
20
  ScheduledJobSummaryComponent,
23
21
  ScheduledJobSlidePanelComponent,
24
22
  ScheduledJobDialogComponent] });
25
23
  static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: SchedulingModule, imports: [CommonModule,
26
24
  FormsModule,
27
- DialogModule,
28
- ButtonsModule,
29
- SharedGenericModule] });
25
+ SharedGenericModule,
26
+ MJDialogComponent] });
30
27
  }
31
28
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: SchedulingModule, decorators: [{
32
29
  type: NgModule,
@@ -40,9 +37,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
40
37
  imports: [
41
38
  CommonModule,
42
39
  FormsModule,
43
- DialogModule,
44
- ButtonsModule,
45
40
  SharedGenericModule,
41
+ MJDialogComponent,
46
42
  ],
47
43
  exports: [
48
44
  ScheduledJobEditorComponent,
@@ -1 +1 @@
1
- {"version":3,"file":"scheduling.module.js","sourceRoot":"","sources":["../../src/lib/scheduling.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,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAExE,OAAO,EAAE,2BAA2B,EAAE,MAAM,8DAA8D,CAAC;AAC3G,OAAO,EAAE,4BAA4B,EAAE,MAAM,gEAAgE,CAAC;AAC9G,OAAO,EAAE,+BAA+B,EAAE,MAAM,mDAAmD,CAAC;AACpG,OAAO,EAAE,2BAA2B,EAAE,MAAM,0CAA0C,CAAC;;AAuBvF,MAAM,OAAO,gBAAgB;uGAAhB,gBAAgB;wGAAhB,gBAAgB,iBAnBrB,2BAA2B;YAC3B,4BAA4B;YAC5B,+BAA+B;YAC/B,2BAA2B,aAG3B,YAAY;YACZ,WAAW;YACX,YAAY;YACZ,aAAa;YACb,mBAAmB,aAGnB,2BAA2B;YAC3B,4BAA4B;YAC5B,+BAA+B;YAC/B,2BAA2B;wGAGtB,gBAAgB,YAbrB,YAAY;YACZ,WAAW;YACX,YAAY;YACZ,aAAa;YACb,mBAAmB;;2FASd,gBAAgB;kBArB5B,QAAQ;mBAAC;oBACN,YAAY,EAAE;wBACV,2BAA2B;wBAC3B,4BAA4B;wBAC5B,+BAA+B;wBAC/B,2BAA2B;qBAC9B;oBACD,OAAO,EAAE;wBACL,YAAY;wBACZ,WAAW;wBACX,YAAY;wBACZ,aAAa;wBACb,mBAAmB;qBACtB;oBACD,OAAO,EAAE;wBACL,2BAA2B;wBAC3B,4BAA4B;wBAC5B,+BAA+B;wBAC/B,2BAA2B;qBAC9B;iBACJ","sourcesContent":["import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { DialogModule } from '@progress/kendo-angular-dialog';\nimport { ButtonsModule } from '@progress/kendo-angular-buttons';\nimport { SharedGenericModule } from '@memberjunction/ng-shared-generic';\n\nimport { ScheduledJobEditorComponent } from './panels/scheduled-job-editor/scheduled-job-editor.component';\nimport { ScheduledJobSummaryComponent } from './panels/scheduled-job-summary/scheduled-job-summary.component';\nimport { ScheduledJobSlidePanelComponent } from './slide-panel/scheduled-job-slide-panel.component';\nimport { ScheduledJobDialogComponent } from './dialogs/scheduled-job-dialog.component';\n\n@NgModule({\n declarations: [\n ScheduledJobEditorComponent,\n ScheduledJobSummaryComponent,\n ScheduledJobSlidePanelComponent,\n ScheduledJobDialogComponent,\n ],\n imports: [\n CommonModule,\n FormsModule,\n DialogModule,\n ButtonsModule,\n SharedGenericModule,\n ],\n exports: [\n ScheduledJobEditorComponent,\n ScheduledJobSummaryComponent,\n ScheduledJobSlidePanelComponent,\n ScheduledJobDialogComponent,\n ],\n})\nexport class SchedulingModule {}\n"]}
1
+ {"version":3,"file":"scheduling.module.js","sourceRoot":"","sources":["../../src/lib/scheduling.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,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAErE,OAAO,EAAE,2BAA2B,EAAE,MAAM,8DAA8D,CAAC;AAC3G,OAAO,EAAE,4BAA4B,EAAE,MAAM,gEAAgE,CAAC;AAC9G,OAAO,EAAE,+BAA+B,EAAE,MAAM,mDAAmD,CAAC;AACpG,OAAO,EAAE,2BAA2B,EAAE,MAAM,0CAA0C,CAAC;;AAsBvF,MAAM,OAAO,gBAAgB;uGAAhB,gBAAgB;wGAAhB,gBAAgB,iBAlBrB,2BAA2B;YAC3B,4BAA4B;YAC5B,+BAA+B;YAC/B,2BAA2B,aAG3B,YAAY;YACZ,WAAW;YACX,mBAAmB;YACnB,iBAAiB,aAGjB,2BAA2B;YAC3B,4BAA4B;YAC5B,+BAA+B;YAC/B,2BAA2B;wGAGtB,gBAAgB,YAZrB,YAAY;YACZ,WAAW;YACX,mBAAmB;YACnB,iBAAiB;;2FASZ,gBAAgB;kBApB5B,QAAQ;mBAAC;oBACN,YAAY,EAAE;wBACV,2BAA2B;wBAC3B,4BAA4B;wBAC5B,+BAA+B;wBAC/B,2BAA2B;qBAC9B;oBACD,OAAO,EAAE;wBACL,YAAY;wBACZ,WAAW;wBACX,mBAAmB;wBACnB,iBAAiB;qBACpB;oBACD,OAAO,EAAE;wBACL,2BAA2B;wBAC3B,4BAA4B;wBAC5B,+BAA+B;wBAC/B,2BAA2B;qBAC9B;iBACJ","sourcesContent":["import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { SharedGenericModule } from '@memberjunction/ng-shared-generic';\nimport { MJDialogComponent } from '@memberjunction/ng-ui-components';\n\nimport { ScheduledJobEditorComponent } from './panels/scheduled-job-editor/scheduled-job-editor.component';\nimport { ScheduledJobSummaryComponent } from './panels/scheduled-job-summary/scheduled-job-summary.component';\nimport { ScheduledJobSlidePanelComponent } from './slide-panel/scheduled-job-slide-panel.component';\nimport { ScheduledJobDialogComponent } from './dialogs/scheduled-job-dialog.component';\n\n@NgModule({\n declarations: [\n ScheduledJobEditorComponent,\n ScheduledJobSummaryComponent,\n ScheduledJobSlidePanelComponent,\n ScheduledJobDialogComponent,\n ],\n imports: [\n CommonModule,\n FormsModule,\n SharedGenericModule,\n MJDialogComponent,\n ],\n exports: [\n ScheduledJobEditorComponent,\n ScheduledJobSummaryComponent,\n ScheduledJobSlidePanelComponent,\n ScheduledJobDialogComponent,\n ],\n})\nexport class SchedulingModule {}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memberjunction/ng-scheduling",
3
- "version": "5.21.0",
3
+ "version": "5.23.0",
4
4
  "description": "MemberJunction: Reusable Angular components for viewing and editing Scheduled Jobs - panels, slide-in, dialog, and service",
5
5
  "main": "./dist/public-api.js",
6
6
  "typings": "./dist/public-api.d.ts",
@@ -8,7 +8,7 @@
8
8
  "/dist"
9
9
  ],
10
10
  "scripts": {
11
- "test": "echo \"No tests configured yet\"",
11
+ "test": "vitest run",
12
12
  "build": "ngc",
13
13
  "test:watch": "vitest"
14
14
  },
@@ -28,16 +28,15 @@
28
28
  "peerDependencies": {
29
29
  "@angular/common": "21.1.3",
30
30
  "@angular/core": "21.1.3",
31
- "@angular/forms": "21.1.3",
32
- "@progress/kendo-angular-dialog": "22.0.1",
33
- "@progress/kendo-angular-buttons": "22.0.1"
31
+ "@angular/forms": "21.1.3"
34
32
  },
35
33
  "dependencies": {
36
- "@memberjunction/core": "5.21.0",
37
- "@memberjunction/core-entities": "5.21.0",
38
- "@memberjunction/global": "5.21.0",
39
- "@memberjunction/ng-notifications": "5.21.0",
40
- "@memberjunction/ng-shared-generic": "5.21.0",
34
+ "@memberjunction/core": "5.23.0",
35
+ "@memberjunction/core-entities": "5.23.0",
36
+ "@memberjunction/global": "5.23.0",
37
+ "@memberjunction/ng-notifications": "5.23.0",
38
+ "@memberjunction/ng-shared-generic": "5.23.0",
39
+ "@memberjunction/ng-ui-components": "5.23.0",
41
40
  "tslib": "^2.8.1",
42
41
  "rxjs": "^7.8.2"
43
42
  },