Compare commits

..
5 changed files with 163 additions and 3 deletions

No files matched your search

+67
View File
@@ -1,4 +1,71 @@
# Release Notes
## Version 0.9.9 – 11/09/2025
### Desktop
#### New Features
- Workspace user profile: customize your avatar, about me, and profile card banner
### Mobile
#### New Features
- Workspace user profile: customize your avatar, about me, and profile card banner
- Two new Android widgets: Recent Pages and Favorites
- A new iOS widget: Quick Page Access
- iOS Share to AppFlowy: quickly save browser page links with optional notes to a target AppFlowy page
## Version 0.9.8 – 28/08/2025
### Desktop
#### New Features
- Bulk add collaborators with Can view / Can edit permissions via the Share menu
- Enable setting the start of the week to Monday to control default calendar layouts in the calendar view and date picker
- Sync date and time formats, language, and week start day across devices under the same user account
- Offer 10 premium Select-option colors to Pro Plan users
- Support managing pending members via Settings → Members
### Mobile
#### New Features
- Support iOS widgets for quick access to recent and favorite pages
- Offer 10 premium Select option colors to Pro Plan users
- Support managing pending members via Settings → Members
## Version 0.9.7 – 13/08/2025
### Desktop
#### New Features
- Mention or assign persons in documents via '@' or '/'
- Mentioned persons get notified about the mention via email
- More colors are available for database Select options and page covers
- Back up your AppFlowy workspace: Export your workspace as a ZIP file and import it back at any time
- GPT-5 is now available in AppFlowy
### Mobile
#### New Features
- Mention or assign persons in documents via '@' or '/'
- Mentioned persons get notified about the mention via email
- More colors are available for database Select options and page cover
#### Bug Fixes
- Fixed login page UI overflow issues on small screen devices
## Version 0.9.6 – 05/08/2025
### Bug Fixes
- Fixed some syncing issues
- Improved the Share menu
- Fixed some UI issues related to database filters and sorts
## Version 0.9.5 – 17/07/2025
### Desktop
#### New Features
- Vault Workspace: A new workspace type, private and offline. AI runs locally with no data transfer. Supports switching embedding models, chatting with files (PDF, Markdown, TXT). Includes RAG search with AI-generated overviews.
- Revamped color pickers in documents: Expanded palette with support for custom colors
### Mobile
#### New Features
- iOS In‑App Sign‑In: Sign in directly within the iOS app
- New colors: Improved text and background color options
Bug Fixes
- Add a network connection indicator
- Fix sync bugs and issues with WebSocket connections.
## Version 0.9.4 – 02/07/2025
### Desktop
#### New Features
+1 -1
View File
@@ -26,7 +26,7 @@ CARGO_MAKE_EXTEND_WORKSPACE_MAKEFILE = true
CARGO_MAKE_CRATE_FS_NAME = "dart_ffi"
CARGO_MAKE_CRATE_NAME = "dart-ffi"
LIB_NAME = "dart_ffi"
APPFLOWY_VERSION = "0.9.4"
APPFLOWY_VERSION = "0.9.9"
FLUTTER_DESKTOP_FEATURES = "dart"
PRODUCT_NAME = "AppFlowy"
MACOSX_DEPLOYMENT_TARGET = "11.0"
@@ -217,9 +217,52 @@ class _DateTimeTextFieldState extends State<DateTimeTextField> {
}
DateTime? parseDateTimeStr(String string) {
final trimmedString = string.trim();
// First try to parse using the configured date format
try {
final result = dateFormat.parseStrict(trimmedString);
if (!result.isBefore(kFirstDay) && !result.isAfter(kLastDay)) {
return result;
}
} catch (_) {
// If strict parsing fails, try lenient parsing
try {
final result = dateFormat.parse(trimmedString);
if (!result.isBefore(kFirstDay) && !result.isAfter(kLastDay)) {
return result;
}
} catch (_) {
// Continue to fallback parser
}
}
// If the string includes time, try to parse with the combined format
if (widget.includeTime && widget.timeFormat != null) {
final combinedFormat = DateFormat(
"${widget.dateFormat.pattern} ${widget.timeFormat!.pattern}",
);
try {
final result = combinedFormat.parseStrict(trimmedString);
if (!result.isBefore(kFirstDay) && !result.isAfter(kLastDay)) {
return result;
}
} catch (_) {
try {
final result = combinedFormat.parse(trimmedString);
if (!result.isBefore(kFirstDay) && !result.isAfter(kLastDay)) {
return result;
}
} catch (_) {
// Continue to fallback parser
}
}
}
// Fallback to locale-based parsing for natural language dates
final locale = context.locale.toLanguageTag();
final parser = AnyDate.fromLocale(locale);
final result = parser.tryParse(string);
final result = parser.tryParse(trimmedString);
if (result == null ||
result.isBefore(kFirstDay) ||
result.isAfter(kLastDay)) {
+1 -1
View File
@@ -4,7 +4,7 @@ description: Bring projects, wikis, and teams together with AI. AppFlowy is an
your data. The best open source alternative to Notion.
publish_to: "none"
version: 0.9.4
version: 0.9.9
environment:
flutter: ">=3.27.4"
@@ -836,6 +836,56 @@ void main() {
expect(mockState.data.endDateTime, end);
});
testWidgets('date format is respected when parsing typed dates',
(tester) async {
// Test DayMonthYear format (dd/MM/y)
await tester.pumpWidget(
WidgetTestApp(
child: _MockDatePicker(
dateFormat: DateFormatPB.DayMonthYear,
data: _DatePickerDataStub.empty(),
),
),
);
await tester.pumpAndSettle();
final dateTextField = find.byKey(const ValueKey('date_time_text_field_date'));
expect(dateTextField, findsOneWidget);
// Enter 2/9/2025 which should be September 2nd in D/M/Y format
await tester.enterText(dateTextField, "2/9/2025");
await tester.testTextInput.receiveAction(TextInputAction.done);
await tester.pumpAndSettle();
final expectedDate = DateTime(2025, 9, 2);
final mockState = getMockState(tester);
expect(mockState.data.dateTime, expectedDate);
// Test US format (y/MM/dd)
mockState.updateDateFormat(DateFormatPB.US);
await tester.pumpAndSettle();
// Enter 2025/2/9 which should be February 9th in Y/M/D format
await tester.enterText(dateTextField, "2025/2/9");
await tester.testTextInput.receiveAction(TextInputAction.done);
await tester.pumpAndSettle();
final expectedDate2 = DateTime(2025, 2, 9);
expect(mockState.data.dateTime, expectedDate2);
// Test Local format (MM/dd/y)
mockState.updateDateFormat(DateFormatPB.Local);
await tester.pumpAndSettle();
// Enter 2/9/2025 which should be February 9th in M/D/Y format
await tester.enterText(dateTextField, "2/9/2025");
await tester.testTextInput.receiveAction(TextInputAction.done);
await tester.pumpAndSettle();
final expectedDate3 = DateTime(2025, 2, 9);
expect(mockState.data.dateTime, expectedDate3);
});
testWidgets('same as above but enter time', (tester) async {
final fourteenth = DateTime(2024, 10, 14, 1);