persian-datepicker-element
Version:
A modern Jalali (Shamsi) Date Picker web component with shadcn-like styling
468 lines (374 loc) • 18.8 kB
Markdown
# کامپوننت انتخاب تاریخ شمسی
یک کامپوننت وب مدرن و قابل شخصیسازی برای انتخاب تاریخ شمسی (جلالی) با پشتیبانی از فریمورکهای مختلف.
## ویژگیها
- 🎨 کاملاً قابل شخصیسازی با متغیرهای CSS
- 🌙 پشتیبانی از حالت تاریک
- 📱 سازگار با موبایل و پشتیبانی از لمس
- 🎯 یکپارچهسازی با فریمورکها (React، Vue، Angular)
- 📅 پشتیبانی از تعطیلات با انواع مختلف رویدادها (ایران، افغانستان، ایران باستان، بینالمللی)
- 🔄 پشتیبانی از راست به چپ (RTL)
- 🎨 گزینههای متعدد تم
- 📦 بدون وابستگی
- 🎯 پشتیبانی از TypeScript
- 📊 حالت انتخاب بازه تاریخ
- 🚫 پشتیبانی از تاریخهای غیرفعال
- 🎨 قابلیت شخصیسازی نمایش عناصر رابط کاربری
## نصب
### کامپوننت وب
```bash
npm install persian-datepicker-element
# یا
yarn add persian-datepicker-element
# یا
pnpm add persian-datepicker-element
```
### یکپارچهسازی با فریمورکها
#### React
```bash
npm install react-persian-datepicker-element persian-datepicker-element
# یا
yarn add react-persian-datepicker-element persian-datepicker-element
# یا
pnpm add react-persian-datepicker-element persian-datepicker-element
```
#### Vue
```bash
npm install vue-persian-datepicker-element persian-datepicker-element
# یا
yarn add vue-persian-datepicker-element persian-datepicker-element
# یا
pnpm add vue-persian-datepicker-element persian-datepicker-element
```
#### Angular
```bash
npm install ngx-persian-datepicker-element persian-datepicker-element
# یا
yarn add ngx-persian-datepicker-element persian-datepicker-element
# یا
pnpm add ngx-persian-datepicker-element persian-datepicker-element
```
## نحوه استفاده
### کامپوننت وب
```html
<!-- وارد کردن کامپوننت -->
<script type="module" src="node_modules/persian-datepicker-element/dist/persian-datepicker-element.min.js"></script>
<!-- استفاده از کامپوننت -->
<persian-datepicker-element
placeholder="انتخاب تاریخ"
format="YYYY/MM/DD"
show-holidays
rtl
></persian-datepicker-element>
```
### React
```tsx
import { PersianDatepicker } from 'react-persian-datepicker-element';
function App() {
const handleChange = (event) => {
console.log('تاریخ انتخاب شده:', event.detail);
};
return (
<PersianDatepicker
placeholder="انتخاب تاریخ"
format="YYYY/MM/DD"
showEvents
rtl
onChange={handleChange}
/>
);
}
```
### Vue
```vue
<template>
<PersianDatepicker
placeholder="انتخاب تاریخ"
format="YYYY/MM/DD"
:show-holidays="true"
:rtl="true"
@change="handleChange"
/>
</template>
<script setup>
import { PersianDatepicker } from 'vue-persian-datepicker-element';
const handleChange = (event) => {
console.log('تاریخ انتخاب شده:', event.detail);
};
</script>
```
### Angular
```typescript
// app.module.ts
import { PersianDatepickerModule } from 'ngx-persian-datepicker-element';
@NgModule({
imports: [
PersianDatepickerModule
]
})
export class AppModule { }
// app.component.ts
import { Component } from '@angular/core';
@Component({
template: `
<persian-datepicker
placeholder="انتخاب تاریخ"
format="YYYY/MM/DD"
[showEvents]="true"
[rtl]="true"
(change)="handleChange($event)"
></persian-datepicker>
`
})
export class AppComponent {
handleChange(event: any) {
console.log('تاریخ انتخاب شده:', event.detail);
}
}
```
## ویژگیها و خصوصیات
| ویژگی/خصوصیت | نوع | پیشفرض | توضیحات |
|---------------|------|---------|-------------|
| value | string \| [number, number, number] | - | مقدار تاریخ انتخاب شده |
| placeholder | string | - | متن راهنما |
| format | string | "YYYY/MM/DD" | فرمت تاریخ |
| show-holidays | boolean | false | نمایش نشانگرهای تعطیلی |
| holiday-types | string | "Iran,Afghanistan,AncientIran,International" | لیست انواع تعطیلات با کاما جدا شده. از "all" برای نمایش همه انواع تعطیلات استفاده کنید |
| rtl | boolean | false | چیدمان راست به چپ |
| min-date | [number, number, number] | - | حداقل تاریخ قابل انتخاب |
| max-date | [number, number, number] | - | حداکثر تاریخ قابل انتخاب |
| disabled-dates | string | - | نام تابعی که تعیین میکند آیا یک تاریخ باید غیرفعال باشد |
| disabled | boolean | false | غیرفعال کردن انتخابگر تاریخ |
| dark-mode | boolean | false | فعال کردن حالت تاریک |
| range-mode | boolean | false | فعال کردن حالت انتخاب بازه تاریخ |
| show-month-selector | boolean | true | نمایش انتخابگر ماه |
| show-year-selector | boolean | true | نمایش انتخابگر سال |
| show-prev-button | boolean | true | نمایش دکمه ماه قبل |
| show-next-button | boolean | true | نمایش دکمه ماه بعد |
| show-today-button | boolean | true | نمایش دکمه امروز |
| show-tomorrow-button | boolean | true | نمایش دکمه فردا |
| today-button-text | string | "امروز" | متن سفارشی برای دکمه امروز |
| tomorrow-button-text | string | "فردا" | متن سفارشی برای دکمه فردا |
| today-button-class | string | "" | کلاسهای CSS اضافی برای دکمه امروز |
| tomorrow-button-class | string | "" | کلاسهای CSS اضافی برای دکمه فردا |
## رویدادها
| رویداد | نوع جزئیات | توضیحات |
|-------|-------------|-------------|
| change | { jalali: [number, number, number], gregorian: [number, number, number], isHoliday: boolean, events: Array, formattedDate: string } | در زمان انتخاب تاریخ |
| change | { range: { start: [number, number, number], end: [number, number, number] }, isRange: true } | در زمان انتخاب بازه تاریخ (در حالت بازه) |
## متدها
| متد | پارامترها | نوع برگشتی | توضیحات |
|--------|------------|-------------|-------------|
| setValue | (year: number, month: number, day: number) | void | تنظیم مقدار انتخابگر تاریخ |
| getValue | () | [number, number, number] \| null | دریافت تاریخ انتخاب شده فعلی به صورت تاپل |
| open | () | void | باز کردن تقویم انتخابگر تاریخ |
| close | () | void | بستن تقویم انتخابگر تاریخ |
| setMinDate | (year: number, month: number, day: number) | void | تنظیم حداقل تاریخ مجاز |
| setMaxDate | (year: number, month: number, day: number) | void | تنظیم حداکثر تاریخ مجاز |
| setDisabledDatesFn | (fn: (year: number, month: number, day: number) => boolean) | void | تنظیم تابعی برای تعیین تاریخهای غیرفعال |
| setRange | (start: [number, number, number], end: [number, number, number]) | void | تنظیم بازه تاریخ (در حالت بازه) |
| getRange | () | { start: [number, number, number] \| null, end: [number, number, number] \| null } | دریافت بازه انتخاب شده فعلی |
| clear | () | void | پاک کردن تاریخ یا بازه انتخاب شده |
| seteventTypes | (types: string \| string[]) | void | تنظیم انواع تعطیلات برای نمایش |
| geteventTypes | () | string[] | دریافت انواع تعطیلات فعلی |
| isShowingAllTypes | () | boolean | بررسی نمایش همه انواع تعطیلات |
| isSelectedDateHoliday | () | boolean | بررسی تعطیلی تاریخ انتخاب شده فعلی |
| getSelectedDateEvents | () | any[] | دریافت رویدادهای تاریخ انتخاب شده فعلی |
## استفاده پیشرفته
### انتخاب بازه تاریخ
برای فعال کردن حالت انتخاب بازه تاریخ:
```html
<persian-datepicker-element range-mode></persian-datepicker-element>
```
در React:
```tsx
<PersianDatepicker rangeMode />
```
در Vue:
```vue
<PersianDatepicker :range-mode="true" />
```
در Angular:
```html
<persian-datepicker [rangeMode]="true"></persian-datepicker>
```
### شخصیسازی عناصر رابط کاربری
میتوانید نمایش عناصر مختلف رابط کاربری را کنترل کنید:
```html
<persian-datepicker-element
show-month-selector="false"
show-year-selector="true"
show-prev-button="true"
show-next-button="true"
show-today-button="false"
show-tomorrow-button="true"
></persian-datepicker-element>
```
### متن و استایل سفارشی دکمهها
```html
<persian-datepicker-element
today-button-text="برو به امروز"
tomorrow-button-text="روز بعد"
today-button-class="primary rounded"
tomorrow-button-class="secondary rounded"
></persian-datepicker-element>
```
### حالت تاریک
```html
<persian-datepicker-element dark-mode></persian-datepicker-element>
```
### استایل CSS سفارشی
```html
<style>
persian-datepicker-element {
--jdp-primary: #3b82f6;
--jdp-font-family: 'Vazir', sans-serif;
}
</style>
```
## تاریخهای غیرفعال
سه روش برای مشخص کردن تاریخهای غیرفعال وجود دارد:
### ۱. تابع سراسری
تعریف یک تابع در محدوده سراسری و ارجاع به آن با نام:
```html
<script>
function isWeekend(year, month, day) {
const date = new Date(year, month - 1, day);
const dayOfWeek = date.getDay();
return dayOfWeek === 5 || dayOfWeek === 6; // غیرفعال کردن جمعه و شنبه (تعطیلات هفتگی)
}
</script>
<persian-datepicker-element disabled-dates="isWeekend"></persian-datepicker-element>
```
### ۲. متد المان
تعریف یک متد مستقیماً روی المان پس از دریافت آن:
```html
<persian-datepicker-element id="my-picker"></persian-datepicker-element>
<script>
const picker = document.getElementById('my-picker');
// اضافه کردن یک متد به المان
picker.isHoliday = function(year, month, day) {
// منطق سفارشی برای تعیین تعطیلات
return day === 13; // غیرفعال کردن روز ۱۳ هر ماه به عنوان مثال
};
// ارجاع به متد با نام
picker.setAttribute('disabled-dates', 'isHoliday');
</script>
```
### ۳. انتساب مستقیم تابع (توصیه شده برای کاربران فریمورک)
برای React، Vue یا سایر کاربران فریمورک، میتوانید مستقیماً یک تابع را ارسال کنید:
```tsx
// مثال React
import { PersianDatepicker } from 'react-persian-datepicker-element';
function App() {
// تعریف تابع به صورت محلی
const isEvenDay = (year, month, day) => {
return day % 2 === 0; // غیرفعال کردن روزهای زوج
};
return (
<PersianDatepicker
placeholder="انتخاب تاریخ"
disabledDates={isEvenDay}
/>
);
}
```
همچنین میتوانید از متد `setDisabledDatesFn` مستقیماً استفاده کنید:
```javascript
const picker = document.getElementById('my-picker');
picker.setDisabledDatesFn((year, month, day) => {
return day % 2 === 0; // غیرفعال کردن روزهای زوج
});
```
## متغیرهای CSS
| متغیر | پیشفرض | توضیحات |
|----------|---------|-------------|
| --jdp-primary | #0891b2 | رنگ اصلی |
| --jdp-primary-hover | #0e7490 | رنگ اصلی در حالت هاور |
| --jdp-primary-foreground | #ffffff | رنگ متن اصلی |
| --jdp-background | #ffffff | رنگ پسزمینه |
| --jdp-foreground | #1e293b | رنگ متن |
| --jdp-muted | #f1f5f9 | رنگ پسزمینه کمرنگ |
| --jdp-muted-foreground | #64748b | رنگ متن کمرنگ |
| --jdp-border | #e2e8f0 | رنگ حاشیه |
| --jdp-ring | #0284c7 | رنگ حلقه فوکوس |
| --jdp-holiday-color | #ef4444 | رنگ متن تعطیلات |
| --jdp-holiday-bg | #fee2e2 | رنگ پسزمینه تعطیلات |
| --jdp-holiday-hover-bg | #fecaca | رنگ پسزمینه تعطیلات در حالت هاور |
| --jdp-range-bg | rgba(8, 145, 178, 0.1) | رنگ پسزمینه انتخاب بازه |
| --jdp-range-color | var(--jdp-foreground) | رنگ متن انتخاب بازه |
| --jdp-range-start-bg | var(--jdp-primary) | رنگ پسزمینه شروع بازه |
| --jdp-range-start-color | var(--jdp-primary-foreground) | رنگ متن شروع بازه |
| --jdp-range-end-bg | var(--jdp-primary) | رنگ پسزمینه پایان بازه |
| --jdp-range-end-color | var(--jdp-primary-foreground) | رنگ متن پایان بازه |
| --jdp-border-radius | 0.5rem | گردی حاشیه |
| --jdp-font-family | system-ui | خانواده فونت |
| --jdp-font-size | 14px | اندازه فونت |
| --jdp-line-height | 1.5 | ارتفاع خط |
| --jdp-font-weight | 400 | وزن فونت |
| --jdp-font-weight-medium | 500 | وزن فونت متوسط |
| --jdp-day-name-font-size | 12px | اندازه فونت نام روز |
| --jdp-day-name-font-weight | 400 | وزن فونت نام روز |
| --jdp-day-font-size | 13px | اندازه فونت روز |
| --jdp-day-font-weight | 400 | وزن فونت روز |
| --jdp-month-year-font-size | 14px | اندازه فونت ماه/سال |
| --jdp-month-year-font-weight | 500 | وزن فونت ماه/سال |
| --jdp-nav-button-size | 30px | اندازه دکمههای ناوبری |
| --jdp-day-cell-size | 32px | اندازه سلول روز |
| --jdp-day-cell-margin | 1px | فاصله سلول روز |
| --jdp-day-cell-border-radius | var(--jdp-border-radius) | گردی حاشیه سلول روز |
| --jdp-day-hover-bg | var(--jdp-muted) | رنگ پسزمینه روز در حالت هاور |
| --jdp-day-selected-bg | var(--jdp-primary) | رنگ پسزمینه روز انتخاب شده |
| --jdp-day-selected-color | var(--jdp-primary-foreground) | رنگ متن روز انتخاب شده |
| --jdp-day-today-border-color | var(--jdp-primary) | رنگ حاشیه امروز |
| --jdp-day-today-border-width | 1px | ضخامت حاشیه امروز |
| --jdp-day-disabled-opacity | 0.4 | شفافیت روز غیرفعال |
| --jdp-transition-duration | 0.2s | مدت زمان انیمیشن |
| --jdp-direction | rtl | جهت متن (rtl یا ltr) |
## ویژگیهای خاص فریمورکها
### React
- پشتیبانی کامل از TypeScript
- ارسال ref برای متدهای دستوری
- مدیریت رویدادهای React
- حالتهای کنترل شده و کنترل نشده
- هوکهای سفارشی برای دستکاری تاریخ
### Vue
- پشتیبانی از Vue 3 Composition API
- پشتیبانی از TypeScript
- مدیریت رویدادهای Vue
- پشتیبانی از v-model
- دستورات سفارشی برای فرمتبندی تاریخ
### Angular
- پشتیبانی از Angular Ivy
- پشتیبانی از TypeScript
- اتصال رویدادهای Angular
- یکپارچهسازی با فرمهای واکنشی
- لولههای سفارشی برای فرمتبندی تاریخ
## پشتیبانی از موبایل
کامپوننت شامل پشتیبانی داخلی برای دستگاههای موبایل است:
- ژستهای لمس برای ناوبری ماه
- راهنماهای بهینهشده برای موبایل
- طراحی واکنشگرا
- عناصر رابط کاربری مناسب برای لمس
## پشتیبانی از مرورگرها
- Chrome 67+
- Firefox 63+
- Safari 10.1+
- Edge 79+
## عیبیابی
### مشکلات رایج
۱. **عدم نمایش کامپوننت**: مطمئن شوید که کامپوننت را به درستی وارد کردهاید و اسکریپت قبل از استفاده از کامپوننت بارگذاری شده است.
۲. **عدم اجرای رویدادها**: بررسی کنید که از نام رویداد صحیح استفاده میکنید و مدیریتکننده رویداد به درستی متصل شده است.
۳. **مشکلات استایل**: تأیید کنید که متغیرهای CSS شما به درستی تعریف شدهاند و هیچ استایل متضادی وجود ندارد.
۴. **مشکلات فرمت تاریخ**: اطمینان حاصل کنید که رشته فرمت معتبر است و تاریخ در فرمت صحیح است.
۵. **عدم نمایش تعطیلات**: بررسی کنید که ویژگی `show-holidays` روی `true` تنظیم شده است و ویژگی `holiday-types` شامل انواع تعطیلات مورد نظر است.
### اشکالزدایی
برای اهداف اشکالزدایی، میتوانید ثبتنویسی دقیق را فعال کنید:
```javascript
const picker = document.getElementById('my-picker');
picker.setAttribute('debug', 'true');
```
این کار اطلاعات اضافی را در کنسول ثبت میکند که میتواند به شناسایی مشکلات کمک کند.
## مشارکت
مشارکتها مورد استقبال هستند! لطفاً [راهنمای مشارکت](CONTRIBUTING.md) ما را برای جزئیات کد رفتار و فرآیند ارسال درخواستهای pull بخوانید.
## مجوز
این پروژه تحت مجوز MIT مجوز دارد - برای جزئیات به فایل [LICENSE](LICENSE) مراجعه کنید.