2018-10-16 16:28:42 +00:00
|
|
|
$('#contentField').on('keyup', function (e) {
|
|
|
|
var range = window.getSelection().getRangeAt(0);
|
|
|
|
var end_node = range.endContainer;
|
|
|
|
var end = range.endOffset;
|
|
|
|
|
|
|
|
if (end_node !== this) {
|
|
|
|
const text_nodes = get_text_nodes_in(this);
|
|
|
|
for (let i = 0; i < text_nodes.length; ++i) {
|
|
|
|
if (text_nodes[i] === end_node) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
end += text_nodes[i].length;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
let html = $(this).html();
|
|
|
|
if (/\ $/.test(html) && $(this).text().length === end) {
|
|
|
|
end--;
|
|
|
|
set_range(end, end, this);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
let filter = html.replace(/<span class="mention">/g, "")
|
|
|
|
.replace(/<span class="hashtag">/g, "")
|
|
|
|
.replace(/<\/span>/g, "")
|
|
|
|
.replace(/@[A-Za-z0-9._]+/g, function (match) {
|
|
|
|
return `<span class="mention">${match}</span>`;
|
|
|
|
})
|
|
|
|
.replace(/#[A-Za-z0-9._]+/g, function (match) {
|
|
|
|
return `<span class="hashtag">${match}</span>`;
|
|
|
|
});
|
|
|
|
|
|
|
|
console.log(html);
|
|
|
|
|
|
|
|
if (!/ $/.test($(this).html())) {
|
|
|
|
filter += ' ';
|
|
|
|
}
|
|
|
|
$(this).html(filter);
|
|
|
|
set_range(end, end, this);
|
|
|
|
});
|
|
|
|
|
|
|
|
$('#contentField').on('mouseup', function (e) {
|
|
|
|
if (!/\ $/.test($(this).html())) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
var range = window.getSelection().getRangeAt(0);
|
|
|
|
var end = range.endOffset;
|
|
|
|
var end_node = range.endContainer;
|
|
|
|
if (end_node != this) {
|
|
|
|
var text_nodes = get_text_nodes_in(this);
|
|
|
|
for (var i = 0; i < text_nodes.length; ++i) {
|
|
|
|
if (text_nodes[i] == end_node) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
end += text_nodes[i].length;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ($(this).text().length == end) {
|
|
|
|
end = end - 1;
|
|
|
|
set_range(end, end, this);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
function get_text_nodes_in(node) {
|
|
|
|
var text_nodes = [];
|
|
|
|
if (node.nodeType === 3) {
|
|
|
|
text_nodes.push(node);
|
|
|
|
} else {
|
|
|
|
var children = node.childNodes;
|
|
|
|
for (var i = 0, len = children.length; i < len; ++i) {
|
|
|
|
var text_node;
|
|
|
|
text_nodes.push.apply(text_nodes, get_text_nodes_in(children[i]));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return text_nodes;
|
|
|
|
}
|
|
|
|
|
|
|
|
function set_range(start, end, element) {
|
|
|
|
var range = document.createRange();
|
|
|
|
range.selectNodeContents(element);
|
|
|
|
var text_nodes = get_text_nodes_in(element);
|
|
|
|
var foundStart = false;
|
|
|
|
var char_count = 0, end_char_count;
|
|
|
|
|
|
|
|
for (var i = 0, text_node; text_node = text_nodes[i++];) {
|
|
|
|
end_char_count = char_count + text_node.length;
|
|
|
|
if (!foundStart && start >= char_count && (start < end_char_count || (start === end_char_count && i < text_nodes.length))) {
|
|
|
|
range.setStart(text_node, start - char_count);
|
|
|
|
foundStart = true;
|
|
|
|
}
|
|
|
|
if (foundStart && end <= end_char_count) {
|
|
|
|
range.setEnd(text_node, end - char_count);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
char_count = end_char_count;
|
|
|
|
}
|
|
|
|
|
|
|
|
var selection = window.getSelection();
|
|
|
|
selection.removeAllRanges();
|
|
|
|
selection.addRange(range);
|
|
|
|
}
|
|
|
|
|
|
|
|
$.fn.selectRange = function (start, end) {
|
|
|
|
var e = document.getElementById($(this).attr('id'));
|
|
|
|
if (!e) return;
|
|
|
|
else if (e.setSelectionRange) {
|
|
|
|
e.focus();
|
|
|
|
e.setSelectionRange(start, end);
|
|
|
|
} /* WebKit */
|
|
|
|
else if (e.createTextRange) {
|
|
|
|
var range = e.createTextRange();
|
|
|
|
range.collapse(true);
|
|
|
|
range.moveEnd('character', end);
|
|
|
|
range.moveStart('character', start);
|
|
|
|
range.select();
|
|
|
|
} /* IE */
|
|
|
|
else if (e.selectionStart) {
|
|
|
|
e.selectionStart = start;
|
|
|
|
e.selectionEnd = end;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
let postMedia = {};
|
|
|
|
function publishPost() {
|
|
|
|
let isFilled = true;
|
|
|
|
let content = $('#contentField').text();
|
|
|
|
console.log(content);
|
|
|
|
if (content === "") {
|
|
|
|
$('#postModal #content').addClass('has-error');
|
|
|
|
isFilled = false;
|
|
|
|
} else {
|
|
|
|
$('#postModal #content').addClass('has-success');
|
|
|
|
}
|
|
|
|
|
|
|
|
if (isFilled) {
|
|
|
|
const replyTo = $('#postModal #replyTo').val();
|
|
|
|
submitPost(content, replyTo);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$('#postFiles').on('change', function() {
|
|
|
|
console.log(this.files);
|
|
|
|
const match = ['image/jpeg', 'image/jpg', 'image/png'];
|
|
|
|
const mediaCount = Object.keys(postMedia).length;
|
|
|
|
if(mediaCount < 4) {
|
|
|
|
for (let i = 0; i < this.files.length && i < 4 - mediaCount; i++) {
|
|
|
|
const file = this.files[i];
|
|
|
|
if (match.indexOf(file.type) === -1)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
const reader = new FileReader();
|
|
|
|
reader.addEventListener('load', () => {
|
|
|
|
$('.post-images').append(`<div class="post-image" style="background-image: url(${reader.result})"></div>`);
|
|
|
|
postMedia[mediaCount + i] = {
|
|
|
|
image: reader.result,
|
|
|
|
type: file.type,
|
|
|
|
size: file.size,
|
|
|
|
name: file.name
|
|
|
|
};
|
|
|
|
});
|
|
|
|
reader.readAsDataURL(file);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if(Object.keys(postMedia).length >= 4) {
|
|
|
|
$('.postImageUpload').hide();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
$('#postModal').on('hidden.bs.modal', () => {
|
|
|
|
$('#postModal #replyTo').val(-1);
|
|
|
|
});
|
|
|
|
|
|
|
|
function submitPost(content, replyTo) {
|
|
|
|
if(postMedia.length > 4) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
$.ajax({
|
2018-10-17 11:56:22 +00:00
|
|
|
url: "/user/publishPost",
|
2018-10-16 16:28:42 +00:00
|
|
|
method: 'POST',
|
|
|
|
data: {
|
|
|
|
content,
|
|
|
|
replyTo,
|
|
|
|
postMedia
|
|
|
|
},
|
|
|
|
beforeSend: function () {
|
|
|
|
$('#postModalBody').empty().append("<i class='fa fa-cog fa-spin fa-5x'></i>");
|
|
|
|
$('#postModalPublish').button('loading');
|
|
|
|
},
|
|
|
|
success: function (data) {
|
|
|
|
$('#postModalBody').empty().append(data);
|
|
|
|
},
|
|
|
|
error: function (data) {
|
|
|
|
console.log(data);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|