ldx-widgets
Version:
widgets
111 lines (107 loc) • 3.52 kB
JavaScript
(function() {
var sortBy;
sortBy = require('lodash/sortBy');
module.exports = {
getInitialState: function() {
return {
selectedItems: [],
startingPointItem: {
index: 2e308
}
};
},
getSelectedItemIndex: function(id) {
var i, index, item, len, ref;
ref = this.state.selectedItems;
for (index = i = 0, len = ref.length; i < len; index = ++i) {
item = ref[index];
if (item.id === id) {
return index;
}
}
},
clearSelections: function() {
return this.setState({
selectedItems: []
});
},
selectItem: function(item, e, cb) {
var id, index, itemIndex, ref, selectedItems, sortedSelectedItems, startingPointItem, state;
if (e == null) {
e = {};
}
id = item.id, index = item.index;
ref = this.state, startingPointItem = ref.startingPointItem, selectedItems = ref.selectedItems;
itemIndex = this.getSelectedItemIndex(id);
state = {};
if (typeof e.preventDefault === "function") {
e.preventDefault();
}
if (typeof e.persist === "function") {
e.persist();
}
if (e.shiftKey) {
return this.groupSelectItems(item);
}
if (!(e.metaKey || e.ctrlKey)) {
selectedItems = [];
}
if (!selectedItems.length) {
state.startingPointItem = item;
} else if (selectedItems.length && index < startingPointItem.index) {
state.startingPointItem = item;
}
if ((e.metaKey || e.ctrlKey) && itemIndex > -1) {
selectedItems.splice(itemIndex, 1);
sortedSelectedItems = sortBy(selectedItems, 'index');
if (index === startingPointItem.index) {
state.startingPointItem = sortedSelectedItems[0];
}
} else {
selectedItems.push(item);
}
state.selectedItems = selectedItems;
return this.setState(state, function() {
return typeof cb === "function" ? cb(e.clientX, e.clientY) : void 0;
});
},
groupSelectItems: function(item) {
var i, id, index, j, len, record, records, ref, ref1, ref2, selectedItems, startingPointItem;
id = item.id, index = item.index;
ref = this.state, startingPointItem = ref.startingPointItem, selectedItems = ref.selectedItems;
records = this.props.records || this.records;
if (startingPointItem.id != null) {
selectedItems = [];
selectedItems.push(startingPointItem);
if (index < startingPointItem.index) {
ref1 = records.slice(index, +startingPointItem.index + 1 || 9e9);
for (i = ref1.length - 1; i >= 0; i += -1) {
record = ref1[i];
if (record.id !== startingPointItem.id) {
selectedItems.push({
id: record.id,
index: index,
record: record
});
}
}
} else if (index > startingPointItem.index) {
ref2 = records.slice(startingPointItem.index, +index + 1 || 9e9);
for (j = 0, len = ref2.length; j < len; j++) {
record = ref2[j];
if (record.id !== startingPointItem.id) {
selectedItems.push({
id: record.id,
index: index,
record: record
});
}
}
}
return this.setState({
selectedItems: selectedItems
});
}
}
};
}).call(this);