coveo-search-ui
Version:
Coveo JavaScript Search Framework
97 lines (87 loc) • 4.3 kB
text/typescript
import { Component } from '../Base/Component';
import { ComponentOptions } from '../Base/ComponentOptions';
import { IComponentBindings } from '../Base/ComponentBindings';
import { exportGlobally } from '../../GlobalExports';
import { Utils } from '../../Core';
import { Initialization } from '../Base/Initialization';
export interface IFacetsMobileModeConstructor {
new (element: HTMLElement, options: IFacetsMobileModeOptions, bindings: IComponentBindings): FacetsMobileMode;
}
export interface IFacetsMobileModeOptions {
breakpoint?: number;
isModal?: boolean;
displayOverlayWhileOpen?: boolean;
preventScrolling?: boolean;
scrollContainer?: HTMLElement;
}
/**
* This component lets you customize the mobile responsive behavior of facets in your search interface.
*
* **Notes:**
* - You can include this component anywhere under the root element of your search interface.
* - You should only include this component once in your search interface.
*/
export class FacetsMobileMode extends Component {
static ID = 'FacetsMobileMode';
/**
* @componentOptions
*/
static options: IFacetsMobileModeOptions = {
/**
* The screen width (in number of pixels) at which facets should enter mobile responsive mode and be collapsed under a single button.
*
* **Default:** `800`
*/
breakpoint: ComponentOptions.buildNumberOption(),
/**
* Whether to display the facets in a modal instead of a pop-up when the end user expands them in mobile responsive mode.
* Set this option to `false` in order to keep the old behaviour.
*/
isModal: ComponentOptions.buildBooleanOption({ defaultValue: true }),
/**
* Whether to display an overlay behind the facets when the end user expands them in mobile responsive mode.
*
* By default, the following behavior applies:
* - `true` when [isModal]{@link FacetsMobileMode.options.isModal} is `false`
* - `false` when [isModal]{@link FacetsMobileMode.options.isModal} is `true`
*/
displayOverlayWhileOpen: ComponentOptions.buildBooleanOption({
postProcessing: (value, options: IFacetsMobileModeOptions) => (Utils.isNullOrUndefined(value) ? !options.isModal : value)
}),
/**
* Whether to disable vertical scrolling on the specified or resolved [`scrollContainer`]{@link FacetsMobileMode.options.scrollContainer} while facets are expanded in mobile responsive mode.
*
* By default, the following behavior applies:
* - `true` when [isModal]{@link FacetsMobileMode.options.isModal} is `true`
* - `false` when [isModal]{@link FacetsMobileMode.options.isModal} is `false`
*/
preventScrolling: ComponentOptions.buildBooleanOption({
postProcessing: (value, options: IFacetsMobileModeOptions) => (Utils.isNullOrUndefined(value) ? options.isModal : value)
}),
/**
* The HTML element whose vertical scrolling should be locked while facets are expanded in mobile responsive mode.
*
* By default, the component tries to detect and use the first ancestor element whose CSS `overflow-y` attribute is set to `scroll`, starting from the `FacetsMobileMode`'s element itself. If no such element is found, the `document.body` element is used.
*
* Since this heuristic is not perfect, we strongly recommend that you manually set this option by explicitly specifying the desired CSS selector.
*
* **Example:** `data-scroll-container-selector='#someCssSelector'`
*/
scrollContainer: ComponentOptions.buildChildHtmlElementOption({ depend: 'preventScrolling' })
};
static doExport = () => {
exportGlobally({
FacetsMobileMode: FacetsMobileMode
});
};
public options: IFacetsMobileModeOptions;
constructor(public element: HTMLElement, options?: IFacetsMobileModeOptions, bindings?: IComponentBindings) {
super(element, FacetsMobileMode.ID, bindings);
this.options = ComponentOptions.initComponentOptions(element, FacetsMobileMode, options);
if (this.options.preventScrolling) {
const scrollContainer = this.options.scrollContainer || this.searchInterface.element;
this.options.scrollContainer = ComponentOptions.findParentScrollLockable(scrollContainer);
}
}
}
Initialization.registerAutoCreateComponent(FacetsMobileMode);