mirror of
https://github.com/bunkerity/bunkerweb
synced 2026-05-24 09:28:37 +00:00
update services page
This commit is contained in:
parent
4003f8f042
commit
36295b2ac1
5 changed files with 197 additions and 184 deletions
|
|
@ -1,6 +1,98 @@
|
|||
from typing import Union
|
||||
from .utils.widgets import (
|
||||
button_widget,
|
||||
button_group_widget,
|
||||
title_widget,
|
||||
subtitle_widget,
|
||||
text_widget,
|
||||
tabulator_widget,
|
||||
input_widget,
|
||||
icons_widget,
|
||||
regular_widget,
|
||||
unmatch_widget,
|
||||
)
|
||||
from .utils.table import add_column
|
||||
from .utils.format import get_fields_from_field
|
||||
from typing import Optional, Union
|
||||
|
||||
from .utils.widgets import title_widget, table_widget, button_group_widget, button_widget
|
||||
columns = [
|
||||
add_column(title="Name", field="name", formatter="text"),
|
||||
add_column(title="Method", field="method", formatter="text"),
|
||||
add_column(title="Draft", field="draft", formatter="icons"),
|
||||
add_column(title="Actions", field="actions", formatter="buttongroup"),
|
||||
]
|
||||
|
||||
|
||||
def services_filter(methods: Optional[list] = None) -> list:
|
||||
filters = [
|
||||
{
|
||||
"type": "like",
|
||||
"fields": ["name"],
|
||||
"setting": {
|
||||
"id": "services-keyword",
|
||||
"name": "services-keyword",
|
||||
"label": "services_search", # keep it (a18n)
|
||||
"placeholder": "inp_keyword", # keep it (a18n)
|
||||
"value": "",
|
||||
"inpType": "input",
|
||||
"columns": {"pc": 3, "tablet": 4, "mobile": 12},
|
||||
"popovers": [
|
||||
{
|
||||
"iconName": "info",
|
||||
"text": "services_search_desc",
|
||||
}
|
||||
],
|
||||
"fieldSize": "sm",
|
||||
},
|
||||
},
|
||||
{
|
||||
"type": "=",
|
||||
"fields": ["draft"],
|
||||
"setting": {
|
||||
"id": "select-draft",
|
||||
"name": "select-draft",
|
||||
"label": "services_select_draft", # keep it (a18n)
|
||||
"value": "all", # keep "all"
|
||||
"values": ["all", "online", "draft"],
|
||||
"inpType": "select",
|
||||
"onlyDown": True,
|
||||
"columns": {"pc": 3, "tablet": 4, "mobile": 12},
|
||||
"popovers": [
|
||||
{
|
||||
"iconName": "info",
|
||||
"text": "services_select_draft_desc",
|
||||
}
|
||||
],
|
||||
"fieldSize": "sm",
|
||||
},
|
||||
},
|
||||
]
|
||||
|
||||
if methods is not None and (isinstance(methods, list) and len(methods) >= 2):
|
||||
filters.append(
|
||||
{
|
||||
"type": "=",
|
||||
"fields": ["method"],
|
||||
"setting": {
|
||||
"id": "select-methods",
|
||||
"name": "select-methods",
|
||||
"label": "services_select_methods", # keep it (a18n)
|
||||
"value": "all", # keep "all"
|
||||
"values": methods,
|
||||
"inpType": "select",
|
||||
"onlyDown": True,
|
||||
"columns": {"pc": 3, "tablet": 4, "mobile": 12},
|
||||
"popovers": [
|
||||
{
|
||||
"iconName": "info",
|
||||
"text": "services_select_methods_desc",
|
||||
}
|
||||
],
|
||||
"fieldSize": "sm",
|
||||
},
|
||||
},
|
||||
)
|
||||
|
||||
return filters
|
||||
|
||||
|
||||
def services_builder(services):
|
||||
|
|
@ -12,7 +104,6 @@ def services_builder(services):
|
|||
builder = [
|
||||
{
|
||||
"type": "tabs",
|
||||
"columns": {"pc": 4, "tablet": 4, "mobile": 4},
|
||||
"widgets": [
|
||||
button_group_widget(
|
||||
buttons=[
|
||||
|
|
@ -20,11 +111,9 @@ def services_builder(services):
|
|||
id="services-new",
|
||||
text="services_new",
|
||||
color="success",
|
||||
size="normal",
|
||||
iconName="plus",
|
||||
iconColor="white",
|
||||
modal=services_action(server_name="new", operation="new", title="services_new_title", subtitle="services_new_subtitle"),
|
||||
containerClass="col-span-12 flex justify-center",
|
||||
)
|
||||
]
|
||||
)
|
||||
|
|
@ -35,88 +124,12 @@ def services_builder(services):
|
|||
"columns": {"pc": 4, "tablet": 4, "mobile": 4},
|
||||
"widgets": [
|
||||
title_widget(title="services_title"),
|
||||
table_widget(
|
||||
positions=[4, 4, 4],
|
||||
header=[
|
||||
"services_table_name",
|
||||
"services_table_method",
|
||||
"services_table_actions",
|
||||
],
|
||||
tabulator_widget(
|
||||
id="services-table",
|
||||
columns=columns,
|
||||
layout="fitColumns",
|
||||
items=services_list,
|
||||
filters=[
|
||||
{
|
||||
"filter": "table",
|
||||
"filterName": "keyword",
|
||||
"type": "keyword",
|
||||
"value": "",
|
||||
"keys": ["name"],
|
||||
"field": {
|
||||
"id": "services-keyword",
|
||||
"value": "",
|
||||
"type": "text",
|
||||
"name": "services-keyword",
|
||||
"label": "services_search",
|
||||
"placeholder": "inp_keyword",
|
||||
"isClipboard": False,
|
||||
"popovers": [
|
||||
{
|
||||
"text": "services_search_desc",
|
||||
"iconName": "info",
|
||||
},
|
||||
],
|
||||
"columns": {"pc": 3, "tablet": 4, "mobile": 12},
|
||||
"fieldSize": "sm",
|
||||
},
|
||||
},
|
||||
{
|
||||
"filter": "table",
|
||||
"filterName": "method",
|
||||
"type": "select",
|
||||
"value": "all",
|
||||
"keys": ["method"],
|
||||
"field": {
|
||||
"id": "services-methods",
|
||||
"value": "all",
|
||||
"values": methods,
|
||||
"name": "services-methods",
|
||||
"onlyDown": True,
|
||||
"label": "services_methods",
|
||||
"popovers": [
|
||||
{
|
||||
"text": "services_methods_desc",
|
||||
"iconName": "info",
|
||||
},
|
||||
],
|
||||
"columns": {"pc": 3, "tablet": 4, "mobile": 12},
|
||||
"fieldSize": "sm",
|
||||
},
|
||||
},
|
||||
{
|
||||
"filter": "table",
|
||||
"filterName": "draft",
|
||||
"type": "select",
|
||||
"value": "all",
|
||||
"keys": ["draft"],
|
||||
"field": {
|
||||
"id": "services-draft",
|
||||
"value": "all",
|
||||
"values": ["all", "online", "draft"],
|
||||
"name": "services-draft",
|
||||
"onlyDown": True,
|
||||
"label": "services_draft",
|
||||
"popovers": [
|
||||
{
|
||||
"text": "services_draft_desc",
|
||||
"iconName": "info",
|
||||
},
|
||||
],
|
||||
"columns": {"pc": 3, "tablet": 4, "mobile": 12},
|
||||
"fieldSize": "sm",
|
||||
},
|
||||
},
|
||||
],
|
||||
minWidth="md",
|
||||
title="services_table_title",
|
||||
filters=services_filter(methods),
|
||||
),
|
||||
],
|
||||
},
|
||||
|
|
@ -128,35 +141,30 @@ def services_builder(services):
|
|||
def services_settings(settings: dict) -> dict:
|
||||
# deep copy settings dict
|
||||
settings = settings.copy()
|
||||
server_name = settings.get("SERVER_NAME")
|
||||
# remove "SERVER_NAME" and "IS_DRAFT" key
|
||||
settings.pop("SERVER_NAME", None)
|
||||
settings.pop("IS_DRAFT", None)
|
||||
# Create table with settings remaining keys
|
||||
settings_columns = [
|
||||
add_column(title="plugin", field="plugin", formatter="text"),
|
||||
add_column(title="status", field="status", formatter="icons"),
|
||||
]
|
||||
settings_table_items = []
|
||||
for key, value in settings.items():
|
||||
format_key = key.replace("USE_", "").replace("_", " ")
|
||||
settings_table_items.append(
|
||||
[
|
||||
{
|
||||
"type": "Text",
|
||||
"data": {"text": format_key},
|
||||
},
|
||||
{
|
||||
"type": "Icons",
|
||||
"data": {
|
||||
"iconName": "check" if value.get("value") == "yes" else "cross",
|
||||
},
|
||||
},
|
||||
]
|
||||
{
|
||||
"plugin": text_widget(text=format_key)["data"],
|
||||
"status": icons_widget(iconName="check" if value.get("value") == "yes" else "cross", value=value.get("value"))["data"],
|
||||
},
|
||||
)
|
||||
|
||||
table = table_widget(
|
||||
positions=[8, 4],
|
||||
header=["services_settings_table_name", "services_settings_table_status"],
|
||||
table = tabulator_widget(
|
||||
id=f"services-settings-{server_name}",
|
||||
columns=settings_columns,
|
||||
items=settings_table_items,
|
||||
filters=[],
|
||||
minWidth="",
|
||||
title="services_settings_table_title",
|
||||
layout="fitColumns",
|
||||
)
|
||||
|
||||
return table
|
||||
|
|
@ -189,6 +197,8 @@ def services_action(
|
|||
text=f"action_{operation}",
|
||||
color="delete",
|
||||
size="normal",
|
||||
iconColor="white",
|
||||
iconName="trash",
|
||||
attrs={
|
||||
"data-submit-form": f"""{{"SERVER_NAME" : "{server_name}" }}""",
|
||||
"data-submit-endpoint": f"/{operation}",
|
||||
|
|
@ -203,6 +213,8 @@ def services_action(
|
|||
id=f"{operation}-service-btn-{server_name}",
|
||||
text="action_switch",
|
||||
color="success",
|
||||
iconColor="white",
|
||||
iconName="globe" if is_draft else "document",
|
||||
size="normal",
|
||||
attrs={
|
||||
"data-submit-form": f"""{{"SERVER_NAME" : "{server_name}", "OLD_SERVER_NAME" : "{server_name}", "IS_DRAFT" : "{draft_value}" }}""",
|
||||
|
|
@ -265,7 +277,7 @@ def services_action(
|
|||
button_widget(
|
||||
id=f"{operation}-service-btn-{server_name}",
|
||||
text=f"services_mode_{mode}",
|
||||
color="info",
|
||||
color="back",
|
||||
size="normal",
|
||||
attrs={
|
||||
"role": "link",
|
||||
|
|
@ -303,84 +315,78 @@ def get_services_list(services):
|
|||
is_draft = True if service["IS_DRAFT"]["value"] == "yes" else False
|
||||
is_deletable = False if server_method in ("autoconf", "scheduler") else True
|
||||
|
||||
item = []
|
||||
item = {}
|
||||
# Get name
|
||||
item.append({"name": server_name, "type": "Text", "data": {"text": server_name}})
|
||||
item.append({"method": server_method, "type": "Text", "data": {"text": server_method}})
|
||||
item.append(
|
||||
{
|
||||
"type": "ButtonGroup",
|
||||
"data": {
|
||||
"buttons": [
|
||||
button_widget(
|
||||
id=f"open-modal-plugins-{index}",
|
||||
text="plugins",
|
||||
hideText=True,
|
||||
color="success",
|
||||
size="normal",
|
||||
iconName="eye",
|
||||
iconColor="white",
|
||||
modal=services_action(
|
||||
server_name=server_name,
|
||||
operation="plugins",
|
||||
title="services_plugins_title",
|
||||
subtitle="",
|
||||
service=service,
|
||||
),
|
||||
),
|
||||
button_widget(
|
||||
id=f"open-modal-manage-{index}",
|
||||
text="manage",
|
||||
hideText=True,
|
||||
color="edit",
|
||||
size="normal",
|
||||
iconName="pen",
|
||||
iconColor="white",
|
||||
modal=services_action(
|
||||
server_name=server_name,
|
||||
operation="edit",
|
||||
title="services_edit_title",
|
||||
subtitle="services_edit_subtitle",
|
||||
additional=server_name,
|
||||
),
|
||||
attrs={"data-server-name": server_name},
|
||||
),
|
||||
button_widget(
|
||||
attrs={"data-server-name": server_name, "data-is-draft": "yes" if is_draft else "no"},
|
||||
id=f"open-modal-draft-{index}",
|
||||
text="draft" if is_draft else "online",
|
||||
hideText=True,
|
||||
color="blue",
|
||||
size="normal",
|
||||
iconName="document" if is_draft else "globe",
|
||||
iconColor="white",
|
||||
modal=services_action(
|
||||
server_name=server_name,
|
||||
operation="draft",
|
||||
title="services_draft_title",
|
||||
subtitle="services_draft_subtitle" if is_draft else "services_online_subtitle",
|
||||
additional="services_draft_switch_subtitle" if is_draft else "services_online_switch_subtitle",
|
||||
is_draft=is_draft,
|
||||
),
|
||||
),
|
||||
button_widget(
|
||||
attrs={"data-server-name": server_name},
|
||||
id=f"open-modal-delete-{index}",
|
||||
text="delete",
|
||||
disabled=not is_deletable,
|
||||
hideText=True,
|
||||
color="red",
|
||||
size="normal",
|
||||
iconName="trash",
|
||||
iconColor="white",
|
||||
modal=services_action(
|
||||
server_name=server_name, operation="delete", title="services_delete_title", subtitle="services_delete_subtitle"
|
||||
),
|
||||
),
|
||||
]
|
||||
},
|
||||
}
|
||||
)
|
||||
item["name"] = text_widget(text=server_name)["data"]
|
||||
item["method"] = text_widget(text=server_method)["data"]
|
||||
item["draft"] = icons_widget(iconName="check" if is_draft else "cross", value="draft" if is_draft else "online")["data"]
|
||||
item["actions"] = button_group_widget(
|
||||
buttons=[
|
||||
button_widget(
|
||||
id=f"open-modal-plugins-{index}",
|
||||
text="plugins",
|
||||
hideText=True,
|
||||
color="success",
|
||||
size="normal",
|
||||
iconName="eye",
|
||||
iconColor="white",
|
||||
modal=services_action(
|
||||
server_name=server_name,
|
||||
operation="plugins",
|
||||
title="services_plugins_title",
|
||||
subtitle="",
|
||||
service=service,
|
||||
),
|
||||
),
|
||||
button_widget(
|
||||
id=f"open-modal-manage-{index}",
|
||||
text="manage",
|
||||
hideText=True,
|
||||
color="edit",
|
||||
size="normal",
|
||||
iconName="pen",
|
||||
iconColor="white",
|
||||
modal=services_action(
|
||||
server_name=server_name,
|
||||
operation="edit",
|
||||
title="services_edit_title",
|
||||
subtitle="services_edit_subtitle",
|
||||
additional=server_name,
|
||||
),
|
||||
attrs={"data-server-name": server_name},
|
||||
),
|
||||
button_widget(
|
||||
attrs={"data-server-name": server_name, "data-is-draft": "yes" if is_draft else "no"},
|
||||
id=f"open-modal-draft-{index}",
|
||||
text="draft" if is_draft else "online",
|
||||
hideText=True,
|
||||
color="blue",
|
||||
size="normal",
|
||||
iconName="document" if is_draft else "globe",
|
||||
iconColor="white",
|
||||
modal=services_action(
|
||||
server_name=server_name,
|
||||
operation="draft",
|
||||
title="services_draft_title",
|
||||
subtitle="services_draft_subtitle" if is_draft else "services_online_subtitle",
|
||||
additional="services_draft_switch_subtitle" if is_draft else "services_online_switch_subtitle",
|
||||
is_draft=is_draft,
|
||||
),
|
||||
),
|
||||
button_widget(
|
||||
attrs={"data-server-name": server_name},
|
||||
id=f"open-modal-delete-{index}",
|
||||
text="delete",
|
||||
disabled=not is_deletable,
|
||||
hideText=True,
|
||||
color="red",
|
||||
size="normal",
|
||||
iconName="trash",
|
||||
iconColor="white",
|
||||
modal=services_action(server_name=server_name, operation="delete", title="services_delete_title", subtitle="services_delete_subtitle"),
|
||||
),
|
||||
]
|
||||
)["data"]
|
||||
|
||||
data.append(item)
|
||||
|
||||
|
|
|
|||
|
|
@ -34,4 +34,4 @@ services = [
|
|||
output = services_builder(services)
|
||||
|
||||
|
||||
save_builder("services", output, script_name="services")
|
||||
save_builder(page_name="services", output=output, script_name="services")
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ import Grid from "@components/Widget/Grid.vue";
|
|||
import GridLayout from "@components/Widget/GridLayout.vue";
|
||||
import Table from "@components/Widget/Table.vue";
|
||||
import Title from "@components/Widget/Title.vue";
|
||||
import Tabulator from "@components/Widget/Tabulator.vue";
|
||||
import ButtonGroup from "@components/Widget/ButtonGroup.vue";
|
||||
import Button from "@components/Widget/Button.vue";
|
||||
import { useEqualStr } from "@utils/global.js";
|
||||
|
|
@ -319,6 +320,10 @@ const props = defineProps({
|
|||
<Grid>
|
||||
<!-- widget element -->
|
||||
<template v-for="(widget, index) in container.widgets" :key="index">
|
||||
<Tabulator
|
||||
v-if="useEqualStr(widget.type, 'Tabulator')"
|
||||
v-bind="widget.data"
|
||||
/>
|
||||
<Table v-if="useEqualStr(widget.type, 'Table')" v-bind="widget.data" />
|
||||
<ButtonGroup
|
||||
v-if="useEqualStr(widget.type, 'ButtonGroup')"
|
||||
|
|
|
|||
|
|
@ -295,6 +295,8 @@
|
|||
"bans_select_reason_desc": "Reason is the plugin that triggered the ban.",
|
||||
"bans_select_remain": "Select remain",
|
||||
"bans_select_remain_desc": "Scale of remaining time before unban.",
|
||||
"services_select_methods": "Select methods",
|
||||
"services_select_draft": "Select draft",
|
||||
"services_new": "new service",
|
||||
"services_title": "Services",
|
||||
"services_table_name": "Name",
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
Loading…
Reference in a new issue