mirror of
				https://github.com/pelican-dev/panel.git
				synced 2025-10-31 21:36:52 +01:00 
			
		
		
		
	Add support for actually creating that folder on the daemon
This commit is contained in:
		
							parent
							
								
									0b11532a48
								
							
						
					
					
						commit
						866b3a3aac
					
				
							
								
								
									
										27
									
								
								resources/assets/scripts/api/server/files/createFolder.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								resources/assets/scripts/api/server/files/createFolder.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,27 @@ | ||||
| import {ServerApplicationCredentials} from "@/store/types"; | ||||
| import http from "@/api/http"; | ||||
| import {AxiosError, AxiosRequestConfig} from "axios"; | ||||
| import {ServerData} from "@/models/server"; | ||||
| 
 | ||||
| /** | ||||
|  * Connects to the remote daemon and creates a new folder on the server. | ||||
|  */ | ||||
| export function createFolder(server: ServerData, credentials: ServerApplicationCredentials, path: string): Promise<void> { | ||||
|     const config: AxiosRequestConfig = { | ||||
|         baseURL: credentials.node, | ||||
|         headers: { | ||||
|             'X-Access-Server': server.uuid, | ||||
|             'X-Access-Token': credentials.key, | ||||
|         }, | ||||
|     }; | ||||
| 
 | ||||
|     return new Promise((resolve, reject) => { | ||||
|         http.post('/v1/server/file/folder', { path }, config) | ||||
|             .then(() => { | ||||
|                 resolve(); | ||||
|             }) | ||||
|             .catch((error: AxiosError) => { | ||||
|                 reject(error); | ||||
|             }); | ||||
|     }); | ||||
| } | ||||
| @ -1,5 +1,5 @@ | ||||
| <template> | ||||
|     <Modal :show="visible" v-on:close="onModalClose" :showCloseIcon="false"> | ||||
|     <Modal :show="visible" v-on:close="onModalClose" :showCloseIcon="false" :dismissable="!isLoading"> | ||||
|         <div class="flex items-end"> | ||||
|             <div class="flex-1"> | ||||
|                 <label class="input-label"> | ||||
| @ -16,8 +16,15 @@ | ||||
|                 /> | ||||
|             </div> | ||||
|             <div class="ml-4"> | ||||
|                 <button class="btn btn-primary btn-sm" type="submit" v-on:submit.prevent="submit"> | ||||
|                     Create | ||||
|                 <button type="submit" | ||||
|                         class="btn btn-primary btn-sm" | ||||
|                         v-on:click.prevent="submit" | ||||
|                         :disabled="errors.any() || isLoading" | ||||
|                 > | ||||
|                     <span class="spinner white" v-bind:class="{ hidden: !isLoading }"> </span> | ||||
|                     <span :class="{ hidden: isLoading }"> | ||||
|                         Create | ||||
|                     </span> | ||||
|                 </button> | ||||
|             </div> | ||||
|         </div> | ||||
| @ -31,17 +38,19 @@ | ||||
|     import Vue from 'vue'; | ||||
|     import Modal from '@/components/core/Modal.vue'; | ||||
|     import {mapState} from "vuex"; | ||||
|     import {createFolder} from "@/api/server/files/createFolder"; | ||||
| 
 | ||||
|     export default Vue.extend({ | ||||
|         name: 'CreateFolderModal', | ||||
|         components: {Modal}, | ||||
| 
 | ||||
|         computed: { | ||||
|             ...mapState('server', ['fm']), | ||||
|             ...mapState('server', ['server', 'credentials', 'fm']), | ||||
|         }, | ||||
| 
 | ||||
|         data: function () { | ||||
|             return { | ||||
|                 isLoading: false, | ||||
|                 visible: false, | ||||
|                 folderName: '', | ||||
|             }; | ||||
| @ -55,11 +64,17 @@ | ||||
|             window.events.$on('server:files:open-directory-modal', () => { | ||||
|                 this.visible = true; | ||||
|                 this.$nextTick(() => { | ||||
|                     (this.$refs.folderNameField as HTMLInputElement).focus(); | ||||
|                     if (this.$refs.folderNameField) { | ||||
|                         (this.$refs.folderNameField as HTMLInputElement).focus(); | ||||
|                     } | ||||
|                 }); | ||||
|             }); | ||||
|         }, | ||||
| 
 | ||||
|         beforeDestroy: function () { | ||||
|             window.events.$off('server:files:open-directory-modal'); | ||||
|         }, | ||||
| 
 | ||||
|         methods: { | ||||
|             submit: function () { | ||||
|                 this.$validator.validate().then((result) => { | ||||
| @ -67,7 +82,17 @@ | ||||
|                         return; | ||||
|                     } | ||||
| 
 | ||||
|                     this.onModalClose(); | ||||
|                     this.isLoading = true; | ||||
| 
 | ||||
|                     console.log(`${this.fm.currentDirectory}/${this.folderName.replace(/^\//, '')}`); | ||||
| 
 | ||||
|                     createFolder(this.server, this.credentials, `${this.fm.currentDirectory}/${this.folderName.replace(/^\//, '')}`) | ||||
|                         .then(() => { | ||||
|                             this.$emit('close'); | ||||
|                             this.onModalClose(); | ||||
|                         }) | ||||
|                         .catch(console.error.bind(this)) | ||||
|                         .then(() => this.isLoading = false) | ||||
|                 }); | ||||
|             }, | ||||
| 
 | ||||
|  | ||||
| @ -48,7 +48,7 @@ | ||||
|                 <a href="#" class="block btn btn-primary btn-sm">New File</a> | ||||
|             </div> | ||||
|         </div> | ||||
|         <CreateFolderModal/> | ||||
|         <CreateFolderModal v-on:close="listDirectory"/> | ||||
|     </div> | ||||
| </template> | ||||
| 
 | ||||
| @ -112,8 +112,6 @@ | ||||
|              * Watch the current directory setting and when it changes update the file listing. | ||||
|              */ | ||||
|             currentDirectory: function () { | ||||
|                 this.$store.dispatch('server/updateCurrentDirectory', this.currentDirectory); | ||||
| 
 | ||||
|                 this.listDirectory(); | ||||
|             }, | ||||
| 
 | ||||
| @ -152,6 +150,8 @@ | ||||
|                 this.loading = true; | ||||
| 
 | ||||
|                 const directory = encodeURI(this.currentDirectory.replace(/^\/|\/$/, '')); | ||||
|                 this.$store.dispatch('server/updateCurrentDirectory', `/${directory}`); | ||||
| 
 | ||||
|                 getDirectoryContents(this.$route.params.id, directory) | ||||
|                     .then((response) => { | ||||
|                         this.files = response.files; | ||||
|  | ||||
| @ -2,7 +2,7 @@ | ||||
| import route from '../../../../../vendor/tightenco/ziggy/src/js/route'; | ||||
| import {ActionContext} from "vuex"; | ||||
| import {ServerData} from "@/models/server"; | ||||
| import {FileManagerState, ServerApplicationCredentials, ServerState} from "../types"; | ||||
| import {ServerApplicationCredentials, ServerState} from "../types"; | ||||
| 
 | ||||
| export default { | ||||
|     namespaced: true, | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Dane Everitt
						Dane Everitt