kin: KIN-UI-025-frontend_dev

This commit is contained in:
Gros Frumos 2026-03-21 09:13:49 +02:00
parent d5125793d0
commit cacd8ef1d7
4 changed files with 11 additions and 2 deletions

View file

@ -54,6 +54,7 @@
"proxy_jump_placeholder": "ProxyJump (optional, e.g. jumpt)",
"path_required": "Path is required",
"ssh_host_required": "SSH host is required for operations projects",
"search_placeholder": "Search projects...",
"bootstrap_path_placeholder": "Project path (e.g. ~/projects/vdolipoperek)",
"roles": {
"business_analyst": {

View file

@ -54,6 +54,7 @@
"proxy_jump_placeholder": "ProxyJump (опционально, например jumpt)",
"path_required": "Путь обязателен",
"ssh_host_required": "SSH хост обязателен для операционных проектов",
"search_placeholder": "Поиск проектов...",
"bootstrap_path_placeholder": "Путь к проекту (например ~/projects/vdolipoperek)",
"roles": {
"business_analyst": {

View file

@ -205,6 +205,7 @@ async function createNewProject() {
<p class="text-sm text-gray-500" v-if="totalCost > 0">{{ t('dashboard.cost_this_week') }}: ${{ totalCost.toFixed(2) }}</p>
</div>
<div class="relative">
<div v-if="showNewMenu" class="fixed inset-0 z-[5]" @click="showNewMenu = false"></div>
<button @click="showNewMenu = !showNewMenu"
class="px-3 py-1.5 text-xs bg-gray-800 text-gray-300 border border-gray-700 rounded hover:bg-gray-700 flex items-center gap-1">
+ {{ t('dashboard.new_project') }}
@ -228,7 +229,7 @@ async function createNewProject() {
<div v-if="!loading && !error" class="mb-3">
<input v-model="projectSearch"
:placeholder="t('dashboard.search_placeholder', 'Search projects...')"
:placeholder="t('dashboard.search_placeholder')"
class="w-full bg-gray-800 border border-gray-700 rounded px-3 py-1.5 text-sm text-gray-300 placeholder-gray-600 focus:border-gray-500 outline-none" />
</div>

View file

@ -655,7 +655,10 @@ const taskStats = computed(() => {
const review = tasks.filter(t => t.status === 'review').length
const blocked = tasks.filter(t => t.status === 'blocked').length
const pending = tasks.filter(t => t.status === 'pending').length
return { total, done, running, review, blocked, pending, pct: Math.round(done / total * 100) }
const revising = tasks.filter(t => t.status === 'revising').length
const cancelled = tasks.filter(t => t.status === 'cancelled').length
const decomposed = tasks.filter(t => t.status === 'decomposed').length
return { total, done, running, review, blocked, pending, revising, cancelled, decomposed, pct: Math.round(done / total * 100) }
})
const searchFilteredTasks = computed(() => {
@ -1107,6 +1110,9 @@ async function addDecision() {
<span v-if="taskStats.review" class="text-yellow-400"> {{ taskStats.review }} review</span>
<span v-if="taskStats.blocked" class="text-red-400"> {{ taskStats.blocked }} blocked</span>
<span v-if="taskStats.pending" class="text-gray-500"> {{ taskStats.pending }} pending</span>
<span v-if="taskStats.revising" class="text-orange-400"> {{ taskStats.revising }} revising</span>
<span v-if="taskStats.cancelled" class="text-gray-500"> {{ taskStats.cancelled }} cancelled</span>
<span v-if="taskStats.decomposed" class="text-gray-500"> {{ taskStats.decomposed }} decomposed</span>
</div>
</div>
<div class="flex flex-col gap-2 mb-3">