Skip to content

Commit 229e363

Browse files
committed
Add checkbox and dropdown components
1 parent a0aa170 commit 229e363

File tree

5 files changed

+1195
-150
lines changed

5 files changed

+1195
-150
lines changed

Setonix server.session.sql

Whitespace-only changes.

api/lib/src/models/dialog.dart

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,25 @@ final class GameDialog with GameDialogMappable {
3939
),
4040
);
4141

42+
GameDialog checkbox(String label, {String? id, bool initialValue = false}) =>
43+
copyWith.components.add(
44+
GameDialogCheckboxComponent(label, id: id, initialValue: initialValue),
45+
);
46+
47+
GameDialog dropdown(
48+
String label,
49+
List<GameDialogDropdownOption> options, {
50+
String? id,
51+
String? initialValue,
52+
}) => copyWith.components.add(
53+
GameDialogDropdownComponent(
54+
label,
55+
options,
56+
id: id,
57+
initialValue: initialValue,
58+
),
59+
);
60+
4261
GameDialog action(GameDialogButton action) =>
4362
copyWith(actions: [...(actions ?? []), action]);
4463

@@ -53,6 +72,13 @@ final class GameDialog with GameDialogMappable {
5372
return e.label.length <= 50 &&
5473
(e.id?.length ?? 0) <= 100 &&
5574
(e.placeholder?.length ?? 0) <= 50;
75+
case GameDialogCheckboxComponent():
76+
return e.label.length <= 50 && (e.id?.length ?? 0) <= 100;
77+
case GameDialogDropdownComponent():
78+
return e.label.length <= 50 &&
79+
(e.id?.length ?? 0) <= 100 &&
80+
e.options.length <= 20 &&
81+
e.options.every((o) => o.isValid());
5682
}
5783
}) &&
5884
(actions ?? []).every(
@@ -91,6 +117,48 @@ final class GameDialogTextFieldComponent extends GameDialogComponent
91117
String get idOrLabel => id ?? label;
92118
}
93119

120+
@MappableClass()
121+
final class GameDialogCheckboxComponent extends GameDialogComponent
122+
with GameDialogCheckboxComponentMappable {
123+
final String label;
124+
final String? id;
125+
final bool initialValue;
126+
127+
GameDialogCheckboxComponent(this.label, {this.id, this.initialValue = false});
128+
129+
String get idOrLabel => id ?? label;
130+
}
131+
132+
@MappableClass()
133+
final class GameDialogDropdownComponent extends GameDialogComponent
134+
with GameDialogDropdownComponentMappable {
135+
final String label;
136+
final String? id;
137+
final List<GameDialogDropdownOption> options;
138+
final String? initialValue;
139+
140+
GameDialogDropdownComponent(
141+
this.label,
142+
this.options, {
143+
this.id,
144+
this.initialValue,
145+
});
146+
147+
String get idOrLabel => id ?? label;
148+
}
149+
150+
@MappableClass()
151+
final class GameDialogDropdownOption with GameDialogDropdownOptionMappable {
152+
final String? label;
153+
final String value;
154+
155+
GameDialogDropdownOption({this.label, required this.value});
156+
157+
bool isValid() => (label?.length ?? 0) <= 50 && value.length <= 50;
158+
159+
String get idOrLabel => label ?? value;
160+
}
161+
94162
@MappableClass()
95163
final class GameDialogButton with GameDialogButtonMappable {
96164
final String label;
@@ -137,3 +205,33 @@ final class GameDialogTextFieldValue extends GameDialogComponentValue
137205
@override
138206
int getAsInt() => int.tryParse(value) ?? 0;
139207
}
208+
209+
@MappableClass()
210+
final class GameDialogCheckboxValue extends GameDialogComponentValue
211+
with GameDialogCheckboxValueMappable {
212+
final bool value;
213+
214+
GameDialogCheckboxValue({required this.value, required super.component});
215+
216+
@override
217+
String getAsString() => value.toString();
218+
@override
219+
bool getAsBool() => value;
220+
@override
221+
int getAsInt() => value ? 1 : 0;
222+
}
223+
224+
@MappableClass()
225+
final class GameDialogDropdownValue extends GameDialogComponentValue
226+
with GameDialogDropdownValueMappable {
227+
final String value;
228+
229+
GameDialogDropdownValue({required this.value, required super.component});
230+
231+
@override
232+
String getAsString() => value;
233+
@override
234+
bool getAsBool() => value.isNotEmpty;
235+
@override
236+
int getAsInt() => int.tryParse(value) ?? 0;
237+
}

0 commit comments

Comments
 (0)