parent
1c25306bca
commit
39e11c72dc
@ -0,0 +1,112 @@ |
|||||||
|
#-- encoding: UTF-8 |
||||||
|
#-- copyright |
||||||
|
# OpenProject is a project management system. |
||||||
|
# Copyright (C) 2012-2015 the OpenProject Foundation (OPF) |
||||||
|
# |
||||||
|
# This program is free software; you can redistribute it and/or |
||||||
|
# modify it under the terms of the GNU General Public License version 3. |
||||||
|
# |
||||||
|
# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: |
||||||
|
# Copyright (C) 2006-2013 Jean-Philippe Lang |
||||||
|
# Copyright (C) 2010-2013 the ChiliProject Team |
||||||
|
# |
||||||
|
# This program is free software; you can redistribute it and/or |
||||||
|
# modify it under the terms of the GNU General Public License |
||||||
|
# as published by the Free Software Foundation; either version 2 |
||||||
|
# of the License, or (at your option) any later version. |
||||||
|
# |
||||||
|
# This program is distributed in the hope that it will be useful, |
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
# GNU General Public License for more details. |
||||||
|
# |
||||||
|
# You should have received a copy of the GNU General Public License |
||||||
|
# along with this program; if not, write to the Free Software |
||||||
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
||||||
|
# |
||||||
|
# See doc/COPYRIGHT.rdoc for more details. |
||||||
|
#++ |
||||||
|
|
||||||
|
class AttributeHelpTextsController < ApplicationController |
||||||
|
layout 'admin' |
||||||
|
menu_item :attribute_help_texts |
||||||
|
|
||||||
|
before_action :require_admin |
||||||
|
before_action :find_entry, only: %i(edit update destroy) |
||||||
|
before_action :find_type_scope |
||||||
|
|
||||||
|
def new |
||||||
|
@attribute_help_text = AttributeHelpText.new type: @attribute_scope |
||||||
|
end |
||||||
|
|
||||||
|
def edit; end |
||||||
|
|
||||||
|
def update |
||||||
|
@attribute_help_text.attributes = permitted_params.attribute_help_text |
||||||
|
|
||||||
|
if @attribute_help_text.save |
||||||
|
flash[:notice] = t(:notice_successful_update) |
||||||
|
redirect_to attribute_help_texts_path(tab: @attribute_help_text.attribute_scope) |
||||||
|
else |
||||||
|
render action: 'edit' |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
def create |
||||||
|
@attribute_help_text = AttributeHelpText.new permitted_params.attribute_help_text |
||||||
|
|
||||||
|
if @attribute_help_text.save |
||||||
|
flash[:notice] = t(:notice_successful_create) |
||||||
|
redirect_to attribute_help_texts_path(tab: @attribute_help_text.attribute_scope) |
||||||
|
else |
||||||
|
render action: 'new' |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
def destroy |
||||||
|
if @attribute_help_text.destroy |
||||||
|
flash[:notice] = t(:notice_successful_delete) |
||||||
|
else |
||||||
|
flash[:error] = t(:error_can_not_delete_entry) |
||||||
|
end |
||||||
|
|
||||||
|
redirect_to attribute_help_texts_path(tab: @attribute_help_text.attribute_scope) |
||||||
|
end |
||||||
|
|
||||||
|
def index |
||||||
|
@texts_by_type = AttributeHelpText.all.group_by(&:attribute_scope) |
||||||
|
end |
||||||
|
|
||||||
|
protected |
||||||
|
|
||||||
|
def default_breadcrumb |
||||||
|
if action_name == 'index' |
||||||
|
t('attribute_help_texts.label_plural') |
||||||
|
else |
||||||
|
ActionController::Base.helpers.link_to(t('attribute_help_texts.label_plural'), attribute_help_texts_path) |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
def show_local_breadcrumb |
||||||
|
true |
||||||
|
end |
||||||
|
|
||||||
|
private |
||||||
|
|
||||||
|
def find_entry |
||||||
|
@attribute_help_text = AttributeHelpText.find(params[:id]) |
||||||
|
rescue ActiveRecord::RecordNotFound |
||||||
|
render_404 |
||||||
|
end |
||||||
|
|
||||||
|
def find_type_scope |
||||||
|
name = params.fetch(:name, 'WorkPackage') |
||||||
|
submodule = AttributeHelpText.available_types.find { |mod| mod == name } |
||||||
|
|
||||||
|
if submodule.nil? |
||||||
|
render_404 |
||||||
|
end |
||||||
|
|
||||||
|
@attribute_scope = AttributeHelpText.const_get(submodule) |
||||||
|
end |
||||||
|
end |
@ -0,0 +1,40 @@ |
|||||||
|
#-- encoding: UTF-8 |
||||||
|
|
||||||
|
#-- copyright |
||||||
|
# OpenProject is a project management system. |
||||||
|
# Copyright (C) 2012-2017 the OpenProject Foundation (OPF) |
||||||
|
# |
||||||
|
# This program is free software; you can redistribute it and/or |
||||||
|
# modify it under the terms of the GNU General Public License version 3. |
||||||
|
# |
||||||
|
# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: |
||||||
|
# Copyright (C) 2006-2017 Jean-Philippe Lang |
||||||
|
# Copyright (C) 2010-2013 the ChiliProject Team |
||||||
|
# |
||||||
|
# This program is free software; you can redistribute it and/or |
||||||
|
# modify it under the terms of the GNU General Public License |
||||||
|
# as published by the Free Software Foundation; either version 2 |
||||||
|
# of the License, or (at your option) any later version. |
||||||
|
# |
||||||
|
# This program is distributed in the hope that it will be useful, |
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
# GNU General Public License for more details. |
||||||
|
# |
||||||
|
# You should have received a copy of the GNU General Public License |
||||||
|
# along with this program; if not, write to the Free Software |
||||||
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
||||||
|
# |
||||||
|
# See doc/COPYRIGHT.rdoc for more details. |
||||||
|
#++ |
||||||
|
|
||||||
|
module AttributeHelpTextsHelper |
||||||
|
def selectable_attributes(instance) |
||||||
|
available = instance.class.available_attributes |
||||||
|
used = AttributeHelpText.used_attributes(instance.type) |
||||||
|
|
||||||
|
available.reject! { |k, | used.include? k } |
||||||
|
|
||||||
|
available.map { |k, v| [v, k] } |
||||||
|
end |
||||||
|
end |
@ -0,0 +1,30 @@ |
|||||||
|
|
||||||
|
class AttributeHelpText < ActiveRecord::Base |
||||||
|
def self.available_types |
||||||
|
subclasses.map { |child| child.name.demodulize } |
||||||
|
end |
||||||
|
|
||||||
|
def self.used_attributes(scope) |
||||||
|
where(type: scope) |
||||||
|
.select(:attribute_name) |
||||||
|
.distinct |
||||||
|
.pluck(:attribute_name) |
||||||
|
end |
||||||
|
|
||||||
|
validates_presence_of :help_text |
||||||
|
validates_uniqueness_of :attribute_name, scope: :type |
||||||
|
|
||||||
|
def attribute_caption |
||||||
|
self.class.available_attributes[attribute_name] |
||||||
|
end |
||||||
|
|
||||||
|
def attribute_scope |
||||||
|
raise 'not implemented' |
||||||
|
end |
||||||
|
|
||||||
|
def type_caption |
||||||
|
raise 'not implemented' |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
require_dependency 'attribute_help_text/work_package' |
@ -0,0 +1,15 @@ |
|||||||
|
class AttributeHelpText::WorkPackage < AttributeHelpText |
||||||
|
def self.available_attributes |
||||||
|
Hash[::Query.new.available_columns.map { |c| [c.name.to_s, c.caption] }] |
||||||
|
end |
||||||
|
|
||||||
|
validates_inclusion_of :attribute_name, in: available_attributes.keys |
||||||
|
|
||||||
|
def attribute_scope |
||||||
|
'WorkPackage' |
||||||
|
end |
||||||
|
|
||||||
|
def type_caption |
||||||
|
I18n.t(:label_work_package) |
||||||
|
end |
||||||
|
end |
@ -0,0 +1,47 @@ |
|||||||
|
<%#-- copyright |
||||||
|
OpenProject is a project management system. |
||||||
|
Copyright (C) 2012-2017 the OpenProject Foundation (OPF) |
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or |
||||||
|
modify it under the terms of the GNU General Public License version 3. |
||||||
|
|
||||||
|
OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: |
||||||
|
Copyright (C) 2006-2017 Jean-Philippe Lang |
||||||
|
Copyright (C) 2010-2013 the ChiliProject Team |
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or |
||||||
|
modify it under the terms of the GNU General Public License |
||||||
|
as published by the Free Software Foundation; either version 2 |
||||||
|
of the License, or (at your option) any later version. |
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful, |
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
GNU General Public License for more details. |
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License |
||||||
|
along with this program; if not, write to the Free Software |
||||||
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
||||||
|
|
||||||
|
See doc/COPYRIGHT.rdoc for more details. |
||||||
|
|
||||||
|
++#%> |
||||||
|
<%= error_messages_for 'attribute_help_text' %> |
||||||
|
|
||||||
|
<section class="form--section" id="custom_field_form"> |
||||||
|
<div class="form--field -required"> |
||||||
|
<% if local_assigns[:editing] %> |
||||||
|
<%= f.select :attribute_name, |
||||||
|
[[@attribute_help_text.attribute_caption, @attribute_help_text.attribute_name]], |
||||||
|
{}, |
||||||
|
disabled: true |
||||||
|
%> |
||||||
|
<% else %> |
||||||
|
<%= f.select :attribute_name, selectable_attributes(@attribute_help_text) %> |
||||||
|
<% end %> |
||||||
|
</div> |
||||||
|
<div class="form--field -required"> |
||||||
|
<%= f.text_area :help_text, :cols => 100, :rows => 25, :class => 'wiki-edit' %> |
||||||
|
<%= wikitoolbar_for("#{f.object_name}_help_text") %> |
||||||
|
</div> |
||||||
|
</section> |
@ -0,0 +1,100 @@ |
|||||||
|
<%#-- copyright |
||||||
|
OpenProject is a project management system. |
||||||
|
Copyright (C) 2012-2017 the OpenProject Foundation (OPF) |
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or |
||||||
|
modify it under the terms of the GNU General Public License version 3. |
||||||
|
|
||||||
|
OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: |
||||||
|
Copyright (C) 2006-2017 Jean-Philippe Lang |
||||||
|
Copyright (C) 2010-2013 the ChiliProject Team |
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or |
||||||
|
modify it under the terms of the GNU General Public License |
||||||
|
as published by the Free Software Foundation; either version 2 |
||||||
|
of the License, or (at your option) any later version. |
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful, |
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
GNU General Public License for more details. |
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License |
||||||
|
along with this program; if not, write to the Free Software |
||||||
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
||||||
|
|
||||||
|
See doc/COPYRIGHT.rdoc for more details. |
||||||
|
|
||||||
|
++#%> |
||||||
|
|
||||||
|
<% entries = @texts_by_type[tab[:name]] || [] %> |
||||||
|
<% if entries.any? %> |
||||||
|
<div class="generic-table--container"> |
||||||
|
<div class="generic-table--results-container"> |
||||||
|
<table class="generic-table"> |
||||||
|
<colgroup> |
||||||
|
<col highlight-col> |
||||||
|
<col highlight-col> |
||||||
|
<col highlight-col> |
||||||
|
<col> |
||||||
|
</colgroup> |
||||||
|
<thead> |
||||||
|
<tr> |
||||||
|
<th> |
||||||
|
<div class="generic-table--sort-header-outer"> |
||||||
|
<div class="generic-table--sort-header"> |
||||||
|
<span> |
||||||
|
<%= AttributeHelpText.human_attribute_name(:attribute_name) %> |
||||||
|
</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</th> |
||||||
|
<th> |
||||||
|
<div class="generic-table--sort-header-outer"> |
||||||
|
<div class="generic-table--sort-header"> |
||||||
|
<span> |
||||||
|
<%= AttributeHelpText.human_attribute_name(:help_text) %> |
||||||
|
</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</th> |
||||||
|
<th> |
||||||
|
<div class="generic-table--empty-header"></div> |
||||||
|
</th> |
||||||
|
</tr> |
||||||
|
</thead> |
||||||
|
<tbody> |
||||||
|
<% entries.each do |attribute_help_text| -%> |
||||||
|
<tr class="attribute-help-text--entry"> |
||||||
|
<td> |
||||||
|
<%= link_to h(attribute_help_text.attribute_caption), |
||||||
|
edit_attribute_help_text_path(attribute_help_text) %> |
||||||
|
</td> |
||||||
|
<td> |
||||||
|
<a class="icon" href="#"> |
||||||
|
<%= op_icon('icon icon-help2') %> |
||||||
|
<%= t(:'attribute_help_texts.show_preview') %> |
||||||
|
</a> |
||||||
|
</td> |
||||||
|
<td class="buttons"> |
||||||
|
<%= delete_link attribute_help_text_path(attribute_help_text) %> |
||||||
|
</td> |
||||||
|
</tr> |
||||||
|
<% end %> |
||||||
|
</tbody> |
||||||
|
</table> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<% else %> |
||||||
|
<%= no_results_box %> |
||||||
|
<% end %> |
||||||
|
|
||||||
|
<div class="generic-table--action-buttons"> |
||||||
|
<%= link_to new_attribute_help_text_path(name: tab[:name]), |
||||||
|
{ class: 'attribute-help-texts--create-button button -alt-highlight', |
||||||
|
aria: {label: t(:'attribute_help_texts.add_new')}, |
||||||
|
title: t(:'attribute_help_texts.add_new')} do %> |
||||||
|
<%= op_icon('button--icon icon-add') %> |
||||||
|
<span class="button--text"><%= t('activerecord.models.attribute_help_text') %></span> |
||||||
|
<% end %> |
||||||
|
</div> |
@ -0,0 +1,44 @@ |
|||||||
|
<%#-- copyright |
||||||
|
OpenProject is a project management system. |
||||||
|
Copyright (C) 2012-2017 the OpenProject Foundation (OPF) |
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or |
||||||
|
modify it under the terms of the GNU General Public License version 3. |
||||||
|
|
||||||
|
OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: |
||||||
|
Copyright (C) 2006-2017 Jean-Philippe Lang |
||||||
|
Copyright (C) 2010-2013 the ChiliProject Team |
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or |
||||||
|
modify it under the terms of the GNU General Public License |
||||||
|
as published by the Free Software Foundation; either version 2 |
||||||
|
of the License, or (at your option) any later version. |
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful, |
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
GNU General Public License for more details. |
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License |
||||||
|
along with this program; if not, write to the Free Software |
||||||
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
||||||
|
|
||||||
|
See doc/COPYRIGHT.rdoc for more details. |
||||||
|
|
||||||
|
++#%> |
||||||
|
|
||||||
|
<% html_title t(:label_administration), l(:'attribute_help_texts.edit', attribute_caption: @attribute_help_text.attribute_caption) %> |
||||||
|
<% local_assigns[:additional_breadcrumb] = link_to(@attribute_help_text.type_caption, |
||||||
|
attribute_help_texts_path(tab: @attribute_help_text.attribute_scope)), |
||||||
|
t(:'attribute_help_texts.edit', attribute_caption: @attribute_help_text.attribute_caption) %> |
||||||
|
<%= breadcrumb_toolbar t(:'attribute_help_texts.edit', attribute_caption: @attribute_help_text.attribute_caption) |
||||||
|
%> |
||||||
|
|
||||||
|
<%= labelled_tabular_form_for @attribute_help_text, |
||||||
|
as: 'attribute_help_text', |
||||||
|
url: { action: :update }, |
||||||
|
html: {id: 'attribute_help_text_form'} do |f| %> |
||||||
|
<%= render partial: 'form', locals: { f: f, editing: true } %> |
||||||
|
<%= hidden_field_tag 'attribute_scope', @attribute_help_text.attribute_scope %> |
||||||
|
<%= styled_button_tag l(:button_save), class: '-highlight -with-icon icon-checkmark' %> |
||||||
|
<% end %> |
@ -0,0 +1,42 @@ |
|||||||
|
<%#-- copyright |
||||||
|
OpenProject is a project management system. |
||||||
|
Copyright (C) 2012-2017 the OpenProject Foundation (OPF) |
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or |
||||||
|
modify it under the terms of the GNU General Public License version 3. |
||||||
|
|
||||||
|
OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: |
||||||
|
Copyright (C) 2006-2017 Jean-Philippe Lang |
||||||
|
Copyright (C) 2010-2013 the ChiliProject Team |
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or |
||||||
|
modify it under the terms of the GNU General Public License |
||||||
|
as published by the Free Software Foundation; either version 2 |
||||||
|
of the License, or (at your option) any later version. |
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful, |
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
GNU General Public License for more details. |
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License |
||||||
|
along with this program; if not, write to the Free Software |
||||||
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
||||||
|
|
||||||
|
See doc/COPYRIGHT.rdoc for more details. |
||||||
|
|
||||||
|
++#%> |
||||||
|
<%= toolbar title: t(:'attribute_help_texts.label_plural') %> |
||||||
|
|
||||||
|
<div class="notification-box -info"> |
||||||
|
<div class="notification-box--content"> |
||||||
|
<p><%= t('attribute_help_texts.text_overview') %></p> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<%= render_tabs [ |
||||||
|
{ name: 'WorkPackage', partial: 'attribute_help_texts/tab', label: :label_work_package }, |
||||||
|
] |
||||||
|
%> |
||||||
|
|
||||||
|
<% html_title(t(:label_administration), t(:'attribute_help_texts.label_plural')) -%> |
@ -0,0 +1,44 @@ |
|||||||
|
<%#-- copyright |
||||||
|
OpenProject is a project management system. |
||||||
|
Copyright (C) 2012-2017 the OpenProject Foundation (OPF) |
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or |
||||||
|
modify it under the terms of the GNU General Public License version 3. |
||||||
|
|
||||||
|
OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: |
||||||
|
Copyright (C) 2006-2017 Jean-Philippe Lang |
||||||
|
Copyright (C) 2010-2013 the ChiliProject Team |
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or |
||||||
|
modify it under the terms of the GNU General Public License |
||||||
|
as published by the Free Software Foundation; either version 2 |
||||||
|
of the License, or (at your option) any later version. |
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful, |
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
GNU General Public License for more details. |
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License |
||||||
|
along with this program; if not, write to the Free Software |
||||||
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
||||||
|
|
||||||
|
See doc/COPYRIGHT.rdoc for more details. |
||||||
|
|
||||||
|
++#%> |
||||||
|
|
||||||
|
<% html_title t(:label_administration), t(:'attribute_help_texts.add_new') %> |
||||||
|
<% local_assigns[:additional_breadcrumb] = link_to(@attribute_help_text.type_caption, |
||||||
|
attribute_help_texts_path(tab: @attribute_help_text.attribute_scope)), |
||||||
|
t(:'attribute_help_texts.add_new') %> |
||||||
|
<%= breadcrumb_toolbar t(:'attribute_help_texts.add_new') |
||||||
|
%> |
||||||
|
|
||||||
|
<%= labelled_tabular_form_for @attribute_help_text, |
||||||
|
as: 'attribute_help_text', |
||||||
|
url: { action: :create }, |
||||||
|
html: {id: 'attribute_help_text_form'} do |f| %> |
||||||
|
<%= render partial: 'form', locals: { f: f } %> |
||||||
|
<%= f.hidden_field :type, value: @attribute_help_text.type %> |
||||||
|
<%= styled_button_tag l(:button_save), class: '-highlight -with-icon icon-checkmark' %> |
||||||
|
<% end %> |
@ -0,0 +1,11 @@ |
|||||||
|
class AddAttributeHelpTexts < ActiveRecord::Migration[5.0] |
||||||
|
def change |
||||||
|
create_table :attribute_help_texts do |t| |
||||||
|
t.text :help_text, null: false |
||||||
|
t.string :type, null: false |
||||||
|
t.string :attribute_name, null: false |
||||||
|
|
||||||
|
t.timestamps |
||||||
|
end |
||||||
|
end |
||||||
|
end |
@ -0,0 +1,76 @@ |
|||||||
|
require 'spec_helper' |
||||||
|
|
||||||
|
describe AttributeHelpTextsController, type: :controller do |
||||||
|
let(:model) { FactoryGirl.build :work_package_help_text } |
||||||
|
before do |
||||||
|
expect(controller).to receive(:require_admin) |
||||||
|
end |
||||||
|
|
||||||
|
describe '#index' do |
||||||
|
before do |
||||||
|
allow(AttributeHelpText).to receive(:all).and_return [model] |
||||||
|
|
||||||
|
get :index |
||||||
|
end |
||||||
|
|
||||||
|
it do |
||||||
|
expect(response).to be_success |
||||||
|
expect(assigns(:texts_by_type)).to eql('WorkPackage' => [model]) |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
describe '#edit' do |
||||||
|
context 'when not found' |
||||||
|
before do |
||||||
|
get :edit, params: { id: 1234 } |
||||||
|
end |
||||||
|
|
||||||
|
it do |
||||||
|
expect(response.status).to eq 404 |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
context 'when found' do |
||||||
|
before do |
||||||
|
allow(AttributeHelpText).to receive(:find).and_return(model) |
||||||
|
|
||||||
|
get :edit |
||||||
|
end |
||||||
|
|
||||||
|
it do |
||||||
|
expect(response).to be_success |
||||||
|
expect(assigns(:attribute_help_text)).to eql model |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
describe '#update' do |
||||||
|
before do |
||||||
|
allow(AttributeHelpText).to receive(:find).and_return(model) |
||||||
|
expect(model).to receive(:save).and_return(success) |
||||||
|
put :update, |
||||||
|
params: { |
||||||
|
attribute_help_text: { |
||||||
|
help_text: 'my new help text' |
||||||
|
} |
||||||
|
} |
||||||
|
end |
||||||
|
|
||||||
|
context 'when save is failure' do |
||||||
|
let(:success) { false } |
||||||
|
it 'fails to update the announcement' do |
||||||
|
expect(response).to be_success |
||||||
|
expect(response).to render_template 'edit' |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
context 'when save is success' do |
||||||
|
let(:success) { true } |
||||||
|
it 'edits the announcement' do |
||||||
|
expect(response).to redirect_to action: :index, tab: 'WorkPackage' |
||||||
|
expect(controller).to set_flash[:notice].to I18n.t(:notice_successful_update) |
||||||
|
|
||||||
|
expect(model.help_text).to eq('my new help text') |
||||||
|
end |
||||||
|
end |
||||||
|
end |
||||||
|
end |
@ -0,0 +1,7 @@ |
|||||||
|
FactoryGirl.define do |
||||||
|
factory :work_package_help_text, class: AttributeHelpText::WorkPackage do |
||||||
|
type 'AttributeHelpText::WorkPackage' |
||||||
|
help_text 'Attribute help text' |
||||||
|
attribute_name 'id' |
||||||
|
end |
||||||
|
end |
@ -0,0 +1,90 @@ |
|||||||
|
#-- copyright |
||||||
|
# OpenProject is a project management system. |
||||||
|
# Copyright (C) 2012-2017 the OpenProject Foundation (OPF) |
||||||
|
# |
||||||
|
# This program is free software; you can redistribute it and/or |
||||||
|
# modify it under the terms of the GNU General Public License version 3. |
||||||
|
# |
||||||
|
# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: |
||||||
|
# Copyright (C) 2006-2017 Jean-Philippe Lang |
||||||
|
# Copyright (C) 2010-2013 the ChiliProject Team |
||||||
|
# |
||||||
|
# This program is free software; you can redistribute it and/or |
||||||
|
# modify it under the terms of the GNU General Public License |
||||||
|
# as published by the Free Software Foundation; either version 2 |
||||||
|
# of the License, or (at your option) any later version. |
||||||
|
# |
||||||
|
# This program is distributed in the hope that it will be useful, |
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
# GNU General Public License for more details. |
||||||
|
# |
||||||
|
# You should have received a copy of the GNU General Public License |
||||||
|
# along with this program; if not, write to the Free Software |
||||||
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
||||||
|
# |
||||||
|
# See doc/COPYRIGHT.rdoc for more details. |
||||||
|
#++ |
||||||
|
|
||||||
|
require 'spec_helper' |
||||||
|
|
||||||
|
describe 'Attribute help texts', type: :feature, js: true do |
||||||
|
let(:admin) { FactoryGirl.create(:admin) } |
||||||
|
|
||||||
|
describe 'Work package help texts' do |
||||||
|
before do |
||||||
|
login_as(admin) |
||||||
|
visit attribute_help_texts_path |
||||||
|
end |
||||||
|
|
||||||
|
it 'allows CRUD to attribute help texts' do |
||||||
|
expect(page).to have_selector('.generic-table--no-results-container') |
||||||
|
|
||||||
|
# Create help text |
||||||
|
# -> new |
||||||
|
page.find('.attribute-help-texts--create-button').click |
||||||
|
|
||||||
|
# Set attributes |
||||||
|
# -> create |
||||||
|
select 'Status', from: 'attribute_help_text_attribute_name' |
||||||
|
fill_in 'Help text', with: 'My attribute help text' |
||||||
|
click_button 'Save' |
||||||
|
|
||||||
|
# Should now show on index for editing |
||||||
|
expect(page).to have_selector('.attribute-help-text--entry td', text: 'Status') |
||||||
|
instance = AttributeHelpText.last |
||||||
|
expect(instance.attribute_scope).to eq 'WorkPackage' |
||||||
|
expect(instance.attribute_name).to eq 'status' |
||||||
|
expect(instance.help_text).to eq 'My attribute help text' |
||||||
|
|
||||||
|
# -> edit |
||||||
|
page.find('.attribute-help-text--entry td a', text: 'Status').click |
||||||
|
expect(page).to have_selector('#attribute_help_text_attribute_name[disabled]') |
||||||
|
fill_in 'Help text', with: '' |
||||||
|
click_button 'Save' |
||||||
|
|
||||||
|
# Handle errors |
||||||
|
expect(page).to have_selector('#errorExplanation', text: "Help text can't be blank.") |
||||||
|
fill_in 'Help text', with: 'New help text' |
||||||
|
click_button 'Save' |
||||||
|
|
||||||
|
# On index again |
||||||
|
expect(page).to have_selector('.attribute-help-text--entry td', text: 'Status') |
||||||
|
instance.reload |
||||||
|
expect(instance.help_text).to eq 'New help text' |
||||||
|
|
||||||
|
# Create new, status is now blocked |
||||||
|
page.find('.attribute-help-texts--create-button').click |
||||||
|
expect(page).to have_selector('#attribute_help_text_attribute_name option', text: 'ID') |
||||||
|
expect(page).to have_no_selector('#attribute_help_text_attribute_name option', text: 'Status') |
||||||
|
visit attribute_help_texts_path |
||||||
|
|
||||||
|
# Destroy |
||||||
|
page.find('.attribute-help-text--entry a.icon-delete').click |
||||||
|
page.driver.browser.switch_to.alert.accept |
||||||
|
|
||||||
|
expect(page).to have_selector('.generic-table--no-results-container') |
||||||
|
expect(AttributeHelpText.count).to be_zero |
||||||
|
end |
||||||
|
end |
||||||
|
end |
@ -0,0 +1,72 @@ |
|||||||
|
require 'spec_helper' |
||||||
|
|
||||||
|
describe AttributeHelpText::WorkPackage, type: :model do |
||||||
|
describe '.available_attributes' do |
||||||
|
subject { described_class.available_attributes } |
||||||
|
it 'returns an array of potential attributes' do |
||||||
|
expect(subject).to be_a Hash |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
describe '.used_attributes' do |
||||||
|
let!(:instance) { FactoryGirl.create :work_package_help_text } |
||||||
|
subject { described_class.used_attributes instance.type } |
||||||
|
|
||||||
|
it 'returns used attributes' do |
||||||
|
expect(subject).to eq([instance.attribute_name]) |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
describe 'validations' do |
||||||
|
before do |
||||||
|
allow(described_class).to receive(:available_attributes).and_return(id: 'ID') |
||||||
|
end |
||||||
|
|
||||||
|
let(:attribute_name) { 'id' } |
||||||
|
let(:help_text) { 'foobar' } |
||||||
|
|
||||||
|
subject { described_class.new attribute_name: attribute_name, help_text: help_text } |
||||||
|
|
||||||
|
context 'help_text is nil' do |
||||||
|
let(:help_text) { nil } |
||||||
|
|
||||||
|
it 'validates presence of help text' do |
||||||
|
expect(subject.valid?).to be_falsey |
||||||
|
expect(subject.errors[:help_text].count).to eql(1) |
||||||
|
expect(subject.errors[:help_text].first) |
||||||
|
.to eql(I18n.t('activerecord.errors.messages.blank')) |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
context 'attribute_name is nil' do |
||||||
|
let(:attribute_name) { nil } |
||||||
|
|
||||||
|
it 'validates presence of attribute name' do |
||||||
|
expect(subject.valid?).to be_falsey |
||||||
|
expect(subject.errors[:attribute_name].count).to eql(1) |
||||||
|
expect(subject.errors[:attribute_name].first) |
||||||
|
.to eql(I18n.t('activerecord.errors.messages.inclusion')) |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
context 'attribute_name is invalid' do |
||||||
|
let(:attribute_name) { 'foobar' } |
||||||
|
|
||||||
|
it 'validates inclusion of attribute name' do |
||||||
|
expect(subject.valid?).to be_falsey |
||||||
|
expect(subject.errors[:attribute_name].count).to eql(1) |
||||||
|
expect(subject.errors[:attribute_name].first) |
||||||
|
.to eql(I18n.t('activerecord.errors.messages.inclusion')) |
||||||
|
end |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
describe 'instance' do |
||||||
|
subject { FactoryGirl.build :work_package_help_text } |
||||||
|
|
||||||
|
it 'provides a caption of its type' do |
||||||
|
expect(subject.attribute_scope).to eq 'WorkPackage' |
||||||
|
expect(subject.type_caption).to eq I18n.t(:label_work_package) |
||||||
|
end |
||||||
|
end |
||||||
|
end |
@ -0,0 +1,48 @@ |
|||||||
|
#-- copyright |
||||||
|
# OpenProject is a project management system. |
||||||
|
# Copyright (C) 2012-2017 the OpenProject Foundation (OPF) |
||||||
|
# |
||||||
|
# This program is free software; you can redistribute it and/or |
||||||
|
# modify it under the terms of the GNU General Public License version 3. |
||||||
|
# |
||||||
|
# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: |
||||||
|
# Copyright (C) 2006-2017 Jean-Philippe Lang |
||||||
|
# Copyright (C) 2010-2013 the ChiliProject Team |
||||||
|
# |
||||||
|
# This program is free software; you can redistribute it and/or |
||||||
|
# modify it under the terms of the GNU General Public License |
||||||
|
# as published by the Free Software Foundation; either version 2 |
||||||
|
# of the License, or (at your option) any later version. |
||||||
|
# |
||||||
|
# This program is distributed in the hope that it will be useful, |
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
# GNU General Public License for more details. |
||||||
|
# |
||||||
|
# You should have received a copy of the GNU General Public License |
||||||
|
# along with this program; if not, write to the Free Software |
||||||
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
||||||
|
# |
||||||
|
# See doc/COPYRIGHT.rdoc for more details. |
||||||
|
#++ |
||||||
|
|
||||||
|
require 'spec_helper' |
||||||
|
|
||||||
|
describe AttributeHelpTextsController, type: :routing do |
||||||
|
it 'should route CRUD to the controller' do |
||||||
|
expect(get('/admin/attribute_help_texts')) |
||||||
|
.to route_to(controller: 'attribute_help_texts', action: 'index') |
||||||
|
|
||||||
|
expect(get('/admin/attribute_help_texts/1/edit')) |
||||||
|
.to route_to(controller: 'attribute_help_texts', action: 'edit', id: '1') |
||||||
|
|
||||||
|
expect(post('/admin/attribute_help_texts')) |
||||||
|
.to route_to(controller: 'attribute_help_texts', action: 'create') |
||||||
|
|
||||||
|
expect(put('/admin/attribute_help_texts/1')) |
||||||
|
.to route_to(controller: 'attribute_help_texts', action: 'update', id: '1') |
||||||
|
|
||||||
|
expect(delete('/admin/attribute_help_texts/1')) |
||||||
|
.to route_to(controller: 'attribute_help_texts', action: 'destroy', id: '1') |
||||||
|
end |
||||||
|
end |
Loading…
Reference in new issue