verben-ng-ui 0.0.1
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.
- package/README.md +24 -0
- package/ng-package.json +10 -0
- package/package.json +34 -0
- package/src/lib/Verbena-input/error.service.ts +23 -0
- package/src/lib/Verbena-input/verbena-input.component.css +59 -0
- package/src/lib/Verbena-input/verbena-input.component.html +64 -0
- package/src/lib/Verbena-input/verbena-input.component.spec.ts +25 -0
- package/src/lib/Verbena-input/verbena-input.component.ts +162 -0
- package/src/lib/Verbena-input/verbena-input.module.ts +12 -0
- package/src/lib/components/TemplateDirective.directive.ts +10 -0
- package/src/lib/components/card/card.component.css +20 -0
- package/src/lib/components/card/card.component.html +23 -0
- package/src/lib/components/card/card.component.spec.ts +23 -0
- package/src/lib/components/card/card.component.ts +33 -0
- package/src/lib/components/card/card.module.ts +10 -0
- package/src/lib/components/card-data-view/card-data-view-footer/card-data-view-footer.component.css +3 -0
- package/src/lib/components/card-data-view/card-data-view-footer/card-data-view-footer.component.html +1 -0
- package/src/lib/components/card-data-view/card-data-view-footer/card-data-view-footer.component.spec.ts +23 -0
- package/src/lib/components/card-data-view/card-data-view-footer/card-data-view-footer.component.ts +10 -0
- package/src/lib/components/card-data-view/card-data-view-header/card-data-view-header.component.css +7 -0
- package/src/lib/components/card-data-view/card-data-view-header/card-data-view-header.component.html +1 -0
- package/src/lib/components/card-data-view/card-data-view-header/card-data-view-header.component.spec.ts +23 -0
- package/src/lib/components/card-data-view/card-data-view-header/card-data-view-header.component.ts +10 -0
- package/src/lib/components/card-data-view/card-data-view.component.css +39 -0
- package/src/lib/components/card-data-view/card-data-view.component.html +29 -0
- package/src/lib/components/card-data-view/card-data-view.component.spec.ts +23 -0
- package/src/lib/components/card-data-view/card-data-view.component.ts +66 -0
- package/src/lib/components/card-data-view/card-data-view.module.ts +20 -0
- package/src/lib/components/card-data-view/card-data.ts +7 -0
- package/src/lib/components/card-data-view/left-card-data/left-card-data.component.css +15 -0
- package/src/lib/components/card-data-view/left-card-data/left-card-data.component.html +4 -0
- package/src/lib/components/card-data-view/left-card-data/left-card-data.component.spec.ts +23 -0
- package/src/lib/components/card-data-view/left-card-data/left-card-data.component.ts +19 -0
- package/src/lib/components/card-data-view/left-card-data-view/left-card-data-view.component.css +0 -0
- package/src/lib/components/card-data-view/left-card-data-view/left-card-data-view.component.html +4 -0
- package/src/lib/components/card-data-view/left-card-data-view/left-card-data-view.component.spec.ts +23 -0
- package/src/lib/components/card-data-view/left-card-data-view/left-card-data-view.component.ts +12 -0
- package/src/lib/components/card-data-view/right-card-data-view/right-card-data-view.component.css +3 -0
- package/src/lib/components/card-data-view/right-card-data-view/right-card-data-view.component.html +1 -0
- package/src/lib/components/card-data-view/right-card-data-view/right-card-data-view.component.spec.ts +23 -0
- package/src/lib/components/card-data-view/right-card-data-view/right-card-data-view.component.ts +10 -0
- package/src/lib/components/chip/ChipChangeEvent.ts +4 -0
- package/src/lib/components/chip/chip.component.css +94 -0
- package/src/lib/components/chip/chip.component.html +49 -0
- package/src/lib/components/chip/chip.component.spec.ts +23 -0
- package/src/lib/components/chip/chip.component.ts +209 -0
- package/src/lib/components/chip/chip.module.ts +24 -0
- package/src/lib/components/chip/documentation.md +26 -0
- package/src/lib/components/data-export/data-export.component.css +0 -0
- package/src/lib/components/data-export/data-export.component.html +90 -0
- package/src/lib/components/data-export/data-export.component.spec.ts +23 -0
- package/src/lib/components/data-export/data-export.component.ts +158 -0
- package/src/lib/components/data-export/data-export.module.ts +13 -0
- package/src/lib/components/data-export/data-export.service.spec.ts +16 -0
- package/src/lib/components/data-export/data-export.service.ts +152 -0
- package/src/lib/components/data-export/data-export.types.ts +21 -0
- package/src/lib/components/data-table/column.directive.spec.ts +8 -0
- package/src/lib/components/data-table/column.directive.ts +19 -0
- package/src/lib/components/data-table/data-table.component.css +0 -0
- package/src/lib/components/data-table/data-table.component.html +55 -0
- package/src/lib/components/data-table/data-table.component.spec.ts +21 -0
- package/src/lib/components/data-table/data-table.component.ts +336 -0
- package/src/lib/components/data-table/data-table.module.ts +11 -0
- package/src/lib/components/data-table/data-table.types.ts +13 -0
- package/src/lib/components/data-table/style.types.ts +55 -0
- package/src/lib/components/data-view/data-view-click-outside.directive.ts +44 -0
- package/src/lib/components/data-view/data-view.component.css +74 -0
- package/src/lib/components/data-view/data-view.component.html +161 -0
- package/src/lib/components/data-view/data-view.component.spec.ts +23 -0
- package/src/lib/components/data-view/data-view.component.ts +136 -0
- package/src/lib/components/data-view/data-view.module.ts +16 -0
- package/src/lib/components/date-picker/date-picker.component.css +65 -0
- package/src/lib/components/date-picker/date-picker.component.html +60 -0
- package/src/lib/components/date-picker/date-picker.component.specs.ts +23 -0
- package/src/lib/components/date-picker/date-picker.component.ts +143 -0
- package/src/lib/components/date-picker/date-picker.module.ts +12 -0
- package/src/lib/components/drop-down/DropdownChangeEvent.ts +4 -0
- package/src/lib/components/drop-down/DropdownLoadEvent.ts +19 -0
- package/src/lib/components/drop-down/DropdownMenuItem.ts +42 -0
- package/src/lib/components/drop-down/documentation.md +69 -0
- package/src/lib/components/drop-down/drop-down-item/drop-down-item.component.css +123 -0
- package/src/lib/components/drop-down/drop-down-item/drop-down-item.component.html +133 -0
- package/src/lib/components/drop-down/drop-down-item/drop-down-item.component.spec.ts +23 -0
- package/src/lib/components/drop-down/drop-down-item/drop-down-item.component.ts +88 -0
- package/src/lib/components/drop-down/drop-down.component.css +317 -0
- package/src/lib/components/drop-down/drop-down.component.html +177 -0
- package/src/lib/components/drop-down/drop-down.component.spec.ts +23 -0
- package/src/lib/components/drop-down/drop-down.component.ts +757 -0
- package/src/lib/components/drop-down/drop-down.module.ts +24 -0
- package/src/lib/components/image/image.component.css +12 -0
- package/src/lib/components/image/image.component.html +18 -0
- package/src/lib/components/image/image.component.spec.ts +23 -0
- package/src/lib/components/image/image.component.ts +45 -0
- package/src/lib/components/image/image.module.ts +11 -0
- package/src/lib/components/notification/notification.component.css +3 -0
- package/src/lib/components/notification/notification.component.html +19 -0
- package/src/lib/components/notification/notification.component.spec.ts +23 -0
- package/src/lib/components/notification/notification.component.ts +77 -0
- package/src/lib/components/notification/notification.module.ts +14 -0
- package/src/lib/components/shared.module.ts +9 -0
- package/src/lib/components/sort-table/sort-table.component.css +67 -0
- package/src/lib/components/sort-table/sort-table.component.html +164 -0
- package/src/lib/components/sort-table/sort-table.component.spec.ts +23 -0
- package/src/lib/components/sort-table/sort-table.component.ts +204 -0
- package/src/lib/components/sort-table/sort-table.module.ts +11 -0
- package/src/lib/components/svg/svg.component.css +0 -0
- package/src/lib/components/svg/svg.component.html +1 -0
- package/src/lib/components/svg/svg.component.spec.ts +23 -0
- package/src/lib/components/svg/svg.component.ts +64 -0
- package/src/lib/components/svg/svg.module.ts +10 -0
- package/src/lib/components/table-filter/table-filter.component.css +93 -0
- package/src/lib/components/table-filter/table-filter.component.html +293 -0
- package/src/lib/components/table-filter/table-filter.component.spec.ts +23 -0
- package/src/lib/components/table-filter/table-filter.component.ts +221 -0
- package/src/lib/components/table-filter/table-filter.module.ts +25 -0
- package/src/lib/components/tooltip/tooltip.component.css +8 -0
- package/src/lib/components/tooltip/tooltip.component.html +13 -0
- package/src/lib/components/tooltip/tooltip.component.spec.ts +23 -0
- package/src/lib/components/tooltip/tooltip.component.ts +84 -0
- package/src/lib/components/tooltip/tooltip.module.ts +11 -0
- package/src/lib/components/verben-mail/verben-mail.component.config.ts +11 -0
- package/src/lib/components/verben-mail/verben-mail.component.css +71 -0
- package/src/lib/components/verben-mail/verben-mail.component.html +139 -0
- package/src/lib/components/verben-mail/verben-mail.component.ts +151 -0
- package/src/lib/components/verben-mail/verben-mail.module.ts +18 -0
- package/src/lib/components/visible-column/visible-column.component.css +83 -0
- package/src/lib/components/visible-column/visible-column.component.html +77 -0
- package/src/lib/components/visible-column/visible-column.component.spec.ts +23 -0
- package/src/lib/components/visible-column/visible-column.component.ts +106 -0
- package/src/lib/components/visible-column/visible-column.module.ts +11 -0
- package/src/lib/config.ts +37 -0
- package/src/lib/control-options/control-options.directive.ts +129 -0
- package/src/lib/control-options/control-options.module.ts +10 -0
- package/src/lib/convert-to-integer/convert-to-integer.directive.ts +28 -0
- package/src/lib/convert-to-integer/convert-to-integer.module.ts +10 -0
- package/src/lib/convert-to-integer/public-api.ts +1 -0
- package/src/lib/convert-to-number/convert-to-number.directive.ts +22 -0
- package/src/lib/convert-to-number/convert-to-number.module.ts +8 -0
- package/src/lib/convert-to-number/public-api.ts +1 -0
- package/src/lib/email-validator/email-validator.directive.ts +24 -0
- package/src/lib/email-validator/email-validator.module.ts +14 -0
- package/src/lib/models/column-filter.ts +5 -0
- package/src/lib/models/data-filter.ts +8 -0
- package/src/lib/models/mail-model.ts +8 -0
- package/src/lib/models/sort-filter.ts +0 -0
- package/src/lib/models/table-filter.ts +34 -0
- package/src/lib/number-range/number-range.directive.ts +35 -0
- package/src/lib/number-range/number-range.module.ts +11 -0
- package/src/lib/phone-number/phone-number.directive.ts +22 -0
- package/src/lib/phone-number/phone-number.module.ts +10 -0
- package/src/lib/phone-number/public-api.ts +1 -0
- package/src/lib/required-input/required-input.directive.ts +18 -0
- package/src/lib/required-input/required-input.module.ts +8 -0
- package/src/lib/theme-switcher/theme-switcher.directive.spec.ts +8 -0
- package/src/lib/theme-switcher/theme-switcher.directive.ts +70 -0
- package/src/lib/theme-switcher/theme-switcher.module.ts +8 -0
- package/src/lib/validate/error-message.service.ts +104 -0
- package/src/lib/validate/validate.directive.ts +110 -0
- package/src/lib/validate/validate.module.ts +17 -0
- package/src/lib/validate-input/validate-input.directive.ts +8 -0
- package/src/lib/validate-input/validate-input.module.ts +8 -0
- package/src/lib/verben-ng-ui.component.spec.ts +23 -0
- package/src/lib/verben-ng-ui.component.ts +16 -0
- package/src/lib/verben-ng-ui.service.spec.ts +16 -0
- package/src/lib/verben-ng-ui.service.ts +9 -0
- package/src/lib/verbena-badge/verbena-badge.component.css +16 -0
- package/src/lib/verbena-badge/verbena-badge.component.html +13 -0
- package/src/lib/verbena-badge/verbena-badge.component.spec.ts +25 -0
- package/src/lib/verbena-badge/verbena-badge.component.ts +18 -0
- package/src/lib/verbena-badge/verbena-badge.module.ts +10 -0
- package/src/lib/verbena-button/verbena-button.component.css +20 -0
- package/src/lib/verbena-button/verbena-button.component.html +25 -0
- package/src/lib/verbena-button/verbena-button.component.spec.ts +25 -0
- package/src/lib/verbena-button/verbena-button.component.ts +92 -0
- package/src/lib/verbena-button/verbena-button.module.ts +11 -0
- package/src/lib/verbena-switch/verbena-switch.component.css +45 -0
- package/src/lib/verbena-switch/verbena-switch.component.html +8 -0
- package/src/lib/verbena-switch/verbena-switch.component.spec.ts +25 -0
- package/src/lib/verbena-switch/verbena-switch.component.ts +31 -0
- package/src/lib/verbena-switch/verbena-switch.module.ts +10 -0
- package/src/lib/verbena-textarea/verbena-textarea.component.css +0 -0
- package/src/lib/verbena-textarea/verbena-textarea.component.html +19 -0
- package/src/lib/verbena-textarea/verbena-textarea.component.spec.ts +33 -0
- package/src/lib/verbena-textarea/verbena-textarea.component.ts +44 -0
- package/src/lib/verbena-textarea/verbena-textarea.module.ts +11 -0
- package/src/public-api.ts +122 -0
- package/src/styles.css +103 -0
- package/tsconfig.lib.json +15 -0
- package/tsconfig.lib.prod.json +11 -0
- package/tsconfig.spec.json +15 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// directives/outside-click.directive.ts
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
Directive,
|
|
5
|
+
ElementRef,
|
|
6
|
+
EventEmitter,
|
|
7
|
+
Input,
|
|
8
|
+
OnDestroy,
|
|
9
|
+
OnInit,
|
|
10
|
+
Output,
|
|
11
|
+
Renderer2,
|
|
12
|
+
} from '@angular/core';
|
|
13
|
+
|
|
14
|
+
@Directive({
|
|
15
|
+
selector: '[appOutSideClick]',
|
|
16
|
+
standalone: true,
|
|
17
|
+
})
|
|
18
|
+
export class OutSideClickDirective implements OnInit, OnDestroy {
|
|
19
|
+
@Input() appOutSideClick!: boolean;
|
|
20
|
+
@Output() outSideClick: EventEmitter<void> = new EventEmitter();
|
|
21
|
+
constructor(private element: ElementRef, private renderer: Renderer2) {}
|
|
22
|
+
|
|
23
|
+
private listener: (() => void) | undefined;
|
|
24
|
+
|
|
25
|
+
onDocumentClick = (event: Event) => {
|
|
26
|
+
if (!this.element.nativeElement.parentElement.contains(event.target)) {
|
|
27
|
+
this.outSideClick.emit();
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
ngOnInit(): void {
|
|
32
|
+
this.listener = this.renderer.listen(
|
|
33
|
+
'document',
|
|
34
|
+
'click',
|
|
35
|
+
this.onDocumentClick
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
ngOnDestroy(): void {
|
|
40
|
+
if (this.listener) {
|
|
41
|
+
this.listener();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
|
|
2
|
+
.toggle-button-container button {
|
|
3
|
+
display: flex;
|
|
4
|
+
justify-content: space-between;
|
|
5
|
+
align-content: center;
|
|
6
|
+
border: none;
|
|
7
|
+
background-color: transparent;
|
|
8
|
+
cursor: pointer;
|
|
9
|
+
border:1px solid gray;
|
|
10
|
+
padding: 0;
|
|
11
|
+
border-radius: 6px;
|
|
12
|
+
overflow: hidden;
|
|
13
|
+
height: 35px;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.toggle-button-container verben-svg {
|
|
17
|
+
transition: background-color 0.5s ease;
|
|
18
|
+
padding: 6px;
|
|
19
|
+
position: relative;
|
|
20
|
+
}
|
|
21
|
+
.toggle-button-container verben-svg.active {
|
|
22
|
+
background-color: #d3d3d3;
|
|
23
|
+
}
|
|
24
|
+
.flex{
|
|
25
|
+
display: flex;
|
|
26
|
+
}
|
|
27
|
+
.justify-between{
|
|
28
|
+
justify-content: space-between;
|
|
29
|
+
}
|
|
30
|
+
.items-center{
|
|
31
|
+
align-items: center;
|
|
32
|
+
}
|
|
33
|
+
.font-semibold{
|
|
34
|
+
font-weight: 600;
|
|
35
|
+
}
|
|
36
|
+
.font-normal{
|
|
37
|
+
font-weight: 400;
|
|
38
|
+
}
|
|
39
|
+
.text-sm{
|
|
40
|
+
font-size: 14px;
|
|
41
|
+
}
|
|
42
|
+
.text-xs{
|
|
43
|
+
font-size: 12px;
|
|
44
|
+
}
|
|
45
|
+
.gap{
|
|
46
|
+
gap: 7px;
|
|
47
|
+
}
|
|
48
|
+
.pd{
|
|
49
|
+
padding: 5px 8px;
|
|
50
|
+
}
|
|
51
|
+
.rounded-sm{
|
|
52
|
+
border-radius: 10px;
|
|
53
|
+
}
|
|
54
|
+
.cursor-pointer{
|
|
55
|
+
cursor: pointer;
|
|
56
|
+
}
|
|
57
|
+
.search-input{
|
|
58
|
+
width:30%;
|
|
59
|
+
}
|
|
60
|
+
sup{
|
|
61
|
+
color: #3479E9;
|
|
62
|
+
font-weight: 500;
|
|
63
|
+
}
|
|
64
|
+
.data-view-element{
|
|
65
|
+
position: absolute;
|
|
66
|
+
top:50px;
|
|
67
|
+
left: 0;
|
|
68
|
+
}
|
|
69
|
+
.relative{
|
|
70
|
+
position: relative;
|
|
71
|
+
}
|
|
72
|
+
.z-10{
|
|
73
|
+
z-index: 100;
|
|
74
|
+
}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
<div class="toolbar flex gap justify-between items-center" [style.margin]="'0px 35px'">
|
|
2
|
+
<div class="flex items-center gap">
|
|
3
|
+
<div class="toggle-button-container">
|
|
4
|
+
<button type="button" (click)="toggleView()" [ngClass]="buttonClass">
|
|
5
|
+
<verben-svg
|
|
6
|
+
[icon]="gridIcon"
|
|
7
|
+
[class.active]="!isGridView"
|
|
8
|
+
[ngClass]="!isGridView ? activeIconClass : iconClass"
|
|
9
|
+
></verben-svg>
|
|
10
|
+
<verben-svg
|
|
11
|
+
[icon]="listIcon"
|
|
12
|
+
[class.active]="isGridView"
|
|
13
|
+
[ngClass]="isGridView ? activeIconClass : iconClass"
|
|
14
|
+
[width]="25"
|
|
15
|
+
[height]="25"
|
|
16
|
+
></verben-svg>
|
|
17
|
+
</button>
|
|
18
|
+
</div>
|
|
19
|
+
<!-- Search Input -->
|
|
20
|
+
<div [style.width]="inputWidth" class="search-input" *ngIf="viewState.isSearch">
|
|
21
|
+
<verbena-input
|
|
22
|
+
[type]="'text'"
|
|
23
|
+
[placeHolder]="'Search...'"
|
|
24
|
+
(input)="onSearch($event)"
|
|
25
|
+
[borderRadius]="'10px'"
|
|
26
|
+
[border]="'0'"
|
|
27
|
+
/>
|
|
28
|
+
</div>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
<div class="flex items-center relative gap" [style.margin-left]="'10px'">
|
|
32
|
+
<!-- Column Section -->
|
|
33
|
+
<ng-container
|
|
34
|
+
[appOutSideClick]="showColumnChild"
|
|
35
|
+
(outSideClick)="showColumnChild = false"
|
|
36
|
+
*ngIf="viewState.isColumn && isGridView"
|
|
37
|
+
>
|
|
38
|
+
<ng-container *ngIf="columnTemplate; else defaultColumn"></ng-container>
|
|
39
|
+
<ng-template #defaultColumn>
|
|
40
|
+
<span
|
|
41
|
+
class="flex gap text-xs items-center pd rounded cursor-pointer"
|
|
42
|
+
[style.background-color]="'#D9D9D940'"
|
|
43
|
+
(click)="toggleChildView('column')"
|
|
44
|
+
>
|
|
45
|
+
<verben-svg [width]="15" [icon]="'column'"></verben-svg>
|
|
46
|
+
<span>Columns <sup>({{ selectedColumnCount }})</sup></span>
|
|
47
|
+
</span>
|
|
48
|
+
<div class="data-view-element">
|
|
49
|
+
<ng-content *ngIf="showColumnChild" select="[column-content]"></ng-content>
|
|
50
|
+
</div>
|
|
51
|
+
</ng-template>
|
|
52
|
+
</ng-container>
|
|
53
|
+
|
|
54
|
+
<!-- Filter Section -->
|
|
55
|
+
<ng-container
|
|
56
|
+
[appOutSideClick]="showFilterChild"
|
|
57
|
+
(outSideClick)="showFilterChild = false"
|
|
58
|
+
*ngIf="viewState.isFilter"
|
|
59
|
+
>
|
|
60
|
+
<ng-container *ngIf="filterTemplate; else defaultFilter"></ng-container>
|
|
61
|
+
<ng-template #defaultFilter>
|
|
62
|
+
<span
|
|
63
|
+
class="flex gap text-xs items-center pd rounded cursor-pointer"
|
|
64
|
+
[style.background-color]="'#D9D9D940'"
|
|
65
|
+
(click)="toggleChildView('filter')"
|
|
66
|
+
>
|
|
67
|
+
<verben-svg [width]="15" [icon]="'filter'"></verben-svg>
|
|
68
|
+
<span>Filter <sup>({{ selectedFilterTableCount }})</sup></span>
|
|
69
|
+
</span>
|
|
70
|
+
<div class="data-view-element">
|
|
71
|
+
<ng-content *ngIf="showFilterChild" select="[filter-content]"></ng-content>
|
|
72
|
+
</div>
|
|
73
|
+
</ng-template>
|
|
74
|
+
</ng-container>
|
|
75
|
+
|
|
76
|
+
<!-- Sort Section -->
|
|
77
|
+
<ng-container
|
|
78
|
+
[appOutSideClick]="showSortChild"
|
|
79
|
+
(outSideClick)="showSortChild = false"
|
|
80
|
+
*ngIf="viewState.isSort"
|
|
81
|
+
>
|
|
82
|
+
<ng-container *ngIf="sortTemplate; else defaultSort"></ng-container>
|
|
83
|
+
<ng-template #defaultSort>
|
|
84
|
+
<span
|
|
85
|
+
class="flex gap text-xs items-center pd rounded cursor-pointer"
|
|
86
|
+
[style.background-color]="'#D9D9D940'"
|
|
87
|
+
(click)="toggleChildView('sort')"
|
|
88
|
+
>
|
|
89
|
+
<verben-svg [width]="15" [icon]="'sort'"></verben-svg>
|
|
90
|
+
<span>Sort <sup>({{ selectedSortCount }})</sup></span>
|
|
91
|
+
</span>
|
|
92
|
+
<div class="data-view-element">
|
|
93
|
+
<ng-content *ngIf="showSortChild" select="[sort-content]"></ng-content>
|
|
94
|
+
</div>
|
|
95
|
+
</ng-template>
|
|
96
|
+
</ng-container>
|
|
97
|
+
|
|
98
|
+
<!-- Export Section -->
|
|
99
|
+
<ng-container
|
|
100
|
+
[appOutSideClick]="showExportChild"
|
|
101
|
+
(outSideClick)="showExportChild = false"
|
|
102
|
+
*ngIf="viewState.isExport"
|
|
103
|
+
>
|
|
104
|
+
<ng-container *ngIf="exportTemplate; else defaultExport"></ng-container>
|
|
105
|
+
<ng-template #defaultExport>
|
|
106
|
+
<span
|
|
107
|
+
class="flex gap text-xs items-center pd rounded cursor-pointer"
|
|
108
|
+
[style.background-color]="'#D9D9D940'"
|
|
109
|
+
(click)="toggleChildView('export')"
|
|
110
|
+
>
|
|
111
|
+
<verben-svg [width]="15" [icon]="'export'"></verben-svg>
|
|
112
|
+
Export
|
|
113
|
+
</span>
|
|
114
|
+
<div class="data-view-element">
|
|
115
|
+
<ng-content *ngIf="showExportChild" select="[export-content]"></ng-content>
|
|
116
|
+
</div>
|
|
117
|
+
</ng-template>
|
|
118
|
+
</ng-container>
|
|
119
|
+
|
|
120
|
+
<!-- Select Section -->
|
|
121
|
+
<div *ngIf="viewState.isSelect">
|
|
122
|
+
<span
|
|
123
|
+
class="flex gap text-xs items-center pd rounded cursor-pointer"
|
|
124
|
+
[style.background-color]="'#D9D9D940'"
|
|
125
|
+
(click)="toggleChildView('select')"
|
|
126
|
+
>
|
|
127
|
+
<verben-svg [width]="15" [icon]="'select'"></verben-svg>
|
|
128
|
+
<span>Select</span>
|
|
129
|
+
<verben-svg [width]="6" [icon]="'chevron-down'"></verben-svg>
|
|
130
|
+
</span>
|
|
131
|
+
</div>
|
|
132
|
+
|
|
133
|
+
<!-- Create Button -->
|
|
134
|
+
<div *ngIf="viewState.isCreate">
|
|
135
|
+
<verbena-button
|
|
136
|
+
class="text-sm font-semibold"
|
|
137
|
+
[bgColor]="'#FFE681'"
|
|
138
|
+
[pd]="'6px'"
|
|
139
|
+
[borderRadius]="'4px'"
|
|
140
|
+
[textColor]="'#000'"
|
|
141
|
+
[svg]="'add'"
|
|
142
|
+
[svgPosition]="'right'"
|
|
143
|
+
[text]="'Create New'"
|
|
144
|
+
(click)="toggleChildView('create')"
|
|
145
|
+
>
|
|
146
|
+
</verbena-button>
|
|
147
|
+
</div>
|
|
148
|
+
</div>
|
|
149
|
+
</div>
|
|
150
|
+
|
|
151
|
+
<!-- Grid and List View Handling -->
|
|
152
|
+
<div *ngIf="isGridView; else listViewTemplate">
|
|
153
|
+
<div class="grid-view">
|
|
154
|
+
<ng-content select="[grid-content]"></ng-content>
|
|
155
|
+
</div>
|
|
156
|
+
</div>
|
|
157
|
+
<ng-template #listViewTemplate>
|
|
158
|
+
<div class="list-view">
|
|
159
|
+
<ng-content select="[list-content]"></ng-content>
|
|
160
|
+
</div>
|
|
161
|
+
</ng-template>
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
|
2
|
+
|
|
3
|
+
import { DataViewComponent } from './data-view.component';
|
|
4
|
+
|
|
5
|
+
describe('DataViewComponent', () => {
|
|
6
|
+
let component: DataViewComponent;
|
|
7
|
+
let fixture: ComponentFixture<DataViewComponent>;
|
|
8
|
+
|
|
9
|
+
beforeEach(async () => {
|
|
10
|
+
await TestBed.configureTestingModule({
|
|
11
|
+
imports: [DataViewComponent]
|
|
12
|
+
})
|
|
13
|
+
.compileComponents();
|
|
14
|
+
|
|
15
|
+
fixture = TestBed.createComponent(DataViewComponent);
|
|
16
|
+
component = fixture.componentInstance;
|
|
17
|
+
fixture.detectChanges();
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it('should create', () => {
|
|
21
|
+
expect(component).toBeTruthy();
|
|
22
|
+
});
|
|
23
|
+
});
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ChangeDetectionStrategy,
|
|
3
|
+
Component,
|
|
4
|
+
EventEmitter,
|
|
5
|
+
Input,
|
|
6
|
+
OnInit,
|
|
7
|
+
Output,
|
|
8
|
+
} from '@angular/core';
|
|
9
|
+
|
|
10
|
+
interface ViewState {
|
|
11
|
+
isSearch?: boolean;
|
|
12
|
+
isColumn?: boolean;
|
|
13
|
+
isFilter?: boolean;
|
|
14
|
+
isSort?: boolean;
|
|
15
|
+
isExport?: boolean;
|
|
16
|
+
isSelect?: boolean;
|
|
17
|
+
isCreate?:boolean
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
@Component({
|
|
21
|
+
selector: 'verben-data-view',
|
|
22
|
+
templateUrl: './data-view.component.html',
|
|
23
|
+
styleUrls: ['./data-view.component.css'],
|
|
24
|
+
})
|
|
25
|
+
export class DataViewComponent implements OnInit {
|
|
26
|
+
@Input() buttonClass?: string;
|
|
27
|
+
@Input() iconClass?: string;
|
|
28
|
+
@Input() activeIconClass?: string;
|
|
29
|
+
@Input() gridIcon: string = 'grid-3';
|
|
30
|
+
@Input() listIcon: string = 'list-view';
|
|
31
|
+
|
|
32
|
+
// Grouped view state input
|
|
33
|
+
@Input() viewState: ViewState = {
|
|
34
|
+
isSearch: true,
|
|
35
|
+
isColumn: true,
|
|
36
|
+
isFilter: true,
|
|
37
|
+
isSort: true,
|
|
38
|
+
isExport: true,
|
|
39
|
+
isSelect: true,
|
|
40
|
+
isCreate:true
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
@Input() searchTemplate?: Node;
|
|
44
|
+
@Input() columnTemplate?: Node;
|
|
45
|
+
@Input() filterTemplate?: Node;
|
|
46
|
+
@Input() sortTemplate?: Node;
|
|
47
|
+
@Input() exportTemplate?: Node;
|
|
48
|
+
|
|
49
|
+
@Input() selectedColumnCount?: number = 0;
|
|
50
|
+
@Input() selectedSortCount: number = 0;
|
|
51
|
+
@Input() selectedFilterTableCount: number = 0;
|
|
52
|
+
@Input() inputWidth: string="350px";
|
|
53
|
+
@Input()showColumnChild: boolean = false;
|
|
54
|
+
@Input() showSortChild: boolean = false;
|
|
55
|
+
@Input() showFilterChild: boolean = false;
|
|
56
|
+
@Input() showExportChild: boolean = false;
|
|
57
|
+
@Input() create: boolean = false;
|
|
58
|
+
@Input() showSelected: boolean = false;
|
|
59
|
+
|
|
60
|
+
@Output() viewChange = new EventEmitter<boolean>();
|
|
61
|
+
@Output() stateChange = new EventEmitter<{ key: string; value: boolean }>();
|
|
62
|
+
|
|
63
|
+
isGridView: boolean = false;
|
|
64
|
+
|
|
65
|
+
ngOnInit(): void {}
|
|
66
|
+
|
|
67
|
+
toggleView(): void {
|
|
68
|
+
this.isGridView = !this.isGridView;
|
|
69
|
+
this.viewChange.emit(this.isGridView);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
onSearch(event: any): void {
|
|
73
|
+
this.stateChange.emit({ key: 'search', value: event.target.value });
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Generalized toggle method for managing UI components
|
|
77
|
+
toggleChildView(viewType: string): void {
|
|
78
|
+
switch (viewType) {
|
|
79
|
+
case 'column':
|
|
80
|
+
this.showColumnChild = !this.showColumnChild;
|
|
81
|
+
this.resetChildViewsExcept('column');
|
|
82
|
+
break;
|
|
83
|
+
case 'filter':
|
|
84
|
+
this.showFilterChild = !this.showFilterChild;
|
|
85
|
+
this.resetChildViewsExcept('filter');
|
|
86
|
+
break;
|
|
87
|
+
case 'sort':
|
|
88
|
+
this.showSortChild = !this.showSortChild;
|
|
89
|
+
this.resetChildViewsExcept('sort');
|
|
90
|
+
break;
|
|
91
|
+
case 'select':
|
|
92
|
+
this.showSelected = !this.showSelected;
|
|
93
|
+
this.resetChildViewsExcept('select');
|
|
94
|
+
break;
|
|
95
|
+
case 'export':
|
|
96
|
+
this.showExportChild = !this.showExportChild;
|
|
97
|
+
this.resetChildViewsExcept('export');
|
|
98
|
+
break;
|
|
99
|
+
case 'create':
|
|
100
|
+
this.create = !this.create;
|
|
101
|
+
this.resetChildViewsExcept('create');
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
this.stateChange.emit({ key: viewType, value: this.getChildViewState(viewType) });
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Reset other child views when one is toggled
|
|
108
|
+
resetChildViewsExcept(viewType: string): void {
|
|
109
|
+
if (viewType !== 'column') this.showColumnChild = false;
|
|
110
|
+
if (viewType !== 'filter') this.showFilterChild = false;
|
|
111
|
+
if (viewType !== 'sort') this.showSortChild = false;
|
|
112
|
+
if (viewType !== 'select') this.showSelected = false;
|
|
113
|
+
if (viewType !== 'export') this.showExportChild = false;
|
|
114
|
+
if (viewType !== 'create') this.create = false;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Helper method to get the state of a specific child view
|
|
118
|
+
getChildViewState(viewType: string): boolean {
|
|
119
|
+
switch (viewType) {
|
|
120
|
+
case 'column':
|
|
121
|
+
return this.showColumnChild;
|
|
122
|
+
case 'filter':
|
|
123
|
+
return this.showFilterChild;
|
|
124
|
+
case 'sort':
|
|
125
|
+
return this.showSortChild;
|
|
126
|
+
case 'select':
|
|
127
|
+
return this.showSelected;
|
|
128
|
+
case 'export':
|
|
129
|
+
return this.showExportChild;
|
|
130
|
+
case 'create':
|
|
131
|
+
return this.create;
|
|
132
|
+
default:
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { NgModule } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { DataViewComponent } from './data-view.component';
|
|
4
|
+
import { CardDataViewModule } from '../card-data-view/card-data-view.module';
|
|
5
|
+
|
|
6
|
+
import { SvgModule } from '../svg/svg.module';
|
|
7
|
+
import { DataTableModule } from '../data-table/data-table.module';
|
|
8
|
+
import { OutSideClickDirective } from './data-view-click-outside.directive';
|
|
9
|
+
import {VerbenaInputModule} from "../../Verbena-input/verbena-input.module"
|
|
10
|
+
import {VerbenaButtonModule} from "../../verbena-button/verbena-button.module"
|
|
11
|
+
@NgModule({
|
|
12
|
+
declarations:[DataViewComponent],
|
|
13
|
+
imports: [CommonModule,CardDataViewModule,DataTableModule,SvgModule,VerbenaInputModule,VerbenaButtonModule,OutSideClickDirective],
|
|
14
|
+
exports: [DataViewComponent]
|
|
15
|
+
})
|
|
16
|
+
export class DataViewModule {}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/* date-picker.component.scss */
|
|
2
|
+
.date-picker {
|
|
3
|
+
position: relative;
|
|
4
|
+
width: 250px;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
input {
|
|
8
|
+
width: 100%;
|
|
9
|
+
padding: 10px;
|
|
10
|
+
border: 1px solid #ccc;
|
|
11
|
+
border-radius: 4px;
|
|
12
|
+
cursor: pointer;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.calendar {
|
|
16
|
+
position: absolute;
|
|
17
|
+
top: 100%;
|
|
18
|
+
left: 0;
|
|
19
|
+
width:fit-content;
|
|
20
|
+
border: 1px solid #ccc;
|
|
21
|
+
background-color: white;
|
|
22
|
+
z-index: 10;
|
|
23
|
+
border-radius: 4px;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
.calendar-header {
|
|
27
|
+
display: flex;
|
|
28
|
+
justify-content: space-between;
|
|
29
|
+
gap: 10px;
|
|
30
|
+
padding: 10px;
|
|
31
|
+
background-color: #f0f0f0;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.weekdays,
|
|
35
|
+
.dates {
|
|
36
|
+
display: grid;
|
|
37
|
+
grid-template-columns: repeat(7, 1fr);
|
|
38
|
+
text-align: center;
|
|
39
|
+
gap: 6px;
|
|
40
|
+
padding: 10px;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
button {
|
|
44
|
+
border: none;
|
|
45
|
+
background: none;
|
|
46
|
+
cursor: pointer;
|
|
47
|
+
padding: 5px;
|
|
48
|
+
width: 40px;
|
|
49
|
+
height: 40px;
|
|
50
|
+
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
button.selected {
|
|
54
|
+
background-color:#FFE681;
|
|
55
|
+
color: black;
|
|
56
|
+
border-radius: 30px;
|
|
57
|
+
}
|
|
58
|
+
.calendar-footer{
|
|
59
|
+
display: flex;
|
|
60
|
+
justify-content: end;
|
|
61
|
+
gap: 20px;
|
|
62
|
+
padding:4px 10px;
|
|
63
|
+
color: purple;
|
|
64
|
+
font-weight:600;
|
|
65
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
<div class="date-picker">
|
|
2
|
+
<input
|
|
3
|
+
type="text"
|
|
4
|
+
[placeholder]="placeholder"
|
|
5
|
+
[value]="displayDate"
|
|
6
|
+
(focus)="toggleCalendar()"
|
|
7
|
+
readonly
|
|
8
|
+
/>
|
|
9
|
+
<div *ngIf="showCalendar" class="calendar">
|
|
10
|
+
<div class="calendar-header">
|
|
11
|
+
<ng-container *ngIf="!useDropdowns; else dropdowns">
|
|
12
|
+
<button (click)="previousMonth()">
|
|
13
|
+
<verben-svg [width]="20" [icon]="'chevron-left'"></verben-svg>
|
|
14
|
+
</button>
|
|
15
|
+
|
|
16
|
+
<!-- Display the current month and year -->
|
|
17
|
+
<span>{{ months[selectedMonth] }} {{ selectedYear }}</span>
|
|
18
|
+
|
|
19
|
+
<button (click)="nextMonth()">
|
|
20
|
+
<verben-svg [width]="20" [icon]="'chevron-right'"></verben-svg>
|
|
21
|
+
</button>
|
|
22
|
+
</ng-container>
|
|
23
|
+
|
|
24
|
+
<ng-template #dropdowns>
|
|
25
|
+
<verben-drop-down
|
|
26
|
+
[placeholder]="yearPlaceholder"
|
|
27
|
+
(onChange)="onDropdownYearChange($event)"
|
|
28
|
+
[options]="yearRange"
|
|
29
|
+
[(ngModel)]="selectedYear"
|
|
30
|
+
></verben-drop-down>
|
|
31
|
+
<verben-drop-down
|
|
32
|
+
placeholder="Select a month"
|
|
33
|
+
(onChange)="onDropdownMonthChange($event)"
|
|
34
|
+
[options]="months"
|
|
35
|
+
[(ngModel)]="selectedMonth"
|
|
36
|
+
></verben-drop-down>
|
|
37
|
+
</ng-template>
|
|
38
|
+
</div>
|
|
39
|
+
|
|
40
|
+
<div class="calendar-body">
|
|
41
|
+
<div class="weekdays">
|
|
42
|
+
<span *ngFor="let day of weekDays">{{ day }}</span>
|
|
43
|
+
</div>
|
|
44
|
+
<div class="dates">
|
|
45
|
+
<button
|
|
46
|
+
*ngFor="let day of getDaysInMonth()"
|
|
47
|
+
[class.selected]="isSelected(day)"
|
|
48
|
+
(click)="selectTemporaryDate(day)"
|
|
49
|
+
>
|
|
50
|
+
{{ day.getDate() }}
|
|
51
|
+
</button>
|
|
52
|
+
</div>
|
|
53
|
+
</div>
|
|
54
|
+
<div class="calendar-footer">
|
|
55
|
+
<button (click)="cancel()">Cancel</button>
|
|
56
|
+
<button (click)="confirm()">OK</button>
|
|
57
|
+
</div>
|
|
58
|
+
</div>
|
|
59
|
+
</div>
|
|
60
|
+
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
|
2
|
+
|
|
3
|
+
import { DatePickerComponent } from './date-picker.component';
|
|
4
|
+
|
|
5
|
+
describe('DatePickerComponent', () => {
|
|
6
|
+
let component: DatePickerComponent;
|
|
7
|
+
let fixture: ComponentFixture<DatePickerComponent>;
|
|
8
|
+
|
|
9
|
+
beforeEach(async () => {
|
|
10
|
+
await TestBed.configureTestingModule({
|
|
11
|
+
imports: [DatePickerComponent]
|
|
12
|
+
})
|
|
13
|
+
.compileComponents();
|
|
14
|
+
|
|
15
|
+
fixture = TestBed.createComponent(DatePickerComponent);
|
|
16
|
+
component = fixture.componentInstance;
|
|
17
|
+
fixture.detectChanges();
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it('should create', () => {
|
|
21
|
+
expect(component).toBeTruthy();
|
|
22
|
+
});
|
|
23
|
+
});
|