@memberjunction/core-entities-server 6.2.0-edge.1 → 6.2.0-edge.2
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/MJActionEntityServer.server.js +1 -1
- package/dist/custom/MJActionEntityServer.server.js.map +1 -1
- package/dist/custom/MJComponentEntityServer.server.d.ts +2 -2
- package/dist/custom/MJComponentEntityServer.server.d.ts.map +1 -1
- package/dist/custom/MJComponentEntityServer.server.js +2 -2
- package/dist/custom/MJComponentEntityServer.server.js.map +1 -1
- package/dist/custom/MJDuplicateRunEntityServer.server.d.ts +2 -1
- package/dist/custom/MJDuplicateRunEntityServer.server.d.ts.map +1 -1
- package/dist/custom/MJDuplicateRunEntityServer.server.js +2 -2
- package/dist/custom/MJDuplicateRunEntityServer.server.js.map +1 -1
- package/dist/custom/MJRecordChangeEntityServer.server.d.ts +6 -0
- package/dist/custom/MJRecordChangeEntityServer.server.d.ts.map +1 -0
- package/dist/custom/MJRecordChangeEntityServer.server.js +74 -0
- package/dist/custom/MJRecordChangeEntityServer.server.js.map +1 -0
- package/dist/custom/MJRecordProcessEntityServer.server.d.ts +6 -2
- package/dist/custom/MJRecordProcessEntityServer.server.d.ts.map +1 -1
- package/dist/custom/MJRecordProcessEntityServer.server.js +6 -2
- package/dist/custom/MJRecordProcessEntityServer.server.js.map +1 -1
- package/dist/custom/MJRemoteOperationEntityServer.server.js +1 -1
- package/dist/custom/MJRemoteOperationEntityServer.server.js.map +1 -1
- package/dist/custom/MJRubricBandEntityServer.server.d.ts +9 -0
- package/dist/custom/MJRubricBandEntityServer.server.d.ts.map +1 -0
- package/dist/custom/MJRubricBandEntityServer.server.js +34 -0
- package/dist/custom/MJRubricBandEntityServer.server.js.map +1 -0
- package/dist/custom/MJRubricCriterionEntityServer.server.d.ts +16 -0
- package/dist/custom/MJRubricCriterionEntityServer.server.d.ts.map +1 -0
- package/dist/custom/MJRubricCriterionEntityServer.server.js +43 -0
- package/dist/custom/MJRubricCriterionEntityServer.server.js.map +1 -0
- package/dist/custom/MJRubricCriterionLevelEntityServer.server.d.ts +10 -0
- package/dist/custom/MJRubricCriterionLevelEntityServer.server.d.ts.map +1 -0
- package/dist/custom/MJRubricCriterionLevelEntityServer.server.js +43 -0
- package/dist/custom/MJRubricCriterionLevelEntityServer.server.js.map +1 -0
- package/dist/custom/MJRubricEvaluationEntityServer.server.d.ts +43 -0
- package/dist/custom/MJRubricEvaluationEntityServer.server.d.ts.map +1 -0
- package/dist/custom/MJRubricEvaluationEntityServer.server.js +243 -0
- package/dist/custom/MJRubricEvaluationEntityServer.server.js.map +1 -0
- package/dist/custom/MJRubricEvaluationScoreEntityServer.server.d.ts +26 -0
- package/dist/custom/MJRubricEvaluationScoreEntityServer.server.d.ts.map +1 -0
- package/dist/custom/MJRubricEvaluationScoreEntityServer.server.js +49 -0
- package/dist/custom/MJRubricEvaluationScoreEntityServer.server.js.map +1 -0
- package/dist/custom/MJRubricScaleEntityServer.server.d.ts +24 -0
- package/dist/custom/MJRubricScaleEntityServer.server.d.ts.map +1 -0
- package/dist/custom/MJRubricScaleEntityServer.server.js +88 -0
- package/dist/custom/MJRubricScaleEntityServer.server.js.map +1 -0
- package/dist/custom/MJRubricScaleLevelEntityServer.server.d.ts +16 -0
- package/dist/custom/MJRubricScaleLevelEntityServer.server.d.ts.map +1 -0
- package/dist/custom/MJRubricScaleLevelEntityServer.server.js +80 -0
- package/dist/custom/MJRubricScaleLevelEntityServer.server.js.map +1 -0
- package/dist/custom/MJRubricVersionEntityServer.server.d.ts +46 -0
- package/dist/custom/MJRubricVersionEntityServer.server.d.ts.map +1 -0
- package/dist/custom/MJRubricVersionEntityServer.server.js +131 -0
- package/dist/custom/MJRubricVersionEntityServer.server.js.map +1 -0
- package/dist/custom/MJVectorIndexEntityServer.server.d.ts +2 -1
- package/dist/custom/MJVectorIndexEntityServer.server.d.ts.map +1 -1
- package/dist/custom/MJVectorIndexEntityServer.server.js +6 -4
- package/dist/custom/MJVectorIndexEntityServer.server.js.map +1 -1
- package/dist/custom/rubrics/evaluationSubmit.d.ts +95 -0
- package/dist/custom/rubrics/evaluationSubmit.d.ts.map +1 -0
- package/dist/custom/rubrics/evaluationSubmit.js +142 -0
- package/dist/custom/rubrics/evaluationSubmit.js.map +1 -0
- package/dist/custom/rubrics/scaleFreeze.d.ts +21 -0
- package/dist/custom/rubrics/scaleFreeze.d.ts.map +1 -0
- package/dist/custom/rubrics/scaleFreeze.js +30 -0
- package/dist/custom/rubrics/scaleFreeze.js.map +1 -0
- package/dist/custom/rubrics/statusRules.d.ts +13 -0
- package/dist/custom/rubrics/statusRules.d.ts.map +1 -0
- package/dist/custom/rubrics/statusRules.js +57 -0
- package/dist/custom/rubrics/statusRules.js.map +1 -0
- package/dist/custom/rubrics/versionPublish.d.ts +67 -0
- package/dist/custom/rubrics/versionPublish.d.ts.map +1 -0
- package/dist/custom/rubrics/versionPublish.js +222 -0
- package/dist/custom/rubrics/versionPublish.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -1
- package/package.json +30 -28
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { type EntitySaveOptions, type ValidationResult } from '@memberjunction/core';
|
|
2
|
+
import { MJRubricVersionEntity } from '@memberjunction/core-entities';
|
|
3
|
+
import type { RubricVersionSnapshot } from '@memberjunction/rubrics-base';
|
|
4
|
+
import { type PublishResult } from './rubrics/versionPublish.js';
|
|
5
|
+
/**
|
|
6
|
+
* Draft, publish, and hash a rubric version.
|
|
7
|
+
*
|
|
8
|
+
* `publish` refuses a tree with duplicate keys, a missing or cyclic parent, a
|
|
9
|
+
* criterion without a scale, or a gate without a minimum, and refuses a draft
|
|
10
|
+
* identical to its base. It writes the bump, version numbers, change details,
|
|
11
|
+
* ContentHash, and ScoringHash from RubricVersionDiff. It does not write a
|
|
12
|
+
* second copy of the scoring math.
|
|
13
|
+
*/
|
|
14
|
+
export declare class MJRubricVersionEntityServer extends MJRubricVersionEntity {
|
|
15
|
+
/**
|
|
16
|
+
* Deep-clones criteria onto a new draft. Keys are kept. Ids and parent ids
|
|
17
|
+
* are new. The caller sets Status to Draft and BasedOnVersionID to the source.
|
|
18
|
+
*/
|
|
19
|
+
CloneNodes(source: RubricVersionSnapshot['nodes']): RubricVersionSnapshot['nodes'];
|
|
20
|
+
/**
|
|
21
|
+
* Computes the publish result and copies it onto this version. Refuses the
|
|
22
|
+
* cases documented on the class. The caller saves inside its transaction.
|
|
23
|
+
*/
|
|
24
|
+
Publish(base: RubricVersionSnapshot | null, draft: RubricVersionSnapshot, requestedBump?: 'Major' | 'Minor' | 'Patch' | null): Promise<PublishResult>;
|
|
25
|
+
/**
|
|
26
|
+
* A new version is Draft. Draft becomes Published only through Publish.
|
|
27
|
+
* A frozen version moves only between Published and Retired, and none of
|
|
28
|
+
* the columns the immutability trigger freezes may change on that move.
|
|
29
|
+
*/
|
|
30
|
+
ValidateAsync(): Promise<ValidationResult>;
|
|
31
|
+
/**
|
|
32
|
+
* A repeat metadata push reapplies the draft file onto a version the
|
|
33
|
+
* publication file already published. Leaving Status untouched keeps the
|
|
34
|
+
* loaded row clean, so sync counts it unchanged instead of updating it.
|
|
35
|
+
*/
|
|
36
|
+
Set(fieldName: string, value: unknown): void;
|
|
37
|
+
/**
|
|
38
|
+
* When Status moves Draft → Published, loads the draft tree and its base
|
|
39
|
+
* version and calls {@link publish}. Setting Status and saving is enough.
|
|
40
|
+
* Refuses the cases documented on the class. Writes PublishedAt with the
|
|
41
|
+
* status, which the published-version check constraint requires, and stamps
|
|
42
|
+
* PublishedByUserID from the current user. Retiring stamps RetiredAt.
|
|
43
|
+
*/
|
|
44
|
+
Save(options?: EntitySaveOptions): Promise<boolean>;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=MJRubricVersionEntityServer.server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MJRubricVersionEntityServer.server.d.ts","sourceRoot":"","sources":["../../src/custom/MJRubricVersionEntityServer.server.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC/G,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAEtE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAE1E,OAAO,EAAgE,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE/H;;;;;;;;GAQG;AACH,qBACa,2BAA4B,SAAQ,qBAAqB;IAClE;;;OAGG;IACI,UAAU,CAAC,MAAM,EAAE,qBAAqB,CAAC,OAAO,CAAC,GAAG,qBAAqB,CAAC,OAAO,CAAC;IAIzF;;;OAGG;IACU,OAAO,CAChB,IAAI,EAAE,qBAAqB,GAAG,IAAI,EAClC,KAAK,EAAE,qBAAqB,EAC5B,aAAa,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,IAAI,GACnD,OAAO,CAAC,aAAa,CAAC;IAezB;;;;OAIG;IACmB,aAAa,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAkBhE;;;;OAIG;IACa,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAK5D;;;;;;OAMG;IACmB,IAAI,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;CAmC5E"}
|
|
@@ -0,0 +1,131 @@
|
|
|
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, CompositeKey } from '@memberjunction/core';
|
|
8
|
+
import { MJRubricVersionEntity } from '@memberjunction/core-entities';
|
|
9
|
+
import { RegisterClass } from '@memberjunction/global';
|
|
10
|
+
import { FROZEN_VERSION_FIELDS, PushFailure, VersionStatusError } from './rubrics/statusRules.js';
|
|
11
|
+
import { CloneVersionNodes, LoadDraftForPublish, PublishRubricVersion } from './rubrics/versionPublish.js';
|
|
12
|
+
/**
|
|
13
|
+
* Draft, publish, and hash a rubric version.
|
|
14
|
+
*
|
|
15
|
+
* `publish` refuses a tree with duplicate keys, a missing or cyclic parent, a
|
|
16
|
+
* criterion without a scale, or a gate without a minimum, and refuses a draft
|
|
17
|
+
* identical to its base. It writes the bump, version numbers, change details,
|
|
18
|
+
* ContentHash, and ScoringHash from RubricVersionDiff. It does not write a
|
|
19
|
+
* second copy of the scoring math.
|
|
20
|
+
*/
|
|
21
|
+
let MJRubricVersionEntityServer = class MJRubricVersionEntityServer extends MJRubricVersionEntity {
|
|
22
|
+
/**
|
|
23
|
+
* Deep-clones criteria onto a new draft. Keys are kept. Ids and parent ids
|
|
24
|
+
* are new. The caller sets Status to Draft and BasedOnVersionID to the source.
|
|
25
|
+
*/
|
|
26
|
+
CloneNodes(source) {
|
|
27
|
+
return CloneVersionNodes(source);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Computes the publish result and copies it onto this version. Refuses the
|
|
31
|
+
* cases documented on the class. The caller saves inside its transaction.
|
|
32
|
+
*/
|
|
33
|
+
async Publish(base, draft, requestedBump) {
|
|
34
|
+
const result = await PublishRubricVersion(base, draft, requestedBump);
|
|
35
|
+
this.Status = 'Published';
|
|
36
|
+
this.MajorVersion = result.majorVersion;
|
|
37
|
+
this.MinorVersion = result.minorVersion;
|
|
38
|
+
this.PatchVersion = result.patchVersion;
|
|
39
|
+
this.ComputedBump = result.computedBump;
|
|
40
|
+
this.AppliedBump = result.appliedBump;
|
|
41
|
+
this.ContentHash = result.contentHash;
|
|
42
|
+
this.ScoringHash = result.scoringHash;
|
|
43
|
+
this.ChangeDetails = JSON.stringify(result.changeDetails);
|
|
44
|
+
this.PublishedAt = result.publishedAt;
|
|
45
|
+
return result;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* A new version is Draft. Draft becomes Published only through Publish.
|
|
49
|
+
* A frozen version moves only between Published and Retired, and none of
|
|
50
|
+
* the columns the immutability trigger freezes may change on that move.
|
|
51
|
+
*/
|
|
52
|
+
async ValidateAsync() {
|
|
53
|
+
const result = await super.ValidateAsync();
|
|
54
|
+
const status = this.GetFieldByName('Status');
|
|
55
|
+
const previous = this.IsSaved === false ? null : String(status?.OldValue ?? this.Status);
|
|
56
|
+
const statusError = VersionStatusError(this.IsSaved === false, previous, this.Status);
|
|
57
|
+
if (statusError)
|
|
58
|
+
PushFailure(result, 'Status', statusError, this.Status);
|
|
59
|
+
if (this.IsSaved !== false && previous && previous !== 'Draft') {
|
|
60
|
+
for (const name of FROZEN_VERSION_FIELDS) {
|
|
61
|
+
const field = this.GetFieldByName(name);
|
|
62
|
+
if (field?.Dirty) {
|
|
63
|
+
PushFailure(result, name, 'A published rubric version is immutable. Create a new draft version to change it; only its Status may move between Published and Retired.', field.Value);
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return result;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* A repeat metadata push reapplies the draft file onto a version the
|
|
72
|
+
* publication file already published. Leaving Status untouched keeps the
|
|
73
|
+
* loaded row clean, so sync counts it unchanged instead of updating it.
|
|
74
|
+
*/
|
|
75
|
+
Set(fieldName, value) {
|
|
76
|
+
if (fieldName === 'Status' && value === 'Draft' && this.IsSaved !== false && (this.Status === 'Published' || this.Status === 'Retired'))
|
|
77
|
+
return;
|
|
78
|
+
super.Set(fieldName, value);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* When Status moves Draft → Published, loads the draft tree and its base
|
|
82
|
+
* version and calls {@link publish}. Setting Status and saving is enough.
|
|
83
|
+
* Refuses the cases documented on the class. Writes PublishedAt with the
|
|
84
|
+
* status, which the published-version check constraint requires, and stamps
|
|
85
|
+
* PublishedByUserID from the current user. Retiring stamps RetiredAt.
|
|
86
|
+
*/
|
|
87
|
+
async Save(options) {
|
|
88
|
+
const incoming = this.GetFieldByName('Status');
|
|
89
|
+
if (this.IsSaved !== false && incoming?.OldValue === 'Published' && this.Status === 'Draft') {
|
|
90
|
+
this.Status = 'Published';
|
|
91
|
+
if (!this.Dirty)
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
if (this.IsSaved === false && this.Status === 'Published' && this.ID) {
|
|
95
|
+
const provider = this.ProviderToUse;
|
|
96
|
+
if (provider?.GetEntityObject) {
|
|
97
|
+
const existing = await provider.GetEntityObject('MJ: Rubric Versions', this.ContextCurrentUser);
|
|
98
|
+
if (await existing.InnerLoad(CompositeKey.FromID(this.ID))) {
|
|
99
|
+
if (existing.Status === 'Draft') {
|
|
100
|
+
existing.Status = 'Published';
|
|
101
|
+
return existing.Save(options);
|
|
102
|
+
}
|
|
103
|
+
if (existing.Status === 'Published' || existing.Status === 'Retired')
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
const status = this.GetFieldByName('Status');
|
|
109
|
+
if (status?.Dirty && status.OldValue === 'Draft' && this.Status === 'Published') {
|
|
110
|
+
const provider = this.ProviderToUse;
|
|
111
|
+
if (!provider?.RunView)
|
|
112
|
+
throw new Error('Publishing a rubric version requires a provider that can load the draft tree.');
|
|
113
|
+
const run = (entityName, filter) => provider.RunView({ EntityName: entityName, ExtraFilter: filter }, this.ContextCurrentUser);
|
|
114
|
+
const loaded = await LoadDraftForPublish(run, this.ID, this.RubricID, this.BasedOnVersionID);
|
|
115
|
+
const requested = this.RequestedBump ?? null;
|
|
116
|
+
await this.Publish(loaded.base, loaded.draft, requested);
|
|
117
|
+
const userId = this.ContextCurrentUser?.ID;
|
|
118
|
+
if (userId && !this.PublishedByUserID)
|
|
119
|
+
this.PublishedByUserID = userId;
|
|
120
|
+
}
|
|
121
|
+
if (status?.Dirty && this.Status === 'Retired' && !this.RetiredAt) {
|
|
122
|
+
this.RetiredAt = new Date();
|
|
123
|
+
}
|
|
124
|
+
return super.Save(options);
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
MJRubricVersionEntityServer = __decorate([
|
|
128
|
+
RegisterClass(BaseEntity, 'MJ: Rubric Versions')
|
|
129
|
+
], MJRubricVersionEntityServer);
|
|
130
|
+
export { MJRubricVersionEntityServer };
|
|
131
|
+
//# sourceMappingURL=MJRubricVersionEntityServer.server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MJRubricVersionEntityServer.server.js","sourceRoot":"","sources":["../../src/custom/MJRubricVersionEntityServer.server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { EntitySaveOptions } from "@memberjunction/core";
|
|
1
2
|
import { MJVectorIndexEntity } from "@memberjunction/core-entities";
|
|
2
3
|
/**
|
|
3
4
|
* Server-side VectorIndex entity that syncs with the vector database provider.
|
|
@@ -8,7 +9,7 @@ export declare class MJVectorIndexEntityServer extends MJVectorIndexEntity {
|
|
|
8
9
|
/**
|
|
9
10
|
* After saving, if this is a new record, create the index in the provider.
|
|
10
11
|
*/
|
|
11
|
-
Save(): Promise<boolean>;
|
|
12
|
+
Save(options?: EntitySaveOptions): Promise<boolean>;
|
|
12
13
|
/**
|
|
13
14
|
* Before deleting, remove the index from the provider.
|
|
14
15
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MJVectorIndexEntityServer.server.d.ts","sourceRoot":"","sources":["../../src/custom/MJVectorIndexEntityServer.server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"MJVectorIndexEntityServer.server.d.ts","sourceRoot":"","sources":["../../src/custom/MJVectorIndexEntityServer.server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,iBAAiB,EAA0C,MAAM,sBAAsB,CAAC;AAE7G,OAAO,EAAE,mBAAmB,EAA0B,MAAM,+BAA+B,CAAC;AAK5F;;;;GAIG;AACH,qBACa,yBAA0B,SAAQ,mBAAmB;IAC9D;;OAEG;IACmB,IAAI,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;IAazE;;OAEG;IACmB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAShD;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAoBzB;;OAEG;YACW,qBAAqB;IAuCnC;;OAEG;YACW,uBAAuB;IAmBrC;;;OAGG;YACW,mBAAmB;IAgDjC;;;;;;;;;;OAUG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;;OAGG;YACW,oBAAoB;CAiCrC"}
|
|
@@ -9,6 +9,7 @@ import { RegisterClass, MJGlobal } from "@memberjunction/global";
|
|
|
9
9
|
import { MJVectorIndexEntity } from "@memberjunction/core-entities";
|
|
10
10
|
import { VectorDBBase } from "@memberjunction/ai-vectordb";
|
|
11
11
|
import { GetAIAPIKey } from "@memberjunction/ai";
|
|
12
|
+
import { AIEngineBase } from "@memberjunction/ai-engine-base";
|
|
12
13
|
/**
|
|
13
14
|
* Server-side VectorIndex entity that syncs with the vector database provider.
|
|
14
15
|
* On create: calls vectorDB.CreateIndex() to provision the index in the provider (e.g., Pinecone).
|
|
@@ -18,9 +19,9 @@ let MJVectorIndexEntityServer = class MJVectorIndexEntityServer extends MJVector
|
|
|
18
19
|
/**
|
|
19
20
|
* After saving, if this is a new record, create the index in the provider.
|
|
20
21
|
*/
|
|
21
|
-
async Save() {
|
|
22
|
+
async Save(options) {
|
|
22
23
|
const isNew = this.IsSaved === false;
|
|
23
|
-
const saveResult = await super.Save();
|
|
24
|
+
const saveResult = await super.Save(options);
|
|
24
25
|
if (saveResult && isNew) {
|
|
25
26
|
this.createIndexInProvider().catch((error) => {
|
|
26
27
|
LogError(`Failed to create index "${this.Name}" in vector DB provider`, undefined, error);
|
|
@@ -108,8 +109,9 @@ let MJVectorIndexEntityServer = class MJVectorIndexEntityServer extends MJVector
|
|
|
108
109
|
LogError(`Cannot delete index: no VectorDB instance for database ${this.VectorDatabaseID}`);
|
|
109
110
|
return;
|
|
110
111
|
}
|
|
111
|
-
//
|
|
112
|
-
|
|
112
|
+
// Same rule every read path uses to address the index on its provider (ExternalID, else Name).
|
|
113
|
+
// An index provisioned through Save() above always has ExternalID set to its sanitized name.
|
|
114
|
+
const providerIndexName = AIEngineBase.Instance.GetProviderIndexName(this);
|
|
113
115
|
LogStatus(`Deleting index "${providerIndexName}" from vector DB provider...`);
|
|
114
116
|
const result = await vectorDB.DeleteIndex({ id: providerIndexName });
|
|
115
117
|
if (result.success) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MJVectorIndexEntityServer.server.js","sourceRoot":"","sources":["../../src/custom/MJVectorIndexEntityServer.server.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"MJVectorIndexEntityServer.server.js","sourceRoot":"","sources":["../../src/custom/MJVectorIndexEntityServer.server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { type RubricScoreResult, type RubricVersionSnapshot } from '@memberjunction/rubrics-base';
|
|
2
|
+
export interface SupersedeTarget {
|
|
3
|
+
status: string;
|
|
4
|
+
subjectEntityId: string;
|
|
5
|
+
subjectRecordId: string;
|
|
6
|
+
contextEntityId?: string | null;
|
|
7
|
+
contextRecordId?: string | null;
|
|
8
|
+
rubricId: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Refuses a supersede target that is not Submitted, or whose subject, context,
|
|
12
|
+
* or rubric differs from the evaluation replacing it. The caller then sets
|
|
13
|
+
* Status to Superseded in the same transaction as the submit.
|
|
14
|
+
*/
|
|
15
|
+
export declare function AssertCanSupersede(target: SupersedeTarget, current: SupersedeTarget): void;
|
|
16
|
+
export declare class RubricEvaluationError extends Error {
|
|
17
|
+
constructor(message: string);
|
|
18
|
+
}
|
|
19
|
+
export interface EvaluationScoreInput {
|
|
20
|
+
criterionId: string;
|
|
21
|
+
scaleLevelId?: string | null;
|
|
22
|
+
rawValue?: number | null;
|
|
23
|
+
isNotApplicable?: boolean;
|
|
24
|
+
confidence?: number | null;
|
|
25
|
+
rationale?: string | null;
|
|
26
|
+
evidence?: unknown;
|
|
27
|
+
/** Group rows are written by the server. A client write is refused. */
|
|
28
|
+
isComputed?: boolean;
|
|
29
|
+
}
|
|
30
|
+
export interface SubmitEvaluationInput {
|
|
31
|
+
version: RubricVersionSnapshot;
|
|
32
|
+
/** Published, or Retired only when this evaluation supersedes one pinned to this same version. */
|
|
33
|
+
versionStatus: 'Published' | 'Retired' | 'Draft';
|
|
34
|
+
supersedesEvaluationId?: string | null;
|
|
35
|
+
/** RubricVersionID of the evaluation being superseded. Required when the pin is Retired. */
|
|
36
|
+
priorVersionId?: string | null;
|
|
37
|
+
scores: EvaluationScoreInput[];
|
|
38
|
+
passThresholdOverride?: number | null;
|
|
39
|
+
}
|
|
40
|
+
export interface PersistedScore {
|
|
41
|
+
criterionId: string;
|
|
42
|
+
normalizedScore: number | null;
|
|
43
|
+
effectiveWeight: number | null;
|
|
44
|
+
overallContribution: number | null;
|
|
45
|
+
gateFailed: boolean;
|
|
46
|
+
isComputed: boolean;
|
|
47
|
+
completeness: number | null;
|
|
48
|
+
confidence: number | null;
|
|
49
|
+
}
|
|
50
|
+
export interface PersistedEvaluation {
|
|
51
|
+
normalizedScore: number | null;
|
|
52
|
+
completeness: number | null;
|
|
53
|
+
outcome: RubricScoreResult['outcome'];
|
|
54
|
+
passed: boolean | null;
|
|
55
|
+
gateFailed: boolean;
|
|
56
|
+
passThresholdApplied: number | null;
|
|
57
|
+
bandId: string | null;
|
|
58
|
+
confidence: number | null;
|
|
59
|
+
scoredCriteriaCount: number;
|
|
60
|
+
applicableCriteriaCount: number;
|
|
61
|
+
totalCriteriaCount: number;
|
|
62
|
+
scoringEngineVersion: '1.0';
|
|
63
|
+
status: 'Submitted';
|
|
64
|
+
submittedAt: Date;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* A new evaluation pins a Published version. Creating one against a Draft or
|
|
68
|
+
* Retired version is refused here as well as at submit. A Retired version is
|
|
69
|
+
* accepted only when this evaluation supersedes one pinned to that same version.
|
|
70
|
+
* Naming a supersede target is not enough.
|
|
71
|
+
*
|
|
72
|
+
* Score rows must name criteria of this version. A levels answer must use that
|
|
73
|
+
* criterion's scale. A numeric answer is the only place RawValue is accepted.
|
|
74
|
+
* IsComputed rows are refused from the client.
|
|
75
|
+
*/
|
|
76
|
+
export declare function AssertPinnedVersionForCreate(versionStatus: string): void;
|
|
77
|
+
/**
|
|
78
|
+
* Refuses an evaluation that is not pinned to a Published version, unless it
|
|
79
|
+
* supersedes an evaluation and the pinned version is the Retired one that
|
|
80
|
+
* evaluation used. Score rows must name criteria of this version. A levels
|
|
81
|
+
* answer must use that criterion's scale. A numeric answer is the only place
|
|
82
|
+
* RawValue is accepted. IsComputed rows are refused from the client.
|
|
83
|
+
*/
|
|
84
|
+
export declare function ValidateEvaluationScores(input: SubmitEvaluationInput): void;
|
|
85
|
+
/**
|
|
86
|
+
* Validates, then scores with {@link RubricScoring.Compute} and returns the
|
|
87
|
+
* fields to persist. The caller writes score rows while the evaluation is
|
|
88
|
+
* still Draft, then writes these evaluation fields and sets Status to Submitted.
|
|
89
|
+
* This is the only copy of the math.
|
|
90
|
+
*/
|
|
91
|
+
export declare function SubmitEvaluation(input: SubmitEvaluationInput): {
|
|
92
|
+
evaluation: PersistedEvaluation;
|
|
93
|
+
scores: PersistedScore[];
|
|
94
|
+
};
|
|
95
|
+
//# sourceMappingURL=evaluationSubmit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluationSubmit.d.ts","sourceRoot":"","sources":["../../../src/custom/rubrics/evaluationSubmit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { NormalizeUUID, UUIDsEqual } from '@memberjunction/global';
|
|
2
|
+
import { EvidenceSatisfied, RubricScoring } from '@memberjunction/rubrics-base';
|
|
3
|
+
/**
|
|
4
|
+
* Refuses a supersede target that is not Submitted, or whose subject, context,
|
|
5
|
+
* or rubric differs from the evaluation replacing it. The caller then sets
|
|
6
|
+
* Status to Superseded in the same transaction as the submit.
|
|
7
|
+
*/
|
|
8
|
+
export function AssertCanSupersede(target, current) {
|
|
9
|
+
if (target.status !== 'Submitted') {
|
|
10
|
+
throw new RubricEvaluationError('Only a Submitted evaluation can be superseded.');
|
|
11
|
+
}
|
|
12
|
+
if (target.subjectEntityId !== current.subjectEntityId || target.subjectRecordId !== current.subjectRecordId) {
|
|
13
|
+
throw new RubricEvaluationError('A supersede must be the same subject.');
|
|
14
|
+
}
|
|
15
|
+
if ((target.contextEntityId ?? null) !== (current.contextEntityId ?? null) || (target.contextRecordId ?? null) !== (current.contextRecordId ?? null)) {
|
|
16
|
+
throw new RubricEvaluationError('A supersede must be the same context.');
|
|
17
|
+
}
|
|
18
|
+
if (target.rubricId !== current.rubricId) {
|
|
19
|
+
throw new RubricEvaluationError('A supersede must be the same rubric.');
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export class RubricEvaluationError extends Error {
|
|
23
|
+
constructor(message) {
|
|
24
|
+
super(message);
|
|
25
|
+
this.name = 'RubricEvaluationError';
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* A new evaluation pins a Published version. Creating one against a Draft or
|
|
30
|
+
* Retired version is refused here as well as at submit. A Retired version is
|
|
31
|
+
* accepted only when this evaluation supersedes one pinned to that same version.
|
|
32
|
+
* Naming a supersede target is not enough.
|
|
33
|
+
*
|
|
34
|
+
* Score rows must name criteria of this version. A levels answer must use that
|
|
35
|
+
* criterion's scale. A numeric answer is the only place RawValue is accepted.
|
|
36
|
+
* IsComputed rows are refused from the client.
|
|
37
|
+
*/
|
|
38
|
+
export function AssertPinnedVersionForCreate(versionStatus) {
|
|
39
|
+
if (versionStatus !== 'Published') {
|
|
40
|
+
throw new RubricEvaluationError('A new evaluation must pin a Published version.');
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Refuses an evaluation that is not pinned to a Published version, unless it
|
|
45
|
+
* supersedes an evaluation and the pinned version is the Retired one that
|
|
46
|
+
* evaluation used. Score rows must name criteria of this version. A levels
|
|
47
|
+
* answer must use that criterion's scale. A numeric answer is the only place
|
|
48
|
+
* RawValue is accepted. IsComputed rows are refused from the client.
|
|
49
|
+
*/
|
|
50
|
+
export function ValidateEvaluationScores(input) {
|
|
51
|
+
if (input.versionStatus === 'Draft') {
|
|
52
|
+
throw new RubricEvaluationError('A new evaluation must pin a Published version.');
|
|
53
|
+
}
|
|
54
|
+
if (input.versionStatus === 'Retired') {
|
|
55
|
+
if (!input.supersedesEvaluationId || !input.priorVersionId || input.priorVersionId !== input.version.id) {
|
|
56
|
+
throw new RubricEvaluationError('A Retired version can only be pinned when superseding an evaluation of that same version.');
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
else if (input.versionStatus !== 'Published') {
|
|
60
|
+
throw new RubricEvaluationError('A new evaluation must pin a Published version.');
|
|
61
|
+
}
|
|
62
|
+
const nodes = new Map(input.version.nodes.map(node => [NormalizeUUID(node.id), node]));
|
|
63
|
+
const scales = new Map(input.version.scales.map(scale => [NormalizeUUID(scale.id), scale]));
|
|
64
|
+
for (const score of input.scores) {
|
|
65
|
+
if (score.isComputed)
|
|
66
|
+
throw new RubricEvaluationError('Computed score rows are written by the server.');
|
|
67
|
+
const node = nodes.get(NormalizeUUID(score.criterionId));
|
|
68
|
+
if (!node)
|
|
69
|
+
throw new RubricEvaluationError(`Score ${score.criterionId} is not a criterion of this version.`);
|
|
70
|
+
if (node.nodeType !== 'Criterion')
|
|
71
|
+
throw new RubricEvaluationError(`${node.key} is a group. The server writes its score.`);
|
|
72
|
+
const scale = node.scaleId ? scales.get(NormalizeUUID(node.scaleId)) : undefined;
|
|
73
|
+
if (score.scaleLevelId && scale?.scaleType !== 'Levels') {
|
|
74
|
+
throw new RubricEvaluationError(`${node.key} does not use a levels scale.`);
|
|
75
|
+
}
|
|
76
|
+
if (score.scaleLevelId && scale && !scale.levels.some(level => UUIDsEqual(level.id, score.scaleLevelId))) {
|
|
77
|
+
throw new RubricEvaluationError(`${node.key} is not on a level of its scale.`);
|
|
78
|
+
}
|
|
79
|
+
if (typeof score.rawValue === 'number' && Number.isNaN(score.rawValue)) {
|
|
80
|
+
throw new RubricEvaluationError(`${node.key} needs a numeric value inside its scale.`);
|
|
81
|
+
}
|
|
82
|
+
if (score.rawValue !== undefined && score.rawValue !== null && scale?.scaleType !== 'Numeric') {
|
|
83
|
+
throw new RubricEvaluationError(`${node.key} does not use a numeric scale.`);
|
|
84
|
+
}
|
|
85
|
+
if (node.rationaleRequired && !score.isNotApplicable && !score.rationale) {
|
|
86
|
+
throw new RubricEvaluationError(`${node.name} requires a rationale.`);
|
|
87
|
+
}
|
|
88
|
+
if (node.evidenceRequired && !score.isNotApplicable && !EvidenceSatisfied(score.evidence)) {
|
|
89
|
+
throw new RubricEvaluationError(`${node.name} requires evidence.`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Validates, then scores with {@link RubricScoring.Compute} and returns the
|
|
95
|
+
* fields to persist. The caller writes score rows while the evaluation is
|
|
96
|
+
* still Draft, then writes these evaluation fields and sets Status to Submitted.
|
|
97
|
+
* This is the only copy of the math.
|
|
98
|
+
*/
|
|
99
|
+
export function SubmitEvaluation(input) {
|
|
100
|
+
ValidateEvaluationScores(input);
|
|
101
|
+
const answers = input.scores.map(score => ({
|
|
102
|
+
criterionId: score.criterionId,
|
|
103
|
+
scaleLevelId: score.scaleLevelId,
|
|
104
|
+
rawValue: score.rawValue,
|
|
105
|
+
isNotApplicable: score.isNotApplicable,
|
|
106
|
+
confidence: score.confidence,
|
|
107
|
+
}));
|
|
108
|
+
const result = RubricScoring.Compute({
|
|
109
|
+
version: input.version,
|
|
110
|
+
answers,
|
|
111
|
+
passThresholdOverride: input.passThresholdOverride,
|
|
112
|
+
});
|
|
113
|
+
return {
|
|
114
|
+
evaluation: {
|
|
115
|
+
normalizedScore: result.normalizedScore,
|
|
116
|
+
completeness: result.completeness,
|
|
117
|
+
outcome: result.outcome,
|
|
118
|
+
passed: result.passed,
|
|
119
|
+
gateFailed: result.gateFailed,
|
|
120
|
+
passThresholdApplied: result.passThresholdApplied,
|
|
121
|
+
bandId: result.bandId,
|
|
122
|
+
confidence: result.confidence,
|
|
123
|
+
scoredCriteriaCount: result.scoredCriteriaCount,
|
|
124
|
+
applicableCriteriaCount: result.applicableCriteriaCount,
|
|
125
|
+
totalCriteriaCount: result.totalCriteriaCount,
|
|
126
|
+
scoringEngineVersion: result.scoringEngineVersion,
|
|
127
|
+
status: 'Submitted',
|
|
128
|
+
submittedAt: new Date(),
|
|
129
|
+
},
|
|
130
|
+
scores: result.nodes.map(node => ({
|
|
131
|
+
criterionId: node.id,
|
|
132
|
+
normalizedScore: node.normalizedScore,
|
|
133
|
+
effectiveWeight: node.effectiveWeight,
|
|
134
|
+
overallContribution: node.overallContribution,
|
|
135
|
+
gateFailed: node.gateFailed,
|
|
136
|
+
completeness: node.completeness ?? null,
|
|
137
|
+
confidence: node.confidence ?? null,
|
|
138
|
+
isComputed: input.version.nodes.find(item => UUIDsEqual(item.id, node.id))?.nodeType === 'Group',
|
|
139
|
+
})),
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=evaluationSubmit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluationSubmit.js","sourceRoot":"","sources":["../../../src/custom/rubrics/evaluationSubmit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface ScaleShape {
|
|
2
|
+
scaleType: string;
|
|
3
|
+
minValue?: number | null;
|
|
4
|
+
maxValue?: number | null;
|
|
5
|
+
step?: number | null;
|
|
6
|
+
higherIsBetter: boolean;
|
|
7
|
+
levels: {
|
|
8
|
+
id: string;
|
|
9
|
+
value: number;
|
|
10
|
+
normalizedValue: number;
|
|
11
|
+
label?: string;
|
|
12
|
+
description?: string | null;
|
|
13
|
+
}[];
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* A scale used by any published version cannot change its type, range, direction,
|
|
17
|
+
* step, or level values. Labels and descriptions may still change. Returns the
|
|
18
|
+
* refusal message, or null when the edit is allowed.
|
|
19
|
+
*/
|
|
20
|
+
export declare function FrozenScaleChange(usedByPublishedVersion: boolean, before: ScaleShape, after: ScaleShape): string | null;
|
|
21
|
+
//# sourceMappingURL=scaleFreeze.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaleFreeze.d.ts","sourceRoot":"","sources":["../../../src/custom/rubrics/scaleFreeze.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,cAAc,EAAE,OAAO,CAAC;IACxB,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,EAAE,CAAC;CACjH;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,sBAAsB,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,CAkBvH"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A scale used by any published version cannot change its type, range, direction,
|
|
3
|
+
* step, or level values. Labels and descriptions may still change. Returns the
|
|
4
|
+
* refusal message, or null when the edit is allowed.
|
|
5
|
+
*/
|
|
6
|
+
export function FrozenScaleChange(usedByPublishedVersion, before, after) {
|
|
7
|
+
if (!usedByPublishedVersion)
|
|
8
|
+
return null;
|
|
9
|
+
if (before.scaleType !== after.scaleType)
|
|
10
|
+
return 'A scale used by a published version cannot change type.';
|
|
11
|
+
if ((before.minValue ?? null) !== (after.minValue ?? null) || (before.maxValue ?? null) !== (after.maxValue ?? null)) {
|
|
12
|
+
return 'A scale used by a published version cannot change its range.';
|
|
13
|
+
}
|
|
14
|
+
if ((before.step ?? null) !== (after.step ?? null))
|
|
15
|
+
return 'A scale used by a published version cannot change its step.';
|
|
16
|
+
if (before.higherIsBetter !== after.higherIsBetter)
|
|
17
|
+
return 'A scale used by a published version cannot change direction.';
|
|
18
|
+
const beforeLevels = new Map(before.levels.map(level => [level.id, level]));
|
|
19
|
+
const afterLevels = new Map(after.levels.map(level => [level.id, level]));
|
|
20
|
+
if (beforeLevels.size !== afterLevels.size)
|
|
21
|
+
return 'A scale used by a published version cannot add or remove levels.';
|
|
22
|
+
for (const [id, level] of afterLevels) {
|
|
23
|
+
const previous = beforeLevels.get(id);
|
|
24
|
+
if (!previous || previous.value !== level.value || previous.normalizedValue !== level.normalizedValue) {
|
|
25
|
+
return 'A scale used by a published version cannot change a level value.';
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=scaleFreeze.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaleFreeze.js","sourceRoot":"","sources":["../../../src/custom/rubrics/scaleFreeze.ts"],"names":[],"mappings":"AASA;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,sBAA+B,EAAE,MAAkB,EAAE,KAAiB;IACpG,IAAI,CAAC,sBAAsB;QAAE,OAAO,IAAI,CAAC;IACzC,IAAI,MAAM,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS;QAAE,OAAO,yDAAyD,CAAC;IAC3G,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,EAAE,CAAC;QACnH,OAAO,8DAA8D,CAAC;IAC1E,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC;QAAE,OAAO,6DAA6D,CAAC;IACzH,IAAI,MAAM,CAAC,cAAc,KAAK,KAAK,CAAC,cAAc;QAAE,OAAO,8DAA8D,CAAC;IAC1H,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5E,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAC1E,IAAI,YAAY,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI;QAAE,OAAO,kEAAkE,CAAC;IACtH,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,IAAI,QAAQ,CAAC,eAAe,KAAK,KAAK,CAAC,eAAe,EAAE,CAAC;YACpG,OAAO,kEAAkE,CAAC;QAC9E,CAAC;IACL,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type ValidationResult } from '@memberjunction/core';
|
|
2
|
+
/** Columns the version trigger freezes once a version has left Draft. Status and RetiredAt may still change. */
|
|
3
|
+
export declare const FROZEN_VERSION_FIELDS: readonly ["RubricID", "MajorVersion", "MinorVersion", "PatchVersion", "BasedOnVersionID", "Instructions", "PassThreshold", "MinimumCompleteness", "NotApplicablePolicy", "ScoreDisplayMin", "ScoreDisplayMax", "RequestedBump", "ComputedBump", "AppliedBump", "ChangeSummary", "ChangeDetails", "ContentHash", "ScoringHash", "PublishedAt", "PublishedByUserID"];
|
|
4
|
+
/**
|
|
5
|
+
* A new version is Draft. After that, Draft becomes Published only through publish,
|
|
6
|
+
* and a frozen version moves only between Published and Retired.
|
|
7
|
+
*/
|
|
8
|
+
export declare function VersionStatusError(isNew: boolean, previous: string | null, next: string): string | null;
|
|
9
|
+
/** Draft may be submitted or fail. Submitted may be superseded or withdrawn. The other states are terminal. */
|
|
10
|
+
export declare function EvaluationStatusError(isNew: boolean, previous: string | null, next: string): string | null;
|
|
11
|
+
export declare function DraftChildError(kind: 'criterion' | 'level' | 'band', versionStatus: string | null | undefined): string | null;
|
|
12
|
+
export declare function PushFailure(result: ValidationResult, source: string, message: string, value: unknown): void;
|
|
13
|
+
//# sourceMappingURL=statusRules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statusRules.d.ts","sourceRoot":"","sources":["../../../src/custom/rubrics/statusRules.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4C,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAQvG,gHAAgH;AAChH,eAAO,MAAM,qBAAqB,oWAMxB,CAAC;AAEX;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOvG;AAED,+GAA+G;AAC/G,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAO1G;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,GAAG,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAK7H;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAG3G"}
|