concerto_manykinds 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/app/assets/javascripts/concerto_manykinds/manykinds.js +35 -18
- data/app/controllers/concerto_manykinds/manykinds_controller.rb +8 -83
- data/app/models/concerto_manykinds/manykind.rb +10 -11
- data/app/views/concerto_manykinds/manykinds/index.html.erb +1 -1
- data/app/views/concerto_manykinds/templates/_details.html.erb +9 -6
- data/app/views/concerto_manykinds/templates/_item.html.erb +1 -1
- data/config/locales/en.yml +2 -0
- data/lib/concerto_manykinds/version.rb +1 -1
- metadata +31 -31
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5e16d5aaaa5da2429a7cd060f68bb323757e0b93
|
4
|
+
data.tar.gz: da4116c271a11e927f9327bde59836aeb46f4acd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 848ddbaca59a72d0bf5af9611c9527f9755a86360a3a486234acd56889941a451dfb1166dee8169d8f44480dfdc9ae86bbc2f6610d36557d0e6689d9e7765957
|
7
|
+
data.tar.gz: 95ea846fe59ca8841944e3c735c3e694e4ce828969271dabd23aa901378b7362596da8ec8ef5bb5c34a7e7c22c847f7edc3762a15af2ca69e215bd4d06d00cf6
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Concerto Manykinds
|
2
2
|
|
3
|
-
A Rails Engine for displaying multiple types of content in the same template field in Concerto.
|
3
|
+
A Rails Engine for displaying multiple types of content in the same template field in Concerto. An example usage scenario is where you have a screen with one field that covers the entire screen-- you can add the other types to that field so that is also shows Text, and Ticker content.
|
4
4
|
|
5
5
|
To use this engine, add the following to the Concerto Gemfile-plugins, or use the UI to add the plugin:
|
6
6
|
```
|
@@ -1,24 +1,41 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
var manykinds_handlers_initialized = false;
|
1
|
+
var ConcertoManykinds = {
|
2
|
+
_initialized: false,
|
4
3
|
|
5
|
-
function
|
6
|
-
|
7
|
-
$('
|
8
|
-
|
9
|
-
$(this).parent('li').hide();
|
10
|
-
});
|
4
|
+
clearAlert: function() {
|
5
|
+
$('#manykind-alert').addClass('hide');
|
6
|
+
$('#manykind-alert h4').innerText = '';
|
7
|
+
},
|
11
8
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
9
|
+
initHandlers: function () {
|
10
|
+
if (!ConcertoManykinds._initialized) {
|
11
|
+
// clear alerts on button/link
|
12
|
+
$(document).on('click', 'ul.manykinds-list .mk-delete', ConcertoManykinds.clearAlert);
|
13
|
+
$(document).on('click', 'form[id="new_manykind"] .mk-add', ConcertoManykinds.clearAlert);
|
16
14
|
|
17
|
-
|
18
|
-
|
15
|
+
$('ul.manykinds-list').on('ajax:success', 'a[data-method="delete"]', function (e, data, status, xhr) {
|
16
|
+
console.debug('firing');
|
17
|
+
$(this).parent('li').hide();
|
18
|
+
});
|
19
|
+
|
20
|
+
$('form[id="new_manykind"]').on('ajax:success', function (e, data, status, xhr) {
|
21
|
+
// show the new item
|
22
|
+
$("#manykinds_fld" + data["field_id"]).append(data["item_html"]);
|
23
|
+
});
|
24
|
+
$('form[id="new_manykind"]').on('ajax:error', function (e, data, status, xhr) {
|
25
|
+
console.debug(data.responseJSON.kind_id.join(', '));
|
26
|
+
ConcertoManykinds.showAlert(data.responseJSON.kind_id.join(', '));
|
27
|
+
});
|
28
|
+
|
29
|
+
console.debug('manykinds handlers initialized');
|
30
|
+
ConcertoManykinds._initialized = true;
|
31
|
+
}
|
32
|
+
},
|
33
|
+
|
34
|
+
showAlert: function (msg) {
|
35
|
+
$('#manykind-alert h4').text(msg);
|
36
|
+
$('#manykind-alert').removeClass('hide');
|
19
37
|
}
|
20
38
|
}
|
21
39
|
|
22
|
-
$(document).ready(
|
23
|
-
$(document).on('page:change',
|
24
|
-
|
40
|
+
$(document).ready(ConcertoManykinds.initHandlers);
|
41
|
+
$(document).on('page:change', ConcertoManykinds.initHandlers);
|
@@ -1,104 +1,29 @@
|
|
1
|
-
require_dependency
|
1
|
+
require_dependency 'concerto_manykinds/application_controller'
|
2
2
|
|
3
3
|
module ConcertoManykinds
|
4
4
|
class ManykindsController < ApplicationController
|
5
|
-
|
6
|
-
# # GET /schedules
|
7
|
-
# # GET /schedules.json
|
8
|
-
# def index
|
9
|
-
# @schedules = Schedule.all
|
10
|
-
# # ignore the schedules that belong to screens we cant read
|
11
|
-
# # or schedules where the template has been deleted
|
12
|
-
# @schedules.reject! { |s| !can?(:read, s.screen) || s.template.nil? }
|
13
|
-
|
14
|
-
# respond_to do |format|
|
15
|
-
# format.html # index.html.erb
|
16
|
-
# format.json { render json: @schedules }
|
17
|
-
# end
|
18
|
-
# end
|
19
|
-
|
20
|
-
# # GET /schedules/1
|
21
|
-
# # GET /schedules/1.json
|
22
|
-
# def show
|
23
|
-
# @schedule = Schedule.find(params[:id])
|
24
|
-
# auth! :action => :read, :object => @schedule.screen
|
25
|
-
|
26
|
-
# respond_to do |format|
|
27
|
-
# format.html # show.html.erb
|
28
|
-
# format.json { render json: @schedule }
|
29
|
-
# end
|
30
|
-
# end
|
31
|
-
|
32
|
-
# # GET /schedules/new
|
33
|
-
# # GET /schedules/new.json
|
34
|
-
# def new
|
35
|
-
# @schedule = Schedule.new
|
36
|
-
# if !params[:screen_id].nil?
|
37
|
-
# # TODO: Error handling
|
38
|
-
# @schedule.screen = Screen.find(params[:screen_id])
|
39
|
-
# end
|
40
|
-
# auth! :action => :update, :object => @schedule.screen
|
41
|
-
|
42
|
-
# respond_to do |format|
|
43
|
-
# format.html # new.html.erb
|
44
|
-
# format.json { render json: @schedule }
|
45
|
-
# end
|
46
|
-
# end
|
47
|
-
|
48
|
-
# # GET /schedules/1/edit
|
49
|
-
# def edit
|
50
|
-
# @schedule = Schedule.find(params[:id])
|
51
|
-
# auth! :action => :update, :object => @schedule.screen
|
52
|
-
# end
|
53
|
-
|
54
|
-
# POST /schedules
|
55
|
-
# POST /schedules.json
|
56
5
|
def create
|
57
6
|
@manykind = Manykind.new(manykind_params)
|
58
|
-
auth! :
|
7
|
+
auth! action: :update, object: @manykind.template
|
59
8
|
respond_to do |format|
|
60
9
|
if @manykind.save
|
61
10
|
format.html { redirect_to @manykind, notice: 'Kind was successfully created.' }
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
render json: { :field_id => @manykind.field.id, :item_html => item_html }, status: :created, location: @manykind
|
11
|
+
format.json do
|
12
|
+
item_html = render_to_string(partial: 'concerto_manykinds/templates/item', object: @manykind, formats: [:html])
|
13
|
+
render json: { field_id: @manykind.field.id, item_html: item_html }, status: :created, location: @manykind
|
66
14
|
end
|
67
15
|
else
|
68
|
-
format.html { render action:
|
16
|
+
format.html { render action: 'new' }
|
69
17
|
format.json { render json: @manykind.errors, status: :unprocessable_entity }
|
70
18
|
end
|
71
19
|
end
|
72
20
|
end
|
73
|
-
|
74
|
-
# # PUT /schedules/1
|
75
|
-
# # PUT /schedules/1.json
|
76
|
-
# def update
|
77
|
-
# @schedule = Schedule.find(params[:id])
|
78
|
-
# auth! :action => :update, :object => @schedule.screen
|
79
21
|
|
80
|
-
# respond_to do |format|
|
81
|
-
# if @schedule.update_attributes(schedule_params)
|
82
|
-
# process_notification(@schedule, {:screen_id => @schedule.screen_id, :screen_name => @schedule.screen.name,
|
83
|
-
# :template_id => @schedule.template.id, :template_name => @schedule.template.name },
|
84
|
-
# :key => 'concerto_template_scheduling.schedule.update', :owner => current_user, :action => 'update')
|
85
|
-
|
86
|
-
# format.html { redirect_to @schedule, notice: 'Schedule was successfully updated.' }
|
87
|
-
# format.json { head :no_content }
|
88
|
-
# else
|
89
|
-
# format.html { render action: "edit" }
|
90
|
-
# format.json { render json: @schedule.errors, status: :unprocessable_entity }
|
91
|
-
# end
|
92
|
-
# end
|
93
|
-
# end
|
94
|
-
|
95
|
-
# DELETE /schedules/1
|
96
|
-
# DELETE /schedules/1.json
|
97
22
|
def destroy
|
98
23
|
@manykind = Manykind.find(params[:id])
|
99
|
-
auth! :
|
24
|
+
auth! action: :update, object: @manykind.template
|
100
25
|
@manykind.destroy
|
101
|
-
|
26
|
+
|
102
27
|
respond_to do |format|
|
103
28
|
format.html { redirect_to manykindsengine.manykinds_url }
|
104
29
|
format.json { head :no_content }
|
@@ -5,31 +5,30 @@ module ConcertoManykinds
|
|
5
5
|
belongs_to :field
|
6
6
|
belongs_to :kind
|
7
7
|
belongs_to :template
|
8
|
-
|
9
|
-
validates :field_id, :
|
10
|
-
validates :kind_id, :
|
11
|
-
validates :template_id, :
|
12
|
-
validates_uniqueness_of :kind_id, :
|
8
|
+
|
9
|
+
validates :field_id, presence: true
|
10
|
+
validates :kind_id, presence: true
|
11
|
+
validates :template_id, presence: true
|
12
|
+
validates_uniqueness_of :kind_id, scope: [:template_id, :field_id], message: I18n.t('concerto_manykinds.already_mapped')
|
13
13
|
|
14
14
|
# TODO dont allow record if already exists in position field mapping
|
15
15
|
validate :cannot_be_same_as_primary
|
16
16
|
|
17
17
|
def cannot_be_same_as_primary
|
18
18
|
if template_id.present? && field_id.present? && kind_id.present?
|
19
|
-
p = Position.where(:
|
20
|
-
if !p.nil?
|
21
|
-
errors.add(:kind_id, '
|
19
|
+
p = Position.where(template_id: template_id, field_id: field_id).first
|
20
|
+
if !p.nil? && p.field.kind_id == kind_id
|
21
|
+
errors.add(:kind_id, I18n.t('concerto_manykinds.already_mapped_via_template', kind: kind.name, field: field.name))
|
22
22
|
end
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
26
|
def self.form_attributes
|
27
|
-
attributes = [:field_id, :template_id,
|
27
|
+
attributes = [:field_id, :template_id, :kind_id]
|
28
28
|
end
|
29
29
|
|
30
30
|
def self.kinds_for(template_id, field_id)
|
31
|
-
Manykind.where(:
|
31
|
+
Manykind.where(template_id: template_id, field_id: field_id)
|
32
32
|
end
|
33
|
-
|
34
33
|
end
|
35
34
|
end
|
@@ -5,7 +5,7 @@
|
|
5
5
|
</div>
|
6
6
|
</div>
|
7
7
|
<h1 class="default-padding">
|
8
|
-
<%= t(:all_model, :
|
8
|
+
<%= t(:all_model, model: ConcertoManykinds::Manykind.model_name.human.pluralize) %>
|
9
9
|
</h1>
|
10
10
|
</header>
|
11
11
|
<div class="viewblock-cont">
|
@@ -1,5 +1,6 @@
|
|
1
1
|
<%= stylesheet_link_tag "concerto_manykinds/application" %>
|
2
2
|
<%= javascript_include_tag "concerto_manykinds/application" %>
|
3
|
+
|
3
4
|
<section class="viewblock">
|
4
5
|
<header class="viewblock-header">
|
5
6
|
|
@@ -18,6 +19,10 @@
|
|
18
19
|
<div class="viewblock-cont">
|
19
20
|
<div class="row-fluid">
|
20
21
|
<div class="span12">
|
22
|
+
<div id="manykind-alert" class="alert alert-banner alert-error hide">
|
23
|
+
<button type="button" class="close" data-dismiss="alert">×</button>
|
24
|
+
<h4></h4>
|
25
|
+
</div>
|
21
26
|
<div class="default-padding">
|
22
27
|
<div class="subblock">
|
23
28
|
<div class="default-padding clearfix">
|
@@ -27,7 +32,7 @@
|
|
27
32
|
<li><%= p.field.kind.name %> <i class='icon-star' title="<%=t('.fundamental_kind')%>"></i></li>
|
28
33
|
<% @manykinds.each do |m| %>
|
29
34
|
<% if m.field.id == p.field.id %>
|
30
|
-
<%= render :
|
35
|
+
<%= render partial: 'concerto_manykinds/templates/item', object: m %>
|
31
36
|
<% end %>
|
32
37
|
<% end %>
|
33
38
|
</ul>
|
@@ -35,8 +40,8 @@
|
|
35
40
|
|
36
41
|
<% if can? :update, @template %>
|
37
42
|
<div class="row-fluid">
|
38
|
-
<%= form_for(@manykind_new, :
|
39
|
-
<%= f.hidden_field :template_id, :
|
43
|
+
<%= form_for(@manykind_new, url: manykindsengine.manykinds_path, html: { 'data-type' => 'json'}, remote: true, class: 'form', format: 'json') do |f| %>
|
44
|
+
<%= f.hidden_field :template_id, value: @template.id %>
|
40
45
|
<div class="span4">
|
41
46
|
<%= f.label :field_id %>
|
42
47
|
<%= f.collection_select :field_id, Field.all, :id, :name %>
|
@@ -47,13 +52,11 @@
|
|
47
52
|
</div>
|
48
53
|
<div class="span2">
|
49
54
|
<label> </label>
|
50
|
-
<%= f.button t(:add), :
|
55
|
+
<%= f.button t(:add), class: 'mk-add btn btn-default' %>
|
51
56
|
</div>
|
52
57
|
</div>
|
53
58
|
<% end %>
|
54
59
|
<% end %>
|
55
|
-
|
56
|
-
|
57
60
|
</div>
|
58
61
|
</div>
|
59
62
|
</div>
|
@@ -1,6 +1,6 @@
|
|
1
1
|
<li>
|
2
2
|
<%= item.kind.name %>
|
3
3
|
<% if can? :update, item.template %>
|
4
|
-
<%= link_to t(:destroy), manykindsengine.manykind_path(item), :
|
4
|
+
<%= link_to t(:destroy), manykindsengine.manykind_path(item), data: { confirm: t('concerto_manykinds.are_you_sure_delete', kind: item.kind.name, field: item.field.name), type: 'json' }, method: :delete, class: "mk-delete btn btn-small", remote: true %>
|
5
5
|
<% end %>
|
6
6
|
</li>
|
data/config/locales/en.yml
CHANGED
@@ -9,6 +9,8 @@ en:
|
|
9
9
|
kind_id: 'Kind'
|
10
10
|
|
11
11
|
concerto_manykinds:
|
12
|
+
already_mapped: 'That kind is already mapped to that field'
|
13
|
+
already_mapped_via_template: 'The %{kind} kind is already mapped to field %{field} via the template definition'
|
12
14
|
are_you_sure_delete: 'Are you sure you want to remove the mapping of the %{kind} from the %{field} field?'
|
13
15
|
|
14
16
|
templates:
|
metadata
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: concerto_manykinds
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marvin Frederickson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-06-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: sqlite3
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -106,7 +106,7 @@ files:
|
|
106
106
|
- test/test_helper.rb
|
107
107
|
- test/unit/concerto_template_scheduling/schedule_test.rb
|
108
108
|
- test/unit/helpers/concerto_template_scheduling/schedules_helper_test.rb
|
109
|
-
homepage: https://github.com/
|
109
|
+
homepage: https://github.com/concerto-addons/concerto-manykinds
|
110
110
|
licenses: []
|
111
111
|
metadata: {}
|
112
112
|
post_install_message:
|
@@ -125,46 +125,46 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
125
125
|
version: '0'
|
126
126
|
requirements: []
|
127
127
|
rubyforge_project:
|
128
|
-
rubygems_version: 2.
|
128
|
+
rubygems_version: 2.6.10
|
129
129
|
signing_key:
|
130
130
|
specification_version: 4
|
131
131
|
summary: Allow multiple kinds (content types) per template field
|
132
132
|
test_files:
|
133
|
+
- test/fixtures/concerto_template_scheduling/schedules.yml
|
134
|
+
- test/test_helper.rb
|
135
|
+
- test/integration/navigation_test.rb
|
136
|
+
- test/functional/concerto_template_scheduling/schedules_controller_test.rb
|
133
137
|
- test/concerto_template_scheduling_test.rb
|
138
|
+
- test/dummy/bin/rake
|
139
|
+
- test/dummy/bin/rails
|
140
|
+
- test/dummy/bin/bundle
|
141
|
+
- test/dummy/public/422.html
|
142
|
+
- test/dummy/public/favicon.ico
|
143
|
+
- test/dummy/public/404.html
|
144
|
+
- test/dummy/public/500.html
|
145
|
+
- test/dummy/app/views/layouts/application.html.erb
|
146
|
+
- test/dummy/app/controllers/application_controller.rb
|
134
147
|
- test/dummy/app/assets/javascripts/application.js
|
135
148
|
- test/dummy/app/assets/stylesheets/application.css
|
136
|
-
- test/dummy/app/controllers/application_controller.rb
|
137
149
|
- test/dummy/app/helpers/application_helper.rb
|
138
|
-
- test/dummy/
|
139
|
-
- test/dummy/
|
140
|
-
- test/dummy/bin/rails
|
141
|
-
- test/dummy/bin/rake
|
142
|
-
- test/dummy/config/application.rb
|
143
|
-
- test/dummy/config/boot.rb
|
144
|
-
- test/dummy/config/database.yml
|
150
|
+
- test/dummy/README.rdoc
|
151
|
+
- test/dummy/Rakefile
|
145
152
|
- test/dummy/config/environment.rb
|
153
|
+
- test/dummy/config/environments/test.rb
|
146
154
|
- test/dummy/config/environments/development.rb
|
147
155
|
- test/dummy/config/environments/production.rb
|
148
|
-
- test/dummy/config/
|
149
|
-
- test/dummy/config/
|
156
|
+
- test/dummy/config/database.yml
|
157
|
+
- test/dummy/config/boot.rb
|
158
|
+
- test/dummy/config/application.rb
|
159
|
+
- test/dummy/config/routes.rb
|
160
|
+
- test/dummy/config/initializers/secret_token.rb
|
150
161
|
- test/dummy/config/initializers/filter_parameter_logging.rb
|
151
162
|
- test/dummy/config/initializers/inflections.rb
|
163
|
+
- test/dummy/config/initializers/wrap_parameters.rb
|
152
164
|
- test/dummy/config/initializers/mime_types.rb
|
153
|
-
- test/dummy/config/initializers/
|
165
|
+
- test/dummy/config/initializers/backtrace_silencers.rb
|
154
166
|
- test/dummy/config/initializers/session_store.rb
|
155
|
-
- test/dummy/config/initializers/wrap_parameters.rb
|
156
167
|
- test/dummy/config/locales/en.yml
|
157
|
-
- test/dummy/config/routes.rb
|
158
168
|
- test/dummy/config.ru
|
159
|
-
- test/dummy/public/404.html
|
160
|
-
- test/dummy/public/422.html
|
161
|
-
- test/dummy/public/500.html
|
162
|
-
- test/dummy/public/favicon.ico
|
163
|
-
- test/dummy/Rakefile
|
164
|
-
- test/dummy/README.rdoc
|
165
|
-
- test/fixtures/concerto_template_scheduling/schedules.yml
|
166
|
-
- test/functional/concerto_template_scheduling/schedules_controller_test.rb
|
167
|
-
- test/integration/navigation_test.rb
|
168
|
-
- test/test_helper.rb
|
169
169
|
- test/unit/concerto_template_scheduling/schedule_test.rb
|
170
170
|
- test/unit/helpers/concerto_template_scheduling/schedules_helper_test.rb
|