fix unmatch component and update formats

This commit is contained in:
Jordan Blasenhauer 2024-08-15 14:35:37 +02:00
parent 074af0814f
commit 98793612d1
28 changed files with 119 additions and 97 deletions

View file

@ -22,7 +22,7 @@ def bans_tabs():
buttons=[
button_widget(
text="bans_tab_list",
display=["main", 1],
display=["main", 0],
size="tab",
color="info",
iconColor="white",
@ -31,7 +31,7 @@ def bans_tabs():
button_widget(
text="bans_tab_add",
color="success",
display=["main", 2],
display=["main", 1],
size="tab",
iconColor="white",
iconName="plus",
@ -182,15 +182,21 @@ def bans_filters(reasons: Optional[list] = None, remains: Optional[list] = None)
return filters
def fallback_message(msg: str, display: Optional[list] = None) -> dict:
return {
"type": "void",
"display": display if display else [],
"widgets": [
unmatch_widget(text=msg),
],
}
def bans_list(bans: Optional[list] = None, reasons: Optional[list] = None, remains: Optional[list] = None) -> dict:
if bans is None or len(bans) == 0:
return {
"type": "card",
"gridLayoutClass": "transparent",
"widgets": [
unmatch_widget(text="bans_not_found"),
],
}
return fallback_message(msg="bans_not_found", display=["main", 0])
actions_table_list = [
# Need to create a script on Page.vue level to add a row on click
@ -228,7 +234,7 @@ def bans_list(bans: Optional[list] = None, reasons: Optional[list] = None, remai
return {
"type": "card",
"display": ["main", 1],
"display": ["main", 0],
"widgets": [
title_widget("bans_list_title"), # keep it (a18n)
subtitle_widget("bans_list_subtitle"), # keep it (a18n)
@ -375,7 +381,7 @@ def bans_add() -> dict:
return {
"type": "card",
"display": ["main", 2],
"display": ["main", 1],
"widgets": [
title_widget("bans_add_title"), # keep it (a18n)
subtitle_widget("bans_add_subtitle"), # keep it (a18n)

View file

@ -424,7 +424,7 @@ def configs_tabs():
def fallback_message(msg: str):
return {
"type": "card",
"type": "void",
"gridLayoutClass": "transparent",
"widgets": [
unmatch_widget(text=msg),
@ -435,10 +435,10 @@ def fallback_message(msg: str):
def configs_builder(configs: Optional[list] = None, config_types: Optional[list] = None, services: Optional[list] = None) -> list:
if config_types is None or len(config_types) == 0:
return fallback_message("configs_missing_types")
return [fallback_message(msg="configs_missing_types")]
if services is None or len(services) == 0:
return fallback_message("configs_missing_services")
return [fallback_message(msg="configs_missing_services")]
configs_items = []
configs_form = []
@ -460,7 +460,7 @@ def configs_builder(configs: Optional[list] = None, config_types: Optional[list]
if config is None or len(configs) == 0:
return [
# Tabs is button group with display value and a size tab inside a tabs container
user_management_tabs(),
configs_tabs(),
fallback_message("user_management_users_not_found"),
] + configs_form
@ -482,16 +482,20 @@ def configs_builder(configs: Optional[list] = None, config_types: Optional[list]
)
configs_form.append(
config_form(
username=user.get("username"),
role=user.get("role"),
roles=roles_form,
config_types=config_types,
services=services,
is_global=config.get("is_global", ""),
filename=config.get("filename", ""),
config_type=config.get("type", ""),
config_value=config.get("value", ""),
config_services=config.get("config_services", []),
display_index=display_index,
)
)
return [
# Tabs is button group with display value and a size tab inside a tabs container
user_management_tabs(),
configs_tabs(),
{
"type": "card",
"maxWidthScreen": "3xl",

View file

@ -255,7 +255,7 @@ def instance_item(
iconColor="white",
attrs={
"data-submit-form": f"""{{ "instance_hostname" : "{hostname}" }}""",
"data-submit-endpoint": "/delete",
"data-submit-endpoint": f"/{hostname}",
"data-submit-method": "DELETE",
},
),
@ -285,7 +285,7 @@ def instances_new_form() -> dict:
return {
"type": "card",
"maxWidthScreen": "md",
"display": ["main", 2],
"display": ["main", 1],
"widgets": [
title_widget(
title="instances_create_title", # keep it (a18n)
@ -363,7 +363,7 @@ def instances_tabs():
buttons=[
button_widget(
text="instances_tab_list",
display=["main", 1],
display=["main", 0],
size="tab",
color="info",
iconColor="white",
@ -372,7 +372,7 @@ def instances_tabs():
button_widget(
text="instances_tab_add",
color="success",
display=["main", 2],
display=["main", 1],
size="tab",
iconColor="white",
iconName="plus",
@ -383,15 +383,21 @@ def instances_tabs():
}
def fallback_message(msg: str, display: Optional[list] = None) -> dict:
return {
"type": "void",
"display": display if display else [],
"widgets": [
unmatch_widget(text=msg),
],
}
def instances_list(instances: Optional[list] = None, types: Optional[list] = None, methods: Optional[list] = None, healths: Optional[list] = None) -> dict:
if instances is None or len(instances) == 0:
return {
"type": "card",
"gridLayoutClass": "transparent",
"widgets": [
unmatch_widget(text="instances_not_found"),
],
}
return fallback_message(msg="instances_not_found", display=["main", 0])
items = []
@ -410,7 +416,7 @@ def instances_list(instances: Optional[list] = None, types: Optional[list] = Non
return {
"type": "card",
"display": ["main", 1],
"display": ["main", 0],
"widgets": [
title_widget(
title="instances_list_title", # keep it (a18n)

View file

@ -170,18 +170,23 @@ def report_item(id: int, date: int, ip: str, country: str, method: str, url: str
}
def fallback_message(msg: str, display: Optional[list] = None) -> dict:
return {
"type": "void",
"display": display if display else [],
"widgets": [
unmatch_widget(text=msg),
],
}
def reports_builder(
reports: list, reasons: Optional[list] = None, countries: Optional[list] = None, methods: Optional[list] = None, codes: Optional[list] = None
) -> str:
if reports is None or len(reports) == 0:
return {
"type": "card",
"gridLayoutClass": "transparent",
"widgets": [
unmatch_widget(text="reports_not_found"),
],
}
return [fallback_message("reports_not_found")]
reports_items = [report_item(**report, id=index) for index, report in enumerate(reports)]
return [

View file

@ -384,10 +384,11 @@ def user_management_tabs():
}
def fallback_message(msg: str):
def fallback_message(msg: str, display: Optional[list] = None) -> dict:
return {
"type": "card",
"gridLayoutClass": "transparent",
"type": "void",
"display": display if display else [],
"widgets": [
unmatch_widget(text=msg),
],
@ -399,7 +400,7 @@ def user_management_builder(
) -> list:
if roles is None or len(roles) == 0 or roles_form is None or len(roles_form) == 0:
return fallback_message("user_management_missing_roles")
return [fallback_message("user_management_missing_roles")]
users_items = []
users_forms = []
@ -409,7 +410,7 @@ def user_management_builder(
return [
# Tabs is button group with display value and a size tab inside a tabs container
user_management_tabs(),
fallback_message("user_management_users_not_found"),
fallback_message(msg="user_management_users_not_found", display=["main", 0]),
] + users_forms
# Start adding the new config form

View file

@ -46,6 +46,6 @@ methods = list(methods)
codes = list(codes)
reasons = list(reasons)
builder = reports_builder(reports, reasons, countries, methods, codes)
builder = reports_builder(reports=reports, reasons=reasons, countries=countries, methods=methods, codes=codes)
save_builder(page_name="reports", output=builder, script_name="reports")

View file

@ -8,7 +8,7 @@ import ButtonGroup from "@components/Widget/ButtonGroup.vue";
import Regular from "@components/Form/Regular.vue";
import Title from "@components/Widget/Title.vue";
import Subtitle from "@components/Widget/Subtitle.vue";
import MessageUnmatch from "@components/Message/Unmatch.vue";
import Unmatch from "@components/Message/Unmatch.vue";
import { useEqualStr } from "@utils/global.js";
/**
@ -60,8 +60,8 @@ const props = defineProps({
v-if="useEqualStr(widget.type, 'Subtitle')"
v-bind="widget.data"
/>
<MessageUnmatch
v-if="useEqualStr(widget.type, 'MessageUnmatch')"
<Unmatch
v-if="useEqualStr(widget.type, 'Unmatch')"
v-bind="widget.data"
/>
<Tabulator

View file

@ -8,7 +8,7 @@ import ButtonGroup from "@components/Widget/ButtonGroup.vue";
import Regular from "@components/Form/Regular.vue";
import Title from "@components/Widget/Title.vue";
import Subtitle from "@components/Widget/Subtitle.vue";
import MessageUnmatch from "@components/Message/Unmatch.vue";
import Unmatch from "@components/Message/Unmatch.vue";
import { useEqualStr } from "@utils/global.js";
/**
@ -60,8 +60,8 @@ const props = defineProps({
v-if="useEqualStr(widget.type, 'Subtitle')"
v-bind="widget.data"
/>
<MessageUnmatch
v-if="useEqualStr(widget.type, 'MessageUnmatch')"
<Unmatch
v-if="useEqualStr(widget.type, 'Unmatch')"
v-bind="widget.data"
/>
<Tabulator

View file

@ -8,7 +8,7 @@ import ButtonGroup from "@components/Widget/ButtonGroup.vue";
import Regular from "@components/Form/Regular.vue";
import Title from "@components/Widget/Title.vue";
import Subtitle from "@components/Widget/Subtitle.vue";
import MessageUnmatch from "@components/Message/Unmatch.vue";
import Unmatch from "@components/Message/Unmatch.vue";
import { useEqualStr } from "@utils/global.js";
/**
@ -71,8 +71,8 @@ const props = defineProps({
v-if="useEqualStr(widget.type, 'Subtitle')"
v-bind="widget.data"
/>
<MessageUnmatch
v-if="useEqualStr(widget.type, 'MessageUnmatch')"
<Unmatch
v-if="useEqualStr(widget.type, 'Unmatch')"
v-bind="widget.data"
/>
<Tabulator

View file

@ -4,7 +4,7 @@ import Grid from "@components/Widget/Grid.vue";
import GridLayout from "@components/Widget/GridLayout.vue";
import Title from "@components/Widget/Title.vue";
import Fields from "@components/Form/Fields.vue";
import MessageUnmatch from "@components/Message/Unmatch.vue";
import Unmatch from "@components/Message/Unmatch.vue";
import { useEqualStr } from "@utils/global.js";
/**
@ -39,8 +39,8 @@ const props = defineProps({
<Grid>
<!-- widget element -->
<template v-for="(widget, index) in container.widgets" :key="index">
<MessageUnmatch
v-if="useEqualStr(widget.type, 'MessageUnmatch')"
<Unmatch
v-if="useEqualStr(widget.type, 'Unmatch')"
v-bind="widget.data"
/>

View file

@ -3,7 +3,7 @@
import Grid from "@components/Widget/Grid.vue";
import GridLayout from "@components/Widget/GridLayout.vue";
import Tabulator from "@components/Widget/Tabulator.vue";
import MessageUnmatch from "@components/Message/Unmatch.vue";
import Unmatch from "@components/Message/Unmatch.vue";
import Title from "@components/Widget/Title.vue";
import Subtitle from "@components/Widget/Subtitle.vue";
import { useEqualStr } from "@utils/global.js";
@ -58,8 +58,8 @@ const props = defineProps({
v-if="useEqualStr(widget.type, 'Subtitle')"
v-bind="widget.data"
/>
<MessageUnmatch
v-if="useEqualStr(widget.type, 'MessageUnmatch')"
<Unmatch
v-if="useEqualStr(widget.type, 'Unmatch')"
v-bind="widget.data"
/>
<Tabulator

View file

@ -8,7 +8,7 @@ import ButtonGroup from "@components/Widget/ButtonGroup.vue";
import Regular from "@components/Form/Regular.vue";
import Title from "@components/Widget/Title.vue";
import Subtitle from "@components/Widget/Subtitle.vue";
import MessageUnmatch from "@components/Message/Unmatch.vue";
import Unmatch from "@components/Message/Unmatch.vue";
import { useEqualStr } from "@utils/global.js";
/**
@ -60,8 +60,8 @@ const props = defineProps({
v-if="useEqualStr(widget.type, 'Subtitle')"
v-bind="widget.data"
/>
<MessageUnmatch
v-if="useEqualStr(widget.type, 'MessageUnmatch')"
<Unmatch
v-if="useEqualStr(widget.type, 'Unmatch')"
v-bind="widget.data"
/>
<Tabulator

View file

@ -1,6 +1,6 @@
<script setup>
import { defineProps, reactive, onMounted, onUnmounted, computed } from "vue";
import MessageUnmatch from "@components/Message/Unmatch.vue";
import Unmatch from "@components/Message/Unmatch.vue";
import Container from "@components/Widget/Container.vue";
import Fields from "@components/Form/Fields.vue";
import Title from "@components/Widget/Title.vue";

View file

@ -14,7 +14,7 @@ import Subtitle from "@components/Widget/Subtitle.vue";
import ButtonGroup from "@components/Widget/ButtonGroup.vue";
import Text from "@components/Widget/Text.vue";
import GroupMultiple from "@components/Forms/Group/Multiple.vue";
import MessageUnmatch from "@components/Message/Unmatch.vue";
import Unmatch from "@components/Message/Unmatch.vue";
import { v4 as uuidv4 } from "uuid";
import { useCheckPluginsValidity } from "@utils/global.js";
import { useEasyForm } from "@store/form.js";

View file

@ -4,7 +4,7 @@ import PopoverGroup from "@components/Widget/PopoverGroup.vue";
import Text from "@components/Widget/Text.vue";
import Filter from "@components/Widget/Filter.vue";
import Grid from "@components/Widget/Grid.vue";
import MessageUnmatch from "@components/Message/Unmatch.vue";
import Unmatch from "@components/Message/Unmatch.vue";
/**
* @name List/Details.vue
* @description This component is a list of items separate on two columns : one for the title, and other for a list of popovers related to the plugin (type, link...)

View file

@ -1,5 +1,6 @@
<script setup>
import { onMounted, reactive, ref } from "vue";
import Icons from "@components/Widget/Icons.vue";
import Text from "@components/Widget/Text.vue";
/**
@ -11,6 +12,8 @@ import Text from "@components/Widget/Text.vue";
* text: "dashboard_no_match",
* }
* @param {String} text - The text to display
* @param {String} [iconName="search"] - The icon to display
* @param {String} [iconColor=""] - The color of the icon
* @param {String} [unmatchClass=""] - The class to apply to the message. If not provided, the class will be based on the parent component.
*/
@ -19,6 +22,16 @@ const props = defineProps({
type: String,
required: false,
},
iconName: {
type: String,
required: false,
default: "search",
},
iconColor: {
type: String,
required: false,
default: "",
},
unmatchClass: {
type: String,
required: false,
@ -35,19 +48,12 @@ const msgEl = ref(null);
onMounted(() => {
msg.text = props.text || msg.text;
msg.class =
props.unmatchClass || msgEl.value.closest("[data-is]")
? `msg-unmatch-${msgEl.value
.closest("[data-is]")
.getAttribute("data-is")}`
: "msg-unmatch-base";
});
</script>
<template>
<div class="msg-container" ref="msgEl">
<div data-is="unmatch" :class="[msg.class]">
<Text :icon="{ iconName: 'search' }" :text="msg.text" />
</div>
<div data-is="unmatch" class="msg-container" ref="msgEl">
<Icons v-bind="{ iconName: props.iconName, color: props.iconColor }" />
<Text :text="msg.text" />
</div>
</template>

View file

@ -16,7 +16,7 @@ import Text from "@components/Widget/Text.vue";
import Subtitle from "@components/Widget/Subtitle.vue";
import Button from "@components/Widget/Button.vue";
import ButtonGroup from "@components/Widget/ButtonGroup.vue";
import MessageUnmatch from "@components/Message/Unmatch.vue";
import Unmatch from "@components/Message/Unmatch.vue";
import Table from "@components/Widget/Table.vue";
/**

View file

@ -1,7 +1,7 @@
<script setup>
import { reactive, computed, ref, onMounted, watch } from "vue";
import { v4 as uuidv4 } from "uuid";
import MessageUnmatch from "@components/Message/Unmatch.vue";
import Unmatch from "@components/Message/Unmatch.vue";
import Container from "@components/Widget/Container.vue";
import Cell from "@components/Widget/Cell.vue";
import Filter from "@components/Widget/Filter.vue";

View file

@ -74,12 +74,9 @@ const textIconEl = ref(null);
onMounted(() => {
// Check if next sibling is a
const renderEl = textEl.value || textIconEl.value || null;
const isVoid = renderEl?.closest('[data-is="void"]') ? "void" : "";
text.class =
props.textClass || renderEl.closest("[data-is]")
? `text-${
isVoid || renderEl.closest("[data-is]").getAttribute("data-is")
}`
? `text-${renderEl.closest("[data-is]").getAttribute("data-is")}`
: "text-card";
});
</script>

View file

@ -12,7 +12,7 @@ import { useDisplayStore } from "@store/global.js";
// Set default store
const displayStore = useDisplayStore();
displayStore.setDisplay("main", 1);
displayStore.setDisplay("main", 0);
const bans = reactive({
builder: "",

File diff suppressed because one or more lines are too long

View file

@ -20,7 +20,7 @@
></div>
<div
class="hidden"
data-server-builder='eyJ0eXBlIjogImNhcmQiLCAiZ3JpZExheW91dENsYXNzIjogInRyYW5zcGFyZW50IiwgIndpZGdldHMiOiBbeyJ0eXBlIjogIlVubWF0Y2giLCAiZGF0YSI6IHsidGV4dCI6ICJjb25maWdzX21pc3Npbmdfc2VydmljZXMifX1dfQ=='
data-server-builder='W3sidHlwZSI6ICJ2b2lkIiwgImdyaWRMYXlvdXRDbGFzcyI6ICJ0cmFuc3BhcmVudCIsICJ3aWRnZXRzIjogW3sidHlwZSI6ICJVbm1hdGNoIiwgImRhdGEiOiB7InRleHQiOiAiY29uZmlnc19taXNzaW5nX3NlcnZpY2VzIn19XX1d'
></div>
<div id="app"></div>
<script type="module" src="configs.js"></script>

View file

@ -14,7 +14,7 @@ import { useDisplayStore } from "@store/global.js";
// Set default store
const displayStore = useDisplayStore();
displayStore.setDisplay("main", 1);
displayStore.setDisplay("main", 0);
const instances = reactive({
builder: "",

File diff suppressed because one or more lines are too long

View file

@ -20,7 +20,7 @@
></div>
<div
class="hidden"
data-server-builder='W3sidHlwZSI6ICJjYXJkIiwgIndpZGdldHMiOiBbeyJ0eXBlIjogIlRpdGxlIiwgImRhdGEiOiB7InRpdGxlIjogInJlcG9ydHNfdGl0bGUifX0sIHsidHlwZSI6ICJTdWJ0aXRsZSIsICJkYXRhIjogeyJzdWJ0aXRsZSI6ICJyZXBvcnRzX3N1YnRpdGxlIn19LCB7InR5cGUiOiAiVGFidWxhdG9yIiwgImRhdGEiOiB7ImlkIjogInRhYmxlLWNvcmUtcGx1Z2lucyIsICJjb2x1bW5zIjogW3sidGl0bGUiOiAiRGF0ZSIsICJmaWVsZCI6ICJkYXRlIiwgImZvcm1hdHRlciI6ICJmaWVsZHMiLCAibWluV2lkdGgiOiAyNTB9LCB7InRpdGxlIjogIklQIiwgImZpZWxkIjogImlwIiwgImZvcm1hdHRlciI6ICJ0ZXh0In0sIHsidGl0bGUiOiAiQ291bnRyeSIsICJmaWVsZCI6ICJjb3VudHJ5IiwgImZvcm1hdHRlciI6ICJ0ZXh0In0sIHsidGl0bGUiOiAiU2VydmVyIG5hbWUiLCAiZmllbGQiOiAic2VydmVyX25hbWUiLCAiZm9ybWF0dGVyIjogInRleHQifSwgeyJ0aXRsZSI6ICJNZXRob2QiLCAiZmllbGQiOiAibWV0aG9kIiwgImZvcm1hdHRlciI6ICJ0ZXh0In0sIHsidGl0bGUiOiAiVVJMIiwgImZpZWxkIjogInVybCIsICJmb3JtYXR0ZXIiOiAidGV4dCJ9LCB7InRpdGxlIjogIkNvZGUiLCAiZmllbGQiOiAiY29kZSIsICJmb3JtYXR0ZXIiOiAidGV4dCJ9LCB7InRpdGxlIjogIlVzZXIgYWdlbnQiLCAiZmllbGQiOiAidXNlcl9hZ2VudCIsICJmb3JtYXR0ZXIiOiAidGV4dCJ9LCB7InRpdGxlIjogIlJlYXNvbiIsICJmaWVsZCI6ICJyZWFzb24iLCAiZm9ybWF0dGVyIjogInRleHQifSwgeyJ0aXRsZSI6ICJEYXRhIiwgImZpZWxkIjogImRhdGEiLCAiZm9ybWF0dGVyIjogInRleHQifV0sICJpdGVtcyI6IFt7ImRhdGUiOiB7InNldHRpbmciOiB7ImxhYmVsIjogInJlcG9ydHNfZGF0ZSIsICJuYW1lIjogImRhdGVwaWNrZXItZGF0ZS0wIiwgImlkIjogImRhdGVwaWNrZXItZGF0ZS0wIiwgInZhbHVlIjogMTcyMzQ5MTczOTk1NCwgImhpZGVMYWJlbCI6IHRydWUsICJkaXNhYmxlZCI6IHRydWUsICJpbnBUeXBlIjogImRhdGVwaWNrZXIifX0sICJzZXJ2ZXJfbmFtZSI6IHsidGV4dCI6ICJsb2NhbGhvc3QifSwgImlwIjogeyJ0ZXh0IjogIjEyNy4wLjAuMSJ9LCAiY291bnRyeSI6IHsidGV4dCI6ICJFTiJ9LCAibWV0aG9kIjogeyJ0ZXh0IjogIlBPU1QifSwgInVybCI6IHsidGV4dCI6ICIvYWRtaW4ifSwgImNvZGUiOiB7InRleHQiOiAiNDAwIn0sICJ1c2VyX2FnZW50IjogeyJ0ZXh0IjogIk1vemlsbGEvNS4wIn0sICJyZWFzb24iOiB7InRleHQiOiAiYW50aWJvdCJ9LCAiZGF0YSI6IHsidGV4dCI6ICJsb3JlIGlwc3VtIGFkIHZpdGFtIGFldGVybmFtIn19LCB7ImRhdGUiOiB7InNldHRpbmciOiB7ImxhYmVsIjogInJlcG9ydHNfZGF0ZSIsICJuYW1lIjogImRhdGVwaWNrZXItZGF0ZS0xIiwgImlkIjogImRhdGVwaWNrZXItZGF0ZS0xIiwgInZhbHVlIjogMTcyMzQ5MTczODAwMCwgImhpZGVMYWJlbCI6IHRydWUsICJkaXNhYmxlZCI6IHRydWUsICJpbnBUeXBlIjogImRhdGVwaWNrZXIifX0sICJzZXJ2ZXJfbmFtZSI6IHsidGV4dCI6ICJsb2NhbGhvc3QifSwgImlwIjogeyJ0ZXh0IjogIjEyNy4wLjAuMiJ9LCAiY291bnRyeSI6IHsidGV4dCI6ICJFTiJ9LCAibWV0aG9kIjogeyJ0ZXh0IjogIkdFVCJ9LCAidXJsIjogeyJ0ZXh0IjogIi9ldGM/In0sICJjb2RlIjogeyJ0ZXh0IjogIjMwMCJ9LCAidXNlcl9hZ2VudCI6IHsidGV4dCI6ICJNb3ppbGxhLzAuMSJ9LCAicmVhc29uIjogeyJ0ZXh0IjogInVua25vd24ifSwgImRhdGEiOiB7InRleHQiOiAiIn19XSwgImZpbHRlcnMiOiBbeyJ0eXBlIjogImxpa2UiLCAiZmllbGRzIjogWyJpcCIsICJ1cmwiLCAidXNlcl9hZ2VudCIsICJkYXRhIl0sICJzZXR0aW5nIjogeyJpZCI6ICJpbnB1dC1zZWFyY2gtbWlzYyIsICJuYW1lIjogImlucHV0LXNlYXJjaC1taXNjIiwgImxhYmVsIjogInJlcG9ydHNfc2VhcmNoX21pc2MiLCAicGxhY2Vob2xkZXIiOiAicmVwb3J0c19zZWFyY2hfbWlzY19wbGFjZWhvbGRlciIsICJ2YWx1ZSI6ICIiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDMsICJ0YWJsZXQiOiA0LCAibW9iaWxlIjogMTJ9LCAiZmllbGRTaXplIjogInNtIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogInJlcG9ydHNfc2VhcmNoX21pc2NfZGVzYyJ9XX19LCB7InR5cGUiOiAiPSIsICJmaWVsZHMiOiBbInJlYXNvbiJdLCAic2V0dGluZyI6IHsiaWQiOiAic2VsZWN0LXJlYXNvbiIsICJuYW1lIjogInNlbGVjdC1yZWFzb24iLCAibGFiZWwiOiAicmVwb3J0c19zZWxlY3RfcmVhc29uIiwgInZhbHVlIjogImFsbCIsICJ2YWx1ZXMiOiBbImFsbCIsICJ1bmtub3duIiwgImFudGlib3QiXSwgImlucFR5cGUiOiAic2VsZWN0IiwgIm9ubHlEb3duIjogdHJ1ZSwgImNvbHVtbnMiOiB7InBjIjogMywgInRhYmxldCI6IDQsICJtb2JpbGUiOiAxMn0sICJmaWVsZFNpemUiOiAic20iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAicmVwb3J0c19zZWxlY3RfcmVhc29uX2Rlc2MifV19fSwgeyJ0eXBlIjogIj0iLCAiZmllbGRzIjogWyJtZXRob2QiXSwgInNldHRpbmciOiB7ImlkIjogInNlbGVjdC1tZXRob2QiLCAibmFtZSI6ICJzZWxlY3QtbWV0aG9kIiwgImxhYmVsIjogInJlcG9ydHNfc2VsZWN0X21ldGhvZCIsICJ2YWx1ZSI6ICJhbGwiLCAidmFsdWVzIjogWyJhbGwiLCAiUE9TVCIsICJHRVQiXSwgImlucFR5cGUiOiAic2VsZWN0IiwgIm9ubHlEb3duIjogdHJ1ZSwgImNvbHVtbnMiOiB7InBjIjogMywgInRhYmxldCI6IDQsICJtb2JpbGUiOiAxMn0sICJmaWVsZFNpemUiOiAic20iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAicmVwb3J0c19zZWxlY3RfbWV0aG9kX2Rlc2MifV19fSwgeyJ0eXBlIjogIj0iLCAiZmllbGRzIjogWyJjb2RlIl0sICJzZXR0aW5nIjogeyJpZCI6ICJzZWxlY3QtY29kZSIsICJuYW1lIjogInNlbGVjdC1jb2RlIiwgImxhYmVsIjogInJlcG9ydHNfc2VsZWN0X2NvZGUiLCAidmFsdWUiOiAiYWxsIiwgInZhbHVlcyI6IFsiYWxsIiwgIjQwMCIsICIzMDAiXSwgImlucFR5cGUiOiAic2VsZWN0IiwgIm9ubHlEb3duIjogdHJ1ZSwgImNvbHVtbnMiOiB7InBjIjogMywgInRhYmxldCI6IDQsICJtb2JpbGUiOiAxMn0sICJmaWVsZFNpemUiOiAic20iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAicmVwb3J0c19zZWxlY3RfY29kZV9kZXNjIn1dfX1dfX1dfV0='
data-server-builder='W3sidHlwZSI6ICJjYXJkIiwgIndpZGdldHMiOiBbeyJ0eXBlIjogIlRpdGxlIiwgImRhdGEiOiB7InRpdGxlIjogInJlcG9ydHNfdGl0bGUifX0sIHsidHlwZSI6ICJTdWJ0aXRsZSIsICJkYXRhIjogeyJzdWJ0aXRsZSI6ICJyZXBvcnRzX3N1YnRpdGxlIn19LCB7InR5cGUiOiAiVGFidWxhdG9yIiwgImRhdGEiOiB7ImlkIjogInRhYmxlLWNvcmUtcGx1Z2lucyIsICJjb2x1bW5zIjogW3sidGl0bGUiOiAiRGF0ZSIsICJmaWVsZCI6ICJkYXRlIiwgImZvcm1hdHRlciI6ICJmaWVsZHMiLCAibWluV2lkdGgiOiAyNTB9LCB7InRpdGxlIjogIklQIiwgImZpZWxkIjogImlwIiwgImZvcm1hdHRlciI6ICJ0ZXh0In0sIHsidGl0bGUiOiAiQ291bnRyeSIsICJmaWVsZCI6ICJjb3VudHJ5IiwgImZvcm1hdHRlciI6ICJ0ZXh0In0sIHsidGl0bGUiOiAiU2VydmVyIG5hbWUiLCAiZmllbGQiOiAic2VydmVyX25hbWUiLCAiZm9ybWF0dGVyIjogInRleHQifSwgeyJ0aXRsZSI6ICJNZXRob2QiLCAiZmllbGQiOiAibWV0aG9kIiwgImZvcm1hdHRlciI6ICJ0ZXh0In0sIHsidGl0bGUiOiAiVVJMIiwgImZpZWxkIjogInVybCIsICJmb3JtYXR0ZXIiOiAidGV4dCJ9LCB7InRpdGxlIjogIkNvZGUiLCAiZmllbGQiOiAiY29kZSIsICJmb3JtYXR0ZXIiOiAidGV4dCJ9LCB7InRpdGxlIjogIlVzZXIgYWdlbnQiLCAiZmllbGQiOiAidXNlcl9hZ2VudCIsICJmb3JtYXR0ZXIiOiAidGV4dCJ9LCB7InRpdGxlIjogIlJlYXNvbiIsICJmaWVsZCI6ICJyZWFzb24iLCAiZm9ybWF0dGVyIjogInRleHQifSwgeyJ0aXRsZSI6ICJEYXRhIiwgImZpZWxkIjogImRhdGEiLCAiZm9ybWF0dGVyIjogInRleHQifV0sICJpdGVtcyI6IFt7ImRhdGUiOiB7InNldHRpbmciOiB7ImxhYmVsIjogInJlcG9ydHNfZGF0ZSIsICJuYW1lIjogImRhdGVwaWNrZXItZGF0ZS0wIiwgImlkIjogImRhdGVwaWNrZXItZGF0ZS0wIiwgInZhbHVlIjogMTcyMzQ5MTczOTk1NCwgImhpZGVMYWJlbCI6IHRydWUsICJkaXNhYmxlZCI6IHRydWUsICJpbnBUeXBlIjogImRhdGVwaWNrZXIifX0sICJzZXJ2ZXJfbmFtZSI6IHsidGV4dCI6ICJsb2NhbGhvc3QifSwgImlwIjogeyJ0ZXh0IjogIjEyNy4wLjAuMSJ9LCAiY291bnRyeSI6IHsidGV4dCI6ICJFTiJ9LCAibWV0aG9kIjogeyJ0ZXh0IjogIlBPU1QifSwgInVybCI6IHsidGV4dCI6ICIvYWRtaW4ifSwgImNvZGUiOiB7InRleHQiOiAiNDAwIn0sICJ1c2VyX2FnZW50IjogeyJ0ZXh0IjogIk1vemlsbGEvNS4wIn0sICJyZWFzb24iOiB7InRleHQiOiAiYW50aWJvdCJ9LCAiZGF0YSI6IHsidGV4dCI6ICJsb3JlIGlwc3VtIGFkIHZpdGFtIGFldGVybmFtIn19LCB7ImRhdGUiOiB7InNldHRpbmciOiB7ImxhYmVsIjogInJlcG9ydHNfZGF0ZSIsICJuYW1lIjogImRhdGVwaWNrZXItZGF0ZS0xIiwgImlkIjogImRhdGVwaWNrZXItZGF0ZS0xIiwgInZhbHVlIjogMTcyMzQ5MTczODAwMCwgImhpZGVMYWJlbCI6IHRydWUsICJkaXNhYmxlZCI6IHRydWUsICJpbnBUeXBlIjogImRhdGVwaWNrZXIifX0sICJzZXJ2ZXJfbmFtZSI6IHsidGV4dCI6ICJsb2NhbGhvc3QifSwgImlwIjogeyJ0ZXh0IjogIjEyNy4wLjAuMiJ9LCAiY291bnRyeSI6IHsidGV4dCI6ICJFTiJ9LCAibWV0aG9kIjogeyJ0ZXh0IjogIkdFVCJ9LCAidXJsIjogeyJ0ZXh0IjogIi9ldGM/In0sICJjb2RlIjogeyJ0ZXh0IjogIjMwMCJ9LCAidXNlcl9hZ2VudCI6IHsidGV4dCI6ICJNb3ppbGxhLzAuMSJ9LCAicmVhc29uIjogeyJ0ZXh0IjogInVua25vd24ifSwgImRhdGEiOiB7InRleHQiOiAiIn19XSwgImZpbHRlcnMiOiBbeyJ0eXBlIjogImxpa2UiLCAiZmllbGRzIjogWyJpcCIsICJ1cmwiLCAidXNlcl9hZ2VudCIsICJkYXRhIl0sICJzZXR0aW5nIjogeyJpZCI6ICJpbnB1dC1zZWFyY2gtbWlzYyIsICJuYW1lIjogImlucHV0LXNlYXJjaC1taXNjIiwgImxhYmVsIjogInJlcG9ydHNfc2VhcmNoX21pc2MiLCAicGxhY2Vob2xkZXIiOiAicmVwb3J0c19zZWFyY2hfbWlzY19wbGFjZWhvbGRlciIsICJ2YWx1ZSI6ICIiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDMsICJ0YWJsZXQiOiA0LCAibW9iaWxlIjogMTJ9LCAiZmllbGRTaXplIjogInNtIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogInJlcG9ydHNfc2VhcmNoX21pc2NfZGVzYyJ9XX19LCB7InR5cGUiOiAiPSIsICJmaWVsZHMiOiBbInJlYXNvbiJdLCAic2V0dGluZyI6IHsiaWQiOiAic2VsZWN0LXJlYXNvbiIsICJuYW1lIjogInNlbGVjdC1yZWFzb24iLCAibGFiZWwiOiAicmVwb3J0c19zZWxlY3RfcmVhc29uIiwgInZhbHVlIjogImFsbCIsICJ2YWx1ZXMiOiBbImFsbCIsICJhbnRpYm90IiwgInVua25vd24iXSwgImlucFR5cGUiOiAic2VsZWN0IiwgIm9ubHlEb3duIjogdHJ1ZSwgImNvbHVtbnMiOiB7InBjIjogMywgInRhYmxldCI6IDQsICJtb2JpbGUiOiAxMn0sICJmaWVsZFNpemUiOiAic20iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAicmVwb3J0c19zZWxlY3RfcmVhc29uX2Rlc2MifV19fSwgeyJ0eXBlIjogIj0iLCAiZmllbGRzIjogWyJtZXRob2QiXSwgInNldHRpbmciOiB7ImlkIjogInNlbGVjdC1tZXRob2QiLCAibmFtZSI6ICJzZWxlY3QtbWV0aG9kIiwgImxhYmVsIjogInJlcG9ydHNfc2VsZWN0X21ldGhvZCIsICJ2YWx1ZSI6ICJhbGwiLCAidmFsdWVzIjogWyJhbGwiLCAiR0VUIiwgIlBPU1QiXSwgImlucFR5cGUiOiAic2VsZWN0IiwgIm9ubHlEb3duIjogdHJ1ZSwgImNvbHVtbnMiOiB7InBjIjogMywgInRhYmxldCI6IDQsICJtb2JpbGUiOiAxMn0sICJmaWVsZFNpemUiOiAic20iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAicmVwb3J0c19zZWxlY3RfbWV0aG9kX2Rlc2MifV19fSwgeyJ0eXBlIjogIj0iLCAiZmllbGRzIjogWyJjb2RlIl0sICJzZXR0aW5nIjogeyJpZCI6ICJzZWxlY3QtY29kZSIsICJuYW1lIjogInNlbGVjdC1jb2RlIiwgImxhYmVsIjogInJlcG9ydHNfc2VsZWN0X2NvZGUiLCAidmFsdWUiOiAiYWxsIiwgInZhbHVlcyI6IFsiYWxsIiwgIjMwMCIsICI0MDAiXSwgImlucFR5cGUiOiAic2VsZWN0IiwgIm9ubHlEb3duIjogdHJ1ZSwgImNvbHVtbnMiOiB7InBjIjogMywgInRhYmxldCI6IDQsICJtb2JpbGUiOiAxMn0sICJmaWVsZFNpemUiOiAic20iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAicmVwb3J0c19zZWxlY3RfY29kZV9kZXNjIn1dfX1dfX1dfV0='
></div>
<div id="app"></div>
<script type="module" src="reports.js"></script>

File diff suppressed because one or more lines are too long

View file

@ -621,7 +621,7 @@ body {
/* MESSAGE */
.msg-container {
@apply col-span-12 w-full;
@apply col-span-12 w-full py-4 flex justify-center items-center;
}
.msg-unmatch-card {
@ -1184,11 +1184,7 @@ body {
}
.text-unmatch {
@apply col-span-12 text-lg mb-0 font-bold dark:text-gray-300 break-word;
}
.text-void {
@apply col-span-12 text-lg mb-0 font-bold text-gray-300 break-word;
@apply col-span-12 text-lg mb-0 mx-3 font-bold dark:text-gray-300 break-word;
}
.text-table-content {

File diff suppressed because one or more lines are too long