update dependencies, update eslint config, update optional ts props types

This commit is contained in:
Gregor Vostrak
2025-01-29 17:58:03 +01:00
parent 71ec1e9e0f
commit 0e8f9c58fd
128 changed files with 2926 additions and 3127 deletions

View File

@@ -151,7 +151,7 @@ const page = usePage<{
</InputLabel>
</div>
<div class="mt-4" v-if="page.props.newsletter_consent">
<div v-if="page.props.newsletter_consent" class="mt-4">
<InputLabel for="newsletter_consent">
<div class="flex items-center">
<Checkbox

View File

@@ -74,7 +74,7 @@ function refreshDashboardData() {
<MainContainer
class="grid gap-5 sm:gap-6 grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 pt-3 sm:pt-5 pb-4 sm:pb-6 border-b border-default-background-separator items-stretch">
<RecentlyTrackedTasksCard
:latestTasks="props.latestTasks"></RecentlyTrackedTasksCard>
:latest-tasks="props.latestTasks"></RecentlyTrackedTasksCard>
<LastSevenDaysCard
:last7-days="props.lastSevenDays"></LastSevenDaysCard>
<ActivityGraphCard
@@ -84,13 +84,13 @@ function refreshDashboardData() {
<TeamActivityCard
v-if="canViewMembers()"
class="flex lg:hidden xl:flex"
:latestTeamActivity="
:latest-team-activity="
props.latestTeamActivity
"></TeamActivityCard>
</MainContainer>
<MainContainer class="py-5">
<ThisWeekOverview
:weeklyProjectOverview="props.weeklyProjectOverview"
:weekly-project-overview="props.weeklyProjectOverview"
:total-weekly-billable-amount="props.totalWeeklyBillableAmount"
:total-weekly-billable-time="props.totalWeeklyBillableTime"
:total-weekly-time="props.totalWeeklyTime"

View File

@@ -52,8 +52,8 @@ function isActiveTab(tab: string) {
>Invite member</SecondaryButton
>
<MemberInviteModal
:available-roles="availableRoles"
v-model:show="inviteMember"
:available-roles="availableRoles"
@close="activeTab = 'invitations'"></MemberInviteModal>
</MainContainer>
<MemberTable v-if="activeTab === 'all'"></MemberTable>

View File

@@ -204,9 +204,9 @@ const page = usePage<{
<div class="col-span-6 sm:col-span-4">
<InputLabel for="timezone" value="Timezone" />
<select
name="timezone"
id="timezone"
v-model="form.timezone"
name="timezone"
required
class="mt-1 block w-full border-input-border bg-input-background text-white focus:border-input-border-active rounded-md shadow-sm">
<option value="" disabled>Select a Timezone</option>
@@ -225,9 +225,9 @@ const page = usePage<{
<div class="col-span-6 sm:col-span-4">
<InputLabel for="week_start" value="Start of the week" />
<select
name="week_start"
id="week_start"
v-model="form.week_start"
name="week_start"
required
class="mt-1 block w-full border-input-border bg-input-background text-white focus:border-input-border-active rounded-md shadow-sm">
<option value="" disabled>Select a week day</option>

View File

@@ -129,15 +129,15 @@ const shownTasks = computed(() => {
</nav>
<div>
<SecondaryButton
v-if="canCreateProjects()"
:icon="PencilSquareIcon"
@click="showEditProjectModal = true"
v-if="canCreateProjects()">
@click="showEditProjectModal = true">
Edit Project
</SecondaryButton>
<ProjectEditModal
v-if="project"
:originalProject="project"
v-model:show="showEditProjectModal"></ProjectEditModal>
v-model:show="showEditProjectModal"
:original-project="project"></ProjectEditModal>
</div>
</MainContainer>
<MainContainer>
@@ -168,8 +168,8 @@ const shownTasks = computed(() => {
>Create Task
</SecondaryButton>
<TaskCreateModal
:project-id="projectId"
v-model:show="createTask"></TaskCreateModal>
v-model:show="createTask"
:project-id="projectId"></TaskCreateModal>
</div>
</template>
</CardTitle>
@@ -188,11 +188,11 @@ const shownTasks = computed(() => {
Add Member
</SecondaryButton>
<ProjectMemberCreateModal
:project-id="projectId"
:existing-members="projectMembers"
v-model:show="
createProjectMember
"></ProjectMemberCreateModal>
"
:project-id="projectId"
:existing-members="projectMembers"></ProjectMemberCreateModal>
</template>
</CardTitle>
<Card>

View File

@@ -94,13 +94,13 @@ const showBillableRate = computed(() => {
>Create Project
</SecondaryButton>
<ProjectCreateModal
:createProject
:enableEstimatedTime="isAllowedToPerformPremiumAction"
:createClient
v-model:show="showCreateProjectModal"
:create-project
:enable-estimated-time="isAllowedToPerformPremiumAction"
:create-client
:currency="getOrganizationCurrencyString()"
:clients="clients"
@submit="createProject"
v-model:show="showCreateProjectModal"></ProjectCreateModal>
@submit="createProject"></ProjectCreateModal>
</MainContainer>
<ProjectTable
:show-billable-rate="showBillableRate"

View File

@@ -281,7 +281,7 @@ const tableData = computed(() => {
class="overflow-hidden">
<ReportingExportModal
v-model:show="showExportModal"
:exportUrl="exportUrl"></ReportingExportModal>
:export-url="exportUrl"></ReportingExportModal>
<MainContainer
class="py-3 sm:py-5 border-b border-default-background-separator flex justify-between items-center">
<div class="flex items-center space-x-3 sm:space-x-6">
@@ -292,7 +292,7 @@ const tableData = computed(() => {
<ReportingExportButton
:download="downloadExport"></ReportingExportButton>
<ReportSaveButton
:reportProperties="reportProperties"></ReportSaveButton>
:report-properties="reportProperties"></ReportSaveButton>
</div>
</MainContainer>
<div class="py-2.5 w-full border-b border-default-background-separator">
@@ -302,9 +302,9 @@ const tableData = computed(() => {
class="flex flex-wrap items-center space-y-2 sm:space-y-0 space-x-4">
<div class="text-sm font-medium">Filters</div>
<MemberMultiselectDropdown
@submit="updateReporting"
v-model="selectedMembers">
<template v-slot:trigger>
v-model="selectedMembers"
@submit="updateReporting">
<template #trigger>
<ReportingFilterBadge
:count="selectedMembers.length"
:active="selectedMembers.length > 0"
@@ -313,9 +313,9 @@ const tableData = computed(() => {
</template>
</MemberMultiselectDropdown>
<ProjectMultiselectDropdown
@submit="updateReporting"
v-model="selectedProjects">
<template v-slot:trigger>
v-model="selectedProjects"
@submit="updateReporting">
<template #trigger>
<ReportingFilterBadge
:count="selectedProjects.length"
:active="selectedProjects.length > 0"
@@ -324,9 +324,9 @@ const tableData = computed(() => {
</template>
</ProjectMultiselectDropdown>
<TaskMultiselectDropdown
@submit="updateReporting"
v-model="selectedTasks">
<template v-slot:trigger>
v-model="selectedTasks"
@submit="updateReporting">
<template #trigger>
<ReportingFilterBadge
:count="selectedTasks.length"
:active="selectedTasks.length > 0"
@@ -335,20 +335,20 @@ const tableData = computed(() => {
</template>
</TaskMultiselectDropdown>
<ClientMultiselectDropdown
@submit="updateReporting"
v-model="selectedClients">
<template v-slot:trigger>
v-model="selectedClients"
@submit="updateReporting">
<template #trigger>
<ReportingFilterBadge
title="Clients"
:icon="FolderIcon"></ReportingFilterBadge>
</template>
</ClientMultiselectDropdown>
<TagDropdown
@submit="updateReporting"
:createTag
v-model="selectedTags"
:tags="tags">
<template v-slot:trigger>
:create-tag
:tags="tags"
@submit="updateReporting">
<template #trigger>
<ReportingFilterBadge
:count="selectedTags.length"
:active="selectedTags.length > 0"
@@ -358,7 +358,6 @@ const tableData = computed(() => {
</TagDropdown>
<SelectDropdown
@changed="updateReporting"
v-model="billable"
:get-key-from-item="(item) => item.value"
:get-name-for-item="(item) => item.label"
@@ -375,8 +374,9 @@ const tableData = computed(() => {
label: 'Non Billable',
value: 'false',
},
]">
<template v-slot:trigger>
]"
@changed="updateReporting">
<template #trigger>
<ReportingFilterBadge
:active="billable !== null"
:title="
@@ -399,8 +399,8 @@ const tableData = computed(() => {
<MainContainer>
<div class="pt-10 w-full px-3 relative">
<ReportingChart
:groupedType="aggregatedGraphTimeEntries?.grouped_type"
:groupedData="
:grouped-type="aggregatedGraphTimeEntries?.grouped_type"
:grouped-data="
aggregatedGraphTimeEntries?.grouped_data
"></ReportingChart>
</div>
@@ -413,18 +413,18 @@ const tableData = computed(() => {
class="text-sm flex text-white items-center space-x-3 font-medium px-6 border-b border-card-background-separator pb-3">
<span>Group by</span>
<ReportingGroupBySelect
v-model="group"
:group-by-options="groupByOptions"
@changed="updateTableReporting"
v-model="group"></ReportingGroupBySelect>
@changed="updateTableReporting"></ReportingGroupBySelect>
<span>and</span>
<ReportingGroupBySelect
v-model="subGroup"
:group-by-options="
groupByOptions.filter(
(el) => el.value !== group
)
"
@changed="updateTableReporting"
v-model="subGroup"></ReportingGroupBySelect>
@changed="updateTableReporting"></ReportingGroupBySelect>
</div>
<div
class="grid items-center"
@@ -473,8 +473,8 @@ const tableData = computed(() => {
</div>
</template>
<div
class="chart flex flex-col items-center justify-center py-12 col-span-3"
v-else>
v-else
class="chart flex flex-col items-center justify-center py-12 col-span-3">
<p class="text-lg text-white font-semibold">
No time entries found
</p>

View File

@@ -252,7 +252,7 @@ async function downloadExport(format: ExportFormat) {
class="overflow-hidden">
<ReportingExportModal
v-model:show="showExportModal"
:exportUrl="exportUrl"></ReportingExportModal>
:export-url="exportUrl"></ReportingExportModal>
<MainContainer
class="py-3 sm:py-5 border-b border-default-background-separator flex justify-between items-center">
<div class="flex items-center space-x-3 sm:space-x-6">
@@ -270,9 +270,9 @@ async function downloadExport(format: ExportFormat) {
class="flex flex-wrap items-center space-y-2 sm:space-y-0 space-x-4">
<div class="text-sm font-medium">Filters</div>
<MemberMultiselectDropdown
@submit="updateFilteredTimeEntries"
v-model="selectedMembers">
<template v-slot:trigger>
v-model="selectedMembers"
@submit="updateFilteredTimeEntries">
<template #trigger>
<ReportingFilterBadge
:count="selectedMembers.length"
:active="selectedMembers.length > 0"
@@ -281,9 +281,9 @@ async function downloadExport(format: ExportFormat) {
</template>
</MemberMultiselectDropdown>
<ProjectMultiselectDropdown
@submit="updateFilteredTimeEntries"
v-model="selectedProjects">
<template v-slot:trigger>
v-model="selectedProjects"
@submit="updateFilteredTimeEntries">
<template #trigger>
<ReportingFilterBadge
:count="selectedProjects.length"
:active="selectedProjects.length > 0"
@@ -292,9 +292,9 @@ async function downloadExport(format: ExportFormat) {
</template>
</ProjectMultiselectDropdown>
<TaskMultiselectDropdown
@submit="updateFilteredTimeEntries"
v-model="selectedTasks">
<template v-slot:trigger>
v-model="selectedTasks"
@submit="updateFilteredTimeEntries">
<template #trigger>
<ReportingFilterBadge
:count="selectedTasks.length"
:active="selectedTasks.length > 0"
@@ -303,20 +303,20 @@ async function downloadExport(format: ExportFormat) {
</template>
</TaskMultiselectDropdown>
<ClientMultiselectDropdown
@submit="updateFilteredTimeEntries"
v-model="selectedClients">
<template v-slot:trigger>
v-model="selectedClients"
@submit="updateFilteredTimeEntries">
<template #trigger>
<ReportingFilterBadge
title="Clients"
:icon="FolderIcon"></ReportingFilterBadge>
</template>
</ClientMultiselectDropdown>
<TagDropdown
@submit="updateFilteredTimeEntries"
:createTag
v-model="selectedTags"
:tags="tags">
<template v-slot:trigger>
:create-tag
:tags="tags"
@submit="updateFilteredTimeEntries">
<template #trigger>
<ReportingFilterBadge
:count="selectedTags.length"
:active="selectedTags.length > 0"
@@ -326,7 +326,6 @@ async function downloadExport(format: ExportFormat) {
</TagDropdown>
<SelectDropdown
@changed="updateFilteredTimeEntries"
v-model="billable"
:get-key-from-item="(item) => item.value"
:get-name-for-item="(item) => item.label"
@@ -343,8 +342,9 @@ async function downloadExport(format: ExportFormat) {
label: 'Non Billable',
value: 'false',
},
]">
<template v-slot:trigger>
]"
@changed="updateFilteredTimeEntries">
<template #trigger>
<ReportingFilterBadge
:active="billable !== null"
:title="
@@ -366,12 +366,9 @@ async function downloadExport(format: ExportFormat) {
</div>
<TimeEntryMassActionRow
:selected-time-entries="selectedTimeEntries"
:canCreateProject="canCreateProjects()"
:enableEstimatedTime="isAllowedToPerformPremiumAction()"
@submit="clearSelectionAndState"
:can-create-project="canCreateProjects()"
:enable-estimated-time="isAllowedToPerformPremiumAction()"
:delete-selected="deleteSelected"
@select-all="selectedTimeEntries = [...timeEntries]"
@unselect-all="selectedTimeEntries = []"
:all-selected="selectedTimeEntries.length === timeEntries.length"
:projects="projects"
:tasks="tasks"
@@ -387,34 +384,37 @@ async function downloadExport(format: ExportFormat) {
"
:create-project="createProject"
:create-client="createClient"
:createTag="createTag"></TimeEntryMassActionRow>
:create-tag="createTag"
@submit="clearSelectionAndState"
@select-all="selectedTimeEntries = [...timeEntries]"
@unselect-all="selectedTimeEntries = []"></TimeEntryMassActionRow>
<div class="w-full relative">
<div v-for="entry in timeEntries" :key="entry.id">
<TimeEntryRow
:selected="selectedTimeEntries.includes(entry)"
@selected="selectedTimeEntries.push(entry)"
:canCreateProject="canCreateProjects()"
@unselected="
selectedTimeEntries = selectedTimeEntries.filter(
(item) => item.id !== entry.id
)
"
:createClient
:createProject
:enableEstimatedTime="isAllowedToPerformPremiumAction()"
:can-create-project="canCreateProjects()"
:create-client
:create-project
:enable-estimated-time="isAllowedToPerformPremiumAction()"
:projects="projects"
:tasks="tasks"
:tags="tags"
:clients
:createTag
:updateTimeEntry
:onStartStopClick="() => startTimeEntryFromExisting(entry)"
:deleteTimeEntry="() => deleteTimeEntries([entry])"
:create-tag
:update-time-entry
:on-start-stop-click="() => startTimeEntryFromExisting(entry)"
:delete-time-entry="() => deleteTimeEntries([entry])"
:currency="getOrganizationCurrencyString()"
:members="members"
showDate
showMember
:time-entry="entry"></TimeEntryRow>
show-date
show-member
:time-entry="entry"
@selected="selectedTimeEntries.push(entry)"
@unselected="
selectedTimeEntries = selectedTimeEntries.filter(
(item) => item.id !== entry.id
)
"></TimeEntryRow>
</div>
<div v-if="timeEntries.length === 0">
<div class="text-center pt-12">
@@ -431,10 +431,10 @@ async function downloadExport(format: ExportFormat) {
</div>
<PaginationRoot
v-model:page="currentPage"
:total="totalPages"
:items-per-page="pageLimit"
class="flex justify-center items-center py-8"
v-model:page="currentPage"
:sibling-count="1"
show-edges>
<PaginationList

View File

@@ -101,12 +101,12 @@ watch(currentPage, () => {
v-if="isBillingActivated() && canManageBilling()"
href="/billing">
<PrimaryButton
type="button"
class="mt-6"
:icon="CreditCardIcon"
v-if="
isBillingActivated() && canUpdateOrganization()
">
"
type="button"
class="mt-6"
:icon="CreditCardIcon">
Go to Billing
</PrimaryButton>
</Link>
@@ -120,10 +120,10 @@ watch(currentPage, () => {
<PaginationRoot
v-if="reports.length > 0 || isAllowedToPerformPremiumAction()"
v-model:page="currentPage"
:total="totalPages"
:items-per-page="pageLimit"
class="flex justify-center items-center py-8"
v-model:page="currentPage"
:sibling-count="1"
show-edges>
<PaginationList

View File

@@ -151,8 +151,8 @@ function getGroupLabel(key: string) {
<MainContainer>
<div class="pt-10 w-full px-3 relative">
<ReportingChart
:groupedType="aggregatedGraphTimeEntries?.grouped_type"
:groupedData="
:grouped-type="aggregatedGraphTimeEntries?.grouped_type"
:grouped-data="
aggregatedGraphTimeEntries?.grouped_data
"></ReportingChart>
</div>
@@ -217,8 +217,8 @@ function getGroupLabel(key: string) {
</div>
</template>
<div
class="chart flex flex-col items-center justify-center py-12 col-span-3"
v-else>
v-else
class="chart flex flex-col items-center justify-center py-12 col-span-3">
<p class="text-lg text-white font-semibold">
No time entries found
</p>

View File

@@ -31,9 +31,9 @@ async function createTag(tag: string) {
>Create Tag
</SecondaryButton>
<TagCreateModal
:createTag="createTag"
v-model:show="showCreateTagModal"></TagCreateModal>
v-model:show="showCreateTagModal"
:create-tag="createTag"></TagCreateModal>
</MainContainer>
<TagTable :createTag="createTag"></TagTable>
<TagTable :create-tag="createTag"></TagTable>
</AppLayout>
</template>

View File

@@ -191,9 +191,9 @@ const showResultModal = ref(false);
<div>
<InputLabel for="importType" value="Import Type" />
<select
name="importType"
id="importType"
v-model="importType"
name="importType"
class="mt-1 block w-full border-input-border bg-input-background text-white focus:border-input-border-active rounded-md shadow-sm">
<option :value="null" selected disabled>
Select an import type to get instructions...
@@ -206,8 +206,8 @@ const showResultModal = ref(false);
</option>
</select>
<div
class="py-3 text-white"
v-if="currentImporterDescription">
v-if="currentImporterDescription"
class="py-3 text-white">
<div class="font-semibold text-muted py-1">
Instructions:
</div>
@@ -233,12 +233,12 @@ const showResultModal = ref(false);
>Upload a Toggl/Clockify Export</span
>
<input
ref="importFile"
id="file-upload"
ref="importFile"
name="file-upload"
v-on:change="updateFiles"
type="file"
class="sr-only" />
class="sr-only"
@change="updateFiles" />
</label>
</div>
<p class="text-xs leading-5 text-muted">

View File

@@ -62,10 +62,10 @@ function checkForConfirmationModal() {
<template #form>
<OrganizationBillableRateModal
v-model:show="showConfirmationModal"
@submit="submit"
:new-billable-rate="
organizationBody.billable_rate
"></OrganizationBillableRateModal>
"
@submit="submit"></OrganizationBillableRateModal>
<!-- Organization Owner Information -->
<div class="col-span-6">
<div class="col-span-6 sm:col-span-4">
@@ -75,8 +75,8 @@ function checkForConfirmationModal() {
value="Organization Billable Rate" />
<BillableRateInput
v-if="organization"
:currency="getOrganizationCurrencyString()"
v-model="organizationBody.billable_rate"
:currency="getOrganizationCurrencyString()"
name="organizationBillableRate"></BillableRateInput>
</div>
</div>
@@ -86,10 +86,10 @@ function checkForConfirmationModal() {
<div class="flex items-center space-x-2">
<Checkbox
v-if="organization"
id="organizationShowBillableRatesToEmployees"
v-model:checked="
organizationBody.employees_can_see_billable_rates
"
id="organizationShowBillableRatesToEmployees"></Checkbox>
"></Checkbox>
<InputLabel
for="organizationShowBillableRatesToEmployees"
value="Show Billable Rates to Employees" />

View File

@@ -89,9 +89,9 @@ const updateTeamName = () => {
<div class="col-span-6 sm:col-span-4">
<InputLabel for="currency" value="Currency" />
<select
name="currency"
id="currency"
v-model="form.currency"
name="currency"
:disabled="!permissions.canUpdateTeam"
class="mt-1 block w-full border-input-border bg-input-background text-white focus:border-input-border-active rounded-md shadow-sm">
<option value="" disabled>Select a currency</option>

View File

@@ -120,16 +120,16 @@ function deleteSelected() {
<template>
<TimeEntryCreateModal
:enableEstimatedTime="isAllowedToPerformPremiumAction()"
:createProject="createProject"
:createClient="createClient"
:createTag="createTag"
:createTimeEntry="createTimeEntry"
v-model:show="showManualTimeEntryModal"
:enable-estimated-time="isAllowedToPerformPremiumAction()"
:create-project="createProject"
:create-client="createClient"
:create-tag="createTag"
:create-time-entry="createTimeEntry"
:projects
:tasks
:tags
:clients
v-model:show="showManualTimeEntryModal"></TimeEntryCreateModal>
:clients></TimeEntryCreateModal>
<AppLayout title="Dashboard" data-testid="time_view">
<MainContainer
class="pt-5 lg:pt-8 pb-4 lg:pb-6 border-b border-default-background-separator">
@@ -141,8 +141,8 @@ function deleteSelected() {
<div class="pb-2 pt-2 lg:pt-0 lg:pl-4 flex justify-center">
<SecondaryButton
class="w-full text-center flex justify-center"
@click="showManualTimeEntryModal = true"
:icon="PlusIcon"
@click="showManualTimeEntryModal = true"
>Manual time entry
</SecondaryButton>
</div>
@@ -150,12 +150,9 @@ function deleteSelected() {
</MainContainer>
<TimeEntryMassActionRow
:selected-time-entries="selectedTimeEntries"
:enableEstimatedTime="isAllowedToPerformPremiumAction()"
:canCreateProject="canCreateProjects()"
@submit="clearSelectionAndState"
:enable-estimated-time="isAllowedToPerformPremiumAction()"
:can-create-project="canCreateProjects()"
:all-selected="selectedTimeEntries.length === timeEntries.length"
@select-all="selectedTimeEntries = [...timeEntries]"
@unselect-all="selectedTimeEntries = []"
:delete-selected="deleteSelected"
:projects="projects"
:tasks="tasks"
@@ -171,23 +168,26 @@ function deleteSelected() {
"
:create-project="createProject"
:create-client="createClient"
:createTag="createTag"></TimeEntryMassActionRow>
:create-tag="createTag"
@submit="clearSelectionAndState"
@select-all="selectedTimeEntries = [...timeEntries]"
@unselect-all="selectedTimeEntries = []"></TimeEntryMassActionRow>
<TimeEntryGroupedTable
v-model:selected="selectedTimeEntries"
:createProject
:enableEstimatedTime="isAllowedToPerformPremiumAction()"
:canCreateProject="canCreateProjects()"
:create-project
:enable-estimated-time="isAllowedToPerformPremiumAction()"
:can-create-project="canCreateProjects()"
:clients
:createClient
:updateTimeEntry
:updateTimeEntries
:deleteTimeEntries
:createTimeEntry="startTimeEntry"
:createTag
:create-client
:update-time-entry
:update-time-entries
:delete-time-entries
:create-time-entry="startTimeEntry"
:create-tag
:projects="projects"
:tasks="tasks"
:currency="getOrganizationCurrencyString()"
:timeEntries="timeEntries"
:time-entries="timeEntries"
:tags="tags"></TimeEntryGroupedTable>
<div v-if="timeEntries.length === 0" class="text-center pt-12">
<ClockIcon class="w-8 text-icon-default inline pb-2"></ClockIcon>