Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 57 additions & 0 deletions src/main/api/routes/snippets.ts
Original file line number Diff line number Diff line change
Expand Up @@ -386,6 +386,63 @@ app
},
},
)
// Удаление всех сниппетов в корзине
.delete(
'/trash',
({ error }) => {
const deletedSnippets = db
.prepare(
`
SELECT id FROM snippets WHERE isDeleted = 1
`,
)
.all() as { id: number }[]

if (deletedSnippets.length === 0) {
return error(404, { message: 'No snippets in trash' })
}

const transaction = db.transaction(() => {
// Удаляем связи с тегами для всех сниппетов из корзины
db.prepare(
`
DELETE FROM snippet_tags
WHERE snippetId IN (SELECT id FROM snippets WHERE isDeleted = 1)
`,
).run()

// Удаляем содержимое всех сниппетов из корзины
db.prepare(
`
DELETE FROM snippet_contents
WHERE snippetId IN (SELECT id FROM snippets WHERE isDeleted = 1)
`,
).run()

// Удаляем сами сниппеты из корзины
const result = db
.prepare(
`
DELETE FROM snippets WHERE isDeleted = 1
`,
)
.run()

return result.changes
})

const deletedCount = transaction()

return {
message: `Successfully emptied trash: ${deletedCount} snippet(s) deleted`,
}
},
{
detail: {
tags: ['Snippets'],
},
},
)
// Удаление содержимого сниппета
.delete(
'/:id/contents/:contentId',
Expand Down
31 changes: 21 additions & 10 deletions src/renderer/components/sidebar/Sidebar.vue
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
<script setup lang="ts">
import type { Node } from '@/components/sidebar/folders/types'
import * as ContextMenu from '@/components/ui/shadcn/context-menu'
import { ScrollArea } from '@/components/ui/shadcn/scroll-area'
import { useApp, useFolders, useGutter, useSnippets } from '@/composables'
import { LibraryFilter } from '@/composables/types'
Expand All @@ -14,7 +15,8 @@ const sidebarRef = ref<HTMLElement>()
const gutterRef = ref<{ $el: HTMLElement }>()

const { sidebarWidth, selectedFolderId } = useApp()
const { getSnippets, selectFirstSnippet, searchQuery } = useSnippets()
const { getSnippets, selectFirstSnippet, searchQuery, emptyTrash }
= useSnippets()
const {
getFolders,
folders,
Expand Down Expand Up @@ -141,15 +143,24 @@ watch(width, () => {
<div class="pb-1 pl-1 text-[10px] font-bold uppercase">
{{ i18n.t("sidebar.library") }} / {{ i18n.t("sidebar.tags") }}
</div>
<div class="">
<LibraryItem
v-for="i in libraryItems"
:id="i.id"
:key="i.name"
:name="i.name"
:icon="i.icon"
/>
</div>
<ContextMenu.Root>
<ContextMenu.Trigger>
<div class="">
<LibraryItem
v-for="i in libraryItems"
:id="i.id"
:key="i.name"
:name="i.name"
:icon="i.icon"
/>
</div>
</ContextMenu.Trigger>
<ContextMenu.Content>
<ContextMenu.Item @click="emptyTrash">
{{ i18n.t("emptyTrash") }}
</ContextMenu.Item>
</ContextMenu.Content>
</ContextMenu.Root>
</div>
<div class="flex items-center justify-between pt-2 pl-1">
<div class="text-[10px] font-bold uppercase">
Expand Down
16 changes: 16 additions & 0 deletions src/renderer/composables/useSnippets.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import { i18n, store } from '@/electron'
import { api } from '~/renderer/services/api'
import { LibraryFilter } from './types'
import { useApp } from './useApp'
import { useDialog } from './useDialog'

type Query = NonNullable<Parameters<typeof api.snippets.getSnippets>[0]>

Expand Down Expand Up @@ -218,6 +219,20 @@ async function deleteSnippetContent(snippetId: number, contentId: number) {
}
}

async function emptyTrash() {
const { confirm } = useDialog()

const isConfirmed = await confirm({
title: i18n.t('dialog:emptyTrash'),
content: i18n.t('dialog:noUndo'),
})

if (isConfirmed) {
await api.snippets.deleteSnippetsTrash()
await getSnippets(queryByLibraryOrFolderOrSearch.value)
}
}

function selectSnippet(snippetId: number, withShift = false) {
if (!withShift) {
selectedSnippetIds.value = [snippetId]
Expand Down Expand Up @@ -302,6 +317,7 @@ export function useSnippets() {
deleteSnippets,
displayedSnippets,
duplicateSnippet,
emptyTrash,
getSnippets,
isEmpty,
isSearch,
Expand Down
14 changes: 14 additions & 0 deletions src/renderer/services/api/generated/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -675,6 +675,20 @@ export class Api<
method: "DELETE",
...params,
}),

/**
* No description
*
* @tags Snippets
* @name DeleteSnippetsTrash
* @request DELETE:/snippets/trash
*/
deleteSnippetsTrash: (params: RequestParams = {}) =>
this.request<void, any>({
path: `/snippets/trash`,
method: "DELETE",
...params,
}),
};
folders = {
/**
Expand Down