├── .travis.yml ├── client-side └── dependentSelectBox.js ├── composer.json ├── doc └── index.md ├── license.md ├── readme.md ├── src ├── Controls │ ├── DependentMultiSelectBox.php │ └── DependentSelectBox.php ├── DependentData.php ├── DependentExtension.php ├── DependentTrait.php ├── Exceptions.php ├── _Controls.BackCompatibility.php └── _DI.BackCompatibility.php └── tests ├── .coveralls.yml ├── app ├── presenters │ ├── BasePresenter.php │ └── templates │ │ ├── Base.dependentMultiSelect1.latte │ │ ├── Base.dependentMultiSelect2.latte │ │ ├── Base.dependentSelect1.latte │ │ └── Base.dependentSelect2.latte └── router │ └── Router.php ├── bootstrap.php └── tests ├── DependentDataTest.phpt ├── DependentMultiSelectBoxTest.phpt └── DependentSelectBoxTest.phpt /.travis.yml: -------------------------------------------------------------------------------- 1 | language: php 2 | 3 | php: 4 | - 5.6 5 | - 7.0 6 | - 7.1 7 | - 7.2 8 | - 7.3 9 | - 7.4 10 | - 8.0 11 | 12 | install: 13 | - travis_retry composer install --no-interaction --no-progress 14 | 15 | script: 16 | - vendor/bin/tester tests -s 17 | 18 | after_failure: 19 | - for i in $(find tests -name \*.expected); do echo "--- $i"; cat $i; echo; echo; done 20 | - for i in $(find tests -name \*.actual); do echo "--- $i"; cat $i; echo; echo; done 21 | 22 | jobs: 23 | include: 24 | - env: title="Lowest Dependencies" 25 | install: 26 | - travis_retry composer update --no-interaction --no-progress --prefer-lowest --prefer-stable 27 | 28 | - stage: Code Standard Checker 29 | php: 7.1 30 | install: 31 | - travis_retry composer create-project nette/code-checker temp/code-checker --no-interaction --no-progress 32 | - travis_retry composer create-project nette/coding-standard temp/coding-standard --no-interaction --no-progress 33 | 34 | script: 35 | - php temp/code-checker/src/code-checker.php --short-arrays 36 | - php temp/coding-standard/ecs check src tests --config temp/coding-standard/coding-standard-php56.neon 37 | 38 | - stage: Code Coverage 39 | php: 7.1 40 | script: 41 | - vendor/bin/tester -p phpdbg tests -s --coverage ./coverage.xml --coverage-src ./src 42 | 43 | after_script: 44 | - wget https://github.com/satooshi/php-coveralls/releases/download/v1.0.1/coveralls.phar 45 | - php coveralls.phar --verbose --config tests/.coveralls.yml 46 | 47 | allow_failures: 48 | - stage: Code Coverage 49 | 50 | sudo: false 51 | 52 | cache: 53 | directories: 54 | - $HOME/.composer/cache 55 | 56 | notifications: 57 | email: false 58 | -------------------------------------------------------------------------------- /client-side/dependentSelectBox.js: -------------------------------------------------------------------------------- 1 | /** 2 | * DependentSelectBox 3 | * @author Dusan Hudak 4 | */ 5 | 6 | (function ($) { 7 | $.fn.dependentSelectBox = function (options, listener) { 8 | 9 | var callback = function () {}; 10 | if(typeof( options ) === 'function' ) { 11 | callback = options; 12 | options = null; 13 | } 14 | if(typeof( listener ) === 'function' ) { 15 | callback = listener; 16 | } 17 | 18 | var dsb = this; 19 | dsb.timeout = []; 20 | dsb.settings = $.extend({ 21 | suggestTimeout: 350, 22 | dataLinkName: 'dependentselectbox', 23 | dataParentsName: 'dependentselectboxParents', 24 | dataParamsName: 'dependentselectboxParams' 25 | }, options); 26 | 27 | 28 | /** 29 | * Get link to signal 30 | * @param element 31 | * @returns {*} 32 | */ 33 | this.getSignalLink = function (element) { 34 | var signalLink = element.data(dsb.settings.dataLinkName); 35 | var params = element.data(dsb.settings.dataParamsName); 36 | 37 | if (signalLink === undefined) { 38 | return false; 39 | } 40 | 41 | $.each(params, function (name, id) { 42 | var paramElement = $('#' + id); 43 | 44 | if (paramElement.length > 0) { 45 | var val; 46 | 47 | if (paramElement.prop('type') === 'checkbox') { 48 | val = paramElement.prop('checked') ? 1 : 0; 49 | 50 | } else { 51 | val = $(paramElement).val(); 52 | if (!val) { 53 | return; 54 | } 55 | } 56 | 57 | 58 | if (val instanceof Array) { 59 | $.each(val, function (key, value) { 60 | signalLink += '&' + name + '[]=' + value; 61 | }); 62 | 63 | } else { 64 | signalLink += '&' + name + '=' + val; 65 | } 66 | } 67 | }); 68 | 69 | return signalLink; 70 | }; 71 | 72 | 73 | /** 74 | * process 75 | * @param e 76 | * @param parentElement 77 | */ 78 | this.process = function (e, parentElement, dependentSelect) { 79 | 80 | // Validate if signalLink exist 81 | var signalLink = dsb.getSignalLink(dependentSelect); 82 | if (signalLink == false) { 83 | return false; 84 | } 85 | // skip cascaded data loading if parentEl is not yet set, empty dependentSelect & add empty prompt 86 | var parentElVal = parentElement.val(); 87 | if (!parentElVal) { 88 | dependentSelect.empty().append('') 117 | .attr('label', item.key); 118 | 119 | $.each(item.value, function (objI, objItem) { 120 | var option = $('