279 lines
7.4 KiB
Dart
Raw Normal View History

2021-12-07 23:01:23 +05:30
import 'package:easy_localization/easy_localization.dart';
2021-10-20 14:56:25 +08:00
import 'package:flowy_infra_ui/style_widget/text.dart';
import 'package:flowy_infra_ui/widget/buttons/primary_button.dart';
import 'package:flowy_infra_ui/widget/buttons/secondary_button.dart';
import 'package:flowy_infra_ui/widget/spacing.dart';
import 'package:flutter/material.dart';
import 'package:appflowy/startup/tasks/app_widget.dart';
2021-10-20 14:56:25 +08:00
import 'package:flowy_infra/size.dart';
import 'package:flowy_infra_ui/style_widget/text_input.dart';
import 'package:flowy_infra_ui/widget/dialog/styled_dialogs.dart';
export 'package:flowy_infra_ui/widget/dialog/styled_dialogs.dart';
import 'package:appflowy/generated/locale_keys.g.dart';
2021-10-20 14:56:25 +08:00
2022-09-15 16:05:55 +08:00
class NavigatorTextFieldDialog extends StatefulWidget {
const NavigatorTextFieldDialog({
super.key,
2021-10-20 14:56:25 +08:00
required this.title,
this.autoSelectAllText = false,
2021-10-23 20:32:39 +08:00
required this.value,
2021-10-20 14:56:25 +08:00
required this.confirm,
this.cancel,
this.maxLength,
});
final String value;
final String title;
final void Function()? cancel;
final void Function(String) confirm;
final bool autoSelectAllText;
final int? maxLength;
2021-10-20 14:56:25 +08:00
@override
State<NavigatorTextFieldDialog> createState() =>
_NavigatorTextFieldDialogState();
2021-10-20 14:56:25 +08:00
}
class _NavigatorTextFieldDialogState extends State<NavigatorTextFieldDialog> {
2021-10-23 20:32:39 +08:00
String newValue = "";
final controller = TextEditingController();
2021-10-20 14:56:25 +08:00
@override
void initState() {
super.initState();
2021-10-23 20:32:39 +08:00
newValue = widget.value;
controller.text = newValue;
if (widget.autoSelectAllText) {
controller.selection = TextSelection(
baseOffset: 0,
extentOffset: newValue.length,
);
}
}
@override
void dispose() {
controller.dispose();
super.dispose();
2021-10-20 14:56:25 +08:00
}
@override
Widget build(BuildContext context) {
return StyledDialog(
child: Column(
children: <Widget>[
FlowyText.medium(
widget.title,
color: Theme.of(context).colorScheme.tertiary,
fontSize: FontSizes.s16,
),
VSpace(Insets.m),
2021-10-20 14:56:25 +08:00
FlowyFormTextInput(
2021-12-07 23:01:23 +05:30
hintText: LocaleKeys.dialogCreatePageNameHint.tr(),
controller: controller,
textStyle: Theme.of(context)
.textTheme
.bodySmall
?.copyWith(fontSize: FontSizes.s16),
maxLength: widget.maxLength,
showCounter: false,
2021-10-23 20:32:39 +08:00
autoFocus: true,
2021-10-20 14:56:25 +08:00
onChanged: (text) {
2021-10-23 20:32:39 +08:00
newValue = text;
2021-10-20 14:56:25 +08:00
},
onEditingComplete: () {
widget.confirm(newValue);
AppGlobals.nav.pop();
},
2021-10-20 14:56:25 +08:00
),
VSpace(Insets.xl),
2021-10-24 18:54:41 +08:00
OkCancelButton(
onOkPressed: () {
widget.confirm(newValue);
2022-09-15 16:05:55 +08:00
Navigator.of(context).pop();
2021-10-24 18:54:41 +08:00
},
onCancelPressed: () {
if (widget.cancel != null) {
widget.cancel!();
}
2022-09-15 16:05:55 +08:00
Navigator.of(context).pop();
2021-10-24 18:54:41 +08:00
},
),
2021-10-20 14:56:25 +08:00
],
),
);
}
}
2022-09-15 16:05:55 +08:00
class NavigatorAlertDialog extends StatefulWidget {
const NavigatorAlertDialog({
super.key,
2022-09-15 16:05:55 +08:00
required this.title,
this.cancel,
this.confirm,
this.hideCancleButton = false,
});
2022-09-15 16:05:55 +08:00
final String title;
final void Function()? cancel;
final void Function()? confirm;
final bool hideCancleButton;
2022-09-15 16:05:55 +08:00
@override
State<NavigatorAlertDialog> createState() => _CreateFlowyAlertDialog();
2021-11-10 15:09:24 +08:00
}
2022-09-15 16:05:55 +08:00
class _CreateFlowyAlertDialog extends State<NavigatorAlertDialog> {
2021-11-10 15:09:24 +08:00
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return StyledDialog(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
...[
ConstrainedBox(
constraints: const BoxConstraints(
maxWidth: 400,
maxHeight: 260,
),
child: FlowyText.medium(
widget.title,
fontSize: FontSizes.s16,
feat: delete kanban board groups (#3925) * feat: hide/unhide ui * chore: implement collapsible side bar and adjust group header (#2) * refactor: hidden columns into own file * chore: adjust new group button position * fix: flowy icon buton secondary color bleed * chore: some UI adjustments * fix: some regressions * chore: proper group is_visible fetching * chore: use a bloc to manage hidden groups * fix: hiding groups not working * chore: implement hidden group popups * chore: proper ungrouped item column management * chore: remove ungrouped items button * chore: flowy hover build * fix: clean up code * test: integration tests * fix: not null promise on null value * fix: hide and unhide multiple groups * chore: i18n and code review * chore: missed review * fix: rust-lib-test * fix: dont completely remove flowyiconhovercolor * chore: apply suggest * fix: number of rows inside hidden groups not updating properly * fix: hidden groups disappearing after collapse * fix: hidden group title alignment * fix: insert newly unhidden groups into the correct position * chore: adjust padding all around * feat: reorder hidden groups * chore: adjust padding * chore: collapse hidden groups section persist * chore: no status group at beginning * fix: hiding groups when grouping with other types * chore: disable rename groups that arent supported * chore: update appflowy board ref * chore: better naming * feat: delete kanban groups * chore: forgot to save * chore: fix build and small ui adjustments * chore: add a confirm dialog when deleting a column * fix: flutter lint * test: add integration test * chore: fix some design review issues * chore: apply suggestions from Nathan * fix: write lock on group controller --------- Co-authored-by: Mathias Mogensen <mathias@appflowy.io>
2023-11-28 10:43:22 +08:00
textAlign: TextAlign.center,
color: Theme.of(context).colorScheme.tertiary,
maxLines: null,
),
),
2021-11-10 15:09:24 +08:00
],
if (widget.confirm != null) ...[
const VSpace(20),
OkCancelButton(
onOkPressed: () {
widget.confirm?.call();
Navigator.of(context).pop();
},
onCancelPressed: widget.hideCancleButton
? null
: () {
widget.cancel?.call();
Navigator.of(context).pop();
},
),
],
2021-11-10 15:09:24 +08:00
],
),
);
}
}
2022-09-15 16:05:55 +08:00
class NavigatorOkCancelDialog extends StatelessWidget {
const NavigatorOkCancelDialog({
super.key,
this.onOkPressed,
this.onCancelPressed,
this.okTitle,
this.cancelTitle,
this.title,
required this.message,
this.maxWidth,
});
2021-10-20 14:56:25 +08:00
final VoidCallback? onOkPressed;
final VoidCallback? onCancelPressed;
final String? okTitle;
final String? cancelTitle;
final String? title;
final String message;
final double? maxWidth;
2021-10-20 14:56:25 +08:00
@override
Widget build(BuildContext context) {
return StyledDialog(
maxWidth: maxWidth ?? 500,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
if (title != null) ...[
FlowyText.medium(
title!.toUpperCase(),
fontSize: FontSizes.s16,
),
2021-10-20 14:56:25 +08:00
VSpace(Insets.sm * 1.5),
Container(
color: Theme.of(context).colorScheme.surfaceVariant,
height: 1,
),
2021-10-20 14:56:25 +08:00
VSpace(Insets.m * 1.5),
],
FlowyText.medium(message),
2021-10-20 14:56:25 +08:00
SizedBox(height: Insets.l),
OkCancelButton(
2022-09-15 16:05:55 +08:00
onOkPressed: () {
onOkPressed?.call();
Navigator.of(context).pop();
},
onCancelPressed: () {
onCancelPressed?.call();
Navigator.of(context).pop();
},
2021-10-20 14:56:25 +08:00
okTitle: okTitle?.toUpperCase(),
cancelTitle: cancelTitle?.toUpperCase(),
),
2021-10-20 14:56:25 +08:00
],
),
);
}
}
class OkCancelButton extends StatelessWidget {
const OkCancelButton({
super.key,
this.onOkPressed,
this.onCancelPressed,
this.okTitle,
this.cancelTitle,
this.minHeight,
this.alignment = MainAxisAlignment.spaceAround,
this.mode = TextButtonMode.big,
});
2021-10-20 14:56:25 +08:00
final VoidCallback? onOkPressed;
final VoidCallback? onCancelPressed;
final String? okTitle;
final String? cancelTitle;
final double? minHeight;
final MainAxisAlignment alignment;
final TextButtonMode mode;
2021-10-20 14:56:25 +08:00
@override
Widget build(BuildContext context) {
2021-10-24 18:54:41 +08:00
return SizedBox(
height: 48,
child: Row(
mainAxisAlignment: alignment,
2021-10-24 18:54:41 +08:00
children: <Widget>[
if (onCancelPressed != null)
SecondaryTextButton(
cancelTitle ?? LocaleKeys.button_cancel.tr(),
2022-09-15 16:05:55 +08:00
onPressed: onCancelPressed,
mode: mode,
2021-10-24 18:54:41 +08:00
),
if (onCancelPressed != null) HSpace(Insets.m),
2021-10-24 18:54:41 +08:00
if (onOkPressed != null)
PrimaryTextButton(
okTitle ?? LocaleKeys.button_ok.tr(),
2022-09-15 16:05:55 +08:00
onPressed: onOkPressed,
mode: mode,
2021-10-24 18:54:41 +08:00
),
],
),
2021-10-20 14:56:25 +08:00
);
}
}