1
0
mirror of https://github.com/til-schneider/slim-wiki.git synced 2025-08-04 15:47:33 +02:00

Added demo mode (edit mode is public, changes won't be saved)

This commit is contained in:
til-schneider
2016-02-02 11:40:49 +01:00
parent 28bd12a13a
commit c5ec51530c
9 changed files with 58 additions and 9 deletions

View File

@@ -4,6 +4,7 @@
updatePreviewDelay = 1000,
updatePreviewTimeout = null,
updatePreviewRunning = false,
demoAlertState = null,
previewIsDirty = false;
if (slimwiki.supportedBrowser) {
@@ -76,16 +77,30 @@
}
function onEditorChange() {
var isDemoMode = slimwiki.settings.demoMode;
if (isDemoMode && ! demoAlertState) {
var demoAlertElem = document.getElementById('demo-alert');
demoAlertElem.style.display = 'block';
demoAlertState = 'showing';
document.getElementById('demoAlertOkBtn').addEventListener('click', function() {
demoAlertElem.style.display = 'none';
demoAlertState = 'dismissed';
});
}
previewIsDirty = true;
if (! updatePreviewRunning) {
window.clearTimeout(updatePreviewTimeout);
updatePreviewTimeout = window.setTimeout(function() {
previewIsDirty = false;
updatePreviewRunning = true;
var start = new Date().getTime(),
articleFilename = slimwiki.settings.articleFilename;
callRpc('editor', 'saveArticle', [ articleFilename, editor.getValue() ], function(result, error) {
articleFilename = slimwiki.settings.articleFilename,
methodName = isDemoMode ? 'previewArticle' : 'saveArticle';
callRpc('editor', methodName, [ articleFilename, editor.getValue() ], function(result, error) {
updatePreviewRunning = false;
if (error) {

View File

@@ -34,6 +34,19 @@ body {
}
}
#demo-alert {
display: none;
position: fixed;
top: 70px;
left: 50%;
right: 0;
.alert {
display: block;
margin: 0 50px;
}
}
.breadcrumbs {
background-color: white;
cursor: default;

View File

@@ -37,7 +37,7 @@ function init() {
require_once __DIR__ . '/server/logic/Main.php';
(new Main())->dispatch($baseUrl, $basePath, $requestPathArray, $uriParts['query']);
(new Main())->dispatch($baseUrl, $basePath, $requestPathArray, isset($uriParts['query']) ? $uriParts['query'] : '');
}
init();

View File

@@ -7,11 +7,14 @@ $i18n = array(
'error.editingArticleFailed' => 'Der Artikel kann nicht bearbeitet werden.',
'error.missingWritePermissions.article' => 'Der Server hat keine Schreibrechte für die Artikel-Datei:',
'error.missingWritePermissions.backup' => 'Der Server hat keine Schreibrechte für die Backup-Datei:',
'button.ok' => 'OK',
'button.cancel' => 'Abbrechen',
'button.back' => 'Zurück',
'button.edit' => 'Bearbeiten',
'button.createUser' => 'Benutzer erstellen',
'button.createArticle' => 'Artikel anlegen',
'demoAlert.title' => 'Dies ist eine Demo.',
'demoAlert.message' => 'Deine Änderungen werden nicht gespeichert.<br/><br/>Bei einer normalen Installation werden Änderungen automatisch gespeichert, wenn Du kurz mal nichts schreibst. Sobald Du Deine Änderungen auf der rechten Seite siehst, sind sie dann bereits gespeichert (mit täglichem Backup) und veröffentlicht.<br/><br/>In dieser Demo kannst Du etwas Markdown eingeben und dann schauen, wie es aussehen würde.',
'createArticle.text' => 'Diesen Artikel gibt es noch nicht.',
'createArticle.content' => 'Dies ist ihr neuer Artikel.',
'createUser.userName' => 'Benutzername',

View File

@@ -7,11 +7,14 @@ $i18n = array(
'error.editingArticleFailed' => 'Editing article failed.',
'error.missingWritePermissions.article' => 'The server has no write permissions for the article file:',
'error.missingWritePermissions.backup' => 'The server has no write permissions for the backup file:',
'button.ok' => 'OK',
'button.cancel' => 'Cancel',
'button.back' => 'Back',
'button.edit' => 'Edit',
'button.createUser' => 'Create user',
'button.createArticle' => 'Create article',
'demoAlert.title' => 'This is a demo.',
'demoAlert.message' => 'Your changes won\'t be saved.<br/><br/>On a real installation, your changes are saved automatically as soon as you stop writing for a second. If you see your changes on the right side, they will be already saved (with a daily backup) and public.<br/><br/>In this demo you can now write some markdown and see how it would look like.',
'createArticle.text' => 'This article does not exist yet.',
'createArticle.content' => 'This is your new article.',
'createUser.userName' => 'User name',

View File

@@ -43,6 +43,7 @@ $mode = $data['mode'];
"mode" => $mode
);
if ($mode == 'edit' || $mode == 'createArticle') {
$settings['demoMode'] = $data['demoMode'];
$settings['pageTitle'] = end($data['breadcrumbs'])['name'];
$settings['requestPath'] = $data['requestPath'];
$settings['articleFilename'] = $data['articleFilename'];
@@ -127,6 +128,13 @@ if ($mode == 'edit') {
?></div></nav><?php
}
if ($mode == 'edit' && $data['demoMode']) {
?><div id="demo-alert"><div class="alert alert-info clearfix">
<div><strong><?php echo $i18n['demoAlert.title']; ?></strong> <?php echo $i18n['demoAlert.message']; ?></div>
<button id="demoAlertOkBtn" class="btn btn-default pull-right"><?php echo $i18n['button.ok']; ?></button>
</div></div><?php
}
if ($mode == 'view' || $mode == 'edit') {
?><article id="content" class="markdown main-column"><?php echo $data['articleHtml']; ?></article><?php
}

View File

@@ -29,6 +29,7 @@ class Context {
'wikiName' => 'Slim Wiki',
'timezone' => 'Europe/Berlin',
'lang' => 'en',
'demoMode' => false,
'showCompleteBreadcrumbs' => true
);

View File

@@ -10,7 +10,8 @@ class EditorService {
}
public function isRpcMethod($methodName) {
return ($methodName == 'createArticle' || $methodName == 'saveArticle' || $methodName == 'createUserConfig');
return ($methodName == 'createArticle' || $methodName == 'previewArticle' || $methodName == 'saveArticle'
|| $methodName == 'createUserConfig');
}
// Returns one of: 'logged-in', 'no-credentials', 'wrong-credentials'
@@ -73,6 +74,11 @@ class EditorService {
return $this->saveArticle($articleFilename, $markdownText);
}
// Used in demo-mode instead of `saveArticle`
public function previewArticle($articleFilename, $markdownText) {
return $this->context->getRenderService()->renderMarkdown($markdownText, true);
}
public function saveArticle($articleFilename, $markdownText) {
$this->assertLoggedIn();

View File

@@ -64,6 +64,8 @@ class Main {
}
private function handleGet($baseUrl, $basePath, $requestPathArray, $requestQuery) {
$config = $this->context->getConfig();
$showCreateUserButton = false;
if ($requestQuery == 'edit' || $requestQuery == 'createUser') {
$mode = $requestQuery;
@@ -73,7 +75,7 @@ class Main {
$showCreateUserButton = ! $this->isUserDefined();
}
if ($mode == 'edit') {
if ($mode == 'edit' && ! $config['demoMode']) {
$loginState = $this->context->getEditorService()->getLoginState();
if ($loginState != 'logged-in') {
$wikiName = $this->context->getConfig()['wikiName'];
@@ -91,8 +93,6 @@ class Main {
header('Content-Type:text/html; charset=utf-8');
echo '<h1>Forbidden</h1>';
} else {
$config = $this->context->getConfig();
$renderService = $this->context->getRenderService();
$fatalErrorMessage = null;
@@ -118,7 +118,7 @@ class Main {
$data['mode'] = $mode;
$data['fatalErrorMessage'] = $fatalErrorMessage;
foreach (array('wikiName', 'footerHtml') as $key) {
foreach (array('wikiName', 'demoMode', 'footerHtml') as $key) {
if (isset($config[$key])) {
$data[$key] = $config[$key];
}