devexpress-reporting
Version:
DevExpress Reporting provides the capability to develop a reporting application to create and customize reports.
112 lines (111 loc) • 4.24 kB
JavaScript
/**
* DevExpress HTML/JS Reporting (viewer\mobile\internal\_mobileBindings.js)
* Version: 26.1.3
* Build date: Jun 16, 2026
* Copyright (c) 2012 - 2026 Developer Express Inc. ALL RIGHTS RESERVED
* License: https://www.devexpress.com/Support/EULAs/universal.xml
*/
import 'devextreme/common/core/events/transform';
import 'devextreme/common/core/events/pointer';
import { EventProcessor } from './_eventProcessor';
import * as events from 'devextreme/events';
import dxScrollView from 'devextreme/ui/scroll_view';
import { $dx } from '@devexpress/analytics-core/analytics-internal-native';
import { SearchBarModel } from './_mobileSearch';
export function initializeMobileZoomBinding(element, options) {
let scroll;
let zoom = options.getZoom();
const getScroll = () => {
if (!scroll) {
scroll = dxScrollView.getInstance(element.getElementsByClassName('dxrd-scrollView-mobile')[0]);
}
return scroll;
};
const nativeTouchStartHandler = (e) => {
if (e.touches.length >= 2) {
getScroll()?.option('disabled', true);
}
};
const pinchHandler = (e) => {
e.stopPropagation();
e.preventDefault();
const scale = e['scale'];
let newZoom = zoom;
newZoom *= scale;
newZoom = Math.max(0.15, Math.min(2, newZoom));
options.setZoom(newZoom);
};
const pinchStartHandler = (e) => {
e.stopPropagation();
e.preventDefault();
const scroll = getScroll();
scroll?.option('disabled', true);
options.setZoomUpdating(true);
zoom = options.getZoom();
};
const pinchEndHandler = (e) => {
e.stopPropagation();
setTimeout(() => {
const scroll = getScroll();
if (scroll) {
scroll.option('disabled', false);
scroll.refresh();
const scrollPos = scroll.scrollOffset();
scrollPos && scroll.scrollTo(scrollPos);
}
options.setZoomUpdating(false);
}, 10);
};
element.addEventListener('touchstart', nativeTouchStartHandler, { passive: true, capture: true });
events.on(element, 'dxpinch', pinchHandler);
events.on(element, 'dxpinchstart', pinchStartHandler);
events.on(element, 'dxpinchend', pinchEndHandler);
return () => {
element.removeEventListener('touchstart', nativeTouchStartHandler, { capture: true });
events.off(element, 'dxpinch', pinchHandler);
events.off(element, 'dxpinchstart', pinchStartHandler);
events.off(element, 'dxpinchend', pinchEndHandler);
};
}
export function initializeSlideBinding(element, options) {
let isStarted = false;
const processor = new EventProcessor(element, options);
const pointerDownHandler = (e) => {
processor.start(e);
isStarted = true;
};
const pointerMoveHandler = (e) => {
isStarted && processor.move(e);
};
const pointerFinishHandler = (e) => {
if (isStarted) {
processor.end(e);
isStarted = false;
}
};
events.on(element, 'dxpointerdown', pointerDownHandler);
events.on(element, 'dxpointermove', pointerMoveHandler);
['dxpointercancel', 'dxpointerleave', 'dxpointerup'].forEach((value) => {
events.on(element, value, pointerFinishHandler);
});
return () => {
events.off(element, 'dxpointerdown', pointerDownHandler);
events.off(element, 'dxpointermove', pointerMoveHandler);
['dxpointercancel', 'dxpointerleave', 'dxpointerup'].forEach((value) => {
events.off(element, value, pointerFinishHandler);
});
processor.dispose();
};
}
export function initializeMobileSearchBinding(element, viewModel) {
const model = viewModel.getModel();
const $element = $dx(element);
element.style.display = 'none';
const $searchText = $element.find('.dxrdp-taptosearch-text');
const searchBarModel = new SearchBarModel(model, element, $searchText);
return () => searchBarModel.dispose();
}
export function initializeMobilePaginatorBinding(element, viewModel) {
const values = viewModel.getModel();
values.initialize(element);
}