@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.
Files changed (86) hide show
  1. package/dist/custom/ai/base-find-agents.action.d.ts.map +1 -1
  2. package/dist/custom/ai/base-find-agents.action.js +2 -7
  3. package/dist/custom/ai/base-find-agents.action.js.map +1 -1
  4. package/dist/custom/ai/execute-agent.action.d.ts +10 -0
  5. package/dist/custom/ai/execute-agent.action.d.ts.map +1 -1
  6. package/dist/custom/ai/execute-agent.action.js +24 -1
  7. package/dist/custom/ai/execute-agent.action.js.map +1 -1
  8. package/dist/custom/ai/execute-ai-prompt.action.d.ts.map +1 -1
  9. package/dist/custom/ai/execute-ai-prompt.action.js +3 -0
  10. package/dist/custom/ai/execute-ai-prompt.action.js.map +1 -1
  11. package/dist/custom/ai/find-candidate-agents.action.d.ts.map +1 -1
  12. package/dist/custom/ai/find-candidate-agents.action.js +2 -1
  13. package/dist/custom/ai/find-candidate-agents.action.js.map +1 -1
  14. package/dist/custom/ai/generate-image.action.d.ts +67 -6
  15. package/dist/custom/ai/generate-image.action.d.ts.map +1 -1
  16. package/dist/custom/ai/generate-image.action.js +208 -141
  17. package/dist/custom/ai/generate-image.action.js.map +1 -1
  18. package/dist/custom/ai/run-decision.action.d.ts +45 -0
  19. package/dist/custom/ai/run-decision.action.d.ts.map +1 -0
  20. package/dist/custom/ai/run-decision.action.js +169 -0
  21. package/dist/custom/ai/run-decision.action.js.map +1 -0
  22. package/dist/custom/ai/summarize-content.action.d.ts.map +1 -1
  23. package/dist/custom/ai/summarize-content.action.js +3 -0
  24. package/dist/custom/ai/summarize-content.action.js.map +1 -1
  25. package/dist/custom/data/run-adhoc-query.action.d.ts.map +1 -1
  26. package/dist/custom/data/run-adhoc-query.action.js +3 -0
  27. package/dist/custom/data/run-adhoc-query.action.js.map +1 -1
  28. package/dist/custom/interactive-forms/_shared.d.ts +113 -31
  29. package/dist/custom/interactive-forms/_shared.d.ts.map +1 -1
  30. package/dist/custom/interactive-forms/_shared.js +198 -74
  31. package/dist/custom/interactive-forms/_shared.js.map +1 -1
  32. package/dist/custom/interactive-forms/activate-form-contribution-version.action.d.ts +23 -0
  33. package/dist/custom/interactive-forms/activate-form-contribution-version.action.d.ts.map +1 -0
  34. package/dist/custom/interactive-forms/activate-form-contribution-version.action.js +151 -0
  35. package/dist/custom/interactive-forms/activate-form-contribution-version.action.js.map +1 -0
  36. package/dist/custom/interactive-forms/activate-interactive-form-version.action.d.ts +23 -7
  37. package/dist/custom/interactive-forms/activate-interactive-form-version.action.d.ts.map +1 -1
  38. package/dist/custom/interactive-forms/activate-interactive-form-version.action.js +114 -58
  39. package/dist/custom/interactive-forms/activate-interactive-form-version.action.js.map +1 -1
  40. package/dist/custom/interactive-forms/create-form-contribution.action.d.ts +35 -0
  41. package/dist/custom/interactive-forms/create-form-contribution.action.d.ts.map +1 -0
  42. package/dist/custom/interactive-forms/create-form-contribution.action.js +149 -0
  43. package/dist/custom/interactive-forms/create-form-contribution.action.js.map +1 -0
  44. package/dist/custom/interactive-forms/get-active-form-for-entity.action.d.ts +3 -0
  45. package/dist/custom/interactive-forms/get-active-form-for-entity.action.d.ts.map +1 -1
  46. package/dist/custom/interactive-forms/get-active-form-for-entity.action.js +5 -1
  47. package/dist/custom/interactive-forms/get-active-form-for-entity.action.js.map +1 -1
  48. package/dist/custom/interactive-forms/get-form-composition-for-entity.action.d.ts +59 -0
  49. package/dist/custom/interactive-forms/get-form-composition-for-entity.action.d.ts.map +1 -0
  50. package/dist/custom/interactive-forms/get-form-composition-for-entity.action.js +313 -0
  51. package/dist/custom/interactive-forms/get-form-composition-for-entity.action.js.map +1 -0
  52. package/dist/custom/interactive-forms/get-form-contributions-for-entity.action.d.ts +47 -0
  53. package/dist/custom/interactive-forms/get-form-contributions-for-entity.action.d.ts.map +1 -0
  54. package/dist/custom/interactive-forms/get-form-contributions-for-entity.action.js +115 -0
  55. package/dist/custom/interactive-forms/get-form-contributions-for-entity.action.js.map +1 -0
  56. package/dist/custom/interactive-forms/index.d.ts +5 -0
  57. package/dist/custom/interactive-forms/index.d.ts.map +1 -1
  58. package/dist/custom/interactive-forms/index.js +5 -0
  59. package/dist/custom/interactive-forms/index.js.map +1 -1
  60. package/dist/custom/interactive-forms/modify-form-contribution.action.d.ts +36 -0
  61. package/dist/custom/interactive-forms/modify-form-contribution.action.d.ts.map +1 -0
  62. package/dist/custom/interactive-forms/modify-form-contribution.action.js +181 -0
  63. package/dist/custom/interactive-forms/modify-form-contribution.action.js.map +1 -0
  64. package/dist/custom/interactive-forms/modify-interactive-form.action.d.ts +13 -11
  65. package/dist/custom/interactive-forms/modify-interactive-form.action.d.ts.map +1 -1
  66. package/dist/custom/interactive-forms/modify-interactive-form.action.js +65 -64
  67. package/dist/custom/interactive-forms/modify-interactive-form.action.js.map +1 -1
  68. package/dist/custom/interactive-forms/revert-interactive-form.action.d.ts +12 -0
  69. package/dist/custom/interactive-forms/revert-interactive-form.action.d.ts.map +1 -1
  70. package/dist/custom/interactive-forms/revert-interactive-form.action.js +29 -4
  71. package/dist/custom/interactive-forms/revert-interactive-form.action.js.map +1 -1
  72. package/dist/custom/record-cloning/clone-record.action.d.ts +15 -0
  73. package/dist/custom/record-cloning/clone-record.action.d.ts.map +1 -0
  74. package/dist/custom/record-cloning/clone-record.action.js +125 -0
  75. package/dist/custom/record-cloning/clone-record.action.js.map +1 -0
  76. package/dist/custom/record-cloning/clone-records.action.d.ts +15 -0
  77. package/dist/custom/record-cloning/clone-records.action.d.ts.map +1 -0
  78. package/dist/custom/record-cloning/clone-records.action.js +175 -0
  79. package/dist/custom/record-cloning/clone-records.action.js.map +1 -0
  80. package/dist/custom/utilities/vectorize-entity.action.js +1 -1
  81. package/dist/custom/utilities/vectorize-entity.action.js.map +1 -1
  82. package/dist/index.d.ts +3 -0
  83. package/dist/index.d.ts.map +1 -1
  84. package/dist/index.js +3 -0
  85. package/dist/index.js.map +1 -1
  86. package/package.json +42 -40
@@ -0,0 +1,36 @@
1
+ import { ActionResultSimple, RunActionParams } from "@memberjunction/actions-base";
2
+ import { BaseAction } from "@memberjunction/actions";
3
+ /**
4
+ * Modify one of the caller's own form contributions.
5
+ *
6
+ * | Source Status | `VersionBumpKind` | Behavior |
7
+ * |---|---|---|
8
+ * | Pending | `in-place` (default) | Overwrite the source Component's spec; refresh the row's registration fields; append Notes |
9
+ * | Pending | `patch`/`minor`/`major` | Supersede source row + component; insert new Pending component + row |
10
+ * | Active | `in-place` | `INVALID_BUMP_FOR_STATUS` |
11
+ * | Active | bump (default `minor`) | New Pending component + row; the live Active row is untouched |
12
+ * | Inactive | `in-place` | `INVALID_BUMP_FOR_STATUS` |
13
+ * | Inactive | bump (default `patch`) | Branch from the historical version: new Pending component + row |
14
+ *
15
+ * Only the caller's own User-scope rows can be modified; a Role or Global row, or another user's
16
+ * row, returns `FORBIDDEN` (shared panels are managed from the form's Manage drawer or Form
17
+ * Builder). A new row is written User-scope, as `Create` writes it. The row's registration fields
18
+ * are refreshed from the spec's `formContribution` block, so a moved slot or a renamed title lands
19
+ * together with the code that assumes it. An optional `Precedence` replaces the row's precedence.
20
+ *
21
+ * The spec's claim is checked (`INVALID_CLAIM`) before anything is written, and the component and
22
+ * row writes run in one entity transaction, so a refused row save leaves the component unchanged.
23
+ */
24
+ export declare class ModifyFormContributionAction extends BaseAction {
25
+ protected InternalRunAction(params: RunActionParams): Promise<ActionResultSimple>;
26
+ private extractInputs;
27
+ /** Overwrite the Pending source's component and refresh its registration fields. */
28
+ private modifyInPlace;
29
+ /** Insert a new Pending component + User-scope row, superseding the source only when it was Pending. */
30
+ private createNextVersion;
31
+ /** Mark the source row and its component Inactive; a refused save fails the whole modification. */
32
+ private supersede;
33
+ private success;
34
+ }
35
+ export declare function LoadModifyFormContributionAction(): void;
36
+ //# sourceMappingURL=modify-form-contribution.action.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modify-form-contribution.action.d.ts","sourceRoot":"","sources":["../../../src/custom/interactive-forms/modify-form-contribution.action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AA0DrD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBACa,4BAA6B,SAAQ,UAAU;cAExC,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA2CvF,OAAO,CAAC,aAAa;IAmBrB,oFAAoF;YACtE,aAAa;IAuB3B,wGAAwG;YAC1F,iBAAiB;IA8B/B,mGAAmG;YACrF,SAAS;IAiBvB,OAAO,CAAC,OAAO;CAOlB;AAED,wBAAgB,gCAAgC,IAAI,IAAI,CAEvD"}
@@ -0,0 +1,181 @@
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 } from "@memberjunction/core";
9
+ import { RegisterClass } from "@memberjunction/global";
10
+ import { ApplyContributionSpecToRow } from "@memberjunction/core-entities";
11
+ import { AddOutput, BumpVersion, CheckPersonalWrite, Failure, GetPrecedenceParam, GetStringParam, InsertComponent, InsertContribution, LintFormPanelSpec, LoadComponent, LoadContribution, MapToComponentStatus, ParseSpecParam, ParseVersionBumpKind, ResolveContributionRegistration, WriteAtomically, } from "./_shared.js";
12
+ /**
13
+ * Modify one of the caller's own form contributions.
14
+ *
15
+ * | Source Status | `VersionBumpKind` | Behavior |
16
+ * |---|---|---|
17
+ * | Pending | `in-place` (default) | Overwrite the source Component's spec; refresh the row's registration fields; append Notes |
18
+ * | Pending | `patch`/`minor`/`major` | Supersede source row + component; insert new Pending component + row |
19
+ * | Active | `in-place` | `INVALID_BUMP_FOR_STATUS` |
20
+ * | Active | bump (default `minor`) | New Pending component + row; the live Active row is untouched |
21
+ * | Inactive | `in-place` | `INVALID_BUMP_FOR_STATUS` |
22
+ * | Inactive | bump (default `patch`) | Branch from the historical version: new Pending component + row |
23
+ *
24
+ * Only the caller's own User-scope rows can be modified; a Role or Global row, or another user's
25
+ * row, returns `FORBIDDEN` (shared panels are managed from the form's Manage drawer or Form
26
+ * Builder). A new row is written User-scope, as `Create` writes it. The row's registration fields
27
+ * are refreshed from the spec's `formContribution` block, so a moved slot or a renamed title lands
28
+ * together with the code that assumes it. An optional `Precedence` replaces the row's precedence.
29
+ *
30
+ * The spec's claim is checked (`INVALID_CLAIM`) before anything is written, and the component and
31
+ * row writes run in one entity transaction, so a refused row save leaves the component unchanged.
32
+ */
33
+ let ModifyFormContributionAction = class ModifyFormContributionAction extends BaseAction {
34
+ async InternalRunAction(params) {
35
+ try {
36
+ const inputs = this.extractInputs(params);
37
+ if ('error' in inputs)
38
+ return inputs.error;
39
+ const provider = params.Provider ?? Metadata.Provider;
40
+ if (!provider)
41
+ return Failure("NO_PROVIDER", "No metadata provider available.");
42
+ const user = params.ContextUser;
43
+ if (!user)
44
+ return Failure("NO_USER", "Action requires a ContextUser.");
45
+ const source = await LoadContribution(provider, user, inputs.ContributionID);
46
+ if (!source)
47
+ return Failure("CONTRIBUTION_NOT_FOUND", `Contribution '${inputs.ContributionID}' not found.`);
48
+ const forbidden = CheckPersonalWrite(source, user);
49
+ if (forbidden)
50
+ return forbidden;
51
+ const lintFail = await LintFormPanelSpec(inputs.Spec, user);
52
+ if (lintFail)
53
+ return lintFail;
54
+ const registration = ResolveContributionRegistration(provider, inputs.Spec, source.ContributionKey);
55
+ if ('error' in registration)
56
+ return registration.error;
57
+ const sourceComponent = await LoadComponent(provider, user, source.ComponentID);
58
+ if (!sourceComponent) {
59
+ return Failure("COMPONENT_NOT_FOUND", `Contribution ${source.ID} points at Component ${source.ComponentID} which no longer exists.`);
60
+ }
61
+ const bump = inputs.Bump
62
+ ?? (source.Status === 'Pending' ? 'in-place' : source.Status === 'Active' ? 'minor' : 'patch');
63
+ if (bump === 'in-place' && source.Status !== 'Pending') {
64
+ return Failure("INVALID_BUMP_FOR_STATUS", `In-place modification is only valid for a Pending contribution; ${source.ID} is ${source.Status}. Supply VersionBumpKind patch | minor | major.`);
65
+ }
66
+ const ctx = { source, sourceComponent, registration, inputs, provider, user };
67
+ const written = await WriteAtomically(provider, () => bump === 'in-place' ? this.modifyInPlace(ctx) : this.createNextVersion(ctx, bump));
68
+ if ('error' in written)
69
+ return written.error;
70
+ return this.success(params, written);
71
+ }
72
+ catch (err) {
73
+ const message = err instanceof Error ? err.message : String(err);
74
+ LogError(`ModifyFormContributionAction: ${message}`);
75
+ return Failure("UNEXPECTED_ERROR", message);
76
+ }
77
+ }
78
+ extractInputs(params) {
79
+ const contributionID = GetStringParam(params, "ContributionID");
80
+ if (!contributionID)
81
+ return { error: Failure("MISSING_PARAMETER", "Parameter 'ContributionID' is required.") };
82
+ const specRaw = params.Params.find(x => x.Name?.trim().toLowerCase() === "spec")?.Value;
83
+ if (specRaw == null)
84
+ return { error: Failure("MISSING_PARAMETER", "Parameter 'Spec' is required.") };
85
+ const parsed = ParseSpecParam(specRaw);
86
+ if ('error' in parsed)
87
+ return { error: Failure("LINT_FAILED", `Spec is not valid JSON: ${parsed.error}`) };
88
+ const bumpRaw = GetStringParam(params, "VersionBumpKind");
89
+ const bump = bumpRaw ? ParseVersionBumpKind(bumpRaw) : null;
90
+ if (bumpRaw && !bump) {
91
+ return { error: Failure("INVALID_PARAMETER", `VersionBumpKind '${bumpRaw}' is not one of in-place | patch | minor | major.`) };
92
+ }
93
+ return {
94
+ ContributionID: contributionID, Spec: parsed, Notes: GetStringParam(params, "Notes"),
95
+ Bump: bump, Precedence: GetPrecedenceParam(params),
96
+ };
97
+ }
98
+ /** Overwrite the Pending source's component and refresh its registration fields. */
99
+ async modifyInPlace(ctx) {
100
+ const { source, sourceComponent, registration, inputs } = ctx;
101
+ const spec = inputs.Spec;
102
+ sourceComponent.Specification = JSON.stringify(spec);
103
+ sourceComponent.Title = spec.title ?? sourceComponent.Title;
104
+ sourceComponent.Description = spec.description ?? sourceComponent.Description;
105
+ if (!(await sourceComponent.Save())) {
106
+ return { error: Failure("PERSIST_FAILED", `Component update failed: ${sourceComponent.LatestResult?.CompleteMessage ?? 'unknown error'}`) };
107
+ }
108
+ ApplyContributionSpecToRow(source, registration.Contribution, registration.RowOptions);
109
+ if (inputs.Precedence != null)
110
+ source.Precedence = inputs.Precedence;
111
+ if (inputs.Notes)
112
+ source.Notes = `${source.Notes ? source.Notes + "\n" : ""}${inputs.Notes}`;
113
+ if (!(await source.Save())) {
114
+ return { error: Failure("PERSIST_FAILED", `Contribution update failed: ${source.LatestResult?.CompleteMessage ?? 'unknown error'}`) };
115
+ }
116
+ return {
117
+ ContributionID: source.ID, ComponentID: source.ComponentID,
118
+ Version: sourceComponent.Version ?? '1.0.0', Mode: 'in-place', BumpKind: 'in-place',
119
+ };
120
+ }
121
+ /** Insert a new Pending component + User-scope row, superseding the source only when it was Pending. */
122
+ async createNextVersion(ctx, bump) {
123
+ const { source, sourceComponent, registration, inputs, provider, user } = ctx;
124
+ const spec = inputs.Spec;
125
+ const nextVersion = BumpVersion(sourceComponent.Version, bump);
126
+ const componentInsert = await InsertComponent({
127
+ provider, user, spec, fallbackName: sourceComponent.Name,
128
+ description: spec.description ?? sourceComponent.Description,
129
+ version: nextVersion, versionSequence: (sourceComponent.VersionSequence ?? 0) + 1,
130
+ componentStatus: 'Pending', componentType: 'Widget',
131
+ });
132
+ if ('error' in componentInsert)
133
+ return componentInsert;
134
+ const rowInsert = await InsertContribution({
135
+ provider, user, entityID: source.EntityID, componentID: componentInsert.id,
136
+ name: source.Name, description: spec.description ?? source.Description, notes: inputs.Notes,
137
+ registration, status: 'Pending', precedence: inputs.Precedence ?? source.Precedence ?? 0,
138
+ });
139
+ if ('error' in rowInsert)
140
+ return rowInsert;
141
+ if (source.Status === 'Pending') {
142
+ // Bumping from a Pending draft supersedes it — there is nothing live to preserve.
143
+ const superseded = await this.supersede(source, sourceComponent);
144
+ if (superseded)
145
+ return superseded;
146
+ }
147
+ return {
148
+ ContributionID: rowInsert.id, ComponentID: componentInsert.id,
149
+ Version: nextVersion, Mode: 'new-version', BumpKind: bump,
150
+ };
151
+ }
152
+ /** Mark the source row and its component Inactive; a refused save fails the whole modification. */
153
+ async supersede(source, sourceComponent) {
154
+ source.Status = 'Inactive';
155
+ if (!(await source.Save())) {
156
+ return { error: Failure("PERSIST_FAILED", `Could not supersede contribution ${source.ID}: ${source.LatestResult?.CompleteMessage ?? 'unknown error'}`) };
157
+ }
158
+ sourceComponent.Status = MapToComponentStatus('Inactive');
159
+ if (!(await sourceComponent.Save())) {
160
+ return { error: Failure("PERSIST_FAILED", `Could not supersede component ${sourceComponent.ID}: ${sourceComponent.LatestResult?.CompleteMessage ?? 'unknown error'}`) };
161
+ }
162
+ return null;
163
+ }
164
+ success(params, payload) {
165
+ AddOutput(params, "ContributionID", payload.ContributionID);
166
+ AddOutput(params, "ComponentID", payload.ComponentID);
167
+ AddOutput(params, "Version", payload.Version);
168
+ AddOutput(params, "Mode", payload.Mode);
169
+ return { Success: true, ResultCode: "SUCCESS", Message: JSON.stringify(payload) };
170
+ }
171
+ };
172
+ ModifyFormContributionAction = __decorate([
173
+ RegisterClass(BaseAction, "__ModifyFormContribution")
174
+ ], ModifyFormContributionAction);
175
+ export { ModifyFormContributionAction };
176
+ export function LoadModifyFormContributionAction() {
177
+ if (false) {
178
+ const _ = ModifyFormContributionAction;
179
+ }
180
+ }
181
+ //# sourceMappingURL=modify-form-contribution.action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modify-form-contribution.action.js","sourceRoot":"","sources":["../../../src/custom/interactive-forms/modify-form-contribution.action.ts"],"names":[],"mappings":";;;;;;AACA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,0BAA0B,EAA+D,MAAM,+BAA+B,CAAC;AAExI,OAAO,EACH,SAAS,EACT,WAAW,EACX,kBAAkB,EAClB,OAAO,EACP,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,EACd,oBAAoB,EACpB,+BAA+B,EAC/B,eAAe,GAGlB,MAAM,WAAW,CAAC;AAkCnB;;;;;;;;;;;;;;;;;;;;GAoBG;AAEI,IAAM,4BAA4B,GAAlC,MAAM,4BAA6B,SAAQ,UAAU;IAE9C,KAAK,CAAC,iBAAiB,CAAC,MAAuB;QACrD,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAC1C,IAAI,OAAO,IAAI,MAAM;gBAAE,OAAO,MAAM,CAAC,KAAK,CAAC;YAC3C,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC;YACtD,IAAI,CAAC,QAAQ;gBAAE,OAAO,OAAO,CAAC,aAAa,EAAE,iCAAiC,CAAC,CAAC;YAChF,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC;YAChC,IAAI,CAAC,IAAI;gBAAE,OAAO,OAAO,CAAC,SAAS,EAAE,gCAAgC,CAAC,CAAC;YAEvE,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;YAC7E,IAAI,CAAC,MAAM;gBAAE,OAAO,OAAO,CAAC,wBAAwB,EAAE,iBAAiB,MAAM,CAAC,cAAc,cAAc,CAAC,CAAC;YAC5G,MAAM,SAAS,GAAG,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACnD,IAAI,SAAS;gBAAE,OAAO,SAAS,CAAC;YAEhC,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC5D,IAAI,QAAQ;gBAAE,OAAO,QAAQ,CAAC;YAC9B,MAAM,YAAY,GAAG,+BAA+B,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC;YACpG,IAAI,OAAO,IAAI,YAAY;gBAAE,OAAO,YAAY,CAAC,KAAK,CAAC;YAEvD,MAAM,eAAe,GAAG,MAAM,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;YAChF,IAAI,CAAC,eAAe,EAAE,CAAC;gBACnB,OAAO,OAAO,CAAC,qBAAqB,EAChC,gBAAgB,MAAM,CAAC,EAAE,wBAAwB,MAAM,CAAC,WAAW,0BAA0B,CAAC,CAAC;YACvG,CAAC;YACD,MAAM,IAAI,GAAoB,MAAM,CAAC,IAAI;mBAClC,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YACnG,IAAI,IAAI,KAAK,UAAU,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBACrD,OAAO,OAAO,CAAC,yBAAyB,EACpC,mEAAmE,MAAM,CAAC,EAAE,OAAO,MAAM,CAAC,MAAM,iDAAiD,CAAC,CAAC;YAC3J,CAAC;YAED,MAAM,GAAG,GAAkB,EAAE,MAAM,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;YAC7F,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,QAAQ,EAAE,GAAG,EAAE,CACjD,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;YACvF,IAAI,OAAO,IAAI,OAAO;gBAAE,OAAO,OAAO,CAAC,KAAK,CAAC;YAC7C,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,QAAQ,CAAC,iCAAiC,OAAO,EAAE,CAAC,CAAC;YACrD,OAAO,OAAO,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;QAChD,CAAC;IACL,CAAC;IAEO,aAAa,CAAC,MAAuB;QACzC,MAAM,cAAc,GAAG,cAAc,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;QAChE,IAAI,CAAC,cAAc;YAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,mBAAmB,EAAE,yCAAyC,CAAC,EAAE,CAAC;QAC/G,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,EAAE,KAAK,CAAC;QACxF,IAAI,OAAO,IAAI,IAAI;YAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,mBAAmB,EAAE,+BAA+B,CAAC,EAAE,CAAC;QACrG,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,OAAO,IAAI,MAAM;YAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,aAAa,EAAE,2BAA2B,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;QAC3G,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;QAC1D,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5D,IAAI,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;YACnB,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,mBAAmB,EACvC,oBAAoB,OAAO,mDAAmD,CAAC,EAAE,CAAC;QAC1F,CAAC;QACD,OAAO;YACH,cAAc,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC;YACpF,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,kBAAkB,CAAC,MAAM,CAAC;SACrD,CAAC;IACN,CAAC;IAED,oFAAoF;IAC5E,KAAK,CAAC,aAAa,CAAC,GAAkB;QAC1C,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;QAC9D,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACzB,eAAe,CAAC,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACrD,eAAe,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,eAAe,CAAC,KAAK,CAAC;QAC5D,eAAe,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,eAAe,CAAC,WAAW,CAAC;QAC9E,IAAI,CAAC,CAAC,MAAM,eAAe,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YAClC,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,gBAAgB,EACpC,4BAA4B,eAAe,CAAC,YAAY,EAAE,eAAe,IAAI,eAAe,EAAE,CAAC,EAAE,CAAC;QAC1G,CAAC;QACD,0BAA0B,CAAC,MAAM,EAAE,YAAY,CAAC,YAAY,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC;QACvF,IAAI,MAAM,CAAC,UAAU,IAAI,IAAI;YAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QACrE,IAAI,MAAM,CAAC,KAAK;YAAE,MAAM,CAAC,KAAK,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;QAC7F,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YACzB,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,gBAAgB,EACpC,+BAA+B,MAAM,CAAC,YAAY,EAAE,eAAe,IAAI,eAAe,EAAE,CAAC,EAAE,CAAC;QACpG,CAAC;QACD,OAAO;YACH,cAAc,EAAE,MAAM,CAAC,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW;YAC1D,OAAO,EAAE,eAAe,CAAC,OAAO,IAAI,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU;SACtF,CAAC;IACN,CAAC;IAED,wGAAwG;IAChG,KAAK,CAAC,iBAAiB,CAAC,GAAkB,EAAE,IAAqB;QACrE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC;QAC9E,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACzB,MAAM,WAAW,GAAG,WAAW,CAAC,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC/D,MAAM,eAAe,GAAG,MAAM,eAAe,CAAC;YAC1C,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,eAAe,CAAC,IAAI;YACxD,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,eAAe,CAAC,WAAW;YAC5D,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC,eAAe,CAAC,eAAe,IAAI,CAAC,CAAC,GAAG,CAAC;YACjF,eAAe,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ;SACtD,CAAC,CAAC;QACH,IAAI,OAAO,IAAI,eAAe;YAAE,OAAO,eAAe,CAAC;QAEvD,MAAM,SAAS,GAAG,MAAM,kBAAkB,CAAC;YACvC,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,WAAW,EAAE,eAAe,CAAC,EAAE;YAC1E,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK;YAC3F,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,IAAI,CAAC;SAC3F,CAAC,CAAC;QACH,IAAI,OAAO,IAAI,SAAS;YAAE,OAAO,SAAS,CAAC;QAE3C,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC9B,kFAAkF;YAClF,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;YACjE,IAAI,UAAU;gBAAE,OAAO,UAAU,CAAC;QACtC,CAAC;QACD,OAAO;YACH,cAAc,EAAE,SAAS,CAAC,EAAE,EAAE,WAAW,EAAE,eAAe,CAAC,EAAE;YAC7D,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI;SAC5D,CAAC;IACN,CAAC;IAED,mGAAmG;IAC3F,KAAK,CAAC,SAAS,CACnB,MAAsC,EACtC,eAAkC;QAElC,MAAM,CAAC,MAAM,GAAG,UAAU,CAAC;QAC3B,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YACzB,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,gBAAgB,EACpC,oCAAoC,MAAM,CAAC,EAAE,KAAK,MAAM,CAAC,YAAY,EAAE,eAAe,IAAI,eAAe,EAAE,CAAC,EAAE,CAAC;QACvH,CAAC;QACD,eAAe,CAAC,MAAM,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAC;QAC1D,IAAI,CAAC,CAAC,MAAM,eAAe,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YAClC,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,gBAAgB,EACpC,iCAAiC,eAAe,CAAC,EAAE,KAAK,eAAe,CAAC,YAAY,EAAE,eAAe,IAAI,eAAe,EAAE,CAAC,EAAE,CAAC;QACtI,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAEO,OAAO,CAAC,MAAuB,EAAE,OAAsB;QAC3D,SAAS,CAAC,MAAM,EAAE,gBAAgB,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;QAC5D,SAAS,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;QACtD,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAC9C,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACxC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;IACtF,CAAC;CACJ,CAAA;AAhJY,4BAA4B;IADxC,aAAa,CAAC,UAAU,EAAE,0BAA0B,CAAC;GACzC,4BAA4B,CAgJxC;;AAED,MAAM,UAAU,gCAAgC;IAC5C,IAAI,KAAgB,EAAE,CAAC;QAAC,MAAM,CAAC,GAAY,4BAA4B,CAAC;IAAC,CAAC;AAC9E,CAAC"}
@@ -20,18 +20,15 @@ import { BaseAction } from "@memberjunction/actions";
20
20
  * Pending sources stay in-place, Active sources bump minor, Inactive
21
21
  * sources bump patch (the conservative branch-from-historical case).
22
22
  *
23
- * **Security clamp.** Modify *always* writes a User-scope Pending Override,
24
- * regardless of the original override's scope. Even if the caller is
25
- * modifying a Role-scope or Global override (which they have permission to
26
- * read because they pass the ownership check), the new Pending sibling
27
- * is always User-scoped to the calling user. Scope promotion (User → Role
28
- * → Global) is a separate, deliberate human action with its own permission
29
- * gate in Component Studio / Form Builder. The agent cannot widen scope
30
- * through Modify any more than through Create.
23
+ * **Ownership.** Only the caller's own User-scope overrides can be modified.
24
+ * A Role or Global override, or another user's, returns FORBIDDEN for every
25
+ * caller (see `CheckPersonalWrite` in `_shared.ts`): shared forms are managed
26
+ * from Form Builder or the form's Manage drawer. A new Pending Override is
27
+ * written User-scope, as Create writes it.
31
28
  *
32
- * **Ownership check.** The caller must own (or have role membership for, or
33
- * be admin over) the existing override they're modifying. See
34
- * `checkOverrideOwnership` in `_shared.ts`. Returns FORBIDDEN if rejected.
29
+ * **Atomicity.** The in-place Component and Override writes run in one entity
30
+ * transaction, and so do the new-version Component and Override inserts, so a
31
+ * refused Override save leaves no Component change behind.
35
32
  *
36
33
  * Inputs:
37
34
  * - `OverrideID` (required, string) — the override to modify
@@ -47,6 +44,11 @@ import { BaseAction } from "@memberjunction/actions";
47
44
  */
48
45
  export declare class ModifyInteractiveFormAction extends BaseAction {
49
46
  protected InternalRunAction(params: RunActionParams): Promise<ActionResultSimple>;
47
+ /**
48
+ * Overwrite the Pending Component's spec and append any notes to the Override. Returns an
49
+ * `{ error }` result on a refused save, so the caller's transaction rolls both back.
50
+ */
51
+ private modifyInPlace;
50
52
  private findParam;
51
53
  }
52
54
  /** Tree-shaking guard. */
@@ -1 +1 @@
1
- {"version":3,"file":"modify-interactive-form.action.d.ts","sourceRoot":"","sources":["../../../src/custom/interactive-forms/modify-interactive-form.action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAWrD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,qBACa,2BAA4B,SAAQ,UAAU;cAEvC,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAuOvF,OAAO,CAAC,SAAS;CAKpB;AAED,0BAA0B;AAC1B,wBAAgB,+BAA+B,IAAI,IAAI,CAItD"}
1
+ {"version":3,"file":"modify-interactive-form.action.d.ts","sourceRoot":"","sources":["../../../src/custom/interactive-forms/modify-interactive-form.action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAYrD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,qBACa,2BAA4B,SAAQ,UAAU;cAEvC,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAkNvF;;;OAGG;YACW,aAAa;IAuB3B,OAAO,CAAC,SAAS;CAKpB;AAED,0BAA0B;AAC1B,wBAAgB,+BAA+B,IAAI,IAAI,CAItD"}
@@ -7,7 +7,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
7
7
  import { BaseAction } from "@memberjunction/actions";
8
8
  import { Metadata, LogError } from "@memberjunction/core";
9
9
  import { RegisterClass } from "@memberjunction/global";
10
- import { AddOutput, BumpVersion, CheckOverrideOwnership, Failure, GetStringParam, InsertComponent, InsertOverride, LintFormSpec, LoadComponent, LoadOverride, MapToComponentStatus, ParseSpecParam, ParseVersionBumpKind, } from "./_shared.js";
10
+ import { AddOutput, BumpVersion, CheckPersonalWrite, Failure, GetStringParam, InsertComponent, InsertOverride, LintFormSpec, LoadComponent, LoadOverride, MapToComponentStatus, ParseSpecParam, ParseVersionBumpKind, WriteAtomically, } from "./_shared.js";
11
11
  /**
12
12
  * Modify an existing interactive-form override.
13
13
  *
@@ -28,18 +28,15 @@ import { AddOutput, BumpVersion, CheckOverrideOwnership, Failure, GetStringParam
28
28
  * Pending sources stay in-place, Active sources bump minor, Inactive
29
29
  * sources bump patch (the conservative branch-from-historical case).
30
30
  *
31
- * **Security clamp.** Modify *always* writes a User-scope Pending Override,
32
- * regardless of the original override's scope. Even if the caller is
33
- * modifying a Role-scope or Global override (which they have permission to
34
- * read because they pass the ownership check), the new Pending sibling
35
- * is always User-scoped to the calling user. Scope promotion (User → Role
36
- * → Global) is a separate, deliberate human action with its own permission
37
- * gate in Component Studio / Form Builder. The agent cannot widen scope
38
- * through Modify any more than through Create.
31
+ * **Ownership.** Only the caller's own User-scope overrides can be modified.
32
+ * A Role or Global override, or another user's, returns FORBIDDEN for every
33
+ * caller (see `CheckPersonalWrite` in `_shared.ts`): shared forms are managed
34
+ * from Form Builder or the form's Manage drawer. A new Pending Override is
35
+ * written User-scope, as Create writes it.
39
36
  *
40
- * **Ownership check.** The caller must own (or have role membership for, or
41
- * be admin over) the existing override they're modifying. See
42
- * `checkOverrideOwnership` in `_shared.ts`. Returns FORBIDDEN if rejected.
37
+ * **Atomicity.** The in-place Component and Override writes run in one entity
38
+ * transaction, and so do the new-version Component and Override inserts, so a
39
+ * refused Override save leaves no Component change behind.
43
40
  *
44
41
  * Inputs:
45
42
  * - `OverrideID` (required, string) — the override to modify
@@ -80,8 +77,7 @@ let ModifyInteractiveFormAction = class ModifyInteractiveFormAction extends Base
80
77
  if (!override) {
81
78
  return Failure("OVERRIDE_NOT_FOUND", `EntityFormOverride '${overrideID}' not found.`);
82
79
  }
83
- // Defense-in-depth ownership check — see _shared.ts.
84
- const ownershipFail = CheckOverrideOwnership(override, user);
80
+ const ownershipFail = CheckPersonalWrite(override, user);
85
81
  if (ownershipFail)
86
82
  return ownershipFail;
87
83
  const existingComponent = await LoadComponent(provider, user, override.ComponentID);
@@ -150,26 +146,9 @@ let ModifyInteractiveFormAction = class ModifyInteractiveFormAction extends Base
150
146
  return Failure("INVALID_BUMP_FOR_STATUS", `'in-place' is only valid against a Pending Override (got Status='${overrideStatus}'). Use 'patch', 'minor', or 'major' to snapshot a new Pending version from this source; use 'Revert Interactive Form' to re-activate an Inactive historical version.`);
151
147
  }
152
148
  if (bumpKind === 'in-place') {
153
- // ── in-place modify of the Pending Component ─────────────
154
- existingComponent.Specification = JSON.stringify(spec);
155
- // Refresh Title/Description if the new spec moves them.
156
- if (spec.title)
157
- existingComponent.Title = spec.title;
158
- if (spec.description)
159
- existingComponent.Description = spec.description;
160
- const saved = await existingComponent.Save();
161
- if (!saved) {
162
- return Failure("PERSIST_FAILED", `Component in-place update failed: ${existingComponent.LatestResult?.CompleteMessage ?? 'unknown error'}`);
163
- }
164
- if (notes) {
165
- // Append a line of human-readable notes. The Notes column
166
- // accepts NVARCHAR(MAX), so this scales.
167
- const existingNotes = override.Notes ?? '';
168
- override.Notes = existingNotes
169
- ? `${existingNotes}\n${notes}`
170
- : notes;
171
- await override.Save();
172
- }
149
+ const written = await WriteAtomically(provider, () => this.modifyInPlace(existingComponent, override, spec, notes));
150
+ if ('error' in written)
151
+ return written.error;
173
152
  AddOutput(params, "ComponentID", existingComponent.ID);
174
153
  AddOutput(params, "OverrideID", override.ID);
175
154
  AddOutput(params, "Mode", "in-place");
@@ -192,35 +171,35 @@ let ModifyInteractiveFormAction = class ModifyInteractiveFormAction extends Base
192
171
  // historical — no demote needed since source is already Inactive,
193
172
  // and the user explicitly opened it to fork from there).
194
173
  const newVersion = BumpVersion(existingComponent.Version, bumpKind);
195
- const newSequence = (existingComponent.VersionSequence ?? 0) + 1;
196
- const componentInsert = await InsertComponent({
197
- provider, user, spec,
198
- fallbackName: existingComponent.Name,
199
- description: existingComponent.Description,
200
- version: newVersion,
201
- versionSequence: newSequence,
202
- componentStatus: 'Pending',
174
+ const inserted = await WriteAtomically(provider, async () => {
175
+ const componentInsert = await InsertComponent({
176
+ provider, user, spec,
177
+ fallbackName: existingComponent.Name,
178
+ description: existingComponent.Description,
179
+ version: newVersion,
180
+ versionSequence: (existingComponent.VersionSequence ?? 0) + 1,
181
+ componentStatus: 'Pending',
182
+ });
183
+ if ('error' in componentInsert)
184
+ return componentInsert;
185
+ // InsertOverride writes the new Pending Override User-scoped to the caller.
186
+ const overrideInsert = await InsertOverride({
187
+ provider, user,
188
+ entityID: override.EntityID,
189
+ componentID: componentInsert.id,
190
+ name: override.Name,
191
+ description: override.Description,
192
+ notes,
193
+ status: 'Pending',
194
+ priority: override.Priority,
195
+ });
196
+ if ('error' in overrideInsert)
197
+ return overrideInsert;
198
+ return { componentID: componentInsert.id, overrideID: overrideInsert.id };
203
199
  });
204
- if ('error' in componentInsert)
205
- return componentInsert.error;
206
- const newComponentID = componentInsert.id;
207
- // New Pending Override at the same scope as the existing one. We
208
- // do not widen scope: if existing is User-scoped, new is too. If
209
- // somehow existing is Role/Global (manual promotion), we still
210
- // honor that — Modify is a content change, not a scope change.
211
- const overrideInsert = await InsertOverride({
212
- provider, user,
213
- entityID: override.EntityID,
214
- componentID: newComponentID,
215
- name: override.Name,
216
- description: override.Description,
217
- notes,
218
- status: 'Pending',
219
- priority: override.Priority,
220
- });
221
- if ('error' in overrideInsert) {
222
- return Failure("PERSIST_FAILED", `${overrideInsert.error.Message} (Component ${newComponentID} was persisted; its sibling override row failed to write.)`);
223
- }
200
+ if ('error' in inserted)
201
+ return inserted.error;
202
+ const newComponentID = inserted.componentID;
224
203
  // Demote the prior Pending source — both the Component row and
225
204
  // its Override row — to Inactive. This preserves the rollback
226
205
  // history (the row stays in the version rail and can be
@@ -257,7 +236,7 @@ let ModifyInteractiveFormAction = class ModifyInteractiveFormAction extends Base
257
236
  }
258
237
  }
259
238
  AddOutput(params, "ComponentID", newComponentID);
260
- AddOutput(params, "OverrideID", overrideInsert.id);
239
+ AddOutput(params, "OverrideID", inserted.overrideID);
261
240
  AddOutput(params, "Mode", "new-version");
262
241
  AddOutput(params, "Version", newVersion);
263
242
  return {
@@ -265,7 +244,7 @@ let ModifyInteractiveFormAction = class ModifyInteractiveFormAction extends Base
265
244
  Message: JSON.stringify({
266
245
  Mode: 'new-version',
267
246
  ComponentID: newComponentID,
268
- OverrideID: overrideInsert.id,
247
+ OverrideID: inserted.overrideID,
269
248
  Version: newVersion,
270
249
  BumpKind: bumpKind,
271
250
  PreviousComponentID: existingComponent.ID,
@@ -282,6 +261,28 @@ let ModifyInteractiveFormAction = class ModifyInteractiveFormAction extends Base
282
261
  return Failure("UNEXPECTED_ERROR", message);
283
262
  }
284
263
  }
264
+ /**
265
+ * Overwrite the Pending Component's spec and append any notes to the Override. Returns an
266
+ * `{ error }` result on a refused save, so the caller's transaction rolls both back.
267
+ */
268
+ async modifyInPlace(component, override, spec, notes) {
269
+ component.Specification = JSON.stringify(spec);
270
+ // Refresh Title/Description if the new spec moves them.
271
+ if (spec.title)
272
+ component.Title = spec.title;
273
+ if (spec.description)
274
+ component.Description = spec.description;
275
+ if (!(await component.Save())) {
276
+ return { error: Failure("PERSIST_FAILED", `Component in-place update failed: ${component.LatestResult?.CompleteMessage ?? 'unknown error'}`) };
277
+ }
278
+ if (!notes)
279
+ return { ok: true };
280
+ override.Notes = override.Notes ? `${override.Notes}\n${notes}` : notes;
281
+ if (!(await override.Save())) {
282
+ return { error: Failure("PERSIST_FAILED", `Override notes update failed: ${override.LatestResult?.CompleteMessage ?? 'unknown error'}`) };
283
+ }
284
+ return { ok: true };
285
+ }
285
286
  findParam(params, name) {
286
287
  const p = params.Params.find(x => x.Name?.trim().toLowerCase() === name.toLowerCase());
287
288
  return p?.Value;
@@ -1 +1 @@
1
- {"version":3,"file":"modify-interactive-form.action.js","sourceRoot":"","sources":["../../../src/custom/interactive-forms/modify-interactive-form.action.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"modify-interactive-form.action.js","sourceRoot":"","sources":["../../../src/custom/interactive-forms/modify-interactive-form.action.ts"],"names":[],"mappings":"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"}
@@ -15,9 +15,21 @@ import { BaseAction } from "@memberjunction/actions";
15
15
  * - Flip the previously-pointed Component to Status='Inactive', target
16
16
  * Component to Status='Active'.
17
17
  *
18
+ * The override is saved first. Both Component status saves are then tried, even
19
+ * when the first fails. If either fails, or the target Component cannot be loaded
20
+ * for its status save, the action returns `PERSIST_FAILED` that names every
21
+ * Component whose status was not updated; the override stays re-pointed. The
22
+ * override then already points at the target, so a retry with the same target
23
+ * returns SUCCESS from the no-op path and the Component statuses stay as they are.
24
+ *
18
25
  * Old Component rows are never deleted — they remain as immutable history.
19
26
  * A subsequent revert can move forward again to any version.
20
27
  *
28
+ * Only the caller's own User-scope overrides can be reverted. A Role or Global
29
+ * override, or another user's, returns FORBIDDEN for every caller (see
30
+ * `CheckPersonalWrite` in `_shared.ts`): shared forms are managed from Form
31
+ * Builder or the form's Manage drawer.
32
+ *
21
33
  * Inputs:
22
34
  * - `ActiveOverrideID` (required, string) — the Active override to re-point
23
35
  * - One of:
@@ -1 +1 @@
1
- {"version":3,"file":"revert-interactive-form.action.d.ts","sourceRoot":"","sources":["../../../src/custom/interactive-forms/revert-interactive-form.action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAOrD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,qBACa,2BAA4B,SAAQ,UAAU;cAEvC,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC;CA8G1F;AAED,0BAA0B;AAC1B,wBAAgB,+BAA+B,IAAI,IAAI,CAItD"}
1
+ {"version":3,"file":"revert-interactive-form.action.d.ts","sourceRoot":"","sources":["../../../src/custom/interactive-forms/revert-interactive-form.action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAOrD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,qBACa,2BAA4B,SAAQ,UAAU;cAEvC,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC;CA2H1F;AAED,0BAA0B;AAC1B,wBAAgB,+BAA+B,IAAI,IAAI,CAItD"}
@@ -7,7 +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, UUIDsEqual } from "@memberjunction/global";
10
- import { AddOutput, CheckOverrideOwnership, Failure, GetNumberParam, GetStringParam, LoadComponent, LoadOverride, MapToComponentStatus, } from "./_shared.js";
10
+ import { AddOutput, CheckPersonalWrite, Failure, GetNumberParam, GetStringParam, LoadComponent, LoadOverride, MapToComponentStatus, } from "./_shared.js";
11
11
  /**
12
12
  * Revert the user's Active override to an older Component version. Pure
13
13
  * re-point: no new Component is created, no new Override row is created.
@@ -23,9 +23,21 @@ import { AddOutput, CheckOverrideOwnership, Failure, GetNumberParam, GetStringPa
23
23
  * - Flip the previously-pointed Component to Status='Inactive', target
24
24
  * Component to Status='Active'.
25
25
  *
26
+ * The override is saved first. Both Component status saves are then tried, even
27
+ * when the first fails. If either fails, or the target Component cannot be loaded
28
+ * for its status save, the action returns `PERSIST_FAILED` that names every
29
+ * Component whose status was not updated; the override stays re-pointed. The
30
+ * override then already points at the target, so a retry with the same target
31
+ * returns SUCCESS from the no-op path and the Component statuses stay as they are.
32
+ *
26
33
  * Old Component rows are never deleted — they remain as immutable history.
27
34
  * A subsequent revert can move forward again to any version.
28
35
  *
36
+ * Only the caller's own User-scope overrides can be reverted. A Role or Global
37
+ * override, or another user's, returns FORBIDDEN for every caller (see
38
+ * `CheckPersonalWrite` in `_shared.ts`): shared forms are managed from Form
39
+ * Builder or the form's Manage drawer.
40
+ *
29
41
  * Inputs:
30
42
  * - `ActiveOverrideID` (required, string) — the Active override to re-point
31
43
  * - One of:
@@ -61,7 +73,7 @@ let RevertInteractiveFormAction = class RevertInteractiveFormAction extends Base
61
73
  if (!override) {
62
74
  return Failure("OVERRIDE_NOT_FOUND", `EntityFormOverride '${activeOverrideID}' not found.`);
63
75
  }
64
- const ownershipFail = CheckOverrideOwnership(override, user);
76
+ const ownershipFail = CheckPersonalWrite(override, user);
65
77
  if (ownershipFail)
66
78
  return ownershipFail;
67
79
  if (override.Status !== 'Active') {
@@ -116,13 +128,26 @@ let RevertInteractiveFormAction = class RevertInteractiveFormAction extends Base
116
128
  return Failure("PERSIST_FAILED", `Could not re-point Override: ${override.LatestResult?.CompleteMessage ?? 'unknown error'}`);
117
129
  }
118
130
  // Flip Component statuses to reflect the new active selection.
131
+ const notUpdated = [];
119
132
  const newActive = await LoadComponent(provider, user, target.ID);
120
133
  if (newActive) {
121
134
  newActive.Status = MapToComponentStatus('Active');
122
- await newActive.Save();
135
+ if (!(await newActive.Save())) {
136
+ notUpdated.push(`the status of Component ${target.ID} was not updated ` +
137
+ `(${newActive.LatestResult?.CompleteMessage ?? 'unknown error'})`);
138
+ }
139
+ }
140
+ else {
141
+ notUpdated.push(`Component ${target.ID} could not be loaded, so its status was not updated`);
123
142
  }
124
143
  currentComponent.Status = MapToComponentStatus('Inactive');
125
- await currentComponent.Save();
144
+ if (!(await currentComponent.Save())) {
145
+ notUpdated.push(`the status of Component ${currentComponent.ID} was not updated ` +
146
+ `(${currentComponent.LatestResult?.CompleteMessage ?? 'unknown error'})`);
147
+ }
148
+ if (notUpdated.length > 0) {
149
+ return Failure("PERSIST_FAILED", `Override ${override.ID} was re-pointed to Component ${target.ID}, but ${notUpdated.join('; ')}.`);
150
+ }
126
151
  AddOutput(params, "OverrideID", override.ID);
127
152
  AddOutput(params, "ComponentID", target.ID);
128
153
  AddOutput(params, "PreviousComponentID", currentComponent.ID);