Skip to content

Commit 1beba93

Browse files
author
Freek van de Ven
committed
feat: add catalog modification screen
1 parent 3d35e2b commit 1beba93

20 files changed

Lines changed: 1412 additions & 83 deletions

packages/flutter_catalog/lib/l10n/app_en.arb

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,32 @@
66
"filterButton": "Filters",
77
"noItemsFound": "No items found.",
88
"itemLoadingError": "Failed to load items.",
9+
"itemCreatePageMandatorySection": "Mandatory",
910
"detailDescriptionTitle": "Description",
1011
"applyFiltersButton": "Apply filters",
1112
"sendMessageButton": "Send message",
1213
"characteristicsTitle": "Characteristics",
1314
"distanceTitle": "Distance",
1415
"postedSince": "Posted since {date}",
1516
"@postedSince": {
16-
"description": "Indicates how long ago the item was posted, formatted as a relative date.",
1717
"placeholders": {
1818
"date": {}
1919
}
20-
}
20+
},
21+
"itemCreatePageTitle": "Create Item",
22+
"itemEditPageTitle": "Edit Item",
23+
"itemCreatePageTitleHint": "Title",
24+
"itemCreatePageDescriptionHint": "Description",
25+
"itemCreatePageTitleRequiredError": "Title is required.",
26+
"itemCreatePageAddImagesButton": "Add Images",
27+
"itemCreatePageSaveChangesButton": "Save Changes",
28+
"itemCreatePageSavingChangesButton": "Saving...",
29+
"itemCreatePageDeleteItemButton": "Delete Item",
30+
"itemCreatePageDeleteConfirmationTitle": "Delete Item",
31+
"itemCreatePageDeleteConfirmationMessage": "Are you sure you want to delete this item forever?",
32+
"itemCreatePageDeleteConfirmationConfirm": "Delete",
33+
"itemCreatePageDeleteConfirmationCancel": "Cancel",
34+
"itemCreatePageGenericError": "An error occurred.",
35+
"itemCreatePageItemDeletedSuccess": "Item deleted successfully.",
36+
"itemCreatePageItemDeleteError": "Failed to delete item."
2137
}

packages/flutter_catalog/lib/l10n/app_localizations.dart

Lines changed: 103 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,12 @@ abstract class FlutterCatalogLocalizations {
129129
/// **'Failed to load items.'**
130130
String get itemLoadingError;
131131

132+
/// No description provided for @itemCreatePageMandatorySection.
133+
///
134+
/// In en, this message translates to:
135+
/// **'Mandatory'**
136+
String get itemCreatePageMandatorySection;
137+
132138
/// No description provided for @detailDescriptionTitle.
133139
///
134140
/// In en, this message translates to:
@@ -159,11 +165,107 @@ abstract class FlutterCatalogLocalizations {
159165
/// **'Distance'**
160166
String get distanceTitle;
161167

162-
/// Indicates how long ago the item was posted, formatted as a relative date.
168+
/// No description provided for @postedSince.
163169
///
164170
/// In en, this message translates to:
165171
/// **'Posted since {date}'**
166172
String postedSince(Object date);
173+
174+
/// No description provided for @itemCreatePageTitle.
175+
///
176+
/// In en, this message translates to:
177+
/// **'Create Item'**
178+
String get itemCreatePageTitle;
179+
180+
/// No description provided for @itemEditPageTitle.
181+
///
182+
/// In en, this message translates to:
183+
/// **'Edit Item'**
184+
String get itemEditPageTitle;
185+
186+
/// No description provided for @itemCreatePageTitleHint.
187+
///
188+
/// In en, this message translates to:
189+
/// **'Title'**
190+
String get itemCreatePageTitleHint;
191+
192+
/// No description provided for @itemCreatePageDescriptionHint.
193+
///
194+
/// In en, this message translates to:
195+
/// **'Description'**
196+
String get itemCreatePageDescriptionHint;
197+
198+
/// No description provided for @itemCreatePageTitleRequiredError.
199+
///
200+
/// In en, this message translates to:
201+
/// **'Title is required.'**
202+
String get itemCreatePageTitleRequiredError;
203+
204+
/// No description provided for @itemCreatePageAddImagesButton.
205+
///
206+
/// In en, this message translates to:
207+
/// **'Add Images'**
208+
String get itemCreatePageAddImagesButton;
209+
210+
/// No description provided for @itemCreatePageSaveChangesButton.
211+
///
212+
/// In en, this message translates to:
213+
/// **'Save Changes'**
214+
String get itemCreatePageSaveChangesButton;
215+
216+
/// No description provided for @itemCreatePageSavingChangesButton.
217+
///
218+
/// In en, this message translates to:
219+
/// **'Saving...'**
220+
String get itemCreatePageSavingChangesButton;
221+
222+
/// No description provided for @itemCreatePageDeleteItemButton.
223+
///
224+
/// In en, this message translates to:
225+
/// **'Delete Item'**
226+
String get itemCreatePageDeleteItemButton;
227+
228+
/// No description provided for @itemCreatePageDeleteConfirmationTitle.
229+
///
230+
/// In en, this message translates to:
231+
/// **'Delete Item'**
232+
String get itemCreatePageDeleteConfirmationTitle;
233+
234+
/// No description provided for @itemCreatePageDeleteConfirmationMessage.
235+
///
236+
/// In en, this message translates to:
237+
/// **'Are you sure you want to delete this item forever?'**
238+
String get itemCreatePageDeleteConfirmationMessage;
239+
240+
/// No description provided for @itemCreatePageDeleteConfirmationConfirm.
241+
///
242+
/// In en, this message translates to:
243+
/// **'Delete'**
244+
String get itemCreatePageDeleteConfirmationConfirm;
245+
246+
/// No description provided for @itemCreatePageDeleteConfirmationCancel.
247+
///
248+
/// In en, this message translates to:
249+
/// **'Cancel'**
250+
String get itemCreatePageDeleteConfirmationCancel;
251+
252+
/// No description provided for @itemCreatePageGenericError.
253+
///
254+
/// In en, this message translates to:
255+
/// **'An error occurred.'**
256+
String get itemCreatePageGenericError;
257+
258+
/// No description provided for @itemCreatePageItemDeletedSuccess.
259+
///
260+
/// In en, this message translates to:
261+
/// **'Item deleted successfully.'**
262+
String get itemCreatePageItemDeletedSuccess;
263+
264+
/// No description provided for @itemCreatePageItemDeleteError.
265+
///
266+
/// In en, this message translates to:
267+
/// **'Failed to delete item.'**
268+
String get itemCreatePageItemDeleteError;
167269
}
168270

169271
class _FlutterCatalogLocalizationsDelegate

packages/flutter_catalog/lib/l10n/app_localizations_en.dart

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ class FlutterCatalogLocalizationsEn extends FlutterCatalogLocalizations {
2222
@override
2323
String get itemLoadingError => 'Failed to load items.';
2424

25+
@override
26+
String get itemCreatePageMandatorySection => 'Mandatory';
27+
2528
@override
2629
String get detailDescriptionTitle => 'Description';
2730

@@ -41,4 +44,53 @@ class FlutterCatalogLocalizationsEn extends FlutterCatalogLocalizations {
4144
String postedSince(Object date) {
4245
return 'Posted since $date';
4346
}
47+
48+
@override
49+
String get itemCreatePageTitle => 'Create Item';
50+
51+
@override
52+
String get itemEditPageTitle => 'Edit Item';
53+
54+
@override
55+
String get itemCreatePageTitleHint => 'Title';
56+
57+
@override
58+
String get itemCreatePageDescriptionHint => 'Description';
59+
60+
@override
61+
String get itemCreatePageTitleRequiredError => 'Title is required.';
62+
63+
@override
64+
String get itemCreatePageAddImagesButton => 'Add Images';
65+
66+
@override
67+
String get itemCreatePageSaveChangesButton => 'Save Changes';
68+
69+
@override
70+
String get itemCreatePageSavingChangesButton => 'Saving...';
71+
72+
@override
73+
String get itemCreatePageDeleteItemButton => 'Delete Item';
74+
75+
@override
76+
String get itemCreatePageDeleteConfirmationTitle => 'Delete Item';
77+
78+
@override
79+
String get itemCreatePageDeleteConfirmationMessage =>
80+
'Are you sure you want to delete this item forever?';
81+
82+
@override
83+
String get itemCreatePageDeleteConfirmationConfirm => 'Delete';
84+
85+
@override
86+
String get itemCreatePageDeleteConfirmationCancel => 'Cancel';
87+
88+
@override
89+
String get itemCreatePageGenericError => 'An error occurred.';
90+
91+
@override
92+
String get itemCreatePageItemDeletedSuccess => 'Item deleted successfully.';
93+
94+
@override
95+
String get itemCreatePageItemDeleteError => 'Failed to delete item.';
4496
}

packages/flutter_catalog/lib/src/config/catalog_builders.dart

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ class CatalogBuilders {
1212
this.errorPlaceholderBuilder,
1313
this.noItemsPlaceholderBuilder,
1414
this.filterSectionBuilder,
15+
this.primaryButtonBuilder = _defaultPrimaryButtonBuilder,
1516
});
1617

1718
/// A builder for the main screen layout.
@@ -47,6 +48,26 @@ class CatalogBuilders {
4748
/// (e.g., checkboxes, sliders).
4849
final Widget Function(BuildContext context, String title, Widget child)?
4950
filterSectionBuilder;
51+
52+
/// A builder for primary action buttons, like the 'Save' button.
53+
///
54+
/// If not provided, a default [ElevatedButton] will be used.
55+
final PrimaryButtonBuilder primaryButtonBuilder;
56+
57+
/// The default builder for the primary button.
58+
static Widget _defaultPrimaryButtonBuilder(
59+
BuildContext context, {
60+
required VoidCallback onPressed,
61+
// onDisabledPressed is ignored by the default implementation
62+
// as a standard ElevatedButton is not clickable when disabled.
63+
required VoidCallback onDisabledPressed,
64+
required bool isDisabled,
65+
required Widget child,
66+
}) =>
67+
ElevatedButton(
68+
onPressed: isDisabled ? null : onPressed,
69+
child: child,
70+
);
5071
}
5172

5273
/// The base screen builder signature.
@@ -63,3 +84,18 @@ typedef BaseScreenBuilder = Widget Function(
6384
String? title,
6485
Widget body,
6586
);
87+
88+
/// A builder for a primary action button.
89+
///
90+
/// - [onPressed]: The callback for when the button is pressed and enabled.
91+
/// - [onDisabledPressed]: The callback for when the button is pressed but
92+
/// disabled.
93+
/// - [isDisabled]: Whether the button should be in a disabled state.
94+
/// - [child]: The widget to display inside the button.
95+
typedef PrimaryButtonBuilder = Widget Function(
96+
BuildContext context, {
97+
required VoidCallback onPressed,
98+
required VoidCallback onDisabledPressed,
99+
required bool isDisabled,
100+
required Widget child,
101+
});

packages/flutter_catalog/lib/src/config/catalog_options.dart

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,33 @@ class CatalogOptions {
4343

4444
/// An optional filter configuration for managing item filtering.
4545
final FilterOptions? filterOptions;
46+
47+
/// Creates a copy of this object with the given fields replaced
48+
/// with the new values.
49+
CatalogOptions copyWith({
50+
CatalogRepository? catalogRepository,
51+
CatalogBuilders? builders,
52+
CatalogTheme? theme,
53+
CatalogTranslations? translations,
54+
VoidCallback? onNoItems,
55+
FilterOptions? filterOptions,
56+
}) =>
57+
CatalogOptions(
58+
catalogRepository: catalogRepository ?? this.catalogRepository,
59+
builders: builders ?? this.builders,
60+
theme: theme ?? this.theme,
61+
translations: translations ?? this.translations,
62+
onNoItems: onNoItems ?? this.onNoItems,
63+
filterOptions: filterOptions ?? this.filterOptions,
64+
);
4665
}
4766

4867
/// A configuration class for managing filter-related repositories and options.
4968
class FilterOptions {
5069
/// Constructs a [FilterOptions].
5170
const FilterOptions({
5271
this.showFiltersInOverview = true,
72+
this.showSearchInOverview = true,
5373
this.filterRepository,
5474
this.filterValueRepository,
5575
this.filterDataSourceRepository,
@@ -61,6 +81,10 @@ class FilterOptions {
6181
/// displayed
6282
final bool showFiltersInOverview;
6383

84+
/// Whether to show the search bar in the overview screen's AppBar.
85+
/// Defaults to true.
86+
final bool showSearchInOverview;
87+
6488
/// The repository for managing filter data.
6589
final FilterRepository? filterRepository;
6690

0 commit comments

Comments
 (0)