You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

personalInfo.js 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379
  1. /* global OC */
  2. /**
  3. * Copyright (c) 2011, Robin Appelman <icewind1991@gmail.com>
  4. * 2013, Morris Jobke <morris.jobke@gmail.com>
  5. * 2016, Christoph Wurst <christoph@owncloud.com>
  6. * 2017, Arthur Schiwon <blizzz@arthur-schiwon.de>
  7. * 2017, Thomas Citharel <tcit@tcit.fr>
  8. * This file is licensed under the Affero General Public License version 3 or later.
  9. * See the COPYING-README file.
  10. */
  11. OC.Settings = OC.Settings || {};
  12. /**
  13. * The callback will be fired as soon as enter is pressed by the
  14. * user or 1 second after the last data entry
  15. *
  16. * @param callback
  17. * @param allowEmptyValue if this is set to true the callback is also called when the value is empty
  18. */
  19. jQuery.fn.keyUpDelayedOrEnter = function (callback, allowEmptyValue) {
  20. var cb = callback;
  21. var that = this;
  22. this.on('input', _.debounce(function (event) {
  23. // enter is already handled in keypress
  24. if (event.keyCode === 13) {
  25. return;
  26. }
  27. if (allowEmptyValue || that.val() !== '') {
  28. cb(event);
  29. }
  30. }, 1000));
  31. this.keypress(function (event) {
  32. if (event.keyCode === 13 && (allowEmptyValue || that.val() !== '')) {
  33. event.preventDefault();
  34. cb(event);
  35. }
  36. });
  37. };
  38. function updateAvatar (hidedefault) {
  39. var $headerdiv = $('#header .avatardiv'),
  40. $displaydiv = $('#displayavatar .avatardiv'),
  41. user = OC.getCurrentUser();
  42. //Bump avatar avatarversion
  43. oc_userconfig.avatar.version = -(Math.floor(Math.random() * 1000));
  44. if (hidedefault) {
  45. $headerdiv.hide();
  46. $('#header .avatardiv').removeClass('avatardiv-shown');
  47. } else {
  48. $headerdiv.css({'background-color': ''});
  49. $headerdiv.avatar(user.uid, 32, true, false, undefined, user.displayName);
  50. $('#header .avatardiv').addClass('avatardiv-shown');
  51. }
  52. $displaydiv.css({'background-color': ''});
  53. $displaydiv.avatar(user.uid, 145, true, null, function() {
  54. $displaydiv.removeClass('loading');
  55. $('#displayavatar img').show();
  56. if($('#displayavatar img').length === 0 || oc_userconfig.avatar.generated) {
  57. $('#removeavatar').removeClass('inlineblock').addClass('hidden');
  58. } else {
  59. $('#removeavatar').removeClass('hidden').addClass('inlineblock');
  60. }
  61. }, user.displayName);
  62. $('#uploadavatar').prop('disabled', false);
  63. }
  64. function showAvatarCropper () {
  65. var $cropper = $('#cropper');
  66. var $cropperImage = $('<img/>');
  67. $cropperImage.css('opacity', 0); // prevent showing the unresized image
  68. $cropper.children('.inner-container').prepend($cropperImage);
  69. $cropperImage.attr('src',
  70. OC.generateUrl('/avatar/tmp') + '?requesttoken=' + encodeURIComponent(OC.requestToken) + '#' + Math.floor(Math.random() * 1000));
  71. $cropperImage.load(function () {
  72. var img = $cropperImage.get()[0];
  73. var selectSize = Math.min(img.width, img.height);
  74. var offsetX = (img.width - selectSize) / 2;
  75. var offsetY = (img.height - selectSize) / 2;
  76. $cropperImage.Jcrop({
  77. onChange: saveCoords,
  78. onSelect: saveCoords,
  79. aspectRatio: 1,
  80. boxHeight: Math.min(500, $('#app-content').height() -100),
  81. boxWidth: Math.min(500, $('#app-content').width()),
  82. setSelect: [offsetX, offsetY, selectSize, selectSize]
  83. }, function() {
  84. $cropper.show();
  85. });
  86. });
  87. }
  88. function sendCropData () {
  89. cleanCropper();
  90. var cropperData = $('#cropper').data();
  91. var data = {
  92. x: cropperData.x,
  93. y: cropperData.y,
  94. w: cropperData.w,
  95. h: cropperData.h
  96. };
  97. $.post(OC.generateUrl('/avatar/cropped'), {crop: data}, avatarResponseHandler);
  98. }
  99. function saveCoords (c) {
  100. $('#cropper').data(c);
  101. }
  102. function cleanCropper () {
  103. var $cropper = $('#cropper');
  104. $('#displayavatar').show();
  105. $cropper.hide();
  106. $('.jcrop-holder').remove();
  107. $('#cropper img').removeData('Jcrop').removeAttr('style').removeAttr('src');
  108. $('#cropper img').remove();
  109. }
  110. function avatarResponseHandler (data) {
  111. if (typeof data === 'string') {
  112. data = JSON.parse(data);
  113. }
  114. var $warning = $('#avatarform .warning');
  115. $warning.hide();
  116. if (data.status === "success") {
  117. $('#displayavatar .avatardiv').removeClass('icon-loading');
  118. oc_userconfig.avatar.generated = false;
  119. updateAvatar();
  120. } else if (data.data === "notsquare") {
  121. showAvatarCropper();
  122. } else {
  123. $warning.show();
  124. $warning.text(data.data.message);
  125. }
  126. }
  127. $(document).ready(function () {
  128. if($('#pass2').length) {
  129. $('#pass2').showPassword().keyup();
  130. }
  131. var showVerifyDialog = function(dialog, howToVerify, verificationCode) {
  132. var dialogContent = dialog.children('.verification-dialog-content');
  133. dialogContent.children(".explainVerification").text(howToVerify);
  134. dialogContent.children(".verificationCode").text(verificationCode);
  135. dialog.css('display', 'block');
  136. };
  137. $(".verify").click(function (event) {
  138. event.stopPropagation();
  139. var verify = $(this);
  140. var indicator = $(this).children('img');
  141. var accountId = indicator.attr('id');
  142. var status = indicator.data('status');
  143. var onlyVerificationCode = false;
  144. if (parseInt(status) === 1) {
  145. onlyVerificationCode = true;
  146. }
  147. if (indicator.hasClass('verify-action')) {
  148. $.ajax(
  149. OC.generateUrl('/settings/users/{account}/verify', {account: accountId}),
  150. {
  151. method: 'GET',
  152. data: {onlyVerificationCode: onlyVerificationCode}
  153. }
  154. ).done(function (data) {
  155. var dialog = verify.children('.verification-dialog');
  156. showVerifyDialog($(dialog), data.msg, data.code);
  157. indicator.attr('data-origin-title', t('settings', 'Verifying …'));
  158. indicator.attr('src', OC.imagePath('core', 'actions/verifying.svg'));
  159. indicator.data('status', '1');
  160. });
  161. }
  162. });
  163. // When the user clicks anywhere outside of the verification dialog we close it
  164. $(document).click(function(event){
  165. var element = event.target;
  166. var isDialog = $(element).hasClass('verificationCode')
  167. || $(element).hasClass('explainVerification')
  168. || $(element).hasClass('verification-dialog-content')
  169. || $(element).hasClass('verification-dialog');
  170. if (!isDialog) {
  171. $(document).find('.verification-dialog').css('display', 'none');
  172. }
  173. });
  174. var userSettings = new OC.Settings.UserSettings();
  175. var federationSettingsView = new OC.Settings.FederationSettingsView({
  176. el: '#personal-settings',
  177. config: userSettings
  178. });
  179. userSettings.on("sync", function() {
  180. updateAvatar(false);
  181. });
  182. federationSettingsView.render();
  183. var updateLanguage = function () {
  184. if (OC.PasswordConfirmation.requiresPasswordConfirmation()) {
  185. OC.PasswordConfirmation.requirePasswordConfirmation(updateLanguage);
  186. return;
  187. }
  188. var selectedLang = $("#languageinput").val(),
  189. user = OC.getCurrentUser();
  190. $.ajax({
  191. url: OC.linkToOCS('cloud/users', 2) + user['uid'],
  192. method: 'PUT',
  193. data: {
  194. key: 'language',
  195. value: selectedLang
  196. },
  197. success: function() {
  198. location.reload();
  199. },
  200. fail: function() {
  201. OC.Notification.showTemporary(t('settings', 'An error occurred while changing your language. Please reload the page and try again.'));
  202. }
  203. });
  204. };
  205. $("#languageinput").change(updateLanguage);
  206. var updateLocale = function () {
  207. if (OC.PasswordConfirmation.requiresPasswordConfirmation()) {
  208. OC.PasswordConfirmation.requirePasswordConfirmation(updateLocale);
  209. return;
  210. }
  211. var selectedLocale = $("#localeinput").val(),
  212. user = OC.getCurrentUser();
  213. $.ajax({
  214. url: OC.linkToOCS('cloud/users', 2) + user['uid'],
  215. method: 'PUT',
  216. data: {
  217. key: 'locale',
  218. value: selectedLocale
  219. },
  220. success: function() {
  221. moment.locale(selectedLocale);
  222. },
  223. fail: function() {
  224. OC.Notification.showTemporary(t('settings', 'An error occurred while changing your locale. Please reload the page and try again.'));
  225. }
  226. });
  227. };
  228. $("#localeinput").change(updateLocale);
  229. var uploadparms = {
  230. pasteZone: null,
  231. done: function (e, data) {
  232. var response = data;
  233. if (typeof data.result === 'string') {
  234. response = JSON.parse(data.result);
  235. } else if (data.result && data.result.length) {
  236. // fetch response from iframe
  237. response = JSON.parse(data.result[0].body.innerText);
  238. } else {
  239. response = data.result;
  240. }
  241. avatarResponseHandler(response);
  242. },
  243. submit: function(e, data) {
  244. $('#displayavatar img').hide();
  245. $('#displayavatar .avatardiv').addClass('icon-loading');
  246. $('#uploadavatar').prop('disabled', true)
  247. data.formData = _.extend(data.formData || {}, {
  248. requesttoken: OC.requestToken
  249. });
  250. },
  251. fail: function (e, data) {
  252. $('#displayavatar .avatardiv').removeClass('icon-loading');
  253. $('#uploadavatar').prop('disabled', false)
  254. var msg = data.jqXHR.statusText + ' (' + data.jqXHR.status + ')';
  255. if (!_.isUndefined(data.jqXHR.responseJSON) &&
  256. !_.isUndefined(data.jqXHR.responseJSON.data) &&
  257. !_.isUndefined(data.jqXHR.responseJSON.data.message)
  258. ) {
  259. msg = data.jqXHR.responseJSON.data.message;
  260. }
  261. avatarResponseHandler({
  262. data: {
  263. message: msg
  264. }
  265. });
  266. }
  267. };
  268. $('#uploadavatar').fileupload(uploadparms);
  269. $('#selectavatar').click(function () {
  270. OC.dialogs.filepicker(
  271. t('settings', "Select a profile picture"),
  272. function (path) {
  273. $('#displayavatar img').hide();
  274. $('#displayavatar .avatardiv').addClass('icon-loading');
  275. $('#uploadavatar').prop('disabled', true);
  276. $.ajax({
  277. type: "POST",
  278. url: OC.generateUrl('/avatar/'),
  279. data: { path: path }
  280. }).done(avatarResponseHandler)
  281. .fail(function(jqXHR) {
  282. var msg = jqXHR.statusText + ' (' + jqXHR.status + ')';
  283. if (!_.isUndefined(jqXHR.responseJSON) &&
  284. !_.isUndefined(jqXHR.responseJSON.data) &&
  285. !_.isUndefined(jqXHR.responseJSON.data.message)
  286. ) {
  287. msg = jqXHR.responseJSON.data.message;
  288. }
  289. avatarResponseHandler({
  290. data: {
  291. message: msg
  292. }
  293. });
  294. });
  295. },
  296. false,
  297. ["image/png", "image/jpeg"]
  298. );
  299. });
  300. $('#removeavatar').click(function () {
  301. $.ajax({
  302. type: 'DELETE',
  303. url: OC.generateUrl('/avatar/'),
  304. success: function () {
  305. oc_userconfig.avatar.generated = true;
  306. updateAvatar(true);
  307. }
  308. });
  309. });
  310. $('#abortcropperbutton').click(function () {
  311. $('#displayavatar .avatardiv').removeClass('icon-loading');
  312. $('#displayavatar img').show();
  313. $('#uploadavatar').prop('disabled', false);
  314. cleanCropper();
  315. });
  316. $('#sendcropperbutton').click(function () {
  317. sendCropData();
  318. });
  319. // Load the big avatar
  320. var user = OC.getCurrentUser();
  321. $('#avatarform .avatardiv').avatar(user.uid, 145, true, null, function() {
  322. if($('#displayavatar img').length === 0 || oc_userconfig.avatar.generated) {
  323. $('#removeavatar').removeClass('inlineblock').addClass('hidden');
  324. } else {
  325. $('#removeavatar').removeClass('hidden').addClass('inlineblock');
  326. }
  327. }, user.displayName);
  328. });
  329. window.setInterval(function() {
  330. $('#localeexample-time').text(moment().format('LTS'));
  331. $('#localeexample-date').text(moment().format('L'));
  332. $('#localeexample-fdow').text(t('settings', 'Week starts on {fdow}',
  333. {fdow: moment().weekday(0).format('dddd')}));
  334. }, 1000);
  335. OC.Settings.updateAvatar = updateAvatar;