diff --git a/Cargo.lock b/Cargo.lock index 639c608a67..32e948366f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10241,6 +10241,7 @@ dependencies = [ name = "theseus_gui" version = "1.0.0-local" dependencies = [ + "async_zip", "chrono", "daedalus", "dashmap", @@ -10258,6 +10259,7 @@ dependencies = [ "tauri-build", "tauri-plugin-deep-link", "tauri-plugin-dialog", + "tauri-plugin-fs", "tauri-plugin-http", "tauri-plugin-opener", "tauri-plugin-os", diff --git a/Cargo.toml b/Cargo.toml index ae3f355d09..236d953c4d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -179,6 +179,7 @@ tauri = "2.8.5" tauri-build = "2.4.1" tauri-plugin-deep-link = "2.4.3" tauri-plugin-dialog = "2.4.0" +tauri-plugin-fs = "2.4.5" tauri-plugin-http = "2.5.7" tauri-plugin-opener = "2.5.0" tauri-plugin-os = "2.3.1" diff --git a/apps/app-frontend/package.json b/apps/app-frontend/package.json index e44564ae98..d67c464a7c 100644 --- a/apps/app-frontend/package.json +++ b/apps/app-frontend/package.json @@ -22,6 +22,7 @@ "@tanstack/vue-query": "^5.90.7", "@tauri-apps/api": "^2.5.0", "@tauri-apps/plugin-dialog": "^2.2.1", + "@tauri-apps/plugin-fs": "^2.4.5", "@tauri-apps/plugin-http": "~2.5.7", "@tauri-apps/plugin-opener": "^2.2.6", "@tauri-apps/plugin-os": "^2.2.1", diff --git a/apps/app-frontend/src/components/ui/NavTabs.vue b/apps/app-frontend/src/components/ui/NavTabs.vue deleted file mode 100644 index 743d0dbc4a..0000000000 --- a/apps/app-frontend/src/components/ui/NavTabs.vue +++ /dev/null @@ -1,185 +0,0 @@ - - - - diff --git a/apps/app-frontend/src/locales/en-US/index.json b/apps/app-frontend/src/locales/en-US/index.json index 8d9bbdcdea..dabe0fc24f 100644 --- a/apps/app-frontend/src/locales/en-US/index.json +++ b/apps/app-frontend/src/locales/en-US/index.json @@ -299,6 +299,30 @@ "instance.edit-world.title": { "message": "Edit world" }, + "instance.files.adding-files": { + "message": "Adding files ({completed}/{total})" + }, + "instance.files.create-failed": { + "message": "Create failed" + }, + "instance.files.delete-failed": { + "message": "Delete failed" + }, + "instance.files.extract-failed": { + "message": "Extract failed" + }, + "instance.files.move-failed": { + "message": "Move failed" + }, + "instance.files.rename-failed": { + "message": "Rename failed" + }, + "instance.files.save-as": { + "message": "Save as..." + }, + "instance.files.upload-failed": { + "message": "Upload failed" + }, "instance.server-modal.address": { "message": "Address" }, diff --git a/apps/app-frontend/src/pages/Browse.vue b/apps/app-frontend/src/pages/Browse.vue index ce2f8502e5..ae8a07ddbb 100644 --- a/apps/app-frontend/src/pages/Browse.vue +++ b/apps/app-frontend/src/pages/Browse.vue @@ -18,6 +18,7 @@ import { DropdownSelect, injectNotificationManager, LoadingIndicator, + NavTabs, Pagination, ProjectCard, ProjectCardList, @@ -38,7 +39,6 @@ import { useRoute, useRouter } from 'vue-router' import ContextMenu from '@/components/ui/ContextMenu.vue' import type Instance from '@/components/ui/Instance.vue' import InstanceIndicator from '@/components/ui/InstanceIndicator.vue' -import NavTabs from '@/components/ui/NavTabs.vue' import SearchCard from '@/components/ui/SearchCard.vue' import { get_project_v3, get_search_results_v3 } from '@/helpers/cache.js' import { process_listener } from '@/helpers/events' diff --git a/apps/app-frontend/src/pages/instance/Files.vue b/apps/app-frontend/src/pages/instance/Files.vue new file mode 100644 index 0000000000..0bd0c19bcd --- /dev/null +++ b/apps/app-frontend/src/pages/instance/Files.vue @@ -0,0 +1,371 @@ + + + diff --git a/apps/app-frontend/src/pages/instance/Index.vue b/apps/app-frontend/src/pages/instance/Index.vue index 52c51bcfb3..8a7ef98c19 100644 --- a/apps/app-frontend/src/pages/instance/Index.vue +++ b/apps/app-frontend/src/pages/instance/Index.vue @@ -285,6 +285,7 @@ @@ -319,12 +320,14 @@ import { MIN_SUMMARY_CHARS } from '@modrinth/moderation' import { Avatar, Combobox, + ConfirmLeaveModal, ConfirmModal, injectModrinthClient, injectNotificationManager, injectProjectPageContext, StyledInput, UnsavedChangesPopup, + usePageLeaveSafety, } from '@modrinth/ui' import { fileIsValid, formatProjectStatus, formatProjectType } from '@modrinth/utils' @@ -480,6 +483,12 @@ const modified = computed(() => ({ deletedBanner: deletedBanner.value, })) +const hasChanges = computed(() => + Object.keys(modified.value).some((key) => original.value[key] !== modified.value[key]), +) + +const { confirmLeaveModal } = usePageLeaveSafety(hasChanges) + function resetChanges() { name.value = project.value.title slug.value = project.value.slug diff --git a/apps/frontend/src/pages/[type]/[id]/settings/license.vue b/apps/frontend/src/pages/[type]/[id]/settings/license.vue index 4a18ed2201..682b60ecf4 100644 --- a/apps/frontend/src/pages/[type]/[id]/settings/license.vue +++ b/apps/frontend/src/pages/[type]/[id]/settings/license.vue @@ -1,5 +1,6 @@