Explorar o código

Use history label component; restrict label deletion to label owners.

Paulo Reis %!s(int64=8) %!d(string=hai) anos
pai
achega
a8ee879746

+ 35 - 11
services/web/app/views/project/editor/history/entriesListV2.pug

@@ -5,10 +5,12 @@ aside.change-list(
 	history-entries-list(
 	history-entries-list(
 		entries="history.updates"
 		entries="history.updates"
 		current-user="user"
 		current-user="user"
+		users="projectUsers"
 		load-entries="loadMore()"
 		load-entries="loadMore()"
 		load-disabled="history.loading || history.atEnd"
 		load-disabled="history.loading || history.atEnd"
 		load-initialize="ui.view == 'history'"
 		load-initialize="ui.view == 'history'"
 		is-loading="history.loading"
 		is-loading="history.loading"
+		show-only-labelled="listConfig.showOnlyLabelled"
 		on-entry-select="handleEntrySelect(selectedEntry)"
 		on-entry-select="handleEntrySelect(selectedEntry)"
 		on-label-delete="handleLabelDelete(label)"
 		on-label-delete="handleLabelDelete(label)"
 	)
 	)
@@ -116,9 +118,10 @@ script(type="text/ng-template", id="historyEntriesListTpl")
 	)
 	)
 		.infinite-scroll-inner
 		.infinite-scroll-inner
 			history-entry(
 			history-entry(
-				ng-repeat="entry in $ctrl.entries"
+				ng-repeat="entry in $ctrl.entries | filter:$ctrl.shouldShowEntry"
 				entry="entry"
 				entry="entry"
 				current-user="$ctrl.currentUser"
 				current-user="$ctrl.currentUser"
+				users="$ctrl.users"
 				on-select="$ctrl.onEntrySelect({ selectedEntry: selectedEntry })"
 				on-select="$ctrl.onEntrySelect({ selectedEntry: selectedEntry })"
 				on-label-delete="$ctrl.onLabelDelete({ label: label })"
 				on-label-delete="$ctrl.onLabelDelete({ label: label })"
 				ng-show="!$ctrl.isLoading"
 				ng-show="!$ctrl.isLoading"
@@ -143,17 +146,14 @@ script(type="text/ng-template", id="historyEntryTpl")
 		time.history-entry-day(ng-if="::$ctrl.entry.meta.first_in_day") {{ ::$ctrl.entry.meta.end_ts | relativeDate }}
 		time.history-entry-day(ng-if="::$ctrl.entry.meta.first_in_day") {{ ::$ctrl.entry.meta.end_ts | relativeDate }}
 
 
 		.history-entry-details(ng-click="$ctrl.onSelect({ selectedEntry: $ctrl.entry })")
 		.history-entry-details(ng-click="$ctrl.onSelect({ selectedEntry: $ctrl.entry })")
-			.history-entry-label(
-				ng-if="$ctrl.entry.labels.length > 0"
+			history-label(
 				ng-repeat="label in $ctrl.entry.labels"
 				ng-repeat="label in $ctrl.entry.labels"
+				label-text="label.comment"
+				label-owner-name="$ctrl.displayNameById(label.user_id)"
+				label-creation-date-time="label.created_at"
+				is-owned-by-current-user="label.user_id === $ctrl.currentUser.id"
+				on-label-delete="$ctrl.onLabelDelete({ label: label })"
 			)
 			)
-				span.history-entry-label-comment
-					i.fa.fa-tag
-					|  {{ label.comment }}
-				button.history-entry-label-delete-btn(
-					stop-propagation="click"
-					ng-click="$ctrl.onLabelDelete({ label: label })"
-				) ×
 
 
 			ol.history-entry-changes
 			ol.history-entry-changes
 				li.history-entry-change(
 				li.history-entry-change(
@@ -198,4 +198,28 @@ script(type="text/ng-template", id="historyEntryTpl")
 					li.history-entry-metadata-user(ng-if="::$ctrl.entry.meta.users.length == 0")
 					li.history-entry-metadata-user(ng-if="::$ctrl.entry.meta.users.length == 0")
 						span.name(
 						span.name(
 							ng-style="$ctrl.getUserCSSStyle();"
 							ng-style="$ctrl.getUserCSSStyle();"
-						) #{translate("anonymous")}
+						) #{translate("anonymous")}
+
+script(type="text/ng-template", id="historyLabelTpl")
+	.history-entry-label(
+		ng-class="{ 'history-entry-label-own' : $ctrl.isOwnedByCurrentUser }"
+	)
+		span.history-entry-label-comment(
+			tooltip-template="'historyLabelTooltipTpl'"
+			tooltip-placement="left"
+		)
+			i.fa.fa-tag
+			|  {{ $ctrl.labelText }}
+		button.history-entry-label-delete-btn(
+			ng-if="$ctrl.isOwnedByCurrentUser"
+			stop-propagation="click"
+			ng-click="$ctrl.onLabelDelete()"
+		) ×
+
+script(type="text/ng-template", id="historyLabelTooltipTpl")
+	.history-label-tooltip
+		p.history-label-tooltip-title 
+			i.fa.fa-tag
+			|  {{ $ctrl.labelText }}
+		p.history-label-tooltip-owner Created by {{ $ctrl.labelOwnerName }}
+		time.history-label-tooltip-datetime {{ labelCreationDateTime | formatDate }}

+ 1 - 0
services/web/public/coffee/ide/history/HistoryV2Manager.coffee

@@ -12,6 +12,7 @@ define [
 	"ide/history/directives/infiniteScroll"
 	"ide/history/directives/infiniteScroll"
 	"ide/history/components/historyEntriesList"
 	"ide/history/components/historyEntriesList"
 	"ide/history/components/historyEntry"
 	"ide/history/components/historyEntry"
+	"ide/history/components/historyLabel"
 	"ide/history/components/historyFileTree"
 	"ide/history/components/historyFileTree"
 	"ide/history/components/historyFileEntity"
 	"ide/history/components/historyFileEntity"
 ], (moment, ColorManager, displayNameForUser, HistoryViewModes) ->
 ], (moment, ColorManager, displayNameForUser, HistoryViewModes) ->

+ 4 - 0
services/web/public/coffee/ide/history/components/historyEntriesList.coffee

@@ -3,11 +3,14 @@ define [
 ], (App) ->
 ], (App) ->
 	historyEntriesListController = ($scope, $element, $attrs) ->
 	historyEntriesListController = ($scope, $element, $attrs) ->
 		ctrl = @ 
 		ctrl = @ 
+		ctrl.shouldShowEntry = (entry) ->
+			!(ctrl.showOnlyLabelled and entry.labels.length == 0) 
 		return
 		return
 
 
 	App.component "historyEntriesList", {
 	App.component "historyEntriesList", {
 		bindings:
 		bindings:
 			entries: "<"
 			entries: "<"
+			users: "<"
 			loadEntries: "&"
 			loadEntries: "&"
 			loadDisabled: "<"
 			loadDisabled: "<"
 			loadInitialize: "<"
 			loadInitialize: "<"
@@ -15,6 +18,7 @@ define [
 			currentUser: "<"
 			currentUser: "<"
 			onEntrySelect: "&"
 			onEntrySelect: "&"
 			onLabelDelete: "&"
 			onLabelDelete: "&"
+			showOnlyLabelled: "<"
 		controller: historyEntriesListController
 		controller: historyEntriesListController
 		templateUrl: "historyEntriesListTpl"
 		templateUrl: "historyEntriesListTpl"
 	}
 	}

+ 8 - 1
services/web/public/coffee/ide/history/components/historyEntry.coffee

@@ -2,9 +2,15 @@ define [
 	"base"
 	"base"
 	"ide/history/util/displayNameForUser"
 	"ide/history/util/displayNameForUser"
 ], (App, displayNameForUser) ->
 ], (App, displayNameForUser) ->
-	historyEntryController = ($scope, $element, $attrs) ->
+	historyEntryController = ($scope, $element, $attrs, $filter, _) ->
 		ctrl = @
 		ctrl = @
+		_getUserById = (id) ->
+			_.find ctrl.users, (user) ->
+				curUserId = user?._id or user?.id
+				curUserId == id
 		ctrl.displayName = displayNameForUser
 		ctrl.displayName = displayNameForUser
+		ctrl.displayNameById = (id) ->
+			displayNameForUser(_getUserById(id))
 		ctrl.getProjectOpDoc = (projectOp) ->
 		ctrl.getProjectOpDoc = (projectOp) ->
 			if projectOp.rename? then "#{ projectOp.rename.pathname} → #{ projectOp.rename.newPathname }"
 			if projectOp.rename? then "#{ projectOp.rename.pathname} → #{ projectOp.rename.newPathname }"
 			else if projectOp.add? then "#{ projectOp.add.pathname}"
 			else if projectOp.add? then "#{ projectOp.add.pathname}"
@@ -21,6 +27,7 @@ define [
 		bindings:
 		bindings:
 			entry: "<"
 			entry: "<"
 			currentUser: "<"
 			currentUser: "<"
+			users: "<"
 			onSelect: "&"
 			onSelect: "&"
 			onLabelDelete: "&"
 			onLabelDelete: "&"
 		controller: historyEntryController
 		controller: historyEntryController

+ 3 - 0
services/web/public/coffee/ide/history/controllers/HistoryV2ListController.coffee

@@ -5,6 +5,9 @@ define [
 
 
 	App.controller "HistoryV2ListController", ["$scope", "$modal", "ide", ($scope, $modal, ide) ->
 	App.controller "HistoryV2ListController", ["$scope", "$modal", "ide", ($scope, $modal, ide) ->
 		$scope.hoveringOverListSelectors = false
 		$scope.hoveringOverListSelectors = false
+		$scope.listConfig =
+			showOnlyLabelled: false
+		$scope.projectUsers = $scope.project.members.concat $scope.project.owner
 		
 		
 		$scope.loadMore = () =>
 		$scope.loadMore = () =>
 			ide.historyManager.fetchNextBatchOfUpdates()
 			ide.historyManager.fetchNextBatchOfUpdates()

+ 31 - 6
services/web/public/stylesheets/app/editor/history-v2.less

@@ -60,24 +60,32 @@
 		font-size: @font-size-small;
 		font-size: @font-size-small;
 		margin-bottom: 3px;
 		margin-bottom: 3px;
 		margin-right: 10px;
 		margin-right: 10px;
-		&:last-of-type {
-			margin-right: 0;
-		}
+		white-space: nowrap;
 		.history-entry-selected & {
 		.history-entry-selected & {
 			color: @history-entry-selected-label-color;
 			color: @history-entry-selected-label-color;
 		}
 		}
 	}
 	}
 		.history-entry-label-comment,
 		.history-entry-label-comment,
 		.history-entry-label-delete-btn {
 		.history-entry-label-delete-btn {
-			display: inline-block;
-			padding: 0 (@padding-xs-horizontal / 2) 1px @padding-xs-horizontal;
+			padding: 0 @padding-xs-horizontal 1px @padding-xs-horizontal;
 			border: 0;
 			border: 0;
 			background-color: @history-entry-label-bg-color;
 			background-color: @history-entry-label-bg-color;
-			border-radius: 9999px 0 0 9999px;
 			.history-entry-selected & {
 			.history-entry-selected & {
 				background-color: @history-entry-selected-label-bg-color;
 				background-color: @history-entry-selected-label-bg-color;
 			}
 			}
 		}
 		}
+		.history-entry-label-comment {
+			display: block;
+			float: left;
+			border-radius: 9999px;
+			max-width: 190px;
+			overflow: hidden;
+			text-overflow: ellipsis;
+			.history-entry-label-own & {
+				padding-right: (@padding-xs-horizontal / 2);
+				border-radius: 9999px 0 0 9999px;
+			}
+		}
 		.history-entry-label-delete-btn {
 		.history-entry-label-delete-btn {
 			padding-left: (@padding-xs-horizontal / 2);
 			padding-left: (@padding-xs-horizontal / 2);
 			padding-right: @padding-xs-horizontal;
 			padding-right: @padding-xs-horizontal;
@@ -90,6 +98,23 @@
 			}
 			}
 		}
 		}
 
 
+	.history-label-tooltip {
+		white-space: normal;
+		padding: (@line-height-computed / 4);
+		text-align: left;
+	}
+		.history-label-tooltip-title,
+		.history-label-tooltip-owner,
+		.history-label-tooltip-datetime {
+			margin: 0 0 (@line-height-computed / 4) 0;
+		}  
+		.history-label-tooltip-title {
+			font-weight: bold;
+		}
+		.history-label-tooltip-datetime {
+			margin-bottom: 0;
+		}
+
 	.history-entry-changes {
 	.history-entry-changes {
 		.list-unstyled;
 		.list-unstyled;
 		margin-bottom: 3px;
 		margin-bottom: 3px;