blob: 6d27a1cbe15ecc2a15799cd438c81a4ad9260e99 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var App = require('app');
/**
* Create custom styled checkbox with appropriate bindings and HTML template.
* You can specify <code><label></code> text with <code>label</code> property, or pass I18n translation key
* to <code>labelTranslate</code> property. Checkbox specific attributes can be bound in the same way as
* for Ember.Checkbox <code>checked</code>, <code>disabled</code>.
* Additional class names can be added with <code>labelClassNames</code> and <code>checkboxClassNames</code>
* properties.
*
* @example
* Usage:
* {{view App.CheckboxView checkedBinding="someBinding" label="someLabel"}}
* {{view App.CheckboxView checkedBinding="someBinding" labelTranslate="i18n.translate"}}
* {{view App.CheckboxView checkedBinding="someBinding"
* labelClassNames="class-1 class-2"
* checkboxClassNames="class-3 class-4"}}
*
* <!-- will append additional markup after <code><label></code> tag
* {{#view App.CheckboxView}}
* <span>Additional content</span>
* {{/view}}
*
* <!-- custom template -->
* {{#view App.CheckboxView isCustomTemplate="true"}}
* <!-- any markup here -->
* <label {{bindAttr for="view.checkboxId"}}>Left aligned label</label>
* <!-- minimal template to display checkbox -->
* {{view view.checkboxView}}
* {{view view.labelView}}
* {{/view}}
* @type {Ember.View}
*/
App.CheckboxView = Em.View.extend({
layoutName: require('templates/common/checkbox'),
concatenatedProperties: ['labelClassNames', 'checkboxClassNames'],
classNames: ['checkbox'],
/**
* Checkbox id generated by Ember. Used for <code>for</code> label attribute
* @private
* @type {String}
*/
checkboxId: '',
/**
* When <code>true</code> custom html markup will be used.
* @type {Boolean}
*/
isCustomTemplate: false,
/**
* Stores checkbox's <code>checked</code> attribute value
* @type {Boolean}
*/
checked: false,
/**
* Stores checkbox's <code>disabled</code> attribute value
* @type {Boolean}
*/
disabled: false,
/**
* Label's text
* @type {String}
*/
label: '',
/**
* Label's i18n code
* @type {[type]}
*/
labelTranslate: null,
/**
* Checkbox's <code>name</code> attribute value
* @type {String}
*/
name: '',
/**
* Default class for label element
* @type {String[]}
*/
labelClassNames: ['checkbox-label'],
/**
* Label's text to display. <code>label</code> property value will be used if no
* <code>labelTranslate</code> passed
* @return {String}
*/
labelText: function() {
return this.get('labelTranslate') ?
Em.I18n.t(this.get('labelTranslate')) :
this.get('label');
}.property('label', 'labelTranslate'),
/**
* Ember checkbox view
* @type {Em.View}
*/
checkboxView: Ember.Checkbox.extend({
attributeBindings: ['name'],
checkedBinding: 'parentView.checked',
disabledBinding: 'parentView.disabled',
nameBinding: 'parentView.name',
classNameBindings: 'parentView.checkboxClassNames',
didInsertElement: function() {
this.set('parentView.checkboxId', this.get('elementId'));
this._super();
},
change: function() {
if (typeof this.get('parentView.change') === 'function') {
this.get('parentView.change').apply(this.get('parentView'), arguments);
}
}
}),
/**
* Label view
* @type {[type]}
*/
labelView: Em.View.extend({
labelTextBinding: 'parentView.labelText',
classNameBindings: 'parentView.labelClassNames',
tagName: 'label',
attributeBindings: ['for', 'parentView.checked:checked'],
'data-qaBinding': 'parentView.labelIdentifier',
template: Em.Handlebars.compile('{{view.labelText}}'),
for: Em.computed.alias('parentView.checkboxId')
})
});