Skip to content

Commit d993a1b

Browse files
committed
fix(reorder): reorder can be used with any element
1 parent 5119b57 commit d993a1b

File tree

7 files changed

+69
-38
lines changed

7 files changed

+69
-38
lines changed

demos/item-sliding/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,13 +114,13 @@ class ApiDemoPage {
114114
}
115115

116116
download(item: ItemSliding) {
117-
item.setClass('downloading', true);
117+
item.setCssClass('downloading', true);
118118
setTimeout(() => {
119119
const toast = this.toastCtrl.create({
120120
message: 'Item was downloaded!'
121121
});
122122
toast.present();
123-
item.setClass('downloading', false);
123+
item.setCssClass('downloading', false);
124124
item.close();
125125

126126
// Wait 2s to close toast

demos/item-sliding/main.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ <h2>{{login.name}}</h2>
9393
#download-spinner {
9494
display: none;
9595
}
96-
96+
9797
div.toolbar-background {
9898
background-color: rgba(255, 255, 255, 0.65);
9999
-webkit-backdrop-filter: saturate(180%) blur(20px);

src/components/item/item-reorder-gesture.ts

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import {Item} from './item';
2-
import {ItemReorder} from '../item/item-reorder';
3-
import {UIEventManager} from '../../util/ui-event-manager';
4-
import {closest, Coordinates, pointerCoord, CSS, nativeRaf} from '../../util/dom';
1+
import { Item } from './item';
2+
import { ItemReorder, indexForItem, findReorderItem } from '../item/item-reorder';
3+
import { UIEventManager } from '../../util/ui-event-manager';
4+
import { closest, Coordinates, pointerCoord, CSS, nativeRaf } from '../../util/dom';
55

66

77
const AUTO_SCROLL_MARGIN = 60;
@@ -39,17 +39,25 @@ export class ItemReorderGesture {
3939
return false;
4040
}
4141

42-
let item = reorderElement['$ionReorderNode'];
42+
let reorderMark = reorderElement['$ionComponent'];
43+
if (!reorderMark) {
44+
console.error('ion-reorder does not contain $ionComponent');
45+
return false;
46+
}
47+
this.list.reorderPrepare();
48+
49+
let item = reorderMark.getReorderNode();
4350
if (!item) {
44-
console.error('item does not contain ion ionReorderNode');
51+
console.error('reorder node not found');
4552
return false;
4653
}
4754
ev.preventDefault();
4855

4956
// Preparing state
5057
this.selectedItemEle = item;
5158
this.selectedItemHeight = item.offsetHeight;
52-
this.lastYcoord = this.lastToIndex = -100;
59+
this.lastYcoord = -100;
60+
this.lastToIndex = indexForItem(item);
5361

5462
this.windowHeight = window.innerHeight - AUTO_SCROLL_MARGIN;
5563
this.lastScrollPosition = this.list.scrollContent(0);
@@ -81,7 +89,7 @@ export class ItemReorderGesture {
8189
let overItem = this.itemForCoord(coord);
8290
if (overItem) {
8391
let toIndex = indexForItem(overItem);
84-
if (toIndex && (toIndex !== this.lastToIndex || this.emptyZone)) {
92+
if (toIndex !== undefined && (toIndex !== this.lastToIndex || this.emptyZone)) {
8593
let fromIndex = indexForItem(this.selectedItemEle);
8694
this.lastToIndex = toIndex;
8795
this.lastYcoord = posY;
@@ -142,16 +150,5 @@ function itemForPosition(x: number, y: number): HTMLElement {
142150
if (element.nodeName !== 'ION-ITEM' && !element.hasAttribute('ion-item')) {
143151
return null;
144152
}
145-
if (indexForItem(element)) {
146-
return element;
147-
}
148-
let parent = element.parentNode;
149-
if (indexForItem(parent)) {
150-
return <HTMLElement>parent;
151-
}
152-
return null;
153-
}
154-
155-
function indexForItem(element: any): number {
156-
return element['$ionIndex'];
153+
return findReorderItem(element);
157154
}

src/components/item/item-reorder.scss

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,16 @@ ion-reorder {
3636
}
3737
}
3838

39-
.reorder-active {
39+
.reorder-list-active {
4040
.item-inner {
4141
pointer-events: none;
4242
}
4343
}
4444

4545

4646
.item-wrapper.reorder-active,
47-
.item.reorder-active {
47+
.item.reorder-active,
48+
.reorder-active {
4849
z-index: 4;
4950

5051
box-shadow: 0 0 10px rgba(0, 0, 0, .5);

src/components/item/item-reorder.ts

Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ export interface ReorderIndexes {
125125
* @see {@link ../Item Item API Docs}
126126
*/
127127
@Directive({
128-
selector: '[reorder]',
128+
selector: 'ion-list[reorder],ion-item-group[reorder]',
129129
host: {
130130
'[class.reorder-enabled]': '_enableReorder',
131131
}
@@ -181,15 +181,21 @@ export class ItemReorder {
181181
/**
182182
* @private
183183
*/
184-
reorderStart() {
184+
reorderPrepare() {
185185
let children = this._element.children;
186186
let len = children.length;
187-
this.setCssClass('reorder-active', true);
188187
for (let i = 0; i < len; i++) {
189188
children[i]['$ionIndex'] = i;
190189
}
191190
}
192191

192+
/**
193+
* @private
194+
*/
195+
reorderStart() {
196+
this.setCssClass('reorder-list-active', true);
197+
}
198+
193199
/**
194200
* @private
195201
*/
@@ -223,7 +229,7 @@ export class ItemReorder {
223229
let children = this._element.children;
224230
let len = children.length;
225231

226-
this.setCssClass('reorder-active', false);
232+
this.setCssClass('reorder-list-active', false);
227233
let transform = CSS.transform;
228234
for (let i = 0; i < len; i++) {
229235
(<any>children[i]).style[transform] = '';
@@ -294,16 +300,35 @@ export class Reorder {
294300
constructor(
295301
@Inject(forwardRef(() => Item)) private item: Item,
296302
private elementRef: ElementRef) {
303+
elementRef.nativeElement['$ionComponent'] = this;
297304
}
298305

299-
ngAfterContentInit() {
300-
let item = this.item.getNativeElement();
301-
if (item.parentNode.nodeName === 'ION-ITEM-SLIDING') {
302-
this.elementRef.nativeElement['$ionReorderNode'] = item.parentNode;
303-
} else {
304-
this.elementRef.nativeElement['$ionReorderNode'] = item;
305-
}
306+
getReorderNode() {
307+
let node = <any>this.item.getNativeElement();
308+
return findReorderItem(node);
306309
}
307310

311+
}
312+
313+
/**
314+
* @private
315+
*/
316+
export function findReorderItem(node: any): HTMLElement {
317+
let nested = 0;
318+
while (node && nested < 4) {
319+
if (indexForItem(node) !== undefined ) {
320+
return node;
321+
}
322+
node = node.parentNode;
323+
nested++;
324+
}
325+
return null;
326+
}
308327

328+
/**
329+
* @private
330+
*/
331+
export function indexForItem(element: any): number {
332+
return element['$ionIndex'];
309333
}
334+

src/components/item/test/reorder/index.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,12 @@ class E2EPage {
2525
}
2626
}
2727

28-
ionicBootstrap(E2EPage);
28+
29+
@Component({
30+
template: '<ion-nav [root]="root"></ion-nav>'
31+
})
32+
class E2EApp {
33+
root = E2EPage;
34+
}
35+
36+
ionicBootstrap(E2EApp);

src/components/item/test/reorder/main.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
<ion-list [reorder]="isReordering" (ionItemReorder)="reorder($event)">
1515
<ion-item *ngFor="let item of items"
1616
[style.background]="'rgb('+(255-item*4)+','+(255-item*4)+','+(255-item*4)+')'"
17-
[style.height]="item*2+35+'px'">
17+
[style.min-height]="item*2+35+'px'">
1818
{{item}}
1919
</ion-item>
2020
</ion-list>

0 commit comments

Comments
 (0)