Source: public/modules/core/directives/radio-question.client.directive.js

'use strict';

/**
 * The `radioQuestion` directive is used to dynamically create a radio button
 * question into a view. It is used by the {@link
    * Angular.questionnaireDirective|questionnaire} directive to build whole
 * questionnaires.
 *
 * @class Angular.radioQuestionDirective
 * @see Angular.questionnaireDirective
 */

angular.module('core').directive('radioQuestion', [
    '$compile',
    'TrialData',
    '$log',
    function($compile, TrialData, $log) {

        $log.debug('Compiling radioQuestion directive.');

        /**
         * The data used to build the radio question is found in the `scope`
         * argument passed to the directive's `#link` function. When a
         * {@link Angular.questionnaireDirective|questionnaire} directive
         * employs a `radioQuestion` directive, it passes
         * the appropriate {@link Angular.questionnaireDirective#data~questionnaireStructureEntry|questionnaireStructureEntry}
         * for this parameter.
         *
         * @name scope
         * @memberof Angular.radioQuestionDirective
         * @inner
         * @type {{}}
         * @see Angular.questionnaireDirective
         */

        return {
            restrict: 'E',
            scope: {},

            link: function(scope, element, attrs) {

                scope.sendToTrialData = function(path, value) {
                    if (!attrs.associatedToMedia) {
                        TrialData.setValueForPath(path, value);
                    } else {
                        TrialData.setValueForPathForCurrentMedia(path, value);
                    }
                };

                scope[attrs.questionId + 'RadioGroup'] = null;

                scope.$watch(
                    attrs.questionId + 'RadioGroup',
                    function(newValue) {

                        // Convert 'true' to true literals and similar for
                        // 'false'
                        if (newValue === 'true') {
                            newValue = true;
                        } else if (newValue === 'false') {
                            newValue = false;
                        }

                        scope.sendToTrialData(
                            attrs.controllerDataPath,
                            newValue
                        );
                    });

                var questionText =
                    '<div class="row">' +
                    '<div class="col-md-12">' +
                    '<label for="' + attrs.questionId + 'Radio" ' +
                    'translate>' +
                    attrs.questionLabel +
                    '</label>' +
                    '<div>';

                var innerQuestionText = '';

                // Don't require question if explicitly told not to do so in
                // data
                var requiredText = '';
                if (element.data('questionRequired') !== false) {
                    requiredText = ' required="required" ';
                }

                if (element.data('questionOptions')) {

                    // Iterate over radio options
                    for (var i = 0;
                         i < element.data('questionOptions').choices.length;
                         i++) {

                        var thisOption = element.data('questionOptions').choices[i];

                        innerQuestionText +=
                            '<label class="radio-inline">' +
                            '<input type="radio" name="' +
                            attrs.questionId + 'RadioGroup" ' +
                            'id="' + attrs.questionId +
                            'Radio' + thisOption.label + '" ' +
                            'value="' + thisOption.value + '" ' +
                            'ng-model="' + attrs.questionId + 'RadioGroup" ' +
                            requiredText +
                            '>' +
                            '{{\'' + thisOption.label + '\' | translate}}' +
                            '</input>' +
                            '</label>';

                    }
                }

                questionText += innerQuestionText + '</div></div></div>';

                var questionElement = angular.element(questionText);

                // Add well class
                questionElement.addClass('well');

                element.append(questionElement);
                $compile(element.contents())(scope);
            }
        };
    }]);