services table format and base UI component done

* update tailwind css config to fit new folder names
* move table cell on dedicated components for better lisibility
* services data format done
* base UI table for services done
This commit is contained in:
Jordan Blasenhauer 2024-07-29 17:08:08 +02:00
parent 784c231198
commit 7b57f63cc5
13 changed files with 454 additions and 257 deletions

View file

@ -0,0 +1,51 @@
<script setup>
import { defineProps, reactive } from "vue";
/**
@name Icons/Pen.vue
@description This component is a svg icon representing pen.
@example
{
color: 'orange',
}
@param {string} [iconClass="icon-default"] - The class of the icon.
@param {string} [color="orange"] - 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').
@param {boolean} [disabled=false] - If true, the icon will be disabled.
*/
const props = defineProps({
iconClass: {
type: String,
required: false,
default: "icon-default",
},
color: {
type: String,
required: false,
default: "orange",
},
disabled: { type: Boolean, required: false, default: false },
});
const icon = reactive({
color: props.color || "orange",
});
</script>
<template>
<svg
:data-color="icon.color"
:aria-disabled="props.disabled ? 'true' : 'false'"
data-svg="pen"
role="img"
aria-hidden="true"
:class="[props.iconClass, icon.color, 'fill']"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="currentColor"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L10.582 16.07a4.5 4.5 0 0 1-1.897 1.13L6 18l.8-2.685a4.5 4.5 0 0 1 1.13-1.897l8.932-8.931Zm0 0L19.5 7.125M18 14v4.75A2.25 2.25 0 0 1 15.75 21H5.25A2.25 2.25 0 0 1 3 18.75V8.25A2.25 2.25 0 0 1 5.25 6H10"
/>
</svg>
</template>

View file

@ -0,0 +1,51 @@
<script setup>
import { reactive, computed, ref, onMounted, watch } from "vue";
import Text from "@components/Widget/Text.vue";
import Icons from "@components/Widget/Icons.vue";
import Fields from "@components/Form/Fields.vue";
import Button from "@components/Widget/Button.vue";
import ButtonGroup from "@components/Widget/ButtonGroup.vue";
/**
@name Builder/Cell.vue
@description This component includes all elements that can be shown in a table cell.
@example
{ type : "button",
data : {
id: "open-modal-btn",
text: "Open modal",
disabled: false,
hideText: true,
color: "green",
size: "normal",
iconName: "modal",
attrs: { data-toggle: "modal", "data-target": "#modal"},
}
}
@param {string} type - The type of the cell. This needs to be a Vue component.
@param {object} data - The data to display in the cell. This needs to be the props of the Vue component.
*/
const props = defineProps({
type: {
type: String,
required: true,
},
data: {
type: Object,
required: true,
},
});
const cell = reactive({
name: computed(() => props.type.toLowerCase()),
});
</script>
<template>
<Text v-if="cell.name === 'text'" v-bind="props.data" />
<Icons v-if="cell.name === 'icons'" v-bind="props.data" />
<Fields v-if="cell.name === 'fields'" v-bind="props.data" />
<Button v-if="cell.name === 'button'" v-bind="props.data" />
<ButtonGroup v-if="cell.name === 'buttongroup'" v-bind="props.data" />
</template>

View file

@ -1,5 +1,5 @@
<script setup>
import { defineProps, reactive, onMounted, ref } from "vue";
import { defineProps, reactive, onMounted, ref, computed } from "vue";
import Box from "@components/Icons/Box.vue";
import Carton from "@components/Icons/Carton.vue";
import Core from "@components/Icons/Core.vue";
@ -82,6 +82,7 @@ const props = defineProps({
const icon = reactive({
color: props.color,
class: props.iconClass,
name: computed(() => props.iconName.toLowerCase()),
});
const iconEl = ref();
@ -96,197 +97,197 @@ onMounted(() => {
<template>
<div ref="iconEl" :class="[props.isStick ? 'stick' : '', 'icon-container']">
<Exclamation
v-if="props.iconName === 'exclamation'"
v-if="icon.name === 'exclamation'"
:iconClass="icon.class"
:color="props.color"
:disabled="props.disabled"
/>
<Box
v-if="props.iconName === 'box'"
v-if="icon.name === 'box'"
:iconClass="icon.class"
:color="props.color"
:disabled="props.disabled"
/>
<Carton
v-if="props.iconName === 'carton'"
v-if="icon.name === 'carton'"
:iconClass="icon.class"
:color="props.color"
:disabled="props.disabled"
/>
<Core
v-if="props.iconName === 'core'"
v-if="icon.name === 'core'"
:iconClass="icon.class"
:color="props.color"
:disabled="props.disabled"
/>
<External
v-if="props.iconName === 'external'"
v-if="icon.name === 'external'"
:iconClass="icon.class"
:color="props.color"
:disabled="props.disabled"
/>
<Search
v-if="props.iconName === 'search'"
v-if="icon.name === 'search'"
:iconClass="icon.class"
:color="props.color"
:disabled="props.disabled"
/>
<Trash
v-if="props.iconName === 'trash'"
v-if="icon.name === 'trash'"
:iconClass="icon.class"
:color="props.color"
:disabled="props.disabled"
/>
<Lock
v-if="props.iconName === 'lock'"
v-if="icon.name === 'lock'"
:iconClass="icon.class"
:color="props.color"
:disabled="props.disabled"
/>
<Crown
v-if="props.iconName === 'crown'"
v-if="icon.name === 'crown'"
:iconClass="icon.class"
:color="props.color"
:disabled="props.disabled"
/>
<Discord
v-if="props.iconName === 'discord'"
v-if="icon.name === 'discord'"
:iconClass="icon.class"
:color="props.color"
:disabled="props.disabled"
/>
<Disk
v-if="props.iconName === 'disk'"
v-if="icon.name === 'disk'"
:iconClass="icon.class"
:color="props.color"
:disabled="props.disabled"
/>
<Disks
v-if="props.iconName === 'disks'"
v-if="icon.name === 'disks'"
:iconClass="icon.class"
:color="props.color"
:disabled="props.disabled"
/>
<Globe
v-if="props.iconName === 'globe'"
v-if="icon.name === 'globe'"
:iconClass="icon.class"
:color="props.color"
:disabled="props.disabled"
/>
<Info
v-if="props.iconName === 'info'"
v-if="icon.name === 'info'"
:iconClass="icon.class"
:color="props.color"
:disabled="props.disabled"
/>
<Flag
v-if="props.iconName === 'flag'"
v-if="icon.name === 'flag'"
:iconClass="icon.class"
:color="props.color"
:disabled="props.disabled"
/>
<Gear
v-if="props.iconName === 'gear'"
v-if="icon.name === 'gear'"
:iconClass="icon.class"
:color="props.color"
:disabled="props.disabled"
/>
<Github
v-if="props.iconName === 'github'"
v-if="icon.name === 'github'"
:iconClass="icon.class"
:color="props.color"
:disabled="props.disabled"
/>
<House
v-if="props.iconName === 'house'"
v-if="icon.name === 'house'"
:iconClass="icon.class"
:color="props.color"
:disabled="props.disabled"
/>
<List
v-if="props.iconName === 'list'"
v-if="icon.name === 'list'"
:iconClass="icon.class"
:color="props.color"
:disabled="props.disabled"
/>
<Key
v-if="props.iconName === 'key'"
v-if="icon.name === 'key'"
:iconClass="icon.class"
:color="props.color"
:disabled="props.disabled"
/>
<Linkedin
v-if="props.iconName === 'linkedin'"
v-if="icon.name === 'linkedin'"
:iconClass="icon.class"
:color="props.color"
:disabled="props.disabled"
/>
<Plus
v-if="props.iconName === 'plus'"
v-if="icon.name === 'plus'"
:iconClass="icon.class"
:color="props.color"
:disabled="props.disabled"
/>
<Puzzle
v-if="props.iconName === 'puzzle'"
v-if="icon.name === 'puzzle'"
:iconClass="icon.class"
:color="props.color"
:disabled="props.disabled"
/>
<Settings
v-if="props.iconName === 'settings'"
v-if="icon.name === 'settings'"
:iconClass="icon.class"
:color="props.color"
:disabled="props.disabled"
/>
<Task
v-if="props.iconName === 'task'"
v-if="icon.name === 'task'"
:iconClass="icon.class"
:color="props.color"
:disabled="props.disabled"
/>
<Trespass
v-if="props.iconName === 'trespass'"
v-if="icon.name === 'trespass'"
:iconClass="icon.class"
:color="props.color"
:disabled="props.disabled"
/>
<Check
v-if="props.iconName === 'check'"
v-if="icon.name === 'check'"
:iconClass="icon.class"
:color="props.color"
:disabled="props.disabled"
/>
<Cross
v-if="props.iconName === 'cross'"
v-if="icon.name === 'cross'"
:iconClass="icon.class"
:color="props.color"
:disabled="props.disabled"
/>
<Twitter
v-if="props.iconName === 'twitter'"
v-if="icon.name === 'twitter'"
:iconClass="icon.class"
:color="props.color"
:disabled="props.disabled"
/>
<Wire
v-if="props.iconName === 'wire'"
v-if="icon.name === 'wire'"
:iconClass="icon.class"
:color="props.color"
:disabled="props.disabled"
/>
<Funnel
v-if="props.iconName === 'funnel'"
v-if="icon.name === 'funnel'"
:iconClass="icon.class"
:color="props.color"
:disabled="props.disabled"
/>
<Redirect
v-if="props.iconName === 'redirect'"
v-if="icon.name === 'redirect'"
:iconClass="icon.class"
:color="props.color"
:disabled="props.disabled"
/>
<Close v-if="props.iconName === 'close'" :iconClass="icon.class" />
<Close v-if="icon.name === 'close'" :iconClass="icon.class" />
</div>
</template>

View file

@ -3,10 +3,7 @@ import { reactive, computed, ref, onMounted, watch } from "vue";
import { v4 as uuidv4 } from "uuid";
import MessageUnmatch from "@components/Message/Unmatch.vue";
import Container from "@components/Widget/Container.vue";
import Text from "@components/Widget/Text.vue";
import Icons from "@components/Widget/Icons.vue";
import Fields from "@components/Form/Fields.vue";
import Button from "@components/Widget/Button.vue";
import Cell from "@components/Widget/Cell.vue";
import Filter from "@components/Widget/Filter.vue";
/**
@ -240,10 +237,7 @@ onMounted(() => {
`col-span-${props.positions[id]}`,
]"
>
<Text v-if="col.type === 'Text'" v-bind="col.data" />
<Icons v-if="col.type === 'Icons'" v-bind="col.data" />
<Fields v-if="col.type === 'Fields'" v-bind="col.data" />
<Button v-if="col.type === 'Button'" v-bind="col.data" />
<Cell :data="col.data" :type="col.type" />
</td>
</template>
</tr>

View file

@ -266,10 +266,7 @@
"services_title": "Services",
"services_table_name": "Name",
"services_table_method": "Method",
"services_table_settings": "Settings",
"services_table_manage": "Manage",
"services_table_is_draft": "Draft status",
"services_table_delete": "Delete",
"services_table_actions": "Actions",
"services_search": "Search services",
"services_search_desc": "Search within service name",
"services_methods": "Methods",

View file

@ -16,7 +16,7 @@
></div>
<div
class="hidden"
data-server-builder="W3sidHlwZSI6ICJjYXJkIiwgImNvbnRhaW5lckNvbHVtbnMiOiB7InBjIjogMTIsICJ0YWJsZXQiOiAxMiwgIm1vYmlsZSI6IDEyfSwgIndpZGdldHMiOiBbeyJ0eXBlIjogIlRpdGxlIiwgImRhdGEiOiB7InRpdGxlIjogInNlcnZpY2VzX3RpdGxlIn19LCB7InR5cGUiOiAiVGFibGUiLCAiZGF0YSI6IHsidGl0bGUiOiAic2VydmljZXNfdGFibGVfdGl0bGUiLCAibWluV2lkdGgiOiAibGciLCAiaGVhZGVyIjogWyJzZXJ2aWNlc190YWJsZV9uYW1lIiwgInNlcnZpY2VzX3RhYmxlX21ldGhvZCIsICJzZXJ2aWNlc190YWJsZV9zZXR0aW5ncyIsICJzZXJ2aWNlc190YWJsZV9tYW5hZ2UiLCAic2VydmljZXNfdGFibGVfaXNfZHJhZnQiLCAic2VydmljZXNfdGFibGVfZGVsZXRlIl0sICJwb3NpdGlvbnMiOiBbMiwgMiwgMiwgMiwgMiwgMl0sICJpdGVtcyI6IFtbeyJuYW1lIjogImFwcDEuZXhhbXBsZS5jb20iLCAidHlwZSI6ICJUZXh0IiwgImRhdGEiOiB7InRleHQiOiAiYXBwMS5leGFtcGxlLmNvbSJ9fSwgeyJtZXRob2QiOiAic2NoZWR1bGVyIiwgInR5cGUiOiAiVGV4dCIsICJkYXRhIjogeyJ0ZXh0IjogInNjaGVkdWxlciJ9fSwgeyJ0eXBlIjogIkJ1dHRvbiIsICJkYXRhIjogeyJpZCI6ICJvcGVuLW1vZGFsLXNldHRpbmdzLTAiLCAidGV4dCI6ICJzZXR0aW5ncyIsICJoaWRlVGV4dCI6IGZhbHNlLCAiIGNvbG9yIjogImluZm8iLCAic2l6ZSI6ICJub3JtYWwiLCAiaWNvbk5hbWUiOiAic2V0dGluZ3MifX0sIHsidHlwZSI6ICJCdXR0b24iLCAiZGF0YSI6IHsiYXR0cnMiOiB7ImRhdGEtc2VydmVyLW5hbWUiOiAiYXBwMS5leGFtcGxlLmNvbSJ9LCAiaWQiOiAib3Blbi1tb2RhbC1tYW5hZ2UtMCIsICJ0ZXh0IjogIm1hbmFnZSIsICJoaWRlVGV4dCI6IGZhbHNlLCAiIGNvbG9yIjogImdyZWVuIiwgInNpemUiOiAibm9ybWFsIiwgImljb25OYW1lIjogIm1hbmFnZSJ9fSwgeyJ0eXBlIjogIkJ1dHRvbiIsICJkYXRhIjogeyJhdHRycyI6IHsiZGF0YS1zZXJ2ZXItbmFtZSI6ICJhcHAxLmV4YW1wbGUuY29tIiwgImRhdGEtaXMtZHJhZnQiOiAibm8ifSwgImlkIjogIm9wZW4tbW9kYWwtZHJhZnQtMCIsICJ0ZXh0IjogIm9ubGluZSIsICJoaWRlVGV4dCI6IGZhbHNlLCAiIGNvbG9yIjogImN5YW4iLCAic2l6ZSI6ICJub3JtYWwiLCAiaWNvbk5hbWUiOiAib25saW5lIn19LCB7InR5cGUiOiAiQnV0dG9uIiwgImRhdGEiOiB7ImF0dHJzIjogeyJkYXRhLXNlcnZlci1uYW1lIjogImFwcDEuZXhhbXBsZS5jb20ifSwgImlkIjogIm9wZW4tbW9kYWwtZGVsZXRlLTAiLCAidGV4dCI6ICJkZWxldGUiLCAiZGlzYWJsZWQiOiB0cnVlLCAiaGlkZVRleHQiOiBmYWxzZSwgIiBjb2xvciI6ICJyZWQiLCAic2l6ZSI6ICJub3JtYWwiLCAiaWNvbk5hbWUiOiAidHJhc2gifX1dLCBbeyJuYW1lIjogInd3dy5leGFtcGxlLmNvbSIsICJ0eXBlIjogIlRleHQiLCAiZGF0YSI6IHsidGV4dCI6ICJ3d3cuZXhhbXBsZS5jb20ifX0sIHsibWV0aG9kIjogInNjaGVkdWxlciIsICJ0eXBlIjogIlRleHQiLCAiZGF0YSI6IHsidGV4dCI6ICJzY2hlZHVsZXIifX0sIHsidHlwZSI6ICJCdXR0b24iLCAiZGF0YSI6IHsiaWQiOiAib3Blbi1tb2RhbC1zZXR0aW5ncy0xIiwgInRleHQiOiAic2V0dGluZ3MiLCAiaGlkZVRleHQiOiBmYWxzZSwgIiBjb2xvciI6ICJpbmZvIiwgInNpemUiOiAibm9ybWFsIiwgImljb25OYW1lIjogInNldHRpbmdzIn19LCB7InR5cGUiOiAiQnV0dG9uIiwgImRhdGEiOiB7ImF0dHJzIjogeyJkYXRhLXNlcnZlci1uYW1lIjogInd3dy5leGFtcGxlLmNvbSJ9LCAiaWQiOiAib3Blbi1tb2RhbC1tYW5hZ2UtMSIsICJ0ZXh0IjogIm1hbmFnZSIsICJoaWRlVGV4dCI6IGZhbHNlLCAiIGNvbG9yIjogImdyZWVuIiwgInNpemUiOiAibm9ybWFsIiwgImljb25OYW1lIjogIm1hbmFnZSJ9fSwgeyJ0eXBlIjogIkJ1dHRvbiIsICJkYXRhIjogeyJhdHRycyI6IHsiZGF0YS1zZXJ2ZXItbmFtZSI6ICJ3d3cuZXhhbXBsZS5jb20iLCAiZGF0YS1pcy1kcmFmdCI6ICJubyJ9LCAiaWQiOiAib3Blbi1tb2RhbC1kcmFmdC0xIiwgInRleHQiOiAib25saW5lIiwgImhpZGVUZXh0IjogZmFsc2UsICIgY29sb3IiOiAiY3lhbiIsICJzaXplIjogIm5vcm1hbCIsICJpY29uTmFtZSI6ICJvbmxpbmUifX0sIHsidHlwZSI6ICJCdXR0b24iLCAiZGF0YSI6IHsiYXR0cnMiOiB7ImRhdGEtc2VydmVyLW5hbWUiOiAid3d3LmV4YW1wbGUuY29tIn0sICJpZCI6ICJvcGVuLW1vZGFsLWRlbGV0ZS0xIiwgInRleHQiOiAiZGVsZXRlIiwgImRpc2FibGVkIjogdHJ1ZSwgImhpZGVUZXh0IjogZmFsc2UsICIgY29sb3IiOiAicmVkIiwgInNpemUiOiAibm9ybWFsIiwgImljb25OYW1lIjogInRyYXNoIn19XV0sICJmaWx0ZXJzIjogW3siZmlsdGVyIjogInRhYmxlIiwgImZpbHRlck5hbWUiOiAia2V5d29yZCIsICJ0eXBlIjogImtleXdvcmQiLCAidmFsdWUiOiAiIiwgImtleXMiOiBbIm5hbWUiXSwgImZpZWxkIjogeyJpZCI6ICJzZXJ2aWNlcy1rZXl3b3JkIiwgInZhbHVlIjogIiIsICJ0eXBlIjogInRleHQiLCAibmFtZSI6ICJzZXJ2aWNlcy1rZXl3b3JkIiwgImxhYmVsIjogInNlcnZpY2VzX3NlYXJjaCIsICJwbGFjZWhvbGRlciI6ICJpbnBfa2V5d29yZCIsICJpc0NsaXBib2FyZCI6IGZhbHNlLCAicG9wb3ZlcnMiOiBbeyJ0ZXh0IjogInNlcnZpY2VzX3NlYXJjaF9kZXNjIiwgImljb25OYW1lIjogImluZm8ifV0sICJjb2x1bW5zIjogeyJwYyI6IDMsICJ0YWJsZXQiOiA0LCAibW9iaWxlIjogMTJ9fX0sIHsiZmlsdGVyIjogInRhYmxlIiwgImZpbHRlck5hbWUiOiAibWV0aG9kIiwgInR5cGUiOiAic2VsZWN0IiwgInZhbHVlIjogImFsbCIsICJrZXlzIjogWyJtZXRob2QiXSwgImZpZWxkIjogeyJpZCI6ICJzZXJ2aWNlcy1tZXRob2RzIiwgInZhbHVlIjogImFsbCIsICJ2YWx1ZXMiOiBbInNjaGVkdWxlciJdLCAibmFtZSI6ICJzZXJ2aWNlcy1tZXRob2RzIiwgIm9ubHlEb3duIjogdHJ1ZSwgImxhYmVsIjogInNlcnZpY2VzX21ldGhvZHMiLCAicG9wb3ZlcnMiOiBbeyJ0ZXh0IjogInNlcnZpY2VzX21ldGhvZHNfZGVzYyIsICJpY29uTmFtZSI6ICJpbmZvIn1dLCAiY29sdW1ucyI6IHsicGMiOiAzLCAidGFibGV0IjogNCwgIm1vYmlsZSI6IDEyfX19LCB7ImZpbHRlciI6ICJ0YWJsZSIsICJmaWx0ZXJOYW1lIjogImRyYWZ0IiwgInR5cGUiOiAic2VsZWN0IiwgInZhbHVlIjogImFsbCIsICJrZXlzIjogWyJkcmFmdCJdLCAiZmllbGQiOiB7ImlkIjogInNlcnZpY2VzLWRyYWZ0IiwgInZhbHVlIjogImFsbCIsICJ2YWx1ZXMiOiBbImFsbCIsICJvbmxpbmUiLCAiZHJhZnQiXSwgIm5hbWUiOiAic2VydmljZXMtZHJhZnQiLCAib25seURvd24iOiB0cnVlLCAibGFiZWwiOiAic2VydmljZXNfZHJhZnQiLCAicG9wb3ZlcnMiOiBbeyJ0ZXh0IjogInNlcnZpY2VzX2RyYWZ0X2Rlc2MiLCAiaWNvbk5hbWUiOiAiaW5mbyJ9XSwgImNvbHVtbnMiOiB7InBjIjogMywgInRhYmxldCI6IDQsICJtb2JpbGUiOiAxMn19fV19fV19XQ"
data-server-builder="W3sidHlwZSI6ICJjYXJkIiwgImNvbnRhaW5lckNvbHVtbnMiOiB7InBjIjogMTIsICJ0YWJsZXQiOiAxMiwgIm1vYmlsZSI6IDEyfSwgIndpZGdldHMiOiBbeyJ0eXBlIjogIlRpdGxlIiwgImRhdGEiOiB7InRpdGxlIjogInNlcnZpY2VzX3RpdGxlIn19LCB7InR5cGUiOiAiVGFibGUiLCAiZGF0YSI6IHsidGl0bGUiOiAic2VydmljZXNfdGFibGVfdGl0bGUiLCAibWluV2lkdGgiOiAibWQiLCAiaGVhZGVyIjogWyJzZXJ2aWNlc190YWJsZV9uYW1lIiwgInNlcnZpY2VzX3RhYmxlX21ldGhvZCIsICJzZXJ2aWNlc190YWJsZV9hY3Rpb25zIl0sICJwb3NpdGlvbnMiOiBbNCwgNCwgNF0sICJpdGVtcyI6IFtbeyJuYW1lIjogImFwcDEuZXhhbXBsZS5jb20iLCAidHlwZSI6ICJUZXh0IiwgImRhdGEiOiB7InRleHQiOiAiYXBwMS5leGFtcGxlLmNvbSJ9fSwgeyJtZXRob2QiOiAic2NoZWR1bGVyIiwgInR5cGUiOiAiVGV4dCIsICJkYXRhIjogeyJ0ZXh0IjogInNjaGVkdWxlciJ9fSwgeyJ0eXBlIjogIkJ1dHRvbkdyb3VwIiwgImRhdGEiOiB7ImJ1dHRvbnMiOiBbeyJpZCI6ICJvcGVuLW1vZGFsLXNldHRpbmdzLTAiLCAidGV4dCI6ICJzZXR0aW5ncyIsICJoaWRlVGV4dCI6IHRydWUsICJjb2xvciI6ICJpbmZvIiwgInNpemUiOiAibm9ybWFsIiwgImljb25OYW1lIjogInNldHRpbmdzIiwgImljb25Db2xvciI6ICJ3aGl0ZSJ9LCB7ImF0dHJzIjogeyJkYXRhLXNlcnZlci1uYW1lIjogImFwcDEuZXhhbXBsZS5jb20ifSwgImlkIjogIm9wZW4tbW9kYWwtbWFuYWdlLTAiLCAidGV4dCI6ICJtYW5hZ2UiLCAiaGlkZVRleHQiOiB0cnVlLCAiY29sb3IiOiAic3VjY2VzcyIsICJzaXplIjogIm5vcm1hbCIsICJpY29uTmFtZSI6ICJnZWFyIiwgImljb25Db2xvciI6ICJ3aGl0ZSJ9LCB7ImF0dHJzIjogeyJkYXRhLXNlcnZlci1uYW1lIjogImFwcDEuZXhhbXBsZS5jb20iLCAiZGF0YS1pcy1kcmFmdCI6ICJubyJ9LCAiaWQiOiAib3Blbi1tb2RhbC1kcmFmdC0wIiwgInRleHQiOiAib25saW5lIiwgImhpZGVUZXh0IjogdHJ1ZSwgImNvbG9yIjogImN5YW4iLCAic2l6ZSI6ICJub3JtYWwiLCAiaWNvbk5hbWUiOiAiZ2xvYmUiLCAiaWNvbkNvbG9yIjogIndoaXRlIn0sIHsiYXR0cnMiOiB7ImRhdGEtc2VydmVyLW5hbWUiOiAiYXBwMS5leGFtcGxlLmNvbSJ9LCAiaWQiOiAib3Blbi1tb2RhbC1kZWxldGUtMCIsICJ0ZXh0IjogImRlbGV0ZSIsICJkaXNhYmxlZCI6IHRydWUsICJoaWRlVGV4dCI6IHRydWUsICJjb2xvciI6ICJyZWQiLCAic2l6ZSI6ICJub3JtYWwiLCAiaWNvbk5hbWUiOiAidHJhc2giLCAiaWNvbkNvbG9yIjogIndoaXRlIn1dfX1dLCBbeyJuYW1lIjogInd3dy5leGFtcGxlLmNvbSIsICJ0eXBlIjogIlRleHQiLCAiZGF0YSI6IHsidGV4dCI6ICJ3d3cuZXhhbXBsZS5jb20ifX0sIHsibWV0aG9kIjogInNjaGVkdWxlciIsICJ0eXBlIjogIlRleHQiLCAiZGF0YSI6IHsidGV4dCI6ICJzY2hlZHVsZXIifX0sIHsidHlwZSI6ICJCdXR0b25Hcm91cCIsICJkYXRhIjogeyJidXR0b25zIjogW3siaWQiOiAib3Blbi1tb2RhbC1zZXR0aW5ncy0xIiwgInRleHQiOiAic2V0dGluZ3MiLCAiaGlkZVRleHQiOiB0cnVlLCAiY29sb3IiOiAiaW5mbyIsICJzaXplIjogIm5vcm1hbCIsICJpY29uTmFtZSI6ICJzZXR0aW5ncyIsICJpY29uQ29sb3IiOiAid2hpdGUifSwgeyJhdHRycyI6IHsiZGF0YS1zZXJ2ZXItbmFtZSI6ICJ3d3cuZXhhbXBsZS5jb20ifSwgImlkIjogIm9wZW4tbW9kYWwtbWFuYWdlLTEiLCAidGV4dCI6ICJtYW5hZ2UiLCAiaGlkZVRleHQiOiB0cnVlLCAiY29sb3IiOiAic3VjY2VzcyIsICJzaXplIjogIm5vcm1hbCIsICJpY29uTmFtZSI6ICJnZWFyIiwgImljb25Db2xvciI6ICJ3aGl0ZSJ9LCB7ImF0dHJzIjogeyJkYXRhLXNlcnZlci1uYW1lIjogInd3dy5leGFtcGxlLmNvbSIsICJkYXRhLWlzLWRyYWZ0IjogIm5vIn0sICJpZCI6ICJvcGVuLW1vZGFsLWRyYWZ0LTEiLCAidGV4dCI6ICJvbmxpbmUiLCAiaGlkZVRleHQiOiB0cnVlLCAiY29sb3IiOiAiY3lhbiIsICJzaXplIjogIm5vcm1hbCIsICJpY29uTmFtZSI6ICJnbG9iZSIsICJpY29uQ29sb3IiOiAid2hpdGUifSwgeyJhdHRycyI6IHsiZGF0YS1zZXJ2ZXItbmFtZSI6ICJ3d3cuZXhhbXBsZS5jb20ifSwgImlkIjogIm9wZW4tbW9kYWwtZGVsZXRlLTEiLCAidGV4dCI6ICJkZWxldGUiLCAiZGlzYWJsZWQiOiB0cnVlLCAiaGlkZVRleHQiOiB0cnVlLCAiY29sb3IiOiAicmVkIiwgInNpemUiOiAibm9ybWFsIiwgImljb25OYW1lIjogInRyYXNoIiwgImljb25Db2xvciI6ICJ3aGl0ZSJ9XX19XV0sICJmaWx0ZXJzIjogW3siZmlsdGVyIjogInRhYmxlIiwgImZpbHRlck5hbWUiOiAia2V5d29yZCIsICJ0eXBlIjogImtleXdvcmQiLCAidmFsdWUiOiAiIiwgImtleXMiOiBbIm5hbWUiXSwgImZpZWxkIjogeyJpZCI6ICJzZXJ2aWNlcy1rZXl3b3JkIiwgInZhbHVlIjogIiIsICJ0eXBlIjogInRleHQiLCAibmFtZSI6ICJzZXJ2aWNlcy1rZXl3b3JkIiwgImxhYmVsIjogInNlcnZpY2VzX3NlYXJjaCIsICJwbGFjZWhvbGRlciI6ICJpbnBfa2V5d29yZCIsICJpc0NsaXBib2FyZCI6IGZhbHNlLCAicG9wb3ZlcnMiOiBbeyJ0ZXh0IjogInNlcnZpY2VzX3NlYXJjaF9kZXNjIiwgImljb25OYW1lIjogImluZm8ifV0sICJjb2x1bW5zIjogeyJwYyI6IDMsICJ0YWJsZXQiOiA0LCAibW9iaWxlIjogMTJ9fX0sIHsiZmlsdGVyIjogInRhYmxlIiwgImZpbHRlck5hbWUiOiAibWV0aG9kIiwgInR5cGUiOiAic2VsZWN0IiwgInZhbHVlIjogImFsbCIsICJrZXlzIjogWyJtZXRob2QiXSwgImZpZWxkIjogeyJpZCI6ICJzZXJ2aWNlcy1tZXRob2RzIiwgInZhbHVlIjogImFsbCIsICJ2YWx1ZXMiOiBbInNjaGVkdWxlciJdLCAibmFtZSI6ICJzZXJ2aWNlcy1tZXRob2RzIiwgIm9ubHlEb3duIjogdHJ1ZSwgImxhYmVsIjogInNlcnZpY2VzX21ldGhvZHMiLCAicG9wb3ZlcnMiOiBbeyJ0ZXh0IjogInNlcnZpY2VzX21ldGhvZHNfZGVzYyIsICJpY29uTmFtZSI6ICJpbmZvIn1dLCAiY29sdW1ucyI6IHsicGMiOiAzLCAidGFibGV0IjogNCwgIm1vYmlsZSI6IDEyfX19LCB7ImZpbHRlciI6ICJ0YWJsZSIsICJmaWx0ZXJOYW1lIjogImRyYWZ0IiwgInR5cGUiOiAic2VsZWN0IiwgInZhbHVlIjogImFsbCIsICJrZXlzIjogWyJkcmFmdCJdLCAiZmllbGQiOiB7ImlkIjogInNlcnZpY2VzLWRyYWZ0IiwgInZhbHVlIjogImFsbCIsICJ2YWx1ZXMiOiBbImFsbCIsICJvbmxpbmUiLCAiZHJhZnQiXSwgIm5hbWUiOiAic2VydmljZXMtZHJhZnQiLCAib25seURvd24iOiB0cnVlLCAibGFiZWwiOiAic2VydmljZXNfZHJhZnQiLCAicG9wb3ZlcnMiOiBbeyJ0ZXh0IjogInNlcnZpY2VzX2RyYWZ0X2Rlc2MiLCAiaWNvbk5hbWUiOiAiaW5mbyJ9XSwgImNvbHVtbnMiOiB7InBjIjogMywgInRhYmxldCI6IDQsICJtb2JpbGUiOiAxMn19fV19fV19XQ"
></div>
<div id="app"></div>
<script type="module" src="services.js"></script>

View file

@ -1,7 +1,7 @@
import { createApp } from "vue";
import { createPinia } from "pinia";
import { getI18n } from "@utils/lang.js";
import Services from "./services.vue";
import Services from "./Services.vue";
const pinia = createPinia();

View file

@ -179,7 +179,6 @@ body {
@apply font-bold text-red-500 absolute;
}
.input-error-dropdown-msg {
@apply text-red-500 text-sm mb-0 font-semibold leading-normal tracking-normal;
}
@ -305,7 +304,7 @@ body {
}
.open.select-dropdown-container,
.open.list-dropdown-container{
.open.list-dropdown-container {
animation: dropOpen 0.1s linear;
}
@ -540,7 +539,6 @@ body {
@apply mt-4 rounded border border-gray-500/50 dark:border-gray-500 p-4 sm:gap-x-8 gap-y-8 col-span-12 grid grid-cols-12 w-full relative bg-gray-200/50 dark:bg-gray-900/10;
}
/* MESSAGE */
.msg-container {
@apply col-span-12 w-full;
@ -1131,7 +1129,6 @@ body {
/* BTN GROUP */
.button-group-content {
@apply flex justify-center items-center mx-4;
}
@ -1148,6 +1145,10 @@ body {
@apply flex justify-center items-center mt-4 mx-4;
}
.button-group-table {
@apply col-span-12 flex justify-start items-center mx-0;
}
/* LIST COMPONENT */
.list-pairs-container {
@ -1368,38 +1369,6 @@ body {
@apply flex justify-center items-end leading-none tracking-wide dark:brightness-90 inline-block font-bold text-center text-white uppercase align-middle transition-all rounded-lg cursor-pointer leading-normal ease-in shadow-xs hover:-translate-y-px active:opacity-85 hover:shadow-md disabled:cursor-not-allowed dark:disabled:text-gray-300 disabled:text-gray-700 disabled:bg-gray-400 disabled:border-gray-400/0 dark:disabled:bg-gray-700 dark:disabled:border-gray-700/0 disabled:hover:translate-y-0 disabled:hover:bg-gray-400 disabled:hover:border-gray-400/0 dark:disabled:hover:translate-y-0 dark:disabled:hover:bg-gray-700 dark:disabled:hover:border-gray-700/0;
}
.btn.close:not([disabled]) {
@apply bg-white text-red-500 border border-red-500 hover:border-red-500/80 focus:border-red-500/80 hover:text-red-500/80 focus:text-red-500/80;
}
.btn.delete:not([disabled]),
.btn.error:not([disabled]) {
@apply bg-red-500 hover:bg-red-500/80 focus:bg-red-500/80;
}
.btn.valid:not([disabled]),
.btn.success:not([disabled]) {
@apply bg-green-500 hover:bg-green-500/80 focus:bg-green-500/80;
}
.btn.edit:not([disabled]),
.btn.warning:not([disabled]) {
@apply bg-yellow-500 hover:bg-yellow-500/80 focus:bg-yellow-500/80;
}
.btn.info:not([disabled]),
.btn.load:not([disabled]) {
@apply bg-sky-500 hover:bg-sky-500/80 focus:bg-sky-500/80;
}
.btn.primary:not([disabled]) {
@apply bg-primary hover:bg-primary/80 focus:bg-primary/80;
}
.btn.secondary:not([disabled]) {
@apply bg-secondary hover:bg-secondary/80 focus:bg-secondary/80;
}
.btn.xl {
@apply px-6 py-3;
}
@ -1909,6 +1878,158 @@ body {
@apply text-lime-600;
}
/* BUTTON BACKGROUND COLOR MODIFIER */
.btn.close:not([disabled]) {
@apply bg-white text-red-500 border border-red-500 hover:border-red-500/80 focus:border-red-500/80 hover:text-red-500/80 focus:text-red-500/80;
}
.btn.delete:not([disabled]),
.btn.error:not([disabled]),
.btn.red:not([disabled]) {
@apply bg-red-500 hover:bg-red-500/80 focus:bg-red-500/80;
}
.btn.valid:not([disabled]),
.btn.success:not([disabled]),
.btn.green:not([disabled]) {
@apply bg-green-500 hover:bg-green-500/80 focus:bg-green-500/80;
}
.btn.edit:not([disabled]),
.btn.warning:not([disabled]),
.btn.yellow:not([disabled]) {
@apply bg-yellow-500 hover:bg-yellow-500/80 focus:bg-yellow-500/80;
}
.btn.info:not([disabled]),
.btn.load:not([disabled]) {
@apply bg-sky-500 hover:bg-sky-500/80 focus:bg-sky-500/80;
}
.btn.primary:not([disabled]) {
@apply bg-primary hover:bg-primary/80 focus:bg-primary/80;
}
.btn.secondary:not([disabled]) {
@apply bg-secondary hover:bg-secondary/80 focus:bg-secondary/80;
}
.btn.purple:not([disabled]) {
@apply bg-purple-500 hover:bg-purple-500/80 focus:bg-purple-500/80;
}
.btn.orange:not([disabled]) {
@apply bg-orange-500 hover:bg-orange-500/80 focus:bg-orange-500/80;
}
.btn.blue:not([disabled]) {
@apply bg-blue-500 hover:bg-blue-500/80 focus:bg-blue-500/80;
}
.btn.gray:not([disabled]) {
@apply bg-gray-500 hover:bg-gray-500/80 focus:bg-gray-500/80;
}
.btn.dark:not([disabled]) {
@apply bg-slate-500 hover:bg-gray-500/80 focus:bg-gray-500/80;
}
.btn.amber:not([disabled]) {
@apply bg-amber-500 hover:bg-amber-500/80 focus:bg-amber-500/80;
}
.btn.emerald:not([disabled]) {
@apply bg-emerald-500 hover:bg-emerald-500/80 focus:bg-emerald-500/80;
}
.btn.teal:not([disabled]) {
@apply bg-teal-500 hover:bg-teal-500/80 focus:bg-teal-500/80;
}
.btn.indigo:not([disabled]) {
@apply bg-indigo-500 hover:bg-indigo-500/80 focus:bg-indigo-500/80;
}
.btn.cyan:not([disabled]) {
@apply bg-cyan-500 hover:bg-cyan-500/80 focus:bg-cyan-500/80;
}
.btn.sky:not([disabled]) {
@apply bg-sky-500 hover:bg-sky-500/80 focus:bg-sky-500/80;
}
.btn.pink:not([disabled]) {
@apply bg-pink-500 hover:bg-pink-500/80 focus:bg-pink-500/80;
}
.btn.lime:not([disabled]) {
@apply bg-lime-500 hover:bg-lime-500/80 focus:bg-lime-500/80;
}
.btn.purple-darker:not([disabled]) {
@apply bg-purple-600 hover:bg-purple-600/80 focus:bg-purple-600/80;
}
.btn.green-darker:not([disabled]) {
@apply bg-green-700 hover:bg-green-700/80 focus:bg-green-700/80;
}
.btn.red-darker:not([disabled]) {
@apply bg-red-700 hover:bg-red-700/80 focus:bg-red-700/80;
}
.btn.orange-darker:not([disabled]) {
@apply bg-orange-600 hover:bg-orange-600/80 focus:bg-orange-600/80;
}
.btn.blue-darker:not([disabled]) {
@apply bg-blue-600 hover:bg-blue-600/80 focus:bg-blue-600/80 dark:bg-blue-500 dark:hover:bg-blue-500/80 dark:focus:bg-blue-500/80;
}
.btn.yellow-darker:not([disabled]) {
@apply bg-yellow-600 hover:bg-yellow-600/80 focus:bg-yellow-600/80;
}
.btn.gray-darker:not([disabled]) {
@apply bg-gray-600 hover:bg-gray-600/80 focus:bg-gray-600/80;
}
.btn.dark-darker:not([disabled]) {
@apply bg-slate-600 hover:bg-slate-600/80 focus:bg-slate-600/80 dark:bg-slate-500 dark:hover:bg-slate-500/80 dark:focus:bg-slate-500/80;
}
.btn.amber-darker:not([disabled]) {
@apply bg-amber-600 hover:bg-amber-600/80 focus:bg-amber-600/80;
}
.btn.emerald-darker:not([disabled]) {
@apply bg-emerald-600 hover:bg-emerald-600/80 focus:bg-emerald-600/80;
}
.btn.teal-darker:not([disabled]) {
@apply bg-teal-600 hover:bg-teal-600/80 focus:bg-teal-600/80;
}
.btn.indigo-darker:not([disabled]) {
@apply bg-indigo-600 hover:bg-indigo-600/80 focus:bg-indigo-600/80;
}
.btn.cyan-darker:not([disabled]) {
@apply bg-cyan-600 hover:bg-cyan-600/80 focus:bg-cyan-600/80;
}
.btn.sky-darker:not([disabled]) {
@apply bg-sky-700 hover:bg-sky-700/80 focus:bg-sky-700/80;
}
.btn.pink-darker:not([disabled]) {
@apply bg-pink-600 hover:bg-pink-600/80 focus:bg-pink-600/80;
}
.btn.lime-darker:not([disabled]) {
@apply bg-lime-600 hover:bg-lime-600/80 focus:bg-lime-600/80;
}
/* BACKGROUND COLOR MODIFIER */
.bg-el {

File diff suppressed because one or more lines are too long

View file

@ -3,8 +3,8 @@ const plugin = require("tailwindcss/plugin");
/** @type {import('tailwindcss').Config} */
export default {
content: [
"./src/pages/**/*.{js,vue,ts,jsx,tsx,mdx, html}",
"./src/components/**/*.{js,vue,ts,jsx,tsx,mdx}",
"./dashboard/pages/**/*.{js,vue,ts,jsx,tsx,mdx, html}",
"./dashboard/components/**/*.{js,vue,ts,jsx,tsx,mdx}",
"../setup/src/*.{js,vue,ts,jsx,tsx,mdx}",
],
safelist: [

View file

@ -17,22 +17,16 @@
"type": "Table",
"data": {
"title": "services_table_title",
"minWidth": "lg",
"minWidth": "md",
"header": [
"services_table_name",
"services_table_method",
"services_table_settings",
"services_table_manage",
"services_table_is_draft",
"services_table_delete"
"services_table_actions"
],
"positions": [
2,
2,
2,
2,
2,
2
4,
4,
4
],
"items": [
[
@ -51,58 +45,57 @@
}
},
{
"type": "Button",
"type": "ButtonGroup",
"data": {
"id": "open-modal-settings-0",
"text": "settings",
"hideText": false,
" color": "info",
"size": "normal",
"iconName": "settings"
}
},
{
"type": "Button",
"data": {
"attrs": {
"data-server-name": "app1.example.com"
},
"id": "open-modal-manage-0",
"text": "manage",
"hideText": false,
" color": "green",
"size": "normal",
"iconName": "manage"
}
},
{
"type": "Button",
"data": {
"attrs": {
"data-server-name": "app1.example.com",
"data-is-draft": "no"
},
"id": "open-modal-draft-0",
"text": "online",
"hideText": false,
" color": "cyan",
"size": "normal",
"iconName": "online"
}
},
{
"type": "Button",
"data": {
"attrs": {
"data-server-name": "app1.example.com"
},
"id": "open-modal-delete-0",
"text": "delete",
"disabled": true,
"hideText": false,
" color": "red",
"size": "normal",
"iconName": "trash"
"buttons": [
{
"id": "open-modal-settings-0",
"text": "settings",
"hideText": true,
"color": "info",
"size": "normal",
"iconName": "settings",
"iconColor": "white"
},
{
"attrs": {
"data-server-name": "app1.example.com"
},
"id": "open-modal-manage-0",
"text": "manage",
"hideText": true,
"color": "success",
"size": "normal",
"iconName": "gear",
"iconColor": "white"
},
{
"attrs": {
"data-server-name": "app1.example.com",
"data-is-draft": "no"
},
"id": "open-modal-draft-0",
"text": "online",
"hideText": true,
"color": "cyan",
"size": "normal",
"iconName": "globe",
"iconColor": "white"
},
{
"attrs": {
"data-server-name": "app1.example.com"
},
"id": "open-modal-delete-0",
"text": "delete",
"disabled": true,
"hideText": true,
"color": "red",
"size": "normal",
"iconName": "trash",
"iconColor": "white"
}
]
}
}
],
@ -122,58 +115,57 @@
}
},
{
"type": "Button",
"type": "ButtonGroup",
"data": {
"id": "open-modal-settings-1",
"text": "settings",
"hideText": false,
" color": "info",
"size": "normal",
"iconName": "settings"
}
},
{
"type": "Button",
"data": {
"attrs": {
"data-server-name": "www.example.com"
},
"id": "open-modal-manage-1",
"text": "manage",
"hideText": false,
" color": "green",
"size": "normal",
"iconName": "manage"
}
},
{
"type": "Button",
"data": {
"attrs": {
"data-server-name": "www.example.com",
"data-is-draft": "no"
},
"id": "open-modal-draft-1",
"text": "online",
"hideText": false,
" color": "cyan",
"size": "normal",
"iconName": "online"
}
},
{
"type": "Button",
"data": {
"attrs": {
"data-server-name": "www.example.com"
},
"id": "open-modal-delete-1",
"text": "delete",
"disabled": true,
"hideText": false,
" color": "red",
"size": "normal",
"iconName": "trash"
"buttons": [
{
"id": "open-modal-settings-1",
"text": "settings",
"hideText": true,
"color": "info",
"size": "normal",
"iconName": "settings",
"iconColor": "white"
},
{
"attrs": {
"data-server-name": "www.example.com"
},
"id": "open-modal-manage-1",
"text": "manage",
"hideText": true,
"color": "success",
"size": "normal",
"iconName": "gear",
"iconColor": "white"
},
{
"attrs": {
"data-server-name": "www.example.com",
"data-is-draft": "no"
},
"id": "open-modal-draft-1",
"text": "online",
"hideText": true,
"color": "cyan",
"size": "normal",
"iconName": "globe",
"iconColor": "white"
},
{
"attrs": {
"data-server-name": "www.example.com"
},
"id": "open-modal-delete-1",
"text": "delete",
"disabled": true,
"hideText": true,
"color": "red",
"size": "normal",
"iconName": "trash",
"iconColor": "white"
}
]
}
}
]

View file

@ -68,57 +68,50 @@ def get_services_list(services):
item.append({"method": server_method, "type": "Text", "data": {"text": server_method}})
item.append(
{
"type": "Button",
"type": "ButtonGroup",
"data": {
"id": f"open-modal-settings-{index}",
"text": "settings",
"hideText": False,
" color": "info",
"size": "normal",
"iconName": "settings",
},
}
)
item.append(
{
"type": "Button",
"data": {
"attrs": {"data-server-name": server_name},
"id": f"open-modal-manage-{index}",
"text": "manage",
"hideText": False,
" color": "green",
"size": "normal",
"iconName": "manage",
},
}
)
item.append(
{
"type": "Button",
"data": {
"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": False,
" color": "cyan",
"size": "normal",
"iconName": "draft" if is_draft else "online",
},
}
)
item.append(
{
"type": "Button",
"data": {
"attrs": {"data-server-name": server_name},
"id": f"open-modal-delete-{index}",
"text": "delete",
"disabled": not is_deletable,
"hideText": False,
" color": "red",
"size": "normal",
"iconName": "trash",
"buttons": [
{
"id": f"open-modal-settings-{index}",
"text": "settings",
"hideText": True,
"color": "info",
"size": "normal",
"iconName": "settings",
"iconColor": "white",
},
{
"attrs": {"data-server-name": server_name},
"id": f"open-modal-manage-{index}",
"text": "manage",
"hideText": True,
"color": "success",
"size": "normal",
"iconName": "gear",
"iconColor": "white",
},
{
"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": "cyan",
"size": "normal",
"iconName": "pen" if is_draft else "globe",
"iconColor": "white",
},
{
"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",
},
]
},
}
)
@ -141,14 +134,11 @@ def services_builder(services):
"widgets": [
title_widget("services_title"),
table_widget(
positions=[2, 2, 2, 2, 2, 2],
positions=[4, 4, 4],
header=[
"services_table_name",
"services_table_method",
"services_table_settings",
"services_table_manage",
"services_table_is_draft",
"services_table_delete",
"services_table_actions",
],
items=services_list,
filters=[
@ -220,7 +210,7 @@ def services_builder(services):
},
},
],
minWidth="lg",
minWidth="md",
title="services_table_title",
),
],

View file

@ -1 +1 @@
W3sidHlwZSI6ICJjYXJkIiwgImNvbnRhaW5lckNvbHVtbnMiOiB7InBjIjogMTIsICJ0YWJsZXQiOiAxMiwgIm1vYmlsZSI6IDEyfSwgIndpZGdldHMiOiBbeyJ0eXBlIjogIlRpdGxlIiwgImRhdGEiOiB7InRpdGxlIjogInNlcnZpY2VzX3RpdGxlIn19LCB7InR5cGUiOiAiVGFibGUiLCAiZGF0YSI6IHsidGl0bGUiOiAic2VydmljZXNfdGFibGVfdGl0bGUiLCAibWluV2lkdGgiOiAibGciLCAiaGVhZGVyIjogWyJzZXJ2aWNlc190YWJsZV9uYW1lIiwgInNlcnZpY2VzX3RhYmxlX21ldGhvZCIsICJzZXJ2aWNlc190YWJsZV9zZXR0aW5ncyIsICJzZXJ2aWNlc190YWJsZV9tYW5hZ2UiLCAic2VydmljZXNfdGFibGVfaXNfZHJhZnQiLCAic2VydmljZXNfdGFibGVfZGVsZXRlIl0sICJwb3NpdGlvbnMiOiBbMiwgMiwgMiwgMiwgMiwgMl0sICJpdGVtcyI6IFtbeyJuYW1lIjogImFwcDEuZXhhbXBsZS5jb20iLCAidHlwZSI6ICJUZXh0IiwgImRhdGEiOiB7InRleHQiOiAiYXBwMS5leGFtcGxlLmNvbSJ9fSwgeyJtZXRob2QiOiAic2NoZWR1bGVyIiwgInR5cGUiOiAiVGV4dCIsICJkYXRhIjogeyJ0ZXh0IjogInNjaGVkdWxlciJ9fSwgeyJ0eXBlIjogIkJ1dHRvbiIsICJkYXRhIjogeyJpZCI6ICJvcGVuLW1vZGFsLXNldHRpbmdzLTAiLCAidGV4dCI6ICJzZXR0aW5ncyIsICJoaWRlVGV4dCI6IGZhbHNlLCAiIGNvbG9yIjogImluZm8iLCAic2l6ZSI6ICJub3JtYWwiLCAiaWNvbk5hbWUiOiAic2V0dGluZ3MifX0sIHsidHlwZSI6ICJCdXR0b24iLCAiZGF0YSI6IHsiYXR0cnMiOiB7ImRhdGEtc2VydmVyLW5hbWUiOiAiYXBwMS5leGFtcGxlLmNvbSJ9LCAiaWQiOiAib3Blbi1tb2RhbC1tYW5hZ2UtMCIsICJ0ZXh0IjogIm1hbmFnZSIsICJoaWRlVGV4dCI6IGZhbHNlLCAiIGNvbG9yIjogImdyZWVuIiwgInNpemUiOiAibm9ybWFsIiwgImljb25OYW1lIjogIm1hbmFnZSJ9fSwgeyJ0eXBlIjogIkJ1dHRvbiIsICJkYXRhIjogeyJhdHRycyI6IHsiZGF0YS1zZXJ2ZXItbmFtZSI6ICJhcHAxLmV4YW1wbGUuY29tIiwgImRhdGEtaXMtZHJhZnQiOiAibm8ifSwgImlkIjogIm9wZW4tbW9kYWwtZHJhZnQtMCIsICJ0ZXh0IjogIm9ubGluZSIsICJoaWRlVGV4dCI6IGZhbHNlLCAiIGNvbG9yIjogImN5YW4iLCAic2l6ZSI6ICJub3JtYWwiLCAiaWNvbk5hbWUiOiAib25saW5lIn19LCB7InR5cGUiOiAiQnV0dG9uIiwgImRhdGEiOiB7ImF0dHJzIjogeyJkYXRhLXNlcnZlci1uYW1lIjogImFwcDEuZXhhbXBsZS5jb20ifSwgImlkIjogIm9wZW4tbW9kYWwtZGVsZXRlLTAiLCAidGV4dCI6ICJkZWxldGUiLCAiZGlzYWJsZWQiOiB0cnVlLCAiaGlkZVRleHQiOiBmYWxzZSwgIiBjb2xvciI6ICJyZWQiLCAic2l6ZSI6ICJub3JtYWwiLCAiaWNvbk5hbWUiOiAidHJhc2gifX1dLCBbeyJuYW1lIjogInd3dy5leGFtcGxlLmNvbSIsICJ0eXBlIjogIlRleHQiLCAiZGF0YSI6IHsidGV4dCI6ICJ3d3cuZXhhbXBsZS5jb20ifX0sIHsibWV0aG9kIjogInNjaGVkdWxlciIsICJ0eXBlIjogIlRleHQiLCAiZGF0YSI6IHsidGV4dCI6ICJzY2hlZHVsZXIifX0sIHsidHlwZSI6ICJCdXR0b24iLCAiZGF0YSI6IHsiaWQiOiAib3Blbi1tb2RhbC1zZXR0aW5ncy0xIiwgInRleHQiOiAic2V0dGluZ3MiLCAiaGlkZVRleHQiOiBmYWxzZSwgIiBjb2xvciI6ICJpbmZvIiwgInNpemUiOiAibm9ybWFsIiwgImljb25OYW1lIjogInNldHRpbmdzIn19LCB7InR5cGUiOiAiQnV0dG9uIiwgImRhdGEiOiB7ImF0dHJzIjogeyJkYXRhLXNlcnZlci1uYW1lIjogInd3dy5leGFtcGxlLmNvbSJ9LCAiaWQiOiAib3Blbi1tb2RhbC1tYW5hZ2UtMSIsICJ0ZXh0IjogIm1hbmFnZSIsICJoaWRlVGV4dCI6IGZhbHNlLCAiIGNvbG9yIjogImdyZWVuIiwgInNpemUiOiAibm9ybWFsIiwgImljb25OYW1lIjogIm1hbmFnZSJ9fSwgeyJ0eXBlIjogIkJ1dHRvbiIsICJkYXRhIjogeyJhdHRycyI6IHsiZGF0YS1zZXJ2ZXItbmFtZSI6ICJ3d3cuZXhhbXBsZS5jb20iLCAiZGF0YS1pcy1kcmFmdCI6ICJubyJ9LCAiaWQiOiAib3Blbi1tb2RhbC1kcmFmdC0xIiwgInRleHQiOiAib25saW5lIiwgImhpZGVUZXh0IjogZmFsc2UsICIgY29sb3IiOiAiY3lhbiIsICJzaXplIjogIm5vcm1hbCIsICJpY29uTmFtZSI6ICJvbmxpbmUifX0sIHsidHlwZSI6ICJCdXR0b24iLCAiZGF0YSI6IHsiYXR0cnMiOiB7ImRhdGEtc2VydmVyLW5hbWUiOiAid3d3LmV4YW1wbGUuY29tIn0sICJpZCI6ICJvcGVuLW1vZGFsLWRlbGV0ZS0xIiwgInRleHQiOiAiZGVsZXRlIiwgImRpc2FibGVkIjogdHJ1ZSwgImhpZGVUZXh0IjogZmFsc2UsICIgY29sb3IiOiAicmVkIiwgInNpemUiOiAibm9ybWFsIiwgImljb25OYW1lIjogInRyYXNoIn19XV0sICJmaWx0ZXJzIjogW3siZmlsdGVyIjogInRhYmxlIiwgImZpbHRlck5hbWUiOiAia2V5d29yZCIsICJ0eXBlIjogImtleXdvcmQiLCAidmFsdWUiOiAiIiwgImtleXMiOiBbIm5hbWUiXSwgImZpZWxkIjogeyJpZCI6ICJzZXJ2aWNlcy1rZXl3b3JkIiwgInZhbHVlIjogIiIsICJ0eXBlIjogInRleHQiLCAibmFtZSI6ICJzZXJ2aWNlcy1rZXl3b3JkIiwgImxhYmVsIjogInNlcnZpY2VzX3NlYXJjaCIsICJwbGFjZWhvbGRlciI6ICJpbnBfa2V5d29yZCIsICJpc0NsaXBib2FyZCI6IGZhbHNlLCAicG9wb3ZlcnMiOiBbeyJ0ZXh0IjogInNlcnZpY2VzX3NlYXJjaF9kZXNjIiwgImljb25OYW1lIjogImluZm8ifV0sICJjb2x1bW5zIjogeyJwYyI6IDMsICJ0YWJsZXQiOiA0LCAibW9iaWxlIjogMTJ9fX0sIHsiZmlsdGVyIjogInRhYmxlIiwgImZpbHRlck5hbWUiOiAibWV0aG9kIiwgInR5cGUiOiAic2VsZWN0IiwgInZhbHVlIjogImFsbCIsICJrZXlzIjogWyJtZXRob2QiXSwgImZpZWxkIjogeyJpZCI6ICJzZXJ2aWNlcy1tZXRob2RzIiwgInZhbHVlIjogImFsbCIsICJ2YWx1ZXMiOiBbInNjaGVkdWxlciJdLCAibmFtZSI6ICJzZXJ2aWNlcy1tZXRob2RzIiwgIm9ubHlEb3duIjogdHJ1ZSwgImxhYmVsIjogInNlcnZpY2VzX21ldGhvZHMiLCAicG9wb3ZlcnMiOiBbeyJ0ZXh0IjogInNlcnZpY2VzX21ldGhvZHNfZGVzYyIsICJpY29uTmFtZSI6ICJpbmZvIn1dLCAiY29sdW1ucyI6IHsicGMiOiAzLCAidGFibGV0IjogNCwgIm1vYmlsZSI6IDEyfX19LCB7ImZpbHRlciI6ICJ0YWJsZSIsICJmaWx0ZXJOYW1lIjogImRyYWZ0IiwgInR5cGUiOiAic2VsZWN0IiwgInZhbHVlIjogImFsbCIsICJrZXlzIjogWyJkcmFmdCJdLCAiZmllbGQiOiB7ImlkIjogInNlcnZpY2VzLWRyYWZ0IiwgInZhbHVlIjogImFsbCIsICJ2YWx1ZXMiOiBbImFsbCIsICJvbmxpbmUiLCAiZHJhZnQiXSwgIm5hbWUiOiAic2VydmljZXMtZHJhZnQiLCAib25seURvd24iOiB0cnVlLCAibGFiZWwiOiAic2VydmljZXNfZHJhZnQiLCAicG9wb3ZlcnMiOiBbeyJ0ZXh0IjogInNlcnZpY2VzX2RyYWZ0X2Rlc2MiLCAiaWNvbk5hbWUiOiAiaW5mbyJ9XSwgImNvbHVtbnMiOiB7InBjIjogMywgInRhYmxldCI6IDQsICJtb2JpbGUiOiAxMn19fV19fV19XQ==
W3sidHlwZSI6ICJjYXJkIiwgImNvbnRhaW5lckNvbHVtbnMiOiB7InBjIjogMTIsICJ0YWJsZXQiOiAxMiwgIm1vYmlsZSI6IDEyfSwgIndpZGdldHMiOiBbeyJ0eXBlIjogIlRpdGxlIiwgImRhdGEiOiB7InRpdGxlIjogInNlcnZpY2VzX3RpdGxlIn19LCB7InR5cGUiOiAiVGFibGUiLCAiZGF0YSI6IHsidGl0bGUiOiAic2VydmljZXNfdGFibGVfdGl0bGUiLCAibWluV2lkdGgiOiAibWQiLCAiaGVhZGVyIjogWyJzZXJ2aWNlc190YWJsZV9uYW1lIiwgInNlcnZpY2VzX3RhYmxlX21ldGhvZCIsICJzZXJ2aWNlc190YWJsZV9hY3Rpb25zIl0sICJwb3NpdGlvbnMiOiBbNCwgNCwgNF0sICJpdGVtcyI6IFtbeyJuYW1lIjogImFwcDEuZXhhbXBsZS5jb20iLCAidHlwZSI6ICJUZXh0IiwgImRhdGEiOiB7InRleHQiOiAiYXBwMS5leGFtcGxlLmNvbSJ9fSwgeyJtZXRob2QiOiAic2NoZWR1bGVyIiwgInR5cGUiOiAiVGV4dCIsICJkYXRhIjogeyJ0ZXh0IjogInNjaGVkdWxlciJ9fSwgeyJ0eXBlIjogIkJ1dHRvbkdyb3VwIiwgImRhdGEiOiB7ImJ1dHRvbnMiOiBbeyJpZCI6ICJvcGVuLW1vZGFsLXNldHRpbmdzLTAiLCAidGV4dCI6ICJzZXR0aW5ncyIsICJoaWRlVGV4dCI6IHRydWUsICJjb2xvciI6ICJpbmZvIiwgInNpemUiOiAibm9ybWFsIiwgImljb25OYW1lIjogInNldHRpbmdzIiwgImljb25Db2xvciI6ICJ3aGl0ZSJ9LCB7ImF0dHJzIjogeyJkYXRhLXNlcnZlci1uYW1lIjogImFwcDEuZXhhbXBsZS5jb20ifSwgImlkIjogIm9wZW4tbW9kYWwtbWFuYWdlLTAiLCAidGV4dCI6ICJtYW5hZ2UiLCAiaGlkZVRleHQiOiB0cnVlLCAiY29sb3IiOiAic3VjY2VzcyIsICJzaXplIjogIm5vcm1hbCIsICJpY29uTmFtZSI6ICJnZWFyIiwgImljb25Db2xvciI6ICJ3aGl0ZSJ9LCB7ImF0dHJzIjogeyJkYXRhLXNlcnZlci1uYW1lIjogImFwcDEuZXhhbXBsZS5jb20iLCAiZGF0YS1pcy1kcmFmdCI6ICJubyJ9LCAiaWQiOiAib3Blbi1tb2RhbC1kcmFmdC0wIiwgInRleHQiOiAib25saW5lIiwgImhpZGVUZXh0IjogdHJ1ZSwgImNvbG9yIjogImN5YW4iLCAic2l6ZSI6ICJub3JtYWwiLCAiaWNvbk5hbWUiOiAiZ2xvYmUiLCAiaWNvbkNvbG9yIjogIndoaXRlIn0sIHsiYXR0cnMiOiB7ImRhdGEtc2VydmVyLW5hbWUiOiAiYXBwMS5leGFtcGxlLmNvbSJ9LCAiaWQiOiAib3Blbi1tb2RhbC1kZWxldGUtMCIsICJ0ZXh0IjogImRlbGV0ZSIsICJkaXNhYmxlZCI6IHRydWUsICJoaWRlVGV4dCI6IHRydWUsICJjb2xvciI6ICJyZWQiLCAic2l6ZSI6ICJub3JtYWwiLCAiaWNvbk5hbWUiOiAidHJhc2giLCAiaWNvbkNvbG9yIjogIndoaXRlIn1dfX1dLCBbeyJuYW1lIjogInd3dy5leGFtcGxlLmNvbSIsICJ0eXBlIjogIlRleHQiLCAiZGF0YSI6IHsidGV4dCI6ICJ3d3cuZXhhbXBsZS5jb20ifX0sIHsibWV0aG9kIjogInNjaGVkdWxlciIsICJ0eXBlIjogIlRleHQiLCAiZGF0YSI6IHsidGV4dCI6ICJzY2hlZHVsZXIifX0sIHsidHlwZSI6ICJCdXR0b25Hcm91cCIsICJkYXRhIjogeyJidXR0b25zIjogW3siaWQiOiAib3Blbi1tb2RhbC1zZXR0aW5ncy0xIiwgInRleHQiOiAic2V0dGluZ3MiLCAiaGlkZVRleHQiOiB0cnVlLCAiY29sb3IiOiAiaW5mbyIsICJzaXplIjogIm5vcm1hbCIsICJpY29uTmFtZSI6ICJzZXR0aW5ncyIsICJpY29uQ29sb3IiOiAid2hpdGUifSwgeyJhdHRycyI6IHsiZGF0YS1zZXJ2ZXItbmFtZSI6ICJ3d3cuZXhhbXBsZS5jb20ifSwgImlkIjogIm9wZW4tbW9kYWwtbWFuYWdlLTEiLCAidGV4dCI6ICJtYW5hZ2UiLCAiaGlkZVRleHQiOiB0cnVlLCAiY29sb3IiOiAic3VjY2VzcyIsICJzaXplIjogIm5vcm1hbCIsICJpY29uTmFtZSI6ICJnZWFyIiwgImljb25Db2xvciI6ICJ3aGl0ZSJ9LCB7ImF0dHJzIjogeyJkYXRhLXNlcnZlci1uYW1lIjogInd3dy5leGFtcGxlLmNvbSIsICJkYXRhLWlzLWRyYWZ0IjogIm5vIn0sICJpZCI6ICJvcGVuLW1vZGFsLWRyYWZ0LTEiLCAidGV4dCI6ICJvbmxpbmUiLCAiaGlkZVRleHQiOiB0cnVlLCAiY29sb3IiOiAiY3lhbiIsICJzaXplIjogIm5vcm1hbCIsICJpY29uTmFtZSI6ICJnbG9iZSIsICJpY29uQ29sb3IiOiAid2hpdGUifSwgeyJhdHRycyI6IHsiZGF0YS1zZXJ2ZXItbmFtZSI6ICJ3d3cuZXhhbXBsZS5jb20ifSwgImlkIjogIm9wZW4tbW9kYWwtZGVsZXRlLTEiLCAidGV4dCI6ICJkZWxldGUiLCAiZGlzYWJsZWQiOiB0cnVlLCAiaGlkZVRleHQiOiB0cnVlLCAiY29sb3IiOiAicmVkIiwgInNpemUiOiAibm9ybWFsIiwgImljb25OYW1lIjogInRyYXNoIiwgImljb25Db2xvciI6ICJ3aGl0ZSJ9XX19XV0sICJmaWx0ZXJzIjogW3siZmlsdGVyIjogInRhYmxlIiwgImZpbHRlck5hbWUiOiAia2V5d29yZCIsICJ0eXBlIjogImtleXdvcmQiLCAidmFsdWUiOiAiIiwgImtleXMiOiBbIm5hbWUiXSwgImZpZWxkIjogeyJpZCI6ICJzZXJ2aWNlcy1rZXl3b3JkIiwgInZhbHVlIjogIiIsICJ0eXBlIjogInRleHQiLCAibmFtZSI6ICJzZXJ2aWNlcy1rZXl3b3JkIiwgImxhYmVsIjogInNlcnZpY2VzX3NlYXJjaCIsICJwbGFjZWhvbGRlciI6ICJpbnBfa2V5d29yZCIsICJpc0NsaXBib2FyZCI6IGZhbHNlLCAicG9wb3ZlcnMiOiBbeyJ0ZXh0IjogInNlcnZpY2VzX3NlYXJjaF9kZXNjIiwgImljb25OYW1lIjogImluZm8ifV0sICJjb2x1bW5zIjogeyJwYyI6IDMsICJ0YWJsZXQiOiA0LCAibW9iaWxlIjogMTJ9fX0sIHsiZmlsdGVyIjogInRhYmxlIiwgImZpbHRlck5hbWUiOiAibWV0aG9kIiwgInR5cGUiOiAic2VsZWN0IiwgInZhbHVlIjogImFsbCIsICJrZXlzIjogWyJtZXRob2QiXSwgImZpZWxkIjogeyJpZCI6ICJzZXJ2aWNlcy1tZXRob2RzIiwgInZhbHVlIjogImFsbCIsICJ2YWx1ZXMiOiBbInNjaGVkdWxlciJdLCAibmFtZSI6ICJzZXJ2aWNlcy1tZXRob2RzIiwgIm9ubHlEb3duIjogdHJ1ZSwgImxhYmVsIjogInNlcnZpY2VzX21ldGhvZHMiLCAicG9wb3ZlcnMiOiBbeyJ0ZXh0IjogInNlcnZpY2VzX21ldGhvZHNfZGVzYyIsICJpY29uTmFtZSI6ICJpbmZvIn1dLCAiY29sdW1ucyI6IHsicGMiOiAzLCAidGFibGV0IjogNCwgIm1vYmlsZSI6IDEyfX19LCB7ImZpbHRlciI6ICJ0YWJsZSIsICJmaWx0ZXJOYW1lIjogImRyYWZ0IiwgInR5cGUiOiAic2VsZWN0IiwgInZhbHVlIjogImFsbCIsICJrZXlzIjogWyJkcmFmdCJdLCAiZmllbGQiOiB7ImlkIjogInNlcnZpY2VzLWRyYWZ0IiwgInZhbHVlIjogImFsbCIsICJ2YWx1ZXMiOiBbImFsbCIsICJvbmxpbmUiLCAiZHJhZnQiXSwgIm5hbWUiOiAic2VydmljZXMtZHJhZnQiLCAib25seURvd24iOiB0cnVlLCAibGFiZWwiOiAic2VydmljZXNfZHJhZnQiLCAicG9wb3ZlcnMiOiBbeyJ0ZXh0IjogInNlcnZpY2VzX2RyYWZ0X2Rlc2MiLCAiaWNvbk5hbWUiOiAiaW5mbyJ9XSwgImNvbHVtbnMiOiB7InBjIjogMywgInRhYmxldCI6IDQsICJtb2JpbGUiOiAxMn19fV19fV19XQ==