CoolCMS API

WorkGrid extends BaseComponent
in package
uses InitTrait

FinalYes

Spreadsheet-like grid of the work items of one work sheet.

WorkList is a job (historical name); WorkSheet is a work sheet inside a job. Built from div elements, not <table>: cloning rows in JS inside a <table> hits foster parenting.

The component lives inside {form editForm} on the job edit screen and has no form of its own. It generates input names from InitTrait::setRowNamePrefix() (for example sheets[42][items]); POST handling and signals (add sheet, comments, reopen) belong to the presenter or the parent component. render() takes no arguments, because arguments belong in setters, not in render*(), or the AJAX snippet phase breaks.

Table of Contents

Properties

$container  : Container
$routerDispatcher  : RouterDispatcher
$translator  : ITranslator
$appContext  : AppContext
$componentParameters  : array<string, mixed>
$currencyContext  : CurrencyContext|null
$deviceDetector  : DeviceDetector|null
$languageContext  : LanguageContext|null
$localizationContext  : LocalizationContext|null
$settingContext  : SettingContext
$themeContext  : ThemeContext|null
$translatorDomain  : string|null
$defaultVatPercents  : string|null
Effective default VAT rate (customer, then company, see {@see \App\UI\Admin\Company\Presenters\Traits\Forms\WorkListSheetsFormTrait::resolveDefaultVatPercents()}).
$items  : array<string|int, WorkItem>
$readOnly  : bool
The work sheet is locked (closing, closed or invoiced) or the job is archived.
$rowNamePrefix  : string
Input name prefix, for example `sheets[42][items]`; the template appends the row index and field.
$serviceOptions  : array<int, string>
$sheet  : WorkSheet|null
Edited work sheet; `null` only outside the normal flow (the grid is never mounted without one).
$statusOptions  : array<string, string>
$supplyKindOptions  : array<int, string>
`supplyKindId => name` for the supply kind select of a row (the empty option means the default supply kind of the company). Supplied by the presenter, because the component has no manager.
$unreadComments  : array<int, int>
Unread client comment counts as `workItemId => count`; work items without unread comments have no key. The presenter precomputes them in one query so the grid bubble does not become an N+1.

Methods

__call()  : mixed
Dispatches `renderXyz()` to `render('Xyz', ...$args)`.
__construct()  : mixed
createComponent()  : IComponent|null
getAppContext()  : AppContext
getComponentParameter()  : mixed
Returns a component parameter, or null when it is not set.
getContainer()  : Container
getCurrencyContext()  : CurrencyContext|null
getLanguageContext()  : LanguageContext|null
getLocalizationContext()  : LocalizationContext|null
getRouterDispatcher()  : RouterDispatcher
getSettingContext()  : SettingContext
getSettings()  : array<int, array<string, mixed>>
getThemeContext()  : ThemeContext|null
hasServiceByType()  : bool
Returns whether the container has a service of the given type.
initializeAllContexts()  : void
injectDeviceDetector()  : void
onCreate()  : void
render()  : void
setAppContext()  : $this
setComponentParameter()  : void
Sets a component parameter.
setCurrencyContext()  : $this
setDefaultVatPercents()  : self
See the docblock of {@see $defaultVatPercents}.
setItems()  : self
setLanguageContext()  : $this
setLocalizationContext()  : $this
setReadOnly()  : self
setRowNamePrefix()  : self
setServices()  : self
setSettingContext()  : $this
setSheet()  : self
setStatuses()  : self
setSupplyKinds()  : self
setThemeContext()  : $this
setUnreadComments()  : self
setup()  : void
setupAppContext()  : void
typedComponent()  : T
Returns a subcomponent with a verified type.
frontPresenter()  : BasePresenter|null
Returns the front presenter the component is attached to (null outside the front end or when detached).
getTranslator()  : ITranslator
setTemplateFile()  : void
setTranslator()  : self
computeHoursSum()  : string
Initial hours total; JS keeps recomputing it live while editing.
computePriceSum()  : string
Initial price total: the server value from the entity ({@see WorkItem::getPrice()}), not a recomputation.
createMultiplierComponent()  : Multiplier<string|int, IComponent>
Creates a multiplier for the component.
createNewComponentInstance()  : IComponent|null
Creates a new component instance without adding it to the presenter; used by the multiplier.
createStandardComponent()  : IComponent|null
Creates a standard component (not a multiplier).
prepareGrid()  : void
Fills `$this->template`; called from `render()` without arguments (AJAX snippet phase pitfall, see {@see \App\UI\Admin\Company\Components\WorkGridComponent\WorkGrid}).
resolveStatusOptions()  : array<string, string>
Returns the work item status options.

Properties

$componentParameters

protected array<string, mixed> $componentParameters = []

component parameters set by setComponentParameter()

$translatorDomain

protected string|null $translatorDomain = 'admin.company.presenters.workList'

$defaultVatPercents

Effective default VAT rate (customer, then company, see {@see \App\UI\Admin\Company\Presenters\Traits\Forms\WorkListSheetsFormTrait::resolveDefaultVatPercents()}).

private string|null $defaultVatPercents = null

Used only as the placeholder of the vatPercents field in the money zone of a row; null means neither the customer nor the company has a VAT rate, so the field has no placeholder.

$items

private array<string|int, WorkItem> $items = []

work items of the current work sheet, ordered by order

$readOnly

The work sheet is locked (closing, closed or invoiced) or the job is archived.

private bool $readOnly = false

$rowNamePrefix

Input name prefix, for example `sheets[42][items]`; the template appends the row index and field.

private string $rowNamePrefix = ''

$serviceOptions

private array<int, string> $serviceOptions = []

companyServiceId => name for the service select

$sheet

Edited work sheet; `null` only outside the normal flow (the grid is never mounted without one).

private WorkSheet|null $sheet = null

$statusOptions

private array<string, string> $statusOptions = []

WorkItemStatus::value => label for the status select

$supplyKindOptions

`supplyKindId => name` for the supply kind select of a row (the empty option means the default supply kind of the company). Supplied by the presenter, because the component has no manager.

private array<int, string> $supplyKindOptions = []

$unreadComments

Unread client comment counts as `workItemId => count`; work items without unread comments have no key. The presenter precomputes them in one query so the grid bubble does not become an N+1.

private array<int, int> $unreadComments = []

Methods

__call()

Dispatches `renderXyz()` to `render('Xyz', ...$args)`.

public __call(string $name, array<string|int, mixed> $args) : mixed

Called only when the component has no renderXyz() method of its own.

Parameters
$name : string
$args : array<string|int, mixed>

createComponent()

public createComponent(string $name) : IComponent|null
Parameters
$name : string
Return values
IComponent|null

getComponentParameter()

Returns a component parameter, or null when it is not set.

public getComponentParameter(string $name) : mixed
Parameters
$name : string

getContainer()

public getContainer() : Container
Return values
Container

getSettings()

public getSettings() : array<int, array<string, mixed>>
Return values
array<int, array<string, mixed>>

hasServiceByType()

Returns whether the container has a service of the given type.

public hasServiceByType(string $className) : bool

The name is composed dynamically (module plus component), so class_exists() runs first, and a true result guarantees a valid type.

Parameters
$className : string
Tags
phpstan-assert-if-true

class-string $className

Return values
bool

setComponentParameter()

Sets a component parameter.

public setComponentParameter(string $name, mixed $value) : void
Parameters
$name : string
$value : mixed

setDefaultVatPercents()

See the docblock of {@see $defaultVatPercents}.

public setDefaultVatPercents(string|null $defaultVatPercents) : self
Parameters
$defaultVatPercents : string|null
Return values
self

setItems()

public setItems(array<string|int, WorkItem> $items) : self
Parameters
$items : array<string|int, WorkItem>
Return values
self

setReadOnly()

public setReadOnly(bool $readOnly) : self
Parameters
$readOnly : bool
Return values
self

setRowNamePrefix()

public setRowNamePrefix(string $rowNamePrefix) : self
Parameters
$rowNamePrefix : string
Return values
self

setServices()

public setServices(array<int, string> $serviceOptions) : self
Parameters
$serviceOptions : array<int, string>
Return values
self

setStatuses()

public setStatuses(array<string, string> $statusOptions) : self
Parameters
$statusOptions : array<string, string>
Return values
self

setSupplyKinds()

public setSupplyKinds(array<int, string> $supplyKindOptions) : self
Parameters
$supplyKindOptions : array<int, string>
Return values
self

setUnreadComments()

public setUnreadComments(array<int, int> $unreadComments) : self
Parameters
$unreadComments : array<int, int>

workItemId => unread count

Return values
self

typedComponent()

Returns a subcomponent with a verified type.

public typedComponent(string $name, T> $type) : T

Use it instead of an inline @var above $this['x'] (which does not narrow the type) and instead of the generic IComponent that $this['x'] returns. See Form::typedComponent().

Parameters
$name : string
$type : T>
Tags
template
Return values
T

frontPresenter()

Returns the front presenter the component is attached to (null outside the front end or when detached).

protected frontPresenter() : BasePresenter|null
Return values
BasePresenter|null

getTranslator()

protected getTranslator() : ITranslator
Return values
ITranslator

setTemplateFile()

protected setTemplateFile(string $dir, string $filename) : void
Parameters
$dir : string
$filename : string

setTranslator()

protected setTranslator(ITranslator $translator) : self
Parameters
$translator : ITranslator
Return values
self

computeHoursSum()

Initial hours total; JS keeps recomputing it live while editing.

private computeHoursSum() : string
Return values
string

computePriceSum()

Initial price total: the server value from the entity ({@see WorkItem::getPrice()}), not a recomputation.

private computePriceSum() : string

IMPORTANT: counts only work items with billable = 1, like WorkListSheetsFormTrait::summarizeItemsRaw() and the live recomputation in work-grid.js. An unchecked work item keeps its price but must not enter the total, because it will not go on the invoice.

Return values
string

createMultiplierComponent()

Creates a multiplier for the component.

private createMultiplierComponent(string $name) : Multiplier<string|int, IComponent>
Parameters
$name : string
Return values
Multiplier<string|int, IComponent>

createNewComponentInstance()

Creates a new component instance without adding it to the presenter; used by the multiplier.

private createNewComponentInstance(string $baseName[, int|string|null $uniqueKey = null ]) : IComponent|null
Parameters
$baseName : string
$uniqueKey : int|string|null = null
Return values
IComponent|null

createStandardComponent()

Creates a standard component (not a multiplier).

private createStandardComponent(string $name) : IComponent|null
Parameters
$name : string
Return values
IComponent|null

prepareGrid()

Fills `$this->template`; called from `render()` without arguments (AJAX snippet phase pitfall, see {@see \App\UI\Admin\Company\Components\WorkGridComponent\WorkGrid}).

private prepareGrid() : void

resolveStatusOptions()

Returns the work item status options.

private resolveStatusOptions() : array<string, string>

Uses the options supplied through setStatuses(); only when the caller supplied none does it fall back to translating the enum directly, so the grid never lacks options.

Return values
array<string, string>
On this page

Search results