name = $name; if ( $className ) { $className .= ' '; } $className .= 'menu__item--' . $name; $this->attributes = [ 'text' => $text, 'href' => $url, 'class' => $className ]; } /** * Create a Single Menu entry with text, icon and active click tracking * * @param string $name Entry identifier * @param string $text Entry label * @param string $url The URL entry points to * @param string $className Optional HTML classes * @return static */ public static function create( $name, $text, $url, $className = '' ) { $entry = new static( $name, $text, $url, $className ); $entry->trackClicks( $name ); $entry->setIcon( $name ); return $entry; } /** * @inheritDoc */ public function getName() { return $this->name; } /** * @inheritDoc */ public function getCSSClasses(): array { return $this->isJSOnly ? [ 'jsonly' ] : []; } /** * @inheritDoc */ public function getComponents(): array { return [ $this->attributes ]; } /** * @param string $eventName Should clicks be tracked. To override the tracking code * pass the tracking code as string * @return $this */ public function trackClicks( $eventName ) { $this->attributes['data-event-name'] = 'menu.' . $eventName; return $this; } /** * Set the Menu entry icon * @param string|null $iconName Icon name * @param string $iconType Icon type * @param string $additionalClassNames Additional classes * @param string $iconPrefix either `wikimedia` or `minerva` * @return $this */ public function setIcon( $iconName, $iconType = 'before', $additionalClassNames = '', $iconPrefix = 'minerva' ) { $this->attributes['class'] .= ' ' . MinervaUI::iconClass( $iconName, $iconType, $additionalClassNames, $iconPrefix ); return $this; } /** * Set the menu entry title * @param Message $message Title message * @return $this */ public function setTitle( Message $message ): self { $this->attributes['title'] = $message->escaped(); return $this; } /** * Set the Menu entry ID html attribute * @param string $nodeID * @return $this */ public function setNodeID( $nodeID ): self { $this->attributes['id'] = $nodeID; return $this; } /** * Mark entry as JS only. */ public function setJSOnly() { $this->isJSOnly = true; } }