| /** |
| * 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') |
| }) |
| }); |