//The build will inline common dependencies into this file. //For any third party dependencies, like jQuery, place them in the lib folder. //Configure loading modules from the lib directory, //except for 'app' ones, which are in a sibling directory. require.config({ // The shim config allows us to configure dependencies for // scripts that do not call define() to register a module shim: { underscore: { exports: '_' }, backbone: { deps: [ 'underscore', 'jquery' ], exports: 'Backbone' } }, paths: { 'jquery': 'lib/jquery', 'jquery.ui.core': 'lib/jquery.ui.core', 'jquery.ui.widget': 'lib/jquery.ui.widget.1.11.1', 'jquery.ui.progressbar': 'lib/jquery.ui.progressbar', 'jquery.ui.tabs': 'lib/jquery.ui.tabs', 'tmpl': 'lib/tmpl.min', 'jquery.iframe-transport': 'lib/jquery.iframe-transport.1.4', 'jquery.fileupload': 'lib/jquery.fileupload.5.42.1', 'jquery.fileupload-process': 'lib/jquery.fileupload.file-processing.1.3.0', 'jquery.fileupload-validate': 'lib/jquery.fileupload.validation.1.1.2', 'jquery.fileupload-ui': 'lib/jquery.fileupload.ui.9.6.0', 'jquery.magnific-popup': 'lib/jquery.magnific-popup', 'js.cookie': 'lib/js.cookie', simplemodal: 'lib/jquery.simplemodal', jstree: 'lib/jstree.1.0', select2: 'lib/select2-3.5.2', underscore: 'lib/underscore', backbone: 'lib/backbone', text: 'lib/text' } }); define([ 'jquery', 'underscore', 'text', // Workaround for r.js, otherwise text.js will not be included 'pinyin-by-unicode' ], function($, _, text, PinyinByUnicode) { return { INFO_TIMEOUT: 10000, // 10 secs for info msg SUCCESS_TIMEOUT: 3000, // 3 secs for success msg ERROR_TIMEOUT: 3000, // 3 secs for error msg strChineseFirstPY: PinyinByUnicode.strChineseFirstPY, getUrl: function(options) { var siteRoot = app.config.siteRoot; switch (options.name) { // File Operations case 'list_lib_dir': return siteRoot + 'ajax/lib/' + options.repo_id + '/dir/'; case 'star_file': return siteRoot + 'ajax/repo/' + options.repo_id + '/file/star/'; case 'unstar_file': return siteRoot + 'ajax/repo/' + options.repo_id + '/file/unstar/'; case 'del_dir': return siteRoot + 'ajax/repo/' + options.repo_id + '/dir/delete/'; case 'del_file': return siteRoot + 'ajax/repo/' + options.repo_id + '/file/delete/'; case 'rename_dir': return siteRoot + 'ajax/repo/' + options.repo_id + '/dir/rename/'; case 'rename_file': return siteRoot + 'ajax/repo/' + options.repo_id + '/file/rename/'; case 'mv_dir': return siteRoot + 'ajax/repo/' + options.repo_id + '/dir/mv/'; case 'cp_dir': return siteRoot + 'ajax/repo/' + options.repo_id + '/dir/cp/'; case 'mv_file': return siteRoot + 'ajax/repo/' + options.repo_id + '/file/mv/'; case 'cp_file': return siteRoot + 'ajax/repo/' + options.repo_id + '/file/cp/'; case 'lock_or_unlock_file': return siteRoot + 'api2/repos/' + options.repo_id + '/file/'; case 'new_dir': return siteRoot + 'ajax/repo/' + options.repo_id + '/dir/new/'; case 'new_file': return siteRoot + 'ajax/repo/' + options.repo_id + '/file/new/'; case 'del_dirents': return siteRoot + 'ajax/repo/' + options.repo_id + '/dirents/delete/'; case 'mv_dirents': return siteRoot + 'ajax/repo/' + options.repo_id + '/dirents/move/'; case 'cp_dirents': return siteRoot + 'ajax/repo/' + options.repo_id + '/dirents/copy/'; case 'get_cp_progress': return siteRoot + 'ajax/cp_progress/'; case 'cancel_cp': return siteRoot + 'ajax/cancel_cp/'; case 'get_file_op_url': return siteRoot + 'ajax/repo/' + options.repo_id + '/file_op_url/'; case 'get_file_uploaded_bytes': return siteRoot + 'ajax/repo/' + options.repo_id + '/get-file-uploaded-bytes/'; case 'get_dirents': return siteRoot + 'ajax/repo/' + options.repo_id + '/dirents/'; // Repos case 'repo_del': return siteRoot + 'ajax/repo/' + options.repo_id + '/remove/'; case 'sub_repo': return siteRoot + 'ajax/repo/' + options.repo_id + '/dir/sub_repo/'; case 'get_my_unenc_repos': return siteRoot + 'ajax/my-unenc-repos/'; case 'unenc_rw_repos': return siteRoot + 'ajax/unenc-rw-repos/'; case 'repo_set_password': return siteRoot + 'repo/set_password/'; case 'get_folder_perm_by_path': return siteRoot + 'ajax/repo/' + options.repo_id + '/get-folder-perm-by-path/'; case 'get_history_changes': return siteRoot + 'ajax/repo/' + options.repo_id + '/history/changes/'; case 'ajax_repo_remove_share': return siteRoot + 'share/ajax/repo_remove_share/'; case 'dir_shared_items': return siteRoot + 'api2/repos/' + options.repo_id + '/dir/shared_items/'; case 'shared_repos': return siteRoot + 'api2/shared-repos/' + options.repo_id + '/'; case 'ajax_unset_inner_pub_repo': return siteRoot + 'ajax/unset-inner-pub-repo/' + options.repo_id + '/'; case 'repo': return siteRoot + 'api2/repos/' + options.repo_id + '/'; case 'repo_owner': return siteRoot + 'api2/repos/' + options.repo_id + '/owner/'; case 'repo_history_limit': return siteRoot + 'api2/repos/' + options.repo_id + '/history-limit/'; case 'repo_shared_download_links': return siteRoot + 'api2/repos/' + options.repo_id + '/download-shared-links/'; case 'repo_shared_download_link': return siteRoot + 'api2/repos/' + options.repo_id + '/download-shared-links/' + options.token + '/'; case 'repo_shared_upload_links': return siteRoot + 'api2/repos/' + options.repo_id + '/upload-shared-links/'; case 'repo_shared_upload_link': return siteRoot + 'api2/repos/' + options.repo_id + '/upload-shared-links/' + options.token + '/'; case 'repo_user_folder_perm': return siteRoot + 'api2/repos/' + options.repo_id + '/user-folder-perm/'; case 'repo_group_folder_perm': return siteRoot + 'api2/repos/' + options.repo_id + '/group-folder-perm/'; case 'repo_change_password': return siteRoot + 'ajax/repo/' + options.repo_id + '/setting/change-passwd/'; // Permission case 'set_user_folder_perm': return siteRoot + 'ajax/repo/' + options.repo_id + '/set-user-folder-perm/'; case 'set_group_folder_perm': return siteRoot + 'ajax/repo/' + options.repo_id + '/set-group-folder-perm/'; // Links case 'get_shared_download_link': return siteRoot + 'share/ajax/get-download-link/'; case 'delete_shared_download_link': return siteRoot + 'share/ajax/link/remove/'; case 'send_shared_download_link': return siteRoot + 'share/link/send/'; case 'send_shared_upload_link': return siteRoot + 'share/upload_link/send/'; case 'delete_shared_upload_link': return siteRoot + 'share/ajax/upload_link/remove/'; case 'get_share_upload_link': return siteRoot + 'share/ajax/get-upload-link/'; // Group case 'groups': return siteRoot + 'api/v2.1/groups/'; case 'group': return siteRoot + 'api/v2.1/groups/' + options.group_id + '/'; case 'group_members': return siteRoot + 'api/v2.1/groups/' + options.group_id + '/members/'; case 'group_member': return siteRoot + 'api/v2.1/groups/' + options.group_id + '/members/' + options.email + '/'; case 'group_member_bulk': return siteRoot + 'api/v2.1/groups/' + options.group_id + '/members/bulk/'; case 'group_import_members': return siteRoot + 'ajax/group/' + options.group_id + '/members/import/'; case 'group_repos': return siteRoot + 'api2/groups/' + options.group_id + '/repos/'; case 'toggle_group_modules': return siteRoot + 'ajax/group/' + options.group_id + '/toggle-modules/'; // Misc case 'thumbnail_create': return siteRoot + 'thumbnail/' + options.repo_id + '/create/'; case 'get_user_contacts': return siteRoot + 'ajax/contacts/'; case 'get_popup_notices': return siteRoot + 'ajax/get_popup_notices/'; case 'set_notices_seen': return siteRoot + 'ajax/set_notices_seen/'; case 'get_unseen_notices_num': return siteRoot + 'ajax/unseen-notices-count/'; case 'set_notice_seen_by_id': return siteRoot + 'ajax/set_notice_seen_by_id/'; case 'toggle_personal_modules': return siteRoot + 'ajax/toggle-personal-modules/'; case 'starred_files': return siteRoot + 'api2/starredfiles/'; case 'events': return siteRoot + 'api2/events/'; case 'search_user': return siteRoot + 'api2/search-user/'; case 'user_profile': return siteRoot + 'profile/' + options.username + '/'; } }, showConfirm: function(title, content, yesCallback) { var $popup = $("#confirm-popup"); var $cont = $('#confirm-con'); var $yesBtn = $('#confirm-yes'); $cont.html('
' + content + '
'); $popup.modal({appendTo: '#main'}); $('#simplemodal-container').css({'height':'auto'}); $yesBtn.click(yesCallback); }, closeModal: function() { $.modal.close(); }, feedback: function(con, type, time) { var time = time || 5000; if ($('.messages').length > 0) { $('.messages').html('' + error + '
'); } else { $('.error', popup).removeClass('hide'); } } } }); } }); var _this = this; $(document).click(function(e) { _this.closePopup(e, $('#user-info-popup'), $('#my-info')); }); }, initNoticePopup: function() { var _this = this; var msg_ct = $("#msg-count"); // for login page, and pages without 'header' such as 'file view' page. if (msg_ct.length == 0) { return false; } // original title var orig_doc_title = document.title; msg_ct.data('orig_doc_title', orig_doc_title); // for 'mark all read' in 'notice list' page var reqUnreadNum = function() { $.ajax({ url: _this.getUrl({name: 'get_unseen_notices_num'}), dataType: 'json', cache: false, success: function(data) { var count = data['count'], num = $('.num', msg_ct); num.html(count); if (count > 0) { num.removeClass('hide'); document.title = '(' + count + ')' + orig_doc_title; } else { num.addClass('hide'); document.title = orig_doc_title; } } }); }; reqUnreadNum(); // request every 30s setInterval(reqUnreadNum, 30*1000); $('#notice-icon').click(function() { var popup = $('#notice-popup'); popup.toggleClass('hide'); if (!popup.hasClass('hide')) { $('.con', popup).css({'max-height':$(window).height() - $('#header').outerHeight() - $('.hd', popup).outerHeight() - 3}); var loading_tip = $('.loading-tip', popup), notice_list = $('#notice-list'); notice_list.addClass('hide'); loading_tip.show(); $('.error', popup).addClass('hide'); $.ajax({ url: _this.getUrl({name: 'get_popup_notices'}), dataType: 'json', success: function(data) { loading_tip.hide(); notice_list.html(data['notice_html']).removeClass('hide'); // set a notice to be read when in it is clicked $('.unread a', notice_list).click(function() { var notice_id = $(this).parents('.unread').data('id'); var link_href = $(this).attr('href'); $.ajax({ url: _this.getUrl({name: 'set_notice_seen_by_id'}) + '?notice_id=' + encodeURIComponent(notice_id), type: 'POST', dataType: 'json', beforeSend: _this.prepareCSRFToken, success: function(data) { location.href = link_href; }, error: function() { location.href = link_href; } }); return false; }); $('.detail', notice_list).click(function() { location.href = $('.brief a', $(this).parent()).attr('href'); }); }, error: function (xhr, textStatus, errorThrown) { if (xhr.responseText) { var error = $.parseJSON(xhr.responseText).error; loading_tip.hide(); if ($('.error', popup).length == 0) { loading_tip.after('' + error + '
'); } else { $('.error', popup).removeClass('hide'); } } } }); } }); $(window).resize(function() { var popup = $('#notice-popup'); if (!popup.hasClass('hide')) { $('.con', popup).css({'max-height':$(window).height() - $('#header').outerHeight() - $('.hd', popup).outerHeight() - 3}); } }); $('#notice-popup .close').click(function() { $('#notice-popup').addClass('hide'); if ($('#notice-list .unread').length > 0) { // set all unread notice to be read $.ajax({ url: _this.getUrl({name: 'set_notices_seen'}), type: 'POST', dataType: 'json', beforeSend: _this.prepareCSRFToken, success: function() { $('.num', msg_ct).html(0).addClass('hide'); document.title = orig_doc_title; } }); } }); $(document).click(function(e) { _this.closePopup(e, $('#notice-popup'), $('#notice-icon')); }); }, closeTopNoticeBar: function () { if (!app.pageOptions.cur_note) { return false; } var new_info_id = app.pageOptions.cur_note.id; $('#info-bar').addClass('hide'); if (navigator.cookieEnabled) { var date = new Date(), cookies = document.cookie.split('; '), info_id_exist = false; date.setTime(date.getTime() + 14*24*60*60*1000); new_info_id += '; expires=' + date.toGMTString() + '; path=' + app.config.siteRoot; for (var i = 0, len = cookies.length; i < len; i++) { if (cookies[i].split('=')[0] == 'info_id') { info_id_exist = true; document.cookie = 'info_id=' + cookies[i].split('=')[1] + new_info_id; break; } } if (!info_id_exist) { document.cookie = 'info_id=' + new_info_id; } } }, contactInputOptionsForSelect2: function() { var _this = this; return { placeholder: gettext("Search users or enter emails"), // with 'tags', the user can directly enter, not just select // tags need ``, not `