/* * This file is part of Linode Manager Classic. * * Linode Manager Classic is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Linode Manager Classic is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Linode Manager Classic. If not, see . */ import { settings, elements, apiGet, parseParams, setupHeader } from "/global.js"; (function() { // Element names specific to this page elements.centerCell = "center-cell"; elements.domains = "domains"; elements.domainTagPrefix = "domain-tag-"; elements.lmcRow = "lmc-tr1"; elements.lmcRowAlt = "lmc-tr2"; elements.lmcTable = "lmc-table"; elements.loading = "loading"; elements.sublinks = "sub-links"; // Data recieved from API calls var data = {}; data.domains = []; data.domainTags = []; data.noTag = false; // Static references to UI elements var ui = {}; ui.domains = {}; ui.domainTables = {}; ui.loading = {}; var createDomainRow = function(domain, alt) { var row = document.createElement("tr"); if (alt) row.className = elements.lmcRowAlt; else row.className = elements.lmcRow; var name = document.createElement("td"); var nameLink = document.createElement("a"); nameLink.href = "/dns/domain?did=" + domain.id; nameLink.innerHTML = domain.domain; name.appendChild(nameLink); row.appendChild(name); var type = document.createElement("td"); type.innerHTML = domain.type; row.appendChild(type); var email = document.createElement("td"); email.innerHTML = domain.soa_email; row.appendChild(email); var status = document.createElement("td"); status.innerHTML = domain.status.charAt(0).toUpperCase() + domain.status.slice(1).replace(/_/g, " "); row.appendChild(status); var options = document.createElement("td"); options.className = elements.centerCell; var editLink = document.createElement("a"); editLink.href = "/dns/domain?did=" + domain.id; editLink.innerHTML = "Edit"; var separator = document.createElement("span"); separator.innerHTML = " | "; var removeLink = document.createElement("a"); removeLink.href = "/dns/domain_delete?did=" + domain.id; removeLink.innerHTML = "Remove"; options.appendChild(editLink); options.appendChild(separator); options.appendChild(removeLink); row.appendChild(options); return row; }; var createDomainTable = function(tag) { var table = document.createElement("table"); table.id = elements.domainTagPrefix + tag; table.className = elements.lmcTable; var thead = document.createElement("thead"); var headRow1 = document.createElement("tr"); var title = document.createElement("td"); if (!tag.length) title.innerHTML = "Domains"; else title.innerHTML = tag; headRow1.appendChild(title); var headRow2 = document.createElement("tr"); var cells = ["Domain Zone", "Type", "SOA Email", "Status", "Options"]; title.colspan = cells.length; for (var i = 0; i < cells.length; i++) { var cell = document.createElement("td"); if (cells[i] == "Options") cell.className = elements.centerCell; cell.innerHTML = cells[i]; headRow2.appendChild(cell); } thead.appendChild(headRow1); thead.appendChild(headRow2); var tbody = document.createElement("tbody"); table.appendChild(thead); table.appendChild(tbody); ui.domainTables[tag] = tbody; var sublinks = document.createElement("p"); sublinks.className = elements.sublinks; var importZone = document.createElement("a"); importZone.href = "/dns/domain_import"; importZone.innerHTML = "Import a zone"; var separator = document.createElement("span"); separator.innerHTML = " | "; var clone = document.createElement("a"); clone.href = "/dns/domain_clone"; clone.innerHTML = "Clone an existing zone"; var add = document.createElement("a"); add.href = "/dns/domain_add"; add.innerHTML = "Add a domain zone"; sublinks.appendChild(importZone); sublinks.appendChild(separator); sublinks.appendChild(clone); sublinks.appendChild(separator.cloneNode(true)); sublinks.appendChild(add); ui.domains.appendChild(table); ui.domains.appendChild(sublinks); }; // Callback for domains API call var displayDomains = function(response) { // Add domains to array data.domains = data.domains.concat(response.data); // Add new tags to array for (var i = 0; i < response.data.length; i++) { if (!response.data[i].tags.length) data.noTag = true; for (var j = 0; j < response.data[i].tags.length; j++) { if (!data.domainTags.includes(response.data[i].tags[j])) data.domainTags.push(response.data[i].tags[j]); } } // Request the next page if there are more pages if (response.page != response.pages) { var progress = (response.page / response.pages) * 100; progress = progress.toFixed(0); ui.loading.innerHTML = "Loading " + progress + "%..."; var filters = null; if (data.params.tag) filters = { "tags": data.params.tag }; apiGet("/domains?page=" + (response.page + 1), displayDomains, filters); return; } // Remove tag filter if there are no domains with given tag if (!data.domains.length && data.params.tag) location.href = "/dns"; // Redirect to add page if there are no domains if (!data.domains.length && !data.params.tag) location.href = "/dns/domain_add"; // Sort data.domainTags.sort(); data.domains.sort(function(a, b) { return a.domain.toLowerCase().localeCompare(b.domain.toLowerCase()); }); // Create tables ui.loading.remove(); if (data.noTag) createDomainTable(""); for (var i = 0; i < data.domainTags.length; i++) createDomainTable(data.domainTags[i]); // Insert domains for (var i = 0; i < data.domains.length; i++) { if (!data.domains[i].tags.length) ui.domainTables[""].appendChild(createDomainRow(data.domains[i], ui.domainTables[""].children.length % 2)); for (var j = 0; j < data.domains[i].tags.length; j++) ui.domainTables[data.domains[i].tags[j]].appendChild(createDomainRow(data.domains[i], ui.domainTables[data.domains[i].tags[j]].children.length % 2)); } }; var setup = function() { // Parse URL parameters data.params = parseParams(); setupHeader(); // Get element references ui.domains = document.getElementById(elements.domains); ui.loading = document.getElementById(elements.loading); // Get linode and transfer info var filters = null; if (data.params.tag) filters = { "tags": data.params.tag }; apiGet("/domains", displayDomains, filters); }; // Attach onload handler window.addEventListener("load", setup); })();