import { default as computed, on, observes } from 'ember-addons/ember-computed-decorators'; export default Ember.Component.extend({ classNames: 'wizard-links', items: Ember.A(), @on('didInsertElement') @observes('links.@each') didInsertElement() { Ember.run.scheduleOnce('afterRender', () => { this.applySortable(); }); }, applySortable() { this.$("ul").sortable({tolerance: 'pointer'}).on('sortupdate', (e, ui) => { const itemId = ui.item.data('id'); const index = ui.item.index(); Ember.run.bind(this, this.updateItemOrder(itemId, index)); }); }, updateItemOrder(itemId, newIndex) { const items = this.get('items'); const item = items.findBy('id', itemId); items.removeObject(item); items.insertAt(newIndex, item); Ember.run.scheduleOnce('afterRender', this, () => this.applySortable()); }, @computed('type') header: (type) => `admin.wizard.${type}.header`, @computed('items.@each.id', 'current') links(items, current) { if (!items) return; return items.map((item) => { if (item) { const id = item.get('id'); const type = this.get('type'); const label = type === 'action' ? id : (item.get('label') || item.get('title') || id); let link = { id, label }; let classes = 'btn'; if (current && item.get('id') === current.get('id')) { classes += ' btn-primary'; }; link['classes'] = classes; return link; } }); }, actions: { add() { const items = this.get('items'); const type = this.get('type'); const newId = `${type}_${items.length + 1}`; let params = { id: newId, isNew: true }; if (type === 'step') { params['fields'] = Ember.A(); params['actions'] = Ember.A(); }; const newItem = Ember.Object.create(params); items.pushObject(newItem); this.set('current', newItem); this.sendAction('isNew'); }, change(itemId) { const items = this.get('items'); this.set('current', items.findBy('id', itemId)); }, remove(itemId) { const items = this.get('items'); items.removeObject(items.findBy('id', itemId)); this.set('current', items[items.length - 1]); } } });