Better use these enums

This commit is contained in:
shamoon
2026-04-20 21:16:14 -07:00
parent 4ac47634ac
commit 1b984b7222
4 changed files with 135 additions and 69 deletions
@@ -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]
+26
View File
@@ -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',