@objectstack/platform-objects 6.5.0 → 6.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -688,6 +688,88 @@ declare const SysRole: Omit<{
688
688
  readonly displayNameField: "label";
689
689
  readonly titleFormat: "{label}";
690
690
  readonly compactLayout: ["label", "name", "active", "is_default"];
691
+ readonly actions: [{
692
+ readonly name: "activate_role";
693
+ readonly label: "Activate Role";
694
+ readonly icon: "circle-check";
695
+ readonly variant: "secondary";
696
+ readonly mode: "custom";
697
+ readonly locations: ["list_item", "record_header"];
698
+ readonly type: "api";
699
+ readonly method: "PATCH";
700
+ readonly target: "/api/v1/data/sys_role/{id}";
701
+ readonly bodyExtra: {
702
+ readonly active: true;
703
+ };
704
+ readonly successMessage: "Role activated";
705
+ readonly refreshAfter: true;
706
+ }, {
707
+ readonly name: "deactivate_role";
708
+ readonly label: "Deactivate Role";
709
+ readonly icon: "circle-off";
710
+ readonly variant: "danger";
711
+ readonly mode: "custom";
712
+ readonly locations: ["list_item", "record_header"];
713
+ readonly type: "api";
714
+ readonly method: "PATCH";
715
+ readonly target: "/api/v1/data/sys_role/{id}";
716
+ readonly bodyExtra: {
717
+ readonly active: false;
718
+ };
719
+ readonly confirmText: "Deactivate this role? Users with the role keep their assignment but the role stops granting permissions until re-activated.";
720
+ readonly successMessage: "Role deactivated";
721
+ readonly refreshAfter: true;
722
+ }, {
723
+ readonly name: "set_default_role";
724
+ readonly label: "Set as Default";
725
+ readonly icon: "star";
726
+ readonly variant: "secondary";
727
+ readonly mode: "custom";
728
+ readonly locations: ["list_item", "record_header"];
729
+ readonly type: "api";
730
+ readonly method: "PATCH";
731
+ readonly target: "/api/v1/data/sys_role/{id}";
732
+ readonly bodyExtra: {
733
+ readonly is_default: true;
734
+ };
735
+ readonly confirmText: "Make this the default role for new users? Existing users are unaffected.";
736
+ readonly successMessage: "Default role updated";
737
+ readonly refreshAfter: true;
738
+ }, {
739
+ readonly name: "clone_role";
740
+ readonly label: "Clone Role";
741
+ readonly icon: "copy";
742
+ readonly variant: "secondary";
743
+ readonly mode: "custom";
744
+ readonly locations: ["list_item", "record_header"];
745
+ readonly type: "api";
746
+ readonly method: "POST";
747
+ readonly target: "/api/v1/data/sys_role";
748
+ readonly bodyExtra: {
749
+ readonly is_default: false;
750
+ readonly active: true;
751
+ };
752
+ readonly successMessage: "Role cloned";
753
+ readonly refreshAfter: true;
754
+ readonly params: [{
755
+ readonly name: "label";
756
+ readonly label: "New Display Name";
757
+ readonly type: "text";
758
+ readonly required: true;
759
+ }, {
760
+ readonly name: "name";
761
+ readonly label: "New API Name";
762
+ readonly type: "text";
763
+ readonly required: true;
764
+ readonly helpText: "Unique snake_case machine name";
765
+ }, {
766
+ readonly field: "description";
767
+ readonly defaultFromRow: true;
768
+ }, {
769
+ readonly field: "permissions";
770
+ readonly defaultFromRow: true;
771
+ }];
772
+ }];
691
773
  readonly listViews: {
692
774
  readonly active: {
693
775
  readonly type: "grid";
@@ -3052,6 +3134,74 @@ declare const SysPermissionSet: Omit<{
3052
3134
  readonly displayNameField: "label";
3053
3135
  readonly titleFormat: "{label}";
3054
3136
  readonly compactLayout: ["label", "name", "active"];
3137
+ readonly actions: [{
3138
+ readonly name: "activate_permission_set";
3139
+ readonly label: "Activate";
3140
+ readonly icon: "circle-check";
3141
+ readonly variant: "secondary";
3142
+ readonly mode: "custom";
3143
+ readonly locations: ["list_item", "record_header"];
3144
+ readonly type: "api";
3145
+ readonly method: "PATCH";
3146
+ readonly target: "/api/v1/data/sys_permission_set/{id}";
3147
+ readonly bodyExtra: {
3148
+ readonly active: true;
3149
+ };
3150
+ readonly successMessage: "Permission set activated";
3151
+ readonly refreshAfter: true;
3152
+ }, {
3153
+ readonly name: "deactivate_permission_set";
3154
+ readonly label: "Deactivate";
3155
+ readonly icon: "circle-off";
3156
+ readonly variant: "danger";
3157
+ readonly mode: "custom";
3158
+ readonly locations: ["list_item", "record_header"];
3159
+ readonly type: "api";
3160
+ readonly method: "PATCH";
3161
+ readonly target: "/api/v1/data/sys_permission_set/{id}";
3162
+ readonly bodyExtra: {
3163
+ readonly active: false;
3164
+ };
3165
+ readonly confirmText: "Deactivate this permission set? Existing assignments stay in place but stop granting access until re-activated.";
3166
+ readonly successMessage: "Permission set deactivated";
3167
+ readonly refreshAfter: true;
3168
+ }, {
3169
+ readonly name: "clone_permission_set";
3170
+ readonly label: "Clone";
3171
+ readonly icon: "copy";
3172
+ readonly variant: "secondary";
3173
+ readonly mode: "custom";
3174
+ readonly locations: ["list_item", "record_header"];
3175
+ readonly type: "api";
3176
+ readonly method: "POST";
3177
+ readonly target: "/api/v1/data/sys_permission_set";
3178
+ readonly bodyExtra: {
3179
+ readonly active: true;
3180
+ };
3181
+ readonly successMessage: "Permission set cloned";
3182
+ readonly refreshAfter: true;
3183
+ readonly params: [{
3184
+ readonly name: "label";
3185
+ readonly label: "New Display Name";
3186
+ readonly type: "text";
3187
+ readonly required: true;
3188
+ }, {
3189
+ readonly name: "name";
3190
+ readonly label: "New API Name";
3191
+ readonly type: "text";
3192
+ readonly required: true;
3193
+ readonly helpText: "Unique snake_case machine name";
3194
+ }, {
3195
+ readonly field: "description";
3196
+ readonly defaultFromRow: true;
3197
+ }, {
3198
+ readonly field: "object_permissions";
3199
+ readonly defaultFromRow: true;
3200
+ }, {
3201
+ readonly field: "field_permissions";
3202
+ readonly defaultFromRow: true;
3203
+ }];
3204
+ }];
3055
3205
  readonly listViews: {
3056
3206
  readonly active: {
3057
3207
  readonly type: "grid";
@@ -688,6 +688,88 @@ declare const SysRole: Omit<{
688
688
  readonly displayNameField: "label";
689
689
  readonly titleFormat: "{label}";
690
690
  readonly compactLayout: ["label", "name", "active", "is_default"];
691
+ readonly actions: [{
692
+ readonly name: "activate_role";
693
+ readonly label: "Activate Role";
694
+ readonly icon: "circle-check";
695
+ readonly variant: "secondary";
696
+ readonly mode: "custom";
697
+ readonly locations: ["list_item", "record_header"];
698
+ readonly type: "api";
699
+ readonly method: "PATCH";
700
+ readonly target: "/api/v1/data/sys_role/{id}";
701
+ readonly bodyExtra: {
702
+ readonly active: true;
703
+ };
704
+ readonly successMessage: "Role activated";
705
+ readonly refreshAfter: true;
706
+ }, {
707
+ readonly name: "deactivate_role";
708
+ readonly label: "Deactivate Role";
709
+ readonly icon: "circle-off";
710
+ readonly variant: "danger";
711
+ readonly mode: "custom";
712
+ readonly locations: ["list_item", "record_header"];
713
+ readonly type: "api";
714
+ readonly method: "PATCH";
715
+ readonly target: "/api/v1/data/sys_role/{id}";
716
+ readonly bodyExtra: {
717
+ readonly active: false;
718
+ };
719
+ readonly confirmText: "Deactivate this role? Users with the role keep their assignment but the role stops granting permissions until re-activated.";
720
+ readonly successMessage: "Role deactivated";
721
+ readonly refreshAfter: true;
722
+ }, {
723
+ readonly name: "set_default_role";
724
+ readonly label: "Set as Default";
725
+ readonly icon: "star";
726
+ readonly variant: "secondary";
727
+ readonly mode: "custom";
728
+ readonly locations: ["list_item", "record_header"];
729
+ readonly type: "api";
730
+ readonly method: "PATCH";
731
+ readonly target: "/api/v1/data/sys_role/{id}";
732
+ readonly bodyExtra: {
733
+ readonly is_default: true;
734
+ };
735
+ readonly confirmText: "Make this the default role for new users? Existing users are unaffected.";
736
+ readonly successMessage: "Default role updated";
737
+ readonly refreshAfter: true;
738
+ }, {
739
+ readonly name: "clone_role";
740
+ readonly label: "Clone Role";
741
+ readonly icon: "copy";
742
+ readonly variant: "secondary";
743
+ readonly mode: "custom";
744
+ readonly locations: ["list_item", "record_header"];
745
+ readonly type: "api";
746
+ readonly method: "POST";
747
+ readonly target: "/api/v1/data/sys_role";
748
+ readonly bodyExtra: {
749
+ readonly is_default: false;
750
+ readonly active: true;
751
+ };
752
+ readonly successMessage: "Role cloned";
753
+ readonly refreshAfter: true;
754
+ readonly params: [{
755
+ readonly name: "label";
756
+ readonly label: "New Display Name";
757
+ readonly type: "text";
758
+ readonly required: true;
759
+ }, {
760
+ readonly name: "name";
761
+ readonly label: "New API Name";
762
+ readonly type: "text";
763
+ readonly required: true;
764
+ readonly helpText: "Unique snake_case machine name";
765
+ }, {
766
+ readonly field: "description";
767
+ readonly defaultFromRow: true;
768
+ }, {
769
+ readonly field: "permissions";
770
+ readonly defaultFromRow: true;
771
+ }];
772
+ }];
691
773
  readonly listViews: {
692
774
  readonly active: {
693
775
  readonly type: "grid";
@@ -3052,6 +3134,74 @@ declare const SysPermissionSet: Omit<{
3052
3134
  readonly displayNameField: "label";
3053
3135
  readonly titleFormat: "{label}";
3054
3136
  readonly compactLayout: ["label", "name", "active"];
3137
+ readonly actions: [{
3138
+ readonly name: "activate_permission_set";
3139
+ readonly label: "Activate";
3140
+ readonly icon: "circle-check";
3141
+ readonly variant: "secondary";
3142
+ readonly mode: "custom";
3143
+ readonly locations: ["list_item", "record_header"];
3144
+ readonly type: "api";
3145
+ readonly method: "PATCH";
3146
+ readonly target: "/api/v1/data/sys_permission_set/{id}";
3147
+ readonly bodyExtra: {
3148
+ readonly active: true;
3149
+ };
3150
+ readonly successMessage: "Permission set activated";
3151
+ readonly refreshAfter: true;
3152
+ }, {
3153
+ readonly name: "deactivate_permission_set";
3154
+ readonly label: "Deactivate";
3155
+ readonly icon: "circle-off";
3156
+ readonly variant: "danger";
3157
+ readonly mode: "custom";
3158
+ readonly locations: ["list_item", "record_header"];
3159
+ readonly type: "api";
3160
+ readonly method: "PATCH";
3161
+ readonly target: "/api/v1/data/sys_permission_set/{id}";
3162
+ readonly bodyExtra: {
3163
+ readonly active: false;
3164
+ };
3165
+ readonly confirmText: "Deactivate this permission set? Existing assignments stay in place but stop granting access until re-activated.";
3166
+ readonly successMessage: "Permission set deactivated";
3167
+ readonly refreshAfter: true;
3168
+ }, {
3169
+ readonly name: "clone_permission_set";
3170
+ readonly label: "Clone";
3171
+ readonly icon: "copy";
3172
+ readonly variant: "secondary";
3173
+ readonly mode: "custom";
3174
+ readonly locations: ["list_item", "record_header"];
3175
+ readonly type: "api";
3176
+ readonly method: "POST";
3177
+ readonly target: "/api/v1/data/sys_permission_set";
3178
+ readonly bodyExtra: {
3179
+ readonly active: true;
3180
+ };
3181
+ readonly successMessage: "Permission set cloned";
3182
+ readonly refreshAfter: true;
3183
+ readonly params: [{
3184
+ readonly name: "label";
3185
+ readonly label: "New Display Name";
3186
+ readonly type: "text";
3187
+ readonly required: true;
3188
+ }, {
3189
+ readonly name: "name";
3190
+ readonly label: "New API Name";
3191
+ readonly type: "text";
3192
+ readonly required: true;
3193
+ readonly helpText: "Unique snake_case machine name";
3194
+ }, {
3195
+ readonly field: "description";
3196
+ readonly defaultFromRow: true;
3197
+ }, {
3198
+ readonly field: "object_permissions";
3199
+ readonly defaultFromRow: true;
3200
+ }, {
3201
+ readonly field: "field_permissions";
3202
+ readonly defaultFromRow: true;
3203
+ }];
3204
+ }];
3055
3205
  readonly listViews: {
3056
3206
  readonly active: {
3057
3207
  readonly type: "grid";
@@ -15,6 +15,83 @@ var SysRole = data.ObjectSchema.create({
15
15
  displayNameField: "label",
16
16
  titleFormat: "{label}",
17
17
  compactLayout: ["label", "name", "active", "is_default"],
18
+ // Custom actions — system roles drive RBAC and are edited rarely but
19
+ // require the four high-frequency sysadmin affordances every IdP
20
+ // (Salesforce, ServiceNow, Okta) ships: activate/deactivate (lifecycle
21
+ // without losing assignments), mark default (auto-assign to new users),
22
+ // and clone (template for new roles). All operations hit the generic
23
+ // data CRUD endpoint exposed by `apiEnabled` — no custom server route
24
+ // required because `managedBy: 'config'` allows direct mutation.
25
+ actions: [
26
+ {
27
+ name: "activate_role",
28
+ label: "Activate Role",
29
+ icon: "circle-check",
30
+ variant: "secondary",
31
+ mode: "custom",
32
+ locations: ["list_item", "record_header"],
33
+ type: "api",
34
+ method: "PATCH",
35
+ target: "/api/v1/data/sys_role/{id}",
36
+ bodyExtra: { active: true },
37
+ successMessage: "Role activated",
38
+ refreshAfter: true
39
+ },
40
+ {
41
+ name: "deactivate_role",
42
+ label: "Deactivate Role",
43
+ icon: "circle-off",
44
+ variant: "danger",
45
+ mode: "custom",
46
+ locations: ["list_item", "record_header"],
47
+ type: "api",
48
+ method: "PATCH",
49
+ target: "/api/v1/data/sys_role/{id}",
50
+ bodyExtra: { active: false },
51
+ confirmText: "Deactivate this role? Users with the role keep their assignment but the role stops granting permissions until re-activated.",
52
+ successMessage: "Role deactivated",
53
+ refreshAfter: true
54
+ },
55
+ {
56
+ name: "set_default_role",
57
+ label: "Set as Default",
58
+ icon: "star",
59
+ variant: "secondary",
60
+ mode: "custom",
61
+ locations: ["list_item", "record_header"],
62
+ type: "api",
63
+ method: "PATCH",
64
+ target: "/api/v1/data/sys_role/{id}",
65
+ bodyExtra: { is_default: true },
66
+ confirmText: "Make this the default role for new users? Existing users are unaffected.",
67
+ successMessage: "Default role updated",
68
+ refreshAfter: true
69
+ },
70
+ {
71
+ // Clone — POST a new sys_role row pre-filled from the source. The
72
+ // dialog asks only for the new API name / label so the operator
73
+ // can rename atomically; permissions JSON is copied wholesale via
74
+ // defaultFromRow.
75
+ name: "clone_role",
76
+ label: "Clone Role",
77
+ icon: "copy",
78
+ variant: "secondary",
79
+ mode: "custom",
80
+ locations: ["list_item", "record_header"],
81
+ type: "api",
82
+ method: "POST",
83
+ target: "/api/v1/data/sys_role",
84
+ bodyExtra: { is_default: false, active: true },
85
+ successMessage: "Role cloned",
86
+ refreshAfter: true,
87
+ params: [
88
+ { name: "label", label: "New Display Name", type: "text", required: true },
89
+ { name: "name", label: "New API Name", type: "text", required: true, helpText: "Unique snake_case machine name" },
90
+ { field: "description", defaultFromRow: true },
91
+ { field: "permissions", defaultFromRow: true }
92
+ ]
93
+ }
94
+ ],
18
95
  listViews: {
19
96
  active: {
20
97
  type: "grid",
@@ -141,6 +218,64 @@ var SysPermissionSet = data.ObjectSchema.create({
141
218
  displayNameField: "label",
142
219
  titleFormat: "{label}",
143
220
  compactLayout: ["label", "name", "active"],
221
+ // Custom actions — permission sets are templates assigned to roles or
222
+ // users (via sys_role_permission_set / sys_user_permission_set). The
223
+ // sysadmin operations that don't live on the parent-detail tabs are
224
+ // lifecycle (activate/deactivate without losing assignments) and
225
+ // clone (build a new permset by tweaking an existing one). Both hit
226
+ // the generic data CRUD endpoint — managedBy: 'config' permits it.
227
+ actions: [
228
+ {
229
+ name: "activate_permission_set",
230
+ label: "Activate",
231
+ icon: "circle-check",
232
+ variant: "secondary",
233
+ mode: "custom",
234
+ locations: ["list_item", "record_header"],
235
+ type: "api",
236
+ method: "PATCH",
237
+ target: "/api/v1/data/sys_permission_set/{id}",
238
+ bodyExtra: { active: true },
239
+ successMessage: "Permission set activated",
240
+ refreshAfter: true
241
+ },
242
+ {
243
+ name: "deactivate_permission_set",
244
+ label: "Deactivate",
245
+ icon: "circle-off",
246
+ variant: "danger",
247
+ mode: "custom",
248
+ locations: ["list_item", "record_header"],
249
+ type: "api",
250
+ method: "PATCH",
251
+ target: "/api/v1/data/sys_permission_set/{id}",
252
+ bodyExtra: { active: false },
253
+ confirmText: "Deactivate this permission set? Existing assignments stay in place but stop granting access until re-activated.",
254
+ successMessage: "Permission set deactivated",
255
+ refreshAfter: true
256
+ },
257
+ {
258
+ name: "clone_permission_set",
259
+ label: "Clone",
260
+ icon: "copy",
261
+ variant: "secondary",
262
+ mode: "custom",
263
+ locations: ["list_item", "record_header"],
264
+ type: "api",
265
+ method: "POST",
266
+ target: "/api/v1/data/sys_permission_set",
267
+ bodyExtra: { active: true },
268
+ successMessage: "Permission set cloned",
269
+ refreshAfter: true,
270
+ params: [
271
+ { name: "label", label: "New Display Name", type: "text", required: true },
272
+ { name: "name", label: "New API Name", type: "text", required: true, helpText: "Unique snake_case machine name" },
273
+ { field: "description", defaultFromRow: true },
274
+ { field: "object_permissions", defaultFromRow: true },
275
+ { field: "field_permissions", defaultFromRow: true }
276
+ ]
277
+ }
278
+ ],
144
279
  listViews: {
145
280
  active: {
146
281
  type: "grid",