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

Modernize Maniphest

Summary:
A few things
- pht Maniphest where I could
- implement dust background
- optimize pages for mobile
- adds aphront-two-column-layout
- reworks maniphest page with two column layout
- tweaks task table for mobile, though we should move to object-list-view

Stopping here as I want to get feedback in. Super excited about mobile and the new tasks views. Only sort of excited about the sidebar filters, they need more UI work, but we should talk about that.

Test Plan: Test Maniphest, Differential, and Homepage views. Sort tasks, make reports

Reviewers: epriestley, btrahan

Reviewed By: btrahan

CC: aran, Korvin

Differential Revision: https://secure.phabricator.com/D5314

+425 -383
+53 -53
src/__celerity_resource_map__.php
··· 569 569 ), 570 570 '/rsrc/image/texture/dust_background.jpg' => 571 571 array( 572 - 'hash' => 'c32ab9819d4af583f5609bbd3750721a', 573 - 'uri' => '/res/c32ab981/rsrc/image/texture/dust_background.jpg', 572 + 'hash' => '1ff330c03712e08ca2eed006ccc6c1e7', 573 + 'uri' => '/res/1ff330c0/rsrc/image/texture/dust_background.jpg', 574 574 'disk' => '/rsrc/image/texture/dust_background.jpg', 575 575 'type' => 'jpg', 576 576 ), ··· 683 683 ), 684 684 'aphront-form-view-css' => 685 685 array( 686 - 'uri' => '/res/efaecc2d/rsrc/css/aphront/form-view.css', 686 + 'uri' => '/res/accfc3a4/rsrc/css/aphront/form-view.css', 687 687 'type' => 'css', 688 688 'requires' => 689 689 array( ··· 692 692 ), 693 693 'aphront-list-filter-view-css' => 694 694 array( 695 - 'uri' => '/res/e783d6e1/rsrc/css/aphront/list-filter-view.css', 695 + 'uri' => '/res/cc6e940e/rsrc/css/aphront/list-filter-view.css', 696 696 'type' => 'css', 697 697 'requires' => 698 698 array( ··· 828 828 ), 829 829 'conpherence-widget-pane-css' => 830 830 array( 831 - 'uri' => '/res/e67ad581/rsrc/css/application/conpherence/widget-pane.css', 831 + 'uri' => '/res/2b4113f7/rsrc/css/application/conpherence/widget-pane.css', 832 832 'type' => 'css', 833 833 'requires' => 834 834 array( ··· 2591 2591 ), 2592 2592 'maniphest-task-summary-css' => 2593 2593 array( 2594 - 'uri' => '/res/14e825ce/rsrc/css/application/maniphest/task-summary.css', 2594 + 'uri' => '/res/b3930263/rsrc/css/application/maniphest/task-summary.css', 2595 2595 'type' => 'css', 2596 2596 'requires' => 2597 2597 array( ··· 2708 2708 ), 2709 2709 'phabricator-core-buttons-css' => 2710 2710 array( 2711 - 'uri' => '/res/7320ca6d/rsrc/css/core/buttons.css', 2711 + 'uri' => '/res/4e6b94c8/rsrc/css/core/buttons.css', 2712 2712 'type' => 'css', 2713 2713 'requires' => 2714 2714 array( ··· 2717 2717 ), 2718 2718 'phabricator-core-css' => 2719 2719 array( 2720 - 'uri' => '/res/1e7afaa9/rsrc/css/core/core.css', 2720 + 'uri' => '/res/9df0488c/rsrc/css/core/core.css', 2721 2721 'type' => 'css', 2722 2722 'requires' => 2723 2723 array( ··· 3562 3562 ), array( 3563 3563 'packages' => 3564 3564 array( 3565 - 'b481b309' => 3565 + '4a549b8b' => 3566 3566 array( 3567 3567 'name' => 'core.pkg.css', 3568 3568 'symbols' => ··· 3605 3605 35 => 'phabricator-object-item-list-view-css', 3606 3606 36 => 'global-drag-and-drop-css', 3607 3607 ), 3608 - 'uri' => '/res/pkg/b481b309/core.pkg.css', 3608 + 'uri' => '/res/pkg/4a549b8b/core.pkg.css', 3609 3609 'type' => 'css', 3610 3610 ), 3611 3611 '95ceba95' => ··· 3765 3765 'uri' => '/res/pkg/cd1d650a/javelin.pkg.js', 3766 3766 'type' => 'js', 3767 3767 ), 3768 - 'eb35a026' => 3768 + 'c41b4907' => 3769 3769 array( 3770 3770 'name' => 'maniphest.pkg.css', 3771 3771 'symbols' => ··· 3775 3775 2 => 'aphront-attached-file-view-css', 3776 3776 3 => 'phabricator-project-tag-css', 3777 3777 ), 3778 - 'uri' => '/res/pkg/eb35a026/maniphest.pkg.css', 3778 + 'uri' => '/res/pkg/c41b4907/maniphest.pkg.css', 3779 3779 'type' => 'css', 3780 3780 ), 3781 3781 '7707de41' => ··· 3795 3795 ), 3796 3796 'reverse' => 3797 3797 array( 3798 - 'aphront-attached-file-view-css' => 'eb35a026', 3799 - 'aphront-crumbs-view-css' => 'b481b309', 3800 - 'aphront-dialog-view-css' => 'b481b309', 3801 - 'aphront-error-view-css' => 'b481b309', 3802 - 'aphront-form-view-css' => 'b481b309', 3803 - 'aphront-list-filter-view-css' => 'b481b309', 3804 - 'aphront-pager-view-css' => 'b481b309', 3805 - 'aphront-panel-view-css' => 'b481b309', 3806 - 'aphront-table-view-css' => 'b481b309', 3807 - 'aphront-tokenizer-control-css' => 'b481b309', 3808 - 'aphront-tooltip-css' => 'b481b309', 3809 - 'aphront-typeahead-control-css' => 'b481b309', 3798 + 'aphront-attached-file-view-css' => 'c41b4907', 3799 + 'aphront-crumbs-view-css' => '4a549b8b', 3800 + 'aphront-dialog-view-css' => '4a549b8b', 3801 + 'aphront-error-view-css' => '4a549b8b', 3802 + 'aphront-form-view-css' => '4a549b8b', 3803 + 'aphront-list-filter-view-css' => '4a549b8b', 3804 + 'aphront-pager-view-css' => '4a549b8b', 3805 + 'aphront-panel-view-css' => '4a549b8b', 3806 + 'aphront-table-view-css' => '4a549b8b', 3807 + 'aphront-tokenizer-control-css' => '4a549b8b', 3808 + 'aphront-tooltip-css' => '4a549b8b', 3809 + 'aphront-typeahead-control-css' => '4a549b8b', 3810 3810 'differential-changeset-view-css' => '8aaacd1b', 3811 3811 'differential-core-view-css' => '8aaacd1b', 3812 3812 'differential-inline-comment-editor' => '322728f3', ··· 3820 3820 'differential-table-of-contents-css' => '8aaacd1b', 3821 3821 'diffusion-commit-view-css' => 'c8ce2d88', 3822 3822 'diffusion-icons-css' => 'c8ce2d88', 3823 - 'global-drag-and-drop-css' => 'b481b309', 3823 + 'global-drag-and-drop-css' => '4a549b8b', 3824 3824 'inline-comment-summary-css' => '8aaacd1b', 3825 3825 'javelin-aphlict' => '95ceba95', 3826 3826 'javelin-behavior' => 'cd1d650a', ··· 3892 3892 'javelin-util' => 'cd1d650a', 3893 3893 'javelin-vector' => 'cd1d650a', 3894 3894 'javelin-workflow' => 'cd1d650a', 3895 - 'lightbox-attachment-css' => 'b481b309', 3896 - 'maniphest-task-summary-css' => 'eb35a026', 3897 - 'maniphest-transaction-detail-css' => 'eb35a026', 3895 + 'lightbox-attachment-css' => '4a549b8b', 3896 + 'maniphest-task-summary-css' => 'c41b4907', 3897 + 'maniphest-transaction-detail-css' => 'c41b4907', 3898 3898 'phabricator-busy' => '95ceba95', 3899 3899 'phabricator-content-source-view-css' => '8aaacd1b', 3900 - 'phabricator-core-buttons-css' => 'b481b309', 3901 - 'phabricator-core-css' => 'b481b309', 3902 - 'phabricator-crumbs-view-css' => 'b481b309', 3903 - 'phabricator-directory-css' => 'b481b309', 3900 + 'phabricator-core-buttons-css' => '4a549b8b', 3901 + 'phabricator-core-css' => '4a549b8b', 3902 + 'phabricator-crumbs-view-css' => '4a549b8b', 3903 + 'phabricator-directory-css' => '4a549b8b', 3904 3904 'phabricator-drag-and-drop-file-upload' => '322728f3', 3905 3905 'phabricator-dropdown-menu' => '95ceba95', 3906 3906 'phabricator-file-upload' => '95ceba95', 3907 - 'phabricator-filetree-view-css' => 'b481b309', 3908 - 'phabricator-flag-css' => 'b481b309', 3909 - 'phabricator-form-view-css' => 'b481b309', 3910 - 'phabricator-header-view-css' => 'b481b309', 3911 - 'phabricator-jump-nav' => 'b481b309', 3907 + 'phabricator-filetree-view-css' => '4a549b8b', 3908 + 'phabricator-flag-css' => '4a549b8b', 3909 + 'phabricator-form-view-css' => '4a549b8b', 3910 + 'phabricator-header-view-css' => '4a549b8b', 3911 + 'phabricator-jump-nav' => '4a549b8b', 3912 3912 'phabricator-keyboard-shortcut' => '95ceba95', 3913 3913 'phabricator-keyboard-shortcut-manager' => '95ceba95', 3914 - 'phabricator-main-menu-view' => 'b481b309', 3914 + 'phabricator-main-menu-view' => '4a549b8b', 3915 3915 'phabricator-menu-item' => '95ceba95', 3916 - 'phabricator-nav-view-css' => 'b481b309', 3916 + 'phabricator-nav-view-css' => '4a549b8b', 3917 3917 'phabricator-notification' => '95ceba95', 3918 - 'phabricator-notification-css' => 'b481b309', 3919 - 'phabricator-notification-menu-css' => 'b481b309', 3920 - 'phabricator-object-item-list-view-css' => 'b481b309', 3918 + 'phabricator-notification-css' => '4a549b8b', 3919 + 'phabricator-notification-menu-css' => '4a549b8b', 3920 + 'phabricator-object-item-list-view-css' => '4a549b8b', 3921 3921 'phabricator-object-selector-css' => '8aaacd1b', 3922 3922 'phabricator-paste-file-upload' => '95ceba95', 3923 3923 'phabricator-prefab' => '95ceba95', 3924 - 'phabricator-project-tag-css' => 'eb35a026', 3925 - 'phabricator-remarkup-css' => 'b481b309', 3924 + 'phabricator-project-tag-css' => 'c41b4907', 3925 + 'phabricator-remarkup-css' => '4a549b8b', 3926 3926 'phabricator-shaped-request' => '322728f3', 3927 - 'phabricator-side-menu-view-css' => 'b481b309', 3928 - 'phabricator-standard-page-view' => 'b481b309', 3927 + 'phabricator-side-menu-view-css' => '4a549b8b', 3928 + 'phabricator-standard-page-view' => '4a549b8b', 3929 3929 'phabricator-textareautils' => '95ceba95', 3930 3930 'phabricator-tooltip' => '95ceba95', 3931 - 'phabricator-transaction-view-css' => 'b481b309', 3932 - 'phabricator-zindex-css' => 'b481b309', 3933 - 'sprite-apps-large-css' => 'b481b309', 3934 - 'sprite-gradient-css' => 'b481b309', 3935 - 'sprite-icon-css' => 'b481b309', 3936 - 'sprite-menu-css' => 'b481b309', 3937 - 'syntax-highlighting-css' => 'b481b309', 3931 + 'phabricator-transaction-view-css' => '4a549b8b', 3932 + 'phabricator-zindex-css' => '4a549b8b', 3933 + 'sprite-apps-large-css' => '4a549b8b', 3934 + 'sprite-gradient-css' => '4a549b8b', 3935 + 'sprite-icon-css' => '4a549b8b', 3936 + 'sprite-menu-css' => '4a549b8b', 3937 + 'syntax-highlighting-css' => '4a549b8b', 3938 3938 ), 3939 3939 ));
+2
src/applications/differential/controller/DifferentialRevisionListController.php
··· 162 162 163 163 $filter_form = id(new AphrontFormView()) 164 164 ->setMethod('GET') 165 + ->setNoShading(true) 165 166 ->setAction('/differential/filter/'.$this->filter.'/') 166 167 ->setUser($user); 167 168 foreach ($controls as $control) { ··· 199 200 $side_nav, 200 201 array( 201 202 'title' => pht('Differential Home'), 203 + 'dust' => true, 202 204 )); 203 205 } 204 206
+7 -6
src/applications/maniphest/controller/ManiphestBatchEditController.php
··· 60 60 'sources' => array( 61 61 'project' => array( 62 62 'src' => '/typeahead/common/projects/', 63 - 'placeholder' => 'Type a project name...', 63 + 'placeholder' => pht('Type a project name...'), 64 64 ), 65 65 'owner' => array( 66 66 'src' => '/typeahead/common/searchowner/', 67 - 'placeholder' => 'Type a user name...', 67 + 'placeholder' => pht('Type a user name...'), 68 68 'limit' => 1, 69 69 ), 70 70 ), ··· 96 96 'name' => 'actions', 97 97 'id' => 'batch-form-actions', 98 98 ))); 99 - $form->appendChild(phutil_tag('p', array(), 'These tasks will be edited:')); 99 + $form->appendChild( 100 + phutil_tag('p', array(), pht('These tasks will be edited:'))); 100 101 $form->appendChild($list); 101 102 $form->appendChild( 102 103 id(new AphrontFormInsetView()) ··· 109 110 'sigil' => 'add-action', 110 111 'mustcapture' => true, 111 112 ), 112 - 'Add Another Action')) 113 + pht('Add Another Action'))) 113 114 ->setContent(javelin_tag( 114 115 'table', 115 116 array( ··· 119 120 ''))) 120 121 ->appendChild( 121 122 id(new AphrontFormSubmitControl()) 122 - ->setValue('Update Tasks') 123 + ->setValue(pht('Update Tasks')) 123 124 ->addCancelButton('/maniphest/', 'Done')); 124 125 125 126 $panel->appendChild($form); ··· 128 129 return $this->buildStandardPageResponse( 129 130 $panel, 130 131 array( 131 - 'title' => 'Batch Editor', 132 + 'title' => pht('Batch Editor'), 132 133 )); 133 134 } 134 135
+25 -17
src/applications/maniphest/controller/ManiphestController.php
··· 10 10 public function buildStandardPageResponse($view, array $data) { 11 11 $page = $this->buildStandardPageView(); 12 12 13 - $page->setApplicationName('Maniphest'); 13 + $page->setApplicationName(pht('Maniphest')); 14 14 $page->setBaseURI('/maniphest/'); 15 15 $page->setTitle(idx($data, 'title')); 16 16 $page->setGlyph("\xE2\x9A\x93"); ··· 22 22 return $response->setContent($page->render()); 23 23 } 24 24 25 - protected function buildBaseSideNav() { 25 + protected function buildBaseSideNav($filter = null, $for_app = false) { 26 26 $nav = new AphrontSideNavFilterView(); 27 27 $nav->setBaseURI(new PhutilURI('/maniphest/view/')); 28 28 ··· 50 50 $query->getName(), 51 51 '/maniphest/view/custom/?key='.$query->getQueryKey()); 52 52 } 53 - $nav->addFilter('saved', 'Edit...', '/maniphest/custom/'); 53 + $nav->addFilter('saved', pht('Edit...'), '/maniphest/custom/'); 54 + } 55 + 56 + if ($for_app) { 57 + $nav->addFilter('', pht('Create Task'), 58 + $this->getApplicationURI('task/create/')); 54 59 } 55 60 56 - $nav->addLabel('User Tasks'); 57 - $nav->addFilter('action', 'Assigned'); 58 - $nav->addFilter('created', 'Created'); 59 - $nav->addFilter('subscribed', 'Subscribed'); 60 - $nav->addFilter('triage', 'Need Triage'); 61 - $nav->addLabel('User Projects'); 62 - $nav->addFilter('projecttriage', 'Need Triage'); 63 - $nav->addFilter('projectall', 'All Tasks'); 61 + $nav->addLabel(pht('User Tasks')); 62 + $nav->addFilter('action', pht('Assigned')); 63 + $nav->addFilter('created', pht('Created')); 64 + $nav->addFilter('subscribed', pht('Subscribed')); 65 + $nav->addFilter('triage', pht('Need Triage')); 66 + $nav->addLabel(pht('User Projects')); 67 + $nav->addFilter('projecttriage', pht('Need Triage')); 68 + $nav->addFilter('projectall', pht('All Tasks')); 64 69 $nav->addLabel('All Tasks'); 65 - $nav->addFilter('alltriage', 'Need Triage'); 66 - $nav->addFilter('all', 'All Tasks'); 67 - $nav->addLabel('Custom'); 68 - $nav->addFilter('custom', 'Custom Query'); 69 - $nav->addLabel('Reports'); 70 - $nav->addFilter('report', 'Reports', '/maniphest/report/'); 70 + $nav->addFilter('alltriage', pht('Need Triage')); 71 + $nav->addFilter('all', pht('All Tasks')); 72 + $nav->addLabel(pht('Custom')); 73 + $nav->addFilter('custom', pht('Custom Query')); 74 + $nav->addFilter('report', pht('Reports'), '/maniphest/report/'); 71 75 72 76 return $nav; 77 + } 78 + 79 + public function buildApplicationMenu() { 80 + return $this->buildBaseSideNav(null, true)->getMenu(); 73 81 } 74 82 75 83 protected function getDefaultQuery() {
+27 -19
src/applications/maniphest/controller/ManiphestExportController.php
··· 27 27 $dialog = new AphrontDialogView(); 28 28 $dialog->setUser($user); 29 29 30 - $dialog->setTitle('Excel Export Not Configured'); 30 + $inst1 = pht( 31 + 'This system does not have PHPExcel installed. This software '. 32 + 'component is required to export tasks to Excel. Have your system '. 33 + 'administrator install it from:'); 34 + 35 + $inst2 = pht( 36 + 'Your PHP "include_path" needs to be updated to include the '. 37 + 'PHPExcel Classes directory.'); 38 + 39 + $dialog->setTitle(pht('Excel Export Not Configured')); 31 40 $dialog->appendChild(hsprintf( 32 - '<p>This system does not have PHPExcel installed. This software '. 33 - 'component is required to export tasks to Excel. Have your system '. 34 - 'administrator install it from:</p>'. 41 + '<p>%s</p>'. 35 42 '<br />'. 36 43 '<p>'. 37 44 '<a href="http://www.phpexcel.net/">http://www.phpexcel.net/</a>'. 38 45 '</p>'. 39 46 '<br />'. 40 - '<p>Your PHP "include_path" needs to be updated to include the '. 41 - 'PHPExcel Classes/ directory.</p>')); 47 + '<p>%s</p>', 48 + $inst1, 49 + $inst2)); 42 50 43 51 $dialog->addCancelButton('/maniphest/'); 44 52 return id(new AphrontDialogResponse())->setDialog($dialog); ··· 58 66 $dialog = new AphrontDialogView(); 59 67 $dialog->setUser($user); 60 68 61 - $dialog->setTitle('Export Tasks to Excel'); 69 + $dialog->setTitle(pht('Export Tasks to Excel')); 62 70 $dialog->appendChild(phutil_tag('p', array(), pht( 63 71 'Do you want to export the query results to Excel?'))); 64 72 65 73 $dialog->addCancelButton('/maniphest/'); 66 - $dialog->addSubmitButton('Export to Excel'); 74 + $dialog->addSubmitButton(pht('Export to Excel')); 67 75 return id(new AphrontDialogResponse())->setDialog($dialog); 68 76 69 77 } ··· 85 93 86 94 $workbook = new PHPExcel(); 87 95 $sheet = $workbook->setActiveSheetIndex(0); 88 - $sheet->setTitle('Tasks'); 96 + $sheet->setTitle(pht('Tasks')); 89 97 90 98 $widths = array( 91 99 null, ··· 113 121 114 122 $rows = array(); 115 123 $rows[] = array( 116 - 'ID', 117 - 'Owner', 118 - 'Status', 119 - 'Priority', 120 - 'Date Created', 121 - 'Date Updated', 122 - 'Title', 123 - 'Projects', 124 - 'URI', 125 - 'Description', 124 + pht('ID'), 125 + pht('Owner'), 126 + pht('Status'), 127 + pht('Priority'), 128 + pht('Date Created'), 129 + pht('Date Updated'), 130 + pht('Title'), 131 + pht('Projects'), 132 + pht('URI'), 133 + pht('Description'), 126 134 ); 127 135 128 136 $is_date = array(
+36 -34
src/applications/maniphest/controller/ManiphestReportController.php
··· 34 34 35 35 $nav = new AphrontSideNavFilterView(); 36 36 $nav->setBaseURI(new PhutilURI('/maniphest/report/')); 37 - $nav->addLabel('Open Tasks'); 38 - $nav->addFilter('user', 'By User'); 39 - $nav->addFilter('project', 'By Project'); 40 - $nav->addLabel('Burnup'); 41 - $nav->addFilter('burn', 'Burnup Rate'); 37 + $nav->addLabel(pht('Open Tasks')); 38 + $nav->addFilter('user', pht('By User')); 39 + $nav->addFilter('project', pht('By Project')); 40 + $nav->addLabel(pht('Burnup')); 41 + $nav->addFilter('burn', pht('Burnup Rate')); 42 42 43 43 $this->view = $nav->selectFilter($this->view, 'user'); 44 44 ··· 210 210 211 211 if ($week) { 212 212 $rows[] = $this->formatBurnRow( 213 - 'Week To Date', 213 + pht('Week To Date'), 214 214 $week); 215 215 $rowc[] = 'week'; 216 216 } 217 217 218 218 if ($month) { 219 219 $rows[] = $this->formatBurnRow( 220 - 'Month To Date', 220 + pht('Month To Date'), 221 221 $month); 222 222 $rowc[] = 'month'; 223 223 } 224 224 225 225 $rows[] = $this->formatBurnRow( 226 - 'All Time', 226 + pht('All Time'), 227 227 $period); 228 228 $rowc[] = 'aggregate'; 229 229 ··· 234 234 $table->setRowClasses($rowc); 235 235 $table->setHeaders( 236 236 array( 237 - 'Period', 238 - 'Opened', 239 - 'Closed', 240 - 'Change', 237 + pht('Period'), 238 + pht('Opened'), 239 + pht('Closed'), 240 + pht('Change'), 241 241 )); 242 242 $table->setColumnClasses( 243 243 array( ··· 248 248 )); 249 249 250 250 if ($handle) { 251 - $header = pht("Task Burn Rate for Project %s", $handle->renderLink()); 252 - $caption = hsprintf( 253 - "<p>NOTE: This table reflects tasks <em>currently</em> in ". 251 + $inst = pht( 252 + "NOTE: This table reflects tasks <em>currently</em> in ". 254 253 "the project. If a task was opened in the past but added to ". 255 254 "the project recently, it is counted on the day it was ". 256 255 "opened, not the day it was categorized. If a task was part ". 257 256 "of this project in the past but no longer is, it is not ". 258 - "counted at all.</p>"); 257 + "counted at all."); 258 + $header = pht("Task Burn Rate for Project %s", $handle->renderLink()); 259 + $caption = hsprintf("<p>%s</p>", $inst); 259 260 } else { 260 - $header = "Task Burn Rate for All Tasks"; 261 + $header = pht("Task Burn Rate for All Tasks"); 261 262 $caption = null; 262 263 } 263 264 ··· 315 316 ->appendChild( 316 317 id(new AphrontFormTokenizerControl()) 317 318 ->setDatasource('/typeahead/common/searchproject/') 318 - ->setLabel('Project') 319 + ->setLabel(pht('Project')) 319 320 ->setLimit(1) 320 321 ->setName('set_project') 321 322 ->setValue($tokens)); ··· 325 326 $form 326 327 ->appendChild( 327 328 id(new AphrontFormTextControl()) 328 - ->setLabel('"Recently" Means') 329 + ->setLabel(pht('Recently Means')) 329 330 ->setName('set_window') 330 331 ->setCaption( 331 - 'Configure the cutoff for the "Recently Closed" column.') 332 + pht('Configure the cutoff for the "Recently Closed" column.')) 332 333 ->setValue($window_str) 333 334 ->setError($window_error)); 334 335 } ··· 336 337 $form 337 338 ->appendChild( 338 339 id(new AphrontFormSubmitControl()) 339 - ->setValue('Filter By Project')); 340 + ->setValue(pht('Filter By Project'))); 340 341 341 342 $filter = new AphrontListFilterView(); 342 343 $filter->appendChild($form); ··· 419 420 array( 420 421 'href' => $base_link.ManiphestTaskOwner::OWNER_UP_FOR_GRABS, 421 422 ), 422 - phutil_tag('em', array(), '(Up For Grabs)')); 423 - $col_header = 'User'; 424 - $header = 'Open Tasks by User and Priority ('.$date.')'; 423 + phutil_tag('em', array(), pht('(Up For Grabs)'))); 424 + $col_header = pht('User'); 425 + $header = pht('Open Tasks by User and Priority (%s)', $date); 425 426 break; 426 427 case 'project': 427 428 $result = array(); ··· 456 457 array( 457 458 'href' => $base_link.ManiphestTaskOwner::PROJECT_NO_PROJECT, 458 459 ), 459 - phutil_tag('em', array(), '(No Project)')); 460 - $col_header = 'Project'; 461 - $header = 'Open Tasks by Project and Priority ('.$date.')'; 460 + phutil_tag('em', array(), pht('(No Project)'))); 461 + $col_header = pht('Project'); 462 + $header = pht('Open Tasks by Project and Priority (%s)', $date); 462 463 break; 463 464 } 464 465 ··· 584 585 array( 585 586 'sigil' => 'has-tooltip', 586 587 'meta' => array( 587 - 'tip' => 'Oldest open task.', 588 + 'tip' => pht('Oldest open task.'), 588 589 'size' => 200, 589 590 ), 590 591 ), 591 - 'Oldest (All)'); 592 + pht('Oldest (All)')); 592 593 $cclass[] = 'n'; 593 594 $cname[] = javelin_tag( 594 595 'span', 595 596 array( 596 597 'sigil' => 'has-tooltip', 597 598 'meta' => array( 598 - 'tip' => 'Oldest open task, excluding those with Low or Wishlist '. 599 - 'priority.', 599 + 'tip' => pht('Oldest open task, excluding those with Low or '. 600 + 'Wishlist priority.'), 600 601 'size' => 200, 601 602 ), 602 603 ), 603 - 'Oldest (Pri)'); 604 + pht('Oldest (Pri)')); 604 605 $cclass[] = 'n'; 605 606 606 607 list($ignored, $window_epoch) = $this->getWindow(); 608 + $edate = phabricator_datetime($window_epoch, $user); 607 609 $cname[] = javelin_tag( 608 610 'span', 609 611 array( 610 612 'sigil' => 'has-tooltip', 611 613 'meta' => array( 612 - 'tip' => 'Closed after '.phabricator_datetime($window_epoch, $user), 614 + 'tip' => pht('Closed after %s', $edate), 613 615 'size' => 260 614 616 ), 615 617 ), 616 - 'Recently Closed'); 618 + pht('Recently Closed')); 617 619 $cclass[] = 'n'; 618 620 619 621 $table = new AphrontTableView($rows);
+6 -4
src/applications/maniphest/controller/ManiphestSavedQueryDeleteController.php
··· 30 30 } 31 31 32 32 $name = $query->getName(); 33 + $inst = pht( 34 + 'Really delete the query "%s"? It will be lost forever!', $name); 33 35 34 36 $dialog = id(new AphrontDialogView()) 35 37 ->setUser($user) 36 - ->setTitle('Really delete this query?') 38 + ->setTitle(pht('Really delete this query?')) 37 39 ->appendChild(hsprintf( 38 - '<p>Really delete the query "%s"? It will be lost forever!</p>', 39 - $name)) 40 + '<p>%s</p>', 41 + $inst)) 40 42 ->addCancelButton('/maniphest/custom/') 41 - ->addSubmitButton('Delete'); 43 + ->addSubmitButton(pht('Delete')); 42 44 43 45 return id(new AphrontDialogResponse())->setDialog($dialog); 44 46 }
+10 -9
src/applications/maniphest/controller/ManiphestSavedQueryEditController.php
··· 42 42 $e_name = null; 43 43 $query->setName($request->getStr('name')); 44 44 if (!strlen($query->getName())) { 45 - $e_name = 'Required'; 46 - $errors[] = 'Saved query name is required.'; 45 + $e_name = pht('Required'); 46 + $errors[] = pht('Saved query name is required.'); 47 47 } 48 48 49 49 if (!$errors) { ··· 54 54 55 55 if ($errors) { 56 56 $error_view = new AphrontErrorView(); 57 - $error_view->setTitle('Form Errors'); 57 + $error_view->setTitle(pht('Form Errors')); 58 58 $error_view->setErrors($errors); 59 59 } else { 60 60 $error_view = null; 61 61 } 62 62 63 63 if ($query->getID()) { 64 - $header = 'Edit Saved Query'; 64 + $header = pht('Edit Saved Query'); 65 65 $cancel_uri = '/maniphest/custom/'; 66 66 } else { 67 - $header = 'New Saved Query'; 67 + $header = pht('New Saved Query'); 68 68 $cancel_uri = '/maniphest/view/custom/?key='.$key; 69 69 } 70 70 ··· 74 74 ->addHiddenInput('id', $query->getID()) 75 75 ->appendChild( 76 76 id(new AphrontFormTextControl()) 77 - ->setLabel('Name') 77 + ->setLabel(pht('Name')) 78 78 ->setValue($query->getName()) 79 79 ->setName('name') 80 80 ->setError($e_name)) 81 81 ->appendChild( 82 82 id(new AphrontFormSubmitControl()) 83 83 ->addCancelButton($cancel_uri) 84 - ->setValue('Save')); 84 + ->setValue(pht('Save'))); 85 85 86 86 $panel = new AphrontPanelView(); 87 87 $panel->setHeader($header); ··· 94 94 $nav->appendChild($error_view); 95 95 $nav->appendChild($panel); 96 96 97 - return $this->buildStandardPageResponse( 97 + return $this->buildApplicationPage( 98 98 $nav, 99 99 array( 100 - 'title' => 'Saved Queries', 100 + 'title' => pht('Saved Queries'), 101 + 'device' => true, 101 102 )); 102 103 } 103 104
+10 -9
src/applications/maniphest/controller/ManiphestSavedQueryListController.php
··· 81 81 'value' => 0, 82 82 'checked' => ($default === null ? 'checked' : null), 83 83 )), 84 - phutil_tag('em', array(), 'No Default'), 84 + phutil_tag('em', array(), pht('No Default')), 85 85 '', 86 86 '', 87 87 ); ··· 89 89 $table = new AphrontTableView($rows); 90 90 $table->setHeaders( 91 91 array( 92 - 'Default', 93 - 'Name', 94 - 'Edit', 95 - 'Delete', 92 + pht('Default'), 93 + pht('Name'), 94 + pht('Edit'), 95 + pht('Delete'), 96 96 )); 97 97 $table->setColumnClasses( 98 98 array( ··· 103 103 )); 104 104 105 105 $panel = new AphrontPanelView(); 106 - $panel->setHeader('Saved Custom Queries'); 106 + $panel->setHeader(pht('Saved Custom Queries')); 107 107 $panel->addButton( 108 108 phutil_tag( 109 109 'button', 110 110 array(), 111 - 'Save Default Query')); 111 + pht('Save Default Query'))); 112 112 $panel->appendChild($table); 113 113 114 114 $form = phabricator_form( ··· 122 122 $nav->selectFilter('saved', 'saved'); 123 123 $nav->appendChild($form); 124 124 125 - return $this->buildStandardPageResponse( 125 + return $this->buildApplicationPage( 126 126 $nav, 127 127 array( 128 - 'title' => 'Saved Queries', 128 + 'title' => pht('Saved Queries'), 129 + 'device' => true, 129 130 )); 130 131 } 131 132
+17 -17
src/applications/maniphest/controller/ManiphestTaskDetailController.php
··· 107 107 'href' => '/maniphest/task/create/?parent='.$parent_task->getID(), 108 108 'class' => 'green button', 109 109 ), 110 - 'Create Another Subtask')); 110 + pht('Create Another Subtask'))); 111 111 $context_bar->appendChild(hsprintf( 112 112 'Created a subtask of <strong>%s</strong>', 113 113 $this->getHandle($parent_task->getPHID())->renderLink())); ··· 120 120 'href' => '/maniphest/task/create/?template='.$task->getID(), 121 121 'class' => 'green button', 122 122 ), 123 - 'Similar Task')); 123 + pht('Similar Task'))); 124 124 $context_bar->addButton(phutil_tag( 125 125 'a', 126 126 array( 127 127 'href' => '/maniphest/task/create/', 128 128 'class' => 'green button', 129 129 ), 130 - 'Empty Task')); 131 - $context_bar->appendChild('New task created.'); 130 + pht('Empty Task'))); 131 + $context_bar->appendChild(pht('New task created.')); 132 132 } 133 133 134 134 $engine = new PhabricatorMarkupEngine(); ··· 201 201 ->addHiddenInput('taskID', $task->getID()) 202 202 ->appendChild( 203 203 id(new AphrontFormSelectControl()) 204 - ->setLabel('Action') 204 + ->setLabel(pht('Action')) 205 205 ->setName('action') 206 206 ->setOptions($transaction_types) 207 207 ->setID('transaction-action')) 208 208 ->appendChild( 209 209 id(new AphrontFormSelectControl()) 210 - ->setLabel('Resolution') 210 + ->setLabel(pht('Resolution')) 211 211 ->setName('resolution') 212 212 ->setControlID('resolution') 213 213 ->setControlStyle('display: none') 214 214 ->setOptions($resolution_types)) 215 215 ->appendChild( 216 216 id(new AphrontFormTokenizerControl()) 217 - ->setLabel('Assign To') 217 + ->setLabel(pht('Assign To')) 218 218 ->setName('assign_to') 219 219 ->setControlID('assign_to') 220 220 ->setControlStyle('display: none') ··· 222 222 ->setDisableBehavior(true)) 223 223 ->appendChild( 224 224 id(new AphrontFormTokenizerControl()) 225 - ->setLabel('CCs') 225 + ->setLabel(pht('CCs')) 226 226 ->setName('ccs') 227 227 ->setControlID('ccs') 228 228 ->setControlStyle('display: none') ··· 230 230 ->setDisableBehavior(true)) 231 231 ->appendChild( 232 232 id(new AphrontFormSelectControl()) 233 - ->setLabel('Priority') 233 + ->setLabel(pht('Priority')) 234 234 ->setName('priority') 235 235 ->setOptions($priority_map) 236 236 ->setControlID('priority') ··· 238 238 ->setValue($task->getPriority())) 239 239 ->appendChild( 240 240 id(new AphrontFormTokenizerControl()) 241 - ->setLabel('Projects') 241 + ->setLabel(pht('Projects')) 242 242 ->setName('projects') 243 243 ->setControlID('projects') 244 244 ->setControlStyle('display: none') ··· 246 246 ->setDisableBehavior(true)) 247 247 ->appendChild( 248 248 id(new AphrontFormFileControl()) 249 - ->setLabel('File') 249 + ->setLabel(pht('File')) 250 250 ->setName('file') 251 251 ->setControlID('file') 252 252 ->setControlStyle('display: none')) 253 253 ->appendChild( 254 254 id(new PhabricatorRemarkupControl()) 255 - ->setLabel('Comments') 255 + ->setLabel(pht('Comments')) 256 256 ->setName('comments') 257 257 ->setValue($draft_text) 258 258 ->setID('transaction-comments') 259 259 ->setUser($user)) 260 260 ->appendChild( 261 261 id(new AphrontFormDragAndDropUploadControl()) 262 - ->setLabel('Attached Files') 262 + ->setLabel(pht('Attached Files')) 263 263 ->setName('files') 264 264 ->setActivatedClass('aphront-panel-view-drag-and-drop')) 265 265 ->appendChild( 266 266 id(new AphrontFormSubmitControl()) 267 - ->setValue($is_serious ? 'Submit' : 'Avast!')); 267 + ->setValue($is_serious ? pht('Submit') : pht('Avast!'))); 268 268 269 269 $control_map = array( 270 270 ManiphestTransactionType::TYPE_STATUS => 'resolution', ··· 280 280 'id' => 'projects-tokenizer', 281 281 'src' => '/typeahead/common/projects/', 282 282 'ondemand' => PhabricatorEnv::getEnvConfig('tokenizer.ondemand'), 283 - 'placeholder' => 'Type a project name...', 283 + 'placeholder' => pht('Type a project name...'), 284 284 ), 285 285 ManiphestTransactionType::TYPE_OWNER => array( 286 286 'id' => 'assign-tokenizer', ··· 288 288 'value' => $default_claim, 289 289 'limit' => 1, 290 290 'ondemand' => PhabricatorEnv::getEnvConfig('tokenizer.ondemand'), 291 - 'placeholder' => 'Type a user name...', 291 + 'placeholder' => pht('Type a user name...'), 292 292 ), 293 293 ManiphestTransactionType::TYPE_CCS => array( 294 294 'id' => 'cc-tokenizer', 295 295 'src' => '/typeahead/common/mailable/', 296 296 'ondemand' => PhabricatorEnv::getEnvConfig('tokenizer.ondemand'), 297 - 'placeholder' => 'Type a user or mailing list...', 297 + 'placeholder' => pht('Type a user or mailing list...'), 298 298 ), 299 299 ); 300 300
+11 -7
src/applications/maniphest/controller/ManiphestTaskEditController.php
··· 112 112 $aux_field->setValueFromRequest($request); 113 113 114 114 if ($aux_field->isRequired() && !$aux_field->getValue()) { 115 - $errors[] = $aux_field->getLabel() . ' is required.'; 116 - $aux_field->setError('Required'); 115 + $errors[] = pht('%s is required.', $aux_field->getLabel()); 116 + $aux_field->setError(pht('Required')); 117 117 } 118 118 119 119 try { 120 120 $aux_field->validate(); 121 121 } catch (Exception $e) { 122 122 $errors[] = $e->getMessage(); 123 - $aux_field->setError('Invalid'); 123 + $aux_field->setError(pht('Invalid')); 124 124 } 125 125 } 126 126 ··· 501 501 $panel->setHeader($header_name); 502 502 $panel->appendChild($form); 503 503 $panel->setNoBackground(); 504 + $inst1 = pht('Description Preview'); 505 + $inst2 = pht('Loading preview...'); 504 506 505 507 $description_preview_panel = hsprintf( 506 508 '<div class="aphront-panel-preview aphront-panel-preview-full"> 507 509 <div class="maniphest-description-preview-header"> 508 - Description Preview 510 + %s 509 511 </div> 510 512 <div id="description-preview"> 511 513 <div class="aphront-panel-preview-loading-text"> 512 - Loading preview... 514 + %s 513 515 </div> 514 516 </div> 515 - </div>'); 517 + </div>', 518 + $inst1, 519 + $inst2); 516 520 517 521 Javelin::initBehavior( 518 522 'maniphest-description-preview', ··· 537 541 array( 538 542 'title' => $header_name, 539 543 'pageObjects' => $page_objects, 540 - 'device' => true 544 + 'device' => true, 541 545 )); 542 546 } 543 547 }
+70 -60
src/applications/maniphest/controller/ManiphestTaskListController.php
··· 120 120 121 121 $form = id(new AphrontFormView()) 122 122 ->setUser($user) 123 + ->setNoShading(true) 123 124 ->setAction( 124 125 $request->getRequestURI() 125 126 ->alter('key', null) ··· 142 143 id(new AphrontFormTokenizerControl()) 143 144 ->setDatasource('/typeahead/common/searchowner/') 144 145 ->setName('set_users') 145 - ->setLabel('Users') 146 + ->setLabel(pht('Users')) 146 147 ->setValue($tokens)); 147 148 } 148 149 ··· 150 151 $form->appendChild( 151 152 id(new AphrontFormTextControl()) 152 153 ->setName('set_search') 153 - ->setLabel('Search') 154 + ->setLabel(pht('Search')) 154 155 ->setValue($search_text)); 155 156 $form->appendChild( 156 157 id(new AphrontFormTextControl()) 157 158 ->setName('set_tasks') 158 - ->setLabel('Task IDs') 159 + ->setLabel(pht('Task IDs')) 159 160 ->setValue(join(',', $task_ids))); 160 161 161 162 $tokens = array(); ··· 166 167 id(new AphrontFormTokenizerControl()) 167 168 ->setDatasource('/typeahead/common/searchowner/') 168 169 ->setName('set_owners') 169 - ->setLabel('Owners') 170 + ->setLabel(pht('Owners')) 170 171 ->setValue($tokens)); 171 172 172 173 $tokens = array(); ··· 177 178 id(new AphrontFormTokenizerControl()) 178 179 ->setDatasource('/typeahead/common/users/') 179 180 ->setName('set_authors') 180 - ->setLabel('Authors') 181 + ->setLabel(pht('Authors')) 181 182 ->setValue($tokens)); 182 183 } 183 184 ··· 189 190 190 191 $caption = null; 191 192 if ($this->view == 'custom') { 192 - $caption = 'Find tasks in ALL of these projects ("AND" query).'; 193 + $caption = pht('Find tasks in ALL of these projects ("AND" query).'); 193 194 } 194 195 195 196 $form->appendChild( 196 197 id(new AphrontFormTokenizerControl()) 197 198 ->setDatasource('/typeahead/common/searchproject/') 198 199 ->setName('set_projects') 199 - ->setLabel('Projects') 200 + ->setLabel(pht('Projects')) 200 201 ->setCaption($caption) 201 202 ->setValue($tokens)); 202 203 } ··· 210 211 id(new AphrontFormTokenizerControl()) 211 212 ->setDatasource('/typeahead/common/projects/') 212 213 ->setName('set_aprojects') 213 - ->setLabel('Any Projects') 214 - ->setCaption('Find tasks in ANY of these projects ("OR" query).') 214 + ->setLabel(pht('Any Projects')) 215 + ->setCaption(pht('Find tasks in ANY of these projects ("OR" query).')) 215 216 ->setValue($atokens)); 216 217 217 218 $tokens = array(); ··· 222 223 id(new AphrontFormTokenizerControl()) 223 224 ->setDatasource('/typeahead/common/projects/') 224 225 ->setName('set_xprojects') 225 - ->setLabel('Exclude Projects') 226 - ->setCaption('Find tasks NOT in any of these projects.') 226 + ->setLabel(pht('Exclude Projects')) 227 + ->setCaption(pht('Find tasks NOT in any of these projects.')) 227 228 ->setValue($tokens)); 228 229 229 230 $priority = ManiphestTaskPriority::getLowestPriority(); ··· 233 234 234 235 $form->appendChild( 235 236 id(new AphrontFormSelectControl()) 236 - ->setLabel('Min Priority') 237 + ->setLabel(pht('Min Priority')) 237 238 ->setName('set_lpriority') 238 239 ->setValue($priority) 239 240 ->setOptions(array_reverse( ··· 246 247 247 248 $form->appendChild( 248 249 id(new AphrontFormSelectControl()) 249 - ->setLabel('Max Priority') 250 + ->setLabel(pht('Max Priority')) 250 251 ->setName('set_hpriority') 251 252 ->setValue($priority) 252 253 ->setOptions(ManiphestTaskPriority::getTaskPriorityMap())); ··· 259 260 ->appendChild($this->renderOrderControl($q_order)); 260 261 261 262 $submit = id(new AphrontFormSubmitControl()) 262 - ->setValue('Filter Tasks'); 263 + ->setValue(pht('Filter Tasks')); 263 264 264 265 // Only show "Save..." for novel queries which have some kind of query 265 266 // parameters set. ··· 268 269 && $request->getRequestURI()->getQueryParams()) { 269 270 $submit->addCancelButton( 270 271 '/maniphest/custom/edit/?key='.$query->getQueryKey(), 271 - 'Save Custom Query...'); 272 + pht('Save Custom Query...')); 272 273 } 273 274 274 275 $form->appendChild($submit); ··· 284 285 if (empty($key)) { 285 286 $filter->appendChild($form); 286 287 } 287 - 288 - $nav->appendChild($filter); 289 288 290 289 $have_tasks = false; 291 290 foreach ($tasks as $group => $list) { ··· 302 301 '<div class="maniphest-list-container">')); 303 302 304 303 if (!$have_tasks) { 304 + $no_tasks = pht('No matching tasks.'); 305 305 $list_container->appendChild(hsprintf( 306 306 '<h1 class="maniphest-task-group-header">'. 307 - 'No matching tasks.'. 308 - '</h1>')); 307 + '%s'. 308 + '</h1>', 309 + $no_tasks)); 309 310 } else { 310 311 $pager = new AphrontPagerView(); 311 312 $pager->setURI($request->getRequestURI(), 'offset'); ··· 317 318 $max = min($pager->getOffset() + $page_size, $total_count); 318 319 $tot = $total_count; 319 320 320 - $list_container->appendChild(hsprintf( 321 - '<div class="maniphest-total-result-count">'. 322 - "Displaying tasks %s - %s of %s.". 323 - '</div>', 321 + $results = pht('Displaying tasks %s - %s of %s.', 324 322 number_format($cur), 325 323 number_format($max), 326 - number_format($tot))); 324 + number_format($tot)); 325 + $result_count = phutil_tag( 326 + 'div', 327 + array( 328 + 'class' => 'maniphest-total-result-count' 329 + ), 330 + $results); 327 331 328 332 $selector = new AphrontNullView(); 329 333 ··· 333 337 ($order == 'priority') && 334 338 ($group == 'none' || $group == 'priority'); 335 339 336 - $lists = new AphrontNullView(); 337 - $lists->appendChild(hsprintf('<div class="maniphest-group-container">')); 340 + $lists = array(); 338 341 foreach ($tasks as $group => $list) { 339 342 $task_list = new ManiphestTaskListView(); 340 343 $task_list->setShowBatchControls(true); ··· 359 362 ), 360 363 $group.' ('.$count.')'); 361 364 362 - 363 - $panel = new AphrontPanelView(); 364 - $panel->appendChild($header); 365 - $panel->appendChild($task_list); 366 - $panel->setNoBackground(); 367 - 368 - $lists->appendChild($panel); 365 + $lists[] = 366 + phutil_tag( 367 + 'div', 368 + array( 369 + 'class' => 'maniphest-task-group' 370 + ), 371 + array( 372 + $header, 373 + $task_list, 374 + )); 369 375 } 370 - $lists->appendChild(hsprintf('</div>')); 371 - $selector->appendChild($lists); 372 376 373 - 377 + $selector->appendChild($lists); 374 378 $selector->appendChild($this->renderBatchEditor($query)); 375 379 376 380 $form_id = celerity_generate_unique_node_id(); ··· 394 398 )); 395 399 } 396 400 397 - $list_container->appendChild(hsprintf('</div>')); 401 + $nav->appendChild($filter); 402 + $nav->appendChild($result_count); 398 403 $nav->appendChild($list_container); 399 404 400 405 $title = pht('Task List'); ··· 411 416 412 417 $nav->setCrumbs($crumbs); 413 418 414 - return $this->buildStandardPageResponse( 419 + return $this->buildApplicationPage( 415 420 $nav, 416 421 array( 417 422 'title' => $title, 423 + 'device' => true, 424 + 'dust' => true, 418 425 )); 419 426 } 420 427 ··· 653 660 'class' => 'grey button', 654 661 'id' => 'batch-select-all', 655 662 ), 656 - 'Select All'); 663 + pht('Select All')); 657 664 658 665 $select_none = javelin_tag( 659 666 'a', ··· 663 670 'class' => 'grey button', 664 671 'id' => 'batch-select-none', 665 672 ), 666 - 'Clear Selection'); 673 + pht('Clear Selection')); 667 674 668 675 $submit = phutil_tag( 669 676 'button', ··· 672 679 'disabled' => 'disabled', 673 680 'class' => 'disabled', 674 681 ), 675 - "Batch Edit Selected Tasks \xC2\xBB"); 682 + pht("Batch Edit Selected \xC2\xBB")); 676 683 677 684 $export = javelin_tag( 678 685 'a', ··· 680 687 'href' => '/maniphest/export/'.$search_query->getQueryKey().'/', 681 688 'class' => 'grey button', 682 689 ), 683 - 'Export Tasks to Excel...'); 690 + pht('Export to Excel')); 684 691 685 692 return hsprintf( 686 693 '<div class="maniphest-batch-editor">'. 687 - '<div class="batch-editor-header">Batch Task Editor</div>'. 694 + '<div class="batch-editor-header">%s</div>'. 688 695 '<table class="maniphest-batch-editor-layout">'. 689 696 '<tr>'. 690 697 '<td>%s%s</td>'. 691 698 '<td>%s</td>'. 692 - '<td id="batch-select-status-cell">0 Selected Tasks</td>'. 699 + '<td id="batch-select-status-cell">%s</td>'. 693 700 '<td class="batch-select-submit-cell">%s</td>'. 694 701 '</tr>'. 695 702 '</table>'. 696 703 '</table>', 697 - $select_all, $select_none, 704 + pht('Batch Task Editor'), 705 + $select_all, 706 + $select_none, 698 707 $export, 708 + pht('0 Selected'), 699 709 $submit); 700 710 } 701 711 ··· 871 881 872 882 private function getStatusButtonMap() { 873 883 return array( 874 - 'o' => 'Open', 875 - 'c' => 'Closed', 876 - 'oc' => 'All', 884 + 'o' => pht('Open'), 885 + 'c' => pht('Closed'), 886 + 'oc' => pht('All'), 877 887 ); 878 888 } 879 889 880 890 private function getGroupButtonMap() { 881 891 return array( 882 - 'p' => 'Priority', 883 - 'o' => 'Owner', 884 - 's' => 'Status', 885 - 'j' => 'Project', 886 - 'n' => 'None', 892 + 'p' => pht('Priority'), 893 + 'o' => pht('Owner'), 894 + 's' => pht('Status'), 895 + 'j' => pht('Project'), 896 + 'n' => pht('None'), 887 897 ); 888 898 } 889 899 890 900 private function getOrderButtonMap() { 891 901 return array( 892 - 'p' => 'Priority', 893 - 'u' => 'Updated', 894 - 'c' => 'Created', 895 - 't' => 'Title', 902 + 'p' => pht('Priority'), 903 + 'u' => pht('Updated'), 904 + 'c' => pht('Created'), 905 + 't' => pht('Title'), 896 906 ); 897 907 } 898 908 899 909 public function renderStatusControl($value) { 900 910 $request = $this->getRequest(); 901 911 return id(new AphrontFormToggleButtonsControl()) 902 - ->setLabel('Status') 912 + ->setLabel(pht('Status')) 903 913 ->setValue($this->getStatusRequestValue($value)) 904 914 ->setBaseURI($request->getRequestURI(), $this->getStatusRequestKey()) 905 915 ->setButtons($this->getStatusButtonMap()); ··· 908 918 public function renderOrderControl($value) { 909 919 $request = $this->getRequest(); 910 920 return id(new AphrontFormToggleButtonsControl()) 911 - ->setLabel('Order') 921 + ->setLabel(pht('Order')) 912 922 ->setValue($this->getOrderRequestValue($value)) 913 923 ->setBaseURI($request->getRequestURI(), $this->getOrderRequestKey()) 914 924 ->setButtons($this->getOrderButtonMap()); ··· 917 927 public function renderGroupControl($value) { 918 928 $request = $this->getRequest(); 919 929 return id(new AphrontFormToggleButtonsControl()) 920 - ->setLabel('Group') 930 + ->setLabel(pht('Group')) 921 931 ->setValue($this->getGroupRequestValue($value)) 922 932 ->setBaseURI($request->getRequestURI(), $this->getGroupRequestKey()) 923 933 ->setButtons($this->getGroupButtonMap());
+53 -31
src/applications/maniphest/view/ManiphestTaskSummaryView.php
··· 63 63 $batch = phutil_tag( 64 64 'td', 65 65 array( 66 + 'rowspan' => 2, 66 67 'class' => 'maniphest-task-batch', 67 68 ), 68 69 javelin_tag( ··· 91 92 $handle = javelin_tag( 92 93 'td', 93 94 array( 95 + 'rowspan' => 2, 94 96 'class' => 'maniphest-task-handle '.$pri_class.' '.$control_class, 95 97 'sigil' => $control_sigil, 96 98 ), 97 99 ''); 98 100 99 - $task_id = phutil_tag( 100 - 'td', 101 + $task_name = phutil_tag( 102 + 'span', 101 103 array( 102 - 'class' => 'maniphest-task-number', 104 + 'class' => 'maniphest-task-name', 103 105 ), 104 - 'T'.$task->getID()); 106 + phutil_tag( 107 + 'a', 108 + array( 109 + 'href' => '/T'.$task->getID(), 110 + ), 111 + $task->getTitle())); 105 112 106 - $task_status = phutil_tag( 113 + $task_updated = phutil_tag( 114 + 'span', 115 + array( 116 + 'class' => 'maniphest-task-updated', 117 + ), 118 + phabricator_date($task->getDateModified(), $this->user)); 119 + 120 + $task_info = phutil_tag( 107 121 'td', 108 122 array( 109 - 'class' => 'maniphest-task-status', 123 + 'colspan' => 2, 124 + 'class' => 'maniphest-task-number', 110 125 ), 111 - idx($status_map, $task->getStatus(), 'Unknown')); 126 + array( 127 + 'T'.$task->getID(), 128 + $task_name, 129 + $task_updated, 130 + )); 131 + 132 + $owner = ''; 133 + if ($handles[$task->getOwnerPHID()]) { 134 + $owner = pht('Assigned to %s', 135 + $handles[$task->getOwnerPHID()]->renderLink()); 136 + } 112 137 113 138 $task_owner = phutil_tag( 114 - 'td', 139 + 'span', 115 140 array( 116 141 'class' => 'maniphest-task-owner', 117 142 ), 118 143 $task->getOwnerPHID() 119 - ? $handles[$task->getOwnerPHID()]->renderLink() 144 + ? $owner 120 145 : phutil_tag('em', array(), pht('None'))); 121 146 122 - $task_name = phutil_tag( 147 + $task_status = phutil_tag( 123 148 'td', 124 149 array( 125 - 'class' => 'maniphest-task-name', 150 + 'class' => 'maniphest-task-status', 126 151 ), 127 - phutil_tag( 128 - 'a', 129 - array( 130 - 'href' => '/T'.$task->getID(), 131 - ), 132 - $task->getTitle())); 152 + array( 153 + idx($status_map, $task->getStatus(), pht('Unknown')), 154 + $task_owner, 155 + )); 133 156 134 157 $task_projects = phutil_tag( 135 158 'td', ··· 138 161 ), 139 162 $projects_view->render()); 140 163 141 - $task_updated = phutil_tag( 142 - 'td', 143 - array( 144 - 'class' => 'maniphest-task-updated', 145 - ), 146 - phabricator_date($task->getDateModified(), $this->user)); 164 + $row1 = phutil_tag( 165 + 'tr', 166 + array(), 167 + array( 168 + $handle, 169 + $batch, 170 + $task_info, 171 + )); 147 172 148 - $row = phutil_tag( 173 + $row2 = phutil_tag( 149 174 'tr', 150 175 array(), 151 176 array( 152 - $handle, 153 - $batch, 154 - $task_id, 155 177 $task_status, 156 - $task_owner, 157 - $task_name, 158 178 $task_projects, 159 - $task_updated, 160 179 )); 161 180 162 181 return javelin_tag( ··· 168 187 'taskID' => $task->getID(), 169 188 ), 170 189 ), 171 - $row); 190 + array( 191 + $row1, 192 + $row2, 193 + )); 172 194 } 173 195 174 196 }
+7 -1
src/view/form/AphrontFormView.php
··· 10 10 private $workflow; 11 11 private $id; 12 12 private $flexible; 13 + private $noShading; 13 14 private $sigils = array(); 14 15 15 16 public function setFlexible($flexible) { 16 17 $this->flexible = $flexible; 18 + return $this; 19 + } 20 + 21 + public function setNoShading($shading) { 22 + $this->noShading = $shading; 17 23 return $this; 18 24 } 19 25 ··· 60 66 61 67 $layout = new AphrontFormLayoutView(); 62 68 63 - if (!$this->flexible) { 69 + if ((!$this->flexible) && (!$this->noShading)) { 64 70 $layout 65 71 ->setBackgroundShading(true) 66 72 ->setPadded(true);
+7 -5
src/view/layout/AphrontListFilterView.php
··· 5 5 public function render() { 6 6 require_celerity_resource('aphront-list-filter-view-css'); 7 7 return hsprintf( 8 - '<table class="aphront-list-filter-view">'. 9 - '<tr>'. 10 - '<td class="aphront-list-filter-view-controls">%s</td>'. 11 - '</tr>'. 12 - '</table>', 8 + '<div class="aphront-filter-table-wrapper">'. 9 + '<table class="aphront-list-filter-view">'. 10 + '<tr>'. 11 + '<td class="aphront-list-filter-view-controls">%s</td>'. 12 + '</tr>'. 13 + '</table>'. 14 + '</div>', 13 15 $this->renderChildren()); 14 16 } 15 17
+4 -42
webroot/rsrc/css/aphront/form-view.css
··· 14 14 padding: 1em; 15 15 } 16 16 17 - 18 17 .aphront-form-view label.aphront-form-label { 19 18 padding-top: 4px; 20 19 width: 19%; ··· 22 21 text-align: right; 23 22 font-weight: bold; 24 23 font-size: 13px; 25 - color: #666666; 24 + color: #666; 26 25 } 27 26 28 27 .device-phone .aphront-form-view label.aphront-form-label { ··· 30 29 float: none; 31 30 text-align: left; 32 31 width: 100%; 32 + color: #777; 33 + margin-bottom: 3px; 33 34 } 34 35 35 36 .aphront-form-input { ··· 159 160 } 160 161 161 162 .aphront-form-control-togglebuttons .aphront-form-input { 162 - padding-top: 5px; 163 + padding: 2px 0 0 0; 163 164 } 164 165 165 166 table.aphront-form-control-radio-layout, ··· 368 369 padding: 12px; 369 370 float: right; 370 371 } 371 - 372 - .aphront-form-control-counted-togglebuttons { 373 - padding-top: 7px; 374 - } 375 - 376 - .aphront-form-control-counted-togglebuttons .toggle { 377 - position: relative; 378 - } 379 - 380 - .aphront-form-control-counted-togglebuttons .toggle-fixed { 381 - cursor: pointer; 382 - } 383 - 384 - .aphront-form-control-counted-togglebuttons .toggle .counter { 385 - font-size: smaller; 386 - display: none; 387 - position: absolute; 388 - top: -9px; 389 - right: -8px; 390 - padding: 0px 3px; 391 - border-radius: 3px; 392 - } 393 - 394 - .aphront-form-control-counted-togglebuttons:hover .toggle .counter { 395 - display: block; 396 - } 397 - 398 - .aphront-form-control-counted-togglebuttons .toggle .counter { 399 - background: gray; 400 - color: #ddd; 401 - } 402 - 403 - .aphront-form-control-counted-togglebuttons .toggle-selected .counter { 404 - color: white; 405 - } 406 - 407 - .aphront-form-control-counted-togglebuttons .toggle.disabled:hover { 408 - background-color: #a7a7a7; 409 - }
+16 -3
webroot/rsrc/css/aphront/list-filter-view.css
··· 2 2 * @provides aphront-list-filter-view-css 3 3 */ 4 4 5 + .aphront-filter-table-wrapper { 6 + border-left: 1px solid #e7e7e7; 7 + border-right: 1px solid #e7e7e7; 8 + border-bottom: 1px solid #c0c5d1; 9 + margin: 0 20px; 10 + } 11 + 12 + .device-phone .aphront-filter-table-wrapper { 13 + margin: 0; 14 + padding: 0; 15 + background: #fff; 16 + } 17 + 5 18 .aphront-list-filter-view { 6 - background: #f4f5f8; 7 - border-bottom: 1px solid #d4dae0; 19 + background: #fff; 8 20 width: 100%; 9 - margin-bottom: 1em; 21 + box-shadow: inset 0px 2px 1px rgba(150,150,150,0.25); 10 22 } 11 23 12 24 .aphront-list-filter-view-controls { ··· 15 27 16 28 .aphront-list-filter-view-controls .aphront-form-view { 17 29 border-width: 0; 30 + border-bottom: 1px solid #c0c5d1; 18 31 padding: 12px 0 6px; 19 32 } 20 33
+55 -50
webroot/rsrc/css/application/maniphest/task-summary.css
··· 4 4 5 5 .maniphest-task-summary { 6 6 width: 100%; 7 - margin: 4px 0; 7 + margin: 0 0 -1px 0; 8 8 border-collapse: separate; 9 - 10 - font-size: 12px; 11 9 color: #333; 10 + border: 1px solid #c0c5d1; 11 + } 12 + 13 + .maniphest-task-group { 14 + padding-bottom: 30px; 12 15 } 13 16 14 17 .maniphest-task-summary td { 15 - padding: 6px 4px; 18 + padding: 0 10px; 16 19 background: #fff; 17 - white-space: nowrap; 18 - 19 - border-style: solid; 20 - border-top-color: #d5dadf; 21 - border-bottom-color: #d5dadf; 22 - border-width: 1px 0; 23 20 } 24 21 25 22 .maniphest-task-summary td em { ··· 30 27 background: #fff; 31 28 } 32 29 33 - .maniphest-task-summary td.maniphest-task-handle { 34 - padding: 0 4px; 35 - width: 1px; 36 - 37 - border-right-width: 1px; 38 - border-right-color: #d5dadf; 30 + .maniphest-task-summary .maniphest-task-handle { 31 + padding: 0 4px 0 0; 32 + width: 5px; 39 33 } 40 34 41 35 .maniphest-task-summary td.maniphest-task-batch { 42 - padding-right: 0px; 43 - width: 16px; 36 + padding: 15px 4px 0 10px; 37 + width: 8px; 44 38 text-align: center; 45 39 overflow: hidden; 46 40 } 47 41 42 + .device-phone .maniphest-task-batch, 43 + .device-phone .maniphest-task-updated { 44 + display: none; 45 + } 46 + 48 47 .maniphest-task-summary td.maniphest-task-batch, 49 48 .maniphest-task-summary td.maniphest-task-batch input { 50 49 cursor: pointer; ··· 55 54 } 56 55 57 56 .maniphest-task-summary td.maniphest-task-number { 57 + padding: 6px 0 2px 10px; 58 58 font-weight: bold; 59 59 color: #333; 60 - width: 50px; 61 - text-align: right; 62 60 } 63 61 64 62 .maniphest-task-summary td.maniphest-task-status { 65 - width: 60px; 66 - text-align: center; 63 + padding: 2px 10px 6px 10px; 64 + text-align: left; 65 + color: #777; 66 + font-size: 12px; 67 67 } 68 68 69 - .maniphest-task-summary td.maniphest-task-owner { 70 - width: 100px; 69 + .maniphest-task-summary .maniphest-task-owner { 70 + padding-left: 20px; 71 71 } 72 72 73 - .maniphest-task-summary td.maniphest-task-name { 73 + .maniphest-task-summary .maniphest-task-name { 74 74 font-weight: bold; 75 - white-space: normal; 76 75 overflow: hidden; 76 + margin-left: 5px; 77 77 } 78 78 79 79 .maniphest-task-summary td.maniphest-task-projects { 80 - width: 180px; 81 80 text-align: right; 82 - white-space: normal; 83 - } 84 - 85 - .maniphest-task-summary td.maniphest-task-updated { 86 - text-align: right; 87 - width: 85px; 88 - padding-right: 8px; 89 - border-right-width: 1px; 90 - border-right-style: solid; 91 - border-right-color: #d5dadf; 81 + padding: 0px 8px; 92 82 } 93 83 94 - .maniphest-task-summary .pri-bullet { 84 + .maniphest-task-summary .maniphest-task-updated { 85 + float: right; 86 + padding: 0 8px; 87 + color: #777; 88 + font-size: 11px; 89 + font-weight: normal; 95 90 } 96 91 97 92 .maniphest-task-summary .pri-unbreak { ··· 128 123 font-size: 16px; 129 124 font-weight: bold; 130 125 color: #555; 131 - padding: 5px 0; 132 - margin-left: 20px; 133 - } 134 - 135 - .aphront-panel-view .maniphest-task-group-header { 136 - margin-left: 0; 126 + padding: 0 0 8px 0; 137 127 } 138 128 139 129 .maniphest-total-result-count { 140 130 text-align: right; 141 - padding-right: 2em; 131 + padding: 5px 20px 0 0; 142 132 font-size: 11px; 143 - color: #666666; 133 + color: #777; 134 + } 135 + 136 + .device-phone .maniphest-total-result-count { 137 + padding-right: 5px; 144 138 } 145 139 146 140 .batch-editor-header { ··· 150 144 font-weight: bold; 151 145 } 152 146 153 - .maniphest-batch-editor { 154 - margin: 20px; 147 + /* TODO: Implement */ 148 + .device-phone .maniphest-batch-editor { 149 + display: none; 155 150 } 156 151 157 152 .maniphest-batch-editor-layout { 158 153 width: 100%; 159 - border-top: 1px solid #d5dadf; 160 - background: #f4f5f8; 154 + border-left: 1px solid #e7e7e7; 155 + border-right: 1px solid #e7e7e7; 156 + border-bottom: 1px solid #c0c5d1; 157 + background: #fff; 161 158 } 162 159 163 160 .maniphest-batch-editor-layout td { ··· 203 200 position: relative; 204 201 opacity: 0.5; 205 202 } 203 + 204 + .maniphest-list-container { 205 + padding: 20px; 206 + } 207 + 208 + .device-phone .maniphest-list-container { 209 + padding: 20px 5px; 210 + }
+9 -16
webroot/rsrc/css/core/buttons.css
··· 153 153 a.toggle { 154 154 display: inline-block; 155 155 padding: 4px 8px; 156 + font-size: 12px; 156 157 font-weight: bold; 157 - line-height: 14px; 158 - color: #ffffff; 159 - text-shadow: 0 1px 0 #777; 158 + color: #555; 160 159 text-decoration: none; 161 160 white-space: nowrap; 162 161 vertical-align: baseline; 163 - background-color: #a7a7a7; 164 - font-family: 'Helvetica Neue', Helvetica, Arial; 165 - font-size: 12px; 166 - margin: 0 5px 2px; 167 - 168 - -webkit-border-radius: 3px; 169 - -moz-border-radius: 3px; 162 + background-color: #f7f7f7; 163 + margin: 0 6px 0 0; 170 164 border-radius: 3px; 165 + box-shadow: inset 0 0 3px rgba(0,0,0,.4); 171 166 } 172 167 173 168 a.toggle:hover { 174 - background-color: #bbb; 169 + background-color: #14568e; 170 + color: #fff 175 171 } 176 172 177 173 a.toggle-selected { 178 - background-color: #555; 174 + background-color: #14568e; 175 + color: #fff 179 176 } 180 177 181 178 a.toggle-fixed { 182 179 cursor: default; 183 180 } 184 - 185 - a.toggle-fixed:hover { 186 - background-color: #555; 187 - }
webroot/rsrc/image/texture/dust_background.jpg

This is a binary file and will not be displayed.