UNPKG

@senx/warpview-editor

Version:

WarpView Editor Elements

105 lines 13.5 kB
/* * Copyright 2020-2022 SenX S.A.S. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import { v4 } from 'uuid'; export function commentReducer(event, state) { const dirtyLineNumbers = new Set(); const deletedCommentIds = new Set(); const dirtyCommentIds = new Set(); let comments = { ...state.comments }; switch (event.type) { case 'edit': const parent = comments[event.targetId]; if (!parent) { break; } const edit = { comment: { ...parent.comment, author: event.createdBy, dt: event.createdAt, text: event.text, }, history: parent.history.concat(parent.comment), }; dirtyLineNumbers.add(edit.comment.lineNumber); console.debug('edit', event); comments[event.targetId] = edit; break; case 'delete': const selected = comments[event.targetId]; if (!selected) { break; } delete comments[event.targetId]; deletedCommentIds.add(selected.comment.id); dirtyLineNumbers.add(selected.comment.lineNumber); console.debug('delete', event); break; case 'create': if (!comments[event.id]) { comments[event.id] = new ReviewCommentState({ author: event.createdBy, dt: event.createdAt, id: event.id, lineNumber: event.lineNumber, selection: event.selection, text: event.text, parentId: event.targetId, status: ReviewCommentStatus.active, }); console.debug('insert', event); dirtyLineNumbers.add(event.lineNumber); } break; } if (dirtyLineNumbers.size) { for (const cs of Object.values(state.comments)) { if (dirtyLineNumbers.has(cs.comment.lineNumber)) { dirtyCommentIds.add(cs.comment.id); } } } return { comments, dirtyCommentIds, deletedCommentIds }; } export class ReviewCommentState { constructor(comment) { this.comment = comment; this.history = [comment]; } } export var ReviewCommentRenderState; (function (ReviewCommentRenderState) { ReviewCommentRenderState[ReviewCommentRenderState["dirty"] = 1] = "dirty"; ReviewCommentRenderState[ReviewCommentRenderState["hidden"] = 2] = "hidden"; ReviewCommentRenderState[ReviewCommentRenderState["normal"] = 3] = "normal"; })(ReviewCommentRenderState || (ReviewCommentRenderState = {})); export var ReviewCommentStatus; (function (ReviewCommentStatus) { ReviewCommentStatus[ReviewCommentStatus["active"] = 1] = "active"; ReviewCommentStatus[ReviewCommentStatus["deleted"] = 2] = "deleted"; ReviewCommentStatus[ReviewCommentStatus["edit"] = 3] = "edit"; })(ReviewCommentStatus || (ReviewCommentStatus = {})); export function reduceComments(actions, state = null) { state = state || { comments: {} }; for (const a of actions) { if (!a.id) { a.id = v4(); } state = commentReducer(a, state); } return state; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLWNvbW1lbnRzLXJlZHVjZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvd2FycHZpZXctZWRpdG9yLW5nL3NyYy9saWIvZWxlbWVudHMvd2FycC12aWV3LWVkaXRvci9wcm92aWRlcnMvZXZlbnRzLWNvbW1lbnRzLXJlZHVjZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBRUgsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQTBCeEIsTUFBTSxVQUFVLGNBQWMsQ0FBQyxLQUF5QixFQUFFLEtBQW1CO0lBQzNFLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUMzQyxNQUFNLGlCQUFpQixHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDNUMsTUFBTSxlQUFlLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUMxQyxJQUFJLFFBQVEsR0FBRyxFQUFDLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBQyxDQUFDO0lBRW5DLFFBQVEsS0FBSyxDQUFDLElBQUksRUFBRTtRQUNsQixLQUFLLE1BQU07WUFDVCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3hDLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ1gsTUFBTTthQUNQO1lBRUQsTUFBTSxJQUFJLEdBQXVCO2dCQUMvQixPQUFPLEVBQUU7b0JBQ1AsR0FBRyxNQUFNLENBQUMsT0FBTztvQkFDakIsTUFBTSxFQUFFLEtBQUssQ0FBQyxTQUFTO29CQUN2QixFQUFFLEVBQUUsS0FBSyxDQUFDLFNBQVM7b0JBQ25CLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtpQkFDakI7Z0JBQ0QsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7YUFDL0Ms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N0IsUUFBc0IsSUFBSTtJQUUxQixLQUFLLEdBQUcsS0FBSyxJQUFJLEVBQUMsUUFBUSxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBRWhDLEtBQUssTUFBTSxDQUFDLElBQUksT0FBTyxFQUFFO1FBQ3ZCLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ1QsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQztTQUNiO1FBQ0QsS0FBSyxHQUFHLGNBQWMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7S0FDbEM7SUFFRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogIENvcHlyaWdodCAyMDIwLTIwMjIgU2VuWCBTLkEuUy5cbiAqXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7djR9IGZyb20gJ3V1aWQnO1xuXG5leHBvcnQgdHlwZSBDb21tb25GaWVsZHMgPSB7XG4gIGlkPzogc3RyaW5nO1xuICB0YXJnZXRJZD86IHN0cmluZztcbiAgY3JlYXRlZEJ5Pzogc3RyaW5nO1xuICBjcmVhdGVkQXQ/OiBEYXRlIHwgc3RyaW5nO1xuICAvLyBzY3JpcHQgb24gaGVyZSBtYXliZT9cbn07XG5cbmV4cG9ydCB0eXBlIFJldmlld0NvbW1lbnRFdmVudCA9XG4gIHwgKHtcbiAgdHlwZTogJ2NyZWF0ZSc7XG4gIGxpbmVOdW1iZXI6IG51bWJlcjtcbiAgdGV4dDogc3RyaW5nO1xuICBzZWxlY3Rpb24/OiBDb2RlU2VsZWN0aW9uO1xufSAmIENvbW1vbkZpZWxkcylcbiAgfCAoeyB0eXBlOiAnZWRpdCc7IHRleHQ6IHN0cmluZyB9ICYgQ29tbW9uRmllbGRzKVxuICB8ICh7IHR5cGU6ICdkZWxldGUnIH0gJiBDb21tb25GaWVsZHMpO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbW1lbnRTdGF0ZSB7XG4gIGNvbW1lbnRzOiBSZWNvcmQ8c3RyaW5nLCBSZXZpZXdDb21tZW50U3RhdGU+O1xuICBkZWxldGVkQ29tbWVudElkcz86IFNldDxzdHJpbmc+O1xuICBkaXJ0eUNvbW1lbnRJZHM/OiBTZXQ8c3RyaW5nPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbW1lbnRSZWR1Y2VyKGV2ZW50OiBSZXZpZXdDb21tZW50RXZlbnQsIHN0YXRlOiBDb21tZW50U3RhdGUpIHtcbiAgY29uc3QgZGlydHlMaW5lTnVtYmVycyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICBjb25zdCBkZWxldGVkQ29tbWVudElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBkaXJ0eUNvbW1lbnRJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgbGV0IGNvbW1lbnRzID0gey4uLnN0YXRlLmNvbW1lbnRzfTtcblxuICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcbiAgICBjYXNlICdlZGl0JzpcbiAgICAgIGNvbnN0IHBhcmVudCA9IGNvbW1lbnRzW2V2ZW50LnRhcmdldElkXTtcbiAgICAgIGlmICghcGFyZW50KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlZGl0OiBSZXZpZXdDb21tZW50U3RhdGUgPSB7XG4gICAgICAgIGNvbW1lbnQ6IHtcbiAgICAgICAgICAuLi5wYXJlbnQuY29tbWVudCxcbiAgICAgICAgICBhdXRob3I6IGV2ZW50LmNyZWF0ZWRCeSxcbiAgICAgICAgICBkdDogZXZlbnQuY3JlYXRlZEF0LFxuICAgICAgICAgIHRleHQ6IGV2ZW50LnRleHQsXG4gICAgICAgIH0sXG4gICAgICAgIGhpc3Rvcnk6IHBhcmVudC5oaXN0b3J5LmNvbmNhdChwYXJlbnQuY29tbWVudCksXG4gICAgICB9O1xuXG4gICAgICBkaXJ0eUxpbmVOdW1iZXJzLmFkZChlZGl0LmNvbW1lbnQubGluZU51bWJlcik7XG4gICAgICBjb25zb2xlLmRlYnVnKCdlZGl0JywgZXZlbnQpO1xuXG4gICAgICBjb21tZW50c1tldmVudC50YXJnZXRJZF0gPSBlZGl0O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdkZWxldGUnOlxuICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBjb21tZW50c1tldmVudC50YXJnZXRJZF07XG4gICAgICBpZiAoIXNlbGVjdGVkKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBkZWxldGUgY29tbWVudHNbZXZlbnQudGFyZ2V0SWRdO1xuXG4gICAgICBkZWxldGVkQ29tbWVudElkcy5hZGQoc2VsZWN0ZWQuY29tbWVudC5pZCk7XG4gICAgICBkaXJ0eUxpbmVOdW1iZXJzLmFkZChzZWxlY3RlZC5jb21tZW50LmxpbmVOdW1iZXIpO1xuICAgICAgY29uc29sZS5kZWJ1ZygnZGVsZXRlJywgZXZlbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdjcmVhdGUnOlxuICAgICAgaWYgKCFjb21tZW50c1tldmVudC5pZF0pIHtcbiAgICAgICAgY29tbWVudHNbZXZlbnQuaWRdID0gbmV3IFJldmlld0NvbW1lbnRTdGF0ZSh7XG4gICAgICAgICAgYXV0aG9yOiBldmVudC5jcmVhdGVkQnksXG4gICAgICAgICAgZHQ6IGV2ZW50LmNyZWF0ZWRBdCxcbiAgICAgICAgICBpZDogZXZlbnQuaWQsXG4gICAgICAgICAgbGluZU51bWJlcjogZXZlbnQubGluZU51bWJlcixcbiAgICAgICAgICBzZWxlY3Rpb246IGV2ZW50LnNlbGVjdGlvbixcbiAgICAgICAgICB0ZXh0OiBldmVudC50ZXh0LFxuICAgICAgICAgIHBhcmVudElkOiBldmVudC50YXJnZXRJZCxcbiAgICAgICAgICBzdGF0dXM6IFJldmlld0NvbW1lbnRTdGF0dXMuYWN0aXZlLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc29sZS5kZWJ1ZygnaW5zZXJ0JywgZXZlbnQpO1xuICAgICAgICBkaXJ0eUxpbmVOdW1iZXJzLmFkZChldmVudC5saW5lTnVtYmVyKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgaWYgKGRpcnR5TGluZU51bWJlcnMuc2l6ZSkge1xuICAgIGZvciAoY29uc3QgY3Mgb2YgT2JqZWN0LnZhbHVlcyhzdGF0ZS5jb21tZW50cykpIHtcbiAgICAgIGlmIChkaXJ0eUxpbmVOdW1iZXJzLmhhcyhjcy5jb21tZW50LmxpbmVOdW1iZXIpKSB7XG4gICAgICAgIGRpcnR5Q29tbWVudElkcy5hZGQoY3MuY29tbWVudC5pZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtjb21tZW50cywgZGlydHlDb21tZW50SWRzLCBkZWxldGVkQ29tbWVudElkc307XG59XG5cbmV4cG9ydCBjbGFzcyBSZXZpZXdDb21tZW50U3RhdGUge1xuICBjb21tZW50OiBSZXZpZXdDb21tZW50O1xuICBoaXN0b3J5OiBSZXZpZXdDb21tZW50W107XG5cbiAgY29uc3RydWN0b3IoY29tbWVudDogUmV2aWV3Q29tbWVudCkge1xuICAgIHRoaXMuY29tbWVudCA9IGNvbW1lbnQ7XG4gICAgdGhpcy5oaXN0b3J5ID0gW2NvbW1lbnRdO1xuICB9XG59XG5cbmV4cG9ydCBlbnVtIFJldmlld0NvbW1lbnRSZW5kZXJTdGF0ZSB7XG4gIGRpcnR5ID0gMSxcbiAgaGlkZGVuID0gMixcbiAgbm9ybWFsID0gMyxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb2RlU2VsZWN0aW9uIHtcbiAgc3RhcnRDb2x1bW46IG51bWJlcjtcbiAgZW5kQ29sdW1uOiBudW1iZXI7XG4gIHN0YXJ0TGluZU51bWJlcjogbnVtYmVyO1xuICBlbmRMaW5lTnVtYmVyOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmV2aWV3Q29tbWVudCB7XG4gIGlkOiBzdHJpbmc7XG4gIHBhcmVudElkPzogc3RyaW5nO1xuICBhdXRob3I6IHN0cmluZztcbiAgZHQ6IERhdGUgfCBzdHJpbmc7XG4gIGxpbmVOdW1iZXI6IG51bWJlcjtcbiAgdGV4dDogc3RyaW5nO1xuICBzZWxlY3Rpb246IENvZGVTZWxlY3Rpb247XG4gIHN0YXR1czogUmV2aWV3Q29tbWVudFN0YXR1cztcbn1cblxuZXhwb3J0IGVudW0gUmV2aWV3Q29tbWVudFN0YXR1cyB7XG4gIGFjdGl2ZSA9IDEsXG4gIGRlbGV0ZWQgPSAyLFxuICBlZGl0ID0gMyxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlZHVjZUNvbW1lbnRzKFxuICBhY3Rpb25zOiBSZXZpZXdDb21tZW50RXZlbnRbXSxcbiAgc3RhdGU6IENvbW1lbnRTdGF0ZSA9IG51bGxcbikge1xuICBzdGF0ZSA9IHN0YXRlIHx8IHtjb21tZW50czoge319O1xuXG4gIGZvciAoY29uc3QgYSBvZiBhY3Rpb25zKSB7XG4gICAgaWYgKCFhLmlkKSB7XG4gICAgICBhLmlkID0gdjQoKTtcbiAgICB9XG4gICAgc3RhdGUgPSBjb21tZW50UmVkdWNlcihhLCBzdGF0ZSk7XG4gIH1cblxuICByZXR1cm4gc3RhdGU7XG59XG4iXX0=