8000 GitHub - andrew-svirin/select_flexible: jQuery Multidimensional select box
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

andrew-svirin/select_flexible

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

jQuery plugin that allows to handle multidimensional selectbox

Select HTML:

<select name="languages[]" 
    id="languages-select" 
    class="candidates-filter-form-select" 
    multiple="multiple" 
    data-label="Languages">
        <option value="af][1" data-name="Afrikaans][Basic">
            Afrikaans Basic
        </option>
        <option value="af][2" data-name="Afrikaans][Intermediate">
            Afrikaans Intermediate
        </option>
        <option value="en][1" data-name="English][Basic">
            English Basic
        </option>
        <option value="en][2" data-name="English][Intermediate">
            English Intermediate
        </option>
</select>

Usage example:

$(document).ready(function () {
    let $select = $('#languages-select');
    $select.selectFlexible({
        dimension: 'multi', // or 'single'
        eventClickOption: function () {
            // hook.
        },
        eventSelectOptions: function ($results, toggle) {
            // hook.
        },
        eventClickResultOption: function () {
            // hook.
        },
    });
});

Select with display tags:

$(document).ready(function () {
    let $languagesSelect = $('#languages-select'),
        $languagesTags = $('#languages-tags');
    $languagesTags.handleTags({
        dimension: 'multi',
        $select: $languagesSelect,
    });
    $languagesSelect.selectFlexible({
        dimension: 'multi',
        eventClickOption: function () {
            $languagesTags.handleTags('rebuild');
        },
        eventSelectOptions: function ($results, toggle) {
            $results.selectRiser(false === toggle ? 'destroy' : {
                $select: $languagesSelect,
            });
        },
        eventClickResultOption: function () {
            $languagesTags.handleTags('rebuild');
        },
    });

});

(function ($) {
    $.fn.handleTags = function (options) {
        let $tags = $(this);
        if ('string' === typeof options) {
            switch (options) {
                case 'rebuild':
                    options = $tags.data('options');
                    $tags.html('');
                    break;
                default:
                    console.error('Method does not allowed', options);
            }
        } else {
            options = $.extend({
                $select: null,
                dimension: 'single',
            }, options);
            $tags.data('options', options);
        }
        let $options = $('option:selected', $tags.data('options').$select);
        if (0 === $options.length) {
            $tags.html('');
            return;
        }
        let $remove = $('<a class="select-tags-remove">')
            .text('Remove')
            .data('control', '#' + $tags.data('options').$select.attr('id'))
            .on('click', function (evt) {
                evt.preventDefault();
                let selectFlexibleSelector = $(this).data('control');
                $(selectFlexibleSelector).selectFlexible('values', []);
                $tags.html('');
            });
        $tags.append($remove).append($('<h3 class="select-tags-label">' + $tags.data('label') + '</h3>'));
        if ('multi' === options.dimension) {
            console.log('multi');
            let values = {};
            $options.each(function () {
                let $option = $(this),
                    value = $option.attr('value').split(']['),
                    name = $option.data('name').split('][');

                if (undefined === values[value[0]]) {
                    values[value[0]] = {
                        title: name[0],
                        values: {},
                    };
                }
                values[value[0]].values[value[1]] = {
                    title: name[1],
                };
            });
            $.each(values, function (key) {
                let keys = Object.keys(this.values);
                if (1 === keys.length) {
                    $tags.append($('<span class="select-tag" data-value="' + key + '">' +
                        this.title + ' ' + this.values[keys[0]].title +
                        '</span>'));
                } else {
                    $tags.append($('<span class="select-tag" data-value="' + key + '">' +
                        this.title + ' ' + this.values[keys[0]].title + '-' + this.values[keys[keys.length - 1]].title +
                        '</span>'));
                }
            });
        } else {
            $options.each(function () {
                let $option = $(this);
                $tags.append($('<span class="select-tag" data-value="' + $option.attr('value') + '">' +
                    $option.text() +
                    '</span>'));
            });
        }
        $tags.data('options', options);
    };

    $.fn.selectRiser = function (options) {
        $(this).each(function () {
            let $result = $(this),
                $resultOptionsContainer = $('.result-options', $result),
                $resultOptions = $('li.select-flexible-result-option', $result);

            if ('string' === typeof options) {
                switch (options) {
           
7F3F
         case 'destroy':
                        if ($result.hasClass('select-riser')) {
                            $resultOptionsContainer.trigger('mouseout').off('.select_riser');
                            $resultOptions.off('.select_riser');
                            $result.removeClass('select-riser');
                        }
                        break;
                    default:
                        console.error('Method does not allowed', options);
                }
            } else {
                options = $.extend({$select: null}, options);
                $resultOptionsContainer.on('mouseover.select_riser', () => {
                    $resultOptionsContainer.addClass('hover');
                }).on('mouseout.select_riser', () => {
                    $resultOptionsContainer.add($resultOptions).removeClass('hover');
                });
                $resultOptions.on('mouseover.select_riser', function () {
                    let resultOptionId = $resultOptions.index($(this));
                    $resultOptions.each(function (id, resultOption) {
                        let $resultOption = $(resultOption);
                        $resultOption.toggleClass('hover', !$resultOption.hasClass('hover') && id >= resultOptionId);
                    });
                }).off('click.select_flexible').on('click.select_riser', function (evt) {
                    evt.stopPropagation();
                    evt.preventDefault();
                    options.$select.selectFlexible('selectResultOptions', $resultOptions.filter(function () {
                        return $(this).hasClass('hover');
                    }), true).selectFlexible('selectResultOptions', $resultOptions.filter(function () {
                        return !$(this).hasClass('hover');
                    }), false);
                });
                $result.addClass('select-riser');
            }
        });
    };
}(jQuery));

Build dest files:

gulp --gulpfile public/vendors/select_flexible/gulpfile.js &&
gulp minify --gulpfile public/vendors/select_flexible/gulpfile.js

About

jQuery Multidimensional select box

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published
0