vitrage 0.0.3 → 0.0.4
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.
- checksums.yaml +5 -5
- data/README.md +12 -1
- data/app/assets/javascripts/vitrage/editor.js.coffee +82 -27
- data/app/assets/javascripts/vitrage/vitrage.js +3 -2
- data/app/assets/stylesheets/vitrage/editor.scss +3 -0
- data/app/controllers/vitrage/pieces_controller.rb +91 -24
- data/app/views/vitrage/_edit.html.erb +6 -4
- data/app/views/vitrage/_edit_wraped_piece.html.erb +5 -1
- data/app/views/vitrage/pieces/create.html.erb +1 -1
- data/app/views/vitrage/pieces/create.js.erb +1 -0
- data/app/views/vitrage/pieces/new.html.erb +16 -1
- data/app/views/vitrage/pieces/show.html.erb +1 -1
- data/config/locales/vitrage_en.yml +2 -1
- data/config/locales/vitrage_ru.yml +1 -0
- data/lib/generators/vitrage/templates/vitrage_slot.rb +13 -0
- data/lib/vitrage/router.rb +14 -13
- data/lib/vitrage/version.rb +1 -1
- data/vendor/assets/javascript/Sortable.js +1051 -0
- metadata +21 -6
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 266999f8015d3ceb887463b45bf24b74cbfd55eaa742182f45ed65b2e5442bd9
|
|
4
|
+
data.tar.gz: 6d2cee221763193b3d02afe29e8bb081b2124e97d15851b976fecae95e094f5d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 9f52fe81e123bcb423d6d71aac3a7844424692cbf3685061c162dd4ef7c5971590ea69a910a87bc425a0a5f57250d79a0795ca3da3e9a2fe1e0de5bc455baf4c
|
|
7
|
+
data.tar.gz: 3864193fc3736f6475ecdcec557cdb25d7490f290077e5ca88c088103827d84cb2d31435b007b511709b553b7ef3a217b2ff654d4c629ad4ce27bd9a697932c6
|
data/README.md
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
Vitrage
|
|
2
2
|
=======
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
> [!WARNING]
|
|
5
|
+
> This project has been archived and is no longer supported.
|
|
6
|
+
|
|
7
|
+
Vitrage allows you to store and manage your Rails application content as separated pieces of different types: text, image, slider, several-columned text etc. Pieces are objects of different Rails models, that have their specific views for show and edit actions. Vitrage allows you to edit the content pieces inline.
|
|
5
8
|
|
|
6
9
|
<img src="http://www.vitroart.ru/upload/information_system_35/4/2/2/item_422/information_items_1242584051.jpg" alt="vitrage of glass" height="600" width="379">
|
|
7
10
|
|
|
11
|
+
[](http://badge.fury.io/rb/vitrage)
|
|
12
|
+
[](https://www.omniref.com/ruby/gems/vitrage)
|
|
8
13
|
|
|
9
14
|
Installation
|
|
10
15
|
------------
|
|
@@ -32,8 +37,14 @@ Now, migrate your database: `bin/rake db:migrate`
|
|
|
32
37
|
|
|
33
38
|
Require js in your js file (`application.js` by default):
|
|
34
39
|
|
|
40
|
+
//= require jquery
|
|
41
|
+
//= require jquery_ujs
|
|
42
|
+
//= require jquery.remotipart
|
|
35
43
|
//= require vitrage/vitrage
|
|
36
44
|
|
|
45
|
+
Vitrage needs jquery, jquery_ujs and jquery.remotipart for correct work.
|
|
46
|
+
If you have this scripts already required, just skip inserting they strings.
|
|
47
|
+
|
|
37
48
|
Require vitrage css in your css file (`application.css` by default):
|
|
38
49
|
|
|
39
50
|
*= require vitrage/vitrage
|
|
@@ -1,23 +1,68 @@
|
|
|
1
1
|
$(document).ready ->
|
|
2
2
|
if $(".vtrg-add-new-wrapper").length
|
|
3
3
|
|
|
4
|
+
# # # SORTABLE module # TODO find correct place for this module
|
|
5
|
+
sortableo = null
|
|
6
|
+
sortable_el = document.getElementById('vitrage-edit')
|
|
7
|
+
|
|
8
|
+
initSortable = ->
|
|
9
|
+
if sortableo
|
|
10
|
+
sortableo.destroy()
|
|
11
|
+
sortableo = null
|
|
12
|
+
sortableo = Sortable.create document.getElementById('vitrage-edit'),
|
|
13
|
+
sort: true
|
|
14
|
+
handle: ".vtrg-edit-control-move"
|
|
15
|
+
onUpdate: (evnt) ->
|
|
16
|
+
draggedItem = $(evnt.item)
|
|
17
|
+
nextItem = draggedItem.next()
|
|
18
|
+
# console.log "Next item has id = " + nextItem.data("id")
|
|
19
|
+
$.ajax
|
|
20
|
+
url: "/vitrage/pieces/" + draggedItem.data("id") + "/reorder"
|
|
21
|
+
type: "POST"
|
|
22
|
+
dataType: "json"
|
|
23
|
+
data:
|
|
24
|
+
beforeid: if nextItem.length then nextItem.data("id") else "end"
|
|
25
|
+
# success: (data, textStatus, jqXHR) ->
|
|
26
|
+
# error: null # TODO
|
|
27
|
+
|
|
28
|
+
initSortable()
|
|
29
|
+
# # # END OF SORTABLE module
|
|
30
|
+
|
|
31
|
+
event_provider = $(".vtrg-add-new-wrapper")
|
|
32
|
+
|
|
4
33
|
toggleEditorBlocker = ($editWrapper, act) ->
|
|
5
34
|
$editWrapper.toggleClass 'blocked', act
|
|
6
35
|
|
|
7
|
-
|
|
8
|
-
|
|
36
|
+
showPieceInputsErrors = ($editWrapper, responseText) ->
|
|
37
|
+
$editWrapper.find("li.input.error").removeClass("error")
|
|
38
|
+
|
|
39
|
+
data = null
|
|
40
|
+
try
|
|
41
|
+
data = JSON.parse(responseText)
|
|
42
|
+
catch error
|
|
43
|
+
a = 12 # at least we tried
|
|
44
|
+
return true unless data
|
|
45
|
+
|
|
46
|
+
if data.piece && data.errors
|
|
47
|
+
for key, val of data.errors
|
|
48
|
+
$errorIWrapper = $editWrapper.find "li.input#vitrage_pieces_" + data.piece.toString() + "_" + key.toString() + "_input"
|
|
49
|
+
$errorIWrapper.addClass "error"
|
|
50
|
+
|
|
51
|
+
# --- # --- SHOW --- # --- #
|
|
52
|
+
restoreShowState = ($editWrapper, viewdata) ->
|
|
9
53
|
if viewdata
|
|
10
54
|
$editWrapper.removeClass "editmode"
|
|
11
55
|
$editWrapper.children(".vtrg-edit-body").html viewdata
|
|
12
56
|
toggleEditorBlocker $editWrapper, false
|
|
57
|
+
event_provider.trigger "vitrageshowed", [ $editWrapper[0] ]
|
|
13
58
|
else
|
|
14
59
|
$.ajax
|
|
15
60
|
url: "/vitrage/pieces/" + $editWrapper.data("id")
|
|
16
61
|
# type: "GET"
|
|
17
62
|
dataType: "html"
|
|
18
63
|
success: (data, textStatus, jqXHR) ->
|
|
19
|
-
|
|
20
|
-
# error: null
|
|
64
|
+
restoreShowState $editWrapper, data
|
|
65
|
+
# error: null # TODO
|
|
21
66
|
|
|
22
67
|
# --- # --- UPDATE and cancel editing --- # --- #
|
|
23
68
|
coverEditFormActions = ($editWrapper) ->
|
|
@@ -29,9 +74,14 @@ $(document).ready ->
|
|
|
29
74
|
return true # do your work buddy
|
|
30
75
|
|
|
31
76
|
$blockForm.on "ajax:success", (evnt, data, textStatus, jqXHR) ->
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
77
|
+
event_provider.trigger "vitrageupdated"
|
|
78
|
+
restoreShowState $(@).closest(".vtrg-edit-wrapper")
|
|
79
|
+
|
|
80
|
+
$blockForm.on "ajax:error", (evnt, xhr, status, error) ->
|
|
81
|
+
showPieceInputsErrors $(@).closest(".vtrg-edit-wrapper"), xhr.responseText
|
|
82
|
+
|
|
83
|
+
$blockForm.on "ajax:complete", (evnt, para1, para2) ->
|
|
84
|
+
toggleEditorBlocker $(@).closest(".vtrg-edit-wrapper"), false
|
|
35
85
|
|
|
36
86
|
|
|
37
87
|
# cover Cancel action
|
|
@@ -41,7 +91,7 @@ $(document).ready ->
|
|
|
41
91
|
if clickedAnchorParentID && clickedAnchorParentID.substr(clickedAnchorParentID.length - 13) == "cancel_action"
|
|
42
92
|
evnt.preventDefault()
|
|
43
93
|
toggleEditorBlocker $editWrapper, true
|
|
44
|
-
|
|
94
|
+
restoreShowState $editWrapper
|
|
45
95
|
return false
|
|
46
96
|
|
|
47
97
|
# --- # --- EDIT --- # --- #
|
|
@@ -52,14 +102,14 @@ $(document).ready ->
|
|
|
52
102
|
toggleEditorBlocker $editWrapper, true
|
|
53
103
|
$.ajax
|
|
54
104
|
url: "/vitrage/pieces/" + $editWrapper.data("id") + "/edit"
|
|
55
|
-
# type: "GET"
|
|
56
105
|
dataType: "html"
|
|
57
106
|
success: (data, textStatus, jqXHR) ->
|
|
58
107
|
$editWrapper.addClass "editmode"
|
|
59
108
|
$editWrapper.children(".vtrg-edit-body").html data
|
|
60
109
|
coverEditFormActions $editWrapper
|
|
61
110
|
toggleEditorBlocker $editWrapper, false
|
|
62
|
-
|
|
111
|
+
event_provider.trigger "vitrageedit", [ $editWrapper ]
|
|
112
|
+
# error: null # TODO
|
|
63
113
|
return
|
|
64
114
|
return
|
|
65
115
|
# init edit control for all exists
|
|
@@ -78,7 +128,8 @@ $(document).ready ->
|
|
|
78
128
|
dataType: "html"
|
|
79
129
|
success: (data, textStatus, jqXHR) ->
|
|
80
130
|
$editWrapper.remove()
|
|
81
|
-
|
|
131
|
+
event_provider.trigger "vitragedestroyed"
|
|
132
|
+
# error: null # TODO
|
|
82
133
|
return
|
|
83
134
|
return
|
|
84
135
|
# init destroy control for all exists
|
|
@@ -94,18 +145,18 @@ $(document).ready ->
|
|
|
94
145
|
return true # do your work buddy
|
|
95
146
|
|
|
96
147
|
$blockForm.on "ajax:success", (evnt, data, textStatus, jqXHR) ->
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
$blockForm.on "ajax:complete", ->
|
|
148
|
+
$editWrapper = $(@).closest(".vtrg-edit-wrapper")
|
|
149
|
+
$editWrapper.attr 'data-id', data
|
|
150
|
+
initDestroyControl $editWrapper
|
|
151
|
+
initEditControl $editWrapper
|
|
152
|
+
event_provider.trigger "vitragecreated", [ $editWrapper ]
|
|
153
|
+
restoreShowState $editWrapper
|
|
154
|
+
initSortable()
|
|
155
|
+
|
|
156
|
+
$blockForm.on "ajax:error", (evnt, xhr, status, error) ->
|
|
157
|
+
showPieceInputsErrors $(@).closest(".vtrg-edit-wrapper"), xhr.responseText
|
|
158
|
+
|
|
159
|
+
$blockForm.on "ajax:complete", (evnt, para1, para2) ->
|
|
109
160
|
toggleEditorBlocker $(@).closest(".vtrg-edit-wrapper"), false
|
|
110
161
|
|
|
111
162
|
# cover Cancel action
|
|
@@ -120,7 +171,11 @@ $(document).ready ->
|
|
|
120
171
|
# --- # --- NEW --- # --- #
|
|
121
172
|
$createAnchors = $(".vtrg-new-block-kinds a")
|
|
122
173
|
$createAnchors.on "ajax:success", (evnt, data, textStatus, jqXHR) ->
|
|
123
|
-
$(".vtrg-add-new-wrapper").before data
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
174
|
+
# $(".vtrg-add-new-wrapper").before data
|
|
175
|
+
$("#vitrage-edit").append data
|
|
176
|
+
$editWrapper = $(".vtrg-edit-wrapper:last")
|
|
177
|
+
coverNewFormActions $editWrapper
|
|
178
|
+
event_provider.trigger "vitragenew", [ $editWrapper ]
|
|
179
|
+
|
|
180
|
+
# $createAnchors.on "ajax:error" # TODO
|
|
181
|
+
# $createAnchors.on "ajax:complete" # TODO
|
|
@@ -13,6 +13,7 @@ $vtrg-act-color: #c19a6b; // Цвет увядших листьев
|
|
|
13
13
|
.vtrg-edit-control {
|
|
14
14
|
display: none;
|
|
15
15
|
position: absolute;
|
|
16
|
+
z-index: 99;
|
|
16
17
|
&.top { top: 0; left: 0; }
|
|
17
18
|
&.bottom { right: 0; bottom: 0; }
|
|
18
19
|
padding: 4px;
|
|
@@ -38,6 +39,8 @@ $vtrg-act-color: #c19a6b; // Цвет увядших листьев
|
|
|
38
39
|
}
|
|
39
40
|
|
|
40
41
|
// ==== add new block button ==== ==== ==== ==== ==== ==== ==== ==== ==== ====
|
|
42
|
+
.vtrg-add-new-wrapper { margin: 32px; }
|
|
43
|
+
|
|
41
44
|
.vtrg-add-new {
|
|
42
45
|
display: block;
|
|
43
46
|
text-align: center;
|
|
@@ -7,7 +7,7 @@ module Vitrage
|
|
|
7
7
|
format.html { render layout: false }
|
|
8
8
|
end
|
|
9
9
|
end
|
|
10
|
-
|
|
10
|
+
|
|
11
11
|
def new
|
|
12
12
|
piece_class = params[:kind]
|
|
13
13
|
unless piece_class &&
|
|
@@ -15,75 +15,95 @@ module Vitrage
|
|
|
15
15
|
piece_class = VitrageOwnersPiecesSlot::PIECE_CLASSES_STRINGS.first
|
|
16
16
|
end
|
|
17
17
|
@piece = VitragePieces.const_get(piece_class).new
|
|
18
|
-
|
|
18
|
+
|
|
19
19
|
respond_to do |format|
|
|
20
20
|
format.html { render layout: false }
|
|
21
21
|
end
|
|
22
22
|
end
|
|
23
|
-
|
|
23
|
+
|
|
24
24
|
def edit
|
|
25
25
|
respond_to do |format|
|
|
26
26
|
format.html { render layout: false }
|
|
27
27
|
end
|
|
28
28
|
end
|
|
29
|
-
|
|
29
|
+
|
|
30
30
|
def create
|
|
31
|
-
|
|
31
|
+
error_state = nil
|
|
32
32
|
|
|
33
33
|
# check existance of params
|
|
34
34
|
unless params[:kind] &&
|
|
35
35
|
VitrageOwnersPiecesSlot::PIECE_CLASSES_STRINGS.include?(params[:kind]) &&
|
|
36
36
|
params[:owner_type] &&
|
|
37
37
|
params[:owner_id]
|
|
38
|
-
|
|
38
|
+
error_state = { descr: "Necessary parameters didn't exist error" }
|
|
39
39
|
end
|
|
40
40
|
|
|
41
41
|
# get the owner of vitrage
|
|
42
|
-
|
|
42
|
+
if error_state.nil?
|
|
43
43
|
@owner = nil
|
|
44
44
|
begin
|
|
45
45
|
@owner = Object.const_get(params[:owner_type]).find params[:owner_id]
|
|
46
46
|
rescue Exception => e
|
|
47
|
-
|
|
47
|
+
error_state = { descr: "Owner find error" }
|
|
48
48
|
end
|
|
49
49
|
end
|
|
50
50
|
|
|
51
51
|
# create piece
|
|
52
|
-
|
|
52
|
+
if error_state.nil?
|
|
53
53
|
@piece = VitragePieces.const_get(params[:kind]).new
|
|
54
54
|
@piece.assign_attributes vitrage_piece_params
|
|
55
|
-
|
|
55
|
+
unless @piece.save
|
|
56
|
+
error_state = {
|
|
57
|
+
descr: "Piece save error",
|
|
58
|
+
piece: @piece.class.name.demodulize.underscore,
|
|
59
|
+
errors: @piece.errors
|
|
60
|
+
}
|
|
61
|
+
end
|
|
56
62
|
end
|
|
57
63
|
|
|
58
64
|
# create vitrage slot
|
|
59
|
-
|
|
65
|
+
if error_state.nil?
|
|
60
66
|
@slot = VitrageOwnersPiecesSlot.new owner: @owner, piece: @piece
|
|
61
67
|
unless @slot.save
|
|
62
|
-
|
|
68
|
+
error_state = { descr: "Slot save error" }
|
|
63
69
|
@piece.destroy
|
|
64
70
|
end
|
|
65
71
|
end
|
|
66
72
|
|
|
67
|
-
if
|
|
73
|
+
if error_state
|
|
68
74
|
respond_to do |format|
|
|
69
|
-
format.html { render
|
|
75
|
+
format.html { render json: error_state.merge({ status: 'error' }),
|
|
76
|
+
status: :unprocessable_entity }
|
|
70
77
|
end
|
|
71
78
|
else
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
79
|
+
respond_to do |format|
|
|
80
|
+
format.html { render layout: false }
|
|
81
|
+
format.js # for remotipart gem correct work (ajax multipart form)
|
|
82
|
+
end
|
|
83
|
+
# render layout: false
|
|
76
84
|
end
|
|
77
85
|
end
|
|
78
|
-
|
|
79
|
-
def update
|
|
80
|
-
@piece.update vitrage_piece_params
|
|
81
86
|
|
|
82
|
-
|
|
83
|
-
|
|
87
|
+
def update
|
|
88
|
+
if @piece.update(vitrage_piece_params)
|
|
89
|
+
respond_to do |format|
|
|
90
|
+
format.html { render text: "" }
|
|
91
|
+
format.js { render text: "" }
|
|
92
|
+
end
|
|
93
|
+
else
|
|
94
|
+
error_state = {
|
|
95
|
+
status: 'error',
|
|
96
|
+
descr: "Piece save error",
|
|
97
|
+
piece: @piece.class.name.demodulize.underscore,
|
|
98
|
+
errors: @piece.errors
|
|
99
|
+
}
|
|
100
|
+
respond_to do |format|
|
|
101
|
+
format.html { render json: error_state, status: :unprocessable_entity }
|
|
102
|
+
format.js { render json: error_state, status: :unprocessable_entity }
|
|
103
|
+
end
|
|
84
104
|
end
|
|
85
105
|
end
|
|
86
|
-
|
|
106
|
+
|
|
87
107
|
def destroy
|
|
88
108
|
@slot = VitrageOwnersPiecesSlot.find params[:id]
|
|
89
109
|
@slot.destroy
|
|
@@ -93,6 +113,53 @@ module Vitrage
|
|
|
93
113
|
end
|
|
94
114
|
end
|
|
95
115
|
|
|
116
|
+
def reorder
|
|
117
|
+
moved_slot = VitrageOwnersPiecesSlot.find params[:id]
|
|
118
|
+
wrong_params = false
|
|
119
|
+
|
|
120
|
+
if params[:beforeid].present?
|
|
121
|
+
if params[:beforeid] == "end"
|
|
122
|
+
max_ordn = moved_slot.owner.vitrage_slots.maximum(:ordn)
|
|
123
|
+
moved_slot.update_attributes ordn: max_ordn ? max_ordn + 1 : 1
|
|
124
|
+
else
|
|
125
|
+
|
|
126
|
+
slot_after_moved = VitrageOwnersPiecesSlot.find_by_id params[:beforeid]
|
|
127
|
+
if slot_after_moved.present? && slot_after_moved.owner == moved_slot.owner
|
|
128
|
+
ordn_for_moved = slot_after_moved.ordn
|
|
129
|
+
all_slots_after_moved = moved_slot.owner.vitrage_slots.
|
|
130
|
+
where("vitrage_owners_pieces_slots.ordn >= ?", ordn_for_moved).
|
|
131
|
+
where.not(id: moved_slot.id).
|
|
132
|
+
order(ordn: :asc)
|
|
133
|
+
all_slots_after_moved.each do |slot|
|
|
134
|
+
slot.update_attributes ordn: slot.ordn + 1
|
|
135
|
+
end
|
|
136
|
+
moved_slot.update_attributes ordn: ordn_for_moved
|
|
137
|
+
|
|
138
|
+
else
|
|
139
|
+
wrong_params = true
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
else
|
|
143
|
+
wrong_params = true
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
if wrong_params
|
|
147
|
+
render text: "wrong params", status: :unprocessable_entity
|
|
148
|
+
else
|
|
149
|
+
render text: "ok"
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
def restore_order
|
|
154
|
+
owners = VitrageOwnersPiecesSlot.all.collect { |vp| vp.owner }.uniq
|
|
155
|
+
owners.each do |owner|
|
|
156
|
+
owner.vitrage_slots.each_with_index do |slot, indx|
|
|
157
|
+
slot.update_attributes ordn: indx + 1
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
render text: "ok"
|
|
161
|
+
end
|
|
162
|
+
|
|
96
163
|
private
|
|
97
164
|
|
|
98
165
|
def find_vitrage_piece
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
<%= evil_icons_sprite %>
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
<div id="vitrage-edit">
|
|
3
|
+
<% owner.vitrage_slots.each do |slot| %>
|
|
4
|
+
<%= render partial: "vitrage/edit_wraped_piece", locals: { slot: slot } %>
|
|
5
|
+
<% end %>
|
|
6
|
+
</div>
|
|
5
7
|
|
|
6
8
|
<div class="vtrg-add-new-wrapper">
|
|
7
9
|
<div class="vtrg-new-block-kinds">
|
|
8
|
-
<span><%= evil_icon 'ei-plus', size: "
|
|
10
|
+
<span><%= evil_icon 'ei-plus', size: "m" %></span>
|
|
9
11
|
<% VitrageOwnersPiecesSlot::PIECE_CLASSES_STRINGS.each do |piece_class_string| %>
|
|
10
12
|
<%= link_to "", Rails.application.routes.url_helpers.new_vitrage_piece_path(kind: piece_class_string, owner_type: owner.class.name, owner_id: owner.id), role: "button", class: piece_class_string.underscore.dasherize, remote: true %>
|
|
11
13
|
<% end %>
|
|
@@ -1,8 +1,12 @@
|
|
|
1
|
+
<% slot = slot || nil %>
|
|
1
2
|
<% piece = piece || slot.piece %>
|
|
2
3
|
|
|
3
|
-
<div class="vtrg-edit-wrapper" data-id="<%= slot.id %>">
|
|
4
|
+
<div class="vtrg-edit-wrapper" data-id="<%= (slot ? slot.id : 'new') %>">
|
|
4
5
|
<% ['top', 'bottom'].each do |position_class| %>
|
|
5
6
|
<div class="vtrg-edit-control <%= position_class %>">
|
|
7
|
+
<a href="javascript:void(0)" role="button" rel="move" class="vtrg-edit-control-move" title="<%= t('vitrage.move') %>">
|
|
8
|
+
<%= evil_icon 'ei-retweet', size: "m" %>
|
|
9
|
+
</a>
|
|
6
10
|
<a href="javascript:void(0)" role="button" rel="edit" title="<%= t('vitrage.edit') %>">
|
|
7
11
|
<%= evil_icon 'ei-pencil', size: "m" %>
|
|
8
12
|
</a>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<%=
|
|
1
|
+
<%= @slot.id %>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<%= @slot.id %>
|
|
@@ -1,4 +1,19 @@
|
|
|
1
1
|
<div class="vtrg-edit-wrapper editmode">
|
|
2
|
+
<% ['top', 'bottom'].each do |position_class| %>
|
|
3
|
+
<div class="vtrg-edit-control <%= position_class %>">
|
|
4
|
+
<a href="javascript:void(0)" role="button" rel="move" class="vtrg-edit-control-move" title="<%= t('vitrage.move') %>">
|
|
5
|
+
<%= evil_icon 'ei-retweet', size: "m" %>
|
|
6
|
+
</a>
|
|
7
|
+
<a href="javascript:void(0)" role="button" rel="edit" title="<%= t('vitrage.edit') %>">
|
|
8
|
+
<%= evil_icon 'ei-pencil', size: "m" %>
|
|
9
|
+
</a>
|
|
10
|
+
<a href="javascript:void(0)" role="button" rel="destroy" title="<%= t('vitrage.destroy') %>">
|
|
11
|
+
<%= evil_icon 'ei-trash', size: "m" %>
|
|
12
|
+
</a>
|
|
13
|
+
</div>
|
|
14
|
+
<% end %>
|
|
2
15
|
<div class="vtrg-edit-block-cover"><%= evil_icon 'ei-spinner', size: "m" %></div>
|
|
3
|
-
|
|
16
|
+
<div class="vtrg-edit-body">
|
|
17
|
+
<%= render partial: "vitrage/form_wrap", locals: { piece: @piece } %>
|
|
18
|
+
</div>
|
|
4
19
|
</div>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<%= render partial: "vitrage/#{@
|
|
1
|
+
<%= render partial: "vitrage/#{@piece.class.name.demodulize.underscore}", locals: { piece: @piece } %>
|
|
@@ -4,7 +4,20 @@ class VitrageOwnersPiecesSlot < ActiveRecord::Base
|
|
|
4
4
|
belongs_to :owner, polymorphic: true
|
|
5
5
|
belongs_to :piece, polymorphic: true, dependent: :destroy
|
|
6
6
|
|
|
7
|
+
before_create :set_correct_order_num
|
|
8
|
+
|
|
7
9
|
default_scope -> { order(ordn: :asc, id: :asc) }
|
|
8
10
|
|
|
9
11
|
PIECE_CLASSES_STRINGS = [ ] # add pieces class names strings here (demodulized)
|
|
12
|
+
|
|
13
|
+
private
|
|
14
|
+
|
|
15
|
+
# TODO wrap this becausetroubles with updating this code in the future
|
|
16
|
+
def set_correct_order_num
|
|
17
|
+
self.ordn = 1
|
|
18
|
+
if owner
|
|
19
|
+
max_ordn = owner.vitrage_slots.maximum(:ordn)
|
|
20
|
+
self.ordn = max_ordn + 1 if max_ordn
|
|
21
|
+
end
|
|
22
|
+
end
|
|
10
23
|
end
|
data/lib/vitrage/router.rb
CHANGED
|
@@ -2,19 +2,20 @@ module Vitrage
|
|
|
2
2
|
module Router
|
|
3
3
|
|
|
4
4
|
def routes(rails_router, options = {})
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
5
|
+
cs = options[:controller] ? options[:controller].to_s : "pieces"
|
|
6
|
+
|
|
7
|
+
rails_router.post '/vitrage/pieces' => "#{cs}#create", as: :vitrage_pieces
|
|
8
|
+
rails_router.get '/vitrage/pieces/new' => "#{cs}#new", as: :new_vitrage_piece
|
|
9
|
+
rails_router.get '/vitrage/pieces/restore_order' => "#{cs}#restore_order", as: :restore_order_vitrage_pieces
|
|
10
|
+
rails_router.get '/vitrage/pieces/:id/edit' => "#{cs}#edit", as: :edit_vitrage_piece
|
|
11
|
+
rails_router.get '/vitrage/pieces/:id' => "#{cs}#show", as: :vitrage_piece
|
|
12
|
+
rails_router.match '/vitrage/pieces/:id' => "#{cs}#update", via: [:patch, :put]
|
|
13
|
+
rails_router.delete '/vitrage/pieces/:id' => "#{cs}#destroy"
|
|
14
|
+
rails_router.post '/vitrage/pieces/:id/reorder' => "#{cs}#reorder", as: :vitrage_piece_reoder
|
|
15
|
+
|
|
16
|
+
# rails_router.namespace :vitrage do
|
|
17
|
+
# rails_router.resources :pieces, except: [:index]
|
|
18
|
+
# end
|
|
18
19
|
end
|
|
19
20
|
|
|
20
21
|
end
|
data/lib/vitrage/version.rb
CHANGED