238 lines
7.3 KiB
JavaScript
238 lines
7.3 KiB
JavaScript
/*
|
|
* 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 <https://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
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");
|
|
if (domain.type == "master")
|
|
nameLink.href = "/dns/domain?did=" + domain.id;
|
|
else
|
|
nameLink.href = "/dns/domain_slave?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 modified = document.createElement("td");
|
|
var modifiedDate = new Date(domain.updated + "Z");
|
|
modified.innerHTML = modifiedDate.toLocaleString();
|
|
row.appendChild(modified);
|
|
|
|
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");
|
|
if (domain.type == "master")
|
|
editLink.href = "/dns/domain?did=" + domain.id;
|
|
else
|
|
editLink.href = "/dns/domain_slave?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";
|
|
var zoneFileLink = document.createElement("a");
|
|
zoneFileLink.href = "/dns/domain_zonefile?did=" + domain.id;
|
|
zoneFileLink.innerHTML = "Zone file";
|
|
options.appendChild(editLink);
|
|
options.appendChild(separator);
|
|
options.appendChild(removeLink);
|
|
options.appendChild(separator.cloneNode(true));
|
|
options.appendChild(zoneFileLink);
|
|
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", "Last Modified", "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);
|
|
})();
|