start handling plugin svg and actions

This commit is contained in:
Jordan Blasenhauer 2024-06-20 17:03:26 +02:00
parent 9fbf8d4a6e
commit c31ada6849
10 changed files with 4290 additions and 36 deletions

View file

@ -36,17 +36,19 @@ onMounted(() => {
<template>
<span :id="icon.id" class="sr-only">{{ $t("icons_core_desc") }}</span>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="currentColor"
data-svg="core"
role="img"
:class="[props.iconClass, props.iconColor]"
:aria-labelledby="icon.id"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="currentColor"
class="size-6"
>
<path d="M16.5 7.5h-9v9h9v-9Z" />
<path
d="m11.645 20.91-.007-.003-.022-.012a15.247 15.247 0 0 1-.383-.218 25.18 25.18 0 0 1-4.244-3.17C4.688 15.36 2.25 12.174 2.25 8.25 2.25 5.322 4.714 3 7.688 3A5.5 5.5 0 0 1 12 5.052 5.5 5.5 0 0 1 16.313 3c2.973 0 5.437 2.322 5.437 5.25 0 3.925-2.438 7.111-4.739 9.256a25.175 25.175 0 0 1-4.244 3.17 15.247 15.247 0 0 1-.383.219l-.022.012-.007.004-.003.001a.752.752 0 0 1-.704 0l-.003-.001Z"
fill-rule="evenodd"
d="M8.25 2.25A.75.75 0 0 1 9 3v.75h2.25V3a.75.75 0 0 1 1.5 0v.75H15V3a.75.75 0 0 1 1.5 0v.75h.75a3 3 0 0 1 3 3v.75H21A.75.75 0 0 1 21 9h-.75v2.25H21a.75.75 0 0 1 0 1.5h-.75V15H21a.75.75 0 0 1 0 1.5h-.75v.75a3 3 0 0 1-3 3h-.75V21a.75.75 0 0 1-1.5 0v-.75h-2.25V21a.75.75 0 0 1-1.5 0v-.75H9V21a.75.75 0 0 1-1.5 0v-.75h-.75a3 3 0 0 1-3-3v-.75H3A.75.75 0 0 1 3 15h.75v-2.25H3a.75.75 0 0 1 0-1.5h.75V9H3a.75.75 0 0 1 0-1.5h.75v-.75a3 3 0 0 1 3-3h.75V3a.75.75 0 0 1 .75-.75ZM6 6.75A.75.75 0 0 1 6.75 6h10.5a.75.75 0 0 1 .75.75v10.5a.75.75 0 0 1-.75.75H6.75a.75.75 0 0 1-.75-.75V6.75Z"
clip-rule="evenodd"
/>
</svg>
</template>

View file

@ -0,0 +1,42 @@
<script setup>
/**
@name Icons/Lock.vue
@description This component is a svg icon representing lock.
@example
{
iconColor: 'info',
}
@param {string} [iconClass=""]
@param {string} [iconColor="info"] - The color of the icon between some tailwind css available colors (purple, green, red, orange, blue, yellow, gray, dark, amber, emerald, teal, indigo, cyan, sky, pink...). Darker colors are also available using the base color and adding '-darker' (e.g. 'red-darker').
*/
const props = defineProps({
iconClass: {
type: String,
required: false,
default: "default-svg",
},
iconColor: {
type: String,
required: false,
default: "orange",
},
});
</script>
<template>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="currentColor"
data-svg="lock"
role="img"
aria-hidden="true"
:class="[props.iconClass, props.iconColor]"
>
<path
fill-rule="evenodd"
d="M12 1.5a5.25 5.25 0 0 0-5.25 5.25v3a3 3 0 0 0-3 3v6.75a3 3 0 0 0 3 3h10.5a3 3 0 0 0 3-3v-6.75a3 3 0 0 0-3-3v-3c0-2.9-2.35-5.25-5.25-5.25Zm3.75 8.25v-3a3.75 3.75 0 1 0-7.5 0v3h7.5Z"
clip-rule="evenodd"
/>
</svg>
</template>

View file

@ -0,0 +1,42 @@
<script setup>
/**
@name Icons/Trash.vue
@description This component is a svg icon representing trash.
@example
{
iconColor: 'info',
}
@param {string} [iconClass=""]
@param {string} [iconColor="info"] - The color of the icon between some tailwind css available colors (purple, green, red, orange, blue, yellow, gray, dark, amber, emerald, teal, indigo, cyan, sky, pink...). Darker colors are also available using the base color and adding '-darker' (e.g. 'red-darker').
*/
const props = defineProps({
iconClass: {
type: String,
required: false,
default: "default-svg",
},
iconColor: {
type: String,
required: false,
default: "orange",
},
});
</script>
<template>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="currentColor"
data-svg="trash"
role="img"
aria-hidden="true"
:class="[props.iconClass, props.iconColor]"
>
<path
fill-rule="evenodd"
d="M16.5 4.478v.227a48.816 48.816 0 0 1 3.878.512.75.75 0 1 1-.256 1.478l-.209-.035-1.005 13.07a3 3 0 0 1-2.991 2.77H8.084a3 3 0 0 1-2.991-2.77L4.087 6.66l-.209.035a.75.75 0 0 1-.256-1.478A48.567 48.567 0 0 1 7.5 4.705v-.227c0-1.564 1.213-2.9 2.816-2.951a52.662 52.662 0 0 1 3.369 0c1.603.051 2.815 1.387 2.815 2.951Zm-6.136-1.452a51.196 51.196 0 0 1 3.273 0C14.39 3.05 15 3.684 15 4.478v.113a49.488 49.488 0 0 0-6 0v-.113c0-.794.609-1.428 1.364-1.452Zm-.355 5.945a.75.75 0 1 0-1.5.058l.347 9a.75.75 0 1 0 1.499-.058l-.346-9Zm5.48.058a.75.75 0 1 0-1.498-.058l-.347 9a.75.75 0 0 0 1.5.058l.345-9Z"
clip-rule="evenodd"
/>
</svg>
</template>

View file

@ -1,5 +1,5 @@
<script setup>
import { defineProps, computed, reactive } from "vue";
import { defineProps, computed, reactive, onMounted } from "vue";
import Flex from "@components/Widget/Flex.vue";
import PopoverGroup from "@components/Widget/PopoverGroup.vue";
import Text from "@components/Widget/Text.vue";
@ -14,6 +14,10 @@ import Grid from "@components/Widget/Grid.vue";
details : [{
text: "name",
disabled : false,
attrs: {
id: "id",
value: "value",
},
popovers: [
{
text: "This is a popover text",
@ -27,7 +31,7 @@ import Grid from "@components/Widget/Grid.vue";
},
],
}]
@param {string} details - List of details item that contains a text and a list of popovers. We can also add a disabled key to disable the item.
@param {string} details - List of details item that contains a text, disabled state, attrs and list of popovers. We can also add a disabled key to disable the item.
@param {array} [filters=[]] - List of filters to apply on the list of items.
@param {columns} [columns={pc: 4, tablet: 6, mobile: 12}] - Determine the position of the items in the grid system.
*/
@ -69,12 +73,13 @@ const data = reactive({
/>
<ul v-if="data.format" :class="['list-details-container']">
<li
v-for="item in data.format"
v-for="(item, id) in data.format"
:class="[
'list-details-item',
gridClass,
item.disabled ? 'disabled' : 'enabled',
]"
v-bind="item.attrs || {}"
>
<Flex :flexClass="'justify-between items-center'">
<Text :tag="'p'" :text="item.text" />

View file

@ -27,6 +27,8 @@ import Globe from "@components/Icons/Globe.vue";
import Info from "@components/Icons/Info.vue";
import Redirect from "@components/Icons/Redirect.vue";
import External from "@components/Icons/External.vue";
import Trash from "@components/Icons/Trash.vue";
import Lock from "@components/Icons/Lock.vue";
import { computed } from "vue";
@ -111,6 +113,16 @@ const iconClass = computed(() => {
:iconClass="iconClass"
:iconColor="iconColor"
/>
<Trash
v-if="props.iconName === 'trash'"
:iconClass="iconClass"
:iconColor="iconColor"
/>
<Lock
v-if="props.iconName === 'lock'"
:iconClass="iconClass"
:iconColor="iconColor"
/>
<Crown
v-if="props.iconName === 'crown'"
:iconClass="iconClass"

View file

@ -201,12 +201,13 @@
"jobs_table_success" : "Success",
"jobs_table_last_run_date" : "Last run date",
"jobs_table_cache_downloadable" : "Cache (downloadable)",
"plugins_pro_plugin": "Pro plugin",
"plugins_core_plugin": "Core plugin",
"plugins_external_plugin": "External plugin",
"plugins_redirect_page": "Redirect to plugin page",
"plugins_pro_plugin_desc": "Pro plugin",
"plugins_core_plugin_desc": "Core plugin",
"plugins_external_plugin_desc": "External plugin",
"plugins_redirect_page_desc": "Redirect to plugin page",
"plugins_search": "Search plugin",
"plugins_search_desc": "Search the plugin by his name",
"plugins_type": "Plugin type",
"plugins_type_desc": "Only show plugins of the chosen type"
"plugins_type_desc": "Only show plugins of the chosen type",
"plugins_delete_desc": "Delete plugin"
}

View file

@ -27,7 +27,6 @@ onBeforeMount(() => {
const builder = [
{
type: "card",
containerColumns: { pc: 12, tablet: 12, mobile: 12 },
widgets: [
{
type: "Title",
@ -47,10 +46,10 @@ const builder = [
value: "",
keys: ["text"],
field: {
id: `filter-plugin-name`,
id: "filter-plugin-name",
value: "",
type: "text",
name: `filter-plugin-name`,
name: "filter-plugin-name",
containerClass: "setting",
label: "plugins_search",
placeholder: "inp_keyword",
@ -63,7 +62,11 @@ const builder = [
svgSize: "sm",
},
],
columns: { pc: 3, tablet: 4, mobile: 12 },
columns: {
pc: 3,
tablet: 4,
mobile: 12,
},
},
},
{
@ -73,10 +76,10 @@ const builder = [
value: "all",
keys: ["type"],
field: {
id: `filter-plugin-type`,
id: "filter-plugin-type",
value: "all",
values: ["all", "pro", "core", "external"],
name: `filter-plugin-type`,
name: "filter-plugin-type",
onlyDown: true,
label: "plugins_type",
containerClass: "setting",
@ -89,52 +92,487 @@ const builder = [
svgSize: "sm",
},
],
columns: { pc: 3, tablet: 4, mobile: 12 },
columns: {
pc: 3,
tablet: 4,
mobile: 12,
},
},
},
],
columns: { pc: 4, tablet: 6, mobile: 12 },
details: [
{
text: "Pro",
text: "General",
type: "pro",
attrs: {
"data-plugin-id": "general",
"data-plugin-delete": "false",
},
disabled: true,
popovers: [
{
text: "plugins_pro_plugin",
text: "plugins_pro_plugin_desc",
iconName: "crown",
iconColor: "amber",
},
],
},
{
text: "Core",
text: "Antibot",
type: "core",
attrs: {
"data-plugin-id": "antibot",
"data-plugin-delete": "false",
},
disabled: false,
popovers: [
{
text: "plugins_core_plugin",
iconName: "core",
text: "plugins_redirect_page_desc",
iconName: "redirect",
iconColor: "blue",
},
],
},
{
text: "Auth basic",
type: "core",
attrs: {
"data-plugin-id": "authbasic",
"data-plugin-delete": "false",
},
disabled: false,
popovers: [],
},
{
text: "Backup",
type: "pro",
attrs: {
"data-plugin-id": "backup",
"data-plugin-delete": "false",
},
disabled: true,
popovers: [
{
text: "plugins_redirect_page_desc",
iconName: "redirect",
iconColor: "blue",
},
{
text: "plugins_pro_plugin_desc",
iconName: "crown",
iconColor: "amber",
},
],
},
{
text: "Bad behavior",
type: "external",
attrs: {
"data-plugin-id": "badbehavior",
"data-plugin-delete": "true",
},
disabled: false,
popovers: [
{
text: "plugins_redirect_page_desc",
iconName: "redirect",
iconColor: "blue",
},
{
text: "plugins_delete_desc",
iconName: "trash",
iconColor: "red",
},
],
},
{
text: "external",
type: "external",
text: "Blacklist",
type: "core",
attrs: {
"data-plugin-id": "blacklist",
"data-plugin-delete": "false",
},
disabled: false,
popovers: [
{
text: "plugins_redirect_page",
text: "plugins_redirect_page_desc",
iconName: "redirect",
iconColor: "info",
iconColor: "blue",
},
],
},
{
text: "Brotli",
type: "core",
attrs: {
"data-plugin-id": "brotli",
"data-plugin-delete": "false",
},
disabled: false,
popovers: [],
},
{
text: "BunkerNet",
type: "core",
attrs: {
"data-plugin-id": "bunkernet",
"data-plugin-delete": "false",
},
disabled: false,
popovers: [
{
text: "plugins_external_plugin",
iconName: "external",
text: "plugins_redirect_page_desc",
iconName: "redirect",
iconColor: "blue",
},
],
},
{
text: "CORS",
type: "core",
attrs: {
"data-plugin-id": "cors",
"data-plugin-delete": "false",
},
disabled: false,
popovers: [
{
text: "plugins_redirect_page_desc",
iconName: "redirect",
iconColor: "blue",
},
],
},
{
text: "Client cache",
type: "core",
attrs: {
"data-plugin-id": "clientcache",
"data-plugin-delete": "false",
},
disabled: false,
popovers: [],
},
{
text: "Country",
type: "core",
attrs: {
"data-plugin-id": "country",
"data-plugin-delete": "false",
},
disabled: false,
popovers: [
{
text: "plugins_redirect_page_desc",
iconName: "redirect",
iconColor: "blue",
},
],
},
{
text: "Custom HTTPS certificate",
type: "core",
attrs: {
"data-plugin-id": "customcert",
"data-plugin-delete": "false",
},
disabled: false,
popovers: [],
},
{
text: "DB",
type: "core",
attrs: {
"data-plugin-id": "db",
"data-plugin-delete": "false",
},
disabled: false,
popovers: [],
},
{
text: "DNSBL",
type: "core",
attrs: {
"data-plugin-id": "dnsbl",
"data-plugin-delete": "false",
},
disabled: false,
popovers: [
{
text: "plugins_redirect_page_desc",
iconName: "redirect",
iconColor: "blue",
},
],
},
{
text: "Errors",
type: "core",
attrs: {
"data-plugin-id": "errors",
"data-plugin-delete": "false",
},
disabled: false,
popovers: [
{
text: "plugins_redirect_page_desc",
iconName: "redirect",
iconColor: "blue",
},
],
},
{
text: "Greylist",
type: "core",
attrs: {
"data-plugin-id": "greylist",
"data-plugin-delete": "false",
},
disabled: false,
popovers: [
{
text: "plugins_redirect_page_desc",
iconName: "redirect",
iconColor: "blue",
},
],
},
{
text: "Gzip",
type: "core",
attrs: {
"data-plugin-id": "gzip",
"data-plugin-delete": "false",
},
disabled: false,
popovers: [],
},
{
text: "HTML injection",
type: "core",
attrs: {
"data-plugin-id": "inject",
"data-plugin-delete": "false",
},
disabled: false,
popovers: [],
},
{
text: "Headers",
type: "core",
attrs: {
"data-plugin-id": "headers",
"data-plugin-delete": "false",
},
disabled: false,
popovers: [],
},
{
text: "Jobs",
type: "core",
attrs: {
"data-plugin-id": "jobs",
"data-plugin-delete": "false",
},
disabled: false,
popovers: [],
},
{
text: "Let's Encrypt",
type: "core",
attrs: {
"data-plugin-id": "letsencrypt",
"data-plugin-delete": "false",
},
disabled: false,
popovers: [],
},
{
text: "Limit",
type: "core",
attrs: {
"data-plugin-id": "limit",
"data-plugin-delete": "false",
},
disabled: false,
popovers: [
{
text: "plugins_redirect_page_desc",
iconName: "redirect",
iconColor: "blue",
},
],
},
{
text: "Metrics",
type: "core",
attrs: {
"data-plugin-id": "metrics",
"data-plugin-delete": "false",
},
disabled: false,
popovers: [],
},
{
text: "Miscellaneous",
type: "core",
attrs: {
"data-plugin-id": "misc",
"data-plugin-delete": "false",
},
disabled: false,
popovers: [
{
text: "plugins_redirect_page_desc",
iconName: "redirect",
iconColor: "blue",
},
],
},
{
text: "ModSecurity",
type: "core",
attrs: {
"data-plugin-id": "modsecurity",
"data-plugin-delete": "false",
},
disabled: false,
popovers: [],
},
{
text: "PHP",
type: "core",
attrs: {
"data-plugin-id": "php",
"data-plugin-delete": "false",
},
disabled: false,
popovers: [],
},
{
text: "Pro",
type: "core",
attrs: {
"data-plugin-id": "pro",
"data-plugin-delete": "false",
},
disabled: false,
popovers: [],
},
{
text: "Real IP",
type: "core",
attrs: {
"data-plugin-id": "realip",
"data-plugin-delete": "false",
},
disabled: false,
popovers: [],
},
{
text: "Redirect",
type: "core",
attrs: {
"data-plugin-id": "redirect",
"data-plugin-delete": "false",
},
disabled: false,
popovers: [],
},
{
text: "Redis",
type: "core",
attrs: {
"data-plugin-id": "redis",
"data-plugin-delete": "false",
},
disabled: false,
popovers: [
{
text: "plugins_redirect_page_desc",
iconName: "redirect",
iconColor: "blue",
},
],
},
{
text: "Reverse proxy",
type: "core",
attrs: {
"data-plugin-id": "reverseproxy",
"data-plugin-delete": "false",
},
disabled: false,
popovers: [],
},
{
text: "Reverse scan",
type: "core",
attrs: {
"data-plugin-id": "reversescan",
"data-plugin-delete": "false",
},
disabled: false,
popovers: [
{
text: "plugins_redirect_page_desc",
iconName: "redirect",
iconColor: "blue",
},
],
},
{
text: "Self-signed certificate",
type: "core",
attrs: {
"data-plugin-id": "selfsigned",
"data-plugin-delete": "false",
},
disabled: false,
popovers: [],
},
{
text: "Sessions",
type: "core",
attrs: {
"data-plugin-id": "sessions",
"data-plugin-delete": "false",
},
disabled: false,
popovers: [],
},
{
text: "UI",
type: "core",
attrs: {
"data-plugin-id": "ui",
"data-plugin-delete": "false",
},
disabled: false,
popovers: [],
},
{
text: "Whitelist",
type: "core",
attrs: {
"data-plugin-id": "whitelist",
"data-plugin-delete": "false",
},
disabled: false,
popovers: [
{
text: "plugins_redirect_page_desc",
iconName: "redirect",
iconColor: "blue",
},
],
},
],
columns: {
pc: 4,
tablet: 6,
mobile: 12,
},
},
},
],

View file

@ -429,9 +429,11 @@ def job_builder(jobs):
}
]
# store on a file
with open("jobs.json", "w") as f:
json.dump(builder, f, indent=4)
return builder
job_builder(jobs)
output = job_builder(jobs)
# store on a file
with open("jobs.json", "w") as f:
json.dump(output, f, indent=4)

3147
vuejs/tests/plugins.py Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,563 @@
[
{
"type": "card",
"widgets": [
{
"type": "Title",
"data": {
"title": "dashboard_plugins",
"type": "card"
}
},
{
"type": "ListDetails",
"data": {
"filters": [
{
"filter": "default",
"filterName": "keyword",
"type": "keyword",
"value": "",
"keys": [
"text"
],
"field": {
"id": "filter-plugin-name",
"value": "",
"type": "text",
"name": "filter-plugin-name",
"containerClass": "setting",
"label": "plugins_search",
"placeholder": "inp_keyword",
"isClipboard": false,
"popovers": [
{
"text": "plugins_search_desc",
"iconName": "info",
"iconColor": "info",
"svgSize": "sm"
}
],
"columns": {
"pc": 3,
"tablet": 4,
"mobile": 12
}
}
},
{
"filter": "default",
"filterName": "type",
"type": "select",
"value": "all",
"keys": [
"type"
],
"field": {
"id": "filter-plugin-type",
"value": "all",
"values": [
"all",
"pro",
"core",
"external"
],
"name": "filter-plugin-type",
"onlyDown": true,
"label": "plugins_type",
"containerClass": "setting",
"maxBtnChars": 24,
"popovers": [
{
"text": "plugins_type_desc",
"iconName": "info",
"iconColor": "info",
"svgSize": "sm"
}
],
"columns": {
"pc": 3,
"tablet": 4,
"mobile": 12
}
}
}
],
"details": [
{
"text": "General",
"type": "pro",
"attrs": {
"data-plugin-id": "general",
"data-plugin-delete": "false"
},
"disabled": true,
"popovers": [
{
"text": "plugins_pro_plugin_desc",
"iconName": "crown",
"iconColor": "amber"
}
]
},
{
"text": "Antibot",
"type": "core",
"attrs": {
"data-plugin-id": "antibot",
"data-plugin-delete": "false"
},
"disabled": false,
"popovers": [
{
"text": "plugins_redirect_page_desc",
"iconName": "redirect",
"iconColor": "blue"
}
]
},
{
"text": "Auth basic",
"type": "core",
"attrs": {
"data-plugin-id": "authbasic",
"data-plugin-delete": "false"
},
"disabled": false,
"popovers": []
},
{
"text": "Backup",
"type": "pro",
"attrs": {
"data-plugin-id": "backup",
"data-plugin-delete": "false"
},
"disabled": true,
"popovers": [
{
"text": "plugins_redirect_page_desc",
"iconName": "redirect",
"iconColor": "blue"
},
{
"text": "plugins_pro_plugin_desc",
"iconName": "crown",
"iconColor": "amber"
}
]
},
{
"text": "Bad behavior",
"type": "external",
"attrs": {
"data-plugin-id": "badbehavior",
"data-plugin-delete": "true"
},
"disabled": false,
"popovers": [
{
"text": "plugins_redirect_page_desc",
"iconName": "redirect",
"iconColor": "blue"
},
{
"text": "plugins_delete_desc",
"iconName": "trash",
"iconColor": "red"
}
]
},
{
"text": "Blacklist",
"type": "core",
"attrs": {
"data-plugin-id": "blacklist",
"data-plugin-delete": "false"
},
"disabled": false,
"popovers": [
{
"text": "plugins_redirect_page_desc",
"iconName": "redirect",
"iconColor": "blue"
}
]
},
{
"text": "Brotli",
"type": "core",
"attrs": {
"data-plugin-id": "brotli",
"data-plugin-delete": "false"
},
"disabled": false,
"popovers": []
},
{
"text": "BunkerNet",
"type": "core",
"attrs": {
"data-plugin-id": "bunkernet",
"data-plugin-delete": "false"
},
"disabled": false,
"popovers": [
{
"text": "plugins_redirect_page_desc",
"iconName": "redirect",
"iconColor": "blue"
}
]
},
{
"text": "CORS",
"type": "core",
"attrs": {
"data-plugin-id": "cors",
"data-plugin-delete": "false"
},
"disabled": false,
"popovers": [
{
"text": "plugins_redirect_page_desc",
"iconName": "redirect",
"iconColor": "blue"
}
]
},
{
"text": "Client cache",
"type": "core",
"attrs": {
"data-plugin-id": "clientcache",
"data-plugin-delete": "false"
},
"disabled": false,
"popovers": []
},
{
"text": "Country",
"type": "core",
"attrs": {
"data-plugin-id": "country",
"data-plugin-delete": "false"
},
"disabled": false,
"popovers": [
{
"text": "plugins_redirect_page_desc",
"iconName": "redirect",
"iconColor": "blue"
}
]
},
{
"text": "Custom HTTPS certificate",
"type": "core",
"attrs": {
"data-plugin-id": "customcert",
"data-plugin-delete": "false"
},
"disabled": false,
"popovers": []
},
{
"text": "DB",
"type": "core",
"attrs": {
"data-plugin-id": "db",
"data-plugin-delete": "false"
},
"disabled": false,
"popovers": []
},
{
"text": "DNSBL",
"type": "core",
"attrs": {
"data-plugin-id": "dnsbl",
"data-plugin-delete": "false"
},
"disabled": false,
"popovers": [
{
"text": "plugins_redirect_page_desc",
"iconName": "redirect",
"iconColor": "blue"
}
]
},
{
"text": "Errors",
"type": "core",
"attrs": {
"data-plugin-id": "errors",
"data-plugin-delete": "false"
},
"disabled": false,
"popovers": [
{
"text": "plugins_redirect_page_desc",
"iconName": "redirect",
"iconColor": "blue"
}
]
},
{
"text": "Greylist",
"type": "core",
"attrs": {
"data-plugin-id": "greylist",
"data-plugin-delete": "false"
},
"disabled": false,
"popovers": [
{
"text": "plugins_redirect_page_desc",
"iconName": "redirect",
"iconColor": "blue"
}
]
},
{
"text": "Gzip",
"type": "core",
"attrs": {
"data-plugin-id": "gzip",
"data-plugin-delete": "false"
},
"disabled": false,
"popovers": []
},
{
"text": "HTML injection",
"type": "core",
"attrs": {
"data-plugin-id": "inject",
"data-plugin-delete": "false"
},
"disabled": false,
"popovers": []
},
{
"text": "Headers",
"type": "core",
"attrs": {
"data-plugin-id": "headers",
"data-plugin-delete": "false"
},
"disabled": false,
"popovers": []
},
{
"text": "Jobs",
"type": "core",
"attrs": {
"data-plugin-id": "jobs",
"data-plugin-delete": "false"
},
"disabled": false,
"popovers": []
},
{
"text": "Let's Encrypt",
"type": "core",
"attrs": {
"data-plugin-id": "letsencrypt",
"data-plugin-delete": "false"
},
"disabled": false,
"popovers": []
},
{
"text": "Limit",
"type": "core",
"attrs": {
"data-plugin-id": "limit",
"data-plugin-delete": "false"
},
"disabled": false,
"popovers": [
{
"text": "plugins_redirect_page_desc",
"iconName": "redirect",
"iconColor": "blue"
}
]
},
{
"text": "Metrics",
"type": "core",
"attrs": {
"data-plugin-id": "metrics",
"data-plugin-delete": "false"
},
"disabled": false,
"popovers": []
},
{
"text": "Miscellaneous",
"type": "core",
"attrs": {
"data-plugin-id": "misc",
"data-plugin-delete": "false"
},
"disabled": false,
"popovers": [
{
"text": "plugins_redirect_page_desc",
"iconName": "redirect",
"iconColor": "blue"
}
]
},
{
"text": "ModSecurity",
"type": "core",
"attrs": {
"data-plugin-id": "modsecurity",
"data-plugin-delete": "false"
},
"disabled": false,
"popovers": []
},
{
"text": "PHP",
"type": "core",
"attrs": {
"data-plugin-id": "php",
"data-plugin-delete": "false"
},
"disabled": false,
"popovers": []
},
{
"text": "Pro",
"type": "core",
"attrs": {
"data-plugin-id": "pro",
"data-plugin-delete": "false"
},
"disabled": false,
"popovers": []
},
{
"text": "Real IP",
"type": "core",
"attrs": {
"data-plugin-id": "realip",
"data-plugin-delete": "false"
},
"disabled": false,
"popovers": []
},
{
"text": "Redirect",
"type": "core",
"attrs": {
"data-plugin-id": "redirect",
"data-plugin-delete": "false"
},
"disabled": false,
"popovers": []
},
{
"text": "Redis",
"type": "core",
"attrs": {
"data-plugin-id": "redis",
"data-plugin-delete": "false"
},
"disabled": false,
"popovers": [
{
"text": "plugins_redirect_page_desc",
"iconName": "redirect",
"iconColor": "blue"
}
]
},
{
"text": "Reverse proxy",
"type": "core",
"attrs": {
"data-plugin-id": "reverseproxy",
"data-plugin-delete": "false"
},
"disabled": false,
"popovers": []
},
{
"text": "Reverse scan",
"type": "core",
"attrs": {
"data-plugin-id": "reversescan",
"data-plugin-delete": "false"
},
"disabled": false,
"popovers": [
{
"text": "plugins_redirect_page_desc",
"iconName": "redirect",
"iconColor": "blue"
}
]
},
{
"text": "Self-signed certificate",
"type": "core",
"attrs": {
"data-plugin-id": "selfsigned",
"data-plugin-delete": "false"
},
"disabled": false,
"popovers": []
},
{
"text": "Sessions",
"type": "core",
"attrs": {
"data-plugin-id": "sessions",
"data-plugin-delete": "false"
},
"disabled": false,
"popovers": []
},
{
"text": "UI",
"type": "core",
"attrs": {
"data-plugin-id": "ui",
"data-plugin-delete": "false"
},
"disabled": false,
"popovers": []
},
{
"text": "Whitelist",
"type": "core",
"attrs": {
"data-plugin-id": "whitelist",
"data-plugin-delete": "false"
},
"disabled": false,
"popovers": [
{
"text": "plugins_redirect_page_desc",
"iconName": "redirect",
"iconColor": "blue"
}
]
}
],
"columns": {
"pc": 4,
"tablet": 6,
"mobile": 12
}
}
}
]
}
]