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.
- checksums.yaml +4 -4
- data/README.md +1 -2
- data/app/assets/builds/pages_core/admin-dist.js +55 -0
- data/app/assets/stylesheets/pages/admin/components/image_editor.scss +1 -0
- data/app/assets/stylesheets/pages/admin/components/image_grid.scss +33 -5
- data/app/assets/stylesheets/pages/admin/components/layout.scss +2 -1
- data/app/assets/stylesheets/pages/admin/components/login.scss +6 -0
- data/app/assets/stylesheets/pages/admin/components/tabs.scss +5 -0
- data/app/assets/stylesheets/pages/admin/components/tag_editor.scss +13 -7
- data/app/assets/stylesheets/pages/admin/controllers/pages.scss +13 -5
- data/app/assets/stylesheets/pages/admin.scss +0 -1
- data/app/controller_dummies/admin/admin_controller.rb +1 -1
- data/app/controller_dummies/application_controller.rb +1 -1
- data/app/controller_dummies/attachments_controller.rb +1 -1
- data/app/controller_dummies/frontend_controller.rb +1 -1
- data/app/controller_dummies/images_controller.rb +1 -1
- data/app/controller_dummies/page_files_controller.rb +1 -1
- data/app/controller_dummies/pages_controller.rb +1 -1
- data/app/controller_dummies/sitemaps_controller.rb +1 -1
- data/app/controllers/admin/attachments_controller.rb +1 -1
- data/app/controllers/admin/images_controller.rb +10 -7
- data/app/controllers/concerns/pages_core/authentication.rb +9 -4
- data/app/controllers/concerns/pages_core/preview_pages_controller.rb +5 -0
- data/app/controllers/pages_core/frontend/pages_controller.rb +5 -2
- data/app/controllers/sessions_controller.rb +1 -1
- data/app/formatters/pages_core/link_renderer.rb +2 -2
- data/app/helpers/application_helper.rb +1 -1
- data/app/helpers/frontend_helper.rb +1 -1
- data/app/helpers/pages_core/admin/content_tabs_helper.rb +5 -2
- data/app/helpers/pages_core/admin/image_uploads_helper.rb +2 -3
- data/app/helpers/pages_core/admin/tag_editor_helper.rb +9 -39
- data/app/helpers/pages_core/head_tags_helper.rb +11 -20
- data/app/helpers/pages_core/open_graph_tags_helper.rb +1 -1
- data/app/javascript/admin-dist.js +2 -0
- data/app/javascript/components/Attachments/Attachment.jsx +121 -0
- data/app/javascript/components/Attachments/AttachmentEditor.jsx +116 -0
- data/app/javascript/components/Attachments/Placeholder.jsx +10 -0
- data/app/javascript/components/Attachments.jsx +165 -0
- data/app/{assets/javascripts/pages/admin/components/date_range_select.jsx → javascript/components/DateRangeSelect.jsx} +16 -5
- data/app/javascript/components/EditableImage.jsx +61 -0
- data/app/{assets/javascripts/pages/admin/components/file_upload_button.jsx → javascript/components/FileUploadButton.jsx} +11 -1
- data/app/{assets/javascripts/pages/admin/components/focal_point.jsx → javascript/components/ImageCropper/FocalPoint.jsx} +12 -1
- data/app/javascript/components/ImageCropper/Image.jsx +65 -0
- data/app/javascript/components/ImageCropper/Toolbar.jsx +73 -0
- data/app/javascript/components/ImageCropper/useCrop.js +199 -0
- data/app/javascript/components/ImageCropper.jsx +90 -0
- data/app/javascript/components/ImageEditor/Form.jsx +98 -0
- data/app/javascript/components/ImageEditor.jsx +62 -0
- data/app/javascript/components/ImageGrid/DragElement.jsx +30 -0
- data/app/javascript/components/ImageGrid/FilePlaceholder.jsx +9 -0
- data/app/javascript/components/ImageGrid/GridImage.jsx +103 -0
- data/app/javascript/components/ImageGrid/Placeholder.jsx +23 -0
- data/app/javascript/components/ImageGrid.jsx +257 -0
- data/app/javascript/components/ImageUploader.jsx +171 -0
- data/app/{assets/javascripts/pages/admin/components/modal.jsx → javascript/components/Modal.jsx} +13 -2
- data/app/javascript/components/ModalStore.jsx +12 -0
- data/app/{assets/javascripts/pages/admin/components/page_dates.jsx → javascript/components/PageDates.jsx} +11 -1
- data/app/{assets/javascripts/pages/admin/components/page_files.jsx → javascript/components/PageFiles.jsx} +11 -2
- data/app/{assets/javascripts/pages/admin/components/page_images.jsx → javascript/components/PageImages.jsx} +11 -2
- data/app/{assets/javascripts/pages/admin/components/page_tree_store.jsx → javascript/components/PageTree.jsx} +127 -137
- data/app/{assets/javascripts/pages/admin/components/page_tree.jsx → javascript/components/PageTreeDraggable.jsx} +35 -29
- data/app/{assets/javascripts/pages/admin/components/page_tree_node.jsx → javascript/components/PageTreeNode.jsx} +35 -20
- data/app/javascript/components/RichTextArea.jsx +213 -0
- data/app/javascript/components/RichTextToolbarButton.jsx +20 -0
- data/app/javascript/components/TagEditor/AddTagForm.jsx +42 -0
- data/app/javascript/components/TagEditor/Tag.jsx +32 -0
- data/app/javascript/components/TagEditor.jsx +61 -0
- data/app/javascript/components/Toast.jsx +72 -0
- data/app/javascript/components/ToastStore.jsx +14 -0
- data/app/javascript/components/drag/draggedOrder.js +51 -0
- data/app/javascript/components/drag/useDragCollection.js +84 -0
- data/app/javascript/components/drag/useDragUploader.js +112 -0
- data/app/javascript/components/drag/useDraggable.js +17 -0
- data/app/javascript/components/drag.js +6 -0
- data/app/javascript/components.js +14 -0
- data/app/javascript/controllers/EditPageController.js +20 -0
- data/app/javascript/controllers/LoginController.js +29 -0
- data/app/javascript/controllers/MainController.js +65 -0
- data/app/javascript/controllers/PageOptionsController.js +62 -0
- data/app/javascript/features/RichText.jsx +34 -0
- data/app/javascript/hooks.js +2 -0
- data/app/javascript/index.js +33 -0
- data/app/{assets/javascripts/pages/admin/lib/tree.jsx → javascript/lib/Tree.js} +55 -54
- data/app/javascript/lib/copyToClipboard.js +13 -0
- data/app/javascript/lib/readyHandler.js +22 -0
- data/app/javascript/lib/request.js +36 -0
- data/app/models/concerns/pages_core/page_model/images.rb +3 -1
- data/app/models/concerns/pages_core/page_model/searchable.rb +19 -0
- data/app/models/concerns/pages_core/searchable_document.rb +71 -0
- data/app/models/concerns/pages_core/taggable.rb +27 -12
- data/app/models/page.rb +2 -0
- data/app/models/page_exporter.rb +2 -2
- data/app/models/page_image.rb +0 -2
- data/app/models/role.rb +1 -1
- data/app/models/search_document.rb +72 -0
- data/app/models/tag.rb +1 -0
- data/app/models/user.rb +1 -1
- data/app/{serializers/admin/attachment_serializer.rb → resources/admin/attachment_resource.rb} +6 -5
- data/app/{serializers/admin/image_serializer.rb → resources/admin/image_resource.rb} +9 -9
- data/app/resources/admin/page_file_resource.rb +10 -0
- data/app/{serializers/admin/page_image_serializer.rb → resources/admin/page_image_resource.rb} +4 -2
- data/app/resources/export/attachment_resource.rb +10 -0
- data/app/resources/export/page_image_resource.rb +45 -0
- data/app/resources/export/page_resource.rb +42 -0
- data/app/{serializers/page_image_serializer.rb → resources/page_image_resource.rb} +8 -16
- data/app/resources/page_resource.rb +33 -0
- data/app/services/pages_core/destroy_invite_service.rb +2 -2
- data/app/services/pages_core/invite_service.rb +2 -2
- data/app/views/admin/pages/_edit_content.html.erb +1 -1
- data/app/views/admin/pages/_edit_files.html.erb +1 -5
- data/app/views/admin/pages/_edit_images.html.erb +1 -5
- data/app/views/admin/pages/_edit_options.html.erb +74 -55
- data/app/views/admin/pages/_form.html.erb +19 -0
- data/app/views/admin/pages/edit.html.erb +35 -61
- data/app/views/admin/pages/index.html.erb +0 -1
- data/app/views/admin/pages/new.html.erb +32 -32
- data/app/views/admin/users/_access_control.html.erb +5 -1
- data/app/views/admin/users/login.html.erb +12 -4
- data/app/views/feeds/pages.rss.builder +1 -2
- data/app/views/layouts/admin/_header.html.erb +1 -1
- data/app/views/layouts/admin/_page_header.html.erb +33 -0
- data/app/views/layouts/admin.html.erb +23 -42
- data/app/views/pages_core/_google_analytics.html.erb +8 -0
- data/db/migrate/20180625154059_enable_search_extensions.rb +10 -0
- data/db/migrate/20210209151400_create_search_configurations.rb +35 -0
- data/db/migrate/20210210235200_create_search_documents.rb +74 -0
- data/lib/pages_core/engine.rb +1 -5
- data/lib/pages_core/templates/block_configuration.rb +1 -1
- data/lib/pages_core/templates/configuration_handler.rb +1 -1
- data/lib/pages_core/version.rb +1 -1
- data/lib/pages_core.rb +3 -5
- data/lib/rails/generators/pages_core/frontend/frontend_generator.rb +0 -7
- data/lib/rails/generators/pages_core/install/templates/page_templates_initializer.rb +2 -2
- metadata +101 -115
- data/app/assets/javascripts/pages/admin/components/attachment.jsx +0 -130
- data/app/assets/javascripts/pages/admin/components/attachment_editor.jsx +0 -131
- data/app/assets/javascripts/pages/admin/components/attachments.jsx +0 -211
- data/app/assets/javascripts/pages/admin/components/drag_uploader.jsx +0 -174
- data/app/assets/javascripts/pages/admin/components/editable_image.jsx +0 -57
- data/app/assets/javascripts/pages/admin/components/grid_image.jsx +0 -124
- data/app/assets/javascripts/pages/admin/components/image_editor.jsx +0 -496
- data/app/assets/javascripts/pages/admin/components/image_grid.jsx +0 -306
- data/app/assets/javascripts/pages/admin/components/image_uploader.jsx +0 -176
- data/app/assets/javascripts/pages/admin/components/modal_store.jsx +0 -20
- data/app/assets/javascripts/pages/admin/components/rich_text_area.jsx +0 -64
- data/app/assets/javascripts/pages/admin/components/rich_text_toolbar.jsx +0 -91
- data/app/assets/javascripts/pages/admin/components/toast.jsx +0 -34
- data/app/assets/javascripts/pages/admin/components/toast_store.jsx +0 -52
- data/app/assets/javascripts/pages/admin/components.jsx +0 -2
- data/app/assets/javascripts/pages/admin/features/content_tabs.jsx +0 -72
- data/app/assets/javascripts/pages/admin/features/edit_page.jsx +0 -97
- data/app/assets/javascripts/pages/admin/features/rich_text.jsx +0 -14
- data/app/assets/javascripts/pages/admin/features/tag_editor.jsx +0 -160
- data/app/assets/javascripts/pages/admin.jsx +0 -17
- data/app/assets/javascripts/pages/login_form.jsx +0 -21
- data/app/serializers/admin/page_file_serializer.rb +0 -8
- data/app/serializers/page_export_serializer.rb +0 -32
- data/app/serializers/page_file_export_serializer.rb +0 -6
- data/app/serializers/page_image_export_serializer.rb +0 -42
- data/app/serializers/page_serializer.rb +0 -23
- data/app/views/layouts/admin/_analytics.html.erb +0 -16
- data/lib/rails/generators/pages_core/frontend/templates/application.js.erb +0 -15
- data/vendor/assets/javascripts/ReactCrop.min.js +0 -1
- data/vendor/assets/javascripts/reflux.min.js +0 -1
|
@@ -1,39 +1,82 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
this.
|
|
15
|
-
this.
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
-
|
|
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 (
|
|
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 (
|
|
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
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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
|
|
94
|
+
return {};
|
|
53
95
|
}
|
|
54
96
|
|
|
55
97
|
createPage(index, attributes) {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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
|
-
|
|
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
|
-
|
|
102
|
-
return
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
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
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
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
|
-
|
|
193
|
-
let
|
|
194
|
-
var
|
|
195
|
-
|
|
196
|
-
|
|
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
|
-
|
|
200
|
-
|
|
201
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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
|
-
|
|
119
|
+
this.props.addChild(parent.id, newNode);
|
|
122
120
|
}
|
|
123
121
|
|
|
124
122
|
prevAddButtonCount(tree, index) {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
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
|
-
|
|
132
|
-
|
|
133
|
-
|
|
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.
|
|
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
|
-
|
|
275
|
-
|
|
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
|
-
|
|
286
|
+
this.props.toggleCollapsed(nodeId);
|
|
288
287
|
}
|
|
289
288
|
|
|
290
289
|
updatePage(index, attributes) {
|
|
291
|
-
|
|
292
|
-
index.id,
|
|
293
|
-
attributes
|
|
294
|
-
);
|
|
290
|
+
this.props.updatePage(index.id, attributes);
|
|
295
291
|
}
|
|
296
292
|
}
|
|
297
293
|
|
|
298
|
-
|
|
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
|
-
|
|
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={
|
|
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
|
-
|
|
63
|
-
|
|
64
|
-
|
|
66
|
+
className: "toggle-status",
|
|
67
|
+
icon: statusIcon,
|
|
68
|
+
onClick: () => this.toggleStatus()
|
|
65
69
|
})}
|
|
66
70
|
|
|
67
71
|
{this.permitted("edit") && this.button("Rename", {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
72
|
+
className: "edit",
|
|
73
|
+
icon: "pencil",
|
|
74
|
+
onClick: () => this.edit()
|
|
71
75
|
})}
|
|
72
76
|
|
|
73
77
|
{this.permitted("edit") && this.button("Delete", {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
78
|
+
className: "delete",
|
|
79
|
+
icon: "trash",
|
|
80
|
+
onClick: () => this.deletePage()
|
|
77
81
|
})}
|
|
78
82
|
|
|
79
83
|
{this.permitted("create") && this.button("Add child", {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
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 (
|
|
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.
|
|
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"
|
|
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(
|
|
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
|
+
};
|