Commit 9ad11ea0d2178593de5eb1fcfe57e43abd66d072

Authored by Andrey Karpikov
1 parent 0ef7a557

add solution copy content

@@ -991,7 +991,12 @@ jQuery(document).ready(function () { @@ -991,7 +991,12 @@ jQuery(document).ready(function () {
991 return content; 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 var content = 1000 var content =
996 '<div class="row-operation">' + 1001 '<div class="row-operation">' +
997 '<div class="dropdown">' + 1002 '<div class="dropdown">' +
@@ -1015,6 +1020,19 @@ jQuery(document).ready(function () { @@ -1015,6 +1020,19 @@ jQuery(document).ready(function () {
1015 content += 1020 content +=
1016 '<li class="dropdown-item"><a class="row-remove" href="javascript;void(0);">Delete</a></li>'; 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 content += "</ul>" + "</div>" + "</div>"; 1036 content += "</ul>" + "</div>" + "</div>";
1019 1037
1020 return content; 1038 return content;
@@ -1080,6 +1098,8 @@ jQuery(document).ready(function () { @@ -1080,6 +1098,8 @@ jQuery(document).ready(function () {
1080 var innerContent = 1098 var innerContent =
1081 '<div class="row-inner">' + 1099 '<div class="row-inner">' +
1082 showRowAction( 1100 showRowAction(
  1101 + $block,
  1102 + $cell.data("id"),
1083 statusClass, 1103 statusClass,
1084 $(this).hasClass("row-element-block") 1104 $(this).hasClass("row-element-block")
1085 ) + 1105 ) +
@@ -1196,28 +1216,40 @@ jQuery(document).ready(function () { @@ -1196,28 +1216,40 @@ jQuery(document).ready(function () {
1196 ui.draggable.hasClass("element-block") 1216 ui.draggable.hasClass("element-block")
1197 ) { 1217 ) {
1198 if (ui.draggable.hasClass("element-row")) { 1218 if (ui.draggable.hasClass("element-row")) {
  1219 + var max_id = getNextStructureId();
  1220 +
1199 var $newContent = $( 1221 var $newContent = $(
1200 '<div class="row-fluid row row-element-row">' + 1222 '<div class="row-fluid row row-element-row">' +
1201 '<div class="row-inner">' + 1223 '<div class="row-inner">' +
1202 - showRowAction("Disable", false) + 1224 + showRowAction(
  1225 + $block,
  1226 + max_id,
  1227 + "Disable",
  1228 + false
  1229 + ) +
1203 '</div><div class="col-html"></div>' + 1230 '</div><div class="col-html"></div>' +
1204 "</div>" 1231 "</div>"
1205 ); 1232 );
1206 1233
1207 - var max_id = getNextStructureId();  
1208 $newContent.data("id", max_id); 1234 $newContent.data("id", max_id);
1209 $newContent.attr("data-id", max_id); 1235 $newContent.attr("data-id", max_id);
1210 } 1236 }
1211 1237
1212 if (ui.draggable.hasClass("element-block")) { 1238 if (ui.draggable.hasClass("element-block")) {
  1239 + var max_id = getNextStructureId();
  1240 +
1213 var $newContent = $( 1241 var $newContent = $(
1214 '<div class="row-fluid row-element-block">' + 1242 '<div class="row-fluid row-element-block">' +
1215 '<div class="row-inner">' + 1243 '<div class="row-inner">' +
1216 - showRowAction("Disable", true) + 1244 + showRowAction(
  1245 + $block,
  1246 + max_id,
  1247 + "Disable",
  1248 + true
  1249 + ) +
1217 '</div><div class="col-html"></div>' + 1250 '</div><div class="col-html"></div>' +
1218 "</div>" 1251 "</div>"
1219 ); 1252 );
1220 - var max_id = getNextStructureId();  
1221 $newContent.data("id", max_id); 1253 $newContent.data("id", max_id);
1222 $newContent.attr("data-id", max_id); 1254 $newContent.attr("data-id", max_id);
1223 } 1255 }
@@ -5326,6 +5326,8 @@ body .jvectormap-zoomout { @@ -5326,6 +5326,8 @@ body .jvectormap-zoomout {
5326 5326
5327 .mb-20{margin-bottom:20px;} 5327 .mb-20{margin-bottom:20px;}
5328 5328
  5329 +.pl-10{padding-left:10px;}
  5330 +
5329 .dropleft.without-icon .dropdown-toggle::before{ 5331 .dropleft.without-icon .dropdown-toggle::before{
5330 display:none; 5332 display:none;
5331 } 5333 }
@@ -299,6 +299,13 @@ module Kanjai @@ -299,6 +299,13 @@ module Kanjai
299 render :json => {:status => 'ok', :structure_id => @structure_id, :html => @obj.get_content_frontend(session) } 299 render :json => {:status => 'ok', :structure_id => @structure_id, :html => @obj.get_content_frontend(session) }
300 end 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 private 309 private
303 310
304 def permitted_params 311 def permitted_params
@@ -185,5 +185,65 @@ module Kanjai @@ -185,5 +185,65 @@ module Kanjai
185 end 185 end
186 end 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 end 248 end
189 end 249 end
@@ -11,6 +11,17 @@ @@ -11,6 +11,17 @@
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' %> 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 </div> 12 </div>
13 </li> 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 <% end %> 25 <% end %>
15 </ul><!-- Tab panes--> 26 </ul><!-- Tab panes-->
16 27
1 <div class="container"> 1 <div class="container">
2 2
3 <div class="row"> 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 <div id="structure_area" > 6 <div id="structure_area" >
7 <div class="html-elements"> 7 <div class="html-elements">
@@ -3,7 +3,7 @@ @@ -3,7 +3,7 @@
3 <h3><%= t('admin.pages.edit_page', title: @page.lang_attributes(Kanjai::PageLang.default(@page.domain), :title)) %></h3> 3 <h3><%= t('admin.pages.edit_page', title: @page.lang_attributes(Kanjai::PageLang.default(@page.domain), :title)) %></h3>
4 4
5 <div class="row"> 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 <div id="structure_area" > 8 <div id="structure_area" >
9 <div class="html-elements"> 9 <div class="html-elements">
@@ -47,6 +47,8 @@ Kanjai::Engine.routes.draw do @@ -47,6 +47,8 @@ Kanjai::Engine.routes.draw do
47 47
48 get :activate, on: :member 48 get :activate, on: :member
49 get :deactivate, on: :member 49 get :deactivate, on: :member
  50 +
  51 + get :duplicate_content, on: :member
50 end 52 end
51 53
52 resources :page_langs 54 resources :page_langs
1 module Kanjai 1 module Kanjai
2 - VERSION = "0.0.357" 2 + VERSION = "0.0.358"
3 end 3 end