@nativescript-community/ui-pager
Version:
A NativeScript Pager / Carousel component that allows the user to swipe left and right through pages of data.
423 lines • 14.6 kB
JavaScript
var PagerBase_1;
import { Builder, CSSType, CoercibleProperty, GridLayout, Label, ObservableArray, Property, Trace, Utils, View, makeParser, makeValidator } from '@nativescript/core';
export var knownTemplates;
(function (knownTemplates) {
knownTemplates.itemTemplate = 'itemTemplate';
})(knownTemplates || (knownTemplates = {}));
export var knownMultiTemplates;
(function (knownMultiTemplates) {
knownMultiTemplates.itemTemplates = 'itemTemplates';
})(knownMultiTemplates || (knownMultiTemplates = {}));
export var knownCollections;
(function (knownCollections) {
knownCollections.items = 'items';
})(knownCollections || (knownCollections = {}));
export const pagerTraceCategory = 'ns-pager';
export function PagerLog(message) {
Trace.write(message, pagerTraceCategory);
}
export function PagerError(message) {
Trace.write(message, pagerTraceCategory, Trace.messageType.error);
}
const autoEffectiveItemHeight = 100;
const autoEffectiveItemWidth = 100;
export var Transformer;
(function (Transformer) {
Transformer["SCALE"] = "scale";
})(Transformer || (Transformer = {}));
const booleanConverter = (v) => String(v) === 'true';
let UNIQUE_VIEW_TYPE = 0;
let PagerBase = PagerBase_1 = class PagerBase extends View {
constructor() {
super(...arguments);
this.canGoRight = true;
this.canGoLeft = true;
this.preserveIndexOnItemsChange = false;
this.loadMoreCount = 1;
this.disableSwipe = false;
this._itemTemplateSelectorBindable = new Label();
this._defaultTemplate = {
key: 'default',
createView: () => {
if (this.itemTemplate) {
return Builder.parse(this.itemTemplate, this);
}
return undefined;
}
};
this._itemTemplatesInternal = new Array(this._defaultTemplate);
this._itemIdGenerator = (_item, index) => index;
// abstract _onItemsChanged(oldValue: any, newValue: any): void;
}
get padding() {
return this.style.padding;
}
set padding(value) {
this.style.padding = value;
}
get paddingTop() {
return this.style.paddingTop;
}
set paddingTop(value) {
this.style.paddingTop = value;
}
get paddingRight() {
return this.style.paddingRight;
}
set paddingRight(value) {
this.style.paddingRight = value;
}
get paddingBottom() {
return this.style.paddingBottom;
}
set paddingBottom(value) {
this.style.paddingBottom = value;
}
get paddingLeft() {
return this.style.paddingLeft;
}
set paddingLeft(value) {
this.style.paddingLeft = value;
}
static registerTransformer(key, transformer) {
PagerBase_1.mRegisteredTransformers[key] = transformer;
}
setIndicator(indicator) {
this.indicator = indicator;
}
disposeNativeView() {
this._childrenViews = [];
if (this.mObservableArrayInstance) {
this.mObservableArrayInstance.off(ObservableArray.changeEvent, this._observableArrayHandler);
this.mObservableArrayInstance = null;
}
super.disposeNativeView();
}
setObservableArrayInstance(value) {
if (this.mObservableArrayInstance) {
this.mObservableArrayInstance.off(ObservableArray.changeEvent, this._observableArrayHandler);
this.mObservableArrayInstance = null;
}
if (value instanceof ObservableArray) {
this.mObservableArrayInstance = value;
this.mObservableArrayInstance.on(ObservableArray.changeEvent, this._observableArrayHandler);
// } else {
}
this.refresh();
if (this.preserveIndexOnItemsChange) {
this[selectedIndexProperty.setNative](this.selectedIndex, false /* disableAnimation */, true /* requestTransform(Android) */);
}
else {
selectedIndexProperty.coerce(this);
}
}
getChildView(index) {
return this._childrenViews && this._childrenViews[index]?.view;
}
_removeView(view) {
// inside the recyclerview we wrap the PagerItem in a StackLayout
// so we need to call remove on that stacklayout
super._removeView(view);
if (view instanceof PagerItem && this._childrenViews) {
const index = this._childrenViews.findIndex((s) => s.view === view);
if (index !== -1) {
// this._removeChildView(index);
if (this.isLoaded && this._isAddedToNativeVisualTree) {
this.refresh();
}
}
}
}
_removeChildView(index) {
this._childrenViews.splice(index, 1);
}
_addChildView(view, type) {
this._childrenViews.push({ view, type });
}
_addChildFromBuilder(name, value) {
if (value instanceof PagerItem && value.parent !== this) {
if (!this._childrenViews) {
this._childrenViews = [];
}
this._addChildView(value, UNIQUE_VIEW_TYPE++);
if (this.isLoaded) {
this.refresh();
}
}
}
get itemIdGenerator() {
return this._itemIdGenerator;
}
set itemIdGenerator(generatorFn) {
this._itemIdGenerator = generatorFn;
}
get itemTemplateSelector() {
return this._itemTemplateSelector;
}
set itemTemplateSelector(value) {
if (typeof value === 'string') {
this._itemTemplateSelectorBindable.bind({
sourceProperty: null,
targetProperty: 'templateKey',
expression: value
});
this._itemTemplateSelector = (item, index, items) => {
item['$index'] = index;
if (this._itemTemplateSelectorBindable.bindingContext === item) {
this._itemTemplateSelectorBindable.bindingContext = null;
}
this._itemTemplateSelectorBindable.bindingContext = item;
return this._itemTemplateSelectorBindable.get('templateKey');
};
}
else if (typeof value === 'function') {
this._itemTemplateSelector = value;
}
}
onItemViewLoaderChanged() { }
get itemViewLoader() {
return this._itemViewLoader;
}
set itemViewLoader(value) {
if (this._itemViewLoader !== value) {
this._itemViewLoader = value;
this.onItemViewLoaderChanged();
}
}
_getItemTemplateKey(index) {
let templateKey = 'default';
if (this.itemTemplateSelector) {
const dataItem = this._getDataItem(index);
templateKey = this._itemTemplateSelector(dataItem, index, this.items);
}
return templateKey;
}
_getItemTemplate(index) {
const templateKey = this._getItemTemplateKey(index);
const length = this._itemTemplatesInternal.length;
for (let i = 0; i < length; i++) {
if (this._itemTemplatesInternal[i].key === templateKey) {
return this._itemTemplatesInternal[i];
}
}
// This is the default template
return this._itemTemplatesInternal[0];
}
_prepareItem(item, index) {
if (this.items && item) {
item.bindingContext = this._getDataItem(index);
}
}
_getDataItem(index) {
const thisItems = this.items;
if (thisItems) {
return thisItems && thisItems.getItem ? thisItems.getItem(index) : thisItems[index];
}
}
_getDefaultItemContent(index) {
const lbl = new Label();
lbl.bind({
targetProperty: 'text',
sourceProperty: '$value'
});
return lbl;
}
onLayout(left, top, right, bottom) {
super.onLayout(left, top, right, bottom);
this._effectiveItemWidth = this.getMeasuredWidth() - this.effectivePaddingLeft - this.effectivePaddingRight;
this._effectiveItemHeight = this.getMeasuredHeight() - this.effectivePaddingTop - this.effectivePaddingBottom;
}
convertToSize(length) {
let size = 0;
if (this.orientation === 'horizontal') {
size = __IOS__ ? Utils.layout.getMeasureSpecSize(this._currentWidthMeasureSpec) : this.getMeasuredWidth();
}
else {
size = __IOS__ ? Utils.layout.getMeasureSpecSize(this._currentHeightMeasureSpec) : this.getMeasuredHeight();
}
let converted = 0;
if (length && length.unit === 'px') {
converted = length.value;
}
else if (length && length.unit === 'dip') {
converted = Utils.layout.toDevicePixels(length.value);
}
else if (length && length.unit === '%') {
converted = size * length.value;
}
else if (typeof length === 'string') {
if (length.indexOf('px') > -1) {
converted = parseFloat(length.replace('px', ''));
}
else if (length.indexOf('dip') > -1) {
converted = Utils.layout.toDevicePixels(parseInt(length.replace('dip', ''), 10));
}
else if (length.indexOf('%') > -1) {
converted = size * (parseFloat(length.replace('%', '')) / 100);
}
else {
converted = Utils.layout.toDevicePixels(parseFloat(length));
}
}
else if (typeof length === 'number') {
converted = Utils.layout.toDevicePixels(length);
}
if (isNaN(converted)) {
return 0;
}
return converted;
}
};
PagerBase.mRegisteredTransformers = {};
// This one works along with existing NS property change event system
PagerBase.selectedIndexChangeEvent = 'selectedIndexChange';
PagerBase.scrollEvent = 'scroll';
PagerBase.swipeEvent = 'swipe';
PagerBase.swipeStartEvent = 'swipeStart';
PagerBase.swipeOverEvent = 'swipeOver';
PagerBase.swipeEndEvent = 'swipeEnd';
PagerBase.loadMoreItemsEvent = 'loadMoreItems';
PagerBase.itemLoadingEvent = 'itemLoading';
PagerBase.itemDisposingEvent = 'itemDisposing';
PagerBase.knownFunctions = ['itemTemplateSelector', 'itemIdGenerator']; // See component-builder.ts isKnownFunction
PagerBase = PagerBase_1 = __decorate([
CSSType('Pager')
], PagerBase);
export { PagerBase };
export class PagerItem extends GridLayout {
}
// function onItemsChanged(pager: PagerBase, oldValue, newValue) {
// if (oldValue instanceof Observable) {
// removeWeakEventListener(oldValue, ObservableArray.changeEvent, pager.refresh, pager);
// }
// if (newValue instanceof Observable && !(newValue instanceof ObservableArray)) {
// addWeakEventListener(newValue, ObservableArray.changeEvent, pager.refresh, pager);
// }
// // pager.refresh();
// }
function onItemTemplateChanged(pager, oldValue, newValue) {
pager.itemTemplateUpdated(oldValue, newValue);
}
export const circularModeProperty = new Property({
name: 'circularMode',
defaultValue: false,
valueConverter: booleanConverter
});
circularModeProperty.register(PagerBase);
export const selectedIndexProperty = new CoercibleProperty({
name: 'selectedIndex',
defaultValue: -1,
// affectsLayout: __IOS__,
coerceValue: (target, value) => {
const items = target._childrenCount;
if (items) {
const max = items - 1;
if (value < 0) {
value = 0;
}
if (value > max) {
value = max;
}
}
else {
value = -1;
}
return value;
},
valueConverter: (v) => parseInt(v, 10)
});
selectedIndexProperty.register(PagerBase);
export const spacingProperty = new Property({
name: 'spacing',
defaultValue: { value: 0, unit: 'dip' },
affectsLayout: true
});
spacingProperty.register(PagerBase);
export const peakingProperty = new Property({
name: 'peaking',
defaultValue: { value: 0, unit: 'dip' },
affectsLayout: true
});
peakingProperty.register(PagerBase);
export const itemsProperty = new Property({
name: 'items',
affectsLayout: true
// valueChanged: onItemsChanged
});
itemsProperty.register(PagerBase);
export const itemTemplateProperty = new Property({
name: 'itemTemplate',
affectsLayout: true,
valueChanged: (target) => {
target.refresh();
}
});
itemTemplateProperty.register(PagerBase);
export const itemTemplatesProperty = new Property({
name: 'itemTemplates',
affectsLayout: true,
valueConverter: (value) => {
if (typeof value === 'string') {
return Builder.parseMultipleTemplates(value);
}
return value;
}
});
itemTemplatesProperty.register(PagerBase);
export const canGoRightProperty = new Property({
name: 'canGoRight',
defaultValue: false,
valueConverter: booleanConverter
});
canGoRightProperty.register(PagerBase);
export const canGoLeftProperty = new Property({
name: 'canGoLeft',
defaultValue: false,
valueConverter: booleanConverter
});
canGoLeftProperty.register(PagerBase);
const converter = makeParser(makeValidator('horizontal', 'vertical'));
export const orientationProperty = new Property({
name: 'orientation',
defaultValue: 'horizontal',
affectsLayout: true,
valueChanged: (target, oldValue, newValue) => {
target.refresh();
},
valueConverter: converter
});
orientationProperty.register(PagerBase);
export const disableSwipeProperty = new Property({
name: 'disableSwipe',
defaultValue: false,
valueConverter: booleanConverter
});
disableSwipeProperty.register(PagerBase);
export const perPageProperty = new Property({
name: 'perPage',
defaultValue: 1,
valueConverter: (value) => Number(value)
});
perPageProperty.register(PagerBase);
export const transformersProperty = new Property({
name: 'transformers'
});
transformersProperty.register(PagerBase);
export const showIndicatorProperty = new Property({
name: 'showIndicator',
defaultValue: false,
valueConverter: booleanConverter
});
showIndicatorProperty.register(PagerBase);
export const autoPlayProperty = new Property({
name: 'autoPlay',
defaultValue: false,
valueConverter: booleanConverter
});
autoPlayProperty.register(PagerBase);
export const autoplayDelayProperty = new Property({
name: 'autoPlayDelay',
defaultValue: 3000
});
autoplayDelayProperty.register(PagerBase);
//# sourceMappingURL=index.common.js.map