Merge branch 'master' into security
This commit is contained in:
commit
c893216874
|
@ -93,6 +93,13 @@
|
||||||
"hint": "When this is enabled you can use Ctrl/Cmd + B to open the BetterDiscord settings menu.",
|
"hint": "When this is enabled you can use Ctrl/Cmd + B to open the BetterDiscord settings menu.",
|
||||||
"value": false,
|
"value": false,
|
||||||
"disabled": false
|
"disabled": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "enable-toasts",
|
||||||
|
"type": "bool",
|
||||||
|
"text": "Enable Toasts",
|
||||||
|
"hint": "Allows plugins to show toasts.",
|
||||||
|
"value": true
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -144,7 +151,7 @@
|
||||||
{
|
{
|
||||||
"id": "security",
|
"id": "security",
|
||||||
"text": "Security and Privacy",
|
"text": "Security and Privacy",
|
||||||
"headertext": "Security Settings",
|
"headertext": "Security and Privacy Settings",
|
||||||
"settings": [
|
"settings": [
|
||||||
{
|
{
|
||||||
"id": "default",
|
"id": "default",
|
||||||
|
|
|
@ -330,7 +330,8 @@ export default class PluginApi {
|
||||||
success: this.showSuccessToast.bind(this),
|
success: this.showSuccessToast.bind(this),
|
||||||
error: this.showErrorToast.bind(this),
|
error: this.showErrorToast.bind(this),
|
||||||
info: this.showInfoToast.bind(this),
|
info: this.showInfoToast.bind(this),
|
||||||
warning: this.showWarningToast.bind(this)
|
warning: this.showWarningToast.bind(this),
|
||||||
|
get enabled() { return Toasts.enabled }
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -44,11 +44,14 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
&.bd-hide-button {
|
&.bd-hide-button {
|
||||||
transition: opacity 0.4s ease-out;
|
animation: bd-fade-out 0.4s ease-out;
|
||||||
opacity: 0;
|
|
||||||
|
|
||||||
&.bd-active {
|
&.bd-active {
|
||||||
transition-timing-function: ease-in;
|
animation: bd-fade-in 0.4s ease-in;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:not(.bd-active):not(.bd-animating) {
|
||||||
|
display: none;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
|
||||||
div:first-child {
|
> :first-child {
|
||||||
flex: 1 1 auto;
|
flex: 1 1 auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,6 +11,10 @@
|
||||||
flex-grow: 1;
|
flex-grow: 1;
|
||||||
margin-top: 5px;
|
margin-top: 5px;
|
||||||
|
|
||||||
|
> :first-child {
|
||||||
|
flex: 1 0 auto;
|
||||||
|
}
|
||||||
|
|
||||||
.bd-removeCollectionItem {
|
.bd-removeCollectionItem {
|
||||||
width: 20px;
|
width: 20px;
|
||||||
flex: 0 1 auto;
|
flex: 0 1 auto;
|
||||||
|
@ -18,19 +22,22 @@
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
margin-bottom: 30px;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
svg {
|
|
||||||
fill: #FFF;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
svg {
|
svg {
|
||||||
width: 16px;
|
width: 16px;
|
||||||
height: 16px;
|
height: 16px;
|
||||||
fill: #ccc;
|
fill: #ccc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&:not(.bd-disabled):hover {
|
||||||
|
svg {
|
||||||
|
fill: #fff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.bd-disabled {
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,6 +48,7 @@
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
margin-right: 2px;
|
margin-right: 2px;
|
||||||
|
margin-top: 10px;
|
||||||
|
|
||||||
svg {
|
svg {
|
||||||
width: 16px;
|
width: 16px;
|
|
@ -9,3 +9,4 @@
|
||||||
@import './files.scss';
|
@import './files.scss';
|
||||||
@import './guilds.scss';
|
@import './guilds.scss';
|
||||||
@import './arrays.scss';
|
@import './arrays.scss';
|
||||||
|
@import './collections.scss';
|
||||||
|
|
|
@ -65,8 +65,7 @@ export default class ClassNormaliser extends Module {
|
||||||
|
|
||||||
normalizeElement(element) {
|
normalizeElement(element) {
|
||||||
if (!(element instanceof Element)) return;
|
if (!(element instanceof Element)) return;
|
||||||
if (element.children && element.children.length) this.normalizeElement(element.children[0]);
|
|
||||||
if (element.nextElementSibling) this.normalizeElement(element.nextElementSibling);
|
|
||||||
const classes = element.classList;
|
const classes = element.classList;
|
||||||
for (let c = 0, clen = classes.length; c < clen; c++) {
|
for (let c = 0, clen = classes.length; c < clen; c++) {
|
||||||
if (!randClass.test(classes[c])) continue;
|
if (!randClass.test(classes[c])) continue;
|
||||||
|
@ -74,6 +73,10 @@ export default class ClassNormaliser extends Module {
|
||||||
const newClass = match.split('-').map((s, i) => i ? s[0].toUpperCase() + s.slice(1) : s).join('');
|
const newClass = match.split('-').map((s, i) => i ? s[0].toUpperCase() + s.slice(1) : s).join('');
|
||||||
element.classList.add(`${normalizedPrefix}-${newClass}`);
|
element.classList.add(`${normalizedPrefix}-${newClass}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (let child of element.children) {
|
||||||
|
this.normalizeElement(child);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,7 +47,7 @@
|
||||||
methods: {
|
methods: {
|
||||||
keyupListener(e) {
|
keyupListener(e) {
|
||||||
if (Modals.stack.length || !this.active || e.which !== 27) return;
|
if (Modals.stack.length || !this.active || e.which !== 27) return;
|
||||||
if (this.$refs.settings.activeIndex !== -1) this.$refs.settings.closeContent();
|
if (this.$refs.settings.item) this.$refs.settings.closeContent();
|
||||||
else this.active = false;
|
else this.active = false;
|
||||||
e.stopImmediatePropagation();
|
e.stopImmediatePropagation();
|
||||||
},
|
},
|
||||||
|
|
|
@ -11,10 +11,10 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="bd-formCollection">
|
<div class="bd-formCollection">
|
||||||
<div v-for="s in setting.items" class="bd-collectionItem">
|
<div v-for="s in setting.items" class="bd-collectionItem">
|
||||||
<Setting :setting="s" :key="s.id" />
|
<Setting :setting="s" :hide-divider="true" :key="s.id" />
|
||||||
<div class="bd-removeCollectionItem" @click="removeItem(s)"><MiMinus/></div>
|
<div class="bd-removeCollectionItem" :class="{'bd-disabled': setting.disabled || setting.min && setting.items.length <= setting.min}" @click="removeItem(s)"><MiMinus/></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="bd-newCollectionItem" @click="addItem"><MiPlus/></div>
|
<div v-if="!setting.disabled && !setting.max || setting.items.length < setting.max" class="bd-newCollectionItem" @click="addItem"><MiPlus/></div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@ -29,9 +29,11 @@
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
removeItem(item) {
|
removeItem(item) {
|
||||||
|
if (this.setting.disabled || this.setting.min && this.setting.items.length <= this.setting.min) return;
|
||||||
this.setting.removeItem(item);
|
this.setting.removeItem(item);
|
||||||
},
|
},
|
||||||
addItem() {
|
addItem() {
|
||||||
|
if (this.setting.disabled || this.setting.max && this.setting.items.length >= this.setting.max) return;
|
||||||
this.setting.addItem();
|
this.setting.addItem();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -26,7 +26,8 @@
|
||||||
<KeyValuePair v-else-if="setting.type === 'kvp'" :setting="setting" />
|
<KeyValuePair v-else-if="setting.type === 'kvp'" :setting="setting" />
|
||||||
<SecureKeyValuePair v-else-if="setting.type === 'securekvp'" :setting="setting" />
|
<SecureKeyValuePair v-else-if="setting.type === 'securekvp'" :setting="setting" />
|
||||||
<CustomSetting v-else-if="setting.type === 'custom'" :setting="setting" />
|
<CustomSetting v-else-if="setting.type === 'custom'" :setting="setting" />
|
||||||
<div class="bd-form-divider"></div>
|
|
||||||
|
<div v-if="!hideDivider" class="bd-form-divider"></div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@ -51,7 +52,8 @@
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
props: [
|
props: [
|
||||||
'setting'
|
'setting',
|
||||||
|
'hide-divider'
|
||||||
],
|
],
|
||||||
components: {
|
components: {
|
||||||
BoolSetting,
|
BoolSetting,
|
||||||
|
|
|
@ -8,6 +8,8 @@
|
||||||
* LICENSE file in the root directory of this source tree.
|
* LICENSE file in the root directory of this source tree.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import { Settings } from 'modules';
|
||||||
|
|
||||||
let toasts = 0;
|
let toasts = 0;
|
||||||
|
|
||||||
export default class Toasts {
|
export default class Toasts {
|
||||||
|
@ -24,6 +26,8 @@ export default class Toasts {
|
||||||
* @returns {Promise} This promise resolves when the toast is removed from the DOM.
|
* @returns {Promise} This promise resolves when the toast is removed from the DOM.
|
||||||
*/
|
*/
|
||||||
static async push(message, options = {}) {
|
static async push(message, options = {}) {
|
||||||
|
if (!this.enabled) return;
|
||||||
|
|
||||||
const {type = 'basic', icon, additionalClasses, timeout = 3000} = options;
|
const {type = 'basic', icon, additionalClasses, timeout = 3000} = options;
|
||||||
const toast = {id: toasts++, message, type, icon, additionalClasses, closing: false};
|
const toast = {id: toasts++, message, type, icon, additionalClasses, closing: false};
|
||||||
this.stack.push(toast);
|
this.stack.push(toast);
|
||||||
|
@ -72,4 +76,16 @@ export default class Toasts {
|
||||||
return this._stack || (this._stack = []);
|
return this._stack || (this._stack = []);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static get setting() {
|
||||||
|
return Settings.getSetting('ui', 'default', 'enable-toasts');
|
||||||
|
}
|
||||||
|
|
||||||
|
static get enabled() {
|
||||||
|
return this.setting.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
static set enabled(enabled) {
|
||||||
|
this.setting.value = enabled;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -81,6 +81,8 @@ gulp.task('node-sass-bindings', function () {
|
||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
gulp.task('build-release', gulp.parallel('release-package', 'client', 'core', 'sparkplug', 'core-modules', 'index', 'css-editor', gulp.series('dependencies', 'node-sass-bindings')));
|
||||||
|
|
||||||
gulp.task('release', gulp.series(function () {
|
gulp.task('release', gulp.series(function () {
|
||||||
return del(['release/**/*']);
|
return del(['release/**/*']);
|
||||||
}, gulp.parallel('release-package', 'client', 'core', 'sparkplug', 'core-modules', 'index', 'css-editor', gulp.series('dependencies', 'node-sass-bindings'))));
|
}, 'build-release'));
|
||||||
|
|
|
@ -81,6 +81,7 @@
|
||||||
"build_node-sass": "node scripts/build-node-sass.js",
|
"build_node-sass": "node scripts/build-node-sass.js",
|
||||||
"build_release": "npm run release --prefix client && npm run build --prefix core && npm run release --prefix csseditor",
|
"build_release": "npm run release --prefix client && npm run build --prefix core && npm run release --prefix csseditor",
|
||||||
"package_release": "node scripts/package-release.js",
|
"package_release": "node scripts/package-release.js",
|
||||||
"release": "npm run lint && npm run build_release && gulp release && npm run package_release"
|
"release": "npm run lint && npm run build_release && gulp release && npm run package_release",
|
||||||
|
"update_release": "npm run build_release && gulp build-release"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue