diff --git a/output/js/constants.js b/output/js/constants.js index f3137289..3002622e 100644 --- a/output/js/constants.js +++ b/output/js/constants.js @@ -6,7 +6,7 @@ export const dom = { tbl_communities: () => document.getElementById("tbl_communities"), last_checked: () => document.getElementById("last_checked_value"), qr_modal: (communityID) => document.getElementById(`modal_${communityID}`), - join_urls: () => document.getElementsByClassName("td_join_url"), + join_urls: () => document.getElementsByClassName("join_url_container"), servers_hidden: () => document.getElementById("servers_hidden"), snackbar: () => document.getElementById("copy-snackbar") } @@ -57,3 +57,29 @@ export function columnIsNumeric(column) { ].includes(column); } +/** + * Creates an element, and adds attributes and elements to it. + * @param {string} tag - HTML Tag name. + * @param {Object|HTMLElement} args - Array of child elements, may start with props. + * @returns {HTMLElement} + */ +function createElement(tag, ...args) { + const element = document.createElement(tag); + if (args.length === 0) return element; + const propsCandidate = args[0]; + if (typeof propsCandidate !== "string" && !(propsCandidate instanceof Element)) { + // args[0] is not child element or text node + // must be props object + Object.assign(element, propsCandidate); + args.shift(); + } + element.append(...args); + return element; +} + +export const element = new Proxy({}, { + get(_, key) { + return (...args) => createElement(key, ...args) + } +}); + diff --git a/output/main.js b/output/main.js index 25ae17b3..0bc0bdb1 100644 --- a/output/main.js +++ b/output/main.js @@ -17,7 +17,7 @@ import { dom, COLUMN, COLUMN_LITERAL, COMPARISON, ATTRIBUTES, columnAscendingByDefault, columnIsSortable, columnNeedsCasefold, - columnIsNumeric + columnIsNumeric, element } from './js/constants.js'; // Hidden communities for transparency. @@ -50,12 +50,13 @@ const filteredCommunities = { // This can be achieved with `text-overflow: ellipsis` instead // and generated entirely server-side. -const transformJoinURL = (join_link) => - `${join_link.substring(0, 31)}... - - `.trim(); +const transformJoinURL = (join_link) => { + return element.button({ + textContent: "Copy", + className: "copy_button", + onclick: () => copyToClipboard(join_link) + }); +} function onLoad(timestamp) { setLastChecked(timestamp); @@ -78,7 +79,7 @@ function createJoinLinkButtons() { Array.from(join_URLs).forEach((td_url) => { const a_href = td_url.querySelector('a'); // get first (only) element const join_link = a_href.getAttribute("href"); // get link - td_url.innerHTML = transformJoinURL(join_link); // add interactive content + td_url.append(transformJoinURL(join_link)); // add interactive content }); } @@ -279,6 +280,9 @@ function sortTable(column) { setSortState(table, { ascending, column }); } +// html.js for styling purposes +window.document.documentElement.classList.add("js"); + // Crude way to export from module script due to inline event handlers. // Ideally, all handlers would be attached from JS via addEventListener. Object.assign(window, { diff --git a/output/styles2.css b/output/styles2.css index 40b43099..5d40936a 100644 --- a/output/styles2.css +++ b/output/styles2.css @@ -37,7 +37,34 @@ header { white-space: nowrap; } -.copy_button { } +.join_url.nojs_mobile { + display: none; +} + +/* Apply margin against copy button. */ +html.js .join_url { + margin-right: 1em; +} + +@media (max-width: 800px) { + .join_url { + display: none; + } + + /* Show backup link only when button is not available. */ + html:not(.js) .join_url.nojs_mobile { + display: inline; + } +} + +.join_url_container { + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; +} + +.copy_button { font-size: inherit } footer { display: flex; diff --git a/php/utils/server-utils.php b/php/utils/server-utils.php index c0e91a31..f6ac141c 100644 --- a/php/utils/server-utils.php +++ b/php/utils/server-utils.php @@ -18,6 +18,12 @@ return count($servers); } + function truncate($url, $len) { + return (strlen($url) > $len + 3) + ? substr($url, 0, $len).'...' + : $string; + } + /* * Helper function for reduce_servers */ diff --git a/sites/+components/tbl_communities.php b/sites/+components/tbl_communities.php index a0b5c32b..63d4fc53 100644 --- a/sites/+components/tbl_communities.php +++ b/sites/+components/tbl_communities.php @@ -1,4 +1,6 @@ - - - join_link?> - - +
+ join_link, 32)?> + Copy link +