sf-browserforce 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -8
- package/lib/plugins/index.d.ts +2 -1
- package/lib/plugins/index.js +2 -1
- package/lib/plugins/index.js.map +1 -1
- package/lib/plugins/list-view-custom-buttons/index.d.ts +12 -0
- package/lib/plugins/list-view-custom-buttons/index.e2e-spec.d.ts +1 -0
- package/lib/plugins/list-view-custom-buttons/index.e2e-spec.js +89 -0
- package/lib/plugins/list-view-custom-buttons/index.e2e-spec.js.map +1 -0
- package/lib/plugins/list-view-custom-buttons/index.js +101 -0
- package/lib/plugins/list-view-custom-buttons/index.js.map +1 -0
- package/lib/plugins/scheduled-batches/index.e2e-spec.d.ts +1 -0
- package/lib/plugins/scheduled-batches/index.e2e-spec.js +113 -0
- package/lib/plugins/scheduled-batches/index.e2e-spec.js.map +1 -0
- package/lib/plugins/scheduled-batches/index.js +6 -12
- package/lib/plugins/scheduled-batches/index.js.map +1 -1
- package/oclif.manifest.json +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
> sf plugin to apply settings in the Salesforce Setup Menu using browser automation
|
|
4
4
|
|
|
5
|
-
[](https://github.com/jrupesh/sfdx-browserforce-plugin/actions?query=branch:main)
|
|
6
6
|
|
|
7
7
|
> [!NOTE]
|
|
8
|
-
> Since v6 we're using Playwright instead of Puppeteer. Please see the [release notes](https://github.com/
|
|
8
|
+
> Since v6 we're using Playwright instead of Puppeteer. Please see the [release notes](https://github.com/jrupesh/sfdx-browserforce-plugin/releases) for migration instructions.
|
|
9
9
|
|
|
10
10
|
✅ Most settings in the Salesforce Setup Menu are represented as [Settings](https://developer.salesforce.com/docs/atlas.en-us.api_meta.meta/api_meta/meta_settings.htm) in the Metadata API.
|
|
11
11
|
|
|
@@ -33,7 +33,7 @@ To change the Currency Locale, the Browserforce config file (here: `./config/cur
|
|
|
33
33
|
|
|
34
34
|
```json
|
|
35
35
|
{
|
|
36
|
-
"$schema": "https://raw.githubusercontent.com/
|
|
36
|
+
"$schema": "https://raw.githubusercontent.com/jrupesh/sfdx-browserforce-plugin/main/src/plugins/schema.json",
|
|
37
37
|
"settings": {
|
|
38
38
|
"companyInformation": {
|
|
39
39
|
"defaultCurrencyIsoCode": "English (South Africa) - ZAR"
|
|
@@ -86,8 +86,8 @@ Top settings:
|
|
|
86
86
|
|
|
87
87
|
But there's more:
|
|
88
88
|
|
|
89
|
-
- Please see the [Browserforce Settings](https://github.com/
|
|
90
|
-
- Explore the JSON schema powered configuration using a [full-blown example](https://github.dev/
|
|
89
|
+
- Please see the [Browserforce Settings](https://github.com/jrupesh/sfdx-browserforce-plugin/wiki/Browserforce-Settings) wiki page with screenshots.
|
|
90
|
+
- Explore the JSON schema powered configuration using a [full-blown example](https://github.dev/jrupesh/sfdx-browserforce-plugin/blob/main/examples/full.json) or start with an [empty configuration](https://github.dev/jrupesh/sfdx-browserforce-plugin/blob/main/examples/empty.json).
|
|
91
91
|
|
|
92
92
|
## Installation
|
|
93
93
|
|
|
@@ -197,7 +197,7 @@ FLAG DESCRIPTIONS
|
|
|
197
197
|
The trace file can be viewed with "sf browserforce playwright -- show-trace trace-<date>.zip".
|
|
198
198
|
```
|
|
199
199
|
|
|
200
|
-
_See code: [src/commands/browserforce/apply.ts](https://github.com/jrupesh/sfdx-browserforce-plugin/blob/v1.
|
|
200
|
+
_See code: [src/commands/browserforce/apply.ts](https://github.com/jrupesh/sfdx-browserforce-plugin/blob/v1.1.0/src/commands/browserforce/apply.ts)_
|
|
201
201
|
|
|
202
202
|
## `sf browserforce playwright`
|
|
203
203
|
|
|
@@ -220,7 +220,7 @@ EXAMPLES
|
|
|
220
220
|
$ sf browserforce playwright -- install chromium
|
|
221
221
|
```
|
|
222
222
|
|
|
223
|
-
_See code: [src/commands/browserforce/playwright.ts](https://github.com/jrupesh/sfdx-browserforce-plugin/blob/v1.
|
|
223
|
+
_See code: [src/commands/browserforce/playwright.ts](https://github.com/jrupesh/sfdx-browserforce-plugin/blob/v1.1.0/src/commands/browserforce/playwright.ts)_
|
|
224
224
|
<!-- commandsstop -->
|
|
225
225
|
|
|
226
226
|
## Playwright
|
|
@@ -263,4 +263,4 @@ Please see [CONTRIBUTING.md](CONTRIBUTING.md) for getting started.
|
|
|
263
263
|
|
|
264
264
|
## License
|
|
265
265
|
|
|
266
|
-
MIT © [
|
|
266
|
+
MIT © [Rupesh J](mailto:rupesh.j0701@gmail.com)
|
package/lib/plugins/index.d.ts
CHANGED
|
@@ -8,6 +8,7 @@ import { HighVelocitySalesSettings as highVelocitySalesSettings } from './high-v
|
|
|
8
8
|
import { HistoryTracking as historyTracking } from './history-tracking/index.js';
|
|
9
9
|
import { HomePageLayouts as homePageLayouts } from './home-page-layouts/index.js';
|
|
10
10
|
import { LightningExperienceSettings as lightningExperienceSettings } from './lightning-experience-settings/index.js';
|
|
11
|
+
import { ListViewCustomButtons as listViewCustomButtons } from './list-view-custom-buttons/index.js';
|
|
11
12
|
import { LinkedInSalesNavigatorSettings as linkedInSalesNavigatorSettings } from './linkedin-sales-navigator-settings/index.js';
|
|
12
13
|
import { LoginAsUser as loginAsUser } from './login-as-user/index.js';
|
|
13
14
|
import { LogoutLoginAsUser as logoutLoginAsUser } from './logout-login-as-user/index.js';
|
|
@@ -25,4 +26,4 @@ import { Security as security } from './security/index.js';
|
|
|
25
26
|
import { ServiceChannels as serviceChannels } from './service-channels/index.js';
|
|
26
27
|
import { Slack as slack } from './slack/index.js';
|
|
27
28
|
import { UserAccessPolicies as userAccessPolicies } from './user-access-policies/index.js';
|
|
28
|
-
export { activitySettings, authProviders, companyInformation, customerPortal, densitySettings, emailDeliverability, highVelocitySalesSettings, historyTracking, homePageLayouts, lightningExperienceSettings, linkedInSalesNavigatorSettings, loginAsUser, logoutLoginAsUser, omniChannelSettings, opportunitySplits, permissionSets, picklists, recordTypes, relateContactToMultipleAccounts, reportsAndDashboards, scheduledBatches, salesforceCpqConfig, salesforceToSalesforce, security, serviceChannels, slack, userAccessPolicies, };
|
|
29
|
+
export { activitySettings, authProviders, companyInformation, customerPortal, densitySettings, emailDeliverability, highVelocitySalesSettings, historyTracking, homePageLayouts, lightningExperienceSettings, listViewCustomButtons, linkedInSalesNavigatorSettings, loginAsUser, logoutLoginAsUser, omniChannelSettings, opportunitySplits, permissionSets, picklists, recordTypes, relateContactToMultipleAccounts, reportsAndDashboards, scheduledBatches, salesforceCpqConfig, salesforceToSalesforce, security, serviceChannels, slack, userAccessPolicies, };
|
package/lib/plugins/index.js
CHANGED
|
@@ -8,6 +8,7 @@ import { HighVelocitySalesSettings as highVelocitySalesSettings } from './high-v
|
|
|
8
8
|
import { HistoryTracking as historyTracking } from './history-tracking/index.js';
|
|
9
9
|
import { HomePageLayouts as homePageLayouts } from './home-page-layouts/index.js';
|
|
10
10
|
import { LightningExperienceSettings as lightningExperienceSettings } from './lightning-experience-settings/index.js';
|
|
11
|
+
import { ListViewCustomButtons as listViewCustomButtons } from './list-view-custom-buttons/index.js';
|
|
11
12
|
import { LinkedInSalesNavigatorSettings as linkedInSalesNavigatorSettings } from './linkedin-sales-navigator-settings/index.js';
|
|
12
13
|
import { LoginAsUser as loginAsUser } from './login-as-user/index.js';
|
|
13
14
|
import { LogoutLoginAsUser as logoutLoginAsUser } from './logout-login-as-user/index.js';
|
|
@@ -25,5 +26,5 @@ import { Security as security } from './security/index.js';
|
|
|
25
26
|
import { ServiceChannels as serviceChannels } from './service-channels/index.js';
|
|
26
27
|
import { Slack as slack } from './slack/index.js';
|
|
27
28
|
import { UserAccessPolicies as userAccessPolicies } from './user-access-policies/index.js';
|
|
28
|
-
export { activitySettings, authProviders, companyInformation, customerPortal, densitySettings, emailDeliverability, highVelocitySalesSettings, historyTracking, homePageLayouts, lightningExperienceSettings, linkedInSalesNavigatorSettings, loginAsUser, logoutLoginAsUser, omniChannelSettings, opportunitySplits, permissionSets, picklists, recordTypes, relateContactToMultipleAccounts, reportsAndDashboards, scheduledBatches, salesforceCpqConfig, salesforceToSalesforce, security, serviceChannels, slack, userAccessPolicies, };
|
|
29
|
+
export { activitySettings, authProviders, companyInformation, customerPortal, densitySettings, emailDeliverability, highVelocitySalesSettings, historyTracking, homePageLayouts, lightningExperienceSettings, listViewCustomButtons, linkedInSalesNavigatorSettings, loginAsUser, logoutLoginAsUser, omniChannelSettings, opportunitySplits, permissionSets, picklists, recordTypes, relateContactToMultipleAccounts, reportsAndDashboards, scheduledBatches, salesforceCpqConfig, salesforceToSalesforce, security, serviceChannels, slack, userAccessPolicies, };
|
|
29
30
|
//# sourceMappingURL=index.js.map
|
package/lib/plugins/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,IAAI,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACpF,OAAO,EAAE,aAAa,IAAI,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,kBAAkB,IAAI,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAC1F,OAAO,EAAE,cAAc,IAAI,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC9E,OAAO,EAAE,eAAe,IAAI,eAAe,EAAE,MAAM,6BAA6B,CAAC;AACjF,OAAO,EAAE,mBAAmB,IAAI,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAC7F,OAAO,EAAE,yBAAyB,IAAI,yBAAyB,EAAE,MAAM,yCAAyC,CAAC;AACjH,OAAO,EAAE,eAAe,IAAI,eAAe,EAAE,MAAM,6BAA6B,CAAC;AACjF,OAAO,EAAE,eAAe,IAAI,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAClF,OAAO,EAAE,2BAA2B,IAAI,2BAA2B,EAAE,MAAM,0CAA0C,CAAC;AACtH,OAAO,EAAE,8BAA8B,IAAI,8BAA8B,EAAE,MAAM,8CAA8C,CAAC;AAChI,OAAO,EAAE,WAAW,IAAI,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,iBAAiB,IAAI,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACzF,OAAO,EAAE,mBAAmB,IAAI,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAC9F,OAAO,EAAE,iBAAiB,IAAI,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AACvF,OAAO,EAAE,cAAc,IAAI,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC9E,OAAO,EAAE,SAAS,IAAI,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,WAAW,IAAI,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,+BAA+B,IAAI,+BAA+B,EAAE,MAAM,gDAAgD,CAAC;AACpI,OAAO,EAAE,oBAAoB,IAAI,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACjG,OAAO,EAAE,gBAAgB,IAAI,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACpF,OAAO,EAAE,mBAAmB,IAAI,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAC9F,OAAO,EAAE,sBAAsB,IAAI,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AACvG,OAAO,EAAE,QAAQ,IAAI,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,eAAe,IAAI,eAAe,EAAE,MAAM,6BAA6B,CAAC;AACjF,OAAO,EAAE,KAAK,IAAI,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,kBAAkB,IAAI,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAE3F,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,yBAAyB,EACzB,eAAe,EACf,eAAe,EACf,2BAA2B,EAC3B,8BAA8B,EAC9B,WAAW,EACX,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,cAAc,EACd,SAAS,EACT,WAAW,EACX,+BAA+B,EAC/B,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,EACtB,QAAQ,EACR,eAAe,EACf,KAAK,EACL,kBAAkB,GACnB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,IAAI,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACpF,OAAO,EAAE,aAAa,IAAI,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,kBAAkB,IAAI,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAC1F,OAAO,EAAE,cAAc,IAAI,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC9E,OAAO,EAAE,eAAe,IAAI,eAAe,EAAE,MAAM,6BAA6B,CAAC;AACjF,OAAO,EAAE,mBAAmB,IAAI,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAC7F,OAAO,EAAE,yBAAyB,IAAI,yBAAyB,EAAE,MAAM,yCAAyC,CAAC;AACjH,OAAO,EAAE,eAAe,IAAI,eAAe,EAAE,MAAM,6BAA6B,CAAC;AACjF,OAAO,EAAE,eAAe,IAAI,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAClF,OAAO,EAAE,2BAA2B,IAAI,2BAA2B,EAAE,MAAM,0CAA0C,CAAC;AACtH,OAAO,EAAE,qBAAqB,IAAI,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AACrG,OAAO,EAAE,8BAA8B,IAAI,8BAA8B,EAAE,MAAM,8CAA8C,CAAC;AAChI,OAAO,EAAE,WAAW,IAAI,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,iBAAiB,IAAI,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACzF,OAAO,EAAE,mBAAmB,IAAI,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAC9F,OAAO,EAAE,iBAAiB,IAAI,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AACvF,OAAO,EAAE,cAAc,IAAI,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC9E,OAAO,EAAE,SAAS,IAAI,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,WAAW,IAAI,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,+BAA+B,IAAI,+BAA+B,EAAE,MAAM,gDAAgD,CAAC;AACpI,OAAO,EAAE,oBAAoB,IAAI,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACjG,OAAO,EAAE,gBAAgB,IAAI,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACpF,OAAO,EAAE,mBAAmB,IAAI,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAC9F,OAAO,EAAE,sBAAsB,IAAI,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AACvG,OAAO,EAAE,QAAQ,IAAI,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,eAAe,IAAI,eAAe,EAAE,MAAM,6BAA6B,CAAC;AACjF,OAAO,EAAE,KAAK,IAAI,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,kBAAkB,IAAI,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAE3F,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,yBAAyB,EACzB,eAAe,EACf,eAAe,EACf,2BAA2B,EAC3B,qBAAqB,EACrB,8BAA8B,EAC9B,WAAW,EACX,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,cAAc,EACd,SAAS,EACT,WAAW,EACX,+BAA+B,EAC/B,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,EACtB,QAAQ,EACR,eAAe,EACf,KAAK,EACL,kBAAkB,GACnB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { BrowserforcePlugin } from '../../plugin.js';
|
|
2
|
+
type ListViewCustomButtonsConfig = {
|
|
3
|
+
objectApiName: string;
|
|
4
|
+
buttons: string[];
|
|
5
|
+
removeOtherButtons?: boolean | false;
|
|
6
|
+
};
|
|
7
|
+
export declare class ListViewCustomButtons extends BrowserforcePlugin {
|
|
8
|
+
retrieve(definition?: ListViewCustomButtonsConfig[]): Promise<ListViewCustomButtonsConfig[]>;
|
|
9
|
+
apply(plan: ListViewCustomButtonsConfig[]): Promise<void>;
|
|
10
|
+
private queryWebLinks;
|
|
11
|
+
}
|
|
12
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import assert from 'assert';
|
|
2
|
+
import * as child from 'child_process';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import * as path from 'path';
|
|
5
|
+
import { ListViewCustomButtons } from './index.js';
|
|
6
|
+
const __dirname = fileURLToPath(new URL('.', import.meta.url));
|
|
7
|
+
describe(ListViewCustomButtons.name, function () {
|
|
8
|
+
let plugin;
|
|
9
|
+
before(() => {
|
|
10
|
+
plugin = new ListViewCustomButtons(global.browserforce);
|
|
11
|
+
});
|
|
12
|
+
const enableButtons = [
|
|
13
|
+
{
|
|
14
|
+
objectApiName: 'Task',
|
|
15
|
+
buttons: ['TestListButton', 'TestListButton2'],
|
|
16
|
+
removeOtherButtons: false,
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
objectApiName: 'Event',
|
|
20
|
+
buttons: ['TestListButton', 'TestListButton2'],
|
|
21
|
+
removeOtherButtons: false,
|
|
22
|
+
},
|
|
23
|
+
];
|
|
24
|
+
const enableSingleButton = [
|
|
25
|
+
{
|
|
26
|
+
objectApiName: 'Task',
|
|
27
|
+
buttons: ['TestListButton'],
|
|
28
|
+
removeOtherButtons: false,
|
|
29
|
+
},
|
|
30
|
+
];
|
|
31
|
+
const disableButtons = [
|
|
32
|
+
{
|
|
33
|
+
objectApiName: 'Task',
|
|
34
|
+
buttons: [],
|
|
35
|
+
removeOtherButtons: true,
|
|
36
|
+
},
|
|
37
|
+
];
|
|
38
|
+
const missingButton = [
|
|
39
|
+
{
|
|
40
|
+
objectApiName: 'Task',
|
|
41
|
+
buttons: ['TestListButton', 'NonExistentButton'],
|
|
42
|
+
removeOtherButtons: false,
|
|
43
|
+
},
|
|
44
|
+
];
|
|
45
|
+
it('should deploy test WebLink buttons as a prerequisite', () => {
|
|
46
|
+
const sourceDeployCmd = child.spawnSync('sf', [
|
|
47
|
+
'project',
|
|
48
|
+
'deploy',
|
|
49
|
+
'start',
|
|
50
|
+
'-d',
|
|
51
|
+
path.join(__dirname, 'sfdx-source'),
|
|
52
|
+
'--json',
|
|
53
|
+
]);
|
|
54
|
+
assert.deepStrictEqual(sourceDeployCmd.status, 0, sourceDeployCmd.output.toString());
|
|
55
|
+
});
|
|
56
|
+
it('should add both custom buttons to the list view', async () => {
|
|
57
|
+
await plugin.apply(enableButtons);
|
|
58
|
+
const res = await plugin.retrieve(enableButtons);
|
|
59
|
+
assert.deepStrictEqual(res, enableButtons);
|
|
60
|
+
});
|
|
61
|
+
it('should be idempotent when buttons are already selected', async () => {
|
|
62
|
+
const result = await plugin.run(enableButtons);
|
|
63
|
+
assert.deepStrictEqual(result, { message: 'no action necessary' });
|
|
64
|
+
});
|
|
65
|
+
it('should remove other buttons when removeOtherButtons is true', async () => {
|
|
66
|
+
await plugin.apply([{ objectApiName: 'Task', buttons: ['TestListButton'], removeOtherButtons: true }]);
|
|
67
|
+
const res = await plugin.retrieve([
|
|
68
|
+
{ objectApiName: 'Task', buttons: ['TestListButton'], removeOtherButtons: true },
|
|
69
|
+
]);
|
|
70
|
+
assert.deepStrictEqual(res, [{ objectApiName: 'Task', buttons: ['TestListButton'], removeOtherButtons: true }]);
|
|
71
|
+
});
|
|
72
|
+
it('should remove one button and keep the other', async () => {
|
|
73
|
+
await plugin.apply(enableSingleButton);
|
|
74
|
+
const res = await plugin.retrieve(enableSingleButton);
|
|
75
|
+
assert.deepStrictEqual(res, enableSingleButton);
|
|
76
|
+
});
|
|
77
|
+
it('should remove all custom buttons', async () => {
|
|
78
|
+
await plugin.apply(disableButtons);
|
|
79
|
+
const res = await plugin.retrieve(disableButtons);
|
|
80
|
+
assert.deepStrictEqual(res, disableButtons);
|
|
81
|
+
});
|
|
82
|
+
it('should add found button and warn about missing button without failing', async () => {
|
|
83
|
+
await plugin.apply(missingButton);
|
|
84
|
+
const res = await plugin.retrieve([{ objectApiName: 'Task', buttons: ['TestListButton'] }]);
|
|
85
|
+
assert.strictEqual(res[0].buttons.length, 1);
|
|
86
|
+
assert.strictEqual(res[0].buttons[0], 'TestListButton');
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
//# sourceMappingURL=index.e2e-spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.e2e-spec.js","sourceRoot":"","sources":["../../../src/plugins/list-view-custom-buttons/index.e2e-spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { waitForPageErrors } from '../../browserforce.js';
|
|
2
|
+
import { BrowserforcePlugin } from '../../plugin.js';
|
|
3
|
+
const AVAILABLE_LISTBOX_NAME = 'Available Buttons';
|
|
4
|
+
const SELECTED_LISTBOX_NAME = 'Selected Buttons';
|
|
5
|
+
const SAVE_BUTTON_SELECTOR = 'input[name="save"]';
|
|
6
|
+
function buildPagePath(objectApiName) {
|
|
7
|
+
let pageObjApiName = objectApiName;
|
|
8
|
+
if (objectApiName === 'Task' || objectApiName === 'Event') {
|
|
9
|
+
pageObjApiName = 'Activity';
|
|
10
|
+
}
|
|
11
|
+
return `/p/setup/layout/ListButtonsEdit?LayoutEntity=${pageObjApiName}&retURL=${encodeURIComponent('/setup/forcecomHomepage.apexp')}`;
|
|
12
|
+
}
|
|
13
|
+
export class ListViewCustomButtons extends BrowserforcePlugin {
|
|
14
|
+
async retrieve(definition) {
|
|
15
|
+
const results = [];
|
|
16
|
+
for (const entry of definition) {
|
|
17
|
+
const page = await this.browserforce.openPage(buildPagePath(entry.objectApiName));
|
|
18
|
+
const selectedListbox = page.getByRole('listbox', { name: SELECTED_LISTBOX_NAME });
|
|
19
|
+
await selectedListbox.waitFor();
|
|
20
|
+
const buttonIds = (await Promise.all((await selectedListbox.locator('option').all()).map((opt) => opt.getAttribute('value'))))
|
|
21
|
+
.filter((b) => b?.trim() !== '')
|
|
22
|
+
.map((b) => `'${b?.trim()}'`);
|
|
23
|
+
const result = buttonIds.length > 0
|
|
24
|
+
? await this.browserforce.connection.query(`SELECT Id, Name, NamespacePrefix FROM WebLink WHERE Id IN (${buttonIds.join(',')}) AND PageOrSobjectType = '${entry.objectApiName}'`)
|
|
25
|
+
: { records: [] };
|
|
26
|
+
const buttons = [];
|
|
27
|
+
for (const record of result.records) {
|
|
28
|
+
const fullApiName = record.NamespacePrefix ? `${record.NamespacePrefix}__${record.Name}` : record.Name;
|
|
29
|
+
buttons.push(fullApiName);
|
|
30
|
+
}
|
|
31
|
+
results.push({
|
|
32
|
+
objectApiName: entry.objectApiName,
|
|
33
|
+
buttons: buttons.sort(),
|
|
34
|
+
removeOtherButtons: entry.removeOtherButtons,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
return results;
|
|
38
|
+
}
|
|
39
|
+
async apply(plan) {
|
|
40
|
+
for (const entry of plan) {
|
|
41
|
+
const buttons = await this.queryWebLinks(entry.buttons, entry.objectApiName);
|
|
42
|
+
const buttonApiNames = new Set(buttons.map((b) => (b.NamespacePrefix ? `${b.NamespacePrefix}__${b.Name}` : b.Name)));
|
|
43
|
+
const missingButtons = entry.buttons.filter((b) => !buttonApiNames.has(b));
|
|
44
|
+
if (missingButtons.length > 0) {
|
|
45
|
+
this.browserforce.logger?.warn(`[${entry.objectApiName}] WebLink(s) not found for button API name(s): ${missingButtons.map((b) => `"${b}"`).join(', ')}. Skipping missing buttons.`);
|
|
46
|
+
}
|
|
47
|
+
const targetButtonIds = buttons.map((b) => b.Id.slice(0, 15));
|
|
48
|
+
const page = await this.browserforce.openPage(buildPagePath(entry.objectApiName));
|
|
49
|
+
const availableListbox = page.getByRole('listbox', { name: AVAILABLE_LISTBOX_NAME });
|
|
50
|
+
const selectedListbox = page.getByRole('listbox', { name: SELECTED_LISTBOX_NAME });
|
|
51
|
+
await availableListbox.waitFor();
|
|
52
|
+
const availableButtonIds = (await Promise.all((await availableListbox.locator('option').all()).map((opt) => opt.getAttribute('value')))).map((b) => b?.trim() ?? '');
|
|
53
|
+
const selectedButtonIds = (await Promise.all((await selectedListbox.locator('option').all()).map((opt) => opt.getAttribute('value'))))
|
|
54
|
+
.map((b) => b?.trim() ?? '')
|
|
55
|
+
.filter((b) => b !== '');
|
|
56
|
+
const addButton = page.locator('img.rightArrowIcon');
|
|
57
|
+
const removeButton = page.locator('img.leftArrowIcon');
|
|
58
|
+
for (const buttonId of targetButtonIds) {
|
|
59
|
+
if (availableButtonIds.includes(buttonId) && !selectedButtonIds.includes(buttonId)) {
|
|
60
|
+
await availableListbox.selectOption({ value: buttonId });
|
|
61
|
+
await addButton.click();
|
|
62
|
+
await selectedListbox.locator(`option[value="${buttonId}"]`).waitFor();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (entry.removeOtherButtons) {
|
|
66
|
+
for (const buttonId of selectedButtonIds) {
|
|
67
|
+
if (!targetButtonIds.includes(buttonId)) {
|
|
68
|
+
await selectedListbox.selectOption({ value: buttonId });
|
|
69
|
+
await removeButton.click();
|
|
70
|
+
await availableListbox.locator(`option[value="${buttonId}"]`).waitFor();
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
await page.locator(SAVE_BUTTON_SELECTOR).click();
|
|
75
|
+
await Promise.race([
|
|
76
|
+
page.waitForURL((url) => url.pathname === '/setup/forcecomHomepage.apexp'),
|
|
77
|
+
waitForPageErrors(page),
|
|
78
|
+
]);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
async queryWebLinks(apiNames, objectApiName) {
|
|
82
|
+
if (!apiNames?.length) {
|
|
83
|
+
return [];
|
|
84
|
+
}
|
|
85
|
+
const conditions = [];
|
|
86
|
+
for (const name of apiNames) {
|
|
87
|
+
const parts = name.split('__');
|
|
88
|
+
if (parts.length > 1) {
|
|
89
|
+
const namespace = parts[0];
|
|
90
|
+
const devName = parts.slice(1).join('__');
|
|
91
|
+
conditions.push(`(Name = '${devName}' AND NamespacePrefix = '${namespace}')`);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
conditions.push(`(Name = '${name}' AND NamespacePrefix = NULL)`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
const result = await this.browserforce.connection.query(`SELECT Id, Name, NamespacePrefix FROM WebLink WHERE (${conditions.join(' OR ')}) AND PageOrSobjectType = '${objectApiName}'`);
|
|
98
|
+
return result.records;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/list-view-custom-buttons/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import assert from 'assert';
|
|
2
|
+
import * as child from 'child_process';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import * as path from 'path';
|
|
5
|
+
import { ScheduledBatches } from './index.js';
|
|
6
|
+
const __dirname = fileURLToPath(new URL('.', import.meta.url));
|
|
7
|
+
describe(ScheduledBatches.name, function () {
|
|
8
|
+
this.timeout('10m');
|
|
9
|
+
let plugin;
|
|
10
|
+
let scheduleObjectApi;
|
|
11
|
+
let namespace;
|
|
12
|
+
let permissionSetName;
|
|
13
|
+
let assignedPermissionSetInTest = false;
|
|
14
|
+
let createdRecordIds = [];
|
|
15
|
+
before(async () => {
|
|
16
|
+
plugin = new ScheduledBatches(global.browserforce);
|
|
17
|
+
const sourceDeployCmd = child.spawnSync('sf', [
|
|
18
|
+
'project',
|
|
19
|
+
'deploy',
|
|
20
|
+
'start',
|
|
21
|
+
'-d',
|
|
22
|
+
path.join(__dirname, 'sfdx-source'),
|
|
23
|
+
'--json',
|
|
24
|
+
]);
|
|
25
|
+
assert.deepStrictEqual(sourceDeployCmd.status, 0, sourceDeployCmd.output.toString());
|
|
26
|
+
scheduleObjectApi = await resolveScheduleObjectApiName();
|
|
27
|
+
namespace = scheduleObjectApi.replace(/BatchJobSchedule__c$/, '');
|
|
28
|
+
permissionSetName = await resolvePermissionSetName();
|
|
29
|
+
const username = global.browserforce.connection.getUsername();
|
|
30
|
+
const userIdsResult = (await global.browserforce.connection.query(`SELECT Id FROM User WHERE Username = '${username}' LIMIT 1`));
|
|
31
|
+
const userId = userIdsResult.records[0]?.Id;
|
|
32
|
+
assert.ok(userId, 'Could not resolve current user id');
|
|
33
|
+
const existingPsa = (await global.browserforce.connection.query(`SELECT Id FROM PermissionSetAssignment WHERE PermissionSet.Name='${permissionSetName}' AND AssigneeId='${userId}'`));
|
|
34
|
+
if (existingPsa.records.length === 0) {
|
|
35
|
+
const permSetAssignCmd = child.spawnSync('sf', ['org', 'assign', 'permset', '-n', permissionSetName, '--json']);
|
|
36
|
+
assert.deepStrictEqual(permSetAssignCmd.status, 0, permSetAssignCmd.output.toString());
|
|
37
|
+
assignedPermissionSetInTest = true;
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
beforeEach(async () => {
|
|
41
|
+
createdRecordIds = [];
|
|
42
|
+
const testSuffix = Date.now().toString();
|
|
43
|
+
const createResult = await global.browserforce.connection.sobject(scheduleObjectApi).create([
|
|
44
|
+
{
|
|
45
|
+
Name: `ScheduledBatchA-${testSuffix}`,
|
|
46
|
+
Enabled__c: false,
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
Name: `ScheduledBatchB-${testSuffix}`,
|
|
50
|
+
Enabled__c: false,
|
|
51
|
+
},
|
|
52
|
+
]);
|
|
53
|
+
const results = Array.isArray(createResult) ? createResult : [createResult];
|
|
54
|
+
for (const result of results) {
|
|
55
|
+
assert.strictEqual(result.success, true, result.errors?.join(','));
|
|
56
|
+
createdRecordIds.push(result.id);
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
afterEach(async () => {
|
|
60
|
+
if (createdRecordIds.length) {
|
|
61
|
+
await global.browserforce.connection.delete(scheduleObjectApi, createdRecordIds);
|
|
62
|
+
createdRecordIds = [];
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
after(async () => {
|
|
66
|
+
if (!assignedPermissionSetInTest) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
const userId = global.browserforce.connection.userInfo?.id;
|
|
70
|
+
if (userId) {
|
|
71
|
+
const psaResult = (await global.browserforce.connection.query(`SELECT Id FROM PermissionSetAssignment WHERE PermissionSet.Name='${permissionSetName}' AND AssigneeId='${userId}'`));
|
|
72
|
+
if (psaResult.records.length) {
|
|
73
|
+
await global.browserforce.connection.delete('PermissionSetAssignment', psaResult.records.map((record) => record.Id));
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
it('should apply scheduled checkbox changes for selected jobs', async () => {
|
|
78
|
+
const records = (await global.browserforce.connection.query(`SELECT Id, Name, Enabled__c FROM ${scheduleObjectApi} WHERE Id IN ('${createdRecordIds.join("','")}') ORDER BY Name`));
|
|
79
|
+
const selectedName = records.records[0].Name;
|
|
80
|
+
const config = {
|
|
81
|
+
namespace,
|
|
82
|
+
jobScheduleNames: [selectedName],
|
|
83
|
+
};
|
|
84
|
+
await plugin.apply(config);
|
|
85
|
+
const updated = (await global.browserforce.connection.query(`SELECT Name, Enabled__c FROM ${scheduleObjectApi} WHERE Id IN ('${createdRecordIds.join("','")}') ORDER BY Name`));
|
|
86
|
+
assert.strictEqual(updated.records.find((record) => record.Name === selectedName)?.Enabled__c, true, 'Selected job should be enabled');
|
|
87
|
+
});
|
|
88
|
+
it('should retrieve currently scheduled jobs', async () => {
|
|
89
|
+
const records = (await global.browserforce.connection.query(`SELECT Id, Name, Enabled__c FROM ${scheduleObjectApi} WHERE Id IN ('${createdRecordIds.join("','")}') ORDER BY Name`));
|
|
90
|
+
const selectedName = records.records[0].Name;
|
|
91
|
+
await plugin.apply({
|
|
92
|
+
namespace,
|
|
93
|
+
jobScheduleNames: [selectedName],
|
|
94
|
+
});
|
|
95
|
+
const retrieved = await plugin.retrieve({
|
|
96
|
+
namespace,
|
|
97
|
+
allJobScheduleNames: true,
|
|
98
|
+
});
|
|
99
|
+
assert.ok(retrieved?.jobScheduleNames?.includes(selectedName), 'retrieve() should return enabled test job');
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
async function resolveScheduleObjectApiName() {
|
|
103
|
+
const globalDescribe = await global.browserforce.connection.describeGlobal();
|
|
104
|
+
const match = globalDescribe.sobjects.find((sobject) => sobject.name.endsWith('BatchJobSchedule__c'));
|
|
105
|
+
assert.ok(match, 'Could not find BatchJobSchedule__c object after metadata deployment');
|
|
106
|
+
return match.name;
|
|
107
|
+
}
|
|
108
|
+
async function resolvePermissionSetName() {
|
|
109
|
+
const result = (await global.browserforce.connection.query("SELECT Name FROM PermissionSet WHERE Name LIKE '%BatchJobSchedule' ORDER BY Name DESC LIMIT 1"));
|
|
110
|
+
assert.ok(result.records.length > 0, 'Could not find BatchJobSchedule permission set after metadata deployment');
|
|
111
|
+
return result.records[0].Name;
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=index.e2e-spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.e2e-spec.js","sourceRoot":"","sources":["../../../src/plugins/scheduled-batches/index.e2e-spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -59,21 +59,18 @@ export class ScheduledBatches extends BrowserforcePlugin {
|
|
|
59
59
|
async retrieve(definition) {
|
|
60
60
|
const env_1 = { stack: [], error: void 0, hasError: false };
|
|
61
61
|
try {
|
|
62
|
-
if (!definition?.namespace) {
|
|
63
|
-
return undefined;
|
|
64
|
-
}
|
|
65
62
|
if (!definition.allJobScheduleNames && (!definition.jobScheduleNames || definition.jobScheduleNames.length === 0)) {
|
|
66
63
|
throw new Error('jobScheduleNames or allJobScheduleNames is required');
|
|
67
64
|
}
|
|
68
|
-
const page = __addDisposableResource(env_1, await this.browserforce.openPage(BASE_PATH.replace('{NAMESPACE}', definition.namespace)), true);
|
|
65
|
+
const page = __addDisposableResource(env_1, await this.browserforce.openPage(BASE_PATH.replace('{NAMESPACE}', definition.namespace || '')), true);
|
|
69
66
|
const frameOrPage = await this.browserforce.waitForSelectorInFrameOrPage(page, ScheduledBatchesPage.getTableSelector());
|
|
70
67
|
const scheduledBatchesPage = new ScheduledBatchesPage(frameOrPage);
|
|
71
68
|
let jobScheduleNames = [];
|
|
72
69
|
if (definition.allJobScheduleNames) {
|
|
73
|
-
jobScheduleNames = await scheduledBatchesPage.resolveAllJobScheduleNames(this.browserforce, SCHEDULE_OBJECT_API.replace('{NAMESPACE}', definition.namespace));
|
|
70
|
+
jobScheduleNames = await scheduledBatchesPage.resolveAllJobScheduleNames(this.browserforce, SCHEDULE_OBJECT_API.replace('{NAMESPACE}', definition.namespace || ''));
|
|
74
71
|
}
|
|
75
72
|
else {
|
|
76
|
-
jobScheduleNames = await scheduledBatchesPage.resolveJobScheduleNames(this.browserforce, definition.jobScheduleNames, SCHEDULE_OBJECT_API.replace('{NAMESPACE}', definition.namespace));
|
|
73
|
+
jobScheduleNames = await scheduledBatchesPage.resolveJobScheduleNames(this.browserforce, definition.jobScheduleNames, SCHEDULE_OBJECT_API.replace('{NAMESPACE}', definition.namespace || ''));
|
|
77
74
|
}
|
|
78
75
|
const scheduled = [];
|
|
79
76
|
for (const jobSchedule of jobScheduleNames) {
|
|
@@ -106,21 +103,18 @@ export class ScheduledBatches extends BrowserforcePlugin {
|
|
|
106
103
|
async apply(config) {
|
|
107
104
|
const env_2 = { stack: [], error: void 0, hasError: false };
|
|
108
105
|
try {
|
|
109
|
-
if (!config.namespace) {
|
|
110
|
-
throw new Error('namespace is required');
|
|
111
|
-
}
|
|
112
106
|
if (!config.allJobScheduleNames && (!config.jobScheduleNames || config.jobScheduleNames.length === 0)) {
|
|
113
107
|
throw new Error('jobScheduleNames is required when allJobScheduleNames is false');
|
|
114
108
|
}
|
|
115
|
-
const page = __addDisposableResource(env_2, await this.browserforce.openPage(BASE_PATH.replace('{NAMESPACE}', config.namespace)), true);
|
|
109
|
+
const page = __addDisposableResource(env_2, await this.browserforce.openPage(BASE_PATH.replace('{NAMESPACE}', config.namespace || '')), true);
|
|
116
110
|
const frameOrPage = await this.browserforce.waitForSelectorInFrameOrPage(page, ScheduledBatchesPage.getTableSelector());
|
|
117
111
|
const scheduledBatchesPage = new ScheduledBatchesPage(frameOrPage);
|
|
118
112
|
let jobScheduleNames = [];
|
|
119
113
|
if (config.allJobScheduleNames) {
|
|
120
|
-
jobScheduleNames = await scheduledBatchesPage.resolveAllJobScheduleNames(this.browserforce, SCHEDULE_OBJECT_API.replace('{NAMESPACE}', config.namespace));
|
|
114
|
+
jobScheduleNames = await scheduledBatchesPage.resolveAllJobScheduleNames(this.browserforce, SCHEDULE_OBJECT_API.replace('{NAMESPACE}', config.namespace || ''));
|
|
121
115
|
}
|
|
122
116
|
else {
|
|
123
|
-
jobScheduleNames = await scheduledBatchesPage.resolveJobScheduleNames(this.browserforce, config.jobScheduleNames, SCHEDULE_OBJECT_API.replace('{NAMESPACE}', config.namespace));
|
|
117
|
+
jobScheduleNames = await scheduledBatchesPage.resolveJobScheduleNames(this.browserforce, config.jobScheduleNames, SCHEDULE_OBJECT_API.replace('{NAMESPACE}', config.namespace || ''));
|
|
124
118
|
}
|
|
125
119
|
for (const jobSchedule of jobScheduleNames) {
|
|
126
120
|
const checkbox = frameOrPage.locator(SCHEDULED_CHECKBOX_SELECTOR.replace('{ID}', jobSchedule.id));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/scheduled-batches/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAEjD,MAAM,2BAA2B,GAAG,+CAA+C,CAAC;AACpF,MAAM,SAAS,GAAsB,wDAAwD,CAAC;AAC9F,MAAM,mBAAmB,GAAG,gCAAgC,CAAC;AAQ7D,MAAM,OAAO,gBAAiB,SAAQ,kBAAkB;IAC/C,KAAK,CAAC,QAAQ,CAAC,UAAmB;;;YACvC,IAAI,CAAC,UAAU,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/scheduled-batches/index.ts"],"names":[],"mappings":"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"}
|
package/oclif.manifest.json
CHANGED