Skip to content

Commit ef7386b

Browse files
committed
refactor
1 parent 729940d commit ef7386b

File tree

13 files changed

+478
-268
lines changed

13 files changed

+478
-268
lines changed

ui/package-lock.json

Lines changed: 357 additions & 169 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ui/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
"npm-check-updates": "^6.0.1",
6161
"nprogress": "^0.2.0",
6262
"qrious": "^4.0.2",
63+
"semver": "^7.6.3",
6364
"vue": "^3.2.31",
6465
"vue-chartjs": "^4.0.7",
6566
"vue-clipboard2": "^0.3.1",

ui/public/config.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
}
99
],
1010
"docBase": "http://docs.cloudstack.apache.org/en/latest",
11+
"alertMessage": "",
12+
"alertMessageType": "info",
1113
"appTitle": "CloudStack",
1214
"footer": "Licensed under the <a href='http://www.apache.org/licenses/' target='_blank'>Apache License</a>, Version 2.0.",
1315
"loginTitle": "CloudStack",

ui/public/locales/en.json

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1446,6 +1446,7 @@
14461446
"label.network.offering": "Network offering",
14471447
"label.network.offerings": "Network offerings",
14481448
"label.network.policy": "Network Policy",
1449+
"label.network.restart.required": "Network restart required",
14491450
"label.network.route.table": "Network route table",
14501451
"label.network.routing.policy": "Network routing policy",
14511452
"label.network.permissions": "Network permissions",
@@ -1476,6 +1477,7 @@
14761477
"label.new.secondaryip.description": "Enter new secondary IP address",
14771478
"label.new.tag": "New tag",
14781479
"label.new.vm": "New Instance",
1480+
"label.new.version.available": "New version available",
14791481
"label.newdiskoffering": "New offering",
14801482
"label.newinstance": "New Instance",
14811483
"label.newname": "New name",
@@ -2463,6 +2465,7 @@
24632465
"label.vpc.id": "VPC ID",
24642466
"label.vpc.offerings": "VPC offerings",
24652467
"label.vpc.virtual.router": "VPC virtual router",
2468+
"label.vpc.restart.required": "VPC restart required",
24662469
"label.vpcid": "VPC",
24672470
"label.vpclimit": "VPC limits",
24682471
"label.vpcname": "VPC",
@@ -3185,6 +3188,7 @@
31853188
"message.network.offering.mac.learning.warning": "WARNING: In order to use MAC Learning you must ensure your hypervisor hosts are running ESXi 6.7+ and the Network uses distributed vSwitch 6.6.0+.",
31863189
"message.network.offering.promiscuous.mode": "Applicable for guest Networks on VMware hypervisor only.\nReject - The switch drops any outbound frame from a virtual machine adapter with a source MAC address that is different from the one in the .vmx configuration file.\nAccept - The switch does not perform filtering, and permits all outbound frames.\nNone - Default to value from global setting.",
31873190
"message.network.removenic": "Please confirm that want to remove this NIC, which will also remove the associated Network from the Instance.",
3191+
"message.network.restart.required": "Restart is required for network(s). Click here to view network(s) which require restart.",
31883192
"message.network.secondaryip": "Please confirm that you would like to acquire a new secondary IP for this NIC. \n NOTE: You need to manually configure the newly-acquired secondary IP inside the virtual machine.",
31893193
"message.network.selection": "Choose one or more Networks to attach the Instance to.",
31903194
"message.network.selection.new.network": "A new Network can also be created here.",
@@ -3197,8 +3201,6 @@
31973201
"message.no.description": "No description entered.",
31983202
"message.offering.internet.protocol.warning": "WARNING: IPv6 supported Networks use static routing and will require upstream routes to be configured manually.",
31993203
"message.offering.ipv6.warning": "Please refer documentation for creating IPv6 enabled Network/VPC offering <a href='http://docs.cloudstack.apache.org/en/latest/plugins/ipv6.html#isolated-network-and-vpc-tier'>IPv6 support in CloudStack - Isolated Networks and VPC Network Tiers</a>",
3200-
"message.restart.required.network": "Restart is required for network(s). Click here to view network(s) which require restart.",
3201-
"message.restart.required.vpc": "Restart is required for VPC(s). Click here to view VPC(s) which require restart.",
32023204
"message.ovf.configurations": "OVF configurations available for the selected appliance. Please select the desired value. Incompatible compute offerings will get disabled.",
32033205
"message.path.description": "NFS: exported path from the server. VMFS: /datacenter name/datastore name. SharedMountPoint: path where primary storage is mounted, such as /mnt/primary.",
32043206
"message.please.confirm.remove.ssh.key.pair": "Please confirm that you want to remove this SSH key pair.",
@@ -3529,6 +3531,7 @@
35293531
"message.volume.state.primary.storage.suitability": "The suitability of a primary storage for a volume depends on the disk offering of the volume and on the virtual machine allocation (if the volume is attached to a virtual machine).",
35303532
"message.volumes.managed": "Volumes controlled by CloudStack.",
35313533
"message.volumes.unmanaged": "Volumes not controlled by CloudStack.",
3534+
"message.vpc.restart.required": "Restart is required for VPC(s). Click here to view VPC(s) which require restart.",
35323535
"message.vr.alert.upon.network.offering.creation.l2": "As virtual routers are not created for L2 Networks, the compute offering will not be used.",
35333536
"message.vr.alert.upon.network.offering.creation.others": "As none of the obligatory services for creating a virtual router (VPN, DHCP, DNS, Firewall, LB, UserData, SourceNat, StaticNat, PortForwarding) are enabled, the virtual router will not be created and the compute offering will not be used.",
35343537
"message.warn.change.primary.storage.scope": "This feature is tested and supported for the following configurations:<br>KVM - NFS/Ceph - DefaultPrimary<br>VMware - NFS - DefaultPrimary<br>*There might be extra steps involved to make it work for other configurations.",

ui/src/components/header/HeaderNotice.vue

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,12 @@
4747
</a-avatar>
4848
</template>
4949
<template #description>
50-
<span v-if="getResourceName(notice.description, 'name') && notice.path">
51-
<router-link :to="{ path: notice.path}"> {{ getResourceName(notice.description, "name") + ' - ' }}</router-link>
50+
<span v-if="getResourceName(notice.description, 'name') && notice.path && !['VPC_RESTART_REQUIRED', 'NETWORK_RESTART_REQUIRED'].includes(notice.key)">
51+
<router-link :to="{ path: notice.path}">{{ getResourceName(notice.description, "name") + ' - ' }}</router-link>
52+
{{ getResourceName(notice.description, "msg") }}</span>
53+
<span v-else-if="notice.path && ['VPC_RESTART_REQUIRED', 'NETWORK_RESTART_REQUIRED'].includes(notice.key)">
54+
<router-link :to="{ path: notice.path, query: notice.query }">{{ notice.description }}</router-link>
5255
</span>
53-
<span v-if="getResourceName(notice.description, 'name') && notice.path"> {{ getResourceName(notice.description, "msg") }}</span>
5456
<span v-else>{{ notice.description }}</span>
5557
</template>
5658
</a-list-item-meta>

ui/src/components/page/GlobalFooter.vue

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,15 @@
2222
</div>
2323
<div class="line" v-if="$store.getters.userInfo.roletype === 'Admin'">
2424
CloudStack {{ $store.getters.features.cloudstackversion }}
25+
<span v-if="showVersionUpdate()">
26+
<a-divider type="vertical" />
27+
<a
28+
:href="'https://github.com/apache/cloudstack/releases/tag/' + $store.getters.latestVersion.version"
29+
target="_blank">
30+
<info-circle-outlined />
31+
{{ $t('label.new.version.available') + ': ' + $store.getters.latestVersion.version }}
32+
</a>
33+
</span>
2534
<a-divider type="vertical" />
2635
<a href="https://github.com/apache/cloudstack/discussions" target="_blank">
2736
<github-outlined />
@@ -32,11 +41,24 @@
3241
</template>
3342

3443
<script>
44+
import semver from 'semver'
45+
import { getParsedVersion } from '@/utils/util'
46+
3547
export default {
3648
name: 'LayoutFooter',
3749
data () {
3850
return {
3951
}
52+
},
53+
methods: {
54+
showVersionUpdate () {
55+
if (this.$store.getters?.features?.cloudstackversion && this.$store.getters?.latestVersion?.version) {
56+
const currentVersion = getParsedVersion(this.$store.getters?.features?.cloudstackversion)
57+
const latestVersion = getParsedVersion(this.$store.getters?.latestVersion?.version)
58+
return semver.gt(latestVersion, currentVersion)
59+
}
60+
return false
61+
}
4062
}
4163
}
4264
</script>

ui/src/components/page/GlobalLayout.vue

Lines changed: 26 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -17,54 +17,29 @@
1717

1818
<template>
1919
<div>
20-
<a-affix v-if="numberOfAlerts > 0" >
20+
<a-affix v-if="getNumberOfAlerts() > 0" >
2121
<a-alert
22-
v-if="this.$store.getters.shutdownTriggered"
23-
:message="$t('message.shutdown.triggered')"
24-
type="error"
25-
banner
22+
v-if="this.$config.alertMessage && this.$config.alertMessage !== ''"
23+
:type="this.$config.alertMessageType ? this.$config.alertMessageType : 'info'"
2624
:showIcon="false"
27-
class="alertHeader" />
28-
29-
<a-alert
30-
v-if="newVersionAvailable"
31-
type="info"
3225
banner
33-
:showIcon="true"
34-
class="alertHeader">
35-
<template #message>
36-
<a :href="'https://github.com/apache/cloudstack/releases/tag/' + this.$store.getters.latestVersion.version" target="_blank">
37-
{{ $t('message.new.version.available') }}: {{ this.$store.getters.latestVersion.version }}
38-
</a>
39-
</template>
40-
</a-alert>
41-
42-
<a-alert
43-
v-if="this.$store.getters.networkRestartRequired"
44-
type="warning"
45-
:showIcon="true"
4626
class="alertHeader">
4727
<template #message>
48-
<router-link to="/guestnetwork?restartrequired=true">
49-
{{ $t('message.restart.required.network') }}
50-
</router-link>
28+
<span v-html="$config.alertMessage"></span>
5129
</template>
52-
</a-alert>
30+
</a-alert>
5331

5432
<a-alert
55-
v-if="this.$store.getters.vpcRestartRequired"
56-
type="warning"
57-
:showIcon="true"
58-
class="alertHeader">
59-
<template #message>
60-
<router-link to="/vpc?restartrequired=true">
61-
{{ $t('message.restart.required.vpc') }}
62-
</router-link>
63-
</template>
64-
</a-alert>
33+
v-if="this.$store.getters.shutdownTriggered"
34+
:message="$t('message.shutdown.triggered')"
35+
type="error"
36+
banner
37+
:showIcon="false"
38+
class="alertHeader" />
39+
6540
</a-affix>
6641
<a-layout class="layout" :class="[device]">
67-
<a-affix style="z-index: 200" :offsetTop="numberOfAlerts * 25">
42+
<a-affix style="z-index: 200" :offsetTop="this.getNumberOfAlerts() * 25">
6843
<template v-if="isSideMenu()">
6944
<a-drawer
7045
v-if="isMobile()"
@@ -127,7 +102,7 @@
127102
<!-- layout header -->
128103
<a-affix style="z-index: 100">
129104
<global-header
130-
:style="'margin-top: ' + numberOfAlerts * 25 + 'px;'"
105+
:style="'margin-top: ' + this.getNumberOfAlerts() * 25 + 'px;'"
131106
:mode="layoutMode"
132107
:menus="menus"
133108
:theme="navTheme"
@@ -168,7 +143,6 @@ import { triggerWindowResizeEvent } from '@/utils/util'
168143
import { mapState, mapActions } from 'vuex'
169144
import { mixin, mixinDevice } from '@/utils/mixin.js'
170145
import { isAdmin } from '@/role'
171-
import { numberOfAlerts, newVersionAvailable } from '@/store/modules/user'
172146
import { api } from '@/api'
173147
import Drawer from '@/components/widgets/Drawer'
174148
import Setting from '@/components/view/Setting.vue'
@@ -188,7 +162,8 @@ export default {
188162
collapsed: false,
189163
menus: [],
190164
showSetting: false,
191-
showClear: false
165+
showClear: false,
166+
numberOfAlerts: 0
192167
}
193168
},
194169
computed: {
@@ -198,12 +173,6 @@ export default {
198173
isAdmin () {
199174
return isAdmin()
200175
},
201-
numberOfAlerts () {
202-
return numberOfAlerts()
203-
},
204-
newVersionAvailable () {
205-
return newVersionAvailable()
206-
},
207176
isDevelopmentMode () {
208177
return process.env.NODE_ENV === 'development'
209178
},
@@ -310,6 +279,16 @@ export default {
310279
api('readyForShutdown', {}).then(json => {
311280
this.$store.dispatch('SetShutdownTriggered', json.readyforshutdownresponse.readyforshutdown.shutdowntriggered || false)
312281
})
282+
},
283+
getNumberOfAlerts () {
284+
let count = 0
285+
if (this.$store.getters.shutdownTriggered) {
286+
count++
287+
}
288+
if (this.$config.alertMessage && this.$config.alertMessage !== '') {
289+
count++
290+
}
291+
return count
313292
}
314293
}
315294
}

ui/src/components/view/ListView.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@
9191
<router-link :to="{ path: $route.path + '/' + record.id }" v-if="record.id">{{ text }}</router-link>
9292
<router-link :to="{ path: $route.path + '/' + record.name }" v-else>{{ text }}</router-link>
9393
<span v-if="['guestnetwork','vpc'].includes($route.path.split('/')[1]) && record.restartrequired">
94+
&nbsp;
9495
<a-tooltip>
9596
<template #title>{{ $t('label.restartrequired') }}</template>
9697
<warning-outlined style="color: #f5222d"/>

ui/src/store/getters.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,6 @@ const getters = {
2828
apis: state => state.user.apis,
2929
features: state => state.user.features,
3030
userInfo: state => state.user.info,
31-
networkRestartRequired: state => state.user.networkRestartRequired,
32-
vpcRestartRequired: state => state.user.vpcRestartRequired,
3331
latestVersion: state => state.user.latestVersion,
3432
addRouters: state => state.permission.addRouters,
3533
multiTab: state => state.app.multiTab,

0 commit comments

Comments
 (0)