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. $sURL = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?'.$oAppContext->GetForLink();
  37. $oP->add('<div class="page_header"><h1><img style="vertical-align:middle" src="../images/preferences.png"/>&nbsp;'.Dict::S('UI:Preferences')."</h1></div>\n");
  38. $oP->add('<div id="user_prefs" style="max-width:800px; min-width:400px;">');
  39. //////////////////////////////////////////////////////////////////////////
  40. //
  41. // User Language selection
  42. //
  43. //////////////////////////////////////////////////////////////////////////
  44. $oP->add('<fieldset><legend>'.Dict::S('UI:FavoriteLanguage').'</legend>');
  45. $oP->add('<form method="post">');
  46. $aLanguages = Dict::GetLanguages();
  47. $aSortedlang = array();
  48. foreach($aLanguages as $sCode => $aLang)
  49. {
  50. $aSortedlang[$aLang['description']] = $sCode;
  51. }
  52. ksort($aSortedlang);
  53. $oP->add('<p>'.Dict::S('UI:Favorites:SelectYourLanguage').' <select name="language">');
  54. foreach($aSortedlang as $sCode)
  55. {
  56. $sSelected = ($sCode == Dict::GetUserLanguage()) ? 'selected' : '';
  57. $oP->add('<option value="'.$sCode.'" '.$sSelected.'/>'.$aLanguages[$sCode]['description'].' ('.$aLanguages[$sCode]['localized_description'].')</option>');
  58. }
  59. $oP->add('</select></p>');
  60. $oP->add('<input type="hidden" name="operation" value="apply_language"/>');
  61. $oP->add($oAppContext->GetForForm());
  62. $oP->add('<p><input type="button" onClick="window.location.href=\''.$sURL.'\'" value="'.Dict::S('UI:Button:Cancel').'"/>');
  63. $oP->add('&nbsp;&nbsp;');
  64. $oP->add('<input type="submit" value="'.Dict::S('UI:Button:Apply').'"/></p>');
  65. $oP->add('</form>');
  66. $oP->add('</fieldset>');
  67. //////////////////////////////////////////////////////////////////////////
  68. //
  69. // Other (miscellaneous) settings
  70. //
  71. //////////////////////////////////////////////////////////////////////////
  72. $oP->add('<fieldset><legend>'.Dict::S('UI:FavoriteOtherSettings').'</legend>');
  73. $oP->add('<form method="post" onsubmit="return ValidateOtherSettings()">');
  74. $iDefaultPageSize = appUserPreferences::GetPref('default_page_size', MetaModel::GetConfig()->GetMinDisplayLimit());
  75. $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>');
  76. $oP->add('<input type="hidden" name="operation" value="apply_others"/>');
  77. $oP->add($oAppContext->GetForForm());
  78. $oP->add('<p><input type="button" onClick="window.location.href=\''.$sURL.'\'" value="'.Dict::S('UI:Button:Cancel').'"/>');
  79. $oP->add('&nbsp;&nbsp;');
  80. $oP->add('<input id="other_submit" type="submit" value="'.Dict::S('UI:Button:Apply').'"/></p>');
  81. $oP->add('</form>');
  82. $oP->add('</fieldset>');
  83. $oP->add_script(
  84. <<<EOF
  85. function ValidateOtherSettings()
  86. {
  87. var sPageLength = $('#default_page_size').val();
  88. var iPageLength = parseInt(sPageLength , 10);
  89. if (/^[0-9]+$/.test(sPageLength) && (iPageLength > 0))
  90. {
  91. $('#v_default_page_size').html('');
  92. $('#other_submit').removeAttr('disabled');
  93. return true;
  94. }
  95. else
  96. {
  97. $('#v_default_page_size').html('<img src="../images/validation_error.png"/>');
  98. $('#other_submit').attr('disabled', 'disabled');
  99. return false;
  100. }
  101. }
  102. EOF
  103. );
  104. //////////////////////////////////////////////////////////////////////////
  105. //
  106. // Favorite Organizations
  107. //
  108. //////////////////////////////////////////////////////////////////////////
  109. $oP->add('<fieldset><legend>'.Dict::S('UI:FavoriteOrganizations').'</legend>');
  110. $oP->p(Dict::S('UI:FavoriteOrganizations+'));
  111. $oP->add('<form method="post">');
  112. // Favorite organizations: the organizations listed in the drop-down menu
  113. $sOQL = ApplicationMenu::GetFavoriteSiloQuery();
  114. $oFilter = DBObjectSearch::FromOQL($sOQL);
  115. $oBlock = new DisplayBlock($oFilter, 'list', false);
  116. $oBlock->Display($oP, 1, array('menu' => false, 'selection_mode' => true, 'selection_type' => 'multiple', 'cssCount'=> '.selectedCount', 'table_id' => 'user_prefs'));
  117. $oP->add($oAppContext->GetForForm());
  118. $oP->add('<input type="hidden" name="operation" value="apply"/>');
  119. $oP->add('<p><input type="button" onClick="window.location.href=\''.$sURL.'\'" value="'.Dict::S('UI:Button:Cancel').'"/>');
  120. $oP->add('&nbsp;&nbsp;');
  121. $oP->add('<input type="submit" value="'.Dict::S('UI:Button:Apply').'"/></p>');
  122. $oP->add('</form>');
  123. $oP->add('</fieldset>');
  124. $aFavoriteOrgs = appUserPreferences::GetPref('favorite_orgs', null);
  125. if ($aFavoriteOrgs == null)
  126. {
  127. // All checked
  128. $oP->add_ready_script(
  129. <<<EOF
  130. if ($('#user_prefs table.pagination').length > 0)
  131. {
  132. // paginated display, restore the selection
  133. var pager = $('#user_prefs form .pager');
  134. $(':input[name=selectionMode]', pager).val('negative');
  135. $('#user_prefs table.listResults').trigger('load_selection');
  136. }
  137. else
  138. {
  139. $('#user_prefs table.listResults').trigger('check_all');
  140. }
  141. EOF
  142. );
  143. }
  144. else
  145. {
  146. $sChecked = implode('","', $aFavoriteOrgs);
  147. $oP->add_ready_script(
  148. <<<EOF
  149. var aChecked = ["$sChecked"];
  150. if ($('#user_prefs table.pagination').length > 0)
  151. {
  152. // paginated display, restore the selection
  153. var pager = $('#user_prefs form .pager');
  154. $(':input[name=selectionMode]', pager).val('positive');
  155. for (i=0; i<aChecked.length; i++)
  156. {
  157. pager.append('<input type="hidden" name="storedSelection[]" id="'+aChecked[i]+'" value="'+aChecked[i]+'"/>');
  158. }
  159. $('#user_prefs table.listResults').trigger('load_selection');
  160. }
  161. else
  162. {
  163. $('#user_prefs form :checkbox[name^=selectObject]').each( function()
  164. {
  165. if ($.inArray($(this).val(), aChecked) > -1)
  166. {
  167. $(this).attr('checked', true);
  168. $(this).trigger('change');
  169. }
  170. });
  171. }
  172. EOF
  173. );
  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. ?>