ngx-persian-datepicker-element
Version:
Angular wrapper for Persian DatePicker Web Component with signal-based inputs (English/Persian docs)
329 lines (268 loc) • 11.2 kB
Markdown
کامپوننت انگولار برای دیتپیکر فارسی، یک تقویم زیبای فارسی (جلالی) همراه با پشتیبانی از انواع تعطیلات.
✅ کامپوننت انگولار ساده برای استفاده
✅ پشتیبانی از سیگنالهای انگولار (انگولار ۱۷+)
✅ یکپارچهسازی با فرمهای ریاکتیو
✅ تقویم فارسی (جلالی)
✅ پشتیبانی از انواع تعطیلات (ایران، افغانستان، مذهبی و غیره)
✅ پشتیبانی از حالت تاریک
✅ پشتیبانی کامل از چینش راست به چپ (RTL)
✅ امکان شخصیسازی ظاهر
✅ پشتیبانی کامل از تایپاسکریپت
✅ بدون نیاز به CDN - کامپوننت وب به همراه کتابخانه ارائه میشود
```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
```
وارد کردن `NgxPersianDatepickerModule` در ماژول انگولار:
```typescript
import { NgxPersianDatepickerModule } from 'ngx-persian-datepicker-element';
@NgModule({
imports: [
NgxPersianDatepickerModule
]
})
export class AppModule { }
```
یا برای کامپوننتهای مستقل:
```typescript
import { NgxPersianDatepickerComponent } from 'ngx-persian-datepicker-element';
@Component({
// ...
imports: [NgxPersianDatepickerComponent]
// ...
})
export class YourStandaloneComponent { }
```
```html
<ngx-persian-datepicker-element
placeholderInput="انتخاب تاریخ"
formatInput="YYYY/MM/DD"
(dateChange)="onDateChange($event)">
</ngx-persian-datepicker-element>
```
```html
<form [formGroup]="myForm">
<ngx-persian-datepicker-element formControlName="date"></ngx-persian-datepicker-element>
</form>
```
```typescript
import { Component } from '@angular/core';
import { FormBuilder, FormGroup } from '@angular/forms';
@Component({
selector: 'app-example',
templateUrl: './example.component.html'
})
export class ExampleComponent {
myForm: FormGroup;
constructor(private fb: FormBuilder) {
this.myForm = this.fb.group({
date: [null]
});
}
}
```
شما میتوانید از نامهای مستقیم ورودی یا نامهای قدیمی (با پسوند "Input") استفاده کنید:
```html
<!-- استفاده از ورودیهای مبتنی بر سیگنال (توصیه شده برای انگولار ۱۷+) -->
<ngx-persian-datepicker-element
placeholderInput="انتخاب تاریخ"
formatInput="YYYY/MM/DD"
[]="true"
[]="['Iran', 'Religious']"
(dateChange)="onDateChange($event)">
</ngx-persian-datepicker-element>
<!-- استفاده از نامهای قدیمی (سازگار با تمام نسخههای انگولار) -->
<ngx-persian-datepicker-element
placeholderInput="انتخاب تاریخ"
formatInput="YYYY/MM/DD"
[]="true"
[]="['Iran', 'Religious']"
(dateChange)="onDateChange($event)">
</ngx-persian-datepicker-element>
```
> نکته: اگر از ورودیهای مستقیم استفاده میکنید و با خطای binding مواجه شدید، `CUSTOM_ELEMENTS_SCHEMA` را به schemas کامپوننت خود اضافه کنید:
>
> ```typescript
> import { Component, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
>
> @Component({
> // ...
> schemas: [CUSTOM_ELEMENTS_SCHEMA],
> // ...
> })
> export class YourComponent { }
> ```
دیتپیکر به طور کامل از حالت تاریک پشتیبانی میکند و شما میتوانید آن را به دو روش پیادهسازی کنید:
```css
/* استایلهای حالت روشن (پیشفرض) */
:root {
--jdp-background:
--jdp-foreground:
--jdp-muted:
--jdp-muted-foreground:
--jdp-border:
/* سایر متغیرها */
}
/* استایلهای حالت تاریک */
.dark persian-datepicker-element {
--jdp-background:
--jdp-foreground:
--jdp-muted:
--jdp-muted-foreground:
--jdp-border:
--jdp-input-border-color:
--jdp-calendar-shadow: 0px 10px 30px -5px rgba(2, 6, 23, 0.5);
--jdp-day-hover-bg:
/* سایر متغیرهای حالت تاریک */
}
```
```html
<div [ngClass]="{'dark': isDarkMode}">
<button (click)="toggleDarkMode()">تغییر حالت تاریک</button>
<ngx-persian-datepicker-element></ngx-persian-datepicker-element>
</div>
```
```typescript
@Component({
// ...
})
export class AppComponent implements AfterViewInit {
@ViewChild('datepicker') datepicker!: NgxPersianDatepickerComponent;
isDarkMode = false;
// متغیرهای حالت تاریک
darkThemeVars = {
'--jdp-background': '#1e1e2f',
'--jdp-foreground': '#e2e8f0',
'--jdp-muted': '#334155',
'--jdp-muted-foreground': '#94a3b8',
'--jdp-border': '#475569',
'--jdp-input-border-color': '#475569',
'--jdp-calendar-shadow': '0px 10px 30px -5px rgba(2, 6, 23, 0.5)',
'--jdp-day-hover-bg': '#334155'
};
// متغیرهای حالت روشن
lightThemeVars = {
'--jdp-background': '#ffffff',
'--jdp-foreground': '#1e293b',
'--jdp-muted': '#f1f5f9',
'--jdp-muted-foreground': '#64748b',
'--jdp-border': '#e2e8f0',
'--jdp-input-border-color': '#e2e8f0'
};
toggleDarkMode() {
this.isDarkMode = !this.isDarkMode;
const themeVars = this.isDarkMode ? this.darkThemeVars : this.lightThemeVars;
// اعمال متغیرها به دیتپیکر
if (this.datepicker) {
this.datepicker.applyThemeVariables(themeVars);
}
}
}
```
```typescript
constructor() {
// بررسی ترجیحات سیستم
const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
this.isDarkMode = mediaQuery.matches;
// گوش دادن به تغییرات
mediaQuery.addEventListener('change', (e) => {
this.isDarkMode = e.matches;
this.applyTheme();
});
}
applyTheme() {
const themeVars = this.isDarkMode ? this.darkThemeVars : this.lightThemeVars;
if (this.datepicker) {
this.datepicker.applyThemeVariables(themeVars);
}
}
```
دیتپیکر به طور کامل از چینش راست به چپ برای زبانهای فارسی و عربی پشتیبانی میکند:
```html
<ngx-persian-datepicker-element
[]="true"
placeholderInput="انتخاب تاریخ">
</ngx-persian-datepicker-element>
```
```html
<!-- در app.component.html -->
<div dir="rtl">
<!-- محتوای برنامه -->
<ngx-persian-datepicker-element></ngx-persian-datepicker-element>
</div>
```
یا با استفاده از binding انگولار:
```html
<div [dir]="'rtl'">
<!-- محتوای برنامه -->
</div>
```
```html
<ngx-persian-datepicker-element
placeholderInput="تاریخ سفارشی"
formatInput="YYYY/MM/DD"
primaryColorInput="#9c27b0"
primaryHoverInput="#7b1fa2"
backgroundColorInput="#f5f0fa"
foregroundColorInput="#333"
borderColorInput="#ddd"
borderRadiusInput="12px"
holidayColorInput="#e91e63"
holidayBgInput="#ffe6ec"
[]="true">
</ngx-persian-datepicker-element>
```
| ویژگی | نوع | توضیحات |
|----------|------|-------------|
| `placeholder` / `placeholderInput` | `string` | متن راهنما برای ورودی |
| `format` / `formatInput` | `string` | قالب تاریخ (به عنوان مثال 'YYYY/MM/DD') |
| `showEvents` / `showEventsInput` | `boolean` | نمایش تعطیلات در تقویم |
| `eventTypes` / `eventTypesInput` | `string` یا `string[]` | انواع تعطیلات برای نمایش (مانند 'Iran'، 'Religious'، 'National'، 'Afghanistan' یا 'all') |
| `rtl` / `rtlInput` | `boolean` | استفاده از چینش راست به چپ |
| `primaryColor` / `primaryColorInput` | `string` | رنگ اصلی دیتپیکر |
| `primaryHover` / `primaryHoverInput` | `string` | رنگ هاور اصلی دیتپیکر |
| `backgroundColor` / `backgroundColorInput` | `string` | رنگ پسزمینه دیتپیکر |
| `foregroundColor` / `foregroundColorInput` | `string` | رنگ متن دیتپیکر |
| `borderColor` / `borderColorInput` | `string` | رنگ حاشیه دیتپیکر |
| `borderRadius` / `borderRadiusInput` | `string` | شعاع حاشیه دیتپیکر |
| `fontFamily` / `fontFamilyInput` | `string` | فونت دیتپیکر |
| `holidayColor` / `holidayColorInput` | `string` | رنگ متن تعطیلات |
| `holidayBg` / `holidayBgInput` | `string` | رنگ پسزمینه تعطیلات |
| `cssVariables` / `cssVariablesInput` | `CSSVariableMap` | متغیرهای CSS سفارشی برای استایلدهی |
| رویداد | نوع | توضیحات |
|-------|------|-------------|
| `dateChange` | `EventEmitter<DateChangeEvent>` | زمانی که تاریخ انتخاب میشود منتشر میشود |
```typescript
interface DateChangeEvent {
jalali: [number, number, number]; // [سال، ماه، روز]
gregorian: [number, number, number]; // [سال، ماه، روز]
isHoliday: boolean;
events?: any[];
}
```
این کامپوننت از سیگنالهای انگولار برای ورودیها استفاده میکند، که باعث بهبود کارایی در انگولار ۱۷+ میشود. برای حفظ سازگاری با نسخههای قبلی، هم نام اصلی خاصیت (مانند `showEvents`) و هم نام قدیمی با پسوند (مانند `showEventsInput`) پشتیبانی میشوند.
MIT