From ca4380318e92901ed3ea04913a00ea7656f34895 Mon Sep 17 00:00:00 2001 From: Roland Lammel Date: Tue, 1 Oct 2019 01:20:14 +0200 Subject: [PATCH] Make checklist plugin compatible to Redmine 4.0.4 --- app/models/issue_checklist.rb | 5 +- app/views/issues/_checklist.html.erb | 8 +- app/views/issues/_checklist_form.html.erb | 8 +- assets/javascripts/issue_checklist.js | 89 --------------- .../javascripts/issue_checklist.prototype.js | 108 ------------------ init.rb | 2 +- .../patches/issue_patch.rb | 3 +- .../patches/issues_controller_patch.rb | 3 +- 8 files changed, 10 insertions(+), 216 deletions(-) delete mode 100644 assets/javascripts/issue_checklist.js delete mode 100644 assets/javascripts/issue_checklist.prototype.js diff --git a/app/models/issue_checklist.rb b/app/models/issue_checklist.rb index cf5ce49..71e5ec2 100644 --- a/app/models/issue_checklist.rb +++ b/app/models/issue_checklist.rb @@ -2,10 +2,7 @@ class IssueChecklist < ActiveRecord::Base belongs_to :issue belongs_to :author, class_name: 'User', foreign_key: 'author_id' has_one :comment, as: :commented, dependent: :delete - acts_as_list - - attr_accessible :is_done, :subject - attr_protected :id + acts_as_tree validates_presence_of :subject diff --git a/app/views/issues/_checklist.html.erb b/app/views/issues/_checklist.html.erb index 1ed515c..8b89b72 100644 --- a/app/views/issues/_checklist.html.erb +++ b/app/views/issues/_checklist.html.erb @@ -14,11 +14,7 @@ <% end %> <% content_for :header_tags do %> - <% if Redmine::VERSION::MAJOR == 3 || (Redmine::VERSION::MAJOR == 2 && Redmine::VERSION::MINOR >= 1) %> - <%= javascript_include_tag 'jquery.klass.js', plugin: 'redmine_issue_checklist' %> - <%= javascript_include_tag 'issue_checklist.jquery.js', plugin: 'redmine_issue_checklist' %> - <% else %> - <%= javascript_include_tag 'issue_checklist.prototype.js', plugin: 'redmine_issue_checklist' %> - <% end %> + <%= javascript_include_tag 'jquery.klass.js', plugin: 'redmine_issue_checklist' %> + <%= javascript_include_tag 'issue_checklist.jquery.js', plugin: 'redmine_issue_checklist' %> <%= stylesheet_link_tag :issue_checklist, plugin: 'redmine_issue_checklist' %> <% end %> diff --git a/app/views/issues/_checklist_form.html.erb b/app/views/issues/_checklist_form.html.erb index ca5e542..5c447f6 100644 --- a/app/views/issues/_checklist_form.html.erb +++ b/app/views/issues/_checklist_form.html.erb @@ -20,11 +20,7 @@ <% content_for :header_tags do %> - <% if Redmine::VERSION::MAJOR == 3 || (Redmine::VERSION::MAJOR == 2 && Redmine::VERSION::MINOR >= 1) %> - <%= javascript_include_tag 'jquery.klass.js', plugin: 'redmine_issue_checklist' %> - <%= javascript_include_tag 'issue_checklist.jquery.js', plugin: 'redmine_issue_checklist' %> - <% else %> - <%= javascript_include_tag 'issue_checklist.prototype.js', plugin: 'redmine_issue_checklist' %> - <% end %> + <%= javascript_include_tag 'jquery.klass.js', plugin: 'redmine_issue_checklist' %> + <%= javascript_include_tag 'issue_checklist.jquery.js', plugin: 'redmine_issue_checklist' %> <%= stylesheet_link_tag :issue_checklist, plugin: 'redmine_issue_checklist' %> <% end %> diff --git a/assets/javascripts/issue_checklist.js b/assets/javascripts/issue_checklist.js deleted file mode 100644 index 50f8e01..0000000 --- a/assets/javascripts/issue_checklist.js +++ /dev/null @@ -1,89 +0,0 @@ -window.onload = function () { - Sortable.create('checklist_form_items', {tag: 'span'}); -}; - -var Redmine = Redmine || {}; - -Redmine.IssueChecklist = Class.create({ - initialize: function (element, input, button) { - this.element = $(element); - this.input = $(input); - this.button = $(button); - this.checklist = new Hash(); - - Event.observe(this.button, 'click', this.readChecklist.bindAsEventListener(this)); - Event.observe(this.input, 'keypress', this.onKeyPress.bindAsEventListener(this)); - }, - - readChecklist: function (event) { - this.addChecklistItem(this.input.value); - this.input.value = ''; - Event.stop(event); - }, - - onKeyPress: function (event) { - if (Event.KEY_RETURN == event.keyCode) { - this.readChecklist(event); - Event.stop(event); - } - }, - - addChecklistItem: function (сhecklistItem, isDone) { - if (сhecklistItem.blank()) return; - - isDone = isDone || false; - - var hidden = new Element('input', { - 'type': 'hidden', - 'name': 'check_list_items[][subject]', - 'value': сhecklistItem.strip() - }); - var button = new Element('span', {'href': '#', 'class': 'delete icon icon-del'}); - var checkbox = new Element('input', {'type': 'checkbox', 'name': 'check_list_items[][is_done]', 'value': '1'}); - var label = new Element('span', {'class': 'checklist-item'}).insert(hidden).insert(checkbox).insert(сhecklistItem.strip()).insert(button); - - if (isDone == true) { - checkbox.setAttribute('checked', 'checked'); - label.addClassName('is-done-checklist-item'); - } - - this.checklist.set(сhecklistItem, 1); - this.element.insert({'bottom': label}); - - Event.observe(button, 'click', function () { - this.checklist.unset(сhecklistItem); - label.remove(); - // Event.stop(event); - }.bind(this)); - - Event.observe(checkbox, 'click', function () { - if (checkbox.checked == true) { - label.addClassName('is-done-checklist-item'); - } - else { - label.removeClassName('is-done-checklist-item'); - } - - }.bind(this)); - - }, - - addChecklist: function (checklist) { - for (var i = 0; i < checklist.length; i++) { - this.addChecklistItem(checklist[i]['subject'], checklist[i]['is_done']); - } - }, - - getChecklist: function () { - return this.checklist; - }, - -}); - -function observeIssueChecklistField(element, input, add_button) { - issueChecklist = new Redmine.IssueChecklist(element, input, add_button); -} - -function createIssueChecklist(checkList) { - issueChecklist.addChecklist(checkList); -} diff --git a/assets/javascripts/issue_checklist.prototype.js b/assets/javascripts/issue_checklist.prototype.js deleted file mode 100644 index 9fbaa4d..0000000 --- a/assets/javascripts/issue_checklist.prototype.js +++ /dev/null @@ -1,108 +0,0 @@ -window.onload = function () { - Sortable.create('checklist_form_items', {tag: 'span'}); -}; - -var Redmine = Redmine || {}; - -Redmine.IssueChecklist = Class.create({ - initialize: function (element, input, button) { - this.element = $(element); - this.input = $(input); - this.button = $(button); - this.checklist = new Hash(); - - Event.observe(this.button, 'click', this.readChecklist.bindAsEventListener(this)); - Event.observe(this.input, 'keypress', this.onKeyPress.bindAsEventListener(this)); - }, - - readChecklist: function (event) { - this.addChecklistItem(this.input.value); - this.input.value = ''; - Event.stop(event); - }, - - onKeyPress: function (event) { - if (Event.KEY_RETURN == event.keyCode) { - this.readChecklist(event); - Event.stop(event); - } - }, - - addChecklistItem: function (сhecklistItem, isDone) { - if (сhecklistItem.blank()) return; - - isDone = isDone || false; - - var hidden = new Element('input', { - 'type': 'hidden', - 'name': 'check_list_items[][subject]', - 'value': сhecklistItem.strip() - }); - var button = new Element('span', {'href': '#', 'class': 'delete icon icon-del'}); - var checkbox = new Element('input', {'type': 'checkbox', 'name': 'check_list_items[][is_done]', 'value': '1'}); - var label = new Element('span', {'class': 'checklist-item'}).insert(hidden).insert(checkbox).insert(сhecklistItem.strip()).insert(button); - - if (isDone == true) { - checkbox.setAttribute('checked', 'checked'); - label.addClassName('is-done-checklist-item'); - } - - this.checklist.set(сhecklistItem, 1); - this.element.insert({'bottom': label}); - - Event.observe(button, 'click', function () { - this.checklist.unset(сhecklistItem); - label.remove(); - // Event.stop(event); - }.bind(this)); - Event.observe(checkbox, 'click', function () { - if (checkbox.checked == true) { - label.addClassName('is-done-checklist-item'); - } - else { - label.removeClassName('is-done-checklist-item'); - } - - }.bind(this)); - - }, - - addChecklist: function (checklist) { - for (var i = 0; i < checklist.length; i++) { - this.addChecklistItem(checklist[i]['subject'], checklist[i]['is_done']); - } - }, - - getChecklist: function () { - return this.checklist; - }, - -}); - -function observeIssueChecklistField(element, input, add_button) { - issueChecklist = new Redmine.IssueChecklist(element, input, add_button); -} - -function createIssueChecklist(checkList) { - issueChecklist.addChecklist(checkList); -} -function checklist_item_done(elem, url, id) { - new Ajax.Request(url, - { - method: 'get', - onSuccess: function (transport) { - var response = transport.responseText || "no response text"; - eval(response) - }, - onFailure: function () { - alert('Something went wrong...') - } - }); - - var checkbox = $(elem) - if (checkbox) - if (checkbox.checked) - checkbox.up().addClassName('is-done-checklist-item'); - else - checkbox.up().removeClassName('is-done-checklist-item'); -} \ No newline at end of file diff --git a/init.rb b/init.rb index 2762b0d..f3c410a 100644 --- a/init.rb +++ b/init.rb @@ -21,7 +21,7 @@ map.project_module :issue_tracking do |map| map.permission :view_checklists, {} map.permission :done_checklists, { issue_checklist: :done } - map.permission :edit_checklists, { issue_checklist: :delete, issue_checklist: :done } + map.permission :edit_checklists, { issue_checklist: [:delete, :done] } end end diff --git a/lib/redmine_issue_checklist/patches/issue_patch.rb b/lib/redmine_issue_checklist/patches/issue_patch.rb index 7d485b5..244c14b 100644 --- a/lib/redmine_issue_checklist/patches/issue_patch.rb +++ b/lib/redmine_issue_checklist/patches/issue_patch.rb @@ -8,7 +8,8 @@ module IssuePatch def self.included(base) # :nodoc: base.send(:include, InstanceMethods) base.class_eval do - alias_method_chain :copy_from, :checklist + alias_method :copy_from_with_checklist, :copy_from + alias_method :copy_from, :copy_from_with_checklist has_many :checklist, class_name: 'IssueChecklist', dependent: :destroy end diff --git a/lib/redmine_issue_checklist/patches/issues_controller_patch.rb b/lib/redmine_issue_checklist/patches/issues_controller_patch.rb index b6bbeee..befebda 100644 --- a/lib/redmine_issue_checklist/patches/issues_controller_patch.rb +++ b/lib/redmine_issue_checklist/patches/issues_controller_patch.rb @@ -4,7 +4,8 @@ module IssuesControllerPatch extend ActiveSupport::Concern included do - alias_method_chain :build_new_issue_from_params, :checklist + alias_method :build_new_issue_from_params_with_checklist, :build_new_issue_from_params + alias_method :build_new_issue_from_params, :build_new_issue_from_params_with_checklist end def build_new_issue_from_params_with_checklist