This commit is contained in:
2026-04-24 00:37:24 +08:00
parent 1b1ec7f64d
commit 5693472f64
11 changed files with 101 additions and 164 deletions
@@ -52,6 +52,7 @@ const targetContainers = ref([])
const targetSearch = ref('')
const targetLoading = ref(false)
const showTargetDropdown = ref(false)
let targetDropdownTimer = null
// ── 删除确认 ──
const showDeleteConfirm = ref(false)
@@ -186,18 +187,39 @@ async function openMove() {
showMove.value = true
}
function onTargetFocus() {
if (targetDropdownTimer) clearTimeout(targetDropdownTimer)
showTargetDropdown.value = true
loadTargetContainers(targetSearch.value)
}
function onTargetInput() {
if (targetDropdownTimer) clearTimeout(targetDropdownTimer)
showTargetDropdown.value = true
loadTargetContainers(targetSearch.value)
}
function closeTargetDropdown() {
targetDropdownTimer = setTimeout(() => {
showTargetDropdown.value = false
}, 150)
}
async function loadTargetContainers(search = '') {
targetLoading.value = true
try {
const isSearch = search.trim().length > 0
const { errCode, data } = await warehouseApi.getContainers({
search,
entries: 50,
all_levels: true,
entries: isSearch ? 50 : 10,
page: 1,
})
if (errCode === 0) {
targetContainers.value = (data.containers ?? []).filter(
(c) => c.ID !== itemId.value && c.ID !== item.value?.ContainerID
const filtered = (data.containers ?? []).filter(
(c) => c.ID !== item.value?.ContainerID
)
targetContainers.value = isSearch ? filtered : filtered.slice(0, 5)
}
} catch {
targetContainers.value = []
@@ -389,6 +411,7 @@ onMounted(() => {
{{ usersStore.getUsernameFromUserID(item.CreatorID) }}
</span>
<span>{{ t('warehouse.created_at') }}: {{ fmtTs(item.CreatedAt) }}</span>
<span v-if="item.UpdatedAt">{{ t('warehouse.updated_at') }}: {{ fmtTs(item.UpdatedAt) }}</span>
</div>
</div>
@@ -503,19 +526,21 @@ onMounted(() => {
</div>
<div>
<label class="mb-1 block text-sm font-medium text-gray-700 dark:text-gray-300">{{ t('warehouse.target_container') }}</label>
<div class="relative">
<div class="relative" @click.stop>
<IconSearch class="absolute left-3 top-1/2 -translate-y-1/2 text-gray-400" :size="15" />
<input
v-model="targetSearch"
type="text"
:placeholder="t('warehouse.search_container')"
class="w-full rounded-lg border border-gray-300 bg-white py-2 pl-9 pr-3 text-sm dark:border-dk-muted dark:bg-dk-base dark:text-white"
@focus="loadTargetContainers(''); showTargetDropdown = true"
@input="loadTargetContainers(targetSearch); showTargetDropdown = true"
@focus="onTargetFocus"
@input="onTargetInput"
@blur="closeTargetDropdown"
/>
<div
v-if="showTargetDropdown && (targetContainers.length > 0 || targetLoading)"
v-if="showTargetDropdown"
class="absolute z-10 mt-1 w-full rounded-lg border border-gray-200 bg-white shadow-lg dark:border-dk-muted dark:bg-dk-card max-h-60 overflow-y-auto"
@mousedown.prevent
>
<div v-if="targetLoading" class="px-3 py-2 text-xs text-gray-400">
<svg class="inline h-3.5 w-3.5 animate-spin mr-1" viewBox="0 0 24 24" fill="none">