eliace/ergo-js

View on GitHub
js/widgets/pagination.js

Summary

Maintainability
B
5 hrs
Test Coverage


Ergo.defineClass('Ergo.widgets.Pagination', {

    extends: 'Ergo.widgets.List',

    defaults: {

        cls: 'pagination',
//        mixins: ['selectable'],
        include: 'selectable',
        dynamic: false,  // отключаем динамическое построение элементов
        components: {
            nextBtn: {
                etype: 'html:li',
                weight: 100,
                $content: {
                    etype: 'html:a',
                    text: '»',
                    binding: false,
                    events: {
                        'jquery:mousedown': function(e) {
                            this.rise('page#next');
                            e.preventDefault(); // блокируем выделение текста
                        }
                    }
                }
            },
            prevBtn: {
                etype: 'html:li',
                weight: -100,
                $content: {
                    etype: 'html:a',
                    text: '«',
                    binding: false,
                    events: {
                        'jquery:mousedown': function(e) {
                            this.rise('page#prev');
                            e.preventDefault(); // блокируем выделение текста
                        }
                    }
                }
            }
        },
        defaultItem: {
            $content: {
                etype: 'html:a',
                events: {
                    'jquery:mousedown': function(e) {
    //                this.parent.parent.opt('index', this.parent);
                        var index = parseInt( this.parent.opt('name') );
                        if(index)
                            this.rise('page#change', {index: index});
                        e.preventDefault(); // блокируем выделение текста
                    }
                }
            },
            autoBind: false
        },
        // выборка происходит только по имени
        // lookup: function(key) {
        //     return this.item( Ergo.by_opts.curry({name: key}) );
        // },

        selection: {
            lookup: function(key) {
                return this.item( Ergo.by_opts.bind(this, {name: key}) );
            }
        },


        binding: function(v) {
            this.opt('dataIndex', this.data.opt('index'));
        },


        events: {
            'page#next': function(e) {
                var i = this.data.opt('index')+1;
                if( i <= this.data.opt('count') )
                    this.rise('changeDataIndex', {index: i});
            },
            'page#prev': function(e) {
                var i = this.data.opt('index')-1;
                if( i > 0 )
                    this.rise('changeDataIndex', {index: i});
            },
            'page#change': function(e) {
                this.rise('changeDataIndex', {index: e.index});
            }
        }

    },





    set dataIndex(index) {

        var count = this.data.opt('count');

        var before_pages = 2;
        var after_pages = 2;
        var wrap_pages = 2;

        this.items.applyAll('_destroy');

        var min_float = Math.min(before_pages, count);
        var max_float = Math.max(min_float, count-after_pages);
        var min_block = Math.max(min_float, index-wrap_pages-1);
        var max_block = Math.min(max_float, index+wrap_pages);

        // BEFORE
        for(var i = 0; i < min_float; i++)
            this.items.add({text: i+1, name: i+1});

        if(min_block - min_float > 0)
            this.items.add({text: '...'});

        for(var i = min_block; i < max_block; i++)
            this.items.add({text: i+1, name: i+1});

        if(max_float - max_block > 0)
            this.items.add({text: '...'});

        // AFTER
        for(var i = max_float; i < count; i++)
            this.items.add({text: i+1, name: i+1});

        this.render();

        this.selection.set(index);

//        this.opt('selected', index);

//        data.opt('index', index);
//        data.fetch();

        this.emit('dataIndexChanged', {index: index});  //?
    }



}, 'widgets:pagination');