Get rid of buildItems override

This commit is contained in:
Tanya Fomina 2024-05-11 12:26:10 +03:00
parent 5c7415c5bb
commit 7e90001fed
5 changed files with 45 additions and 64 deletions

View file

@ -3,7 +3,8 @@ import { IconDotCircle, IconChevronRight } from '@codexteam/icons';
import {
PopoverItemDefaultParams as PopoverItemDefaultParams,
PopoverItemParams as PopoverItemParams,
PopoverItemRenderParams
PopoverItemRenderParamsMap,
PopoverItemType
} from '../popover-item.types';
import { PopoverItem } from '../popover-item';
import { css } from './popover-item-default.const';
@ -87,7 +88,7 @@ export class PopoverItemDefault extends PopoverItem {
* @param renderParams - popover item render params.
* The parameters that are not set by user via popover api but rather depend on technical implementation
*/
constructor(private readonly params: PopoverItemDefaultParams, renderParams?: PopoverItemRenderParams) {
constructor(private readonly params: PopoverItemDefaultParams, renderParams?: PopoverItemRenderParamsMap[PopoverItemType.Default]) {
super();
this.nodes.root = this.make(params, renderParams);
@ -160,7 +161,7 @@ export class PopoverItemDefault extends PopoverItem {
* @param params - item construction params
* @param renderParams - popover item render params
*/
private make(params: PopoverItemDefaultParams, renderParams?: PopoverItemRenderParams): HTMLElement {
private make(params: PopoverItemDefaultParams, renderParams?: PopoverItemRenderParamsMap[PopoverItemType.Default]): HTMLElement {
const el = Dom.make('div', css.container);
if (params.name) {

View file

@ -1,5 +1,5 @@
import { PopoverItem } from '../popover-item';
import { PopoverItemHtmlParams, PopoverItemRenderParams } from '../popover-item.types';
import { PopoverItemHtmlParams, PopoverItemRenderParamsMap, PopoverItemType } from '../popover-item.types';
import { css } from './popover-item-html.const';
import Dom from '../../../../../dom';
@ -19,7 +19,7 @@ export class PopoverItemHtml extends PopoverItem {
* @param renderParams popover item render params.
* The parameters that are not set by user via popover api but rather depend on technical implementation
*/
constructor(params: PopoverItemHtmlParams, renderParams?: PopoverItemRenderParams) {
constructor(params: PopoverItemHtmlParams, renderParams?: PopoverItemRenderParamsMap[PopoverItemType.Html]) {
super();
this.nodes = {

View file

@ -1,4 +1,4 @@
import { HintPosition } from '../hint';
import { HintParams, HintPosition } from '../hint';
/**
* Popover item types
@ -42,17 +42,7 @@ export interface PopoverItemHtmlParams {
/**
* Hint data to be displayed on item hover
*/
hint?: {
/**
* Hint title
*/
title: string;
/**
* Secondary text to be displayed below the title
*/
description?: string;
}
hint?: HintParams;
}
/**
@ -110,17 +100,7 @@ interface PopoverItemDefaultBaseParams {
/**
* Hint data to be displayed on item hover
*/
hint?: {
/**
* Hint title
*/
title: string;
/**
* Secondary text to be displayed below the title
*/
description?: string;
}
hint?: HintParams;
}
/**
@ -188,20 +168,22 @@ export type PopoverItemParams =
* Popover item render params.
* The parameters that are not set by user via popover api but rather depend on technical implementation
*/
export interface PopoverItemRenderParams {
/**
* Hint render params
*/
hint?: {
export type PopoverItemRenderParamsMap = {
[key in PopoverItemType.Default | PopoverItemType.Html]?: {
/**
* Hint position relative to the item
* Hint render params
*/
position?: HintPosition;
hint?: {
/**
* Hint position relative to the item
*/
position?: HintPosition;
/**
* If false, hint will not be rendered.
* True by default
*/
enabled: boolean;
}
}
/**
* If false, hint will not be rendered.
* True by default
*/
enabled: boolean;
}
};
};

View file

@ -1,4 +1,4 @@
import { PopoverItem, PopoverItemDefault, PopoverItemRenderParams, PopoverItemSeparator, PopoverItemType } from './components/popover-item';
import { PopoverItem, PopoverItemDefault, PopoverItemRenderParamsMap, PopoverItemSeparator, PopoverItemType } from './components/popover-item';
import Dom from '../../dom';
import { SearchInput, SearchInputEvent, SearchableItem } from './components/search-input';
import EventsDispatcher from '../events';
@ -39,6 +39,7 @@ export abstract class PopoverAbstract<Nodes extends PopoverNodes = PopoverNodes>
*/
protected search: SearchInput | undefined;
/**
* Messages that will be displayed in popover
*/
@ -51,8 +52,13 @@ export abstract class PopoverAbstract<Nodes extends PopoverNodes = PopoverNodes>
* Constructs the instance
*
* @param params - popover construction params
* @param itemsRenderParams - popover item render params.
* The parameters that are not set by user via popover api but rather depend on technical implementation
*/
constructor(protected readonly params: PopoverParams) {
constructor(
protected readonly params: PopoverParams,
protected readonly itemsRenderParams: PopoverItemRenderParamsMap = {}
) {
super();
this.items = this.buildItems(params.items);
@ -147,17 +153,16 @@ export abstract class PopoverAbstract<Nodes extends PopoverNodes = PopoverNodes>
* Factory method for creating popover items
*
* @param items - list of items params
* @param params - popover item render params
*/
protected buildItems(items: PopoverItemParams[], params?: PopoverItemRenderParams): Array<PopoverItem> {
protected buildItems(items: PopoverItemParams[]): Array<PopoverItem> {
return items.map(item => {
switch (item.type) {
case PopoverItemType.Separator:
return new PopoverItemSeparator();
case PopoverItemType.Html:
return new PopoverItemHtml(item, params);
return new PopoverItemHtml(item, this.itemsRenderParams[PopoverItemType.Html]);
default:
return new PopoverItemDefault(item, params);
return new PopoverItemDefault(item, this.itemsRenderParams[PopoverItemType.Default]);
}
});
}

View file

@ -3,10 +3,11 @@ import ScrollLocker from '../scroll-locker';
import { PopoverHeader } from './components/popover-header';
import { PopoverStatesHistory } from './utils/popover-states-history';
import { PopoverMobileNodes, PopoverParams } from './popover.types';
import { PopoverItem, PopoverItemDefault, PopoverItemParams } from './components/popover-item';
import { PopoverItemDefault, PopoverItemParams, PopoverItemType } from './components/popover-item';
import { css } from './popover.const';
import Dom from '../../dom';
/**
* Mobile Popover.
* On mobile devices Popover behaves like a fixed panel at the bottom of screen. Nested item appears like "pages" with the "back" button
@ -41,7 +42,13 @@ export class PopoverMobile extends PopoverAbstract<PopoverMobileNodes> {
* @param params - popover params
*/
constructor(params: PopoverParams) {
super(params);
super(params, {
[PopoverItemType.Default]: {
hint: {
enabled: false,
},
},
});
this.nodes.overlay = Dom.make('div', [css.overlay, css.overlayHidden]);
this.nodes.popover.insertBefore(this.nodes.overlay, this.nodes.popover.firstChild);
@ -109,20 +116,6 @@ export class PopoverMobile extends PopoverAbstract<PopoverMobileNodes> {
});
}
/**
* Overrides the method to build items.
* Hides items hints, as hint is not supported in mobile popover
*
* @param items - list of items params
*/
protected override buildItems(items: PopoverItemParams[]): Array<PopoverItem> {
return super.buildItems(items, {
hint: {
enabled: false,
},
});
}
/**
* Removes rendered popover items and header and displays new ones
*