@atlaskit/embedded-document 0.7.29
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 +978 -0
- package/LICENSE +13 -0
- package/build/tsconfig.json +17 -0
- package/dist/cjs/components/document.js +157 -0
- package/dist/cjs/components/toolbar.js +89 -0
- package/dist/cjs/consumers/consumer.js +102 -0
- package/dist/cjs/consumers/document-body.js +95 -0
- package/dist/cjs/consumers/with-document-actions.js +139 -0
- package/dist/cjs/context/context.js +71 -0
- package/dist/cjs/context/embedded-document.js +396 -0
- package/dist/cjs/index.js +47 -0
- package/dist/cjs/model/index.js +5 -0
- package/dist/cjs/provider/index.js +35 -0
- package/dist/cjs/provider/provider.js +5 -0
- package/dist/cjs/provider/service-provider.js +240 -0
- package/dist/cjs/version.json +5 -0
- package/dist/es2019/components/document.js +107 -0
- package/dist/es2019/components/toolbar.js +45 -0
- package/dist/es2019/consumers/consumer.js +62 -0
- package/dist/es2019/consumers/document-body.js +49 -0
- package/dist/es2019/consumers/with-document-actions.js +35 -0
- package/dist/es2019/context/context.js +19 -0
- package/dist/es2019/context/embedded-document.js +216 -0
- package/dist/es2019/index.js +5 -0
- package/dist/es2019/model/index.js +1 -0
- package/dist/es2019/provider/index.js +18 -0
- package/dist/es2019/provider/provider.js +1 -0
- package/dist/es2019/provider/service-provider.js +101 -0
- package/dist/es2019/version.json +5 -0
- package/dist/esm/components/document.js +136 -0
- package/dist/esm/components/toolbar.js +70 -0
- package/dist/esm/consumers/consumer.js +84 -0
- package/dist/esm/consumers/document-body.js +77 -0
- package/dist/esm/consumers/with-document-actions.js +119 -0
- package/dist/esm/context/context.js +59 -0
- package/dist/esm/context/embedded-document.js +375 -0
- package/dist/esm/index.js +5 -0
- package/dist/esm/model/index.js +1 -0
- package/dist/esm/provider/index.js +18 -0
- package/dist/esm/provider/provider.js +1 -0
- package/dist/esm/provider/service-provider.js +229 -0
- package/dist/esm/version.json +5 -0
- package/dist/types/components/document.d.ts +20 -0
- package/dist/types/components/toolbar.d.ts +6 -0
- package/dist/types/consumers/consumer.d.ts +23 -0
- package/dist/types/consumers/document-body.d.ts +13 -0
- package/dist/types/consumers/with-document-actions.d.ts +16 -0
- package/dist/types/context/context.d.ts +22 -0
- package/dist/types/context/embedded-document.d.ts +41 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/model/index.d.ts +19 -0
- package/dist/types/provider/index.d.ts +9 -0
- package/dist/types/provider/provider.d.ts +7 -0
- package/dist/types/provider/service-provider.d.ts +13 -0
- package/package.json +44 -0
- package/tsconfig.json +15 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import ButtonGroup from '@atlaskit/button/button-group';
|
|
3
|
+
import Button from '@atlaskit/button/custom-theme-button';
|
|
4
|
+
import styled from 'styled-components';
|
|
5
|
+
import WithDocumentActions from '../consumers/with-document-actions';
|
|
6
|
+
const Toolbar = styled.div`
|
|
7
|
+
display: flex;
|
|
8
|
+
align-items: center;
|
|
9
|
+
justify-content: flex-end;
|
|
10
|
+
padding: 0 20px;
|
|
11
|
+
height: 80px;
|
|
12
|
+
`;
|
|
13
|
+
export default (props => {
|
|
14
|
+
const {
|
|
15
|
+
mode,
|
|
16
|
+
editorActions
|
|
17
|
+
} = props;
|
|
18
|
+
return /*#__PURE__*/React.createElement(WithDocumentActions, {
|
|
19
|
+
render: actions => {
|
|
20
|
+
switch (mode) {
|
|
21
|
+
case 'edit':
|
|
22
|
+
case 'create':
|
|
23
|
+
return /*#__PURE__*/React.createElement(ButtonGroup, null, /*#__PURE__*/React.createElement(Button, {
|
|
24
|
+
appearance: "primary",
|
|
25
|
+
onClick: async () => {
|
|
26
|
+
const value = await editorActions.getValue();
|
|
27
|
+
|
|
28
|
+
try {
|
|
29
|
+
await (mode === 'create' ? actions.createDocument(value) : actions.updateDocument(value));
|
|
30
|
+
} catch (err) {}
|
|
31
|
+
}
|
|
32
|
+
}, "Publish"), /*#__PURE__*/React.createElement(Button, {
|
|
33
|
+
appearance: "subtle",
|
|
34
|
+
onClick: () => actions.cancelEdit()
|
|
35
|
+
}, "Close"));
|
|
36
|
+
|
|
37
|
+
default:
|
|
38
|
+
return /*#__PURE__*/React.createElement(Toolbar, null, /*#__PURE__*/React.createElement(ButtonGroup, null, /*#__PURE__*/React.createElement(Button, {
|
|
39
|
+
appearance: "primary",
|
|
40
|
+
onClick: () => actions.editDocument()
|
|
41
|
+
}, "Edit")));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
});
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { PureComponent } from 'react';
|
|
4
|
+
import { Context } from '../context/context';
|
|
5
|
+
export class Consumer extends PureComponent {
|
|
6
|
+
constructor(...args) {
|
|
7
|
+
super(...args);
|
|
8
|
+
|
|
9
|
+
_defineProperty(this, "getPropsFromActions", actions => {
|
|
10
|
+
const {
|
|
11
|
+
actionsMapper
|
|
12
|
+
} = this.props;
|
|
13
|
+
|
|
14
|
+
if (actionsMapper) {
|
|
15
|
+
if (!this.previousActions || !this.propsFromActions || this.previousActions !== actions) {
|
|
16
|
+
this.propsFromActions = actionsMapper(actions);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
this.previousActions = actions;
|
|
21
|
+
return this.propsFromActions;
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
_defineProperty(this, "getPropsFromState", state => {
|
|
25
|
+
const {
|
|
26
|
+
stateMapper
|
|
27
|
+
} = this.props;
|
|
28
|
+
|
|
29
|
+
if (stateMapper) {
|
|
30
|
+
return stateMapper(state);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return undefined;
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
_defineProperty(this, "getRenderProps", renderProps => {
|
|
37
|
+
const {
|
|
38
|
+
renderPropsMapper
|
|
39
|
+
} = this.props;
|
|
40
|
+
|
|
41
|
+
if (renderPropsMapper) {
|
|
42
|
+
return renderPropsMapper(renderProps);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return undefined;
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
_defineProperty(this, "renderChildren", ({
|
|
49
|
+
actions,
|
|
50
|
+
value,
|
|
51
|
+
renderProps
|
|
52
|
+
}) => {
|
|
53
|
+
const props = Object.assign({}, this.getPropsFromState(value), this.getPropsFromActions(actions), this.getRenderProps(renderProps));
|
|
54
|
+
return this.props.children(props);
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
render() {
|
|
59
|
+
return /*#__PURE__*/React.createElement(Context.Consumer, null, this.renderChildren);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import _extends from "@babel/runtime/helpers/extends";
|
|
2
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { PureComponent } from 'react';
|
|
5
|
+
import { Consumer } from './consumer';
|
|
6
|
+
import { default as Document } from '../components/document';
|
|
7
|
+
export default class DocumentBody extends PureComponent {
|
|
8
|
+
constructor(...args) {
|
|
9
|
+
super(...args);
|
|
10
|
+
|
|
11
|
+
_defineProperty(this, "renderChild", props => {
|
|
12
|
+
return /*#__PURE__*/React.createElement(Document, _extends({}, this.props, props));
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
_defineProperty(this, "stateMapper", state => {
|
|
16
|
+
const {
|
|
17
|
+
doc,
|
|
18
|
+
hasError,
|
|
19
|
+
isLoading,
|
|
20
|
+
mode
|
|
21
|
+
} = state;
|
|
22
|
+
return {
|
|
23
|
+
doc,
|
|
24
|
+
hasError,
|
|
25
|
+
isLoading,
|
|
26
|
+
mode
|
|
27
|
+
};
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
_defineProperty(this, "renderPropsMapper", renderProps => {
|
|
31
|
+
const {
|
|
32
|
+
renderTitle,
|
|
33
|
+
renderToolbar
|
|
34
|
+
} = renderProps;
|
|
35
|
+
return {
|
|
36
|
+
renderTitle,
|
|
37
|
+
renderToolbar
|
|
38
|
+
};
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
render() {
|
|
43
|
+
return /*#__PURE__*/React.createElement(Consumer, {
|
|
44
|
+
stateMapper: this.stateMapper,
|
|
45
|
+
renderPropsMapper: this.renderPropsMapper
|
|
46
|
+
}, this.renderChild);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { PureComponent } from 'react';
|
|
4
|
+
import { Consumer } from '../consumers/consumer';
|
|
5
|
+
export default class WithDocumentActions extends PureComponent {
|
|
6
|
+
constructor(...args) {
|
|
7
|
+
super(...args);
|
|
8
|
+
|
|
9
|
+
_defineProperty(this, "actionsMapper", actions => ({
|
|
10
|
+
async createDocument(value) {
|
|
11
|
+
return actions.createDocument(value);
|
|
12
|
+
},
|
|
13
|
+
|
|
14
|
+
async editDocument() {
|
|
15
|
+
actions.setDocumentMode('edit');
|
|
16
|
+
},
|
|
17
|
+
|
|
18
|
+
async updateDocument(value) {
|
|
19
|
+
return actions.updateDocument(value);
|
|
20
|
+
},
|
|
21
|
+
|
|
22
|
+
async cancelEdit() {
|
|
23
|
+
actions.setDocumentMode('view');
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
}));
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
render() {
|
|
30
|
+
return /*#__PURE__*/React.createElement(Consumer, {
|
|
31
|
+
actionsMapper: this.actionsMapper
|
|
32
|
+
}, this.props.render);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { createContext } from 'react';
|
|
2
|
+
|
|
3
|
+
const noop = () => {};
|
|
4
|
+
|
|
5
|
+
export const Context = /*#__PURE__*/createContext({
|
|
6
|
+
value: {},
|
|
7
|
+
actions: {
|
|
8
|
+
getDocument: noop,
|
|
9
|
+
getDocumentByObjectId: noop,
|
|
10
|
+
setDocumentMode: noop,
|
|
11
|
+
updateDocument: async () => {
|
|
12
|
+
throw new Error('Not implemented.');
|
|
13
|
+
},
|
|
14
|
+
createDocument: async () => {
|
|
15
|
+
throw new Error('Not implemented.');
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
renderProps: {}
|
|
19
|
+
});
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { Component } from 'react';
|
|
4
|
+
import styled from 'styled-components';
|
|
5
|
+
import { Context } from './context';
|
|
6
|
+
import { getProvider } from '../provider';
|
|
7
|
+
import { akEditorGutterPadding } from '@atlaskit/editor-shared-styles';
|
|
8
|
+
export const akEditorFullPageMaxWidth = 680;
|
|
9
|
+
const Content = styled.div`
|
|
10
|
+
line-height: 24px;
|
|
11
|
+
height: 100%;
|
|
12
|
+
width: 100%;
|
|
13
|
+
max-width: ${akEditorFullPageMaxWidth + akEditorGutterPadding * 2}px;
|
|
14
|
+
padding-top: 50px;
|
|
15
|
+
margin: 0 auto;
|
|
16
|
+
display: flex;
|
|
17
|
+
flex-direction: column;
|
|
18
|
+
flex-grow: 1;
|
|
19
|
+
padding-bottom: 55px;
|
|
20
|
+
|
|
21
|
+
& > * {
|
|
22
|
+
padding: 0 32px;
|
|
23
|
+
}
|
|
24
|
+
`;
|
|
25
|
+
export default class EmbeddedDocument extends Component {
|
|
26
|
+
constructor(props) {
|
|
27
|
+
super(props);
|
|
28
|
+
|
|
29
|
+
_defineProperty(this, "getDocumentByObjectId", async (objectId, language) => {
|
|
30
|
+
this.setState({
|
|
31
|
+
isLoading: true
|
|
32
|
+
});
|
|
33
|
+
const doc = await this.provider.getDocumentByObjectId(objectId, language);
|
|
34
|
+
this.setDocumentState(doc);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
_defineProperty(this, "getDocument", async (documentId, language) => {
|
|
38
|
+
this.setState({
|
|
39
|
+
isLoading: true
|
|
40
|
+
});
|
|
41
|
+
const doc = await this.provider.getDocument(documentId, language);
|
|
42
|
+
this.setDocumentState(doc);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
_defineProperty(this, "setDocumentMode", async mode => {
|
|
46
|
+
this.setState({
|
|
47
|
+
mode
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
_defineProperty(this, "updateDocument", async body => {
|
|
52
|
+
const {
|
|
53
|
+
documentId,
|
|
54
|
+
objectId,
|
|
55
|
+
language
|
|
56
|
+
} = this.state.doc || this.props;
|
|
57
|
+
|
|
58
|
+
if (!documentId) {
|
|
59
|
+
return this.createDocument(body);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const doc = await this.provider.updateDocument(documentId, JSON.stringify(body), objectId, '', language);
|
|
63
|
+
|
|
64
|
+
if (doc) {
|
|
65
|
+
this.setState({
|
|
66
|
+
doc,
|
|
67
|
+
mode: 'view'
|
|
68
|
+
});
|
|
69
|
+
return doc;
|
|
70
|
+
} else {
|
|
71
|
+
this.setState({
|
|
72
|
+
hasError: true,
|
|
73
|
+
mode: 'view'
|
|
74
|
+
});
|
|
75
|
+
throw new Error('Failed to update document');
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
_defineProperty(this, "createDocument", async body => {
|
|
80
|
+
const {
|
|
81
|
+
objectId,
|
|
82
|
+
language
|
|
83
|
+
} = this.props;
|
|
84
|
+
const doc = await this.provider.createDocument(JSON.stringify(body), objectId, '', language);
|
|
85
|
+
|
|
86
|
+
if (doc) {
|
|
87
|
+
this.setState({
|
|
88
|
+
doc,
|
|
89
|
+
mode: 'view'
|
|
90
|
+
});
|
|
91
|
+
return doc;
|
|
92
|
+
} else {
|
|
93
|
+
this.setState({
|
|
94
|
+
hasError: true,
|
|
95
|
+
mode: 'view'
|
|
96
|
+
});
|
|
97
|
+
throw new Error('Failed to create document');
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
_defineProperty(this, "setDocumentState", doc => {
|
|
102
|
+
if (doc) {
|
|
103
|
+
this.setState({
|
|
104
|
+
isLoading: false,
|
|
105
|
+
doc
|
|
106
|
+
});
|
|
107
|
+
} else {
|
|
108
|
+
this.setState({
|
|
109
|
+
isLoading: false,
|
|
110
|
+
mode: 'edit'
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
this.actions = {
|
|
116
|
+
getDocument: this.getDocument,
|
|
117
|
+
setDocumentMode: this.setDocumentMode,
|
|
118
|
+
updateDocument: this.updateDocument,
|
|
119
|
+
createDocument: this.createDocument,
|
|
120
|
+
getDocumentByObjectId: this.getDocumentByObjectId
|
|
121
|
+
};
|
|
122
|
+
this.provider = getProvider(props);
|
|
123
|
+
this.state = {
|
|
124
|
+
mode: props.mode || 'view',
|
|
125
|
+
isLoading: true
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
async componentDidMount() {
|
|
130
|
+
const {
|
|
131
|
+
documentId,
|
|
132
|
+
language,
|
|
133
|
+
objectId
|
|
134
|
+
} = this.props;
|
|
135
|
+
|
|
136
|
+
if (documentId) {
|
|
137
|
+
await this.getDocument(documentId, language);
|
|
138
|
+
} else {
|
|
139
|
+
await this.getDocumentByObjectId(objectId, language);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Toolbar will only be rendered here if we're in "view"-mode.
|
|
145
|
+
*
|
|
146
|
+
* In all other modes, the toolbar rendering will be triggered
|
|
147
|
+
* by the Document-component.
|
|
148
|
+
*/
|
|
149
|
+
renderToolbar() {
|
|
150
|
+
const {
|
|
151
|
+
mode
|
|
152
|
+
} = this.state;
|
|
153
|
+
const {
|
|
154
|
+
renderToolbar
|
|
155
|
+
} = this.props;
|
|
156
|
+
|
|
157
|
+
if (mode !== 'view' || !renderToolbar) {
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
return renderToolbar(mode);
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Title will only be rendered here if we're in "view"-mode.
|
|
165
|
+
*
|
|
166
|
+
* In all other modes, the title rendering will be triggered
|
|
167
|
+
* by the Document-component.
|
|
168
|
+
*/
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
renderTitle() {
|
|
172
|
+
const {
|
|
173
|
+
mode,
|
|
174
|
+
doc
|
|
175
|
+
} = this.state;
|
|
176
|
+
const {
|
|
177
|
+
renderTitle
|
|
178
|
+
} = this.props;
|
|
179
|
+
|
|
180
|
+
if (mode !== 'view' || !renderTitle) {
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
return renderTitle(mode, doc);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
renderContent() {
|
|
188
|
+
const {
|
|
189
|
+
mode
|
|
190
|
+
} = this.state;
|
|
191
|
+
|
|
192
|
+
if (mode === 'view') {
|
|
193
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, this.renderToolbar(), /*#__PURE__*/React.createElement(Content, null, this.renderTitle(), this.props.children));
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
return this.props.children;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
render() {
|
|
200
|
+
const {
|
|
201
|
+
renderTitle,
|
|
202
|
+
renderToolbar
|
|
203
|
+
} = this.props;
|
|
204
|
+
return /*#__PURE__*/React.createElement(Context.Provider, {
|
|
205
|
+
value: {
|
|
206
|
+
value: this.state,
|
|
207
|
+
actions: this.actions,
|
|
208
|
+
renderProps: {
|
|
209
|
+
renderTitle,
|
|
210
|
+
renderToolbar
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}, this.renderContent());
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { default as EmbeddedDocument } from './context/embedded-document';
|
|
2
|
+
export { default as DocumentBody } from './consumers/document-body';
|
|
3
|
+
export { default as WithDocumentActions } from './consumers/with-document-actions';
|
|
4
|
+
export { default as ServiceProvider } from './provider/service-provider';
|
|
5
|
+
export { default as Toolbar } from './components/toolbar';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { default as ServiceProvider } from './service-provider';
|
|
2
|
+
export { ServiceProvider };
|
|
3
|
+
export const getProvider = ({
|
|
4
|
+
provider,
|
|
5
|
+
url
|
|
6
|
+
}) => {
|
|
7
|
+
if (provider) {
|
|
8
|
+
return provider;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
if (url) {
|
|
12
|
+
return new ServiceProvider({
|
|
13
|
+
url
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
throw new Error('Missing provider');
|
|
18
|
+
};
|