diff --git a/app/assets/javascripts/api.js.coffee b/app/assets/javascripts/api.js.coffee new file mode 100644 index 00000000..ca721517 --- /dev/null +++ b/app/assets/javascripts/api.js.coffee @@ -0,0 +1,53 @@ +@Api = + users_path: "/api/:version/users.json" + user_path: "/api/:version/users/:id.json" + notes_path: "/api/:version/projects/:id/notes.json" + + # Get 20 (depends on api) recent notes + # and sort the ascending from oldest to newest + notes: (project_id, callback) -> + url = Api.buildUrl(Api.notes_path) + url = url.replace(':id', project_id) + + $.ajax( + url: url, + data: + private_token: gon.api_token + gfm: true + recent: true + dataType: "json" + ).done (notes) -> + notes.sort (a, b) -> + return a.id - b.id + callback(notes) + + user: (user_id, callback) -> + url = Api.buildUrl(Api.user_path) + url = url.replace(':id', user_id) + + $.ajax( + url: url + data: + private_token: gon.api_token + dataType: "json" + ).done (user) -> + callback(user) + + # Return users list. Filtered by query + # Only active users retrieved + users: (query, callback) -> + url = Api.buildUrl(Api.users_path) + + $.ajax( + url: url + data: + private_token: gon.api_token + search: query + per_page: 20 + active: true + dataType: "json" + ).done (users) -> + callback(users) + + buildUrl: (url) -> + return url.replace(':version', gon.api_version) diff --git a/app/assets/javascripts/users_select.js.coffee b/app/assets/javascripts/users_select.js.coffee index f8049384..f9e523ea 100644 --- a/app/assets/javascripts/users_select.js.coffee +++ b/app/assets/javascripts/users_select.js.coffee @@ -18,34 +18,19 @@ $ -> placeholder: "Search for a user" multiple: $('.ajax-users-select').hasClass('multiselect') minimumInputLength: 0 - ajax: # instead of writing the function to execute the request we use Select2's convenient helper - url: "/api/" + gon.api_version + "/users.json" - dataType: "json" - data: (term, page) -> - search: term # search term - per_page: 10 - active: true - private_token: gon.api_token - - results: (data, page) -> # parse the results into the format expected by Select2. - # since we are using custom formatting functions we do not need to alter remote JSON data - results: data + query: (query) -> + Api.users query.term, (users) -> + data = { results: users } + query.callback(data) initSelection: (element, callback) -> id = $(element).val() if id isnt "" - $.ajax( - "/api/" + gon.api_version + "/users/" + id + ".json", - dataType: "json" - data: - private_token: gon.api_token - ).done (data) -> - callback data + Api.user(id, callback) - formatResult: userFormatResult # omitted for brevity, see the source of this page - formatSelection: userFormatSelection # omitted for brevity, see the source of this page - dropdownCssClass: "ajax-users-dropdown" # apply css that makes the dropdown taller + formatResult: userFormatResult + formatSelection: userFormatSelection + dropdownCssClass: "ajax-users-dropdown" escapeMarkup: (m) -> # we do not want to escape markup since we are displaying html in results m - diff --git a/app/assets/javascripts/wall.js.coffee b/app/assets/javascripts/wall.js.coffee index e53a9e77..a35c8c60 100644 --- a/app/assets/javascripts/wall.js.coffee +++ b/app/assets/javascripts/wall.js.coffee @@ -1,12 +1,9 @@ @Wall = note_ids: [] - notes_path: null - notes_params: null project_id: null init: (project_id) -> Wall.project_id = project_id - Wall.notes_path = "/api/" + gon.api_version + "/projects/" + project_id + "/notes.json" Wall.getContent() Wall.initRefresh() Wall.initForm() @@ -15,22 +12,15 @@ # Gets an initial set of notes. # getContent: -> - $.ajax - url: Wall.notes_path, - data: - private_token: gon.api_token - gfm: true - recent: true - dataType: "json" - success: (notes) -> - notes.sort (a, b) -> - return a.id - b.id - $.each notes, (i, note)-> - if $.inArray(note.id, Wall.note_ids) == -1 - Wall.note_ids.push(note.id) - Wall.renderNote(note) - Wall.scrollDown() - $("abbr.timeago").timeago() + Api.notes Wall.project_id, (notes) -> + $.each notes, (i, note) -> + # render note if it not present in loaded list + # or skip if rendered + if $.inArray(note.id, Wall.note_ids) == -1 + Wall.note_ids.push(note.id) + Wall.renderNote(note) + Wall.scrollDown() + $("abbr.timeago").timeago() initRefresh: -> setInterval("Wall.refresh()", 10000)