You've already forked AstralRinth
forked from didirus/AstralRinth
refactor(ui): move Chips component to composition API + TS (#3288)
* refactor(ui): move Chips component to composition API + TS * refactor(ui): move Chips component to composition API + TS
This commit is contained in:
@@ -1,5 +1,4 @@
|
|||||||
<template>
|
<template>
|
||||||
<Chips v-if="false" v-model="viewMode" :items="['open', 'archived']" />
|
|
||||||
<ReportInfo
|
<ReportInfo
|
||||||
v-for="report in reports.filter(
|
v-for="report in reports.filter(
|
||||||
(x) =>
|
(x) =>
|
||||||
@@ -17,7 +16,6 @@
|
|||||||
<p v-if="reports.length === 0">You don't have any active reports.</p>
|
<p v-if="reports.length === 0">You don't have any active reports.</p>
|
||||||
</template>
|
</template>
|
||||||
<script setup>
|
<script setup>
|
||||||
import Chips from "~/components/ui/Chips.vue";
|
|
||||||
import ReportInfo from "~/components/ui/report/ReportInfo.vue";
|
import ReportInfo from "~/components/ui/report/ReportInfo.vue";
|
||||||
import { addReportMessage } from "~/helpers/threads.js";
|
import { addReportMessage } from "~/helpers/threads.js";
|
||||||
|
|
||||||
|
|||||||
@@ -640,7 +640,6 @@ import Badge from "~/components/ui/Badge.vue";
|
|||||||
import Breadcrumbs from "~/components/ui/Breadcrumbs.vue";
|
import Breadcrumbs from "~/components/ui/Breadcrumbs.vue";
|
||||||
import CopyCode from "~/components/ui/CopyCode.vue";
|
import CopyCode from "~/components/ui/CopyCode.vue";
|
||||||
import Categories from "~/components/ui/search/Categories.vue";
|
import Categories from "~/components/ui/search/Categories.vue";
|
||||||
import Chips from "~/components/ui/Chips.vue";
|
|
||||||
import Checkbox from "~/components/ui/Checkbox.vue";
|
import Checkbox from "~/components/ui/Checkbox.vue";
|
||||||
import FileInput from "~/components/ui/FileInput.vue";
|
import FileInput from "~/components/ui/FileInput.vue";
|
||||||
|
|
||||||
@@ -663,6 +662,7 @@ import Modal from "~/components/ui/Modal.vue";
|
|||||||
import ChevronRightIcon from "~/assets/images/utils/chevron-right.svg?component";
|
import ChevronRightIcon from "~/assets/images/utils/chevron-right.svg?component";
|
||||||
|
|
||||||
import AdPlaceholder from "~/components/ui/AdPlaceholder.vue";
|
import AdPlaceholder from "~/components/ui/AdPlaceholder.vue";
|
||||||
|
|
||||||
export default defineNuxtComponent({
|
export default defineNuxtComponent({
|
||||||
components: {
|
components: {
|
||||||
MarkdownEditor,
|
MarkdownEditor,
|
||||||
@@ -670,7 +670,6 @@ export default defineNuxtComponent({
|
|||||||
FileInput,
|
FileInput,
|
||||||
Checkbox,
|
Checkbox,
|
||||||
ChevronRightIcon,
|
ChevronRightIcon,
|
||||||
Chips,
|
|
||||||
Categories,
|
Categories,
|
||||||
DownloadIcon,
|
DownloadIcon,
|
||||||
EditIcon,
|
EditIcon,
|
||||||
|
|||||||
@@ -50,7 +50,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script setup>
|
<script setup>
|
||||||
import { Button } from "@modrinth/ui";
|
import { Button, Chips } from "@modrinth/ui";
|
||||||
import { HistoryIcon } from "@modrinth/assets";
|
import { HistoryIcon } from "@modrinth/assets";
|
||||||
import {
|
import {
|
||||||
fetchExtraNotificationData,
|
fetchExtraNotificationData,
|
||||||
@@ -58,7 +58,6 @@ import {
|
|||||||
markAsRead,
|
markAsRead,
|
||||||
} from "~/helpers/notifications.js";
|
} from "~/helpers/notifications.js";
|
||||||
import NotificationItem from "~/components/ui/NotificationItem.vue";
|
import NotificationItem from "~/components/ui/NotificationItem.vue";
|
||||||
import Chips from "~/components/ui/Chips.vue";
|
|
||||||
import CheckCheckIcon from "~/assets/images/utils/check-check.svg?component";
|
import CheckCheckIcon from "~/assets/images/utils/check-check.svg?component";
|
||||||
import Breadcrumbs from "~/components/ui/Breadcrumbs.vue";
|
import Breadcrumbs from "~/components/ui/Breadcrumbs.vue";
|
||||||
import Pagination from "~/components/ui/Pagination.vue";
|
import Pagination from "~/components/ui/Pagination.vue";
|
||||||
|
|||||||
@@ -101,7 +101,7 @@
|
|||||||
</section>
|
</section>
|
||||||
</template>
|
</template>
|
||||||
<script setup>
|
<script setup>
|
||||||
import Chips from "~/components/ui/Chips.vue";
|
import { Chips } from "@modrinth/ui";
|
||||||
import Avatar from "~/components/ui/Avatar.vue";
|
import Avatar from "~/components/ui/Avatar.vue";
|
||||||
import UnknownIcon from "~/assets/images/utils/unknown.svg?component";
|
import UnknownIcon from "~/assets/images/utils/unknown.svg?component";
|
||||||
import EyeIcon from "~/assets/images/utils/eye.svg?component";
|
import EyeIcon from "~/assets/images/utils/eye.svg?component";
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<div class="chips">
|
<div class="chips">
|
||||||
<Button
|
<Button
|
||||||
v-for="item in items"
|
v-for="item in items"
|
||||||
:key="item"
|
:key="formatLabel(item)"
|
||||||
class="btn"
|
class="btn"
|
||||||
:class="{ selected: selected === item, capitalize: capitalize }"
|
:class="{ selected: selected === item, capitalize: capitalize }"
|
||||||
@click="toggleItem(item)"
|
@click="toggleItem(item)"
|
||||||
@@ -12,62 +12,39 @@
|
|||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script setup>
|
|
||||||
|
<script setup lang="ts" generic="T">
|
||||||
import { CheckIcon } from '@modrinth/assets'
|
import { CheckIcon } from '@modrinth/assets'
|
||||||
</script>
|
|
||||||
<script>
|
|
||||||
import { defineComponent } from 'vue'
|
|
||||||
import Button from './Button.vue'
|
import Button from './Button.vue'
|
||||||
|
|
||||||
export default defineComponent({
|
const props = withDefaults(
|
||||||
props: {
|
defineProps<{
|
||||||
modelValue: {
|
items: T[]
|
||||||
required: true,
|
formatLabel?: (item: T) => string
|
||||||
type: String,
|
neverEmpty?: boolean
|
||||||
},
|
capitalize?: boolean
|
||||||
items: {
|
}>(),
|
||||||
required: true,
|
{
|
||||||
type: Array,
|
neverEmpty: true,
|
||||||
},
|
// Intentional any type, as this default should only be used for primitives (string or number)
|
||||||
neverEmpty: {
|
formatLabel: (item) => item.toString(),
|
||||||
default: true,
|
capitalize: true,
|
||||||
type: Boolean,
|
|
||||||
},
|
|
||||||
formatLabel: {
|
|
||||||
default: (x) => x,
|
|
||||||
type: Function,
|
|
||||||
},
|
|
||||||
capitalize: {
|
|
||||||
type: Boolean,
|
|
||||||
default: true,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
emits: ['update:modelValue'],
|
)
|
||||||
computed: {
|
const selected = defineModel<T | null>()
|
||||||
selected: {
|
|
||||||
get() {
|
// If one always has to be selected, default to the first one
|
||||||
return this.modelValue
|
if (props.items.length > 0 && props.neverEmpty && !selected.value) {
|
||||||
},
|
selected.value = props.items[0]
|
||||||
set(value) {
|
}
|
||||||
this.$emit('update:modelValue', value)
|
|
||||||
},
|
function toggleItem(item: T) {
|
||||||
},
|
if (selected.value === item && !props.neverEmpty) {
|
||||||
},
|
selected.value = null
|
||||||
created() {
|
} else {
|
||||||
if (this.items.length > 0 && this.neverEmpty && !this.modelValue) {
|
selected.value = item
|
||||||
this.selected = this.items[0]
|
}
|
||||||
}
|
}
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
toggleItem(item) {
|
|
||||||
if (this.selected === item && !this.neverEmpty) {
|
|
||||||
this.selected = null
|
|
||||||
} else {
|
|
||||||
this.selected = item
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
})
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
|
|||||||
Reference in New Issue
Block a user