UNPKG

ngx-bootstrap

Version:
361 lines (353 loc) 16.7 kB
import { Injectable, EventEmitter, Component, forwardRef, Input, Output, NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { Subject } from 'rxjs'; import * as ɵngcc0 from '@angular/core'; import * as ɵngcc1 from '@angular/common'; function SortableComponent_div_1_Template(rf, ctx) { if (rf & 1) { const _r5 = ɵngcc0.ɵɵgetCurrentView(); ɵngcc0.ɵɵelementStart(0, "div", 4); ɵngcc0.ɵɵlistener("dragover", function SortableComponent_div_1_Template_div_dragover_0_listener($event) { ɵngcc0.ɵɵrestoreView(_r5); const ctx_r4 = ɵngcc0.ɵɵnextContext(); return ctx_r4.onItemDragover($event, 0); })("dragenter", function SortableComponent_div_1_Template_div_dragenter_0_listener($event) { ɵngcc0.ɵɵrestoreView(_r5); const ctx_r6 = ɵngcc0.ɵɵnextContext(); return ctx_r6.cancelEvent($event); }); ɵngcc0.ɵɵtext(1); ɵngcc0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r0 = ɵngcc0.ɵɵnextContext(); ɵngcc0.ɵɵproperty("ngClass", ctx_r0.placeholderClass)("ngStyle", ctx_r0.placeholderStyle); ɵngcc0.ɵɵadvance(1); ɵngcc0.ɵɵtextInterpolate(ctx_r0.placeholderItem); } } function SortableComponent_div_2_ng_template_1_Template(rf, ctx) { } const _c0 = function (a0, a1) { return [a0, a1]; }; const _c1 = function (a0, a1) { return { item: a0, index: a1 }; }; function SortableComponent_div_2_Template(rf, ctx) { if (rf & 1) { const _r11 = ɵngcc0.ɵɵgetCurrentView(); ɵngcc0.ɵɵelementStart(0, "div", 5); ɵngcc0.ɵɵlistener("dragstart", function SortableComponent_div_2_Template_div_dragstart_0_listener($event) { ɵngcc0.ɵɵrestoreView(_r11); const item_r7 = ctx.$implicit; const i_r8 = ctx.index; const ctx_r10 = ɵngcc0.ɵɵnextContext(); return ctx_r10.onItemDragstart($event, item_r7, i_r8); })("dragend", function SortableComponent_div_2_Template_div_dragend_0_listener($event) { ɵngcc0.ɵɵrestoreView(_r11); const ctx_r12 = ɵngcc0.ɵɵnextContext(); return ctx_r12.resetActiveItem($event); })("dragover", function SortableComponent_div_2_Template_div_dragover_0_listener($event) { ɵngcc0.ɵɵrestoreView(_r11); const i_r8 = ctx.index; const ctx_r13 = ɵngcc0.ɵɵnextContext(); return ctx_r13.onItemDragover($event, i_r8); })("dragenter", function SortableComponent_div_2_Template_div_dragenter_0_listener($event) { ɵngcc0.ɵɵrestoreView(_r11); const ctx_r14 = ɵngcc0.ɵɵnextContext(); return ctx_r14.cancelEvent($event); }); ɵngcc0.ɵɵtemplate(1, SortableComponent_div_2_ng_template_1_Template, 0, 0, "ng-template", 6); ɵngcc0.ɵɵelementEnd(); } if (rf & 2) { const item_r7 = ctx.$implicit; const i_r8 = ctx.index; const ctx_r1 = ɵngcc0.ɵɵnextContext(); const _r2 = ɵngcc0.ɵɵreference(4); ɵngcc0.ɵɵproperty("ngClass", ɵngcc0.ɵɵpureFunction2(5, _c0, ctx_r1.itemClass, i_r8 === ctx_r1.activeItem ? ctx_r1.itemActiveClass : ""))("ngStyle", ctx_r1.getItemStyle(i_r8 === ctx_r1.activeItem)); ɵngcc0.ɵɵattribute("aria-grabbed", i_r8 === ctx_r1.activeItem); ɵngcc0.ɵɵadvance(1); ɵngcc0.ɵɵproperty("ngTemplateOutlet", ctx_r1.itemTemplate || _r2)("ngTemplateOutletContext", ɵngcc0.ɵɵpureFunction2(8, _c1, item_r7, i_r8)); } } function SortableComponent_ng_template_3_Template(rf, ctx) { if (rf & 1) { ɵngcc0.ɵɵtext(0); } if (rf & 2) { const item_r15 = ctx.item; ɵngcc0.ɵɵtextInterpolate(item_r15.value); } } class DraggableItemService { constructor() { this.onCapture = new Subject(); } dragStart(item) { this.draggableItem = item; } getItem() { return this.draggableItem; } captureItem(overZoneIndex, newIndex) { if (this.draggableItem && this.draggableItem.overZoneIndex !== overZoneIndex) { this.draggableItem.lastZoneIndex = this.draggableItem.overZoneIndex; this.draggableItem.overZoneIndex = overZoneIndex; this.onCapture.next(this.draggableItem); this.draggableItem = Object.assign({}, this.draggableItem, { overZoneIndex, i: newIndex }); } return this.draggableItem; } onCaptureItem() { return this.onCapture; } } DraggableItemService.ɵfac = function DraggableItemService_Factory(t) { return new (t || DraggableItemService)(); }; DraggableItemService.ɵprov = ɵngcc0.ɵɵdefineInjectable({ token: DraggableItemService, factory: DraggableItemService.ɵfac }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(DraggableItemService, [{ type: Injectable }], function () { return []; }, null); })(); class SortableComponent { constructor(transfer) { /** class name for items wrapper */ this.wrapperClass = ''; /** style object for items wrapper */ this.wrapperStyle = {}; /** class name for item */ this.itemClass = ''; /** style object for item */ this.itemStyle = {}; /** class name for active item */ this.itemActiveClass = ''; /** style object for active item */ this.itemActiveStyle = {}; /** class name for placeholder */ this.placeholderClass = ''; /** style object for placeholder */ this.placeholderStyle = {}; /** placeholder item which will be shown if collection is empty */ this.placeholderItem = ''; /** fired on array change (reordering, insert, remove), same as <code>ngModelChange</code>. * Returns new items collection as a payload. */ this.onChange = new EventEmitter(); this.showPlaceholder = false; this.activeItem = -1; // eslint-disable-next-line @typescript-eslint/no-explicit-any this.onTouched = Function.prototype; // eslint-disable-next-line @typescript-eslint/no-explicit-any this.onChanged = Function.prototype; this._items = []; this.transfer = transfer; this.currentZoneIndex = SortableComponent.globalZoneIndex++; this.transfer .onCaptureItem() .subscribe((item) => this.onDrop(item)); } get items() { return this._items; } set items(value) { this._items = value; const out = this.items.map((x) => x.initData); this.onChanged(out); this.onChange.emit(out); } onItemDragstart(event, item, i) { this.initDragstartEvent(event); this.onTouched(); this.transfer.dragStart({ event, item, i, initialIndex: i, lastZoneIndex: this.currentZoneIndex, overZoneIndex: this.currentZoneIndex }); } onItemDragover(event, i) { if (!this.transfer.getItem()) { return; } event.preventDefault(); const dragItem = this.transfer.captureItem(this.currentZoneIndex, this.items.length); // eslint-disable-next-line @typescript-eslint/no-explicit-any let newArray = []; if (!dragItem) { return; } if (!this.items.length) { newArray = [dragItem.item]; } else if (dragItem.i > i) { newArray = [ ...this.items.slice(0, i), dragItem.item, ...this.items.slice(i, dragItem.i), ...this.items.slice(dragItem.i + 1) ]; } else { // this.draggedItem.i < i newArray = [ ...this.items.slice(0, dragItem.i), ...this.items.slice(dragItem.i + 1, i + 1), dragItem.item, ...this.items.slice(i + 1) ]; } this.items = newArray; dragItem.i = i; this.activeItem = i; this.updatePlaceholderState(); } cancelEvent(event) { if (!this.transfer.getItem() || !event) { return; } event.preventDefault(); } onDrop(item) { if (item && item.overZoneIndex !== this.currentZoneIndex && item.lastZoneIndex === this.currentZoneIndex) { this.items = this.items.filter((x, i) => i !== item.i); this.updatePlaceholderState(); } this.resetActiveItem(); } resetActiveItem(event) { this.cancelEvent(event); this.activeItem = -1; } registerOnChange(callback) { this.onChanged = callback; } registerOnTouched(callback) { this.onTouched = callback; } // eslint-disable-next-line @typescript-eslint/no-explicit-any writeValue(value) { if (value) { // eslint-disable-next-line @typescript-eslint/no-explicit-any this.items = value.map((x, i) => ({ id: i, initData: x, value: this.fieldName ? x[this.fieldName] : x })); } else { this.items = []; } this.updatePlaceholderState(); } updatePlaceholderState() { this.showPlaceholder = !this._items.length; } getItemStyle(isActive) { return isActive ? Object.assign({}, this.itemStyle, this.itemActiveStyle) : this.itemStyle; } initDragstartEvent(event) { var _a; // it is necessary for mozilla // data type should be 'Text' instead of 'text/plain' to keep compatibility // with IE (_a = event.dataTransfer) === null || _a === void 0 ? void 0 : _a.setData('Text', 'placeholder'); } } SortableComponent.ɵfac = function SortableComponent_Factory(t) { return new (t || SortableComponent)(ɵngcc0.ɵɵdirectiveInject(DraggableItemService)); }; SortableComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: SortableComponent, selectors: [["bs-sortable"]], inputs: { wrapperClass: "wrapperClass", wrapperStyle: "wrapperStyle", itemClass: "itemClass", itemStyle: "itemStyle", itemActiveClass: "itemActiveClass", itemActiveStyle: "itemActiveStyle", placeholderClass: "placeholderClass", placeholderStyle: "placeholderStyle", placeholderItem: "placeholderItem", fieldName: "fieldName", itemTemplate: "itemTemplate" }, outputs: { onChange: "onChange" }, exportAs: ["bs-sortable"], features: [ɵngcc0.ɵɵProvidersFeature([ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => SortableComponent), multi: true } ])], decls: 5, vars: 4, consts: [[3, "ngClass", "ngStyle", "dragover", "dragenter", "drop", "mouseleave"], [3, "ngClass", "ngStyle", "dragover", "dragenter", 4, "ngIf"], ["draggable", "true", "aria-dropeffect", "move", 3, "ngClass", "ngStyle", "dragstart", "dragend", "dragover", "dragenter", 4, "ngFor", "ngForOf"], ["defItemTemplate", ""], [3, "ngClass", "ngStyle", "dragover", "dragenter"], ["draggable", "true", "aria-dropeffect", "move", 3, "ngClass", "ngStyle", "dragstart", "dragend", "dragover", "dragenter"], [3, "ngTemplateOutlet", "ngTemplateOutletContext"]], template: function SortableComponent_Template(rf, ctx) { if (rf & 1) { ɵngcc0.ɵɵelementStart(0, "div", 0); ɵngcc0.ɵɵlistener("dragover", function SortableComponent_Template_div_dragover_0_listener($event) { return ctx.cancelEvent($event); })("dragenter", function SortableComponent_Template_div_dragenter_0_listener($event) { return ctx.cancelEvent($event); })("drop", function SortableComponent_Template_div_drop_0_listener($event) { return ctx.resetActiveItem($event); })("mouseleave", function SortableComponent_Template_div_mouseleave_0_listener($event) { return ctx.resetActiveItem($event); }); ɵngcc0.ɵɵtemplate(1, SortableComponent_div_1_Template, 2, 3, "div", 1); ɵngcc0.ɵɵtemplate(2, SortableComponent_div_2_Template, 2, 11, "div", 2); ɵngcc0.ɵɵelementEnd(); ɵngcc0.ɵɵtemplate(3, SortableComponent_ng_template_3_Template, 1, 1, "ng-template", null, 3, ɵngcc0.ɵɵtemplateRefExtractor); } if (rf & 2) { ɵngcc0.ɵɵproperty("ngClass", ctx.wrapperClass)("ngStyle", ctx.wrapperStyle); ɵngcc0.ɵɵadvance(1); ɵngcc0.ɵɵproperty("ngIf", ctx.showPlaceholder); ɵngcc0.ɵɵadvance(1); ɵngcc0.ɵɵproperty("ngForOf", ctx.items); } }, directives: [ɵngcc1.NgClass, ɵngcc1.NgStyle, ɵngcc1.NgIf, ɵngcc1.NgForOf, ɵngcc1.NgTemplateOutlet], encapsulation: 2 }); SortableComponent.globalZoneIndex = 0; SortableComponent.ctorParameters = () => [ { type: DraggableItemService } ]; SortableComponent.propDecorators = { fieldName: [{ type: Input }], wrapperClass: [{ type: Input }], wrapperStyle: [{ type: Input }], itemClass: [{ type: Input }], itemStyle: [{ type: Input }], itemActiveClass: [{ type: Input }], itemActiveStyle: [{ type: Input }], placeholderClass: [{ type: Input }], placeholderStyle: [{ type: Input }], placeholderItem: [{ type: Input }], itemTemplate: [{ type: Input }], onChange: [{ type: Output }] }; (function () { (typeof ngDevMode === "undefined" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(SortableComponent, [{ type: Component, args: [{ selector: 'bs-sortable', exportAs: 'bs-sortable', template: ` <div [ngClass]="wrapperClass" [ngStyle]="wrapperStyle" (dragover)="cancelEvent($event)" (dragenter)="cancelEvent($event)" (drop)="resetActiveItem($event)" (mouseleave)="resetActiveItem($event)"> <div *ngIf="showPlaceholder" [ngClass]="placeholderClass" [ngStyle]="placeholderStyle" (dragover)="onItemDragover($event, 0)" (dragenter)="cancelEvent($event)" >{{placeholderItem}}</div> <div *ngFor="let item of items; let i=index;" [ngClass]="[ itemClass, i === activeItem ? itemActiveClass : '' ]" [ngStyle]="getItemStyle(i === activeItem)" draggable="true" (dragstart)="onItemDragstart($event, item, i)" (dragend)="resetActiveItem($event)" (dragover)="onItemDragover($event, i)" (dragenter)="cancelEvent($event)" aria-dropeffect="move" [attr.aria-grabbed]="i === activeItem" ><ng-template [ngTemplateOutlet]="itemTemplate || defItemTemplate" [ngTemplateOutletContext]="{item:item, index: i}"></ng-template></div> </div> <ng-template #defItemTemplate let-item="item">{{item.value}}</ng-template> `, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => SortableComponent), multi: true } ] }] }], function () { return [{ type: DraggableItemService }]; }, { wrapperClass: [{ type: Input }], wrapperStyle: [{ type: Input }], itemClass: [{ type: Input }], itemStyle: [{ type: Input }], itemActiveClass: [{ type: Input }], itemActiveStyle: [{ type: Input }], placeholderClass: [{ type: Input }], placeholderStyle: [{ type: Input }], placeholderItem: [{ type: Input }], onChange: [{ type: Output }], fieldName: [{ type: Input }], itemTemplate: [{ type: Input }] }); })(); class SortableModule { static forRoot() { return { ngModule: SortableModule, providers: [DraggableItemService] }; } } SortableModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: SortableModule }); SortableModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function SortableModule_Factory(t) { return new (t || SortableModule)(); }, imports: [[CommonModule]] }); (function () { (typeof ngJitMode === "undefined" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(SortableModule, { declarations: function () { return [SortableComponent]; }, imports: function () { return [CommonModule]; }, exports: function () { return [SortableComponent]; } }); })(); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(SortableModule, [{ type: NgModule, args: [{ declarations: [SortableComponent], imports: [CommonModule], exports: [SortableComponent] }] }], null, null); })(); /** * Generated bundle index. Do not edit. */ export { DraggableItemService, SortableComponent, SortableModule }; //# sourceMappingURL=ngx-bootstrap-sortable.js.map