Correct a parameter order swap in "diffusion.historyquery" for Mercurial
[phabricator.git] / src / applications / settings / editor / PhabricatorSettingsEditEngine.php
blobb45de2dce1eaf6f2903c2bfb7514b283ce0e393c
1 <?php
3 final class PhabricatorSettingsEditEngine
4 extends PhabricatorEditEngine {
6 const ENGINECONST = 'settings.settings';
8 private $isSelfEdit;
9 private $profileURI;
10 private $settingsPanel;
12 public function setIsSelfEdit($is_self_edit) {
13 $this->isSelfEdit = $is_self_edit;
14 return $this;
17 public function getIsSelfEdit() {
18 return $this->isSelfEdit;
21 public function setProfileURI($profile_uri) {
22 $this->profileURI = $profile_uri;
23 return $this;
26 public function getProfileURI() {
27 return $this->profileURI;
30 public function setSettingsPanel($settings_panel) {
31 $this->settingsPanel = $settings_panel;
32 return $this;
35 public function getSettingsPanel() {
36 return $this->settingsPanel;
39 public function isEngineConfigurable() {
40 return false;
43 public function getEngineName() {
44 return pht('Settings');
47 public function getSummaryHeader() {
48 return pht('Edit Settings Configurations');
51 public function getSummaryText() {
52 return pht('This engine is used to edit settings.');
55 public function getEngineApplicationClass() {
56 return 'PhabricatorSettingsApplication';
59 protected function newEditableObject() {
60 return new PhabricatorUserPreferences();
63 protected function newObjectQuery() {
64 return new PhabricatorUserPreferencesQuery();
67 protected function getObjectCreateTitleText($object) {
68 return pht('Create Settings');
71 protected function getObjectCreateButtonText($object) {
72 return pht('Create Settings');
75 protected function getObjectEditTitleText($object) {
76 $page = $this->getSelectedPage();
78 if ($page) {
79 return $page->getLabel();
82 return pht('Settings');
85 protected function getObjectEditShortText($object) {
86 if (!$object->getUser()) {
87 return pht('Global Defaults');
88 } else {
89 if ($this->getIsSelfEdit()) {
90 return pht('Personal Settings');
91 } else {
92 return pht('Account Settings');
97 protected function getObjectCreateShortText() {
98 return pht('Create Settings');
101 protected function getObjectName() {
102 $page = $this->getSelectedPage();
104 if ($page) {
105 return $page->getLabel();
108 return pht('Settings');
111 protected function getPageHeader($object) {
112 $user = $object->getUser();
113 if ($user) {
114 $text = pht('Edit Settings: %s', $user->getUserName());
115 } else {
116 $text = pht('Edit Global Settings');
119 $header = id(new PHUIHeaderView())
120 ->setHeader($text);
122 return $header;
125 protected function getEditorURI() {
126 throw new PhutilMethodNotImplementedException();
129 protected function getObjectCreateCancelURI($object) {
130 return '/settings/';
133 protected function getObjectViewURI($object) {
134 return $object->getEditURI();
137 protected function getCreateNewObjectPolicy() {
138 return PhabricatorPolicies::POLICY_ADMIN;
141 public function getEffectiveObjectEditCancelURI($object) {
142 if (!$object->getUser()) {
143 return '/settings/';
146 if ($this->getIsSelfEdit()) {
147 return null;
150 if ($this->getProfileURI()) {
151 return $this->getProfileURI();
154 return parent::getEffectiveObjectEditCancelURI($object);
157 protected function newPages($object) {
158 $viewer = $this->getViewer();
159 $user = $object->getUser();
161 $panels = PhabricatorSettingsPanel::getAllDisplayPanels();
163 foreach ($panels as $key => $panel) {
164 if (!($panel instanceof PhabricatorEditEngineSettingsPanel)) {
165 unset($panels[$key]);
166 continue;
169 $panel->setViewer($viewer);
170 if ($user) {
171 $panel->setUser($user);
175 $pages = array();
176 $uris = array();
177 foreach ($panels as $key => $panel) {
178 $uris[$key] = $panel->getPanelURI();
180 $page = $panel->newEditEnginePage();
181 if (!$page) {
182 continue;
184 $pages[] = $page;
187 $more_pages = array(
188 id(new PhabricatorEditPage())
189 ->setKey('extra')
190 ->setLabel(pht('Extra Settings'))
191 ->setIsDefault(true),
194 foreach ($more_pages as $page) {
195 $pages[] = $page;
198 return $pages;
201 protected function buildCustomEditFields($object) {
202 $viewer = $this->getViewer();
203 $settings = PhabricatorSetting::getAllEnabledSettings($viewer);
205 foreach ($settings as $key => $setting) {
206 $setting = clone $setting;
207 $setting->setViewer($viewer);
208 $settings[$key] = $setting;
211 $settings = msortv($settings, 'getSettingOrderVector');
213 $fields = array();
214 foreach ($settings as $setting) {
215 foreach ($setting->newCustomEditFields($object) as $field) {
216 $fields[] = $field;
220 return $fields;
223 protected function getValidationExceptionShortMessage(
224 PhabricatorApplicationTransactionValidationException $ex,
225 PhabricatorEditField $field) {
227 // Settings fields all have the same transaction type so we need to make
228 // sure the transaction is changing the same setting before matching an
229 // error to a given field.
230 $xaction_type = $field->getTransactionType();
231 if ($xaction_type == PhabricatorUserPreferencesTransaction::TYPE_SETTING) {
232 $property = PhabricatorUserPreferencesTransaction::PROPERTY_SETTING;
234 $field_setting = idx($field->getMetadata(), $property);
235 foreach ($ex->getErrors() as $error) {
236 if ($error->getType() !== $xaction_type) {
237 continue;
240 $xaction = $error->getTransaction();
241 if (!$xaction) {
242 continue;
245 $xaction_setting = $xaction->getMetadataValue($property);
246 if ($xaction_setting != $field_setting) {
247 continue;
250 $short_message = $error->getShortMessage();
251 if ($short_message !== null) {
252 return $short_message;
256 return null;
259 return parent::getValidationExceptionShortMessage($ex, $field);
262 protected function newEditFormHeadContent(
263 PhabricatorEditEnginePageState $state) {
265 $content = array();
267 if ($state->getIsSave()) {
268 $content[] = id(new PHUIInfoView())
269 ->setSeverity(PHUIInfoView::SEVERITY_NOTICE)
270 ->appendChild(pht('Changes saved.'));
273 $panel = $this->getSettingsPanel();
274 $content[] = $panel->newSettingsPanelEditFormHeadContent($state);
276 return $content;
279 protected function newEditFormTailContent(
280 PhabricatorEditEnginePageState $state) {
282 $content = array();
284 $panel = $this->getSettingsPanel();
285 $content[] = $panel->newSettingsPanelEditFormTailContent($state);
287 return $content;