diff --git a/src/kohaku-hub-ui/package-lock.json b/src/kohaku-hub-ui/package-lock.json index 6f5854b..f7b118d 100644 --- a/src/kohaku-hub-ui/package-lock.json +++ b/src/kohaku-hub-ui/package-lock.json @@ -565,7 +565,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -610,7 +609,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -1280,7 +1278,6 @@ "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", "license": "MIT", - "peer": true, "dependencies": { "@types/lodash": "*" } @@ -1813,7 +1810,6 @@ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.22.tgz", "integrity": "sha512-tbTR1zKGce4Lj+JLzFXDq36K4vcSZbJ1RBu8FxcDv1IGRz//Dh2EBqksyGVypz3kXpshIfWKGOCcqpSbyGWRJQ==", "license": "MIT", - "peer": true, "dependencies": { "@babel/parser": "^7.28.4", "@vue/compiler-core": "3.5.22", @@ -3321,15 +3317,13 @@ "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/lodash-es": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/lodash-unified": { "version": "1.0.3", @@ -3677,7 +3671,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -4332,7 +4325,6 @@ "integrity": "sha512-eSiiRJmovt8qDJkGyZuLnbxAOAdie6NCmmd0NkTC0RJI9duiSBTfr8X2mBYJOUFzxQa2USaHmL99J9uMxkjCyw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@oxc-project/runtime": "0.92.0", "fdir": "^6.5.0", @@ -4408,7 +4400,6 @@ "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.22.tgz", "integrity": "sha512-toaZjQ3a/G/mYaLSbV+QsQhIdMo9x5rrqIpYRObsJ6T/J+RyCSFwN2LHNVH9v8uIcljDNa3QzPVdv3Y6b9hAJQ==", "license": "MIT", - "peer": true, "dependencies": { "@vue/compiler-dom": "3.5.22", "@vue/compiler-sfc": "3.5.22", diff --git a/src/kohaku-hub-ui/src/components.d.ts b/src/kohaku-hub-ui/src/components.d.ts index 892e56d..73a7984 100644 --- a/src/kohaku-hub-ui/src/components.d.ts +++ b/src/kohaku-hub-ui/src/components.d.ts @@ -10,10 +10,27 @@ declare module 'vue' { export interface GlobalComponents { CodeEditor: typeof import('./components/common/CodeEditor.vue')['default'] CodeViewer: typeof import('./components/common/CodeViewer.vue')['default'] + ElBreadcrumb: typeof import('element-plus/es')['ElBreadcrumb'] + ElBreadcrumbItem: typeof import('element-plus/es')['ElBreadcrumbItem'] ElButton: typeof import('element-plus/es')['ElButton'] + ElCheckbox: typeof import('element-plus/es')['ElCheckbox'] + ElDialog: typeof import('element-plus/es')['ElDialog'] ElDropdown: typeof import('element-plus/es')['ElDropdown'] ElDropdownItem: typeof import('element-plus/es')['ElDropdownItem'] ElDropdownMenu: typeof import('element-plus/es')['ElDropdownMenu'] + ElForm: typeof import('element-plus/es')['ElForm'] + ElFormItem: typeof import('element-plus/es')['ElFormItem'] + ElIcon: typeof import('element-plus/es')['ElIcon'] + ElInput: typeof import('element-plus/es')['ElInput'] + ElOption: typeof import('element-plus/es')['ElOption'] + ElProgress: typeof import('element-plus/es')['ElProgress'] + ElRadio: typeof import('element-plus/es')['ElRadio'] + ElRadioButton: typeof import('element-plus/es')['ElRadioButton'] + ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup'] + ElSelect: typeof import('element-plus/es')['ElSelect'] + ElSkeleton: typeof import('element-plus/es')['ElSkeleton'] + ElTabPane: typeof import('element-plus/es')['ElTabPane'] + ElTabs: typeof import('element-plus/es')['ElTabs'] ElTag: typeof import('element-plus/es')['ElTag'] FileUploader: typeof import('./components/repo/FileUploader.vue')['default'] HelloWorld: typeof import('./components/HelloWorld.vue')['default'] diff --git a/src/kohakuhub/api/file.py b/src/kohakuhub/api/file.py index c601d71..558139f 100644 --- a/src/kohakuhub/api/file.py +++ b/src/kohakuhub/api/file.py @@ -399,6 +399,7 @@ async def resolve_file( if obj_stat.mtime else "" ), + "Content-Disposition": f'attachment; filename="{path}";', } # Handle HEAD request (metadata only) diff --git a/src/kohakuhub/api/s3_utils.py b/src/kohakuhub/api/s3_utils.py index 1686012..a9288aa 100644 --- a/src/kohakuhub/api/s3_utils.py +++ b/src/kohakuhub/api/s3_utils.py @@ -82,7 +82,7 @@ def generate_download_presigned_url( # Add Content-Disposition if filename specified if filename: - params["ResponseContentDisposition"] = f'inline; filename="{filename}"' + params["ResponseContentDisposition"] = f'attachment; filename="{filename}";' url = s3.generate_presigned_url( "get_object",