Merge pull request #5759 from vector-im/luke/renumerate-broken-ordered-sublists

Implement renumeration of ordered tags upon collision
This commit is contained in:
Matthew Hodgson 2017-12-04 18:09:23 +00:00 committed by GitHub
commit 9835e2e0b4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -327,43 +327,46 @@ var RoomSubList = React.createClass({
}, },
calcManualOrderTagData: function(room) { calcManualOrderTagData: function(room) {
var index = this.state.sortedList.indexOf(room); const index = this.state.sortedList.indexOf(room);
// we sort rooms by the lexicographic ordering of the 'order' metadata on their tags. // we sort rooms by the lexicographic ordering of the 'order' metadata on their tags.
// for convenience, we calculate this for now a floating point number between 0.0 and 1.0. // for convenience, we calculate this for now a floating point number between 0.0 and 1.0.
var orderA = 0.0; // by default we're next to the beginning of the list let orderA = 0.0; // by default we're next to the beginning of the list
if (index > 0) { if (index > 0) {
var prevTag = this.state.sortedList[index - 1].tags[this.props.tagName]; const prevTag = this.state.sortedList[index - 1].tags[this.props.tagName];
if (!prevTag) { if (!prevTag) {
console.error("Previous room in sublist is not tagged to be in this list. This should never happen.") console.error("Previous room in sublist is not tagged to be in this list. This should never happen.");
} } else if (prevTag.order === undefined) {
else if (prevTag.order === undefined) {
console.error("Previous room in sublist has no ordering metadata. This should never happen."); console.error("Previous room in sublist has no ordering metadata. This should never happen.");
} } else {
else {
orderA = prevTag.order; orderA = prevTag.order;
} }
} }
var orderB = 1.0; // by default we're next to the end of the list too let orderB = 1.0; // by default we're next to the end of the list too
if (index < this.state.sortedList.length - 1) { if (index < this.state.sortedList.length - 1) {
var nextTag = this.state.sortedList[index + 1].tags[this.props.tagName]; const nextTag = this.state.sortedList[index + 1].tags[this.props.tagName];
if (!nextTag) { if (!nextTag) {
console.error("Next room in sublist is not tagged to be in this list. This should never happen.") console.error("Next room in sublist is not tagged to be in this list. This should never happen.");
} } else if (nextTag.order === undefined) {
else if (nextTag.order === undefined) {
console.error("Next room in sublist has no ordering metadata. This should never happen."); console.error("Next room in sublist has no ordering metadata. This should never happen.");
} } else {
else {
orderB = nextTag.order; orderB = nextTag.order;
} }
} }
var order = (orderA + orderB) / 2.0; const order = (orderA + orderB) / 2.0;
if (order === orderA || order === orderB) { if (order === orderA || order === orderB) {
console.error("Cannot describe new list position. This should be incredibly unlikely."); console.error("Cannot describe new list position. This should be incredibly unlikely.");
// TODO: renumber the list this.state.sortedList.forEach((room, index) => {
MatrixClientPeg.get().setRoomTag(
room.roomId, this.props.tagName,
{order: index / this.state.sortedList.length},
);
});
return index / this.state.sortedList.length;
} }
return order; return order;