@forge/react 11.9.2-next.0 → 11.10.0-experimental-5a86f99
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/CHANGELOG.md +59 -0
- package/out/components/global/index.d.ts +31 -0
- package/out/components/global/index.d.ts.map +1 -0
- package/out/components/global/index.js +26 -0
- package/out/components/index.d.ts +1 -0
- package/out/components/index.d.ts.map +1 -1
- package/out/components/index.js +3 -1
- package/out/components/ui-kit-components.d.ts +7 -1
- package/out/components/ui-kit-components.d.ts.map +1 -1
- package/out/components/ui-kit-components.js +7 -1
- package/out/hooks/__test__/usePermissions.test.js +18 -4
- package/out/hooks/usePermissions.d.ts +4 -27
- package/out/hooks/usePermissions.d.ts.map +1 -1
- package/out/hooks/usePermissions.js +29 -120
- package/package.json +7 -3
- package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,64 @@
|
|
|
1
1
|
# @forge/react
|
|
2
2
|
|
|
3
|
+
## 11.10.0-experimental-5a86f99
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 5a86f99: Bump forge-react-types to include UI Kit modal component prop changes
|
|
8
|
+
|
|
9
|
+
## 11.10.0
|
|
10
|
+
|
|
11
|
+
### Minor Changes
|
|
12
|
+
|
|
13
|
+
- 62fcf09: Added props to Global component
|
|
14
|
+
- 37d13e9: Added Global component
|
|
15
|
+
- f77b008: Added bumps to include new Tile component
|
|
16
|
+
- f058dd8: Expose Permissions API in @forge/bridge for Custom UI apps
|
|
17
|
+
|
|
18
|
+
### Patch Changes
|
|
19
|
+
|
|
20
|
+
- dbfa292: Bumped @atlaskit/forge-react-types
|
|
21
|
+
- Updated dependencies [5a8ee7a]
|
|
22
|
+
- Updated dependencies [f058dd8]
|
|
23
|
+
- Updated dependencies [28b4837]
|
|
24
|
+
- Updated dependencies [140f500]
|
|
25
|
+
- @forge/bridge@5.11.0
|
|
26
|
+
|
|
27
|
+
## 11.10.0-next.5
|
|
28
|
+
|
|
29
|
+
### Minor Changes
|
|
30
|
+
|
|
31
|
+
- 62fcf09: Added props to Global component
|
|
32
|
+
|
|
33
|
+
## 11.10.0-next.4
|
|
34
|
+
|
|
35
|
+
### Minor Changes
|
|
36
|
+
|
|
37
|
+
- 37d13e9: Added Global component
|
|
38
|
+
|
|
39
|
+
## 11.10.0-next.3
|
|
40
|
+
|
|
41
|
+
### Minor Changes
|
|
42
|
+
|
|
43
|
+
- f77b008: Added bumps to include new Tile component
|
|
44
|
+
|
|
45
|
+
## 11.10.0-next.2
|
|
46
|
+
|
|
47
|
+
### Patch Changes
|
|
48
|
+
|
|
49
|
+
- dbfa292: Bumped @atlaskit/forge-react-types
|
|
50
|
+
|
|
51
|
+
## 11.10.0-next.1
|
|
52
|
+
|
|
53
|
+
### Minor Changes
|
|
54
|
+
|
|
55
|
+
- f058dd8: Expose Permissions API in @forge/bridge for Custom UI apps
|
|
56
|
+
|
|
57
|
+
### Patch Changes
|
|
58
|
+
|
|
59
|
+
- Updated dependencies [f058dd8]
|
|
60
|
+
- @forge/bridge@5.11.0-next.2
|
|
61
|
+
|
|
3
62
|
## 11.9.2-next.0
|
|
4
63
|
|
|
5
64
|
### Patch Changes
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { ReactElement, ReactNode } from 'react';
|
|
2
|
+
declare type GlobalElements = ReactElement<GlobalExpandableMenuItemProps> | ReactElement<GlobalLinkMenuItemProps> | ReactElement<GlobalSidebarProps> | ReactElement<GlobalMainProps> | ReactElement<GlobalProps>;
|
|
3
|
+
declare type NotGlobalComponents<T> = T extends GlobalElements ? never : T;
|
|
4
|
+
interface GlobalLinkMenuItemProps {
|
|
5
|
+
href: string;
|
|
6
|
+
label: string;
|
|
7
|
+
children?: never;
|
|
8
|
+
}
|
|
9
|
+
interface GlobalExpandableMenuItemProps {
|
|
10
|
+
children: ReactElement<GlobalLinkMenuItemProps> | ReactElement<GlobalLinkMenuItemProps>[];
|
|
11
|
+
label: string;
|
|
12
|
+
}
|
|
13
|
+
interface GlobalSidebarProps {
|
|
14
|
+
forYouUrl?: string;
|
|
15
|
+
children: ReactElement<GlobalLinkMenuItemProps> | ReactElement<GlobalExpandableMenuItemProps> | Array<ReactElement<GlobalLinkMenuItemProps> | ReactElement<GlobalExpandableMenuItemProps>>;
|
|
16
|
+
}
|
|
17
|
+
interface GlobalMainProps {
|
|
18
|
+
children: NotGlobalComponents<ReactNode>;
|
|
19
|
+
}
|
|
20
|
+
interface GlobalProps {
|
|
21
|
+
children: [ReactElement<GlobalSidebarProps, typeof Global.Sidebar>, ReactElement<GlobalMainProps, typeof Global.Main>] | [ReactElement<GlobalMainProps, typeof Global.Main>, ReactElement<GlobalSidebarProps, typeof Global.Sidebar>];
|
|
22
|
+
}
|
|
23
|
+
export declare const Global: {
|
|
24
|
+
(props: GlobalProps): import("react/jsx-runtime").JSX.Element;
|
|
25
|
+
Main(props: GlobalMainProps): import("react/jsx-runtime").JSX.Element;
|
|
26
|
+
Sidebar({ children, forYouUrl }: GlobalSidebarProps): import("react/jsx-runtime").JSX.Element;
|
|
27
|
+
ExpandMenuItem({ label, children }: GlobalExpandableMenuItemProps): import("react/jsx-runtime").JSX.Element;
|
|
28
|
+
LinkMenuItem(props: GlobalLinkMenuItemProps): import("react/jsx-runtime").JSX.Element;
|
|
29
|
+
};
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/global/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGrD,aAAK,cAAc,GACf,YAAY,CAAC,6BAA6B,CAAC,GAC3C,YAAY,CAAC,uBAAuB,CAAC,GACrC,YAAY,CAAC,kBAAkB,CAAC,GAChC,YAAY,CAAC,eAAe,CAAC,GAC7B,YAAY,CAAC,WAAW,CAAC,CAAC;AAE9B,aAAK,mBAAmB,CAAC,CAAC,IAAI,CAAC,SAAS,cAAc,GAAG,KAAK,GAAG,CAAC,CAAC;AAEnE,UAAU,uBAAuB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,KAAK,CAAC;CAElB;AAED,UAAU,6BAA6B;IACrC,QAAQ,EAAE,YAAY,CAAC,uBAAuB,CAAC,GAAG,YAAY,CAAC,uBAAuB,CAAC,EAAE,CAAC;IAC1F,KAAK,EAAE,MAAM,CAAC;CAEf;AAED,UAAU,kBAAkB;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EACJ,YAAY,CAAC,uBAAuB,CAAC,GACrC,YAAY,CAAC,6BAA6B,CAAC,GAC3C,KAAK,CAAC,YAAY,CAAC,uBAAuB,CAAC,GAAG,YAAY,CAAC,6BAA6B,CAAC,CAAC,CAAC;CAEhG;AAED,UAAU,eAAe;IACvB,QAAQ,EAAE,mBAAmB,CAAC,SAAS,CAAC,CAAC;CAE1C;AAED,UAAU,WAAW;IACnB,QAAQ,EACJ,CAAC,YAAY,CAAC,kBAAkB,EAAE,OAAO,MAAM,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC,eAAe,EAAE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,GAC5G,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,YAAY,CAAC,kBAAkB,EAAE,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;CAElH;AAiBD,eAAO,MAAM,MAAM;YAAW,WAAW;gBAInB,eAAe;qCAIM,kBAAkB;wCAIf,6BAA6B;wBAI7C,uBAAuB;CAdpD,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Global = void 0;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const GlobalPrimitive = 'Global';
|
|
6
|
+
const GlobalMainPrimitive = 'Global.Main';
|
|
7
|
+
const GlobalSidebarPrimitive = 'Global.Sidebar';
|
|
8
|
+
const GlobalExpandMenuItemPrimitive = 'Global.ExpandMenuItem';
|
|
9
|
+
const GlobalLinkMenuItemPrimitive = 'Global.LinkMenuItem';
|
|
10
|
+
// Top level component
|
|
11
|
+
const Global = (props) => {
|
|
12
|
+
return (0, jsx_runtime_1.jsx)(GlobalPrimitive, { children: props.children });
|
|
13
|
+
};
|
|
14
|
+
exports.Global = Global;
|
|
15
|
+
exports.Global.Main = (props) => {
|
|
16
|
+
return (0, jsx_runtime_1.jsx)(GlobalMainPrimitive, { children: props.children });
|
|
17
|
+
};
|
|
18
|
+
exports.Global.Sidebar = ({ children, forYouUrl }) => {
|
|
19
|
+
return (0, jsx_runtime_1.jsx)(GlobalSidebarPrimitive, { forYouUrl: forYouUrl, children: children });
|
|
20
|
+
};
|
|
21
|
+
exports.Global.ExpandMenuItem = ({ label, children }) => {
|
|
22
|
+
return (0, jsx_runtime_1.jsx)(GlobalExpandMenuItemPrimitive, { label: label, children: children });
|
|
23
|
+
};
|
|
24
|
+
exports.Global.LinkMenuItem = (props) => {
|
|
25
|
+
return (0, jsx_runtime_1.jsx)(GlobalLinkMenuItemPrimitive, { ...props });
|
|
26
|
+
};
|
|
@@ -6,6 +6,7 @@ export { Popup } from './popup';
|
|
|
6
6
|
export { Comment } from './comment';
|
|
7
7
|
export { AdfRenderer } from './adf-renderer';
|
|
8
8
|
export { UserPickerValue } from '../types/index';
|
|
9
|
+
export { Global } from './global';
|
|
9
10
|
declare type UserProps = {
|
|
10
11
|
accountId: string;
|
|
11
12
|
hideDisplayName?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,WAAW,EACX,eAAe,IAAI,SAAS,EAC5B,qBAAqB,IAAI,eAAe,EACxC,cAAc,EACd,UAAU,EACX,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,kBAAkB,IAAI,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAC5F,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,WAAW,EACX,eAAe,IAAI,SAAS,EAC5B,qBAAqB,IAAI,eAAe,EACxC,cAAc,EACd,UAAU,EACX,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,kBAAkB,IAAI,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAC5F,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,aAAK,SAAS,GAAG;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AACF;;;;GAIG;AACH,eAAO,MAAM,IAAI,UAAgC,SAAS,KAAK,YAAY,CAAC;AAE5E,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC1D,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACzB;AAED;;;;GAIG;AACH,eAAO,MAAM,KAAK,UAAiC,UAAU,KAAK,YAAY,CAAC;AAE/E,eAAO,MAAM,IAAI,UAAgC,SAAS,KAAK,YAAY,CAAC;AAC5E,eAAO,MAAM,UAAU,UAAsC,eAAe,KAAK,YAAY,CAAC;AAC9F,eAAO,MAAM,SAAS,UAAqC,cAAc,KAAK,YAAY,CAAC;AAE3F,eAAO,MAAM,EAAE,UAA8B,WAAW,KAAK,YAAY,CAAC;AAC1E,eAAO,MAAM,MAAM,UAAkC,WAAW,KAAK,YAAY,CAAC;AAClF,eAAO,MAAM,MAAM,UAAkC,WAAW,KAAK,YAAY,CAAC;AAElF;;;;GAIG;AACH,eAAO,MAAM,KAAK,UAAiC,UAAU,KAAK,YAAY,CAAC;AAE/E;;GAEG;AACH,cAAc,qBAAqB,CAAC;AAIpC,UAAU,uBAAuB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC3C,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AACD,aAAK,kBAAkB,GAAG,uBAAuB,GAAG,uBAAuB,CAAC;AAC5E,eAAO,MAAM,aAAa,UAAyC,kBAAkB,KAAK,YAAY,CAAC"}
|
package/out/components/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.CheckboxGroup = exports.Frame = exports.Strong = exports.Strike = exports.Em = exports.UserGroup = exports.UserPicker = exports.Link = exports.Image = exports.User = exports.AdfRenderer = exports.Comment = exports.Popup = exports.InlineEdit = exports.DynamicTable = void 0;
|
|
3
|
+
exports.CheckboxGroup = exports.Frame = exports.Strong = exports.Strike = exports.Em = exports.UserGroup = exports.UserPicker = exports.Link = exports.Image = exports.User = exports.Global = exports.AdfRenderer = exports.Comment = exports.Popup = exports.InlineEdit = exports.DynamicTable = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
var dynamic_table_1 = require("./dynamic-table");
|
|
6
6
|
Object.defineProperty(exports, "DynamicTable", { enumerable: true, get: function () { return dynamic_table_1.DynamicTable; } });
|
|
@@ -12,6 +12,8 @@ var comment_1 = require("./comment");
|
|
|
12
12
|
Object.defineProperty(exports, "Comment", { enumerable: true, get: function () { return comment_1.Comment; } });
|
|
13
13
|
var adf_renderer_1 = require("./adf-renderer");
|
|
14
14
|
Object.defineProperty(exports, "AdfRenderer", { enumerable: true, get: function () { return adf_renderer_1.AdfRenderer; } });
|
|
15
|
+
var global_1 = require("./global");
|
|
16
|
+
Object.defineProperty(exports, "Global", { enumerable: true, get: function () { return global_1.Global; } });
|
|
15
17
|
/**
|
|
16
18
|
* A component that represents a user, displaying details such as name and profile picture.
|
|
17
19
|
*
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
2
|
import { ForgeElement } from '../types/index';
|
|
3
|
-
import type { TBadge, TBarChart, TBox, TButton, TButtonGroup, TCalendar, TCheckbox, TCode, TCodeBlock, TDatePicker, TDonutChart, TErrorMessage, TFileCard, TFilePicker, THeading, THelperMessage, THorizontalBarChart, THorizontalStackBarChart, TInline, TLabel, TList, TListItem, TLozenge, TLineChart, TLinkButton, TModal, TModalHeader, TModalBody, TModalFooter, TModalTitle, TModalTransition, TPieChart, TProgressBar, TProgressTracker, TRadio, TRadioGroup, TRange, TSectionMessage, TSectionMessageAction, TSpinner, TStack, TStackBarChart, TTabs, TTab, TTabList, TTabPanel, TTag, TTagGroup, TTimePicker, TForm, TFormHeader, TFormFooter, TFormSection, TTooltip, TTextArea, TTextfield, TText, TToggle, TValidMessage, TLoadingButton, TSelect, TIcon, TEmptyState, TPressable, TCommentEditor, TChromelessEditor } from '@atlaskit/forge-react-types';
|
|
3
|
+
import type { TBadge, TBarChart, TBox, TButton, TButtonGroup, TCalendar, TCheckbox, TCode, TCodeBlock, TDatePicker, TDonutChart, TErrorMessage, TFileCard, TFilePicker, THeading, THelperMessage, THorizontalBarChart, THorizontalStackBarChart, TInline, TLabel, TList, TListItem, TLozenge, TLineChart, TLinkButton, TModal, TModalHeader, TModalBody, TModalFooter, TModalTitle, TModalTransition, TPieChart, TProgressBar, TProgressTracker, TRadio, TRadioGroup, TRange, TSectionMessage, TSectionMessageAction, TSpinner, TStack, TStackBarChart, TTabs, TTab, TTabList, TTabPanel, TTag, TTagGroup, TTimePicker, TForm, TFormHeader, TFormFooter, TFormSection, TTooltip, TTextArea, TTextfield, TText, TToggle, TValidMessage, TLoadingButton, TSelect, TIcon, TEmptyState, TPressable, TCommentEditor, TChromelessEditor, TTile } from '@atlaskit/forge-react-types';
|
|
4
4
|
/**
|
|
5
5
|
* A badge is a visual indicator for numeric values such as tallies and scores.
|
|
6
6
|
*
|
|
@@ -398,4 +398,10 @@ export declare const CommentEditor: TCommentEditor<ForgeElement<Record<string, a
|
|
|
398
398
|
* @see [ChromelessEditor](https://developer.atlassian.com/platform/forge/ui-kit/components/chromeless-editor/) in UI Kit documentation for more information
|
|
399
399
|
*/
|
|
400
400
|
export declare const ChromelessEditor: TChromelessEditor<ForgeElement<Record<string, any>>>;
|
|
401
|
+
/**
|
|
402
|
+
* A tile is a rounded square that takes an asset and represents a noun.
|
|
403
|
+
*
|
|
404
|
+
* @see [Tile](https://developer.atlassian.com/platform/forge/ui-kit/components/tile/) in UI Kit documentation for more information
|
|
405
|
+
*/
|
|
406
|
+
export declare const Tile: TTile<ForgeElement<Record<string, any>>>;
|
|
401
407
|
//# sourceMappingURL=ui-kit-components.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui-kit-components.d.ts","sourceRoot":"","sources":["../../src/components/ui-kit-components.ts"],"names":[],"mappings":";AAQA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EACV,MAAM,EACN,SAAS,EACT,IAAI,EACJ,OAAO,EACP,YAAY,EACZ,SAAS,EACT,SAAS,EACT,KAAK,EACL,UAAU,EACV,WAAW,EACX,WAAW,EACX,aAAa,EACb,SAAS,EACT,WAAW,EACX,QAAQ,EACR,cAAc,EACd,mBAAmB,EACnB,wBAAwB,EACxB,OAAO,EACP,MAAM,EACN,KAAK,EACL,SAAS,EACT,QAAQ,EACR,UAAU,EACV,WAAW,EACX,MAAM,EACN,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,SAAS,EACT,YAAY,EACZ,gBAAgB,EAChB,MAAM,EACN,WAAW,EACX,MAAM,EACN,eAAe,EACf,qBAAqB,EACrB,QAAQ,EACR,MAAM,EACN,cAAc,EACd,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,SAAS,EACT,IAAI,EACJ,SAAS,EACT,WAAW,EACX,KAAK,EACL,WAAW,EACX,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,SAAS,EACT,UAAU,EACV,KAAK,EACL,OAAO,EACP,aAAa,EACb,cAAc,EACd,OAAO,EACP,KAAK,EACL,WAAW,EACX,UAAU,EACV,cAAc,EACd,iBAAiB,
|
|
1
|
+
{"version":3,"file":"ui-kit-components.d.ts","sourceRoot":"","sources":["../../src/components/ui-kit-components.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
// For more information, please see: https://hello.atlassian.net/wiki/x/SI2n0w?atlOrigin=eyJpIjoiYjJhOTliZmZmYWE1NDE5ZjgzOWU1Y2ViZWI3Yjk3NTMiLCJwIjoiYyJ9
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
10
|
exports.StackBarChart = exports.Stack = exports.Spinner = exports.SectionMessageAction = exports.SectionMessage = exports.Select = exports.Range = exports.RadioGroup = exports.Radio = exports.ProgressTracker = exports.ProgressBar = exports.PieChart = exports.ModalTransition = exports.ModalTitle = exports.ModalHeader = exports.ModalFooter = exports.ModalBody = exports.Modal = exports.Lozenge = exports.LoadingButton = exports.ListItem = exports.List = exports.LinkButton = exports.LineChart = exports.Label = exports.Inline = exports.Icon = exports.HorizontalStackBarChart = exports.HorizontalBarChart = exports.HelperMessage = exports.Heading = exports.FormSection = exports.FormHeader = exports.FormFooter = exports.Form = exports.FilePicker = exports.FileCard = exports.ErrorMessage = exports.EmptyState = exports.DonutChart = exports.DatePicker = exports.CodeBlock = exports.Code = exports.Checkbox = exports.Calendar = exports.ButtonGroup = exports.Button = exports.Box = exports.BarChart = exports.Badge = void 0;
|
|
11
|
-
exports.ChromelessEditor = exports.CommentEditor = exports.Pressable = exports.RequiredAsterisk = exports.ValidMessage = exports.Text = exports.Tooltip = exports.Toggle = exports.TimePicker = exports.Textfield = exports.TextArea = exports.TagGroup = exports.Tag = exports.Tabs = exports.TabPanel = exports.TabList = exports.Tab = void 0;
|
|
11
|
+
exports.Tile = exports.ChromelessEditor = exports.CommentEditor = exports.Pressable = exports.RequiredAsterisk = exports.ValidMessage = exports.Text = exports.Tooltip = exports.Toggle = exports.TimePicker = exports.Textfield = exports.TextArea = exports.TagGroup = exports.Tag = exports.Tabs = exports.TabPanel = exports.TabList = exports.Tab = void 0;
|
|
12
12
|
/**
|
|
13
13
|
* A badge is a visual indicator for numeric values such as tallies and scores.
|
|
14
14
|
*
|
|
@@ -407,3 +407,9 @@ exports.CommentEditor = 'CommentEditor';
|
|
|
407
407
|
* @see [ChromelessEditor](https://developer.atlassian.com/platform/forge/ui-kit/components/chromeless-editor/) in UI Kit documentation for more information
|
|
408
408
|
*/
|
|
409
409
|
exports.ChromelessEditor = 'ChromelessEditor';
|
|
410
|
+
/**
|
|
411
|
+
* A tile is a rounded square that takes an asset and represents a noun.
|
|
412
|
+
*
|
|
413
|
+
* @see [Tile](https://developer.atlassian.com/platform/forge/ui-kit/components/tile/) in UI Kit documentation for more information
|
|
414
|
+
*/
|
|
415
|
+
exports.Tile = 'Tile';
|
|
@@ -4,11 +4,25 @@ const react_hooks_1 = require("@testing-library/react-hooks");
|
|
|
4
4
|
const usePermissions_1 = require("../usePermissions");
|
|
5
5
|
const testUtils_1 = require("../../__test__/testUtils");
|
|
6
6
|
// Mock @forge/bridge
|
|
7
|
-
jest.mock('@forge/bridge', () =>
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
jest.mock('@forge/bridge', () => {
|
|
8
|
+
// Set up window before requiring actual bridge to avoid initialization issues
|
|
9
|
+
if (typeof window === 'undefined') {
|
|
10
|
+
// @ts-ignore
|
|
11
|
+
global.window = global;
|
|
12
|
+
// @ts-ignore
|
|
13
|
+
global.window.__bridge = {
|
|
14
|
+
callBridge: jest.fn()
|
|
15
|
+
};
|
|
10
16
|
}
|
|
11
|
-
|
|
17
|
+
const actualBridge = jest.requireActual('@forge/bridge');
|
|
18
|
+
return {
|
|
19
|
+
...actualBridge,
|
|
20
|
+
view: {
|
|
21
|
+
...actualBridge.view,
|
|
22
|
+
getContext: jest.fn()
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
});
|
|
12
26
|
const mockGetContext = jest.fn();
|
|
13
27
|
describe('usePermissions', () => {
|
|
14
28
|
beforeEach(() => {
|
|
@@ -1,13 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
*/
|
|
4
|
-
declare const RESOURCE_TYPES: readonly ["fonts", "styles", "frames", "images", "media", "scripts"];
|
|
5
|
-
export declare type ResourceType = (typeof RESOURCE_TYPES)[number];
|
|
6
|
-
/**
|
|
7
|
-
* Fetch types for external requests
|
|
8
|
-
*/
|
|
9
|
-
declare const FETCH_TYPES: readonly ["backend", "client"];
|
|
10
|
-
export declare type FetchType = (typeof FETCH_TYPES)[number];
|
|
1
|
+
import { type PermissionRequirements, type MissingPermissions, type PermissionCheckResult, type ResourceType, type FetchType } from '@forge/bridge';
|
|
2
|
+
export type { ResourceType, FetchType };
|
|
11
3
|
export interface Permissions {
|
|
12
4
|
scopes?: string[];
|
|
13
5
|
external?: {
|
|
@@ -24,21 +16,7 @@ export interface Permissions {
|
|
|
24
16
|
};
|
|
25
17
|
content?: Record<string, unknown>;
|
|
26
18
|
}
|
|
27
|
-
|
|
28
|
-
* Required permissions for a component
|
|
29
|
-
*/
|
|
30
|
-
export declare type PermissionRequirements = Permissions;
|
|
31
|
-
/**
|
|
32
|
-
* Missing permissions information
|
|
33
|
-
*/
|
|
34
|
-
export declare type MissingPermissions = Permissions;
|
|
35
|
-
/**
|
|
36
|
-
* Permission check result
|
|
37
|
-
*/
|
|
38
|
-
export interface PermissionCheckResult {
|
|
39
|
-
granted: boolean;
|
|
40
|
-
missing: MissingPermissions | null;
|
|
41
|
-
}
|
|
19
|
+
export type { PermissionRequirements, MissingPermissions, PermissionCheckResult };
|
|
42
20
|
/**
|
|
43
21
|
* Hook for checking permissions in Forge apps
|
|
44
22
|
*
|
|
@@ -78,8 +56,7 @@ export interface PermissionCheckResult {
|
|
|
78
56
|
export declare const usePermissions: (requiredPermissions: PermissionRequirements) => {
|
|
79
57
|
hasPermission: boolean;
|
|
80
58
|
isLoading: boolean;
|
|
81
|
-
missingPermissions:
|
|
59
|
+
missingPermissions: PermissionRequirements | null;
|
|
82
60
|
error: Error | null;
|
|
83
61
|
};
|
|
84
|
-
export {};
|
|
85
62
|
//# sourceMappingURL=usePermissions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePermissions.d.ts","sourceRoot":"","sources":["../../src/hooks/usePermissions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"usePermissions.d.ts","sourceRoot":"","sources":["../../src/hooks/usePermissions.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,YAAY,EACjB,KAAK,SAAS,EACf,MAAM,eAAe,CAAC;AAGvB,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;AAExC,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE;QACT,KAAK,CAAC,EAAE;YACN,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;YACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;SACnB,CAAC;QACF,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;IACF,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAGD,YAAY,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,CAAC;AAElF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,eAAO,MAAM,cAAc,wBAAyB,sBAAsB;;;;;CAoEzE,CAAC"}
|
|
@@ -3,32 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.usePermissions = void 0;
|
|
4
4
|
const react_1 = require("react");
|
|
5
5
|
const bridge_1 = require("@forge/bridge");
|
|
6
|
-
const egress_1 = require("@forge/egress");
|
|
7
|
-
/**
|
|
8
|
-
* https://ecosystem-platform.atlassian.net/browse/DEPLOY-1411
|
|
9
|
-
* Uses @forge/egress for URL matching (same logic as @forge/api)
|
|
10
|
-
*/
|
|
11
|
-
/**
|
|
12
|
-
* Helper function to extract URL string from external URL permissions.
|
|
13
|
-
* Matches the implementation in @forge/api for consistency.
|
|
14
|
-
*/
|
|
15
|
-
function extractUrlString(url) {
|
|
16
|
-
if (typeof url === 'string') {
|
|
17
|
-
return url;
|
|
18
|
-
}
|
|
19
|
-
if ('address' in url && url.address) {
|
|
20
|
-
return url.address;
|
|
21
|
-
}
|
|
22
|
-
return url.remote || '';
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Resource types that can be loaded externally
|
|
26
|
-
*/
|
|
27
|
-
const RESOURCE_TYPES = ['fonts', 'styles', 'frames', 'images', 'media', 'scripts'];
|
|
28
|
-
/**
|
|
29
|
-
* Fetch types for external requests
|
|
30
|
-
*/
|
|
31
|
-
const FETCH_TYPES = ['backend', 'client'];
|
|
32
6
|
/**
|
|
33
7
|
* Hook for checking permissions in Forge apps
|
|
34
8
|
*
|
|
@@ -69,6 +43,10 @@ const usePermissions = (requiredPermissions) => {
|
|
|
69
43
|
const [context, setContext] = (0, react_1.useState)();
|
|
70
44
|
const [isLoading, setIsLoading] = (0, react_1.useState)(true);
|
|
71
45
|
const [error, setError] = (0, react_1.useState)(null);
|
|
46
|
+
const [permissionResult, setPermissionResult] = (0, react_1.useState)({
|
|
47
|
+
granted: false,
|
|
48
|
+
missing: null
|
|
49
|
+
});
|
|
72
50
|
// Load context on mount
|
|
73
51
|
(0, react_1.useEffect)(() => {
|
|
74
52
|
const loadContext = async () => {
|
|
@@ -87,106 +65,37 @@ const usePermissions = (requiredPermissions) => {
|
|
|
87
65
|
};
|
|
88
66
|
void loadContext();
|
|
89
67
|
}, []);
|
|
90
|
-
//
|
|
91
|
-
|
|
92
|
-
if
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
const scopeArray = Array.isArray(scopes) ? scopes : Object.keys(scopes || {});
|
|
96
|
-
return {
|
|
97
|
-
hasScope: (scope) => scopeArray.includes(scope),
|
|
98
|
-
canFetchFrom: (type, url) => {
|
|
99
|
-
const fetchUrls = external.fetch?.[type];
|
|
100
|
-
if (!fetchUrls?.length)
|
|
101
|
-
return false;
|
|
102
|
-
// Extract URLs and create egress filter
|
|
103
|
-
const allowList = fetchUrls.map(extractUrlString).filter((u) => u.length > 0);
|
|
104
|
-
if (allowList.length === 0)
|
|
105
|
-
return false;
|
|
106
|
-
const egressFilter = new egress_1.EgressFilteringService(allowList);
|
|
107
|
-
// Backend: hostname-only matching, Client: CSP validation (includes paths)
|
|
108
|
-
return type === 'client' ? egressFilter.isValidUrlCSP(url) : egressFilter.isValidUrl(url);
|
|
109
|
-
},
|
|
110
|
-
canLoadResource: (type, url) => {
|
|
111
|
-
const resourceUrls = external[type];
|
|
112
|
-
if (!resourceUrls?.length)
|
|
113
|
-
return false;
|
|
114
|
-
// Extract URLs and create egress filter
|
|
115
|
-
const allowList = resourceUrls.map(extractUrlString).filter((u) => u.length > 0);
|
|
116
|
-
if (allowList.length === 0)
|
|
117
|
-
return false;
|
|
118
|
-
const egressFilter = new egress_1.EgressFilteringService(allowList);
|
|
119
|
-
// All resources use CSP validation (checks protocol + hostname + paths)
|
|
120
|
-
return egressFilter.isValidUrlCSP(url);
|
|
121
|
-
},
|
|
122
|
-
getScopes: () => scopeArray,
|
|
123
|
-
getExternalPermissions: () => external,
|
|
124
|
-
hasAnyPermissions: () => scopeArray.length > 0 || Object.keys(external).length > 0
|
|
125
|
-
};
|
|
126
|
-
}, [context?.permissions]);
|
|
127
|
-
// Check permissions
|
|
128
|
-
const permissionResult = (0, react_1.useMemo)(() => {
|
|
129
|
-
if (!requiredPermissions) {
|
|
130
|
-
return { granted: false, missing: null };
|
|
131
|
-
}
|
|
132
|
-
if (!permissionUtils) {
|
|
133
|
-
// If still loading or there's an error, return null for missing permissions
|
|
134
|
-
if (isLoading || error) {
|
|
135
|
-
return { granted: false, missing: null };
|
|
136
|
-
}
|
|
137
|
-
throw new Error('This feature is not available yet');
|
|
68
|
+
// Check permissions using shared utility
|
|
69
|
+
(0, react_1.useEffect)(() => {
|
|
70
|
+
// Skip if still loading context
|
|
71
|
+
if (isLoading) {
|
|
72
|
+
return;
|
|
138
73
|
}
|
|
139
|
-
const
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
const missingScopes = requiredPermissions.scopes.filter((scope) => !permissionUtils.hasScope(scope));
|
|
144
|
-
if (missingScopes.length > 0) {
|
|
145
|
-
missing.scopes = missingScopes;
|
|
146
|
-
hasAllRequiredPermissions = false;
|
|
74
|
+
const checkPerms = async () => {
|
|
75
|
+
if (!requiredPermissions) {
|
|
76
|
+
setPermissionResult({ granted: false, missing: null });
|
|
77
|
+
return;
|
|
147
78
|
}
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
if (requiredPermissions.external.fetch) {
|
|
154
|
-
const missingFetch = {};
|
|
155
|
-
FETCH_TYPES.forEach((type) => {
|
|
156
|
-
const requiredUrls = requiredPermissions.external?.fetch?.[type];
|
|
157
|
-
if (requiredUrls?.length) {
|
|
158
|
-
const missingUrls = requiredUrls.filter((url) => !permissionUtils.canFetchFrom(type, url));
|
|
159
|
-
if (missingUrls.length > 0) {
|
|
160
|
-
missingFetch[type] = missingUrls;
|
|
161
|
-
hasAllRequiredPermissions = false;
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
});
|
|
165
|
-
if (Object.keys(missingFetch).length > 0) {
|
|
166
|
-
missingExternal.fetch = missingFetch;
|
|
79
|
+
if (!context?.permissions) {
|
|
80
|
+
// If context loaded but has no permissions, set error
|
|
81
|
+
if (context !== undefined) {
|
|
82
|
+
setError(new Error('This feature is not available yet'));
|
|
83
|
+
setPermissionResult({ granted: false, missing: null });
|
|
167
84
|
}
|
|
85
|
+
return;
|
|
168
86
|
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
const
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
});
|
|
180
|
-
if (Object.keys(missingExternal).length > 0) {
|
|
181
|
-
missing.external = missingExternal;
|
|
87
|
+
try {
|
|
88
|
+
setError(null); // Clear any previous errors
|
|
89
|
+
const result = await (0, bridge_1.checkPermissions)(requiredPermissions, context.permissions);
|
|
90
|
+
setPermissionResult(result);
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
setError(err instanceof Error ? err : new Error('Failed to check permissions'));
|
|
94
|
+
setPermissionResult({ granted: false, missing: null });
|
|
182
95
|
}
|
|
183
|
-
}
|
|
184
|
-
// Note: Content permissions are not supported in the current RuntimePermissions type
|
|
185
|
-
return {
|
|
186
|
-
granted: hasAllRequiredPermissions,
|
|
187
|
-
missing: hasAllRequiredPermissions ? null : missing
|
|
188
96
|
};
|
|
189
|
-
|
|
97
|
+
void checkPerms();
|
|
98
|
+
}, [context, requiredPermissions, isLoading]);
|
|
190
99
|
return {
|
|
191
100
|
hasPermission: permissionResult.granted,
|
|
192
101
|
isLoading,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@forge/react",
|
|
3
|
-
"version": "11.
|
|
3
|
+
"version": "11.10.0-experimental-5a86f99",
|
|
4
4
|
"description": "Forge React reconciler",
|
|
5
5
|
"author": "Atlassian",
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE.txt",
|
|
@@ -22,13 +22,17 @@
|
|
|
22
22
|
"./jira": {
|
|
23
23
|
"types": "./out/components/jira/index.d.ts",
|
|
24
24
|
"default": "./out/components/jira/index.js"
|
|
25
|
+
},
|
|
26
|
+
"./global": {
|
|
27
|
+
"types": "./out/components/global/index.d.ts",
|
|
28
|
+
"default": "./out/components/global/index.js"
|
|
25
29
|
}
|
|
26
30
|
},
|
|
27
31
|
"dependencies": {
|
|
28
32
|
"@atlaskit/adf-schema": "^48.0.0",
|
|
29
33
|
"@atlaskit/adf-utils": "^19.19.0",
|
|
30
|
-
"@atlaskit/forge-react-types": "^0.
|
|
31
|
-
"@forge/bridge": "^5.
|
|
34
|
+
"@atlaskit/forge-react-types": "^0.56.0",
|
|
35
|
+
"@forge/bridge": "^5.11.0",
|
|
32
36
|
"@forge/egress": "^2.3.1",
|
|
33
37
|
"@forge/i18n": "0.0.7",
|
|
34
38
|
"@types/react": "^18.2.64",
|