mirror of
https://github.com/paperless-ngx/paperless-ngx.git
synced 2026-06-07 14:19:45 +00:00
Better use these enums
This commit is contained in:
@@ -26,13 +26,13 @@
|
||||
<div class="task-controls mb-3 btn-toolbar">
|
||||
<div class="task-view-scope btn-group btn-group-sm me-3" role="group">
|
||||
<input type="radio" class="btn-check"
|
||||
[checked]="selectedSection === allTaskSections"
|
||||
[checked]="selectedSection === TaskSection.All"
|
||||
id="section-all"
|
||||
/>
|
||||
<label
|
||||
class="btn btn-outline-primary"
|
||||
for="section-all"
|
||||
(click)="setSection(allTaskSections)">
|
||||
(click)="setSection(TaskSection.All)">
|
||||
<ng-container i18n>All</ng-container>
|
||||
</label>
|
||||
@for (section of sections; track section) {
|
||||
@@ -56,7 +56,7 @@
|
||||
<div ngbDropdown>
|
||||
<button class="btn btn-sm btn-outline-primary me-3" ngbDropdownToggle>{{selectedTaskTypeLabel}}</button>
|
||||
<div class="dropdown-menu shadow" ngbDropdownMenu>
|
||||
<button ngbDropdownItem [class.active]="selectedTaskType === allFilterValue" (click)="setTaskType(allFilterValue)" i18n>All types</button>
|
||||
<button ngbDropdownItem [class.active]="selectedTaskType === PaperlessTaskTypeFilter.All" (click)="setTaskType(PaperlessTaskTypeFilter.All)" i18n>All types</button>
|
||||
@for (option of taskTypeOptions; track option.value) {
|
||||
<button ngbDropdownItem [class.active]="selectedTaskType === option.value" [disabled]="isTaskTypeOptionDisabled(option.value)" (click)="setTaskType(option.value)">{{option.label}}</button>
|
||||
}
|
||||
@@ -65,7 +65,7 @@
|
||||
<div ngbDropdown>
|
||||
<button class="btn btn-sm btn-outline-primary me-3" ngbDropdownToggle>{{selectedTriggerSourceLabel}}</button>
|
||||
<div class="dropdown-menu shadow" ngbDropdownMenu>
|
||||
<button ngbDropdownItem [class.active]="selectedTriggerSource === allFilterValue" (click)="setTriggerSource(allFilterValue)" i18n>All sources</button>
|
||||
<button ngbDropdownItem [class.active]="selectedTriggerSource === PaperlessTaskTriggerSourceFilter.All" (click)="setTriggerSource(PaperlessTaskTriggerSourceFilter.All)" i18n>All sources</button>
|
||||
@for (option of triggerSourceOptions; track option.value) {
|
||||
<button ngbDropdownItem [class.active]="selectedTriggerSource === option.value" [disabled]="isTriggerSourceOptionDisabled(option.value)" (click)="setTriggerSource(option.value)">{{option.label}}</button>
|
||||
}
|
||||
|
||||
@@ -17,7 +17,9 @@ import {
|
||||
PaperlessTask,
|
||||
PaperlessTaskStatus,
|
||||
PaperlessTaskTriggerSource,
|
||||
PaperlessTaskTriggerSourceFilter,
|
||||
PaperlessTaskType,
|
||||
PaperlessTaskTypeFilter,
|
||||
} from 'src/app/data/paperless-task'
|
||||
import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive'
|
||||
import { PermissionsGuard } from 'src/app/guards/permissions.guard'
|
||||
@@ -28,12 +30,7 @@ import { ToastService } from 'src/app/services/toast.service'
|
||||
import { environment } from 'src/environments/environment'
|
||||
import { ConfirmDialogComponent } from '../../common/confirm-dialog/confirm-dialog.component'
|
||||
import { PageHeaderComponent } from '../../common/page-header/page-header.component'
|
||||
import {
|
||||
ALL_FILTER_VALUE,
|
||||
ALL_TASK_SECTIONS,
|
||||
TasksComponent,
|
||||
TaskSection,
|
||||
} from './tasks.component'
|
||||
import { TasksComponent, TaskSection } from './tasks.component'
|
||||
|
||||
const tasks: PaperlessTask[] = [
|
||||
{
|
||||
@@ -207,9 +204,11 @@ describe('TasksComponent', () => {
|
||||
})
|
||||
|
||||
it('should display task sections with counts', () => {
|
||||
expect(component.selectedSection).toBe(ALL_TASK_SECTIONS)
|
||||
expect(component.selectedTaskType).toBe(ALL_FILTER_VALUE)
|
||||
expect(component.selectedTriggerSource).toBe(ALL_FILTER_VALUE)
|
||||
expect(component.selectedSection).toBe(TaskSection.All)
|
||||
expect(component.selectedTaskType).toBe(PaperlessTaskTypeFilter.All)
|
||||
expect(component.selectedTriggerSource).toBe(
|
||||
PaperlessTaskTriggerSourceFilter.All
|
||||
)
|
||||
|
||||
fixture.detectChanges()
|
||||
|
||||
@@ -265,8 +264,10 @@ describe('TasksComponent', () => {
|
||||
component.resetFilters()
|
||||
|
||||
expect(component.selectedSection).toBe(TaskSection.InProgress)
|
||||
expect(component.selectedTaskType).toBe(ALL_FILTER_VALUE)
|
||||
expect(component.selectedTriggerSource).toBe(ALL_FILTER_VALUE)
|
||||
expect(component.selectedTaskType).toBe(PaperlessTaskTypeFilter.All)
|
||||
expect(component.selectedTriggerSource).toBe(
|
||||
PaperlessTaskTriggerSourceFilter.All
|
||||
)
|
||||
expect(component.filterText).toBe('')
|
||||
expect(component.isFiltered).toBe(false)
|
||||
})
|
||||
|
||||
@@ -21,8 +21,8 @@ import {
|
||||
import {
|
||||
PaperlessTask,
|
||||
PaperlessTaskStatus,
|
||||
PaperlessTaskTriggerSource,
|
||||
PaperlessTaskType,
|
||||
PaperlessTaskTriggerSourceFilter,
|
||||
PaperlessTaskTypeFilter,
|
||||
} from 'src/app/data/paperless-task'
|
||||
import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive'
|
||||
import { CustomDatePipe } from 'src/app/pipes/custom-date.pipe'
|
||||
@@ -33,6 +33,7 @@ import { PageHeaderComponent } from '../../common/page-header/page-header.compon
|
||||
import { LoadingComponentWithPermissions } from '../../loading-component/loading.component'
|
||||
|
||||
export enum TaskSection {
|
||||
All = 'all',
|
||||
NeedsAttention = 'needs_attention',
|
||||
InProgress = 'in_progress',
|
||||
Completed = 'completed',
|
||||
@@ -48,55 +49,80 @@ const FILTER_TARGETS = [
|
||||
{ id: TaskFilterTargetID.Result, name: $localize`Result` },
|
||||
]
|
||||
|
||||
export const ALL_FILTER_VALUE = 'all'
|
||||
export const ALL_TASK_SECTIONS = ALL_FILTER_VALUE
|
||||
|
||||
const SECTION_LABELS = {
|
||||
[TaskSection.All]: $localize`All`,
|
||||
[TaskSection.NeedsAttention]: $localize`Needs attention`,
|
||||
[TaskSection.InProgress]: $localize`In progress`,
|
||||
[TaskSection.Completed]: $localize`Recently completed`,
|
||||
}
|
||||
|
||||
const TASK_TYPE_OPTIONS = [
|
||||
{ value: PaperlessTaskType.ConsumeFile, label: $localize`Consume File` },
|
||||
const TASK_TYPE_OPTIONS: Array<{
|
||||
value: PaperlessTaskTypeFilter
|
||||
label: string
|
||||
}> = [
|
||||
{
|
||||
value: PaperlessTaskType.TrainClassifier,
|
||||
value: PaperlessTaskTypeFilter.ConsumeFile,
|
||||
label: $localize`Consume File`,
|
||||
},
|
||||
{
|
||||
value: PaperlessTaskTypeFilter.TrainClassifier,
|
||||
label: $localize`Train Classifier`,
|
||||
},
|
||||
{ value: PaperlessTaskType.SanityCheck, label: $localize`Sanity Check` },
|
||||
{ value: PaperlessTaskType.MailFetch, label: $localize`Mail Fetch` },
|
||||
{ value: PaperlessTaskType.LlmIndex, label: $localize`LLM Index` },
|
||||
{ value: PaperlessTaskType.EmptyTrash, label: $localize`Empty Trash` },
|
||||
{
|
||||
value: PaperlessTaskType.CheckWorkflows,
|
||||
value: PaperlessTaskTypeFilter.SanityCheck,
|
||||
label: $localize`Sanity Check`,
|
||||
},
|
||||
{ value: PaperlessTaskTypeFilter.MailFetch, label: $localize`Mail Fetch` },
|
||||
{ value: PaperlessTaskTypeFilter.LlmIndex, label: $localize`LLM Index` },
|
||||
{
|
||||
value: PaperlessTaskTypeFilter.EmptyTrash,
|
||||
label: $localize`Empty Trash`,
|
||||
},
|
||||
{
|
||||
value: PaperlessTaskTypeFilter.CheckWorkflows,
|
||||
label: $localize`Check Workflows`,
|
||||
},
|
||||
{ value: PaperlessTaskType.BulkUpdate, label: $localize`Bulk Update` },
|
||||
{
|
||||
value: PaperlessTaskType.ReprocessDocument,
|
||||
value: PaperlessTaskTypeFilter.BulkUpdate,
|
||||
label: $localize`Bulk Update`,
|
||||
},
|
||||
{
|
||||
value: PaperlessTaskTypeFilter.ReprocessDocument,
|
||||
label: $localize`Reprocess Document`,
|
||||
},
|
||||
{
|
||||
value: PaperlessTaskType.BuildShareLink,
|
||||
value: PaperlessTaskTypeFilter.BuildShareLink,
|
||||
label: $localize`Build Share Link`,
|
||||
},
|
||||
{ value: PaperlessTaskType.BulkDelete, label: $localize`Bulk Delete` },
|
||||
{
|
||||
value: PaperlessTaskTypeFilter.BulkDelete,
|
||||
label: $localize`Bulk Delete`,
|
||||
},
|
||||
]
|
||||
|
||||
const TRIGGER_SOURCE_OPTIONS = [
|
||||
{ value: PaperlessTaskTriggerSource.Scheduled, label: $localize`Scheduled` },
|
||||
{ value: PaperlessTaskTriggerSource.WebUI, label: $localize`Web UI` },
|
||||
{ value: PaperlessTaskTriggerSource.ApiUpload, label: $localize`API Upload` },
|
||||
const TRIGGER_SOURCE_OPTIONS: Array<{
|
||||
value: PaperlessTaskTriggerSourceFilter
|
||||
label: string
|
||||
}> = [
|
||||
{
|
||||
value: PaperlessTaskTriggerSource.FolderConsume,
|
||||
value: PaperlessTaskTriggerSourceFilter.Scheduled,
|
||||
label: $localize`Scheduled`,
|
||||
},
|
||||
{ value: PaperlessTaskTriggerSourceFilter.WebUI, label: $localize`Web UI` },
|
||||
{
|
||||
value: PaperlessTaskTriggerSourceFilter.ApiUpload,
|
||||
label: $localize`API Upload`,
|
||||
},
|
||||
{
|
||||
value: PaperlessTaskTriggerSourceFilter.FolderConsume,
|
||||
label: $localize`Folder Consume`,
|
||||
},
|
||||
{
|
||||
value: PaperlessTaskTriggerSource.EmailConsume,
|
||||
value: PaperlessTaskTriggerSourceFilter.EmailConsume,
|
||||
label: $localize`Email Consume`,
|
||||
},
|
||||
{ value: PaperlessTaskTriggerSource.System, label: $localize`System` },
|
||||
{ value: PaperlessTaskTriggerSource.Manual, label: $localize`Manual` },
|
||||
{ value: PaperlessTaskTriggerSourceFilter.System, label: $localize`System` },
|
||||
{ value: PaperlessTaskTriggerSourceFilter.Manual, label: $localize`Manual` },
|
||||
]
|
||||
|
||||
@Component({
|
||||
@@ -127,20 +153,20 @@ export class TasksComponent
|
||||
private readonly toastService = inject(ToastService)
|
||||
|
||||
readonly TaskSection = TaskSection
|
||||
readonly PaperlessTaskTypeFilter = PaperlessTaskTypeFilter
|
||||
readonly PaperlessTaskTriggerSourceFilter = PaperlessTaskTriggerSourceFilter
|
||||
readonly sections = [
|
||||
TaskSection.NeedsAttention,
|
||||
TaskSection.InProgress,
|
||||
TaskSection.Completed,
|
||||
]
|
||||
readonly allTaskSections = ALL_TASK_SECTIONS
|
||||
readonly allFilterValue = ALL_FILTER_VALUE
|
||||
public selectedTasks: Set<number> = new Set()
|
||||
public expandedTask: number
|
||||
public autoRefreshEnabled: boolean = true
|
||||
public selectedSection: TaskSection | typeof ALL_TASK_SECTIONS =
|
||||
ALL_TASK_SECTIONS
|
||||
public selectedTaskType: string = ALL_FILTER_VALUE
|
||||
public selectedTriggerSource: string = ALL_FILTER_VALUE
|
||||
public selectedSection: TaskSection = TaskSection.All
|
||||
public selectedTaskType: PaperlessTaskTypeFilter = PaperlessTaskTypeFilter.All
|
||||
public selectedTriggerSource: PaperlessTaskTriggerSourceFilter =
|
||||
PaperlessTaskTriggerSourceFilter.All
|
||||
|
||||
private _filterText: string = ''
|
||||
get filterText() {
|
||||
@@ -160,16 +186,22 @@ export class TasksComponent
|
||||
return FILTER_TARGETS
|
||||
}
|
||||
|
||||
public get taskTypeOptions(): Array<{ value: string; label: string }> {
|
||||
public get taskTypeOptions(): Array<{
|
||||
value: PaperlessTaskTypeFilter
|
||||
label: string
|
||||
}> {
|
||||
return TASK_TYPE_OPTIONS
|
||||
}
|
||||
|
||||
public get triggerSourceOptions(): Array<{ value: string; label: string }> {
|
||||
public get triggerSourceOptions(): Array<{
|
||||
value: PaperlessTaskTriggerSourceFilter
|
||||
label: string
|
||||
}> {
|
||||
return TRIGGER_SOURCE_OPTIONS
|
||||
}
|
||||
|
||||
public get selectedTaskTypeLabel(): string {
|
||||
if (this.selectedTaskType === ALL_FILTER_VALUE) {
|
||||
if (this.selectedTaskType === PaperlessTaskTypeFilter.All) {
|
||||
return $localize`All types`
|
||||
}
|
||||
|
||||
@@ -181,7 +213,7 @@ export class TasksComponent
|
||||
}
|
||||
|
||||
public get selectedTriggerSourceLabel(): string {
|
||||
if (this.selectedTriggerSource === ALL_FILTER_VALUE) {
|
||||
if (this.selectedTriggerSource === PaperlessTaskTriggerSourceFilter.All) {
|
||||
return $localize`All sources`
|
||||
}
|
||||
|
||||
@@ -200,7 +232,7 @@ export class TasksComponent
|
||||
|
||||
get visibleSections(): TaskSection[] {
|
||||
const sections =
|
||||
this.selectedSection === ALL_TASK_SECTIONS
|
||||
this.selectedSection === TaskSection.All
|
||||
? this.sections
|
||||
: [this.selectedSection]
|
||||
|
||||
@@ -217,8 +249,8 @@ export class TasksComponent
|
||||
|
||||
get isFiltered(): boolean {
|
||||
return (
|
||||
this.selectedTaskType !== ALL_FILTER_VALUE ||
|
||||
this.selectedTriggerSource !== ALL_FILTER_VALUE ||
|
||||
this.selectedTaskType !== PaperlessTaskTypeFilter.All ||
|
||||
this.selectedTriggerSource !== PaperlessTaskTriggerSourceFilter.All ||
|
||||
this._filterText.length > 0
|
||||
)
|
||||
}
|
||||
@@ -400,34 +432,38 @@ export class TasksComponent
|
||||
return section !== TaskSection.InProgress
|
||||
}
|
||||
|
||||
setSection(section: TaskSection | typeof ALL_TASK_SECTIONS) {
|
||||
setSection(section: TaskSection) {
|
||||
this.selectedSection = section
|
||||
this.clearSelection()
|
||||
}
|
||||
|
||||
setTaskType(taskType: string) {
|
||||
setTaskType(taskType: PaperlessTaskTypeFilter) {
|
||||
this.selectedTaskType = taskType
|
||||
this.clearSelection()
|
||||
}
|
||||
|
||||
setTriggerSource(triggerSource: string) {
|
||||
setTriggerSource(triggerSource: PaperlessTaskTriggerSourceFilter) {
|
||||
this.selectedTriggerSource = triggerSource
|
||||
this.clearSelection()
|
||||
}
|
||||
|
||||
taskTypeOptionCount(taskType: string): number {
|
||||
taskTypeOptionCount(taskType: PaperlessTaskTypeFilter): number {
|
||||
return this.tasksForOptionCounts({ taskType }).length
|
||||
}
|
||||
|
||||
triggerSourceOptionCount(triggerSource: string): number {
|
||||
triggerSourceOptionCount(
|
||||
triggerSource: PaperlessTaskTriggerSourceFilter
|
||||
): number {
|
||||
return this.tasksForOptionCounts({ triggerSource }).length
|
||||
}
|
||||
|
||||
isTaskTypeOptionDisabled(taskType: string): boolean {
|
||||
isTaskTypeOptionDisabled(taskType: PaperlessTaskTypeFilter): boolean {
|
||||
return this.taskTypeOptionCount(taskType) === 0
|
||||
}
|
||||
|
||||
isTriggerSourceOptionDisabled(triggerSource: string): boolean {
|
||||
isTriggerSourceOptionDisabled(
|
||||
triggerSource: PaperlessTaskTriggerSourceFilter
|
||||
): boolean {
|
||||
return this.triggerSourceOptionCount(triggerSource) === 0
|
||||
}
|
||||
|
||||
@@ -440,8 +476,8 @@ export class TasksComponent
|
||||
}
|
||||
|
||||
public resetFilters() {
|
||||
this.selectedTaskType = ALL_FILTER_VALUE
|
||||
this.selectedTriggerSource = ALL_FILTER_VALUE
|
||||
this.selectedTaskType = PaperlessTaskTypeFilter.All
|
||||
this.selectedTriggerSource = PaperlessTaskTriggerSourceFilter.All
|
||||
this.resetFilter()
|
||||
this.clearSelection()
|
||||
}
|
||||
@@ -487,16 +523,19 @@ export class TasksComponent
|
||||
taskType,
|
||||
triggerSource,
|
||||
}: {
|
||||
taskType: string
|
||||
triggerSource: string
|
||||
taskType: PaperlessTaskTypeFilter
|
||||
triggerSource: PaperlessTaskTriggerSourceFilter
|
||||
}
|
||||
): boolean {
|
||||
if (taskType !== ALL_FILTER_VALUE && task.task_type !== taskType) {
|
||||
if (
|
||||
taskType !== PaperlessTaskTypeFilter.All &&
|
||||
task.task_type !== taskType
|
||||
) {
|
||||
return false
|
||||
}
|
||||
|
||||
if (
|
||||
triggerSource !== ALL_FILTER_VALUE &&
|
||||
triggerSource !== PaperlessTaskTriggerSourceFilter.All &&
|
||||
task.trigger_source !== triggerSource
|
||||
) {
|
||||
return false
|
||||
@@ -525,11 +564,11 @@ export class TasksComponent
|
||||
taskType = this.selectedTaskType,
|
||||
triggerSource = this.selectedTriggerSource,
|
||||
}: {
|
||||
taskType?: string
|
||||
triggerSource?: string
|
||||
taskType?: PaperlessTaskTypeFilter
|
||||
triggerSource?: PaperlessTaskTriggerSourceFilter
|
||||
}): PaperlessTask[] {
|
||||
const sections =
|
||||
this.selectedSection === ALL_TASK_SECTIONS
|
||||
this.selectedSection === TaskSection.All
|
||||
? this.sections
|
||||
: [this.selectedSection]
|
||||
|
||||
|
||||
@@ -14,6 +14,21 @@ export enum PaperlessTaskType {
|
||||
BulkDelete = 'bulk_delete',
|
||||
}
|
||||
|
||||
export enum PaperlessTaskTypeFilter {
|
||||
All = 'all',
|
||||
ConsumeFile = PaperlessTaskType.ConsumeFile,
|
||||
TrainClassifier = PaperlessTaskType.TrainClassifier,
|
||||
SanityCheck = PaperlessTaskType.SanityCheck,
|
||||
MailFetch = PaperlessTaskType.MailFetch,
|
||||
LlmIndex = PaperlessTaskType.LlmIndex,
|
||||
EmptyTrash = PaperlessTaskType.EmptyTrash,
|
||||
CheckWorkflows = PaperlessTaskType.CheckWorkflows,
|
||||
BulkUpdate = PaperlessTaskType.BulkUpdate,
|
||||
ReprocessDocument = PaperlessTaskType.ReprocessDocument,
|
||||
BuildShareLink = PaperlessTaskType.BuildShareLink,
|
||||
BulkDelete = PaperlessTaskType.BulkDelete,
|
||||
}
|
||||
|
||||
export enum PaperlessTaskTriggerSource {
|
||||
Scheduled = 'scheduled',
|
||||
WebUI = 'web_ui',
|
||||
@@ -24,6 +39,17 @@ export enum PaperlessTaskTriggerSource {
|
||||
Manual = 'manual',
|
||||
}
|
||||
|
||||
export enum PaperlessTaskTriggerSourceFilter {
|
||||
All = 'all',
|
||||
Scheduled = PaperlessTaskTriggerSource.Scheduled,
|
||||
WebUI = PaperlessTaskTriggerSource.WebUI,
|
||||
ApiUpload = PaperlessTaskTriggerSource.ApiUpload,
|
||||
FolderConsume = PaperlessTaskTriggerSource.FolderConsume,
|
||||
EmailConsume = PaperlessTaskTriggerSource.EmailConsume,
|
||||
System = PaperlessTaskTriggerSource.System,
|
||||
Manual = PaperlessTaskTriggerSource.Manual,
|
||||
}
|
||||
|
||||
export enum PaperlessTaskStatus {
|
||||
Pending = 'pending',
|
||||
Started = 'started',
|
||||
|
||||
Reference in New Issue
Block a user