@memberjunction/core-actions 6.2.0-edge.1 → 6.2.0-edge.3
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/ai/base-find-agents.action.d.ts.map +1 -1
- package/dist/custom/ai/base-find-agents.action.js +2 -7
- package/dist/custom/ai/base-find-agents.action.js.map +1 -1
- package/dist/custom/ai/execute-agent.action.d.ts +10 -0
- package/dist/custom/ai/execute-agent.action.d.ts.map +1 -1
- package/dist/custom/ai/execute-agent.action.js +24 -1
- package/dist/custom/ai/execute-agent.action.js.map +1 -1
- package/dist/custom/ai/execute-ai-prompt.action.d.ts.map +1 -1
- package/dist/custom/ai/execute-ai-prompt.action.js +3 -0
- package/dist/custom/ai/execute-ai-prompt.action.js.map +1 -1
- package/dist/custom/ai/find-candidate-agents.action.d.ts.map +1 -1
- package/dist/custom/ai/find-candidate-agents.action.js +2 -1
- package/dist/custom/ai/find-candidate-agents.action.js.map +1 -1
- package/dist/custom/ai/generate-image.action.d.ts +67 -6
- package/dist/custom/ai/generate-image.action.d.ts.map +1 -1
- package/dist/custom/ai/generate-image.action.js +208 -141
- package/dist/custom/ai/generate-image.action.js.map +1 -1
- package/dist/custom/ai/run-decision.action.d.ts +45 -0
- package/dist/custom/ai/run-decision.action.d.ts.map +1 -0
- package/dist/custom/ai/run-decision.action.js +169 -0
- package/dist/custom/ai/run-decision.action.js.map +1 -0
- package/dist/custom/ai/summarize-content.action.d.ts.map +1 -1
- package/dist/custom/ai/summarize-content.action.js +3 -0
- package/dist/custom/ai/summarize-content.action.js.map +1 -1
- package/dist/custom/data/run-adhoc-query.action.d.ts.map +1 -1
- package/dist/custom/data/run-adhoc-query.action.js +3 -0
- package/dist/custom/data/run-adhoc-query.action.js.map +1 -1
- package/dist/custom/interactive-forms/_shared.d.ts +113 -31
- package/dist/custom/interactive-forms/_shared.d.ts.map +1 -1
- package/dist/custom/interactive-forms/_shared.js +198 -74
- package/dist/custom/interactive-forms/_shared.js.map +1 -1
- package/dist/custom/interactive-forms/activate-form-contribution-version.action.d.ts +23 -0
- package/dist/custom/interactive-forms/activate-form-contribution-version.action.d.ts.map +1 -0
- package/dist/custom/interactive-forms/activate-form-contribution-version.action.js +151 -0
- package/dist/custom/interactive-forms/activate-form-contribution-version.action.js.map +1 -0
- package/dist/custom/interactive-forms/activate-interactive-form-version.action.d.ts +23 -7
- package/dist/custom/interactive-forms/activate-interactive-form-version.action.d.ts.map +1 -1
- package/dist/custom/interactive-forms/activate-interactive-form-version.action.js +114 -58
- package/dist/custom/interactive-forms/activate-interactive-form-version.action.js.map +1 -1
- package/dist/custom/interactive-forms/create-form-contribution.action.d.ts +35 -0
- package/dist/custom/interactive-forms/create-form-contribution.action.d.ts.map +1 -0
- package/dist/custom/interactive-forms/create-form-contribution.action.js +149 -0
- package/dist/custom/interactive-forms/create-form-contribution.action.js.map +1 -0
- package/dist/custom/interactive-forms/get-active-form-for-entity.action.d.ts +3 -0
- package/dist/custom/interactive-forms/get-active-form-for-entity.action.d.ts.map +1 -1
- package/dist/custom/interactive-forms/get-active-form-for-entity.action.js +5 -1
- package/dist/custom/interactive-forms/get-active-form-for-entity.action.js.map +1 -1
- package/dist/custom/interactive-forms/get-form-composition-for-entity.action.d.ts +59 -0
- package/dist/custom/interactive-forms/get-form-composition-for-entity.action.d.ts.map +1 -0
- package/dist/custom/interactive-forms/get-form-composition-for-entity.action.js +313 -0
- package/dist/custom/interactive-forms/get-form-composition-for-entity.action.js.map +1 -0
- package/dist/custom/interactive-forms/get-form-contributions-for-entity.action.d.ts +47 -0
- package/dist/custom/interactive-forms/get-form-contributions-for-entity.action.d.ts.map +1 -0
- package/dist/custom/interactive-forms/get-form-contributions-for-entity.action.js +115 -0
- package/dist/custom/interactive-forms/get-form-contributions-for-entity.action.js.map +1 -0
- package/dist/custom/interactive-forms/index.d.ts +5 -0
- package/dist/custom/interactive-forms/index.d.ts.map +1 -1
- package/dist/custom/interactive-forms/index.js +5 -0
- package/dist/custom/interactive-forms/index.js.map +1 -1
- package/dist/custom/interactive-forms/modify-form-contribution.action.d.ts +36 -0
- package/dist/custom/interactive-forms/modify-form-contribution.action.d.ts.map +1 -0
- package/dist/custom/interactive-forms/modify-form-contribution.action.js +181 -0
- package/dist/custom/interactive-forms/modify-form-contribution.action.js.map +1 -0
- package/dist/custom/interactive-forms/modify-interactive-form.action.d.ts +13 -11
- package/dist/custom/interactive-forms/modify-interactive-form.action.d.ts.map +1 -1
- package/dist/custom/interactive-forms/modify-interactive-form.action.js +65 -64
- package/dist/custom/interactive-forms/modify-interactive-form.action.js.map +1 -1
- package/dist/custom/interactive-forms/revert-interactive-form.action.d.ts +12 -0
- package/dist/custom/interactive-forms/revert-interactive-form.action.d.ts.map +1 -1
- package/dist/custom/interactive-forms/revert-interactive-form.action.js +29 -4
- package/dist/custom/interactive-forms/revert-interactive-form.action.js.map +1 -1
- package/dist/custom/record-cloning/clone-record.action.d.ts +15 -0
- package/dist/custom/record-cloning/clone-record.action.d.ts.map +1 -0
- package/dist/custom/record-cloning/clone-record.action.js +125 -0
- package/dist/custom/record-cloning/clone-record.action.js.map +1 -0
- package/dist/custom/record-cloning/clone-records.action.d.ts +15 -0
- package/dist/custom/record-cloning/clone-records.action.d.ts.map +1 -0
- package/dist/custom/record-cloning/clone-records.action.js +175 -0
- package/dist/custom/record-cloning/clone-records.action.js.map +1 -0
- package/dist/custom/utilities/vectorize-entity.action.js +1 -1
- package/dist/custom/utilities/vectorize-entity.action.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/package.json +42 -40
|
@@ -7,13 +7,29 @@ import { BaseAction } from "@memberjunction/actions";
|
|
|
7
7
|
* - prior Active sibling Override: Status='Inactive'
|
|
8
8
|
* - prior Active sibling Component: Status='Inactive'
|
|
9
9
|
*
|
|
10
|
-
* "Sibling" =
|
|
11
|
-
*
|
|
12
|
-
*
|
|
10
|
+
* "Sibling" = another of the caller's User-scope overrides on the same
|
|
11
|
+
* EntityID that is currently Status='Active'. The target is the row identified
|
|
12
|
+
* by the input `OverrideID`.
|
|
13
13
|
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
14
|
+
* Only the caller's own User-scope overrides can be activated. A Role or Global
|
|
15
|
+
* override, or another user's, returns FORBIDDEN for every caller (see
|
|
16
|
+
* `CheckPersonalWrite` in `_shared.ts`): shared forms are managed from Form
|
|
17
|
+
* Builder or the form's Manage drawer. The target's Component and Override flip
|
|
18
|
+
* to Active in one entity transaction. Each prior Active sibling is set aside after
|
|
19
|
+
* that transaction: its Override first, then its Component. Every prior is tried.
|
|
20
|
+
* If a save fails, the action returns `PERSIST_FAILED` that names each prior row
|
|
21
|
+
* not updated, and the target stays Active. A prior whose Override could not be
|
|
22
|
+
* set aside is still Active, so a retry sets it aside. A prior whose Override is
|
|
23
|
+
* set aside but whose Component status could not be updated is not found by a
|
|
24
|
+
* retry, and its Component keeps its old status.
|
|
25
|
+
*
|
|
26
|
+
* Idempotency. If the target Override is already Active, the caller's other
|
|
27
|
+
* Active overrides on the entity are set aside and the action returns SUCCESS
|
|
28
|
+
* with a no-op message that carries `DemotedCount`. So a retry after
|
|
29
|
+
* `PERSIST_FAILED` sets aside a prior whose Override could not be set aside; a
|
|
30
|
+
* prior whose Component status could not be updated is not found again. If the
|
|
31
|
+
* target is Inactive, that's a misuse — we surface NOT_PENDING so the agent / UI
|
|
32
|
+
* can ask the user what they really want.
|
|
17
33
|
*
|
|
18
34
|
* Inputs:
|
|
19
35
|
* - `OverrideID` (required, string) — the Pending override to activate
|
|
@@ -21,7 +37,7 @@ import { BaseAction } from "@memberjunction/actions";
|
|
|
21
37
|
* Outputs:
|
|
22
38
|
* - `ComponentID` — the Component now Active
|
|
23
39
|
* - `OverrideID` — echoed for convenience
|
|
24
|
-
* - `PreviousActiveOverrideID` — the override that was demoted (or null)
|
|
40
|
+
* - `PreviousActiveOverrideID` — the first override that was demoted (or null)
|
|
25
41
|
*/
|
|
26
42
|
export declare class ActivateInteractiveFormVersionAction extends BaseAction {
|
|
27
43
|
protected InternalRunAction(params: RunActionParams): Promise<ActionResultSimple>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"activate-interactive-form-version.action.d.ts","sourceRoot":"","sources":["../../../src/custom/interactive-forms/activate-interactive-form-version.action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"activate-interactive-form-version.action.d.ts","sourceRoot":"","sources":["../../../src/custom/interactive-forms/activate-interactive-form-version.action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAQrD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,qBACa,oCAAqC,SAAQ,UAAU;cAEhD,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAmF1F;AAyED,0BAA0B;AAC1B,wBAAgB,wCAAwC,IAAI,IAAI,CAI/D"}
|
|
@@ -6,8 +6,8 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
6
6
|
};
|
|
7
7
|
import { BaseAction } from "@memberjunction/actions";
|
|
8
8
|
import { Metadata, LogError, RunView } from "@memberjunction/core";
|
|
9
|
-
import { RegisterClass } from "@memberjunction/global";
|
|
10
|
-
import { AddOutput,
|
|
9
|
+
import { EscapeSQLString, RegisterClass } from "@memberjunction/global";
|
|
10
|
+
import { AddOutput, CheckPersonalWrite, Failure, GetStringParam, LoadComponent, LoadOverride, MapToComponentStatus, WriteAtomically, } from "./_shared.js";
|
|
11
11
|
/**
|
|
12
12
|
* Promote a Pending override to Active. Flips:
|
|
13
13
|
* - target Override: Status='Active'
|
|
@@ -15,13 +15,29 @@ import { AddOutput, CheckOverrideOwnership, Failure, GetStringParam, LoadCompone
|
|
|
15
15
|
* - prior Active sibling Override: Status='Inactive'
|
|
16
16
|
* - prior Active sibling Component: Status='Inactive'
|
|
17
17
|
*
|
|
18
|
-
* "Sibling" =
|
|
19
|
-
*
|
|
20
|
-
*
|
|
18
|
+
* "Sibling" = another of the caller's User-scope overrides on the same
|
|
19
|
+
* EntityID that is currently Status='Active'. The target is the row identified
|
|
20
|
+
* by the input `OverrideID`.
|
|
21
21
|
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
22
|
+
* Only the caller's own User-scope overrides can be activated. A Role or Global
|
|
23
|
+
* override, or another user's, returns FORBIDDEN for every caller (see
|
|
24
|
+
* `CheckPersonalWrite` in `_shared.ts`): shared forms are managed from Form
|
|
25
|
+
* Builder or the form's Manage drawer. The target's Component and Override flip
|
|
26
|
+
* to Active in one entity transaction. Each prior Active sibling is set aside after
|
|
27
|
+
* that transaction: its Override first, then its Component. Every prior is tried.
|
|
28
|
+
* If a save fails, the action returns `PERSIST_FAILED` that names each prior row
|
|
29
|
+
* not updated, and the target stays Active. A prior whose Override could not be
|
|
30
|
+
* set aside is still Active, so a retry sets it aside. A prior whose Override is
|
|
31
|
+
* set aside but whose Component status could not be updated is not found by a
|
|
32
|
+
* retry, and its Component keeps its old status.
|
|
33
|
+
*
|
|
34
|
+
* Idempotency. If the target Override is already Active, the caller's other
|
|
35
|
+
* Active overrides on the entity are set aside and the action returns SUCCESS
|
|
36
|
+
* with a no-op message that carries `DemotedCount`. So a retry after
|
|
37
|
+
* `PERSIST_FAILED` sets aside a prior whose Override could not be set aside; a
|
|
38
|
+
* prior whose Component status could not be updated is not found again. If the
|
|
39
|
+
* target is Inactive, that's a misuse — we surface NOT_PENDING so the agent / UI
|
|
40
|
+
* can ask the user what they really want.
|
|
25
41
|
*
|
|
26
42
|
* Inputs:
|
|
27
43
|
* - `OverrideID` (required, string) — the Pending override to activate
|
|
@@ -29,7 +45,7 @@ import { AddOutput, CheckOverrideOwnership, Failure, GetStringParam, LoadCompone
|
|
|
29
45
|
* Outputs:
|
|
30
46
|
* - `ComponentID` — the Component now Active
|
|
31
47
|
* - `OverrideID` — echoed for convenience
|
|
32
|
-
* - `PreviousActiveOverrideID` — the override that was demoted (or null)
|
|
48
|
+
* - `PreviousActiveOverrideID` — the first override that was demoted (or null)
|
|
33
49
|
*/
|
|
34
50
|
let ActivateInteractiveFormVersionAction = class ActivateInteractiveFormVersionAction extends BaseAction {
|
|
35
51
|
async InternalRunAction(params) {
|
|
@@ -48,75 +64,62 @@ let ActivateInteractiveFormVersionAction = class ActivateInteractiveFormVersionA
|
|
|
48
64
|
if (!target) {
|
|
49
65
|
return Failure("OVERRIDE_NOT_FOUND", `EntityFormOverride '${overrideID}' not found.`);
|
|
50
66
|
}
|
|
51
|
-
const ownershipFail =
|
|
67
|
+
const ownershipFail = CheckPersonalWrite(target, user);
|
|
52
68
|
if (ownershipFail)
|
|
53
69
|
return ownershipFail;
|
|
70
|
+
if (target.Status === 'Inactive') {
|
|
71
|
+
return Failure("NOT_PENDING", `Override ${overrideID} is Inactive. Use 'Revert Interactive Form' to restore an older version, not 'Activate'.`);
|
|
72
|
+
}
|
|
73
|
+
const priors = await findPriorActiveOverrides(provider, user, target);
|
|
74
|
+
if ('error' in priors)
|
|
75
|
+
return priors.error;
|
|
76
|
+
const previousActiveID = priors.rows[0]?.ID ?? null;
|
|
54
77
|
if (target.Status === 'Active') {
|
|
78
|
+
const notDemoted = await setPriorsAside(provider, user, target.ID, priors.rows);
|
|
79
|
+
if (notDemoted)
|
|
80
|
+
return notDemoted;
|
|
55
81
|
AddOutput(params, "ComponentID", target.ComponentID);
|
|
56
82
|
AddOutput(params, "OverrideID", target.ID);
|
|
57
|
-
AddOutput(params, "PreviousActiveOverrideID",
|
|
83
|
+
AddOutput(params, "PreviousActiveOverrideID", previousActiveID);
|
|
58
84
|
return { Success: true, ResultCode: "SUCCESS",
|
|
59
|
-
Message: JSON.stringify({
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
const scopeClause = target.Scope === 'User'
|
|
67
|
-
? `Scope='User' AND UserID='${target.UserID}'`
|
|
68
|
-
: target.Scope === 'Role'
|
|
69
|
-
? `Scope='Role' AND RoleID='${target.RoleID}'`
|
|
70
|
-
: `Scope='Global' AND UserID IS NULL AND RoleID IS NULL`;
|
|
71
|
-
const priorResult = await rv.RunView({
|
|
72
|
-
EntityName: "MJ: Entity Form Overrides",
|
|
73
|
-
ExtraFilter: `EntityID='${target.EntityID}' AND ${scopeClause} AND Status='Active' AND ID <> '${target.ID}'`,
|
|
74
|
-
Fields: ['ID', 'ComponentID'],
|
|
75
|
-
ResultType: 'simple',
|
|
76
|
-
}, user);
|
|
77
|
-
if (!priorResult.Success) {
|
|
78
|
-
return Failure("QUERY_FAILED", `Prior-active lookup failed: ${priorResult.ErrorMessage ?? 'unknown error'}`);
|
|
85
|
+
Message: JSON.stringify({
|
|
86
|
+
noop: true,
|
|
87
|
+
OverrideID: target.ID,
|
|
88
|
+
ComponentID: target.ComponentID,
|
|
89
|
+
PreviousActiveOverrideID: previousActiveID,
|
|
90
|
+
DemotedCount: priors.rows.length,
|
|
91
|
+
}) };
|
|
79
92
|
}
|
|
80
93
|
// Promote target's component.
|
|
81
94
|
const newComponent = await LoadComponent(provider, user, target.ComponentID);
|
|
82
95
|
if (!newComponent) {
|
|
83
96
|
return Failure("COMPONENT_NOT_FOUND", `Override ${overrideID} points at Component ${target.ComponentID} which no longer exists.`);
|
|
84
97
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
}
|
|
90
|
-
target.Status = 'Active';
|
|
91
|
-
const tSaved = await target.Save();
|
|
92
|
-
if (!tSaved) {
|
|
93
|
-
return Failure("PERSIST_FAILED", `Could not flip Override to Active: ${target.LatestResult?.CompleteMessage ?? 'unknown error'}`);
|
|
94
|
-
}
|
|
95
|
-
// Demote priors. Component AND Override flipped in lock-step.
|
|
96
|
-
let firstPriorID = null;
|
|
97
|
-
for (const prior of priorResult.Results ?? []) {
|
|
98
|
-
if (!firstPriorID)
|
|
99
|
-
firstPriorID = prior.ID;
|
|
100
|
-
const priorO = await LoadOverride(provider, user, prior.ID);
|
|
101
|
-
const priorC = await LoadComponent(provider, user, prior.ComponentID);
|
|
102
|
-
if (priorO) {
|
|
103
|
-
priorO.Status = 'Inactive';
|
|
104
|
-
await priorO.Save();
|
|
98
|
+
const promoted = await WriteAtomically(provider, async () => {
|
|
99
|
+
newComponent.Status = MapToComponentStatus('Active');
|
|
100
|
+
if (!(await newComponent.Save())) {
|
|
101
|
+
return { error: Failure("PERSIST_FAILED", `Could not flip Component to Active: ${newComponent.LatestResult?.CompleteMessage ?? 'unknown error'}`) };
|
|
105
102
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
103
|
+
target.Status = 'Active';
|
|
104
|
+
if (!(await target.Save())) {
|
|
105
|
+
return { error: Failure("PERSIST_FAILED", `Could not flip Override to Active: ${target.LatestResult?.CompleteMessage ?? 'unknown error'}`) };
|
|
109
106
|
}
|
|
110
|
-
|
|
107
|
+
return { ok: true };
|
|
108
|
+
});
|
|
109
|
+
if ('error' in promoted)
|
|
110
|
+
return promoted.error;
|
|
111
|
+
const notDemoted = await setPriorsAside(provider, user, target.ID, priors.rows);
|
|
112
|
+
if (notDemoted)
|
|
113
|
+
return notDemoted;
|
|
111
114
|
AddOutput(params, "ComponentID", target.ComponentID);
|
|
112
115
|
AddOutput(params, "OverrideID", target.ID);
|
|
113
|
-
AddOutput(params, "PreviousActiveOverrideID",
|
|
116
|
+
AddOutput(params, "PreviousActiveOverrideID", previousActiveID);
|
|
114
117
|
return { Success: true, ResultCode: "SUCCESS",
|
|
115
118
|
Message: JSON.stringify({
|
|
116
119
|
OverrideID: target.ID,
|
|
117
120
|
ComponentID: target.ComponentID,
|
|
118
|
-
PreviousActiveOverrideID:
|
|
119
|
-
DemotedCount:
|
|
121
|
+
PreviousActiveOverrideID: previousActiveID,
|
|
122
|
+
DemotedCount: priors.rows.length,
|
|
120
123
|
}) };
|
|
121
124
|
}
|
|
122
125
|
catch (err) {
|
|
@@ -130,6 +133,59 @@ ActivateInteractiveFormVersionAction = __decorate([
|
|
|
130
133
|
RegisterClass(BaseAction, "__ActivateInteractiveFormVersion")
|
|
131
134
|
], ActivateInteractiveFormVersionAction);
|
|
132
135
|
export { ActivateInteractiveFormVersionAction };
|
|
136
|
+
/** The caller's other Active User-scope overrides on the target's entity, or a `QUERY_FAILED` result. */
|
|
137
|
+
async function findPriorActiveOverrides(provider, user, target) {
|
|
138
|
+
const rv = RunView.FromMetadataProvider(provider);
|
|
139
|
+
const result = await rv.RunView({
|
|
140
|
+
EntityName: "MJ: Entity Form Overrides",
|
|
141
|
+
ExtraFilter: `EntityID='${EscapeSQLString(target.EntityID)}' AND Scope='User' AND UserID='${EscapeSQLString(target.UserID ?? '')}' AND Status='Active' AND ID <> '${EscapeSQLString(target.ID)}'`,
|
|
142
|
+
Fields: ['ID', 'ComponentID'],
|
|
143
|
+
ResultType: 'simple',
|
|
144
|
+
}, user);
|
|
145
|
+
if (!result.Success) {
|
|
146
|
+
return { error: Failure("QUERY_FAILED", `Prior-active lookup failed: ${result.ErrorMessage ?? 'unknown error'}`) };
|
|
147
|
+
}
|
|
148
|
+
return { rows: result.Results ?? [] };
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Sets each prior version aside: its Override to Inactive, then its Component to Deprecated.
|
|
152
|
+
* Every prior is tried. Returns `PERSIST_FAILED` that names each prior row not updated, or null
|
|
153
|
+
* when every prior is set aside.
|
|
154
|
+
*
|
|
155
|
+
* The Override is saved first, so a Component that cannot be saved never leaves a second Active
|
|
156
|
+
* override. When a prior's Override cannot be loaded or saved, it is reported and its Component
|
|
157
|
+
* is left as it is, so the prior stays fully Active and a later lookup finds it again.
|
|
158
|
+
*/
|
|
159
|
+
async function setPriorsAside(provider, user, targetID, priors) {
|
|
160
|
+
const failures = [];
|
|
161
|
+
for (const prior of priors) {
|
|
162
|
+
const priorO = await LoadOverride(provider, user, prior.ID);
|
|
163
|
+
if (!priorO) {
|
|
164
|
+
failures.push(`The prior override ${prior.ID} could not be loaded, so it was not set aside.`);
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
priorO.Status = 'Inactive';
|
|
168
|
+
if (!(await priorO.Save())) {
|
|
169
|
+
failures.push(`The prior override ${prior.ID} could not be set aside (${reasonOf(priorO)}).`);
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
const priorC = await LoadComponent(provider, user, prior.ComponentID);
|
|
173
|
+
if (priorC) {
|
|
174
|
+
priorC.Status = MapToComponentStatus('Inactive');
|
|
175
|
+
if (!(await priorC.Save())) {
|
|
176
|
+
failures.push(`The prior override ${prior.ID} is set aside, but the status of its component ` +
|
|
177
|
+
`${prior.ComponentID} could not be updated (${reasonOf(priorC)}).`);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return failures.length > 0
|
|
182
|
+
? Failure("PERSIST_FAILED", `Override ${targetID} is now Active. ${failures.join(' ')}`)
|
|
183
|
+
: null;
|
|
184
|
+
}
|
|
185
|
+
/** Why an entity's last save failed, as its latest result reports it. */
|
|
186
|
+
function reasonOf(entity) {
|
|
187
|
+
return entity.LatestResult?.CompleteMessage ?? 'unknown error';
|
|
188
|
+
}
|
|
133
189
|
/** Tree-shaking guard. */
|
|
134
190
|
export function LoadActivateInteractiveFormVersionAction() {
|
|
135
191
|
if (false) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"activate-interactive-form-version.action.js","sourceRoot":"","sources":["../../../src/custom/interactive-forms/activate-interactive-form-version.action.ts"],"names":[],"mappings":";;;;;;AACA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"activate-interactive-form-version.action.js","sourceRoot":"","sources":["../../../src/custom/interactive-forms/activate-interactive-form-version.action.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { ActionResultSimple, RunActionParams } from "@memberjunction/actions-base";
|
|
2
|
+
import { BaseAction } from "@memberjunction/actions";
|
|
3
|
+
/**
|
|
4
|
+
* Create a net-new form contribution for the requesting user.
|
|
5
|
+
*
|
|
6
|
+
* Reads the registration intent from `spec.formContribution` (slot, key, claims,
|
|
7
|
+
* presentation, title). Writes a `MJ: Components` row (Type='Widget', v1.0.0, Draft)
|
|
8
|
+
* and a `MJ: Entity Form Contributions` row (Scope='User', Status='Pending').
|
|
9
|
+
* Activation is a separate step (`Activate Form Contribution Version`), which the
|
|
10
|
+
* "Add to my form" apply flow runs immediately after Create.
|
|
11
|
+
*
|
|
12
|
+
* **Security clamp — Scope.** This action *always* writes `Scope='User'`,
|
|
13
|
+
* `UserID=ctx.user.ID`. An agent cannot write Global or Role contributions that would
|
|
14
|
+
* change other users' forms. Promotion is a deliberate human act.
|
|
15
|
+
*
|
|
16
|
+
* `Precedence` is honored when supplied (the apply flow passes `incumbent + 1` after
|
|
17
|
+
* the user confirms replacing an installed contribution). It only ever affects the
|
|
18
|
+
* calling user's own form, so it is not clamped.
|
|
19
|
+
*
|
|
20
|
+
* **Atomicity.** The spec's claim is checked (INVALID_CLAIM) before anything is written, and
|
|
21
|
+
* the Component and row inserts run in one entity transaction, so a refused row leaves no
|
|
22
|
+
* Component behind.
|
|
23
|
+
*/
|
|
24
|
+
export declare class CreateFormContributionAction extends BaseAction {
|
|
25
|
+
protected InternalRunAction(params: RunActionParams): Promise<ActionResultSimple>;
|
|
26
|
+
/**
|
|
27
|
+
* Rejects a key the caller already holds on this entity, and fails with QUERY_FAILED when
|
|
28
|
+
* that cannot be checked. Covers derived keys too, because the key it tests is the one the
|
|
29
|
+
* row will actually carry.
|
|
30
|
+
*/
|
|
31
|
+
private checkKeyAvailable;
|
|
32
|
+
private extractInputs;
|
|
33
|
+
}
|
|
34
|
+
export declare function LoadCreateFormContributionAction(): void;
|
|
35
|
+
//# sourceMappingURL=create-form-contribution.action.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-form-contribution.action.d.ts","sourceRoot":"","sources":["../../../src/custom/interactive-forms/create-form-contribution.action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAiBrD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBACa,4BAA6B,SAAQ,UAAU;cAExC,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAiEvF;;;;OAIG;YACW,iBAAiB;IAwB/B,OAAO,CAAC,aAAa;CAkBxB;AAED,wBAAgB,gCAAgC,IAAI,IAAI,CAEvD"}
|
|
@@ -0,0 +1,149 @@
|
|
|
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 { BaseAction } from "@memberjunction/actions";
|
|
8
|
+
import { Metadata, LogError, RunView } from "@memberjunction/core";
|
|
9
|
+
import { EscapeSQLString, RegisterClass } from "@memberjunction/global";
|
|
10
|
+
import { AddOutput, Failure, GetPrecedenceParam, GetStringParam, InsertComponent, InsertContribution, LintFormPanelSpec, ParseSpecParam, ResolveContributionRegistration, WriteAtomically, } from "./_shared.js";
|
|
11
|
+
/**
|
|
12
|
+
* Create a net-new form contribution for the requesting user.
|
|
13
|
+
*
|
|
14
|
+
* Reads the registration intent from `spec.formContribution` (slot, key, claims,
|
|
15
|
+
* presentation, title). Writes a `MJ: Components` row (Type='Widget', v1.0.0, Draft)
|
|
16
|
+
* and a `MJ: Entity Form Contributions` row (Scope='User', Status='Pending').
|
|
17
|
+
* Activation is a separate step (`Activate Form Contribution Version`), which the
|
|
18
|
+
* "Add to my form" apply flow runs immediately after Create.
|
|
19
|
+
*
|
|
20
|
+
* **Security clamp — Scope.** This action *always* writes `Scope='User'`,
|
|
21
|
+
* `UserID=ctx.user.ID`. An agent cannot write Global or Role contributions that would
|
|
22
|
+
* change other users' forms. Promotion is a deliberate human act.
|
|
23
|
+
*
|
|
24
|
+
* `Precedence` is honored when supplied (the apply flow passes `incumbent + 1` after
|
|
25
|
+
* the user confirms replacing an installed contribution). It only ever affects the
|
|
26
|
+
* calling user's own form, so it is not clamped.
|
|
27
|
+
*
|
|
28
|
+
* **Atomicity.** The spec's claim is checked (INVALID_CLAIM) before anything is written, and
|
|
29
|
+
* the Component and row inserts run in one entity transaction, so a refused row leaves no
|
|
30
|
+
* Component behind.
|
|
31
|
+
*/
|
|
32
|
+
let CreateFormContributionAction = class CreateFormContributionAction extends BaseAction {
|
|
33
|
+
async InternalRunAction(params) {
|
|
34
|
+
try {
|
|
35
|
+
const inputs = this.extractInputs(params);
|
|
36
|
+
if ('error' in inputs)
|
|
37
|
+
return inputs.error;
|
|
38
|
+
const provider = params.Provider ?? Metadata.Provider;
|
|
39
|
+
if (!provider)
|
|
40
|
+
return Failure("NO_PROVIDER", "No metadata provider available.");
|
|
41
|
+
const user = params.ContextUser;
|
|
42
|
+
if (!user)
|
|
43
|
+
return Failure("NO_USER", "Action requires a ContextUser to clamp contribution scope.");
|
|
44
|
+
const entityInfo = provider.EntityByName(inputs.EntityName);
|
|
45
|
+
if (!entityInfo) {
|
|
46
|
+
return Failure("ENTITY_NOT_FOUND", `Entity '${inputs.EntityName}' is not registered with the active metadata provider.`);
|
|
47
|
+
}
|
|
48
|
+
// Lint before any persistence — fail-hard.
|
|
49
|
+
const lintFail = await LintFormPanelSpec(inputs.Spec, user);
|
|
50
|
+
if (lintFail)
|
|
51
|
+
return lintFail;
|
|
52
|
+
const registration = ResolveContributionRegistration(provider, inputs.Spec);
|
|
53
|
+
if ('error' in registration)
|
|
54
|
+
return registration.error;
|
|
55
|
+
// The duplicate check runs before the Component row is written, so a rejected
|
|
56
|
+
// create leaves nothing behind.
|
|
57
|
+
const writeKey = registration.WriteKey;
|
|
58
|
+
const keyCheck = writeKey
|
|
59
|
+
? await this.checkKeyAvailable(provider, user, entityInfo.ID, inputs.EntityName, writeKey)
|
|
60
|
+
: null;
|
|
61
|
+
if (keyCheck)
|
|
62
|
+
return keyCheck;
|
|
63
|
+
const written = await WriteAtomically(provider, async () => {
|
|
64
|
+
const componentInsert = await InsertComponent({
|
|
65
|
+
provider, user, spec: inputs.Spec, fallbackName: inputs.Name, description: inputs.Description,
|
|
66
|
+
version: "1.0.0", versionSequence: 1, componentStatus: 'Pending', componentType: 'Widget',
|
|
67
|
+
});
|
|
68
|
+
if ('error' in componentInsert)
|
|
69
|
+
return componentInsert;
|
|
70
|
+
const rowInsert = await InsertContribution({
|
|
71
|
+
provider, user, entityID: entityInfo.ID, componentID: componentInsert.id,
|
|
72
|
+
name: inputs.Name, description: inputs.Description, notes: inputs.Notes,
|
|
73
|
+
registration, status: 'Pending', precedence: inputs.Precedence,
|
|
74
|
+
});
|
|
75
|
+
if ('error' in rowInsert)
|
|
76
|
+
return rowInsert;
|
|
77
|
+
return { componentID: componentInsert.id, contributionID: rowInsert.id };
|
|
78
|
+
});
|
|
79
|
+
if ('error' in written)
|
|
80
|
+
return written.error;
|
|
81
|
+
AddOutput(params, "ContributionID", written.contributionID);
|
|
82
|
+
AddOutput(params, "ComponentID", written.componentID);
|
|
83
|
+
AddOutput(params, "Version", "1.0.0");
|
|
84
|
+
return {
|
|
85
|
+
Success: true, ResultCode: "SUCCESS",
|
|
86
|
+
Message: JSON.stringify({
|
|
87
|
+
ContributionID: written.contributionID, ComponentID: written.componentID, EntityName: entityInfo.Name,
|
|
88
|
+
ContributionKey: writeKey, Slot: registration.Contribution.slot,
|
|
89
|
+
Scope: "User", Status: "Pending", Version: "1.0.0",
|
|
90
|
+
}),
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
95
|
+
LogError(`CreateFormContributionAction: ${message}`);
|
|
96
|
+
return Failure("UNEXPECTED_ERROR", message);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Rejects a key the caller already holds on this entity, and fails with QUERY_FAILED when
|
|
101
|
+
* that cannot be checked. Covers derived keys too, because the key it tests is the one the
|
|
102
|
+
* row will actually carry.
|
|
103
|
+
*/
|
|
104
|
+
async checkKeyAvailable(provider, user, entityID, entityName, writeKey) {
|
|
105
|
+
const rv = RunView.FromMetadataProvider(provider);
|
|
106
|
+
const dup = await rv.RunView({
|
|
107
|
+
EntityName: "MJ: Entity Form Contributions",
|
|
108
|
+
ExtraFilter: `EntityID='${EscapeSQLString(entityID)}' AND Scope='User' AND UserID='${EscapeSQLString(user.ID)}' AND ContributionKey='${EscapeSQLString(writeKey)}' AND Status IN ('Active','Pending')`,
|
|
109
|
+
Fields: ['ID', 'Status'], ResultType: 'simple', MaxRows: 1,
|
|
110
|
+
}, user);
|
|
111
|
+
if (!dup.Success) {
|
|
112
|
+
return Failure("QUERY_FAILED", `Duplicate-key lookup failed: ${dup.ErrorMessage ?? 'unknown error'}`);
|
|
113
|
+
}
|
|
114
|
+
if ((dup.Results ?? []).length > 0) {
|
|
115
|
+
const existing = dup.Results[0];
|
|
116
|
+
return Failure("ALREADY_EXISTS", `A ${existing.Status} User-scope contribution '${writeKey}' already exists on '${entityName}' (ContributionID=${existing.ID}). Use 'Modify Form Contribution' on it.`);
|
|
117
|
+
}
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
extractInputs(params) {
|
|
121
|
+
const entityName = GetStringParam(params, "EntityName");
|
|
122
|
+
if (!entityName)
|
|
123
|
+
return { error: Failure("MISSING_PARAMETER", "Parameter 'EntityName' is required.") };
|
|
124
|
+
const name = GetStringParam(params, "Name");
|
|
125
|
+
if (!name)
|
|
126
|
+
return { error: Failure("MISSING_PARAMETER", "Parameter 'Name' is required.") };
|
|
127
|
+
const specRaw = params.Params.find(x => x.Name?.trim().toLowerCase() === "spec")?.Value;
|
|
128
|
+
if (specRaw == null)
|
|
129
|
+
return { error: Failure("MISSING_PARAMETER", "Parameter 'Spec' is required.") };
|
|
130
|
+
const parsed = ParseSpecParam(specRaw);
|
|
131
|
+
if ('error' in parsed)
|
|
132
|
+
return { error: Failure("LINT_FAILED", `Spec is not valid JSON: ${parsed.error}`) };
|
|
133
|
+
return {
|
|
134
|
+
EntityName: entityName, Spec: parsed, Name: name,
|
|
135
|
+
Description: GetStringParam(params, "Description"), Notes: GetStringParam(params, "Notes"),
|
|
136
|
+
Precedence: GetPrecedenceParam(params) ?? 0,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
CreateFormContributionAction = __decorate([
|
|
141
|
+
RegisterClass(BaseAction, "__CreateFormContribution")
|
|
142
|
+
], CreateFormContributionAction);
|
|
143
|
+
export { CreateFormContributionAction };
|
|
144
|
+
export function LoadCreateFormContributionAction() {
|
|
145
|
+
if (false) {
|
|
146
|
+
const _ = CreateFormContributionAction;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=create-form-contribution.action.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-form-contribution.action.js","sourceRoot":"","sources":["../../../src/custom/interactive-forms/create-form-contribution.action.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,9 @@ import { BaseAction } from "@memberjunction/actions";
|
|
|
13
13
|
* full variants list includes 'Pending' rows so the agent can recognize
|
|
14
14
|
* an in-flight refinement loop and reuse the Pending row instead of
|
|
15
15
|
* spawning a new one.
|
|
16
|
+
* - On an identity or permission entity only the caller's own `User` rows
|
|
17
|
+
* apply ({@link FormScopeAllowedOnEntity}), so a Role or Global form there
|
|
18
|
+
* is neither active nor listed.
|
|
16
19
|
*
|
|
17
20
|
* Output shape (JSON in `Message`, also surfaced as a `Result` output param):
|
|
18
21
|
* ```
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-active-form-for-entity.action.d.ts","sourceRoot":"","sources":["../../../src/custom/interactive-forms/get-active-form-for-entity.action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"get-active-form-for-entity.action.d.ts","sourceRoot":"","sources":["../../../src/custom/interactive-forms/get-active-form-for-entity.action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAMrD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,qBACa,4BAA6B,SAAQ,UAAU;cAExC,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAkKvF,OAAO,CAAC,cAAc;CAOzB;AAMD,qDAAqD;AACrD,wBAAgB,gCAAgC,IAAI,IAAI,CAIvD"}
|
|
@@ -7,6 +7,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
7
7
|
import { BaseAction } from "@memberjunction/actions";
|
|
8
8
|
import { Metadata, LogError, RunView } from "@memberjunction/core";
|
|
9
9
|
import { RegisterClass } from "@memberjunction/global";
|
|
10
|
+
import { FormScopeAllowedOnEntity } from "@memberjunction/core-entities";
|
|
10
11
|
/**
|
|
11
12
|
* Read-only action that returns the currently-resolved interactive-form
|
|
12
13
|
* override (if any) for the (entity, user) pair plus the full list of
|
|
@@ -20,6 +21,9 @@ import { RegisterClass } from "@memberjunction/global";
|
|
|
20
21
|
* full variants list includes 'Pending' rows so the agent can recognize
|
|
21
22
|
* an in-flight refinement loop and reuse the Pending row instead of
|
|
22
23
|
* spawning a new one.
|
|
24
|
+
* - On an identity or permission entity only the caller's own `User` rows
|
|
25
|
+
* apply ({@link FormScopeAllowedOnEntity}), so a Role or Global form there
|
|
26
|
+
* is neither active nor listed.
|
|
23
27
|
*
|
|
24
28
|
* Output shape (JSON in `Message`, also surfaced as a `Result` output param):
|
|
25
29
|
* ```
|
|
@@ -83,7 +87,7 @@ let GetActiveFormForEntityAction = class GetActiveFormForEntityAction extends Ba
|
|
|
83
87
|
if (!overrideResult.Success) {
|
|
84
88
|
return failure("QUERY_FAILED", `Override lookup failed: ${overrideResult.ErrorMessage ?? 'unknown error'}`);
|
|
85
89
|
}
|
|
86
|
-
const overrides = overrideResult.Results ?? [];
|
|
90
|
+
const overrides = (overrideResult.Results ?? []).filter(o => FormScopeAllowedOnEntity(entity.Name, o.Scope));
|
|
87
91
|
if (overrides.length === 0) {
|
|
88
92
|
const payload = { EntityName: entityName, Active: null, Variants: [] };
|
|
89
93
|
params.Params.push({ Name: "Result", Type: "Output", Value: payload });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-active-form-for-entity.action.js","sourceRoot":"","sources":["../../../src/custom/interactive-forms/get-active-form-for-entity.action.ts"],"names":[],"mappings":";;;;;;AACA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"get-active-form-for-entity.action.js","sourceRoot":"","sources":["../../../src/custom/interactive-forms/get-active-form-for-entity.action.ts"],"names":[],"mappings":"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"}
|