mirror of
https://github.com/AppFlowy-IO/AppFlowy.git
synced 2025-09-27 09:26:47 +00:00
feat: introduce popover widget
This commit is contained in:
parent
84b5762017
commit
ddc394fcd7
@ -65,14 +65,15 @@ class GridFieldCell extends StatelessWidget {
|
|||||||
final state = context.read<FieldCellBloc>().state;
|
final state = context.read<FieldCellBloc>().state;
|
||||||
final field = state.field;
|
final field = state.field;
|
||||||
|
|
||||||
FieldEditor(
|
FieldEditorPopOver.show(
|
||||||
|
context,
|
||||||
gridId: state.gridId,
|
gridId: state.gridId,
|
||||||
fieldName: field.name,
|
fieldName: field.name,
|
||||||
typeOptionLoader: FieldTypeOptionLoader(
|
typeOptionLoader: FieldTypeOptionLoader(
|
||||||
gridId: state.gridId,
|
gridId: state.gridId,
|
||||||
field: field,
|
field: field,
|
||||||
),
|
),
|
||||||
).show(context);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -49,24 +49,6 @@ class FieldEditor extends StatelessWidget with FlowyOverlayDelegate {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void show(
|
|
||||||
BuildContext context, {
|
|
||||||
AnchorDirection anchorDirection = AnchorDirection.bottomWithLeftAligned,
|
|
||||||
}) {
|
|
||||||
FlowyOverlay.of(context).remove(identifier());
|
|
||||||
FlowyOverlay.of(context).insertWithAnchor(
|
|
||||||
widget: OverlayContainer(
|
|
||||||
child: this,
|
|
||||||
constraints: BoxConstraints.loose(const Size(280, 400)),
|
|
||||||
),
|
|
||||||
identifier: identifier(),
|
|
||||||
anchorContext: context,
|
|
||||||
anchorDirection: anchorDirection,
|
|
||||||
style: FlowyOverlayStyle(blur: false),
|
|
||||||
delegate: this,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
static String identifier() {
|
static String identifier() {
|
||||||
return (FieldEditor).toString();
|
return (FieldEditor).toString();
|
||||||
}
|
}
|
||||||
@ -116,3 +98,47 @@ class _FieldNameCell extends StatelessWidget {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class FieldEditorPopOver extends StatelessWidget {
|
||||||
|
final String gridId;
|
||||||
|
final String fieldName;
|
||||||
|
|
||||||
|
final IFieldTypeOptionLoader typeOptionLoader;
|
||||||
|
const FieldEditorPopOver({
|
||||||
|
required this.gridId,
|
||||||
|
required this.fieldName,
|
||||||
|
required this.typeOptionLoader,
|
||||||
|
Key? key,
|
||||||
|
}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return FlowyPopover(
|
||||||
|
child: Container(
|
||||||
|
constraints: BoxConstraints.loose(const Size(280, 400)),
|
||||||
|
width: 280,
|
||||||
|
height: 400,
|
||||||
|
child: FieldEditor(
|
||||||
|
gridId: gridId,
|
||||||
|
fieldName: fieldName,
|
||||||
|
typeOptionLoader: typeOptionLoader,
|
||||||
|
key: key),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
static show(
|
||||||
|
BuildContext context, {
|
||||||
|
required String gridId,
|
||||||
|
required String fieldName,
|
||||||
|
required IFieldTypeOptionLoader typeOptionLoader,
|
||||||
|
Key? key,
|
||||||
|
}) {
|
||||||
|
FlowyPopover.show(context, builder: (BuildContext context) {
|
||||||
|
return FieldEditorPopOver(
|
||||||
|
gridId: gridId,
|
||||||
|
fieldName: fieldName,
|
||||||
|
typeOptionLoader: typeOptionLoader,
|
||||||
|
key: key);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -157,11 +157,12 @@ class CreateFieldButton extends StatelessWidget {
|
|||||||
return FlowyButton(
|
return FlowyButton(
|
||||||
text: const FlowyText.medium('New column', fontSize: 12),
|
text: const FlowyText.medium('New column', fontSize: 12),
|
||||||
hoverColor: theme.shader6,
|
hoverColor: theme.shader6,
|
||||||
onTap: () => FieldEditor(
|
onTap: () => FieldEditorPopOver.show(
|
||||||
|
context,
|
||||||
gridId: gridId,
|
gridId: gridId,
|
||||||
fieldName: "",
|
fieldName: "",
|
||||||
typeOptionLoader: NewFieldTypeOptionLoader(gridId: gridId),
|
typeOptionLoader: NewFieldTypeOptionLoader(gridId: gridId),
|
||||||
).show(context),
|
),
|
||||||
leftIcon: svgWidget("home/add"),
|
leftIcon: svgWidget("home/add"),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -169,14 +169,15 @@ class _RowDetailCell extends StatelessWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void _showFieldEditor(BuildContext context) {
|
void _showFieldEditor(BuildContext context) {
|
||||||
FieldEditor(
|
FieldEditorPopOver.show(
|
||||||
|
context,
|
||||||
gridId: cellId.gridId,
|
gridId: cellId.gridId,
|
||||||
fieldName: cellId.field.name,
|
fieldName: cellId.field.name,
|
||||||
typeOptionLoader: FieldTypeOptionLoader(
|
typeOptionLoader: FieldTypeOptionLoader(
|
||||||
gridId: cellId.gridId,
|
gridId: cellId.gridId,
|
||||||
field: cellId.field,
|
field: cellId.field,
|
||||||
),
|
),
|
||||||
).show(context);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -119,11 +119,12 @@ class _GridPropertyCell extends StatelessWidget {
|
|||||||
hoverColor: theme.hover,
|
hoverColor: theme.hover,
|
||||||
leftIcon: svgWidget(field.fieldType.iconName(), color: theme.iconColor),
|
leftIcon: svgWidget(field.fieldType.iconName(), color: theme.iconColor),
|
||||||
onTap: () {
|
onTap: () {
|
||||||
FieldEditor(
|
FieldEditorPopOver.show(
|
||||||
|
context,
|
||||||
gridId: gridId,
|
gridId: gridId,
|
||||||
fieldName: field.name,
|
fieldName: field.name,
|
||||||
typeOptionLoader: FieldTypeOptionLoader(gridId: gridId, field: field),
|
typeOptionLoader: FieldTypeOptionLoader(gridId: gridId, field: field),
|
||||||
).show(context, anchorDirection: AnchorDirection.bottomRight);
|
);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -9,3 +9,4 @@ export 'src/flowy_overlay/flowy_overlay.dart';
|
|||||||
export 'src/flowy_overlay/list_overlay.dart';
|
export 'src/flowy_overlay/list_overlay.dart';
|
||||||
export 'src/flowy_overlay/option_overlay.dart';
|
export 'src/flowy_overlay/option_overlay.dart';
|
||||||
export 'src/flowy_overlay/flowy_dialog.dart';
|
export 'src/flowy_overlay/flowy_dialog.dart';
|
||||||
|
export 'src/flowy_overlay/flowy_popover.dart';
|
||||||
|
@ -0,0 +1,27 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
const _overlayContainerPadding = EdgeInsets.all(12);
|
||||||
|
|
||||||
|
class FlowyPopover extends StatelessWidget {
|
||||||
|
final Widget child;
|
||||||
|
final ShapeBorder? shape;
|
||||||
|
|
||||||
|
FlowyPopover({Key? key, required this.child, this.shape}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return SimpleDialog(
|
||||||
|
shape: shape ??
|
||||||
|
RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)),
|
||||||
|
children: [Container(padding: _overlayContainerPadding, child: child)],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static show(
|
||||||
|
BuildContext context, {
|
||||||
|
required Widget Function(BuildContext context) builder,
|
||||||
|
}) {
|
||||||
|
showDialog(
|
||||||
|
barrierColor: Colors.transparent, context: context, builder: builder);
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user