Skip to content

Commit 7b718bb

Browse files
committed
Nuance - federate out the design of NuanceSource via NuanceSourceDefinition
Summary: ...and get the basic edit flow "working" for a new NuanceSourceDefinition - the Phabricator Form. ...and fix a dumb bug in the query class so when you redirect to the view page / try to edit an existing NuanceSource you don't fatal. Test Plan: played around with the edit form and it worked! Reviewers: epriestley Reviewed By: epriestley CC: Korvin, epriestley, aran Differential Revision: https://secure.phabricator.com/D7585
1 parent a07f444 commit 7b718bb

13 files changed

+557
-82
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
ALTER TABLE {$NAMESPACE}_nuance.nuance_source
2+
DROP KEY key_type;
3+
4+
ALTER TABLE {$NAMESPACE}_nuance.nuance_source
5+
DROP COLUMN type;
6+
7+
ALTER TABLE {$NAMESPACE}_nuance.nuance_source
8+
ADD type VARCHAR(32) NOT NULL COLLATE utf8_bin AFTER name;
9+
10+
ALTER TABLE {$NAMESPACE}_nuance.nuance_source
11+
ADD KEY `key_type` (type, dateModified);

src/__phutil_library_map__.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -867,6 +867,7 @@
867867
'NuancePHIDTypeQueue' => 'applications/nuance/phid/NuancePHIDTypeQueue.php',
868868
'NuancePHIDTypeRequestor' => 'applications/nuance/phid/NuancePHIDTypeRequestor.php',
869869
'NuancePHIDTypeSource' => 'applications/nuance/phid/NuancePHIDTypeSource.php',
870+
'NuancePhabricatorFormSourceDefinition' => 'applications/nuance/source/NuancePhabricatorFormSourceDefinition.php',
870871
'NuanceQuery' => 'applications/nuance/query/NuanceQuery.php',
871872
'NuanceQueue' => 'applications/nuance/storage/NuanceQueue.php',
872873
'NuanceQueueEditController' => 'applications/nuance/controller/NuanceQueueEditController.php',
@@ -887,13 +888,13 @@
887888
'NuanceRequestorTransactionQuery' => 'applications/nuance/query/NuanceRequestorTransactionQuery.php',
888889
'NuanceRequestorViewController' => 'applications/nuance/controller/NuanceRequestorViewController.php',
889890
'NuanceSource' => 'applications/nuance/storage/NuanceSource.php',
891+
'NuanceSourceDefinition' => 'applications/nuance/source/NuanceSourceDefinition.php',
890892
'NuanceSourceEditController' => 'applications/nuance/controller/NuanceSourceEditController.php',
891893
'NuanceSourceEditor' => 'applications/nuance/editor/NuanceSourceEditor.php',
892894
'NuanceSourceQuery' => 'applications/nuance/query/NuanceSourceQuery.php',
893895
'NuanceSourceTransaction' => 'applications/nuance/storage/NuanceSourceTransaction.php',
894896
'NuanceSourceTransactionComment' => 'applications/nuance/storage/NuanceSourceTransactionComment.php',
895897
'NuanceSourceTransactionQuery' => 'applications/nuance/query/NuanceSourceTransactionQuery.php',
896-
'NuanceSourceType' => 'applications/nuance/constants/NuanceSourceType.php',
897898
'NuanceSourceViewController' => 'applications/nuance/controller/NuanceSourceViewController.php',
898899
'NuanceTransaction' => 'applications/nuance/storage/NuanceTransaction.php',
899900
'OwnersPackageReplyHandler' => 'applications/owners/mail/OwnersPackageReplyHandler.php',
@@ -3238,6 +3239,7 @@
32383239
'NuancePHIDTypeQueue' => 'PhabricatorPHIDType',
32393240
'NuancePHIDTypeRequestor' => 'PhabricatorPHIDType',
32403241
'NuancePHIDTypeSource' => 'PhabricatorPHIDType',
3242+
'NuancePhabricatorFormSourceDefinition' => 'NuanceSourceDefinition',
32413243
'NuanceQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
32423244
'NuanceQueue' =>
32433245
array(
@@ -3266,13 +3268,13 @@
32663268
0 => 'NuanceDAO',
32673269
1 => 'PhabricatorPolicyInterface',
32683270
),
3271+
'NuanceSourceDefinition' => 'Phobject',
32693272
'NuanceSourceEditController' => 'NuanceController',
32703273
'NuanceSourceEditor' => 'PhabricatorApplicationTransactionEditor',
32713274
'NuanceSourceQuery' => 'NuanceQuery',
32723275
'NuanceSourceTransaction' => 'NuanceTransaction',
32733276
'NuanceSourceTransactionComment' => 'PhabricatorApplicationTransactionComment',
32743277
'NuanceSourceTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
3275-
'NuanceSourceType' => 'NuanceConstants',
32763278
'NuanceSourceViewController' => 'NuanceController',
32773279
'NuanceTransaction' => 'PhabricatorApplicationTransaction',
32783280
'OwnersPackageReplyHandler' => 'PhabricatorMailReplyHandler',

src/applications/nuance/application/PhabricatorApplicationNuance.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ public function canUninstall() {
2323
return true;
2424
}
2525

26+
public function getBaseURI() {
27+
return '/nuance/';
28+
}
29+
2630
public function getRoutes() {
2731
return array(
2832
'/nuance/' => array(

src/applications/nuance/constants/NuanceSourceType.php

Lines changed: 0 additions & 22 deletions
This file was deleted.

src/applications/nuance/controller/NuanceSourceEditController.php

Lines changed: 8 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ public function processRequest() {
2828

2929
if ($is_new) {
3030
$source = NuanceSource::initializeNewSource($user);
31-
$title = pht('Create Source');
3231
} else {
3332
$source = id(new NuanceSourceQuery())
3433
->setViewer($user)
@@ -39,71 +38,29 @@ public function processRequest() {
3938
PhabricatorPolicyCapability::CAN_EDIT,
4039
))
4140
->executeOne();
42-
$title = pht('Edit Source');
4341
}
4442

4543
if (!$source) {
4644
return new Aphront404Response();
4745
}
4846

49-
$error_view = null;
50-
$e_name = null;
51-
if ($request->isFormPost()) {
52-
$error_view = id(new AphrontErrorView())
53-
->setTitle(pht('This does not work at all yet.'));
54-
}
47+
$definition = NuanceSourceDefinition::getDefinitionForSource($source);
48+
$definition->setActor($user);
5549

56-
$policies = id(new PhabricatorPolicyQuery())
57-
->setViewer($user)
58-
->setObject($source)
59-
->execute();
50+
$response = $definition->buildEditLayout($request);
51+
if ($response instanceof AphrontResponse) {
52+
return $response;
53+
}
54+
$layout = $response;
6055

6156
$crumbs = $this->buildApplicationCrumbs();
62-
63-
$form = id(new AphrontFormView())
64-
->setUser($user)
65-
->appendChild(
66-
id(new AphrontFormTextControl())
67-
->setLabel(pht('Name'))
68-
->setName('name')
69-
->setError($e_name)
70-
->setValue($source->getName()))
71-
->appendChild(
72-
id(new AphrontFormSelectControl())
73-
->setLabel(pht('Type'))
74-
->setName('type')
75-
->setOptions(NuanceSourceType::getSelectOptions())
76-
->setValue($source->getType()))
77-
->appendChild(
78-
id(new AphrontFormPolicyControl())
79-
->setUser($user)
80-
->setCapability(PhabricatorPolicyCapability::CAN_VIEW)
81-
->setPolicyObject($source)
82-
->setPolicies($policies)
83-
->setName('viewPolicy'))
84-
->appendChild(
85-
id(new AphrontFormPolicyControl())
86-
->setUser($user)
87-
->setCapability(PhabricatorPolicyCapability::CAN_EDIT)
88-
->setPolicyObject($source)
89-
->setPolicies($policies)
90-
->setName('editPolicy'))
91-
->appendChild(
92-
id(new AphrontFormSubmitControl())
93-
->setValue(pht('Save')));
94-
95-
$layout = id(new PHUIObjectBoxView())
96-
->setHeaderText($title)
97-
->setFormError($error_view)
98-
->setForm($form);
99-
10057
return $this->buildApplicationPage(
10158
array(
10259
$crumbs,
10360
$layout,
10461
),
10562
array(
106-
'title' => $title,
63+
'title' => $definition->getEditTitle(),
10764
'device' => true));
10865
}
10966
}

src/applications/nuance/controller/NuanceSourceViewController.php

Lines changed: 99 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,25 +18,119 @@ public function willProcessRequest(array $data) {
1818

1919
public function processRequest() {
2020
$request = $this->getRequest();
21-
$user = $request->getUser();
21+
$viewer = $request->getUser();
2222

2323
$source_id = $this->getSourceID();
2424
$source = id(new NuanceSourceQuery())
25-
->setViewer($user)
25+
->setViewer($viewer)
2626
->withIDs(array($source_id))
2727
->executeOne();
2828

2929
if (!$source) {
3030
return new Aphront404Response();
3131
}
3232

33+
$source_phid = $source->getPHID();
34+
$xactions = id(new NuanceSourceTransactionQuery())
35+
->setViewer($viewer)
36+
->withObjectPHIDs(array($source_phid))
37+
->execute();
38+
39+
$engine = id(new PhabricatorMarkupEngine())
40+
->setViewer($viewer);
41+
42+
$timeline = id(new PhabricatorApplicationTransactionView())
43+
->setUser($viewer)
44+
->setObjectPHID($source_phid)
45+
->setMarkupEngine($engine)
46+
->setTransactions($xactions);
47+
48+
$title = pht('%s', $source->getName());
3349
$crumbs = $this->buildApplicationCrumbs();
34-
$title = 'TODO';
50+
$crumbs->addCrumb(
51+
id(new PhabricatorCrumbView())
52+
->setName($title));
53+
54+
$header = $this->buildHeaderView($source);
55+
$actions = $this->buildActionView($source);
56+
$properties = $this->buildPropertyView($source, $actions);
57+
58+
$box = id(new PHUIObjectBoxView())
59+
->setHeader($header)
60+
->addPropertyList($properties);
3561

3662
return $this->buildApplicationPage(
37-
$crumbs,
63+
array(
64+
$crumbs,
65+
$box,
66+
$timeline,
67+
),
3868
array(
3969
'title' => $title,
40-
'device' => true));
70+
'device' => true,
71+
));
72+
73+
}
74+
75+
76+
private function buildHeaderView(NuanceSource $source) {
77+
$viewer = $this->getRequest()->getUser();
78+
79+
$header = id(new PHUIHeaderView())
80+
->setUser($viewer)
81+
->setHeader($source->getName())
82+
->setPolicyObject($source);
83+
84+
return $header;
85+
}
86+
87+
private function buildActionView(NuanceSource $source) {
88+
$viewer = $this->getRequest()->getUser();
89+
$id = $source->getID();
90+
91+
$actions = id(new PhabricatorActionListView())
92+
->setObjectURI($source->getURI())
93+
->setUser($viewer);
94+
95+
$can_edit = PhabricatorPolicyFilter::hasCapability(
96+
$viewer,
97+
$source,
98+
PhabricatorPolicyCapability::CAN_EDIT);
99+
100+
$actions->addAction(
101+
id(new PhabricatorActionView())
102+
->setName(pht('Edit Source'))
103+
->setIcon('edit')
104+
->setHref($this->getApplicationURI("source/edit/{$id}/"))
105+
->setDisabled(!$can_edit)
106+
->setWorkflow(!$can_edit));
107+
108+
return $actions;
109+
}
110+
111+
private function buildPropertyView(
112+
NuanceSource $source,
113+
PhabricatorActionListView $actions) {
114+
$viewer = $this->getRequest()->getUser();
115+
116+
$properties = id(new PHUIPropertyListView())
117+
->setUser($viewer)
118+
->setObject($source)
119+
->setActionList($actions);
120+
121+
$definition = NuanceSourceDefinition::getDefinitionForSource($source);
122+
$properties->addProperty(
123+
pht('Source Type'),
124+
$definition->getName());
125+
126+
$descriptions = PhabricatorPolicyQuery::renderPolicyDescriptions(
127+
$viewer,
128+
$source);
129+
130+
$properties->addProperty(
131+
pht('Editable By'),
132+
$descriptions[PhabricatorPolicyCapability::CAN_EDIT]);
133+
134+
return $properties;
41135
}
42136
}

src/applications/nuance/editor/NuanceSourceEditor.php

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ final class NuanceSourceEditor
66
public function getTransactionTypes() {
77
$types = parent::getTransactionTypes();
88

9+
$types[] = NuanceSourceTransaction::TYPE_NAME;
10+
911
$types[] = PhabricatorTransactions::TYPE_EDGE;
1012
$types[] = PhabricatorTransactions::TYPE_COMMENT;
1113
$types[] = PhabricatorTransactions::TYPE_VIEW_POLICY;
@@ -14,4 +16,80 @@ public function getTransactionTypes() {
1416
return $types;
1517
}
1618

19+
protected function getCustomTransactionOldValue(
20+
PhabricatorLiskDAO $object,
21+
PhabricatorApplicationTransaction $xaction) {
22+
23+
switch ($xaction->getTransactionType()) {
24+
case NuanceSourceTransaction::TYPE_NAME:
25+
return $object->getName();
26+
}
27+
28+
return parent::getCustomTransactionOldValue($object, $xaction);
29+
}
30+
31+
protected function getCustomTransactionNewValue(
32+
PhabricatorLiskDAO $object,
33+
PhabricatorApplicationTransaction $xaction) {
34+
35+
switch ($xaction->getTransactionType()) {
36+
case NuanceSourceTransaction::TYPE_NAME:
37+
return $xaction->getNewValue();
38+
}
39+
40+
return parent::getCustomTransactionNewValue($object, $xaction);
41+
}
42+
43+
protected function applyCustomInternalTransaction(
44+
PhabricatorLiskDAO $object,
45+
PhabricatorApplicationTransaction $xaction) {
46+
47+
switch ($xaction->getTransactionType()) {
48+
case NuanceSourceTransaction::TYPE_NAME:
49+
$object->setName($xaction->getNewValue());
50+
break;
51+
}
52+
}
53+
54+
protected function applyCustomExternalTransaction(
55+
PhabricatorLiskDAO $object,
56+
PhabricatorApplicationTransaction $xaction) {
57+
58+
switch ($xaction->getTransactionType()) {
59+
case NuanceSourceTransaction::TYPE_NAME:
60+
return;
61+
}
62+
63+
return parent::applyCustomExternalTransaction($object, $xaction);
64+
}
65+
66+
protected function validateTransaction(
67+
PhabricatorLiskDAO $object,
68+
$type,
69+
array $xactions) {
70+
71+
$errors = parent::validateTransaction($object, $type, $xactions);
72+
73+
switch ($type) {
74+
case NuanceSourceTransaction::TYPE_NAME:
75+
$missing = $this->validateIsEmptyTextField(
76+
$object->getName(),
77+
$xactions);
78+
79+
if ($missing) {
80+
$error = new PhabricatorApplicationTransactionValidationError(
81+
$type,
82+
pht('Required'),
83+
pht('Source name is required.'),
84+
nonempty(last($xactions), null));
85+
86+
$error->setIsMissingFieldError(true);
87+
$errors[] = $error;
88+
}
89+
break;
90+
}
91+
92+
return $errors;
93+
}
94+
1795
}

0 commit comments

Comments
 (0)