update json by base64

Update JSON in DOM by base64 equivalent to avoid parse issues with large JSON elements (like global config)
This commit is contained in:
Jordan Blasenhauer 2024-07-08 13:24:19 +02:00
parent f7bbffe93f
commit a5d504df3a
20 changed files with 204 additions and 18105 deletions

View file

@ -137,9 +137,9 @@ async function setBuildTempToUI() {
{% endfor %}
{% endwith %}
<div class='hidden' data-csrf-token='{{ csrf_token() }}'></div>
<div class='hidden' data-server-global='{{data_server_global if data_server_global else {}}}''></div>
<div class='hidden' data-server-global='{{data_server_global if data_server_global else {}}}'></div>
<div class='hidden' data-server-flash='{{data_server_flash|tojson}}'></div>
<div class='hidden' data-server-builder='{{data_server_builder}}'></div>
<div class='hidden' data-server-builder='{{data_server_builder[1:-1]}}'></div>
<div id='app'></div>
</body>
</html>`;

File diff suppressed because one or more lines are too long

View file

@ -1,5 +1,6 @@
import json
import copy
import base64
plugins = [
@ -3036,15 +3037,9 @@ def get_service_forms(templates=[], plugins=[], service_settings={}):
forms = {"advanced": {}, "easy": {}, "raw": {}}
for template in templates:
forms["advanced"][template.get("name")] = set_advanced(
template, plugins, service_settings
)
forms["raw"][template.get("name")] = set_raw(
template, plugins, service_settings
)
forms["easy"][template.get("name")] = set_easy(
template, plugins, service_settings
)
forms["advanced"][template.get("name")] = set_advanced(template, plugins, service_settings)
forms["raw"][template.get("name")] = set_raw(template, plugins, service_settings)
forms["easy"][template.get("name")] = set_easy(template, plugins, service_settings)
return forms
@ -3111,9 +3106,7 @@ def set_raw(template, plugins_base, service_settings):
for plugin in plugins:
for setting, value in plugin.get("settings").items():
# avoid some methods from services_settings
if setting in service_settings and service_settings[setting].get(
"method", "ui"
) not in ("ui", "default"):
if setting in service_settings and service_settings[setting].get("method", "ui") not in ("ui", "default"):
continue
raw_value = False
@ -3125,9 +3118,7 @@ def set_raw(template, plugins_base, service_settings):
# Then override by service settings
if setting in service_settings:
raw_value = service_settings[setting].get(
"value", value.get("value", value.get("default"))
)
raw_value = service_settings[setting].get("value", value.get("value", value.get("default")))
# Add value only if exists
if raw_value:
@ -3158,9 +3149,45 @@ def set_advanced(template, plugins_base, service_settings):
template_settings,
service_settings,
)
set_multiples(plugins)
return plugins
def set_multiples(format_plugins):
"""
Set the multiples settings for each plugin.
"""
# copy of format plugins
for plugin in format_plugins:
# Prepare multiples key
plugin["multiples"] = {}
# Get multiples
multiples = {}
settings_to_delete = []
for setting, value in plugin.get("settings").items():
if not value.get("multiple"):
continue
mult_name = value.get("multiple")
# Get the multiple value and set it as key if not in multiples dict
if mult_name not in multiples:
multiples[mult_name] = {}
multiples[mult_name][setting] = value
settings_to_delete.append(setting)
# Delete multiple settings from regular settings
for setting in settings_to_delete:
del plugin["settings"][setting]
if len(multiples):
plugin["multiples"].update(multiples)
return format_plugins
def format_setting(
setting_name,
setting_value,
@ -3182,11 +3209,7 @@ def format_setting(
inpType = (
"checkbox"
if setting_value.get("type") == "check"
else (
"select"
if setting_value.get("type") == "select"
else "datepicker" if setting_value.get("type") == "date" else "input"
)
else ("select" if setting_value.get("type") == "select" else "datepicker" if setting_value.get("type") == "date" else "input")
)
setting_value["inpType"] = inpType
@ -3209,27 +3232,17 @@ def format_setting(
# Start by setting template value if exists
if setting_name in template_settings:
# Update value or set default as value
setting_value["value"] = template_settings.get(
setting_name, setting_value.get("default")
)
setting_value["value"] = template_settings.get(setting_name, setting_value.get("default"))
# Then override by service settings
if setting_name in service_settings:
setting_value["value"] = service_settings[setting_name].get(
"value", setting_value.get("value", setting_value.get("default"))
)
setting_value["disabled"] = (
False
if service_settings[setting_name].get("method", "ui") in ("ui", "default")
else True
)
setting_value["value"] = service_settings[setting_name].get("value", setting_value.get("value", setting_value.get("default")))
setting_value["disabled"] = False if service_settings[setting_name].get("method", "ui") in ("ui", "default") else True
# Prepare popover checking "help", "context"
popovers = []
if (setting_value.get("disabled", False)) and service_settings[setting_name].get(
"method", "ui"
) not in ("ui", "default"):
if (setting_value.get("disabled", False)) and service_settings[setting_name].get("method", "ui") not in ("ui", "default"):
popovers.append(
{
"iconName": "trespass",
@ -3240,14 +3253,8 @@ def format_setting(
if setting_value.get("context"):
popovers.append(
{
"iconName": (
"disk" if setting_value.get("context") == "multisite" else "globe"
),
"text": (
"inp_popover_multisite"
if setting_value.get("context") == "multisite"
else "inp_popover_global"
),
"iconName": ("disk" if setting_value.get("context") == "multisite" else "globe"),
"text": ("inp_popover_multisite" if setting_value.get("context") == "multisite" else "inp_popover_global"),
}
)
@ -3283,9 +3290,7 @@ def global_config_builder():
{
"type": "Templates",
"data": {
"templates": get_service_forms(
templates, plugins, service_settings
),
"templates": get_service_forms(templates, plugins, service_settings),
},
},
],
@ -3296,6 +3301,10 @@ def global_config_builder():
output = global_config_builder()
with open("globalconfig.json", "w") as f:
with open("globalconfig64.txt", "w") as f:
json.dump(output, f, indent=4)
output_base64_bytes = base64.b64encode(bytes(json.dumps(output), "utf-8"))
output_base64_string = output_base64_bytes.decode("ascii")
with open("globalconfig64.txt", "w") as f:
f.write(output_base64_string)

File diff suppressed because one or more lines are too long

107
src/client/tests/home.json Normal file
View file

@ -0,0 +1,107 @@
[
{
"type": "card",
"link": "https://panel.bunkerweb.io/?utm_campaign=self&utm_source=ui#pro",
"containerColumns": {
"pc": 4,
"tablet": 6,
"mobile": 12
},
"widgets": [
{
"type": "Stat",
"data": {
"title": "home_version",
"subtitle": "home_upgrade_to_pro",
"subtitleColor": "warning",
"stat": "home_free",
"iconName": "key"
}
}
]
},
{
"type": "card",
"link": "https://github.com/bunkerity/bunkerweb",
"containerColumns": {
"pc": 4,
"tablet": 6,
"mobile": 12
},
"widgets": [
{
"type": "Stat",
"data": {
"title": "home_version_number",
"subtitle": "home_update_available",
"subtitleColor": "warning",
"stat": "1.5.8",
"iconName": "wire"
}
}
]
},
{
"type": "card",
"link": "/instances",
"containerColumns": {
"pc": 4,
"tablet": 6,
"mobile": 12
},
"widgets": [
{
"type": "Stat",
"data": {
"title": "home_instances",
"subtitle": "home_total_number",
"subtitleColor": "info",
"stat": 1,
"iconName": "box"
}
}
]
},
{
"type": "card",
"link": "/services",
"containerColumns": {
"pc": 4,
"tablet": 6,
"mobile": 12
},
"widgets": [
{
"type": "Stat",
"data": {
"title": "home_services",
"subtitle": "home_all_methods_included",
"subtitleColor": "info",
"stat": 2,
"iconName": "disk"
}
}
]
},
{
"type": "card",
"link": "/plugins",
"containerColumns": {
"pc": 4,
"tablet": 6,
"mobile": 12
},
"widgets": [
{
"type": "Stat",
"data": {
"title": "home_plugins",
"subtitle": "home_no_error",
"subtitleColor": "success",
"stat": "42",
"iconName": "puzzle"
}
}
]
}
]

View file

@ -1,4 +1,5 @@
import json
import base64
home = [
{
@ -91,3 +92,8 @@ home = [
# store on a file
with open("home.json", "w") as f:
json.dump(home, f, indent=4)
output_base64_bytes = base64.b64encode(bytes(json.dumps(home), "utf-8"))
output_base64_string = output_base64_bytes.decode("ascii")
with open("home.txt", "w") as f:
f.write(output_base64_string)

View file

@ -0,0 +1 @@
W3sidHlwZSI6ICJjYXJkIiwgImxpbmsiOiAiaHR0cHM6Ly9wYW5lbC5idW5rZXJ3ZWIuaW8vP3V0bV9jYW1wYWlnbj1zZWxmJnV0bV9zb3VyY2U9dWkjcHJvIiwgImNvbnRhaW5lckNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJ3aWRnZXRzIjogW3sidHlwZSI6ICJTdGF0IiwgImRhdGEiOiB7InRpdGxlIjogImhvbWVfdmVyc2lvbiIsICJzdWJ0aXRsZSI6ICJob21lX3VwZ3JhZGVfdG9fcHJvIiwgInN1YnRpdGxlQ29sb3IiOiAid2FybmluZyIsICJzdGF0IjogImhvbWVfZnJlZSIsICJpY29uTmFtZSI6ICJrZXkifX1dfSwgeyJ0eXBlIjogImNhcmQiLCAibGluayI6ICJodHRwczovL2dpdGh1Yi5jb20vYnVua2VyaXR5L2J1bmtlcndlYiIsICJjb250YWluZXJDb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAid2lkZ2V0cyI6IFt7InR5cGUiOiAiU3RhdCIsICJkYXRhIjogeyJ0aXRsZSI6ICJob21lX3ZlcnNpb25fbnVtYmVyIiwgInN1YnRpdGxlIjogImhvbWVfdXBkYXRlX2F2YWlsYWJsZSIsICJzdWJ0aXRsZUNvbG9yIjogIndhcm5pbmciLCAic3RhdCI6ICIxLjUuOCIsICJpY29uTmFtZSI6ICJ3aXJlIn19XX0sIHsidHlwZSI6ICJjYXJkIiwgImxpbmsiOiAiL2luc3RhbmNlcyIsICJjb250YWluZXJDb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAid2lkZ2V0cyI6IFt7InR5cGUiOiAiU3RhdCIsICJkYXRhIjogeyJ0aXRsZSI6ICJob21lX2luc3RhbmNlcyIsICJzdWJ0aXRsZSI6ICJob21lX3RvdGFsX251bWJlciIsICJzdWJ0aXRsZUNvbG9yIjogImluZm8iLCAic3RhdCI6IDEsICJpY29uTmFtZSI6ICJib3gifX1dfSwgeyJ0eXBlIjogImNhcmQiLCAibGluayI6ICIvc2VydmljZXMiLCAiY29udGFpbmVyQ29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgIndpZGdldHMiOiBbeyJ0eXBlIjogIlN0YXQiLCAiZGF0YSI6IHsidGl0bGUiOiAiaG9tZV9zZXJ2aWNlcyIsICJzdWJ0aXRsZSI6ICJob21lX2FsbF9tZXRob2RzX2luY2x1ZGVkIiwgInN1YnRpdGxlQ29sb3IiOiAiaW5mbyIsICJzdGF0IjogMiwgImljb25OYW1lIjogImRpc2sifX1dfSwgeyJ0eXBlIjogImNhcmQiLCAibGluayI6ICIvcGx1Z2lucyIsICJjb250YWluZXJDb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAid2lkZ2V0cyI6IFt7InR5cGUiOiAiU3RhdCIsICJkYXRhIjogeyJ0aXRsZSI6ICJob21lX3BsdWdpbnMiLCAic3VidGl0bGUiOiAiaG9tZV9ub19lcnJvciIsICJzdWJ0aXRsZUNvbG9yIjogInN1Y2Nlc3MiLCAic3RhdCI6ICI0MiIsICJpY29uTmFtZSI6ICJwdXp6bGUifX1dfV0=

View file

@ -1,4 +1,5 @@
import json
import base64
# Create instance class using keys from the instances list
@ -75,3 +76,9 @@ builder = instances_builder(instances)
# store on a file
with open("instances.json", "w") as f:
json.dump(builder, f)
output_base64_bytes = base64.b64encode(bytes(json.dumps(builder), "utf-8"))
output_base64_string = output_base64_bytes.decode("ascii")
with open("instances.txt", "w") as f:
f.write(output_base64_string)

View file

@ -0,0 +1 @@
W3sidHlwZSI6ICJjYXJkIiwgImNvbnRhaW5lckNvbHVtbnMiOiB7InBjIjogNiwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJ3aWRnZXRzIjogW3sidHlwZSI6ICJJbnN0YW5jZSIsICJkYXRhIjogeyJwYWlycyI6IFt7ImtleSI6ICJpbnN0YW5jZXNfaG9zdG5hbWUiLCAidmFsdWUiOiAiYnVua2Vyd2ViIn0sIHsia2V5IjogImluc3RhbmNlc190eXBlIiwgInZhbHVlIjogIm1hbnVhbCJ9LCB7ImtleSI6ICJpbnN0YW5jZXNfc3RhdHVzIiwgInZhbHVlIjogImluc3RhbmNlc19hY3RpdmUifV0sICJzdGF0dXMiOiAic3VjY2VzcyIsICJ0aXRsZSI6ICJidW5rZXJ3ZWIiLCAiYnV0dG9ucyI6IFt7ImF0dHJzIjogeyJkYXRhLXN1Ym1pdC1mb3JtIjogIntcIklOU1RBTkNFX0lEXCIgOiBcImJ1bmtlcndlYlwiLCBcIm9wZXJhdGlvblwiIDogXCJyZWxvYWRcIiB9In0sICJ0ZXh0IjogImFjdGlvbl9yZWxvYWQiLCAiY29sb3IiOiAid2FybmluZyJ9LCB7ImF0dHJzIjogeyJkYXRhLXN1Ym1pdC1mb3JtIjogIntcIklOU1RBTkNFX0lEXCIgOiBcImJ1bmtlcndlYlwiLCBcIm9wZXJhdGlvblwiIDogXCJzdG9wXCIgfSJ9LCAidGV4dCI6ICJhY3Rpb25fc3RvcCIsICJjb2xvciI6ICJlcnJvciJ9XX19XX0sIHsidHlwZSI6ICJjYXJkIiwgImNvbnRhaW5lckNvbHVtbnMiOiB7InBjIjogNiwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJ3aWRnZXRzIjogW3sidHlwZSI6ICJJbnN0YW5jZSIsICJkYXRhIjogeyJwYWlycyI6IFt7ImtleSI6ICJpbnN0YW5jZXNfaG9zdG5hbWUiLCAidmFsdWUiOiAiYnVua2Vyd2ViIn0sIHsia2V5IjogImluc3RhbmNlc190eXBlIiwgInZhbHVlIjogIm1hbnVhbCJ9LCB7ImtleSI6ICJpbnN0YW5jZXNfc3RhdHVzIiwgInZhbHVlIjogImluc3RhbmNlc19hY3RpdmUifV0sICJzdGF0dXMiOiAic3VjY2VzcyIsICJ0aXRsZSI6ICJidW5rZXJ3ZWIiLCAiYnV0dG9ucyI6IFt7ImF0dHJzIjogeyJkYXRhLXN1Ym1pdC1mb3JtIjogIntcIklOU1RBTkNFX0lEXCIgOiBcImJ1bmtlcndlYlwiLCBcIm9wZXJhdGlvblwiIDogXCJyZWxvYWRcIiB9In0sICJ0ZXh0IjogImFjdGlvbl9yZWxvYWQiLCAiY29sb3IiOiAid2FybmluZyJ9LCB7ImF0dHJzIjogeyJkYXRhLXN1Ym1pdC1mb3JtIjogIntcIklOU1RBTkNFX0lEXCIgOiBcImJ1bmtlcndlYlwiLCBcIm9wZXJhdGlvblwiIDogXCJzdG9wXCIgfSJ9LCAidGV4dCI6ICJhY3Rpb25fc3RvcCIsICJjb2xvciI6ICJlcnJvciJ9XX19XX1d

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

View file

@ -20,7 +20,7 @@ onBeforeMount(() => {
const dataEl = document.querySelector(`[${dataAtt}]`);
const data =
dataEl && !dataEl.getAttribute(dataAtt).includes(dataAtt)
? JSON.parse(dataEl.getAttribute(dataAtt))
? JSON.parse(atob(dataEl.getAttribute(dataAtt)))
: {};
home.builder = data;
});

View file

@ -14,7 +14,7 @@
data-server-flash='[{"type" : "success", "title" : "success", "message" : "Success feedback"}, {"type" : "error", "title" : "error", "message" : "Error feedback"}, {"type" : "warning", "title" : "warning", "message" : "Warning feedback"}, {"type" : "info", "title" : "info", "message" : "Info feedback"}]'>
</div>
<div class="hidden"
data-server-builder='[{"type":"card","link":"https://panel.bunkerweb.io/?utm_campaign=self&utm_source=ui#pro","containerColumns":{"pc":4,"tablet":6,"mobile":12},"widgets":[{"type":"Stat","data":{"title":"home_version","subtitle":"home_upgrade_to_pro","subtitleColor":"warning","stat":"home_free","iconName":"key"}}]},{"type":"card","link":"https://github.com/bunkerity/bunkerweb","containerColumns":{"pc":4,"tablet":6,"mobile":12},"widgets":[{"type":"Stat","data":{"title":"home_version_number","subtitle":"home_update_available","subtitleColor":"warning","stat":"1.5.8","iconName":"wire"}}]},{"type":"card","link":"/instances","containerColumns":{"pc":4,"tablet":6,"mobile":12},"widgets":[{"type":"Stat","data":{"title":"home_instances","subtitle":"home_total_number","subtitleColor":"info","stat":1,"iconName":"box"}}]},{"type":"card","link":"/services","containerColumns":{"pc":4,"tablet":6,"mobile":12},"widgets":[{"type":"Stat","data":{"title":"home_services","subtitle":"home_all_methods_included","subtitleColor":"info","stat":2,"iconName":"disk"}}]},{"type":"card","link":"/plugins","containerColumns":{"pc":4,"tablet":6,"mobile":12},"widgets":[{"type":"Stat","data":{"title":"home_plugins","subtitle":"home_no_error","subtitleColor":"success","stat":"42","iconName":"puzzle"}}]}]'>
data-server-builder='W3sidHlwZSI6ICJjYXJkIiwgImxpbmsiOiAiaHR0cHM6Ly9wYW5lbC5idW5rZXJ3ZWIuaW8vP3V0bV9jYW1wYWlnbj1zZWxmJnV0bV9zb3VyY2U9dWkjcHJvIiwgImNvbnRhaW5lckNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJ3aWRnZXRzIjogW3sidHlwZSI6ICJTdGF0IiwgImRhdGEiOiB7InRpdGxlIjogImhvbWVfdmVyc2lvbiIsICJzdWJ0aXRsZSI6ICJob21lX3VwZ3JhZGVfdG9fcHJvIiwgInN1YnRpdGxlQ29sb3IiOiAid2FybmluZyIsICJzdGF0IjogImhvbWVfZnJlZSIsICJpY29uTmFtZSI6ICJrZXkifX1dfSwgeyJ0eXBlIjogImNhcmQiLCAibGluayI6ICJodHRwczovL2dpdGh1Yi5jb20vYnVua2VyaXR5L2J1bmtlcndlYiIsICJjb250YWluZXJDb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAid2lkZ2V0cyI6IFt7InR5cGUiOiAiU3RhdCIsICJkYXRhIjogeyJ0aXRsZSI6ICJob21lX3ZlcnNpb25fbnVtYmVyIiwgInN1YnRpdGxlIjogImhvbWVfdXBkYXRlX2F2YWlsYWJsZSIsICJzdWJ0aXRsZUNvbG9yIjogIndhcm5pbmciLCAic3RhdCI6ICIxLjUuOCIsICJpY29uTmFtZSI6ICJ3aXJlIn19XX0sIHsidHlwZSI6ICJjYXJkIiwgImxpbmsiOiAiL2luc3RhbmNlcyIsICJjb250YWluZXJDb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAid2lkZ2V0cyI6IFt7InR5cGUiOiAiU3RhdCIsICJkYXRhIjogeyJ0aXRsZSI6ICJob21lX2luc3RhbmNlcyIsICJzdWJ0aXRsZSI6ICJob21lX3RvdGFsX251bWJlciIsICJzdWJ0aXRsZUNvbG9yIjogImluZm8iLCAic3RhdCI6IDEsICJpY29uTmFtZSI6ICJib3gifX1dfSwgeyJ0eXBlIjogImNhcmQiLCAibGluayI6ICIvc2VydmljZXMiLCAiY29udGFpbmVyQ29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgIndpZGdldHMiOiBbeyJ0eXBlIjogIlN0YXQiLCAiZGF0YSI6IHsidGl0bGUiOiAiaG9tZV9zZXJ2aWNlcyIsICJzdWJ0aXRsZSI6ICJob21lX2FsbF9tZXRob2RzX2luY2x1ZGVkIiwgInN1YnRpdGxlQ29sb3IiOiAiaW5mbyIsICJzdGF0IjogMiwgImljb25OYW1lIjogImRpc2sifX1dfSwgeyJ0eXBlIjogImNhcmQiLCAibGluayI6ICIvcGx1Z2lucyIsICJjb250YWluZXJDb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAid2lkZ2V0cyI6IFt7InR5cGUiOiAiU3RhdCIsICJkYXRhIjogeyJ0aXRsZSI6ICJob21lX3BsdWdpbnMiLCAic3VidGl0bGUiOiAiaG9tZV9ub19lcnJvciIsICJzdWJ0aXRsZUNvbG9yIjogInN1Y2Nlc3MiLCAic3RhdCI6ICI0MiIsICJpY29uTmFtZSI6ICJwdXp6bGUifX1dfV0'>
</div>
<div id="app"></div>
<script type="module" src="home.js"></script>

View file

@ -21,7 +21,7 @@ onBeforeMount(() => {
const dataEl = document.querySelector(`[${dataAtt}]`);
const data =
dataEl && !dataEl.getAttribute(dataAtt).includes(dataAtt)
? JSON.parse(dataEl.getAttribute(dataAtt))
? JSON.parse(atob(dataEl.getAttribute(dataAtt)))
: {};
instances.builder = data;
});

View file

@ -14,7 +14,7 @@
data-server-flash='[{"type" : "success", "title" : "title", "message" : "Success feedback"}, {"type" : "error", "title" : "title", "message" : "Error feedback"}, {"type" : "warning", "title" : "title", "message" : "Warning feedback"}, {"type" : "info", "title" : "title", "message" : "Info feedback"}]'>
</div>
<div class="hidden"
data-server-builder='[{"type": "card", "containerColumns": {"pc": 6, "tablet": 6, "mobile": 12}, "widgets": [{"type": "Instance", "data": {"pairs": [{"key": "instances_hostname", "value": "bunkerweb"}, {"key": "instances_type", "value": "manual"}, {"key": "instances_status", "value": "instances_active"}], "status": "success", "title": "bunkerweb", "buttons": [{"attrs": {"data-submit-form": "{\"INSTANCE_ID\" : \"bunkerweb\", \"operation\" : \"reload\" }"}, "text": "action_reload", "color": "warning"}, {"attrs": {"data-submit-form": "{\"INSTANCE_ID\" : \"bunkerweb\", \"operation\" : \"stop\" }"}, "text": "action_stop", "color": "error"}]}}]}, {"type": "card", "containerColumns": {"pc": 6, "tablet": 6, "mobile": 12}, "widgets": [{"type": "Instance", "data": {"pairs": [{"key": "instances_hostname", "value": "bunkerweb"}, {"key": "instances_type", "value": "manual"}, {"key": "instances_status", "value": "instances_active"}], "status": "success", "title": "bunkerweb", "buttons": [{"attrs": {"data-submit-form": "{\"INSTANCE_ID\" : \"bunkerweb\", \"operation\" : \"reload\" }"}, "text": "action_reload", "color": "warning"}, {"attrs": {"data-submit-form": "{\"INSTANCE_ID\" : \"bunkerweb\", \"operation\" : \"stop\" }"}, "text": "action_stop", "color": "error"}]}}]}]'>
data-server-builder='W3sidHlwZSI6ICJjYXJkIiwgImNvbnRhaW5lckNvbHVtbnMiOiB7InBjIjogNiwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJ3aWRnZXRzIjogW3sidHlwZSI6ICJJbnN0YW5jZSIsICJkYXRhIjogeyJwYWlycyI6IFt7ImtleSI6ICJpbnN0YW5jZXNfaG9zdG5hbWUiLCAidmFsdWUiOiAiYnVua2Vyd2ViIn0sIHsia2V5IjogImluc3RhbmNlc190eXBlIiwgInZhbHVlIjogIm1hbnVhbCJ9LCB7ImtleSI6ICJpbnN0YW5jZXNfc3RhdHVzIiwgInZhbHVlIjogImluc3RhbmNlc19hY3RpdmUifV0sICJzdGF0dXMiOiAic3VjY2VzcyIsICJ0aXRsZSI6ICJidW5rZXJ3ZWIiLCAiYnV0dG9ucyI6IFt7ImF0dHJzIjogeyJkYXRhLXN1Ym1pdC1mb3JtIjogIntcIklOU1RBTkNFX0lEXCIgOiBcImJ1bmtlcndlYlwiLCBcIm9wZXJhdGlvblwiIDogXCJyZWxvYWRcIiB9In0sICJ0ZXh0IjogImFjdGlvbl9yZWxvYWQiLCAiY29sb3IiOiAid2FybmluZyJ9LCB7ImF0dHJzIjogeyJkYXRhLXN1Ym1pdC1mb3JtIjogIntcIklOU1RBTkNFX0lEXCIgOiBcImJ1bmtlcndlYlwiLCBcIm9wZXJhdGlvblwiIDogXCJzdG9wXCIgfSJ9LCAidGV4dCI6ICJhY3Rpb25fc3RvcCIsICJjb2xvciI6ICJlcnJvciJ9XX19XX0sIHsidHlwZSI6ICJjYXJkIiwgImNvbnRhaW5lckNvbHVtbnMiOiB7InBjIjogNiwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJ3aWRnZXRzIjogW3sidHlwZSI6ICJJbnN0YW5jZSIsICJkYXRhIjogeyJwYWlycyI6IFt7ImtleSI6ICJpbnN0YW5jZXNfaG9zdG5hbWUiLCAidmFsdWUiOiAiYnVua2Vyd2ViIn0sIHsia2V5IjogImluc3RhbmNlc190eXBlIiwgInZhbHVlIjogIm1hbnVhbCJ9LCB7ImtleSI6ICJpbnN0YW5jZXNfc3RhdHVzIiwgInZhbHVlIjogImluc3RhbmNlc19hY3RpdmUifV0sICJzdGF0dXMiOiAic3VjY2VzcyIsICJ0aXRsZSI6ICJidW5rZXJ3ZWIiLCAiYnV0dG9ucyI6IFt7ImF0dHJzIjogeyJkYXRhLXN1Ym1pdC1mb3JtIjogIntcIklOU1RBTkNFX0lEXCIgOiBcImJ1bmtlcndlYlwiLCBcIm9wZXJhdGlvblwiIDogXCJyZWxvYWRcIiB9In0sICJ0ZXh0IjogImFjdGlvbl9yZWxvYWQiLCAiY29sb3IiOiAid2FybmluZyJ9LCB7ImF0dHJzIjogeyJkYXRhLXN1Ym1pdC1mb3JtIjogIntcIklOU1RBTkNFX0lEXCIgOiBcImJ1bmtlcndlYlwiLCBcIm9wZXJhdGlvblwiIDogXCJzdG9wXCIgfSJ9LCAidGV4dCI6ICJhY3Rpb25fc3RvcCIsICJjb2xvciI6ICJlcnJvciJ9XX19XX1d'>
</div>
<div id="app"></div>
<script type="module" src="instances.js"></script>

View file

@ -1,5 +1,6 @@
#!/usr/bin/env python3
import json
import base64
from contextlib import suppress
from math import floor
from os import _exit, getenv, listdir, sep, urandom
@ -790,7 +791,8 @@ def home_builder(data):
],
}
builder = [version_card, version_num_card, instances_card, services_card, plugins_card]
return builder
return base64.b64encode(bytes(json.dumps(builder), "utf-8")).decode("ascii")
@app.route("/home")
@ -1074,7 +1076,7 @@ def instances_builder(instances: list):
builder.append(component)
return builder
return base64.b64encode(bytes(json.dumps(builder), "utf-8")).decode("ascii")
@app.route("/instances", methods=["GET", "POST"])

View file

@ -1 +1 @@
import{c as v,r as q,a as _,o as x,b as a,d as u,w as n,e as b,t as m,n as S,f as y,g as o,h as d,m as p,i as $,_ as h,F as f,j as N,k as g,l as B,p as E,q as k,s as A,u as V,v as j,x as z,y as I,z as L,A as O,B as P}from"./Title-9ae7a316.js";const w={__name:"Subtitle",props:{subtitle:{type:String,required:!0},type:{type:String,required:!1,default:"card"},tag:{type:String,required:!1,default:""},color:{type:String,required:!1,default:""},bold:{type:Boolean,required:!1,default:!1},uppercase:{type:Boolean,required:!1,default:!1},subtitleClass:{type:String,required:!1,default:""}},setup(i){const e=i,s=v(()=>e.tag?e.tag:"p"),r=q({class:""}),t=_(null);return x(()=>{r.class=e.subtitleClass||t.value.closest("[data-is]")?`subtitle-${t.value.closest("[data-is]").getAttribute("data-is")}`:"subtitle-card"}),(l,c)=>e.subtitle?(a(),u(y(s.value),{key:0,ref_key:"subtitleEl",ref:t,"data-subtitle":"",class:S([r.class,e.color,"text-el",e.bold?"bold":"",e.uppercase?"uppercase":""])},{default:n(()=>[b(m(l.$t(e.subtitle,l.$t("dashboard_placeholder",e.subtitle))),1)]),_:1},8,["class"])):o("",!0)}},D={key:1,class:S(["flex justify-center items-center"])},F={__name:"Text",props:{text:{type:[String,Number],required:!0},textClass:{type:String,required:!1,default:""},color:{type:String,required:!1,default:""},bold:{type:Boolean,required:!1,default:!1},uppercase:{type:Boolean,required:!1,default:!1},tag:{type:String,required:!1,default:"p"},icon:{type:[Boolean,Object],required:!1,default:!1},attrs:{type:Object,required:!1,default:{}}},setup(i){const e=i,s=q({class:""}),r=_(null),t=_(null);return x(()=>{const l=r.value||t.value||null,c=l.closest('[data-is="void"]')?"void":"";s.class=e.textClass||l.closest("[data-is]")?`text-${c||l.closest("[data-is]").getAttribute("data-is")}`:"text-card"}),(l,c)=>(a(),d(f,null,[e.icon?o("",!0):(a(),u(y(e.tag),p({key:0},e.attrs,{ref_key:"textEl",ref:r,class:[s.class,e.color,"text-el",e.bold?"bold":"",e.uppercase?"uppercase":""]}),{default:n(()=>[b(m(l.$t(e.text,l.$t("dashboard_placeholder",e.text))),1)]),_:1},16,["class"])),e.icon?(a(),d("div",D,[e.icon?(a(),u(h,$(p({key:0},e.icon)),null,16)):o("",!0),(a(),u(y(e.tag),p({ref_key:"textIconEl",ref:t},e.attrs,{class:[s.class,e.color,"text-el","ml-2"]}),{default:n(()=>[b(m(l.$t(e.text,l.$t("dashboard_placeholder",e.text))),1)]),_:1},16,["class"]))])):o("",!0)],64))}},H={__name:"Stat",props:{title:{type:String,required:!0},stat:{type:[String,Number],required:!0},subtitle:{type:String,required:!1,default:""},iconName:{type:String,required:!1,default:""},color:{type:String,required:!1,default:""},subtitleColor:{type:String,required:!1,default:"info"},statClass:{type:String,required:!1,default:""}},setup(i){const e=i;return(s,r)=>(a(),u(E,{"data-is":"stat",columns:{pc:12,tablet:12,mobile:12}},{default:n(()=>[N("div",{class:S(["stat-content-container",e.iconName?"is-icon":"no-icon"])},[g(B,{tag:"h3",title:e.title},null,8,["title"]),g(F,{text:e.stat},null,8,["text"]),e.subtitle?(a(),u(w,{key:0,subtitle:e.subtitle,color:e.subtitleColor},null,8,["subtitle","color"])):o("",!0)],2),e.iconName?(a(),u(h,{key:0,iconName:e.iconName,isStick:!0},null,8,["iconName"])):o("",!0)]),_:1}))}},M={__name:"Home",props:{builder:{type:Array,required:!0}},setup(i){const e=i;return(s,r)=>(a(!0),d(f,null,k(e.builder,(t,l)=>(a(),u(V,{key:l,gridLayoutClass:t.containerClass,type:t.type,title:t.title,link:t.link,columns:t.containerColumns,id:t.id},{default:n(()=>[g(A,null,{default:n(()=>[(a(!0),d(f,null,k(t.widgets,(c,C)=>(a(),d(f,{key:C},[c.type==="Stat"?(a(),u(H,$(p({key:0},c.data)),null,16)):o("",!0)],64))),128))]),_:2},1024)]),_:2},1032,["gridLayoutClass","type","title","link","columns","id"]))),128))}},T={__name:"Home",setup(i){const e=q({builder:""});return j(()=>{const s="data-server-builder",r=document.querySelector(`[${s}]`),t=r&&!r.getAttribute(s).includes(s)?JSON.parse(r.getAttribute(s)):{};e.builder=t}),x(()=>{z()}),(s,r)=>(a(),u(I,null,{default:n(()=>[e.builder?(a(),u(M,{key:0,builder:e.builder},null,8,["builder"])):o("",!0)]),_:1}))}},G=L();O(T).use(G).use(P(["dashboard","action","inp","icons","home"])).mount("#app");
import{c as v,r as q,a as _,o as x,b as a,d as u,w as n,e as b,t as m,n as S,f as y,g as o,h as d,m as p,i as $,_ as h,F as f,j as N,k as g,l as B,p as E,q as k,s as A,u as V,v as j,x as z,y as I,z as L,A as O,B as P}from"./Title-9ae7a316.js";const w={__name:"Subtitle",props:{subtitle:{type:String,required:!0},type:{type:String,required:!1,default:"card"},tag:{type:String,required:!1,default:""},color:{type:String,required:!1,default:""},bold:{type:Boolean,required:!1,default:!1},uppercase:{type:Boolean,required:!1,default:!1},subtitleClass:{type:String,required:!1,default:""}},setup(i){const e=i,s=v(()=>e.tag?e.tag:"p"),r=q({class:""}),t=_(null);return x(()=>{r.class=e.subtitleClass||t.value.closest("[data-is]")?`subtitle-${t.value.closest("[data-is]").getAttribute("data-is")}`:"subtitle-card"}),(l,c)=>e.subtitle?(a(),u(y(s.value),{key:0,ref_key:"subtitleEl",ref:t,"data-subtitle":"",class:S([r.class,e.color,"text-el",e.bold?"bold":"",e.uppercase?"uppercase":""])},{default:n(()=>[b(m(l.$t(e.subtitle,l.$t("dashboard_placeholder",e.subtitle))),1)]),_:1},8,["class"])):o("",!0)}},D={key:1,class:S(["flex justify-center items-center"])},F={__name:"Text",props:{text:{type:[String,Number],required:!0},textClass:{type:String,required:!1,default:""},color:{type:String,required:!1,default:""},bold:{type:Boolean,required:!1,default:!1},uppercase:{type:Boolean,required:!1,default:!1},tag:{type:String,required:!1,default:"p"},icon:{type:[Boolean,Object],required:!1,default:!1},attrs:{type:Object,required:!1,default:{}}},setup(i){const e=i,s=q({class:""}),r=_(null),t=_(null);return x(()=>{const l=r.value||t.value||null,c=l.closest('[data-is="void"]')?"void":"";s.class=e.textClass||l.closest("[data-is]")?`text-${c||l.closest("[data-is]").getAttribute("data-is")}`:"text-card"}),(l,c)=>(a(),d(f,null,[e.icon?o("",!0):(a(),u(y(e.tag),p({key:0},e.attrs,{ref_key:"textEl",ref:r,class:[s.class,e.color,"text-el",e.bold?"bold":"",e.uppercase?"uppercase":""]}),{default:n(()=>[b(m(l.$t(e.text,l.$t("dashboard_placeholder",e.text))),1)]),_:1},16,["class"])),e.icon?(a(),d("div",D,[e.icon?(a(),u(h,$(p({key:0},e.icon)),null,16)):o("",!0),(a(),u(y(e.tag),p({ref_key:"textIconEl",ref:t},e.attrs,{class:[s.class,e.color,"text-el","ml-2"]}),{default:n(()=>[b(m(l.$t(e.text,l.$t("dashboard_placeholder",e.text))),1)]),_:1},16,["class"]))])):o("",!0)],64))}},H={__name:"Stat",props:{title:{type:String,required:!0},stat:{type:[String,Number],required:!0},subtitle:{type:String,required:!1,default:""},iconName:{type:String,required:!1,default:""},color:{type:String,required:!1,default:""},subtitleColor:{type:String,required:!1,default:"info"},statClass:{type:String,required:!1,default:""}},setup(i){const e=i;return(s,r)=>(a(),u(E,{"data-is":"stat",columns:{pc:12,tablet:12,mobile:12}},{default:n(()=>[N("div",{class:S(["stat-content-container",e.iconName?"is-icon":"no-icon"])},[g(B,{tag:"h3",title:e.title},null,8,["title"]),g(F,{text:e.stat},null,8,["text"]),e.subtitle?(a(),u(w,{key:0,subtitle:e.subtitle,color:e.subtitleColor},null,8,["subtitle","color"])):o("",!0)],2),e.iconName?(a(),u(h,{key:0,iconName:e.iconName,isStick:!0},null,8,["iconName"])):o("",!0)]),_:1}))}},M={__name:"Home",props:{builder:{type:Array,required:!0}},setup(i){const e=i;return(s,r)=>(a(!0),d(f,null,k(e.builder,(t,l)=>(a(),u(V,{key:l,gridLayoutClass:t.containerClass,type:t.type,title:t.title,link:t.link,columns:t.containerColumns,id:t.id},{default:n(()=>[g(A,null,{default:n(()=>[(a(!0),d(f,null,k(t.widgets,(c,C)=>(a(),d(f,{key:C},[c.type==="Stat"?(a(),u(H,$(p({key:0},c.data)),null,16)):o("",!0)],64))),128))]),_:2},1024)]),_:2},1032,["gridLayoutClass","type","title","link","columns","id"]))),128))}},T={__name:"Home",setup(i){const e=q({builder:""});return j(()=>{const s="data-server-builder",r=document.querySelector(`[${s}]`),t=r&&!r.getAttribute(s).includes(s)?JSON.parse(atob(r.getAttribute(s))):{};e.builder=t}),x(()=>{z()}),(s,r)=>(a(),u(I,null,{default:n(()=>[e.builder?(a(),u(M,{key:0,builder:e.builder},null,8,["builder"])):o("",!0)]),_:1}))}},G=L();O(T).use(G).use(P(["dashboard","action","inp","icons","home"])).mount("#app");

View file

@ -1 +1 @@
import{r as h,c as $,v as k,C as v,b as r,h as n,j as _,n as p,t as g,F as d,q as m,g as b,a as S,o as q,d as i,m as C,D as A,w as f,k as c,l as B,p as E,s as w,i as I,u as N,x as P,y as D,z as F,A as L,B as O}from"./Title-9ae7a316.js";const x=["aria-labelledby"],z=["id"],V={__name:"Status",props:{id:{type:String,required:!1,default:""},status:{type:String,required:!0,default:"info"},statusClass:{type:String,required:!1,default:""}},setup(a){const t=a,s=h({id:""}),e=$(()=>{if(t.status==="success")return"dashboard_status_success";if(t.status==="error")return"dashboard_status_error";if(t.status==="warning")return"dashboard_status_warning";if(t.status==="info")return"dashboard_status_info"});return k(()=>{s.id=v(t.id)}),(u,l)=>(r(),n("div",{class:p([t.statusClass,"status-svg-container"])},[_("div",{role:"img","aria-labelledby":`status-${s.id}`,class:p([t.status,"status-icon"])},null,10,x),_("p",{id:`status-${s.id}`,class:"sr-only"},g(u.$t(e.value)),9,z)],2))}},j={key:0,"data-is":"list-pairs",class:p(["list-pairs-container"])},G={class:"list-pairs-title"},J={class:"list-pairs-subtitle"},M={__name:"Pairs",props:{pairs:{type:Array,required:!0},columns:{type:Object,required:!1,default:{pc:12,tablet:12,mobile:12}}},setup(a){const t=a,s=$(()=>`col-span-${t.columns.mobile} md:col-span-${t.columns.tablet} lg:col-span-${t.columns.pc}`);return(e,u)=>t.pairs?(r(),n("ul",j,[(r(!0),n(d,null,m(t.pairs,l=>(r(),n("li",{class:p(["list-pairs-item",s.value])},[_("span",G,g(e.$t(l.key,e.$t("dashboard_placeholder",l.key))),1),_("span",J,g(e.$t(l.value,e.$t("dashboard_placeholder",l.value))),1)],2))),256))])):b("",!0)}},T={__name:"ButtonGroup",props:{buttons:{type:Array,required:!0,default:[]},groupClass:{type:String,required:!1,default:""}},setup(a){const t=a,s=h({class:""}),e=S(null);return q(()=>{s.class=t.groupClass||e.value.closest("[data-is]")?`button-group-${e.value.closest("[data-is]").getAttribute("data-is")}`:"button-group-default"}),(u,l)=>t.buttons.length>0?(r(),n("div",{key:0,ref_key:"groupEl",ref:e,class:p([s.class,t.groupClass])},[(r(!0),n(d,null,m(t.buttons,(o,y)=>(r(),i(A,C({key:o},o,{class:[y===t.buttons.length-1?"":"mr-2"]}),null,16,["class"]))),128))],2)):b("",!0)}},U={__name:"Instance",props:{title:{type:String,required:!0},status:{type:String,required:!0,default:""},pairs:{type:Array,required:!0,default:[]},buttons:{type:Array,required:!0,default:[]}},setup(a){const t=a;return(s,e)=>(r(),i(E,{"data-is":"instance",columns:{pc:12,tablet:12,mobile:12}},{default:f(()=>[c(V,{id:t.title,status:t.status},null,8,["id","status"]),c(B,{type:"card",title:t.title},null,8,["title"]),c(M,{pairs:t.pairs},null,8,["pairs"]),c(T,{buttons:t.buttons},null,8,["buttons"])]),_:1}))}},H={__name:"Instances",props:{builder:{type:Array,required:!0}},setup(a){const t=a;return(s,e)=>(r(!0),n(d,null,m(t.builder,(u,l)=>(r(),i(N,{key:l,gridLayoutClass:u.containerClass,type:u.type,title:u.title,link:u.link,columns:u.containerColumns,id:u.id},{default:f(()=>[c(w,null,{default:f(()=>[(r(!0),n(d,null,m(u.widgets,(o,y)=>(r(),n(d,{key:y},[o.type==="Instance"?(r(),i(U,I(C({key:0},o.data)),null,16)):b("",!0)],64))),128))]),_:2},1024)]),_:2},1032,["gridLayoutClass","type","title","link","columns","id"]))),128))}};function K(){window.addEventListener("click",a=>{if(a.target.hasAttribute("data-submit-form"))try{const t=JSON.parse(a.target.getAttribute("data-submit-form"));Q(t)}catch(t){console.log(t)}})}function Q(a){const t=document.createElement("form");t.style.display="none",t.method="POST";try{const s=document.querySelector("[data-csrf-token]");s&&(a.csrf_token=s.getAttribute("data-csrf-token"))}catch{}for(const s in a){const e=document.createElement("input");e.type="hidden",e.name=s,e.value=a[s],t.appendChild(e)}document.querySelector("body").appendChild(t),t.submit()}const R={__name:"Instances",setup(a){const t=h({builder:""});return k(()=>{const s="data-server-builder",e=document.querySelector(`[${s}]`),u=e&&!e.getAttribute(s).includes(s)?JSON.parse(e.getAttribute(s)):{};t.builder=u}),q(()=>{P(),K()}),(s,e)=>(r(),i(D,null,{default:f(()=>[t.builder?(r(),i(H,{key:0,builder:t.builder},null,8,["builder"])):b("",!0)]),_:1}))}},W=F();L(R).use(W).use(O(["dashboard","action","inp","icons","instances"])).mount("#app");
import{r as h,c as $,v as k,C as v,b as r,h as n,j as _,n as p,t as g,F as d,q as m,g as b,a as S,o as q,d as i,m as C,D as A,w as f,k as c,l as B,p as E,s as w,i as I,u as N,x as P,y as D,z as F,A as L,B as O}from"./Title-9ae7a316.js";const x=["aria-labelledby"],z=["id"],V={__name:"Status",props:{id:{type:String,required:!1,default:""},status:{type:String,required:!0,default:"info"},statusClass:{type:String,required:!1,default:""}},setup(a){const t=a,s=h({id:""}),e=$(()=>{if(t.status==="success")return"dashboard_status_success";if(t.status==="error")return"dashboard_status_error";if(t.status==="warning")return"dashboard_status_warning";if(t.status==="info")return"dashboard_status_info"});return k(()=>{s.id=v(t.id)}),(u,l)=>(r(),n("div",{class:p([t.statusClass,"status-svg-container"])},[_("div",{role:"img","aria-labelledby":`status-${s.id}`,class:p([t.status,"status-icon"])},null,10,x),_("p",{id:`status-${s.id}`,class:"sr-only"},g(u.$t(e.value)),9,z)],2))}},j={key:0,"data-is":"list-pairs",class:p(["list-pairs-container"])},G={class:"list-pairs-title"},J={class:"list-pairs-subtitle"},M={__name:"Pairs",props:{pairs:{type:Array,required:!0},columns:{type:Object,required:!1,default:{pc:12,tablet:12,mobile:12}}},setup(a){const t=a,s=$(()=>`col-span-${t.columns.mobile} md:col-span-${t.columns.tablet} lg:col-span-${t.columns.pc}`);return(e,u)=>t.pairs?(r(),n("ul",j,[(r(!0),n(d,null,m(t.pairs,l=>(r(),n("li",{class:p(["list-pairs-item",s.value])},[_("span",G,g(e.$t(l.key,e.$t("dashboard_placeholder",l.key))),1),_("span",J,g(e.$t(l.value,e.$t("dashboard_placeholder",l.value))),1)],2))),256))])):b("",!0)}},T={__name:"ButtonGroup",props:{buttons:{type:Array,required:!0,default:[]},groupClass:{type:String,required:!1,default:""}},setup(a){const t=a,s=h({class:""}),e=S(null);return q(()=>{s.class=t.groupClass||e.value.closest("[data-is]")?`button-group-${e.value.closest("[data-is]").getAttribute("data-is")}`:"button-group-default"}),(u,l)=>t.buttons.length>0?(r(),n("div",{key:0,ref_key:"groupEl",ref:e,class:p([s.class,t.groupClass])},[(r(!0),n(d,null,m(t.buttons,(o,y)=>(r(),i(A,C({key:o},o,{class:[y===t.buttons.length-1?"":"mr-2"]}),null,16,["class"]))),128))],2)):b("",!0)}},U={__name:"Instance",props:{title:{type:String,required:!0},status:{type:String,required:!0,default:""},pairs:{type:Array,required:!0,default:[]},buttons:{type:Array,required:!0,default:[]}},setup(a){const t=a;return(s,e)=>(r(),i(E,{"data-is":"instance",columns:{pc:12,tablet:12,mobile:12}},{default:f(()=>[c(V,{id:t.title,status:t.status},null,8,["id","status"]),c(B,{type:"card",title:t.title},null,8,["title"]),c(M,{pairs:t.pairs},null,8,["pairs"]),c(T,{buttons:t.buttons},null,8,["buttons"])]),_:1}))}},H={__name:"Instances",props:{builder:{type:Array,required:!0}},setup(a){const t=a;return(s,e)=>(r(!0),n(d,null,m(t.builder,(u,l)=>(r(),i(N,{key:l,gridLayoutClass:u.containerClass,type:u.type,title:u.title,link:u.link,columns:u.containerColumns,id:u.id},{default:f(()=>[c(w,null,{default:f(()=>[(r(!0),n(d,null,m(u.widgets,(o,y)=>(r(),n(d,{key:y},[o.type==="Instance"?(r(),i(U,I(C({key:0},o.data)),null,16)):b("",!0)],64))),128))]),_:2},1024)]),_:2},1032,["gridLayoutClass","type","title","link","columns","id"]))),128))}};function K(){window.addEventListener("click",a=>{if(a.target.hasAttribute("data-submit-form"))try{const t=JSON.parse(a.target.getAttribute("data-submit-form"));Q(t)}catch(t){console.log(t)}})}function Q(a){const t=document.createElement("form");t.style.display="none",t.method="POST";try{const s=document.querySelector("[data-csrf-token]");s&&(a.csrf_token=s.getAttribute("data-csrf-token"))}catch{}for(const s in a){const e=document.createElement("input");e.type="hidden",e.name=s,e.value=a[s],t.appendChild(e)}document.querySelector("body").appendChild(t),t.submit()}const R={__name:"Instances",setup(a){const t=h({builder:""});return k(()=>{const s="data-server-builder",e=document.querySelector(`[${s}]`),u=e&&!e.getAttribute(s).includes(s)?JSON.parse(atob(e.getAttribute(s))):{};t.builder=u}),q(()=>{P(),K()}),(s,e)=>(r(),i(D,null,{default:f(()=>[t.builder?(r(),i(H,{key:0,builder:t.builder},null,8,["builder"])):b("",!0)]),_:1}))}},W=F();L(R).use(W).use(O(["dashboard","action","inp","icons","instances"])).mount("#app");

View file

@ -7,7 +7,7 @@
<link rel="stylesheet" href="css/flag-icons.min.css" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>BunkerWeb | DASHBOARD</title>
<script nonce="{{ script_nonce }}" type="module" crossorigin src="assets/home-ef55bffd.js"></script>
<script nonce="{{ script_nonce }}" type="module" crossorigin src="assets/home-098d38b3.js"></script>
<link rel="modulepreload" crossorigin href="assets/Title-9ae7a316.js">
</head>
@ -19,9 +19,9 @@
{% endfor %}
{% endwith %}
<div class='hidden' data-csrf-token='{{ csrf_token() }}'></div>
<div class='hidden' data-server-global='{{data_server_global if data_server_global else {}}}''></div>
<div class='hidden' data-server-global='{{data_server_global if data_server_global else {}}}'></div>
<div class='hidden' data-server-flash='{{data_server_flash|tojson}}'></div>
<div class='hidden' data-server-builder='{{data_server_builder}}'></div>
<div class='hidden' data-server-builder='{{data_server_builder[1:-1]}}'></div>
<div id='app'></div>
</body>
</html>

View file

@ -7,7 +7,7 @@
<link rel="stylesheet" href="css/flag-icons.min.css" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>BunkerWeb | DASHBOARD</title>
<script nonce="{{ script_nonce }}" type="module" crossorigin src="assets/instances-67da6d8b.js"></script>
<script nonce="{{ script_nonce }}" type="module" crossorigin src="assets/instances-32f9ed21.js"></script>
<link rel="modulepreload" crossorigin href="assets/Title-9ae7a316.js">
</head>
@ -19,9 +19,9 @@
{% endfor %}
{% endwith %}
<div class='hidden' data-csrf-token='{{ csrf_token() }}'></div>
<div class='hidden' data-server-global='{{data_server_global if data_server_global else {}}}''></div>
<div class='hidden' data-server-global='{{data_server_global if data_server_global else {}}}'></div>
<div class='hidden' data-server-flash='{{data_server_flash|tojson}}'></div>
<div class='hidden' data-server-builder='{{data_server_builder}}'></div>
<div class='hidden' data-server-builder='{{data_server_builder[1:-1]}}'></div>
<div id='app'></div>
</body>
</html>