@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
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'master' into redesign

+813 -485
+7
conf/default.conf.php
··· 992 992 'bash' => 'Bash Scripting', 993 993 'brainfuck' => 'Brainf*ck', 994 994 'c' => 'C', 995 + 'coffee-script' => 'CoffeeScript', 995 996 'cpp' => 'C++', 996 997 'css' => 'CSS', 997 998 'd' => 'D', ··· 999 1000 'django' => 'Django Templating', 1000 1001 'erb' => 'Embedded Ruby/ERB', 1001 1002 'erlang' => 'Erlang', 1003 + 'go' => 'Golang', 1004 + 'groovy' => 'Groovy', 1002 1005 'haskell' => 'Haskell', 1003 1006 'html' => 'HTML', 1004 1007 'java' => 'Java', 1005 1008 'js' => 'Javascript', 1009 + 'json' => 'JSON', 1006 1010 'mysql' => 'MySQL', 1007 1011 'objc' => 'Objective-C', 1008 1012 'perl' => 'Perl', 1009 1013 'php' => 'PHP', 1014 + 'puppet' => 'Puppet', 1010 1015 'rest' => 'reStructuredText', 1011 1016 'text' => 'Plain Text', 1012 1017 'python' => 'Python', ··· 1014 1019 'remarkup' => 'Remarkup', 1015 1020 'ruby' => 'Ruby', 1016 1021 'xml' => 'XML', 1022 + 'yaml' => 'YAML', 1017 1023 ), 1018 1024 1019 1025 // This is an override list of regular expressions which allows you to choose ··· 1035 1041 // '@\\.([^.]+)\\.bak$@' => 1, 1036 1042 1037 1043 '@\.arcconfig$@' => 'js', 1044 + '@\.arclint$@' => 'js', 1038 1045 '@\.divinerconfig$@' => 'js', 1039 1046 ), 1040 1047
+44 -47
resources/celerity/map.php
··· 7 7 return array( 8 8 'names' => 9 9 array( 10 - 'core.pkg.css' => 'ac63f8ac', 10 + 'core.pkg.css' => 'c94a698c', 11 11 'core.pkg.js' => '7db41c19', 12 12 'darkconsole.pkg.js' => 'ca8671ce', 13 13 'differential.pkg.css' => 'fbf57382', ··· 64 64 'rsrc/css/application/diffusion/commit-view.css' => '92d1e8f9', 65 65 'rsrc/css/application/diffusion/diffusion-icons.css' => '384a0f7d', 66 66 'rsrc/css/application/diffusion/diffusion-source.css' => '66fdf661', 67 - 'rsrc/css/application/directory/phabricator-jump-nav.css' => 'f0c5e726', 68 67 'rsrc/css/application/feed/feed.css' => 'dd43ce00', 69 68 'rsrc/css/application/files/global-drag-and-drop.css' => '697324ad', 70 69 'rsrc/css/application/flag/flag.css' => '5337623f', ··· 137 136 'rsrc/css/phui/phui-info-panel.css' => '27ea50a1', 138 137 'rsrc/css/phui/phui-list.css' => '43ed2d93', 139 138 'rsrc/css/phui/phui-object-box.css' => 'ce92d8ec', 140 - 'rsrc/css/phui/phui-object-item-list-view.css' => '16003f41', 139 + 'rsrc/css/phui/phui-object-item-list-view.css' => '15c582b1', 141 140 'rsrc/css/phui/phui-pinboard-view.css' => '874c22f9', 142 141 'rsrc/css/phui/phui-property-list-view.css' => '2f7199e8', 143 142 'rsrc/css/phui/phui-remarkup-preview.css' => '19ad512b', ··· 483 482 'rsrc/js/phuix/PHUIXActionListView.js' => 'b5c256b8', 484 483 'rsrc/js/phuix/PHUIXActionView.js' => '6e8cefa4', 485 484 'rsrc/js/phuix/PHUIXDropdownMenu.js' => 'bd4c8dca', 486 - 'rsrc/swf/aphlict.swf' => 'abac967d', 485 + 'rsrc/swf/aphlict.swf' => 'f22c1e40', 487 486 ), 488 487 'symbols' => 489 488 array( ··· 707 706 'phabricator-flag-css' => '5337623f', 708 707 'phabricator-hovercard' => '4f344388', 709 708 'phabricator-hovercard-view-css' => '46a13cf0', 710 - 'phabricator-jump-nav' => 'f0c5e726', 711 709 'phabricator-keyboard-shortcut' => '1ae869f2', 712 710 'phabricator-keyboard-shortcut-manager' => 'ad7a69ca', 713 711 'phabricator-main-menu-view' => '72d1d2ef', ··· 768 766 'phui-info-panel-css' => '27ea50a1', 769 767 'phui-list-view-css' => '43ed2d93', 770 768 'phui-object-box-css' => 'ce92d8ec', 771 - 'phui-object-item-list-view-css' => '16003f41', 769 + 'phui-object-item-list-view-css' => '15c582b1', 772 770 'phui-pinboard-view-css' => '874c22f9', 773 771 'phui-property-list-view-css' => '2f7199e8', 774 772 'phui-remarkup-preview-css' => '19ad512b', ··· 2113 2111 8 => 'aphront-tokenizer-control-css', 2114 2112 9 => 'aphront-typeahead-control-css', 2115 2113 10 => 'aphront-list-filter-view-css', 2116 - 11 => 'phabricator-jump-nav', 2117 - 12 => 'phabricator-remarkup-css', 2118 - 13 => 'syntax-highlighting-css', 2119 - 14 => 'aphront-pager-view-css', 2120 - 15 => 'phabricator-transaction-view-css', 2121 - 16 => 'aphront-tooltip-css', 2122 - 17 => 'phabricator-flag-css', 2123 - 18 => 'aphront-error-view-css', 2124 - 19 => 'sprite-remarkup-css', 2125 - 20 => 'sprite-gradient-css', 2126 - 21 => 'sprite-menu-css', 2127 - 22 => 'sprite-apps-css', 2128 - 23 => 'sprite-apps-large-css', 2129 - 24 => 'phabricator-main-menu-view', 2130 - 25 => 'phabricator-notification-css', 2131 - 26 => 'phabricator-notification-menu-css', 2132 - 27 => 'lightbox-attachment-css', 2133 - 28 => 'phui-header-view-css', 2134 - 29 => 'phabricator-filetree-view-css', 2135 - 30 => 'phabricator-nav-view-css', 2136 - 31 => 'phabricator-side-menu-view-css', 2137 - 32 => 'phabricator-crumbs-view-css', 2138 - 33 => 'phui-object-item-list-view-css', 2139 - 34 => 'global-drag-and-drop-css', 2140 - 35 => 'phui-spacing-css', 2141 - 36 => 'phui-form-css', 2142 - 37 => 'phui-icon-view-css', 2143 - 38 => 'phabricator-application-launch-view-css', 2144 - 39 => 'phabricator-action-list-view-css', 2145 - 40 => 'phui-property-list-view-css', 2146 - 41 => 'phui-tag-view-css', 2147 - 42 => 'phui-list-view-css', 2148 - 43 => 'font-fontawesome', 2149 - 44 => 'phui-font-icon-base-css', 2150 - 45 => 'sprite-main-header-css', 2151 - 46 => 'phui-box-css', 2152 - 47 => 'phui-object-box-css', 2153 - 48 => 'phui-timeline-view-css', 2154 - 49 => 'sprite-tokens-css', 2155 - 50 => 'tokens-css', 2156 - 51 => 'phui-status-list-view-css', 2114 + 11 => 'phabricator-remarkup-css', 2115 + 12 => 'syntax-highlighting-css', 2116 + 13 => 'aphront-pager-view-css', 2117 + 14 => 'phabricator-transaction-view-css', 2118 + 15 => 'aphront-tooltip-css', 2119 + 16 => 'phabricator-flag-css', 2120 + 17 => 'aphront-error-view-css', 2121 + 18 => 'sprite-remarkup-css', 2122 + 19 => 'sprite-gradient-css', 2123 + 20 => 'sprite-menu-css', 2124 + 21 => 'sprite-apps-css', 2125 + 22 => 'sprite-apps-large-css', 2126 + 23 => 'phabricator-main-menu-view', 2127 + 24 => 'phabricator-notification-css', 2128 + 25 => 'phabricator-notification-menu-css', 2129 + 26 => 'lightbox-attachment-css', 2130 + 27 => 'phui-header-view-css', 2131 + 28 => 'phabricator-filetree-view-css', 2132 + 29 => 'phabricator-nav-view-css', 2133 + 30 => 'phabricator-side-menu-view-css', 2134 + 31 => 'phabricator-crumbs-view-css', 2135 + 32 => 'phui-object-item-list-view-css', 2136 + 33 => 'global-drag-and-drop-css', 2137 + 34 => 'phui-spacing-css', 2138 + 35 => 'phui-form-css', 2139 + 36 => 'phui-icon-view-css', 2140 + 37 => 'phabricator-application-launch-view-css', 2141 + 38 => 'phabricator-action-list-view-css', 2142 + 39 => 'phui-property-list-view-css', 2143 + 40 => 'phui-tag-view-css', 2144 + 41 => 'phui-list-view-css', 2145 + 42 => 'font-fontawesome', 2146 + 43 => 'phui-font-icon-base-css', 2147 + 44 => 'sprite-main-header-css', 2148 + 45 => 'phui-box-css', 2149 + 46 => 'phui-object-box-css', 2150 + 47 => 'phui-timeline-view-css', 2151 + 48 => 'sprite-tokens-css', 2152 + 49 => 'tokens-css', 2153 + 50 => 'phui-status-list-view-css', 2157 2154 ), 2158 2155 'core.pkg.js' => 2159 2156 array(
-2
resources/celerity/packages.php
··· 83 83 'aphront-typeahead-control-css', 84 84 'aphront-list-filter-view-css', 85 85 86 - 'phabricator-jump-nav', 87 - 88 86 'phabricator-remarkup-css', 89 87 'syntax-highlighting-css', 90 88 'aphront-pager-view-css',
+1 -1
resources/sql/patches/20131004.dxreviewers.php
··· 32 32 if (phid_get_type($dst) == PhabricatorPHIDConstants::PHID_TYPE_UNKNOWN) { 33 33 // At least one old install ran into some issues here. Skip the row if we 34 34 // can't figure out what the destination PHID is. See here: 35 - // https://github.com/facebook/phabricator/pull/507 35 + // https://github.com/phacility/phabricator/pull/507 36 36 continue; 37 37 } 38 38
+3 -3
scripts/install/install_rhel-derivs.sh
··· 119 119 120 120 if [[ ! -e libphutil ]] 121 121 then 122 - git clone git://github.com/facebook/libphutil.git 122 + git clone git://github.com/phacility/libphutil.git 123 123 else 124 124 (cd libphutil && git pull --rebase) 125 125 fi 126 126 127 127 if [[ ! -e arcanist ]] 128 128 then 129 - git clone git://github.com/facebook/arcanist.git 129 + git clone git://github.com/phacility/arcanist.git 130 130 else 131 131 (cd arcanist && git pull --rebase) 132 132 fi 133 133 134 134 if [[ ! -e phabricator ]] 135 135 then 136 - git clone git://github.com/facebook/phabricator.git 136 + git clone git://github.com/phacility/phabricator.git 137 137 else 138 138 (cd phabricator && git pull --rebase) 139 139 fi
+3 -3
scripts/install/install_ubuntu.sh
··· 64 64 65 65 if [ ! -e libphutil ] 66 66 then 67 - git clone git://github.com/facebook/libphutil.git 67 + git clone git://github.com/phacility/libphutil.git 68 68 else 69 69 (cd libphutil && git pull --rebase) 70 70 fi 71 71 72 72 if [ ! -e arcanist ] 73 73 then 74 - git clone git://github.com/facebook/arcanist.git 74 + git clone git://github.com/phacility/arcanist.git 75 75 else 76 76 (cd arcanist && git pull --rebase) 77 77 fi 78 78 79 79 if [ ! -e phabricator ] 80 80 then 81 - git clone git://github.com/facebook/phabricator.git 81 + git clone git://github.com/phacility/phabricator.git 82 82 else 83 83 (cd phabricator && git pull --rebase) 84 84 fi
-55
src/aphront/console/plugin/DarkConsoleErrorLogPlugin.php
··· 99 99 )); 100 100 } 101 101 } 102 - 103 - /* 104 - $data = $this->getData(); 105 - if (!$data) { 106 - return 107 - <x:frag> 108 - <div class="mu">No errors.</div> 109 - </x:frag>; 110 - } 111 - 112 - $markup = <table class="LConsoleErrors" />; 113 - $alt = false; 114 - foreach ($data as $error) { 115 - $row = <tr class={$alt ? 'alt' : null} />; 116 - 117 - $text = $error['error']; 118 - $text = preg_replace('/\(in .* on line \d+\)$/', '', trim($text)); 119 - 120 - $trace = $error['trace']; 121 - $trace = explode("\n", $trace); 122 - if (!$trace) { 123 - $trace = array('unknown@0@unknown'); 124 - } 125 - 126 - foreach ($trace as $idx => $traceline) { 127 - list($file, $line, $where) = array_merge( 128 - explode('@', $traceline), 129 - array('?', '?', '?')); 130 - if ($where == 'DarkConsole->addError' || 131 - $where == 'debug_rlog') { 132 - unset($trace[$idx]); 133 - } 134 - } 135 - 136 - $row->appendChild(<th rowspan={count($trace)}>{$text}</th>); 137 - 138 - foreach ($trace as $traceline) { 139 - list($file, $line, $where) = array_merge( 140 - explode('@', $traceline), 141 - array('?', '?', '?')); 142 - $row->appendChild(<td>{$file}:{$line}</td>); 143 - $row->appendChild(<td>{$where}()</td>); 144 - $markup->appendChild($row); 145 - $row = <tr class={$alt ? 'alt' : null} />; 146 - } 147 - 148 - $alt = !$alt; 149 - } 150 - 151 - return 152 - <x:frag> 153 - <h1>Errors</h1> 154 - <div class="LConsoleErrors">{$markup}</div> 155 - </x:frag>; 156 - */
+4 -4
src/applications/audit/application/PhabricatorApplicationAudit.php
··· 2 2 3 3 final class PhabricatorApplicationAudit extends PhabricatorApplication { 4 4 5 - public function getShortDescription() { 6 - return pht('Audit Code'); 7 - } 8 - 9 5 public function getBaseURI() { 10 6 return '/audit/'; 11 7 } 12 8 13 9 public function getIconName() { 14 10 return 'audit'; 11 + } 12 + 13 + public function getShortDescription() { 14 + return pht('Browse and Audit Commits'); 15 15 } 16 16 17 17 public function getHelpURI() {
+4
src/applications/auth/application/PhabricatorApplicationAuth.php
··· 14 14 return 'authentication'; 15 15 } 16 16 17 + public function getShortDescription() { 18 + return pht('Configure Login and Registration'); 19 + } 20 + 17 21 public function getHelpURI() { 18 22 // NOTE: Although reasonable help exists for this in "Configuring Accounts 19 23 // and Registration", specifying a help URI here means we get the menu
+3 -5
src/applications/base/PhabricatorApplication.php
··· 155 155 } 156 156 157 157 public function getHelpURI() { 158 - // TODO: When these applications get created, link to their docs: 159 - // 160 - // - Drydock 161 - // - OAuth Server 162 - 158 + return null; 159 + } 163 160 161 + public function getOverview() { 164 162 return null; 165 163 } 166 164
+1 -1
src/applications/calendar/application/PhabricatorApplicationCalendar.php
··· 3 3 final class PhabricatorApplicationCalendar extends PhabricatorApplication { 4 4 5 5 public function getShortDescription() { 6 - return pht('Dates and Stuff'); 6 + return pht('Upcoming Events'); 7 7 } 8 8 9 9 public function getFlavorText() {
+1 -1
src/applications/chatlog/applications/PhabricatorApplicationChatLog.php
··· 7 7 } 8 8 9 9 public function getShortDescription() { 10 - return pht('Chat Log'); 10 + return pht('IRC Logs'); 11 11 } 12 12 13 13 public function getIconName() {
+1 -1
src/applications/conduit/application/PhabricatorApplicationConduit.php
··· 19 19 } 20 20 21 21 public function getShortDescription() { 22 - return 'Conduit API Console'; 22 + return pht('Phabricator Developer API Console'); 23 23 } 24 24 25 25 public function getTitleGlyph() {
+4
src/applications/config/application/PhabricatorApplicationConfig.php
··· 22 22 return false; 23 23 } 24 24 25 + public function getShortDescription() { 26 + return pht('Configure Phabricator'); 27 + } 28 + 25 29 public function getRoutes() { 26 30 return array( 27 31 '/config/' => array(
+7
src/applications/config/option/PhabricatorSyntaxHighlightingConfigOptions.php
··· 42 42 'bash' => 'Bash Scripting', 43 43 'brainfuck' => 'Brainf*ck', 44 44 'c' => 'C', 45 + 'coffee-script' => 'CoffeeScript', 45 46 'cpp' => 'C++', 46 47 'css' => 'CSS', 47 48 'd' => 'D', ··· 49 50 'django' => 'Django Templating', 50 51 'erb' => 'Embedded Ruby/ERB', 51 52 'erlang' => 'Erlang', 53 + 'go' => 'Golang', 54 + 'groovy' => 'Groovy', 52 55 'haskell' => 'Haskell', 53 56 'html' => 'HTML', 54 57 'invisible' => 'Invisible', 55 58 'java' => 'Java', 56 59 'js' => 'Javascript', 60 + 'json' => 'JSON', 57 61 'mysql' => 'MySQL', 58 62 'objc' => 'Objective-C', 59 63 'perl' => 'Perl', 60 64 'php' => 'PHP', 65 + 'puppet' => 'Puppet', 61 66 'rest' => 'reStructuredText', 62 67 'text' => 'Plain Text', 63 68 'python' => 'Python', ··· 65 70 'remarkup' => 'Remarkup', 66 71 'ruby' => 'Ruby', 67 72 'xml' => 'XML', 73 + 'yaml' => 'YAML', 68 74 )) 69 75 ->setSummary( 70 76 pht("Set the language list which appears in dropdowns.")) ··· 77 83 'wild', 78 84 array( 79 85 '@\.arcconfig$@' => 'js', 86 + '@\.arclint$@' => 'js', 80 87 '@\.divinerconfig$@' => 'js', 81 88 )) 82 89 ->setSummary(
+1 -1
src/applications/conpherence/application/PhabricatorApplicationConpherence.php
··· 10 10 } 11 11 12 12 public function getShortDescription() { 13 - return pht('Messaging'); 13 + return pht('Send Messages'); 14 14 } 15 15 16 16 public function getIconName() {
+1 -1
src/applications/countdown/application/PhabricatorApplicationCountdown.php
··· 11 11 } 12 12 13 13 public function getShortDescription() { 14 - return pht('Countdown Timers'); 14 + return pht('Countdown to Events'); 15 15 } 16 16 17 17 public function getTitleGlyph() {
+1 -1
src/applications/daemon/application/PhabricatorApplicationDaemons.php
··· 7 7 } 8 8 9 9 public function getShortDescription() { 10 - return pht('Manage Daemons'); 10 + return pht('Manage Phabricator Daemons'); 11 11 } 12 12 13 13 public function getBaseURI() {
+1 -1
src/applications/dashboard/application/PhabricatorApplicationDashboard.php
··· 7 7 } 8 8 9 9 public function getShortDescription() { 10 - return pht('Such Data'); 10 + return pht('Create Custom Pages'); 11 11 } 12 12 13 13 public function getIconName() {
+24 -5
src/applications/dashboard/controller/PhabricatorDashboardViewController.php
··· 26 26 $crumbs = $this->buildApplicationCrumbs(); 27 27 $crumbs->addTextCrumb(pht('Dashboard %d', $dashboard->getID())); 28 28 29 - $rendered_dashboard = id(new PhabricatorDashboardRenderingEngine()) 30 - ->setViewer($viewer) 31 - ->setDashboard($dashboard) 32 - ->renderDashboard(); 29 + if ($dashboard->getPanelPHIDs()) { 30 + $rendered_dashboard = id(new PhabricatorDashboardRenderingEngine()) 31 + ->setViewer($viewer) 32 + ->setDashboard($dashboard) 33 + ->renderDashboard(); 34 + } else { 35 + $rendered_dashboard = $this->buildEmptyView(); 36 + } 33 37 34 38 return $this->buildApplicationPage( 35 39 array( ··· 50 54 id(new PHUIListItemView()) 51 55 ->setIcon('fa-th') 52 56 ->setName(pht('Manage Dashboard')) 53 - ->setHref($this->getApplicationURI()."manage/{$id}/")); 57 + ->setHref($this->getApplicationURI("manage/{$id}/"))); 54 58 55 59 return $crumbs; 60 + } 61 + 62 + public function buildEmptyView() { 63 + $id = $this->id; 64 + $manage_uri = $this->getApplicationURI("manage/{$id}/"); 65 + 66 + return id(new AphrontErrorView()) 67 + ->setSeverity(AphrontErrorView::SEVERITY_NODATA) 68 + ->appendChild( 69 + pht('This dashboard has no panels '. 70 + 'yet. Use %s to add panels.', 71 + phutil_tag( 72 + 'a', 73 + array('href'=>$manage_uri), 74 + pht('Manage Dashboard')))); 56 75 } 57 76 58 77 }
+8
src/applications/differential/application/PhabricatorApplicationDifferential.php
··· 36 36 ); 37 37 } 38 38 39 + public function getOverview() { 40 + return pht(<<<EOTEXT 41 + Differential is a **code review application** which allows engineers to review, 42 + discuss and approve changes to software. 43 + EOTEXT 44 + ); 45 + } 46 + 39 47 public function getRoutes() { 40 48 return array( 41 49 '/D(?P<id>[1-9]\d*)' => 'DifferentialRevisionViewController',
+1 -1
src/applications/differential/customfield/DifferentialTestPlanField.php
··· 44 44 protected function getCoreFieldRequiredErrorString() { 45 45 return pht( 46 46 'You must provide a test plan. Describe the actions you performed '. 47 - 'to verify the behvaior of this change.'); 47 + 'to verify the behavior of this change.'); 48 48 } 49 49 50 50 public function readValueFromRequest(AphrontRequest $request) {
+1 -1
src/applications/diffusion/application/PhabricatorApplicationDiffusion.php
··· 3 3 final class PhabricatorApplicationDiffusion extends PhabricatorApplication { 4 4 5 5 public function getShortDescription() { 6 - return pht('Repository Browser'); 6 + return pht('Host and Browse Repositories'); 7 7 } 8 8 9 9 public function getBaseURI() {
+5 -4
src/applications/diffusion/controller/DiffusionBrowseFileController.php
··· 9 9 public function processRequest() { 10 10 $request = $this->getRequest(); 11 11 $drequest = $this->getDiffusionRequest(); 12 + $viewer = $request->getUser(); 12 13 13 14 $before = $request->getStr('before'); 14 15 if ($before) { ··· 17 18 18 19 $path = $drequest->getPath(); 19 20 20 - $preferences = $request->getUser()->loadPreferences(); 21 + $preferences = $viewer->loadPreferences(); 21 22 22 23 $show_blame = $request->getBool( 23 24 'blame', ··· 31 32 true)); 32 33 33 34 $view = $request->getStr('view'); 34 - if ($request->isFormPost() && $view != 'raw') { 35 + if ($request->isFormPost() && $view != 'raw' && $viewer->isLoggedIn()) { 35 36 $preferences->setPreference( 36 37 PhabricatorUserPreferences::PREFERENCE_DIFFUSION_BLAME, 37 38 $show_blame); ··· 354 355 ->setHref($base_uri->alter('blame', $blame_value)) 355 356 ->setIcon($blame_icon) 356 357 ->setUser($viewer) 357 - ->setRenderAsForm(true)); 358 + ->setRenderAsForm($viewer->isLoggedIn())); 358 359 359 360 if ($show_color) { 360 361 $highlight_text = pht('Disable Highlighting'); ··· 372 373 ->setHref($base_uri->alter('color', $highlight_value)) 373 374 ->setIcon($highlight_icon) 374 375 ->setUser($viewer) 375 - ->setRenderAsForm(true)); 376 + ->setRenderAsForm($viewer->isLoggedIn())); 376 377 377 378 $href = null; 378 379 if ($this->getRequest()->getStr('lint') !== null) {
+1 -1
src/applications/diviner/application/PhabricatorApplicationDiviner.php
··· 36 36 } 37 37 38 38 public function getApplicationGroup() { 39 - return self::GROUP_COMMUNICATION; 39 + return self::GROUP_UTILITIES; 40 40 } 41 41 42 42 public function getRemarkupRules() {
+4 -4
src/applications/doorkeeper/application/PhabricatorApplicationDoorkeeper.php
··· 6 6 return false; 7 7 } 8 8 9 - public function getBaseURI() { 10 - return '/doorkeeper/'; 11 - } 12 - 13 9 public function shouldAppearInLaunchView() { 14 10 return false; 11 + } 12 + 13 + public function getShortDescription() { 14 + return pht('Connect to Other Software'); 15 15 } 16 16 17 17 public function getRemarkupRules() {
+4
src/applications/drydock/application/PhabricatorApplicationDrydock.php
··· 30 30 return true; 31 31 } 32 32 33 + public function getHelpURI() { 34 + return PhabricatorEnv::getDoclink('Drydock User Guide'); 35 + } 36 + 33 37 public function getRoutes() { 34 38 return array( 35 39 '/drydock/' => array(
+1 -1
src/applications/fact/application/PhabricatorApplicationFact.php
··· 3 3 final class PhabricatorApplicationFact extends PhabricatorApplication { 4 4 5 5 public function getShortDescription() { 6 - return 'Analyze Data'; 6 + return pht('Chart and Analyze Data'); 7 7 } 8 8 9 9 public function getName() {
+1 -1
src/applications/feed/application/PhabricatorApplicationFeed.php
··· 7 7 } 8 8 9 9 public function getShortDescription() { 10 - return pht('Review Activity'); 10 + return pht('Review Recent Activity'); 11 11 } 12 12 13 13 public function getIconName() {
+2 -2
src/applications/flag/application/PhabricatorApplicationFlags.php
··· 3 3 final class PhabricatorApplicationFlags extends PhabricatorApplication { 4 4 5 5 public function getShortDescription() { 6 - return pht('Reminders'); 6 + return pht('Personal Bookmarks and Reminders'); 7 7 } 8 8 9 9 public function getBaseURI() { ··· 25 25 } 26 26 27 27 public function getApplicationGroup() { 28 - return self::GROUP_ORGANIZATION; 28 + return self::GROUP_UTILITIES; 29 29 } 30 30 31 31 public function loadStatus(PhabricatorUser $user) {
+1 -1
src/applications/harbormaster/application/PhabricatorApplicationHarbormaster.php
··· 7 7 } 8 8 9 9 public function getShortDescription() { 10 - return pht('Continuous Build'); 10 + return pht('Builds and Continuous Integration'); 11 11 } 12 12 13 13 public function getIconName() {
-95
src/applications/home/controller/PhabricatorHomeMainController.php
··· 16 16 17 17 public function processRequest() { 18 18 $user = $this->getRequest()->getUser(); 19 - 20 - if ($this->filter == 'jump') { 21 - return $this->buildJumpResponse(); 22 - } 23 19 $nav = $this->buildNav(); 24 20 25 21 $dashboard = PhabricatorDashboardInstall::getDashboard( ··· 92 88 $welcome_panel = null; 93 89 } 94 90 95 - $jump_panel = $this->buildJumpPanel(); 96 - 97 91 if ($has_differential) { 98 92 $revision_panel = $this->buildRevisionPanel(); 99 93 } else { ··· 101 95 } 102 96 103 97 $content = array( 104 - $jump_panel, 105 98 $welcome_panel, 106 99 $unbreak_panel, 107 100 $triage_panel, ··· 116 109 117 110 return $nav; 118 111 119 - } 120 - 121 - private function buildJumpResponse() { 122 - $request = $this->getRequest(); 123 - $jump = $request->getStr('jump'); 124 - 125 - $response = PhabricatorJumpNavHandler::getJumpResponse( 126 - $request->getUser(), 127 - $jump); 128 - 129 - if ($response) { 130 - return $response; 131 - } else if ($request->isFormPost()) { 132 - $uri = new PhutilURI('/search/'); 133 - $uri->setQueryParam('query', $jump); 134 - $uri->setQueryParam('search:primary', 'true'); 135 - 136 - return id(new AphrontRedirectResponse())->setURI((string)$uri); 137 - } else { 138 - return id(new AphrontRedirectResponse())->setURI('/'); 139 - } 140 112 } 141 113 142 114 private function buildUnbreakNowPanel() { ··· 328 300 $view->setHandles($handles); 329 301 330 302 return $view; 331 - } 332 - 333 - private function buildJumpPanel($query=null) { 334 - $request = $this->getRequest(); 335 - $user = $request->getUser(); 336 - 337 - $uniq_id = celerity_generate_unique_node_id(); 338 - 339 - Javelin::initBehavior( 340 - 'phabricator-autofocus', 341 - array( 342 - 'id' => $uniq_id, 343 - )); 344 - 345 - require_celerity_resource('phabricator-jump-nav'); 346 - 347 - $doc_href = PhabricatorEnv::getDocLink('Jump Nav User Guide'); 348 - $doc_link = phutil_tag( 349 - 'a', 350 - array( 351 - 'href' => $doc_href, 352 - ), 353 - 'Jump Nav User Guide'); 354 - 355 - $jump_input = phutil_tag( 356 - 'input', 357 - array( 358 - 'type' => 'text', 359 - 'class' => 'phabricator-jump-nav', 360 - 'name' => 'jump', 361 - 'id' => $uniq_id, 362 - 'value' => $query, 363 - )); 364 - $jump_caption = phutil_tag( 365 - 'p', 366 - array( 367 - 'class' => 'phabricator-jump-nav-caption', 368 - ), 369 - hsprintf( 370 - 'Enter the name of an object like <tt>D123</tt> to quickly jump to '. 371 - 'it. See %s or type <tt>help</tt>.', 372 - $doc_link)); 373 - 374 - $form = phabricator_form( 375 - $user, 376 - array( 377 - 'action' => '/jump/', 378 - 'method' => 'POST', 379 - 'class' => 'phabricator-jump-nav-form', 380 - ), 381 - array( 382 - $jump_input, 383 - $jump_caption, 384 - )); 385 - 386 - $panel = new AphrontPanelView(); 387 - $panel->setNoBackground(); 388 - // $panel->appendChild(); 389 - 390 - $list_filter = new AphrontListFilterView(); 391 - $list_filter->appendChild($form); 392 - 393 - $container = phutil_tag('div', 394 - array('class' => 'phabricator-jump-nav-container'), 395 - $list_filter); 396 - 397 - return $container; 398 303 } 399 304 400 305 private function renderSectionHeader($title, $href) {
+1 -1
src/applications/legalpad/application/PhabricatorApplicationLegalpad.php
··· 7 7 } 8 8 9 9 public function getShortDescription() { 10 - return pht('Legal Documents'); 10 + return pht('Agreements and Signatures'); 11 11 } 12 12 13 13 public function getIconName() {
+3 -3
src/applications/maniphest/config/PhabricatorManiphestConfigOptions.php
··· 218 218 ->setSummary(pht("Custom Maniphest fields.")) 219 219 ->setDescription( 220 220 pht( 221 - "Array of custom fields for Maniphest tasks. For details on ". 222 - "adding custom fields to Maniphest, see 'Maniphest User Guide: ". 223 - "Adding Custom Fields'.")) 221 + 'Array of custom fields for Maniphest tasks. For details on '. 222 + 'adding custom fields to Maniphest, see "Configuring Custom '. 223 + 'Fields" in the documentation.')) 224 224 ->addExample( 225 225 '{"mycompany:estimated-hours": {"name": "Estimated Hours", '. 226 226 '"type": "int", "caption": "Estimated number of hours this will '.
+2 -3
src/applications/meta/application/PhabricatorApplicationApplications.php
··· 11 11 } 12 12 13 13 public function getShortDescription() { 14 - return 'Installed Applications'; 14 + return pht('Explore More Applications'); 15 15 } 16 16 17 17 public function getIconName() { ··· 26 26 return self::GROUP_ADMIN; 27 27 } 28 28 29 - public function getRoutes() { 29 + public function getRoutes() { 30 30 return array( 31 31 '/applications/' => array( 32 32 '(?:query/(?P<queryKey>[^/]+)/)?' => ··· 38 38 '(?P<application>\w+)/(?P<action>install|uninstall)/' => 39 39 'PhabricatorApplicationUninstallController', 40 40 ), 41 - 42 41 ); 43 42 } 44 43
+36 -3
src/applications/meta/controller/PhabricatorApplicationDetailViewController.php
··· 1 1 <?php 2 2 3 3 final class PhabricatorApplicationDetailViewController 4 - extends PhabricatorApplicationsController{ 4 + extends PhabricatorApplicationsController { 5 5 6 6 private $application; 7 + 8 + public function shouldAllowPublic() { 9 + return true; 10 + } 7 11 8 12 public function willProcessRequest(array $data) { 9 13 $this->application = $data['application']; ··· 61 65 62 66 $viewer = $this->getRequest()->getUser(); 63 67 64 - $properties = id(new PHUIPropertyListView()) 65 - ->addProperty(pht('Description'), $application->getShortDescription()); 68 + $properties = id(new PHUIPropertyListView()); 66 69 $properties->setActionList($actions); 67 70 71 + $properties->addProperty( 72 + pht('Description'), 73 + $application->getShortDescription()); 74 + 75 + if ($application->getFlavorText()) { 76 + $properties->addProperty( 77 + null, 78 + phutil_tag('em', array(), $application->getFlavorText())); 79 + } 80 + 68 81 if ($application->isBeta()) { 69 82 $properties->addProperty( 70 83 pht('Release'), 71 84 pht('Beta')); 72 85 } 73 86 87 + $overview = $application->getOverview(); 88 + if ($overview) { 89 + $properties->addSectionHeader( 90 + pht('Overview'), 91 + PHUIPropertyListView::ICON_SUMMARY); 92 + $properties->addTextContent( 93 + PhabricatorMarkupEngine::renderOneObject( 94 + id(new PhabricatorMarkupOneOff())->setContent($overview), 95 + 'default', 96 + $viewer)); 97 + } 98 + 74 99 $descriptions = PhabricatorPolicyQuery::renderPolicyDescriptions( 75 100 $viewer, 76 101 $application); ··· 93 118 $view = id(new PhabricatorActionListView()) 94 119 ->setUser($user) 95 120 ->setObjectURI($this->getRequest()->getRequestURI()); 121 + 122 + if ($selected->getHelpURI()) { 123 + $view->addAction( 124 + id(new PhabricatorActionView()) 125 + ->setName(pht('Help / Documentation')) 126 + ->setIcon('fa-life-ring') 127 + ->setHref($selected->getHelpURI())); 128 + } 96 129 97 130 $can_edit = PhabricatorPolicyFilter::hasCapability( 98 131 $user,
+5 -1
src/applications/meta/controller/PhabricatorApplicationEditController.php
··· 1 1 <?php 2 2 3 3 final class PhabricatorApplicationEditController 4 - extends PhabricatorApplicationsController{ 4 + extends PhabricatorApplicationsController { 5 5 6 6 private $application; 7 + 8 + public function shouldRequireAdmin() { 9 + return true; 10 + } 7 11 8 12 public function willProcessRequest(array $data) { 9 13 $this->application = $data['application'];
+4
src/applications/meta/controller/PhabricatorApplicationUninstallController.php
··· 6 6 private $application; 7 7 private $action; 8 8 9 + public function shouldRequireAdmin() { 10 + return true; 11 + } 12 + 9 13 public function willProcessRequest(array $data) { 10 14 $this->application = $data['application']; 11 15 $this->action = $data['action'];
-4
src/applications/meta/controller/PhabricatorApplicationsController.php
··· 2 2 3 3 abstract class PhabricatorApplicationsController extends PhabricatorController { 4 4 5 - public function shouldRequireAdmin() { 6 - return true; 7 - } 8 - 9 5 public function buildSideNavView($for_app = false) { 10 6 $user = $this->getRequest()->getUser(); 11 7
+4
src/applications/meta/controller/PhabricatorApplicationsListController.php
··· 5 5 6 6 private $queryKey; 7 7 8 + public function shouldAllowPublic() { 9 + return true; 10 + } 11 + 8 12 public function willProcessRequest(array $data) { 9 13 $this->queryKey = idx($data, 'queryKey'); 10 14 }
+99 -15
src/applications/meta/query/PhabricatorAppSearchEngine.php
··· 25 25 $saved->setParameter( 26 26 'firstParty', 27 27 $this->readBoolFromRequest($request, 'firstParty')); 28 + $saved->setParameter( 29 + 'launchable', 30 + $this->readBoolFromRequest($request, 'launchable')); 28 31 29 32 return $saved; 30 33 } ··· 52 55 $first_party = $saved->getParameter('firstParty'); 53 56 if ($first_party !== null) { 54 57 $query->withFirstParty($first_party); 58 + } 59 + 60 + $launchable = $saved->getParameter('launchable'); 61 + if ($launchable !== null) { 62 + $query->withLaunchable($launchable); 55 63 } 56 64 57 65 return $query; ··· 99 107 '' => pht('Show All Applications'), 100 108 'true' => pht('Show First-Party Applications'), 101 109 'false' => pht('Show Third-Party Applications'), 110 + ))) 111 + ->appendChild( 112 + id(new AphrontFormSelectControl()) 113 + ->setLabel(pht('Launchable')) 114 + ->setName('launchable') 115 + ->setValue($this->getBoolFromQuery($saved, 'launchable')) 116 + ->setOptions( 117 + array( 118 + '' => pht('Show All Applications'), 119 + 'true' => pht('Show Launchable Applications'), 120 + 'false' => pht('Show Non-Launchable Applications'), 102 121 ))); 103 122 104 123 } ··· 109 128 110 129 public function getBuiltinQueryNames() { 111 130 $names = array( 131 + 'launcher' => pht('Launcher'), 112 132 'all' => pht('All Applications'), 113 133 ); 114 134 ··· 121 141 $query->setQueryKey($query_key); 122 142 123 143 switch ($query_key) { 144 + case 'launcher': 145 + return $query 146 + ->setParameter('installed', true) 147 + ->setParameter('launchable', true); 124 148 case 'all': 125 149 return $query; 126 150 } ··· 129 153 } 130 154 131 155 protected function renderResultList( 132 - array $applications, 156 + array $all_applications, 133 157 PhabricatorSavedQuery $query, 134 158 array $handle) { 135 - assert_instances_of($applications, 'PhabricatorApplication'); 159 + assert_instances_of($all_applications, 'PhabricatorApplication'); 136 160 137 - $list = new PHUIObjectItemListView(); 161 + $all_applications = msort($all_applications, 'getName'); 138 162 139 - $applications = msort($applications, 'getName'); 163 + if ($query->getQueryKey() == 'launcher') { 164 + $groups = mgroup($all_applications, 'getApplicationGroup'); 165 + } else { 166 + $groups = array($all_applications); 167 + } 140 168 141 - foreach ($applications as $application) { 142 - $item = id(new PHUIObjectItemView()) 143 - ->setHeader($application->getName()) 144 - ->setHref('/applications/view/'.get_class($application).'/') 145 - ->addAttribute($application->getShortDescription()); 169 + $group_names = PhabricatorApplication::getApplicationGroups(); 170 + $groups = array_select_keys($groups, array_keys($group_names)) + $groups; 146 171 147 - if (!$application->isInstalled()) { 148 - $item->addIcon('delete', pht('Uninstalled')); 172 + $results = array(); 173 + foreach ($groups as $group => $applications) { 174 + if (count($groups) > 1) { 175 + $results[] = phutil_tag( 176 + 'h1', 177 + array( 178 + 'class' => 'launcher-header', 179 + ), 180 + idx($group_names, $group, $group)); 149 181 } 150 182 151 - if ($application->isBeta()) { 152 - $item->addIcon('lint-warning', pht('Beta')); 183 + $list = new PHUIObjectItemListView(); 184 + $list->addClass('phui-object-item-launcher-list'); 185 + 186 + foreach ($applications as $application) { 187 + $icon = $application->getIconName(); 188 + if (!$icon) { 189 + $icon = 'application'; 190 + } 191 + 192 + // TODO: This sheet doesn't work the same way other sheets do so it 193 + // ends up with the wrong classes if we try to use PHUIIconView. This 194 + // is probably all changing in the redesign anyway. 195 + 196 + $icon_view = javelin_tag( 197 + 'span', 198 + array( 199 + 'class' => 'phui-icon-view '. 200 + 'sprite-apps-large apps-'.$icon.'-dark-large', 201 + 'aural' => false, 202 + ), 203 + ''); 204 + 205 + $description = phutil_tag( 206 + 'div', 207 + array( 208 + 'style' => 'white-space: nowrap; '. 209 + 'overflow: hidden; '. 210 + 'text-overflow: ellipsis;', 211 + ), 212 + $application->getShortDescription()); 213 + 214 + $item = id(new PHUIObjectItemView()) 215 + ->setHeader($application->getName()) 216 + ->setImageIcon($icon_view) 217 + ->addAttribute($description) 218 + ->addAction( 219 + id(new PHUIListItemView()) 220 + ->setName(pht('Help/Options')) 221 + ->setIcon('fa-cog') 222 + ->setHref('/applications/view/'.get_class($application).'/')); 223 + 224 + if ($application->getBaseURI()) { 225 + $item->setHref($application->getBaseURI()); 226 + } 227 + 228 + if (!$application->isInstalled()) { 229 + $item->addIcon('delete', pht('Uninstalled')); 230 + } 231 + 232 + if ($application->isBeta()) { 233 + $item->addIcon('fa-star-half-o grey', pht('Beta')); 234 + } 235 + 236 + $list->addItem($item); 153 237 } 154 238 155 - $list->addItem($item); 239 + $results[] = $list; 156 240 } 157 241 158 - return $list; 242 + return $results; 159 243 } 160 244 161 245 }
+15
src/applications/meta/query/PhabricatorApplicationQuery.php
··· 9 9 private $nameContains; 10 10 private $unlisted; 11 11 private $classes; 12 + private $launchable; 12 13 private $phids; 13 14 14 15 const ORDER_APPLICATION = 'order:application'; ··· 38 39 39 40 public function withUnlisted($unlisted) { 40 41 $this->unlisted = $unlisted; 42 + return $this; 43 + } 44 + 45 + public function withLaunchable($launchable) { 46 + $this->launchable = $launchable; 41 47 return $this; 42 48 } 43 49 ··· 116 122 } 117 123 } 118 124 } 125 + 126 + if ($this->launchable !== null) { 127 + foreach ($apps as $key => $app) { 128 + if ($app->shouldAppearInLaunchView() != $this->launchable) { 129 + unset($apps[$key]); 130 + } 131 + } 132 + } 133 + 119 134 120 135 switch ($this->order) { 121 136 case self::ORDER_NAME:
+4 -4
src/applications/metamta/application/PhabricatorApplicationMetaMTA.php
··· 2 2 3 3 final class PhabricatorApplicationMetaMTA extends PhabricatorApplication { 4 4 5 - public function getBaseURI() { 6 - return '/mail/'; 7 - } 8 - 9 5 public function getIconName() { 10 6 return 'metamta'; 7 + } 8 + 9 + public function getShortDescription() { 10 + return pht('Delivers Mail'); 11 11 } 12 12 13 13 public function getFlavorText() {
+1 -1
src/applications/notification/application/PhabricatorApplicationNotifications.php
··· 7 7 } 8 8 9 9 public function getShortDescription() { 10 - return pht('Beep Beep Bloop'); 10 + return pht('Real-Time Updates and Alerts'); 11 11 } 12 12 13 13 public function getRoutes() {
+4
src/applications/nuance/application/PhabricatorApplicationNuance.php
··· 27 27 return '/nuance/'; 28 28 } 29 29 30 + public function getShortDescription() { 31 + return pht('High-Volume Task Queues'); 32 + } 33 + 30 34 public function getRoutes() { 31 35 return array( 32 36 '/nuance/' => array(
+6 -2
src/applications/oauthserver/application/PhabricatorApplicationOAuthServer.php
··· 7 7 } 8 8 9 9 public function getShortDescription() { 10 - return pht('OAuth Provider'); 10 + return pht('OAuth Login Provider'); 11 11 } 12 12 13 13 public function getIconName() { ··· 23 23 } 24 24 25 25 public function getApplicationGroup() { 26 - return self::GROUP_UTILITIES; 26 + return self::GROUP_ADMIN; 27 27 } 28 28 29 29 public function isBeta() { 30 30 return true; 31 + } 32 + 33 + public function getHelpURI() { 34 + return PhabricatorEnv::getDoclink('Using the Phabricator OAuth Server'); 31 35 } 32 36 33 37 public function getRoutes() {
+2 -2
src/applications/owners/application/PhabricatorApplicationOwners.php
··· 11 11 } 12 12 13 13 public function getShortDescription() { 14 - return pht('Group Source Code'); 14 + return pht('Track Ownership of Source Code'); 15 15 } 16 16 17 17 public function getTitleGlyph() { ··· 27 27 } 28 28 29 29 public function getApplicationGroup() { 30 - return self::GROUP_ORGANIZATION; 30 + return self::GROUP_UTILITIES; 31 31 } 32 32 33 33 public function getRoutes() {
+1 -1
src/applications/passphrase/application/PhabricatorApplicationPassphrase.php
··· 7 7 } 8 8 9 9 public function getShortDescription() { 10 - return pht('Credential Management'); 10 + return pht('Store Passwords and Credentials'); 11 11 } 12 12 13 13 public function getIconName() {
+19 -13
src/applications/passphrase/controller/PassphraseCredentialEditController.php
··· 26 26 return new Aphront404Response(); 27 27 } 28 28 29 - $type = PassphraseCredentialType::getTypeByConstant( 30 - $credential->getCredentialType()); 31 - if (!$type) { 32 - throw new Exception(pht('Credential has invalid type "%s"!', $type)); 33 - } 34 - 35 - if (!$type->isCreateable()) { 36 - throw new Exception( 37 - pht('Credential has noncreateable type "%s"!', $type)); 38 - } 29 + $type = $this->getCredentialType($credential->getCredentialType()); 39 30 40 31 $is_new = false; 41 32 } else { 42 33 $type_const = $request->getStr('type'); 43 - $type = PassphraseCredentialType::getTypeByConstant($type_const); 44 - if (!$type) { 45 - return new Aphront404Response(); 34 + $type = $this->getCredentialType($type_const); 35 + 36 + if (!$type->isCreateable()) { 37 + throw new Exception( 38 + pht( 39 + 'Credential has noncreateable type "%s"!', 40 + $credential->getCredentialType())); 46 41 } 47 42 48 43 $credential = PassphraseCredential::initializeNewCredential($viewer) ··· 356 351 'title' => $title, 357 352 'device' => true, 358 353 )); 354 + } 355 + 356 + private function getCredentialType($type_const) { 357 + $type = PassphraseCredentialType::getTypeByConstant($type_const); 358 + 359 + if (!$type) { 360 + throw new Exception( 361 + pht('Credential has invalid type "%s"!', $type_const)); 362 + } 363 + 364 + return $type; 359 365 } 360 366 361 367 }
+4
src/applications/paste/application/PhabricatorApplicationPaste.php
··· 18 18 return self::GROUP_UTILITIES; 19 19 } 20 20 21 + public function getShortDescription() { 22 + return pht('Share Text Snippets'); 23 + } 24 + 21 25 public function getRemarkupRules() { 22 26 return array( 23 27 new PhabricatorPasteRemarkupRule(),
+1 -1
src/applications/people/application/PhabricatorApplicationPeople.php
··· 3 3 final class PhabricatorApplicationPeople extends PhabricatorApplication { 4 4 5 5 public function getShortDescription() { 6 - return pht('User Accounts'); 6 + return pht('User Accounts and Profiles'); 7 7 } 8 8 9 9 public function getBaseURI() {
+1 -1
src/applications/phlux/application/PhabricatorApplicationPhlux.php
··· 7 7 } 8 8 9 9 public function getShortDescription() { 10 - return pht('Configuration Store'); 10 + return pht('Key/Value Configuration Store'); 11 11 } 12 12 13 13 public function getIconName() {
+1 -1
src/applications/pholio/application/PhabricatorApplicationPholio.php
··· 7 7 } 8 8 9 9 public function getShortDescription() { 10 - return pht('Design Review'); 10 + return pht('Review Mocks and Design'); 11 11 } 12 12 13 13 public function getIconName() {
+1 -1
src/applications/phortune/application/PhabricatorApplicationPhortune.php
··· 7 7 } 8 8 9 9 public function getShortDescription() { 10 - return pht('Account and Billing'); 10 + return pht('Accounts and Billing'); 11 11 } 12 12 13 13 public function getIconName() {
+2 -2
src/applications/phrequent/application/PhabricatorApplicationPhrequent.php
··· 3 3 final class PhabricatorApplicationPhrequent extends PhabricatorApplication { 4 4 5 5 public function getShortDescription() { 6 - return pht('Track Time'); 6 + return pht('Track Time Spent'); 7 7 } 8 8 9 9 public function getBaseURI() { ··· 19 19 } 20 20 21 21 public function getApplicationGroup() { 22 - return self::GROUP_ORGANIZATION; 22 + return self::GROUP_UTILITIES; 23 23 } 24 24 25 25 public function getApplicationOrder() {
+5
src/applications/phrequent/storage/PhrequentTimeBlock.php
··· 23 23 public function getObjectTimeRanges($now) { 24 24 $ranges = array(); 25 25 26 + $range_start = time(); 27 + foreach ($this->events as $event) { 28 + $range_start = min($range_start, $event->getDateStarted()); 29 + } 30 + 26 31 $object_ranges = array(); 27 32 foreach ($this->events as $event) { 28 33
+2
src/applications/policy/__tests__/PhabricatorPolicyDataTestCase.php
··· 14 14 $proj_a = id(new PhabricatorProject()) 15 15 ->setName('A') 16 16 ->setAuthorPHID($author->getPHID()) 17 + ->setIcon('fa-briefcase') 17 18 ->save(); 18 19 $proj_b = id(new PhabricatorProject()) 19 20 ->setName('B') 20 21 ->setAuthorPHID($author->getPHID()) 22 + ->setIcon('fa-briefcase') 21 23 ->save(); 22 24 23 25 $proj_a->setViewPolicy($proj_b->getPHID())->save();
+1 -1
src/applications/ponder/application/PhabricatorApplicationPonder.php
··· 7 7 } 8 8 9 9 public function getShortDescription() { 10 - return pht('Find Answers'); 10 + return pht('Questions and Answers'); 11 11 } 12 12 13 13 public function getIconName() {
+1 -1
src/applications/project/application/PhabricatorApplicationProject.php
··· 7 7 } 8 8 9 9 public function getShortDescription() { 10 - return pht('Organize Work'); 10 + return pht('Create Groups, Tags, and Projects'); 11 11 } 12 12 13 13 public function getBaseURI() {
+9 -2
src/applications/project/editor/PhabricatorProjectTransactionEditor.php
··· 305 305 306 306 $slug_xaction = last($xactions); 307 307 $new = $slug_xaction->getNewValue(); 308 - $slugs_used_already = id(new PhabricatorProjectSlug()) 309 - ->loadAllWhere('slug IN (%Ls)', $new); 308 + 309 + if ($new) { 310 + $slugs_used_already = id(new PhabricatorProjectSlug()) 311 + ->loadAllWhere('slug IN (%Ls)', $new); 312 + } else { 313 + // The project doesn't have any extra slugs. 314 + $slugs_used_already = array(); 315 + } 316 + 310 317 $slugs_used_already = mgroup($slugs_used_already, 'getProjectPHID'); 311 318 foreach ($slugs_used_already as $project_phid => $used_slugs) { 312 319 $used_slug_strs = mpull($used_slugs, 'getSlug');
+1 -1
src/applications/releeph/application/PhabricatorApplicationReleeph.php
··· 7 7 } 8 8 9 9 public function getShortDescription() { 10 - return pht('Release Branches'); 10 + return pht('Pull Requests'); 11 11 } 12 12 13 13 public function getBaseURI() {
+1 -1
src/applications/repository/application/PhabricatorApplicationRepositories.php
··· 14 14 } 15 15 16 16 public function getShortDescription() { 17 - return 'Track Repositories'; 17 + return pht('(Deprecated)'); 18 18 } 19 19 20 20 public function getTitleGlyph() {
+1 -1
src/applications/repository/engine/PhabricatorRepositoryPullEngine.php
··· 384 384 // This behavior has been reverted, but users who updated between Feb 1, 385 385 // 2012 and Mar 1, 2012 will have the erroring version. Do a dumb test 386 386 // against stdout to check for this possibility. 387 - // See: https://github.com/facebook/phabricator/issues/101/ 387 + // See: https://github.com/phacility/phabricator/issues/101/ 388 388 389 389 // NOTE: Mercurial has translated versions, which translate this error 390 390 // string. In a translated version, the string will be something else,
+4
src/applications/repository/management/PhabricatorRepositoryManagementParentsWorkflow.php
··· 58 58 59 59 $graph = array(); 60 60 foreach ($refs as $ref) { 61 + if (!$repo->shouldTrackBranch($ref->getRefName())) { 62 + continue; 63 + } 64 + 61 65 $console->writeOut( 62 66 "%s\n", 63 67 pht('Rebuilding branch "%s"...', $ref->getRefName()));
+1 -1
src/applications/search/application/PhabricatorApplicationSearch.php
··· 11 11 } 12 12 13 13 public function getShortDescription() { 14 - return pht('Search & Find'); 14 + return pht('Full-Text Search'); 15 15 } 16 16 17 17 public function getFlavorText() {
+1 -1
src/applications/search/engine/PhabricatorSearchEngineElastic.php
··· 97 97 98 98 if (strlen($query->getParameter('query'))) { 99 99 $spec[] = array( 100 - 'field' => array( 100 + 'term' => array( 101 101 'field.corpus' => $query->getParameter('query'), 102 102 ), 103 103 );
+5 -1
src/applications/settings/application/PhabricatorApplicationSettings.php
··· 7 7 } 8 8 9 9 public function getShortDescription() { 10 - return 'User Preferences'; 10 + return pht('User Preferences'); 11 11 } 12 12 13 13 public function getIconName() { ··· 15 15 } 16 16 17 17 public function canUninstall() { 18 + return false; 19 + } 20 + 21 + public function shouldAppearInLaunchView() { 18 22 return false; 19 23 } 20 24
+1 -1
src/applications/tokens/application/PhabricatorApplicationTokens.php
··· 19 19 } 20 20 21 21 public function getShortDescription() { 22 - return pht('Acquire Trinkets'); 22 + return pht('Award and Acquire Trinkets'); 23 23 } 24 24 25 25 public function getApplicationGroup() {
+1 -1
src/applications/uiexample/application/PhabricatorApplicationUIExamples.php
··· 7 7 } 8 8 9 9 public function getShortDescription() { 10 - return 'Developer UI Examples'; 10 + return pht('Phabricator Developer UI Examples'); 11 11 } 12 12 13 13 public function getIconName() {
+1 -1
src/docs/user/feedback.diviner
··· 39 39 = GitHub Issues = 40 40 41 41 You can also use 42 - [[https://github.com/facebook/phabricator/issues/new | GitHub Issues]] if you 42 + [[https://github.com/phacility/phabricator/issues/new | GitHub Issues]] if you 43 43 prefer. 44 44 45 45 = IRC =
+3 -3
src/docs/user/installation_guide.diviner
··· 95 95 dependencies: 96 96 97 97 $ cd somewhere/ # pick some install directory 98 - somewhere/ $ git clone git://github.com/facebook/libphutil.git 99 - somewhere/ $ git clone git://github.com/facebook/arcanist.git 100 - somewhere/ $ git clone git://github.com/facebook/phabricator.git 98 + somewhere/ $ git clone git://github.com/phacility/libphutil.git 99 + somewhere/ $ git clone git://github.com/phacility/arcanist.git 100 + somewhere/ $ git clone git://github.com/phacility/phabricator.git 101 101 102 102 = Installing APC (Optional) = 103 103
+3 -3
src/docs/user/userguide/arcanist.diviner
··· 92 92 93 93 To install Arcanist, pick an install directory and clone the code from GitHub: 94 94 95 - some_install_path/ $ git clone git://github.com/facebook/libphutil.git 96 - some_install_path/ $ git clone git://github.com/facebook/arcanist.git 95 + some_install_path/ $ git clone git://github.com/phacility/libphutil.git 96 + some_install_path/ $ git clone git://github.com/phacility/arcanist.git 97 97 98 98 This should leave you with a directory structure like this 99 99 ··· 162 162 163 163 The first place where the setting is defined wins. 164 164 165 - Existing settings can be printed with `arc set-config --show`. 165 + Existing settings can be printed with `arc get-config`. 166 166 167 167 == Next Steps == 168 168
+1 -1
src/docs/user/userguide/arcanist_new_project.diviner
··· 74 74 solution to certificate validity problems, and is discouraged. Instead, 75 75 use valid certificates. 76 76 77 - For a complete list of options, run `arc set-config --show`. Although all 77 + For a complete list of options, run `arc get-config`. Although all 78 78 options can be set in `.arcconfig`, some options (like `editor`) usually do not 79 79 make sense to set here because they're likely to vary from user to user. 80 80
+2 -2
src/docs/user/userguide/arcanist_quick_start.diviner
··· 23 23 24 24 $ mkdir somewhere/ 25 25 $ cd somewhere/ 26 - somewhere/ $ git clone git://github.com/facebook/libphutil.git 27 - somewhere/ $ git clone git://github.com/facebook/arcanist.git 26 + somewhere/ $ git clone git://github.com/phacility/libphutil.git 27 + somewhere/ $ git clone git://github.com/phacility/arcanist.git 28 28 29 29 Add `arc` to your path: 30 30
+18 -30
src/view/phui/PHUIFeedStoryView.php
··· 142 142 143 143 require_celerity_resource('phui-feed-story-css'); 144 144 Javelin::initBehavior('phabricator-hovercards'); 145 - $oneline = !$this->hasChildren(); 146 145 147 146 $body = null; 148 147 $foot = null; ··· 186 185 $icon->setSpriteSheet(PHUIIconView::SPRITE_APPS); 187 186 } 188 187 189 - $ol_foot = null; 190 - if ($oneline) { 191 - $ol_foot = phutil_tag( 192 - 'div', 193 - array( 194 - 'class' => 'phui-feed-story-oneline-foot' 195 - ), 196 - array( 197 - $icon, 198 - $foot)); 199 - } 200 - 201 188 $action_list = array(); 202 189 $icons = null; 203 190 foreach ($this->actions as $action) { ··· 223 210 'class' => 'phui-feed-story-head', 224 211 ), 225 212 array( 226 - (!$oneline ? $actor : null), 213 + $actor, 227 214 nonempty($this->title, pht('Untitled Story')), 228 215 $icons, 229 - $ol_foot 230 216 )); 231 217 232 218 if (!empty($this->tokenBar)) { ··· 249 235 $body_content); 250 236 } 251 237 252 - if ($oneline) { 253 - $foot = null; 254 - } else { 255 - $foot = phutil_tag( 256 - 'div', 257 - array( 258 - 'class' => 'phui-feed-story-foot', 259 - ), 260 - array( 261 - $icon, 262 - $foot)); 263 - } 238 + $foot = phutil_tag( 239 + 'div', 240 + array( 241 + 'class' => 'phui-feed-story-foot', 242 + ), 243 + array( 244 + $icon, 245 + $foot)); 264 246 265 247 $classes = array('phui-feed-story'); 266 - if ($oneline) { 267 - $classes[] = 'phui-feed-story-oneline'; 268 - } 269 248 270 249 return id(new PHUIBoxView()) 271 250 ->addClass(implode(' ', $classes)) ··· 281 260 break; 282 261 case PhabricatorMacroPHIDTypeMacro::TYPECONST: 283 262 $this->setAppIcon("macro-dark"); 263 + break; 264 + case ManiphestPHIDTypeTask::TYPECONST: 265 + $this->setAppIcon('maniphest-dark'); 266 + break; 267 + case DifferentialPHIDTypeRevision::TYPECONST: 268 + $this->setAppIcon('differential-dark'); 269 + break; 270 + case PhabricatorCalendarPHIDTypeEvent::TYPECONST: 271 + $this->setAppIcon('calendar-dark'); 284 272 break; 285 273 } 286 274 }
+30
src/view/phui/PHUIObjectItemView.php
··· 21 21 private $imageURI; 22 22 private $state; 23 23 private $fontIcon; 24 + private $imageIcon; 24 25 25 26 const AGE_FRESH = 'fresh'; 26 27 const AGE_STALE = 'stale'; ··· 115 116 return $this->imageURI; 116 117 } 117 118 119 + public function setImageIcon($image_icon) { 120 + $this->imageIcon = $image_icon; 121 + return $this; 122 + } 123 + 124 + public function getImageIcon() { 125 + return $this->imageIcon; 126 + } 127 + 118 128 public function setState($state) { 119 129 $this->state = $state; 120 130 switch ($state) { ··· 286 296 287 297 if ($this->getImageURI()) { 288 298 $item_classes[] = 'phui-object-item-with-image'; 299 + } 300 + 301 + if ($this->getImageIcon()) { 302 + $item_classes[] = 'phui-object-item-with-image-icon'; 289 303 } 290 304 291 305 if ($this->fontIcon) { ··· 520 534 'style' => 'background-image: url('.$this->getImageURI().')', 521 535 ), 522 536 ''); 537 + } else if ($this->getImageIcon()) { 538 + $image = phutil_tag( 539 + 'div', 540 + array( 541 + 'class' => 'phui-object-item-image-icon', 542 + ), 543 + $this->getImageIcon()); 544 + } 545 + 546 + if ($image && $this->href) { 547 + $image = phutil_tag( 548 + 'a', 549 + array( 550 + 'href' => $this->href, 551 + ), 552 + $image); 523 553 } 524 554 525 555 $ficon = null;
+3 -11
support/aphlict/client/build_aphlict_client.sh
··· 9 9 fi; 10 10 11 11 set -e 12 - set -x 13 12 14 - # cp -R $ROOT/externals/vegas/src $BASEDIR/src/vegas 15 - 16 - (cd $BASEDIR && $MXMLC \ 17 - -output aphlict.swf \ 13 + $MXMLC \ 14 + -output=$ROOT/webroot/rsrc/swf/aphlict.swf \ 18 15 -default-background-color=0x444444 \ 19 16 -default-size=500,500 \ 20 17 -warnings=true \ 21 - -debug=true \ 22 18 -source-path=$ROOT/externals/vegas/src \ 23 19 -static-link-runtime-shared-libraries=true \ 24 - src/Aphlict.as) 25 - 26 - mv $BASEDIR/aphlict.swf $ROOT/webroot/rsrc/swf/aphlict.swf 27 - 28 - # -target-player=10.2.0 \ 20 + $BASEDIR/src/AphlictClient.as
+16 -95
support/aphlict/client/src/Aphlict.as
··· 1 1 package { 2 2 3 - import flash.net.*; 4 - import flash.utils.*; 5 - import flash.media.*; 6 - import flash.display.*; 7 - import flash.events.*; 3 + import flash.display.Sprite; 8 4 import flash.external.ExternalInterface; 5 + import flash.net.LocalConnection; 9 6 10 - import vegas.strings.JSON; 11 7 12 8 public class Aphlict extends Sprite { 13 9 14 - private var client:String; 10 + /** 11 + * A transport channel used to receive data. 12 + */ 13 + protected var recv:LocalConnection; 15 14 16 - private var socket:Socket; 17 - private var readBuffer:ByteArray; 15 + /** 16 + * A transport channel used to send data. 17 + */ 18 + protected var send:LocalConnection; 18 19 19 - private var remoteServer:String; 20 - private var remotePort:Number; 21 20 22 21 public function Aphlict() { 23 22 super(); 24 23 25 - ExternalInterface.addCallback('connect', this.externalConnect); 26 - ExternalInterface.call( 27 - 'JX.Stratcom.invoke', 28 - 'aphlict-component-ready', 29 - null, 30 - {}); 31 - } 32 - 33 - public function externalConnect(server:String, port:Number):void { 34 - this.externalInvoke('connect'); 35 - 36 - this.remoteServer = server; 37 - this.remotePort = port; 24 + this.recv = new LocalConnection(); 25 + this.recv.client = this; 38 26 39 - this.connectToServer(); 27 + this.send = new LocalConnection(); 40 28 } 41 29 42 - 43 - public function connectToServer():void { 44 - var socket:Socket = new Socket(); 45 - 46 - socket.addEventListener(Event.CONNECT, didConnectSocket); 47 - socket.addEventListener(Event.CLOSE, didCloseSocket); 48 - socket.addEventListener(ProgressEvent.SOCKET_DATA, didReceiveSocket); 49 - 50 - socket.addEventListener(IOErrorEvent.IO_ERROR, didIOErrorSocket); 51 - socket.addEventListener( 52 - SecurityErrorEvent.SECURITY_ERROR, 53 - didSecurityErrorSocket); 54 - 55 - socket.connect(this.remoteServer, this.remotePort); 56 - 57 - this.readBuffer = new ByteArray(); 58 - this.socket = socket; 59 - } 60 - 61 - private function didConnectSocket(event:Event):void { 62 - this.externalInvoke('connected'); 63 - } 64 - 65 - private function didCloseSocket(event:Event):void { 66 - this.externalInvoke('close'); 67 - } 68 - 69 - private function didIOErrorSocket(event:IOErrorEvent):void { 70 - this.externalInvoke('error', event.text); 71 - } 72 - 73 - private function didSecurityErrorSocket(event:SecurityErrorEvent):void { 74 - this.externalInvoke('error', event.text); 75 - } 76 - 77 - private function didReceiveSocket(event:Event):void { 78 - var b:ByteArray = this.readBuffer; 79 - this.socket.readBytes(b, b.length); 80 - 81 - do { 82 - b = this.readBuffer; 83 - b.position = 0; 84 - 85 - if (b.length <= 8) { 86 - break; 87 - } 88 - 89 - var msg_len:Number = parseInt(b.readUTFBytes(8), 10); 90 - if (b.length >= msg_len + 8) { 91 - var bytes:String = b.readUTFBytes(msg_len); 92 - var data:Object = vegas.strings.JSON.deserialize(bytes); 93 - var t:ByteArray = new ByteArray(); 94 - t.writeBytes(b, msg_len + 8); 95 - this.readBuffer = t; 96 - 97 - this.receiveMessage(data); 98 - } else { 99 - break; 100 - } 101 - } while (true); 102 - 103 - } 104 - 105 - public function receiveMessage(msg:Object):void { 106 - this.externalInvoke('receive', msg); 107 - } 108 - 109 - public function externalInvoke(type:String, object:Object = null):void { 30 + protected function externalInvoke(type:String, object:Object = null):void { 110 31 ExternalInterface.call('JX.Aphlict.didReceiveEvent', type, object); 111 32 } 112 33 113 - public function log(message:String):void { 114 - ExternalInterface.call('console.log', message); 34 + protected function log(message:String):void { 35 + this.externalInvoke('log', message); 115 36 } 116 37 117 38 }
+129
support/aphlict/client/src/AphlictClient.as
··· 1 + package { 2 + 3 + import flash.events.TimerEvent; 4 + import flash.external.ExternalInterface; 5 + import flash.utils.Timer; 6 + 7 + 8 + public class AphlictClient extends Aphlict { 9 + 10 + /** 11 + * The connection name for this client. This will be used for the 12 + * @{class:LocalConnection} object. 13 + */ 14 + private var client:String; 15 + 16 + /** 17 + * The expiry timestamp for the @{class:AphlictMaster}. If this time is 18 + * elapsed then the master will be assumed to be dead and another 19 + * @{class:AphlictClient} will create a master. 20 + */ 21 + private var expiry:Number = 0; 22 + 23 + /** 24 + * The interval at which to ping the @{class:AphlictMaster}. 25 + */ 26 + public static const INTERVAL:Number = 3000; 27 + 28 + private var master:AphlictMaster; 29 + private var timer:Timer; 30 + 31 + private var remoteServer:String; 32 + private var remotePort:Number; 33 + 34 + 35 + public function AphlictClient() { 36 + super(); 37 + 38 + ExternalInterface.addCallback('connect', this.externalConnect); 39 + ExternalInterface.call( 40 + 'JX.Stratcom.invoke', 41 + 'aphlict-component-ready', 42 + null, 43 + {}); 44 + } 45 + 46 + public function externalConnect(server:String, port:Number):void { 47 + this.externalInvoke('connect'); 48 + 49 + this.remoteServer = server; 50 + this.remotePort = port; 51 + 52 + this.client = AphlictClient.generateClientId(); 53 + this.recv.connect(this.client); 54 + 55 + this.timer = new Timer(AphlictClient.INTERVAL); 56 + this.timer.addEventListener(TimerEvent.TIMER, this.keepalive); 57 + 58 + this.connectToMaster(); 59 + } 60 + 61 + /** 62 + * Generate a unique identifier that will be used to communicate with the 63 + * @{class:AphlictMaster}. 64 + */ 65 + private static function generateClientId():String { 66 + return 'aphlict_client_' + Math.round(Math.random() * 100000); 67 + } 68 + 69 + /** 70 + * Create a new connection to the @{class:AphlictMaster}. 71 + * 72 + * If there is no current @{class:AphlictMaster} instance, then a new master 73 + * will be created. 74 + */ 75 + private function connectToMaster():void { 76 + this.timer.stop(); 77 + 78 + // Try to become the master. 79 + try { 80 + this.log('Attempting to become the master...'); 81 + this.master = new AphlictMaster(this.remoteServer, this.remotePort); 82 + this.log('I am the master.'); 83 + } catch (x:Error) { 84 + // Couldn't become the master 85 + this.log('Cannot become the master... probably one already exists'); 86 + } 87 + 88 + this.send.send('aphlict_master', 'register', this.client); 89 + this.expiry = new Date().getTime() + (5 * AphlictClient.INTERVAL); 90 + this.log('Registered client ' + this.client); 91 + 92 + this.timer.start(); 93 + } 94 + 95 + /** 96 + * Send a keepalive signal to the @{class:AphlictMaster}. 97 + * 98 + * If the connection to the master has expired (because the master has not 99 + * sent a heartbeat signal), then a new connection to master will be 100 + * created. 101 + */ 102 + private function keepalive(event:TimerEvent):void { 103 + if (new Date().getTime() > this.expiry) { 104 + this.connectToMaster(); 105 + } 106 + 107 + this.send.send('aphlict_master', 'ping', this.client); 108 + } 109 + 110 + /** 111 + * This function is used to receive the heartbeat signal from the 112 + * @{class:AphlictMaster}. 113 + */ 114 + public function pong():void { 115 + this.expiry = new Date().getTime() + (2 * AphlictClient.INTERVAL); 116 + } 117 + 118 + /** 119 + * Receive a message from the Aphlict Server, via the 120 + * @{class:AphlictMaster}. 121 + */ 122 + public function receiveMessage(msg:Object):void { 123 + this.log('Received message.'); 124 + this.externalInvoke('receive', msg); 125 + } 126 + 127 + } 128 + 129 + }
+166
support/aphlict/client/src/AphlictMaster.as
··· 1 + package { 2 + 3 + import flash.events.Event; 4 + import flash.events.IOErrorEvent; 5 + import flash.events.ProgressEvent; 6 + import flash.events.SecurityErrorEvent; 7 + import flash.events.TimerEvent; 8 + import flash.net.Socket; 9 + import flash.utils.ByteArray; 10 + import flash.utils.Dictionary; 11 + import flash.utils.Timer; 12 + import vegas.strings.JSON; 13 + 14 + 15 + public class AphlictMaster extends Aphlict { 16 + 17 + /** 18 + * The pool of connected clients. 19 + */ 20 + private var clients:Dictionary; 21 + 22 + /** 23 + * A timer used to trigger periodic events. 24 + */ 25 + private var timer:Timer; 26 + 27 + /** 28 + * The interval after which clients will be considered dead and removed 29 + * from the pool. 30 + */ 31 + public static const PURGE_INTERVAL:Number = 3 * AphlictClient.INTERVAL; 32 + 33 + /** 34 + * The hostname for the Aphlict Server. 35 + */ 36 + private var remoteServer:String; 37 + 38 + /** 39 + * The port number for the Aphlict Server. 40 + */ 41 + private var remotePort:Number; 42 + 43 + private var socket:Socket; 44 + private var readBuffer:ByteArray; 45 + 46 + 47 + public function AphlictMaster(server:String, port:Number) { 48 + super(); 49 + 50 + this.remoteServer = server; 51 + this.remotePort = port; 52 + 53 + // Connect to the Aphlict Server. 54 + this.recv.connect('aphlict_master'); 55 + this.connectToServer(); 56 + 57 + this.clients = new Dictionary(); 58 + 59 + // Start a timer and regularly purge dead clients. 60 + this.timer = new Timer(AphlictMaster.PURGE_INTERVAL); 61 + this.timer.addEventListener(TimerEvent.TIMER, this.purgeClients); 62 + this.timer.start(); 63 + } 64 + 65 + /** 66 + * Register a @{class:AphlictClient}. 67 + */ 68 + public function register(client:String):void { 69 + if (!this.clients[client]) { 70 + this.log('Registering client: ' + client); 71 + this.clients[client] = new Date().getTime(); 72 + } 73 + } 74 + 75 + /** 76 + * Purge stale client connections from the client pool. 77 + */ 78 + private function purgeClients(event:TimerEvent):void { 79 + for (var client:String in this.clients) { 80 + var checkin:Number = this.clients[client]; 81 + 82 + if (new Date().getTime() - checkin > AphlictMaster.PURGE_INTERVAL) { 83 + this.log('Purging client: ' + client); 84 + delete this.clients[client]; 85 + } 86 + } 87 + } 88 + 89 + /** 90 + * Clients will regularly "ping" the master to let us know that they are 91 + * still alive. We will "pong" them back to let the client know that the 92 + * master is still alive. 93 + */ 94 + public function ping(client:String):void { 95 + this.clients[client] = new Date().getTime(); 96 + this.send.send(client, 'pong'); 97 + } 98 + 99 + private function connectToServer():void { 100 + var socket:Socket = new Socket(); 101 + 102 + socket.addEventListener(Event.CONNECT, didConnectSocket); 103 + socket.addEventListener(Event.CLOSE, didCloseSocket); 104 + socket.addEventListener(ProgressEvent.SOCKET_DATA, didReceiveSocket); 105 + 106 + socket.addEventListener(IOErrorEvent.IO_ERROR, didIOErrorSocket); 107 + socket.addEventListener( 108 + SecurityErrorEvent.SECURITY_ERROR, 109 + didSecurityErrorSocket); 110 + 111 + socket.connect(this.remoteServer, this.remotePort); 112 + 113 + this.readBuffer = new ByteArray(); 114 + this.socket = socket; 115 + } 116 + 117 + private function didConnectSocket(event:Event):void { 118 + this.externalInvoke('connected'); 119 + } 120 + 121 + private function didCloseSocket(event:Event):void { 122 + this.externalInvoke('close'); 123 + } 124 + 125 + private function didIOErrorSocket(event:IOErrorEvent):void { 126 + this.externalInvoke('error', event.text); 127 + } 128 + 129 + private function didSecurityErrorSocket(event:SecurityErrorEvent):void { 130 + this.externalInvoke('error', event.text); 131 + } 132 + 133 + private function didReceiveSocket(event:Event):void { 134 + var b:ByteArray = this.readBuffer; 135 + this.socket.readBytes(b, b.length); 136 + 137 + do { 138 + b = this.readBuffer; 139 + b.position = 0; 140 + 141 + if (b.length <= 8) { 142 + break; 143 + } 144 + 145 + var msg_len:Number = parseInt(b.readUTFBytes(8), 10); 146 + if (b.length >= msg_len + 8) { 147 + var bytes:String = b.readUTFBytes(msg_len); 148 + var data:Object = vegas.strings.JSON.deserialize(bytes); 149 + var t:ByteArray = new ByteArray(); 150 + t.writeBytes(b, msg_len + 8); 151 + this.readBuffer = t; 152 + 153 + // Send the message to all clients. 154 + for (var client:String in this.clients) { 155 + this.log('Sending message to client: ' + client); 156 + this.send.send(client, 'receiveMessage', data); 157 + } 158 + } else { 159 + break; 160 + } 161 + } while (true); 162 + } 163 + 164 + } 165 + 166 + }
-25
webroot/rsrc/css/application/directory/phabricator-jump-nav.css
··· 1 - /** 2 - * @provides phabricator-jump-nav 3 - */ 4 - 5 - .phabricator-jump-nav-form { 6 - text-align: center; 7 - padding: 0px; 8 - margin: 0; 9 - } 10 - 11 - input.phabricator-jump-nav[type='text'] { 12 - font-size: 16px; 13 - width: 100%; 14 - } 15 - 16 - .phabricator-jump-nav-caption { 17 - margin-top: 4px; 18 - font-size: 11px; 19 - color: {$greytext}; 20 - text-align: left; 21 - } 22 - 23 - .phabricator-jump-nav-container form { 24 - padding: 12px 16px; 25 - }
+51
webroot/rsrc/css/phui/phui-object-item-list-view.css
··· 671 671 border: none; 672 672 border-bottom: 1px solid {$thinblueborder}; 673 673 } 674 + 675 + 676 + /* - Launcher List ---------------------------------------------------------- */ 677 + 678 + .launcher-header { 679 + margin: 8px 16px -4px; 680 + clear: both; 681 + color: {$darkbluetext}; 682 + } 683 + 684 + .launcher-header:nth-of-type(1) { 685 + margin-top: 24px; 686 + } 687 + 688 + .phui-object-item-launcher-list { 689 + overflow: hidden; 690 + } 691 + 692 + .device-desktop .phui-object-item-launcher-list .phui-object-item { 693 + width: 32.333%; 694 + float: left; 695 + margin-right: 1%; 696 + box-sizing: border-box; 697 + } 698 + 699 + .phui-object-item-image-icon { 700 + background: none; 701 + } 702 + 703 + .phui-object-item-image-icon { 704 + width: 30px; 705 + height: 30px; 706 + margin: 4px 4px 4px 4px; 707 + position: absolute; 708 + } 709 + 710 + .phui-object-item-image-icon .phui-icon-view { 711 + position: absolute; 712 + width: 28px; 713 + height: 28px; 714 + left: 6px; 715 + top: 6px; 716 + } 717 + 718 + .phui-object-item-with-image-icon .phui-object-item-frame { 719 + min-height: 48px; 720 + } 721 + 722 + .phui-object-item-with-image-icon .phui-object-item-content-box { 723 + margin-left: 44px; 724 + }
webroot/rsrc/swf/aphlict.swf

This is a binary file and will not be displayed.