Work on documentation
This commit is contained in:
parent
c2935bd1d7
commit
f186e5c61f
17 changed files with 451 additions and 10 deletions
13
dashboard/package-lock.json
generated
13
dashboard/package-lock.json
generated
|
@ -4253,6 +4253,11 @@
|
||||||
"integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==",
|
"integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"highlight.js": {
|
||||||
|
"version": "9.15.8",
|
||||||
|
"resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.15.8.tgz",
|
||||||
|
"integrity": "sha512-RrapkKQWwE+wKdF73VsOa2RQdIoO3mxwJ4P8mhbI6KYJUraUHRKM5w5zQQKXNk0xNL4UVRdulV9SBJcmzJNzVA=="
|
||||||
|
},
|
||||||
"hmac-drbg": {
|
"hmac-drbg": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
|
||||||
|
@ -7578,6 +7583,14 @@
|
||||||
"diff-match-patch": "^1.0.0"
|
"diff-match-patch": "^1.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"vue-highlightjs": {
|
||||||
|
"version": "1.3.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/vue-highlightjs/-/vue-highlightjs-1.3.3.tgz",
|
||||||
|
"integrity": "sha1-KaDVcTL8HOFc+mHolpGPW3GMXVI=",
|
||||||
|
"requires": {
|
||||||
|
"highlight.js": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
"vue-hot-reload-api": {
|
"vue-hot-reload-api": {
|
||||||
"version": "2.3.3",
|
"version": "2.3.3",
|
||||||
"resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.3.tgz",
|
"resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.3.tgz",
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
"js-cookie": "^2.2.0",
|
"js-cookie": "^2.2.0",
|
||||||
"vue": "^2.6.10",
|
"vue": "^2.6.10",
|
||||||
"vue-codemirror": "^4.0.6",
|
"vue-codemirror": "^4.0.6",
|
||||||
|
"vue-highlightjs": "^1.3.3",
|
||||||
"vue-hot-reload-api": "^2.3.3",
|
"vue-hot-reload-api": "^2.3.3",
|
||||||
"vue-router": "^3.0.6"
|
"vue-router": "^3.0.6"
|
||||||
},
|
},
|
||||||
|
|
|
@ -35,7 +35,7 @@
|
||||||
import "codemirror/lib/codemirror.css";
|
import "codemirror/lib/codemirror.css";
|
||||||
import "codemirror/theme/oceanic-next.css";
|
import "codemirror/theme/oceanic-next.css";
|
||||||
import "codemirror/mode/yaml/yaml.js";
|
import "codemirror/mode/yaml/yaml.js";
|
||||||
import {ApiError} from "../api";
|
import {ApiError} from "../../api";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
|
@ -1,10 +1,10 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="dashboard">
|
<div class="dashboard dashboard-cloak">
|
||||||
<nav class="navbar" role="navigation" aria-label="main navigation">
|
<nav class="navbar" role="navigation" aria-label="main navigation">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="navbar-brand">
|
<div class="navbar-brand">
|
||||||
<div class="navbar-item">
|
<div class="navbar-item">
|
||||||
<img class="dashboard-logo" src="../img/logo.png" aria-hidden="true">
|
<img class="dashboard-logo" src="../../img/logo.png" alt="" aria-hidden="true">
|
||||||
<h1 class="dashboard-title">Zeppelin Dashboard</h1>
|
<h1 class="dashboard-title">Zeppelin Dashboard</h1>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -28,6 +28,11 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
|
.dashboard-cloak {
|
||||||
|
/* Replaced by "visible" in dashboard.scss */
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
.dashboard-logo {
|
.dashboard-logo {
|
||||||
margin-right: 12px;
|
margin-right: 12px;
|
||||||
}
|
}
|
||||||
|
@ -40,7 +45,7 @@
|
||||||
<script>
|
<script>
|
||||||
export default {
|
export default {
|
||||||
async mounted() {
|
async mounted() {
|
||||||
await import("../style/dashboard.scss");
|
await import("../../style/dashboard.scss");
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
async logout() {
|
async logout() {
|
21
dashboard/src/components/Docs/CodeBlock.vue
Normal file
21
dashboard/src/components/Docs/CodeBlock.vue
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
<template>
|
||||||
|
<pre class="codeblock" v-highlightjs><code v-bind:class="lang" v-trim-code="trim"><slot></slot></code></pre>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.codeblock {
|
||||||
|
padding: 0;
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hljs {
|
||||||
|
background: transparent;
|
||||||
|
padding: 16px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
props: ["lang", "trim"],
|
||||||
|
};
|
||||||
|
</script>
|
42
dashboard/src/components/Docs/ConfigurationFormat.vue
Normal file
42
dashboard/src/components/Docs/ConfigurationFormat.vue
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<h1>Configuration format</h1>
|
||||||
|
<p>
|
||||||
|
This is the basic format of the bot configuration for a guild. The basic breakdown is:
|
||||||
|
</p>
|
||||||
|
<ol>
|
||||||
|
<li>Prefix (i.e. what character is preceding each command)</li>
|
||||||
|
<li>Permission levels (see <router-link to="/docs/permissions">Permissions</router-link> for more info)</li>
|
||||||
|
<li>Plugin-specific configuration (see <router-link to="/docs/plugin-configuration">Plugin configuration</router-link> for more info)</li>
|
||||||
|
</ol>
|
||||||
|
<CodeBlock lang="yaml" trim="4">
|
||||||
|
prefix: "!"
|
||||||
|
|
||||||
|
# role id: level
|
||||||
|
levels:
|
||||||
|
"172949857164722176": 100 # Example admin
|
||||||
|
"172950000412655616": 50 # Example mod
|
||||||
|
|
||||||
|
plugins:
|
||||||
|
mod_plugin:
|
||||||
|
config:
|
||||||
|
kick_message: 'You have been kicked'
|
||||||
|
can_kick: false
|
||||||
|
overrides:
|
||||||
|
- level: '>=50'
|
||||||
|
config:
|
||||||
|
can_kick: true
|
||||||
|
- level: '>=100'
|
||||||
|
config:
|
||||||
|
kick_message: 'You have been kicked by an admin'
|
||||||
|
</CodeBlock>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import CodeBlock from "./CodeBlock";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
components: { CodeBlock },
|
||||||
|
};
|
||||||
|
</script>
|
20
dashboard/src/components/Docs/Introduction.vue
Normal file
20
dashboard/src/components/Docs/Introduction.vue
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<h1>Introduction</h1>
|
||||||
|
<p>
|
||||||
|
Zeppelin is a private moderation bot for Discord, designed with large servers and reliability in mind.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2>Getting the bot</h2>
|
||||||
|
<p>
|
||||||
|
Since the bot is currently private, access to the bot is granted on a case by case basis.<br>
|
||||||
|
There are plans to streamline this process in the future.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2>Configuration</h2>
|
||||||
|
<p>
|
||||||
|
All Zeppelin configuration is done through the dashboard by editing a YAML config file. By default, only the server
|
||||||
|
owner has access to this, but they can give other users access as they see fit. See <router-link to="/docs/configuration-format">Configuration format</router-link> for more details.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</template>
|
121
dashboard/src/components/Docs/Layout.vue
Normal file
121
dashboard/src/components/Docs/Layout.vue
Normal file
|
@ -0,0 +1,121 @@
|
||||||
|
<template>
|
||||||
|
<div class="docs docs-cloak">
|
||||||
|
<nav class="navbar" role="navigation" aria-label="main navigation">
|
||||||
|
<div class="container">
|
||||||
|
<div class="navbar-brand">
|
||||||
|
<div class="navbar-item">
|
||||||
|
<img class="docs-logo" src="../../img/logo.png" alt="" aria-hidden="true">
|
||||||
|
<h1 class="docs-title">Zeppelin Documentation</h1>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="navbar-menu is-active">
|
||||||
|
<div class="navbar-end">
|
||||||
|
<router-link to="/dashboard" class="navbar-item">Go to dashboard</router-link>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<div class="wrapper">
|
||||||
|
<div class="docs-sidebar">
|
||||||
|
<div class="docs-sidebar-content">
|
||||||
|
<aside class="menu">
|
||||||
|
<p class="menu-label">General</p>
|
||||||
|
<ul class="menu-list">
|
||||||
|
<li><router-link to="/docs">Introduction</router-link></li>
|
||||||
|
<li><router-link to="/docs/configuration-format">Configuration format</router-link></li>
|
||||||
|
<li><router-link to="/docs/plugin-configuration">Plugin configuration</router-link></li>
|
||||||
|
<li><router-link to="/docs/permissions">Permissions</router-link></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p class="menu-label">Plugins</p>
|
||||||
|
<ul class="menu-list">
|
||||||
|
<li><a>Blah</a></li>
|
||||||
|
<li><a>Bloh</a></li>
|
||||||
|
</ul>
|
||||||
|
</aside>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="docs-main content">
|
||||||
|
<router-view></router-view>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.docs-cloak {
|
||||||
|
/* Replaced by "visible" in docs.scss */
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs {
|
||||||
|
width: 100%;
|
||||||
|
max-width: 1280px;
|
||||||
|
margin: 20px auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.navbar {
|
||||||
|
border: 1px solid #4e5d6c;
|
||||||
|
border-radius: 3px;
|
||||||
|
margin-bottom: 24px;
|
||||||
|
padding: 0 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-logo {
|
||||||
|
margin-right: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-title {
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wrapper {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-sidebar {
|
||||||
|
flex: 0 0 280px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-sidebar-content {
|
||||||
|
position: sticky;
|
||||||
|
top: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-sidebar .menu {
|
||||||
|
padding: 12px 16px;
|
||||||
|
border: 1px solid #4e5d6c;
|
||||||
|
background-color: #2b3e50;
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-sidebar .menu-label {
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-main {
|
||||||
|
flex: 1 1 100%;
|
||||||
|
padding: 0 24px 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-main >>> h4 {
|
||||||
|
margin-top: 1.25em; /* ? */
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import Vue from "vue";
|
||||||
|
import VueHighlightJS from "vue-highlightjs";
|
||||||
|
import "../../directives/trim-code";
|
||||||
|
import "highlight.js/styles/ocean.css";
|
||||||
|
|
||||||
|
Vue.use(VueHighlightJS);
|
||||||
|
|
||||||
|
export default {
|
||||||
|
async mounted() {
|
||||||
|
await import("../../style/docs.scss");
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
88
dashboard/src/components/Docs/Permissions.vue
Normal file
88
dashboard/src/components/Docs/Permissions.vue
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<h1>Permissions</h1>
|
||||||
|
<p>
|
||||||
|
Permissions in Zeppelin are simply values in plugin configuration that are checked when the command is used.
|
||||||
|
These values can be changed with overrides (see <router-link to="/docs/plugin-configuration">Plugin configuration</router-link> for more info)
|
||||||
|
and can depend on e.g. user id, role id, channel id, category id, or <strong>permission level</strong>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2>Permission levels</h2>
|
||||||
|
<p>
|
||||||
|
The simplest way to control access to bot commands and features is via permission levels.
|
||||||
|
These levels are simply a number (usually between 0 and 100), based on the user's roles or user id, that can then
|
||||||
|
be used in permission overrides. By default, several commands are "moderator only" (level 50 and up) or "admin only" (level 100 and up).
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Additionally, having a higher permission level means that certain commands (such as !ban) can't be used against
|
||||||
|
you by users with a lower or equal permission level (so e.g. moderators can't ban each other or admins above them).
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Permission levels are defined in the config in the <strong>levels</strong> section. For example:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<CodeBlock lang="yaml" trim="4">
|
||||||
|
# "role/user id": level
|
||||||
|
levels:
|
||||||
|
"172949857164722176": 100 # Example admin
|
||||||
|
"172950000412655616": 50 # Example mod
|
||||||
|
</CodeBlock>
|
||||||
|
|
||||||
|
<h2>Examples</h2>
|
||||||
|
|
||||||
|
<h3>Basic overrides</h3>
|
||||||
|
<p>
|
||||||
|
For this example, let's assume we have a plugin called <code>cats</code> which has a command <code>!cat</code> locked behind the permission <code>can_cat</code>.
|
||||||
|
Let's say that by default, the plugin allows anyone to use <code>!cat</code>, but we want to restrict it to moderators only.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Here's what the configuration for this would look like:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<CodeBlock lang="yaml" trim="4">
|
||||||
|
plugins:
|
||||||
|
cats:
|
||||||
|
config:
|
||||||
|
can_cat: false # Here we set the permission false by default
|
||||||
|
overrides:
|
||||||
|
# In this override, can_cat is changed to "true" for anyone with a permission level of 50 or higher
|
||||||
|
- level: ">=50"
|
||||||
|
config:
|
||||||
|
can_cat: true
|
||||||
|
</CodeBlock>
|
||||||
|
|
||||||
|
<h3>Replacing defaults</h3>
|
||||||
|
<p>
|
||||||
|
In this example, let's assume you don't want to use the default permission levels of 50 and 100 for mods and admins respectively.
|
||||||
|
Let's say you're using various incremental levels instead: 10, 20, 30, 40, 50...<br>
|
||||||
|
We want to make it so moderator commands are available starting at level 70.
|
||||||
|
Additionally, we'd like to reserve banning for levels 90+ only.
|
||||||
|
To do this, we need to <strong>replace</strong> the default overrides that enable moderator commands at level 50.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Here's what the configuration for this would look like:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<CodeBlock lang="yaml" trim="4">
|
||||||
|
plugins:
|
||||||
|
mod_actions:
|
||||||
|
=overrides: # The "=" here means "replace any defaults"
|
||||||
|
- level: ">=70"
|
||||||
|
config:
|
||||||
|
can_warn: true
|
||||||
|
can_mute: true
|
||||||
|
can_kick: true
|
||||||
|
- level: ">=90"
|
||||||
|
config:
|
||||||
|
can_ban: true
|
||||||
|
</CodeBlock>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import CodeBlock from "./CodeBlock";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
components: { CodeBlock },
|
||||||
|
};
|
||||||
|
</script>
|
83
dashboard/src/components/Docs/PluginConfiguration.vue
Normal file
83
dashboard/src/components/Docs/PluginConfiguration.vue
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<h1>Plugin configuration</h1>
|
||||||
|
<p>
|
||||||
|
Each plugin in Zeppelin has its own configuration options. In the config editor, you can both set the default config
|
||||||
|
and overrides based on specific conditions. Permissions are also just values in the plugin's config, and thus follow
|
||||||
|
the same rules with overrides etc. as other options (see <router-link to="/docs/permissions">Permissions</router-link> for more info).
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Information about each plugin's options can be found on the plugin's page on the sidebar. See <router-link to="/docs/configuration-format">Configuration format</router-link> for an example of a full config.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2>Overrides</h2>
|
||||||
|
<p>
|
||||||
|
Overrides are the primary mechanism of changing options and permissions based on permission levels, roles, channels, user ids, etc.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Here's an example demonstrating different types of overrides:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<CodeBlock lang="yaml" trim="4">
|
||||||
|
plugins:
|
||||||
|
example_plugin:
|
||||||
|
config:
|
||||||
|
can_kick: false
|
||||||
|
kick_message: "You have been kicked"
|
||||||
|
nested:
|
||||||
|
value: "Hello"
|
||||||
|
other_value: "Foo"
|
||||||
|
overrides:
|
||||||
|
# Simple permission level based override to allow kicking only for levels 50 and up
|
||||||
|
- level: '>=50'
|
||||||
|
config:
|
||||||
|
can_kick: true
|
||||||
|
nested:
|
||||||
|
# This only affects nested.other_value; nested.value is still "Hello"
|
||||||
|
other_value: "Bar"
|
||||||
|
# Channel override - don't allow kicking on the specified channel
|
||||||
|
- channel: "109672661671505920"
|
||||||
|
config:
|
||||||
|
can_kick: false
|
||||||
|
# Same as above, but for a full category
|
||||||
|
- category: "360735466737369109"
|
||||||
|
config:
|
||||||
|
can_kick: false
|
||||||
|
# Multiple channels. If any of them match, this override applies.
|
||||||
|
- channel: ["109672661671505920", "570714864285253677"]
|
||||||
|
config:
|
||||||
|
can_kick: false
|
||||||
|
# Match based on a role
|
||||||
|
- role: "172950000412655616"
|
||||||
|
config:
|
||||||
|
can_kick: false
|
||||||
|
# Match based on multiple roles. The user must have ALL roles mentioned here for this override to apply.
|
||||||
|
- role: ["172950000412655616", "172949857164722176"]
|
||||||
|
config:
|
||||||
|
can_kick: false
|
||||||
|
# Match on user id
|
||||||
|
- user: "106391128718245888"
|
||||||
|
config:
|
||||||
|
kick_message: "You have been kicked by Dragory"
|
||||||
|
# Match on multiple conditions
|
||||||
|
- channel: "109672661671505920"
|
||||||
|
role: "172950000412655616"
|
||||||
|
config:
|
||||||
|
can_kick: false
|
||||||
|
# Match on ANY of multiple conditions
|
||||||
|
- channel: "109672661671505920"
|
||||||
|
role: "172950000412655616"
|
||||||
|
type: "any"
|
||||||
|
config:
|
||||||
|
can_kick: false
|
||||||
|
</CodeBlock>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import CodeBlock from "./CodeBlock";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
components: { CodeBlock },
|
||||||
|
};
|
||||||
|
</script>
|
|
@ -10,8 +10,8 @@
|
||||||
Zeppelin is a private moderation bot for Discord, designed with large servers and reliability in mind.
|
Zeppelin is a private moderation bot for Discord, designed with large servers and reliability in mind.
|
||||||
</div>
|
</div>
|
||||||
<div class="actions">
|
<div class="actions">
|
||||||
<a class="btn" href="/login">Dashboard</a>
|
<router-link class="btn" to="/login">Dashboard</router-link>
|
||||||
<a class="btn disabled" href="#">Docs</a>
|
<router-link class="btn" to="/docs">Docs</router-link>
|
||||||
</div>
|
</div>
|
||||||
<div class="error" v-if="error">
|
<div class="error" v-if="error">
|
||||||
<strong>Error</strong>
|
<strong>Error</strong>
|
||||||
|
|
11
dashboard/src/directives/trim-code.ts
Normal file
11
dashboard/src/directives/trim-code.ts
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
import Vue from "vue";
|
||||||
|
|
||||||
|
Vue.directive("trim-code", {
|
||||||
|
bind(el, binding) {
|
||||||
|
el.innerHTML = el.innerHTML
|
||||||
|
.replace(/(^\n+|\n+$)/g, "")
|
||||||
|
.split("\n")
|
||||||
|
.map(line => line.slice(binding.value))
|
||||||
|
.join("\n");
|
||||||
|
},
|
||||||
|
});
|
|
@ -18,7 +18,6 @@ Vue.mixin({
|
||||||
});
|
});
|
||||||
|
|
||||||
import App from "./components/App.vue";
|
import App from "./components/App.vue";
|
||||||
import Login from "./components/Login.vue";
|
|
||||||
|
|
||||||
const app = new Vue({
|
const app = new Vue({
|
||||||
router,
|
router,
|
||||||
|
|
|
@ -14,19 +14,43 @@ export const router = new VueRouter({
|
||||||
{ path: "/login", beforeEnter: authRedirectGuard },
|
{ path: "/login", beforeEnter: authRedirectGuard },
|
||||||
{ path: "/login-callback", beforeEnter: loginCallbackGuard },
|
{ path: "/login-callback", beforeEnter: loginCallbackGuard },
|
||||||
|
|
||||||
|
// Docs
|
||||||
|
{
|
||||||
|
path: "/docs",
|
||||||
|
component: () => import("./components/Docs/Layout.vue"),
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
path: "",
|
||||||
|
component: () => import("./components/Docs/Introduction.vue"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: "configuration-format",
|
||||||
|
component: () => import("./components/Docs/ConfigurationFormat.vue"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: "permissions",
|
||||||
|
component: () => import("./components/Docs/Permissions.vue"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: "plugin-configuration",
|
||||||
|
component: () => import("./components/Docs/PluginConfiguration.vue"),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
|
||||||
// Dashboard
|
// Dashboard
|
||||||
{
|
{
|
||||||
path: "/dashboard",
|
path: "/dashboard",
|
||||||
component: () => import("./components/Dashboard.vue"),
|
component: () => import("./components/Dashboard/Layout.vue"),
|
||||||
beforeEnter: authGuard,
|
beforeEnter: authGuard,
|
||||||
children: [
|
children: [
|
||||||
{
|
{
|
||||||
path: "",
|
path: "",
|
||||||
component: () => import("./components/DashboardGuildList.vue"),
|
component: () => import("./components/Dashboard/GuildList.vue"),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "guilds/:guildId/config",
|
path: "guilds/:guildId/config",
|
||||||
component: () => import("./components/DashboardGuildConfigEditor.vue"),
|
component: () => import("./components/Dashboard/GuildConfigEditor.vue"),
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
|
|
@ -3,3 +3,7 @@ $family-primary: 'Open Sans', sans-serif;
|
||||||
@import "~bulmaswatch/superhero/_variables";
|
@import "~bulmaswatch/superhero/_variables";
|
||||||
@import "~bulma/bulma";
|
@import "~bulma/bulma";
|
||||||
@import "~bulmaswatch/superhero/_overrides";
|
@import "~bulmaswatch/superhero/_overrides";
|
||||||
|
|
||||||
|
.dashboard-cloak {
|
||||||
|
visibility: visible !important;
|
||||||
|
}
|
||||||
|
|
9
dashboard/src/style/docs.scss
Normal file
9
dashboard/src/style/docs.scss
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
$family-primary: 'Open Sans', sans-serif;
|
||||||
|
|
||||||
|
@import "~bulmaswatch/superhero/_variables";
|
||||||
|
@import "~bulma/bulma";
|
||||||
|
@import "~bulmaswatch/superhero/_overrides";
|
||||||
|
|
||||||
|
.docs-cloak {
|
||||||
|
visibility: visible !important;
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue