outsystems-ui
Version:
OutSystems UI Framework
336 lines (292 loc) • 10.6 kB
text/typescript
// eslint-disable-next-line @typescript-eslint/no-unused-vars
namespace Providers.OSUI.RangeSlider.NoUISlider {
/**
* Defines the interface for OutSystemsUI Patterns
*/
// eslint-disable-next-line @typescript-eslint/naming-convention
export abstract class AbstractNoUiSlider<C extends NoUiSlider.AbstractNoUiSliderConfig>
extends OSFramework.OSUI.Patterns.RangeSlider.AbstractRangeSlider<NoUiSlider, C>
implements INoUiSlider
{
// Store if the mode is Interval
private _isInterval: boolean;
// Store the provider target elem
private _rangeSliderProviderElem: HTMLElement;
// RangeSlider events
protected eventProviderValueChanged: OSFramework.OSUI.GlobalCallbacks.Generic;
// Store the provider options
protected noUiSliderOpts: NoUiSliderOptions;
protected platformEventValueChange: OSFramework.OSUI.Patterns.RangeSlider.Callbacks.OSOnValueChangeEvent;
// throttle before invoking the platform
protected throttleTimeValue = 200;
// throttle timer id
protected throttleTimer = undefined;
constructor(uniqueId: string, configs: C) {
super(uniqueId, configs);
this._isInterval =
this.configs.rangeSliderMode === OSFramework.OSUI.Patterns.RangeSlider.Enum.Mode.Interval;
}
// Method to togghe the disabled attribute
private _setIsDisabled(isDisabled: boolean): void {
isDisabled ? this.provider.disable() : this.provider.enable();
}
// Method to set the OnValueChangeEvent
private _setOnValueChangeEvent(changeEvent: RangeSlider.NoUiSlider.Enum.NoUISliderEvents): void {
this.provider.on(changeEvent, this.eventProviderValueChanged);
}
// Method to create/update the Size CSS Variable
private _setSize(): void {
if (this.configs.Size.includes('%') && parseFloat(this.configs.Size) > 100) {
this.configs.Size = OSFramework.OSUI.Patterns.RangeSlider.Enum.DefaultValues.PercentualSize;
console.warn(
`The value of the Size property on the '${this.widgetId}' ${OSFramework.OSUI.GlobalEnum.PatternName.RangeSlider} can't be smaller than '${OSFramework.OSUI.Patterns.RangeSlider.Enum.DefaultValues.PercentualSize}'.`
);
}
OSFramework.OSUI.Helper.Dom.Styles.SetStyleAttribute(
this.selfElement,
OSFramework.OSUI.Patterns.RangeSlider.Enum.CssProperties.Size,
this.configs.Size
);
}
// Method to update range values on RangeSlider
private _updateRangeValues(): void {
this.provider.updateOptions({
range: this.configs.getRangeConfig(),
});
if (this.configs.ShowTickMarks) {
this.provider.updateOptions({ pips: this.configs.getPipsConfig() });
}
}
/**
* Method that will create the provider
*
* @private
* @memberof Providers.OSUI.RangeSlider.NoUISlider.AbstractNoUiSlider
*/
protected createProviderInstance(): void {
// Init provider
this.provider = window.noUiSlider.create(this._rangeSliderProviderElem, this.noUiSliderOpts);
// Set inital visual configs, like size and disabled status
this.setInitialStates();
// Set provider Info to be used by setProviderConfigs API calls
this.updateProviderEvents({
name: RangeSlider.NoUiSlider.Enum.ProviderInfo.Name,
version: RangeSlider.NoUiSlider.Enum.ProviderInfo.Version,
events: this.provider, //this.provider will also contain all the supported lib configs
});
this.setInitialCSSClasses();
// Set OnValueChange event
this._setOnValueChangeEvent(RangeSlider.NoUiSlider.Enum.NoUISliderEvents.Slide);
/**
* Trigger Innitialized Event.
* - This is needed for the patterns based on a provider since at the Initialized Event at the
* Platform side, custom code can be added in order to add customization to the provider.
* - This way, Initialized Event will be triggered every time a redraw occurs.
*/
this.triggerPlatformInitializedEventCallback();
}
/**
* Method to set the html elements used
*
* @protected
* @memberof Providers.OSUI.RangeSlider.NoUISlider.AbstractNoUiSlider
*/
protected setHtmlElements(): void {
// Element that will be used to init the provider
this._rangeSliderProviderElem = OSFramework.OSUI.Helper.Dom.ClassSelector(
this.selfElement,
OSFramework.OSUI.Patterns.RangeSlider.Enum.CssClass.RangeSliderProviderElem
);
}
/**
* Method to set the initial CSS Classes
*
* @protected
* @memberof Providers.OSUI.RangeSlider.NoUISlider.AbstractNoUiSlider
*/
protected setInitialCSSClasses(): void {
// If Orientation is vertical add class
if (this.configs.Orientation === OSFramework.OSUI.GlobalEnum.Orientation.Vertical) {
OSFramework.OSUI.Helper.Dom.Styles.AddClass(
this.selfElement,
OSFramework.OSUI.Patterns.RangeSlider.Enum.CssClass.ClassModifier +
OSFramework.OSUI.GlobalEnum.Orientation.Vertical
);
// Otherwise it's horizontal and we don't need a class
} else if (OSFramework.OSUI.GlobalEnum.Orientation.Horizontal) {
OSFramework.OSUI.Helper.Dom.Styles.RemoveClass(
this.selfElement,
OSFramework.OSUI.Patterns.RangeSlider.Enum.CssClass.ClassModifier +
OSFramework.OSUI.GlobalEnum.Orientation.Vertical
);
}
if (this.configs.ShowTickMarks) {
OSFramework.OSUI.Helper.Dom.Styles.AddClass(
this.selfElement,
OSFramework.OSUI.Patterns.RangeSlider.Enum.CssClass.HasTicks
);
} else {
OSFramework.OSUI.Helper.Dom.Styles.RemoveClass(
this.selfElement,
OSFramework.OSUI.Patterns.RangeSlider.Enum.CssClass.HasTicks
);
}
}
/**
* Method to set initial visual states from the configs
*
* @private
* @memberof Providers.OSUI.RangeSlider.NoUISlider.AbstractNoUiSlider
*/
protected setInitialStates(): void {
this._setSize();
this._setIsDisabled(this.configs.IsDisabled);
}
/**
* Unsets the callbacks.
*
* @protected
* @memberof Providers.OSUI.RangeSlider.NoUISlider.AbstractNoUiSlider
*/
protected unsetCallbacks(): void {
this.eventProviderValueChanged = undefined;
super.unsetCallbacks();
}
/**
* Unsets the HTML elements.
*
* @protected
* @memberof Providers.OSUI.RangeSlider.NoUISlider.AbstractNoUiSlider
*/
protected unsetHtmlElements(): void {
this._rangeSliderProviderElem = undefined;
}
/**
* Builds the Pattern
*
* @memberof Providers.OSUI.RangeSlider.NoUISlider.AbstractNoUiSlider
*/
public build(): void {
super.build();
this.setHtmlElements();
}
/**
* Method to change the value of configs/current state.
*
* @param {string} propertyName
* @param {unknown} propertyValue
* @memberof Providers.OSUI.RangeSlider.NoUISlider.AbstractNoUiSlider
*/
public changeProperty(propertyName: string, propertyValue: unknown): void {
// Check which property changed and call respective method to update it
super.changeProperty(propertyName, propertyValue);
if (this.isBuilt) {
switch (propertyName) {
case OSFramework.OSUI.Patterns.RangeSlider.Enum.Properties.MinValue:
case OSFramework.OSUI.Patterns.RangeSlider.Enum.Properties.MaxValue:
this._updateRangeValues();
break;
case OSFramework.OSUI.Patterns.RangeSlider.Enum.Properties.Orientation:
this.redraw();
break;
case OSFramework.OSUI.Patterns.RangeSlider.Enum.Properties.IsDisabled:
this._setIsDisabled(this.configs.IsDisabled);
break;
case OSFramework.OSUI.Patterns.RangeSlider.Enum.Properties.TickMarksInterval:
this.provider.updateOptions({ pips: this.configs.getPipsConfig() });
break;
case OSFramework.OSUI.Patterns.RangeSlider.Enum.Properties.Step:
this.provider.updateOptions({ step: this.configs.Step });
break;
case OSFramework.OSUI.Patterns.RangeSlider.Enum.Properties.Size:
this._setSize();
break;
case OSFramework.OSUI.Patterns.RangeSlider.Enum.Properties.ShowFloatingLabel:
this.provider.updateOptions({ tooltips: this.configs.getTooltipFormat() });
break;
}
}
}
/**
* Method to set the RangeSlider instance to disabled
*
* @memberof Providers.OSUI.RangeSlider.NoUISlider.AbstractNoUiSlider
*/
public disable(): void {
this._setIsDisabled(true);
}
/**
* Method to remove and destroy RangeSlider instance
*
* @memberof Providers.OSUI.RangeSlider.NoUISlider.AbstractNoUiSlider
*/
public dispose(): void {
if (this.isBuilt) {
this.unsetCallbacks();
this.unsetHtmlElements();
this.provider.destroy();
}
super.dispose();
}
/**
* Method to set the RangeSlider instance to enabled
*
* @memberof Providers.OSUI.RangeSlider.NoUISlider.AbstractNoUiSlider
*/
public enable(): void {
this._setIsDisabled(false);
}
/**
* Method to get current RangeSlider value
*
* @return {*} {(number | number[])}
* @memberof Providers.OSUI.RangeSlider.NoUISlider.AbstractNoUiSlider
*/
public getValue(): number | number[] {
return this.provider.get();
}
/**
* Sets the callbacks to be used to invoke the platform code.
*
* @param {string} eventName
* @param {OSFramework.OSUI.GlobalCallbacks.OSGeneric} callback
* @memberof Providers.OSUI.RangeSlider.NoUISlider.AbstractNoUiSlider
*/
public registerCallback(eventName: string, callback: OSFramework.OSUI.GlobalCallbacks.OSGeneric): void {
switch (eventName) {
case OSFramework.OSUI.Patterns.RangeSlider.Enum.RangeSliderEvents.OnValueChange:
if (this.platformEventValueChange === undefined) {
this.platformEventValueChange = callback;
}
break;
default:
super.registerCallback(eventName, callback);
break;
}
}
/**
* Method used to set all the extended NoUiSlider properties across the different types of instances
*
* @param {NoUiSliderOptions} newConfigs
* @memberof Providers.OSUI.RangeSlider.NoUISlider.AbstractNoUiSlider
*/
public setProviderConfigs(newConfigs: NoUiSliderOptions): void {
this.configs.setExtensibilityConfigs(newConfigs);
this.redraw();
super.setProviderConfigs(newConfigs);
}
/**
* Method to change the Range Slider trigger to on DragEnd
*
* @memberof Providers.OSUI.RangeSlider.NoUISlider.AbstractNoUiSlider
*/
public setRangeIntervalChangeOnDragEnd(): void {
// Remove slide default event
this.provider.off(RangeSlider.NoUiSlider.Enum.NoUISliderEvents.Slide, this.eventProviderValueChanged);
// Set new Change event
this._setOnValueChangeEvent(RangeSlider.NoUiSlider.Enum.NoUISliderEvents.Change);
}
// Common method all RangeSliders must implement
protected abstract prepareConfigs(): void;
}
}