PSWorkItem.psm1


Get-Childitem $psscriptroot\functions\*.ps1 -recurse |
Foreach-Object {
. $_.FullName
}

#region class definitions
#define item class
class PSWorkItem {
    #this can be the ROWID of the item in the database
    [int]$ID
    [string]$Name
    [string]$Category
    [string]$Description
    [datetime]$DueDate = (Get-Date).AddDays(30)
    [int]$Progress = 0
    [datetime]$TaskCreated = (Get-Date)
    [datetime]$TaskModified = (Get-Date)
    [boolean]$Completed
    #this will be last resort GUID to ensure uniqueness
    hidden[guid]$TaskID = (New-Guid).Guid

    PSWorkItem ([string]$Name,[string]$Category) {
        $this.Name = $Name
        $this.Category = $Category
    }
}

class PSWorkItemCategory {
    [string]$Category
    [string]$Description

    #constructor
    PSWorkItemCategory([string]$Category, [string]$Description) {
        $this.Category = $Category
        $this.Description = $Description
    }
}

class PSWorkItemDatabase {
    [string]$Path
    [datetime]$Created
    [datetime]$LastModified
    [int32]$Size
    [int32]$TaskCount
    [int32]$CategoryCount
    [int32]$ArchiveCount
    [string]$Encoding
    [int32]$PageCount
    [int32]$PageSize
}

#Add a dynamic type extension to the PSWorkItem class
Update-TypeData -TypeName PSWorkitem -MemberType ScriptProperty -MemberName OverDue -Value {$this.DueDate  -le (Get-Date)} -Force
Update-TypeData -TypeName PSWorkItem -MemberType ScriptProperty -MemberName "TimeRemaining" -Value {New-Timespan -end $this.DueDate -start (Get-Date)} -force
Update-TypeData -TypeName PSWorkItemArchive -MemberType AliasProperty -MemberName "CompletedDate" -Value 'TaskModified' -force

#endregion

#make this variable global instead of exporting so that I don't have to use Export-ModuleMember 7/28/2022 JDH
$global:PSWorkItemPath = Join-Path -path $HOME -childpath "PSWorkItem.db"

<#
 Default categories when creating a new database file.
 This will be a module-scoped variable
#>


$PSWorkItemDefaultCategories = "Work","Personal","Project","Other"

Register-ArgumentCompleter -CommandName New-PSWorkItem,Get-PSWorkItem,Set-PSWorkItem,Get-PSWorkItemArchive -ParameterName Category -ScriptBlock {
    param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameter)
    #PowerShell code to populate $wordtoComplete
    Get-PSWorkItemCategory | Where-Object {$_.category -Like "$wordToComplete*"} |
    Select-Object -Property Category,@{Name="Description";Expression={
    $_.description -match "\w+" ? $_.description : "no description"}} |
    ForEach-Object {
        # completion text,listitem text,result type,Tooltip
        [System.Management.Automation.CompletionResult]::new($_.category, $_.category, 'ParameterValue', $_.description)
    }
}