ethio-calendar-converter-angular
Version:
Ethiopian Calendar Converter for Angular applications
659 lines (627 loc) • 28.3 kB
JavaScript
import * as i0 from '@angular/core';
import { Injectable, EventEmitter, Component, Output, NgModule } from '@angular/core';
import * as i3 from '@angular/forms';
import { FormsModule } from '@angular/forms';
import * as i2 from '@angular/common';
import { CommonModule } from '@angular/common';
class EthiopianCalendarService {
// Ethiopian calendar constants
ETHIOPIAN_MONTHS = 13;
ETHIOPIAN_DAYS_IN_MONTH = 30;
ETHIOPIAN_PAGUME_DAYS = 5; // 6 in leap year
isEthiopianLeapYear(year) {
return (year + 1) % 4 === 0;
}
isGregorianLeapYear(year) {
return (year % 4 === 0 && year % 100 !== 0) || (year % 400 === 0);
}
validateEthiopianDate(date) {
if (date.month < 1 || date.month > this.ETHIOPIAN_MONTHS)
return false;
if (date.month === this.ETHIOPIAN_MONTHS) {
const maxDays = this.isEthiopianLeapYear(date.year) ?
this.ETHIOPIAN_PAGUME_DAYS + 1 :
this.ETHIOPIAN_PAGUME_DAYS;
return date.day >= 1 && date.day <= maxDays;
}
return date.day >= 1 && date.day <= this.ETHIOPIAN_DAYS_IN_MONTH;
}
toGregorian(ethiopianDate) {
if (!this.validateEthiopianDate(ethiopianDate)) {
throw new Error('Invalid Ethiopian date');
}
let { year, month, day } = ethiopianDate;
// Calculate the number of days from Ethiopian new year to the given date
let daysDiff = (month - 1) * this.ETHIOPIAN_DAYS_IN_MONTH + day;
// Basic conversion (Ethiopian new year is typically September 11/12)
let gregorianYear = year + 7;
let gregorianMonth = 9; // September
let gregorianDay = 10; // Start from September 10
// Adjust for Ethiopian leap year
if (this.isEthiopianLeapYear(year)) {
gregorianDay += 1;
}
// Add the difference in days
gregorianDay += daysDiff;
// Adjust the Gregorian date
const gregorianMonthDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
if (this.isGregorianLeapYear(gregorianYear)) {
gregorianMonthDays[1] = 29;
}
// Adjust month and day
while (gregorianDay > gregorianMonthDays[gregorianMonth - 1]) {
gregorianDay -= gregorianMonthDays[gregorianMonth - 1];
gregorianMonth++;
if (gregorianMonth > 12) {
gregorianMonth = 1;
gregorianYear++;
if (this.isGregorianLeapYear(gregorianYear)) {
gregorianMonthDays[1] = 29;
}
else {
gregorianMonthDays[1] = 28;
}
}
}
return {
year: gregorianYear,
month: gregorianMonth,
day: gregorianDay
};
}
toEthiopian(gregorianDate) {
let { year, month, day } = gregorianDate;
// Find the Ethiopian year
let ethiopianYear = year - 8;
// Calculate days from Ethiopian new year (September 11/12)
const gregorianMonthDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
if (this.isGregorianLeapYear(year)) {
gregorianMonthDays[1] = 29;
}
// Calculate the Ethiopian date
let ethiopianMonth = 1;
let ethiopianDay = 1;
// Adjust based on the Gregorian date
if (month > 9 || (month === 9 && day > 11)) {
ethiopianYear++;
}
// Calculate days from Ethiopian new year
let daysDiff = 0;
if (month > 9) {
// Add days from September to current month
for (let m = 9; m < month; m++) {
daysDiff += gregorianMonthDays[m - 1];
}
daysDiff += day - 11;
}
else if (month < 9) {
// Add remaining days from September to December
for (let m = 9; m <= 12; m++) {
daysDiff += gregorianMonthDays[m - 1];
}
// Add days from January to current month
for (let m = 1; m < month; m++) {
daysDiff += gregorianMonthDays[m - 1];
}
daysDiff += day - 11;
}
else {
// September
daysDiff = day - 11;
}
// Convert days difference to Ethiopian date
ethiopianMonth = Math.floor(daysDiff / 30) + 1;
ethiopianDay = (daysDiff % 30) + 1;
return {
year: ethiopianYear,
month: ethiopianMonth,
day: ethiopianDay
};
}
// Helper method to format dates
formatDate(date, isEthiopian = true) {
const { year, month, day } = date;
return `${year}-${month.toString().padStart(2, '0')}-${day.toString().padStart(2, '0')}${isEthiopian ? ' (Ethiopian)' : ' (Gregorian)'}`;
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EthiopianCalendarService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EthiopianCalendarService, providedIn: 'root' });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EthiopianCalendarService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}] });
class EthiopianCalendarComponent {
calendarService;
ethiopianDate = { year: 2015, month: 4, day: 25 };
gregorianDate = { year: 2022, month: 3, day: 25 };
lastConversion = '';
showEthiopianPicker = false;
ethiopianMonths = [
{ value: 1, label: 'Meskerem' },
{ value: 2, label: 'Tikimt' },
{ value: 3, label: 'Hidar' },
{ value: 4, label: 'Tahsas' },
{ value: 5, label: 'Tir' },
{ value: 6, label: 'Yekatit' },
{ value: 7, label: 'Megabit' },
{ value: 8, label: 'Miyazia' },
{ value: 9, label: 'Ginbot' },
{ value: 10, label: 'Sene' },
{ value: 11, label: 'Hamle' },
{ value: 12, label: 'Nehase' },
{ value: 13, label: 'Pagume' }
];
get ethiopianYears() {
const currentYear = new Date().getFullYear();
const years = [];
for (let i = currentYear - 100; i <= currentYear + 100; i++) {
years.push(i - 8); // Convert to approximate Ethiopian year
}
return years;
}
ethiopianDateChange = new EventEmitter();
gregorianDateChange = new EventEmitter();
constructor(calendarService) {
this.calendarService = calendarService;
}
toggleEthiopianPicker() {
this.showEthiopianPicker = !this.showEthiopianPicker;
}
getEthiopianDays() {
const maxDays = this.ethiopianDate.month === 13 ?
(this.calendarService['isEthiopianLeapYear'](this.ethiopianDate.year) ? 6 : 5) :
30;
return Array.from({ length: maxDays }, (_, i) => i + 1);
}
applyEthiopianDate() {
this.convertToGregorian();
this.toggleEthiopianPicker();
}
formatEthiopianDateForDisplay(date) {
const monthName = this.ethiopianMonths.find(m => m.value === date.month)?.label || '';
return `${monthName} ${date.day}, ${date.year}`;
}
convertToGregorian() {
try {
this.gregorianDate = this.calendarService.toGregorian(this.ethiopianDate);
this.gregorianDateChange.emit(this.gregorianDate);
this.lastConversion = `Ethiopian ${this.formatDate(this.ethiopianDate)} → Gregorian ${this.formatDate(this.gregorianDate)}`;
}
catch (error) {
this.lastConversion = 'Invalid Ethiopian date';
}
}
convertToEthiopian() {
try {
this.ethiopianDate = this.calendarService.toEthiopian(this.gregorianDate);
this.ethiopianDateChange.emit(this.ethiopianDate);
this.lastConversion = `Gregorian ${this.formatDate(this.gregorianDate)} → Ethiopian ${this.formatDate(this.ethiopianDate)}`;
}
catch (error) {
this.lastConversion = 'Invalid Gregorian date';
}
}
onGregorianDateSelected(event) {
const date = new Date(event.target.value);
this.gregorianDate = {
year: date.getFullYear(),
month: date.getMonth() + 1,
day: date.getDate()
};
this.convertToEthiopian();
}
formatDate(date) {
return `${date.year}-${String(date.month).padStart(2, '0')}-${String(date.day).padStart(2, '0')}`;
}
formatDateForInput(date) {
return `${date.year}-${String(date.month).padStart(2, '0')}-${String(date.day).padStart(2, '0')}`;
}
formatGregorianDate(date) {
return new Date(date.year, date.month - 1, date.day)
.toLocaleDateString('en-US', {
year: 'numeric',
month: 'long',
day: 'numeric'
});
}
weekDays = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
previousMonth() {
if (this.ethiopianDate.month > 1) {
this.ethiopianDate.month--;
}
else {
this.ethiopianDate.month = 13;
this.ethiopianDate.year--;
}
this.updateEthiopianDate();
}
nextMonth() {
if (this.ethiopianDate.month < 13) {
this.ethiopianDate.month++;
}
else {
this.ethiopianDate.month = 1;
this.ethiopianDate.year++;
}
this.updateEthiopianDate();
}
getDaysArray() {
const daysInMonth = this.ethiopianDate.month === 13 ?
(this.calendarService['isEthiopianLeapYear'](this.ethiopianDate.year) ? 6 : 5) :
30;
// Create array with padding for alignment
const days = [];
const firstDayOffset = this.getFirstDayOffset();
// Add padding
for (let i = 0; i < firstDayOffset; i++) {
days.push(0);
}
// Add days
for (let i = 1; i <= daysInMonth; i++) {
days.push(i);
}
return days;
}
getFirstDayOffset() {
// This is a simplified version - you might want to implement proper Ethiopian calendar day-of-week calculation
return (this.ethiopianDate.month * 2) % 7;
}
getDayClasses(day) {
const baseClasses = 'h-8 w-8 rounded-full flex items-center justify-center text-sm';
const isSelected = day === this.ethiopianDate.day;
if (isSelected) {
return `${baseClasses} bg-blue-600 text-white`;
}
return `${baseClasses} hover:bg-gray-100 text-gray-700`;
}
selectDay(day) {
this.ethiopianDate.day = day;
this.updateEthiopianDate();
this.toggleEthiopianPicker();
}
selectToday() {
const today = this.calendarService.toEthiopian({
year: new Date().getFullYear(),
month: new Date().getMonth() + 1,
day: new Date().getDate()
});
this.ethiopianDate = today;
this.updateEthiopianDate();
this.toggleEthiopianPicker();
}
updateEthiopianDate() {
this.ethiopianDateChange.emit(this.ethiopianDate);
this.convertToGregorian();
}
formatEthiopianDateForInput(date) {
const monthName = this.ethiopianMonths.find(m => m.value === date.month)?.label || '';
return `${monthName} ${date.day}, ${date.year}`;
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EthiopianCalendarComponent, deps: [{ token: EthiopianCalendarService }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: EthiopianCalendarComponent, isStandalone: true, selector: "ethiopian-calendar", outputs: { ethiopianDateChange: "ethiopianDateChange", gregorianDateChange: "gregorianDateChange" }, ngImport: i0, template: `
<div class="bg-white rounded-lg shadow-lg p-6 max-w-md mx-auto">
<!-- Ethiopian Calendar Input -->
<div class="mb-8">
<h3 class="text-lg font-medium text-gray-900 mb-4">Ethiopian Calendar</h3>
<div class="relative">
<input
type="text"
[value]="formatEthiopianDateForInput(ethiopianDate)"
(click)="toggleEthiopianPicker()"
readonly
class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-all cursor-pointer"
/>
<label class="absolute -top-2 left-2 bg-white px-1 text-xs text-gray-600">Select Date</label>
<!-- Calendar Icon -->
<button
(click)="toggleEthiopianPicker()"
class="absolute right-2 top-2 text-gray-400 hover:text-gray-600 focus:outline-none"
>
<svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" />
</svg>
</button>
<!-- Ethiopian Calendar Picker -->
<div *ngIf="showEthiopianPicker"
class="absolute left-0 mt-1 p-4 bg-white rounded-lg shadow-lg border border-gray-200 z-50 w-[320px]">
<!-- Month and Year Navigation -->
<div class="flex justify-between items-center mb-4">
<button
(click)="previousMonth()"
class="p-1 hover:bg-gray-100 rounded-full"
>
<svg class="h-5 w-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 19l-7-7 7-7" />
</svg>
</button>
<div class="flex items-center space-x-2">
<select
[(ngModel)]="ethiopianDate.month"
(change)="updateEthiopianDate()"
class="text-sm border-none bg-transparent font-semibold focus:outline-none focus:ring-0"
>
<option *ngFor="let month of ethiopianMonths" [value]="month.value">
{{month.label}}
</option>
</select>
<select
[(ngModel)]="ethiopianDate.year"
(change)="updateEthiopianDate()"
class="text-sm border-none bg-transparent font-semibold focus:outline-none focus:ring-0"
>
<option *ngFor="let year of ethiopianYears" [value]="year">{{year}}</option>
</select>
</div>
<button
(click)="nextMonth()"
class="p-1 hover:bg-gray-100 rounded-full"
>
<svg class="h-5 w-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" />
</svg>
</button>
</div>
<!-- Calendar Grid -->
<div class="grid grid-cols-7 gap-1">
<!-- Week days -->
<div *ngFor="let day of weekDays"
class="text-center text-xs font-medium text-gray-500 py-1">
{{day}}
</div>
<!-- Days -->
<ng-container *ngFor="let day of getDaysArray()">
<button *ngIf="day !== 0"
(click)="selectDay(day)"
[class]="getDayClasses(day)"
>
{{day}}
</button>
<div *ngIf="day === 0" class="h-8"></div>
</ng-container>
</div>
<!-- Today Button -->
<div class="mt-4 flex justify-between items-center border-t pt-4">
<button
(click)="selectToday()"
class="text-sm text-blue-600 hover:text-blue-800 font-medium"
>
Today
</button>
<button
(click)="toggleEthiopianPicker()"
class="text-sm text-gray-600 hover:text-gray-800 font-medium"
>
Close
</button>
</div>
</div>
</div>
<div *ngIf="ethiopianDate" class="mt-2 text-sm text-gray-600">
Selected: {{formatEthiopianDateForDisplay(ethiopianDate)}}
</div>
<button
(click)="convertToGregorian()"
class="mt-4 w-full bg-blue-600 text-white px-4 py-2 rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 transition-colors"
>
Convert to Gregorian
</button>
</div>
<!-- Gregorian Calendar Input -->
<div class="mb-8">
<h3 class="text-lg font-medium text-gray-900 mb-4">Gregorian Calendar</h3>
<div class="relative">
<input
type="date"
[value]="formatDateForInput(gregorianDate)"
(change)="onGregorianDateSelected($event)"
class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-all"
/>
<label class="absolute -top-2 left-2 bg-white px-1 text-xs text-gray-600">Select Date</label>
</div>
<div *ngIf="gregorianDate" class="mt-2 text-sm text-gray-600">
Selected: {{formatGregorianDate(gregorianDate)}}
</div>
<button
(click)="convertToEthiopian()"
class="mt-4 w-full bg-blue-600 text-white px-4 py-2 rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 transition-colors"
>
Convert to Ethiopian
</button>
</div>
<!-- Conversion Result -->
<div *ngIf="lastConversion"
class="p-4 bg-gray-50 rounded-lg border border-gray-200">
<p class="text-sm font-medium text-gray-900">Last Conversion:</p>
<p class="text-sm text-gray-600 mt-1">{{lastConversion}}</p>
</div>
</div>
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EthiopianCalendarComponent, decorators: [{
type: Component,
args: [{
selector: 'ethiopian-calendar',
standalone: true,
imports: [
CommonModule,
FormsModule
],
template: `
<div class="bg-white rounded-lg shadow-lg p-6 max-w-md mx-auto">
<!-- Ethiopian Calendar Input -->
<div class="mb-8">
<h3 class="text-lg font-medium text-gray-900 mb-4">Ethiopian Calendar</h3>
<div class="relative">
<input
type="text"
[value]="formatEthiopianDateForInput(ethiopianDate)"
(click)="toggleEthiopianPicker()"
readonly
class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-all cursor-pointer"
/>
<label class="absolute -top-2 left-2 bg-white px-1 text-xs text-gray-600">Select Date</label>
<!-- Calendar Icon -->
<button
(click)="toggleEthiopianPicker()"
class="absolute right-2 top-2 text-gray-400 hover:text-gray-600 focus:outline-none"
>
<svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" />
</svg>
</button>
<!-- Ethiopian Calendar Picker -->
<div *ngIf="showEthiopianPicker"
class="absolute left-0 mt-1 p-4 bg-white rounded-lg shadow-lg border border-gray-200 z-50 w-[320px]">
<!-- Month and Year Navigation -->
<div class="flex justify-between items-center mb-4">
<button
(click)="previousMonth()"
class="p-1 hover:bg-gray-100 rounded-full"
>
<svg class="h-5 w-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 19l-7-7 7-7" />
</svg>
</button>
<div class="flex items-center space-x-2">
<select
[(ngModel)]="ethiopianDate.month"
(change)="updateEthiopianDate()"
class="text-sm border-none bg-transparent font-semibold focus:outline-none focus:ring-0"
>
<option *ngFor="let month of ethiopianMonths" [value]="month.value">
{{month.label}}
</option>
</select>
<select
[(ngModel)]="ethiopianDate.year"
(change)="updateEthiopianDate()"
class="text-sm border-none bg-transparent font-semibold focus:outline-none focus:ring-0"
>
<option *ngFor="let year of ethiopianYears" [value]="year">{{year}}</option>
</select>
</div>
<button
(click)="nextMonth()"
class="p-1 hover:bg-gray-100 rounded-full"
>
<svg class="h-5 w-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" />
</svg>
</button>
</div>
<!-- Calendar Grid -->
<div class="grid grid-cols-7 gap-1">
<!-- Week days -->
<div *ngFor="let day of weekDays"
class="text-center text-xs font-medium text-gray-500 py-1">
{{day}}
</div>
<!-- Days -->
<ng-container *ngFor="let day of getDaysArray()">
<button *ngIf="day !== 0"
(click)="selectDay(day)"
[class]="getDayClasses(day)"
>
{{day}}
</button>
<div *ngIf="day === 0" class="h-8"></div>
</ng-container>
</div>
<!-- Today Button -->
<div class="mt-4 flex justify-between items-center border-t pt-4">
<button
(click)="selectToday()"
class="text-sm text-blue-600 hover:text-blue-800 font-medium"
>
Today
</button>
<button
(click)="toggleEthiopianPicker()"
class="text-sm text-gray-600 hover:text-gray-800 font-medium"
>
Close
</button>
</div>
</div>
</div>
<div *ngIf="ethiopianDate" class="mt-2 text-sm text-gray-600">
Selected: {{formatEthiopianDateForDisplay(ethiopianDate)}}
</div>
<button
(click)="convertToGregorian()"
class="mt-4 w-full bg-blue-600 text-white px-4 py-2 rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 transition-colors"
>
Convert to Gregorian
</button>
</div>
<!-- Gregorian Calendar Input -->
<div class="mb-8">
<h3 class="text-lg font-medium text-gray-900 mb-4">Gregorian Calendar</h3>
<div class="relative">
<input
type="date"
[value]="formatDateForInput(gregorianDate)"
(change)="onGregorianDateSelected($event)"
class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-all"
/>
<label class="absolute -top-2 left-2 bg-white px-1 text-xs text-gray-600">Select Date</label>
</div>
<div *ngIf="gregorianDate" class="mt-2 text-sm text-gray-600">
Selected: {{formatGregorianDate(gregorianDate)}}
</div>
<button
(click)="convertToEthiopian()"
class="mt-4 w-full bg-blue-600 text-white px-4 py-2 rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 transition-colors"
>
Convert to Ethiopian
</button>
</div>
<!-- Conversion Result -->
<div *ngIf="lastConversion"
class="p-4 bg-gray-50 rounded-lg border border-gray-200">
<p class="text-sm font-medium text-gray-900">Last Conversion:</p>
<p class="text-sm text-gray-600 mt-1">{{lastConversion}}</p>
</div>
</div>
`
}]
}], ctorParameters: () => [{ type: EthiopianCalendarService }], propDecorators: { ethiopianDateChange: [{
type: Output
}], gregorianDateChange: [{
type: Output
}] } });
class EthiopianCalendarModule {
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EthiopianCalendarModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.12", ngImport: i0, type: EthiopianCalendarModule, imports: [CommonModule,
FormsModule,
EthiopianCalendarComponent], exports: [EthiopianCalendarComponent] });
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EthiopianCalendarModule, providers: [
EthiopianCalendarService
], imports: [CommonModule,
FormsModule,
EthiopianCalendarComponent] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EthiopianCalendarModule, decorators: [{
type: NgModule,
args: [{
declarations: [],
imports: [
CommonModule,
FormsModule,
EthiopianCalendarComponent
],
exports: [
EthiopianCalendarComponent
],
providers: [
EthiopianCalendarService
]
}]
}] });
/**
* Generated bundle index. Do not edit.
*/
export { EthiopianCalendarComponent, EthiopianCalendarModule, EthiopianCalendarService };
//# sourceMappingURL=ethio-calendar-converter-angular.mjs.map