From aef29f18ab84811475dc991dcf3f2ae68a215156 Mon Sep 17 00:00:00 2001 From: Skylar Ittner Date: Mon, 23 Apr 2018 00:36:52 -0600 Subject: [PATCH] Add basic page editing and saving in control panel --- action.php | 19 +++- database.mwb | Bin 11235 -> 12459 bytes lang/en_us.php | 13 ++- lib/themefunctions.php | 6 +- pages.php | 25 +++++- pages/editor.php | 71 +++++++++++++++ pages/sites.php | 60 +++++++++++++ pages/sitesettings.php | 97 +++++++++++++++++++++ public/index.php | 9 +- public/themes/bootstrap/theme.json | 1 + required.php | 2 +- static/css/editor.css | 25 +++++- static/css/editorparent.css | 12 +++ static/css/themeselector.css | 25 ++++++ static/{css/font => fonts}/summernote.eot | Bin static/{css/font => fonts}/summernote.ttf | Bin static/{css/font => fonts}/summernote.woff | Bin static/js/editor.js | 45 ++++++---- static/js/editorparent.js | 38 ++++++++ static/js/sitesettings.js | 7 ++ 20 files changed, 425 insertions(+), 30 deletions(-) create mode 100644 pages/editor.php create mode 100644 pages/sites.php create mode 100644 pages/sitesettings.php create mode 100644 static/css/editorparent.css create mode 100644 static/css/themeselector.css rename static/{css/font => fonts}/summernote.eot (100%) rename static/{css/font => fonts}/summernote.ttf (100%) rename static/{css/font => fonts}/summernote.woff (100%) create mode 100644 static/js/editorparent.js create mode 100644 static/js/sitesettings.js diff --git a/action.php b/action.php index 754b131..b0952d1 100644 --- a/action.php +++ b/action.php @@ -7,7 +7,6 @@ /** * Make things happen when buttons are pressed and forms submitted. */ - require_once __DIR__ . "/required.php"; if ($VARS['action'] !== "signout") { @@ -32,8 +31,24 @@ function returnToSender($msg, $arg = "") { switch ($VARS['action']) { case "saveedits": - $page = $VARS['page']; + header("Content-Type: application/json"); + $slug = $VARS['slug']; + $site = $VARS['site']; $content = $VARS['content']; + if ($database->has("pages", ["AND" => ["slug" => $slug, "siteid" => $site]])) { + $pageid = $database->get("pages", "pageid", ["AND" => ["slug" => $slug, "siteid" => $site]]); + } else { + die(json_encode(["status" => "ERROR", "msg" => "Invalid page or site"])); + } + foreach ($content as $name => $value) { + if ($database->has("components", ["AND" => ["pageid" => $pageid, "name" => $name]])) { + $database->update("components", ["content" => $value], ["AND" => ["pageid" => $pageid, "name" => $name]]); + } else { + $database->insert("components", ["name" => $name, "content" => $value, "pageid" => $pageid]); + } + } + exit(json_encode(["status" => "OK"])); + break; case "signout": session_destroy(); header('Location: index.php'); diff --git a/database.mwb b/database.mwb index 82f339466a8645d57a3333f92f2feda4ba02388b..ee286d6362b3c44eb73c2952fce6c77e72b099ef 100644 GIT binary patch literal 12459 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 z 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 "The login server returned an error: {arg}", "login server user data error" => "The login server refused to provide account information. Try again or contact technical support.", "captcha error" => "There was a problem with the CAPTCHA (robot test). Try again.", + "actions" => "Actions", "home" => "Home", "more" => "More", - "test" => "Test" + "sites" => "Sites", + "theme" => "Theme", + "name" => "Name", + "site name" => "Site Name", + "url" => "URL", + "editing site" => "Editing {site}", + "theme type" => "Theme type", + "single page" => "Single page", + "multiple page" => "Multiple page", + "templates" => "Templates", + "color styles" => "Color styles" ]); \ No newline at end of file diff --git a/lib/themefunctions.php b/lib/themefunctions.php index b1f19db..63eb70e 100644 --- a/lib/themefunctions.php +++ b/lib/themefunctions.php @@ -59,7 +59,11 @@ function get_page_url($echo = true, $slug = null) { if ($slug == null) { $slug = get_page_slug(false); } - $url = get_site_url(false) . "index.php?id=$slug"; + $edit = ""; + if (isset($_GET['edit'])) { + $edit = "&edit"; + } + $url = get_site_url(false) . "index.php?id=$slug$edit"; if ($echo) { echo $url; } else { diff --git a/pages.php b/pages.php index ad2a84f..d45cdec 100644 --- a/pages.php +++ b/pages.php @@ -11,7 +11,30 @@ define("PAGES", [ "navbar" => true, "icon" => "fas fa-home" ], + "sites" => [ + "title" => "sites", + "navbar" => true, + "icon" => "fas fa-sitemap" + ], + "sitesettings" => [ + "title" => "settings", + "styles" => [ + "static/css/themeselector.css" + ], + "scripts" => [ + "static/js/sitesettings.js" + ] + ], + "editor" => [ + "title" => "editor", + "styles" => [ + "static/css/editorparent.css" + ], + "scripts" => [ + "static/js/editorparent.js" + ] + ], "404" => [ "title" => "404 error" ] -]); \ No newline at end of file +]); diff --git a/pages/editor.php b/pages/editor.php new file mode 100644 index 0000000..d197353 --- /dev/null +++ b/pages/editor.php @@ -0,0 +1,71 @@ +has('sites', ['siteid' => $VARS['siteid']])) { + $sitedata = $database->get( + 'sites', [ + 'siteid', + 'sitename', + 'url', + 'theme', + 'color' + ], [ + 'siteid' => $VARS['siteid'] + ]); + $pagedata = $database->select( + 'pages', [ + "pageid", + "slug", + "title", + "template" + ], ["siteid" => $VARS['siteid']] + ); + $slug = "index"; + if (isset($VARS['slug']) && $database->has('pages', ["AND" => ['slug' => $VARS['slug'], 'siteid' => $VARS['siteid']]])) { + $slug = $VARS['slug']; + } + } else { + header('Location: app.php?page=sites'); + die(); + } +} else { + header('Location: app.php?page=sites'); + die(); +} +?> +
+
+
+ +
+
+
+ + +
+ +
+ +
+
+
+
+ + \ No newline at end of file diff --git a/pages/sites.php b/pages/sites.php new file mode 100644 index 0000000..4adf6e4 --- /dev/null +++ b/pages/sites.php @@ -0,0 +1,60 @@ + +
+ +
+ + + + + + + + + + + + select('sites', [ + 'siteid', + 'sitename', + 'url', + 'theme', + 'color' + ]); + foreach ($sites as $site) { + $theme = json_decode(file_get_contents("public/themes/".$site['theme']."/theme.json"), true); + $themename = $theme["name"]; + ?> + + + + + + + + + + + + + + + + + + +
+ + + +
\ No newline at end of file diff --git a/pages/sitesettings.php b/pages/sitesettings.php new file mode 100644 index 0000000..92ef9df --- /dev/null +++ b/pages/sitesettings.php @@ -0,0 +1,97 @@ +has('sites', ['siteid' => $VARS['siteid']])) { + $sitedata = $database->select( + 'sites', [ + 'siteid', + 'sitename', + 'url', + 'theme', + 'color' + ], [ + 'siteid' => $VARS['siteid'] + ])[0]; + } else { + header('Location: app.php?page=sites'); + } +} else { + header('Location: app.php?page=sites'); +} +?> + +
+
+

+ "" . htmlspecialchars($sitedata['sitename']) . ""]); ?> +

+
+
+ + +
+
+ + +
+
+
+
+ +
+ + + +
+
+
+
+
+ + + + + + +
+
\ No newline at end of file diff --git a/public/index.php b/public/index.php index d542b2d..f3448d2 100644 --- a/public/index.php +++ b/public/index.php @@ -19,12 +19,13 @@ include __DIR__ . "/themes/$theme/$template.php"; if (isset($_GET['edit'])) { ?> - + + "); - + $(".sw-editable").each(function () { // Remove leading whitespace added by the template $(this).html($(this).html().trim()); @@ -20,7 +39,7 @@ $(document).ready(function () { ['fontsize', ['fontsize']], ['para', ['ul', 'ol']], ['insert', ['link', 'picture']], - ['misc', ['undo', 'redo', 'fullscreen', 'codeview']] + ['misc', ['undo', 'redo', 'codeview']] ], placeholder: 'Click to edit' }); @@ -30,21 +49,11 @@ $(document).ready(function () { var component = $(this).data("component"); $(this).html(""); }); -}); -function saveEdits() { - var components = []; - $(".sw-editable").each(function (e) { - components[$(this).data("component")] = $(this).summernote('code'); - }); - $(".sw-text-input").each(function (e) { - components[$(this).data("component")] = $(this).val(); - }); - var content = JSON.stringify(components); - console.log(components); - $.post(save_url, { - action: "saveedits", - page: "", - content: content + window.addEventListener('message', function (event) { + console.log("editor: received message: " + event.data); + if (event.data == "save") { + saveEdits(); + } }); -} \ No newline at end of file +}); \ No newline at end of file diff --git a/static/js/editorparent.js b/static/js/editorparent.js new file mode 100644 index 0000000..abee9ff --- /dev/null +++ b/static/js/editorparent.js @@ -0,0 +1,38 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +function save(json) { + var output = JSON.parse(json); + console.log(output); + $.post("action.php", { + action: "saveedits", + source: "editor", + slug: output["slug"], + site: output["site"], + content: output["content"] + }, function (data) { + if (data.status == "OK") { + alert("Saved"); + } else { + alert(data.msg); + } + }); +} + +window.addEventListener('message', function (event) { + //console.log("parent: received message: " + event.data); + if (event.data.startsWith("save ")) { + save(event.data.slice(5)); + } +}); + +$("#savebtn").click(function () { + triggerSave(); +}); + +function triggerSave() { + document.getElementById("editorframe").contentWindow.postMessage("save", "*"); +} \ No newline at end of file diff --git a/static/js/sitesettings.js b/static/js/sitesettings.js new file mode 100644 index 0000000..7e3b16d --- /dev/null +++ b/static/js/sitesettings.js @@ -0,0 +1,7 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +$('#name').on('input propertychange paste', function () { + $('#name_title').text($('#name').val()); +}); \ No newline at end of file