From aaa9509d120524573085e94af9de5cdde83e3271 Mon Sep 17 00:00:00 2001 From: Fatih Acet Date: Sun, 24 Jul 2016 23:45:11 +0300 Subject: ES6ify all the things! --- app/assets/javascripts/LabelManager.js | 110 ++++ app/assets/javascripts/LabelManager.js.coffee | 92 --- app/assets/javascripts/activities.js | 40 ++ app/assets/javascripts/activities.js.coffee | 24 - app/assets/javascripts/admin.js | 64 ++ app/assets/javascripts/admin.js.coffee | 51 -- app/assets/javascripts/api.js | 136 ++++ app/assets/javascripts/api.js.coffee | 122 ---- app/assets/javascripts/application.js | 320 +++++++++ app/assets/javascripts/application.js.coffee | 310 --------- app/assets/javascripts/aside.js | 26 + app/assets/javascripts/aside.js.coffee | 16 - app/assets/javascripts/autosave.js | 63 ++ app/assets/javascripts/autosave.js.coffee | 39 -- app/assets/javascripts/awards_handler.coffee | 372 ----------- app/assets/javascripts/awards_handler.js | 380 +++++++++++ app/assets/javascripts/behaviors/autosize.js | 30 + .../javascripts/behaviors/autosize.js.coffee | 22 - .../javascripts/behaviors/details_behavior.coffee | 15 - .../javascripts/behaviors/details_behavior.js | 15 + app/assets/javascripts/behaviors/quick_submit.js | 58 ++ .../javascripts/behaviors/quick_submit.js.coffee | 56 -- app/assets/javascripts/behaviors/requires_input.js | 45 ++ .../javascripts/behaviors/requires_input.js.coffee | 52 -- .../javascripts/behaviors/toggler_behavior.coffee | 14 - .../javascripts/behaviors/toggler_behavior.js | 10 + app/assets/javascripts/blob/blob_ci_yaml.js | 46 ++ app/assets/javascripts/blob/blob_ci_yaml.js.coffee | 23 - app/assets/javascripts/blob/blob_file_dropzone.js | 62 ++ .../javascripts/blob/blob_file_dropzone.js.coffee | 57 -- .../javascripts/blob/blob_gitignore_selector.js | 23 + .../blob/blob_gitignore_selector.js.coffee | 5 - .../javascripts/blob/blob_gitignore_selectors.js | 25 + .../blob/blob_gitignore_selectors.js.coffee | 17 - .../javascripts/blob/blob_license_selector.js | 28 + .../blob/blob_license_selector.js.coffee | 9 - .../javascripts/blob/blob_license_selectors.js | 25 + .../blob/blob_license_selectors.js.coffee | 17 - app/assets/javascripts/blob/edit_blob.js | 66 ++ app/assets/javascripts/blob/edit_blob.js.coffee | 42 -- app/assets/javascripts/blob/template_selector.js | 74 +++ .../javascripts/blob/template_selector.js.coffee | 60 -- app/assets/javascripts/breakpoints.coffee | 37 -- app/assets/javascripts/breakpoints.js | 68 ++ app/assets/javascripts/broadcast_message.js | 34 + app/assets/javascripts/broadcast_message.js.coffee | 22 - app/assets/javascripts/build.coffee | 114 ---- app/assets/javascripts/build.js | 139 ++++ app/assets/javascripts/build_artifacts.js | 27 + app/assets/javascripts/build_artifacts.js.coffee | 14 - app/assets/javascripts/commit.js | 13 + app/assets/javascripts/commit.js.coffee | 4 - app/assets/javascripts/commit/file.js | 13 + app/assets/javascripts/commit/file.js.coffee | 5 - app/assets/javascripts/commit/image-file.js | 175 +++++ app/assets/javascripts/commit/image-file.js.coffee | 127 ---- app/assets/javascripts/commits.js | 58 ++ app/assets/javascripts/commits.js.coffee | 39 -- app/assets/javascripts/compare.js | 91 +++ app/assets/javascripts/compare.js.coffee | 67 -- app/assets/javascripts/compare_autocomplete.js | 51 ++ .../javascripts/compare_autocomplete.js.coffee | 41 -- app/assets/javascripts/confirm_danger_modal.js | 32 + .../javascripts/confirm_danger_modal.js.coffee | 20 - app/assets/javascripts/copy_to_clipboard.js | 42 ++ app/assets/javascripts/copy_to_clipboard.js.coffee | 37 -- app/assets/javascripts/diff.js | 77 +++ app/assets/javascripts/diff.js.coffee | 51 -- app/assets/javascripts/dispatcher.js | 255 +++++++ app/assets/javascripts/dispatcher.js.coffee | 171 ----- app/assets/javascripts/dropzone_input.js | 219 ++++++ app/assets/javascripts/dropzone_input.js.coffee | 201 ------ app/assets/javascripts/due_date_select.js | 104 +++ app/assets/javascripts/due_date_select.js.coffee | 99 --- app/assets/javascripts/extensions/jquery.js | 14 + app/assets/javascripts/extensions/jquery.js.coffee | 11 - app/assets/javascripts/files_comment_button.js | 141 ++++ .../javascripts/files_comment_button.js.coffee | 98 --- app/assets/javascripts/flash.js | 43 ++ app/assets/javascripts/flash.js.coffee | 28 - app/assets/javascripts/gfm_auto_complete.js | 272 ++++++++ app/assets/javascripts/gfm_auto_complete.js.coffee | 228 ------- app/assets/javascripts/gl_dropdown.js | 705 ++++++++++++++++++++ app/assets/javascripts/gl_dropdown.js.coffee | 638 ------------------ app/assets/javascripts/gl_form.js | 53 ++ app/assets/javascripts/gl_form.js.coffee | 54 -- app/assets/javascripts/graphs/graphs_bundle.js | 7 + .../javascripts/graphs/graphs_bundle.js.coffee | 7 - app/assets/javascripts/graphs/stat_graph.js | 19 + app/assets/javascripts/graphs/stat_graph.js.coffee | 6 - .../javascripts/graphs/stat_graph_contributors.js | 112 ++++ .../graphs/stat_graph_contributors.js.coffee | 71 -- .../graphs/stat_graph_contributors_graph.js | 279 ++++++++ .../graphs/stat_graph_contributors_graph.js.coffee | 173 ----- .../graphs/stat_graph_contributors_util.js | 135 ++++ .../graphs/stat_graph_contributors_util.js.coffee | 98 --- app/assets/javascripts/group_avatar.js | 21 + app/assets/javascripts/group_avatar.js.coffee | 9 - app/assets/javascripts/groups.js | 13 + app/assets/javascripts/groups.js.coffee | 4 - app/assets/javascripts/groups_select.js | 67 ++ app/assets/javascripts/groups_select.js.coffee | 41 -- app/assets/javascripts/importer_status.js | 69 ++ app/assets/javascripts/importer_status.js.coffee | 53 -- app/assets/javascripts/issuable.js | 89 +++ app/assets/javascripts/issuable.js.coffee | 93 --- app/assets/javascripts/issuable_context.js | 69 ++ app/assets/javascripts/issuable_context.js.coffee | 60 -- app/assets/javascripts/issuable_form.js | 136 ++++ app/assets/javascripts/issuable_form.js.coffee | 112 ---- app/assets/javascripts/issue.js | 154 +++++ app/assets/javascripts/issue.js.coffee | 117 ---- app/assets/javascripts/issue_status_select.js | 35 + .../javascripts/issue_status_select.js.coffee | 18 - app/assets/javascripts/issues-bulk-assignment.js | 161 +++++ .../javascripts/issues-bulk-assignment.js.coffee | 128 ---- app/assets/javascripts/labels.js | 44 ++ app/assets/javascripts/labels.js.coffee | 28 - app/assets/javascripts/labels_select.js | 377 +++++++++++ app/assets/javascripts/labels_select.js.coffee | 386 ----------- app/assets/javascripts/layout_nav.js | 27 + app/assets/javascripts/layout_nav.js.coffee | 24 - app/assets/javascripts/lib/chart.js | 7 + app/assets/javascripts/lib/chart.js.coffee | 1 - app/assets/javascripts/lib/cropper.js | 7 + app/assets/javascripts/lib/cropper.js.coffee | 1 - app/assets/javascripts/lib/d3.js | 7 + app/assets/javascripts/lib/d3.js.coffee | 1 - app/assets/javascripts/lib/raphael.js | 13 + app/assets/javascripts/lib/raphael.js.coffee | 3 - app/assets/javascripts/lib/utils/animate.js | 49 ++ app/assets/javascripts/lib/utils/animate.js.coffee | 39 -- app/assets/javascripts/lib/utils/common_utils.js | 60 ++ .../javascripts/lib/utils/common_utils.js.coffee | 68 -- .../javascripts/lib/utils/datetime_utility.js | 36 + .../lib/utils/datetime_utility.js.coffee | 28 - app/assets/javascripts/lib/utils/notify.js | 41 ++ app/assets/javascripts/lib/utils/notify.js.coffee | 35 - app/assets/javascripts/lib/utils/text_utility.js | 112 ++++ .../javascripts/lib/utils/text_utility.js.coffee | 105 --- app/assets/javascripts/lib/utils/type_utility.js | 15 + .../javascripts/lib/utils/type_utility.js.coffee | 9 - app/assets/javascripts/lib/utils/url_utility.js | 64 ++ .../javascripts/lib/utils/url_utility.js.coffee | 52 -- app/assets/javascripts/line_highlighter.js | 115 ++++ app/assets/javascripts/line_highlighter.js.coffee | 148 ----- app/assets/javascripts/logo.js | 54 ++ app/assets/javascripts/logo.js.coffee | 44 -- app/assets/javascripts/markdown_preview.js | 150 +++++ app/assets/javascripts/markdown_preview.js.coffee | 119 ---- app/assets/javascripts/merge_request.js | 105 +++ app/assets/javascripts/merge_request.js.coffee | 82 --- app/assets/javascripts/merge_request_tabs.js | 239 +++++++ .../javascripts/merge_request_tabs.js.coffee | 252 ------- app/assets/javascripts/merge_request_widget.js | 185 ++++++ .../javascripts/merge_request_widget.js.coffee | 143 ---- app/assets/javascripts/merged_buttons.js | 45 ++ app/assets/javascripts/merged_buttons.js.coffee | 30 - app/assets/javascripts/milestone.js | 195 ++++++ app/assets/javascripts/milestone.js.coffee | 146 ---- app/assets/javascripts/milestone_select.js | 151 +++++ app/assets/javascripts/milestone_select.js.coffee | 137 ---- app/assets/javascripts/namespace_select.js | 86 +++ app/assets/javascripts/namespace_select.js.coffee | 56 -- app/assets/javascripts/network/branch-graph.js | 404 ++++++++++++ .../javascripts/network/branch-graph.js.coffee | 340 ---------- app/assets/javascripts/network/network.js | 19 + app/assets/javascripts/network/network.js.coffee | 9 - app/assets/javascripts/network/network_bundle.js | 16 + .../javascripts/network/network_bundle.js.coffee | 17 - app/assets/javascripts/new_branch_form.js | 104 +++ app/assets/javascripts/new_branch_form.js.coffee | 78 --- app/assets/javascripts/new_commit_form.js | 34 + app/assets/javascripts/new_commit_form.js.coffee | 21 - app/assets/javascripts/notes.js | 732 +++++++++++++++++++++ app/assets/javascripts/notes.js.coffee | 694 ------------------- app/assets/javascripts/notifications_dropdown.js | 30 + .../javascripts/notifications_dropdown.js.coffee | 25 - app/assets/javascripts/notifications_form.js | 58 ++ .../javascripts/notifications_form.js.coffee | 49 -- app/assets/javascripts/pager.js | 63 ++ app/assets/javascripts/pager.js.coffee | 44 -- app/assets/javascripts/profile/gl_crop.js | 169 +++++ app/assets/javascripts/profile/gl_crop.js.coffee | 152 ----- app/assets/javascripts/profile/profile.js | 102 +++ app/assets/javascripts/profile/profile.js.coffee | 83 --- app/assets/javascripts/profile/profile_bundle.js | 7 + .../javascripts/profile/profile_bundle.js.coffee | 2 - app/assets/javascripts/project.js | 103 +++ app/assets/javascripts/project.js.coffee | 91 --- app/assets/javascripts/project_avatar.js | 21 + app/assets/javascripts/project_avatar.js.coffee | 9 - app/assets/javascripts/project_find_file.js | 170 +++++ app/assets/javascripts/project_find_file.js.coffee | 125 ---- app/assets/javascripts/project_fork.js | 14 + app/assets/javascripts/project_fork.js.coffee | 5 - app/assets/javascripts/project_import.js | 13 + app/assets/javascripts/project_import.js.coffee | 5 - app/assets/javascripts/project_members.js | 13 + app/assets/javascripts/project_members.js.coffee | 4 - app/assets/javascripts/project_new.js | 40 ++ app/assets/javascripts/project_new.js.coffee | 23 - app/assets/javascripts/project_select.js | 102 +++ app/assets/javascripts/project_select.js.coffee | 72 -- app/assets/javascripts/project_show.js | 9 + app/assets/javascripts/project_show.js.coffee | 3 - app/assets/javascripts/projects_list.js | 48 ++ app/assets/javascripts/projects_list.js.coffee | 36 - app/assets/javascripts/protected_branch_select.js | 72 ++ .../javascripts/protected_branch_select.js.coffee | 40 -- app/assets/javascripts/protected_branches.js | 35 + .../javascripts/protected_branches.js.coffee | 22 - app/assets/javascripts/right_sidebar.js | 201 ++++++ app/assets/javascripts/right_sidebar.js.coffee | 175 ----- app/assets/javascripts/search.js | 93 +++ app/assets/javascripts/search.js.coffee | 75 --- app/assets/javascripts/search_autocomplete.js | 360 ++++++++++ .../javascripts/search_autocomplete.js.coffee | 334 ---------- app/assets/javascripts/shortcuts.js | 97 +++ app/assets/javascripts/shortcuts.js.coffee | 60 -- app/assets/javascripts/shortcuts_blob.coffee | 10 - app/assets/javascripts/shortcuts_blob.js | 28 + .../javascripts/shortcuts_dashboard_navigation.js | 39 ++ .../shortcuts_dashboard_navigation.js.coffee | 14 - app/assets/javascripts/shortcuts_find_file.js | 35 + .../javascripts/shortcuts_find_file.js.coffee | 19 - app/assets/javascripts/shortcuts_issuable.coffee | 53 -- app/assets/javascripts/shortcuts_issuable.js | 75 +++ app/assets/javascripts/shortcuts_navigation.coffee | 23 - app/assets/javascripts/shortcuts_navigation.js | 64 ++ app/assets/javascripts/shortcuts_network.js | 27 + app/assets/javascripts/shortcuts_network.js.coffee | 12 - app/assets/javascripts/sidebar.js | 41 ++ app/assets/javascripts/sidebar.js.coffee | 37 -- app/assets/javascripts/single_file_diff.js | 77 +++ app/assets/javascripts/single_file_diff.js.coffee | 54 -- app/assets/javascripts/star.js | 31 + app/assets/javascripts/star.js.coffee | 24 - app/assets/javascripts/subscription.js | 41 ++ app/assets/javascripts/subscription.js.coffee | 26 - app/assets/javascripts/subscription_select.js | 35 + .../javascripts/subscription_select.js.coffee | 18 - app/assets/javascripts/syntax_highlight.coffee | 20 - app/assets/javascripts/syntax_highlight.js | 18 + app/assets/javascripts/todos.js | 144 ++++ app/assets/javascripts/todos.js.coffee | 110 ---- app/assets/javascripts/tree.js | 65 ++ app/assets/javascripts/tree.js.coffee | 50 -- app/assets/javascripts/u2f/authenticate.js | 89 +++ app/assets/javascripts/u2f/authenticate.js.coffee | 75 --- app/assets/javascripts/u2f/error.js | 27 + app/assets/javascripts/u2f/error.js.coffee | 13 - app/assets/javascripts/u2f/register.js | 87 +++ app/assets/javascripts/u2f/register.js.coffee | 63 -- app/assets/javascripts/u2f/util.js | 13 + app/assets/javascripts/u2f/util.js.coffee | 3 - app/assets/javascripts/user.js | 31 + app/assets/javascripts/user.js.coffee | 17 - app/assets/javascripts/user_tabs.js | 119 ++++ app/assets/javascripts/user_tabs.js.coffee | 156 ----- app/assets/javascripts/users/calendar.js | 192 ++++++ app/assets/javascripts/users/calendar.js.coffee | 194 ------ app/assets/javascripts/users/users_bundle.js | 7 + .../javascripts/users/users_bundle.js.coffee | 2 - app/assets/javascripts/users_select.js | 342 ++++++++++ app/assets/javascripts/users_select.js.coffee | 330 ---------- app/assets/javascripts/wikis.js | 37 ++ app/assets/javascripts/wikis.js.coffee | 19 - app/assets/javascripts/zen_mode.js | 80 +++ app/assets/javascripts/zen_mode.js.coffee | 80 --- 270 files changed, 12695 insertions(+), 10463 deletions(-) create mode 100644 app/assets/javascripts/LabelManager.js delete mode 100644 app/assets/javascripts/LabelManager.js.coffee create mode 100644 app/assets/javascripts/activities.js delete mode 100644 app/assets/javascripts/activities.js.coffee create mode 100644 app/assets/javascripts/admin.js delete mode 100644 app/assets/javascripts/admin.js.coffee create mode 100644 app/assets/javascripts/api.js delete mode 100644 app/assets/javascripts/api.js.coffee create mode 100644 app/assets/javascripts/application.js delete mode 100644 app/assets/javascripts/application.js.coffee create mode 100644 app/assets/javascripts/aside.js delete mode 100644 app/assets/javascripts/aside.js.coffee create mode 100644 app/assets/javascripts/autosave.js delete mode 100644 app/assets/javascripts/autosave.js.coffee delete mode 100644 app/assets/javascripts/awards_handler.coffee create mode 100644 app/assets/javascripts/awards_handler.js create mode 100644 app/assets/javascripts/behaviors/autosize.js delete mode 100644 app/assets/javascripts/behaviors/autosize.js.coffee delete mode 100644 app/assets/javascripts/behaviors/details_behavior.coffee create mode 100644 app/assets/javascripts/behaviors/details_behavior.js create mode 100644 app/assets/javascripts/behaviors/quick_submit.js delete mode 100644 app/assets/javascripts/behaviors/quick_submit.js.coffee create mode 100644 app/assets/javascripts/behaviors/requires_input.js delete mode 100644 app/assets/javascripts/behaviors/requires_input.js.coffee delete mode 100644 app/assets/javascripts/behaviors/toggler_behavior.coffee create mode 100644 app/assets/javascripts/behaviors/toggler_behavior.js create mode 100644 app/assets/javascripts/blob/blob_ci_yaml.js delete mode 100644 app/assets/javascripts/blob/blob_ci_yaml.js.coffee create mode 100644 app/assets/javascripts/blob/blob_file_dropzone.js delete mode 100644 app/assets/javascripts/blob/blob_file_dropzone.js.coffee create mode 100644 app/assets/javascripts/blob/blob_gitignore_selector.js delete mode 100644 app/assets/javascripts/blob/blob_gitignore_selector.js.coffee create mode 100644 app/assets/javascripts/blob/blob_gitignore_selectors.js delete mode 100644 app/assets/javascripts/blob/blob_gitignore_selectors.js.coffee create mode 100644 app/assets/javascripts/blob/blob_license_selector.js delete mode 100644 app/assets/javascripts/blob/blob_license_selector.js.coffee create mode 100644 app/assets/javascripts/blob/blob_license_selectors.js delete mode 100644 app/assets/javascripts/blob/blob_license_selectors.js.coffee create mode 100644 app/assets/javascripts/blob/edit_blob.js delete mode 100644 app/assets/javascripts/blob/edit_blob.js.coffee create mode 100644 app/assets/javascripts/blob/template_selector.js delete mode 100644 app/assets/javascripts/blob/template_selector.js.coffee delete mode 100644 app/assets/javascripts/breakpoints.coffee create mode 100644 app/assets/javascripts/breakpoints.js create mode 100644 app/assets/javascripts/broadcast_message.js delete mode 100644 app/assets/javascripts/broadcast_message.js.coffee delete mode 100644 app/assets/javascripts/build.coffee create mode 100644 app/assets/javascripts/build.js create mode 100644 app/assets/javascripts/build_artifacts.js delete mode 100644 app/assets/javascripts/build_artifacts.js.coffee create mode 100644 app/assets/javascripts/commit.js delete mode 100644 app/assets/javascripts/commit.js.coffee create mode 100644 app/assets/javascripts/commit/file.js delete mode 100644 app/assets/javascripts/commit/file.js.coffee create mode 100644 app/assets/javascripts/commit/image-file.js delete mode 100644 app/assets/javascripts/commit/image-file.js.coffee create mode 100644 app/assets/javascripts/commits.js delete mode 100644 app/assets/javascripts/commits.js.coffee create mode 100644 app/assets/javascripts/compare.js delete mode 100644 app/assets/javascripts/compare.js.coffee create mode 100644 app/assets/javascripts/compare_autocomplete.js delete mode 100644 app/assets/javascripts/compare_autocomplete.js.coffee create mode 100644 app/assets/javascripts/confirm_danger_modal.js delete mode 100644 app/assets/javascripts/confirm_danger_modal.js.coffee create mode 100644 app/assets/javascripts/copy_to_clipboard.js delete mode 100644 app/assets/javascripts/copy_to_clipboard.js.coffee create mode 100644 app/assets/javascripts/diff.js delete mode 100644 app/assets/javascripts/diff.js.coffee create mode 100644 app/assets/javascripts/dispatcher.js delete mode 100644 app/assets/javascripts/dispatcher.js.coffee create mode 100644 app/assets/javascripts/dropzone_input.js delete mode 100644 app/assets/javascripts/dropzone_input.js.coffee create mode 100644 app/assets/javascripts/due_date_select.js delete mode 100644 app/assets/javascripts/due_date_select.js.coffee create mode 100644 app/assets/javascripts/extensions/jquery.js delete mode 100644 app/assets/javascripts/extensions/jquery.js.coffee create mode 100644 app/assets/javascripts/files_comment_button.js delete mode 100644 app/assets/javascripts/files_comment_button.js.coffee create mode 100644 app/assets/javascripts/flash.js delete mode 100644 app/assets/javascripts/flash.js.coffee create mode 100644 app/assets/javascripts/gfm_auto_complete.js delete mode 100644 app/assets/javascripts/gfm_auto_complete.js.coffee create mode 100644 app/assets/javascripts/gl_dropdown.js delete mode 100644 app/assets/javascripts/gl_dropdown.js.coffee create mode 100644 app/assets/javascripts/gl_form.js delete mode 100644 app/assets/javascripts/gl_form.js.coffee create mode 100644 app/assets/javascripts/graphs/graphs_bundle.js delete mode 100644 app/assets/javascripts/graphs/graphs_bundle.js.coffee create mode 100644 app/assets/javascripts/graphs/stat_graph.js delete mode 100644 app/assets/javascripts/graphs/stat_graph.js.coffee create mode 100644 app/assets/javascripts/graphs/stat_graph_contributors.js delete mode 100644 app/assets/javascripts/graphs/stat_graph_contributors.js.coffee create mode 100644 app/assets/javascripts/graphs/stat_graph_contributors_graph.js delete mode 100644 app/assets/javascripts/graphs/stat_graph_contributors_graph.js.coffee create mode 100644 app/assets/javascripts/graphs/stat_graph_contributors_util.js delete mode 100644 app/assets/javascripts/graphs/stat_graph_contributors_util.js.coffee create mode 100644 app/assets/javascripts/group_avatar.js delete mode 100644 app/assets/javascripts/group_avatar.js.coffee create mode 100644 app/assets/javascripts/groups.js delete mode 100644 app/assets/javascripts/groups.js.coffee create mode 100644 app/assets/javascripts/groups_select.js delete mode 100644 app/assets/javascripts/groups_select.js.coffee create mode 100644 app/assets/javascripts/importer_status.js delete mode 100644 app/assets/javascripts/importer_status.js.coffee create mode 100644 app/assets/javascripts/issuable.js delete mode 100644 app/assets/javascripts/issuable.js.coffee create mode 100644 app/assets/javascripts/issuable_context.js delete mode 100644 app/assets/javascripts/issuable_context.js.coffee create mode 100644 app/assets/javascripts/issuable_form.js delete mode 100644 app/assets/javascripts/issuable_form.js.coffee create mode 100644 app/assets/javascripts/issue.js delete mode 100644 app/assets/javascripts/issue.js.coffee create mode 100644 app/assets/javascripts/issue_status_select.js delete mode 100644 app/assets/javascripts/issue_status_select.js.coffee create mode 100644 app/assets/javascripts/issues-bulk-assignment.js delete mode 100644 app/assets/javascripts/issues-bulk-assignment.js.coffee create mode 100644 app/assets/javascripts/labels.js delete mode 100644 app/assets/javascripts/labels.js.coffee create mode 100644 app/assets/javascripts/labels_select.js delete mode 100644 app/assets/javascripts/labels_select.js.coffee create mode 100644 app/assets/javascripts/layout_nav.js delete mode 100644 app/assets/javascripts/layout_nav.js.coffee create mode 100644 app/assets/javascripts/lib/chart.js delete mode 100644 app/assets/javascripts/lib/chart.js.coffee create mode 100644 app/assets/javascripts/lib/cropper.js delete mode 100644 app/assets/javascripts/lib/cropper.js.coffee create mode 100644 app/assets/javascripts/lib/d3.js delete mode 100644 app/assets/javascripts/lib/d3.js.coffee create mode 100644 app/assets/javascripts/lib/raphael.js delete mode 100644 app/assets/javascripts/lib/raphael.js.coffee create mode 100644 app/assets/javascripts/lib/utils/animate.js delete mode 100644 app/assets/javascripts/lib/utils/animate.js.coffee create mode 100644 app/assets/javascripts/lib/utils/common_utils.js delete mode 100644 app/assets/javascripts/lib/utils/common_utils.js.coffee create mode 100644 app/assets/javascripts/lib/utils/datetime_utility.js delete mode 100644 app/assets/javascripts/lib/utils/datetime_utility.js.coffee create mode 100644 app/assets/javascripts/lib/utils/notify.js delete mode 100644 app/assets/javascripts/lib/utils/notify.js.coffee create mode 100644 app/assets/javascripts/lib/utils/text_utility.js delete mode 100644 app/assets/javascripts/lib/utils/text_utility.js.coffee create mode 100644 app/assets/javascripts/lib/utils/type_utility.js delete mode 100644 app/assets/javascripts/lib/utils/type_utility.js.coffee create mode 100644 app/assets/javascripts/lib/utils/url_utility.js delete mode 100644 app/assets/javascripts/lib/utils/url_utility.js.coffee create mode 100644 app/assets/javascripts/line_highlighter.js delete mode 100644 app/assets/javascripts/line_highlighter.js.coffee create mode 100644 app/assets/javascripts/logo.js delete mode 100644 app/assets/javascripts/logo.js.coffee create mode 100644 app/assets/javascripts/markdown_preview.js delete mode 100644 app/assets/javascripts/markdown_preview.js.coffee create mode 100644 app/assets/javascripts/merge_request.js delete mode 100644 app/assets/javascripts/merge_request.js.coffee create mode 100644 app/assets/javascripts/merge_request_tabs.js delete mode 100644 app/assets/javascripts/merge_request_tabs.js.coffee create mode 100644 app/assets/javascripts/merge_request_widget.js delete mode 100644 app/assets/javascripts/merge_request_widget.js.coffee create mode 100644 app/assets/javascripts/merged_buttons.js delete mode 100644 app/assets/javascripts/merged_buttons.js.coffee create mode 100644 app/assets/javascripts/milestone.js delete mode 100644 app/assets/javascripts/milestone.js.coffee create mode 100644 app/assets/javascripts/milestone_select.js delete mode 100644 app/assets/javascripts/milestone_select.js.coffee create mode 100644 app/assets/javascripts/namespace_select.js delete mode 100644 app/assets/javascripts/namespace_select.js.coffee create mode 100644 app/assets/javascripts/network/branch-graph.js delete mode 100644 app/assets/javascripts/network/branch-graph.js.coffee create mode 100644 app/assets/javascripts/network/network.js delete mode 100644 app/assets/javascripts/network/network.js.coffee create mode 100644 app/assets/javascripts/network/network_bundle.js delete mode 100644 app/assets/javascripts/network/network_bundle.js.coffee create mode 100644 app/assets/javascripts/new_branch_form.js delete mode 100644 app/assets/javascripts/new_branch_form.js.coffee create mode 100644 app/assets/javascripts/new_commit_form.js delete mode 100644 app/assets/javascripts/new_commit_form.js.coffee create mode 100644 app/assets/javascripts/notes.js delete mode 100644 app/assets/javascripts/notes.js.coffee create mode 100644 app/assets/javascripts/notifications_dropdown.js delete mode 100644 app/assets/javascripts/notifications_dropdown.js.coffee create mode 100644 app/assets/javascripts/notifications_form.js delete mode 100644 app/assets/javascripts/notifications_form.js.coffee create mode 100644 app/assets/javascripts/pager.js delete mode 100644 app/assets/javascripts/pager.js.coffee create mode 100644 app/assets/javascripts/profile/gl_crop.js delete mode 100644 app/assets/javascripts/profile/gl_crop.js.coffee create mode 100644 app/assets/javascripts/profile/profile.js delete mode 100644 app/assets/javascripts/profile/profile.js.coffee create mode 100644 app/assets/javascripts/profile/profile_bundle.js delete mode 100644 app/assets/javascripts/profile/profile_bundle.js.coffee create mode 100644 app/assets/javascripts/project.js delete mode 100644 app/assets/javascripts/project.js.coffee create mode 100644 app/assets/javascripts/project_avatar.js delete mode 100644 app/assets/javascripts/project_avatar.js.coffee create mode 100644 app/assets/javascripts/project_find_file.js delete mode 100644 app/assets/javascripts/project_find_file.js.coffee create mode 100644 app/assets/javascripts/project_fork.js delete mode 100644 app/assets/javascripts/project_fork.js.coffee create mode 100644 app/assets/javascripts/project_import.js delete mode 100644 app/assets/javascripts/project_import.js.coffee create mode 100644 app/assets/javascripts/project_members.js delete mode 100644 app/assets/javascripts/project_members.js.coffee create mode 100644 app/assets/javascripts/project_new.js delete mode 100644 app/assets/javascripts/project_new.js.coffee create mode 100644 app/assets/javascripts/project_select.js delete mode 100644 app/assets/javascripts/project_select.js.coffee create mode 100644 app/assets/javascripts/project_show.js delete mode 100644 app/assets/javascripts/project_show.js.coffee create mode 100644 app/assets/javascripts/projects_list.js delete mode 100644 app/assets/javascripts/projects_list.js.coffee create mode 100644 app/assets/javascripts/protected_branch_select.js delete mode 100644 app/assets/javascripts/protected_branch_select.js.coffee create mode 100644 app/assets/javascripts/protected_branches.js delete mode 100644 app/assets/javascripts/protected_branches.js.coffee create mode 100644 app/assets/javascripts/right_sidebar.js delete mode 100644 app/assets/javascripts/right_sidebar.js.coffee create mode 100644 app/assets/javascripts/search.js delete mode 100644 app/assets/javascripts/search.js.coffee create mode 100644 app/assets/javascripts/search_autocomplete.js delete mode 100644 app/assets/javascripts/search_autocomplete.js.coffee create mode 100644 app/assets/javascripts/shortcuts.js delete mode 100644 app/assets/javascripts/shortcuts.js.coffee delete mode 100644 app/assets/javascripts/shortcuts_blob.coffee create mode 100644 app/assets/javascripts/shortcuts_blob.js create mode 100644 app/assets/javascripts/shortcuts_dashboard_navigation.js delete mode 100644 app/assets/javascripts/shortcuts_dashboard_navigation.js.coffee create mode 100644 app/assets/javascripts/shortcuts_find_file.js delete mode 100644 app/assets/javascripts/shortcuts_find_file.js.coffee delete mode 100644 app/assets/javascripts/shortcuts_issuable.coffee create mode 100644 app/assets/javascripts/shortcuts_issuable.js delete mode 100644 app/assets/javascripts/shortcuts_navigation.coffee create mode 100644 app/assets/javascripts/shortcuts_navigation.js create mode 100644 app/assets/javascripts/shortcuts_network.js delete mode 100644 app/assets/javascripts/shortcuts_network.js.coffee create mode 100644 app/assets/javascripts/sidebar.js delete mode 100644 app/assets/javascripts/sidebar.js.coffee create mode 100644 app/assets/javascripts/single_file_diff.js delete mode 100644 app/assets/javascripts/single_file_diff.js.coffee create mode 100644 app/assets/javascripts/star.js delete mode 100644 app/assets/javascripts/star.js.coffee create mode 100644 app/assets/javascripts/subscription.js delete mode 100644 app/assets/javascripts/subscription.js.coffee create mode 100644 app/assets/javascripts/subscription_select.js delete mode 100644 app/assets/javascripts/subscription_select.js.coffee delete mode 100644 app/assets/javascripts/syntax_highlight.coffee create mode 100644 app/assets/javascripts/syntax_highlight.js create mode 100644 app/assets/javascripts/todos.js delete mode 100644 app/assets/javascripts/todos.js.coffee create mode 100644 app/assets/javascripts/tree.js delete mode 100644 app/assets/javascripts/tree.js.coffee create mode 100644 app/assets/javascripts/u2f/authenticate.js delete mode 100644 app/assets/javascripts/u2f/authenticate.js.coffee create mode 100644 app/assets/javascripts/u2f/error.js delete mode 100644 app/assets/javascripts/u2f/error.js.coffee create mode 100644 app/assets/javascripts/u2f/register.js delete mode 100644 app/assets/javascripts/u2f/register.js.coffee create mode 100644 app/assets/javascripts/u2f/util.js delete mode 100644 app/assets/javascripts/u2f/util.js.coffee create mode 100644 app/assets/javascripts/user.js delete mode 100644 app/assets/javascripts/user.js.coffee create mode 100644 app/assets/javascripts/user_tabs.js delete mode 100644 app/assets/javascripts/user_tabs.js.coffee create mode 100644 app/assets/javascripts/users/calendar.js delete mode 100644 app/assets/javascripts/users/calendar.js.coffee create mode 100644 app/assets/javascripts/users/users_bundle.js delete mode 100644 app/assets/javascripts/users/users_bundle.js.coffee create mode 100644 app/assets/javascripts/users_select.js delete mode 100644 app/assets/javascripts/users_select.js.coffee create mode 100644 app/assets/javascripts/wikis.js delete mode 100644 app/assets/javascripts/wikis.js.coffee create mode 100644 app/assets/javascripts/zen_mode.js delete mode 100644 app/assets/javascripts/zen_mode.js.coffee (limited to 'app/assets/javascripts') diff --git a/app/assets/javascripts/LabelManager.js b/app/assets/javascripts/LabelManager.js new file mode 100644 index 00000000000..151455ce4a3 --- /dev/null +++ b/app/assets/javascripts/LabelManager.js @@ -0,0 +1,110 @@ +(function() { + this.LabelManager = (function() { + LabelManager.prototype.errorMessage = 'Unable to update label prioritization at this time'; + + function LabelManager(opts) { + var ref, ref1, ref2; + if (opts == null) { + opts = {}; + } + this.togglePriorityButton = (ref = opts.togglePriorityButton) != null ? ref : $('.js-toggle-priority'), this.prioritizedLabels = (ref1 = opts.prioritizedLabels) != null ? ref1 : $('.js-prioritized-labels'), this.otherLabels = (ref2 = opts.otherLabels) != null ? ref2 : $('.js-other-labels'); + this.prioritizedLabels.sortable({ + items: 'li', + placeholder: 'list-placeholder', + axis: 'y', + update: this.onPrioritySortUpdate.bind(this) + }); + this.bindEvents(); + } + + LabelManager.prototype.bindEvents = function() { + return this.togglePriorityButton.on('click', this, this.onTogglePriorityClick); + }; + + LabelManager.prototype.onTogglePriorityClick = function(e) { + var $btn, $label, $tooltip, _this, action; + e.preventDefault(); + _this = e.data; + $btn = $(e.currentTarget); + $label = $("#" + ($btn.data('domId'))); + action = $btn.parents('.js-prioritized-labels').length ? 'remove' : 'add'; + $tooltip = $("#" + ($btn.find('.has-tooltip:visible').attr('aria-describedby'))); + $tooltip.tooltip('destroy'); + return _this.toggleLabelPriority($label, action); + }; + + LabelManager.prototype.toggleLabelPriority = function($label, action, persistState) { + var $from, $target, _this, url, xhr; + if (persistState == null) { + persistState = true; + } + _this = this; + url = $label.find('.js-toggle-priority').data('url'); + $target = this.prioritizedLabels; + $from = this.otherLabels; + if (action === 'remove') { + $target = this.otherLabels; + $from = this.prioritizedLabels; + } + if ($from.find('li').length === 1) { + $from.find('.empty-message').removeClass('hidden'); + } + if (!$target.find('li').length) { + $target.find('.empty-message').addClass('hidden'); + } + $label.detach().appendTo($target); + if (!persistState) { + return; + } + if (action === 'remove') { + xhr = $.ajax({ + url: url, + type: 'DELETE' + }); + if (!$from.find('li').length) { + $from.find('.empty-message').removeClass('hidden'); + } + } else { + xhr = this.savePrioritySort($label, action); + } + return xhr.fail(this.rollbackLabelPosition.bind(this, $label, action)); + }; + + LabelManager.prototype.onPrioritySortUpdate = function() { + var xhr; + xhr = this.savePrioritySort(); + return xhr.fail(function() { + return new Flash(this.errorMessage, 'alert'); + }); + }; + + LabelManager.prototype.savePrioritySort = function() { + return $.post({ + url: this.prioritizedLabels.data('url'), + data: { + label_ids: this.getSortedLabelsIds() + } + }); + }; + + LabelManager.prototype.rollbackLabelPosition = function($label, originalAction) { + var action; + action = originalAction === 'remove' ? 'add' : 'remove'; + this.toggleLabelPriority($label, action, false); + return new Flash(this.errorMessage, 'alert'); + }; + + LabelManager.prototype.getSortedLabelsIds = function() { + var sortedIds; + sortedIds = []; + this.prioritizedLabels.find('li').each(function() { + return sortedIds.push($(this).data('id')); + }); + return sortedIds; + }; + + return LabelManager; + + })(); + +}).call(this); diff --git a/app/assets/javascripts/LabelManager.js.coffee b/app/assets/javascripts/LabelManager.js.coffee deleted file mode 100644 index 6d8faba40d7..00000000000 --- a/app/assets/javascripts/LabelManager.js.coffee +++ /dev/null @@ -1,92 +0,0 @@ -class @LabelManager - errorMessage: 'Unable to update label prioritization at this time' - - constructor: (opts = {}) -> - # Defaults - { - @togglePriorityButton = $('.js-toggle-priority') - @prioritizedLabels = $('.js-prioritized-labels') - @otherLabels = $('.js-other-labels') - } = opts - - @prioritizedLabels.sortable( - items: 'li' - placeholder: 'list-placeholder' - axis: 'y' - update: @onPrioritySortUpdate.bind(@) - ) - - @bindEvents() - - bindEvents: -> - @togglePriorityButton.on 'click', @, @onTogglePriorityClick - - onTogglePriorityClick: (e) -> - e.preventDefault() - _this = e.data - $btn = $(e.currentTarget) - $label = $("##{$btn.data('domId')}") - action = if $btn.parents('.js-prioritized-labels').length then 'remove' else 'add' - - # Make sure tooltip will hide - $tooltip = $ "##{$btn.find('.has-tooltip:visible').attr('aria-describedby')}" - $tooltip.tooltip 'destroy' - - _this.toggleLabelPriority($label, action) - - toggleLabelPriority: ($label, action, persistState = true) -> - _this = @ - url = $label.find('.js-toggle-priority').data 'url' - - $target = @prioritizedLabels - $from = @otherLabels - - # Optimistic update - if action is 'remove' - $target = @otherLabels - $from = @prioritizedLabels - - if $from.find('li').length is 1 - $from.find('.empty-message').removeClass('hidden') - - if not $target.find('li').length - $target.find('.empty-message').addClass('hidden') - - $label.detach().appendTo($target) - - # Return if we are not persisting state - return unless persistState - - if action is 'remove' - xhr = $.ajax url: url, type: 'DELETE' - - # Restore empty message - $from.find('.empty-message').removeClass('hidden') unless $from.find('li').length - else - xhr = @savePrioritySort($label, action) - - xhr.fail @rollbackLabelPosition.bind(@, $label, action) - - onPrioritySortUpdate: -> - xhr = @savePrioritySort() - - xhr.fail -> - new Flash(@errorMessage, 'alert') - - savePrioritySort: () -> - $.post - url: @prioritizedLabels.data('url') - data: - label_ids: @getSortedLabelsIds() - - rollbackLabelPosition: ($label, originalAction)-> - action = if originalAction is 'remove' then 'add' else 'remove' - @toggleLabelPriority($label, action, false) - - new Flash(@errorMessage, 'alert') - - getSortedLabelsIds: -> - sortedIds = [] - @prioritizedLabels.find('li').each -> - sortedIds.push $(@).data 'id' - sortedIds diff --git a/app/assets/javascripts/activities.js b/app/assets/javascripts/activities.js new file mode 100644 index 00000000000..1ab3c2197d8 --- /dev/null +++ b/app/assets/javascripts/activities.js @@ -0,0 +1,40 @@ +(function() { + this.Activities = (function() { + function Activities() { + Pager.init(20, true, false, this.updateTooltips); + $(".event-filter-link").on("click", (function(_this) { + return function(event) { + event.preventDefault(); + _this.toggleFilter($(event.currentTarget)); + return _this.reloadActivities(); + }; + })(this)); + } + + Activities.prototype.updateTooltips = function() { + return gl.utils.localTimeAgo($('.js-timeago', '#activity')); + }; + + Activities.prototype.reloadActivities = function() { + $(".content_list").html(''); + return Pager.init(20, true); + }; + + Activities.prototype.toggleFilter = function(sender) { + var event_filters, filter; + $('.event-filter .active').removeClass("active"); + event_filters = $.cookie("event_filter"); + filter = sender.attr("id").split("_")[0]; + $.cookie("event_filter", (event_filters !== filter ? filter : ""), { + path: '/' + }); + if (event_filters !== filter) { + return sender.closest('li').toggleClass("active"); + } + }; + + return Activities; + + })(); + +}).call(this); diff --git a/app/assets/javascripts/activities.js.coffee b/app/assets/javascripts/activities.js.coffee deleted file mode 100644 index ed5a5d0260c..00000000000 --- a/app/assets/javascripts/activities.js.coffee +++ /dev/null @@ -1,24 +0,0 @@ -class @Activities - constructor: -> - Pager.init 20, true, false, @updateTooltips - $(".event-filter-link").on "click", (event) => - event.preventDefault() - @toggleFilter($(event.currentTarget)) - @reloadActivities() - - updateTooltips: -> - gl.utils.localTimeAgo($('.js-timeago', '#activity')) - - reloadActivities: -> - $(".content_list").html '' - Pager.init 20, true - - - toggleFilter: (sender) -> - $('.event-filter .active').removeClass "active" - event_filters = $.cookie("event_filter") - filter = sender.attr("id").split("_")[0] - $.cookie "event_filter", (if event_filters isnt filter then filter else ""), { path: '/' } - - if event_filters isnt filter - sender.closest('li').toggleClass "active" diff --git a/app/assets/javascripts/admin.js b/app/assets/javascripts/admin.js new file mode 100644 index 00000000000..f8460beb5d2 --- /dev/null +++ b/app/assets/javascripts/admin.js @@ -0,0 +1,64 @@ +(function() { + this.Admin = (function() { + function Admin() { + var modal, showBlacklistType; + $('input#user_force_random_password').on('change', function(elem) { + var elems; + elems = $('#user_password, #user_password_confirmation'); + if ($(this).attr('checked')) { + return elems.val('').attr('disabled', true); + } else { + return elems.removeAttr('disabled'); + } + }); + $('body').on('click', '.js-toggle-colors-link', function(e) { + e.preventDefault(); + return $('.js-toggle-colors-container').toggle(); + }); + $('.log-tabs a').click(function(e) { + e.preventDefault(); + return $(this).tab('show'); + }); + $('.log-bottom').click(function(e) { + var visible_log; + e.preventDefault(); + visible_log = $(".file-content:visible"); + return visible_log.animate({ + scrollTop: visible_log.find('ol').height() + }, "fast"); + }); + modal = $('.change-owner-holder'); + $('.change-owner-link').bind("click", function(e) { + e.preventDefault(); + $(this).hide(); + return modal.show(); + }); + $('.change-owner-cancel-link').bind("click", function(e) { + e.preventDefault(); + modal.hide(); + return $('.change-owner-link').show(); + }); + $('li.project_member').bind('ajax:success', function() { + return Turbolinks.visit(location.href); + }); + $('li.group_member').bind('ajax:success', function() { + return Turbolinks.visit(location.href); + }); + showBlacklistType = function() { + if ($("input[name='blacklist_type']:checked").val() === 'file') { + $('.blacklist-file').show(); + return $('.blacklist-raw').hide(); + } else { + $('.blacklist-file').hide(); + return $('.blacklist-raw').show(); + } + }; + $("input[name='blacklist_type']").click(showBlacklistType); + showBlacklistType(); + } + + return Admin; + + })(); + +}).call(this); diff --git a/app/assets/javascripts/admin.js.coffee b/app/assets/javascripts/admin.js.coffee deleted file mode 100644 index 90c09619f8c..00000000000 --- a/app/assets/javascripts/admin.js.coffee +++ /dev/null @@ -1,51 +0,0 @@ -class @Admin - constructor: -> - $('input#user_force_random_password').on 'change', (elem) -> - elems = $('#user_password, #user_password_confirmation') - - if $(@).attr 'checked' - elems.val('').attr 'disabled', true - else - elems.removeAttr 'disabled' - - $('body').on 'click', '.js-toggle-colors-link', (e) -> - e.preventDefault() - $('.js-toggle-colors-container').toggle() - - $('.log-tabs a').click (e) -> - e.preventDefault() - $(this).tab('show') - - $('.log-bottom').click (e) -> - e.preventDefault() - visible_log = $(".file-content:visible") - visible_log.animate({ scrollTop: visible_log.find('ol').height() }, "fast") - - modal = $('.change-owner-holder') - - $('.change-owner-link').bind "click", (e) -> - e.preventDefault() - $(this).hide() - modal.show() - - $('.change-owner-cancel-link').bind "click", (e) -> - e.preventDefault() - modal.hide() - $('.change-owner-link').show() - - $('li.project_member').bind 'ajax:success', -> - Turbolinks.visit(location.href) - - $('li.group_member').bind 'ajax:success', -> - Turbolinks.visit(location.href) - - showBlacklistType = -> - if $("input[name='blacklist_type']:checked").val() == 'file' - $('.blacklist-file').show() - $('.blacklist-raw').hide() - else - $('.blacklist-file').hide() - $('.blacklist-raw').show() - - $("input[name='blacklist_type']").click showBlacklistType - showBlacklistType() diff --git a/app/assets/javascripts/api.js b/app/assets/javascripts/api.js new file mode 100644 index 00000000000..49c2ac0dac3 --- /dev/null +++ b/app/assets/javascripts/api.js @@ -0,0 +1,136 @@ +(function() { + this.Api = { + groupsPath: "/api/:version/groups.json", + groupPath: "/api/:version/groups/:id.json", + namespacesPath: "/api/:version/namespaces.json", + groupProjectsPath: "/api/:version/groups/:id/projects.json", + projectsPath: "/api/:version/projects.json?simple=true", + labelsPath: "/api/:version/projects/:id/labels", + licensePath: "/api/:version/licenses/:key", + gitignorePath: "/api/:version/gitignores/:key", + gitlabCiYmlPath: "/api/:version/gitlab_ci_ymls/:key", + group: function(group_id, callback) { + var url; + url = Api.buildUrl(Api.groupPath); + url = url.replace(':id', group_id); + return $.ajax({ + url: url, + data: { + private_token: gon.api_token + }, + dataType: "json" + }).done(function(group) { + return callback(group); + }); + }, + groups: function(query, skip_ldap, callback) { + var url; + url = Api.buildUrl(Api.groupsPath); + return $.ajax({ + url: url, + data: { + private_token: gon.api_token, + search: query, + per_page: 20 + }, + dataType: "json" + }).done(function(groups) { + return callback(groups); + }); + }, + namespaces: function(query, callback) { + var url; + url = Api.buildUrl(Api.namespacesPath); + return $.ajax({ + url: url, + data: { + private_token: gon.api_token, + search: query, + per_page: 20 + }, + dataType: "json" + }).done(function(namespaces) { + return callback(namespaces); + }); + }, + projects: function(query, order, callback) { + var url; + url = Api.buildUrl(Api.projectsPath); + return $.ajax({ + url: url, + data: { + private_token: gon.api_token, + search: query, + order_by: order, + per_page: 20 + }, + dataType: "json" + }).done(function(projects) { + return callback(projects); + }); + }, + newLabel: function(project_id, data, callback) { + var url; + url = Api.buildUrl(Api.labelsPath); + url = url.replace(':id', project_id); + data.private_token = gon.api_token; + return $.ajax({ + url: url, + type: "POST", + data: data, + dataType: "json" + }).done(function(label) { + return callback(label); + }).error(function(message) { + return callback(message.responseJSON); + }); + }, + groupProjects: function(group_id, query, callback) { + var url; + url = Api.buildUrl(Api.groupProjectsPath); + url = url.replace(':id', group_id); + return $.ajax({ + url: url, + data: { + private_token: gon.api_token, + search: query, + per_page: 20 + }, + dataType: "json" + }).done(function(projects) { + return callback(projects); + }); + }, + licenseText: function(key, data, callback) { + var url; + url = Api.buildUrl(Api.licensePath).replace(':key', key); + return $.ajax({ + url: url, + data: data + }).done(function(license) { + return callback(license); + }); + }, + gitignoreText: function(key, callback) { + var url; + url = Api.buildUrl(Api.gitignorePath).replace(':key', key); + return $.get(url, function(gitignore) { + return callback(gitignore); + }); + }, + gitlabCiYml: function(key, callback) { + var url; + url = Api.buildUrl(Api.gitlabCiYmlPath).replace(':key', key); + return $.get(url, function(file) { + return callback(file); + }); + }, + buildUrl: function(url) { + if (gon.relative_url_root != null) { + url = gon.relative_url_root + url; + } + return url.replace(':version', gon.api_version); + } + }; + +}).call(this); diff --git a/app/assets/javascripts/api.js.coffee b/app/assets/javascripts/api.js.coffee deleted file mode 100644 index 89b0ac697ed..00000000000 --- a/app/assets/javascripts/api.js.coffee +++ /dev/null @@ -1,122 +0,0 @@ -@Api = - groupsPath: "/api/:version/groups.json" - groupPath: "/api/:version/groups/:id.json" - namespacesPath: "/api/:version/namespaces.json" - groupProjectsPath: "/api/:version/groups/:id/projects.json" - projectsPath: "/api/:version/projects.json?simple=true" - labelsPath: "/api/:version/projects/:id/labels" - licensePath: "/api/:version/licenses/:key" - gitignorePath: "/api/:version/gitignores/:key" - gitlabCiYmlPath: "/api/:version/gitlab_ci_ymls/:key" - - group: (group_id, callback) -> - url = Api.buildUrl(Api.groupPath) - url = url.replace(':id', group_id) - - $.ajax( - url: url - data: - private_token: gon.api_token - dataType: "json" - ).done (group) -> - callback(group) - - # Return groups list. Filtered by query - # Only active groups retrieved - groups: (query, skip_ldap, callback) -> - url = Api.buildUrl(Api.groupsPath) - - $.ajax( - url: url - data: - private_token: gon.api_token - search: query - per_page: 20 - dataType: "json" - ).done (groups) -> - callback(groups) - - # Return namespaces list. Filtered by query - namespaces: (query, callback) -> - url = Api.buildUrl(Api.namespacesPath) - - $.ajax( - url: url - data: - private_token: gon.api_token - search: query - per_page: 20 - dataType: "json" - ).done (namespaces) -> - callback(namespaces) - - # Return projects list. Filtered by query - projects: (query, order, callback) -> - url = Api.buildUrl(Api.projectsPath) - - $.ajax( - url: url - data: - private_token: gon.api_token - search: query - order_by: order - per_page: 20 - dataType: "json" - ).done (projects) -> - callback(projects) - - newLabel: (project_id, data, callback) -> - url = Api.buildUrl(Api.labelsPath) - url = url.replace(':id', project_id) - - data.private_token = gon.api_token - $.ajax( - url: url - type: "POST" - data: data - dataType: "json" - ).done (label) -> - callback(label) - .error (message) -> - callback(message.responseJSON) - - # Return group projects list. Filtered by query - groupProjects: (group_id, query, callback) -> - url = Api.buildUrl(Api.groupProjectsPath) - url = url.replace(':id', group_id) - - $.ajax( - url: url - data: - private_token: gon.api_token - search: query - per_page: 20 - dataType: "json" - ).done (projects) -> - callback(projects) - - # Return text for a specific license - licenseText: (key, data, callback) -> - url = Api.buildUrl(Api.licensePath).replace(':key', key) - - $.ajax( - url: url - data: data - ).done (license) -> - callback(license) - - gitignoreText: (key, callback) -> - url = Api.buildUrl(Api.gitignorePath).replace(':key', key) - - $.get url, (gitignore) -> - callback(gitignore) - - gitlabCiYml: (key, callback) -> - url = Api.buildUrl(Api.gitlabCiYmlPath).replace(':key', key) - - $.get url, (file) -> - callback(file) - - buildUrl: (url) -> - url = gon.relative_url_root + url if gon.relative_url_root? - return url.replace(':version', gon.api_version) diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js new file mode 100644 index 00000000000..127e568adc9 --- /dev/null +++ b/app/assets/javascripts/application.js @@ -0,0 +1,320 @@ +/*= require jquery2 */ +/*= require jquery-ui/autocomplete */ +/*= require jquery-ui/datepicker */ +/*= require jquery-ui/draggable */ +/*= require jquery-ui/effect-highlight */ +/*= require jquery-ui/sortable */ +/*= require jquery_ujs */ +/*= require jquery.cookie */ +/*= require jquery.endless-scroll */ +/*= require jquery.highlight */ +/*= require jquery.waitforimages */ +/*= require jquery.atwho */ +/*= require jquery.scrollTo */ +/*= require jquery.turbolinks */ +/*= require turbolinks */ +/*= require autosave */ +/*= require bootstrap/affix */ +/*= require bootstrap/alert */ +/*= require bootstrap/button */ +/*= require bootstrap/collapse */ +/*= require bootstrap/dropdown */ +/*= require bootstrap/modal */ +/*= require bootstrap/scrollspy */ +/*= require bootstrap/tab */ +/*= require bootstrap/transition */ +/*= require bootstrap/tooltip */ +/*= require bootstrap/popover */ +/*= require select2 */ +/*= require ace/ace */ +/*= require ace/ext-searchbox */ +/*= require underscore */ +/*= require dropzone */ +/*= require mousetrap */ +/*= require mousetrap/pause */ +/*= require shortcuts */ +/*= require shortcuts_navigation */ +/*= require shortcuts_dashboard_navigation */ +/*= require shortcuts_issuable */ +/*= require shortcuts_network */ +/*= require jquery.nicescroll */ +/*= require date.format */ +/*= require_directory ./behaviors */ +/*= require_directory ./blob */ +/*= require_directory ./commit */ +/*= require_directory ./extensions */ +/*= require_directory ./lib/utils */ +/*= require_directory ./u2f */ +/*= require_directory . */ +/*= require fuzzaldrin-plus */ + +(function() { + window.slugify = function(text) { + return text.replace(/[^-a-zA-Z0-9]+/g, '_').toLowerCase(); + }; + + window.ajaxGet = function(url) { + return $.ajax({ + type: "GET", + url: url, + dataType: "script" + }); + }; + + window.split = function(val) { + return val.split(/,\s*/); + }; + + window.extractLast = function(term) { + return split(term).pop(); + }; + + window.rstrip = function(val) { + if (val) { + return val.replace(/\s+$/, ''); + } else { + return val; + } + }; + + window.disableButtonIfEmptyField = function(field_selector, button_selector) { + var closest_submit, field; + field = $(field_selector); + closest_submit = field.closest('form').find(button_selector); + if (rstrip(field.val()) === "") { + closest_submit.disable(); + } + return field.on('input', function() { + if (rstrip($(this).val()) === "") { + return closest_submit.disable(); + } else { + return closest_submit.enable(); + } + }); + }; + + window.disableButtonIfAnyEmptyField = function(form, form_selector, button_selector) { + var closest_submit, updateButtons; + closest_submit = form.find(button_selector); + updateButtons = function() { + var filled; + filled = true; + form.find('input').filter(form_selector).each(function() { + return filled = rstrip($(this).val()) !== "" || !$(this).attr('required'); + }); + if (filled) { + return closest_submit.enable(); + } else { + return closest_submit.disable(); + } + }; + updateButtons(); + return form.keyup(updateButtons); + }; + + window.sanitize = function(str) { + return str.replace(/<(?:.|\n)*?>/gm, ''); + }; + + window.unbindEvents = function() { + return $(document).off('scroll'); + }; + + window.shiftWindow = function() { + return scrollBy(0, -100); + }; + + document.addEventListener("page:fetch", unbindEvents); + + window.addEventListener("hashchange", shiftWindow); + + window.onload = function() { + if (location.hash) { + return setTimeout(shiftWindow, 100); + } + }; + + $(function() { + var $body, $document, $sidebarGutterToggle, $window, bootstrapBreakpoint, checkInitialSidebarSize, fitSidebarForSize, flash; + $document = $(document); + $window = $(window); + $body = $('body'); + gl.utils.preventDisabledButtons(); + bootstrapBreakpoint = bp.getBreakpointSize(); + $(".nav-sidebar").niceScroll({ + cursoropacitymax: '0.4', + cursorcolor: '#FFF', + cursorborder: "1px solid #FFF" + }); + $(".js-select-on-focus").on("focusin", function() { + return $(this).select().one('mouseup', function(e) { + return e.preventDefault(); + }); + }); + $('.remove-row').bind('ajax:success', function() { + return $(this).closest('li').fadeOut(); + }); + $('.js-remove-tr').bind('ajax:before', function() { + return $(this).hide(); + }); + $('.js-remove-tr').bind('ajax:success', function() { + return $(this).closest('tr').fadeOut(); + }); + $('select.select2').select2({ + width: 'resolve', + dropdownAutoWidth: true + }); + $('.js-select2').bind('select2-close', function() { + return setTimeout((function() { + $('.select2-container-active').removeClass('select2-container-active'); + return $(':focus').blur(); + }), 1); + }); + $body.tooltip({ + selector: '.has-tooltip, [data-toggle="tooltip"]', + placement: function(_, el) { + var $el; + $el = $(el); + return $el.data('placement') || 'bottom'; + } + }); + $('.trigger-submit').on('change', function() { + return $(this).parents('form').submit(); + }); + gl.utils.localTimeAgo($('abbr.timeago, .js-timeago'), true); + if ((flash = $(".flash-container")).length > 0) { + flash.click(function() { + return $(this).fadeOut(); + }); + flash.show(); + } + $body.on('ajax:complete, ajax:beforeSend, submit', 'form', function(e) { + var buttons; + buttons = $('[type="submit"]', this); + switch (e.type) { + case 'ajax:beforeSend': + case 'submit': + return buttons.disable(); + default: + return buttons.enable(); + } + }); + $(document).ajaxError(function(e, xhrObj, xhrSetting, xhrErrorText) { + var ref; + if (xhrObj.status === 401) { + return new Flash('You need to be logged in.', 'alert'); + } else if ((ref = xhrObj.status) === 404 || ref === 500) { + return new Flash('Something went wrong on our end.', 'alert'); + } + }); + $('.account-box').hover(function() { + return $(this).toggleClass('hover'); + }); + $document.on('click', '.diff-content .js-show-suppressed-diff', function() { + var $container; + $container = $(this).parent(); + $container.next('table').show(); + return $container.remove(); + }); + $('.navbar-toggle').on('click', function() { + $('.header-content .title').toggle(); + $('.header-content .header-logo').toggle(); + $('.header-content .navbar-collapse').toggle(); + return $('.navbar-toggle').toggleClass('active'); + }); + $body.on("click", ".js-toggle-diff-comments", function(e) { + $(this).toggleClass('active'); + $(this).closest(".diff-file").find(".notes_holder").toggle(); + return e.preventDefault(); + }); + $document.off("click", '.js-confirm-danger'); + $document.on("click", '.js-confirm-danger', function(e) { + var btn, form, text; + e.preventDefault(); + btn = $(e.target); + text = btn.data("confirm-danger-message"); + form = btn.closest("form"); + return new ConfirmDangerModal(form, text); + }); + $document.on('click', 'button', function() { + return $(this).blur(); + }); + $('input[type="search"]').each(function() { + var $this; + $this = $(this); + $this.attr('value', $this.val()); + }); + $document.off('keyup', 'input[type="search"]').on('keyup', 'input[type="search"]', function(e) { + var $this; + $this = $(this); + return $this.attr('value', $this.val()); + }); + $sidebarGutterToggle = $('.js-sidebar-toggle'); + $document.off('breakpoint:change').on('breakpoint:change', function(e, breakpoint) { + var $gutterIcon; + if (breakpoint === 'sm' || breakpoint === 'xs') { + $gutterIcon = $sidebarGutterToggle.find('i'); + if ($gutterIcon.hasClass('fa-angle-double-right')) { + return $sidebarGutterToggle.trigger('click'); + } + } + }); + fitSidebarForSize = function() { + var oldBootstrapBreakpoint; + oldBootstrapBreakpoint = bootstrapBreakpoint; + bootstrapBreakpoint = bp.getBreakpointSize(); + if (bootstrapBreakpoint !== oldBootstrapBreakpoint) { + return $document.trigger('breakpoint:change', [bootstrapBreakpoint]); + } + }; + checkInitialSidebarSize = function() { + bootstrapBreakpoint = bp.getBreakpointSize(); + if (bootstrapBreakpoint === "xs" || "sm") { + return $document.trigger('breakpoint:change', [bootstrapBreakpoint]); + } + }; + $window.off("resize.app").on("resize.app", function(e) { + return fitSidebarForSize(); + }); + gl.awardsHandler = new AwardsHandler(); + checkInitialSidebarSize(); + new Aside(); + if ($window.width() < 1024 && $.cookie('pin_nav') === 'true') { + $.cookie('pin_nav', 'false', { + path: '/', + expires: 365 * 10 + }); + $('.page-with-sidebar').toggleClass('page-sidebar-collapsed page-sidebar-expanded').removeClass('page-sidebar-pinned'); + $('.navbar-fixed-top').removeClass('header-pinned-nav'); + } + return $document.off('click', '.js-nav-pin').on('click', '.js-nav-pin', function(e) { + var $page, $pinBtn, $tooltip, $topNav, doPinNav, tooltipText; + e.preventDefault(); + $pinBtn = $(e.currentTarget); + $page = $('.page-with-sidebar'); + $topNav = $('.navbar-fixed-top'); + $tooltip = $("#" + ($pinBtn.attr('aria-describedby'))); + doPinNav = !$page.is('.page-sidebar-pinned'); + tooltipText = 'Pin navigation'; + $(this).toggleClass('is-active'); + if (doPinNav) { + $page.addClass('page-sidebar-pinned'); + $topNav.addClass('header-pinned-nav'); + } else { + $tooltip.remove(); + $page.removeClass('page-sidebar-pinned').toggleClass('page-sidebar-collapsed page-sidebar-expanded'); + $topNav.removeClass('header-pinned-nav').toggleClass('header-collapsed header-expanded'); + } + $.cookie('pin_nav', doPinNav, { + path: '/', + expires: 365 * 10 + }); + if ($.cookie('pin_nav') === 'true' || doPinNav) { + tooltipText = 'Unpin navigation'; + } + $tooltip.find('.tooltip-inner').text(tooltipText); + return $pinBtn.attr('title', tooltipText).tooltip('fixTitle'); + }); + }); + +}).call(this); diff --git a/app/assets/javascripts/application.js.coffee b/app/assets/javascripts/application.js.coffee deleted file mode 100644 index eceff6d91d5..00000000000 --- a/app/assets/javascripts/application.js.coffee +++ /dev/null @@ -1,310 +0,0 @@ -# This is a manifest file that'll be compiled into including all the files listed below. -# Add new JavaScript/Coffee code in separate files in this directory and they'll automatically -# be included in the compiled file accessible from http://example.com/assets/application.js -# It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the -# the compiled file. -# -#= require jquery2 -#= require jquery-ui/autocomplete -#= require jquery-ui/datepicker -#= require jquery-ui/draggable -#= require jquery-ui/effect-highlight -#= require jquery-ui/sortable -#= require jquery_ujs -#= require jquery.cookie -#= require jquery.endless-scroll -#= require jquery.highlight -#= require jquery.waitforimages -#= require jquery.atwho -#= require jquery.scrollTo -#= require jquery.turbolinks -#= require turbolinks -#= require autosave -#= require bootstrap/affix -#= require bootstrap/alert -#= require bootstrap/button -#= require bootstrap/collapse -#= require bootstrap/dropdown -#= require bootstrap/modal -#= require bootstrap/scrollspy -#= require bootstrap/tab -#= require bootstrap/transition -#= require bootstrap/tooltip -#= require bootstrap/popover -#= require select2 -#= require ace/ace -#= require ace/ext-searchbox -#= require underscore -#= require dropzone -#= require mousetrap -#= require mousetrap/pause -#= require shortcuts -#= require shortcuts_navigation -#= require shortcuts_dashboard_navigation -#= require shortcuts_issuable -#= require shortcuts_network -#= require jquery.nicescroll -#= require date.format -#= require_directory ./behaviors -#= require_directory ./blob -#= require_directory ./commit -#= require_directory ./extensions -#= require_directory ./lib/utils -#= require_directory ./u2f -#= require_directory . -#= require fuzzaldrin-plus - -window.slugify = (text) -> - text.replace(/[^-a-zA-Z0-9]+/g, '_').toLowerCase() - -window.ajaxGet = (url) -> - $.ajax({type: "GET", url: url, dataType: "script"}) - -window.split = (val) -> - return val.split( /,\s*/ ) - -window.extractLast = (term) -> - return split( term ).pop() - -window.rstrip = (val) -> - return if val then val.replace(/\s+$/, '') else val - -# Disable button if text field is empty -window.disableButtonIfEmptyField = (field_selector, button_selector) -> - field = $(field_selector) - closest_submit = field.closest('form').find(button_selector) - - closest_submit.disable() if rstrip(field.val()) is "" - - field.on 'input', -> - if rstrip($(@).val()) is "" - closest_submit.disable() - else - closest_submit.enable() - -# Disable button if any input field with given selector is empty -window.disableButtonIfAnyEmptyField = (form, form_selector, button_selector) -> - closest_submit = form.find(button_selector) - updateButtons = -> - filled = true - form.find('input').filter(form_selector).each -> - filled = rstrip($(this).val()) != "" || !$(this).attr('required') - - if filled - closest_submit.enable() - else - closest_submit.disable() - - updateButtons() - form.keyup(updateButtons) - -window.sanitize = (str) -> - return str.replace(/<(?:.|\n)*?>/gm, '') - -window.unbindEvents = -> - $(document).off('scroll') - -window.shiftWindow = -> - scrollBy 0, -100 - -document.addEventListener("page:fetch", unbindEvents) - -window.addEventListener "hashchange", shiftWindow - -window.onload = -> - # Scroll the window to avoid the topnav bar - # https://github.com/twitter/bootstrap/issues/1768 - if location.hash - setTimeout shiftWindow, 100 - -$ -> - - $document = $(document) - $window = $(window) - $body = $('body') - - gl.utils.preventDisabledButtons() - bootstrapBreakpoint = bp.getBreakpointSize() - - $(".nav-sidebar").niceScroll(cursoropacitymax: '0.4', cursorcolor: '#FFF', cursorborder: "1px solid #FFF") - - # Click a .js-select-on-focus field, select the contents - $(".js-select-on-focus").on "focusin", -> - # Prevent a mouseup event from deselecting the input - $(this).select().one 'mouseup', (e) -> - e.preventDefault() - - $('.remove-row').bind 'ajax:success', -> - $(this).closest('li').fadeOut() - - $('.js-remove-tr').bind 'ajax:before', -> - $(this).hide() - - $('.js-remove-tr').bind 'ajax:success', -> - $(this).closest('tr').fadeOut() - - # Initialize select2 selects - $('select.select2').select2(width: 'resolve', dropdownAutoWidth: true) - - # Close select2 on escape - $('.js-select2').bind 'select2-close', -> - setTimeout ( -> - $('.select2-container-active').removeClass('select2-container-active') - $(':focus').blur() - ), 1 - - # Initialize tooltips - $body.tooltip( - selector: '.has-tooltip, [data-toggle="tooltip"]' - placement: (_, el) -> - $el = $(el) - $el.data('placement') || 'bottom' - ) - - # Form submitter - $('.trigger-submit').on 'change', -> - $(@).parents('form').submit() - - gl.utils.localTimeAgo($('abbr.timeago, .js-timeago'), true) - - # Flash - if (flash = $(".flash-container")).length > 0 - flash.click -> $(@).fadeOut() - flash.show() - - # Disable form buttons while a form is submitting - $body.on 'ajax:complete, ajax:beforeSend, submit', 'form', (e) -> - buttons = $('[type="submit"]', @) - - switch e.type - when 'ajax:beforeSend', 'submit' - buttons.disable() - else - buttons.enable() - - $(document).ajaxError (e, xhrObj, xhrSetting, xhrErrorText) -> - - if xhrObj.status is 401 - new Flash 'You need to be logged in.', 'alert' - - else if xhrObj.status in [ 404, 500 ] - new Flash 'Something went wrong on our end.', 'alert' - - - # Show/Hide the profile menu when hovering the account box - $('.account-box').hover -> $(@).toggleClass('hover') - - # Commit show suppressed diff - $document.on 'click', '.diff-content .js-show-suppressed-diff', -> - $container = $(@).parent() - $container.next('table').show() - $container.remove() - - $('.navbar-toggle').on 'click', -> - $('.header-content .title').toggle() - $('.header-content .header-logo').toggle() - $('.header-content .navbar-collapse').toggle() - $('.navbar-toggle').toggleClass('active') - - # Show/hide comments on diff - $body.on "click", ".js-toggle-diff-comments", (e) -> - $(@).toggleClass('active') - $(@).closest(".diff-file").find(".notes_holder").toggle() - e.preventDefault() - - $document.off "click", '.js-confirm-danger' - $document.on "click", '.js-confirm-danger', (e) -> - e.preventDefault() - btn = $(e.target) - text = btn.data("confirm-danger-message") - form = btn.closest("form") - new ConfirmDangerModal(form, text) - - - $document.on 'click', 'button', -> - $(this).blur() - - $('input[type="search"]').each -> - $this = $(this) - $this.attr 'value', $this.val() - return - - $document - .off 'keyup', 'input[type="search"]' - .on 'keyup', 'input[type="search"]' , (e) -> - $this = $(this) - $this.attr 'value', $this.val() - - $sidebarGutterToggle = $('.js-sidebar-toggle') - - $document - .off 'breakpoint:change' - .on 'breakpoint:change', (e, breakpoint) -> - if breakpoint is 'sm' or breakpoint is 'xs' - $gutterIcon = $sidebarGutterToggle.find('i') - if $gutterIcon.hasClass('fa-angle-double-right') - $sidebarGutterToggle.trigger('click') - - fitSidebarForSize = -> - oldBootstrapBreakpoint = bootstrapBreakpoint - bootstrapBreakpoint = bp.getBreakpointSize() - if bootstrapBreakpoint != oldBootstrapBreakpoint - $document.trigger('breakpoint:change', [bootstrapBreakpoint]) - - checkInitialSidebarSize = -> - bootstrapBreakpoint = bp.getBreakpointSize() - if bootstrapBreakpoint is "xs" or "sm" - $document.trigger('breakpoint:change', [bootstrapBreakpoint]) - - $window - .off "resize.app" - .on "resize.app", (e) -> - fitSidebarForSize() - - gl.awardsHandler = new AwardsHandler() - checkInitialSidebarSize() - new Aside() - - # Sidenav pinning - if $window.width() < 1024 and $.cookie('pin_nav') is 'true' - $.cookie('pin_nav', 'false', { path: '/', expires: 365 * 10 }) - $('.page-with-sidebar') - .toggleClass('page-sidebar-collapsed page-sidebar-expanded') - .removeClass('page-sidebar-pinned') - $('.navbar-fixed-top').removeClass('header-pinned-nav') - - $document - .off 'click', '.js-nav-pin' - .on 'click', '.js-nav-pin', (e) -> - e.preventDefault() - - $pinBtn = $(e.currentTarget) - $page = $ '.page-with-sidebar' - $topNav = $ '.navbar-fixed-top' - $tooltip = $ "##{$pinBtn.attr('aria-describedby')}" - doPinNav = not $page.is('.page-sidebar-pinned') - tooltipText = 'Pin navigation' - - $(this).toggleClass 'is-active' - - if doPinNav - $page.addClass('page-sidebar-pinned') - $topNav.addClass('header-pinned-nav') - else - $tooltip.remove() # Remove it immediately when collapsing the sidebar - $page.removeClass('page-sidebar-pinned') - .toggleClass('page-sidebar-collapsed page-sidebar-expanded') - $topNav.removeClass('header-pinned-nav') - .toggleClass('header-collapsed header-expanded') - - # Save settings - $.cookie 'pin_nav', doPinNav, { path: '/', expires: 365 * 10 } - - if $.cookie('pin_nav') is 'true' or doPinNav - tooltipText = 'Unpin navigation' - - # Update tooltip text immediately - $tooltip.find('.tooltip-inner').text(tooltipText) - - # Persist tooltip title - $pinBtn.attr('title', tooltipText).tooltip('fixTitle') diff --git a/app/assets/javascripts/aside.js b/app/assets/javascripts/aside.js new file mode 100644 index 00000000000..7b546e79ee0 --- /dev/null +++ b/app/assets/javascripts/aside.js @@ -0,0 +1,26 @@ +(function() { + this.Aside = (function() { + function Aside() { + $(document).off("click", "a.show-aside"); + $(document).on("click", 'a.show-aside', function(e) { + var btn, icon; + e.preventDefault(); + btn = $(e.currentTarget); + icon = btn.find('i'); + if (icon.hasClass('fa-angle-left')) { + btn.parent().find('section').hide(); + btn.parent().find('aside').fadeIn(); + return icon.removeClass('fa-angle-left').addClass('fa-angle-right'); + } else { + btn.parent().find('aside').hide(); + btn.parent().find('section').fadeIn(); + return icon.removeClass('fa-angle-right').addClass('fa-angle-left'); + } + }); + } + + return Aside; + + })(); + +}).call(this); diff --git a/app/assets/javascripts/aside.js.coffee b/app/assets/javascripts/aside.js.coffee deleted file mode 100644 index 66ab5054326..00000000000 --- a/app/assets/javascripts/aside.js.coffee +++ /dev/null @@ -1,16 +0,0 @@ -class @Aside - constructor: -> - $(document).off "click", "a.show-aside" - $(document).on "click", 'a.show-aside', (e) -> - e.preventDefault() - btn = $(e.currentTarget) - icon = btn.find('i') - - if icon.hasClass('fa-angle-left') - btn.parent().find('section').hide() - btn.parent().find('aside').fadeIn() - icon.removeClass('fa-angle-left').addClass('fa-angle-right') - else - btn.parent().find('aside').hide() - btn.parent().find('section').fadeIn() - icon.removeClass('fa-angle-right').addClass('fa-angle-left') diff --git a/app/assets/javascripts/autosave.js b/app/assets/javascripts/autosave.js new file mode 100644 index 00000000000..7116512d6b7 --- /dev/null +++ b/app/assets/javascripts/autosave.js @@ -0,0 +1,63 @@ +(function() { + this.Autosave = (function() { + function Autosave(field, key) { + this.field = field; + if (key.join != null) { + key = key.join("/"); + } + this.key = "autosave/" + key; + this.field.data("autosave", this); + this.restore(); + this.field.on("input", (function(_this) { + return function() { + return _this.save(); + }; + })(this)); + } + + Autosave.prototype.restore = function() { + var e, error, text; + if (window.localStorage == null) { + return; + } + try { + text = window.localStorage.getItem(this.key); + } catch (error) { + e = error; + return; + } + if ((text != null ? text.length : void 0) > 0) { + this.field.val(text); + } + return this.field.trigger("input"); + }; + + Autosave.prototype.save = function() { + var text; + if (window.localStorage == null) { + return; + } + text = this.field.val(); + if ((text != null ? text.length : void 0) > 0) { + try { + return window.localStorage.setItem(this.key, text); + } catch (undefined) {} + } else { + return this.reset(); + } + }; + + Autosave.prototype.reset = function() { + if (window.localStorage == null) { + return; + } + try { + return window.localStorage.removeItem(this.key); + } catch (undefined) {} + }; + + return Autosave; + + })(); + +}).call(this); diff --git a/app/assets/javascripts/autosave.js.coffee b/app/assets/javascripts/autosave.js.coffee deleted file mode 100644 index 28f8e103664..00000000000 --- a/app/assets/javascripts/autosave.js.coffee +++ /dev/null @@ -1,39 +0,0 @@ -class @Autosave - constructor: (field, key) -> - @field = field - - key = key.join("/") if key.join? - @key = "autosave/#{key}" - - @field.data "autosave", this - - @restore() - - @field.on "input", => @save() - - restore: -> - return unless window.localStorage? - - try - text = window.localStorage.getItem @key - catch e - return - - @field.val text if text?.length > 0 - @field.trigger "input" - - save: -> - return unless window.localStorage? - - text = @field.val() - if text?.length > 0 - try - window.localStorage.setItem @key, text - else - @reset() - - reset: -> - return unless window.localStorage? - - try - window.localStorage.removeItem @key diff --git a/app/assets/javascripts/awards_handler.coffee b/app/assets/javascripts/awards_handler.coffee deleted file mode 100644 index 37d0adaa625..00000000000 --- a/app/assets/javascripts/awards_handler.coffee +++ /dev/null @@ -1,372 +0,0 @@ -class @AwardsHandler - - constructor: -> - - @aliases = gl.emojiAliases() - - $(document) - .off 'click', '.js-add-award' - .on 'click', '.js-add-award', (e) => - e.stopPropagation() - e.preventDefault() - - @showEmojiMenu $(e.currentTarget) - - $('html').on 'click', (e) -> - $target = $ e.target - - unless $target.closest('.emoji-menu-content').length - $('.js-awards-block.current').removeClass 'current' - - unless $target.closest('.emoji-menu').length - if $('.emoji-menu').is(':visible') - $('.js-add-award.is-active').removeClass 'is-active' - $('.emoji-menu').removeClass 'is-visible' - - $(document) - .off 'click', '.js-emoji-btn' - .on 'click', '.js-emoji-btn', (e) => - e.preventDefault() - - $target = $ e.currentTarget - emoji = $target.find('.icon').data 'emoji' - - $target.closest('.js-awards-block').addClass 'current' - @addAward @getVotesBlock(), @getAwardUrl(), emoji - - - showEmojiMenu: ($addBtn) -> - - $menu = $ '.emoji-menu' - - if $addBtn.hasClass 'js-note-emoji' - $addBtn.closest('.note').find('.js-awards-block').addClass 'current' - else - $addBtn.closest('.js-awards-block').addClass 'current' - - if $menu.length - $holder = $addBtn.closest('.js-award-holder') - - if $menu.is '.is-visible' - $addBtn.removeClass 'is-active' - $menu.removeClass 'is-visible' - $('#emoji_search').blur() - else - $addBtn.addClass 'is-active' - @positionMenu($menu, $addBtn) - - $menu.addClass 'is-visible' - $('#emoji_search').focus() - else - $addBtn.addClass 'is-loading is-active' - url = @getAwardMenuUrl() - - @createEmojiMenu url, => - $addBtn.removeClass 'is-loading' - $menu = $('.emoji-menu') - @positionMenu($menu, $addBtn) - @renderFrequentlyUsedBlock() unless @frequentEmojiBlockRendered - - setTimeout => - $menu.addClass 'is-visible' - $('#emoji_search').focus() - @setupSearch() - , 200 - - - createEmojiMenu: (awardMenuUrl, callback) -> - - $.get awardMenuUrl, (response) -> - $('body').append response - callback() - - - positionMenu: ($menu, $addBtn) -> - - position = $addBtn.data('position') - - # The menu could potentially be off-screen or in a hidden overflow element - # So we position the element absolute in the body - css = - top: "#{$addBtn.offset().top + $addBtn.outerHeight()}px" - - if position? and position is 'right' - css.left = "#{($addBtn.offset().left - $menu.outerWidth()) + 20}px" - $menu.addClass 'is-aligned-right' - else - css.left = "#{$addBtn.offset().left}px" - $menu.removeClass 'is-aligned-right' - - $menu.css(css) - - - addAward: (votesBlock, awardUrl, emoji, checkMutuality = true, callback) -> - - emoji = @normilizeEmojiName emoji - - @postEmoji awardUrl, emoji, => - @addAwardToEmojiBar votesBlock, emoji, checkMutuality - callback?() - - $('.emoji-menu').removeClass 'is-visible' - - - addAwardToEmojiBar: (votesBlock, emoji, checkForMutuality = true) -> - - @checkMutuality votesBlock, emoji if checkForMutuality - @addEmojiToFrequentlyUsedList emoji - - emoji = @normilizeEmojiName emoji - $emojiButton = @findEmojiIcon(votesBlock, emoji).parent() - - if $emojiButton.length > 0 - if @isActive $emojiButton - @decrementCounter $emojiButton, emoji - else - counter = $emojiButton.find '.js-counter' - counter.text parseInt(counter.text()) + 1 - $emojiButton.addClass 'active' - @addMeToUserList votesBlock, emoji - @animateEmoji $emojiButton - else - votesBlock.removeClass 'hidden' - @createEmoji votesBlock, emoji - - - getVotesBlock: -> - - currentBlock = $ '.js-awards-block.current' - return if currentBlock.length then currentBlock else $('.js-awards-block').eq 0 - - - getAwardUrl: -> return @getVotesBlock().data 'award-url' - - - checkMutuality: (votesBlock, emoji) -> - - awardUrl = @getAwardUrl() - - if emoji in [ 'thumbsup', 'thumbsdown' ] - mutualVote = if emoji is 'thumbsup' then 'thumbsdown' else 'thumbsup' - $emojiButton = votesBlock.find("[data-emoji=#{mutualVote}]").parent() - isAlreadyVoted = $emojiButton.hasClass 'active' - - if isAlreadyVoted - @showEmojiLoader $emojiButton - @addAward votesBlock, awardUrl, mutualVote, false, -> - $emojiButton.removeClass 'is-loading' - - - showEmojiLoader: ($emojiButton) -> - - $loader = $emojiButton.find '.fa-spinner' - - unless $loader.length - $emojiButton.append '' - - $emojiButton.addClass 'is-loading' - - - isActive: ($emojiButton) -> $emojiButton.hasClass 'active' - - - decrementCounter: ($emojiButton, emoji) -> - - counter = $ '.js-counter', $emojiButton - counterNumber = parseInt counter.text(), 10 - - if counterNumber > 1 - counter.text counterNumber - 1 - @removeMeFromUserList $emojiButton, emoji - else if emoji is 'thumbsup' or emoji is 'thumbsdown' - $emojiButton.tooltip 'destroy' - counter.text '0' - @removeMeFromUserList $emojiButton, emoji - @removeEmoji $emojiButton if $emojiButton.parents('.note').length - else - @removeEmoji $emojiButton - - $emojiButton.removeClass 'active' - - - removeEmoji: ($emojiButton) -> - - $emojiButton.tooltip('destroy') - $emojiButton.remove() - - $votesBlock = @getVotesBlock() - - if $votesBlock.find('.js-emoji-btn').length is 0 - $votesBlock.addClass 'hidden' - - - getAwardTooltip: ($awardBlock) -> - - return $awardBlock.attr('data-original-title') or $awardBlock.attr('data-title') or '' - - - removeMeFromUserList: ($emojiButton, emoji) -> - - awardBlock = $emojiButton - originalTitle = @getAwardTooltip awardBlock - - authors = originalTitle.split ', ' - authors.splice authors.indexOf('me'), 1 - - newAuthors = authors.join ', ' - - awardBlock - .closest '.js-emoji-btn' - .removeData 'original-title' - .attr 'data-original-title', newAuthors - - @resetTooltip awardBlock - - - addMeToUserList: (votesBlock, emoji) -> - - awardBlock = @findEmojiIcon(votesBlock, emoji).parent() - origTitle = @getAwardTooltip awardBlock - users = [] - - if origTitle - users = origTitle.trim().split ', ' - - users.push 'me' - awardBlock.attr 'title', users.join ', ' - - @resetTooltip awardBlock - - - resetTooltip: (award) -> - - award.tooltip 'destroy' - - # 'destroy' call is asynchronous and there is no appropriate callback on it, this is why we need to set timeout. - cb = -> award.tooltip() - setTimeout cb, 200 - - - createEmoji_: (votesBlock, emoji) -> - - emojiCssClass = @resolveNameToCssClass emoji - buttonHtml = "" - - $emojiButton = $ buttonHtml - $emojiButton - .insertBefore votesBlock.find '.js-award-holder' - .find '.emoji-icon' - .data 'emoji', emoji - - @animateEmoji $emojiButton - $('.award-control').tooltip() - votesBlock.removeClass 'current' - - - animateEmoji: ($emoji) -> - - className = 'pulse animated' - - $emoji.addClass className - setTimeout (-> $emoji.removeClass className), 321 - - - createEmoji: (votesBlock, emoji) -> - - if $('.emoji-menu').length - return @createEmoji_ votesBlock, emoji - - @createEmojiMenu @getAwardMenuUrl(), => @createEmoji_ votesBlock, emoji - - - getAwardMenuUrl: -> return gon.award_menu_url - - - resolveNameToCssClass: (emoji) -> - - emojiIcon = $ ".emoji-menu-content [data-emoji='#{emoji}']" - - if emojiIcon.length > 0 - unicodeName = emojiIcon.data 'unicode-name' - else - # Find by alias - unicodeName = $(".emoji-menu-content [data-aliases*=':#{emoji}:']").data 'unicode-name' - - return "emoji-#{unicodeName}" - - - postEmoji: (awardUrl, emoji, callback) -> - - $.post awardUrl, { name: emoji }, (data) -> - callback() if data.ok - - - findEmojiIcon: (votesBlock, emoji) -> - - return votesBlock.find ".js-emoji-btn [data-emoji='#{emoji}']" - - - scrollToAwards: -> - - options = scrollTop: $('.awards').offset().top - 110 - $('body, html').animate options, 200 - - - normilizeEmojiName: (emoji) -> return @aliases[emoji] or emoji - - - addEmojiToFrequentlyUsedList: (emoji) -> - - frequentlyUsedEmojis = @getFrequentlyUsedEmojis() - frequentlyUsedEmojis.push emoji - $.cookie 'frequently_used_emojis', frequentlyUsedEmojis.join(','), { expires: 365 } - - - getFrequentlyUsedEmojis: -> - - frequentlyUsedEmojis = ($.cookie('frequently_used_emojis') or '').split(',') - return _.compact _.uniq frequentlyUsedEmojis - - - renderFrequentlyUsedBlock: -> - - if $.cookie 'frequently_used_emojis' - frequentlyUsedEmojis = @getFrequentlyUsedEmojis() - - ul = $("