@atlaskit/editor-plugin-extension 1.11.0 → 1.11.1
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
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# @atlaskit/editor-plugin-extension
|
|
2
2
|
|
|
3
|
+
## 1.11.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#123920](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/123920)
|
|
8
|
+
[`dc459fb7e6e6b`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/dc459fb7e6e6b) -
|
|
9
|
+
Add event listener for updates to Forge app config schema and force re-render of the config panel.
|
|
10
|
+
Async functions in Forge apps lead to a race condition that causes the panel to render stale
|
|
11
|
+
schemas unless the panel is re-rendered.
|
|
12
|
+
|
|
3
13
|
## 1.11.0
|
|
4
14
|
|
|
5
15
|
### Minor Changes
|
|
@@ -8,6 +8,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
8
8
|
exports.default = FieldsLoader;
|
|
9
9
|
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
10
10
|
var _react = _interopRequireWildcard(require("react"));
|
|
11
|
+
var _bindEventListener = require("bind-event-listener");
|
|
11
12
|
var _ConfigPanel = _interopRequireDefault(require("./ConfigPanel"));
|
|
12
13
|
var _useStateFromPromise3 = require("./use-state-from-promise");
|
|
13
14
|
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
|
|
@@ -30,6 +31,33 @@ var FieldDefinitionsPromiseResolver = function FieldDefinitionsPromiseResolver(p
|
|
|
30
31
|
fields = _useState2[0],
|
|
31
32
|
setFields = _useState2[1];
|
|
32
33
|
|
|
34
|
+
// Event listener for Forge apps that have macro config.
|
|
35
|
+
// When an app generates a new config schema, we need to force a re-render
|
|
36
|
+
// of the config panel so that the UI reflects the new schema.
|
|
37
|
+
// Otherwise the panel renders a stale schema.
|
|
38
|
+
var _useState3 = (0, _react.useState)(new Date()),
|
|
39
|
+
_useState4 = (0, _slicedToArray2.default)(_useState3, 2),
|
|
40
|
+
forgeAppConfigLastUpdated = _useState4[0],
|
|
41
|
+
setForgeAppConfigLastUpdated = _useState4[1];
|
|
42
|
+
(0, _react.useEffect)(function () {
|
|
43
|
+
if (extensionParameters !== null && extensionParameters !== void 0 && extensionParameters.extensionId && extensionParameters !== null && extensionParameters !== void 0 && extensionParameters.localId) {
|
|
44
|
+
var extensionId = extensionParameters.extensionId,
|
|
45
|
+
localId = extensionParameters.localId;
|
|
46
|
+
var id = "".concat(extensionId, "-").concat(localId);
|
|
47
|
+
var eventName = "forge.bridge.CONFIG_FORGE_DOC_UPDATED_".concat(id);
|
|
48
|
+
var handleForgeConfigUpdated = function handleForgeConfigUpdated() {
|
|
49
|
+
setForgeAppConfigLastUpdated(new Date());
|
|
50
|
+
};
|
|
51
|
+
var unbind = (0, _bindEventListener.bind)(window.document, {
|
|
52
|
+
type: eventName,
|
|
53
|
+
listener: handleForgeConfigUpdated
|
|
54
|
+
});
|
|
55
|
+
return function () {
|
|
56
|
+
unbind();
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
}, [extensionParameters]);
|
|
60
|
+
|
|
33
61
|
// Resolve the promise
|
|
34
62
|
// useStateFromPromise() has an issue which isn't compatible with
|
|
35
63
|
// DynamicFieldDefinitions when it returns a function as setState()
|
|
@@ -68,7 +96,7 @@ var FieldDefinitionsPromiseResolver = function FieldDefinitionsPromiseResolver(p
|
|
|
68
96
|
setFields(undefined);
|
|
69
97
|
}
|
|
70
98
|
});
|
|
71
|
-
}, [extensionManifest, nodeKey, extensionParameters, setErrorMessage]);
|
|
99
|
+
}, [extensionManifest, nodeKey, extensionParameters, setErrorMessage, forgeAppConfigLastUpdated]);
|
|
72
100
|
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, props.children(fields));
|
|
73
101
|
};
|
|
74
102
|
function FieldsLoader(_ref) {
|
|
@@ -93,10 +121,10 @@ function FieldsLoader(_ref) {
|
|
|
93
121
|
}, [extensionProvider, extensionType, extensionKey]),
|
|
94
122
|
_useStateFromPromise2 = (0, _slicedToArray2.default)(_useStateFromPromise, 1),
|
|
95
123
|
extensionManifest = _useStateFromPromise2[0];
|
|
96
|
-
var
|
|
97
|
-
|
|
98
|
-
errorMessage =
|
|
99
|
-
setErrorMessage =
|
|
124
|
+
var _useState5 = (0, _react.useState)(null),
|
|
125
|
+
_useState6 = (0, _slicedToArray2.default)(_useState5, 2),
|
|
126
|
+
errorMessage = _useState6[0],
|
|
127
|
+
setErrorMessage = _useState6[1];
|
|
100
128
|
return /*#__PURE__*/_react.default.createElement(FieldDefinitionsPromiseResolver, {
|
|
101
129
|
setErrorMessage: setErrorMessage,
|
|
102
130
|
extensionManifest: extensionManifest,
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import React, { useEffect, useState } from 'react';
|
|
2
|
+
import { bind } from 'bind-event-listener';
|
|
2
3
|
import ConfigPanel from './ConfigPanel';
|
|
3
4
|
import { useStateFromPromise } from './use-state-from-promise';
|
|
4
5
|
const getFieldsDefinitionFn = (extensionManifest, nodeKey) => {
|
|
@@ -18,6 +19,32 @@ const FieldDefinitionsPromiseResolver = props => {
|
|
|
18
19
|
} = props;
|
|
19
20
|
const [fields, setFields] = useState(undefined);
|
|
20
21
|
|
|
22
|
+
// Event listener for Forge apps that have macro config.
|
|
23
|
+
// When an app generates a new config schema, we need to force a re-render
|
|
24
|
+
// of the config panel so that the UI reflects the new schema.
|
|
25
|
+
// Otherwise the panel renders a stale schema.
|
|
26
|
+
const [forgeAppConfigLastUpdated, setForgeAppConfigLastUpdated] = useState(new Date());
|
|
27
|
+
useEffect(() => {
|
|
28
|
+
if (extensionParameters !== null && extensionParameters !== void 0 && extensionParameters.extensionId && extensionParameters !== null && extensionParameters !== void 0 && extensionParameters.localId) {
|
|
29
|
+
const {
|
|
30
|
+
extensionId,
|
|
31
|
+
localId
|
|
32
|
+
} = extensionParameters;
|
|
33
|
+
const id = `${extensionId}-${localId}`;
|
|
34
|
+
const eventName = `forge.bridge.CONFIG_FORGE_DOC_UPDATED_${id}`;
|
|
35
|
+
const handleForgeConfigUpdated = () => {
|
|
36
|
+
setForgeAppConfigLastUpdated(new Date());
|
|
37
|
+
};
|
|
38
|
+
const unbind = bind(window.document, {
|
|
39
|
+
type: eventName,
|
|
40
|
+
listener: handleForgeConfigUpdated
|
|
41
|
+
});
|
|
42
|
+
return () => {
|
|
43
|
+
unbind();
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
}, [extensionParameters]);
|
|
47
|
+
|
|
21
48
|
// Resolve the promise
|
|
22
49
|
// useStateFromPromise() has an issue which isn't compatible with
|
|
23
50
|
// DynamicFieldDefinitions when it returns a function as setState()
|
|
@@ -56,7 +83,7 @@ const FieldDefinitionsPromiseResolver = props => {
|
|
|
56
83
|
setFields(undefined);
|
|
57
84
|
}
|
|
58
85
|
});
|
|
59
|
-
}, [extensionManifest, nodeKey, extensionParameters, setErrorMessage]);
|
|
86
|
+
}, [extensionManifest, nodeKey, extensionParameters, setErrorMessage, forgeAppConfigLastUpdated]);
|
|
60
87
|
return /*#__PURE__*/React.createElement(React.Fragment, null, props.children(fields));
|
|
61
88
|
};
|
|
62
89
|
export default function FieldsLoader({
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
2
2
|
import React, { useEffect, useState } from 'react';
|
|
3
|
+
import { bind } from 'bind-event-listener';
|
|
3
4
|
import ConfigPanel from './ConfigPanel';
|
|
4
5
|
import { useStateFromPromise } from './use-state-from-promise';
|
|
5
6
|
var getFieldsDefinitionFn = function getFieldsDefinitionFn(extensionManifest, nodeKey) {
|
|
@@ -20,6 +21,33 @@ var FieldDefinitionsPromiseResolver = function FieldDefinitionsPromiseResolver(p
|
|
|
20
21
|
fields = _useState2[0],
|
|
21
22
|
setFields = _useState2[1];
|
|
22
23
|
|
|
24
|
+
// Event listener for Forge apps that have macro config.
|
|
25
|
+
// When an app generates a new config schema, we need to force a re-render
|
|
26
|
+
// of the config panel so that the UI reflects the new schema.
|
|
27
|
+
// Otherwise the panel renders a stale schema.
|
|
28
|
+
var _useState3 = useState(new Date()),
|
|
29
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
30
|
+
forgeAppConfigLastUpdated = _useState4[0],
|
|
31
|
+
setForgeAppConfigLastUpdated = _useState4[1];
|
|
32
|
+
useEffect(function () {
|
|
33
|
+
if (extensionParameters !== null && extensionParameters !== void 0 && extensionParameters.extensionId && extensionParameters !== null && extensionParameters !== void 0 && extensionParameters.localId) {
|
|
34
|
+
var extensionId = extensionParameters.extensionId,
|
|
35
|
+
localId = extensionParameters.localId;
|
|
36
|
+
var id = "".concat(extensionId, "-").concat(localId);
|
|
37
|
+
var eventName = "forge.bridge.CONFIG_FORGE_DOC_UPDATED_".concat(id);
|
|
38
|
+
var handleForgeConfigUpdated = function handleForgeConfigUpdated() {
|
|
39
|
+
setForgeAppConfigLastUpdated(new Date());
|
|
40
|
+
};
|
|
41
|
+
var unbind = bind(window.document, {
|
|
42
|
+
type: eventName,
|
|
43
|
+
listener: handleForgeConfigUpdated
|
|
44
|
+
});
|
|
45
|
+
return function () {
|
|
46
|
+
unbind();
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
}, [extensionParameters]);
|
|
50
|
+
|
|
23
51
|
// Resolve the promise
|
|
24
52
|
// useStateFromPromise() has an issue which isn't compatible with
|
|
25
53
|
// DynamicFieldDefinitions when it returns a function as setState()
|
|
@@ -58,7 +86,7 @@ var FieldDefinitionsPromiseResolver = function FieldDefinitionsPromiseResolver(p
|
|
|
58
86
|
setFields(undefined);
|
|
59
87
|
}
|
|
60
88
|
});
|
|
61
|
-
}, [extensionManifest, nodeKey, extensionParameters, setErrorMessage]);
|
|
89
|
+
}, [extensionManifest, nodeKey, extensionParameters, setErrorMessage, forgeAppConfigLastUpdated]);
|
|
62
90
|
return /*#__PURE__*/React.createElement(React.Fragment, null, props.children(fields));
|
|
63
91
|
};
|
|
64
92
|
export default function FieldsLoader(_ref) {
|
|
@@ -83,10 +111,10 @@ export default function FieldsLoader(_ref) {
|
|
|
83
111
|
}, [extensionProvider, extensionType, extensionKey]),
|
|
84
112
|
_useStateFromPromise2 = _slicedToArray(_useStateFromPromise, 1),
|
|
85
113
|
extensionManifest = _useStateFromPromise2[0];
|
|
86
|
-
var
|
|
87
|
-
|
|
88
|
-
errorMessage =
|
|
89
|
-
setErrorMessage =
|
|
114
|
+
var _useState5 = useState(null),
|
|
115
|
+
_useState6 = _slicedToArray(_useState5, 2),
|
|
116
|
+
errorMessage = _useState6[0],
|
|
117
|
+
setErrorMessage = _useState6[1];
|
|
90
118
|
return /*#__PURE__*/React.createElement(FieldDefinitionsPromiseResolver, {
|
|
91
119
|
setErrorMessage: setErrorMessage,
|
|
92
120
|
extensionManifest: extensionManifest,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atlaskit/editor-plugin-extension",
|
|
3
|
-
"version": "1.11.
|
|
3
|
+
"version": "1.11.1",
|
|
4
4
|
"description": "editor-plugin-extension plugin for @atlaskit/editor-core",
|
|
5
5
|
"author": "Atlassian Pty Ltd",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"@atlaskit/form": "^10.4.0",
|
|
47
47
|
"@atlaskit/icon": "^22.7.0",
|
|
48
48
|
"@atlaskit/platform-feature-flags": "^0.3.0",
|
|
49
|
-
"@atlaskit/primitives": "^11.
|
|
49
|
+
"@atlaskit/primitives": "^11.1.0",
|
|
50
50
|
"@atlaskit/radio": "^6.4.0",
|
|
51
51
|
"@atlaskit/section-message": "^6.5.0",
|
|
52
52
|
"@atlaskit/select": "^17.11.0",
|
|
@@ -61,6 +61,7 @@
|
|
|
61
61
|
"@atlaskit/tooltip": "^18.5.0",
|
|
62
62
|
"@babel/runtime": "^7.0.0",
|
|
63
63
|
"@emotion/react": "^11.7.1",
|
|
64
|
+
"bind-event-listener": "^3.0.0",
|
|
64
65
|
"is-number": "^7.0.0",
|
|
65
66
|
"lodash": "^4.17.21",
|
|
66
67
|
"memoize-one": "^6.0.0",
|