Compare commits
5
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7ae906273a | ||
|
|
7b4025108e | ||
|
|
4aa2c7213e | ||
|
|
92df44cc8d | ||
|
|
41ca1dd8ee |
No files matched your search
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
+44
-1
@@ -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)) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in new issue
Block a user