aboutsummaryrefslogtreecommitdiff
path: root/src/site/components
diff options
context:
space:
mode:
authorPitu <[email protected]>2021-03-23 22:24:11 +0900
committerPitu <[email protected]>2021-03-23 22:24:11 +0900
commitb24c0175f5ef7ac3ac1f3689bc4f96c4d65d2a52 (patch)
tree17c711a4fd949da681a19a21e044a6d7576cb301 /src/site/components
parentchore: add screenshots to the readme (diff)
parentfix: sections not rendering (diff)
downloadhost.fuwn.me-b24c0175f5ef7ac3ac1f3689bc4f96c4d65d2a52.tar.xz
host.fuwn.me-b24c0175f5ef7ac3ac1f3689bc4f96c4d65d2a52.zip
Merge branch 'feature/database_based_settings' of https://github.com/Zephyrrus/huskysafe into Zephyrrus-feature/database_based_settings
Diffstat (limited to 'src/site/components')
-rw-r--r--src/site/components/settings/JoiObject.vue142
1 files changed, 142 insertions, 0 deletions
diff --git a/src/site/components/settings/JoiObject.vue b/src/site/components/settings/JoiObject.vue
new file mode 100644
index 0000000..af5b4eb
--- /dev/null
+++ b/src/site/components/settings/JoiObject.vue
@@ -0,0 +1,142 @@
+<template>
+ <div v-if="keys">
+ <div v-for="[key, field] in Object.entries(keys)" :key="key">
+ <b-field
+ :label="field.flags.label"
+ :message="field.flags.description"
+ class="field"
+ horizontal>
+ <b-input
+ v-if="getDisplayType(field) === 'string'"
+ v-model="settings.serviceName"
+ class="chibisafe-input"
+ expanded />
+ <b-input
+ v-else-if="getDisplayType(field) === 'number'"
+ v-model="settings.serviceName"
+ type="number"
+ class="chibisafe-input"
+ :min="getMin(field)"
+ :max="getMax(field)"
+ expanded />
+ <b-switch
+ v-else-if="getDisplayType(field) === 'boolean'"
+ v-model="settings.publicMode"
+ :rounded="false"
+ :true-value="true"
+ :false-value="false" />
+ <!-- TODO: If array and has allowed items, limit input to those items only -->
+ <b-taginput
+ v-else-if="getDisplayType(field) === 'array' || getDisplayType(field) === 'tagInput'"
+ v-model="settings.arr"
+ ellipsis
+ icon="label"
+ :placeholder="field.flags.label"
+ aria-close-label="Delete this tag"
+ class="taginp" />
+ <div v-else-if="getDisplayType(field) === 'checkbox'">
+ <b-checkbox v-for="item in getAllowedItems(field)" :key="item"
+ v-model="settings.ech"
+ :native-value="item">
+ {{ item }}
+ </b-checkbox>
+ </div>
+ </b-field>
+ <!--
+ TODO: Add asterisk to required fields
+ TODO: Implement showing errors returned by backend/joi
+ -->
+ </div>
+ </div>
+</template>
+
+
+<script>
+export default {
+ name: 'JoiObject',
+ props: {
+ keys: {
+ type: Object,
+ required: true
+ },
+ values: {
+ type: Object,
+ required: true
+ },
+ errors: {
+ 'type': Object,
+ 'default': () => ({})
+ }
+ },
+ data() {
+ return {
+ fields: null, // keys + values combined
+ settings: {
+ ech: []
+ }
+ };
+ },
+ mounted() {
+
+ },
+ methods: {
+ getMin(field) {
+ if (field.type !== 'number') return;
+
+ for (const rule of field.rules) {
+ if (rule.name === 'greater') return rule.args.limit + 1;
+ if (rule.name === 'min') return rule.args.limit;
+ }
+ },
+ getMax(field) {
+ if (field.type !== 'number') return;
+
+ for (const rule of field.rules) {
+ if (rule.name === 'less') return rule.args.limit - 1;
+ if (rule.name === 'max') return rule.args.limit;
+ }
+ },
+ getDisplayType(field) {
+ if (!field.metas) return field.type;
+
+ const foundMeta = field.metas.find(e => e.displayType);
+
+ if (foundMeta) return foundMeta.displayType;
+
+ return field.type;
+ },
+ getAllowedItems(field) {
+ if (!field.items) return [];
+
+ return field.items.reduce((acc, item) => {
+ if (!item.allow) return acc;
+
+ return [...acc, ...item.allow];
+ }, []);
+ }
+ }
+};
+</script>
+<style lang="scss" scoped>
+ @import '~/assets/styles/_colors.scss';
+
+ .field {
+ margin-bottom: 1em;
+ }
+
+ .taginp {
+ ::v-deep {
+ .taginput-container {
+ border-color: #585858;
+ }
+
+ .input::placeholder {
+ color: $textColor;
+ }
+
+ .taginput-container, .control, .input {
+ background-color: transparent;
+ }
+ }
+ }
+</style>