about summary refs log tree commit diff
path: root/app/javascript/core
diff options
context:
space:
mode:
authorkibigo! <marrus-sh@users.noreply.github.com>2017-11-18 15:12:52 -0800
committerkibigo! <marrus-sh@users.noreply.github.com>2017-11-18 15:12:52 -0800
commita9ed85717163040fb202d49b0342e9e350cb12ba (patch)
tree542142fa2ed7c1ff5584671c9a678f4b64edc15c /app/javascript/core
parent92cc79be7206534e8c9a9957cc89b5d0eb0bcfac (diff)
WIP static themeing
Diffstat (limited to 'app/javascript/core')
-rw-r--r--app/javascript/core/about.js1
-rw-r--r--app/javascript/core/admin.js42
-rw-r--r--app/javascript/core/common.js5
-rw-r--r--app/javascript/core/embed.js23
-rw-r--r--app/javascript/core/home.js1
-rw-r--r--app/javascript/core/public.js1
-rw-r--r--app/javascript/core/settings.js65
-rw-r--r--app/javascript/core/share.js1
8 files changed, 139 insertions, 0 deletions
diff --git a/app/javascript/core/about.js b/app/javascript/core/about.js
new file mode 100644
index 000000000..6ed0e4ad3
--- /dev/null
+++ b/app/javascript/core/about.js
@@ -0,0 +1 @@
+//  This file will be loaded on about pages, regardless of theme.
diff --git a/app/javascript/core/admin.js b/app/javascript/core/admin.js
new file mode 100644
index 000000000..c0bd09bdd
--- /dev/null
+++ b/app/javascript/core/admin.js
@@ -0,0 +1,42 @@
+//  This file will be loaded on admin pages, regardless of theme.
+
+import { delegate } from 'rails-ujs';
+
+function handleDeleteStatus(event) {
+  const [data] = event.detail;
+  const element = document.querySelector(`[data-id="${data.id}"]`);
+  if (element) {
+    element.parentNode.removeChild(element);
+  }
+}
+
+[].forEach.call(document.querySelectorAll('.trash-button'), (content) => {
+  content.addEventListener('ajax:success', handleDeleteStatus);
+});
+
+const batchCheckboxClassName = '.batch-checkbox input[type="checkbox"]';
+
+delegate(document, '#batch_checkbox_all', 'change', ({ target }) => {
+  [].forEach.call(document.querySelectorAll(batchCheckboxClassName), (content) => {
+    content.checked = target.checked;
+  });
+});
+
+delegate(document, batchCheckboxClassName, 'change', () => {
+  const checkAllElement = document.querySelector('#batch_checkbox_all');
+  if (checkAllElement) {
+    checkAllElement.checked = [].every.call(document.querySelectorAll(batchCheckboxClassName), (content) => content.checked);
+  }
+});
+
+delegate(document, '.media-spoiler-show-button', 'click', () => {
+  [].forEach.call(document.querySelectorAll('.activity-stream .media-spoiler-wrapper'), (content) => {
+    content.classList.add('media-spoiler-wrapper__visible');
+  });
+});
+
+delegate(document, '.media-spoiler-hide-button', 'click', () => {
+  [].forEach.call(document.querySelectorAll('.activity-stream .media-spoiler-wrapper'), (content) => {
+    content.classList.remove('media-spoiler-wrapper__visible');
+  });
+});
diff --git a/app/javascript/core/common.js b/app/javascript/core/common.js
new file mode 100644
index 000000000..24c0fdf61
--- /dev/null
+++ b/app/javascript/core/common.js
@@ -0,0 +1,5 @@
+//  This file will be loaded on all pages, regardless of theme.
+
+import { start } from 'rails-ujs';
+
+start();
diff --git a/app/javascript/core/embed.js b/app/javascript/core/embed.js
new file mode 100644
index 000000000..8167706a3
--- /dev/null
+++ b/app/javascript/core/embed.js
@@ -0,0 +1,23 @@
+//  This file will be loaded on embed pages, regardless of theme.
+
+window.addEventListener('message', e => {
+  const data = e.data || {};
+
+  if (!window.parent || data.type !== 'setHeight') {
+    return;
+  }
+
+  function setEmbedHeight () {
+    window.parent.postMessage({
+      type: 'setHeight',
+      id: data.id,
+      height: document.getElementsByTagName('html')[0].scrollHeight,
+    }, '*');
+  });
+
+  if (['interactive', 'complete'].includes(document.readyState)) {
+    setEmbedHeight();
+  } else {
+    document.addEventListener('DOMContentLoaded', setEmbedHeight);
+  }
+});
diff --git a/app/javascript/core/home.js b/app/javascript/core/home.js
new file mode 100644
index 000000000..3c2e01590
--- /dev/null
+++ b/app/javascript/core/home.js
@@ -0,0 +1 @@
+//  This file will be loaded on home pages, regardless of theme.
diff --git a/app/javascript/core/public.js b/app/javascript/core/public.js
new file mode 100644
index 000000000..1a36b7a5f
--- /dev/null
+++ b/app/javascript/core/public.js
@@ -0,0 +1 @@
+//  This file will be loaded on public pages, regardless of theme.
diff --git a/app/javascript/core/settings.js b/app/javascript/core/settings.js
new file mode 100644
index 000000000..91332ed5a
--- /dev/null
+++ b/app/javascript/core/settings.js
@@ -0,0 +1,65 @@
+//  This file will be loaded on settings pages, regardless of theme.
+
+function main() {
+  const { length } = require('stringz');
+  const { delegate } = require('rails-ujs');
+
+  delegate(document, '.webapp-btn', 'click', ({ target, button }) => {
+    if (button !== 0) {
+      return true;
+    }
+    window.location.href = target.href;
+    return false;
+  });
+
+  delegate(document, '.status__content__spoiler-link', 'click', ({ target }) => {
+    const contentEl = target.parentNode.parentNode.querySelector('.e-content');
+
+    if (contentEl.style.display === 'block') {
+      contentEl.style.display = 'none';
+      target.parentNode.style.marginBottom = 0;
+    } else {
+      contentEl.style.display = 'block';
+      target.parentNode.style.marginBottom = null;
+    }
+
+    return false;
+  });
+
+  delegate(document, '.account_display_name', 'input', ({ target }) => {
+    const nameCounter = document.querySelector('.name-counter');
+
+    if (nameCounter) {
+      nameCounter.textContent = 30 - length(target.value);
+    }
+  });
+
+  delegate(document, '.account_note', 'input', ({ target }) => {
+    const noteCounter = document.querySelector('.note-counter');
+
+    if (noteCounter) {
+      const noteWithoutMetadata = processBio(target.value).text;
+      noteCounter.textContent = 500 - length(noteWithoutMetadata);
+    }
+  });
+
+  delegate(document, '#account_avatar', 'change', ({ target }) => {
+    const avatar = document.querySelector('.card.compact .avatar img');
+    const [file] = target.files || [];
+    const url = file ? URL.createObjectURL(file) : avatar.dataset.originalSrc;
+
+    avatar.src = url;
+  });
+
+  delegate(document, '#account_header', 'change', ({ target }) => {
+    const header = document.querySelector('.card.compact');
+    const [file] = target.files || [];
+    const url = file ? URL.createObjectURL(file) : header.dataset.originalSrc;
+
+    header.style.backgroundImage = `url(${url})`;
+  });
+}
+
+loadPolyfills().then(main).catch(error => {
+  console.error(error);
+});
diff --git a/app/javascript/core/share.js b/app/javascript/core/share.js
new file mode 100644
index 000000000..98a413632
--- /dev/null
+++ b/app/javascript/core/share.js
@@ -0,0 +1 @@
+//  This file will be loaded on share pages, regardless of theme.