diff --git a/app/assets/javascripts/admin/index_utils/directives/toggle_column.js.coffee b/app/assets/javascripts/admin/index_utils/directives/toggle_column.js.coffee index d6239ff47f..2910e9a7a1 100644 --- a/app/assets/javascripts/admin/index_utils/directives/toggle_column.js.coffee +++ b/app/assets/javascripts/admin/index_utils/directives/toggle_column.js.coffee @@ -1,11 +1,8 @@ -angular.module("admin.indexUtils").directive "ofnToggleColumn", -> +angular.module("admin.indexUtils").directive "ofnToggleColumn", (Columns) -> link: (scope, element, attrs) -> element.addClass "selected" if scope.column.visible + element.click "click", -> scope.$apply -> - if scope.column.visible - scope.column.visible = false - element.removeClass "selected" - else - scope.column.visible = true - element.addClass "selected" + Columns.toggleColumn(scope.column) + element.toggleClass "selected" diff --git a/app/assets/javascripts/admin/index_utils/services/columns.js.coffee b/app/assets/javascripts/admin/index_utils/services/columns.js.coffee index 46e7ccd3b8..8bd99bf2f2 100644 --- a/app/assets/javascripts/admin/index_utils/services/columns.js.coffee +++ b/app/assets/javascripts/admin/index_utils/services/columns.js.coffee @@ -1,8 +1,18 @@ -angular.module("admin.indexUtils").factory 'Columns', -> +angular.module("admin.indexUtils").factory 'Columns', ($rootScope) -> new class Columns columns: {} + visibleCount: 0 - setColumns: (columns) -> + setColumns: (columns) => @columns = {} @columns[name] = column for name, column of columns + @calculateVisibleCount() @columns + + toggleColumn: (column) => + column.visible = !column.visible + @calculateVisibleCount() + + calculateVisibleCount: => + @visibleCount = (column for name, column of @columns when column.visible).length + $rootScope.$broadcast "columnCount:changed", @visibleCount diff --git a/spec/javascripts/unit/admin/index_utils/services/columns_spec.js.coffee b/spec/javascripts/unit/admin/index_utils/services/columns_spec.js.coffee index 0b6093f31d..2bff5e5a73 100644 --- a/spec/javascripts/unit/admin/index_utils/services/columns_spec.js.coffee +++ b/spec/javascripts/unit/admin/index_utils/services/columns_spec.js.coffee @@ -7,9 +7,34 @@ describe "Columns service", -> inject (_Columns_) -> Columns = _Columns_ - Columns.columns = ["something"] - describe "setting columns", -> it "sets resets @columns and copies each column of the provided object across", -> Columns.setColumns({ name: { visible: true } }) expect(Columns.columns).toEqual { name: { visible: true } } + + it "calls calculateVisibleCount", -> + spyOn(Columns, "calculateVisibleCount") + Columns.setColumns({ name: { visible: true } }) + expect(Columns.calculateVisibleCount).toHaveBeenCalled() + + describe "toggling a column", -> + it "switches the visibility of the given column", -> + column = { visible: false } + Columns.toggleColumn(column) + expect(column.visible).toBe true + + it "calls calculateVisibleCount", -> + spyOn(Columns, "calculateVisibleCount") + Columns.toggleColumn({ visible: false }) + expect(Columns.calculateVisibleCount).toHaveBeenCalled() + + describe "calculating visibleCount", -> + it "counts the number of columns ", -> + Columns.columns = { col1: { visible: false }, col2: { visible: true }, col3: { visible: true }, col4: { visible: false } } + Columns.calculateVisibleCount() + expect(Columns.visibleCount).toBe 2 + + it "$broadcasts the updated visible count to $rootScope", inject ($rootScope) -> + spyOn($rootScope, "$broadcast") + Columns.calculateVisibleCount() + expect($rootScope.$broadcast).toHaveBeenCalled()