superdesk/superdesk-client-core

View on GitHub
scripts/core/directives/SliderDirective.ts

Summary

Maintainability
A
1 hr
Test Coverage
export default angular.module('superdesk.core.directives.slider', [])
    /**
     * @ngdoc directive
     * @module superdesk.core.directives
     * @name sdSlider
     *
     * @param {Object} value Current selected value, if nothing is selected it will use min value
     * @param {Object} list List of options
     * @param {Boolen} disabled Disable or enable slider functionality
     * @param {Object} invert Inverts min and max value
     * @param {Function} update Callback when slider value is changed
     *
     * @description Regular slider.
     */
    .directive('sdSlider', () => ({
        transclude: true,
        templateUrl: 'scripts/core/views/sdSlider.html',
        scope: {
            value: '=',
            list: '=',
            unique: '@',
            field: '@',
            disabled: '=',
            invert: '=',
            update: '&',
        },
        link: function(scope, element, attrs, controller) {
            scope.$watch('list', (list) => {
                if (!list) {
                    return false;
                }

                var value = scope.invert ?
                        -Math.abs(parseInt(scope.value, 10)) :
                        parseInt(scope.value, 10),

                    minValue = scope.invert ?
                        -Math.abs(parseInt(scope.list[scope.list.length - 1][scope.unique], 10)) :
                        parseInt(scope.list[0][scope.unique], 10),

                    maxValue = scope.invert ?
                        -Math.abs(parseInt(scope.list[0][scope.unique], 10)) :
                        parseInt(scope.list[scope.list.length - 1][scope.unique], 10);

                if (!value) {
                    value = minValue;
                }

                $('[sd-slider][data-field="' + scope.field + '"]').slider({
                    range: 'max',
                    min: minValue,
                    max: maxValue,
                    value: value,
                    disabled: scope.disabled,
                    create: function() {
                        $(this).find('.ui-slider-thumb')
                            .css('left', (value - minValue) * 100 / (maxValue - minValue) + '%')
                            .text(scope.invert ? Math.abs(value) : value);
                    },
                    slide: function(event, ui) {
                        $(this).find('.ui-slider-thumb')
                            .css('left', (ui.value - minValue) * 100 / (maxValue - minValue) + '%')
                            .text(scope.invert ? Math.abs(ui.value) : ui.value);

                        scope.update({
                            item: scope.invert ? scope.list[Math.abs(ui.value) - 1] : scope.list[ui.value] - 1,
                            field: scope.field,
                        });
                    },
                    start: function() {
                        $(this).find('.ui-slider-thumb')
                            .addClass('ui-slider-thumb-active');
                    },
                    stop: function() {
                        $(this).find('.ui-slider-thumb')
                            .removeClass('ui-slider-thumb-active');
                    },
                });
            });
        },
    }));