Skip to content

Commit 553c1d6

Browse files
committed
refactor: "Redirect To" links on the **Redirects** page are no longer relative, so they will work with non-standard Craft URL setups ([#341](#341))
1 parent 3230e4c commit 553c1d6

File tree

4 files changed

+63
-25
lines changed

4 files changed

+63
-25
lines changed
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
<template>
2+
<div>
3+
<a
4+
:href="fullRedirectDestUrl"
5+
:title="redirectDestUrl"
6+
class="go"
7+
rel="noopener"
8+
target="_blank"
9+
>{{ redirectDestUrl }}</a>
10+
</div>
11+
</template>
12+
13+
<script>
14+
import DOMPurify from "dompurify";
15+
16+
export default {
17+
props: {
18+
rowData: {
19+
type: Object,
20+
required: true
21+
},
22+
rowIndex: {
23+
type: Number,
24+
default: 0
25+
}
26+
},
27+
computed: {
28+
redirectDestUrl: function () {
29+
let value = this.rowData.redirectDestUrl;
30+
if (value === '') {
31+
return '';
32+
}
33+
value = DOMPurify.sanitize(value);
34+
value = encodeURI(value);
35+
return value;
36+
},
37+
fullRedirectDestUrl: function () {
38+
let url = this.redirectDestUrl;
39+
let absoluteUrl = new RegExp('^(?:[a-z]+:)?//', 'i');
40+
if (!absoluteUrl.test(url) && !url.includes('$')) {
41+
// If the incoming URL has a leading /, Craft won't try to make a full URL out of it
42+
url = Craft.getUrl(url.replace(/^\/+/g, ''), null, this.rowData.siteBaseUrl);
43+
}
44+
return url;
45+
}
46+
}
47+
}
48+
</script>

buildchain/src/vue/RedirectsFieldDefs.js

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,11 @@ export default [
1414
dataClass: 'center vuetable-td-redirectSrcUrl',
1515
},
1616
{
17-
name: 'redirectDestUrl',
17+
name: '__component:redirect-to-url',
1818
sortField: 'redirectDestUrl',
1919
title: Craft.t('retour', 'Redirect To'),
20-
titleClass: 'center',
21-
dataClass: 'center',
22-
callback: 'urlFormatter'
20+
titleClass: 'center vuetable-th-redirectDestUrl',
21+
dataClass: 'center vuetable-td-redirectDestUrl',
2322
},
2423
{
2524
name: 'redirectMatchType',

buildchain/src/vue/RedirectsTable.vue

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
:initial-filter-text="filterText"
5050
/>
5151
<div class="vuetable-pagination clearafter">
52-
<vuetable-pagination-info ref="paginationInfoTop" />
52+
<vuetable-pagination-info ref="paginationInfoTop"/>
5353

5454
<div class="floated left vuetable-pagination-info py-3">
5555
<div class="inline pl-3 text-gray-600">
@@ -99,7 +99,7 @@
9999
@vuetable:pagination-data="onPaginationData"
100100
/>
101101
<div class="vuetable-pagination clearafter border-solid">
102-
<vuetable-pagination-info ref="paginationInfo" />
102+
<vuetable-pagination-info ref="paginationInfo"/>
103103
<vuetable-pagination
104104
ref="pagination"
105105
@vuetable-pagination:change-page="onChangePage"
@@ -111,17 +111,18 @@
111111
<script>
112112
import FieldDefs from '@/vue/RedirectsFieldDefs.js';
113113
import LegacyUrl from '@/vue/LegacyUrl.vue';
114+
import RedirectToUrl from '@/vue/RedirectToUrl.vue';
114115
import VueTable from 'vuetable-2/src/components/Vuetable.vue';
115116
import VueTablePagination from '@/vue/VuetablePagination.vue';
116117
import VueTablePaginationInfo from '@/vue/VuetablePaginationInfo.vue';
117118
import VueTableFilterBar from '@/vue/VuetableFilterBar.vue';
118119
import saveState from 'vue-save-state';
119-
import DOMPurify from 'dompurify';
120120
import PriorityValue from '@/vue/PriorityValue.vue';
121121
122122
// Make the PriorityValue component globally available
123123
Vue.component('PriorityValue', PriorityValue);
124124
Vue.component('LegacyUrl', LegacyUrl);
125+
Vue.component('RedirectToUrl', RedirectToUrl);
125126
// Our component exports
126127
export default {
127128
components: {
@@ -194,7 +195,7 @@ export default {
194195
},
195196
methods: {
196197
getSaveStateConfig() {
197-
const cacheKey = 'retour-redirects-state-v2-' + Craft.username + Craft.siteId;
198+
const cacheKey = 'retour-redirects-state-v3-' + Craft.username + Craft.siteId;
198199
return {
199200
'cacheKey': cacheKey,
200201
'ignoreProperties': ['numSelected', 'selectedIds', 'moreParams'],
@@ -247,21 +248,6 @@ export default {
247248
248249
return label;
249250
},
250-
urlFormatter(value) {
251-
if (value === '') {
252-
return '';
253-
}
254-
value = DOMPurify.sanitize(value);
255-
value = encodeURI(value);
256-
let url = value;
257-
let absoluteUrl = new RegExp('^(?:[a-z]+:)?//', 'i');
258-
if (!absoluteUrl.test(url) && !url.includes('$')) {
259-
url = Craft.getSiteUrl(url);
260-
}
261-
return `
262-
<a class="go" href="${url}" title="${url}" target="_blank" rel="noopener">${value}</a>
263-
`;
264-
},
265251
deleteRedirectFormatter(value) {
266252
if (value === '') {
267253
return '';

src/controllers/TablesController.php

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -259,15 +259,20 @@ public function actionRedirects(
259259
$redirect['redirectDestUrl'] = '';
260260
}
261261
}
262-
// Handle extracting the site name
262+
// Handle extracting the site name and base URL
263263
$redirect['siteName'] = Craft::t('retour', 'All Sites');
264+
$sites = Craft::$app->getSites();
265+
$site = null;
264266
if ($redirect['siteId']) {
265-
$sites = Craft::$app->getSites();
266267
$site = $sites->getSiteById($redirect['siteId']);
267268
if ($site) {
268269
$redirect['siteName'] = $site->name;
269270
}
270271
}
272+
if (!$site) {
273+
$site = $sites->getPrimarySite();
274+
}
275+
$redirect['siteBaseUrl'] = $site->getBaseUrl();
271276

272277
$redirect['editLink'] = UrlHelper::cpUrl('retour/edit-redirect/' . $redirect['id']);
273278
}

0 commit comments

Comments
 (0)