Showing
9 changed files
with
122 additions
and
8 deletions
| ... | ... | @@ -991,7 +991,12 @@ jQuery(document).ready(function () { |
| 991 | 991 | return content; |
| 992 | 992 | }; |
| 993 | 993 | |
| 994 | - var showRowAction = function (statusClass, isBlockElement) { | |
| 994 | + var showRowAction = function ( | |
| 995 | + $block, | |
| 996 | + structId, | |
| 997 | + statusClass, | |
| 998 | + isBlockElement | |
| 999 | + ) { | |
| 995 | 1000 | var content = |
| 996 | 1001 | '<div class="row-operation">' + |
| 997 | 1002 | '<div class="dropdown">' + |
| ... | ... | @@ -1015,6 +1020,19 @@ jQuery(document).ready(function () { |
| 1015 | 1020 | content += |
| 1016 | 1021 | '<li class="dropdown-item"><a class="row-remove" href="javascript;void(0);">Delete</a></li>'; |
| 1017 | 1022 | |
| 1023 | + content += '<li class="dropdown-item"><hr></li>'; | |
| 1024 | + | |
| 1025 | + $.each($block.data("duplicate-languages"), function (key, value) { | |
| 1026 | + content += | |
| 1027 | + '<li class="dropdown-item"><a href="' + | |
| 1028 | + value[1] + | |
| 1029 | + "&struct_id=" + | |
| 1030 | + structId + | |
| 1031 | + '">Copy to ' + | |
| 1032 | + value[0] + | |
| 1033 | + "</a></li>"; | |
| 1034 | + }); | |
| 1035 | + | |
| 1018 | 1036 | content += "</ul>" + "</div>" + "</div>"; |
| 1019 | 1037 | |
| 1020 | 1038 | return content; |
| ... | ... | @@ -1080,6 +1098,8 @@ jQuery(document).ready(function () { |
| 1080 | 1098 | var innerContent = |
| 1081 | 1099 | '<div class="row-inner">' + |
| 1082 | 1100 | showRowAction( |
| 1101 | + $block, | |
| 1102 | + $cell.data("id"), | |
| 1083 | 1103 | statusClass, |
| 1084 | 1104 | $(this).hasClass("row-element-block") |
| 1085 | 1105 | ) + |
| ... | ... | @@ -1196,28 +1216,40 @@ jQuery(document).ready(function () { |
| 1196 | 1216 | ui.draggable.hasClass("element-block") |
| 1197 | 1217 | ) { |
| 1198 | 1218 | if (ui.draggable.hasClass("element-row")) { |
| 1219 | + var max_id = getNextStructureId(); | |
| 1220 | + | |
| 1199 | 1221 | var $newContent = $( |
| 1200 | 1222 | '<div class="row-fluid row row-element-row">' + |
| 1201 | 1223 | '<div class="row-inner">' + |
| 1202 | - showRowAction("Disable", false) + | |
| 1224 | + showRowAction( | |
| 1225 | + $block, | |
| 1226 | + max_id, | |
| 1227 | + "Disable", | |
| 1228 | + false | |
| 1229 | + ) + | |
| 1203 | 1230 | '</div><div class="col-html"></div>' + |
| 1204 | 1231 | "</div>" |
| 1205 | 1232 | ); |
| 1206 | 1233 | |
| 1207 | - var max_id = getNextStructureId(); | |
| 1208 | 1234 | $newContent.data("id", max_id); |
| 1209 | 1235 | $newContent.attr("data-id", max_id); |
| 1210 | 1236 | } |
| 1211 | 1237 | |
| 1212 | 1238 | if (ui.draggable.hasClass("element-block")) { |
| 1239 | + var max_id = getNextStructureId(); | |
| 1240 | + | |
| 1213 | 1241 | var $newContent = $( |
| 1214 | 1242 | '<div class="row-fluid row-element-block">' + |
| 1215 | 1243 | '<div class="row-inner">' + |
| 1216 | - showRowAction("Disable", true) + | |
| 1244 | + showRowAction( | |
| 1245 | + $block, | |
| 1246 | + max_id, | |
| 1247 | + "Disable", | |
| 1248 | + true | |
| 1249 | + ) + | |
| 1217 | 1250 | '</div><div class="col-html"></div>' + |
| 1218 | 1251 | "</div>" |
| 1219 | 1252 | ); |
| 1220 | - var max_id = getNextStructureId(); | |
| 1221 | 1253 | $newContent.data("id", max_id); |
| 1222 | 1254 | $newContent.attr("data-id", max_id); |
| 1223 | 1255 | } | ... | ... |
| ... | ... | @@ -299,6 +299,13 @@ module Kanjai |
| 299 | 299 | render :json => {:status => 'ok', :structure_id => @structure_id, :html => @obj.get_content_frontend(session) } |
| 300 | 300 | end |
| 301 | 301 | |
| 302 | + def duplicate_content | |
| 303 | + @page = Page.find(params[:id]) | |
| 304 | + @page.duplicate(params[:from_lang], params[:to_lang], params[:struct_id]) | |
| 305 | + | |
| 306 | + redirect_to :action => :edit, lang: params[:to_lang] | |
| 307 | + end | |
| 308 | + | |
| 302 | 309 | private |
| 303 | 310 | |
| 304 | 311 | def permitted_params | ... | ... |
| ... | ... | @@ -185,5 +185,65 @@ module Kanjai |
| 185 | 185 | end |
| 186 | 186 | end |
| 187 | 187 | |
| 188 | + def duplicate(current_lang, new_lang = nil, structure_id = nil) | |
| 189 | + Page.transaction do | |
| 190 | + page_datum = page_data.find_by_lang(current_lang) | |
| 191 | + json_data = page_datum.template_content | |
| 192 | + | |
| 193 | + new_lang ||= current_lang | |
| 194 | + new_page_datum = page_data.find_or_initialize_by(lang: new_lang) | |
| 195 | + new_page_datum.title ||= page_datum.title | |
| 196 | + new_page_datum.save! | |
| 197 | + new_json_data = new_page_datum.template_content | |
| 198 | + | |
| 199 | + next_id = ([].tap do |n| | |
| 200 | + new_json_data.each do |item| | |
| 201 | + n << item['attributes']['id'] | |
| 202 | + item['cells'].each do |cell_item| | |
| 203 | + n << cell_item['id'] | |
| 204 | + end | |
| 205 | + end | |
| 206 | + end.max || 0) + 1 | |
| 207 | + | |
| 208 | + json_data.each do |item| | |
| 209 | + if structure_id.nil? || item['attributes']['id'].to_i == structure_id.to_i | |
| 210 | + new_item = item.deep_dup | |
| 211 | + new_item['id'] = next_id | |
| 212 | + duplicate_markers(page_datum, item['attributes']['id'], new_page_datum) | |
| 213 | + next_id += 1 | |
| 214 | + | |
| 215 | + new_item['cells'].each do |cell_item| | |
| 216 | + cell_item['id'] = next_id | |
| 217 | + duplicate_markers(page_datum, cell_item['id'], new_page_datum) | |
| 218 | + next_id += 1 | |
| 219 | + end | |
| 220 | + new_json_data << new_item | |
| 221 | + end | |
| 222 | + end | |
| 223 | + | |
| 224 | + new_page_datum.template_content = new_json_data | |
| 225 | + new_page_datum.save! | |
| 226 | + end | |
| 227 | + | |
| 228 | + end | |
| 229 | + | |
| 230 | + private | |
| 231 | + | |
| 232 | + def duplicate_markers(page_datum, structure_id, new_page_datum) | |
| 233 | + obj = page_datum.page_contents.find_by_structure_id(structure_id) | |
| 234 | + if obj | |
| 235 | + new_obj = obj.dup | |
| 236 | + new_obj.page_datum = new_page_datum | |
| 237 | + new_obj.save! | |
| 238 | + | |
| 239 | + obj.page_content_markers.each do |item| | |
| 240 | + new_item = item.dup | |
| 241 | + new_item.page_content = new_obj | |
| 242 | + new_item.save(validate: false) | |
| 243 | + end | |
| 244 | + end | |
| 245 | + | |
| 246 | + end | |
| 247 | + | |
| 188 | 248 | end |
| 189 | 249 | end |
| \ No newline at end of file | ... | ... |
| ... | ... | @@ -11,6 +11,17 @@ |
| 11 | 11 | <%= select_tag :choose_lang, options_for_select(@page.domain.page_langs.collect{|lang| [lang.title, lang.code, data: {url: edit_admin_page_url(@page, lang: lang.code)}] }, params[:lang]), class: 'form-control' %> |
| 12 | 12 | </div> |
| 13 | 13 | </li> |
| 14 | + <li class="pl-10"> | |
| 15 | + <button class="btn btn-primary dropdown-toggle dropdown-toggle-nocaret" type="button" data-toggle="dropdown" aria-expanded="false"> | |
| 16 | + <span class="dropdown-text">Content Actions <span class="icon icon-options-vertical"></span></span> | |
| 17 | + </button> | |
| 18 | + <ul class="dropdown-menu"> | |
| 19 | + <% @page.domain.page_langs.where.not(code: params[:lang]).each do |lang| %> | |
| 20 | + <li class="dropdown-item"><%= link_to "Copy to #{lang.title}", duplicate_content_admin_page_url(@page, from_lang: params[:lang], to_lang: lang.code), class: 'dropdown-item' %></li> | |
| 21 | + <% end %> | |
| 22 | + </ul> | |
| 23 | + | |
| 24 | + </li> | |
| 14 | 25 | <% end %> |
| 15 | 26 | </ul><!-- Tab panes--> |
| 16 | 27 | ... | ... |
| 1 | 1 | <div class="container"> |
| 2 | 2 | |
| 3 | 3 | <div class="row"> |
| 4 | - <div class="col-md-12 html-generator" data-editor-url="<%= show_editor_admin_page_url(@page_data.page, lang: params[:lang]) %>" data-save_url="<%= save_structure_admin_page_url(@page_data.page, lang: params[:lang]) %>" data-delete_cell_url="<%= delete_content_admin_page_url(@page_data.page, lang: params[:lang]) %>" data-duplicate-url="<%= duplicate_block_admin_page_url(@page_data.page, lang: params[:lang]) %>" > | |
| 4 | + <div class="col-md-12 html-generator" data-editor-url="<%= show_editor_admin_page_url(@page_data.page, lang: params[:lang]) %>" data-save_url="<%= save_structure_admin_page_url(@page_data.page, lang: params[:lang]) %>" data-delete_cell_url="<%= delete_content_admin_page_url(@page_data.page, lang: params[:lang]) %>" data-duplicate-url="<%= duplicate_block_admin_page_url(@page_data.page, lang: params[:lang]) %>" data-duplicate-languages="<%= @page_data.page.domain.page_langs.where.not(code: params[:lang]).map{|item| [item.title, duplicate_content_admin_page_url(@page_data.page, from_lang: params[:lang], to_lang: item.code)] }.to_json %>" > | |
| 5 | 5 | |
| 6 | 6 | <div id="structure_area" > |
| 7 | 7 | <div class="html-elements"> | ... | ... |
| ... | ... | @@ -3,7 +3,7 @@ |
| 3 | 3 | <h3><%= t('admin.pages.edit_page', title: @page.lang_attributes(Kanjai::PageLang.default(@page.domain), :title)) %></h3> |
| 4 | 4 | |
| 5 | 5 | <div class="row"> |
| 6 | - <div class="col-md-10 html-generator" data-editor-url="<%= show_editor_admin_page_url(@page_data.page, lang: params[:lang]) %>" data-save_url="<%= save_structure_admin_page_url(@page_data.page, lang: params[:lang]) %>" data-delete_cell_url="<%= delete_content_admin_page_url(@page_data.page, lang: params[:lang]) %>" data-duplicate-url="<%= duplicate_block_admin_page_url(@page_data.page, lang: params[:lang]) %>" > | |
| 6 | + <div class="col-md-10 html-generator" data-editor-url="<%= show_editor_admin_page_url(@page_data.page, lang: params[:lang]) %>" data-save_url="<%= save_structure_admin_page_url(@page_data.page, lang: params[:lang]) %>" data-delete_cell_url="<%= delete_content_admin_page_url(@page_data.page, lang: params[:lang]) %>" data-duplicate-url="<%= duplicate_block_admin_page_url(@page_data.page, lang: params[:lang]) %>" data-duplicate-languages="<%= @page_data.page.domain.page_langs.where.not(code: params[:lang]).map{|item| [item.title, duplicate_content_admin_page_url(@page_data.page, from_lang: params[:lang], to_lang: item.code)] }.to_json %>" > | |
| 7 | 7 | |
| 8 | 8 | <div id="structure_area" > |
| 9 | 9 | <div class="html-elements"> | ... | ... |