mirror of
https://we.phorge.it/source/phorge.git
synced 2025-01-31 17:08:22 +01:00
Renders the last 100 conpherence transactions only
Summary: Fixed T2428 a little bit Test Plan: On trial, only the last n transactions loaded as hardcoded in ConpherenceViewController.php. Button was rendered. Reviewers: epriestley Reviewed By: epriestley CC: aran, Korvin Maniphest Tasks: T2428 Differential Revision: https://secure.phabricator.com/D4898
This commit is contained in:
parent
9da0a460b6
commit
638d1b4447
9 changed files with 378 additions and 279 deletions
|
@ -762,7 +762,7 @@ celerity_register_resource_map(array(
|
||||||
),
|
),
|
||||||
'conpherence-message-pane-css' =>
|
'conpherence-message-pane-css' =>
|
||||||
array(
|
array(
|
||||||
'uri' => '/res/88b1927c/rsrc/css/application/conpherence/message-pane.css',
|
'uri' => '/res/3aa15b9e/rsrc/css/application/conpherence/message-pane.css',
|
||||||
'type' => 'css',
|
'type' => 'css',
|
||||||
'requires' =>
|
'requires' =>
|
||||||
array(
|
array(
|
||||||
|
@ -1142,7 +1142,7 @@ celerity_register_resource_map(array(
|
||||||
),
|
),
|
||||||
'javelin-behavior-conpherence-menu' =>
|
'javelin-behavior-conpherence-menu' =>
|
||||||
array(
|
array(
|
||||||
'uri' => '/res/986774a0/rsrc/js/application/conpherence/behavior-menu.js',
|
'uri' => '/res/0ad6ab54/rsrc/js/application/conpherence/behavior-menu.js',
|
||||||
'type' => 'js',
|
'type' => 'js',
|
||||||
'requires' =>
|
'requires' =>
|
||||||
array(
|
array(
|
||||||
|
|
|
@ -223,6 +223,7 @@ phutil_register_library_map(array(
|
||||||
'ConpherenceTransactionView' => 'applications/conpherence/view/ConpherenceTransactionView.php',
|
'ConpherenceTransactionView' => 'applications/conpherence/view/ConpherenceTransactionView.php',
|
||||||
'ConpherenceUpdateController' => 'applications/conpherence/controller/ConpherenceUpdateController.php',
|
'ConpherenceUpdateController' => 'applications/conpherence/controller/ConpherenceUpdateController.php',
|
||||||
'ConpherenceViewController' => 'applications/conpherence/controller/ConpherenceViewController.php',
|
'ConpherenceViewController' => 'applications/conpherence/controller/ConpherenceViewController.php',
|
||||||
|
'ConpherenceWidgetController' => 'applications/conpherence/controller/ConpherenceWidgetController.php',
|
||||||
'DarkConsoleController' => 'aphront/console/DarkConsoleController.php',
|
'DarkConsoleController' => 'aphront/console/DarkConsoleController.php',
|
||||||
'DarkConsoleCore' => 'aphront/console/DarkConsoleCore.php',
|
'DarkConsoleCore' => 'aphront/console/DarkConsoleCore.php',
|
||||||
'DarkConsoleDataController' => 'aphront/console/DarkConsoleDataController.php',
|
'DarkConsoleDataController' => 'aphront/console/DarkConsoleDataController.php',
|
||||||
|
@ -1743,6 +1744,7 @@ phutil_register_library_map(array(
|
||||||
'ConpherenceTransactionView' => 'AphrontView',
|
'ConpherenceTransactionView' => 'AphrontView',
|
||||||
'ConpherenceUpdateController' => 'ConpherenceController',
|
'ConpherenceUpdateController' => 'ConpherenceController',
|
||||||
'ConpherenceViewController' => 'ConpherenceController',
|
'ConpherenceViewController' => 'ConpherenceController',
|
||||||
|
'ConpherenceWidgetController' => 'ConpherenceController',
|
||||||
'DarkConsoleController' => 'PhabricatorController',
|
'DarkConsoleController' => 'PhabricatorController',
|
||||||
'DarkConsoleDataController' => 'PhabricatorController',
|
'DarkConsoleDataController' => 'PhabricatorController',
|
||||||
'DarkConsoleErrorLogPlugin' => 'DarkConsolePlugin',
|
'DarkConsoleErrorLogPlugin' => 'DarkConsolePlugin',
|
||||||
|
@ -2056,6 +2058,8 @@ phutil_register_library_map(array(
|
||||||
array(
|
array(
|
||||||
0 => 'ManiphestDAO',
|
0 => 'ManiphestDAO',
|
||||||
1 => 'PhabricatorMarkupInterface',
|
1 => 'PhabricatorMarkupInterface',
|
||||||
|
2 => 'PhabricatorPolicyInterface',
|
||||||
|
3 => 'PhabricatorTokenReceiverInterface',
|
||||||
),
|
),
|
||||||
'ManiphestTaskAuxiliaryStorage' => 'ManiphestDAO',
|
'ManiphestTaskAuxiliaryStorage' => 'ManiphestDAO',
|
||||||
'ManiphestTaskDescriptionChangeController' => 'ManiphestController',
|
'ManiphestTaskDescriptionChangeController' => 'ManiphestController',
|
||||||
|
|
|
@ -45,6 +45,7 @@ final class PhabricatorApplicationConpherence extends PhabricatorApplication {
|
||||||
'' => 'ConpherenceListController',
|
'' => 'ConpherenceListController',
|
||||||
'new/' => 'ConpherenceNewController',
|
'new/' => 'ConpherenceNewController',
|
||||||
'view/(?P<id>[1-9]\d*)/' => 'ConpherenceViewController',
|
'view/(?P<id>[1-9]\d*)/' => 'ConpherenceViewController',
|
||||||
|
'widget/(?P<id>[1-9]\d*)/' => 'ConpherenceWidgetController',
|
||||||
'update/(?P<id>[1-9]\d*)/' => 'ConpherenceUpdateController',
|
'update/(?P<id>[1-9]\d*)/' => 'ConpherenceUpdateController',
|
||||||
'(?P<id>[1-9]\d*)/' => 'ConpherenceListController',
|
'(?P<id>[1-9]\d*)/' => 'ConpherenceListController',
|
||||||
),
|
),
|
||||||
|
|
|
@ -101,7 +101,6 @@ abstract class ConpherenceController extends PhabricatorController {
|
||||||
$read_conpherences = $this->getReadConpherences();
|
$read_conpherences = $this->getReadConpherences();
|
||||||
|
|
||||||
$user = $this->getRequest()->getUser();
|
$user = $this->getRequest()->getUser();
|
||||||
|
|
||||||
$menu = new PhabricatorMenuView();
|
$menu = new PhabricatorMenuView();
|
||||||
$nav = AphrontSideNavFilterView::newFromMenu($menu);
|
$nav = AphrontSideNavFilterView::newFromMenu($menu);
|
||||||
$nav->addClass('conpherence-menu');
|
$nav->addClass('conpherence-menu');
|
||||||
|
@ -114,12 +113,9 @@ abstract class ConpherenceController extends PhabricatorController {
|
||||||
);
|
);
|
||||||
$nav->addLabel(pht('Unread'));
|
$nav->addLabel(pht('Unread'));
|
||||||
$nav = $this->addConpherencesToNav($unread_conpherences, $nav);
|
$nav = $this->addConpherencesToNav($unread_conpherences, $nav);
|
||||||
|
|
||||||
$nav->addLabel(pht('Read'));
|
$nav->addLabel(pht('Read'));
|
||||||
$nav = $this->addConpherencesToNav($read_conpherences, $nav, true);
|
$nav = $this->addConpherencesToNav($read_conpherences, $nav, true);
|
||||||
|
|
||||||
$nav->selectFilter($filter);
|
$nav->selectFilter($filter);
|
||||||
|
|
||||||
return $nav;
|
return $nav;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -37,14 +37,9 @@ final class ConpherenceViewController extends
|
||||||
if (!$conpherence_id) {
|
if (!$conpherence_id) {
|
||||||
return new Aphront404Response();
|
return new Aphront404Response();
|
||||||
}
|
}
|
||||||
if (!$request->isAjax()) {
|
|
||||||
return id(new AphrontRedirectResponse())
|
|
||||||
->setURI($this->getApplicationURI($conpherence_id.'/'));
|
|
||||||
}
|
|
||||||
$conpherence = id(new ConpherenceThreadQuery())
|
$conpherence = id(new ConpherenceThreadQuery())
|
||||||
->setViewer($user)
|
->setViewer($user)
|
||||||
->withIDs(array($conpherence_id))
|
->withIDs(array($conpherence_id))
|
||||||
->needWidgetData(true)
|
|
||||||
->needHeaderPics(true)
|
->needHeaderPics(true)
|
||||||
->executeOne();
|
->executeOne();
|
||||||
$this->setConpherence($conpherence);
|
$this->setConpherence($conpherence);
|
||||||
|
@ -58,9 +53,7 @@ final class ConpherenceViewController extends
|
||||||
|
|
||||||
$header = $this->renderHeaderPaneContent();
|
$header = $this->renderHeaderPaneContent();
|
||||||
$messages = $this->renderMessagePaneContent();
|
$messages = $this->renderMessagePaneContent();
|
||||||
$widgets = $this->renderWidgetPaneContent();
|
$content = $header + $messages;
|
||||||
$content = $header + $widgets + $messages;
|
|
||||||
|
|
||||||
return id(new AphrontAjaxResponse())->setContent($content);
|
return id(new AphrontAjaxResponse())->setContent($content);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -125,7 +118,8 @@ final class ConpherenceViewController extends
|
||||||
$handles = $conpherence->getHandles();
|
$handles = $conpherence->getHandles();
|
||||||
$rendered_transactions = array();
|
$rendered_transactions = array();
|
||||||
|
|
||||||
$transactions = $conpherence->getTransactions();
|
|
||||||
|
$transactions = $conpherence->getTransactionsFrom(0, 100);
|
||||||
|
|
||||||
$engine = id(new PhabricatorMarkupEngine())
|
$engine = id(new PhabricatorMarkupEngine())
|
||||||
->setViewer($user);
|
->setViewer($user);
|
||||||
|
@ -137,7 +131,6 @@ final class ConpherenceViewController extends
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$engine->process();
|
$engine->process();
|
||||||
|
|
||||||
foreach ($transactions as $transaction) {
|
foreach ($transactions as $transaction) {
|
||||||
if ($transaction->shouldHide()) {
|
if ($transaction->shouldHide()) {
|
||||||
continue;
|
continue;
|
||||||
|
@ -168,270 +161,21 @@ final class ConpherenceViewController extends
|
||||||
->setValue(pht('Pontificate'))
|
->setValue(pht('Pontificate'))
|
||||||
)->render();
|
)->render();
|
||||||
|
|
||||||
|
$scrollbutton = javelin_tag(
|
||||||
|
'a',
|
||||||
|
array(
|
||||||
|
'href' => '#',
|
||||||
|
'mustcapture' => true,
|
||||||
|
'sigil' => 'show-older-messages',
|
||||||
|
'class' => 'conpherence-show-older-messages',
|
||||||
|
),
|
||||||
|
pht('Show Older Messages'));
|
||||||
|
|
||||||
return array(
|
return array(
|
||||||
'messages' => $transactions,
|
'messages' => $scrollbutton.$transactions,
|
||||||
'form' => $form
|
'form' => $form
|
||||||
);
|
);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private function renderWidgetPaneContent() {
|
|
||||||
require_celerity_resource('conpherence-widget-pane-css');
|
|
||||||
require_celerity_resource('sprite-conpher-css');
|
|
||||||
Javelin::initBehavior(
|
|
||||||
'conpherence-widget-pane',
|
|
||||||
array(
|
|
||||||
'widgetRegistery' => array(
|
|
||||||
'widgets-files' => 1,
|
|
||||||
'widgets-tasks' => 1,
|
|
||||||
'widgets-calendar' => 1,
|
|
||||||
)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
$conpherence = $this->getConpherence();
|
|
||||||
|
|
||||||
$widgets = phutil_tag(
|
|
||||||
'div',
|
|
||||||
array(
|
|
||||||
'class' => 'widgets-header'
|
|
||||||
),
|
|
||||||
array(
|
|
||||||
javelin_tag(
|
|
||||||
'a',
|
|
||||||
array(
|
|
||||||
'sigil' => 'conpherence-change-widget',
|
|
||||||
'meta' => array(
|
|
||||||
'widget' => 'widgets-files',
|
|
||||||
'toggleClass' => 'conpher_files_on'
|
|
||||||
),
|
|
||||||
'id' => 'widgets-files-toggle',
|
|
||||||
'class' => 'sprite-conpher conpher_files_off first-icon'
|
|
||||||
),
|
|
||||||
''
|
|
||||||
),
|
|
||||||
javelin_tag(
|
|
||||||
'a',
|
|
||||||
array(
|
|
||||||
'sigil' => 'conpherence-change-widget',
|
|
||||||
'meta' => array(
|
|
||||||
'widget' => 'widgets-tasks',
|
|
||||||
'toggleClass' => 'conpher_list_on'
|
|
||||||
),
|
|
||||||
'id' => 'widgets-tasks-toggle',
|
|
||||||
'class' => 'sprite-conpher conpher_list_off conpher_list_on',
|
|
||||||
),
|
|
||||||
''
|
|
||||||
),
|
|
||||||
javelin_tag(
|
|
||||||
'a',
|
|
||||||
array(
|
|
||||||
'sigil' => 'conpherence-change-widget',
|
|
||||||
'meta' => array(
|
|
||||||
'widget' => 'widgets-calendar',
|
|
||||||
'toggleClass' => 'conpher_calendar_on'
|
|
||||||
),
|
|
||||||
'id' => 'widgets-calendar-toggle',
|
|
||||||
'class' => 'sprite-conpher conpher_calendar_off',
|
|
||||||
),
|
|
||||||
''
|
|
||||||
)
|
|
||||||
)
|
|
||||||
).
|
|
||||||
phutil_tag(
|
|
||||||
'div',
|
|
||||||
array(
|
|
||||||
'class' => 'widgets-body',
|
|
||||||
'id' => 'widgets-files',
|
|
||||||
'style' => 'display: none;'
|
|
||||||
),
|
|
||||||
$this->renderFilesWidgetPaneContent()
|
|
||||||
).
|
|
||||||
phutil_tag(
|
|
||||||
'div',
|
|
||||||
array(
|
|
||||||
'class' => 'widgets-body',
|
|
||||||
'id' => 'widgets-tasks',
|
|
||||||
),
|
|
||||||
$this->renderTaskWidgetPaneContent()
|
|
||||||
).
|
|
||||||
phutil_tag(
|
|
||||||
'div',
|
|
||||||
array(
|
|
||||||
'class' => 'widgets-body',
|
|
||||||
'id' => 'widgets-calendar',
|
|
||||||
'style' => 'display: none;'
|
|
||||||
),
|
|
||||||
$this->renderCalendarWidgetPaneContent()
|
|
||||||
);
|
|
||||||
|
|
||||||
return array('widgets' => $widgets);
|
|
||||||
}
|
|
||||||
|
|
||||||
private function renderFilesWidgetPaneContent() {
|
|
||||||
$conpherence = $this->getConpherence();
|
|
||||||
$widget_data = $conpherence->getWidgetData();
|
|
||||||
$files = $widget_data['files'];
|
|
||||||
|
|
||||||
$table_data = array();
|
|
||||||
foreach ($files as $file) {
|
|
||||||
$thumb = $file->getThumb60x45URI();
|
|
||||||
$table_data[] = array(
|
|
||||||
phutil_tag(
|
|
||||||
'img',
|
|
||||||
array(
|
|
||||||
'src' => $thumb
|
|
||||||
),
|
|
||||||
''),
|
|
||||||
$file->getName(),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
$header = id(new PhabricatorHeaderView())
|
|
||||||
->setHeader(pht('Attached Files'));
|
|
||||||
$table = id(new AphrontTableView($table_data))
|
|
||||||
->setNoDataString(pht('No files attached to conpherence.'))
|
|
||||||
->setHeaders(array('', pht('Name')))
|
|
||||||
->setColumnClasses(array('', 'wide'));
|
|
||||||
return hsprintf('%s%s', $header->render(), $table->render());
|
|
||||||
}
|
|
||||||
|
|
||||||
private function renderTaskWidgetPaneContent() {
|
|
||||||
$conpherence = $this->getConpherence();
|
|
||||||
$widget_data = $conpherence->getWidgetData();
|
|
||||||
$tasks = $widget_data['tasks'];
|
|
||||||
$priority_map = ManiphestTaskPriority::getTaskPriorityMap();
|
|
||||||
$handles = $conpherence->getHandles();
|
|
||||||
$content = array();
|
|
||||||
foreach ($tasks as $owner_phid => $actual_tasks) {
|
|
||||||
$handle = $handles[$owner_phid];
|
|
||||||
$content[] = id(new PhabricatorHeaderView())
|
|
||||||
->setHeader($handle->getName())
|
|
||||||
->render();
|
|
||||||
$actual_tasks = msort($actual_tasks, 'getPriority');
|
|
||||||
$actual_tasks = array_reverse($actual_tasks);
|
|
||||||
$data = array();
|
|
||||||
foreach ($actual_tasks as $task) {
|
|
||||||
$data[] = array(
|
|
||||||
idx($priority_map, $task->getPriority(), pht('???')),
|
|
||||||
phutil_tag(
|
|
||||||
'a',
|
|
||||||
array(
|
|
||||||
'href' => '/T'.$task->getID()
|
|
||||||
),
|
|
||||||
$task->getTitle()
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
$table = id(new AphrontTableView($data))
|
|
||||||
->setNoDataString(pht('No open tasks.'))
|
|
||||||
->setHeaders(array(pht('Pri'), pht('Title')))
|
|
||||||
->setColumnClasses(array('', 'wide'));
|
|
||||||
$content[] = $table->render();
|
|
||||||
}
|
|
||||||
return phutil_implode_html('', $content);
|
|
||||||
}
|
|
||||||
|
|
||||||
private function renderCalendarWidgetPaneContent() {
|
|
||||||
$user = $this->getRequest()->getUser();
|
|
||||||
|
|
||||||
$conpherence = $this->getConpherence();
|
|
||||||
$widget_data = $conpherence->getWidgetData();
|
|
||||||
$statuses = $widget_data['statuses'];
|
|
||||||
$handles = $conpherence->getHandles();
|
|
||||||
$content = array();
|
|
||||||
$timestamps = $this->getCalendarWidgetWeekTimestamps();
|
|
||||||
$one_day = 24 * 60 * 60;
|
|
||||||
foreach ($timestamps as $time => $day) {
|
|
||||||
// build a header for the new day
|
|
||||||
$content[] = id(new PhabricatorHeaderView())
|
|
||||||
->setHeader($day->format('l'))
|
|
||||||
->render();
|
|
||||||
|
|
||||||
$day->setTime(0, 0, 0);
|
|
||||||
$epoch_start = $day->format('U');
|
|
||||||
$day->modify('+1 day');
|
|
||||||
$epoch_end = $day->format('U');
|
|
||||||
|
|
||||||
// keep looking through statuses where we last left off
|
|
||||||
foreach ($statuses as $status) {
|
|
||||||
if ($status->getDateFrom() >= $epoch_end) {
|
|
||||||
// This list is sorted, so we can stop looking.
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if ($status->getDateFrom() < $epoch_end &&
|
|
||||||
$status->getDateTo() > $epoch_start) {
|
|
||||||
$timespan = $status->getDateTo() - $status->getDateFrom();
|
|
||||||
if ($timespan > $one_day) {
|
|
||||||
$time_str = 'm/d';
|
|
||||||
} else {
|
|
||||||
$time_str = 'h:i A';
|
|
||||||
}
|
|
||||||
$epoch_range = phabricator_format_local_time(
|
|
||||||
$status->getDateFrom(),
|
|
||||||
$user,
|
|
||||||
$time_str
|
|
||||||
) . ' - ' . phabricator_format_local_time(
|
|
||||||
$status->getDateTo(),
|
|
||||||
$user,
|
|
||||||
$time_str
|
|
||||||
);
|
|
||||||
|
|
||||||
$content[] = phutil_tag(
|
|
||||||
'div',
|
|
||||||
array(
|
|
||||||
'class' => 'user-status '.$status->getTextStatus(),
|
|
||||||
),
|
|
||||||
array(
|
|
||||||
phutil_tag(
|
|
||||||
'div',
|
|
||||||
array(
|
|
||||||
'class' => 'epoch-range'
|
|
||||||
),
|
|
||||||
$epoch_range
|
|
||||||
),
|
|
||||||
phutil_tag(
|
|
||||||
'div',
|
|
||||||
array(
|
|
||||||
'class' => 'icon',
|
|
||||||
),
|
|
||||||
''
|
|
||||||
),
|
|
||||||
phutil_tag(
|
|
||||||
'div',
|
|
||||||
array(
|
|
||||||
'class' => 'description'
|
|
||||||
),
|
|
||||||
$status->getTerseSummary($user)
|
|
||||||
),
|
|
||||||
phutil_tag(
|
|
||||||
'div',
|
|
||||||
array(
|
|
||||||
'class' => 'participant'
|
|
||||||
),
|
|
||||||
$handles[$status->getUserPHID()]->getName()
|
|
||||||
)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return phutil_implode_html('', $content);
|
|
||||||
}
|
|
||||||
|
|
||||||
private function getCalendarWidgetWeekTimestamps() {
|
|
||||||
$user = $this->getRequest()->getUser();
|
|
||||||
$timezone = new DateTimeZone($user->getTimezoneIdentifier());
|
|
||||||
|
|
||||||
$timestamps = array();
|
|
||||||
for ($day = 0; $day < 7; $day++) {
|
|
||||||
$timestamps[] = new DateTime(
|
|
||||||
sprintf('today +%d days', $day),
|
|
||||||
$timezone
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $timestamps;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,312 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @group conpherence
|
||||||
|
*/
|
||||||
|
final class ConpherenceWidgetController extends
|
||||||
|
ConpherenceController {
|
||||||
|
|
||||||
|
private $conpherenceID;
|
||||||
|
private $conpherence;
|
||||||
|
|
||||||
|
public function setConpherence(ConpherenceThread $conpherence) {
|
||||||
|
$this->conpherence = $conpherence;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
public function getConpherence() {
|
||||||
|
return $this->conpherence;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setConpherenceID($conpherence_id) {
|
||||||
|
$this->conpherenceID = $conpherence_id;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
public function getConpherenceID() {
|
||||||
|
return $this->conpherenceID;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function willProcessRequest(array $data) {
|
||||||
|
$this->setConpherenceID(idx($data, 'id'));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function processRequest() {
|
||||||
|
$request = $this->getRequest();
|
||||||
|
$user = $request->getUser();
|
||||||
|
|
||||||
|
$conpherence_id = $this->getConpherenceID();
|
||||||
|
if (!$conpherence_id) {
|
||||||
|
return new Aphront404Response();
|
||||||
|
}
|
||||||
|
$conpherence = id(new ConpherenceThreadQuery())
|
||||||
|
->setViewer($user)
|
||||||
|
->withIDs(array($conpherence_id))
|
||||||
|
->needWidgetData(true)
|
||||||
|
->executeOne();
|
||||||
|
$this->setConpherence($conpherence);
|
||||||
|
|
||||||
|
$widgets = $this->renderWidgetPaneContent();
|
||||||
|
$content = $widgets;
|
||||||
|
return id(new AphrontAjaxResponse())->setContent($content);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function renderWidgetPaneContent() {
|
||||||
|
require_celerity_resource('conpherence-widget-pane-css');
|
||||||
|
require_celerity_resource('sprite-conpher-css');
|
||||||
|
Javelin::initBehavior(
|
||||||
|
'conpherence-widget-pane',
|
||||||
|
array(
|
||||||
|
'widgetRegistery' => array(
|
||||||
|
'widgets-files' => 1,
|
||||||
|
'widgets-tasks' => 1,
|
||||||
|
'widgets-calendar' => 1,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
$conpherence = $this->getConpherence();
|
||||||
|
|
||||||
|
$widgets = phutil_tag(
|
||||||
|
'div',
|
||||||
|
array(
|
||||||
|
'class' => 'widgets-header'
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
javelin_tag(
|
||||||
|
'a',
|
||||||
|
array(
|
||||||
|
'sigil' => 'conpherence-change-widget',
|
||||||
|
'meta' => array(
|
||||||
|
'widget' => 'widgets-files',
|
||||||
|
'toggleClass' => 'conpher_files_on'
|
||||||
|
),
|
||||||
|
'id' => 'widgets-files-toggle',
|
||||||
|
'class' => 'sprite-conpher conpher_files_off first-icon'
|
||||||
|
),
|
||||||
|
''
|
||||||
|
),
|
||||||
|
javelin_tag(
|
||||||
|
'a',
|
||||||
|
array(
|
||||||
|
'sigil' => 'conpherence-change-widget',
|
||||||
|
'meta' => array(
|
||||||
|
'widget' => 'widgets-tasks',
|
||||||
|
'toggleClass' => 'conpher_list_on'
|
||||||
|
),
|
||||||
|
'id' => 'widgets-tasks-toggle',
|
||||||
|
'class' => 'sprite-conpher conpher_list_off conpher_list_on',
|
||||||
|
),
|
||||||
|
''
|
||||||
|
),
|
||||||
|
javelin_tag(
|
||||||
|
'a',
|
||||||
|
array(
|
||||||
|
'sigil' => 'conpherence-change-widget',
|
||||||
|
'meta' => array(
|
||||||
|
'widget' => 'widgets-calendar',
|
||||||
|
'toggleClass' => 'conpher_calendar_on'
|
||||||
|
),
|
||||||
|
'id' => 'widgets-calendar-toggle',
|
||||||
|
'class' => 'sprite-conpher conpher_calendar_off',
|
||||||
|
),
|
||||||
|
''
|
||||||
|
)
|
||||||
|
)
|
||||||
|
).
|
||||||
|
phutil_tag(
|
||||||
|
'div',
|
||||||
|
array(
|
||||||
|
'class' => 'widgets-body',
|
||||||
|
'id' => 'widgets-files',
|
||||||
|
'style' => 'display: none;'
|
||||||
|
),
|
||||||
|
$this->renderFilesWidgetPaneContent()
|
||||||
|
).
|
||||||
|
phutil_tag(
|
||||||
|
'div',
|
||||||
|
array(
|
||||||
|
'class' => 'widgets-body',
|
||||||
|
'id' => 'widgets-tasks',
|
||||||
|
),
|
||||||
|
$this->renderTaskWidgetPaneContent()
|
||||||
|
).
|
||||||
|
phutil_tag(
|
||||||
|
'div',
|
||||||
|
array(
|
||||||
|
'class' => 'widgets-body',
|
||||||
|
'id' => 'widgets-calendar',
|
||||||
|
'style' => 'display: none;'
|
||||||
|
),
|
||||||
|
$this->renderCalendarWidgetPaneContent()
|
||||||
|
);
|
||||||
|
|
||||||
|
return array('widgets' => $widgets);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function renderFilesWidgetPaneContent() {
|
||||||
|
$conpherence = $this->getConpherence();
|
||||||
|
$widget_data = $conpherence->getWidgetData();
|
||||||
|
$files = $widget_data['files'];
|
||||||
|
|
||||||
|
$table_data = array();
|
||||||
|
foreach ($files as $file) {
|
||||||
|
$thumb = $file->getThumb60x45URI();
|
||||||
|
$table_data[] = array(
|
||||||
|
phutil_tag(
|
||||||
|
'img',
|
||||||
|
array(
|
||||||
|
'src' => $thumb
|
||||||
|
),
|
||||||
|
''
|
||||||
|
),
|
||||||
|
$file->getName()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
$header = id(new PhabricatorHeaderView())
|
||||||
|
->setHeader(pht('Attached Files'));
|
||||||
|
$table = id(new AphrontTableView($table_data))
|
||||||
|
->setNoDataString(pht('No files attached to conpherence.'))
|
||||||
|
->setHeaders(array('', pht('Name')))
|
||||||
|
->setColumnClasses(array('', 'wide'));
|
||||||
|
return new PhutilSafeHTML($header->render() . $table->render());
|
||||||
|
}
|
||||||
|
|
||||||
|
private function renderTaskWidgetPaneContent() {
|
||||||
|
$conpherence = $this->getConpherence();
|
||||||
|
$widget_data = $conpherence->getWidgetData();
|
||||||
|
$tasks = $widget_data['tasks'];
|
||||||
|
$priority_map = ManiphestTaskPriority::getTaskPriorityMap();
|
||||||
|
$handles = $conpherence->getHandles();
|
||||||
|
$content = array();
|
||||||
|
foreach ($tasks as $owner_phid => $actual_tasks) {
|
||||||
|
$handle = $handles[$owner_phid];
|
||||||
|
$content[] = id(new PhabricatorHeaderView())
|
||||||
|
->setHeader($handle->getName())
|
||||||
|
->render();
|
||||||
|
$actual_tasks = msort($actual_tasks, 'getPriority');
|
||||||
|
$actual_tasks = array_reverse($actual_tasks);
|
||||||
|
$data = array();
|
||||||
|
foreach ($actual_tasks as $task) {
|
||||||
|
$data[] = array(
|
||||||
|
idx($priority_map, $task->getPriority(), pht('???')),
|
||||||
|
phutil_tag(
|
||||||
|
'a',
|
||||||
|
array(
|
||||||
|
'href' => '/T'.$task->getID()
|
||||||
|
),
|
||||||
|
$task->getTitle()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
$table = id(new AphrontTableView($data))
|
||||||
|
->setNoDataString(pht('No open tasks.'))
|
||||||
|
->setHeaders(array(pht('Pri'), pht('Title')))
|
||||||
|
->setColumnClasses(array('', 'wide'));
|
||||||
|
$content[] = $table->render();
|
||||||
|
}
|
||||||
|
return new PhutilSafeHTML(implode('', $content));
|
||||||
|
}
|
||||||
|
|
||||||
|
private function renderCalendarWidgetPaneContent() {
|
||||||
|
$user = $this->getRequest()->getUser();
|
||||||
|
|
||||||
|
$conpherence = $this->getConpherence();
|
||||||
|
$widget_data = $conpherence->getWidgetData();
|
||||||
|
$statuses = $widget_data['statuses'];
|
||||||
|
$handles = $conpherence->getHandles();
|
||||||
|
$content = array();
|
||||||
|
$timestamps = $this->getCalendarWidgetWeekTimestamps();
|
||||||
|
$one_day = 24 * 60 * 60;
|
||||||
|
foreach ($timestamps as $time => $day) {
|
||||||
|
// build a header for the new day
|
||||||
|
$content[] = id(new PhabricatorHeaderView())
|
||||||
|
->setHeader($day->format('l'))
|
||||||
|
->render();
|
||||||
|
|
||||||
|
$day->setTime(0, 0, 0);
|
||||||
|
$epoch_start = $day->format('U');
|
||||||
|
$day->modify('+1 day');
|
||||||
|
$epoch_end = $day->format('U');
|
||||||
|
|
||||||
|
// keep looking through statuses where we last left off
|
||||||
|
foreach ($statuses as $status) {
|
||||||
|
if ($status->getDateFrom() >= $epoch_end) {
|
||||||
|
// This list is sorted, so we can stop looking.
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if ($status->getDateFrom() < $epoch_end &&
|
||||||
|
$status->getDateTo() > $epoch_start) {
|
||||||
|
$timespan = $status->getDateTo() - $status->getDateFrom();
|
||||||
|
if ($timespan > $one_day) {
|
||||||
|
$time_str = 'm/d';
|
||||||
|
} else {
|
||||||
|
$time_str = 'h:i A';
|
||||||
|
}
|
||||||
|
$epoch_range = phabricator_format_local_time(
|
||||||
|
$status->getDateFrom(),
|
||||||
|
$user,
|
||||||
|
$time_str
|
||||||
|
) . ' - ' . phabricator_format_local_time(
|
||||||
|
$status->getDateTo(),
|
||||||
|
$user,
|
||||||
|
$time_str
|
||||||
|
);
|
||||||
|
|
||||||
|
$content[] = phutil_tag(
|
||||||
|
'div',
|
||||||
|
array(
|
||||||
|
'class' => 'user-status '.$status->getTextStatus(),
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
phutil_tag(
|
||||||
|
'div',
|
||||||
|
array(
|
||||||
|
'class' => 'epoch-range'
|
||||||
|
),
|
||||||
|
$epoch_range
|
||||||
|
),
|
||||||
|
phutil_tag(
|
||||||
|
'div',
|
||||||
|
array(
|
||||||
|
'class' => 'icon',
|
||||||
|
),
|
||||||
|
''
|
||||||
|
),
|
||||||
|
phutil_tag(
|
||||||
|
'div',
|
||||||
|
array(
|
||||||
|
'class' => 'description'
|
||||||
|
),
|
||||||
|
$status->getTerseSummary($user)
|
||||||
|
),
|
||||||
|
phutil_tag(
|
||||||
|
'div',
|
||||||
|
array(
|
||||||
|
'class' => 'participant'
|
||||||
|
),
|
||||||
|
$handles[$status->getUserPHID()]->getName()
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return new PhutilSafeHTML(implode('', $content));
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getCalendarWidgetWeekTimestamps() {
|
||||||
|
$user = $this->getRequest()->getUser();
|
||||||
|
$timezone = new DateTimeZone($user->getTimezoneIdentifier());
|
||||||
|
|
||||||
|
$timestamps = array();
|
||||||
|
for ($day = 0; $day < 7; $day++) {
|
||||||
|
$timestamps[] = new DateTime(
|
||||||
|
sprintf('today +%d days', $day),
|
||||||
|
$timezone
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $timestamps;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -117,6 +117,23 @@ final class ConpherenceThread extends ConpherenceDAO
|
||||||
return $this->transactions;
|
return $this->transactions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getTransactionsFrom($begin = 0, $amount = null) {
|
||||||
|
$length = count($this->transactions);
|
||||||
|
if ($amount === null) {
|
||||||
|
$amount === $length;
|
||||||
|
}
|
||||||
|
if ($this->transactions === null) {
|
||||||
|
throw new Exception(
|
||||||
|
'You must attachTransactions first!'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return array_slice(
|
||||||
|
$this->transactions,
|
||||||
|
$length - $begin - $amount,
|
||||||
|
$amount
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
public function attachFilePHIDs(array $file_phids) {
|
public function attachFilePHIDs(array $file_phids) {
|
||||||
$this->filePHIDs = $file_phids;
|
$this->filePHIDs = $file_phids;
|
||||||
return $this;
|
return $this;
|
||||||
|
|
|
@ -10,6 +10,14 @@
|
||||||
height: 100%;
|
height: 100%;
|
||||||
margin: 0px 320px 0px 0px;
|
margin: 0px 320px 0px 0px;
|
||||||
}
|
}
|
||||||
|
.conpherence-show-older-messages {
|
||||||
|
display: block;
|
||||||
|
background: #e0e3ec;
|
||||||
|
margin: 10px;
|
||||||
|
text-align: center;
|
||||||
|
padding: 10px;
|
||||||
|
color: #18559D;
|
||||||
|
}
|
||||||
|
|
||||||
.conpherence-message-pane .conpherence-messages {
|
.conpherence-message-pane .conpherence-messages {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
|
|
|
@ -10,11 +10,16 @@
|
||||||
|
|
||||||
JX.behavior('conpherence-menu', function(config) {
|
JX.behavior('conpherence-menu', function(config) {
|
||||||
|
|
||||||
|
function onwidgetresponse(context, response) {
|
||||||
|
var widgets = JX.$H(response.widgets);
|
||||||
|
var widgetsRoot = JX.$(config.widgets_pane);
|
||||||
|
JX.DOM.setContent(widgetsRoot, widgets);
|
||||||
|
}
|
||||||
|
|
||||||
function onresponse(context, response) {
|
function onresponse(context, response) {
|
||||||
var header = JX.$H(response.header);
|
var header = JX.$H(response.header);
|
||||||
var messages = JX.$H(response.messages);
|
var messages = JX.$H(response.messages);
|
||||||
var form = JX.$H(response.form);
|
var form = JX.$H(response.form);
|
||||||
var widgets = JX.$H(response.widgets);
|
|
||||||
var headerRoot = JX.$(config.header);
|
var headerRoot = JX.$(config.header);
|
||||||
var messagesRoot = JX.$(config.messages);
|
var messagesRoot = JX.$(config.messages);
|
||||||
var formRoot = JX.$(config.form_pane);
|
var formRoot = JX.$(config.form_pane);
|
||||||
|
@ -24,7 +29,6 @@ JX.behavior('conpherence-menu', function(config) {
|
||||||
JX.DOM.setContent(messagesRoot, messages);
|
JX.DOM.setContent(messagesRoot, messages);
|
||||||
messagesRoot.scrollTop = messagesRoot.scrollHeight;
|
messagesRoot.scrollTop = messagesRoot.scrollHeight;
|
||||||
JX.DOM.setContent(formRoot, form);
|
JX.DOM.setContent(formRoot, form);
|
||||||
JX.DOM.setContent(widgetsRoot, widgets);
|
|
||||||
|
|
||||||
var conpherences = JX.DOM.scry(
|
var conpherences = JX.DOM.scry(
|
||||||
menuRoot,
|
menuRoot,
|
||||||
|
@ -92,12 +96,25 @@ JX.behavior('conpherence-menu', function(config) {
|
||||||
|
|
||||||
var selected = e.getData().selected;
|
var selected = e.getData().selected;
|
||||||
var data = JX.Stratcom.getData(selected);
|
var data = JX.Stratcom.getData(selected);
|
||||||
|
|
||||||
var uri = config.base_uri + 'view/' + data.id + '/';
|
var uri = config.base_uri + 'view/' + data.id + '/';
|
||||||
|
var widget_uri = config.base_uri + 'widget/' + data.id + '/';
|
||||||
new JX.Workflow(uri, {})
|
new JX.Workflow(uri, {})
|
||||||
.setHandler(JX.bind(null, onresponse, selected))
|
.setHandler(JX.bind(null, onresponse, selected))
|
||||||
.start();
|
.start();
|
||||||
|
new JX.Workflow(widget_uri, {})
|
||||||
|
.setHandler(JX.bind(null, onwidgetresponse, selected))
|
||||||
|
.start();
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
JX.Stratcom.listen('click', 'show-older-messages', function(e) {
|
||||||
|
e.kill();
|
||||||
|
console.log(document.URL);
|
||||||
|
new JX.Request('/conpherence/view/1/', function(r) {
|
||||||
|
console.log('100');
|
||||||
|
})
|
||||||
|
.setData({offset: 100}) // get the next page
|
||||||
|
.send();
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
Loading…
Add table
Reference in a new issue