///
namespace Comments {
export class Controller {
public loadUrl;
public postEndpointUrl;
private comments: CommentsContainer = new CommentsContainer;
private form: CommentForm;
private renderedCount = 0;
public constructor() {
let showAll = $('.comments__show-all');
this.renderedCount = showAll.parent().find('.comments__comment').length;
this.loadUrl = showAll.data('load-url');
showAll.on('click', this.loadComments.bind(this));
this.form = new CommentForm(this);
}
public loadComments() {
$.ajax({
url: this.loadUrl,
dataType: 'json'
}).done((function (data) {
let $button = $('.comments__show-all');
for (let i = 0; i < data.length; i++) {
if (data.hasOwnProperty(i) && !this.comments.hasId(data[i].id)) {
let comment = new Comment(data[i]);
this.comments.push(comment);
comment.rendered.insertBefore($button);
}
}
$button.remove();
}).bind(this));
}
public pushComments(data) {
for (let i = 0; i < data.length; i++) {
if (data.hasOwnProperty(i)) {
let comment = new Comment(data[i]);
this.comments.push(comment);
}
}
}
public addComment(data) {
let comment = new Comment(data);
this.comments.push(comment);
if (data.answeredTo)
comment.rendered.insertAfter($('.comments').find('[data-comment-id=' + data.answerTo + ']'));
else
comment.rendered.insertBefore($('.comments__show-all'));
}
}
class CommentsContainer {
[index: number]: Comment;
push(...args) {
return Array.prototype.push.apply(this, args);
}
hasId(id) {
let list = Object.keys(this);
for (let i in list) {
if (this.hasOwnProperty(i)) {
if (this[i].id === id) {
return true;
}
}
}
return false;
}
}
class CommentForm {
private owner;
private form: JQuery;
private formData;
constructor(owner: Controller) {
this.owner = owner;
$('.comments__add-link').on('click', this.onAddClick.bind(this));
$('.comments').on('click', '.comments__comment-reply', this.onAddClick.bind(this));
this.form = $('.comments__add-popup-form');
this.form.on('submit', this.submitFrom.bind(this));
this.formData = [];
}
private onAddClick(event) {
event.preventDefault();
$('.comments__add-error').remove();
$('.comments__add-popup').show();
$('.comments__add-back-log').show();
let target = $(event.target);
let targetId = 0;
if (target.hasClass('comments__comment-reply')) {
targetId = target.parents('.comments__comment').data('comment-id');
}
this.formData = {answerTo: targetId};
}
private submitFrom(e) {
e.preventDefault();
let data = this.form.serializeArray();
for (let i in this.form.serializeArray()) {
if (data.hasOwnProperty(i)) {
this.formData[data[i].name] = data[i].value;
}
}
$('.comments__add-error').remove();
$.ajax({
url: this.owner.postEndpointUrl,
data: {UserComments: this.formData},
dataType: 'json',
type: 'post'
}).done((function (data) {
console.dir(data);
if (data.errors) {
for (let fieldName in data.errors) {
if (data.errors.hasOwnProperty(fieldName))
$('').insertAfter(this.form.find('[name=' + fieldName + ']'));
}
} else {
//this.form.parent().find('.comments__add-popup-close').click();
this.form.html('
Ваш комментарий успешно отправлен. После одобрения модератором он появится на сайте.
');
setTimeout((function () {
this.form.parent().find('.comments__add-popup-close').click();
}).bind(this), 3000);
//this.owner.addComment(data.result);
}
}).bind(this)).fail((function (xhr) {
console.dir(xhr.responseText);
}).bind(this)).always((function () {
this.formData = [];
}).bind(this));
}
}
class Comment {
private _template: JQuery;
private _rendered: JQuery;
private _text;
private _userName;
private _date;
private _level;
private _id;
public answerTo = 0;
constructor(data) {
this.id = data.id;
this.userName = data.userName;
this.date = data.datetime;
this.text = data.text;
this.level = data.answerTo == 0 ? 1 : 2;
this.answerTo = data.answerTo;
}
get template() {
if (this._template !== undefined) return this._template;
this._template = $('');
this._template.append('');
let info = $('');
info.append('');
info.append('');
info.append('');
this._template.append(info);
return this._template;
}
get rendered() {
if (this._rendered !== undefined) return this._rendered;
this._rendered = this.template.clone();
return this._rendered;
}
set text(value) {
this._text = value;
this.rendered.find('.comments__comment-text').html(value);
}
set userName(value) {
this._userName = value;
this.rendered.find('.comments__comment-name').html(value);
}
set date(value) {
this._date = value;
let dateObject = new Date(value);
this.rendered.find('.comments__comment-date').html(dateObject.toLocaleString("ru", {
year: 'numeric',
month: 'long',
day: 'numeric',
hour: '2-digit',
minute: '2-digit'
}).replace(' г.', ''));
}
set id(value) {
this._id = value;
this.rendered.data('comment-id', value);
}
get id() {
return this._id;
}
set level(value) {
this._level = value;
this.rendered.addClass('comments__comment--level' + value);
}
}
}