@mj-biz-apps/tasks-entities 0.0.1 → 1.0.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/custom/TaskDependencyEntitySubclass.d.ts +28 -0
- package/dist/custom/TaskDependencyEntitySubclass.d.ts.map +1 -0
- package/dist/custom/TaskDependencyEntitySubclass.js +87 -0
- package/dist/custom/TaskDependencyEntitySubclass.js.map +1 -0
- package/dist/custom/TaskEntitySubclass.d.ts +17 -0
- package/dist/custom/TaskEntitySubclass.d.ts.map +1 -0
- package/dist/custom/TaskEntitySubclass.js +70 -0
- package/dist/custom/TaskEntitySubclass.js.map +1 -0
- package/dist/generated/entity_subclasses.d.ts +2502 -0
- package/dist/generated/entity_subclasses.d.ts.map +1 -0
- package/dist/generated/entity_subclasses.js +3547 -0
- package/dist/generated/entity_subclasses.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/package.json +29 -7
- package/README.md +0 -45
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { BaseEntity, ValidationResult } from "@memberjunction/core";
|
|
2
|
+
/**
|
|
3
|
+
* Custom entity subclass for MJ_BizApps_Tasks: Task Dependencies.
|
|
4
|
+
* Prevents circular dependencies by walking the dependency graph
|
|
5
|
+
* before allowing a save.
|
|
6
|
+
*
|
|
7
|
+
* Registered with priority 1 to override the CodeGen-generated base class.
|
|
8
|
+
*/
|
|
9
|
+
export declare class TaskDependencyEntity extends BaseEntity {
|
|
10
|
+
Validate(): ValidationResult;
|
|
11
|
+
/**
|
|
12
|
+
* Redundant safety check (also enforced by DB CHECK constraint).
|
|
13
|
+
*/
|
|
14
|
+
private validateNoSelfReference;
|
|
15
|
+
/**
|
|
16
|
+
* Async validation: walk the dependency graph starting from DependsOnTaskID
|
|
17
|
+
* and check whether we eventually reach TaskID (which would create a cycle).
|
|
18
|
+
*/
|
|
19
|
+
ValidateAsync(): Promise<ValidationResult>;
|
|
20
|
+
/**
|
|
21
|
+
* BFS/iterative walk of the dependency graph to detect cycles.
|
|
22
|
+
*
|
|
23
|
+
* Starting from `DependsOnTaskID`, follow all outgoing DependsOnTaskID edges.
|
|
24
|
+
* If we reach `TaskID`, saving this row would create a cycle → reject.
|
|
25
|
+
*/
|
|
26
|
+
private validateNoCycle;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=TaskDependencyEntitySubclass.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TaskDependencyEntitySubclass.d.ts","sourceRoot":"","sources":["../../src/custom/TaskDependencyEntitySubclass.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAqB,gBAAgB,EAA4C,MAAM,sBAAsB,CAAC;AAGjI;;;;;;GAMG;AACH,qBACa,oBAAqB,SAAQ,UAAU;IAEhC,QAAQ,IAAI,gBAAgB;IAS5C;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAa/B;;;OAGG;IACmB,aAAa,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAShE;;;;;OAKG;YACW,eAAe;CAwChC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { BaseEntity, RunView, ValidationErrorInfo, ValidationErrorType } from "@memberjunction/core";
|
|
8
|
+
import { RegisterClass } from "@memberjunction/global";
|
|
9
|
+
/**
|
|
10
|
+
* Custom entity subclass for MJ_BizApps_Tasks: Task Dependencies.
|
|
11
|
+
* Prevents circular dependencies by walking the dependency graph
|
|
12
|
+
* before allowing a save.
|
|
13
|
+
*
|
|
14
|
+
* Registered with priority 1 to override the CodeGen-generated base class.
|
|
15
|
+
*/
|
|
16
|
+
let TaskDependencyEntity = class TaskDependencyEntity extends BaseEntity {
|
|
17
|
+
Validate() {
|
|
18
|
+
const result = super.Validate();
|
|
19
|
+
this.validateNoSelfReference(result);
|
|
20
|
+
result.Success = result.Success && result.Errors.length === 0;
|
|
21
|
+
return result;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Redundant safety check (also enforced by DB CHECK constraint).
|
|
25
|
+
*/
|
|
26
|
+
validateNoSelfReference(result) {
|
|
27
|
+
const taskID = this.Get('TaskID');
|
|
28
|
+
const dependsOnTaskID = this.Get('DependsOnTaskID');
|
|
29
|
+
if (taskID && dependsOnTaskID && taskID === dependsOnTaskID) {
|
|
30
|
+
result.Errors.push(new ValidationErrorInfo('DependsOnTaskID', 'A task cannot depend on itself.', dependsOnTaskID, ValidationErrorType.Failure));
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Async validation: walk the dependency graph starting from DependsOnTaskID
|
|
35
|
+
* and check whether we eventually reach TaskID (which would create a cycle).
|
|
36
|
+
*/
|
|
37
|
+
async ValidateAsync() {
|
|
38
|
+
const result = await super.ValidateAsync();
|
|
39
|
+
await this.validateNoCycle(result);
|
|
40
|
+
result.Success = result.Success && result.Errors.length === 0;
|
|
41
|
+
return result;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* BFS/iterative walk of the dependency graph to detect cycles.
|
|
45
|
+
*
|
|
46
|
+
* Starting from `DependsOnTaskID`, follow all outgoing DependsOnTaskID edges.
|
|
47
|
+
* If we reach `TaskID`, saving this row would create a cycle → reject.
|
|
48
|
+
*/
|
|
49
|
+
async validateNoCycle(result) {
|
|
50
|
+
const taskID = this.Get('TaskID');
|
|
51
|
+
const dependsOnTaskID = this.Get('DependsOnTaskID');
|
|
52
|
+
if (!taskID || !dependsOnTaskID)
|
|
53
|
+
return;
|
|
54
|
+
const visited = new Set();
|
|
55
|
+
const queue = [dependsOnTaskID];
|
|
56
|
+
while (queue.length > 0) {
|
|
57
|
+
const current = queue.shift();
|
|
58
|
+
if (current === taskID) {
|
|
59
|
+
result.Errors.push(new ValidationErrorInfo('DependsOnTaskID', 'This dependency would create a circular reference.', dependsOnTaskID, ValidationErrorType.Failure));
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
if (visited.has(current))
|
|
63
|
+
continue;
|
|
64
|
+
visited.add(current);
|
|
65
|
+
// Load all tasks that `current` depends on
|
|
66
|
+
const rv = new RunView();
|
|
67
|
+
const upstream = await rv.RunView({
|
|
68
|
+
EntityName: 'MJ_BizApps_Tasks: Task Dependencies',
|
|
69
|
+
ExtraFilter: `TaskID = '${current}'`,
|
|
70
|
+
ResultType: 'simple',
|
|
71
|
+
});
|
|
72
|
+
if (upstream?.Results) {
|
|
73
|
+
for (const dep of upstream.Results) {
|
|
74
|
+
const upstreamID = dep.DependsOnTaskID;
|
|
75
|
+
if (upstreamID && !visited.has(upstreamID)) {
|
|
76
|
+
queue.push(upstreamID);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
TaskDependencyEntity = __decorate([
|
|
84
|
+
RegisterClass(BaseEntity, 'MJ_BizApps_Tasks: Task Dependencies', 1)
|
|
85
|
+
], TaskDependencyEntity);
|
|
86
|
+
export { TaskDependencyEntity };
|
|
87
|
+
//# sourceMappingURL=TaskDependencyEntitySubclass.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TaskDependencyEntitySubclass.js","sourceRoot":"","sources":["../../src/custom/TaskDependencyEntitySubclass.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { BaseEntity, ValidationResult } from "@memberjunction/core";
|
|
2
|
+
/**
|
|
3
|
+
* Custom entity subclass for MJ_BizApps_Tasks: Tasks.
|
|
4
|
+
*
|
|
5
|
+
* Client-safe logic ONLY: field validation and in-record status-transition
|
|
6
|
+
* side-effects (StartedAt/CompletedAt/PercentComplete). Server-only side-effects
|
|
7
|
+
* (activity logging, sub-task rollup) live in TaskEntityServer.
|
|
8
|
+
*
|
|
9
|
+
* Registered with priority 1 to override the CodeGen-generated base class (priority 0).
|
|
10
|
+
*/
|
|
11
|
+
export declare class TaskEntity extends BaseEntity {
|
|
12
|
+
Validate(): ValidationResult;
|
|
13
|
+
private validatePercentComplete;
|
|
14
|
+
private validateDueAfterStart;
|
|
15
|
+
private applyStatusTransitionSideEffects;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=TaskEntitySubclass.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TaskEntitySubclass.d.ts","sourceRoot":"","sources":["../../src/custom/TaskEntitySubclass.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAA4C,MAAM,sBAAsB,CAAC;AAG9G;;;;;;;;GAQG;AACH,qBACa,UAAW,SAAQ,UAAU;IAMtB,QAAQ,IAAI,gBAAgB;IAW5C,OAAO,CAAC,uBAAuB;IAY/B,OAAO,CAAC,qBAAqB;IAiB7B,OAAO,CAAC,gCAAgC;CA4B3C"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { BaseEntity, ValidationErrorInfo, ValidationErrorType } from "@memberjunction/core";
|
|
8
|
+
import { RegisterClass } from "@memberjunction/global";
|
|
9
|
+
/**
|
|
10
|
+
* Custom entity subclass for MJ_BizApps_Tasks: Tasks.
|
|
11
|
+
*
|
|
12
|
+
* Client-safe logic ONLY: field validation and in-record status-transition
|
|
13
|
+
* side-effects (StartedAt/CompletedAt/PercentComplete). Server-only side-effects
|
|
14
|
+
* (activity logging, sub-task rollup) live in TaskEntityServer.
|
|
15
|
+
*
|
|
16
|
+
* Registered with priority 1 to override the CodeGen-generated base class (priority 0).
|
|
17
|
+
*/
|
|
18
|
+
let TaskEntity = class TaskEntity extends BaseEntity {
|
|
19
|
+
// ---------------------------------------------------------------
|
|
20
|
+
// Validation
|
|
21
|
+
// ---------------------------------------------------------------
|
|
22
|
+
Validate() {
|
|
23
|
+
const result = super.Validate();
|
|
24
|
+
this.validatePercentComplete(result);
|
|
25
|
+
this.validateDueAfterStart(result);
|
|
26
|
+
this.applyStatusTransitionSideEffects();
|
|
27
|
+
result.Success = result.Success && result.Errors.length === 0;
|
|
28
|
+
return result;
|
|
29
|
+
}
|
|
30
|
+
validatePercentComplete(result) {
|
|
31
|
+
const pct = this.Get('PercentComplete');
|
|
32
|
+
if (pct != null && (pct < 0 || pct > 100)) {
|
|
33
|
+
result.Errors.push(new ValidationErrorInfo('PercentComplete', 'Percent complete must be between 0 and 100.', pct, ValidationErrorType.Failure));
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
validateDueAfterStart(result) {
|
|
37
|
+
const startedAt = this.Get('StartedAt');
|
|
38
|
+
const dueAt = this.Get('DueAt');
|
|
39
|
+
if (startedAt && dueAt && dueAt <= startedAt) {
|
|
40
|
+
result.Errors.push(new ValidationErrorInfo('DueAt', 'Due date must be after the start date.', dueAt, ValidationErrorType.Failure));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// ---------------------------------------------------------------
|
|
44
|
+
// Status transition side-effects
|
|
45
|
+
// ---------------------------------------------------------------
|
|
46
|
+
applyStatusTransitionSideEffects() {
|
|
47
|
+
const statusField = this.Fields.find(f => f.CodeName === 'Status');
|
|
48
|
+
if (!statusField || !statusField.Dirty)
|
|
49
|
+
return;
|
|
50
|
+
const oldStatus = statusField.OldValue;
|
|
51
|
+
const newStatus = statusField.Value;
|
|
52
|
+
if (newStatus === 'InProgress' && !this.Get('StartedAt')) {
|
|
53
|
+
this.Set('StartedAt', new Date());
|
|
54
|
+
}
|
|
55
|
+
if (newStatus === 'Completed') {
|
|
56
|
+
if (!this.Get('CompletedAt')) {
|
|
57
|
+
this.Set('CompletedAt', new Date());
|
|
58
|
+
}
|
|
59
|
+
this.Set('PercentComplete', 100);
|
|
60
|
+
}
|
|
61
|
+
if (oldStatus === 'Completed' && newStatus !== 'Completed' && newStatus !== 'Cancelled') {
|
|
62
|
+
this.Set('CompletedAt', null);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
TaskEntity = __decorate([
|
|
67
|
+
RegisterClass(BaseEntity, 'MJ_BizApps_Tasks: Tasks', 1)
|
|
68
|
+
], TaskEntity);
|
|
69
|
+
export { TaskEntity };
|
|
70
|
+
//# sourceMappingURL=TaskEntitySubclass.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TaskEntitySubclass.js","sourceRoot":"","sources":["../../src/custom/TaskEntitySubclass.ts"],"names":[],"mappings":"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"}
|