gitlab-ce/app/assets/javascripts/work_items/notes/collapse_utils.js

93 lines
2.9 KiB
JavaScript

import { DESCRIPTION_TYPE, TIME_DIFFERENCE_VALUE } from '~/notes/constants';
/**
* Checks the time difference between two notes from their 'created_at' dates
* returns an integer
*/
export const getTimeDifferenceInMinutes = (noteBeginning, noteEnd) => {
const descriptionNoteBegin = new Date(noteBeginning.createdAt);
const descriptionNoteEnd = new Date(noteEnd.createdAt);
const timeDifferenceMinutes = (descriptionNoteEnd - descriptionNoteBegin) / 1000 / 60;
return Math.ceil(timeDifferenceMinutes);
};
/**
* Checks if a note is a system note and if the content is description
*
* @param {Object} note
* @returns {Boolean}
*/
export const isDescriptionSystemNote = (note) => {
return note.system && note.body === DESCRIPTION_TYPE;
};
/**
* Collapses the system notes of a description type, e.g. Changed the description, n minutes ago
* the notes will collapse as long as they happen no more than 10 minutes away from each away
* in between the notes can be anything, another type of system note
* (such as 'changed the weight') or a comment.
*
* @param {Array} notes
* @returns {Array}
*/
export const collapseSystemNotes = (notes) => {
let lastDescriptionSystemNote = null;
let lastDescriptionSystemNoteIndex = -1;
return notes.reduce((acc, currentNote) => {
const note = currentNote.notes.nodes[0];
let lastStartVersionId = '';
if (isDescriptionSystemNote(note)) {
// is it the first one?
if (!lastDescriptionSystemNote) {
lastDescriptionSystemNote = note;
} else {
const timeDifferenceMinutes = getTimeDifferenceInMinutes(lastDescriptionSystemNote, note);
// are they less than 10 minutes apart from the same user?
if (
timeDifferenceMinutes > TIME_DIFFERENCE_VALUE ||
note.author.id !== lastDescriptionSystemNote.author.id ||
lastDescriptionSystemNote.systemNoteMetadata.descriptionVersion?.deleted
) {
// update the previous system note
lastDescriptionSystemNote = note;
} else {
// set the first version to fetch grouped system note versions
lastStartVersionId = lastDescriptionSystemNote.systemNoteMetadata.descriptionVersion?.id;
// delete the previous one
acc.splice(lastDescriptionSystemNoteIndex, 1);
}
}
// update the previous system note index
lastDescriptionSystemNoteIndex = acc.length;
acc.push({
notes: {
nodes: [
{
...note,
systemNoteMetadata: {
...note.systemNoteMetadata,
descriptionVersion: {
...note.systemNoteMetadata.descriptionVersion,
startVersionId: lastStartVersionId,
},
},
},
],
},
});
} else {
acc.push(currentNote);
}
return acc;
}, []);
};