Skip to content

Instantly share code, notes, and snippets.

@lolmaus1
Forked from lolmaus/components.the-item.js
Created November 13, 2017 13:37
Show Gist options
  • Save lolmaus1/412d1a47120385e0ea5645db77e5e033 to your computer and use it in GitHub Desktop.
Save lolmaus1/412d1a47120385e0ea5645db77e5e033 to your computer and use it in GitHub Desktop.
ember-drag-sort updating attribute on parent, approach 2
import Ember from 'ember';
export default Ember.Component.extend({
classNames: ['the-item'],
});
import Ember from 'ember';
export default Ember.Controller.extend({
actions : {
dragEnd ({sourceList, sourceIndex, targetList, targetIndex}) {
if (sourceList === targetList && sourceIndex === targetIndex) return
const draggedItem = sourceList.objectAt(sourceIndex)
const oldParent = draggedItem.get('parent') // <--
sourceList.removeAt(sourceIndex)
targetList.insertAt(targetIndex, draggedItem)
const newParent = draggedItem.get('parent') // <--
newParent.set('isParent', newParent.get('children.length') > 0) // <--
oldParent.set('isParent', oldParent.get('children.length') > 0) // <--
},
}
});
import Model from "ember-data/model";
import attr from "ember-data/attr";
import { belongsTo, hasMany } from "ember-data/relationships";
export default Model.extend({
isParent: attr('boolean'),
parent: belongsTo('item', {inverse: 'children', async: false}),
children: hasMany('item', {inverse: 'parent', async: false}),
// updateParentState: Ember.observer('children.[]', function () {
// const isParent = this.get('children.length') > 0
// this.setProperties({isParent})
// })
});
import Ember from 'ember';
const payload = {
data: [
{
type: 'item',
id: '0',
attributes: { isParent: true },
relationships: {
parent: { data: { type: 'item', id: '0' } },
children: {
data: [
{type: 'item', id: '1'},
{type: 'item', id: '4'},
]
}
}
},
{
type: 'item',
id: '1',
attributes: { isParent: true },
relationships: {
parent: { data: { type: 'item', id: '0' } },
children: {
data: [
{type: 'item', id: '2'},
{type: 'item', id: '3'},
]
}
}
},
{
type: 'item',
id: '2',
attributes: { isParent: false },
relationships: {
parent: { data: { type: 'item', id: '1' } },
children: {
data: []
}
}
},
{
type: 'item',
id: '3',
attributes: { isParent: false },
relationships: {
parent: { data: { type: 'item', id: '1' } },
children: {
data: []
}
}
},
{
type: 'item',
id: '4',
attributes: { isParent: true },
relationships: { parent: { data: { type: 'item', id: '0' } },
children: {
data: [
{type: 'item', id: '5'},
{type: 'item', id: '6'},
]
}
}
},
{
type: 'item',
id: '5',
attributes: { isParent: false },
relationships: {
parent: { data: { type: 'item', id: '4' } },
children: {
data: []
}
}
},
{
type: 'item',
id: '6',
attributes: { isParent: false },
relationships: {
parent: { data: { type: 'item', id: '4' } },
children: {
data: []
}
}
},
]
}
export default Ember.Route.extend({
model () {
const store = this.get('store')
store.push(payload)
return store.peekRecord('item', '0')
}
});
body {
margin: 12px 16px;
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
font-size: 12pt;
}
.the-item {
margin: 4px;
padding: 1em;
border: 1px solid black;
display: flex;
}
.the-item-title {
flex-shrink: 0;
flex-grow: 0;
width: 100px;
}
.the-item .dragSortList {
flex-shrink: 0;
flex-grow: 1;
}
.the-item .dragSortList.-isExpanded {
padding-top: 55px;
}
.the-item .dragSortList.-isDragging {
outline: 2px dashed black;
background-color: deepskyblue;
}
.the-item .dragSortList.-isExpanded.-isDraggingOver:before {
top: 15px;
}
.the-item {
background-color : #FFD0E9;
}
.the-item .the-item {
background-color: #FFAAD7;
}
.the-item .the-item .the-item {
background-color: #FF8CC9;
}
.the-item .the-item .the-item .the-item {
background-color: #FF74BD;
}
.the-item .the-item .the-item .the-item .the-item {
background-color: #FF60B4;
}
.the-item .the-item .the-item .the-item .the-item .the-item {
background-color: #FF50AD;
}
{{the-item
item = model
dragEndAction = (action 'dragEnd')
}}
<p class = "the-item-title">
{{item.id}} {{item.isParent}}
</p>
{{#drag-sort-list
items = item.children
group = group
dragEndAction = dragEndAction
as |child|
}}
{{the-item
item = child
group = group
dragEndAction = dragEndAction
}}
{{/drag-sort-list}}
{
"version": "0.12.1",
"EmberENV": {
"FEATURES": {}
},
"options": {
"use_pods": false,
"enable-testing": false
},
"dependencies": {
"jquery": "https://cdnjs.cloudflare.com/ajax/libs/jquery/1.11.3/jquery.js",
"ember": "2.12.0",
"ember-template-compiler": "2.12.0",
"ember-testing": "2.12.0"
},
"addons": {
"ember-data": "2.12.1",
"ember-drag-sort": "1.0.2"
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment