mirror of
https://github.com/solidtime-io/solidtime.git
synced 2026-05-07 20:32:26 +00:00
93 lines
3.4 KiB
Vue
93 lines
3.4 KiB
Vue
<script setup lang="ts">
|
|
import type { Task } from '@/packages/api/src';
|
|
import { CheckCircleIcon } from '@heroicons/vue/20/solid';
|
|
import { useTasksStore } from '@/utils/useTasks';
|
|
import TaskMoreOptionsDropdown from '@/Components/Common/Task/TaskMoreOptionsDropdown.vue';
|
|
import TableRow from '@/Components/TableRow.vue';
|
|
import { canDeleteTasks } from '@/utils/permissions';
|
|
import TaskEditModal from '@/Components/Common/Task/TaskEditModal.vue';
|
|
import { ref, inject, type ComputedRef } from 'vue';
|
|
import { isAllowedToPerformPremiumAction } from '@/utils/billing';
|
|
import EstimatedTimeProgress from '@/packages/ui/src/EstimatedTimeProgress.vue';
|
|
import UpgradeBadge from '@/Components/Common/UpgradeBadge.vue';
|
|
import { formatHumanReadableDuration } from '../../../packages/ui/src/utils/time';
|
|
import type { Organization } from '@/packages/api/src';
|
|
|
|
const props = defineProps<{
|
|
task: Task;
|
|
}>();
|
|
|
|
const organization = inject<ComputedRef<Organization>>('organization');
|
|
|
|
function deleteTask() {
|
|
useTasksStore().deleteTask(props.task.id);
|
|
}
|
|
|
|
function markTaskAsDone() {
|
|
useTasksStore().updateTask(props.task.id, {
|
|
...props.task,
|
|
is_done: !props.task.is_done,
|
|
});
|
|
}
|
|
|
|
const showTaskEditModal = ref(false);
|
|
</script>
|
|
|
|
<template>
|
|
<TableRow>
|
|
<div
|
|
class="whitespace-nowrap min-w-0 flex items-center space-x-5 3xl:pl-12 py-4 pr-3 text-sm font-medium text-text-primary pl-4 sm:pl-6 lg:pl-8 3xl:pl-12">
|
|
<span class="overflow-ellipsis overflow-hidden">
|
|
{{ task.name }}
|
|
</span>
|
|
</div>
|
|
<div
|
|
class="whitespace-nowrap px-3 py-4 text-sm text-text-secondary flex space-x-1 items-center font-medium">
|
|
<span v-if="task.spent_time">
|
|
{{
|
|
formatHumanReadableDuration(
|
|
task.spent_time,
|
|
organization?.interval_format,
|
|
organization?.number_format
|
|
)
|
|
}}
|
|
</span>
|
|
<span v-else> -- </span>
|
|
</div>
|
|
<div
|
|
class="whitespace-nowrap px-3 flex items-center text-sm text-text-secondary">
|
|
<UpgradeBadge
|
|
v-if="!isAllowedToPerformPremiumAction()"></UpgradeBadge>
|
|
<EstimatedTimeProgress
|
|
v-else-if="task.estimated_time"
|
|
:estimated="task.estimated_time"
|
|
:current="task.spent_time"></EstimatedTimeProgress>
|
|
<span v-else> -- </span>
|
|
</div>
|
|
<div
|
|
class="whitespace-nowrap px-3 py-4 text-sm text-text-secondary flex space-x-1 items-center font-medium">
|
|
<template v-if="task.is_done">
|
|
<CheckCircleIcon class="w-5"></CheckCircleIcon>
|
|
<span>Done</span>
|
|
</template>
|
|
<template v-else>
|
|
<span>Active</span>
|
|
</template>
|
|
</div>
|
|
<div
|
|
class="relative whitespace-nowrap flex items-center pl-3 text-right text-sm font-medium sm:pr-0 pr-4 sm:pr-6 lg:pr-8 3xl:pr-12">
|
|
<TaskMoreOptionsDropdown
|
|
v-if="canDeleteTasks()"
|
|
:task="task"
|
|
@done="markTaskAsDone"
|
|
@edit="showTaskEditModal = true"
|
|
@delete="deleteTask"></TaskMoreOptionsDropdown>
|
|
</div>
|
|
<TaskEditModal
|
|
v-model:show="showTaskEditModal"
|
|
:task="task"></TaskEditModal>
|
|
</TableRow>
|
|
</template>
|
|
|
|
<style scoped></style>
|