carbon-components-angular
Version:
Next generation components
125 lines • 16.1 kB
JavaScript
import { Component, Input, ViewChild, HostBinding } from "@angular/core";
import * as i0 from "@angular/core";
import * as i1 from "carbon-components-angular/utils";
/**
* There are two ways to create a tab, this class is a collection of features
* & metadata required by both.
*/
export class BaseTabHeader {
constructor(elementRef, changeDetectorRef, eventService, renderer) {
this.elementRef = elementRef;
this.changeDetectorRef = changeDetectorRef;
this.eventService = eventService;
this.renderer = renderer;
/**
* Set to 'true' to have `Tab` items cached and not reloaded on tab switching.
* Duplicate from `n-tabs` to support standalone headers
*/
this.cacheActive = false;
this.type = "line";
this.theme = "dark";
this.tabsClass = true;
// width of the overflow buttons
this.OVERFLOW_BUTTON_OFFSET = 44;
this.longPressMultiplier = 3;
this.clickMultiplier = 1.5;
this.longPressInterval = null;
this.tickInterval = null;
}
get containedClass() {
return this.type === "contained";
}
get themeClass() {
return this.theme === "light";
}
get hasHorizontalOverflow() {
const tabList = this.headerContainer.nativeElement;
return tabList.scrollWidth > tabList.clientWidth;
}
get leftOverflowNavButtonHidden() {
const tabList = this.headerContainer.nativeElement;
return !this.hasHorizontalOverflow || !tabList.scrollLeft;
}
get rightOverflowNavButtonHidden() {
const tabList = this.headerContainer.nativeElement;
return !this.hasHorizontalOverflow ||
(tabList.scrollLeft + tabList.clientWidth) === tabList.scrollWidth;
}
handleScroll() {
this.changeDetectorRef.markForCheck();
}
handleOverflowNavClick(direction, numOftabs = 0) {
const tabList = this.headerContainer.nativeElement;
const { clientWidth, scrollLeft, scrollWidth } = tabList;
if (direction > 0) {
tabList.scrollLeft = Math.min(scrollLeft + (scrollWidth / numOftabs) * this.clickMultiplier, scrollWidth - clientWidth);
}
else if (direction < 0) {
tabList.scrollLeft = Math.max(scrollLeft - (scrollWidth / numOftabs) * this.clickMultiplier, 0);
}
}
handleOverflowNavMouseDown(direction) {
const tabList = this.headerContainer.nativeElement;
this.longPressInterval = setTimeout(() => {
// Manually overriding scroll behvior to `auto` to make animation work correctly
this.renderer.setStyle(tabList, "scroll-behavior", "auto");
this.tickInterval = setInterval(() => {
tabList.scrollLeft += (direction * this.longPressMultiplier);
// clear interval if scroll reaches left or right edge
if (this.leftOverflowNavButtonHidden || this.rightOverflowNavButtonHidden) {
return () => {
clearInterval(this.tickInterval);
this.handleOverflowNavMouseUp();
};
}
});
return () => clearInterval(this.longPressInterval);
}, 500);
}
/**
* Clear intervals/Timeout & reset scroll behavior
*/
handleOverflowNavMouseUp() {
clearInterval(this.tickInterval);
clearTimeout(this.longPressInterval);
// Reset scroll behavior
this.renderer.setStyle(this.headerContainer.nativeElement, "scroll-behavior", "smooth");
}
}
BaseTabHeader.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BaseTabHeader, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1.EventService }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
BaseTabHeader.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: BaseTabHeader, selector: "ng-component", inputs: { cacheActive: "cacheActive", followFocus: "followFocus", ariaLabel: "ariaLabel", ariaLabelledby: "ariaLabelledby", contentBefore: "contentBefore", contentAfter: "contentAfter", type: "type", theme: "theme" }, host: { properties: { "class.cds--tabs": "this.tabsClass", "class.cds--tabs--contained": "this.containedClass", "class.cds--tabs--light": "this.themeClass" } }, viewQueries: [{ propertyName: "headerContainer", first: true, predicate: ["tabList"], descendants: true, static: true }], ngImport: i0, template: "", isInline: true });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BaseTabHeader, decorators: [{
type: Component,
args: [{
template: ""
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1.EventService }, { type: i0.Renderer2 }]; }, propDecorators: { cacheActive: [{
type: Input
}], followFocus: [{
type: Input
}], ariaLabel: [{
type: Input
}], ariaLabelledby: [{
type: Input
}], contentBefore: [{
type: Input
}], contentAfter: [{
type: Input
}], type: [{
type: Input
}], theme: [{
type: Input
}], tabsClass: [{
type: HostBinding,
args: ["class.cds--tabs"]
}], containedClass: [{
type: HostBinding,
args: ["class.cds--tabs--contained"]
}], themeClass: [{
type: HostBinding,
args: ["class.cds--tabs--light"]
}], headerContainer: [{
type: ViewChild,
args: ["tabList", { static: true }]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS10YWItaGVhZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90YWJzL2Jhc2UtdGFiLWhlYWRlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNOLFNBQVMsRUFDVCxLQUFLLEVBQ0wsU0FBUyxFQUlULFdBQVcsRUFFWCxNQUFNLGVBQWUsQ0FBQzs7O0FBR3ZCOzs7R0FHRztBQUlILE1BQU0sT0FBTyxhQUFhO0lBa0V6QixZQUNXLFVBQXNCLEVBQ3RCLGlCQUFvQyxFQUNwQyxZQUEwQixFQUMxQixRQUFtQjtRQUhuQixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQXJFOUI7OztXQUdHO1FBQ00sZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFpQnBCLFNBQUksR0FBeUIsTUFBTSxDQUFDO1FBQ3BDLFVBQUssR0FBcUIsTUFBTSxDQUFDO1FBRVYsY0FBUyxHQUFHLElBQUksQ0FBQztRQWlCakQsZ0NBQWdDO1FBQ3ZCLDJCQUFzQixHQUFHLEVBQUUsQ0FBQztRQUM1Qix3QkFBbUIsR0FBRyxDQUFDLENBQUM7UUFDeEIsb0JBQWUsR0FBRyxHQUFHLENBQUM7UUFFckIsc0JBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLGlCQUFZLEdBQUcsSUFBSSxDQUFDO0lBdUIxQixDQUFDO0lBN0NMLElBQStDLGNBQWM7UUFDNUQsT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLFdBQVcsQ0FBQztJQUNsQyxDQUFDO0lBQ0QsSUFBMkMsVUFBVTtRQUNwRCxPQUFPLElBQUksQ0FBQyxLQUFLLEtBQUssT0FBTyxDQUFDO0lBQy9CLENBQUM7SUFtQkQsSUFBSSxxQkFBcUI7UUFDeEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FB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QyxDQUFDO0lBQ3pGLENBQUM7OzBHQXhIVyxhQUFhOzhGQUFiLGFBQWEseWlCQUZmLEVBQUU7MkZBRUEsYUFBYTtrQkFIekIsU0FBUzttQkFBQztvQkFDVixRQUFRLEVBQUUsRUFBRTtpQkFDWjtvTEFNUyxXQUFXO3NCQUFuQixLQUFLO2dCQUlHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBSUcsU0FBUztzQkFBakIsS0FBSztnQkFJRyxjQUFjO3NCQUF0QixLQUFLO2dCQUVHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUUwQixTQUFTO3NCQUF4QyxXQUFXO3VCQUFDLGlCQUFpQjtnQkFDaUIsY0FBYztzQkFBNUQsV0FBVzt1QkFBQyw0QkFBNEI7Z0JBR0UsVUFBVTtzQkFBcEQsV0FBVzt1QkFBQyx3QkFBd0I7Z0JBT0csZUFBZTtzQkFBdEQsU0FBUzt1QkFBQyxTQUFTLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0Q29tcG9uZW50LFxuXHRJbnB1dCxcblx0Vmlld0NoaWxkLFxuXHRFbGVtZW50UmVmLFxuXHRUZW1wbGF0ZVJlZixcblx0Q2hhbmdlRGV0ZWN0b3JSZWYsXG5cdEhvc3RCaW5kaW5nLFxuXHRSZW5kZXJlcjJcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEV2ZW50U2VydmljZSB9IGZyb20gXCJjYXJib24tY29tcG9uZW50cy1hbmd1bGFyL3V0aWxzXCI7XG5cbi8qKlxuICogVGhlcmUgYXJlIHR3byB3YXlzIHRvIGNyZWF0ZSBhIHRhYiwgdGhpcyBjbGFzcyBpcyBhIGNvbGxlY3Rpb24gb2YgZmVhdHVyZXNcbiAqICYgbWV0YWRhdGEgcmVxdWlyZWQgYnkgYm90aC5cbiAqL1xuQENvbXBvbmVudCh7XG5cdHRlbXBsYXRlOiBcIlwiXG59KVxuZXhwb3J0IGNsYXNzIEJhc2VUYWJIZWFkZXIge1xuXHQvKipcblx0ICogU2V0IHRvICd0cnVlJyB0byBoYXZlIGBUYWJgIGl0ZW1zIGNhY2hlZCBhbmQgbm90IHJlbG9hZGVkIG9uIHRhYiBzd2l0Y2hpbmcuXG5cdCAqIER1cGxpY2F0ZSBmcm9tIGBuLXRhYnNgIHRvIHN1cHBvcnQgc3RhbmRhbG9uZSBoZWFkZXJzXG5cdCAqL1xuXHRASW5wdXQoKSBjYWNoZUFjdGl2ZSA9IGZhbHNlO1xuXHQvKipcblx0ICogU2V0IHRvICd0cnVlJyB0byBoYXZlIHRhYnMgYXV0b21hdGljYWxseSBhY3RpdmF0ZWQgYW5kIGhhdmUgdGhlaXIgY29udGVudCBkaXNwbGF5ZWQgd2hlbiB0aGV5IHJlY2VpdmUgZm9jdXMuXG5cdCAqL1xuXHRASW5wdXQoKSBmb2xsb3dGb2N1czogYm9vbGVhbjtcblx0LyoqXG5cdCAqIFNldHMgdGhlIGFyaWEgbGFiZWwgb24gdGhlIG5hdiBlbGVtZW50LlxuXHQgKi9cblx0QElucHV0KCkgYXJpYUxhYmVsOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBhcmlhIGxhYmVsbGVkYnkgb24gdGhlIG5hdiBlbGVtZW50LlxuXHQgKi9cblx0QElucHV0KCkgYXJpYUxhYmVsbGVkYnk6IHN0cmluZztcblxuXHRASW5wdXQoKSBjb250ZW50QmVmb3JlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXHRASW5wdXQoKSBjb250ZW50QWZ0ZXI6IFRlbXBsYXRlUmVmPGFueT47XG5cblx0QElucHV0KCkgdHlwZTogXCJsaW5lXCIgfCBcImNvbnRhaW5lZFwiID0gXCJsaW5lXCI7XG5cdEBJbnB1dCgpIHRoZW1lOiBcImRhcmtcIiB8IFwibGlnaHRcIiA9IFwiZGFya1wiO1xuXG5cdEBIb3N0QmluZGluZyhcImNsYXNzLmNkcy0tdGFic1wiKSB0YWJzQ2xhc3MgPSB0cnVlO1xuXHRASG9zdEJpbmRpbmcoXCJjbGFzcy5jZHMtLXRhYnMtLWNvbnRhaW5lZFwiKSBnZXQgY29udGFpbmVkQ2xhc3MoKSB7XG5cdFx0cmV0dXJuIHRoaXMudHlwZSA9PT0gXCJjb250YWluZWRcIjtcblx0fVxuXHRASG9zdEJpbmRpbmcoXCJjbGFzcy5jZHMtLXRhYnMtLWxpZ2h0XCIpIGdldCB0aGVtZUNsYXNzKCkge1xuXHRcdHJldHVybiB0aGlzLnRoZW1lID09PSBcImxpZ2h0XCI7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgVW5vcmRlcmVkIExpc3QgZWxlbWVudCB0aGF0IGhvbGRzIHRoZSBgVGFiYCBoZWFkaW5ncyBmcm9tIHRoZSB2aWV3IERPTS5cblx0ICovXG5cdEBWaWV3Q2hpbGQoXCJ0YWJMaXN0XCIsIHsgc3RhdGljOiB0cnVlIH0pIGhlYWRlckNvbnRhaW5lcjtcblxuXHQvKipcblx0ICogQ29udHJvbHMgdGhlIG1hbnVhbCBmb2N1c2luZyBkb25lIGJ5IHRhYmJpbmcgdGhyb3VnaCBoZWFkaW5ncy5cblx0ICovXG5cdGN1cnJlbnRTZWxlY3RlZFRhYjogbnVtYmVyO1xuXHQvLyB3aWR0aCBvZiB0aGUgb3ZlcmZsb3cgYnV0dG9uc1xuXHRyZWFkb25seSBPVkVSRkxPV19CVVRUT05fT0ZGU0VUID0gNDQ7XG5cdHJlYWRvbmx5IGxvbmdQcmVzc011bHRpcGxpZXIgPSAzO1xuXHRyZWFkb25seSBjbGlja011bHRpcGxpZXIgPSAxLjU7XG5cblx0cHJvdGVjdGVkIGxvbmdQcmVzc0ludGVydmFsID0gbnVsbDtcblx0cHJvdGVjdGVkIHRpY2tJbnRlcnZhbCA9IG51bGw7XG5cblx0Z2V0IGhhc0hvcml6b250YWxPdmVyZmxvdygpIHtcblx0XHRjb25zdCB0YWJMaXN0ID0gdGhpcy5oZWFkZXJDb250YWluZXIubmF0aXZlRWxlbWVudDtcblx0XHRyZXR1cm4gdGFiTGlzdC5zY3JvbGxXaWR0aCA+IHRhYkxpc3QuY2xpZW50V2lkdGg7XG5cdH1cblxuXHRnZXQgbGVmdE92ZXJmbG93TmF2QnV0dG9uSGlkZGVuKCkge1xuXHRcdGNvbnN0IHRhYkxpc3QgPSB0aGlzLmhlYWRlckNvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xuXHRcdHJldHVybiAhdGhpcy5oYXNIb3Jpem9udGFsT3ZlcmZsb3cgfHwgIXRhYkxpc3Quc2Nyb2xsTGVmdDtcblx0fVxuXG5cdGdldCByaWdodE92ZXJmbG93TmF2QnV0dG9uSGlkZGVuKCkge1xuXHRcdGNvbnN0IHRhYkxpc3QgPSB0aGlzLmhlYWRlckNvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xuXHRcdHJldHVybiAhdGhpcy5oYXNIb3Jpem9udGFsT3ZlcmZsb3cgfHxcblx0XHRcdCh0YWJMaXN0LnNjcm9sbExlZnQgKyB0YWJMaXN0LmNsaWVudFdpZHRoKSA9PT0gdGFiTGlzdC5zY3JvbGxXaWR0aDtcblx0fVxuXG5cdGNvbnN0cnVjdG9yKFxuXHRcdHByb3RlY3RlZCBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuXHRcdHByb3RlY3RlZCBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG5cdFx0cHJvdGVjdGVkIGV2ZW50U2VydmljZTogRXZlbnRTZXJ2aWNlLFxuXHRcdHByb3RlY3RlZCByZW5kZXJlcjogUmVuZGVyZXIyXG5cdCkgeyB9XG5cblx0aGFuZGxlU2Nyb2xsKCkge1xuXHRcdHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG5cdH1cblxuXHRoYW5kbGVPdmVyZmxvd05hdkNsaWNrKGRpcmVjdGlvbjogbnVtYmVyLCBudW1PZnRhYnMgPSAwKSB7XG5cdFx0Y29uc3QgdGFiTGlzdCA9IHRoaXMuaGVhZGVyQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQ7XG5cblx0XHRjb25zdCB7IGNsaWVudFdpZHRoLCBzY3JvbGxMZWZ0LCBzY3JvbGxXaWR0aCB9ID0gdGFiTGlzdDtcblx0XHRpZiAoZGlyZWN0aW9uID4gMCkge1xuXHRcdFx0dGFiTGlzdC5zY3JvbGxMZWZ0ID0gTWF0aC5taW4oc2Nyb2xsTGVmdCArIChzY3JvbGxXaWR0aCAvIG51bU9mdGFicykgKiB0aGlzLmNsaWNrTXVsdGlwbGllcixcblx0XHRcdFx0c2Nyb2xsV2lkdGggLSBjbGllbnRXaWR0aCk7XG5cdFx0fSBlbHNlIGlmIChkaXJlY3Rpb24gPCAwKSB7XG5cdFx0XHR0YWJMaXN0LnNjcm9sbExlZnQgPSBNYXRoLm1heChzY3JvbGxMZWZ0IC0gKHNjcm9sbFdpZHRoIC8gbnVtT2Z0YWJzKSAqIHRoaXMuY2xpY2tNdWx0aXBsaWVyLCAwKTtcblx0XHR9XG5cdH1cblxuXHRoYW5kbGVPdmVyZmxvd05hdk1vdXNlRG93bihkaXJlY3Rpb246IG51bWJlcikge1xuXHRcdGNvbnN0IHRhYkxpc3QgPSB0aGlzLmhlYWRlckNvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xuXG5cdFx0dGhpcy5sb25nUHJlc3NJbnRlcnZhbCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0Ly8gTWFudWFsbHkgb3ZlcnJpZGluZyBzY3JvbGwgYmVodmlvciB0byBgYXV0b2AgdG8gbWFrZSBhbmltYXRpb24gd29yayBjb3JyZWN0bHlcblx0XHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGFiTGlzdCwgXCJzY3JvbGwtYmVoYXZpb3JcIiwgXCJhdXRvXCIpO1xuXG5cdFx0XHR0aGlzLnRpY2tJbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcblx0XHRcdFx0dGFiTGlzdC5zY3JvbGxMZWZ0ICs9IChkaXJlY3Rpb24gKiB0aGlzLmxvbmdQcmVzc011bHRpcGxpZXIpO1xuXHRcdFx0XHQvLyBjbGVhciBpbnRlcnZhbCBpZiBzY3JvbGwgcmVhY2hlcyBsZWZ0IG9yIHJpZ2h0IGVkZ2Vcblx0XHRcdFx0aWYgKHRoaXMubGVmdE92ZXJmbG93TmF2QnV0dG9uSGlkZGVuIHx8IHRoaXMucmlnaHRPdmVyZmxvd05hdkJ1dHRvbkhpZGRlbikge1xuXHRcdFx0XHRcdHJldHVybiAoKSA9PiB7XG5cdFx0XHRcdFx0XHRjbGVhckludGVydmFsKHRoaXMudGlja0ludGVydmFsKTtcblx0XHRcdFx0XHRcdHRoaXMuaGFuZGxlT3ZlcmZsb3dOYXZNb3VzZVVwKCk7XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdHJldHVybiAoKSA9PiBjbGVhckludGVydmFsKHRoaXMubG9uZ1ByZXNzSW50ZXJ2YWwpO1xuXHRcdH0sIDUwMCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2xlYXIgaW50ZXJ2YWxzL1RpbWVvdXQgJiByZXNldCBzY3JvbGwgYmVoYXZpb3Jcblx0ICovXG5cdGhhbmRsZU92ZXJmbG93TmF2TW91c2VVcCgpIHtcblx0XHRjbGVhckludGVydmFsKHRoaXMudGlja0ludGVydmFsKTtcblx0XHRjbGVhclRpbWVvdXQodGhpcy5sb25nUHJlc3NJbnRlcnZhbCk7XG5cblx0XHQvLyBSZXNldCBzY3JvbGwgYmVoYXZpb3Jcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuaGVhZGVyQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQsIFwic2Nyb2xsLWJlaGF2aW9yXCIsIFwic21vb3RoXCIpO1xuXHR9XG59XG4iXX0=