+ * redirectUrlsResource.searchRedirectUrls("", 0, 20)
+ * .then(function(response) {
+ *
+ * });
+ *
+ * @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
+ *
+ * redirectUrlsResource.deleteRedirectUrl(1234)
+ * .then(function() {
+ *
+ * });
+ *
+ * @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
+ *
+ * redirectUrlsResource.toggleUrlTracker(true)
+ * .then(function() {
+ *
+ * });
+ *
+ * @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);
+
+})();
diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-packages.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-packages.less
index cfbf425bef..f14df918c0 100644
--- a/src/Umbraco.Web.UI.Client/src/less/components/umb-packages.less
+++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-packages.less
@@ -331,6 +331,11 @@
width: 100%;
}
+.umb-era-button.umb-button--s {
+ height: 30px;
+ font-size: 13px;
+}
+
/* CATEGORIES */
diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-table.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-table.less
index 874f9e9551..219c15c7d5 100644
--- a/src/Umbraco.Web.UI.Client/src/less/components/umb-table.less
+++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-table.less
@@ -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%);
diff --git a/src/Umbraco.Web.UI.Client/src/views/dashboard/developer/redirecturls.controller.js b/src/Umbraco.Web.UI.Client/src/views/dashboard/developer/redirecturls.controller.js
new file mode 100644
index 0000000000..8af12709a9
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/views/dashboard/developer/redirecturls.controller.js
@@ -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);
+})();
diff --git a/src/Umbraco.Web.UI.Client/src/views/dashboard/developer/redirecturls.html b/src/Umbraco.Web.UI.Client/src/views/dashboard/developer/redirecturls.html
new file mode 100644
index 0000000000..fe6424424a
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/views/dashboard/developer/redirecturls.html
@@ -0,0 +1,99 @@
+