Showing
5 changed files
with
132 additions
and
0 deletions
... | ... | @@ -594,6 +594,21 @@ function EntityService($http, $q, $filter, $translate, $log, userService, device |
594 | 594 | } |
595 | 595 | ); |
596 | 596 | break; |
597 | + case types.aliasFilterType.edgeType.value: | |
598 | + getEntitiesByNameFilter(types.entityType.edge, filter.edgeNameFilter, maxItems, {ignoreLoading: true}, filter.edgeType).then( | |
599 | + function success(entities) { | |
600 | + if (entities && entities.length || !failOnEmpty) { | |
601 | + result.entities = entitiesToEntitiesInfo(entities); | |
602 | + deferred.resolve(result); | |
603 | + } else { | |
604 | + deferred.reject(); | |
605 | + } | |
606 | + }, | |
607 | + function fail() { | |
608 | + deferred.reject(); | |
609 | + } | |
610 | + ); | |
611 | + break; | |
597 | 612 | case types.aliasFilterType.relationsQuery.value: |
598 | 613 | result.stateEntity = filter.rootStateEntity; |
599 | 614 | var rootEntityType; |
... | ... | @@ -648,6 +663,7 @@ function EntityService($http, $q, $filter, $translate, $log, userService, device |
648 | 663 | case types.aliasFilterType.assetSearchQuery.value: |
649 | 664 | case types.aliasFilterType.deviceSearchQuery.value: |
650 | 665 | case types.aliasFilterType.entityViewSearchQuery.value: |
666 | + case types.aliasFilterType.edgeSearchQuery.value: | |
651 | 667 | result.stateEntity = filter.rootStateEntity; |
652 | 668 | if (result.stateEntity && stateEntityId) { |
653 | 669 | rootEntityType = stateEntityId.entityType; |
... | ... | @@ -777,6 +793,8 @@ function EntityService($http, $q, $filter, $translate, $log, userService, device |
777 | 793 | return entityType === types.entityType.device; |
778 | 794 | case types.aliasFilterType.entityViewType.value: |
779 | 795 | return entityType === types.entityType.entityView; |
796 | + case types.aliasFilterType.edgeType.value: | |
797 | + return entityType === types.entityType.edge; | |
780 | 798 | case types.aliasFilterType.relationsQuery.value: |
781 | 799 | return true; |
782 | 800 | case types.aliasFilterType.assetSearchQuery.value: |
... | ... | @@ -906,6 +924,7 @@ function EntityService($http, $q, $filter, $translate, $log, userService, device |
906 | 924 | entityFieldKeys.push(types.entityField.phone.keyName); |
907 | 925 | break; |
908 | 926 | case types.entityType.entityView: |
927 | + case types.entityType.edge: | |
909 | 928 | entityFieldKeys.push(types.entityField.name.keyName); |
910 | 929 | entityFieldKeys.push(types.entityField.type.keyName); |
911 | 930 | break; |
... | ... | @@ -1121,6 +1140,8 @@ function EntityService($http, $q, $filter, $translate, $log, userService, device |
1121 | 1140 | findByQueryPromise = deviceService.findByQuery(entitySearchQuery, true, {ignoreLoading: true}); |
1122 | 1141 | } else if (entityType == types.entityType.entityView) { |
1123 | 1142 | findByQueryPromise = entityViewService.findByQuery(entitySearchQuery, true, {ignoreLoading: true}); |
1143 | + } else if (entityType == types.entityType.edge) { | |
1144 | + findByQueryPromise = edgeService.findByQuery(entitySearchQuery, true, {ignoreLoading: true}); | |
1124 | 1145 | } |
1125 | 1146 | findByQueryPromise.then( |
1126 | 1147 | function success(entities) { | ... | ... |
... | ... | @@ -86,6 +86,15 @@ export default function EntityFilterViewDirective($compile, $templateCache, $q, |
86 | 86 | scope.filterDisplayValue = $translate.instant('alias.filter-type-entity-view-type-description', {entityViewType: entityViewType}); |
87 | 87 | } |
88 | 88 | break; |
89 | + case types.aliasFilterType.edgeType.value: | |
90 | + var edgeType = scope.filter.edgeType; | |
91 | + prefix = scope.filter.edgeNameFilter; | |
92 | + if (prefix && prefix.length) { | |
93 | + scope.filterDisplayValue = $translate.instant('alias.filter-type-edge-type-and-name-description', {edgeType: edgeType, prefix: prefix}); | |
94 | + } else { | |
95 | + scope.filterDisplayValue = $translate.instant('alias.filter-type-edge-type-description', {edgeType: edgeType}); | |
96 | + } | |
97 | + break; | |
89 | 98 | case types.aliasFilterType.relationsQuery.value: |
90 | 99 | var rootEntityText; |
91 | 100 | var directionText; | ... | ... |
... | ... | @@ -73,10 +73,15 @@ export default function EntityFilterDirective($compile, $templateCache, $q, $doc |
73 | 73 | filter.entityViewType = null; |
74 | 74 | filter.entityViewNameFilter = ''; |
75 | 75 | break; |
76 | + case types.aliasFilterType.edgeType.value: | |
77 | + filter.edgeType = null; | |
78 | + filter.edgeNameFilter = ''; | |
79 | + break; | |
76 | 80 | case types.aliasFilterType.relationsQuery.value: |
77 | 81 | case types.aliasFilterType.assetSearchQuery.value: |
78 | 82 | case types.aliasFilterType.deviceSearchQuery.value: |
79 | 83 | case types.aliasFilterType.entityViewSearchQuery.value: |
84 | + case types.aliasFilterType.edgeSearchQuery.value: | |
80 | 85 | filter.rootStateEntity = false; |
81 | 86 | filter.stateEntityParamName = null; |
82 | 87 | filter.defaultStateEntity = null; |
... | ... | @@ -95,6 +100,9 @@ export default function EntityFilterDirective($compile, $templateCache, $q, $doc |
95 | 100 | } else if (filter.type === types.aliasFilterType.entityViewSearchQuery.value) { |
96 | 101 | filter.relationType = null; |
97 | 102 | filter.entityViewTypes = []; |
103 | + } else if (filter.type === types.aliasFilterType.edgeSearchQuery.value) { | |
104 | + filter.relationType = null; | |
105 | + filter.edgeTypes = []; | |
98 | 106 | } |
99 | 107 | break; |
100 | 108 | } | ... | ... |
... | ... | @@ -126,6 +126,20 @@ |
126 | 126 | aria-label="{{ 'entity-view.name-starts-with' | translate }}"> |
127 | 127 | </md-input-container> |
128 | 128 | </section> |
129 | + <section layout="column" ng-if="filter.type == types.aliasFilterType.edgeType.value" id="edgeTypeFilter"> | |
130 | + <tb-entity-subtype-autocomplete | |
131 | + tb-required="true" | |
132 | + the-form="theForm" | |
133 | + ng-model="filter.edgeType" | |
134 | + entity-type="types.entityType.edge"> | |
135 | + </tb-entity-subtype-autocomplete> | |
136 | + <md-input-container class="md-block"> | |
137 | + <label translate>edge.name-starts-with</label> | |
138 | + <input name="edgeNameFilter" | |
139 | + ng-model="filter.edgeNameFilter" | |
140 | + aria-label="{{ 'edge.name-starts-with' | translate }}"> | |
141 | + </md-input-container> | |
142 | + </section> | |
129 | 143 | <section layout="column" ng-if="filter.type == types.aliasFilterType.relationsQuery.value" id="relationsQueryFilter"> |
130 | 144 | <label class="tb-small">{{ 'alias.root-entity' | translate }}</label> |
131 | 145 | <section class="tb-root-state-entity-switch" layout="row" layout-align="start center" style="padding-left: 0px;"> |
... | ... | @@ -426,4 +440,81 @@ |
426 | 440 | ng-model="filter.entityViewTypes"> |
427 | 441 | </tb-entity-subtype-list> |
428 | 442 | </section> |
443 | + <section layout="column" ng-if="filter.type == types.aliasFilterType.edgeSearchQuery.value" id="edgeSearchQueryFilter"> | |
444 | + <label class="tb-small">{{ 'alias.root-entity' | translate }}</label> | |
445 | + <section class="tb-root-state-entity-switch" layout="row" layout-align="start center" style="padding-left: 0px;"> | |
446 | + <md-switch class="root-state-entity-switch" ng-model="filter.rootStateEntity" | |
447 | + aria-label="{{ 'alias.root-state-entity' | translate }}"> | |
448 | + </md-switch> | |
449 | + <label class="tb-small root-state-entity-label" translate>alias.root-state-entity</label> | |
450 | + </section> | |
451 | + <div flex layout="row" ng-if="!filter.rootStateEntity"> | |
452 | + <tb-entity-select flex | |
453 | + the-form="theForm" | |
454 | + tb-required="!filter.rootStateEntity" | |
455 | + ng-disabled="filter.rootStateEntity" | |
456 | + use-alias-entity-types="true" | |
457 | + ng-model="filter.rootEntity"> | |
458 | + </tb-entity-select> | |
459 | + </div> | |
460 | + <div flex layout="row" ng-if="filter.rootStateEntity"> | |
461 | + <md-input-container class="md-block" style="margin-top: 32px;"> | |
462 | + <label translate>alias.state-entity-parameter-name</label> | |
463 | + <input name="stateEntityParamName" | |
464 | + placeholder="{{ 'alias.default-entity-parameter-name' | translate }}" | |
465 | + ng-model="filter.stateEntityParamName" | |
466 | + aria-label="{{ 'alias.state-entity-parameter-name' | translate }}"> | |
467 | + </md-input-container> | |
468 | + <div flex layout="column"> | |
469 | + <label class="tb-small">{{ 'alias.default-state-entity' | translate }}</label> | |
470 | + <tb-entity-select flex | |
471 | + the-form="theForm" | |
472 | + tb-required="false" | |
473 | + use-alias-entity-types="true" | |
474 | + ng-model="filter.defaultStateEntity"> | |
475 | + </tb-entity-select> | |
476 | + </div> | |
477 | + </div> | |
478 | + <div flex layout="row"> | |
479 | + <section class="tb-root-state-entity-switch" layout="row" layout-align="start center" style="padding-left: 0px;"> | |
480 | + <md-switch class="root-state-entity-switch" ng-model="filter.fetchLastLevelOnly" | |
481 | + aria-label="{{ 'alias.last-level-relation' | translate }}"> | |
482 | + </md-switch> | |
483 | + <label class="tb-small root-state-entity-label" translate>alias.last-level-relation</label> | |
484 | + </section> | |
485 | + </div> | |
486 | + <div flex layout="row"> | |
487 | + <md-input-container class="md-block" style="min-width: 100px;"> | |
488 | + <label translate>relation.direction</label> | |
489 | + <md-select required ng-model="filter.direction"> | |
490 | + <md-option ng-repeat="direction in types.entitySearchDirection" ng-value="direction"> | |
491 | + {{ ('relation.search-direction.' + direction) | translate}} | |
492 | + </md-option> | |
493 | + </md-select> | |
494 | + </md-input-container> | |
495 | + <md-input-container flex class="md-block"> | |
496 | + <label translate>alias.max-relation-level</label> | |
497 | + <input name="maxRelationLevel" | |
498 | + type="number" | |
499 | + min="1" | |
500 | + step="1" | |
501 | + placeholder="{{ 'alias.unlimited-level' | translate }}" | |
502 | + ng-model="filter.maxLevel" | |
503 | + aria-label="{{ 'alias.max-relation-level' | translate }}"> | |
504 | + </md-input-container> | |
505 | + </div> | |
506 | + <div class="md-caption" style="color: rgba(0,0,0,0.57);" translate>relation.relation-type</div> | |
507 | + <tb-relation-type-autocomplete flex | |
508 | + hide-label | |
509 | + the-form="theForm" | |
510 | + ng-model="filter.relationType" | |
511 | + tb-required="false"> | |
512 | + </tb-relation-type-autocomplete> | |
513 | + <div class="md-caption tb-required" style="color: rgba(0,0,0,0.57);" translate>edge.edge-types</div> | |
514 | + <tb-entity-subtype-list | |
515 | + tb-required="true" | |
516 | + entity-type="types.entityType.edge" | |
517 | + ng-model="filter.edgeTypes"> | |
518 | + </tb-entity-subtype-list> | |
519 | + </section> | |
429 | 520 | </div> | ... | ... |
... | ... | @@ -508,6 +508,9 @@ function EntitiesHierarchyWidgetController($element, $scope, $q, $timeout, toast |
508 | 508 | case types.entityType.entityView: |
509 | 509 | materialIcon = 'view_quilt'; |
510 | 510 | break; |
511 | + case types.entityType.edge: | |
512 | + materialIcon = 'router'; | |
513 | + break; | |
511 | 514 | } |
512 | 515 | } |
513 | 516 | return { | ... | ... |