public function onAfterInsert($revision, array $new, array $metadata)
 {
     if (!$revision instanceof AbstractRevision) {
         throw new InvalidDataException('EditCountListener can only attach to AbstractRevision storage');
     }
     $action = $revision->getChangeType();
     $increase = $this->actions->getValue($action, 'editcount');
     if ($increase) {
         $revision->getUser()->incEditCount();
     }
 }
 /**
  * @param PostRevision $post
  * @param string $action
  * @return string
  */
 public function getLogType(PostRevision $post, $action)
 {
     $logType = $this->actions->getValue($action, 'log_type');
     if ($logType instanceof Closure) {
         $logType = $logType($post, $this);
     }
     return $logType;
 }
 protected function addModules(OutputPage $out, $action)
 {
     if ($this->actions->hasValue($action, 'modules')) {
         $out->addModuleStyles($this->actions->getValue($action, 'modules'));
     } else {
         $out->addModules(array('ext.flow'));
     }
     if ($this->actions->hasValue($action, 'moduleStyles')) {
         $out->addModuleStyles($this->actions->getValue($action, 'moduleStyles'));
     } else {
         $out->addModuleStyles(array('mediawiki.ui', 'mediawiki.ui.anchor', 'mediawiki.ui.button', 'mediawiki.ui.input', 'mediawiki.ui.icon', 'mediawiki.ui.text', 'ext.flow.styles.base', 'ext.flow.mediawiki.ui.tooltips', 'ext.flow.mediawiki.ui.form', 'ext.flow.mediawiki.ui.modal', 'ext.flow.mediawiki.ui.text', 'oojs-ui.styles.icons', 'oojs-ui.styles.icons-layout', 'oojs-ui.styles.icons-interactions', 'ext.flow.board.styles', 'ext.flow.board.topic.styles', 'oojs-ui.styles.icons', 'oojs-ui.styles.icons-alerts', 'oojs-ui.styles.icons-content', 'oojs-ui.styles.icons-layout', 'oojs-ui.styles.icons-movement', 'oojs-ui.styles.icons-indicators', 'oojs-ui.styles.icons-editing-core', 'oojs-ui.styles.icons-moderation', 'oojs-ui.styles.textures'));
     }
     // Add Parsoid modules if necessary
     Parsoid\Utils::onFlowAddModules($out);
     // Allow other extensions to add modules
     Hooks::run('FlowAddModules', array($out));
 }
 /**
  * @param AbstractRevision $revision
  * @param string $action
  * @return bool
  */
 public function isAllowed(AbstractRevision $revision, $action)
 {
     $allowed = $this->actions->getValue($action, 'rc_insert');
     if ($allowed instanceof Closure) {
         $allowed = $allowed($revision, $this);
     }
     return (bool) $allowed;
 }
 /**
  * Determines if a flow record should be displayed in Special:Watchlist
  *
  * @param array $changeData
  * @return bool
  */
 protected function isRecordHidden(array $changeData)
 {
     if ($this->extendWatchlist) {
         return false;
     }
     // Check for legacy action names and convert it
     $alias = $this->actions->getValue($changeData['action']);
     if (is_string($alias)) {
         $action = $alias;
     } else {
         $action = $changeData['action'];
     }
     // * Display the most recent new post, edit post, edit title for a topic
     // * Display the most recent header edit
     // * Display all new topic and moderation actions
     switch ($action) {
         case 'create-header':
         case 'edit-header':
             if (isset($this->displayStatus['header-' . $changeData['workflow']]) && $this->displayStatus['header-' . $changeData['workflow']] !== $changeData['revision']) {
                 return true;
             }
             $this->displayStatus['header-' . $changeData['workflow']] = $changeData['revision'];
             break;
         case 'hide-post':
         case 'hide-topic':
         case 'delete-post':
         case 'delete-topic':
         case 'suppress-post':
         case 'suppress-topic':
         case 'restore-post':
         case 'restore-topic':
         case 'lock-topic':
             // moderation actions are always shown when visible to the user
             return false;
         case 'new-topic':
         case 'reply':
         case 'edit-post':
         case 'edit-title':
         case 'create-topic-summary':
         case 'edit-topic-summary':
             if (isset($this->displayStatus['topic-' . $changeData['workflow']]) && $this->displayStatus['topic-' . $changeData['workflow']] !== $changeData['revision']) {
                 return true;
             }
             $this->displayStatus['topic-' . $changeData['workflow']] = $changeData['revision'];
             break;
     }
     return false;
 }
 /**
  * Returns the permission specified in FlowActions for the given action
  * against the given revision's moderation state.
  *
  * @param AbstractRevision|null $revision
  * @param string $action
  * @param string $type
  * @return Closure|string
  */
 public function getPermission(AbstractRevision $revision = null, $action, $type = 'permissions')
 {
     // $revision may be null if the revision has yet to be created
     $moderationState = AbstractRevision::MODERATED_NONE;
     if ($revision !== null) {
         $moderationState = $revision->getModerationState();
     }
     $permission = $this->actions->getValue($action, $type, $moderationState);
     // Some permissions may be more complex to be defined as simple array
     // values, in which case they're a Closure (which will accept
     // AbstractRevision & FlowActionPermissions as arguments)
     if ($permission instanceof Closure) {
         $permission = $permission($revision, $this);
     }
     return $permission;
 }
 /**
  * @param AbstractRevision $revision
  * @return bool
  */
 private function excludeFromHistory(AbstractRevision $revision)
 {
     return (bool) $this->actions->getValue($revision->getChangeType(), 'exclude_from_history');
 }
 /**
  * @param AbstractRevision $revision
  * @return bool
  */
 private function excludeFromContributions(AbstractRevision $revision)
 {
     return (bool) $this->actions->getValue($revision->getChangeType(), 'exclude_from_contributions');
 }
 public function testAliasedTopLevelValues()
 {
     $actions = new FlowActions(array('something' => 'aliased', 'aliased' => array('real' => 'value')));
     $this->assertEquals('value', $actions->getValue('something', 'real'));
 }
 /**
  * @param array $data
  * @param FlowActions $actions
  * @param string $changeType
  * @return array
  */
 protected function getDescriptionParams(array $data, FlowActions $actions, $changeType)
 {
     $source = $actions->getValue($changeType, 'history', 'i18n-params');
     $params = array();
     foreach ($source as $param) {
         if (isset($data['properties'][$param])) {
             $params[] = $data['properties'][$param];
         } else {
             wfDebugLog('Flow', __METHOD__ . ": Missing expected parameter {$param} for change type {$changeType}");
             $params[] = '';
         }
     }
     return $params;
 }