ILIAS  trunk Revision v12.0_alpha-377-g3641b37b9db
DocumentTable.php
Go to the documentation of this file.
1<?php
2
19declare(strict_types=1);
20
22
23use Closure;
24use Generator;
44use ilObjUser;
45use Psr\Http\Message\RequestInterface;
46use Psr\Http\Message\ServerRequestInterface;
47
49{
50 public const CMD_EDIT_DOCUMENT = 'editDocument';
51 public const CMD_DELETE_DOCUMENT = 'deleteDocument';
52 public const CMD_DELETE_DOCUMENTS = 'deleteDocuments';
53 public const CMD_ADD_CRITERION = 'addCriterion';
54
55 private readonly ServerRequestInterface|RequestInterface $request;
56 private readonly Factory $data_factory;
57 private readonly ilCtrlInterface $ctrl;
58 private readonly Ordering $table;
59 private readonly Renderer $ui_renderer;
60 private readonly ilObjUser $user;
61 private readonly \DateTimeZone $usr_timezone;
62
64 private array $modals = [];
65
66 public function __construct(
67 private readonly Closure $criterion_as_component,
68 private readonly DocumentRepository $repository,
69 private readonly UI $ui,
70 private readonly DocumentModal $modal,
71 private readonly object $gui,
72 private readonly ?EditLinks $edit_links = null,
73 ServerRequestInterface|RequestInterface|null $request = null,
74 ?Factory $data_factory = null,
75 ?ilCtrlInterface $ctrl = null,
76 ?Renderer $ui_renderer = null,
77 ?ilObjUser $user = null
78 ) {
79 global $DIC;
80 $this->request = $request ?: $DIC->http()->request();
81 $this->data_factory = $data_factory ?: new Factory();
82 $this->ctrl = $ctrl ?: $DIC->ctrl();
83 $this->ui_renderer = $ui_renderer ?: $DIC->ui()->renderer();
84 $this->user = $user ?: $DIC->user();
85 $this->usr_timezone = new \DateTimeZone($this->user->getTimeZone());
86
87 $this->table = $this->buildTable();
88 }
89
90 private function buildTable(): Ordering
91 {
92 $uiTable = $this->ui->create()->table();
93
94 if ((int) $this->user->getTimeFormat() === ilCalendarSettings::TIME_FORMAT_12) {
95 $date_format = $this->data_factory->dateFormat()->withTime12($this->user->getDateFormat());
96 } else {
97 $date_format = $this->data_factory->dateFormat()->withTime24($this->user->getDateFormat());
98 }
99
100 $table = $uiTable->ordering(
101 $this,
102 (new URI((string) $this->request->getUri()))->withParameter('cmd', 'saveOrder'),
103 $this->ui->txt('tbl_docs_title'),
104 [
105 'title' => $uiTable->column()->text($this->ui->txt('tbl_docs_head_title')),
106 'created' => $uiTable->column()->date($this->ui->txt('tbl_docs_head_created'), $date_format),
107 'change' => $uiTable->column()->date($this->ui->txt('tbl_docs_head_last_change'), $date_format),
108 'criteria' => $uiTable->column()->text($this->ui->txt('tbl_docs_head_criteria')),
109 ],
110 )
111 ->withId('legalDocsTable')
112 ->withRequest($this->request);
113
114 if ($this->edit_links) {
116 }
117
118 return $table;
119 }
120
121 public function getRows(
122 OrderingRowBuilder $row_builder,
123 array $visible_column_ids
124 ): Generator {
125 foreach ($this->repository->all() as $document) {
126 yield $this->buildTableRow($row_builder, $document);
127 }
128 }
129
130 private function buildTableRow(OrderingRowBuilder $row_builder, Document $document): OrderingRow
131 {
132 $criterion_components = [];
133 foreach ($document->criteria() as $criterion) {
134 $criterion_components[] = $this->ui->create()->legacy()->content('<div style="display: flex; gap: 1rem;">');
135 $criterion_components[] = $this->criterionName($criterion);
136
137 if ($this->edit_links) {
138 $delete_modal = $this->ui->create()->modal()->interruptive(
139 $this->ui->txt('doc_detach_crit_confirm_title'),
140 $this->ui->txt('doc_sure_detach_crit'),
141 $this->edit_links->deleteCriterion($document, $criterion)
142 );
143
144 $dropdown = $this->ui->create()->dropdown()->standard([
145 $this->ui->create()->button()->shy(
146 $this->ui->txt('edit'),
147 $this->edit_links->editCriterion($document, $criterion)
148 ),
149 $this->ui->create()->button()->shy(
150 $this->ui->txt('delete'),
151 ''
152 )->withOnClick($delete_modal->getShowSignal())
153 ]);
154
155 $this->modals[] = $delete_modal;
156 $criterion_components[] = $dropdown;
157 }
158
159 $criterion_components[] = $this->ui->create()->legacy()->content('</div>');
160 }
161
162 $table_row = [
163 'id' => $document->id(),
164 'title' => $this->ui_renderer->render($this->modal->create($document->content())),
165 'created' => $document->meta()->creation()->time()->setTimezone($this->usr_timezone),
166 'change' => $document->meta()->lastModification()->time()->setTimezone($this->usr_timezone),
167 'criteria' => $this->ui_renderer->render($criterion_components),
168 ];
169 return $row_builder->buildOrderingRow((string) $document->id(), $table_row);
170 }
171
172 public function criterionName(Criterion $criterion): Component
173 {
174 return ($this->criterion_as_component)($criterion->content());
175 }
176
177 public function getTotalRowCount(
178 mixed $additional_viewcontrol_data,
179 mixed $filter_data,
180 mixed $additional_parameters
181 ): ?int {
182 return $this->repository->countAll();
183 }
184
185 public function render(): string
186 {
187 // This MUST be rendered BEFORE $this->modal->components(),
188 // because the components are filled within the rendering process.
189 $html = $this->ui_renderer->render($this->table);
190
191 return $html . $this->ui_renderer->render([...$this->modal->popComponents(), ...$this->modals]);
192 }
193
197 private function buildTableActions(): array
198 {
199 return [
200 self::CMD_DELETE_DOCUMENTS => $this->buildTableAction(self::CMD_DELETE_DOCUMENTS, $this->ui->txt('delete'), true),
201 self::CMD_EDIT_DOCUMENT => $this->buildTableAction(self::CMD_EDIT_DOCUMENT, $this->ui->txt('edit')),
202 self::CMD_ADD_CRITERION => $this->buildTableAction(
203 self::CMD_ADD_CRITERION,
204 $this->ui->txt('tbl_docs_action_add_criterion')
205 ),
206 self::CMD_DELETE_DOCUMENT => $this->buildTableAction(self::CMD_DELETE_DOCUMENT, $this->ui->txt('delete')),
207 ];
208 }
209
210 private function buildTableAction(string $cmd, string $title, bool $multi = false): Single|Multi
211 {
212 $uri = $this->data_factory->uri(
213 ILIAS_HTTP_PATH . '/' . $this->ctrl->getLinkTarget($this->gui, $cmd)
214 );
215
221 [
222 $url_builder,
223 $action_parameter_token,
224 $row_id_token
225 ] = (new URLBuilder($uri))->acquireParameters(
226 ['legal_document'],
227 'action',
228 'id'
229 );
230
231 if ($multi) {
232 return $this->ui->create()->table()->action()->multi(
233 $title,
234 $url_builder->withParameter($action_parameter_token, $cmd),
235 $row_id_token
236 );
237 }
238
239 return $this->ui->create()->table()->action()->single(
240 $title,
241 $url_builder->withParameter($action_parameter_token, $cmd),
242 $row_id_token
243 );
244 }
245}
Builds data types.
Definition: Factory.php:36
The scope of this class is split ilias-conform URI's into components.
Definition: URI.php:35
__construct(private readonly Closure $criterion_as_component, private readonly DocumentRepository $repository, private readonly UI $ui, private readonly DocumentModal $modal, private readonly object $gui, private readonly ?EditLinks $edit_links=null, ServerRequestInterface|RequestInterface|null $request=null, ?Factory $data_factory=null, ?ilCtrlInterface $ctrl=null, ?Renderer $ui_renderer=null, ?ilObjUser $user=null)
buildTableRow(OrderingRowBuilder $row_builder, Document $document)
readonly ServerRequestInterface RequestInterface $request
getTotalRowCount(mixed $additional_viewcontrol_data, mixed $filter_data, mixed $additional_parameters)
getRows(OrderingRowBuilder $row_builder, array $visible_column_ids)
This is called by the (ordering-)table to retrieve rows; map data-records to rows using the $row_buil...
Stores all calendar relevant settings.
User class.
return['delivery_method'=> 'php',]
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
A component is the most general form of an entity in the UI.
Definition: Component.php:28
buildOrderingRow(string $id, array $record)
This describes a Table to specify the order of its data (rows).
Definition: Ordering.php:29
An entity that renders components to a string output.
Definition: Renderer.php:31
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
modal(string $title="", string $cancel_label="")
global $DIC
Definition: shib_login.php:26