Merge branch 'temp-U4-8802' into dev-v7

# Conflicts:
#	src/Umbraco.Web/Routing/RedirectTrackingEventHandler.cs
#	src/Umbraco.Web/Umbraco.Web.csproj
This commit is contained in:
Sebastiaan Janssen
2016-08-08 16:34:45 +02:00
18 changed files with 624 additions and 25 deletions

View File

@@ -0,0 +1,119 @@
/**
* @ngdoc service
* @name umbraco.resources.redirectUrlResource
* @function
*
* @description
* Used by the redirect url dashboard to get urls and send requests to remove redirects.
*/
(function() {
'use strict';
function redirectUrlsResource($http, umbRequestHelper) {
/**
* @ngdoc function
* @name umbraco.resources.redirectUrlResource#searchRedirectUrls
* @methodOf umbraco.resources.redirectUrlResource
* @function
*
* @description
* Called to search redirects
* ##usage
* <pre>
* redirectUrlsResource.searchRedirectUrls("", 0, 20)
* .then(function(response) {
*
* });
* </pre>
* @param {String} searchTerm Searh term
* @param {Int} pageIndex index of the page to retrive items from
* @param {Int} pageSize The number of items on a page
*/
function searchRedirectUrls(searchTerm, pageIndex, pageSize) {
return umbRequestHelper.resourcePromise(
$http.get(
umbRequestHelper.getApiUrl(
"redirectUrlManagementApiBaseUrl",
"SearchRedirectUrls",
{ searchTerm: searchTerm, pageIndex: pageIndex, pageSize: pageSize })),
'Failed to retrieve data for searching redirect urls');
}
function isEnabled() {
return umbRequestHelper.resourcePromise(
$http.get(
umbRequestHelper.getApiUrl(
"redirectUrlManagementApiBaseUrl",
"IsEnabled")),
'Failed to retrieve data to check if the 301 redirect is enabled');
}
/**
* @ngdoc function
* @name umbraco.resources.redirectUrlResource#deleteRedirectUrl
* @methodOf umbraco.resources.redirectUrlResource
* @function
*
* @description
* Called to delete a redirect
* ##usage
* <pre>
* redirectUrlsResource.deleteRedirectUrl(1234)
* .then(function() {
*
* });
* </pre>
* @param {Int} id Id of the redirect
*/
function deleteRedirectUrl(id) {
return umbRequestHelper.resourcePromise(
$http.post(
umbRequestHelper.getApiUrl(
"redirectUrlManagementApiBaseUrl",
"DeleteRedirectUrl", { id: id })),
'Failed to remove redirect');
}
/**
* @ngdoc function
* @name umbraco.resources.redirectUrlResource#toggleUrlTracker
* @methodOf umbraco.resources.redirectUrlResource
* @function
*
* @description
* Called to enable or disable redirect url tracker
* ##usage
* <pre>
* redirectUrlsResource.toggleUrlTracker(true)
* .then(function() {
*
* });
* </pre>
* @param {Bool} disable true/false to disable/enable the url tracker
*/
function toggleUrlTracker(disable) {
return umbRequestHelper.resourcePromise(
$http.post(
umbRequestHelper.getApiUrl(
"redirectUrlManagementApiBaseUrl",
"ToggleUrlTracker", { disable: disable })),
'Failed to toggle redirect url tracker');
}
var resource = {
searchRedirectUrls: searchRedirectUrls,
deleteRedirectUrl: deleteRedirectUrl,
toggleUrlTracker: toggleUrlTracker,
isEnabled: isEnabled
};
return resource;
}
angular.module('umbraco.resources').factory('redirectUrlsResource', redirectUrlsResource);
})();

View File

@@ -331,6 +331,11 @@
width: 100%;
}
.umb-era-button.umb-button--s {
height: 30px;
font-size: 13px;
}
/* CATEGORIES */

View File

@@ -3,6 +3,8 @@
display: flex;
flex-direction: column;
position: relative;
border: 1px solid @grayLight;
flex-wrap: nowrap;
@@ -11,6 +13,25 @@
min-width: 640px;
}
.umb-table.umb-table-inactive {
&:before {
content: "";
background: rgba(255, 255, 255, 0.75);
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
z-index: 10;
outline: 1px solid rgba(255, 255, 255, 0.75);
}
}
.umb-table a {
text-decoration: none;
cursor: pointer;
@@ -93,6 +114,14 @@ input.umb-table__input {
}
}
.umb-table-body .umb-table-row.-solid {
cursor: default;
&:hover {
background-color: white;
}
}
.umb-table-body__link {
text-decoration: none;
@@ -183,6 +212,8 @@ input.umb-table__input {
user-select: none;
}
.umb-table-row.-selected,
.umb-table-row.-selected:hover {
background-color: fade(@blueDark, 4%);

View File

@@ -0,0 +1,144 @@
(function() {
"use strict";
function RedirectUrlsController($scope, redirectUrlsResource, notificationsService, $q) {
//...todo
//search by url or url part
//search by domain
//display domain in dashboard results?
//used to cancel any request in progress if another one needs to take it's place
var vm = this;
var canceler = null;
vm.dashboard = {
searchTerm: "",
loading: false,
urlTrackerDisabled: false
};
vm.pagination = {
pageIndex: 0,
pageNumber: 1,
totalPages: 1,
pageSize: 20
};
vm.goToPage = goToPage;
vm.search = search;
vm.removeRedirect = removeRedirect;
vm.disableUrlTracker = disableUrlTracker;
vm.enableUrlTracker = enableUrlTracker;
vm.filter = filter;
vm.checkEnabled = checkEnabled;
function activate() {
vm.checkEnabled().then(function() {
vm.search();
});
}
function checkEnabled() {
vm.dashboard.loading = true;
return redirectUrlsResource.isEnabled().then(function (response) {
vm.dashboard.urlTrackerDisabled = response !== "true";
vm.dashboard.loading = false;
});
}
function goToPage(pageNumber) {
vm.pagination.pageIndex = pageNumber - 1;
vm.pagination.pageNumber = pageNumber;
vm.search();
}
function search() {
vm.dashboard.loading = true;
var searchTerm = vm.dashboard.searchTerm;
if (searchTerm === undefined) {
searchTerm = "";
}
redirectUrlsResource.searchRedirectUrls(searchTerm, vm.pagination.pageIndex, vm.pagination.pageSize).then(function(response) {
vm.redirectUrls = response.searchResults;
// update pagination
vm.pagination.pageIndex = response.currentPage;
vm.pagination.pageNumber = response.currentPage + 1;
vm.pagination.totalPages = response.pageCount;
vm.dashboard.loading = false;
});
}
function removeRedirect(redirectToDelete) {
redirectUrlsResource.deleteRedirectUrl(redirectToDelete.redirectId).then(function () {
var index = vm.redirectUrls.indexOf(redirectToDelete);
vm.redirectUrls.splice(index, 1);
notificationsService.success("Redirect Url Removed!", "Redirect Url " + redirectToDelete.Url + " has been deleted");
}, function(error) {
notificationsService.error("Redirect Url Error!", "Redirect Url " + redirectToDelete.Url + " was not deleted");
});
}
function disableUrlTracker() {
var toggleConfirm = confirm("Are you sure you want to disable the URL tracker?");
if (toggleConfirm) {
redirectUrlsResource.toggleUrlTracker(true).then(function() {
activate();
notificationsService.success("URL Tracker has now been disabled");
}, function(error) {
notificationsService.warning("Error disabling the URL Tracker, more information can be found in your log file.");
});
}
}
function enableUrlTracker() {
redirectUrlsResource.toggleUrlTracker(false).then(function() {
activate();
notificationsService.success("URL Tracker has now been enabled");
}, function(error) {
notificationsService.warning("Error enabling the URL Tracker, more information can be found in your log file.");
});
}
var filterDebounced = _.debounce(function(e) {
$scope.$apply(function() {
//a canceler exists, so perform the cancelation operation and reset
if (canceler) {
canceler.resolve();
canceler = $q.defer();
} else {
canceler = $q.defer();
}
vm.search();
});
}, 200);
function filter() {
filterDebounced();
}
activate();
}
angular.module("umbraco").controller("Umbraco.Dashboard.RedirectUrlsController", RedirectUrlsController);
})();

View File

@@ -0,0 +1,99 @@
<div class="redirecturlsearch" ng-controller="Umbraco.Dashboard.RedirectUrlsController as vm">
<umb-load-indicator ng-if="vm.dashboard.loading"></umb-load-indicator>
<umb-editor-sub-header>
<umb-editor-sub-header-content-right>
<umb-editor-sub-header-section>
<button
ng-if="vm.dashboard.urlTrackerDisabled === false"
type="button"
class="umb-era-button umb-button--s"
ng-click="vm.disableUrlTracker()">
<span>Disable URL Tracker</span>
</button>
<button
ng-if="vm.dashboard.urlTrackerDisabled === true"
type="button"
class="umb-era-button umb-button--s -blue"
ng-click="vm.enableUrlTracker()">
<span>Enable URL Tracker</span>
</button>
</umb-editor-sub-header-section>
<umb-editor-sub-header-section ng-if="vm.dashboard.urlTrackerDisabled === false">
<input
class="-full-width-input"
placeholder="Search for redirect"
ng-model="vm.dashboard.searchTerm"
ng-change="vm.filter()"
no-dirty-check>
</umb-editor-sub-header-section>
</umb-editor-sub-header-content-right>
</umb-editor-sub-header>
<div class="umb-table" ng-class="{'umb-table-inactive': vm.dashboard.urlTrackerDisabled === true}">
<div class="umb-table-head">
<div class="umb-table-row">
<div class="umb-table-cell"></div>
<div class="umb-table-cell">Original Url</div>
<div class="umb-table-cell">Redirected To</div>
<div class="umb-table-cell">Date Created</div>
<div class="umb-table-cell"></div>
</div>
</div>
<div class="umb-table-body">
<div class="umb-table-row -solid" ng-repeat="redirectUrl in vm.redirectUrls">
<div class="umb-table-cell">
<i class="umb-table-body__icon umb-table-body__fileicon icon-shuffle"></i>
</div>
<div class="umb-table-cell">
<a class="umb-table-body__link" href="{{redirectUrl.originalUrl}}" target="_blank" title="{{redirectUrl.originalUrl}}">{{redirectUrl.originalUrl}}</a>
</div>
<div class="umb-table-cell">
<a class="umb-table-body__link" href="{{redirectUrl.destinationUrl}}" target="_blank" title="{{redirectUrl.destinationUrl}}">{{redirectUrl.destinationUrl}}</a>
</div>
<div class="umb-table-cell">
{{redirectUrl.createDateUtc | date:'medium'}}
</div>
<div class="umb-table-cell justify-end">
<a href="/umbraco/#/content/content/edit/{{redirectUrl.contentId}}" class="umb-era-button -gray umb-button--s" style="margin-right: 10px;">Edit</a>
<button class="umb-era-button -gray umb-button--s" ng-click="vm.removeRedirect(redirectUrl)">Remove</button>
</div>
</div>
</div>
</div>
<div class="flex justify-center items-center">
<umb-pagination
ng-if="vm.pagination.totalPages > 1 && !vm.dashboard.loading"
page-number="vm.pagination.pageNumber"
total-pages="vm.pagination.totalPages"
on-next="vm.goToPage"
on-prev="vm.goToPage"
on-go-to-page="vm.goToPage">
</umb-pagination>
</div>
</div>