@@ -25,51 +25,129 @@ public function buildNav() {
25
25
26
26
foreach ($ applications as $ key => $ application ) {
27
27
if (!$ application ->shouldAppearInLaunchView ()) {
28
+ // Remove hidden applications (usually internal stuff).
29
+ unset($ applications [$ key ]);
30
+ }
31
+ $ invisible = PhabricatorApplication::TILE_INVISIBLE ;
32
+ if ($ application ->getDefaultTileDisplay ($ user ) == $ invisible ) {
33
+ // Remove invisible applications (e.g., admin apps for non-admins).
28
34
unset($ applications [$ key ]);
29
35
}
30
36
}
31
37
32
- $ groups = PhabricatorApplication::getApplicationGroups ();
38
+ $ status = array ();
39
+ foreach ($ applications as $ key => $ application ) {
40
+ $ status [get_class ($ application )] = $ application ->loadStatus ($ user );
41
+ }
33
42
34
- $ applications = msort ($ applications , 'getApplicationOrder ' );
35
- $ applications = mgroup ($ applications , 'getApplicationGroup ' );
36
- $ applications = array_select_keys ($ applications , array_keys ($ groups ));
43
+ $ tile_groups = array ();
44
+ $ prefs = $ user ->loadPreferences ()->getPreference (
45
+ PhabricatorUserPreferences::PREFERENCE_APP_TILES ,
46
+ array ());
47
+ foreach ($ applications as $ key => $ application ) {
48
+ $ display = idx (
49
+ $ prefs ,
50
+ get_class ($ application ),
51
+ $ application ->getDefaultTileDisplay ($ user ));
52
+ $ tile_groups [$ display ][] = $ application ;
53
+ }
37
54
38
- $ view = array ();
39
- foreach ($ applications as $ group => $ application_list ) {
40
- $ status = array ();
41
- foreach ($ application_list as $ key => $ application ) {
42
- $ status [$ key ] = $ application ->loadStatus ($ user );
55
+ $ tile_groups = array_select_keys (
56
+ $ tile_groups ,
57
+ array (
58
+ PhabricatorApplication::TILE_FULL ,
59
+ PhabricatorApplication::TILE_SHOW ,
60
+ PhabricatorApplication::TILE_HIDE ,
61
+ ));
62
+
63
+ foreach ($ tile_groups as $ tile_display => $ tile_group ) {
64
+ if (!$ tile_group ) {
65
+ continue ;
43
66
}
44
67
45
- $ views = array ();
46
- foreach ($ application_list as $ key => $ application ) {
47
- $ tile = id (new PhabricatorApplicationLaunchView ())
48
- ->setApplication ($ application )
49
- ->setApplicationStatus (idx ($ status , $ key , array ()))
50
- ->setUser ($ user );
68
+ $ tile_group = msort ($ tile_group , 'getApplicationOrder ' );
51
69
52
- if ($ group == PhabricatorApplication::GROUP_CORE ) {
53
- $ tile ->setFullWidth (true );
54
- }
70
+ $ is_small_tiles = ($ tile_display == PhabricatorApplication::TILE_SHOW ) ||
71
+ ($ tile_display == PhabricatorApplication::TILE_HIDE );
55
72
56
- $ views [] = $ tile ;
73
+ if ($ is_small_tiles ) {
74
+ $ groups = PhabricatorApplication::getApplicationGroups ();
75
+ $ tile_group = mgroup ($ tile_group , 'getApplicationGroup ' );
76
+ $ tile_group = array_select_keys ($ tile_group , array_keys ($ groups ));
77
+ } else {
78
+ $ tile_group = array ($ tile_group );
57
79
}
58
80
59
- while (count ($ views ) % 4 ) {
60
- $ views [] = id (new PhabricatorApplicationLaunchView ());
81
+ $ is_hide = ($ tile_display == PhabricatorApplication::TILE_HIDE );
82
+ if ($ is_hide ) {
83
+ $ show_item_id = celerity_generate_unique_node_id ();
84
+ $ show_tiles_id = celerity_generate_unique_node_id ();
85
+
86
+ $ show_item = id (new PhabricatorMenuItemView ())
87
+ ->setName (pht ('Show More Applications ' ))
88
+ ->setHref ('# ' )
89
+ ->addSigil ('home-show-applications ' )
90
+ ->setID ($ show_item_id );
91
+
92
+ $ hide_item = id (new PhabricatorMenuItemView ())
93
+ ->setName (pht ('Show Fewer Applications ' ))
94
+ ->setHref ('# ' )
95
+ ->addSigil ('home-hide-applications ' );
96
+
97
+ $ nav ->addMenuItem ($ show_item );
98
+ $ nav ->addCustomBlock (
99
+ '<div ' .
100
+ 'id=" ' .phutil_escape_html ($ show_tiles_id ).'" ' .
101
+ 'style="display: none;"> ' );
102
+
103
+ Javelin::initBehavior ('phabricator-home-reveal-tiles ' , array (
104
+ 'tilesID ' => $ show_tiles_id ,
105
+ 'showID ' => $ show_item_id ,
106
+ ));
61
107
}
62
108
63
- $ nav ->addLabel ($ groups [$ group ]);
64
- $ nav ->addCustomBlock (
65
- phutil_render_tag (
66
- 'div ' ,
67
- array (
68
- 'class ' => 'application-tile-group ' ,
69
- ),
70
- id (new AphrontNullView ())->appendChild ($ views )->render ()));
109
+ foreach ($ tile_group as $ group => $ application_list ) {
110
+ $ tiles = array ();
111
+ foreach ($ application_list as $ key => $ application ) {
112
+ $ tile = id (new PhabricatorApplicationLaunchView ())
113
+ ->setApplication ($ application )
114
+ ->setApplicationStatus (
115
+ idx ($ status , get_class ($ application ), array ()))
116
+ ->setUser ($ user );
117
+
118
+ if ($ tile_display == PhabricatorApplication::TILE_FULL ) {
119
+ $ tile ->setFullWidth (true );
120
+ }
121
+
122
+ $ tiles [] = $ tile ;
123
+ }
124
+
125
+ if ($ is_small_tiles ) {
126
+ while (count ($ tiles ) % 4 ) {
127
+ $ tiles [] = id (new PhabricatorApplicationLaunchView ());
128
+ }
129
+ $ nav ->addLabel ($ groups [$ group ]);
130
+ }
131
+ $ nav ->addCustomBlock (
132
+ phutil_render_tag (
133
+ 'div ' ,
134
+ array (
135
+ 'class ' => 'application-tile-group ' ,
136
+ ),
137
+ id (new AphrontNullView ())->appendChild ($ tiles )->render ()));
138
+ }
139
+
140
+ $ is_hide = ($ tile_display == PhabricatorApplication::TILE_HIDE );
141
+ if ($ is_hide ) {
142
+ $ nav ->addMenuItem ($ hide_item );
143
+ $ nav ->addCustomBlock ('</div> ' );
144
+ }
71
145
}
72
146
147
+ $ nav ->addFilter (
148
+ '' ,
149
+ pht ('Customize Applications... ' ),
150
+ '/settings/panel/home/ ' );
73
151
$ nav ->addClass ('phabricator-side-menu-home ' );
74
152
$ nav ->selectFilter (null );
75
153
0 commit comments