Skip to content

refacto DatePicker #3763

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 43 commits into from
Sep 25, 2024
Merged

refacto DatePicker #3763

merged 43 commits into from
Sep 25, 2024

Conversation

4dr1en
Copy link
Contributor

@4dr1en 4dr1en commented Sep 16, 2024

Description

Réecriture du componsant DatePicker, réduction de la taille du code, augmentation de la couverture de test et meilleur compatibilité avec la V2

Playground

Tests basique format DD/MM/YYYY

<template>
	<PageContainer>
		<v-row>
			<v-col cols="12" md="6">
				<h3>Basique Outlined</h3>
				Date: {{ date }}
				<date-picker
					v-model="date"
					label="Date"
					:hint="defaultHint"
					outlined
					clearable
				/>
				<h3>No icon</h3>
				Date: {{ date }}
				<date-picker
					v-model="date"
					label="Date"
					:hint="defaultHint"
					no-icon
				/>
				<h3>Basique with change event</h3>
				Date: {{ date1 }}
				<date-picker
					v-model="date1"
					label="Date"
					:hint="defaultHint"
					@change="handleDateChange"
				/>
				<h3>Basique</h3>
				Date: {{ date2 }}
				<date-picker
					v-model="date2"
					label="Date"
					:hint="defaultHint"
					clearable
				/>
				<h3>Clearable</h3>
				Date: {{ date3 }}
				<date-picker
					v-model="date3"
					label="Date"
					:hint="defaultHint"
					clearable
					outlined
					append-icon
				/>
				<date-picker
					v-model="date3"
					label="Date"
					:hint="defaultHint"
					clearable
				/>

				<h3>Required</h3>
				Date: {{ date4 }}
				<date-picker
					v-model="date4"
					label="Date"
					:hint="defaultHint"
					:rules="validRules"
				/>

				<h3>Not After Today</h3>
				Date: {{ date5 }}
				<date-picker
					v-model="date5"
					label="Date"
					:hint="defaultHint"
					:warning-rules="notAfterTodayRules"
				/>

				<h3>Not Before Today</h3>
				Date: {{ date6 }}
				<date-picker
					v-model="date6"
					label="Date"
					:hint="defaultHint"
					:warning-rules="notBeforeTodayRules"
				/>

				<h3>Not Before Date</h3>
				Date: {{ date7 }}
				<date-picker
					v-model="date7"
					label="Date"
					:hint="defaultHint"
					:rules="notBeforeDateRules"
				/>

				<h3>Not After Date</h3>
				Date: {{ date8 }}
				<date-picker
					v-model="date8"
					label="Date"
					:hint="defaultHint"
					:rules="notAfterDateRules"
				/>

				<h3>Warning Rules</h3>
				Date: {{ date9 }}
				<date-picker
					v-model="date9"
					label="Date"
					:hint="defaultHint"
					:warning-rules="warningRules"
					outlined
				/>

				<h3 class="mt-4">No-prepend-icon</h3>
				Date: {{ date10 }}
				<date-picker
					v-model="date10"
					label="Date"
					:hint="defaultHint"
					no-prepend-icon
				/>
			</v-col>
			<v-col cols="12" md="6">
				<h3 class="mt-4">Append-icon</h3>
				Date: {{ date11 }}
				<date-picker
					v-model="date11"
					label="Date"
					:hint="defaultHint"
					append-icon
				/>

				<h3>No Calendar</h3>
				Date: {{ date12 }}
				<date-picker
					v-model="date12"
					label="Date"
					:hint="defaultHint"
					no-calendar
				/>

				<h3>TextField Activator</h3>
				Date: {{ date13 }}
				<date-picker
					v-model="date13"
					label="Date"
					:hint="defaultHint"
					text-field-activator
				/>

				<h3 class="mt-4">Show weekends</h3>
				Date: {{ date14 }}
				<date-picker
					v-model="date14"
					label="Date"
					:hint="defaultHint"
					show-weekends
				/>

				<h3 class="mt-4">Disabled</h3>
				Date: {{ date15 }}
				<date-picker
					v-model="date15"
					label="Date"
					:hint="defaultHint"
					disabled
				/>

				<h3 class="mt-4">Outlined</h3>
				Date: {{ date16 }}
				<date-picker
					v-model="date16"
					label="Date"
					:hint="defaultHint"
					outlined
				/>

				<h3 class="mt-4">Birthdate</h3>
				Date: {{ date17 }}
				<date-picker
					v-model="date17"
					birthdate
					label="Date d'anniversaire"
					:hint="defaultHint"
				/>

				<h3 class="mt-4">Range</h3>
				<div>
					{{ startdate }} - {{ enddate }}
					<date-picker
						v-model="startdate"
						label="Start date"
						date-format-return="YYYY-MM-DD"
					/>
					<date-picker
						v-model="enddate"
						label="End date"
						:start-date="startdate"
						date-format-return="YYYY-MM-DD"
					/>
				</div>

				<h3 class="mt-4">DateFormat</h3>
				{{ dateToFormat }}
				<date-picker
					v-model="dateToFormat"
					label="Date"
					hint="JJ-MM-YYYY"
					dateFormat="DD-MM-YYYY"
				/>
				<h3 class="mt-4">DateFormatReturn</h3>
				{{ dateFormatReturn }}
				<date-picker
					v-model="dateFormatReturn"
					label="Date"
					hint="range"
					dateFormatReturn="DD/MM/YY"
				/>
			</v-col>
		</v-row>
	</PageContainer>
</template>

<script lang="ts">
import DatePicker from '@/patterns/DatePicker/DatePicker.vue'
import { required } from '@/rules/required/index.ts'
import { notAfterToday } from '@/rules/notAfterToday/index.ts'
import { notBeforeToday } from '@/rules/notBeforeToday/index.ts'
import PageContainer from '@/elements/PageContainer/PageContainer.vue'
import dayjs from 'dayjs'
import { notBeforeDate } from '@/main'
import { notAfterDate } from '@/main'
export default {
	emits: ['change'],
	components: {
		DatePicker,
		PageContainer,
	},
	data() {
		return {
			date: dayjs().format('DD/MM/YYYY'),
			date1: dayjs().add(1, 'day').format('DD/MM/YYYY'),
			date2: dayjs().add(2, 'day').format('DD/MM/YYYY'),
			date3: dayjs().add(3, 'day').format('DD/MM/YYYY'),
			date4: dayjs().add(4, 'day').format('DD/MM/YYYY'),
			date5: dayjs().add(5, 'day').format('DD/MM/YYYY'),
			date6: dayjs().add(6, 'day').format('DD/MM/YYYY'),
			date7: dayjs().add(7, 'day').format('DD/MM/YYYY'),
			date8: dayjs().add(8, 'day').format('DD/MM/YYYY'),
			date9: dayjs().add(9, 'day').format('DD/MM/YYYY'),
			date10: dayjs().add(10, 'day').format('DD/MM/YYYY'),
			date11: dayjs().add(11, 'day').format('DD/MM/YYYY'),
			date12: dayjs().add(12, 'day').format('DD/MM/YYYY'),
			date13: dayjs().add(13, 'day').format('DD/MM/YYYY'),
			date14: dayjs().add(14, 'day').format('DD/MM/YYYY'),
			date15: dayjs().add(15, 'day').format('DD/MM/YYYY'),
			date16: dayjs().add(16, 'day').format('DD/MM/YYYY'),
			date17: dayjs().add(17, 'day').format('DD/MM/YYYY'),
			dateRange: undefined,
			startdate: null,
			enddate: null,
			dateDefinie: dayjs().format('DD/MM/YYYY'),
			dateToFormat: dayjs().format('DD/MM/YYYY'),
			dateFormatReturn: dayjs().format('DD/MM/YYYY'),
			validRules: [required, notAfterToday, notBeforeToday],
			notAfterTodayRules: [notAfterToday],
			notBeforeTodayRules: [notBeforeToday],
			notBeforeDateRules: [notBeforeDate(dayjs().format('DD/MM/YYYY'))],
			notAfterDateRules: [notAfterDate(dayjs().format('DD/MM/YYYY'))],
			defaultHint: 'Format JJ/MM/YYYY',
			warningRules: [notAfterToday, notBeforeToday],
		}
	},
	mounted() {
		const date = dayjs().add(8, 'day').format('DD/MM/YYYY')
		const date1 = dayjs().add(10, 'day').format('DD/MM/YYYY')

		setTimeout(() => {
			this.date = date
		}, 4000)
		setTimeout(() => {
			this.date1 = date1
		}, 4000)
	},
	methods: {
		notAfterToday,
		handleDateChange(value: any) {
			console.log('Date changed to ' + value)
		},
	},
}
</script>

Tests rules/warnings format DD/MM/YYYY

<template>
	<PageContainer>
		<v-row>
			<v-col cols="12" md="6">
				<h2>Rules</h2>
				<h3>notAfterDate: Tomorrow</h3>
				<DatePicker v-model="date" :rules="notAfterDateRules" />
				<h3>notBeforeDate: Tomorrow</h3>
				<DatePicker v-model="date1" :rules="notBeforeDateRules" />
				<h3>notAfterToday</h3>
				<DatePicker v-model="date2" :rules="notAfterTodayRules" />
				<h3>notBeforeToday</h3>
				<DatePicker v-model="date3" :rules="notBeforeTodayRules" />
				<h3>Required</h3>
				<DatePicker v-model="date4" :rules="requiredRules" />
				<h3>Multi Rules</h3>
				<DatePicker v-model="date5" :rules="validRules" />
			</v-col>
			<v-col cols="12" md="6">
				<h2>Warnings</h2>
				<h3>notAfterDate: Tomorrow</h3>
				<DatePicker v-model="date6" :warning-rules="notAfterToday" />
				<h3>notBeforeDate: Tomorrow</h3>
				<DatePicker v-model="date7" :warning-rules="notBeforeToday" />
				<h3>notAfterToday</h3>
				<DatePicker v-model="date8" :warning-rules="notAfterToday" />
				<h3>notBeforeToday</h3>
				<DatePicker v-model="date9" :warning-rules="notBeforeToday" />
				<h3>Required</h3>
				<DatePicker v-model="date10" :warning-rules="requiredRules" />
				<h3>Multi Warnings</h3>
				<DatePicker v-model="date11" :warning-rules="warningRules" />
			</v-col>
		</v-row>
	</PageContainer>
</template>

<script lang="ts">
import DatePicker from "@/patterns/DatePickerField/DatePickerField.vue"
import { required } from "@/rules/required/index.ts";
import { notAfterToday } from "@/rules/notAfterToday/index.ts";
import { notBeforeToday } from "@/rules/notBeforeToday/index.ts";
import PageContainer from "@/elements/PageContainer/PageContainer.vue";
import dayjs from 'dayjs';
import {notBeforeDate} from "@/main";
import {notAfterDate} from "@/main";
export default {
	emits:['change'],
	components: {
		DatePicker,
		PageContainer
	},
	data() {
		return {
			date: dayjs().format('DD/MM/YYYY'),
			date1: dayjs().add(1, 'day').format('DD/MM/YYYY'),
			date2: dayjs().add(2, 'day').format('DD/MM/YYYY'),
			date3: dayjs().add(3, 'day').format('DD/MM/YYYY'),
			date4: dayjs().add(4, 'day').format('DD/MM/YYYY'),
			date5: dayjs().add(5, 'day').format('DD/MM/YYYY'),
			date6: dayjs().add(6, 'day').format('DD/MM/YYYY'),
			date7: dayjs().add(7, 'day').format('DD/MM/YYYY'),
			date8: dayjs().add(8, 'day').format('DD/MM/YYYY'),
			date9: dayjs().add(9, 'day').format('DD/MM/YYYY'),
			date10: dayjs().add(10, 'day').format('DD/MM/YYYY'),
			date11: dayjs().add(11, 'day').format('DD/MM/YYYY'),
			date12: dayjs().add(12, 'day').format('DD/MM/YYYY'),
			date13: dayjs().add(13, 'day').format('DD/MM/YYYY'),
			date14: dayjs().add(14, 'day').format('DD/MM/YYYY'),
			date15: dayjs().add(15, 'day').format('DD/MM/YYYY'),
			date16: dayjs().add(16, 'day').format('DD/MM/YYYY'),
			date17: dayjs().add(17, 'day').format('DD/MM/YYYY'),
			dateRange:[dayjs().format('DD/MM/YYYY'), dayjs().add(12, 'day').format('DD/MM/YYYY')],
			startDate: null,
			endDate: null,
			dateDefinie: dayjs().format('DD/MM/YYYY'),
			dateToFormat: dayjs().format('DD/MM/YYYY'),
			dateFormatReturn: dayjs().format('DD/MM/YYYY'),
			requiredRules: [required],
			validRules: [required,notAfterToday, notAfterDate(dayjs().format('DD/MM/YYYY'))],
			notAfterTodayRules: [notAfterToday],
			notBeforeTodayRules: [notBeforeToday],
			notBeforeDateRules: [notBeforeDate(dayjs().format('DD/MM/YYYY'))],
			notAfterDateRules: [notAfterDate(dayjs().format('DD/MM/YYYY'))],
			defaultHint: "Format JJ/MM/YYYY",
			warningRules: [notAfterToday, notAfterDate(dayjs().format('DD/MM/YYYY'))],
		}
	},
	mounted() {
		const date = dayjs().add(8, 'day').format('DD/MM/YYYY');
		const date1 = dayjs().add(10, 'day').format('DD/MM/YYYY');
		const startDate = dayjs().add(18, 'day').format('DD/MM/YYYY');
		const endDate = dayjs().add(21, 'day').format('DD/MM/YYYY');

		this.dateRange = [date, date1]

		setTimeout(() => {
			this.date = date;
		}, 4000);
		setTimeout(() => {
			this.date1 = date1;
		}, 4000);
		setTimeout(() => {
			this.dateRange = [startDate, endDate]
		}, 5000);
	},
	methods: {
		notAfterToday,
	}
};
</script>

Type de changement

  • Correction de bug
  • Changement cassant
  • Refactoring
  • Ce changement nécessite une mise à jour de la documentation

Checklist

  • Ma Pull Request pointe vers la bonne branche
  • Mon code suit le style de code du projet
  • J'ai effectué une review de mon propre code
  • J'ai commenté mon code, en particulier dans les parties difficiles à comprendre
  • J'ai apporté les modifications correspondantes à la documentation
  • Mes modifications ne génèrent aucun nouveau warning
  • J'ai ajouté des tests qui prouvent que mon correctif est efficace ou que ma fonctionnalité fonctionne
  • Les tests unitaires passent localement avec mes modifications
  • J'ai mis à jour le fichier Changelog

@4dr1en 4dr1en requested a review from DavidFyon September 16, 2024 08:37
@4dr1en 4dr1en self-assigned this Sep 16, 2024
@VachetVirginie
Copy link
Contributor

VachetVirginie commented Sep 16, 2024

  • Gestion multis rules
  • Range:
    • valeur d'initialisation ?
    • affichage dans l'input
    • a la main / calendar ?
  • Mettre hint par default dans erreur si pas renseigne par la props ok
  • clearable
  • suppression de l'input
  • format d'entree
  • style selection
  • TextField Activator
  • No Calendar
  • Disabled
  • Outlined
  • certains cas ou les icons sont en doubles

@4dr1en 4dr1en marked this pull request as ready for review September 19, 2024 15:13
@DavidFyon DavidFyon merged commit 88d9530 into v2-bridge Sep 25, 2024
2 checks passed
@DavidFyon DavidFyon deleted the Refacto/DatePicker branch September 25, 2024 12:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
3 participants