refinerycms-nested_models 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +96 -0
- data/app/assets/javascripts/refinery/nested_models.js.coffee +34 -0
- data/app/assets/stylesheets/refinery/nested_models.css.scss +20 -0
- data/app/views/refinery/admin/_image_picker.html.erb +89 -0
- data/config/locales/cs.yml +27 -0
- data/config/locales/en.yml +27 -0
- data/config/locales/es.yml +28 -0
- data/config/locales/fr.yml +27 -0
- data/config/locales/it.yml +27 -0
- data/config/locales/nb.yml +27 -0
- data/config/locales/nl.yml +27 -0
- data/config/locales/sk.yml +27 -0
- data/config/locales/tr.yml +27 -0
- data/config/locales/zh-CN.yml +29 -0
- data/config/routes.rb +14 -0
- data/db/seeds.rb +0 -0
- data/lib/generators/refinery/nested_models_generator.rb +7 -0
- data/lib/refinery/nested_models/engine.rb +23 -0
- data/lib/refinery/nested_models/view_methods.rb +24 -0
- data/lib/refinery/nested_models.rb +20 -0
- data/lib/refinerycms-nested_models.rb +1 -0
- data/lib/tasks/refinery/nested_models.rake +13 -0
- metadata +114 -0
data/README.md
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
# Nested Models extension for Refinery CMS.
|
2
|
+
|
3
|
+
## How to use
|
4
|
+
|
5
|
+
``` ruby
|
6
|
+
gem 'refinerycms-nested_models'
|
7
|
+
```
|
8
|
+
|
9
|
+
|
10
|
+
## Nesting Models
|
11
|
+
|
12
|
+
You need to nest models in the normal rails way, with accepts nested attributes for e.g. the following in the 'parent' model:
|
13
|
+
|
14
|
+
``` ruby
|
15
|
+
has_many :nested_models
|
16
|
+
accepts_nested_attributes_for :nested_models, allow_destroy: true
|
17
|
+
attr_accessible :nested_models_attributes
|
18
|
+
```
|
19
|
+
|
20
|
+
And the following in the nested model:
|
21
|
+
|
22
|
+
``` ruby
|
23
|
+
belongs_to :page, class_name: 'Refinery::Page'
|
24
|
+
```
|
25
|
+
|
26
|
+
This is the basic setup, you then need to add to your views.
|
27
|
+
|
28
|
+
In the form of the parent model you should add the followuing:
|
29
|
+
|
30
|
+
``` erb
|
31
|
+
<div class='field'>
|
32
|
+
<%= f.label :nested_models %>
|
33
|
+
<%= f.fields_for :nested_models do |j| %>
|
34
|
+
<%= render 'refinery/admin/pages/nested_model_fields', :f => j %>
|
35
|
+
<% end %>
|
36
|
+
<%= link_to_add_fields 'Add nested model', f, :nested_models %>
|
37
|
+
</div>
|
38
|
+
```
|
39
|
+
|
40
|
+
The this block renders any existing nested objects in the page and also adds a link for adding new nested models. This works by embedding the html which should be insert into the page in the data-field of the link. When you click the link JS is executed to replace some placeholders in the data-field and insert it into the page, above the link. Some callbacks are also executed to enable any modals in the newly inserted HTML.
|
41
|
+
|
42
|
+
You will also need to create the partial file mentioned (refinery/admin/pages/nested_model_fields - where nested_model_fields is the singular name of the association from the parent model with "_fields" appended to it).
|
43
|
+
|
44
|
+
Below is an example of the nested model fields:
|
45
|
+
|
46
|
+
``` erb
|
47
|
+
<fieldset class='nested'>
|
48
|
+
<div class='field'>
|
49
|
+
<%= f.label :name %>
|
50
|
+
<%= f.text_field :name %>
|
51
|
+
</div>
|
52
|
+
<div class='field'>
|
53
|
+
<%= f.label :image %>
|
54
|
+
<%= render 'refinery/admin/image_picker', f: f, field: :image_id, image: f.object.image %>
|
55
|
+
</div>
|
56
|
+
<%= link_to_remove_field 'Remove this nested model', f %>
|
57
|
+
</fieldset>
|
58
|
+
```
|
59
|
+
|
60
|
+
This form contains any attributes which should appear from the nested model as well as a link_to_remove_field. Link to remove field adds a link to a JS function and a hidden field to mark the nested element for removal.
|
61
|
+
|
62
|
+
### Sorting nested elements
|
63
|
+
|
64
|
+
To sort nested elements you should add the following code in your parent form:
|
65
|
+
|
66
|
+
``` erb
|
67
|
+
<div class='field' data-sortable='true'>
|
68
|
+
```
|
69
|
+
|
70
|
+
And this into the nested model fields:
|
71
|
+
|
72
|
+
``` erb
|
73
|
+
<%= refinery_icon_tag 'arrow_switch', 'data-handle' => true, :title => 'Reorder', :class => 'handle' %>
|
74
|
+
<%= f.hidden_field :position, 'data-position' => true %>
|
75
|
+
```
|
76
|
+
|
77
|
+
And the following to the nested model:
|
78
|
+
|
79
|
+
``` ruby
|
80
|
+
attr_accessible :position
|
81
|
+
```
|
82
|
+
|
83
|
+
### Adding refinery images to nested models
|
84
|
+
|
85
|
+
Add the following to the nested model:
|
86
|
+
|
87
|
+
``` ruby
|
88
|
+
belongs_to :image, class_name: 'Refinery::Image'
|
89
|
+
```
|
90
|
+
|
91
|
+
And this to the nested field partial:
|
92
|
+
|
93
|
+
``` erb
|
94
|
+
<%= render 'refinery/admin/image_picker', f: f, field: :image_id, image: f.object.image %>
|
95
|
+
```
|
96
|
+
|
@@ -0,0 +1,34 @@
|
|
1
|
+
jQuery ->
|
2
|
+
window.init_nested_sorts()
|
3
|
+
|
4
|
+
$('form').on 'click', '[data-remove="true"]', (event) ->
|
5
|
+
$(this).prev('input[type=hidden]').val('1')
|
6
|
+
$(this).closest('[data-sortable-item="true"]').hide()
|
7
|
+
event.preventDefault()
|
8
|
+
|
9
|
+
$('form').on 'click', '[data-add="true"]', (event) ->
|
10
|
+
time = new Date().getTime()
|
11
|
+
regexp = new RegExp($(this).data('id'), 'g')
|
12
|
+
fields = $(this).data('fields')
|
13
|
+
$(this).before(fields.replace(regexp, time))
|
14
|
+
init_modal_dialogs()
|
15
|
+
init_nested_sorts()
|
16
|
+
event.preventDefault()
|
17
|
+
|
18
|
+
window.init_nested_sorts = ->
|
19
|
+
$('[data-sortable="true"]').each (index,value) ->
|
20
|
+
$(value).sortable
|
21
|
+
axis: 'y',
|
22
|
+
stop: ->
|
23
|
+
updateNestedSortablePositions()
|
24
|
+
handle: '[data-handle="true"]'
|
25
|
+
forcePlaceholderSize: true
|
26
|
+
items: '[data-sortable-item="true"]'
|
27
|
+
updateNestedSortablePositions()
|
28
|
+
|
29
|
+
window.updateNestedSortablePositions = ->
|
30
|
+
$('[data-sortable="true"]').each (index,value) ->
|
31
|
+
$(value).find('[data-sortable-item="true"]').each (nestedIndex,nestedValue) ->
|
32
|
+
$(nestedValue).find('[data-position="true"]').val(nestedIndex)
|
33
|
+
|
34
|
+
|
@@ -0,0 +1,20 @@
|
|
1
|
+
fieldset.nested {
|
2
|
+
margin-top: 10px;
|
3
|
+
border: 1px dotted #CCC;
|
4
|
+
}
|
5
|
+
|
6
|
+
a.add_fields, a.remove_fields {
|
7
|
+
margin-top: 10px;
|
8
|
+
display: inline-block;
|
9
|
+
}
|
10
|
+
|
11
|
+
.ui-sortable-placeholder {
|
12
|
+
background-color: #FFFFCC;
|
13
|
+
border: 2px dashed #FFFF00;
|
14
|
+
visibility: visible !important;
|
15
|
+
min-height: 200px;
|
16
|
+
}
|
17
|
+
|
18
|
+
.handle {
|
19
|
+
float: right;
|
20
|
+
}
|
@@ -0,0 +1,89 @@
|
|
1
|
+
<%
|
2
|
+
description ||= 'image'
|
3
|
+
thumbnail ||= 'medium'
|
4
|
+
toggle_image_display ||= false
|
5
|
+
conditions ||= nil
|
6
|
+
randomiser = f.object.new_record? ? f.object.object_id : rand(Time.now.yesterday.to_i * Time.now.to_i)
|
7
|
+
current_image_link_href = refinery.insert_admin_images_path(:dialog => true, :callback => "image_picker_#{randomiser}_changed",
|
8
|
+
:width => 866, :height => 510, :conditions => conditions)
|
9
|
+
current_image_title = t('.change', :what => description.titleize)
|
10
|
+
-%>
|
11
|
+
<div id='image_picker_container_<%= randomiser %>'>
|
12
|
+
<%= link_to t('.show'), '', :class => "current_image_toggler" if toggle_image_display %>
|
13
|
+
<%= f.hidden_field field, :class => "current_image_id" -%>
|
14
|
+
|
15
|
+
<div class='current_image_container' style="margin-top: 10px<%= ";display: none" if toggle_image_display %>">
|
16
|
+
<a class='current_image_link dialog' href="<%= current_image_link_href %>" style='border: 0px' title='<%= current_image_title %>' name='<%= current_image_title %>'>
|
17
|
+
<% unless image.nil? -%>
|
18
|
+
<%= image_fu image, Refinery::Images.user_image_sizes[thumbnail.to_sym],
|
19
|
+
:class => "brown_border",
|
20
|
+
:class => "current_picked_image" %>
|
21
|
+
<% else -%>
|
22
|
+
<img class="current_picked_image" src="" alt="" style='display: none' />
|
23
|
+
<% end -%>
|
24
|
+
<span class='no_picked_image_selected nothing_selected'<%= " style='display: none;'".html_safe if image.present? %>>
|
25
|
+
<%= t('.none_selected') %>
|
26
|
+
</span>
|
27
|
+
</a>
|
28
|
+
<br/>
|
29
|
+
<%= link_to t('.remove_current'), "#",
|
30
|
+
:class => "remove_picked_image",
|
31
|
+
:style => "#{"display:none;" if image.nil?}" %>
|
32
|
+
</div>
|
33
|
+
</div>
|
34
|
+
|
35
|
+
<% if f.object.new_record? %>
|
36
|
+
<script>
|
37
|
+
var image_picker_<%= randomiser %> = {};
|
38
|
+
$.extend(true, image_picker_<%= randomiser %>, image_picker);
|
39
|
+
image_picker_<%= randomiser %> = image_picker_<%= randomiser %>.init({
|
40
|
+
thumbnail: '<%= thumbnail.html_safe %>'
|
41
|
+
, image_toggler: '<%= toggle_image_display ? ".current_image_toggler" : "null" %>'
|
42
|
+
, description: '<%= description %>'
|
43
|
+
, field: '.current_image_id'
|
44
|
+
, image_display: '.current_picked_image'
|
45
|
+
, no_image_message: '.no_picked_image_selected'
|
46
|
+
, remove_image_button: '.remove_picked_image'
|
47
|
+
, picker_container: '#image_picker_container_<%= (lambda {randomiser}).call %>'
|
48
|
+
, image_container: '.current_image_container'
|
49
|
+
, image_link: '.current_image_link'
|
50
|
+
});
|
51
|
+
|
52
|
+
image_picker_<%= randomiser %>_changed = function(args){
|
53
|
+
$.proxy(image_picker_<%= randomiser %>.changed, {
|
54
|
+
container: '#image_picker_container_<%= randomiser %>'
|
55
|
+
, picker: image_picker_<%= randomiser %>
|
56
|
+
, image: args
|
57
|
+
})();
|
58
|
+
};
|
59
|
+
</script>
|
60
|
+
<% else %>
|
61
|
+
<% content_for :javascripts do -%>
|
62
|
+
<script>
|
63
|
+
var image_picker_<%= randomiser %> = {};
|
64
|
+
$(document).ready(function(e) {
|
65
|
+
$.extend(true, image_picker_<%= randomiser %>, image_picker)
|
66
|
+
image_picker_<%= randomiser %> = image_picker_<%= randomiser %>.init({
|
67
|
+
thumbnail: '<%= thumbnail.html_safe %>'
|
68
|
+
, image_toggler: '<%= toggle_image_display ? ".current_image_toggler" : "null" %>'
|
69
|
+
, description: '<%= description %>'
|
70
|
+
, field: '.current_image_id'
|
71
|
+
, image_display: '.current_picked_image'
|
72
|
+
, no_image_message: '.no_picked_image_selected'
|
73
|
+
, remove_image_button: '.remove_picked_image'
|
74
|
+
, picker_container: '#image_picker_container_<%= (lambda {randomiser}).call %>'
|
75
|
+
, image_container: '.current_image_container'
|
76
|
+
, image_link: '.current_image_link'
|
77
|
+
});
|
78
|
+
});
|
79
|
+
|
80
|
+
image_picker_<%= randomiser %>_changed = function(args){
|
81
|
+
$.proxy(image_picker_<%= randomiser %>.changed, {
|
82
|
+
container: '#image_picker_container_<%= randomiser %>'
|
83
|
+
, picker: image_picker_<%= randomiser %>
|
84
|
+
, image: args
|
85
|
+
})();
|
86
|
+
};
|
87
|
+
</script>
|
88
|
+
<% end %>
|
89
|
+
<% end %>
|
@@ -0,0 +1,27 @@
|
|
1
|
+
cs:
|
2
|
+
refinery:
|
3
|
+
plugins:
|
4
|
+
nested_models:
|
5
|
+
title: Nested Models
|
6
|
+
nested_models:
|
7
|
+
admin:
|
8
|
+
nested_models:
|
9
|
+
actions:
|
10
|
+
create_new: Přidat Nested Model
|
11
|
+
reorder: Řadit Nested Models
|
12
|
+
reorder_done: Konec řazení Nested Models
|
13
|
+
records:
|
14
|
+
title: Nested Models
|
15
|
+
sorry_no_results: Litujeme, ale nebyly nalezny žádné výsledky.
|
16
|
+
no_items_yet: Zatím nebyly vytvořeny žádné Nested Models. Zvolte "Přidat Nested Model" pro přidání prvního nested model.
|
17
|
+
nested_model:
|
18
|
+
view_live_html: Zobrazit náhled nested model<br/><em>(otevře se v novém okně)</em>
|
19
|
+
edit: Upravit nested model
|
20
|
+
delete: Smazat nested model
|
21
|
+
nested_models:
|
22
|
+
show:
|
23
|
+
other: Další Nested Models
|
24
|
+
activerecord:
|
25
|
+
attributes:
|
26
|
+
'refinery/nested_models/nested_model':
|
27
|
+
name: Name
|
@@ -0,0 +1,27 @@
|
|
1
|
+
en:
|
2
|
+
refinery:
|
3
|
+
plugins:
|
4
|
+
nested_models:
|
5
|
+
title: Nested Models
|
6
|
+
nested_models:
|
7
|
+
admin:
|
8
|
+
nested_models:
|
9
|
+
actions:
|
10
|
+
create_new: Add New Nested Model
|
11
|
+
reorder: Reorder Nested Models
|
12
|
+
reorder_done: Done Reordering Nested Models
|
13
|
+
records:
|
14
|
+
title: Nested Models
|
15
|
+
sorry_no_results: Sorry! There are no results found.
|
16
|
+
no_items_yet: There are no Nested Models yet. Click "Add New Nested Model" to add your first nested model.
|
17
|
+
nested_model:
|
18
|
+
view_live_html: View this nested model live <br/><em>(opens in a new window)</em>
|
19
|
+
edit: Edit this nested model
|
20
|
+
delete: Remove this nested model forever
|
21
|
+
nested_models:
|
22
|
+
show:
|
23
|
+
other: Other Nested Models
|
24
|
+
activerecord:
|
25
|
+
attributes:
|
26
|
+
'refinery/nested_models/nested_model':
|
27
|
+
name: Name
|
@@ -0,0 +1,28 @@
|
|
1
|
+
es:
|
2
|
+
refinery:
|
3
|
+
plugins:
|
4
|
+
nested_models:
|
5
|
+
title: Nested Models
|
6
|
+
# article: masculino/femenino
|
7
|
+
nested_models:
|
8
|
+
admin:
|
9
|
+
nested_models:
|
10
|
+
actions:
|
11
|
+
create_new: Crear nuevo nested model
|
12
|
+
reorder: Reordenar nested models
|
13
|
+
reorder_done: Reordenación de nested models completada
|
14
|
+
records:
|
15
|
+
title: Nested Models
|
16
|
+
sorry_no_results: Lo siento, no hay resultados
|
17
|
+
no_items_yet: No hay nested models todavía. Pulsa en "Crear nuevo Nested Model" para crear tu primer nested model.
|
18
|
+
nested_model:
|
19
|
+
view_live_html: Ver este nested model como abierto al público <br/><em>(abre en ventana nueva)</em>
|
20
|
+
edit: Editar este nested model
|
21
|
+
delete: Borrar este nested model para siempre
|
22
|
+
nested_models:
|
23
|
+
show:
|
24
|
+
other: Otros nested models
|
25
|
+
activerecord:
|
26
|
+
attributes:
|
27
|
+
'refinery/nested_models/nested_model':
|
28
|
+
name: Name
|
@@ -0,0 +1,27 @@
|
|
1
|
+
fr:
|
2
|
+
refinery:
|
3
|
+
plugins:
|
4
|
+
nested_models:
|
5
|
+
title: Nested Models
|
6
|
+
nested_models:
|
7
|
+
admin:
|
8
|
+
nested_models:
|
9
|
+
actions:
|
10
|
+
create_new: Créer un(e) nouve(au/l/lle) Nested Model
|
11
|
+
reorder: Réordonner les Nested Models
|
12
|
+
reorder_done: Fin de réordonnancement des Nested Models
|
13
|
+
records:
|
14
|
+
title: Nested Models
|
15
|
+
sorry_no_results: "Désolé ! Aucun résultat."
|
16
|
+
no_items_yet: 'Il n''y a actuellement aucun(e) Nested Model. Cliquer sur "Créer un(e) nouve(au/l/lle) Nested Model" pour créer votre premi(er/ère) nested model.'
|
17
|
+
nested_model:
|
18
|
+
view_live_html: Voir ce(t/tte) nested model <br/><em>(Ouvre une nouvelle fenêtre)</em>
|
19
|
+
edit: Modifier ce(t/tte) nested model
|
20
|
+
delete: Supprimer définitivement ce(t/tte) nested model
|
21
|
+
nested_models:
|
22
|
+
show:
|
23
|
+
other: Autres Nested Models
|
24
|
+
activerecord:
|
25
|
+
attributes:
|
26
|
+
'refinery/nested_models/nested_model':
|
27
|
+
name: Name
|
@@ -0,0 +1,27 @@
|
|
1
|
+
it:
|
2
|
+
refinery:
|
3
|
+
plugins:
|
4
|
+
nested_models:
|
5
|
+
title: Nested Models
|
6
|
+
nested_models:
|
7
|
+
admin:
|
8
|
+
nested_models:
|
9
|
+
actions:
|
10
|
+
create_new: Aggiungi Nuovo Nested Model
|
11
|
+
reorder: Riordina Nested Models
|
12
|
+
reorder_done: Termina il Riordino di Nested Models
|
13
|
+
records:
|
14
|
+
title: Nested Models
|
15
|
+
sorry_no_results: "Spiacenti! Nessun risultato trovato"
|
16
|
+
no_items_yet: Non ci sono ancora Nested Models. Clicca "Aggiungi Nuovo Nested Model" per aggiungere il tuo primo nested model.
|
17
|
+
nested_model:
|
18
|
+
view_live_html: Guarda live questo nested model <br/><em>(apre una nuova finestra)</em>
|
19
|
+
edit: Modifica questo nested model
|
20
|
+
delete: Rimuovi per sempre questo nested model
|
21
|
+
nested_models:
|
22
|
+
show:
|
23
|
+
other: Altri Nested Models
|
24
|
+
activerecord:
|
25
|
+
attributes:
|
26
|
+
'refinery/nested_models/nested_model':
|
27
|
+
name: Name
|
@@ -0,0 +1,27 @@
|
|
1
|
+
nb:
|
2
|
+
refinery:
|
3
|
+
plugins:
|
4
|
+
nested_models:
|
5
|
+
title: Nested Models
|
6
|
+
nested_models:
|
7
|
+
admin:
|
8
|
+
nested_models:
|
9
|
+
actions:
|
10
|
+
create_new: Lag en ny Nested Model
|
11
|
+
reorder: Endre rekkefølgen på Nested Models
|
12
|
+
reorder_done: Ferdig å endre rekkefølgen Nested Models
|
13
|
+
records:
|
14
|
+
title: Nested Models
|
15
|
+
sorry_no_results: Beklager! Vi fant ikke noen resultater.
|
16
|
+
no_items_yet: Det er ingen Nested Models enda. Klikk på "Lag en ny Nested Model" for å legge til din første nested model.
|
17
|
+
nested_model:
|
18
|
+
view_live_html: Vis hvordan denne nested model ser ut offentlig <br/><em>(åpner i et nytt vindu)</em>
|
19
|
+
edit: Rediger denne nested model
|
20
|
+
delete: Fjern denne nested model permanent
|
21
|
+
nested_models:
|
22
|
+
show:
|
23
|
+
other: Andre Nested Models
|
24
|
+
activerecord:
|
25
|
+
attributes:
|
26
|
+
'refinery/nested_models/nested_model':
|
27
|
+
name: Name
|
@@ -0,0 +1,27 @@
|
|
1
|
+
nl:
|
2
|
+
refinery:
|
3
|
+
plugins:
|
4
|
+
nested_models:
|
5
|
+
title: Nested Models
|
6
|
+
nested_models:
|
7
|
+
admin:
|
8
|
+
nested_models:
|
9
|
+
actions:
|
10
|
+
create_new: Nieuwe Nested Model toevoegen
|
11
|
+
reorder: De volgorde van de Nested Models wijzigen
|
12
|
+
reorder_done: Klaar met het wijzingen van de van de Nested Model-volgorde
|
13
|
+
records:
|
14
|
+
title: Nested Models
|
15
|
+
sorry_no_results: Helaas! Er zijn geen resultaten gevonden.
|
16
|
+
no_items_yet: Er zijn nog geen Nested Models. Druk op 'Nieuwe Nested Model toevoegen' om de eerste toe te voegen.
|
17
|
+
nested_model:
|
18
|
+
view_live_html: Deze nested model op de website bekijken <br/><em>(opent in een nieuw venster)</em>
|
19
|
+
edit: Bewerk deze nested model
|
20
|
+
delete: Deze nested model definitief verwijderen
|
21
|
+
nested_models:
|
22
|
+
show:
|
23
|
+
other: Andere Nested Models
|
24
|
+
activerecord:
|
25
|
+
attributes:
|
26
|
+
'refinery/nested_models/nested_model':
|
27
|
+
name: Name
|
@@ -0,0 +1,27 @@
|
|
1
|
+
sk:
|
2
|
+
refinery:
|
3
|
+
plugins:
|
4
|
+
nested_models:
|
5
|
+
title: Nested Models
|
6
|
+
nested_models:
|
7
|
+
admin:
|
8
|
+
nested_models:
|
9
|
+
actions:
|
10
|
+
create_new: Pridať Nested Model
|
11
|
+
reorder: Preusporiadať Nested Models
|
12
|
+
reorder_done: Koniec radenia Nested Models
|
13
|
+
records:
|
14
|
+
title: Nested Models
|
15
|
+
sorry_no_results: Ľutujeme, ale neboli nájdené žiadne výsledky.
|
16
|
+
no_items_yet: Nie sú vytvorené žiadne Nested Models. Kliknite na "Pridať Nested Model" pre pridanie prvého nested model.
|
17
|
+
nested_model:
|
18
|
+
view_live_html: Zobraziť náhľad nested model<br/><em>(otvorí sa v novom okne)</em>
|
19
|
+
edit: Upraviť nested model
|
20
|
+
delete: Zmazať nested model
|
21
|
+
nested_models:
|
22
|
+
show:
|
23
|
+
other: Daľšie Nested Models
|
24
|
+
activerecord:
|
25
|
+
attributes:
|
26
|
+
'refinery/nested_models/nested_model':
|
27
|
+
name: Name
|
@@ -0,0 +1,27 @@
|
|
1
|
+
tr:
|
2
|
+
refinery:
|
3
|
+
plugins:
|
4
|
+
nested_models:
|
5
|
+
title: Nested Models
|
6
|
+
nested_models:
|
7
|
+
admin:
|
8
|
+
nested_models:
|
9
|
+
actions:
|
10
|
+
create_new: Yeni Ekle Nested Model
|
11
|
+
reorder: Tekrar sirala Nested Models
|
12
|
+
reorder_done: Tekrar siralama tamamlandiNested Models
|
13
|
+
records:
|
14
|
+
title: Nested Models
|
15
|
+
sorry_no_results: Uzgunum! Herhangi bir sonuc bulunamadi.
|
16
|
+
no_items_yet: Herhangi bir Nested Models yok henuz. Tikla "Yeni Ekle Nested Model" eklemek senin ilk nested model.
|
17
|
+
nested_model:
|
18
|
+
view_live_html: Bunu canlu nested model goruntule <br/><em>(yeni bir pencerede acar)</em>
|
19
|
+
edit: Bunu Duzenle nested model
|
20
|
+
delete: Bunu Sil nested model sonsuza dek
|
21
|
+
nested_models:
|
22
|
+
show:
|
23
|
+
other: Diger Nested Models
|
24
|
+
activerecord:
|
25
|
+
attributes:
|
26
|
+
'refinery/nested_models/nested_model':
|
27
|
+
name: Name
|
@@ -0,0 +1,29 @@
|
|
1
|
+
zh-CN:
|
2
|
+
refinery:
|
3
|
+
plugins:
|
4
|
+
nested_models:
|
5
|
+
title: Nested Models
|
6
|
+
nested_models:
|
7
|
+
admin:
|
8
|
+
nested_models:
|
9
|
+
actions:
|
10
|
+
create_new: 建立新的 Nested Model
|
11
|
+
reorder: 对 Nested Models 重新排序
|
12
|
+
reorder_done: 对 Nested Models 的重新排序结束
|
13
|
+
records:
|
14
|
+
title: Nested Models
|
15
|
+
sorry_no_results: 对不起,未找到结果。 #Sorry! There are no results found.
|
16
|
+
|
17
|
+
# There are no Nested Models yet. Click "Add New Nested Model" to add your first nested model.
|
18
|
+
no_items_yet: 目前没有 Nested Models . 点击 "Add New Nested Model" 创建一个nested model.
|
19
|
+
nested_model:
|
20
|
+
view_live_html: 查看 nested model 的最新内容.<br/><em>(新窗口中打开)</em>
|
21
|
+
edit: 编辑 nested model
|
22
|
+
delete: 永久删除 nested model
|
23
|
+
nested_models:
|
24
|
+
show:
|
25
|
+
other: 其他 Nested Models
|
26
|
+
activerecord:
|
27
|
+
attributes:
|
28
|
+
'refinery/nested_models/nested_model':
|
29
|
+
name: Name
|
data/config/routes.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
Refinery::Core::Engine.routes.draw do
|
2
|
+
|
3
|
+
# Admin routes
|
4
|
+
namespace :nested_models, :path => '' do
|
5
|
+
namespace :admin, :path => Refinery::Core.backend_route do
|
6
|
+
resources :nested_models, :except => :show do
|
7
|
+
collection do
|
8
|
+
post :update_positions
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
data/db/seeds.rb
ADDED
File without changes
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Refinery
|
2
|
+
module NestedModels
|
3
|
+
class Engine < Rails::Engine
|
4
|
+
extend Refinery::Engine
|
5
|
+
isolate_namespace Refinery::NestedModels
|
6
|
+
|
7
|
+
engine_name :refinery_nested_models
|
8
|
+
|
9
|
+
initializer "register refinerycms_nested_models plugin" do
|
10
|
+
# do not register plugin
|
11
|
+
end
|
12
|
+
|
13
|
+
config.after_initialize do
|
14
|
+
Refinery.register_extension(Refinery::NestedModels)
|
15
|
+
end
|
16
|
+
|
17
|
+
Refinery::Core.configure do |config| # # Register extra javascript for backend
|
18
|
+
config.register_javascript 'refinery/nested_models.js.coffee'
|
19
|
+
config.register_stylesheet "refinery/nested_models.css.scss", :media => 'screen'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Refinery
|
2
|
+
module NestedModels
|
3
|
+
module ViewMethods
|
4
|
+
|
5
|
+
def link_to_add_fields(name, f, association)
|
6
|
+
new_object = f.object.send(association).klass.new
|
7
|
+
id = new_object.object_id
|
8
|
+
fields = f.fields_for(association, new_object, child_index: id) do |builder|
|
9
|
+
render(association.to_s.singularize + "_fields", f: builder)
|
10
|
+
end
|
11
|
+
link_to(name, '#', class: "add_fields", data: {id: id, add: true, fields: fields.gsub("\n", "")})
|
12
|
+
end
|
13
|
+
|
14
|
+
def link_to_remove_field(label, builder)
|
15
|
+
ret = ''
|
16
|
+
ret += builder.hidden_field :_destroy, :class => 'destroy'
|
17
|
+
ret += link_to_function label, 'return true', class: 'remove_fields', data: {remove: true}
|
18
|
+
raw ret
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
::ActionView::Base.send(:include, Refinery::NestedModels::ViewMethods)
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'refinerycms-core'
|
2
|
+
require 'refinery/nested_models/view_methods'
|
3
|
+
|
4
|
+
module Refinery
|
5
|
+
module NestedModels
|
6
|
+
require 'refinery/nested_models/engine'
|
7
|
+
|
8
|
+
class << self
|
9
|
+
attr_writer :root
|
10
|
+
|
11
|
+
def root
|
12
|
+
@root ||= Pathname.new(File.expand_path('../../../', __FILE__))
|
13
|
+
end
|
14
|
+
|
15
|
+
def factory_paths
|
16
|
+
@factory_paths ||= [ root.join('spec', 'factories').to_s ]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'refinery/nested_models'
|
metadata
ADDED
@@ -0,0 +1,114 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: refinerycms-nested_models
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease:
|
5
|
+
version: 0.0.1
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Nick Bolt
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-10-04 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
type: :runtime
|
16
|
+
version_requirements: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - ~>
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: 2.1.0
|
21
|
+
none: false
|
22
|
+
prerelease: false
|
23
|
+
name: refinerycms-core
|
24
|
+
requirement: !ruby/object:Gem::Requirement
|
25
|
+
requirements:
|
26
|
+
- - ~>
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
version: 2.1.0
|
29
|
+
none: false
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
type: :development
|
32
|
+
version_requirements: !ruby/object:Gem::Requirement
|
33
|
+
requirements:
|
34
|
+
- - ~>
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: 2.1.0
|
37
|
+
none: false
|
38
|
+
prerelease: false
|
39
|
+
name: refinerycms-testing
|
40
|
+
requirement: !ruby/object:Gem::Requirement
|
41
|
+
requirements:
|
42
|
+
- - ~>
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: 2.1.0
|
45
|
+
none: false
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
type: :development
|
48
|
+
version_requirements: !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
50
|
+
- - ~>
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: 1.4.1
|
53
|
+
none: false
|
54
|
+
prerelease: false
|
55
|
+
name: poltergeist
|
56
|
+
requirement: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ~>
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: 1.4.1
|
61
|
+
none: false
|
62
|
+
description: Ruby on Rails Nested Models extension for Refinery CMS
|
63
|
+
email:
|
64
|
+
executables: []
|
65
|
+
extensions: []
|
66
|
+
extra_rdoc_files: []
|
67
|
+
files:
|
68
|
+
- app/views/refinery/admin/_image_picker.html.erb
|
69
|
+
- app/assets/stylesheets/refinery/nested_models.css.scss
|
70
|
+
- app/assets/javascripts/refinery/nested_models.js.coffee
|
71
|
+
- config/locales/sk.yml
|
72
|
+
- config/locales/it.yml
|
73
|
+
- config/locales/fr.yml
|
74
|
+
- config/locales/tr.yml
|
75
|
+
- config/locales/nl.yml
|
76
|
+
- config/locales/es.yml
|
77
|
+
- config/locales/cs.yml
|
78
|
+
- config/locales/zh-CN.yml
|
79
|
+
- config/locales/en.yml
|
80
|
+
- config/locales/nb.yml
|
81
|
+
- config/routes.rb
|
82
|
+
- db/seeds.rb
|
83
|
+
- lib/tasks/refinery/nested_models.rake
|
84
|
+
- lib/refinery/nested_models.rb
|
85
|
+
- lib/refinery/nested_models/view_methods.rb
|
86
|
+
- lib/refinery/nested_models/engine.rb
|
87
|
+
- lib/generators/refinery/nested_models_generator.rb
|
88
|
+
- lib/refinerycms-nested_models.rb
|
89
|
+
- README.md
|
90
|
+
homepage:
|
91
|
+
licenses: []
|
92
|
+
post_install_message:
|
93
|
+
rdoc_options: []
|
94
|
+
require_paths:
|
95
|
+
- lib
|
96
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
97
|
+
requirements:
|
98
|
+
- - ! '>='
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
version: '0'
|
101
|
+
none: false
|
102
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
103
|
+
requirements:
|
104
|
+
- - ! '>='
|
105
|
+
- !ruby/object:Gem::Version
|
106
|
+
version: '0'
|
107
|
+
none: false
|
108
|
+
requirements: []
|
109
|
+
rubyforge_project:
|
110
|
+
rubygems_version: 1.8.25
|
111
|
+
signing_key:
|
112
|
+
specification_version: 3
|
113
|
+
summary: Nested Models extension for Refinery CMS
|
114
|
+
test_files: []
|