Research
Security News
Threat Actor Exposes Playbook for Exploiting npm to Build Blockchain-Powered Botnets
A threat actor's playbook for exploiting the npm ecosystem was exposed on the dark web, detailing how to build a blockchain-powered botnet.
ap-angular-sortablejs
Advanced tools
This package is an Angular 2 binding for Sortable.js. Supports standard arrays and Angular FormArray
.
npm install --save angular-sortablejs
There is nothing to configure additionally. Enjoy!
Adapt your systemjs.config.js
(or another place where you configure SystemJS) file with the following:
...
var map = {
...
'angular-sortablejs': 'node_modules/angular-sortablejs/dist/',
'sortablejs': 'node_modules/sortablejs/Sortable.js',
...
};
...
var packages = {
...
'angular-sortablejs': { main: 'index.js', defaultExtension: 'js' },
...
};
...
var config = {
map: map,
packages: packages
};
System.config(config);
This is important to let SystemJS know everything it needs about the dependencies it needs to load.
First, import SortablejsModule
into the angular module where you want to use it:
imports: [
...
SortablejsModule,
...
]
Then use sortablejs
property on a container HTML element to tell Angular that this is a sortable container; also pass the items
array to both *ngFor
and [sortablejs]
to register the changes automatically.
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
template: `
<h2>Drag / drop the item</h2>
<div [sortablejs]="items">
<div *ngFor="let item of items">{{ item }}</div>
</div>
<hr>
<h2>See the result</h2>
<div>
<div *ngFor="let item of items">{{ item }}</div>
</div>
`
})
export class AppComponent {
items = [1, 2, 3, 4, 5];
}
Pass the options with sortablejsOptions
property.
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
template: `
<h2>Drag / drop the item</h2>
<div [sortablejs]="items" [sortablejsOptions]="{ animation: 150 }">
<div *ngFor="let item of items">{{ item }}</div>
</div>
<hr>
<h2>See the result</h2>
<div>
<div *ngFor="let item of items">{{ item }}</div>
</div>
`
})
export class AppComponent {
items = [1, 2, 3, 4, 5];
}
You can pass a new options object at anytime via the [sortablejsOptions]
binding and the Angular's change detection will check for the changes from the previous options and will call the low level option setter from Sortable.js to set the new option values.
Note: It will only detect changes when a brand new options object is passed, not deep changes.
The only thing which should be done is assigning the group
option to the both list. Everything else is handled automatically.
import { Component } from '@angular/core';
import { SortablejsOptions } from 'angular-sortablejs';
@Component({
selector: 'my-app',
template: `
<h2>Drag / drop the item</h2>
<h3>list 1</h3>
<div class="items1" [sortablejs]="items1" [sortablejsOptions]="options">
<div *ngFor="let item of items1">{{ item }}</div>
</div>
<h3>list 2</h3>
<div class="items2" [sortablejs]="items2" [sortablejsOptions]="options">
<div *ngFor="let item of items2">{{ item }}</div>
</div>
<hr>
<h2>See the result</h2>
<div>
<h3>list 1</h3>
<div *ngFor="let item of items1">{{ item }}</div>
<h3>list 2</h3>
<div *ngFor="let item of items2">{{ item }}</div>
</div>
`
})
export class AppComponent {
items1 = [1, 2, 3, 4, 5];
items2 = ['a', 'b', 'c', 'd', 'e'];
options: SortablejsOptions = {
group: 'test'
};
}
By default, the boolean parameter runInsideAngular is set to false. This means that the initial binding of all mouse events of the component will be set so that they will not trigger Angular's change detection.
If this parameter is set to true, then for large components - with a lot of data bindings - the UI will function in a staggered and lagging way (mainly when dragging items), while every event will trigger the change detection (which might be needed in some special edge cases).
If you want to use the same sortable options across different places of your application you might want to set up global configuration. Add the following to your main module to enable e.g. animation: 150
everywhere:
imports: [
...
// any properties and events available on original library work here as well
SortablejsModule.forRoot({
animation: 150
}),
...
]
This value will be used as a default one, but it can be overwritten by a local sortablejsOptions
property.
The model is automatically updated because you pass the items
as <div [sortablejs]="items">
. The items
variable can be either an ordinary JavaScript array or a reactive forms FormArray
.
If you won't pass anything, e.g. <div sortablejs>
, the items won't be automatically updated, thus you should take care of updating the array on your own using standard Sortable.js
events.
Original events onAdd
, onRemove
, onUpdate
are intercepted by the library in order to reflect the sortable changes into the data. If you will add your own event handlers (inside of the options object) they will be called right after the data binding is done. If you don't pass the data, e.g. <div sortablejs>
the data binding is skipped and only your event handlers will be fired.
FAQs
SortableJS for Angular 2+
We found that ap-angular-sortablejs demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Security News
A threat actor's playbook for exploiting the npm ecosystem was exposed on the dark web, detailing how to build a blockchain-powered botnet.
Security News
NVD’s backlog surpasses 20,000 CVEs as analysis slows and NIST announces new system updates to address ongoing delays.
Security News
Research
A malicious npm package disguised as a WhatsApp client is exploiting authentication flows with a remote kill switch to exfiltrate data and destroy files.