Skip to content

Commit e5e5b71

Browse files
committed
Compatible with Redmine 3.3
1 parent 777bc9c commit e5e5b71

File tree

8 files changed

+55
-37
lines changed

8 files changed

+55
-37
lines changed
Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,29 @@
11
class CustomMessageSettingsController < ApplicationController
22
layout 'admin'
3-
self.main_menu = false
43
before_action :require_admin, :set_custom_message_setting, :set_lang
54
require_sudo_mode :edit, :update
65

76
def edit
8-
@lang = params[:lang].presence || User.current.language
97
end
108

119
def update
1210
original_custom_messages = @setting.custom_messages
1311
languages = (original_custom_messages.try(:keys) ? original_custom_messages.keys.map(&:to_s) : [])
1412

15-
if custom_message_setting_params[:custom_messages]
16-
messages = original_custom_messages.merge({@lang => CustomMessageSetting.nested_hash(custom_message_setting_params[:custom_messages].to_unsafe_h.to_hash) })
17-
elsif custom_message_setting_params[:custom_messages_yaml]
18-
messages = custom_message_setting_params[:custom_messages_yaml]
19-
else
20-
messages = {@lang => {}}
13+
if setting_params.key?(:custom_messages) || params[:tab] == 'normal'
14+
@setting.update_with_custom_messages(setting_params[:custom_messages].try(:to_unsafe_h).try(:to_hash) || {}, @lang)
15+
elsif setting_params.key?(:custom_messages_yaml)
16+
@setting.update_with_custom_messages_yaml(setting_params[:custom_messages_yaml])
2117
end
2218

23-
if @setting.update_custom_messages(messages)
19+
if @setting.errors.blank?
2420
flash[:notice] = l(:notice_successful_update)
2521
new_custom_messages = @setting.custom_messages
2622
languages += new_custom_messages.keys.map(&:to_s) if new_custom_messages.try(:keys)
2723
CustomMessageSetting.reload_translations!(languages)
28-
redirect_to edit_custom_message_settings_path(tab: params[:tab])
24+
25+
redirect_to edit_custom_message_settings_path(tab: params[:tab], lang: @lang)
2926
else
30-
@lang ||= User.current.language
3127
render :edit
3228
end
3329
end
@@ -37,11 +33,11 @@ def set_custom_message_setting
3733
@setting = CustomMessageSetting.find_or_default
3834
end
3935

40-
def custom_message_setting_params
36+
def setting_params
4137
params.fetch(:settings, {})
4238
end
4339

4440
def set_lang
45-
@lang = CustomMessageSetting.find_language(params[:lang]) if params[:lang]
41+
@lang = CustomMessageSetting.find_language(params[:lang].presence || User.current.language.presence || 'en')
4642
end
4743
end

app/models/custom_message_setting.rb

Lines changed: 40 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
class CustomMessageSetting < Setting
2-
before_validation :change_format_to_hash
3-
validate :custom_message_keys_are_available
2+
validate :add_errors, :convertible_to_yaml, :custom_message_keys_are_available
43

54
def self.find_or_default
65
super('plugin_redmine_message_customize')
@@ -28,20 +27,43 @@ def custom_messages_to_yaml
2827
end
2928
end
3029

31-
def update_custom_messages(messages)
30+
def update_with_custom_messages(custom_messages, lang)
31+
value = CustomMessageSetting.nested_hash(custom_messages)
32+
original_custom_messages = self.custom_messages
33+
messages =
34+
if value.present?
35+
original_custom_messages.merge({lang => value})
36+
else
37+
original_custom_messages.delete(lang)
38+
original_custom_messages
39+
end
40+
3241
self.value = {custom_messages: (messages.present? ? messages : {})}
3342
self.save
3443
end
3544

45+
def update_with_custom_messages_yaml(yaml)
46+
begin
47+
messages = YAML.load(yaml)
48+
@errs = {base: l(:error_invalid_yaml_format) } if messages.is_a?(Hash) == false && messages.present?
49+
self.value = {custom_messages: (messages.present? ? messages : {})}
50+
rescue => e
51+
@errs = {base: e.message}
52+
self.value = {custom_messages: yaml}
53+
end
54+
self.save
55+
end
56+
3657
def self.available_messages(lang='en')
37-
messages = I18n.backend.translations[self.find_language(lang).to_sym] || {}
58+
messages = I18n.backend.translations[self.find_language(lang).to_sym]
3859
if messages.nil?
3960
CustomMessageSetting.reload_translations!([lang])
4061
messages = I18n.backend.translations[lang.to_sym] || {}
4162
end
4263
self.flatten_hash(messages)
4364
end
4465

66+
# { date: { formats: { defaults: '%m/%d/%Y'}}} to {'date.formats.defaults' => '%m/%d/%Y'}
4567
def self.flatten_hash(hash=nil)
4668
hash = self.to_hash unless hash
4769
hash.each_with_object({}) do |(key, value), content|
@@ -52,8 +74,8 @@ def self.flatten_hash(hash=nil)
5274
end
5375
end
5476

77+
# {'date.formats.defaults' => '%m/%d/%Y'} to { date: { formats: { defaults: '%m/%d/%Y'}}}
5578
def self.nested_hash(hash=nil)
56-
hash = self.to_hash unless hash
5779
new_hash = {}
5880
hash.each do |key, value|
5981
h = value
@@ -87,27 +109,27 @@ def custom_message_keys_are_available
87109
return false if self.value[:custom_messages].is_a?(Hash) == false || self.errors.present?
88110

89111
custom_messages_hash = {}
90-
custom_messages.values.each do |hash|
91-
custom_messages_hash = self.class.flatten_hash(custom_messages_hash.merge(hash))
112+
custom_messages.values.compact.each do |val|
113+
custom_messages_hash = self.class.flatten_hash(custom_messages_hash.merge(val)) if val.is_a?(Hash)
92114
end
93115
available_keys = self.class.flatten_hash(self.class.available_messages).keys
94116
unavailable_keys = custom_messages_hash.keys.reject{|k|available_keys.include?(k.to_sym)}
95117
if unavailable_keys.present?
96118
self.errors.add(:base, l(:error_unavailable_keys) + "keys: [#{unavailable_keys.join(', ')}]")
97-
return false
119+
false
98120
end
99121
end
100122

101-
def change_format_to_hash
102-
if self.value[:custom_messages].is_a?(Hash)
103-
YAML.dump(self.value[:custom_messages])
104-
else
105-
custom_messages = YAML.load(self.value[:custom_messages])
106-
raise l(:error_invalid_yaml_format) unless custom_messages.is_a?(Hash)
107-
self.value = {custom_messages: custom_messages}
123+
def convertible_to_yaml
124+
YAML.dump(self.value[:custom_messages])
125+
end
126+
127+
def add_errors
128+
unless @errs.blank?
129+
@errs.each do |key, value|
130+
self.errors.add(key, value)
131+
end
132+
false
108133
end
109-
rescue => e
110-
self.errors.add(:base, e.message)
111-
false
112134
end
113135
end

app/views/custom_message_settings/_messages.html.erb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
<% lang ||= 'en' %>
21
<div><%= select_tag 'select-key', available_message_options(@setting, lang), id: 'key-selector' %></div>
32
<br>
43
<div class='tabular'>

app/views/custom_message_settings/_normal_tab.html.erb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<%= form_tag custom_message_settings_path, method: :patch do %>
1+
<%= form_tag custom_message_settings_path, method: :post do %>
22
<%= hidden_field_tag :tab, 'normal' %>
33
<label><%= l(:field_language) %>: </label><%= select_tag 'lang', options_for_select(languages_options, @lang), include_blank: true, data: {remote: true, url: url_for(action: :edit)} %>
44
<hr>

app/views/custom_message_settings/_yaml_tab.html.erb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<%= form_tag custom_message_settings_path, method: :patch do %>
1+
<%= form_tag custom_message_settings_path, method: :post do %>
22
<%= hidden_field_tag :tab, 'yaml' %>
33
<div class='help-message wiki'>
44
<p><%= l(:text_help_for_input_format) %></p>
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{ bg: CustomizeMessagesSetting.find_or_default.custom_messages('bg') }
1+
{ bg: CustomMessageSetting.find_or_default.custom_messages('bg') }

config/routes.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Rails.application.routes.draw do
22
resources :custom_message_settings, only: [] do
33
get :edit, on: :collection
4-
patch :update, on: :collection
4+
post :update, on: :collection
55
end
66
end

init.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
p = Redmine::Plugin.register :redmine_message_customize do
22
name 'Redmine customize messages plugin'
33
description 'This is a plugin that allows messages in Redmine to be overwritten from the admin view'
4-
settings :default => { custom_messages: {} }
4+
settings default: { custom_messages: {} }
55
menu :admin_menu, :custom_messages, { controller: 'custom_message_settings', action: 'edit' },
66
caption: :label_custom_messages, html: { class: 'icon icon-edit' }
7+
requires_redmine version_or_higher: '3.3.0'
78
end
89

910
Rails.application.config.i18n.load_path += Dir.glob(File.join(p.directory, 'config', 'locales', 'custom_messages', '*.rb'))

0 commit comments

Comments
 (0)