Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c0b0eed0df | ||
|
|
13f6ad35c5 |
No files matched your search
@@ -19,15 +19,10 @@ const emit = defineEmits<{
|
|||||||
}>()
|
}>()
|
||||||
|
|
||||||
const issueStore = useIssueStore()
|
const issueStore = useIssueStore()
|
||||||
const statusStore = useStatusStore()
|
|
||||||
const issue = ref<Issue>()
|
const issue = ref<Issue>()
|
||||||
|
|
||||||
const { ckey } = defineProps<Props>()
|
const { ckey } = defineProps<Props>()
|
||||||
|
|
||||||
const statusName = computed(() => {
|
|
||||||
return statusStore.statuses?.find((el) => el.alias === issue.value?.status)?.name ?? issue.value?.status
|
|
||||||
})
|
|
||||||
|
|
||||||
const createdAtFormatted = computed(() => {
|
const createdAtFormatted = computed(() => {
|
||||||
if (!issue.value?.createdAt) return ''
|
if (!issue.value?.createdAt) return ''
|
||||||
return new Intl.DateTimeFormat('ru-RU', { dateStyle: 'medium', timeStyle: 'short' }).format(
|
return new Intl.DateTimeFormat('ru-RU', { dateStyle: 'medium', timeStyle: 'short' }).format(
|
||||||
|
|||||||
+1
-2
@@ -37,8 +37,7 @@ export const useIssueStore = defineStore('item', () => {
|
|||||||
|
|
||||||
async function getByKey(ckey: string) {
|
async function getByKey(ckey: string) {
|
||||||
try {
|
try {
|
||||||
const res = await itemGetByKey(ckey)
|
return await itemGetByKey(ckey)
|
||||||
return res
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
error.value = e instanceof Error ? e.message : 'error get item by key'
|
error.value = e instanceof Error ? e.message : 'error get item by key'
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import IssueDetails from '@/components/IssueDetails.vue'
|
|||||||
import IssueCreate from '@/components/IssueCreate.vue'
|
import IssueCreate from '@/components/IssueCreate.vue'
|
||||||
import type { Issue } from '@/api/issue.api.ts'
|
import type { Issue } from '@/api/issue.api.ts'
|
||||||
import IssuesListElement from '@/components/IssuesListElement.vue'
|
import IssuesListElement from '@/components/IssuesListElement.vue'
|
||||||
import IssueFilter from '@/components/IssueFilter.vue'
|
|
||||||
import IssueStats from '@/components/IssueStats.vue'
|
import IssueStats from '@/components/IssueStats.vue'
|
||||||
|
|
||||||
const issueStore = useIssueStore()
|
const issueStore = useIssueStore()
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { computed, onMounted, onUnmounted, ref } from 'vue'
|
import { computed, onUnmounted, ref } from 'vue'
|
||||||
|
|
||||||
const cards = ref<string[]>([])
|
const cards = ref<string[]>([])
|
||||||
|
|
||||||
|
|||||||
@@ -1,96 +1,5 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts"></script>
|
||||||
import { ref, watch, watchEffect } from 'vue'
|
|
||||||
import { type Item, useIssueStore } from '@/stores/issue'
|
|
||||||
import { useRoute, useRouter } from 'vue-router'
|
|
||||||
|
|
||||||
const issueStore = useIssueStore()
|
|
||||||
const route = useRoute()
|
|
||||||
const router = useRouter()
|
|
||||||
|
|
||||||
const itemsPerPage = ref(10)
|
|
||||||
const page = ref(1)
|
|
||||||
const text = ref<string | null>(null)
|
|
||||||
const serverItems = ref<Item[]>([])
|
|
||||||
const loading = ref(true)
|
|
||||||
const totalItems = ref(0)
|
|
||||||
|
|
||||||
async function fetch() {
|
|
||||||
syncQuery()
|
|
||||||
|
|
||||||
loading.value = true
|
|
||||||
const res = await issueStore.list({
|
|
||||||
page: page.value,
|
|
||||||
itemsPerPage: itemsPerPage.value,
|
|
||||||
text: text.value,
|
|
||||||
})
|
|
||||||
|
|
||||||
serverItems.value = res.items
|
|
||||||
totalItems.value = res.total
|
|
||||||
loading.value = false
|
|
||||||
}
|
|
||||||
|
|
||||||
async function loadItems(params: { page: number; itemsPerPage: number; sortBy?: unknown }) {
|
|
||||||
page.value = params.page
|
|
||||||
itemsPerPage.value = params.itemsPerPage
|
|
||||||
|
|
||||||
await fetch()
|
|
||||||
}
|
|
||||||
|
|
||||||
async function onSearch() {
|
|
||||||
page.value = 1
|
|
||||||
await fetch()
|
|
||||||
}
|
|
||||||
|
|
||||||
function syncQuery() {
|
|
||||||
const query: Record<string, string> = {
|
|
||||||
page: String(page.value),
|
|
||||||
}
|
|
||||||
if (text.value) query.text = text.value
|
|
||||||
|
|
||||||
router.replace({ query })
|
|
||||||
}
|
|
||||||
|
|
||||||
watch(
|
|
||||||
() => route.query,
|
|
||||||
(query) => {
|
|
||||||
page.value = query.page ? Number(query.page) : 1
|
|
||||||
text.value = query.text ? String(query.text) : null
|
|
||||||
},
|
|
||||||
{ immediate: true },
|
|
||||||
)
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="d-flex flex-column ga-2">
|
<div class="">reports</div>
|
||||||
<v-text-field
|
|
||||||
v-model="text"
|
|
||||||
clearable
|
|
||||||
variant="outlined"
|
|
||||||
density="compact"
|
|
||||||
placeholder="Search name..."
|
|
||||||
hide-details
|
|
||||||
@keydown.enter.prevent="onSearch"
|
|
||||||
@click:clear="onSearch"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<v-data-table-server
|
|
||||||
density="compact"
|
|
||||||
hide-default-header
|
|
||||||
hover
|
|
||||||
:headers="[
|
|
||||||
{ key: 'key', title: 'key' },
|
|
||||||
{ key: 'text', title: 'text' },
|
|
||||||
{ key: 'status', title: 'status' },
|
|
||||||
{ key: 'priority', title: 'priority' },
|
|
||||||
{ key: 'assignee', title: 'assignee' },
|
|
||||||
]"
|
|
||||||
:items-per-page="itemsPerPage"
|
|
||||||
:items-per-page-options="[itemsPerPage]"
|
|
||||||
:page="page"
|
|
||||||
:items="serverItems"
|
|
||||||
:items-length="totalItems"
|
|
||||||
item-value="text"
|
|
||||||
@update:options="loadItems"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</template>
|
</template>
|
||||||
Reference in new issue
Block a user