Page MenuHomestyx hydra

No OneTemporary

diff --git a/src/applications/conpherence/controller/ConpherenceWidgetController.php b/src/applications/conpherence/controller/ConpherenceWidgetController.php
index 4cfe468b25..a01c40c504 100644
--- a/src/applications/conpherence/controller/ConpherenceWidgetController.php
+++ b/src/applications/conpherence/controller/ConpherenceWidgetController.php
@@ -1,379 +1,482 @@
<?php
/**
* @group conpherence
*/
final class ConpherenceWidgetController extends
ConpherenceController {
private $conpherenceID;
private $conpherence;
private $userPreferences;
public function setUserPreferences(PhabricatorUserPreferences $pref) {
$this->userPreferences = $pref;
return $this;
}
public function getUserPreferences() {
return $this->userPreferences;
}
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)
->needAllTransactions(true)
->executeOne();
$this->setConpherence($conpherence);
$this->setUserPreferences($user->loadPreferences());
$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-conpherence-css');
$can_toggle = 1;
$cant_toggle = 0;
Javelin::initBehavior(
'conpherence-widget-pane',
array(
'header' => 'conpherence-header-pane',
'messages' => 'conpherence-messages',
'people_widget' => 'widgets-people',
'file_widget' => 'widgets-files',
'settings_widget' => 'widgets-settings',
'widgetRegistery' => array(
'widgets-conpherence-list' => $cant_toggle,
'widgets-conversation' => $cant_toggle,
'widgets-people' => $can_toggle,
'widgets-files' => $can_toggle,
'widgets-calendar' => $can_toggle,
'widgets-settings' => $can_toggle,
)
));
$conpherence = $this->getConpherence();
$widgets = array();
$widgets[] = phutil_tag(
'div',
array(
'class' => 'widgets-header'
),
phutil_tag(
'div',
array(
'class' => 'widgets-header-icon-holder'
),
array(
javelin_tag(
'a',
array(
'sigil' => 'conpherence-change-widget',
'meta' => array(
'widget' => 'widgets-conpherence-list',
'toggleClass' => 'conpherence_list_on'
),
'id' => 'widgets-conpherence-list-toggle',
'class' => 'sprite-conpherence conpherence_list_off',
),
''),
javelin_tag(
'a',
array(
'sigil' => 'conpherence-change-widget',
'meta' => array(
'widget' => 'widgets-conversation',
'toggleClass' => 'conpherence_conversation_on'
),
'id' => 'widgets-conpherence-conversation-toggle',
'class' => 'sprite-conpherence conpherence_conversation_off',
),
''),
javelin_tag(
'a',
array(
'sigil' => 'conpherence-change-widget',
'meta' => array(
'widget' => 'widgets-people',
'toggleClass' => 'conpherence_people_on'
),
'id' => 'widgets-people-toggle',
'class' => 'sprite-conpherence conpherence_people_off'
),
''),
javelin_tag(
'a',
array(
'sigil' => 'conpherence-change-widget',
'meta' => array(
'widget' => 'widgets-files',
'toggleClass' => 'conpherence_files_on'
),
'id' => 'widgets-files-toggle',
'class' =>
'sprite-conpherence conpherence_files_on conpherence_files_off'
),
''),
javelin_tag(
'a',
array(
'sigil' => 'conpherence-change-widget',
'meta' => array(
'widget' => 'widgets-calendar',
'toggleClass' => 'conpherence_calendar_on'
),
'id' => 'widgets-calendar-toggle',
'class' => 'sprite-conpherence conpherence_calendar_off',
),
''),
javelin_tag(
'a',
array(
'sigil' => 'conpherence-change-widget',
'meta' => array(
'widget' => 'widgets-settings',
'toggleClass' => 'conpherence_settings_on'
),
'id' => 'widgets-settings-toggle',
'class' => 'sprite-conpherence conpherence_settings_off',
),
'')
)));
$user = $this->getRequest()->getUser();
// now the widget bodies
$widgets[] = phutil_tag(
'div',
array(
'class' => 'widgets-body',
'id' => 'widgets-people',
'style' => 'display: none;'
),
id(new ConpherencePeopleWidgetView())
->setUser($user)
->setConpherence($conpherence)
->setUpdateURI($this->getWidgetURI()));
$widgets[] = phutil_tag(
'div',
array(
'class' => 'widgets-body',
'id' => 'widgets-files',
),
id(new ConpherenceFileWidgetView())
->setUser($user)
->setConpherence($conpherence)
->setUpdateURI($this->getWidgetURI()));
$widgets[] = phutil_tag(
'div',
array(
'class' => 'widgets-body',
'id' => 'widgets-calendar',
'style' => 'display: none;'
),
$this->renderCalendarWidgetPaneContent());
$widgets[] = phutil_tag(
'div',
array(
'class' => 'widgets-body',
'id' => 'widgets-settings',
'style' => 'display: none'
),
$this->renderSettingsWidgetPaneContent());
// without this implosion we get "," between each element in our widgets
// array
return array('widgets' => phutil_implode_html('', $widgets));
}
private function renderSettingsWidgetPaneContent() {
$user = $this->getRequest()->getUser();
$conpherence = $this->getConpherence();
$participants = $conpherence->getParticipants();
$participant = $participants[$user->getPHID()];
$default = ConpherenceSettings::EMAIL_ALWAYS;
$preference = $this->getUserPreferences();
if ($preference) {
$default = $preference->getPreference(
PhabricatorUserPreferences::PREFERENCE_CONPH_NOTIFICATIONS,
ConpherenceSettings::EMAIL_ALWAYS);
}
$settings = $participant->getSettings();
$notifications = idx(
$settings,
'notifications',
$default);
$options = id(new AphrontFormRadioButtonControl())
->addButton(
ConpherenceSettings::EMAIL_ALWAYS,
ConpherenceSettings::getHumanString(
ConpherenceSettings::EMAIL_ALWAYS),
'')
->addButton(
ConpherenceSettings::NOTIFICATIONS_ONLY,
ConpherenceSettings::getHumanString(
ConpherenceSettings::NOTIFICATIONS_ONLY),
'')
->setName('notifications')
->setValue($notifications);
$layout = array(
$options,
phutil_tag(
'input',
array(
'type' => 'hidden',
'name' => 'action',
'value' => 'notifications'
)),
javelin_tag(
'button',
array(
'sigil' => 'notifications-update',
'class' => 'notifications-update grey',
),
pht('Update Notifications'))
);
return phabricator_form(
$user,
array(
'method' => 'POST',
'action' => $this->getWidgetURI(),
),
$layout);
}
private function renderCalendarWidgetPaneContent() {
$user = $this->getRequest()->getUser();
$conpherence = $this->getConpherence();
+ $participants = $conpherence->getParticipants();
$widget_data = $conpherence->getWidgetData();
$statuses = $widget_data['statuses'];
$handles = $conpherence->getHandles();
$content = array();
+ $layout = id(new AphrontMultiColumnView())
+ ->setFluidLayout(true);
$timestamps = $this->getCalendarWidgetWeekTimestamps();
+ $today = $timestamps['today'];
+ $weekstamps = $timestamps['weekstamps'];
$one_day = 24 * 60 * 60;
- foreach ($timestamps as $time => $day) {
+ foreach ($weekstamps as $time => $day) {
// build a header for the new day
- $content[] = id(new PhabricatorHeaderView())
- ->setHeader($day->format('l'))
- ->render();
+ $content[] = phutil_tag(
+ 'div',
+ array(
+ 'class' => 'day-header'
+ ),
+ array(
+ phutil_tag(
+ 'div',
+ array(
+ 'class' => 'day-name'
+ ),
+ $day->format('l')),
+ phutil_tag(
+ 'div',
+ array(
+ 'class' => 'day-date'
+ ),
+ $day->format('m/d/y'))
+ ));
+
+ $week_day_number = $day->format('w');
+
$day->setTime(0, 0, 0);
$epoch_start = $day->format('U');
- $day->modify('+1 day');
- $epoch_end = $day->format('U');
+ $next_day = clone $day;
+ $next_day->modify('+1 day');
+ $epoch_end = $next_day->format('U');
+ $first_status_of_the_day = true;
+ $statuses_of_the_day = array();
// 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 (!$first_status_of_the_day) {
+ $content[] = phutil_tag(
+ 'div',
+ array(
+ 'class' => 'divider'
+ ),
+ '');
+ }
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(),
+ $status->getDateTo() > $epoch_start) {
+ $statuses_of_the_day[$status->getUserPHID()] = $status;
+ $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) . ' - ' . phabricator_format_local_time(
- $status->getDateTo(),
- $user,
- $time_str);
+ $time_str);
- $content[] = phutil_tag(
+ $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())
+ ));
+ $first_status_of_the_day = false;
+ }
+ }
+ // we didn't get a status on this day so add a spacer
+ if ($first_status_of_the_day) {
+ $content[] = phutil_tag(
+ 'div',
+ array(
+ 'class' => 'spacer'
+ ),
+ '');
+ }
+ if ($week_day_number > 0 && $week_day_number < 6) {
+ if ($week_day_number == $today->format('w')) {
+ $active_class = '-active';
+ } else {
+ $active_class = '';
+ }
+ $inner_layout = array();
+ foreach ($participants as $phid => $participant) {
+ $status = idx($statuses_of_the_day, $phid, false);
+ if ($status) {
+ $inner_layout[] = phutil_tag(
'div',
array(
- 'class' => 'user-status '.$status->getTextStatus(),
+ 'class' => $status->getTextStatus()
),
+ '');
+ } else {
+ $inner_layout[] = phutil_tag(
+ 'div',
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())
- ));
+ 'class' => 'present'
+ ),
+ '');
}
+ }
+ $layout->addColumn(
+ phutil_tag(
+ 'div',
+ array(
+ 'class' => 'day-column'.$active_class
+ ),
+ array(
+ phutil_tag(
+ 'div',
+ array(
+ 'class' => 'day-name'
+ ),
+ $day->format('D')),
+ phutil_tag(
+ 'div',
+ array(
+ 'class' => 'day-number',
+ ),
+ $day->format('j')),
+ $inner_layout
+ )));
}
}
- return new PhutilSafeHTML(implode('', $content));
+ return
+ array(
+ $layout,
+ $content
+ );
}
private function getCalendarWidgetWeekTimestamps() {
$user = $this->getRequest()->getUser();
$timezone = new DateTimeZone($user->getTimezoneIdentifier());
+ $today = id(new DateTime('now', $timezone));
+ $monday = clone $today;
+ $monday
+ ->modify('+1 day')
+ ->modify('last monday');
$timestamps = array();
for ($day = 0; $day < 7; $day++) {
- $timestamps[] = new DateTime(
- sprintf('today +%d days', $day),
- $timezone
- );
+ $timestamp = clone $monday;
+ $timestamps[] = $timestamp->modify(sprintf('+%d days', $day));
}
- return $timestamps;
+ return array(
+ 'today' => $today,
+ 'weekstamps' => $timestamps
+ );
}
private function getWidgetURI() {
$conpherence = $this->getConpherence();
return $this->getApplicationURI('update/'.$conpherence->getID().'/');
}
}
diff --git a/src/applications/conpherence/query/ConpherenceThreadQuery.php b/src/applications/conpherence/query/ConpherenceThreadQuery.php
index 83de1cb1ca..5c81707b8a 100644
--- a/src/applications/conpherence/query/ConpherenceThreadQuery.php
+++ b/src/applications/conpherence/query/ConpherenceThreadQuery.php
@@ -1,281 +1,281 @@
<?php
/**
* @group conpherence
*/
final class ConpherenceThreadQuery
extends PhabricatorCursorPagedPolicyAwareQuery {
private $phids;
private $ids;
private $needWidgetData;
private $needHeaderPics;
private $needOrigPics;
private $needAllTransactions;
private $afterMessageID;
public function needOrigPics($need_orig_pics) {
$this->needOrigPics = $need_orig_pics;
return $this;
}
public function needHeaderPics($need_header_pics) {
$this->needHeaderPics = $need_header_pics;
return $this;
}
public function needWidgetData($need_widget_data) {
$this->needWidgetData = $need_widget_data;
return $this;
}
public function needAllTransactions($need_all_transactions) {
$this->needAllTransactions = $need_all_transactions;
return $this;
}
public function withIDs(array $ids) {
$this->ids = $ids;
return $this;
}
public function withPHIDs(array $phids) {
$this->phids = $phids;
return $this;
}
// TODO: This is pretty hacky!!!!~~
public function setAfterMessageID($id) {
$this->afterMessageID = $id;
return $this;
}
protected function loadPage() {
$table = new ConpherenceThread();
$conn_r = $table->establishConnection('r');
$data = queryfx_all(
$conn_r,
'SELECT conpherence_thread.* FROM %T conpherence_thread %Q %Q %Q',
$table->getTableName(),
$this->buildWhereClause($conn_r),
$this->buildOrderClause($conn_r),
$this->buildLimitClause($conn_r));
$conpherences = $table->loadAllFromArray($data);
if ($conpherences) {
$conpherences = mpull($conpherences, null, 'getPHID');
$this->loadParticipants($conpherences);
if ($this->needAllTransactions) {
$this->loadTransactionsAndHandles($conpherences);
}
$this->loadFilePHIDs($conpherences);
if ($this->needWidgetData) {
$this->loadWidgetData($conpherences);
}
if ($this->needOrigPics) {
$this->loadOrigPics($conpherences);
}
if ($this->needHeaderPics) {
$this->loadHeaderPics($conpherences);
}
}
return $conpherences;
}
protected function buildWhereClause($conn_r) {
$where = array();
$where[] = $this->buildPagingClause($conn_r);
if ($this->ids) {
$where[] = qsprintf(
$conn_r,
'id IN (%Ld)',
$this->ids);
}
if ($this->phids) {
$where[] = qsprintf(
$conn_r,
'phid IN (%Ls)',
$this->phids);
}
return $this->formatWhereClause($where);
}
private function loadParticipants(array $conpherences) {
$participants = id(new ConpherenceParticipant())
->loadAllWhere('conpherencePHID IN (%Ls)', array_keys($conpherences));
$map = mgroup($participants, 'getConpherencePHID');
foreach ($map as $conpherence_phid => $conpherence_participants) {
$current_conpherence = $conpherences[$conpherence_phid];
$conpherence_participants = mpull(
$conpherence_participants,
null,
'getParticipantPHID');
$current_conpherence->attachParticipants($conpherence_participants);
}
return $this;
}
private function loadTransactionsAndHandles(array $conpherences) {
$transactions = id(new ConpherenceTransactionQuery())
->setViewer($this->getViewer())
->withObjectPHIDs(array_keys($conpherences))
->needHandles(true)
->setAfterID($this->afterMessageID)
->execute();
$transactions = mgroup($transactions, 'getObjectPHID');
foreach ($conpherences as $phid => $conpherence) {
$current_transactions = $transactions[$phid];
$handles = array();
foreach ($current_transactions as $transaction) {
$handles += $transaction->getHandles();
}
$conpherence->attachHandles($handles);
$conpherence->attachTransactions($transactions[$phid]);
}
return $this;
}
private function loadFilePHIDs(array $conpherences) {
$edge_type = PhabricatorEdgeConfig::TYPE_OBJECT_HAS_FILE;
$file_edges = id(new PhabricatorEdgeQuery())
->withSourcePHIDs(array_keys($conpherences))
->withEdgeTypes(array($edge_type))
->execute();
foreach ($file_edges as $conpherence_phid => $data) {
$conpherence = $conpherences[$conpherence_phid];
$conpherence->attachFilePHIDs(array_keys($data[$edge_type]));
}
return $this;
}
private function loadWidgetData(array $conpherences) {
$participant_phids = array();
$file_phids = array();
foreach ($conpherences as $conpherence) {
$participant_phids[] = array_keys($conpherence->getParticipants());
$file_phids[] = $conpherence->getFilePHIDs();
}
$participant_phids = array_mergev($participant_phids);
$file_phids = array_mergev($file_phids);
// statuses of everyone currently in the conpherence
// for a rolling one week window
$start_of_week = phabricator_format_local_time(
- strtotime('today'),
+ strtotime('last monday', strtotime('tomorrow')),
$this->getViewer(),
'U');
$end_of_week = phabricator_format_local_time(
- strtotime('midnight +1 week'),
+ strtotime('last monday +1 week', strtotime('tomorrow')),
$this->getViewer(),
'U');
$statuses = id(new PhabricatorUserStatus())
->loadAllWhere(
'userPHID in (%Ls) AND dateTo >= %d AND dateFrom <= %d',
$participant_phids,
$start_of_week,
$end_of_week);
$statuses = mgroup($statuses, 'getUserPHID');
// attached files
$files = array();
$file_author_phids = array();
$authors = array();
if ($file_phids) {
$files = id(new PhabricatorFileQuery())
->setViewer($this->getViewer())
->withPHIDs($file_phids)
->execute();
$files = mpull($files, null, 'getPHID');
$file_author_phids = mpull($files, 'getAuthorPHID', 'getPHID');
$authors = id(new PhabricatorObjectHandleData($file_author_phids))
->setViewer($this->getViewer())
->loadHandles();
$authors = mpull($authors, null, 'getPHID');
}
foreach ($conpherences as $phid => $conpherence) {
$participant_phids = array_keys($conpherence->getParticipants());
$statuses = array_select_keys($statuses, $participant_phids);
$statuses = array_mergev($statuses);
$statuses = msort($statuses, 'getDateFrom');
$conpherence_files = array();
$files_authors = array();
foreach ($conpherence->getFilePHIDs() as $curr_phid) {
$curr_file = idx($files, $curr_phid);
if (!$curr_file) {
// this file was deleted or user doesn't have permission to see it
// this is generally weird
continue;
}
$conpherence_files[$curr_phid] = $curr_file;
// some files don't have authors so be careful
$current_author = null;
$current_author_phid = idx($file_author_phids, $curr_phid);
if ($current_author_phid) {
$current_author = $authors[$current_author_phid];
}
$files_authors[$curr_phid] = $current_author;
}
$widget_data = array(
'statuses' => $statuses,
'files' => $conpherence_files,
'files_authors' => $files_authors
);
$conpherence->attachWidgetData($widget_data);
}
return $this;
}
private function loadOrigPics(array $conpherences) {
return $this->loadPics(
$conpherences,
ConpherenceImageData::SIZE_ORIG);
}
private function loadHeaderPics(array $conpherences) {
return $this->loadPics(
$conpherences,
ConpherenceImageData::SIZE_HEAD);
}
private function loadPics(array $conpherences, $size) {
$conpherence_pic_phids = array();
foreach ($conpherences as $conpherence) {
$phid = $conpherence->getImagePHID($size);
if ($phid) {
$conpherence_pic_phids[$conpherence->getPHID()] = $phid;
}
}
if (!$conpherence_pic_phids) {
return $this;
}
$files = id(new PhabricatorFileQuery())
->setViewer($this->getViewer())
->withPHIDs($conpherence_pic_phids)
->execute();
$files = mpull($files, null, 'getPHID');
foreach ($conpherence_pic_phids as $conpherence_phid => $pic_phid) {
$conpherences[$conpherence_phid]->setImage($files[$pic_phid], $size);
}
return $this;
}
}
diff --git a/webroot/rsrc/css/application/conpherence/widget-pane.css b/webroot/rsrc/css/application/conpherence/widget-pane.css
index 2de198970c..ef0a3af97f 100644
--- a/webroot/rsrc/css/application/conpherence/widget-pane.css
+++ b/webroot/rsrc/css/application/conpherence/widget-pane.css
@@ -1,283 +1,378 @@
/**
* @provides conpherence-widget-pane-css
*/
.conpherence-widget-pane {
position: fixed;
right: 0px;
top: 125px;
width: 280px;
height: 100%;
border-width: 0 0 0 1px;
border-color: #CCC;
border-style: solid;
background: url('/rsrc/image/texture/dust_background.jpg');
overflow-y: auto;
-webkit-overflow-scrolling: touch;
}
.device-phone .conpherence-widget-pane {
top: 44px;
width: 100%;
}
.conpherence-widget-pane .aphront-form-input {
margin: 0;
width: 100%;
}
.conpherence-widget-pane .aphront-form-inset {
border: 0;
background: url('/rsrc/image/texture/dust_background.jpg');
}
.conpherence-widget-pane .widgets-header {
background-color: #d8dce2;
box-shadow: 0px 2px 2px rgba(0,0,0,0.15);
}
.conpherence-widget-pane .widgets-header .widgets-header-icon-holder {
height: 40px;
width: 280px;
margin: 0 auto;
}
.device-desktop .conpherence-widget-pane .widgets-header
.widgets-header-icon-holder {
width: 175px;
margin: 0px auto 0px auto;
}
.conpherence-widget-pane .widgets-header .sprite-conpherence {
display: block;
width: 29px;
height: 34px;
margin: 4px 0px 0px 14px;
float: left;
clear: none;
}
.conpherence-widget-pane .widgets-header .conpherence_list_on,
.conpherence-widget-pane .widgets-header .conpherence_conversation_on,
.conpherence-widget-pane .widgets-header .conpherence_people_on,
.conpherence-widget-pane .widgets-header .conpherence_files_on,
.conpherence-widget-pane .widgets-header .conpherence_calendar_on,
.conpherence-widget-pane .widgets-header .conpherence_settings_on {
border-bottom: 3px solid #525252;
}
.device-desktop .conpherence-widget-pane .widgets-header
#widgets-conpherence-list-toggle,
.device-desktop .conpherence-widget-pane .widgets-header
#widgets-conpherence-conversation-toggle {
display: none;
}
.conpherence-widget-pane .widgets-body {
position: fixed;
overflow-y: auto;
top: 165px;
bottom: 0px;
width: 100%;
}
.device-phone .conpherence-widget-pane .widgets-body {
top: 85px;
}
/* files widget */
.conpherence-widget-pane #widgets-files .file-entry {
padding: 12px 0px 14px 0px;
}
.conpherence-widget-pane #widgets-files .file-icon {
position: relative;
top: 0px;
left: 8px;
width: 32px;
height: 32px;
float: left;
}
.conpherence-widget-pane #widgets-files .file-title {
display: block;
position: relative;
top: -4px;
left: 20px;
overflow-x: hidden;
width: 210px;
font-weight: bold;
}
.conpherence-widget-pane #widgets-files .file-uploaded-by {
color: #a1a5a9;
position: relative;
top: 0px;
left: 20px;
width: 210px;
font-size: 11px;
}
.conpherence-widget-pane #widgets-files .file-extra {
display: block;
height: 120px;
width: 160px;
margin: 8px 0px 8px 52px;
border: 1px solid #7289b7;
box-shadow: 0 0px 5px rgba(0,0,0,.25);
background: #fff;
}
.conpherence-widget-pane #widgets-files .divider {
float: left;
clear: both;
width: 210px;
margin: 8px 0px 0px 50px;
border: 1px dashed #bfbfbf;
}
+
/* calendar widget */
+.conpherence-widget-pane #widgets-calendar .aphront-multi-column-view {
+ margin: 2px 0px 0px 0px;
+ width: 280px;
+}
+.conpherence-widget-pane #widgets-calendar .aphront-multi-column-view
+.aphront-multi-column-column {
+ background: white;
+ border-right: 1px solid #bfbfbf;
+ text-align: center;
+}
+.conpherence-widget-pane #widgets-calendar .aphront-multi-column-view
+.aphront-multi-column-column-last {
+ border-right: 0;
+}
+.conpherence-widget-pane #widgets-calendar .aphront-multi-column-view
+.aphront-multi-column-column .day-column,
+.conpherence-widget-pane #widgets-calendar .aphront-multi-column-view
+.aphront-multi-column-column .day-column-active {
+ color: #bfbfbf;
+ background-color: white;
+ font-weight: bold;
+ padding: 0px 0px 10px 0px;
+}
+.conpherence-widget-pane #widgets-calendar .aphront-multi-column-view
+.aphront-multi-column-column .day-column-active {
+ color: black;
+}
+.conpherence-widget-pane #widgets-calendar .aphront-multi-column-view
+.aphront-multi-column-column .present ,
+.conpherence-widget-pane #widgets-calendar .aphront-multi-column-view
+.aphront-multi-column-column .sporadic ,
+.conpherence-widget-pane #widgets-calendar .aphront-multi-column-view
+.aphront-multi-column-column .away {
+ height: 10px;
+ margin: 5px 0px 5px 0px;
+ width: 100%;
+}
+.conpherence-widget-pane #widgets-calendar .aphront-multi-column-view
+.aphront-multi-column-column .present {
+ background-color: white;
+}
+.conpherence-widget-pane #widgets-calendar .aphront-multi-column-view
+.aphront-multi-column-column .sporadic {
+ background-color: rgb(222, 226, 232);
+}
+.conpherence-widget-pane #widgets-calendar .aphront-multi-column-view
+.aphront-multi-column-column .away {
+ background-color: rgb(102, 204, 255);
+}
+.conpherence-widget-pane #widgets-calendar .aphront-multi-column-view
+.aphront-multi-column-column .day-name {
+ padding: 5px 0px 0px 0px;
+ font-size: 12px;
+}
+.conpherence-widget-pane #widgets-calendar .aphront-multi-column-view
+.aphront-multi-column-column .day-number {
+ font-size: 16px;
+ padding: 5px 0px 5px 0px;
+}
+.conpherence-widget-pane #widgets-calendar .day-header {
+ float: left;
+ clear: both;
+ background-color: #d8dce2;
+ border-top: 1px solid #bfbfbf;
+ border-bottom: 1px solid #bfbfbf;
+ padding: 5px 10px 5px 10px;
+ width: 260px;
+}
+.conpherence-widget-pane #widgets-calendar .day-header .day-name {
+ float: left;
+ clear: none;
+}
+.conpherence-widget-pane #widgets-calendar .day-header .day-date {
+ float: right;
+ clear: none;
+}
+
+.conpherence-widget-pane #widgets-calendar .divider {
+ float: left;
+ clear: both;
+ width: 260px;
+ margin: 0px 0px 0px 10px;
+ border: 1px dashed #bfbfbf;
+}
+.conpherence-widget-pane #widgets-calendar .spacer {
+ float: left;
+ clear: both;
+ height: 10px;
+ width: 100%;
+}
+
.conpherence-widget-pane #widgets-calendar .user-status {
+ float: left;
+ clear: both;
height: 60px;
+ width: 280px;
}
.conpherence-widget-pane #widgets-calendar .user-status .icon {
border-radius: 10px;
position: relative;
top: 24px;
- left: 12px;
+ left: 10px;
height: 16px;
width: 16px;
box-shadow: 0px 0px 1px #000;
}
.conpherence-widget-pane #widgets-calendar .sporadic .icon {
background-color: rgb(222, 226, 232);
}
.conpherence-widget-pane #widgets-calendar .away .icon {
background-color: rgb(102, 204, 255);
}
.conpherence-widget-pane #widgets-calendar .user-status .epoch-range {
float: right;
font-style: italic;
position: relative;
top: 24px;
- right: 8px;
+ right: 10px;
font-size: 11px;
}
.conpherence-widget-pane #widgets-calendar .user-status .description {
position: relative;
left: 40px;
top: 0px;
width: 260px;
}
.conpherence-widget-pane #widgets-calendar .user-status .participant {
position: relative;
left: 40px;
top: 0px;
font-style: italic;
font-size: 11px;
width: 260px;
}
.conpherence-widget-pane .widget-icon {
display: block;
height: 14px;
width: 14px;
}
.conpherence-widget-pane .phabricator-remarkup-embed-layout-link {
padding-bottom: 1px;
}
/* people widget */
.conpherence-widget-pane .people-widget-header {
float: left;
width: 280px;
}
.conpherence-widget-pane .people-widget-header .divider {
float: left;
clear: both;
width: 260px;
margin: 0px 0px 0px 10px;
border: 1px dashed #bfbfbf;
}
.conpherence-widget-pane .people-widget-header .add-people-widget {
float: left;
padding: 10px 0px 10px 0px;
width: 280px;
}
.conpherence-widget-pane .people-widget-header .add-people-widget
.aphront-form-control-tokenizer {
float: left;
width: 180px;
padding: 0px 0px 0px 10px
}
.conpherence-widget-pane .people-widget-header .add-people-widget
.jx-tokenizer-input {
padding: 1px 3px 1px 3px;
}
.conpherence-widget-pane .people-widget-header .add-people-widget
.people-add-button {
float: right;
margin: 0px 10px 0px 0px;
padding: 3px 16px 4px 16px;
}
.conpherence-widget-pane .person-entry {
float: left;
width: 270px;
clear: both;
padding: 10px 0px 0px 8px;
}
.conpherence-widget-pane .person-entry a {
float: left;
clear: none;
font-size: 14px;
font-weight: bold;
width: 166px;
}
.conpherence-widget-pane .person-entry .pic {
float: left;
clear: left;
margin: 0px 10px 0px 0px;
width: 50px;
padding: 0;
}
.conpherence-widget-pane .person-entry .remove {
float: right;
clear: right;
margin: 0;
width: 34px;
height: 36px;
text-align: center;
font-size: 22px;
font-weight: bold;
padding: 8px 0px 8px 0px;
}
.conpherence-widget-pane .person-entry .remove:hover {
text-decoration: none;
}
.conpherence-widget-pane .person-entry .remove .icon {
color: #bfbfbf;
}
.conpherence-widget-pane .person-entry .remove:hover .icon {
color: #18559d;
}
/* settings widget */
.conpherence-widget-pane .notifications-update {
margin: 2px 0px 0px 8px;
}

File Metadata

Mime Type
text/x-diff
Expires
Tue, Jul 29, 12:14 PM (3 w, 1 d ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
188598
Default Alt Text
(34 KB)

Event Timeline