|
/**
|
|
An item that slides to the left to reveal Delete and Cancel buttons. Pressing the Cancel button will slide the item back into place and generate
|
|
an onCancel event. Pressing the Delete button will immediately position the content back in place and generate an onDelete event.
|
|
|
|
A SwipeableItem contains methods for styling its content and these should be used to effect styling on the row content. Add css classes via
|
|
the contentClasses property and the methods add|remove|has|addRemove<ContentClass>. Alter css styles via the applyContentStyle method.
|
|
|
|
{kind: "onyx.SwipeableItem", onCancel: "canceled", onDelete: "deleted"}
|
|
|
|
*/
|
|
enyo.kind({
|
|
name: "onyx.SwipeableItem",
|
|
kind: "onyx.Item",
|
|
classes: "onyx-swipeable-item",
|
|
published: {
|
|
//* Add custom CSS classes via the contentClasses property to style the SwipeableItem's content
|
|
contentClasses: "",
|
|
//* Set to true to prevent a drag from bubbling beyond the SwipeableItem.
|
|
preventDragPropagation: false
|
|
},
|
|
defaultContentClasses: "onyx-swipeable-item-content",
|
|
handlers: {
|
|
ondown: "down"
|
|
},
|
|
events: {
|
|
/**
|
|
Fires when a SwipeableItem's delete button has been triggered
|
|
This event does not fire when programatically deleting a SwipeableItem instance
|
|
*/
|
|
onDelete: "",
|
|
/**
|
|
Fires when a SwipeableItem's cancel button has been triggered
|
|
This event does not fire when selecting a second SwipeableItem, causing the first to cancel itself programatically
|
|
*/
|
|
onCancel: ""
|
|
},
|
|
components: [
|
|
{name: "client", kind: "Slideable", min: -100, unit: "%", ondragstart: "clientDragStart"},
|
|
{name: "confirm", kind: "onyx.Toolbar", canGenerate: false, classes: "onyx-swipeable-item-confirm enyo-fit", style: "text-align: center;", ontap: "confirmTap", components: [
|
|
{kind: "onyx.Button", content: "Delete", ontap: "deleteTap"},
|
|
{kind: "onyx.Button", content: "Cancel", ontap: "cancelTap"}
|
|
]}
|
|
],
|
|
//* @protected
|
|
swiping: -1,
|
|
create: function() {
|
|
this.inherited(arguments);
|
|
this.contentClassesChanged();
|
|
},
|
|
//* @public
|
|
//* Resets the sliding position of the SwipeableItem currently displaying confirmation options
|
|
reset: function() {
|
|
this.applyStyle("position", null);
|
|
this.$.confirm.setShowing(false);
|
|
// stop animating if we reset.
|
|
this.$.client.getAnimator().stop();
|
|
this.$.client.setValue(0);
|
|
},
|
|
//* @protected
|
|
contentClassesChanged: function() {
|
|
this.$.client.setClasses(this.defaultContentClasses + " " + this.contentClasses);
|
|
},
|
|
//* @public
|
|
//* Applies a single style value to the SwipeableItem
|
|
applyContentStyle: function(inStyle, inValue) {
|
|
this.$.client.applyStyle(inStyle, inValue);
|
|
},
|
|
//* Applies a CSS class to the SwipeableItem's contentClasses
|
|
addContentClass: function(inClass) {
|
|
this.$.client.addClass(inClass);
|
|
},
|
|
//* Removes a CSS class to the SwipeableItem's contentClasses
|
|
removeContentClass: function(inClass) {
|
|
this.$.client.removeClass(inClass);
|
|
},
|
|
//* Returns true if the _class_ attribute contains a substring matching _inClass_
|
|
hasContentClass: function(inClass) {
|
|
return this.$.client.hasClass(inClass);
|
|
},
|
|
/**
|
|
Adds or removes substring _inClass_ from the _class_ attribute of this object based
|
|
on the value of _inTrueToAdd_.
|
|
|
|
If _inTrueToAdd_ is truthy, then _inClass_ is added; otherwise, _inClass_ is removed.
|
|
*/
|
|
addRemoveContentClass: function(inClass, inAdd) {
|
|
this.$.client.addRemoveClass(inClass, inAdd);
|
|
},
|
|
//* @protected
|
|
generateHtml: function() {
|
|
this.reset();
|
|
return this.inherited(arguments);
|
|
},
|
|
contentChanged: function() {
|
|
this.$.client.setContent(this.content);
|
|
},
|
|
confirmTap: function() {
|
|
return true;
|
|
},
|
|
deleteTap: function(inSender, inEvent) {
|
|
this.reset();
|
|
this.doDelete();
|
|
return true;
|
|
},
|
|
cancelTap: function(inSender, inEvent) {
|
|
this.$.client.animateToMax();
|
|
this.doCancel();
|
|
return true;
|
|
},
|
|
down: function(inSender, inEvent) {
|
|
// on down, remove swiping state
|
|
var last = this.swiping;
|
|
this.swiping = inEvent.index;
|
|
var flyweight = inEvent.flyweight;
|
|
if (this.swiping != last && last >= 0 && flyweight) {
|
|
flyweight.performOnRow(last, enyo.bind(this, function() {
|
|
this.reset();
|
|
}));
|
|
}
|
|
},
|
|
clientDragStart: function(inSender, inEvent) {
|
|
if (inSender.dragging) {
|
|
var flyweight = inEvent.flyweight;
|
|
if (flyweight) {
|
|
flyweight.prepareRow(inEvent.index);
|
|
// if needed, render confirm.
|
|
// NOTE: position relative so can enyo-fit confirm; apply only when confirm needed
|
|
// because it's a known rendering slowdown.
|
|
this.applyStyle("position", "relative");
|
|
this.$.confirm.setShowing(true);
|
|
if (!this.$.confirm.hasNode()) {
|
|
// NOTE: prepend so Slideable will be on top.
|
|
this.$.confirm.prepend = true;
|
|
this.$.confirm.render();
|
|
this.$.confirm.prepend = false;
|
|
}
|
|
// note: can't teardown.
|
|
}
|
|
}
|
|
return this.preventDragPropagation;
|
|
}
|
|
});
|