import {Component} from './component';
-import {findTargetNodeAndOffset, getLoading, hashElement, htmlToDom} from '../services/dom.ts';
+import {getLoading, htmlToDom} from '../services/dom.ts';
import {buildForInput} from '../wysiwyg-tinymce/config';
-import {el} from "../wysiwyg/utils/dom";
export class PageComment extends Component {
protected commentId: string;
protected commentLocalId: string;
- protected commentContentRef: string;
protected deletedText: string;
protected updatedText: string;
+ protected archiveText: string;
protected wysiwygEditor: any = null;
protected wysiwygLanguage: string;
protected editButton: HTMLElement;
protected deleteButton: HTMLElement;
protected replyButton: HTMLElement;
+ protected archiveButton: HTMLElement;
protected input: HTMLInputElement;
setup() {
// Options
this.commentId = this.$opts.commentId;
this.commentLocalId = this.$opts.commentLocalId;
- this.commentContentRef = this.$opts.commentContentRef;
this.deletedText = this.$opts.deletedText;
- this.updatedText = this.$opts.updatedText;
+ this.deletedText = this.$opts.deletedText;
+ this.archiveText = this.$opts.archiveText;
// Editor reference and text options
this.wysiwygLanguage = this.$opts.wysiwygLanguage;
this.editButton = this.$refs.editButton;
this.deleteButton = this.$refs.deleteButton;
this.replyButton = this.$refs.replyButton;
+ this.archiveButton = this.$refs.archiveButton;
this.input = this.$refs.input as HTMLInputElement;
this.setupListeners();
- this.positionForReference();
}
protected setupListeners(): void {
if (this.deleteButton) {
this.deleteButton.addEventListener('click', this.delete.bind(this));
}
+
+ if (this.archiveButton) {
+ this.archiveButton.addEventListener('click', this.archive.bind(this));
+ }
}
protected toggleEditMode(show: boolean) : void {
await window.$http.delete(`/comment/${this.commentId}`);
this.$emit('delete');
- this.container.closest('.comment-branch').remove();
+ this.container.closest('.comment-branch')?.remove();
window.$events.success(this.deletedText);
}
+ protected async archive(): Promise<void> {
+ this.showLoading();
+ const isArchived = this.archiveButton.dataset.isArchived === 'true';
+
+ await window.$http.put(`/comment/${this.commentId}/${isArchived ? 'unarchive' : 'archive'}`);
+ this.$emit('archive');
+ window.$events.success(this.archiveText);
+ }
+
protected showLoading(): HTMLElement {
const loading = getLoading();
loading.classList.add('px-l');
this.container.append(loading);
return loading;
}
-
- protected positionForReference() {
- if (!this.commentContentRef) {
- return;
- }
-
- const [refId, refHash, refRange] = this.commentContentRef.split(':');
- const refEl = document.getElementById(refId);
- if (!refEl) {
- // TODO - Show outdated marker for comment
- return;
- }
-
- const actualHash = hashElement(refEl);
- if (actualHash !== refHash) {
- // TODO - Show outdated marker for comment
- return;
- }
-
- const refElBounds = refEl.getBoundingClientRect();
- let bounds = refElBounds;
- const [rangeStart, rangeEnd] = refRange.split('-');
- if (rangeStart && rangeEnd) {
- const range = new Range();
- const relStart = findTargetNodeAndOffset(refEl, Number(rangeStart));
- const relEnd = findTargetNodeAndOffset(refEl, Number(rangeEnd));
- if (relStart && relEnd) {
- range.setStart(relStart.node, relStart.offset);
- range.setEnd(relEnd.node, relEnd.offset);
- bounds = range.getBoundingClientRect();
- }
- }
-
- const relLeft = bounds.left - refElBounds.left;
- const relTop = bounds.top - refElBounds.top;
- // TODO - Extract to class, Use theme color
- const marker = el('div', {
- class: 'content-comment-highlight',
- style: `left: ${relLeft}px; top: ${relTop}px; width: ${bounds.width}px; height: ${bounds.height}px;`
- }, ['']);
-
- refEl.style.position = 'relative';
- refEl.append(marker);
- }
}