diff --git a/apps/spreadsheeteditor/main/app/view/PivotSettings.js b/apps/spreadsheeteditor/main/app/view/PivotSettings.js
index aa05097ba..cad6fdc1b 100644
--- a/apps/spreadsheeteditor/main/app/view/PivotSettings.js
+++ b/apps/spreadsheeteditor/main/app/view/PivotSettings.js
@@ -113,12 +113,16 @@ define([
'',
'<% } %>',
'',
- '
<%= Common.Utils.String.htmlEncode(value) %>
',
+ '<%= Common.Utils.String.htmlEncode(value) %>
',
'',
''
].join(''))
});
this.fieldsList.on('item:click', _.bind(this.onFieldsCheck, this));
+ this.fieldsList.$el.on('dragenter', _.bind(this.onDragEnter, this));
+ this.fieldsList.$el.on('dragover', _.bind(this.onDragOver, this, this.fieldsList));
+ this.fieldsList.$el.on('dragleave', _.bind(this.onDragLeave, this, this.fieldsList));
+ this.fieldsList.$el.on('drop', _.bind(this.onDrop, this));
// this.fieldsList.onKeyDown = _.bind(this.onFieldsListKeyDown, this);
this.lockedControls.push(this.fieldsList);
@@ -126,7 +130,7 @@ define([
var itemTemplate = _.template([
'',
- '
<%= Common.Utils.String.htmlEncode(value) %>
',
+ '
<%= Common.Utils.String.htmlEncode(value) %>
',
'
',
'
'
].join(''));
@@ -138,6 +142,10 @@ define([
itemTemplate: itemTemplate
});
this.columnsList.on('item:click', _.bind(this.onColumnsSelect, this, 0));
+ this.columnsList.$el.on('dragenter', _.bind(this.onDragEnter, this));
+ this.columnsList.$el.on('dragover', _.bind(this.onDragOver, this, this.columnsList));
+ this.columnsList.$el.on('dragleave', _.bind(this.onDragLeave, this, this.columnsList));
+ this.columnsList.$el.on('drop', _.bind(this.onDrop, this));
// this.columnsList.onKeyDown = _.bind(this.onColumnsListKeyDown, this);
this.lockedControls.push(this.columnsList);
@@ -149,6 +157,10 @@ define([
itemTemplate: itemTemplate
});
this.rowsList.on('item:click', _.bind(this.onColumnsSelect, this, 1));
+ this.rowsList.$el.on('dragenter', _.bind(this.onDragEnter, this));
+ this.rowsList.$el.on('dragover', _.bind(this.onDragOver, this, this.rowsList));
+ this.rowsList.$el.on('dragleave', _.bind(this.onDragLeave, this, this.rowsList));
+ this.rowsList.$el.on('drop', _.bind(this.onDrop, this));
// this.rowsList.onKeyDown = _.bind(this.onRowsListKeyDown, this);
this.lockedControls.push(this.rowsList);
@@ -160,6 +172,10 @@ define([
itemTemplate: itemTemplate
});
this.valuesList.on('item:click', _.bind(this.onColumnsSelect, this, 2));
+ this.valuesList.$el.on('dragenter', _.bind(this.onDragEnter, this));
+ this.valuesList.$el.on('dragover', _.bind(this.onDragOver, this, this.valuesList));
+ this.valuesList.$el.on('dragleave', _.bind(this.onDragLeave, this, this.valuesList));
+ this.valuesList.$el.on('drop', _.bind(this.onDrop, this));
// this.valuesList.onKeyDown = _.bind(this.onValuesListKeyDown, this);
this.lockedControls.push(this.valuesList);
@@ -171,6 +187,10 @@ define([
itemTemplate: itemTemplate
});
this.filtersList.on('item:click', _.bind(this.onColumnsSelect, this,3));
+ this.filtersList.$el.on('dragenter', _.bind(this.onDragEnter, this));
+ this.filtersList.$el.on('dragover', _.bind(this.onDragOver, this, this.filtersList));
+ this.filtersList.$el.on('dragleave', _.bind(this.onDragLeave, this, this.filtersList));
+ this.filtersList.$el.on('drop', _.bind(this.onDrop, this));
// this.filtersList.onKeyDown = _.bind(this.onFiltersListKeyDown, this);
this.lockedControls.push(this.filtersList);
@@ -179,6 +199,119 @@ define([
this._initSettings = false;
},
+ onFieldsDragStart: function (item, index, event) {
+ event.originalEvent.dataTransfer.effectAllowed = 'move';
+ event.originalEvent.dataTransfer.setDragImage(item.$el.find('.list-item span')[0], 14, 14);
+ this.pivotIndex = index;
+ this.fromListView = this.fieldsList.$el[0].id;
+ },
+
+ onItemsDragStart: function (listview, item, index, event) {
+ event.originalEvent.dataTransfer.effectAllowed = 'move';
+ event.originalEvent.dataTransfer.setDragImage(item.$el.find('.list-item span')[0], 14, 14);
+ this.itemIndex = index;
+ this.pivotIndex = listview.store.at(index).attributes.pivotIndex;
+ this.fromListView = listview.$el[0].id;
+ },
+
+ onDragItemEnter: function (item, index, event) {
+ event.preventDefault();
+ item.$el.css({'border-top-color': '#b7b7b7'});
+ this.indexMoveTo = index;
+ },
+
+ onDragItemLeave: function (item, index, event) {
+ item.$el.css({'border-top-color': '#fafafa'});
+ this.indexMoveTo = undefined;
+ },
+
+ onDragItemOver: function (item, index, event) {
+ if (this.pivotIndex === -2 && (this.enterListView === 'pivot-list-filters' || this.enterListView === 'pivot-list-values')) {
+ event.originalEvent.dataTransfer.dropEffect = 'none';
+ } else {
+ event.preventDefault(); // Necessary. Allows us to drop.
+ event.originalEvent.dataTransfer.dropEffect = 'move';
+ item.$el.css({'border-top-color': '#b7b7b7'});
+ this.indexMoveTo = index;
+ return false;
+ }
+ },
+
+ onDragEnter: function (event) {
+ this.enterListView = event.currentTarget.id;
+ },
+
+ onDragOver: function (listview, event) {
+ if ((this.pivotIndex === -2 && (this.enterListView === 'pivot-list-filters' || this.enterListView === 'pivot-list-values')) ||
+ (this.fromListView === 'pivot-list-fields' && this.enterListView === 'pivot-list-fields')) {
+ event.originalEvent.dataTransfer.dropEffect = 'none';
+ } else {
+ event.preventDefault(); // Necessary. Allows us to drop.
+ event.originalEvent.dataTransfer.dropEffect = 'move';
+ listview.$el.find('.item').last().css({'border-bottom-color': '#b7b7b7'});
+ return false;
+ }
+ },
+
+ onDragLeave: function (listview, event) {
+ listview.$el.find('.item').css({'border-top-color': '#fafafa', 'border-bottom-color': '#ddd'});
+ },
+
+ onDrop: function (event) {
+ event.stopPropagation(); // Stops some browsers from redirecting.
+ if (this.enterListView === 'pivot-list-fields') {
+ if (_.isNumber(this.pivotIndex)) {
+ if (this.fromListView === 'pivot-list-values' && _.isNumber(this.itemIndex)) {
+ this.onRemove(this.pivotIndex, this.itemIndex);
+ } else {
+ this.onRemove(this.pivotIndex);
+ }
+ }
+ } else if (this.fromListView === this.enterListView) {
+ if (_.isNumber(this.itemIndex)) {
+ if (this.enterListView === 'pivot-list-columns') {
+ this.onMove(0, this.itemIndex, this.indexMoveTo);
+ } else if (this.enterListView === 'pivot-list-rows') {
+ this.onMove(1, this.itemIndex, this.indexMoveTo);
+ } else if (this.enterListView === 'pivot-list-filters') {
+ this.onMove(3, this.itemIndex, this.indexMoveTo);
+ } else if (this.enterListView === 'pivot-list-values') {
+ this.onMove(2, this.itemIndex, this.indexMoveTo);
+ }
+ this.itemIndex = undefined;
+ }
+ } else {
+ if (_.isNumber(this.pivotIndex)) {
+ if (this.enterListView === 'pivot-list-columns') {
+ if (this.pivotIndex === -2) {
+ this.onMoveTo(0, this.pivotIndex, this.indexMoveTo);
+ } else {
+ this.onAddColumn(this.pivotIndex, this.indexMoveTo);
+ }
+ } else if (this.enterListView === 'pivot-list-rows') {
+ if (this.pivotIndex === -2) {
+ this.onMoveTo(1, this.pivotIndex, this.indexMoveTo);
+ } else {
+ this.onAddRow(this.pivotIndex, this.indexMoveTo);
+ }
+ } else if (this.enterListView === 'pivot-list-filters') {
+ if (this.pivotIndex === -2) {
+ this.onMoveTo(3, this.pivotIndex, this.indexMoveTo);
+ } else {
+ this.onAddFilter(this.pivotIndex, this.indexMoveTo);
+ }
+ } else if (this.enterListView === 'pivot-list-values') {
+ if (this.pivotIndex === -2) {
+ this.onMoveTo(2, this.pivotIndex, this.indexMoveTo);
+ } else {
+ this.onAddValues(this.pivotIndex, this.indexMoveTo);
+ }
+ }
+ this.pivotIndex = undefined;
+ }
+ }
+ },
+
openAdvancedSettings: function(e) {
if (this.linkAdvanced.hasClass('disabled')) return;
@@ -314,6 +447,43 @@ define([
});
this.fieldsList.store.reset(arr);
this.fieldsList.scroller.update({minScrollbarLength : 40, alwaysVisibleY: true, suppressScrollX: true});
+
+ this.fieldsList.dataViewItems.forEach(function (item, index) {
+ item.$el.attr('draggable', true);
+ item.$el.on('dragstart', _.bind(me.onFieldsDragStart, me, item, index));
+ });
+ this.columnsList.dataViewItems.forEach(function (item, index) {
+ item.$el.attr('draggable', true);
+ item.$el.on('dragstart', _.bind(me.onItemsDragStart, me, me.columnsList, item, index));
+ item.$el.on('dragenter', _.bind(me.onDragItemEnter, me, item, index));
+ item.$el.on('dragleave', _.bind(me.onDragItemLeave, me, item, index));
+ item.$el.on('dragover', _.bind(me.onDragItemOver, me, item, index));
+ item.$el.on('drop', _.bind(me.onDrop, me));
+ });
+ this.rowsList.dataViewItems.forEach(function (item, index) {
+ item.$el.attr('draggable', true);
+ item.$el.on('dragstart', _.bind(me.onItemsDragStart, me, me.rowsList, item, index));
+ item.$el.on('dragenter', _.bind(me.onDragItemEnter, me, item, index));
+ item.$el.on('dragleave', _.bind(me.onDragItemLeave, me, item, index));
+ item.$el.on('dragover', _.bind(me.onDragItemOver, me, item, index));
+ item.$el.on('drop', _.bind(me.onDrop, me));
+ });
+ this.valuesList.dataViewItems.forEach(function (item, index) {
+ item.$el.attr('draggable', true);
+ item.$el.on('dragstart', _.bind(me.onItemsDragStart, me, me.valuesList, item, index));
+ item.$el.on('dragenter', _.bind(me.onDragItemEnter, me, item, index));
+ item.$el.on('dragleave', _.bind(me.onDragItemLeave, me, item, index));
+ item.$el.on('dragover', _.bind(me.onDragItemOver, me, item, index));
+ item.$el.on('drop', _.bind(me.onDrop, me));
+ });
+ this.filtersList.dataViewItems.forEach(function (item, index) {
+ item.$el.attr('draggable', true);
+ item.$el.on('dragstart', _.bind(me.onItemsDragStart, me, me.filtersList, item, index));
+ item.$el.on('dragenter', _.bind(me.onDragItemEnter, me, item, index));
+ item.$el.on('dragleave', _.bind(me.onDragItemLeave, me, item, index));
+ item.$el.on('dragover', _.bind(me.onDragItemOver, me, item, index));
+ item.$el.on('drop', _.bind(me.onDrop, me));
+ });
}
},
@@ -633,36 +803,36 @@ define([
}
},
- onAddFilter: function() {
+ onAddFilter: function(index, moveTo) {
if (this.api && !this._locked && this._state.field){
- this._originalProps.asc_addPageField(this.api, this._state.field.record.get('index'));
+ this._originalProps.asc_addPageField(this.api, _.isNumber(index) ? index : this._state.field.record.get('index'), _.isNumber(moveTo) ? moveTo : undefined);
}
},
- onAddRow: function() {
+ onAddRow: function(index, moveTo) {
if (this.api && !this._locked && this._state.field){
- this._originalProps.asc_addRowField(this.api, this._state.field.record.get('index'));
+ this._originalProps.asc_addRowField(this.api, _.isNumber(index) ? index : this._state.field.record.get('index'), _.isNumber(moveTo) ? moveTo : undefined);
}
},
- onAddColumn: function() {
+ onAddColumn: function(index, moveTo) {
if (this.api && !this._locked && this._state.field){
- this._originalProps.asc_addColField(this.api, this._state.field.record.get('index'));
+ this._originalProps.asc_addColField(this.api, _.isNumber(index) ? index : this._state.field.record.get('index'), _.isNumber(moveTo) ? moveTo : undefined);
}
},
- onAddValues: function() {
+ onAddValues: function(index, moveTo) {
if (this.api && !this._locked && this._state.field){
- this._originalProps.asc_addDataField(this.api, this._state.field.record.get('index'));
+ this._originalProps.asc_addDataField(this.api, _.isNumber(index) ? index : this._state.field.record.get('index'), _.isNumber(moveTo) ? moveTo : undefined);
}
},
- onRemove: function() {
+ onRemove: function(pivotindex, index) {
if (this.api && !this._locked && this._state.field){
- if (this._state.field.type==2) // value
- this._originalProps.asc_removeDataField(this.api, this._state.field.record.get('pivotIndex'), this._state.field.record.get('index'));
+ if (this._state.field.type==2 || _.isNumber(index)) // value
+ this._originalProps.asc_removeDataField(this.api, _.isNumber(pivotindex) ? pivotindex : this._state.field.record.get('pivotIndex'), _.isNumber(index) ? index : this._state.field.record.get('index'));
else
- this._originalProps.asc_removeNoDataField(this.api, this._state.field.record.get('pivotIndex'));
+ this._originalProps.asc_removeNoDataField(this.api, _.isNumber(pivotindex) ? pivotindex : this._state.field.record.get('pivotIndex'));
}
},
@@ -711,10 +881,10 @@ define([
}
},
- onMoveTo: function(type) {
+ onMoveTo: function(type, pivotindex, to) {
if (this.api && !this._locked && this._state.field){
- var pivotIndex = this._state.field.record.get('pivotIndex'),
- index = (this._state.field.type==2) ? this._state.field.record.get('index') : undefined;
+ var pivotIndex = _.isNumber(pivotindex) ? pivotindex : this._state.field.record.get('pivotIndex'),
+ index = _.isNumber(to) ? to : ((this._state.field.type==2) ? this._state.field.record.get('index') : undefined);
switch (type) {
case 0:
this._originalProps.asc_moveToColField(this.api, pivotIndex, index);