Home Reference Source Repository

js/form/zone-completer.js

/**
 * User autocompleter
 */
define(['jquery', 'api.light', 'form/widgets'], function($, API) {
    'use strict';

    var levels = {};

    API.get('spatial/levels', function(data) {
        levels = data;
    });

    function levelLabel(zone) {
        return levels.filter(function(level) {
            return level.id == zone.level;
        })[0].name;
    }

    $('.zone-completer').each(function() {
        var $this = $(this);

        $this.selectize({
            persist: false,
            valueField: 'id',
            labelField: 'name',
            searchField: ['name', 'code', 'extraKeys'],
            options: $this.data('values'),
            plugins: ['remove_button'],
            load: function(query, callback) {
                if (!query.length) return callback();
                API.get('/spatial/zones/suggest', {
                    q: query,
                    size: 10
                }, function(data) {
                    data = $.map(data, function(item) {
                        item.extraKeys = Object.keys(item.keys).map(function(key) {
                            return item.keys[key];
                        });
                        return item;
                    });
                    callback(data);
                }).fail(function() {
                    callback();
                });
            },
            render: {
                option: function(data, escape) {
                    var opt = [
                            '<div class="selectize-zone">',
                            '<span class="title">',
                            '<span class="name">',
                            escape(data.name),
                            '</span>',
                            '<span class="code">',
                            escape(data.code),
                            '</span>',
                            '</span>',
                            '<span class="level">',
                            levelLabel(data),
                            '</span>'
                        ];
                    if (data.keys) {
                        opt.push('<ul>');
                        Object.keys(data.keys).map(function(key) {
                            opt.push('<li><span class="text-uppercase">');
                            opt.push(escape(key));
                            opt.push('</span>: <span class="value">');
                            opt.push(escape(data.keys[key]));
                            opt.push('</span></li>');
                        })
                        opt.push('</ul>');
                    }
                    opt.push('</div>');
                    return opt.join('');
                },
                item: function(data, escape) {
                    return [
                        '<div class="selectize-zone-item">',
                        escape(data.name),
                        ' <span class="code">(',
                        escape(data.code),
                        ')</span></div>'
                    ].join('');
                }
            }
        });
    });

});