address PR comments
Project: http://git-wip-us.apache.org/repos/asf/brooklyn-ui/repo Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-ui/commit/0af5dc4a Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-ui/tree/0af5dc4a Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-ui/diff/0af5dc4a Branch: refs/heads/master Commit: 0af5dc4a08fdab95819a214cf1b5ba17b8abc938 Parents: 9a22b64 Author: Alex Heneveld <alex.henev...@cloudsoftcorp.com> Authored: Tue Oct 30 14:20:30 2018 +0000 Committer: Alex Heneveld <alex.henev...@cloudsoftcorp.com> Committed: Tue Oct 30 14:20:30 2018 +0000 ---------------------------------------------------------------------- .../catalog-selector.directive.js | 82 ++++++++++++-------- .../catalog-selector.template.html | 2 +- .../providers/recently-used-service.provider.js | 1 + ui-modules/blueprint-composer/app/index.js | 2 + 4 files changed, 52 insertions(+), 35 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/brooklyn-ui/blob/0af5dc4a/ui-modules/blueprint-composer/app/components/catalog-selector/catalog-selector.directive.js ---------------------------------------------------------------------- diff --git a/ui-modules/blueprint-composer/app/components/catalog-selector/catalog-selector.directive.js b/ui-modules/blueprint-composer/app/components/catalog-selector/catalog-selector.directive.js index 109bf45..2959103 100644 --- a/ui-modules/blueprint-composer/app/components/catalog-selector/catalog-selector.directive.js +++ b/ui-modules/blueprint-composer/app/components/catalog-selector/catalog-selector.directive.js @@ -110,6 +110,38 @@ export function catalogSelectorSearchFilter() { } } +export function catalogSelectorFiltersFilter() { + // compute counts and apply active filters; + // this is called by the view after filtering based on search, + // so filters can adjust based on number of search results + return function (items, $scope) { + $scope.itemsBeforeActiveFilters = items; + $scope.skippingFilters = false; + let filters = $scope.filters.filter(f => f.enabled); + let filtersWithFn = filters.filter(f => f.filterFn); + if (!filters.length) { + $scope.itemsAfterActiveFilters = items; + return items; + } + filters.forEach(filter => { if (filter.filterInit) items = filter.filterInit(items); }); + if (filtersWithFn.length) { + items = items.filter( item => filtersWithFn.some(filter => filter.filterFn(item)) ); + } + if (!items || !items.length) { + // if search matches nothing then disable filters + items = $scope.itemsAfterActiveFilters = $scope.itemsBeforeActiveFilters; + $scope.skippingFilters = true; + } else { + if (filters.find(filter => filter.limitToOnePage)) { + items = items.splice(0, $scope.pagination.itemsPerPage); + } + $scope.itemsAfterActiveFilters = items; + } + return items; + + } +} + function controller($scope, $element, $timeout, $q, $uibModal, $log, $templateCache, paletteApi, paletteDragAndDropService, iconGenerator, composerOverrides, recentlyUsedService) { this.$timeout = $timeout; @@ -177,9 +209,18 @@ function controller($scope, $element, $timeout, $q, $uibModal, $log, $templateCa $scope.isLoading = false; }); }; + function tryMarkUsed(item) { + try { + recentlyUsedService.markUsed(item); + } catch (e) { + // session storage can get full; usually the culprit is icons not this, + // but we may wish to clear out old items to ensure we don't bleed here + $log.warn("Could not mark item as used: "+item, e); + } + } $scope.onSelectItem = function (item) { if (angular.isFunction($scope.onSelect)) { - recentlyUsedService.markUsed(item); + tryMarkUsed(item); $scope.onSelect({item: item}); } $scope.search = ''; @@ -204,7 +245,7 @@ function controller($scope, $element, $timeout, $q, $uibModal, $log, $templateCa }; $scope.onDragEnd = function (item, event) { paletteDragAndDropService.dragEnd(); - recentlyUsedService.markUsed(item); + tryMarkUsed(item); }; $scope.sortBy = function (order) { let newOrder = [].concat($scope.state.currentOrder); @@ -277,50 +318,23 @@ function controller($scope, $element, $timeout, $q, $uibModal, $log, $templateCa $scope.filters = [ { label: 'Recent', icon: 'clock-o', title: "Recently used and standard favorites", limitToOnePage: true, filterInit: items => { - $scope.recentItems = items.filter( i => i.lastUsed && i.lastUsed > 0 ); + $scope.recentItems = items.filter( i => i.lastUsed && i.lastUsed>0 ); $scope.recentItems.sort( (a,b) => b.lastUsed - a.lastUsed ); return $scope.recentItems; }, enabled: false }, ]; $scope.disableFilters = (showFilters) => { $scope.filters.forEach( f => f.enabled = false ); - if (showFilters !== false) $scope.showPaletteControls = true; + if (showFilters !== false) { + $scope.showPaletteControls = true; + } } // this can be overridden for palette sections/modes which show a subset of the types returned by the server; // this is applied when the data is received from the server. - // it is used by filterPaletteItemsWithActiveFilters; + // it is used by catalogSelectorFiltersFilter; $scope.filterPaletteItemsForMode = (items) => items; - // compute counts and apply active filters; - // this is called by the view after filtering based on search, - // so filters can adjust based on number of search results - $scope.filterPaletteItemsWithActiveFilters = (items) => { - $scope.itemsBeforeActiveFilters = items; - $scope.skippingFilters = false; - let filters = $scope.filters.filter(f => f.enabled); - let filtersWithFn = filters.filter(f => f.filterFn); - if (!filters.length) { - $scope.itemsAfterActiveFilters = items; - return items; - } - filters.forEach(filter => { if (filter.filterInit) items = filter.filterInit(items); }); - if (filtersWithFn.length) { - items = items.filter( item => filtersWithFn.some(filter => filter.filterFn(item)) ); - } - if (!items || !items.length) { - // if search matches nothing then disable filters - items = $scope.itemsAfterActiveFilters = $scope.itemsBeforeActiveFilters; - $scope.skippingFilters = true; - } else { - if (filters.find(filter => filter.limitToOnePage)) { - items = items.splice(0, $scope.pagination.itemsPerPage); - } - $scope.itemsAfterActiveFilters = items; - } - return items; - }; - // downstream can override this to insert lines below the header $scope.customSubHeadTemplateName = 'composer-palette-empty-sub-head'; $templateCache.put($scope.customSubHeadTemplateName, ''); http://git-wip-us.apache.org/repos/asf/brooklyn-ui/blob/0af5dc4a/ui-modules/blueprint-composer/app/components/catalog-selector/catalog-selector.template.html ---------------------------------------------------------------------- diff --git a/ui-modules/blueprint-composer/app/components/catalog-selector/catalog-selector.template.html b/ui-modules/blueprint-composer/app/components/catalog-selector/catalog-selector.template.html index eefd21a..870600c 100644 --- a/ui-modules/blueprint-composer/app/components/catalog-selector/catalog-selector.template.html +++ b/ui-modules/blueprint-composer/app/components/catalog-selector/catalog-selector.template.html @@ -100,7 +100,7 @@ <!-- here and below, col-xs-3 or -4 or -2 all work giving different densities; this could be configurable ("compressed"=xs-2 w no labels, "normal"=xs-3, "big"=xs-4) --> <div class="catalog-palette-item" ng-class="state.viewMode.classes" - ng-repeat="item in searchedItems = filterPaletteItemsWithActiveFilters(items | catalogSelectorSearch:search) | orderBy:state.currentOrder | limitTo:pagination.itemsPerPage:(pagination.page-1)*pagination.itemsPerPage track by (item.containingBundle + ':' + item.symbolicName + ':' + item.version)" + ng-repeat="item in searchedItems = (items | catalogSelectorSearch:search | catalogSelectorFilters:this) | orderBy:state.currentOrder | limitTo:pagination.itemsPerPage:(pagination.page-1)*pagination.itemsPerPage track by (item.containingBundle + ':' + item.symbolicName + ':' + item.version)" ng-click="onSelectItem(item)"> <div class="item" draggable="true" ng-dragstart="onDragItem(item, $event)" ng-dragend="onDragEnd(item, $event)"> <div class="item-logo"> http://git-wip-us.apache.org/repos/asf/brooklyn-ui/blob/0af5dc4a/ui-modules/blueprint-composer/app/components/providers/recently-used-service.provider.js ---------------------------------------------------------------------- diff --git a/ui-modules/blueprint-composer/app/components/providers/recently-used-service.provider.js b/ui-modules/blueprint-composer/app/components/providers/recently-used-service.provider.js index 01a9a35..cc48ab5 100644 --- a/ui-modules/blueprint-composer/app/components/providers/recently-used-service.provider.js +++ b/ui-modules/blueprint-composer/app/components/providers/recently-used-service.provider.js @@ -43,6 +43,7 @@ function RecentlyUsedService($log) { when = Date.now(); } sessionStorage.setItem(PREFIX+id, when); + // update the item if it is embellished if (item.lastUsed) item.lastUsed = when; }; service.getLastUsed = (item) => { http://git-wip-us.apache.org/repos/asf/brooklyn-ui/blob/0af5dc4a/ui-modules/blueprint-composer/app/index.js ---------------------------------------------------------------------- diff --git a/ui-modules/blueprint-composer/app/index.js b/ui-modules/blueprint-composer/app/index.js index dba74ce..199d8c5 100755 --- a/ui-modules/blueprint-composer/app/index.js +++ b/ui-modules/blueprint-composer/app/index.js @@ -46,6 +46,7 @@ import {designerDirective} from "./components/designer/designer.directive"; import { catalogSelectorDirective, catalogSelectorSearchFilter, + catalogSelectorFiltersFilter, } from "./components/catalog-selector/catalog-selector.directive"; import customActionDirective from "./components/custom-action/custom-action.directive"; import customConfigSuggestionDropdown from "./components/custom-config-widget/suggestion-dropdown"; @@ -95,6 +96,7 @@ angular.module('app', [ngAnimate, ngResource, ngCookies, ngClipboard, uiRouter, .filter('entityTypes', entityTypesFilter) .filter('locations', locationsFilter) .filter('catalogSelectorSearch', catalogSelectorSearchFilter) + .filter('catalogSelectorFilters', catalogSelectorFiltersFilter) .filter('dslParamLabel', ['$filter', dslParamLabelFilter]) .config(['$urlRouterProvider', '$stateProvider', '$logProvider', applicationConfig]) .config(['actionServiceProvider', actionConfig])