2015-10-28 17:06:09 +00:00
|
|
|
(function(root, factory) {
|
|
|
|
// Set up Backform appropriately for the environment. Start with AMD.
|
|
|
|
if (typeof define === 'function' && define.amd) {
|
2016-09-26 09:04:49 +00:00
|
|
|
define([
|
2017-06-29 13:31:29 +00:00
|
|
|
'sources/gettext', 'underscore', 'jquery', 'backbone', 'backform', 'backgrid', 'alertify',
|
2017-07-18 14:13:16 +00:00
|
|
|
'moment', 'bignumber', 'bootstrap.datetimepicker', 'bootstrap.switch'
|
2016-09-26 09:04:49 +00:00
|
|
|
],
|
2017-06-29 13:31:29 +00:00
|
|
|
function(gettext, _, $, Backbone, Backform, Backgrid, Alertify, moment, BigNumber) {
|
2015-10-28 17:06:09 +00:00
|
|
|
// Export global even in AMD case in case this script is loaded with
|
|
|
|
// others that may still expect a global Backform.
|
2017-07-18 14:13:16 +00:00
|
|
|
return factory(root, gettext, _, $, Backbone, Backform, Backgrid, Alertify, moment, BigNumber);
|
2015-10-28 17:06:09 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
// Next for Node.js or CommonJS. jQuery may not be needed as a module.
|
|
|
|
} else if (typeof exports !== 'undefined') {
|
2017-07-18 14:13:16 +00:00
|
|
|
var gettext = require('sources/gettext'),
|
|
|
|
_ = require('underscore') || root._,
|
2015-10-28 17:06:09 +00:00
|
|
|
$ = root.jQuery || root.$ || root.Zepto || root.ender,
|
|
|
|
Backbone = require('backbone') || root.Backbone,
|
2017-07-18 14:13:16 +00:00
|
|
|
Backform = require('backform') || root.Backform,
|
|
|
|
Backgrid = require('backgrid') || root.Backgrid,
|
|
|
|
Alertify = require('alertify') || root.Alertify,
|
2016-09-22 14:27:59 +00:00
|
|
|
moment = require('moment') || root.moment;
|
2017-07-18 14:13:16 +00:00
|
|
|
factory(root, gettext, _, $, Backbone, Backform, Backgrid, Alertify, moment);
|
2015-10-28 17:06:09 +00:00
|
|
|
|
|
|
|
// Finally, as a browser global.
|
|
|
|
} else {
|
2017-07-18 14:13:16 +00:00
|
|
|
factory(root, root.gettext, root._, (root.jQuery || root.Zepto || root.ender || root.$), root.Backbone, root.Backform, root.Alertify, root.moment);
|
2015-10-28 17:06:09 +00:00
|
|
|
}
|
2017-07-18 14:13:16 +00:00
|
|
|
} (this, function(root, gettext, _, $, Backbone, Backform, Backgrid, Alertify, moment, BigNumber) {
|
2016-02-05 09:05:49 +00:00
|
|
|
/*
|
|
|
|
* Add mechanism in backgrid to render different types of cells in
|
|
|
|
* same column;
|
|
|
|
*/
|
|
|
|
|
|
|
|
// Add new property cellFunction in Backgrid.Column.
|
2017-07-18 14:13:16 +00:00
|
|
|
_.extend(Backgrid.Column.prototype.defaults, {cellFunction: undefined});
|
2016-02-05 09:05:49 +00:00
|
|
|
|
2016-08-19 09:54:13 +00:00
|
|
|
// Add tooltip to cell if cell content is larger than
|
|
|
|
// cell width
|
|
|
|
_.extend(Backgrid.Cell.prototype.events, {
|
|
|
|
'mouseover': function(e) {
|
|
|
|
var $el = $(this.el);
|
|
|
|
if($el.text().length > 0 && !$el.attr('title') &&
|
|
|
|
($el.innerWidth() + 1) < $el[0].scrollWidth
|
|
|
|
) {
|
|
|
|
$el.attr('title', $.trim($el.text()));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2017-01-09 10:25:38 +00:00
|
|
|
/* Overriding backgrid sort method.
|
|
|
|
* As we are getting numeric, integer values as string
|
|
|
|
* from server side, but on client side javascript truncates
|
|
|
|
* large numbers automatically due to which backgrid was unable
|
|
|
|
* to sort numeric values properly in the grid.
|
|
|
|
* To fix this issue, now we check if cell type is integer/number
|
|
|
|
* convert it into BigNumber object and make comparison to perform sorting.
|
|
|
|
*/
|
|
|
|
|
|
|
|
_.extend(Backgrid.Body.prototype, {
|
|
|
|
sort: function (column, direction) {
|
|
|
|
|
|
|
|
if (!_.contains(["ascending", "descending", null], direction)) {
|
|
|
|
throw new RangeError('direction must be one of "ascending", "descending" or `null`');
|
|
|
|
}
|
|
|
|
|
|
|
|
if (_.isString(column)) column = this.columns.findWhere({name: column});
|
|
|
|
|
|
|
|
var collection = this.collection;
|
|
|
|
|
|
|
|
var order;
|
|
|
|
if (direction === "ascending") order = -1;
|
|
|
|
else if (direction === "descending") order = 1;
|
|
|
|
else order = null;
|
|
|
|
|
|
|
|
// Get column type and pass it to comparator.
|
|
|
|
var col_type = column.get('cell').prototype.className || 'string-cell',
|
|
|
|
comparator = this.makeComparator(column.get("name"), order,
|
|
|
|
order ?
|
|
|
|
column.sortValue() :
|
|
|
|
function (model) {
|
|
|
|
return model.cid.replace('c', '') * 1;
|
|
|
|
}, col_type);
|
|
|
|
|
|
|
|
if (Backbone.PageableCollection &&
|
|
|
|
collection instanceof Backbone.PageableCollection) {
|
|
|
|
|
|
|
|
collection.setSorting(order && column.get("name"), order,
|
|
|
|
{sortValue: column.sortValue()});
|
|
|
|
|
|
|
|
if (collection.fullCollection) {
|
|
|
|
// If order is null, pageable will remove the comparator on both sides,
|
|
|
|
// in this case the default insertion order comparator needs to be
|
|
|
|
// attached to get back to the order before sorting.
|
|
|
|
if (collection.fullCollection.comparator == null) {
|
|
|
|
collection.fullCollection.comparator = comparator;
|
|
|
|
}
|
|
|
|
collection.fullCollection.sort();
|
|
|
|
collection.trigger("backgrid:sorted", column, direction, collection);
|
|
|
|
}
|
|
|
|
else collection.fetch({reset: true, success: function () {
|
|
|
|
collection.trigger("backgrid:sorted", column, direction, collection);
|
|
|
|
}});
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
collection.comparator = comparator;
|
|
|
|
collection.sort();
|
|
|
|
collection.trigger("backgrid:sorted", column, direction, collection);
|
|
|
|
}
|
|
|
|
|
|
|
|
column.set("direction", direction);
|
|
|
|
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
makeComparator: function (attr, order, func, type) {
|
|
|
|
|
|
|
|
return function (left, right) {
|
|
|
|
// extract the values from the models
|
|
|
|
|
|
|
|
var l = func(left, attr), r = func(right, attr), t;
|
|
|
|
|
|
|
|
var types = ['number-cell', 'integer-cell'];
|
|
|
|
if (_.include(types, type)) {
|
|
|
|
var _l, _r;
|
|
|
|
// NaN if invalid number
|
|
|
|
try {
|
|
|
|
_l = new BigNumber(l);
|
|
|
|
} catch(err) {
|
|
|
|
_l = NaN;
|
|
|
|
}
|
|
|
|
|
|
|
|
try {
|
|
|
|
_r = new BigNumber(r);
|
|
|
|
} catch(err) {
|
|
|
|
_r = NaN;
|
|
|
|
}
|
|
|
|
|
|
|
|
// if descending order, swap left and right
|
|
|
|
if (order === 1) t = _l, _l = _r, _r = t;
|
|
|
|
|
|
|
|
if (_l.eq(_r)) // If both are equals
|
|
|
|
return 0;
|
|
|
|
else if (_l.lt(_r)) // If left is less than right
|
|
|
|
return -1;
|
|
|
|
else
|
|
|
|
return 1;
|
|
|
|
}
|
2017-03-28 13:19:24 +00:00
|
|
|
else {
|
|
|
|
// if descending order, swap left and right
|
|
|
|
if (order === 1) t = l, l = r, r = t;
|
|
|
|
|
|
|
|
// compare as usual
|
|
|
|
if (l === r) return 0;
|
|
|
|
else if (l < r) return -1;
|
|
|
|
return 1;
|
|
|
|
}
|
2017-01-09 10:25:38 +00:00
|
|
|
};
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2016-02-05 09:05:49 +00:00
|
|
|
_.extend(Backgrid.Row.prototype, {
|
|
|
|
makeCell: function (column) {
|
|
|
|
return new (this.getCell(column))({
|
|
|
|
column: column,
|
|
|
|
model: this.model
|
|
|
|
});
|
|
|
|
},
|
|
|
|
/*
|
|
|
|
* getCell function will check and execute user given cellFunction to get
|
|
|
|
* appropriate cell class for current cell being rendered.
|
|
|
|
* User provided cellFunction must return valid cell class.
|
|
|
|
* cellFunction will be called with context (this) as column and model as
|
|
|
|
* argument.
|
|
|
|
*/
|
|
|
|
getCell: function (column) {
|
|
|
|
var cf = column.get("cellFunction");
|
|
|
|
if (_.isFunction(cf)){
|
|
|
|
var cell = cf.apply(column, [this.model]);
|
|
|
|
try {
|
|
|
|
return Backgrid.resolveNameToClass(cell, "Cell");
|
|
|
|
} catch (e) {
|
|
|
|
if (e instanceof ReferenceError) {
|
|
|
|
// Fallback to column cell.
|
|
|
|
return column.get("cell");
|
|
|
|
} else {
|
|
|
|
throw e; // Let other exceptions bubble up
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
return column.get("cell");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2015-10-28 17:06:09 +00:00
|
|
|
var ObjectCellEditor = Backgrid.Extension.ObjectCellEditor = Backgrid.CellEditor.extend({
|
|
|
|
modalTemplate: _.template([
|
2015-10-29 20:32:40 +00:00
|
|
|
'<div class="subnode-dialog" tabindex="1">',
|
2015-10-28 17:06:09 +00:00
|
|
|
' <div class="subnode-body"></div>',
|
|
|
|
'</div>'
|
|
|
|
].join("\n")),
|
|
|
|
stringTemplate: _.template([
|
|
|
|
'<div class="form-group">',
|
|
|
|
' <label class="control-label col-sm-4"><%=label%></label>',
|
|
|
|
' <div class="col-sm-8">',
|
|
|
|
' <input type="text" class="form-control" name="<%=name%>" value="<%=value%>" placeholder="<%=placeholder%>" />',
|
|
|
|
' </div>',
|
|
|
|
'</div>'
|
|
|
|
].join("\n")),
|
|
|
|
extendWithOptions: function(options) {
|
|
|
|
_.extend(this, options);
|
|
|
|
},
|
|
|
|
render: function () {
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
postRender: function(model, column) {
|
|
|
|
var editor = this,
|
2017-07-18 14:13:16 +00:00
|
|
|
el = this.el,
|
2015-10-28 17:06:09 +00:00
|
|
|
columns_length = this.columns_length;
|
|
|
|
|
|
|
|
if (column != null && column.get("name") != this.column.get("name"))
|
|
|
|
return false;
|
|
|
|
|
|
|
|
if (!_.isArray(this.schema)) throw new TypeError("schema must be an array");
|
|
|
|
|
|
|
|
// Create a Backbone model from our object if it does not exist
|
|
|
|
var $dialog = this.createDialog(columns_length);
|
|
|
|
|
|
|
|
// Add the Bootstrap form
|
|
|
|
var $form = $('<form class="form-dialog"></form>');
|
|
|
|
$dialog.find('div.subnode-body').append($form);
|
|
|
|
|
|
|
|
// Call Backform to prepare dialog
|
2017-07-18 14:13:16 +00:00
|
|
|
var back_el = $dialog.find('form.form-dialog');
|
2015-10-28 17:06:09 +00:00
|
|
|
|
2015-10-29 20:32:40 +00:00
|
|
|
this.objectView = new Backform.Dialog({
|
2015-10-28 17:06:09 +00:00
|
|
|
el: back_el, model: this.model, schema: this.schema,
|
2015-10-29 20:32:40 +00:00
|
|
|
tabPanelClassName: function() {
|
|
|
|
return 'sub-node-form col-sm-12';
|
|
|
|
}
|
2015-10-28 17:06:09 +00:00
|
|
|
});
|
|
|
|
|
2015-10-29 20:32:40 +00:00
|
|
|
this.objectView.render();
|
2015-10-28 17:06:09 +00:00
|
|
|
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
createDialog: function(noofcol) {
|
2015-10-29 20:32:40 +00:00
|
|
|
var $dialog = this.$dialog = $(this.modalTemplate({title: ""})),
|
2015-10-28 17:06:09 +00:00
|
|
|
tr = $("<tr>"),
|
2015-10-29 20:32:40 +00:00
|
|
|
noofcol = noofcol || 1,
|
2015-10-28 17:06:09 +00:00
|
|
|
td = $("<td>", {class: 'editable sortable renderable', style: 'height: auto', colspan: noofcol+2}).appendTo(tr);
|
|
|
|
|
2015-10-29 20:32:40 +00:00
|
|
|
this.tr = tr;
|
2015-10-28 17:06:09 +00:00
|
|
|
|
|
|
|
// Show the Bootstrap modal dialog
|
|
|
|
td.append($dialog.css('display', 'block'));
|
|
|
|
this.el.parent('tr').after(tr);
|
|
|
|
|
|
|
|
return $dialog;
|
|
|
|
},
|
2015-10-29 20:32:40 +00:00
|
|
|
save: function() {
|
2015-10-28 17:06:09 +00:00
|
|
|
// Retrieve values from the form, and store inside the object model
|
2015-10-29 20:32:40 +00:00
|
|
|
this.model.trigger("backgrid:edited", this.model, this.column, new Backgrid.Command({keyCode:13}));
|
|
|
|
if (this.tr) {
|
|
|
|
this.tr.remove();
|
|
|
|
}
|
2015-10-28 17:06:09 +00:00
|
|
|
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
remove: function() {
|
2016-05-12 10:17:12 +00:00
|
|
|
this.objectView.remove();
|
2015-10-28 17:06:09 +00:00
|
|
|
Backgrid.CellEditor.prototype.remove.apply(this, arguments);
|
2015-10-29 20:32:40 +00:00
|
|
|
if (this.tr) {
|
|
|
|
this.tr.remove();
|
|
|
|
}
|
2015-10-28 17:06:09 +00:00
|
|
|
return this;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
var PGSelectCell = Backgrid.Extension.PGSelectCell = Backgrid.SelectCell.extend({
|
|
|
|
// It's possible to render an option group or use a
|
|
|
|
// function to provide option values too.
|
|
|
|
optionValues: function() {
|
2017-07-18 14:13:16 +00:00
|
|
|
var res = [],
|
2015-10-28 17:06:09 +00:00
|
|
|
opts = _.result(this.column.attributes, 'options');
|
|
|
|
_.each(opts, function(o) {
|
|
|
|
res.push([o.label, o.value]);
|
|
|
|
});
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
var ObjectCell = Backgrid.Extension.ObjectCell = Backgrid.Cell.extend({
|
|
|
|
editorOptionDefaults: {
|
|
|
|
schema: []
|
|
|
|
},
|
|
|
|
className: "edit-cell",
|
|
|
|
editor: ObjectCellEditor,
|
|
|
|
initialize: function(options) {
|
|
|
|
Backgrid.Cell.prototype.initialize.apply(this, arguments);
|
|
|
|
|
|
|
|
// Pass on cell options to the editor
|
|
|
|
var cell = this,
|
|
|
|
editorOptions = {};
|
|
|
|
_.each(this.editorOptionDefaults, function(def, opt) {
|
|
|
|
if (!cell[opt]) cell[opt] = def;
|
|
|
|
if (options && options[opt]) cell[opt] = options[opt];
|
|
|
|
editorOptions[opt] = cell[opt];
|
|
|
|
});
|
|
|
|
|
|
|
|
editorOptions['el'] = $(this.el);
|
2015-10-29 20:32:40 +00:00
|
|
|
editorOptions['columns_length'] = this.column.collection.length;
|
2015-10-30 07:37:09 +00:00
|
|
|
editorOptions['el'].attr('tabindex' , 1);
|
2015-10-28 17:06:09 +00:00
|
|
|
|
|
|
|
this.listenTo(this.model, "backgrid:edit", function (model, column, cell, editor) {
|
|
|
|
if (column.get("name") == this.column.get("name"))
|
|
|
|
editor.extendWithOptions(editorOptions);
|
|
|
|
});
|
|
|
|
},
|
|
|
|
enterEditMode: function () {
|
2016-03-22 17:04:46 +00:00
|
|
|
// Notify that we are about to enter in edit mode for current cell.
|
Improvised Select2Cell, and SwitchCell.
Removed the use of separate editor for both of these cell types. There
were two instance of select2 were getting created in the Select2Cell,
one in the Select2Cell itself, and another in Select2CellEditor. And,
loosing the focus mysteriously, and making the scrollbar in the property
dialog non-responsive.
Also, modified the NodeAjaxOptionsCell to use the above logic, and
removed its own version of render function to make it consitent across
the system.
This patch [changes sent by Murtuza] also includes improvisation in the
DeleteCell, and ObjectCell, which will honour now 'canRemoveRow', and
''canEditRow' respective properties of Column.
2016-04-12 11:20:43 +00:00
|
|
|
// We will check if this row is editable first
|
|
|
|
var canEditRow = (!_.isUndefined(this.column.get('canEditRow')) &&
|
|
|
|
_.isFunction(this.column.get('canEditRow'))) ?
|
|
|
|
Backgrid.callByNeed(this.column.get('canEditRow'),
|
|
|
|
this.column, this.model) : true;
|
|
|
|
if (canEditRow) {
|
|
|
|
// Notify that we are about to enter in edit mode for current cell.
|
|
|
|
this.model.trigger("enteringEditMode", [this]);
|
|
|
|
|
|
|
|
Backgrid.Cell.prototype.enterEditMode.apply(this, arguments);
|
|
|
|
/* Make sure - we listen to the click event */
|
|
|
|
this.delegateEvents();
|
|
|
|
var editable = Backgrid.callByNeed(this.column.editable(), this.column, this.model);
|
|
|
|
|
|
|
|
if (editable) {
|
|
|
|
this.$el.html(
|
|
|
|
"<i class='fa fa-pencil-square subnode-edit-in-process'></i>"
|
|
|
|
);
|
|
|
|
this.model.trigger(
|
|
|
|
"pg-sub-node:opened", this.model, this
|
|
|
|
);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
Alertify.alert("This object is not editable by user",
|
|
|
|
function(){
|
|
|
|
return true;
|
|
|
|
});
|
2015-10-29 20:32:40 +00:00
|
|
|
}
|
2015-10-28 17:06:09 +00:00
|
|
|
},
|
|
|
|
render: function(){
|
|
|
|
this.$el.empty();
|
|
|
|
this.$el.html("<i class='fa fa-pencil-square-o'></i>");
|
|
|
|
this.delegateEvents();
|
2015-10-30 07:37:09 +00:00
|
|
|
if (this.grabFocus)
|
|
|
|
this.$el.focus();
|
2015-10-28 17:06:09 +00:00
|
|
|
return this;
|
2015-10-29 20:32:40 +00:00
|
|
|
},
|
|
|
|
exitEditMode: function() {
|
|
|
|
var index = $(this.currentEditor.objectView.el)
|
|
|
|
.find('.nav-tabs > .active > a[data-toggle="tab"]').first()
|
|
|
|
.data('tabIndex');
|
|
|
|
Backgrid.Cell.prototype.exitEditMode.apply(this, arguments);
|
|
|
|
this.model.trigger(
|
|
|
|
"pg-sub-node:closed", this, index
|
|
|
|
);
|
2015-10-30 07:37:09 +00:00
|
|
|
this.grabFocus = true;
|
2015-10-29 20:32:40 +00:00
|
|
|
},
|
|
|
|
events: {
|
|
|
|
'click': function(e) {
|
|
|
|
if (this.$el.find('i').first().hasClass('subnode-edit-in-process')) {
|
|
|
|
// Need to redundantly undelegate events for Firefox
|
|
|
|
this.undelegateEvents();
|
|
|
|
this.currentEditor.save();
|
|
|
|
} else {
|
|
|
|
this.enterEditMode.call(this, []);
|
|
|
|
}
|
|
|
|
e.preventDefault();
|
|
|
|
}
|
2015-10-28 17:06:09 +00:00
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
var DeleteCell = Backgrid.Extension.DeleteCell = Backgrid.Cell.extend({
|
2016-08-01 14:18:57 +00:00
|
|
|
defaults: _.defaults({
|
2017-06-29 13:31:29 +00:00
|
|
|
defaultDeleteMsg: gettext('Are you sure you wish to delete this row?'),
|
|
|
|
defaultDeleteTitle: gettext('Delete Row')
|
2016-08-01 14:18:57 +00:00
|
|
|
}, Backgrid.Cell.prototype.defaults),
|
|
|
|
|
2015-10-28 17:06:09 +00:00
|
|
|
/** @property */
|
|
|
|
className: "delete-cell",
|
|
|
|
events: {
|
|
|
|
"click": "deleteRow"
|
|
|
|
},
|
|
|
|
deleteRow: function (e) {
|
|
|
|
e.preventDefault();
|
2017-07-18 14:13:16 +00:00
|
|
|
var that = this;
|
Improvised Select2Cell, and SwitchCell.
Removed the use of separate editor for both of these cell types. There
were two instance of select2 were getting created in the Select2Cell,
one in the Select2Cell itself, and another in Select2CellEditor. And,
loosing the focus mysteriously, and making the scrollbar in the property
dialog non-responsive.
Also, modified the NodeAjaxOptionsCell to use the above logic, and
removed its own version of render function to make it consitent across
the system.
This patch [changes sent by Murtuza] also includes improvisation in the
DeleteCell, and ObjectCell, which will honour now 'canRemoveRow', and
''canEditRow' respective properties of Column.
2016-04-12 11:20:43 +00:00
|
|
|
// We will check if row is deletable or not
|
|
|
|
var canDeleteRow = (!_.isUndefined(this.column.get('canDeleteRow')) &&
|
|
|
|
_.isFunction(this.column.get('canDeleteRow')) ) ?
|
|
|
|
Backgrid.callByNeed(this.column.get('canDeleteRow'),
|
|
|
|
this.column, this.model) : true;
|
|
|
|
if (canDeleteRow) {
|
2016-08-01 14:18:57 +00:00
|
|
|
var delete_msg = !_.isUndefined(this.column.get('customDeleteMsg')) ?
|
|
|
|
this.column.get('customDeleteMsg'): that.defaults.defaultDeleteMsg;
|
2017-06-29 13:31:29 +00:00
|
|
|
var delete_title = !_.isUndefined(this.column.get('customDeleteTitle')) ?
|
|
|
|
this.column.get('customDeleteTitle'): that.defaults.defaultDeleteTitle;
|
Improvised Select2Cell, and SwitchCell.
Removed the use of separate editor for both of these cell types. There
were two instance of select2 were getting created in the Select2Cell,
one in the Select2Cell itself, and another in Select2CellEditor. And,
loosing the focus mysteriously, and making the scrollbar in the property
dialog non-responsive.
Also, modified the NodeAjaxOptionsCell to use the above logic, and
removed its own version of render function to make it consitent across
the system.
This patch [changes sent by Murtuza] also includes improvisation in the
DeleteCell, and ObjectCell, which will honour now 'canRemoveRow', and
''canEditRow' respective properties of Column.
2016-04-12 11:20:43 +00:00
|
|
|
Alertify.confirm(
|
2017-06-29 13:31:29 +00:00
|
|
|
delete_title,
|
2016-08-01 14:18:57 +00:00
|
|
|
delete_msg,
|
2015-10-28 17:06:09 +00:00
|
|
|
function(evt) {
|
|
|
|
that.model.collection.remove(that.model);
|
|
|
|
},
|
|
|
|
function(evt) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
);
|
Improvised Select2Cell, and SwitchCell.
Removed the use of separate editor for both of these cell types. There
were two instance of select2 were getting created in the Select2Cell,
one in the Select2Cell itself, and another in Select2CellEditor. And,
loosing the focus mysteriously, and making the scrollbar in the property
dialog non-responsive.
Also, modified the NodeAjaxOptionsCell to use the above logic, and
removed its own version of render function to make it consitent across
the system.
This patch [changes sent by Murtuza] also includes improvisation in the
DeleteCell, and ObjectCell, which will honour now 'canRemoveRow', and
''canEditRow' respective properties of Column.
2016-04-12 11:20:43 +00:00
|
|
|
} else {
|
2017-04-05 12:38:14 +00:00
|
|
|
Alertify.alert("This object cannot be deleted",
|
Improvised Select2Cell, and SwitchCell.
Removed the use of separate editor for both of these cell types. There
were two instance of select2 were getting created in the Select2Cell,
one in the Select2Cell itself, and another in Select2CellEditor. And,
loosing the focus mysteriously, and making the scrollbar in the property
dialog non-responsive.
Also, modified the NodeAjaxOptionsCell to use the above logic, and
removed its own version of render function to make it consitent across
the system.
This patch [changes sent by Murtuza] also includes improvisation in the
DeleteCell, and ObjectCell, which will honour now 'canRemoveRow', and
''canEditRow' respective properties of Column.
2016-04-12 11:20:43 +00:00
|
|
|
function(){
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
);
|
|
|
|
}
|
2015-10-28 17:06:09 +00:00
|
|
|
},
|
|
|
|
initialize: function () {
|
|
|
|
Backgrid.Cell.prototype.initialize.apply(this, arguments);
|
|
|
|
},
|
|
|
|
render: function () {
|
|
|
|
this.$el.empty();
|
|
|
|
this.$el.html("<i class='fa fa-trash'></i>");
|
|
|
|
this.delegateEvents();
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2015-12-04 10:19:08 +00:00
|
|
|
var CustomHeaderCell = Backgrid.Extension.CustomHeaderCell = Backgrid.HeaderCell.extend({
|
2015-12-17 13:48:42 +00:00
|
|
|
initialize: function () {
|
|
|
|
// Here, we will add custom classes to header cell
|
|
|
|
Backgrid.HeaderCell.prototype.initialize.apply(this, arguments);
|
|
|
|
var getClassName = this.column.get('cellHeaderClasses');
|
|
|
|
if (getClassName) {
|
|
|
|
this.$el.addClass(getClassName);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
/**
|
|
|
|
SwitchCell renders a Bootstrap Switch in backgrid cell
|
|
|
|
*/
|
2017-07-18 14:13:16 +00:00
|
|
|
$.fn.bootstrapSwitch = jQuery.fn.bootstrapSwitch;
|
2015-12-17 13:48:42 +00:00
|
|
|
var SwitchCell = Backgrid.Extension.SwitchCell = Backgrid.BooleanCell.extend({
|
|
|
|
defaults: {
|
|
|
|
options: _.defaults({
|
|
|
|
onText: 'True',
|
|
|
|
offText: 'False',
|
|
|
|
onColor: 'success',
|
|
|
|
offColor: 'default',
|
|
|
|
size: 'mini'
|
|
|
|
}, $.fn.bootstrapSwitch.defaults)
|
|
|
|
},
|
Improvised Select2Cell, and SwitchCell.
Removed the use of separate editor for both of these cell types. There
were two instance of select2 were getting created in the Select2Cell,
one in the Select2Cell itself, and another in Select2CellEditor. And,
loosing the focus mysteriously, and making the scrollbar in the property
dialog non-responsive.
Also, modified the NodeAjaxOptionsCell to use the above logic, and
removed its own version of render function to make it consitent across
the system.
This patch [changes sent by Murtuza] also includes improvisation in the
DeleteCell, and ObjectCell, which will honour now 'canRemoveRow', and
''canEditRow' respective properties of Column.
2016-04-12 11:20:43 +00:00
|
|
|
|
2015-12-17 13:48:42 +00:00
|
|
|
className: 'switch-cell',
|
Improvised Select2Cell, and SwitchCell.
Removed the use of separate editor for both of these cell types. There
were two instance of select2 were getting created in the Select2Cell,
one in the Select2Cell itself, and another in Select2CellEditor. And,
loosing the focus mysteriously, and making the scrollbar in the property
dialog non-responsive.
Also, modified the NodeAjaxOptionsCell to use the above logic, and
removed its own version of render function to make it consitent across
the system.
This patch [changes sent by Murtuza] also includes improvisation in the
DeleteCell, and ObjectCell, which will honour now 'canRemoveRow', and
''canEditRow' respective properties of Column.
2016-04-12 11:20:43 +00:00
|
|
|
|
|
|
|
initialize: function() {
|
|
|
|
Backgrid.BooleanCell.prototype.initialize.apply(this, arguments);
|
|
|
|
this.onChange = this.onChange.bind(this);
|
|
|
|
},
|
|
|
|
|
|
|
|
enterEditMode: function() {
|
|
|
|
this.$el.addClass('editor');
|
2017-01-08 04:00:09 +00:00
|
|
|
$(this.$el.find('input')).focus();
|
Improvised Select2Cell, and SwitchCell.
Removed the use of separate editor for both of these cell types. There
were two instance of select2 were getting created in the Select2Cell,
one in the Select2Cell itself, and another in Select2CellEditor. And,
loosing the focus mysteriously, and making the scrollbar in the property
dialog non-responsive.
Also, modified the NodeAjaxOptionsCell to use the above logic, and
removed its own version of render function to make it consitent across
the system.
This patch [changes sent by Murtuza] also includes improvisation in the
DeleteCell, and ObjectCell, which will honour now 'canRemoveRow', and
''canEditRow' respective properties of Column.
2016-04-12 11:20:43 +00:00
|
|
|
},
|
|
|
|
|
|
|
|
exitEditMode: function() {
|
|
|
|
this.$el.removeClass('editor');
|
|
|
|
},
|
|
|
|
|
2015-12-17 13:48:42 +00:00
|
|
|
events: {
|
|
|
|
'switchChange.bootstrapSwitch': 'onChange'
|
|
|
|
},
|
Improvised Select2Cell, and SwitchCell.
Removed the use of separate editor for both of these cell types. There
were two instance of select2 were getting created in the Select2Cell,
one in the Select2Cell itself, and another in Select2CellEditor. And,
loosing the focus mysteriously, and making the scrollbar in the property
dialog non-responsive.
Also, modified the NodeAjaxOptionsCell to use the above logic, and
removed its own version of render function to make it consitent across
the system.
This patch [changes sent by Murtuza] also includes improvisation in the
DeleteCell, and ObjectCell, which will honour now 'canRemoveRow', and
''canEditRow' respective properties of Column.
2016-04-12 11:20:43 +00:00
|
|
|
|
2015-12-17 13:48:42 +00:00
|
|
|
onChange: function () {
|
|
|
|
var model = this.model,
|
|
|
|
column = this.column,
|
|
|
|
val = this.formatter.toRaw(this.$input.prop('checked'), model);
|
|
|
|
|
|
|
|
// on bootstrap change we also need to change model's value
|
|
|
|
model.set(column.get("name"), val);
|
|
|
|
},
|
Improvised Select2Cell, and SwitchCell.
Removed the use of separate editor for both of these cell types. There
were two instance of select2 were getting created in the Select2Cell,
one in the Select2Cell itself, and another in Select2CellEditor. And,
loosing the focus mysteriously, and making the scrollbar in the property
dialog non-responsive.
Also, modified the NodeAjaxOptionsCell to use the above logic, and
removed its own version of render function to make it consitent across
the system.
This patch [changes sent by Murtuza] also includes improvisation in the
DeleteCell, and ObjectCell, which will honour now 'canRemoveRow', and
''canEditRow' respective properties of Column.
2016-04-12 11:20:43 +00:00
|
|
|
|
2015-12-17 13:48:42 +00:00
|
|
|
render: function () {
|
2017-01-08 04:00:09 +00:00
|
|
|
var self = this, col = _.defaults(this.column.toJSON(), this.defaults),
|
2015-12-17 13:48:42 +00:00
|
|
|
attributes = this.model.toJSON(),
|
|
|
|
attrArr = col.name.split('.'),
|
|
|
|
name = attrArr.shift(),
|
|
|
|
path = attrArr.join('.'),
|
|
|
|
model = this.model, column = this.column,
|
2016-04-04 10:06:28 +00:00
|
|
|
rawValue = this.formatter.fromRaw(
|
|
|
|
model.get(column.get("name")), model
|
|
|
|
),
|
2015-12-17 13:48:42 +00:00
|
|
|
editable = Backgrid.callByNeed(col.editable, column, model);
|
|
|
|
|
Improvised Select2Cell, and SwitchCell.
Removed the use of separate editor for both of these cell types. There
were two instance of select2 were getting created in the Select2Cell,
one in the Select2Cell itself, and another in Select2CellEditor. And,
loosing the focus mysteriously, and making the scrollbar in the property
dialog non-responsive.
Also, modified the NodeAjaxOptionsCell to use the above logic, and
removed its own version of render function to make it consitent across
the system.
This patch [changes sent by Murtuza] also includes improvisation in the
DeleteCell, and ObjectCell, which will honour now 'canRemoveRow', and
''canEditRow' respective properties of Column.
2016-04-12 11:20:43 +00:00
|
|
|
this.undelegateEvents();
|
|
|
|
|
2015-12-17 13:48:42 +00:00
|
|
|
this.$el.empty();
|
Improvised Select2Cell, and SwitchCell.
Removed the use of separate editor for both of these cell types. There
were two instance of select2 were getting created in the Select2Cell,
one in the Select2Cell itself, and another in Select2CellEditor. And,
loosing the focus mysteriously, and making the scrollbar in the property
dialog non-responsive.
Also, modified the NodeAjaxOptionsCell to use the above logic, and
removed its own version of render function to make it consitent across
the system.
This patch [changes sent by Murtuza] also includes improvisation in the
DeleteCell, and ObjectCell, which will honour now 'canRemoveRow', and
''canEditRow' respective properties of Column.
2016-04-12 11:20:43 +00:00
|
|
|
|
2015-12-17 13:48:42 +00:00
|
|
|
this.$el.append(
|
|
|
|
$("<input>", {
|
|
|
|
tabIndex: -1,
|
|
|
|
type: "checkbox"
|
|
|
|
}).prop('checked', rawValue).prop('disabled', !editable));
|
|
|
|
this.$input = this.$el.find('input[type=checkbox]').first();
|
|
|
|
|
|
|
|
// Override BooleanCell checkbox with Bootstrapswitch
|
|
|
|
this.$input.bootstrapSwitch(
|
|
|
|
_.defaults(
|
2016-04-04 10:06:28 +00:00
|
|
|
{'state': rawValue, 'disabled': !editable}, col.options,
|
|
|
|
this.defaults.options
|
2015-12-17 13:48:42 +00:00
|
|
|
));
|
|
|
|
|
2017-01-08 04:00:09 +00:00
|
|
|
// Listen for Tab key
|
|
|
|
this.$el.on('keydown', function(e) {
|
|
|
|
var gotoCell;
|
|
|
|
if(e.keyCode == 9) {
|
|
|
|
// go to Next Cell & if Shift is also pressed go to Previous Cell
|
|
|
|
gotoCell = e.shiftKey ? self.$el.prev() : self.$el.next();
|
|
|
|
}
|
|
|
|
|
|
|
|
if(gotoCell) {
|
|
|
|
setTimeout(function() {
|
|
|
|
if(gotoCell.hasClass('editable')) {
|
|
|
|
e.preventDefault();
|
|
|
|
e.stopPropagation();
|
|
|
|
var command = new Backgrid.Command({
|
|
|
|
key: "Tab", keyCode: 9,
|
|
|
|
which: 9, shiftKey: e.shiftKey
|
|
|
|
});
|
|
|
|
self.model.trigger("backgrid:edited", self.model,
|
|
|
|
self.column, command);
|
|
|
|
gotoCell.focus();
|
|
|
|
}
|
|
|
|
}, 20);
|
|
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
|
2015-12-17 13:48:42 +00:00
|
|
|
this.delegateEvents();
|
|
|
|
|
|
|
|
return this;
|
2015-12-04 10:19:08 +00:00
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2016-01-07 03:05:08 +00:00
|
|
|
/*
|
|
|
|
* Select2Cell for backgrid.
|
|
|
|
*/
|
2016-04-04 10:06:28 +00:00
|
|
|
var Select2Cell = Backgrid.Extension.Select2Cell =
|
|
|
|
Backgrid.SelectCell.extend({
|
2016-01-07 03:05:08 +00:00
|
|
|
className: "select2-cell",
|
Improvised Select2Cell, and SwitchCell.
Removed the use of separate editor for both of these cell types. There
were two instance of select2 were getting created in the Select2Cell,
one in the Select2Cell itself, and another in Select2CellEditor. And,
loosing the focus mysteriously, and making the scrollbar in the property
dialog non-responsive.
Also, modified the NodeAjaxOptionsCell to use the above logic, and
removed its own version of render function to make it consitent across
the system.
This patch [changes sent by Murtuza] also includes improvisation in the
DeleteCell, and ObjectCell, which will honour now 'canRemoveRow', and
''canEditRow' respective properties of Column.
2016-04-12 11:20:43 +00:00
|
|
|
|
2016-04-04 10:06:28 +00:00
|
|
|
/** @property */
|
Improvised Select2Cell, and SwitchCell.
Removed the use of separate editor for both of these cell types. There
were two instance of select2 were getting created in the Select2Cell,
one in the Select2Cell itself, and another in Select2CellEditor. And,
loosing the focus mysteriously, and making the scrollbar in the property
dialog non-responsive.
Also, modified the NodeAjaxOptionsCell to use the above logic, and
removed its own version of render function to make it consitent across
the system.
This patch [changes sent by Murtuza] also includes improvisation in the
DeleteCell, and ObjectCell, which will honour now 'canRemoveRow', and
''canEditRow' respective properties of Column.
2016-04-12 11:20:43 +00:00
|
|
|
editor: null,
|
|
|
|
|
2016-01-07 08:00:41 +00:00
|
|
|
defaults: _.defaults({
|
Improvised Select2Cell, and SwitchCell.
Removed the use of separate editor for both of these cell types. There
were two instance of select2 were getting created in the Select2Cell,
one in the Select2Cell itself, and another in Select2CellEditor. And,
loosing the focus mysteriously, and making the scrollbar in the property
dialog non-responsive.
Also, modified the NodeAjaxOptionsCell to use the above logic, and
removed its own version of render function to make it consitent across
the system.
This patch [changes sent by Murtuza] also includes improvisation in the
DeleteCell, and ObjectCell, which will honour now 'canRemoveRow', and
''canEditRow' respective properties of Column.
2016-04-12 11:20:43 +00:00
|
|
|
select2: {},
|
|
|
|
opt: {
|
2016-04-15 05:31:11 +00:00
|
|
|
label: null,
|
Improvised Select2Cell, and SwitchCell.
Removed the use of separate editor for both of these cell types. There
were two instance of select2 were getting created in the Select2Cell,
one in the Select2Cell itself, and another in Select2CellEditor. And,
loosing the focus mysteriously, and making the scrollbar in the property
dialog non-responsive.
Also, modified the NodeAjaxOptionsCell to use the above logic, and
removed its own version of render function to make it consitent across
the system.
This patch [changes sent by Murtuza] also includes improvisation in the
DeleteCell, and ObjectCell, which will honour now 'canRemoveRow', and
''canEditRow' respective properties of Column.
2016-04-12 11:20:43 +00:00
|
|
|
value: null,
|
|
|
|
selected: false
|
|
|
|
}
|
2016-04-04 10:06:28 +00:00
|
|
|
}, Backgrid.SelectCell.prototype.defaults),
|
Improvised Select2Cell, and SwitchCell.
Removed the use of separate editor for both of these cell types. There
were two instance of select2 were getting created in the Select2Cell,
one in the Select2Cell itself, and another in Select2CellEditor. And,
loosing the focus mysteriously, and making the scrollbar in the property
dialog non-responsive.
Also, modified the NodeAjaxOptionsCell to use the above logic, and
removed its own version of render function to make it consitent across
the system.
This patch [changes sent by Murtuza] also includes improvisation in the
DeleteCell, and ObjectCell, which will honour now 'canRemoveRow', and
''canEditRow' respective properties of Column.
2016-04-12 11:20:43 +00:00
|
|
|
|
|
|
|
enterEditMode: function() {
|
2016-04-15 05:31:11 +00:00
|
|
|
if (!this.$el.hasClass('editor'))
|
|
|
|
this.$el.addClass('editor');
|
Improvised Select2Cell, and SwitchCell.
Removed the use of separate editor for both of these cell types. There
were two instance of select2 were getting created in the Select2Cell,
one in the Select2Cell itself, and another in Select2CellEditor. And,
loosing the focus mysteriously, and making the scrollbar in the property
dialog non-responsive.
Also, modified the NodeAjaxOptionsCell to use the above logic, and
removed its own version of render function to make it consitent across
the system.
This patch [changes sent by Murtuza] also includes improvisation in the
DeleteCell, and ObjectCell, which will honour now 'canRemoveRow', and
''canEditRow' respective properties of Column.
2016-04-12 11:20:43 +00:00
|
|
|
this.$select.select2('focus');
|
2016-07-15 09:12:23 +00:00
|
|
|
this.$select.select2('open');
|
Improvised Select2Cell, and SwitchCell.
Removed the use of separate editor for both of these cell types. There
were two instance of select2 were getting created in the Select2Cell,
one in the Select2Cell itself, and another in Select2CellEditor. And,
loosing the focus mysteriously, and making the scrollbar in the property
dialog non-responsive.
Also, modified the NodeAjaxOptionsCell to use the above logic, and
removed its own version of render function to make it consitent across
the system.
This patch [changes sent by Murtuza] also includes improvisation in the
DeleteCell, and ObjectCell, which will honour now 'canRemoveRow', and
''canEditRow' respective properties of Column.
2016-04-12 11:20:43 +00:00
|
|
|
this.$select.on('blur', this.exitEditMode);
|
|
|
|
},
|
|
|
|
|
|
|
|
exitEditMode: function() {
|
|
|
|
this.$select.off('blur', this.exitEditMode);
|
2016-07-15 09:12:23 +00:00
|
|
|
this.$select.select2('close');
|
Improvised Select2Cell, and SwitchCell.
Removed the use of separate editor for both of these cell types. There
were two instance of select2 were getting created in the Select2Cell,
one in the Select2Cell itself, and another in Select2CellEditor. And,
loosing the focus mysteriously, and making the scrollbar in the property
dialog non-responsive.
Also, modified the NodeAjaxOptionsCell to use the above logic, and
removed its own version of render function to make it consitent across
the system.
This patch [changes sent by Murtuza] also includes improvisation in the
DeleteCell, and ObjectCell, which will honour now 'canRemoveRow', and
''canEditRow' respective properties of Column.
2016-04-12 11:20:43 +00:00
|
|
|
this.$el.removeClass('editor');
|
|
|
|
},
|
|
|
|
|
2016-01-07 03:05:08 +00:00
|
|
|
events: {
|
2016-04-15 05:31:11 +00:00
|
|
|
"select2:open": "enterEditMode",
|
|
|
|
"select2:close": "exitEditMode",
|
2016-01-07 03:05:08 +00:00
|
|
|
"change": "onSave",
|
|
|
|
"select2:unselect": "onSave"
|
|
|
|
},
|
2016-04-04 10:06:28 +00:00
|
|
|
/** @property {function(Object, ?Object=): string} template */
|
|
|
|
template: _.template([
|
|
|
|
'<option value="<%- value %>" ',
|
|
|
|
'<%= selected ? \'selected="selected"\' : "" %>>',
|
2016-04-15 05:31:11 +00:00
|
|
|
'<%- label %></option>'].join(''),
|
2016-04-04 10:06:28 +00:00
|
|
|
null,{
|
|
|
|
variable: null
|
|
|
|
}),
|
|
|
|
|
Improvised Select2Cell, and SwitchCell.
Removed the use of separate editor for both of these cell types. There
were two instance of select2 were getting created in the Select2Cell,
one in the Select2Cell itself, and another in Select2CellEditor. And,
loosing the focus mysteriously, and making the scrollbar in the property
dialog non-responsive.
Also, modified the NodeAjaxOptionsCell to use the above logic, and
removed its own version of render function to make it consitent across
the system.
This patch [changes sent by Murtuza] also includes improvisation in the
DeleteCell, and ObjectCell, which will honour now 'canRemoveRow', and
''canEditRow' respective properties of Column.
2016-04-12 11:20:43 +00:00
|
|
|
initialize: function() {
|
|
|
|
Backgrid.SelectCell.prototype.initialize.apply(this, arguments);
|
|
|
|
this.onSave = this.onSave.bind(this);
|
2016-04-15 05:31:11 +00:00
|
|
|
this.enterEditMode = this.enterEditMode.bind(this);
|
|
|
|
this.exitEditMode = this.exitEditMode.bind(this);
|
Improvised Select2Cell, and SwitchCell.
Removed the use of separate editor for both of these cell types. There
were two instance of select2 were getting created in the Select2Cell,
one in the Select2Cell itself, and another in Select2CellEditor. And,
loosing the focus mysteriously, and making the scrollbar in the property
dialog non-responsive.
Also, modified the NodeAjaxOptionsCell to use the above logic, and
removed its own version of render function to make it consitent across
the system.
This patch [changes sent by Murtuza] also includes improvisation in the
DeleteCell, and ObjectCell, which will honour now 'canRemoveRow', and
''canEditRow' respective properties of Column.
2016-04-12 11:20:43 +00:00
|
|
|
},
|
|
|
|
|
2016-01-07 03:05:08 +00:00
|
|
|
render: function () {
|
|
|
|
var col = _.defaults(this.column.toJSON(), this.defaults),
|
|
|
|
model = this.model, column = this.column,
|
|
|
|
editable = Backgrid.callByNeed(col.editable, column, model),
|
Improvised Select2Cell, and SwitchCell.
Removed the use of separate editor for both of these cell types. There
were two instance of select2 were getting created in the Select2Cell,
one in the Select2Cell itself, and another in Select2CellEditor. And,
loosing the focus mysteriously, and making the scrollbar in the property
dialog non-responsive.
Also, modified the NodeAjaxOptionsCell to use the above logic, and
removed its own version of render function to make it consitent across
the system.
This patch [changes sent by Murtuza] also includes improvisation in the
DeleteCell, and ObjectCell, which will honour now 'canRemoveRow', and
''canEditRow' respective properties of Column.
2016-04-12 11:20:43 +00:00
|
|
|
optionValues = _.clone(this.optionValues ||
|
2016-06-03 09:50:54 +00:00
|
|
|
(_.isFunction(this.column.get('options')) ?
|
Improvised Select2Cell, and SwitchCell.
Removed the use of separate editor for both of these cell types. There
were two instance of select2 were getting created in the Select2Cell,
one in the Select2Cell itself, and another in Select2CellEditor. And,
loosing the focus mysteriously, and making the scrollbar in the property
dialog non-responsive.
Also, modified the NodeAjaxOptionsCell to use the above logic, and
removed its own version of render function to make it consitent across
the system.
This patch [changes sent by Murtuza] also includes improvisation in the
DeleteCell, and ObjectCell, which will honour now 'canRemoveRow', and
''canEditRow' respective properties of Column.
2016-04-12 11:20:43 +00:00
|
|
|
(this.column.get('options'))(this) :
|
2016-06-03 09:50:54 +00:00
|
|
|
this.column.get('options')));
|
Improvised Select2Cell, and SwitchCell.
Removed the use of separate editor for both of these cell types. There
were two instance of select2 were getting created in the Select2Cell,
one in the Select2Cell itself, and another in Select2CellEditor. And,
loosing the focus mysteriously, and making the scrollbar in the property
dialog non-responsive.
Also, modified the NodeAjaxOptionsCell to use the above logic, and
removed its own version of render function to make it consitent across
the system.
This patch [changes sent by Murtuza] also includes improvisation in the
DeleteCell, and ObjectCell, which will honour now 'canRemoveRow', and
''canEditRow' respective properties of Column.
2016-04-12 11:20:43 +00:00
|
|
|
|
|
|
|
this.undelegateEvents();
|
|
|
|
|
|
|
|
if (this.$select) {
|
2016-04-29 10:11:24 +00:00
|
|
|
if ( this.$select.data('select2')) {
|
|
|
|
this.$select.select2('destroy');
|
|
|
|
}
|
|
|
|
delete this.$select;
|
|
|
|
this.$select = null;
|
Improvised Select2Cell, and SwitchCell.
Removed the use of separate editor for both of these cell types. There
were two instance of select2 were getting created in the Select2Cell,
one in the Select2Cell itself, and another in Select2CellEditor. And,
loosing the focus mysteriously, and making the scrollbar in the property
dialog non-responsive.
Also, modified the NodeAjaxOptionsCell to use the above logic, and
removed its own version of render function to make it consitent across
the system.
This patch [changes sent by Murtuza] also includes improvisation in the
DeleteCell, and ObjectCell, which will honour now 'canRemoveRow', and
''canEditRow' respective properties of Column.
2016-04-12 11:20:43 +00:00
|
|
|
}
|
2016-01-07 03:05:08 +00:00
|
|
|
|
|
|
|
this.$el.empty();
|
|
|
|
|
2016-04-04 10:06:28 +00:00
|
|
|
if (!_.isArray(optionValues))
|
|
|
|
throw new TypeError("optionValues must be an array");
|
2016-01-07 03:05:08 +00:00
|
|
|
|
2016-01-07 08:00:41 +00:00
|
|
|
/*
|
|
|
|
* Add empty option as Select2 requires any empty '<option><option>' for
|
2016-01-07 03:05:08 +00:00
|
|
|
* some of its functionality to work.
|
|
|
|
*/
|
Improvised Select2Cell, and SwitchCell.
Removed the use of separate editor for both of these cell types. There
were two instance of select2 were getting created in the Select2Cell,
one in the Select2Cell itself, and another in Select2CellEditor. And,
loosing the focus mysteriously, and making the scrollbar in the property
dialog non-responsive.
Also, modified the NodeAjaxOptionsCell to use the above logic, and
removed its own version of render function to make it consitent across
the system.
This patch [changes sent by Murtuza] also includes improvisation in the
DeleteCell, and ObjectCell, which will honour now 'canRemoveRow', and
''canEditRow' respective properties of Column.
2016-04-12 11:20:43 +00:00
|
|
|
optionValues.unshift(this.defaults.opt);
|
2016-01-07 03:05:08 +00:00
|
|
|
|
|
|
|
var optionText = null,
|
|
|
|
optionValue = null,
|
2016-05-10 08:18:48 +00:00
|
|
|
self = this,
|
2016-01-07 03:05:08 +00:00
|
|
|
model = this.model,
|
2016-05-10 08:18:48 +00:00
|
|
|
selectedValues = model.get(this.column.get("name")),
|
|
|
|
select2_opts = _.extend(
|
|
|
|
{openOnEnter: false, multiple:false}, self.defaults.select2,
|
|
|
|
(col.select2 || {})
|
|
|
|
),
|
|
|
|
selectTpl = _.template('<select <%=multiple ? "multiple" : "" %>></select>');
|
2016-01-07 03:05:08 +00:00
|
|
|
|
2017-07-18 14:13:16 +00:00
|
|
|
var $select = self.$select = $(selectTpl({
|
2016-05-10 08:18:48 +00:00
|
|
|
multiple: select2_opts.multiple
|
|
|
|
})).appendTo(self.$el);
|
2016-01-07 03:05:08 +00:00
|
|
|
|
|
|
|
for (var i = 0; i < optionValues.length; i++) {
|
Improvised Select2Cell, and SwitchCell.
Removed the use of separate editor for both of these cell types. There
were two instance of select2 were getting created in the Select2Cell,
one in the Select2Cell itself, and another in Select2CellEditor. And,
loosing the focus mysteriously, and making the scrollbar in the property
dialog non-responsive.
Also, modified the NodeAjaxOptionsCell to use the above logic, and
removed its own version of render function to make it consitent across
the system.
This patch [changes sent by Murtuza] also includes improvisation in the
DeleteCell, and ObjectCell, which will honour now 'canRemoveRow', and
''canEditRow' respective properties of Column.
2016-04-12 11:20:43 +00:00
|
|
|
var opt = optionValues[i];
|
|
|
|
|
|
|
|
if (_.isArray(opt)) {
|
2016-04-15 05:31:11 +00:00
|
|
|
|
Improvised Select2Cell, and SwitchCell.
Removed the use of separate editor for both of these cell types. There
were two instance of select2 were getting created in the Select2Cell,
one in the Select2Cell itself, and another in Select2CellEditor. And,
loosing the focus mysteriously, and making the scrollbar in the property
dialog non-responsive.
Also, modified the NodeAjaxOptionsCell to use the above logic, and
removed its own version of render function to make it consitent across
the system.
This patch [changes sent by Murtuza] also includes improvisation in the
DeleteCell, and ObjectCell, which will honour now 'canRemoveRow', and
''canEditRow' respective properties of Column.
2016-04-12 11:20:43 +00:00
|
|
|
optionText = opt[0];
|
|
|
|
optionValue = opt[1];
|
|
|
|
|
|
|
|
$select.append(
|
|
|
|
self.template({
|
2016-04-15 05:31:11 +00:00
|
|
|
label: optionText,
|
Improvised Select2Cell, and SwitchCell.
Removed the use of separate editor for both of these cell types. There
were two instance of select2 were getting created in the Select2Cell,
one in the Select2Cell itself, and another in Select2CellEditor. And,
loosing the focus mysteriously, and making the scrollbar in the property
dialog non-responsive.
Also, modified the NodeAjaxOptionsCell to use the above logic, and
removed its own version of render function to make it consitent across
the system.
This patch [changes sent by Murtuza] also includes improvisation in the
DeleteCell, and ObjectCell, which will honour now 'canRemoveRow', and
''canEditRow' respective properties of Column.
2016-04-12 11:20:43 +00:00
|
|
|
value: optionValue,
|
|
|
|
selected: (selectedValues == optionValue) ||
|
2017-03-23 10:45:42 +00:00
|
|
|
(select2_opts.multiple && _.indexOf(selectedValues, optionValue) > -1)
|
2016-01-07 03:05:08 +00:00
|
|
|
}));
|
Improvised Select2Cell, and SwitchCell.
Removed the use of separate editor for both of these cell types. There
were two instance of select2 were getting created in the Select2Cell,
one in the Select2Cell itself, and another in Select2CellEditor. And,
loosing the focus mysteriously, and making the scrollbar in the property
dialog non-responsive.
Also, modified the NodeAjaxOptionsCell to use the above logic, and
removed its own version of render function to make it consitent across
the system.
This patch [changes sent by Murtuza] also includes improvisation in the
DeleteCell, and ObjectCell, which will honour now 'canRemoveRow', and
''canEditRow' respective properties of Column.
2016-04-12 11:20:43 +00:00
|
|
|
} else {
|
2016-04-15 05:31:11 +00:00
|
|
|
opt = _.defaults({}, opt, {
|
Improvised Select2Cell, and SwitchCell.
Removed the use of separate editor for both of these cell types. There
were two instance of select2 were getting created in the Select2Cell,
one in the Select2Cell itself, and another in Select2CellEditor. And,
loosing the focus mysteriously, and making the scrollbar in the property
dialog non-responsive.
Also, modified the NodeAjaxOptionsCell to use the above logic, and
removed its own version of render function to make it consitent across
the system.
This patch [changes sent by Murtuza] also includes improvisation in the
DeleteCell, and ObjectCell, which will honour now 'canRemoveRow', and
''canEditRow' respective properties of Column.
2016-04-12 11:20:43 +00:00
|
|
|
selected: ((selectedValues == opt.value) ||
|
2017-03-23 10:45:42 +00:00
|
|
|
(select2_opts.multiple && _.indexOf(selectedValues, opt.value) > -1)),
|
2016-04-15 05:31:11 +00:00
|
|
|
}, self.defaults.opt);
|
Improvised Select2Cell, and SwitchCell.
Removed the use of separate editor for both of these cell types. There
were two instance of select2 were getting created in the Select2Cell,
one in the Select2Cell itself, and another in Select2CellEditor. And,
loosing the focus mysteriously, and making the scrollbar in the property
dialog non-responsive.
Also, modified the NodeAjaxOptionsCell to use the above logic, and
removed its own version of render function to make it consitent across
the system.
This patch [changes sent by Murtuza] also includes improvisation in the
DeleteCell, and ObjectCell, which will honour now 'canRemoveRow', and
''canEditRow' respective properties of Column.
2016-04-12 11:20:43 +00:00
|
|
|
$select.append(self.template(opt));
|
2016-01-07 03:05:08 +00:00
|
|
|
}
|
|
|
|
}
|
Improvised Select2Cell, and SwitchCell.
Removed the use of separate editor for both of these cell types. There
were two instance of select2 were getting created in the Select2Cell,
one in the Select2Cell itself, and another in Select2CellEditor. And,
loosing the focus mysteriously, and making the scrollbar in the property
dialog non-responsive.
Also, modified the NodeAjaxOptionsCell to use the above logic, and
removed its own version of render function to make it consitent across
the system.
This patch [changes sent by Murtuza] also includes improvisation in the
DeleteCell, and ObjectCell, which will honour now 'canRemoveRow', and
''canEditRow' respective properties of Column.
2016-04-12 11:20:43 +00:00
|
|
|
|
|
|
|
if(col && _.has(col.disabled)) {
|
|
|
|
_.extend(select2_opts, {
|
|
|
|
disabled: evalF(col.disabled, col, model)
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
_.extend(select2_opts, {disabled: !editable});
|
|
|
|
}
|
|
|
|
|
2016-01-07 03:05:08 +00:00
|
|
|
this.delegateEvents();
|
|
|
|
|
2017-01-17 10:25:26 +00:00
|
|
|
// If disabled then no need to show placeholder
|
|
|
|
if(!editable || col.mode === 'properties') {
|
|
|
|
select2_opts['placeholder'] = '';
|
|
|
|
}
|
|
|
|
|
2016-04-15 05:31:11 +00:00
|
|
|
// Initialize select2 control.
|
2016-08-19 15:35:42 +00:00
|
|
|
this.$sel = this.$select.select2(select2_opts);
|
|
|
|
|
|
|
|
// Select the highlighted item on Tab press.
|
|
|
|
if (this.$sel) {
|
|
|
|
this.$sel.data('select2').on("keypress", function(ev) {
|
|
|
|
var self = this;
|
2016-09-22 14:27:59 +00:00
|
|
|
|
|
|
|
// keycode 9 is for TAB key
|
|
|
|
if (ev.which === 9 && self.isOpen()) {
|
2016-08-19 15:35:42 +00:00
|
|
|
self.trigger('results:select', {});
|
|
|
|
ev.preventDefault();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
2016-04-15 05:31:11 +00:00
|
|
|
|
2016-01-07 03:05:08 +00:00
|
|
|
return this;
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
Saves the value of the selected option to the model attribute.
|
|
|
|
*/
|
|
|
|
onSave: function (e) {
|
|
|
|
var model = this.model;
|
|
|
|
var column = this.column;
|
Improvised Select2Cell, and SwitchCell.
Removed the use of separate editor for both of these cell types. There
were two instance of select2 were getting created in the Select2Cell,
one in the Select2Cell itself, and another in Select2CellEditor. And,
loosing the focus mysteriously, and making the scrollbar in the property
dialog non-responsive.
Also, modified the NodeAjaxOptionsCell to use the above logic, and
removed its own version of render function to make it consitent across
the system.
This patch [changes sent by Murtuza] also includes improvisation in the
DeleteCell, and ObjectCell, which will honour now 'canRemoveRow', and
''canEditRow' respective properties of Column.
2016-04-12 11:20:43 +00:00
|
|
|
|
2016-01-15 13:40:29 +00:00
|
|
|
model.set(column.get("name"), this.$select.val());
|
Improvised Select2Cell, and SwitchCell.
Removed the use of separate editor for both of these cell types. There
were two instance of select2 were getting created in the Select2Cell,
one in the Select2Cell itself, and another in Select2CellEditor. And,
loosing the focus mysteriously, and making the scrollbar in the property
dialog non-responsive.
Also, modified the NodeAjaxOptionsCell to use the above logic, and
removed its own version of render function to make it consitent across
the system.
This patch [changes sent by Murtuza] also includes improvisation in the
DeleteCell, and ObjectCell, which will honour now 'canRemoveRow', and
''canEditRow' respective properties of Column.
2016-04-12 11:20:43 +00:00
|
|
|
},
|
|
|
|
|
|
|
|
remove: function() {
|
|
|
|
this.$select.off('change', this.onSave);
|
2016-04-29 10:11:24 +00:00
|
|
|
if (this.$select.data('select2')) {
|
|
|
|
this.$select.select2('destroy');
|
|
|
|
}
|
Improvised Select2Cell, and SwitchCell.
Removed the use of separate editor for both of these cell types. There
were two instance of select2 were getting created in the Select2Cell,
one in the Select2Cell itself, and another in Select2CellEditor. And,
loosing the focus mysteriously, and making the scrollbar in the property
dialog non-responsive.
Also, modified the NodeAjaxOptionsCell to use the above logic, and
removed its own version of render function to make it consitent across
the system.
This patch [changes sent by Murtuza] also includes improvisation in the
DeleteCell, and ObjectCell, which will honour now 'canRemoveRow', and
''canEditRow' respective properties of Column.
2016-04-12 11:20:43 +00:00
|
|
|
this.$el.empty();
|
|
|
|
Backgrid.SelectCell.prototype.remove.apply(this, arguments);
|
2016-07-15 09:12:23 +00:00
|
|
|
}
|
2016-01-07 03:05:08 +00:00
|
|
|
});
|
2016-03-16 14:48:09 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
TextareaCellEditor the cell editor renders a textarea multi-line text input
|
|
|
|
box as its editor.
|
|
|
|
|
|
|
|
@class Backgrid.TextareaCellEditor
|
|
|
|
@extends Backgrid.InputCellEditor
|
|
|
|
*/
|
|
|
|
var TextareaCellEditor = Backgrid.TextareaCellEditor = Backgrid.InputCellEditor.extend({
|
|
|
|
/** @property */
|
|
|
|
tagName: "textarea",
|
|
|
|
|
|
|
|
events: {
|
|
|
|
"blur": "saveOrCancel",
|
|
|
|
"keydown": ""
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
/**
|
|
|
|
TextareaCell displays multiline HTML strings.
|
|
|
|
|
|
|
|
@class Backgrid.Extension.TextareaCell
|
|
|
|
@extends Backgrid.Cell
|
|
|
|
*/
|
|
|
|
var TextareaCell = Backgrid.Extension.TextareaCell = Backgrid.Cell.extend({
|
|
|
|
/** @property */
|
|
|
|
className: "textarea-cell",
|
|
|
|
|
|
|
|
editor: TextareaCellEditor
|
|
|
|
});
|
|
|
|
|
2016-04-14 20:36:04 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Custom header icon cell to add the icon in table header.
|
|
|
|
*/
|
|
|
|
var CustomHeaderIconCell = Backgrid.Extension.CustomHeaderIconCell = Backgrid.HeaderCell.extend({
|
|
|
|
/** @property */
|
|
|
|
className: "header-icon-cell",
|
|
|
|
events: {
|
|
|
|
"click": "addHeaderIcon"
|
|
|
|
},
|
|
|
|
addHeaderIcon: function (e) {
|
2017-07-18 14:13:16 +00:00
|
|
|
var self = this,
|
2016-04-14 20:36:04 +00:00
|
|
|
m = new (this.collection.model);
|
|
|
|
this.collection.add(m)
|
|
|
|
e.preventDefault();
|
|
|
|
},
|
|
|
|
render: function () {
|
|
|
|
this.$el.empty();
|
|
|
|
//this.$el.html("<i class='fa fa-plus-circle'></i>");
|
2016-07-21 16:18:15 +00:00
|
|
|
this.$el.html("<label><a><span style='font-weight:normal;'>Array Values</a></span></label> <button class='btn-sm btn-default add'>Add</button>");
|
2016-04-14 20:36:04 +00:00
|
|
|
this.delegateEvents();
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
var arrayCellModel = Backbone.Model.extend({
|
|
|
|
defaults: {
|
|
|
|
value: undefined
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
/**
|
|
|
|
Custom InputArrayCellEditor for editing user input array for debugger.
|
|
|
|
*/
|
|
|
|
var InputArrayCellEditor = Backgrid.Extension.InputArrayCellEditor =
|
|
|
|
Backgrid.CellEditor.extend({
|
|
|
|
tagName: "div",
|
|
|
|
|
|
|
|
events: {
|
|
|
|
'blur': 'lostFocus'
|
|
|
|
},
|
|
|
|
|
|
|
|
render: function () {
|
|
|
|
var self = this,
|
|
|
|
arrayValuesCol = this.model.get(this.column.get("name")),
|
|
|
|
tbl = $("<table></table>").appendTo(this.$el),
|
|
|
|
gridCols = [
|
|
|
|
{name: 'value', label:'Array Values', type: 'text', cell:'string', headerCell: Backgrid.Extension.CustomHeaderIconCell, cellHeaderClasses: 'width_percent_100'},
|
|
|
|
],
|
|
|
|
gridBody = $("<div class='pgadmin-control-group backgrid form-group col-xs-12 object subnode'></div>");
|
|
|
|
|
|
|
|
this.$el.attr('tabindex', '1');
|
|
|
|
|
|
|
|
gridCols.unshift({
|
|
|
|
name: "pg-backform-delete", label: "",
|
|
|
|
cell: Backgrid.Extension.DeleteCell,
|
|
|
|
//headerCell: Backgrid.Extension.CustomHeaderIconCell,
|
|
|
|
editable: false, cell_priority: -1
|
|
|
|
});
|
|
|
|
|
|
|
|
this.$el.empty();
|
|
|
|
var grid = self.grid = new Backgrid.Grid({
|
|
|
|
columns: gridCols,
|
|
|
|
collection:arrayValuesCol
|
|
|
|
});
|
|
|
|
|
|
|
|
grid.render();
|
|
|
|
|
|
|
|
gridBody.append(grid.$el)
|
|
|
|
|
|
|
|
this.$el.html(gridBody);
|
|
|
|
|
|
|
|
$(self.$el).pgMakeVisible('backform-tab');
|
|
|
|
self.delegateEvents();
|
|
|
|
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Call back function when the grid lost the focus
|
|
|
|
*/
|
|
|
|
lostFocus: function(ev) {
|
|
|
|
|
|
|
|
var self = this,
|
|
|
|
/*
|
|
|
|
* Function to determine whether one dom element is descendant of another
|
|
|
|
* dom element.
|
|
|
|
*/
|
|
|
|
isDescendant = function (parent, child) {
|
|
|
|
var node = child.parentNode;
|
|
|
|
while (node != null) {
|
|
|
|
if (node == parent) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
node = node.parentNode;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
/*
|
|
|
|
* Between leaving the old element focus and entering the new element focus the
|
|
|
|
* active element is the document/body itself so add timeout to get the proper
|
|
|
|
* focused active element.
|
|
|
|
*/
|
|
|
|
setTimeout(function() {
|
|
|
|
if (self.$el[0] != document.activeElement && !isDescendant(self.$el[0], document.activeElement)){
|
|
|
|
var m = self.model,
|
|
|
|
column = self.column;
|
|
|
|
m.trigger('backgrid:edited', m, column, new Backgrid.Command(ev));
|
|
|
|
|
|
|
|
setTimeout(function(){
|
|
|
|
if (self.grid) {
|
|
|
|
self.grid.remove();
|
|
|
|
self.grid = null;
|
|
|
|
}
|
|
|
|
}, 10);
|
|
|
|
|
|
|
|
|
2017-07-18 14:13:16 +00:00
|
|
|
} },10);
|
2016-04-14 20:36:04 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
/*
|
|
|
|
* This will help us transform the user input string array values in proper format to be
|
|
|
|
* displayed in the cell.
|
|
|
|
*/
|
|
|
|
var InputStringArrayCellFormatter = Backgrid.Extension.InputStringArrayCellFormatter =
|
|
|
|
function () {};
|
|
|
|
_.extend(InputStringArrayCellFormatter.prototype, {
|
|
|
|
/**
|
|
|
|
* Takes a raw value from a model and returns an optionally formatted
|
|
|
|
* string for display.
|
|
|
|
*/
|
|
|
|
fromRaw: function (rawData, model) {
|
|
|
|
var values = []
|
|
|
|
rawData.each(function(m){
|
|
|
|
var val = m.get('value');
|
|
|
|
if (_.isUndefined(val)) {
|
|
|
|
values.push("null");
|
|
|
|
} else {
|
|
|
|
values.push(m.get("value"));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
);
|
|
|
|
return values.toString();
|
|
|
|
},
|
|
|
|
toRaw: function (formattedData, model) {
|
|
|
|
return formattedData;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
/*
|
|
|
|
* This will help us transform the user input integer array values in proper format to be
|
|
|
|
* displayed in the cell.
|
|
|
|
*/
|
|
|
|
var InputIntegerArrayCellFormatter = Backgrid.Extension.InputIntegerArrayCellFormatter =
|
|
|
|
function () {};
|
|
|
|
_.extend(InputIntegerArrayCellFormatter.prototype, {
|
|
|
|
/**
|
|
|
|
* Takes a raw value from a model and returns an optionally formatted
|
|
|
|
* string for display.
|
|
|
|
*/
|
|
|
|
fromRaw: function (rawData, model) {
|
|
|
|
var values = []
|
|
|
|
rawData.each(function(m){
|
|
|
|
var val = m.get('value');
|
|
|
|
if (_.isUndefined(val)) {
|
|
|
|
values.push("null");
|
|
|
|
} else {
|
|
|
|
values.push(m.get("value"));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
);
|
|
|
|
return values.toString();
|
|
|
|
},
|
|
|
|
toRaw: function (formattedData, model) {
|
|
|
|
formattedData.each(function(m){
|
|
|
|
m.set("value", parseInt(m.get('value')), {silent: true});
|
|
|
|
});
|
|
|
|
|
|
|
|
return formattedData;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
/*
|
|
|
|
* InputStringArrayCell for rendering and taking input for string array type in debugger
|
|
|
|
*/
|
|
|
|
var InputStringArrayCell = Backgrid.Extension.InputStringArrayCell = Backgrid.Cell.extend({
|
|
|
|
className: "width_percent_25",
|
|
|
|
formatter: InputStringArrayCellFormatter,
|
|
|
|
editor: InputArrayCellEditor,
|
|
|
|
|
|
|
|
initialize: function() {
|
|
|
|
Backgrid.Cell.prototype.initialize.apply(this, arguments);
|
|
|
|
// set value to empty array.
|
2016-05-06 10:32:11 +00:00
|
|
|
var m = arguments[0].model;
|
2016-04-14 20:36:04 +00:00
|
|
|
if (_.isUndefined(this.collection)) {
|
|
|
|
this.collection = new (Backbone.Collection.extend({
|
2016-05-06 10:32:11 +00:00
|
|
|
model: arrayCellModel}))(m.get('value'));
|
2016-04-14 20:36:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
this.model.set(this.column.get('name'), this.collection);
|
|
|
|
|
|
|
|
this.listenTo(this.collection, "remove", this.render);
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
/*
|
|
|
|
* InputIntegerArrayCell for rendering and taking input for integer array type in debugger
|
|
|
|
*/
|
|
|
|
var InputIntegerArrayCell = Backgrid.Extension.InputIntegerArrayCell = Backgrid.Cell.extend({
|
|
|
|
className: "width_percent_25",
|
|
|
|
formatter: InputIntegerArrayCellFormatter,
|
|
|
|
editor: InputArrayCellEditor,
|
|
|
|
|
|
|
|
initialize: function() {
|
|
|
|
Backgrid.Cell.prototype.initialize.apply(this, arguments);
|
|
|
|
// set value to empty array.
|
2016-05-06 10:32:11 +00:00
|
|
|
var m = arguments[0].model;
|
2016-04-14 20:36:04 +00:00
|
|
|
if (_.isUndefined(this.collection)) {
|
|
|
|
this.collection = new (Backbone.Collection.extend({
|
2016-05-06 10:32:11 +00:00
|
|
|
model: arrayCellModel}))(m.get('value'));
|
2016-04-14 20:36:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
this.model.set(this.column.get('name'),this.collection);
|
|
|
|
|
|
|
|
this.listenTo(this.collection, "remove", this.render);
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
2016-05-10 07:10:39 +00:00
|
|
|
/**
|
|
|
|
* DependentCell functions can be used with the different cell type in order
|
|
|
|
* to setup the callback for the depedent attribute change in the model.
|
|
|
|
*
|
|
|
|
* Please implement the 'dependentChanged' as the callback in the used cell.
|
|
|
|
*
|
|
|
|
* @class Backgrid.Extension.DependentCell
|
|
|
|
**/
|
|
|
|
var DependentCell = Backgrid.Extension.DependentCell = function() {};
|
|
|
|
|
|
|
|
_.extend(
|
|
|
|
DependentCell.prototype, {
|
|
|
|
initialize: function(){
|
|
|
|
// Listen to the dependent fields in the model for any change
|
|
|
|
var deps = this.column.get('deps');
|
|
|
|
var self = this;
|
|
|
|
|
|
|
|
if (deps && _.isArray(deps)) {
|
|
|
|
_.each(deps, function(d) {
|
2017-07-18 14:13:16 +00:00
|
|
|
var attrArr = d.split('.'),
|
2016-05-10 07:10:39 +00:00
|
|
|
name = attrArr.shift();
|
|
|
|
self.listenTo(self.model, "change:" + name, self.dependentChanged);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
},
|
|
|
|
remove: function() {
|
|
|
|
// Remove the events for the dependent fields in the model
|
|
|
|
var self = this,
|
|
|
|
deps = self.column.get('deps');
|
|
|
|
|
|
|
|
if (deps && _.isArray(deps)) {
|
|
|
|
_.each(deps, function(d) {
|
2017-07-18 14:13:16 +00:00
|
|
|
var attrArr = d.split('.'),
|
|
|
|
name = attrArr.shift();
|
2016-05-10 07:10:39 +00:00
|
|
|
|
|
|
|
self.stopListening(self.model, "change:" + name, self.dependentChanged);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2016-06-03 10:43:42 +00:00
|
|
|
/**
|
|
|
|
Formatter for PasswordCell.
|
|
|
|
|
|
|
|
@class Backgrid.PasswordFormatter
|
|
|
|
@extends Backgrid.CellFormatter
|
|
|
|
@constructor
|
|
|
|
*/
|
|
|
|
var PasswordFormatter = Backgrid.PasswordFormatter = function () {};
|
|
|
|
PasswordFormatter.prototype = new Backgrid.CellFormatter();
|
|
|
|
_.extend(PasswordFormatter.prototype, {
|
|
|
|
fromRaw: function (rawValue, model) {
|
|
|
|
|
|
|
|
if (_.isUndefined(rawValue) || _.isNull(rawValue)) return '';
|
|
|
|
|
|
|
|
var pass = '';
|
|
|
|
for(var i = 0; i < rawValue.length; i++) {
|
|
|
|
pass += '*';
|
|
|
|
}
|
|
|
|
return pass;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
var PasswordCell = Backgrid.Extension.PasswordCell = Backgrid.StringCell.extend({
|
|
|
|
|
|
|
|
formatter: PasswordFormatter,
|
|
|
|
|
|
|
|
editor: Backgrid.InputCellEditor.extend({
|
|
|
|
attributes: {
|
|
|
|
type: "password"
|
|
|
|
},
|
|
|
|
|
|
|
|
render: function () {
|
|
|
|
var model = this.model;
|
|
|
|
this.$el.val(model.get(this.column.get("name")));
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
})
|
|
|
|
});
|
|
|
|
|
2016-06-23 11:46:48 +00:00
|
|
|
/*
|
|
|
|
* Override NumberFormatter to support NaN, Infinity values.
|
|
|
|
* On client side, JSON do not directly support NaN & Infinity,
|
|
|
|
* we explicitly converted it into string format at server side
|
|
|
|
* and we need to parse it again in float at client side.
|
|
|
|
*/
|
|
|
|
_.extend(Backgrid.NumberFormatter.prototype, {
|
|
|
|
fromRaw: function (number, model) {
|
|
|
|
if (_.isNull(number) || _.isUndefined(number)) return '';
|
|
|
|
|
|
|
|
number = parseFloat(number).toFixed(~~this.decimals);
|
|
|
|
|
|
|
|
var parts = number.split('.');
|
|
|
|
var integerPart = parts[0];
|
|
|
|
var decimalPart = parts[1] ? (this.decimalSeparator || '.') + parts[1] : '';
|
|
|
|
|
|
|
|
return integerPart.replace(this.HUMANIZED_NUM_RE, '$1' + this.orderSeparator) + decimalPart;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2016-07-04 09:05:59 +00:00
|
|
|
/*
|
|
|
|
* JSONBCell Formatter.
|
|
|
|
*/
|
|
|
|
var JSONBCellFormatter = Backgrid.Extension.JSONBCellFormatter =
|
|
|
|
function () {};
|
|
|
|
_.extend(JSONBCellFormatter.prototype, {
|
|
|
|
fromRaw: function (rawData, model) {
|
|
|
|
// json data
|
|
|
|
if(_.isArray(rawData)) {
|
|
|
|
var converted_data = '';
|
|
|
|
converted_data = _.map(rawData, function(data) {
|
|
|
|
return JSON.stringify(JSON.stringify(data));
|
|
|
|
});
|
|
|
|
return '{' + converted_data.join() + '}';
|
|
|
|
} else if(_.isObject(rawData)) {
|
|
|
|
return JSON.stringify(rawData);
|
|
|
|
} else {
|
|
|
|
return rawData;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
toRaw: function (formattedData, model) {
|
|
|
|
return formattedData;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
/*
|
|
|
|
* JSONBCell for backgrid.
|
|
|
|
*/
|
|
|
|
var JSONBCell = Backgrid.Extension.JSONBCell =
|
|
|
|
Backgrid.StringCell.extend({
|
|
|
|
className: "jsonb-cell",
|
|
|
|
formatter: JSONBCellFormatter
|
|
|
|
});
|
|
|
|
|
2016-09-22 14:27:59 +00:00
|
|
|
var DatepickerCell = Backgrid.Extension.DatepickerCell = Backgrid.Cell.extend({
|
|
|
|
editor: DatepickerCellEditor
|
|
|
|
});
|
|
|
|
|
|
|
|
var DatepickerCellEditor = Backgrid.InputCellEditor.extend({
|
|
|
|
events:{},
|
|
|
|
initialize:function() {
|
|
|
|
Backgrid.InputCellEditor.prototype.initialize.apply(this, arguments);
|
|
|
|
var input = this;
|
|
|
|
$(this.el).prop('readonly', true);
|
|
|
|
$(this.el).datepicker({
|
|
|
|
onClose: function(newValue){
|
|
|
|
var command = new Backgrid.Command({});
|
|
|
|
input.model.set(input.column.get("name"), newValue);
|
|
|
|
input.model.trigger(
|
|
|
|
"backgrid:edited", input.model, input.column, command
|
|
|
|
);
|
|
|
|
command = input = null;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
// Reference:
|
|
|
|
// https://github.com/wyuenho/backgrid-moment-cell/blob/master/backgrid-moment-cell.js
|
|
|
|
/**
|
|
|
|
MomentFormatter converts bi-directionally any datetime values in any format
|
|
|
|
supported by [moment()](http://momentjs.com/docs/#/parsing/) to any
|
|
|
|
datetime format
|
|
|
|
[moment.fn.format()](http://momentjs.com/docs/#/displaying/format/)
|
|
|
|
supports.
|
|
|
|
@class Backgrid.Extension.MomentFormatter
|
|
|
|
@extends Backgrid.CellFormatter
|
|
|
|
@constructor
|
|
|
|
*/
|
|
|
|
var MomentFormatter = Backgrid.Extension.MomentFormatter = function (options) {
|
|
|
|
_.extend(this, this.defaults, options);
|
|
|
|
};
|
|
|
|
|
|
|
|
MomentFormatter.prototype = new Backgrid.CellFormatter;
|
|
|
|
_.extend(MomentFormatter.prototype, {
|
|
|
|
/**
|
|
|
|
@cfg {Object} options
|
|
|
|
@cfg {boolean} [options.modelInUnixOffset=false] Whether the model values
|
|
|
|
should be read/written as the number of milliseconds since UNIX Epoch.
|
|
|
|
@cfg {boolean} [options.modelInUnixTimestamp=false] Whether the model
|
|
|
|
values should be read/written as the number of seconds since UNIX Epoch.
|
|
|
|
@cfg {boolean} [options.modelInUTC=true] Whether the model values should
|
|
|
|
be read/written in UTC mode or local mode.
|
|
|
|
@cfg {string} [options.modelLang=moment.locale() moment>=2.8.0 |
|
|
|
|
moment.lang() moment<2.8.0] The locale the model values should be
|
|
|
|
read/written in.
|
|
|
|
@cfg {string} [options.modelFormat=moment.defaultFormat] The format this
|
|
|
|
moment formatter should use to read/write model values. Only meaningful if
|
|
|
|
the values are strings.
|
|
|
|
@cfg {boolean} [options.displayInUnixOffset=false] Whether the display
|
|
|
|
values should be read/written as the number of milliseconds since UNIX
|
|
|
|
Epoch.
|
|
|
|
@cfg {boolean} [options.displayInUnixTimestamp=false] Whether the display
|
|
|
|
values should be read/written as the number of seconds since UNIX Epoch.
|
|
|
|
@cfg {boolean} [options.displayInUTC=true] Whether the display values
|
|
|
|
should be read/written in UTC mode or local mode.
|
|
|
|
@cfg {string} [options.displayLang=moment.locale() moment>=2.8.0 |
|
|
|
|
moment.lang() moment<2.8.0] The locale the display values should be
|
|
|
|
read/written in.
|
|
|
|
@cfg {string} [options.displayFormat=moment.defaultFormat] The format
|
|
|
|
this moment formatter should use to read/write dislay values.
|
|
|
|
*/
|
|
|
|
defaults: {
|
|
|
|
modelInUnixOffset: false,
|
|
|
|
modelInUnixTimestamp: false,
|
|
|
|
modelInUTC: true,
|
|
|
|
modelLang: moment.locale(),
|
|
|
|
modelFormat: moment.defaultFormat,
|
|
|
|
displayInUnixOffset: false,
|
|
|
|
displayInUnixTimestamp: false,
|
|
|
|
displayInUTC: true,
|
|
|
|
displayLang: moment.locale(),
|
|
|
|
displayFormat: moment.defaultFormat,
|
|
|
|
allowEmpty: false
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
Converts datetime values from the model for display.
|
|
|
|
@member Backgrid.Extension.MomentFormatter
|
|
|
|
@param {*} rawData
|
|
|
|
@return {string}
|
|
|
|
*/
|
|
|
|
fromRaw: function (rawData) {
|
|
|
|
if (rawData == null) return '';
|
|
|
|
|
|
|
|
var m = this.modelInUnixOffset ? moment(rawData) :
|
|
|
|
this.modelInUnixTimestamp ? moment.unix(rawData) :
|
|
|
|
this.modelInUTC ?
|
|
|
|
moment.utc(rawData, this.modelFormat, this.modelLang) :
|
|
|
|
moment(rawData, this.modelFormat, this.modelLang);
|
|
|
|
|
|
|
|
if (this.displayInUnixOffset) return +m;
|
|
|
|
|
|
|
|
if (this.displayInUnixTimestamp) return m.unix();
|
|
|
|
|
|
|
|
if (this.displayLang) m.locale(this.displayLang);
|
|
|
|
|
|
|
|
if (this.displayInUTC) m.utc(); else m.local();
|
|
|
|
|
|
|
|
if (this.displayFormat != moment.defaultFormat) {
|
|
|
|
return m.format(this.displayFormat);
|
|
|
|
}
|
|
|
|
|
|
|
|
return m.format();
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
Converts datetime values from user input to model values.
|
|
|
|
@member Backgrid.Extension.MomentFormatter
|
|
|
|
@param {string} formattedData
|
|
|
|
@return {string}
|
|
|
|
*/
|
|
|
|
toRaw: function (formattedData) {
|
|
|
|
|
|
|
|
var m = this.displayInUnixOffset ? moment(+formattedData) :
|
|
|
|
this.displayInUnixTimestamp ? moment.unix(+formattedData) :
|
|
|
|
this.displayInUTC ?
|
|
|
|
moment.utc(formattedData, this.displayFormat, this.displayLang) :
|
|
|
|
moment(formattedData, this.displayFormat, this.displayLang);
|
|
|
|
|
|
|
|
if (!m || !m.isValid()) return (this.allowEmpty && formattedData === '') ? null : undefined;
|
|
|
|
|
|
|
|
if (this.modelInUnixOffset) return +m;
|
|
|
|
|
|
|
|
if (this.modelInUnixTimestamp) return m.unix();
|
|
|
|
|
|
|
|
if (this.modelLang) m.locale(this.modelLang);
|
|
|
|
|
|
|
|
if (this.modelInUTC) m.utc(); else m.local()
|
|
|
|
|
|
|
|
if (this.modelFormat != moment.defaultFormat) {
|
|
|
|
return m.format(this.modelFormat);
|
|
|
|
}
|
|
|
|
|
|
|
|
return m.format();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
var MomentCell = Backgrid.Extension.MomentCell = Backgrid.Cell.extend({
|
|
|
|
|
|
|
|
editor: Backgrid.InputCellEditor,
|
|
|
|
|
|
|
|
/** @property */
|
|
|
|
className: "datetime-cell",
|
|
|
|
|
|
|
|
/** @property {Backgrid.CellFormatter} [formatter=Backgrid.Extension.MomentFormatter] */
|
|
|
|
formatter: MomentFormatter,
|
|
|
|
|
|
|
|
/**
|
|
|
|
Initializer. Accept Backgrid.Extension.MomentFormatter.options and
|
|
|
|
Backgrid.Cell.initialize required parameters.
|
|
|
|
*/
|
|
|
|
initialize: function (options) {
|
|
|
|
|
|
|
|
MomentCell.__super__.initialize.apply(this, arguments);
|
|
|
|
|
|
|
|
var formatterDefaults = MomentFormatter.prototype.defaults;
|
|
|
|
var formatterDefaultKeys = _.keys(formatterDefaults);
|
|
|
|
var classAttrs = _.pick(this, formatterDefaultKeys);
|
|
|
|
var formatterOptions = _.pick(options, formatterDefaultKeys);
|
|
|
|
var columnsAttrs = _.pick(this.column.toJSON(), formatterDefaultKeys);
|
|
|
|
|
|
|
|
// Priority of the options for the formatter, from highest to lowerest
|
|
|
|
// 1. MomentCell instance options
|
|
|
|
// 2. MomentCell class attributes
|
|
|
|
// 3. MomentFormatter defaults
|
|
|
|
|
|
|
|
// this.formatter will have been instantiated now
|
|
|
|
_.extend(this.formatter, formatterDefaults, classAttrs, formatterOptions, columnsAttrs);
|
|
|
|
|
|
|
|
this.editor = this.editor.extend({
|
|
|
|
attributes: _.extend({}, this.editor.prototype.attributes || this.editor.attributes || {}, {
|
|
|
|
placeholder: this.formatter.displayFormat
|
|
|
|
}),
|
|
|
|
options: this.column.get('options')
|
|
|
|
});
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2016-09-26 09:04:49 +00:00
|
|
|
var DatetimePickerEditor = Backgrid.Extension.DatetimePickerEditor = Backgrid.InputCellEditor.extend({
|
|
|
|
postRender: function() {
|
|
|
|
var self = this,
|
|
|
|
evalF = function() {
|
|
|
|
var args = [];
|
|
|
|
Array.prototype.push.apply(args, arguments);
|
|
|
|
var f = args.shift();
|
|
|
|
|
|
|
|
if (typeof(f) === 'function') {
|
|
|
|
return f.apply(self, args);
|
|
|
|
}
|
|
|
|
return f;
|
|
|
|
},
|
|
|
|
options = _.extend({
|
|
|
|
format: "YYYY-MM-DD HH:mm:ss Z",
|
|
|
|
showClear: true,
|
|
|
|
showTodayButton: true,
|
|
|
|
toolbarPlacement: 'top'
|
|
|
|
}, evalF(this.column.get('options')), {
|
|
|
|
keyBinds: {
|
|
|
|
"shift tab": function(widget) {
|
|
|
|
if (widget) {
|
|
|
|
// blur the input
|
|
|
|
setTimeout(
|
|
|
|
function() {
|
|
|
|
self.closeIt({keyCode: 9, shiftKey: true});
|
|
|
|
}, 10
|
|
|
|
);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
tab: function(widget) {
|
|
|
|
if (widget) {
|
|
|
|
// blur the input
|
|
|
|
setTimeout(
|
|
|
|
function() {
|
|
|
|
self.closeIt({keyCode: 9});
|
|
|
|
}, 10
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
this.$el.datetimepicker(options);
|
|
|
|
this.$el.datetimepicker('show');
|
|
|
|
this.picker = this.$el.data('DateTimePicker');
|
|
|
|
},
|
|
|
|
events: {
|
|
|
|
'dp.hide': 'closeIt'
|
|
|
|
},
|
|
|
|
closeIt: function(ev) {
|
|
|
|
var formatter = this.formatter,
|
2017-07-18 14:13:16 +00:00
|
|
|
model = this.model,
|
|
|
|
column = this.column,
|
|
|
|
val = this.$el.val(),
|
2016-09-26 09:04:49 +00:00
|
|
|
newValue = formatter.toRaw(val, model);
|
|
|
|
|
|
|
|
if (this.is_closing)
|
|
|
|
return;
|
|
|
|
this.is_closing = true;
|
|
|
|
this.$el.datetimepicker('destroy');
|
|
|
|
this.is_closing = false;
|
|
|
|
|
|
|
|
var command = new Backgrid.Command(ev);
|
|
|
|
|
|
|
|
if (_.isUndefined(newValue)) {
|
|
|
|
model.trigger("backgrid:error", model, column, val);
|
|
|
|
} else {
|
|
|
|
model.set(column.get("name"), newValue);
|
|
|
|
model.trigger("backgrid:edited", model, column, command);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2016-09-22 14:27:59 +00:00
|
|
|
_.extend(MomentCell.prototype, MomentFormatter.prototype.defaults);
|
|
|
|
|
2017-06-29 13:31:29 +00:00
|
|
|
|
|
|
|
Backgrid.Extension.StringDepCell = Backgrid.StringCell.extend({
|
|
|
|
initialize: function() {
|
|
|
|
Backgrid.StringCell.prototype.initialize.apply(this, arguments);
|
|
|
|
Backgrid.Extension.DependentCell.prototype.initialize.apply(this, arguments);
|
|
|
|
},
|
|
|
|
dependentChanged: function () {
|
|
|
|
this.$el.empty();
|
|
|
|
|
|
|
|
var self = this,
|
|
|
|
model = this.model,
|
|
|
|
column = this.column,
|
|
|
|
editable = this.column.get("editable");
|
|
|
|
|
|
|
|
this.render();
|
|
|
|
|
2017-07-18 14:13:16 +00:00
|
|
|
var is_editable = _.isFunction(editable) ? !!editable.apply(column, [model]) : !!editable;
|
2017-06-29 13:31:29 +00:00
|
|
|
setTimeout(function() {
|
|
|
|
self.$el.removeClass("editor");
|
|
|
|
if (is_editable){ self.$el.addClass("editable"); }
|
|
|
|
else { self.$el.removeClass("editable"); }
|
|
|
|
}, 10);
|
|
|
|
|
|
|
|
this.delegateEvents();
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
remove: Backgrid.Extension.DependentCell.prototype.remove
|
|
|
|
});
|
|
|
|
|
|
|
|
Backgrid.Extension.Select2DepCell = Backgrid.Extension.Select2Cell.extend({
|
|
|
|
initialize: function() {
|
|
|
|
Backgrid.Extension.Select2Cell.prototype.initialize.apply(this, arguments);
|
|
|
|
Backgrid.Extension.DependentCell.prototype.initialize.apply(this, arguments);
|
|
|
|
},
|
|
|
|
|
|
|
|
dependentChanged: function () {
|
|
|
|
var model = this.model;
|
|
|
|
var column = this.column;
|
|
|
|
editable = this.column.get("editable");
|
|
|
|
|
|
|
|
this.render();
|
|
|
|
|
|
|
|
is_editable = _.isFunction(editable) ? !!editable.apply(column, [model]) : !!editable;
|
|
|
|
if (is_editable){ this.$el.addClass("editable"); }
|
|
|
|
else { this.$el.removeClass("editable"); }
|
|
|
|
|
|
|
|
this.delegateEvents();
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
remove: Backgrid.Extension.DependentCell.prototype.remove
|
|
|
|
});
|
|
|
|
|
2015-10-28 17:06:09 +00:00
|
|
|
return Backgrid;
|
|
|
|
|
|
|
|
}));
|