EBernhardson (WMF) has uploaded a new change for review.
https://gerrit.wikimedia.org/r/78933
Change subject: edit-post action for Topic block
......................................................................
edit-post action for Topic block
Change-Id: Ie62ff67ae09ec131ae49acce3ffe779311203842
---
M Flow.php
M container.php
M includes/Block/Topic.php
A templates/edit-post.html.php
M templates/topic.html.php
5 files changed, 142 insertions(+), 27 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Flow
refs/changes/33/78933/1
diff --git a/Flow.php b/Flow.php
index 6df3ccb..f5be5aa 100755
--- a/Flow.php
+++ b/Flow.php
@@ -40,7 +40,7 @@
'descriptionmsg' => 'flow-desc',
);
-$dir = dirname( __FILE__ ) . '/';
+$dir = __DIR__ . '/';
$wgExtensionMessagesFiles['Flow'] = $dir . 'Flow.i18n.php';
// Classes fulfilling the mediawiki extension architecture
diff --git a/container.php b/container.php
index d2665cc..401f24f 100644
--- a/container.php
+++ b/container.php
@@ -33,7 +33,11 @@
$c['templating.namespaces'] = array(
'flow' => __DIR__ . '/templates',
);
-$c['templating.global_variables'] = array();
+$c['templating.global_variables'] = $c->share( function( $c ) {
+ return array(
+ 'user' => $c['user'],
+ );
+} );
$c['templating'] = $c->share( function( $c ) {
return new Flow\Templating(
$c['url_generator'],
diff --git a/includes/Block/Topic.php b/includes/Block/Topic.php
index 1266d03..32d0f3b 100644
--- a/includes/Block/Topic.php
+++ b/includes/Block/Topic.php
@@ -16,8 +16,12 @@
protected $root;
protected $rootLoader;
protected $newRevision;
+ protected $requestedPost;
- protected $supportedActions = array( 'reply', 'delete-topic',
'delete-post', 'restore-post' );
+ protected $supportedActions = array(
+ 'delete-post', 'restore-post', 'edit-post',
+ 'reply', 'delete-topic',
+ );
public function __construct( Workflow $workflow, ManagerGroup $storage,
$root ) {
parent::__construct( $workflow, $storage );
@@ -49,6 +53,10 @@
case 'restore-post':
$this->validateRestorePost();
+ break;
+
+ case 'edit-post':
+ $this->validateEditPost();
break;
default:
@@ -133,6 +141,28 @@
}
}
+ protected function validateEditPost() {
+ if ( empty( $this->submitted['postId'] ) ) {
+ $this->errors['edit-post'] = wfMessage(
'flow-no-post-provided' );
+ return;
+ }
+ if ( empty( $this->submitted['content'] ) ) {
+ $this->errors['content'] = wfMessage(
'flow-missing-post-content' );
+ } else {
+ $this->parsedContent = $this->convertWikitextToHtml5(
$this->submitted['content'] );
+ if ( empty( $this->parsedContent ) ) {
+ $this->errors['content'] = wfMessage(
'flow-empty-parsoid-result' );
+ return;
+ }
+ }
+ $post = $this->loadRequestedPost( $this->submitted['postId'] );
+ if ( $post ) {
+ $this->newRevision = $post->newNextRevision(
$this->user, $this->parsedContent );
+ } else {
+ $this->errors['edit-post'] = wfMessage(
'flow-post-not-found' );
+ }
+ }
+
// @todo: I assume not only topic reply, but also TopicListBlock &
SummaryBlock's content need to be converted?
protected function convertWikitextToHtml5( $wikitext ) {
global $wgFlowUseParsoid;
@@ -180,6 +210,7 @@
case 'reply':
case 'delete-post':
case 'restore-post':
+ case 'edit-post':
if ( $this->newRevision === null ) {
throw new \MWException( 'Attempt to save null
revision' );
}
@@ -196,24 +227,47 @@
}
public function render( Templating $templating, array $options, $return
= false ) {
- if ( $this->action === 'post-history' ) {
- if ( empty( $options['postId'] ) ) {
- var_dump( $this->getName() );
- var_dump( $options );
- throw new \Exception( 'No postId specified' );
- $history = array();
- } else {
- $history = $this->getHistory(
$options['postId'] );
- }
- return $templating->render(
"flow:post-history.html.php", array(
- 'block' => $this,
- 'topic' => $this->workflow,
- 'history' => $history,
- ), $return );
- }
-
$templating->getOutput()->addModules( 'ext.flow.base' );
+ switch( $this->action ) {
+ case 'post-history':
+ return $this->renderPostHistory( $templating, $options,
$return );
+ case 'edit-post':
+ return $this->renderEditPost( $templating, $options,
$return );
+
+ default:
+ return $this->renderGeneric( $templating, $options,
$return );
+ }
+ }
+
+ protected function renderPostHistory( Templating $templating, array
$options, $return = false ) {
+ if ( empty( $options['postId'] ) ) {
+ var_dump( $this->getName() );
+ var_dump( $options );
+ throw new \Exception( 'Could not locate post' );
+ $history = array();
+ } else {
+ $history = $this->getHistory( $options['postId'] );
+ }
+ return $templating->render( "flow:post-history.html.php", array(
+ 'block' => $this,
+ 'topic' => $this->workflow,
+ 'history' => $history,
+ ), $return );
+ }
+
+ protected function renderEditPost( Templating $templating, array
$options, $return = false ) {
+ if ( !isset( $options['postId'] ) ) {
+ throw new \Exception( 'No postId provided' );
+ }
+ return $templating->render( "flow:edit-post.html.php", array(
+ 'block' => $this,
+ 'topic' => $this->workflow,
+ 'post' => $this->loadRequestedPost( $options['postId']
),
+ ), $return );
+ }
+
+ protected function renderGeneric( Templating $templating, array
$options, $return = false ) {
return $templating->render( "flow:topic.html.php", array(
'block' => $this,
'topic' => $this->workflow,
@@ -358,6 +412,24 @@
return $this->root = $this->rootLoader->get(
$this->workflow->getId() );
}
+ protected function loadRequestedPost( $postId ) {
+ if ( !isset( $this->requestedPost[$postId] ) ) {
+ $found = $this->storage->find(
+ 'PostRevision',
+ array( 'tree_rev_descendant_id' => $postId ),
+ array( 'sort' => 'rev_id', 'order' => 'DESC',
'limit' => 1 )
+ );
+ if ( $found ) {
+ $this->requestedPost[$postId] = reset( $found );
+ } else {
+ // meh, signals that its not found, dont look
again
+ $this->requestedPost[$postId] = false;
+ }
+ }
+ // catches the === false and returns null as expected
+ return $this->requestedPost[$postId] ?: null;
+ }
+
// Somehow the template has to know which post the errors go with
public function getRepliedTo() {
return isset( $this->submitted['replyTo'] ) ?
$this->submitted['replyTo'] : null;
@@ -370,7 +442,7 @@
// The prefix used for form data
public function getName() {
- return 'topic_list';
+ return 'topic';
}
}
diff --git a/templates/edit-post.html.php b/templates/edit-post.html.php
new file mode 100644
index 0000000..c607c14
--- /dev/null
+++ b/templates/edit-post.html.php
@@ -0,0 +1,32 @@
+<?php
+
+echo Html::openElement( 'form', array(
+ 'method' => 'POST',
+ 'action' => $this->generateUrl( $topic->getId(), 'edit-post' ),
+) );
+$editToken = $user->getEditToken( 'flow' );
+if ( $block->hasErrors() ) {
+ echo '<ul>';
+ foreach ( $block->getErrors() as $error ) {
+ echo '<li>', $error->text() . '</li>'; // the pain ...
+ }
+ echo '</ul>';
+}
+
+echo Html::element( 'input', array(
+ 'type' => 'hidden',
+ 'name' => 'wpEditToken',
+ 'value' => $user->getEditToken( 'flow' ),
+ ) ),
+ Html::element( 'input', array(
+ 'type' => 'hidden',
+ 'name' => $block->getName() . '[postId]',
+ 'value' => $post->getPostId()->getHex(),
+ ) ),
+ Html::textarea( $block->getName() . '[content]', $post->getContent() ),
+ Html::element( 'input', array(
+ 'type' => 'submit',
+ 'value' => wfMessage( 'flow-action-edit-post' )->plain()
+ ) ),
+ '</form>';
+
diff --git a/templates/topic.html.php b/templates/topic.html.php
index a0f83b1..2b7c1e8 100644
--- a/templates/topic.html.php
+++ b/templates/topic.html.php
@@ -48,13 +48,20 @@
. wfMessage( 'flow-content' ) . $post->getContent()
. '<ul>';
$postAction( 'delete-post', array( 'postId' =>
$post->getPostId()->getHex() ) );
- echo '<li>' . Html::element( 'a', array(
- 'href' => $self->generateUrl( $root->getPostId(),
'post-history', array(
- $block->getName() . '[postId]' =>
$post->getPostId()->getHex(),
- ) ),
- ), wfMessage( 'flow-post-action-history' )->plain() ) . '<li>';
- echo '</ul>'
- . Html::openElement( 'form', array(
+ echo '<li>',
+ Html::element( 'a', array(
+ 'href' => $self->generateUrl(
$root->getPostId(), 'edit-post', array(
+ $block->getName() . '[postId]'
=> $post->getPostId()->getHex(),
+ ) ) ), wfMessage( 'flow-post-action-edit-post'
)->plain() ) .
+ '</li>',
+ '<li>',
+ Html::element( 'a', array(
+ 'href' => $self->generateUrl(
$root->getPostId(), 'post-history', array(
+ $block->getName() . '[postId]'
=> $post->getPostId()->getHex(),
+ ) ) ), wfMessage( 'flow-post-action-history'
)->plain() ) .
+ '</li>',
+ '</ul>',
+ Html::openElement( 'form', array(
'method' => 'POST',
// root post id is same as topic workflow id
'action' => $self->generateUrl(
$root->getPostId(), 'reply' ),
--
To view, visit https://gerrit.wikimedia.org/r/78933
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ie62ff67ae09ec131ae49acce3ffe779311203842
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Flow
Gerrit-Branch: master
Gerrit-Owner: EBernhardson (WMF) <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits