Bsitu has uploaded a new change for review. https://gerrit.wikimedia.org/r/130636
Change subject: [WIP]Edit topic summary ...................................................................... [WIP]Edit topic summary This is a a work in progress and not ready for code review, Change-Id: I3b13a4333b5860857ec168502d227d028b8c2f6d --- M Flow.php M FlowActions.php M container.php M handlebars/Makefile A handlebars/flow_block_topicsummary_edit_topic_summary.html.handlebars A handlebars/flow_block_topicsummary_edit_topic_summary.html.handlebars.php M includes/Block/TopicSummary.php A includes/Formatter/PostSummaryQuery.php M includes/Formatter/RevisionFormatter.php M includes/TemplateHelper.php 10 files changed, 190 insertions(+), 93 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Flow refs/changes/36/130636/1 diff --git a/Flow.php b/Flow.php index 00ac9b1..84cf6bd 100755 --- a/Flow.php +++ b/Flow.php @@ -177,6 +177,7 @@ $wgAutoloadClasses['Flow\Formatter\RecentChangesQuery'] = $dir . 'includes/Formatter/RecentChangesQuery.php'; $wgAutoloadClasses['Flow\Formatter\RecentChangesRow'] = $dir . 'includes/Formatter/RecentChangesQuery.php'; $wgAutoloadClasses['Flow\Formatter\SinglePostQuery'] = $dir . 'includes/Formatter/SinglePostQuery.php'; +$wgAutoloadClasses['Flow\Formatter\PostSummaryQuery'] = $dir . 'includes/Formatter/PostSummaryQuery.php'; $wgAutoloadClasses['Flow\Formatter\TopicListQuery'] = $dir . 'includes/Formatter/TopicListQuery.php'; $wgAutoloadClasses['Flow\Formatter\TopicHistoryQuery'] = $dir . 'includes/Formatter/TopicHistoryQuery.php'; $wgAutoloadClasses['Flow\Formatter\TopicRow'] = $dir . 'includes/Formatter/TopicRow.php'; diff --git a/FlowActions.php b/FlowActions.php index e2b2a6d..9278d98 100644 --- a/FlowActions.php +++ b/FlowActions.php @@ -83,6 +83,7 @@ ), 'button-method' => 'GET', 'links' => array( 'topic', 'topic-history' ), + 'actions' => array( 'edit-topic-summary' ), 'history' => array( 'i18n-message' => 'flow-rev-message-create-topic-summary', 'i18n-params' => array( @@ -107,6 +108,7 @@ ), 'button-method' => 'GET', 'links' => array( 'topic', 'topic-history', 'diff-post-summary' ), + 'actions' => array( 'edit-topic-summary' ), 'history' => array( 'i18n-message' => 'flow-rev-message-edit-topic-summary', 'i18n-params' => array( diff --git a/container.php b/container.php index 2191bf2..f922e29 100644 --- a/container.php +++ b/container.php @@ -638,6 +638,13 @@ $c['flow_actions'] ); } ); +$c['query.postsummary'] = $c->share( function( $c ) { + return new Flow\Formatter\PostSummaryQuery( + $c['storage'], + $c['repository.tree'], + $c['flow_actions'] + ); +} ); $c['formatter.recentchanges'] = $c->share( function( $c ) { return new Flow\Formatter\RecentChanges( $c['permissions'], diff --git a/handlebars/Makefile b/handlebars/Makefile index 32e970e..e0fb00e 100644 --- a/handlebars/Makefile +++ b/handlebars/Makefile @@ -9,6 +9,7 @@ flow_block_topiclist.html.handlebars.php \ flow_block_topic.html.handlebars.php \ flow_block_board-history.html.handlebars.php \ + flow_block_topicsummary_edit_topic_summary.html.handlebars.php \ flow_board.html.handlebars.php \ flow_post.html.handlebars.php \ timestamp.html.handlebars.php @@ -16,6 +17,9 @@ flow_block_header.html.handlebars.php: flow_block_header.html.handlebars $(COMPILE) flow_block_header +flow_block_topicsummary_edit_topic_summary.html.handlebars.php: flow_block_topicsummary_edit_topic_summary.html.handlebars + $(COMPILE) flow_block_topicsummary_edit_topic_summary + flow_board_collapsers_subcomponent.html.handlebars.php: flow_board_collapsers_subcomponent.html.handlebars $(COMPILE) flow_board_collapsers_subcomponent diff --git a/handlebars/flow_block_topicsummary_edit_topic_summary.html.handlebars b/handlebars/flow_block_topicsummary_edit_topic_summary.html.handlebars new file mode 100644 index 0000000..7946a51 --- /dev/null +++ b/handlebars/flow_block_topicsummary_edit_topic_summary.html.handlebars @@ -0,0 +1,30 @@ +<div class="flow-board-header"> + {{#if errors}} + <ul> + {{#each errors}} + <li>{{message}}</li> + {{/each}} + </ul> + {{/if}} + <form class="flow-edit-form" data-flow-initial-state="collapsed" method="POST" action="{{revision.actions.edit.url}}"> + <input type="hidden" name="wpEditToken" value="{{editToken}}" /> + {{#if revision.previousRevisionId}} + <input type="hidden" name="{{type}}_prev_revision" value="{{revision.previousRevisionId}}" /> + {{/if}} + <textarea name="{{type}}_summary" data-flow-expandable="true" class="mw-ui-input" type="text"> + {{~#if submitted && submitted.content~}} + {{~submitted.content~}} + {{~else~}} + {{~#if revision.revisionId~}} + {{~revision.content~}} + {{~/if~}} + {{~/if~}} + </textarea> + <div class="flow-form-actions flow-form-collapsible"> + <button data-role="submit" class="flow-ui-button flow-ui-constructive">{{l10n "Summarize"}}</button> + <button data-role="action" class="flow-ui-button flow-ui-progressive flow-ui-quiet">{{l10n "Preview"}}</button> + <button data-flow-interactive-handler="cancelForm" data-role="cancel" class="flow-ui-button flow-ui-destructive flow-ui-quiet">{{l10n "Cancel"}}</button> + <small class="flow-terms-of-use plainlinks">{{l10n "summarize_TOU"}}</small> + </div> + </form> +</div> diff --git a/handlebars/flow_block_topicsummary_edit_topic_summary.html.handlebars.php b/handlebars/flow_block_topicsummary_edit_topic_summary.html.handlebars.php new file mode 100644 index 0000000..997f3d0 --- /dev/null +++ b/handlebars/flow_block_topicsummary_edit_topic_summary.html.handlebars.php @@ -0,0 +1,40 @@ +<?php return function ($in) { + $cx = Array( + 'flags' => Array( + 'jstrue' => false, + 'jsobj' => false, + 'spvar' => true, + ), + 'helpers' => Array( 'l10n' => 'Flow\TemplateHelper::l10n', +), + 'blockhelpers' => Array(), + 'scopes' => Array($in), + 'sp_vars' => Array(), + 'path' => Array(), + + ); + return '<div class="flow-board-header"> + '.((LCRun2::ifvar(((is_array($in) && isset($in['errors'])) ? $in['errors'] : null))) ? ' + <ul> + '.LCRun2::sec(((is_array($in) && isset($in['errors'])) ? $in['errors'] : null), $cx, $in, true, function($cx, $in) {return ' + <li>'.htmlentities(((is_array($in) && isset($in['message'])) ? $in['message'] : null), ENT_QUOTES, 'UTF-8').'</li> + ';}).' + </ul> + ' : '').' + <form class="flow-edit-form" data-flow-initial-state="collapsed" method="POST" action="'.htmlentities(((is_array($in['revision']['actions']['edit']) && isset($in['revision']['actions']['edit']['url'])) ? $in['revision']['actions']['edit']['url'] : null), ENT_QUOTES, 'UTF-8').'"> + <input type="hidden" name="wpEditToken" value="'.htmlentities(((is_array($in) && isset($in['editToken'])) ? $in['editToken'] : null), ENT_QUOTES, 'UTF-8').'" /> + '.((LCRun2::ifvar(((is_array($in['revision']) && isset($in['revision']['previousRevisionId'])) ? $in['revision']['previousRevisionId'] : null))) ? ' + <input type="hidden" name="'.htmlentities(((is_array($in) && isset($in['type'])) ? $in['type'] : null), ENT_QUOTES, 'UTF-8').'_prev_revision" value="'.htmlentities(((is_array($in['revision']) && isset($in['revision']['previousRevisionId'])) ? $in['revision']['previousRevisionId'] : null), ENT_QUOTES, 'UTF-8').'" /> + ' : '').' + <textarea name="'.htmlentities(((is_array($in) && isset($in['type'])) ? $in['type'] : null), ENT_QUOTES, 'UTF-8').'_summary" data-flow-expandable="true" class="mw-ui-input" type="text">'.((LCRun2::ifvar(((is_array($in) && isset($in['submitted'])) ? $in['submitted'] : null))) ? ''.htmlentities(((is_array($in['submitted']) && isset($in['submitted']['content'])) ? $in['submitted']['content'] : null), ENT_QUOTES, 'UTF-8').'' : ''.((LCRun2::ifvar(((is_array($in['revision']) && isset($in['revision']['revisionId'])) ? $in['revision']['revisionId'] : null))) ? ''.htmlentities(((is_array($in['revision']) && isset($in['revision']['content'])) ? $in['revision']['content'] : null), ENT_QUOTES, 'UTF-8').'' : '').'').'</textarea> + <div class="flow-form-actions flow-form-collapsible"> + <button data-role="submit" class="flow-ui-button flow-ui-constructive">'.LCRun2::ch('l10n', Array('Summarize'), 'enc', $cx).'</button> + <button data-role="action" class="flow-ui-button flow-ui-progressive flow-ui-quiet">'.LCRun2::ch('l10n', Array('Preview'), 'enc', $cx).'</button> + <button data-flow-interactive-handler="cancelForm" data-role="cancel" class="flow-ui-button flow-ui-destructive flow-ui-quiet">'.LCRun2::ch('l10n', Array('Cancel'), 'enc', $cx).'</button> + <small class="flow-terms-of-use plainlinks">'.LCRun2::ch('l10n', Array('summarize_TOU'), 'enc', $cx).'</small> + </div> + </form> +</div> +'; +} +?> \ No newline at end of file diff --git a/includes/Block/TopicSummary.php b/includes/Block/TopicSummary.php index 134bca6..42f8acd 100644 --- a/includes/Block/TopicSummary.php +++ b/includes/Block/TopicSummary.php @@ -22,6 +22,11 @@ protected $topicSummary; /** + * @var stdClass + */ + protected $formatterRow; + + /** * Allows or denies actions to be performed * * @var RevisionActionPermissions @@ -48,11 +53,16 @@ */ protected $supportedGetActions = array( 'topic-summary-view', 'compare-postsummary-revisions', 'edit-topic-summary' ); + /** + * @var string[] + */ + protected $requiresWikitext = array( 'edit-topic-summary' ); + // @Todo - fill in the template names protected $templates = array( 'topic-summary-view' => '', 'compare-postsummary-revisions' => '', - 'edit-topic-summary' => '', + 'edit-topic-summary' => 'edit_topic_summary', ); /** @@ -64,13 +74,9 @@ $this->permissions = new RevisionActionPermissions( Container::get( 'flow_actions' ), $user ); if ( !$this->workflow->isNew() ) { - $found = $this->storage->find( - 'PostSummary', - array( 'rev_type_id' => $this->workflow->getId() ), - array( 'sort' => 'rev_id', 'order' => 'DESC', 'limit' => 1 ) - ); - if ( $found ) { - $this->topicSummary = reset( $found ); + $this->formatterRow = Container::get( 'query.postsummary' )->getResult( $this->workflow->getId() ); + if ( $this->formatterRow ) { + $this->topicSummary = $this->formatterRow->revision; } } } @@ -238,67 +244,10 @@ * Render for an action * @param Templating * @param array - * @throws InvalidActionException + * @throws InvalidInputException */ public function render( Templating $templating, array $options, $return = false ) { - $output = $templating->getOutput(); - $output->addModuleStyles( array( 'ext.flow.discussion.styles', 'ext.flow.moderation' ) ); - $output->addModules( array( 'ext.flow.discussion' ) ); - $title = $templating->getContent( $this->findTopicTitle(), 'wikitext' ); - $output->setHtmlTitle( $title ); - $output->setPageTitle( $title ); - - $prefix = $templating->render( - 'flow:topic-permalink-warning.html.php', - array( - 'block' => $this, - ), - $return - ); - - switch( $this->action ) { - case 'compare-postsummary-revisions': - if ( !isset( $options['newRevision'] ) ) { - throw new InvalidInputException( 'A revision must be provided for comparison', 'revision-comparison' ); - } - $revisionView = PostSummaryRevisionView::newFromId( $options['newRevision'], $templating, $this, $this->user ); - if ( !$revisionView ) { - throw new InvalidInputException( 'An invalid revision was provided for comparison', 'revision-comparison' ); - } - - if ( isset( $options['oldRevision'] ) ) { - return $prefix . $revisionView->renderDiffViewAgainst( $options['oldRevision'], $return ); - } else { - return $prefix . $revisionView->renderDiffViewAgainstPrevious( $return ); - } - break; - - case 'topic-summary-view': - $revisionView = null; - if ( isset( $options['revId'] ) ) { - $revisionView = PostSummaryRevisionView::newFromId( $options['revId'], $templating, $this, $this->user ); - } - if ( !$revisionView ) { - throw new InvalidInputException( 'The requested revision could not be found', 'missing-revision' ); - } else if ( !$this->permissions->isAllowed( $revisionView->getRevision(), 'view' ) ) { - $this->addError( 'moderation', wfMessage( 'flow-error-not-allowed' ) ); - return null; - } - return $prefix . $revisionView->renderSingleView( $return ); - break; - - case 'edit-topic-summary': - return $templating->render( 'flow:edit-topic-summary.html.php', array( - 'block' => $this, - 'workflow' => $this->getWorkflow(), - 'topicSummary' => $this->topicSummary, - 'user' => $this->user, - ), $return ); - break; - - default: - throw new InvalidActionException( "Unexpected action: {$this->action}", 'invalid-action' ); - } + throw new InvalidInputException( 'deprecated' ); } /** @@ -309,27 +258,44 @@ * @return array */ public function renderAPI( Templating $templating, array $options ) { - $output = array( 'type' => 'topicsummary' ); + $output = array( + 'type' => $this->getName(), + 'editToken' => $this->getEditToken() + ); - if ( $this->topicSummary !== null ) { - if ( isset( $options['contentFormat'] ) ) { - $contentFormat = $options['contentFormat']; - } else { - $contentFormat = $this->topicSummary->getContentFormat(); - } - - $output['format'] = $contentFormat; - $output['*'] = $templating->getContent( $this->topicSummary, $contentFormat ); - $output['topicsummary-id'] = $this->topicSummary->getRevisionId()->getAlphadecimal(); - } else { - $output['*'] = ''; - $output['topicsummary-id'] = ''; + if ( $this->wasSubmitted() ) { + $output += array( + 'submitted' => $this->submitted, + 'errors' => $this->errors, + ); } - return array( - '_element' => 'topicsummary', - 0 => $output, - ); + $formatter = Container::get( 'formatter.revision' ); + if ( in_array( $this->action, $this->requiresWikitext ) ) { + $formatter->setContentFormat( 'wikitext' ); + } + switch ( $this->action ) { + case 'topic-summary-view': + case 'edit-topic-summary': + if ( $this->formatterRow ) { + $output += array( + 'revision' => $formatter->formatApi( + $this->formatterRow, \RequestContext::getMain() + ) + ); + } else { + $fakeSummary = PostSummary::create( $this->findTopicTitle(), $this->user, 'fake content', 'create-topic-summary' ); + $fakeFormatterRow = new \Flow\Formatter\FormatterRow(); + $fakeFormatterRow->revision = $fakeSummary; + $serialized = $formatter->formatApi( $fakeFormatterRow, \RequestContext::getMain() ); + $output['revision']['actions']['edit']['url'] = $serialized['actions']['edit']['url']; + } + break; + + default: + throw new InvalidActionException( "Unexpected action: {$this->action}", 'invalid-action' ); + } + return $output; } public function getName() { diff --git a/includes/Formatter/PostSummaryQuery.php b/includes/Formatter/PostSummaryQuery.php new file mode 100644 index 0000000..f926d7e --- /dev/null +++ b/includes/Formatter/PostSummaryQuery.php @@ -0,0 +1,27 @@ +<?php + +namespace Flow\Formatter; + +use Flow\Exception\InvalidDataException; +use Flow\Model\UUID; + +class PostSummaryQuery extends AbstractQuery { + /** + * @param UUID[] $postIds + * @return FormatterRow + */ + public function getResult( UUID $postId ) { + $section = new \ProfileSection( __METHOD__ ); + $found = $this->storage->find( + 'PostSummary', + array( 'rev_type_id' => $postId ), + array( 'sort' => 'rev_id', 'order' => 'DESC', 'limit' => 1 ) + ); + if ( !$found ) { + return null; + } + $this->loadMetadataBatch( $found ); + + return $this->buildResult( reset( $found ), null ); + } +} diff --git a/includes/Formatter/RevisionFormatter.php b/includes/Formatter/RevisionFormatter.php index b50f612..a02ea89 100644 --- a/includes/Formatter/RevisionFormatter.php +++ b/includes/Formatter/RevisionFormatter.php @@ -292,6 +292,18 @@ ); break; + case 'edit-topic-summary': + $links['edit'] = array( + 'url' => $this->urlGenerator->buildUrl( + $title, + 'edit-topic-summary', + array( + 'workflow' => $workflowId, + ) + ), + 'title' => $this->msg( 'flow-summarize-topic-submit' ) + ); + break; case 'edit-header': $links['edit'] = array( 'url' => $this->urlGenerator->buildUrl( @@ -580,8 +592,8 @@ $title, 'compare-header-revisions', array( - 'workflow' => $workflowId->getAlphadecimal(), - 'header_newRevision' => $revId->getAlphadecimal(), + 'workflow' => $workflowId, + 'header_newRevision' => $revId, ) ), 'title' => $this->msg( 'diff' ) @@ -614,9 +626,9 @@ $title, 'compare-header-revisions', array( - 'workflow' => $workflowId->getAlphadecimal(), - 'header_newRevision' => $cur->getRevisionId()->getAlphadecimal(), - 'header_oldRevision' => $revId->getAlphadecimal(), + 'workflow' => $workflowId, + 'header_newRevision' => $cur->getRevisionId(), + 'header_oldRevision' => $revId, ) ), 'title' => $this->msg( 'cur' ) @@ -639,8 +651,8 @@ $title, 'compare-post-revisions', array( - 'workflow' => $workflowId->getAlphadecimal(), - 'topic_newRevision' => $revId->getAlphadecimal(), + 'workflow' => $workflowId, + 'topic_newRevision' => $revId, ) ), 'title' => $this->msg( 'diff' ) @@ -674,7 +686,7 @@ 'compare-post-revisions', array( 'workflow' => $workflowId, - 'topic_newRevision' => $cur->getRevisionId()->getAlphadecimal(), + 'topic_newRevision' => $cur->getRevisionId(), 'topic_oldRevision' => $revId, ) ), diff --git a/includes/TemplateHelper.php b/includes/TemplateHelper.php index 382e932..d2d19aa 100644 --- a/includes/TemplateHelper.php +++ b/includes/TemplateHelper.php @@ -168,6 +168,10 @@ $str = 'flow-load-more'; break; + case 'Summarize': + $str = 'flow-summarize-topic-submit'; + break; + case 'block': $str = 'blocklink'; break; @@ -253,6 +257,10 @@ $str = 'flow-terms-of-use-reply'; break; + case 'summarize_TOU': + $str = 'flow-terms-of-use-summarize'; + break; + case '_time': break; -- To view, visit https://gerrit.wikimedia.org/r/130636 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I3b13a4333b5860857ec168502d227d028b8c2f6d Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/Flow Gerrit-Branch: master Gerrit-Owner: Bsitu <bs...@wikimedia.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits