@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.
Files changed (56) hide show
  1. package/CHANGELOG.md +978 -0
  2. package/LICENSE +13 -0
  3. package/build/tsconfig.json +17 -0
  4. package/dist/cjs/components/document.js +157 -0
  5. package/dist/cjs/components/toolbar.js +89 -0
  6. package/dist/cjs/consumers/consumer.js +102 -0
  7. package/dist/cjs/consumers/document-body.js +95 -0
  8. package/dist/cjs/consumers/with-document-actions.js +139 -0
  9. package/dist/cjs/context/context.js +71 -0
  10. package/dist/cjs/context/embedded-document.js +396 -0
  11. package/dist/cjs/index.js +47 -0
  12. package/dist/cjs/model/index.js +5 -0
  13. package/dist/cjs/provider/index.js +35 -0
  14. package/dist/cjs/provider/provider.js +5 -0
  15. package/dist/cjs/provider/service-provider.js +240 -0
  16. package/dist/cjs/version.json +5 -0
  17. package/dist/es2019/components/document.js +107 -0
  18. package/dist/es2019/components/toolbar.js +45 -0
  19. package/dist/es2019/consumers/consumer.js +62 -0
  20. package/dist/es2019/consumers/document-body.js +49 -0
  21. package/dist/es2019/consumers/with-document-actions.js +35 -0
  22. package/dist/es2019/context/context.js +19 -0
  23. package/dist/es2019/context/embedded-document.js +216 -0
  24. package/dist/es2019/index.js +5 -0
  25. package/dist/es2019/model/index.js +1 -0
  26. package/dist/es2019/provider/index.js +18 -0
  27. package/dist/es2019/provider/provider.js +1 -0
  28. package/dist/es2019/provider/service-provider.js +101 -0
  29. package/dist/es2019/version.json +5 -0
  30. package/dist/esm/components/document.js +136 -0
  31. package/dist/esm/components/toolbar.js +70 -0
  32. package/dist/esm/consumers/consumer.js +84 -0
  33. package/dist/esm/consumers/document-body.js +77 -0
  34. package/dist/esm/consumers/with-document-actions.js +119 -0
  35. package/dist/esm/context/context.js +59 -0
  36. package/dist/esm/context/embedded-document.js +375 -0
  37. package/dist/esm/index.js +5 -0
  38. package/dist/esm/model/index.js +1 -0
  39. package/dist/esm/provider/index.js +18 -0
  40. package/dist/esm/provider/provider.js +1 -0
  41. package/dist/esm/provider/service-provider.js +229 -0
  42. package/dist/esm/version.json +5 -0
  43. package/dist/types/components/document.d.ts +20 -0
  44. package/dist/types/components/toolbar.d.ts +6 -0
  45. package/dist/types/consumers/consumer.d.ts +23 -0
  46. package/dist/types/consumers/document-body.d.ts +13 -0
  47. package/dist/types/consumers/with-document-actions.d.ts +16 -0
  48. package/dist/types/context/context.d.ts +22 -0
  49. package/dist/types/context/embedded-document.d.ts +41 -0
  50. package/dist/types/index.d.ts +8 -0
  51. package/dist/types/model/index.d.ts +19 -0
  52. package/dist/types/provider/index.d.ts +9 -0
  53. package/dist/types/provider/provider.d.ts +7 -0
  54. package/dist/types/provider/service-provider.d.ts +13 -0
  55. package/package.json +44 -0
  56. 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
+ };