Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F18743288
D16550.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
76 KB
Referenced Files
None
Subscribers
None
D16550.diff
View Options
diff --git a/resources/celerity/map.php b/resources/celerity/map.php
--- a/resources/celerity/map.php
+++ b/resources/celerity/map.php
@@ -7,8 +7,8 @@
*/
return array(
'names' => array(
- 'conpherence.pkg.css' => 'fdc05791',
- 'core.pkg.css' => '1ca373de',
+ 'conpherence.pkg.css' => '7bddd31a',
+ 'core.pkg.css' => 'dc6d08e3',
'core.pkg.js' => '1d376fa9',
'darkconsole.pkg.js' => 'e7393ebb',
'differential.pkg.css' => '3fb7f532',
@@ -19,7 +19,7 @@
'maniphest.pkg.js' => '949a7498',
'rsrc/css/aphront/aphront-bars.css' => '231ac33c',
'rsrc/css/aphront/dark-console.css' => 'f54bf286',
- 'rsrc/css/aphront/dialog-view.css' => '913c172e',
+ 'rsrc/css/aphront/dialog-view.css' => '593d3f67',
'rsrc/css/aphront/lightbox-attachment.css' => '7acac05d',
'rsrc/css/aphront/list-filter-view.css' => '5d6f0526',
'rsrc/css/aphront/multi-column.css' => 'fd18389d',
@@ -46,12 +46,13 @@
'rsrc/css/application/config/setup-issue.css' => 'f794cfc3',
'rsrc/css/application/config/unhandled-exception.css' => '4c96257a',
'rsrc/css/application/conpherence/durable-column.css' => '194ac487',
+ 'rsrc/css/application/conpherence/header-pane.css' => 'bdba8a5b',
'rsrc/css/application/conpherence/menu.css' => '8344d122',
- 'rsrc/css/application/conpherence/message-pane.css' => 'ee0e27be',
+ 'rsrc/css/application/conpherence/message-pane.css' => 'c075e8fe',
'rsrc/css/application/conpherence/notification.css' => '6cdcc253',
- 'rsrc/css/application/conpherence/transaction.css' => '2c71247c',
- 'rsrc/css/application/conpherence/update.css' => 'faf6be09',
- 'rsrc/css/application/conpherence/widget-pane.css' => 'a131d5b6',
+ 'rsrc/css/application/conpherence/transaction.css' => '46253e19',
+ 'rsrc/css/application/conpherence/update.css' => '53bc527a',
+ 'rsrc/css/application/conpherence/widget-pane.css' => '827a21f1',
'rsrc/css/application/contentsource/content-source-view.css' => '4b8b05d4',
'rsrc/css/application/countdown/timer.css' => '16c52f5c',
'rsrc/css/application/daemon/bulk-job.css' => 'df9c1d4a',
@@ -108,7 +109,7 @@
'rsrc/css/core/core.css' => 'd0801452',
'rsrc/css/core/remarkup.css' => 'cd912f2c',
'rsrc/css/core/syntax.css' => '769d3498',
- 'rsrc/css/core/z-index.css' => '2b01a823',
+ 'rsrc/css/core/z-index.css' => 'a847e919',
'rsrc/css/diviner/diviner-shared.css' => 'aa3656aa',
'rsrc/css/font/font-aleo.css' => '8bdb2835',
'rsrc/css/font/font-awesome.css' => '2b7ebbcc',
@@ -437,11 +438,11 @@
'rsrc/js/application/conpherence/ConpherenceThreadManager.js' => '01774ab2',
'rsrc/js/application/conpherence/behavior-drag-and-drop-photo.js' => 'cf86d16a',
'rsrc/js/application/conpherence/behavior-durable-column.js' => 'd3506890',
- 'rsrc/js/application/conpherence/behavior-menu.js' => '1d45c74d',
+ 'rsrc/js/application/conpherence/behavior-menu.js' => '7a2f5952',
+ 'rsrc/js/application/conpherence/behavior-participants-pane.js' => '08872fb7',
'rsrc/js/application/conpherence/behavior-pontificate.js' => '21ba5861',
'rsrc/js/application/conpherence/behavior-quicksand-blacklist.js' => '7927a7d3',
- 'rsrc/js/application/conpherence/behavior-toggle-widget.js' => 'b151bbbc',
- 'rsrc/js/application/conpherence/behavior-widget-pane.js' => '65845387',
+ 'rsrc/js/application/conpherence/behavior-toggle-widget.js' => '9bdbbab0',
'rsrc/js/application/countdown/timer.js' => 'e4cc26b3',
'rsrc/js/application/daemon/behavior-bulk-job-reload.js' => 'edf8a145',
'rsrc/js/application/dashboard/behavior-dashboard-async-panel.js' => '469c0d9e',
@@ -601,7 +602,7 @@
'almanac-css' => 'dbb9b3af',
'aphront-bars' => '231ac33c',
'aphront-dark-console-css' => 'f54bf286',
- 'aphront-dialog-view-css' => '913c172e',
+ 'aphront-dialog-view-css' => '593d3f67',
'aphront-list-filter-view-css' => '5d6f0526',
'aphront-multi-column-view-css' => 'fd18389d',
'aphront-panel-view-css' => '8427b78d',
@@ -617,13 +618,14 @@
'config-options-css' => '0ede4c9b',
'config-page-css' => '8798e14f',
'conpherence-durable-column-view' => '194ac487',
+ 'conpherence-header-pane-css' => 'bdba8a5b',
'conpherence-menu-css' => '8344d122',
- 'conpherence-message-pane-css' => 'ee0e27be',
+ 'conpherence-message-pane-css' => 'c075e8fe',
'conpherence-notification-css' => '6cdcc253',
'conpherence-thread-manager' => '01774ab2',
- 'conpherence-transaction-css' => '2c71247c',
- 'conpherence-update-css' => 'faf6be09',
- 'conpherence-widget-pane-css' => 'a131d5b6',
+ 'conpherence-transaction-css' => '46253e19',
+ 'conpherence-update-css' => '53bc527a',
+ 'conpherence-widget-pane-css' => '827a21f1',
'd3' => 'a11a5ff2',
'differential-changeset-view-css' => '9ef7d354',
'differential-core-view-css' => '5b7b8ff4',
@@ -665,9 +667,9 @@
'javelin-behavior-comment-actions' => '0300eae6',
'javelin-behavior-config-reorder-fields' => 'b6993408',
'javelin-behavior-conpherence-drag-and-drop-photo' => 'cf86d16a',
- 'javelin-behavior-conpherence-menu' => '1d45c74d',
+ 'javelin-behavior-conpherence-menu' => '7a2f5952',
+ 'javelin-behavior-conpherence-participants-pane' => '08872fb7',
'javelin-behavior-conpherence-pontificate' => '21ba5861',
- 'javelin-behavior-conpherence-widget-pane' => '65845387',
'javelin-behavior-countdown-timer' => 'e4cc26b3',
'javelin-behavior-dark-console' => 'f411b6ae',
'javelin-behavior-dashboard-async-panel' => '469c0d9e',
@@ -773,7 +775,7 @@
'javelin-behavior-test-payment-form' => 'fc91ab6c',
'javelin-behavior-time-typeahead' => '522431f7',
'javelin-behavior-toggle-class' => '92b9ec77',
- 'javelin-behavior-toggle-widget' => 'b151bbbc',
+ 'javelin-behavior-toggle-widget' => '9bdbbab0',
'javelin-behavior-typeahead-browse' => '635de1ec',
'javelin-behavior-typeahead-search' => '93d0c9e3',
'javelin-behavior-view-placeholder' => '47830651',
@@ -881,7 +883,7 @@
'phabricator-uiexample-reactor-select' => 'a155550f',
'phabricator-uiexample-reactor-sendclass' => '1def2711',
'phabricator-uiexample-reactor-sendproperties' => 'b1f0ccee',
- 'phabricator-zindex-css' => '2b01a823',
+ 'phabricator-zindex-css' => 'a847e919',
'phame-css' => '8efb0729',
'pholio-css' => 'ca89d380',
'pholio-edit-css' => '07676f51',
@@ -1057,6 +1059,15 @@
'javelin-stratcom',
'javelin-vector',
),
+ '08872fb7' => array(
+ 'javelin-behavior',
+ 'javelin-dom',
+ 'javelin-stratcom',
+ 'javelin-workflow',
+ 'javelin-util',
+ 'phabricator-notification',
+ 'conpherence-thread-manager',
+ ),
'0a0b10e9' => array(
'javelin-behavior',
'javelin-stratcom',
@@ -1135,20 +1146,6 @@
'javelin-request',
'javelin-uri',
),
- '1d45c74d' => array(
- 'javelin-behavior',
- 'javelin-dom',
- 'javelin-util',
- 'javelin-stratcom',
- 'javelin-workflow',
- 'javelin-behavior-device',
- 'javelin-history',
- 'javelin-vector',
- 'javelin-scrollbar',
- 'phabricator-title',
- 'phabricator-shaped-request',
- 'conpherence-thread-manager',
- ),
'1def2711' => array(
'javelin-install',
'javelin-dom',
@@ -1484,19 +1481,6 @@
'javelin-request',
'javelin-workflow',
),
- 65845387 => array(
- 'javelin-behavior',
- 'javelin-dom',
- 'javelin-stratcom',
- 'javelin-workflow',
- 'javelin-util',
- 'phabricator-notification',
- 'javelin-behavior-device',
- 'phuix-dropdown-menu',
- 'phuix-action-list-view',
- 'phuix-action-view',
- 'conpherence-thread-manager',
- ),
'680ea2c8' => array(
'javelin-install',
'javelin-dom',
@@ -1587,6 +1571,20 @@
'javelin-behavior',
'javelin-quicksand',
),
+ '7a2f5952' => array(
+ 'javelin-behavior',
+ 'javelin-dom',
+ 'javelin-util',
+ 'javelin-stratcom',
+ 'javelin-workflow',
+ 'javelin-behavior-device',
+ 'javelin-history',
+ 'javelin-vector',
+ 'javelin-scrollbar',
+ 'phabricator-title',
+ 'phabricator-shaped-request',
+ 'conpherence-thread-manager',
+ ),
'7a68dda3' => array(
'owners-path-editor',
'javelin-behavior',
@@ -1755,6 +1753,13 @@
'phabricator-phtize',
'changeset-view-manager',
),
+ '9bdbbab0' => array(
+ 'javelin-behavior',
+ 'javelin-dom',
+ 'javelin-util',
+ 'javelin-workflow',
+ 'javelin-stratcom',
+ ),
'9ef7d354' => array(
'phui-inline-comment-view-css',
),
@@ -1850,13 +1855,6 @@
'javelin-util',
'phabricator-shaped-request',
),
- 'b151bbbc' => array(
- 'javelin-behavior',
- 'javelin-dom',
- 'javelin-util',
- 'javelin-workflow',
- 'javelin-stratcom',
- ),
'b1f0ccee' => array(
'javelin-install',
'javelin-dom',
@@ -2311,6 +2309,7 @@
'conpherence-transaction-css',
'conpherence-update-css',
'conpherence-widget-pane-css',
+ 'conpherence-header-pane-css',
),
'core.pkg.css' => array(
'phabricator-core-css',
diff --git a/resources/celerity/packages.php b/resources/celerity/packages.php
--- a/resources/celerity/packages.php
+++ b/resources/celerity/packages.php
@@ -159,6 +159,7 @@
'conpherence-transaction-css',
'conpherence-update-css',
'conpherence-widget-pane-css',
+ 'conpherence-header-pane-css',
),
'differential.pkg.css' => array(
'differential-core-view-css',
diff --git a/resources/sql/autopatches/20160913.conpherence.topic.1.sql b/resources/sql/autopatches/20160913.conpherence.topic.1.sql
new file mode 100644
--- /dev/null
+++ b/resources/sql/autopatches/20160913.conpherence.topic.1.sql
@@ -0,0 +1,2 @@
+ALTER TABLE {$NAMESPACE}_conpherence.conpherence_thread
+ ADD topic VARCHAR(255) NOT NULL COLLATE {$COLLATE_TEXT};
diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php
--- a/src/__phutil_library_map__.php
+++ b/src/__phutil_library_map__.php
@@ -300,10 +300,11 @@
'ConpherenceNewRoomController' => 'applications/conpherence/controller/ConpherenceNewRoomController.php',
'ConpherenceNotificationPanelController' => 'applications/conpherence/controller/ConpherenceNotificationPanelController.php',
'ConpherenceParticipant' => 'applications/conpherence/storage/ConpherenceParticipant.php',
+ 'ConpherenceParticipantController' => 'applications/conpherence/controller/ConpherenceParticipantController.php',
'ConpherenceParticipantCountQuery' => 'applications/conpherence/query/ConpherenceParticipantCountQuery.php',
'ConpherenceParticipantQuery' => 'applications/conpherence/query/ConpherenceParticipantQuery.php',
+ 'ConpherenceParticipantView' => 'applications/conpherence/view/ConpherenceParticipantView.php',
'ConpherenceParticipationStatus' => 'applications/conpherence/constants/ConpherenceParticipationStatus.php',
- 'ConpherencePeopleWidgetView' => 'applications/conpherence/view/ConpherencePeopleWidgetView.php',
'ConpherencePicCropControl' => 'applications/conpherence/view/ConpherencePicCropControl.php',
'ConpherenceQueryThreadConduitAPIMethod' => 'applications/conpherence/conduit/ConpherenceQueryThreadConduitAPIMethod.php',
'ConpherenceQueryTransactionConduitAPIMethod' => 'applications/conpherence/conduit/ConpherenceQueryTransactionConduitAPIMethod.php',
@@ -329,9 +330,6 @@
'ConpherenceUpdateController' => 'applications/conpherence/controller/ConpherenceUpdateController.php',
'ConpherenceUpdateThreadConduitAPIMethod' => 'applications/conpherence/conduit/ConpherenceUpdateThreadConduitAPIMethod.php',
'ConpherenceViewController' => 'applications/conpherence/controller/ConpherenceViewController.php',
- 'ConpherenceWidgetConfigConstants' => 'applications/conpherence/constants/ConpherenceWidgetConfigConstants.php',
- 'ConpherenceWidgetController' => 'applications/conpherence/controller/ConpherenceWidgetController.php',
- 'ConpherenceWidgetView' => 'applications/conpherence/view/ConpherenceWidgetView.php',
'DarkConsoleController' => 'applications/console/controller/DarkConsoleController.php',
'DarkConsoleCore' => 'applications/console/core/DarkConsoleCore.php',
'DarkConsoleDataController' => 'applications/console/controller/DarkConsoleDataController.php',
@@ -4768,10 +4766,11 @@
'ConpherenceNewRoomController' => 'ConpherenceController',
'ConpherenceNotificationPanelController' => 'ConpherenceController',
'ConpherenceParticipant' => 'ConpherenceDAO',
+ 'ConpherenceParticipantController' => 'ConpherenceController',
'ConpherenceParticipantCountQuery' => 'PhabricatorOffsetPagedQuery',
'ConpherenceParticipantQuery' => 'PhabricatorOffsetPagedQuery',
+ 'ConpherenceParticipantView' => 'AphrontView',
'ConpherenceParticipationStatus' => 'ConpherenceConstants',
- 'ConpherencePeopleWidgetView' => 'ConpherenceWidgetView',
'ConpherencePicCropControl' => 'AphrontFormControl',
'ConpherenceQueryThreadConduitAPIMethod' => 'ConpherenceConduitAPIMethod',
'ConpherenceQueryTransactionConduitAPIMethod' => 'ConpherenceConduitAPIMethod',
@@ -4803,9 +4802,6 @@
'ConpherenceUpdateController' => 'ConpherenceController',
'ConpherenceUpdateThreadConduitAPIMethod' => 'ConpherenceConduitAPIMethod',
'ConpherenceViewController' => 'ConpherenceController',
- 'ConpherenceWidgetConfigConstants' => 'ConpherenceConstants',
- 'ConpherenceWidgetController' => 'ConpherenceController',
- 'ConpherenceWidgetView' => 'AphrontView',
'DarkConsoleController' => 'PhabricatorController',
'DarkConsoleCore' => 'Phobject',
'DarkConsoleDataController' => 'PhabricatorController',
diff --git a/src/applications/conpherence/application/PhabricatorConpherenceApplication.php b/src/applications/conpherence/application/PhabricatorConpherenceApplication.php
--- a/src/applications/conpherence/application/PhabricatorConpherenceApplication.php
+++ b/src/applications/conpherence/application/PhabricatorConpherenceApplication.php
@@ -42,7 +42,7 @@
'search/(?:query/(?P<queryKey>[^/]+)/)?'
=> 'ConpherenceRoomListController',
'panel/' => 'ConpherenceNotificationPanelController',
- 'widget/(?P<id>[1-9]\d*)/' => 'ConpherenceWidgetController',
+ 'participant/(?P<id>[1-9]\d*)/' => 'ConpherenceParticipantController',
'update/(?P<id>[1-9]\d*)/' => 'ConpherenceUpdateController',
),
);
diff --git a/src/applications/conpherence/conduit/ConpherenceCreateThreadConduitAPIMethod.php b/src/applications/conpherence/conduit/ConpherenceCreateThreadConduitAPIMethod.php
--- a/src/applications/conpherence/conduit/ConpherenceCreateThreadConduitAPIMethod.php
+++ b/src/applications/conpherence/conduit/ConpherenceCreateThreadConduitAPIMethod.php
@@ -13,8 +13,9 @@
protected function defineParamTypes() {
return array(
- 'title' => 'optional string',
- 'message' => 'required string',
+ 'title' => 'required string',
+ 'topic' => 'optional string',
+ 'message' => 'optional string',
'participantPHIDs' => 'required list<phids>',
);
}
@@ -27,8 +28,8 @@
return array(
'ERR_EMPTY_PARTICIPANT_PHIDS' => pht(
'You must specify participant phids.'),
- 'ERR_EMPTY_MESSAGE' => pht(
- 'You must specify a message.'),
+ 'ERR_EMPTY_TITLE' => pht(
+ 'You must specify a title.'),
);
}
@@ -36,19 +37,21 @@
$participant_phids = $request->getValue('participantPHIDs', array());
$message = $request->getValue('message');
$title = $request->getValue('title');
+ $topic = $request->getValue('topic');
list($errors, $conpherence) = ConpherenceEditor::createThread(
$request->getUser(),
$participant_phids,
$title,
$message,
- $request->newContentSource());
+ $request->newContentSource(),
+ $topic);
if ($errors) {
foreach ($errors as $error_code) {
switch ($error_code) {
- case ConpherenceEditor::ERROR_EMPTY_MESSAGE:
- throw new ConduitException('ERR_EMPTY_MESSAGE');
+ case ConpherenceEditor::ERROR_EMPTY_TITLE:
+ throw new ConduitException('ERR_EMPTY_TITLE');
break;
case ConpherenceEditor::ERROR_EMPTY_PARTICIPANTS:
throw new ConduitException('ERR_EMPTY_PARTICIPANT_PHIDS');
diff --git a/src/applications/conpherence/constants/ConpherenceWidgetConfigConstants.php b/src/applications/conpherence/constants/ConpherenceWidgetConfigConstants.php
deleted file mode 100644
--- a/src/applications/conpherence/constants/ConpherenceWidgetConfigConstants.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-
-final class ConpherenceWidgetConfigConstants extends ConpherenceConstants {
-
- const UPDATE_URI = '/conpherence/update/';
-
- public static function getWidgetPaneBehaviorConfig() {
- return array(
- 'widgetBaseUpdateURI' => self::UPDATE_URI,
- 'widgetRegistry' => self::getWidgetRegistry(),
- );
- }
-
- public static function getWidgetRegistry() {
- return array(
- 'conpherence-message-pane' => array(
- 'name' => pht('Thread'),
- 'icon' => 'fa-comment',
- 'deviceOnly' => true,
- 'hasCreate' => false,
- ),
- 'widgets-people' => array(
- 'name' => pht('Participants'),
- 'icon' => 'fa-users',
- 'deviceOnly' => false,
- 'hasCreate' => true,
- 'createData' => array(
- 'refreshFromResponse' => true,
- 'action' => ConpherenceUpdateActions::ADD_PERSON,
- 'customHref' => null,
- ),
- ),
- 'widgets-settings' => array(
- 'name' => pht('Notifications'),
- 'icon' => 'fa-wrench',
- 'deviceOnly' => false,
- 'hasCreate' => false,
- ),
- );
- }
-
-}
diff --git a/src/applications/conpherence/controller/ConpherenceController.php b/src/applications/conpherence/controller/ConpherenceController.php
--- a/src/applications/conpherence/controller/ConpherenceController.php
+++ b/src/applications/conpherence/controller/ConpherenceController.php
@@ -14,81 +14,78 @@
public function buildApplicationMenu() {
$nav = new PHUIListView();
+ $conpherence = $this->conpherence;
+ // Local Links
+ if ($conpherence) {
+ $nav->addMenuItem(
+ id(new PHUIListItemView())
+ ->setName(pht('Edit Room'))
+ ->setType(PHUIListItemView::TYPE_LINK)
+ ->setHref(
+ $this->getApplicationURI('update/'.$conpherence->getID()).'/')
+ ->setWorkflow(true));
+
+ $nav->addMenuItem(
+ id(new PHUIListItemView())
+ ->setName(pht('Add Participants'))
+ ->setType(PHUIListItemView::TYPE_LINK)
+ ->setHref('#')
+ ->addSigil('conpherence-widget-adder')
+ ->setMetadata(array('widget' => 'widgets-people')));
+ }
+
+ // Global Links
+ $nav->newLabel(pht('Conpherence'));
$nav->newLink(
pht('New Room'),
$this->getApplicationURI('new/'));
-
- $nav->addMenuItem(
- id(new PHUIListItemView())
- ->setName(pht('Add Participants'))
- ->setType(PHUIListItemView::TYPE_LINK)
- ->setHref('#')
- ->addSigil('conpherence-widget-adder')
- ->setMetadata(array('widget' => 'widgets-people')));
+ $nav->newLink(
+ pht('Search Rooms'),
+ $this->getApplicationURI('search/'));
return $nav;
}
- protected function buildApplicationCrumbs() {
- return $this->buildConpherenceApplicationCrumbs();
- }
-
- protected function buildConpherenceApplicationCrumbs($is_rooms = false) {
- $crumbs = parent::buildApplicationCrumbs();
- $crumbs->setBorder(true);
-
- if (!$is_rooms) {
- $crumbs
- ->addAction(
- id(new PHUIListItemView())
- ->setName(pht('Room'))
- ->setHref('#')
- ->setIcon('fa-bars')
- ->setStyle('display: none;')
- ->addClass('device-widgets-selector')
- ->addSigil('device-widgets-selector'));
- }
- return $crumbs;
- }
-
protected function buildHeaderPaneContent(
ConpherenceThread $conpherence,
array $policy_objects) {
assert_instances_of($policy_objects, 'PhabricatorPolicy');
$viewer = $this->getViewer();
-
- $crumbs = $this->buildApplicationCrumbs();
+ $header = null;
if ($conpherence->getID()) {
$data = $conpherence->getDisplayData($this->getViewer());
- $crumbs->addCrumb(
- id(new PHUICrumbView())
- ->setName($data['title'])
- ->setHref('/'.$conpherence->getMonogram()));
- $can_edit = PhabricatorPolicyFilter::hasCapability(
+ $header = id(new PHUIHeaderView())
+ ->setHeader($data['title'])
+ ->setSubheader($data['topic'])
+ ->addClass((!$data['topic']) ? 'conpherence-no-topic' : null);
+
+ $can_edit = PhabricatorPolicyFilter::hasCapability(
$viewer,
$conpherence,
PhabricatorPolicyCapability::CAN_EDIT);
- $crumbs
- ->addAction(
- id(new PHUIListItemView())
- ->setName(pht('Edit Room'))
+ $header->addActionItem(
+ id(new PHUIIconCircleView())
->setHref(
$this->getApplicationURI('update/'.$conpherence->getID()).'/')
->setIcon('fa-pencil')
- ->setDisabled(!$can_edit)
+ ->addClass('hide-on-device')
+ ->setWorkflow(true));
+
+ $header->addActionItem(
+ id(new PHUIIconCircleView())
+ ->setHref(
+ $this->getApplicationURI('update/'.$conpherence->getID()).'/'.
+ '?action='.ConpherenceUpdateActions::NOTIFICATIONS)
+ ->setIcon('fa-gear')
+ ->addClass('hide-on-device')
->setWorkflow(true));
$widget_key = PhabricatorConpherenceWidgetVisibleSetting::SETTINGKEY;
$widget_view = (bool)$viewer->getUserSetting($widget_key, false);
- $divider = id(new PHUIListItemView())
- ->setType(PHUIListItemView::TYPE_DIVIDER)
- ->addClass('conpherence-header-desktop-item');
- $crumbs->addAction($divider);
-
Javelin::initBehavior(
'toggle-widget',
array(
@@ -96,24 +93,15 @@
'settingsURI' => '/settings/adjust/?key='.$widget_key,
));
- $crumbs->addAction(
- id(new PHUIListItemView())
- ->addSigil('conpherence-widget-toggle')
- ->setIcon('fa-columns')
- ->addClass('conpherence-header-desktop-item'));
+ $header->addActionItem(
+ id(new PHUIIconCircleView())
+ ->addSigil('conpherence-widget-toggle')
+ ->setIcon('fa-group')
+ ->setHref('#')
+ ->addClass('conpherence-participant-toggle'));
}
- return hsprintf(
- '%s',
- array(
- phutil_tag(
- 'div',
- array(
- 'class' => 'header-loading-mask',
- ),
- ''),
- $crumbs,
- ));
+ return $header;
}
}
diff --git a/src/applications/conpherence/controller/ConpherenceNewRoomController.php b/src/applications/conpherence/controller/ConpherenceNewRoomController.php
--- a/src/applications/conpherence/controller/ConpherenceNewRoomController.php
+++ b/src/applications/conpherence/controller/ConpherenceNewRoomController.php
@@ -27,6 +27,9 @@
->setTransactionType(ConpherenceTransaction::TYPE_TITLE)
->setNewValue($request->getStr('title'));
$xactions[] = id(new ConpherenceTransaction())
+ ->setTransactionType(ConpherenceTransaction::TYPE_TOPIC)
+ ->setNewValue($request->getStr('topic'));
+ $xactions[] = id(new ConpherenceTransaction())
->setTransactionType(PhabricatorTransactions::TYPE_VIEW_POLICY)
->setNewValue($request->getStr('viewPolicy'));
$xactions[] = id(new ConpherenceTransaction())
@@ -94,6 +97,11 @@
->setName('title')
->setValue($request->getStr('title')))
->appendChild(
+ id(new AphrontFormTextControl())
+ ->setLabel(pht('Topic'))
+ ->setName('topic')
+ ->setValue($request->getStr('topic')))
+ ->appendChild(
id(new AphrontFormTokenizerControl())
->setName('participants')
->setUser($user)
diff --git a/src/applications/conpherence/controller/ConpherenceParticipantController.php b/src/applications/conpherence/controller/ConpherenceParticipantController.php
new file mode 100644
--- /dev/null
+++ b/src/applications/conpherence/controller/ConpherenceParticipantController.php
@@ -0,0 +1,73 @@
+<?php
+
+final class ConpherenceParticipantController extends ConpherenceController {
+
+ public function shouldAllowPublic() {
+ return true;
+ }
+
+ public function handleRequest(AphrontRequest $request) {
+ $viewer = $request->getViewer();
+
+ $conpherence_id = $request->getURIData('id');
+ if (!$conpherence_id) {
+ return new Aphront404Response();
+ }
+ $conpherence = id(new ConpherenceThreadQuery())
+ ->setViewer($viewer)
+ ->withIDs(array($conpherence_id))
+ ->needWidgetData(true)
+ ->executeOne();
+ if (!$conpherence) {
+ return new Aphront404Response();
+ }
+ $this->setConpherence($conpherence);
+ $content = $this->renderParticipantPaneContent();
+
+ return id(new AphrontAjaxResponse())->setContent($content);
+ }
+
+ private function renderParticipantPaneContent() {
+ $conpherence = $this->getConpherence();
+
+ $widgets = array();
+ $new_icon = id(new PHUIIconView())
+ ->setIcon('fa-plus-square')
+ ->setHref($this->getUpdateURI())
+ ->setMetadata(array('widget' => null))
+ ->addSigil('conpherence-widget-adder');
+
+ $content = id(new ConpherenceParticipantView())
+ ->setUser($this->getViewer())
+ ->setConpherence($this->getConpherence())
+ ->setUpdateURI($this->getUpdateURI());
+
+ $widgets[] = phutil_tag(
+ 'div',
+ array(
+ 'class' => 'widgets-header',
+ ),
+ id(new PHUIHeaderView())
+ ->setHeader(pht('Participants'))
+ ->addActionItem($new_icon));
+
+ $widgets[] = javelin_tag(
+ 'div',
+ array(
+ 'class' => 'widgets-body',
+ 'id' => 'widgets-people',
+ 'sigil' => 'widgets-people',
+ ),
+ $content);
+
+ // without this implosion we get "," between each element in our widgets
+ // array
+ return array('widgets' => phutil_implode_html('', $widgets));
+ }
+
+ private function getUpdateURI() {
+ $conpherence = $this->getConpherence();
+ return $this->getApplicationURI('update/'.$conpherence->getID().'/');
+ }
+
+}
diff --git a/src/applications/conpherence/controller/ConpherenceRoomListController.php b/src/applications/conpherence/controller/ConpherenceRoomListController.php
--- a/src/applications/conpherence/controller/ConpherenceRoomListController.php
+++ b/src/applications/conpherence/controller/ConpherenceRoomListController.php
@@ -18,10 +18,6 @@
return $this->delegateToController($controller);
}
- protected function buildApplicationCrumbs() {
- return $this->buildConpherenceApplicationCrumbs($is_rooms = true);
- }
-
public function buildApplicationMenu() {
return $this->buildRoomsSideNavView(true)->getMenu();
}
diff --git a/src/applications/conpherence/controller/ConpherenceUpdateController.php b/src/applications/conpherence/controller/ConpherenceUpdateController.php
--- a/src/applications/conpherence/controller/ConpherenceUpdateController.php
+++ b/src/applications/conpherence/controller/ConpherenceUpdateController.php
@@ -107,7 +107,7 @@
break;
case ConpherenceUpdateActions::REMOVE_PERSON:
if (!$request->isContinueRequest()) {
- // do nothing; we'll display a confirmation dialogue instead
+ // do nothing; we'll display a confirmation dialog instead
break;
}
$person_phid = $request->getStr('remove_person');
@@ -127,22 +127,16 @@
}
$participant->setSettings(array('notifications' => $notifications));
$participant->save();
+ return id(new AphrontRedirectResponse())
+ ->setURI('/'.$conpherence->getMonogram());
- $label = PhabricatorConpherenceNotificationsSetting::getSettingLabel(
- $notifications);
-
- $result = pht(
- 'Updated notification settings to "%s".',
- $label);
-
- return id(new AphrontAjaxResponse())
- ->setContent($result);
break;
case ConpherenceUpdateActions::METADATA:
$top = $request->getInt('image_y');
$left = $request->getInt('image_x');
$file_id = $request->getInt('file_id');
$title = $request->getStr('title');
+ $topic = $request->getStr('topic');
if ($file_id) {
$orig_file = id(new PhabricatorFileQuery())
->setViewer($user)
@@ -190,10 +184,14 @@
->setNewValue($image_phid);
}
$title = $request->getStr('title');
+ $topic = $request->getStr('topic');
$xactions[] = id(new ConpherenceTransaction())
->setTransactionType(ConpherenceTransaction::TYPE_TITLE)
->setNewValue($title);
$xactions[] = id(new ConpherenceTransaction())
+ ->setTransactionType(ConpherenceTransaction::TYPE_TOPIC)
+ ->setNewValue($topic);
+ $xactions[] = id(new ConpherenceTransaction())
->setTransactionType(PhabricatorTransactions::TYPE_VIEW_POLICY)
->setNewValue($request->getStr('viewPolicy'));
$xactions[] = id(new ConpherenceTransaction())
@@ -269,29 +267,97 @@
}
switch ($action) {
+ case ConpherenceUpdateActions::NOTIFICATIONS:
+ $dialog = $this->renderPreferencesDialog($conpherence);
+ break;
case ConpherenceUpdateActions::ADD_PERSON:
- $dialogue = $this->renderAddPersonDialogue($conpherence);
+ $dialog = $this->renderAddPersonDialog($conpherence);
break;
case ConpherenceUpdateActions::REMOVE_PERSON:
- $dialogue = $this->renderRemovePersonDialogue($conpherence);
+ $dialog = $this->renderRemovePersonDialog($conpherence);
break;
case ConpherenceUpdateActions::METADATA:
default:
- $dialogue = $this->renderMetadataDialogue($conpherence, $error_view);
+ $dialog = $this->renderMetadataDialog($conpherence, $error_view);
break;
}
- return id(new AphrontDialogResponse())
- ->setDialog($dialogue
+ return
+ $dialog
->setUser($user)
->setWidth(AphrontDialogView::WIDTH_FORM)
->setSubmitURI($this->getApplicationURI('update/'.$conpherence_id.'/'))
->addSubmitButton()
- ->addCancelButton($this->getApplicationURI($conpherence->getID().'/')));
+ ->addCancelButton($this->getApplicationURI($conpherence->getID().'/'));
}
- private function renderAddPersonDialogue(
+ private function renderPreferencesDialog(
+ ConpherenceThread $conpherence) {
+
+ $request = $this->getRequest();
+ $user = $request->getUser();
+
+ $participant = $conpherence->getParticipantIfExists($user->getPHID());
+ if (!$participant) {
+ $can_join = PhabricatorPolicyFilter::hasCapability(
+ $user,
+ $conpherence,
+ PhabricatorPolicyCapability::CAN_JOIN);
+ if ($can_join) {
+ $text = pht(
+ 'Notification settings are available after joining the room.');
+ } else if ($user->isLoggedIn()) {
+ $text = pht(
+ 'Notification settings not applicable to rooms you can not join.');
+ } else {
+ $text = pht(
+ 'Notification settings are available after logging in and joining '.
+ 'the room.');
+ }
+ return id(new AphrontDialogView())
+ ->setTitle(pht('Room Preferences'))
+ ->appendParagraph($text);
+ }
+
+ $notification_key = PhabricatorConpherenceNotificationsSetting::SETTINGKEY;
+ $notification_default = $user->getUserSetting($notification_key);
+
+ $settings = $participant->getSettings();
+ $notifications = idx(
+ $settings,
+ 'notifications',
+ $notification_default);
+
+ $form = id(new AphrontFormView())
+ ->setUser($user)
+ ->setFullWidth(true)
+ ->appendControl(
+ id(new AphrontFormRadioButtonControl())
+ ->addButton(
+ PhabricatorConpherenceNotificationsSetting::VALUE_CONPHERENCE_EMAIL,
+ PhabricatorConpherenceNotificationsSetting::getSettingLabel(
+ PhabricatorConpherenceNotificationsSetting::VALUE_CONPHERENCE_EMAIL),
+ '')
+ ->addButton(
+ PhabricatorConpherenceNotificationsSetting::VALUE_CONPHERENCE_NOTIFY,
+ PhabricatorConpherenceNotificationsSetting::getSettingLabel(
+ PhabricatorConpherenceNotificationsSetting::VALUE_CONPHERENCE_NOTIFY),
+ '')
+ ->setName('notifications')
+ ->setValue($notifications));
+
+ return id(new AphrontDialogView())
+ ->setTitle(pht('Room Preferences'))
+ ->addHiddenInput('action', 'notifications')
+ ->addHiddenInput(
+ 'latest_transaction_id',
+ $request->getInt('latest_transaction_id'))
+ ->appendForm($form);
+
+ }
+
+ private function renderAddPersonDialog(
ConpherenceThread $conpherence) {
$request = $this->getRequest();
@@ -322,7 +388,7 @@
return $view;
}
- private function renderRemovePersonDialogue(
+ private function renderRemovePersonDialog(
ConpherenceThread $conpherence) {
$request = $this->getRequest();
@@ -405,7 +471,7 @@
return $dialog;
}
- private function renderMetadataDialogue(
+ private function renderMetadataDialog(
ConpherenceThread $conpherence,
$error_view) {
@@ -419,7 +485,12 @@
id(new AphrontFormTextControl())
->setLabel(pht('Title'))
->setName('title')
- ->setValue($conpherence->getTitle()));
+ ->setValue($conpherence->getTitle()))
+ ->appendChild(
+ id(new AphrontFormTextControl())
+ ->setLabel(pht('Topic'))
+ ->setName('topic')
+ ->setValue($conpherence->getTopic()));
$nopic = $this->getRequest()->getExists('nopic');
$image = $conpherence->getImage(ConpherenceImageData::SIZE_ORIG);
@@ -548,11 +619,10 @@
$rendered_transactions = idx($data, 'transactions');
$new_latest_transaction_id = idx($data, 'latest_transaction_id');
- $widget_uri = $this->getApplicationURI('update/'.$conpherence->getID().'/');
+ $update_uri = $this->getApplicationURI('update/'.$conpherence->getID().'/');
$nav_item = null;
$header = null;
$people_widget = null;
- $file_widget = null;
if (!$minimal_display) {
switch ($action) {
case ConpherenceUpdateActions::METADATA:
@@ -571,10 +641,10 @@
$nav_item = hsprintf('%s', $nav_item);
break;
case ConpherenceUpdateActions::ADD_PERSON:
- $people_widget = id(new ConpherencePeopleWidgetView())
+ $people_widget = id(new ConpherenceParticipantView())
->setUser($user)
->setConpherence($conpherence)
- ->setUpdateURI($widget_uri);
+ ->setUpdateURI($update_uri);
$people_widget = hsprintf('%s', $people_widget->render());
break;
case ConpherenceUpdateActions::REMOVE_PERSON:
@@ -595,7 +665,6 @@
'nav_item' => $nav_item,
'conpherence_phid' => $conpherence->getPHID(),
'header' => $header,
- 'file_widget' => $file_widget,
'people_widget' => $people_widget,
'aphlictDropdownData' => array(
$dropdown_query->getNotificationData(),
diff --git a/src/applications/conpherence/controller/ConpherenceWidgetController.php b/src/applications/conpherence/controller/ConpherenceWidgetController.php
deleted file mode 100644
--- a/src/applications/conpherence/controller/ConpherenceWidgetController.php
+++ /dev/null
@@ -1,181 +0,0 @@
-<?php
-
-final class ConpherenceWidgetController extends ConpherenceController {
-
- public function shouldAllowPublic() {
- return true;
- }
-
- public function handleRequest(AphrontRequest $request) {
- $request = $this->getRequest();
- $user = $request->getUser();
-
- $conpherence_id = $request->getURIData('id');
- if (!$conpherence_id) {
- return new Aphront404Response();
- }
- $conpherence = id(new ConpherenceThreadQuery())
- ->setViewer($user)
- ->withIDs(array($conpherence_id))
- ->needWidgetData(true)
- ->executeOne();
- if (!$conpherence) {
- return new Aphront404Response();
- }
- $this->setConpherence($conpherence);
-
- switch ($request->getStr('widget')) {
- case 'widgets-people':
- $content = $this->renderPeopleWidgetPaneContent();
- break;
- case 'widgets-settings':
- $content = $this->renderSettingsWidgetPaneContent();
- break;
- default:
- $widgets = $this->renderWidgetPaneContent();
- $content = $widgets;
- break;
- }
- return id(new AphrontAjaxResponse())->setContent($content);
- }
-
- private function renderWidgetPaneContent() {
- $conpherence = $this->getConpherence();
-
- $widgets = array();
- $new_icon = id(new PHUIIconView())
- ->setIcon('fa-plus')
- ->setHref($this->getWidgetURI())
- ->setMetadata(array('widget' => null))
- ->addSigil('conpherence-widget-adder');
- $header = javelin_tag(
- 'a',
- array(
- 'href' => '#',
- 'sigil' => 'widgets-selector',
- ),
- pht('Participants'));
-
- $widgets[] = phutil_tag(
- 'div',
- array(
- 'class' => 'widgets-header',
- ),
- id(new PHUIHeaderView())
- ->setHeader($header)
- ->addActionItem($new_icon));
- $user = $this->getRequest()->getUser();
- // now the widget bodies
- $widgets[] = javelin_tag(
- 'div',
- array(
- 'class' => 'widgets-body',
- 'id' => 'widgets-people',
- 'sigil' => 'widgets-people',
- ),
- $this->renderPeopleWidgetPaneContent());
- $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 renderPeopleWidgetPaneContent() {
- return id(new ConpherencePeopleWidgetView())
- ->setUser($this->getViewer())
- ->setConpherence($this->getConpherence())
- ->setUpdateURI($this->getWidgetURI());
- }
-
-
- private function renderSettingsWidgetPaneContent() {
- $viewer = $this->getViewer();
- $conpherence = $this->getConpherence();
- $participant = $conpherence->getParticipantIfExists($viewer->getPHID());
- if (!$participant) {
- $can_join = PhabricatorPolicyFilter::hasCapability(
- $viewer,
- $conpherence,
- PhabricatorPolicyCapability::CAN_JOIN);
- if ($can_join) {
- $text = pht(
- 'Notification settings are available after joining the room.');
- } else if ($viewer->isLoggedIn()) {
- $text = pht(
- 'Notification settings not applicable to rooms you can not join.');
- } else {
- $text = pht(
- 'Notification settings are available after logging in and joining '.
- 'the room.');
- }
- return phutil_tag(
- 'div',
- array(
- 'class' => 'no-settings',
- ),
- $text);
- }
- $notification_key = PhabricatorConpherenceNotificationsSetting::SETTINGKEY;
- $notification_default = $viewer->getUserSetting($notification_key);
-
- $settings = $participant->getSettings();
- $notifications = idx(
- $settings,
- 'notifications',
- $notification_default);
- $options = id(new AphrontFormRadioButtonControl())
- ->addButton(
- PhabricatorConpherenceNotificationsSetting::VALUE_CONPHERENCE_EMAIL,
- PhabricatorConpherenceNotificationsSetting::getSettingLabel(
- PhabricatorConpherenceNotificationsSetting::VALUE_CONPHERENCE_EMAIL),
- '')
- ->addButton(
- PhabricatorConpherenceNotificationsSetting::VALUE_CONPHERENCE_NOTIFY,
- PhabricatorConpherenceNotificationsSetting::getSettingLabel(
- PhabricatorConpherenceNotificationsSetting::VALUE_CONPHERENCE_NOTIFY),
- '')
- ->setName('notifications')
- ->setValue($notifications);
-
- $layout = array(
- $options,
- phutil_tag(
- 'input',
- array(
- 'type' => 'hidden',
- 'name' => 'action',
- 'value' => 'notifications',
- )),
- phutil_tag(
- 'button',
- array(
- 'type' => 'submit',
- 'class' => 'notifications-update',
- ),
- pht('Save')),
- );
-
- return phabricator_form(
- $viewer,
- array(
- 'method' => 'POST',
- 'action' => $this->getWidgetURI(),
- 'sigil' => 'notifications-update',
- ),
- $layout);
- }
-
- private function getWidgetURI() {
- $conpherence = $this->getConpherence();
- return $this->getApplicationURI('update/'.$conpherence->getID().'/');
- }
-
-}
diff --git a/src/applications/conpherence/editor/ConpherenceEditor.php b/src/applications/conpherence/editor/ConpherenceEditor.php
--- a/src/applications/conpherence/editor/ConpherenceEditor.php
+++ b/src/applications/conpherence/editor/ConpherenceEditor.php
@@ -18,7 +18,8 @@
array $participant_phids,
$title,
$message,
- PhabricatorContentSource $source) {
+ PhabricatorContentSource $source,
+ $topic) {
$conpherence = ConpherenceThread::initializeNewRoom($creator);
$files = array();
@@ -59,6 +60,11 @@
->setTransactionType(ConpherenceTransaction::TYPE_TITLE)
->setNewValue($title);
}
+ if (strlen($topic)) {
+ $xactions[] = id(new ConpherenceTransaction())
+ ->setTransactionType(ConpherenceTransaction::TYPE_TOPIC)
+ ->setNewValue($topic);
+ }
$xactions[] = id(new ConpherenceTransaction())
->setTransactionType(PhabricatorTransactions::TYPE_COMMENT)
@@ -118,6 +124,7 @@
$types[] = PhabricatorTransactions::TYPE_COMMENT;
$types[] = ConpherenceTransaction::TYPE_TITLE;
+ $types[] = ConpherenceTransaction::TYPE_TOPIC;
$types[] = ConpherenceTransaction::TYPE_PARTICIPANTS;
$types[] = ConpherenceTransaction::TYPE_FILES;
$types[] = ConpherenceTransaction::TYPE_PICTURE;
@@ -136,6 +143,8 @@
switch ($xaction->getTransactionType()) {
case ConpherenceTransaction::TYPE_TITLE:
return $object->getTitle();
+ case ConpherenceTransaction::TYPE_TOPIC:
+ return $object->getTopic();
case ConpherenceTransaction::TYPE_PICTURE:
return $object->getImagePHID(ConpherenceImageData::SIZE_ORIG);
case ConpherenceTransaction::TYPE_PICTURE_CROP:
@@ -156,6 +165,7 @@
switch ($xaction->getTransactionType()) {
case ConpherenceTransaction::TYPE_TITLE:
+ case ConpherenceTransaction::TYPE_TOPIC:
case ConpherenceTransaction::TYPE_PICTURE_CROP:
return $xaction->getNewValue();
case ConpherenceTransaction::TYPE_PICTURE:
@@ -250,6 +260,9 @@
case ConpherenceTransaction::TYPE_TITLE:
$object->setTitle($xaction->getNewValue());
break;
+ case ConpherenceTransaction::TYPE_TOPIC:
+ $object->setTopic($xaction->getNewValue());
+ break;
case ConpherenceTransaction::TYPE_PICTURE:
$object->setImagePHID(
$xaction->getNewValue(),
@@ -484,6 +497,7 @@
PhabricatorPolicyCapability::CAN_VIEW);
break;
case ConpherenceTransaction::TYPE_TITLE:
+ case ConpherenceTransaction::TYPE_TOPIC:
PhabricatorPolicyFilter::requireCapability(
$this->requireActor(),
$object,
diff --git a/src/applications/conpherence/storage/ConpherenceThread.php b/src/applications/conpherence/storage/ConpherenceThread.php
--- a/src/applications/conpherence/storage/ConpherenceThread.php
+++ b/src/applications/conpherence/storage/ConpherenceThread.php
@@ -8,6 +8,7 @@
PhabricatorDestructibleInterface {
protected $title;
+ protected $topic;
protected $imagePHIDs = array();
protected $messageCount;
protected $recentParticipantPHIDs = array();
@@ -29,6 +30,7 @@
return id(new ConpherenceThread())
->setMessageCount(0)
->setTitle('')
+ ->setTopic('')
->attachParticipants(array())
->attachFilePHIDs(array())
->attachImages(array())
@@ -46,6 +48,7 @@
),
self::CONFIG_COLUMN_SCHEMA => array(
'title' => 'text255?',
+ 'topic' => 'text255',
'messageCount' => 'uint64',
'mailKey' => 'text20',
'joinPolicy' => 'policy',
@@ -342,9 +345,11 @@
$unread_count = $this->getMessageCount() - $user_seen_count;
$title = $this->getDisplayTitle($viewer);
+ $topic = $this->getTopic();
return array(
'title' => $title,
+ 'topic' => $topic,
'subtitle' => $subtitle,
'unread_count' => $unread_count,
'epoch' => $this->getDateModified(),
diff --git a/src/applications/conpherence/storage/ConpherenceTransaction.php b/src/applications/conpherence/storage/ConpherenceTransaction.php
--- a/src/applications/conpherence/storage/ConpherenceTransaction.php
+++ b/src/applications/conpherence/storage/ConpherenceTransaction.php
@@ -4,6 +4,7 @@
const TYPE_FILES = 'files';
const TYPE_TITLE = 'title';
+ const TYPE_TOPIC = 'topic';
const TYPE_PARTICIPANTS = 'participants';
const TYPE_DATE_MARKER = 'date-marker';
const TYPE_PICTURE = 'picture';
@@ -39,6 +40,7 @@
case self::TYPE_PARTICIPANTS:
return ($old === null);
case self::TYPE_TITLE:
+ case self::TYPE_TOPIC:
case self::TYPE_PICTURE:
case self::TYPE_DATE_MARKER:
return false;
@@ -59,6 +61,7 @@
switch ($this->getTransactionType()) {
case self::TYPE_TITLE:
+ case self::TYPE_TOPIC:
case PhabricatorTransactions::TYPE_VIEW_POLICY:
case PhabricatorTransactions::TYPE_EDIT_POLICY:
case PhabricatorTransactions::TYPE_JOIN_POLICY:
@@ -147,6 +150,20 @@
}
return $title;
break;
+ case self::TYPE_TOPIC:
+ if ($new) {
+ $title = pht(
+ '%s set the topic of this room to "%s".',
+ $this->renderHandleLink($author_phid),
+ $new);
+ } else if ($old) {
+ $title = pht(
+ '%s deleted the room topic "%s"',
+ $this->renderHandleLink($author_phid),
+ $old);
+ }
+ return $title;
+ break;
case self::TYPE_PICTURE:
return pht(
'%s updated the room image.',
diff --git a/src/applications/conpherence/view/ConpherenceLayoutView.php b/src/applications/conpherence/view/ConpherenceLayoutView.php
--- a/src/applications/conpherence/view/ConpherenceLayoutView.php
+++ b/src/applications/conpherence/view/ConpherenceLayoutView.php
@@ -105,9 +105,7 @@
$classes[] = 'hide-widgets';
}
- $this->initBehavior(
- 'conpherence-widget-pane',
- ConpherenceWidgetConfigConstants::getWidgetPaneBehaviorConfig());
+ $this->initBehavior('conpherence-participants-pane');
return javelin_tag(
'div',
diff --git a/src/applications/conpherence/view/ConpherencePeopleWidgetView.php b/src/applications/conpherence/view/ConpherenceParticipantView.php
rename from src/applications/conpherence/view/ConpherencePeopleWidgetView.php
rename to src/applications/conpherence/view/ConpherenceParticipantView.php
--- a/src/applications/conpherence/view/ConpherencePeopleWidgetView.php
+++ b/src/applications/conpherence/view/ConpherenceParticipantView.php
@@ -1,6 +1,25 @@
<?php
-final class ConpherencePeopleWidgetView extends ConpherenceWidgetView {
+final class ConpherenceParticipantView extends AphrontView {
+
+ private $conpherence;
+ private $updateURI;
+
+ public function setUpdateURI($update_uri) {
+ $this->updateURI = $update_uri;
+ return $this;
+ }
+ public function getUpdateURI() {
+ return $this->updateURI;
+ }
+
+ public function setConpherence(ConpherenceThread $conpherence) {
+ $this->conpherence = $conpherence;
+ return $this;
+ }
+ public function getConpherence() {
+ return $this->conpherence;
+ }
public function render() {
$conpherence = $this->getConpherence();
@@ -14,6 +33,7 @@
natcasesort($handle_list);
$handles = mpull($handles, null, 'getName');
$handles = array_select_keys($handles, $handle_list);
+
$head_handles = mpull($head_handles, null, 'getName');
$handles = $head_handles + $handles;
@@ -28,7 +48,8 @@
if (($user_phid == $viewer->getPHID()) || $can_edit) {
$icon = id(new PHUIIconView())
- ->setIcon('fa-times lightbluetext');
+ ->setIcon('fa-times')
+ ->addClass('lightbluetext');
$remove_html = javelin_tag(
'a',
array(
diff --git a/src/applications/conpherence/view/ConpherenceTransactionView.php b/src/applications/conpherence/view/ConpherenceTransactionView.php
--- a/src/applications/conpherence/view/ConpherenceTransactionView.php
+++ b/src/applications/conpherence/view/ConpherenceTransactionView.php
@@ -231,6 +231,7 @@
$content = $transaction->getTitle();
break;
case ConpherenceTransaction::TYPE_TITLE:
+ case ConpherenceTransaction::TYPE_TOPIC:
case ConpherenceTransaction::TYPE_PICTURE:
case ConpherenceTransaction::TYPE_PICTURE_CROP:
case ConpherenceTransaction::TYPE_PARTICIPANTS:
diff --git a/src/applications/conpherence/view/ConpherenceWidgetView.php b/src/applications/conpherence/view/ConpherenceWidgetView.php
deleted file mode 100644
--- a/src/applications/conpherence/view/ConpherenceWidgetView.php
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-
-abstract class ConpherenceWidgetView extends AphrontView {
-
- private $conpherence;
- private $updateURI;
-
- public function setUpdateURI($update_uri) {
- $this->updateURI = $update_uri;
- return $this;
- }
- public function getUpdateURI() {
- return $this->updateURI;
- }
-
- public function setConpherence(ConpherenceThread $conpherence) {
- $this->conpherence = $conpherence;
- return $this;
- }
- public function getConpherence() {
- return $this->conpherence;
- }
-
-}
diff --git a/webroot/rsrc/css/aphront/dialog-view.css b/webroot/rsrc/css/aphront/dialog-view.css
--- a/webroot/rsrc/css/aphront/dialog-view.css
+++ b/webroot/rsrc/css/aphront/dialog-view.css
@@ -46,6 +46,10 @@
border: none;
}
+.device-phone .aphront-dialog-body {
+ padding: 8px;
+}
+
.aphront-dialog-tail {
border: none;
position: relative;
diff --git a/webroot/rsrc/css/application/conpherence/header-pane.css b/webroot/rsrc/css/application/conpherence/header-pane.css
new file mode 100644
--- /dev/null
+++ b/webroot/rsrc/css/application/conpherence/header-pane.css
@@ -0,0 +1,68 @@
+/**
+ * @provides conpherence-header-pane-css
+ */
+
+.conpherence-header-pane {
+}
+
+.conpherence-header-pane .phui-header-shell {
+ padding: 8px 16px 10px;
+ min-height: 38px;
+}
+
+.conpherence-header-pane .phui-header-header {
+ font-size: 16px;
+ font-family: 'Aleo', {$fontfamily};
+ color: #000;
+}
+
+.conpherence-header-pane .phui-header-subheader {
+ color: {$lightgreyborder};
+ padding: 0;
+ font-size: 12px;
+ margin: 0;
+}
+
+.conpherence-header-pane .phui-header-shell.conpherence-no-topic {
+ padding: 15px 16px 5px;
+}
+
+.conpherence-header-pane .phui-header-action-list .phui-header-action-item
+ .phui-icon-view {
+ height: 18px;
+ width: 24px;
+ font-size: 14px;
+ line-height: 23px;
+ display: block;
+}
+
+.device .hide-on-device {
+ display: none;
+}
+
+.device-phone .conpherence-header-pane .phui-header-col3 {
+ vertical-align: middle;
+}
+
+.conpherence-header-pane .conpherence-participant-toggle.phui-icon-circle {
+ text-decoration: none;
+ border-color: {$sky};
+ cursor: pointer;
+}
+
+.conpherence-header-pane .conpherence-participant-toggle.phui-icon-circle
+ .phui-icon-view {
+ color: {$sky};
+}
+
+.hide-widgets .conpherence-header-pane
+ .conpherence-participant-toggle.phui-icon-circle {
+ text-decoration: none;
+ border-color: {$lightblueborder};
+ cursor: pointer;
+}
+
+.hide-widgets .conpherence-header-pane
+ .conpherence-participant-toggle.phui-icon-circle .phui-icon-view {
+ color: {$lightblueborder};
+}
diff --git a/webroot/rsrc/css/application/conpherence/message-pane.css b/webroot/rsrc/css/application/conpherence/message-pane.css
--- a/webroot/rsrc/css/application/conpherence/message-pane.css
+++ b/webroot/rsrc/css/application/conpherence/message-pane.css
@@ -9,7 +9,7 @@
position: fixed;
left: 240px;
right: 240px;
- top: 76px;
+ top: 102px;
bottom: 0px;
min-width: 300px;
width: auto;
@@ -32,11 +32,6 @@
margin: 16px 0px 16px 0px;
}
-.conpherence-layout .phui-crumbs-view {
- padding: 0 0 0 8px;
- background: #f7f7f7;
-}
-
.conpherence-show-more-messages {
display: block;
background: #e0e3ec;
@@ -54,7 +49,7 @@
position: fixed;
left: 240px;
right: 240px;
- top: 78px;
+ top: 103px;
bottom: 148px;
overflow-x: hidden;
overflow-y: auto;
@@ -103,13 +98,17 @@
.conpherence-message-pane .phui-form-view {
border-width: 0;
height: 140px;
- padding: 0 8px 8px;
+ padding: 0 20px 12px;
position: fixed;
bottom: 0;
left: 240px;
right: 241px;
}
+.device .conpherence-message-pane .phui-form-view {
+ padding: 8px 8px;
+}
+
.conpherence-message-pane .phui-form-view.login-to-participate {
height: 26px;
}
@@ -123,6 +122,11 @@
margin-top: 6px;
}
+.device .conpherence-message-pane .aphront-form-control-submit button,
+.device .conpherence-message-pane .aphront-form-control-submit a.button {
+ margin-top: 13px;
+}
+
/**
* When entering "Fullscreen Mode" in the remarkup control, we need to drop
* all of the "position: fixed" on parent elements or Chrome doesn't put the
@@ -162,7 +166,7 @@
.conpherence-message-pane .conpherence-transaction-view {
padding: 2px 0px;
- margin: 4px 12px;
+ margin: 4px 20px;
background-size: 100%;
min-height: auto;
}
@@ -182,7 +186,9 @@
}
.device-phone .conpherence-message-pane .conpherence-transaction-image {
- display: none;
+ height: 25px;
+ width: 25px;
+ background-size: 25px;
}
.conpherence-message-pane .conpherence-comment.anchor-target,
@@ -206,12 +212,12 @@
}
.device-phone .conpherence-message-pane .conpherence-transaction-detail {
- margin: 0;
+ margin-left: 32px;
}
.conpherence-message-pane .conpherence-transaction-view.date-marker {
padding: 0;
- margin: 20px 12px 4px;
+ margin: 20px 20px 4px;
min-height: auto;
}
@@ -234,7 +240,6 @@
.device .conpherence-message-pane .conpherence-transaction-view.date-marker
.date {
- color: {$lightbluetext};
left: 4px;
}
@@ -351,10 +356,3 @@
max-height: 200px;
}
-.device .conpherence-header-desktop-item {
- display: none;
-}
-
-.device .conpherence-header-pane .phui-crumb-action-divider {
- display: none;
-}
diff --git a/webroot/rsrc/css/application/conpherence/transaction.css b/webroot/rsrc/css/application/conpherence/transaction.css
--- a/webroot/rsrc/css/application/conpherence/transaction.css
+++ b/webroot/rsrc/css/application/conpherence/transaction.css
@@ -17,14 +17,14 @@
}
.conpherence-transaction-view.date-marker {
- border-top: 1px solid {$thinblueborder};
+ border-top: 1px solid {$sh-violetborder};
}
.conpherence-transaction-view.date-marker .date {
position: relative;
top: -11px;
background-color: #fff;
- color: #000;
+ color: {$sh-violettext};
font-weight: bold;
}
diff --git a/webroot/rsrc/css/application/conpherence/update.css b/webroot/rsrc/css/application/conpherence/update.css
--- a/webroot/rsrc/css/application/conpherence/update.css
+++ b/webroot/rsrc/css/application/conpherence/update.css
@@ -2,10 +2,6 @@
* @provides conpherence-update-css
*/
-.phabricator-standard-page-body .aphront-dialog-view {
- margin: 20px auto 0px auto;
-}
-
.aphront-dialog-view .conpherence-dialogue-drag-photo {
border: 1px dashed #bfbfbf;
padding: 10px 0px 10px 10px;
diff --git a/webroot/rsrc/css/application/conpherence/widget-pane.css b/webroot/rsrc/css/application/conpherence/widget-pane.css
--- a/webroot/rsrc/css/application/conpherence/widget-pane.css
+++ b/webroot/rsrc/css/application/conpherence/widget-pane.css
@@ -2,11 +2,10 @@
* @provides conpherence-widget-pane-css
*/
-.conpherence-widget-pane,
-.loading .widgets-loading-mask {
+.conpherence-widget-pane {
position: fixed;
right: 0px;
- top: 79px;
+ top: 103px;
bottom: 0;
width: 240px;
border-width: 0 0 0 1px;
@@ -15,20 +14,9 @@
overflow-y: auto;
-webkit-overflow-scrolling: touch;
}
-.device .conpherence-widget-pane,
-.device .loading .widgets-loading-mask {
- top: 44px;
- width: 100%;
-}
-
-.conpherence-widget-pane .widgets-loading-mask {
- opacity: .6;
- background: #fff;
- display: none;
-}
-.loading .widgets-loading-mask {
- display: block;
+.device .conpherence-widget-pane {
+ background-color: {$page.background};
}
.conpherence-widget-pane .aphront-form-input {
@@ -48,84 +36,20 @@
font-size: {$biggerfontsize};
}
-.device .conpherence-widget-pane .widgets-header {
- display: none;
-}
-
-.conpherence-widget-pane .widgets-header .caret {
- float: none;
- height: 0px;
- width: 0px;
- margin: 10px 0 0 4px;
- border-top-color: #000;
-}
-
.conpherence-widget-pane .widgets-header .phui-icon-view.disabled {
color: {$lightgreytext};
}
-.device-desktop .conpherence-layout .device-widgets-selector {
- display: none;
-}
-
.conpherence-widget-pane .widgets-body {
position: fixed;
overflow-y: auto;
bottom: 0;
- top: 76px;
- width: 100%;
-}
-
-#widgets-settings {
- padding: 3px 6px;
-}
-
-.device-desktop .conpherence-widget-pane .widgets-body {
- top: 115px;
+ top: 144px;
width: 240px;
}
-.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 .add-people-widget {
- padding: 10px 0 5px 0;
- overflow: hidden;
-}
-
-.conpherence-widget-pane .people-widget-header .add-people-widget
-.aphront-form-control-tokenizer {
- float: left;
- width: 150px;
- padding: 0px 0px 0px 10px
-}
-
-.device .conpherence-widget-pane .people-widget-header .add-people-widget
-.aphront-form-control-tokenizer {
- width: 70%;
-}
-
-.conpherence-widget-pane .people-widget-header .add-people-widget
-.people-add-button {
- float: right;
- margin: 2px 8px 0px 0px;
- padding: 3px 16px 4px 16px;
-}
-
-#widgets-people {
- margin-top: 4px;
-}
-
.conpherence-widget-pane .person-entry {
- padding: 4px 8px;
+ padding: 4px 4px 4px 8px;
}
.conpherence-widget-pane .person-entry:hover {
@@ -173,35 +97,17 @@
color: #000;
}
-/* settings widget */
-.conpherence-widget-pane .title-update,
-.conpherence-widget-pane .notifications-update {
- margin: 3px 0px 0px 4px;
-}
-
-.conpherence-widget-pane .no-settings {
- width: 200px;
- padding: 20px;
- text-align: center;
- color: {$greytext};
-}
-
-.device .conpherence-widget-pane .no-settings {
- width: 60px;
- margin: 0 auto 0 auto;
-}
-
/****** Hide Widgets **********************************************************/
-.device-desktop .hide-widgets .conpherence-widget-pane {
+.hide-widgets .conpherence-widget-pane {
display: none;
}
-.device-desktop .hide-widgets .conpherence-message-pane,
-.device-desktop .hide-widgets .loading .messages-loading-mask,
-.device-desktop .hide-widgets .loading .messages-loading-icon,
-.device-desktop .hide-widgets .conpherence-no-threads,
-.device-desktop .hide-widgets .conpherence-message-pane .conpherence-messages,
-.device-desktop .hide-widgets .conpherence-message-pane .phui-form-view {
+.hide-widgets .conpherence-message-pane,
+.hide-widgets .loading .messages-loading-mask,
+.hide-widgets .loading .messages-loading-icon,
+.hide-widgets .conpherence-no-threads,
+.hide-widgets .conpherence-message-pane .conpherence-messages,
+.hide-widgets .conpherence-message-pane .phui-form-view {
right: 0;
}
diff --git a/webroot/rsrc/css/core/z-index.css b/webroot/rsrc/css/core/z-index.css
--- a/webroot/rsrc/css/core/z-index.css
+++ b/webroot/rsrc/css/core/z-index.css
@@ -150,6 +150,10 @@
z-index: 21;
}
+.conpherence-widget-pane {
+ z-index: 25;
+}
+
.phuix-dropdown-menu {
z-index: 32;
}
diff --git a/webroot/rsrc/js/application/conpherence/behavior-menu.js b/webroot/rsrc/js/application/conpherence/behavior-menu.js
--- a/webroot/rsrc/js/application/conpherence/behavior-menu.js
+++ b/webroot/rsrc/js/application/conpherence/behavior-menu.js
@@ -241,7 +241,7 @@
if (!data.widget) {
data.widget = getDefaultWidget();
}
- var widget_uri = config.baseURI + 'widget/' + data.threadID + '/';
+ var widget_uri = config.baseURI + 'participant/' + data.threadID + '/';
new JX.Workflow(widget_uri, {})
.setHandler(JX.bind(null, onWidgetResponse, data.threadID, data.widget))
.start();
diff --git a/webroot/rsrc/js/application/conpherence/behavior-participants-pane.js b/webroot/rsrc/js/application/conpherence/behavior-participants-pane.js
new file mode 100644
--- /dev/null
+++ b/webroot/rsrc/js/application/conpherence/behavior-participants-pane.js
@@ -0,0 +1,112 @@
+/**
+ * @requires javelin-behavior
+ * javelin-dom
+ * javelin-stratcom
+ * javelin-workflow
+ * javelin-util
+ * phabricator-notification
+ * conpherence-thread-manager
+ * @provides javelin-behavior-conpherence-participants-pane
+ */
+
+JX.behavior('conpherence-participants-pane', function() {
+
+ /**
+ * Generified adding new stuff to widgets technology!
+ */
+ JX.Stratcom.listen(
+ ['click'],
+ 'conpherence-widget-adder',
+ function (e) {
+ e.kill();
+
+ var threadManager = JX.ConpherenceThreadManager.getInstance();
+ var href = threadManager._getUpdateURI();
+ var latest_transaction_id = threadManager.getLatestTransactionID();
+ var data = {
+ latest_transaction_id : latest_transaction_id,
+ action : 'add_person'
+ };
+
+ var workflow = new JX.Workflow(href, data)
+ .setHandler(function (r) {
+ var threadManager = JX.ConpherenceThreadManager.getInstance();
+ threadManager.setLatestTransactionID(r.latest_transaction_id);
+ var root = JX.DOM.find(document, 'div', 'conpherence-layout');
+ var messages = null;
+ try {
+ messages = JX.DOM.find(root, 'div', 'conpherence-messages');
+ } catch (ex) {
+ }
+ if (messages) {
+ JX.DOM.appendContent(messages, JX.$H(r.transactions));
+ JX.Stratcom.invoke('conpherence-redraw-thread', null, {});
+ }
+
+ try {
+ var people_root = JX.DOM.find(root, 'div', 'widgets-people');
+ // update the people widget
+ JX.DOM.setContent(
+ people_root,
+ JX.$H(r.people_widget));
+ } catch (ex) {
+ }
+
+ });
+
+ threadManager.syncWorkflow(workflow, 'submit');
+ }
+ );
+
+ JX.Stratcom.listen(
+ ['touchstart', 'mousedown'],
+ 'remove-person',
+ function (e) {
+ var threadManager = JX.ConpherenceThreadManager.getInstance();
+ var href = threadManager._getUpdateURI();
+ var data = e.getNodeData('remove-person');
+
+ // While the user is removing themselves, disable the notification
+ // update behavior. If we don't do this, the user can get an error
+ // when they remove themselves about permissions as the notification
+ // code tries to load what jist happened.
+ var loadedPhid = threadManager.getLoadedThreadPHID();
+ threadManager.setLoadedThreadPHID(null);
+
+ new JX.Workflow(href, data)
+ .setCloseHandler(function() {
+ threadManager.setLoadedThreadPHID(loadedPhid);
+ })
+ // we re-direct to conpherence home so the thread manager will
+ // fix itself there
+ .setHandler(function(r) {
+ JX.$U(r.href).go();
+ })
+ .start();
+ }
+ );
+
+ /* settings widget */
+ var onsubmitSettings = function (e) {
+ e.kill();
+ var form = e.getNode('tag:form');
+ var button = JX.DOM.find(form, 'button');
+ JX.Workflow.newFromForm(form)
+ .setHandler(JX.bind(this, function (r) {
+ new JX.Notification()
+ .setDuration(6000)
+ .setContent(r)
+ .show();
+ button.disabled = '';
+ JX.DOM.alterClass(button, 'disabled', false);
+ }))
+ .start();
+ };
+
+ JX.Stratcom.listen(
+ ['submit', 'didSyntheticSubmit'],
+ 'notifications-update',
+ onsubmitSettings
+ );
+
+});
diff --git a/webroot/rsrc/js/application/conpherence/behavior-toggle-widget.js b/webroot/rsrc/js/application/conpherence/behavior-toggle-widget.js
--- a/webroot/rsrc/js/application/conpherence/behavior-toggle-widget.js
+++ b/webroot/rsrc/js/application/conpherence/behavior-toggle-widget.js
@@ -14,6 +14,7 @@
var node = JX.$('conpherence-main-layout');
config.show = !config.show;
JX.DOM.alterClass(node, 'hide-widgets', !config.show);
+ JX.Stratcom.invoke('resize');
new JX.Request(config.settingsURI)
.setData({value: (config.show ? 1 : 0)})
diff --git a/webroot/rsrc/js/application/conpherence/behavior-widget-pane.js b/webroot/rsrc/js/application/conpherence/behavior-widget-pane.js
deleted file mode 100644
--- a/webroot/rsrc/js/application/conpherence/behavior-widget-pane.js
+++ /dev/null
@@ -1,382 +0,0 @@
-/**
- * @requires javelin-behavior
- * javelin-dom
- * javelin-stratcom
- * javelin-workflow
- * javelin-util
- * phabricator-notification
- * javelin-behavior-device
- * phuix-dropdown-menu
- * phuix-action-list-view
- * phuix-action-view
- * conpherence-thread-manager
- * @provides javelin-behavior-conpherence-widget-pane
- */
-
-JX.behavior('conpherence-widget-pane', function(config) {
-
- /**
- * There can be race conditions around loading the messages or the widgets
- * first. Keep track of what widgets we've loaded with this variable.
- */
- var _loadedWidgetsID = null;
-
- /**
- * At any given time there can be only one selected widget. Keep track of
- * which one it is by the user-facing name for ease of use with
- * PhabricatorDropdownMenuItems.
- */
- var _selectedWidgetName = null;
-
- /**
- * This is potentially built each time the user switches conpherence threads
- * or when the result JX.Device.getDevice() changes from desktop to some
- * other value.
- */
- var buildDeviceWidgetSelector = function (data) {
- var device_header = _getDeviceWidgetHeader();
- if (!device_header) {
- return;
- }
- JX.DOM.show(device_header);
- var device_menu = new JX.PHUIXDropdownMenu(device_header);
- data.deviceMenu = true;
- _buildWidgetSelector(device_menu, data);
- };
-
- /**
- * This is potentially built each time the user switches conpherence threads
- * or when the result JX.Device.getDevice() changes from mobile or tablet to
- * desktop.
- */
- var buildDesktopWidgetSelector = function (data) {
- var root = JX.DOM.find(document, 'div', 'conpherence-layout');
- var widget_pane = JX.DOM.find(root, 'div', 'conpherence-widget-pane');
- var widget_header = JX.DOM.find(widget_pane, 'a', 'widgets-selector');
-
- var menu = new JX.PHUIXDropdownMenu(widget_header);
- menu
- .setAlign('left')
- .setOffsetY(4);
-
- data.deviceMenu = false;
- _buildWidgetSelector(menu, data);
- };
-
- /**
- * Workhorse that actually builds the widget selector. Note some fancy bits
- * where we listen for the "open" event and enable / disable widgets as
- * appropos.
- */
- var _buildWidgetSelector = function (menu, data) {
- _loadedWidgetsID = data.threadID;
-
- var list = new JX.PHUIXActionListView();
- var map = {};
-
- var widgets = config.widgetRegistry;
- for (var widget in widgets) {
- var widget_data = widgets[widget];
- if (widget_data.deviceOnly && data.deviceMenu === false) {
- continue;
- }
-
- var handler;
- var href;
- handler = JX.bind(null, function(widget, e) {
- toggleWidget({widget: widget});
- e.prevent();
- menu.close();
- }, widget);
- var item = new JX.PHUIXActionView()
- .setIcon(widget_data.icon || 'none')
- .setName(widget_data.name)
- .setHref(href)
- .setHandler(handler);
- map[widget_data.name] = item;
- list.addItem(item);
- }
-
- menu
- .setWidth(200)
- .setContent(list.getNode());
-
- menu.listen('open', function() {
- for (var k in map) {
- map[k].setDisabled((k == _selectedWidgetName));
- }
- });
- };
-
- /**
- * Since this is not always on the page, avoid having a repeat
- * try / catch block and consolidate into this helper function.
- */
- var _getDeviceWidgetHeader = function () {
- var root = JX.DOM.find(document, 'div', 'conpherence-layout');
- var device_header = null;
- try {
- device_header = JX.DOM.find(
- root,
- 'a',
- 'device-widgets-selector');
- } catch (ex) {
- // is okay - no deviceWidgetHeader yet... but bail time
- }
- return device_header;
- };
-
- /**
- * Responder to the 'conpherence-did-redraw-thread' event, this bad boy
- * hides or shows the device widget selector as appropros.
- */
- var _didRedrawThread = function (data) {
- if (_loadedWidgetsID === null || _loadedWidgetsID != data.threadID) {
- return;
- }
- var device = JX.Device.getDevice();
- var device_selector = _getDeviceWidgetHeader();
- if (device == 'desktop') {
- JX.DOM.hide(device_selector);
- } else {
- JX.DOM.show(device_selector);
- }
- if (data.buildDeviceWidgetSelector) {
- buildDeviceWidgetSelector(data);
- }
- toggleWidget(data);
- };
- JX.Stratcom.listen(
- 'conpherence-did-redraw-thread',
- null,
- function (e) {
- _didRedrawThread(e.getData());
- }
- );
-
- /**
- * Toggling a widget involves showing / hiding the appropriate widget
- * bodies as well as updating the selectors to have the label on the
- * newly selected widget.
- */
- var toggleWidget = function (data) {
- var widgets = config.widgetRegistry;
- var widget_data = widgets[data.widget];
- var device = JX.Device.getDevice();
- var is_desktop = device == 'desktop';
-
- if (widget_data.deviceOnly && is_desktop) {
- return;
- }
- _selectedWidgetName = widget_data.name;
-
- var device_header = _getDeviceWidgetHeader();
- if (device_header) {
- // this is fragile but adding a sigil to this element is awkward
- var device_header_spans = JX.DOM.scry(device_header, 'span');
- var device_header_span = device_header_spans[1];
- JX.DOM.setContent(
- device_header_span,
- widget_data.name);
- }
-
- // don't update the non-device selector with device only widget stuff
- if (!widget_data.deviceOnly) {
- var root = JX.DOM.find(document, 'div', 'conpherence-layout');
- var widget_pane = JX.DOM.find(root, 'div', 'conpherence-widget-pane');
- var widget_header = JX.DOM.find(widget_pane, 'a', 'widgets-selector');
- var adder = JX.DOM.find(widget_pane, 'a', 'conpherence-widget-adder');
- var threadManager = JX.ConpherenceThreadManager.getInstance();
- var disabled = !threadManager.getCanEditLoadedThread();
- JX.DOM.setContent(
- widget_header,
- widget_data.name);
- JX.DOM.appendContent(
- widget_header,
- JX.$N('span', { className : 'caret' }));
- if (widget_data.hasCreate) {
- JX.DOM.show(adder);
- JX.DOM.alterClass(
- adder,
- 'disabled',
- disabled);
- } else {
- JX.DOM.hide(adder);
- }
- }
-
- for (var widget in config.widgetRegistry) {
- widget_data = widgets[widget];
- if (widget_data.deviceOnly && is_desktop) {
- // some one off code for conpherence messages which are device-only
- // as a widget, but shown always on the desktop
- if (widget == 'conpherence-message-pane') {
- JX.$(widget).style.display = 'block';
- }
- continue;
- }
- if (widget == data.widget) {
- JX.$(widget).style.display = 'block';
- // some one off code for conpherence messages - fancier refresh tech
- if (widget == 'conpherence-message-pane') {
- JX.Stratcom.invoke('conpherence-redraw-thread', null, {});
- JX.Stratcom.invoke('conpherence-update-page-data', null, {});
- }
- } else {
- JX.$(widget).style.display = 'none';
- }
- }
- };
-
- JX.Stratcom.listen(
- 'conpherence-update-widgets',
- null,
- function (e) {
- var data = e.getData();
- if (data.buildSelectors) {
- buildDesktopWidgetSelector(data);
- buildDeviceWidgetSelector(data);
- }
- if (data.toggleWidget) {
- toggleWidget(data);
- }
- });
-
- /**
- * Generified adding new stuff to widgets technology!
- */
- JX.Stratcom.listen(
- ['click'],
- 'conpherence-widget-adder',
- function (e) {
- e.kill();
-
- var widgets = config.widgetRegistry;
- // the widget key might be in node data, but otherwise use the
- // selected widget
- var event_data = e.getNodeData('conpherence-widget-adder');
- var widget_key = _selectedWidgetName;
- if (event_data.widget) {
- widget_key = widgets[event_data.widget].name;
- }
-
- var widget_to_update = null;
- var create_data = null;
- for (var widget in widgets) {
- if (widgets[widget].name == widget_key) {
- create_data = widgets[widget].createData;
- widget_to_update = widget;
- break;
- }
- }
- // this should be impossible, but hey
- if (!widget_to_update) {
- return;
- }
- var href = config.widgetBaseUpdateURI + _loadedWidgetsID + '/';
- if (create_data.customHref) {
- href = create_data.customHref;
- }
-
- var threadManager = JX.ConpherenceThreadManager.getInstance();
- var latest_transaction_id = threadManager.getLatestTransactionID();
- var data = {
- latest_transaction_id : latest_transaction_id,
- action : create_data.action
- };
-
- var workflow = new JX.Workflow(href, data)
- .setHandler(function (r) {
- var threadManager = JX.ConpherenceThreadManager.getInstance();
- threadManager.setLatestTransactionID(r.latest_transaction_id);
- var root = JX.DOM.find(document, 'div', 'conpherence-layout');
- if (create_data.refreshFromResponse) {
- var messages = null;
- try {
- messages = JX.DOM.find(root, 'div', 'conpherence-messages');
- } catch (ex) {
- }
- if (messages) {
- JX.DOM.appendContent(messages, JX.$H(r.transactions));
- JX.Stratcom.invoke('conpherence-redraw-thread', null, {});
- }
-
- if (r.people_widget) {
- try {
- var people_root = JX.DOM.find(root, 'div', 'widgets-people');
- // update the people widget
- JX.DOM.setContent(
- people_root,
- JX.$H(r.people_widget));
- } catch (ex) {
- }
- }
-
- // otherwise let's redraw the widget somewhat lazily
- } else {
- JX.Stratcom.invoke(
- 'conpherence-reload-widget',
- null,
- {
- threadID : _loadedWidgetsID,
- widget : widget_to_update
- });
- }
- });
-
- threadManager.syncWorkflow(workflow, 'submit');
- }
- );
-
- JX.Stratcom.listen(
- ['touchstart', 'mousedown'],
- 'remove-person',
- function (e) {
- var href = config.widgetBaseUpdateURI + _loadedWidgetsID + '/';
- var data = e.getNodeData('remove-person');
-
- // While the user is removing themselves, disable the notification
- // update behavior. If we don't do this, the user can get an error
- // when they remove themselves about permissions as the notification
- // code tries to load what jist happened.
- var threadManager = JX.ConpherenceThreadManager.getInstance();
- var loadedPhid = threadManager.getLoadedThreadPHID();
- threadManager.setLoadedThreadPHID(null);
-
- new JX.Workflow(href, data)
- .setCloseHandler(function() {
- threadManager.setLoadedThreadPHID(loadedPhid);
- })
- // we re-direct to conpherence home so the thread manager will
- // fix itself there
- .setHandler(function(r) {
- JX.$U(r.href).go();
- })
- .start();
- }
- );
-
- /* settings widget */
- var onsubmitSettings = function (e) {
- e.kill();
- var form = e.getNode('tag:form');
- var button = JX.DOM.find(form, 'button');
- JX.Workflow.newFromForm(form)
- .setHandler(JX.bind(this, function (r) {
- new JX.Notification()
- .setDuration(6000)
- .setContent(r)
- .show();
- button.disabled = '';
- JX.DOM.alterClass(button, 'disabled', false);
- }))
- .start();
- };
-
- JX.Stratcom.listen(
- ['submit', 'didSyntheticSubmit'],
- 'notifications-update',
- onsubmitSettings
- );
-
-});
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Oct 3, 11:05 PM (22 h, 6 m)
Storage Engine
amazon-s3
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
phabricator/secure/sr/ci/6krtd6vzszv5dsld
Default Alt Text
D16550.diff (76 KB)
Attached To
Mode
D16550: Rebuild Conpherence
Attached
Detach File
Event Timeline
Log In to Comment