WorkGrid
extends BaseComponent
in package
uses
InitTrait
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
$container
public
Container
$container
Attributes
- #[Inject]
$routerDispatcher
public
RouterDispatcher
$routerDispatcher
$translator
public
ITranslator
$translator
Tags
$appContext
protected
AppContext
$appContext
$componentParameters
protected
array<string, mixed>
$componentParameters
= []
component parameters set by setComponentParameter()
$currencyContext
protected
CurrencyContext|null
$currencyContext
= NULL
$deviceDetector
protected
DeviceDetector|null
$deviceDetector
= NULL
$languageContext
protected
LanguageContext|null
$languageContext
= NULL
$localizationContext
protected
LocalizationContext|null
$localizationContext
= NULL
$settingContext
protected
SettingContext
$settingContext
$themeContext
protected
ThemeContext|null
$themeContext
= NULL
$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>
__construct()
public
__construct() : mixed
createComponent()
public
createComponent(string $name) : IComponent|null
Parameters
- $name : string
Return values
IComponent|nullgetAppContext()
public
getAppContext() : AppContext
Return values
AppContextgetComponentParameter()
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
ContainergetCurrencyContext()
public
getCurrencyContext() : CurrencyContext|null
Return values
CurrencyContext|nullgetLanguageContext()
public
getLanguageContext() : LanguageContext|null
Return values
LanguageContext|nullgetLocalizationContext()
public
getLocalizationContext() : LocalizationContext|null
Return values
LocalizationContext|nullgetRouterDispatcher()
public
getRouterDispatcher() : RouterDispatcher
Return values
RouterDispatchergetSettingContext()
public
getSettingContext() : SettingContext
Return values
SettingContextgetSettings()
public
getSettings() : array<int, array<string, mixed>>
Return values
array<int, array<string, mixed>>getThemeContext()
public
getThemeContext() : ThemeContext|null
Return values
ThemeContext|nullhasServiceByType()
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
Return values
boolinitializeAllContexts()
public
initializeAllContexts() : void
injectDeviceDetector()
public
injectDeviceDetector(DeviceDetector $detector) : void
Parameters
- $detector : DeviceDetector
onCreate()
public
onCreate() : void
render()
public
render() : void
setAppContext()
public
setAppContext(AppContext $appContext) : $this
Parameters
- $appContext : AppContext
Return values
$thissetComponentParameter()
Sets a component parameter.
public
setComponentParameter(string $name, mixed $value) : void
Parameters
- $name : string
- $value : mixed
setCurrencyContext()
public
setCurrencyContext(CurrencyContext|null $currencyContext) : $this
Parameters
- $currencyContext : CurrencyContext|null
Return values
$thissetDefaultVatPercents()
See the docblock of {@see $defaultVatPercents}.
public
setDefaultVatPercents(string|null $defaultVatPercents) : self
Parameters
- $defaultVatPercents : string|null
Return values
selfsetItems()
public
setItems(array<string|int, WorkItem> $items) : self
Parameters
- $items : array<string|int, WorkItem>
Return values
selfsetLanguageContext()
public
setLanguageContext(LanguageContext|null $languageContext) : $this
Parameters
- $languageContext : LanguageContext|null
Return values
$thissetLocalizationContext()
public
setLocalizationContext(LocalizationContext|null $localizationContext) : $this
Parameters
- $localizationContext : LocalizationContext|null
Return values
$thissetReadOnly()
public
setReadOnly(bool $readOnly) : self
Parameters
- $readOnly : bool
Return values
selfsetRowNamePrefix()
public
setRowNamePrefix(string $rowNamePrefix) : self
Parameters
- $rowNamePrefix : string
Return values
selfsetServices()
public
setServices(array<int, string> $serviceOptions) : self
Parameters
- $serviceOptions : array<int, string>
Return values
selfsetSettingContext()
public
setSettingContext(SettingContext $settingContext) : $this
Parameters
- $settingContext : SettingContext
Return values
$thissetSheet()
public
setSheet(WorkSheet $sheet) : self
Parameters
- $sheet : WorkSheet
Return values
selfsetStatuses()
public
setStatuses(array<string, string> $statusOptions) : self
Parameters
- $statusOptions : array<string, string>
Return values
selfsetSupplyKinds()
public
setSupplyKinds(array<int, string> $supplyKindOptions) : self
Parameters
- $supplyKindOptions : array<int, string>
Return values
selfsetThemeContext()
public
setThemeContext(ThemeContext|null $themeContext) : $this
Parameters
- $themeContext : ThemeContext|null
Return values
$thissetUnreadComments()
public
setUnreadComments(array<int, int> $unreadComments) : self
Parameters
- $unreadComments : array<int, int>
-
workItemId => unread count
Return values
selfsetup()
public
setup(BasePresenter|BasePresenter $presenter) : void
Parameters
- $presenter : BasePresenter|BasePresenter
setupAppContext()
public
setupAppContext(AppContext $appContext) : void
Parameters
- $appContext : AppContext
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
Return values
TfrontPresenter()
Returns the front presenter the component is attached to (null outside the front end or when detached).
protected
frontPresenter() : BasePresenter|null
Return values
BasePresenter|nullgetTranslator()
protected
getTranslator() : ITranslator
Return values
ITranslatorsetTemplateFile()
protected
setTemplateFile(string $dir, string $filename) : void
Parameters
- $dir : string
- $filename : string
setTranslator()
protected
setTranslator(ITranslator $translator) : self
Parameters
- $translator : ITranslator
Return values
selfcomputeHoursSum()
Initial hours total; JS keeps recomputing it live while editing.
private
computeHoursSum() : string
Return values
stringcomputePriceSum()
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
stringcreateMultiplierComponent()
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|nullcreateStandardComponent()
Creates a standard component (not a multiplier).
private
createStandardComponent(string $name) : IComponent|null
Parameters
- $name : string
Return values
IComponent|nullprepareGrid()
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.