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:
Erb3
2025-02-21 19:59:19 +01:00
committed by GitHub
parent a02eb5445b
commit 1358336a76
5 changed files with 33 additions and 60 deletions

View File

@@ -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";

View File

@@ -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,

View File

@@ -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";

View File

@@ -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";

View File

@@ -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
}>(),
{
neverEmpty: true,
// Intentional any type, as this default should only be used for primitives (string or number)
formatLabel: (item) => item.toString(),
capitalize: true,
}, },
items: { )
required: true, const selected = defineModel<T | null>()
type: Array,
}, // If one always has to be selected, default to the first one
neverEmpty: { if (props.items.length > 0 && props.neverEmpty && !selected.value) {
default: true, selected.value = props.items[0]
type: Boolean, }
},
formatLabel: { function toggleItem(item: T) {
default: (x) => x, if (selected.value === item && !props.neverEmpty) {
type: Function, selected.value = null
},
capitalize: {
type: Boolean,
default: true,
},
},
emits: ['update:modelValue'],
computed: {
selected: {
get() {
return this.modelValue
},
set(value) {
this.$emit('update:modelValue', value)
},
},
},
created() {
if (this.items.length > 0 && this.neverEmpty && !this.modelValue) {
this.selected = this.items[0]
}
},
methods: {
toggleItem(item) {
if (this.selected === item && !this.neverEmpty) {
this.selected = null
} else { } else {
this.selected = item selected.value = item
} }
}, }
},
})
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>