This is an automated email from the ASF dual-hosted git repository.

yasith pushed a commit to branch feat/sdk-facade-migration
in repository https://gitbox.apache.org/repos/asf/airavata-portals.git

commit 8369f6fe85024a159b4794814c95cf1596cc93c0
Author: yasithdev <[email protected]>
AuthorDate: Wed Apr 8 00:43:29 2026 -0500

    build: replace Webpack with Vite across all frontend apps
    
    - Replace vue.config.js/webpack.config.js with vite.config.js for all 8 apps
    - Update all package.json: remove webpack/babel/vue-cli deps, add vite + 
@vitejs/plugin-vue
    - Replace django-webpack-loader with django-vite in requirements.txt and 
settings.py
    - Update WEBPACK_LOADER config to DJANGO_VITE config in settings.py
    - Convert all Django HTML templates from {% render_bundle %} to {% 
vite_asset %}
    - Add entry_point context variable to all views for Vite asset resolution
    - Remove all babel.config.js files (Vite uses esbuild)
    - Update base.html Bootstrap 4 data-toggle/ml-*/sr-only to BS5 equivalents
---
 .../django_airavata/apps/admin/babel.config.js     |   3 -
 .../django_airavata/apps/admin/package.json        |  96 ++++-------------
 .../apps/admin/templates/admin/admin_base.html     |  15 ++-
 .../django_airavata/apps/admin/vite.config.js      |  26 +++++
 .../django_airavata/apps/admin/vue.config.js       |  24 -----
 .../django_airavata/apps/api/babel.config.js       |  21 ----
 .../django_airavata/apps/api/package.json          |  44 ++------
 .../django_airavata/apps/api/vite.config.js        |  14 +++
 .../django_airavata/apps/api/webpack.config.js     |  11 --
 .../django_airavata/apps/auth/babel.config.js      |   3 -
 .../django_airavata/apps/auth/package.json         |  55 +++-------
 .../auth/templates/django_airavata_auth/base.html  |  16 +--
 .../django_airavata/apps/auth/views.py             |   3 +-
 .../django_airavata/apps/auth/vite.config.js       |  28 +++++
 .../django_airavata/apps/auth/vue.config.js        |  28 -----
 .../apps/dataparsers/babel.config.js               |   3 -
 .../django_airavata/apps/dataparsers/package.json  |  55 ++--------
 .../django_airavata_dataparsers/base.html          |  15 +--
 .../django_airavata/apps/dataparsers/views.py      |  15 ++-
 .../apps/dataparsers/vite.config.js                |  36 +++++++
 .../django_airavata/apps/dataparsers/vue.config.js |  32 ------
 .../django_airavata/apps/groups/babel.config.js    |   3 -
 .../django_airavata/apps/groups/package.json       |  55 ++--------
 .../templates/django_airavata_groups/base.html     |  13 +--
 .../django_airavata/apps/groups/views.py           |  11 +-
 .../django_airavata/apps/groups/vite.config.js     |  36 +++++++
 .../django_airavata/apps/groups/vue.config.js      |  32 ------
 .../django_airavata/apps/workspace/babel.config.js |   3 -
 .../babel.config.js                                |   3 -
 .../package.json                                   |  52 ++--------
 .../vite.config.js                                 |  19 ++++
 .../vue.config.js                                  |   5 -
 .../django_airavata/apps/workspace/package.json    |  90 ++++------------
 .../templates/django_airavata_workspace/base.html  |  13 +--
 .../django_airavata_workspace/dashboard.html       |   2 -
 .../django_airavata/apps/workspace/views.py        |  22 +++-
 .../django_airavata/apps/workspace/vite.config.js  |  63 ++++++++++++
 .../django_airavata/apps/workspace/vue.config.js   |  51 ---------
 .../django_airavata/dynamic_apps/__init__.py       |   6 +-
 airavata-django-portal/django_airavata/settings.py | 114 ++++++++-------------
 .../django_airavata/static/common/babel.config.js  |   3 -
 .../django_airavata/static/common/package.json     |  75 ++++----------
 .../django_airavata/static/common/vite.config.js   |  23 +++++
 .../django_airavata/static/common/vue.config.js    |  29 ------
 .../django_airavata/templates/base.html            |  39 ++++---
 .../django_airavata/templates/includes/head.html   |   3 +-
 .../django_airavata/templates/wagtail_base.html    |   5 +-
 airavata-django-portal/requirements.txt            |   2 +-
 48 files changed, 484 insertions(+), 831 deletions(-)

diff --git a/airavata-django-portal/django_airavata/apps/admin/babel.config.js 
b/airavata-django-portal/django_airavata/apps/admin/babel.config.js
deleted file mode 100644
index 162a3ea97..000000000
--- a/airavata-django-portal/django_airavata/apps/admin/babel.config.js
+++ /dev/null
@@ -1,3 +0,0 @@
-module.exports = {
-  presets: ["@vue/cli-plugin-babel/preset"],
-};
diff --git a/airavata-django-portal/django_airavata/apps/admin/package.json 
b/airavata-django-portal/django_airavata/apps/admin/package.json
index 118630c7a..ab02e0593 100644
--- a/airavata-django-portal/django_airavata/apps/admin/package.json
+++ b/airavata-django-portal/django_airavata/apps/admin/package.json
@@ -5,88 +5,34 @@
   "description": "A Vue.js project",
   "author": "Eldho Mathulla <[email protected]>",
   "scripts": {
-    "serve": "vue-cli-service serve 
./static/django_airavata_admin/src/main.js",
-    "build": "vue-cli-service build 
./static/django_airavata_admin/src/main.js",
+    "dev": "vite",
+    "build": "vite build",
+    "preview": "vite preview",
     "test": "npm run test:unit",
-    "test:unit": "vue-cli-service test:unit",
-    "lint": "vue-cli-service lint ./static/django_airavata_admin/src/",
-    "format": "prettier --write .",
-    "lint:visualstudio": "vue-cli-service lint --format visualstudio 
./static/django_airavata_admin/src/"
+    "test:unit": "vitest run",
+    "lint": "eslint ./static/django_airavata_admin/src/",
+    "format": "prettier --write ."
   },
   "dependencies": {
-    "bootstrap": "^4.3.1",
-    "bootstrap-vue": "^2.21.2",
-    "browserslist": "^4.16.7",
-    "core-js": "^3.8.3",
+    "bootstrap": "^5.3.0",
     "django-airavata-api": "link:../api",
     "django-airavata-common-ui": "link:../../static/common/",
-    "luxon": "^1.16.0",
-    "moment": "^2.22.2",
-    "terser": "^4.1.2",
-    "vue": "^2.5.22",
-    "vue-datetime": "^1.0.0-beta.10",
-    "vue-flatpickr-component": "^8.1.2",
-    "vue-resource": "^1.3.4",
-    "vue-router": "^2.7.0",
-    "vuedraggable": "^2.16.0",
-    "vuelidate": "^0.7.6",
-    "vuex": "^2.4.0",
-    "weekstart": "^1.0.0"
+    "luxon": "^3.0.0",
+    "vue": "^3.4.0",
+    "vue-flatpickr-component": "^11.0.0",
+    "vue-router": "^4.3.0",
+    "vuedraggable": "^4.1.0",
+    "@vuelidate/core": "^2.0.0",
+    "@vuelidate/validators": "^2.0.0",
+    "pinia": "^2.2.0"
   },
   "devDependencies": {
-    "@babel/core": "^7.12.16",
-    "@babel/eslint-parser": "^7.12.16",
-    "@testing-library/jest-dom": "^5.16.5",
-    "@testing-library/vue": "5",
-    "@vue/cli-plugin-babel": "~5.0.8",
-    "@vue/cli-plugin-eslint": "~5.0.8",
-    "@vue/cli-plugin-unit-jest": "~5.0.0",
-    "@vue/cli-service": "~5.0.8",
-    "@vue/component-compiler-utils": "^2.3.0",
-    "@vue/test-utils": "^1.1.3",
-    "@vue/vue2-jest": "^27.0.0-alpha.2",
-    "autoprefixer": "^9.3.1",
-    "babel-jest": "^27.0.6",
-    "eslint": "^7.32.0",
-    "eslint-plugin-vue": "^8.0.3",
-    "jest": "^27.0.5",
-    "prettier": "^2.1.2",
-    "vue-loader": "^15.5.1",
-    "vue-template-compiler": "^2.5.22",
-    "webpack": "^4.28.4",
-    "webpack-bundle-tracker": "^0.4.2",
-    "webpack-dev-middleware": "^3.5.0"
-  },
-  "eslintConfig": {
-    "root": true,
-    "env": {
-      "node": true
-    },
-    "extends": [
-      "plugin:vue/essential",
-      "eslint:recommended"
-    ],
-    "rules": {},
-    "parserOptions": {
-      "parser": "@babel/eslint-parser",
-      "requireConfigFile": false
-    },
-    "overrides": [
-      {
-        "files": [
-          "**/__tests__/*.{j,t}s?(x)",
-          "**/tests/unit/**/*.spec.{j,t}s?(x)"
-        ],
-        "env": {
-          "jest": true
-        }
-      }
-    ]
-  },
-  "postcss": {
-    "plugins": {
-      "autoprefixer": {}
-    }
+    "@vitejs/plugin-vue": "^5.0.0",
+    "eslint": "^8.0.0",
+    "eslint-plugin-vue": "^9.0.0",
+    "prettier": "^3.0.0",
+    "vite": "^6.0.0",
+    "vitest": "^3.0.0"
   },
   "browserslist": [
     "> 1%",
diff --git 
a/airavata-django-portal/django_airavata/apps/admin/templates/admin/admin_base.html
 
b/airavata-django-portal/django_airavata/apps/admin/templates/admin/admin_base.html
index ee61c0cd9..178c15946 100644
--- 
a/airavata-django-portal/django_airavata/apps/admin/templates/admin/admin_base.html
+++ 
b/airavata-django-portal/django_airavata/apps/admin/templates/admin/admin_base.html
@@ -1,15 +1,14 @@
 {% extends "base.html" %}
-{% load static %}
-{% load render_bundle from webpack_loader %}
+{% load static django_vite %}
 {% block content %}
 <div id=app></div>
-{% endblock %} {% block css %}
-{% render_bundle 'chunk-vendors' 'css' 'ADMIN' %}
-{% render_bundle 'app' 'css' 'ADMIN' %}
-<link rel=stylesheet type=text/css href={% static 
'django_airavata_admin/static/css/admin.css' %}> {% endblock %}
+{% endblock %}
+
+{% block css %}
+<link rel=stylesheet type=text/css href={% static 
'django_airavata_admin/static/css/admin.css' %}>
+{% endblock %}
 
 {% block scripts %}
     {{ block.super }}
-    {% render_bundle 'chunk-vendors' 'js' 'ADMIN' %}
-    {% render_bundle 'app' 'js' 'ADMIN' %}
+    {% vite_asset "static/django_airavata_admin/src/main.js" app="ADMIN" %}
 {% endblock %}
diff --git a/airavata-django-portal/django_airavata/apps/admin/vite.config.js 
b/airavata-django-portal/django_airavata/apps/admin/vite.config.js
new file mode 100644
index 000000000..22da0c62c
--- /dev/null
+++ b/airavata-django-portal/django_airavata/apps/admin/vite.config.js
@@ -0,0 +1,26 @@
+import { defineConfig } from "vite";
+import vue from "@vitejs/plugin-vue";
+import { resolve } from "path";
+
+export default defineConfig({
+  plugins: [vue()],
+  build: {
+    manifest: "manifest.json",
+    outDir: resolve(__dirname, "./static/django_airavata_admin/dist"),
+    rollupOptions: {
+      input: resolve(
+        __dirname,
+        "./static/django_airavata_admin/src/main.js"
+      ),
+    },
+  },
+  resolve: {
+    alias: {
+      "@": resolve(__dirname, "./static/django_airavata_admin/src"),
+    },
+  },
+  server: {
+    port: 9000,
+    origin: "http://localhost:9000";,
+  },
+});
diff --git a/airavata-django-portal/django_airavata/apps/admin/vue.config.js 
b/airavata-django-portal/django_airavata/apps/admin/vue.config.js
deleted file mode 100644
index 35076d6f5..000000000
--- a/airavata-django-portal/django_airavata/apps/admin/vue.config.js
+++ /dev/null
@@ -1,24 +0,0 @@
-const BundleTracker = require("webpack-bundle-tracker");
-
-module.exports = {
-  publicPath:
-    process.env.NODE_ENV === "development"
-      ? "http://localhost:9000/static/django_airavata_admin/dist/";
-      : "/static/django_airavata_admin/dist/",
-  outputDir: "./static/django_airavata_admin/dist",
-  configureWebpack: {
-    plugins: [
-      new BundleTracker({
-        filename: "webpack-stats.json",
-        path: "./static/django_airavata_admin/dist/",
-      }),
-    ],
-  },
-  devServer: {
-    port: 9000,
-    headers: {
-      "Access-Control-Allow-Origin": "*",
-    },
-    hot: true,
-  },
-};
diff --git a/airavata-django-portal/django_airavata/apps/api/babel.config.js 
b/airavata-django-portal/django_airavata/apps/api/babel.config.js
deleted file mode 100644
index 36454ec17..000000000
--- a/airavata-django-portal/django_airavata/apps/api/babel.config.js
+++ /dev/null
@@ -1,21 +0,0 @@
-// Use the following to verify that the config file is loaded
-// console.log("loaded babel.config.js");
-const presets = [
-  [
-    "@babel/preset-env",
-    {
-      useBuiltIns: "usage",
-    },
-  ],
-];
-
-const plugins = ["@babel/plugin-transform-runtime"];
-module.exports = {
-  presets,
-  plugins,
-  env: {
-    test: {
-      presets: ["@babel/preset-env"],
-    },
-  },
-};
diff --git a/airavata-django-portal/django_airavata/apps/api/package.json 
b/airavata-django-portal/django_airavata/apps/api/package.json
index ad28446d1..e638abb3f 100644
--- a/airavata-django-portal/django_airavata/apps/api/package.json
+++ b/airavata-django-portal/django_airavata/apps/api/package.json
@@ -9,50 +9,22 @@
   "license": "Apache-2.0",
   "repository": "https://github.com/apache/airavata-django-portal";,
   "scripts": {
-    "build": "webpack",
-    "watch": "webpack --watch",
-    "test": "jest",
-    "test:watch": "jest --watch",
+    "build": "vite build",
+    "test": "vitest run",
+    "test:watch": "vitest",
     "lint": "eslint ./static/django_airavata_api/js/",
     "format": "prettier --write ."
   },
   "dependencies": {
-    "@babel/polyfill": "^7.0.0",
-    "@babel/runtime": "^7.1.2",
-    "browserslist": "^4.16.7",
-    "core-js": "^3.8.3",
     "stacktrace-js": "^2.0.0",
-    "terser": "^4.1.2",
     "url-parse": "^1.4.3",
-    "uuid": "^3.3.2"
+    "uuid": "^9.0.0"
   },
   "devDependencies": {
-    "@babel/cli": "^7.4.4",
-    "@babel/core": "^7.4.5",
-    "@babel/plugin-transform-runtime": "^7.1.0",
-    "@babel/preset-env": "^7.4.5",
-    "babel-core": "^7.0.0-bridge.0",
-    "babel-jest": "^23.6.0",
-    "eslint": "^5.12.0",
-    "eslint-plugin-import": "^2.14.0",
-    "jest": "^23.6.0",
-    "prettier": "^2.1.2",
-    "regenerator-runtime": "^0.13.1",
-    "webpack": "^5",
-    "webpack-cli": "^3.3.4"
-  },
-  "eslintConfig": {
-    "root": true,
-    "extends": "eslint:recommended",
-    "parserOptions": {
-      "sourceType": "module",
-      "ecmaVersion": 2017
-    },
-    "env": {
-      "browser": true,
-      "es6": true,
-      "node": true
-    }
+    "eslint": "^8.0.0",
+    "prettier": "^3.0.0",
+    "vite": "^6.0.0",
+    "vitest": "^3.0.0"
   },
   "browserslist": [
     "> 1%",
diff --git a/airavata-django-portal/django_airavata/apps/api/vite.config.js 
b/airavata-django-portal/django_airavata/apps/api/vite.config.js
new file mode 100644
index 000000000..05cc01fb7
--- /dev/null
+++ b/airavata-django-portal/django_airavata/apps/api/vite.config.js
@@ -0,0 +1,14 @@
+import { defineConfig } from "vite";
+import { resolve } from "path";
+
+export default defineConfig({
+  build: {
+    lib: {
+      entry: resolve(__dirname, "static/django_airavata_api/js/index.js"),
+      name: "AiravataAPI",
+      fileName: "airavata-api",
+      formats: ["umd"],
+    },
+    outDir: resolve(__dirname, "static/django_airavata_api/dist"),
+  },
+});
diff --git a/airavata-django-portal/django_airavata/apps/api/webpack.config.js 
b/airavata-django-portal/django_airavata/apps/api/webpack.config.js
deleted file mode 100644
index 2d208a109..000000000
--- a/airavata-django-portal/django_airavata/apps/api/webpack.config.js
+++ /dev/null
@@ -1,11 +0,0 @@
-const path = require("path");
-
-module.exports = {
-  entry: "./static/django_airavata_api/js/index.js",
-  output: {
-    path: path.resolve(__dirname, "static/django_airavata_api/dist/"),
-    filename: "airavata-api.js",
-    library: "AiravataAPI",
-  },
-  mode: "production",
-};
diff --git a/airavata-django-portal/django_airavata/apps/auth/babel.config.js 
b/airavata-django-portal/django_airavata/apps/auth/babel.config.js
deleted file mode 100644
index 397abca88..000000000
--- a/airavata-django-portal/django_airavata/apps/auth/babel.config.js
+++ /dev/null
@@ -1,3 +0,0 @@
-module.exports = {
-  presets: ["@vue/cli-plugin-babel/preset"]
-};
diff --git a/airavata-django-portal/django_airavata/apps/auth/package.json 
b/airavata-django-portal/django_airavata/apps/auth/package.json
index edc211ffc..298b9d5c4 100644
--- a/airavata-django-portal/django_airavata/apps/auth/package.json
+++ b/airavata-django-portal/django_airavata/apps/auth/package.json
@@ -5,54 +5,27 @@
   "author": "Apache Airavata <[email protected]>",
   "private": true,
   "scripts": {
-    "serve": "vue-cli-service serve",
-    "build": "vue-cli-service build",
-    "lint": "vue-cli-service lint ./static/django_airavata_auth/js",
+    "dev": "vite",
+    "build": "vite build",
+    "preview": "vite preview",
+    "lint": "eslint ./static/django_airavata_auth/js",
     "format": "prettier --write ."
   },
   "dependencies": {
-    "bootstrap": "^4.0.0-beta.2",
-    "bootstrap-vue": "2.0.0-rc.26",
-    "browserslist": "^4.16.7",
-    "core-js": "^3.8.3",
+    "bootstrap": "^5.3.0",
     "django-airavata-api": "link:../api/",
     "django-airavata-common-ui": "link:../../static/common/",
-    "vue": "^2.5.21",
-    "vuelidate": "^0.7.6",
-    "vuex": "^3.6.2"
+    "vue": "^3.4.0",
+    "@vuelidate/core": "^2.0.0",
+    "@vuelidate/validators": "^2.0.0",
+    "pinia": "^2.2.0"
   },
   "devDependencies": {
-    "@babel/core": "^7.12.16",
-    "@babel/eslint-parser": "^7.12.16",
-    "@vue/cli-plugin-babel": "~5.0.8",
-    "@vue/cli-plugin-eslint": "~5.0.8",
-    "@vue/cli-service": "~5.0.8",
-    "eslint": "^7.32.0",
-    "eslint-plugin-vue": "^8.0.3",
-    "prettier": "^2.1.2",
-    "vue-template-compiler": "^2.5.21",
-    "webpack": "5.0.0",
-    "webpack-bundle-tracker": "^0.4.2-beta"
-  },
-  "eslintConfig": {
-    "root": true,
-    "env": {
-      "node": true
-    },
-    "extends": [
-      "plugin:vue/essential",
-      "eslint:recommended"
-    ],
-    "rules": {},
-    "parserOptions": {
-      "parser": "@babel/eslint-parser",
-      "requireConfigFile": false
-    }
-  },
-  "postcss": {
-    "plugins": {
-      "autoprefixer": {}
-    }
+    "@vitejs/plugin-vue": "^5.0.0",
+    "eslint": "^8.0.0",
+    "eslint-plugin-vue": "^9.0.0",
+    "prettier": "^3.0.0",
+    "vite": "^6.0.0"
   },
   "browserslist": [
     "> 1%",
diff --git 
a/airavata-django-portal/django_airavata/apps/auth/templates/django_airavata_auth/base.html
 
b/airavata-django-portal/django_airavata/apps/auth/templates/django_airavata_auth/base.html
index 77cbf0677..e50120099 100644
--- 
a/airavata-django-portal/django_airavata/apps/auth/templates/django_airavata_auth/base.html
+++ 
b/airavata-django-portal/django_airavata/apps/auth/templates/django_airavata_auth/base.html
@@ -1,23 +1,11 @@
 {% extends 'base.html' %}
 
-{% load static %}
-{% load render_bundle from webpack_loader %}
-
-{% block css %}
-{% render_bundle 'chunk-vendors' 'css' 'AUTH' %}
-{% comment %}BUT NOTE: if you only have one entry point you won't have a 
'chunk-common' bundle so you may need to comment out the next line until you 
have more than one entry point.{% endcomment %}
-{% comment %} {% render_bundle 'chunk-common' 'css' 'MYAPP' %} {% endcomment %}
-{% render_bundle bundle_name 'css' 'AUTH' %}
-{% endblock %}
+{% load static django_vite %}
 
 {% block content %}
 <div id="{{ bundle_name }}"/>
 {% endblock %}
 
-
 {% block scripts %}
-{% render_bundle 'chunk-vendors' 'js' 'AUTH' %}
-{% comment %}BUT NOTE: if you only have one entry point you won't have a 
'chunk-common' bundle so you may need to comment out the next line until you 
have more than one entry point.{% endcomment %}
-{% comment %} {% render_bundle 'chunk-common' 'js' 'MYAPP' %} {% endcomment %}
-{% render_bundle bundle_name 'js' 'AUTH' %}
+{% vite_asset entry_point app="AUTH" %}
 {% endblock %}
diff --git a/airavata-django-portal/django_airavata/apps/auth/views.py 
b/airavata-django-portal/django_airavata/apps/auth/views.py
index 012a250e2..10c01f22d 100644
--- a/airavata-django-portal/django_airavata/apps/auth/views.py
+++ b/airavata-django-portal/django_airavata/apps/auth/views.py
@@ -564,7 +564,8 @@ def access_token_redirect(request):
 @login_required
 def user_profile(request):
     return render(request, "django_airavata_auth/base.html", {
-        'bundle_name': "user-profile"
+        'bundle_name': "user-profile",
+        'entry_point': "static/django_airavata_auth/js/entry-user-profile.js",
     })
 
 
diff --git a/airavata-django-portal/django_airavata/apps/auth/vite.config.js 
b/airavata-django-portal/django_airavata/apps/auth/vite.config.js
new file mode 100644
index 000000000..316ae2ca1
--- /dev/null
+++ b/airavata-django-portal/django_airavata/apps/auth/vite.config.js
@@ -0,0 +1,28 @@
+import { defineConfig } from "vite";
+import vue from "@vitejs/plugin-vue";
+import { resolve } from "path";
+
+export default defineConfig({
+  plugins: [vue()],
+  build: {
+    manifest: "manifest.json",
+    outDir: resolve(__dirname, "./static/django_airavata_auth/dist"),
+    rollupOptions: {
+      input: {
+        "user-profile": resolve(
+          __dirname,
+          "./static/django_airavata_auth/js/entry-user-profile.js"
+        ),
+      },
+    },
+  },
+  resolve: {
+    alias: {
+      "@": resolve(__dirname, "./static/django_airavata_auth/js"),
+    },
+  },
+  server: {
+    port: 9000,
+    origin: "http://localhost:9000";,
+  },
+});
diff --git a/airavata-django-portal/django_airavata/apps/auth/vue.config.js 
b/airavata-django-portal/django_airavata/apps/auth/vue.config.js
deleted file mode 100644
index b6bc6cf32..000000000
--- a/airavata-django-portal/django_airavata/apps/auth/vue.config.js
+++ /dev/null
@@ -1,28 +0,0 @@
-const BundleTracker = require("webpack-bundle-tracker");
-
-module.exports = {
-  publicPath:
-    process.env.NODE_ENV === "development"
-      ? "http://localhost:9000/static/django_airavata_auth/dist/";
-      : "/static/django_airavata_auth/dist/",
-  outputDir: "./static/django_airavata_auth/dist",
-  pages: {
-    "user-profile": "./static/django_airavata_auth/js/entry-user-profile",
-    // additional entry points go here ...
-  },
-  configureWebpack: {
-    plugins: [
-      new BundleTracker({
-        filename: "webpack-stats.json",
-        path: "./static/django_airavata_auth/dist/",
-      }),
-    ],
-  },
-  devServer: {
-    port: 9000,
-    headers: {
-      "Access-Control-Allow-Origin": "*",
-    },
-    hot: true,
-  },
-};
diff --git 
a/airavata-django-portal/django_airavata/apps/dataparsers/babel.config.js 
b/airavata-django-portal/django_airavata/apps/dataparsers/babel.config.js
deleted file mode 100644
index 162a3ea97..000000000
--- a/airavata-django-portal/django_airavata/apps/dataparsers/babel.config.js
+++ /dev/null
@@ -1,3 +0,0 @@
-module.exports = {
-  presets: ["@vue/cli-plugin-babel/preset"],
-};
diff --git 
a/airavata-django-portal/django_airavata/apps/dataparsers/package.json 
b/airavata-django-portal/django_airavata/apps/dataparsers/package.json
index 3c5290606..a215117f4 100644
--- a/airavata-django-portal/django_airavata/apps/dataparsers/package.json
+++ b/airavata-django-portal/django_airavata/apps/dataparsers/package.json
@@ -5,57 +5,24 @@
   "author": "Marcus Christie <[email protected]>",
   "private": true,
   "scripts": {
-    "serve": "vue-cli-service serve",
-    "build": "vue-cli-service build",
-    "lint": "vue-cli-service lint ./static/django_airavata_dataparsers/js",
-    "lint:visualstudio": "vue-cli-service lint --format=visualstudio 
./static/django_airavata_dataparsers/js",
+    "dev": "vite",
+    "build": "vite build",
+    "preview": "vite preview",
+    "lint": "eslint ./static/django_airavata_dataparsers/js",
     "format": "prettier --write ."
   },
   "dependencies": {
-    "bootstrap": "^4.1.3",
-    "bootstrap-vue": "2.0.0-rc.26",
-    "browserslist": "^4.16.7",
-    "core-js": "^3.8.3",
+    "bootstrap": "^5.3.0",
     "django-airavata-api": "link:../api",
     "django-airavata-common-ui": "link:../../static/common",
-    "terser": "^4.1.2",
-    "vue": "^2.5.22"
+    "vue": "^3.4.0"
   },
   "devDependencies": {
-    "@vue/cli-plugin-babel": "~5.0.8",
-    "@vue/cli-plugin-eslint": "~5.0.8",
-    "@vue/cli-service": "~5.0.8",
-    "eslint": "^7.32.0",
-    "eslint-plugin-vue": "^8.0.3",
-    "prettier": "^2.1.2",
-    "vue-loader": "^15.5.1",
-    "vue-template-compiler": "^2.5.22",
-    "webpack": "^4.28.4",
-    "webpack-bundle-tracker": "^0.4.2-beta",
-    "webpack-dev-middleware": "^3.5.1",
-    "webpack-dev-server": "^3.1.14",
-    "@babel/eslint-parser": "^7.12.16",
-    "@babel/core": "^7.12.16"
-  },
-  "eslintConfig": {
-    "root": true,
-    "env": {
-      "node": true
-    },
-    "extends": [
-      "plugin:vue/essential",
-      "eslint:recommended"
-    ],
-    "rules": {},
-    "parserOptions": {
-      "parser": "@babel/eslint-parser",
-      "requireConfigFile": false
-    }
-  },
-  "postcss": {
-    "plugins": {
-      "autoprefixer": {}
-    }
+    "@vitejs/plugin-vue": "^5.0.0",
+    "eslint": "^8.0.0",
+    "eslint-plugin-vue": "^9.0.0",
+    "prettier": "^3.0.0",
+    "vite": "^6.0.0"
   },
   "browserslist": [
     "> 1%",
diff --git 
a/airavata-django-portal/django_airavata/apps/dataparsers/templates/django_airavata_dataparsers/base.html
 
b/airavata-django-portal/django_airavata/apps/dataparsers/templates/django_airavata_dataparsers/base.html
index 24fac9b5d..6b2dd3ff7 100644
--- 
a/airavata-django-portal/django_airavata/apps/dataparsers/templates/django_airavata_dataparsers/base.html
+++ 
b/airavata-django-portal/django_airavata/apps/dataparsers/templates/django_airavata_dataparsers/base.html
@@ -1,22 +1,11 @@
-
 {% extends 'base.html' %}
 
-{% load static %}
-{% load render_bundle from webpack_loader %}
-
-{% block css %}
-{% render_bundle 'chunk-vendors' 'css' 'DATAPARSERS' %}
-{% comment %} NOTE: dataparsers won't have a common chunk until it has more 
than one entry point. {% endcomment %}
-{% render_bundle 'chunk-common' 'css' 'DATAPARSERS' %}
-{% render_bundle bundle_name 'css' 'DATAPARSERS' %}
-{% endblock %}
+{% load static django_vite %}
 
 {% block content %}
 <div id="{{ bundle_name }}"/>
 {% endblock content %}
 
 {% block scripts %}
-{% render_bundle 'chunk-vendors' 'js' 'DATAPARSERS' %}
-{% render_bundle 'chunk-common' 'js' 'DATAPARSERS' %}
-{% render_bundle bundle_name 'js' 'DATAPARSERS' %}
+{% vite_asset entry_point app="DATAPARSERS" %}
 {% endblock %}
diff --git a/airavata-django-portal/django_airavata/apps/dataparsers/views.py 
b/airavata-django-portal/django_airavata/apps/dataparsers/views.py
index fefcdb9ad..123b4c1d8 100644
--- a/airavata-django-portal/django_airavata/apps/dataparsers/views.py
+++ b/airavata-django-portal/django_airavata/apps/dataparsers/views.py
@@ -1,23 +1,32 @@
 from django.shortcuts import render
 
+ENTRY_POINTS = {
+    'parser-list': 
'static/django_airavata_dataparsers/js/parser-listing-entry-point.js',
+    'parser-details': 
'static/django_airavata_dataparsers/js/entry-parser-details.js',
+    'parser-edit': 
'static/django_airavata_dataparsers/js/parser-edit-entry-point.js',
+}
+
 
 def home(request):
 
     request.active_nav_item = "manage"
     return render(request, 'django_airavata_dataparsers/parsers-manage.html', {
-        "bundle_name": "parser-list"
+        "bundle_name": "parser-list",
+        "entry_point": ENTRY_POINTS["parser-list"],
     })
 
 
 def parser_details(request, parser_id):
     return render(request, 'django_airavata_dataparsers/parser-details.html', {
         "parser_id": parser_id,
-        "bundle_name": "parser-details"
+        "bundle_name": "parser-details",
+        "entry_point": ENTRY_POINTS["parser-details"],
     })
 
 
 def edit_parser(request, parser_id):
     return render(request, 'django_airavata_dataparsers/edit-parser.html', {
         "parser_id": parser_id,
-        "bundle_name": "parser-edit"
+        "bundle_name": "parser-edit",
+        "entry_point": ENTRY_POINTS["parser-edit"],
     })
diff --git 
a/airavata-django-portal/django_airavata/apps/dataparsers/vite.config.js 
b/airavata-django-portal/django_airavata/apps/dataparsers/vite.config.js
new file mode 100644
index 000000000..01bc8df42
--- /dev/null
+++ b/airavata-django-portal/django_airavata/apps/dataparsers/vite.config.js
@@ -0,0 +1,36 @@
+import { defineConfig } from "vite";
+import vue from "@vitejs/plugin-vue";
+import { resolve } from "path";
+
+export default defineConfig({
+  plugins: [vue()],
+  build: {
+    manifest: "manifest.json",
+    outDir: resolve(__dirname, "./static/django_airavata_dataparsers/dist"),
+    rollupOptions: {
+      input: {
+        "parser-details": resolve(
+          __dirname,
+          "./static/django_airavata_dataparsers/js/entry-parser-details.js"
+        ),
+        "parser-list": resolve(
+          __dirname,
+          
"./static/django_airavata_dataparsers/js/parser-listing-entry-point.js"
+        ),
+        "parser-edit": resolve(
+          __dirname,
+          "./static/django_airavata_dataparsers/js/parser-edit-entry-point.js"
+        ),
+      },
+    },
+  },
+  resolve: {
+    alias: {
+      "@": resolve(__dirname, "./static/django_airavata_dataparsers/js"),
+    },
+  },
+  server: {
+    port: 9000,
+    origin: "http://localhost:9000";,
+  },
+});
diff --git 
a/airavata-django-portal/django_airavata/apps/dataparsers/vue.config.js 
b/airavata-django-portal/django_airavata/apps/dataparsers/vue.config.js
deleted file mode 100644
index 680db4f7a..000000000
--- a/airavata-django-portal/django_airavata/apps/dataparsers/vue.config.js
+++ /dev/null
@@ -1,32 +0,0 @@
-const BundleTracker = require("webpack-bundle-tracker");
-
-module.exports = {
-  publicPath:
-    process.env.NODE_ENV === "development"
-      ? "http://localhost:9000/static/django_airavata_dataparsers/dist/";
-      : "/static/django_airavata_dataparsers/dist/",
-  outputDir: "./static/django_airavata_dataparsers/dist",
-  pages: {
-    "parser-details":
-      "./static/django_airavata_dataparsers/js/entry-parser-details",
-    "parser-list":
-      "./static/django_airavata_dataparsers/js/parser-listing-entry-point.js",
-    "parser-edit":
-      "./static/django_airavata_dataparsers/js/parser-edit-entry-point.js",
-  },
-  configureWebpack: {
-    plugins: [
-      new BundleTracker({
-        filename: "webpack-stats.json",
-        path: "./static/django_airavata_dataparsers/dist/",
-      }),
-    ],
-  },
-  devServer: {
-    port: 9000,
-    headers: {
-      "Access-Control-Allow-Origin": "*",
-    },
-    hot: true,
-  },
-};
diff --git a/airavata-django-portal/django_airavata/apps/groups/babel.config.js 
b/airavata-django-portal/django_airavata/apps/groups/babel.config.js
deleted file mode 100644
index 162a3ea97..000000000
--- a/airavata-django-portal/django_airavata/apps/groups/babel.config.js
+++ /dev/null
@@ -1,3 +0,0 @@
-module.exports = {
-  presets: ["@vue/cli-plugin-babel/preset"],
-};
diff --git a/airavata-django-portal/django_airavata/apps/groups/package.json 
b/airavata-django-portal/django_airavata/apps/groups/package.json
index fc39b50f4..9fcb55aa5 100755
--- a/airavata-django-portal/django_airavata/apps/groups/package.json
+++ b/airavata-django-portal/django_airavata/apps/groups/package.json
@@ -5,57 +5,24 @@
   "author": "Stephen Paul <[email protected]>",
   "private": true,
   "scripts": {
-    "serve": "vue-cli-service serve",
-    "build": "vue-cli-service build",
-    "lint": "vue-cli-service lint ./static/django_airavata_groups/js",
-    "lint:visualstudio": "vue-cli-service lint --format visualstudio 
./static/django_airavata_groups/js",
+    "dev": "vite",
+    "build": "vite build",
+    "preview": "vite preview",
+    "lint": "eslint ./static/django_airavata_groups/js",
     "format": "prettier --write ."
   },
   "dependencies": {
-    "bootstrap": "^4.0.0-beta.2",
-    "browserslist": "^4.16.7",
-    "core-js": "^3.8.3",
+    "bootstrap": "^5.3.0",
     "django-airavata-api": "link:../api",
     "django-airavata-common-ui": "link:../../static/common",
-    "moment": "^2.18.1",
-    "terser": "^4.1.2",
-    "vue": "^2.5.22"
+    "vue": "^3.4.0"
   },
   "devDependencies": {
-    "@vue/cli-plugin-babel": "~5.0.8",
-    "@vue/cli-plugin-eslint": "~5.0.8",
-    "@vue/cli-service": "~5.0.8",
-    "eslint": "^7.32.0",
-    "eslint-plugin-vue": "^8.0.3",
-    "prettier": "^2.1.2",
-    "vue-loader": "^15.5.1",
-    "vue-template-compiler": "^2.5.22",
-    "webpack": "^4.28.4",
-    "webpack-bundle-tracker": "^0.4.2-beta",
-    "webpack-dev-middleware": "^3.5.1",
-    "webpack-dev-server": "^3.1.14",
-    "@babel/eslint-parser": "^7.12.16",
-    "@babel/core": "^7.12.16"
-  },
-  "eslintConfig": {
-    "root": true,
-    "env": {
-      "node": true
-    },
-    "extends": [
-      "plugin:vue/essential",
-      "eslint:recommended"
-    ],
-    "rules": {},
-    "parserOptions": {
-      "parser": "@babel/eslint-parser",
-      "requireConfigFile": false
-    }
-  },
-  "postcss": {
-    "plugins": {
-      "autoprefixer": {}
-    }
+    "@vitejs/plugin-vue": "^5.0.0",
+    "eslint": "^8.0.0",
+    "eslint-plugin-vue": "^9.0.0",
+    "prettier": "^3.0.0",
+    "vite": "^6.0.0"
   },
   "browserslist": [
     "> 1%",
diff --git 
a/airavata-django-portal/django_airavata/apps/groups/templates/django_airavata_groups/base.html
 
b/airavata-django-portal/django_airavata/apps/groups/templates/django_airavata_groups/base.html
index 7fb55d647..4ac4edca6 100755
--- 
a/airavata-django-portal/django_airavata/apps/groups/templates/django_airavata_groups/base.html
+++ 
b/airavata-django-portal/django_airavata/apps/groups/templates/django_airavata_groups/base.html
@@ -1,20 +1,11 @@
 {% extends 'base.html' %}
 
-{% load static %}
-{% load render_bundle from webpack_loader %}
-
-{% block css %}
-{% render_bundle 'chunk-vendors' 'css' 'GROUPS' %}
-{% render_bundle 'chunk-common' 'css' 'GROUPS' %}
-{% render_bundle bundle_name 'css' 'GROUPS' %}
-{% endblock %}
+{% load static django_vite %}
 
 {% block content %}
 <div id="{{ bundle_name }}" {% if next %} data-next="{{ next }}" {% endif %} />
 {% endblock content %}
 
 {% block scripts %}
-{% render_bundle 'chunk-vendors' 'js' 'GROUPS' %}
-{% render_bundle 'chunk-common' 'js' 'GROUPS' %}
-{% render_bundle bundle_name 'js' 'GROUPS' %}
+{% vite_asset entry_point app="GROUPS" %}
 {% endblock %}
diff --git a/airavata-django-portal/django_airavata/apps/groups/views.py 
b/airavata-django-portal/django_airavata/apps/groups/views.py
index 3797a72b7..7689d9ddf 100755
--- a/airavata-django-portal/django_airavata/apps/groups/views.py
+++ b/airavata-django-portal/django_airavata/apps/groups/views.py
@@ -3,13 +3,20 @@
 from django.contrib.auth.decorators import login_required
 from django.shortcuts import render
 
+ENTRY_POINTS = {
+    'group-list': 
'static/django_airavata_groups/js/group-listing-entry-point.js',
+    'group-create': 
'static/django_airavata_groups/js/group-create-entry-point.js',
+    'group-edit': 'static/django_airavata_groups/js/group-edit-entry-point.js',
+}
+
 
 @login_required
 def groups_manage(request):
     request.active_nav_item = "manage"
 
     return render(request, 'django_airavata_groups/base.html', {
-        'bundle_name': 'group-list'
+        'bundle_name': 'group-list',
+        'entry_point': ENTRY_POINTS['group-list'],
     })
 
 
@@ -19,6 +26,7 @@ def groups_create(request):
 
     return render(request, 'django_airavata_groups/base.html', {
         'bundle_name': 'group-create',
+        'entry_point': ENTRY_POINTS['group-create'],
         'next': request.GET.get('next'),
     })
 
@@ -29,6 +37,7 @@ def edit_group(request, group_id):
 
     return render(request, 'django_airavata_groups/group_edit.html', {
         'bundle_name': 'group-edit',
+        'entry_point': ENTRY_POINTS['group-edit'],
         'group_id': group_id,
         'next': request.GET.get('next'),
     })
diff --git a/airavata-django-portal/django_airavata/apps/groups/vite.config.js 
b/airavata-django-portal/django_airavata/apps/groups/vite.config.js
new file mode 100644
index 000000000..c6787bb55
--- /dev/null
+++ b/airavata-django-portal/django_airavata/apps/groups/vite.config.js
@@ -0,0 +1,36 @@
+import { defineConfig } from "vite";
+import vue from "@vitejs/plugin-vue";
+import { resolve } from "path";
+
+export default defineConfig({
+  plugins: [vue()],
+  build: {
+    manifest: "manifest.json",
+    outDir: resolve(__dirname, "./static/django_airavata_groups/dist"),
+    rollupOptions: {
+      input: {
+        "group-list": resolve(
+          __dirname,
+          "./static/django_airavata_groups/js/group-listing-entry-point.js"
+        ),
+        "group-create": resolve(
+          __dirname,
+          "./static/django_airavata_groups/js/group-create-entry-point.js"
+        ),
+        "group-edit": resolve(
+          __dirname,
+          "./static/django_airavata_groups/js/group-edit-entry-point.js"
+        ),
+      },
+    },
+  },
+  resolve: {
+    alias: {
+      "@": resolve(__dirname, "./static/django_airavata_groups/js"),
+    },
+  },
+  server: {
+    port: 9000,
+    origin: "http://localhost:9000";,
+  },
+});
diff --git a/airavata-django-portal/django_airavata/apps/groups/vue.config.js 
b/airavata-django-portal/django_airavata/apps/groups/vue.config.js
deleted file mode 100644
index f4d43b062..000000000
--- a/airavata-django-portal/django_airavata/apps/groups/vue.config.js
+++ /dev/null
@@ -1,32 +0,0 @@
-const BundleTracker = require("webpack-bundle-tracker");
-
-module.exports = {
-  publicPath:
-    process.env.NODE_ENV === "development"
-      ? "http://localhost:9000/static/django_airavata_groups/dist/";
-      : "/static/django_airavata_groups/dist/",
-  outputDir: "./static/django_airavata_groups/dist",
-  pages: {
-    "group-list":
-      "./static/django_airavata_groups/js/group-listing-entry-point.js",
-    "group-create":
-      "./static/django_airavata_groups/js/group-create-entry-point.js",
-    "group-edit":
-      "./static/django_airavata_groups/js/group-edit-entry-point.js",
-  },
-  configureWebpack: {
-    plugins: [
-      new BundleTracker({
-        filename: "webpack-stats.json",
-        path: "./static/django_airavata_groups/dist/",
-      }),
-    ],
-  },
-  devServer: {
-    port: 9000,
-    headers: {
-      "Access-Control-Allow-Origin": "*",
-    },
-    hot: true,
-  },
-};
diff --git 
a/airavata-django-portal/django_airavata/apps/workspace/babel.config.js 
b/airavata-django-portal/django_airavata/apps/workspace/babel.config.js
deleted file mode 100644
index 162a3ea97..000000000
--- a/airavata-django-portal/django_airavata/apps/workspace/babel.config.js
+++ /dev/null
@@ -1,3 +0,0 @@
-module.exports = {
-  presets: ["@vue/cli-plugin-babel/preset"],
-};
diff --git 
a/airavata-django-portal/django_airavata/apps/workspace/django-airavata-workspace-plugin-api/babel.config.js
 
b/airavata-django-portal/django_airavata/apps/workspace/django-airavata-workspace-plugin-api/babel.config.js
deleted file mode 100644
index 9a46be1c8..000000000
--- 
a/airavata-django-portal/django_airavata/apps/workspace/django-airavata-workspace-plugin-api/babel.config.js
+++ /dev/null
@@ -1,3 +0,0 @@
-module.exports = {
-  presets: ["@babel/preset-env"],
-};
diff --git 
a/airavata-django-portal/django_airavata/apps/workspace/django-airavata-workspace-plugin-api/package.json
 
b/airavata-django-portal/django_airavata/apps/workspace/django-airavata-workspace-plugin-api/package.json
index 46319c105..fa1abb8bc 100644
--- 
a/airavata-django-portal/django_airavata/apps/workspace/django-airavata-workspace-plugin-api/package.json
+++ 
b/airavata-django-portal/django_airavata/apps/workspace/django-airavata-workspace-plugin-api/package.json
@@ -4,62 +4,28 @@
   "version": "1.0.0-beta.2",
   "author": "Marcus Christie <[email protected]>",
   "private": false,
-  "main": "./dist/index.common.js",
+  "main": "./dist/index.cjs.js",
   "module": "./js/index.js",
   "license": "Apache-2.0",
   "repository": "https://github.com/apache/airavata-django-portal";,
   "scripts": {
-    "watch": "vue-cli-service build --watch --target lib --name index 
js/index.js",
-    "build": "vue-cli-service build --target lib --name index js/index.js",
-    "lint": "vue-cli-service lint ./js/",
-    "lint:visualstudio": "vue-cli-service lint --format visualstudio ./js/",
+    "build": "vite build",
+    "lint": "eslint ./js/",
     "format": "prettier --write ."
   },
   "peerDependencies": {
     "django-airavata-api": "^1.0.0-beta"
   },
   "devDependencies": {
-    "@vue/cli-plugin-babel": "~5.0.8",
-    "@vue/cli-plugin-eslint": "~5.0.8",
-    "@vue/cli-service": "~5.0.8",
-    "eslint": "^7.32.0",
-    "eslint-plugin-vue": "^8.0.3",
-    "prettier": "^2.1.2",
-    "terser": "^4.1.2",
-    "vue-loader": "^15.5.1",
-    "vue-template-compiler": "^2.5.17",
-    "webpack": "^4.28.4",
-    "webpack-dev-middleware": "^3.5.1",
-    "@babel/eslint-parser": "^7.12.16",
-    "@babel/core": "^7.12.16"
-  },
-  "eslintConfig": {
-    "root": true,
-    "env": {
-      "node": true
-    },
-    "extends": [
-      "plugin:vue/essential",
-      "eslint:recommended"
-    ],
-    "rules": {},
-    "parserOptions": {
-      "parser": "@babel/eslint-parser",
-      "requireConfigFile": false
-    }
-  },
-  "postcss": {
-    "plugins": {
-      "autoprefixer": {}
-    }
+    "@vitejs/plugin-vue": "^5.0.0",
+    "eslint": "^8.0.0",
+    "eslint-plugin-vue": "^9.0.0",
+    "prettier": "^3.0.0",
+    "vite": "^6.0.0"
   },
   "browserslist": [
     "> 1%",
     "last 2 versions",
     "not dead"
-  ],
-  "dependencies": {
-    "browserslist": "^4.16.7",
-    "core-js": "^3.8.3"
-  }
+  ]
 }
diff --git 
a/airavata-django-portal/django_airavata/apps/workspace/django-airavata-workspace-plugin-api/vite.config.js
 
b/airavata-django-portal/django_airavata/apps/workspace/django-airavata-workspace-plugin-api/vite.config.js
new file mode 100644
index 000000000..ac07e84f2
--- /dev/null
+++ 
b/airavata-django-portal/django_airavata/apps/workspace/django-airavata-workspace-plugin-api/vite.config.js
@@ -0,0 +1,19 @@
+import { defineConfig } from "vite";
+import vue from "@vitejs/plugin-vue";
+import { resolve } from "path";
+
+export default defineConfig({
+  plugins: [vue()],
+  build: {
+    lib: {
+      entry: resolve(__dirname, "js/index.js"),
+      name: "WorkspacePluginAPI",
+      fileName: "index",
+      formats: ["es", "cjs"],
+    },
+    outDir: resolve(__dirname, "dist"),
+    rollupOptions: {
+      external: ["django-airavata-api"],
+    },
+  },
+});
diff --git 
a/airavata-django-portal/django_airavata/apps/workspace/django-airavata-workspace-plugin-api/vue.config.js
 
b/airavata-django-portal/django_airavata/apps/workspace/django-airavata-workspace-plugin-api/vue.config.js
deleted file mode 100644
index 2c3f84428..000000000
--- 
a/airavata-django-portal/django_airavata/apps/workspace/django-airavata-workspace-plugin-api/vue.config.js
+++ /dev/null
@@ -1,5 +0,0 @@
-module.exports = {
-  configureWebpack: {
-    externals: ["django-airavata-api"],
-  },
-};
diff --git a/airavata-django-portal/django_airavata/apps/workspace/package.json 
b/airavata-django-portal/django_airavata/apps/workspace/package.json
index 08455c8bd..12c899212 100644
--- a/airavata-django-portal/django_airavata/apps/workspace/package.json
+++ b/airavata-django-portal/django_airavata/apps/workspace/package.json
@@ -5,86 +5,38 @@
   "description": "A Vue.js project",
   "author": "Marcus Christie <[email protected]>",
   "scripts": {
-    "serve": "vue-cli-service serve",
-    "build": "run-s build:vue build:wc",
-    "build:vue": "vue-cli-service build",
-    "lint": "vue-cli-service lint ./static/django_airavata_workspace/js",
-    "lint:visualstudio": "vue-cli-service lint --format visualstudio 
./static/django_airavata_workspace/js",
+    "dev": "vite",
+    "build": "vite build",
+    "preview": "vite preview",
     "test": "npm run test:unit",
-    "test:unit": "vue-cli-service test:unit",
-    "test:unit:watch": "vue-cli-service test:unit --watch",
-    "format": "prettier --write .",
-    "build:wc": "cross-env WC_MODE='true' vue-cli-service build --target wc 
--inline-vue --name adpf 
'./static/django_airavata_workspace/js/web-components/**/*.vue' --dest 
./static/django_airavata_workspace/wc",
-    "build:wc:watch": "cross-env WC_MODE='true' vue-cli-service build --target 
wc --inline-vue --name adpf 
'./static/django_airavata_workspace/js/web-components/**/*.vue' --dest 
./static/django_airavata_workspace/wc --watch"
+    "test:unit": "vitest run",
+    "lint": "eslint ./static/django_airavata_workspace/js",
+    "format": "prettier --write ."
   },
   "dependencies": {
-    "@fortawesome/fontawesome-svg-core": "^1.2.35",
-    "@fortawesome/free-solid-svg-icons": "^5.15.3",
-    "@fortawesome/vue-fontawesome": "^2.0.2",
-    "bootstrap": "^4.3.1",
-    "bootstrap-vue": "^2.21.2",
-    "browserslist": "^4.16.7",
+    "@fortawesome/fontawesome-svg-core": "^6.0.0",
+    "@fortawesome/free-solid-svg-icons": "^6.0.0",
+    "@fortawesome/vue-fontawesome": "^3.0.0",
+    "bootstrap": "^5.3.0",
     "codemirror": "5.52.2",
-    "core-js": "^3.8.3",
     "django-airavata-api": "link:../api",
     "django-airavata-common-ui": "link:../../static/common",
     "django-airavata-workspace-plugin-api": 
"link:django-airavata-workspace-plugin-api",
     "lodash": "^4.17.21",
-    "moment": "^2.21.0",
-    "terser": "^4.1.2",
-    "vue": "^2.5.22",
-    "vue-flatpickr-component": "^8.1.2",
-    "vue-router": "^3.0.6",
-    "vue-slider-component": "^3.2.9-1",
-    "vuex": "^3.6.2"
+    "vue": "^3.4.0",
+    "vue-flatpickr-component": "^11.0.0",
+    "vue-router": "^4.3.0",
+    "vue-slider-component": "^4.1.0",
+    "pinia": "^2.2.0"
   },
   "devDependencies": {
-    "@babel/core": "^7.12.16",
-    "@babel/eslint-parser": "^7.12.16",
-    "@vue/cli-plugin-babel": "~5.0.8",
-    "@vue/cli-plugin-eslint": "~5.0.8",
-    "@vue/cli-plugin-unit-jest": "~5.0.8",
-    "@vue/cli-service": "~5.0.8",
-    "@vue/test-utils": "^1.0.0-beta.28",
-    "@vue/vue2-jest": "^27",
-    "@vue/web-component-wrapper": "^1.3.0",
-    "babel-core": "^7.0.0-bridge.0",
-    "babel-jest": "^27.5.1",
-    "babel-loader": "^8.0.5",
-    "cross-env": "^7.0.3",
-    "eslint": "^7.32.0",
-    "eslint-plugin-vue": "^8.0.3",
-    "jest": "^27.1.0",
-    "npm-run-all": "^4.1.5",
-    "prettier": "^2.1.2",
+    "@vitejs/plugin-vue": "^5.0.0",
+    "eslint": "^8.0.0",
+    "eslint-plugin-vue": "^9.0.0",
+    "prettier": "^3.0.0",
     "sass": "^1.54.5",
-    "sass-loader": "^10",
-    "vue-loader": "^15.5.1",
-    "vue-template-compiler": "^2.5.22",
-    "webpack": "^4.28.4",
-    "webpack-bundle-tracker": "^0.4.2-beta",
-    "webpack-dev-middleware": "^3.5.1",
-    "webpack-dev-server": "^3.1.14"
-  },
-  "eslintConfig": {
-    "root": true,
-    "env": {
-      "node": true
-    },
-    "extends": [
-      "plugin:vue/essential",
-      "eslint:recommended"
-    ],
-    "rules": {},
-    "parserOptions": {
-      "parser": "@babel/eslint-parser",
-      "requireConfigFile": false
-    }
-  },
-  "postcss": {
-    "plugins": {
-      "autoprefixer": {}
-    }
+    "vite": "^6.0.0",
+    "vitest": "^3.0.0"
   },
   "browserslist": [
     "> 1%",
diff --git 
a/airavata-django-portal/django_airavata/apps/workspace/templates/django_airavata_workspace/base.html
 
b/airavata-django-portal/django_airavata/apps/workspace/templates/django_airavata_workspace/base.html
index 2a12d15d9..002eb7e4e 100644
--- 
a/airavata-django-portal/django_airavata/apps/workspace/templates/django_airavata_workspace/base.html
+++ 
b/airavata-django-portal/django_airavata/apps/workspace/templates/django_airavata_workspace/base.html
@@ -1,20 +1,11 @@
 {% extends 'base.html' %}
 
-{% load static %}
-{% load render_bundle from webpack_loader %}
-
-{% block css %}
-{% render_bundle 'chunk-vendors' 'css' 'WORKSPACE' %}
-{% render_bundle 'chunk-common' 'css' 'WORKSPACE' %}
-{% render_bundle bundle_name 'css' 'WORKSPACE' %}
-{% endblock %}
+{% load static django_vite %}
 
 {% block content %}
 <div id="{{ bundle_name }}"/>
 {% endblock content %}
 
 {% block scripts %}
-{% render_bundle 'chunk-vendors' 'js' 'WORKSPACE' %}
-{% render_bundle 'chunk-common' 'js' 'WORKSPACE' %}
-{% render_bundle bundle_name 'js' 'WORKSPACE' %}
+{% vite_asset entry_point app="WORKSPACE" %}
 {% endblock %}
diff --git 
a/airavata-django-portal/django_airavata/apps/workspace/templates/django_airavata_workspace/dashboard.html
 
b/airavata-django-portal/django_airavata/apps/workspace/templates/django_airavata_workspace/dashboard.html
index 80d01de91..f2d2d0dee 100644
--- 
a/airavata-django-portal/django_airavata/apps/workspace/templates/django_airavata_workspace/dashboard.html
+++ 
b/airavata-django-portal/django_airavata/apps/workspace/templates/django_airavata_workspace/dashboard.html
@@ -1,7 +1,5 @@
 {% extends './base.html' %}
 
-{% load render_bundle from webpack_loader %}
-
 {% block content %}
 <div id="dashboard" data-view-all-experiments="{% url 
'django_airavata_workspace:experiments' %}" data-username="{{ 
request.user.username }}" />
 {% endblock content %}
diff --git a/airavata-django-portal/django_airavata/apps/workspace/views.py 
b/airavata-django-portal/django_airavata/apps/workspace/views.py
index e3b1b7b90..4f28bb115 100644
--- a/airavata-django-portal/django_airavata/apps/workspace/views.py
+++ b/airavata-django-portal/django_airavata/apps/workspace/views.py
@@ -20,6 +20,18 @@ from django_airavata.apps.api.views import (
 
 logger = logging.getLogger(__name__)
 
+# Map bundle names to Vite entry point paths
+ENTRY_POINTS = {
+    'experiment-list': 
'static/django_airavata_workspace/js/entry-experiment-list.js',
+    'dashboard': 'static/django_airavata_workspace/js/entry-dashboard.js',
+    'project-list': 
'static/django_airavata_workspace/js/entry-project-list.js',
+    'edit-project': 
'static/django_airavata_workspace/js/entry-edit-project.js',
+    'create-experiment': 
'static/django_airavata_workspace/js/entry-create-experiment.js',
+    'edit-experiment': 
'static/django_airavata_workspace/js/entry-edit-experiment.js',
+    'view-experiment': 
'static/django_airavata_workspace/js/entry-view-experiment.js',
+    'user-storage': 
'static/django_airavata_workspace/js/entry-user-storage.js',
+}
+
 
 @login_required
 def experiments_list(request):
@@ -32,6 +44,7 @@ def experiments_list(request):
     experiments_json = JSONRenderer().render(response.data).decode('utf-8')
     return render(request, 'django_airavata_workspace/experiments_list.html', {
         'bundle_name': 'experiment-list',
+        'entry_point': ENTRY_POINTS['experiment-list'],
         'experiments_data': experiments_json
     })
 
@@ -41,6 +54,7 @@ def dashboard(request):
     request.active_nav_item = 'dashboard'
     return render(request, 'django_airavata_workspace/dashboard.html', {
         'bundle_name': 'dashboard',
+        'entry_point': ENTRY_POINTS['dashboard'],
         'sidebar': True,
     })
 
@@ -57,6 +71,7 @@ def projects_list(request):
 
     return render(request, 'django_airavata_workspace/projects_list.html', {
         'bundle_name': 'project-list',
+        'entry_point': ENTRY_POINTS['project-list'],
         'projects_data': projects_json
     })
 
@@ -67,6 +82,7 @@ def edit_project(request, project_id):
 
     return render(request, 'django_airavata_workspace/edit_project.html', {
         'bundle_name': 'edit-project',
+        'entry_point': ENTRY_POINTS['edit-project'],
         'project_id': project_id
     })
 
@@ -109,6 +125,7 @@ def create_experiment(request, app_module_id):
             user_input_values[name] = request.GET[name]
     context = {
         'bundle_name': 'create-experiment',
+        'entry_point': ENTRY_POINTS['create-experiment'],
         'app_module_id': app_module_id,
         'user_input_values': json.dumps(user_input_values)
     }
@@ -135,6 +152,7 @@ def edit_experiment(request, experiment_id):
     app_module_id = applicationInterface.applicationModules[0]
     context = {
         'bundle_name': 'edit-experiment',
+        'entry_point': ENTRY_POINTS['edit-experiment'],
         'experiment_id': experiment_id,
         'app_module_id': app_module_id,
     }
@@ -176,6 +194,7 @@ def view_experiment(request, experiment_id):
 
     return render(request, 'django_airavata_workspace/view_experiment.html', {
         'bundle_name': 'view-experiment',
+        'entry_point': ENTRY_POINTS['view-experiment'],
         'full_experiment_data': full_experiment_json,
         'launching': json.dumps(launching),
     })
@@ -185,5 +204,6 @@ def view_experiment(request, experiment_id):
 def user_storage(request):
     request.active_nav_item = 'storage'
     return render(request, 'django_airavata_workspace/base.html', {
-        'bundle_name': 'user-storage'
+        'bundle_name': 'user-storage',
+        'entry_point': ENTRY_POINTS['user-storage'],
     })
diff --git 
a/airavata-django-portal/django_airavata/apps/workspace/vite.config.js 
b/airavata-django-portal/django_airavata/apps/workspace/vite.config.js
new file mode 100644
index 000000000..f1a3d8987
--- /dev/null
+++ b/airavata-django-portal/django_airavata/apps/workspace/vite.config.js
@@ -0,0 +1,63 @@
+import { defineConfig } from "vite";
+import vue from "@vitejs/plugin-vue";
+import { resolve } from "path";
+
+export default defineConfig({
+  plugins: [vue()],
+  build: {
+    manifest: "manifest.json",
+    outDir: resolve(__dirname, "./static/django_airavata_workspace/dist"),
+    rollupOptions: {
+      input: {
+        "project-list": resolve(
+          __dirname,
+          "./static/django_airavata_workspace/js/entry-project-list.js"
+        ),
+        dashboard: resolve(
+          __dirname,
+          "./static/django_airavata_workspace/js/entry-dashboard.js"
+        ),
+        "create-experiment": resolve(
+          __dirname,
+          "./static/django_airavata_workspace/js/entry-create-experiment.js"
+        ),
+        "view-experiment": resolve(
+          __dirname,
+          "./static/django_airavata_workspace/js/entry-view-experiment.js"
+        ),
+        "experiment-list": resolve(
+          __dirname,
+          "./static/django_airavata_workspace/js/entry-experiment-list.js"
+        ),
+        "edit-experiment": resolve(
+          __dirname,
+          "./static/django_airavata_workspace/js/entry-edit-experiment.js"
+        ),
+        "edit-project": resolve(
+          __dirname,
+          "./static/django_airavata_workspace/js/entry-edit-project.js"
+        ),
+        "user-storage": resolve(
+          __dirname,
+          "./static/django_airavata_workspace/js/entry-user-storage.js"
+        ),
+      },
+    },
+  },
+  css: {
+    preprocessorOptions: {
+      scss: {
+        quietDeps: true,
+      },
+    },
+  },
+  resolve: {
+    alias: {
+      "@": resolve(__dirname, "./static/django_airavata_workspace/js"),
+    },
+  },
+  server: {
+    port: 9000,
+    origin: "http://localhost:9000";,
+  },
+});
diff --git 
a/airavata-django-portal/django_airavata/apps/workspace/vue.config.js 
b/airavata-django-portal/django_airavata/apps/workspace/vue.config.js
deleted file mode 100644
index f3d8bfe48..000000000
--- a/airavata-django-portal/django_airavata/apps/workspace/vue.config.js
+++ /dev/null
@@ -1,51 +0,0 @@
-const BundleTracker = require("webpack-bundle-tracker");
-
-module.exports = {
-  publicPath:
-    process.env.NODE_ENV === "development"
-      ? "http://localhost:9000/static/django_airavata_workspace/dist/";
-      : "/static/django_airavata_workspace/dist/",
-  outputDir: "./static/django_airavata_workspace/dist",
-  pages: {
-    "project-list": "./static/django_airavata_workspace/js/entry-project-list",
-    dashboard: "./static/django_airavata_workspace/js/entry-dashboard",
-    "create-experiment":
-      "./static/django_airavata_workspace/js/entry-create-experiment",
-    "view-experiment":
-      "./static/django_airavata_workspace/js/entry-view-experiment",
-    "experiment-list":
-      "./static/django_airavata_workspace/js/entry-experiment-list",
-    "edit-experiment":
-      "./static/django_airavata_workspace/js/entry-edit-experiment",
-    "edit-project": "./static/django_airavata_workspace/js/entry-edit-project",
-    "user-storage": "./static/django_airavata_workspace/js/entry-user-storage",
-  },
-  css: {
-    loaderOptions: {
-      sass: {
-        sassOptions: {
-          // Turn off deprecation warnings for sass dependencies
-          quietDeps: true,
-        },
-      },
-    },
-  },
-  configureWebpack: {
-    plugins:
-      process.env.WC_MODE !== "true"
-        ? [
-            new BundleTracker({
-              filename: "webpack-stats.json",
-              path: "./static/django_airavata_workspace/dist/",
-            }),
-          ]
-        : [],
-  },
-  devServer: {
-    port: 9000,
-    headers: {
-      "Access-Control-Allow-Origin": "*",
-    },
-    hot: true,
-  },
-};
diff --git a/airavata-django-portal/django_airavata/dynamic_apps/__init__.py 
b/airavata-django-portal/django_airavata/dynamic_apps/__init__.py
index 1ba67e3c8..5defb4ada 100644
--- a/airavata-django-portal/django_airavata/dynamic_apps/__init__.py
+++ b/airavata-django-portal/django_airavata/dynamic_apps/__init__.py
@@ -42,12 +42,12 @@ def merge_settings(settings_module):
         elif hasattr(custom_django_app, "settings"):
             # This approach is deprecated, use 'merge_settings' instead
             # Merge settings from custom Django apps
-            # NOTE: only handles WEBPACK_LOADER additions
+            # NOTE: only handles DJANGO_VITE additions
             print(
                 f"{type(custom_django_app).__name__}.settings attr is 
deprecated, use merge_settings instead"
             )
             s = custom_django_app.settings
             merge_setting_dict(
-                getattr(settings_module, "WEBPACK_LOADER"),
-                getattr(s, "WEBPACK_LOADER", {}),
+                getattr(settings_module, "DJANGO_VITE"),
+                getattr(s, "DJANGO_VITE", {}),
             )
diff --git a/airavata-django-portal/django_airavata/settings.py 
b/airavata-django-portal/django_airavata/settings.py
index 47939a8ae..22d43a618 100644
--- a/airavata-django-portal/django_airavata/settings.py
+++ b/airavata-django-portal/django_airavata/settings.py
@@ -75,8 +75,8 @@ INSTALLED_APPS = [
     # wagtail custom apps
     'django_airavata.wagtailapps.base.apps.BaseConfig',
 
-    # django-webpack-loader
-    'webpack_loader',
+    # django-vite
+    'django_vite',
 
 ]
 
@@ -275,82 +275,48 @@ AUTHENTICATION_OPTIONS = {
 ACCESS_TOKEN_REDIRECT_ALLOWED_URIS = []
 
 
-# Webpack loader
-WEBPACK_LOADER = {
-    'COMMON': {
-        'BUNDLE_DIR_NAME': 'common/dist/',
-        'STATS_FILE': os.path.join(
-            BASE_DIR,
-            'django_airavata',
-            'static',
-            'common',
-            'dist',
-            'webpack-stats.json'),
-        'TIMEOUT': 60,
+# Django Vite
+DJANGO_VITE = {
+    "default": {
+        "dev_mode": DEBUG,
+        "dev_server_port": 9000,
+        "manifest_path": os.path.join(
+            BASE_DIR, 'django_airavata', 'static', 'common', 'dist', 
'manifest.json'),
     },
-    'ADMIN': {
-        'BUNDLE_DIR_NAME': 'django_airavata_admin/dist/',
-        'STATS_FILE': os.path.join(
-            BASE_DIR,
-            'django_airavata',
-            'apps',
-            'admin',
-            'static',
-            'django_airavata_admin',
-            'dist',
-            'webpack-stats.json'),
-        'TIMEOUT': 60,
+    "ADMIN": {
+        "dev_mode": DEBUG,
+        "dev_server_port": 9000,
+        "manifest_path": os.path.join(
+            BASE_DIR, 'django_airavata', 'apps', 'admin', 'static',
+            'django_airavata_admin', 'dist', 'manifest.json'),
     },
-    'AUTH': {
-        'BUNDLE_DIR_NAME': 'django_airavata_auth/dist/',
-        'STATS_FILE': os.path.join(
-            BASE_DIR,
-            'django_airavata',
-            'apps',
-            'auth',
-            'static',
-            'django_airavata_auth',
-            'dist',
-            'webpack-stats.json'),
+    "AUTH": {
+        "dev_mode": DEBUG,
+        "dev_server_port": 9000,
+        "manifest_path": os.path.join(
+            BASE_DIR, 'django_airavata', 'apps', 'auth', 'static',
+            'django_airavata_auth', 'dist', 'manifest.json'),
     },
-    'DATAPARSERS': {
-        'BUNDLE_DIR_NAME': 'django_airavata_dataparsers/dist/',
-        'STATS_FILE': os.path.join(
-            BASE_DIR,
-            'django_airavata',
-            'apps',
-            'dataparsers',
-            'static',
-            'django_airavata_dataparsers',
-            'dist',
-            'webpack-stats.json'),
-        'TIMEOUT': 60,
+    "DATAPARSERS": {
+        "dev_mode": DEBUG,
+        "dev_server_port": 9000,
+        "manifest_path": os.path.join(
+            BASE_DIR, 'django_airavata', 'apps', 'dataparsers', 'static',
+            'django_airavata_dataparsers', 'dist', 'manifest.json'),
     },
-    'GROUPS': {
-        'BUNDLE_DIR_NAME': 'django_airavata_groups/dist/',
-        'STATS_FILE': os.path.join(
-            BASE_DIR,
-            'django_airavata',
-            'apps',
-            'groups',
-            'static',
-            'django_airavata_groups',
-            'dist',
-            'webpack-stats.json'),
-        'TIMEOUT': 60,
+    "GROUPS": {
+        "dev_mode": DEBUG,
+        "dev_server_port": 9000,
+        "manifest_path": os.path.join(
+            BASE_DIR, 'django_airavata', 'apps', 'groups', 'static',
+            'django_airavata_groups', 'dist', 'manifest.json'),
     },
-    'WORKSPACE': {
-        'BUNDLE_DIR_NAME': 'django_airavata_workspace/dist/',
-        'STATS_FILE': os.path.join(
-            BASE_DIR,
-            'django_airavata',
-            'apps',
-            'workspace',
-            'static',
-            'django_airavata_workspace',
-            'dist',
-            'webpack-stats.json'),
-        'TIMEOUT': 60,
+    "WORKSPACE": {
+        "dev_mode": DEBUG,
+        "dev_server_port": 9000,
+        "manifest_path": os.path.join(
+            BASE_DIR, 'django_airavata', 'apps', 'workspace', 'static',
+            'django_airavata_workspace', 'dist', 'manifest.json'),
     },
 }
 
@@ -631,6 +597,6 @@ except ImportError:
 #
 _load_dynamic_apps(INSTALLED_APPS, "airavata.djangoapp")
 
-# Merge WEBPACK_LOADER settings from custom Django apps
+# Merge DJANGO_VITE settings from custom Django apps
 settings_module = sys.modules[__name__]
 _merge_dynamic_settings(settings_module)
diff --git 
a/airavata-django-portal/django_airavata/static/common/babel.config.js 
b/airavata-django-portal/django_airavata/static/common/babel.config.js
deleted file mode 100644
index 162a3ea97..000000000
--- a/airavata-django-portal/django_airavata/static/common/babel.config.js
+++ /dev/null
@@ -1,3 +0,0 @@
-module.exports = {
-  presets: ["@vue/cli-plugin-babel/preset"],
-};
diff --git a/airavata-django-portal/django_airavata/static/common/package.json 
b/airavata-django-portal/django_airavata/static/common/package.json
index f6a8925da..aa5728e15 100644
--- a/airavata-django-portal/django_airavata/static/common/package.json
+++ b/airavata-django-portal/django_airavata/static/common/package.json
@@ -7,70 +7,33 @@
   "main": "./js/index.js",
   "module": "./js/index.js",
   "scripts": {
-    "watch": "vue-cli-service build --watch --mode production",
-    "build": "run-s build-app build-lib",
-    "build-app": "vue-cli-service build",
-    "build-lib": "cross-env LIBRARY_MODE=true vue-cli-service build --target 
lib --name CommonUI --no-clean ./js/components.js",
-    "lint": "vue-cli-service lint ./js/",
-    "lint:visualstudio": "vue-cli-service lint --format visualstudio ./js/",
+    "dev": "vite",
+    "build": "vite build",
+    "preview": "vite preview",
+    "lint": "eslint ./js/",
     "format": "prettier --check --write ."
   },
   "dependencies": {
-    "@fortawesome/fontawesome-free": "^5.6.3",
-    "@uppy/core": "^1.2.0",
-    "@uppy/drag-drop": "^1.3.0",
-    "@uppy/status-bar": "^1.2.0",
-    "@uppy/tus": "^1.3.0",
-    "@uppy/xhr-upload": "^1.2.0",
-    "bootstrap": "^4.3.1",
-    "bootstrap-vue": "^2.21.2",
-    "browserslist": "^4.16.7",
+    "@fortawesome/fontawesome-free": "^6.0.0",
+    "@popperjs/core": "^2.11.0",
+    "@uppy/core": "^3.0.0",
+    "@uppy/drag-drop": "^3.0.0",
+    "@uppy/status-bar": "^3.0.0",
+    "@uppy/tus": "^3.0.0",
+    "@uppy/xhr-upload": "^3.0.0",
+    "bootstrap": "^5.3.0",
     "clipboard": "^2.0.4",
-    "core-js": "^3.8.3",
     "django-airavata-api": "link:../../apps/api",
-    "jquery": "^3.3.1",
-    "linkifyjs": "^2.1.9",
-    "moment": "^2.24.0",
-    "popper.js": "^1.14.6",
-    "terser": "^4.1.2",
-    "vue": "^2.5.22",
-    "vue-async-computed": "^3.9.0"
+    "linkifyjs": "^4.0.0",
+    "vue": "^3.4.0"
   },
   "devDependencies": {
-    "@babel/core": "^7.12.16",
-    "@babel/eslint-parser": "^7.12.16",
-    "@vue/cli-plugin-babel": "~5.0.8",
-    "@vue/cli-plugin-eslint": "~5.0.8",
-    "@vue/cli-service": "~5.0.8",
-    "cross-env": "^7.0.3",
-    "eslint": "^7.32.0",
-    "eslint-plugin-vue": "^8.0.3",
-    "file-loader": "^3.0.1",
-    "npm-run-all": "^4.1.5",
-    "prettier": "^2.0.5",
+    "@vitejs/plugin-vue": "^5.0.0",
+    "eslint": "^8.0.0",
+    "eslint-plugin-vue": "^9.0.0",
+    "prettier": "^3.0.0",
     "sass": "^1.54.5",
-    "sass-loader": "^10",
-    "vue-loader": "^15.5.1",
-    "vue-template-compiler": "^2.5.22",
-    "webpack": "^5",
-    "webpack-bundle-tracker": "^0.4.2-beta",
-    "webpack-dev-middleware": "^3.5.1",
-    "webpack-dev-server": "^3.1.14"
-  },
-  "eslintConfig": {
-    "root": true,
-    "env": {
-      "node": true
-    },
-    "extends": [
-      "plugin:vue/essential",
-      "eslint:recommended"
-    ],
-    "rules": {},
-    "parserOptions": {
-      "parser": "@babel/eslint-parser",
-      "requireConfigFile": false
-    }
+    "vite": "^6.0.0"
   },
   "browserslist": [
     "> 1%",
diff --git 
a/airavata-django-portal/django_airavata/static/common/vite.config.js 
b/airavata-django-portal/django_airavata/static/common/vite.config.js
new file mode 100644
index 000000000..3f563a4ad
--- /dev/null
+++ b/airavata-django-portal/django_airavata/static/common/vite.config.js
@@ -0,0 +1,23 @@
+import { defineConfig } from "vite";
+import vue from "@vitejs/plugin-vue";
+import { resolve } from "path";
+
+export default defineConfig({
+  plugins: [vue()],
+  build: {
+    manifest: "manifest.json",
+    outDir: resolve(__dirname, "./dist"),
+    rollupOptions: {
+      input: {
+        app: resolve(__dirname, "./js/main.js"),
+        cms: resolve(__dirname, "./js/cms.js"),
+        notices: resolve(__dirname, "./js/notices.js"),
+      },
+    },
+  },
+  resolve: {
+    alias: {
+      "@": resolve(__dirname, "./js"),
+    },
+  },
+});
diff --git a/airavata-django-portal/django_airavata/static/common/vue.config.js 
b/airavata-django-portal/django_airavata/static/common/vue.config.js
deleted file mode 100644
index aa4379afe..000000000
--- a/airavata-django-portal/django_airavata/static/common/vue.config.js
+++ /dev/null
@@ -1,29 +0,0 @@
-const BundleTracker = require("webpack-bundle-tracker");
-
-module.exports = {
-  publicPath: "/static/common/dist/",
-  pages: {
-    app: "./js/main.js",
-    cms: "./js/cms.js",
-    notices: "./js/notices.js",
-  },
-  configureWebpack: (config) => {
-    if (process.env.LIBRARY_MODE === "true") {
-      // Externalize the django-airavata-api library, will be available to
-      // custom apps as global AiravataAPI object
-      config.externals = config.externals || {};
-      config.externals["django-airavata-api"] = {
-        commonjs: "django-airavata-api",
-        commonjs2: "django-airavata-api",
-        root: "AiravataAPI",
-      };
-    } else {
-      config.plugins.push(
-        new BundleTracker({
-          filename: "webpack-stats.json",
-          path: "./dist/",
-        })
-      );
-    }
-  },
-};
diff --git a/airavata-django-portal/django_airavata/templates/base.html 
b/airavata-django-portal/django_airavata/templates/base.html
index b6ed84a65..6f3362dce 100644
--- a/airavata-django-portal/django_airavata/templates/base.html
+++ b/airavata-django-portal/django_airavata/templates/base.html
@@ -1,5 +1,5 @@
 {% load navigation_tags static %}
-{% load render_bundle from webpack_loader %}
+{% load django_vite %}
 {% load humanize %}
 <!DOCTYPE html>
 
@@ -7,8 +7,7 @@
   {% favicon %}
   {% include "./django_airavata/google_analytics.html" %}
 
-  {% render_bundle 'chunk-vendors' 'css' 'COMMON' %}
-  {% render_bundle 'app' 'css' 'COMMON' %}
+  {% vite_asset "js/main.js" app="default" %}
   {% block css %}
 
   {% endblock %}
@@ -155,15 +154,15 @@
     {% if user.is_authenticated %}
     <div class=c-header__controls>
       <div id="gateway-notices" data-unread-count="{{ unread_notifications }}" 
data-notices="{{ notifications }}"></div>
-      <div class="btn-group ml-3">
+      <div class="btn-group ms-3">
         <div class=dropdown>
-          <a href=# class="dropdown-toggle text-dark" id=appDropdownMenuButton 
data-toggle=dropdown aria-haspopup=true
+          <a href=# class="dropdown-toggle text-dark" id=appDropdownMenuButton 
data-bs-toggle=dropdown aria-haspopup=true
             aria-expanded=false>
             {% if current_airavata_app %}
-            <i class="fa {{ current_airavata_app.fa_icon_class }} mr-2"></i>
+            <i class="fa {{ current_airavata_app.fa_icon_class }} me-2"></i>
             {{ current_airavata_app.verbose_name }}
             {% elif current_custom_app %}
-            <i class="fa {{ current_custom_app.fa_icon_class }} mr-2"></i>
+            <i class="fa {{ current_custom_app.fa_icon_class }} me-2"></i>
             {{ current_custom_app.verbose_name }}
             {% else %}
             Menu
@@ -173,11 +172,11 @@
             {% for app in airavata_apps %}
             {% if app == current_airavata_app %}
             <a class="dropdown-item active" href="{% url app.url_home %}">
-              <i class="fa {{ app.fa_icon_class }} mr-2"></i>{{ 
app.verbose_name }}
+              <i class="fa {{ app.fa_icon_class }} me-2"></i>{{ 
app.verbose_name }}
             </a>
             {% else %}
             <a class="dropdown-item" href="{% url app.url_home %}">
-              <i class="fa {{ app.fa_icon_class }} mr-2"></i>{{ 
app.verbose_name }}
+              <i class="fa {{ app.fa_icon_class }} me-2"></i>{{ 
app.verbose_name }}
             </a>
             {% endif %}
             {% endfor %}
@@ -186,11 +185,11 @@
               {% for app in custom_apps %}
                 {% if current_custom_app and app.label == 
current_custom_app.label %}
                 <a class="dropdown-item active" href="{% url app.url_home %}">
-                  <i class="fa {{ app.fa_icon_class }} mr-2"></i>{{ 
app.verbose_name }}
+                  <i class="fa {{ app.fa_icon_class }} me-2"></i>{{ 
app.verbose_name }}
                 </a>
                 {% else %}
                 <a class="dropdown-item" href="{% url app.url_home %}">
-                  <i class="fa {{ app.fa_icon_class }} mr-2"></i>{{ 
app.verbose_name }}
+                  <i class="fa {{ app.fa_icon_class }} me-2"></i>{{ 
app.verbose_name }}
                 </a>
                 {% endif %}
               {% endfor %}
@@ -199,11 +198,11 @@
           </div>
         </div>
       </div>
-      <div class="btn-group ml-3">
+      <div class="btn-group ms-3">
         <div class=dropdown>
-          <a href=# class="dropdown-toggle text-dark" id=dropdownMenuButton 
data-toggle=dropdown aria-haspopup=true
+          <a href=# class="dropdown-toggle text-dark" id=dropdownMenuButton 
data-bs-toggle=dropdown aria-haspopup=true
             aria-expanded=false>
-            <i class="fa fa-user mr-2"></i>
+            <i class="fa fa-user me-2"></i>
             {{ request.user.first_name }} {{ request.user.last_name }}
           </a>
           <div class=dropdown-menu aria-labelledby=dropdownMenuButton>
@@ -233,13 +232,13 @@
     <nav class=c-nav>
       {% block nav-items %}
         {% for nav_item in airavata_app_nav %}
-          <a href="{% url nav_item.url %}" class="c-nav__item {% if 
nav_item.active %}is-active{% endif %}" data-toggle=tooltip 
data-placement=right title="{{ nav_item.label }}">
-              <i class="{{ nav_item.icon }}"></i> <span class=sr-only>{{ 
nav_item.label }}</span>
+          <a href="{% url nav_item.url %}" class="c-nav__item {% if 
nav_item.active %}is-active{% endif %}" data-bs-toggle=tooltip 
data-bs-placement=right title="{{ nav_item.label }}">
+              <i class="{{ nav_item.icon }}"></i> <span 
class=visually-hidden>{{ nav_item.label }}</span>
           </a>
         {% endfor %}
         {% for nav_item in custom_app_nav %}
-          <a href="{% url nav_item.url %}" class="c-nav__item {% if 
nav_item.active %}is-active{% endif %}" data-toggle=tooltip 
data-placement=right title="{{ nav_item.label }}">
-              <i class="{{ nav_item.icon }}"></i> <span class=sr-only>{{ 
nav_item.label }}</span>
+          <a href="{% url nav_item.url %}" class="c-nav__item {% if 
nav_item.active %}is-active{% endif %}" data-bs-toggle=tooltip 
data-bs-placement=right title="{{ nav_item.label }}">
+              <i class="{{ nav_item.icon }}"></i> <span 
class=visually-hidden>{{ nav_item.label }}</span>
           </a>
         {% endfor %}
       {% endblock %}
@@ -256,10 +255,8 @@
     // provide data for initializing api's session.Session
     window.AiravataPortalSessionData = {{ user_session_data|safe }};
   </script>
-  {% render_bundle 'chunk-vendors' 'js' 'COMMON' %}
-  {% render_bundle 'app' 'js' 'COMMON' %}
   {% if user.is_authenticated %}
-    {% render_bundle 'notices' 'js' 'COMMON' %}
+    {% vite_asset "js/notices.js" app="default" %}
   {% endif %}
   {% block scripts %}
   {% endblock %}
diff --git 
a/airavata-django-portal/django_airavata/templates/includes/head.html 
b/airavata-django-portal/django_airavata/templates/includes/head.html
index 1ae128531..e475c7111 100644
--- a/airavata-django-portal/django_airavata/templates/includes/head.html
+++ b/airavata-django-portal/django_airavata/templates/includes/head.html
@@ -1,5 +1,5 @@
 {% load static navigation_tags %}
-{% load render_bundle from webpack_loader %}
+{% load django_vite %}
 <head>
     <meta charset="utf-8">
     <meta http-equiv="X-UA-Compatible" content="IE=edge">
@@ -22,7 +22,6 @@
     {% include "../django_airavata/google_analytics.html" %}
 
     <!-- Bootstrap Core + Font awesome CSS (see common/js/cms.js) -->
-    {% render_bundle 'chunk-vendors' 'css' 'COMMON' %}
 
     {% block head-extra %}
       {% include "includes/head-extra.html" %}
diff --git a/airavata-django-portal/django_airavata/templates/wagtail_base.html 
b/airavata-django-portal/django_airavata/templates/wagtail_base.html
index 5b4bbab5d..1c7d162e8 100644
--- a/airavata-django-portal/django_airavata/templates/wagtail_base.html
+++ b/airavata-django-portal/django_airavata/templates/wagtail_base.html
@@ -1,5 +1,5 @@
 {% load navigation_tags static wagtailuserbar %}
-{% load render_bundle from webpack_loader %}
+{% load django_vite %}
 
 {% block head %}
     {% include "includes/head.html" %}
@@ -18,8 +18,7 @@
     {% endblock content %}
   </content>
 
-  {% render_bundle 'chunk-vendors' 'js' 'COMMON' %}
-  {% render_bundle 'cms' 'js' 'COMMON' %}
+  {% vite_asset "js/cms.js" app="default" %}
 </body>
 
 </html>
diff --git a/airavata-django-portal/requirements.txt 
b/airavata-django-portal/requirements.txt
index a729e11f9..b4a129d5a 100644
--- a/airavata-django-portal/requirements.txt
+++ b/airavata-django-portal/requirements.txt
@@ -2,7 +2,7 @@ Django==5.1.7
 djangorestframework==3.15.2
 requests==2.32.3
 requests-oauthlib==1.4.0
-django-webpack-loader==3.1.1
+django-vite==3.0.4
 logging-formatter-anticrlf==1.2
 wagtail==6.3.1
 papermill==2.6.0

Reply via email to