ng-zenduit 2.0.2 → 2.0.7
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/esm2020/lib/comment-item/zendu-comment-item.component.mjs +95 -0
- package/esm2020/lib/comment-list/zendu-comment-list.component.mjs +52 -0
- package/esm2020/lib/comment-textarea/zendu-comment-textarea.component.mjs +182 -0
- package/esm2020/lib/date-picker-dropdown/date-picker-dropdown.types.mjs +2 -0
- package/esm2020/lib/date-picker-dropdown/zendu-date-picker-dropdown.component.mjs +500 -0
- package/esm2020/lib/ng-zenduit.module.mjs +25 -5
- package/esm2020/lib/phone-input/zendu-phone-input.component.mjs +5 -3
- package/esm2020/lib/timepicker/zendu-timepicker.component.mjs +2 -2
- package/esm2020/public-api.mjs +6 -1
- package/fesm2015/ng-zenduit.mjs +844 -9
- package/fesm2015/ng-zenduit.mjs.map +1 -1
- package/fesm2020/ng-zenduit.mjs +837 -9
- package/fesm2020/ng-zenduit.mjs.map +1 -1
- package/icons/arrow-right.svg +3 -0
- package/lib/comment-item/zendu-comment-item.component.d.ts +49 -0
- package/lib/comment-list/zendu-comment-list.component.d.ts +22 -0
- package/lib/comment-textarea/zendu-comment-textarea.component.d.ts +57 -0
- package/lib/date-picker-dropdown/date-picker-dropdown.types.d.ts +12 -0
- package/lib/date-picker-dropdown/zendu-date-picker-dropdown.component.d.ts +90 -0
- package/lib/ng-zenduit.module.d.ts +12 -8
- package/lib/phone-input/zendu-phone-input.component.d.ts +2 -1
- package/package.json +1 -1
- package/public-api.d.ts +5 -0
- package/styles/colors.scss +450 -0
package/fesm2015/ng-zenduit.mjs
CHANGED
|
@@ -3101,10 +3101,10 @@ class ZenduPhoneInputComponent {
|
|
|
3101
3101
|
}
|
|
3102
3102
|
}
|
|
3103
3103
|
ZenduPhoneInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduPhoneInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
3104
|
-
ZenduPhoneInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ZenduPhoneInputComponent, selector: "zen-phone-input", inputs: { phone: "phone", maxLength: "maxLength", disabled: "disabled" }, outputs: { phoneChange: "phoneChange", validChange: "validChange" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"phone-input-component\">\n <div class=\"material-input\">\n <a class=\"country-select\"\n (click)=\"toggle()\">\n <img class=\"country-flag\"\n [src]=\"selectedCountry.flag\">\n <i class=\"material-icons expand-icon\"\n [ngClass]=\"{'active': isExpanded}\">
|
|
3104
|
+
ZenduPhoneInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ZenduPhoneInputComponent, selector: "zen-phone-input", inputs: { phone: "phone", maxLength: "maxLength", disabled: "disabled", width: "width" }, outputs: { phoneChange: "phoneChange", validChange: "validChange" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"phone-input-component\" [style.width]=\"width\">\n <div class=\"material-input\">\n <a class=\"country-select\"\n (click)=\"toggle()\">\n <img class=\"country-flag\"\n [src]=\"selectedCountry.flag\">\n <i class=\"material-icons expand-icon\"\n [ngClass]=\"{'active': isExpanded}\">expand_less</i>\n <div class=\"code\">{{ selectedCountry.countryCallingCode }}</div>\n </a>\n <input class=\"phone-input\"\n type=\"text\"\n [(ngModel)]=\"phoneText\"\n (ngModelChange)=\"phoneChanged(input)\"\n (click)=\"isExpanded = false\"\n [disabled]=\"disabled\"\n country-code=\"selectedCountry.countryCode\"\n [maxlength]=\"maxLength\"\n #input>\n </div>\n\n <div class=\"action-menu country-dropdown-list\"\n *ngIf=\"isExpanded\">\n <div class=\"action-menu-body\">\n <!--Country's List-->\n <a class=\"action-item\"\n *ngFor=\"let country of countryList\"\n [ngClass]=\"{'active': selectedCountry.countryName === country.countryName}\"\n (click)=\"countryChanged(country)\">\n <img class=\"country-flag\"\n [src]=\"country.flag\">\n <div>{{ country.countryName }}</div>\n <div>{{ country.countryCallingCode }}</div>\n </a>\n\n <!--Custom Country-->\n <a class=\"action-item\"\n [ngClass]=\"{'active': selectedCountry.countryName === customCountry.countryName}\"\n (click)=\"countryChanged(customCountry)\">\n <img class=\"country-flag\"\n [src]=\"customCountry.flag\">\n <div>{{ customCountry.countryName }}</div>\n <div>{{ customCountry.countryCallingCode }}</div>\n </a>\n </div>\n </div>\n</div>\n", styles: [":host{display:block;overflow:visible}.phone-input-component{position:relative;width:100%}.phone-input-component .material-input,.phone-input-component .zen-input{display:flex;align-items:center;gap:4px;border:1px solid #D0D5DD;border-radius:10px;padding:8px 14px;background:#FFFFFF;transition:border-color .2s;box-sizing:border-box}.phone-input-component .material-input:focus-within,.phone-input-component .zen-input:focus-within{border-color:#2188d9;z-index:1;position:relative}.phone-input-component .material-input .country-select,.phone-input-component .zen-input .country-select{display:flex;align-items:center;gap:4px;cursor:pointer;-webkit-user-select:none;user-select:none;text-decoration:none;outline:none;flex-shrink:0}.phone-input-component .material-input .country-select .country-flag,.phone-input-component .zen-input .country-select .country-flag{width:24px;height:24px;object-fit:contain}.phone-input-component .material-input .country-select .expand-icon,.phone-input-component .zen-input .country-select .expand-icon{color:#2188d9;font-size:20px;transition:transform .3s}.phone-input-component .material-input .country-select .expand-icon.active,.phone-input-component .zen-input .country-select .expand-icon.active{transform:rotate(180deg)}.phone-input-component .material-input .country-select .code,.phone-input-component .zen-input .country-select .code{font-style:normal;font-weight:500;font-size:15px;line-height:24px;color:#333;min-width:32px}.phone-input-component .material-input .country-select:focus .expand-icon,.phone-input-component .zen-input .country-select:focus .expand-icon{color:#2188d9}.phone-input-component .material-input .phone-input,.phone-input-component .zen-input .phone-input{flex:1;border:none;outline:none;font-style:normal;font-weight:400;font-size:15px;line-height:24px;color:#333;background:transparent;min-width:0}.phone-input-component .country-dropdown-list{width:100%;margin-top:6px;border-radius:12px;box-shadow:0 2px 8px #0000000f,0 1px 3px #0000000a}.phone-input-component .country-dropdown-list .action-menu-body{padding:6px 0}.phone-input-component .country-dropdown-list .action-menu-body .action-item{padding:10px 16px;gap:12px;font-size:16px;font-weight:400;line-height:24px;color:#333}.phone-input-component .country-dropdown-list .action-menu-body .action-item .country-flag{width:28px;height:28px;border-radius:50%;object-fit:cover}.phone-input-component .country-dropdown-list .action-menu-body .action-item.active{background:#F0F4F8}.phone-input-component .country-dropdown-list .action-menu-body .action-item:hover{background:#F4F9FD}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
|
|
3105
3105
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduPhoneInputComponent, decorators: [{
|
|
3106
3106
|
type: Component,
|
|
3107
|
-
args: [{ selector: 'zen-phone-input', template: "<div class=\"phone-input-component\">\n <div class=\"material-input\">\n <a class=\"country-select\"\n (click)=\"toggle()\">\n <img class=\"country-flag\"\n [src]=\"selectedCountry.flag\">\n <i class=\"material-icons expand-icon\"\n [ngClass]=\"{'active': isExpanded}\">
|
|
3107
|
+
args: [{ selector: 'zen-phone-input', template: "<div class=\"phone-input-component\" [style.width]=\"width\">\n <div class=\"material-input\">\n <a class=\"country-select\"\n (click)=\"toggle()\">\n <img class=\"country-flag\"\n [src]=\"selectedCountry.flag\">\n <i class=\"material-icons expand-icon\"\n [ngClass]=\"{'active': isExpanded}\">expand_less</i>\n <div class=\"code\">{{ selectedCountry.countryCallingCode }}</div>\n </a>\n <input class=\"phone-input\"\n type=\"text\"\n [(ngModel)]=\"phoneText\"\n (ngModelChange)=\"phoneChanged(input)\"\n (click)=\"isExpanded = false\"\n [disabled]=\"disabled\"\n country-code=\"selectedCountry.countryCode\"\n [maxlength]=\"maxLength\"\n #input>\n </div>\n\n <div class=\"action-menu country-dropdown-list\"\n *ngIf=\"isExpanded\">\n <div class=\"action-menu-body\">\n <!--Country's List-->\n <a class=\"action-item\"\n *ngFor=\"let country of countryList\"\n [ngClass]=\"{'active': selectedCountry.countryName === country.countryName}\"\n (click)=\"countryChanged(country)\">\n <img class=\"country-flag\"\n [src]=\"country.flag\">\n <div>{{ country.countryName }}</div>\n <div>{{ country.countryCallingCode }}</div>\n </a>\n\n <!--Custom Country-->\n <a class=\"action-item\"\n [ngClass]=\"{'active': selectedCountry.countryName === customCountry.countryName}\"\n (click)=\"countryChanged(customCountry)\">\n <img class=\"country-flag\"\n [src]=\"customCountry.flag\">\n <div>{{ customCountry.countryName }}</div>\n <div>{{ customCountry.countryCallingCode }}</div>\n </a>\n </div>\n </div>\n</div>\n", styles: [":host{display:block;overflow:visible}.phone-input-component{position:relative;width:100%}.phone-input-component .material-input,.phone-input-component .zen-input{display:flex;align-items:center;gap:4px;border:1px solid #D0D5DD;border-radius:10px;padding:8px 14px;background:#FFFFFF;transition:border-color .2s;box-sizing:border-box}.phone-input-component .material-input:focus-within,.phone-input-component .zen-input:focus-within{border-color:#2188d9;z-index:1;position:relative}.phone-input-component .material-input .country-select,.phone-input-component .zen-input .country-select{display:flex;align-items:center;gap:4px;cursor:pointer;-webkit-user-select:none;user-select:none;text-decoration:none;outline:none;flex-shrink:0}.phone-input-component .material-input .country-select .country-flag,.phone-input-component .zen-input .country-select .country-flag{width:24px;height:24px;object-fit:contain}.phone-input-component .material-input .country-select .expand-icon,.phone-input-component .zen-input .country-select .expand-icon{color:#2188d9;font-size:20px;transition:transform .3s}.phone-input-component .material-input .country-select .expand-icon.active,.phone-input-component .zen-input .country-select .expand-icon.active{transform:rotate(180deg)}.phone-input-component .material-input .country-select .code,.phone-input-component .zen-input .country-select .code{font-style:normal;font-weight:500;font-size:15px;line-height:24px;color:#333;min-width:32px}.phone-input-component .material-input .country-select:focus .expand-icon,.phone-input-component .zen-input .country-select:focus .expand-icon{color:#2188d9}.phone-input-component .material-input .phone-input,.phone-input-component .zen-input .phone-input{flex:1;border:none;outline:none;font-style:normal;font-weight:400;font-size:15px;line-height:24px;color:#333;background:transparent;min-width:0}.phone-input-component .country-dropdown-list{width:100%;margin-top:6px;border-radius:12px;box-shadow:0 2px 8px #0000000f,0 1px 3px #0000000a}.phone-input-component .country-dropdown-list .action-menu-body{padding:6px 0}.phone-input-component .country-dropdown-list .action-menu-body .action-item{padding:10px 16px;gap:12px;font-size:16px;font-weight:400;line-height:24px;color:#333}.phone-input-component .country-dropdown-list .action-menu-body .action-item .country-flag{width:28px;height:28px;border-radius:50%;object-fit:cover}.phone-input-component .country-dropdown-list .action-menu-body .action-item.active{background:#F0F4F8}.phone-input-component .country-dropdown-list .action-menu-body .action-item:hover{background:#F4F9FD}\n"] }]
|
|
3108
3108
|
}], ctorParameters: function () { return []; }, propDecorators: { phone: [{
|
|
3109
3109
|
type: Input
|
|
3110
3110
|
}], maxLength: [{
|
|
@@ -3115,6 +3115,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
|
|
|
3115
3115
|
type: Output
|
|
3116
3116
|
}], disabled: [{
|
|
3117
3117
|
type: Input
|
|
3118
|
+
}], width: [{
|
|
3119
|
+
type: Input
|
|
3118
3120
|
}] } });
|
|
3119
3121
|
|
|
3120
3122
|
class ZenduSortHeaderComponent {
|
|
@@ -5992,10 +5994,10 @@ class ZenduTimepickerComponent {
|
|
|
5992
5994
|
}
|
|
5993
5995
|
}
|
|
5994
5996
|
ZenduTimepickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduTimepickerComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
5995
|
-
ZenduTimepickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ZenduTimepickerComponent, selector: "zen-timepicker", inputs: { mode: "mode", label: "label", value: "value", showSeconds: "showSeconds", disabled: "disabled", readonly: "readonly", placeholder: "placeholder", width: "width" }, outputs: { valueChange: "valueChange", apply: "apply", clear: "clear" }, host: { listeners: { "window:mousedown": "outsideClick($event)" } }, viewQueries: [{ propertyName: "pickerPopup", first: true, predicate: ["pickerPopup"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"zen-tp\">\n <!-- Input toggle button -->\n <button class=\"zen-tp__toggle zen-tp__toggle--box\"\n [class.zen-tp__toggle--active]=\"isPickerVisible\"\n [class.zen-tp__toggle--disabled]=\"disabled\"\n [class.zen-tp__toggle--readonly]=\"readonly\"\n [style.width]=\"width || null\"\n [disabled]=\"disabled || readonly\"\n (click)=\"togglePicker()\">\n <span class=\"zen-tp__display\" [class.zen-tp__display--placeholder]=\"!value\">\n {{ value ? formattedDisplayValue : defaultPlaceholder }}\n </span>\n <zen-icon class=\"zen-tp__icon\"\n [class.zen-tp__icon--filled]=\"value\"\n src=\"assets/ng-zenduit/icons/time.svg\">\n </zen-icon>\n </button>\n\n <!-- Picker dropdown -->\n <div class=\"zen-tp__dropdown\"\n #pickerPopup\n *ngIf=\"isPickerVisible\"\n [class.zen-tp__dropdown--right]=\"right\"\n [class.zen-tp__dropdown--bottom]=\"bottom\">\n <div class=\"zen-tp__popup\">\n <!-- Header -->\n <div class=\"zen-tp__popup-label\">{{ label || defaultLabel }}</div>\n\n <!-- Scroll Columns -->\n <div class=\"zen-tp__columns\">\n <!-- Hours -->\n <div class=\"zen-tp__scroll-group\">\n <div class=\"zen-tp__scroll-col\"\n #scrollCol\n (scroll)=\"onScroll($event, 'hours')\"\n (mousedown)=\"onMouseDown($event, scrollCol)\"\n (mousemove)=\"onMouseMove($event, scrollCol)\"\n (mouseup)=\"onMouseUp()\"\n (mouseleave)=\"onMouseUp()\">\n <div class=\"zen-tp__scroll-spacer\"></div>\n <div *ngFor=\"let h of hours\"\n class=\"zen-tp__scroll-item\"\n [class.zen-tp__scroll-item--selected]=\"h === selectedHours\"\n (click)=\"selectHour(h)\">\n {{ formatNum(h) }}\n </div>\n <div class=\"zen-tp__scroll-spacer\"></div>\n </div>\n <div class=\"zen-tp__fade zen-tp__fade--top\"></div>\n <div class=\"zen-tp__fade zen-tp__fade--bottom\"></div>\n <div class=\"zen-tp__highlight\"></div>\n </div>\n\n <span class=\"zen-tp__separator\">{{ hourSeparator }}</span>\n\n <!-- Minutes -->\n <div class=\"zen-tp__scroll-group\">\n <div class=\"zen-tp__scroll-col\"\n #scrollCol\n (scroll)=\"onScroll($event, 'minutes')\"\n (mousedown)=\"onMouseDown($event, scrollCol)\"\n (mousemove)=\"onMouseMove($event, scrollCol)\"\n (mouseup)=\"onMouseUp()\"\n (mouseleave)=\"onMouseUp()\">\n <div class=\"zen-tp__scroll-spacer\"></div>\n <div *ngFor=\"let m of minutes\"\n class=\"zen-tp__scroll-item\"\n [class.zen-tp__scroll-item--selected]=\"m === selectedMinutes\"\n (click)=\"selectMinute(m)\">\n {{ formatNum(m) }}\n </div>\n <div class=\"zen-tp__scroll-spacer\"></div>\n </div>\n <div class=\"zen-tp__fade zen-tp__fade--top\"></div>\n <div class=\"zen-tp__fade zen-tp__fade--bottom\"></div>\n <div class=\"zen-tp__highlight\"></div>\n </div>\n\n <span class=\"zen-tp__separator\" *ngIf=\"showSeconds && mode === 'clock'\">:</span>\n <span class=\"zen-tp__separator zen-tp__separator--unit\" *ngIf=\"mode === 'duration'\">min</span>\n\n <!-- Seconds -->\n <div class=\"zen-tp__scroll-group\" *ngIf=\"showSeconds\">\n <div class=\"zen-tp__scroll-col\"\n #scrollCol\n (scroll)=\"onScroll($event, 'seconds')\"\n (mousedown)=\"onMouseDown($event, scrollCol)\"\n (mousemove)=\"onMouseMove($event, scrollCol)\"\n (mouseup)=\"onMouseUp()\"\n (mouseleave)=\"onMouseUp()\">\n <div class=\"zen-tp__scroll-spacer\"></div>\n <div *ngFor=\"let s of seconds\"\n class=\"zen-tp__scroll-item\"\n [class.zen-tp__scroll-item--selected]=\"s === selectedSeconds\"\n (click)=\"selectSecond(s)\">\n {{ formatNum(s) }}\n </div>\n <div class=\"zen-tp__scroll-spacer\"></div>\n </div>\n <div class=\"zen-tp__fade zen-tp__fade--top\"></div>\n <div class=\"zen-tp__fade zen-tp__fade--bottom\"></div>\n <div class=\"zen-tp__highlight\"></div>\n </div>\n\n <span class=\"zen-tp__separator zen-tp__separator--unit\"\n *ngIf=\"mode === 'duration' && showSeconds\">\n sec\n </span>\n\n <!-- AM/PM Toggle (Clock mode only) -->\n <div class=\"zen-tp__period\" *ngIf=\"mode === 'clock'\">\n <button class=\"zen-tp__period-btn\"\n [class.zen-tp__period-btn--active]=\"selectedPeriod === 'AM'\"\n (click)=\"selectPeriod('AM')\">\n AM\n </button>\n <button class=\"zen-tp__period-btn\"\n [class.zen-tp__period-btn--active]=\"selectedPeriod === 'PM'\"\n (click)=\"selectPeriod('PM')\">\n PM\n </button>\n </div>\n </div>\n\n <!-- Divider -->\n <div class=\"zen-tp__divider\"></div>\n\n <!-- Actions -->\n <div class=\"zen-tp__actions\" [class.zen-tp__actions--full]=\"mode === 'duration'\">\n <button class=\"zen-tp__btn zen-tp__btn--clear\" (click)=\"onClear()\">Clear</button>\n <button class=\"zen-tp__btn zen-tp__btn--apply\" (click)=\"onApply()\">Apply</button>\n </div>\n </div>\n </div>\n</div>\n", styles: [":host{display:inline-block;position:relative;width:100%}.zen-tp{width:100%;position:relative}.zen-tp *{box-sizing:border-box}.zen-tp__toggle{display:inline-flex;align-items:center;gap:8px;min-width:150px;transition:.3s;background:var(--color-white-primary, #ffffff);-webkit-appearance:none;appearance:none;outline:none;cursor:pointer;border:none;border-radius:0;border-bottom:1px solid var(--color-white-tint-4, #d6d6d8);padding:0 0 8px;font-size:16px;font-weight:400;line-height:130%;color:var(--color-grey-primary, #4f4f4f)}.zen-tp__toggle--box{border:1px solid #d0d5dd;border-radius:8px;padding:10px 14px;gap:8px}.zen-tp__toggle:hover{border-color:#667085}.zen-tp__toggle:focus,.zen-tp__toggle--active{border-color:#136ab6;box-shadow:0 0 0 3px #136ab61f}.zen-tp__toggle--disabled{cursor:not-allowed;border-color:var(--color-white-tint-3, #e0e0e0)}.zen-tp__toggle--disabled .zen-tp__display{color:var(--color-white-tint-3, #e0e0e0)!important}.zen-tp__toggle--disabled .zen-tp__icon{background-color:var(--color-white-tint-3, #e0e0e0)!important}.zen-tp__toggle--readonly{cursor:default;border-color:var(--color-white-tint-3, #e0e0e0)}.zen-tp__toggle--readonly .zen-tp__display{color:var(--color-white-tint-3, #e0e0e0)!important}.zen-tp__toggle--readonly .zen-tp__icon{background-color:var(--color-white-tint-3, #e0e0e0)!important}.zen-tp__display{flex:1;text-align:left;font-size:16px;font-weight:400;line-height:24px;color:#1d2939}.zen-tp__display--placeholder{color:#667085}.zen-tp__icon{width:20px;height:20px;flex-shrink:0;background-color:#667085;transition:.2s}.zen-tp__icon--filled{background-color:#344054}.zen-tp__dropdown{position:absolute;top:100%;left:0;z-index:1000;margin-top:4px}.zen-tp__dropdown--right{left:auto;right:0}.zen-tp__dropdown--bottom{top:auto;bottom:100%;margin-top:0;margin-bottom:4px}.zen-tp__popup{background:#ffffff;border-radius:8px;box-shadow:0 8px 8px -4px #10182808,0 20px 24px -4px #10182814;padding:16px;display:flex;flex-direction:column;gap:16px;align-items:flex-end;font-family:inherit}.zen-tp__popup-label{width:100%;font-size:14px;font-weight:500;line-height:20px;color:#1d2939}.zen-tp__columns{display:flex;align-items:center;gap:24px}.zen-tp__scroll-group{position:relative;width:38px;height:126px;overflow:hidden}.zen-tp__scroll-col{width:100%;height:100%;overflow-y:auto;scroll-snap-type:y mandatory;-ms-overflow-style:none;scrollbar-width:none;cursor:grab;-webkit-user-select:none;user-select:none}.zen-tp__scroll-col::-webkit-scrollbar{display:none}.zen-tp__scroll-col:active{cursor:grabbing}.zen-tp__scroll-spacer{height:42px;flex-shrink:0}.zen-tp__scroll-item{height:42px;display:flex;align-items:center;justify-content:center;font-size:16px;font-weight:500;line-height:24px;color:#1d2939;scroll-snap-align:center;cursor:pointer;transition:opacity .15s ease;opacity:.4;position:relative;z-index:1}.zen-tp__scroll-item--selected{opacity:1}.zen-tp__highlight{position:absolute;top:50%;left:0;right:0;height:42px;transform:translateY(-50%);background:#f2f4f7;border-radius:8px;pointer-events:none;z-index:0}.zen-tp__fade{position:absolute;left:0;right:0;height:44px;pointer-events:none;z-index:2}.zen-tp__fade--top{top:0;background:linear-gradient(to bottom,#ffffff,rgba(255,255,255,0))}.zen-tp__fade--bottom{bottom:0;background:linear-gradient(to top,#ffffff,rgba(255,255,255,0))}.zen-tp__separator{font-size:14px;font-weight:500;line-height:20px;color:#667085;flex-shrink:0;-webkit-user-select:none;user-select:none}.zen-tp__period{display:flex;flex-direction:column;gap:16px;flex-shrink:0}.zen-tp__period-btn{display:flex;align-items:center;justify-content:center;padding:8px 14px;border-radius:8px;font-size:14px;font-weight:500;line-height:20px;cursor:pointer;transition:all .15s ease;white-space:nowrap;border:1px solid #d0d5dd;background:#ffffff;color:#344054;box-shadow:0 1px 2px #1018280d}.zen-tp__period-btn:hover{background:#fafafa}.zen-tp__period-btn--active{background:#f1f7fe;border-color:#f1f7fe;color:#105494}.zen-tp__period-btn--active:hover{background:#e7f2fd}.zen-tp__divider{width:100%;height:1px;background:#eaecf0}.zen-tp__actions{display:flex;gap:12px}.zen-tp__actions--full{width:100%}.zen-tp__actions--full .zen-tp__btn{flex:1}.zen-tp__btn{display:flex;align-items:center;justify-content:center;padding:8px 14px;border-radius:8px;font-size:14px;font-weight:500;line-height:20px;cursor:pointer;transition:all .15s ease;white-space:nowrap;box-shadow:0 1px 2px #1018280d}.zen-tp__btn--clear{background:#ffffff;border:1px solid #d0d5dd;color:#344054}.zen-tp__btn--clear:hover{background:#fafafa}.zen-tp__btn--apply{background:#136ab6;border:1px solid #136ab6;color:#fff}.zen-tp__btn--apply:hover{background:#115d9f}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ZenduIconComponent, selector: "zen-icon", inputs: ["src"] }] });
|
|
5997
|
+
ZenduTimepickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ZenduTimepickerComponent, selector: "zen-timepicker", inputs: { mode: "mode", label: "label", value: "value", showSeconds: "showSeconds", disabled: "disabled", readonly: "readonly", placeholder: "placeholder", width: "width" }, outputs: { valueChange: "valueChange", apply: "apply", clear: "clear" }, host: { listeners: { "window:mousedown": "outsideClick($event)" } }, viewQueries: [{ propertyName: "pickerPopup", first: true, predicate: ["pickerPopup"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"zen-tp\">\n <!-- Input toggle button -->\n <button class=\"zen-tp__toggle zen-tp__toggle--box\"\n [class.zen-tp__toggle--active]=\"isPickerVisible\"\n [class.zen-tp__toggle--disabled]=\"disabled\"\n [class.zen-tp__toggle--readonly]=\"readonly\"\n [style.width]=\"width || null\"\n [disabled]=\"disabled || readonly\"\n (click)=\"togglePicker()\">\n <span class=\"zen-tp__display\" [class.zen-tp__display--placeholder]=\"!value\">\n {{ value ? formattedDisplayValue : defaultPlaceholder }}\n </span>\n <zen-icon class=\"zen-tp__icon\"\n [class.zen-tp__icon--filled]=\"value\"\n src=\"assets/ng-zenduit/icons/time.svg\">\n </zen-icon>\n </button>\n\n <!-- Picker dropdown -->\n <div class=\"zen-tp__dropdown\"\n #pickerPopup\n *ngIf=\"isPickerVisible\"\n [class.zen-tp__dropdown--right]=\"right\"\n [class.zen-tp__dropdown--bottom]=\"bottom\">\n <div class=\"zen-tp__popup\">\n <!-- Header -->\n <div class=\"zen-tp__popup-label\">{{ label || defaultLabel }}</div>\n\n <!-- Scroll Columns -->\n <div class=\"zen-tp__columns\">\n <!-- Hours -->\n <div class=\"zen-tp__scroll-group\">\n <div class=\"zen-tp__scroll-col\"\n #scrollCol\n (scroll)=\"onScroll($event, 'hours')\"\n (mousedown)=\"onMouseDown($event, scrollCol)\"\n (mousemove)=\"onMouseMove($event, scrollCol)\"\n (mouseup)=\"onMouseUp()\"\n (mouseleave)=\"onMouseUp()\">\n <div class=\"zen-tp__scroll-spacer\"></div>\n <div *ngFor=\"let h of hours\"\n class=\"zen-tp__scroll-item\"\n [class.zen-tp__scroll-item--selected]=\"h === selectedHours\"\n (click)=\"selectHour(h)\">\n {{ formatNum(h) }}\n </div>\n <div class=\"zen-tp__scroll-spacer\"></div>\n </div>\n <div class=\"zen-tp__fade zen-tp__fade--top\"></div>\n <div class=\"zen-tp__fade zen-tp__fade--bottom\"></div>\n <div class=\"zen-tp__highlight\"></div>\n </div>\n\n <span class=\"zen-tp__separator\">{{ hourSeparator }}</span>\n\n <!-- Minutes -->\n <div class=\"zen-tp__scroll-group\">\n <div class=\"zen-tp__scroll-col\"\n #scrollCol\n (scroll)=\"onScroll($event, 'minutes')\"\n (mousedown)=\"onMouseDown($event, scrollCol)\"\n (mousemove)=\"onMouseMove($event, scrollCol)\"\n (mouseup)=\"onMouseUp()\"\n (mouseleave)=\"onMouseUp()\">\n <div class=\"zen-tp__scroll-spacer\"></div>\n <div *ngFor=\"let m of minutes\"\n class=\"zen-tp__scroll-item\"\n [class.zen-tp__scroll-item--selected]=\"m === selectedMinutes\"\n (click)=\"selectMinute(m)\">\n {{ formatNum(m) }}\n </div>\n <div class=\"zen-tp__scroll-spacer\"></div>\n </div>\n <div class=\"zen-tp__fade zen-tp__fade--top\"></div>\n <div class=\"zen-tp__fade zen-tp__fade--bottom\"></div>\n <div class=\"zen-tp__highlight\"></div>\n </div>\n\n <span class=\"zen-tp__separator\" *ngIf=\"showSeconds && mode === 'clock'\">:</span>\n <span class=\"zen-tp__separator zen-tp__separator--unit\" *ngIf=\"mode === 'duration'\">min</span>\n\n <!-- Seconds -->\n <div class=\"zen-tp__scroll-group\" *ngIf=\"showSeconds\">\n <div class=\"zen-tp__scroll-col\"\n #scrollCol\n (scroll)=\"onScroll($event, 'seconds')\"\n (mousedown)=\"onMouseDown($event, scrollCol)\"\n (mousemove)=\"onMouseMove($event, scrollCol)\"\n (mouseup)=\"onMouseUp()\"\n (mouseleave)=\"onMouseUp()\">\n <div class=\"zen-tp__scroll-spacer\"></div>\n <div *ngFor=\"let s of seconds\"\n class=\"zen-tp__scroll-item\"\n [class.zen-tp__scroll-item--selected]=\"s === selectedSeconds\"\n (click)=\"selectSecond(s)\">\n {{ formatNum(s) }}\n </div>\n <div class=\"zen-tp__scroll-spacer\"></div>\n </div>\n <div class=\"zen-tp__fade zen-tp__fade--top\"></div>\n <div class=\"zen-tp__fade zen-tp__fade--bottom\"></div>\n <div class=\"zen-tp__highlight\"></div>\n </div>\n\n <span class=\"zen-tp__separator zen-tp__separator--unit\"\n *ngIf=\"mode === 'duration' && showSeconds\">\n sec\n </span>\n\n <!-- AM/PM Toggle (Clock mode only) -->\n <div class=\"zen-tp__period\" *ngIf=\"mode === 'clock'\">\n <button class=\"zen-tp__period-btn\"\n [class.zen-tp__period-btn--active]=\"selectedPeriod === 'AM'\"\n (click)=\"selectPeriod('AM')\">\n AM\n </button>\n <button class=\"zen-tp__period-btn\"\n [class.zen-tp__period-btn--active]=\"selectedPeriod === 'PM'\"\n (click)=\"selectPeriod('PM')\">\n PM\n </button>\n </div>\n </div>\n\n <!-- Divider -->\n <div class=\"zen-tp__divider\"></div>\n\n <!-- Actions -->\n <div class=\"zen-tp__actions\" [class.zen-tp__actions--full]=\"mode === 'duration'\">\n <button class=\"zen-tp__btn zen-tp__btn--clear\" (click)=\"onClear()\">Clear</button>\n <button class=\"zen-tp__btn zen-tp__btn--apply\" (click)=\"onApply()\">Apply</button>\n </div>\n </div>\n </div>\n</div>\n", styles: [":host{display:inline-block;position:relative;width:100%}.zen-tp{width:100%;position:relative}.zen-tp *{box-sizing:border-box}.zen-tp__toggle{display:inline-flex;align-items:center;gap:8px;min-width:150px;transition:.3s;background:var(--color-white-primary, #ffffff);-webkit-appearance:none;appearance:none;outline:none;cursor:pointer;border:none;border-radius:0;border-bottom:1px solid var(--color-white-tint-4, #d6d6d8);padding:0 0 8px;font-size:16px;font-weight:400;line-height:130%;color:var(--color-grey-primary, #4f4f4f)}.zen-tp__toggle--box{border:1px solid #D0D5DD;border-radius:8px;padding:10px 14px;gap:8px}.zen-tp__toggle:hover{border-color:#667085}.zen-tp__toggle:focus,.zen-tp__toggle--active{border-color:#136ab6;box-shadow:0 0 0 3px #136ab61f}.zen-tp__toggle--disabled{cursor:not-allowed;border-color:var(--color-white-tint-3, #e0e0e0)}.zen-tp__toggle--disabled .zen-tp__display{color:var(--color-white-tint-3, #e0e0e0)!important}.zen-tp__toggle--disabled .zen-tp__icon{background-color:var(--color-white-tint-3, #e0e0e0)!important}.zen-tp__toggle--readonly{cursor:default;border-color:var(--color-white-tint-3, #e0e0e0)}.zen-tp__toggle--readonly .zen-tp__display{color:var(--color-white-tint-3, #e0e0e0)!important}.zen-tp__toggle--readonly .zen-tp__icon{background-color:var(--color-white-tint-3, #e0e0e0)!important}.zen-tp__display{flex:1;text-align:left;font-size:16px;font-weight:400;line-height:24px;color:#1d2939}.zen-tp__display--placeholder{color:#667085}.zen-tp__icon{width:20px;height:20px;flex-shrink:0;background-color:#667085;transition:.2s}.zen-tp__icon--filled{background-color:#344054}.zen-tp__dropdown{position:absolute;top:100%;left:0;z-index:1000;margin-top:4px}.zen-tp__dropdown--right{left:auto;right:0}.zen-tp__dropdown--bottom{top:auto;bottom:100%;margin-top:0;margin-bottom:4px}.zen-tp__popup{background:#FFFFFF;border-radius:8px;box-shadow:0 8px 8px -4px #10182808,0 20px 24px -4px #10182814;padding:16px;display:flex;flex-direction:column;gap:16px;align-items:flex-end;font-family:inherit}.zen-tp__popup-label{width:100%;font-size:14px;font-weight:500;line-height:20px;color:#1d2939}.zen-tp__columns{display:flex;align-items:center;gap:24px}.zen-tp__scroll-group{position:relative;width:38px;height:126px;overflow:hidden}.zen-tp__scroll-col{width:100%;height:100%;overflow-y:auto;scroll-snap-type:y mandatory;-ms-overflow-style:none;scrollbar-width:none;cursor:grab;-webkit-user-select:none;user-select:none}.zen-tp__scroll-col::-webkit-scrollbar{display:none}.zen-tp__scroll-col:active{cursor:grabbing}.zen-tp__scroll-spacer{height:42px;flex-shrink:0}.zen-tp__scroll-item{height:42px;display:flex;align-items:center;justify-content:center;font-size:16px;font-weight:500;line-height:24px;color:#1d2939;scroll-snap-align:center;cursor:pointer;transition:opacity .15s ease;opacity:.4;position:relative;z-index:1}.zen-tp__scroll-item--selected{opacity:1}.zen-tp__highlight{position:absolute;top:50%;left:0;right:0;height:42px;transform:translateY(-50%);background:#F2F4F7;border-radius:8px;pointer-events:none;z-index:0}.zen-tp__fade{position:absolute;left:0;right:0;height:44px;pointer-events:none;z-index:2}.zen-tp__fade--top{top:0;background:linear-gradient(to bottom,#FFFFFF,rgba(255,255,255,0))}.zen-tp__fade--bottom{bottom:0;background:linear-gradient(to top,#FFFFFF,rgba(255,255,255,0))}.zen-tp__separator{font-size:14px;font-weight:500;line-height:20px;color:#667085;flex-shrink:0;-webkit-user-select:none;user-select:none}.zen-tp__period{display:flex;flex-direction:column;gap:16px;flex-shrink:0}.zen-tp__period-btn{display:flex;align-items:center;justify-content:center;padding:8px 14px;border-radius:8px;font-size:14px;font-weight:500;line-height:20px;cursor:pointer;transition:all .15s ease;white-space:nowrap;border:1px solid #D0D5DD;background:#FFFFFF;color:#344054;box-shadow:0 1px 2px #1018280d}.zen-tp__period-btn:hover{background:#fafafa}.zen-tp__period-btn--active{background:#F1F7FE;border-color:#f1f7fe;color:#105494}.zen-tp__period-btn--active:hover{background:#e7f2fd}.zen-tp__divider{width:100%;height:1px;background:#EAECF0}.zen-tp__actions{display:flex;gap:12px}.zen-tp__actions--full{width:100%}.zen-tp__actions--full .zen-tp__btn{flex:1}.zen-tp__btn{display:flex;align-items:center;justify-content:center;padding:8px 14px;border-radius:8px;font-size:14px;font-weight:500;line-height:20px;cursor:pointer;transition:all .15s ease;white-space:nowrap;box-shadow:0 1px 2px #1018280d}.zen-tp__btn--clear{background:#FFFFFF;border:1px solid #D0D5DD;color:#344054}.zen-tp__btn--clear:hover{background:#fafafa}.zen-tp__btn--apply{background:#136AB6;border:1px solid #136AB6;color:#fff}.zen-tp__btn--apply:hover{background:#115d9f}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ZenduIconComponent, selector: "zen-icon", inputs: ["src"] }] });
|
|
5996
5998
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduTimepickerComponent, decorators: [{
|
|
5997
5999
|
type: Component,
|
|
5998
|
-
args: [{ selector: 'zen-timepicker', template: "<div class=\"zen-tp\">\n <!-- Input toggle button -->\n <button class=\"zen-tp__toggle zen-tp__toggle--box\"\n [class.zen-tp__toggle--active]=\"isPickerVisible\"\n [class.zen-tp__toggle--disabled]=\"disabled\"\n [class.zen-tp__toggle--readonly]=\"readonly\"\n [style.width]=\"width || null\"\n [disabled]=\"disabled || readonly\"\n (click)=\"togglePicker()\">\n <span class=\"zen-tp__display\" [class.zen-tp__display--placeholder]=\"!value\">\n {{ value ? formattedDisplayValue : defaultPlaceholder }}\n </span>\n <zen-icon class=\"zen-tp__icon\"\n [class.zen-tp__icon--filled]=\"value\"\n src=\"assets/ng-zenduit/icons/time.svg\">\n </zen-icon>\n </button>\n\n <!-- Picker dropdown -->\n <div class=\"zen-tp__dropdown\"\n #pickerPopup\n *ngIf=\"isPickerVisible\"\n [class.zen-tp__dropdown--right]=\"right\"\n [class.zen-tp__dropdown--bottom]=\"bottom\">\n <div class=\"zen-tp__popup\">\n <!-- Header -->\n <div class=\"zen-tp__popup-label\">{{ label || defaultLabel }}</div>\n\n <!-- Scroll Columns -->\n <div class=\"zen-tp__columns\">\n <!-- Hours -->\n <div class=\"zen-tp__scroll-group\">\n <div class=\"zen-tp__scroll-col\"\n #scrollCol\n (scroll)=\"onScroll($event, 'hours')\"\n (mousedown)=\"onMouseDown($event, scrollCol)\"\n (mousemove)=\"onMouseMove($event, scrollCol)\"\n (mouseup)=\"onMouseUp()\"\n (mouseleave)=\"onMouseUp()\">\n <div class=\"zen-tp__scroll-spacer\"></div>\n <div *ngFor=\"let h of hours\"\n class=\"zen-tp__scroll-item\"\n [class.zen-tp__scroll-item--selected]=\"h === selectedHours\"\n (click)=\"selectHour(h)\">\n {{ formatNum(h) }}\n </div>\n <div class=\"zen-tp__scroll-spacer\"></div>\n </div>\n <div class=\"zen-tp__fade zen-tp__fade--top\"></div>\n <div class=\"zen-tp__fade zen-tp__fade--bottom\"></div>\n <div class=\"zen-tp__highlight\"></div>\n </div>\n\n <span class=\"zen-tp__separator\">{{ hourSeparator }}</span>\n\n <!-- Minutes -->\n <div class=\"zen-tp__scroll-group\">\n <div class=\"zen-tp__scroll-col\"\n #scrollCol\n (scroll)=\"onScroll($event, 'minutes')\"\n (mousedown)=\"onMouseDown($event, scrollCol)\"\n (mousemove)=\"onMouseMove($event, scrollCol)\"\n (mouseup)=\"onMouseUp()\"\n (mouseleave)=\"onMouseUp()\">\n <div class=\"zen-tp__scroll-spacer\"></div>\n <div *ngFor=\"let m of minutes\"\n class=\"zen-tp__scroll-item\"\n [class.zen-tp__scroll-item--selected]=\"m === selectedMinutes\"\n (click)=\"selectMinute(m)\">\n {{ formatNum(m) }}\n </div>\n <div class=\"zen-tp__scroll-spacer\"></div>\n </div>\n <div class=\"zen-tp__fade zen-tp__fade--top\"></div>\n <div class=\"zen-tp__fade zen-tp__fade--bottom\"></div>\n <div class=\"zen-tp__highlight\"></div>\n </div>\n\n <span class=\"zen-tp__separator\" *ngIf=\"showSeconds && mode === 'clock'\">:</span>\n <span class=\"zen-tp__separator zen-tp__separator--unit\" *ngIf=\"mode === 'duration'\">min</span>\n\n <!-- Seconds -->\n <div class=\"zen-tp__scroll-group\" *ngIf=\"showSeconds\">\n <div class=\"zen-tp__scroll-col\"\n #scrollCol\n (scroll)=\"onScroll($event, 'seconds')\"\n (mousedown)=\"onMouseDown($event, scrollCol)\"\n (mousemove)=\"onMouseMove($event, scrollCol)\"\n (mouseup)=\"onMouseUp()\"\n (mouseleave)=\"onMouseUp()\">\n <div class=\"zen-tp__scroll-spacer\"></div>\n <div *ngFor=\"let s of seconds\"\n class=\"zen-tp__scroll-item\"\n [class.zen-tp__scroll-item--selected]=\"s === selectedSeconds\"\n (click)=\"selectSecond(s)\">\n {{ formatNum(s) }}\n </div>\n <div class=\"zen-tp__scroll-spacer\"></div>\n </div>\n <div class=\"zen-tp__fade zen-tp__fade--top\"></div>\n <div class=\"zen-tp__fade zen-tp__fade--bottom\"></div>\n <div class=\"zen-tp__highlight\"></div>\n </div>\n\n <span class=\"zen-tp__separator zen-tp__separator--unit\"\n *ngIf=\"mode === 'duration' && showSeconds\">\n sec\n </span>\n\n <!-- AM/PM Toggle (Clock mode only) -->\n <div class=\"zen-tp__period\" *ngIf=\"mode === 'clock'\">\n <button class=\"zen-tp__period-btn\"\n [class.zen-tp__period-btn--active]=\"selectedPeriod === 'AM'\"\n (click)=\"selectPeriod('AM')\">\n AM\n </button>\n <button class=\"zen-tp__period-btn\"\n [class.zen-tp__period-btn--active]=\"selectedPeriod === 'PM'\"\n (click)=\"selectPeriod('PM')\">\n PM\n </button>\n </div>\n </div>\n\n <!-- Divider -->\n <div class=\"zen-tp__divider\"></div>\n\n <!-- Actions -->\n <div class=\"zen-tp__actions\" [class.zen-tp__actions--full]=\"mode === 'duration'\">\n <button class=\"zen-tp__btn zen-tp__btn--clear\" (click)=\"onClear()\">Clear</button>\n <button class=\"zen-tp__btn zen-tp__btn--apply\" (click)=\"onApply()\">Apply</button>\n </div>\n </div>\n </div>\n</div>\n", styles: [":host{display:inline-block;position:relative;width:100%}.zen-tp{width:100%;position:relative}.zen-tp *{box-sizing:border-box}.zen-tp__toggle{display:inline-flex;align-items:center;gap:8px;min-width:150px;transition:.3s;background:var(--color-white-primary, #ffffff);-webkit-appearance:none;appearance:none;outline:none;cursor:pointer;border:none;border-radius:0;border-bottom:1px solid var(--color-white-tint-4, #d6d6d8);padding:0 0 8px;font-size:16px;font-weight:400;line-height:130%;color:var(--color-grey-primary, #4f4f4f)}.zen-tp__toggle--box{border:1px solid #d0d5dd;border-radius:8px;padding:10px 14px;gap:8px}.zen-tp__toggle:hover{border-color:#667085}.zen-tp__toggle:focus,.zen-tp__toggle--active{border-color:#136ab6;box-shadow:0 0 0 3px #136ab61f}.zen-tp__toggle--disabled{cursor:not-allowed;border-color:var(--color-white-tint-3, #e0e0e0)}.zen-tp__toggle--disabled .zen-tp__display{color:var(--color-white-tint-3, #e0e0e0)!important}.zen-tp__toggle--disabled .zen-tp__icon{background-color:var(--color-white-tint-3, #e0e0e0)!important}.zen-tp__toggle--readonly{cursor:default;border-color:var(--color-white-tint-3, #e0e0e0)}.zen-tp__toggle--readonly .zen-tp__display{color:var(--color-white-tint-3, #e0e0e0)!important}.zen-tp__toggle--readonly .zen-tp__icon{background-color:var(--color-white-tint-3, #e0e0e0)!important}.zen-tp__display{flex:1;text-align:left;font-size:16px;font-weight:400;line-height:24px;color:#1d2939}.zen-tp__display--placeholder{color:#667085}.zen-tp__icon{width:20px;height:20px;flex-shrink:0;background-color:#667085;transition:.2s}.zen-tp__icon--filled{background-color:#344054}.zen-tp__dropdown{position:absolute;top:100%;left:0;z-index:1000;margin-top:4px}.zen-tp__dropdown--right{left:auto;right:0}.zen-tp__dropdown--bottom{top:auto;bottom:100%;margin-top:0;margin-bottom:4px}.zen-tp__popup{background:#ffffff;border-radius:8px;box-shadow:0 8px 8px -4px #10182808,0 20px 24px -4px #10182814;padding:16px;display:flex;flex-direction:column;gap:16px;align-items:flex-end;font-family:inherit}.zen-tp__popup-label{width:100%;font-size:14px;font-weight:500;line-height:20px;color:#1d2939}.zen-tp__columns{display:flex;align-items:center;gap:24px}.zen-tp__scroll-group{position:relative;width:38px;height:126px;overflow:hidden}.zen-tp__scroll-col{width:100%;height:100%;overflow-y:auto;scroll-snap-type:y mandatory;-ms-overflow-style:none;scrollbar-width:none;cursor:grab;-webkit-user-select:none;user-select:none}.zen-tp__scroll-col::-webkit-scrollbar{display:none}.zen-tp__scroll-col:active{cursor:grabbing}.zen-tp__scroll-spacer{height:42px;flex-shrink:0}.zen-tp__scroll-item{height:42px;display:flex;align-items:center;justify-content:center;font-size:16px;font-weight:500;line-height:24px;color:#1d2939;scroll-snap-align:center;cursor:pointer;transition:opacity .15s ease;opacity:.4;position:relative;z-index:1}.zen-tp__scroll-item--selected{opacity:1}.zen-tp__highlight{position:absolute;top:50%;left:0;right:0;height:42px;transform:translateY(-50%);background:#f2f4f7;border-radius:8px;pointer-events:none;z-index:0}.zen-tp__fade{position:absolute;left:0;right:0;height:44px;pointer-events:none;z-index:2}.zen-tp__fade--top{top:0;background:linear-gradient(to bottom,#ffffff,rgba(255,255,255,0))}.zen-tp__fade--bottom{bottom:0;background:linear-gradient(to top,#ffffff,rgba(255,255,255,0))}.zen-tp__separator{font-size:14px;font-weight:500;line-height:20px;color:#667085;flex-shrink:0;-webkit-user-select:none;user-select:none}.zen-tp__period{display:flex;flex-direction:column;gap:16px;flex-shrink:0}.zen-tp__period-btn{display:flex;align-items:center;justify-content:center;padding:8px 14px;border-radius:8px;font-size:14px;font-weight:500;line-height:20px;cursor:pointer;transition:all .15s ease;white-space:nowrap;border:1px solid #d0d5dd;background:#ffffff;color:#344054;box-shadow:0 1px 2px #1018280d}.zen-tp__period-btn:hover{background:#fafafa}.zen-tp__period-btn--active{background:#f1f7fe;border-color:#f1f7fe;color:#105494}.zen-tp__period-btn--active:hover{background:#e7f2fd}.zen-tp__divider{width:100%;height:1px;background:#eaecf0}.zen-tp__actions{display:flex;gap:12px}.zen-tp__actions--full{width:100%}.zen-tp__actions--full .zen-tp__btn{flex:1}.zen-tp__btn{display:flex;align-items:center;justify-content:center;padding:8px 14px;border-radius:8px;font-size:14px;font-weight:500;line-height:20px;cursor:pointer;transition:all .15s ease;white-space:nowrap;box-shadow:0 1px 2px #1018280d}.zen-tp__btn--clear{background:#ffffff;border:1px solid #d0d5dd;color:#344054}.zen-tp__btn--clear:hover{background:#fafafa}.zen-tp__btn--apply{background:#136ab6;border:1px solid #136ab6;color:#fff}.zen-tp__btn--apply:hover{background:#115d9f}\n"] }]
|
|
6000
|
+
args: [{ selector: 'zen-timepicker', template: "<div class=\"zen-tp\">\n <!-- Input toggle button -->\n <button class=\"zen-tp__toggle zen-tp__toggle--box\"\n [class.zen-tp__toggle--active]=\"isPickerVisible\"\n [class.zen-tp__toggle--disabled]=\"disabled\"\n [class.zen-tp__toggle--readonly]=\"readonly\"\n [style.width]=\"width || null\"\n [disabled]=\"disabled || readonly\"\n (click)=\"togglePicker()\">\n <span class=\"zen-tp__display\" [class.zen-tp__display--placeholder]=\"!value\">\n {{ value ? formattedDisplayValue : defaultPlaceholder }}\n </span>\n <zen-icon class=\"zen-tp__icon\"\n [class.zen-tp__icon--filled]=\"value\"\n src=\"assets/ng-zenduit/icons/time.svg\">\n </zen-icon>\n </button>\n\n <!-- Picker dropdown -->\n <div class=\"zen-tp__dropdown\"\n #pickerPopup\n *ngIf=\"isPickerVisible\"\n [class.zen-tp__dropdown--right]=\"right\"\n [class.zen-tp__dropdown--bottom]=\"bottom\">\n <div class=\"zen-tp__popup\">\n <!-- Header -->\n <div class=\"zen-tp__popup-label\">{{ label || defaultLabel }}</div>\n\n <!-- Scroll Columns -->\n <div class=\"zen-tp__columns\">\n <!-- Hours -->\n <div class=\"zen-tp__scroll-group\">\n <div class=\"zen-tp__scroll-col\"\n #scrollCol\n (scroll)=\"onScroll($event, 'hours')\"\n (mousedown)=\"onMouseDown($event, scrollCol)\"\n (mousemove)=\"onMouseMove($event, scrollCol)\"\n (mouseup)=\"onMouseUp()\"\n (mouseleave)=\"onMouseUp()\">\n <div class=\"zen-tp__scroll-spacer\"></div>\n <div *ngFor=\"let h of hours\"\n class=\"zen-tp__scroll-item\"\n [class.zen-tp__scroll-item--selected]=\"h === selectedHours\"\n (click)=\"selectHour(h)\">\n {{ formatNum(h) }}\n </div>\n <div class=\"zen-tp__scroll-spacer\"></div>\n </div>\n <div class=\"zen-tp__fade zen-tp__fade--top\"></div>\n <div class=\"zen-tp__fade zen-tp__fade--bottom\"></div>\n <div class=\"zen-tp__highlight\"></div>\n </div>\n\n <span class=\"zen-tp__separator\">{{ hourSeparator }}</span>\n\n <!-- Minutes -->\n <div class=\"zen-tp__scroll-group\">\n <div class=\"zen-tp__scroll-col\"\n #scrollCol\n (scroll)=\"onScroll($event, 'minutes')\"\n (mousedown)=\"onMouseDown($event, scrollCol)\"\n (mousemove)=\"onMouseMove($event, scrollCol)\"\n (mouseup)=\"onMouseUp()\"\n (mouseleave)=\"onMouseUp()\">\n <div class=\"zen-tp__scroll-spacer\"></div>\n <div *ngFor=\"let m of minutes\"\n class=\"zen-tp__scroll-item\"\n [class.zen-tp__scroll-item--selected]=\"m === selectedMinutes\"\n (click)=\"selectMinute(m)\">\n {{ formatNum(m) }}\n </div>\n <div class=\"zen-tp__scroll-spacer\"></div>\n </div>\n <div class=\"zen-tp__fade zen-tp__fade--top\"></div>\n <div class=\"zen-tp__fade zen-tp__fade--bottom\"></div>\n <div class=\"zen-tp__highlight\"></div>\n </div>\n\n <span class=\"zen-tp__separator\" *ngIf=\"showSeconds && mode === 'clock'\">:</span>\n <span class=\"zen-tp__separator zen-tp__separator--unit\" *ngIf=\"mode === 'duration'\">min</span>\n\n <!-- Seconds -->\n <div class=\"zen-tp__scroll-group\" *ngIf=\"showSeconds\">\n <div class=\"zen-tp__scroll-col\"\n #scrollCol\n (scroll)=\"onScroll($event, 'seconds')\"\n (mousedown)=\"onMouseDown($event, scrollCol)\"\n (mousemove)=\"onMouseMove($event, scrollCol)\"\n (mouseup)=\"onMouseUp()\"\n (mouseleave)=\"onMouseUp()\">\n <div class=\"zen-tp__scroll-spacer\"></div>\n <div *ngFor=\"let s of seconds\"\n class=\"zen-tp__scroll-item\"\n [class.zen-tp__scroll-item--selected]=\"s === selectedSeconds\"\n (click)=\"selectSecond(s)\">\n {{ formatNum(s) }}\n </div>\n <div class=\"zen-tp__scroll-spacer\"></div>\n </div>\n <div class=\"zen-tp__fade zen-tp__fade--top\"></div>\n <div class=\"zen-tp__fade zen-tp__fade--bottom\"></div>\n <div class=\"zen-tp__highlight\"></div>\n </div>\n\n <span class=\"zen-tp__separator zen-tp__separator--unit\"\n *ngIf=\"mode === 'duration' && showSeconds\">\n sec\n </span>\n\n <!-- AM/PM Toggle (Clock mode only) -->\n <div class=\"zen-tp__period\" *ngIf=\"mode === 'clock'\">\n <button class=\"zen-tp__period-btn\"\n [class.zen-tp__period-btn--active]=\"selectedPeriod === 'AM'\"\n (click)=\"selectPeriod('AM')\">\n AM\n </button>\n <button class=\"zen-tp__period-btn\"\n [class.zen-tp__period-btn--active]=\"selectedPeriod === 'PM'\"\n (click)=\"selectPeriod('PM')\">\n PM\n </button>\n </div>\n </div>\n\n <!-- Divider -->\n <div class=\"zen-tp__divider\"></div>\n\n <!-- Actions -->\n <div class=\"zen-tp__actions\" [class.zen-tp__actions--full]=\"mode === 'duration'\">\n <button class=\"zen-tp__btn zen-tp__btn--clear\" (click)=\"onClear()\">Clear</button>\n <button class=\"zen-tp__btn zen-tp__btn--apply\" (click)=\"onApply()\">Apply</button>\n </div>\n </div>\n </div>\n</div>\n", styles: [":host{display:inline-block;position:relative;width:100%}.zen-tp{width:100%;position:relative}.zen-tp *{box-sizing:border-box}.zen-tp__toggle{display:inline-flex;align-items:center;gap:8px;min-width:150px;transition:.3s;background:var(--color-white-primary, #ffffff);-webkit-appearance:none;appearance:none;outline:none;cursor:pointer;border:none;border-radius:0;border-bottom:1px solid var(--color-white-tint-4, #d6d6d8);padding:0 0 8px;font-size:16px;font-weight:400;line-height:130%;color:var(--color-grey-primary, #4f4f4f)}.zen-tp__toggle--box{border:1px solid #D0D5DD;border-radius:8px;padding:10px 14px;gap:8px}.zen-tp__toggle:hover{border-color:#667085}.zen-tp__toggle:focus,.zen-tp__toggle--active{border-color:#136ab6;box-shadow:0 0 0 3px #136ab61f}.zen-tp__toggle--disabled{cursor:not-allowed;border-color:var(--color-white-tint-3, #e0e0e0)}.zen-tp__toggle--disabled .zen-tp__display{color:var(--color-white-tint-3, #e0e0e0)!important}.zen-tp__toggle--disabled .zen-tp__icon{background-color:var(--color-white-tint-3, #e0e0e0)!important}.zen-tp__toggle--readonly{cursor:default;border-color:var(--color-white-tint-3, #e0e0e0)}.zen-tp__toggle--readonly .zen-tp__display{color:var(--color-white-tint-3, #e0e0e0)!important}.zen-tp__toggle--readonly .zen-tp__icon{background-color:var(--color-white-tint-3, #e0e0e0)!important}.zen-tp__display{flex:1;text-align:left;font-size:16px;font-weight:400;line-height:24px;color:#1d2939}.zen-tp__display--placeholder{color:#667085}.zen-tp__icon{width:20px;height:20px;flex-shrink:0;background-color:#667085;transition:.2s}.zen-tp__icon--filled{background-color:#344054}.zen-tp__dropdown{position:absolute;top:100%;left:0;z-index:1000;margin-top:4px}.zen-tp__dropdown--right{left:auto;right:0}.zen-tp__dropdown--bottom{top:auto;bottom:100%;margin-top:0;margin-bottom:4px}.zen-tp__popup{background:#FFFFFF;border-radius:8px;box-shadow:0 8px 8px -4px #10182808,0 20px 24px -4px #10182814;padding:16px;display:flex;flex-direction:column;gap:16px;align-items:flex-end;font-family:inherit}.zen-tp__popup-label{width:100%;font-size:14px;font-weight:500;line-height:20px;color:#1d2939}.zen-tp__columns{display:flex;align-items:center;gap:24px}.zen-tp__scroll-group{position:relative;width:38px;height:126px;overflow:hidden}.zen-tp__scroll-col{width:100%;height:100%;overflow-y:auto;scroll-snap-type:y mandatory;-ms-overflow-style:none;scrollbar-width:none;cursor:grab;-webkit-user-select:none;user-select:none}.zen-tp__scroll-col::-webkit-scrollbar{display:none}.zen-tp__scroll-col:active{cursor:grabbing}.zen-tp__scroll-spacer{height:42px;flex-shrink:0}.zen-tp__scroll-item{height:42px;display:flex;align-items:center;justify-content:center;font-size:16px;font-weight:500;line-height:24px;color:#1d2939;scroll-snap-align:center;cursor:pointer;transition:opacity .15s ease;opacity:.4;position:relative;z-index:1}.zen-tp__scroll-item--selected{opacity:1}.zen-tp__highlight{position:absolute;top:50%;left:0;right:0;height:42px;transform:translateY(-50%);background:#F2F4F7;border-radius:8px;pointer-events:none;z-index:0}.zen-tp__fade{position:absolute;left:0;right:0;height:44px;pointer-events:none;z-index:2}.zen-tp__fade--top{top:0;background:linear-gradient(to bottom,#FFFFFF,rgba(255,255,255,0))}.zen-tp__fade--bottom{bottom:0;background:linear-gradient(to top,#FFFFFF,rgba(255,255,255,0))}.zen-tp__separator{font-size:14px;font-weight:500;line-height:20px;color:#667085;flex-shrink:0;-webkit-user-select:none;user-select:none}.zen-tp__period{display:flex;flex-direction:column;gap:16px;flex-shrink:0}.zen-tp__period-btn{display:flex;align-items:center;justify-content:center;padding:8px 14px;border-radius:8px;font-size:14px;font-weight:500;line-height:20px;cursor:pointer;transition:all .15s ease;white-space:nowrap;border:1px solid #D0D5DD;background:#FFFFFF;color:#344054;box-shadow:0 1px 2px #1018280d}.zen-tp__period-btn:hover{background:#fafafa}.zen-tp__period-btn--active{background:#F1F7FE;border-color:#f1f7fe;color:#105494}.zen-tp__period-btn--active:hover{background:#e7f2fd}.zen-tp__divider{width:100%;height:1px;background:#EAECF0}.zen-tp__actions{display:flex;gap:12px}.zen-tp__actions--full{width:100%}.zen-tp__actions--full .zen-tp__btn{flex:1}.zen-tp__btn{display:flex;align-items:center;justify-content:center;padding:8px 14px;border-radius:8px;font-size:14px;font-weight:500;line-height:20px;cursor:pointer;transition:all .15s ease;white-space:nowrap;box-shadow:0 1px 2px #1018280d}.zen-tp__btn--clear{background:#FFFFFF;border:1px solid #D0D5DD;color:#344054}.zen-tp__btn--clear:hover{background:#fafafa}.zen-tp__btn--apply{background:#136AB6;border:1px solid #136AB6;color:#fff}.zen-tp__btn--apply:hover{background:#115d9f}\n"] }]
|
|
5999
6001
|
}], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { mode: [{
|
|
6000
6002
|
type: Input
|
|
6001
6003
|
}], label: [{
|
|
@@ -6026,6 +6028,823 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
|
|
|
6026
6028
|
args: ['window:mousedown', ['$event']]
|
|
6027
6029
|
}] } });
|
|
6028
6030
|
|
|
6031
|
+
const EMOJI_CATEGORIES = [
|
|
6032
|
+
{
|
|
6033
|
+
key: 'smileys', label: 'Smileys', icon: '😀',
|
|
6034
|
+
emojis: ['😀', '😄', '😁', '😆', '😅', '🤣', '😂', '🙂', '😉', '😊', '🥰', '😍', '😘', '😋', '😛', '😜', '🤔', '😏', '🙄', '😬', '😴', '🤯']
|
|
6035
|
+
},
|
|
6036
|
+
{
|
|
6037
|
+
key: 'gestures', label: 'Gestures', icon: '👋',
|
|
6038
|
+
emojis: ['👋', '✋', '👌', '✌', '🤞', '🤙', '👍', '👎', '👏', '🙌', '🤝', '🙏']
|
|
6039
|
+
},
|
|
6040
|
+
{
|
|
6041
|
+
key: 'hearts', label: 'Hearts', icon: '❤️',
|
|
6042
|
+
emojis: ['❤️', '🧡', '💛', '💚', '💙', '💜', '🖤', '💔', '💕', '💖']
|
|
6043
|
+
},
|
|
6044
|
+
{
|
|
6045
|
+
key: 'objects', label: 'Objects', icon: '⭐',
|
|
6046
|
+
emojis: ['⭐', '🔥', '✨', '🎉', '🏆', '💯', '✅', '❌', '⚡', '💡', '🔔', '🔗']
|
|
6047
|
+
},
|
|
6048
|
+
];
|
|
6049
|
+
class ZenduCommentTextareaComponent {
|
|
6050
|
+
constructor() {
|
|
6051
|
+
this.value = '';
|
|
6052
|
+
this.valueChange = new EventEmitter();
|
|
6053
|
+
this.label = '';
|
|
6054
|
+
this.placeholder = 'Enter a comment...';
|
|
6055
|
+
this.rows = 4;
|
|
6056
|
+
this.fileTypes = '*/*';
|
|
6057
|
+
this.loading = false;
|
|
6058
|
+
this.addComment = new EventEmitter();
|
|
6059
|
+
this.filesChanged = new EventEmitter();
|
|
6060
|
+
this.save = new EventEmitter();
|
|
6061
|
+
this.cancel = new EventEmitter();
|
|
6062
|
+
this.editing = false;
|
|
6063
|
+
this.emojiPickerOpen = false;
|
|
6064
|
+
this.emojiCategories = EMOJI_CATEGORIES;
|
|
6065
|
+
this.activeEmojiCategory = EMOJI_CATEGORIES[0].key;
|
|
6066
|
+
this.attachments = [];
|
|
6067
|
+
}
|
|
6068
|
+
ngOnInit() {
|
|
6069
|
+
var _a;
|
|
6070
|
+
if (((_a = this.value) === null || _a === void 0 ? void 0 : _a.length) > 0) {
|
|
6071
|
+
this.editing = true;
|
|
6072
|
+
}
|
|
6073
|
+
}
|
|
6074
|
+
onDocumentClick(event) {
|
|
6075
|
+
if (!this.emojiPickerOpen)
|
|
6076
|
+
return;
|
|
6077
|
+
const target = event.target;
|
|
6078
|
+
if (!target.closest('.zen-emoji-picker') && !target.closest('.zen-comment-textarea__icon-btn[title="Emoji"]')) {
|
|
6079
|
+
this.emojiPickerOpen = false;
|
|
6080
|
+
}
|
|
6081
|
+
}
|
|
6082
|
+
onInput(value) {
|
|
6083
|
+
this.value = value;
|
|
6084
|
+
this.valueChange.emit(value);
|
|
6085
|
+
this.editing = value.length > 0 || this.attachments.length > 0;
|
|
6086
|
+
}
|
|
6087
|
+
onKeydown(event) {
|
|
6088
|
+
if (event.key === 'Enter' && !event.shiftKey) {
|
|
6089
|
+
event.preventDefault();
|
|
6090
|
+
this.onAddComment();
|
|
6091
|
+
}
|
|
6092
|
+
}
|
|
6093
|
+
onAddComment() {
|
|
6094
|
+
if (this.loading)
|
|
6095
|
+
return;
|
|
6096
|
+
if (this.value.trim() || this.attachments.length) {
|
|
6097
|
+
this.addComment.emit({ text: this.value, files: this.attachments.map(a => a.file) });
|
|
6098
|
+
}
|
|
6099
|
+
}
|
|
6100
|
+
onSave() {
|
|
6101
|
+
if (this.loading)
|
|
6102
|
+
return;
|
|
6103
|
+
if (this.value.trim() || this.attachments.length) {
|
|
6104
|
+
this.save.emit({ text: this.value, files: this.attachments.map(a => a.file) });
|
|
6105
|
+
}
|
|
6106
|
+
}
|
|
6107
|
+
reset() {
|
|
6108
|
+
this.value = '';
|
|
6109
|
+
this.valueChange.emit(this.value);
|
|
6110
|
+
this.attachments = [];
|
|
6111
|
+
this.filesChanged.emit([]);
|
|
6112
|
+
this.editing = false;
|
|
6113
|
+
}
|
|
6114
|
+
onCancel() {
|
|
6115
|
+
this.value = '';
|
|
6116
|
+
this.valueChange.emit(this.value);
|
|
6117
|
+
this.attachments = [];
|
|
6118
|
+
this.filesChanged.emit([]);
|
|
6119
|
+
this.editing = false;
|
|
6120
|
+
this.cancel.emit();
|
|
6121
|
+
}
|
|
6122
|
+
toggleEmojiPicker() {
|
|
6123
|
+
this.emojiPickerOpen = !this.emojiPickerOpen;
|
|
6124
|
+
}
|
|
6125
|
+
selectEmoji(emoji) {
|
|
6126
|
+
this.value += emoji;
|
|
6127
|
+
this.valueChange.emit(this.value);
|
|
6128
|
+
this.editing = true;
|
|
6129
|
+
this.emojiPickerOpen = false;
|
|
6130
|
+
}
|
|
6131
|
+
setEmojiCategory(key) {
|
|
6132
|
+
this.activeEmojiCategory = key;
|
|
6133
|
+
}
|
|
6134
|
+
get activeEmojis() {
|
|
6135
|
+
const cat = this.emojiCategories.find(c => c.key === this.activeEmojiCategory);
|
|
6136
|
+
return cat ? cat.emojis : [];
|
|
6137
|
+
}
|
|
6138
|
+
onFileInput(event) {
|
|
6139
|
+
var _a;
|
|
6140
|
+
const input = event.target;
|
|
6141
|
+
if (!((_a = input.files) === null || _a === void 0 ? void 0 : _a.length))
|
|
6142
|
+
return;
|
|
6143
|
+
for (let i = 0; i < input.files.length; i++) {
|
|
6144
|
+
const file = input.files[i];
|
|
6145
|
+
this.attachments.push({
|
|
6146
|
+
file,
|
|
6147
|
+
name: file.name,
|
|
6148
|
+
size: this.formatFileSize(file.size),
|
|
6149
|
+
progress: 100,
|
|
6150
|
+
complete: true,
|
|
6151
|
+
});
|
|
6152
|
+
}
|
|
6153
|
+
this.editing = true;
|
|
6154
|
+
this.filesChanged.emit(this.attachments.map(a => a.file));
|
|
6155
|
+
input.value = '';
|
|
6156
|
+
}
|
|
6157
|
+
removeAttachment(index) {
|
|
6158
|
+
this.attachments.splice(index, 1);
|
|
6159
|
+
this.filesChanged.emit(this.attachments.map(a => a.file));
|
|
6160
|
+
if (!this.attachments.length && !this.value) {
|
|
6161
|
+
this.editing = false;
|
|
6162
|
+
}
|
|
6163
|
+
}
|
|
6164
|
+
getFileIcon(name) {
|
|
6165
|
+
var _a;
|
|
6166
|
+
const ext = ((_a = name.split('.').pop()) === null || _a === void 0 ? void 0 : _a.toLowerCase()) || '';
|
|
6167
|
+
if (['pdf', 'doc', 'docx', 'txt', 'xls', 'xlsx', 'csv', 'ppt', 'pptx'].includes(ext))
|
|
6168
|
+
return 'document';
|
|
6169
|
+
if (['mp4', 'mov', 'avi', 'mkv', 'webm', 'flv'].includes(ext))
|
|
6170
|
+
return 'video';
|
|
6171
|
+
return 'misc';
|
|
6172
|
+
}
|
|
6173
|
+
formatFileSize(bytes) {
|
|
6174
|
+
if (bytes < 1024)
|
|
6175
|
+
return bytes + ' B';
|
|
6176
|
+
if (bytes < 1024 * 1024)
|
|
6177
|
+
return (bytes / 1024).toFixed(0) + ' KB';
|
|
6178
|
+
return (bytes / (1024 * 1024)).toFixed(1) + ' MB';
|
|
6179
|
+
}
|
|
6180
|
+
}
|
|
6181
|
+
ZenduCommentTextareaComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduCommentTextareaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
6182
|
+
ZenduCommentTextareaComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ZenduCommentTextareaComponent, selector: "zen-comment-textarea", inputs: { value: "value", label: "label", placeholder: "placeholder", rows: "rows", fileTypes: "fileTypes", loading: "loading" }, outputs: { valueChange: "valueChange", addComment: "addComment", filesChanged: "filesChanged", save: "save", cancel: "cancel" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, ngImport: i0, template: "<div class=\"zen-comment-textarea\" [class.zen-comment-textarea--loading]=\"loading\">\n <!-- Label -->\n <label *ngIf=\"label\" class=\"zen-comment-textarea__label\">{{ label }}</label>\n\n <!-- Main box (top: attachments + textarea, bottom: toolbar) -->\n <div class=\"zen-comment-textarea__input-wrapper\">\n <!-- Attachments inside the textarea area -->\n <div class=\"zen-comment-textarea__attachments\" *ngIf=\"attachments.length\">\n <div class=\"zen-attachment\"\n *ngFor=\"let att of attachments; let i = index\">\n <div class=\"zen-attachment__content\">\n <div class=\"zen-attachment__icon\" [ngSwitch]=\"getFileIcon(att.name)\">\n <svg *ngSwitchCase=\"'document'\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M14 2H6C5.46957 2 4.96086 2.21071 4.58579 2.58579C4.21071 2.96086 4 3.46957 4 4V20C4 20.5304 4.21071 21.0391 4.58579 21.4142C4.96086 21.7893 5.46957 22 6 22H18C18.5304 22 19.0391 21.7893 19.4142 21.4142C19.7893 21.0391 20 20.5304 20 20V8L14 2Z\" stroke=\"#136AB6\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <polyline points=\"14,2 14,8 20,8\" stroke=\"#136AB6\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <svg *ngSwitchCase=\"'video'\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"2\" y=\"2\" width=\"20\" height=\"20\" rx=\"2.18\" ry=\"2.18\" stroke=\"#136AB6\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <line x1=\"7\" y1=\"2\" x2=\"7\" y2=\"22\" stroke=\"#136AB6\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <line x1=\"17\" y1=\"2\" x2=\"17\" y2=\"22\" stroke=\"#136AB6\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <line x1=\"2\" y1=\"12\" x2=\"22\" y2=\"12\" stroke=\"#136AB6\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <svg *ngSwitchCase=\"'misc'\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <polyline points=\"16,16 12,12 8,16\" stroke=\"#136AB6\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <line x1=\"12\" y1=\"12\" x2=\"12\" y2=\"21\" stroke=\"#136AB6\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M20.39 18.39A5 5 0 0 0 18 9h-1.26A8 8 0 1 0 3 16.3\" stroke=\"#136AB6\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <div class=\"zen-attachment__info\">\n <div class=\"zen-attachment__name\">{{ att.name }}</div>\n <div class=\"zen-attachment__size\">{{ att.size }}</div>\n </div>\n </div>\n <button type=\"button\" class=\"zen-attachment__remove\" (click)=\"removeAttachment(i)\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <polyline points=\"3,6 5,6 21,6\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M19 6V20C19 20.5304 18.7893 21.0391 18.4142 21.4142C18.0391 21.7893 17.5304 22 17 22H7C6.46957 22 5.96086 21.7893 5.58579 21.4142C5.21071 21.0391 5 20.5304 5 20V6M8 6V4C8 3.46957 8.21071 2.96086 8.58579 2.58579C8.96086 2.21071 9.46957 2 10 2H14C14.5304 2 15.0391 2.21071 15.4142 2.58579C15.7893 2.96086 16 3.46957 16 4V6\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n </div>\n\n <!-- Textarea -->\n <textarea class=\"zen-comment-textarea__input\"\n [rows]=\"rows\"\n [placeholder]=\"placeholder\"\n [value]=\"value\"\n [disabled]=\"loading\"\n (input)=\"onInput($any($event.target).value)\"\n (keydown)=\"onKeydown($event)\"></textarea>\n </div>\n\n <!-- Toolbar (bottom part with rounded bottom corners) -->\n <div class=\"zen-comment-textarea__toolbar\">\n <div class=\"zen-comment-textarea__toolbar-divider\"></div>\n\n <div class=\"zen-comment-textarea__toolbar-content\">\n <!-- Icon buttons -->\n <div class=\"zen-comment-textarea__toolbar-icons\">\n <div class=\"zen-comment-textarea__emoji-wrapper\">\n <button type=\"button\"\n class=\"zen-comment-textarea__icon-btn\"\n [class.zen-comment-textarea__icon-btn--active]=\"emojiPickerOpen\"\n title=\"Emoji\"\n (click)=\"toggleEmojiPicker()\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8 14C8 14 9.5 16 12 16C14.5 16 16 14 16 14\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <line x1=\"9\" y1=\"9\" x2=\"9.01\" y2=\"9\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <line x1=\"15\" y1=\"9\" x2=\"15.01\" y2=\"9\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n\n <!-- Emoji picker -->\n <div class=\"zen-emoji-picker\" *ngIf=\"emojiPickerOpen\">\n <div class=\"zen-emoji-picker__grid\">\n <button type=\"button\"\n class=\"zen-emoji-picker__emoji\"\n *ngFor=\"let emoji of activeEmojis\"\n (click)=\"selectEmoji(emoji)\">\n {{ emoji }}\n </button>\n </div>\n <div class=\"zen-emoji-picker__categories\">\n <button type=\"button\"\n class=\"zen-emoji-picker__category\"\n [class.zen-emoji-picker__category--active]=\"cat.key === activeEmojiCategory\"\n *ngFor=\"let cat of emojiCategories\"\n (click)=\"setEmojiCategory(cat.key)\">\n {{ cat.icon }}\n </button>\n </div>\n </div>\n </div>\n\n <button type=\"button\"\n class=\"zen-comment-textarea__icon-btn\"\n title=\"Attach file\"\n (click)=\"fileInput.click()\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M21.44 11.05L12.25 20.24C11.1242 21.3658 9.59723 21.9983 8.00505 21.9983C6.41286 21.9983 4.88589 21.3658 3.76005 20.24C2.6342 19.1142 2.00171 17.5872 2.00171 15.995C2.00171 14.4029 2.6342 12.8759 3.76005 11.75L12.95 2.56C13.7006 1.80944 14.7186 1.3877 15.78 1.3877C16.8415 1.3877 17.8595 1.80944 18.61 2.56C19.3606 3.31057 19.7823 4.32863 19.7823 5.39C19.7823 6.45138 19.3606 7.46944 18.61 8.22L9.41005 17.41C9.03476 17.7853 8.52573 17.9961 7.99505 17.9961C7.46436 17.9961 6.95533 17.7853 6.58005 17.41C6.20476 17.0347 5.99389 16.5257 5.99389 15.995C5.99389 15.4644 6.20476 14.9553 6.58005 14.58L15.07 6.1\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <input type=\"file\" #fileInput [accept]=\"fileTypes\" multiple hidden (change)=\"onFileInput($event)\" />\n </div>\n\n <!-- Right side actions -->\n <div class=\"zen-comment-textarea__actions\" *ngIf=\"!editing\">\n <span class=\"zen-comment-textarea__hint\">Press enter</span>\n <svg class=\"zen-comment-textarea__return-icon\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M3.33337 12.5L6.66671 15.8333M3.33337 12.5L6.66671 9.16667M3.33337 12.5H13.3334C14.2175 12.5 15.0653 12.1488 15.6904 11.5237C16.3155 10.8986 16.6667 10.0507 16.6667 9.16667V4.16667\" stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"zen-comment-textarea__hint\">to</span>\n <button type=\"button\" class=\"zen-comment-textarea__add-btn\" [disabled]=\"loading\" (click)=\"onAddComment()\">\n <span class=\"zen-comment-textarea__spinner\" *ngIf=\"loading\"></span>\n {{ loading ? 'Sending...' : 'Add Comment' }}\n </button>\n </div>\n\n <div class=\"zen-comment-textarea__actions\" *ngIf=\"editing\">\n <button type=\"button\" class=\"zen-comment-textarea__cancel-btn\" [disabled]=\"loading\" (click)=\"onCancel()\">\n Cancel\n </button>\n <button type=\"button\" class=\"zen-comment-textarea__save-btn\" [disabled]=\"loading\" (click)=\"onSave()\">\n <span class=\"zen-comment-textarea__spinner\" *ngIf=\"loading\"></span>\n {{ loading ? 'Saving...' : 'Save' }}\n </button>\n </div>\n </div>\n </div>\n</div>\n", styles: [".zen-comment-textarea{display:flex;flex-direction:column;width:100%}.zen-comment-textarea--loading{opacity:.7;pointer-events:none}.zen-comment-textarea__spinner{display:inline-block;width:14px;height:14px;border:2px solid currentColor;border-right-color:transparent;border-radius:50%;animation:zen-spin .6s linear infinite;vertical-align:middle;margin-right:4px}.zen-comment-textarea__label{font-family:Inter,sans-serif;font-weight:500;font-size:14px;line-height:20px;color:#344054;margin-bottom:6px}.zen-comment-textarea__input-wrapper{background:#FFFFFF;border:1px solid #D0D5DD;border-bottom:none;border-radius:8px 8px 0 0;box-shadow:0 1px 2px #1018280d}.zen-comment-textarea__attachments{display:flex;flex-direction:column;gap:8px;padding:10px 14px 0}.zen-comment-textarea__input{display:block;width:100%;min-height:86px;padding:10px 14px 0;border:none;outline:none;resize:vertical;font-family:Inter,sans-serif;font-weight:400;font-size:16px;line-height:24px;color:#101828;background:transparent;box-sizing:border-box}.zen-comment-textarea__input::placeholder{color:#667085}.zen-comment-textarea__toolbar{background:#FFFFFF;border:1px solid #D0D5DD;border-top:none;border-radius:0 0 8px 8px;padding:0 14px 8px}.zen-comment-textarea__toolbar-divider{height:1px;background:#EAECF0;margin-bottom:8px}.zen-comment-textarea__toolbar-content{display:flex;align-items:center;justify-content:space-between}.zen-comment-textarea__toolbar-icons{display:flex;gap:4px;align-items:center}.zen-comment-textarea__emoji-wrapper{position:relative}.zen-comment-textarea__icon-btn{display:flex;align-items:center;justify-content:center;width:36px;height:36px;border:none;background:transparent;border-radius:8px;cursor:pointer;padding:8px}.zen-comment-textarea__icon-btn:hover,.zen-comment-textarea__icon-btn--active{background:#F2F4F7}.zen-comment-textarea__icon-btn svg{flex-shrink:0}.zen-comment-textarea__actions{display:flex;align-items:center;gap:6px}.zen-comment-textarea__hint{font-family:Inter,sans-serif;font-weight:400;font-size:14px;line-height:20px;color:#667085}.zen-comment-textarea__return-icon{flex-shrink:0}.zen-comment-textarea__add-btn{border:none;background:transparent;font-family:Inter,sans-serif;font-weight:500;font-size:14px;line-height:20px;color:#105494;cursor:pointer;padding:0}.zen-comment-textarea__add-btn:hover{text-decoration:underline}.zen-comment-textarea__cancel-btn{display:inline-flex;align-items:center;justify-content:center;padding:10px 16px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 1px 2px #1018280d;font-family:Inter,sans-serif;font-weight:500;font-size:14px;line-height:20px;color:#344054;cursor:pointer}.zen-comment-textarea__cancel-btn:hover{background:#F9FAFB}.zen-comment-textarea__save-btn{display:inline-flex;align-items:center;justify-content:center;padding:10px 16px;background:#136AB6;border:1px solid #136AB6;border-radius:8px;box-shadow:0 1px 2px #1018280d;font-family:Inter,sans-serif;font-weight:500;font-size:14px;line-height:20px;color:#fff;cursor:pointer}.zen-comment-textarea__save-btn:hover{background:#105494;border-color:#105494}.zen-attachment{display:flex;align-items:center;gap:4px;padding:12px;background:#F9FAFB;border:1px solid #EAECF0;border-radius:8px}.zen-attachment__content{display:flex;flex:1;gap:12px;align-items:center;min-width:0}.zen-attachment__icon{flex-shrink:0;width:32px;height:32px;background:#E3EEFB;border:4px solid #F1F7FE;border-radius:28px;display:flex;align-items:center;justify-content:center}.zen-attachment__info{flex:1;min-width:0}.zen-attachment__name{font-family:Inter,sans-serif;font-weight:500;font-size:14px;line-height:20px;color:#344054;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.zen-attachment__size{font-family:Inter,sans-serif;font-weight:400;font-size:14px;line-height:20px;color:#667085}.zen-attachment__remove{flex-shrink:0;display:flex;align-items:center;justify-content:center;width:36px;height:36px;border:none;background:transparent;border-radius:8px;cursor:pointer;padding:8px;margin:-8px}.zen-attachment__remove:hover{background:#F2F4F7}.zen-emoji-picker{position:absolute;bottom:calc(100% + 4px);left:0;z-index:1000;background:#FFFFFF;border:1px solid #EAECF0;border-radius:12px;box-shadow:0 4px 16px #1018281f;width:320px;overflow:hidden}.zen-emoji-picker__grid{display:grid;grid-template-columns:repeat(8,1fr);gap:2px;padding:12px;max-height:200px;overflow-y:auto}.zen-emoji-picker__emoji{display:flex;align-items:center;justify-content:center;width:34px;height:34px;border:none;background:transparent;border-radius:8px;cursor:pointer;font-size:20px;line-height:1;padding:0}.zen-emoji-picker__emoji:hover{background:#F2F4F7}.zen-emoji-picker__categories{display:flex;gap:4px;padding:8px 12px;border-top:1px solid #EAECF0}.zen-emoji-picker__category{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border:none;background:transparent;border-radius:8px;cursor:pointer;font-size:16px;padding:0}.zen-emoji-picker__category:hover{background:#F2F4F7}.zen-emoji-picker__category--active{background:#E3EEFB}@keyframes zen-spin{to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }] });
|
|
6183
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduCommentTextareaComponent, decorators: [{
|
|
6184
|
+
type: Component,
|
|
6185
|
+
args: [{ selector: 'zen-comment-textarea', template: "<div class=\"zen-comment-textarea\" [class.zen-comment-textarea--loading]=\"loading\">\n <!-- Label -->\n <label *ngIf=\"label\" class=\"zen-comment-textarea__label\">{{ label }}</label>\n\n <!-- Main box (top: attachments + textarea, bottom: toolbar) -->\n <div class=\"zen-comment-textarea__input-wrapper\">\n <!-- Attachments inside the textarea area -->\n <div class=\"zen-comment-textarea__attachments\" *ngIf=\"attachments.length\">\n <div class=\"zen-attachment\"\n *ngFor=\"let att of attachments; let i = index\">\n <div class=\"zen-attachment__content\">\n <div class=\"zen-attachment__icon\" [ngSwitch]=\"getFileIcon(att.name)\">\n <svg *ngSwitchCase=\"'document'\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M14 2H6C5.46957 2 4.96086 2.21071 4.58579 2.58579C4.21071 2.96086 4 3.46957 4 4V20C4 20.5304 4.21071 21.0391 4.58579 21.4142C4.96086 21.7893 5.46957 22 6 22H18C18.5304 22 19.0391 21.7893 19.4142 21.4142C19.7893 21.0391 20 20.5304 20 20V8L14 2Z\" stroke=\"#136AB6\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <polyline points=\"14,2 14,8 20,8\" stroke=\"#136AB6\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <svg *ngSwitchCase=\"'video'\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"2\" y=\"2\" width=\"20\" height=\"20\" rx=\"2.18\" ry=\"2.18\" stroke=\"#136AB6\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <line x1=\"7\" y1=\"2\" x2=\"7\" y2=\"22\" stroke=\"#136AB6\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <line x1=\"17\" y1=\"2\" x2=\"17\" y2=\"22\" stroke=\"#136AB6\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <line x1=\"2\" y1=\"12\" x2=\"22\" y2=\"12\" stroke=\"#136AB6\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <svg *ngSwitchCase=\"'misc'\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <polyline points=\"16,16 12,12 8,16\" stroke=\"#136AB6\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <line x1=\"12\" y1=\"12\" x2=\"12\" y2=\"21\" stroke=\"#136AB6\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M20.39 18.39A5 5 0 0 0 18 9h-1.26A8 8 0 1 0 3 16.3\" stroke=\"#136AB6\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <div class=\"zen-attachment__info\">\n <div class=\"zen-attachment__name\">{{ att.name }}</div>\n <div class=\"zen-attachment__size\">{{ att.size }}</div>\n </div>\n </div>\n <button type=\"button\" class=\"zen-attachment__remove\" (click)=\"removeAttachment(i)\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <polyline points=\"3,6 5,6 21,6\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M19 6V20C19 20.5304 18.7893 21.0391 18.4142 21.4142C18.0391 21.7893 17.5304 22 17 22H7C6.46957 22 5.96086 21.7893 5.58579 21.4142C5.21071 21.0391 5 20.5304 5 20V6M8 6V4C8 3.46957 8.21071 2.96086 8.58579 2.58579C8.96086 2.21071 9.46957 2 10 2H14C14.5304 2 15.0391 2.21071 15.4142 2.58579C15.7893 2.96086 16 3.46957 16 4V6\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n </div>\n\n <!-- Textarea -->\n <textarea class=\"zen-comment-textarea__input\"\n [rows]=\"rows\"\n [placeholder]=\"placeholder\"\n [value]=\"value\"\n [disabled]=\"loading\"\n (input)=\"onInput($any($event.target).value)\"\n (keydown)=\"onKeydown($event)\"></textarea>\n </div>\n\n <!-- Toolbar (bottom part with rounded bottom corners) -->\n <div class=\"zen-comment-textarea__toolbar\">\n <div class=\"zen-comment-textarea__toolbar-divider\"></div>\n\n <div class=\"zen-comment-textarea__toolbar-content\">\n <!-- Icon buttons -->\n <div class=\"zen-comment-textarea__toolbar-icons\">\n <div class=\"zen-comment-textarea__emoji-wrapper\">\n <button type=\"button\"\n class=\"zen-comment-textarea__icon-btn\"\n [class.zen-comment-textarea__icon-btn--active]=\"emojiPickerOpen\"\n title=\"Emoji\"\n (click)=\"toggleEmojiPicker()\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8 14C8 14 9.5 16 12 16C14.5 16 16 14 16 14\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <line x1=\"9\" y1=\"9\" x2=\"9.01\" y2=\"9\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <line x1=\"15\" y1=\"9\" x2=\"15.01\" y2=\"9\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n\n <!-- Emoji picker -->\n <div class=\"zen-emoji-picker\" *ngIf=\"emojiPickerOpen\">\n <div class=\"zen-emoji-picker__grid\">\n <button type=\"button\"\n class=\"zen-emoji-picker__emoji\"\n *ngFor=\"let emoji of activeEmojis\"\n (click)=\"selectEmoji(emoji)\">\n {{ emoji }}\n </button>\n </div>\n <div class=\"zen-emoji-picker__categories\">\n <button type=\"button\"\n class=\"zen-emoji-picker__category\"\n [class.zen-emoji-picker__category--active]=\"cat.key === activeEmojiCategory\"\n *ngFor=\"let cat of emojiCategories\"\n (click)=\"setEmojiCategory(cat.key)\">\n {{ cat.icon }}\n </button>\n </div>\n </div>\n </div>\n\n <button type=\"button\"\n class=\"zen-comment-textarea__icon-btn\"\n title=\"Attach file\"\n (click)=\"fileInput.click()\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M21.44 11.05L12.25 20.24C11.1242 21.3658 9.59723 21.9983 8.00505 21.9983C6.41286 21.9983 4.88589 21.3658 3.76005 20.24C2.6342 19.1142 2.00171 17.5872 2.00171 15.995C2.00171 14.4029 2.6342 12.8759 3.76005 11.75L12.95 2.56C13.7006 1.80944 14.7186 1.3877 15.78 1.3877C16.8415 1.3877 17.8595 1.80944 18.61 2.56C19.3606 3.31057 19.7823 4.32863 19.7823 5.39C19.7823 6.45138 19.3606 7.46944 18.61 8.22L9.41005 17.41C9.03476 17.7853 8.52573 17.9961 7.99505 17.9961C7.46436 17.9961 6.95533 17.7853 6.58005 17.41C6.20476 17.0347 5.99389 16.5257 5.99389 15.995C5.99389 15.4644 6.20476 14.9553 6.58005 14.58L15.07 6.1\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <input type=\"file\" #fileInput [accept]=\"fileTypes\" multiple hidden (change)=\"onFileInput($event)\" />\n </div>\n\n <!-- Right side actions -->\n <div class=\"zen-comment-textarea__actions\" *ngIf=\"!editing\">\n <span class=\"zen-comment-textarea__hint\">Press enter</span>\n <svg class=\"zen-comment-textarea__return-icon\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M3.33337 12.5L6.66671 15.8333M3.33337 12.5L6.66671 9.16667M3.33337 12.5H13.3334C14.2175 12.5 15.0653 12.1488 15.6904 11.5237C16.3155 10.8986 16.6667 10.0507 16.6667 9.16667V4.16667\" stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"zen-comment-textarea__hint\">to</span>\n <button type=\"button\" class=\"zen-comment-textarea__add-btn\" [disabled]=\"loading\" (click)=\"onAddComment()\">\n <span class=\"zen-comment-textarea__spinner\" *ngIf=\"loading\"></span>\n {{ loading ? 'Sending...' : 'Add Comment' }}\n </button>\n </div>\n\n <div class=\"zen-comment-textarea__actions\" *ngIf=\"editing\">\n <button type=\"button\" class=\"zen-comment-textarea__cancel-btn\" [disabled]=\"loading\" (click)=\"onCancel()\">\n Cancel\n </button>\n <button type=\"button\" class=\"zen-comment-textarea__save-btn\" [disabled]=\"loading\" (click)=\"onSave()\">\n <span class=\"zen-comment-textarea__spinner\" *ngIf=\"loading\"></span>\n {{ loading ? 'Saving...' : 'Save' }}\n </button>\n </div>\n </div>\n </div>\n</div>\n", styles: [".zen-comment-textarea{display:flex;flex-direction:column;width:100%}.zen-comment-textarea--loading{opacity:.7;pointer-events:none}.zen-comment-textarea__spinner{display:inline-block;width:14px;height:14px;border:2px solid currentColor;border-right-color:transparent;border-radius:50%;animation:zen-spin .6s linear infinite;vertical-align:middle;margin-right:4px}.zen-comment-textarea__label{font-family:Inter,sans-serif;font-weight:500;font-size:14px;line-height:20px;color:#344054;margin-bottom:6px}.zen-comment-textarea__input-wrapper{background:#FFFFFF;border:1px solid #D0D5DD;border-bottom:none;border-radius:8px 8px 0 0;box-shadow:0 1px 2px #1018280d}.zen-comment-textarea__attachments{display:flex;flex-direction:column;gap:8px;padding:10px 14px 0}.zen-comment-textarea__input{display:block;width:100%;min-height:86px;padding:10px 14px 0;border:none;outline:none;resize:vertical;font-family:Inter,sans-serif;font-weight:400;font-size:16px;line-height:24px;color:#101828;background:transparent;box-sizing:border-box}.zen-comment-textarea__input::placeholder{color:#667085}.zen-comment-textarea__toolbar{background:#FFFFFF;border:1px solid #D0D5DD;border-top:none;border-radius:0 0 8px 8px;padding:0 14px 8px}.zen-comment-textarea__toolbar-divider{height:1px;background:#EAECF0;margin-bottom:8px}.zen-comment-textarea__toolbar-content{display:flex;align-items:center;justify-content:space-between}.zen-comment-textarea__toolbar-icons{display:flex;gap:4px;align-items:center}.zen-comment-textarea__emoji-wrapper{position:relative}.zen-comment-textarea__icon-btn{display:flex;align-items:center;justify-content:center;width:36px;height:36px;border:none;background:transparent;border-radius:8px;cursor:pointer;padding:8px}.zen-comment-textarea__icon-btn:hover,.zen-comment-textarea__icon-btn--active{background:#F2F4F7}.zen-comment-textarea__icon-btn svg{flex-shrink:0}.zen-comment-textarea__actions{display:flex;align-items:center;gap:6px}.zen-comment-textarea__hint{font-family:Inter,sans-serif;font-weight:400;font-size:14px;line-height:20px;color:#667085}.zen-comment-textarea__return-icon{flex-shrink:0}.zen-comment-textarea__add-btn{border:none;background:transparent;font-family:Inter,sans-serif;font-weight:500;font-size:14px;line-height:20px;color:#105494;cursor:pointer;padding:0}.zen-comment-textarea__add-btn:hover{text-decoration:underline}.zen-comment-textarea__cancel-btn{display:inline-flex;align-items:center;justify-content:center;padding:10px 16px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 1px 2px #1018280d;font-family:Inter,sans-serif;font-weight:500;font-size:14px;line-height:20px;color:#344054;cursor:pointer}.zen-comment-textarea__cancel-btn:hover{background:#F9FAFB}.zen-comment-textarea__save-btn{display:inline-flex;align-items:center;justify-content:center;padding:10px 16px;background:#136AB6;border:1px solid #136AB6;border-radius:8px;box-shadow:0 1px 2px #1018280d;font-family:Inter,sans-serif;font-weight:500;font-size:14px;line-height:20px;color:#fff;cursor:pointer}.zen-comment-textarea__save-btn:hover{background:#105494;border-color:#105494}.zen-attachment{display:flex;align-items:center;gap:4px;padding:12px;background:#F9FAFB;border:1px solid #EAECF0;border-radius:8px}.zen-attachment__content{display:flex;flex:1;gap:12px;align-items:center;min-width:0}.zen-attachment__icon{flex-shrink:0;width:32px;height:32px;background:#E3EEFB;border:4px solid #F1F7FE;border-radius:28px;display:flex;align-items:center;justify-content:center}.zen-attachment__info{flex:1;min-width:0}.zen-attachment__name{font-family:Inter,sans-serif;font-weight:500;font-size:14px;line-height:20px;color:#344054;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.zen-attachment__size{font-family:Inter,sans-serif;font-weight:400;font-size:14px;line-height:20px;color:#667085}.zen-attachment__remove{flex-shrink:0;display:flex;align-items:center;justify-content:center;width:36px;height:36px;border:none;background:transparent;border-radius:8px;cursor:pointer;padding:8px;margin:-8px}.zen-attachment__remove:hover{background:#F2F4F7}.zen-emoji-picker{position:absolute;bottom:calc(100% + 4px);left:0;z-index:1000;background:#FFFFFF;border:1px solid #EAECF0;border-radius:12px;box-shadow:0 4px 16px #1018281f;width:320px;overflow:hidden}.zen-emoji-picker__grid{display:grid;grid-template-columns:repeat(8,1fr);gap:2px;padding:12px;max-height:200px;overflow-y:auto}.zen-emoji-picker__emoji{display:flex;align-items:center;justify-content:center;width:34px;height:34px;border:none;background:transparent;border-radius:8px;cursor:pointer;font-size:20px;line-height:1;padding:0}.zen-emoji-picker__emoji:hover{background:#F2F4F7}.zen-emoji-picker__categories{display:flex;gap:4px;padding:8px 12px;border-top:1px solid #EAECF0}.zen-emoji-picker__category{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border:none;background:transparent;border-radius:8px;cursor:pointer;font-size:16px;padding:0}.zen-emoji-picker__category:hover{background:#F2F4F7}.zen-emoji-picker__category--active{background:#E3EEFB}@keyframes zen-spin{to{transform:rotate(360deg)}}\n"] }]
|
|
6186
|
+
}], propDecorators: { value: [{
|
|
6187
|
+
type: Input
|
|
6188
|
+
}], valueChange: [{
|
|
6189
|
+
type: Output
|
|
6190
|
+
}], label: [{
|
|
6191
|
+
type: Input
|
|
6192
|
+
}], placeholder: [{
|
|
6193
|
+
type: Input
|
|
6194
|
+
}], rows: [{
|
|
6195
|
+
type: Input
|
|
6196
|
+
}], fileTypes: [{
|
|
6197
|
+
type: Input
|
|
6198
|
+
}], loading: [{
|
|
6199
|
+
type: Input
|
|
6200
|
+
}], addComment: [{
|
|
6201
|
+
type: Output
|
|
6202
|
+
}], filesChanged: [{
|
|
6203
|
+
type: Output
|
|
6204
|
+
}], save: [{
|
|
6205
|
+
type: Output
|
|
6206
|
+
}], cancel: [{
|
|
6207
|
+
type: Output
|
|
6208
|
+
}], onDocumentClick: [{
|
|
6209
|
+
type: HostListener,
|
|
6210
|
+
args: ['document:click', ['$event']]
|
|
6211
|
+
}] } });
|
|
6212
|
+
|
|
6213
|
+
class ZenduCommentItemComponent {
|
|
6214
|
+
constructor() {
|
|
6215
|
+
this.showConnector = true;
|
|
6216
|
+
this.editable = true;
|
|
6217
|
+
this.deletable = true;
|
|
6218
|
+
this.loading = false;
|
|
6219
|
+
this.edit = new EventEmitter();
|
|
6220
|
+
this.delete = new EventEmitter();
|
|
6221
|
+
this.saveEdit = new EventEmitter();
|
|
6222
|
+
this.cancelEdit = new EventEmitter();
|
|
6223
|
+
this.editing = false;
|
|
6224
|
+
this.editValue = '';
|
|
6225
|
+
this.wasLoading = false;
|
|
6226
|
+
}
|
|
6227
|
+
ngOnChanges(changes) {
|
|
6228
|
+
if (changes['loading'] && this.wasLoading && !this.loading && this.editing) {
|
|
6229
|
+
this.editing = false;
|
|
6230
|
+
this.editValue = '';
|
|
6231
|
+
}
|
|
6232
|
+
this.wasLoading = this.loading;
|
|
6233
|
+
}
|
|
6234
|
+
get isEditable() {
|
|
6235
|
+
var _a;
|
|
6236
|
+
return this.editable && (((_a = this.comment) === null || _a === void 0 ? void 0 : _a.editable) !== false);
|
|
6237
|
+
}
|
|
6238
|
+
get isDeletable() {
|
|
6239
|
+
var _a;
|
|
6240
|
+
return this.deletable && (((_a = this.comment) === null || _a === void 0 ? void 0 : _a.deletable) !== false);
|
|
6241
|
+
}
|
|
6242
|
+
get initials() {
|
|
6243
|
+
var _a;
|
|
6244
|
+
if (!((_a = this.comment) === null || _a === void 0 ? void 0 : _a.authorName))
|
|
6245
|
+
return '';
|
|
6246
|
+
return this.comment.authorName
|
|
6247
|
+
.split(' ')
|
|
6248
|
+
.map(n => n[0])
|
|
6249
|
+
.join('')
|
|
6250
|
+
.substring(0, 2)
|
|
6251
|
+
.toUpperCase();
|
|
6252
|
+
}
|
|
6253
|
+
onEdit() {
|
|
6254
|
+
if (this.loading)
|
|
6255
|
+
return;
|
|
6256
|
+
this.editing = true;
|
|
6257
|
+
this.editValue = this.comment.text;
|
|
6258
|
+
this.edit.emit(this.comment);
|
|
6259
|
+
}
|
|
6260
|
+
onDelete() {
|
|
6261
|
+
if (this.loading)
|
|
6262
|
+
return;
|
|
6263
|
+
this.delete.emit(this.comment);
|
|
6264
|
+
}
|
|
6265
|
+
onSaveEdit(event) {
|
|
6266
|
+
this.saveEdit.emit({ comment: this.comment, text: event.text });
|
|
6267
|
+
}
|
|
6268
|
+
onCancelEdit() {
|
|
6269
|
+
this.editing = false;
|
|
6270
|
+
this.editValue = '';
|
|
6271
|
+
this.cancelEdit.emit(this.comment);
|
|
6272
|
+
}
|
|
6273
|
+
getFileIcon(name) {
|
|
6274
|
+
var _a;
|
|
6275
|
+
const ext = ((_a = name.split('.').pop()) === null || _a === void 0 ? void 0 : _a.toLowerCase()) || '';
|
|
6276
|
+
if (['pdf', 'doc', 'docx', 'txt', 'xls', 'xlsx', 'csv', 'ppt', 'pptx'].includes(ext))
|
|
6277
|
+
return 'document';
|
|
6278
|
+
if (['mp4', 'mov', 'avi', 'mkv', 'webm', 'flv'].includes(ext))
|
|
6279
|
+
return 'video';
|
|
6280
|
+
return 'misc';
|
|
6281
|
+
}
|
|
6282
|
+
}
|
|
6283
|
+
ZenduCommentItemComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduCommentItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
6284
|
+
ZenduCommentItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ZenduCommentItemComponent, selector: "zen-comment-item", inputs: { comment: "comment", showConnector: "showConnector", editable: "editable", deletable: "deletable", loading: "loading" }, outputs: { edit: "edit", delete: "delete", saveEdit: "saveEdit", cancelEdit: "cancelEdit" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"zen-comment-item\" [class.zen-comment-item--loading]=\"loading\">\n\n <div class=\"zen-comment-item__left\">\n <!-- Avatar -->\n <div class=\"zen-comment-item__avatar\">\n <img *ngIf=\"comment.authorAvatar\"\n [src]=\"comment.authorAvatar\"\n [alt]=\"comment.authorName\"\n class=\"zen-comment-item__avatar-img\" />\n <span *ngIf=\"!comment.authorAvatar\" class=\"zen-comment-item__avatar-initials\">\n {{ initials }}\n </span>\n <span *ngIf=\"comment.online\" class=\"zen-comment-item__online-dot\"></span>\n </div>\n <!-- Connector line -->\n <div *ngIf=\"showConnector\" class=\"zen-comment-item__connector\"></div>\n </div>\n\n <div class=\"zen-comment-item__body\">\n <!-- Header: name + time -->\n <div class=\"zen-comment-item__header\">\n <span class=\"zen-comment-item__author\">{{ comment.authorName }}</span>\n <span class=\"zen-comment-item__time\">{{ comment.timestamp }}</span>\n </div>\n\n <!-- Default view -->\n <ng-container *ngIf=\"!editing\">\n <p class=\"zen-comment-item__text\">{{ comment.text }}</p>\n\n <!-- Attachments -->\n <div class=\"zen-comment-item__attachment\"\n *ngFor=\"let att of comment.attachments\">\n <div class=\"zen-comment-item__attachment-icon\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M14 2H6C5.46957 2 4.96086 2.21071 4.58579 2.58579C4.21071 2.96086 4 3.46957 4 4V20C4 20.5304 4.21071 21.0391 4.58579 21.4142C4.96086 21.7893 5.46957 22 6 22H18C18.5304 22 19.0391 21.7893 19.4142 21.4142C19.7893 21.0391 20 20.5304 20 20V8L14 2Z\" stroke=\"#136AB6\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <polyline points=\"14,2 14,8 20,8\" stroke=\"#136AB6\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <div class=\"zen-comment-item__attachment-info\">\n <div class=\"zen-comment-item__attachment-name\">{{ att.name }}</div>\n <div class=\"zen-comment-item__attachment-size\">{{ att.size }}</div>\n </div>\n </div>\n </ng-container>\n\n <!-- Edit view -->\n <ng-container *ngIf=\"editing\">\n <zen-comment-textarea\n [(value)]=\"editValue\"\n [loading]=\"loading\"\n (save)=\"onSaveEdit($event)\"\n (cancel)=\"onCancelEdit()\">\n </zen-comment-textarea>\n </ng-container>\n </div>\n\n <!-- Actions (always visible, individually controllable) -->\n <div class=\"zen-comment-item__actions\" *ngIf=\"(isEditable || isDeletable) && !editing\">\n <button *ngIf=\"isDeletable\"\n type=\"button\"\n class=\"zen-comment-item__action-btn\"\n title=\"Delete\"\n [disabled]=\"loading\"\n (click)=\"onDelete()\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <polyline points=\"3,6 5,6 21,6\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M19 6V20C19 20.5304 18.7893 21.0391 18.4142 21.4142C18.0391 21.7893 17.5304 22 17 22H7C6.46957 22 5.96086 21.7893 5.58579 21.4142C5.21071 21.0391 5 20.5304 5 20V6M8 6V4C8 3.46957 8.21071 2.96086 8.58579 2.58579C8.96086 2.21071 9.46957 2 10 2H14C14.5304 2 15.0391 2.21071 15.4142 2.58579C15.7893 2.96086 16 3.46957 16 4V6\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <button *ngIf=\"isEditable\"\n type=\"button\"\n class=\"zen-comment-item__action-btn\"\n title=\"Edit\"\n [disabled]=\"loading\"\n (click)=\"onEdit()\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M17 3C17.2626 2.73735 17.5744 2.52901 17.9176 2.38687C18.2608 2.24473 18.6286 2.17157 19 2.17157C19.3714 2.17157 19.7392 2.24473 20.0824 2.38687C20.4256 2.52901 20.7374 2.73735 21 3C21.2626 3.26264 21.471 3.57444 21.6131 3.9176C21.7553 4.26077 21.8284 4.62856 21.8284 5C21.8284 5.37143 21.7553 5.73923 21.6131 6.08239C21.471 6.42555 21.2626 6.73735 21 7L7.5 20.5L2 22L3.5 16.5L17 3Z\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n</div>\n", styles: [".zen-comment-item{display:flex;align-items:flex-start;width:100%}.zen-comment-item--loading{opacity:.7;pointer-events:none}.zen-comment-item__left{display:flex;flex-direction:column;align-items:center;gap:4px;padding-bottom:4px;flex-shrink:0}.zen-comment-item__avatar{position:relative;width:32px;height:32px;border-radius:200px;background:#C7B9DA;overflow:visible;flex-shrink:0}.zen-comment-item__avatar-img{width:32px;height:32px;border-radius:200px;object-fit:cover}.zen-comment-item__avatar-initials{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:200px;font-family:Inter,sans-serif;font-weight:500;font-size:12px;color:#fff}.zen-comment-item__online-dot{position:absolute;bottom:0;right:0;width:8px;height:8px;background:#12B76A;border:1.5px solid #fff;border-radius:4px}.zen-comment-item__connector{flex:1;width:2px;min-height:8px;background:#EAECF0;border-radius:2px}.zen-comment-item__body{flex:1;min-width:0;display:flex;flex-direction:column;gap:12px;padding-bottom:32px;margin-left:12px}.zen-comment-item__header{display:flex;align-items:center;gap:8px;white-space:nowrap}.zen-comment-item__author{font-family:Inter,sans-serif;font-weight:500;font-size:14px;line-height:20px;color:#344054}.zen-comment-item__time{font-family:Inter,sans-serif;font-weight:400;font-size:12px;line-height:18px;color:#667085}.zen-comment-item__text{font-family:Inter,sans-serif;font-weight:400;font-size:14px;line-height:20px;color:#667085;margin:0;word-break:break-word}.zen-comment-item__attachment{display:flex;align-items:flex-start;gap:12px}.zen-comment-item__attachment-icon{flex-shrink:0;width:32px;height:32px;background:#E3EEFB;border:4px solid #F1F7FE;border-radius:28px;display:flex;align-items:center;justify-content:center}.zen-comment-item__attachment-info{min-width:0}.zen-comment-item__attachment-name{font-family:Inter,sans-serif;font-weight:500;font-size:14px;line-height:20px;color:#344054;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.zen-comment-item__attachment-size{font-family:Inter,sans-serif;font-weight:400;font-size:14px;line-height:20px;color:#667085}.zen-comment-item__actions{display:flex;align-items:center;flex-shrink:0}.zen-comment-item__action-btn{display:flex;align-items:center;justify-content:center;width:40px;height:40px;border:none;background:transparent;border-radius:8px;cursor:pointer;padding:10px}.zen-comment-item__action-btn:hover{background:#F2F4F7}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ZenduCommentTextareaComponent, selector: "zen-comment-textarea", inputs: ["value", "label", "placeholder", "rows", "fileTypes", "loading"], outputs: ["valueChange", "addComment", "filesChanged", "save", "cancel"] }] });
|
|
6285
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduCommentItemComponent, decorators: [{
|
|
6286
|
+
type: Component,
|
|
6287
|
+
args: [{ selector: 'zen-comment-item', template: "<div class=\"zen-comment-item\" [class.zen-comment-item--loading]=\"loading\">\n\n <div class=\"zen-comment-item__left\">\n <!-- Avatar -->\n <div class=\"zen-comment-item__avatar\">\n <img *ngIf=\"comment.authorAvatar\"\n [src]=\"comment.authorAvatar\"\n [alt]=\"comment.authorName\"\n class=\"zen-comment-item__avatar-img\" />\n <span *ngIf=\"!comment.authorAvatar\" class=\"zen-comment-item__avatar-initials\">\n {{ initials }}\n </span>\n <span *ngIf=\"comment.online\" class=\"zen-comment-item__online-dot\"></span>\n </div>\n <!-- Connector line -->\n <div *ngIf=\"showConnector\" class=\"zen-comment-item__connector\"></div>\n </div>\n\n <div class=\"zen-comment-item__body\">\n <!-- Header: name + time -->\n <div class=\"zen-comment-item__header\">\n <span class=\"zen-comment-item__author\">{{ comment.authorName }}</span>\n <span class=\"zen-comment-item__time\">{{ comment.timestamp }}</span>\n </div>\n\n <!-- Default view -->\n <ng-container *ngIf=\"!editing\">\n <p class=\"zen-comment-item__text\">{{ comment.text }}</p>\n\n <!-- Attachments -->\n <div class=\"zen-comment-item__attachment\"\n *ngFor=\"let att of comment.attachments\">\n <div class=\"zen-comment-item__attachment-icon\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M14 2H6C5.46957 2 4.96086 2.21071 4.58579 2.58579C4.21071 2.96086 4 3.46957 4 4V20C4 20.5304 4.21071 21.0391 4.58579 21.4142C4.96086 21.7893 5.46957 22 6 22H18C18.5304 22 19.0391 21.7893 19.4142 21.4142C19.7893 21.0391 20 20.5304 20 20V8L14 2Z\" stroke=\"#136AB6\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <polyline points=\"14,2 14,8 20,8\" stroke=\"#136AB6\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <div class=\"zen-comment-item__attachment-info\">\n <div class=\"zen-comment-item__attachment-name\">{{ att.name }}</div>\n <div class=\"zen-comment-item__attachment-size\">{{ att.size }}</div>\n </div>\n </div>\n </ng-container>\n\n <!-- Edit view -->\n <ng-container *ngIf=\"editing\">\n <zen-comment-textarea\n [(value)]=\"editValue\"\n [loading]=\"loading\"\n (save)=\"onSaveEdit($event)\"\n (cancel)=\"onCancelEdit()\">\n </zen-comment-textarea>\n </ng-container>\n </div>\n\n <!-- Actions (always visible, individually controllable) -->\n <div class=\"zen-comment-item__actions\" *ngIf=\"(isEditable || isDeletable) && !editing\">\n <button *ngIf=\"isDeletable\"\n type=\"button\"\n class=\"zen-comment-item__action-btn\"\n title=\"Delete\"\n [disabled]=\"loading\"\n (click)=\"onDelete()\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <polyline points=\"3,6 5,6 21,6\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M19 6V20C19 20.5304 18.7893 21.0391 18.4142 21.4142C18.0391 21.7893 17.5304 22 17 22H7C6.46957 22 5.96086 21.7893 5.58579 21.4142C5.21071 21.0391 5 20.5304 5 20V6M8 6V4C8 3.46957 8.21071 2.96086 8.58579 2.58579C8.96086 2.21071 9.46957 2 10 2H14C14.5304 2 15.0391 2.21071 15.4142 2.58579C15.7893 2.96086 16 3.46957 16 4V6\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <button *ngIf=\"isEditable\"\n type=\"button\"\n class=\"zen-comment-item__action-btn\"\n title=\"Edit\"\n [disabled]=\"loading\"\n (click)=\"onEdit()\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M17 3C17.2626 2.73735 17.5744 2.52901 17.9176 2.38687C18.2608 2.24473 18.6286 2.17157 19 2.17157C19.3714 2.17157 19.7392 2.24473 20.0824 2.38687C20.4256 2.52901 20.7374 2.73735 21 3C21.2626 3.26264 21.471 3.57444 21.6131 3.9176C21.7553 4.26077 21.8284 4.62856 21.8284 5C21.8284 5.37143 21.7553 5.73923 21.6131 6.08239C21.471 6.42555 21.2626 6.73735 21 7L7.5 20.5L2 22L3.5 16.5L17 3Z\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n</div>\n", styles: [".zen-comment-item{display:flex;align-items:flex-start;width:100%}.zen-comment-item--loading{opacity:.7;pointer-events:none}.zen-comment-item__left{display:flex;flex-direction:column;align-items:center;gap:4px;padding-bottom:4px;flex-shrink:0}.zen-comment-item__avatar{position:relative;width:32px;height:32px;border-radius:200px;background:#C7B9DA;overflow:visible;flex-shrink:0}.zen-comment-item__avatar-img{width:32px;height:32px;border-radius:200px;object-fit:cover}.zen-comment-item__avatar-initials{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:200px;font-family:Inter,sans-serif;font-weight:500;font-size:12px;color:#fff}.zen-comment-item__online-dot{position:absolute;bottom:0;right:0;width:8px;height:8px;background:#12B76A;border:1.5px solid #fff;border-radius:4px}.zen-comment-item__connector{flex:1;width:2px;min-height:8px;background:#EAECF0;border-radius:2px}.zen-comment-item__body{flex:1;min-width:0;display:flex;flex-direction:column;gap:12px;padding-bottom:32px;margin-left:12px}.zen-comment-item__header{display:flex;align-items:center;gap:8px;white-space:nowrap}.zen-comment-item__author{font-family:Inter,sans-serif;font-weight:500;font-size:14px;line-height:20px;color:#344054}.zen-comment-item__time{font-family:Inter,sans-serif;font-weight:400;font-size:12px;line-height:18px;color:#667085}.zen-comment-item__text{font-family:Inter,sans-serif;font-weight:400;font-size:14px;line-height:20px;color:#667085;margin:0;word-break:break-word}.zen-comment-item__attachment{display:flex;align-items:flex-start;gap:12px}.zen-comment-item__attachment-icon{flex-shrink:0;width:32px;height:32px;background:#E3EEFB;border:4px solid #F1F7FE;border-radius:28px;display:flex;align-items:center;justify-content:center}.zen-comment-item__attachment-info{min-width:0}.zen-comment-item__attachment-name{font-family:Inter,sans-serif;font-weight:500;font-size:14px;line-height:20px;color:#344054;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.zen-comment-item__attachment-size{font-family:Inter,sans-serif;font-weight:400;font-size:14px;line-height:20px;color:#667085}.zen-comment-item__actions{display:flex;align-items:center;flex-shrink:0}.zen-comment-item__action-btn{display:flex;align-items:center;justify-content:center;width:40px;height:40px;border:none;background:transparent;border-radius:8px;cursor:pointer;padding:10px}.zen-comment-item__action-btn:hover{background:#F2F4F7}\n"] }]
|
|
6288
|
+
}], propDecorators: { comment: [{
|
|
6289
|
+
type: Input
|
|
6290
|
+
}], showConnector: [{
|
|
6291
|
+
type: Input
|
|
6292
|
+
}], editable: [{
|
|
6293
|
+
type: Input
|
|
6294
|
+
}], deletable: [{
|
|
6295
|
+
type: Input
|
|
6296
|
+
}], loading: [{
|
|
6297
|
+
type: Input
|
|
6298
|
+
}], edit: [{
|
|
6299
|
+
type: Output
|
|
6300
|
+
}], delete: [{
|
|
6301
|
+
type: Output
|
|
6302
|
+
}], saveEdit: [{
|
|
6303
|
+
type: Output
|
|
6304
|
+
}], cancelEdit: [{
|
|
6305
|
+
type: Output
|
|
6306
|
+
}] } });
|
|
6307
|
+
|
|
6308
|
+
class ZenduCommentListComponent {
|
|
6309
|
+
constructor() {
|
|
6310
|
+
this.comments = [];
|
|
6311
|
+
this.collapsible = true;
|
|
6312
|
+
this.expanded = false;
|
|
6313
|
+
this.editable = true;
|
|
6314
|
+
this.deletable = true;
|
|
6315
|
+
this.loadingCommentId = null;
|
|
6316
|
+
this.expandedChange = new EventEmitter();
|
|
6317
|
+
this.editComment = new EventEmitter();
|
|
6318
|
+
this.deleteComment = new EventEmitter();
|
|
6319
|
+
this.saveEditComment = new EventEmitter();
|
|
6320
|
+
this.cancelEditComment = new EventEmitter();
|
|
6321
|
+
}
|
|
6322
|
+
toggle() {
|
|
6323
|
+
this.expanded = !this.expanded;
|
|
6324
|
+
this.expandedChange.emit(this.expanded);
|
|
6325
|
+
}
|
|
6326
|
+
}
|
|
6327
|
+
ZenduCommentListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduCommentListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
6328
|
+
ZenduCommentListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ZenduCommentListComponent, selector: "zen-comment-list", inputs: { comments: "comments", collapsible: "collapsible", expanded: "expanded", editable: "editable", deletable: "deletable", loadingCommentId: "loadingCommentId" }, outputs: { expandedChange: "expandedChange", editComment: "editComment", deleteComment: "deleteComment", saveEditComment: "saveEditComment", cancelEditComment: "cancelEditComment" }, ngImport: i0, template: "<div class=\"zen-comment-list\">\n <!-- Toggle button (only when collapsible) -->\n <button *ngIf=\"collapsible\" type=\"button\" class=\"zen-comment-list__toggle\" (click)=\"toggle()\">\n <span class=\"zen-comment-list__toggle-text\">\n {{ expanded ? 'Hide' : 'Show' }} Comments ({{ comments.length }})\n </span>\n <svg class=\"zen-comment-list__toggle-icon\"\n [class.zen-comment-list__toggle-icon--up]=\"expanded\"\n width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n\n <!-- Comments list -->\n <div class=\"zen-comment-list__items\" *ngIf=\"!collapsible || expanded\">\n <zen-comment-item\n *ngFor=\"let c of comments; let last = last\"\n [comment]=\"c\"\n [showConnector]=\"!last\"\n [editable]=\"editable\"\n [deletable]=\"deletable\"\n [loading]=\"loadingCommentId === c.id\"\n (edit)=\"editComment.emit($event)\"\n (delete)=\"deleteComment.emit($event)\"\n (saveEdit)=\"saveEditComment.emit($event)\"\n (cancelEdit)=\"cancelEditComment.emit($event)\">\n </zen-comment-item>\n </div>\n</div>\n", styles: [".zen-comment-list{display:flex;flex-direction:column;gap:16px;width:100%}.zen-comment-list__toggle{display:flex;align-items:center;gap:8px;border:none;background:transparent;cursor:pointer;padding:0}.zen-comment-list__toggle-text{font-family:Inter,sans-serif;font-weight:500;font-size:16px;line-height:24px;color:#667085}.zen-comment-list__toggle-icon{flex-shrink:0;transition:transform .2s ease}.zen-comment-list__toggle-icon--up{transform:rotate(180deg)}.zen-comment-list__items{display:flex;flex-direction:column}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ZenduCommentItemComponent, selector: "zen-comment-item", inputs: ["comment", "showConnector", "editable", "deletable", "loading"], outputs: ["edit", "delete", "saveEdit", "cancelEdit"] }] });
|
|
6329
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduCommentListComponent, decorators: [{
|
|
6330
|
+
type: Component,
|
|
6331
|
+
args: [{ selector: 'zen-comment-list', template: "<div class=\"zen-comment-list\">\n <!-- Toggle button (only when collapsible) -->\n <button *ngIf=\"collapsible\" type=\"button\" class=\"zen-comment-list__toggle\" (click)=\"toggle()\">\n <span class=\"zen-comment-list__toggle-text\">\n {{ expanded ? 'Hide' : 'Show' }} Comments ({{ comments.length }})\n </span>\n <svg class=\"zen-comment-list__toggle-icon\"\n [class.zen-comment-list__toggle-icon--up]=\"expanded\"\n width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n\n <!-- Comments list -->\n <div class=\"zen-comment-list__items\" *ngIf=\"!collapsible || expanded\">\n <zen-comment-item\n *ngFor=\"let c of comments; let last = last\"\n [comment]=\"c\"\n [showConnector]=\"!last\"\n [editable]=\"editable\"\n [deletable]=\"deletable\"\n [loading]=\"loadingCommentId === c.id\"\n (edit)=\"editComment.emit($event)\"\n (delete)=\"deleteComment.emit($event)\"\n (saveEdit)=\"saveEditComment.emit($event)\"\n (cancelEdit)=\"cancelEditComment.emit($event)\">\n </zen-comment-item>\n </div>\n</div>\n", styles: [".zen-comment-list{display:flex;flex-direction:column;gap:16px;width:100%}.zen-comment-list__toggle{display:flex;align-items:center;gap:8px;border:none;background:transparent;cursor:pointer;padding:0}.zen-comment-list__toggle-text{font-family:Inter,sans-serif;font-weight:500;font-size:16px;line-height:24px;color:#667085}.zen-comment-list__toggle-icon{flex-shrink:0;transition:transform .2s ease}.zen-comment-list__toggle-icon--up{transform:rotate(180deg)}.zen-comment-list__items{display:flex;flex-direction:column}\n"] }]
|
|
6332
|
+
}], propDecorators: { comments: [{
|
|
6333
|
+
type: Input
|
|
6334
|
+
}], collapsible: [{
|
|
6335
|
+
type: Input
|
|
6336
|
+
}], expanded: [{
|
|
6337
|
+
type: Input
|
|
6338
|
+
}], editable: [{
|
|
6339
|
+
type: Input
|
|
6340
|
+
}], deletable: [{
|
|
6341
|
+
type: Input
|
|
6342
|
+
}], loadingCommentId: [{
|
|
6343
|
+
type: Input
|
|
6344
|
+
}], expandedChange: [{
|
|
6345
|
+
type: Output
|
|
6346
|
+
}], editComment: [{
|
|
6347
|
+
type: Output
|
|
6348
|
+
}], deleteComment: [{
|
|
6349
|
+
type: Output
|
|
6350
|
+
}], saveEditComment: [{
|
|
6351
|
+
type: Output
|
|
6352
|
+
}], cancelEditComment: [{
|
|
6353
|
+
type: Output
|
|
6354
|
+
}] } });
|
|
6355
|
+
|
|
6356
|
+
const MOBILE_BREAKPOINT = 768;
|
|
6357
|
+
class ZenduDatePickerDropdownComponent {
|
|
6358
|
+
constructor(_element, overlay, viewContainerRef, _translate) {
|
|
6359
|
+
this._element = _element;
|
|
6360
|
+
this.overlay = overlay;
|
|
6361
|
+
this.viewContainerRef = viewContainerRef;
|
|
6362
|
+
this._translate = _translate;
|
|
6363
|
+
this.type = 'single';
|
|
6364
|
+
this.date = null;
|
|
6365
|
+
this.dateChange = new EventEmitter();
|
|
6366
|
+
this.startDate = null;
|
|
6367
|
+
this.startDateChange = new EventEmitter();
|
|
6368
|
+
this.endDate = null;
|
|
6369
|
+
this.endDateChange = new EventEmitter();
|
|
6370
|
+
this.rangeChange = new EventEmitter();
|
|
6371
|
+
this.presets = null;
|
|
6372
|
+
this.minDate = null;
|
|
6373
|
+
this.maxDate = null;
|
|
6374
|
+
this.disabled = false;
|
|
6375
|
+
this.highlightDays = [];
|
|
6376
|
+
this.placeholder = '';
|
|
6377
|
+
this.mobileBreakpoint = MOBILE_BREAKPOINT;
|
|
6378
|
+
this.mobile = false;
|
|
6379
|
+
this.isOpen = false;
|
|
6380
|
+
// Left calendar state
|
|
6381
|
+
this.leftCurrentSlot = new Date();
|
|
6382
|
+
this.leftDayRows = [];
|
|
6383
|
+
this.leftDaysTitle = '';
|
|
6384
|
+
// Right calendar state (for range desktop)
|
|
6385
|
+
this.rightCurrentSlot = new Date();
|
|
6386
|
+
this.rightDayRows = [];
|
|
6387
|
+
this.rightDaysTitle = '';
|
|
6388
|
+
this.weekDays = ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sat', 'Su'];
|
|
6389
|
+
// Internal selection state
|
|
6390
|
+
this._selectedDate = null;
|
|
6391
|
+
this._selectedStart = null;
|
|
6392
|
+
this._selectedEnd = null;
|
|
6393
|
+
this._activePreset = null;
|
|
6394
|
+
this.overlayRef = null;
|
|
6395
|
+
this.defaultPresets = [
|
|
6396
|
+
{
|
|
6397
|
+
label: 'Today',
|
|
6398
|
+
getRange: () => ({
|
|
6399
|
+
start: moment().startOf('day').toDate(),
|
|
6400
|
+
end: moment().endOf('day').toDate()
|
|
6401
|
+
})
|
|
6402
|
+
},
|
|
6403
|
+
{
|
|
6404
|
+
label: 'Yesterday',
|
|
6405
|
+
getRange: () => ({
|
|
6406
|
+
start: moment().subtract(1, 'day').startOf('day').toDate(),
|
|
6407
|
+
end: moment().subtract(1, 'day').endOf('day').toDate()
|
|
6408
|
+
})
|
|
6409
|
+
},
|
|
6410
|
+
{
|
|
6411
|
+
label: 'This week',
|
|
6412
|
+
getRange: () => ({
|
|
6413
|
+
start: moment().startOf('isoWeek').toDate(),
|
|
6414
|
+
end: moment().endOf('isoWeek').toDate()
|
|
6415
|
+
})
|
|
6416
|
+
},
|
|
6417
|
+
{
|
|
6418
|
+
label: 'Last week',
|
|
6419
|
+
getRange: () => ({
|
|
6420
|
+
start: moment().subtract(1, 'week').startOf('isoWeek').toDate(),
|
|
6421
|
+
end: moment().subtract(1, 'week').endOf('isoWeek').toDate()
|
|
6422
|
+
})
|
|
6423
|
+
},
|
|
6424
|
+
{
|
|
6425
|
+
label: 'This month',
|
|
6426
|
+
getRange: () => ({
|
|
6427
|
+
start: moment().startOf('month').toDate(),
|
|
6428
|
+
end: moment().endOf('month').toDate()
|
|
6429
|
+
})
|
|
6430
|
+
},
|
|
6431
|
+
{
|
|
6432
|
+
label: 'Last month',
|
|
6433
|
+
getRange: () => ({
|
|
6434
|
+
start: moment().subtract(1, 'month').startOf('month').toDate(),
|
|
6435
|
+
end: moment().subtract(1, 'month').endOf('month').toDate()
|
|
6436
|
+
})
|
|
6437
|
+
},
|
|
6438
|
+
{
|
|
6439
|
+
label: 'This year',
|
|
6440
|
+
getRange: () => ({
|
|
6441
|
+
start: moment().startOf('year').toDate(),
|
|
6442
|
+
end: moment().endOf('year').toDate()
|
|
6443
|
+
})
|
|
6444
|
+
},
|
|
6445
|
+
{
|
|
6446
|
+
label: 'Last year',
|
|
6447
|
+
getRange: () => ({
|
|
6448
|
+
start: moment().subtract(1, 'year').startOf('year').toDate(),
|
|
6449
|
+
end: moment().subtract(1, 'year').endOf('year').toDate()
|
|
6450
|
+
})
|
|
6451
|
+
},
|
|
6452
|
+
{
|
|
6453
|
+
label: 'All time',
|
|
6454
|
+
getRange: () => ({
|
|
6455
|
+
start: new Date(2000, 0, 1),
|
|
6456
|
+
end: moment().endOf('day').toDate()
|
|
6457
|
+
})
|
|
6458
|
+
}
|
|
6459
|
+
];
|
|
6460
|
+
}
|
|
6461
|
+
ngOnInit() {
|
|
6462
|
+
this.checkMobile();
|
|
6463
|
+
}
|
|
6464
|
+
onResize() {
|
|
6465
|
+
this.checkMobile();
|
|
6466
|
+
}
|
|
6467
|
+
checkMobile() {
|
|
6468
|
+
this.mobile = window.innerWidth < this.mobileBreakpoint;
|
|
6469
|
+
}
|
|
6470
|
+
ngOnChanges(changes) {
|
|
6471
|
+
if (changes['date'] && this.date) {
|
|
6472
|
+
this._selectedDate = new Date(this.date);
|
|
6473
|
+
}
|
|
6474
|
+
if (changes['startDate'] && this.startDate) {
|
|
6475
|
+
this._selectedStart = new Date(this.startDate);
|
|
6476
|
+
}
|
|
6477
|
+
if (changes['endDate'] && this.endDate) {
|
|
6478
|
+
this._selectedEnd = new Date(this.endDate);
|
|
6479
|
+
}
|
|
6480
|
+
}
|
|
6481
|
+
ngOnDestroy() {
|
|
6482
|
+
this.closeOverlay();
|
|
6483
|
+
}
|
|
6484
|
+
outsideHandling(event) {
|
|
6485
|
+
if (!document.body.contains(event.target))
|
|
6486
|
+
return;
|
|
6487
|
+
if (this._element.nativeElement.contains(event.target))
|
|
6488
|
+
return;
|
|
6489
|
+
// Check if click is inside overlay
|
|
6490
|
+
if (this.overlayRef) {
|
|
6491
|
+
const overlayElement = this.overlayRef.overlayElement;
|
|
6492
|
+
if (overlayElement && overlayElement.contains(event.target))
|
|
6493
|
+
return;
|
|
6494
|
+
}
|
|
6495
|
+
this.close();
|
|
6496
|
+
}
|
|
6497
|
+
get activePresets() {
|
|
6498
|
+
return this.presets || this.defaultPresets;
|
|
6499
|
+
}
|
|
6500
|
+
get showPresetsSidebar() {
|
|
6501
|
+
return this.type === 'range' && !this.mobile;
|
|
6502
|
+
}
|
|
6503
|
+
get showDualCalendars() {
|
|
6504
|
+
return this.type === 'range' && !this.mobile;
|
|
6505
|
+
}
|
|
6506
|
+
get triggerLabel() {
|
|
6507
|
+
if (this.type === 'single') {
|
|
6508
|
+
if (this.date) {
|
|
6509
|
+
return this.formatDate(this.date);
|
|
6510
|
+
}
|
|
6511
|
+
return this.placeholder || this._translate.instant('Select date');
|
|
6512
|
+
}
|
|
6513
|
+
if (this.startDate && this.endDate) {
|
|
6514
|
+
return `${this.formatDate(this.startDate)} - ${this.formatDate(this.endDate)}`;
|
|
6515
|
+
}
|
|
6516
|
+
return this.placeholder || this._translate.instant('Select dates');
|
|
6517
|
+
}
|
|
6518
|
+
get hasValue() {
|
|
6519
|
+
if (this.type === 'single')
|
|
6520
|
+
return !!this.date;
|
|
6521
|
+
return !!(this.startDate && this.endDate);
|
|
6522
|
+
}
|
|
6523
|
+
get formattedSelectedDate() {
|
|
6524
|
+
return this._selectedDate ? this.formatDate(this._selectedDate) : '';
|
|
6525
|
+
}
|
|
6526
|
+
get formattedStartDate() {
|
|
6527
|
+
return this._selectedStart ? this.formatDate(this._selectedStart) : '';
|
|
6528
|
+
}
|
|
6529
|
+
get formattedEndDate() {
|
|
6530
|
+
return this._selectedEnd ? this.formatDate(this._selectedEnd) : '';
|
|
6531
|
+
}
|
|
6532
|
+
formatDate(date) {
|
|
6533
|
+
const enMonth = moment(date).format('MMM');
|
|
6534
|
+
const translatedMonth = this._translate.instant(enMonth);
|
|
6535
|
+
return moment(date).format('MMM D, YYYY').replace(enMonth, translatedMonth);
|
|
6536
|
+
}
|
|
6537
|
+
toggle() {
|
|
6538
|
+
if (this.disabled)
|
|
6539
|
+
return;
|
|
6540
|
+
if (this.isOpen) {
|
|
6541
|
+
this.close();
|
|
6542
|
+
}
|
|
6543
|
+
else {
|
|
6544
|
+
this.open();
|
|
6545
|
+
}
|
|
6546
|
+
}
|
|
6547
|
+
open() {
|
|
6548
|
+
this.isOpen = true;
|
|
6549
|
+
this._selectedDate = this.date ? new Date(this.date) : null;
|
|
6550
|
+
this._selectedStart = this.startDate ? new Date(this.startDate) : null;
|
|
6551
|
+
this._selectedEnd = this.endDate ? new Date(this.endDate) : null;
|
|
6552
|
+
this._activePreset = null;
|
|
6553
|
+
if (this.type === 'single') {
|
|
6554
|
+
this.leftCurrentSlot = this._selectedDate ? new Date(this._selectedDate) : new Date();
|
|
6555
|
+
}
|
|
6556
|
+
else {
|
|
6557
|
+
this.leftCurrentSlot = this._selectedStart ? new Date(this._selectedStart) : new Date();
|
|
6558
|
+
this.rightCurrentSlot = moment(this.leftCurrentSlot).add(1, 'month').toDate();
|
|
6559
|
+
}
|
|
6560
|
+
this.updateCalendars();
|
|
6561
|
+
this.createOverlay();
|
|
6562
|
+
}
|
|
6563
|
+
close() {
|
|
6564
|
+
this.isOpen = false;
|
|
6565
|
+
this.closeOverlay();
|
|
6566
|
+
}
|
|
6567
|
+
createOverlay() {
|
|
6568
|
+
const position = {
|
|
6569
|
+
originX: 'end',
|
|
6570
|
+
originY: 'bottom',
|
|
6571
|
+
overlayX: 'end',
|
|
6572
|
+
overlayY: 'top'
|
|
6573
|
+
};
|
|
6574
|
+
const positionStrategy = this.overlay.position()
|
|
6575
|
+
.flexibleConnectedTo(this.triggerBtn)
|
|
6576
|
+
.withPositions([
|
|
6577
|
+
position,
|
|
6578
|
+
{ originX: 'end', originY: 'top', overlayX: 'end', overlayY: 'bottom' },
|
|
6579
|
+
{ originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top' },
|
|
6580
|
+
{ originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom' }
|
|
6581
|
+
])
|
|
6582
|
+
.withFlexibleDimensions(false)
|
|
6583
|
+
.withDefaultOffsetY(8)
|
|
6584
|
+
.withPush(false);
|
|
6585
|
+
this.overlayRef = this.overlay.create({
|
|
6586
|
+
positionStrategy,
|
|
6587
|
+
hasBackdrop: true,
|
|
6588
|
+
backdropClass: 'cdk-overlay-transparent-backdrop',
|
|
6589
|
+
panelClass: 'zen-date-picker-dropdown-overlay',
|
|
6590
|
+
});
|
|
6591
|
+
this.overlayRef.attach(new TemplatePortal(this.dropdownTemplate, this.viewContainerRef));
|
|
6592
|
+
this.overlayRef.backdropClick().subscribe(() => {
|
|
6593
|
+
this.close();
|
|
6594
|
+
});
|
|
6595
|
+
}
|
|
6596
|
+
closeOverlay() {
|
|
6597
|
+
if (this.overlayRef) {
|
|
6598
|
+
this.overlayRef.detach();
|
|
6599
|
+
this.overlayRef.dispose();
|
|
6600
|
+
this.overlayRef = null;
|
|
6601
|
+
}
|
|
6602
|
+
}
|
|
6603
|
+
// Calendar navigation
|
|
6604
|
+
leftPrevMonth() {
|
|
6605
|
+
this.leftCurrentSlot = moment(this.leftCurrentSlot).subtract(1, 'month').toDate();
|
|
6606
|
+
if (this.showDualCalendars) {
|
|
6607
|
+
this.rightCurrentSlot = moment(this.leftCurrentSlot).add(1, 'month').toDate();
|
|
6608
|
+
}
|
|
6609
|
+
this.updateCalendars();
|
|
6610
|
+
}
|
|
6611
|
+
leftNextMonth() {
|
|
6612
|
+
this.leftCurrentSlot = moment(this.leftCurrentSlot).add(1, 'month').toDate();
|
|
6613
|
+
if (this.showDualCalendars) {
|
|
6614
|
+
this.rightCurrentSlot = moment(this.leftCurrentSlot).add(1, 'month').toDate();
|
|
6615
|
+
}
|
|
6616
|
+
this.updateCalendars();
|
|
6617
|
+
}
|
|
6618
|
+
rightPrevMonth() {
|
|
6619
|
+
this.rightCurrentSlot = moment(this.rightCurrentSlot).subtract(1, 'month').toDate();
|
|
6620
|
+
this.leftCurrentSlot = moment(this.rightCurrentSlot).subtract(1, 'month').toDate();
|
|
6621
|
+
this.updateCalendars();
|
|
6622
|
+
}
|
|
6623
|
+
rightNextMonth() {
|
|
6624
|
+
this.rightCurrentSlot = moment(this.rightCurrentSlot).add(1, 'month').toDate();
|
|
6625
|
+
this.leftCurrentSlot = moment(this.rightCurrentSlot).subtract(1, 'month').toDate();
|
|
6626
|
+
this.updateCalendars();
|
|
6627
|
+
}
|
|
6628
|
+
// For mobile/single mode when there's only one calendar
|
|
6629
|
+
prevMonth() {
|
|
6630
|
+
this.leftPrevMonth();
|
|
6631
|
+
}
|
|
6632
|
+
nextMonth() {
|
|
6633
|
+
this.leftNextMonth();
|
|
6634
|
+
}
|
|
6635
|
+
selectDay(day) {
|
|
6636
|
+
if (day.isDisabled || day.isOutside)
|
|
6637
|
+
return;
|
|
6638
|
+
if (this.type === 'single') {
|
|
6639
|
+
this._selectedDate = new Date(day.date);
|
|
6640
|
+
}
|
|
6641
|
+
else {
|
|
6642
|
+
// Range selection logic
|
|
6643
|
+
if (!this._selectedStart || (this._selectedStart && this._selectedEnd)) {
|
|
6644
|
+
// Start new selection
|
|
6645
|
+
this._selectedStart = new Date(day.date);
|
|
6646
|
+
this._selectedEnd = null;
|
|
6647
|
+
this._activePreset = null;
|
|
6648
|
+
}
|
|
6649
|
+
else {
|
|
6650
|
+
// Complete the range
|
|
6651
|
+
const newDate = new Date(day.date);
|
|
6652
|
+
if (moment(newDate).isBefore(this._selectedStart)) {
|
|
6653
|
+
this._selectedEnd = new Date(this._selectedStart);
|
|
6654
|
+
this._selectedStart = newDate;
|
|
6655
|
+
}
|
|
6656
|
+
else {
|
|
6657
|
+
this._selectedEnd = newDate;
|
|
6658
|
+
}
|
|
6659
|
+
}
|
|
6660
|
+
}
|
|
6661
|
+
this.updateCalendars();
|
|
6662
|
+
}
|
|
6663
|
+
selectPreset(preset) {
|
|
6664
|
+
const range = preset.getRange();
|
|
6665
|
+
this._selectedStart = range.start;
|
|
6666
|
+
this._selectedEnd = range.end;
|
|
6667
|
+
this._activePreset = preset.label;
|
|
6668
|
+
this.leftCurrentSlot = new Date(range.start);
|
|
6669
|
+
if (this.showDualCalendars) {
|
|
6670
|
+
this.rightCurrentSlot = moment(this.leftCurrentSlot).add(1, 'month').toDate();
|
|
6671
|
+
}
|
|
6672
|
+
this.updateCalendars();
|
|
6673
|
+
}
|
|
6674
|
+
goToToday() {
|
|
6675
|
+
const today = new Date();
|
|
6676
|
+
this._selectedDate = moment(today).startOf('day').toDate();
|
|
6677
|
+
this.leftCurrentSlot = new Date(today);
|
|
6678
|
+
this.updateCalendars();
|
|
6679
|
+
}
|
|
6680
|
+
apply() {
|
|
6681
|
+
if (this.type === 'single') {
|
|
6682
|
+
if (this._selectedDate) {
|
|
6683
|
+
this.date = new Date(this._selectedDate);
|
|
6684
|
+
this.dateChange.emit(this.date);
|
|
6685
|
+
}
|
|
6686
|
+
}
|
|
6687
|
+
else {
|
|
6688
|
+
if (this._selectedStart) {
|
|
6689
|
+
this.startDate = new Date(this._selectedStart);
|
|
6690
|
+
this.startDateChange.emit(this.startDate);
|
|
6691
|
+
}
|
|
6692
|
+
if (this._selectedEnd) {
|
|
6693
|
+
this.endDate = new Date(this._selectedEnd);
|
|
6694
|
+
this.endDateChange.emit(this.endDate);
|
|
6695
|
+
}
|
|
6696
|
+
if (this._selectedStart && this._selectedEnd) {
|
|
6697
|
+
this.rangeChange.emit({ start: this.startDate, end: this.endDate });
|
|
6698
|
+
}
|
|
6699
|
+
}
|
|
6700
|
+
this.close();
|
|
6701
|
+
}
|
|
6702
|
+
cancel() {
|
|
6703
|
+
this.close();
|
|
6704
|
+
}
|
|
6705
|
+
get canApply() {
|
|
6706
|
+
if (this.type === 'single')
|
|
6707
|
+
return !!this._selectedDate;
|
|
6708
|
+
return !!(this._selectedStart && this._selectedEnd);
|
|
6709
|
+
}
|
|
6710
|
+
updateCalendars() {
|
|
6711
|
+
this.updateDays(this.leftCurrentSlot, 'left');
|
|
6712
|
+
if (this.showDualCalendars) {
|
|
6713
|
+
this.updateDays(this.rightCurrentSlot, 'right');
|
|
6714
|
+
}
|
|
6715
|
+
}
|
|
6716
|
+
updateDays(slot, side) {
|
|
6717
|
+
const enMonth = moment(slot).format('MMM');
|
|
6718
|
+
const translatedMonth = this._translate.instant(enMonth);
|
|
6719
|
+
const title = moment(slot).format('MMMM YYYY');
|
|
6720
|
+
const dayRows = [];
|
|
6721
|
+
let current = moment(slot).startOf('month').startOf('isoWeek');
|
|
6722
|
+
const end = moment(slot).endOf('month').endOf('isoWeek');
|
|
6723
|
+
const currentMonth = moment(slot).month();
|
|
6724
|
+
while (current.isSameOrBefore(end)) {
|
|
6725
|
+
const row = { days: [] };
|
|
6726
|
+
dayRows.push(row);
|
|
6727
|
+
for (let idx = 0; idx < 7; idx++) {
|
|
6728
|
+
const isOutside = currentMonth !== current.month();
|
|
6729
|
+
let isDisabled = false;
|
|
6730
|
+
if (this.minDate && current.toDate() < this.minDate) {
|
|
6731
|
+
isDisabled = true;
|
|
6732
|
+
}
|
|
6733
|
+
else if (this.maxDate && current.toDate() > this.maxDate) {
|
|
6734
|
+
isDisabled = true;
|
|
6735
|
+
}
|
|
6736
|
+
let isHighlighted = false;
|
|
6737
|
+
if (this.highlightDays && this.highlightDays.length) {
|
|
6738
|
+
isHighlighted = this.highlightDays.indexOf(current.valueOf()) >= 0;
|
|
6739
|
+
}
|
|
6740
|
+
const isSelected = isOutside ? false : this.isDaySelected(current);
|
|
6741
|
+
row.days.push({
|
|
6742
|
+
date: current.toDate(),
|
|
6743
|
+
lbl: isOutside ? '' : current.date().toString(),
|
|
6744
|
+
isOutside,
|
|
6745
|
+
selected: isSelected,
|
|
6746
|
+
isDisabled: isOutside ? true : isDisabled,
|
|
6747
|
+
isHighlighted: isOutside ? false : isHighlighted
|
|
6748
|
+
});
|
|
6749
|
+
current = current.clone().add(1, 'day');
|
|
6750
|
+
}
|
|
6751
|
+
}
|
|
6752
|
+
if (side === 'left') {
|
|
6753
|
+
this.leftDayRows = dayRows;
|
|
6754
|
+
this.leftDaysTitle = title;
|
|
6755
|
+
}
|
|
6756
|
+
else {
|
|
6757
|
+
this.rightDayRows = dayRows;
|
|
6758
|
+
this.rightDaysTitle = title;
|
|
6759
|
+
}
|
|
6760
|
+
}
|
|
6761
|
+
isDaySelected(date) {
|
|
6762
|
+
if (this.type === 'single') {
|
|
6763
|
+
return this._selectedDate ? date.isSame(moment(this._selectedDate), 'day') : false;
|
|
6764
|
+
}
|
|
6765
|
+
if (this._selectedStart && date.isSame(moment(this._selectedStart), 'day'))
|
|
6766
|
+
return true;
|
|
6767
|
+
if (this._selectedEnd && date.isSame(moment(this._selectedEnd), 'day'))
|
|
6768
|
+
return true;
|
|
6769
|
+
return false;
|
|
6770
|
+
}
|
|
6771
|
+
isToday(day) {
|
|
6772
|
+
if (day.isOutside)
|
|
6773
|
+
return false;
|
|
6774
|
+
return moment(day.date).isSame(moment(), 'day');
|
|
6775
|
+
}
|
|
6776
|
+
isInRange(day) {
|
|
6777
|
+
if (day.isOutside)
|
|
6778
|
+
return false;
|
|
6779
|
+
if (this.type !== 'range' || !this._selectedStart || !this._selectedEnd)
|
|
6780
|
+
return false;
|
|
6781
|
+
const d = moment(day.date);
|
|
6782
|
+
return d.isAfter(moment(this._selectedStart), 'day') && d.isBefore(moment(this._selectedEnd), 'day');
|
|
6783
|
+
}
|
|
6784
|
+
isRangeStart(day) {
|
|
6785
|
+
if (day.isOutside)
|
|
6786
|
+
return false;
|
|
6787
|
+
if (this.type !== 'range' || !this._selectedStart)
|
|
6788
|
+
return false;
|
|
6789
|
+
return moment(day.date).isSame(moment(this._selectedStart), 'day');
|
|
6790
|
+
}
|
|
6791
|
+
isRangeEnd(day) {
|
|
6792
|
+
if (day.isOutside)
|
|
6793
|
+
return false;
|
|
6794
|
+
if (this.type !== 'range' || !this._selectedEnd)
|
|
6795
|
+
return false;
|
|
6796
|
+
return moment(day.date).isSame(moment(this._selectedEnd), 'day');
|
|
6797
|
+
}
|
|
6798
|
+
}
|
|
6799
|
+
ZenduDatePickerDropdownComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduDatePickerDropdownComponent, deps: [{ token: i0.ElementRef }, { token: i1$1.Overlay }, { token: i0.ViewContainerRef }, { token: i2$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
|
|
6800
|
+
ZenduDatePickerDropdownComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ZenduDatePickerDropdownComponent, selector: "zen-date-picker-dropdown", inputs: { type: "type", date: "date", startDate: "startDate", endDate: "endDate", presets: "presets", minDate: "minDate", maxDate: "maxDate", disabled: "disabled", highlightDays: "highlightDays", placeholder: "placeholder", mobileBreakpoint: "mobileBreakpoint" }, outputs: { dateChange: "dateChange", startDateChange: "startDateChange", endDateChange: "endDateChange", rangeChange: "rangeChange" }, host: { listeners: { "window:resize": "onResize()", "window:mousedown": "outsideHandling($event)" } }, viewQueries: [{ propertyName: "triggerBtn", first: true, predicate: ["triggerBtn"], descendants: true }, { propertyName: "dropdownTemplate", first: true, predicate: ["dropdownTemplate"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<!-- Trigger Button -->\n<button class=\"dropdown-trigger\"\n #triggerBtn\n [disabled]=\"disabled\"\n [class.active]=\"isOpen\"\n [class.has-value]=\"hasValue\"\n (click)=\"toggle()\">\n <zen-icon class=\"trigger-icon\"\n src=\"assets/ng-zenduit/icons/calendar.svg\">\n </zen-icon>\n <span class=\"trigger-label\">{{ triggerLabel }}</span>\n</button>\n\n<!-- Dropdown Panel -->\n<ng-template #dropdownTemplate>\n <div class=\"dropdown-menu\" [class.mobile]=\"mobile\">\n <!-- RANGE DESKTOP: presets sidebar + dual calendar -->\n <ng-container *ngIf=\"type === 'range' && !mobile\">\n <!-- Presets sidebar -->\n <div class=\"presets-sidebar\">\n <div class=\"preset-item\"\n *ngFor=\"let preset of activePresets\"\n [class.active]=\"_activePreset === preset.label\"\n (click)=\"selectPreset(preset)\">\n {{ preset.label | translate }}\n </div>\n </div>\n\n <div class=\"sidebar-divider\"></div>\n\n <!-- Calendars + bottom panel -->\n <div class=\"calendars-container\">\n <div class=\"dual-calendars\">\n <!-- Left calendar -->\n <div class=\"calendar-panel\">\n <div class=\"calendar-content\">\n <div class=\"month-header\">\n <button class=\"nav-btn\" (click)=\"leftPrevMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-left.svg\"></zen-icon>\n </button>\n <span class=\"month-title\">{{ leftDaysTitle }}</span>\n <button class=\"nav-btn\" (click)=\"leftNextMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-right.svg\"></zen-icon>\n </button>\n </div>\n <ng-container *ngTemplateOutlet=\"calendarGrid; context: { $implicit: leftDayRows }\"></ng-container>\n </div>\n </div>\n\n <div class=\"calendar-divider\"></div>\n\n <!-- Right calendar -->\n <div class=\"calendar-panel\">\n <div class=\"calendar-content\">\n <div class=\"month-header\">\n <button class=\"nav-btn\" (click)=\"rightPrevMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-left.svg\"></zen-icon>\n </button>\n <span class=\"month-title\">{{ rightDaysTitle }}</span>\n <button class=\"nav-btn\" (click)=\"rightNextMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-right.svg\"></zen-icon>\n </button>\n </div>\n <ng-container *ngTemplateOutlet=\"calendarGrid; context: { $implicit: rightDayRows }\"></ng-container>\n </div>\n </div>\n </div>\n\n <div class=\"bottom-divider\"></div>\n\n <!-- Bottom panel: inputs + actions -->\n <div class=\"bottom-panel\">\n <div class=\"input-fields\">\n <div class=\"date-input\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedStart\">\n {{ _selectedStart ? formattedStartDate : ('Start date' | translate) }}\n </span>\n </div>\n <span class=\"date-separator\">–</span>\n <div class=\"date-input\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedEnd\">\n {{ _selectedEnd ? formattedEndDate : ('End date' | translate) }}\n </span>\n </div>\n </div>\n <div class=\"actions\">\n <button class=\"btn-cancel\" (click)=\"cancel()\">{{ 'Cancel' | translate }}</button>\n <button class=\"btn-apply\" [disabled]=\"!canApply\" (click)=\"apply()\">{{ 'Apply' | translate }}</button>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- RANGE MOBILE: single calendar with dual inputs on top -->\n <ng-container *ngIf=\"type === 'range' && mobile\">\n <div class=\"single-calendar-container\">\n <div class=\"calendar-content\">\n <div class=\"month-header\">\n <button class=\"nav-btn\" (click)=\"prevMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-left.svg\"></zen-icon>\n </button>\n <span class=\"month-title\">{{ leftDaysTitle }}</span>\n <button class=\"nav-btn\" (click)=\"nextMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-right.svg\"></zen-icon>\n </button>\n </div>\n\n <!-- Range inputs -->\n <div class=\"mobile-range-inputs\">\n <div class=\"date-input compact\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedStart\">\n {{ _selectedStart ? formattedStartDate : ('Select date' | translate) }}\n </span>\n </div>\n <span class=\"date-separator\">–</span>\n <div class=\"date-input compact\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedEnd\">\n {{ _selectedEnd ? formattedEndDate : ('Select date' | translate) }}\n </span>\n </div>\n </div>\n\n <ng-container *ngTemplateOutlet=\"calendarGrid; context: { $implicit: leftDayRows }\"></ng-container>\n </div>\n\n <div class=\"bottom-divider\"></div>\n\n <div class=\"bottom-panel compact\">\n <div class=\"actions full-width\">\n <button class=\"btn-cancel\" (click)=\"cancel()\">{{ 'Cancel' | translate }}</button>\n <button class=\"btn-apply\" [disabled]=\"!canApply\" (click)=\"apply()\">{{ 'Apply' | translate }}</button>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- SINGLE DATE: single calendar + input + today button -->\n <ng-container *ngIf=\"type === 'single'\">\n <div class=\"single-calendar-container\">\n <div class=\"calendar-content\">\n <div class=\"month-header\">\n <button class=\"nav-btn\" (click)=\"prevMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-left.svg\"></zen-icon>\n </button>\n <span class=\"month-title\">{{ leftDaysTitle }}</span>\n <button class=\"nav-btn\" (click)=\"nextMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-right.svg\"></zen-icon>\n </button>\n </div>\n\n <!-- Date input + Today button -->\n <div class=\"single-actions-row\">\n <div class=\"date-input flex-1\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedDate\">\n {{ _selectedDate ? formattedSelectedDate : ('Select date' | translate) }}\n </span>\n </div>\n <button class=\"btn-today\" (click)=\"goToToday()\">{{ 'Today' | translate }}</button>\n </div>\n\n <ng-container *ngTemplateOutlet=\"calendarGrid; context: { $implicit: leftDayRows }\"></ng-container>\n </div>\n\n <div class=\"bottom-divider\"></div>\n\n <div class=\"bottom-panel compact\">\n <div class=\"actions full-width\">\n <button class=\"btn-cancel\" (click)=\"cancel()\">{{ 'Cancel' | translate }}</button>\n <button class=\"btn-apply\" [disabled]=\"!canApply\" (click)=\"apply()\">{{ 'Apply' | translate }}</button>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n</ng-template>\n\n<!-- Shared calendar grid template -->\n<ng-template #calendarGrid let-dayRows>\n <div class=\"dates-grid\">\n <!-- Week day headers -->\n <div class=\"week-header\">\n <div class=\"cell header-cell\" *ngFor=\"let wd of weekDays\">{{ wd | translate }}</div>\n </div>\n <!-- Day rows -->\n <div class=\"day-row\" *ngFor=\"let row of dayRows\">\n <div class=\"cell day-cell\"\n *ngFor=\"let day of row.days\"\n [class.outside]=\"day.isOutside\"\n [class.selected]=\"day.selected\"\n [class.today]=\"isToday(day)\"\n [class.disabled]=\"day.isDisabled\"\n [class.in-range]=\"isInRange(day)\"\n [class.range-start]=\"isRangeStart(day)\"\n [class.range-end]=\"isRangeEnd(day)\"\n (click)=\"selectDay(day)\">\n <span class=\"day-number\">{{ day.lbl }}</span>\n <span class=\"highlight-dot\" *ngIf=\"day.isHighlighted\"></span>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [".dropdown-trigger{display:inline-flex;align-items:center;justify-content:center;gap:8px;padding:10px 16px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 1px 2px #1018280d;cursor:pointer;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;color:#667085;white-space:nowrap;transition:.2s;-webkit-appearance:none;appearance:none;outline:none}.dropdown-trigger:hover{border-color:#98a2b3}.dropdown-trigger.active{box-shadow:0 1px 2px #1018280d,0 0 0 4px #f2f4f7}.dropdown-trigger.has-value{color:#344054}.dropdown-trigger:disabled{cursor:not-allowed;opacity:.5}.dropdown-trigger .trigger-icon{width:20px;height:20px;background-color:#667085}.dropdown-trigger.has-value .trigger-icon{background-color:#344054}.dropdown-menu{display:inline-flex;background:#FFFFFF;border:1px solid #EAECF0;border-radius:8px;box-shadow:0 20px 24px -4px #10182814,0 8px 8px -4px #10182808;font-family:Inter,sans-serif;overflow:hidden;width:max-content}::ng-deep .cdk-overlay-container{position:fixed;z-index:1200;pointer-events:none;top:0;left:0;height:100%;width:100%}::ng-deep .cdk-overlay-backdrop{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:auto;z-index:1200}::ng-deep .cdk-overlay-connected-position-bounding-box{position:absolute;z-index:1201;display:flex;flex-direction:column;min-width:1px;min-height:1px}::ng-deep .zen-date-picker-dropdown-overlay{position:absolute;width:max-content!important;pointer-events:auto}.presets-sidebar{display:flex;flex-direction:column;gap:4px;padding:12px 16px;min-width:160px}.presets-sidebar .preset-item{padding:10px 16px;border-radius:6px;font-size:14px;font-weight:400;line-height:20px;color:#344054;cursor:pointer;white-space:nowrap;transition:.15s}.presets-sidebar .preset-item:hover{background:#F9FAFB}.presets-sidebar .preset-item.active{background:#F9FAFB;font-weight:500}.sidebar-divider{width:1px;background:#EAECF0;align-self:stretch}.calendars-container{display:flex;flex-direction:column}.dual-calendars{display:flex}.calendar-divider{width:1px;background:#EAECF0;align-self:stretch}.calendar-panel{width:328px;overflow:hidden}.calendar-content{display:flex;flex-direction:column;padding:20px 24px;gap:12px}.single-calendar-container{display:flex;flex-direction:column;width:328px}.month-header{display:flex;align-items:center;justify-content:space-between;width:280px}.nav-btn{display:flex;align-items:center;justify-content:center;padding:10px;border-radius:8px;border:none;background:transparent;cursor:pointer;-webkit-appearance:none;appearance:none;outline:none;transition:.15s}.nav-btn:hover{background:#F9FAFB}.nav-btn zen-icon{width:20px;height:20px;background-color:#344054}.month-title{font-size:16px;font-weight:500;line-height:24px;color:#344054;text-align:center}.single-actions-row{display:flex;gap:12px;align-items:flex-start;width:280px}.flex-1{flex:1}.btn-today{display:flex;align-items:center;justify-content:center;padding:10px 16px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 1px 2px #1018280d;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;color:#344054;cursor:pointer;white-space:nowrap;-webkit-appearance:none;appearance:none;outline:none;transition:.15s}.btn-today:hover{background:#F9FAFB}.mobile-range-inputs{display:flex;align-items:center;gap:8px;height:40px;width:280px}.date-input{display:flex;align-items:center;padding:8px 14px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 1px 2px #1018280d;min-width:0}.date-input.compact{flex:1}.date-input .date-input-text{font-size:16px;font-weight:400;line-height:24px;color:#101828;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.date-input .date-input-text.placeholder{color:#667085}.date-separator{font-size:16px;font-weight:400;line-height:24px;color:#667085}.dates-grid{display:flex;flex-direction:column;gap:4px}.week-header{display:flex;width:280px}.day-row{display:flex;border-radius:20px;overflow:hidden}.cell{position:relative;width:40px;height:40px;display:flex;align-items:center;justify-content:center;border-radius:20px}.cell .day-number{font-size:14px;font-weight:400;line-height:20px;text-align:center;color:#344054;width:24px}.cell.header-cell .day-number{font-weight:500}.header-cell{font-size:14px;font-weight:500;line-height:20px;color:#344054}.day-cell{cursor:pointer;transition:.1s}.day-cell:hover:not(.disabled):not(.selected){background:#F1F7FE}.day-cell:hover:not(.disabled):not(.selected) .day-number{color:#105494;font-weight:500}.day-cell.outside{cursor:default;pointer-events:none}.day-cell.today{background:#F2F4F7}.day-cell.today .day-number{font-weight:500}.day-cell.selected{background:#136AB6}.day-cell.selected .day-number{color:#fff;font-weight:500}.day-cell.in-range{background:#F1F7FE;border-radius:0}.day-cell.in-range .day-number{color:#105494}.day-cell.range-start{border-radius:20px 0 0 20px}.day-cell.range-end{border-radius:0 20px 20px 0}.day-cell.range-start.range-end{border-radius:20px}.day-cell.disabled{cursor:not-allowed}.day-cell.disabled .day-number{color:#d0d5dd}.day-cell .highlight-dot{position:absolute;bottom:4px;left:50%;transform:translate(-50%);width:5px;height:5px;border-radius:50%;background:#105494}.day-cell.selected .highlight-dot{background:#FFFFFF}.day-cell.outside .highlight-dot{background:#98A2B3}.bottom-divider{height:1px;background:#EAECF0;width:100%}.bottom-panel{display:flex;align-items:flex-start;justify-content:space-between;padding:16px 24px}.bottom-panel.compact{justify-content:flex-end}.input-fields{display:flex;gap:12px;align-items:center}.input-fields .date-input{width:128px}.actions{display:flex;gap:12px}.actions.full-width,.actions.full-width .btn-cancel,.actions.full-width .btn-apply{flex:1}.btn-cancel{display:flex;align-items:center;justify-content:center;padding:10px 16px;min-width:109px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 1px 2px #1018280d;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;color:#344054;cursor:pointer;-webkit-appearance:none;appearance:none;outline:none;transition:.15s;white-space:nowrap}.btn-cancel:hover{background:#F9FAFB}.btn-apply{display:flex;align-items:center;justify-content:center;padding:10px 16px;min-width:109px;background:#136AB6;border:1px solid #136AB6;border-radius:8px;box-shadow:0 1px 2px #1018280d;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;color:#fff;cursor:pointer;-webkit-appearance:none;appearance:none;outline:none;transition:.15s;white-space:nowrap}.btn-apply:hover{background:#105494}.btn-apply:disabled{opacity:.5;cursor:not-allowed}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ZenduIconComponent, selector: "zen-icon", inputs: ["src"] }, { kind: "pipe", type: i2$1.TranslatePipe, name: "translate" }] });
|
|
6801
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduDatePickerDropdownComponent, decorators: [{
|
|
6802
|
+
type: Component,
|
|
6803
|
+
args: [{ selector: 'zen-date-picker-dropdown', template: "<!-- Trigger Button -->\n<button class=\"dropdown-trigger\"\n #triggerBtn\n [disabled]=\"disabled\"\n [class.active]=\"isOpen\"\n [class.has-value]=\"hasValue\"\n (click)=\"toggle()\">\n <zen-icon class=\"trigger-icon\"\n src=\"assets/ng-zenduit/icons/calendar.svg\">\n </zen-icon>\n <span class=\"trigger-label\">{{ triggerLabel }}</span>\n</button>\n\n<!-- Dropdown Panel -->\n<ng-template #dropdownTemplate>\n <div class=\"dropdown-menu\" [class.mobile]=\"mobile\">\n <!-- RANGE DESKTOP: presets sidebar + dual calendar -->\n <ng-container *ngIf=\"type === 'range' && !mobile\">\n <!-- Presets sidebar -->\n <div class=\"presets-sidebar\">\n <div class=\"preset-item\"\n *ngFor=\"let preset of activePresets\"\n [class.active]=\"_activePreset === preset.label\"\n (click)=\"selectPreset(preset)\">\n {{ preset.label | translate }}\n </div>\n </div>\n\n <div class=\"sidebar-divider\"></div>\n\n <!-- Calendars + bottom panel -->\n <div class=\"calendars-container\">\n <div class=\"dual-calendars\">\n <!-- Left calendar -->\n <div class=\"calendar-panel\">\n <div class=\"calendar-content\">\n <div class=\"month-header\">\n <button class=\"nav-btn\" (click)=\"leftPrevMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-left.svg\"></zen-icon>\n </button>\n <span class=\"month-title\">{{ leftDaysTitle }}</span>\n <button class=\"nav-btn\" (click)=\"leftNextMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-right.svg\"></zen-icon>\n </button>\n </div>\n <ng-container *ngTemplateOutlet=\"calendarGrid; context: { $implicit: leftDayRows }\"></ng-container>\n </div>\n </div>\n\n <div class=\"calendar-divider\"></div>\n\n <!-- Right calendar -->\n <div class=\"calendar-panel\">\n <div class=\"calendar-content\">\n <div class=\"month-header\">\n <button class=\"nav-btn\" (click)=\"rightPrevMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-left.svg\"></zen-icon>\n </button>\n <span class=\"month-title\">{{ rightDaysTitle }}</span>\n <button class=\"nav-btn\" (click)=\"rightNextMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-right.svg\"></zen-icon>\n </button>\n </div>\n <ng-container *ngTemplateOutlet=\"calendarGrid; context: { $implicit: rightDayRows }\"></ng-container>\n </div>\n </div>\n </div>\n\n <div class=\"bottom-divider\"></div>\n\n <!-- Bottom panel: inputs + actions -->\n <div class=\"bottom-panel\">\n <div class=\"input-fields\">\n <div class=\"date-input\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedStart\">\n {{ _selectedStart ? formattedStartDate : ('Start date' | translate) }}\n </span>\n </div>\n <span class=\"date-separator\">–</span>\n <div class=\"date-input\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedEnd\">\n {{ _selectedEnd ? formattedEndDate : ('End date' | translate) }}\n </span>\n </div>\n </div>\n <div class=\"actions\">\n <button class=\"btn-cancel\" (click)=\"cancel()\">{{ 'Cancel' | translate }}</button>\n <button class=\"btn-apply\" [disabled]=\"!canApply\" (click)=\"apply()\">{{ 'Apply' | translate }}</button>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- RANGE MOBILE: single calendar with dual inputs on top -->\n <ng-container *ngIf=\"type === 'range' && mobile\">\n <div class=\"single-calendar-container\">\n <div class=\"calendar-content\">\n <div class=\"month-header\">\n <button class=\"nav-btn\" (click)=\"prevMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-left.svg\"></zen-icon>\n </button>\n <span class=\"month-title\">{{ leftDaysTitle }}</span>\n <button class=\"nav-btn\" (click)=\"nextMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-right.svg\"></zen-icon>\n </button>\n </div>\n\n <!-- Range inputs -->\n <div class=\"mobile-range-inputs\">\n <div class=\"date-input compact\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedStart\">\n {{ _selectedStart ? formattedStartDate : ('Select date' | translate) }}\n </span>\n </div>\n <span class=\"date-separator\">–</span>\n <div class=\"date-input compact\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedEnd\">\n {{ _selectedEnd ? formattedEndDate : ('Select date' | translate) }}\n </span>\n </div>\n </div>\n\n <ng-container *ngTemplateOutlet=\"calendarGrid; context: { $implicit: leftDayRows }\"></ng-container>\n </div>\n\n <div class=\"bottom-divider\"></div>\n\n <div class=\"bottom-panel compact\">\n <div class=\"actions full-width\">\n <button class=\"btn-cancel\" (click)=\"cancel()\">{{ 'Cancel' | translate }}</button>\n <button class=\"btn-apply\" [disabled]=\"!canApply\" (click)=\"apply()\">{{ 'Apply' | translate }}</button>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- SINGLE DATE: single calendar + input + today button -->\n <ng-container *ngIf=\"type === 'single'\">\n <div class=\"single-calendar-container\">\n <div class=\"calendar-content\">\n <div class=\"month-header\">\n <button class=\"nav-btn\" (click)=\"prevMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-left.svg\"></zen-icon>\n </button>\n <span class=\"month-title\">{{ leftDaysTitle }}</span>\n <button class=\"nav-btn\" (click)=\"nextMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-right.svg\"></zen-icon>\n </button>\n </div>\n\n <!-- Date input + Today button -->\n <div class=\"single-actions-row\">\n <div class=\"date-input flex-1\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedDate\">\n {{ _selectedDate ? formattedSelectedDate : ('Select date' | translate) }}\n </span>\n </div>\n <button class=\"btn-today\" (click)=\"goToToday()\">{{ 'Today' | translate }}</button>\n </div>\n\n <ng-container *ngTemplateOutlet=\"calendarGrid; context: { $implicit: leftDayRows }\"></ng-container>\n </div>\n\n <div class=\"bottom-divider\"></div>\n\n <div class=\"bottom-panel compact\">\n <div class=\"actions full-width\">\n <button class=\"btn-cancel\" (click)=\"cancel()\">{{ 'Cancel' | translate }}</button>\n <button class=\"btn-apply\" [disabled]=\"!canApply\" (click)=\"apply()\">{{ 'Apply' | translate }}</button>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n</ng-template>\n\n<!-- Shared calendar grid template -->\n<ng-template #calendarGrid let-dayRows>\n <div class=\"dates-grid\">\n <!-- Week day headers -->\n <div class=\"week-header\">\n <div class=\"cell header-cell\" *ngFor=\"let wd of weekDays\">{{ wd | translate }}</div>\n </div>\n <!-- Day rows -->\n <div class=\"day-row\" *ngFor=\"let row of dayRows\">\n <div class=\"cell day-cell\"\n *ngFor=\"let day of row.days\"\n [class.outside]=\"day.isOutside\"\n [class.selected]=\"day.selected\"\n [class.today]=\"isToday(day)\"\n [class.disabled]=\"day.isDisabled\"\n [class.in-range]=\"isInRange(day)\"\n [class.range-start]=\"isRangeStart(day)\"\n [class.range-end]=\"isRangeEnd(day)\"\n (click)=\"selectDay(day)\">\n <span class=\"day-number\">{{ day.lbl }}</span>\n <span class=\"highlight-dot\" *ngIf=\"day.isHighlighted\"></span>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [".dropdown-trigger{display:inline-flex;align-items:center;justify-content:center;gap:8px;padding:10px 16px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 1px 2px #1018280d;cursor:pointer;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;color:#667085;white-space:nowrap;transition:.2s;-webkit-appearance:none;appearance:none;outline:none}.dropdown-trigger:hover{border-color:#98a2b3}.dropdown-trigger.active{box-shadow:0 1px 2px #1018280d,0 0 0 4px #f2f4f7}.dropdown-trigger.has-value{color:#344054}.dropdown-trigger:disabled{cursor:not-allowed;opacity:.5}.dropdown-trigger .trigger-icon{width:20px;height:20px;background-color:#667085}.dropdown-trigger.has-value .trigger-icon{background-color:#344054}.dropdown-menu{display:inline-flex;background:#FFFFFF;border:1px solid #EAECF0;border-radius:8px;box-shadow:0 20px 24px -4px #10182814,0 8px 8px -4px #10182808;font-family:Inter,sans-serif;overflow:hidden;width:max-content}::ng-deep .cdk-overlay-container{position:fixed;z-index:1200;pointer-events:none;top:0;left:0;height:100%;width:100%}::ng-deep .cdk-overlay-backdrop{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:auto;z-index:1200}::ng-deep .cdk-overlay-connected-position-bounding-box{position:absolute;z-index:1201;display:flex;flex-direction:column;min-width:1px;min-height:1px}::ng-deep .zen-date-picker-dropdown-overlay{position:absolute;width:max-content!important;pointer-events:auto}.presets-sidebar{display:flex;flex-direction:column;gap:4px;padding:12px 16px;min-width:160px}.presets-sidebar .preset-item{padding:10px 16px;border-radius:6px;font-size:14px;font-weight:400;line-height:20px;color:#344054;cursor:pointer;white-space:nowrap;transition:.15s}.presets-sidebar .preset-item:hover{background:#F9FAFB}.presets-sidebar .preset-item.active{background:#F9FAFB;font-weight:500}.sidebar-divider{width:1px;background:#EAECF0;align-self:stretch}.calendars-container{display:flex;flex-direction:column}.dual-calendars{display:flex}.calendar-divider{width:1px;background:#EAECF0;align-self:stretch}.calendar-panel{width:328px;overflow:hidden}.calendar-content{display:flex;flex-direction:column;padding:20px 24px;gap:12px}.single-calendar-container{display:flex;flex-direction:column;width:328px}.month-header{display:flex;align-items:center;justify-content:space-between;width:280px}.nav-btn{display:flex;align-items:center;justify-content:center;padding:10px;border-radius:8px;border:none;background:transparent;cursor:pointer;-webkit-appearance:none;appearance:none;outline:none;transition:.15s}.nav-btn:hover{background:#F9FAFB}.nav-btn zen-icon{width:20px;height:20px;background-color:#344054}.month-title{font-size:16px;font-weight:500;line-height:24px;color:#344054;text-align:center}.single-actions-row{display:flex;gap:12px;align-items:flex-start;width:280px}.flex-1{flex:1}.btn-today{display:flex;align-items:center;justify-content:center;padding:10px 16px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 1px 2px #1018280d;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;color:#344054;cursor:pointer;white-space:nowrap;-webkit-appearance:none;appearance:none;outline:none;transition:.15s}.btn-today:hover{background:#F9FAFB}.mobile-range-inputs{display:flex;align-items:center;gap:8px;height:40px;width:280px}.date-input{display:flex;align-items:center;padding:8px 14px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 1px 2px #1018280d;min-width:0}.date-input.compact{flex:1}.date-input .date-input-text{font-size:16px;font-weight:400;line-height:24px;color:#101828;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.date-input .date-input-text.placeholder{color:#667085}.date-separator{font-size:16px;font-weight:400;line-height:24px;color:#667085}.dates-grid{display:flex;flex-direction:column;gap:4px}.week-header{display:flex;width:280px}.day-row{display:flex;border-radius:20px;overflow:hidden}.cell{position:relative;width:40px;height:40px;display:flex;align-items:center;justify-content:center;border-radius:20px}.cell .day-number{font-size:14px;font-weight:400;line-height:20px;text-align:center;color:#344054;width:24px}.cell.header-cell .day-number{font-weight:500}.header-cell{font-size:14px;font-weight:500;line-height:20px;color:#344054}.day-cell{cursor:pointer;transition:.1s}.day-cell:hover:not(.disabled):not(.selected){background:#F1F7FE}.day-cell:hover:not(.disabled):not(.selected) .day-number{color:#105494;font-weight:500}.day-cell.outside{cursor:default;pointer-events:none}.day-cell.today{background:#F2F4F7}.day-cell.today .day-number{font-weight:500}.day-cell.selected{background:#136AB6}.day-cell.selected .day-number{color:#fff;font-weight:500}.day-cell.in-range{background:#F1F7FE;border-radius:0}.day-cell.in-range .day-number{color:#105494}.day-cell.range-start{border-radius:20px 0 0 20px}.day-cell.range-end{border-radius:0 20px 20px 0}.day-cell.range-start.range-end{border-radius:20px}.day-cell.disabled{cursor:not-allowed}.day-cell.disabled .day-number{color:#d0d5dd}.day-cell .highlight-dot{position:absolute;bottom:4px;left:50%;transform:translate(-50%);width:5px;height:5px;border-radius:50%;background:#105494}.day-cell.selected .highlight-dot{background:#FFFFFF}.day-cell.outside .highlight-dot{background:#98A2B3}.bottom-divider{height:1px;background:#EAECF0;width:100%}.bottom-panel{display:flex;align-items:flex-start;justify-content:space-between;padding:16px 24px}.bottom-panel.compact{justify-content:flex-end}.input-fields{display:flex;gap:12px;align-items:center}.input-fields .date-input{width:128px}.actions{display:flex;gap:12px}.actions.full-width,.actions.full-width .btn-cancel,.actions.full-width .btn-apply{flex:1}.btn-cancel{display:flex;align-items:center;justify-content:center;padding:10px 16px;min-width:109px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 1px 2px #1018280d;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;color:#344054;cursor:pointer;-webkit-appearance:none;appearance:none;outline:none;transition:.15s;white-space:nowrap}.btn-cancel:hover{background:#F9FAFB}.btn-apply{display:flex;align-items:center;justify-content:center;padding:10px 16px;min-width:109px;background:#136AB6;border:1px solid #136AB6;border-radius:8px;box-shadow:0 1px 2px #1018280d;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;color:#fff;cursor:pointer;-webkit-appearance:none;appearance:none;outline:none;transition:.15s;white-space:nowrap}.btn-apply:hover{background:#105494}.btn-apply:disabled{opacity:.5;cursor:not-allowed}\n"] }]
|
|
6804
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1$1.Overlay }, { type: i0.ViewContainerRef }, { type: i2$1.TranslateService }]; }, propDecorators: { type: [{
|
|
6805
|
+
type: Input
|
|
6806
|
+
}], date: [{
|
|
6807
|
+
type: Input
|
|
6808
|
+
}], dateChange: [{
|
|
6809
|
+
type: Output
|
|
6810
|
+
}], startDate: [{
|
|
6811
|
+
type: Input
|
|
6812
|
+
}], startDateChange: [{
|
|
6813
|
+
type: Output
|
|
6814
|
+
}], endDate: [{
|
|
6815
|
+
type: Input
|
|
6816
|
+
}], endDateChange: [{
|
|
6817
|
+
type: Output
|
|
6818
|
+
}], rangeChange: [{
|
|
6819
|
+
type: Output
|
|
6820
|
+
}], presets: [{
|
|
6821
|
+
type: Input
|
|
6822
|
+
}], minDate: [{
|
|
6823
|
+
type: Input
|
|
6824
|
+
}], maxDate: [{
|
|
6825
|
+
type: Input
|
|
6826
|
+
}], disabled: [{
|
|
6827
|
+
type: Input
|
|
6828
|
+
}], highlightDays: [{
|
|
6829
|
+
type: Input
|
|
6830
|
+
}], placeholder: [{
|
|
6831
|
+
type: Input
|
|
6832
|
+
}], mobileBreakpoint: [{
|
|
6833
|
+
type: Input
|
|
6834
|
+
}], triggerBtn: [{
|
|
6835
|
+
type: ViewChild,
|
|
6836
|
+
args: ['triggerBtn']
|
|
6837
|
+
}], dropdownTemplate: [{
|
|
6838
|
+
type: ViewChild,
|
|
6839
|
+
args: ['dropdownTemplate']
|
|
6840
|
+
}], onResize: [{
|
|
6841
|
+
type: HostListener,
|
|
6842
|
+
args: ['window:resize']
|
|
6843
|
+
}], outsideHandling: [{
|
|
6844
|
+
type: HostListener,
|
|
6845
|
+
args: ['window:mousedown', ['$event']]
|
|
6846
|
+
}] } });
|
|
6847
|
+
|
|
6029
6848
|
// AoT requires an exported function for factories
|
|
6030
6849
|
function HttpLoaderFactory(httpClient) {
|
|
6031
6850
|
return new TranslateHttpLoader(httpClient);
|
|
@@ -6066,7 +6885,11 @@ NgZenduitModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version
|
|
|
6066
6885
|
ZenSnapshotPlayerComponent,
|
|
6067
6886
|
ZenWebRTCPlayerComponent,
|
|
6068
6887
|
ZenduSelectButtonDirective,
|
|
6069
|
-
ZenduTimepickerComponent
|
|
6888
|
+
ZenduTimepickerComponent,
|
|
6889
|
+
ZenduCommentTextareaComponent,
|
|
6890
|
+
ZenduCommentItemComponent,
|
|
6891
|
+
ZenduCommentListComponent,
|
|
6892
|
+
ZenduDatePickerDropdownComponent], imports: [CommonModule,
|
|
6070
6893
|
FormsModule,
|
|
6071
6894
|
DragDropModule,
|
|
6072
6895
|
AngularSignaturePadModule,
|
|
@@ -6100,7 +6923,11 @@ NgZenduitModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version
|
|
|
6100
6923
|
ZenduLocationSearch,
|
|
6101
6924
|
ZenLiveViewPlayerComponent,
|
|
6102
6925
|
ZenduSelectButtonDirective,
|
|
6103
|
-
ZenduTimepickerComponent
|
|
6926
|
+
ZenduTimepickerComponent,
|
|
6927
|
+
ZenduCommentTextareaComponent,
|
|
6928
|
+
ZenduCommentItemComponent,
|
|
6929
|
+
ZenduCommentListComponent,
|
|
6930
|
+
ZenduDatePickerDropdownComponent] });
|
|
6104
6931
|
NgZenduitModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: NgZenduitModule, providers: [
|
|
6105
6932
|
OpenCVService,
|
|
6106
6933
|
], imports: [CommonModule,
|
|
@@ -6154,7 +6981,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
|
|
|
6154
6981
|
ZenSnapshotPlayerComponent,
|
|
6155
6982
|
ZenWebRTCPlayerComponent,
|
|
6156
6983
|
ZenduSelectButtonDirective,
|
|
6157
|
-
ZenduTimepickerComponent
|
|
6984
|
+
ZenduTimepickerComponent,
|
|
6985
|
+
ZenduCommentTextareaComponent,
|
|
6986
|
+
ZenduCommentItemComponent,
|
|
6987
|
+
ZenduCommentListComponent,
|
|
6988
|
+
ZenduDatePickerDropdownComponent
|
|
6158
6989
|
],
|
|
6159
6990
|
providers: [
|
|
6160
6991
|
OpenCVService,
|
|
@@ -6204,7 +7035,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
|
|
|
6204
7035
|
ZenduLocationSearch,
|
|
6205
7036
|
ZenLiveViewPlayerComponent,
|
|
6206
7037
|
ZenduSelectButtonDirective,
|
|
6207
|
-
ZenduTimepickerComponent
|
|
7038
|
+
ZenduTimepickerComponent,
|
|
7039
|
+
ZenduCommentTextareaComponent,
|
|
7040
|
+
ZenduCommentItemComponent,
|
|
7041
|
+
ZenduCommentListComponent,
|
|
7042
|
+
ZenduDatePickerDropdownComponent
|
|
6208
7043
|
]
|
|
6209
7044
|
}]
|
|
6210
7045
|
}] });
|
|
@@ -6217,5 +7052,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
|
|
|
6217
7052
|
* Generated bundle index. Do not edit.
|
|
6218
7053
|
*/
|
|
6219
7054
|
|
|
6220
|
-
export { DATEPICKER_POSITION, HttpLoaderFactory, NgZenduitModule, ZenLiveViewPlayerComponent, ZenNotifyService, ZenduBreadcrumbs, ZenduCardBlockComponent, ZenduCheckboxComponent, ZenduColorPickerComponent, ZenduColumnConfigurationComponent, ZenduDatepickerComponent, ZenduDocScanner, ZenduFileUpload, ZenduFilterComponent, ZenduGroupsComponent, ZenduIconComponent, ZenduLocationSearch, ZenduMapComponent, ZenduMapPreviewComponent, ZenduPaginationBarComponent, ZenduPhoneInputComponent, ZenduProgress, ZenduRadioButtonComponent, ZenduSearchBoxComponent, ZenduSelectButtonDirective, ZenduSelectComponent, ZenduSelectOptionDirective, ZenduSelectValueDirective, ZenduSortHeaderComponent, ZenduSpinner, ZenduTimepickerComponent, ZenduToggleComponent, ZenduToggleSlideComponent };
|
|
7055
|
+
export { DATEPICKER_POSITION, HttpLoaderFactory, NgZenduitModule, ZenLiveViewPlayerComponent, ZenNotifyService, ZenduBreadcrumbs, ZenduCardBlockComponent, ZenduCheckboxComponent, ZenduColorPickerComponent, ZenduColumnConfigurationComponent, ZenduCommentItemComponent, ZenduCommentListComponent, ZenduCommentTextareaComponent, ZenduDatePickerDropdownComponent, ZenduDatepickerComponent, ZenduDocScanner, ZenduFileUpload, ZenduFilterComponent, ZenduGroupsComponent, ZenduIconComponent, ZenduLocationSearch, ZenduMapComponent, ZenduMapPreviewComponent, ZenduPaginationBarComponent, ZenduPhoneInputComponent, ZenduProgress, ZenduRadioButtonComponent, ZenduSearchBoxComponent, ZenduSelectButtonDirective, ZenduSelectComponent, ZenduSelectOptionDirective, ZenduSelectValueDirective, ZenduSortHeaderComponent, ZenduSpinner, ZenduTimepickerComponent, ZenduToggleComponent, ZenduToggleSlideComponent };
|
|
6221
7056
|
//# sourceMappingURL=ng-zenduit.mjs.map
|