diff --git a/src/applications/maniphest/view/ManiphestTaskResultListView.php b/src/applications/maniphest/view/ManiphestTaskResultListView.php index fc3756645b..5804951e25 100644 --- a/src/applications/maniphest/view/ManiphestTaskResultListView.php +++ b/src/applications/maniphest/view/ManiphestTaskResultListView.php @@ -1,269 +1,268 @@ savedQuery = $query; return $this; } public function setTasks(array $tasks) { $this->tasks = $tasks; return $this; } public function setCanEditPriority($can_edit_priority) { $this->canEditPriority = $can_edit_priority; return $this; } public function setCanBatchEdit($can_batch_edit) { $this->canBatchEdit = $can_batch_edit; return $this; } public function setShowBatchControls($show_batch_controls) { $this->showBatchControls = $show_batch_controls; return $this; } public function render() { $viewer = $this->getUser(); $tasks = $this->tasks; $query = $this->savedQuery; // If we didn't match anything, just pick up the default empty state. if (!$tasks) { return id(new PHUIObjectItemListView()) ->setUser($viewer); } $group_parameter = nonempty($query->getParameter('group'), 'priority'); $order_parameter = nonempty($query->getParameter('order'), 'priority'); $handles = ManiphestTaskListView::loadTaskHandles($viewer, $tasks); $groups = $this->groupTasks( $tasks, $group_parameter, $handles); $can_edit_priority = $this->canEditPriority; $can_drag = ($order_parameter == 'priority') && ($can_edit_priority) && ($group_parameter == 'none' || $group_parameter == 'priority'); if (!$viewer->isLoggedIn()) { // TODO: (T7131) Eventually, we conceivably need to make each task // draggable individually, since the user may be able to edit some but // not others. $can_drag = false; } $result = array(); $lists = array(); foreach ($groups as $group => $list) { $task_list = new ManiphestTaskListView(); $task_list->setShowBatchControls($this->showBatchControls); if ($can_drag) { $task_list->setShowSubpriorityControls(true); } $task_list->setUser($viewer); $task_list->setTasks($list); $task_list->setHandles($handles); $header = id(new PHUIHeaderView()) - ->addClass('maniphest-task-group-header') ->addSigil('task-group') ->setMetadata(array('priority' => head($list)->getPriority())) ->setHeader(pht('%s (%s)', $group, new PhutilNumber(count($list)))); $lists[] = id(new PHUIObjectBoxView()) ->setHeader($header) ->appendChild($task_list); } if ($can_drag) { Javelin::initBehavior( 'maniphest-subpriority-editor', array( 'uri' => '/maniphest/subpriority/', )); } return array( $lists, $this->showBatchControls ? $this->renderBatchEditor($query) : null, ); } private function groupTasks(array $tasks, $group, array $handles) { assert_instances_of($tasks, 'ManiphestTask'); assert_instances_of($handles, 'PhabricatorObjectHandle'); $groups = $this->getTaskGrouping($tasks, $group); $results = array(); foreach ($groups as $label_key => $tasks) { $label = $this->getTaskLabelName($group, $label_key, $handles); $results[$label][] = $tasks; } foreach ($results as $label => $task_groups) { $results[$label] = array_mergev($task_groups); } return $results; } private function getTaskGrouping(array $tasks, $group) { switch ($group) { case 'priority': return mgroup($tasks, 'getPriority'); case 'status': return mgroup($tasks, 'getStatus'); case 'assigned': return mgroup($tasks, 'getOwnerPHID'); case 'project': return mgroup($tasks, 'getGroupByProjectPHID'); default: return array(pht('Tasks') => $tasks); } } private function getTaskLabelName($group, $label_key, array $handles) { switch ($group) { case 'priority': return ManiphestTaskPriority::getTaskPriorityName($label_key); case 'status': return ManiphestTaskStatus::getTaskStatusFullName($label_key); case 'assigned': if ($label_key) { return $handles[$label_key]->getFullName(); } else { return pht('(Not Assigned)'); } case 'project': if ($label_key) { return $handles[$label_key]->getFullName(); } else { // This may mean "No Projects", or it may mean the query has project // constraints but the task is only in constrained projects (in this // case, we don't show the group because it would always have all // of the tasks). Since distinguishing between these two cases is // messy and the UI is reasonably clear, label generically. return pht('(Ungrouped)'); } default: return pht('Tasks'); } } private function renderBatchEditor(PhabricatorSavedQuery $saved_query) { $user = $this->getUser(); if (!$this->canBatchEdit) { return null; } if (!$user->isLoggedIn()) { // Don't show the batch editor or excel export for logged-out users. // Technically we //could// let them export, but ehh. return null; } Javelin::initBehavior( 'maniphest-batch-selector', array( 'selectAll' => 'batch-select-all', 'selectNone' => 'batch-select-none', 'submit' => 'batch-select-submit', 'status' => 'batch-select-status-cell', 'idContainer' => 'batch-select-id-container', 'formID' => 'batch-select-form', )); $select_all = javelin_tag( 'a', array( 'href' => '#', 'mustcapture' => true, 'class' => 'grey button', 'id' => 'batch-select-all', ), pht('Select All')); $select_none = javelin_tag( 'a', array( 'href' => '#', 'mustcapture' => true, 'class' => 'grey button', 'id' => 'batch-select-none', ), pht('Clear Selection')); $submit = phutil_tag( 'button', array( 'id' => 'batch-select-submit', 'disabled' => 'disabled', 'class' => 'disabled', ), pht("Batch Edit Selected \xC2\xBB")); $export = javelin_tag( 'a', array( 'href' => '/maniphest/export/'.$saved_query->getQueryKey().'/', 'class' => 'grey button', ), pht('Export to Excel')); $hidden = phutil_tag( 'div', array( 'id' => 'batch-select-id-container', ), ''); $editor = hsprintf( ''. ''. ''. ''. ''. ''. ''. '
%s%s%s%s%s%s
', $select_all, $select_none, $export, '', $submit, $hidden); $editor = phabricator_form( $user, array( 'method' => 'POST', 'action' => '/maniphest/batch/', 'id' => 'batch-select-form', ), $editor); $box = id(new PHUIObjectBoxView()) ->setHeaderText(pht('Batch Task Editor')) ->appendChild($editor); return $box; } } diff --git a/webroot/rsrc/css/aphront/dialog-view.css b/webroot/rsrc/css/aphront/dialog-view.css index 8fc4bafa95..412b7f855a 100644 --- a/webroot/rsrc/css/aphront/dialog-view.css +++ b/webroot/rsrc/css/aphront/dialog-view.css @@ -1,143 +1,132 @@ /** * @provides aphront-dialog-view-css */ .aphront-dialog-view { width: 540px; margin: 32px auto 16px; border: 1px solid {$lightblueborder}; border-radius: 3px; } .device-phone .aphront-dialog-view { margin: 16px; width: auto; } .aphront-dialog-view-standalone { margin: auto; } .aphront-dialog-head { - padding: 4px 12px 0 12px; + padding: 12px 12px 0 12px; background: #fff; border-top-left-radius: 3px; border-top-right-radius: 3px; } -.aphront-dialog-head .phui-action-header { - border-bottom: 1px solid {$thinblueborder}; - padding: 0 0 4px 0; - white-space: nowrap; -} - .aphront-dialog-flush .aphront-dialog-body { padding: 0; } .aphront-dialog-view-width-form { width: 600px; } .aphront-dialog-view-width-full { width: 90%; } .aphront-dialog-body { background: #fff; padding: 16px; border: none; } .aphront-dialog-tail { border: none; background: {$lightgreybackground}; padding: 8px 16px; border-top: 1px solid {$thinblueborder}; } .aphront-dialog-foot { padding: 6px 0; float: left; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; } .aphront-dialog-tail button, .aphront-dialog-tail a.button { float: right; margin-left: 8px; } .jx-client-dialog { position: absolute; width: 100%; } .jx-mask { opacity: .7; background: #292f33; position: fixed; top: 0; left: 0; right: 0; bottom: 0; } .jx-dark-mask { background: #292f33; opacity: 0.95; } .aphront-exception-dialog { width: 95%; } .aphront-exception-dialog .exception-message { font-size: 14px; background: {$sh-yellowbackground}; border: 1px solid {$sh-yellowborder}; padding: 12px; white-space: pre-wrap; } .aphront-exception-dialog .exception-trace { margin-top: 16px; } .aphront-access-dialog { width: 50%; } -.aphront-dialog-view ul { - margin: 12px 24px; - list-style: circle; -} - .aphront-policy-rejection { font-weight: bold; } .aphront-capability-details { margin: 20px 0 4px; } .aphront-dialog-view-paragraph + .aphront-dialog-view-paragraph { margin-top: 16px; } .device-desktop .aphront-dialog-flush .phui-object-item-list-view { margin: 0; padding: 0; } .aphront-dialog-flush .phui-object-item-list-view.phui-object-list-stackable .phui-object-item { border: 0; } .aphront-dialog-flush .phui-object-item-list-view.phui-object-list-stackable .phui-object-item-frame { border: 0; border-top: 1px solid {$thinblueborder}; } diff --git a/webroot/rsrc/css/application/conpherence/durable-column.css b/webroot/rsrc/css/application/conpherence/durable-column.css index 643e16958a..030dc0490e 100644 --- a/webroot/rsrc/css/application/conpherence/durable-column.css +++ b/webroot/rsrc/css/application/conpherence/durable-column.css @@ -1,359 +1,335 @@ /** * @provides conpherence-durable-column-view */ .with-durable-column .phabricator-standard-page-body { margin-right: 300px; } .with-durable-margin .phabricator-standard-page-body { margin-right: 312px; } .with-durable-column .phabricator-main-menu { padding-right: 304px; } .with-durable-margin .phabricator-main-menu { padding-right: 316px; } .with-durable-column .phabricator-global-upload-instructions { font-size: 28px; width: 50%; } .global-upload-mask { pointer-events: none; } .with-durable-column .global-upload-mask { right: 300px; } .with-durable-margin .global-upload-mask { right: 312px; } .conpherence-durable-column { position: fixed; top: 0; bottom: 0; right: 0; width: 300px; background: #fff; } .with-durable-margin .conpherence-durable-column { border-right: 12px solid {$lightgreybackground}; } .conpherence-durable-column .loading-mask { position: absolute; top: 90px; bottom: 0; right: 1px; width: 298px; background: #fff; display: none; opacity: .6; z-index: 2; } .device-desktop .conpherence-durable-column.loading .loading-mask { display: block; } .conpherence-durable-column-header .conpherence-settings-dropdown { z-index: 1; } .conpherence-durable-column-header .phabricator-application-menu { display: block; float: right; padding-right: 4px; width: 36px; } .conpherence-durable-column-header .phabricator-application-menu .phui-list-item-view.core-menu-item { display: block; } .conpherence-durable-column-header .phabricator-application-menu .phui-list-item-name { display: none; } .conpherence-durable-column-header .phabricator-application-menu .phui-list-item-view { float: left; position: relative; width: 36px; height: 36px; margin-top: 4px; } .conpherence-durable-column-header .phabricator-application-menu .phui-list-item-href { background: transparent; border: none; padding: 0; } .conpherence-durable-column-header .phabricator-dark-menu .phui-list-item-type-link { background: transparent; } -.device-desktop -.conpherence-durable-column-header -.phabricator-application-menu -.core-menu-item.phui-list-item-view:hover -.phui-list-item-icon.phui-font-fa { - color: #fff; -} .conpherence-durable-column-header .phabricator-application-menu .phui-list-item-view.core-menu-item { display: block; } -.device-desktop -.conpherence-durable-column-header -.phabricator-application-menu -.core-menu-item.phui-list-item-view:hover { - background-color: rgba(0,0,0,.33); - border-radius: 3px; -} -.conpherence-durable-column-header -.phabricator-application-menu .phui-list-item-icon.phui-font-fa { - font-size: 20px; - height: 20px; - width: 20px; - color: rgba(255,255,255,.8); - margin: 8px; - text-align: center; - vertical-align: middle; -} .conpherence-durable-column-header { border-left: 1px solid {$lightblueborder}; border-right: 1px solid {$lightblueborder}; } .conpherence-durable-column-header-text { float: left; padding: 13px 0 12px 12px; font-size: 15px; color: {$darkbluetext}; font-weight: 500; width: 230px; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; } .conpherence-durable-column-header-text .phui-icon-view { color: {$bluetext}; } .conpherence-durable-column-icon-bar { height: 38px; padding: 4px; background-color: {$lightgreybackground}; } .conpherence-durable-column-icon-bar .conpherence-durable-column-thread-icon { float: left; display: block; height: 34px; width: 34px; border: 2px solid transparent; border-radius: 3px; margin: 0 4px 0 0; } .conpherence-durable-column-icon-bar .conpherence-durable-column-search-button { margin: 4px 0px 0px 0px; } .conpherence-durable-column-icon-bar .phui-button-bar { } .conpherence-durable-column-icon-bar .phui-button-bar a.button.has-icon { height: 21px; } .conpherence-durable-column-icon-bar .phui-button-bar .button .phui-icon-view { top: 8px; } .conpherence-durable-column-icon-bar .conpherence-durable-column-thread-icon.selected { border-color: {$sky}; } .conpherence-durable-column-icon-bar .conpherence-durable-column-thread-icon span { position: relative; display: block; width: 30px; height: 30px; top: 2px; left: 2px; background-size: 30px 30px; } .conpherence-durable-column-body { position: absolute; top: 44px; bottom: 0; right: 0; left: 0; border-left: 1px solid {$lightblueborder}; } .with-durable-margin .conpherence-durable-column-body { border-right: 1px solid {$lightblueborder}; } .conpherence-durable-column-main { position: absolute; top: 46px; bottom: 134px; left: 0; right: 0; overflow-x: hidden; border-top: 1px solid {$thinblueborder}; } .conpherence-durable-column-transactions { padding: 8px 12px 0; } .conpherence-durable-column-transactions .conpherence-transaction-view.conpherence-edited { color: {$lightgreytext}; font-size: 12px; margin: 0; padding: 0; } .conpherence-durable-column-transactions .conpherence-edited .conpherence-transaction-header { display: none; } .conpherence-durable-column-transactions .conpherence-transaction-view { background: none; margin: 0; padding: 4px 0; min-height: 0; } .conpherence-durable-column-transactions .conpherence-transaction-view .conpherence-message { word-wrap: break-word; } .conpherence-durable-column-transactions .conpherence-transaction-detail { border: 0; margin: 0; } .conpherence-durable-column-transactions .conpherence-transaction-detail .conpherence-transaction-header { background: none; padding: 0 0 2px 0; } .conpherence-durable-column-transactions .conpherence-transaction-view.date-marker { margin: 20px 0px 8px; } .conpherence-durable-column-transactions .conpherence-transaction-view.date-marker .date { left: 0; font-size: 12px; top: -14px; padding: 0 6px 0 0; } .conpherence-durable-column-transactions .conpherence-transaction-detail .conpherence-transaction-header .conpherence-transaction-info, .conpherence-transaction-header .epoch-link { color: {$lightbluetext}; float: none; font-size: 12px; } .conpherence-durable-column-transactions .conpherence-transaction-detail .conpherence-transaction-header .phui-link-person { margin: 0 8px 0 0; } .conpherence-durable-column-transactions .conpherence-transaction-detail .conpherence-transaction-content .phui-link-person { color: {$darkbluetext}; } .conpherence-durable-column-transactions .conpherence-transaction-detail .conpherence-transaction-content .phui-pinboard-item-view { width: 273px; } .conpherence-durable-column-transactions .conpherence-transaction-detail .conpherence-transaction-content .phui-pinboard-item-view .phui-pinboard-item-image-link img { width: 265px; height: 199px; } .conpherence-durable-column-transactions .conpherence-transaction-detail .conpherence-transaction-content { background: #fff; padding: 0 0 8px 0; } .conpherence-durable-column-textarea { position: absolute; left: 0; right: 0; bottom: 34px; height: 100px; margin: 0; border-width: 1px 0; border-style: solid; border-top-color: {$thinblueborder}; border-bottom-color: {$thinblueborder}; padding: 8px 12px; width: 100%; resize: none; } .conpherence-durable-column-textarea:focus { outline: 0; border-top-color: {$sky}; border-bottom-color: {$sky}; box-shadow: none; } .conpherence-durable-column-footer { position: absolute; height: 26px; padding: 4px 8px 4px 12px; left: 0; right: 0; bottom: 0; background-color: {$lightgreybackground}; } .conpherence-durable-column-footer button { float: right; } .conpherence-durable-column-status { vertical-align: middle; line-height: 24px; font-size: 12px; color: {$lightbluetext}; } diff --git a/webroot/rsrc/css/application/maniphest/task-summary.css b/webroot/rsrc/css/application/maniphest/task-summary.css index cf57dd23d6..e959234177 100644 --- a/webroot/rsrc/css/application/maniphest/task-summary.css +++ b/webroot/rsrc/css/application/maniphest/task-summary.css @@ -1,71 +1,38 @@ /** * @provides maniphest-task-summary-css */ .device-phone .maniphest-task-batch, .device-phone .maniphest-task-updated { display: none; } -.maniphest-task-group-header { - font-size: 16px; - font-weight: normal; - color: {$darkbluetext}; - padding: 0 0 8px 0; -} - -.maniphest-total-result-count { - text-align: right; - padding: 5px 20px 0 0; - font-size: 11px; - color: {$greytext}; -} - -.device-phone .maniphest-total-result-count { - padding-right: 5px; -} - .maniphest-batch-editor-layout { width: 100%; } .maniphest-batch-editor-layout td { padding: 12px 4px 8px; white-space: nowrap; } .maniphest-batch-editor-layout a.button, .maniphest-batch-editor-layout button { margin: 0px 4px; } .maniphest-batch-editor-layout .batch-select-submit-cell { text-align: right; } #batch-select-status-cell { text-align: right; color: {$greytext}; font-size: 11px; vertical-align: middle; width: 100%; } .maniphest-board-link { color: {$bluetext}; } - -/* - Dashboards ------------------------------------------------------------ */ - -.dashboard-panel .maniphest-list-container { - padding: 0; -} - -.dashboard-panel .maniphest-task-group + .maniphest-task-group { - padding-top: 0; -} - -.dashboard-panel .maniphest-task-group-header { - border-left: 1px solid {$lightblueborder}; - border-right: 1px solid {$lightblueborder}; -}