Initial commit

This commit is contained in:
2020-04-07 13:03:04 +00:00
committed by Gitium
commit 00f842d9bf
1673 changed files with 471161 additions and 0 deletions

View File

@ -0,0 +1,351 @@
body {
-webkit-backface-visibility: hidden;
}
#_generate_sections_metabox {
opacity: 0;
height: 0;
overflow: hidden;
}
#_generate_use_sections_metabox {
display: block !important;
}
.generate_sections_control {
padding-top: 8px;
}
.generate-sections-enabled #postdivrich {
opacity: 0;
height: 0;
overflow: hidden;
}
.generate-sections-enabled #_generate_sections_metabox {
opacity: 1;
height: auto;
}
.generate_sections_control .warning {
color: red;
}
.generate_sections_control .dodelete-repeating_textareas {
float: right;
}
.generate_sections_control .section {
border: 1px solid #DFDFDF;
-webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
margin: 6px 0px 8px;
overflow: hidden;
position: relative;
background: white;
}
.generate_sections_control .section .section-title {
font-size: 14px;
padding: 0 0 0 15px;
margin: 0;
max-height: 50px;
}
.generate_sections_control .section .section-title > span {
cursor: pointer;
overflow:hidden;
display:block;
max-height:50px;
line-height:50px;
width:100%;
}
.generate_sections_control .section .section-controls {
position: absolute;
top:0;
right:0;
text-align: right;
}
.rtl .generate_sections_control .section .section-controls {
right:auto;left:0;
}
.generate_sections_control .section .section-controls a {
color: #aaa;
display:block;
float:left;
border-left: 1px solid #efefef;
}
.generate_sections_control .section .section-controls a:hover {
color: #777;
}
.generate_sections_control .section textarea {
display: none;
}
.generate_sections_control .section h3 {
color: #999;
font-size: 1em;
margin: 15px 6px;
text-transform: uppercase;
}
.generate_sections_control .section .ui-sortable-placeholder {
line-height: 1.4em;
border: 3px dashed #DDD;
}
.generate-sections-modal .media-menu-item {
cursor: pointer;
}
.custom-classes input {
width:100%;
}
.js .generate_sections_control .move-section {
cursor: move;
}
.generate-sections-modal p {
margin-top:5px;
}
#_generate_sections_metabox {
box-shadow: 0 0 0 transparent;
}
.section-controls a {
line-height:50px;
padding: 0 15px;
width:initial;
height:initial;
}
.generate_sections_control .section .section-controls a.delete-section:hover {
color: red;
}
.generate_sections_control p {
margin: 5px;
}
textarea#generate-sections-editor {
border:0;
}
#generate-sections-editor_ifr {
min-height: 400px;
}
a#generate-add-section, a#generate-delete-sections {
height: auto;
line-height: inherit;
padding: 10px 20px;
}
#wp-generate-sections-editor-wrap.old-sections-js .wp-media-buttons > * {
display:none;
}
#wp-generate-sections-editor-wrap.old-sections-js .wp-media-buttons > .generate-sections-add-media,
#wp-generate-sections-editor-wrap.old-sections-js .wp-media-buttons > .su-generator-button,
#wp-generate-sections-editor-wrap.old-sections-js .wp-media-buttons > .envira-gallery-choose-gallery,
#wp-generate-sections-editor-wrap.old-sections-js .wp-media-buttons > .gridable-insert-row-button {
display: inline-block;
}
#custom-media-buttons > * {
display: none;
}
#custom-media-buttons > .insert-media,
#custom-media-buttons > .su-generator-button,
#custom-media-buttons > .envira-gallery-choose-gallery,
#custom-media-buttons > .gridable-insert-row-button,
#custom-media-buttons > .bfa-iconpicker {
display: inline-block;
}
#_generate_sections_metabox {
background: transparent;
border: 0;
}
#_generate_sections_metabox > .handlediv, #_generate_sections_metabox > .hndle {
display: none;
}
#_generate_sections_metabox > .inside {
padding-left: 0;
padding-right: 0;
}
body.wp-admin .grid-container {
max-width: 100%;
}
.generate-sections-modal h3 {
margin-top: 0;
}
input#custom_classes,
input#custom_id {
width: 100%;
max-width: 300px;
}
.box-type select,
.inner-box-type select,
.parallax-effect select,
.top-padding input,
.bottom-padding input {
width: 100%;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
.send-to-editor {
display: inline-block;
margin-top: 15px !important;
}
.gs-grid-container {
margin-left: auto;
margin-right: auto;
max-width: 100%;
padding-left: 10px;
padding-right: 10px;
}
.gs-grid-parent {
padding-left: 0;
padding-right: 0;
}
.gs-grid-container:before,
.gs-grid-container:after {
content: ".";
display: block;
overflow: hidden;
visibility: hidden;
font-size: 0;
line-height: 0;
width: 0;
height: 0;
clear: both;
}
@media screen and (min-width: 769px) {
.gs-grid-50:before,
.gs-grid-50:after,
.gs-grid-33:before,
.gs-grid-33:after,
.gs-grid-25:before,
.gs-grid-25:after
.gs-grid-20:before,
.gs-grid-20:after
.gs-grid-12:before,
.gs-grid-12:after {
content: ".";
display: block;
overflow: hidden;
visibility: hidden;
font-size: 0;
line-height: 0;
width: 0;
height: 0;
clear: both;
}
.gs-grid-50,
.gs-grid-33,
.gs-grid-25,
.gs-grid-20,
.gs-grid-12 {
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
padding-left: 10px;
padding-right: 10px;
}
.gs-grid-50 {
width: 50% !important;
float: left;
}
.gs-grid-33 {
width: 33.333% !important;
float: left;
}
.gs-grid-25 {
width: 25% !important;
float: left;
}
.gs-grid-20 {
width: 20% !important;
float: left;
}
.gs-grid-12 {
width: 12.5% !important;
float: left;
}
.top-border {
border-top: 1px solid #EFEFEF;
}
.bottom-border {
border-bottom: 1px solid #EFEFEF;
}
.border-right {
border-right: 1px solid #EFEFEF;
}
.border-left {
border-left: 1px solid #EFEFEF;
}
}
@media screen and (max-width: 768px) {
.gs-grid-50, .gs-grid-33, .gs-grid-25, .gs-grid-12 {
width: 100% !important;
}
.generate_sections_control .section .section-controls {
position: relative;
}
}
@media screen and (max-width: 500px) {
.generate_sections_control .section .section-controls a:first-child {
border-left: 0;
}
}
#generate-sections-modal-dialog .media-modal-close {
text-decoration: none;
text-align: center;
}
/*
The styles below were ripped from the Media Modal in WordPress 3.5
~~ Thanks for building a beautiful Modal UI ( that I could steal )
*/
body.generate-modal-open { overflow: hidden; }
.generate-sections-modal .media-modal { z-index: 65535; }
.generate-sections-modal .media-modal-backdrop { z-index: 65534; }
.generate-sections-modal .media-frame-content .panel { display: none; padding: 2em; }
.generate-sections-modal .media-frame-content .panel.active { display: block; }
.generate-sections-modal .media-frame-content .panel .section-title input { width:100%;padding:10px; }
.generate-sections-modal .media-frame-content .panel .html-active .mce-panel { display: none; }
.generate-sections-modal .media-frame-content .panel .html-active .wp-editor-area { display: block !important; min-height: 300px; }
.generate-sections-modal .media-frame-content .panel .mce-wp-dfw, .generate-sections-modal .media-frame-content .panel .qt-dfw { display: none; }
.generate-sections-modal .media-frame-content .panel .generate-sections-remove-image { display: none; }
textarea.no-rich-edit {
width: 100%;
min-height: 300px;
}
/*# sourceMappingURL=meta.css.map */
.wp-picker-container .wp-color-result.button {
height: 24px;
margin: 0 6px 6px 0px;
padding: 0 0 0 30px;
font-size: 11px;
}
.wp-color-result:after {
display: none;
}
.wp-color-result-text {
background: #f7f7f7;
border-radius: 0 2px 2px 0;
border-left: 1px solid #ccc;
color: #555;
display: block;
line-height: 22px;
padding: 0 6px;
text-align: center;
}

View File

@ -0,0 +1,101 @@
.lcs_wrap {
display: inline-block;
direction: ltr;
height: 28px;
vertical-align: middle;
}
.lcs_wrap input {
display: none;
}
.lcs_switch {
display: inline-block;
position: relative;
width: 73px;
height: 28px;
border-radius: 30px;
background: #ddd;
overflow: hidden;
cursor: pointer;
-webkit-transition: all .2s ease-in-out;
-ms-transition: all .2s ease-in-out;
transition: all .2s ease-in-out;
}
.lcs_cursor {
display: inline-block;
position: absolute;
top: 3px;
width: 22px;
height: 22px;
border-radius: 100%;
background: #fff;
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.2), 0 3px 4px 0 rgba(0, 0, 0, 0.1);
z-index: 10;
-webkit-transition: all .2s linear;
-ms-transition: all .2s linear;
transition: all .2s linear;
}
.lcs_label {
font-family: "Trebuchet MS", Helvetica, sans-serif;
font-size: 12px;
letter-spacing: 1px;
line-height: 18px;
color: #fff;
font-weight: bold;
position: absolute;
width: 33px;
top: 5px;
overflow: hidden;
text-align: center;
opacity: 0;
-webkit-transition: all .2s ease-in-out .1s;
-ms-transition: all .2s ease-in-out .1s;
transition: all .2s ease-in-out .1s;
}
.lcs_label.lcs_label_on {
left: -70px;
z-index: 6;
}
.lcs_label.lcs_label_off {
right: -70px;
z-index: 5;
}
/* on */
.lcs_switch.lcs_on {
background: #75b936;
box-shadow: 0 0 2px #579022 inset;
}
.lcs_switch.lcs_on .lcs_cursor {
left: 48px;
}
.lcs_switch.lcs_on .lcs_label_on {
left: 10px;
opacity: 1;
}
/* off */
.lcs_switch.lcs_off {
background: #b2b2b2;
box-shadow: 0px 0px 2px #a4a4a4 inset;
}
.lcs_switch.lcs_off .lcs_cursor {
left: 3px;
}
.lcs_switch.lcs_off .lcs_label_off {
right: 10px;
opacity: 1;
}
/* disabled */
.lcs_switch.lcs_disabled {
opacity: 0.65;
filter: alpha(opacity=65);
cursor: default;
}

View File

@ -0,0 +1,835 @@
/*-----------------------------------------------------------------------------------*/
/* Generate Sections Metabox
/*
/* © Kathy Darling http://www.kathyisawesome.com
/* 2016-07-19. */
/*-----------------------------------------------------------------------------------*/
/**
* @type {Object} JavaScript namespace for our application.
*/
var Generate_Sections = {
backbone_modal: {
__instance: undefined
}
};
(function($, Generate_Sections) {
// Model
Generate_Sections.Section = Backbone.Model.extend({
defaults: {
"title": "",
"box_type": "",
"inner_box_type": "",
"custom_classes": "",
"custom_id": "",
"top_padding": "",
"bottom_padding": "",
"top_padding_unit": "",
"bottom_padding_unit": "",
"background_color": "",
"background_image": "",
"background_image_preview": "",
"parallax_effect": "",
"background_color_overlay": "",
"text_color": "",
"link_color": "",
"link_color_hover": "",
"content": ""
}
});
// Collection
Generate_Sections.SectionsCollection = Backbone.Collection.extend({
model: Generate_Sections.Section,
el: "#generate_sections_container",
comparator: function(model) {
return model.get('index');
}
});
/**
* Primary Modal Application Class
*/
Generate_Sections.backbone_modal.Application = Backbone.View.extend({
attributes: {
id: "generate-sections-modal-dialog",
class: "generate-sections-modal",
role: "dialog"
},
template: wp.template("generate-sections-modal-window"),
mediaUploader: null,
/*-----------------------------------------------------------------------------------*/
/* tinyMCE settings
/*-----------------------------------------------------------------------------------*/
tmc_settings: {},
/*-----------------------------------------------------------------------------------*/
/* tinyMCE defaults
/*-----------------------------------------------------------------------------------*/
tmc_defaults: {
theme: "modern",
menubar: false,
wpautop: true,
indent: false,
toolbar1: "bold,italic,underline,blockquote,strikethrough,bullist,numlist,alignleft,aligncenter,alignright,undo,redo,link,unlink,fullscreen",
plugins: "fullscreen,image,wordpress,wpeditimage,wplink",
max_height: 500
},
/*-----------------------------------------------------------------------------------*/
/* quicktags settings
/*-----------------------------------------------------------------------------------*/
qt_settings: {},
/*-----------------------------------------------------------------------------------*/
/* quicktags defaults
/*-----------------------------------------------------------------------------------*/
qt_defaults: {
buttons: "strong,em,link,block,del,ins,img,ul,ol,li,code,more,close,fullscreen"
},
model: Generate_Sections.Section,
events: {
"click .media-modal-backdrop, .media-modal-close, .media-button-close": "closeModal",
"click .media-button-insert": "saveModal",
"click .media-menu-item": "switchTab",
"keydown": "keydown",
"click .generate-sections-upload-button": "openMediaUploader",
"click .generate-sections-remove-image": "removeImage",
"click div.media-frame-title h1": "toggleMenu"
},
/**
* Simple object to store any UI elements we need to use over the life of the application.
*/
ui: {
nav: undefined,
content: undefined
},
/**
* Instantiates the Template object and triggers load.
*/
initialize: function() {
_.bindAll(this, "render", "closeModal", "saveModal", "switchTab");
this.focusManager = new wp.media.view.FocusManager({
el: this.el
});
this.changeInsertText();
this.tinyMCEsettings();
this.render();
},
/**
* switch the insert button text to "insert section"
*/
changeInsertText: function(restore) {
var restore = typeof restore !== 'undefined' && restore == true ? true : false;
if (restore == false && typeof(wp.media.view.l10n.insertIntoPost) !== "undefined") {
this.insertIntoPost = wp.media.view.l10n.insertIntoPost;
wp.media.view.l10n.insertIntoPost = generate_sections_metabox_i18n.insert_into_section;
// switch the insert button text back
} else if (restore == true && typeof(this.insertIntoPost) !== "undefined") {
wp.media.view.l10n.insertIntoPost = this.insertIntoPost;
}
},
/**
* Merge the default TinyMCE settings
*/
tinyMCEsettings: function() {
// get the #content"s tinyMCE settings or use default
var init_settings = typeof tinyMCEPreInit == "object" && "mceInit" in tinyMCEPreInit && "content" in tinyMCEPreInit.mceInit ? tinyMCEPreInit.mceInit.content : this.tmc_defaults;
// get the #content"s quicktags settings or use default
var qt_settings = typeof tinyMCEPreInit == "object" && "qtInit" in tinyMCEPreInit && "content" in tinyMCEPreInit.qtInit ? tinyMCEPreInit.qtInit.content : this.qt_defaults;
var _this = this;
var custom_settings = {
selector: "#generate-sections-editor",
wp_autoresize_on: false,
cache_suffix: "",
min_height: 400,
}
// merge our settings with WordPress" and store for later use
this.tmc_settings = $.extend({}, init_settings, custom_settings);
this.qt_settings = $.extend({}, qt_settings, {
id: "generate-sections-editor"
});
},
/**
* Assembles the UI from loaded template.
* @internal Obviously, if the template fail to load, our modal never launches.
*/
render: function() {
"use strict";
// Build the base window and backdrop, attaching them to the $el.
// Setting the tab index allows us to capture focus and redirect it in Application.preserveFocus
this.$el.attr("tabindex", "0")
.html(this.template);
// Handle any attempt to move focus out of the modal.
//jQuery(document).on("focusin", this.preserveFocus);
// set overflow to "hidden" on the body so that it ignores any scroll events while the modal is active
// and append the modal to the body.
jQuery("body").addClass("generate-modal-open").prepend(this.$el);
// aria hide the background
jQuery("#wpwrap").attr("aria-hidden", "true");
this.renderContent();
this.renderPreview();
this.selected();
this.colorPicker();
this.startTinyMCE();
// Set focus on the modal to prevent accidental actions in the underlying page
this.$el.focus();
return this;
},
/**
* Make the menu mobile-friendly
*/
toggleMenu: function() {
this.$el.find('.media-menu').toggleClass('visible');
},
/**
* Create the nav tabs & panels
*/
renderContent: function() {
var model = this.model;
var menu_item = wp.template("generate-sections-modal-menu-item");
// Save a reference to the navigation bar"s unordered list and populate it with items.
this.ui.nav = this.$el.find(".media-menu");
// reference to content area
this.ui.panels = this.$el.find(".media-frame-content");
// loop through the tabs
if (generate_sections_metabox_i18n.tabs.length) {
// for...of is nicer, but not supported by minify, so stay with for...in for now
for (var tab in generate_sections_metabox_i18n.tabs) {
if (generate_sections_metabox_i18n.tabs.hasOwnProperty(tab)) {
tab = generate_sections_metabox_i18n.tabs[tab];
var $new_tab = $(menu_item({
target: tab.target,
name: tab.title
}));
var panel = wp.template("generate-sections-edit-" + tab.target);
var $new_panel = $(panel(model.toJSON()));
if (tab.active == "true") {
$new_tab.addClass("active");
$new_panel.addClass("active");
}
jQuery( 'body' ).on( 'generate_section_show_settings', function() {
jQuery( '.generate-sections-modal .media-menu-item' ).removeClass('active');
jQuery( '.generate-sections-modal .panel' ).removeClass('active');
jQuery( '.generate-section-item-style' ).addClass('active');
jQuery( '.generate-section-settings' ).addClass('active');
});
this.ui.nav.append($new_tab);
this.ui.panels.append($new_panel);
}
}
}
},
/**
* Render the background image preview
*/
renderPreview: function(image_id) {
var image_id = typeof image_id !== 'undefined' ? image_id : this.model.get("background_image");
var $preview = $("#generate-section-image-preview");
$preview.children().remove();
if (image_id > 0) {
this.background = new wp.media.model.Attachment.get(image_id);
this.background.fetch({
success: function(att) {
if (_.contains(['png', 'jpg', 'gif', 'jpeg'], att.get('subtype'))) {
$("<img/>").attr("src", att.attributes.sizes.thumbnail.url).appendTo($preview);
$preview.next().find(".generate-sections-remove-image").show();
}
}
});
}
},
/**
* Set the default option for the select boxes
*/
selected: function() {
var _this = this;
this.$el.find("select").each(function(index, select) {
var attribute = jQuery(select).attr("name");
var selected = _this.model.get(attribute);
jQuery(select).val(selected);
});
},
/**
* Start the colorpicker
*/
colorPicker: function() {
this.$el.find(".generate-sections-color").wpColorPicker();
},
/**
* Start TinyMCE on the textarea
*/
startTinyMCE: function() {
// set the default editor
this.ui.panels.find("#wp-generate-sections-editor-wrap").addClass(generate_sections_metabox_i18n.default_editor);
// remove tool buttons if richedit disabled
if (!generate_sections_metabox_i18n.user_can_richedit) {
this.ui.panels.find(".wp-editor-tabs").remove();
}
// add our copy to the collection in the tinyMCEPreInit object because switch editors
if (typeof tinyMCEPreInit == 'object') {
tinyMCEPreInit.mceInit["generate-sections-editor"] = this.tmc_settings;
tinyMCEPreInit.qtInit["generate-sections-editor"] = this.qt_settings;
tinyMCEPreInit.mceInit["generate-sections-editor"].wp_keep_scroll_position = false;
}
try {
var rich = (typeof tinyMCE != "undefined");
// turn on the quicktags editor
quicktags(this.qt_settings);
// attempt to fix problem of quicktags toolbar with no buttons
QTags._buttonsInit();
if (rich !== false) {
// turn on tinyMCE
tinyMCE.init(this.tmc_settings);
}
} catch (e) {}
},
/**
* Launch Media Uploader
*/
openMediaUploader: function(e) {
var _this = this;
$input = jQuery(e.currentTarget).prev("#generate-sections-background-image");
e.preventDefault();
// If the uploader object has already been created, reopen the dialog
if (this.mediaUploader) {
this.mediaUploader.open();
return;
}
// Extend the wp.media object
this.mediaUploader = wp.media.frames.file_frame = wp.media({
title: generate_sections_metabox_i18n.media_library_title,
button: {
text: generate_sections_metabox_i18n.media_library_button
},
multiple: false
});
// When a file is selected, grab the URL and set it as the text field"s value
this.mediaUploader.on("select", function() {
attachment = _this.mediaUploader.state().get("selection").first().toJSON();
$input.val(attachment.id);
_this.renderPreview(attachment.id);
});
// Open the uploader dialog
this.mediaUploader.open();
},
/**
* Remove the background image
*/
removeImage: function(e) {
e.preventDefault();
$("#generate-section-image-preview").children().remove();
$("#generate-section-image-preview").next().find(".generate-sections-remove-image").hide();
$("#generate-sections-background-image").val("");
},
/**
* Closes the modal and cleans up after the instance.
* @param e {object} A jQuery-normalized event object.
*/
closeModal: function(e) {
"use strict";
e.preventDefault();
this.undelegateEvents();
jQuery(document).off("focusin");
jQuery("body").removeClass("generate-modal-open");
jQuery("body").removeClass("generate-section-content");
// remove restricted media modal tab focus once it's closed
this.$el.undelegate('keydown');
// remove the tinymce editor
// this needs to be called before the modal is closed or it will fail in Firefox (that was fun to figure out...)
if (typeof tinyMCE != "undefined") {
tinymce.EditorManager.execCommand("mceRemoveEditor", true, "generate-sections-editor");
}
// remove modal and unset instances
this.remove();
Generate_Sections.backbone_modal.__instance = undefined;
this.mediaUploader = null;
Generate_Sections.modalOpen = null;
// switch the insert button text back
this.changeInsertText(true);
// send focus back to where it was prior to modal open
Generate_Sections.lastFocus.focus();
// aria unhide the background
jQuery("#wpwrap").attr("aria-hidden", "false");
// Fix bug where the window scrolls down 50px on close
var topDistance = jQuery("body").offset().top;
if ( topDistance >= jQuery("body").scrollTop() ) {
jQuery("body").scrollTop(0);
}
},
/**
* Responds to the btn-ok.click event
* @param e {object} A jQuery-normalized event object.
* @todo You should make this your own.
*/
saveModal: function(e) {
"use strict";
this.model.get("index");
var model = this.model;
// send the tinymce content to the textarea
if (typeof tinyMCE != "undefined") {
tinymce.triggerSave();
}
var $inputs = this.ui.panels.find("input, select, textarea");
$inputs.each(function(index, input) {
var name = $(input).attr("name");
if (model.attributes.hasOwnProperty(name)) {
var value = $(input).val();
model.set(name, value);
}
});
this.closeModal(e);
},
/**
* Handles tab clicks and switches to corresponding panel
* @param e {object} A jQuery-normalized event object.
*/
switchTab: function(e) {
"use strict";
e.preventDefault();
// close lingering wp link windows
if (typeof tinyMCE != "undefined" && 'style' == jQuery( e.currentTarget ).data( 'target' ) && this.ui.panels.find( '#wp-generate-sections-editor-wrap' ).hasClass( 'tmce-active' )) {
tinyMCE.activeEditor.execCommand('wp_link_cancel');
tinyMCE.activeEditor.execCommand('wp_media_cancel');
}
this.ui.nav.children().removeClass("active");
this.ui.panels.children().removeClass("active");
var target = jQuery(e.currentTarget).addClass("active").data("target");
this.ui.panels.find("div[data-id=" + target + "]").addClass("active");
},
/**
* close on keyboard shortcuts
* @param {Object} event
*/
keydown: function(e) {
// Close the modal when escape is pressed.
if (27 === e.which && this.$el.is(':visible')) {
this.closeModal(e);
e.stopImmediatePropagation();
}
}
});
// Singular View
Generate_Sections.sectionView = Backbone.View.extend({
model: Generate_Sections.Section,
tagName: 'div',
initialize: function() {
// re-render on all changes EXCEPT index
this.listenTo(this.model, "change", this.maybeRender);
},
attributes: {
class: "ui-state-default section"
},
// Get the template from the DOM
template: wp.template("generate-sections-section"),
events: {
'click .edit-section': 'editSection',
'click .section-title > span': 'editSection',
'click .delete-section': 'removeSection',
'click .toggle-section': 'toggleSection',
'reorder': 'reorder',
},
maybeRender: function(e) {
if (this.model.hasChanged('index')) return;
this.render();
},
// Render the single model - include an index.
render: function() {
this.model.set('index', this.model.collection.indexOf(this.model));
this.$el.html(this.template(this.model.toJSON()));
if (!this.model.get('title')) {
this.$el.find('h3.section-title > span').text(generate_sections_metabox_i18n.default_title);
}
this.$el.find('textarea').val(JSON.stringify(this.model));
return this;
},
// launch the edit modal
editSection: function(e) {
// stash the current focus
Generate_Sections.lastFocus = document.activeElement;
Generate_Sections.modalOpen = true;
e.preventDefault();
if (Generate_Sections.backbone_modal.__instance === undefined) {
Generate_Sections.backbone_modal.__instance = new Generate_Sections.backbone_modal.Application({
model: this.model
});
}
},
// reorder after sort
reorder: function(event, index) {
this.$el.trigger('update-sort', [this.model, index]);
},
// remove/destroy a model
removeSection: function(e) {
e.preventDefault();
if (confirm(generate_sections_metabox_i18n.confirm)) {
this.model.destroy();
Generate_Sections.sectionList.render(); // manually calling instead of listening since listening interferes with sorting
}
},
});
// List View
Generate_Sections.sectionListView = Backbone.View.extend({
el: "#generate_sections_container",
events: {
'update-sort': 'updateSort',
// 'add-section': 'addOne'
},
// callback for clone button
addSection: function(model) {
this.collection.add(model);
this.addOne(model);
},
addOne: function(model) {
var view = new Generate_Sections.sectionView({
model: model
});
this.$el.append(view.render().el);
},
render: function() {
this.$el.children().remove();
this.collection.each(this.addOne, this);
return this;
},
updateSort: function(event, model, position) {
this.collection.remove(model);
// renumber remaining models around missing model
this.collection.each(function(model, index) {
var new_index = index;
if (index >= position) {
new_index += 1;
}
model.set('index', new_index);
});
// set the index of the missing model
model.set('index', position);
// add the model back to the collection
this.collection.add(model, {
at: position
});
this.render();
},
});
// The Buttons & Nonce
Generate_Sections.ButtonControls = Backbone.View.extend({
attributes: {
class: "generate_sections_buttons"
},
tagName: 'p',
el: "#_generate_sections_metabox",
template: wp.template("generate-sections-buttons"),
// Attach events
events: {
"click .button-primary": "newSection",
"click #generate-delete-sections": "clearAll",
'click .edit-section': 'editSection',
},
// create new
newSection: function(e) {
e.preventDefault();
var newSection = new Generate_Sections.Section();
Generate_Sections.sectionList.addSection(newSection);
},
// clear all models
clearAll: function(e) {
e.preventDefault();
if (confirm(generate_sections_metabox_i18n.confirm)) {
Generate_Sections.sectionCollection.reset();
Generate_Sections.sectionList.render();
}
},
render: function() {
this.$el.find(".generate_sections_control").append(this.template);
return this;
},
});
// init
Generate_Sections.initApplication = function() {
// Create Collection From Existing Meta
Generate_Sections.sectionCollection = new Generate_Sections.SectionsCollection(generate_sections_metabox_i18n.sections);
// Create the List View
Generate_Sections.sectionList = new Generate_Sections.sectionListView({
collection: Generate_Sections.sectionCollection
});
Generate_Sections.sectionList.render();
// Buttons
Generate_Sections.Buttons = new Generate_Sections.ButtonControls({
collection: Generate_Sections.sectionCollection
});
Generate_Sections.Buttons.render();
};
/*-----------------------------------------------------------------------------------*/
/* Execute the above methods in the Generate_Sections object.
/*-----------------------------------------------------------------------------------*/
jQuery(document).ready(function($) {
Generate_Sections.initApplication();
$( '#generate_sections_container' ).sortable({
axis: "y",
opacity: 0.5,
grid: [20, 10],
tolerance: "pointer",
handle: ".move-section",
update: function(event, ui) {
ui.item.trigger("reorder", ui.item.index());
}
} );
if ( $( '.use-sections-switch' ).is( ':checked' ) ) {
setTimeout( function() {
generateShowSections();
}, 200 );
} else {
generateHideSections();
}
$( '.use-sections-switch' ).on( 'change', function( e ) {
var status = ( $(this).is( ':checked' ) ) ? 'checked' : 'unchecked';
if ( 'checked' == status ) {
generateShowSections();
} else if ( 'unchecked' == status ) {
generateHideSections();
}
} );
function generateShowSections() {
// Hide send to editor button
$('.send-to-editor').css('display', 'none');
// Hide the editor
$('#postdivrich').css({
'opacity': '0',
'height': '0',
'overflow': 'hidden'
});
// Show the sections
$('#_generate_sections_metabox').css({
'opacity': '1',
'height': 'auto'
});
// Remove and add the default editor - this removes any visible toolbars etc..
// We need to set a timeout for this to work
// if (typeof tinyMCE != "undefined") {
// tinyMCE.EditorManager.execCommand("mceRemoveEditor", true, "content");
// $( '.use-sections-cover' ).css( 'z-index','10000' );
// setTimeout('tinyMCE.EditorManager.execCommand("mceAddEditor", true, "content");', 1);
// setTimeout('jQuery( ".use-sections-cover" ).css( "z-index","-1" );', 1000);
// }
// Set a trigger
$('body').trigger('generate_show_sections');
}
function generateHideSections() {
// Show send to editor button
$('.send-to-editor').css('display', 'inline-block');
// Show the editor
$('#postdivrich').css({
'opacity': '1',
'height': 'auto'
});
// Hide the sections
$('#_generate_sections_metabox').css({
'opacity': '0',
'height': '0',
'overflow': 'hidden'
});
$('body').trigger('generate_hide_sections');
}
$( document ).on( 'click', '.edit-section.edit-settings', function() {
$( 'body' ).trigger( 'generate_section_show_settings' );
});
});
})(jQuery, Generate_Sections);

View File

@ -0,0 +1,846 @@
/*-----------------------------------------------------------------------------------*/
/* Generate Sections Metabox
/*
/* © Kathy Darling http://www.kathyisawesome.com
/* 2016-07-19. */
/*-----------------------------------------------------------------------------------*/
/**
* @type {Object} JavaScript namespace for our application.
*/
var Generate_Sections = {
backbone_modal: {
__instance: undefined
}
};
(function($, Generate_Sections) {
// Model
Generate_Sections.Section = Backbone.Model.extend({
defaults: {
"title": "",
"box_type": "",
"inner_box_type": "",
"custom_classes": "",
"custom_id": "",
"top_padding": "",
"bottom_padding": "",
"top_padding_unit": "",
"bottom_padding_unit": "",
"background_color": "",
"background_image": "",
"background_image_preview": "",
"parallax_effect": "",
"background_color_overlay": "",
"text_color": "",
"link_color": "",
"link_color_hover": "",
"content": ""
}
});
// Collection
Generate_Sections.SectionsCollection = Backbone.Collection.extend({
model: Generate_Sections.Section,
el: "#generate_sections_container",
comparator: function(model) {
return model.get('index');
}
});
/**
* Primary Modal Application Class
*/
Generate_Sections.backbone_modal.Application = Backbone.View.extend({
attributes: {
id: "generate-sections-modal-dialog",
class: "generate-sections-modal",
role: "dialog"
},
template: wp.template("generate-sections-modal-window"),
mediaUploader: null,
/*-----------------------------------------------------------------------------------*/
/* tinyMCE settings
/*-----------------------------------------------------------------------------------*/
tmc_settings: {},
/*-----------------------------------------------------------------------------------*/
/* tinyMCE defaults
/*-----------------------------------------------------------------------------------*/
tmc_defaults: {
theme: "modern",
menubar: false,
wpautop: true,
indent: false,
toolbar1: "bold,italic,underline,blockquote,strikethrough,bullist,numlist,alignleft,aligncenter,alignright,undo,redo,link,unlink,fullscreen",
plugins: "fullscreen,image,wordpress,wpeditimage,wplink",
max_height: 500
},
/*-----------------------------------------------------------------------------------*/
/* quicktags settings
/*-----------------------------------------------------------------------------------*/
qt_settings: {},
/*-----------------------------------------------------------------------------------*/
/* quicktags defaults
/*-----------------------------------------------------------------------------------*/
qt_defaults: {
buttons: "strong,em,link,block,del,ins,img,ul,ol,li,code,more,close,fullscreen"
},
model: Generate_Sections.Section,
events: {
"click .media-modal-backdrop, .media-modal-close, .media-button-close": "closeModal",
"click .media-button-insert": "saveModal",
"click .media-menu-item": "switchTab",
"keydown": "keydown",
"click .generate-sections-upload-button": "openMediaUploader",
"click .generate-sections-remove-image": "removeImage",
"click div.media-frame-title h1": "toggleMenu"
},
/**
* Simple object to store any UI elements we need to use over the life of the application.
*/
ui: {
nav: undefined,
content: undefined
},
/**
* Instantiates the Template object and triggers load.
*/
initialize: function() {
_.bindAll(this, "render", "closeModal", "saveModal", "switchTab");
this.focusManager = new wp.media.view.FocusManager({
el: this.el
});
this.changeInsertText();
//this.tinyMCEsettings();
this.render();
},
/**
* switch the insert button text to "insert section"
*/
changeInsertText: function(restore) {
var restore = typeof restore !== 'undefined' && restore == true ? true : false;
if (restore == false && typeof(wp.media.view.l10n.insertIntoPost) !== "undefined") {
this.insertIntoPost = wp.media.view.l10n.insertIntoPost;
wp.media.view.l10n.insertIntoPost = generate_sections_metabox_i18n.insert_into_section;
// switch the insert button text back
} else if (restore == true && typeof(this.insertIntoPost) !== "undefined") {
wp.media.view.l10n.insertIntoPost = this.insertIntoPost;
}
},
/**
* Assembles the UI from loaded template.
* @internal Obviously, if the template fail to load, our modal never launches.
*/
render: function() {
"use strict";
// Build the base window and backdrop, attaching them to the $el.
// Setting the tab index allows us to capture focus and redirect it in Application.preserveFocus
this.$el.attr("tabindex", "0").html(this.template);
// Handle any attempt to move focus out of the modal.
//jQuery(document).on("focusin", this.preserveFocus);
// set overflow to "hidden" on the body so that it ignores any scroll events while the modal is active
// and append the modal to the body.
jQuery("body").addClass("generate-modal-open").prepend(this.$el);
// aria hide the background
jQuery("#wpwrap").attr("aria-hidden", "true");
this.renderContent();
this.renderPreview();
this.selected();
this.colorPicker();
//this.startTinyMCE();
this.launchEditor();
// Set focus on the modal to prevent accidental actions in the underlying page
this.$el.focus();
return this;
},
launchEditor: function() {
var id = this.ui.panels.find( ".generate-sections-editor-wrap" ).find( 'textarea' ).attr( 'id' ),
customButtonsContainer = this.ui.panels.find( '.generate-sections-editor-wrap' ).find( '#custom-media-buttons' );
customButtonsContainer.find( '.insert-media' ).remove();
var customButtons = customButtonsContainer.html();
customButtonsContainer.remove();
var init_settings = true;
if ( typeof tinyMCEPreInit == "object" && "mceInit" in tinyMCEPreInit && "content" in tinyMCEPreInit.mceInit ) {
init_settings = tinyMCEPreInit.mceInit.content;
} else if ( typeof window.wpEditorL10n !== "undefined" ) {
init_settings = window.wpEditorL10n.tinymce.settings;
} else {
init_settings = this.tmc_defaults;
}
var thisPanel = this.ui.panels;
var custom_settings = {
wp_autoresize_on: false,
cache_suffix: "",
min_height: 400,
wp_keep_scroll_position: false,
setup: function( editor ) {
editor.on( 'init', function( e ) {
if ( 'html-active' === generate_sections_metabox_i18n.default_editor && generate_sections_metabox_i18n.user_can_richedit ) {
thisPanel.find( '#wp-generate-sections-editor-wrap' ).removeClass( 'tmce-active' ).addClass( 'html-active' );
editor.hidden = true;
}
} );
}
}
init_settings = $.extend({}, init_settings, custom_settings);
var qt_settings = true;
if ( typeof tinyMCEPreInit == "object" && "qtInit" in tinyMCEPreInit && "content" in tinyMCEPreInit.qtInit ) {
qt_settings = tinyMCEPreInit.qtInit.content;
} else {
qt_settings = this.qt_defaults;
}
if ( ! generate_sections_metabox_i18n.user_can_richedit ) {
init_settings = false;
}
wp.sectionsEditor.initialize( id, {
tinymce: init_settings,
quicktags: qt_settings,
mediaButtons: true
} );
var buttonsElement = this.ui.panels.find( '#wp-generate-sections-editor-wrap' ).find( '.wp-media-buttons' );
buttonsElement.attr( 'id', 'custom-media-buttons' );
$( customButtons ).appendTo( buttonsElement );
if ( ! generate_sections_metabox_i18n.user_can_richedit ) {
this.ui.panels.find( '#generate-sections-editor' ).addClass( 'no-rich-edit' );
}
},
/**
* Make the menu mobile-friendly
*/
toggleMenu: function() {
this.$el.find('.media-menu').toggleClass('visible');
},
/**
* Create the nav tabs & panels
*/
renderContent: function() {
var model = this.model;
var menu_item = wp.template("generate-sections-modal-menu-item");
// Save a reference to the navigation bar"s unordered list and populate it with items.
this.ui.nav = this.$el.find(".media-menu");
// reference to content area
this.ui.panels = this.$el.find(".media-frame-content");
// loop through the tabs
if (generate_sections_metabox_i18n.tabs.length) {
// for...of is nicer, but not supported by minify, so stay with for...in for now
for (var tab in generate_sections_metabox_i18n.tabs) {
if (generate_sections_metabox_i18n.tabs.hasOwnProperty(tab)) {
tab = generate_sections_metabox_i18n.tabs[tab];
var $new_tab = $(menu_item({
target: tab.target,
name: tab.title
}));
var panel = wp.template("generate-sections-edit-" + tab.target);
var $new_panel = $(panel(model.toJSON()));
if (tab.active == "true") {
$new_tab.addClass("active");
$new_panel.addClass("active");
}
jQuery( 'body' ).on( 'generate_section_show_settings', function() {
jQuery( '.generate-sections-modal .media-menu-item' ).removeClass('active');
jQuery( '.generate-sections-modal .panel' ).removeClass('active');
jQuery( '.generate-section-item-style' ).addClass('active');
jQuery( '.generate-section-settings' ).addClass('active');
});
this.ui.nav.append($new_tab);
this.ui.panels.append($new_panel);
}
}
}
},
/**
* Render the background image preview
*/
renderPreview: function(image_id) {
var image_id = typeof image_id !== 'undefined' ? image_id : this.model.get("background_image");
var $preview = $("#generate-section-image-preview");
$preview.children().remove();
if (image_id > 0) {
this.background = new wp.media.model.Attachment.get(image_id);
this.background.fetch({
success: function(att) {
if (_.contains(['png', 'jpg', 'gif', 'jpeg'], att.get('subtype'))) {
$("<img/>").attr("src", att.attributes.sizes.thumbnail.url).appendTo($preview);
$preview.next().find(".generate-sections-remove-image").show();
}
}
});
}
},
/**
* Set the default option for the select boxes
*/
selected: function() {
var _this = this;
this.$el.find("select").each(function(index, select) {
var attribute = jQuery(select).attr("name");
var selected = _this.model.get(attribute);
jQuery(select).val(selected);
});
},
/**
* Start the colorpicker
*/
colorPicker: function() {
this.$el.find(".generate-sections-color").wpColorPicker();
},
/**
* Launch Media Uploader
*/
openMediaUploader: function(e) {
var _this = this;
$input = jQuery(e.currentTarget).prev("#generate-sections-background-image");
e.preventDefault();
// If the uploader object has already been created, reopen the dialog
if (this.mediaUploader) {
this.mediaUploader.open();
return;
}
// Extend the wp.media object
this.mediaUploader = wp.media.frames.file_frame = wp.media({
title: generate_sections_metabox_i18n.media_library_title,
button: {
text: generate_sections_metabox_i18n.media_library_button
},
multiple: false
});
// When a file is selected, grab the URL and set it as the text field"s value
this.mediaUploader.on("select", function() {
attachment = _this.mediaUploader.state().get("selection").first().toJSON();
$input.val(attachment.id);
_this.renderPreview(attachment.id);
});
// Open the uploader dialog
this.mediaUploader.open();
},
/**
* Remove the background image
*/
removeImage: function(e) {
e.preventDefault();
$("#generate-section-image-preview").children().remove();
$("#generate-section-image-preview").next().find(".generate-sections-remove-image").hide();
$("#generate-sections-background-image").val("");
},
/**
* Closes the modal and cleans up after the instance.
* @param e {object} A jQuery-normalized event object.
*/
closeModal: function(e) {
"use strict";
e.preventDefault();
this.undelegateEvents();
jQuery(document).off("focusin");
jQuery("body").removeClass("generate-modal-open");
jQuery("body").removeClass("generate-section-content");
// remove restricted media modal tab focus once it's closed
this.$el.undelegate('keydown');
// remove the tinymce editor
// this needs to be called before the modal is closed or it will fail in Firefox (that was fun to figure out...)
if (typeof tinyMCE != "undefined") {
tinymce.EditorManager.execCommand("mceRemoveEditor", true, "generate-sections-editor");
}
// remove modal and unset instances
this.remove();
Generate_Sections.backbone_modal.__instance = undefined;
this.mediaUploader = null;
Generate_Sections.modalOpen = null;
// switch the insert button text back
this.changeInsertText(true);
// send focus back to where it was prior to modal open
Generate_Sections.lastFocus.focus();
// aria unhide the background
jQuery("#wpwrap").attr("aria-hidden", "false");
// Fix bug where the window scrolls down 50px on close
var topDistance = jQuery("body").offset().top;
if ( topDistance >= jQuery("body").scrollTop() ) {
jQuery("body").scrollTop(0);
}
},
/**
* Responds to the btn-ok.click event
* @param e {object} A jQuery-normalized event object.
* @todo You should make this your own.
*/
saveModal: function(e) {
"use strict";
this.model.get("index");
var model = this.model;
// send the tinymce content to the textarea
if (typeof tinyMCE != "undefined") {
tinymce.triggerSave();
}
var $inputs = this.ui.panels.find("input, select, textarea");
$inputs.each(function(index, input) {
var name = $(input).attr("name");
if (model.attributes.hasOwnProperty(name)) {
var value = $(input).val();
model.set(name, value);
}
});
this.closeModal(e);
},
/**
* Handles tab clicks and switches to corresponding panel
* @param e {object} A jQuery-normalized event object.
*/
switchTab: function(e) {
"use strict";
e.preventDefault();
// close lingering wp link windows
if (typeof tinyMCE != "undefined" && 'style' == jQuery( e.currentTarget ).data( 'target' ) && this.ui.panels.find( '#wp-generate-sections-editor-wrap' ).hasClass( 'tmce-active' )) {
tinyMCE.activeEditor.execCommand('wp_link_cancel');
tinyMCE.activeEditor.execCommand('wp_media_cancel');
}
this.ui.nav.children().removeClass("active");
this.ui.panels.children().removeClass("active");
var target = jQuery(e.currentTarget).addClass("active").data("target");
this.ui.panels.find("div[data-id=" + target + "]").addClass("active");
},
/**
* close on keyboard shortcuts
* @param {Object} event
*/
keydown: function(e) {
// Close the modal when escape is pressed.
if (27 === e.which && this.$el.is(':visible')) {
this.closeModal(e);
e.stopImmediatePropagation();
}
}
});
// Singular View
Generate_Sections.sectionView = Backbone.View.extend({
model: Generate_Sections.Section,
tagName: 'div',
initialize: function() {
// re-render on all changes EXCEPT index
this.listenTo(this.model, "change", this.maybeRender);
},
attributes: {
class: "ui-state-default section"
},
// Get the template from the DOM
template: wp.template("generate-sections-section"),
events: {
'click .edit-section': 'editSection',
'click .section-title > span': 'editSection',
'click .delete-section': 'removeSection',
'click .toggle-section': 'toggleSection',
'reorder': 'reorder',
},
maybeRender: function(e) {
if (this.model.hasChanged('index')) return;
this.render();
},
// Render the single model - include an index.
render: function() {
this.model.set('index', this.model.collection.indexOf(this.model));
this.$el.html(this.template(this.model.toJSON()));
if (!this.model.get('title')) {
this.$el.find('h3.section-title > span').text(generate_sections_metabox_i18n.default_title);
}
this.$el.find('textarea').val(JSON.stringify(this.model));
return this;
},
// launch the edit modal
editSection: function(e) {
// stash the current focus
Generate_Sections.lastFocus = document.activeElement;
Generate_Sections.modalOpen = true;
e.preventDefault();
if (Generate_Sections.backbone_modal.__instance === undefined) {
Generate_Sections.backbone_modal.__instance = new Generate_Sections.backbone_modal.Application({
model: this.model
});
}
},
// reorder after sort
reorder: function(event, index) {
this.$el.trigger('update-sort', [this.model, index]);
},
// remove/destroy a model
removeSection: function(e) {
e.preventDefault();
if (confirm(generate_sections_metabox_i18n.confirm)) {
this.model.destroy();
Generate_Sections.sectionList.render(); // manually calling instead of listening since listening interferes with sorting
}
},
});
// List View
Generate_Sections.sectionListView = Backbone.View.extend({
el: "#generate_sections_container",
events: {
'update-sort': 'updateSort',
// 'add-section': 'addOne'
},
// callback for clone button
addSection: function(model) {
this.collection.add(model);
this.addOne(model);
},
addOne: function(model) {
var view = new Generate_Sections.sectionView({
model: model
});
this.$el.append(view.render().el);
},
render: function() {
this.$el.children().remove();
this.collection.each(this.addOne, this);
return this;
},
updateSort: function(event, model, position) {
this.collection.remove(model);
// renumber remaining models around missing model
this.collection.each(function(model, index) {
var new_index = index;
if (index >= position) {
new_index += 1;
}
model.set('index', new_index);
});
// set the index of the missing model
model.set('index', position);
// add the model back to the collection
this.collection.add(model, {
at: position
});
this.render();
},
});
// The Buttons & Nonce
Generate_Sections.ButtonControls = Backbone.View.extend({
attributes: {
class: "generate_sections_buttons"
},
tagName: 'p',
el: "#_generate_sections_metabox",
template: wp.template("generate-sections-buttons"),
// Attach events
events: {
"click .button-primary": "newSection",
"click #generate-delete-sections": "clearAll",
'click .edit-section': 'editSection',
},
// create new
newSection: function(e) {
e.preventDefault();
var newSection = new Generate_Sections.Section();
Generate_Sections.sectionList.addSection(newSection);
},
// clear all models
clearAll: function(e) {
e.preventDefault();
if (confirm(generate_sections_metabox_i18n.confirm)) {
Generate_Sections.sectionCollection.reset();
Generate_Sections.sectionList.render();
}
},
render: function() {
this.$el.find(".generate_sections_control").append(this.template);
return this;
},
});
// init
Generate_Sections.initApplication = function() {
// Create Collection From Existing Meta
Generate_Sections.sectionCollection = new Generate_Sections.SectionsCollection(generate_sections_metabox_i18n.sections);
// Create the List View
Generate_Sections.sectionList = new Generate_Sections.sectionListView({
collection: Generate_Sections.sectionCollection
});
Generate_Sections.sectionList.render();
// Buttons
Generate_Sections.Buttons = new Generate_Sections.ButtonControls({
collection: Generate_Sections.sectionCollection
});
Generate_Sections.Buttons.render();
};
/*-----------------------------------------------------------------------------------*/
/* Execute the above methods in the Generate_Sections object.
/*-----------------------------------------------------------------------------------*/
jQuery(document).ready(function($) {
Generate_Sections.initApplication();
$( '#generate_sections_container' ).sortable({
axis: "y",
opacity: 0.5,
grid: [20, 10],
tolerance: "pointer",
handle: ".move-section",
update: function(event, ui) {
ui.item.trigger("reorder", ui.item.index());
}
} );
if ( $( '.use-sections-switch' ).is( ':checked' ) ) {
setTimeout( function() {
generateShowSections();
}, 200 );
} else {
generateHideSections();
}
$( '.use-sections-switch' ).on( 'change', function( e ) {
var status = ( $(this).is( ':checked' ) ) ? 'checked' : 'unchecked';
if ( 'checked' == status ) {
generateShowSections();
} else if ( 'unchecked' == status ) {
generateHideSections();
}
} );
function generateShowSections() {
// Hide send to editor button
$('.send-to-editor').css('display', 'none');
// Hide the editor
$('#postdivrich').css({
'opacity': '0',
'height': '0',
'overflow': 'hidden'
});
$( '.editor-block-list__layout' ).hide();
$( '.edit-post-layout__content .edit-post-visual-editor' ).css( {
'flex-grow': 'unset',
'flex-basis': '0'
} );
$( '.edit-post-layout__metaboxes:not(:empty)' ).css( 'border-top', '0' );
// Show the sections
$('#_generate_sections_metabox').css({
'opacity': '1',
'height': 'auto'
});
// Remove and add the default editor - this removes any visible toolbars etc..
// We need to set a timeout for this to work
// if (typeof tinyMCE != "undefined") {
// tinyMCE.EditorManager.execCommand("mceRemoveEditor", true, "content");
// $( '.use-sections-cover' ).css( 'z-index','10000' );
// setTimeout('tinyMCE.EditorManager.execCommand("mceAddEditor", true, "content");', 1);
// setTimeout('jQuery( ".use-sections-cover" ).css( "z-index","-1" );', 1000);
// }
// Set a trigger
$('body').trigger('generate_show_sections');
}
function generateHideSections() {
// Show send to editor button
$('.send-to-editor').css('display', 'inline-block');
// Show the editor
$('#postdivrich').css({
'opacity': '1',
'height': 'auto'
});
$( '.editor-block-list__layout' ).show();
$( '.edit-post-layout__content .edit-post-visual-editor' ).css( {
'flex-grow': '',
'flex-basis': ''
} );
$( '.edit-post-layout__metaboxes:not(:empty)' ).css( 'border-top', '' );
// Hide the sections
$('#_generate_sections_metabox').css({
'opacity': '0',
'height': '0',
'overflow': 'hidden'
});
$('body').trigger('generate_hide_sections');
}
$( document ).on( 'click', '.edit-section.edit-settings', function() {
$( 'body' ).trigger( 'generate_section_show_settings' );
});
});
})(jQuery, Generate_Sections);

View File

@ -0,0 +1,340 @@
/**!
* wp-color-picker-alpha
*
* Overwrite Automattic Iris for enabled Alpha Channel in wpColorPicker
* Only run in input and is defined data alpha in true
*
* Version: 1.2.2
* https://github.com/23r9i0/wp-color-picker-alpha
* Copyright (c) 2015 Sergio P.A. (23r9i0).
* Licensed under the GPLv2 license.
*/
( function( $ ) {
// Variable for some backgrounds ( grid )
var image = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAAHnlligAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAHJJREFUeNpi+P///4EDBxiAGMgCCCAGFB5AADGCRBgYDh48CCRZIJS9vT2QBAggFBkmBiSAogxFBiCAoHogAKIKAlBUYTELAiAmEtABEECk20G6BOmuIl0CIMBQ/IEMkO0myiSSraaaBhZcbkUOs0HuBwDplz5uFJ3Z4gAAAABJRU5ErkJggg==',
// html stuff for wpColorPicker copy of the original color-picker.js
_before = '<button type="button" class="button wp-color-result" aria-expanded="false" style="position:relative;"><span class="wp-color-result-text">' + wpColorPickerL10n.pick + '</span></button>',
_after = '<div class="wp-picker-holder" />',
_wrap = '<div class="wp-picker-container" />',
_button = '<input type="button" class="button button-small" />',
_wrappingLabel = '<label></label>',
_wrappingLabelText = '<span class="screen-reader-text"></span>';
/**
* Overwrite Color
* for enable support rbga
*/
Color.fn.toString = function() {
if ( this._alpha < 1 )
return this.toCSS( 'rgba', this._alpha ).replace( /\s+/g, '' );
var hex = parseInt( this._color, 10 ).toString( 16 );
if ( this.error )
return '';
if ( hex.length < 6 )
hex = ( '00000' + hex ).substr( -6 );
return '#' + hex;
};
/**
* Overwrite wpColorPicker
*/
$.widget( 'wp.wpColorPicker', $.wp.wpColorPicker, {
_create: function() {
// bail early for unsupported Iris.
if ( ! $.support.iris )
return;
var self = this,
el = self.element;
self.inputWrapper = el.closest( '.wp-picker-input-wrap' );
$.extend( self.options, el.data() );
// keep close bound so it can be attached to a body listener
self.close = $.proxy( self.close, self );
self.initialValue = el.val();
// Set up HTML structure, hide things
el.addClass( 'wp-color-picker' ).wrap( _wrap );
self.wrap = el.parent();
self.toggler = $( _before ).insertBefore( el ).css( { backgroundColor : self.initialValue } ).attr( 'title', wpColorPickerL10n.pick ).attr( 'data-current', wpColorPickerL10n.current );
self.pickerContainer = $( _after ).insertAfter( el );
self.button = $( _button );
if ( self.options.defaultColor ) {
self.button.addClass( 'wp-picker-default' ).val( wpColorPickerL10n.defaultString );
} else {
self.button.addClass( 'wp-picker-clear' ).val( wpColorPickerL10n.clear );
}
el.wrap( '<span class="wp-picker-input-wrap hidden" />' ).after( self.button );
el.iris( {
target : self.pickerContainer,
hide : self.options.hide,
width : self.options.width,
mode : self.options.mode,
palettes : self.options.palettes,
change : function( event, ui ) {
if ( self.options.alpha ) {
self.toggler.css( { 'background-image' : 'url(' + image + ')' } ).html( '<span class="wp-color-result-text" style="position:relative;z-index:1;">' + wpColorPickerL10n.pick + '</span><span />' );
self.toggler.find( 'span' ).last().css( {
'width' : '100%',
'height' : '100%',
'position' : 'absolute',
'top' : 0,
'left' : 0,
'border-top-left-radius' : '3px',
'border-bottom-left-radius' : '3px',
'background' : ui.color.toString()
} );
} else {
self.toggler.css( { backgroundColor : ui.color.toString() } );
}
// Check for a custom cb
if ( $.isFunction( self.options.change ) )
self.options.change.call( this, event, ui );
}
} );
el.val( self.initialValue );
self._addListeners();
if ( ! self.options.hide ) {
self.toggler.click();
}
},
_addListeners: function() {
var self = this;
// prevent any clicks inside this widget from leaking to the top and closing it
self.wrap.on( 'click.wpcolorpicker', function( event ) {
event.stopPropagation();
} );
self.toggler.on( 'click', function() {
if ( self.toggler.hasClass( 'wp-picker-open' ) ) {
self.close();
} else {
self.open();
}
});
self.element.on( 'change', function( event ) {
// Empty or Error = clear
if ( $( this ).val() === '' || self.element.hasClass( 'iris-error' ) ) {
if ( self.options.alpha ) {
self.toggler.removeAttr( 'style' );
self.toggler.find( 'span' ).css( 'backgroundColor', '' );
} else {
self.toggler.css( 'backgroundColor', '' );
}
// fire clear callback if we have one
if ( $.isFunction( self.options.clear ) )
self.options.clear.call( this, event );
}
} );
// open a keyboard-focused closed picker with space or enter
self.toggler.on( 'keyup', function( event ) {
if ( event.keyCode === 13 || event.keyCode === 32 ) {
event.preventDefault();
self.toggler.trigger( 'click' ).next().focus();
}
});
self.button.on( 'click', function( event ) {
if ( $( this ).hasClass( 'wp-picker-clear' ) ) {
self.element.val( '' );
if ( self.options.alpha ) {
self.toggler.removeAttr( 'style' );
self.toggler.find( 'span' ).css( 'backgroundColor', '' );
} else {
self.toggler.css( 'backgroundColor', '' );
}
if ( $.isFunction( self.options.clear ) )
self.options.clear.call( this, event );
} else if ( $( this ).hasClass( 'wp-picker-default' ) ) {
self.element.val( self.options.defaultColor ).change();
}
});
}
});
/**
* Overwrite iris
*/
$.widget( 'a8c.iris', $.a8c.iris, {
_create: function() {
this._super();
// Global option for check is mode rbga is enabled
this.options.alpha = this.element.data( 'alpha' ) || false;
// Is not input disabled
if ( ! this.element.is( ':input' ) )
this.options.alpha = false;
if ( typeof this.options.alpha !== 'undefined' && this.options.alpha ) {
var self = this,
el = self.element,
_html = '<div class="iris-strip iris-slider iris-alpha-slider"><div class="iris-slider-offset iris-slider-offset-alpha"></div></div>',
aContainer = $( _html ).appendTo( self.picker.find( '.iris-picker-inner' ) ),
aSlider = aContainer.find( '.iris-slider-offset-alpha' ),
controls = {
aContainer : aContainer,
aSlider : aSlider
};
if ( typeof el.data( 'custom-width' ) !== 'undefined' ) {
self.options.customWidth = parseInt( el.data( 'custom-width' ) ) || 0;
} else {
self.options.customWidth = 100;
}
// Set default width for input reset
self.options.defaultWidth = el.width();
// Update width for input
if ( self._color._alpha < 1 || self._color.toString().indexOf('rgb') != -1 )
el.width( parseInt( self.options.defaultWidth + self.options.customWidth ) );
// Push new controls
$.each( controls, function( k, v ) {
self.controls[k] = v;
} );
// Change size strip and add margin for sliders
self.controls.square.css( { 'margin-right': '0' } );
var emptyWidth = ( self.picker.width() - self.controls.square.width() - 20 ),
stripsMargin = ( emptyWidth / 6 ),
stripsWidth = ( ( emptyWidth / 2 ) - stripsMargin );
$.each( [ 'aContainer', 'strip' ], function( k, v ) {
self.controls[v].width( stripsWidth ).css( { 'margin-left' : stripsMargin + 'px' } );
} );
// Add new slider
self._initControls();
// For updated widget
self._change();
}
},
_initControls: function() {
this._super();
if ( this.options.alpha ) {
var self = this,
controls = self.controls;
controls.aSlider.slider({
orientation : 'vertical',
min : 0,
max : 100,
step : 1,
value : parseInt( self._color._alpha * 100 ),
slide : function( event, ui ) {
// Update alpha value
self._color._alpha = parseFloat( ui.value / 100 );
self._change.apply( self, arguments );
}
});
}
},
_change: function() {
this._super();
var self = this,
el = self.element;
if ( this.options.alpha ) {
var controls = self.controls,
alpha = parseInt( self._color._alpha * 100 ),
color = self._color.toRgb(),
gradient = [
'rgb(' + color.r + ',' + color.g + ',' + color.b + ') 0%',
'rgba(' + color.r + ',' + color.g + ',' + color.b + ', 0) 100%'
],
defaultWidth = self.options.defaultWidth,
customWidth = self.options.customWidth,
target = self.picker.closest( '.wp-picker-container' ).find( '.wp-color-result' );
// Generate background slider alpha, only for CSS3 old browser fuck!! :)
controls.aContainer.css( { 'background' : 'linear-gradient(to bottom, ' + gradient.join( ', ' ) + '), url(' + image + ')' } );
if ( target.hasClass( 'wp-picker-open' ) ) {
// Update alpha value
controls.aSlider.slider( 'value', alpha );
/**
* Disabled change opacity in default slider Saturation ( only is alpha enabled )
* and change input width for view all value
*/
if ( self._color._alpha < 1 ) {
controls.strip.attr( 'style', controls.strip.attr( 'style' ).replace( /rgba\(([0-9]+,)(\s+)?([0-9]+,)(\s+)?([0-9]+)(,(\s+)?[0-9\.]+)\)/g, 'rgb($1$3$5)' ) );
el.width( parseInt( defaultWidth + customWidth ) );
} else {
el.width( defaultWidth );
}
}
}
var reset = el.data( 'reset-alpha' ) || false;
if ( reset ) {
self.picker.find( '.iris-palette-container' ).on( 'click.palette', '.iris-palette', function() {
self._color._alpha = 1;
self.active = 'external';
self._change();
} );
}
},
_addInputListeners: function( input ) {
var self = this,
debounceTimeout = 100,
callback = function( event ) {
var color = new Color( input.val() ),
val = input.val();
input.removeClass( 'iris-error' );
// we gave a bad color
if ( color.error ) {
// don't error on an empty input
if ( val !== '' )
input.addClass( 'iris-error' );
} else {
if ( color.toString() !== self._color.toString() ) {
// let's not do this on keyup for hex shortcodes
if ( ! ( event.type === 'keyup' && val.match( /^[0-9a-fA-F]{3}$/ ) ) )
self._setOption( 'color', color.toString() );
}
}
};
input.on( 'change', callback ).on( 'keyup', self._debounce( callback, debounceTimeout ) );
// If we initialized hidden, show on first focus. The rest is up to you.
if ( self.options.hide ) {
input.on( 'focus', function() {
self.show();
} );
}
}
} );
}( jQuery ) );
// Auto Call plugin is class is color-picker
jQuery( document ).ready( function( $ ) {
$( '.color-picker' ).wpColorPicker();
} );

View File

@ -0,0 +1,391 @@
<?php
// No direct access, please
if ( ! defined( 'ABSPATH' ) ) exit;
if ( ! function_exists( 'generate_sections_admin_body_class' ) ) {
add_filter( 'admin_body_class', 'generate_sections_admin_body_class' );
function generate_sections_admin_body_class( $classes ) {
global $post;
$use_sections = ( isset( $post ) ) ? get_post_meta( $post->ID, '_generate_use_sections', TRUE) : '';
if ( isset( $use_sections['use_sections'] ) && 'true' == $use_sections['use_sections'] ) {
$classes .= ' generate-sections-enabled';
}
return $classes;
}
}
if ( ! function_exists( 'generate_sections_content_width' ) ) {
add_action( 'wp', 'generate_sections_content_width', 50 );
/**
* Set our content width when sections are enabled
*/
function generate_sections_content_width() {
global $post;
$use_sections = ( isset( $post ) ) ? get_post_meta( $post->ID, '_generate_use_sections', TRUE) : '';
if ( isset( $use_sections['use_sections'] ) && 'true' == $use_sections['use_sections'] ) {
global $content_width;
$content_width = 2000;
}
}
}
if ( ! function_exists( 'generate_sections_add_metaboxes' ) ) {
add_action( 'add_meta_boxes', 'generate_sections_add_metaboxes', 5 );
/*
* Functions for creating the metaboxes
*/
function generate_sections_add_metaboxes() {
$post_types = apply_filters( 'generate_sections_post_types', array( 'page', 'post' ) );
add_meta_box(
'_generate_use_sections_metabox',
__( 'Sections', 'gp-premium' ),
'generate_sections_use_sections_metabox',
$post_types,
'side',
'high'
);
add_meta_box(
'_generate_sections_metabox',
__( 'Sections', 'gp-premium' ),
'generate_sections_sections_metabox',
$post_types,
'normal',
'high'
);
}
}
if ( ! function_exists( 'generate_sections_sanitize_function' ) ) {
/*
* Sanitize our settings
*/
function generate_sections_sanitize_function( $data, $post_id ) {
$section = array();
if ( isset( $data['title'] ) ) {
$section['title'] = sanitize_text_field( $data['title'] );
}
if ( isset( $data['content'] ) ) {
$section['content'] = sanitize_post_field( 'post_content', $data['content'], $post_id, 'db' );
}
if ( isset( $data['custom_classes'] ) ) {
$section['custom_classes'] = sanitize_text_field( $data['custom_classes'] );
}
if ( isset( $data['custom_id'] ) ) {
$section['custom_id'] = sanitize_text_field( $data['custom_id'] );
}
if ( isset( $data['top_padding'] ) ) {
$section['top_padding'] = '' == $data['top_padding'] ? $data['top_padding'] : absint( $data['top_padding'] );
}
if ( isset( $data['bottom_padding'] ) ) {
$section['bottom_padding'] = '' == $data['bottom_padding'] ? $data['bottom_padding'] : absint( $data['bottom_padding'] );
}
if ( isset( $data['top_padding_unit'] ) ) {
$section['top_padding_unit'] = $data['top_padding_unit'] == '%' ? '%' : '';
}
if ( isset( $data['bottom_padding_unit'] ) ) {
$section['bottom_padding_unit'] = $data['bottom_padding_unit'] == '%' ? '%' : '';
}
if ( isset( $data['background_image'] ) ) {
$section['background_image'] = absint( $data['background_image'] );
}
if ( isset( $data['background_color'] ) ) {
$section['background_color'] = generate_sections_sanitize_rgba( $data['background_color'] );
}
if ( isset( $data['text_color'] ) ) {
$section['text_color'] = generate_sections_sanitize_hex_color( $data['text_color'] );
}
if ( isset( $data['link_color'] ) ) {
$section['link_color'] = generate_sections_sanitize_hex_color( $data['link_color'] );
}
if ( isset( $data['link_color_hover'] ) ) {
$section['link_color_hover'] = generate_sections_sanitize_hex_color( $data['link_color_hover'] );
}
if ( isset( $data['box_type'] ) ) {
$section['box_type'] = $data['box_type'] == 'contained' ? 'contained' : '';
}
if ( isset( $data['inner_box_type'] ) ) {
$section['inner_box_type'] = $data['inner_box_type'] == 'fluid' ? 'fluid' : '';
}
if ( isset( $data['parallax_effect'] ) ) {
$section['parallax_effect'] = $data['parallax_effect'] == 'enable' ? 'enable' : '';
}
if ( isset( $data['background_color_overlay'] ) ) {
$section['background_color_overlay'] = $data['background_color_overlay'] == 'enable' ? 'enable' : '';
}
return $section;
}
}
if ( ! function_exists( 'generate_sections_metabox_scripts' ) ) {
add_action( 'admin_enqueue_scripts', 'generate_sections_metabox_scripts', 20 );
/*
* Enqueue styles and scripts specific to metaboxs
*/
function generate_sections_metabox_scripts( $hook ) {
// I prefer to enqueue the styles only on pages that are using the metaboxes
if ( in_array( $hook, array( "post.php", "post-new.php" ) ) ) {
$post_types = apply_filters( 'generate_sections_post_types', array( 'page', 'post' ) );
$screen = get_current_screen();
$post_type = $screen->id;
if ( in_array( $post_type, (array) $post_types ) ) {
wp_enqueue_style( 'generate-sections-metabox', plugin_dir_url( __FILE__ ) . 'css/generate-sections-metabox.css', false, GENERATE_SECTIONS_VERSION );
wp_enqueue_style( 'generate-lc-switch', plugin_dir_url( __FILE__ ) . 'css/lc_switch.css', false, GENERATE_SECTIONS_VERSION );
//make sure we enqueue some scripts just in case ( only needed for repeating metaboxes )
wp_enqueue_script( 'jquery' );
wp_enqueue_script( 'jquery-ui-core' );
wp_enqueue_script( 'jquery-ui-widget' );
wp_enqueue_script( 'jquery-ui-mouse' );
wp_enqueue_script( 'jquery-ui-sortable' );
wp_enqueue_script( 'editor' );
wp_enqueue_script( 'media-upload' );
wp_enqueue_script( 'wp-color-picker' );
wp_enqueue_style( 'wp-color-picker' );
wp_enqueue_script( 'wp-color-picker-alpha', plugin_dir_url( __FILE__ ) . 'js/wp-color-picker-alpha.min.js', array( 'wp-color-picker' ), GENERATE_SECTIONS_VERSION );
wp_enqueue_media();
if ( function_exists( 'wp_enqueue_editor' ) ) {
wp_enqueue_editor();
wp_add_inline_script(
'editor',
'window.wp.sectionsEditor = window.wp.editor;',
'after'
);
}
if ( version_compare( get_bloginfo( 'version' ), '5.0', '<' ) ) {
wp_enqueue_script( 'generate-sections-metabox', plugin_dir_url( __FILE__ ) . 'js/generate-sections-metabox-4.9.js', array( 'jquery', 'jquery-ui-core', 'jquery-ui-widget', 'jquery-ui-mouse', 'jquery-ui-sortable', 'editor', 'media-upload', 'wp-color-picker' ), GENERATE_SECTIONS_VERSION, true );
} else {
wp_enqueue_script( 'generate-sections-metabox', plugin_dir_url( __FILE__ ) . 'js/generate-sections-metabox.js', array( 'jquery', 'jquery-ui-core', 'jquery-ui-widget', 'jquery-ui-mouse', 'jquery-ui-sortable', 'editor', 'media-upload', 'wp-color-picker' ), GENERATE_SECTIONS_VERSION, true );
}
if ( function_exists( 'wp_add_inline_script' ) ) {
if ( function_exists( 'generate_get_default_color_palettes' ) ) {
// Grab our palette array and turn it into JS
$palettes = json_encode( generate_get_default_color_palettes() );
// Add our custom palettes
// json_encode takes care of escaping
wp_add_inline_script( 'wp-color-picker', 'jQuery.wp.wpColorPicker.prototype.options.palettes = ' . $palettes . ';' );
}
}
}
}
}
}
if ( ! function_exists( 'generate_sections_admin_footer_scripts' ) ) {
add_action( 'admin_footer', 'generate_sections_admin_footer_scripts' );
function generate_sections_admin_footer_scripts() {
// We don't need this if wp_add_inline_script exists
if ( function_exists( 'wp_add_inline_script' ) ) {
return;
}
?>
<script>
if ( typeof lc_switch !== 'undefined' ) {
jQuery(document).ready(function($) { $(".use-sections-switch").lc_switch("","");});
}
</script>
<?php
}
}
if ( ! function_exists( 'generate_sections_use_sections_metabox' ) ) {
function generate_sections_use_sections_metabox() {
include_once( plugin_dir_path( __FILE__ ) . 'views/use-sections.php' );
}
}
if ( ! function_exists( 'generate_sections_sections_metabox' ) ) {
function generate_sections_sections_metabox() {
global $post;
$meta = get_post_meta( $post->ID, '_generate_sections', true );
$sections = isset( $meta['sections'] ) && is_array( $meta['sections' ] ) ? $meta['sections'] : array();
$translation_array = array(
'confirm' => __( 'This action can not be undone, are you sure?', 'gp-premium' ),
'post_id' => $post->ID,
'sections' => $sections,
'default_title' => __( 'Section', 'gp-premium' ),
'default_content_title' => __( 'Content', 'gp-premium' ),
'tabs' => array(
array( 'title' => __( 'Settings', 'gp-premium' ), 'target' => 'style', 'active' => 'false' ),
array( 'title' => __( 'Content', 'gp-premium' ), 'target' => 'content', 'active' => 'true' ),
//array( 'title' => __( 'Layout', 'gp-premium' ), 'target' => 'layout', 'active' => 'false' ),
),
'top_padding' => apply_filters( 'generate_sections_default_padding_top','40' ),
'bottom_padding' => apply_filters( 'generate_sections_default_padding_bottom','40' ),
'media_library_title' => __('Section Background', 'gp-premium' ),
'media_library_button' => __( 'Set as Section Background', 'gp-premium' ),
'generate_nonce' => wp_create_nonce( 'generate_sections_nonce' ),
'default_editor' => user_can_richedit() && wp_default_editor() == 'tinymce' ? 'tmce-active' : 'html-active',
'user_can_richedit' => user_can_richedit(),
'insert_into_section' => __( 'Insert into Section', 'gp-premium' ),
'edit_section' => __( 'Edit Section', 'gp-premium' )
);
wp_localize_script( 'generate-sections-metabox', 'generate_sections_metabox_i18n', $translation_array );
include_once( plugin_dir_path( __FILE__ ) . 'views/sections.php' );
include_once( plugin_dir_path( __FILE__ ) . 'views/sections-template.php' );
add_action( 'print_media_templates', 'generate_sections_print_templates' );
do_action( 'generate_sections_metabox' );
}
}
if ( ! function_exists( 'generate_sections_save_use_metabox' ) ) {
add_action( 'save_post', 'generate_sections_save_use_metabox' );
/*
* Save the "use" metabox
*/
function generate_sections_save_use_metabox( $post_id ) {
if ( ! isset( $_POST['_generate_sections_use_sections_nonce'] ) || ! wp_verify_nonce( $_POST['_generate_sections_use_sections_nonce'], 'generate_sections_use_sections_nonce' ) ) {
return $post_id;
}
if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) {
return $post_id;
}
if ( ! current_user_can('edit_post', $post_id ) ) {
return $post_id;
}
if ( isset ( $_POST['_generate_use_sections'] ) && isset ( $_POST['_generate_use_sections']['use_sections'] ) && $_POST['_generate_use_sections']['use_sections'] == 'true' ) {
update_post_meta( $post_id, '_generate_use_sections', array( 'use_sections' => 'true' ) );
} else {
delete_post_meta( $post_id, '_generate_use_sections' );
}
}
}
if ( ! function_exists( 'generate_sections_save_sections_metabox' ) ) {
add_action( 'save_post', 'generate_sections_save_sections_metabox', 20 );
/*
* Save the sections metabox
*/
function generate_sections_save_sections_metabox( $post_id ) {
if ( ! isset( $_POST['_generate_sections_nonce'] ) || ! wp_verify_nonce( $_POST['_generate_sections_nonce'], 'generate_sections_nonce' ) ) {
return $post_id;
}
if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) {
return $post_id;
}
if ( ! current_user_can('edit_post', $post_id ) ) {
return $post_id;
}
$clean = array();
if ( isset ( $_POST['_generate_sections'] ) && isset( $_POST['_generate_sections']['sections'] ) && is_array( $_POST['_generate_sections']['sections'] ) ) {
foreach( $_POST['_generate_sections']['sections'] as $section ) {
$section = json_decode( stripslashes( trim($section) ), true);
$section = generate_sections_sanitize_function( $section, $post_id );
if ( ! empty( $section ) ){
$clean[] = $section;
}
}
}
// save data
if ( ! empty( $clean ) ) {
// this maintains data structure of previous version
$meta = array( 'sections' => $clean );
update_post_meta( $post_id, '_generate_sections', $meta );
} else {
delete_post_meta( $post_id, '_generate_sections' );
}
}
}
if ( ! function_exists( 'generate_sections_sanitize_hex_color' ) ) {
/*
* Sanitize colors
* We don't use the built in function so we can use empty values
*/
function generate_sections_sanitize_hex_color( $color ) {
if ( '' === $color ) {
return '';
}
// 3 or 6 hex digits, or the empty string.
if ( preg_match('|^#([A-Fa-f0-9]{3}){1,2}$|', $color ) ) {
return $color;
}
return null;
}
}
if ( ! function_exists( 'generate_sections_sanitize_rgba' ) ) {
/**
* Sanitize RGBA colors
* @since 1.3.42
*/
function generate_sections_sanitize_rgba( $color ) {
if ( '' === $color ) {
return '';
}
// If string does not start with 'rgba', then treat as hex
// sanitize the hex color and finally convert hex to rgba
if ( false === strpos( $color, 'rgba' ) ) {
return generate_sections_sanitize_hex_color( $color );
}
// By now we know the string is formatted as an rgba color so we need to further sanitize it.
$color = str_replace( ' ', '', $color );
sscanf( $color, 'rgba(%d,%d,%d,%f)', $red, $green, $blue, $alpha );
return 'rgba('.$red.','.$green.','.$blue.','.$alpha.')';
return '';
}
}

View File

@ -0,0 +1,279 @@
<?php
// No direct access, please
if ( ! defined( 'ABSPATH' ) ) exit;
/**
* Prints the templates used in the sections metabox
*
* @global bool $is_IE
*/
function generate_sections_print_templates() {
global $is_IE;
$class = 'media-modal wp-core-ui';
if ( $is_IE && strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 7') !== false ){
$class .= ' ie7';
}
/**
* Backbone Templates
* This file contains all of the HTML used in our application
*
* Each template is wrapped in a script block ( note the type is set to "text/html" ) and given an ID prefixed with
* 'tmpl'. The wp.template method retrieves the contents of the script block and converts these blocks into compiled
* templates to be used and reused in your application.
*/
/**
* The Singular List View
*/
?>
<script type="text/template" id="tmpl-generate-sections-section">
<h3 class="section-title">
<span class="text generate-section-text" title="<?php _e( 'Click to edit', 'gp-premium' );?>">{{{ data.title }}}</span>
<div class="section-controls">
<a class="edit-section edit-content dashicons dashicons-edit" href="#" title="<?php _e( 'Click to edit content', 'gp-premium' );?>"></a>
<a class="edit-section edit-settings dashicons dashicons-admin-generic" href="#" title="<?php _e( 'Click to edit settings', 'gp-premium' );?>"></a>
<a class="move-section dashicons dashicons-move" href="#" title="<?php _e( 'Click and drag to sort', 'gp-premium' );?>"></a>
<a class="delete-section dashicons dashicons-no" href="#" title="<?php esc_attr_e( 'Click to remove', 'gp-premium' );?>"></a>
</div>
</h3>
<textarea name="_generate_sections[sections][{{{ data.index }}}]" readonly="readonly"></textarea>
</script>
<?php
/**
* The Add/Clear buttons
*/
?>
<script type="text/template" id="tmpl-generate-sections-buttons">
<a href="#" id="generate-add-section" class="button-primary button-large"><?php _e( 'Add Section', 'gp-premium' );?></a>
<a href="#" style="display:none;" id="generate-delete-sections" class="button button-large"><?php _e( 'Remove Sections', 'gp-premium');?></a>
<?php wp_nonce_field( 'generate_sections_nonce', '_generate_sections_nonce' ); ?>
</script>
<?php
/**
* The Modal Window, including sidebar and content area.
* Add menu items to ".media-frame-menu"
* Add content to ".media-frame-content"
*/
?>
<script type="text/html" id="tmpl-generate-sections-modal-window">
<div class="<?php echo esc_attr( $class ); ?>">
<button type="button" class="button-link media-modal-close" aria-label="close"><span class="media-modal-icon"><span class="screen-reader-text"><?php _e( 'Close', 'gp-premium' ); ?></span></span></button>
<div class="media-modal-content">
<div class="media-frame mode-select wp-core-ui hide-router">
<div class="media-frame-menu"><div class="media-menu"></div></div>
<div class="media-frame-title">
<h1><?php _e( 'Edit Section', 'gp-premium' ); ?><span class="dashicons dashicons-arrow-down"></span></h1>
</div>
<div class="media-frame-content"></div>
<div class="media-frame-toolbar">
<div class="media-toolbar">
<div class="media-toolbar-primary">
<button type="button" class="button media-button button-primary button-large media-button-insert"><?php _e( 'Apply', 'gp-premium' ); ?></button>
<button type="button" class="button button media-button button button-large media-button-close"><?php _e( 'Cancel', 'gp-premium' ); ?></button>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="media-modal-backdrop"></div>
</script>
<?php
/**
* Base template for a navigation-bar menu item
*/
?>
<script type="text/html" id='tmpl-generate-sections-modal-menu-item'>
<a class="media-menu-item generate-section-item-{{ data.target }}" data-target="{{ data.target }}">{{ data.name }}</a>
</script>
<?php
/**
* the Edit Sections
*/
?>
<script type="text/html" id="tmpl-generate-sections-edit-content">
<div data-id="content" class="panel generate-section-content">
<div class="gs-grid-100 section-title">
<label for="title"><?php _e( 'Section Label', 'gp-premium' );?></label>
<p>
<input type="text" name="title" placeholder="{{{ generate_sections_metabox_i18n.default_title }}}" id="title" value="{{{ data.title }}}"/>
</p>
</div>
<?php if ( version_compare( get_bloginfo( 'version' ), '5.0', '<' ) ) : ?>
<div class="gs-grid-100 wp-core-ui wp-editor-wrap">
<div class="postarea wp-editor-expand">
<div id="wp-generate-sections-editor-wrap" class="wp-core-ui wp-editor-wrap old-sections-js">
<div id="wp-generate-sections-editor-editor-tools" class="wp-editor-tools hide-if-no-js">
<div class="wp-media-buttons">
<button type="button" class="button insert-media add_media generate-sections-add-media" data-editor="generate-sections-editor"><span class="wp-media-buttons-icon"></span><?php _e( 'Add Media', 'gp-premium' );?></button>
<?php do_action( 'media_buttons' ); ?>
</div>
<div class="wp-editor-tabs">
<button type="button" id="content-tmce" class="wp-switch-editor switch-tmce" data-wp-editor-id="generate-sections-editor"><?php _e( 'Visual', 'gp-premium' ); ?></button>
<button type="button" id="content-html" class="wp-switch-editor switch-html" data-wp-editor-id="generate-sections-editor"><?php _ex( 'Text', 'Name for the Text editor tab (formerly HTML)', 'gp-premium' ); ?></button>
</div>
</div><!-- .wp-editor-tools -->
<div class="wp-editor-container">
<textarea id="generate-sections-editor" class="wp-editor-area" autocomplete="off" cols="40" name="content">{{{ data.content }}}</textarea>
</div>
</div>
</div>
</div>
<?php else : ?>
<div class="gs-grid-100 generate-sections-editor-wrap">
<div id="custom-media-buttons">
<?php do_action( 'media_buttons' ); ?>
</div>
<textarea id="generate-sections-editor" class="wp-editor-area" autocomplete="off" cols="40" name="content">{{{ data.content }}}</textarea>
</div>
<?php endif; ?>
</div>
</script>
<script type="text/html" id="tmpl-generate-sections-edit-layout">
<div data-id="layout" class="panel">
</div>
</script>
<script type="text/html" id="tmpl-generate-sections-edit-style">
<div data-id="style" class="panel generate-section-settings">
<div class="gs-grid-container gs-grid-parent">
<div class="gs-grid-33">
<h3><?php _e( 'Layout', 'gp-premium' ); ?></h3>
<label for="box_type"><?php _e('Box Type', 'gp-premium');?></label>
<p>
<select name="box_type" id="box_type">
<option value=""><?php _e( 'Full Width', 'gp-premium' );?></option>
<option value="contained"><?php _ex( 'Contained', 'Width', 'gp-premium' );?></option>
</select>
</p>
<label for="inner_box_type"><?php _e('Inner Box Type', 'gp-premium');?></label>
<p>
<select name="inner_box_type" id="inner_box_type">
<option value=""><?php _ex( 'Contained', 'Width', 'gp-premium' );?></option>
<option value="fluid"><?php _e( 'Full Width', 'gp-premium' );?></option>
</select>
</p>
<label for="custom_id"><?php _e( 'Custom ID', 'gp-premium' );?></label>
<p>
<input type="text" name="custom_id" id="custom_id" value="{{{ data.custom_id }}}"/>
</p>
<label for="custom_classes"><?php _e( 'Custom Classes', 'gp-premium' );?></label>
<p>
<input type="text" name="custom_classes" id="custom_classes" value="{{{ data.custom_classes }}}"/>
</p>
<label for="top_padding"><?php _e( 'Top Padding', 'gp-premium' );?></label>
<p>
<input placeholder="{{{ generate_sections_metabox_i18n.top_padding }}}" type="number" name="top_padding" id="top_padding" value="{{{ data.top_padding }}}"/><select style="margin:0;position:relative;top:-2px;" name="top_padding_unit" id="top_padding_unit">
<option value="">px</option>
<option value="%">%</option>
</select>
</p>
<label for="bottom_padding"><?php _e( 'Bottom Padding', 'gp-premium' );?></label>
<p>
<input placeholder="{{{ generate_sections_metabox_i18n.bottom_padding }}}" type="number" name="bottom_padding" id="bottom_padding" value="{{{ data.bottom_padding }}}"/><select style="margin:0;position:relative;top:-2px;" name="bottom_padding_unit" id="bottom_padding_unit">
<option value="">px</option>
<option value="%">%</option>
</select>
</p>
</div>
<div class="gs-grid-33">
<h3><?php _e( 'Colors', 'gp-premium' ); ?></h3>
<label for="background_color"><?php _e( 'Background Color', 'gp-premium' );?></label>
<p>
<input class="generate-sections-color" type="text" data-alpha="true" name="background_color" id="background_color" value="{{{ data.background_color }}}"/>
</p>
<label for="text_color"><?php _e( 'Text Color', 'gp-premium' );?></label>
<p>
<input class="generate-sections-color" type="text" name="text_color" id="text_color" value="{{{ data.text_color }}}"/>
</p>
<label for="link_color"><?php _e( 'Link Color', 'gp-premium' );?></label>
<p>
<input class="generate-sections-color" type="text" name="link_color" id="link_color" value="{{{ data.link_color }}}"/>
</p>
<label for="link_color_hover"><?php _e('Link Color Hover', 'gp-premium');?></label>
<p>
<input class="generate-sections-color" type="text" name="link_color_hover" id="link_color_hover" value="{{{ data.link_color_hover }}}"/>
</p>
</div>
<div class="gs-grid-33">
<h3><?php _e( 'Background', 'gp-premium' ); ?></h3>
<label for="generate-sections-background-image"><?php _e( 'Background Image', 'gp-premium' );?></label>
<p id="generate-section-image-preview"></p>
<p>
<input class="image_id" type="hidden" id="generate-sections-background-image" name="background_image" value="{{{ data.background_image }}}" />
<button id="image_button" class="generate-sections-upload-button button" type="button" data-uploader_title="<?php _e( 'Background Image', 'gp-premium' );?>"><?php _e('Upload', 'gp-premium') ;?></button>
<button id="remove_image" class="generate-sections-remove-image button" type="button"><?php _e( 'Remove', 'gp-premium' );?></button>
</p>
<label for="parallax_effect"><?php _e('Parallax Effect', 'gp-premium');?></label>
<p>
<select name="parallax_effect" id="parallax_effect">
<option value=""><?php _e( 'Disable', 'gp-premium' );?></option>
<option value="enable"><?php _e( 'Enable', 'gp-premium' );?></option>
</select>
</p>
<label for="background_color_overlay"><?php _e( 'Background Color Overlay', 'gp-premium' );?></label>
<p>
<select name="background_color_overlay" id="background_color_overlay">
<option value=""><?php _e( 'Disable', 'gp-premium' );?></option>
<option value="enable"><?php _e( 'Enable', 'gp-premium' );?></option>
</select>
</p>
</div>
</div>
</div>
</script>
<?php
}

View File

@ -0,0 +1,13 @@
<?php
// No direct access, please
if ( ! defined( 'ABSPATH' ) ) exit;
?>
<div class="generate_sections_control">
<noscript>
<?php _e('Javascript must be enabled to use Generate Sections', 'gp-premium' );?>
</noscript>
<div id="generate_sections_container"></div>
</div>

View File

@ -0,0 +1,17 @@
<?php
// No direct access, please
if ( ! defined( 'ABSPATH' ) ) exit;
?>
<div class="generate_sections_control">
<?php
global $post;
$use_sections = get_post_meta( $post->ID, '_generate_use_sections', true );
//$use_sections = isset( $use_sections['use_sections'] ) && 'true' == $use_sections['use_sections'] ? true : false;
wp_nonce_field( 'generate_sections_use_sections_nonce', '_generate_sections_use_sections_nonce' );
?>
<label for="_generate_use_sections[use_sections]">
<input type="checkbox" class="use-sections-switch" name="_generate_use_sections[use_sections]" id="_generate_use_sections[use_sections]" value="true" <?php if ( isset ( $use_sections['use_sections'] ) ) checked( $use_sections['use_sections'], 'true', true );?> />
<?php _e( 'Use Sections', 'gp-premium' ); ?>
</label>
</div>