/**
 *
 * carbon-angular v0.0.0 | table-header-item.class.d.ts
 *
 * Copyright 2014, 2025 IBM
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0

 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */


import { TableItem } from "./table-item.class";
import { TemplateRef } from "@angular/core";
export declare type SortType = "ASCENDING" | "DESCENDING" | "NONE";
export declare class TableHeaderItem {
    /**
     * If true, sort is set to ascending, if false descending will be true.
     *
     */
    set ascending(asc: boolean);
    get ascending(): boolean;
    /**
     * If true, sort is set to descending, if false ascending will be true.
     *
     */
    set descending(desc: boolean);
    get descending(): boolean;
    get title(): any;
    set title(title: any);
    /**
     * Defines if column under this TableHeaderItem should be displayed.
     *
     */
    visible: boolean;
    /**
     * Disables sorting by default.
     *
     */
    sorted: boolean;
    /**
     * Enables sorting on click by default.
     * If false then this column won't show a sorting arrow at all.
     *
     */
    sortable: boolean;
    /**
     * Number of applied filters.
     *
     * `filter()` should set it to appropriate number.
     *
     */
    filterCount: number;
    /**
     * The number of rows to span
     * **NOTE:** not supported by the default carbon table
     */
    rowSpan: number;
    /**
     * The number of columns to span
     */
    colSpan: number;
    /**
     * Attach a class to the column, both the header and column cells.
     *
     */
    className: string;
    /**
     * Style for the column, applied to every element in the column.
     *
     * ngStyle-like format
     *
     */
    style: {};
    /**
     * Data for the header item.
     */
    data: any;
    /**
     * Data for the header item for general usage in the controller.
     * For example, which `field` is this column related to.
     */
    metadata: any;
    /**
     * Used to display data in a desired way.
     *
     * If not provided, displays data as a simple string.
     *
     * Usage:
     *
     * In a component where you're using the table create a template like:
     *
     * ```html
     * <ng-template #customHeaderTemplate let-data="data">
     * 		<i><a [routerLink]="data.link">{{data.name}}</a></i>
     * </ng-template>
     * ```
     * where we assume your data contains `link` and `name`. `let-data="data"` is
     * necessary for you to be able to access item's data in the template.
     *
     * Create `ViewChild` property with:
     *
     * ```typescript
     * (at)ViewChild("customHeaderTemplate")
     * protected customHeaderTemplate: TemplateRef<any>;
     * ```
     *
     * Set the template to the header item, for example:
     *
     * ```typescript
     * this.model.header = [
     * 		new TableHeaderItem({data: {name: "Custom header", link: "/table"}, template: this.customHeaderTemplate})
     * ];
     * ```
     */
    template: TemplateRef<any>;
    /**
     * The label for the sort button
     */
    ariaSortLabel: string;
    /**
     * A callback function to format the sort label. Will be heavily called.
     */
    formatSortLabel: (label: string, staticLabel?: string) => string;
    /**
     * Used as a template for popover filter.
     *
     * `let-popover="popover"` will give you access to popover component and allow you to
     * manipulate it if needed.
     *
     * `let-filter="filter"` will give you access to the "filter". The main takeaway is
     * store the data you need to `filter.data`. You will be able to access it as
     * `this.filterData.data` from your `filter()` function when you extend `TableHeaderItem`
     *
     * Example:
     * ```html
     * <ng-template #filter let-popover="popover">
     * 	<cds-label class="first-label">
     * 		Value
     * 		<input type="text" [(ngModel)]="filter1" class="input-field">
     * 	</cds-label>
     * </ng-template>
     *
     * <ng-template #filterFooter let-popover="popover" let-filter="data">
     * 	<button class="btn--primary" (click)="filter.data = filter1; popover.onClose()">Apply</button>
     * 	<button class="btn--secondary" (click)="popover.onClose()">Cancel</button>
     * </ng-template>
     * ```
     *
     * Set the template with, for example:
     * ```typescript
     * new FilterableHeaderItem({
     * 	filterTemplate: this.filter,
     *	filterFooter: this.filterFooter
     * })
     * ```
     *
     * ```typescript
     * class FilterableHeaderItem extends TableHeaderItem {
     * 	// custom filter function
     * 	filter(item: TableItem): boolean {
     * 		if (typeof item.data === "string" && item.data.indexOf(this.filterData.data) >= 0) {
     * 			this.filterCount = 1;
     * 			return false;
     * 		}
     * 		this.filterCount = 0;
     * 		return true;
     * 	}
     * }
     * ```
     */
    filterTemplate: TemplateRef<any>;
    /**
     * Used along with `filterTemplate` to construct the filter popover
     */
    filterFooter: TemplateRef<any>;
    /**
     * This is where you store your data when applying filter.
     *
     * It is the actual object you have access to with `let-filter="data"` in your template.
     *
     * Make sure to store data in `filter.data` in your template, and you will have it
     * available in `filterData.data` in your extension of `TableHeaderItem`.
     *
     * Because angular and object references.
     */
    filterData: any;
    sortDirection: SortType;
    private _title;
    /**
     * Creates an instance of TableHeaderItem.
     */
    constructor(rawData?: any);
    /**
     * Used for sorting rows of the table.
     *
     * Override to enable different sorting.
     *
     * < 0 if `one` should go before `two`
     * > 0 if `one` should go after `two`
     * 0 if it doesn't matter (they are the same)
     */
    compare(one: TableItem, two: TableItem): number;
    /**
     * Used to filter rows in the table.
     *
     * Override to make a custom filter.
     *
     * Even though there is just one filter function, there can be multiple filters.
     * When implementing filter, set `filterCount` before returning.
     *
     * `true` to hide the row
     * `false` to show the row
     */
    filter(item: TableItem): boolean;
}
