pages_core 3.7.0 → 3.8.0

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 (164) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -2
  3. data/app/assets/builds/pages_core/admin-dist.js +55 -0
  4. data/app/assets/stylesheets/pages/admin/components/image_editor.scss +1 -0
  5. data/app/assets/stylesheets/pages/admin/components/image_grid.scss +33 -5
  6. data/app/assets/stylesheets/pages/admin/components/layout.scss +2 -1
  7. data/app/assets/stylesheets/pages/admin/components/login.scss +6 -0
  8. data/app/assets/stylesheets/pages/admin/components/tabs.scss +5 -0
  9. data/app/assets/stylesheets/pages/admin/components/tag_editor.scss +13 -7
  10. data/app/assets/stylesheets/pages/admin/controllers/pages.scss +13 -5
  11. data/app/assets/stylesheets/pages/admin.scss +0 -1
  12. data/app/controller_dummies/admin/admin_controller.rb +1 -1
  13. data/app/controller_dummies/application_controller.rb +1 -1
  14. data/app/controller_dummies/attachments_controller.rb +1 -1
  15. data/app/controller_dummies/frontend_controller.rb +1 -1
  16. data/app/controller_dummies/images_controller.rb +1 -1
  17. data/app/controller_dummies/page_files_controller.rb +1 -1
  18. data/app/controller_dummies/pages_controller.rb +1 -1
  19. data/app/controller_dummies/sitemaps_controller.rb +1 -1
  20. data/app/controllers/admin/attachments_controller.rb +1 -1
  21. data/app/controllers/admin/images_controller.rb +10 -7
  22. data/app/controllers/concerns/pages_core/authentication.rb +9 -4
  23. data/app/controllers/concerns/pages_core/preview_pages_controller.rb +5 -0
  24. data/app/controllers/pages_core/frontend/pages_controller.rb +5 -2
  25. data/app/controllers/sessions_controller.rb +1 -1
  26. data/app/formatters/pages_core/link_renderer.rb +2 -2
  27. data/app/helpers/application_helper.rb +1 -1
  28. data/app/helpers/frontend_helper.rb +1 -1
  29. data/app/helpers/pages_core/admin/content_tabs_helper.rb +5 -2
  30. data/app/helpers/pages_core/admin/image_uploads_helper.rb +2 -3
  31. data/app/helpers/pages_core/admin/tag_editor_helper.rb +9 -39
  32. data/app/helpers/pages_core/head_tags_helper.rb +11 -20
  33. data/app/helpers/pages_core/open_graph_tags_helper.rb +1 -1
  34. data/app/javascript/admin-dist.js +2 -0
  35. data/app/javascript/components/Attachments/Attachment.jsx +121 -0
  36. data/app/javascript/components/Attachments/AttachmentEditor.jsx +116 -0
  37. data/app/javascript/components/Attachments/Placeholder.jsx +10 -0
  38. data/app/javascript/components/Attachments.jsx +165 -0
  39. data/app/{assets/javascripts/pages/admin/components/date_range_select.jsx → javascript/components/DateRangeSelect.jsx} +16 -5
  40. data/app/javascript/components/EditableImage.jsx +61 -0
  41. data/app/{assets/javascripts/pages/admin/components/file_upload_button.jsx → javascript/components/FileUploadButton.jsx} +11 -1
  42. data/app/{assets/javascripts/pages/admin/components/focal_point.jsx → javascript/components/ImageCropper/FocalPoint.jsx} +12 -1
  43. data/app/javascript/components/ImageCropper/Image.jsx +65 -0
  44. data/app/javascript/components/ImageCropper/Toolbar.jsx +73 -0
  45. data/app/javascript/components/ImageCropper/useCrop.js +199 -0
  46. data/app/javascript/components/ImageCropper.jsx +90 -0
  47. data/app/javascript/components/ImageEditor/Form.jsx +98 -0
  48. data/app/javascript/components/ImageEditor.jsx +62 -0
  49. data/app/javascript/components/ImageGrid/DragElement.jsx +30 -0
  50. data/app/javascript/components/ImageGrid/FilePlaceholder.jsx +9 -0
  51. data/app/javascript/components/ImageGrid/GridImage.jsx +103 -0
  52. data/app/javascript/components/ImageGrid/Placeholder.jsx +23 -0
  53. data/app/javascript/components/ImageGrid.jsx +257 -0
  54. data/app/javascript/components/ImageUploader.jsx +171 -0
  55. data/app/{assets/javascripts/pages/admin/components/modal.jsx → javascript/components/Modal.jsx} +13 -2
  56. data/app/javascript/components/ModalStore.jsx +12 -0
  57. data/app/{assets/javascripts/pages/admin/components/page_dates.jsx → javascript/components/PageDates.jsx} +11 -1
  58. data/app/{assets/javascripts/pages/admin/components/page_files.jsx → javascript/components/PageFiles.jsx} +11 -2
  59. data/app/{assets/javascripts/pages/admin/components/page_images.jsx → javascript/components/PageImages.jsx} +11 -2
  60. data/app/{assets/javascripts/pages/admin/components/page_tree_store.jsx → javascript/components/PageTree.jsx} +127 -137
  61. data/app/{assets/javascripts/pages/admin/components/page_tree.jsx → javascript/components/PageTreeDraggable.jsx} +35 -29
  62. data/app/{assets/javascripts/pages/admin/components/page_tree_node.jsx → javascript/components/PageTreeNode.jsx} +35 -20
  63. data/app/javascript/components/RichTextArea.jsx +213 -0
  64. data/app/javascript/components/RichTextToolbarButton.jsx +20 -0
  65. data/app/javascript/components/TagEditor/AddTagForm.jsx +42 -0
  66. data/app/javascript/components/TagEditor/Tag.jsx +32 -0
  67. data/app/javascript/components/TagEditor.jsx +61 -0
  68. data/app/javascript/components/Toast.jsx +72 -0
  69. data/app/javascript/components/ToastStore.jsx +14 -0
  70. data/app/javascript/components/drag/draggedOrder.js +51 -0
  71. data/app/javascript/components/drag/useDragCollection.js +84 -0
  72. data/app/javascript/components/drag/useDragUploader.js +112 -0
  73. data/app/javascript/components/drag/useDraggable.js +17 -0
  74. data/app/javascript/components/drag.js +6 -0
  75. data/app/javascript/components.js +14 -0
  76. data/app/javascript/controllers/EditPageController.js +20 -0
  77. data/app/javascript/controllers/LoginController.js +29 -0
  78. data/app/javascript/controllers/MainController.js +65 -0
  79. data/app/javascript/controllers/PageOptionsController.js +62 -0
  80. data/app/javascript/features/RichText.jsx +34 -0
  81. data/app/javascript/hooks.js +2 -0
  82. data/app/javascript/index.js +33 -0
  83. data/app/{assets/javascripts/pages/admin/lib/tree.jsx → javascript/lib/Tree.js} +55 -54
  84. data/app/javascript/lib/copyToClipboard.js +13 -0
  85. data/app/javascript/lib/readyHandler.js +22 -0
  86. data/app/javascript/lib/request.js +36 -0
  87. data/app/models/concerns/pages_core/page_model/images.rb +3 -1
  88. data/app/models/concerns/pages_core/page_model/searchable.rb +19 -0
  89. data/app/models/concerns/pages_core/searchable_document.rb +71 -0
  90. data/app/models/concerns/pages_core/taggable.rb +27 -12
  91. data/app/models/page.rb +2 -0
  92. data/app/models/page_exporter.rb +2 -2
  93. data/app/models/page_image.rb +0 -2
  94. data/app/models/role.rb +1 -1
  95. data/app/models/search_document.rb +72 -0
  96. data/app/models/tag.rb +1 -0
  97. data/app/models/user.rb +1 -1
  98. data/app/{serializers/admin/attachment_serializer.rb → resources/admin/attachment_resource.rb} +6 -5
  99. data/app/{serializers/admin/image_serializer.rb → resources/admin/image_resource.rb} +9 -9
  100. data/app/resources/admin/page_file_resource.rb +10 -0
  101. data/app/{serializers/admin/page_image_serializer.rb → resources/admin/page_image_resource.rb} +4 -2
  102. data/app/resources/export/attachment_resource.rb +10 -0
  103. data/app/resources/export/page_image_resource.rb +45 -0
  104. data/app/resources/export/page_resource.rb +42 -0
  105. data/app/{serializers/page_image_serializer.rb → resources/page_image_resource.rb} +8 -16
  106. data/app/resources/page_resource.rb +33 -0
  107. data/app/services/pages_core/destroy_invite_service.rb +2 -2
  108. data/app/services/pages_core/invite_service.rb +2 -2
  109. data/app/views/admin/pages/_edit_content.html.erb +1 -1
  110. data/app/views/admin/pages/_edit_files.html.erb +1 -5
  111. data/app/views/admin/pages/_edit_images.html.erb +1 -5
  112. data/app/views/admin/pages/_edit_options.html.erb +74 -55
  113. data/app/views/admin/pages/_form.html.erb +19 -0
  114. data/app/views/admin/pages/edit.html.erb +35 -61
  115. data/app/views/admin/pages/index.html.erb +0 -1
  116. data/app/views/admin/pages/new.html.erb +32 -32
  117. data/app/views/admin/users/_access_control.html.erb +5 -1
  118. data/app/views/admin/users/login.html.erb +12 -4
  119. data/app/views/feeds/pages.rss.builder +1 -2
  120. data/app/views/layouts/admin/_header.html.erb +1 -1
  121. data/app/views/layouts/admin/_page_header.html.erb +33 -0
  122. data/app/views/layouts/admin.html.erb +23 -42
  123. data/app/views/pages_core/_google_analytics.html.erb +8 -0
  124. data/db/migrate/20180625154059_enable_search_extensions.rb +10 -0
  125. data/db/migrate/20210209151400_create_search_configurations.rb +35 -0
  126. data/db/migrate/20210210235200_create_search_documents.rb +74 -0
  127. data/lib/pages_core/engine.rb +1 -5
  128. data/lib/pages_core/templates/block_configuration.rb +1 -1
  129. data/lib/pages_core/templates/configuration_handler.rb +1 -1
  130. data/lib/pages_core/version.rb +1 -1
  131. data/lib/pages_core.rb +3 -5
  132. data/lib/rails/generators/pages_core/frontend/frontend_generator.rb +0 -7
  133. data/lib/rails/generators/pages_core/install/templates/page_templates_initializer.rb +2 -2
  134. metadata +101 -115
  135. data/app/assets/javascripts/pages/admin/components/attachment.jsx +0 -130
  136. data/app/assets/javascripts/pages/admin/components/attachment_editor.jsx +0 -131
  137. data/app/assets/javascripts/pages/admin/components/attachments.jsx +0 -211
  138. data/app/assets/javascripts/pages/admin/components/drag_uploader.jsx +0 -174
  139. data/app/assets/javascripts/pages/admin/components/editable_image.jsx +0 -57
  140. data/app/assets/javascripts/pages/admin/components/grid_image.jsx +0 -124
  141. data/app/assets/javascripts/pages/admin/components/image_editor.jsx +0 -496
  142. data/app/assets/javascripts/pages/admin/components/image_grid.jsx +0 -306
  143. data/app/assets/javascripts/pages/admin/components/image_uploader.jsx +0 -176
  144. data/app/assets/javascripts/pages/admin/components/modal_store.jsx +0 -20
  145. data/app/assets/javascripts/pages/admin/components/rich_text_area.jsx +0 -64
  146. data/app/assets/javascripts/pages/admin/components/rich_text_toolbar.jsx +0 -91
  147. data/app/assets/javascripts/pages/admin/components/toast.jsx +0 -34
  148. data/app/assets/javascripts/pages/admin/components/toast_store.jsx +0 -52
  149. data/app/assets/javascripts/pages/admin/components.jsx +0 -2
  150. data/app/assets/javascripts/pages/admin/features/content_tabs.jsx +0 -72
  151. data/app/assets/javascripts/pages/admin/features/edit_page.jsx +0 -97
  152. data/app/assets/javascripts/pages/admin/features/rich_text.jsx +0 -14
  153. data/app/assets/javascripts/pages/admin/features/tag_editor.jsx +0 -160
  154. data/app/assets/javascripts/pages/admin.jsx +0 -17
  155. data/app/assets/javascripts/pages/login_form.jsx +0 -21
  156. data/app/serializers/admin/page_file_serializer.rb +0 -8
  157. data/app/serializers/page_export_serializer.rb +0 -32
  158. data/app/serializers/page_file_export_serializer.rb +0 -6
  159. data/app/serializers/page_image_export_serializer.rb +0 -42
  160. data/app/serializers/page_serializer.rb +0 -23
  161. data/app/views/layouts/admin/_analytics.html.erb +0 -16
  162. data/lib/rails/generators/pages_core/frontend/templates/application.js.erb +0 -15
  163. data/vendor/assets/javascripts/ReactCrop.min.js +0 -1
  164. data/vendor/assets/javascripts/reflux.min.js +0 -1
@@ -1,39 +1,82 @@
1
- var PageTreeActions = Reflux.createActions([
2
- "addChild",
3
- "init",
4
- "movedPage",
5
- "setCSRFToken",
6
- "toggleCollapsed",
7
- "updatePage",
8
- "updateTree"
9
- ]);
10
-
11
- class PageTreeStore extends Reflux.Store {
12
- constructor() {
13
- super();
14
- this.state = { tree: null };
15
- this.listenToMany(PageTreeActions);
1
+ import React from "react";
2
+ import PropTypes from "prop-types";
3
+ import PageTreeDraggable from "./PageTreeDraggable";
4
+ import Tree from "../lib/Tree";
5
+ import { postJson, putJson } from "../lib/request";
6
+
7
+ export default class PageTree extends React.Component {
8
+ constructor(props) {
9
+ super(props);
10
+
11
+ this.state = { tree: this.buildTree(props.pages) };
12
+
13
+ this.addChild = this.addChild.bind(this);
14
+ this.movedPage = this.movedPage.bind(this);
15
+ this.toggleCollapsed = this.toggleCollapsed.bind(this);
16
+ this.updatePage = this.updatePage.bind(this);
17
+ this.updateTree = this.updateTree.bind(this);
16
18
  }
17
19
 
18
- collapsedState() {
19
- if (window && window.localStorage &&
20
- typeof(window.localStorage.collapsedPages) != "undefined") {
21
- return JSON.parse(window.localStorage.collapsedPages);
22
- }
23
- return {};
20
+ addChild(id, attributes) {
21
+ let tree = this.state.tree;
22
+ var index = tree.append(attributes, id);
23
+ this.reorderChildren(id);
24
+ this.setCollapsed(id, false);
25
+ this.createPage(index, attributes);
26
+ this.setState({tree: tree});
27
+ }
28
+
29
+ movedPage(id) {
30
+ let tree = this.state.tree;
31
+ let index = tree.getIndex(id);
32
+ this.reorderChildren(index.parent);
33
+
34
+ let parent = tree.getIndex(index.parent);
35
+ let position = parent.children.indexOf(id) + 1;
36
+
37
+ this.movePage(index, parent, position);
38
+ this.setState({tree: tree});
39
+ }
40
+
41
+ toggleCollapsed(id) {
42
+ let tree = this.state.tree;
43
+ var node = tree.getIndex(id).node;
44
+ this.setCollapsed(id, !node.collapsed);
45
+ this.setState({tree: tree});
46
+ }
47
+
48
+ updatePage(id, attributes) {
49
+ let tree = this.state.tree;
50
+ let index = tree.getIndex(id);
51
+ let url = `/admin/${index.node.locale}/pages/${index.node.id}.json`;
52
+ this.updateNode(index, attributes);
53
+ this.performUpdate(index, url, { page: attributes });
54
+ }
55
+
56
+ updateTree(tree) {
57
+ this.setState({ tree: tree });
24
58
  }
25
59
 
26
60
  applyCollapsed(tree) {
27
- let store = this;
61
+ const depth = (t, index) => {
62
+ var depth = 0;
63
+ let pointer = t.getIndex(index.parent);
64
+ while (pointer) {
65
+ depth += 1;
66
+ pointer = t.getIndex(pointer.parent);
67
+ }
68
+ return depth;
69
+ };
70
+
28
71
  let collapsedState = this.collapsedState();
29
72
  let walk = function (id) {
30
73
  var index = tree.getIndex(id);
31
74
  var node = index.node;
32
- if (collapsedState.hasOwnProperty(node.id)) {
75
+ if (Object.prototype.hasOwnProperty.call(collapsedState, node.id)) {
33
76
  node.collapsed = collapsedState[node.id];
34
77
  } else if (node.news_page) {
35
78
  node.collapsed = true;
36
- } else if (store.depth(tree, index) > 1) {
79
+ } else if (depth(tree, index) > 1) {
37
80
  node.collapsed = true;
38
81
  }
39
82
  if (index.children && index.children.length) {
@@ -43,21 +86,37 @@ class PageTreeStore extends Reflux.Store {
43
86
  walk(1);
44
87
  }
45
88
 
46
- depth(tree, index) {
47
- var depth = 0;
48
- var pointer = index;
49
- while (pointer = tree.getIndex(pointer.parent)) {
50
- depth += 1;
89
+ collapsedState() {
90
+ if (window && window.localStorage &&
91
+ typeof(window.localStorage.collapsedPages) != "undefined") {
92
+ return JSON.parse(window.localStorage.collapsedPages);
51
93
  }
52
- return depth;
94
+ return {};
53
95
  }
54
96
 
55
97
  createPage(index, attributes) {
56
- let store = this;
57
- let url = `/admin/${index.node.locale}/pages.json`;
58
- $.post(url, { page: attributes }, function (response) {
59
- store.updateNode(index, response);
60
- });
98
+ postJson(`/admin/${index.node.locale}/pages.json`, { page: attributes })
99
+ .then(response => this.updateNode(index, response));
100
+ }
101
+
102
+ buildTree(pages) {
103
+ // Build tree
104
+ let parentMap = pages.reduce((m, page) => {
105
+ let id = page.parent_page_id;
106
+ m[id] = [...(m[id] || []), page];
107
+ return m;
108
+ }, {});
109
+
110
+ pages.forEach((p) => p.children = parentMap[p.id] || []);
111
+
112
+ let tree = new Tree({ name: "All Pages",
113
+ locale: this.props.locale,
114
+ permissions: this.props.permissions,
115
+ root: true,
116
+ children: parentMap[null] });
117
+ this.applyCollapsed(tree);
118
+ tree.updateNodesPosition();
119
+ return tree;
61
120
  }
62
121
 
63
122
  movePage(index, parent, position) {
@@ -69,51 +128,19 @@ class PageTreeStore extends Reflux.Store {
69
128
  this.performUpdate(index, url, data);
70
129
  }
71
130
 
72
- updatePage(index, attributes) {
73
- let url = `/admin/${index.node.locale}/pages/${index.node.id}.json`;
74
- this.performUpdate(index, url, { page: attributes });
75
- }
76
-
77
131
  performUpdate(index, url, data) {
78
- let store = this;
79
-
80
- let xhr = new XMLHttpRequest();
81
- xhr.open("PUT", url);
82
- xhr.setRequestHeader("Content-Type","application/json; charset=utf-8");
83
- xhr.setRequestHeader("X-CSRF-Token", this.state.csrf_token);
84
- xhr.addEventListener("load", function () {
85
- if (xhr.readyState == 4 && xhr.status == "200") {
86
- store.updateNode(index, JSON.parse(xhr.responseText));
87
- }
88
- });
89
- xhr.send(JSON.stringify(data));
90
- }
91
-
92
- updateNode(index, attributes) {
93
- for (var attr in attributes) {
94
- if (attributes.hasOwnProperty(attr)) {
95
- index.node[attr] = attributes[attr];
96
- }
97
- }
98
- this.setState({tree: tree});
132
+ putJson(url, data).then(response => this.updateNode(index, response));
99
133
  }
100
134
 
101
- getInitialState() {
102
- return this.state.tree;
103
- }
104
-
105
- setCollapsed(id, value) {
106
- var node = this.state.tree.getIndex(id).node;
107
- node.collapsed = value;
108
- this.storeCollapsed(id, node.collapsed);
109
- this.state.tree.updateNodesPosition();
110
- }
111
-
112
- storeCollapsed(id, newState) {
113
- let node = this.state.tree.getIndex(id).node;
114
- var store = this.collapsedState();
115
- store[node.id] = newState;
116
- window.localStorage.collapsedPages = JSON.stringify(store);
135
+ render() {
136
+ return(
137
+ <PageTreeDraggable tree={this.state.tree}
138
+ addChild={this.addChild}
139
+ movedPage={this.movedPage}
140
+ toggleCollapsed={this.toggleCollapsed}
141
+ updatePage={this.updatePage}
142
+ updateTree={this.updateTree} />
143
+ );
117
144
  }
118
145
 
119
146
  reorderChildren(id) {
@@ -135,69 +162,32 @@ class PageTreeStore extends Reflux.Store {
135
162
  tree.updateNodesPosition();
136
163
  }
137
164
 
138
- onInit(props) {
139
- let pages = props.pages;
140
-
141
- // Build tree
142
- let parentMap = pages.reduce((m, page) => {
143
- let id = page.parent_page_id;
144
- m[id] = [...(m[id] || []), page];
145
- return m;
146
- }, {});
147
-
148
- pages.forEach((p) => p.children = parentMap[p.id] || []);
149
-
150
- tree = new Tree({ name: "All Pages",
151
- locale: props.locale,
152
- permissions: props.permissions,
153
- root: true,
154
- children: parentMap[null] });
155
- this.applyCollapsed(tree);
156
- tree.updateNodesPosition();
157
- this.setState({tree: tree});
158
- }
159
-
160
- onMovedPage(id) {
161
- let tree = this.state.tree;
162
- let index = tree.getIndex(id);
163
- this.reorderChildren(index.parent);
164
-
165
- parent = tree.getIndex(index.parent);
166
- position = parent.children.indexOf(id) + 1;
167
-
168
- this.movePage(index, parent, position);
169
- this.setState({tree: tree});
170
- }
171
-
172
- onAddChild(id, attributes) {
173
- let tree = this.state.tree;
174
- var index = tree.append(attributes, id);
175
- this.reorderChildren(id);
176
- this.setCollapsed(id, false);
177
- this.createPage(index, attributes);
178
- this.setState({tree: tree});
179
- }
180
-
181
- onSetCSRFToken(token) {
182
- this.setState({ csrf_token: token });
183
- }
184
-
185
- onToggleCollapsed(id) {
186
- let tree = this.state.tree;
187
- var node = tree.getIndex(id).node;
188
- this.setCollapsed(id, !node.collapsed);
189
- this.setState({tree: tree});
165
+ setCollapsed(id, value) {
166
+ var node = this.state.tree.getIndex(id).node;
167
+ node.collapsed = value;
168
+ this.storeCollapsed(id, node.collapsed);
169
+ this.state.tree.updateNodesPosition();
190
170
  }
191
171
 
192
- onUpdatePage(id, attributes) {
193
- let tree = this.state.tree;
194
- var index = tree.getIndex(id);
195
- this.updateNode(index, attributes);
196
- this.updatePage(index, attributes);
172
+ storeCollapsed(id, newState) {
173
+ let node = this.state.tree.getIndex(id).node;
174
+ var store = this.collapsedState();
175
+ store[node.id] = newState;
176
+ window.localStorage.collapsedPages = JSON.stringify(store);
197
177
  }
198
178
 
199
- onUpdateTree(newTree) {
200
- tree = newTree;
201
- this.setState({tree: tree});
179
+ updateNode(index, attributes) {
180
+ for (var attr in attributes) {
181
+ if (Object.prototype.hasOwnProperty.call(attributes, attr)) {
182
+ index.node[attr] = attributes[attr];
183
+ }
184
+ }
185
+ this.setState({ tree: this.state.tree });
202
186
  }
203
187
  }
188
+
189
+ PageTree.propTypes = {
190
+ pages: PropTypes.array,
191
+ locale: PropTypes.string,
192
+ permissions: PropTypes.array
193
+ };
@@ -25,18 +25,16 @@
25
25
  SOFTWARE.
26
26
  */
27
27
 
28
- class PageTree extends Reflux.Component {
28
+ import React from "react";
29
+ import PropTypes from "prop-types";
30
+ import PageTreeNode from "./PageTreeNode";
31
+
32
+ export default class PageTreeDraggable extends React.Component {
29
33
  constructor(props) {
30
34
  super(props);
31
35
  this.state = {
32
36
  dragging: this.initDragging()
33
37
  };
34
- this.store = PageTreeStore;
35
- }
36
-
37
- componentDidMount() {
38
- PageTreeActions.setCSRFToken(this.props.csrf_token);
39
- PageTreeActions.init(this.props);
40
38
  }
41
39
 
42
40
  initDragging() {
@@ -52,7 +50,7 @@ class PageTree extends Reflux.Component {
52
50
  }
53
51
 
54
52
  getDraggingDom() {
55
- var tree = this.state.tree;
53
+ var tree = this.props.tree;
56
54
  var dragging = this.state.dragging;
57
55
  if (dragging && dragging.id) {
58
56
  var draggingIndex = tree.getIndex(dragging.id);
@@ -77,7 +75,7 @@ class PageTree extends Reflux.Component {
77
75
  }
78
76
 
79
77
  render() {
80
- var tree = this.state.tree;
78
+ var tree = this.props.tree;
81
79
  var dragging = this.state.dragging;
82
80
 
83
81
  if (!tree) {
@@ -118,19 +116,22 @@ class PageTree extends Reflux.Component {
118
116
  locale: parent.node.locale,
119
117
  parent_page_id: parent.node.id
120
118
  };
121
- PageTreeActions.addChild(parent.id, newNode);
119
+ this.props.addChild(parent.id, newNode);
122
120
  }
123
121
 
124
122
  prevAddButtonCount(tree, index) {
125
- var pointer = index;
126
- var parentNodes = [];
127
- while (pointer = tree.getIndex(pointer.parent)) {
123
+ let count = 0;
124
+ let parentNodes = [];
125
+ let pointer = tree.getIndex(index.parent);
126
+ while (pointer) {
128
127
  parentNodes.push(pointer);
128
+ pointer = tree.getIndex(pointer.parent);
129
129
  }
130
130
 
131
- var pointer = index;
132
- var count = 0;
133
- while (pointer = tree.getNodeByTop(pointer.top - 1)) {
131
+ pointer = index;
132
+
133
+ pointer = tree.getNodeByTop(index.top - 1);
134
+ while (pointer) {
134
135
  if (
135
136
  parentNodes.indexOf(pointer) == -1 &&
136
137
  !pointer.node.collapsed &&
@@ -138,6 +139,7 @@ class PageTree extends Reflux.Component {
138
139
  ) {
139
140
  count += 1;
140
141
  }
142
+ pointer = tree.getNodeByTop(pointer.top - 1);
141
143
  }
142
144
 
143
145
  return count;
@@ -165,7 +167,7 @@ class PageTree extends Reflux.Component {
165
167
  }
166
168
  }
167
169
 
168
- var tree = this.state.tree;
170
+ var tree = this.props.tree;
169
171
  var dragging = this.state.dragging;
170
172
  var paddingLeft = this.props.paddingLeft;
171
173
  var newIndex = null;
@@ -233,10 +235,7 @@ class PageTree extends Reflux.Component {
233
235
  dragging.id = newIndex.id;
234
236
  }
235
237
 
236
- this.setState({
237
- dragging: dragging,
238
- tree: tree
239
- });
238
+ this.setState({ dragging: dragging });
240
239
  }
241
240
 
242
241
  dragStart(id, dom, e) {
@@ -271,8 +270,8 @@ class PageTree extends Reflux.Component {
271
270
 
272
271
  dragEnd() {
273
272
  if (!this._start) {
274
- PageTreeActions.updateTree(this.state.tree);
275
- PageTreeActions.movedPage(this.state.dragging.id);
273
+ this.props.updateTree(this.props.tree);
274
+ this.props.movedPage(this.state.dragging.id);
276
275
  }
277
276
 
278
277
  this.setState({
@@ -284,17 +283,24 @@ class PageTree extends Reflux.Component {
284
283
  }
285
284
 
286
285
  toggleCollapse(nodeId) {
287
- PageTreeActions.toggleCollapsed(nodeId);
286
+ this.props.toggleCollapsed(nodeId);
288
287
  }
289
288
 
290
289
  updatePage(index, attributes) {
291
- PageTreeActions.updatePage(
292
- index.id,
293
- attributes
294
- );
290
+ this.props.updatePage(index.id, attributes);
295
291
  }
296
292
  }
297
293
 
298
- PageTree.defaultProps = {
294
+ PageTreeDraggable.defaultProps = {
299
295
  paddingLeft: 15
300
296
  };
297
+
298
+ PageTreeDraggable.propTypes = {
299
+ tree: PropTypes.object,
300
+ addChild: PropTypes.func,
301
+ movedPage: PropTypes.func,
302
+ toggleCollapsed: PropTypes.func,
303
+ paddingLeft: PropTypes.number,
304
+ updatePage: PropTypes.func,
305
+ updateTree: PropTypes.func,
306
+ };
@@ -25,10 +25,14 @@
25
25
  SOFTWARE.
26
26
  */
27
27
 
28
- class PageTreeNode extends React.Component {
28
+ import React from "react";
29
+ import PropTypes from "prop-types";
30
+
31
+ export default class PageTreeNode extends React.Component {
29
32
  constructor(props) {
30
33
  super(props);
31
34
  this.state = { newName: props.index.node.name };
35
+ this.innerRef = React.createRef();
32
36
  }
33
37
 
34
38
  permitted(action) {
@@ -49,7 +53,7 @@ class PageTreeNode extends React.Component {
49
53
  <span className="actions">
50
54
  <button type="button"
51
55
  className="add"
52
- onClick={e => this.props.addChild(this.props.index)}>
56
+ onClick={() => this.props.addChild(this.props.index)}>
53
57
  <i className="fa fa-plus icon" />
54
58
  Add child
55
59
  </button>
@@ -59,27 +63,27 @@ class PageTreeNode extends React.Component {
59
63
  return (
60
64
  <span className="actions">
61
65
  {this.permitted("edit") && this.button(statusLabel, {
62
- className: "toggle-status",
63
- icon: statusIcon,
64
- onClick: e => this.toggleStatus()
66
+ className: "toggle-status",
67
+ icon: statusIcon,
68
+ onClick: () => this.toggleStatus()
65
69
  })}
66
70
 
67
71
  {this.permitted("edit") && this.button("Rename", {
68
- className: "edit",
69
- icon: "pencil",
70
- onClick: e => this.edit()
72
+ className: "edit",
73
+ icon: "pencil",
74
+ onClick: () => this.edit()
71
75
  })}
72
76
 
73
77
  {this.permitted("edit") && this.button("Delete", {
74
- className: "delete",
75
- icon: "trash",
76
- onClick: e => this.deletePage()
78
+ className: "delete",
79
+ icon: "trash",
80
+ onClick: () => this.deletePage()
77
81
  })}
78
82
 
79
83
  {this.permitted("create") && this.button("Add child", {
80
- className: "add",
81
- icon: "plus",
82
- onClick: e => this.props.addChild(this.props.index)
84
+ className: "add",
85
+ icon: "plus",
86
+ onClick: () => this.props.addChild(this.props.index)
83
87
  })}
84
88
  </span>
85
89
  );
@@ -89,7 +93,7 @@ class PageTreeNode extends React.Component {
89
93
  addButton() {
90
94
  let self = this;
91
95
  let node = this.node();
92
- let handleClick = function (e) {
96
+ let handleClick = function () {
93
97
  if (self.props.addChild) {
94
98
  self.props.addChild(self.props.index);
95
99
  }
@@ -251,14 +255,16 @@ class PageTreeNode extends React.Component {
251
255
 
252
256
  let handleMouseDown = function (e) {
253
257
  if (self.permitted("edit") && !editing && props.onDragStart) {
254
- props.onDragStart(props.index.id, self.refs.inner, e);
258
+ props.onDragStart(props.index.id, self.innerRef.current, e);
255
259
  }
256
260
  };
257
261
 
258
262
  if (this.node().status != 4) {
259
263
  return (
260
264
  <div className={classnames}>
261
- <div className="inner" ref="inner" onMouseDown={handleMouseDown}>
265
+ <div className="inner"
266
+ ref={this.innerRef}
267
+ onMouseDown={handleMouseDown}>
262
268
  {this.collapseArrow()}
263
269
  {node}
264
270
  </div>
@@ -286,7 +292,7 @@ class PageTreeNode extends React.Component {
286
292
  });
287
293
  };
288
294
 
289
- let cancelEdit = function(e) {
295
+ let cancelEdit = function() {
290
296
  self.setState({newName: self.node().name});
291
297
  self.updatePage({editing: false});
292
298
  };
@@ -298,7 +304,6 @@ class PageTreeNode extends React.Component {
298
304
  <input type="text"
299
305
  value={this.state.newName}
300
306
  autoFocus
301
- ref="nameInput"
302
307
  onChange={handleNameChange} />
303
308
  <button className="save" type="submit">
304
309
  <i className="fa fa-cloud icon"></i>
@@ -315,7 +320,6 @@ class PageTreeNode extends React.Component {
315
320
  }
316
321
 
317
322
  renderNode() {
318
- let self = this;
319
323
  let index = this.props.index;
320
324
  let node = index.node;
321
325
 
@@ -394,3 +398,14 @@ class PageTreeNode extends React.Component {
394
398
  }
395
399
  }
396
400
  }
401
+
402
+ PageTreeNode.propTypes = {
403
+ addChild: PropTypes.func,
404
+ dragging: PropTypes.number,
405
+ index: PropTypes.object,
406
+ onCollapse: PropTypes.func,
407
+ onDragStart: PropTypes.func,
408
+ paddingLeft: PropTypes.number,
409
+ tree: PropTypes.object,
410
+ updatePage: PropTypes.func
411
+ };