| /** |
| * @license |
| * Copyright (C) 2017 The Android Open Source Project |
| * |
| * 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. |
| */ |
| (function() { |
| 'use strict'; |
| |
| Polymer({ |
| is: 'gr-diff-comment-thread-group', |
| |
| properties: { |
| changeNum: String, |
| projectName: String, |
| patchForNewThreads: String, |
| range: Object, |
| isOnParent: { |
| type: Boolean, |
| value: false, |
| }, |
| parentIndex: { |
| type: Number, |
| value: null, |
| }, |
| threads: { |
| type: Array, |
| value() { return []; }, |
| }, |
| }, |
| |
| get threadEls() { |
| return Polymer.dom(this.root).querySelectorAll('gr-diff-comment-thread'); |
| }, |
| |
| /** |
| * Adds a new thread. Range is optional because a comment can be |
| * added to a line without a range selected. |
| * |
| * @param {!Object} opt_range |
| */ |
| addNewThread(commentSide, opt_range) { |
| this.push('threads', { |
| comments: [], |
| commentSide, |
| patchNum: this.patchForNewThreads, |
| range: opt_range, |
| }); |
| }, |
| |
| removeThread(rootId) { |
| for (let i = 0; i < this.threads.length; i++) { |
| if (this.threads[i].rootId === rootId) { |
| this.splice('threads', i, 1); |
| return; |
| } |
| } |
| }, |
| |
| /** |
| * Fetch the thread group at the given range, or the range-less thread |
| * on the line if no range is provided, lineNum, and side. |
| * |
| * @param {string} side |
| * @param {!Object=} opt_range |
| * @return {!Object|undefined} |
| */ |
| getThread(side, opt_range) { |
| const threads = [].filter.call(this.threadEls, |
| thread => this._rangesEqual(thread.range, opt_range)) |
| .filter(thread => thread.commentSide === side); |
| if (threads.length === 1) { |
| return threads[0]; |
| } |
| }, |
| |
| _handleThreadDiscard(e) { |
| this.removeThread(e.detail.rootId); |
| }, |
| |
| /** |
| * Compare two ranges. Either argument may be falsy, but will only return |
| * true if both are falsy or if neither are falsy and have the same position |
| * values. |
| * |
| * @param {Object=} a range 1 |
| * @param {Object=} b range 2 |
| * @return {boolean} |
| */ |
| _rangesEqual(a, b) { |
| if (!a && !b) { return true; } |
| if (!a || !b) { return false; } |
| return a.startLine === b.startLine && |
| a.startChar === b.startChar && |
| a.endLine === b.endLine && |
| a.endChar === b.endChar; |
| }, |
| |
| _sortByDate(threadGroups) { |
| if (!threadGroups.length) { return; } |
| return threadGroups.sort((a, b) => { |
| // If a comment is a draft, it doesn't have a start_datetime yet. |
| // Assume it is newer than the comment it is being compared to. |
| if (!a.start_datetime) { |
| return 1; |
| } |
| if (!b.start_datetime) { |
| return -1; |
| } |
| return util.parseDate(a.start_datetime) - |
| util.parseDate(b.start_datetime); |
| }); |
| }, |
| |
| _calculateLocationRange(range, comment) { |
| return 'range-' + range.start_line + '-' + |
| range.start_character + '-' + |
| range.end_line + '-' + |
| range.end_character + '-' + |
| comment.__commentSide; |
| }, |
| }); |
| })(); |