Commit 330e9136 authored by Phil Hughes's avatar Phil Hughes

Uses update URL to update the status of a todo

parent 20d382a8
......@@ -47,44 +47,51 @@ class @Sidebar
.off 'click', '.js-issuable-todo'
.on 'click', '.js-issuable-todo', @toggleTodo
toggleTodo: ->
$this = $(@)
toggleTodo: (e) =>
$this = $(e.currentTarget)
$todoLoading = $('.js-issuable-todo-loading')
$btnText = $('.js-issuable-todo-text', $this)
ajaxType = if $this.attr('data-id') then 'PATCH' else 'POST'
ajaxUrlExtra = if $this.attr('data-id') then "/#{$this.attr('data-id')}" else ''
$.ajax(
url: $this.data('url')
type: 'POST'
url: "#{$this.data('url')}#{ajaxUrlExtra}"
type: ajaxType
dataType: 'json'
data:
todo_id: $this.attr('data-id')
issuable_id: $this.data('issuable')
issuable_type: $this.data('issuable-type')
beforeSend: ->
$this.disable()
$todoLoading.removeClass 'hidden'
).done (data) ->
$todoPendingCount = $('.todos-pending-count')
$todoPendingCount.text data.count
$this.enable()
$todoLoading.addClass 'hidden'
if data.count is 0
$todoPendingCount.addClass 'hidden'
else
$todoPendingCount.removeClass 'hidden'
if data.todo?
$this
.attr 'aria-label', $this.data('mark-text')
.attr 'data-id', data.todo.id
$btnText.text $this.data('mark-text')
else
$this
.attr 'aria-label', $this.data('todo-text')
.removeAttr 'data-id'
$btnText.text $this.data('todo-text')
beforeSend: =>
@beforeTodoSend($this, $todoLoading)
).done (data) =>
@todoUpdateDone(data, $this, $btnText, $todoLoading)
beforeTodoSend: ($btn, $todoLoading) ->
$btn.disable()
$todoLoading.removeClass 'hidden'
todoUpdateDone: (data, $btn, $btnText, $todoLoading) ->
$todoPendingCount = $('.todos-pending-count')
$todoPendingCount.text data.count
$btn.enable()
$todoLoading.addClass 'hidden'
if data.count is 0
$todoPendingCount.addClass 'hidden'
else
$todoPendingCount.removeClass 'hidden'
if data.todo?
$btn
.attr 'aria-label', $btn.data('mark-text')
.attr 'data-id', data.todo.id
$btnText.text $btn.data('mark-text')
else
$btn
.attr 'aria-label', $btn.data('todo-text')
.removeAttr 'data-id'
$btnText.text $btn.data('todo-text')
sidebarDropdownLoading: (e) ->
$sidebarCollapsedIcon = $(@).closest('.block').find('.sidebar-collapsed-icon')
......
class Projects::TodosController < Projects::ApplicationController
def create
json_data = Hash.new
TodoService.new.mark_todo(issuable, current_user)
if params[:todo_id].nil?
TodoService.new.mark_todo(issuable, current_user)
render json: {
todo: current_user.todos.find_by(state: :pending, action: Todo::MARKED, target_id: issuable.id),
count: current_user.todos.pending.count,
}
end
json_data[:todo] = current_user.todos.find_by(state: :pending, action: Todo::MARKED, target_id: issuable.id)
else
current_user.todos.find_by_id(params[:todo_id]).update(state: :done)
end
def update
current_user.todos.find_by_id(params[:id]).update(state: :done)
render json: json_data.merge({ count: current_user.todos.pending.count })
render json: {
count: current_user.todos.pending.count,
}
end
private
def issuable
@issuable ||= begin
case params[:issuable_type]
......
......@@ -9,7 +9,7 @@
%a.gutter-toggle.pull-right.js-sidebar-toggle{ role: "button", href: "#", aria: { label: "Toggle sidebar" } }
= sidebar_gutter_toggle_icon
- if current_user
%button.btn.btn-default.issuable-header-btn.pull-right.js-issuable-todo{ type: "button", aria: { label: (todo.nil? ? "Add Todo" : "Mark Done") }, data: { todo_text: "Add Todo", mark_text: "Mark Done", id: (todo.id unless todo.nil?), issuable: issuable.id, issuable_type: issuable.class.name.underscore, url: namespace_project_todos_path(@project.namespace, @project, :json) } }
%button.btn.btn-default.issuable-header-btn.pull-right.js-issuable-todo{ type: "button", aria: { label: (todo.nil? ? "Add Todo" : "Mark Done") }, data: { todo_text: "Add Todo", mark_text: "Mark Done", id: (todo.id unless todo.nil?), issuable: issuable.id, issuable_type: issuable.class.name.underscore, url: namespace_project_todos_path(@project.namespace, @project) } }
%span.js-issuable-todo-text
- if todo.nil?
Add Todo
......
......@@ -789,7 +789,7 @@ Rails.application.routes.draw do
end
end
resources :todos, only: [:create], constraints: { id: /\d+/ }
resources :todos, only: [:create, :update], constraints: { id: /\d+/ }
resources :uploads, only: [:create] do
collection do
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment