From 5a5546277e57169ed575051c2cefd91dc7863041 Mon Sep 17 00:00:00 2001 From: Elia Zammuto Date: Tue, 6 May 2025 20:56:33 +0200 Subject: [PATCH 1/8] (refactor): Migrate Vue App to Full SPA --- package.json | 5 +- src/confighttp.cpp | 182 +---------- src_assets/common/assets/web/index.html | 168 +--------- .../{ => assets}/images/logo-sunshine-16.png | Bin .../{ => assets}/images/logo-sunshine-45.png | Bin .../images/sunshine-locked-16.png | Bin .../images/sunshine-locked-45.png | Bin .../{ => assets}/images/sunshine-locked.ico | Bin .../{ => assets}/images/sunshine-locked.png | Bin .../{ => assets}/images/sunshine-locked.svg | 0 .../images/sunshine-pausing-16.png | Bin .../images/sunshine-pausing-45.png | Bin .../{ => assets}/images/sunshine-pausing.ico | Bin .../{ => assets}/images/sunshine-pausing.png | Bin .../{ => assets}/images/sunshine-pausing.svg | 0 .../images/sunshine-playing-16.png | Bin .../images/sunshine-playing-45.png | Bin .../{ => assets}/images/sunshine-playing.ico | Bin .../{ => assets}/images/sunshine-playing.png | Bin .../{ => assets}/images/sunshine-playing.svg | 0 .../public/{ => assets}/images/sunshine.ico | Bin src_assets/common/assets/web/src/App.vue | 9 + .../{public => src}/assets/css/sunshine.css | 0 .../web/{ => src/components}/Checkbox.vue | 0 .../web/{ => src/components}/Navbar.vue | 16 +- .../{ => src/components}/PlatformLayout.vue | 0 .../web/{ => src/components}/ResourceCard.vue | 0 .../web/{ => src/components}/ThemeToggle.vue | 2 +- .../components}/configs/tabs/Advanced.vue | 0 .../components}/configs/tabs/AudioVideo.vue | 2 +- .../configs/tabs/ContainerEncoders.vue | 0 .../components}/configs/tabs/Files.vue | 0 .../components}/configs/tabs/General.vue | 0 .../components}/configs/tabs/Inputs.vue | 0 .../components}/configs/tabs/Network.vue | 0 .../tabs/audiovideo/AdapterNameSelector.vue | 2 +- .../tabs/audiovideo/DisplayDeviceOptions.vue | 2 +- .../tabs/audiovideo/DisplayModesSettings.vue | 2 +- .../tabs/audiovideo/DisplayOutputSelector.vue | 2 +- .../configs/tabs/encoders/AmdAmfEncoder.vue | 0 .../tabs/encoders/IntelQuickSyncEncoder.vue | 0 .../tabs/encoders/NvidiaNvencEncoder.vue | 0 .../configs/tabs/encoders/SoftwareEncoder.vue | 0 .../configs/tabs/encoders/VAAPIEncoder.vue | 0 .../tabs/encoders/VideotoolboxEncoder.vue | 0 src_assets/common/assets/web/src/main.js | 12 + .../common/assets/web/{ => src/utils}/init.js | 8 +- .../assets/web/{ => src/utils}/locale.js | 4 +- .../web/{ => src/utils}/platform-i18n.js | 0 .../common/assets/web/src/utils/router.js | 28 ++ .../web/{ => src/utils}/sunshine_version.js | 0 .../assets/web/{ => src/utils}/theme.js | 0 .../web/{apps.html => src/views/AppsView.vue} | 160 +++++----- .../{config.html => src/views/ConfigView.vue} | 63 ++-- .../common/assets/web/src/views/IndexView.vue | 168 ++++++++++ .../views/PasswordView.vue} | 49 ++- .../web/{pin.html => src/views/PinView.vue} | 68 +++-- .../web/src/views/TroubleshootingView.vue | 274 +++++++++++++++++ .../views/WelcomeView.vue} | 105 +++---- .../common/assets/web/template_header.html | 9 - .../common/assets/web/troubleshooting.html | 286 ------------------ vite.config.js | 29 +- 62 files changed, 748 insertions(+), 907 deletions(-) rename src_assets/common/assets/web/public/{ => assets}/images/logo-sunshine-16.png (100%) rename src_assets/common/assets/web/public/{ => assets}/images/logo-sunshine-45.png (100%) rename src_assets/common/assets/web/public/{ => assets}/images/sunshine-locked-16.png (100%) rename src_assets/common/assets/web/public/{ => assets}/images/sunshine-locked-45.png (100%) rename src_assets/common/assets/web/public/{ => assets}/images/sunshine-locked.ico (100%) rename src_assets/common/assets/web/public/{ => assets}/images/sunshine-locked.png (100%) rename src_assets/common/assets/web/public/{ => assets}/images/sunshine-locked.svg (100%) rename src_assets/common/assets/web/public/{ => assets}/images/sunshine-pausing-16.png (100%) rename src_assets/common/assets/web/public/{ => assets}/images/sunshine-pausing-45.png (100%) rename src_assets/common/assets/web/public/{ => assets}/images/sunshine-pausing.ico (100%) rename src_assets/common/assets/web/public/{ => assets}/images/sunshine-pausing.png (100%) rename src_assets/common/assets/web/public/{ => assets}/images/sunshine-pausing.svg (100%) rename src_assets/common/assets/web/public/{ => assets}/images/sunshine-playing-16.png (100%) rename src_assets/common/assets/web/public/{ => assets}/images/sunshine-playing-45.png (100%) rename src_assets/common/assets/web/public/{ => assets}/images/sunshine-playing.ico (100%) rename src_assets/common/assets/web/public/{ => assets}/images/sunshine-playing.png (100%) rename src_assets/common/assets/web/public/{ => assets}/images/sunshine-playing.svg (100%) rename src_assets/common/assets/web/public/{ => assets}/images/sunshine.ico (100%) create mode 100644 src_assets/common/assets/web/src/App.vue rename src_assets/common/assets/web/{public => src}/assets/css/sunshine.css (100%) rename src_assets/common/assets/web/{ => src/components}/Checkbox.vue (100%) rename src_assets/common/assets/web/{ => src/components}/Navbar.vue (67%) rename src_assets/common/assets/web/{ => src/components}/PlatformLayout.vue (100%) rename src_assets/common/assets/web/{ => src/components}/ResourceCard.vue (100%) rename src_assets/common/assets/web/{ => src/components}/ThemeToggle.vue (95%) rename src_assets/common/assets/web/{ => src/components}/configs/tabs/Advanced.vue (100%) rename src_assets/common/assets/web/{ => src/components}/configs/tabs/AudioVideo.vue (98%) rename src_assets/common/assets/web/{ => src/components}/configs/tabs/ContainerEncoders.vue (100%) rename src_assets/common/assets/web/{ => src/components}/configs/tabs/Files.vue (100%) rename src_assets/common/assets/web/{ => src/components}/configs/tabs/General.vue (100%) rename src_assets/common/assets/web/{ => src/components}/configs/tabs/Inputs.vue (100%) rename src_assets/common/assets/web/{ => src/components}/configs/tabs/Network.vue (100%) rename src_assets/common/assets/web/{ => src/components}/configs/tabs/audiovideo/AdapterNameSelector.vue (96%) rename src_assets/common/assets/web/{ => src/components}/configs/tabs/audiovideo/DisplayDeviceOptions.vue (99%) rename src_assets/common/assets/web/{ => src/components}/configs/tabs/audiovideo/DisplayModesSettings.vue (95%) rename src_assets/common/assets/web/{ => src/components}/configs/tabs/audiovideo/DisplayOutputSelector.vue (97%) rename src_assets/common/assets/web/{ => src/components}/configs/tabs/encoders/AmdAmfEncoder.vue (100%) rename src_assets/common/assets/web/{ => src/components}/configs/tabs/encoders/IntelQuickSyncEncoder.vue (100%) rename src_assets/common/assets/web/{ => src/components}/configs/tabs/encoders/NvidiaNvencEncoder.vue (100%) rename src_assets/common/assets/web/{ => src/components}/configs/tabs/encoders/SoftwareEncoder.vue (100%) rename src_assets/common/assets/web/{ => src/components}/configs/tabs/encoders/VAAPIEncoder.vue (100%) rename src_assets/common/assets/web/{ => src/components}/configs/tabs/encoders/VideotoolboxEncoder.vue (100%) create mode 100644 src_assets/common/assets/web/src/main.js rename src_assets/common/assets/web/{ => src/utils}/init.js (69%) rename src_assets/common/assets/web/{ => src/utils}/locale.js (83%) rename src_assets/common/assets/web/{ => src/utils}/platform-i18n.js (100%) create mode 100644 src_assets/common/assets/web/src/utils/router.js rename src_assets/common/assets/web/{ => src/utils}/sunshine_version.js (100%) rename src_assets/common/assets/web/{ => src/utils}/theme.js (100%) rename src_assets/common/assets/web/{apps.html => src/views/AppsView.vue} (91%) rename src_assets/common/assets/web/{config.html => src/views/ConfigView.vue} (94%) create mode 100644 src_assets/common/assets/web/src/views/IndexView.vue rename src_assets/common/assets/web/{password.html => src/views/PasswordView.vue} (86%) rename src_assets/common/assets/web/{pin.html => src/views/PinView.vue} (56%) create mode 100644 src_assets/common/assets/web/src/views/TroubleshootingView.vue rename src_assets/common/assets/web/{welcome.html => src/views/WelcomeView.vue} (58%) delete mode 100644 src_assets/common/assets/web/template_header.html delete mode 100644 src_assets/common/assets/web/troubleshooting.html diff --git a/package.json b/package.json index 96fc8fc88d9..801b18c5566 100644 --- a/package.json +++ b/package.json @@ -4,13 +4,14 @@ "scripts": { "build": "vite build --debug", "build-clean": "vite build --debug --emptyOutDir", - "dev": "vite build --watch", + "dev": "vite", "serve": "serve ./tests/fixtures/http --no-port-switching" }, "dependencies": { "@lizardbyte/shared-web": "2025.326.11214", "vue": "3.5.13", - "vue-i18n": "11.1.3" + "vue-i18n": "11.1.3", + "vue-router": "^4.5.1" }, "devDependencies": { "@vitejs/plugin-vue": "4.6.2", diff --git a/src/confighttp.cpp b/src/confighttp.cpp index 4ba09b88a5a..4f3b7ecbba7 100644 --- a/src/confighttp.cpp +++ b/src/confighttp.cpp @@ -142,10 +142,19 @@ namespace confighttp { // If credentials are shown, redirect the user to a /welcome page if (config::sunshine.username.empty()) { + if(request->path == "/welcome"){ + return true; + } send_redirect(response, request, "/welcome"); return false; } + //Redirect after /welcome to / + if(request->path == "/welcome"){ + send_redirect(response, request, "/"); + return false; + } + auto fg = util::fail_guard([&]() { send_unauthorized(response, request); }); @@ -225,171 +234,13 @@ namespace confighttp { } print_req(request); - + if(request->path.starts_with("/api"))return not_found(response,request); std::string content = file_handler::read_file(WEB_DIR "index.html"); SimpleWeb::CaseInsensitiveMultimap headers; headers.emplace("Content-Type", "text/html; charset=utf-8"); response->write(content, headers); } - - /** - * @brief Get the PIN page. - * @param response The HTTP response object. - * @param request The HTTP request object. - */ - void getPinPage(resp_https_t response, req_https_t request) { - if (!authenticate(response, request)) { - return; - } - - print_req(request); - - std::string content = file_handler::read_file(WEB_DIR "pin.html"); - SimpleWeb::CaseInsensitiveMultimap headers; - headers.emplace("Content-Type", "text/html; charset=utf-8"); - response->write(content, headers); - } - - /** - * @brief Get the apps page. - * @param response The HTTP response object. - * @param request The HTTP request object. - */ - void getAppsPage(resp_https_t response, req_https_t request) { - if (!authenticate(response, request)) { - return; - } - - print_req(request); - - std::string content = file_handler::read_file(WEB_DIR "apps.html"); - SimpleWeb::CaseInsensitiveMultimap headers; - headers.emplace("Content-Type", "text/html; charset=utf-8"); - headers.emplace("Access-Control-Allow-Origin", "https://images.igdb.com/"); - response->write(content, headers); - } - - /** - * @brief Get the clients page. - * @param response The HTTP response object. - * @param request The HTTP request object. - */ - void getClientsPage(resp_https_t response, req_https_t request) { - if (!authenticate(response, request)) { - return; - } - - print_req(request); - - std::string content = file_handler::read_file(WEB_DIR "clients.html"); - SimpleWeb::CaseInsensitiveMultimap headers; - headers.emplace("Content-Type", "text/html; charset=utf-8"); - response->write(content, headers); - } - - /** - * @brief Get the configuration page. - * @param response The HTTP response object. - * @param request The HTTP request object. - */ - void getConfigPage(resp_https_t response, req_https_t request) { - if (!authenticate(response, request)) { - return; - } - - print_req(request); - - std::string content = file_handler::read_file(WEB_DIR "config.html"); - SimpleWeb::CaseInsensitiveMultimap headers; - headers.emplace("Content-Type", "text/html; charset=utf-8"); - response->write(content, headers); - } - - /** - * @brief Get the password page. - * @param response The HTTP response object. - * @param request The HTTP request object. - */ - void getPasswordPage(resp_https_t response, req_https_t request) { - if (!authenticate(response, request)) { - return; - } - - print_req(request); - - std::string content = file_handler::read_file(WEB_DIR "password.html"); - SimpleWeb::CaseInsensitiveMultimap headers; - headers.emplace("Content-Type", "text/html; charset=utf-8"); - response->write(content, headers); - } - - /** - * @brief Get the welcome page. - * @param response The HTTP response object. - * @param request The HTTP request object. - */ - void getWelcomePage(resp_https_t response, req_https_t request) { - print_req(request); - if (!config::sunshine.username.empty()) { - send_redirect(response, request, "/"); - return; - } - std::string content = file_handler::read_file(WEB_DIR "welcome.html"); - SimpleWeb::CaseInsensitiveMultimap headers; - headers.emplace("Content-Type", "text/html; charset=utf-8"); - response->write(content, headers); - } - - /** - * @brief Get the troubleshooting page. - * @param response The HTTP response object. - * @param request The HTTP request object. - */ - void getTroubleshootingPage(resp_https_t response, req_https_t request) { - if (!authenticate(response, request)) { - return; - } - - print_req(request); - - std::string content = file_handler::read_file(WEB_DIR "troubleshooting.html"); - SimpleWeb::CaseInsensitiveMultimap headers; - headers.emplace("Content-Type", "text/html; charset=utf-8"); - response->write(content, headers); - } - - /** - * @brief Get the favicon image. - * @param response The HTTP response object. - * @param request The HTTP request object. - * @todo combine function with getSunshineLogoImage and possibly getNodeModules - * @todo use mime_types map - */ - void getFaviconImage(resp_https_t response, req_https_t request) { - print_req(request); - - std::ifstream in(WEB_DIR "images/sunshine.ico", std::ios::binary); - SimpleWeb::CaseInsensitiveMultimap headers; - headers.emplace("Content-Type", "image/x-icon"); - response->write(SimpleWeb::StatusCode::success_ok, in, headers); - } - - /** - * @brief Get the Sunshine logo image. - * @param response The HTTP response object. - * @param request The HTTP request object. - * @todo combine function with getFaviconImage and possibly getNodeModules - * @todo use mime_types map - */ - void getSunshineLogoImage(resp_https_t response, req_https_t request) { - print_req(request); - - std::ifstream in(WEB_DIR "images/logo-sunshine-45.png", std::ios::binary); - SimpleWeb::CaseInsensitiveMultimap headers; - headers.emplace("Content-Type", "image/png"); - response->write(SimpleWeb::StatusCode::success_ok, in, headers); - } - + /** * @brief Check if a path is a child of another path. * @param base The base path. @@ -1092,15 +943,8 @@ namespace confighttp { server.default_resource["PUT"] = [](resp_https_t response, req_https_t request) { bad_request(response, request); }; - server.default_resource["GET"] = not_found; + server.default_resource["GET"] = getIndexPage; server.resource["^/$"]["GET"] = getIndexPage; - server.resource["^/pin/?$"]["GET"] = getPinPage; - server.resource["^/apps/?$"]["GET"] = getAppsPage; - server.resource["^/clients/?$"]["GET"] = getClientsPage; - server.resource["^/config/?$"]["GET"] = getConfigPage; - server.resource["^/password/?$"]["GET"] = getPasswordPage; - server.resource["^/welcome/?$"]["GET"] = getWelcomePage; - server.resource["^/troubleshooting/?$"]["GET"] = getTroubleshootingPage; server.resource["^/api/pin$"]["POST"] = savePin; server.resource["^/api/apps$"]["GET"] = getApps; server.resource["^/api/logs$"]["GET"] = getLogs; @@ -1117,8 +961,6 @@ namespace confighttp { server.resource["^/api/clients/unpair$"]["POST"] = unpair; server.resource["^/api/apps/close$"]["POST"] = closeApp; server.resource["^/api/covers/upload$"]["POST"] = uploadCover; - server.resource["^/images/sunshine.ico$"]["GET"] = getFaviconImage; - server.resource["^/images/logo-sunshine-45.png$"]["GET"] = getSunshineLogoImage; server.resource["^/assets\\/.+$"]["GET"] = getNodeModules; server.config.reuse_address = true; server.config.address = net::af_to_any_address_string(address_family); diff --git a/src_assets/common/assets/web/index.html b/src_assets/common/assets/web/index.html index 4a8660af376..2876e01a29c 100644 --- a/src_assets/common/assets/web/index.html +++ b/src_assets/common/assets/web/index.html @@ -1,157 +1,15 @@ - - - <%- header %> - - - - -
-

{{ $t('index.welcome') }}

-

{{ $t('index.description') }}

-
-
- -

-
-
-
    -
  • {{v.value}}
  • -
- View Logs -
- -
-
-

Version {{version.version}}

-
-
- {{ $t('index.loading_latest') }} -
-
- {{ $t('index.version_dirty') }} 🌇 -
-
- {{ $t('index.installed_version_not_stable') }} -
-
-
- {{ $t('index.version_latest') }} -
-
-
-
-
-
-

{{ $t('index.new_pre_release') }}

-
- {{ $t('index.download') }} -
-
{{preReleaseVersion.release.name}}
-
{{preReleaseVersion.release.body}}
-
-
-
-
-
-
-

{{ $t('index.new_stable') }}

-
- {{ $t('index.download') }} -
-

{{githubVersion.release.name}}

-
{{githubVersion.release.body}}
-
-
-
-
- -
- -
-
- - - + + + + + Sunshine + + + + + +
+ + diff --git a/src_assets/common/assets/web/public/images/logo-sunshine-16.png b/src_assets/common/assets/web/public/assets/images/logo-sunshine-16.png similarity index 100% rename from src_assets/common/assets/web/public/images/logo-sunshine-16.png rename to src_assets/common/assets/web/public/assets/images/logo-sunshine-16.png diff --git a/src_assets/common/assets/web/public/images/logo-sunshine-45.png b/src_assets/common/assets/web/public/assets/images/logo-sunshine-45.png similarity index 100% rename from src_assets/common/assets/web/public/images/logo-sunshine-45.png rename to src_assets/common/assets/web/public/assets/images/logo-sunshine-45.png diff --git a/src_assets/common/assets/web/public/images/sunshine-locked-16.png b/src_assets/common/assets/web/public/assets/images/sunshine-locked-16.png similarity index 100% rename from src_assets/common/assets/web/public/images/sunshine-locked-16.png rename to src_assets/common/assets/web/public/assets/images/sunshine-locked-16.png diff --git a/src_assets/common/assets/web/public/images/sunshine-locked-45.png b/src_assets/common/assets/web/public/assets/images/sunshine-locked-45.png similarity index 100% rename from src_assets/common/assets/web/public/images/sunshine-locked-45.png rename to src_assets/common/assets/web/public/assets/images/sunshine-locked-45.png diff --git a/src_assets/common/assets/web/public/images/sunshine-locked.ico b/src_assets/common/assets/web/public/assets/images/sunshine-locked.ico similarity index 100% rename from src_assets/common/assets/web/public/images/sunshine-locked.ico rename to src_assets/common/assets/web/public/assets/images/sunshine-locked.ico diff --git a/src_assets/common/assets/web/public/images/sunshine-locked.png b/src_assets/common/assets/web/public/assets/images/sunshine-locked.png similarity index 100% rename from src_assets/common/assets/web/public/images/sunshine-locked.png rename to src_assets/common/assets/web/public/assets/images/sunshine-locked.png diff --git a/src_assets/common/assets/web/public/images/sunshine-locked.svg b/src_assets/common/assets/web/public/assets/images/sunshine-locked.svg similarity index 100% rename from src_assets/common/assets/web/public/images/sunshine-locked.svg rename to src_assets/common/assets/web/public/assets/images/sunshine-locked.svg diff --git a/src_assets/common/assets/web/public/images/sunshine-pausing-16.png b/src_assets/common/assets/web/public/assets/images/sunshine-pausing-16.png similarity index 100% rename from src_assets/common/assets/web/public/images/sunshine-pausing-16.png rename to src_assets/common/assets/web/public/assets/images/sunshine-pausing-16.png diff --git a/src_assets/common/assets/web/public/images/sunshine-pausing-45.png b/src_assets/common/assets/web/public/assets/images/sunshine-pausing-45.png similarity index 100% rename from src_assets/common/assets/web/public/images/sunshine-pausing-45.png rename to src_assets/common/assets/web/public/assets/images/sunshine-pausing-45.png diff --git a/src_assets/common/assets/web/public/images/sunshine-pausing.ico b/src_assets/common/assets/web/public/assets/images/sunshine-pausing.ico similarity index 100% rename from src_assets/common/assets/web/public/images/sunshine-pausing.ico rename to src_assets/common/assets/web/public/assets/images/sunshine-pausing.ico diff --git a/src_assets/common/assets/web/public/images/sunshine-pausing.png b/src_assets/common/assets/web/public/assets/images/sunshine-pausing.png similarity index 100% rename from src_assets/common/assets/web/public/images/sunshine-pausing.png rename to src_assets/common/assets/web/public/assets/images/sunshine-pausing.png diff --git a/src_assets/common/assets/web/public/images/sunshine-pausing.svg b/src_assets/common/assets/web/public/assets/images/sunshine-pausing.svg similarity index 100% rename from src_assets/common/assets/web/public/images/sunshine-pausing.svg rename to src_assets/common/assets/web/public/assets/images/sunshine-pausing.svg diff --git a/src_assets/common/assets/web/public/images/sunshine-playing-16.png b/src_assets/common/assets/web/public/assets/images/sunshine-playing-16.png similarity index 100% rename from src_assets/common/assets/web/public/images/sunshine-playing-16.png rename to src_assets/common/assets/web/public/assets/images/sunshine-playing-16.png diff --git a/src_assets/common/assets/web/public/images/sunshine-playing-45.png b/src_assets/common/assets/web/public/assets/images/sunshine-playing-45.png similarity index 100% rename from src_assets/common/assets/web/public/images/sunshine-playing-45.png rename to src_assets/common/assets/web/public/assets/images/sunshine-playing-45.png diff --git a/src_assets/common/assets/web/public/images/sunshine-playing.ico b/src_assets/common/assets/web/public/assets/images/sunshine-playing.ico similarity index 100% rename from src_assets/common/assets/web/public/images/sunshine-playing.ico rename to src_assets/common/assets/web/public/assets/images/sunshine-playing.ico diff --git a/src_assets/common/assets/web/public/images/sunshine-playing.png b/src_assets/common/assets/web/public/assets/images/sunshine-playing.png similarity index 100% rename from src_assets/common/assets/web/public/images/sunshine-playing.png rename to src_assets/common/assets/web/public/assets/images/sunshine-playing.png diff --git a/src_assets/common/assets/web/public/images/sunshine-playing.svg b/src_assets/common/assets/web/public/assets/images/sunshine-playing.svg similarity index 100% rename from src_assets/common/assets/web/public/images/sunshine-playing.svg rename to src_assets/common/assets/web/public/assets/images/sunshine-playing.svg diff --git a/src_assets/common/assets/web/public/images/sunshine.ico b/src_assets/common/assets/web/public/assets/images/sunshine.ico similarity index 100% rename from src_assets/common/assets/web/public/images/sunshine.ico rename to src_assets/common/assets/web/public/assets/images/sunshine.ico diff --git a/src_assets/common/assets/web/src/App.vue b/src_assets/common/assets/web/src/App.vue new file mode 100644 index 00000000000..0a463ef9346 --- /dev/null +++ b/src_assets/common/assets/web/src/App.vue @@ -0,0 +1,9 @@ + + diff --git a/src_assets/common/assets/web/public/assets/css/sunshine.css b/src_assets/common/assets/web/src/assets/css/sunshine.css similarity index 100% rename from src_assets/common/assets/web/public/assets/css/sunshine.css rename to src_assets/common/assets/web/src/assets/css/sunshine.css diff --git a/src_assets/common/assets/web/Checkbox.vue b/src_assets/common/assets/web/src/components/Checkbox.vue similarity index 100% rename from src_assets/common/assets/web/Checkbox.vue rename to src_assets/common/assets/web/src/components/Checkbox.vue diff --git a/src_assets/common/assets/web/Navbar.vue b/src_assets/common/assets/web/src/components/Navbar.vue similarity index 67% rename from src_assets/common/assets/web/Navbar.vue rename to src_assets/common/assets/web/src/components/Navbar.vue index 166398b9fa7..c041c688a00 100644 --- a/src_assets/common/assets/web/Navbar.vue +++ b/src_assets/common/assets/web/src/components/Navbar.vue @@ -2,7 +2,7 @@