Skip to content

Commit bfa5ffe

Browse files
author
epriestley
committed
Add a "Play Sound" workboard trigger rule
Summary: Ref T5474. Allow columns to play a sound when tasks are dropped. This is a little tricky because Safari has changed somewhat recently to require some gymnastics to play sounds when the user didn't explicitly click something. Preloading the sound on the first mouse interaction, then playing and immediately pausing it seems to work, though. Test Plan: Added a trigger with 5 sounds. In Safari, Chrome, and Firefox, dropped a card into the column. In all browsers, heard a nice sequence of 5 sounds played one after the other. Reviewers: amckinley Reviewed By: amckinley Maniphest Tasks: T5474 Differential Revision: https://secure.phabricator.com/D20306
1 parent 66c1d62 commit bfa5ffe

File tree

12 files changed

+267
-38
lines changed

12 files changed

+267
-38
lines changed

resources/celerity/map.php

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
'conpherence.pkg.css' => '3c8a0668',
1111
'conpherence.pkg.js' => '020aebcf',
1212
'core.pkg.css' => 'b797945d',
13-
'core.pkg.js' => 'eaca003c',
13+
'core.pkg.js' => 'eb53fc5b',
1414
'differential.pkg.css' => '8d8360fb',
1515
'differential.pkg.js' => '67e02996',
1616
'diffusion.pkg.css' => '42c75c37',
@@ -249,7 +249,7 @@
249249
'rsrc/externals/javelin/lib/Routable.js' => '6a18c42e',
250250
'rsrc/externals/javelin/lib/Router.js' => '32755edb',
251251
'rsrc/externals/javelin/lib/Scrollbar.js' => 'a43ae2ae',
252-
'rsrc/externals/javelin/lib/Sound.js' => 'e562708c',
252+
'rsrc/externals/javelin/lib/Sound.js' => 'd4cc2d2a',
253253
'rsrc/externals/javelin/lib/URI.js' => '2e255291',
254254
'rsrc/externals/javelin/lib/Vector.js' => 'e9c80beb',
255255
'rsrc/externals/javelin/lib/WebSocket.js' => 'fdc13e4e',
@@ -409,7 +409,7 @@
409409
'rsrc/js/application/phortune/phortune-credit-card-form.js' => 'd12d214f',
410410
'rsrc/js/application/policy/behavior-policy-control.js' => '0eaa33a9',
411411
'rsrc/js/application/policy/behavior-policy-rule-editor.js' => '9347f172',
412-
'rsrc/js/application/projects/WorkboardBoard.js' => '65afb173',
412+
'rsrc/js/application/projects/WorkboardBoard.js' => '3ba8e6ad',
413413
'rsrc/js/application/projects/WorkboardCard.js' => '0392a5d8',
414414
'rsrc/js/application/projects/WorkboardCardTemplate.js' => '2a61f8d4',
415415
'rsrc/js/application/projects/WorkboardColumn.js' => 'c3d24e63',
@@ -418,7 +418,7 @@
418418
'rsrc/js/application/projects/WorkboardHeader.js' => '111bfd2d',
419419
'rsrc/js/application/projects/WorkboardHeaderTemplate.js' => 'ebe83a6b',
420420
'rsrc/js/application/projects/WorkboardOrderTemplate.js' => '03e8891f',
421-
'rsrc/js/application/projects/behavior-project-boards.js' => '8512e4ea',
421+
'rsrc/js/application/projects/behavior-project-boards.js' => 'aad45445',
422422
'rsrc/js/application/projects/behavior-project-create.js' => '34c53422',
423423
'rsrc/js/application/projects/behavior-reorder-columns.js' => '8ac32fd9',
424424
'rsrc/js/application/releeph/releeph-preview-branch.js' => '75184d68',
@@ -664,7 +664,7 @@
664664
'javelin-behavior-phuix-example' => 'c2c500a7',
665665
'javelin-behavior-policy-control' => '0eaa33a9',
666666
'javelin-behavior-policy-rule-editor' => '9347f172',
667-
'javelin-behavior-project-boards' => '8512e4ea',
667+
'javelin-behavior-project-boards' => 'aad45445',
668668
'javelin-behavior-project-create' => '34c53422',
669669
'javelin-behavior-quicksand-blacklist' => '5a6f6a06',
670670
'javelin-behavior-read-only-warning' => 'b9109f8f',
@@ -718,7 +718,7 @@
718718
'javelin-routable' => '6a18c42e',
719719
'javelin-router' => '32755edb',
720720
'javelin-scrollbar' => 'a43ae2ae',
721-
'javelin-sound' => 'e562708c',
721+
'javelin-sound' => 'd4cc2d2a',
722722
'javelin-stratcom' => '0889b835',
723723
'javelin-tokenizer' => '89a1ae3a',
724724
'javelin-typeahead' => 'a4356cde',
@@ -737,7 +737,7 @@
737737
'javelin-view-renderer' => '9aae2b66',
738738
'javelin-view-visitor' => '308f9fe4',
739739
'javelin-websocket' => 'fdc13e4e',
740-
'javelin-workboard-board' => '65afb173',
740+
'javelin-workboard-board' => '3ba8e6ad',
741741
'javelin-workboard-card' => '0392a5d8',
742742
'javelin-workboard-card-template' => '2a61f8d4',
743743
'javelin-workboard-column' => 'c3d24e63',
@@ -1227,6 +1227,18 @@
12271227
'javelin-behavior',
12281228
'phabricator-prefab',
12291229
),
1230+
'3ba8e6ad' => array(
1231+
'javelin-install',
1232+
'javelin-dom',
1233+
'javelin-util',
1234+
'javelin-stratcom',
1235+
'javelin-workflow',
1236+
'phabricator-draggable-list',
1237+
'javelin-workboard-column',
1238+
'javelin-workboard-header-template',
1239+
'javelin-workboard-card-template',
1240+
'javelin-workboard-order-template',
1241+
),
12301242
'3dc5ad43' => array(
12311243
'javelin-behavior',
12321244
'javelin-stratcom',
@@ -1456,18 +1468,6 @@
14561468
'60cd9241' => array(
14571469
'javelin-behavior',
14581470
),
1459-
'65afb173' => array(
1460-
'javelin-install',
1461-
'javelin-dom',
1462-
'javelin-util',
1463-
'javelin-stratcom',
1464-
'javelin-workflow',
1465-
'phabricator-draggable-list',
1466-
'javelin-workboard-column',
1467-
'javelin-workboard-header-template',
1468-
'javelin-workboard-card-template',
1469-
'javelin-workboard-order-template',
1470-
),
14711471
'65bb0011' => array(
14721472
'javelin-behavior',
14731473
'javelin-dom',
@@ -1594,16 +1594,6 @@
15941594
'javelin-dom',
15951595
'javelin-vector',
15961596
),
1597-
'8512e4ea' => array(
1598-
'javelin-behavior',
1599-
'javelin-dom',
1600-
'javelin-util',
1601-
'javelin-vector',
1602-
'javelin-stratcom',
1603-
'javelin-workflow',
1604-
'javelin-workboard-controller',
1605-
'javelin-workboard-drop-effect',
1606-
),
16071597
'87428eb2' => array(
16081598
'javelin-behavior',
16091599
'javelin-diffusion-locate-file-source',
@@ -1848,6 +1838,16 @@
18481838
'javelin-dom',
18491839
'javelin-util',
18501840
),
1841+
'aad45445' => array(
1842+
'javelin-behavior',
1843+
'javelin-dom',
1844+
'javelin-util',
1845+
'javelin-vector',
1846+
'javelin-stratcom',
1847+
'javelin-workflow',
1848+
'javelin-workboard-controller',
1849+
'javelin-workboard-drop-effect',
1850+
),
18511851
'ab85e184' => array(
18521852
'javelin-install',
18531853
'javelin-dom',
@@ -2041,6 +2041,9 @@
20412041
'd3799cb4' => array(
20422042
'javelin-install',
20432043
),
2044+
'd4cc2d2a' => array(
2045+
'javelin-install',
2046+
),
20442047
'd8a86cfb' => array(
20452048
'javelin-behavior',
20462049
'javelin-dom',
@@ -2075,9 +2078,6 @@
20752078
'javelin-dom',
20762079
'javelin-history',
20772080
),
2078-
'e562708c' => array(
2079-
'javelin-install',
2080-
),
20812081
'e5bdb730' => array(
20822082
'javelin-behavior',
20832083
'javelin-stratcom',

src/__phutil_library_map__.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4183,6 +4183,7 @@
41834183
'PhabricatorProjectTriggerManiphestStatusRule' => 'applications/project/trigger/PhabricatorProjectTriggerManiphestStatusRule.php',
41844184
'PhabricatorProjectTriggerNameTransaction' => 'applications/project/xaction/trigger/PhabricatorProjectTriggerNameTransaction.php',
41854185
'PhabricatorProjectTriggerPHIDType' => 'applications/project/phid/PhabricatorProjectTriggerPHIDType.php',
4186+
'PhabricatorProjectTriggerPlaySoundRule' => 'applications/project/trigger/PhabricatorProjectTriggerPlaySoundRule.php',
41864187
'PhabricatorProjectTriggerQuery' => 'applications/project/query/PhabricatorProjectTriggerQuery.php',
41874188
'PhabricatorProjectTriggerRule' => 'applications/project/trigger/PhabricatorProjectTriggerRule.php',
41884189
'PhabricatorProjectTriggerRuleRecord' => 'applications/project/trigger/PhabricatorProjectTriggerRuleRecord.php',
@@ -10317,6 +10318,7 @@
1031710318
'PhabricatorProjectTriggerManiphestStatusRule' => 'PhabricatorProjectTriggerRule',
1031810319
'PhabricatorProjectTriggerNameTransaction' => 'PhabricatorProjectTriggerTransactionType',
1031910320
'PhabricatorProjectTriggerPHIDType' => 'PhabricatorPHIDType',
10321+
'PhabricatorProjectTriggerPlaySoundRule' => 'PhabricatorProjectTriggerRule',
1032010322
'PhabricatorProjectTriggerQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
1032110323
'PhabricatorProjectTriggerRule' => 'Phobject',
1032210324
'PhabricatorProjectTriggerRuleRecord' => 'Phobject',

src/applications/project/controller/PhabricatorProjectBoardViewController.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -542,6 +542,7 @@ public function handleRequest(AphrontRequest $request) {
542542
$templates = array();
543543
$all_tasks = array();
544544
$column_templates = array();
545+
$sounds = array();
545546
foreach ($visible_columns as $column_phid => $column) {
546547
$column_tasks = $column_phids[$column_phid];
547548

@@ -629,6 +630,10 @@ public function handleRequest(AphrontRequest $request) {
629630
if ($trigger) {
630631
$preview_effect = $trigger->getPreviewEffect()
631632
->toDictionary();
633+
634+
foreach ($trigger->getSoundEffects() as $sound) {
635+
$sounds[] = $sound;
636+
}
632637
}
633638
}
634639

@@ -685,6 +690,7 @@ public function handleRequest(AphrontRequest $request) {
685690

686691
'boardID' => $board_id,
687692
'projectPHID' => $project->getPHID(),
693+
'preloadSounds' => $sounds,
688694
);
689695
$this->initBehavior('project-boards', $behavior_config);
690696

src/applications/project/controller/PhabricatorProjectController.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,8 @@ protected function setProfileMenuEngine(
152152
protected function newCardResponse(
153153
$board_phid,
154154
$object_phid,
155-
PhabricatorProjectColumnOrder $ordering = null) {
155+
PhabricatorProjectColumnOrder $ordering = null,
156+
$sounds = array()) {
156157

157158
$viewer = $this->getViewer();
158159

@@ -166,7 +167,8 @@ protected function newCardResponse(
166167
->setViewer($viewer)
167168
->setBoardPHID($board_phid)
168169
->setObjectPHID($object_phid)
169-
->setVisiblePHIDs($visible_phids);
170+
->setVisiblePHIDs($visible_phids)
171+
->setSounds($sounds);
170172

171173
if ($ordering) {
172174
$engine->setOrdering($ordering);

src/applications/project/controller/PhabricatorProjectMoveController.php

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ public function handleRequest(AphrontRequest $request) {
111111
$xactions[] = $header_xaction;
112112
}
113113

114+
$sounds = array();
114115
if ($column->canHaveTrigger()) {
115116
$trigger = $column->getTrigger();
116117
if ($trigger) {
@@ -121,6 +122,10 @@ public function handleRequest(AphrontRequest $request) {
121122
foreach ($trigger_xactions as $trigger_xaction) {
122123
$xactions[] = $trigger_xaction;
123124
}
125+
126+
foreach ($trigger->getSoundEffects() as $effect) {
127+
$sounds[] = $effect;
128+
}
124129
}
125130
}
126131

@@ -133,7 +138,11 @@ public function handleRequest(AphrontRequest $request) {
133138

134139
$editor->applyTransactions($object, $xactions);
135140

136-
return $this->newCardResponse($board_phid, $object_phid, $ordering);
141+
return $this->newCardResponse(
142+
$board_phid,
143+
$object_phid,
144+
$ordering,
145+
$sounds);
137146
}
138147

139148
}

src/applications/project/engine/PhabricatorBoardResponseEngine.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ final class PhabricatorBoardResponseEngine extends Phobject {
77
private $objectPHID;
88
private $visiblePHIDs;
99
private $ordering;
10+
private $sounds;
1011

1112
public function setViewer(PhabricatorUser $viewer) {
1213
$this->viewer = $viewer;
@@ -53,6 +54,15 @@ public function getOrdering() {
5354
return $this->ordering;
5455
}
5556

57+
public function setSounds(array $sounds) {
58+
$this->sounds = $sounds;
59+
return $this;
60+
}
61+
62+
public function getSounds() {
63+
return $this->sounds;
64+
}
65+
5666
public function buildResponse() {
5767
$viewer = $this->getViewer();
5868
$object_phid = $this->getObjectPHID();
@@ -150,6 +160,7 @@ public function buildResponse() {
150160
'columnMaps' => $natural,
151161
'cards' => $cards,
152162
'headers' => $headers,
163+
'sounds' => $this->getSounds(),
153164
);
154165

155166
return id(new AphrontAjaxResponse())

src/applications/project/storage/PhabricatorProjectTrigger.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,18 @@ public function getPreviewEffect() {
245245
->setContent($header);
246246
}
247247

248+
public function getSoundEffects() {
249+
$sounds = array();
250+
251+
foreach ($this->getTriggerRules() as $rule) {
252+
foreach ($rule->getSoundEffects() as $effect) {
253+
$sounds[] = $effect;
254+
}
255+
}
256+
257+
return $sounds;
258+
}
259+
248260

249261
/* -( PhabricatorApplicationTransactionInterface )------------------------- */
250262

0 commit comments

Comments
 (0)