fix(reorder): reorder can be used with any element

This commit is contained in:
Manu Mtz.-Almeida
2016-06-29 23:52:50 +02:00
parent 5119b57496
commit d993a1bfd8
7 changed files with 70 additions and 39 deletions

View File

@ -114,13 +114,13 @@ class ApiDemoPage {
} }
download(item: ItemSliding) { download(item: ItemSliding) {
item.setClass('downloading', true); item.setCssClass('downloading', true);
setTimeout(() => { setTimeout(() => {
const toast = this.toastCtrl.create({ const toast = this.toastCtrl.create({
message: 'Item was downloaded!' message: 'Item was downloaded!'
}); });
toast.present(); toast.present();
item.setClass('downloading', false); item.setCssClass('downloading', false);
item.close(); item.close();
// Wait 2s to close toast // Wait 2s to close toast

View File

@ -93,7 +93,7 @@
#download-spinner { #download-spinner {
display: none; display: none;
} }
div.toolbar-background { div.toolbar-background {
background-color: rgba(255, 255, 255, 0.65); background-color: rgba(255, 255, 255, 0.65);
-webkit-backdrop-filter: saturate(180%) blur(20px); -webkit-backdrop-filter: saturate(180%) blur(20px);

View File

@ -1,7 +1,7 @@
import {Item} from './item'; import { Item } from './item';
import {ItemReorder} from '../item/item-reorder'; import { ItemReorder, indexForItem, findReorderItem } from '../item/item-reorder';
import {UIEventManager} from '../../util/ui-event-manager'; import { UIEventManager } from '../../util/ui-event-manager';
import {closest, Coordinates, pointerCoord, CSS, nativeRaf} from '../../util/dom'; import { closest, Coordinates, pointerCoord, CSS, nativeRaf } from '../../util/dom';
const AUTO_SCROLL_MARGIN = 60; const AUTO_SCROLL_MARGIN = 60;
@ -39,9 +39,16 @@ export class ItemReorderGesture {
return false; return false;
} }
let item = reorderElement['$ionReorderNode']; let reorderMark = reorderElement['$ionComponent'];
if (!reorderMark) {
console.error('ion-reorder does not contain $ionComponent');
return false;
}
this.list.reorderPrepare();
let item = reorderMark.getReorderNode();
if (!item) { if (!item) {
console.error('item does not contain ion ionReorderNode'); console.error('reorder node not found');
return false; return false;
} }
ev.preventDefault(); ev.preventDefault();
@ -49,7 +56,8 @@ export class ItemReorderGesture {
// Preparing state // Preparing state
this.selectedItemEle = item; this.selectedItemEle = item;
this.selectedItemHeight = item.offsetHeight; this.selectedItemHeight = item.offsetHeight;
this.lastYcoord = this.lastToIndex = -100; this.lastYcoord = -100;
this.lastToIndex = indexForItem(item);
this.windowHeight = window.innerHeight - AUTO_SCROLL_MARGIN; this.windowHeight = window.innerHeight - AUTO_SCROLL_MARGIN;
this.lastScrollPosition = this.list.scrollContent(0); this.lastScrollPosition = this.list.scrollContent(0);
@ -81,7 +89,7 @@ export class ItemReorderGesture {
let overItem = this.itemForCoord(coord); let overItem = this.itemForCoord(coord);
if (overItem) { if (overItem) {
let toIndex = indexForItem(overItem); let toIndex = indexForItem(overItem);
if (toIndex && (toIndex !== this.lastToIndex || this.emptyZone)) { if (toIndex !== undefined && (toIndex !== this.lastToIndex || this.emptyZone)) {
let fromIndex = indexForItem(this.selectedItemEle); let fromIndex = indexForItem(this.selectedItemEle);
this.lastToIndex = toIndex; this.lastToIndex = toIndex;
this.lastYcoord = posY; this.lastYcoord = posY;
@ -142,16 +150,5 @@ function itemForPosition(x: number, y: number): HTMLElement {
if (element.nodeName !== 'ION-ITEM' && !element.hasAttribute('ion-item')) { if (element.nodeName !== 'ION-ITEM' && !element.hasAttribute('ion-item')) {
return null; return null;
} }
if (indexForItem(element)) { return findReorderItem(element);
return element;
}
let parent = element.parentNode;
if (indexForItem(parent)) {
return <HTMLElement>parent;
}
return null;
}
function indexForItem(element: any): number {
return element['$ionIndex'];
} }

View File

@ -36,7 +36,7 @@ ion-reorder {
} }
} }
.reorder-active { .reorder-list-active {
.item-inner { .item-inner {
pointer-events: none; pointer-events: none;
} }
@ -44,7 +44,8 @@ ion-reorder {
.item-wrapper.reorder-active, .item-wrapper.reorder-active,
.item.reorder-active { .item.reorder-active,
.reorder-active {
z-index: 4; z-index: 4;
box-shadow: 0 0 10px rgba(0, 0, 0, .5); box-shadow: 0 0 10px rgba(0, 0, 0, .5);

View File

@ -125,7 +125,7 @@ export interface ReorderIndexes {
* @see {@link ../Item Item API Docs} * @see {@link ../Item Item API Docs}
*/ */
@Directive({ @Directive({
selector: '[reorder]', selector: 'ion-list[reorder],ion-item-group[reorder]',
host: { host: {
'[class.reorder-enabled]': '_enableReorder', '[class.reorder-enabled]': '_enableReorder',
} }
@ -181,15 +181,21 @@ export class ItemReorder {
/** /**
* @private * @private
*/ */
reorderStart() { reorderPrepare() {
let children = this._element.children; let children = this._element.children;
let len = children.length; let len = children.length;
this.setCssClass('reorder-active', true);
for (let i = 0; i < len; i++) { for (let i = 0; i < len; i++) {
children[i]['$ionIndex'] = i; children[i]['$ionIndex'] = i;
} }
} }
/**
* @private
*/
reorderStart() {
this.setCssClass('reorder-list-active', true);
}
/** /**
* @private * @private
*/ */
@ -223,7 +229,7 @@ export class ItemReorder {
let children = this._element.children; let children = this._element.children;
let len = children.length; let len = children.length;
this.setCssClass('reorder-active', false); this.setCssClass('reorder-list-active', false);
let transform = CSS.transform; let transform = CSS.transform;
for (let i = 0; i < len; i++) { for (let i = 0; i < len; i++) {
(<any>children[i]).style[transform] = ''; (<any>children[i]).style[transform] = '';
@ -294,16 +300,35 @@ export class Reorder {
constructor( constructor(
@Inject(forwardRef(() => Item)) private item: Item, @Inject(forwardRef(() => Item)) private item: Item,
private elementRef: ElementRef) { private elementRef: ElementRef) {
elementRef.nativeElement['$ionComponent'] = this;
} }
ngAfterContentInit() { getReorderNode() {
let item = this.item.getNativeElement(); let node = <any>this.item.getNativeElement();
if (item.parentNode.nodeName === 'ION-ITEM-SLIDING') { return findReorderItem(node);
this.elementRef.nativeElement['$ionReorderNode'] = item.parentNode;
} else {
this.elementRef.nativeElement['$ionReorderNode'] = item;
}
} }
} }
/**
* @private
*/
export function findReorderItem(node: any): HTMLElement {
let nested = 0;
while (node && nested < 4) {
if (indexForItem(node) !== undefined ) {
return node;
}
node = node.parentNode;
nested++;
}
return null;
}
/**
* @private
*/
export function indexForItem(element: any): number {
return element['$ionIndex'];
}

View File

@ -25,4 +25,12 @@ class E2EPage {
} }
} }
ionicBootstrap(E2EPage);
@Component({
template: '<ion-nav [root]="root"></ion-nav>'
})
class E2EApp {
root = E2EPage;
}
ionicBootstrap(E2EApp);

View File

@ -14,7 +14,7 @@
<ion-list [reorder]="isReordering" (ionItemReorder)="reorder($event)"> <ion-list [reorder]="isReordering" (ionItemReorder)="reorder($event)">
<ion-item *ngFor="let item of items" <ion-item *ngFor="let item of items"
[style.background]="'rgb('+(255-item*4)+','+(255-item*4)+','+(255-item*4)+')'" [style.background]="'rgb('+(255-item*4)+','+(255-item*4)+','+(255-item*4)+')'"
[style.height]="item*2+35+'px'"> [style.min-height]="item*2+35+'px'">
{{item}} {{item}}
</ion-item> </ion-item>
</ion-list> </ion-list>