@corp-products/ui-components 3.6.1 → 3.6.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/fesm2022/corp-products-ui-components.mjs +2272 -0
  2. package/fesm2022/corp-products-ui-components.mjs.map +1 -0
  3. package/index.d.ts +725 -0
  4. package/package.json +36 -22
  5. package/ng-package.json +0 -7
  6. package/src/enums/date-formatter.ts +0 -22
  7. package/src/helper/date-handler.ts +0 -142
  8. package/src/lib/alert-dialog/alert-dialog.component.html +0 -22
  9. package/src/lib/alert-dialog/alert-dialog.component.scss +0 -0
  10. package/src/lib/alert-dialog/alert-dialog.component.spec.ts +0 -22
  11. package/src/lib/alert-dialog/alert-dialog.component.ts +0 -44
  12. package/src/lib/alert-dialog/alert-dialog.interface.ts +0 -6
  13. package/src/lib/alert-dialog/alert-dialog.service.ts +0 -33
  14. package/src/lib/app-accordion/app-accordion.component.html +0 -15
  15. package/src/lib/app-accordion/app-accordion.component.scss +0 -0
  16. package/src/lib/app-accordion/app-accordion.component.spec.ts +0 -21
  17. package/src/lib/app-accordion/app-accordion.component.ts +0 -21
  18. package/src/lib/app-accordion/index.ts +0 -2
  19. package/src/lib/app-breadcrumb/app-breadcrumb.component.html +0 -7
  20. package/src/lib/app-breadcrumb/app-breadcrumb.component.scss +0 -25
  21. package/src/lib/app-breadcrumb/app-breadcrumb.component.ts +0 -140
  22. package/src/lib/app-breadcrumb/app-breadcrumb.interface.ts +0 -15
  23. package/src/lib/app-button/app-button.component.html +0 -7
  24. package/src/lib/app-button/app-button.component.scss +0 -0
  25. package/src/lib/app-button/app-button.component.ts +0 -14
  26. package/src/lib/app-button/app-button.ts +0 -15
  27. package/src/lib/app-button/index.ts +0 -2
  28. package/src/lib/app-dropdown-menu/app-dropdown-menu.component.html +0 -22
  29. package/src/lib/app-dropdown-menu/app-dropdown-menu.component.scss +0 -39
  30. package/src/lib/app-dropdown-menu/app-dropdown-menu.component.spec.ts +0 -21
  31. package/src/lib/app-dropdown-menu/app-dropdown-menu.component.ts +0 -43
  32. package/src/lib/app-dropdown-menu/app-dropdown-menu.ts +0 -17
  33. package/src/lib/app-dropdown-menu/index.ts +0 -2
  34. package/src/lib/app-dropdown-menu/menu-popup.pipe.ts +0 -18
  35. package/src/lib/app-header/app-header.component.html +0 -26
  36. package/src/lib/app-header/app-header.component.scss +0 -0
  37. package/src/lib/app-header/app-header.component.ts +0 -43
  38. package/src/lib/app-side-menu/app-side-menu.component.html +0 -20
  39. package/src/lib/app-side-menu/app-side-menu.component.ts +0 -28
  40. package/src/lib/app-side-menu/routes-names.ts +0 -28
  41. package/src/lib/app-side-menu/side-menu-items.ts +0 -45
  42. package/src/lib/app-side-menu/side-menu.ts +0 -12
  43. package/src/lib/app-tabs/app-tab.interface.ts +0 -27
  44. package/src/lib/app-tabs/app-tabs.component.html +0 -37
  45. package/src/lib/app-tabs/app-tabs.component.scss +0 -103
  46. package/src/lib/app-tabs/app-tabs.component.spec.ts +0 -21
  47. package/src/lib/app-tabs/app-tabs.component.ts +0 -67
  48. package/src/lib/app-tabs/index.ts +0 -2
  49. package/src/lib/bottom-sheet/bottom-sheet.component.html +0 -18
  50. package/src/lib/bottom-sheet/bottom-sheet.component.scss +0 -31
  51. package/src/lib/bottom-sheet/bottom-sheet.component.ts +0 -26
  52. package/src/lib/confirmation-dialog/confirmation-dialog.component.html +0 -37
  53. package/src/lib/confirmation-dialog/confirmation-dialog.component.scss +0 -0
  54. package/src/lib/confirmation-dialog/confirmation-dialog.component.spec.ts +0 -22
  55. package/src/lib/confirmation-dialog/confirmation-dialog.component.ts +0 -64
  56. package/src/lib/confirmation-dialog/confirmation-dialog.interface.ts +0 -13
  57. package/src/lib/confirmation-dialog/confirmation-dialog.service.ts +0 -34
  58. package/src/lib/dual-calender/date-picker-switcher/date-picker-switcher.component.html +0 -27
  59. package/src/lib/dual-calender/date-picker-switcher/date-picker-switcher.component.scss +0 -22
  60. package/src/lib/dual-calender/date-picker-switcher/date-picker-switcher.component.ts +0 -64
  61. package/src/lib/dual-calender/dual-calendar.component.html +0 -32
  62. package/src/lib/dual-calender/dual-calendar.component.scss +0 -265
  63. package/src/lib/dual-calender/dual-calendar.component.ts +0 -158
  64. package/src/lib/dual-calender/gregorian-calendar/gregorian-calendar.component.html +0 -21
  65. package/src/lib/dual-calender/gregorian-calendar/gregorian-calendar.component.scss +0 -0
  66. package/src/lib/dual-calender/gregorian-calendar/gregorian-calendar.component.spec.ts +0 -21
  67. package/src/lib/dual-calender/gregorian-calendar/gregorian-calendar.component.ts +0 -65
  68. package/src/lib/dual-calender/hijri-calendar/hijri-calendar.component.html +0 -10
  69. package/src/lib/dual-calender/hijri-calendar/hijri-calendar.component.scss +0 -0
  70. package/src/lib/dual-calender/hijri-calendar/hijri-calendar.component.spec.ts +0 -21
  71. package/src/lib/dual-calender/hijri-calendar/hijri-calendar.component.ts +0 -66
  72. package/src/lib/dual-calender/services/gregorian-i18n.service.ts +0 -123
  73. package/src/lib/dual-calender/services/islamic-i18n.service.ts +0 -119
  74. package/src/lib/dual-calender/utils/date-i18n.utils.ts +0 -58
  75. package/src/lib/dynamic-form/dynamic-form.component.html +0 -84
  76. package/src/lib/dynamic-form/dynamic-form.component.scss +0 -0
  77. package/src/lib/dynamic-form/dynamic-form.component.spec.ts +0 -21
  78. package/src/lib/dynamic-form/dynamic-form.component.ts +0 -58
  79. package/src/lib/dynamic-form/dynamic-form.interface.ts +0 -96
  80. package/src/lib/dynamic-side-bar-v2/dynamic-sidebar.component.html +0 -32
  81. package/src/lib/dynamic-side-bar-v2/dynamic-sidebar.component.scss +0 -3
  82. package/src/lib/dynamic-side-bar-v2/dynamic-sidebar.component.ts +0 -82
  83. package/src/lib/dynamic-side-bar-v2/dynamic-sidebar.config.ts +0 -31
  84. package/src/lib/dynamic-side-bar-v2/dynamic-sidebar.service.ts +0 -41
  85. package/src/lib/form-components/@utils/form-utils.ts +0 -12
  86. package/src/lib/form-components/@utils/validations/error-keys.enum.ts +0 -25
  87. package/src/lib/form-components/@utils/validations/form-validation.service.ts +0 -68
  88. package/src/lib/form-components/@utils/validations/index.ts +0 -4
  89. package/src/lib/form-components/@utils/validations/numbers-only.validator.ts +0 -10
  90. package/src/lib/form-components/@utils/validations/validation-message.pipe.ts +0 -24
  91. package/src/lib/form-components/components/auto-complete/auto-complete.component.html +0 -35
  92. package/src/lib/form-components/components/auto-complete/auto-complete.component.scss +0 -12
  93. package/src/lib/form-components/components/auto-complete/auto-complete.component.spec.ts +0 -21
  94. package/src/lib/form-components/components/auto-complete/auto-complete.component.ts +0 -82
  95. package/src/lib/form-components/components/base-input.component.ts +0 -35
  96. package/src/lib/form-components/components/date-picker/date-picker.component.html +0 -40
  97. package/src/lib/form-components/components/date-picker/date-picker.component.scss +0 -32
  98. package/src/lib/form-components/components/date-picker/date-picker.component.spec.ts +0 -21
  99. package/src/lib/form-components/components/date-picker/date-picker.component.ts +0 -81
  100. package/src/lib/form-components/components/date-picker/date-picker.validator.ts +0 -38
  101. package/src/lib/form-components/components/input/input.component.html +0 -80
  102. package/src/lib/form-components/components/input/input.component.scss +0 -46
  103. package/src/lib/form-components/components/input/input.component.spec.ts +0 -21
  104. package/src/lib/form-components/components/input/input.component.ts +0 -56
  105. package/src/lib/form-components/components/select/select.component.html +0 -123
  106. package/src/lib/form-components/components/select/select.component.scss +0 -53
  107. package/src/lib/form-components/components/select/select.component.spec.ts +0 -21
  108. package/src/lib/form-components/components/select/select.component.ts +0 -87
  109. package/src/lib/form-components/components/select-button/select-button.component.html +0 -21
  110. package/src/lib/form-components/components/select-button/select-button.component.scss +0 -0
  111. package/src/lib/form-components/components/select-button/select-button.component.spec.ts +0 -21
  112. package/src/lib/form-components/components/select-button/select-button.component.ts +0 -22
  113. package/src/lib/form-components/components/switcher/switch.component.html +0 -5
  114. package/src/lib/form-components/components/switcher/switch.component.scss +0 -0
  115. package/src/lib/form-components/components/switcher/switch.component.spec.ts +0 -21
  116. package/src/lib/form-components/components/switcher/switch.component.ts +0 -25
  117. package/src/lib/form-components/index.ts +0 -9
  118. package/src/lib/form-components/interfaces/index.ts +0 -1
  119. package/src/lib/form-components/interfaces/label-value.ts +0 -4
  120. package/src/lib/ico-moon-icon/ico-moon-icon.component.ts +0 -23
  121. package/src/lib/read-more/read-more.component.html +0 -17
  122. package/src/lib/read-more/read-more.component.scss +0 -0
  123. package/src/lib/read-more/read-more.component.spec.ts +0 -21
  124. package/src/lib/read-more/read-more.component.ts +0 -21
  125. package/src/lib/side-bar/side-bar.component.html +0 -24
  126. package/src/lib/side-bar/side-bar.component.scss +0 -22
  127. package/src/lib/side-bar/side-bar.component.spec.ts +0 -21
  128. package/src/lib/side-bar/side-bar.component.ts +0 -33
  129. package/src/lib/side-bar-dynamic/data-injector.pipe.ts +0 -15
  130. package/src/lib/side-bar-dynamic/dynamic-sidebar.service.ts +0 -116
  131. package/src/lib/side-bar-dynamic/side-bar-dynamic.component.html +0 -42
  132. package/src/lib/side-bar-dynamic/side-bar-dynamic.component.scss +0 -5
  133. package/src/lib/side-bar-dynamic/side-bar-dynamic.component.spec.ts +0 -21
  134. package/src/lib/side-bar-dynamic/side-bar-dynamic.component.ts +0 -37
  135. package/src/lib/side-bar-dynamic/side-bar-utils.ts +0 -30
  136. package/src/lib/side-bar-dynamic/sidebar-config.ts +0 -48
  137. package/src/lib/user-autocomplete-card/user-autocomplete-card.component.html +0 -20
  138. package/src/lib/user-autocomplete-card/user-autocomplete-card.component.scss +0 -0
  139. package/src/lib/user-autocomplete-card/user-autocomplete-card.component.spec.ts +0 -21
  140. package/src/lib/user-autocomplete-card/user-autocomplete-card.component.ts +0 -21
  141. package/src/lib/user-info/user-info.component.html +0 -10
  142. package/src/lib/user-info/user-info.component.ts +0 -11
  143. package/src/public-api.ts +0 -29
  144. package/tsconfig.lib.json +0 -18
  145. package/tsconfig.lib.prod.json +0 -11
  146. package/tsconfig.spec.json +0 -14
@@ -1,158 +0,0 @@
1
- import { Component, effect, ElementRef, EventEmitter, HostListener, Input, Output, signal, ViewChild, ViewEncapsulation } from '@angular/core';
2
- import { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';
3
- import { NgbCalendar, NgbDateStruct, NgbCalendarIslamicUmalqura, NgbDatepickerModule, NgbDate } from '@ng-bootstrap/ng-bootstrap';
4
- import { HijriCalendarComponent } from './hijri-calendar/hijri-calendar.component';
5
- import { GregorianCalendarComponent } from './gregorian-calendar/gregorian-calendar.component';
6
- import { FloatLabelModule } from 'primeng/floatlabel';
7
- import { DatePickerModule } from 'primeng/datepicker';
8
- import { trigger, state, style, transition, animate } from '@angular/animations';
9
- import { DatePickerSwitcherComponent } from './date-picker-switcher/date-picker-switcher.component';
10
- import '@angular/localize/init';
11
- import { getGregorianMonthName, getHijriMonthName } from './utils/date-i18n.utils';
12
- import { formatDate } from '@angular/common';
13
- import { DateFormats } from '../../enums/date-formatter';
14
- import { TranslatePipe } from '@ngx-translate/core';
15
- @Component({
16
- selector: 'app-dual-calendar',
17
- animations: [
18
- trigger('slideDown', [
19
- state('closed', style({
20
- height: '0px',
21
- opacity: 0,
22
- overflow: 'hidden'
23
- })),
24
- state('open', style({
25
- height: '*',
26
- opacity: 1,
27
- overflow: 'hidden'
28
- })),
29
- transition('closed <=> open', [
30
- animate('300ms ease')
31
- ])
32
- ])
33
- ],
34
- imports: [
35
- NgbDatepickerModule,
36
- FormsModule,
37
- FormsModule,
38
- ReactiveFormsModule,
39
- DatePickerModule,
40
- FloatLabelModule,
41
- HijriCalendarComponent,
42
- DatePickerSwitcherComponent,
43
- TranslatePipe,
44
- GregorianCalendarComponent
45
- ],
46
- providers: [
47
- { provide: NgbCalendar, useClass: NgbCalendarIslamicUmalqura }
48
- ],
49
- templateUrl: './dual-calendar.component.html',
50
- styleUrl: './dual-calendar.component.scss',
51
- encapsulation: ViewEncapsulation.None
52
- })
53
- export class DualCalendarComponent {
54
- selectedDate = ''
55
- @Input() control: FormControl<any> = new FormControl({ value: null, disabled: false }, []);
56
- @Input() label = '';
57
- @Input() name = '';
58
- @Input() withTime = true;
59
- @Input() isDatePickerShow = true;
60
- mode: 'gregorian' | 'hijri' = 'gregorian';
61
- gregorianModel!: NgbDateStruct;
62
- hijriModel!: NgbDateStruct;
63
- @Input() currentLang = signal<'ar' | 'en'>('ar');
64
- @Output() gregorianUTC = new EventEmitter<string>();
65
- gregorianUTCValue = ''
66
- @Input() isShown = false
67
- @ViewChild('calendarContainer') calendarContainer!: ElementRef;
68
- hijriCal = new NgbCalendarIslamicUmalqura();
69
- constructor() {
70
- effect(() => {
71
- this.currentLang(); // 👈 track signal
72
- this.setDate(this.gregorianUTCValue)
73
- });
74
- }
75
- ngOnInit() {
76
- this.setDate(this.control?.value);
77
-
78
- }
79
- setDate(value: string | null) {
80
- if (!value) return;
81
-
82
- const jsDate = new Date(value);
83
- if (isNaN(jsDate.getTime())) return;
84
-
85
- const ngbDate: NgbDateStruct = {
86
- year: jsDate.getFullYear(),
87
- month: jsDate.getMonth() + 1,
88
- day: jsDate.getDate()
89
- };
90
-
91
- // 🔥 Reuse existing logic
92
- this.onSelectGregorian(ngbDate);
93
- }
94
- @HostListener('document:click', ['$event'])
95
- onDocumentClick(event: MouseEvent) {
96
- if (!this.calendarContainer) return;
97
- const clickedInside = this.calendarContainer.nativeElement.contains(event.target);
98
- if (!clickedInside) {
99
- this.isShown = false;
100
- }
101
- }
102
- private structToNgbDate(d: NgbDateStruct): NgbDate {
103
- return new NgbDate(d.year, d.month, d.day);
104
- }
105
-
106
- onSelectGregorian(date: NgbDateStruct) {
107
- this.gregorianModel = date;
108
- // Convert to NgbDate
109
- const jsDate = new Date(date.year, date.month - 1, date.day);
110
- // fromGregorian expects NgbDate or JS Date (depending on version)
111
- const hijri = this.hijriCal.fromGregorian(jsDate);
112
- const isoUTC = jsDate.toISOString();
113
- this.gregorianUTCValue = this.withTime ? isoUTC : formatDate(jsDate, DateFormats.DATE_ONLY, 'en');
114
- this.gregorianUTC.emit(this.gregorianUTCValue);
115
- this.hijriModel = {
116
- year: hijri.year,
117
- month: hijri.month,
118
- day: hijri.day
119
- }; // datepicker
120
-
121
- this.selectedDate = this.formatHijri(this.structToNgbDate(this.hijriModel)); //input
122
- this.isShown = false;
123
- }
124
-
125
- onSelectHijri(date: NgbDateStruct) {
126
- this.hijriModel = date;
127
- const ngbDate = this.structToNgbDate(date);
128
- const greg = this.hijriCal.toGregorian(ngbDate);
129
- const isoUTC = greg.toISOString();
130
- this.gregorianModel = {
131
- year: greg.getFullYear(),
132
- month: greg.getMonth() + 1,
133
- day: greg.getDate()
134
- };
135
- const jsDate = new Date(this.gregorianModel.year, this.gregorianModel.month - 1, this.gregorianModel.day);
136
- this.gregorianUTCValue = this.withTime ? isoUTC : formatDate(jsDate, DateFormats.DATE_ONLY, 'en');
137
- this.gregorianUTC.emit(this.gregorianUTCValue);
138
- this.selectedDate = this.formatHijri(ngbDate);
139
- this.isShown = false;
140
- }
141
-
142
- showCalender(isOpen: boolean) {
143
- this.isShown = isOpen;
144
- }
145
-
146
- formatHijri(h: NgbDate): string {
147
- const hijriDay = h.day;
148
- const hijriMonth = getHijriMonthName(this.currentLang(), h.month);
149
- const hijriYear = h.year;
150
- const greg = this.hijriCal.toGregorian(h);
151
- const gregorianDay = greg.getDate();
152
- const gregorianMonth =
153
- getGregorianMonthName(this.currentLang(), greg.getMonth() + 1);
154
- const gregorianYear = greg.getFullYear();
155
- return `${gregorianDay} ${gregorianMonth} ${gregorianYear} - ${hijriDay} ${hijriMonth} ${hijriYear}`;
156
- }
157
-
158
- }
@@ -1,21 +0,0 @@
1
- @for(item of [calendarKey]; track item) {
2
- <ngb-datepicker #dp
3
- [class.rtl]="language === 'ar'"
4
- [class.ltr]="language === 'en'"
5
- [ngModel]="model"
6
- [startDate]="startDate"
7
- (ngModelChange)="onDateChange($event)"
8
- (dateSelect)="dateSelected.emit($event)"
9
- [dayTemplate]="dayTemplate"
10
- [markDisabled]="isDisabled">
11
- </ngb-datepicker>
12
- <ng-template #dayTemplate let-date let-currentMonth="currentMonth" let-selected="selected" let-disabled="disabled">
13
- <span class="custom-day"
14
- [class.today]="isToday(date)"
15
- [class.selected]="selected"
16
- [class.outside]="date.month !== currentMonth"
17
- [class.disabled]="disabled">
18
- {{ date.day }}
19
- </span>
20
- </ng-template>
21
- }
@@ -1,21 +0,0 @@
1
- import { ComponentFixture, TestBed } from "@angular/core/testing";
2
- import { GregorianCalendarComponent } from "./gregorian-calendar.component";
3
-
4
- describe("ReadMoreComponent", () => {
5
- let component: GregorianCalendarComponent;
6
- let fixture: ComponentFixture<GregorianCalendarComponent>;
7
-
8
- beforeEach(async () => {
9
- await TestBed.configureTestingModule({
10
- imports: [GregorianCalendarComponent]
11
- }).compileComponents();
12
-
13
- fixture = TestBed.createComponent(GregorianCalendarComponent);
14
- component = fixture.componentInstance;
15
- fixture.detectChanges();
16
- });
17
-
18
- it("should create", () => {
19
- expect(component).toBeTruthy();
20
- });
21
- });
@@ -1,65 +0,0 @@
1
- import { ChangeDetectorRef, Component, EventEmitter, inject, Input, OnChanges, Output, Renderer2, SimpleChanges, ViewEncapsulation } from '@angular/core';
2
- import {
3
- NgbCalendar,
4
- NgbCalendarGregorian,
5
- NgbDatepickerI18n,
6
- NgbDatepickerModule,
7
- NgbDateStruct,
8
- } from '@ng-bootstrap/ng-bootstrap';
9
- import { FormsModule } from '@angular/forms';
10
- import { DynamicGregorianI18n } from './../services/gregorian-i18n.service';
11
-
12
- @Component({
13
- selector: "app-gregorian-calendar",
14
- standalone: true,
15
- imports: [NgbDatepickerModule, FormsModule],
16
- providers: [
17
- { provide: NgbCalendar, useClass: NgbCalendarGregorian },
18
- { provide: NgbDatepickerI18n, useClass: DynamicGregorianI18n }
19
- ],
20
- templateUrl: "./gregorian-calendar.component.html",
21
- styleUrl: "./gregorian-calendar.component.scss",
22
- encapsulation: ViewEncapsulation.None,
23
- })
24
- export class GregorianCalendarComponent implements OnChanges {
25
- @Input() model!: NgbDateStruct;
26
- @Output() dateSelected = new EventEmitter<NgbDateStruct>();
27
- renderer = inject(Renderer2)
28
- @Input() language: 'ar' | 'en' = 'en';
29
- startDate!: NgbDateStruct;
30
- private calendar = new NgbCalendarGregorian();
31
- i18n = inject(NgbDatepickerI18n)
32
- cdr = inject(ChangeDetectorRef)
33
- calendarKey = 0;
34
-
35
- ngOnChanges(changes: SimpleChanges) {
36
- if (changes['model'] && changes['model'].currentValue) {
37
- this.startDate = { ...changes['model'].currentValue };
38
- }
39
- if (changes['language'] && this.i18n instanceof DynamicGregorianI18n) {
40
- this.i18n.setLanguage(this.language);
41
- this.calendarKey++; // Increment to force recreation
42
- }
43
- }
44
-
45
- ngAfterViewInit() {
46
- const buttons = document.querySelectorAll('.ngb-dp-arrow-btn');
47
- buttons.forEach(btn => {
48
- this.renderer.removeAttribute(btn, 'title');
49
- });
50
- }
51
-
52
- onDateChange(date: NgbDateStruct) {
53
- this.model = date;
54
- this.startDate = { ...date };
55
- }
56
-
57
- isToday(date: NgbDateStruct): boolean {
58
- const today = this.calendar.getToday();
59
- return date.year === today.year &&
60
- date.month === today.month &&
61
- date.day === today.day;
62
- }
63
-
64
- isDisabled = () => false;
65
- }
@@ -1,10 +0,0 @@
1
- <ngb-datepicker #dp [class.rtl]="language === 'ar'" [class.ltr]="language === 'en'" [ngModel]="model"
2
- [startDate]="startDate" (ngModelChange)="onDateChange($event)" (dateSelect)="dateSelected.emit($event)"
3
- [dayTemplate]="dayTemplate" [markDisabled]="isDisabled">
4
- </ngb-datepicker>
5
- <ng-template #dayTemplate let-date let-currentMonth="currentMonth" let-selected="selected" let-disabled="disabled">
6
- <span class="custom-day" [class.today]="isToday(date)" [class.selected]="selected"
7
- [class.outside]="date.month !== currentMonth" [class.disabled]="disabled">
8
- {{ date.day }}
9
- </span>
10
- </ng-template>
@@ -1,21 +0,0 @@
1
- import { ComponentFixture, TestBed } from "@angular/core/testing";
2
- import { HijriCalendarComponent } from "./hijri-calendar.component";
3
-
4
- describe("ReadMoreComponent", () => {
5
- let component: HijriCalendarComponent;
6
- let fixture: ComponentFixture<HijriCalendarComponent>;
7
-
8
- beforeEach(async () => {
9
- await TestBed.configureTestingModule({
10
- imports: [HijriCalendarComponent]
11
- }).compileComponents();
12
-
13
- fixture = TestBed.createComponent(HijriCalendarComponent);
14
- component = fixture.componentInstance;
15
- fixture.detectChanges();
16
- });
17
-
18
- it("should create", () => {
19
- expect(component).toBeTruthy();
20
- });
21
- });
@@ -1,66 +0,0 @@
1
- import { ChangeDetectorRef, Component, EventEmitter, inject, Input, OnChanges, Output, Renderer2, SimpleChanges } from '@angular/core';
2
- import {
3
- NgbCalendar,
4
- NgbCalendarIslamicUmalqura,
5
- NgbDatepickerI18n,
6
- NgbDatepickerModule,
7
- NgbDateStruct,
8
- } from '@ng-bootstrap/ng-bootstrap';
9
- import { FormsModule } from '@angular/forms';
10
- import { DynamicHijriI18n } from '../services/islamic-i18n.service';
11
-
12
- @Component({
13
- selector: "app-hijri-calendar",
14
- standalone: true,
15
- imports: [NgbDatepickerModule, FormsModule],
16
- providers: [
17
- { provide: NgbCalendar, useClass: NgbCalendarIslamicUmalqura },
18
- { provide: NgbDatepickerI18n, useClass: DynamicHijriI18n }
19
- ],
20
- templateUrl: "./hijri-calendar.component.html",
21
- styleUrl: "./hijri-calendar.component.scss"
22
- })
23
- export class HijriCalendarComponent implements OnChanges {
24
- @Input() model!: NgbDateStruct;
25
- @Output() dateSelected = new EventEmitter<NgbDateStruct>();
26
- @Input() language: 'ar' | 'en' = 'en';
27
- renderer = inject(Renderer2)
28
-
29
- startDate!: NgbDateStruct;
30
- private calendar = new NgbCalendarIslamicUmalqura();
31
- constructor(
32
- private i18n: NgbDatepickerI18n,
33
- private cdr: ChangeDetectorRef
34
- ) {
35
- }
36
- ngOnChanges(changes: SimpleChanges) {
37
- if (changes['model'] && changes['model'].currentValue) {
38
- this.startDate = { ...changes['model'].currentValue };
39
- console.log('Hijri navigating to:', this.startDate);
40
- }
41
-
42
- if (changes['language'] && this.i18n instanceof DynamicHijriI18n) {
43
- this.i18n.setLanguage(this.language);
44
- this.cdr.detectChanges(); // Force re-render to update labels
45
- }
46
- }
47
- ngAfterViewInit() {
48
- const buttons = document.querySelectorAll('.ngb-dp-arrow-btn');
49
- buttons.forEach(btn => {
50
- this.renderer.removeAttribute(btn, 'title');
51
- });
52
- }
53
- onDateChange(date: NgbDateStruct) {
54
- this.model = date;
55
- this.startDate = { ...date };
56
- }
57
-
58
- isToday(date: NgbDateStruct): boolean {
59
- const today = this.calendar.getToday();
60
- return date.year === today.year &&
61
- date.month === today.month &&
62
- date.day === today.day;
63
- }
64
-
65
- isDisabled = () => false;
66
- }
@@ -1,123 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { NgbDatepickerI18n, NgbDateStruct } from '@ng-bootstrap/ng-bootstrap';
3
- import { MONTHS_GREGORIAN, WEEKDAYS } from '../utils/date-i18n.utils';
4
-
5
-
6
- @Injectable()
7
- export class GregorianArabicI18n extends NgbDatepickerI18n {
8
- getMonthShortName(month: number): string {
9
- return MONTHS_GREGORIAN.ar[month - 1];
10
- }
11
-
12
- getMonthFullName(month: number): string {
13
- return MONTHS_GREGORIAN.ar[month - 1];
14
- }
15
-
16
- getWeekdayLabel(weekday: number): string {
17
- return WEEKDAYS.ar[weekday - 1];
18
- }
19
-
20
- getWeekdayShortName(weekday: number): string {
21
- return WEEKDAYS.ar[weekday - 1];
22
- }
23
-
24
- getDayAriaLabel(date: NgbDateStruct): string {
25
- return `${date.day}-${date.month}-${date.year}`;
26
- }
27
-
28
- override getYearNumerals(year: number): string {
29
- return String(year);
30
- }
31
-
32
- override getWeekNumerals(weekNumber: number): string {
33
- return String(weekNumber);
34
- }
35
-
36
- override getDayNumerals(date: NgbDateStruct): string {
37
- return String(date.day);
38
- }
39
- }
40
-
41
- @Injectable()
42
- export class GregorianEnglishI18n extends NgbDatepickerI18n {
43
- getMonthShortName(month: number): string {
44
- return MONTHS_GREGORIAN.en[month - 1].substring(0, 3);
45
- }
46
-
47
- getMonthFullName(month: number): string {
48
- return MONTHS_GREGORIAN.en[month - 1];
49
- }
50
-
51
- getWeekdayLabel(weekday: number): string {
52
- return WEEKDAYS.en[weekday - 1];
53
- }
54
-
55
- getWeekdayShortName(weekday: number): string {
56
- return WEEKDAYS.en[weekday - 1];
57
- }
58
-
59
- getDayAriaLabel(date: NgbDateStruct): string {
60
- return `${date.day}-${date.month}-${date.year}`;
61
- }
62
-
63
- override getYearNumerals(year: number): string {
64
- return String(year);
65
- }
66
-
67
- override getWeekNumerals(weekNumber: number): string {
68
- return String(weekNumber);
69
- }
70
-
71
- override getDayNumerals(date: NgbDateStruct): string {
72
- return String(date.day);
73
- }
74
- }
75
-
76
- // ============ Dynamic I18N Factory ============
77
-
78
- @Injectable()
79
- export class DynamicGregorianI18n extends NgbDatepickerI18n {
80
- private currentLang: 'ar' | 'en' = 'en';
81
- private arabicI18n = new GregorianArabicI18n();
82
- private englishI18n = new GregorianEnglishI18n();
83
-
84
- setLanguage(lang: 'ar' | 'en') {
85
- this.currentLang = lang;
86
- }
87
-
88
- private get activeI18n() {
89
- return this.currentLang === 'ar' ? this.arabicI18n : this.englishI18n;
90
- }
91
-
92
- getMonthShortName(month: number): string {
93
- return this.activeI18n.getMonthShortName(month);
94
- }
95
-
96
- getMonthFullName(month: number): string {
97
- return this.activeI18n.getMonthFullName(month);
98
- }
99
-
100
- getWeekdayLabel(weekday: number): string {
101
- return this.activeI18n.getWeekdayLabel(weekday);
102
- }
103
-
104
- getWeekdayShortName(weekday: number): string {
105
- return this.activeI18n.getWeekdayShortName(weekday);
106
- }
107
-
108
- getDayAriaLabel(date: NgbDateStruct): string {
109
- return this.activeI18n.getDayAriaLabel(date);
110
- }
111
-
112
- override getYearNumerals(year: number): string {
113
- return this.activeI18n.getYearNumerals(year);
114
- }
115
-
116
- override getWeekNumerals(weekNumber: number): string {
117
- return this.activeI18n.getWeekNumerals(weekNumber);
118
- }
119
-
120
- override getDayNumerals(date: NgbDateStruct): string {
121
- return this.activeI18n.getDayNumerals(date);
122
- }
123
- }
@@ -1,119 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { NgbDatepickerI18n, NgbDateStruct } from '@ng-bootstrap/ng-bootstrap';
3
- import { MONTHS_HIJRI, WEEKDAYS } from '../utils/date-i18n.utils';
4
-
5
- @Injectable()
6
- export class IslamicI18n extends NgbDatepickerI18n {
7
- getMonthShortName(month: number): string {
8
- return MONTHS_HIJRI.ar[month - 1];
9
- }
10
-
11
- getMonthFullName(month: number): string {
12
- return MONTHS_HIJRI.ar[month - 1];
13
- }
14
-
15
- getWeekdayLabel(weekday: number): string {
16
- return WEEKDAYS.ar[weekday - 1];
17
- }
18
-
19
- getWeekdayShortName(weekday: number): string {
20
- return WEEKDAYS.ar[weekday - 1];
21
- }
22
-
23
- getDayAriaLabel(date: NgbDateStruct): string {
24
- return `${date.day}-${date.month}-${date.year}`;
25
- }
26
-
27
- override getYearNumerals(year: number): string {
28
- return String(year);
29
- }
30
-
31
- override getWeekNumerals(weekNumber: number): string {
32
- return String(weekNumber);
33
- }
34
-
35
- override getDayNumerals(date: NgbDateStruct): string {
36
- return String(date.day);
37
- }
38
- }
39
-
40
- @Injectable()
41
- export class HijriEnglishI18n extends NgbDatepickerI18n {
42
- getMonthShortName(month: number): string {
43
- return MONTHS_HIJRI.en[month - 1].substring(0, 3);
44
- }
45
-
46
- getMonthFullName(month: number): string {
47
- return MONTHS_HIJRI.en[month - 1];
48
- }
49
-
50
- getWeekdayLabel(weekday: number): string {
51
- return WEEKDAYS.en[weekday - 1];
52
- }
53
-
54
- getWeekdayShortName(weekday: number): string {
55
- return WEEKDAYS.en[weekday - 1];
56
- }
57
-
58
- getDayAriaLabel(date: NgbDateStruct): string {
59
- return `${date.day}-${date.month}-${date.year}`;
60
- }
61
-
62
- override getYearNumerals(year: number): string {
63
- return String(year);
64
- }
65
-
66
- override getWeekNumerals(weekNumber: number): string {
67
- return String(weekNumber);
68
- }
69
-
70
- override getDayNumerals(date: NgbDateStruct): string {
71
- return String(date.day);
72
- }
73
- }
74
- @Injectable()
75
- export class DynamicHijriI18n extends NgbDatepickerI18n {
76
- private currentLang: 'ar' | 'en' = 'ar';
77
- private arabicI18n = new IslamicI18n();
78
- private englishI18n = new HijriEnglishI18n();
79
-
80
- setLanguage(lang: 'ar' | 'en') {
81
- this.currentLang = lang;
82
- }
83
-
84
- private get activeI18n() {
85
- return this.currentLang === 'ar' ? this.arabicI18n : this.englishI18n;
86
- }
87
-
88
- getMonthShortName(month: number): string {
89
- return this.activeI18n.getMonthShortName(month);
90
- }
91
-
92
- getMonthFullName(month: number): string {
93
- return this.activeI18n.getMonthFullName(month);
94
- }
95
-
96
- getWeekdayLabel(weekday: number): string {
97
- return this.activeI18n.getWeekdayLabel(weekday);
98
- }
99
-
100
- getWeekdayShortName(weekday: number): string {
101
- return this.activeI18n.getWeekdayShortName(weekday);
102
- }
103
-
104
- getDayAriaLabel(date: NgbDateStruct): string {
105
- return this.activeI18n.getDayAriaLabel(date);
106
- }
107
-
108
- override getYearNumerals(year: number): string {
109
- return this.activeI18n.getYearNumerals(year);
110
- }
111
-
112
- override getWeekNumerals(weekNumber: number): string {
113
- return this.activeI18n.getWeekNumerals(weekNumber);
114
- }
115
-
116
- override getDayNumerals(date: NgbDateStruct): string {
117
- return this.activeI18n.getDayNumerals(date);
118
- }
119
- }
@@ -1,58 +0,0 @@
1
- export const WEEKDAYS = {
2
- ar: ['ن', 'ث', 'ر', 'خ', 'ج', 'س', 'ح'],
3
- en: ['M', 'T', 'W', 'T', 'F', 'S', 'S']
4
- };
5
-
6
- export const MONTHS_GREGORIAN = {
7
- ar: [
8
- 'يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو',
9
- 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'
10
- ],
11
- en: [
12
- 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
13
- 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'
14
- ]
15
- };
16
-
17
- export const MONTHS_HIJRI = {
18
- ar: [
19
- 'محرم',
20
- 'صفر',
21
- 'ربيع الأول',
22
- 'ربيع الآخر',
23
- 'جمادى الأولى',
24
- 'جمادى الآخرة',
25
- 'رجب',
26
- 'شعبان',
27
- 'رمضان',
28
- 'شوال',
29
- 'ذو القعدة',
30
- 'ذو الحجة'
31
- ],
32
- en: [
33
- 'Muharram',
34
- 'Safar',
35
- 'Rabi Al-Awwal',
36
- 'Rabi Al-Thani',
37
- 'Jumada Al-Awwal',
38
- 'Jumada Al-Thani',
39
- 'Rajab',
40
- 'Shaaban',
41
- 'Ramadan',
42
- 'Shawwal',
43
- 'Dhul-Qi’dah',
44
- 'Dhul-Hijjah'
45
- ]
46
- };
47
-
48
- export function getGregorianMonthName(lang: 'ar' | 'en', month: number) {
49
- return MONTHS_GREGORIAN[lang][month - 1] || '';
50
- }
51
-
52
- export function getHijriMonthName(lang: 'ar' | 'en', month: number) {
53
- return MONTHS_HIJRI[lang][month - 1] || '';
54
- }
55
-
56
- export function getWeekdayName(lang: 'ar' | 'en', weekday: number) {
57
- return WEEKDAYS[lang][weekday - 1];
58
- }