pages_core 3.12.0 → 3.12.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/app/assets/builds/fonts/661557ef.ttf +0 -0
- data/app/assets/builds/fonts/a18fc2d2.woff2 +0 -0
- data/app/assets/builds/fonts/b2c7b78f.woff2 +0 -0
- data/app/assets/builds/fonts/ceddc204.ttf +0 -0
- data/app/assets/builds/pages_core/admin-dist.js +60 -14
- data/app/assets/builds/pages_core/admin-dist.js.map +7 -0
- data/app/assets/builds/pages_core/admin.css +9272 -0
- data/app/assets/images/pages/admin/angle-down-solid.svg +1 -0
- data/app/assets/images/pages/admin/icon.svg +1 -0
- data/app/assets/stylesheets/pages_core/admin/components/archive.css +6 -0
- data/app/assets/stylesheets/{pages/admin/components/attachments.scss → pages_core/admin/components/attachments.css} +35 -28
- data/app/assets/stylesheets/{pages/admin.scss → pages_core/admin/components/base.css} +125 -123
- data/app/assets/stylesheets/pages_core/admin/components/forms.css +223 -0
- data/app/assets/stylesheets/{pages/admin/components/header.scss → pages_core/admin/components/header.css} +76 -46
- data/app/assets/stylesheets/{pages/admin/components/image_editor.scss → pages_core/admin/components/image_editor.css} +42 -31
- data/app/assets/stylesheets/{pages/admin/components/image_grid.scss → pages_core/admin/components/image_grid.css} +76 -64
- data/app/assets/stylesheets/{pages/admin/components/image_uploader.scss → pages_core/admin/components/image_uploader.css} +12 -12
- data/app/assets/stylesheets/{pages/admin/components/layout.scss → pages_core/admin/components/layout.css} +13 -9
- data/app/assets/stylesheets/pages_core/admin/components/links.css +40 -0
- data/app/assets/stylesheets/pages_core/admin/components/list_table.css +66 -0
- data/app/assets/stylesheets/{pages/admin/components/login.scss → pages_core/admin/components/login.css} +6 -5
- data/app/assets/stylesheets/{pages/admin/components/modal.scss → pages_core/admin/components/modal.css} +10 -12
- data/app/assets/stylesheets/{pages/admin/components/page_tree.scss → pages_core/admin/components/page_tree.css} +54 -55
- data/app/assets/stylesheets/{pages/admin/components/pagination.scss → pages_core/admin/components/pagination.css} +17 -17
- data/app/assets/stylesheets/pages_core/admin/components/search.css +27 -0
- data/app/assets/stylesheets/{pages/admin/components/sidebar.scss → pages_core/admin/components/sidebar.css} +8 -7
- data/app/assets/stylesheets/{pages/admin/components/tag_editor.scss → pages_core/admin/components/tag_editor.css} +10 -15
- data/app/assets/stylesheets/{pages/admin/components/textarea.scss → pages_core/admin/components/textarea.css} +1 -1
- data/app/assets/stylesheets/{pages/admin/components/toast.scss → pages_core/admin/components/toast.css} +5 -3
- data/app/assets/stylesheets/{pages/admin/components/toolbar.scss → pages_core/admin/components/toolbar.css} +56 -29
- data/app/assets/stylesheets/{pages/admin/controllers/pages.scss → pages_core/admin/controllers/pages.css} +69 -52
- data/app/assets/stylesheets/pages_core/admin/controllers/users.css +3 -0
- data/app/assets/stylesheets/pages_core/admin/vars.css +34 -0
- data/app/assets/stylesheets/pages_core/admin.postcss.css +9 -0
- data/app/controllers/admin/pages_controller.rb +12 -11
- data/app/controllers/concerns/pages_core/rss_controller.rb +17 -1
- data/app/controllers/pages_core/admin_controller.rb +6 -0
- data/app/controllers/pages_core/frontend/pages_controller.rb +9 -5
- data/app/controllers/pages_core/sitemaps_controller.rb +3 -5
- data/app/formatters/pages_core/image_embedder.rb +5 -27
- data/app/helpers/admin/calendars_helper.rb +8 -0
- data/app/helpers/admin/news_helper.rb +13 -0
- data/app/helpers/admin/pages_helper.rb +32 -0
- data/app/helpers/pages_core/admin/admin_helper.rb +11 -54
- data/app/helpers/pages_core/admin/deprecated_admin_helper.rb +40 -0
- data/app/helpers/pages_core/images_helper.rb +37 -0
- data/app/javascript/admin-dist.ts +2 -0
- data/app/javascript/components/Attachments/{Attachment.jsx → Attachment.tsx} +44 -35
- data/app/javascript/components/Attachments/{AttachmentEditor.jsx → AttachmentEditor.tsx} +23 -23
- data/app/javascript/components/{EditableImage.jsx → EditableImage.tsx} +28 -25
- data/app/javascript/components/{FileUploadButton.jsx → FileUploadButton.tsx} +15 -16
- data/app/javascript/components/ImageCropper/FocalPoint.tsx +94 -0
- data/app/javascript/components/ImageCropper/{Image.jsx → Image.tsx} +13 -14
- data/app/javascript/components/ImageCropper/{Toolbar.jsx → Toolbar.tsx} +19 -15
- data/app/javascript/components/ImageCropper/{useCrop.js → useCrop.ts} +80 -37
- data/app/javascript/components/{ImageCropper.jsx → ImageCropper.tsx} +17 -15
- data/app/javascript/components/ImageEditor/{Form.jsx → Form.tsx} +24 -23
- data/app/javascript/components/{ImageEditor.jsx → ImageEditor.tsx} +17 -15
- data/app/javascript/components/ImageGrid/{DragElement.jsx → DragElement.tsx} +12 -10
- data/app/javascript/components/ImageGrid/{GridImage.jsx → GridImage.tsx} +40 -30
- data/app/javascript/components/ImageGrid/{Placeholder.jsx → Placeholder.tsx} +5 -6
- data/app/javascript/components/ImageGrid.jsx +3 -4
- data/app/javascript/components/{ImageUploader.jsx → ImageUploader.tsx} +46 -41
- data/app/javascript/components/Modal.tsx +48 -0
- data/app/javascript/components/PageImages.tsx +28 -0
- data/app/javascript/components/{PageTreeDraggable.jsx → PageTree/Draggable.tsx} +79 -57
- data/app/javascript/components/{PageTreeNode.jsx → PageTree/Node.tsx} +86 -77
- data/app/javascript/components/PageTree/types.ts +15 -0
- data/app/javascript/components/PageTree.tsx +206 -0
- data/app/javascript/components/RichTextToolbarButton.tsx +17 -0
- data/app/javascript/components/TagEditor/{AddTagForm.jsx → AddTagForm.tsx} +9 -10
- data/app/javascript/components/TagEditor/{Tag.jsx → Tag.tsx} +8 -9
- data/app/javascript/components/{TagEditor.jsx → TagEditor.tsx} +12 -13
- data/app/javascript/components/Toast.tsx +61 -0
- data/app/javascript/components/drag/{draggedOrder.js → draggedOrder.ts} +22 -12
- data/app/javascript/components/drag/types.ts +28 -0
- data/app/javascript/components/drag/{useDragCollection.js → useDragCollection.ts} +40 -22
- data/app/javascript/components/drag/{useDragUploader.js → useDragUploader.ts} +34 -25
- data/app/javascript/components/drag/useDraggable.ts +21 -0
- data/app/javascript/components/{drag.js → drag.ts} +1 -0
- data/app/javascript/controllers/{EditPageController.js → EditPageController.ts} +3 -1
- data/app/javascript/controllers/{LoginController.js → LoginController.ts} +7 -3
- data/app/javascript/controllers/{MainController.js → MainController.ts} +19 -14
- data/app/javascript/{index.js → index.ts} +8 -7
- data/app/javascript/lib/{Tree.js → Tree.ts} +106 -85
- data/app/javascript/lib/{copyToClipboard.js → copyToClipboard.ts} +1 -1
- data/app/javascript/lib/{readyHandler.js → readyHandler.ts} +4 -2
- data/app/javascript/lib/{request.js → request.ts} +11 -5
- data/app/javascript/stores/useModalStore.ts +15 -0
- data/app/javascript/stores/useToastStore.ts +26 -0
- data/app/javascript/stores.ts +2 -0
- data/app/javascript/types.ts +30 -0
- data/app/mailers/admin_mailer.rb +1 -0
- data/app/models/invite.rb +8 -0
- data/app/policies/page_policy.rb +4 -0
- data/app/views/admin/calendars/_sidebar.html.erb +50 -0
- data/app/views/admin/calendars/show.html.erb +15 -53
- data/app/views/admin/invites/new.html.erb +2 -8
- data/app/views/admin/invites/show.html.erb +2 -4
- data/app/views/admin/news/_sidebar.html.erb +51 -0
- data/app/views/admin/news/index.html.erb +21 -56
- data/app/views/admin/pages/_list_item.html.erb +4 -22
- data/app/views/admin/pages/_search_bar.html.erb +12 -0
- data/app/views/admin/pages/deleted.html.erb +10 -8
- data/app/views/admin/pages/edit.html.erb +20 -11
- data/app/views/admin/pages/index.html.erb +10 -8
- data/app/views/admin/pages/new.html.erb +10 -14
- data/app/views/admin/pages/search.html.erb +54 -0
- data/app/views/admin/password_resets/show.html.erb +3 -5
- data/app/views/admin/users/deactivated.html.erb +6 -7
- data/app/views/admin/users/edit.html.erb +7 -9
- data/app/views/admin/users/index.html.erb +3 -6
- data/app/views/admin/users/login.html.erb +4 -5
- data/app/views/admin/users/new.html.erb +2 -4
- data/app/views/admin/users/new_password.html.erb +4 -5
- data/app/views/admin/users/show.html.erb +11 -9
- data/app/views/errors/401.html.erb +2 -1
- data/app/views/errors/403.html.erb +2 -1
- data/app/views/errors/404.html.erb +1 -3
- data/app/views/errors/405.html.erb +2 -1
- data/app/views/errors/422.html.erb +2 -1
- data/app/views/errors/500.html.erb +2 -3
- data/app/views/feeds/pages.rss.builder +3 -9
- data/app/views/layouts/admin/_header.html.erb +1 -2
- data/app/views/layouts/admin/_page_header.html.erb +4 -4
- data/app/views/layouts/admin.html.erb +3 -3
- data/app/views/layouts/errors.html.erb +127 -4
- data/config/routes.rb +1 -0
- data/lib/pages_core/configuration/pages.rb +0 -1
- data/lib/pages_core/engine.rb +4 -3
- data/lib/pages_core.rb +0 -1
- data/lib/rails/generators/pages_core/frontend/frontend_generator.rb +33 -17
- data/lib/rails/generators/pages_core/frontend/templates/application.html.erb +0 -1
- data/lib/rails/generators/pages_core/frontend/templates/javascript/lib/gridOverlay.ts +40 -0
- data/lib/rails/generators/pages_core/frontend/templates/javascript/lib/responsiveEmbeds.ts +68 -0
- data/lib/rails/generators/pages_core/frontend/templates/postcss.config.js +17 -0
- data/lib/rails/generators/pages_core/frontend/templates/stylesheets/application.postcss.css +4 -0
- data/lib/rails/generators/pages_core/frontend/templates/stylesheets/components/base.css +24 -0
- data/lib/rails/generators/pages_core/frontend/templates/stylesheets/components/layout.css +21 -0
- data/lib/rails/generators/pages_core/frontend/templates/stylesheets/config.css +5 -0
- data/lib/rails/generators/pages_core/frontend/templates/stylesheets/global/animation.css +5 -0
- data/lib/rails/generators/pages_core/frontend/templates/stylesheets/global/colors.css +18 -0
- data/lib/rails/generators/pages_core/frontend/templates/stylesheets/global/fonts.css +6 -0
- data/lib/rails/generators/pages_core/frontend/templates/stylesheets/global/grid.css +65 -0
- data/lib/rails/generators/pages_core/frontend/templates/stylesheets/global/typography.css +131 -0
- data/lib/rails/generators/pages_core/install/templates/pages_initializer.rb +0 -3
- metadata +104 -255
- data/app/assets/images/pages/admin/icon.png +0 -0
- data/app/assets/images/pages/admin/image-editor-bg.png +0 -0
- data/app/assets/images/pages/admin/list-table-pin-blue.gif +0 -0
- data/app/assets/images/pages/admin/list-table-pin-disabled.gif +0 -0
- data/app/assets/images/pages/admin/list-table-pin-green.gif +0 -0
- data/app/assets/images/pages/admin/list-table-pin-red.gif +0 -0
- data/app/assets/images/pages/admin/list-table-pin-yellow.gif +0 -0
- data/app/assets/images/pages/admin/loading-modal.gif +0 -0
- data/app/assets/images/pages/feed-icon-14x14.png +0 -0
- data/app/assets/stylesheets/pages/admin/components/archive.scss +0 -6
- data/app/assets/stylesheets/pages/admin/components/buttons.scss +0 -23
- data/app/assets/stylesheets/pages/admin/components/forms.scss +0 -169
- data/app/assets/stylesheets/pages/admin/components/links.scss +0 -43
- data/app/assets/stylesheets/pages/admin/components/list_table.scss +0 -61
- data/app/assets/stylesheets/pages/admin/controllers/users.scss +0 -3
- data/app/assets/stylesheets/pages/admin/mixins/breakpoints.scss +0 -21
- data/app/assets/stylesheets/pages/admin/mixins/clearfix.scss +0 -7
- data/app/assets/stylesheets/pages/admin/mixins/gradients.scss +0 -7
- data/app/assets/stylesheets/pages/admin/vars.scss +0 -30
- data/app/assets/stylesheets/pages/errors.css +0 -128
- data/app/javascript/admin-dist.js +0 -2
- data/app/javascript/components/ImageCropper/FocalPoint.jsx +0 -93
- data/app/javascript/components/Modal.jsx +0 -59
- data/app/javascript/components/PageImages.jsx +0 -25
- data/app/javascript/components/PageTree.jsx +0 -196
- data/app/javascript/components/RichTextToolbarButton.jsx +0 -20
- data/app/javascript/components/Toast.jsx +0 -72
- data/app/javascript/components/drag/useDraggable.js +0 -17
- data/app/javascript/stores/ModalStore.jsx +0 -12
- data/app/javascript/stores/ToastStore.jsx +0 -14
- data/app/javascript/stores.js +0 -2
- data/lib/rails/generators/pages_core/frontend/templates/javascript/lib/GridOverlay.js +0 -66
- data/lib/rails/generators/pages_core/frontend/templates/javascript/lib/ResponsiveEmbeds.js +0 -72
- data/lib/rails/generators/pages_core/frontend/templates/stylesheets/application.sass.scss +0 -15
- data/lib/rails/generators/pages_core/frontend/templates/stylesheets/components/base.scss +0 -12
- data/lib/rails/generators/pages_core/frontend/templates/stylesheets/config.scss +0 -26
- data/lib/rails/generators/pages_core/frontend/templates/stylesheets/framework/breakpoints.scss +0 -42
- data/lib/rails/generators/pages_core/frontend/templates/stylesheets/framework/clearfix.scss +0 -7
- data/lib/rails/generators/pages_core/frontend/templates/stylesheets/framework/fonts.scss +0 -32
- data/lib/rails/generators/pages_core/frontend/templates/stylesheets/framework/grid.scss +0 -168
- data/lib/rails/generators/pages_core/frontend/templates/stylesheets/framework/grid_overlay.scss +0 -44
- data/lib/rails/generators/pages_core/frontend/templates/stylesheets/global/colors.scss +0 -8
- data/lib/rails/generators/pages_core/frontend/templates/stylesheets/global/typography.scss +0 -90
- data/lib/rails/generators/pages_core/frontend/templates/stylesheets/vendor/normalize.css +0 -349
- data/vendor/assets/stylesheets/ReactCrop.css +0 -167
- /data/app/assets/stylesheets/{pages/admin/components/tabs.scss → pages_core/admin/components/tabs.css} +0 -0
- /data/app/javascript/components/Attachments/{Placeholder.jsx → Placeholder.tsx} +0 -0
- /data/app/javascript/components/ImageGrid/{FilePlaceholder.jsx → FilePlaceholder.tsx} +0 -0
- /data/app/javascript/{components.js → components.ts} +0 -0
- /data/app/javascript/{hooks.js → hooks.ts} +0 -0
@@ -1,196 +0,0 @@
|
|
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);
|
18
|
-
}
|
19
|
-
|
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 });
|
58
|
-
}
|
59
|
-
|
60
|
-
applyCollapsed(tree) {
|
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
|
-
|
71
|
-
let collapsedState = this.collapsedState();
|
72
|
-
let walk = function (id) {
|
73
|
-
var index = tree.getIndex(id);
|
74
|
-
var node = index.node;
|
75
|
-
if (Object.prototype.hasOwnProperty.call(collapsedState, node.id)) {
|
76
|
-
node.collapsed = collapsedState[node.id];
|
77
|
-
} else if (node.news_page) {
|
78
|
-
node.collapsed = true;
|
79
|
-
} else if (depth(tree, index) > 1) {
|
80
|
-
node.collapsed = true;
|
81
|
-
}
|
82
|
-
if (index.children && index.children.length) {
|
83
|
-
index.children.forEach(c => walk(c));
|
84
|
-
}
|
85
|
-
};
|
86
|
-
walk(1);
|
87
|
-
}
|
88
|
-
|
89
|
-
collapsedState() {
|
90
|
-
if (window && window.localStorage &&
|
91
|
-
typeof(window.localStorage.collapsedPages) != "undefined") {
|
92
|
-
return JSON.parse(window.localStorage.collapsedPages);
|
93
|
-
}
|
94
|
-
return {};
|
95
|
-
}
|
96
|
-
|
97
|
-
createPage(index, attributes) {
|
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;
|
120
|
-
}
|
121
|
-
|
122
|
-
movePage(index, parent, position) {
|
123
|
-
let data = {
|
124
|
-
parent_id: parent.node.id,
|
125
|
-
position: position
|
126
|
-
};
|
127
|
-
let url = `/admin/${index.node.locale}/pages/${index.node.id}/move.json`;
|
128
|
-
this.performUpdate(index, url, data);
|
129
|
-
}
|
130
|
-
|
131
|
-
performUpdate(index, url, data) {
|
132
|
-
putJson(url, data).then(response => this.updateNode(index, response));
|
133
|
-
}
|
134
|
-
|
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
|
-
locale={this.props.locale}
|
144
|
-
dir={this.props.dir} />
|
145
|
-
);
|
146
|
-
}
|
147
|
-
|
148
|
-
reorderChildren(id) {
|
149
|
-
let tree = this.state.tree;
|
150
|
-
var index = this.state.tree.getIndex(id);
|
151
|
-
var node = index.node;
|
152
|
-
if (!node.news_page) {
|
153
|
-
return;
|
154
|
-
}
|
155
|
-
index.children = index.children.sort(function (a, b) {
|
156
|
-
var aNode = tree.getIndex(a).node;
|
157
|
-
var bNode = tree.getIndex(b).node;
|
158
|
-
if (aNode.pinned == bNode.pinned) {
|
159
|
-
return new Date(bNode.published_at) - new Date(aNode.published_at);
|
160
|
-
} else {
|
161
|
-
return aNode.pinned ? -1 : 1;
|
162
|
-
}
|
163
|
-
});
|
164
|
-
tree.updateNodesPosition();
|
165
|
-
}
|
166
|
-
|
167
|
-
setCollapsed(id, value) {
|
168
|
-
var node = this.state.tree.getIndex(id).node;
|
169
|
-
node.collapsed = value;
|
170
|
-
this.storeCollapsed(id, node.collapsed);
|
171
|
-
this.state.tree.updateNodesPosition();
|
172
|
-
}
|
173
|
-
|
174
|
-
storeCollapsed(id, newState) {
|
175
|
-
let node = this.state.tree.getIndex(id).node;
|
176
|
-
var store = this.collapsedState();
|
177
|
-
store[node.id] = newState;
|
178
|
-
window.localStorage.collapsedPages = JSON.stringify(store);
|
179
|
-
}
|
180
|
-
|
181
|
-
updateNode(index, attributes) {
|
182
|
-
for (var attr in attributes) {
|
183
|
-
if (Object.prototype.hasOwnProperty.call(attributes, attr)) {
|
184
|
-
index.node[attr] = attributes[attr];
|
185
|
-
}
|
186
|
-
}
|
187
|
-
this.setState({ tree: this.state.tree });
|
188
|
-
}
|
189
|
-
}
|
190
|
-
|
191
|
-
PageTree.propTypes = {
|
192
|
-
pages: PropTypes.array,
|
193
|
-
locale: PropTypes.string,
|
194
|
-
dir: PropTypes.string,
|
195
|
-
permissions: PropTypes.array
|
196
|
-
};
|
@@ -1,20 +0,0 @@
|
|
1
|
-
import React from "react";
|
2
|
-
import PropTypes from "prop-types";
|
3
|
-
|
4
|
-
export default class RichTextToolbarButton extends React.Component {
|
5
|
-
render() {
|
6
|
-
return (
|
7
|
-
<a title={this.props.name}
|
8
|
-
className={"button " + this.props.className}
|
9
|
-
onClick={this.props.onClick}>
|
10
|
-
<i className={"fa fa-" + this.props.className} />
|
11
|
-
</a>
|
12
|
-
);
|
13
|
-
}
|
14
|
-
}
|
15
|
-
|
16
|
-
RichTextToolbarButton.propTypes = {
|
17
|
-
className: PropTypes.string,
|
18
|
-
name: PropTypes.string,
|
19
|
-
onClick: PropTypes.func
|
20
|
-
};
|
@@ -1,72 +0,0 @@
|
|
1
|
-
import React from "react";
|
2
|
-
import PropTypes from "prop-types";
|
3
|
-
import ToastStore from "../stores/ToastStore";
|
4
|
-
|
5
|
-
export default class Toast extends React.Component {
|
6
|
-
constructor(props) {
|
7
|
-
super(props);
|
8
|
-
this.state = { toast: undefined,
|
9
|
-
fadeout: false };
|
10
|
-
this.store = ToastStore;
|
11
|
-
this.timer = undefined;
|
12
|
-
this.handleChange = this.handleChange.bind(this);
|
13
|
-
}
|
14
|
-
|
15
|
-
componentDidMount() {
|
16
|
-
this.unsubscribe = this.store.subscribe(this.handleChange);
|
17
|
-
if (this.props.error) {
|
18
|
-
this.store.dispatch({ type: "ERROR", message: this.props.error });
|
19
|
-
}
|
20
|
-
if (this.props.notice) {
|
21
|
-
this.store.dispatch({ type: "NOTICE", message: this.props.notice });
|
22
|
-
}
|
23
|
-
}
|
24
|
-
|
25
|
-
componentWillUnmount() {
|
26
|
-
this.unsubscribe();
|
27
|
-
if (this.timer) {
|
28
|
-
clearTimeout(this.timer);
|
29
|
-
}
|
30
|
-
}
|
31
|
-
|
32
|
-
handleChange() {
|
33
|
-
this.setState({ toast: this.store.getState()[0], fadeout: false });
|
34
|
-
if (!this.timer) {
|
35
|
-
this.timer = setTimeout(() => {
|
36
|
-
this.setState({ fadeout: true });
|
37
|
-
this.timer = setTimeout(() => {
|
38
|
-
this.timer = undefined;
|
39
|
-
this.setState({ fadeout: false });
|
40
|
-
this.store.dispatch({ type: "NEXT" });
|
41
|
-
}, 500);
|
42
|
-
}, 4000);
|
43
|
-
}
|
44
|
-
}
|
45
|
-
|
46
|
-
render() {
|
47
|
-
let toast = this.state.toast;
|
48
|
-
let classNames = ["toast"];
|
49
|
-
|
50
|
-
if (toast) {
|
51
|
-
classNames.push(toast.type);
|
52
|
-
if (this.state.fadeout) {
|
53
|
-
classNames.push("fadeout");
|
54
|
-
}
|
55
|
-
}
|
56
|
-
|
57
|
-
return (
|
58
|
-
<div className="toast-wrapper" aria-live="polite">
|
59
|
-
{toast && (
|
60
|
-
<div className={classNames.join(" ")}>
|
61
|
-
{toast.message}
|
62
|
-
</div>
|
63
|
-
)}
|
64
|
-
</div>
|
65
|
-
);
|
66
|
-
}
|
67
|
-
}
|
68
|
-
|
69
|
-
Toast.propTypes = {
|
70
|
-
notice: PropTypes.string,
|
71
|
-
error: PropTypes.string
|
72
|
-
};
|
@@ -1,17 +0,0 @@
|
|
1
|
-
import { useEffect, useRef } from "react";
|
2
|
-
|
3
|
-
export default function useDraggable(draggable, startDrag) {
|
4
|
-
const ref = useRef();
|
5
|
-
|
6
|
-
const handleDrag = (evt) => {
|
7
|
-
evt.preventDefault();
|
8
|
-
evt.stopPropagation();
|
9
|
-
startDrag(evt, draggable);
|
10
|
-
};
|
11
|
-
|
12
|
-
useEffect(() => {
|
13
|
-
draggable.ref.current = ref.current;
|
14
|
-
}, []);
|
15
|
-
|
16
|
-
return { ref: ref, onDragStart: handleDrag, draggable: true };
|
17
|
-
}
|
@@ -1,12 +0,0 @@
|
|
1
|
-
import { createStore } from "redux";
|
2
|
-
|
3
|
-
export default createStore((state = {}, action) => {
|
4
|
-
switch(action.type) {
|
5
|
-
case "OPEN":
|
6
|
-
return {...state, component: action.payload };
|
7
|
-
case "CLOSE":
|
8
|
-
return {...state, component: null };
|
9
|
-
default:
|
10
|
-
return state;
|
11
|
-
}
|
12
|
-
});
|
@@ -1,14 +0,0 @@
|
|
1
|
-
import { createStore } from "redux";
|
2
|
-
|
3
|
-
export default createStore((state = [], action) => {
|
4
|
-
switch(action.type) {
|
5
|
-
case "ERROR":
|
6
|
-
return [...state, { message: action.message, type: "error" }];
|
7
|
-
case "NOTICE":
|
8
|
-
return [...state, { message: action.message, type: "notice" }];
|
9
|
-
case "NEXT":
|
10
|
-
return state.slice(1);
|
11
|
-
default:
|
12
|
-
return state;
|
13
|
-
}
|
14
|
-
});
|
data/app/javascript/stores.js
DELETED
@@ -1,66 +0,0 @@
|
|
1
|
-
class GridOverlay {
|
2
|
-
constructor() {
|
3
|
-
this.gridOverlay = null;
|
4
|
-
this.showGrid = false;
|
5
|
-
this.init = this.init.bind(this);
|
6
|
-
}
|
7
|
-
|
8
|
-
bindHotkey() {
|
9
|
-
document.addEventListener("keyup", (evt) => {
|
10
|
-
if (evt.ctrlKey && evt.which == 71) {
|
11
|
-
this.toggle();
|
12
|
-
}
|
13
|
-
});
|
14
|
-
}
|
15
|
-
|
16
|
-
init() {
|
17
|
-
this.gridOverlay = document.querySelector(".grid-overlay");
|
18
|
-
if (this.gridOverlay) {
|
19
|
-
this.restoreState();
|
20
|
-
this.bindHotkey();
|
21
|
-
this.updateDOM();
|
22
|
-
}
|
23
|
-
}
|
24
|
-
|
25
|
-
ready(callback) {
|
26
|
-
if (document.readyState === "complete" ||
|
27
|
-
(document.readyState !== "loading" &&
|
28
|
-
!document.documentElement.doScroll)) {
|
29
|
-
callback();
|
30
|
-
} else {
|
31
|
-
document.addEventListener("DOMContentLoaded", callback);
|
32
|
-
}
|
33
|
-
}
|
34
|
-
|
35
|
-
restoreState() {
|
36
|
-
this.showGrid = window.localStorage.getItem("showGrid");
|
37
|
-
}
|
38
|
-
|
39
|
-
saveState() {
|
40
|
-
if (this.showGrid) {
|
41
|
-
window.localStorage.setItem("showGrid", "true");
|
42
|
-
} else {
|
43
|
-
window.localStorage.removeItem("showGrid");
|
44
|
-
}
|
45
|
-
}
|
46
|
-
|
47
|
-
start() {
|
48
|
-
this.ready(this.init);
|
49
|
-
}
|
50
|
-
|
51
|
-
toggle() {
|
52
|
-
this.showGrid = !this.showGrid;
|
53
|
-
this.saveState();
|
54
|
-
this.updateDOM();
|
55
|
-
}
|
56
|
-
|
57
|
-
updateDOM() {
|
58
|
-
if (this.showGrid) {
|
59
|
-
this.gridOverlay.classList.add("grid-overlay--active");
|
60
|
-
} else {
|
61
|
-
this.gridOverlay.classList.remove("grid-overlay--active");
|
62
|
-
}
|
63
|
-
}
|
64
|
-
}
|
65
|
-
|
66
|
-
export default new GridOverlay();
|
@@ -1,72 +0,0 @@
|
|
1
|
-
class ResponsiveEmbeds {
|
2
|
-
readyHandler(fn) {
|
3
|
-
if (document.readyState === "complete" || document.readyState === "interactive") {
|
4
|
-
setTimeout(fn, 1);
|
5
|
-
} else {
|
6
|
-
document.addEventListener("DOMContentLoaded", fn);
|
7
|
-
}
|
8
|
-
}
|
9
|
-
|
10
|
-
wrapEmbeds() {
|
11
|
-
let selectors = [ "iframe[src*=\"bandcamp.com\"]",
|
12
|
-
"iframe[src*=\"player.vimeo.com\"]",
|
13
|
-
"iframe[src*=\"youtube.com\"]",
|
14
|
-
"iframe[src*=\"youtube-nocookie.com\"]",
|
15
|
-
"iframe[src*=\"spotify.com\"]",
|
16
|
-
"iframe[src*=\"kickstarter.com\"][src*=\"video.html\"]" ];
|
17
|
-
|
18
|
-
let embeds = Array.prototype.slice.call(
|
19
|
-
document.querySelectorAll(selectors.join(","))
|
20
|
-
);
|
21
|
-
|
22
|
-
function wrapEmbed(embed) {
|
23
|
-
const parent = embed.parentNode;
|
24
|
-
|
25
|
-
// Recycle the existing container if the embed is already responsive.
|
26
|
-
if (parent.tagName === "DIV" &&
|
27
|
-
parent.childNodes.length === 1 &&
|
28
|
-
parent.style.position === "relative") {
|
29
|
-
return parent;
|
30
|
-
}
|
31
|
-
|
32
|
-
let wrapper = document.createElement("div");
|
33
|
-
if (parent.tagName === "P") {
|
34
|
-
parent.parentNode.replaceChild(wrapper, parent);
|
35
|
-
} else {
|
36
|
-
parent.replaceChild(wrapper, embed);
|
37
|
-
}
|
38
|
-
wrapper.appendChild(embed);
|
39
|
-
return wrapper;
|
40
|
-
}
|
41
|
-
|
42
|
-
embeds.forEach(function (embed) {
|
43
|
-
if (embed.parentNode &&
|
44
|
-
embed.parentNode.classList.contains("responsive-embed")) {
|
45
|
-
return;
|
46
|
-
}
|
47
|
-
|
48
|
-
let width = embed.offsetWidth;
|
49
|
-
let height = embed.offsetHeight;
|
50
|
-
let ratio = height / width;
|
51
|
-
let wrapper = wrapEmbed(embed);
|
52
|
-
|
53
|
-
wrapper.classList.add("responsive-embed");
|
54
|
-
wrapper.style.position = "relative";
|
55
|
-
wrapper.style.width = "100%";
|
56
|
-
wrapper.style.paddingTop = 0;
|
57
|
-
wrapper.style.paddingBottom = (ratio * 100) + "%";
|
58
|
-
|
59
|
-
embed.style.position = "absolute";
|
60
|
-
embed.style.width = "100%";
|
61
|
-
embed.style.height = "100%";
|
62
|
-
embed.style.top = "0";
|
63
|
-
embed.style.left = "0";
|
64
|
-
});
|
65
|
-
}
|
66
|
-
|
67
|
-
start() {
|
68
|
-
this.readyHandler(() => this.wrapEmbeds());
|
69
|
-
}
|
70
|
-
}
|
71
|
-
|
72
|
-
export default new ResponsiveEmbeds();
|
@@ -1,15 +0,0 @@
|
|
1
|
-
// Entry point for your Sass build
|
2
|
-
@import
|
3
|
-
'vendor/normalize',
|
4
|
-
'config',
|
5
|
-
|
6
|
-
'framework/breakpoints',
|
7
|
-
'framework/clearfix',
|
8
|
-
'framework/grid',
|
9
|
-
'framework/grid_overlay',
|
10
|
-
'framework/fonts',
|
11
|
-
|
12
|
-
'global/colors',
|
13
|
-
'global/typography',
|
14
|
-
|
15
|
-
'components/base';
|
@@ -1,26 +0,0 @@
|
|
1
|
-
$breakpoints: (mobile: 900px,
|
2
|
-
large: 1400px);
|
3
|
-
|
4
|
-
$grids : (default: (column-count: 12,
|
5
|
-
column: 94px,
|
6
|
-
gutter: 24px,
|
7
|
-
padding: 24px),
|
8
|
-
mobile: (column-count: 4,
|
9
|
-
column: 60px,
|
10
|
-
gutter: 16px,
|
11
|
-
padding: 16px));
|
12
|
-
|
13
|
-
$spacings: (1: 8px,
|
14
|
-
2: 16px,
|
15
|
-
3: 24px,
|
16
|
-
4: 32px,
|
17
|
-
5: 40px,
|
18
|
-
6: 48px,
|
19
|
-
8: 64px,
|
20
|
-
9: 72px,
|
21
|
-
10: 80px,
|
22
|
-
16: 128px,
|
23
|
-
20: 160px);
|
24
|
-
|
25
|
-
// Uncomment to limit full width
|
26
|
-
// $limit-width: 1600px;
|
data/lib/rails/generators/pages_core/frontend/templates/stylesheets/framework/breakpoints.scss
DELETED
@@ -1,42 +0,0 @@
|
|
1
|
-
// ---- Defaults --------------------------------------------------------------
|
2
|
-
|
3
|
-
$breakpoints: (mobile: 900px,
|
4
|
-
large: 1400px) !default;
|
5
|
-
|
6
|
-
|
7
|
-
// ---- Mixins ----------------------------------------------------------------
|
8
|
-
|
9
|
-
@function breakpoint-value($value) {
|
10
|
-
@if type-of($value) == "string" {
|
11
|
-
@return map-get($breakpoints, $value);
|
12
|
-
}
|
13
|
-
@else {
|
14
|
-
@return $value;
|
15
|
-
}
|
16
|
-
}
|
17
|
-
|
18
|
-
@mixin breakpoint($min: "", $max: "", $orientation: "") {
|
19
|
-
$query: "screen";
|
20
|
-
|
21
|
-
@if $min != "" {
|
22
|
-
$query: $query + ' and (min-width: #{breakpoint-value($min)})';
|
23
|
-
}
|
24
|
-
|
25
|
-
@if $max != "" {
|
26
|
-
$query: $query + ' and (max-width: #{breakpoint-value($max)})';
|
27
|
-
}
|
28
|
-
|
29
|
-
@if $orientation != "" {
|
30
|
-
$query: $query + ' and (orientation: #{$orientation})';
|
31
|
-
}
|
32
|
-
|
33
|
-
@media #{$query} {
|
34
|
-
@content;
|
35
|
-
}
|
36
|
-
}
|
37
|
-
|
38
|
-
@mixin mobile {
|
39
|
-
@include breakpoint($max: mobile) {
|
40
|
-
@content
|
41
|
-
}
|
42
|
-
}
|
@@ -1,32 +0,0 @@
|
|
1
|
-
@use "sass:list";
|
2
|
-
|
3
|
-
@function font-extension($format) {
|
4
|
-
$font-extensions: (opentype: "otf", truetype: "ttf");
|
5
|
-
$value: map-get($font-extensions, $format);
|
6
|
-
@if $value {
|
7
|
-
@return $value;
|
8
|
-
}
|
9
|
-
@else {
|
10
|
-
@return $format;
|
11
|
-
}
|
12
|
-
}
|
13
|
-
|
14
|
-
@function font-sources($filename, $formats: ()) {
|
15
|
-
$urls: ();
|
16
|
-
@each $f in list.join((woff2 woff), $formats) {
|
17
|
-
$urls: list.append(
|
18
|
-
$urls,
|
19
|
-
url("#{$filename}.#{font-extension($f)}") format("#{$f}")
|
20
|
-
);
|
21
|
-
}
|
22
|
-
@return list.join($urls, (), comma);
|
23
|
-
}
|
24
|
-
|
25
|
-
@mixin font-face($name, $filename, $weight: 400, $style: normal, $formats: ()) {
|
26
|
-
@font-face {
|
27
|
-
font-family: $name;
|
28
|
-
font-style: $style;
|
29
|
-
font-weight: $weight;
|
30
|
-
src: font-sources($filename, $formats);
|
31
|
-
}
|
32
|
-
}
|