1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
|
<?php
namespace Studip;
use Stringable,
JsonSerializable,
Studip\Forms\Form,
\Icon;
/**
* PHP wrapper class for parts of a wizard, creating the data structure expected by the Vue component StudipWizard.
*
* Such a part can either be
* - a Vue component as returned by VueApp::create()
* - a StudipForm returned by one of the Forms\Form creation methods (::create() or ::fromSORM())
*
* @author Thomas Hackl <hackl@data-quest.de>
* @since Stud.IP 6.3
*/
final class WizardPart implements Stringable, JsonSerializable
{
private string $id;
private string $type;
private Form|VueApp $content;
private string $title;
private string $iconShape;
private string $description;
/**
* Creates a vue app with the given relative path to the app component.
*/
public static function create(
string $id,
Form|VueApp $content,
string $title = '',
string $description = '',
string $iconShape = ''
): WizardPart
{
return new static($id, $content, $title, $description, $iconShape);
}
public function __construct(
string $id,
Form|VueApp $content,
string $title = '',
string $description = '',
string $iconShape = ''
)
{
$this->id = $id;
$this->type = get_class($content);
$this->content = $content;
$this->title = $title;
$this->description = $description;
$this->iconShape = $iconShape;
}
public function getId(): string
{
return $this->id;
}
public function getType(): string
{
return $this->type;
}
public function getTitle(): string
{
return $this->title;
}
public function getDescription(): string
{
return $this->description;
}
public function getContent() {
return $this->content;
}
public function setId(string $id): WizardPart
{
$this->id = $id;
return $this;
}
public function setTitle(string $title): WizardPart
{
$this->title = $title;
return $this;
}
public function setDescription(string $description): WizardPart
{
$this->description = $description;
return $this;
}
public function getIconShape(): string
{
return $this->iconShape;
}
public function setIconShape(string $shape): WizardPart
{
$this->iconShape = $shape;
return $this;
}
public function jsonSerialize(): mixed
{
return [
'id' => $this->id,
'type' => $this->type,
'title' => $this->title,
'description' => $this->description,
'icon' => $this->iconShape,
'content' => $this->render()
];
}
/**
* Renders the vue app
*/
public function render(): string
{
\NotificationCenter::postNotification('WizardPartWillRender', $this);
switch ($this->type) {
case Form::class:
$content = $this->content->getTemplate()->render();
break;
case VueApp::class:
$content = $this->content->getTemplate(true)->render();
break;
default:
$content = '';
}
\NotificationCenter::postNotification('WizardPartDidRender', $this);
return $content;
}
/**
* Returns a string representation of the vue app by rendering it.
*/
public function __toString(): string
{
return $this->render();
}
}
|