diff --git a/resources/js/Pages/Client/Contracts.vue b/resources/js/Pages/Client/Contracts.vue index 26ff9ca..c62b353 100644 --- a/resources/js/Pages/Client/Contracts.vue +++ b/resources/js/Pages/Client/Contracts.vue @@ -2,9 +2,14 @@ import AppLayout from "@/Layouts/AppLayout.vue"; import { computed, ref } from "vue"; import { Link, router, usePage } from "@inertiajs/vue3"; +import axios from "axios"; import DataTable from "@/Components/DataTable/DataTableNew2.vue"; +import DialogModal from "@/Components/DialogModal.vue"; import { Button } from "@/Components/ui/button"; import { Input } from "@/Components/ui/input"; +import { Checkbox } from "@/Components/ui/checkbox"; +import { Label } from "@/Components/ui/label"; +import { Switch } from "@/Components/ui/switch"; import { Select, SelectContent, @@ -19,7 +24,7 @@ import DateRangePicker from "@/Components/DateRangePicker.vue"; import { FontAwesomeIcon } from "@fortawesome/vue-fontawesome"; import { ButtonGroup } from "@/Components/ui/button-group"; import AppPopover from "@/Components/app/ui/AppPopover.vue"; -import { Filter, LinkIcon } from "lucide-vue-next"; +import { Filter, LinkIcon, FileDown } from "lucide-vue-next"; import { Card } from "@/Components/ui/card"; import { Badge } from "@/Components/ui/badge"; import { hasPermission } from "@/Services/permissions"; @@ -55,6 +60,31 @@ const selectedSegments = ref( ); const filterPopoverOpen = ref(false); +const exportDialogOpen = ref(false); +const exportScope = ref("current"); +const exportColumns = ref(["reference", "customer", "start", "segment", "balance"]); +const exportError = ref(""); +const isExporting = ref(false); + +const exportableColumns = [ + { key: "reference", label: "Referenca" }, + { key: "customer", label: "Stranka" }, + { key: "start", label: "Začetek" }, + { key: "segment", label: "Segment" }, + { key: "balance", label: "Stanje" }, +]; + +const contractsCurrentPage = computed(() => props.contracts?.current_page ?? 1); +const contractsPerPage = computed(() => props.contracts?.per_page ?? 15); +const totalContracts = computed(() => props.contracts?.total ?? 0); +const currentPageCount = computed(() => props.contracts?.data?.length ?? 0); +const allColumnsSelected = computed( + () => exportColumns.value.length === exportableColumns.length +); +const exportDisabled = computed( + () => exportColumns.value.length === 0 || isExporting.value +); + function applyDateFilter() { filterPopoverOpen.value = false; const params = Object.fromEntries( @@ -129,6 +159,20 @@ function toggleAllColumns(checked) { exportColumns.value = checked ? exportableColumns.map((col) => col.key) : []; } +function handleColumnToggle(key, checked) { + if (checked) { + if (!exportColumns.value.includes(key)) { + exportColumns.value = [...exportColumns.value, key]; + } + } else { + exportColumns.value = exportColumns.value.filter((col) => col !== key); + } +} + +function setExportScopeFromSwitch(checked) { + exportScope.value = checked ? "all" : "current"; +} + function openExportDialog() { exportDialogOpen.value = true; exportError.value = ""; @@ -151,15 +195,12 @@ async function submitExport() { const payload = { scope: exportScope.value, columns: [...exportColumns.value], - from: fromDate.value || "", - to: toDate.value || "", + from: dateRange.value?.start || "", + to: dateRange.value?.end || "", search: search.value || "", - segments: - selectedSegments.value.length > 0 - ? selectedSegments.value.map((s) => s.id).join(",") - : "", - page: props.contracts.current_page, - per_page: props.contracts.per_page, + segments: selectedSegments.value.length > 0 ? selectedSegments.value.join(",") : "", + page: contractsCurrentPage.value, + per_page: contractsPerPage.value, }; const response = await axios.post( @@ -342,89 +383,103 @@ function extractFilenameFromHeaders(headers) { :show-toolbar="true" >