Skip to content

Commit ecfe1ba

Browse files
committed
[WIP] Update dummy examples
1 parent c1073ae commit ecfe1ba

File tree

6 files changed

+127
-104
lines changed

6 files changed

+127
-104
lines changed

addon/components/sortable-js.hbs

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@
22
<Element
33
class="ember-sortable-js"
44
{{did-insert this.didInsert}}
5+
{{did-update this.setList @items}}
56
{{did-update this.setOptions @options}}
67
...attributes
78
>
8-
{{yield this.internalList}}
9+
{{yield this.mappedList}}
910
</Element>
1011
{{/let}}

addon/components/sortable-js.js

+18-5
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { inject as service } from '@ember/service';
99

1010
export default class SortableJsComponent extends Component {
1111
@service dragStore;
12+
1213
@tracked list = [];
1314

1415
#sortableContainer = null;
@@ -38,8 +39,12 @@ export default class SortableJsComponent extends Component {
3839
}
3940

4041
get internalList() {
42+
return [...this.list];
43+
}
44+
45+
get mappedList() {
4146
// fix identity diffing
42-
return this.list.map((item, i) => ({ id: i += 1, item }))
47+
return this.internalList.map((item, i) => ({ id: i += 1, value: item }))
4348
}
4449

4550
@action
@@ -62,20 +67,25 @@ export default class SortableJsComponent extends Component {
6267

6368
next(this, () => {
6469
this.#sortableInstance = Sortable.create(element, options);
65-
this.list = [...(this.args.items || [])];
6670
this.setupEventHandlers();
6771
this.setupInternalEventHandlers();
72+
this.setList();
6873
});
6974
}
7075

76+
@action
77+
setList() {
78+
this.list = [...(this.args.items || [])];
79+
}
80+
7181
willDestroy() {
7282
this.#sortableInstance.destroy();
7383
}
7484

7585
onUpdate(evt) {
7686
const {
77-
oldDraggableIndex,
7887
newDraggableIndex,
88+
oldDraggableIndex,
7989
} = evt;
8090

8191
this.list = move(this.list, oldDraggableIndex, newDraggableIndex);
@@ -87,12 +97,15 @@ export default class SortableJsComponent extends Component {
8797
oldDraggableIndex,
8898
} = evt;
8999

90-
this.list = removeFrom(this.list, oldDraggableIndex);
100+
if (evt.pullMode !== 'clone') {
101+
this.list = removeFrom(this.list, oldDraggableIndex);
102+
}
103+
91104
this.args?.onRemove?.(evt);
92105
}
93106

94107
onAdd(evt) {
95-
// evt.item.remove(); // without this DOM is wrong
108+
evt.item.remove(); // without this DOM is wrong
96109
const {
97110
oldDraggableIndex,
98111
newDraggableIndex,

tests/dummy/app/controllers/shared.js

+54-5
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,64 @@
11
import Controller from '@ember/controller';
22
import { tracked } from '@glimmer/tracking';
33

4+
class Employee {
5+
@tracked id;
6+
@tracked name;
7+
@tracked type;
8+
9+
constructor(id, { name, type }) {
10+
this.id = id;
11+
this.name = name;
12+
this.type = type;
13+
}
14+
}
15+
416
export default class SharedController extends Controller {
5-
@tracked listA = [];
17+
@tracked list = [];
18+
@tracked devSort = [1, 2, 3];
19+
@tracked pmSort = [1, 2, 3];
20+
21+
constructor() {
22+
super(...arguments);
23+
setTimeout(() => {
24+
const all = [
25+
{ name: 'Luis', type: 'dev' },
26+
{ name: 'Jaden', type: 'dev' },
27+
{ name: 'Gustavo', type: 'dev' },
28+
{ name: 'Lance', type: 'pm' },
29+
{ name: 'Britni', type: 'pm' },
30+
{ name: 'Kelly', type: 'pm' }
31+
];
32+
this.list = all.map((person, i) => new Employee(i += 1, person));
33+
}, 5000);
34+
}
35+
36+
get devList() {
37+
return this.list.filter(employee => employee.type === 'dev');
38+
}
39+
40+
get sortedDevList() {
41+
return [...this.devList].sort((a, b) => a.id - b.id);
42+
}
43+
44+
get pmList() {
45+
return this.list.filter(employee => employee.type === 'pm');
46+
}
47+
48+
get sortedPmList() {
49+
return [...this.pmList].sort((a, b) => a.id - b.id);
50+
}
51+
52+
onSort(evt) {
53+
console.log('*** Action *** - onSort', evt);
54+
}
655

7-
onAdd() {
8-
console.log('*** Action *** - onAdd');
56+
onAdd(evt) {
57+
console.log('*** Action *** - onAdd', evt);
958
}
1059

11-
onRemove() {
12-
console.log('*** Action *** - onRemove');
60+
onRemove(evt) {
61+
console.log('*** Action *** - onRemove', evt);
1362
}
1463

1564
onEnd(evt) {

tests/dummy/app/templates/clone.hbs

+13-45
Original file line numberDiff line numberDiff line change
@@ -8,71 +8,39 @@
88
<div class="col">
99
<SortableJs
1010
class="list-group"
11+
@items={{array "one-a" "two-a" "three-a" "four-a" "five-a"}}
1112
@options={{hash
1213
animation=150
1314
ghostClass="ghost-class"
1415
group=(hash name="shared" pull="clone")
1516
}}
1617
@onClone={{fn this.onClone}}
18+
as |list|
1719
>
18-
<div data-testid="one" class="list-group-item">Item 1</div>
19-
<div data-testid="two" class="list-group-item">Item 2</div>
20-
<div data-testid="three" class="list-group-item">Item 3</div>
21-
<div data-testid="four" class="list-group-item">Item 4</div>
22-
<div data-testid="five" class="list-group-item">Item 5</div>
20+
{{log 'running a' list}}
21+
{{#each list as |item index| }}
22+
<div data-list-item={{index}} class="list-group-item">{{item.item}}</div>
23+
{{/each}}
2324
</SortableJs>
2425
<br>
2526
<SortableJs
2627
class="list-group"
28+
@items={{array "one-b" "two-b" "three-b" "four-b" "five-b"}}
2729
@options={{hash
2830
animation=150
2931
ghostClass="ghost-class"
3032
group=(hash name="shared" pull="clone")
3133
}}
3234
@onClone={{fn this.onClone}}
35+
as |list|
3336
>
34-
<div data-testid="one" class="list-group-item bg-yellow">Item 1</div>
35-
<div data-testid="two" class="list-group-item bg-yellow">Item 2</div>
36-
<div data-testid="three" class="list-group-item bg-yellow">Item 3</div>
37-
<div data-testid="four" class="list-group-item bg-yellow">Item 4</div>
38-
<div data-testid="five" class="list-group-item bg-yellow">Item 5</div>
37+
{{log 'running b' list}}
38+
{{#each list as |item index| }}
39+
<div data-list-item={{index}} class="list-group-item bg-yellow">{{item.item}}</div>
40+
{{/each}}
3941
</SortableJs>
4042
</div>
4143
<div class="col">
42-
<pre>
43-
<code>
44-
&lt;SortableJs
45-
class="list-group"
46-
@options=&#123;&#123;hash
47-
animation=150
48-
ghostClass="ghost-class"
49-
group=(hash name="shared" pull="clone")
50-
&#125;&#125;
51-
@onRemove=&#123;&#123;fn this.onRemove&#125;&#125;
52-
&gt;
53-
&lt;div class="list-group-item">Item 1&lt;/div&gt;
54-
&lt;div class="list-group-item">Item 2&lt;/div&gt;
55-
&lt;div class="list-group-item">Item 3&lt;/div&gt;
56-
&lt;div class="list-group-item">Item 4&lt;/div&gt;
57-
&lt;div class="list-group-item">Item 5&lt;/div&gt;
58-
&lt;/SortableJs&gt;
59-
60-
&lt;SortableJs
61-
class="list-group"
62-
@options=&#123;&#123;hash
63-
animation=150
64-
ghostClass="ghost-class"
65-
group=(hash name="shared" pull="clone")
66-
&#125;&#125;
67-
@onAdd=&#123;&#123;fn this.onAdd&#125;&#125;
68-
&gt;
69-
&lt;div class="list-group-item">Item 1&lt;/div&gt;
70-
&lt;div class="list-group-item">Item 2&lt;/div&gt;
71-
&lt;div class="list-group-item">Item 3&lt;/div&gt;
72-
&lt;div class="list-group-item">Item 4&lt;/div&gt;
73-
&lt;div class="list-group-item">Item 5&lt;/div&gt;
74-
&lt;/SortableJs&gt;
75-
</code>
76-
</pre>
44+
<div class="clone-gist"></div>
7745
</div>
7846
</div>

tests/dummy/app/templates/disable.hbs

+29-40
Original file line numberDiff line numberDiff line change
@@ -5,54 +5,43 @@
55
</div>
66
</div>
77
<div class="row">
8-
<div class="col">
8+
<div class="col-1">
99
<SortableJs
1010
class="list-group"
11-
@options={{hash animation=150 ghostClass="ghost-class" group="shared" sort=false}}
11+
@items={{array "one-a" "two-a" "three-a" "four-a" "five-a"}}
12+
@options={{hash
13+
animation=150
14+
ghostClass="ghost-class"
15+
group=(hash name="shared" pull="clone")
16+
}}
17+
@onClone={{this.onClone}}
18+
as |list|
1219
>
13-
<div data-testid="one" class="list-group-item">Item 1</div>
14-
<div data-testid="two" class="list-group-item">Item 2</div>
15-
<div data-testid="three" class="list-group-item">Item 3</div>
16-
<div data-testid="four" class="list-group-item">Item 4</div>
17-
<div data-testid="five" class="list-group-item">Item 5</div>
20+
{{#each list as |item index| }}
21+
<div data-list-item={{index}} class="list-group-item">{{item.item}}</div>
22+
{{/each}}
1823
</SortableJs>
24+
</div>
1925
<br>
26+
<div class="col-1">
2027
<SortableJs
2128
class="list-group"
22-
@options={{hash animation=150 ghostClass="ghost-class" group="shared" sort=false}}
29+
@items={{array "one-b" "two-b" "three-b" "four-b" "five-b"}}
30+
@options={{hash
31+
animation=150
32+
ghostClass="ghost-class"
33+
group=(hash name="shared" pull="clone")
34+
}}
35+
@onClone={{this.onClone}}
36+
as |list|
2337
>
24-
<div data-testid="one" class="list-group-item bg-yellow">Item 1</div>
25-
<div data-testid="two" class="list-group-item bg-yellow">Item 2</div>
26-
<div data-testid="three" class="list-group-item bg-yellow">Item 3</div>
27-
<div data-testid="four" class="list-group-item bg-yellow">Item 4</div>
28-
<div data-testid="five" class="list-group-item bg-yellow">Item 5</div>
38+
{{#each list as |item index| }}
39+
<div data-list-item={{index}} class="list-group-item bg-yellow">{{item.item}}</div>
40+
{{/each}}
2941
</SortableJs>
30-
</div>
31-
<div class="col">
32-
<pre>
33-
<code>
34-
&lt;SortableJs
35-
class="list-group"
36-
@options=&#123;&#123;hash animation=150 ghostClass="ghost-class" group="shared" sort=fasle&#125;&#125;
37-
&gt;
38-
&lt;div class="list-group-item">Item 1&lt;/div&gt;
39-
&lt;div class="list-group-item">Item 2&lt;/div&gt;
40-
&lt;div class="list-group-item">Item 3&lt;/div&gt;
41-
&lt;div class="list-group-item">Item 4&lt;/div&gt;
42-
&lt;div class="list-group-item">Item 5&lt;/div&gt;
43-
&lt;/SortableJs&gt;
42+
</div>
43+
</div>
4444

45-
&lt;SortableJs
46-
class="list-group"
47-
@options=&#123;&#123;hash animation=150 ghostClass="ghost-class" group="shared" sort=fasle&#125;&#125;
48-
&gt;
49-
&lt;div class="list-group-item">Item 1&lt;/div&gt;
50-
&lt;div class="list-group-item">Item 2&lt;/div&gt;
51-
&lt;div class="list-group-item">Item 3&lt;/div&gt;
52-
&lt;div class="list-group-item">Item 4&lt;/div&gt;
53-
&lt;div class="list-group-item">Item 5&lt;/div&gt;
54-
&lt;/SortableJs&gt;
55-
</code>
56-
</pre>
57-
</div>
45+
<div class="col">
46+
<div class="delete-gist"></div>
5847
</div>

tests/dummy/app/templates/shared.hbs

+11-8
Original file line numberDiff line numberDiff line change
@@ -8,33 +8,36 @@
88
<div class="col">
99
<SortableJs
1010
class="list-group"
11-
@items={{array "one-a" "two-a" "three-a" "four-a" "five-a"}}
11+
@items={{this.sortedDevList}}
1212
@options={{hash animation=150 ghostClass="ghost-class" group="shared"}}
1313
@onRemove={{this.onRemove}}
1414
@onEnd={{this.onEnd}}
15+
@onSort={{this.onSort}}
1516
as |list|
1617
>
1718
{{log 'running a' list}}
18-
{{#each list as |item index| }}
19-
<div data-list-item={{index}} class="list-group-item">{{item.item}}</div>
19+
{{#each list as |item| }}
20+
<div data-record-id={{item.value.id}} class="list-group-item">{{item.value.name}}</div>
2021
{{/each}}
2122
</SortableJs>
22-
<br>
23+
</div>
24+
<div class="col">
2325
<SortableJs
2426
class="list-group"
25-
@items={{array "one-b" "two-b" "three-b" "four-b" "five-b"}}
27+
@items={{this.sortedPmList}}
2628
@options={{hash animation=150 ghostClass="ghost-class" group="shared"}}
2729
@onAdd={{fn this.onAdd}}
30+
@onEnd={{this.onEnd}}
31+
@onSort={{this.onSort}}
2832
as |list|
2933
>
3034
{{log 'running b' list}}
31-
{{#each list as |item index| }}
32-
<div data-list-item={{index}} class="list-group-item bg-yellow">{{item.item}}</div>
35+
{{#each list as |item| }}
36+
<div data-record-id={{item.value.id}} class="list-group-item bg-yellow">{{item.value.name}}</div>
3337
{{/each}}
3438
</SortableJs>
3539
</div>
3640
<div class="col">
37-
<h1>Code</h1>
3841
<script type="application/javascript" src="https://gist.github.com/lvegerano/b3118b59c5bb32fe928f957444ef6203.js"></script>
3942
</div>
4043
</div>

0 commit comments

Comments
 (0)