forked from didirus/AstralRinth
* feat: rough draft of tool * fix: example doc * feat: multiselect chips * feat: conditional actions+messaages + utils for handling conditions * feat: migrate checklist v1 to new format. * fix: lint issues * fix: severity util * feat: README.md * feat: start implementing new moderation checklist * feat: message assembly + fix imports * fix: lint issues * feat: add input suggestions * feat: utility cleanup * fix: icon * chore: remove debug logging * chore: remove debug button * feat: modpack permissions flow into it's own component * feat: icons + use id in stage selection button * Support md/plain text in stages. * fix: checklist not persisting/showing on subpages * feat: message gen + appr/with/deny buttons * feat: better notification placement + queue navigation * fix: default props for futureProjects * fix: modpack perms message * fix: issue with future projects props * fix: tab index + z index fixes * feat: keybinds * fix: file approval types * fix: generate message for non-modpack projects * feat: add generate message to stages dropdown * fix: variables not expanding * feat: requests * fix: empty message approval * fix: issues from sync * chore: add comment for old moderation checklist impl * fix: git artifacts * fix: update visibility logic for stages and actions * fix: cleanup logic for should show * fix: markdown editor accidental edit
117 lines
2.7 KiB
Vue
117 lines
2.7 KiB
Vue
<template>
|
|
<NewModal ref="modal" header="Moderation shortcuts" :closable="true">
|
|
<div>
|
|
<div class="keybinds-sections">
|
|
<div class="grid grid-cols-2 gap-x-12 gap-y-3">
|
|
<div
|
|
v-for="keybind in keybinds"
|
|
:key="keybind.id"
|
|
class="keybind-item flex items-center justify-between gap-4"
|
|
:class="{
|
|
'col-span-2': keybinds.length % 2 === 1 && keybinds[keybinds.length - 1] === keybind,
|
|
}"
|
|
>
|
|
<span class="text-sm text-secondary">{{ keybind.description }}</span>
|
|
<div class="flex items-center gap-1">
|
|
<kbd
|
|
v-for="(key, index) in parseKeybindDisplay(keybind.keybind)"
|
|
:key="`${keybind.id}-key-${index}`"
|
|
class="keybind-key"
|
|
>
|
|
{{ key }}
|
|
</kbd>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</NewModal>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
import { ref, computed } from "vue";
|
|
import NewModal from "@modrinth/ui/src/components/modal/NewModal.vue";
|
|
import { keybinds, type KeybindListener, normalizeKeybind } from "@modrinth/moderation";
|
|
|
|
const modal = ref<InstanceType<typeof NewModal>>();
|
|
|
|
function parseKeybindDisplay(keybind: KeybindListener["keybind"]): string[] {
|
|
const keybinds = Array.isArray(keybind) ? keybind : [keybind];
|
|
const normalized = keybinds[0];
|
|
const def = normalizeKeybind(normalized);
|
|
|
|
const keys = [];
|
|
|
|
if (def.ctrl || def.meta) {
|
|
keys.push(isMac() ? "CMD" : "CTRL");
|
|
}
|
|
if (def.shift) keys.push("SHIFT");
|
|
if (def.alt) keys.push("ALT");
|
|
|
|
const mainKey = def.key
|
|
.replace("ArrowLeft", "←")
|
|
.replace("ArrowRight", "→")
|
|
.replace("ArrowUp", "↑")
|
|
.replace("ArrowDown", "↓")
|
|
.replace("Enter", "↵")
|
|
.replace("Space", "SPACE")
|
|
.replace("Escape", "ESC")
|
|
.toUpperCase();
|
|
|
|
keys.push(mainKey);
|
|
|
|
return keys;
|
|
}
|
|
|
|
function isMac() {
|
|
return navigator.platform.toUpperCase().indexOf("MAC") >= 0;
|
|
}
|
|
|
|
function show(event?: MouseEvent) {
|
|
modal.value?.show(event);
|
|
}
|
|
|
|
function hide() {
|
|
modal.value?.hide();
|
|
}
|
|
|
|
defineExpose({
|
|
show,
|
|
hide,
|
|
});
|
|
</script>
|
|
|
|
<style scoped lang="scss">
|
|
.keybind-key {
|
|
display: inline-flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
min-width: 2rem;
|
|
padding: 0.25rem 0.5rem;
|
|
background-color: var(--color-bg);
|
|
border: 1px solid var(--color-divider);
|
|
border-radius: 0.375rem;
|
|
font-size: 0.75rem;
|
|
font-weight: 600;
|
|
text-transform: uppercase;
|
|
color: var(--color-contrast);
|
|
|
|
+ .keybind-key {
|
|
margin-left: 0.25rem;
|
|
}
|
|
}
|
|
|
|
.keybind-item {
|
|
min-height: 2rem;
|
|
}
|
|
|
|
@media (max-width: 768px) {
|
|
.keybinds-sections {
|
|
.grid {
|
|
grid-template-columns: 1fr;
|
|
gap: 0.75rem;
|
|
}
|
|
}
|
|
}
|
|
</style>
|