From 6f04cf5dd5d81c58f262b139972645cd45657ec1 Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Mon, 27 Mar 2017 19:31:12 +0200
Subject: [PATCH] Updated JS files created by JSX

---
 res/js/component/buffer.js           | 47 ++++++++++++++++
 res/js/component/context.js          | 42 +++++++++++++++
 res/js/component/history.js          | 81 ++++++++++++++++++++++++++++
 res/js/component/historyelement.js   | 24 +++++++++
 res/js/component/loadmore.js         | 17 ++++++
 res/js/component/message.js          | 40 ++++++++++++++
 res/js/component/messagePreview.js   | 45 ++++++++++++++++
 res/js/component/nav.js              | 76 ++++++++++++++++++++++++++
 res/js/component/nohistoryelement.js | 12 +++++
 9 files changed, 384 insertions(+)
 create mode 100644 res/js/component/buffer.js
 create mode 100644 res/js/component/context.js
 create mode 100644 res/js/component/history.js
 create mode 100644 res/js/component/historyelement.js
 create mode 100644 res/js/component/loadmore.js
 create mode 100644 res/js/component/message.js
 create mode 100644 res/js/component/messagePreview.js
 create mode 100644 res/js/component/nav.js
 create mode 100644 res/js/component/nohistoryelement.js

diff --git a/res/js/component/buffer.js b/res/js/component/buffer.js
new file mode 100644
index 0000000..b5aa4ad
--- /dev/null
+++ b/res/js/component/buffer.js
@@ -0,0 +1,47 @@
+class Buffer extends Component {
+    constructor(id, name, network, contextList = []) {
+        super();
+        this.id = id;
+        this.name = name;
+        this.network = network;
+        this.contextList = contextList;
+        this.render();
+        this.contextList.forEach(context => this.insert(context));
+    }
+    render() {
+        return this.elem = function () {
+            var $$a = document.createElement('div');
+            $$a.setAttribute('class', 'buffer');
+            var $$b = document.createElement('div');
+            $$b.setAttribute('class', 'title');
+            $$a.appendChild($$b);
+            var $$c = document.createElement('h2');
+            $$b.appendChild($$c);
+            $$c.appendChildren(this.network);
+            var $$e = document.createTextNode(' \u2013 ');
+            $$c.appendChild($$e);
+            $$c.appendChildren(this.name);
+            var $$g = document.createElement('button');
+            $$g.addEventListener('click', () => this.selected());
+            $$b.appendChild($$g);
+            $$a.appendChildren(this.insertContainer = function () {
+                var $$i = document.createElement('div');
+                $$i.setAttribute('class', 'container');
+                $$i.appendChildren((this.loadMoreBtn = new LoadMore(translation.results.show_more, this.loadMore)).elem);
+                return $$i;
+            }.call(this));
+            return $$a;
+        }.call(this);
+    }
+    loadMore() {
+    }
+    selected(isSelected) {
+        if (isSelected === undefined)
+            isSelected = !this.elem.classList.contains('selected');
+        this.elem.classList.toggle('selected', isSelected);
+        this.sendEvent('expanded', isSelected);
+    }
+    insert(context) {
+        this.insertContainer.insertBefore(context.elem, this.loadMoreBtn.elem);
+    }
+}
\ No newline at end of file
diff --git a/res/js/component/context.js b/res/js/component/context.js
new file mode 100644
index 0000000..ba81735
--- /dev/null
+++ b/res/js/component/context.js
@@ -0,0 +1,42 @@
+class Context {
+    constructor(preview, beforeList = [], afterList = []) {
+        this.preview = preview;
+        this.beforeList = beforeList;
+        this.afterList = afterList;
+        this.render();
+        this.insertAfterTarget = this.loadAfterBtn;
+        this.beforeList.forEach(this.insertBefore);
+        this.afterList.forEach(this.insertAfter);
+    }
+    render() {
+        return this.elem = function () {
+            var $$a = document.createElement('div');
+            $$a.setAttribute('class', 'context');
+            $$a.appendChildren(this.containerBefore = function () {
+                var $$c = document.createElement('div');
+                $$c.setAttribute('class', 'container before');
+                $$c.appendChildren((this.loadBeforeBtn = new LoadMore(translation.context.load_earlier, this.loadBefore)).elem);
+                return $$c;
+            }.call(this));
+            $$a.appendChildren(this.preview.elem);
+            $$a.appendChildren(this.containerAfter = function () {
+                var $$g = document.createElement('div');
+                $$g.setAttribute('class', 'container after');
+                $$g.appendChildren((this.loadAfterBtn = new LoadMore(translation.context.load_later, this.loadAfter)).elem);
+                return $$g;
+            }.call(this));
+            return $$a;
+        }.call(this);
+    }
+    loadBefore() {
+    }
+    insertBefore(message) {
+        this.containerBefore.insertBefore(message.elem, this.insertBeforeTarget);
+        this.insertBeforeTarget = message.elem;
+    }
+    loadAfter() {
+    }
+    insertAfter(message) {
+        this.containerAfter.insertBefore(message.elem, this.insertAfterTarget);
+    }
+}
\ No newline at end of file
diff --git a/res/js/component/history.js b/res/js/component/history.js
new file mode 100644
index 0000000..a744951
--- /dev/null
+++ b/res/js/component/history.js
@@ -0,0 +1,81 @@
+const HISTORY_KEY = 'history';
+const HISTORY_MAX_LENGTH = 4;
+class HistoryView {
+    constructor() {
+        this.index = -1;
+        this.elements = this.load().map(function (query) {
+            return new HistoryElement(query);
+        });
+        this.render();
+        this.elements.reverse().forEach(elem => this.insert(elem));
+    }
+    render() {
+        return this.elem = function () {
+            var $$a = document.createElement('div');
+            $$a.setAttribute('class', 'history');
+            $$a.appendChildren(this.list = function () {
+                var $$c = document.createElement('ul');
+                $$c.appendChildren((this.noHistory = new NoHistoryElement()).elem);
+                return $$c;
+            }.call(this));
+            return $$a;
+        }.call(this);
+    }
+    insert(item) {
+        this.list.insertBefore(item.elem, this.list.firstChild);
+        if (this.noHistory.elem.parentNode === this.list)
+            this.list.removeChild(this.noHistory.elem);
+    }
+    add(item) {
+        if (item.query == '')
+            return;
+        const idx = this.elements.map(item => item.query).indexOf(item.query);
+        if (idx !== -1) {
+            this.list.removeChild(this.elements[idx].elem);
+            this.elements.splice(idx, 1);
+        }
+        this.elements.unshift(item);
+        this.insert(item);
+        this.truncate();
+        this.store();
+    }
+    clear() {
+        while (this.elements.length) {
+            this.list.removeChild(this.elements.pop().elem);
+        }
+        this.store();
+        this.list.appendChild(this.noHistory.elem);
+    }
+    load() {
+        const loaded = localStorage[HISTORY_KEY];
+        return JSON.parse(loaded === undefined ? '[]' : loaded);
+    }
+    store() {
+        localStorage[HISTORY_KEY] = JSON.stringify(this.elements.map(item => item.query));
+    }
+    navigateBefore() {
+        if (this.elements[this.index])
+            this.elements[this.index].selected(false);
+        this.index++;
+        this.index %= this.elements.length;
+        if (this.elements[this.index])
+            this.elements[this.index].selected(true);
+        console.log(this.index);
+    }
+    navigateLater() {
+        if (this.elements[this.index])
+            this.elements[this.index].selected(false);
+        this.index--;
+        if (this.index < 0)
+            this.index = -1;
+        else
+            this.index %= this.elements.length;
+        if (this.elements[this.index])
+            this.elements[this.index].selected(true);
+        console.log(this.index);
+    }
+    truncate() {
+        while (this.elements.length > HISTORY_MAX_LENGTH)
+            this.list.removeChild(this.elements.shift().elem);
+    }
+}
\ No newline at end of file
diff --git a/res/js/component/historyelement.js b/res/js/component/historyelement.js
new file mode 100644
index 0000000..11f165f
--- /dev/null
+++ b/res/js/component/historyelement.js
@@ -0,0 +1,24 @@
+class HistoryElement {
+    constructor(query) {
+        this.query = query;
+        this.render();
+        this.elem.addEventListener('click', () => {
+            window.location.href = '#' + encodeURIComponent(this.query);
+        });
+    }
+    render() {
+        return this.elem = function () {
+            var $$a = document.createElement('li');
+            var $$b = document.createElement('span');
+            $$b.setAttribute('class', 'icon');
+            $$a.appendChild($$b);
+            var $$c = document.createTextNode('history');
+            $$b.appendChild($$c);
+            $$a.appendChildren(this.query);
+            return $$a;
+        }.call(this);
+    }
+    selected(value) {
+        this.elem.classList.toggle('selected', value);
+    }
+}
\ No newline at end of file
diff --git a/res/js/component/loadmore.js b/res/js/component/loadmore.js
new file mode 100644
index 0000000..68404a0
--- /dev/null
+++ b/res/js/component/loadmore.js
@@ -0,0 +1,17 @@
+class LoadMore extends Component {
+    constructor(text, eventListener) {
+        super();
+        this.render(text);
+        if (eventListener)
+            this.addEventListener('click', eventListener);
+    }
+    render(text) {
+        return this.elem = function () {
+            var $$a = document.createElement('div');
+            $$a.setAttribute('class', 'inline-button');
+            $$a.addEventListener('click', event => this.sendEvent('click', [event]));
+            $$a.appendChildren(text);
+            return $$a;
+        }.call(this);
+    }
+}
\ No newline at end of file
diff --git a/res/js/component/message.js b/res/js/component/message.js
new file mode 100644
index 0000000..1af906c
--- /dev/null
+++ b/res/js/component/message.js
@@ -0,0 +1,40 @@
+class Message {
+    constructor(id, time, sender, content) {
+        this.id = id;
+        this.time = time;
+        this.sender = sender;
+        this.content = content;
+        this.render();
+    }
+    render() {
+        return this.elem = function () {
+            var $$a = document.createElement('div');
+            $$a.setAttribute('class', 'message');
+            var $$b = document.createElement('time');
+            $$a.appendChild($$b);
+            $$b.appendChildren(new Date(this.time.replace(' ', 'T') + 'Z').toLocaleString());
+            var $$d = document.createElement('div');
+            $$d.setAttribute('class', 'container');
+            $$a.appendChild($$d);
+            var $$e = document.createElement('div');
+            $$e.setAttribute('class', 'sender');
+            $$e.setAttribute('data-sendercolor', SenderColorHandler.nickToColor(this.getNick()));
+            $$d.appendChild($$e);
+            $$e.appendChildren(this.getNick());
+            var $$g = document.createElement('div');
+            $$g.setAttribute('class', 'content');
+            $$d.appendChild($$g);
+            $$g.appendChildren(MircColorHandler.render(this.content));
+            return $$a;
+        }.call(this);
+    }
+    getNick() {
+        return this.sender.split('!')[0];
+    }
+    getIdent() {
+        return this.sender.split('@')[0].split('!')[1];
+    }
+    getHost() {
+        return this.sender.split('@')[1];
+    }
+}
\ No newline at end of file
diff --git a/res/js/component/messagePreview.js b/res/js/component/messagePreview.js
new file mode 100644
index 0000000..831760c
--- /dev/null
+++ b/res/js/component/messagePreview.js
@@ -0,0 +1,45 @@
+class MessagePreview {
+    constructor(id, time, sender, content, preview) {
+        this.id = id;
+        this.time = time;
+        this.sender = sender;
+        this.content = content;
+        this.preview = preview;
+        this.render();
+    }
+    render() {
+        return this.elem = function () {
+            var $$a = document.createElement('div');
+            $$a.setAttribute('class', 'message preview');
+            var $$b = document.createElement('time');
+            $$a.appendChild($$b);
+            $$b.appendChildren(new Date(this.time.replace(' ', 'T') + 'Z').toLocaleString());
+            var $$d = document.createElement('div');
+            $$d.setAttribute('class', 'container');
+            $$a.appendChild($$d);
+            var $$e = document.createElement('div');
+            $$e.setAttribute('class', 'sender');
+            $$e.setAttribute('data-sendercolor', SenderColorHandler.nickToColor(this.getNick()));
+            $$d.appendChild($$e);
+            $$e.appendChildren(this.getNick());
+            var $$g = document.createElement('div');
+            $$g.setAttribute('class', 'content');
+            $$d.appendChild($$g);
+            $$g.appendChildren(MircColorHandler.render(this.content));
+            var $$i = document.createElement('div');
+            $$i.setAttribute('class', 'preview');
+            $$d.appendChild($$i);
+            $$i.appendChildren(MircColorHandler.highlight(this.preview));
+            return $$a;
+        }.call(this);
+    }
+    getNick() {
+        return this.sender.split('!')[0];
+    }
+    getIdent() {
+        return this.sender.split('@')[0].split('!')[1];
+    }
+    getHost() {
+        return this.sender.split('@')[1];
+    }
+}
\ No newline at end of file
diff --git a/res/js/component/nav.js b/res/js/component/nav.js
new file mode 100644
index 0000000..bdbb562
--- /dev/null
+++ b/res/js/component/nav.js
@@ -0,0 +1,76 @@
+const keyMapping = {
+    13: 'Enter',
+    27: 'Escape',
+    38: 'ArrowUp',
+    40: 'ArrowDown'
+};
+class Navigation extends Component {
+    constructor() {
+        super();
+        this.render();
+    }
+    render() {
+        return this.elem = function () {
+            var $$a = document.createElement('div');
+            $$a.setAttribute('class', 'nav');
+            var $$b = document.createElement('div');
+            $$b.setAttribute('class', 'bar');
+            $$a.appendChild($$b);
+            var $$c = document.createElement('div');
+            $$c.setAttribute('class', 'container');
+            $$b.appendChild($$c);
+            var $$d = document.createElement('div');
+            $$d.setAttribute('class', 'searchBar');
+            $$c.appendChild($$d);
+            var $$e = document.createElement('p');
+            $$e.setAttribute('class', 'icon');
+            $$d.appendChild($$e);
+            var $$f = document.createTextNode('search');
+            $$e.appendChild($$f);
+            $$d.appendChildren(this.input = function () {
+                var $$h = document.createElement('input');
+                $$h.setAttribute('class', 'search');
+                $$h.setAttribute('placeholder', translation.search);
+                $$h.setAttribute('type', 'text');
+                $$h.setAttribute('autoComplete', 'off');
+                $$h.addEventListener('focus', () => this.elem.classList.add('focus'));
+                $$h.addEventListener('blur', () => this.elem.classList.remove('focus'));
+                $$h.addEventListener('keydown', e => this.inputKeyDown(e));
+                return $$h;
+            }.call(this));
+            var $$i = document.createElement('div');
+            $$i.setAttribute('class', 'actions');
+            $$c.appendChild($$i);
+            var $$j = document.createElement('a');
+            $$j.setAttribute('href', 'login.php?action=logout');
+            $$j.setAttribute('title', translation.logout);
+            $$j.setAttribute('class', 'icon');
+            $$i.appendChild($$j);
+            var $$k = document.createTextNode('exit_to_app');
+            $$j.appendChild($$k);
+            $$a.appendChildren((this.historyView = new HistoryView()).elem);
+            return $$a;
+        }.call(this);
+    }
+    inputKeyDown(event) {
+        switch (event.key || keyMapping[event.keyCode]) {
+        case 'ArrowUp':
+            this.historyView.navigateLater();
+            event.preventDefault();
+            break;
+        case 'ArrowDown':
+            this.historyView.navigateBefore();
+            event.preventDefault();
+            break;
+        case 'Enter':
+            this.sendEvent('search', [this.historyView.index === -1 ? this.input.value : this.historyView.elements[this.historyView.index].query]);
+            this.input.blur();
+            event.preventDefault();
+            break;
+        case 'Escape':
+            this.input.blur();
+            event.preventDefault();
+            break;
+        }
+    }
+}
\ No newline at end of file
diff --git a/res/js/component/nohistoryelement.js b/res/js/component/nohistoryelement.js
new file mode 100644
index 0000000..4d3e138
--- /dev/null
+++ b/res/js/component/nohistoryelement.js
@@ -0,0 +1,12 @@
+class NoHistoryElement {
+    constructor() {
+        this.render();
+    }
+    render() {
+        return this.elem = function () {
+            var $$a = document.createElement('p');
+            $$a.appendChildren(translation.history.error_unavailable);
+            return $$a;
+        }.call(this);
+    }
+}
\ No newline at end of file
-- 
GitLab