preferences.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. <?php
  2. // Copyright (C) 2010 Combodo SARL
  3. //
  4. // This program is free software; you can redistribute it and/or modify
  5. // it under the terms of the GNU General Public License as published by
  6. // the Free Software Foundation; version 3 of the License.
  7. //
  8. // This program is distributed in the hope that it will be useful,
  9. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. // GNU General Public License for more details.
  12. //
  13. // You should have received a copy of the GNU General Public License
  14. // along with this program; if not, write to the Free Software
  15. // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  16. /**
  17. * User preferences page
  18. * Displays / edit some user preferences
  19. *
  20. * @author Erwan Taloc <erwan.taloc@combodo.com>
  21. * @author Romain Quetiez <romain.quetiez@combodo.com>
  22. * @author Denis Flaven <denis.flaven@combodo.com>
  23. * @license http://www.opensource.org/licenses/gpl-3.0.html LGPL
  24. */
  25. require_once('../approot.inc.php');
  26. require_once(APPROOT.'/application/application.inc.php');
  27. require_once(APPROOT.'/application/itopwebpage.class.inc.php');
  28. require_once(APPROOT.'/application/startup.inc.php');
  29. /**
  30. * Displays the user's changeable preferences
  31. * @param $oP WebPage The web page used for the output
  32. */
  33. function DisplayPreferences($oP)
  34. {
  35. $oAppContext = new ApplicationContext();
  36. $oP->add('<div class="page_header"><h1><img style="vertical-align:middle" src="../images/preferences.png"/>&nbsp;'.Dict::S('UI:Preferences')."</h1></div>\n");
  37. $oP->add('<div id="user_prefs" style="max-width:800px; min-width:400px;">');
  38. //////////////////////////////////////////////////////////////////////////
  39. //
  40. // Favorite Organizations
  41. //
  42. //////////////////////////////////////////////////////////////////////////
  43. $oP->add('<fieldset><legend>'.Dict::S('UI:FavoriteOrganizations').'</legend>');
  44. $oP->p(Dict::S('UI:FavoriteOrganizations+'));
  45. $oP->add('<form method="post">');
  46. // Favorite organizations: the organizations listed in the drop-down menu
  47. $sOQL = ApplicationMenu::GetFavoriteSiloQuery();
  48. $oFilter = DBObjectSearch::FromOQL($sOQL);
  49. $oBlock = new DisplayBlock($oFilter, 'list', false);
  50. $oBlock->Display($oP, 1, array('menu' => false, 'selection_mode' => true, 'selection_type' => 'multiple', 'cssCount'=> '.selectedCount', 'table_id' => 'user_prefs'));
  51. $oP->add($oAppContext->GetForForm());
  52. $oP->add('<input type="hidden" name="operation" value="apply"/>');
  53. $sURL = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?'.$oAppContext->GetForLink();
  54. $oP->add('<p><input type="button" onClick="window.location.href=\''.$sURL.'\'" value="'.Dict::S('UI:Button:Cancel').'"/>');
  55. $oP->add('&nbsp;&nbsp;');
  56. $oP->add('<input type="submit" value="'.Dict::S('UI:Button:Apply').'"/></p>');
  57. $oP->add('</form>');
  58. $oP->add('</fieldset>');
  59. $aFavoriteOrgs = appUserPreferences::GetPref('favorite_orgs', null);
  60. if ($aFavoriteOrgs == null)
  61. {
  62. // All checked
  63. $oP->add_ready_script(
  64. <<<EOF
  65. if ($('#user_prefs table.pagination').length > 0)
  66. {
  67. // paginated display, restore the selection
  68. var pager = $('#user_prefs form .pager');
  69. $(':input[name=selectionMode]', pager).val('negative');
  70. $('#user_prefs table.listResults').trigger('load_selection');
  71. }
  72. else
  73. {
  74. $('#user_prefs table.listResults').trigger('check_all');
  75. }
  76. EOF
  77. );
  78. }
  79. else
  80. {
  81. $sChecked = implode('","', $aFavoriteOrgs);
  82. $oP->add_ready_script(
  83. <<<EOF
  84. var aChecked = ["$sChecked"];
  85. if ($('#user_prefs table.pagination').length > 0)
  86. {
  87. // paginated display, restore the selection
  88. var pager = $('#user_prefs form .pager');
  89. $(':input[name=selectionMode]', pager).val('positive');
  90. for (i=0; i<aChecked.length; i++)
  91. {
  92. pager.append('<input type="hidden" name="storedSelection[]" id="'+aChecked[i]+'" value="'+aChecked[i]+'"/>');
  93. }
  94. $('#user_prefs table.listResults').trigger('load_selection');
  95. }
  96. else
  97. {
  98. $('#user_prefs form :checkbox[name^=selectObject]').each( function()
  99. {
  100. if ($.inArray($(this).val(), aChecked) > -1)
  101. {
  102. $(this).attr('checked', true);
  103. $(this).trigger('change');
  104. }
  105. });
  106. }
  107. EOF
  108. );
  109. }
  110. //////////////////////////////////////////////////////////////////////////
  111. //
  112. // User Language selection
  113. //
  114. //////////////////////////////////////////////////////////////////////////
  115. $oP->add('<fieldset><legend>'.Dict::S('UI:FavoriteLanguage').'</legend>');
  116. $oP->add('<form method="post">');
  117. $aLanguages = Dict::GetLanguages();
  118. $aSortedlang = array();
  119. foreach($aLanguages as $sCode => $aLang)
  120. {
  121. $aSortedlang[$aLang['description']] = $sCode;
  122. }
  123. ksort($aSortedlang);
  124. $oP->add('<p>'.Dict::S('UI:Favorites:SelectYourLanguage').' <select name="language">');
  125. foreach($aSortedlang as $sCode)
  126. {
  127. $sSelected = ($sCode == Dict::GetUserLanguage()) ? 'selected' : '';
  128. $oP->add('<option value="'.$sCode.'" '.$sSelected.'/>'.$aLanguages[$sCode]['description'].' ('.$aLanguages[$sCode]['localized_description'].')</option>');
  129. }
  130. $oP->add('</select></p>');
  131. $oP->add('<input type="hidden" name="operation" value="apply_language"/>');
  132. $oP->add($oAppContext->GetForForm());
  133. $oP->add('<p><input type="button" onClick="window.location.href=\''.$sURL.'\'" value="'.Dict::S('UI:Button:Cancel').'"/>');
  134. $oP->add('&nbsp;&nbsp;');
  135. $oP->add('<input type="submit" value="'.Dict::S('UI:Button:Apply').'"/></p>');
  136. $oP->add('</form>');
  137. $oP->add('</fieldset>');
  138. //////////////////////////////////////////////////////////////////////////
  139. //
  140. // Other (miscellaneous) settings
  141. //
  142. //////////////////////////////////////////////////////////////////////////
  143. $oP->add('<fieldset><legend>'.Dict::S('UI:FavoriteOtherSettings').'</legend>');
  144. $oP->add('<form method="post" onsubmit="return ValidateOtherSettings()">');
  145. $iDefaultPageSize = appUserPreferences::GetPref('default_page_size', MetaModel::GetConfig()->GetMinDisplayLimit());
  146. $oP->add('<p>'.Dict::Format('UI:Favorites:Default_X_ItemsPerPage', '<input id="default_page_size" name="default_page_size" type="text" size="3" value="'.$iDefaultPageSize.'"/><span id="v_default_page_size"></span>').'</p>');
  147. $oP->add('<input type="hidden" name="operation" value="apply_others"/>');
  148. $oP->add($oAppContext->GetForForm());
  149. $oP->add('<p><input type="button" onClick="window.location.href=\''.$sURL.'\'" value="'.Dict::S('UI:Button:Cancel').'"/>');
  150. $oP->add('&nbsp;&nbsp;');
  151. $oP->add('<input id="other_submit" type="submit" value="'.Dict::S('UI:Button:Apply').'"/></p>');
  152. $oP->add('</form>');
  153. $oP->add('</fieldset>');
  154. $oP->add_script(
  155. <<<EOF
  156. function ValidateOtherSettings()
  157. {
  158. var sPageLength = $('#default_page_size').val();
  159. var iPageLength = parseInt(sPageLength , 10);
  160. if (/^[0-9]+$/.test(sPageLength) && (iPageLength > 0))
  161. {
  162. $('#v_default_page_size').html('');
  163. $('#other_submit').removeAttr('disabled');
  164. return true;
  165. }
  166. else
  167. {
  168. $('#v_default_page_size').html('<img src="../images/validation_error.png"/>');
  169. $('#other_submit').attr('disabled', 'disabled');
  170. return false;
  171. }
  172. }
  173. EOF
  174. );
  175. $oP->add('</div>');
  176. $oP->add_ready_script("$('#fav_page_length').bind('keyup change', function(){ ValidateOtherSettings(); })");
  177. }
  178. /////////////////////////////////////////////////////////////////////////////
  179. //
  180. // Main program
  181. //
  182. /////////////////////////////////////////////////////////////////////////////
  183. require_once(APPROOT.'/application/loginwebpage.class.inc.php');
  184. LoginWebPage::DoLogin(); // Check user rights and prompt if needed
  185. $iStep = utils::ReadParam('step', 1);
  186. $oPage = new iTopWebPage(Dict::S('UI:Preferences'));
  187. $sOperation = utils::ReadParam('operation', '');
  188. try
  189. {
  190. switch($sOperation)
  191. {
  192. case 'apply':
  193. $oFilter = DBObjectSearch::FromOQL('SELECT Organization');
  194. $sSelectionMode = utils::ReadParam('selectionMode', '');
  195. $aExceptions = utils::ReadParam('storedSelection', array());
  196. if (($sSelectionMode == 'negative') && (count($aExceptions) == 0))
  197. {
  198. // All Orgs selected
  199. appUserPreferences::SetPref('favorite_orgs', null);
  200. }
  201. else
  202. {
  203. // Some organizations selected... store them
  204. $aSelectOrgs = utils::ReadMultipleSelection($oFilter);
  205. appUserPreferences::SetPref('favorite_orgs', $aSelectOrgs);
  206. }
  207. DisplayPreferences($oPage);
  208. break;
  209. case 'apply_language':
  210. $sLangCode = utils::ReadParam('language', 'EN US');
  211. $oUser = UserRights::GetUserObject();
  212. $oUser->Set('language', $sLangCode);
  213. $oMyChange = MetaModel::NewObject("CMDBChange");
  214. $oMyChange->Set("date", time());
  215. $sUserString = CMDBChange::GetCurrentUserName();
  216. $oMyChange->Set("userinfo", $sUserString);
  217. $iChangeId = $oMyChange->DBInsert();
  218. $oUser->DBUpdateTracked($oMyChange);
  219. // Redirect to force a reload/display of the page with the new language
  220. $oAppContext = new ApplicationContext();
  221. $sURL = utils::GetAbsoluteUrlAppRoot().'pages/preferences.php?'.$oAppContext->GetForLink();
  222. $oPage->add_header('Location: '.$sURL);
  223. break;
  224. case 'apply_others':
  225. $iDefaultPageSize = (int)utils::ReadParam('default_page_size', -1);
  226. if ($iDefaultPageSize > 0)
  227. {
  228. appUserPreferences::SetPref('default_page_size', $iDefaultPageSize);
  229. }
  230. DisplayPreferences($oPage);
  231. break;
  232. case 'display':
  233. default:
  234. DisplayPreferences($oPage);
  235. }
  236. $oPage->output();
  237. }
  238. catch(CoreException $e)
  239. {
  240. require_once(APPROOT.'/setup/setuppage.class.inc.php');
  241. $oP = new SetupPage(Dict::S('UI:PageTitle:FatalError'));
  242. $oP->add("<h1>".Dict::S('UI:FatalErrorMessage')."</h1>\n");
  243. $oP->error(Dict::Format('UI:Error_Details', $e->getHtmlDesc()));
  244. $oP->output();
  245. if (MetaModel::IsLogEnabledIssue())
  246. {
  247. if (MetaModel::IsValidClass('EventIssue'))
  248. {
  249. $oLog = new EventIssue();
  250. $oLog->Set('message', $e->getMessage());
  251. $oLog->Set('userinfo', '');
  252. $oLog->Set('issue', $e->GetIssue());
  253. $oLog->Set('impact', 'Page could not be displayed');
  254. $oLog->Set('callstack', $e->getTrace());
  255. $oLog->Set('data', $e->getContextData());
  256. $oLog->DBInsertNoReload();
  257. }
  258. IssueLog::Error($e->getMessage());
  259. }
  260. // For debugging only
  261. //throw $e;
  262. }
  263. catch(Exception $e)
  264. {
  265. require_once(APPROOT.'/setup/setuppage.class.inc.php');
  266. $oP = new SetupPage(Dict::S('UI:PageTitle:FatalError'));
  267. $oP->add("<h1>".Dict::S('UI:FatalErrorMessage')."</h1>\n");
  268. $oP->error(Dict::Format('UI:Error_Details', $e->getMessage()));
  269. $oP->output();
  270. if (MetaModel::IsLogEnabledIssue())
  271. {
  272. if (MetaModel::IsValidClass('EventIssue'))
  273. {
  274. $oLog = new EventIssue();
  275. $oLog->Set('message', $e->getMessage());
  276. $oLog->Set('userinfo', '');
  277. $oLog->Set('issue', 'PHP Exception');
  278. $oLog->Set('impact', 'Page could not be displayed');
  279. $oLog->Set('callstack', $e->getTrace());
  280. $oLog->Set('data', array());
  281. $oLog->DBInsertNoReload();
  282. }
  283. IssueLog::Error($e->getMessage());
  284. }
  285. }
  286. ?>