export default Ember.Component.extend({ classNameBindings: [':value-list'], _enableSorting: function() { const self = this; const placeholder = document.createElement("div"); placeholder.className = "placeholder"; let dragging = null; let over = null; let nodePlacement; this.$().on('dragstart.discourse', '.values .value', function(e) { dragging = e.currentTarget; e.dataTransfer.effectAllowed = 'move'; e.dataTransfer.setData("text/html", e.currentTarget); }); this.$().on('dragend.discourse', '.values .value', function() { Ember.run(function() { dragging.parentNode.removeChild(placeholder); dragging.style.display = 'block'; // Update data const from = Number(dragging.dataset.index); let to = Number(over.dataset.index); if (from < to) to--; if (nodePlacement === "after") to++; const collection = self.get('collection'); const fromObj = collection.objectAt(from); collection.replace(from, 1); collection.replace(to, 0, [fromObj]); self._saveValues(); }); return false; }); this.$().on('dragover.discourse', '.values', function(e) { e.preventDefault(); dragging.style.display = 'none'; if (e.target.className === "placeholder") { return; } over = e.target; const relY = e.originalEvent.clientY - over.offsetTop; const height = over.offsetHeight / 2; const parent = e.target.parentNode; if (relY > height) { nodePlacement = "after"; parent.insertBefore(placeholder, e.target.nextElementSibling); } else if(relY < height) { nodePlacement = "before"; parent.insertBefore(placeholder, e.target); } }); }.on('didInsertElement'), _removeSorting: function() { this.$().off('dragover.discourse').off('dragend.discourse').off('dragstart.discourse'); }.on('willDestroyElement'), _setupCollection: function() { const values = this.get('values'); if (this.get('inputType') === "array") { this.set('collection', values || []); } else { this.set('collection', (values && values.length) ? values.split("\n") : []); } }.on('init').observes('values'), _saveValues: function() { if (this.get('inputType') === "array") { this.set('values', this.get('collection')); } else { this.set('values', this.get('collection').join("\n")); } }, inputInvalid: Ember.computed.empty('newValue'), keyDown(e) { if (e.keyCode === 13) { this.send('addValue'); } }, actions: { addValue() { if (this.get('inputInvalid')) { return; } this.get('collection').addObject(this.get('newValue')); this.set('newValue', ''); this._saveValues(); }, removeValue(value) { const collection = this.get('collection'); collection.removeObject(value); this._saveValues(); } } });