Skip to content

Instantly share code, notes, and snippets.

@datapimp
Created October 26, 2013 19:53
Show Gist options
  • Save datapimp/7173744 to your computer and use it in GitHub Desktop.
Save datapimp/7173744 to your computer and use it in GitHub Desktop.
App.SiteRoute = Em.Route.extend
  setupController: (controller, site)->
    controller.set("model", site)
    @_super()
Ember.ContenteditableView = Em.View.extend({
	tagName: 'div',
	attributeBindings: ['contenteditable'],

	// Variables:
	editable: false,
	isUserTyping: false,
	plaintext: false,

	// Properties:
	contenteditable: (function() {
		var editable = this.get('editable');

		return editable ? 'true' : undefined;
	}).property('editable'),

	// Observers:
	valueObserver: (function() {
		if (!this.get('isUserTyping') && this.get('value')) {
			return this.setContent();
		}
	}).observes('value'),

	// Events:
	didInsertElement: function() {
		return this.setContent();
	},

	focusOut: function() {
		return this.set('isUserTyping', false);
	},

	keyDown: function(event) {
		if (!event.metaKey) {
			return this.set('isUserTyping', true);
		}
	},

	keyUp: function(event) {
		if (this.get('plaintext')) {
			return this.set('value', this.$().text());
		} else {
			return this.set('value', this.$().html());
		}
	},

	setContent: function() {
		return this.$().html(this.get('value'));
	}
});
App.EditableTitle = Em.ContenteditableView.extend
  disableEnter: true

  placeHolder: ""

  doubleClick: ()->
    @set("editable",true)

  focusOut: ()->
    @set("editable",false)
    @_super()

  keyDown: (event)->
    if event.keyCode is 13 and @disableEnter
      @set("editable", false)
      return false

    @_super(event)

  setContent: ->
    @_super()
    @.$().html(@get("value") || @placeHolder)

= view App.EditableTitle valueBinding="controller.title" tagName="h1"
= view App.EditableTitle valueBinding="controller.description" disableEnter=false placeHolder="Enter some text"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment