Merge branch 'main' into main

This commit is contained in:
Lucas.Xu 2024-08-30 21:22:35 +08:00 committed by GitHub
commit cee0a04fe1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
52 changed files with 2753 additions and 387 deletions

View File

@ -1,15 +1,7 @@
import 'dart:io';
import 'package:appflowy/generated/flowy_svgs.g.dart';
import 'package:appflowy/generated/locale_keys.g.dart';
import 'package:appflowy/shared/window_title_bar.dart';
import 'package:appflowy/workspace/application/home/home_setting_bloc.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flowy_infra_ui/style_widget/hover.dart';
import 'package:flowy_infra_ui/widget/flowy_tooltip.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
class CocoaWindowChannel {
CocoaWindowChannel._();
@ -38,11 +30,9 @@ class MoveWindowDetector extends StatefulWidget {
const MoveWindowDetector({
super.key,
this.child,
this.showTitleBar = false,
});
final Widget? child;
final bool showTitleBar;
@override
MoveWindowDetectorState createState() => MoveWindowDetectorState();
@ -54,28 +44,10 @@ class MoveWindowDetectorState extends State<MoveWindowDetector> {
@override
Widget build(BuildContext context) {
if (!Platform.isMacOS && !Platform.isWindows) {
if (!Platform.isMacOS) {
return widget.child ?? const SizedBox.shrink();
}
if (Platform.isWindows) {
return Column(
mainAxisSize: MainAxisSize.min,
children: [
if (widget.showTitleBar) ...[
WindowTitleBar(
leftChildren: [
_buildToggleMenuButton(context),
],
),
] else ...[
const SizedBox(height: 5),
],
widget.child ?? const SizedBox.shrink(),
],
);
}
return GestureDetector(
// https://stackoverflow.com/questions/52965799/flutter-gesturedetector-not-working-with-containers-in-stack
behavior: HitTestBehavior.translucent,
@ -96,45 +68,4 @@ class MoveWindowDetectorState extends State<MoveWindowDetector> {
child: widget.child,
);
}
Widget _buildToggleMenuButton(BuildContext context) {
if (!context.read<HomeSettingBloc>().state.isMenuCollapsed) {
return const SizedBox.shrink();
}
final textSpan = TextSpan(
children: [
TextSpan(
text: '${LocaleKeys.sideBar_openSidebar.tr()}\n',
style: context.tooltipTextStyle(),
),
TextSpan(
text: Platform.isMacOS ? '⌘+.' : 'Ctrl+\\',
style: context
.tooltipTextStyle()
?.copyWith(color: Theme.of(context).hintColor),
),
],
);
return FlowyTooltip(
richMessage: textSpan,
child: Listener(
behavior: HitTestBehavior.translucent,
onPointerDown: (_) => context
.read<HomeSettingBloc>()
.add(const HomeSettingEvent.collapseMenu()),
child: FlowyHover(
child: Container(
width: 24,
padding: const EdgeInsets.all(4),
child: const RotatedBox(
quarterTurns: 2,
child: FlowySvg(FlowySvgs.hide_menu_s),
),
),
),
),
);
}
}

View File

@ -64,11 +64,7 @@ class MobileHomeTrashPage extends StatelessWidget {
],
),
body: state.objects.isEmpty
? FlowyMobileStateContainer.info(
emoji: '🗑️',
title: LocaleKeys.trash_mobile_empty.tr(),
description: LocaleKeys.trash_mobile_emptyDescription.tr(),
)
? const _EmptyTrashBin()
: _DeletedFilesListView(state),
);
},
@ -82,6 +78,41 @@ enum _TrashActionType {
deleteAll,
}
class _EmptyTrashBin extends StatelessWidget {
const _EmptyTrashBin();
@override
Widget build(BuildContext context) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const FlowySvg(
FlowySvgs.m_empty_trash_xl,
size: Size.square(46),
),
const VSpace(16.0),
FlowyText.medium(
LocaleKeys.trash_mobile_empty.tr(),
fontSize: 18.0,
textAlign: TextAlign.center,
),
const VSpace(8.0),
FlowyText.regular(
LocaleKeys.trash_mobile_emptyDescription.tr(),
fontSize: 17.0,
maxLines: 10,
textAlign: TextAlign.center,
lineHeight: 1.3,
color: Theme.of(context).hintColor,
),
const VSpace(kBottomNavigationBarHeight + 36.0),
],
),
);
}
}
class _TrashActionAllButton extends StatelessWidget {
/// Switch between 'delete all' and 'restore all' feature
const _TrashActionAllButton({

View File

@ -22,6 +22,7 @@ class HomePageSettingsPopupMenu extends StatelessWidget {
@override
Widget build(BuildContext context) {
return PopupMenuButton<_MobileSettingsPopupMenuItem>(
offset: const Offset(0, 36),
padding: EdgeInsets.zero,
@ -32,13 +33,7 @@ class HomePageSettingsPopupMenu extends StatelessWidget {
),
shadowColor: const Color(0x68000000),
elevation: 10,
color: Theme.of(context).colorScheme.surface,
child: const Padding(
padding: EdgeInsets.all(8.0),
child: FlowySvg(
FlowySvgs.m_settings_more_s,
),
),
color: context.popupMenuBackgroundColor,
itemBuilder: (BuildContext context) =>
<PopupMenuEntry<_MobileSettingsPopupMenuItem>>[
_buildItem(
@ -81,6 +76,12 @@ class HomePageSettingsPopupMenu extends StatelessWidget {
break;
}
},
child: const Padding(
padding: EdgeInsets.all(8.0),
child: FlowySvg(
FlowySvgs.m_settings_more_s,
),
),
);
}

View File

@ -6,7 +6,10 @@ import 'package:flowy_infra_ui/flowy_infra_ui.dart';
import 'package:flutter/material.dart';
class EmptySpacePlaceholder extends StatelessWidget {
const EmptySpacePlaceholder({super.key, required this.type});
const EmptySpacePlaceholder({
super.key,
required this.type,
});
final MobilePageCardType type;

View File

@ -1,9 +1,11 @@
import 'dart:io';
import 'dart:ui';
import 'package:appflowy/generated/flowy_svgs.g.dart';
import 'package:appflowy/generated/locale_keys.g.dart';
import 'package:appflowy/mobile/presentation/notifications/mobile_notifications_screen.dart';
import 'package:appflowy/mobile/presentation/widgets/navigation_bar_button.dart';
import 'package:appflowy/shared/popup_menu/appflowy_popup_menu.dart';
import 'package:appflowy/shared/red_dot.dart';
import 'package:appflowy/startup/startup.dart';
import 'package:appflowy/user/application/reminder/reminder_bloc.dart';
@ -193,6 +195,8 @@ class _HomePageNavigationBar extends StatelessWidget {
border: context.border,
color: context.backgroundColor,
),
child: Theme(
data: _getThemeData(context),
child: BottomNavigationBar(
showSelectedLabels: false,
showUnselectedLabels: false,
@ -206,12 +210,29 @@ class _HomePageNavigationBar extends StatelessWidget {
),
),
),
),
);
}
ThemeData _getThemeData(BuildContext context) {
if (Platform.isAndroid) {
return Theme.of(context);
}
// hide the splash effect for iOS
return Theme.of(context).copyWith(
splashFactory: NoSplash.splashFactory,
splashColor: Colors.transparent,
highlightColor: Colors.transparent,
);
}
/// Navigate to the current location of the branch at the provided index when
/// tapping an item in the BottomNavigationBar.
void _onTap(BuildContext context, int bottomBarIndex) {
// close the popup menu
closePopupMenu();
final label = _items[bottomBarIndex].label;
if (label == _addLabel) {
// show an add dialog

View File

@ -36,12 +36,7 @@ class NotificationSettingsPopupMenu extends StatelessWidget {
// todo: replace it with shadows
shadowColor: const Color(0x68000000),
elevation: 10,
child: const Padding(
padding: EdgeInsets.all(8.0),
child: FlowySvg(
FlowySvgs.m_settings_more_s,
),
),
color: context.popupMenuBackgroundColor,
itemBuilder: (BuildContext context) =>
<PopupMenuEntry<_NotificationSettingsPopupMenuItem>>[
_buildItem(
@ -87,6 +82,12 @@ class NotificationSettingsPopupMenu extends StatelessWidget {
break;
}
},
child: const Padding(
padding: EdgeInsets.all(8.0),
child: FlowySvg(
FlowySvgs.m_settings_more_s,
),
),
);
}

View File

@ -245,12 +245,12 @@ class _MobileToolbarState extends State<_MobileToolbar>
children: [
const Divider(
height: 0.5,
color: Color(0xFFEDEDED),
color: Color(0x7FEDEDED),
),
_buildToolbar(context),
const Divider(
height: 0.5,
color: Color(0xFFEDEDED),
color: Color(0x7FEDEDED),
),
_buildMenuOrSpacer(context),
],

View File

@ -264,7 +264,13 @@ final referencedDocSlashMenuItem = SelectionMenuItem(
isSelected: isSelected,
style: style,
),
keywords: ['page', 'notes', 'referenced page', 'referenced document'],
keywords: [
'page',
'notes',
'referenced page',
'referenced document',
'link to page',
],
handler: (editorState, menuService, context) => showLinkToPageMenu(
editorState,
menuService,

View File

@ -33,6 +33,12 @@ const double _kMenuVerticalPadding = 8.0;
const double _kMenuWidthStep = 56.0;
const double _kMenuScreenPadding = 8.0;
GlobalKey<_PopupMenuState>? _kPopupMenuKey;
void closePopupMenu() {
_kPopupMenuKey?.currentState?.dismiss();
_kPopupMenuKey = null;
}
/// A base class for entries in a Material Design popup menu.
///
/// The popup menu widget uses this interface to interact with the menu items.
@ -569,7 +575,7 @@ class _CheckedPopupMenuItemState<T>
}
}
class _PopupMenu<T> extends StatelessWidget {
class _PopupMenu<T> extends StatefulWidget {
const _PopupMenu({
super.key,
required this.itemKeys,
@ -585,10 +591,15 @@ class _PopupMenu<T> extends StatelessWidget {
final BoxConstraints? constraints;
final Clip clipBehavior;
@override
State<_PopupMenu<T>> createState() => _PopupMenuState<T>();
}
class _PopupMenuState<T> extends State<_PopupMenu<T>> {
@override
Widget build(BuildContext context) {
final double unit = 1.0 /
(route.items.length +
(widget.route.items.length +
1.5); // 1.0 for the width and 0.5 for the last item's fade.
final List<Widget> children = <Widget>[];
final ThemeData theme = Theme.of(context);
@ -597,16 +608,16 @@ class _PopupMenu<T> extends StatelessWidget {
? _PopupMenuDefaultsM3(context)
: _PopupMenuDefaultsM2(context);
for (int i = 0; i < route.items.length; i += 1) {
for (int i = 0; i < widget.route.items.length; i += 1) {
final double start = (i + 1) * unit;
final double end = clampDouble(start + 1.5 * unit, 0.0, 1.0);
final CurvedAnimation opacity = CurvedAnimation(
parent: route.animation!,
parent: widget.route.animation!,
curve: Interval(start, end),
);
Widget item = route.items[i];
if (route.initialValue != null &&
route.items[i].represents(route.initialValue)) {
Widget item = widget.route.items[i];
if (widget.route.initialValue != null &&
widget.route.items[i].represents(widget.route.initialValue)) {
item = ColoredBox(
color: Theme.of(context).highlightColor,
child: item,
@ -615,10 +626,10 @@ class _PopupMenu<T> extends StatelessWidget {
children.add(
_MenuItem(
onLayout: (Size size) {
route.itemSizes[i] = size;
widget.route.itemSizes[i] = size;
},
child: FadeTransition(
key: itemKeys[i],
key: widget.itemKeys[i],
opacity: opacity,
child: item,
),
@ -630,10 +641,10 @@ class _PopupMenu<T> extends StatelessWidget {
CurveTween(curve: const Interval(0.0, 1.0 / 3.0));
final CurveTween width = CurveTween(curve: Interval(0.0, unit));
final CurveTween height =
CurveTween(curve: Interval(0.0, unit * route.items.length));
CurveTween(curve: Interval(0.0, unit * widget.route.items.length));
final Widget child = ConstrainedBox(
constraints: constraints ??
constraints: widget.constraints ??
const BoxConstraints(
minWidth: _kMenuMinWidth,
maxWidth: _kMenuMaxWidth,
@ -644,7 +655,7 @@ class _PopupMenu<T> extends StatelessWidget {
scopesRoute: true,
namesRoute: true,
explicitChildNodes: true,
label: semanticLabel,
label: widget.semanticLabel,
child: SingleChildScrollView(
padding: const EdgeInsets.symmetric(
vertical: _kMenuVerticalPadding,
@ -656,28 +667,28 @@ class _PopupMenu<T> extends StatelessWidget {
);
return AnimatedBuilder(
animation: route.animation!,
animation: widget.route.animation!,
builder: (BuildContext context, Widget? child) {
return FadeTransition(
opacity: opacity.animate(route.animation!),
opacity: opacity.animate(widget.route.animation!),
child: Material(
shape: route.shape ?? popupMenuTheme.shape ?? defaults.shape,
color: route.color ?? popupMenuTheme.color ?? defaults.color,
clipBehavior: clipBehavior,
shape: widget.route.shape ?? popupMenuTheme.shape ?? defaults.shape,
color: widget.route.color ?? popupMenuTheme.color ?? defaults.color,
clipBehavior: widget.clipBehavior,
type: MaterialType.card,
elevation: route.elevation ??
elevation: widget.route.elevation ??
popupMenuTheme.elevation ??
defaults.elevation!,
shadowColor: route.shadowColor ??
shadowColor: widget.route.shadowColor ??
popupMenuTheme.shadowColor ??
defaults.shadowColor,
surfaceTintColor: route.surfaceTintColor ??
surfaceTintColor: widget.route.surfaceTintColor ??
popupMenuTheme.surfaceTintColor ??
defaults.surfaceTintColor,
child: Align(
alignment: AlignmentDirectional.topEnd,
widthFactor: width.evaluate(route.animation!),
heightFactor: height.evaluate(route.animation!),
widthFactor: width.evaluate(widget.route.animation!),
heightFactor: height.evaluate(widget.route.animation!),
child: child,
),
),
@ -686,6 +697,21 @@ class _PopupMenu<T> extends StatelessWidget {
child: child,
);
}
@override
void dispose() {
_kPopupMenuKey = null;
super.dispose();
}
void dismiss() {
if (_kPopupMenuKey == null) {
return;
}
Navigator.of(context).pop();
_kPopupMenuKey = null;
}
}
// Positioning of the menu on the screen.
@ -937,7 +963,9 @@ class _PopupMenuRoute<T> extends PopupRoute<T> {
scrollTo(selectedItemIndex);
}
_kPopupMenuKey ??= GlobalKey<_PopupMenuState>();
final Widget menu = _PopupMenu<T>(
key: _kPopupMenuKey,
route: this,
itemKeys: itemKeys,
semanticLabel: semanticLabel,
@ -1526,7 +1554,7 @@ class PopupMenuButtonState<T> extends State<PopupMenuButton<T>> {
if (widget.child != null) {
return AnimatedGestureDetector(
scaleFactor: 0.99,
scaleFactor: 0.95,
onTapUp: widget.enabled ? showButtonMenu : null,
child: widget.child!,
);
@ -1607,3 +1635,12 @@ class _PopupMenuDefaultsM3 extends PopupMenuThemeData {
const EdgeInsets.symmetric(horizontal: 12.0);
}
// END GENERATED TOKEN PROPERTIES - PopupMenu
extension PopupMenuColors on BuildContext {
Color get popupMenuBackgroundColor {
if (Theme.of(this).brightness == Brightness.light) {
return Theme.of(this).colorScheme.surface;
}
return const Color(0xFF23262B);
}
}

View File

@ -1,11 +1,11 @@
import 'package:appflowy_backend/protobuf/flowy-user/date_time.pbenum.dart';
import 'package:easy_localization/easy_localization.dart';
const _localFmt = 'M/d/y';
const _usFmt = 'y/M/d';
const _isoFmt = 'y-M-d';
const _friendlyFmt = 'MMM d, y';
const _dmyFmt = 'd/M/y';
const _localFmt = 'MM/dd/y';
const _usFmt = 'y/MM/dd';
const _isoFmt = 'y-MM-dd';
const _friendlyFmt = 'MMM dd, y';
const _dmyFmt = 'dd/MM/y';
extension DateFormatter on UserDateFormatPB {
DateFormat get toFormat => DateFormat(_toFormat[this] ?? _friendlyFmt);

View File

@ -1,8 +1,16 @@
import 'package:appflowy_backend/protobuf/flowy-user/user_profile.pb.dart';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
import 'package:appflowy/core/frameless_window.dart';
import 'package:appflowy/generated/flowy_svgs.g.dart';
import 'package:appflowy/generated/locale_keys.g.dart';
import 'package:appflowy/plugins/blank/blank.dart';
import 'package:appflowy/shared/window_title_bar.dart';
import 'package:appflowy/startup/plugin/plugin.dart';
import 'package:appflowy/startup/startup.dart';
import 'package:appflowy/workspace/application/home/home_setting_bloc.dart';
import 'package:appflowy/workspace/application/tabs/tabs_bloc.dart';
import 'package:appflowy/workspace/presentation/home/home_sizes.dart';
import 'package:appflowy/workspace/presentation/home/navigation.dart';
@ -10,9 +18,10 @@ import 'package:appflowy/workspace/presentation/home/tabs/tabs_manager.dart';
import 'package:appflowy/workspace/presentation/home/toast.dart';
import 'package:appflowy_backend/dispatch/dispatch.dart';
import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-user/user_profile.pb.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
import 'package:flowy_infra_ui/style_widget/hover.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:provider/provider.dart';
import 'package:time/time.dart';
@ -47,6 +56,17 @@ class HomeStack extends StatelessWidget {
builder: (context, state) {
return Column(
children: [
if (Platform.isWindows)
Column(
mainAxisSize: MainAxisSize.min,
children: [
WindowTitleBar(
leftChildren: [
_buildToggleMenuButton(context),
],
),
],
),
Padding(
padding: EdgeInsets.only(left: layout.menuSpacing),
child: TabsManager(pageController: pageController),
@ -73,6 +93,47 @@ class HomeStack extends StatelessWidget {
),
);
}
Widget _buildToggleMenuButton(BuildContext context) {
if (!context.read<HomeSettingBloc>().state.isMenuCollapsed) {
return const SizedBox.shrink();
}
final textSpan = TextSpan(
children: [
TextSpan(
text: '${LocaleKeys.sideBar_openSidebar.tr()}\n',
style: context.tooltipTextStyle(),
),
TextSpan(
text: Platform.isMacOS ? '⌘+.' : 'Ctrl+\\',
style: context
.tooltipTextStyle()
?.copyWith(color: Theme.of(context).hintColor),
),
],
);
return FlowyTooltip(
richMessage: textSpan,
child: Listener(
behavior: HitTestBehavior.translucent,
onPointerDown: (_) => context
.read<HomeSettingBloc>()
.add(const HomeSettingEvent.collapseMenu()),
child: FlowyHover(
child: Container(
width: 24,
padding: const EdgeInsets.all(4),
child: const RotatedBox(
quarterTurns: 2,
child: FlowySvg(FlowySvgs.hide_menu_s),
),
),
),
),
);
}
}
class PageStack extends StatefulWidget {
@ -230,7 +291,6 @@ class PageManager {
child: Selector<PageNotifier, Widget>(
selector: (context, notifier) => notifier.titleWidget,
builder: (_, __, child) => MoveWindowDetector(
showTitleBar: true,
child: HomeTopBar(layout: layout),
),
),

View File

@ -9,6 +9,7 @@ import 'package:appflowy/workspace/presentation/home/menu/menu_shared_state.dart
import 'package:appflowy/workspace/presentation/home/menu/sidebar/footer/sidebar_toast.dart';
import 'package:appflowy/workspace/presentation/settings/widgets/setting_appflowy_cloud.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flowy_infra/theme_extension.dart';
import 'package:flutter/material.dart';
import 'sidebar_footer_button.dart';
@ -26,9 +27,24 @@ class SidebarFooter extends StatelessWidget {
return const SidebarToast();
},
),
const SidebarTemplateButton(),
const SidebarTrashButton(),
Row(
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const Expanded(child: SidebarTemplateButton()),
_buildVerticalDivider(context),
const Expanded(child: SidebarTrashButton()),
],
),
],
);
}
Widget _buildVerticalDivider(BuildContext context) {
return Container(
width: 1.0,
height: 14,
margin: const EdgeInsets.symmetric(horizontal: 4),
color: AFThemeExtension.of(context).borderColor,
);
}
}
@ -39,13 +55,10 @@ class SidebarTemplateButton extends StatelessWidget {
@override
Widget build(BuildContext context) {
return SidebarFooterButton(
leftIconSize: const Size.square(24.0),
leftIcon: const Padding(
padding: EdgeInsets.all(2.0),
child: FlowySvg(
leftIconSize: const Size.square(18.0),
leftIcon: const FlowySvg(
FlowySvgs.icon_template_s,
),
),
text: LocaleKeys.template_label.tr(),
onTap: () => afLaunchUrlString('https://appflowy.io/templates'),
);
@ -61,9 +74,9 @@ class SidebarTrashButton extends StatelessWidget {
valueListenable: getIt<MenuSharedState>().notifier,
builder: (context, value, child) {
return SidebarFooterButton(
leftIconSize: const Size.square(24.0),
leftIconSize: const Size.square(18.0),
leftIcon: const FlowySvg(
FlowySvgs.sidebar_footer_trash_m,
FlowySvgs.icon_delete_s,
),
text: LocaleKeys.trash_text.tr(),
onTap: () {

View File

@ -26,11 +26,15 @@ class SidebarFooterButton extends StatelessWidget {
child: FlowyButton(
leftIcon: leftIcon,
leftIconSize: leftIconSize,
iconPadding: 8.0,
margin: const EdgeInsets.all(4.0),
text: FlowyText.regular(
expandText: false,
text: Padding(
padding: const EdgeInsets.only(right: 6.0),
child: FlowyText(
text,
lineHeight: 1.15,
fontWeight: FontWeight.w400,
figmaLineHeight: 18.0,
),
),
onTap: onTap,
),

View File

@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:appflowy/workspace/application/tabs/tabs_bloc.dart';
import 'package:appflowy/workspace/presentation/home/af_focus_manager.dart';
import 'package:appflowy/workspace/presentation/home/home_sizes.dart';
import 'package:appflowy/workspace/presentation/home/tabs/flowy_tab.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
@ -74,8 +75,10 @@ class _TabsManagerState extends State<TabsManager>
dividerColor: Colors.transparent,
isScrollable: true,
controller: _controller,
onTap: (newIndex) =>
context.read<TabsBloc>().add(TabsEvent.selectTab(newIndex)),
onTap: (newIndex) {
AFFocusManager.of(context).notifyLoseFocus();
context.read<TabsBloc>().add(TabsEvent.selectTab(newIndex));
},
tabs: state.pageManagers
.map(
(pm) => FlowyTab(

View File

@ -668,6 +668,9 @@ final _planLabels = [
label: LocaleKeys.settings_comparePlanDialog_planLabels_itemSix.tr(),
tooltip: LocaleKeys.settings_comparePlanDialog_planLabels_tooltipSix.tr(),
),
_PlanItem(
label: LocaleKeys.settings_comparePlanDialog_planLabels_itemFileUpload.tr(),
),
];
class _CellItem {
@ -703,6 +706,9 @@ final List<_CellItem> _freeLabels = [
_CellItem(
label: LocaleKeys.settings_comparePlanDialog_freeLabels_itemSix.tr(),
),
_CellItem(
label: LocaleKeys.settings_comparePlanDialog_freeLabels_itemFileUpload.tr(),
),
];
final List<_CellItem> _proLabels = [
@ -731,4 +737,7 @@ final List<_CellItem> _proLabels = [
_CellItem(
label: LocaleKeys.settings_comparePlanDialog_proLabels_itemSix.tr(),
),
_CellItem(
label: LocaleKeys.settings_comparePlanDialog_proLabels_itemFileUpload.tr(),
),
];

View File

@ -1,5 +1,7 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:appflowy/generated/flowy_svgs.g.dart';
import 'package:appflowy/generated/locale_keys.g.dart';
import 'package:appflowy/plugins/document/application/document_appearance_cubit.dart';
@ -43,7 +45,6 @@ import 'package:flowy_infra/theme.dart';
import 'package:flowy_infra/theme_extension.dart';
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
import 'package:flowy_infra_ui/style_widget/hover.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:google_fonts/google_fonts.dart';

View File

@ -172,7 +172,7 @@ checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da"
[[package]]
name = "app-error"
version = "0.1.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=c9504d4081a8d9893830dc6598429353b078271b#c9504d4081a8d9893830dc6598429353b078271b"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=52782033948b7d243693ca159ea519d53458c8a6#52782033948b7d243693ca159ea519d53458c8a6"
dependencies = [
"anyhow",
"bincode",
@ -192,7 +192,7 @@ dependencies = [
[[package]]
name = "appflowy-ai-client"
version = "0.1.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=c9504d4081a8d9893830dc6598429353b078271b#c9504d4081a8d9893830dc6598429353b078271b"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=52782033948b7d243693ca159ea519d53458c8a6#52782033948b7d243693ca159ea519d53458c8a6"
dependencies = [
"anyhow",
"bytes",
@ -837,7 +837,7 @@ dependencies = [
[[package]]
name = "client-api"
version = "0.2.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=c9504d4081a8d9893830dc6598429353b078271b#c9504d4081a8d9893830dc6598429353b078271b"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=52782033948b7d243693ca159ea519d53458c8a6#52782033948b7d243693ca159ea519d53458c8a6"
dependencies = [
"again",
"anyhow",
@ -888,7 +888,7 @@ dependencies = [
[[package]]
name = "client-api-entity"
version = "0.1.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=c9504d4081a8d9893830dc6598429353b078271b#c9504d4081a8d9893830dc6598429353b078271b"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=52782033948b7d243693ca159ea519d53458c8a6#52782033948b7d243693ca159ea519d53458c8a6"
dependencies = [
"collab-entity",
"collab-rt-entity",
@ -901,7 +901,7 @@ dependencies = [
[[package]]
name = "client-websocket"
version = "0.1.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=c9504d4081a8d9893830dc6598429353b078271b#c9504d4081a8d9893830dc6598429353b078271b"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=52782033948b7d243693ca159ea519d53458c8a6#52782033948b7d243693ca159ea519d53458c8a6"
dependencies = [
"futures-channel",
"futures-util",
@ -975,7 +975,7 @@ dependencies = [
[[package]]
name = "collab"
version = "0.2.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=49cf2206d7494bb3006402b807e7f171905213e3#49cf2206d7494bb3006402b807e7f171905213e3"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac#47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac"
dependencies = [
"anyhow",
"arc-swap",
@ -1000,7 +1000,7 @@ dependencies = [
[[package]]
name = "collab-database"
version = "0.2.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=49cf2206d7494bb3006402b807e7f171905213e3#49cf2206d7494bb3006402b807e7f171905213e3"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac#47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac"
dependencies = [
"anyhow",
"async-trait",
@ -1029,7 +1029,7 @@ dependencies = [
[[package]]
name = "collab-document"
version = "0.2.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=49cf2206d7494bb3006402b807e7f171905213e3#49cf2206d7494bb3006402b807e7f171905213e3"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac#47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac"
dependencies = [
"anyhow",
"arc-swap",
@ -1049,7 +1049,7 @@ dependencies = [
[[package]]
name = "collab-entity"
version = "0.2.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=49cf2206d7494bb3006402b807e7f171905213e3#49cf2206d7494bb3006402b807e7f171905213e3"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac#47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac"
dependencies = [
"anyhow",
"bytes",
@ -1068,7 +1068,7 @@ dependencies = [
[[package]]
name = "collab-folder"
version = "0.2.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=49cf2206d7494bb3006402b807e7f171905213e3#49cf2206d7494bb3006402b807e7f171905213e3"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac#47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac"
dependencies = [
"anyhow",
"arc-swap",
@ -1111,7 +1111,7 @@ dependencies = [
[[package]]
name = "collab-plugins"
version = "0.2.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=49cf2206d7494bb3006402b807e7f171905213e3#49cf2206d7494bb3006402b807e7f171905213e3"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac#47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac"
dependencies = [
"anyhow",
"async-stream",
@ -1149,7 +1149,7 @@ dependencies = [
[[package]]
name = "collab-rt-entity"
version = "0.1.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=c9504d4081a8d9893830dc6598429353b078271b#c9504d4081a8d9893830dc6598429353b078271b"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=52782033948b7d243693ca159ea519d53458c8a6#52782033948b7d243693ca159ea519d53458c8a6"
dependencies = [
"anyhow",
"bincode",
@ -1174,7 +1174,7 @@ dependencies = [
[[package]]
name = "collab-rt-protocol"
version = "0.1.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=c9504d4081a8d9893830dc6598429353b078271b#c9504d4081a8d9893830dc6598429353b078271b"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=52782033948b7d243693ca159ea519d53458c8a6#52782033948b7d243693ca159ea519d53458c8a6"
dependencies = [
"anyhow",
"async-trait",
@ -1191,7 +1191,7 @@ dependencies = [
[[package]]
name = "collab-user"
version = "0.2.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=49cf2206d7494bb3006402b807e7f171905213e3#49cf2206d7494bb3006402b807e7f171905213e3"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac#47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac"
dependencies = [
"anyhow",
"collab",
@ -1446,7 +1446,7 @@ dependencies = [
"cssparser-macros",
"dtoa-short",
"itoa 1.0.6",
"phf 0.8.0",
"phf 0.11.2",
"smallvec",
]
@ -1571,7 +1571,7 @@ checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308"
[[package]]
name = "database-entity"
version = "0.1.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=c9504d4081a8d9893830dc6598429353b078271b#c9504d4081a8d9893830dc6598429353b078271b"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=52782033948b7d243693ca159ea519d53458c8a6#52782033948b7d243693ca159ea519d53458c8a6"
dependencies = [
"anyhow",
"app-error",
@ -3117,7 +3117,7 @@ dependencies = [
[[package]]
name = "gotrue"
version = "0.1.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=c9504d4081a8d9893830dc6598429353b078271b#c9504d4081a8d9893830dc6598429353b078271b"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=52782033948b7d243693ca159ea519d53458c8a6#52782033948b7d243693ca159ea519d53458c8a6"
dependencies = [
"anyhow",
"futures-util",
@ -3134,7 +3134,7 @@ dependencies = [
[[package]]
name = "gotrue-entity"
version = "0.1.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=c9504d4081a8d9893830dc6598429353b078271b#c9504d4081a8d9893830dc6598429353b078271b"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=52782033948b7d243693ca159ea519d53458c8a6#52782033948b7d243693ca159ea519d53458c8a6"
dependencies = [
"anyhow",
"app-error",
@ -3566,7 +3566,7 @@ dependencies = [
[[package]]
name = "infra"
version = "0.1.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=c9504d4081a8d9893830dc6598429353b078271b#c9504d4081a8d9893830dc6598429353b078271b"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=52782033948b7d243693ca159ea519d53458c8a6#52782033948b7d243693ca159ea519d53458c8a6"
dependencies = [
"anyhow",
"bytes",
@ -6169,7 +6169,7 @@ dependencies = [
[[package]]
name = "shared-entity"
version = "0.1.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=c9504d4081a8d9893830dc6598429353b078271b#c9504d4081a8d9893830dc6598429353b078271b"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=52782033948b7d243693ca159ea519d53458c8a6#52782033948b7d243693ca159ea519d53458c8a6"
dependencies = [
"anyhow",
"app-error",

View File

@ -53,7 +53,7 @@ collab-user = { version = "0.2" }
# Run the script:
# scripts/tool/update_client_api_rev.sh new_rev_id
# ⚠️⚠️⚠️️
client-api = { git = "https://github.com/AppFlowy-IO/AppFlowy-Cloud", rev = "c9504d4081a8d9893830dc6598429353b078271b" }
client-api = { git = "https://github.com/AppFlowy-IO/AppFlowy-Cloud", rev = "52782033948b7d243693ca159ea519d53458c8a6" }
[dependencies]
serde_json.workspace = true
@ -116,13 +116,13 @@ custom-protocol = ["tauri/custom-protocol"]
# To switch to the local path, run:
# scripts/tool/update_collab_source.sh
# ⚠️⚠️⚠️️
collab = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "49cf2206d7494bb3006402b807e7f171905213e3" }
collab-entity = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "49cf2206d7494bb3006402b807e7f171905213e3" }
collab-folder = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "49cf2206d7494bb3006402b807e7f171905213e3" }
collab-document = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "49cf2206d7494bb3006402b807e7f171905213e3" }
collab-database = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "49cf2206d7494bb3006402b807e7f171905213e3" }
collab-plugins = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "49cf2206d7494bb3006402b807e7f171905213e3" }
collab-user = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "49cf2206d7494bb3006402b807e7f171905213e3" }
collab = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac" }
collab-entity = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac" }
collab-folder = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac" }
collab-document = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac" }
collab-database = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac" }
collab-plugins = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac" }
collab-user = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac" }
# Working directory: frontend
# To update the commit ID, run:

View File

@ -163,7 +163,7 @@ checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da"
[[package]]
name = "app-error"
version = "0.1.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=c9504d4081a8d9893830dc6598429353b078271b#c9504d4081a8d9893830dc6598429353b078271b"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=52782033948b7d243693ca159ea519d53458c8a6#52782033948b7d243693ca159ea519d53458c8a6"
dependencies = [
"anyhow",
"bincode",
@ -183,7 +183,7 @@ dependencies = [
[[package]]
name = "appflowy-ai-client"
version = "0.1.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=c9504d4081a8d9893830dc6598429353b078271b#c9504d4081a8d9893830dc6598429353b078271b"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=52782033948b7d243693ca159ea519d53458c8a6#52782033948b7d243693ca159ea519d53458c8a6"
dependencies = [
"anyhow",
"bytes",
@ -811,7 +811,7 @@ dependencies = [
[[package]]
name = "client-api"
version = "0.2.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=c9504d4081a8d9893830dc6598429353b078271b#c9504d4081a8d9893830dc6598429353b078271b"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=52782033948b7d243693ca159ea519d53458c8a6#52782033948b7d243693ca159ea519d53458c8a6"
dependencies = [
"again",
"anyhow",
@ -862,7 +862,7 @@ dependencies = [
[[package]]
name = "client-api-entity"
version = "0.1.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=c9504d4081a8d9893830dc6598429353b078271b#c9504d4081a8d9893830dc6598429353b078271b"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=52782033948b7d243693ca159ea519d53458c8a6#52782033948b7d243693ca159ea519d53458c8a6"
dependencies = [
"collab-entity",
"collab-rt-entity",
@ -875,7 +875,7 @@ dependencies = [
[[package]]
name = "client-websocket"
version = "0.1.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=c9504d4081a8d9893830dc6598429353b078271b#c9504d4081a8d9893830dc6598429353b078271b"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=52782033948b7d243693ca159ea519d53458c8a6#52782033948b7d243693ca159ea519d53458c8a6"
dependencies = [
"futures-channel",
"futures-util",
@ -958,7 +958,7 @@ dependencies = [
[[package]]
name = "collab"
version = "0.2.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=49cf2206d7494bb3006402b807e7f171905213e3#49cf2206d7494bb3006402b807e7f171905213e3"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac#47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac"
dependencies = [
"anyhow",
"arc-swap",
@ -983,7 +983,7 @@ dependencies = [
[[package]]
name = "collab-database"
version = "0.2.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=49cf2206d7494bb3006402b807e7f171905213e3#49cf2206d7494bb3006402b807e7f171905213e3"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac#47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac"
dependencies = [
"anyhow",
"async-trait",
@ -1012,7 +1012,7 @@ dependencies = [
[[package]]
name = "collab-document"
version = "0.2.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=49cf2206d7494bb3006402b807e7f171905213e3#49cf2206d7494bb3006402b807e7f171905213e3"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac#47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac"
dependencies = [
"anyhow",
"arc-swap",
@ -1032,7 +1032,7 @@ dependencies = [
[[package]]
name = "collab-entity"
version = "0.2.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=49cf2206d7494bb3006402b807e7f171905213e3#49cf2206d7494bb3006402b807e7f171905213e3"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac#47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac"
dependencies = [
"anyhow",
"bytes",
@ -1051,7 +1051,7 @@ dependencies = [
[[package]]
name = "collab-folder"
version = "0.2.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=49cf2206d7494bb3006402b807e7f171905213e3#49cf2206d7494bb3006402b807e7f171905213e3"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac#47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac"
dependencies = [
"anyhow",
"arc-swap",
@ -1094,7 +1094,7 @@ dependencies = [
[[package]]
name = "collab-plugins"
version = "0.2.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=49cf2206d7494bb3006402b807e7f171905213e3#49cf2206d7494bb3006402b807e7f171905213e3"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac#47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac"
dependencies = [
"anyhow",
"async-stream",
@ -1132,7 +1132,7 @@ dependencies = [
[[package]]
name = "collab-rt-entity"
version = "0.1.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=c9504d4081a8d9893830dc6598429353b078271b#c9504d4081a8d9893830dc6598429353b078271b"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=52782033948b7d243693ca159ea519d53458c8a6#52782033948b7d243693ca159ea519d53458c8a6"
dependencies = [
"anyhow",
"bincode",
@ -1157,7 +1157,7 @@ dependencies = [
[[package]]
name = "collab-rt-protocol"
version = "0.1.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=c9504d4081a8d9893830dc6598429353b078271b#c9504d4081a8d9893830dc6598429353b078271b"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=52782033948b7d243693ca159ea519d53458c8a6#52782033948b7d243693ca159ea519d53458c8a6"
dependencies = [
"anyhow",
"async-trait",
@ -1174,7 +1174,7 @@ dependencies = [
[[package]]
name = "collab-user"
version = "0.2.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=49cf2206d7494bb3006402b807e7f171905213e3#49cf2206d7494bb3006402b807e7f171905213e3"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac#47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac"
dependencies = [
"anyhow",
"collab",
@ -1436,7 +1436,7 @@ dependencies = [
"cssparser-macros",
"dtoa-short",
"itoa 1.0.10",
"phf 0.8.0",
"phf 0.11.2",
"smallvec",
]
@ -1561,7 +1561,7 @@ checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5"
[[package]]
name = "database-entity"
version = "0.1.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=c9504d4081a8d9893830dc6598429353b078271b#c9504d4081a8d9893830dc6598429353b078271b"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=52782033948b7d243693ca159ea519d53458c8a6#52782033948b7d243693ca159ea519d53458c8a6"
dependencies = [
"anyhow",
"app-error",
@ -3184,7 +3184,7 @@ dependencies = [
[[package]]
name = "gotrue"
version = "0.1.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=c9504d4081a8d9893830dc6598429353b078271b#c9504d4081a8d9893830dc6598429353b078271b"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=52782033948b7d243693ca159ea519d53458c8a6#52782033948b7d243693ca159ea519d53458c8a6"
dependencies = [
"anyhow",
"futures-util",
@ -3201,7 +3201,7 @@ dependencies = [
[[package]]
name = "gotrue-entity"
version = "0.1.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=c9504d4081a8d9893830dc6598429353b078271b#c9504d4081a8d9893830dc6598429353b078271b"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=52782033948b7d243693ca159ea519d53458c8a6#52782033948b7d243693ca159ea519d53458c8a6"
dependencies = [
"anyhow",
"app-error",
@ -3638,7 +3638,7 @@ dependencies = [
[[package]]
name = "infra"
version = "0.1.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=c9504d4081a8d9893830dc6598429353b078271b#c9504d4081a8d9893830dc6598429353b078271b"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=52782033948b7d243693ca159ea519d53458c8a6#52782033948b7d243693ca159ea519d53458c8a6"
dependencies = [
"anyhow",
"bytes",
@ -6233,7 +6233,7 @@ dependencies = [
[[package]]
name = "shared-entity"
version = "0.1.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=c9504d4081a8d9893830dc6598429353b078271b#c9504d4081a8d9893830dc6598429353b078271b"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=52782033948b7d243693ca159ea519d53458c8a6#52782033948b7d243693ca159ea519d53458c8a6"
dependencies = [
"anyhow",
"app-error",

View File

@ -52,7 +52,7 @@ collab-user = { version = "0.2" }
# Run the script:
# scripts/tool/update_client_api_rev.sh new_rev_id
# ⚠️⚠️⚠️️
client-api = { git = "https://github.com/AppFlowy-IO/AppFlowy-Cloud", rev = "c9504d4081a8d9893830dc6598429353b078271b" }
client-api = { git = "https://github.com/AppFlowy-IO/AppFlowy-Cloud", rev = "52782033948b7d243693ca159ea519d53458c8a6" }
[dependencies]
serde_json.workspace = true
@ -116,13 +116,13 @@ custom-protocol = ["tauri/custom-protocol"]
# To switch to the local path, run:
# scripts/tool/update_collab_source.sh
# ⚠️⚠️⚠️️
collab = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "49cf2206d7494bb3006402b807e7f171905213e3" }
collab-entity = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "49cf2206d7494bb3006402b807e7f171905213e3" }
collab-folder = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "49cf2206d7494bb3006402b807e7f171905213e3" }
collab-document = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "49cf2206d7494bb3006402b807e7f171905213e3" }
collab-database = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "49cf2206d7494bb3006402b807e7f171905213e3" }
collab-plugins = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "49cf2206d7494bb3006402b807e7f171905213e3" }
collab-user = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "49cf2206d7494bb3006402b807e7f171905213e3" }
collab = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac" }
collab-entity = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac" }
collab-folder = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac" }
collab-document = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac" }
collab-database = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac" }
collab-plugins = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac" }
collab-user = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac" }
# Working directory: frontend
# To update the commit ID, run:

View File

@ -0,0 +1,14 @@
<svg width="15" height="15" viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg">
<g opacity="0.6" clip-path="url(#clip0_632_5742)">
<path d="M12.3746 4.48999C10.7096 4.32499 9.03454 4.23999 7.36453 4.23999C6.37453 4.23999 5.38452 4.28999 4.39452 4.38999L3.37451 4.48999" stroke="#171717" stroke-width="0.750004" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6.12427 3.98501L6.23427 3.33C6.31427 2.855 6.37427 2.5 7.21927 2.5H8.52928C9.37429 2.5 9.43929 2.875 9.51429 3.335L9.62429 3.98501" stroke="#171717" stroke-width="0.750004" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M11.2995 6.07031L10.9745 11.1053C10.9195 11.8903 10.8745 12.5003 9.47949 12.5003H6.26947C4.87447 12.5003 4.82947 11.8903 4.77446 11.1053L4.44946 6.07031" stroke="#171717" stroke-width="0.750004" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M7.03955 9.75H8.70456" stroke="#171717" stroke-width="0.750004" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6.62451 7.75H9.12453" stroke="#171717" stroke-width="0.750004" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<defs>
<clipPath id="clip0_632_5742">
<rect width="14" height="14" fill="white" transform="translate(0.874512 0.5)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -1,5 +1,5 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<g opacity="0.6">
<path d="M8.125 3.125H4.375C4.04348 3.125 3.72554 3.2567 3.49112 3.49112C3.2567 3.72554 3.125 4.04348 3.125 4.375V8.125C3.125 8.45652 3.2567 8.77446 3.49112 9.00888C3.72554 9.2433 4.04348 9.375 4.375 9.375H8.125C8.45652 9.375 8.77446 9.2433 9.00888 9.00888C9.2433 8.77446 9.375 8.45652 9.375 8.125V4.375C9.375 4.04348 9.2433 3.72554 9.00888 3.49112C8.77446 3.2567 8.45652 3.125 8.125 3.125ZM8.125 8.125H4.375V4.375H8.125V8.125ZM15.625 3.125H11.875C11.5435 3.125 11.2255 3.2567 10.9911 3.49112C10.7567 3.72554 10.625 4.04348 10.625 4.375V8.125C10.625 8.45652 10.7567 8.77446 10.9911 9.00888C11.2255 9.2433 11.5435 9.375 11.875 9.375H15.625C15.9565 9.375 16.2745 9.2433 16.5089 9.00888C16.7433 8.77446 16.875 8.45652 16.875 8.125V4.375C16.875 4.04348 16.7433 3.72554 16.5089 3.49112C16.2745 3.2567 15.9565 3.125 15.625 3.125ZM15.625 8.125H11.875V4.375H15.625V8.125ZM8.125 10.625H4.375C4.04348 10.625 3.72554 10.7567 3.49112 10.9911C3.2567 11.2255 3.125 11.5435 3.125 11.875V15.625C3.125 15.9565 3.2567 16.2745 3.49112 16.5089C3.72554 16.7433 4.04348 16.875 4.375 16.875H8.125C8.45652 16.875 8.77446 16.7433 9.00888 16.5089C9.2433 16.2745 9.375 15.9565 9.375 15.625V11.875C9.375 11.5435 9.2433 11.2255 9.00888 10.9911C8.77446 10.7567 8.45652 10.625 8.125 10.625ZM8.125 15.625H4.375V11.875H8.125V15.625ZM15.625 10.625H11.875C11.5435 10.625 11.2255 10.7567 10.9911 10.9911C10.7567 11.2255 10.625 11.5435 10.625 11.875V15.625C10.625 15.9565 10.7567 16.2745 10.9911 16.5089C11.2255 16.7433 11.5435 16.875 11.875 16.875H15.625C15.9565 16.875 16.2745 16.7433 16.5089 16.5089C16.7433 16.2745 16.875 15.9565 16.875 15.625V11.875C16.875 11.5435 16.7433 11.2255 16.5089 10.9911C16.2745 10.7567 15.9565 10.625 15.625 10.625ZM15.625 15.625H11.875V11.875H15.625V15.625Z" fill="#101012"/>
<svg width="15" height="15" viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="icon_template_outlined" opacity="0.6">
<path id="Union" d="M11.7339 8.97626L11.7024 9.00328L11.7232 9.0392L13.0125 11.2712C13.399 11.9403 12.9159 12.7767 12.1428 12.7767H6.66498C6.07845 12.7767 5.65818 12.295 5.6592 11.7695L5.6593 11.7171L5.60693 11.7195C5.55512 11.7218 5.503 11.723 5.45061 11.723C3.58596 11.723 2.07441 10.2123 2.07441 8.3487C2.07441 6.48514 3.58596 4.97438 5.45061 4.97438C5.79803 4.97438 6.13311 5.02681 6.4484 5.12415L6.49801 5.13947L6.51145 5.08933L7.12678 2.79415C7.27031 2.25875 7.82095 1.94099 8.35669 2.08446L12.4299 3.17527C12.9656 3.31874 13.2835 3.86908 13.1399 4.40446L12.0485 8.47541C11.9942 8.67795 11.8818 8.84923 11.7339 8.97626ZM12.2182 4.15765L12.2312 4.10935L12.1829 4.09641L8.10971 3.0056L8.06142 2.99267L8.04848 3.04095L6.95708 7.1119L6.94413 7.16021L6.99244 7.17314L7.9688 7.43462L8.00584 7.44454L8.02503 7.41133L8.53423 6.52985C8.92075 5.86074 9.88707 5.86074 10.2736 6.52985L11.1071 7.97271L11.1674 8.07718L11.1987 7.96064L12.2182 4.15765ZM6.1238 10.6746L6.14315 10.6691L6.15323 10.6516L7.47933 8.356L7.51193 8.29955L7.44897 8.28269L6.74546 8.09429C6.20973 7.95081 5.89184 7.40047 6.03537 6.86509L6.23824 6.10839L6.2505 6.06267L6.20551 6.04793C5.96789 5.97009 5.71411 5.92802 5.45061 5.92802C4.11301 5.92802 3.02863 7.01177 3.02863 8.3487C3.02863 9.68564 4.11301 10.7694 5.45061 10.7694C5.68413 10.7694 5.91002 10.7363 6.1238 10.6746ZM9.44721 7.00665L9.40391 6.9317L9.36061 7.00665L6.62169 11.748L6.57836 11.823H6.66498H12.1428H12.2295L12.1861 11.748L9.44721 7.00665Z" fill="#171717" stroke="#F7F8FC" stroke-width="0.1"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -0,0 +1,9 @@
<svg width="50" height="50" viewBox="0 0 50 50" fill="none" xmlns="http://www.w3.org/2000/svg">
<g opacity="0.6">
<path d="M49 10.5517C40.1201 9.7597 31.1865 9.35171 22.2799 9.35171C16.9999 9.35171 11.7199 9.5917 6.44 10.0717L1 10.5517" stroke="#171717" stroke-width="1.83" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M15.6652 8.12783L16.2518 4.98388C16.6785 2.70395 16.9985 1 21.5051 1H28.4918C32.9984 1 33.3451 2.79995 33.7451 5.00788L34.3317 8.12783" stroke="#171717" stroke-width="1.83" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M43.2662 18.137L41.5329 42.3042C41.2396 46.0721 40.9996 49 33.5596 49H16.4397C8.99973 49 8.75973 46.0721 8.46635 42.3042L6.73303 18.137" stroke="#171717" stroke-width="1.83" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M20.5466 35.799H29.4266" stroke="#171717" stroke-width="1.83" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M18.3333 26.1992H31.6666" stroke="#171717" stroke-width="1.83" stroke-linecap="round" stroke-linejoin="round"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@ -2,6 +2,7 @@
"appName": "AppFlowy",
"defaultUsername": "أنا",
"welcomeText": "مرحبًا بك في @: appName",
"welcomeTo": "مرحبا بكم في",
"githubStarText": "نجمة على GitHub",
"subscribeNewsletterText": "اشترك في النشرة الإخبارية",
"letsGoButtonText": "بداية سريعة",
@ -34,16 +35,39 @@
"loginButtonText": "تسجيل الدخول",
"loginStartWithAnonymous": "ابدأ بجلسة خفية",
"continueAnonymousUser": "استمر بجلسة خفية",
"anonymous": "مجهول",
"buttonText": "تسجيل الدخول",
"signingInText": "جاري تسجيل الدخول...",
"forgotPassword": "هل نسيت كلمة السر؟",
"emailHint": "بريد إلكتروني",
"passwordHint": "كلمة المرور",
"dontHaveAnAccount": "ليس لديك حساب؟",
"createAccount": "إنشاء حساب",
"repeatPasswordEmptyError": "إعادة كلمة المرور لا يمكن أن تكون فارغة",
"unmatchedPasswordError": "تكرار كلمة المرور ليس هو نفسه كلمة المرور",
"syncPromptMessage": "قد تستغرق مزامنة البيانات بعض الوقت. من فضلك لا تغلق هذه الصفحة",
"or": "أو",
"signInWithGoogle": "استكمال باستخدام Google",
"signInWithGithub": "استكمال باستخدام Github",
"signInWithDiscord": "استكمال باستخدام Discord",
"signInWithApple": "استكمال باستخدام Apple",
"continueAnotherWay": "استكمال بطريقة أخرى",
"signUpWithGoogle": "سجل باستخدام Google",
"signUpWithGithub": "سجل باستخدام Github",
"signUpWithDiscord": "سجل باستخدام Discord",
"signInWith": "تسجيل الدخول ب:",
"signInWithEmail": "متابعة باستخدام البريد الإلكتروني",
"signInWithMagicLink": "استكمال",
"signUpWithMagicLink": "سجل باستخدام Magic Link",
"pleaseInputYourEmail": "الرجاء إدخال عنوان بريدك الإلكتروني",
"settings": "إعدادات",
"magicLinkSent": "تم إرسال Magic Link!",
"invalidEmail": "يرجى إدخال عنوان بريد إلكتروني صالح",
"alreadyHaveAnAccount": "هل لديك حساب؟",
"logIn": "تسجيل الدخول",
"generalError": "حدث خطأ ما. يرجى المحاولة مرة أخرى لاحقًا",
"limitRateError": "لأسباب أمنية، يمكنك طلب Magic Link كل 60 ثانية فقط",
"magicLinkSentDescription": "تم إرسال Magic Link إلى بريدك الإلكتروني. انقر على الرابط لإكمال تسجيل الدخول. ستنتهي صلاحية الرابط بعد 5 دقائق.",
"LogInWithGoogle": "تسجيل الدخول عبر جوجل",
"LogInWithGithub": "تسجيل الدخول مع جيثب",
"LogInWithDiscord": "تسجيل الدخول مع ديسكورد",
@ -53,21 +77,50 @@
"chooseWorkspace": "اختر مساحة العمل الخاصة بك",
"create": "قم بإنشاء مساحة عمل",
"reset": "إعادة تعيين مساحة العمل",
"renameWorkspace": "إعادة تسمية مساحة العمل",
"resetWorkspacePrompt": "ستؤدي إعادة تعيين مساحة العمل إلى حذف جميع الصفحات والبيانات الموجودة بداخلها. هل أنت متأكد أنك تريد إعادة تعيين مساحة العمل؟ وبدلاً من ذلك، يمكنك الاتصال بفريق الدعم لاستعادة مساحة العمل",
"hint": "مساحة العمل",
"notFoundError": "مساحة العمل غير موجودة",
"failedToLoad": "هناك خطأ ما! فشل تحميل مساحة العمل. حاول إغلاق أي مثيل مفتوح لـ @:appName وحاول مرة أخرى.",
"errorActions": {
"reportIssue": "بلغ عن خطأ",
"reportIssueOnGithub": "الإبلاغ عن مشكلة على Github",
"exportLogFiles": "تصدير ملفات السجل",
"reachOut": "تواصل مع ديسكورد"
}
},
"menuTitle": "مساحات العمل",
"deleteWorkspaceHintText": " هل أنت متأكد من أنك تريد حذف مساحة العمل؟ لا يمكن التراجع عن هذا الإجراء، وستختفي أي صفحات قمت بنشرها سابقاً.",
"createSuccess": "تم إنشاء مساحة العمل بنجاح",
"createFailed": "فشل في إنشاء مساحة العمل",
"deleteSuccess": "تم حذف مساحة العمل بنجاح",
"deleteFailed": "فشل في حذف مساحة العمل",
"openSuccess": "تم فتح مساحة العمل بنجاح",
"openFailed": "فشل في فتح مساحة العمل",
"renameSuccess": "تم إعادة تسمية مساحة العمل بنجاح",
"renameFailed": "فشل في إعادة تسمية مساحة العمل",
"updateIconSuccess": "تم تحديث أيقونة مساحة العمل بنجاح",
"updateIconFailed": "فشل تحديث أيقونة مساحة العمل",
"cannotDeleteTheOnlyWorkspace": "لا يمكن حذف مساحة العمل الوحيدة",
"fetchWorkspacesFailed": "فشل في الوصول لمساحات العمل",
"leaveCurrentWorkspace": "مغادرة مساحة العمل",
"leaveCurrentWorkspacePrompt": "هل أنت متأكد أنك تريد مغادرة مساحة العمل الحالية؟"
},
"shareAction": {
"buttonText": "مشاركه",
"workInProgress": "قريباً",
"markdown": "Markdown",
"html": "HTML",
"clipboard": "نسخ إلى الحافظة",
"csv": "CSV",
"copyLink": "نسخ الرابط"
"copyLink": "نسخ الرابط",
"publishToTheWeb": "نشر على الويب",
"publishToTheWebHint": "إنشاء موقع ويب مع AppFlowy",
"publish": "نشر",
"unPublish": "التراجع عن النشر",
"visitSite": "زيارة الموقع",
"exportAsTab": "تصدير كـ",
"publishTab": "نشر",
"shareTab": "مشاركة"
},
"moreAction": {
"small": "صغير",
@ -75,7 +128,12 @@
"large": "كبير",
"fontSize": "حجم الخط",
"import": "استيراد",
"moreOptions": "المزيد من الخيارات"
"moreOptions": "المزيد من الخيارات",
"wordCount": "عدد الكلمات: {}",
"charCount": "عدد الأحرف: {}",
"createdAt": "منشأ: {}",
"deleteView": "يمسح",
"duplicateView": "تكرار"
},
"importPanel": {
"textAndMarkdown": "نص و Markdown",
@ -93,7 +151,9 @@
"openNewTab": "افتح في علامة تبويب جديدة",
"moveTo": "نقل إلى",
"addToFavorites": "اضافة الى المفضلة",
"copyLink": "نسخ الرابط"
"copyLink": "نسخ الرابط",
"changeIcon": "تغيير الأيقونة",
"collapseAllPages": "طي جميع الصفحات الفرعية"
},
"blankPageTitle": "صفحة فارغة",
"newPageText": "صفحة جديدة",
@ -101,6 +161,11 @@
"newGridText": "شبكة جديدة",
"newCalendarText": "تقويم جديد",
"newBoardText": "سبورة جديدة",
"chat": {
"newChat": "الدردشة بالذكاء الاصطناعي",
"relatedQuestion": "ذات صلة",
"serverUnavailable": "الخدمة غير متاحة مؤقتًا. يرجى المحاولة مرة أخرى لاحقًا."
},
"trash": {
"text": "المهملات",
"restoreAll": "استعادة الكل",
@ -184,11 +249,16 @@
"closeSidebar": "إغلاق الشريط الجانبي",
"openSidebar": "فتح الشريط الجانبي",
"personal": "شخصي",
"private": "خاص",
"favorites": "المفضلة",
"clickToHidePersonal": "انقر لإخفاء القسم الشخصي",
"clickToHideFavorites": "انقر لإخفاء القسم المفضل",
"addAPage": "أضف صفحة",
"recent": "مؤخرًا"
"recent": "مؤخرًا",
"today": "اليوم",
"thisWeek": "هذا الأسبوع",
"justNow": "الآن",
"purchaseAIResponse": "شراء"
},
"notifications": {
"export": {
@ -204,6 +274,7 @@
},
"button": {
"ok": "حسنا",
"confirm": "تأكيد",
"done": "منتهي",
"cancel": "الغاء",
"signIn": "تسجيل الدخول",
@ -231,7 +302,19 @@
"helpCenter": "مركز المساعدة",
"add": "اضافة",
"yes": "نعم",
"no": "لا",
"remove": "حذف",
"copyLink": "نسخ الرابط",
"login": "تسجيل الدخول",
"logout": "تسجيل الخروج",
"deleteAccount": "حذف الحساب",
"back": "خلف",
"more": "أكثر",
"create": "إنشاء",
"close": "إغلاق",
"next": "التالي",
"previous": "السابق",
"download": "تحميل",
"tryAGain": "حاول ثانية"
},
"label": {
@ -256,6 +339,10 @@
},
"settings": {
"title": "إعدادات",
"popupMenuItem": {
"settings": "إعدادات",
"members": "الأعضاء"
},
"menu": {
"appearance": "مظهر",
"language": "لغة",

View File

@ -1462,7 +1462,7 @@
"tagName": "Tag-Name"
},
"checklist": {
"taskHint": "Aufgbenbeschreibbung",
"taskHint": "Aufgabenbeschreibung",
"addNew": "Füge eine Aufgabe hinzu",
"submitNewTask": "Erstellen",
"hideComplete": "Blende abgeschlossene Aufgaben aus",

View File

@ -49,7 +49,7 @@
"syncPromptMessage": "Syncing the data might take a while. Please don't close this page",
"or": "OR",
"signInWithGoogle": "Continue with Google",
"signInWithGithub": "Continue with Github",
"signInWithGithub": "Continue with GitHub",
"signInWithDiscord": "Continue with Discord",
"signInWithApple": "Continue with Apple",
"continueAnotherWay": "Continue another way",
@ -144,8 +144,8 @@
"rename": "Rename",
"delete": "Delete",
"duplicate": "Duplicate",
"unfavorite": "Remove from favorites",
"favorite": "Add to favorites",
"unfavorite": "Remove from Favorites",
"favorite": "Add to Favorites",
"openNewTab": "Open in a new tab",
"moveTo": "Move to",
"addToFavorites": "Add to Favorites",
@ -204,8 +204,8 @@
},
"mobile": {
"actions": "Trash Actions",
"empty": "Trash Bin is Empty",
"emptyDescription": "You don't have any deleted file",
"empty": "No pages or spaces in Trash",
"emptyDescription": "Move things you don't need to the Trash.",
"isDeleted": "is deleted",
"isRestored": "is restored"
},
@ -347,9 +347,9 @@
"putback": "Put Back",
"update": "Update",
"share": "Share",
"removeFromFavorites": "Remove from favorites",
"removeFromRecent": "Remove from recent",
"addToFavorites": "Add to favorites",
"removeFromFavorites": "Remove from Favorites",
"removeFromRecent": "Remove from Recent",
"addToFavorites": "Add to Favorites",
"favoriteSuccessfully": "Favorited success",
"unfavoriteSuccessfully": "Unfavorited success",
"duplicateSuccessfully": "Duplicated successfully",
@ -368,7 +368,7 @@
"deleteAccount": "Delete account",
"back": "Back",
"signInGoogle": "Continue with Google",
"signInGithub": "Continue with Github",
"signInGithub": "Continue with GitHub",
"signInDiscord": "Continue with Discord",
"more": "More",
"create": "Create",
@ -747,13 +747,14 @@
"title": "AI Max",
"description": "Unlimited AI responses powered by GPT-4o, Claude 3.5 Sonnet, and more",
"price": "{}",
"priceInfo": "per user per month billed annually"
"priceInfo": "Per user per month billed annually",
"recommend": ""
},
"aiOnDevice": {
"title": "AI On-device for Mac",
"description": "Run Mistral 7B, LLAMA 3, and more local models on your machine",
"price": "{}",
"priceInfo": "per user per month billed annually",
"priceInfo": "Per user per month billed annually",
"recommend": "Recommend M1 or newer"
}
},
@ -824,13 +825,13 @@
"title": "Free",
"description": "For individuals up to 2 members to organize everything",
"price": "{}",
"priceInfo": "free forever"
"priceInfo": "Free forever"
},
"proPlan": {
"title": "Pro",
"description": "For small teams to manage projects and team knowledge",
"price": "{}",
"priceInfo": "per user per month \nbilled annually\n\n{} billed monthly"
"priceInfo": "Per user per month \nbilled annually\n\n{} billed monthly"
},
"planLabels": {
"itemOne": "Workspaces",
@ -839,26 +840,29 @@
"itemFour": "Real-time collaboration",
"itemFive": "Mobile app",
"itemSix": "AI Responses",
"itemFileUpload": "File uploads",
"tooltipSix": "Lifetime means the number of responses never reset",
"intelligentSearch": "Intelligent search",
"tooltipSeven": "Allows you to customize part of the URL for your workspace"
},
"freeLabels": {
"itemOne": "charged per workspace",
"itemTwo": "up to 2",
"itemOne": "Charged per workspace",
"itemTwo": "Up to 2",
"itemThree": "5 GB",
"itemFour": "yes",
"itemFive": "yes",
"itemSix": "100 lifetime",
"itemFileUpload": "Up to 7 MB",
"intelligentSearch": "Intelligent search"
},
"proLabels": {
"itemOne": "charged per workspace",
"itemTwo": "up to 10",
"itemThree": "unlimited",
"itemOne": "Charged per workspace",
"itemTwo": "Up to 10",
"itemThree": "Unlimited",
"itemFour": "yes",
"itemFive": "yes",
"itemSix": "unlimited",
"itemSix": "Unlimited",
"itemFileUpload": "Unlimited",
"intelligentSearch": "Intelligent search"
},
"paymentSuccess": {
@ -993,16 +997,16 @@
"archiveAll": "Archive all"
},
"emptyInbox": {
"title": "No notifications yet",
"description": "You'll be notified here for @mentions"
"title": "Inbox Zero!",
"description": "Set reminders to receive notifications here."
},
"emptyUnread": {
"title": "No unread notifications",
"description": "You're all caught up!"
},
"emptyArchived": {
"title": "No archived notifications",
"description": "You haven't archived any notifications yet"
"title": "No archived",
"description": "Archived notifications will appear here."
},
"tabs": {
"inbox": "Inbox",

View File

@ -36,6 +36,7 @@
"loginButtonText": "Connexion",
"loginStartWithAnonymous": "Lancer avec une session anonyme",
"continueAnonymousUser": "Continuer avec une session anonyme",
"anonymous": "Anonyme",
"buttonText": "Se connecter",
"signingInText": "Connexion en cours...",
"forgotPassword": "Mot de passe oublié ?",
@ -50,6 +51,8 @@
"signInWithGoogle": "Continuer avec Google",
"signInWithGithub": "Continuer avec Github",
"signInWithDiscord": "Continuer avec Discord",
"signInWithApple": "Se connecter via Apple",
"continueAnotherWay": "Continuer via une autre méthode",
"signUpWithGoogle": "S'inscrire avec Google",
"signUpWithGithub": "S'inscrire avec Github",
"signUpWithDiscord": "S'inscrire avec Discord",
@ -166,6 +169,7 @@
"inputMessageHint": "Demandez à l'IA @:appName",
"inputLocalAIMessageHint": "Demander l'IA locale @:appName",
"unsupportedCloudPrompt": "Cette fonctionnalité n'est disponible que lors de l'utilisation du cloud @:appName",
"relatedQuestion": "Questions Associées",
"serverUnavailable": "Service temporairement indisponible. Veuillez réessayer ultérieurement.",
"aiServerUnavailable": "🌈 Oh-oh ! 🌈. Une licorne a mangé notre réponse. Veuillez réessayer !",
"clickToRetry": "Cliquez pour réessayer",
@ -379,6 +383,7 @@
"next": "Suivant",
"previous": "Précédent",
"submit": "Soumettre",
"download": "Télécharger",
"tryAGain": "Réessayer"
},
"label": {
@ -403,6 +408,12 @@
},
"settings": {
"title": "Paramètres",
"popupMenuItem": {
"settings": "Paramètres",
"members": "Membres",
"trash": "Corbeille",
"helpAndSupport": "Aide & Support"
},
"accountPage": {
"menuLabel": "Mon compte",
"title": "Mon compte",
@ -667,6 +678,7 @@
"keys": {
"enableAISearchTitle": "Recherche IA",
"aiSettingsDescription": "Choisissez votre modèle préféré pour alimenter AppFlowy AI. Inclut désormais GPT 4-o, Claude 3,5, Llama 3.1 et Mistral 7B",
"loginToEnableAIFeature": "Les fonctionnalités d'IA sont accessibles uniquement après s'être connecté avec @:appName Cloud. Pour créer un compte @:appName, voir dans la rubrique 'Mon Compte'.",
"llmModel": "Modèle de langage",
"llmModelType": "Type de modèle de langue",
"downloadLLMPrompt": "Télécharger {}",
@ -699,14 +711,21 @@
"planUsage": {
"title": "Résumé de l'utilisation du plan",
"storageLabel": "Stockage",
"storageUsage": "{} sur {} GB",
"unlimitedStorageLabel": "Stockage illimité",
"collaboratorsLabel": "Membres",
"collaboratorsUsage": "{} sur {}",
"aiResponseLabel": "Réponses de l'IA",
"aiResponseUsage": "{} sur {}",
"unlimitedAILabel": "Réponses illimitées",
"proBadge": "Pro",
"aiMaxBadge": "AI Max",
"memberProToggle": "Plus de membres et une IA illimitée",
"aiMaxToggle": "IA illimitée et accès à des modèles avancés",
"aiOnDeviceToggle": "IA locale pour une confidentialité ultime",
"aiCredit": {
"title": "Ajoutez des crédit IA @:appName ",
"price": "{}",
"priceDescription": "pour 1 000 crédits",
"purchase": "Acheter l'IA",
"infoItemOne": "10 000 réponses par base de données",
@ -715,6 +734,7 @@
"currentPlan": {
"bannerLabel": "Plan actuel",
"freeTitle": "Gratuit",
"proTitle": "Pro",
"teamTitle": "Équipe",
"freeInfo": "Idéal pour les particuliers jusqu'à 2 membres pour tout organiser",
"proInfo": "Idéal pour les petites et moyennes équipes jusqu'à 10 membres.",
@ -727,10 +747,13 @@
"addLabel": "Ajouter",
"activeLabel": "Ajouté",
"aiMax": {
"title": "AI Max",
"price": "{}",
"priceInfo": "par utilisateur et par mois, facturé annuellement"
},
"aiOnDevice": {
"description": "Exécutez Mistral 7B, LLAMA 3 et d'autres modèles locaux sur votre machine",
"price": "{}",
"priceInfo": "par utilisateur et par mois, facturé annuellement",
"recommend": "Recommand2 M1 ou plus récent"
}
@ -746,7 +769,9 @@
"menuLabel": "Facturation",
"title": "Facturation",
"plan": {
"title": "Plan",
"freeLabel": "Gratuit",
"proLabel": "Pro",
"planButtonLabel": "Changer de plan",
"billingPeriod": "Période de facturation",
"periodButtonLabel": "Changer la période "
@ -772,6 +797,10 @@
"description": "Débloquez une IA illimitée locale sur votre appareil",
"activeDescription": "Prochaine facture due le {}",
"canceledDescription": "IA locale pour Mac sera disponible jusqu'au {}"
},
"removeDialog": {
"title": "Supprimer",
"description": "Êtes-vous sûr de vouloir supprimer {plan}? Vous perdrez l'accès aux fonctionnalités et bénéfices de {plan} de manière immédiate."
}
},
"currentPeriodBadge": "ACTUEL",
@ -786,15 +815,20 @@
"planFeatures": "Plan\nCaractéristiques",
"current": "Actuel",
"actions": {
"upgrade": "Améliorer",
"downgrade": "Rétrograder",
"current": "Actuel"
},
"freePlan": {
"title": "Gratuit",
"description": "Pour les particuliers jusqu'à 2 membres pour tout organiser",
"price": "{}",
"priceInfo": "gratuit pour toujours"
},
"proPlan": {
"title": "Pro",
"description": "Pour les petites équipes pour gérer les projets et les bases de connaissance",
"price": "{}",
"priceInfo": "par utilisateur et par mois\nfacturé annuellement\n\n{} facturé mensuellement"
},
"planLabels": {
@ -833,6 +867,7 @@
}
},
"cancelSurveyDialog": {
"title": "Désolé de vous voir partir",
"commonOther": "Autre",
"otherHint": "Écrivez votre réponse ici",
"questionOne": {
@ -944,7 +979,8 @@
},
"action": {
"markAsRead": "Marquer comme lu",
"multipleChoice": "Sélectionnez plus"
"multipleChoice": "Sélectionnez plus",
"archive": "Archiver"
},
"settings": {
"settings": "Paramètres",
@ -970,6 +1006,7 @@
},
"refreshSuccess": "Les notifications ont été actualisées avec succès",
"titles": {
"notifications": "Notifications",
"reminder": "Rappel"
}
},
@ -1073,12 +1110,15 @@
"memberLimitExceeded": "Vous avez atteint la limite maximale de membres autorisée pour votre compte. Si vous souhaitez ajouter d'autres membres pour continuer votre travail, veuillez en faire la demande sur Github.",
"memberLimitExceededUpgrade": "mise à niveau",
"memberLimitExceededPro": "Limite de membres atteinte, si vous avez besoin de plus de membres, contactez ",
"memberLimitExceededProContact": "support@appflowy.io",
"failedToAddMember": "Échec de l'ajout d'un membre",
"addMemberSuccess": "Membre ajouté avec succès",
"removeMember": "Supprimer un membre",
"areYouSureToRemoveMember": "Êtes-vous sûr de vouloir supprimer ce membre ?",
"inviteMemberSuccess": "L'invitation a été envoyée avec succès",
"failedToInviteMember": "Impossible d'inviter un membre"
"failedToInviteMember": "Impossible d'inviter un membre",
"workspaceMembersError": "Une erreur s'est produite",
"workspaceMembersErrorDescription": "Nous n'avons pas pu charger la liste des membres. Veuillez essayer plus tard s'il vous plait"
}
},
"files": {
@ -1281,6 +1321,8 @@
"urlFieldName": "URL",
"checklistFieldName": "Check-list",
"relationFieldName": "Relation",
"summaryFieldName": "Résume IA",
"translateFieldName": "Traduction IA",
"translateTo": "Traduire en",
"numberFormat": "Format du nombre",
"dateFormat": "Format de la date",
@ -1450,11 +1492,13 @@
"heading1": "Titre 1",
"heading2": "Titre 2",
"heading3": "Titre 3",
"image": "Image",
"bulletedList": "Liste à puces",
"numberedList": "Liste numérotée",
"linkedDoc": "Lien vers la page",
"grid": "Grille",
"linkedGrid": "Grille liée",
"kanban": "Kanban",
"linkedKanban": "Kanban lié",
"calendar": "Calendrier",
"linkedCalendar": "Calendrier lié",
@ -1462,6 +1506,7 @@
"divider": "Diviseur",
"table": "Tableau",
"mathEquation": "Équation mathématique",
"code": "Code",
"emoji": "Émoji",
"aiWriter": "Rédacteur IA",
"dateOrReminder": "Date ou rappel",
@ -1567,7 +1612,9 @@
},
"photoGallery": {
"name": "Galerie de photos",
"imageKeyword": "image",
"imageGalleryKeyword": "Galerie d'images",
"photoKeyword": "photo",
"photoBrowserKeyword": "navigateur de photos",
"galleryKeyword": "galerie",
"addImageTooltip": "Ajouter une image",
@ -1700,6 +1747,7 @@
"openLocalImage": "Ouvrir l'image",
"downloadImage": "Télécharger l'image",
"closeViewer": "Fermer la visionneuse",
"scalePercentage": "{}%",
"deleteImageTooltip": "Supprimer l'image"
}
},
@ -1708,7 +1756,8 @@
"codeBlock": {
"language": {
"label": "Langue",
"placeholder": "Choisir la langue"
"placeholder": "Choisir la langue",
"auto": "Auto"
},
"copyTooltip": "Copier le contenu du bloc de code",
"searchLanguageHint": "Rechercher une langue",
@ -1793,6 +1842,7 @@
"failedToLoad": "Échec du chargement de la vue du tableau"
},
"dateCondition": {
"weekOf": "Semaine de {} - {}",
"today": "Aujourd'hui",
"yesterday": "Hier",
"tomorrow": "Demain",

View File

@ -2,12 +2,14 @@
"appName": "AppFlowy",
"defaultUsername": "Me",
"welcomeText": "Benvenuto in @:appName",
"welcomeTo": "Benvenuto a",
"githubStarText": "Vota su GitHub",
"subscribeNewsletterText": "Sottoscrivi la Newsletter",
"letsGoButtonText": "Andiamo",
"title": "Titolo",
"youCanAlso": "Puoi anche",
"and": "E",
"failedToOpenUrl": "Apertura URL fallita: {}",
"blockActions": {
"addBelowTooltip": "Fare clic per aggiungere di seguito",
"addAboveCmd": "Alt+clic",
@ -35,15 +37,35 @@
"loginStartWithAnonymous": "Inizia con una sessione anonima",
"continueAnonymousUser": "Continua con una sessione anonima",
"buttonText": "Accedi",
"signingInText": "Accesso in corso...",
"forgotPassword": "Password Dimentica?",
"emailHint": "Email",
"passwordHint": "Password",
"dontHaveAnAccount": "Non hai un account?",
"createAccount": "Crea account",
"repeatPasswordEmptyError": "La password ripetuta non può essere vuota",
"unmatchedPasswordError": "La password ripetuta non è uguale alla password",
"syncPromptMessage": "La sincronizzazione dei dati potrebbe richiedere del tempo. Per favore, non chiudere questa pagina",
"or": "O",
"signInWithGoogle": "Continua con Google",
"signInWithGithub": "Continua con Github",
"signInWithDiscord": "Continua con Discord",
"signUpWithGoogle": "Registrati con Google",
"signUpWithGithub": "Registrati con Github",
"signUpWithDiscord": "Registrati con Discord",
"signInWith": "Loggati con:",
"signInWithEmail": "Continua con Email",
"signInWithMagicLink": "Continua",
"signUpWithMagicLink": "Registrati con un Link Magico",
"pleaseInputYourEmail": "Per favore, inserisci il tuo indirizzo email",
"settings": "Impostazioni",
"magicLinkSent": "Link Magico inviato!",
"invalidEmail": "Per favore, inserisci un indirizzo email valido",
"alreadyHaveAnAccount": "Hai già un account?",
"logIn": "Accedi",
"generalError": "Qualcosa è andato storto. Per favore, riprova più tardi",
"limitRateError": "Per ragioni di sicurezza, puoi richiedere un link magico ogni 60 secondi",
"magicLinkSentDescription": "Un Link Magico è stato inviato alla tua email. Clicca il link per completare il tuo accesso. Il link scadrà dopo 5 minuti.",
"LogInWithGoogle": "Accedi con Google",
"LogInWithGithub": "Accedi con Github",
"LogInWithDiscord": "Accedi con Discord",
@ -53,6 +75,7 @@
"chooseWorkspace": "Scegli il tuo spazio di lavoro",
"create": "Crea spazio di lavoro",
"reset": "Ripristina lo spazio di lavoro",
"renameWorkspace": "Rinomina workspace",
"resetWorkspacePrompt": "Il ripristino dello spazio di lavoro eliminerà tutte le pagine e i dati al suo interno. Sei sicuro di voler ripristinare lo spazio di lavoro? In alternativa, puoi contattare il team di supporto per ristabilire lo spazio di lavoro",
"hint": "spazio di lavoro",
"notFoundError": "Spazio di lavoro non trovato",
@ -62,14 +85,39 @@
"reportIssueOnGithub": "Segnalate un problema su Github",
"exportLogFiles": "Esporta i file di log",
"reachOut": "Contattaci su Discord"
}
},
"deleteWorkspaceHintText": "Sei sicuro di voler cancellare la workspace? Questa azione non è reversibile, e ogni pagina che hai pubblicato sarà rimossa.",
"createSuccess": "Workspace creata con successo",
"createFailed": "Creazione workspace fallita",
"createLimitExceeded": "Hai raggiunto il numero massimo di workspace permesse per il tuo account. Se hai bisogno di ulteriori workspace per continuare il tuo lavoro, per favore fai richiesta su Github",
"deleteSuccess": "Workspace cancellata con successo",
"deleteFailed": "Cancellazione workspace fallita",
"openSuccess": "Workspace aperta con successo",
"openFailed": "Apertura workspace fallita",
"renameSuccess": "Workspace rinominata con successo",
"renameFailed": "Rinomina workspace fallita",
"updateIconSuccess": "Icona della workspace aggiornata con successo",
"updateIconFailed": "Aggiornamento icona della workspace fallito",
"cannotDeleteTheOnlyWorkspace": "Impossibile cancellare l'unica workspace",
"fetchWorkspacesFailed": "Recupero workspaces fallito",
"leaveCurrentWorkspace": "Lascia workspace",
"leaveCurrentWorkspacePrompt": "Sei sicuro di voler lasciare la workspace corrente?"
},
"shareAction": {
"buttonText": "Condividi",
"workInProgress": "Prossimamente",
"markdown": "Markdown",
"clipboard": "Copia",
"csv": "CSV",
"copyLink": "Copia Link"
"copyLink": "Copia Link",
"publishToTheWeb": "Pubblica sul Web",
"publishToTheWebHint": "Crea un sito con AppFlowy",
"publish": "Pubblica",
"unPublish": "Annulla la pubblicazione",
"visitSite": "Visita sito",
"exportAsTab": "Esporta come",
"publishTab": "Pubblica",
"shareTab": "Condividi"
},
"moreAction": {
"small": "piccolo",
@ -80,6 +128,7 @@
"moreOptions": "Più opzioni",
"wordCount": "Conteggio parole: {}",
"charCount": "Numero di caratteri: {}",
"createdAt": "Creata: {}",
"deleteView": "Cancella",
"duplicateView": "Duplica"
},
@ -99,7 +148,9 @@
"openNewTab": "Apri in una nuova scheda",
"moveTo": "Sposta in",
"addToFavorites": "Aggiungi ai preferiti",
"copyLink": "Copia link"
"copyLink": "Copia link",
"changeIcon": "Cambia icona",
"collapseAllPages": "Comprimi le sottopagine"
},
"blankPageTitle": "Pagina vuota",
"newPageText": "Nuova pagina",
@ -107,6 +158,32 @@
"newGridText": "Nuova griglia",
"newCalendarText": "Nuovo calendario",
"newBoardText": "Nuova bacheca",
"chat": {
"newChat": "Chat AI",
"inputMessageHint": "Chiedi a @:appName AI",
"inputLocalAIMessageHint": "Chiedi a @:appName Local AI",
"unsupportedCloudPrompt": "Questa funzione è disponibile solo quando si usa @:appName Cloud",
"relatedQuestion": "Correlato",
"serverUnavailable": "Servizio temporaneamente non disponibile. Per favore, riprova più tardi.",
"aiServerUnavailable": "🌈 Uh-oh! 🌈. Un unicorno ha mangiato la nostra risposta. Per favore, riprova!",
"clickToRetry": "Clicca per riprovare",
"regenerateAnswer": "Rigenera",
"question1": "Come usare Kanban per organizzare le attività",
"question2": "Spiega il metodo GTD",
"question3": "Perché usare Rust",
"question4": "Ricetta con cos'è presente nella mia cucina",
"aiMistakePrompt": "Le IA possono fare errori. Controlla le informazioni importanti.",
"chatWithFilePrompt": "Vuoi chattare col file?",
"indexFileSuccess": "Indicizzazione file completata con successo",
"inputActionNoPages": "Nessuna pagina risultante",
"referenceSource": "{} fonte trovata",
"referenceSources": "{} fonti trovate",
"clickToMention": "Clicca per menzionare una pagina",
"uploadFile": "Carica file PDF, MD o TXT con la quale chattare",
"questionTitle": "Idee",
"questionDetail": "Salve {}! Come posso aiutarti oggi?",
"indexingFile": "Indicizzazione {}"
},
"trash": {
"text": "Cestino",
"restoreAll": "Ripristina Tutto",
@ -125,11 +202,13 @@
"caption": "Questa azione non può essere annullata."
},
"mobile": {
"actions": "Azioni del cestino",
"empty": "Il cestino è vuoto",
"emptyDescription": "Non hai alcun file eliminato",
"isDeleted": "è stato cancellato",
"isRestored": "è stato ripristinato"
}
},
"confirmDeleteTitle": "Sei sicuro di voler eliminare questa pagina permanentemente?"
},
"deletePagePrompt": {
"text": "Questa pagina è nel Cestino",
@ -183,17 +262,44 @@
"dragRow": "Premere a lungo per riordinare la riga",
"viewDataBase": "Visualizza banca dati",
"referencePage": "Questo {nome} è referenziato",
"addBlockBelow": "Aggiungi un blocco qui sotto"
"addBlockBelow": "Aggiungi un blocco qui sotto",
"aiGenerate": "Genera"
},
"sideBar": {
"closeSidebar": "Close sidebar",
"openSidebar": "Open sidebar",
"personal": "Personale",
"private": "Privato",
"favorites": "Preferiti",
"clickToHidePrivate": "Clicca per nascondere l'area privata\nLe pagine create qui sono visibili solo a te",
"clickToHideWorkspace": "Clicca per nascondere la workspace\nLe pagine che crei qui sono visibili a ogni membro",
"clickToHidePersonal": "Fare clic per nascondere la sezione personale",
"clickToHideFavorites": "Fare clic per nascondere la sezione dei preferiti",
"addAPage": "Aggiungi una pagina",
"recent": "Recente"
"addAPageToPrivate": "Aggiungi pagina all'area privata",
"addAPageToWorkspace": "Aggiungi pagina alla workspace",
"recent": "Recente",
"today": "Oggi",
"thisWeek": "Questa settimana",
"others": "Preferiti precedenti",
"justNow": "poco fa",
"minutesAgo": "{count} minuti fa",
"lastViewed": "Visto per ultimo",
"favoriteAt": "Aggiunto tra ai preferiti",
"emptyRecent": "Nessun documento recente",
"emptyRecentDescription": "Quando vedrai documenti, appariranno qui per accesso facilitato",
"emptyFavorite": "Nessun documento preferito",
"emptyFavoriteDescription": "Comincia a esplorare e marchia documenti come preferiti. Verranno elencati qui per accesso rapido!",
"removePageFromRecent": "Rimuovere questa pagina da Recenti?",
"removeSuccess": "Rimozione effettuata con successo",
"favoriteSpace": "Preferiti",
"RecentSpace": "Recenti",
"Spaces": "Aree",
"upgradeToPro": "Aggiorna a Pro",
"upgradeToAIMax": "Sblocca AI illimitata",
"storageLimitDialogTitle": "Hai esaurito lo spazio d'archiviazione gratuito. Aggiorna per avere spazio d'archiviazione illimitato!",
"aiResponseLimitTitle": "Hai esaurito le risposte AI gratuite. Aggiorna al Piano Pro per acquistare un add-on AI per avere risposte illimitate",
"aiResponseLimitDialogTitle": "Numero di riposte AI raggiunto"
},
"notifications": {
"export": {

View File

@ -9,6 +9,7 @@
"title": "Título",
"youCanAlso": "Você também pode",
"and": "e",
"failedToOpenUrl": "Falha ao abrir url: {}",
"blockActions": {
"addBelowTooltip": "Clique para adicionar abaixo",
"addAboveCmd": "Alt+clique",
@ -35,17 +36,39 @@
"loginButtonText": "Conectar-se",
"loginStartWithAnonymous": "Iniciar com uma sessão anônima",
"continueAnonymousUser": "Continuar em uma sessão anônima",
"anonymous": "Anônimo",
"buttonText": "Entre",
"signingInText": "Entrando...",
"forgotPassword": "Esqueceu sua senha?",
"emailHint": "E-mail",
"passwordHint": "Senha",
"dontHaveAnAccount": "Não possui uma conta?",
"createAccount": "Criar uma conta",
"repeatPasswordEmptyError": "Senha não pode estar em branco.",
"unmatchedPasswordError": "As senhas não conferem.",
"syncPromptMessage": "A sincronização dos dados pode demorar um pouco. Por favor não feche esta página",
"or": "OU",
"signInWithGoogle": "Continuar com o Google",
"signInWithGithub": "Continuar com o Github",
"signInWithDiscord": "Continuar com o Discord",
"signInWithApple": "Continuar com a Apple",
"continueAnotherWay": "Continuar de outra forma",
"signUpWithGoogle": "Cadastro com o Google",
"signUpWithGithub": "Cadastro com o Github",
"signUpWithDiscord": "Cadastro com o Discord",
"signInWith": "Entrar com:",
"signInWithEmail": "Continuar com e-mail",
"signInWithMagicLink": "Continuar",
"signUpWithMagicLink": "Cadastro com um Link Mágico",
"pleaseInputYourEmail": "Por favor, insira seu endereço de e-mail",
"settings": "Configurações",
"magicLinkSent": "Link Mágico enviado!",
"invalidEmail": "Por favor, insira um endereço de e-mail válido",
"alreadyHaveAnAccount": "Já tem uma conta?",
"logIn": "Entrar",
"generalError": "Algo deu errado. Tente novamente mais tarde.",
"limitRateError": "Por razões de segurança, você só pode solicitar um link mágico a cada 60 segundos",
"magicLinkSentDescription": "Um Link Mágico foi enviado para seu e-mail. Clique no link para concluir seu login. O link expirará após 5 minutos.",
"LogInWithGoogle": "Entrar com o Google",
"LogInWithGithub": "Entrar com o Github",
"LogInWithDiscord": "Entrar com o Discord",
@ -55,21 +78,50 @@
"chooseWorkspace": "Escolha seu espaço de trabalho",
"create": "Crie um espaço de trabalho",
"reset": "Redefinir espaço de trabalho",
"renameWorkspace": "Renomear espaço de trabalho",
"resetWorkspacePrompt": "A redefinição do espaço de trabalho excluirá todas as páginas e dados contidos nele. Tem certeza de que deseja redefinir o espaço de trabalho? Alternativamente, você pode entrar em contato com a equipe de suporte para restaurar o espaço de trabalho",
"hint": "Espaço de trabalho",
"notFoundError": "Espaço de trabalho não encontrado",
"failedToLoad": "Algo deu errado! Falha ao carregar o espaço de trabalho. Tente fechar qualquer instância aberta do @:appName e tente novamente.",
"errorActions": {
"reportIssue": "Reporte um problema",
"reportIssueOnGithub": "Reportar um problema no Github",
"exportLogFiles": "Exportar arquivos de log",
"reachOut": "Entre em contato no Discord"
}
},
"menuTitle": "Espaços de trabalho",
"deleteWorkspaceHintText": "Tem certeza de que deseja excluir o espaço de trabalho? Esta ação não pode ser desfeita, e quaisquer páginas que você tenha publicado deixarão de estar publicadas.",
"createSuccess": "Espaço de trabalho criado com sucesso",
"createFailed": "Falha ao criar espaço de trabalho",
"createLimitExceeded": "Você atingiu o limite máximo de espaços de trabalho permitido para sua conta. Se precisar de espaços de trabalho adicionais para continuar seu trabalho, solicite no Github",
"deleteSuccess": "Espaço de trabalho excluído com sucesso",
"deleteFailed": "Falha ao excluir o espaço de trabalho",
"openSuccess": "Espaço de trabalho aberto com sucesso",
"openFailed": "Falha ao abrir o espaço de trabalho",
"renameSuccess": "Espaço de trabalho renomeado com sucesso",
"renameFailed": "Falha ao renomear o espaço de trabalho",
"updateIconSuccess": "Ícone do espaço de trabalho atualizado com sucesso",
"updateIconFailed": "Falha ao atualizar ícone do espaço de trabalho",
"cannotDeleteTheOnlyWorkspace": "Não é possível excluir o único espaço de trabalho",
"fetchWorkspacesFailed": "Falha ao buscar espaços de trabalho",
"leaveCurrentWorkspace": "Sair do espaço de trabalho",
"leaveCurrentWorkspacePrompt": "Tem certeza de que deseja sair do espaço de trabalho atual?"
},
"shareAction": {
"buttonText": "Compartilhar",
"workInProgress": "Em breve",
"markdown": "Marcador",
"clipboard": "Copiar para área de transferência",
"csv": "CSV",
"copyLink": "Copiar link"
"copyLink": "Copiar link",
"publishToTheWeb": "Publicar na Web",
"publishToTheWebHint": "Crie um site com AppFlowy",
"publish": "Publicar",
"unPublish": "Remover publicação",
"visitSite": "Visitar site",
"exportAsTab": "Exportar como",
"publishTab": "Publicar",
"shareTab": "Compartilhar"
},
"moreAction": {
"small": "pequeno",
@ -77,7 +129,12 @@
"large": "grande",
"fontSize": "Tamanho da fonte",
"import": "Importar",
"moreOptions": "Mais opções"
"moreOptions": "Mais opções",
"wordCount": "Contagem de palavras: {}",
"charCount": "Contagem de caracteres: {}",
"createdAt": "Criado: {}",
"deleteView": "Excluir",
"duplicateView": "Duplicar"
},
"importPanel": {
"textAndMarkdown": "Texto e Remarcação",
@ -95,7 +152,9 @@
"openNewTab": "Abrir em uma nova guia",
"moveTo": "Mover para",
"addToFavorites": "Adicionar aos favoritos",
"copyLink": "Copiar link"
"copyLink": "Copiar link",
"changeIcon": "Alterar ícone",
"collapseAllPages": "Recolher todas as subpáginas"
},
"blankPageTitle": "Página em branco",
"newPageText": "Nova página",
@ -103,6 +162,32 @@
"newGridText": "Nova grelha",
"newCalendarText": "Novo calendário",
"newBoardText": "Novo quadro",
"chat": {
"newChat": "Bate-papo com IA",
"inputMessageHint": "Pergunte a IA @:appName",
"inputLocalAIMessageHint": "Pergunte a IA local @:appName",
"unsupportedCloudPrompt": "Este recurso só está disponível ao usar a nuvem @:appName",
"relatedQuestion": "Relacionado",
"serverUnavailable": "Serviço Temporariamente Indisponível. Tente novamente mais tarde.",
"aiServerUnavailable": "🌈 Uh-oh! 🌈. Um unicórnio comeu nossa resposta. Por favor, tente novamente!",
"clickToRetry": "Clique para tentar novamente",
"regenerateAnswer": "Gerar novamente",
"question1": "Como usar Kanban para gerenciar tarefas",
"question2": "Explique o método GTD",
"question3": "Por que usar Rust",
"question4": "Receita com o que tenho na cozinha",
"aiMistakePrompt": "A IA pode cometer erros. Verifique informações importantes.",
"chatWithFilePrompt": "Você quer conversar com o arquivo?",
"indexFileSuccess": "Arquivo indexado com sucesso",
"inputActionNoPages": "Nenhum resultado",
"referenceSource": "{} fonte encontrada",
"referenceSources": "{} fontes encontradas",
"clickToMention": "Clique para mencionar uma página",
"uploadFile": "Carregue arquivos PDFs, md ou txt para conversar",
"questionTitle": "Ideias",
"questionDetail": "Olá {}! Como posso te ajudar hoje?",
"indexingFile": "Indexando {}"
},
"trash": {
"text": "Lixeira",
"restoreAll": "Restaurar tudo",
@ -126,7 +211,8 @@
"emptyDescription": "Você não tem nenhum arquivo excluído",
"isDeleted": "foi deletado",
"isRestored": "foi restaurado"
}
},
"confirmDeleteTitle": "Tem certeza de que deseja excluir esta página permanentemente?"
},
"deletePagePrompt": {
"text": "Está página está na lixeira",
@ -180,17 +266,53 @@
"dragRow": "Pressione e segure para reordenar a linha",
"viewDataBase": "Visualizar banco de dados",
"referencePage": "Esta {name} é uma referência",
"addBlockBelow": "Adicione um bloco abaixo"
"addBlockBelow": "Adicione um bloco abaixo",
"aiGenerate": "Gerar"
},
"sideBar": {
"closeSidebar": "Fechar barra lateral",
"openSidebar": "Abrir barra lateral",
"personal": "Pessoal",
"private": "Privado",
"workspace": "Espaço de trabalho",
"favorites": "Favoritos",
"clickToHidePrivate": "Clique para ocultar o espaço privado\nAs páginas que você criou aqui são visíveis apenas para você",
"clickToHideWorkspace": "Clique para ocultar o espaço de trabalho\nAs páginas que você criou aqui são visíveis para todos os membros",
"clickToHidePersonal": "Clique para ocultar a seção pessoal",
"clickToHideFavorites": "Clique para ocultar a seção favorita",
"addAPage": "Adicionar uma página",
"recent": "Recentes"
"addAPageToPrivate": "Adicionar uma página ao espaço privado",
"addAPageToWorkspace": "Adicionar uma página ao espaço de trabalho",
"recent": "Recentes",
"today": "Hoje",
"thisWeek": "Essa semana",
"others": "Favoritos anteriores",
"justNow": "agora mesmo",
"minutesAgo": "{count} minutos atrás",
"lastViewed": "Última visualização",
"favoriteAt": "Favorito",
"emptyRecent": "Nenhum documento recente",
"emptyRecentDescription": "Conforme você visualiza os documentos, eles aparecerão aqui para fácil recuperação",
"emptyFavorite": "Nenhum documento favorito",
"emptyFavoriteDescription": "Comece a explorar e marque os documentos como favoritos. Eles serão listados aqui para acesso rápido!",
"removePageFromRecent": "Remover esta página dos Recentes?",
"removeSuccess": "Removido com sucesso",
"favoriteSpace": "Favoritos",
"RecentSpace": "Recente",
"Spaces": "Espaços",
"upgradeToPro": "Atualizar para Pro",
"upgradeToAIMax": "Desbloqueie IA ilimitada",
"storageLimitDialogTitle": "Você ficou sem armazenamento gratuito. Atualize para desbloquear armazenamento ilimitado",
"aiResponseLimitTitle": "Você ficou sem respostas de IA gratuitas. Atualize para o Plano Pro ou adquira um complemento de IA para desbloquear respostas ilimitadas",
"aiResponseLimitDialogTitle": "Limite de respostas de IA atingido",
"aiResponseLimit": "Você ficou sem respostas de IA gratuitas.\n\nVá para Configurações -> Plano -> Clique em AI Max ou Plano Pro para obter mais respostas de IA",
"askOwnerToUpgradeToPro": "Seu espaço de trabalho está ficando sem armazenamento gratuito. Peça ao proprietário do seu espaço de trabalho para atualizar para o Plano Pro",
"askOwnerToUpgradeToAIMax": "Seu espaço de trabalho está ficando sem respostas de IA gratuitas. Peça ao proprietário do seu espaço de trabalho para atualizar o plano ou adquirir complementos de IA",
"purchaseStorageSpace": "Adquirir espaço de armazenamento",
"purchaseAIResponse": "Adquirir ",
"askOwnerToUpgradeToLocalAI": "Peça ao proprietário do espaço de trabalho para habilitar a IA no dispositivo",
"upgradeToAILocal": "Execute modelos locais no seu dispositivo para máxima privacidade",
"upgradeToAILocalDesc": "Converse com PDFs, melhore sua escrita e preencha tabelas automaticamente usando IA local"
},
"notifications": {
"export": {
@ -206,6 +328,7 @@
},
"button": {
"ok": "OK",
"confirm": "Confirmar",
"done": "Feito",
"cancel": "Cancelar",
"signIn": "Conectar",
@ -228,11 +351,34 @@
"update": "Atualizar",
"share": "Compartilhar",
"removeFromFavorites": "Remover dos favoritos",
"removeFromRecent": "Remover dos recentes",
"addToFavorites": "Adicionar aos favoritos",
"favoriteSuccessfully": "Adicionado aos favoritos",
"unfavoriteSuccessfully": "Removido dos favoritos",
"duplicateSuccessfully": "Duplicado com sucesso",
"rename": "Renomear",
"helpCenter": "Central de Ajuda",
"add": "Adicionar",
"yes": "Sim",
"no": "Não",
"clear": "Limpar",
"remove": "Remover",
"dontRemove": "Não remova",
"copyLink": "Copiar Link",
"align": "Alinhar",
"login": "Entrar",
"logout": "Sair",
"deleteAccount": "Deletar conta",
"back": "Voltar",
"signInGoogle": "Continuar com o Google",
"signInGithub": "Continuar com o Github",
"signInDiscord": "Continuar com o Discord",
"more": "Mais",
"create": "Criar",
"close": "Fechar",
"next": "Próximo",
"previous": "Anterior",
"submit": "Enviar",
"tryAGain": "Tentar novamente"
},
"label": {
@ -257,6 +403,190 @@
},
"settings": {
"title": "Configurações",
"popupMenuItem": {
"settings": "Configurações",
"members": "Membros",
"trash": "Lixo",
"helpAndSupport": "Ajuda e Suporte"
},
"accountPage": {
"menuLabel": "Minha conta",
"title": "Minha conta",
"general": {
"title": "Nome da conta e foto de perfil",
"changeProfilePicture": "Alterar foto do perfil"
},
"email": {
"title": "E-mail",
"actions": {
"change": "Alterar e-mail"
}
},
"login": {
"title": "Entrar com uma conta",
"loginLabel": "Entrar",
"logoutLabel": "Sair"
}
},
"workspacePage": {
"menuLabel": "Espaço de trabalho",
"title": "Espaço de trabalho",
"description": "Personalize a aparência do seu espaço de trabalho, tema, fonte, layout de texto, formato de data/hora e idioma.",
"workspaceName": {
"title": "Nome do espaço de trabalho"
},
"workspaceIcon": {
"title": "Ícone do espaço de trabalho",
"description": "Carregue uma imagem ou use um emoji para seu espaço de trabalho. O ícone será exibido na sua barra lateral e notificações."
},
"appearance": {
"title": "Aparência",
"description": "Personalize a aparência do seu espaço de trabalho, tema, fonte, layout de texto, data, hora e idioma.",
"options": {
"system": "Automático",
"light": "Claro",
"dark": "Escuro"
}
},
"resetCursorColor": {
"title": "Redefinir a cor do cursor do documento",
"description": "Tem certeza de que deseja redefinir a cor do cursor?"
},
"resetSelectionColor": {
"title": "Redefinir cor de seleção de documento",
"description": "Tem certeza de que deseja redefinir a cor de seleção?"
},
"theme": {
"title": "Tema",
"description": "Selecione um tema predefinido ou carregue seu próprio tema personalizado.",
"uploadCustomThemeTooltip": "Carregar um tema personalizado"
},
"workspaceFont": {
"title": "Fonte do espaço de trabalho",
"noFontHint": "Nenhuma fonte encontrada, tente outro termo."
},
"textDirection": {
"title": "Direção do texto",
"leftToRight": "Da esquerda para a direita",
"rightToLeft": "Da direita para a esquerda",
"auto": "Automático",
"enableRTLItems": "Habilitar items da barra de ferramenta da direita para a esquerda"
},
"layoutDirection": {
"title": "Direção do layout",
"leftToRight": "Da esquerda para a direita",
"rightToLeft": "Da direita para a esquerda"
},
"dateTime": {
"title": "Data e hora",
"example": "{} as {} ({})",
"24HourTime": "Tempo de 24 horas",
"dateFormat": {
"label": "Formato de data",
"us": "EUA",
"friendly": "Amigável"
}
},
"language": {
"title": "Língua"
},
"deleteWorkspacePrompt": {
"title": "Excluir espaço de trabalho",
"content": "Tem certeza de que deseja excluir este espaço de trabalho? Esta ação não pode ser desfeita, e quaisquer páginas que você tenha publicado deixarão de estar publicadas."
},
"leaveWorkspacePrompt": {
"title": "Sair do espaço de trabalho",
"content": "Tem certeza de que deseja sair deste espaço de trabalho? Você perderá o acesso a todas as páginas e dados dentro dele."
},
"manageWorkspace": {
"title": "Gerenciar espaço de trabalho",
"leaveWorkspace": "Sair do espaço de trabalho",
"deleteWorkspace": "Excluir espaço de trabalho"
}
},
"manageDataPage": {
"menuLabel": "Gerenciar dados",
"title": "Gerenciar dados",
"description": "Gerencie o armazenamento local de dados ou importe seus dados existentes para @:appName .",
"dataStorage": {
"title": "Local de armazenamento de arquivos",
"tooltip": "O local onde seus arquivos são armazenados",
"actions": {
"change": "Mudar caminho",
"open": "Abrir pasta",
"openTooltip": "Abrir local da pasta de dados atual",
"copy": "Copiar caminho",
"copiedHint": "Caminho copiado!",
"resetTooltip": "Redefinir para o local padrão"
},
"resetDialog": {
"title": "Tem certeza?",
"description": "Redefinir o caminho para o local de dados padrão não excluirá seus dados. Se você quiser reimportar seus dados atuais, você deve copiar o caminho do seu local atual primeiro."
}
},
"importData": {
"title": "Importar dados",
"tooltip": "Importar dados das pastas de backups/dados de @:appName",
"description": "Copiar dados de uma pasta de dados externa ao @:appName",
"action": "Selecionar arquivo"
},
"encryption": {
"title": "Criptografia",
"tooltip": "Gerencie como seus dados são armazenados e criptografados",
"descriptionNoEncryption": "Ativar a criptografia criptografará todos os dados. Isso não pode ser desfeito.",
"descriptionEncrypted": "Seus dados estão criptografados.",
"action": "Criptografar dados",
"dialog": {
"title": "Criptografar todos os seus dados?",
"description": "Criptografar todos os seus dados manterá seus dados seguros e protegidos. Esta ação NÃO pode ser desfeita. Tem certeza de que deseja continuar?"
}
},
"cache": {
"title": "Limpar cache",
"description": "Ajude a resolver problemas como imagem não carregando, páginas faltando em um espaço e fontes não carregando. Isso não afetará seus dados.",
"dialog": {
"title": "Limpar cache",
"description": "Ajude a resolver problemas como imagem não carregando, páginas faltando em um espaço e fontes não carregando. Isso não afetará seus dados.",
"successHint": "Cache limpo!"
}
},
"data": {
"fixYourData": "Corrija seus dados",
"fixButton": "Corrigir",
"fixYourDataDescription": "Se estiver com problemas com seus dados, você pode tentar corrigi-los aqui."
}
},
"shortcutsPage": {
"menuLabel": "Atalhos",
"title": "Atalhos",
"editBindingHint": "Insira uma nova combinação",
"searchHint": "Pesquisar",
"actions": {
"resetDefault": "Redefinir padrão"
},
"errorPage": {
"message": "Falha ao carregar atalhos: {}",
"howToFix": "Por favor, tente novamente. Se o problema persistir, entre em contato pelo GitHub."
},
"resetDialog": {
"title": "Redefinir atalhos",
"description": "Isso redefinirá todas as suas combinações de teclas para o padrão. Você não poderá desfazer isso depois. Tem certeza de que deseja continuar?",
"buttonLabel": "Redefinir"
},
"conflictDialog": {
"title": "{} já está em uso",
"descriptionPrefix": "Esta combinação de teclas está sendo usada atualmente por ",
"descriptionSuffix": ". Se você substituir esta combinação de teclas, ela será removida de {}.",
"confirmLabel": "Continuar"
},
"editTooltip": "Pressione para começar a editar a combinação de teclas",
"keybindings": {
"toggleToDoList": "Alternar para a lista de tarefas",
"insertNewParagraphInCodeblock": "Inserir novo parágrafo",
"pasteInCodeblock": "Colar bloco de código",
"selectAllCodeblock": "Selecionar tudo"
}
},
"menu": {
"appearance": "Aparência",
"language": "Idioma",

File diff suppressed because it is too large Load Diff

View File

@ -163,7 +163,7 @@ checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da"
[[package]]
name = "app-error"
version = "0.1.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=c9504d4081a8d9893830dc6598429353b078271b#c9504d4081a8d9893830dc6598429353b078271b"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=52782033948b7d243693ca159ea519d53458c8a6#52782033948b7d243693ca159ea519d53458c8a6"
dependencies = [
"anyhow",
"bincode",
@ -183,7 +183,7 @@ dependencies = [
[[package]]
name = "appflowy-ai-client"
version = "0.1.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=c9504d4081a8d9893830dc6598429353b078271b#c9504d4081a8d9893830dc6598429353b078271b"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=52782033948b7d243693ca159ea519d53458c8a6#52782033948b7d243693ca159ea519d53458c8a6"
dependencies = [
"anyhow",
"bytes",
@ -729,7 +729,7 @@ dependencies = [
[[package]]
name = "client-api"
version = "0.2.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=c9504d4081a8d9893830dc6598429353b078271b#c9504d4081a8d9893830dc6598429353b078271b"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=52782033948b7d243693ca159ea519d53458c8a6#52782033948b7d243693ca159ea519d53458c8a6"
dependencies = [
"again",
"anyhow",
@ -780,7 +780,7 @@ dependencies = [
[[package]]
name = "client-api-entity"
version = "0.1.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=c9504d4081a8d9893830dc6598429353b078271b#c9504d4081a8d9893830dc6598429353b078271b"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=52782033948b7d243693ca159ea519d53458c8a6#52782033948b7d243693ca159ea519d53458c8a6"
dependencies = [
"collab-entity",
"collab-rt-entity",
@ -793,7 +793,7 @@ dependencies = [
[[package]]
name = "client-websocket"
version = "0.1.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=c9504d4081a8d9893830dc6598429353b078271b#c9504d4081a8d9893830dc6598429353b078271b"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=52782033948b7d243693ca159ea519d53458c8a6#52782033948b7d243693ca159ea519d53458c8a6"
dependencies = [
"futures-channel",
"futures-util",
@ -836,7 +836,7 @@ dependencies = [
[[package]]
name = "collab"
version = "0.2.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=49cf2206d7494bb3006402b807e7f171905213e3#49cf2206d7494bb3006402b807e7f171905213e3"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac#47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac"
dependencies = [
"anyhow",
"arc-swap",
@ -861,7 +861,7 @@ dependencies = [
[[package]]
name = "collab-database"
version = "0.2.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=49cf2206d7494bb3006402b807e7f171905213e3#49cf2206d7494bb3006402b807e7f171905213e3"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac#47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac"
dependencies = [
"anyhow",
"async-trait",
@ -890,7 +890,7 @@ dependencies = [
[[package]]
name = "collab-document"
version = "0.2.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=49cf2206d7494bb3006402b807e7f171905213e3#49cf2206d7494bb3006402b807e7f171905213e3"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac#47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac"
dependencies = [
"anyhow",
"arc-swap",
@ -910,7 +910,7 @@ dependencies = [
[[package]]
name = "collab-entity"
version = "0.2.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=49cf2206d7494bb3006402b807e7f171905213e3#49cf2206d7494bb3006402b807e7f171905213e3"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac#47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac"
dependencies = [
"anyhow",
"bytes",
@ -929,7 +929,7 @@ dependencies = [
[[package]]
name = "collab-folder"
version = "0.2.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=49cf2206d7494bb3006402b807e7f171905213e3#49cf2206d7494bb3006402b807e7f171905213e3"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac#47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac"
dependencies = [
"anyhow",
"arc-swap",
@ -972,7 +972,7 @@ dependencies = [
[[package]]
name = "collab-plugins"
version = "0.2.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=49cf2206d7494bb3006402b807e7f171905213e3#49cf2206d7494bb3006402b807e7f171905213e3"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac#47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac"
dependencies = [
"anyhow",
"async-stream",
@ -1010,7 +1010,7 @@ dependencies = [
[[package]]
name = "collab-rt-entity"
version = "0.1.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=c9504d4081a8d9893830dc6598429353b078271b#c9504d4081a8d9893830dc6598429353b078271b"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=52782033948b7d243693ca159ea519d53458c8a6#52782033948b7d243693ca159ea519d53458c8a6"
dependencies = [
"anyhow",
"bincode",
@ -1035,7 +1035,7 @@ dependencies = [
[[package]]
name = "collab-rt-protocol"
version = "0.1.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=c9504d4081a8d9893830dc6598429353b078271b#c9504d4081a8d9893830dc6598429353b078271b"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=52782033948b7d243693ca159ea519d53458c8a6#52782033948b7d243693ca159ea519d53458c8a6"
dependencies = [
"anyhow",
"async-trait",
@ -1052,7 +1052,7 @@ dependencies = [
[[package]]
name = "collab-user"
version = "0.2.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=49cf2206d7494bb3006402b807e7f171905213e3#49cf2206d7494bb3006402b807e7f171905213e3"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac#47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac"
dependencies = [
"anyhow",
"collab",
@ -1395,7 +1395,7 @@ checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308"
[[package]]
name = "database-entity"
version = "0.1.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=c9504d4081a8d9893830dc6598429353b078271b#c9504d4081a8d9893830dc6598429353b078271b"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=52782033948b7d243693ca159ea519d53458c8a6#52782033948b7d243693ca159ea519d53458c8a6"
dependencies = [
"anyhow",
"app-error",
@ -2795,7 +2795,7 @@ dependencies = [
[[package]]
name = "gotrue"
version = "0.1.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=c9504d4081a8d9893830dc6598429353b078271b#c9504d4081a8d9893830dc6598429353b078271b"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=52782033948b7d243693ca159ea519d53458c8a6#52782033948b7d243693ca159ea519d53458c8a6"
dependencies = [
"anyhow",
"futures-util",
@ -2812,7 +2812,7 @@ dependencies = [
[[package]]
name = "gotrue-entity"
version = "0.1.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=c9504d4081a8d9893830dc6598429353b078271b#c9504d4081a8d9893830dc6598429353b078271b"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=52782033948b7d243693ca159ea519d53458c8a6#52782033948b7d243693ca159ea519d53458c8a6"
dependencies = [
"anyhow",
"app-error",
@ -3177,7 +3177,7 @@ dependencies = [
[[package]]
name = "infra"
version = "0.1.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=c9504d4081a8d9893830dc6598429353b078271b#c9504d4081a8d9893830dc6598429353b078271b"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=52782033948b7d243693ca159ea519d53458c8a6#52782033948b7d243693ca159ea519d53458c8a6"
dependencies = [
"anyhow",
"bytes",
@ -5377,7 +5377,7 @@ dependencies = [
[[package]]
name = "shared-entity"
version = "0.1.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=c9504d4081a8d9893830dc6598429353b078271b#c9504d4081a8d9893830dc6598429353b078271b"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=52782033948b7d243693ca159ea519d53458c8a6#52782033948b7d243693ca159ea519d53458c8a6"
dependencies = [
"anyhow",
"app-error",

View File

@ -100,8 +100,8 @@ dashmap = "6.0.1"
# Run the script.add_workspace_members:
# scripts/tool/update_client_api_rev.sh new_rev_id
# ⚠️⚠️⚠️️
client-api = { git = "https://github.com/AppFlowy-IO/AppFlowy-Cloud", rev = "c9504d4081a8d9893830dc6598429353b078271b" }
client-api-entity = { git = "https://github.com/AppFlowy-IO/AppFlowy-Cloud", rev = "c9504d4081a8d9893830dc6598429353b078271b" }
client-api = { git = "https://github.com/AppFlowy-IO/AppFlowy-Cloud", rev = "52782033948b7d243693ca159ea519d53458c8a6" }
client-api-entity = { git = "https://github.com/AppFlowy-IO/AppFlowy-Cloud", rev = "52782033948b7d243693ca159ea519d53458c8a6" }
[profile.dev]
opt-level = 0
@ -136,13 +136,13 @@ rocksdb = { git = "https://github.com/rust-rocksdb/rust-rocksdb", rev = "1710120
# To switch to the local path, run:
# scripts/tool/update_collab_source.sh
# ⚠️⚠️⚠️️
collab = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "49cf2206d7494bb3006402b807e7f171905213e3" }
collab-entity = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "49cf2206d7494bb3006402b807e7f171905213e3" }
collab-folder = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "49cf2206d7494bb3006402b807e7f171905213e3" }
collab-document = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "49cf2206d7494bb3006402b807e7f171905213e3" }
collab-database = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "49cf2206d7494bb3006402b807e7f171905213e3" }
collab-plugins = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "49cf2206d7494bb3006402b807e7f171905213e3" }
collab-user = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "49cf2206d7494bb3006402b807e7f171905213e3" }
collab = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac" }
collab-entity = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac" }
collab-folder = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac" }
collab-document = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac" }
collab-database = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac" }
collab-plugins = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac" }
collab-user = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "47dbd6c8033f8fd2999cb8d11f2d60ede121a0ac" }
# Working directory: frontend
# To update the commit ID, run:

View File

@ -25,11 +25,11 @@ use collab_plugins::local_storage::indexeddb::IndexeddbDiskPlugin;
}
pub use crate::plugin_provider::CollabCloudPluginProvider;
use collab::lock::RwLock;
use collab_plugins::local_storage::kv::doc::CollabKVAction;
use collab_plugins::local_storage::kv::KVTransactionDB;
use collab_plugins::local_storage::CollabPersistenceConfig;
use collab_user::core::{UserAwareness, UserAwarenessNotifier};
use tokio::sync::RwLock;
use lib_infra::{if_native, if_wasm};
use tracing::{error, instrument, trace, warn};

View File

@ -16,10 +16,6 @@ pub fn watch_offline_app() -> FlowyResult<(WatchContext, UnboundedReceiver<Watch
let install_path = install_path().ok_or_else(|| {
FlowyError::internal().with_context("Unsupported platform for offline app watching")
})?;
trace!(
"[LLM Resource] Start watching offline app path: {:?}",
install_path,
);
let (tx, rx) = unbounded_channel();
let app_path = offline_app_path();
let mut watcher = notify::recommended_watcher(move |res: Result<Event, _>| match res {

View File

@ -6,6 +6,7 @@ use std::collections::HashMap;
use std::sync::{Arc, Weak};
use collab::core::collab::DataSource;
use collab::lock::RwLock;
use collab::preclude::Collab;
use collab_database::database::{Database, DatabaseData};
use collab_database::entity::{CreateDatabaseParams, CreateViewParams};
@ -20,7 +21,7 @@ use collab_entity::{CollabObject, CollabType, EncodedCollab};
use collab_plugins::local_storage::kv::KVTransactionDB;
use dashmap::DashMap;
use tokio::select;
use tokio::sync::{Mutex, RwLock};
use tokio::sync::Mutex;
use tokio_util::sync::CancellationToken;
use tracing::{error, info, instrument, trace};
@ -39,6 +40,7 @@ use crate::services::cell::stringify_cell;
use crate::services::database::DatabaseEditor;
use crate::services::database_view::DatabaseLayoutDepsResolver;
use crate::services::field::translate_type_option::translate::TranslateTypeOption;
use tokio::sync::RwLock as TokioRwLock;
use crate::services::field_settings::default_field_settings_by_layout_map;
use crate::services::share::csv::{CSVFormat, CSVImporter, ImportResult};
@ -53,7 +55,7 @@ pub trait DatabaseUser: Send + Sync {
pub struct DatabaseManager {
user: Arc<dyn DatabaseUser>,
workspace_database: ArcSwapOption<RwLock<WorkspaceDatabase>>,
task_scheduler: Arc<RwLock<TaskDispatcher>>,
task_scheduler: Arc<TokioRwLock<TaskDispatcher>>,
editors: Mutex<HashMap<String, Arc<DatabaseEditor>>>,
removing_editor: Arc<Mutex<HashMap<String, Arc<DatabaseEditor>>>>,
collab_builder: Arc<AppFlowyCollabBuilder>,
@ -64,7 +66,7 @@ pub struct DatabaseManager {
impl DatabaseManager {
pub fn new(
database_user: Arc<dyn DatabaseUser>,
task_scheduler: Arc<RwLock<TaskDispatcher>>,
task_scheduler: Arc<TokioRwLock<TaskDispatcher>>,
collab_builder: Arc<AppFlowyCollabBuilder>,
cloud_service: Arc<dyn DatabaseCloudService>,
ai_service: Arc<dyn DatabaseAIService>,
@ -370,7 +372,7 @@ impl DatabaseManager {
) -> FlowyResult<EncodedCollab> {
let database_data = DatabaseData::from_json_bytes(data)?;
let mut create_database_params = CreateDatabaseParams::from_database_data(database_data);
let mut create_database_params = CreateDatabaseParams::from_database_data(database_data, None);
let old_view_id = create_database_params.inline_view_id.clone();
create_database_params.inline_view_id = view_id.to_string();
@ -813,7 +815,9 @@ impl DatabaseCollabService for WorkspaceDatabaseCollabServiceImpl {
}
},
Err(err) => {
if !matches!(err, DatabaseError::ActionCancelled) {
error!("build collab: failed to get encode collab: {}", err);
}
return Err(err);
},
}
@ -906,27 +910,26 @@ impl DatabaseCollabPersistenceService for DatabasePersistenceImpl {
}
}
fn flush_collab(
fn flush_collabs(
&self,
object_id: &str,
encode_collab: EncodedCollab,
encoded_collabs: Vec<(String, EncodedCollab)>,
) -> Result<(), DatabaseError> {
let uid = self
.user
.user_id()
.map_err(|err| DatabaseError::Internal(err.into()))?;
if let Ok(Some(collab_db)) = self.user.collab_db(uid).map(|weak| weak.upgrade()) {
trace!("[Database]: flush collab:{}", object_id);
let write_txn = collab_db.write_txn();
for (object_id, encode_collab) in encoded_collabs {
write_txn
.flush_doc(
uid,
object_id,
&object_id,
encode_collab.state_vector.to_vec(),
encode_collab.doc_state.to_vec(),
)
.map_err(|err| DatabaseError::Internal(anyhow!("failed to flush doc: {}", err)))?;
}
write_txn
.commit_transaction()
.map_err(|err| DatabaseError::Internal(anyhow!("failed to commit transaction: {}", err)))?;

View File

@ -6,7 +6,7 @@ use collab_database::fields::Field;
use collab_database::rows::{Row, RowCell};
use flowy_error::FlowyResult;
use serde::{Deserialize, Serialize};
use tokio::sync::RwLock;
use tokio::sync::RwLock as TokioRwLock;
use lib_infra::priority_task::{QualityOfService, Task, TaskContent, TaskDispatcher};
@ -34,7 +34,7 @@ pub struct CalculationsController {
handler_id: String,
delegate: Box<dyn CalculationsDelegate>,
calculations_by_field_cache: CalculationsByFieldIdCache,
task_scheduler: Arc<RwLock<TaskDispatcher>>,
task_scheduler: Arc<TokioRwLock<TaskDispatcher>>,
calculations_service: CalculationsService,
notifier: DatabaseViewChangedNotifier,
}
@ -51,7 +51,7 @@ impl CalculationsController {
handler_id: &str,
delegate: T,
calculations: Vec<Arc<Calculation>>,
task_scheduler: Arc<RwLock<TaskDispatcher>>,
task_scheduler: Arc<TokioRwLock<TaskDispatcher>>,
notifier: DatabaseViewChangedNotifier,
) -> Self
where

View File

@ -22,6 +22,7 @@ use crate::utils::cache::AnyTypeCache;
use crate::DatabaseUser;
use arc_swap::ArcSwap;
use async_trait::async_trait;
use collab::lock::RwLock;
use collab_database::database::Database;
use collab_database::entity::DatabaseView;
use collab_database::fields::{Field, TypeOptionData};
@ -40,7 +41,8 @@ use lib_infra::util::timestamp;
use std::collections::HashMap;
use std::sync::Arc;
use std::time::Duration;
use tokio::sync::{broadcast, oneshot, RwLock};
use tokio::sync::RwLock as TokioRwLock;
use tokio::sync::{broadcast, oneshot};
use tokio_util::sync::CancellationToken;
use tracing::{debug, error, event, info, instrument, trace, warn};
@ -66,7 +68,7 @@ impl DatabaseEditor {
pub async fn new(
user: Arc<dyn DatabaseUser>,
database: Arc<RwLock<Database>>,
task_scheduler: Arc<RwLock<TaskDispatcher>>,
task_scheduler: Arc<TokioRwLock<TaskDispatcher>>,
collab_builder: Arc<AppFlowyCollabBuilder>,
) -> FlowyResult<Arc<Self>> {
let notification_sender = Arc::new(DebounceNotificationSender::new(200));
@ -1576,7 +1578,7 @@ impl DatabaseEditor {
struct DatabaseViewOperationImpl {
database: Arc<RwLock<Database>>,
task_scheduler: Arc<RwLock<TaskDispatcher>>,
task_scheduler: Arc<TokioRwLock<TaskDispatcher>>,
cell_cache: CellCache,
editor_by_view_id: Arc<RwLock<EditorByViewId>>,
database_cancellation: Arc<RwLock<Option<CancellationToken>>>,
@ -1860,7 +1862,7 @@ impl DatabaseViewOperation for DatabaseViewOperationImpl {
.update_layout_type(view_id, layout_type);
}
fn get_task_scheduler(&self) -> Arc<RwLock<TaskDispatcher>> {
fn get_task_scheduler(&self) -> Arc<TokioRwLock<TaskDispatcher>> {
self.task_scheduler.clone()
}

View File

@ -1,6 +1,7 @@
use crate::entities::{DatabaseSyncStatePB, DidFetchRowPB, RowsChangePB};
use crate::notification::{send_notification, DatabaseNotification, DATABASE_OBSERVABLE_SOURCE};
use crate::services::database::{DatabaseEditor, UpdatedRow};
use collab::lock::RwLock;
use collab_database::blocks::BlockEvent;
use collab_database::database::Database;
use collab_database::fields::FieldChange;
@ -10,7 +11,6 @@ use flowy_notification::{DebounceNotificationSender, NotificationBuilder};
use futures::StreamExt;
use lib_dispatch::prelude::af_spawn;
use std::sync::Arc;
use tokio::sync::RwLock;
use tracing::{trace, warn};
pub(crate) async fn observe_sync_state(database_id: &str, database: &Arc<RwLock<Database>>) {

View File

@ -1,10 +1,10 @@
use collab::lock::RwLock;
use collab_database::database::{gen_field_id, Database};
use collab_database::fields::Field;
use collab_database::views::{
DatabaseLayout, FieldSettingsByFieldIdMap, LayoutSetting, OrderObjectPosition,
};
use std::sync::Arc;
use tokio::sync::RwLock;
use crate::entities::FieldType;
use crate::services::field::{DateTypeOption, SingleSelectTypeOption};

View File

@ -1,4 +1,5 @@
use async_trait::async_trait;
use collab::lock::RwLock;
use collab_database::database::Database;
use collab_database::entity::DatabaseView;
use collab_database::fields::{Field, TypeOptionData};
@ -6,7 +7,7 @@ use collab_database::rows::{Row, RowCell, RowDetail, RowId};
use collab_database::views::{DatabaseLayout, LayoutSetting};
use std::collections::HashMap;
use std::sync::Arc;
use tokio::sync::RwLock;
use tokio::sync::RwLock as TokioRwLock;
use flowy_error::FlowyError;
use lib_infra::priority_task::TaskDispatcher;
@ -118,7 +119,7 @@ pub trait DatabaseViewOperation: Send + Sync + 'static {
async fn update_layout_type(&self, view_id: &str, layout_type: &DatabaseLayout);
/// Returns a `TaskDispatcher` used to poll a `Task`
fn get_task_scheduler(&self) -> Arc<RwLock<TaskDispatcher>>;
fn get_task_scheduler(&self) -> Arc<TokioRwLock<TaskDispatcher>>;
fn get_type_option_cell_handler(
&self,

View File

@ -2,14 +2,13 @@ use collab_database::database::Database;
use std::collections::HashMap;
use std::sync::Arc;
use nanoid::nanoid;
use tokio::sync::{broadcast, RwLock};
use flowy_error::FlowyResult;
use crate::services::cell::CellCache;
use crate::services::database::DatabaseRowEvent;
use crate::services::database_view::{DatabaseViewEditor, DatabaseViewOperation};
use collab::lock::RwLock;
use flowy_error::FlowyResult;
use nanoid::nanoid;
use tokio::sync::broadcast;
pub type RowEventSender = broadcast::Sender<DatabaseRowEvent>;
pub type RowEventReceiver = broadcast::Receiver<DatabaseRowEvent>;

View File

@ -3,6 +3,7 @@ use std::collections::HashMap;
use std::str::FromStr;
use std::sync::Arc;
use collab::lock::RwLock;
use collab_database::database::gen_database_filter_id;
use collab_database::fields::Field;
use collab_database::rows::{Cell, Cells, Row, RowDetail, RowId};
@ -10,7 +11,7 @@ use dashmap::DashMap;
use flowy_error::FlowyResult;
use lib_infra::priority_task::{QualityOfService, Task, TaskContent, TaskDispatcher};
use serde::{Deserialize, Serialize};
use tokio::sync::RwLock;
use tokio::sync::RwLock as TokioRwLock;
use tracing::{error, trace};
use crate::entities::filter_entities::*;
@ -41,7 +42,7 @@ pub struct FilterController {
result_by_row_id: DashMap<RowId, bool>,
cell_cache: CellCache,
filters: RwLock<Vec<Filter>>,
task_scheduler: Arc<RwLock<TaskDispatcher>>,
task_scheduler: Arc<TokioRwLock<TaskDispatcher>>,
notifier: DatabaseViewChangedNotifier,
}
@ -56,7 +57,7 @@ impl FilterController {
view_id: &str,
handler_id: &str,
delegate: T,
task_scheduler: Arc<RwLock<TaskDispatcher>>,
task_scheduler: Arc<TokioRwLock<TaskDispatcher>>,
cell_cache: CellCache,
notifier: DatabaseViewChangedNotifier,
) -> Self

View File

@ -8,7 +8,7 @@ use collab_database::fields::Field;
use collab_database::rows::{Cell, Row, RowId};
use rayon::prelude::ParallelSliceMut;
use serde::{Deserialize, Serialize};
use tokio::sync::RwLock;
use tokio::sync::RwLock as TokioRwLock;
use flowy_error::FlowyResult;
use lib_infra::priority_task::{QualityOfService, Task, TaskContent, TaskDispatcher};
@ -38,7 +38,7 @@ pub struct SortController {
view_id: String,
handler_id: String,
delegate: Box<dyn SortDelegate>,
task_scheduler: Arc<RwLock<TaskDispatcher>>,
task_scheduler: Arc<TokioRwLock<TaskDispatcher>>,
sorts: Vec<Arc<Sort>>,
cell_cache: CellCache,
row_index_cache: HashMap<RowId, usize>,
@ -57,7 +57,7 @@ impl SortController {
handler_id: &str,
sorts: Vec<Arc<Sort>>,
delegate: T,
task_scheduler: Arc<RwLock<TaskDispatcher>>,
task_scheduler: Arc<TokioRwLock<TaskDispatcher>>,
cell_cache: CellCache,
notifier: DatabaseViewChangedNotifier,
) -> Self

View File

@ -4,6 +4,7 @@ use std::sync::Weak;
use collab::core::collab::DataSource;
use collab::core::origin::CollabOrigin;
use collab::entity::EncodedCollab;
use collab::lock::RwLock;
use collab::preclude::Collab;
use collab_document::blocks::DocumentData;
use collab_document::conversions::convert_document_to_plain_text;
@ -17,7 +18,6 @@ use collab_plugins::local_storage::kv::KVTransactionDB;
use collab_plugins::CollabKVDB;
use dashmap::DashMap;
use lib_infra::util::timestamp;
use tokio::sync::RwLock;
use tracing::trace;
use tracing::{event, instrument};

View File

@ -22,6 +22,7 @@ use crate::view_operation::{
};
use arc_swap::ArcSwapOption;
use collab::core::collab::DataSource;
use collab::lock::RwLock;
use collab_entity::{CollabType, EncodedCollab};
use collab_folder::{
Folder, FolderData, FolderNotify, Section, SectionItem, TrashInfo, View, ViewLayout, ViewUpdate,
@ -44,7 +45,6 @@ use futures::future;
use std::collections::HashMap;
use std::fmt::{Display, Formatter};
use std::sync::{Arc, Weak};
use tokio::sync::RwLock;
use tracing::{error, info, instrument};
pub trait FolderUser: Send + Sync {

View File

@ -2,12 +2,12 @@ use crate::manager::{FolderInitDataSource, FolderManager};
use crate::manager_observer::*;
use crate::user_default::DefaultFolderBuilder;
use collab::core::collab::DataSource;
use collab::lock::RwLock;
use collab_entity::{CollabType, EncodedCollab};
use collab_folder::{Folder, FolderNotify};
use collab_integrate::CollabKVDB;
use flowy_error::{FlowyError, FlowyResult};
use std::sync::{Arc, Weak};
use tokio::sync::RwLock;
use tokio::task::spawn_blocking;
use tracing::{event, info, Level};

View File

@ -5,6 +5,7 @@ use crate::entities::{
use crate::manager::{get_workspace_private_view_pbs, get_workspace_public_view_pbs, FolderUser};
use crate::notification::{send_notification, FolderNotification};
use collab::core::collab_state::SyncState;
use collab::lock::RwLock;
use collab_folder::{
Folder, SectionChange, SectionChangeReceiver, TrashSectionChange, View, ViewChange,
ViewChangeReceiver,
@ -12,7 +13,6 @@ use collab_folder::{
use lib_dispatch::prelude::af_spawn;
use std::collections::HashSet;
use std::sync::Weak;
use tokio::sync::RwLock;
use tokio_stream::wrappers::WatchStream;
use tokio_stream::StreamExt;
use tracing::{event, trace, Level};

View File

@ -1,11 +1,11 @@
use crate::manager::{FolderManager, FolderUser};
use crate::view_operation::FolderOperationHandlers;
use collab::lock::RwLock;
use collab_folder::Folder;
use collab_integrate::collab_builder::AppFlowyCollabBuilder;
use flowy_folder_pub::cloud::FolderCloudService;
use flowy_search_pub::entities::FolderIndexManager;
use std::sync::Arc;
use tokio::sync::RwLock;
impl FolderManager {
pub fn get_mutex_folder(&self) -> Option<Arc<RwLock<Folder>>> {

View File

@ -14,7 +14,7 @@ use collab_database::database::{
is_database_collab, mut_database_views_with_collab, reset_inline_view_id,
};
use collab_database::rows::{database_row_document_id_from_row_id, mut_row_with_collab, RowId};
use collab_database::workspace_database::DatabaseMetaList;
use collab_database::workspace_database::WorkspaceDatabaseBody;
use collab_document::document_data::default_document_collab_data;
use collab_entity::CollabType;
use collab_folder::{Folder, UserId, View, ViewIdentifier, ViewLayout};
@ -353,7 +353,7 @@ where
&mut imported_database_indexer.transact_mut(),
)?;
let array = DatabaseMetaList::new(&mut imported_database_indexer);
let array = WorkspaceDatabaseBody::new(&mut imported_database_indexer);
for database_meta_list in array.get_all_database_meta(&imported_database_indexer.transact()) {
database_view_ids_by_database_id.insert(
old_to_new_id_map.exchange_new_id(&database_meta_list.database_id),
@ -403,7 +403,7 @@ where
let new_uid = new_user_session.user_id;
let new_object_id = &new_user_session.user_workspace.database_indexer_id;
let array = DatabaseMetaList::new(&mut database_with_views_collab);
let array = WorkspaceDatabaseBody::new(&mut database_with_views_collab);
let mut txn = database_with_views_collab.transact_mut();
for database_meta in array.get_all_database_meta(&txn) {
array.update_database(&mut txn, &database_meta.database_id, |update| {

View File

@ -3,6 +3,7 @@ use collab_integrate::CollabKVDB;
use flowy_error::{internal_error, ErrorCode, FlowyResult};
use arc_swap::ArcSwapOption;
use collab::lock::RwLock;
use collab_user::core::UserAwareness;
use dashmap::DashMap;
use flowy_server_pub::AuthenticatorType;
@ -18,7 +19,7 @@ use serde_json::Value;
use std::string::ToString;
use std::sync::atomic::{AtomicI64, Ordering};
use std::sync::{Arc, Weak};
use tokio::sync::{Mutex, RwLock};
use tokio::sync::Mutex;
use tokio_stream::StreamExt;
use tracing::{debug, error, event, info, instrument, trace, warn};

View File

@ -2,6 +2,7 @@ use std::sync::{Arc, Weak};
use anyhow::Context;
use collab::core::collab::DataSource;
use collab::lock::RwLock;
use collab_entity::reminder::Reminder;
use collab_entity::CollabType;
use collab_integrate::collab_builder::{
@ -9,7 +10,6 @@ use collab_integrate::collab_builder::{
};
use collab_user::core::{UserAwareness, UserAwarenessNotifier};
use dashmap::try_result::TryResult;
use tokio::sync::RwLock;
use tracing::{error, info, instrument, trace};
use collab_integrate::CollabKVDB;

View File

@ -73,7 +73,7 @@ FROM archlinux/archlinux
RUN pacman -Syyu --noconfirm
# Install runtime dependencies
RUN pacman -S --noconfirm xdg-user-dirs gtk3 libkeybinder3 && \
RUN pacman -S --noconfirm xdg-user-dirs gtk3 libkeybinder3 libnotify rocksdb && \
pacman -Scc --noconfirm
# Set up appflowy user