@cakemail-org/ui-components-v2 2.2.102 → 2.2.104

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 (35) hide show
  1. package/dist/cjs/components/index.d.ts +1 -0
  2. package/dist/cjs/components/scopePicker/index.d.ts +8 -0
  3. package/dist/cjs/components/scopePicker/scopeGroups.d.ts +21 -0
  4. package/dist/cjs/components/scopePicker/types.d.ts +1 -0
  5. package/dist/cjs/components/textField/types.d.ts +1 -1
  6. package/dist/cjs/data/theme/MuiTextField.d.ts +27 -0
  7. package/dist/cjs/factories/index.d.ts +1 -0
  8. package/dist/cjs/factories/personalAccessTokens/index.d.ts +22 -0
  9. package/dist/cjs/factories/personalAccessTokens/types.d.ts +1 -0
  10. package/dist/cjs/index.js +470 -4
  11. package/dist/cjs/models/index.d.ts +1 -0
  12. package/dist/cjs/models/personalAccessToken/index.d.ts +21 -0
  13. package/dist/cjs/models/personalAccessToken/types.d.ts +10 -0
  14. package/dist/cjs/services/index.d.ts +1 -0
  15. package/dist/cjs/services/personalAccessTokens/index.d.ts +24 -0
  16. package/dist/cjs/services/personalAccessTokens/types.d.ts +1 -0
  17. package/dist/cjs/utils/posthog.d.ts +5 -1
  18. package/dist/esm/components/index.d.ts +1 -0
  19. package/dist/esm/components/scopePicker/index.d.ts +8 -0
  20. package/dist/esm/components/scopePicker/scopeGroups.d.ts +21 -0
  21. package/dist/esm/components/scopePicker/types.d.ts +1 -0
  22. package/dist/esm/components/textField/types.d.ts +1 -1
  23. package/dist/esm/data/theme/MuiTextField.d.ts +27 -0
  24. package/dist/esm/factories/index.d.ts +1 -0
  25. package/dist/esm/factories/personalAccessTokens/index.d.ts +22 -0
  26. package/dist/esm/factories/personalAccessTokens/types.d.ts +1 -0
  27. package/dist/esm/index.js +464 -6
  28. package/dist/esm/models/index.d.ts +1 -0
  29. package/dist/esm/models/personalAccessToken/index.d.ts +21 -0
  30. package/dist/esm/models/personalAccessToken/types.d.ts +10 -0
  31. package/dist/esm/services/index.d.ts +1 -0
  32. package/dist/esm/services/personalAccessTokens/index.d.ts +24 -0
  33. package/dist/esm/services/personalAccessTokens/types.d.ts +1 -0
  34. package/dist/esm/utils/posthog.d.ts +5 -1
  35. package/package.json +1 -1
package/dist/cjs/index.js CHANGED
@@ -3895,6 +3895,10 @@ exports.EEvents = void 0;
3895
3895
  EEvents["CUSTOM_DOMAIN_CREATED"] = "CustomDomain.Created";
3896
3896
  EEvents["CUSTOM_DOMAIN_VERIFIED"] = "CustomDomain.Verified";
3897
3897
  EEvents["CUSTOM_DOMAIN_DELETED"] = "CustomDomain.Deleted";
3898
+ EEvents["PAT_CREATED"] = "PAT.Created";
3899
+ EEvents["PAT_UPDATED"] = "PAT.Updated";
3900
+ EEvents["PAT_REVOKED"] = "PAT.Revoked";
3901
+ EEvents["PAT_TOKEN_COPIED"] = "PAT.Token.Copied";
3898
3902
  })(exports.EEvents || (exports.EEvents = {}));
3899
3903
  function eventCondition(type, disabledEvents) {
3900
3904
  if (disabledEvents === void 0) { disabledEvents = []; }
@@ -5738,6 +5742,37 @@ function getMuiTableRow(theme) {
5738
5742
 
5739
5743
  function getMuiTextField(theme) {
5740
5744
  return {
5745
+ variants: [
5746
+ {
5747
+ props: { size: "small" },
5748
+ style: {
5749
+ ".MuiInputBase-root > input, .MuiInputBase-root > textarea": {
5750
+ padding: theme.spacing(3, 3.5),
5751
+ fontSize: theme.typography.body1.fontSize,
5752
+ lineHeight: theme.typography.body1.lineHeight,
5753
+ },
5754
+ ".MuiSvgIcon-root": {
5755
+ top: "1.5rem !important",
5756
+ },
5757
+ },
5758
+ },
5759
+ {
5760
+ props: { size: "medium" },
5761
+ style: {
5762
+ ".MuiInputBase-root > input, .MuiInputBase-root > textarea": {
5763
+ padding: theme.spacing(4, 3.5),
5764
+ }
5765
+ },
5766
+ },
5767
+ {
5768
+ props: { size: "large" },
5769
+ style: {
5770
+ ".MuiInputBase-root > input, .MuiInputBase-root > textarea": {
5771
+ padding: theme.spacing(5, 3.5),
5772
+ }
5773
+ },
5774
+ },
5775
+ ],
5741
5776
  styleOverrides: {
5742
5777
  root: {
5743
5778
  ".MuiInputLabel-root": __assign(__assign({}, theme.typography.body2), { color: theme.palette.body1.main, transform: "translate(14px, -9px)", ">div": {
@@ -7673,11 +7708,11 @@ function LoadingContainer(_a) {
7673
7708
  React.createElement(Container, { className: "loadingContainer-component-v2 ".concat(className), sx: { display: "flex", alignItems: "center", justifyContent: "center", width: "100%" } }, loader)));
7674
7709
  }
7675
7710
 
7676
- var css_248z$v = ".textfield-component-v2 {\n position: relative;\n}\n.textfield-component-v2.disabled {\n opacity: 0.65;\n pointer-events: none;\n}\n.textfield-component-v2 .MuiSvgIcon-root ~ .MuiFormControl-root .MuiInputBase-input {\n padding-left: 42px;\n}\n.textfield-component-v2 .MuiSvgIcon-root {\n position: absolute;\n left: 1rem;\n top: 1.65rem;\n transform: translateY(-50%);\n z-index: 1;\n}\n\n.locationTextField-component-v2 {\n position: relative;\n}\n.locationTextField-component-v2 .autocomplete-dropdown-container {\n position: absolute;\n width: 100%;\n z-index: 10000;\n}\n\n.phoneTextField-component-v2 .MuiInputAdornment-root .MuiSelect-select {\n padding-right: 1.75rem !important;\n}\n.phoneTextField-component-v2 .MuiInputAdornment-root .MuiSelect-icon {\n display: inline-block;\n right: 0.5rem;\n}\n\n.react-international-phone-flag-emoji {\n width: 1.5rem;\n height: 1.5rem;\n}\n\n.colorTextField-component-v2 {\n position: relative;\n}\n.colorTextField-component-v2 .boxedColor {\n position: absolute;\n width: 20px;\n height: 20px;\n border-radius: 20px;\n left: 1rem;\n top: 1.65rem;\n transform: translateY(-50%);\n z-index: 1;\n}\n.colorTextField-component-v2 .boxedColor .MuiSvgIcon-root {\n width: unset;\n height: unset;\n}\n.colorTextField-component-v2 .boxedColor::after {\n position: absolute;\n width: 6px;\n height: 6px;\n content: \"\";\n background-color: var(--white, #FFFFFF);\n border-radius: 20px;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n}\n.colorTextField-component-v2 .boxedColor ~ .textfield-component-v2 .MuiInputBase-input {\n padding-left: 44px;\n}\n.colorTextField-component-v2.bottom .react-colorful {\n top: 3.5rem;\n}\n.colorTextField-component-v2.top .react-colorful {\n bottom: 4rem;\n}\n.colorTextField-component-v2 .react-colorful {\n width: 100%;\n position: absolute;\n}";
7711
+ var css_248z$v = ".textfield-component-v2 {\n position: relative;\n}\n.textfield-component-v2.small .MuiSvgIcon-root {\n top: 1.4rem !important;\n}\n.textfield-component-v2.disabled {\n opacity: 0.65;\n pointer-events: none;\n}\n.textfield-component-v2 .MuiSvgIcon-root ~ .MuiFormControl-root .MuiInputBase-input {\n padding-left: 42px;\n}\n.textfield-component-v2 .MuiSvgIcon-root {\n position: absolute;\n left: 1rem;\n top: 1.65rem;\n transform: translateY(-50%);\n z-index: 1;\n}\n\n.locationTextField-component-v2 {\n position: relative;\n}\n.locationTextField-component-v2 .autocomplete-dropdown-container {\n position: absolute;\n width: 100%;\n z-index: 10000;\n}\n\n.phoneTextField-component-v2 .MuiInputAdornment-root .MuiSelect-select {\n padding-right: 1.75rem !important;\n}\n.phoneTextField-component-v2 .MuiInputAdornment-root .MuiSelect-icon {\n display: inline-block;\n right: 0.5rem;\n}\n\n.react-international-phone-flag-emoji {\n width: 1.5rem;\n height: 1.5rem;\n}\n\n.colorTextField-component-v2 {\n position: relative;\n}\n.colorTextField-component-v2 .boxedColor {\n position: absolute;\n width: 20px;\n height: 20px;\n border-radius: 20px;\n left: 1rem;\n top: 1.65rem;\n transform: translateY(-50%);\n z-index: 1;\n}\n.colorTextField-component-v2 .boxedColor .MuiSvgIcon-root {\n width: unset;\n height: unset;\n}\n.colorTextField-component-v2 .boxedColor::after {\n position: absolute;\n width: 6px;\n height: 6px;\n content: \"\";\n background-color: var(--white, #FFFFFF);\n border-radius: 20px;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n}\n.colorTextField-component-v2 .boxedColor ~ .textfield-component-v2 .MuiInputBase-input {\n padding-left: 44px;\n}\n.colorTextField-component-v2.bottom .react-colorful {\n top: 3.5rem;\n}\n.colorTextField-component-v2.top .react-colorful {\n bottom: 4rem;\n}\n.colorTextField-component-v2 .react-colorful {\n width: 100%;\n position: absolute;\n}";
7677
7712
  styleInject(css_248z$v);
7678
7713
 
7679
7714
  var TextField = React.forwardRef(function (_a, ref) {
7680
- var _b = _a.className, className = _b === void 0 ? "" : _b, label = _a.label, timeout = _a.timeout, labelTooltipText = _a.labelTooltipText, disabled = _a.disabled; _a.useBareBoneInput; var onChange = _a.onChange, multiline = _a.multiline, inputProps = _a.inputProps, iconName = _a.iconName, onKeyDown = _a.onKeyDown, props = __rest(_a, ["className", "label", "timeout", "labelTooltipText", "disabled", "useBareBoneInput", "onChange", "multiline", "inputProps", "iconName", "onKeyDown"]);
7715
+ var _b = _a.className, className = _b === void 0 ? "" : _b, label = _a.label, timeout = _a.timeout, labelTooltipText = _a.labelTooltipText, disabled = _a.disabled; _a.useBareBoneInput; var onChange = _a.onChange, multiline = _a.multiline, inputProps = _a.inputProps, iconName = _a.iconName, onKeyDown = _a.onKeyDown, size = _a.size, props = __rest(_a, ["className", "label", "timeout", "labelTooltipText", "disabled", "useBareBoneInput", "onChange", "multiline", "inputProps", "iconName", "onKeyDown", "size"]);
7681
7716
  var cLabel = label;
7682
7717
  var timeoutRef = React.useRef(undefined);
7683
7718
  function onChangeHandler(e) {
@@ -7724,9 +7759,9 @@ var TextField = React.forwardRef(function (_a, ref) {
7724
7759
  onKeyDown && onKeyDown(event);
7725
7760
  }
7726
7761
  inputProps = __assign({ maxLength: 256 }, inputProps);
7727
- return React.createElement(Box, { className: "textfield-component-v2 ".concat(className, " ").concat(disabled ? "disabled" : "", " ") },
7762
+ return React.createElement(Box, { className: "textfield-component-v2 ".concat(className, " ").concat(disabled ? "disabled" : "", " ").concat(size) },
7728
7763
  iconName && React.createElement(Icon, { name: iconName }),
7729
- React.createElement(MUITextField, __assign({}, props, { inputProps: inputProps, onChange: onChangeHandler, label: cLabel, disabled: disabled, onKeyDown: handleKeyDown, multiline: multiline, inputRef: ref })));
7764
+ React.createElement(MUITextField, __assign({}, props, { inputProps: inputProps, onChange: onChangeHandler, label: cLabel, disabled: disabled, onKeyDown: handleKeyDown, multiline: multiline, inputRef: ref, size: size })));
7730
7765
  });
7731
7766
 
7732
7767
  var css_248z$u = ".assetmanager-component-v2 {\n box-shadow: 0 0 15px 0 rgba(0, 0, 0, 0.15);\n background: var(--background-color-1, var(--white, #FFFFFF));\n min-width: 25rem;\n width: 100%;\n}\n.assetmanager-component-v2 .loadingContainer-component-v2 {\n padding: 3rem;\n}\n.assetmanager-component-v2 .container {\n padding: 0.75rem;\n}\n.assetmanager-component-v2 .container > div.textInputContainer {\n display: flex;\n border: solid 1px var(--wild-sand, #dddddd);\n border-radius: 6px;\n justify-content: flex-start;\n align-items: center;\n}\n.assetmanager-component-v2 .container > div.textInputContainer > div .MuiSvgIcon-root {\n display: block;\n cursor: pointer;\n}\n.assetmanager-component-v2 .container > div.textInputContainer > div:first-child {\n padding: 0 0.75rem 0 0.75rem;\n height: 100%;\n}\n.assetmanager-component-v2 .container > div.textInputContainer > div:last-child:not(.textfield-component-v2) {\n padding: 0 0.875rem;\n height: 100%;\n}\n.assetmanager-component-v2 .container > div.textInputContainer .textfield-component-v2 {\n width: 100%;\n}\n.assetmanager-component-v2 .container > div.textInputContainer .textfield-component-v2 fieldset {\n outline: none !important;\n border: none !important;\n}\n.assetmanager-component-v2 .container > div.textInputContainer .textfield-component-v2 input {\n padding: 0.5rem 0 !important;\n}\n.assetmanager-component-v2 .container .optionsListingContainer {\n padding: 0 1.25rem 0.5rem 1.25rem;\n margin: 1.25rem 0 0.5rem 0;\n max-height: 20rem;\n overflow-y: auto;\n}\n.assetmanager-component-v2 .container .optionsListingContainer button {\n text-transform: capitalize;\n}\n.assetmanager-component-v2 .container .optionsListingContainer::-webkit-scrollbar {\n display: block;\n}\n.assetmanager-component-v2 .container .optionsListingContainer::-webkit-scrollbar-track:horizontal {\n position: absolute;\n bottom: -20px;\n}\n.assetmanager-component-v2 .container .optionsListingContainer::-webkit-scrollbar-track:vertical {\n border-bottom-left-radius: 0 !important;\n border-bottom-right-radius: 8px !important;\n border-top-right-radius: 8px !important;\n}\n.assetmanager-component-v2 .container .optionsListingContainer::-webkit-scrollbar-track {\n height: 2.5rem;\n width: 2.5rem;\n padding: 2rem;\n background-clip: content-box;\n border-bottom-left-radius: 8px;\n}\n.assetmanager-component-v2 .container .optionsListingContainer::-webkit-scrollbar-thumb {\n background: var(--body-font-color-2, var(--silver, #9B9B9B));\n border-radius: 24px;\n border-top: 5px solid var(--background-color-1, var(--white, #FFFFFF));\n border-bottom: 5px solid var(--background-color-1, var(--white, #FFFFFF));\n border-right: 5px solid var(--background-color-1, var(--white, #FFFFFF));\n border-left: 5px solid var(--background-color-1, var(--white, #FFFFFF));\n}\n.assetmanager-component-v2 .container .optionsListingContainer > div:first-child:not(.listItem) {\n padding-bottom: 0.75rem;\n text-transform: uppercase;\n font-weight: 700;\n color: var(--body-font-color, var(--dark-matter, #2B2B2B));\n}\n.assetmanager-component-v2 .container .optionsListingContainer > p.h8 {\n margin-bottom: 1rem;\n color: var(--body-font-color, var(--dark-matter, #2B2B2B));\n}\n.assetmanager-component-v2 .container .optionsListingContainer p.h8 {\n flex: 1;\n font-family: proxima-nova, Lucida Grande, Lucida Sans Unicode, Lucida Sans, Geneva, Verdana, sans-serif;\n text-transform: uppercase;\n font-weight: 700;\n line-height: 1rem;\n font-size: 0.75rem;\n}\n.assetmanager-component-v2 .container .optionsListingContainer .listItem {\n display: flex;\n justify-content: space-between;\n align-items: center;\n min-height: 2rem;\n}\n.assetmanager-component-v2 .container .optionsListingContainer .listItem p.h8 {\n color: var(--body-font-color-2, var(--silver, #9B9B9B));\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n}\n.assetmanager-component-v2 .container .optionsListingContainer .listItem > .MuiSvgIcon-root {\n margin-right: 1rem;\n}\n.assetmanager-component-v2 .container .optionsListingContainer .listItem.selected p.h8 {\n color: var(--secondary-brand-color, var(--teal, #0ABDAE));\n padding-right: 1rem;\n max-width: 100%;\n}\n.assetmanager-component-v2 .container .optionsListingContainer .listItem.selected .MuiSvgIcon-root span svg path {\n fill: var(--secondary-brand-color, var(--teal, #0ABDAE));\n}\n.assetmanager-component-v2 .container .optionsListingContainer .listItem .buttonContainer {\n margin-left: 1rem;\n visibility: hidden;\n}\n.assetmanager-component-v2 .container .optionsListingContainer .listItem .buttonContainer button:nth-child(2) {\n margin-left: 0.5rem;\n}\n.assetmanager-component-v2 .container .optionsListingContainer .listItem:hover .buttonContainer {\n visibility: visible;\n}\n.assetmanager-component-v2 > button:last-child {\n width: 100%;\n text-transform: uppercase;\n font-family: proxima-nova, Lucida Grande, Lucida Sans Unicode, Lucida Sans, Geneva, Verdana, sans-serif;\n height: 3rem;\n border-top: 1px solid var(--wild-sand, #dddddd) !important;\n outline: none;\n border-radius: 0;\n font-weight: 700;\n}";
@@ -11711,6 +11746,57 @@ function renderPage(_a) {
11711
11746
  });
11712
11747
  }
11713
11748
 
11749
+ var BASE_URL = function () { return uiKitConfig.GATEWAY_PROXY + "/pats"; };
11750
+ function listPats(_a) {
11751
+ var page = _a.page, perPage = _a.perPage, status = _a.status;
11752
+ return callApi({
11753
+ url: BASE_URL(),
11754
+ query: camelCase({ page: page, per_page: perPage, status: status }),
11755
+ fetchOptions: { method: exports.EMethods.get }
11756
+ });
11757
+ }
11758
+ function getPat(_a) {
11759
+ var keyPrefix = _a.keyPrefix;
11760
+ return callApi({
11761
+ url: "".concat(BASE_URL(), "/").concat(keyPrefix),
11762
+ fetchOptions: { method: exports.EMethods.get }
11763
+ });
11764
+ }
11765
+ function createPat(_a) {
11766
+ var name = _a.name, scopes = _a.scopes, expiresAt = _a.expiresAt, allowedAccountIds = _a.allowedAccountIds;
11767
+ return callApi({
11768
+ url: BASE_URL(),
11769
+ fetchOptions: {
11770
+ method: exports.EMethods.post,
11771
+ body: { name: name, scopes: scopes, expires_at: expiresAt !== null && expiresAt !== void 0 ? expiresAt : null, allowed_account_ids: allowedAccountIds !== null && allowedAccountIds !== void 0 ? allowedAccountIds : null }
11772
+ }
11773
+ });
11774
+ }
11775
+ function updatePat(_a) {
11776
+ var keyPrefix = _a.keyPrefix, name = _a.name, scopes = _a.scopes, allowedAccountIds = _a.allowedAccountIds;
11777
+ var body = {};
11778
+ if (name !== undefined)
11779
+ body.name = name;
11780
+ if (scopes !== undefined)
11781
+ body.scopes = scopes;
11782
+ if (allowedAccountIds !== undefined)
11783
+ body.allowed_account_ids = allowedAccountIds;
11784
+ return callApi({
11785
+ url: "".concat(BASE_URL(), "/").concat(keyPrefix),
11786
+ fetchOptions: {
11787
+ method: exports.EMethods.patch,
11788
+ body: body
11789
+ }
11790
+ });
11791
+ }
11792
+ function revokePat(_a) {
11793
+ var keyPrefix = _a.keyPrefix;
11794
+ return callApi({
11795
+ url: "".concat(BASE_URL(), "/").concat(keyPrefix),
11796
+ fetchOptions: { method: exports.EMethods.delete }
11797
+ });
11798
+ }
11799
+
11714
11800
  function listPopups(_a) {
11715
11801
  return __awaiter(this, void 0, void 0, function () {
11716
11802
  var options = __rest(_a, []);
@@ -12812,6 +12898,47 @@ var PageModel = /** @class */ (function (_super) {
12812
12898
  return PageModel;
12813
12899
  }(ListPageModel));
12814
12900
 
12901
+ var PersonalAccessTokenModel = /** @class */ (function () {
12902
+ function PersonalAccessTokenModel(params) {
12903
+ this.key_prefix = params.key_prefix;
12904
+ this.name = params.name;
12905
+ this.status = params.status;
12906
+ this.scopes = params.scopes;
12907
+ this.allowed_account_ids = params.allowed_account_ids;
12908
+ this.created_at = params.created_at;
12909
+ this.expires_at = params.expires_at;
12910
+ this.revoked_at = params.revoked_at;
12911
+ }
12912
+ PersonalAccessTokenModel.prototype.toJson = function () { return modelToJson(this); };
12913
+ PersonalAccessTokenModel.prototype.set = function (property, value) { modelSet(this, property, value); };
12914
+ PersonalAccessTokenModel.prototype.update = function (_a) {
12915
+ return __awaiter(this, arguments, void 0, function (_b) {
12916
+ var _this = this;
12917
+ var name = _b.name, scopes = _b.scopes, allowedAccountIds = _b.allowedAccountIds;
12918
+ return __generator(this, function (_c) {
12919
+ return [2 /*return*/, updatePat({ keyPrefix: this.key_prefix, name: name, scopes: scopes, allowedAccountIds: allowedAccountIds })
12920
+ .then(function (data) {
12921
+ trackEvent(exports.EEvents.PAT_UPDATED, { key_prefix: _this.key_prefix });
12922
+ return new PersonalAccessTokenModel(data.data);
12923
+ })];
12924
+ });
12925
+ });
12926
+ };
12927
+ PersonalAccessTokenModel.prototype.revoke = function () {
12928
+ return __awaiter(this, void 0, void 0, function () {
12929
+ var _this = this;
12930
+ return __generator(this, function (_a) {
12931
+ return [2 /*return*/, revokePat({ keyPrefix: this.key_prefix })
12932
+ .then(function (data) {
12933
+ trackEvent(exports.EEvents.PAT_REVOKED, { key_prefix: _this.key_prefix });
12934
+ return new PersonalAccessTokenModel(data.data);
12935
+ })];
12936
+ });
12937
+ });
12938
+ };
12939
+ return PersonalAccessTokenModel;
12940
+ }());
12941
+
12815
12942
  exports.EPopupTriggerType = void 0;
12816
12943
  (function (EPopupTriggerType) {
12817
12944
  EPopupTriggerType["on_page_load"] = "on_page_load";
@@ -18908,6 +19035,298 @@ function ResourceEdit(_a) {
18908
19035
  support && React.createElement(material.Box, { className: "resource-support ".concat(!open ? "open" : "hidden") }, support));
18909
19036
  }
18910
19037
 
19038
+ // Scope implication rules
19039
+ var SCOPE_IMPLICATIONS = {
19040
+ "write": ["read"],
19041
+ "delete": ["read"],
19042
+ "send": ["read"],
19043
+ "import": ["read", "write"],
19044
+ "export": ["read"],
19045
+ "admin": ["read", "write", "delete"],
19046
+ };
19047
+ var SCOPE_CATEGORIES = [
19048
+ {
19049
+ id: "audience",
19050
+ label: "Audience",
19051
+ adminOnly: false,
19052
+ resources: [
19053
+ { resource: "lists", label: "Lists", actions: ["read", "write", "delete"] },
19054
+ { resource: "contacts", label: "Contacts", actions: ["read", "write", "delete", "import", "export"] },
19055
+ { resource: "segments", label: "Segments", actions: ["read", "write", "delete"] },
19056
+ { resource: "tags", label: "Tags", actions: ["read", "write", "delete"] },
19057
+ { resource: "custom_attributes", label: "Custom Attributes", actions: ["read", "write", "delete"] },
19058
+ { resource: "interests", label: "Interests", actions: ["read", "write", "delete"] },
19059
+ ]
19060
+ },
19061
+ {
19062
+ id: "suppressions",
19063
+ label: "Suppressions",
19064
+ adminOnly: false,
19065
+ resources: [
19066
+ { resource: "suppressions", label: "Suppressions", actions: ["read", "write", "delete"] },
19067
+ ]
19068
+ },
19069
+ {
19070
+ id: "campaigns",
19071
+ label: "Campaigns",
19072
+ adminOnly: false,
19073
+ resources: [
19074
+ { resource: "campaigns", label: "Campaigns", actions: ["read", "write", "delete", "send"] },
19075
+ { resource: "campaign_blueprints", label: "Campaign Blueprints", actions: ["read", "write", "delete"] },
19076
+ ]
19077
+ },
19078
+ {
19079
+ id: "templates",
19080
+ label: "Templates",
19081
+ adminOnly: false,
19082
+ resources: [
19083
+ { resource: "templates", label: "Templates", actions: ["read", "write", "delete"] },
19084
+ ]
19085
+ },
19086
+ {
19087
+ id: "emailapi",
19088
+ label: "Email API",
19089
+ adminOnly: false,
19090
+ resources: [
19091
+ { resource: "email_api", label: "Email API", actions: ["read", "send"] },
19092
+ ]
19093
+ },
19094
+ {
19095
+ id: "forms",
19096
+ label: "Forms",
19097
+ adminOnly: false,
19098
+ resources: [
19099
+ { resource: "forms", label: "Forms", actions: ["read", "write", "delete"] },
19100
+ { resource: "preference_centers", label: "Preference Centers", actions: ["read", "write", "delete"] },
19101
+ ]
19102
+ },
19103
+ {
19104
+ id: "deliverability",
19105
+ label: "Deliverability",
19106
+ adminOnly: false,
19107
+ resources: [
19108
+ { resource: "senders", label: "Senders", actions: ["read", "write", "delete"] },
19109
+ { resource: "dkim", label: "DKIM", actions: ["read", "write", "delete"] },
19110
+ { resource: "domains", label: "Domains", actions: ["read", "write", "delete"] },
19111
+ { resource: "logos", label: "Logos", actions: ["read", "write", "delete"] },
19112
+ ]
19113
+ },
19114
+ {
19115
+ id: "webhooks",
19116
+ label: "Webhooks",
19117
+ adminOnly: false,
19118
+ resources: [
19119
+ { resource: "webhooks", label: "Webhooks", actions: ["read", "write", "delete"] },
19120
+ ]
19121
+ },
19122
+ {
19123
+ id: "analytics",
19124
+ label: "Analytics",
19125
+ adminOnly: false,
19126
+ resources: [
19127
+ { resource: "reports", label: "Reports", actions: ["read", "export"] },
19128
+ { resource: "logs", label: "Logs", actions: ["read", "export"] },
19129
+ { resource: "links", label: "Links", actions: ["read"] },
19130
+ { resource: "tasks", label: "Tasks", actions: ["read"] },
19131
+ ]
19132
+ },
19133
+ {
19134
+ id: "account",
19135
+ label: "Account",
19136
+ adminOnly: false,
19137
+ resources: [
19138
+ { resource: "account", label: "Account", actions: ["read", "write"] },
19139
+ ]
19140
+ },
19141
+ {
19142
+ id: "users_admin",
19143
+ label: "Users (Admin)",
19144
+ adminOnly: true,
19145
+ resources: [
19146
+ { resource: "users", label: "Users", actions: ["read", "write", "admin"] },
19147
+ ]
19148
+ },
19149
+ {
19150
+ id: "subaccounts_admin",
19151
+ label: "Sub-accounts (Admin)",
19152
+ adminOnly: true,
19153
+ resources: [
19154
+ { resource: "sub_accounts", label: "Sub-accounts", actions: ["read", "write", "admin"] },
19155
+ ]
19156
+ },
19157
+ {
19158
+ id: "tokens_admin",
19159
+ label: "Tokens (Admin)",
19160
+ adminOnly: true,
19161
+ resources: [
19162
+ { resource: "tokens", label: "Access Tokens", actions: ["read", "admin"] },
19163
+ ]
19164
+ },
19165
+ ];
19166
+ // Helper to get all scopes for a category
19167
+ function getCategoryScopes(categoryId) {
19168
+ var cat = SCOPE_CATEGORIES.find(function (c) { return c.id === categoryId; });
19169
+ if (!cat)
19170
+ return [];
19171
+ return cat.resources.flatMap(function (r) { return r.actions.map(function (a) { return "".concat(r.resource, ":").concat(a); }); });
19172
+ }
19173
+ var SCOPE_PRESETS = [
19174
+ {
19175
+ id: "readonly",
19176
+ label: "Read-only (all)",
19177
+ scopes: SCOPE_CATEGORIES
19178
+ .filter(function (c) { return !c.adminOnly; })
19179
+ .flatMap(function (c) { return c.resources.map(function (r) { return "".concat(r.resource, ":read"); }); })
19180
+ },
19181
+ {
19182
+ id: "full",
19183
+ label: "Full access",
19184
+ scopes: SCOPE_CATEGORIES
19185
+ .filter(function (c) { return !c.adminOnly; })
19186
+ .flatMap(function (c) { return c.resources.flatMap(function (r) { return r.actions.map(function (a) { return "".concat(r.resource, ":").concat(a); }); }); })
19187
+ },
19188
+ {
19189
+ id: "campaigns",
19190
+ label: "Campaigns manager",
19191
+ scopes: __spreadArray(__spreadArray(__spreadArray([], getCategoryScopes("campaigns"), true), getCategoryScopes("templates"), true), [
19192
+ "senders:read",
19193
+ "reports:read",
19194
+ ], false)
19195
+ },
19196
+ {
19197
+ id: "contacts",
19198
+ label: "Contact manager",
19199
+ scopes: __spreadArray(__spreadArray([], getCategoryScopes("audience"), true), getCategoryScopes("suppressions"), true)
19200
+ },
19201
+ {
19202
+ id: "developer",
19203
+ label: "Developer",
19204
+ scopes: __spreadArray(__spreadArray(__spreadArray([], getCategoryScopes("emailapi"), true), getCategoryScopes("webhooks"), true), [
19205
+ "reports:read", "logs:read",
19206
+ ], false)
19207
+ },
19208
+ ];
19209
+
19210
+ function getImpliedScopes(scope) {
19211
+ var _a = scope.split(":"), resource = _a[0], action = _a[1];
19212
+ var implied = SCOPE_IMPLICATIONS[action] || [];
19213
+ return implied.map(function (a) { return "".concat(resource, ":").concat(a); });
19214
+ }
19215
+ function ScopePicker(_a) {
19216
+ var value = _a.value, onChange = _a.onChange, _b = _a.isPartner, isPartner = _b === void 0 ? false : _b, _c = _a.disabled, disabled = _c === void 0 ? false : _c;
19217
+ var _d = React.useState(new Set()), expandedCategories = _d[0], setExpandedCategories = _d[1];
19218
+ var selectedSet = React.useMemo(function () { return new Set(value); }, [value]);
19219
+ var visibleCategories = React.useMemo(function () { return SCOPE_CATEGORIES.filter(function (c) { return !c.adminOnly || isPartner; }); }, [isPartner]);
19220
+ var toggleCategory = React.useCallback(function (categoryId) {
19221
+ setExpandedCategories(function (prev) {
19222
+ var next = new Set(prev);
19223
+ if (next.has(categoryId))
19224
+ next.delete(categoryId);
19225
+ else
19226
+ next.add(categoryId);
19227
+ return next;
19228
+ });
19229
+ }, []);
19230
+ var handleScopeToggle = React.useCallback(function (scope, checked) {
19231
+ if (disabled)
19232
+ return;
19233
+ var next = new Set(selectedSet);
19234
+ if (checked) {
19235
+ next.add(scope);
19236
+ // Add implied scopes
19237
+ getImpliedScopes(scope).forEach(function (s) { return next.add(s); });
19238
+ }
19239
+ else {
19240
+ next.delete(scope);
19241
+ }
19242
+ onChange(Array.from(next));
19243
+ }, [selectedSet, onChange, disabled]);
19244
+ var handleCategorySelectAll = React.useCallback(function (categoryId, checked) {
19245
+ if (disabled)
19246
+ return;
19247
+ var cat = SCOPE_CATEGORIES.find(function (c) { return c.id === categoryId; });
19248
+ if (!cat)
19249
+ return;
19250
+ var next = new Set(selectedSet);
19251
+ cat.resources.forEach(function (r) {
19252
+ r.actions.forEach(function (a) {
19253
+ var scope = "".concat(r.resource, ":").concat(a);
19254
+ if (checked) {
19255
+ next.add(scope);
19256
+ getImpliedScopes(scope).forEach(function (s) { return next.add(s); });
19257
+ }
19258
+ else {
19259
+ next.delete(scope);
19260
+ }
19261
+ });
19262
+ });
19263
+ onChange(Array.from(next));
19264
+ }, [selectedSet, onChange, disabled]);
19265
+ var handlePreset = React.useCallback(function (presetId) {
19266
+ if (disabled)
19267
+ return;
19268
+ var preset = SCOPE_PRESETS.find(function (p) { return p.id === presetId; });
19269
+ if (!preset)
19270
+ return;
19271
+ // Expand all implied scopes
19272
+ var expanded = new Set();
19273
+ preset.scopes.forEach(function (s) {
19274
+ expanded.add(s);
19275
+ getImpliedScopes(s).forEach(function (implied) { return expanded.add(implied); });
19276
+ });
19277
+ onChange(Array.from(expanded));
19278
+ }, [onChange, disabled]);
19279
+ var isCategoryAllSelected = React.useCallback(function (categoryId) {
19280
+ var cat = SCOPE_CATEGORIES.find(function (c) { return c.id === categoryId; });
19281
+ if (!cat)
19282
+ return false;
19283
+ return cat.resources.every(function (r) { return r.actions.every(function (a) { return selectedSet.has("".concat(r.resource, ":").concat(a)); }); });
19284
+ }, [selectedSet]);
19285
+ var isImplied = React.useCallback(function (scope) {
19286
+ // Scope is implied (auto-selected due to another scope) if removing it wouldn't break anything
19287
+ var _a = scope.split(":"), resource = _a[0], action = _a[1];
19288
+ // Check if any other selected scope implies this one
19289
+ return Array.from(selectedSet).some(function (s) {
19290
+ if (s === scope)
19291
+ return false;
19292
+ var _a = s.split(":"), r = _a[0], a = _a[1];
19293
+ if (r !== resource)
19294
+ return false;
19295
+ return (SCOPE_IMPLICATIONS[a] || []).includes(action);
19296
+ });
19297
+ }, [selectedSet]);
19298
+ return (React.createElement("div", { className: "scopePicker", "aria-label": "Permission scope picker" },
19299
+ React.createElement("div", { className: "scopePicker__presets" },
19300
+ React.createElement("span", { className: "scopePicker__presetsLabel" }, "Quick presets:"),
19301
+ React.createElement("div", { className: "scopePicker__presetButtons" }, SCOPE_PRESETS.map(function (preset) { return (React.createElement("button", { key: preset.id, type: "button", className: "scopePicker__presetBtn", onClick: function () { return handlePreset(preset.id); }, disabled: disabled }, preset.label)); }))),
19302
+ React.createElement("div", { className: "scopePicker__categories" }, visibleCategories.map(function (category) {
19303
+ var isExpanded = expandedCategories.has(category.id);
19304
+ var allSelected = isCategoryAllSelected(category.id);
19305
+ return (React.createElement("div", { key: category.id, className: "scopePicker__category ".concat(category.adminOnly ? "scopePicker__category--admin" : "") },
19306
+ React.createElement("div", { className: "scopePicker__categoryHeader" },
19307
+ React.createElement("label", { className: "scopePicker__categorySelect" },
19308
+ React.createElement("input", { type: "checkbox", checked: allSelected, onChange: function (e) { return handleCategorySelectAll(category.id, e.target.checked); }, disabled: disabled, "aria-label": "Select all ".concat(category.label, " scopes") }),
19309
+ React.createElement("span", { className: "scopePicker__categoryLabel" }, category.label)),
19310
+ React.createElement("button", { type: "button", className: "scopePicker__categoryToggle", onClick: function () { return toggleCategory(category.id); }, "aria-expanded": isExpanded, "aria-label": "".concat(isExpanded ? "Collapse" : "Expand", " ").concat(category.label) }, isExpanded ? "▲" : "▼")),
19311
+ isExpanded && (React.createElement("div", { className: "scopePicker__categoryBody" }, category.resources.map(function (resource) { return (React.createElement("div", { key: resource.resource, className: "scopePicker__resource" },
19312
+ React.createElement("span", { className: "scopePicker__resourceLabel" }, resource.label),
19313
+ React.createElement("div", { className: "scopePicker__actions" }, resource.actions.map(function (action) {
19314
+ var scope = "".concat(resource.resource, ":").concat(action);
19315
+ var checked = selectedSet.has(scope);
19316
+ var implied = isImplied(scope);
19317
+ return (React.createElement("label", { key: action, className: "scopePicker__action ".concat(implied ? "scopePicker__action--implied" : ""), title: implied ? "Automatically included by another selected permission" : undefined },
19318
+ React.createElement("input", { type: "checkbox", checked: checked, onChange: function (e) { return handleScopeToggle(scope, e.target.checked); }, disabled: disabled || implied, "aria-label": "".concat(resource.label, " ").concat(action) }),
19319
+ React.createElement("span", null, action)));
19320
+ })))); })))));
19321
+ })),
19322
+ value.length > 0 && (React.createElement("details", { className: "scopePicker__summary" },
19323
+ React.createElement("summary", null,
19324
+ "Selected permissions (",
19325
+ value.length,
19326
+ ")"),
19327
+ React.createElement("div", { className: "scopePicker__summaryList" }, value.sort().map(function (scope) { return (React.createElement("span", { key: scope, className: "scopePicker__summaryChip" }, scope)); }))))));
19328
+ }
19329
+
18911
19330
  var css_248z$2 = ".sideMenu-component-v2 {\n z-index: 8000;\n width: -moz-fit-content;\n width: fit-content;\n}\n.sideMenu-component-v2 .sideMenu-spacer {\n display: none;\n}\n.sideMenu-component-v2.minified:hover .sideMenu-spacer {\n display: block;\n}\n.sideMenu-component-v2 .sideMenu-wrapper {\n z-index: 8000;\n display: flex;\n height: 100%;\n flex-direction: column;\n width: 20rem;\n min-width: 20rem;\n max-width: 20rem;\n padding: 1rem;\n background: var(--shade100, #F3F2F2);\n position: relative;\n box-sizing: border-box;\n}\n.sideMenu-component-v2 .sideMenu-wrapper::-webkit-scrollbar {\n display: block;\n}\n.sideMenu-component-v2 .sideMenu-wrapper::-webkit-scrollbar-track:horizontal {\n position: absolute;\n bottom: -20px;\n}\n.sideMenu-component-v2 .sideMenu-wrapper::-webkit-scrollbar-track:vertical {\n border-bottom-left-radius: 0 !important;\n border-bottom-right-radius: 8px !important;\n border-top-right-radius: 8px !important;\n}\n.sideMenu-component-v2 .sideMenu-wrapper::-webkit-scrollbar-track {\n height: 2.5rem;\n width: 2.5rem;\n padding: 2rem;\n background-clip: content-box;\n border-bottom-left-radius: 8px;\n}\n.sideMenu-component-v2 .sideMenu-wrapper::-webkit-scrollbar-thumb {\n background: var(--body-font-color-2, var(--silver, #9B9B9B));\n border-radius: 24px;\n border-top: 5px solid var(--background-color-1, var(--white, #FFFFFF));\n border-bottom: 5px solid var(--background-color-1, var(--white, #FFFFFF));\n border-right: 5px solid var(--background-color-1, var(--white, #FFFFFF));\n border-left: 5px solid var(--background-color-1, var(--white, #FFFFFF));\n}\n.sideMenu-component-v2 .sideMenu-wrapper.minified:hover {\n box-shadow: 0px 0px 32px 0px rgba(0, 0, 0, 0.15);\n position: absolute !important;\n}\n.sideMenu-component-v2 .sideMenu-wrapper.minified:not(:hover) {\n gap: 1rem;\n max-width: 73px;\n min-width: 73px;\n}\n.sideMenu-component-v2 .sideMenu-wrapper.minified:not(:hover) .sideMenuHeader {\n display: none;\n}\n.sideMenu-component-v2 .sideMenu-wrapper.minified:not(:hover) .subNav-component-v2 button {\n padding: 0.75rem;\n margin-right: 0;\n}\n.sideMenu-component-v2 .sideMenu-wrapper.minified:not(:hover) .subNav-component-v2 button:not(.selected) {\n display: none;\n}\n.sideMenu-component-v2 .sideMenu-wrapper.minified:not(:hover) .sideMenuContainer-component-v2 .menuItemRow .sideMenuItem-component-v2.subItem,\n.sideMenu-component-v2 .sideMenu-wrapper.minified:not(:hover) .sideMenuContainer-component-v2 .menuItemRow .sideMenuItem-component-v2 .chevron {\n display: none;\n}\n.sideMenu-component-v2 .sideMenu-wrapper.minified:not(:hover) .sideMenuContainer-component-v2 .menuItemRow .sideMenuItem-component-v2 a {\n justify-content: center;\n}\n.sideMenu-component-v2 .sideMenu-wrapper.minified:not(:hover) .sideMenuContainer-component-v2 .menuItemRow .sideMenuItem-component-v2 a .MuiStack-root {\n display: none;\n}\n.sideMenu-component-v2 .sideMenu-wrapper.minified:not(:hover) .footer > .avatar-component-v2 {\n display: block;\n}\n.sideMenu-component-v2 .sideMenu-wrapper.minified:not(:hover) .footer button {\n display: none;\n}\n.sideMenu-component-v2 .sideMenu-wrapper .sideMenuHeader {\n margin-bottom: 1.5rem;\n}\n.sideMenu-component-v2 .sideMenu-wrapper .sideMenuHeader .minifyIcon {\n cursor: pointer;\n}\n.sideMenu-component-v2 .sideMenu-wrapper .search-component-v2 {\n margin-top: 1.5rem;\n position: relative;\n}\n.sideMenu-component-v2 .sideMenu-wrapper .search-component-v2 .inputContainer {\n padding: 0.75rem 1rem;\n box-shadow: unset;\n border-radius: 8px;\n border: 1px solid var(--shade200, #DBDADA);\n}\n.sideMenu-component-v2 .sideMenu-wrapper .search-component-v2:after {\n position: absolute;\n left: 0;\n bottom: -1.5rem;\n content: \"\";\n display: block;\n width: 100%;\n height: 1.5rem;\n background: linear-gradient(var(--shade100, #F3F2F2) 0%, transparent 100%);\n}\n.sideMenu-component-v2 .sideMenu-wrapper .subNav-component-v2 {\n width: 100%;\n position: relative;\n justify-content: space-between;\n}\n.sideMenu-component-v2 .sideMenu-wrapper .subNav-component-v2:after {\n position: absolute;\n left: 0;\n bottom: -1.5rem;\n content: \"\";\n display: block;\n width: 100%;\n height: 1.5rem;\n background: linear-gradient(var(--shade100, #F3F2F2) 0%, transparent 100%);\n}\n.sideMenu-component-v2 .sideMenu-wrapper .subNav-component-v2 button {\n flex: 1;\n}\n.sideMenu-component-v2 .sideMenu-wrapper .subNav-component-v2 button:not(.selected):not(:hover) {\n background: none;\n}\n.sideMenu-component-v2 .sideMenu-wrapper .subNav-component-v2 button:not(.selected):not(:hover) svg path:not(.noFill),\n.sideMenu-component-v2 .sideMenu-wrapper .subNav-component-v2 button:not(.selected):not(:hover) svg rect:not(.noFill) {\n fill: var(--secondary-brand-color, var(--teal, #0ABDAE));\n}\n.sideMenu-component-v2 .sideMenu-wrapper .subNav-component-v2 button:not(.selected):not(:hover) svg path.noFill,\n.sideMenu-component-v2 .sideMenu-wrapper .subNav-component-v2 button:not(.selected):not(:hover) svg rect.noFill {\n stroke: var(--secondary-brand-color, var(--teal, #0ABDAE));\n}\n.sideMenu-component-v2 .sideMenu-wrapper .sideMenuContainer-component-v2 {\n padding-top: 1.5rem;\n padding-bottom: 1.5rem;\n}\n.sideMenu-component-v2 .sideMenu-wrapper .footer {\n position: relative;\n justify-self: flex-end;\n}\n.sideMenu-component-v2 .sideMenu-wrapper .footer:before {\n position: absolute;\n left: 0;\n top: -1.5rem;\n content: \"\";\n display: block;\n width: 100%;\n height: 1.5rem;\n background: linear-gradient(transparent 0, var(--shade100, #F3F2F2) 100%);\n}\n.sideMenu-component-v2 .sideMenu-wrapper .footer > .avatar-component-v2 {\n display: none;\n}\n\n.sideMenuContainer-component-v2 {\n flex: 1;\n overflow-y: auto;\n}\n.sideMenuContainer-component-v2 .menuItemsContainer > .menuItemRow.divider {\n margin-top: 1rem;\n margin-bottom: 1rem;\n}\n.sideMenuContainer-component-v2 .menuItemsContainer > .menuItemRow.withSubItems.openedSubMenu .sideMenuItem-component-v2:nth-child(2) {\n margin-top: calc(0.5rem - 1px);\n}\n.sideMenuContainer-component-v2 .menuItemsContainer > .menuItemRow.withSubItems.openedSubMenu .sideMenuItem-component-v2:last-child {\n margin-bottom: calc(0.5rem - 1px);\n}\n.sideMenuContainer-component-v2 .menuItemsContainer > .menuItemRow.subSection {\n margin-top: 1rem;\n}\n.sideMenuContainer-component-v2 .menuItemsContainer > .menuItemRow:first-child {\n margin-top: 0;\n}\n.sideMenuContainer-component-v2 .menuItemsContainer .sideMenuItem-component-v2.subItem {\n margin-left: 2.75rem;\n}\n.sideMenuContainer-component-v2 .menuItemsContainer .sideMenuItem-component-v2.subItem > a,\n.sideMenuContainer-component-v2 .menuItemsContainer .sideMenuItem-component-v2.subItem > a > div > span {\n font-size: 0.875rem;\n}\n.sideMenuContainer-component-v2 .menuItemsContainer .sideMenuItem-component-v2.rotate .chevron {\n rotate: 180deg;\n}\n.sideMenuContainer-component-v2 .menuItemsContainer .sideMenuItem-component-v2.hasLocationSelected:hover a {\n cursor: default;\n background: unset !important;\n}\n\n.sideMenuItem-component-v2 {\n box-sizing: border-box;\n}\n.sideMenuItem-component-v2:hover a, .sideMenuItem-component-v2.selected a {\n background: var(--shade200, #DBDADA);\n}\n.sideMenuItem-component-v2.hasSubItemSelected > .MuiTypography-root .chevron {\n rotate: -90deg;\n}\n.sideMenuItem-component-v2 .avatar-component-v2 .MuiAvatar-root {\n border-color: var(--shade200, #DBDADA);\n background: var(--white, #FFFFFF);\n}\n.sideMenuItem-component-v2 .chevron {\n margin-left: 1rem;\n display: flex;\n justify-content: center;\n align-items: center;\n}\n.sideMenuItem-component-v2 a {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 0.75rem;\n border-radius: 8px;\n text-decoration: none !important;\n gap: 1rem;\n}\n.sideMenuItem-component-v2 a > .MuiStack-root {\n flex: 1;\n}\n.sideMenuItem-component-v2 a img {\n max-width: 80px;\n}\n.sideMenuItem-component-v2.soloItem a {\n border-radius: 16px;\n padding: 1.5rem;\n border: 1px solid var(--shade200, #DBDADA);\n}\n.sideMenuItem-component-v2.soloItem a:hover {\n border-color: var(--wild-sand, #dddddd);\n}\n.sideMenuItem-component-v2.soloItem .chevron {\n rotate: -90deg;\n}\n.sideMenuItem-component-v2.subSection {\n padding: 0.5rem 0.75rem 0.5rem 0.75rem;\n}";
18912
19331
  styleInject(css_248z$2);
18913
19332
 
@@ -19765,6 +20184,45 @@ var PagesFactory = /** @class */ (function () {
19765
20184
  return PagesFactory;
19766
20185
  }());
19767
20186
 
20187
+ var PersonalAccessTokensFactory = /** @class */ (function () {
20188
+ function PersonalAccessTokensFactory() {
20189
+ }
20190
+ PersonalAccessTokensFactory.list = function () {
20191
+ return __awaiter(this, arguments, void 0, function (_a) {
20192
+ var _b = _a === void 0 ? {} : _a, page = _b.page, perPage = _b.perPage, status = _b.status;
20193
+ return __generator(this, function (_c) {
20194
+ return [2 /*return*/, listPats({ page: page, perPage: perPage, status: status }).then(function (data) {
20195
+ data.data = data.data.map(function (pat) { return new PersonalAccessTokenModel(pat); });
20196
+ return data;
20197
+ })];
20198
+ });
20199
+ });
20200
+ };
20201
+ PersonalAccessTokensFactory.get = function (_a) {
20202
+ return __awaiter(this, arguments, void 0, function (_b) {
20203
+ var keyPrefix = _b.keyPrefix;
20204
+ return __generator(this, function (_c) {
20205
+ return [2 /*return*/, getPat({ keyPrefix: keyPrefix }).then(function (data) {
20206
+ return new PersonalAccessTokenModel(data.data);
20207
+ })];
20208
+ });
20209
+ });
20210
+ };
20211
+ PersonalAccessTokensFactory.create = function (_a) {
20212
+ return __awaiter(this, arguments, void 0, function (_b) {
20213
+ var name = _b.name, scopes = _b.scopes, expiresAt = _b.expiresAt, allowedAccountIds = _b.allowedAccountIds;
20214
+ return __generator(this, function (_c) {
20215
+ return [2 /*return*/, createPat({ name: name, scopes: scopes, expiresAt: expiresAt, allowedAccountIds: allowedAccountIds }).then(function (data) {
20216
+ var _a = data.data, plaintext = _a.plaintext, patData = __rest(_a, ["plaintext"]);
20217
+ trackEvent(exports.EEvents.PAT_CREATED, { name: name, scopes: scopes });
20218
+ return { pat: new PersonalAccessTokenModel(patData), plaintext: plaintext };
20219
+ })];
20220
+ });
20221
+ });
20222
+ };
20223
+ return PersonalAccessTokensFactory;
20224
+ }());
20225
+
19768
20226
  var PopupsFactory = /** @class */ (function () {
19769
20227
  function PopupsFactory() {
19770
20228
  }
@@ -20233,11 +20691,14 @@ exports.OverlayHandler = OverlayHandler;
20233
20691
  exports.OverlayHeading = OverlayHeading;
20234
20692
  exports.PageModel = PageModel;
20235
20693
  exports.PagesFactory = PagesFactory;
20694
+ exports.PersonalAccessTokenModel = PersonalAccessTokenModel;
20695
+ exports.PersonalAccessTokensFactory = PersonalAccessTokensFactory;
20236
20696
  exports.PhoneTextField = PhoneTextField;
20237
20697
  exports.PopupModel = PopupModel;
20238
20698
  exports.PopupsFactory = PopupsFactory;
20239
20699
  exports.Radio = Radio;
20240
20700
  exports.ResourceEdit = ResourceEdit;
20701
+ exports.ScopePicker = ScopePicker;
20241
20702
  exports.Search = Search;
20242
20703
  exports.SenderModel = SenderModel;
20243
20704
  exports.SendersFactory = SendersFactory;
@@ -20289,6 +20750,7 @@ exports.createContactsExport = createContactsExport;
20289
20750
  exports.createCustomDomain = createCustomDomain;
20290
20751
  exports.createForm = createForm;
20291
20752
  exports.createPage = createPage;
20753
+ exports.createPat = createPat;
20292
20754
  exports.createPopup = createPopup;
20293
20755
  exports.createSender = createSender;
20294
20756
  exports.createSuppressedEmailExport = createSuppressedEmailExport;
@@ -20381,6 +20843,7 @@ exports.getListLogs = getListLogs;
20381
20843
  exports.getListReport = getListReport;
20382
20844
  exports.getNestedProperty = getNestedProperty;
20383
20845
  exports.getPage = getPage;
20846
+ exports.getPat = getPat;
20384
20847
  exports.getPopup = getPopup;
20385
20848
  exports.getPropertyValue = getPropertyValue;
20386
20849
  exports.getSender = getSender;
@@ -20420,6 +20883,7 @@ exports.listList = listList;
20420
20883
  exports.listListAttributes = listListAttributes;
20421
20884
  exports.listListInterests = listListInterests;
20422
20885
  exports.listPages = listPages;
20886
+ exports.listPats = listPats;
20423
20887
  exports.listPopups = listPopups;
20424
20888
  exports.listSenders = listSenders;
20425
20889
  exports.listSuppressedEmails = listSuppressedEmails;
@@ -20457,6 +20921,7 @@ exports.requestSupportService = requestSupportService;
20457
20921
  exports.resendEmail = resendEmail;
20458
20922
  exports.resendVerificationEmail = resendVerificationEmail;
20459
20923
  exports.resumeCampaign = resumeCampaign;
20924
+ exports.revokePat = revokePat;
20460
20925
  exports.saveList = saveList;
20461
20926
  exports.scheduleCampaign = scheduleCampaign;
20462
20927
  exports.searchCustomerProfiles = searchCustomerProfiles;
@@ -20489,6 +20954,7 @@ exports.updateAnyAutomation = updateAnyAutomation;
20489
20954
  exports.updateAutomation = updateAutomation;
20490
20955
  exports.updateCampaign = updateCampaign;
20491
20956
  exports.updatePage = updatePage;
20957
+ exports.updatePat = updatePat;
20492
20958
  exports.updatePopup = updatePopup;
20493
20959
  exports.updateSystemEmails = updateSystemEmails;
20494
20960
  exports.updateTemplate = updateTemplate;
@@ -8,6 +8,7 @@ export * from "./emailAPI";
8
8
  export * from "./form";
9
9
  export * from "./list";
10
10
  export * from "./pages";
11
+ export * from "./personalAccessToken";
11
12
  export * from "./popups";
12
13
  export * from "./sender";
13
14
  export * from "./systemEmails";
@@ -0,0 +1,21 @@
1
+ import { TPatModel } from "./types";
2
+ export declare class PersonalAccessTokenModel {
3
+ readonly key_prefix: string;
4
+ name: string;
5
+ status: "active" | "revoked" | "expired";
6
+ scopes: string[];
7
+ allowed_account_ids: string[] | null;
8
+ readonly created_at: number;
9
+ readonly expires_at: number | null;
10
+ readonly revoked_at: number | null;
11
+ constructor(params: TPatModel);
12
+ toJson(): any;
13
+ set<T extends keyof this>(property: T, value: this[T]): void;
14
+ update({ name, scopes, allowedAccountIds }: {
15
+ name?: string;
16
+ scopes?: string[];
17
+ allowedAccountIds?: string[] | null;
18
+ }): Promise<PersonalAccessTokenModel>;
19
+ revoke(): Promise<PersonalAccessTokenModel>;
20
+ }
21
+ export * from "./types";
@@ -0,0 +1,10 @@
1
+ export type TPatModel = {
2
+ key_prefix: string;
3
+ name: string;
4
+ status: "active" | "revoked" | "expired";
5
+ scopes: string[];
6
+ allowed_account_ids: string[] | null;
7
+ created_at: number;
8
+ expires_at: number | null;
9
+ revoked_at: number | null;
10
+ };
@@ -12,6 +12,7 @@ export * from "./forms";
12
12
  export * from "./hidden";
13
13
  export * from "./lists";
14
14
  export * from "./pages";
15
+ export * from "./personalAccessTokens";
15
16
  export * from "./popups";
16
17
  export * from "./senders";
17
18
  export * from "./suppressedEmails";