Showing
9 changed files
with
122 additions
and
8 deletions
| @@ -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 |