Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions app/components/Email/EmailReceiverSelection.vue
Original file line number Diff line number Diff line change
Expand Up @@ -138,15 +138,15 @@
}

if (onlyCurrentSeason.value) {
urlParams.append('currentSeason[memberSeasons.season]', 'true')
urlParams.append('current-season[memberSeasons.season]', 'true')
}

if (onlyPreviousSeason.value) {
urlParams.append('previousSeason[memberSeasons.season]', 'true')
urlParams.append('previous-season[memberSeasons.season]', 'true')
}

if (onlySeasonNotRenewed.value) {
urlParams.append('seasonNotRenewed[memberSeasons.season]', 'true')
urlParams.append('season-not-renewed[memberSeasons.season]', 'true')
}

if (onlyWithLicence.value) {
Expand Down
44 changes: 26 additions & 18 deletions app/components/ExternalPresence/ExternalPresenceList.vue
Original file line number Diff line number Diff line change
Expand Up @@ -67,15 +67,19 @@
}

if (selectedRange.value) {
const formattedStartDate = formatDateInput(selectedRange.value.start.toString())
const formattedEndDate = formatDateInput(selectedRange.value.end.toString())
if (formattedStartDate) {
urlParams.append(`date[after]`, formattedStartDate);

if (formattedEndDate) {
urlParams.append(`date[before]`, formattedEndDate);
} else {
urlParams.append(`date[before]`, formattedStartDate);
if (typeof selectedRange.value.value === 'string') {
urlParams.append(`${selectedRange.value.value}[date]`, 'true');
} else {
const formattedStartDate = formatDateInput(selectedRange.value.start.toString())
const formattedEndDate = formatDateInput(selectedRange.value.end.toString())
if (formattedStartDate) {
urlParams.append(`date[after]`, formattedStartDate);

if (formattedEndDate) {
urlParams.append(`date[before]`, formattedEndDate);
} else {
urlParams.append(`date[before]`, formattedStartDate);
}
}
}
}
Expand Down Expand Up @@ -131,15 +135,19 @@
urlParams.append(`order[${sort.value.column}]`, sort.value.direction);

if (selectedRange.value) {
const formattedStartDate = formatDateInput(selectedRange.value.start.toString())
const formattedEndDate = formatDateInput(selectedRange.value.end.toString())
if (formattedStartDate) {
urlParams.append(`date[after]`, formattedStartDate);

if (formattedEndDate) {
urlParams.append(`date[before]`, formattedEndDate);
} else {
urlParams.append(`date[before]`, formattedStartDate);
if (typeof selectedRange.value === 'string') {
urlParams.append(`${selectedRange.value.value}[date]`, 'true');
} else {
const formattedStartDate = formatDateInput(selectedRange.value.start.toString())
const formattedEndDate = formatDateInput(selectedRange.value.end.toString())
if (formattedStartDate) {
urlParams.append(`date[after]`, formattedStartDate);

if (formattedEndDate) {
urlParams.append(`date[before]`, formattedEndDate);
} else {
urlParams.append(`date[before]`, formattedStartDate);
}
}
}
} else {
Expand Down
72 changes: 58 additions & 14 deletions app/components/Generic/GenericDateRangePicker.vue
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,28 @@
import { DatePicker as VCalendarDatePicker } from 'v-calendar'
import 'v-calendar/style.css'
import dayjs from "dayjs";
import type {DateRange} from "~/types/date";
import type {DateRange, DateRangeFilter} from "~/types/date";

const date = defineModel<DateRange|undefined>({default: undefined})
interface Range {
label: string,
duration: { type: string, value: string|number }
}

const date = defineModel<DateRange|DateRangeFilter|undefined>({default: undefined})
const dateRange = ref<DateRange|undefined>(undefined)

if (date.value && typeof date.value.label !== 'string') {
dateRange.value = date.value as DateRange
}

const emit = defineEmits<{ rangeUpdated: [DateRange | undefined] }>()
const emit = defineEmits<{ rangeUpdated: [DateRange | DateRangeFilter | undefined] }>()

const props = defineProps({
seasonSelectors: {
type: Boolean,
default: true
}
});

const columns = computed(() => {
return isMobile().value ? 1 : 2
Expand Down Expand Up @@ -37,16 +54,44 @@ const ranges = [
{ label: '30 derniers jours', duration: { type: 'day', value: 30 } },
{ label: '3 derniers mois', duration: { type: 'month', value: 3 } },
{ label: '6 derniers mois', duration: { type: 'month', value: 6 } },
{ label: 'Dernière année', duration: { type: 'year', value: 1 } }
]
] as Range[]

if (props.seasonSelectors) {
ranges.push({ label: 'Saison actuelle', duration: { type: 'filter', value: 'current-season' } })
ranges.push({ label: 'Saison précédente', duration: { type: 'filter', value: 'previous-season' } })

function isRangeSelected (duration: { type: string, value: number }) {
} else {
ranges.push({ label: 'Dernière année', duration: { type: 'year', value: 1 } })
}

function isRangeSelected(range: Range) {
if (!date.value) return false
return dayjs(date.value.start).isSame(dayjs().subtract(duration.value, duration.type), 'day') && dayjs().isSame(date.value.end, 'day')

const isFilter = typeof range.duration.value === 'string';
if (isFilter) {
return typeof date.value === 'object' && 'value' in date.value && date.value.value === range.duration.value;
}

return dayjs(date.value.start).isSame(dayjs().subtract(range.duration.value, range.duration.type), 'day') && dayjs().isSame(date.value.end, 'day')
}

function selectRange(range: Range) {
const isFilter = typeof range.duration.value === 'string';
if (isFilter) {
date.value = { label: range.label, value: range.duration.value} as DateRangeFilter;
dateRange.value = undefined;
notify()
return;
}

dateRange.value = { start: dayjs().subtract(range.duration.value, range.duration.type).toDate(), end: new Date() }
}

function selectRange (duration: { type: string, value: number }) {
date.value = { start: dayjs().subtract(duration.value, duration.type).toDate(), end: new Date() }
function notify() {
if (dateRange.value) {
date.value = dateRange.value
}
emit('rangeUpdated', date.value)
}
</script>

Expand All @@ -57,15 +102,14 @@ function selectRange (duration: { type: string, value: number }) {
v-for="(range, index) in ranges"
:key="index"
:label="range.label"
color="neutral"
variant="ghost"
:color="isRangeSelected(range) ? 'primary' : 'neutral'"
:variant="isRangeSelected(range) ? 'soft' : 'ghost'"
class="rounded-none px-6"
:class="[isRangeSelected(range.duration) ? 'bg-gray-100 dark:bg-gray-800' : 'hover:bg-gray-50 dark:hover:bg-gray-800/50']"
truncate
@click="selectRange(range.duration)"
@click="selectRange(range)"
/>
</div>
<VCalendarDatePicker v-model.range="date" @update:model-value="emit('rangeUpdated', date)" :columns="columns" v-bind="{ ...attrs, ...$attrs }" />
<VCalendarDatePicker v-model.range="dateRange" @update:model-value="notify" :columns="columns" v-bind="{ ...attrs, ...$attrs }" />
</div>

</template>
Expand Down
6 changes: 3 additions & 3 deletions app/components/Member/MemberList.vue
Original file line number Diff line number Diff line change
Expand Up @@ -84,15 +84,15 @@ function getUrlParams(): URLSearchParams {
}

if (onlyCurrentSeason.value) {
urlParams.append('currentSeason[memberSeasons.season]', 'true');
urlParams.append('current-season[memberSeasons.season]', 'true');
}

if (onlyPreviousSeason.value) {
urlParams.append('previousSeason[memberSeasons.season]', 'true');
urlParams.append('previous-season[memberSeasons.season]', 'true');
}

if (onlySeasonNotRenewed.value) {
urlParams.append('seasonNotRenewed[memberSeasons.season]', 'true');
urlParams.append('season-not-renewed[memberSeasons.season]', 'true');
}

if (onlyWithLicence.value) {
Expand Down
2 changes: 1 addition & 1 deletion app/components/Presence/PresenceList.vue
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@
<UButton
v-if="presenceStore.selectedRange"
color="error"
@click="presenceStore.selectedRange = null"
@click="presenceStore.selectedRange = undefined"
>
Supprimer la date
</UButton>
Expand Down
44 changes: 26 additions & 18 deletions app/components/PresentMember/PresentMemberList.vue
Original file line number Diff line number Diff line change
Expand Up @@ -65,15 +65,19 @@
}

if (selectedRange.value) {
const formattedStartDate = formatDateInput(selectedRange.value.start.toString())
const formattedEndDate = formatDateInput(selectedRange.value.end.toString())
if (formattedStartDate) {
urlParams.append(`date[after]`, formattedStartDate);

if (formattedEndDate) {
urlParams.append(`date[before]`, formattedEndDate);
} else {
urlParams.append(`date[before]`, formattedStartDate);
if (typeof selectedRange.value.value === 'string') {
urlParams.append(`${selectedRange.value.value}[date]`, 'true');
} else {
const formattedStartDate = formatDateInput(selectedRange.value.start.toString())
const formattedEndDate = formatDateInput(selectedRange.value.end.toString())
if (formattedStartDate) {
urlParams.append(`date[after]`, formattedStartDate);

if (formattedEndDate) {
urlParams.append(`date[before]`, formattedEndDate);
} else {
urlParams.append(`date[before]`, formattedStartDate);
}
}
}
}
Expand Down Expand Up @@ -128,15 +132,19 @@
urlParams.append(`order[${sort.value.column}]`, sort.value.direction);

if (selectedRange.value) {
const formattedStartDate = formatDateInput(selectedRange.value.start.toString())
const formattedEndDate = formatDateInput(selectedRange.value.end.toString())
if (formattedStartDate) {
urlParams.append(`date[after]`, formattedStartDate);

if (formattedEndDate) {
urlParams.append(`date[before]`, formattedEndDate);
} else {
urlParams.append(`date[before]`, formattedStartDate);
if (typeof selectedRange.value.value === 'string') {
urlParams.append(`${selectedRange.value.value}[date]`, 'true');
} else {
const formattedStartDate = formatDateInput(selectedRange.value.start.toString())
const formattedEndDate = formatDateInput(selectedRange.value.end.toString())
if (formattedStartDate) {
urlParams.append(`date[after]`, formattedStartDate);

if (formattedEndDate) {
urlParams.append(`date[before]`, formattedEndDate);
} else {
urlParams.append(`date[before]`, formattedStartDate);
}
}
}
} else {
Expand Down
2 changes: 1 addition & 1 deletion app/pages/admin/thrombinoscope.vue
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@

urlParams.append(`order[${sort.value.column}]`, sort.value.direction);
urlParams.append(`order[firstname]`, 'asc');
urlParams.append('currentSeason[memberSeasons.season]', 'true');
urlParams.append('current-season[memberSeasons.season]', 'true');

memberQuery.getAll(urlParams).then(async value => {
if (value.items) {
Expand Down
4 changes: 2 additions & 2 deletions app/stores/usePresenceStore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@ import type {ExternalPresence} from "~/types/api/item/clubDependent/plugin/prese
import ExternalPresenceQuery from "~/composables/api/query/clubDependent/plugin/presence/ExternalPresenceQuery";
import dayjs from "dayjs";
import {defineStore} from "pinia";
import type {DateRange} from "~/types/date";
import type {DateRange, DateRangeFilter} from "~/types/date";
import type { SelectApiItem } from "~/types/select";
import type { Activity } from "~/types/api/item/clubDependent/plugin/presence/activity";

export const usePresenceStore = defineStore('presence', () => {
const selectedActivities: Ref<SelectApiItem<Activity>[]> = ref([])
const selectedDate: Ref<Date|null> = ref(null)
const selectedRange: Ref<DateRange|undefined> = ref({ start: dayjs().subtract(30, 'day').toDate(), end: new Date() })
const selectedRange: Ref<DateRange|DateRangeFilter|undefined> = ref({ start: dayjs().subtract(30, 'day').toDate(), end: new Date() })
const searchQuery: Ref<string> = ref('')

const totalExternal: Ref<number> = ref(0)
Expand Down
48 changes: 29 additions & 19 deletions app/stores/useSaleStore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import MemberQuery from "~/composables/api/query/clubDependent/MemberQuery";
import {createBrowserCsvDownload} from "~/utils/browser";
import {defineStore} from "pinia";
import {ClubRole} from "~/types/api/item/club";
import type {DateRange} from "~/types/date";
import type {DateRange, DateRangeFilter} from "~/types/date";

export const useSaleStore = defineStore('sale', () => {
const saleQuery = new SaleQuery()
Expand All @@ -18,7 +18,7 @@ export const useSaleStore = defineStore('sale', () => {

const isLoading = ref(false)
const isDownloadingCsv = ref(false)
const selectedRange: Ref<DateRange | undefined> = ref({start: new Date(), end: new Date()})
const selectedRange: Ref<DateRange | DateRangeFilter | undefined> = ref({start: new Date(), end: new Date()})
const lastRefreshDate: Ref<Date> = ref(new Date())

const shouldRefreshSales = ref(false)
Expand All @@ -39,15 +39,21 @@ export const useSaleStore = defineStore('sale', () => {
page: page.toString(),
});

const formattedStartDate = formatDateInput(selectedRange.value?.start.toString())
const formattedEndDate = formatDateInput(dayjs(selectedRange.value?.end).add(1, 'days').toString())
if (formattedStartDate) {
urlParams.append(`createdAt[after]`, formattedStartDate);

if (formattedEndDate) {
urlParams.append(`createdAt[before]`, formattedEndDate);
if (selectedRange.value) {
if (typeof selectedRange.value.value === 'string') {
urlParams.append(`${selectedRange.value.value}[createdAt]`, 'true');
} else {
urlParams.append(`createdAt[before]`, formattedStartDate);
const formattedStartDate = formatDateInput(selectedRange.value.start.toString())
const formattedEndDate = formatDateInput(dayjs(selectedRange.value.end).add(1, 'days').toString())
if (formattedStartDate) {
urlParams.append(`createdAt[after]`, formattedStartDate);

if (formattedEndDate) {
urlParams.append(`createdAt[before]`, formattedEndDate);
} else {
urlParams.append(`createdAt[before]`, formattedStartDate);
}
}
}
}

Expand Down Expand Up @@ -81,15 +87,19 @@ export const useSaleStore = defineStore('sale', () => {
});

if (selectedRange.value) {
const formattedStartDate = formatDateInput(selectedRange.value.start.toString())
const formattedEndDate = formatDateInput(dayjs(selectedRange.value.end).add(1, 'days').toString())
if (formattedStartDate) {
urlParams.append(`createdAt[after]`, formattedStartDate);

if (formattedEndDate) {
urlParams.append(`createdAt[before]`, formattedEndDate);
} else {
urlParams.append(`createdAt[before]`, formattedStartDate);
if (typeof selectedRange.value.value === 'string') {
urlParams.append(`${selectedRange.value.value}[createdAt]`, 'true');
} else {
const formattedStartDate = formatDateInput(selectedRange.value.start.toString())
const formattedEndDate = formatDateInput(dayjs(selectedRange.value.end).add(1, 'days').toString())
if (formattedStartDate) {
urlParams.append(`createdAt[after]`, formattedStartDate);

if (formattedEndDate) {
urlParams.append(`createdAt[before]`, formattedEndDate);
} else {
urlParams.append(`createdAt[before]`, formattedStartDate);
}
}
}
} else {
Expand Down
5 changes: 5 additions & 0 deletions app/types/date.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,8 @@ export interface DateRange {
start: Date
end: Date
}

export interface DateRangeFilter {
label: string
value: string
}
Loading