From 802aae6148190a7cbaf717ab79907d7949c8f8c0 Mon Sep 17 00:00:00 2001 From: James Allen Date: Mon, 16 Jun 2014 14:45:47 +0100 Subject: [PATCH] Show partial folder selection state --- services/web/app/views/project/list.jade | 27 ++++---- .../web/public/coffee/project-list.coffee | 63 ++++++++++++++----- 2 files changed, 62 insertions(+), 28 deletions(-) diff --git a/services/web/app/views/project/list.jade b/services/web/app/views/project/list.jade index 8b11afea45..08c12493dc 100644 --- a/services/web/app/views/project/list.jade +++ b/services/web/app/views/project/list.jade @@ -51,12 +51,12 @@ block content a.menu-indent(href="/templates") View All ยป .row-spaced ul.list-unstyled.folders-menu.js-folders-menu(ng-controller="TagListController") - li(ng-class="{active: (view == 'all')}") - a.menu-indent(href="#", ng-click="selectAllProjects()") All projects - //- li - //- a.menu-indent(href="#") Your projects - //- li - //- a.menu-indent(href="#") Shared with you + li(ng-class="{active: (filter == 'all')}") + a.menu-indent(href, ng-click="selectAllProjects()") All projects + li(ng-class="{active: (filter == 'owned')}") + a.menu-indent(href, ng-click="selectOwnedProjects()") Your projects + li(ng-class="{active: (filter == 'shared')}") + a.menu-indent(href, ng-click="selectSharedProjects()") Shared projects li h2 Folders li( @@ -119,7 +119,7 @@ block content ) i.fa.fa-trash-o - .btn-group(ng-hide="selectedProjects.length < 1") + .btn-group.dropdown(ng-hide="selectedProjects.length < 1") a.btn.btn-default.dropdown-toggle( href="#", data-toggle="dropdown" @@ -138,8 +138,9 @@ block content a(href="#", ng-click="addOrRemoveProjectsFromTag()") i.fa( ng-class="{\ - 'fa-check-square-o': areSelectedProjectsInTag,\ - 'fa-square-o': !areSelectedProjectsInTag\ + 'fa-check-square-o': areSelectedProjectsInTag == true,\ + 'fa-square-o': areSelectedProjectsInTag == false,\ + 'fa-minus-square-o': areSelectedProjectsInTag == 'partial'\ }" ) | {{tag.name}} @@ -167,7 +168,11 @@ block content li.container-fluid .row .col-md-6 - input.select-all(type="checkbox", ng-model="allSelected", ng-change="onSelectAllChange()") + input.select-all( + type="checkbox", + ng-model="allSelected", + ng-change="onSelectAllChange()" + ) span.title TITLE .col-md-2 span.owner OWNER @@ -186,7 +191,7 @@ block content span.label.label-default(ng-repeat='tag in project.tags') | {{tag.name}} .col-md-2 - span.owner {{project.publicAccesLevel}} + span.owner {{ownerName()}} .col-md-4 span.last-modified.isoDate {{project.lastUpdated | formatDate}} - else diff --git a/services/web/public/coffee/project-list.coffee b/services/web/public/coffee/project-list.coffee index b98cf96caa..119be15c0d 100644 --- a/services/web/public/coffee/project-list.coffee +++ b/services/web/public/coffee/project-list.coffee @@ -30,11 +30,12 @@ ProjectPageApp.controller "ProjectPageController", ($scope, $modal, $http, $q) - $scope.tags = window.data.tags $scope.allSelected = false $scope.selectedProjects = [] + $scope.filter = "all" # Allow tags to be accessed on projects as well projectsById = {} for project in $scope.projects - projectsById[project._id] = project + projectsById[project.id] = project for tag in $scope.tags for project_id in tag.project_ids or [] @@ -58,6 +59,10 @@ ProjectPageApp.controller "ProjectPageController", ($scope, $modal, $http, $q) - $scope.$watch "searchText", (value) -> $scope.updateVisibleProjects() + $scope.setFilter = (filter) -> + $scope.filter = filter + $scope.updateVisibleProjects() + $scope.clearProjectSelections = () -> for project in $scope.projects project.selected = false @@ -71,7 +76,7 @@ ProjectPageApp.controller "ProjectPageController", ($scope, $modal, $http, $q) - $scope.selectedProjects $scope.getSelectedProjectIds = () -> - $scope.selectedProjects.map (project) -> project._id + $scope.selectedProjects.map (project) -> project.id $scope.getFirstSelectedProject = () -> $scope.selectedProjects[0] @@ -89,7 +94,15 @@ ProjectPageApp.controller "ProjectPageController", ($scope, $modal, $http, $q) - if !project.name.toLowerCase().match($scope.searchText.toLowerCase()) visible = false # Only show if it matches the selected tag - if selectedTag? and project._id not in selectedTag.project_ids + if $scope.filter == "tag" and selectedTag? and project.id not in selectedTag.project_ids + visible = false + + # Hide projects we own if we only want to see shared projects + if $scope.filter == "shared" and project.accessLevel == "owner" + visible = false + + # Hide projects we don't own if we only want to see owned projects + if $scope.filter == "owned" and project.accessLevel != "owner" visible = false if visible @@ -113,12 +126,13 @@ ProjectPageApp.controller "ProjectPageController", ($scope, $modal, $http, $q) - else removed_project_ids.push project_id tag.project_ids = remaining_project_ids + return removed_project_ids $scope.removeSelectedProjectsFromTag = (tag) -> selected_project_ids = $scope.getSelectedProjectIds() selected_projects = $scope.getSelectedProjects() - $scope._removeProjectIdsFromTagArray(tag, selected_project_ids) + removed_project_ids = $scope._removeProjectIdsFromTagArray(tag, selected_project_ids) # Remove tag from project.tags remaining_tags = [] @@ -151,7 +165,8 @@ ProjectPageApp.controller "ProjectPageController", ($scope, $modal, $http, $q) - # Add tag into each project.tags for project in selected_projects project.tags ||= [] - project.tags.push tag + unless tag in project.tags + project.tags.push tag for project_id in added_project_ids # TODO Factor this out into another provider? @@ -217,7 +232,7 @@ ProjectPageApp.controller "ProjectPageController", ($scope, $modal, $http, $q) - $scope.renameProject = (project, newName) -> project.name = newName - $http.post "/project/#{project._id}/rename", { + $http.post "/project/#{project.id}/rename", { newProjectName: newName _csrf: window.csrfToken } @@ -272,27 +287,36 @@ ProjectPageApp.controller "ProjectListItemController", ($scope) -> $scope.onSelectedChange = () -> $scope.$emit "selected:on-change" -ProjectPageApp.controller "TagListController", ($scope) -> - $scope.view = "all" + $scope.ownerName = () -> + if $scope.project.accessLevel == "owner" + return "You" + else if $scope.project.owner? + return "#{$scope.project.owner.first_name} #{$scope.project.owner.last_name}" + else + return "?" +ProjectPageApp.controller "TagListController", ($scope) -> $scope.selectAllProjects = () -> $scope._clearTags() - $scope.setActiveItem("all") - $scope.updateVisibleProjects() + $scope.setFilter("all") + + $scope.selectOwnedProjects = () -> + $scope._clearTags() + $scope.setFilter("owned") + + $scope.selectSharedProjects = () -> + $scope._clearTags() + $scope.setFilter("shared") $scope._clearTags = () -> for tag in $scope.tags tag.selected = false - $scope.setActiveItem = (view) -> - $scope.view = view - ProjectPageApp.controller "TagListItemController", ($scope) -> $scope.selectTag = () -> $scope._clearTags() $scope.tag.selected = true - $scope.setActiveItem("tag") - $scope.updateVisibleProjects() + $scope.setFilter("tag") ProjectPageApp.controller "TagDropdownItemController", ($scope) -> $scope.$on "selection:change", (e, newValue, oldValue) -> @@ -303,12 +327,17 @@ ProjectPageApp.controller "TagDropdownItemController", ($scope) -> for project_id in $scope.getSelectedProjectIds() if project_id in $scope.tag.project_ids $scope.areSelectedProjectsInTag = true + else + partialSelection = true + + if $scope.areSelectedProjectsInTag and partialSelection + $scope.areSelectedProjectsInTag = "partial" $scope.addOrRemoveProjectsFromTag = () -> - if $scope.areSelectedProjectsInTag + if $scope.areSelectedProjectsInTag == true $scope.removeSelectedProjectsFromTag($scope.tag) $scope.areSelectedProjectsInTag = false - else + else if $scope.areSelectedProjectsInTag == false or $scope.areSelectedProjectsInTag == "partial" $scope.addSelectedProjectsToTag($scope.tag) $scope.areSelectedProjectsInTag = true