From 8eff38e29ba9e9326fc460b231925de927aa412f Mon Sep 17 00:00:00 2001 From: yl09099 <33595968+yl09099@users.noreply.github.com> Date: Sun, 16 Jun 2024 00:19:40 +0800 Subject: [PATCH] [#1778] improvement(dashboard): Dashboard adds the ability to automatically format code. (#1779) ### What changes were proposed in this pull request? Introducing the front-end eslint code validation tool and formatting the front-end code. ### Why are the changes needed? Fix: #1778 ### Does this PR introduce _any_ user-facing change? No. ### How was this patch tested? Existential test. --- .../common}/web/resource/BaseResource.java | 4 +- .../common/web/resource}/Response.java | 2 +- .../web/resource/AdminResource.java | 3 +- .../web/resource/ApplicationResource.java | 3 +- .../resource/CoordinatorServerResource.java | 3 +- .../web/resource/ServerResource.java | 3 +- .../web/UniffleServicesRESTTest.java | 2 +- .../web/resource/CoordinatorResource.java | 3 + .../dashboard/web/resource/Response.java | 70 ------------ dashboard/src/main/webapp/.eslintignore | 21 ++++ .../BaseResource.java => webapp/.eslintrc.js} | 31 +++-- dashboard/src/main/webapp/.prettierrc.json | 25 +++++ dashboard/src/main/webapp/babel.config.js | 4 +- dashboard/src/main/webapp/jsconfig.json | 11 +- dashboard/src/main/webapp/package.json | 33 ++---- .../main/webapp/packagescript/cleanfile.js | 12 +- .../main/webapp/packagescript/fileutils.js | 106 +++++++++--------- dashboard/src/main/webapp/public/index.html | 15 ++- dashboard/src/main/webapp/src/App.vue | 2 +- dashboard/src/main/webapp/src/api/api.js | 54 ++++----- .../main/webapp/src/components/LayoutPage.vue | 44 ++++---- dashboard/src/main/webapp/src/main.js | 10 +- .../main/webapp/src/pages/ApplicationPage.vue | 48 ++++---- .../src/pages/CoordinatorServerPage.vue | 59 +++++----- .../webapp/src/pages/ShuffleServerPage.vue | 40 ++++--- .../pages/serverstatus/ActiveNodeListPage.vue | 67 ++++++----- .../DecommissionednodeListPage.vue | 69 +++++++----- .../DecommissioningNodeListPage.vue | 71 +++++++----- .../pages/serverstatus/ExcludeNodeList.vue | 22 ++-- .../src/pages/serverstatus/LostNodeList.vue | 71 +++++++----- .../serverstatus/UnhealthyNodeListPage.vue | 70 +++++++----- dashboard/src/main/webapp/src/router/index.js | 98 +++++++++------- .../webapp/src/store/useCurrentServerStore.js | 8 +- dashboard/src/main/webapp/src/utils/common.js | 26 ++--- dashboard/src/main/webapp/src/utils/http.js | 63 +++++------ .../src/main/webapp/src/utils/request.js | 66 ++++++----- dashboard/src/main/webapp/vue.config.js | 24 ++-- .../test/CoordinatorAdminServiceTest.java | 2 +- .../org/apache/uniffle/test/ServletTest.java | 2 +- 39 files changed, 659 insertions(+), 608 deletions(-) rename {coordinator/src/main/java/org/apache/uniffle/coordinator => common/src/main/java/org/apache/uniffle/common}/web/resource/BaseResource.java (91%) rename {coordinator/src/main/java/org/apache/uniffle/coordinator/web => common/src/main/java/org/apache/uniffle/common/web/resource}/Response.java (97%) delete mode 100644 dashboard/src/main/java/org/apache/uniffle/dashboard/web/resource/Response.java create mode 100644 dashboard/src/main/webapp/.eslintignore rename dashboard/src/main/{java/org/apache/uniffle/dashboard/web/resource/BaseResource.java => webapp/.eslintrc.js} (61%) create mode 100644 dashboard/src/main/webapp/.prettierrc.json diff --git a/coordinator/src/main/java/org/apache/uniffle/coordinator/web/resource/BaseResource.java b/common/src/main/java/org/apache/uniffle/common/web/resource/BaseResource.java similarity index 91% rename from coordinator/src/main/java/org/apache/uniffle/coordinator/web/resource/BaseResource.java rename to common/src/main/java/org/apache/uniffle/common/web/resource/BaseResource.java index 861f91bae7..0e5d3cb79c 100644 --- a/coordinator/src/main/java/org/apache/uniffle/coordinator/web/resource/BaseResource.java +++ b/common/src/main/java/org/apache/uniffle/common/web/resource/BaseResource.java @@ -15,12 +15,10 @@ * limitations under the License. */ -package org.apache.uniffle.coordinator.web.resource; +package org.apache.uniffle.common.web.resource; import java.util.concurrent.Callable; -import org.apache.uniffle.coordinator.web.Response; - public abstract class BaseResource { protected Response execute(Callable callable) { try { diff --git a/coordinator/src/main/java/org/apache/uniffle/coordinator/web/Response.java b/common/src/main/java/org/apache/uniffle/common/web/resource/Response.java similarity index 97% rename from coordinator/src/main/java/org/apache/uniffle/coordinator/web/Response.java rename to common/src/main/java/org/apache/uniffle/common/web/resource/Response.java index 3313459afe..25e21c753a 100644 --- a/coordinator/src/main/java/org/apache/uniffle/coordinator/web/Response.java +++ b/common/src/main/java/org/apache/uniffle/common/web/resource/Response.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.uniffle.coordinator.web; +package org.apache.uniffle.common.web.resource; public class Response { private static final int SUCCESS_CODE = 0; diff --git a/coordinator/src/main/java/org/apache/uniffle/coordinator/web/resource/AdminResource.java b/coordinator/src/main/java/org/apache/uniffle/coordinator/web/resource/AdminResource.java index d895c1df21..63daef6da2 100644 --- a/coordinator/src/main/java/org/apache/uniffle/coordinator/web/resource/AdminResource.java +++ b/coordinator/src/main/java/org/apache/uniffle/coordinator/web/resource/AdminResource.java @@ -28,10 +28,11 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.apache.uniffle.common.web.resource.BaseResource; +import org.apache.uniffle.common.web.resource.Response; import org.apache.uniffle.coordinator.AccessManager; import org.apache.uniffle.coordinator.ServerNode; import org.apache.uniffle.coordinator.access.checker.AccessChecker; -import org.apache.uniffle.coordinator.web.Response; @Produces({MediaType.APPLICATION_JSON}) public class AdminResource extends BaseResource { diff --git a/coordinator/src/main/java/org/apache/uniffle/coordinator/web/resource/ApplicationResource.java b/coordinator/src/main/java/org/apache/uniffle/coordinator/web/resource/ApplicationResource.java index 7c621c5b4d..7106d66d1a 100644 --- a/coordinator/src/main/java/org/apache/uniffle/coordinator/web/resource/ApplicationResource.java +++ b/coordinator/src/main/java/org/apache/uniffle/coordinator/web/resource/ApplicationResource.java @@ -30,8 +30,9 @@ import org.apache.hbase.thirdparty.javax.ws.rs.core.Context; import org.apache.hbase.thirdparty.javax.ws.rs.core.MediaType; +import org.apache.uniffle.common.web.resource.BaseResource; +import org.apache.uniffle.common.web.resource.Response; import org.apache.uniffle.coordinator.ApplicationManager; -import org.apache.uniffle.coordinator.web.Response; import org.apache.uniffle.coordinator.web.vo.AppInfoVO; import org.apache.uniffle.coordinator.web.vo.UserAppNumVO; diff --git a/coordinator/src/main/java/org/apache/uniffle/coordinator/web/resource/CoordinatorServerResource.java b/coordinator/src/main/java/org/apache/uniffle/coordinator/web/resource/CoordinatorServerResource.java index f6822366c3..e09d3dbdcd 100644 --- a/coordinator/src/main/java/org/apache/uniffle/coordinator/web/resource/CoordinatorServerResource.java +++ b/coordinator/src/main/java/org/apache/uniffle/coordinator/web/resource/CoordinatorServerResource.java @@ -31,10 +31,11 @@ import org.apache.hbase.thirdparty.javax.ws.rs.core.MediaType; import org.apache.uniffle.common.util.RssUtils; +import org.apache.uniffle.common.web.resource.BaseResource; +import org.apache.uniffle.common.web.resource.Response; import org.apache.uniffle.coordinator.CoordinatorConf; import org.apache.uniffle.coordinator.CoordinatorServer; import org.apache.uniffle.coordinator.util.CoordinatorUtils; -import org.apache.uniffle.coordinator.web.Response; import org.apache.uniffle.coordinator.web.vo.CoordinatorConfVO; import static org.apache.uniffle.common.config.RssBaseConf.JETTY_HTTP_PORT; diff --git a/coordinator/src/main/java/org/apache/uniffle/coordinator/web/resource/ServerResource.java b/coordinator/src/main/java/org/apache/uniffle/coordinator/web/resource/ServerResource.java index f30027f11d..d78796adfb 100644 --- a/coordinator/src/main/java/org/apache/uniffle/coordinator/web/resource/ServerResource.java +++ b/coordinator/src/main/java/org/apache/uniffle/coordinator/web/resource/ServerResource.java @@ -39,10 +39,11 @@ import org.apache.uniffle.common.Application; import org.apache.uniffle.common.ServerStatus; +import org.apache.uniffle.common.web.resource.BaseResource; +import org.apache.uniffle.common.web.resource.Response; import org.apache.uniffle.coordinator.ApplicationManager; import org.apache.uniffle.coordinator.ClusterManager; import org.apache.uniffle.coordinator.ServerNode; -import org.apache.uniffle.coordinator.web.Response; import org.apache.uniffle.coordinator.web.request.ApplicationRequest; import org.apache.uniffle.coordinator.web.request.CancelDecommissionRequest; import org.apache.uniffle.coordinator.web.request.DecommissionRequest; diff --git a/coordinator/src/test/java/org/apache/uniffle/coordinator/web/UniffleServicesRESTTest.java b/coordinator/src/test/java/org/apache/uniffle/coordinator/web/UniffleServicesRESTTest.java index 95e40332bf..badd8a246f 100644 --- a/coordinator/src/test/java/org/apache/uniffle/coordinator/web/UniffleServicesRESTTest.java +++ b/coordinator/src/test/java/org/apache/uniffle/coordinator/web/UniffleServicesRESTTest.java @@ -46,7 +46,7 @@ import org.apache.uniffle.coordinator.GenericTestUtils; import org.apache.uniffle.coordinator.web.request.ApplicationRequest; -import static org.apache.uniffle.coordinator.web.Response.fail; +import static org.apache.uniffle.common.web.resource.Response.fail; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; diff --git a/dashboard/src/main/java/org/apache/uniffle/dashboard/web/resource/CoordinatorResource.java b/dashboard/src/main/java/org/apache/uniffle/dashboard/web/resource/CoordinatorResource.java index 2aed5ca0d3..e563e66b28 100644 --- a/dashboard/src/main/java/org/apache/uniffle/dashboard/web/resource/CoordinatorResource.java +++ b/dashboard/src/main/java/org/apache/uniffle/dashboard/web/resource/CoordinatorResource.java @@ -26,6 +26,9 @@ import org.apache.hbase.thirdparty.javax.ws.rs.core.Context; import org.apache.hbase.thirdparty.javax.ws.rs.core.MediaType; +import org.apache.uniffle.common.web.resource.BaseResource; +import org.apache.uniffle.common.web.resource.Response; + @Produces({MediaType.APPLICATION_JSON}) public class CoordinatorResource extends BaseResource { diff --git a/dashboard/src/main/java/org/apache/uniffle/dashboard/web/resource/Response.java b/dashboard/src/main/java/org/apache/uniffle/dashboard/web/resource/Response.java deleted file mode 100644 index ef71a320b7..0000000000 --- a/dashboard/src/main/java/org/apache/uniffle/dashboard/web/resource/Response.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.uniffle.dashboard.web.resource; - -public class Response { - private static final int SUCCESS_CODE = 0; - private static final int ERROR_CODE = -1; - private int code; - private T data; - private String msg; - - public Response() {} - - public Response(int code, T data, String msg) { - this.code = code; - this.data = data; - this.msg = msg; - } - - public static Response success(T data) { - return new Response<>(SUCCESS_CODE, data, "success"); - } - - public static Response fail(String msg) { - return new Response<>(ERROR_CODE, null, msg); - } - - public static Response fail(String msg, int code) { - return new Response<>(code, null, msg); - } - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - public T getData() { - return data; - } - - public void setData(T data) { - this.data = data; - } - - public String getErrMsg() { - return msg; - } - - public void setErrMsg(String errMsg) { - this.msg = errMsg; - } -} diff --git a/dashboard/src/main/webapp/.eslintignore b/dashboard/src/main/webapp/.eslintignore new file mode 100644 index 0000000000..fd399c8725 --- /dev/null +++ b/dashboard/src/main/webapp/.eslintignore @@ -0,0 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +/node_modules +/package-lock.json +/dist +.DS_Store diff --git a/dashboard/src/main/java/org/apache/uniffle/dashboard/web/resource/BaseResource.java b/dashboard/src/main/webapp/.eslintrc.js similarity index 61% rename from dashboard/src/main/java/org/apache/uniffle/dashboard/web/resource/BaseResource.java rename to dashboard/src/main/webapp/.eslintrc.js index 5ed1973023..71e913eecd 100644 --- a/dashboard/src/main/java/org/apache/uniffle/dashboard/web/resource/BaseResource.java +++ b/dashboard/src/main/webapp/.eslintrc.js @@ -15,22 +15,19 @@ * limitations under the License. */ -package org.apache.uniffle.dashboard.web.resource; - -import java.util.concurrent.Callable; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public abstract class BaseResource { - private static final Logger LOG = LoggerFactory.getLogger(BaseResource.class); - - protected Response execute(Callable callable) { - try { - return Response.success(callable.call()); - } catch (Throwable e) { - LOG.error("Call failure:", e); - return Response.fail(e.getMessage()); - } +module.exports = { + env: { + browser: true, + commonjs: true, + es2021: true, + node: true + }, + extends: ['plugin:vue/essential', 'standard', '@vue/prettier'], + parserOptions: { + ecmaVersion: 13 + }, + plugins: ['vue'], + rules: { + quotes: [2, 'single'] } } diff --git a/dashboard/src/main/webapp/.prettierrc.json b/dashboard/src/main/webapp/.prettierrc.json new file mode 100644 index 0000000000..03b19d2466 --- /dev/null +++ b/dashboard/src/main/webapp/.prettierrc.json @@ -0,0 +1,25 @@ +{ + "___asflicense__": [ + "", + "Licensed to the Apache Software Foundation (ASF) under one", + "or more contributor license agreements. See the NOTICE file", + "distributed with this work for additional information", + "regarding copyright ownership. The ASF licenses this file", + "to you under the Apache License, Version 2.0 (the", + "\"License\"); you may not use this file except in compliance", + "with the License. You may obtain a copy of the License at", + "", + " http://www.apache.org/licenses/LICENSE-2.0", + "", + "Unless required by applicable law or agreed to in writing, software", + "distributed under the License is distributed on an \"AS IS\" BASIS,", + "WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.", + "See the License for the specific language governing permissions and", + "limitations under the License." + ], + "semi": false, + "tabWidth": 2, + "singleQuote": true, + "printWidth": 100, + "trailingComma": "none" +} diff --git a/dashboard/src/main/webapp/babel.config.js b/dashboard/src/main/webapp/babel.config.js index 0b134436be..8f440e2115 100644 --- a/dashboard/src/main/webapp/babel.config.js +++ b/dashboard/src/main/webapp/babel.config.js @@ -16,7 +16,5 @@ */ module.exports = { - presets: [ - '@vue/cli-plugin-babel/preset' - ] + presets: ['@vue/cli-plugin-babel/preset'] } diff --git a/dashboard/src/main/webapp/jsconfig.json b/dashboard/src/main/webapp/jsconfig.json index bb01e412c4..ee50273037 100644 --- a/dashboard/src/main/webapp/jsconfig.json +++ b/dashboard/src/main/webapp/jsconfig.json @@ -23,15 +23,8 @@ "baseUrl": "./", "moduleResolution": "node", "paths": { - "@/*": [ - "src/*" - ] + "@/*": ["src/*"] }, - "lib": [ - "esnext", - "dom", - "dom.iterable", - "scripthost" - ] + "lib": ["esnext", "dom", "dom.iterable", "scripthost"] } } diff --git a/dashboard/src/main/webapp/package.json b/dashboard/src/main/webapp/package.json index 0ab9bfba47..ad6e8bbfca 100644 --- a/dashboard/src/main/webapp/package.json +++ b/dashboard/src/main/webapp/package.json @@ -44,31 +44,18 @@ "@vue/cli-plugin-babel": "~5.0.0", "@vue/cli-plugin-eslint": "~5.0.0", "@vue/cli-service": "^5.0.8", - "eslint": "^7.32.0", - "eslint-plugin-vue": "^8.0.3", + "@vue/eslint-config-prettier": "^9.0.0", + "eslint": "^8.57.0", + "eslint-config-standard": "^17.1.0", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-n": "^16.6.2", + "eslint-plugin-prettier": "^5.1.3", + "eslint-plugin-promise": "^6.2.0", + "eslint-plugin-vue": "^9.26.0", "node-sass": "^9.0.0", + "prettier": "^3.3.2", "sass-loader": "^13.3.1", "vue-loader": "^17.2.2", "vue-template-compiler": "^2.7.14" - }, - "eslintConfig": { - "root": true, - "env": { - "node": true - }, - "extends": [ - "plugin:vue/vue3-essential", - "eslint:recommended" - ], - "parserOptions": { - "parser": "@babel/eslint-parser" - }, - "rules": {} - }, - "browserslist": [ - "> 1%", - "last 2 versions", - "not dead", - "not ie 11" - ] + } } diff --git a/dashboard/src/main/webapp/packagescript/cleanfile.js b/dashboard/src/main/webapp/packagescript/cleanfile.js index e7cad78b5b..bd4af60cfd 100644 --- a/dashboard/src/main/webapp/packagescript/cleanfile.js +++ b/dashboard/src/main/webapp/packagescript/cleanfile.js @@ -22,12 +22,12 @@ const nodeModulesPath = p.join(__dirname, '../node_modules') const lockJsonPath = p.join(__dirname, '../package-lock.json') if (fs.existsSync(nodeModulesPath)) { - const fileUtil = require('./fileutils') + const fileUtil = require('./fileutils') - //fileUtil.deleteFolderByRimraf(nodeModulesPath) - fileUtil.deleteFolder(nodeModulesPath) - console.log('Deleted node_modules successfully!') + // fileUtil.deleteFolderByRimraf(nodeModulesPath) + fileUtil.deleteFolder(nodeModulesPath) + console.log('Deleted node_modules successfully!') - fileUtil.deleteFile(lockJsonPath) - console.log('Delete package-lock.json successfully!') + fileUtil.deleteFile(lockJsonPath) + console.log('Delete package-lock.json successfully!') } diff --git a/dashboard/src/main/webapp/packagescript/fileutils.js b/dashboard/src/main/webapp/packagescript/fileutils.js index 221d1c9d1b..7021b3d4fe 100644 --- a/dashboard/src/main/webapp/packagescript/fileutils.js +++ b/dashboard/src/main/webapp/packagescript/fileutils.js @@ -16,44 +16,44 @@ */ const fs = require('fs') -const pathName = require("path"); +const pathName = require('path') /** * Delete folder * @param path Path of the folder to be deleted */ -function deleteFolder (path) { - let files = []; - if (fs.existsSync(path)) { - if (fs.statSync(path).isDirectory()) { - files = fs.readdirSync(path) - files.forEach((file) => { - const curPath = path + '/' + file; - if (fs.statSync(curPath).isDirectory()) { - deleteFolder(curPath) - } else { - fs.unlinkSync(curPath) - } - }) - fs.rmdirSync(path) +function deleteFolder(path) { + let files = [] + if (fs.existsSync(path)) { + if (fs.statSync(path).isDirectory()) { + files = fs.readdirSync(path) + files.forEach((file) => { + const curPath = path + '/' + file + if (fs.statSync(curPath).isDirectory()) { + deleteFolder(curPath) } else { - fs.unlinkSync(path) + fs.unlinkSync(curPath) } + }) + fs.rmdirSync(path) + } else { + fs.unlinkSync(path) } + } } /** * Delete file * @param path Path of the file to be deleted */ -function deleteFile (path) { - if (fs.existsSync(path)) { - if (fs.statSync(path).isDirectory()) { - deleteFolder(path) - } else { - fs.unlinkSync(path) - } +function deleteFile(path) { + if (fs.existsSync(path)) { + if (fs.statSync(path).isDirectory()) { + deleteFolder(path) + } else { + fs.unlinkSync(path) } + } } /** @@ -61,43 +61,43 @@ function deleteFile (path) { * @param from Source directory * @param to Target directory */ -function copyFolder (from, to) { - let files = [] - // Whether the file exists If it does not exist, it is created - if (fs.existsSync(to)) { - files = fs.readdirSync(from) - files.forEach((file) => { - const targetPath = from + '/' + file; - const toPath = to + '/' + file; +function copyFolder(from, to) { + let files = [] + // Whether the file exists If it does not exist, it is created + if (fs.existsSync(to)) { + files = fs.readdirSync(from) + files.forEach((file) => { + const targetPath = from + '/' + file + const toPath = to + '/' + file - // Copy folder - if (fs.statSync(targetPath).isDirectory()) { - copyFolder(targetPath, toPath) - } else { - // Copy file - fs.copyFileSync(targetPath, toPath) - } - }) - } else { - mkdirsSync(to) - copyFolder(from, to) - } + // Copy folder + if (fs.statSync(targetPath).isDirectory()) { + copyFolder(targetPath, toPath) + } else { + // Copy file + fs.copyFileSync(targetPath, toPath) + } + }) + } else { + mkdirsSync(to) + copyFolder(from, to) + } } // Create a directory synchronization method recursively function mkdirsSync(dirname) { - if (fs.existsSync(dirname)) { - return true; - } else { - if (mkdirsSync(pathName.dirname(dirname))) { - fs.mkdirSync(dirname); - return true; - } + if (fs.existsSync(dirname)) { + return true + } else { + if (mkdirsSync(pathName.dirname(dirname))) { + fs.mkdirSync(dirname) + return true } + } } module.exports = { - deleteFolder, - deleteFile, - copyFolder + deleteFolder, + deleteFile, + copyFolder } diff --git a/dashboard/src/main/webapp/public/index.html b/dashboard/src/main/webapp/public/index.html index d703f0fe3a..6d36f664eb 100644 --- a/dashboard/src/main/webapp/public/index.html +++ b/dashboard/src/main/webapp/public/index.html @@ -15,18 +15,21 @@ ~ limitations under the License. --> - + - - - - + + + + <%= htmlWebpackPlugin.options.title %>
diff --git a/dashboard/src/main/webapp/src/App.vue b/dashboard/src/main/webapp/src/App.vue index deaa982ad1..1eb251396e 100644 --- a/dashboard/src/main/webapp/src/App.vue +++ b/dashboard/src/main/webapp/src/App.vue @@ -20,7 +20,7 @@