import { EntityState } from '@ngrx/entity';
import { MemoizedSelector, Store } from '@ngrx/store';
import { Observable } from 'rxjs';
import { AppState, DetailPageState } from './../states/app.state';
import { AreaModel, AreaQuery, AreaUI } from './area.model';
import { Comment, CommentUI } from './comment';
import { CommonSelectorUI, Mapper, MapTree, modelService } from './common.model';
import { IterationModel, IterationQuery, IterationUI } from './iteration.model';
import { LabelMapper, LabelModel, LabelQuery, LabelUI } from './label.model';
import { Link } from './link';
import { UserQuery, UserService, UserUI } from './user';
import { WorkItemType, WorkItemTypeMapper, WorkItemTypeQuery, WorkItemTypeUI } from './work-item-type';
export declare class WorkItem extends modelService {
    hasChildren?: boolean;
    attributes: object;
    number?: number;
    relationships?: WorkItemRelations;
    relationalData?: RelationalData;
    links?: {
        self: string;
    };
}
export declare class WorkItemRelations {
    area?: {
        data?: AreaModel;
    };
    assignees?: {
        data?: UserService[];
    };
    labels?: {
        data?: LabelModel[];
        links?: {
            related?: string;
        };
    };
    baseType?: {
        data: WorkItemType;
    };
    parent?: {
        data?: WorkItem;
    };
    children?: {
        links: {
            related: string;
        };
        meta: {
            hasChildren: boolean;
        };
    };
    events?: {
        links?: {
            related?: string;
        };
    };
    comments?: {
        data?: Comment[];
        links: {
            self?: string;
            related?: string;
        };
        meta?: {
            totalCount?: number;
        };
    };
    creator?: {
        data: UserService;
    };
    iteration?: {
        data?: IterationModel;
    };
    codebase?: {
        links: {
            meta: {
                edit: string;
            };
        };
    };
    workItemLinks?: {
        links?: {
            related?: string;
        };
    };
}
export declare class RelationalData {
    area?: AreaModel;
    creator?: UserService;
    comments?: Comment[];
    parent?: WorkItem;
    assignees?: UserService[];
    labels?: LabelModel[];
    linkDicts?: LinkDict[];
    iteration?: IterationModel;
    totalLinkCount?: number;
    wiType?: WorkItemType;
}
export declare class LinkDict {
    linkName: any;
    links: Link[];
    count: number;
}
export interface WorkItemService extends WorkItem {
}
export interface WorkItemUI {
    id: string;
    title: string;
    number: string | number;
    createdAt: string;
    updatedAt: string;
    state: string;
    descriptionMarkup: string;
    descriptionRendered: string;
    description: string | {
        content: string;
        markup: 'Markdown';
        rendered?: string;
    };
    version: number;
    order: number;
    dynamicfields?: any;
    areaId: string;
    areaObs?: Observable<AreaUI>;
    iterationId: string;
    iterationObs?: Observable<IterationUI>;
    assignees: string[];
    assigneesObs?: Observable<UserUI[]>;
    creator: string;
    creatorObs?: Observable<UserUI>;
    type: string;
    typeObs?: Observable<WorkItemTypeUI>;
    labels: string[];
    labelsObs?: Observable<LabelUI[]>;
    comments?: CommentUI[];
    children?: WorkItemUI[];
    commentLink: string;
    childrenLink: string;
    eventLink: string;
    hasChildren: boolean;
    parentID: string;
    link: string;
    WILinkUrl: string;
    columnIds?: string[] | null;
    treeStatus: 'collapsed' | 'expanded' | 'disabled' | 'loading';
    childrenLoaded: boolean;
    bold: boolean;
    createId?: number;
    selected: boolean;
    editable?: boolean;
}
export interface WorkItemStateModel extends EntityState<WorkItemUI> {
    nextLink: string;
}
export declare class WorkItemMapper implements Mapper<WorkItemService, WorkItemUI> {
    wiTypeMapper: WorkItemTypeMapper;
    labelMapper: LabelMapper;
    serviceToUiMapTree: MapTree;
    uiToServiceMapTree: MapTree;
    toDynamicUIModel(arg: WorkItemService, dynamicFields: any): any;
    toDyanmicServiceModel(arg: WorkItemUI, dynamicFields: any): any;
    toUIModel(arg: WorkItemService): WorkItemUI;
    toServiceModel(arg: WorkItemUI): WorkItemService;
    cleanModel(arg: WorkItemService, keysToRemove?: string[]): any;
}
export declare const workItemSelector: MemoizedSelector<object, WorkItemStateModel | {
    entities: {};
    ids: any[];
}>;
export declare const getAllWorkItemSelector: MemoizedSelector<object, WorkItemUI[]>;
export declare const workItemDetailSelector: MemoizedSelector<object, DetailPageState>;
export declare const workItemInDetailSelector: MemoizedSelector<object, WorkItemUI>;
export declare class WorkItemQuery {
    private store;
    private userQuery;
    private iterationQuery;
    private areaQuery;
    private labelQuery;
    private workItemTypeQuery;
    constructor(store: Store<AppState>, userQuery: UserQuery, iterationQuery: IterationQuery, areaQuery: AreaQuery, labelQuery: LabelQuery, workItemTypeQuery: WorkItemTypeQuery);
    private workItemSource;
    resolveWorkItem(workItem: WorkItemUI): WorkItemUI;
    getWorkItems(): Observable<WorkItemUI[]>;
    getWorkItem(number: string | number): Observable<WorkItemUI>;
    /**
     * @description set property workItem.editable: true
     * IF loggedInUser is a Collaborator or creator of WorkItem
     * @param WorkItemUI || @param WorkItemUI[]
     * @return Observable<WorkItemUI> || @return Observable<WorkItemUI[]>
     */
    setWorkItemsEditable(workItems: WorkItemUI | WorkItemUI[]): Observable<WorkItemUI | WorkItemUI[]>;
    /**
     * This function returns an observable for the the selector component
     * with iteration data and the selected iteration flagged
     * This data can be used in work item detail page for the
     * iteration selector dropdown.
     * @param number
     */
    getIterationsForWorkItem(number: string | number): Observable<CommonSelectorUI[]>;
    /**
     * This function returns an observable for the the selector component
     * with area data and the selected area flagged
     * This data can be used in work item detail page for the
     * area selector dropdown.
     * @param number
     */
    getAreasForWorkItem(number: string | number): Observable<CommonSelectorUI[]>;
    /**
     * This function returns an observable for the the selector component
     * with work item type data and the selected iteration flagged
     * This data can be used in work item detail page for the
     * work item type selector dropdown.
     * @param number
     */
    getTypesForWorkItem(number: string | number): Observable<CommonSelectorUI[]>;
    /**
     * This function returns an observable for the the selector component
     * with work item state data and the selected iteration flagged
     * This data can be used in work item detail page for the
     * work item states selector dropdown.
     * @param number
     */
    getStatesForWorkItem(number: string | number): Observable<CommonSelectorUI[]>;
    readonly getWorkItemEntities: Observable<{
        [id: string]: WorkItemUI;
    }>;
    getWorkItemsByIds(ids: string[]): Observable<WorkItemUI[]>;
    getWorkItemWithId(id: string): Observable<WorkItemUI>;
}
