|
@@ -7,7 +7,7 @@ class App.SidebarChecklistShow extends App.Controller
|
|
'click .js-action': 'onAction'
|
|
'click .js-action': 'onAction'
|
|
'change .js-checkbox': 'onCheckboxClick'
|
|
'change .js-checkbox': 'onCheckboxClick'
|
|
'click .js-title': 'onTitleChange'
|
|
'click .js-title': 'onTitleChange'
|
|
- 'click .js-checklist-item-edit': 'onActionButtonClicked'
|
|
|
|
|
|
+ 'click .js-checklist-item-edit': 'onEntryTextClicked'
|
|
|
|
|
|
elements:
|
|
elements:
|
|
'.js-reorder': 'reorderButton'
|
|
'.js-reorder': 'reorderButton'
|
|
@@ -18,6 +18,7 @@ class App.SidebarChecklistShow extends App.Controller
|
|
|
|
|
|
constructor: ->
|
|
constructor: ->
|
|
super
|
|
super
|
|
|
|
+
|
|
@render()
|
|
@render()
|
|
|
|
|
|
render: ->
|
|
render: ->
|
|
@@ -27,15 +28,6 @@ class App.SidebarChecklistShow extends App.Controller
|
|
readOnly: @readOnly
|
|
readOnly: @readOnly
|
|
)
|
|
)
|
|
|
|
|
|
- $('body').off('click').on('click', (e) =>
|
|
|
|
- return if @actionController && @actionController.constructor.name is 'ChecklistReorder'
|
|
|
|
- return if $(e.target).closest('.js-actions').length > 0
|
|
|
|
- return if $(e.target).closest('button').length > 0
|
|
|
|
- return if $(e.target).closest('.checkbox-replacement').length > 0
|
|
|
|
-
|
|
|
|
- @actionController?.releaseController()
|
|
|
|
- )
|
|
|
|
-
|
|
|
|
@renderTable()
|
|
@renderTable()
|
|
|
|
|
|
checklistTitle: =>
|
|
checklistTitle: =>
|
|
@@ -46,20 +38,24 @@ class App.SidebarChecklistShow extends App.Controller
|
|
@actionController?.releaseController()
|
|
@actionController?.releaseController()
|
|
@actionController = new ChecklistReorder(parentVC: @)
|
|
@actionController = new ChecklistReorder(parentVC: @)
|
|
|
|
|
|
|
|
+ setDisabled: (node, id) ->
|
|
|
|
+ $(node).closest("[data-id='" + id + "']").attr('disabled', true).addClass('u-unclickable u-low-opacity')
|
|
|
|
+
|
|
onAdd: (e) =>
|
|
onAdd: (e) =>
|
|
- @addButton.attr('disabled', true)
|
|
|
|
|
|
+ addButton = e.target.closest('button')
|
|
|
|
+
|
|
|
|
+ $(addButton).attr('disabled', true)
|
|
|
|
|
|
callbackDone = (data) =>
|
|
callbackDone = (data) =>
|
|
@enterEditModeId = data.id
|
|
@enterEditModeId = data.id
|
|
@renderTable()
|
|
@renderTable()
|
|
@parentVC.subscribe()
|
|
@parentVC.subscribe()
|
|
- @addButton.attr('disabled', false)
|
|
|
|
|
|
+ $(addButton).attr('disabled', false)
|
|
|
|
|
|
item = new App.ChecklistItem
|
|
item = new App.ChecklistItem
|
|
item.checklist_id = @checklist.id
|
|
item.checklist_id = @checklist.id
|
|
item.text = ''
|
|
item.text = ''
|
|
|
|
|
|
-
|
|
|
|
item.save(
|
|
item.save(
|
|
done: ->
|
|
done: ->
|
|
App.ChecklistItem.full(@id, callbackDone, force: true)
|
|
App.ChecklistItem.full(@id, callbackDone, force: true)
|
|
@@ -69,41 +65,46 @@ class App.SidebarChecklistShow extends App.Controller
|
|
msg: App.i18n.translateContent(details.error)
|
|
msg: App.i18n.translateContent(details.error)
|
|
)
|
|
)
|
|
@renderTable()
|
|
@renderTable()
|
|
- @addButton.attr('disabled', false)
|
|
|
|
)
|
|
)
|
|
|
|
|
|
onCheckboxClick: (e) =>
|
|
onCheckboxClick: (e) =>
|
|
upcomingState = e.currentTarget.checked
|
|
upcomingState = e.currentTarget.checked
|
|
id = parseInt(e.currentTarget.value)
|
|
id = parseInt(e.currentTarget.value)
|
|
|
|
|
|
- e.currentTarget.disabled = true
|
|
|
|
-
|
|
|
|
@updateChecklistItem(id, upcomingState, e.currentTarget)
|
|
@updateChecklistItem(id, upcomingState, e.currentTarget)
|
|
|
|
|
|
- onCheckOrUncheck: (id, e) =>
|
|
|
|
- row = $(e.currentTarget).closest('tr')
|
|
|
|
|
|
+ onCheckOrUncheck: (e) =>
|
|
|
|
+ @preventDefaultAndStopPropagation(e)
|
|
|
|
+
|
|
|
|
+ row = $(e.currentTarget).closest('tr')
|
|
|
|
+ id = row.data('id')
|
|
checkbox = row.find('.js-checkbox')[0]
|
|
checkbox = row.find('.js-checkbox')[0]
|
|
|
|
|
|
upcomingState = !checkbox.checked
|
|
upcomingState = !checkbox.checked
|
|
|
|
|
|
- checkbox.disabled = true
|
|
|
|
-
|
|
|
|
@updateChecklistItem(id, upcomingState, checkbox)
|
|
@updateChecklistItem(id, upcomingState, checkbox)
|
|
|
|
|
|
updateChecklistItem: (id, upcomingState, checkboxElem) =>
|
|
updateChecklistItem: (id, upcomingState, checkboxElem) =>
|
|
item = App.ChecklistItem.find(id)
|
|
item = App.ChecklistItem.find(id)
|
|
item.checked = upcomingState
|
|
item.checked = upcomingState
|
|
|
|
|
|
|
|
+ @setDisabled(checkboxElem, id)
|
|
|
|
+
|
|
item.save(
|
|
item.save(
|
|
done: =>
|
|
done: =>
|
|
- checkboxElem.disabled = false
|
|
|
|
@renderTable()
|
|
@renderTable()
|
|
fail: =>
|
|
fail: =>
|
|
@renderTable()
|
|
@renderTable()
|
|
)
|
|
)
|
|
|
|
|
|
onSaveOrder: (e) =>
|
|
onSaveOrder: (e) =>
|
|
- @saveOrderButton.attr('disabled', true)
|
|
|
|
|
|
+ saveButton = e.target.closest('button')
|
|
|
|
+ cancelButton = $(saveButton).prev()
|
|
|
|
+ checklistTable = $(document).find('.checklistShow tbody')
|
|
|
|
+
|
|
|
|
+ $(saveButton).attr('disabled', true)
|
|
|
|
+ $(cancelButton).attr('disabled', true)
|
|
|
|
+ $(checklistTable).addClass('u-unclickable u-low-opacity')
|
|
|
|
|
|
sorted_item_ids = @table.find('tbody tr').toArray().map (elem) -> elem.dataset.id
|
|
sorted_item_ids = @table.find('tbody tr').toArray().map (elem) -> elem.dataset.id
|
|
|
|
|
|
@@ -112,12 +113,19 @@ class App.SidebarChecklistShow extends App.Controller
|
|
item.save(
|
|
item.save(
|
|
done: (data) =>
|
|
done: (data) =>
|
|
@actionController?.completed()
|
|
@actionController?.completed()
|
|
|
|
+ $(saveButton).attr('disabled', false)
|
|
|
|
+ $(cancelButton).attr('disabled', false)
|
|
|
|
+ $(checklistTable).removeClass('u-unclickable u-low-opacity')
|
|
|
|
+
|
|
|
|
+
|
|
fail: =>
|
|
fail: =>
|
|
@notify(
|
|
@notify(
|
|
type: 'error'
|
|
type: 'error'
|
|
msg: App.i18n.translateInline('Failed to save the order of the checklist items. Please try again.')
|
|
msg: App.i18n.translateInline('Failed to save the order of the checklist items. Please try again.')
|
|
)
|
|
)
|
|
- @saveOrderButton.attr('disabled', false)
|
|
|
|
|
|
+ $(cancelButton).attr('disabled', false)
|
|
|
|
+ $(saveButton).attr('disabled', false)
|
|
|
|
+ $(checklistTable).removeClass('u-unclickable u-low-opacity')
|
|
)
|
|
)
|
|
|
|
|
|
onResetOrder: (e) =>
|
|
onResetOrder: (e) =>
|
|
@@ -128,12 +136,15 @@ class App.SidebarChecklistShow extends App.Controller
|
|
|
|
|
|
dropdown = $(e.currentTarget).closest('td').find('.js-table-action-menu')
|
|
dropdown = $(e.currentTarget).closest('td').find('.js-table-action-menu')
|
|
dropdown.dropdown('toggle')
|
|
dropdown.dropdown('toggle')
|
|
- dropdown.off('click.dropdown').on('click.dropdown', '[data-table-action]', @onActionButtonClicked)
|
|
|
|
- dropdown.off('keyup.dropdown').on('keyup.dropdown', '[data-table-action]', @onActionButtonKeyup)
|
|
|
|
|
|
+
|
|
|
|
+ dropdown
|
|
|
|
+ .off('click.dropdown')
|
|
|
|
+ .on('click.dropdown', '[data-table-action=delete]', @onDeleteChecklistItem)
|
|
|
|
+ .on('click.dropdown', '[data-table-action=edit]', @onEditChecklistItem)
|
|
|
|
+ .on('click.dropdown', '[data-table-action=check]', @onCheckOrUncheck)
|
|
|
|
|
|
onTitleChange: (e) =>
|
|
onTitleChange: (e) =>
|
|
- e?.stopPropagation()
|
|
|
|
- return if @actionController && @actionController.constructor.name is 'ChecklistReorder'
|
|
|
|
|
|
+ @preventDefaultAndStopPropagation(e)
|
|
|
|
|
|
# Close any open dropdowns
|
|
# Close any open dropdowns
|
|
@el.find('.dropdown--actions.open').dropdown('toggle')
|
|
@el.find('.dropdown--actions.open').dropdown('toggle')
|
|
@@ -146,57 +157,47 @@ class App.SidebarChecklistShow extends App.Controller
|
|
@actionController?.releaseController()
|
|
@actionController?.releaseController()
|
|
@actionController = new ChecklistRenameEdit(el: elem, parentVC: @, originalValue: @checklistTitle())
|
|
@actionController = new ChecklistRenameEdit(el: elem, parentVC: @, originalValue: @checklistTitle())
|
|
|
|
|
|
- onActionButtonKeyup: (e) =>
|
|
|
|
- return if e.key isnt 'Enter'
|
|
|
|
-
|
|
|
|
- @onActionButtonClicked(e)
|
|
|
|
|
|
+ onEntryTextClicked: (e) =>
|
|
|
|
+ return if @actionController instanceof ChecklistItemEdit
|
|
|
|
|
|
- onActionButtonClicked: (e) =>
|
|
|
|
- e?.stopPropagation()
|
|
|
|
- return if @actionController && @actionController.constructor.name is 'ChecklistReorder'
|
|
|
|
|
|
+ # skip on link openings
|
|
|
|
+ return if e.target.tagName is 'A'
|
|
|
|
|
|
- id = $(e.currentTarget).parents('tr').data('id')
|
|
|
|
- name = e.currentTarget.getAttribute('data-table-action')
|
|
|
|
-
|
|
|
|
- if name is 'edit'
|
|
|
|
-
|
|
|
|
- # skip on link openings
|
|
|
|
- return if e.target.tagName is 'A' && $(e.target).parent().hasClass('checklistItemValue')
|
|
|
|
- @onEditChecklistItem(id, e)
|
|
|
|
|
|
+ @preventDefaultAndStopPropagation(e)
|
|
|
|
|
|
- else if name is 'delete'
|
|
|
|
- @onDeleteChecklistItem(id, e)
|
|
|
|
|
|
+ @onEditChecklistItem(e)
|
|
|
|
|
|
- else if _.contains(['check', 'uncheck'], name)
|
|
|
|
- @onCheckOrUncheck(id, e)
|
|
|
|
|
|
+ toggleSortability: (isSorting, disablingCommand = 'disable') =>
|
|
|
|
+ @table.find('tbody').sortable(if isSorting then 'enable' else disablingCommand)
|
|
|
|
|
|
toggleReorder: (isReordering, disablingCommand = 'disable') =>
|
|
toggleReorder: (isReordering, disablingCommand = 'disable') =>
|
|
- @table.find('tbody').sortable(if isReordering then 'enable' else disablingCommand)
|
|
|
|
|
|
+ @toggleSortability(isReordering, disablingCommand)
|
|
|
|
|
|
@table.find('.draggable').toggleClass('hide', !isReordering)
|
|
@table.find('.draggable').toggleClass('hide', !isReordering)
|
|
@table.find('.checkbox-replacement').toggleClass('hide', isReordering)
|
|
@table.find('.checkbox-replacement').toggleClass('hide', isReordering)
|
|
@table.find('.checkbox-replacement-readonly').toggleClass('hide', !isReordering)
|
|
@table.find('.checkbox-replacement-readonly').toggleClass('hide', !isReordering)
|
|
@table.find('.dropdown').toggleClass('hide', isReordering)
|
|
@table.find('.dropdown').toggleClass('hide', isReordering)
|
|
|
|
+ @table.find('.checklistItemValue').toggleClass('js-checklist-item-edit u-clickable', !isReordering && !@readonly)
|
|
|
|
|
|
@reorderButton.toggleClass('hide', isReordering)
|
|
@reorderButton.toggleClass('hide', isReordering)
|
|
@addButton.toggleClass('hide', isReordering)
|
|
@addButton.toggleClass('hide', isReordering)
|
|
@saveOrderButton.toggleClass('hide', !isReordering)
|
|
@saveOrderButton.toggleClass('hide', !isReordering)
|
|
@resetOrderButton.toggleClass('hide', !isReordering)
|
|
@resetOrderButton.toggleClass('hide', !isReordering)
|
|
|
|
|
|
- onEditChecklistItem: (id, e) =>
|
|
|
|
|
|
+ onEditChecklistItem: (e) =>
|
|
@preventDefaultAndStopPropagation(e)
|
|
@preventDefaultAndStopPropagation(e)
|
|
|
|
|
|
- return if @actionController && @actionController.constructor.name is 'ChecklistItemEdit' && @actionController.id == id
|
|
|
|
-
|
|
|
|
row = $(e.currentTarget).closest('tr')
|
|
row = $(e.currentTarget).closest('tr')
|
|
|
|
+ id = row.data('id')
|
|
cell = row.find('.checklistItemValue')[0]
|
|
cell = row.find('.checklistItemValue')[0]
|
|
|
|
|
|
@activateItemEditMode(cell, row, id)
|
|
@activateItemEditMode(cell, row, id)
|
|
|
|
|
|
- onDeleteChecklistItem: (id, e) =>
|
|
|
|
|
|
+ onDeleteChecklistItem: (e) =>
|
|
@preventDefaultAndStopPropagation(e)
|
|
@preventDefaultAndStopPropagation(e)
|
|
|
|
|
|
- row = $(e.currentTarget).closest('tr')
|
|
|
|
|
|
+ row = $(e.currentTarget).closest('tr')
|
|
|
|
+ id = row.data('id')
|
|
|
|
|
|
dropdown = $(e.currentTarget).closest('td').find('.js-table-action-menu')
|
|
dropdown = $(e.currentTarget).closest('td').find('.js-table-action-menu')
|
|
dropdown.dropdown('toggle')
|
|
dropdown.dropdown('toggle')
|
|
@@ -204,10 +205,16 @@ class App.SidebarChecklistShow extends App.Controller
|
|
item = App.ChecklistItem.find(id)
|
|
item = App.ChecklistItem.find(id)
|
|
|
|
|
|
deleteCallback = =>
|
|
deleteCallback = =>
|
|
|
|
+ row.find('.checklistItemValue').css('text-decoration', 'line-through')
|
|
|
|
+
|
|
|
|
+ @setDisabled(e.currentTarget, id)
|
|
|
|
+
|
|
item.destroy(
|
|
item.destroy(
|
|
done: =>
|
|
done: =>
|
|
@renderTable()
|
|
@renderTable()
|
|
@parentVC.subscribe()
|
|
@parentVC.subscribe()
|
|
|
|
+ fail: ->
|
|
|
|
+ row.find('.checklistItemValue').css('text-decoration', 'auto')
|
|
)
|
|
)
|
|
|
|
|
|
# Skip confirmation dialog if the item has no text.
|
|
# Skip confirmation dialog if the item has no text.
|
|
@@ -283,12 +290,11 @@ class ChecklistItemEdit extends App.Controller
|
|
events:
|
|
events:
|
|
'click .js-cancel': 'onCancel'
|
|
'click .js-cancel': 'onCancel'
|
|
'click .js-confirm': 'onConfirm'
|
|
'click .js-confirm': 'onConfirm'
|
|
- 'blur .js-input': 'onConfirm'
|
|
|
|
|
|
+ 'blur .js-input': 'onBlur'
|
|
'keyup #checklistItemEditText': 'onKeyUp'
|
|
'keyup #checklistItemEditText': 'onKeyUp'
|
|
|
|
|
|
constructor: ->
|
|
constructor: ->
|
|
super
|
|
super
|
|
-
|
|
|
|
@render()
|
|
@render()
|
|
|
|
|
|
releaseController: =>
|
|
releaseController: =>
|
|
@@ -313,6 +319,16 @@ class ChecklistItemEdit extends App.Controller
|
|
object: =>
|
|
object: =>
|
|
App.ChecklistItem.find(@id)
|
|
App.ChecklistItem.find(@id)
|
|
|
|
|
|
|
|
+ setDisabled: (node, id) ->
|
|
|
|
+ $(node).closest("[data-id='" + id + "']").attr('disabled', true).addClass('u-unclickable u-low-opacity')
|
|
|
|
+
|
|
|
|
+ onBlur: (e) =>
|
|
|
|
+ if $(e.originalEvent.relatedTarget).hasClass('js-cancel')
|
|
|
|
+ @onCancel(e)
|
|
|
|
+ return
|
|
|
|
+
|
|
|
|
+ @onConfirm(e)
|
|
|
|
+
|
|
onCancel: (e) =>
|
|
onCancel: (e) =>
|
|
@preventDefaultAndStopPropagation(e)
|
|
@preventDefaultAndStopPropagation(e)
|
|
@releaseController()
|
|
@releaseController()
|
|
@@ -320,12 +336,22 @@ class ChecklistItemEdit extends App.Controller
|
|
onConfirm: (e) =>
|
|
onConfirm: (e) =>
|
|
@preventDefaultAndStopPropagation(e)
|
|
@preventDefaultAndStopPropagation(e)
|
|
|
|
|
|
|
|
+ newValue = @input.val()
|
|
|
|
+
|
|
|
|
+ # Prevent AJAX if user has not changed the value
|
|
|
|
+ if @originalValue == newValue
|
|
|
|
+ @releaseController()
|
|
|
|
+ return
|
|
item = @object()
|
|
item = @object()
|
|
- item.text = @input.val()
|
|
|
|
|
|
+ item.text = newValue
|
|
|
|
+
|
|
|
|
+ @setDisabled(e.target, item.id)
|
|
|
|
+
|
|
item.save(
|
|
item.save(
|
|
done: =>
|
|
done: =>
|
|
@parentVC.renderTable()
|
|
@parentVC.renderTable()
|
|
@parentVC.parentVC.subscribe()
|
|
@parentVC.parentVC.subscribe()
|
|
|
|
+ @originalValue = newValue
|
|
fail: (settings, details) =>
|
|
fail: (settings, details) =>
|
|
App.ChecklistItem.fetch(id: item.id)
|
|
App.ChecklistItem.fetch(id: item.id)
|
|
|
|
|
|
@@ -338,7 +364,7 @@ class ChecklistItemEdit extends App.Controller
|
|
|
|
|
|
onKeyUp: (e) =>
|
|
onKeyUp: (e) =>
|
|
switch e.key
|
|
switch e.key
|
|
- when 'Enter' then @onConfirm()
|
|
|
|
|
|
+ when 'Enter' then @onConfirm(e)
|
|
when 'Escape' then @releaseController()
|
|
when 'Escape' then @releaseController()
|
|
|
|
|
|
class ChecklistRenameEdit extends App.Controller
|
|
class ChecklistRenameEdit extends App.Controller
|
|
@@ -347,6 +373,7 @@ class ChecklistRenameEdit extends App.Controller
|
|
events:
|
|
events:
|
|
'click .js-cancel': 'onCancel'
|
|
'click .js-cancel': 'onCancel'
|
|
'click .js-confirm': 'onConfirm'
|
|
'click .js-confirm': 'onConfirm'
|
|
|
|
+ 'blur .js-input': 'onBlur'
|
|
'keyup #checklistTitleEditText': 'onKeyUp'
|
|
'keyup #checklistTitleEditText': 'onKeyUp'
|
|
|
|
|
|
constructor: ->
|
|
constructor: ->
|
|
@@ -358,6 +385,9 @@ class ChecklistRenameEdit extends App.Controller
|
|
@el.text(@originalValue)
|
|
@el.text(@originalValue)
|
|
@parentVC.actionController = undefined
|
|
@parentVC.actionController = undefined
|
|
|
|
|
|
|
|
+ setDisabled: (node) ->
|
|
|
|
+ $(node).closest('tr').attr('disabled', true).addClass('u-unclickable u-low-opacity')
|
|
|
|
+
|
|
render: =>
|
|
render: =>
|
|
@html App.view('ticket_zoom/sidebar_checklist_title_edit')(
|
|
@html App.view('ticket_zoom/sidebar_checklist_title_edit')(
|
|
value: @object()?.name
|
|
value: @object()?.name
|
|
@@ -368,12 +398,20 @@ class ChecklistRenameEdit extends App.Controller
|
|
object: =>
|
|
object: =>
|
|
@parentVC.checklist
|
|
@parentVC.checklist
|
|
|
|
|
|
|
|
+ onBlur: (e) =>
|
|
|
|
+ if $(e.originalEvent.relatedTarget).hasClass('js-cancel')
|
|
|
|
+ @onCancel(e)
|
|
|
|
+ return
|
|
|
|
+
|
|
|
|
+ @onConfirm(e)
|
|
|
|
+
|
|
onCancel: (e) =>
|
|
onCancel: (e) =>
|
|
@preventDefaultAndStopPropagation(e)
|
|
@preventDefaultAndStopPropagation(e)
|
|
@releaseController()
|
|
@releaseController()
|
|
|
|
|
|
onConfirm: (e) =>
|
|
onConfirm: (e) =>
|
|
@preventDefaultAndStopPropagation(e)
|
|
@preventDefaultAndStopPropagation(e)
|
|
|
|
+ @setDisabled(e.target)
|
|
|
|
|
|
checklist = @object()
|
|
checklist = @object()
|
|
checklist.name = @input.val()
|
|
checklist.name = @input.val()
|
|
@@ -384,7 +422,7 @@ class ChecklistRenameEdit extends App.Controller
|
|
|
|
|
|
onKeyUp: (e) =>
|
|
onKeyUp: (e) =>
|
|
switch e.key
|
|
switch e.key
|
|
- when 'Enter' then @onConfirm()
|
|
|
|
|
|
+ when 'Enter' then @onConfirm(e)
|
|
when 'Escape' then @onCancel()
|
|
when 'Escape' then @onCancel()
|
|
|
|
|
|
class ChecklistReorder extends App.Controller
|
|
class ChecklistReorder extends App.Controller
|
|
@@ -394,12 +432,10 @@ class ChecklistReorder extends App.Controller
|
|
|
|
|
|
releaseController: =>
|
|
releaseController: =>
|
|
@parentVC.toggleReorder(false, 'cancel')
|
|
@parentVC.toggleReorder(false, 'cancel')
|
|
- @parentVC.saveOrderButton.attr('disabled', false)
|
|
|
|
@parentVC.actionController = undefined
|
|
@parentVC.actionController = undefined
|
|
|
|
|
|
completed: =>
|
|
completed: =>
|
|
@parentVC.toggleReorder(false)
|
|
@parentVC.toggleReorder(false)
|
|
- @parentVC.saveOrderButton.attr('disabled', false)
|
|
|
|
@parentVC.actionController = undefined
|
|
@parentVC.actionController = undefined
|
|
|
|
|
|
render: =>
|
|
render: =>
|