Skip to content

Commit 0b82b64

Browse files
authored
Merge pull request #46 from trikoder/new-tab
2 parents afb7144 + 0664d48 commit 0b82b64

File tree

9 files changed

+73
-36
lines changed

9 files changed

+73
-36
lines changed

.github/workflows/ci.yml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,6 @@ on:
33
push:
44
branches:
55
- master
6-
pull_request:
7-
branches:
8-
- master
96
jobs:
107
Documentation:
118
permissions:

documentation/changelog.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
# Changelog
22

3+
## 0.83.0
4+
* Allow opening in new tab for common controls
5+
36
## 0.82.0
47
* Use proper close icon reference
58
* Add style presentation as buttton for mass action with only one option

src/js/components/mainNavigation.vue

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
:href="item.url"
2929
:class="['item', item.icon ? 'icon' + item.icon : '', {selected: item.selected}]"
3030
:title="item.caption"
31-
@click.prevent="openItem(item)"
31+
@click="openItem(item, $event)"
3232
>
3333
{{ item.caption }}
3434
<span v-if="!item.icon" class="initials">{{ item.initials }}</span>
@@ -57,7 +57,7 @@
5757
:href="subItem.url"
5858
:class="['item', {selected: subItem.selected}]"
5959
:title="subItem.caption"
60-
@click.prevent="openItem(subItem)"
60+
@click="openItem(subItem, $event)"
6161
>
6262
{{ subItem.caption }}
6363
</a>
@@ -83,7 +83,7 @@
8383
class="item"
8484
:href="item.url"
8585
v-html="item.caption"
86-
@click.prevent="openUserItem(item)"
86+
@click="openUserItem(item, $event)"
8787
></a>
8888
<button
8989
v-else
@@ -107,7 +107,7 @@
107107
</template>
108108

109109
<script>
110-
import {pickTo} from '../library/toolkit.js';
110+
import {pickTo, isNewTabClick} from '../library/toolkit.js';
111111
import vueDismiss from '../dependencies/vue-dismiss/index.js';
112112
import serviceContainer from '../library/serviceContainer.js';
113113
import {GlobalEvents} from 'vue-global-events';
@@ -234,7 +234,15 @@ export default {
234234
235235
},
236236
237-
openItem(item) {
237+
openItem(item, event) {
238+
239+
if (isNewTabClick(event)) {
240+
return;
241+
}
242+
243+
if (event) {
244+
event.preventDefault();
245+
}
238246
239247
if (item.action) {
240248
item.action(this);
@@ -288,7 +296,15 @@ export default {
288296
289297
},
290298
291-
openUserItem(item) {
299+
openUserItem(item, event) {
300+
301+
if (isNewTabClick(event)) {
302+
return;
303+
}
304+
305+
if (event) {
306+
event.preventDefault();
307+
}
292308
293309
if (item.action) {
294310
item.action(this);

src/js/components/resourceControls.vue

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
<template>
22
<nav class="resourceControls" v-if="parsedControls.length">
3-
<template v-for="(control, index) in parsedControls">
3+
<template v-for="(control, index) in parsedControls" :key="control.caption + index">
44
<div
55
v-if="control.isDropdown"
6-
:key="control.caption + index"
76
class="dropdownControls"
87
:class="{active: control.active, accentedAdjecent: control.accentedAdjecent}"
98
v-on-dismiss="{callback: () => closeDropdown(control), watch: control.active}"
@@ -31,21 +30,19 @@
3130
<a
3231
v-else-if="control.url"
3332
:href="control.url"
34-
:key="control.caption + index"
3533
:class="control.className"
3634
:title="control.caption"
37-
@click.prevent="runControlAction(control)"
35+
@click="runControlAction(control, $event)"
3836
>
3937
<span>{{ control.caption }}</span>
4038
</a>
4139
<button
4240
v-else
4341
class="nBtn"
4442
type="button"
45-
:key="control.caption + index"
4643
:class="control.className"
4744
:title="control.caption"
48-
@click.prevent="runControlAction(control)"
45+
@click="runControlAction(control, $event)"
4946
>
5047
<span>{{ control.caption }}</span>
5148
</button>
@@ -56,7 +53,7 @@
5653
<script>
5754
5855
import translate from '../library/translate.js';
59-
import {assign} from '../library/toolkit.js';
56+
import {assign, isNewTabClick} from '../library/toolkit.js';
6057
import vueDismiss from '../dependencies/vue-dismiss/index.js';
6158
import screenSize from '../mixins/screenSize.js';
6259
@@ -119,9 +116,16 @@ export default {
119116
120117
},
121118
122-
runControlAction(config) {
119+
runControlAction(config, event) {
123120
124-
config.action.call(config.actionContext);
121+
if (isNewTabClick(event)) {
122+
// do nothing
123+
} else {
124+
if (event) {
125+
event.preventDefault();
126+
}
127+
config.action.call(config.actionContext);
128+
}
125129
126130
},
127131

src/js/components/resourceHeader.vue

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,17 @@
22
<header class="headerType1" :class={hasBottomBorder}>
33
<h1 class="projectCaption">{{ projectCaption }}</h1>
44
<h2 v-if="breadcrumbs.length" class="title">
5-
<template v-for="(breadcrumb, index) in breadcrumbs">
5+
<template v-for="(breadcrumb, index) in breadcrumbs" :key="breadcrumb.caption">
66
<a
77
v-if="breadcrumb.url"
8-
:key="breadcrumb.caption"
98
:href="breadcrumb.url"
109
:class="{iconChevronRight: index + 1 < breadcrumbs.length}"
11-
@click.prevent="clickBreadcrumb(breadcrumb)"
10+
@click="clickBreadcrumb(breadcrumb, $event)"
1211
>
1312
{{ breadcrumb.caption }}
1413
</a>
1514
<span
1615
v-else
17-
:key="breadcrumb.caption"
1816
:class="{iconChevronRight: index + 1 < breadcrumbs.length}"
1917
>
2018
{{ breadcrumb.caption }}
@@ -26,6 +24,7 @@
2624
</template>
2725

2826
<script>
27+
import {isNewTabClick} from '../library/toolkit.js';
2928
3029
export default {
3130
@@ -46,11 +45,15 @@ export default {
4645
4746
methods: {
4847
49-
clickBreadcrumb(breadcrumb) {
48+
clickBreadcrumb(breadcrumb, e) {
5049
51-
if (breadcrumb.action) {
50+
if (isNewTabClick(e)) {
51+
// do nothing
52+
} else if (breadcrumb.action) {
53+
e.preventDefault();
5254
breadcrumb.action();
5355
} else if (breadcrumb.url) {
56+
e.preventDefault();
5457
this.$router.navigateTo(breadcrumb.url);
5558
}
5659

src/js/components/resourcePagination.vue

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
v-if="currentPage !== 1"
2828
class="iconArrowLeft icon page icr"
2929
:href="getUrlForPage(currentPage - 1)"
30-
@click.prevent="selectPage(currentPage - 1)"
30+
@click="selectPage(currentPage - 1, $event)"
3131
>
3232
{{ currentPage - 1 }}
3333
</a>
@@ -38,7 +38,7 @@
3838
<a
3939
:class="['page', {selected: 1 == currentPage}]"
4040
:href="getUrlForPage(1)"
41-
@click.prevent="selectPage(1)"
41+
@click="selectPage(1, $event)"
4242
>1</a>
4343
</li>
4444

@@ -51,7 +51,7 @@
5151
<a
5252
:class="['page', {selected: page == currentPage}]"
5353
:href="getUrlForPage(page)"
54-
@click.prevent="selectPage(page)"
54+
@click="selectPage(page, $event)"
5555
>{{ page }}</a>
5656
</li>
5757

@@ -64,7 +64,7 @@
6464
<a
6565
:class="['page', {selected: totalPages === currentPage}]"
6666
:href="getUrlForPage(totalPages)"
67-
@click.prevent="selectPage(totalPages)"
67+
@click="selectPage(totalPages, $event)"
6868
>{{ totalPages }}</a>
6969
</li>
7070

@@ -73,7 +73,7 @@
7373
v-if="currentPage < totalPages"
7474
class="iconArrowRight page icon icr"
7575
:href="getUrlForPage(currentPage + 1)"
76-
@click.prevent="selectPage(currentPage + 1)"
76+
@click="selectPage(currentPage + 1, $event)"
7777
>{{ currentPage + 1 }}
7878
</a>
7979
<button v-else class="iconArrowRight disabled icon icr"></button>
@@ -88,7 +88,7 @@
8888
8989
import userPreferences from '../library/userPreferences.js';
9090
import translate from '../library/translate.js';
91-
import {range} from '../library/toolkit.js';
91+
import {range, isNewTabClick} from '../library/toolkit.js';
9292
import bootData from '../library/bootData.js';
9393
import screenSize from '../mixins/screenSize.js';
9494
@@ -172,9 +172,16 @@ const Pagination = {
172172
173173
},
174174
175-
selectPage(page) {
175+
selectPage(page, event) {
176176
177-
this.$emit('pageRequest', page);
177+
if (isNewTabClick(event)) {
178+
// do nothing
179+
} else {
180+
if (event) {
181+
event.preventDefault();
182+
}
183+
this.$emit('pageRequest', page);
184+
}
178185
179186
}
180187

src/js/layouts/adminDefault.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ export default {
110110
this.currentControllerType = ControllerType;
111111
}
112112
113-
if (controller.method) {
113+
if (controller.method && this.$refs.currentController[controller.method]) {
114114
115115
this.$nextTick(() => {
116116
this.$refs.currentController[controller.method](

src/js/library/toolkit.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,3 +329,9 @@ export function getComponentInitialValue(Component, options = {}) {
329329
}
330330

331331
}
332+
333+
export function isNewTabClick(event) {
334+
return event
335+
? Boolean(event.ctrlKey || event.metaKey || event.which === 2)
336+
: false;
337+
}

src/js/listElements/link.vue

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
<script>
1313
1414
import base from './base.js';
15-
import {result} from '../library/toolkit.js';
15+
import {result, isNewTabClick} from '../library/toolkit.js';
1616
1717
export default {
1818
@@ -52,7 +52,9 @@ export default {
5252
5353
handleClick(e) {
5454
55-
if (this.action) {
55+
if (isNewTabClick(e)) {
56+
// do nothing
57+
} else if (this.action) {
5658
e.preventDefault();
5759
this.action(this.resourceModel, e);
5860
} else if (!this.isExternalLink) {
@@ -65,7 +67,6 @@ export default {
6567
}
6668
6769
};
68-
6970
</script>
7071

7172
<style lang="scss" scoped>

0 commit comments

Comments
 (0)