# all files / keystone/lib/core/ initNav.js

7.69% Statements 3/39
0% Branches 0/24
0% Functions 0/4
7.89% Lines 3/38

    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

    1×
    1×

    1×

     /**
     * Initialises Keystone's internal nav config
     *
     * @param {Object} nav
     * @api private
     */

    var _ = require('lodash');
    var utils = require('keystone-utils');

    module.exports = function initNav (sections) {
    	var keystone = this;

    	var nav = {
    		sections: [],
    		by: {
    			list: {},
    			section: {},
    		},
    	};

    	if (!sections) {
    		sections = {};
    		nav.flat = true;
    		_.forEach(this.lists, function (list) {
    			if (list.get('hidden')) return;
    			sections[list.path] = [list.path];
    		});
    	}

    	_.forEach(sections, function (section, key) {
    		if (typeof section === 'string') {
    			section = [section];
    		}
    		section = {
    			lists: section,
    			label: nav.flat ? keystone.list(section[0]).label : utils.keyToLabel(key),
    		};
    		section.key = key;
    		section.lists = _.map(section.lists, function (i) {
    			if (_.isString(i)) {
    				var list = keystone.list(i);
    				if (!list) {
    					throw new Error('Invalid Keystone Option (nav): list ' + i + ' has not been defined.\n');
    				}
    				if (list.get('hidden')) {
    					throw new Error('Invalid Keystone Option (nav): list ' + i + ' is hidden.\n');
    				}
    				nav.by.list[list.key] = section;
    				return {
    					key: list.key,
    					label: list.label,
    					path: list.path,
    				};
    			} else if (_.isObject(i)) {
    				if (!_.has(i, 'key')) {
    					throw new Error('Invalid Keystone Option (nav): object ' + i + ' requires a "key" property.\n');
    				}
    				i.label = i.label || utils.keyToLabel(key);
    				i.path = i.path || utils.keyToPath(key);
    				i.external = true;
    				nav.by.list[i.key] = section;
    				return i;
    			}
    			throw new Error('Invalid Keystone Option (nav): ' + i + ' is in an unrecognized format.\n');
    		});
    		if (section.lists.length) {
    			nav.sections.push(section);
    			nav.by.section[section.key] = section;
    		}
    	});

    	return nav;
    };