From 8d284bab474c7e669ae9a639bdb22f7b28b95cc3 Mon Sep 17 00:00:00 2001 From: Andrew Manning Date: Mon, 30 May 2016 20:59:54 -0400 Subject: Created page history widget to dynamically fetch and display the git commit history for wiki pages. --- Zotlabs/Module/Wiki.php | 36 +++++++++++++++++++++++++++++++++--- include/widgets.php | 11 +++++++++++ include/wiki.php | 30 ++++++++++++++++++++++++------ view/tpl/wiki.tpl | 29 ++++++++++++++++++++++++++++- view/tpl/wiki_page_history.tpl | 11 +++++++++++ 5 files changed, 107 insertions(+), 10 deletions(-) create mode 100644 view/tpl/wiki_page_history.tpl diff --git a/Zotlabs/Module/Wiki.php b/Zotlabs/Module/Wiki.php index d6acbf6b0..0f8db9350 100644 --- a/Zotlabs/Module/Wiki.php +++ b/Zotlabs/Module/Wiki.php @@ -26,8 +26,11 @@ class Wiki extends \Zotlabs\Web\Controller { function get() { require_once('include/wiki.php'); require_once('include/acl_selectors.php'); + // TODO: Combine the interface configuration into a unified object + // Something like $interface = array('new_page_button' => false, 'new_wiki_button' => false, ...) $wiki_owner = false; $showNewWikiButton = false; + $pageHistory = array(); if(local_channel()) { $channel = \App::get_channel(); } @@ -107,6 +110,7 @@ class Wiki extends \Zotlabs\Web\Controller { $hide_editor = false; $showPageControls = $wiki_owner; $showNewWikiButton = $wiki_owner; + $pageHistory = wiki_page_history(array('resource_id' => $resource_id, 'page' => $pagename)); } require_once('library/markdown.php'); $renderedContent = Markdown(json_decode($content)); @@ -125,7 +129,8 @@ class Wiki extends \Zotlabs\Web\Controller { '$content' => $content, '$renderedContent' => $renderedContent, '$wikiName' => array('wikiName', t('Enter the name of your new wiki:'), '', ''), - '$pageName' => array('pageName', t('Enter the name of the new page:'), '', '') + '$pageName' => array('pageName', t('Enter the name of the new page:'), '', ''), + '$pageHistory' => $pageHistory['history'] )); head_add_js('library/ace/ace.js'); return $o; @@ -236,7 +241,7 @@ class Wiki extends \Zotlabs\Web\Controller { json_return_and_die(array('success' => false)); } } - $name = escape_tags(urlencode($_POST['name'])); //Get new wiki name + $name = escape_tags(urlencode($_POST['name'])); //Get new page name if($name === '') { json_return_and_die(array('message' => 'Error creating page. Invalid name.', 'success' => false)); } @@ -272,7 +277,7 @@ class Wiki extends \Zotlabs\Web\Controller { $resource_id = $_POST['resource_id']; $pagename = escape_tags(urlencode($_POST['name'])); $content = escape_tags($_POST['content']); //Get new content - // Determine if observer has permission to create wiki + // Determine if observer has permission to save content if (local_channel()) { $channel = \App::get_channel(); } else { @@ -311,6 +316,31 @@ class Wiki extends \Zotlabs\Web\Controller { } } + // Update page history + // /wiki/channel/history/page + if ((argc() === 4) && (argv(2) === 'history') && (argv(3) === 'page')) { + $which = argv(1); + $resource_id = $_POST['resource_id']; + $pagename = escape_tags(urlencode($_POST['name'])); + // Determine if observer has permission to view content + if (local_channel()) { + $channel = \App::get_channel(); + } else { + $channel = get_channel_by_nick($which); + $observer_hash = get_observer_hash(); + $perms = wiki_get_permissions($resource_id, intval($channel['channel_id']), $observer_hash); + if (!$perms['read']) { + logger('Wiki read permission denied.' . EOL); + json_return_and_die(array('historyHTML' => '', 'message' => 'Permission denied.', 'success' => false)); + } + } + $historyHTML = widget_wiki_page_history(array( + 'resource_id' => $resource_id, + 'page' => $pagename + )); + json_return_and_die(array('historyHTML' => $historyHTML, 'message' => '', 'success' => true)); + } + //notice('You must be authenticated.'); json_return_and_die(array('message' => 'You must be authenticated.', 'success' => false)); diff --git a/include/widgets.php b/include/widgets.php index b19c36bc6..536af8818 100644 --- a/include/widgets.php +++ b/include/widgets.php @@ -914,6 +914,17 @@ function widget_wiki_pages($arr) { )); } +function widget_wiki_page_history($arr) { + require_once("include/wiki.php"); + $pagename = ((array_key_exists('page', $arr)) ? $arr['page'] : ''); + $resource_id = ((array_key_exists('resource_id', $arr)) ? $arr['resource_id'] : ''); + $pageHistory = wiki_page_history(array('resource_id' => $resource_id, 'page' => $pagename)); + + return replace_macros(get_markup_template('wiki_page_history.tpl'), array( + '$pageHistory' => $pageHistory['history'] + )); +} + function widget_bookmarkedchats($arr) { if(! feature_enabled(App::$profile['profile_uid'],'ajaxchat')) diff --git a/include/wiki.php b/include/wiki.php index 6a94dc111..14e8cc53a 100644 --- a/include/wiki.php +++ b/include/wiki.php @@ -95,12 +95,6 @@ function wiki_create_wiki($channel, $observer_hash, $name, $acl) { $arr['item_private'] = intval($acl->is_private()); $arr['verb'] = ACTIVITY_CREATE; $arr['obj_type'] = ACTIVITY_OBJ_WIKI; - $arr['object'] = json_encode(array( - 'type' => $arr['obj_type'], - 'title' => $arr['title'], - 'id' => $arr['resource_id'], - 'url' => $wiki_url - )); $arr['body'] = '[table][tr][td][h1]New Wiki[/h1][/td][/tr][tr][td][zrl=' . $wiki_url . ']' . $name . '[/zrl][/td][/tr][/table]'; // Save the path using iconfig. The file path should not be shared with other hubs if (!set_iconfig($arr, 'wiki', 'path', $path, false)) { @@ -221,6 +215,30 @@ function wiki_get_page_content($arr) { } } +function wiki_page_history($arr) { + $pagename = ((array_key_exists('page',$arr)) ? $arr['page'] : ''); + $resource_id = ((array_key_exists('resource_id',$arr)) ? $arr['resource_id'] : ''); + $w = wiki_get_wiki($resource_id); + if (!$w['path']) { + return array('history' => null, 'message' => 'Error reading wiki', 'success' => false); + } + $page_path = $w['path'].'/'.$pagename; + if (!is_readable($page_path) === true) { + return array('history' => null, 'message' => 'Cannot read wiki page: ' . $page_path, 'success' => false); + } + $reponame = ((array_key_exists('title', $w['wiki'])) ? $w['wiki']['title'] : 'repo'); + if($reponame === '') { + $reponame = 'repo'; + } + $git = new GitRepo('sys', null, false, $w['wiki']['title'], $w['path']); + try { + $gitlog = $git->git->log('', $page_path , array('limit' => 50)); + logger('gitlog: ' . json_encode($gitlog)); + return array('history' => $gitlog, 'message' => '', 'success' => true); + } catch (\PHPGit\Exception\GitException $e) { + return array('history' => null, 'message' => 'GitRepo error thrown', 'success' => false); + } +} function wiki_save_page($arr) { $pagename = ((array_key_exists('name',$arr)) ? $arr['name'] : ''); diff --git a/view/tpl/wiki.tpl b/view/tpl/wiki.tpl index 91c6e64b2..d2ce03f5a 100644 --- a/view/tpl/wiki.tpl +++ b/view/tpl/wiki.tpl @@ -59,6 +59,7 @@ -
+
@@ -79,6 +80,21 @@ {{$renderedContent}}
+
+
+ + {{foreach $pageHistory as $commit}} + + {{/foreach}} +
+ + + + +
Date{{$commit.date}}
Name{{$commit.name}}
Message{{$commit.title}}
+
+
+
@@ -110,6 +126,17 @@ ev.preventDefault(); }); + $('#wiki-get-history').click(function (ev) { + $.post("wiki/{{$channel}}/history/page", {name: window.wiki_page_name, resource_id: window.wiki_resource_id}, function (data) { + if (data.success) { + $('#page-history-list').html(data.historyHTML); + } else { + window.console.log('Error getting page history.'); + } + }, 'json'); + ev.preventDefault(); + }); + function wiki_delete_wiki(wikiName, resource_id) { if(!confirm('Are you sure you want to delete the entire wiki: ' + JSON.stringify(wikiName))) { return; diff --git a/view/tpl/wiki_page_history.tpl b/view/tpl/wiki_page_history.tpl new file mode 100644 index 000000000..7efc4aa96 --- /dev/null +++ b/view/tpl/wiki_page_history.tpl @@ -0,0 +1,11 @@ + + {{foreach $pageHistory as $commit}} + + {{/foreach}} +
+ + + + +
Date{{$commit.date}}
Name{{$commit.name}}
Message{{$commit.title}}
+
\ No newline at end of file -- cgit v1.2.3