199 lines
7.5 KiB
JavaScript
Executable File
199 lines
7.5 KiB
JavaScript
Executable File
/*! sir-trevor-columns-block 2015-03-01 */
|
|
/* global define:true module:true window: true */
|
|
(function(global, factory) {
|
|
if (typeof define === 'function' && define['amd']) {
|
|
define(['sir-trevor-js', 'jquery'], factory);
|
|
} else if (typeof module !== 'undefined' && module['exports']) {
|
|
var SirTrevor = require('sir-trevor-js');
|
|
var jQuery = require('jquery');
|
|
module['exports'] = factory(SirTrevor, jQuery);
|
|
} else if (typeof this !== 'undefined') {
|
|
global.SirTrevor.Blocks.Columns = factory(global.SirTrevor, global.jQuery);
|
|
}
|
|
})(typeof window !== 'undefined' ? window : this, function factory(SirTrevor, $) {
|
|
"use strict";
|
|
/*
|
|
Columns Layout Block
|
|
*/
|
|
return SirTrevor.Blocks.Columns = SirTrevor.Block.extend({
|
|
|
|
type: "Columns",
|
|
|
|
title: function () {
|
|
return i18n.t('blocks:columns:title') || 'Columns';
|
|
},
|
|
|
|
icon_name: 'columns',
|
|
|
|
columns_presets: {
|
|
'columns-6-6': [6, 6],
|
|
'columns-3-9': [3, 9],
|
|
'columns-9-3': [9, 3],
|
|
'columns-4-8': [4, 8],
|
|
'columns-8-4': [8, 4],
|
|
'columns-4-4-4': [4, 4, 4],
|
|
'columns-3-6-3': [3, 6, 3],
|
|
'columns-3-3-3-3': [3, 3, 3, 3]
|
|
},
|
|
|
|
controllable: true,
|
|
|
|
constructor: function (data, editorInstance, mediator, options) {
|
|
SirTrevor.Block.apply(this, arguments);
|
|
},
|
|
|
|
beforeBlockRender: function () {
|
|
this.controls = {
|
|
'twocolumns': this.changeColumnsHandler('columns-6-6'),
|
|
'threecolumns': this.changeColumnsHandler('columns-4-4-4'),
|
|
'onetwocolumns': this.changeColumnsHandler('columns-4-8'),
|
|
'twoonecolumns': this.changeColumnsHandler('columns-8-4'),
|
|
'fourcolumns': this.changeColumnsHandler('columns-3-3-3-3'),
|
|
'onethreecolumns': this.changeColumnsHandler('columns-3-9'),
|
|
'threeonecolumns': this.changeColumnsHandler('columns-9-3'),
|
|
'onetwoonecolumns': this.changeColumnsHandler('columns-3-6-3')
|
|
};
|
|
},
|
|
|
|
changeColumnsHandler: function (preset) {
|
|
var self = this;
|
|
return function () {
|
|
self.changeColumns(preset, false);
|
|
};
|
|
},
|
|
|
|
changeColumns: function (preset) {
|
|
if (this.columns_preset !== preset) {
|
|
this.applyColumns(preset);
|
|
}
|
|
},
|
|
|
|
editorHTML: function () {
|
|
return '<div class="columns-row" id="#{blockID}-columns-row" style="overflow: auto"/>'.replace('#{blockID}', this.blockID);
|
|
},
|
|
|
|
_setBlockInner: function () {
|
|
SirTrevor.Block.prototype._setBlockInner.apply(this, arguments);
|
|
this.applyColumns('columns-6-6', true);
|
|
/* default */
|
|
},
|
|
|
|
applyColumns: function (preset, initial) {
|
|
var self = this;
|
|
var columns_config = this.columns_presets[preset];
|
|
|
|
var $to_delete = this.getColumns(':gt(' + (columns_config.length - 1) + ')');
|
|
// if there are unneeded columns
|
|
if ($to_delete.length > 0) {
|
|
// ask confirmation only if there are nested blocks
|
|
if ($to_delete.children('.st-block').length > 0) {
|
|
var txt = $to_delete.length === 1 ? 'column' : ($to_delete.length + ' columns');
|
|
if (!window.confirm('This action will delete last ' + txt + '. Do you really want to proceed?')) {
|
|
return; // interrupt if "Cancel" is pressed
|
|
}
|
|
}
|
|
$to_delete.each(function () {
|
|
var $this = $(this);
|
|
// destroy nested blocks properly
|
|
$this.children('.st-block').each(function () {
|
|
self.editorInstance.block_manager.removeBlock(this.getAttribute('id'));
|
|
});
|
|
// destroy column itself
|
|
$this.trigger('destroy').remove();
|
|
});
|
|
}
|
|
|
|
// apply new configuration
|
|
var total_width = columns_config.reduce(function (total, width) {
|
|
return total + width;
|
|
}, 0);
|
|
var $row = this.$('.columns-row');
|
|
|
|
columns_config.forEach(function (ratio, i) {
|
|
var width = Math.round(ratio * 1000 * 100 / total_width) / 1000;
|
|
|
|
var $column = self.getColumn(i);
|
|
if ($column.length === 0) {
|
|
$column = $('<div class="column" style="float: left;"></div>');
|
|
var plus = new SirTrevor.FloatingBlockControls($column, self.instanceID, self.mediator);
|
|
// self.listenTo(plus, 'showBlockControls', self.editorInstance.showBlockControls);
|
|
$column.prepend(plus.render().$el);
|
|
$row.append($column);
|
|
}
|
|
|
|
$column.css('width', width + '%');
|
|
});
|
|
|
|
this.$('.st-block-control-ui-btn').removeClass('active')
|
|
.filter('[data-icon=' + preset + ']').addClass('active');
|
|
|
|
this.columns_preset = preset;
|
|
|
|
if (!initial) {
|
|
this.trigger('block:columns:change');
|
|
}
|
|
},
|
|
|
|
onBlockRender: function () {
|
|
this.$('.st-block-control-ui-btn').filter('[data-icon=' + this.columns_preset + ']').addClass('active');
|
|
},
|
|
|
|
getRow: function () {
|
|
if (this.$row) {
|
|
return this.$row;
|
|
}
|
|
this.$row = this.$('#' + this.blockID + '-columns-row');
|
|
return this.$row;
|
|
},
|
|
|
|
getColumns: function (filter) {
|
|
return this.getRow().children(filter);
|
|
},
|
|
|
|
getColumn: function (index) {
|
|
return this.getRow().children(':eq(' + index + ')');
|
|
},
|
|
|
|
_serializeData: function () {
|
|
var self = this;
|
|
var column_config = this.columns_presets[this.columns_preset];
|
|
var dataObj = {columns: [], preset: this.columns_preset};
|
|
|
|
this.getColumns().each(function (i) {
|
|
var blocksData = [];
|
|
$(this).children('.st-block').each(function () {
|
|
var block = self.editorInstance.findBlockById(this.getAttribute('id'));
|
|
blocksData.push(block.getData());
|
|
});
|
|
|
|
dataObj.columns.push({
|
|
width: column_config[i],
|
|
blocks: blocksData
|
|
});
|
|
});
|
|
|
|
return dataObj;
|
|
},
|
|
|
|
loadData: function (data) {
|
|
if (data.preset) {
|
|
this.applyColumns(data.preset, true);
|
|
}
|
|
|
|
var columns_data = (data.columns || []);
|
|
for (var i = 0; i < columns_data.length; i++) {
|
|
var $block = null;
|
|
var $column = this.getColumn(i);
|
|
for (var j = 0; j < columns_data[i].blocks.length; j++) {
|
|
var block = columns_data[i].blocks[j];
|
|
$block = this.editorInstance.block_manager.createBlock(block.type, block.data, $block ? $block.$el : $column.children('.st-block-controls__top'));
|
|
}
|
|
}
|
|
},
|
|
|
|
performValidations: function () {
|
|
// nothing
|
|
}
|
|
});
|
|
});
|