UNPKG

fuelux

Version:

Base Fuel UX styles and controls

379 lines (307 loc) 11.9 kB
/*global QUnit:false, module:false, test:false, asyncTest:false, expect:false*/ /*global start:false, stop:false ok:false, equal:false, notEqual:false, deepEqual:false*/ /*global notDeepEqual:false, strictEqual:false, notStrictEqual:false, raises:false*/ define(function (require) { var $ = require('jquery'); var html = require('text!test/markup/tree-markup.html!strip'); $('body').append(html); require('bootstrap'); require('fuelux/tree'); module("Fuel UX Tree", { setup: function () { var callLimit = 50; var callCount = 0; this.dataSource = function (options, callback) { if (callCount >= callLimit) { callback({ data: [ { "name": "Convex and Concave", "type": "item", "attr": { "id": "item4" } } ] }, 400); return; } callCount++; callback({ data: [ { name: 'Ascending and Descending', type: 'folder', attr: { id: 'folder1' } }, { name: 'Sky and Water I (with custom icon)', type: 'item', attr: { id: 'item1', 'data-icon': 'glyphicon glyphicon-file' } }, { name: 'Drawing Hands', type: 'folder', attr: { id: 'folder2', 'data-children': false } }, { name: 'Waterfall', type: 'item', attr: { id: 'item2' } }, { name: 'Belvedere', type: 'folder', attr: { id: 'folder3' } }, { name: 'Relativity (with custom icon)', type: 'item', attr: { id: 'item3', 'data-icon': 'glyphicon glyphicon-picture' } }, { name: 'House of Stairs', type: 'folder', attr: { id: 'folder4' } }, { name: 'Convex and Concave', type: 'item', attr: { id: 'item4' } } ] }); }; this.textDataSource = function (options, callback) { callback({ data: [ { text: 'node text', type: 'folder', attr: { id: 'folder1' } } ] }); }; } }); test("should be defined on jquery object", function () { ok($().tree, 'tree method is defined'); }); test("should return element", function () { var $tree = $(html); ok($tree.tree() === $tree, 'tree should be initialized'); }); test("should have correct defaults", function correctDefaults() { var $tree = $(html); var defaults = $tree.tree.defaults; equal(defaults.multiSelect, false, 'multiSelect defaults to false'); equal(defaults.cacheItems, true, 'cacheItems defaults to true'); equal(defaults.folderSelect, true, 'folderSelect defaults to true'); equal(defaults.itemSelect, true, 'itemSelect defaults to true'); equal(defaults.disclosuresUpperLimit, 0, 'disclosuresUpperLimit defaults to 0'); ok(defaults.dataSource, 'dataSource exists by default'); }); test("should call dataSource correctly", function () { var $tree = $(html); $tree.tree({ dataSource: function (options, callback) { ok(1 === 1, 'dataSource function called prior to rendering'); equal(typeof options, 'object', 'dataSource provided options object'); equal(typeof callback, 'function', 'dataSource provided callback function'); callback({ data: [] }); } }); }); test("Tree should be populated by items on initialization", function () { var $tree = $(html).find('#MyTree'); $tree.tree({ dataSource: this.dataSource }); equal($tree.find('.tree-branch').length, 5, 'Initial set of folders have been added'); equal($tree.find('.tree-item').length, 5, 'Initial set of items have been added'); }); test("Folder should populate when opened", function () { var $tree = $(html).find('#MyTree'); var $selNode; $tree.tree({ dataSource: this.dataSource }); $selNode = $tree.find('.tree-branch:eq(1)'); $tree.tree('discloseFolder', $selNode.find('.tree-branch-name')); equal($selNode.find('.tree-branch-children > li').length, 8, 'Folder has been populated with items/sub-folders'); $tree = $(html).find('#MyTreeSelectableFolder'); $tree.tree({ dataSource: this.dataSource, folderSelect: true }); $selNode = $tree.find('.tree-branch:eq(1)'); $tree.tree('discloseFolder', $selNode.find('.tree-branch-header')); equal($selNode.find('.tree-branch-children > li').length, 8, 'Folder has been populated with sub-folders and items'); }); test("Single item/folder selection works as designed", function () { var $tree = $(html).find('#MyTree'); // multiSelect: false is the default $tree.tree({ dataSource: this.dataSource }); $tree.tree('selectItem', $tree.find('.tree-item:eq(1)')); equal($tree.tree('selectedItems').length, 1, 'Return single selected value'); $tree.tree('selectItem', $tree.find('.tree-item:eq(2)')); equal($tree.tree('selectedItems').length, 1, 'Return new single selected value'); $tree = $(html).find('#MyTreeSelectableFolder'); $tree.tree({ dataSource: this.dataSource, folderSelect: true }); $tree.tree('selectItem', $tree.find('.tree-item:eq(1)')); equal($tree.tree('selectedItems').length, 1, 'Return single selected item (none previously selected, 1st programatic selection)'); $tree.tree('selectFolder', $tree.find('.tree-branch-name:eq(1)')); equal($tree.tree('selectedItems').length, 1, 'Return single selected folder (item previously selected, 2nd programatic selection)'); $tree.tree('selectItem', $tree.find('.tree-item:eq(2)')); equal($tree.tree('selectedItems').length, 1, 'Return single selected item (folder previously selected, 3rd programatic selection)'); $tree.find('.tree-item:eq(1)').click(); equal($tree.tree('selectedItems').length, 1, 'Return single selected item (item previously selected, 1st click selection)'); $tree.find('.tree-branch-name:eq(1)').click(); equal($tree.tree('selectedItems').length, 1, 'Return single selected folder (item previously selected, 2nd click selection)'); $tree.find('.tree-item:eq(2)').click(); equal($tree.tree('selectedItems').length, 1, 'Return single selected item (folder previously selected, 3rd click selection)'); }); test("Multiple item/folder selection works as designed", function () { var $tree = $(html).find('#MyTree'); $tree.tree({ dataSource: this.dataSource, multiSelect: true }); $tree.tree('selectItem', $tree.find('.tree-item:eq(1)')); equal($tree.tree('selectedItems').length, 1, 'Return single selected value'); $tree.tree('selectItem', $tree.find('.tree-item:eq(2)')); equal($tree.tree('selectedItems').length, 2, 'Return multiple selected values'); $tree.tree('selectItem', $tree.find('.tree-item:eq(1)')); equal($tree.tree('selectedItems').length, 1, 'Return single selected value'); $tree = $(html).find('#MyTreeSelectableFolder'); $tree.tree({ dataSource: this.dataSource, multiSelect: true, folderSelect: true }); $tree.tree('selectFolder', $tree.find('.tree-branch-name:eq(1)')); equal($tree.tree('selectedItems').length, 1, 'Return single selected value'); $tree.tree('selectFolder', $tree.find('.tree-branch-name:eq(2)')); equal($tree.tree('selectedItems').length, 2, 'Return multiple selected values'); $tree.tree('selectFolder', $tree.find('.tree-branch-name:eq(1)')); equal($tree.tree('selectedItems').length, 1, 'Return single selected value'); }); test("should not allow selecting items if disabled", function () { var $tree = $(html).find('#MyTree'); $tree.tree({ dataSource: this.dataSource, itemSelect: false }); $tree.tree('selectItem', $tree.find('.tree-item:eq(1)')); equal($tree.tree('selectedItems').length, 0, 'Return no value'); }); test("should not allow selecting folders if disabled", function () { var $tree = $(html).find('#MyTree'); $tree.tree({ dataSource: this.dataSource, folderSelect: false }); $tree.tree('selectFolder', $tree.find('.tree-branch-name:eq(1)')); equal($tree.tree('selectedItems').length, 0, 'Return no value'); }); test('folders should open and close correctly', function () { var $tree = $(html).find('#MyTree'); $tree.tree({ dataSource: this.dataSource }); var $targetBranch = $($tree.find('.tree-branch')[0]); equal($targetBranch.hasClass('tree-open'), false, 'Branch starts closed'); $tree.tree('discloseFolder', $targetBranch); equal($targetBranch.hasClass('tree-open'), true, 'discloseFolder opens folder'); $tree.tree('discloseFolder', $targetBranch); equal($targetBranch.hasClass('tree-open'), true, 'redundant discloseFolder calls leaves folder open'); $tree.tree('closeFolder', $targetBranch); equal($targetBranch.hasClass('tree-open'), false, 'closeFolder closes folder'); $tree.tree('closeFolder', $targetBranch); equal($targetBranch.hasClass('tree-open'), false, 'redundant closeFolder calls leaves folder closed'); $tree.tree('toggleFolder', $targetBranch); equal($targetBranch.hasClass('tree-open'), true, 'toggleFolder on closed folder opens folder'); $tree.tree('toggleFolder', $targetBranch); equal($targetBranch.hasClass('tree-open'), false, 'toggleFolder on open folder closes folder'); }); asyncTest("should disclose visible folders", function () { var $tree = $('body').find('#MyTree'); $tree.tree({ dataSource: this.dataSource }); var toBeOpened = $tree.find(".tree-branch:not('.tree-open, .hidden')").length; equal($tree.find(".tree-branch.tree-open:not('.hidden')").length, 0, '0 folders open'); $tree.one('disclosedVisible.fu.tree', function () { equal($tree.find(".tree-branch.tree-open:not('.hidden')").length, toBeOpened, toBeOpened + ' folders open'); start(); }); $tree.tree('discloseVisible'); }); asyncTest("should disclose all folders up to limit, and then close them, then open them all", function () { var $tree = $('body').find('#MyTree2'); $tree.tree({ dataSource: this.dataSource, disclosuresUpperLimit: 2 }); equal($tree.find(".tree-branch.tree-open:not('.hidden')").length, 0, '0 folders open'); $tree.one('exceededDisclosuresLimit.fu.tree', function exceededDisclosuresLimit() { equal($tree.find(".tree-branch.tree-open:not('.hidden')").length, 20, '20 folders open'); $tree.one('closedAll.fu.tree', function closedAll() { equal($tree.find(".tree-branch.tree-open:not('.hidden')").length, 0, '0 folders open'); $tree.data('ignore-disclosures-limit', true); $tree.one('disclosedAll.fu.tree', function exceededDisclosuresLimit() { equal($tree.find(".tree-branch.tree-open:not('.hidden')").length, 200, '200 folders open'); start(); }); $tree.tree('discloseAll'); }); $tree.tree('closeAll'); }); $tree.tree('discloseAll'); }); test("should destroy control", function () { var $tree = $(html).find('#MyTree'); $tree.tree({ dataSource: this.dataSource }); equal(typeof ($tree.tree('destroy')), 'string', 'returns string (markup)'); equal($tree.parent().length, false, 'control has been removed from DOM'); }); test("Tree should accept TEXT as the NAME property in the datasource", function () { var $tree = $(html).find('#MyTree'); $tree.tree({ dataSource: this.textDataSource }); $tree.tree('selectFolder', $tree.find('.tree-branch-name:eq(1)')); equal($tree.tree('selectedItems')[0].text, 'node text', 'Param TEXT used in the datasource'); }); });