Skip to content

Commit 12b9224

Browse files
author
epriestley
committedApr 9, 2019
Make the "Install Dashboard" flow smoother
Summary: Depends on D20362. Ref T13272. Currently, Dashboards have an "Install Dashboard" flow which is pretty janky and only allows you to install things to the home page. Instead, allow users to install things to any valid target (home, favorites, portals, projects). This also provides URIs like `dashboard/install/1/home/personal/` which allow you to link users to an "install a dashboard" page; this may or may not get used. Test Plan: Installed dashboards on home, favorites, projects, and portals. Reviewers: amckinley Reviewed By: amckinley Maniphest Tasks: T13272 Differential Revision: https://secure.phabricator.com/D20364
1 parent eea093b commit 12b9224

17 files changed

+733
-129
lines changed
 

‎resources/celerity/map.php

+6-6
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
'names' => array(
1010
'conpherence.pkg.css' => '3c8a0668',
1111
'conpherence.pkg.js' => '020aebcf',
12-
'core.pkg.css' => 'a1c2d49b',
12+
'core.pkg.css' => '3b565a84',
1313
'core.pkg.js' => 'a568e834',
1414
'differential.pkg.css' => '8d8360fb',
1515
'differential.pkg.js' => '67e02996',
@@ -128,7 +128,7 @@
128128
'rsrc/css/phui/calendar/phui-calendar-list.css' => 'ccd7e4e2',
129129
'rsrc/css/phui/calendar/phui-calendar-month.css' => 'cb758c42',
130130
'rsrc/css/phui/calendar/phui-calendar.css' => 'f11073aa',
131-
'rsrc/css/phui/object-item/phui-oi-big-ui.css' => '534f1757',
131+
'rsrc/css/phui/object-item/phui-oi-big-ui.css' => 'fa74cc35',
132132
'rsrc/css/phui/object-item/phui-oi-color.css' => 'b517bfa0',
133133
'rsrc/css/phui/object-item/phui-oi-drag-ui.css' => 'da15d3dc',
134134
'rsrc/css/phui/object-item/phui-oi-flush-ui.css' => '490e2e2e',
@@ -849,7 +849,7 @@
849849
'phui-lightbox-css' => '4ebf22da',
850850
'phui-list-view-css' => '470b1adb',
851851
'phui-object-box-css' => 'f434b6be',
852-
'phui-oi-big-ui-css' => '534f1757',
852+
'phui-oi-big-ui-css' => 'fa74cc35',
853853
'phui-oi-color-css' => 'b517bfa0',
854854
'phui-oi-drag-ui-css' => 'da15d3dc',
855855
'phui-oi-flush-ui-css' => '490e2e2e',
@@ -1379,9 +1379,6 @@
13791379
'javelin-dom',
13801380
'javelin-fx',
13811381
),
1382-
'534f1757' => array(
1383-
'phui-oi-list-view-css',
1384-
),
13851382
'541f81c3' => array(
13861383
'javelin-install',
13871384
),
@@ -2179,6 +2176,9 @@
21792176
'phabricator-keyboard-shortcut',
21802177
'conpherence-thread-manager',
21812178
),
2179+
'fa74cc35' => array(
2180+
'phui-oi-list-view-css',
2181+
),
21822182
'fdc13e4e' => array(
21832183
'javelin-install',
21842184
),

‎src/__phutil_library_map__.php

+16
Original file line numberDiff line numberDiff line change
@@ -2905,6 +2905,7 @@
29052905
'PhabricatorDashboard' => 'applications/dashboard/storage/PhabricatorDashboard.php',
29062906
'PhabricatorDashboardAddPanelController' => 'applications/dashboard/controller/PhabricatorDashboardAddPanelController.php',
29072907
'PhabricatorDashboardApplication' => 'applications/dashboard/application/PhabricatorDashboardApplication.php',
2908+
'PhabricatorDashboardApplicationInstallWorkflow' => 'applications/dashboard/install/PhabricatorDashboardApplicationInstallWorkflow.php',
29082909
'PhabricatorDashboardArchiveController' => 'applications/dashboard/controller/dashboard/PhabricatorDashboardArchiveController.php',
29092910
'PhabricatorDashboardConsoleController' => 'applications/dashboard/controller/PhabricatorDashboardConsoleController.php',
29102911
'PhabricatorDashboardController' => 'applications/dashboard/controller/PhabricatorDashboardController.php',
@@ -2913,13 +2914,17 @@
29132914
'PhabricatorDashboardDashboardPHIDType' => 'applications/dashboard/phid/PhabricatorDashboardDashboardPHIDType.php',
29142915
'PhabricatorDashboardDatasource' => 'applications/dashboard/typeahead/PhabricatorDashboardDatasource.php',
29152916
'PhabricatorDashboardEditController' => 'applications/dashboard/controller/dashboard/PhabricatorDashboardEditController.php',
2917+
'PhabricatorDashboardFavoritesInstallWorkflow' => 'applications/dashboard/install/PhabricatorDashboardFavoritesInstallWorkflow.php',
2918+
'PhabricatorDashboardHomeInstallWorkflow' => 'applications/dashboard/install/PhabricatorDashboardHomeInstallWorkflow.php',
29162919
'PhabricatorDashboardIconSet' => 'applications/dashboard/icon/PhabricatorDashboardIconSet.php',
29172920
'PhabricatorDashboardInstall' => 'applications/dashboard/storage/PhabricatorDashboardInstall.php',
29182921
'PhabricatorDashboardInstallController' => 'applications/dashboard/controller/dashboard/PhabricatorDashboardInstallController.php',
2922+
'PhabricatorDashboardInstallWorkflow' => 'applications/dashboard/install/PhabricatorDashboardInstallWorkflow.php',
29192923
'PhabricatorDashboardLayoutConfig' => 'applications/dashboard/layoutconfig/PhabricatorDashboardLayoutConfig.php',
29202924
'PhabricatorDashboardListController' => 'applications/dashboard/controller/PhabricatorDashboardListController.php',
29212925
'PhabricatorDashboardMovePanelController' => 'applications/dashboard/controller/PhabricatorDashboardMovePanelController.php',
29222926
'PhabricatorDashboardNgrams' => 'applications/dashboard/storage/PhabricatorDashboardNgrams.php',
2927+
'PhabricatorDashboardObjectInstallWorkflow' => 'applications/dashboard/install/PhabricatorDashboardObjectInstallWorkflow.php',
29232928
'PhabricatorDashboardPanel' => 'applications/dashboard/storage/PhabricatorDashboardPanel.php',
29242929
'PhabricatorDashboardPanelArchiveController' => 'applications/dashboard/controller/PhabricatorDashboardPanelArchiveController.php',
29252930
'PhabricatorDashboardPanelCoreCustomField' => 'applications/dashboard/customfield/PhabricatorDashboardPanelCoreCustomField.php',
@@ -2947,10 +2952,12 @@
29472952
'PhabricatorDashboardPanelViewController' => 'applications/dashboard/controller/PhabricatorDashboardPanelViewController.php',
29482953
'PhabricatorDashboardPortal' => 'applications/dashboard/storage/PhabricatorDashboardPortal.php',
29492954
'PhabricatorDashboardPortalController' => 'applications/dashboard/controller/portal/PhabricatorDashboardPortalController.php',
2955+
'PhabricatorDashboardPortalDatasource' => 'applications/dashboard/typeahead/PhabricatorDashboardPortalDatasource.php',
29502956
'PhabricatorDashboardPortalEditConduitAPIMethod' => 'applications/dashboard/conduit/PhabricatorDashboardPortalEditConduitAPIMethod.php',
29512957
'PhabricatorDashboardPortalEditController' => 'applications/dashboard/controller/portal/PhabricatorDashboardPortalEditController.php',
29522958
'PhabricatorDashboardPortalEditEngine' => 'applications/dashboard/editor/PhabricatorDashboardPortalEditEngine.php',
29532959
'PhabricatorDashboardPortalEditor' => 'applications/dashboard/editor/PhabricatorDashboardPortalEditor.php',
2960+
'PhabricatorDashboardPortalInstallWorkflow' => 'applications/dashboard/install/PhabricatorDashboardPortalInstallWorkflow.php',
29542961
'PhabricatorDashboardPortalListController' => 'applications/dashboard/controller/portal/PhabricatorDashboardPortalListController.php',
29552962
'PhabricatorDashboardPortalMenuItem' => 'applications/dashboard/menuitem/PhabricatorDashboardPortalMenuItem.php',
29562963
'PhabricatorDashboardPortalNameTransaction' => 'applications/dashboard/xaction/portal/PhabricatorDashboardPortalNameTransaction.php',
@@ -2966,6 +2973,7 @@
29662973
'PhabricatorDashboardPortalViewController' => 'applications/dashboard/controller/portal/PhabricatorDashboardPortalViewController.php',
29672974
'PhabricatorDashboardProfileController' => 'applications/dashboard/controller/PhabricatorDashboardProfileController.php',
29682975
'PhabricatorDashboardProfileMenuItem' => 'applications/search/menuitem/PhabricatorDashboardProfileMenuItem.php',
2976+
'PhabricatorDashboardProjectInstallWorkflow' => 'applications/dashboard/install/PhabricatorDashboardProjectInstallWorkflow.php',
29692977
'PhabricatorDashboardQuery' => 'applications/dashboard/query/PhabricatorDashboardQuery.php',
29702978
'PhabricatorDashboardQueryPanelInstallController' => 'applications/dashboard/controller/PhabricatorDashboardQueryPanelInstallController.php',
29712979
'PhabricatorDashboardQueryPanelType' => 'applications/dashboard/paneltype/PhabricatorDashboardQueryPanelType.php',
@@ -8865,6 +8873,7 @@
88658873
),
88668874
'PhabricatorDashboardAddPanelController' => 'PhabricatorDashboardController',
88678875
'PhabricatorDashboardApplication' => 'PhabricatorApplication',
8876+
'PhabricatorDashboardApplicationInstallWorkflow' => 'PhabricatorDashboardInstallWorkflow',
88688877
'PhabricatorDashboardArchiveController' => 'PhabricatorDashboardController',
88698878
'PhabricatorDashboardConsoleController' => 'PhabricatorDashboardController',
88708879
'PhabricatorDashboardController' => 'PhabricatorController',
@@ -8873,13 +8882,17 @@
88738882
'PhabricatorDashboardDashboardPHIDType' => 'PhabricatorPHIDType',
88748883
'PhabricatorDashboardDatasource' => 'PhabricatorTypeaheadDatasource',
88758884
'PhabricatorDashboardEditController' => 'PhabricatorDashboardController',
8885+
'PhabricatorDashboardFavoritesInstallWorkflow' => 'PhabricatorDashboardApplicationInstallWorkflow',
8886+
'PhabricatorDashboardHomeInstallWorkflow' => 'PhabricatorDashboardApplicationInstallWorkflow',
88768887
'PhabricatorDashboardIconSet' => 'PhabricatorIconSet',
88778888
'PhabricatorDashboardInstall' => 'PhabricatorDashboardDAO',
88788889
'PhabricatorDashboardInstallController' => 'PhabricatorDashboardController',
8890+
'PhabricatorDashboardInstallWorkflow' => 'Phobject',
88798891
'PhabricatorDashboardLayoutConfig' => 'Phobject',
88808892
'PhabricatorDashboardListController' => 'PhabricatorDashboardController',
88818893
'PhabricatorDashboardMovePanelController' => 'PhabricatorDashboardController',
88828894
'PhabricatorDashboardNgrams' => 'PhabricatorSearchNgrams',
8895+
'PhabricatorDashboardObjectInstallWorkflow' => 'PhabricatorDashboardInstallWorkflow',
88838896
'PhabricatorDashboardPanel' => array(
88848897
'PhabricatorDashboardDAO',
88858898
'PhabricatorApplicationTransactionInterface',
@@ -8923,10 +8936,12 @@
89238936
'PhabricatorDestructibleInterface',
89248937
),
89258938
'PhabricatorDashboardPortalController' => 'PhabricatorDashboardController',
8939+
'PhabricatorDashboardPortalDatasource' => 'PhabricatorTypeaheadDatasource',
89268940
'PhabricatorDashboardPortalEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod',
89278941
'PhabricatorDashboardPortalEditController' => 'PhabricatorDashboardPortalController',
89288942
'PhabricatorDashboardPortalEditEngine' => 'PhabricatorEditEngine',
89298943
'PhabricatorDashboardPortalEditor' => 'PhabricatorApplicationTransactionEditor',
8944+
'PhabricatorDashboardPortalInstallWorkflow' => 'PhabricatorDashboardObjectInstallWorkflow',
89308945
'PhabricatorDashboardPortalListController' => 'PhabricatorDashboardPortalController',
89318946
'PhabricatorDashboardPortalMenuItem' => 'PhabricatorProfileMenuItem',
89328947
'PhabricatorDashboardPortalNameTransaction' => 'PhabricatorDashboardPortalTransactionType',
@@ -8942,6 +8957,7 @@
89428957
'PhabricatorDashboardPortalViewController' => 'PhabricatorDashboardPortalController',
89438958
'PhabricatorDashboardProfileController' => 'PhabricatorController',
89448959
'PhabricatorDashboardProfileMenuItem' => 'PhabricatorProfileMenuItem',
8960+
'PhabricatorDashboardProjectInstallWorkflow' => 'PhabricatorDashboardObjectInstallWorkflow',
89458961
'PhabricatorDashboardQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
89468962
'PhabricatorDashboardQueryPanelInstallController' => 'PhabricatorDashboardController',
89478963
'PhabricatorDashboardQueryPanelType' => 'PhabricatorDashboardPanelType',

‎src/applications/dashboard/application/PhabricatorDashboardApplication.php

+4-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,10 @@ public function getRoutes() {
4343
'archive/(?P<id>\d+)/' => 'PhabricatorDashboardArchiveController',
4444
'create/' => 'PhabricatorDashboardEditController',
4545
'edit/(?:(?P<id>\d+)/)?' => 'PhabricatorDashboardEditController',
46-
'install/(?:(?P<id>\d+)/)?' => 'PhabricatorDashboardInstallController',
46+
'install/(?P<id>\d+)/'.
47+
'(?:(?P<workflowKey>[^/]+)/'.
48+
'(?:(?P<modeKey>[^/]+)/)?)?' =>
49+
'PhabricatorDashboardInstallController',
4750
'console/' => 'PhabricatorDashboardConsoleController',
4851
'addpanel/(?P<id>\d+)/' => 'PhabricatorDashboardAddPanelController',
4952
'movepanel/(?P<id>\d+)/' => 'PhabricatorDashboardMovePanelController',

‎src/applications/dashboard/controller/dashboard/PhabricatorDashboardInstallController.php

+47-112
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,17 @@
33
final class PhabricatorDashboardInstallController
44
extends PhabricatorDashboardController {
55

6+
private $dashboard;
7+
8+
public function setDashboard(PhabricatorDashboard $dashboard) {
9+
$this->dashboard = $dashboard;
10+
return $this;
11+
}
12+
13+
public function getDashboard() {
14+
return $this->dashboard;
15+
}
16+
617
public function handleRequest(AphrontRequest $request) {
718
$viewer = $request->getViewer();
819
$id = $request->getURIData('id');
@@ -15,126 +26,50 @@ public function handleRequest(AphrontRequest $request) {
1526
return new Aphront404Response();
1627
}
1728

29+
$this->setDashboard($dashboard);
1830
$cancel_uri = $dashboard->getURI();
1931

20-
$home_app = new PhabricatorHomeApplication();
21-
22-
$options = array();
23-
$options['home'] = array(
24-
'personal' =>
25-
array(
26-
'capability' => PhabricatorPolicyCapability::CAN_VIEW,
27-
'application' => $home_app,
28-
'name' => pht('Personal Dashboard'),
29-
'value' => 'personal',
30-
'description' => pht('Places this dashboard as a menu item on home '.
31-
'as a personal menu item. It will only be on your personal '.
32-
'home.'),
33-
),
34-
'global' =>
35-
array(
36-
'capability' => PhabricatorPolicyCapability::CAN_EDIT,
37-
'application' => $home_app,
38-
'name' => pht('Global Dashboard'),
39-
'value' => 'global',
40-
'description' => pht('Places this dashboard as a menu item on home '.
41-
'as a global menu item. It will be available to all users.'),
42-
),
43-
);
44-
45-
46-
$errors = array();
47-
$v_name = null;
48-
if ($request->isFormPost()) {
49-
$menuitem = new PhabricatorDashboardProfileMenuItem();
50-
$dashboard_phid = $dashboard->getPHID();
51-
$home = new PhabricatorHomeApplication();
52-
$v_name = $request->getStr('name');
53-
$v_home = $request->getStr('home');
54-
55-
if ($v_home) {
56-
$application = $options['home'][$v_home]['application'];
57-
$capability = $options['home'][$v_home]['capability'];
58-
59-
$can_edit_home = PhabricatorPolicyFilter::hasCapability(
60-
$viewer,
61-
$application,
62-
$capability);
63-
64-
if (!$can_edit_home) {
65-
$errors[] = pht(
66-
'You do not have permission to install a dashboard on home.');
67-
}
68-
} else {
69-
$errors[] = pht(
70-
'You must select a destination to install this dashboard.');
71-
}
72-
73-
$v_phid = $viewer->getPHID();
74-
if ($v_home == 'global') {
75-
$v_phid = null;
76-
}
77-
78-
if (!$errors) {
79-
$install = PhabricatorProfileMenuItemConfiguration::initializeNewItem(
80-
$home,
81-
$menuitem,
82-
$v_phid);
83-
84-
$install->setMenuItemProperty('dashboardPHID', $dashboard_phid);
85-
$install->setMenuItemProperty('name', $v_name);
86-
$install->setMenuItemOrder(1);
87-
88-
$xactions = array();
89-
90-
$editor = id(new PhabricatorProfileMenuEditor())
91-
->setActor($viewer)
92-
->setContinueOnNoEffect(true)
93-
->setContinueOnMissingFields(true)
94-
->setContentSourceFromRequest($request);
95-
96-
$editor->applyTransactions($install, $xactions);
97-
98-
$view_uri = '/home/menu/view/'.$install->getID().'/';
99-
100-
return id(new AphrontRedirectResponse())->setURI($view_uri);
101-
}
102-
}
32+
$workflow_key = $request->getURIData('workflowKey');
10333

104-
$form = id(new AphrontFormView())
105-
->setUser($viewer)
106-
->appendChild(
107-
id(new AphrontFormTextControl())
108-
->setLabel(pht('Menu Label'))
109-
->setName('name')
110-
->setValue($v_name));
111-
112-
$radio = id(new AphrontFormRadioButtonControl())
113-
->setLabel(pht('Home Menu'))
114-
->setName('home');
115-
116-
foreach ($options['home'] as $type => $option) {
117-
$can_edit = PhabricatorPolicyFilter::hasCapability(
118-
$viewer,
119-
$option['application'],
120-
$option['capability']);
121-
if ($can_edit) {
122-
$radio->addButton(
123-
$option['value'],
124-
$option['name'],
125-
$option['description']);
126-
}
34+
$workflows = PhabricatorDashboardInstallWorkflow::getAllWorkflows();
35+
if (!isset($workflows[$workflow_key])) {
36+
return $this->newWorkflowDialog($dashboard, $workflows);
12737
}
12838

129-
$form->appendChild($radio);
39+
return id(clone $workflows[$workflow_key])
40+
->setRequest($request)
41+
->setViewer($viewer)
42+
->setDashboard($dashboard)
43+
->setMode($request->getURIData('modeKey'))
44+
->handleRequest($request);
45+
}
46+
47+
private function newWorkflowDialog(
48+
PhabricatorDashboard $dashboard,
49+
array $workflows) {
50+
$viewer = $this->getViewer();
51+
$cancel_uri = $dashboard->getURI();
52+
53+
$menu = id(new PHUIObjectItemListView())
54+
->setViewer($viewer)
55+
->setFlush(true)
56+
->setBig(true);
57+
58+
foreach ($workflows as $key => $workflow) {
59+
$item = $workflow->getWorkflowMenuItem();
60+
61+
$item_href = urisprintf('install/%d/%s/', $dashboard->getID(), $key);
62+
$item_href = $this->getApplicationURI($item_href);
63+
$item->setHref($item_href);
64+
65+
$menu->addItem($item);
66+
}
13067

13168
return $this->newDialog()
132-
->setTitle(pht('Install Dashboard'))
133-
->setErrors($errors)
69+
->setTitle(pht('Add Dashboard to Menu'))
13470
->setWidth(AphrontDialogView::WIDTH_FORM)
135-
->appendChild($form->buildLayoutView())
136-
->addCancelButton($cancel_uri)
137-
->addSubmitButton(pht('Install Dashboard'));
71+
->appendChild($menu)
72+
->addCancelButton($cancel_uri);
13873
}
13974

14075
}

‎src/applications/dashboard/controller/dashboard/PhabricatorDashboardViewController.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ private function buildCurtainView(PhabricatorDashboard $dashboard) {
8383

8484
$curtain->addAction(
8585
id(new PhabricatorActionView())
86-
->setName(pht('Install Dashboard'))
86+
->setName(pht('Add Dashboard to Menu'))
8787
->setIcon('fa-wrench')
8888
->setHref($this->getApplicationURI("/install/{$id}/"))
8989
->setWorkflow(true));

0 commit comments

Comments
 (0)
Failed to load comments.