mirror of
https://github.com/Eugeny/tabby.git
synced 2025-06-09 05:50:08 +00:00
Merge remote-tracking branch 'origin' into sftp
This commit is contained in:
commit
d1532f64a0
@ -673,6 +673,15 @@
|
|||||||
"contributions": [
|
"contributions": [
|
||||||
"code"
|
"code"
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "artu-ole",
|
||||||
|
"name": "artu-ole",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/15938416?v=4",
|
||||||
|
"profile": "https://github.com/artu-ole",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"contributorsPerLine": 7,
|
"contributorsPerLine": 7,
|
||||||
|
@ -243,6 +243,7 @@ Grazie a queste persone meravigliose ([emoji key](https://allcontributors.org/do
|
|||||||
<td align="center"><a href="http://microhobby.com.br/blog"><img src="https://avatars.githubusercontent.com/u/2633321?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Matheus Castello</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=microhobby" title="Code">💻</a></td>
|
<td align="center"><a href="http://microhobby.com.br/blog"><img src="https://avatars.githubusercontent.com/u/2633321?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Matheus Castello</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=microhobby" title="Code">💻</a></td>
|
||||||
<td align="center"><a href="https://github.com/Jai-JAP"><img src="https://avatars.githubusercontent.com/u/78354625?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jai A P</b></sub></a><br /><a href="#platform-Jai-JAP" title="Packaging/porting to new platform">📦</a></td>
|
<td align="center"><a href="https://github.com/Jai-JAP"><img src="https://avatars.githubusercontent.com/u/78354625?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jai A P</b></sub></a><br /><a href="#platform-Jai-JAP" title="Packaging/porting to new platform">📦</a></td>
|
||||||
<td align="center"><a href="https://blog.ysc3839.com"><img src="https://avatars.githubusercontent.com/u/12028138?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Richard Yu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ysc3839" title="Code">💻</a></td>
|
<td align="center"><a href="https://blog.ysc3839.com"><img src="https://avatars.githubusercontent.com/u/12028138?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Richard Yu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ysc3839" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/artu-ole"><img src="https://avatars.githubusercontent.com/u/15938416?v=4?s=100" width="100px;" alt=""/><br /><sub><b>artu-ole</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=artu-ole" title="Code">💻</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
@ -237,6 +237,7 @@ Pull requests and plugins are welcome!
|
|||||||
<td align="center"><a href="http://microhobby.com.br/blog"><img src="https://avatars.githubusercontent.com/u/2633321?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Matheus Castello</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=microhobby" title="Code">💻</a></td>
|
<td align="center"><a href="http://microhobby.com.br/blog"><img src="https://avatars.githubusercontent.com/u/2633321?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Matheus Castello</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=microhobby" title="Code">💻</a></td>
|
||||||
<td align="center"><a href="https://github.com/Jai-JAP"><img src="https://avatars.githubusercontent.com/u/78354625?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jai A P</b></sub></a><br /><a href="#platform-Jai-JAP" title="Packaging/porting to new platform">📦</a></td>
|
<td align="center"><a href="https://github.com/Jai-JAP"><img src="https://avatars.githubusercontent.com/u/78354625?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jai A P</b></sub></a><br /><a href="#platform-Jai-JAP" title="Packaging/porting to new platform">📦</a></td>
|
||||||
<td align="center"><a href="https://blog.ysc3839.com"><img src="https://avatars.githubusercontent.com/u/12028138?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Richard Yu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ysc3839" title="Code">💻</a></td>
|
<td align="center"><a href="https://blog.ysc3839.com"><img src="https://avatars.githubusercontent.com/u/12028138?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Richard Yu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ysc3839" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/artu-ole"><img src="https://avatars.githubusercontent.com/u/15938416?v=4?s=100" width="100px;" alt=""/><br /><sub><b>artu-ole</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=artu-ole" title="Code">💻</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
@ -242,6 +242,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
|
|||||||
<td align="center"><a href="http://microhobby.com.br/blog"><img src="https://avatars.githubusercontent.com/u/2633321?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Matheus Castello</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=microhobby" title="Code">💻</a></td>
|
<td align="center"><a href="http://microhobby.com.br/blog"><img src="https://avatars.githubusercontent.com/u/2633321?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Matheus Castello</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=microhobby" title="Code">💻</a></td>
|
||||||
<td align="center"><a href="https://github.com/Jai-JAP"><img src="https://avatars.githubusercontent.com/u/78354625?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jai A P</b></sub></a><br /><a href="#platform-Jai-JAP" title="Packaging/porting to new platform">📦</a></td>
|
<td align="center"><a href="https://github.com/Jai-JAP"><img src="https://avatars.githubusercontent.com/u/78354625?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jai A P</b></sub></a><br /><a href="#platform-Jai-JAP" title="Packaging/porting to new platform">📦</a></td>
|
||||||
<td align="center"><a href="https://blog.ysc3839.com"><img src="https://avatars.githubusercontent.com/u/12028138?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Richard Yu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ysc3839" title="Code">💻</a></td>
|
<td align="center"><a href="https://blog.ysc3839.com"><img src="https://avatars.githubusercontent.com/u/12028138?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Richard Yu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ysc3839" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/artu-ole"><img src="https://avatars.githubusercontent.com/u/15938416?v=4?s=100" width="100px;" alt=""/><br /><sub><b>artu-ole</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=artu-ole" title="Code">💻</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
@ -243,6 +243,7 @@ Pull-запросы и плагины приветствуются!
|
|||||||
<td align="center"><a href="http://microhobby.com.br/blog"><img src="https://avatars.githubusercontent.com/u/2633321?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Matheus Castello</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=microhobby" title="Code">💻</a></td>
|
<td align="center"><a href="http://microhobby.com.br/blog"><img src="https://avatars.githubusercontent.com/u/2633321?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Matheus Castello</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=microhobby" title="Code">💻</a></td>
|
||||||
<td align="center"><a href="https://github.com/Jai-JAP"><img src="https://avatars.githubusercontent.com/u/78354625?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jai A P</b></sub></a><br /><a href="#platform-Jai-JAP" title="Packaging/porting to new platform">📦</a></td>
|
<td align="center"><a href="https://github.com/Jai-JAP"><img src="https://avatars.githubusercontent.com/u/78354625?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jai A P</b></sub></a><br /><a href="#platform-Jai-JAP" title="Packaging/porting to new platform">📦</a></td>
|
||||||
<td align="center"><a href="https://blog.ysc3839.com"><img src="https://avatars.githubusercontent.com/u/12028138?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Richard Yu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ysc3839" title="Code">💻</a></td>
|
<td align="center"><a href="https://blog.ysc3839.com"><img src="https://avatars.githubusercontent.com/u/12028138?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Richard Yu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ysc3839" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/artu-ole"><img src="https://avatars.githubusercontent.com/u/15938416?v=4?s=100" width="100px;" alt=""/><br /><sub><b>artu-ole</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=artu-ole" title="Code">💻</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
@ -242,6 +242,7 @@
|
|||||||
<td align="center"><a href="http://microhobby.com.br/blog"><img src="https://avatars.githubusercontent.com/u/2633321?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Matheus Castello</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=microhobby" title="Code">💻</a></td>
|
<td align="center"><a href="http://microhobby.com.br/blog"><img src="https://avatars.githubusercontent.com/u/2633321?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Matheus Castello</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=microhobby" title="Code">💻</a></td>
|
||||||
<td align="center"><a href="https://github.com/Jai-JAP"><img src="https://avatars.githubusercontent.com/u/78354625?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jai A P</b></sub></a><br /><a href="#platform-Jai-JAP" title="Packaging/porting to new platform">📦</a></td>
|
<td align="center"><a href="https://github.com/Jai-JAP"><img src="https://avatars.githubusercontent.com/u/78354625?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jai A P</b></sub></a><br /><a href="#platform-Jai-JAP" title="Packaging/porting to new platform">📦</a></td>
|
||||||
<td align="center"><a href="https://blog.ysc3839.com"><img src="https://avatars.githubusercontent.com/u/12028138?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Richard Yu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ysc3839" title="Code">💻</a></td>
|
<td align="center"><a href="https://blog.ysc3839.com"><img src="https://avatars.githubusercontent.com/u/12028138?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Richard Yu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ysc3839" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/artu-ole"><img src="https://avatars.githubusercontent.com/u/15938416?v=4?s=100" width="100px;" alt=""/><br /><sub><b>artu-ole</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=artu-ole" title="Code">💻</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
@ -36,7 +36,7 @@ ul.nav-tabs(ngbNav, #nav='ngbNav')
|
|||||||
ng-container(*ngFor='let group of profileGroups')
|
ng-container(*ngFor='let group of profileGroups')
|
||||||
ng-container(*ngIf='isGroupVisible(group)')
|
ng-container(*ngIf='isGroupVisible(group)')
|
||||||
.list-group-item.list-group-item-action.d-flex.align-items-center(
|
.list-group-item.list-group-item-action.d-flex.align-items-center(
|
||||||
(click)='group.collapsed = !group.collapsed'
|
(click)='toggleGroupCollapse(group)'
|
||||||
)
|
)
|
||||||
.fa.fa-fw.fa-chevron-right(*ngIf='group.collapsed')
|
.fa.fa-fw.fa-chevron-right(*ngIf='group.collapsed')
|
||||||
.fa.fa-fw.fa-chevron-down(*ngIf='!group.collapsed')
|
.fa.fa-fw.fa-chevron-down(*ngIf='!group.collapsed')
|
||||||
|
@ -143,6 +143,7 @@ export class ProfilesSettingsTabComponent extends BaseComponent {
|
|||||||
refresh (): void {
|
refresh (): void {
|
||||||
this.profiles = this.config.store.profiles
|
this.profiles = this.config.store.profiles
|
||||||
this.profileGroups = []
|
this.profileGroups = []
|
||||||
|
const profileGroupCollapsed = JSON.parse(window.localStorage.profileGroupCollapsed ?? '{}')
|
||||||
|
|
||||||
for (const profile of this.profiles) {
|
for (const profile of this.profiles) {
|
||||||
let group = this.profileGroups.find(x => x.name === profile.group)
|
let group = this.profileGroups.find(x => x.name === profile.group)
|
||||||
@ -151,7 +152,7 @@ export class ProfilesSettingsTabComponent extends BaseComponent {
|
|||||||
name: profile.group,
|
name: profile.group,
|
||||||
profiles: [],
|
profiles: [],
|
||||||
editable: true,
|
editable: true,
|
||||||
collapsed: false,
|
collapsed: profileGroupCollapsed[profile.group ?? ''] ?? false,
|
||||||
}
|
}
|
||||||
this.profileGroups.push(group)
|
this.profileGroups.push(group)
|
||||||
}
|
}
|
||||||
@ -160,12 +161,14 @@ export class ProfilesSettingsTabComponent extends BaseComponent {
|
|||||||
|
|
||||||
this.profileGroups.sort((a, b) => a.name?.localeCompare(b.name ?? '') ?? -1)
|
this.profileGroups.sort((a, b) => a.name?.localeCompare(b.name ?? '') ?? -1)
|
||||||
|
|
||||||
this.profileGroups.push({
|
const builtIn = {
|
||||||
name: this.translate.instant('Built-in'),
|
name: this.translate.instant('Built-in'),
|
||||||
profiles: this.builtinProfiles,
|
profiles: this.builtinProfiles,
|
||||||
editable: false,
|
editable: false,
|
||||||
collapsed: false,
|
collapsed: false,
|
||||||
})
|
}
|
||||||
|
builtIn.collapsed = profileGroupCollapsed[builtIn.name ?? ''] ?? false
|
||||||
|
this.profileGroups.push(builtIn)
|
||||||
}
|
}
|
||||||
|
|
||||||
async editGroup (group: ProfileGroup): Promise<void> {
|
async editGroup (group: ProfileGroup): Promise<void> {
|
||||||
@ -246,6 +249,13 @@ export class ProfilesSettingsTabComponent extends BaseComponent {
|
|||||||
}[this.profilesService.providerForProfile(profile)?.id ?? ''] ?? 'warning'
|
}[this.profilesService.providerForProfile(profile)?.id ?? ''] ?? 'warning'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
toggleGroupCollapse (group: ProfileGroup): void {
|
||||||
|
group.collapsed = !group.collapsed
|
||||||
|
const profileGroupCollapsed = JSON.parse(window.localStorage.profileGroupCollapsed ?? '{}')
|
||||||
|
profileGroupCollapsed[group.name ?? ''] = group.collapsed
|
||||||
|
window.localStorage.profileGroupCollapsed = JSON.stringify(profileGroupCollapsed)
|
||||||
|
}
|
||||||
|
|
||||||
async editDefaults (provider: ProfileProvider<Profile>): Promise<void> {
|
async editDefaults (provider: ProfileProvider<Profile>): Promise<void> {
|
||||||
const modal = this.ngbModal.open(
|
const modal = this.ngbModal.open(
|
||||||
EditProfileModalComponent,
|
EditProfileModalComponent,
|
||||||
|
@ -113,8 +113,11 @@ export class SFTPPanelComponent {
|
|||||||
const modal = this.ngbModal.open(SFTPCreateDirectoryModalComponent)
|
const modal = this.ngbModal.open(SFTPCreateDirectoryModalComponent)
|
||||||
const directoryName = await modal.result
|
const directoryName = await modal.result
|
||||||
if (directoryName !== '') {
|
if (directoryName !== '') {
|
||||||
this.sftp.mkdir(path.join(this.path, directoryName)).finally(() => {
|
this.sftp.mkdir(path.join(this.path, directoryName)).then(() => {
|
||||||
|
this.notifications.notice('The directory was created successfully')
|
||||||
this.navigate(path.join(this.path, directoryName))
|
this.navigate(path.join(this.path, directoryName))
|
||||||
|
}).catch(() => {
|
||||||
|
this.notifications.error('The directory could not be created')
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -125,7 +128,11 @@ export class SFTPPanelComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async uploadOne (transfer: FileUpload): Promise<void> {
|
async uploadOne (transfer: FileUpload): Promise<void> {
|
||||||
|
const savedPath = this.path
|
||||||
await this.sftp.upload(path.join(this.path, transfer.getName()), transfer)
|
await this.sftp.upload(path.join(this.path, transfer.getName()), transfer)
|
||||||
|
if (this.path === savedPath) {
|
||||||
|
await this.navigate(this.path)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async download (itemPath: string, mode: number, size: number): Promise<void> {
|
async download (itemPath: string, mode: number, size: number): Promise<void> {
|
||||||
|
@ -12,7 +12,6 @@ import type { FileEntry, Stats } from 'ssh2-streams'
|
|||||||
export interface SFTPFile {
|
export interface SFTPFile {
|
||||||
name: string
|
name: string
|
||||||
fullPath: string
|
fullPath: string
|
||||||
directory: string
|
|
||||||
isDirectory: boolean
|
isDirectory: boolean
|
||||||
isSymlink: boolean
|
isSymlink: boolean
|
||||||
mode: number
|
mode: number
|
||||||
@ -104,7 +103,6 @@ export class SFTPSession {
|
|||||||
const stats = await wrapPromise(this.zone, promisify<Stats>(f => this.sftp.stat(p, f))())
|
const stats = await wrapPromise(this.zone, promisify<Stats>(f => this.sftp.stat(p, f))())
|
||||||
return {
|
return {
|
||||||
name: posixPath.basename(p),
|
name: posixPath.basename(p),
|
||||||
directory: posixPath.dirname(p),
|
|
||||||
fullPath: p,
|
fullPath: p,
|
||||||
isDirectory: stats.isDirectory(),
|
isDirectory: stats.isDirectory(),
|
||||||
isSymlink: stats.isSymbolicLink(),
|
isSymlink: stats.isSymbolicLink(),
|
||||||
@ -188,7 +186,6 @@ export class SFTPSession {
|
|||||||
return {
|
return {
|
||||||
fullPath: p,
|
fullPath: p,
|
||||||
name: posixPath.basename(p),
|
name: posixPath.basename(p),
|
||||||
directory: posixPath.dirname(p),
|
|
||||||
isDirectory: (entry.attrs.mode & C.S_IFDIR) === C.S_IFDIR,
|
isDirectory: (entry.attrs.mode & C.S_IFDIR) === C.S_IFDIR,
|
||||||
isSymlink: (entry.attrs.mode & C.S_IFLNK) === C.S_IFLNK,
|
isSymlink: (entry.attrs.mode & C.S_IFLNK) === C.S_IFLNK,
|
||||||
mode: entry.attrs.mode,
|
mode: entry.attrs.mode,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user