diff --git a/dart/lib/component/justified_table_component/justified_table_component.dart b/dart/lib/component/justified_table_component/justified_table_component.dart new file mode 100644 index 000000000..cf685f913 --- /dev/null +++ b/dart/lib/component/justified_table_component/justified_table_component.dart @@ -0,0 +1,71 @@ +part of security_monkey; + +@Component( + selector: 'justified-table', + templateUrl: 'packages/security_monkey/component/justified_table_component/justified_table_component.html', + useShadowDom: false +) +class JustifiedTableComponent extends PaginatedTable implements ScopeAware { + List issues = []; + RouteProvider routeProvider; + Router router; + ObjectStore store; + bool constructor_complete = false; + Scope _scope; + + Map filter_params = { + 'regions': '', + 'technologies': '', + 'accounts': '', + 'names': '', + 'arns': '', + 'active': null, + 'searchconfig': null, + 'page': '1', + 'count': '25', + 'enabledonly': 'true', + 'justified': true + }; + + JustifiedTableComponent(this.routeProvider, this.router, this.store) { + filter_params = map_from_url(filter_params, this.routeProvider); + + /// The AngularUI Pagination tries to correct the currentPage value + /// to page 1 when the API server hasn't yet responded with results. + /// To fix, don't set the currentPage variable until we have received + /// a response from the API server containing totalItems. + store.list(Issue, params: filter_params).then((issues) { + super.setPaginationData(issues.meta); + this.issues = issues; + super.is_loaded = true; + super.items_per_page = filter_params['count']; + super.currentPage = int.parse(filter_params['page']); + constructor_complete = true; + }); + } + + void list() { + if (!constructor_complete) { + return; + } + if (filter_params['page'] != super.currentPage.toString() || filter_params['count'] != super.items_per_page) { + filter_params['page'] = super.currentPage.toString(); + filter_params['count'] = super.items_per_page; + this.pushFilterRoutes(); + } else { + print("Loading Filtered Data."); + store.list(Issue, params: filter_params).then((issues) { + super.setPaginationData(justifiled_issues.meta); + this.issues = issues; + super.is_loaded = true; + }); + } + } + + void pushFilterRoutes() { + filter_params = map_to_url(filter_params); + print("Pushing justified_table_component filter routes: $filter_params"); + router.go('justified', filter_params); + } + +} diff --git a/dart/lib/component/justified_table_component/justified_table_component.html b/dart/lib/component/justified_table_component/justified_table_component.html new file mode 100644 index 000000000..77aaf493e --- /dev/null +++ b/dart/lib/component/justified_table_component/justified_table_component.html @@ -0,0 +1,70 @@ +
+
Justified Issues Report + + +
+
+
+
+

Loading . . .

+
+
+
+ {{err_message}} +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Item NameTechnologyAccountRegionIssueNotesScoreJustification
{{issue.item.name}}{{issue.item.technology}}{{issue.item.account}}{{issue.item.region}}{{issue.issue}}{{issue.notes}}{{issue.score}}{{issue.justified_user}}
{{issue.justification}}
+
+ +
diff --git a/dart/lib/component/search_bar_component/search_bar_component.html b/dart/lib/component/search_bar_component/search_bar_component.html index 8d3d16236..ee9375dc9 100644 --- a/dart/lib/component/search_bar_component/search_bar_component.html +++ b/dart/lib/component/search_bar_component/search_bar_component.html @@ -81,6 +81,7 @@
Type
+ diff --git a/dart/lib/component/search_page_component/search_page_component.html b/dart/lib/component/search_page_component/search_page_component.html index a2743ce90..4f564e0aa 100644 --- a/dart/lib/component/search_page_component/search_page_component.html +++ b/dart/lib/component/search_page_component/search_page_component.html @@ -8,6 +8,7 @@ +

Enter a search on the left.

diff --git a/dart/lib/routing/securitymonkey_router.dart b/dart/lib/routing/securitymonkey_router.dart index c4d73a205..f687c4089 100644 --- a/dart/lib/routing/securitymonkey_router.dart +++ b/dart/lib/routing/securitymonkey_router.dart @@ -47,6 +47,16 @@ void securityMonkeyRouteInitializer(Router router, RouteViewFactory views) { defaultRoute: true, view: 'views/error.html') }), + 'justified': ngRoute( + path: '/justified/:regions/:technologies/:accounts/:accounttypes/:names/:arns/:active/:searchconfig/:page/:count', + mount: { + 'view': ngRoute( + path: '', + view: 'views/searchpage.html'), + 'view_default': ngRoute( + defaultRoute: true, + view: 'views/error.html') + }), 'viewitemrevision': ngRoute( path: '/viewitem/:itemid/:revid', view: 'views/itemdetailsview.html' diff --git a/dart/lib/security_monkey.dart b/dart/lib/security_monkey.dart index 04b9b551e..7c32ce990 100644 --- a/dart/lib/security_monkey.dart +++ b/dart/lib/security_monkey.dart @@ -78,6 +78,7 @@ part 'component/dashboard_component/dashboard_component.dart'; part 'component/settings/user_role_component/user_role_component.dart'; part 'component/settings/network_whitelist_component/network_whitelist_component.dart'; part 'component/settings/ignore_list_component/ignore_list_component.dart'; +part 'component/justified_table_component/justified_table_component.dart'; part 'component/auditscore_view_component/auditscore_view_component.dart'; part 'component/account_pattern_audit_score_view_component/account_pattern_audit_score_view_component.dart'; part 'component/settings/audit_score_component/audit_score_component.dart'; @@ -119,6 +120,7 @@ class SecurityMonkeyModule extends Module { bind(UserRoleComponent); bind(NetworkWhitelistComponent); bind(IgnoreListComponent); + bind(JustifiedTableComponent); bind(AuditScoreComponent); bind(AccountPatternAuditScoreComponent); bind(AuditScoreListComponent); diff --git a/dart/web/ui.html b/dart/web/ui.html index ceaecaaa1..f9d05ce04 100644 --- a/dart/web/ui.html +++ b/dart/web/ui.html @@ -79,6 +79,8 @@
  • IAM Group Issues
  • Managed Policy Issues
  • Redshift Issues
  • +
  • +
  • Justified Issues
  • Settings