@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.)
hq.recaptime.dev/wiki/Phorge
phorge
phabricator
1<?php
2
3final class PhabricatorFileIconSetSelectController
4 extends PhabricatorFileController {
5
6 public function handleRequest(AphrontRequest $request) {
7 $key = $request->getURIData('key');
8
9 $set = PhabricatorIconSet::getIconSetByKey($key);
10 if (!$set) {
11 return new Aphront404Response();
12 }
13
14 $v_icon = $request->getStr('icon');
15 if ($request->isFormPost()) {
16 $icon = $set->getIcon($v_icon);
17
18 if ($icon) {
19 $payload = array(
20 'value' => $icon->getKey(),
21 'display' => $set->renderIconForControl($icon),
22 );
23
24 return id(new AphrontAjaxResponse())
25 ->setContent($payload);
26 }
27 }
28
29 require_celerity_resource('phui-icon-set-selector-css');
30 Javelin::initBehavior('phabricator-tooltips');
31
32 $ii = 0;
33 $buttons = array();
34 $breakpoint = ceil(sqrt(count($set->getIcons())));
35 foreach ($set->getIcons() as $icon) {
36 $label = $icon->getLabel();
37
38 $view = id(new PHUIIconView())
39 ->setIcon($icon->getIcon());
40
41 $classes = array();
42 $classes[] = 'icon-button';
43
44 $is_selected = ($icon->getKey() == $v_icon);
45
46 if ($is_selected) {
47 $classes[] = 'selected';
48 }
49
50 $is_disabled = $icon->getIsDisabled();
51 if ($is_disabled && !$is_selected) {
52 continue;
53 }
54
55 $aural = javelin_tag(
56 'span',
57 array(
58 'aural' => true,
59 ),
60 pht('Choose "%s" Icon', $label));
61
62 $buttons[] = javelin_tag(
63 'button',
64 array(
65 'class' => implode(' ', $classes),
66 'name' => 'icon',
67 'value' => $icon->getKey(),
68 'type' => 'submit',
69 'sigil' => 'has-tooltip',
70 'meta' => array(
71 'tip' => $label,
72 ),
73 ),
74 array(
75 $aural,
76 $view,
77 ));
78
79 if ((++$ii % $breakpoint) == 0) {
80 $buttons[] = phutil_tag('br');
81 }
82 }
83
84 $buttons = phutil_tag(
85 'div',
86 array(
87 'class' => 'icon-grid',
88 ),
89 $buttons);
90
91 $dialog_title = $set->getSelectIconTitleText();
92
93 return $this->newDialog()
94 ->setTitle($dialog_title)
95 ->appendChild($buttons)
96 ->addCancelButton('/');
97 }
98
99}