Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 58
0.00% covered (danger)
0.00%
0 / 5
CRAP
0.00% covered (danger)
0.00%
0 / 1
Hooks
0.00% covered (danger)
0.00%
0 / 58
0.00% covered (danger)
0.00%
0 / 5
306
0.00% covered (danger)
0.00%
0 / 1
 getUploadsTitle
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 makePersonalUploadsLink
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 1
2
 onSkinTemplateNavigation__Universal
0.00% covered (danger)
0.00%
0 / 16
0.00% covered (danger)
0.00%
0 / 1
56
 makeRelevantUserUploadsLink
0.00% covered (danger)
0.00%
0 / 14
0.00% covered (danger)
0.00%
0 / 1
6
 onSidebarBeforeOutput
0.00% covered (danger)
0.00%
0 / 16
0.00% covered (danger)
0.00%
0 / 1
42
1<?php
2/**
3 * Add a link to user's personal uploads to personal tools menu.
4 *
5 * https://www.mediawiki.org/wiki/Extension:UploadsLink
6 *
7 * @file
8 * @license MIT
9 */
10
11// phpcs:disable MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName
12
13namespace MediaWiki\Extension\UploadsLink;
14
15use MediaWiki\Hook\SidebarBeforeOutputHook;
16use MediaWiki\Hook\SkinTemplateNavigation__UniversalHook;
17use MediaWiki\SpecialPage\SpecialPage;
18use MediaWiki\Title\Title;
19use Skin;
20
21class Hooks implements
22    SkinTemplateNavigation__UniversalHook,
23    SidebarBeforeOutputHook
24{
25    /**
26     * Return a Title for the uploads page of the user provided.
27     *
28     * @param string $username
29     * @return Title
30     */
31    private static function getUploadsTitle( $username ) {
32        return SpecialPage::getTitleFor( 'Listfiles', $username );
33    }
34
35    /**
36     * Return a link descriptor for the page where the current user's uploads listing is,
37     * relative to current title and in current language.
38     *
39     * @param Skin $skin For context
40     * @return array Link descriptor in a format accepted by PersonalUrls hook
41     */
42    private static function makePersonalUploadsLink( Skin $skin ) {
43        $currentTitle = $skin->getTitle();
44
45        $username = $skin->getUser()->getName();
46        $title = self::getUploadsTitle( $username );
47
48        $href = $title->getLocalURL( [ 'ilshowall' => '1' ] );
49
50        return [
51            'id' => 'pt-uploads',
52            'icon' => 'imageGallery',
53            'text' => $skin->msg( 'uploadslink-portlet-label' )->text(),
54            'href' => $href,
55            'active' => $title->equals( $currentTitle ),
56        ];
57    }
58
59    /**
60     * PersonalUrls hook handler.
61     *
62     * Possibly add a link to the page where the current user's uploads listing
63     * is to personal tools menu.
64     *
65     * @param Skin $skin
66     * @param array &$links
67     */
68    public function onSkinTemplateNavigation__Universal( $skin, &$links ): void {
69        global $wgUploadsLinkDisableAnon, $wgUploadsLinkEnablePersonalLink;
70
71        if ( !$wgUploadsLinkEnablePersonalLink
72            || ( $wgUploadsLinkDisableAnon && !$skin->getUser()->isNamed() ) ) {
73                return;
74        }
75
76        $link = self::makePersonalUploadsLink( $skin );
77
78        $newPersonalUrls = [];
79        $done = false;
80        $personalUrls = $links['user-menu'] ?? [];
81
82        // Insert our link before the link to user contribs.
83        // If the link to contribs is missing, insert at the end.
84        foreach ( $personalUrls as $key => $value ) {
85            if ( $key === 'mycontris' ) {
86                $newPersonalUrls['uploads'] = $link;
87                $done = true;
88            }
89            $newPersonalUrls[$key] = $value;
90        }
91        if ( !$done ) {
92            $newPersonalUrls['uploads'] = $link;
93        }
94
95        $links['user-menu'] = $newPersonalUrls;
96    }
97
98    /**
99     * Return a link descriptor for the page where the relevant user's uploads listing is,
100     * relative to current title and in current language.
101     *
102     * @param Skin $skin For context
103     * @return array|null Link descriptor or null if link cannot be created
104     */
105    private static function makeRelevantUserUploadsLink( Skin $skin ) {
106        $user = $skin->getRelevantUser();
107        if ( !$user ) {
108            return null;
109        }
110
111        $rootUser = $user->getName();
112        $title = self::getUploadsTitle( $rootUser );
113
114        $currentTitle = $skin->getTitle();
115
116        $href = $title->getLocalURL( [ 'ilshowall' => '1' ] );
117
118        // Although the user name might not be used in the message directly,
119        // it is used to distinguish between feminine and masculine form
120        // in some languages.
121        return [
122            'id' => 'tb-uploads',
123            'text' => $skin->msg( 'uploadslink-toobox-label' )->params( $rootUser )->text(),
124            'href' => $href,
125            'active' => $title->equals( $currentTitle ),
126            'tooltip-params' => [ $rootUser ],
127        ];
128    }
129
130    /**
131     * SidebarBeforeOutput hook handler.
132     *
133     * Possibly add a link to the page where the relevant user's uploads listing
134     * is to toolbox menu.
135     *
136     * @param Skin $skin
137     * @param array &$sidebar
138     * @return void
139     */
140    public function onSidebarBeforeOutput( $skin, &$sidebar ): void {
141        global $wgUploadsLinkEnableRelevantUserLink;
142
143        if ( !$wgUploadsLinkEnableRelevantUserLink ) {
144            return;
145        }
146
147        $link = self::makeRelevantUserUploadsLink( $skin );
148        if ( !$link ) {
149            return;
150        }
151
152        $newToolbox = [];
153        $done = false;
154
155        // Insert our link before the link to user contribs.
156        foreach ( $sidebar['TOOLBOX'] as $key => $value ) {
157            if ( $key === 'contributions' ) {
158                $newToolbox['uploads'] = $link;
159                $done = true;
160            }
161            $newToolbox[$key] = $value;
162        }
163
164        $sidebar['TOOLBOX'] = $newToolbox;
165
166        if ( !$done ) {
167            // If the link was not inserted, just insert it at the end.
168            $sidebar['TOOLBOX']['uploads'] = $link;
169        }
170    }
171}