Skip to content

Commit

Permalink
feat: [MDS-617] Refactor Input to align with Flutter 3.10.x changes a…
Browse files Browse the repository at this point in the history
…nd create InputGroup component (#239)

Co-authored-by: BirgittMajas <79840500+BirgittMajas@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
  • Loading branch information
3 people committed Sep 6, 2023
1 parent a77270a commit 32ec1c7
Show file tree
Hide file tree
Showing 27 changed files with 2,118 additions and 4,881 deletions.
17 changes: 5 additions & 12 deletions example/lib/src/storybook/stories/text_area.dart
Original file line number Diff line number Diff line change
Expand Up @@ -64,16 +64,16 @@ class TextAreaStory extends Story {

final inactiveBorderColor = colorTable(context)[inactiveBorderColorKnob ?? 40];

final errorBorderColorKnob = context.knobs.nullable.options(
label: "errorBorderColor",
description: "MoonColors variants for MoonTextArea error border.",
final errorColorKnob = context.knobs.nullable.options(
label: "errorColor",
description: "MoonColors variants for MoonTextArea error.",
enabled: false,
initial: 0,
// piccolo
options: colorOptions,
);

final errorBorderColor = colorTable(context)[errorBorderColorKnob ?? 40];
final errorColor = colorTable(context)[errorColorKnob ?? 40];

final borderRadiusKnob = context.knobs.nullable.sliderInt(
label: "borderRadius",
Expand All @@ -94,12 +94,6 @@ class TextAreaStory extends Story {
description: "Whether the MoonTextArea has no fixed height and is growable",
);

final showFocusEffectKnob = context.knobs.boolean(
label: "showFocusEffect",
description: "Whether to display focus effect around MoonTextInput.",
initial: true,
);

final showHelperKnob = context.knobs.boolean(
label: "helper",
description: "Show widget in MoonTextArea helper slot.",
Expand All @@ -116,14 +110,13 @@ class TextAreaStory extends Story {
children: [
MoonTextArea(
enabled: enabledKnob,
showFocusEffect: showFocusEffectKnob,
height: growableKnob ? null : 200,
textColor: textColor,
hintTextColor: hintTextColor,
backgroundColor: backgroundColor,
activeBorderColor: activeBorderColor,
inactiveBorderColor: inactiveBorderColor,
errorBorderColor: errorBorderColor,
errorColor: errorColor,
borderRadius:
borderRadiusKnob != null ? BorderRadius.circular(borderRadiusKnob.toDouble()) : null,
hintText: "Enter your text here...",
Expand Down
20 changes: 6 additions & 14 deletions example/lib/src/storybook/stories/text_input.dart
Original file line number Diff line number Diff line change
Expand Up @@ -82,16 +82,16 @@ class TextInputStory extends Story {

final inactiveBorderColor = colorTable(context)[inactiveBorderColorKnob ?? 40];

final errorBorderColorKnob = context.knobs.nullable.options(
label: "errorBorderColor",
description: "MoonColors variants for MoonTextInput error border.",
final errorColorKnob = context.knobs.nullable.options(
label: "errorColor",
description: "MoonColors variants for MoonTextInput error.",
enabled: false,
initial: 0,
// piccolo
options: colorOptions,
);

final errorBorderColor = colorTable(context)[errorBorderColorKnob ?? 40];
final errorColor = colorTable(context)[errorColorKnob ?? 40];

final borderRadiusKnob = context.knobs.nullable.sliderInt(
label: "borderRadius",
Expand All @@ -107,12 +107,6 @@ class TextInputStory extends Story {
initial: true,
);

final showFocusEffectKnob = context.knobs.boolean(
label: "showFocusEffect",
description: "Whether to display focus effect around MoonTextInput.",
initial: true,
);

final hasFloatingLabelKnob = context.knobs.boolean(
label: "hasFloatingLabel",
description: "Whether MoonTextInput has floating label.",
Expand Down Expand Up @@ -150,14 +144,13 @@ class TextInputStory extends Story {
controller: _textController,
enabled: enabledKnob,
textInputSize: textInputSizeKnob,
showFocusEffect: showFocusEffectKnob,
hasFloatingLabel: hasFloatingLabelKnob,
textColor: textColor,
hintTextColor: hintTextColor,
backgroundColor: backgroundColor,
activeBorderColor: activeBorderColor,
inactiveBorderColor: inactiveBorderColor,
errorBorderColor: errorBorderColor,
errorColor: errorColor,
borderRadius: borderRadius,
hintText: "Enter your text here (over 10 characters)",
validator: (String? value) => value?.length != null && value!.length < 10
Expand Down Expand Up @@ -194,14 +187,13 @@ class TextInputStory extends Story {
keyboardType: TextInputType.visiblePassword,
obscureText: _hidePassword,
textInputSize: textInputSizeKnob,
showFocusEffect: showFocusEffectKnob,
hasFloatingLabel: hasFloatingLabelKnob,
textColor: textColor,
hintTextColor: hintTextColor,
backgroundColor: backgroundColor,
activeBorderColor: activeBorderColor,
inactiveBorderColor: inactiveBorderColor,
errorBorderColor: errorBorderColor,
errorColor: errorColor,
borderRadius: borderRadius,
hintText: "Enter password (123abc)",
validator: (String? value) => value != "123abc" ? "Wrong password." : null,
Expand Down
224 changes: 224 additions & 0 deletions example/lib/src/storybook/stories/text_input_group.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,224 @@
import 'package:example/src/storybook/common/color_options.dart';
import 'package:example/src/storybook/common/widgets/error.dart';
import 'package:flutter/material.dart';
import 'package:moon_design/moon_design.dart';
import 'package:storybook_flutter/storybook_flutter.dart';

TextEditingController _textController = TextEditingController();
TextEditingController _passwordController = TextEditingController();

bool _hidePassword = true;

class TextInputGroupStory extends Story {
TextInputGroupStory()
: super(
name: "TextInputGroup",
builder: (BuildContext context) {
final textColorKnob = context.knobs.nullable.options(
label: "textColor",
description: "MoonColors variants for MoonTextInputGroup text.",
enabled: false,
initial: 0,
// piccolo
options: colorOptions,
);

final textColor = colorTable(context)[textColorKnob ?? 40];

final hintTextColorKnob = context.knobs.nullable.options(
label: "hintTextColor",
description: "MoonColors variants for MoonTextInputGroup hint text.",
enabled: false,
initial: 0,
// piccolo
options: colorOptions,
);

final hintTextColor = colorTable(context)[hintTextColorKnob ?? 40];

final backgroundColorKnob = context.knobs.nullable.options(
label: "backgroundColor",
description: "MoonColors variants for MoonTextInputGroup background.",
enabled: false,
initial: 0,
// piccolo
options: colorOptions,
);

final backgroundColor = colorTable(context)[backgroundColorKnob ?? 40];

final activeBorderColorKnob = context.knobs.nullable.options(
label: "activeBorderColor",
description: "MoonColors variants for MoonTextInputGroup active border.",
enabled: false,
initial: 0,
// piccolo
options: colorOptions,
);

final activeBorderColor = colorTable(context)[activeBorderColorKnob ?? 40];

final inactiveBorderColorKnob = context.knobs.nullable.options(
label: "inactiveBorderColor",
description: "MoonColors variants for MoonTextInputGroup inactive border.",
enabled: false,
initial: 0,
// piccolo
options: colorOptions,
);

final inactiveBorderColor = colorTable(context)[inactiveBorderColorKnob ?? 40];

final errorColorKnob = context.knobs.nullable.options(
label: "errorColor",
description: "MoonColors variants for MoonTextInputGroup error.",
enabled: false,
initial: 0,
// piccolo
options: colorOptions,
);

final errorColor = colorTable(context)[errorColorKnob ?? 40];

final borderRadiusKnob = context.knobs.nullable.sliderInt(
label: "borderRadius",
description: "Border radius for MoonTextInputGroup.",
enabled: false,
initial: 8,
max: 32,
);

final enabledKnob = context.knobs.boolean(
label: "enabled",
description: "Switch between enabled and disabled states.",
initial: true,
);

final showHelperKnob = context.knobs.boolean(
label: "helper",
description: "Show widget in MoonTextInputGroup helper slot.",
);

final BorderRadiusGeometry? borderRadius =
borderRadiusKnob != null ? BorderRadius.circular(borderRadiusKnob.toDouble()) : null;

return Center(
child: SingleChildScrollView(
padding: const EdgeInsets.symmetric(vertical: 64),
child: Form(
child: StatefulBuilder(
builder: (context, setState) {
return Column(
mainAxisSize: MainAxisSize.min,
children: [
MoonTextInputGroup(
enabled: enabledKnob,
textColor: textColor,
backgroundColor: backgroundColor,
inactiveBorderColor: inactiveBorderColor,
errorColor: errorColor,
borderRadius: borderRadius,
helper: showHelperKnob ? const Text("Supporting text") : null,
errorBuilder: (BuildContext context, List<String> errorMessages) =>
_StoryErrorMessageWidget(errors: errorMessages),
children: [
MoonFormTextInput(
textInputSize: MoonTextInputSize.xl,
controller: _textController,
enabled: enabledKnob,
hasFloatingLabel: true,
textColor: textColor,
hintTextColor: hintTextColor,
activeBorderColor: activeBorderColor,
errorColor: errorColor,
borderRadius: borderRadius,
hintText: "Enter your text here (over 10 characters)",
validator: (String? value) => value?.length != null && value!.length < 10
? "The text should be longer than 10 characters."
: null,
leading: const MoonIcon(
MoonIcons.search_24,
size: 24,
),
trailing: MouseRegion(
cursor: SystemMouseCursors.click,
child: GestureDetector(
child: const MoonIcon(
MoonIcons.close_small_24,
size: 24,
),
onTap: () => _textController.clear(),
),
),
),
MoonFormTextInput(
textInputSize: MoonTextInputSize.xl,
controller: _passwordController,
enabled: enabledKnob,
keyboardType: TextInputType.visiblePassword,
obscureText: _hidePassword,
hasFloatingLabel: true,
textColor: textColor,
hintTextColor: hintTextColor,
activeBorderColor: activeBorderColor,
errorColor: errorColor,
borderRadius: borderRadius,
hintText: "Enter password (123abc)",
validator: (String? value) => value != "123abc" ? "Wrong password." : null,
leading: const MoonIcon(
MoonIcons.search_24,
size: 24,
),
trailing: MouseRegion(
cursor: SystemMouseCursors.click,
child: GestureDetector(
child: IntrinsicWidth(
child: Align(
alignment: Alignment.centerRight,
child: Text(
_hidePassword ? "Show" : "Hide",
style: DefaultTextStyle.of(context)
.style
.copyWith(decoration: TextDecoration.underline),
),
),
),
onTap: () => setState(() => _hidePassword = !_hidePassword),
),
),
),
],
),
const SizedBox(height: 32),
MoonFilledButton(
label: const Text("Submit"),
onTap: () => Form.of(context).validate(),
)
],
);
},
),
),
),
);
},
);
}

class _StoryErrorMessageWidget extends StatelessWidget {
final List<String> errors;

const _StoryErrorMessageWidget({required this.errors});

@override
Widget build(BuildContext context) {
return Column(
mainAxisSize: MainAxisSize.min,
children: List.generate(errors.length * 2 - 1, (int index) {
final int derivedIndex = index ~/ 2;

return index.isEven ? StoryErrorWidget(errorText: errors[derivedIndex]) : const SizedBox(height: 4);
}),
);
}
}
14 changes: 6 additions & 8 deletions example/lib/src/storybook/storybook.dart
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import 'package:example/src/storybook/stories/tab_bar.dart';
import 'package:example/src/storybook/stories/tag.dart';
import 'package:example/src/storybook/stories/text_area.dart';
import 'package:example/src/storybook/stories/text_input.dart';
import 'package:example/src/storybook/stories/text_input_group.dart';
import 'package:example/src/storybook/stories/toast.dart';
import 'package:example/src/storybook/stories/tooltip.dart';
import 'package:flutter/foundation.dart';
Expand Down Expand Up @@ -56,7 +57,7 @@ class StorybookPage extends StatelessWidget {
initialStory: "Accordion",
plugins: _plugins,
brandingWidget: const MoonVersionWidget(),
wrapperBuilder: (BuildContext context, Widget? child) => MaterialApp(
wrapperBuilder: (context, child) => MaterialApp(
title: "Moon Design for Flutter",
theme:
ThemeData.light().copyWith(extensions: <ThemeExtension<dynamic>>[MoonTheme(tokens: MoonTokens.light)]),
Expand All @@ -77,13 +78,9 @@ class StorybookPage extends StatelessWidget {
extendBody: true,
extendBodyBehindAppBar: true,
resizeToAvoidBottomInset: false,
body: SafeArea(
top: false,
bottom: false,
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: child,
),
body: Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: child,
),
),
),
Expand Down Expand Up @@ -117,6 +114,7 @@ class StorybookPage extends StatelessWidget {
TagStory(),
TextAreaStory(),
TextInputStory(),
TextInputGroupStory(),
ToastStory(),
TooltipStory(),
],
Expand Down
2 changes: 2 additions & 0 deletions lib/moon_design.dart
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ export 'package:moon_design/src/theme/segmented_control/segmented_control_theme.
export 'package:moon_design/src/theme/switch/switch_theme.dart';
export 'package:moon_design/src/theme/text_area/text_area_theme.dart';
export 'package:moon_design/src/theme/text_input/text_input_theme.dart';
export 'package:moon_design/src/theme/text_input_group/text_input_group_theme.dart';
export 'package:moon_design/src/theme/theme.dart';
export 'package:moon_design/src/theme/toast/toast_theme.dart';
export 'package:moon_design/src/theme/tokens/borders.dart';
Expand Down Expand Up @@ -95,5 +96,6 @@ export 'package:moon_design/src/widgets/tag/tag.dart';
export 'package:moon_design/src/widgets/text_area/text_area.dart';
export 'package:moon_design/src/widgets/text_input/form_text_input.dart';
export 'package:moon_design/src/widgets/text_input/text_input.dart';
export 'package:moon_design/src/widgets/text_input_group/text_input_group.dart';
export 'package:moon_design/src/widgets/toast/toast.dart';
export 'package:moon_design/src/widgets/tooltip/tooltip.dart';
Loading

0 comments on commit 32ec1c7

Please sign in to comment.