all files / src/ angular-blocks.js

97.5% Statements 39/40
83.33% Branches 5/6
100% Functions 15/15
97.5% Lines 39/40
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88            17×   23× 23×         23× 23× 23×   23×   22× 22×   28× 28×           22× 12×       22×       22×       22×       22×     22×         23× 23× 23× 23× 23× 23× 23×                        
/* global angular */
(function () {
    'use strict';
 
    function extendTemplate($templateCache, $compile, $http, $q, $log, $timeout) {
 
        function warnMissingBlock(name, src) {
            $log.warn('Failed to find data-block=' + name + ' in ' + src);
        }
 
        return {
            compile: function (tElement, tAttrs) {
                var src = tAttrs.extendTemplate;
                Iif (!src) {
                    throw 'Template not specified in extend-template directive';
                }
 
                // Clone and then clear the template element to prevent expressions from being evaluated
                tElement = jQuery(tElement);
                var $clone = tElement.clone();
                tElement.html('');
 
                var loadTemplate = $http.get(src, {cache: $templateCache})
                    .then(function (response) {
                        var template = response.data;
                        var $template = $(document.createElement('div')).html(template);
 
                        function override(method, $block, attr) {
                            var name = $block.attr(attr);
                            if ($template.find('[data-block="' + name + '"]')[method]($block).length === 0 &&
                                $template.find('[data-extend-template]').append($block).length === 0) {
                                warnMissingBlock(name, src);
                            }
                        }
 
                        // Replace overridden blocks
                        $clone.children('[data-block]').each(function () {
                            override('replaceWith', $(this), 'data-block');
                        });
 
                        // Insert prepend blocks
                        $clone.children('[data-block-prepend]').each(function () {
                            override('prepend', $(this), 'data-block-prepend');
                        });
 
                        // Insert append blocks
                        $clone.children('[data-block-append]').each(function () {
                            override('append', $(this), 'data-block-append');
                        });
 
                        // Insert before blocks
                        $clone.children('[data-block-before]').each(function () {
                            override('before', $(this), 'data-block-before');
                        });
 
                        // Insert after blocks
                        $clone.children('[data-block-after]').each(function () {
                            override('after', $(this), 'data-block-after');
                        });
 
                        return $template;
                    }, function () {
                        var msg = 'Failed to load template: ' + src;
                        $log.error(msg);
                        return $('<div class="error">Angular-blocks failed to load the template file</div>');
                    });
 
 
                return function ($scope, $element) {
                    return loadTemplate.then(function ($template) {
                        $scope.$broadcast('$blocksExtendTemplateLinkStart', src);
                        $element.html($template.html());
                        $compile($element.contents())($scope);
                        $timeout(function () {
                            $scope.$broadcast('$blocksExtendTemplateLinkFinish', src);
                        });
                    });
                };
            }
        };
    }
 
    angular.module('angular-blocks', [])
        .directive('extendTemplate', ['$templateCache', '$compile', '$http', '$q', '$log', '$timeout', extendTemplate]);
}());
 
//module.exports = 'angular-blocks';