Add Export to URL Functionality
This commit is contained in:
parent
e0406a6807
commit
0f9e38473d
4 changed files with 102 additions and 7 deletions
12
dist/css/main.css
vendored
12
dist/css/main.css
vendored
|
@ -47,12 +47,24 @@
|
||||||
border-bottom:1px black dotted;
|
border-bottom:1px black dotted;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#copy_url {
|
||||||
|
cursor:pointer !important;
|
||||||
|
text-align: center;
|
||||||
|
width:11rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
#copy_url span {
|
||||||
|
width:11rem;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
#color_palette {
|
#color_palette {
|
||||||
min-width: 0rem;
|
min-width: 0rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
#color_palette #colors_word_close {
|
#color_palette #colors_word_close {
|
||||||
line-height: 2rem;
|
line-height: 2rem;
|
||||||
|
cursor:pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
#color_palette #colors_word_open {
|
#color_palette #colors_word_open {
|
||||||
|
|
1
dist/index.html
vendored
1
dist/index.html
vendored
|
@ -110,6 +110,7 @@
|
||||||
<div id="palette_picker_10"></div>
|
<div id="palette_picker_10"></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="d-inline-block align-top align-top pt-1 ps-2 d-none" id="colors_word_close"><span>« Colors</span></div>
|
<div class="d-inline-block align-top align-top pt-1 ps-2 d-none" id="colors_word_close"><span>« Colors</span></div>
|
||||||
|
<div class="d-inline-block align-top pt-1 ps-3" id="copy_url"><span>Copy Shareable URL</span></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
92
dist/js/main.js
vendored
92
dist/js/main.js
vendored
|
@ -44,7 +44,7 @@ $('#btn_go').on('click', function() {
|
||||||
})
|
})
|
||||||
|
|
||||||
$('#importBtn').on('click', function() {
|
$('#importBtn').on('click', function() {
|
||||||
importConfig($('#importExportArea').val())
|
importConfig(JSON.parse($('#importExportArea').val()))
|
||||||
})
|
})
|
||||||
|
|
||||||
$('#bottom_nav #colors_word_open').on('click', function() {
|
$('#bottom_nav #colors_word_open').on('click', function() {
|
||||||
|
@ -60,6 +60,17 @@ $('#bottom_nav #colors_word_close').on('click', function() {
|
||||||
inflightColor = 'NONE'
|
inflightColor = 'NONE'
|
||||||
})
|
})
|
||||||
|
|
||||||
|
$('#bottom_nav #copy_url').on('click', function() {
|
||||||
|
// TODO: Provide a warning here if the URL is longer than 2000 characters, probably using a modal.
|
||||||
|
let url = window.location.origin + getConfigUrl()
|
||||||
|
navigator.clipboard.writeText(url);
|
||||||
|
$('#bottom_nav #copy_url span').text('Copied!')
|
||||||
|
// Swap the text back after 3sec
|
||||||
|
setTimeout(function(){
|
||||||
|
$('#bottom_nav #copy_url span').text('Copy Shareable URL')
|
||||||
|
}, 2000)
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
$('#btn_import_export').on('click', function() {
|
$('#btn_import_export').on('click', function() {
|
||||||
$('#importExportArea').val(JSON.stringify(exportConfig(), null, 2))
|
$('#importExportArea').val(JSON.stringify(exportConfig(), null, 2))
|
||||||
|
@ -146,7 +157,6 @@ function addRow(network, netSize, colspan, note, notesWidth, color) {
|
||||||
let styleTag = ''
|
let styleTag = ''
|
||||||
if (color !== '') {
|
if (color !== '') {
|
||||||
styleTag = ' style="background-color: ' + color + '"'
|
styleTag = ' style="background-color: ' + color + '"'
|
||||||
console.log(styleTag)
|
|
||||||
}
|
}
|
||||||
let newRow =
|
let newRow =
|
||||||
' <tr id="row_' + network.replace('.', '-') + '_' + netSize + '"' + styleTag + '>\n' +
|
' <tr id="row_' + network.replace('.', '-') + '_' + netSize + '"' + styleTag + '>\n' +
|
||||||
|
@ -354,10 +364,8 @@ function mutate_subnet_map(verb, network, subnetTree, propValue = '') {
|
||||||
}
|
}
|
||||||
} else if (verb === 'note') {
|
} else if (verb === 'note') {
|
||||||
subnetTree[mapKey]['_note'] = propValue
|
subnetTree[mapKey]['_note'] = propValue
|
||||||
console.log('Note Verb - ' + propValue)
|
|
||||||
} else if (verb === 'color') {
|
} else if (verb === 'color') {
|
||||||
subnetTree[mapKey]['_color'] = propValue
|
subnetTree[mapKey]['_color'] = propValue
|
||||||
console.log('Color Verb - ' + propValue)
|
|
||||||
} else {
|
} else {
|
||||||
// How did you get here?
|
// How did you get here?
|
||||||
}
|
}
|
||||||
|
@ -373,7 +381,10 @@ function show_warning_modal(message) {
|
||||||
}
|
}
|
||||||
|
|
||||||
$( document ).ready(function() {
|
$( document ).ready(function() {
|
||||||
|
let autoConfigResult = processConfigUrl();
|
||||||
|
if (!autoConfigResult) {
|
||||||
reset();
|
reset();
|
||||||
|
}
|
||||||
//importConfig('{"config_version":"1","subnets":{"10.0.0.0/16":{"10.0.0.0/17":{"10.0.0.0/18":{},"10.0.64.0/18":{}},"10.0.128.0/17":{"10.0.128.0/18":{"10.0.128.0/19":{},"10.0.160.0/19":{"10.0.160.0/20":{"10.0.160.0/21":{"10.0.160.0/22":{},"10.0.164.0/22":{}},"10.0.168.0/21":{}},"10.0.176.0/20":{"10.0.176.0/21":{"10.0.176.0/22":{"10.0.176.0/23":{},"10.0.178.0/23":{}},"10.0.180.0/22":{}},"10.0.184.0/21":{}}}},"10.0.192.0/18":{"10.0.192.0/19":{},"10.0.224.0/19":{}}}}},"notes":{}}')
|
//importConfig('{"config_version":"1","subnets":{"10.0.0.0/16":{"10.0.0.0/17":{"10.0.0.0/18":{},"10.0.64.0/18":{}},"10.0.128.0/17":{"10.0.128.0/18":{"10.0.128.0/19":{},"10.0.160.0/19":{"10.0.160.0/20":{"10.0.160.0/21":{"10.0.160.0/22":{},"10.0.164.0/22":{}},"10.0.168.0/21":{}},"10.0.176.0/20":{"10.0.176.0/21":{"10.0.176.0/22":{"10.0.176.0/23":{},"10.0.178.0/23":{}},"10.0.180.0/22":{}},"10.0.184.0/21":{}}}},"10.0.192.0/18":{"10.0.192.0/19":{},"10.0.224.0/19":{}}}}},"notes":{}}')
|
||||||
//importConfig('{"config_version":"1","subnets":{"10.0.0.0/16":{"10.0.0.0/17":{"10.0.0.0/18":{"_note":"Note 1"},"10.0.64.0/18":{"_note":"Note 2"}},"10.0.128.0/17":{"10.0.128.0/18":{"10.0.128.0/19":{"_note":"Note 3"},"10.0.160.0/19":{"10.0.160.0/20":{"10.0.160.0/21":{"10.0.160.0/22":{"_note":"Note 4"},"10.0.164.0/22":{"_note":"Note 5"}},"10.0.168.0/21":{"_note":"Note 6"}},"10.0.176.0/20":{"10.0.176.0/21":{"10.0.176.0/22":{"10.0.176.0/23":{"_note":"Note 7"},"10.0.178.0/23":{"_note":"Note 8"}},"10.0.180.0/22":{"_note":"Note 9"}},"10.0.184.0/21":{"_note":"Note 10"}}}},"10.0.192.0/18":{"10.0.192.0/19":{"_note":"Note 11"},"10.0.224.0/19":{"_note":"Note 12"}}}}},"notes":{}}')
|
//importConfig('{"config_version":"1","subnets":{"10.0.0.0/16":{"10.0.0.0/17":{"10.0.0.0/18":{"_note":"Note 1"},"10.0.64.0/18":{"_note":"Note 2"}},"10.0.128.0/17":{"10.0.128.0/18":{"10.0.128.0/19":{"_note":"Note 3"},"10.0.160.0/19":{"10.0.160.0/20":{"10.0.160.0/21":{"10.0.160.0/22":{"_note":"Note 4"},"10.0.164.0/22":{"_note":"Note 5"}},"10.0.168.0/21":{"_note":"Note 6"}},"10.0.176.0/20":{"10.0.176.0/21":{"10.0.176.0/22":{"10.0.176.0/23":{"_note":"Note 7"},"10.0.178.0/23":{"_note":"Note 8"}},"10.0.180.0/22":{"_note":"Note 9"}},"10.0.184.0/21":{"_note":"Note 10"}}}},"10.0.192.0/18":{"10.0.192.0/19":{"_note":"Note 11"},"10.0.224.0/19":{"_note":"Note 12"}}}}},"notes":{}}')
|
||||||
});
|
});
|
||||||
|
@ -385,9 +396,80 @@ function exportConfig() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getConfigUrl() {
|
||||||
|
let defaultExport = JSON.parse(JSON.stringify(exportConfig()));
|
||||||
|
renameKey(defaultExport, 'config_version', 'v')
|
||||||
|
renameKey(defaultExport, 'subnets', 's')
|
||||||
|
shortenKeys(defaultExport['s'])
|
||||||
|
return '/index.html?c=' + LZString.compressToEncodedURIComponent(JSON.stringify(defaultExport))
|
||||||
|
}
|
||||||
|
|
||||||
|
function processConfigUrl() {
|
||||||
|
const params = new Proxy(new URLSearchParams(window.location.search), {
|
||||||
|
get: (searchParams, prop) => searchParams.get(prop),
|
||||||
|
});
|
||||||
|
if (params['c'] !== null) {
|
||||||
|
let urlConfig = JSON.parse(LZString.decompressFromEncodedURIComponent(params['c']))
|
||||||
|
renameKey(urlConfig, 'v', 'config_version')
|
||||||
|
renameKey(urlConfig, 's', 'subnets')
|
||||||
|
expandKeys(urlConfig['subnets'])
|
||||||
|
let subnet_split = Object.keys(urlConfig['subnets'])[0].split('/')
|
||||||
|
$('#network').val(subnet_split[0])
|
||||||
|
$('#netsize').val(subnet_split[1])
|
||||||
|
importConfig(urlConfig)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function shortenKeys(subnetTree) {
|
||||||
|
for (let mapKey in subnetTree) {
|
||||||
|
if (mapKey.startsWith('_')) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (has_network_sub_keys(subnetTree[mapKey])) {
|
||||||
|
shortenKeys(subnetTree[mapKey])
|
||||||
|
} else {
|
||||||
|
if (subnetTree[mapKey].hasOwnProperty('_note')) {
|
||||||
|
renameKey(subnetTree[mapKey], '_note', '_n')
|
||||||
|
}
|
||||||
|
if (subnetTree[mapKey].hasOwnProperty('_color')) {
|
||||||
|
renameKey(subnetTree[mapKey], '_color', '_c')
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function expandKeys(subnetTree) {
|
||||||
|
for (let mapKey in subnetTree) {
|
||||||
|
if (mapKey.startsWith('_')) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (has_network_sub_keys(subnetTree[mapKey])) {
|
||||||
|
expandKeys(subnetTree[mapKey])
|
||||||
|
} else {
|
||||||
|
if (subnetTree[mapKey].hasOwnProperty('_n')) {
|
||||||
|
renameKey(subnetTree[mapKey], '_n', '_note')
|
||||||
|
}
|
||||||
|
if (subnetTree[mapKey].hasOwnProperty('_c')) {
|
||||||
|
renameKey(subnetTree[mapKey], '_c', '_color')
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function renameKey(obj, oldKey, newKey) {
|
||||||
|
if (oldKey !== newKey) {
|
||||||
|
Object.defineProperty(obj, newKey,
|
||||||
|
Object.getOwnPropertyDescriptor(obj, oldKey));
|
||||||
|
delete obj[oldKey];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function importConfig(text) {
|
function importConfig(text) {
|
||||||
// TODO: Probably need error checking here
|
// TODO: Probably need error checking here
|
||||||
text = JSON.parse(text)
|
|
||||||
if (text['config_version'] === '1') {
|
if (text['config_version'] === '1') {
|
||||||
subnetMap = text['subnets'];
|
subnetMap = text['subnets'];
|
||||||
renderTable()
|
renderTable()
|
||||||
|
|
|
@ -7,6 +7,6 @@
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"postinstall": "npm install -g sass",
|
"postinstall": "npm install -g sass",
|
||||||
"build": "sass --style compressed scss/custom.scss:../dist/css/bootstrap.min.css && cp node_modules/lz-string/libs/lz-string.min.js ../dist/js/lz-string.min.js",
|
"build": "sass --style compressed scss/custom.scss:../dist/css/bootstrap.min.css && cp node_modules/lz-string/libs/lz-string.min.js ../dist/js/lz-string.min.js",
|
||||||
"start": "node node_modules/http-server/bin/http-server ../dist"
|
"start": "node node_modules/http-server/bin/http-server ../dist -c-1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue