From 884a89893dc9721157fb9f3c41c069acbb4730ab Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Thu, 27 Apr 2017 16:07:03 +0100 Subject: [PATCH 01/10] Save and read filtering options from local storage. --- .../main/project-list/project-list.coffee | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/services/web/public/coffee/main/project-list/project-list.coffee b/services/web/public/coffee/main/project-list/project-list.coffee index 161598d32d..f65fcc90b3 100644 --- a/services/web/public/coffee/main/project-list/project-list.coffee +++ b/services/web/public/coffee/main/project-list/project-list.coffee @@ -2,7 +2,7 @@ define [ "base" ], (App) -> - App.controller "ProjectPageController", ($scope, $modal, $q, $window, queuedHttp, event_tracking, $timeout) -> + App.controller "ProjectPageController", ($scope, $modal, $q, $window, queuedHttp, event_tracking, $timeout, localStorage) -> $scope.projects = window.data.projects $scope.tags = window.data.tags $scope.notifications = window.data.notifications @@ -18,6 +18,8 @@ define [ recalculateProjectListHeight() , 10 + storedUIOpts = JSON.parse(localStorage("project_list")) + recalculateProjectListHeight = () -> topOffset = $(".project-list-card")?.offset()?.top bottomOffset = $("footer").outerHeight() + 25 @@ -52,6 +54,13 @@ define [ project.tags ||= [] project.tags.push tag + markTagAsSelected = (id) -> + for tag in $scope.tags + if tag._id == id + tag.selected = true + else + tag.selected = false + $scope.changePredicate = (newPredicate)-> if $scope.predicate == newPredicate $scope.reverse = !$scope.reverse @@ -126,6 +135,11 @@ define [ else # We don't want hidden selections project.selected = false + + localStorage("project_list", JSON.stringify({ + filter: $scope.filter, + selectedTagId: selectedTag?._id + })) $scope.updateSelectedProjects() $scope.getSelectedTag = () -> @@ -424,8 +438,6 @@ define [ path = "/project/#{selected_project_ids[0]}/download/zip" window.location = path - - $scope.updateVisibleProjects() App.controller "ProjectListItemController", ($scope) -> $scope.ownerName = () -> From 877cd8e01888c9c08555a15746674fe4e2622145 Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Thu, 27 Apr 2017 16:07:21 +0100 Subject: [PATCH 02/10] Apply stored filtering options. --- .../public/coffee/main/project-list/project-list.coffee | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/services/web/public/coffee/main/project-list/project-list.coffee b/services/web/public/coffee/main/project-list/project-list.coffee index f65fcc90b3..fc9c3ea800 100644 --- a/services/web/public/coffee/main/project-list/project-list.coffee +++ b/services/web/public/coffee/main/project-list/project-list.coffee @@ -438,6 +438,13 @@ define [ path = "/project/#{selected_project_ids[0]}/download/zip" window.location = path + + if storedUIOpts?.filter? + if storedUIOpts.filter == "tag" and storedUIOpts.selectedTagId? + markTagAsSelected(storedUIOpts.selectedTagId) + $scope.setFilter(storedUIOpts.filter) + else + $scope.updateVisibleProjects() App.controller "ProjectListItemController", ($scope) -> $scope.ownerName = () -> From 84a265825984ba71d1a779928865247c7c0cb67c Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Fri, 28 Apr 2017 12:11:51 +0100 Subject: [PATCH 03/10] Add an untagged filter in the projects list. --- services/web/app/views/project/list/side-bar.pug | 5 +++++ .../web/public/coffee/main/project-list/project-list.coffee | 4 ++++ .../public/coffee/main/project-list/tag-controllers.coffee | 6 +++++- 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/services/web/app/views/project/list/side-bar.pug b/services/web/app/views/project/list/side-bar.pug index 1fb0e2bda9..1c946a5664 100644 --- a/services/web/app/views/project/list/side-bar.pug +++ b/services/web/app/views/project/list/side-bar.pug @@ -79,6 +79,11 @@ li a(href, ng-click="deleteTag(tag)", stop-propagation="click") | #{translate("delete")} + li.tag( + ng-if="tags.length", + ng-cloak, + ng-click="selectUntagged()" + ) uncategorized li(ng-cloak) a.tag(href, ng-click="openNewTagModal()") i.fa.fa-fw.fa-plus diff --git a/services/web/public/coffee/main/project-list/project-list.coffee b/services/web/public/coffee/main/project-list/project-list.coffee index fc9c3ea800..a46345b167 100644 --- a/services/web/public/coffee/main/project-list/project-list.coffee +++ b/services/web/public/coffee/main/project-list/project-list.coffee @@ -113,6 +113,10 @@ define [ if $scope.filter == "tag" and selectedTag? and project.id not in selectedTag.project_ids visible = false + # Hide tagged projects if we only want to see the uncategorized ones + if $scope.filter == "untagged" and project.tags? + visible = false + # Hide projects we own if we only want to see shared projects if $scope.filter == "shared" and project.accessLevel == "owner" visible = false diff --git a/services/web/public/coffee/main/project-list/tag-controllers.coffee b/services/web/public/coffee/main/project-list/tag-controllers.coffee index cc3415e32e..6a75e7491b 100644 --- a/services/web/public/coffee/main/project-list/tag-controllers.coffee +++ b/services/web/public/coffee/main/project-list/tag-controllers.coffee @@ -15,7 +15,11 @@ define [ $scope._clearTags() tag.selected = true $scope.setFilter("tag") - + + $scope.selectUntagged = () -> + $scope._clearTags() + $scope.setFilter("untagged") + $scope.deleteTag = (tag) -> modalInstance = $modal.open( templateUrl: "deleteTagModalTemplate" From 2d4c5f012a060327978b872a9afd4def20f5d6ac Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Fri, 28 Apr 2017 16:57:25 +0100 Subject: [PATCH 04/10] Styling for untagged filter. --- services/web/public/stylesheets/app/project-list.less | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/services/web/public/stylesheets/app/project-list.less b/services/web/public/stylesheets/app/project-list.less index 17f6b7bb25..2cf16e51a4 100644 --- a/services/web/public/stylesheets/app/project-list.less +++ b/services/web/public/stylesheets/app/project-list.less @@ -153,6 +153,13 @@ ul.folders-menu { line-height: 1.4; } } + .tag-untagged { + font-style: italic; + &:hover, + &:focus { + text-decoration: none; + } + } .tag-menu { > a { border: 1px solid @gray; From 6e402840998d9fbe98558dab178f81e0d8e45b46 Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Fri, 28 Apr 2017 16:57:37 +0100 Subject: [PATCH 05/10] Add untagged projects counter. --- services/web/app/views/project/list/side-bar.pug | 6 +++++- .../public/coffee/main/project-list/project-list.coffee | 7 ++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/services/web/app/views/project/list/side-bar.pug b/services/web/app/views/project/list/side-bar.pug index 1c946a5664..7550f66e2f 100644 --- a/services/web/app/views/project/list/side-bar.pug +++ b/services/web/app/views/project/list/side-bar.pug @@ -83,7 +83,11 @@ ng-if="tags.length", ng-cloak, ng-click="selectUntagged()" - ) uncategorized + ng-class="{active: filter === 'untagged'}", + ) + a.tag-untagged(href) + | #{translate("uncategorized")} + span.subdued ({{ nUntagged }}) li(ng-cloak) a.tag(href, ng-click="openNewTagModal()") i.fa.fa-fw.fa-plus diff --git a/services/web/public/coffee/main/project-list/project-list.coffee b/services/web/public/coffee/main/project-list/project-list.coffee index a46345b167..81659983fb 100644 --- a/services/web/public/coffee/main/project-list/project-list.coffee +++ b/services/web/public/coffee/main/project-list/project-list.coffee @@ -10,6 +10,7 @@ define [ $scope.selectedProjects = [] $scope.filter = "all" $scope.predicate = "lastUpdated" + $scope.nUntagged = 0 $scope.reverse = true $scope.searchText = value : "" @@ -18,6 +19,10 @@ define [ recalculateProjectListHeight() , 10 + $scope.$watch(( + () -> $scope.projects.filter((project) -> !project.tags? or project.tags.length == 0).length + ), (newVal) -> $scope.nUntagged = newVal) + storedUIOpts = JSON.parse(localStorage("project_list")) recalculateProjectListHeight = () -> @@ -114,7 +119,7 @@ define [ visible = false # Hide tagged projects if we only want to see the uncategorized ones - if $scope.filter == "untagged" and project.tags? + if $scope.filter == "untagged" and project.tags?.length > 0 visible = false # Hide projects we own if we only want to see shared projects From 9fb166d2b36dc62d9c754e119bcaa9e588613ca9 Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Fri, 28 Apr 2017 17:09:34 +0100 Subject: [PATCH 06/10] Style improvements. --- .../web/app/views/project/list/side-bar.pug | 4 ++-- .../public/stylesheets/app/project-list.less | 21 ++++++++++++------- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/services/web/app/views/project/list/side-bar.pug b/services/web/app/views/project/list/side-bar.pug index 7550f66e2f..b3a3f11948 100644 --- a/services/web/app/views/project/list/side-bar.pug +++ b/services/web/app/views/project/list/side-bar.pug @@ -79,13 +79,13 @@ li a(href, ng-click="deleteTag(tag)", stop-propagation="click") | #{translate("delete")} - li.tag( + li.tag.untagged( ng-if="tags.length", ng-cloak, ng-click="selectUntagged()" ng-class="{active: filter === 'untagged'}", ) - a.tag-untagged(href) + a.tag-name(href) | #{translate("uncategorized")} span.subdued ({{ nUntagged }}) li(ng-cloak) diff --git a/services/web/public/stylesheets/app/project-list.less b/services/web/public/stylesheets/app/project-list.less index 2cf16e51a4..3fb8cf6044 100644 --- a/services/web/public/stylesheets/app/project-list.less +++ b/services/web/public/stylesheets/app/project-list.less @@ -124,6 +124,20 @@ ul.folders-menu { } } } + &.untagged { + font-style: italic; + margin-bottom: @line-height-computed / 4; + a { + line-height: 1.7; + &:hover, + &:focus { + text-decoration: none; + } + } + span.subdued { + font-style: normal; + } + } &:hover { &:not(.active) { background-color: darken(@gray-lightest, 2%); @@ -153,13 +167,6 @@ ul.folders-menu { line-height: 1.4; } } - .tag-untagged { - font-style: italic; - &:hover, - &:focus { - text-decoration: none; - } - } .tag-menu { > a { border: 1px solid @gray; From 2708fdf15984a6ee9c2602af1b857c7e20c45d95 Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Mon, 1 May 2017 15:43:44 +0100 Subject: [PATCH 07/10] Add a button to allow inline removal of tags. --- .../app/views/project/list/project-list.pug | 16 +++++++++++----- .../public/stylesheets/app/project-list.less | 18 ++++++++++++++++-- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/services/web/app/views/project/list/project-list.pug b/services/web/app/views/project/list/project-list.pug index 0bb93e8336..38159bfc48 100644 --- a/services/web/app/views/project/list/project-list.pug +++ b/services/web/app/views/project/list/project-list.pug @@ -152,11 +152,17 @@ span( ng-controller="TagListController" ) - a.label.label-default.tag-label( - href, - ng-repeat='tag in project.tags', - ng-click="selectTag(tag)" - ) {{tag.name}} + .tag-label( + ng-repeat='tag in project.tags' + ) + a.label.label-default.tag-label-name( + href, + ng-click="selectTag(tag)" + ) {{tag.name}} + a.label.label-default.tag-label-remove( + href + ) × + .col-xs-2 span.owner {{ownerName()}} .col-xs-4 diff --git a/services/web/public/stylesheets/app/project-list.less b/services/web/public/stylesheets/app/project-list.less index 3fb8cf6044..6697639078 100644 --- a/services/web/public/stylesheets/app/project-list.less +++ b/services/web/public/stylesheets/app/project-list.less @@ -260,10 +260,24 @@ ul.project-list { margin-left: @line-height-computed / 4; position: relative; top: -2px; - padding-top: 0.25em; display: inline-block; - color: white; } + .tag-label-name, + .tag-label-remove { + display: inline-block; + padding-top: 0.25em; + color: #FFF; + } + .tag-label-name { + padding-right: 0.3em; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + .tag-label-remove { + padding-left: 0.3em; + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } } i.tablesort { padding-left: 8px; From 208f021bd019ea451d4597d07ecf47489ce6d11c Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Mon, 1 May 2017 16:00:25 +0100 Subject: [PATCH 08/10] Actually remove project from tag, inline. --- .../web/app/views/project/list/project-list.pug | 1 + .../main/project-list/project-list.coffee | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/services/web/app/views/project/list/project-list.pug b/services/web/app/views/project/list/project-list.pug index 38159bfc48..eae31a4316 100644 --- a/services/web/app/views/project/list/project-list.pug +++ b/services/web/app/views/project/list/project-list.pug @@ -161,6 +161,7 @@ ) {{tag.name}} a.label.label-default.tag-label-remove( href + ng-click="removeProjectFromTag(project, tag)" ) × .col-xs-2 diff --git a/services/web/public/coffee/main/project-list/project-list.coffee b/services/web/public/coffee/main/project-list/project-list.coffee index 81659983fb..ad9d0f3582 100644 --- a/services/web/public/coffee/main/project-list/project-list.coffee +++ b/services/web/public/coffee/main/project-list/project-list.coffee @@ -201,6 +201,23 @@ define [ # the projects from view $scope.updateVisibleProjects() + $scope.removeProjectFromTag = (project, tag) -> + tag.showWhenEmpty = true + + project.tags ||= [] + index = project.tags.indexOf tag + + if index > -1 + $scope._removeProjectIdsFromTagArray(tag, [ project.id ]) + project.tags.splice(index, 1) + queuedHttp({ + method: "DELETE" + url: "/tag/#{tag._id}/project/#{project.id}" + headers: + "X-CSRF-Token": window.csrfToken + }) + $scope.updateVisibleProjects() + $scope.addSelectedProjectsToTag = (tag) -> selected_projects = $scope.getSelectedProjects() event_tracking.send 'project-list-page-interaction', 'project action', 'addSelectedProjectsToTag' From d71296da9f95fac2440fb304183942e2721330fa Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Mon, 1 May 2017 17:11:03 +0100 Subject: [PATCH 09/10] Add row clicking in the projects list. --- .../web/app/views/project/list/project-list.pug | 9 +++++++-- .../web/public/coffee/directives/selectAll.coffee | 14 ++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/services/web/app/views/project/list/project-list.pug b/services/web/app/views/project/list/project-list.pug index eae31a4316..629c3dc62d 100644 --- a/services/web/app/views/project/list/project-list.pug +++ b/services/web/app/views/project/list/project-list.pug @@ -140,20 +140,25 @@ ng-repeat="project in visibleProjects | orderBy:predicate:reverse", ng-controller="ProjectListItemController" ) - .row + .row(select-row) .col-xs-6 input.select-item( select-individual, type="checkbox", ng-model="project.selected" + stop-propagation="click" ) span - a.projectName(href="/project/{{project.id}}") {{project.name}} + a.projectName( + href="/project/{{project.id}}" + stop-propagation="click" + ) {{project.name}} span( ng-controller="TagListController" ) .tag-label( ng-repeat='tag in project.tags' + stop-propagation="click" ) a.label.label-default.tag-label-name( href, diff --git a/services/web/public/coffee/directives/selectAll.coffee b/services/web/public/coffee/directives/selectAll.coffee index d5be2639e6..6400d2d0ad 100644 --- a/services/web/public/coffee/directives/selectAll.coffee +++ b/services/web/public/coffee/directives/selectAll.coffee @@ -58,4 +58,18 @@ define [ scope.$apply () -> scope.ngModel = false ignoreChanges = false + + scope.$on "select-all:row-clicked", () -> + ignoreChanges = true + scope.$apply () -> + scope.ngModel = !scope.ngModel + ignoreChanges = false + } + + App.directive "selectRow", () -> + return { + scope: true + link: (scope, element, attrs) -> + element.on "click", (e) -> + scope.$broadcast "select-all:row-clicked" } \ No newline at end of file From bf872dc94f8795633d83d905481c8f87a23f30b0 Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Tue, 2 May 2017 12:20:28 +0100 Subject: [PATCH 10/10] Vertically center label text and button. --- services/web/public/stylesheets/app/project-list.less | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/web/public/stylesheets/app/project-list.less b/services/web/public/stylesheets/app/project-list.less index 6697639078..13ca60e181 100644 --- a/services/web/public/stylesheets/app/project-list.less +++ b/services/web/public/stylesheets/app/project-list.less @@ -265,7 +265,7 @@ ul.project-list { .tag-label-name, .tag-label-remove { display: inline-block; - padding-top: 0.25em; + padding-top: 0.3em; color: #FFF; } .tag-label-name {