refinerycms-nested_models 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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: []
|