mirror of
https://github.com/ionic-team/ionic-framework.git
synced 2025-08-20 12:29:55 +08:00
fix(reorder): reorder can be used with any element
This commit is contained in:
@ -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
|
||||||
|
@ -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);
|
||||||
|
@ -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'];
|
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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'];
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -25,4 +25,12 @@ class E2EPage {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ionicBootstrap(E2EPage);
|
|
||||||
|
@Component({
|
||||||
|
template: '<ion-nav [root]="root"></ion-nav>'
|
||||||
|
})
|
||||||
|
class E2EApp {
|
||||||
|
root = E2EPage;
|
||||||
|
}
|
||||||
|
|
||||||
|
ionicBootstrap(E2EApp);
|
||||||
|
@ -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>
|
||||||
|
Reference in New Issue
Block a user