diff --git a/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md b/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md
new file mode 100644
index 0000000000..57ebf4205f
--- /dev/null
+++ b/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md
@@ -0,0 +1,27 @@
+
+
+
+
+### Feature Preview
+
+
+
+---
+
+
+
+#### PR Checklist
+
+- [ ] My code adheres to the [AppFlowy Style Guide](https://appflowy.gitbook.io/docs/essential-documentation/contribute-to-appflowy/software-contributions/submitting-code/style-guides)
+- [ ] I've listed at least one issue that this PR fixes in the description above.
+- [ ] I've added a test(s) to validate changes in this PR, or this PR only contains semantic changes.
+- [ ] All existing tests are passing.
diff --git a/.github/workflows/flutter_ci.yaml b/.github/workflows/flutter_ci.yaml
index fafb78558e..842608e5ec 100644
--- a/.github/workflows/flutter_ci.yaml
+++ b/.github/workflows/flutter_ci.yaml
@@ -16,7 +16,7 @@ on:
- "frontend/**"
env:
- FLUTTER_VERSION: "3.3.9"
+ FLUTTER_VERSION: "3.7.5"
RUST_TOOLCHAIN: "1.65"
jobs:
diff --git a/.github/workflows/integration_test.yml b/.github/workflows/integration_test.yml
index 96ad941a26..76aed8da9b 100644
--- a/.github/workflows/integration_test.yml
+++ b/.github/workflows/integration_test.yml
@@ -35,7 +35,7 @@ jobs:
- uses: subosito/flutter-action@v2
with:
channel: "stable"
- flutter-version: "3.3.9"
+ flutter-version: "3.7.5"
cache: true
- name: Cache Cargo
@@ -56,15 +56,16 @@ jobs:
- name: Setup Environment
run: |
+ cargo install --force cargo-make
+ cargo install --force duckscript_cli
if [ "$RUNNER_OS" == "Linux" ]; then
sudo wget -qO /etc/apt/trusted.gpg.d/dart_linux_signing_key.asc https://dl-ssl.google.com/linux/linux_signing_key.pub
sudo wget -qO /etc/apt/sources.list.d/dart_stable.list https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list
sudo apt-get update
- sudo apt-get install -y dart curl build-essential libsqlite3-dev libssl-dev clang cmake ninja-build pkg-config libgtk-3-dev
+ sudo apt-get install -y dart curl build-essential libssl-dev clang cmake ninja-build pkg-config libgtk-3-dev
sudo apt-get install keybinder-3.0
elif [ "$RUNNER_OS" == "Windows" ]; then
vcpkg integrate install
- cargo install --force duckscript_cli
elif [ "$RUNNER_OS" == "macOS" ]; then
echo 'do nothing'
fi
@@ -77,17 +78,6 @@ jobs:
cargo install cargo-make
cargo make appflowy-flutter-deps-tools
- - name: Build Test lib
- working-directory: frontend
- run: |
- if [ "$RUNNER_OS" == "Linux" ]; then
- cargo make --profile production-linux-x86_64 appflowy
- elif [ "$RUNNER_OS" == "macOS" ]; then
- cargo make --profile production-mac-x86_64 appflowy
- elif [ "$RUNNER_OS" == "Windows" ]; then
- cargo make --profile production-windows-x86 appflowy
- fi
-
- name: Config Flutter
run: |
if [ "$RUNNER_OS" == "Linux" ]; then
@@ -99,22 +89,27 @@ jobs:
fi
shell: bash
- - name: Flutter Code Generation
- working-directory: frontend/appflowy_flutter
+ - name: Build Test lib
+ working-directory: frontend
run: |
- flutter packages pub get
- flutter packages pub run easy_localization:generate -f keys -o locale_keys.g.dart -S assets/translations -s en.json
- flutter packages pub run build_runner build --delete-conflicting-outputs
+ if [ "$RUNNER_OS" == "Linux" ]; then
+ cargo make --profile development-linux-x86_64 appflowy-dev
+ elif [ "$RUNNER_OS" == "macOS" ]; then
+ cargo make --profile development-mac-x86_64 appflowy-dev
+ elif [ "$RUNNER_OS" == "Windows" ]; then
+ cargo make --profile development-windows-x86 appflowy-dev
+ fi
+ shell: bash
- name: Run AppFlowy tests
working-directory: frontend/appflowy_flutter
run: |
if [ "$RUNNER_OS" == "Linux" ]; then
- flutter test integration_test -d Linux --coverage
+ flutter test integration_test/runner.dart -d Linux --coverage
elif [ "$RUNNER_OS" == "macOS" ]; then
- flutter test integration_test -d macOS --coverage
+ flutter test integration_test/runner.dart -d macOS --coverage
elif [ "$RUNNER_OS" == "Windows" ]; then
- flutter test integration_test -d Windows --coverage
+ flutter test integration_test/runner.dart -d Windows --coverage
fi
shell: bash
@@ -125,4 +120,3 @@ jobs:
# env_vars: ${{ matrix.os }}
# fail_ci_if_error: true
# verbose: true
-
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 2ecf0dab86..88e40585f4 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -3,10 +3,10 @@ name: release
on:
push:
tags:
- - '*'
+ - "*"
env:
- FLUTTER_VERSION: "3.3.9"
+ FLUTTER_VERSION: "3.7.5"
RUST_TOOLCHAIN: "1.65"
jobs:
@@ -136,7 +136,11 @@ jobs:
fail-fast: false
matrix:
job:
- - { target: x86_64-apple-darwin, os: macos-10.15, extra-build-args: "" }
+ - {
+ target: x86_64-apple-darwin,
+ os: macos-10.15,
+ extra-build-args: "",
+ }
steps:
- name: Checkout source code
uses: actions/checkout@v3
@@ -172,7 +176,7 @@ jobs:
working-directory: frontend
run: |
flutter config --enable-macos-desktop
- cargo make --env APP_VERSION=${{ github.ref_name }} --profile production-mac-x86_64 appflowy
+ dart ./scripts/flutter_release_build/build_flowy.dart . ${{ github.ref_name }}
- name: Create macOS dmg
run: |
@@ -225,9 +229,21 @@ jobs:
fail-fast: false
matrix:
job:
- - { arch: x86_64, target: x86_64-unknown-linux-gnu, os: ubuntu-20.04, extra-build-args: "", flutter_profile: production-linux-x86_64 }
+ - {
+ arch: x86_64,
+ target: x86_64-unknown-linux-gnu,
+ os: ubuntu-20.04,
+ extra-build-args: "",
+ flutter_profile: production-linux-x86_64,
+ }
# - { arch: aarch64, target: aarch64-unknown-linux-gnu, os: ubuntu-20.04, extra-build-args: "", flutter_profile: production-linux-aarch64 }
- - { arch: x86_64, target: x86_64-unknown-linux-gnu, os: ubuntu-18.04, extra-build-args: "", flutter_profile: production-linux-x86_64}
+ - {
+ arch: x86_64,
+ target: x86_64-unknown-linux-gnu,
+ os: ubuntu-18.04,
+ extra-build-args: "",
+ flutter_profile: production-linux-x86_64,
+ }
steps:
- name: Checkout source code
uses: actions/checkout@v3
@@ -275,7 +291,7 @@ jobs:
working-directory: frontend
run: |
flutter config --enable-linux-desktop
- cargo make --env APP_VERSION=${{ github.ref_name }} --profile ${{ matrix.job.flutter_profile}} appflowy
+ dart ./scripts/flutter_release_build/build_flowy.dart . ${{ github.ref_name }}
- name: Archive Assert
working-directory: ${{ env.LINUX_APP_RELEASE_PATH }}
@@ -324,6 +340,7 @@ jobs:
with:
upload_url: ${{ needs.create-release.outputs.upload_url }}
asset_path: ${{ env.LINUX_APP_RELEASE_PATH }}/${{ env.LINUX_PACKAGE_NAME }}
+
asset_name: ${{ env.LINUX_PACKAGE_NAME }}
asset_content_type: application/octet-stream
@@ -352,3 +369,12 @@ jobs:
tags: ${{ secrets.DOCKER_HUB_USERNAME }}/appflowy_client:${{ github.ref_name }}
cache-from: type=registry,ref=${{ secrets.DOCKER_HUB_USERNAME }}/af_build_cache:buildcache
cache-to: type=registry,ref=${{ secrets.DOCKER_HUB_USERNAME }}/af_build_cache:buildcache,mode=max
+
+ notify-discord:
+ runs-on: ubuntu-latest
+ needs: [build-for-linux, build-for-windows, build-for-macOS]
+ steps:
+ - name: Notify Discord
+ run: |
+ curl -H "Content-Type: application/json" -d '{"username": "release@appflowy", "content": "🎉 AppFlowy ${{ github.ref_name }} is available. https://github.com/AppFlowy-IO/AppFlowy/releases/tag/'${{ github.ref_name }}'"}' "https://discord.com/api/webhooks/${{ secrets.DISCORD }}"
+ shell: bash
diff --git a/.github/workflows/rust_ci.yaml b/.github/workflows/rust_ci.yaml
index 0991dd0dcb..33b08bbde7 100644
--- a/.github/workflows/rust_ci.yaml
+++ b/.github/workflows/rust_ci.yaml
@@ -20,7 +20,7 @@ on:
env:
CARGO_TERM_COLOR: always
RUST_TOOLCHAIN: "1.65"
- FLUTTER_VERSION: "3.3.9"
+ FLUTTER_VERSION: "3.7.5"
jobs:
test-on-ubuntu:
diff --git a/.github/workflows/rust_coverage.yml b/.github/workflows/rust_coverage.yml
index 5e5c741b0d..be9d09bb4d 100644
--- a/.github/workflows/rust_coverage.yml
+++ b/.github/workflows/rust_coverage.yml
@@ -11,7 +11,7 @@ on:
env:
CARGO_TERM_COLOR: always
- FLUTTER_VERSION: "3.3.9"
+ FLUTTER_VERSION: "3.7.5"
RUST_TOOLCHAIN: "1.65"
jobs:
diff --git a/.gitignore b/.gitignore
index 5eeae980bc..bce47974c4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -35,3 +35,5 @@ pubspec.lock
.githooks/gitlint
.githooks/gitlint.exe
.fvm/
+
+**/AppFlowy-Collab/
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 25eef12f1c..fcacaed6c9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,12 @@
# Release Notes
+## Version 0.1.2 - 03/28/2023
+
+### Bug Fixes
+
+- Fix: update calendar selected range.
+- Fix: duplicate view.
+
## Version 0.1.1 - 03/21/2023
### New features
diff --git a/README.md b/README.md
index 93d6a11c70..5fa94d1b30 100644
--- a/README.md
+++ b/README.md
@@ -44,16 +44,16 @@ You are in charge of your data and customizations.
## Getting Started with development
+
Please view the [documentation](https://appflowy.gitbook.io/docs/essential-documentation/contribute-to-appflowy) for OS specific development instructions
## Roadmap
-- [AppFlowy Roadmap ReadMe](https://appflowy.gitbook.io/docs/essential-documentation/roadmap)
-- [AppFlowy Public Roadmap](https://github.com/orgs/AppFlowy-IO/projects/5/views/12)
-
+* [AppFlowy Roadmap ReadMe](https://appflowy.gitbook.io/docs/essential-documentation/roadmap)
+* [AppFlowy Public Roadmap](https://github.com/orgs/AppFlowy-IO/projects/5/views/12)
If you'd like to propose a feature, submit a feature request [here](https://github.com/AppFlowy-IO/AppFlowy/issues/new?assignees=&labels=&template=feature_request.yaml&title=%5BFR%5D+)
-If you'd like to report a bug, submit bug report [here](https://github.com/AppFlowy-IO/AppFlowy/issues/new?assignees=&labels=&template=bug_report.yaml&title=%5BBug%5D+)
+If you'd like to report a bug, submit a bug report [here](https://github.com/AppFlowy-IO/AppFlowy/issues/new?assignees=&labels=&template=bug_report.yaml&title=%5BBug%5D+)
## **Releases**
@@ -61,37 +61,37 @@ Please see the [changelog](https://www.appflowy.io/whatsnew) for more details ab
## Contributing
-Contributions are what make the open source community such an amazing place to be learn, inspire, and create. Any contributions you make are **greatly appreciated**. Please look at [Contributing to AppFlowy](https://appflowy.gitbook.io/docs/essential-documentation/contribute-to-appflowy/contributing-to-appflowy) for details.
+Contributions make the open-source community a fantastic place to learn, inspire, and create. Any contributions you make are **greatly appreciated**. Please look at [Contributing to AppFlowy](https://appflowy.gitbook.io/docs/essential-documentation/contribute-to-appflowy/contributing-to-appflowy) for details.
-If your Pull Request is accepted as it fixes a bug, adds functionality, or makes AppFlowy's codebase significantly easier to use or understand, congratulations! If your administrative and managerial work behind the scenes that sustains the community as a whole, congratulations! You are now an official contributor to AppFlowy. Get in touch with us ([link](https://tally.so/r/mKP5z3)) to receive the very special Contributor T-shirt!
+If your Pull Request is accepted as it fixes a bug, adds functionality, or makes AppFlowy's codebase significantly easier to use or understand, **Congratulations!** If your administrative and managerial work behind the scenes sustains the community, **Congratulations!** You are now an official contributor to AppFlowy. Get in touch with us ([link](https://tally.so/r/mKP5z3)) to receive the very special Contributor T-shirt!
Proudly wear your T-shirt and show it to us by tagging [@appflowy](https://twitter.com/appflowy) on Twitter.
+## Join the community to build AppFlowy together
-## Join the community to build AppFlowy together!
## Why Are We Building This?
-Notion has been our favorite project and knowledge management tool in recent years because of its aesthetic appeal and functionality. Our team uses it daily, and we are on its paid plan. However, as we all know Notion has its limitations. These include weak data security and poor compatibility with mobile devices. Likewise, alternative collaborative workplace management tools also have their constraints.
+Notion has been our favourite project and knowledge management tool in recent years because of its aesthetic appeal and functionality. Our team uses it daily, and we are on its paid plan. However, as we all know, Notion has its limitations. These include weak data security and poor compatibility with mobile devices. Likewise, alternative collaborative workplace management tools also have their constraints.
-The limitations we encountered using these tools rooted in our past work experience with collaborative productivity tools lead to our firm belief that there is, and will be a glass ceiling on what's possible in the future for tools like Notion. This emanates from these tools probable struggles to scale horizontally at some point. It implies that they will likely be forced to prioritize for a proportion of customers whose needs can be quite different from the rest. While decision-makers want a workplace OS, the truth is that it is not very possible to come up with a one-size fits all solution in such a fragmented market.
+The limitations we encountered using these tools and our past work experience with collaborative productivity tools have led to our firm belief that there is a glass ceiling on what's possible for these tools in the future. This emanates from the fact that these tools will probably struggle to scale horizontally at some point and be forced to prioritize a proportion of customers whose needs differ from the rest. While decision-makers want a workplace OS, it is impossible to come up with a one-size fits all solution in such a fragmented market.
When a customer's evolving core needs are not satisfied, they either switch to another or build one from the ground up, in-house. Consequently, they either go under another ceiling or buy an expensive ticket to learn a hard lesson. This is a requirement for many resources and expertise, building a reliable and easy-to-use collaborative tool, not to mention the speed and native experience. The same may apply to individual users as well.
All these restrictions necessitate our mission - to make it possible for anyone to create apps that suit their needs well.
-- To individuals, we would like to offer Notion's functionality along with data security and cross-platform native experience.
-- To enterprises and hackers, AppFlowy is dedicated to offering building blocks, that is, collaboration infra services to enable you to make apps on your own. Moreover, you have 100% control of your data. You can design and modify AppFlowy your way, with a single codebase written in Flutter and Rust supporting multiple platforms armed with long-term maintainability.
+* To individuals, we would like to offer Notion's functionality, data security, and cross-platform native experience.
+* To enterprises and hackers, AppFlowy is dedicated to offering building blocks and collaboration infra services to enable you to make apps on your own. Moreover, you have 100% control of your data. You can design and modify AppFlowy your way, with a single codebase written in Flutter and Rust supporting multiple platforms armed with long-term maintainability.
We decided to achieve this mission by upholding the three most fundamental values:
-- Data privacy first
-- Reliable native experience
-- Community-driven extensibility
+* Data privacy first
+* Reliable native experience
+* Community-driven extensibility
-To be honest, we do not claim to outperform Notion in terms of functionality and design, at least for now. Besides, our priority doesn't lie in more functionality at the moment. Instead, we would like to cultivate a community to democratize the knowledge and wheels of making complex workplace management tools, while enabling people and businesses to create beautiful things on their own by equipping them with a versatile toolbox of building blocks.
+We do not claim to outperform Notion in terms of functionality and design, at least for now. Besides, our priority doesn't lie in more functionality at the moment. Instead, we would like to cultivate a community to democratize the knowledge and wheels of making complex workplace management tools while enabling people and businesses to create beautiful things on their own by equipping them with a versatile toolbox of building blocks.
## License
@@ -101,6 +101,6 @@ Distributed under the AGPLv3 License. See [`LICENSE.md`](https://github.com/AppF
Special thanks to these amazing projects which help power AppFlowy.IO:
-- [flutter-quill](https://github.com/singerdmx/flutter-quill)
-- [cargo-make](https://github.com/sagiegurari/cargo-make)
-- [contrib.rocks](https://contrib.rocks)
+* [flutter-quill](https://github.com/singerdmx/flutter-quill)
+* [cargo-make](https://github.com/sagiegurari/cargo-make)
+* [contrib.rocks](https://contrib.rocks)
diff --git a/frontend/.vscode/launch.json b/frontend/.vscode/launch.json
index 657f42fdd9..0501207968 100644
--- a/frontend/.vscode/launch.json
+++ b/frontend/.vscode/launch.json
@@ -12,8 +12,8 @@
"type": "dart",
"preLaunchTask": "AF: Build Appflowy Core",
"env": {
- // "RUST_LOG": "trace",
- "RUST_LOG": "debug"
+ "RUST_LOG": "trace",
+ // "RUST_LOG": "debug"
},
"cwd": "${workspaceRoot}/appflowy_flutter"
},
diff --git a/frontend/.vscode/tasks.json b/frontend/.vscode/tasks.json
index 227a5cbfba..4f8a52c95c 100644
--- a/frontend/.vscode/tasks.json
+++ b/frontend/.vscode/tasks.json
@@ -1,223 +1,225 @@
{
- "version": "2.0.0",
- // https://code.visualstudio.com/docs/editor/tasks
- // https://gist.github.com/deadalusai/9e13e36d61ec7fb72148
- // ${workspaceRoot}: the root folder of the team
- // ${file}: the current opened file
- // ${fileBasename}: the current opened file's basename
- // ${fileDirname}: the current opened file's dirname
- // ${fileExtname}: the current opened file's extension
- // ${cwd}: the current working directory of the spawned process
- "tasks": [
- {
- "label": "AF: Clean + Rebuild All",
- "type": "shell",
- "dependsOrder": "sequence",
- "dependsOn": [
- "AF: Dart Clean",
- "AF: Flutter Clean",
- "AF: Build Appflowy Core",
- "AF: Flutter Pub Get",
- "AF: Flutter Package Get",
- "AF: Generate Language Files",
- "AF: Generate Freezed Files"
- ],
- "presentation": {
- "reveal": "always",
- "panel": "new"
- }
- },
- {
- "label": "AF: Clean + Rebuild All (Android)",
- "type": "shell",
- "dependsOrder": "sequence",
- "dependsOn": [
- "AF: Dart Clean",
- "AF: Flutter Clean",
- "AF: Build Appflowy Core_for_android",
- "AF: Flutter Pub Get",
- "AF: Flutter Package Get",
- "AF: Generate Language Files",
- "AF: Generate Freezed Files"
- ],
- "presentation": {
- "reveal": "always",
- "panel": "new"
- }
- },
- {
- "label": "AF: Build Appflowy Core_for_android",
- "type": "shell",
- "command": "cargo make --profile development-android appflowy-core-dev-android",
- "group": "build",
- "options": {
- "cwd": "${workspaceFolder}"
- }
- },
- {
- "label": "AF: Build Appflowy Core",
- "type": "shell",
- "windows": {
- "command": "cargo make --profile development-windows-x86 appflowy-core-dev"
- },
- "linux": {
- "command": "cargo make --profile \"development-linux-$(uname -m)\" appflowy-core-dev"
- },
- "osx": {
- "command": "cargo make --profile \"development-mac-$(uname -m)\" appflowy-core-dev"
- },
- "group": "build",
- "options": {
- "cwd": "${workspaceFolder}"
- }
- },
- {
- "label": "AF: Code Gen",
- "type": "shell",
- "dependsOrder": "sequence",
- "dependsOn": [
- "AF: Flutter Clean",
- "AF: Flutter Pub Get",
- "AF: Flutter Package Get",
- "AF: Generate Language Files",
- "AF: Generate Freezed Files"
- ],
- "group": {
- "kind": "build",
- "isDefault": true
- },
- "presentation": {
- "reveal": "always",
- "panel": "new"
- }
- },
- {
- "label": "AF: Flutter Clean",
- "type": "shell",
- "command": "flutter clean",
- "options": {
- "cwd": "${workspaceFolder}/appflowy_flutter"
- }
- },
- {
- "label": "AF: Flutter Pub Get",
- "type": "shell",
- "command": "flutter pub get",
- "options": {
- "cwd": "${workspaceFolder}/appflowy_flutter"
- }
- },
- {
- "label": "AF: Flutter Package Get",
- "type": "shell",
- "command": "flutter packages pub get",
- "options": {
- "cwd": "${workspaceFolder}/appflowy_flutter"
- }
- },
- {
- "label": "AF: Generate Freezed Files",
- "type": "shell",
- "command": "flutter pub run build_runner build --delete-conflicting-outputs",
- "options": {
- "cwd": "${workspaceFolder}/appflowy_flutter"
- }
- },
- {
- "label": "AF: Generate Language Files",
- "type": "shell",
- "command": "sh ./scripts/generate_language_files.sh",
- "windows": {
- "options": {
- "shell": {
- "executable": "cmd.exe",
- "args": [
- "/d",
- "/c",
- ".\\scripts\\generate_language_files.cmd"
- ]
- }
- }
- },
- "group": "build",
- "options": {
- "cwd": "${workspaceFolder}"
- }
- },
- {
- "label": "AF: Flutter Clean",
- "type": "shell",
- "command": "cargo make flutter_clean",
- "group": "build",
- "options": {
- "cwd": "${workspaceFolder}"
- }
- },
- {
- "label": "AF: flutter build aar",
- "type": "flutter",
- "command": "flutter",
- "args": [
- "build",
- "aar"
- ],
- "group": "build",
- "problemMatcher": [],
- "detail": "appflowy_flutter"
- },
- {
- "label": "AF: Tauri UI Dev",
- "type": "shell",
- "isBackground": true,
- "command": "yarn",
- "args": ["dev"],
- "options": {
- "cwd": "${workspaceFolder}/appflowy_tauri"
- }
- },
- {
- "label": "AF: Tauri UI Build",
- "type": "shell",
- "command": "npm run build",
- "options": {
- "cwd": "${workspaceFolder}/appflowy_tauri"
- }
- },
- {
- "label": "AF: Tauri Dev",
- "type": "shell",
- "command": "npm run tauri:dev",
- "options": {
- "cwd": "${workspaceFolder}/appflowy_tauri"
- }
- },
- {
- "label": "AF: Tauri Clean",
- "type": "shell",
- "command": "cargo make tauri_clean",
- "options": {
- "cwd": "${workspaceFolder}"
- }
- },
- {
- "label": "AF: Tauri Clean + Dev",
- "type": "shell",
- "dependsOrder": "sequence",
- "dependsOn": [
- "AF: Tauri Clean",
- "AF: Tauri UI Dev"
- ],
- "options": {
- "cwd": "${workspaceFolder}"
- }
- },
- {
- "label": "AF: Tauri ESLint",
- "type": "shell",
- "command": "npx eslint --fix src",
- "options": {
- "cwd": "${workspaceFolder}/appflowy_tauri"
- }
- },
- ]
-}
\ No newline at end of file
+ "version": "2.0.0",
+ // https://code.visualstudio.com/docs/editor/tasks
+ // https://gist.github.com/deadalusai/9e13e36d61ec7fb72148
+ // ${workspaceRoot}: the root folder of the team
+ // ${file}: the current opened file
+ // ${fileBasename}: the current opened file's basename
+ // ${fileDirname}: the current opened file's dirname
+ // ${fileExtname}: the current opened file's extension
+ // ${cwd}: the current working directory of the spawned process
+ "tasks": [
+ {
+ "label": "AF: Clean + Rebuild All",
+ "type": "shell",
+ "dependsOrder": "sequence",
+ "dependsOn": [
+ "AF: Dart Clean",
+ "AF: Flutter Clean",
+ "AF: Build Appflowy Core",
+ "AF: Flutter Pub Get",
+ "AF: Flutter Package Get",
+ "AF: Generate Language Files",
+ "AF: Generate Freezed Files"
+ ],
+ "presentation": {
+ "reveal": "always",
+ "panel": "new"
+ }
+ },
+ {
+ "label": "AF: Clean + Rebuild All (Android)",
+ "type": "shell",
+ "dependsOrder": "sequence",
+ "dependsOn": [
+ "AF: Dart Clean",
+ "AF: Flutter Clean",
+ "AF: Build Appflowy Core_for_android",
+ "AF: Flutter Pub Get",
+ "AF: Flutter Package Get",
+ "AF: Generate Language Files",
+ "AF: Generate Freezed Files"
+ ],
+ "presentation": {
+ "reveal": "always",
+ "panel": "new"
+ }
+ },
+ {
+ "label": "AF: Build Appflowy Core_for_android",
+ "type": "shell",
+ "command": "cargo make --profile development-android appflowy-core-dev-android",
+ "group": "build",
+ "options": {
+ "cwd": "${workspaceFolder}"
+ }
+ },
+ {
+ "label": "AF: Build Appflowy Core",
+ "type": "shell",
+ "windows": {
+ "command": "cargo make --profile development-windows-x86 appflowy-core-dev"
+ },
+ "linux": {
+ "command": "cargo make --profile \"development-linux-$(uname -m)\" appflowy-core-dev"
+ },
+ "osx": {
+ "command": "cargo make --profile \"development-mac-$(uname -m)\" appflowy-core-dev"
+ },
+ "group": "build",
+ "options": {
+ "cwd": "${workspaceFolder}"
+ }
+ },
+ {
+ "label": "AF: Code Gen",
+ "type": "shell",
+ "dependsOrder": "sequence",
+ "dependsOn": [
+ "AF: Flutter Clean",
+ "AF: Flutter Pub Get",
+ "AF: Flutter Package Get",
+ "AF: Generate Language Files",
+ "AF: Generate Freezed Files"
+ ],
+ "group": {
+ "kind": "build",
+ "isDefault": true
+ },
+ "presentation": {
+ "reveal": "always",
+ "panel": "new"
+ }
+ },
+ {
+ "label": "AF: Flutter Clean",
+ "type": "shell",
+ "command": "flutter clean",
+ "options": {
+ "cwd": "${workspaceFolder}/appflowy_flutter"
+ }
+ },
+ {
+ "label": "AF: Flutter Pub Get",
+ "type": "shell",
+ "command": "flutter pub get",
+ "options": {
+ "cwd": "${workspaceFolder}/appflowy_flutter"
+ }
+ },
+ {
+ "label": "AF: Flutter Package Get",
+ "type": "shell",
+ "command": "flutter packages pub get",
+ "options": {
+ "cwd": "${workspaceFolder}/appflowy_flutter"
+ }
+ },
+ {
+ "label": "AF: Generate Freezed Files",
+ "type": "shell",
+ "command": "flutter pub run build_runner build --delete-conflicting-outputs",
+ "options": {
+ "cwd": "${workspaceFolder}/appflowy_flutter"
+ }
+ },
+ {
+ "label": "AF: Generate Language Files",
+ "type": "shell",
+ "command": "sh ./scripts/generate_language_files.sh",
+ "windows": {
+ "options": {
+ "shell": {
+ "executable": "cmd.exe",
+ "args": [
+ "/d",
+ "/c",
+ ".\\scripts\\generate_language_files.cmd"
+ ]
+ }
+ }
+ },
+ "group": "build",
+ "options": {
+ "cwd": "${workspaceFolder}"
+ }
+ },
+ {
+ "label": "AF: Flutter Clean",
+ "type": "shell",
+ "command": "cargo make flutter_clean",
+ "group": "build",
+ "options": {
+ "cwd": "${workspaceFolder}"
+ }
+ },
+ {
+ "label": "AF: flutter build aar",
+ "type": "flutter",
+ "command": "flutter",
+ "args": [
+ "build",
+ "aar"
+ ],
+ "group": "build",
+ "problemMatcher": [],
+ "detail": "appflowy_flutter"
+ },
+ {
+ "label": "AF: Tauri UI Dev",
+ "type": "shell",
+ "isBackground": true,
+ "command": "yarn",
+ "args": [
+ "dev"
+ ],
+ "options": {
+ "cwd": "${workspaceFolder}/appflowy_tauri"
+ }
+ },
+ {
+ "label": "AF: Tauri UI Build",
+ "type": "shell",
+ "command": "npm run build",
+ "options": {
+ "cwd": "${workspaceFolder}/appflowy_tauri"
+ }
+ },
+ {
+ "label": "AF: Tauri Dev",
+ "type": "shell",
+ "command": "npm run tauri:dev",
+ "options": {
+ "cwd": "${workspaceFolder}/appflowy_tauri"
+ }
+ },
+ {
+ "label": "AF: Tauri Clean",
+ "type": "shell",
+ "command": "cargo make tauri_clean",
+ "options": {
+ "cwd": "${workspaceFolder}"
+ }
+ },
+ {
+ "label": "AF: Tauri Clean + Dev",
+ "type": "shell",
+ "dependsOrder": "sequence",
+ "dependsOn": [
+ "AF: Tauri Clean",
+ "AF: Tauri UI Dev"
+ ],
+ "options": {
+ "cwd": "${workspaceFolder}"
+ }
+ },
+ {
+ "label": "AF: Tauri ESLint",
+ "type": "shell",
+ "command": "npx eslint --fix src",
+ "options": {
+ "cwd": "${workspaceFolder}/appflowy_tauri"
+ }
+ },
+ ]
+}
diff --git a/frontend/Makefile.toml b/frontend/Makefile.toml
index 1fc240a42a..c7ac53e5c3 100644
--- a/frontend/Makefile.toml
+++ b/frontend/Makefile.toml
@@ -23,7 +23,7 @@ CARGO_MAKE_EXTEND_WORKSPACE_MAKEFILE = true
CARGO_MAKE_CRATE_FS_NAME = "dart_ffi"
CARGO_MAKE_CRATE_NAME = "dart-ffi"
LIB_NAME = "dart_ffi"
-CURRENT_APP_VERSION = "0.1.1"
+CURRENT_APP_VERSION = "0.1.2"
FLUTTER_DESKTOP_FEATURES = "dart,rev-sqlite"
PRODUCT_NAME = "AppFlowy"
# CRATE_TYPE: https://doc.rust-lang.org/reference/linkage.html
diff --git a/frontend/appflowy_flutter/.gitignore b/frontend/appflowy_flutter/.gitignore
index e77b1c9f0f..82c35e91cd 100644
--- a/frontend/appflowy_flutter/.gitignore
+++ b/frontend/appflowy_flutter/.gitignore
@@ -40,7 +40,7 @@ lib/generated_plugin_registrant.dart
lib/generated/
# Freezed generated files
-*.g.dart
+*.g.dart
*.freezed.dart
# Symbolication related
@@ -67,4 +67,4 @@ windows/flutter/dart_ffi/
**/**/*.so
**/**/Brewfile.lock.json
**/.sandbox
-**/.vscode/
\ No newline at end of file
+**/.vscode/
diff --git a/frontend/appflowy_flutter/README.md b/frontend/appflowy_flutter/README.md
index 74e4f803a3..3c1ac42d93 100644
--- a/frontend/appflowy_flutter/README.md
+++ b/frontend/appflowy_flutter/README.md
@@ -1,6 +1,6 @@
AppFlowy_Flutter
@@ -9,13 +9,16 @@
This Repository contains the codebase for the frontend of the application, currently we use Flutter as our frontend framework.
### Platforms Supported Using Flutter 💻
+
- Linux
- macOS
- Windows
-> We later expect to extend support to Android and iOS devices using Flutter.
+ > We later expect to extend support to Android and iOS devices using Flutter.
### Am I Eligible to Contribute?
+
Yes! You are eligible to contribute, check out the ways in which you can [contribute to AppFlowy](https://appflowy.gitbook.io/docs/essential-documentation/contribute-to-appflowy/contributing-to-appflowy). Some of the ways in which you can contribute are:
+
- Non-Coding Contributions
- Documentation
- Feature Requests and Feedbacks
@@ -23,26 +26,27 @@ Yes! You are eligible to contribute, check out the ways in which you can [contri
- Improve Translations
- Coding Contributions
-
To contribute to `AppFlowy_Flutter` codebase specifically (coding contribution) we suggest you to have basic knowledge of Flutter. In case you are new to Flutter, we may suggest you to learn the basics and then try to contribute, get started with Flutter [here](https://flutter.dev/docs/get-started/codelab).
### What OS Should I Use for Development?
+
We support all OS for Development i.e Linux, macOS and Windows. However, most of us promote macOS and Linux over Windows. We have detailed [docs](https://appflowy.gitbook.io/docs/essential-documentation/contribute-to-appflowy/software-contributions/environment-setup) on How to Setup `AppFlowy_Flutter` in your local system in each OS.
-
### Getting Started ❇
+
We have a detailed documentation, on how to [get started](https://appflowy.gitbook.io/docs/essential-documentation/contribute-to-appflowy/contributing-to-appflowy) with the project, and make your first contribution. However, we do have some specific picks for you.
+
- [Code Architecture](https://appflowy.gitbook.io/docs/essential-documentation/contribute-to-appflowy/architecture/frontend/frontend/codemap)
- [Making Your First PR](https://appflowy.gitbook.io/docs/essential-documentation/contribute-to-appflowy/software-contributions/submitting-code/submitting-your-first-pull-request)
- [The Style Guide](https://appflowy.gitbook.io/docs/essential-documentation/contribute-to-appflowy/software-contributions/submitting-code/style-guides)
- [How to run/debug the application](https://appflowy.gitbook.io/docs/essential-documentation/contribute-to-appflowy/software-contributions/launcher-and-tasks)
-
### Need Help?
+
- New to GitHub? Follow [these](https://appflowy.gitbook.io/docs/essential-documentation/contribute-to-appflowy/software-contributions/submitting-code/setting-up-your-repositories) steps to get started
- Stuck Somewhere? Join the [Discord](https://discord.gg/9Q2xaN37tV) Group and we are there to help you!
-
diff --git a/frontend/appflowy_flutter/assets/images/home/new_app.svg b/frontend/appflowy_flutter/assets/images/home/new_app.svg
index ac6c002d3d..c74ac3b349 100644
--- a/frontend/appflowy_flutter/assets/images/home/new_app.svg
+++ b/frontend/appflowy_flutter/assets/images/home/new_app.svg
@@ -1,5 +1,17 @@
-
-
-
-
+
+
+
diff --git a/frontend/appflowy_flutter/assets/test/workspaces/board.zip b/frontend/appflowy_flutter/assets/test/workspaces/board.zip
new file mode 100644
index 0000000000..1a8f6b0dd4
Binary files /dev/null and b/frontend/appflowy_flutter/assets/test/workspaces/board.zip differ
diff --git a/frontend/appflowy_flutter/assets/test/workspaces/empty_document.zip b/frontend/appflowy_flutter/assets/test/workspaces/empty_document.zip
new file mode 100644
index 0000000000..1399d640ad
Binary files /dev/null and b/frontend/appflowy_flutter/assets/test/workspaces/empty_document.zip differ
diff --git a/frontend/appflowy_flutter/assets/translations/en.json b/frontend/appflowy_flutter/assets/translations/en.json
index 9496a242b7..dd3435c19a 100644
--- a/frontend/appflowy_flutter/assets/translations/en.json
+++ b/frontend/appflowy_flutter/assets/translations/en.json
@@ -188,17 +188,18 @@
"exportDatabase": "Export database",
"selectFiles": "Select the files that need to be export",
"createNewFolder": "Create a new folder",
- "createNewFolderDesc": "Tell us where you want to store your data ...",
+ "createNewFolderDesc": "Tell us where you want to store your data",
"open": "Open",
"openFolder": "Open an existing folder",
- "openFolderDesc": "Read and write it to your existing AppFlowy folder ...",
+ "openFolderDesc": "Read and write it to your existing AppFlowy folder",
"folderHintText": "folder name",
"location": "Creating a new folder",
"locationDesc": "Pick a name for your AppFlowy data folder",
"browser": "Browse",
"create": "Create",
"folderPath": "Path to store your folder",
- "locationCannotBeEmpty": "Path cannot be empty"
+ "locationCannotBeEmpty": "Path cannot be empty",
+ "pathCopiedSnackbar": "File storage path copied to clipboard!"
},
"user": {
"name": "Name",
@@ -325,7 +326,8 @@
"checklist": {
"panelTitle": "Add an item"
},
- "menuName": "Grid"
+ "menuName": "Grid",
+ "referencedGridPrefix": "View of"
},
"document": {
"menuName": "Document",
@@ -365,6 +367,7 @@
"changeCover": "Change Cover",
"colors": "Colors",
"images": "Images",
+ "clearAll": "Clear All",
"abstract": "Abstract",
"addCover": "Add Cover",
"addLocalImage": "Add local image",
@@ -382,14 +385,14 @@
"imageSavingFailed": "Image Saving Failed",
"addIcon": "Add Icon"
}
-
}
},
"board": {
"column": {
"create_new_card": "New"
},
- "menuName": "Board"
+ "menuName": "Board",
+ "referencedBoardPrefix": "View of"
},
"calendar": {
"menuName": "Calendar",
diff --git a/frontend/appflowy_flutter/assets/translations/zh-TW.json b/frontend/appflowy_flutter/assets/translations/zh-TW.json
index 9498df9f54..c1d31944c7 100644
--- a/frontend/appflowy_flutter/assets/translations/zh-TW.json
+++ b/frontend/appflowy_flutter/assets/translations/zh-TW.json
@@ -40,6 +40,13 @@
"markdown": "Markdown",
"copyLink": "複製連結"
},
+ "moreAction": {
+ "small": "小",
+ "medium": "中",
+ "large": "大",
+ "fontSize": "字體大小",
+ "import": "匯入"
+ },
"disclosureAction": {
"rename": "重新命名",
"delete": "刪除",
@@ -64,6 +71,7 @@
},
"dialogCreatePageNameHint": "頁面名稱",
"questionBubble": {
+ "shortcuts": "快捷鍵",
"whatsNew": "新功能",
"help": "幫助 & 支援",
"debug": {
@@ -90,11 +98,21 @@
"inlineCode": "程式碼",
"quote": "區塊引言",
"header": "標題",
- "highlight": "反白"
+ "highlight": "反白",
+ "color": "顏色"
},
"tooltip": {
"lightMode": "切換至亮色模式",
- "darkMode": "切換至暗色模式"
+ "darkMode": "切換至暗色模式",
+ "openAsPage": "以頁面開啓",
+ "addNewRow": "新增列表",
+ "openMenu": "點擊開啓選單",
+ "viewDataBase": "查看資料庫",
+ "referencePage": "這個 {name} 已參照"
+ },
+ "sideBar": {
+ "closeSidebar": "關閉側邊欄",
+ "openSidebar": "開啓側邊欄"
},
"notifications": {
"export": {
@@ -114,7 +132,14 @@
"signIn": "登入",
"signOut": "登出",
"complete": "完成",
- "save": "儲存"
+ "save": "儲存",
+ "generate": "產生",
+ "esc": "離開",
+ "keep": "保存",
+ "tryAgain": "再試一次",
+ "discard": "放棄變更",
+ "replace": "取代",
+ "insertBelow": "在下面插入"
},
"label": {
"welcome": "歡迎!",
@@ -142,22 +167,99 @@
"appearance": "外觀",
"language": "語言",
"user": "使用者",
+ "files": "檔案",
"open": "開啟設定"
},
"appearance": {
"themeMode": {
- "label": "Theme Mode",
+ "label": "主題模式",
"light": "亮色模式",
"dark": "暗色模式",
- "system": "Adapt to System"
- }
+ "system": "系統設定"
+ },
+ "theme": "主題"
+ },
+ "files": {
+ "defaultLocation": "Appflowy 資料儲存位置",
+ "doubleTapToCopy": "雙擊以複製路徑",
+ "restoreLocation": "回復 Appflowy 預設路徑",
+ "customizeLocation": "開啓其他資料夾",
+ "restartApp": "請重新啓動以讓更動生效",
+ "exportDatabase": "匯出資料庫",
+ "selectFiles": "選擇需要匯出的檔案",
+ "createNewFolder": "建立新檔案",
+ "createNewFolderDesc": "選擇你想儲存資料的位置",
+ "open": "打開",
+ "openFolder": "開啓一個已經存在的資料夾",
+ "openFolderDesc": "讀寫已存在的 AppFlowy 資料夾",
+ "folderHintText": "資料夾名稱",
+ "location": "建立新資料夾",
+ "locationDesc": "命名 Appflowy 資料夾",
+ "browser": "瀏覽",
+ "create": "建立",
+ "folderPath": "儲存資料夾的路徑",
+ "locationCannotBeEmpty": "路徑不能爲空",
+ "pathCopiedSnackbar": "檔案儲存空間的路徑已被複製到剪貼簿!"
+ },
+ "user": {
+ "name": "名稱",
+ "icon": "圖標",
+ "selectAnIcon": "選擇圖標",
+ "pleaseInputYourOpenAIKey": "請輸入你的 OpenAI 密鑰"
}
},
"grid": {
"settings": {
"filter": "篩選",
+ "sort": "排序",
"sortBy": "排序方式",
- "Properties": "內容"
+ "Properties": "內容",
+ "group": "群組",
+ "addFilter": "增加",
+ "deleteFilter": "刪除篩選器",
+ "filterBy": "以...篩選",
+ "typeAValue": "輸入一個值...",
+ "layout": "佈局"
+ },
+ "textFilter": {
+ "contains": "包含",
+ "doesNotContain": "不包含",
+ "endsWith": "以...結尾",
+ "startWith": "以...開頭",
+ "is": "是",
+ "isNot": "不是",
+ "isEmpty": "爲空",
+ "isNotEmpty": "不爲空",
+ "choicechipPrefix": {
+ "isNot": "不是",
+ "startWith": "以...開頭",
+ "endWith": "以...結尾",
+ "isEmpty": "爲空",
+ "isNotEmpty": "不爲空"
+ }
+ },
+ "checkboxFilter": {
+ "isChecked": "已核取",
+ "isUnchecked": "未核取",
+ "choicechipPrefix": {
+ "is": "是"
+ }
+ },
+ "checklistFilter": {
+ "isComplete": "已完成",
+ "isIncomplted": "未完成"
+ },
+ "singleSelectOptionFilter": {
+ "is": "是",
+ "isNot": "不是",
+ "isEmpty": "爲空",
+ "isNotEmpty": "不爲空"
+ },
+ "multiSelectOptionFilter": {
+ "contains": "包含",
+ "doesNotContain": "不包含",
+ "isEmpty": "爲空",
+ "isNotEmpty": "不爲空"
},
"field": {
"hide": "隱藏",
@@ -172,6 +274,7 @@
"singleSelectFieldName": "單選",
"multiSelectFieldName": "多選",
"urlFieldName": "網址",
+ "checklistFieldName": "核取列表",
"numberFormat": "數字格式",
"dateFormat": "日期格式",
"includeTime": "包含時間",
@@ -186,13 +289,23 @@
"addSelectOption": "新增選項",
"optionTitle": "選項",
"addOption": "新增選項",
- "editProperty": "編輯內容"
+ "editProperty": "編輯內容",
+ "newColumn": "新欄位",
+ "deleteFieldPromptMessage": "你確定嗎?這個內容將被刪除"
+ },
+ "sort": {
+ "ascending": "升冪排序",
+ "descending": "降冪排序",
+ "deleteSort": "刪除排序",
+ "addSort": "新增排序"
},
"row": {
"duplicate": "複製",
"delete": "刪除",
"textPlaceholder": "空",
- "copyProperty": "已將內容複製至剪貼簿"
+ "copyProperty": "已將內容複製至剪貼簿",
+ "count": "Count",
+ "newRow": "新列表"
},
"selectOption": {
"create": "建立",
@@ -210,6 +323,9 @@
"panelTitle": "搜尋或建立選項",
"searchOption": "搜尋選項"
},
+ "checklist": {
+ "panelTitle": "新增物件"
+ },
"menuName": "網格"
},
"document": {
@@ -217,10 +333,78 @@
"date": {
"timeHintTextInTwelveHour": "01:00 PM",
"timeHintTextInTwentyFourHour": "13:00"
+ },
+ "slashMenu": {
+ "board": {
+ "selectABoardToLinkTo": "選擇要連結的看板",
+ "createANewBoard": "建立新的看板"
+ },
+ "grid": {
+ "selectAGridToLinkTo": "選擇要連結的網格",
+ "createANewGrid": "建立新網格"
+ }
+ },
+ "plugins": {
+ "referencedBoard": "已參照的看板",
+ "referencedGrid": "已參照的網格",
+ "autoGeneratorMenuItemName": "OpenAI 寫手",
+ "autoGeneratorTitleName": "OpenAI: 叫人工智慧寫下任何事情...",
+ "autoGeneratorLearnMore": "Learn more",
+ "autoGeneratorGenerate": "產生",
+ "autoGeneratorHintText": "問 OpenAI ...",
+ "autoGeneratorCantGetOpenAIKey": "無法取得 OpenAI 密鑰",
+ "smartEdit": "人工智慧助理",
+ "openAI": "OpenAI",
+ "smartEditFixSpelling": "修正拼寫",
+ "warning": "⚠️ AI 的回答可能不精確或是存在誤導",
+ "smartEditSummarize": "總結",
+ "smartEditCouldNotFetchResult": "無法取得 OpenAI 的結果",
+ "smartEditCouldNotFetchKey": "無法取得 OpenAI 密鑰",
+ "smartEditDisabled": "在設定連結 OpenAI ",
+ "discardResponse": "你確定放棄人工智慧的回覆?",
+ "cover": {
+ "changeCover": "更換封面",
+ "colors": "顏色",
+ "images": "圖片",
+ "abstract": "摘要",
+ "addCover": "新增封面",
+ "addLocalImage": "新增本機圖片",
+ "invalidImageUrl": "無效的圖片網址",
+ "failedToAddImageToGallery": "新增圖片到圖庫失敗",
+ "enterImageUrl": "輸入圖片網址",
+ "add": "Add",
+ "back": "Back",
+ "saveToGallery": "儲存到",
+ "removeIcon": "移除圖標",
+ "pasteImageUrl": "複製圖片網址",
+ "or": "或",
+ "pickFromFiles": "挑選檔案",
+ "couldNotFetchImage": "無法截取圖片",
+ "imageSavingFailed": "圖片儲存失敗",
+ "addIcon": "新增圖標"
+ }
}
},
- "sideBar": {
- "openSidebar": "Open sidebar",
- "closeSidebar": "Close sidebar"
+ "board": {
+ "column": {
+ "create_new_card": "建立"
+ },
+ "menuName": "看板"
+ },
+ "calendar": {
+ "menuName": "日曆",
+ "defaultNewCalendarTitle": "未命名的",
+ "navigation": {
+ "today": "今天",
+ "jumpToday": "跳至今天",
+ "previousMonth": "上個月",
+ "nextMonth": "下個月"
+ },
+ "settings": {
+ "showWeekNumbers": "顯示星期",
+ "showWeekends": "顯示週末",
+ "firstDayOfWeek": "一週的第一天",
+ "layoutDateField": "排列方式"
+ }
}
}
\ No newline at end of file
diff --git a/frontend/appflowy_flutter/integration_test/board_test.dart b/frontend/appflowy_flutter/integration_test/board_test.dart
new file mode 100644
index 0000000000..3900843207
--- /dev/null
+++ b/frontend/appflowy_flutter/integration_test/board_test.dart
@@ -0,0 +1,43 @@
+import 'package:appflowy_board/appflowy_board.dart';
+import 'package:flutter_test/flutter_test.dart';
+import 'package:integration_test/integration_test.dart';
+import 'util/util.dart';
+
+/// Integration tests for an empty board. The [TestWorkspaceService] will load
+/// a workspace from an empty board `assets/test/workspaces/board.zip` for all
+/// tests.
+///
+/// To create another integration test with a preconfigured workspace.
+/// Use the following steps.
+/// 1. Create a new workspace from the AppFlowy launch screen.
+/// 2. Modify the workspace until it is suitable as the starting point for
+/// the integration test you need to land.
+/// 3. Use a zip utility program to zip the workspace folder that you created.
+/// 4. Add the zip file under `assets/test/workspaces/`
+/// 5. Add a new enumeration to [TestWorkspace] in `integration_test/utils/data.dart`.
+/// For example, if you added a workspace called `empty_calendar.zip`,
+/// then [TestWorkspace] should have the following value:
+/// ```dart
+/// enum TestWorkspace {
+/// board('board'),
+/// empty_calendar('empty_calendar');
+///
+/// /* code */
+/// }
+/// ```
+/// 6. Double check that the .zip file that you added is included as an asset in
+/// the pubspec.yaml file under appflowy_flutter.
+void main() {
+ IntegrationTestWidgetsFlutterBinding.ensureInitialized();
+ const service = TestWorkspaceService(TestWorkspace.board);
+
+ group('board', () {
+ setUpAll(() async => await service.setUpAll());
+ setUp(() async => await service.setUp());
+
+ testWidgets('integration test unzips the proper workspace and loads it correctly.', (tester) async {
+ await tester.initializeAppFlowy();
+ expect(find.byType(AppFlowyBoard), findsOneWidget);
+ });
+ });
+}
diff --git a/frontend/appflowy_flutter/integration_test/empty_document_test.dart b/frontend/appflowy_flutter/integration_test/empty_document_test.dart
new file mode 100644
index 0000000000..51f92c4c35
--- /dev/null
+++ b/frontend/appflowy_flutter/integration_test/empty_document_test.dart
@@ -0,0 +1,120 @@
+import 'package:appflowy/plugins/document/presentation/plugins/base/built_in_page_widget.dart';
+import 'package:appflowy_editor/appflowy_editor.dart';
+import 'package:flutter/services.dart';
+import 'package:flutter_test/flutter_test.dart';
+import 'package:integration_test/integration_test.dart';
+import 'util/keyboard.dart';
+import 'util/util.dart';
+
+/// Integration tests for an empty document. The [TestWorkspaceService] will load a workspace from an empty document `assets/test/workspaces/empty_document.zip` for all tests.
+///
+/// To create another integration test with a preconfigured workspace. Use the following steps:
+/// 1. Create a new workspace from the AppFlowy launch screen.
+/// 2. Modify the workspace until it is suitable as the starting point for the integration test you need to land.
+/// 3. Use a zip utility program to zip the workspace folder that you created.
+/// 4. Add the zip file under `assets/test/workspaces/`
+/// 5. Add a new enumeration to [TestWorkspace] in `integration_test/utils/data.dart`. For example, if you added a workspace called `empty_calendar.zip`, then [TestWorkspace] should have the following value:
+/// ```dart
+/// enum TestWorkspace {
+/// board('board'),
+/// empty_calendar('empty_calendar');
+///
+/// /* code */
+/// }
+/// ```
+/// 6. Double check that the .zip file that you added is included as an asset in the pubspec.yaml file under appflowy_flutter.
+void main() {
+ IntegrationTestWidgetsFlutterBinding.ensureInitialized();
+ const service = TestWorkspaceService(TestWorkspace.emptyDocument);
+
+ group('Tests on a workspace with only an empty document', () {
+ setUpAll(() async => await service.setUpAll());
+ setUp(() async => await service.setUp());
+
+ testWidgets('/board shortcut creates a new board and view of the board', (tester) async {
+ await tester.initializeAppFlowy();
+
+ // Needs tab to obtain focus for the app flowy editor.
+ // by default the tap appears at the center of the widget.
+ final Finder editor = find.byType(AppFlowyEditor);
+ await tester.tap(editor);
+ await tester.pumpAndSettle();
+
+ // tester.sendText() cannot be used since the editor
+ // does not contain any EditableText widgets.
+ // to interact with the app during an integration test,
+ // simulate physical keyboard events.
+ await FlowyTestKeyboard.simulateKeyDownEvent([
+ LogicalKeyboardKey.slash,
+ LogicalKeyboardKey.keyB,
+ LogicalKeyboardKey.keyO,
+ LogicalKeyboardKey.keyA,
+ LogicalKeyboardKey.keyR,
+ LogicalKeyboardKey.keyD,
+ LogicalKeyboardKey.arrowDown,
+ ], tester: tester);
+
+ // Checks whether the options in the selection menu
+ // for /board exist.
+ expect(find.byType(SelectionMenuItemWidget), findsAtLeastNWidgets(2));
+
+ // Finalizes the slash command that creates the board.
+ await FlowyTestKeyboard.simulateKeyDownEvent([
+ LogicalKeyboardKey.enter,
+ ], tester: tester);
+
+ // Checks whether new board is referenced and properly on the page.
+ expect(find.byType(BuiltInPageWidget), findsOneWidget);
+
+ // Checks whether the new database was created
+ const newBoardLabel = "Untitled";
+ expect(find.text(newBoardLabel), findsOneWidget);
+
+ // Checks whether a view of the database was created
+ const viewOfBoardLabel = "View of Untitled";
+ expect(find.text(viewOfBoardLabel), findsNWidgets(2));
+ });
+
+ testWidgets('/grid shortcut creates a new grid and view of the grid', (tester) async {
+ await tester.initializeAppFlowy();
+
+ // Needs tab to obtain focus for the app flowy editor.
+ // by default the tap appears at the center of the widget.
+ final Finder editor = find.byType(AppFlowyEditor);
+ await tester.tap(editor);
+ await tester.pumpAndSettle();
+
+ // tester.sendText() cannot be used since the editor
+ // does not contain any EditableText widgets.
+ // to interact with the app during an integration test,
+ // simulate physical keyboard events.
+ await FlowyTestKeyboard.simulateKeyDownEvent([
+ LogicalKeyboardKey.slash,
+ LogicalKeyboardKey.keyG,
+ LogicalKeyboardKey.keyR,
+ LogicalKeyboardKey.keyI,
+ LogicalKeyboardKey.keyD,
+ LogicalKeyboardKey.arrowDown,
+ ], tester: tester);
+
+ // Checks whether the options in the selection menu
+ // for /grid exist.
+ expect(find.byType(SelectionMenuItemWidget), findsAtLeastNWidgets(2));
+
+ // Finalizes the slash command that creates the board.
+ await simulateKeyDownEvent(LogicalKeyboardKey.enter);
+ await tester.pumpAndSettle();
+
+ // Checks whether new board is referenced and properly on the page.
+ expect(find.byType(BuiltInPageWidget), findsOneWidget);
+
+ // Checks whether the new database was created
+ const newTableLabel = "Untitled";
+ expect(find.text(newTableLabel), findsOneWidget);
+
+ // Checks whether a view of the database was created
+ const viewOfTableLabel = "View of Untitled";
+ expect(find.text(viewOfTableLabel), findsNWidgets(2));
+ });
+ });
+}
diff --git a/frontend/appflowy_flutter/integration_test/runner.dart b/frontend/appflowy_flutter/integration_test/runner.dart
new file mode 100644
index 0000000000..1592cccb93
--- /dev/null
+++ b/frontend/appflowy_flutter/integration_test/runner.dart
@@ -0,0 +1,19 @@
+import 'package:integration_test/integration_test.dart';
+
+import 'board_test.dart' as board_test;
+import 'switch_folder_test.dart' as switch_folder_test;
+import 'empty_document_test.dart' as empty_document_test;
+
+/// The main task runner for all integration tests in AppFlowy.
+///
+/// Having a single entrypoint for integration tests is necessary due to an
+/// [issue caused by switching files with integration testing](https://github.com/flutter/flutter/issues/101031).
+/// If flutter/flutter#101031 is resolved, this file can be removed completely.
+/// Once removed, the integration_test.yaml must be updated to exclude this as
+/// as the test target.
+void main() {
+ IntegrationTestWidgetsFlutterBinding.ensureInitialized();
+ switch_folder_test.main();
+ board_test.main();
+ empty_document_test.main();
+}
diff --git a/frontend/appflowy_flutter/integration_test/switch_folder_test.dart b/frontend/appflowy_flutter/integration_test/switch_folder_test.dart
index 555a5e41b1..6dcd41b081 100644
--- a/frontend/appflowy_flutter/integration_test/switch_folder_test.dart
+++ b/frontend/appflowy_flutter/integration_test/switch_folder_test.dart
@@ -1,10 +1,5 @@
-import 'package:appflowy/generated/locale_keys.g.dart';
-import 'package:appflowy/plugins/document/presentation/plugins/base/built_in_page_widget.dart';
import 'package:appflowy/user/presentation/folder/folder_widget.dart';
-import 'package:appflowy_editor/appflowy_editor.dart';
-import 'package:easy_localization/easy_localization.dart';
import 'package:flowy_infra_ui/style_widget/text_field.dart';
-import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:integration_test/integration_test.dart';
@@ -162,135 +157,5 @@ void main() {
await TestFolder.currentLocation(),
);
});
-
- testWidgets('/board shortcut creates a new board', (tester) async {
- const folderName = 'appflowy';
- await TestFolder.cleanTestLocation(folderName);
- await TestFolder.setTestLocation(folderName);
-
- await tester.initializeAppFlowy();
-
- // tap open button
- await mockGetDirectoryPath(folderName);
- await tester.tapOpenFolderButton();
-
- await tester.wait(1000);
- await tester.expectToSeeWelcomePage();
-
- final binding = IntegrationTestWidgetsFlutterBinding.ensureInitialized();
-
- // Necessary for being able to enterText when not in debug mode
- binding.testTextInput.register();
-
- // Needs tab to obtain focus for the app flowy editor.
- // by default the tap appears at the center of the widget.
- final Finder editor = find.byType(AppFlowyEditor);
- await tester.tap(editor);
- await tester.pumpAndSettle();
-
- // tester.sendText() cannot be used since the editor
- // does not contain any EditableText widgets.
- // to interact with the app during an integration test,
- // simulate physical keyboard events.
- await simulateKeyDownEvent(LogicalKeyboardKey.enter);
- await tester.pumpAndSettle();
- await simulateKeyDownEvent(LogicalKeyboardKey.enter);
- await tester.pumpAndSettle();
- await simulateKeyDownEvent(LogicalKeyboardKey.arrowLeft);
- await tester.pumpAndSettle();
- await simulateKeyDownEvent(LogicalKeyboardKey.slash);
- await tester.pumpAndSettle();
- await simulateKeyDownEvent(LogicalKeyboardKey.keyB);
- await tester.pumpAndSettle();
- await simulateKeyDownEvent(LogicalKeyboardKey.keyO);
- await tester.pumpAndSettle();
- await simulateKeyDownEvent(LogicalKeyboardKey.keyA);
- await tester.pumpAndSettle();
- await simulateKeyDownEvent(LogicalKeyboardKey.keyR);
- await tester.pumpAndSettle();
- await simulateKeyDownEvent(LogicalKeyboardKey.keyD);
- await tester.pumpAndSettle();
- await simulateKeyDownEvent(LogicalKeyboardKey.arrowDown);
- await tester.pumpAndSettle();
-
- // Checks whether the options in the selection menu
- // for /board exist.
- expect(find.byType(SelectionMenuItemWidget), findsAtLeastNWidgets(2));
-
- // Finalizes the slash command that creates the board.
- await simulateKeyDownEvent(LogicalKeyboardKey.enter);
- await tester.pumpAndSettle();
-
- // Checks whether new board is referenced and properly on the page.
- expect(find.byType(BuiltInPageWidget), findsOneWidget);
-
- // Checks whether the new board is in the side bar.
- final sidebarLabel = LocaleKeys.newPageText.tr();
- expect(find.text(sidebarLabel), findsOneWidget);
- });
-
- testWidgets('/grid shortcut creates a new grid', (tester) async {
- const folderName = 'appflowy';
- await TestFolder.cleanTestLocation(folderName);
- await TestFolder.setTestLocation(folderName);
-
- await tester.initializeAppFlowy();
-
- // tap open button
- await mockGetDirectoryPath(folderName);
- await tester.tapOpenFolderButton();
-
- await tester.wait(1000);
- await tester.expectToSeeWelcomePage();
-
- final binding = IntegrationTestWidgetsFlutterBinding.ensureInitialized();
-
- // Necessary for being able to enterText when not in debug mode
- binding.testTextInput.register();
-
- // Needs tab to obtain focus for the app flowy editor.
- // by default the tap appears at the center of the widget.
- final Finder editor = find.byType(AppFlowyEditor);
- await tester.tap(editor);
- await tester.pumpAndSettle();
-
- // tester.sendText() cannot be used since the editor
- // does not contain any EditableText widgets.
- // to interact with the app during an integration test,
- // simulate physical keyboard events.
- await simulateKeyDownEvent(LogicalKeyboardKey.enter);
- await tester.pumpAndSettle();
- await simulateKeyDownEvent(LogicalKeyboardKey.enter);
- await tester.pumpAndSettle();
- await simulateKeyDownEvent(LogicalKeyboardKey.arrowLeft);
- await tester.pumpAndSettle();
- await simulateKeyDownEvent(LogicalKeyboardKey.slash);
- await tester.pumpAndSettle();
- await simulateKeyDownEvent(LogicalKeyboardKey.keyG);
- await tester.pumpAndSettle();
- await simulateKeyDownEvent(LogicalKeyboardKey.keyR);
- await tester.pumpAndSettle();
- await simulateKeyDownEvent(LogicalKeyboardKey.keyI);
- await tester.pumpAndSettle();
- await simulateKeyDownEvent(LogicalKeyboardKey.keyD);
- await tester.pumpAndSettle();
- await simulateKeyDownEvent(LogicalKeyboardKey.arrowDown);
- await tester.pumpAndSettle();
-
- // Checks whether the options in the selection menu
- // for /grid exist.
- expect(find.byType(SelectionMenuItemWidget), findsAtLeastNWidgets(2));
-
- // Finalizes the slash command that creates the board.
- await simulateKeyDownEvent(LogicalKeyboardKey.enter);
- await tester.pumpAndSettle();
-
- // Checks whether new board is referenced and properly on the page.
- expect(find.byType(BuiltInPageWidget), findsOneWidget);
-
- // Checks whether the new board is in the side bar.
- final sidebarLabel = LocaleKeys.newPageText.tr();
- expect(find.text(sidebarLabel), findsOneWidget);
- });
});
}
diff --git a/frontend/appflowy_flutter/integration_test/util/data.dart b/frontend/appflowy_flutter/integration_test/util/data.dart
new file mode 100644
index 0000000000..a527950489
--- /dev/null
+++ b/frontend/appflowy_flutter/integration_test/util/data.dart
@@ -0,0 +1,66 @@
+import 'dart:io';
+
+import 'package:appflowy/workspace/application/settings/settings_location_cubit.dart';
+import 'package:archive/archive_io.dart';
+import 'package:flutter/services.dart';
+import 'package:path/path.dart' as p;
+import 'package:path_provider/path_provider.dart';
+import 'package:shared_preferences/shared_preferences.dart';
+
+enum TestWorkspace {
+ board("board"),
+ emptyDocument("empty_document");
+
+ const TestWorkspace(this._name);
+
+ final String _name;
+
+ Future get zip async {
+ final Directory parent = await TestWorkspace._parent;
+ final File out = File(p.join(parent.path, '$_name.zip'));
+ if (await out.exists()) return out;
+ await out.create();
+ final ByteData data = await rootBundle.load(_asset);
+ await out.writeAsBytes(data.buffer.asUint8List());
+ return out;
+ }
+
+ Future get root async {
+ final Directory parent = await TestWorkspace._parent;
+ return Directory(p.join(parent.path, _name));
+ }
+
+ static Future get _parent async {
+ final Directory root = await getTemporaryDirectory();
+ if (await root.exists()) return root;
+ await root.create();
+ return root;
+ }
+
+ String get _asset => 'assets/test/workspaces/$_name.zip';
+}
+
+class TestWorkspaceService {
+ const TestWorkspaceService(this.workspace);
+
+ final TestWorkspace workspace;
+
+ /// Instructs the application to read workspace data from the workspace found under this [TestWorkspace]'s path.
+ Future setUpAll() async {
+ SharedPreferences.setMockInitialValues(
+ {
+ kSettingsLocationDefaultLocation:
+ await workspace.root.then((value) => value.path),
+ },
+ );
+ }
+
+ /// Workspaces that are checked into source are compressed. [TestWorkspaceService.setUp()] decompresses the file into an ephemeral directory that will be ignored by source control.
+ Future setUp() async {
+ final inputStream =
+ InputFileStream(await workspace.zip.then((value) => value.path));
+ final archive = ZipDecoder().decodeBuffer(inputStream);
+ extractArchiveToDisk(
+ archive, await TestWorkspace._parent.then((value) => value.path));
+ }
+}
diff --git a/frontend/appflowy_flutter/integration_test/util/keyboard.dart b/frontend/appflowy_flutter/integration_test/util/keyboard.dart
new file mode 100644
index 0000000000..02bbdb79f1
--- /dev/null
+++ b/frontend/appflowy_flutter/integration_test/util/keyboard.dart
@@ -0,0 +1,12 @@
+import 'package:flutter/services.dart';
+import 'package:flutter_test/flutter_test.dart' as flutter_test;
+
+class FlowyTestKeyboard {
+ static Future simulateKeyDownEvent(List keys,
+ {required flutter_test.WidgetTester tester}) async {
+ for (final LogicalKeyboardKey key in keys) {
+ await flutter_test.simulateKeyDownEvent(key);
+ await tester.pumpAndSettle();
+ }
+ }
+}
diff --git a/frontend/appflowy_flutter/integration_test/util/util.dart b/frontend/appflowy_flutter/integration_test/util/util.dart
index 1b4b7c3272..20606483d3 100644
--- a/frontend/appflowy_flutter/integration_test/util/util.dart
+++ b/frontend/appflowy_flutter/integration_test/util/util.dart
@@ -1,3 +1,4 @@
export 'base.dart';
export 'launch.dart';
export 'settings.dart';
+export 'data.dart';
diff --git a/frontend/appflowy_flutter/lib/core/folder_notification.dart b/frontend/appflowy_flutter/lib/core/folder_notification.dart
index 4d147da88e..571561bbaa 100644
--- a/frontend/appflowy_flutter/lib/core/folder_notification.dart
+++ b/frontend/appflowy_flutter/lib/core/folder_notification.dart
@@ -3,7 +3,7 @@ import 'dart:typed_data';
import 'package:appflowy_backend/protobuf/flowy-notification/protobuf.dart';
import 'package:dartz/dartz.dart';
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/notification.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/notification.pb.dart';
import 'package:appflowy_backend/rust_stream.dart';
import 'notification_helper.dart';
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/application/database_controller.dart b/frontend/appflowy_flutter/lib/plugins/database_view/application/database_controller.dart
index 6cdbc964e4..86e6da42be 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/application/database_controller.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/application/database_controller.dart
@@ -9,7 +9,7 @@ import 'package:appflowy_backend/protobuf/flowy-database/group_changeset.pb.dart
import 'package:appflowy_backend/protobuf/flowy-database/row_entities.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-database/setting_entities.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:collection/collection.dart';
import 'dart:async';
import 'package:dartz/dartz.dart';
@@ -79,7 +79,7 @@ class DatabaseController {
final DatabaseViewBackendService _databaseViewBackendSvc;
final FieldController fieldController;
late DatabaseViewCache _viewCache;
- final LayoutTypePB layoutType;
+ final DatabaseLayoutPB layoutType;
// Callbacks
DatabaseCallbacks? _databaseCallbacks;
@@ -110,7 +110,7 @@ class DatabaseController {
_listenOnFieldsChanged();
_listenOnGroupChanged();
_listenOnLayoutChanged();
- if (layoutType == LayoutTypePB.Calendar) {
+ if (layoutType == DatabaseLayoutPB.Calendar) {
_listenOnCalendarLayoutChanged();
}
}
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/application/database_service.dart b/frontend/appflowy_flutter/lib/plugins/database_view/application/database_service.dart
index 4d12cae839..b6ca40b630 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/application/database_service.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/application/database_service.dart
@@ -5,7 +5,7 @@ import 'package:dartz/dartz.dart';
class DatabaseBackendService {
static Future, FlowyError>>
- getAllDatabase() {
+ getAllDatabases() {
return DatabaseEventGetDatabases().send().then((result) {
return result.fold((l) => left(l.items), (r) => right(r));
});
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/application/database_view_service.dart b/frontend/appflowy_flutter/lib/plugins/database_view/application/database_view_service.dart
index 5ecaad6ef3..bc6dd6e699 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/application/database_view_service.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/application/database_view_service.dart
@@ -5,7 +5,7 @@ import 'package:appflowy_backend/protobuf/flowy-database/setting_entities.pb.dar
import 'package:dartz/dartz.dart';
import 'package:appflowy_backend/dispatch/dispatch.dart';
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-database/field_entities.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-database/group.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-database/row_entities.pb.dart';
@@ -86,7 +86,7 @@ class DatabaseViewBackendService {
}
Future> getLayoutSetting(
- LayoutTypePB layoutType) {
+ DatabaseLayoutPB layoutType) {
final payload = DatabaseLayoutIdPB.create()
..viewId = viewId
..layout = layoutType;
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/application/field/field_action_sheet_bloc.dart b/frontend/appflowy_flutter/lib/plugins/database_view/application/field/field_action_sheet_bloc.dart
index 354bafbf1f..493f971177 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/application/field/field_action_sheet_bloc.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/application/field/field_action_sheet_bloc.dart
@@ -2,7 +2,6 @@ import 'package:appflowy_backend/log.dart';
import 'package:appflowy_backend/protobuf/flowy-database/field_entities.pb.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
-import 'dart:async';
import 'field_service.dart';
part 'field_action_sheet_bloc.freezed.dart';
@@ -64,11 +63,6 @@ class FieldActionSheetBloc
},
);
}
-
- @override
- Future close() async {
- return super.close();
- }
}
@freezed
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/application/field/field_editor_bloc.dart b/frontend/appflowy_flutter/lib/plugins/database_view/application/field/field_editor_bloc.dart
index 8ec40c1c93..491d266b7d 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/application/field/field_editor_bloc.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/application/field/field_editor_bloc.dart
@@ -1,6 +1,5 @@
import 'package:appflowy_backend/protobuf/flowy-database/field_entities.pb.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
-import 'dart:async';
import 'package:dartz/dartz.dart';
import 'field_service.dart';
import 'type_option/type_option_context.dart';
@@ -17,8 +16,7 @@ class FieldEditorBloc extends Bloc {
required String fieldName,
required bool isGroupField,
required IFieldTypeOptionLoader loader,
- }) : dataController =
- TypeOptionController(viewId: viewId, loader: loader),
+ }) : dataController = TypeOptionController(viewId: viewId, loader: loader),
super(FieldEditorState.initial(viewId, fieldName, isGroupField)) {
on(
(event, emit) async {
@@ -63,11 +61,6 @@ class FieldEditorBloc extends Bloc {
},
);
}
-
- @override
- Future close() async {
- return super.close();
- }
}
@freezed
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/application/field/type_option/date_bloc.dart b/frontend/appflowy_flutter/lib/plugins/database_view/application/field/type_option/date_bloc.dart
index 03eef86736..6762e0d7d3 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/application/field/type_option/date_bloc.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/application/field/type_option/date_bloc.dart
@@ -2,7 +2,6 @@ import 'package:appflowy_backend/protobuf/flowy-database/date_type_option.pb.dar
import 'package:appflowy_backend/protobuf/flowy-database/date_type_option_entities.pb.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
-import 'dart:async';
import 'package:protobuf/protobuf.dart';
import 'type_option_context.dart';
@@ -52,11 +51,6 @@ class DateTypeOptionBloc
}
});
}
-
- @override
- Future close() async {
- return super.close();
- }
}
@freezed
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/application/field/type_option/edit_select_option_bloc.dart b/frontend/appflowy_flutter/lib/plugins/database_view/application/field/type_option/edit_select_option_bloc.dart
index 063be6be32..873daaeabe 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/application/field/type_option/edit_select_option_bloc.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/application/field/type_option/edit_select_option_bloc.dart
@@ -1,7 +1,6 @@
import 'package:appflowy_backend/protobuf/flowy-database/select_type_option.pb.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
-import 'dart:async';
import 'package:protobuf/protobuf.dart';
import 'package:dartz/dartz.dart';
part 'edit_select_option_bloc.freezed.dart';
@@ -27,11 +26,6 @@ class EditSelectOptionBloc
);
}
- @override
- Future close() async {
- return super.close();
- }
-
SelectOptionPB _updateColor(SelectOptionColorPB color) {
state.option.freeze();
return state.option.rebuild((option) {
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/application/field/type_option/number_bloc.dart b/frontend/appflowy_flutter/lib/plugins/database_view/application/field/type_option/number_bloc.dart
index a66b5a88ca..b8e924819f 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/application/field/type_option/number_bloc.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/application/field/type_option/number_bloc.dart
@@ -2,7 +2,6 @@ import 'package:appflowy_backend/protobuf/flowy-database/format.pbenum.dart';
import 'package:appflowy_backend/protobuf/flowy-database/number_type_option.pb.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
-import 'dart:async';
import 'package:protobuf/protobuf.dart';
import 'type_option_context.dart';
@@ -29,11 +28,6 @@ class NumberTypeOptionBloc
typeOption.format = format;
});
}
-
- @override
- Future close() async {
- return super.close();
- }
}
@freezed
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/application/field/type_option/number_format_bloc.dart b/frontend/appflowy_flutter/lib/plugins/database_view/application/field/type_option/number_format_bloc.dart
index 4936f69900..4145e90aff 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/application/field/type_option/number_format_bloc.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/application/field/type_option/number_format_bloc.dart
@@ -1,7 +1,6 @@
import 'package:appflowy_backend/protobuf/flowy-database/format.pbenum.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
-import 'dart:async';
part 'number_format_bloc.freezed.dart';
class NumberFormatBloc extends Bloc {
@@ -21,11 +20,6 @@ class NumberFormatBloc extends Bloc {
},
);
}
-
- @override
- Future close() async {
- return super.close();
- }
}
@freezed
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/application/field/type_option/select_option_type_option_bloc.dart b/frontend/appflowy_flutter/lib/plugins/database_view/application/field/type_option/select_option_type_option_bloc.dart
index 5c608b474f..75c472f96d 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/application/field/type_option/select_option_type_option_bloc.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/application/field/type_option/select_option_type_option_bloc.dart
@@ -49,11 +49,6 @@ class SelectOptionTypeOptionBloc
},
);
}
-
- @override
- Future close() async {
- return super.close();
- }
}
@freezed
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/application/setting/setting_bloc.dart b/frontend/appflowy_flutter/lib/plugins/database_view/application/setting/setting_bloc.dart
index 9857a2871a..8c59036f56 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/application/setting/setting_bloc.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/application/setting/setting_bloc.dart
@@ -1,6 +1,5 @@
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
-import 'dart:async';
import 'package:dartz/dartz.dart';
part 'setting_bloc.freezed.dart';
@@ -18,11 +17,6 @@ class DatabaseSettingBloc
},
);
}
-
- @override
- Future close() async {
- return super.close();
- }
}
@freezed
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/board/application/board_bloc.dart b/frontend/appflowy_flutter/lib/plugins/database_view/board/application/board_bloc.dart
index 61911b5318..6acfbfc650 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/board/application/board_bloc.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/board/application/board_bloc.dart
@@ -6,7 +6,7 @@ import 'package:dartz/dartz.dart';
import 'package:equatable/equatable.dart';
import 'package:appflowy_backend/log.dart';
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-database/protobuf.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
@@ -30,7 +30,7 @@ class BoardBloc extends Bloc {
BoardBloc({required ViewPB view})
: _databaseController = DatabaseController(
view: view,
- layoutType: LayoutTypePB.Board,
+ layoutType: DatabaseLayoutPB.Board,
),
super(BoardState.initial(view.id)) {
boardController = AppFlowyBoardController(
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/board/application/toolbar/board_setting_bloc.dart b/frontend/appflowy_flutter/lib/plugins/database_view/board/application/toolbar/board_setting_bloc.dart
index 739d9ee141..e64072db56 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/board/application/toolbar/board_setting_bloc.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/board/application/toolbar/board_setting_bloc.dart
@@ -1,6 +1,5 @@
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
-import 'dart:async';
import 'package:dartz/dartz.dart';
part 'board_setting_bloc.freezed.dart';
@@ -17,11 +16,6 @@ class BoardSettingBloc extends Bloc {
},
);
}
-
- @override
- Future close() async {
- return super.close();
- }
}
@freezed
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/board/board.dart b/frontend/appflowy_flutter/lib/plugins/database_view/board/board.dart
index fe1702873a..15adee1187 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/board/board.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/board/board.dart
@@ -3,7 +3,7 @@ import 'package:appflowy/plugins/util.dart';
import 'package:appflowy/startup/plugin/plugin.dart';
import 'package:appflowy/workspace/presentation/home/home_stack.dart';
import 'package:appflowy/workspace/presentation/widgets/left_bar_item.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
@@ -29,7 +29,7 @@ class BoardPluginBuilder implements PluginBuilder {
PluginType get pluginType => PluginType.board;
@override
- ViewLayoutTypePB? get layoutType => ViewLayoutTypePB.Board;
+ ViewLayoutPB? get layoutType => ViewLayoutPB.Board;
}
class BoardPluginConfig implements PluginConfig {
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/board/presentation/board_page.dart b/frontend/appflowy_flutter/lib/plugins/database_view/board/presentation/board_page.dart
index cbd85594a0..095ffab019 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/board/presentation/board_page.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/board/presentation/board_page.dart
@@ -7,7 +7,7 @@ import 'package:appflowy/plugins/database_view/application/field/field_controlle
import 'package:appflowy/plugins/database_view/application/row/row_cache.dart';
import 'package:appflowy/plugins/database_view/application/row/row_data_controller.dart';
import 'package:appflowy/plugins/database_view/widgets/row/row_detail.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-database/field_entities.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-database/row_entities.pb.dart';
import 'package:appflowy_board/appflowy_board.dart';
@@ -184,7 +184,7 @@ class _BoardContentState extends State {
width: 20,
child: svgWidget(
"home/add",
- color: Theme.of(context).colorScheme.onSurface,
+ color: Theme.of(context).iconTheme.color,
),
),
onAddButtonClick: () {
@@ -207,7 +207,7 @@ class _BoardContentState extends State {
width: 20,
child: svgWidget(
"home/add",
- color: Theme.of(context).colorScheme.onSurface,
+ color: Theme.of(context).iconTheme.color,
),
),
title: FlowyText.medium(
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/board/presentation/toolbar/board_setting.dart b/frontend/appflowy_flutter/lib/plugins/database_view/board/presentation/toolbar/board_setting.dart
index 5e97c9875f..97118c8e32 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/board/presentation/toolbar/board_setting.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/board/presentation/toolbar/board_setting.dart
@@ -113,7 +113,7 @@ class _SettingItem extends StatelessWidget {
},
leftIcon: svgWidget(
action.iconName(),
- color: Theme.of(context).colorScheme.onSurface,
+ color: Theme.of(context).iconTheme.color,
),
),
);
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/calendar/application/calendar_bloc.dart b/frontend/appflowy_flutter/lib/plugins/database_view/calendar/application/calendar_bloc.dart
index f0cfb43b48..db5150d8d4 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/calendar/application/calendar_bloc.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/calendar/application/calendar_bloc.dart
@@ -3,7 +3,7 @@ import 'package:appflowy/plugins/database_view/application/field/field_controlle
import 'package:appflowy_backend/dispatch/dispatch.dart';
import 'package:appflowy_backend/log.dart';
import 'package:appflowy_backend/protobuf/flowy-error/protobuf.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/protobuf.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/protobuf.dart';
import 'package:appflowy_backend/protobuf/flowy-database/protobuf.dart';
import 'package:calendar_view/calendar_view.dart';
import 'package:dartz/dartz.dart';
@@ -28,7 +28,7 @@ class CalendarBloc extends Bloc {
CalendarBloc({required ViewPB view})
: _databaseController = DatabaseController(
view: view,
- layoutType: LayoutTypePB.Calendar,
+ layoutType: DatabaseLayoutPB.Calendar,
),
super(CalendarState.initial()) {
on(
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/calendar/application/calendar_setting_bloc.dart b/frontend/appflowy_flutter/lib/plugins/database_view/calendar/application/calendar_setting_bloc.dart
index 1ebc97d90a..074836236f 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/calendar/application/calendar_setting_bloc.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/calendar/application/calendar_setting_bloc.dart
@@ -23,8 +23,6 @@ class CalendarSettingBloc
});
}
- @override
- Future close() async => super.close();
}
@freezed
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/calendar/calendar.dart b/frontend/appflowy_flutter/lib/plugins/database_view/calendar/calendar.dart
index 1ddfb7a64f..558db1419a 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/calendar/calendar.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/calendar/calendar.dart
@@ -3,7 +3,7 @@ import 'package:appflowy/startup/plugin/plugin.dart';
import 'package:appflowy/workspace/presentation/home/home_stack.dart';
import 'package:appflowy/workspace/presentation/widgets/left_bar_item.dart';
import 'package:easy_localization/easy_localization.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:flutter/material.dart';
import '../../util.dart';
@@ -29,7 +29,7 @@ class CalendarPluginBuilder extends PluginBuilder {
PluginType get pluginType => PluginType.calendar;
@override
- ViewLayoutTypePB? get layoutType => ViewLayoutTypePB.Calendar;
+ ViewLayoutPB? get layoutType => ViewLayoutPB.Calendar;
}
class CalendarPluginConfig implements PluginConfig {
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/calendar/presentation/calendar_day.dart b/frontend/appflowy_flutter/lib/plugins/database_view/calendar/presentation/calendar_day.dart
index 3a71c2c4ff..0b835f8a39 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/calendar/presentation/calendar_day.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/calendar/presentation/calendar_day.dart
@@ -203,7 +203,7 @@ class _NewEventButton extends StatelessWidget {
iconPadding: EdgeInsets.zero,
icon: svgWidget(
"home/add",
- color: Theme.of(context).colorScheme.onSurface,
+ color: Theme.of(context).iconTheme.color,
),
width: 22,
);
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/calendar/presentation/calendar_page.dart b/frontend/appflowy_flutter/lib/plugins/database_view/calendar/presentation/calendar_page.dart
index 988654a8ec..943af77ce4 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/calendar/presentation/calendar_page.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/calendar/presentation/calendar_page.dart
@@ -1,6 +1,6 @@
import 'package:appflowy/generated/locale_keys.g.dart';
import 'package:appflowy/plugins/database_view/calendar/application/calendar_bloc.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:calendar_view/calendar_view.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flowy_infra/image.dart';
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/grid/application/filter/select_option_filter_list_bloc.dart b/frontend/appflowy_flutter/lib/plugins/database_view/grid/application/filter/select_option_filter_list_bloc.dart
index 9ff924c449..cd95541905 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/grid/application/filter/select_option_filter_list_bloc.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/grid/application/filter/select_option_filter_list_bloc.dart
@@ -1,5 +1,3 @@
-import 'dart:async';
-
import 'package:appflowy/plugins/database_view/grid/presentation/widgets/filter/choicechip/select_option/select_option_loader.dart';
import 'package:appflowy_backend/protobuf/flowy-database/field_entities.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-database/select_type_option.pb.dart';
@@ -63,11 +61,6 @@ class SelectOptionFilterListBloc
);
}
- @override
- Future close() async {
- return super.close();
- }
-
void _updateSelectOptions({
String? predicate,
Set? selectedOptionIds,
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/grid/application/grid_bloc.dart b/frontend/appflowy_flutter/lib/plugins/database_view/grid/application/grid_bloc.dart
index 7d73ab9b4a..01082746e3 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/grid/application/grid_bloc.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/grid/application/grid_bloc.dart
@@ -4,7 +4,7 @@ import 'package:appflowy/plugins/database_view/application/row/row_service.dart'
import 'package:dartz/dartz.dart';
import 'package:equatable/equatable.dart';
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-database/protobuf.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/grid/application/grid_header_bloc.dart b/frontend/appflowy_flutter/lib/plugins/database_view/grid/application/grid_header_bloc.dart
index 7d212a80e0..92486a699b 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/grid/application/grid_header_bloc.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/grid/application/grid_header_bloc.dart
@@ -61,11 +61,6 @@ class GridHeaderBloc extends Bloc {
listenWhen: () => !isClosed,
);
}
-
- @override
- Future close() async {
- return super.close();
- }
}
@freezed
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/grid/application/row/row_action_sheet_bloc.dart b/frontend/appflowy_flutter/lib/plugins/database_view/grid/application/row/row_action_sheet_bloc.dart
index 1ff5529ad9..aab8875a4c 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/grid/application/row/row_action_sheet_bloc.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/grid/application/row/row_action_sheet_bloc.dart
@@ -2,7 +2,6 @@ import 'package:appflowy_backend/log.dart';
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
-import 'dart:async';
import 'package:dartz/dartz.dart';
import '../../../application/row/row_cache.dart';
@@ -34,11 +33,6 @@ class RowActionSheetBloc
);
}
- @override
- Future close() async {
- return super.close();
- }
-
void logResult(Either result) {
result.fold((l) => null, (err) => Log.error(err));
}
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/grid/grid.dart b/frontend/appflowy_flutter/lib/plugins/database_view/grid/grid.dart
index ba4bc2f628..283eca5701 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/grid/grid.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/grid/grid.dart
@@ -4,7 +4,7 @@ import 'package:appflowy/startup/plugin/plugin.dart';
import 'package:appflowy/workspace/presentation/home/home_stack.dart';
import 'package:appflowy/workspace/presentation/widgets/left_bar_item.dart';
import 'package:easy_localization/easy_localization.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:flutter/material.dart';
import 'presentation/grid_page.dart';
@@ -29,7 +29,7 @@ class GridPluginBuilder implements PluginBuilder {
PluginType get pluginType => PluginType.grid;
@override
- ViewLayoutTypePB? get layoutType => ViewLayoutTypePB.Grid;
+ ViewLayoutPB? get layoutType => ViewLayoutPB.Grid;
}
class GridPluginConfig implements PluginConfig {
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/grid_page.dart b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/grid_page.dart
index 2b8f9a060c..2db3051642 100755
--- a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/grid_page.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/grid_page.dart
@@ -8,7 +8,7 @@ import 'package:flowy_infra_ui/style_widget/scrolling/styled_scroll_bar.dart';
import 'package:flowy_infra_ui/style_widget/scrolling/styled_scrollview.dart';
import 'package:flowy_infra_ui/style_widget/text.dart';
import 'package:flowy_infra_ui/widget/error_page.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter/material.dart';
import 'package:linked_scroll_controller/linked_scroll_controller.dart';
@@ -38,7 +38,7 @@ class GridPage extends StatefulWidget {
Key? key,
}) : databaseController = DatabaseController(
view: view,
- layoutType: LayoutTypePB.Grid,
+ layoutType: DatabaseLayoutPB.Grid,
),
super(key: key);
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/filter/choicechip/choicechip.dart b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/filter/choicechip/choicechip.dart
index 8aa9892d41..46fb701441 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/filter/choicechip/choicechip.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/filter/choicechip/choicechip.dart
@@ -38,12 +38,15 @@ class ChoiceChipButton extends StatelessWidget {
child: FlowyButton(
decoration: decoration,
useIntrinsicWidth: true,
- text: FlowyText(filterInfo.fieldInfo.name),
+ text: FlowyText(
+ filterInfo.fieldInfo.name,
+ color: AFThemeExtension.of(context).textColor,
+ ),
margin: const EdgeInsets.symmetric(horizontal: 8, vertical: 2),
radius: const BorderRadius.all(Radius.circular(14)),
leftIcon: svgWidget(
filterInfo.fieldInfo.fieldType.iconName(),
- color: Theme.of(context).colorScheme.onSurface,
+ color: Theme.of(context).iconTheme.color,
),
rightIcon: _ChoicechipFilterDesc(filterDesc: filterDesc),
hoverColor: AFThemeExtension.of(context).lightGreyHover,
@@ -62,7 +65,8 @@ class _ChoicechipFilterDesc extends StatelessWidget {
Widget build(BuildContext context) {
final arrow = Transform.rotate(
angle: -math.pi / 2,
- child: svgWidget("home/arrow_left"),
+ child: svgWidget("home/arrow_left",
+ color: AFThemeExtension.of(context).textColor),
);
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 2),
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/filter/condition_button.dart b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/filter/condition_button.dart
index ef4d58f447..660c0b0316 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/filter/condition_button.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/filter/condition_button.dart
@@ -18,14 +18,19 @@ class ConditionButton extends StatelessWidget {
Widget build(BuildContext context) {
final arrow = Transform.rotate(
angle: -math.pi / 2,
- child: svgWidget("home/arrow_left"),
+ child: svgWidget("home/arrow_left",
+ color: AFThemeExtension.of(context).textColor),
);
return SizedBox(
height: 20,
child: FlowyButton(
useIntrinsicWidth: true,
- text: FlowyText(conditionName, fontSize: 10),
+ text: FlowyText(
+ conditionName,
+ fontSize: 10,
+ color: AFThemeExtension.of(context).textColor,
+ ),
margin: const EdgeInsets.symmetric(horizontal: 4),
radius: const BorderRadius.all(Radius.circular(2)),
rightIcon: arrow,
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/filter/create_filter_list.dart b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/filter/create_filter_list.dart
index e473034fb3..42ba35640e 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/filter/create_filter_list.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/filter/create_filter_list.dart
@@ -3,6 +3,7 @@ import 'package:appflowy/plugins/database_view/grid/presentation/layout/sizes.da
import 'package:appflowy/plugins/database_view/grid/presentation/widgets/header/field_type_extension.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flowy_infra/image.dart';
+import 'package:flowy_infra/theme_extension.dart';
import 'package:flowy_infra_ui/style_widget/button.dart';
import 'package:flowy_infra_ui/style_widget/scrolling/styled_list.dart';
import 'package:flowy_infra_ui/style_widget/text.dart';
@@ -117,19 +118,16 @@ class _FilterTextFieldDelegate extends SliverPersistentHeaderDelegate {
@override
Widget build(
BuildContext context, double shrinkOffset, bool overlapsContent) {
- return Padding(
+ return Container(
padding: const EdgeInsets.only(top: 4),
- child: Container(
- color: Theme.of(context).colorScheme.background,
- height: fixHeight,
- child: FlowyTextField(
- hintText: LocaleKeys.grid_settings_filterBy.tr(),
- onChanged: (text) {
- context
- .read()
- .add(GridCreateFilterEvent.didReceiveFilterText(text));
- },
- ),
+ height: fixHeight,
+ child: FlowyTextField(
+ hintText: LocaleKeys.grid_settings_filterBy.tr(),
+ onChanged: (text) {
+ context
+ .read()
+ .add(GridCreateFilterEvent.didReceiveFilterText(text));
+ },
),
);
}
@@ -158,11 +156,15 @@ class _FilterPropertyCell extends StatelessWidget {
@override
Widget build(BuildContext context) {
return FlowyButton(
- text: FlowyText.medium(fieldInfo.name),
+ hoverColor: AFThemeExtension.of(context).lightGreyHover,
+ text: FlowyText.medium(
+ fieldInfo.name,
+ color: AFThemeExtension.of(context).textColor,
+ ),
onTap: () => onTap(fieldInfo),
leftIcon: svgWidget(
fieldInfo.fieldType.iconName(),
- color: Theme.of(context).colorScheme.onSurface,
+ color: Theme.of(context).iconTheme.color,
),
);
}
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/filter/disclosure_button.dart b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/filter/disclosure_button.dart
index 7bab27b745..fd296a73e0 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/filter/disclosure_button.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/filter/disclosure_button.dart
@@ -3,6 +3,7 @@ import 'package:appflowy/workspace/presentation/widgets/pop_up_action.dart';
import 'package:appflowy_popover/appflowy_popover.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flowy_infra/image.dart';
+import 'package:flowy_infra/theme_extension.dart';
import 'package:flowy_infra_ui/style_widget/icon_button.dart';
import 'package:flutter/material.dart';
@@ -31,10 +32,11 @@ class _DisclosureButtonState extends State {
.toList(),
buildChild: (controller) {
return FlowyIconButton(
+ hoverColor: AFThemeExtension.of(context).lightGreyHover,
width: 20,
icon: svgWidget(
"editor/details",
- color: Theme.of(context).colorScheme.onSurface,
+ color: Theme.of(context).iconTheme.color,
),
onPressed: () => controller.show(),
);
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/filter/filter_menu.dart b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/filter/filter_menu.dart
index a7f17b1e8a..91cbcbe54b 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/filter/filter_menu.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/filter/filter_menu.dart
@@ -71,12 +71,15 @@ class _AddFilterButtonState extends State {
SizedBox(
height: 28,
child: FlowyButton(
- text: FlowyText(LocaleKeys.grid_settings_addFilter.tr()),
+ text: FlowyText(
+ LocaleKeys.grid_settings_addFilter.tr(),
+ color: AFThemeExtension.of(context).textColor,
+ ),
useIntrinsicWidth: true,
hoverColor: AFThemeExtension.of(context).lightGreyHover,
leftIcon: svgWidget(
"home/add",
- color: Theme.of(context).colorScheme.onSurface,
+ color: Theme.of(context).iconTheme.color,
),
onTap: () => popoverController.show(),
),
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/footer/grid_footer.dart b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/footer/grid_footer.dart
index 9e4eeb1a4a..b985f59430 100755
--- a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/footer/grid_footer.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/footer/grid_footer.dart
@@ -14,12 +14,15 @@ class GridAddRowButton extends StatelessWidget {
@override
Widget build(BuildContext context) {
return FlowyButton(
- text: FlowyText.medium(LocaleKeys.grid_row_newRow.tr()),
+ text: FlowyText.medium(
+ LocaleKeys.grid_row_newRow.tr(),
+ color: Theme.of(context).colorScheme.tertiary,
+ ),
hoverColor: AFThemeExtension.of(context).lightGreyHover,
onTap: () => context.read().add(const GridEvent.createRow()),
leftIcon: svgWidget(
"home/add",
- color: Theme.of(context).colorScheme.onSurface,
+ color: Theme.of(context).colorScheme.tertiary,
),
);
}
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/header/field_cell.dart b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/header/field_cell.dart
index 91d5368286..526276e0f2 100755
--- a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/header/field_cell.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/header/field_cell.dart
@@ -164,11 +164,10 @@ class FieldCellButton extends StatelessWidget {
.replaceAll(Characters(''), Characters('\u{200B}'))
.toString();
return FlowyButton(
- hoverColor: AFThemeExtension.of(context).lightGreyHover,
+ hoverColor: AFThemeExtension.of(context).greyHover,
onTap: onTap,
- leftIcon: svgWidget(
- field.fieldType.iconName(),
- color: Theme.of(context).colorScheme.onSurface,
+ leftIcon: FlowySvg(
+ name: field.fieldType.iconName(),
),
radius: BorderRadius.zero,
text: FlowyText.medium(
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/header/field_cell_action_sheet.dart b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/header/field_cell_action_sheet.dart
index 4cd23e3b84..cf44799a88 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/header/field_cell_action_sheet.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/header/field_cell_action_sheet.dart
@@ -5,6 +5,7 @@ import 'package:appflowy/startup/startup.dart';
import 'package:appflowy/workspace/presentation/widgets/dialogs.dart';
import 'package:appflowy_popover/appflowy_popover.dart';
import 'package:flowy_infra/image.dart';
+import 'package:flowy_infra/theme_extension.dart';
import 'package:flowy_infra_ui/style_widget/button.dart';
import 'package:flowy_infra_ui/style_widget/text.dart';
import 'package:flowy_infra_ui/widget/spacing.dart';
@@ -81,8 +82,10 @@ class _EditFieldButton extends StatelessWidget {
return SizedBox(
height: GridSize.popoverItemHeight,
child: FlowyButton(
+ hoverColor: AFThemeExtension.of(context).lightGreyHover,
text: FlowyText.medium(
LocaleKeys.grid_field_editProperty.tr(),
+ color: AFThemeExtension.of(context).textColor,
),
onTap: onTap,
),
@@ -148,9 +151,12 @@ class FieldActionCell extends StatelessWidget {
@override
Widget build(BuildContext context) {
return FlowyButton(
+ hoverColor: AFThemeExtension.of(context).lightGreyHover,
text: FlowyText.medium(
action.title(),
- color: enable ? null : Theme.of(context).disabledColor,
+ color: enable
+ ? AFThemeExtension.of(context).textColor
+ : Theme.of(context).disabledColor,
),
onTap: () {
if (enable) {
@@ -160,7 +166,7 @@ class FieldActionCell extends StatelessWidget {
leftIcon: svgWidget(
action.iconName(),
color: enable
- ? Theme.of(context).colorScheme.onSurface
+ ? AFThemeExtension.of(context).textColor
: Theme.of(context).disabledColor,
),
);
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/header/field_editor.dart b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/header/field_editor.dart
index 29e38e7a72..ff0abf92af 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/header/field_editor.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/header/field_editor.dart
@@ -147,6 +147,8 @@ class _FieldNameTextFieldState extends State<_FieldNameTextField> {
widget.popoverMutex.listenOnPopoverChanged(() {
if (focusNode.hasFocus) {
focusNode.unfocus();
+ } else {
+ focusNode.requestFocus();
}
});
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/header/field_type_list.dart b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/header/field_type_list.dart
index da6c28d606..b05d9391c3 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/header/field_type_list.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/header/field_type_list.dart
@@ -1,5 +1,6 @@
import 'package:appflowy_popover/appflowy_popover.dart';
import 'package:flowy_infra/image.dart';
+import 'package:flowy_infra/theme_extension.dart';
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
import 'package:appflowy_backend/protobuf/flowy-database/field_entities.pb.dart';
import 'package:flutter/material.dart';
@@ -57,11 +58,15 @@ class FieldTypeCell extends StatelessWidget {
return SizedBox(
height: GridSize.popoverItemHeight,
child: FlowyButton(
- text: FlowyText.medium(fieldType.title()),
+ hoverColor: AFThemeExtension.of(context).lightGreyHover,
+ text: FlowyText.medium(
+ fieldType.title(),
+ color: AFThemeExtension.of(context).textColor,
+ ),
onTap: () => onSelectField(fieldType),
leftIcon: svgWidget(
fieldType.iconName(),
- color: Theme.of(context).colorScheme.onSurface,
+ color: Theme.of(context).iconTheme.color,
),
),
);
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/header/field_type_option_editor.dart b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/header/field_type_option_editor.dart
index 4974490642..b8d1e9a26a 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/header/field_type_option_editor.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/header/field_type_option_editor.dart
@@ -4,6 +4,7 @@ import 'package:appflowy/plugins/database_view/application/field/type_option/typ
import 'package:appflowy_popover/appflowy_popover.dart';
import 'package:dartz/dartz.dart' show Either;
import 'package:flowy_infra/image.dart';
+import 'package:flowy_infra/theme_extension.dart';
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-database/field_entities.pb.dart';
@@ -110,17 +111,19 @@ class _SwitchFieldButton extends StatelessWidget {
Widget _buildMoreButton(BuildContext context) {
final bloc = context.read();
return FlowyButton(
+ hoverColor: AFThemeExtension.of(context).lightGreyHover,
text: FlowyText.medium(
bloc.state.field.fieldType.title(),
+ color: AFThemeExtension.of(context).textColor,
),
margin: GridSize.typeOptionContentInsets,
leftIcon: svgWidget(
bloc.state.field.fieldType.iconName(),
- color: Theme.of(context).colorScheme.onSurface,
+ color: Theme.of(context).iconTheme.color,
),
rightIcon: svgWidget(
"grid/more",
- color: Theme.of(context).colorScheme.onSurface,
+ color: Theme.of(context).iconTheme.color,
),
);
}
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/header/grid_header.dart b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/header/grid_header.dart
index 0e4c6e28f5..6a77ac83ee 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/header/grid_header.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/header/grid_header.dart
@@ -178,12 +178,9 @@ class CreateFieldButton extends StatelessWidget {
child: FlowyButton(
radius: BorderRadius.zero,
text: FlowyText.medium(LocaleKeys.grid_field_newColumn.tr()),
- hoverColor: AFThemeExtension.of(context).lightGreyHover,
+ hoverColor: AFThemeExtension.of(context).greyHover,
onTap: () {},
- leftIcon: svgWidget(
- "home/add",
- color: Theme.of(context).colorScheme.onSurface,
- ),
+ leftIcon: const FlowySvg(name: 'home/add'),
),
popupBuilder: (BuildContext popover) {
return FieldEditor(
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/header/type_option/date.dart b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/header/type_option/date.dart
index a92ba48fd8..12237b8350 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/header/type_option/date.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/header/type_option/date.dart
@@ -151,10 +151,7 @@ class DateFormatButton extends StatelessWidget {
margin: buttonMargins,
onTap: onTap,
onHover: onHover,
- rightIcon: svgWidget(
- "grid/more",
- color: Theme.of(context).colorScheme.onSurface,
- ),
+ rightIcon: const FlowySvg(name: 'grid/more'),
),
);
}
@@ -182,10 +179,7 @@ class TimeFormatButton extends StatelessWidget {
margin: buttonMargins,
onTap: onTap,
onHover: onHover,
- rightIcon: svgWidget(
- "grid/more",
- color: Theme.of(context).colorScheme.onSurface,
- ),
+ rightIcon: const FlowySvg(name: 'grid/more'),
),
);
}
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/header/type_option/number.dart b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/header/type_option/number.dart
index fd5824a0d1..45479046c5 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/header/type_option/number.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/header/type_option/number.dart
@@ -61,7 +61,7 @@ class NumberTypeOptionWidget extends TypeOptionWidget {
margin: GridSize.typeOptionContentInsets,
rightIcon: svgWidget(
"grid/more",
- color: Theme.of(context).colorScheme.onSurface,
+ color: Theme.of(context).iconTheme.color,
),
text: Row(
children: [
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/header/type_option/select_option.dart b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/header/type_option/select_option.dart
index e30f460c16..56a0ad0736 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/header/type_option/select_option.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/header/type_option/select_option.dart
@@ -1,6 +1,7 @@
import 'package:appflowy/plugins/database_view/application/field/type_option/select_option_type_option_bloc.dart';
import 'package:appflowy_popover/appflowy_popover.dart';
import 'package:flowy_infra/image.dart';
+import 'package:flowy_infra/theme_extension.dart';
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
import 'package:appflowy_backend/protobuf/flowy-database/select_type_option.pb.dart';
import 'package:flutter/material.dart';
@@ -194,7 +195,7 @@ class _OptionCellState extends State<_OptionCell> {
padding: const EdgeInsets.symmetric(horizontal: 6.0),
child: svgWidget(
"grid/details",
- color: Theme.of(context).colorScheme.onSurface,
+ color: Theme.of(context).iconTheme.color,
),
),
],
@@ -243,7 +244,11 @@ class _AddOptionButton extends StatelessWidget {
child: SizedBox(
height: GridSize.popoverItemHeight,
child: FlowyButton(
- text: FlowyText.medium(LocaleKeys.grid_field_addSelectOption.tr()),
+ hoverColor: AFThemeExtension.of(context).lightGreyHover,
+ text: FlowyText.medium(
+ LocaleKeys.grid_field_addSelectOption.tr(),
+ color: AFThemeExtension.of(context).textColor,
+ ),
onTap: () {
context
.read()
@@ -251,7 +256,7 @@ class _AddOptionButton extends StatelessWidget {
},
leftIcon: svgWidget(
"home/add",
- color: Theme.of(context).colorScheme.onSurface,
+ color: Theme.of(context).iconTheme.color,
),
),
),
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/header/type_option/select_option_editor.dart b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/header/type_option/select_option_editor.dart
index c248ec01df..36ebffa692 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/header/type_option/select_option_editor.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/header/type_option/select_option_editor.dart
@@ -1,6 +1,7 @@
import 'package:appflowy/plugins/database_view/application/field/type_option/edit_select_option_bloc.dart';
import 'package:appflowy/plugins/database_view/widgets/row/cells/select_option_cell/extension.dart';
import 'package:flowy_infra/image.dart';
+import 'package:flowy_infra/theme_extension.dart';
import 'package:flowy_infra_ui/style_widget/button.dart';
import 'package:flowy_infra_ui/style_widget/scrolling/styled_list.dart';
import 'package:flowy_infra_ui/style_widget/text.dart';
@@ -103,10 +104,14 @@ class _DeleteTag extends StatelessWidget {
return SizedBox(
height: GridSize.popoverItemHeight,
child: FlowyButton(
- text: FlowyText.medium(LocaleKeys.grid_selectOption_deleteTag.tr()),
+ hoverColor: AFThemeExtension.of(context).lightGreyHover,
+ text: FlowyText.medium(
+ LocaleKeys.grid_selectOption_deleteTag.tr(),
+ color: AFThemeExtension.of(context).textColor,
+ ),
leftIcon: svgWidget(
"grid/delete",
- color: Theme.of(context).colorScheme.onSurface,
+ color: Theme.of(context).iconTheme.color,
),
onTap: () {
context
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/row/action.dart b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/row/action.dart
index 2aecd5f868..33e1a69c7a 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/row/action.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/row/action.dart
@@ -3,6 +3,7 @@ import 'package:appflowy/plugins/database_view/grid/application/row/row_action_s
import 'package:easy_localization/easy_localization.dart';
import 'package:appflowy/generated/locale_keys.g.dart';
import 'package:flowy_infra/image.dart';
+import 'package:flowy_infra/theme_extension.dart';
import 'package:flowy_infra_ui/style_widget/button.dart';
import 'package:flowy_infra_ui/style_widget/scrolling/styled_list.dart';
import 'package:flowy_infra_ui/style_widget/text.dart';
@@ -56,9 +57,12 @@ class _ActionCell extends StatelessWidget {
return SizedBox(
height: GridSize.popoverItemHeight,
child: FlowyButton(
+ hoverColor: AFThemeExtension.of(context).lightGreyHover,
text: FlowyText.medium(
action.title(),
- color: action.enable() ? null : Theme.of(context).disabledColor,
+ color: action.enable()
+ ? AFThemeExtension.of(context).textColor
+ : Theme.of(context).disabledColor,
),
onTap: () {
if (action.enable()) {
@@ -67,7 +71,7 @@ class _ActionCell extends StatelessWidget {
},
leftIcon: svgWidget(
action.iconName(),
- color: Theme.of(context).colorScheme.onSurface,
+ color: Theme.of(context).iconTheme.color,
),
),
);
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/row/row.dart b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/row/row.dart
index 09aff68112..425dec6317 100755
--- a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/row/row.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/row/row.dart
@@ -5,6 +5,7 @@ import 'package:appflowy/plugins/database_view/grid/application/row/row_bloc.dar
import 'package:appflowy/plugins/database_view/widgets/row/cell_builder.dart';
import 'package:appflowy_popover/appflowy_popover.dart';
import 'package:flowy_infra/image.dart';
+import 'package:flowy_infra/theme_extension.dart';
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
@@ -152,11 +153,15 @@ class _InsertButton extends StatelessWidget {
Widget build(BuildContext context) {
return FlowyIconButton(
tooltipText: LocaleKeys.tooltip_addNewRow.tr(),
+ hoverColor: AFThemeExtension.of(context).lightGreyHover,
width: 20,
height: 30,
onPressed: () => context.read().add(const RowEvent.createRow()),
iconPadding: const EdgeInsets.all(3),
- icon: svgWidget("home/add"),
+ icon: svgWidget(
+ 'home/add',
+ color: Theme.of(context).colorScheme.tertiary,
+ ),
);
}
}
@@ -182,11 +187,15 @@ class _MenuButtonState extends State<_MenuButton> {
Widget build(BuildContext context) {
return FlowyIconButton(
tooltipText: LocaleKeys.tooltip_openMenu.tr(),
+ hoverColor: AFThemeExtension.of(context).lightGreyHover,
width: 20,
height: 30,
onPressed: () => widget.openMenu(),
iconPadding: const EdgeInsets.all(3),
- icon: svgWidget("editor/details"),
+ icon: svgWidget(
+ 'editor/details',
+ color: Theme.of(context).colorScheme.tertiary,
+ ),
);
}
}
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/sort/create_sort_list.dart b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/sort/create_sort_list.dart
index 22f3403a4d..6dea5acb43 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/sort/create_sort_list.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/sort/create_sort_list.dart
@@ -5,6 +5,7 @@ import 'package:appflowy/plugins/database_view/grid/presentation/layout/sizes.da
import 'package:appflowy/plugins/database_view/grid/presentation/widgets/header/field_type_extension.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flowy_infra/image.dart';
+import 'package:flowy_infra/theme_extension.dart';
import 'package:flowy_infra_ui/style_widget/button.dart';
import 'package:flowy_infra_ui/style_widget/scrolling/styled_list.dart';
import 'package:flowy_infra_ui/style_widget/text.dart';
@@ -116,19 +117,16 @@ class _FilterTextFieldDelegate extends SliverPersistentHeaderDelegate {
@override
Widget build(
BuildContext context, double shrinkOffset, bool overlapsContent) {
- return Padding(
+ return Container(
padding: const EdgeInsets.only(top: 4),
- child: Container(
- color: Theme.of(context).colorScheme.background,
- height: fixHeight,
- child: FlowyTextField(
- hintText: LocaleKeys.grid_settings_sortBy.tr(),
- onChanged: (text) {
- context
- .read()
- .add(CreateSortEvent.didReceiveFilterText(text));
- },
- ),
+ height: fixHeight,
+ child: FlowyTextField(
+ hintText: LocaleKeys.grid_settings_sortBy.tr(),
+ onChanged: (text) {
+ context
+ .read()
+ .add(CreateSortEvent.didReceiveFilterText(text));
+ },
),
);
}
@@ -157,11 +155,15 @@ class _SortPropertyCell extends StatelessWidget {
@override
Widget build(BuildContext context) {
return FlowyButton(
- text: FlowyText.medium(fieldInfo.name),
+ hoverColor: AFThemeExtension.of(context).lightGreyHover,
+ text: FlowyText.medium(
+ fieldInfo.name,
+ color: AFThemeExtension.of(context).textColor,
+ ),
onTap: () => onTap(fieldInfo),
leftIcon: svgWidget(
fieldInfo.fieldType.iconName(),
- color: Theme.of(context).colorScheme.onSurface,
+ color: Theme.of(context).iconTheme.color,
),
);
}
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/sort/sort_choice_button.dart b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/sort/sort_choice_button.dart
index 29e705f9d0..40afc7019f 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/sort/sort_choice_button.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/sort/sort_choice_button.dart
@@ -37,7 +37,10 @@ class SortChoiceButton extends StatelessWidget {
return FlowyButton(
decoration: decoration,
useIntrinsicWidth: true,
- text: FlowyText(text),
+ text: FlowyText(
+ text,
+ color: AFThemeExtension.of(context).textColor,
+ ),
margin: const EdgeInsets.symmetric(horizontal: 8, vertical: 2),
radius: BorderRadius.all(radius),
leftIcon: leftIcon,
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/sort/sort_editor.dart b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/sort/sort_editor.dart
index 4bd72caa07..9895c08c43 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/sort/sort_editor.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/sort/sort_editor.dart
@@ -125,7 +125,7 @@ class _SortItem extends StatelessWidget {
hoverColor: AFThemeExtension.of(context).lightGreyHover,
icon: svgWidget(
"home/close",
- color: Theme.of(context).colorScheme.onSurface,
+ color: Theme.of(context).iconTheme.color,
),
);
@@ -182,13 +182,11 @@ class _AddSortButtonState extends State<_AddSortButton> {
child: SizedBox(
height: GridSize.popoverItemHeight,
child: FlowyButton(
+ hoverColor: AFThemeExtension.of(context).greyHover,
disable: getCreatableSorts(widget.fieldController.fieldInfos).isEmpty,
text: FlowyText.medium(LocaleKeys.grid_sort_addSort.tr()),
onTap: () => _popoverController.show(),
- leftIcon: svgWidget(
- "home/add",
- color: Theme.of(context).colorScheme.onSurface,
- ),
+ leftIcon: const FlowySvg(name: 'home/add'),
),
),
popupBuilder: (BuildContext context) {
@@ -220,10 +218,7 @@ class _DeleteSortButton extends StatelessWidget {
.read()
.add(const SortEditorEvent.deleteAllSorts());
},
- leftIcon: svgWidget(
- "editor/delete",
- color: Theme.of(context).colorScheme.onSurface,
- ),
+ leftIcon: const FlowySvg(name: 'editor/delete'),
),
);
},
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/sort/sort_menu.dart b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/sort/sort_menu.dart
index 19b9b1a569..c255e36525 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/sort/sort_menu.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/sort/sort_menu.dart
@@ -55,13 +55,16 @@ class SortChoiceChip extends StatelessWidget {
Widget build(BuildContext context) {
final arrow = Transform.rotate(
angle: -math.pi / 2,
- child: svgWidget("home/arrow_left"),
+ child: svgWidget(
+ "home/arrow_left",
+ color: Theme.of(context).iconTheme.color,
+ ),
);
final text = LocaleKeys.grid_settings_sort.tr();
final leftIcon = svgWidget(
"grid/setting/sort",
- color: Theme.of(context).colorScheme.onSurface,
+ color: Theme.of(context).iconTheme.color,
);
return SizedBox(
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/toolbar/filter_button.dart b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/toolbar/filter_button.dart
index 38dfc83818..8d32ff981f 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/toolbar/filter_button.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/toolbar/filter_button.dart
@@ -25,7 +25,7 @@ class _FilterButtonState extends State {
return BlocBuilder(
builder: (context, state) {
final textColor = state.filters.isEmpty
- ? null
+ ? AFThemeExtension.of(context).textColor
: Theme.of(context).colorScheme.primary;
return _wrapPopover(
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/toolbar/grid_group.dart b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/toolbar/grid_group.dart
index 127cb63247..c12ac5613a 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/toolbar/grid_group.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/toolbar/grid_group.dart
@@ -82,7 +82,7 @@ class _GridGroupCell extends StatelessWidget {
text: FlowyText.medium(fieldInfo.name),
leftIcon: svgWidget(
fieldInfo.fieldType.iconName(),
- color: Theme.of(context).colorScheme.onSurface,
+ color: Theme.of(context).iconTheme.color,
),
rightIcon: rightIcon,
onTap: () {
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/toolbar/grid_property.dart b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/toolbar/grid_property.dart
index 9b65628f4f..0dc81d26b6 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/toolbar/grid_property.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/toolbar/grid_property.dart
@@ -5,6 +5,7 @@ import 'package:appflowy/plugins/database_view/grid/presentation/widgets/header/
import 'package:appflowy/startup/startup.dart';
import 'package:appflowy_popover/appflowy_popover.dart';
import 'package:flowy_infra/image.dart';
+import 'package:flowy_infra/theme_extension.dart';
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
@@ -96,7 +97,7 @@ class _GridPropertyCellState extends State<_GridPropertyCell> {
Widget build(BuildContext context) {
final checkmark = svgWidget(
widget.fieldInfo.visibility ? 'home/show' : 'home/hide',
- color: Theme.of(context).colorScheme.onSurface,
+ color: Theme.of(context).iconTheme.color,
);
return SizedBox(
@@ -115,10 +116,14 @@ class _GridPropertyCellState extends State<_GridPropertyCell> {
triggerActions: PopoverTriggerFlags.none,
margin: EdgeInsets.zero,
child: FlowyButton(
- text: FlowyText.medium(widget.fieldInfo.name),
+ hoverColor: AFThemeExtension.of(context).lightGreyHover,
+ text: FlowyText.medium(
+ widget.fieldInfo.name,
+ color: AFThemeExtension.of(context).textColor,
+ ),
leftIcon: svgWidget(
widget.fieldInfo.fieldType.iconName(),
- color: Theme.of(context).colorScheme.onSurface,
+ color: Theme.of(context).iconTheme.color,
),
rightIcon: FlowyIconButton(
hoverColor: Colors.transparent,
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/toolbar/grid_setting.dart b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/toolbar/grid_setting.dart
index 25b742b6fc..875f752106 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/toolbar/grid_setting.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/toolbar/grid_setting.dart
@@ -2,6 +2,7 @@ import 'package:appflowy/plugins/database_view/application/field/field_controlle
import 'package:appflowy/plugins/database_view/application/setting/setting_bloc.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flowy_infra/image.dart';
+import 'package:flowy_infra/theme_extension.dart';
import 'package:flowy_infra_ui/style_widget/button.dart';
import 'package:flowy_infra_ui/style_widget/scrolling/styled_list.dart';
import 'package:flowy_infra_ui/style_widget/text.dart';
@@ -71,14 +72,17 @@ class _SettingItem extends StatelessWidget {
return SizedBox(
height: GridSize.popoverItemHeight,
child: FlowyButton(
+ hoverColor: AFThemeExtension.of(context).lightGreyHover,
text: FlowyText.medium(
action.title(),
- color: action.enable() ? null : Theme.of(context).disabledColor,
+ color: action.enable()
+ ? AFThemeExtension.of(context).textColor
+ : Theme.of(context).disabledColor,
),
onTap: () => onAction(action),
leftIcon: svgWidget(
action.iconName(),
- color: Theme.of(context).colorScheme.onSurface,
+ color: Theme.of(context).iconTheme.color,
),
),
);
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/toolbar/setting_button.dart b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/toolbar/setting_button.dart
index 93baeed518..b9b63eb5fb 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/toolbar/setting_button.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/toolbar/setting_button.dart
@@ -52,6 +52,7 @@ class _SettingButtonState extends State {
triggerActions: PopoverTriggerFlags.none,
child: FlowyTextButton(
LocaleKeys.settings_title.tr(),
+ fontColor: AFThemeExtension.of(context).textColor,
fillColor: Colors.transparent,
hoverColor: AFThemeExtension.of(context).lightGreyHover,
padding: GridSize.typeOptionContentInsets,
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/toolbar/sort_button.dart b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/toolbar/sort_button.dart
index 7a38b73d08..debb83493a 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/toolbar/sort_button.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/toolbar/sort_button.dart
@@ -24,7 +24,7 @@ class _SortButtonState extends State {
return BlocBuilder(
builder: (context, state) {
final textColor = state.sortInfos.isEmpty
- ? null
+ ? AFThemeExtension.of(context).textColor
: Theme.of(context).colorScheme.primary;
return wrapPopover(
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/widgets/card/card.dart b/frontend/appflowy_flutter/lib/plugins/database_view/widgets/card/card.dart
index 196b4b40ec..1227ef8e3c 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/widgets/card/card.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/widgets/card/card.dart
@@ -232,7 +232,7 @@ class _CardMoreOption extends StatelessWidget with CardAccessory {
padding: const EdgeInsets.all(3.0),
child: svgWidget(
'grid/details',
- color: Theme.of(context).colorScheme.onSurface,
+ color: Theme.of(context).iconTheme.color,
),
);
}
@@ -254,7 +254,7 @@ class _CardEditOption extends StatelessWidget with CardAccessory {
padding: const EdgeInsets.all(3.0),
child: svgWidget(
'editor/edit',
- color: Theme.of(context).colorScheme.onSurface,
+ color: Theme.of(context).iconTheme.color,
),
);
}
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/widgets/row/accessory/cell_accessory.dart b/frontend/appflowy_flutter/lib/plugins/database_view/widgets/row/accessory/cell_accessory.dart
index 39a8bd41f6..4433c9f43b 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/widgets/row/accessory/cell_accessory.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/widgets/row/accessory/cell_accessory.dart
@@ -3,11 +3,9 @@ import 'package:flowy_infra/image.dart';
import 'package:flowy_infra_ui/style_widget/hover.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
-import 'package:flowy_infra/size.dart';
import 'package:styled_widget/styled_widget.dart';
import 'package:appflowy/generated/locale_keys.g.dart';
import 'package:easy_localization/easy_localization.dart';
-import 'package:textstyle_extensions/textstyle_extensions.dart';
import '../cell_builder.dart';
@@ -69,7 +67,6 @@ class _PrimaryCellAccessoryState extends State
Widget build(BuildContext context) {
return Tooltip(
message: LocaleKeys.tooltip_openAsPage.tr(),
- textStyle: AFThemeExtension.of(context).caption.textColor(Colors.white),
child: svgWidget(
"grid/expander",
color: Theme.of(context).colorScheme.primary,
@@ -125,7 +122,6 @@ class _AccessoryHoverState extends State {
@override
Widget build(BuildContext context) {
List children = [
- const _Background(),
Padding(padding: widget.contentPadding, child: widget.child),
];
@@ -173,28 +169,6 @@ class AccessoryHoverState extends ChangeNotifier {
bool get onHover => _onHover;
}
-class _Background extends StatelessWidget {
- const _Background({Key? key}) : super(key: key);
-
- @override
- Widget build(BuildContext context) {
- return Consumer(
- builder: (context, state, child) {
- if (state.onHover) {
- return FlowyHoverContainer(
- style: HoverStyle(
- borderRadius: Corners.s6Border,
- hoverColor: AFThemeExtension.of(context).lightGreyHover,
- ),
- );
- } else {
- return const SizedBox();
- }
- },
- );
- }
-}
-
class CellAccessoryContainer extends StatelessWidget {
final List accessories;
const CellAccessoryContainer({required this.accessories, Key? key})
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/widgets/row/cells/checklist_cell/checklist_cell_editor.dart b/frontend/appflowy_flutter/lib/plugins/database_view/widgets/row/cells/checklist_cell/checklist_cell_editor.dart
index 3e5d744e1e..e8ee95c406 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/widgets/row/cells/checklist_cell/checklist_cell_editor.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/widgets/row/cells/checklist_cell/checklist_cell_editor.dart
@@ -1,6 +1,7 @@
import 'package:appflowy/plugins/database_view/application/cell/cell_controller_builder.dart';
import 'package:appflowy_popover/appflowy_popover.dart';
import 'package:flowy_infra/image.dart';
+import 'package:flowy_infra/theme_extension.dart';
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
@@ -116,7 +117,11 @@ class _ChecklistOptionCellState extends State<_ChecklistOptionCell> {
children: [
Expanded(
child: FlowyButton(
- text: FlowyText(widget.option.data.name),
+ hoverColor: AFThemeExtension.of(context).lightGreyHover,
+ text: FlowyText(
+ widget.option.data.name,
+ color: AFThemeExtension.of(context).textColor,
+ ),
leftIcon: icon,
onTap: () => context
.read()
@@ -132,12 +137,13 @@ class _ChecklistOptionCellState extends State<_ChecklistOptionCell> {
Widget _disclosureButton() {
return FlowyIconButton(
+ hoverColor: AFThemeExtension.of(context).lightGreyHover,
width: 20,
onPressed: () => _popoverController.show(),
iconPadding: const EdgeInsets.fromLTRB(2, 2, 2, 2),
icon: svgWidget(
"editor/details",
- color: Theme.of(context).colorScheme.onSurface,
+ color: Theme.of(context).iconTheme.color,
),
);
}
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/widgets/row/cells/checklist_cell/checklist_progress_bar.dart b/frontend/appflowy_flutter/lib/plugins/database_view/widgets/row/cells/checklist_cell/checklist_progress_bar.dart
index b8599f60c4..f997eb7768 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/widgets/row/cells/checklist_cell/checklist_progress_bar.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/widgets/row/cells/checklist_cell/checklist_progress_bar.dart
@@ -20,7 +20,7 @@ class ChecklistProgressBar extends StatelessWidget {
percent: percent,
padding: EdgeInsets.zero,
progressColor: Theme.of(context).colorScheme.primary,
- backgroundColor: AFThemeExtension.of(context).tint9,
+ backgroundColor: AFThemeExtension.of(context).progressBarBGcolor,
barRadius: const Radius.circular(5),
);
}
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/widgets/row/cells/date_cell/date_editor.dart b/frontend/appflowy_flutter/lib/plugins/database_view/widgets/row/cells/date_cell/date_editor.dart
index 0c0313c9fe..ae4de41db5 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/widgets/row/cells/date_cell/date_editor.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/widgets/row/cells/date_cell/date_editor.dart
@@ -23,9 +23,8 @@ import '../../../../grid/presentation/widgets/common/type_option_separator.dart'
import '../../../../grid/presentation/widgets/header/type_option/date.dart';
import 'date_cal_bloc.dart';
-final kToday = DateTime.now();
-final kFirstDay = DateTime(kToday.year, kToday.month - 3, kToday.day);
-final kLastDay = DateTime(kToday.year, kToday.month + 3, kToday.day);
+final kFirstDay = DateTime.utc(1970, 1, 1);
+final kLastDay = DateTime.utc(2100, 1, 1);
class DateCellEditor extends StatefulWidget {
final VoidCallback onDismissed;
@@ -174,13 +173,13 @@ class _CellCalendarWidgetState extends State<_CellCalendarWidget> {
leftChevronPadding: EdgeInsets.zero,
leftChevronIcon: svgWidget(
"home/arrow_left",
- color: Theme.of(context).colorScheme.onSurface,
+ color: Theme.of(context).iconTheme.color,
),
rightChevronPadding: EdgeInsets.zero,
rightChevronMargin: EdgeInsets.zero,
rightChevronIcon: svgWidget(
"home/arrow_right",
- color: Theme.of(context).colorScheme.onSurface,
+ color: Theme.of(context).iconTheme.color,
),
headerMargin: const EdgeInsets.only(bottom: 8.0),
),
@@ -255,7 +254,7 @@ class _IncludeTimeButton extends StatelessWidget {
children: [
svgWidget(
"grid/clock",
- color: Theme.of(context).colorScheme.onSurface,
+ color: Theme.of(context).iconTheme.color,
),
const HSpace(4),
FlowyText.medium(LocaleKeys.grid_field_includeTime.tr()),
@@ -386,10 +385,7 @@ class _DateTypeOptionButton extends StatelessWidget {
child: FlowyButton(
text: FlowyText.medium(title),
margin: GridSize.typeOptionContentInsets,
- rightIcon: svgWidget(
- "grid/more",
- color: Theme.of(context).colorScheme.onSurface,
- ),
+ rightIcon: const FlowySvg(name: 'grid/more'),
),
),
),
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/widgets/row/cells/select_option_cell/extension.dart b/frontend/appflowy_flutter/lib/plugins/database_view/widgets/row/cells/select_option_cell/extension.dart
index c83b8ade30..7b8041cb3d 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/widgets/row/cells/select_option_cell/extension.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/widgets/row/cells/select_option_cell/extension.dart
@@ -106,7 +106,11 @@ class SelectOptionTag extends StatelessWidget {
mainAxisSize: MainAxisSize.min,
children: [
Flexible(
- child: FlowyText.medium(name, overflow: TextOverflow.ellipsis),
+ child: FlowyText.medium(
+ name,
+ overflow: TextOverflow.ellipsis,
+ color: Theme.of(context).colorScheme.onSurface,
+ ),
),
if (onRemove != null)
FlowyIconButton(
@@ -139,6 +143,9 @@ class SelectOptionTagCell extends StatelessWidget {
@override
Widget build(BuildContext context) {
return FlowyHover(
+ style: HoverStyle(
+ hoverColor: AFThemeExtension.of(context).lightGreyHover,
+ ),
child: InkWell(
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/widgets/row/cells/select_option_cell/select_option_editor.dart b/frontend/appflowy_flutter/lib/plugins/database_view/widgets/row/cells/select_option_cell/select_option_editor.dart
index 024e88405c..1d8ca404d8 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/widgets/row/cells/select_option_cell/select_option_editor.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/widgets/row/cells/select_option_cell/select_option_editor.dart
@@ -210,7 +210,7 @@ class _CreateOptionCell extends StatelessWidget {
alignment: Alignment.centerLeft,
child: SelectOptionTag(
name: name,
- color: AFThemeExtension.of(context).lightGreyHover,
+ color: AFThemeExtension.of(context).greyHover,
onSelected: () => context
.read()
.add(SelectOptionEditorEvent.newOption(name)),
@@ -277,7 +277,7 @@ class _SelectOptionCellState extends State<_SelectOptionCell> {
iconPadding: const EdgeInsets.symmetric(horizontal: 6.0),
icon: svgWidget(
"editor/details",
- color: Theme.of(context).colorScheme.onSurface,
+ color: Theme.of(context).iconTheme.color,
),
),
],
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/widgets/row/cells/url_cell/url_cell.dart b/frontend/appflowy_flutter/lib/plugins/database_view/widgets/row/cells/url_cell/url_cell.dart
index 9ab086e356..470fd31b26 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/widgets/row/cells/url_cell/url_cell.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/widgets/row/cells/url_cell/url_cell.dart
@@ -5,6 +5,7 @@ import 'package:appflowy/workspace/presentation/home/toast.dart';
import 'package:appflowy_popover/appflowy_popover.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flowy_infra/image.dart';
+import 'package:flowy_infra/theme_extension.dart';
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
@@ -211,10 +212,8 @@ class _EditURLAccessoryState extends State<_EditURLAccessory>
controller: _popoverController,
direction: PopoverDirection.bottomWithLeftAligned,
offset: const Offset(0, 8),
- child: svgWidget(
- "editor/edit",
- color: Theme.of(context).colorScheme.onSurface,
- ),
+ child: svgWidget("editor/edit",
+ color: AFThemeExtension.of(context).textColor),
popupBuilder: (BuildContext popoverContext) {
return URLEditorPopover(
cellController:
@@ -246,7 +245,7 @@ class _CopyURLAccessoryState extends State<_CopyURLAccessory>
Widget build(BuildContext context) {
return svgWidget(
"editor/copy",
- color: Theme.of(context).colorScheme.onSurface,
+ color: Theme.of(context).iconTheme.color,
);
}
diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/widgets/row/row_detail.dart b/frontend/appflowy_flutter/lib/plugins/database_view/widgets/row/row_detail.dart
index b92f993382..8579a7e17a 100644
--- a/frontend/appflowy_flutter/lib/plugins/database_view/widgets/row/row_detail.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database_view/widgets/row/row_detail.dart
@@ -103,7 +103,7 @@ class _CloseButton extends StatelessWidget {
iconPadding: const EdgeInsets.fromLTRB(2, 2, 2, 2),
icon: svgWidget(
"home/close",
- color: Theme.of(context).colorScheme.onSurface,
+ color: Theme.of(context).iconTheme.color,
),
);
}
diff --git a/frontend/appflowy_flutter/lib/plugins/document/application/doc_bloc.dart b/frontend/appflowy_flutter/lib/plugins/document/application/doc_bloc.dart
index ae47a120ca..b1eae868d7 100644
--- a/frontend/appflowy_flutter/lib/plugins/document/application/doc_bloc.dart
+++ b/frontend/appflowy_flutter/lib/plugins/document/application/doc_bloc.dart
@@ -8,9 +8,8 @@ import 'package:appflowy_backend/protobuf/flowy-document/entities.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-user/user_profile.pbserver.dart';
import 'package:appflowy_editor/appflowy_editor.dart'
show EditorState, Document, Transaction, Node;
-import 'package:appflowy_backend/protobuf/flowy-folder/trash.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:appflowy_backend/log.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
@@ -49,8 +48,7 @@ class DocumentBloc extends Bloc {
emit(state.copyWith(isDeleted: false));
},
deletePermanently: (DeletePermanently value) async {
- final result = await _trashService
- .deleteViews([Tuple2(view.id, TrashType.TrashView)]);
+ final result = await _trashService.deleteViews([view.id]);
final newState = result.fold(
(l) => state.copyWith(forceClose: true), (r) => state);
diff --git a/frontend/appflowy_flutter/lib/plugins/document/application/doc_service.dart b/frontend/appflowy_flutter/lib/plugins/document/application/doc_service.dart
index 6597dfc3f1..88f4ead686 100644
--- a/frontend/appflowy_flutter/lib/plugins/document/application/doc_service.dart
+++ b/frontend/appflowy_flutter/lib/plugins/document/application/doc_service.dart
@@ -1,7 +1,7 @@
import 'package:dartz/dartz.dart';
import 'package:appflowy_backend/dispatch/dispatch.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-document/entities.pb.dart';
diff --git a/frontend/appflowy_flutter/lib/plugins/document/application/share_bloc.dart b/frontend/appflowy_flutter/lib/plugins/document/application/share_bloc.dart
index ddb4fe915d..abd53da58c 100644
--- a/frontend/appflowy_flutter/lib/plugins/document/application/share_bloc.dart
+++ b/frontend/appflowy_flutter/lib/plugins/document/application/share_bloc.dart
@@ -5,7 +5,7 @@ import 'package:appflowy/plugins/document/presentation/plugins/parsers/divider_n
import 'package:appflowy/plugins/document/presentation/plugins/parsers/math_equation_node_parser.dart';
import 'package:appflowy/plugins/document/presentation/plugins/parsers/code_block_node_parser.dart';
import 'package:appflowy_backend/protobuf/flowy-document/entities.pb.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
diff --git a/frontend/appflowy_flutter/lib/plugins/document/application/share_service.dart b/frontend/appflowy_flutter/lib/plugins/document/application/share_service.dart
index cf07dc0054..b2939244b5 100644
--- a/frontend/appflowy_flutter/lib/plugins/document/application/share_service.dart
+++ b/frontend/appflowy_flutter/lib/plugins/document/application/share_service.dart
@@ -3,7 +3,7 @@ import 'package:dartz/dartz.dart';
import 'package:appflowy_backend/dispatch/dispatch.dart';
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-document/protobuf.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
class ShareService {
Future> export(
diff --git a/frontend/appflowy_flutter/lib/plugins/document/document.dart b/frontend/appflowy_flutter/lib/plugins/document/document.dart
index 30a9aa688d..904dfd527f 100644
--- a/frontend/appflowy_flutter/lib/plugins/document/document.dart
+++ b/frontend/appflowy_flutter/lib/plugins/document/document.dart
@@ -10,7 +10,7 @@ import 'package:appflowy/startup/plugin/plugin.dart';
import 'package:appflowy/workspace/presentation/home/home_stack.dart';
import 'package:appflowy/workspace/presentation/widgets/left_bar_item.dart';
import 'package:easy_localization/easy_localization.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
@@ -34,7 +34,7 @@ class DocumentPluginBuilder extends PluginBuilder {
PluginType get pluginType => PluginType.editor;
@override
- ViewLayoutTypePB? get layoutType => ViewLayoutTypePB.Document;
+ ViewLayoutPB? get layoutType => ViewLayoutPB.Document;
}
class DocumentPlugin extends Plugin {
diff --git a/frontend/appflowy_flutter/lib/plugins/document/document_page.dart b/frontend/appflowy_flutter/lib/plugins/document/document_page.dart
index 8c87000722..b2c44f41f2 100644
--- a/frontend/appflowy_flutter/lib/plugins/document/document_page.dart
+++ b/frontend/appflowy_flutter/lib/plugins/document/document_page.dart
@@ -1,5 +1,5 @@
import 'package:appflowy/plugins/document/presentation/plugins/board/board_view_menu_item.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:appflowy_editor_plugins/appflowy_editor_plugins.dart';
import 'package:appflowy_editor/appflowy_editor.dart';
import 'package:appflowy/plugins/document/presentation/plugins/board/board_node_widget.dart';
diff --git a/frontend/appflowy_flutter/lib/plugins/document/presentation/banner.dart b/frontend/appflowy_flutter/lib/plugins/document/presentation/banner.dart
index 0e85ff85db..8cd8e4decc 100644
--- a/frontend/appflowy_flutter/lib/plugins/document/presentation/banner.dart
+++ b/frontend/appflowy_flutter/lib/plugins/document/presentation/banner.dart
@@ -34,7 +34,8 @@ class DocumentBanner extends StatelessWidget {
contentPadding: EdgeInsets.zero,
bgColor: Colors.transparent,
hoverColor: Theme.of(context).colorScheme.primary,
- downColor: Theme.of(context).colorScheme.primaryContainer,
+ highlightColor:
+ Theme.of(context).colorScheme.primaryContainer,
outlineColor: Colors.white,
borderRadius: Corners.s8Border,
onPressed: onRestore,
@@ -50,7 +51,7 @@ class DocumentBanner extends StatelessWidget {
contentPadding: EdgeInsets.zero,
bgColor: Colors.transparent,
hoverColor: Theme.of(context).colorScheme.primaryContainer,
- downColor: Theme.of(context).colorScheme.primary,
+ highlightColor: Theme.of(context).colorScheme.primary,
outlineColor: Colors.white,
borderRadius: Corners.s8Border,
onPressed: onDelete,
diff --git a/frontend/appflowy_flutter/lib/plugins/document/presentation/more/font_size_switcher.dart b/frontend/appflowy_flutter/lib/plugins/document/presentation/more/font_size_switcher.dart
index 37d6434e4d..13814ac186 100644
--- a/frontend/appflowy_flutter/lib/plugins/document/presentation/more/font_size_switcher.dart
+++ b/frontend/appflowy_flutter/lib/plugins/document/presentation/more/font_size_switcher.dart
@@ -32,6 +32,7 @@ class _FontSizeSwitcherState extends State {
FlowyText.semibold(
LocaleKeys.moreAction_fontSize.tr(),
fontSize: 12,
+ color: Theme.of(context).colorScheme.tertiary,
),
const SizedBox(
height: 5,
@@ -43,9 +44,8 @@ class _FontSizeSwitcherState extends State {
_updateSelectedFontSize(_fontSizes[index].item2);
},
borderRadius: const BorderRadius.all(Radius.circular(5)),
- selectedBorderColor: Theme.of(context).colorScheme.primaryContainer,
- selectedColor: Theme.of(context).colorScheme.onSurface,
- fillColor: Theme.of(context).colorScheme.primaryContainer,
+ selectedColor: Theme.of(context).colorScheme.tertiary,
+ fillColor: Theme.of(context).colorScheme.primary,
color: Theme.of(context).hintColor,
constraints: const BoxConstraints(
minHeight: 40.0,
diff --git a/frontend/appflowy_flutter/lib/plugins/document/presentation/more/more_button.dart b/frontend/appflowy_flutter/lib/plugins/document/presentation/more/more_button.dart
index 5ed6219319..23c5895d52 100644
--- a/frontend/appflowy_flutter/lib/plugins/document/presentation/more/more_button.dart
+++ b/frontend/appflowy_flutter/lib/plugins/document/presentation/more/more_button.dart
@@ -28,7 +28,7 @@ class DocumentMoreButton extends StatelessWidget {
child: svgWidget(
'editor/details',
size: const Size(18, 18),
- color: Theme.of(context).colorScheme.onSurface,
+ color: Theme.of(context).iconTheme.color,
),
);
}
diff --git a/frontend/appflowy_flutter/lib/plugins/document/presentation/plugins/base/built_in_page_widget.dart b/frontend/appflowy_flutter/lib/plugins/document/presentation/plugins/base/built_in_page_widget.dart
index 3aa729d051..a80be87b9d 100644
--- a/frontend/appflowy_flutter/lib/plugins/document/presentation/plugins/base/built_in_page_widget.dart
+++ b/frontend/appflowy_flutter/lib/plugins/document/presentation/plugins/base/built_in_page_widget.dart
@@ -3,7 +3,7 @@ import 'package:appflowy/startup/startup.dart';
import 'package:appflowy/workspace/application/app/app_service.dart';
import 'package:appflowy/workspace/presentation/widgets/pop_up_action.dart';
import 'package:appflowy_backend/protobuf/flowy-error/errors.pbserver.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:appflowy_editor/appflowy_editor.dart';
import 'package:dartz/dartz.dart' as dartz;
import 'package:flowy_infra_ui/style_widget/text.dart';
@@ -59,7 +59,7 @@ class _BuiltInPageWidgetState extends State {
child: CircularProgressIndicator(),
);
},
- future: AppBackendService().getView(appID, gridID),
+ future: AppBackendService().getChildView(appID, gridID),
);
}
@@ -119,7 +119,7 @@ class _BuiltInPageWidgetState extends State {
iconPadding: const EdgeInsets.all(3),
icon: svgWidget(
'common/information',
- color: Theme.of(context).colorScheme.onSurface,
+ color: Theme.of(context).iconTheme.color,
),
),
// Name
@@ -143,7 +143,7 @@ class _BuiltInPageWidgetState extends State {
iconPadding: const EdgeInsets.all(3),
icon: svgWidget(
'common/settings',
- color: Theme.of(context).colorScheme.onSurface,
+ color: Theme.of(context).iconTheme.color,
),
onPressed: () => controller.show(),
);
diff --git a/frontend/appflowy_flutter/lib/plugins/document/presentation/plugins/base/insert_page_command.dart b/frontend/appflowy_flutter/lib/plugins/document/presentation/plugins/base/insert_page_command.dart
index 8d4afd917e..5b8d899343 100644
--- a/frontend/appflowy_flutter/lib/plugins/document/presentation/plugins/base/insert_page_command.dart
+++ b/frontend/appflowy_flutter/lib/plugins/document/presentation/plugins/base/insert_page_command.dart
@@ -1,20 +1,53 @@
+import 'package:appflowy/generated/locale_keys.g.dart';
+import 'package:appflowy/plugins/database_view/application/database_view_service.dart';
import 'package:appflowy/plugins/document/presentation/plugins/board/board_node_widget.dart';
import 'package:appflowy/plugins/document/presentation/plugins/grid/grid_node_widget.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/app.pb.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
+import 'package:appflowy/workspace/application/app/app_service.dart';
import 'package:appflowy_editor/appflowy_editor.dart';
+import 'package:easy_localization/easy_localization.dart';
const String kAppID = 'app_id';
const String kViewID = 'view_id';
extension InsertPage on EditorState {
- void insertPage(AppPB appPB, ViewPB viewPB) {
+ Future insertPage(ViewPB appPB, ViewPB viewPB) async {
final selection = service.selectionService.currentSelection.value;
final textNodes =
service.selectionService.currentSelectedNodes.whereType();
if (selection == null || textNodes.isEmpty) {
return;
}
+
+ // get the database that the view is associated with
+ final database =
+ await DatabaseViewBackendService(viewId: viewPB.id).openGrid().then(
+ (value) => value.getLeftOrNull(),
+ );
+
+ if (database == null) {
+ throw StateError(
+ 'The database associated with ${viewPB.id} could not be found while attempting to create a referenced ${viewPB.layout.name}.');
+ }
+
+ final prefix = referencedBoardPrefix(viewPB.layout);
+
+ final ref = await AppBackendService().createView(
+ appId: appPB.id,
+ name: "$prefix ${viewPB.name}",
+ layoutType: viewPB.layout,
+ ext: {
+ 'database_id': database.id,
+ },
+ ).then(
+ (value) => value.getLeftOrNull(),
+ );
+
+ // TODO(a-wallen): Show error dialog here.
+ if (ref == null) {
+ return;
+ }
+
final transaction = this.transaction;
transaction.insertNode(
selection.end.path,
@@ -22,18 +55,29 @@ extension InsertPage on EditorState {
type: _convertPageType(viewPB),
attributes: {
kAppID: appPB.id,
- kViewID: viewPB.id,
+ kViewID: ref.id,
},
),
);
apply(transaction);
}
+ String referencedBoardPrefix(ViewLayoutPB layout) {
+ switch (layout) {
+ case ViewLayoutPB.Grid:
+ return LocaleKeys.grid_referencedGridPrefix.tr();
+ case ViewLayoutPB.Board:
+ return LocaleKeys.board_referencedBoardPrefix.tr();
+ default:
+ throw UnimplementedError();
+ }
+ }
+
String _convertPageType(ViewPB viewPB) {
switch (viewPB.layout) {
- case ViewLayoutTypePB.Grid:
+ case ViewLayoutPB.Grid:
return kGridType;
- case ViewLayoutTypePB.Board:
+ case ViewLayoutPB.Board:
return kBoardType;
default:
throw Exception('Unknown layout type');
diff --git a/frontend/appflowy_flutter/lib/plugins/document/presentation/plugins/base/link_to_page_widget.dart b/frontend/appflowy_flutter/lib/plugins/document/presentation/plugins/base/link_to_page_widget.dart
index 73cfbeecb4..3f8cb5b1ef 100644
--- a/frontend/appflowy_flutter/lib/plugins/document/presentation/plugins/base/link_to_page_widget.dart
+++ b/frontend/appflowy_flutter/lib/plugins/document/presentation/plugins/base/link_to_page_widget.dart
@@ -1,12 +1,12 @@
import 'package:appflowy/workspace/application/app/app_service.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/app.pb.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:appflowy_editor/appflowy_editor.dart';
import 'package:dartz/dartz.dart' as dartz;
import 'package:flowy_infra/image.dart';
import 'package:flowy_infra_ui/style_widget/button.dart';
import 'package:flowy_infra_ui/style_widget/text.dart';
import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
import 'insert_page_command.dart';
import 'package:appflowy/generated/locale_keys.g.dart';
import 'package:easy_localization/easy_localization.dart';
@@ -18,7 +18,7 @@ void showLinkToPageMenu(
EditorState editorState,
SelectionMenuService menuService,
BuildContext context,
- ViewLayoutTypePB pageType,
+ ViewLayoutPB pageType,
) {
final alignment = menuService.alignment;
final offset = menuService.offset;
@@ -28,10 +28,10 @@ void showLinkToPageMenu(
String hintText = '';
switch (pageType) {
- case ViewLayoutTypePB.Grid:
+ case ViewLayoutPB.Grid:
hintText = LocaleKeys.document_slashMenu_grid_selectAGridToLinkTo.tr();
break;
- case ViewLayoutTypePB.Board:
+ case ViewLayoutPB.Board:
hintText = LocaleKeys.document_slashMenu_board_selectABoardToLinkTo.tr();
break;
default:
@@ -50,15 +50,15 @@ void showLinkToPageMenu(
editorState: editorState,
layoutType: pageType,
hintText: hintText,
- onSelected: (appPB, viewPB) {
- editorState.insertPage(appPB, viewPB);
+ onSelected: (viewPB, childViewPB) {
+ editorState.insertPage(viewPB, childViewPB);
},
),
),
);
});
- Overlay.of(context)?.insert(_linkToPageMenu!);
+ Overlay.of(context).insert(_linkToPageMenu!);
editorState.service.selectionService.currentSelection
.addListener(dismissLinkToPageMenu);
@@ -83,23 +83,59 @@ class LinkToPageMenu extends StatefulWidget {
});
final EditorState editorState;
- final ViewLayoutTypePB layoutType;
+ final ViewLayoutPB layoutType;
final String hintText;
- final void Function(AppPB appPB, ViewPB viewPB) onSelected;
+ final void Function(ViewPB view, ViewPB childView) onSelected;
@override
State createState() => _LinkToPageMenuState();
}
class _LinkToPageMenuState extends State {
+ final _focusNode = FocusNode(debugLabel: 'reference_list_widget');
EditorStyle get style => widget.editorState.editorStyle;
+ int _selectedIndex = 0;
+ int _totalItems = 0;
+ Future>>>? _availableLayout;
+ final Map> _items = {};
+
+ Future>>> fetchItems() async {
+ final items = await AppBackendService().fetchViews(widget.layoutType);
+
+ int index = 0;
+ for (final app in items) {
+ for (final view in app.value2) {
+ _items.putIfAbsent(index, () => dartz.Tuple2(app.value1, view));
+ index += 1;
+ }
+ }
+
+ _totalItems = _items.length;
+ return items;
+ }
+
+ @override
+ void initState() {
+ _availableLayout = fetchItems();
+ WidgetsBinding.instance.addPostFrameCallback((_) {
+ _focusNode.requestFocus();
+ });
+ super.initState();
+ }
+
+ @override
+ void dispose() {
+ _focusNode.dispose();
+ super.dispose();
+ }
@override
Widget build(BuildContext context) {
- return Container(
- color: Colors.transparent,
- width: 300,
+ return Focus(
+ focusNode: _focusNode,
+ onKey: _onKey,
child: Container(
+ width: 300,
padding: const EdgeInsets.fromLTRB(10, 6, 10, 6),
decoration: BoxDecoration(
color: style.selectionMenuBackgroundColor,
@@ -112,17 +148,62 @@ class _LinkToPageMenuState extends State {
],
borderRadius: BorderRadius.circular(6.0),
),
- child: _buildListWidget(context),
+ child: _buildListWidget(context, _selectedIndex, _availableLayout),
),
);
}
- Widget _buildListWidget(BuildContext context) {
- return FutureBuilder>>>(
+ KeyEventResult _onKey(FocusNode node, RawKeyEvent event) {
+ if (event is! RawKeyDownEvent ||
+ _availableLayout == null ||
+ _items.isEmpty) {
+ return KeyEventResult.ignored;
+ }
+
+ final acceptedKeys = [
+ LogicalKeyboardKey.arrowUp,
+ LogicalKeyboardKey.arrowDown,
+ LogicalKeyboardKey.tab,
+ LogicalKeyboardKey.enter
+ ];
+
+ if (!acceptedKeys.contains(event.logicalKey)) {
+ return KeyEventResult.handled;
+ }
+
+ var newSelectedIndex = _selectedIndex;
+ if (event.logicalKey == LogicalKeyboardKey.arrowDown &&
+ newSelectedIndex != _totalItems - 1) {
+ newSelectedIndex += 1;
+ } else if (event.logicalKey == LogicalKeyboardKey.arrowUp &&
+ newSelectedIndex != 0) {
+ newSelectedIndex -= 1;
+ } else if (event.logicalKey == LogicalKeyboardKey.tab) {
+ newSelectedIndex += 1;
+ newSelectedIndex %= _totalItems;
+ } else if (event.logicalKey == LogicalKeyboardKey.enter) {
+ widget.onSelected(
+ _items[_selectedIndex]!.value1, _items[_selectedIndex]!.value2);
+ }
+
+ setState(() {
+ _selectedIndex = newSelectedIndex;
+ });
+
+ return KeyEventResult.handled;
+ }
+
+ Widget _buildListWidget(
+ BuildContext context,
+ int selectedIndex,
+ Future>>>? items,
+ ) {
+ int index = 0;
+ return FutureBuilder>>>(
builder: (context, snapshot) {
if (snapshot.hasData &&
snapshot.connectionState == ConnectionState.done) {
- final apps = snapshot.data;
+ final views = snapshot.data;
final children = [
Padding(
padding: const EdgeInsets.symmetric(vertical: 4),
@@ -133,28 +214,31 @@ class _LinkToPageMenuState extends State {
),
),
];
- if (apps != null && apps.isNotEmpty) {
- for (final app in apps) {
- if (app.value2.isNotEmpty) {
+ if (views != null && views.isNotEmpty) {
+ for (final view in views) {
+ if (view.value2.isNotEmpty) {
children.add(
Padding(
padding: const EdgeInsets.symmetric(vertical: 4),
child: FlowyText.regular(
- app.value1.name,
+ view.value1.name,
),
),
);
- for (final value in app.value2) {
+ for (final value in view.value2) {
children.add(
FlowyButton(
+ isSelected: index == _selectedIndex,
leftIcon: svgWidget(
_iconName(value),
- color: Theme.of(context).colorScheme.onSurface,
+ color: Theme.of(context).iconTheme.color,
),
text: FlowyText.regular(value.name),
- onTap: () => widget.onSelected(app.value1, value),
+ onTap: () => widget.onSelected(view.value1, value),
),
);
+
+ index += 1;
}
}
}
@@ -169,15 +253,15 @@ class _LinkToPageMenuState extends State {
);
}
},
- future: AppBackendService().fetchViews(widget.layoutType),
+ future: items,
);
}
String _iconName(ViewPB viewPB) {
switch (viewPB.layout) {
- case ViewLayoutTypePB.Grid:
+ case ViewLayoutPB.Grid:
return 'editor/grid';
- case ViewLayoutTypePB.Board:
+ case ViewLayoutPB.Board:
return 'editor/board';
default:
throw Exception('Unknown layout type');
diff --git a/frontend/appflowy_flutter/lib/plugins/document/presentation/plugins/board/board_menu_item.dart b/frontend/appflowy_flutter/lib/plugins/document/presentation/plugins/board/board_menu_item.dart
index c81efbb279..8390f9201f 100644
--- a/frontend/appflowy_flutter/lib/plugins/document/presentation/plugins/board/board_menu_item.dart
+++ b/frontend/appflowy_flutter/lib/plugins/document/presentation/plugins/board/board_menu_item.dart
@@ -1,6 +1,6 @@
import 'package:appflowy/generated/locale_keys.g.dart';
import 'package:appflowy/plugins/document/presentation/plugins/base/link_to_page_widget.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:appflowy_editor/appflowy_editor.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flowy_infra/image.dart';
@@ -18,13 +18,13 @@ SelectionMenuItem boardMenuItem = SelectionMenuItem(
);
},
// TODO(a-wallen): Translate keywords
- keywords: ['referenced board', 'referenced kanban'],
+ keywords: ['referenced', 'board', 'kanban'],
handler: (editorState, menuService, context) {
showLinkToPageMenu(
editorState,
menuService,
context,
- ViewLayoutTypePB.Board,
+ ViewLayoutPB.Board,
);
},
);
diff --git a/frontend/appflowy_flutter/lib/plugins/document/presentation/plugins/board/board_view_menu_item.dart b/frontend/appflowy_flutter/lib/plugins/document/presentation/plugins/board/board_view_menu_item.dart
index b25fe52679..56c55ba1bd 100644
--- a/frontend/appflowy_flutter/lib/plugins/document/presentation/plugins/board/board_view_menu_item.dart
+++ b/frontend/appflowy_flutter/lib/plugins/document/presentation/plugins/board/board_view_menu_item.dart
@@ -1,4 +1,4 @@
-import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:appflowy_editor/appflowy_editor.dart';
import 'package:appflowy/generated/locale_keys.g.dart';
import 'package:appflowy/plugins/document/application/prelude.dart';
@@ -23,17 +23,17 @@ SelectionMenuItem boardViewMenuItem(DocumentBloc documentBloc) =>
// TODO(a-wallen): Translate keywords.
keywords: ['board', 'kanban'],
handler: (editorState, menuService, context) async {
- if (!documentBloc.view.hasAppId()) {
+ if (!documentBloc.view.hasParentViewId()) {
return;
}
- final appId = documentBloc.view.appId;
+ final appId = documentBloc.view.parentViewId;
final service = AppBackendService();
final result = (await service.createView(
appId: appId,
name: LocaleKeys.menuAppHeader_defaultNewPageName.tr(),
- layoutType: ViewLayoutTypePB.Board,
+ layoutType: ViewLayoutPB.Board,
))
.getLeftOrNull();
@@ -42,15 +42,14 @@ SelectionMenuItem boardViewMenuItem(DocumentBloc documentBloc) =>
return;
}
- final app =
- (await service.readApp(appId: result.appId)).getLeftOrNull();
+ final app = (await service.getView(result.viewId)).getLeftOrNull();
// We should show an error dialog.
if (app == null) {
return;
}
- final view =
- (await service.getView(result.appId, result.id)).getLeftOrNull();
+ final view = (await service.getChildView(result.viewId, result.id))
+ .getLeftOrNull();
// As this.
if (view == null) {
return;
diff --git a/frontend/appflowy_flutter/lib/plugins/document/presentation/plugins/cover/change_cover_popover.dart b/frontend/appflowy_flutter/lib/plugins/document/presentation/plugins/cover/change_cover_popover.dart
index 9aa338b0bc..95a33a04da 100644
--- a/frontend/appflowy_flutter/lib/plugins/document/presentation/plugins/cover/change_cover_popover.dart
+++ b/frontend/appflowy_flutter/lib/plugins/document/presentation/plugins/cover/change_cover_popover.dart
@@ -2,17 +2,20 @@ import 'dart:io';
import 'dart:ui';
import 'package:appflowy/generated/locale_keys.g.dart';
+import 'package:appflowy/plugins/document/presentation/plugins/cover/change_cover_popover_bloc.dart';
import 'package:appflowy/plugins/document/presentation/plugins/cover/cover_image_picker.dart';
import 'package:appflowy/plugins/document/presentation/plugins/cover/cover_node_widget.dart';
import 'package:appflowy_editor/appflowy_editor.dart';
import 'package:appflowy_editor_plugins/appflowy_editor_plugins.dart';
import 'package:easy_localization/easy_localization.dart';
+import 'package:flowy_infra/image.dart';
import 'package:flowy_infra/size.dart';
import 'package:flowy_infra/theme_extension.dart';
+import 'package:flowy_infra_ui/style_widget/button.dart';
import 'package:flowy_infra_ui/style_widget/icon_button.dart';
import 'package:flowy_infra_ui/style_widget/text.dart';
import 'package:flutter/material.dart';
-import 'package:shared_preferences/shared_preferences.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
const String kLocalImagesKey = 'local_images';
@@ -71,31 +74,35 @@ class CoverColorPicker extends StatefulWidget {
}
class _ChangeCoverPopoverState extends State {
- late Future>? fileImages;
bool isAddingImage = false;
- @override
- void initState() {
- super.initState();
- fileImages = _getPreviouslyPickedImagePaths();
- }
-
@override
Widget build(BuildContext context) {
- return Padding(
- padding: const EdgeInsets.all(15),
- child: SingleChildScrollView(
- child: isAddingImage
- ? CoverImagePicker(
- onBackPressed: () => setState(() {
- isAddingImage = false;
- }),
- onFileSubmit: (List path) {
- setState(() {
- isAddingImage = false;
- });
- })
- : _buildCoverSelection(),
+ return BlocProvider(
+ create: (context) => ChangeCoverPopoverBloc()
+ ..add(const ChangeCoverPopoverEvent.fetchPickedImagePaths()),
+ child: BlocBuilder(
+ builder: (context, state) {
+ return Padding(
+ padding: const EdgeInsets.all(15),
+ child: SingleChildScrollView(
+ child: isAddingImage
+ ? CoverImagePicker(
+ onBackPressed: () => setState(() {
+ isAddingImage = false;
+ }),
+ onFileSubmit: (List path) {
+ context.read().add(
+ const ChangeCoverPopoverEvent
+ .fetchPickedImagePaths());
+ setState(() {
+ isAddingImage = false;
+ });
+ })
+ : _buildCoverSelection(),
+ ),
+ );
+ },
),
);
}
@@ -104,21 +111,55 @@ class _ChangeCoverPopoverState extends State {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
- FlowyText.semibold(LocaleKeys.document_plugins_cover_colors.tr()),
+ FlowyText.semibold(
+ LocaleKeys.document_plugins_cover_colors.tr(),
+ color: Theme.of(context).colorScheme.tertiary,
+ ),
const SizedBox(height: 10),
_buildColorPickerList(),
const SizedBox(height: 10),
- FlowyText.semibold(LocaleKeys.document_plugins_cover_images.tr()),
+ _buildImageHeader(),
const SizedBox(height: 10),
_buildFileImagePicker(),
const SizedBox(height: 10),
- FlowyText.semibold(LocaleKeys.document_plugins_cover_abstract.tr()),
+ FlowyText.semibold(
+ LocaleKeys.document_plugins_cover_abstract.tr(),
+ color: Theme.of(context).colorScheme.tertiary,
+ ),
const SizedBox(height: 10),
_buildAbstractImagePicker(),
],
);
}
+ Widget _buildImageHeader() {
+ return BlocBuilder(
+ builder: (context, state) {
+ return Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ FlowyText.semibold(
+ LocaleKeys.document_plugins_cover_images.tr(),
+ color: Theme.of(context).colorScheme.tertiary,
+ ),
+ FlowyTextButton(
+ fillColor: Theme.of(context).cardColor,
+ hoverColor: Theme.of(context).colorScheme.secondaryContainer,
+ LocaleKeys.document_plugins_cover_clearAll.tr(),
+ fontColor: Theme.of(context).colorScheme.tertiary,
+ onPressed: () {
+ context
+ .read()
+ .add(const ChangeCoverPopoverEvent.clearAllImages());
+ },
+ mainAxisAlignment: MainAxisAlignment.end,
+ ),
+ ],
+ );
+ },
+ );
+ }
+
Widget _buildAbstractImagePicker() {
return GridView.builder(
shrinkWrap: true,
@@ -173,71 +214,59 @@ class _ChangeCoverPopoverState extends State {
}
Widget _buildFileImagePicker() {
- return FutureBuilder>(
- future: _getPreviouslyPickedImagePaths(),
- builder: (context, snapshot) {
- if (snapshot.hasData) {
- List images = snapshot.data!;
- return GridView.builder(
- shrinkWrap: true,
- gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
- crossAxisCount: 3,
- childAspectRatio: 1 / 0.65,
- crossAxisSpacing: 7,
- mainAxisSpacing: 7,
- ),
- itemCount: images.length + 1,
- itemBuilder: (BuildContext ctx, index) {
- if (index == 0) {
- return Container(
- decoration: BoxDecoration(
- color: Theme.of(context)
- .colorScheme
- .primary
- .withOpacity(0.15),
- border: Border.all(
- color: Theme.of(context).colorScheme.primary,
- ),
- borderRadius: Corners.s8Border,
- ),
- child: FlowyIconButton(
- iconPadding: EdgeInsets.zero,
- icon: Icon(
- Icons.add,
- color: Theme.of(context).colorScheme.primary,
- ),
- width: 20,
- onPressed: () {
- setState(() {
- isAddingImage = true;
- });
- },
- ),
- );
- }
- return InkWell(
- onTap: () {
- widget.onCoverChanged(
- CoverSelectionType.file,
- images[index - 1],
- );
- },
- child: Container(
- decoration: BoxDecoration(
- image: DecorationImage(
- image: FileImage(File(images[index - 1])),
- fit: BoxFit.cover,
- ),
- borderRadius: Corners.s8Border,
- ),
+ return BlocBuilder(
+ builder: (context, state) {
+ if (state is Loaded) {
+ List images = state.imageNames;
+ return GridView.builder(
+ shrinkWrap: true,
+ gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
+ crossAxisCount: 3,
+ childAspectRatio: 1 / 0.65,
+ crossAxisSpacing: 7,
+ mainAxisSpacing: 7,
+ ),
+ itemCount: images.length + 1,
+ itemBuilder: (BuildContext ctx, index) {
+ if (index == 0) {
+ return Container(
+ decoration: BoxDecoration(
+ color:
+ Theme.of(context).colorScheme.primary.withOpacity(0.15),
+ border: Border.all(
+ color: Theme.of(context).colorScheme.primary,
),
+ borderRadius: Corners.s8Border,
+ ),
+ child: FlowyIconButton(
+ iconPadding: EdgeInsets.zero,
+ icon: Icon(
+ Icons.add,
+ color: Theme.of(context).colorScheme.primary,
+ ),
+ width: 20,
+ onPressed: () {
+ setState(() {
+ isAddingImage = true;
+ });
+ },
+ ),
+ );
+ }
+ return ImageGridItem(
+ onImageSelect: () {
+ widget.onCoverChanged(
+ CoverSelectionType.file,
+ images[index - 1],
);
},
+ imagePath: images[index - 1],
);
- } else {
- return Container();
- }
- });
+ },
+ );
+ }
+ return Container();
+ });
}
List _generateBackgroundColorOptions(EditorState editorState) {
@@ -248,19 +277,75 @@ class _ChangeCoverPopoverState extends State {
))
.toList();
}
+}
- Future> _getPreviouslyPickedImagePaths() async {
- SharedPreferences prefs = await SharedPreferences.getInstance();
- final imageNames = prefs.getStringList(kLocalImagesKey) ?? [];
- final removeNames = [];
- for (final name in imageNames) {
- if (!File(name).existsSync()) {
- removeNames.add(name);
- }
- }
- imageNames.removeWhere((element) => removeNames.contains(element));
- prefs.setStringList(kLocalImagesKey, imageNames);
- return imageNames;
+class ImageGridItem extends StatefulWidget {
+ const ImageGridItem({
+ Key? key,
+ required this.onImageSelect,
+ required this.imagePath,
+ }) : super(key: key);
+
+ final Function() onImageSelect;
+ final String imagePath;
+
+ @override
+ State createState() => _ImageGridItemState();
+}
+
+class _ImageGridItemState extends State {
+ bool showDeleteButton = false;
+ @override
+ Widget build(BuildContext context) {
+ return MouseRegion(
+ onEnter: (_) {
+ setState(() {
+ showDeleteButton = true;
+ });
+ },
+ onExit: (_) {
+ setState(() {
+ showDeleteButton = false;
+ });
+ },
+ child: Stack(
+ children: [
+ InkWell(
+ onTap: widget.onImageSelect,
+ child: Container(
+ decoration: BoxDecoration(
+ image: DecorationImage(
+ image: FileImage(File(widget.imagePath)),
+ fit: BoxFit.cover,
+ ),
+ borderRadius: Corners.s8Border,
+ ),
+ ),
+ ),
+ if (showDeleteButton)
+ Positioned(
+ right: 2,
+ top: 2,
+ child: FlowyIconButton(
+ fillColor:
+ Theme.of(context).colorScheme.surface.withOpacity(0.8),
+ hoverColor:
+ Theme.of(context).colorScheme.surface.withOpacity(0.8),
+ iconPadding: const EdgeInsets.all(5),
+ width: 28,
+ icon: svgWidget(
+ 'editor/delete',
+ color: Theme.of(context).colorScheme.tertiary,
+ ),
+ onPressed: () {
+ context.read().add(
+ ChangeCoverPopoverEvent.deleteImage(widget.imagePath));
+ },
+ ),
+ ),
+ ],
+ ),
+ );
}
}
diff --git a/frontend/appflowy_flutter/lib/plugins/document/presentation/plugins/cover/change_cover_popover_bloc.dart b/frontend/appflowy_flutter/lib/plugins/document/presentation/plugins/cover/change_cover_popover_bloc.dart
new file mode 100644
index 0000000000..aee98a8e0b
--- /dev/null
+++ b/frontend/appflowy_flutter/lib/plugins/document/presentation/plugins/cover/change_cover_popover_bloc.dart
@@ -0,0 +1,90 @@
+import 'dart:async';
+import 'dart:io';
+
+import 'package:appflowy/plugins/document/presentation/plugins/cover/change_cover_popover.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+import 'package:freezed_annotation/freezed_annotation.dart';
+import 'package:shared_preferences/shared_preferences.dart';
+
+part 'change_cover_popover_bloc.freezed.dart';
+
+class ChangeCoverPopoverBloc
+ extends Bloc {
+ late final SharedPreferences _prefs;
+ final _initCompleter = Completer();
+ ChangeCoverPopoverBloc() : super(const ChangeCoverPopoverState.initial()) {
+ SharedPreferences.getInstance().then((prefs) {
+ _prefs = prefs;
+ _initCompleter.complete();
+ });
+ on((event, emit) async {
+ await event.map(
+ fetchPickedImagePaths:
+ (FetchPickedImagePaths fetchPickedImagePaths) async {
+ final imageNames = await _getPreviouslyPickedImagePaths();
+ emit(ChangeCoverPopoverState.loaded(imageNames));
+ },
+ deleteImage: (DeleteImage deleteImage) async {
+ final currentState = state;
+ if (currentState is Loaded) {
+ await _deleteImageInStorage(deleteImage.path);
+ final updateImageList = currentState.imageNames
+ .where((path) => path != deleteImage.path)
+ .toList();
+ await _updateImagePathsInStorage(updateImageList);
+ emit(Loaded(updateImageList));
+ }
+ },
+ clearAllImages: (ClearAllImages clearAllImages) async {
+ final currentState = state;
+ if (currentState is Loaded) {
+ for (final image in currentState.imageNames) {
+ await _deleteImageInStorage(image);
+ }
+ await _updateImagePathsInStorage([]);
+ emit(const Loaded([]));
+ }
+ },
+ );
+ });
+ }
+
+ Future> _getPreviouslyPickedImagePaths() async {
+ await _initCompleter.future;
+ final imageNames = _prefs.getStringList(kLocalImagesKey) ?? [];
+ if (imageNames.isEmpty) {
+ return imageNames;
+ }
+ imageNames.removeWhere((name) => !File(name).existsSync());
+ return imageNames;
+ }
+
+ Future _updateImagePathsInStorage(List imagePaths) async {
+ await _initCompleter.future;
+ _prefs.setStringList(kLocalImagesKey, imagePaths);
+ return;
+ }
+
+ Future _deleteImageInStorage(String path) async {
+ final imageFile = File(path);
+ await imageFile.delete();
+ }
+}
+
+@freezed
+class ChangeCoverPopoverEvent with _$ChangeCoverPopoverEvent {
+ const factory ChangeCoverPopoverEvent.fetchPickedImagePaths() =
+ FetchPickedImagePaths;
+
+ const factory ChangeCoverPopoverEvent.deleteImage(String path) = DeleteImage;
+ const factory ChangeCoverPopoverEvent.clearAllImages() = ClearAllImages;
+}
+
+@freezed
+class ChangeCoverPopoverState with _$ChangeCoverPopoverState {
+ const factory ChangeCoverPopoverState.initial() = Initial;
+ const factory ChangeCoverPopoverState.loading() = Loading;
+ const factory ChangeCoverPopoverState.loaded(
+ List imageNames,
+ ) = Loaded;
+}
diff --git a/frontend/appflowy_flutter/lib/plugins/document/presentation/plugins/cover/cover_node_widget.dart b/frontend/appflowy_flutter/lib/plugins/document/presentation/plugins/cover/cover_node_widget.dart
index 808962e019..8a7ac2807a 100644
--- a/frontend/appflowy_flutter/lib/plugins/document/presentation/plugins/cover/cover_node_widget.dart
+++ b/frontend/appflowy_flutter/lib/plugins/document/presentation/plugins/cover/cover_node_widget.dart
@@ -156,10 +156,7 @@ class _AddCoverButtonState extends State<_AddCoverButton> {
leftIconSize: const Size.square(18),
onTap: widget.onTap,
useIntrinsicWidth: true,
- leftIcon: svgWidget(
- 'editor/image',
- color: Theme.of(context).colorScheme.onSurface,
- ),
+ leftIcon: const FlowySvg(name: 'editor/image'),
text: FlowyText.regular(
LocaleKeys.document_plugins_cover_addCover.tr(),
),
@@ -174,7 +171,7 @@ class _AddCoverButtonState extends State<_AddCoverButton> {
useIntrinsicWidth: true,
leftIcon: Icon(
Icons.emoji_emotions_outlined,
- color: Theme.of(context).colorScheme.onSurface,
+ color: Theme.of(context).iconTheme.color,
size: 18,
),
text: FlowyText.regular(LocaleKeys
@@ -197,8 +194,7 @@ class _AddCoverButtonState extends State<_AddCoverButton> {
child: FlowyButton(
leftIconSize: const Size.square(18),
useIntrinsicWidth: true,
- leftIcon: Icon(Icons.emoji_emotions_outlined,
- color: Theme.of(context).colorScheme.onSurface,
+ leftIcon: const Icon(Icons.emoji_emotions_outlined,
size: 18),
text: FlowyText.regular(
LocaleKeys.document_plugins_cover_addIcon.tr()),
@@ -400,7 +396,7 @@ class _CoverImageState extends State<_CoverImage> {
popoverController.show();
},
hoverColor: Theme.of(context).colorScheme.surface,
- textColor: Theme.of(context).colorScheme.onSurface,
+ textColor: Theme.of(context).colorScheme.tertiary,
fillColor: Theme.of(context).colorScheme.surface.withOpacity(0.8),
width: 120,
height: 28,
@@ -422,7 +418,7 @@ class _CoverImageState extends State<_CoverImage> {
width: 28,
icon: svgWidget(
'editor/delete',
- color: Theme.of(context).colorScheme.onSurface,
+ color: Theme.of(context).colorScheme.tertiary,
),
onPressed: () {
widget.onCoverChanged(CoverSelectionType.initial, null);
diff --git a/frontend/appflowy_flutter/lib/plugins/document/presentation/plugins/grid/grid_menu_item.dart b/frontend/appflowy_flutter/lib/plugins/document/presentation/plugins/grid/grid_menu_item.dart
index b2775543e9..09806b4eb0 100644
--- a/frontend/appflowy_flutter/lib/plugins/document/presentation/plugins/grid/grid_menu_item.dart
+++ b/frontend/appflowy_flutter/lib/plugins/document/presentation/plugins/grid/grid_menu_item.dart
@@ -1,6 +1,6 @@
import 'package:appflowy/generated/locale_keys.g.dart';
import 'package:appflowy/plugins/document/presentation/plugins/base/link_to_page_widget.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:appflowy_editor/appflowy_editor.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flowy_infra/image.dart';
@@ -17,13 +17,13 @@ SelectionMenuItem gridMenuItem = SelectionMenuItem(
: editorState.editorStyle.selectionMenuItemIconColor,
);
},
- keywords: ['referenced grid'],
+ keywords: ['referenced', 'grid'],
handler: (editorState, menuService, context) {
showLinkToPageMenu(
editorState,
menuService,
context,
- ViewLayoutTypePB.Grid,
+ ViewLayoutPB.Grid,
);
},
);
diff --git a/frontend/appflowy_flutter/lib/plugins/document/presentation/plugins/grid/grid_view_menu_item.dart b/frontend/appflowy_flutter/lib/plugins/document/presentation/plugins/grid/grid_view_menu_item.dart
index 2dc030d547..96cc8861cb 100644
--- a/frontend/appflowy_flutter/lib/plugins/document/presentation/plugins/grid/grid_view_menu_item.dart
+++ b/frontend/appflowy_flutter/lib/plugins/document/presentation/plugins/grid/grid_view_menu_item.dart
@@ -2,7 +2,7 @@ import 'package:appflowy/generated/locale_keys.g.dart';
import 'package:appflowy/plugins/document/application/doc_bloc.dart';
import 'package:appflowy/plugins/document/presentation/plugins/base/insert_page_command.dart';
import 'package:appflowy/workspace/application/app/app_service.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:appflowy_editor/appflowy_editor.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flowy_infra/image.dart';
@@ -22,17 +22,17 @@ SelectionMenuItem gridViewMenuItem(DocumentBloc documentBloc) =>
},
keywords: ['grid'],
handler: (editorState, menuService, context) async {
- if (!documentBloc.view.hasAppId()) {
+ if (!documentBloc.view.hasParentViewId()) {
return;
}
- final appId = documentBloc.view.appId;
+ final appId = documentBloc.view.parentViewId;
final service = AppBackendService();
final result = (await service.createView(
appId: appId,
name: LocaleKeys.menuAppHeader_defaultNewPageName.tr(),
- layoutType: ViewLayoutTypePB.Grid,
+ layoutType: ViewLayoutPB.Grid,
))
.getLeftOrNull();
@@ -41,15 +41,14 @@ SelectionMenuItem gridViewMenuItem(DocumentBloc documentBloc) =>
return;
}
- final app =
- (await service.readApp(appId: result.appId)).getLeftOrNull();
+ final app = (await service.getView(result.viewId)).getLeftOrNull();
// We should show an error dialog.
if (app == null) {
return;
}
- final view =
- (await service.getView(result.appId, result.id)).getLeftOrNull();
+ final view = (await service.getChildView(result.viewId, result.id))
+ .getLeftOrNull();
// As this.
if (view == null) {
return;
diff --git a/frontend/appflowy_flutter/lib/plugins/document/presentation/share/share_button.dart b/frontend/appflowy_flutter/lib/plugins/document/presentation/share/share_button.dart
index 84e9b179cb..ffdd9a5f23 100644
--- a/frontend/appflowy_flutter/lib/plugins/document/presentation/share/share_button.dart
+++ b/frontend/appflowy_flutter/lib/plugins/document/presentation/share/share_button.dart
@@ -13,7 +13,7 @@ import 'package:file_picker/file_picker.dart';
import 'package:flowy_infra_ui/widget/rounded_button.dart';
import 'package:appflowy_backend/log.dart';
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-document/entities.pb.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
diff --git a/frontend/appflowy_flutter/lib/plugins/trash/application/trash_bloc.dart b/frontend/appflowy_flutter/lib/plugins/trash/application/trash_bloc.dart
index 2a744817e4..f653fbfe11 100644
--- a/frontend/appflowy_flutter/lib/plugins/trash/application/trash_bloc.dart
+++ b/frontend/appflowy_flutter/lib/plugins/trash/application/trash_bloc.dart
@@ -1,6 +1,6 @@
import 'package:dartz/dartz.dart';
import 'package:appflowy_backend/log.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/trash.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/trash.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
@@ -31,8 +31,7 @@ class TrashBloc extends Bloc {
final result = await _service.putback(e.trashId);
await _handleResult(result, emit);
}, delete: (e) async {
- final result =
- await _service.deleteViews([Tuple2(e.trash.id, e.trash.ty)]);
+ final result = await _service.deleteViews([e.trash.id]);
await _handleResult(result, emit);
}, deleteAll: (e) async {
final result = await _service.deleteAll();
diff --git a/frontend/appflowy_flutter/lib/plugins/trash/application/trash_listener.dart b/frontend/appflowy_flutter/lib/plugins/trash/application/trash_listener.dart
index 5df20b27e9..bca3bd3f74 100644
--- a/frontend/appflowy_flutter/lib/plugins/trash/application/trash_listener.dart
+++ b/frontend/appflowy_flutter/lib/plugins/trash/application/trash_listener.dart
@@ -3,9 +3,9 @@ import 'dart:typed_data';
import 'package:appflowy/core/folder_notification.dart';
import 'package:dartz/dartz.dart';
import 'package:appflowy_backend/protobuf/flowy-notification/subject.pb.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/notification.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/notification.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/trash.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/trash.pb.dart';
import 'package:appflowy_backend/rust_stream.dart';
typedef TrashUpdatedCallback = void Function(
@@ -19,7 +19,10 @@ class TrashListener {
void start({TrashUpdatedCallback? trashUpdated}) {
_trashUpdated = trashUpdated;
- _parser = FolderNotificationParser(callback: _observableCallback);
+ _parser = FolderNotificationParser(
+ id: "trash",
+ callback: _observableCallback,
+ );
_subscription =
RustStreamReceiver.listen((observable) => _parser?.parse(observable));
}
diff --git a/frontend/appflowy_flutter/lib/plugins/trash/application/trash_service.dart b/frontend/appflowy_flutter/lib/plugins/trash/application/trash_service.dart
index 5b2e350435..29fb9f13c1 100644
--- a/frontend/appflowy_flutter/lib/plugins/trash/application/trash_service.dart
+++ b/frontend/appflowy_flutter/lib/plugins/trash/application/trash_service.dart
@@ -2,7 +2,7 @@ import 'dart:async';
import 'package:dartz/dartz.dart';
import 'package:appflowy_backend/dispatch/dispatch.dart';
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/trash.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/trash.pb.dart';
class TrashService {
Future> readTrash() {
@@ -15,12 +15,9 @@ class TrashService {
return FolderEventPutbackTrash(id).send();
}
- Future> deleteViews(
- List> trashList) {
- final items = trashList.map((trash) {
- return TrashIdPB.create()
- ..id = trash.value1
- ..ty = trash.value2;
+ Future> deleteViews(List trash) {
+ final items = trash.map((trash) {
+ return TrashIdPB.create()..id = trash;
});
final ids = RepeatedTrashIdPB(items: items);
diff --git a/frontend/appflowy_flutter/lib/plugins/trash/menu.dart b/frontend/appflowy_flutter/lib/plugins/trash/menu.dart
index f3b73e5404..8708aa7563 100644
--- a/frontend/appflowy_flutter/lib/plugins/trash/menu.dart
+++ b/frontend/appflowy_flutter/lib/plugins/trash/menu.dart
@@ -45,13 +45,9 @@ class MenuTrash extends StatelessWidget {
Widget _render(BuildContext context) {
return Row(
children: [
- SizedBox(
- width: 16,
- height: 16,
- child: svgWidget(
- "home/trash",
- color: Theme.of(context).colorScheme.onSurface,
- ),
+ const FlowySvg(
+ size: Size(16, 16),
+ name: 'home/trash',
),
const HSpace(6),
FlowyText.medium(LocaleKeys.trash_text.tr()),
diff --git a/frontend/appflowy_flutter/lib/plugins/trash/src/trash_cell.dart b/frontend/appflowy_flutter/lib/plugins/trash/src/trash_cell.dart
index 058f6f842a..01f33edbfd 100644
--- a/frontend/appflowy_flutter/lib/plugins/trash/src/trash_cell.dart
+++ b/frontend/appflowy_flutter/lib/plugins/trash/src/trash_cell.dart
@@ -2,7 +2,7 @@ import 'package:flowy_infra/image.dart';
import 'package:flowy_infra_ui/style_widget/icon_button.dart';
import 'package:flowy_infra_ui/style_widget/text.dart';
import 'package:flowy_infra_ui/widget/spacing.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/trash.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/trash.pb.dart';
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:fixnum/fixnum.dart' as $fixnum;
@@ -43,7 +43,7 @@ class TrashCell extends StatelessWidget {
iconPadding: const EdgeInsets.all(5),
icon: svgWidget(
"editor/restore",
- color: Theme.of(context).colorScheme.onSurface,
+ color: Theme.of(context).iconTheme.color,
),
),
const HSpace(20),
@@ -53,7 +53,7 @@ class TrashCell extends StatelessWidget {
iconPadding: const EdgeInsets.all(5),
icon: svgWidget(
"editor/delete",
- color: Theme.of(context).colorScheme.onSurface,
+ color: Theme.of(context).iconTheme.color,
),
),
],
diff --git a/frontend/appflowy_flutter/lib/plugins/trash/trash_page.dart b/frontend/appflowy_flutter/lib/plugins/trash/trash_page.dart
index a0947a2de3..28460e9c59 100644
--- a/frontend/appflowy_flutter/lib/plugins/trash/trash_page.dart
+++ b/frontend/appflowy_flutter/lib/plugins/trash/trash_page.dart
@@ -90,6 +90,7 @@ class _TrashPageState extends State {
FlowyText.semibold(
LocaleKeys.trash_text.tr(),
fontSize: FontSizes.s16,
+ color: Theme.of(context).colorScheme.tertiary,
),
const Spacer(),
IntrinsicWidth(
@@ -97,7 +98,7 @@ class _TrashPageState extends State {
text: FlowyText.medium(LocaleKeys.trash_restoreAll.tr()),
leftIcon: svgWidget(
'editor/restore',
- color: Theme.of(context).colorScheme.onSurface,
+ color: Theme.of(context).iconTheme.color,
),
onTap: () => context.read().add(
const TrashEvent.restoreAll(),
@@ -110,7 +111,7 @@ class _TrashPageState extends State {
text: FlowyText.medium(LocaleKeys.trash_deleteAll.tr()),
leftIcon: svgWidget(
'editor/delete',
- color: Theme.of(context).colorScheme.onSurface,
+ color: Theme.of(context).iconTheme.color,
),
onTap: () =>
context.read().add(const TrashEvent.deleteAll()),
diff --git a/frontend/appflowy_flutter/lib/plugins/util.dart b/frontend/appflowy_flutter/lib/plugins/util.dart
index f689511c44..f128b3ad99 100644
--- a/frontend/appflowy_flutter/lib/plugins/util.dart
+++ b/frontend/appflowy_flutter/lib/plugins/util.dart
@@ -2,7 +2,7 @@ import 'package:appflowy/startup/plugin/plugin.dart';
import 'package:appflowy/workspace/application/view/view_listener.dart';
import 'package:dartz/dartz.dart';
import 'package:appflowy_backend/log.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:flutter/material.dart';
class ViewPluginNotifier extends PluginNotifier> {
diff --git a/frontend/appflowy_flutter/lib/startup/deps_resolver.dart b/frontend/appflowy_flutter/lib/startup/deps_resolver.dart
index b8e219125e..8e0f4cbbc0 100644
--- a/frontend/appflowy_flutter/lib/startup/deps_resolver.dart
+++ b/frontend/appflowy_flutter/lib/startup/deps_resolver.dart
@@ -8,7 +8,6 @@ import 'package:appflowy/user/application/user_listener.dart';
import 'package:appflowy/user/application/user_service.dart';
import 'package:appflowy/util/file_picker/file_picker_impl.dart';
import 'package:appflowy/util/file_picker/file_picker_service.dart';
-import 'package:appflowy/workspace/application/app/prelude.dart';
import 'package:appflowy/plugins/document/application/prelude.dart';
import 'package:appflowy/workspace/application/settings/settings_location_cubit.dart';
import 'package:appflowy/workspace/application/user/prelude.dart';
@@ -22,8 +21,7 @@ import 'package:appflowy/user/presentation/router.dart';
import 'package:appflowy/plugins/trash/application/prelude.dart';
import 'package:appflowy/workspace/presentation/home/home_stack.dart';
import 'package:appflowy/workspace/presentation/home/menu/menu.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/app.pb.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-user/user_profile.pb.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:get_it/get_it.dart';
@@ -122,11 +120,6 @@ void _resolveFolderDeps(GetIt getIt) {
(user, _) => SettingsUserViewBloc(user),
);
- // AppPB
- getIt.registerFactoryParam(
- (app, _) => AppBloc(app: app),
- );
-
// trash
getIt.registerLazySingleton(() => TrashService());
getIt.registerLazySingleton(() => TrashListener());
diff --git a/frontend/appflowy_flutter/lib/startup/plugin/plugin.dart b/frontend/appflowy_flutter/lib/startup/plugin/plugin.dart
index 2a50dda5e0..f6d6cad9fa 100644
--- a/frontend/appflowy_flutter/lib/startup/plugin/plugin.dart
+++ b/frontend/appflowy_flutter/lib/startup/plugin/plugin.dart
@@ -3,7 +3,7 @@ library flowy_plugin;
import 'package:appflowy/startup/plugin/plugin.dart';
import 'package:appflowy/startup/startup.dart';
import 'package:appflowy/workspace/presentation/home/home_stack.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:flutter/widgets.dart';
export "./src/sandbox.dart";
@@ -52,7 +52,7 @@ abstract class PluginBuilder {
PluginType get pluginType;
- ViewLayoutTypePB? get layoutType => ViewLayoutTypePB.Document;
+ ViewLayoutPB? get layoutType => ViewLayoutPB.Document;
}
abstract class PluginConfig {
diff --git a/frontend/appflowy_flutter/lib/startup/tasks/app_widget.dart b/frontend/appflowy_flutter/lib/startup/tasks/app_widget.dart
index 9def64f8a5..d38f12e84b 100644
--- a/frontend/appflowy_flutter/lib/startup/tasks/app_widget.dart
+++ b/frontend/appflowy_flutter/lib/startup/tasks/app_widget.dart
@@ -46,6 +46,7 @@ class InitAppWidgetTask extends LaunchTask {
Locale('sv'),
Locale('tr', 'TR'),
Locale('zh', 'CN'),
+ Locale('zh', 'TW'),
],
path: 'assets/translations',
fallbackLocale: const Locale('en'),
diff --git a/frontend/appflowy_flutter/lib/startup/tasks/rust_sdk.dart b/frontend/appflowy_flutter/lib/startup/tasks/rust_sdk.dart
index 9507e9fd0c..994e018f21 100644
--- a/frontend/appflowy_flutter/lib/startup/tasks/rust_sdk.dart
+++ b/frontend/appflowy_flutter/lib/startup/tasks/rust_sdk.dart
@@ -36,10 +36,10 @@ Future appFlowyDocumentDirectory() async {
switch (integrationEnv()) {
case IntegrationMode.develop:
Directory documentsDir = await getApplicationDocumentsDirectory();
- return Directory(path.join(documentsDir.path, 'flowy_dev')).create();
+ return Directory(path.join(documentsDir.path, 'data_dev')).create();
case IntegrationMode.release:
Directory documentsDir = await getApplicationDocumentsDirectory();
- return Directory(path.join(documentsDir.path, 'flowy')).create();
+ return Directory(path.join(documentsDir.path, 'data')).create();
case IntegrationMode.test:
return Directory(path.join(Directory.current.path, '.sandbox'));
}
diff --git a/frontend/appflowy_flutter/lib/user/application/user_listener.dart b/frontend/appflowy_flutter/lib/user/application/user_listener.dart
index 8dc182a48b..b9bda5e042 100644
--- a/frontend/appflowy_flutter/lib/user/application/user_listener.dart
+++ b/frontend/appflowy_flutter/lib/user/application/user_listener.dart
@@ -2,12 +2,12 @@ import 'dart:async';
import 'package:appflowy/core/folder_notification.dart';
import 'package:appflowy/core/user_notification.dart';
import 'package:dartz/dartz.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/workspace.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/workspace.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
import 'dart:typed_data';
import 'package:flowy_infra/notifier.dart';
import 'package:appflowy_backend/protobuf/flowy-notification/protobuf.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/notification.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/notification.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-user/user_profile.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-user/notification.pb.dart'
as user;
@@ -119,13 +119,6 @@ class UserWorkspaceListener {
) {
switch (ty) {
case FolderNotification.DidCreateWorkspace:
- case FolderNotification.DidDeleteWorkspace:
- result.fold(
- (payload) => _workspacesChangedNotifier?.value =
- left(RepeatedWorkspacePB.fromBuffer(payload).items),
- (error) => _workspacesChangedNotifier?.value = right(error),
- );
- break;
case FolderNotification.DidUpdateWorkspaceSetting:
result.fold(
(payload) => _settingChangedNotifier?.value =
diff --git a/frontend/appflowy_flutter/lib/user/application/user_service.dart b/frontend/appflowy_flutter/lib/user/application/user_service.dart
index 295c1c4f01..7edf49a4ee 100644
--- a/frontend/appflowy_flutter/lib/user/application/user_service.dart
+++ b/frontend/appflowy_flutter/lib/user/application/user_service.dart
@@ -3,15 +3,16 @@ import 'dart:async';
import 'package:dartz/dartz.dart';
import 'package:appflowy_backend/dispatch/dispatch.dart';
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/workspace.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/workspace.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-user/user_profile.pb.dart';
+import 'package:fixnum/fixnum.dart';
class UserBackendService {
UserBackendService({
required this.userId,
});
- final String userId;
+ final Int64 userId;
static Future> getCurrentUserProfile() {
return UserEventGetUserProfile().send();
diff --git a/frontend/appflowy_flutter/lib/user/presentation/folder/folder_widget.dart b/frontend/appflowy_flutter/lib/user/presentation/folder/folder_widget.dart
index 8a34c04b14..50de6ad88d 100644
--- a/frontend/appflowy_flutter/lib/user/presentation/folder/folder_widget.dart
+++ b/frontend/appflowy_flutter/lib/user/presentation/folder/folder_widget.dart
@@ -2,9 +2,7 @@ import 'dart:io';
import 'package:appflowy/util/file_picker/file_picker_service.dart';
import 'package:easy_localization/easy_localization.dart';
-import 'package:flowy_infra_ui/style_widget/text.dart';
-import 'package:flowy_infra_ui/style_widget/text_field.dart';
-import 'package:flowy_infra_ui/widget/rounded_button.dart';
+import 'package:flowy_infra_ui/flowy_infra_ui.dart';
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
@@ -36,10 +34,7 @@ class _FolderWidgetState extends State {
@override
Widget build(BuildContext context) {
- return SizedBox(
- height: 250,
- child: _mapIndexToWidget(context),
- );
+ return _mapIndexToWidget(context);
}
Widget _mapIndexToWidget(BuildContext context) {
@@ -86,37 +81,24 @@ class FolderOptionsWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
- return ListView(
- shrinkWrap: true,
- children: [
- Card(
- child: ListTile(
- title: FlowyText.medium(
- LocaleKeys.settings_files_createNewFolder.tr(),
- ),
- subtitle: FlowyText.regular(
- LocaleKeys.settings_files_createNewFolderDesc.tr(),
- ),
- trailing: _buildTextButton(
- context,
- LocaleKeys.settings_files_create.tr(),
- onPressedCreate,
- ),
+ return Column(
+ children: [
+ _FolderCard(
+ title: LocaleKeys.settings_files_createNewFolder.tr(),
+ subtitle: LocaleKeys.settings_files_createNewFolderDesc.tr(),
+ trailing: _buildTextButton(
+ context,
+ LocaleKeys.settings_files_create.tr(),
+ onPressedCreate,
),
),
- Card(
- child: ListTile(
- title: FlowyText.medium(
- LocaleKeys.settings_files_openFolder.tr(),
- ),
- subtitle: FlowyText.regular(
- LocaleKeys.settings_files_openFolderDesc.tr(),
- ),
- trailing: _buildTextButton(
- context,
- LocaleKeys.settings_files_open.tr(),
- onPressedOpen,
- ),
+ _FolderCard(
+ title: LocaleKeys.settings_files_openFolder.tr(),
+ subtitle: LocaleKeys.settings_files_openFolderDesc.tr(),
+ trailing: _buildTextButton(
+ context,
+ LocaleKeys.settings_files_open.tr(),
+ onPressedOpen,
),
),
],
@@ -164,56 +146,55 @@ class CreateFolderWidgetState extends State {
label: const Text('Back'),
),
),
- Card(
- child: ListTile(
- title: FlowyText.medium(
- LocaleKeys.settings_files_location.tr(),
- ),
- subtitle: FlowyText.regular(
- LocaleKeys.settings_files_locationDesc.tr(),
- ),
- trailing: SizedBox(
- width: 100,
- height: 36,
- child: FlowyTextField(
- hintText: LocaleKeys.settings_files_folderHintText.tr(),
- onChanged: (name) {
- _folderName = name;
- },
- onSubmitted: (name) {
- setState(() {
- _folderName = name;
- });
- },
+ _FolderCard(
+ title: LocaleKeys.settings_files_location.tr(),
+ subtitle: LocaleKeys.settings_files_locationDesc.tr(),
+ trailing: SizedBox(
+ width: 120,
+ child: FlowyTextField(
+ hintText: LocaleKeys.settings_files_folderHintText.tr(),
+ onChanged: (name) => _folderName = name,
+ onSubmitted: (name) => setState(
+ () => _folderName = name,
),
),
),
),
- Card(
- child: ListTile(
- title: FlowyText.medium(LocaleKeys.settings_files_folderPath.tr()),
- subtitle: FlowyText.regular(_path),
- trailing: _buildTextButton(
- context, LocaleKeys.settings_files_browser.tr(), () async {
+ _FolderCard(
+ title: LocaleKeys.settings_files_folderPath.tr(),
+ subtitle: _path,
+ trailing: _buildTextButton(
+ context,
+ LocaleKeys.settings_files_browser.tr(),
+ () async {
final dir = await getIt().getDirectoryPath();
if (dir != null) {
- setState(() {
- directory = dir;
- });
+ setState(() => directory = dir);
}
- }),
+ },
),
),
- Card(
- child: _buildTextButton(
- context, LocaleKeys.settings_files_create.tr(), () async {
- if (_path.isEmpty) {
- _showToast(LocaleKeys.settings_files_locationCannotBeEmpty.tr());
- } else {
- await getIt().setLocation(_path);
- await widget.onPressedCreate();
- }
- }),
+ const VSpace(4.0),
+ Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 4.0),
+ child: Row(
+ children: [
+ _buildTextButton(
+ context,
+ LocaleKeys.settings_files_create.tr(),
+ () async {
+ if (_path.isEmpty) {
+ _showToast(
+ LocaleKeys.settings_files_locationCannotBeEmpty.tr(),
+ );
+ } else {
+ await getIt().setLocation(_path);
+ await widget.onPressedCreate();
+ }
+ },
+ ),
+ ],
+ ),
)
],
);
@@ -240,12 +221,70 @@ class CreateFolderWidgetState extends State {
Widget _buildTextButton(
BuildContext context, String title, VoidCallback onPressed) {
- return SizedBox(
- width: 70,
- height: 36,
- child: RoundedTextButton(
- title: title,
- onPressed: onPressed,
- ),
+ return FlowyTextButton(
+ title,
+ onPressed: onPressed,
+ fillColor: Theme.of(context).colorScheme.primary,
+ fontColor: Theme.of(context).colorScheme.onPrimary,
+ hoverColor: Theme.of(context).colorScheme.primaryContainer,
);
}
+
+class _FolderCard extends StatelessWidget {
+ const _FolderCard({
+ Key? key,
+ required this.title,
+ required this.subtitle,
+ this.trailing,
+ }) : super(key: key);
+
+ final String title;
+
+ final String subtitle;
+
+ final Widget? trailing;
+
+ @override
+ Widget build(BuildContext context) {
+ return Card(
+ child: Padding(
+ padding: const EdgeInsets.symmetric(
+ vertical: 4.0,
+ horizontal: 16.0,
+ ),
+ child: Row(
+ children: [
+ Expanded(
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ FlowyText.medium(
+ title,
+ ),
+ Row(
+ children: [
+ Flexible(
+ child: Text(
+ subtitle,
+ overflow: TextOverflow.ellipsis,
+ style:
+ Theme.of(context).textTheme.bodyMedium!.copyWith(
+ fontWeight: FontWeight.w400,
+ ),
+ ),
+ ),
+ ],
+ ),
+ ],
+ ),
+ ),
+ if (trailing != null) ...[
+ const HSpace(40),
+ trailing!,
+ ],
+ ],
+ ),
+ ),
+ );
+ }
+}
diff --git a/frontend/appflowy_flutter/lib/user/presentation/router.dart b/frontend/appflowy_flutter/lib/user/presentation/router.dart
index 665b261b66..8e08a0ce11 100644
--- a/frontend/appflowy_flutter/lib/user/presentation/router.dart
+++ b/frontend/appflowy_flutter/lib/user/presentation/router.dart
@@ -10,7 +10,7 @@ import 'package:flowy_infra/time/duration.dart';
import 'package:flowy_infra_ui/widget/route/animation.dart';
import 'package:appflowy_backend/protobuf/flowy-user/protobuf.dart'
show UserProfilePB;
-import 'package:appflowy_backend/protobuf/flowy-folder/protobuf.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/protobuf.dart';
import 'package:flutter/material.dart';
class AuthRouter {
diff --git a/frontend/appflowy_flutter/lib/user/presentation/skip_log_in_screen.dart b/frontend/appflowy_flutter/lib/user/presentation/skip_log_in_screen.dart
index e394f98fe1..3aefed7c6c 100644
--- a/frontend/appflowy_flutter/lib/user/presentation/skip_log_in_screen.dart
+++ b/frontend/appflowy_flutter/lib/user/presentation/skip_log_in_screen.dart
@@ -1,13 +1,12 @@
+import 'package:appflowy/core/frameless_window.dart';
import 'package:dartz/dartz.dart' as dartz;
import 'package:easy_localization/easy_localization.dart';
import 'package:flowy_infra/size.dart';
-import 'package:flowy_infra_ui/style_widget/button.dart';
-import 'package:flowy_infra_ui/widget/rounded_button.dart';
-import 'package:flowy_infra_ui/widget/spacing.dart';
+import 'package:flowy_infra_ui/flowy_infra_ui.dart';
import 'package:appflowy_backend/dispatch/dispatch.dart';
import 'package:appflowy_backend/log.dart';
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/protobuf.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/protobuf.dart';
import 'package:appflowy_backend/protobuf/flowy-user/user_profile.pb.dart';
import 'package:flutter/material.dart';
import 'package:url_launcher/url_launcher.dart';
@@ -39,6 +38,7 @@ class _SkipLogInScreenState extends State {
@override
Widget build(BuildContext context) {
return Scaffold(
+ appBar: const _SkipLoginMoveWindow(),
body: Center(
child: _renderBody(context),
),
@@ -54,9 +54,13 @@ class _SkipLogInScreenState extends State {
logoSize: const Size.square(60),
),
const VSpace(40),
- SizedBox(
- width: 250,
- child: GoButton(onPressed: () => _autoRegister(context)),
+ Row(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ GoButton(
+ onPressed: () => _autoRegister(context),
+ ),
+ ],
),
const VSpace(20),
SizedBox(
@@ -72,18 +76,15 @@ class _SkipLogInScreenState extends State {
},
),
),
- const VSpace(20),
- SizedBox(
- width: 400,
- child: _buildSubscribeButtons(context),
- ),
+ const Spacer(),
+ _buildSubscribeButtons(context),
],
);
}
Row _buildSubscribeButtons(BuildContext context) {
return Row(
- mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+ mainAxisAlignment: MainAxisAlignment.center,
children: [
FlowyTextButton(
LocaleKeys.githubStarText.tr(),
@@ -95,6 +96,7 @@ class _SkipLogInScreenState extends State {
onPressed: () =>
_launchURL('https://github.com/AppFlowy-IO/appflowy'),
),
+ const HSpace(20),
FlowyTextButton(
LocaleKeys.subscribeNewsletterText.tr(),
fontWeight: FontWeight.w500,
@@ -149,19 +151,41 @@ class _SkipLogInScreenState extends State {
class GoButton extends StatelessWidget {
final VoidCallback onPressed;
+
const GoButton({
- Key? key,
+ super.key,
required this.onPressed,
- }) : super(key: key);
+ });
@override
Widget build(BuildContext context) {
- return RoundedTextButton(
- title: LocaleKeys.letsGoButtonText.tr(),
+ return FlowyTextButton(
+ LocaleKeys.letsGoButtonText.tr(),
fontSize: FontSizes.s16,
- height: 50,
- borderRadius: Corners.s10Border,
+ padding: const EdgeInsets.symmetric(horizontal: 80, vertical: 12.0),
onPressed: onPressed,
+ fillColor: Theme.of(context).colorScheme.primary,
+ fontColor: Theme.of(context).colorScheme.onPrimary,
+ hoverColor: Theme.of(context).colorScheme.primaryContainer,
);
}
}
+
+class _SkipLoginMoveWindow extends StatelessWidget
+ implements PreferredSizeWidget {
+ const _SkipLoginMoveWindow();
+
+ @override
+ Widget build(BuildContext context) {
+ return Row(
+ children: const [
+ Expanded(
+ child: MoveWindowDetector(),
+ ),
+ ],
+ );
+ }
+
+ @override
+ Size get preferredSize => const Size.fromHeight(55.0);
+}
diff --git a/frontend/appflowy_flutter/lib/user/presentation/welcome_screen.dart b/frontend/appflowy_flutter/lib/user/presentation/welcome_screen.dart
index 5e21d4c69d..78c23b2521 100644
--- a/frontend/appflowy_flutter/lib/user/presentation/welcome_screen.dart
+++ b/frontend/appflowy_flutter/lib/user/presentation/welcome_screen.dart
@@ -5,7 +5,7 @@ import 'package:flowy_infra/theme_extension.dart';
import 'package:flowy_infra_ui/style_widget/scrolling/styled_list.dart';
import 'package:flowy_infra_ui/style_widget/button.dart';
import 'package:flowy_infra_ui/widget/error_page.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/workspace.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/workspace.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-user/user_profile.pb.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
diff --git a/frontend/appflowy_flutter/lib/user/presentation/widgets/background.dart b/frontend/appflowy_flutter/lib/user/presentation/widgets/background.dart
index fe3bdd2a15..f7353ebd5a 100644
--- a/frontend/appflowy_flutter/lib/user/presentation/widgets/background.dart
+++ b/frontend/appflowy_flutter/lib/user/presentation/widgets/background.dart
@@ -49,6 +49,7 @@ class FlowyLogoTitle extends StatelessWidget {
FlowyText.semibold(
title,
fontSize: FontSizes.s24,
+ color: Theme.of(context).colorScheme.tertiary,
),
],
),
diff --git a/frontend/appflowy_flutter/lib/workspace/application/app/app_bloc.dart b/frontend/appflowy_flutter/lib/workspace/application/app/app_bloc.dart
index df9d203974..6132d3870d 100644
--- a/frontend/appflowy_flutter/lib/workspace/application/app/app_bloc.dart
+++ b/frontend/appflowy_flutter/lib/workspace/application/app/app_bloc.dart
@@ -7,8 +7,7 @@ import 'package:appflowy/workspace/application/app/app_service.dart';
import 'package:appflowy/workspace/presentation/home/menu/menu.dart';
import 'package:expandable/expandable.dart';
import 'package:appflowy_backend/log.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/app.pb.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
import 'package:flutter/foundation.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
@@ -21,10 +20,10 @@ class AppBloc extends Bloc {
final AppBackendService appService;
final AppListener appListener;
- AppBloc({required AppPB app})
+ AppBloc({required ViewPB view})
: appService = AppBackendService(),
- appListener = AppListener(appId: app.id),
- super(AppState.initial(app)) {
+ appListener = AppListener(viewId: view.id),
+ super(AppState.initial(view)) {
on((event, emit) async {
await event.map(initial: (e) async {
_startListening();
@@ -41,10 +40,10 @@ class AppBloc extends Bloc {
await _renameView(e, emit);
}, appDidUpdate: (e) async {
final latestCreatedView = state.latestCreatedView;
- final views = e.app.belongings.items;
+ final views = e.app.belongings;
AppState newState = state.copyWith(
views: views,
- app: e.app,
+ view: e.app,
);
if (latestCreatedView != null) {
final index =
@@ -70,7 +69,7 @@ class AppBloc extends Bloc {
Future _renameView(Rename e, Emitter emit) async {
final result =
- await appService.updateApp(appId: state.app.id, name: e.newName);
+ await appService.updateApp(appId: state.view.id, name: e.newName);
result.fold(
(l) => emit(state.copyWith(successOrFailure: left(unit))),
(error) => emit(state.copyWith(successOrFailure: right(error))),
@@ -79,7 +78,7 @@ class AppBloc extends Bloc {
// Delete the current app
Future _deleteApp(Emitter emit) async {
- final result = await appService.delete(appId: state.app.id);
+ final result = await appService.delete(viewId: state.view.id);
result.fold(
(unit) => emit(state.copyWith(successOrFailure: left(unit))),
(error) => emit(state.copyWith(successOrFailure: right(error))),
@@ -96,7 +95,7 @@ class AppBloc extends Bloc {
Future _createView(CreateView value, Emitter emit) async {
final result = await appService.createView(
- appId: state.app.id,
+ appId: state.view.id,
name: value.name,
desc: value.desc ?? "",
layoutType: value.pluginBuilder.layoutType!,
@@ -122,7 +121,7 @@ class AppBloc extends Bloc {
}
Future _loadViews(Emitter emit) async {
- final viewsOrFailed = await appService.getViews(appId: state.app.id);
+ final viewsOrFailed = await appService.getViews(viewId: state.view.id);
viewsOrFailed.fold(
(views) => emit(state.copyWith(views: views)),
(error) {
@@ -150,34 +149,34 @@ class AppEvent with _$AppEvent {
const factory AppEvent.delete() = DeleteApp;
const factory AppEvent.deleteView(String viewId) = DeleteView;
const factory AppEvent.rename(String newName) = Rename;
- const factory AppEvent.appDidUpdate(AppPB app) = AppDidUpdate;
+ const factory AppEvent.appDidUpdate(ViewPB app) = AppDidUpdate;
}
@freezed
class AppState with _$AppState {
const factory AppState({
- required AppPB app,
+ required ViewPB view,
required List views,
ViewPB? latestCreatedView,
required Either successOrFailure,
}) = _AppState;
- factory AppState.initial(AppPB app) => AppState(
- app: app,
- views: app.belongings.items,
+ factory AppState.initial(ViewPB view) => AppState(
+ view: view,
+ views: view.belongings,
successOrFailure: left(unit),
);
}
class AppViewDataContext extends ChangeNotifier {
- final String appId;
+ final String viewId;
final ValueNotifier> _viewsNotifier = ValueNotifier([]);
final ValueNotifier _selectedViewNotifier = ValueNotifier(null);
VoidCallback? _menuSharedStateListener;
ExpandableController expandController =
ExpandableController(initialExpanded: false);
- AppViewDataContext({required this.appId}) {
+ AppViewDataContext({required this.viewId}) {
_setLatestView(getIt().latestOpenView);
_menuSharedStateListener =
getIt().addLatestViewListener((view) {
diff --git a/frontend/appflowy_flutter/lib/workspace/application/app/app_listener.dart b/frontend/appflowy_flutter/lib/workspace/application/app/app_listener.dart
index 1186068c75..af3875b1ec 100644
--- a/frontend/appflowy_flutter/lib/workspace/application/app/app_listener.dart
+++ b/frontend/appflowy_flutter/lib/workspace/application/app/app_listener.dart
@@ -5,12 +5,11 @@ import 'package:dartz/dartz.dart';
import 'package:appflowy_backend/log.dart';
import 'package:appflowy_backend/protobuf/flowy-notification/subject.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/app.pb.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/notification.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/notification.pb.dart';
import 'package:appflowy_backend/rust_stream.dart';
-typedef AppDidUpdateCallback = void Function(AppPB app);
+typedef AppDidUpdateCallback = void Function(ViewPB app);
typedef ViewsDidChangeCallback = void Function(
Either, FlowyError> viewsOrFailed);
@@ -18,15 +17,15 @@ class AppListener {
StreamSubscription? _subscription;
AppDidUpdateCallback? _updated;
FolderNotificationParser? _parser;
- String appId;
+ String viewId;
AppListener({
- required this.appId,
+ required this.viewId,
});
void start({AppDidUpdateCallback? onAppUpdated}) {
_updated = onAppUpdated;
- _parser = FolderNotificationParser(id: appId, callback: _handleCallback);
+ _parser = FolderNotificationParser(id: viewId, callback: _handleCallback);
_subscription =
RustStreamReceiver.listen((observable) => _parser?.parse(observable));
}
@@ -34,11 +33,12 @@ class AppListener {
void _handleCallback(
FolderNotification ty, Either result) {
switch (ty) {
- case FolderNotification.DidUpdateApp:
+ case FolderNotification.DidUpdateView:
+ case FolderNotification.DidUpdateChildViews:
if (_updated != null) {
result.fold(
(payload) {
- final app = AppPB.fromBuffer(payload);
+ final app = ViewPB.fromBuffer(payload);
_updated!(app);
},
(error) => Log.error(error),
diff --git a/frontend/appflowy_flutter/lib/workspace/application/app/app_service.dart b/frontend/appflowy_flutter/lib/workspace/application/app/app_service.dart
index c54d2ad602..5cc0e0439c 100644
--- a/frontend/appflowy_flutter/lib/workspace/application/app/app_service.dart
+++ b/frontend/appflowy_flutter/lib/workspace/application/app/app_service.dart
@@ -1,25 +1,18 @@
import 'dart:async';
import 'dart:convert';
-import 'package:appflowy_backend/protobuf/flowy-folder/workspace.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/workspace.pb.dart';
import 'package:dartz/dartz.dart';
import 'package:appflowy_backend/dispatch/dispatch.dart';
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/app.pb.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
class AppBackendService {
- Future> readApp({required String appId}) {
- final payload = AppIdPB.create()..value = appId;
-
- return FolderEventReadApp(payload).send();
- }
-
Future> createView({
required String appId,
required String name,
String? desc,
- required ViewLayoutTypePB layoutType,
+ required ViewLayoutPB layoutType,
/// The initial data should be the JSON of the document.
/// Currently, only support create document with initial data.
@@ -51,20 +44,20 @@ class AppBackendService {
return FolderEventCreateView(payload).send();
}
- Future, FlowyError>> getViews({required String appId}) {
- final payload = AppIdPB.create()..value = appId;
+ Future, FlowyError>> getViews({required String viewId}) {
+ final payload = ViewIdPB.create()..value = viewId;
- return FolderEventReadApp(payload).send().then((result) {
+ return FolderEventReadView(payload).send().then((result) {
return result.fold(
- (app) => left(app.belongings.items),
+ (app) => left(app.belongings),
(error) => right(error),
);
});
}
- Future> delete({required String appId}) {
- final request = AppIdPB.create()..value = appId;
- return FolderEventDeleteApp(request).send();
+ Future> delete({required String viewId}) {
+ final request = RepeatedViewIdPB.create()..items.add(viewId);
+ return FolderEventDeleteView(request).send();
}
Future> deleteView({required String viewId}) {
@@ -72,14 +65,14 @@ class AppBackendService {
return FolderEventDeleteView(request).send();
}
- Future> updateApp(
+ Future> updateApp(
{required String appId, String? name}) {
- UpdateAppPayloadPB payload = UpdateAppPayloadPB.create()..appId = appId;
+ var payload = UpdateViewPayloadPB.create()..viewId = appId;
if (name != null) {
payload.name = name;
}
- return FolderEventUpdateApp(payload).send();
+ return FolderEventUpdateView(payload).send();
}
Future> moveView({
@@ -96,22 +89,22 @@ class AppBackendService {
return FolderEventMoveItem(payload).send();
}
- Future>>> fetchViews(
- ViewLayoutTypePB layoutType) async {
- final result = >>[];
+ Future>>> fetchViews(
+ ViewLayoutPB layoutType) async {
+ final result = >>[];
return FolderEventReadCurrentWorkspace().send().then((value) async {
final workspaces = value.getLeftOrNull();
if (workspaces != null) {
- final apps = workspaces.workspace.apps.items;
- for (var app in apps) {
- final views = await getViews(appId: app.id).then(
+ final views = workspaces.workspace.views;
+ for (var view in views) {
+ final childViews = await getViews(viewId: view.id).then(
(value) => value
.getLeftOrNull>()
?.where((e) => e.layout == layoutType)
.toList(),
);
- if (views != null && views.isNotEmpty) {
- result.add(Tuple2(app, views));
+ if (childViews != null && childViews.isNotEmpty) {
+ result.add(Tuple2(view, childViews));
}
}
}
@@ -120,14 +113,21 @@ class AppBackendService {
}
Future> getView(
- String appID,
String viewID,
) async {
- final payload = AppIdPB.create()..value = appID;
- return FolderEventReadApp(payload).send().then((result) {
+ final payload = ViewIdPB.create()..value = viewID;
+ return FolderEventReadView(payload).send();
+ }
+
+ Future> getChildView(
+ String viewID,
+ String childViewID,
+ ) async {
+ final payload = ViewIdPB.create()..value = viewID;
+ return FolderEventReadView(payload).send().then((result) {
return result.fold(
(app) => left(
- app.belongings.items.firstWhere((e) => e.id == viewID),
+ app.belongings.firstWhere((e) => e.id == childViewID),
),
(error) => right(error),
);
diff --git a/frontend/appflowy_flutter/lib/workspace/application/appearance.dart b/frontend/appflowy_flutter/lib/workspace/application/appearance.dart
index b5c3ecb9bf..d7dbc10377 100644
--- a/frontend/appflowy_flutter/lib/workspace/application/appearance.dart
+++ b/frontend/appflowy_flutter/lib/workspace/application/appearance.dart
@@ -55,9 +55,9 @@ class AppearanceSettingsCubit extends Cubit {
newLocale = const Locale('en');
}
- context.setLocale(newLocale);
-
if (state.locale != newLocale) {
+ context.setLocale(newLocale);
+
_setting.locale.languageCode = newLocale.languageCode;
_setting.locale.countryCode = newLocale.countryCode ?? "";
_saveAppearanceSettings();
@@ -212,14 +212,21 @@ class AppearanceSettingsState with _$AppearanceSettingsState {
return ThemeData(
brightness: brightness,
- textTheme:
- _getTextTheme(fontFamily: fontFamily, fontColor: theme.shader1),
+ textTheme: _getTextTheme(fontFamily: fontFamily, fontColor: theme.text),
textSelectionTheme: TextSelectionThemeData(
cursorColor: theme.main2,
selectionHandleColor: theme.main2,
),
- primaryIconTheme: IconThemeData(color: theme.hover),
- iconTheme: IconThemeData(color: theme.shader1),
+ iconTheme: IconThemeData(color: theme.icon),
+ tooltipTheme: TooltipThemeData(
+ textStyle: _getFontStyle(
+ fontFamily: fontFamily,
+ fontSize: FontSizes.s11,
+ fontWeight: FontWeight.w400,
+ fontColor: theme.surface,
+ ),
+ ),
+ scaffoldBackgroundColor: theme.surface,
scrollbarTheme: ScrollbarThemeData(
thumbColor: MaterialStateProperty.all(theme.shader3),
thickness: MaterialStateProperty.resolveWith((states) {
@@ -239,30 +246,38 @@ class AppearanceSettingsState with _$AppearanceSettingsState {
),
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
canvasColor: theme.shader6,
- dividerColor: theme.shader6,
- hintColor: theme.shader3,
+ dividerColor: theme.divider,
+ hintColor: theme.hint,
+ //action item hover color
+ hoverColor: theme.hoverBG2,
disabledColor: theme.shader4,
highlightColor: theme.main1,
indicatorColor: theme.main1,
toggleableActiveColor: theme.main1,
+ cardColor: theme.input,
colorScheme: ColorScheme(
brightness: brightness,
- primary: theme.main1,
- onPrimary: _white,
+ primary: theme.primary,
+ onPrimary: theme.onPrimary,
primaryContainer: theme.main2,
onPrimaryContainer: _white,
- secondary: theme.hover,
+ // page title hover color
+ secondary: theme.hoverBG1,
onSecondary: theme.shader1,
+ // setting value hover color
secondaryContainer: theme.selector,
- onSecondaryContainer: theme.shader1,
+ onSecondaryContainer: theme.topbarBg,
+ tertiary: theme.shader7,
+ tertiaryContainer: theme.questionBubbleBG,
background: theme.surface,
- onBackground: theme.shader1,
+ onBackground: theme.text,
surface: theme.surface,
- onSurface: theme.shader1,
+ // text&icon color when it is hovered
+ onSurface: theme.hoverFG,
onError: theme.shader7,
error: theme.red,
outline: theme.shader4,
- surfaceVariant: theme.bg1,
+ surfaceVariant: theme.sidebarBg,
shadow: theme.shadow,
),
extensions: [
@@ -278,10 +293,12 @@ class AppearanceSettingsState with _$AppearanceSettingsState {
tint7: theme.tint7,
tint8: theme.tint8,
tint9: theme.tint9,
- greyHover: theme.bg2,
+ textColor: theme.text,
+ greyHover: theme.hoverBG1,
greySelect: theme.bg3,
- lightGreyHover: theme.shader6,
+ lightGreyHover: theme.hoverBG3,
toggleOffFill: theme.shader5,
+ progressBarBGcolor: theme.progressBarBGcolor,
code: _getFontStyle(
fontFamily: monospaceFontFamily,
fontColor: theme.shader3,
@@ -295,7 +312,7 @@ class AppearanceSettingsState with _$AppearanceSettingsState {
fontFamily: fontFamily,
fontSize: FontSizes.s11,
fontWeight: FontWeight.w400,
- fontColor: theme.shader3,
+ fontColor: theme.hint,
),
)
],
diff --git a/frontend/appflowy_flutter/lib/workspace/application/home/home_bloc.dart b/frontend/appflowy_flutter/lib/workspace/application/home/home_bloc.dart
index 9163710b96..53b7328122 100644
--- a/frontend/appflowy_flutter/lib/workspace/application/home/home_bloc.dart
+++ b/frontend/appflowy_flutter/lib/workspace/application/home/home_bloc.dart
@@ -3,8 +3,8 @@ import 'package:flowy_infra/time/duration.dart';
import 'package:appflowy_backend/log.dart';
import 'package:appflowy_backend/protobuf/flowy-error/code.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/workspace.pb.dart'
+import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/workspace.pb.dart'
show WorkspaceSettingPB;
import 'package:appflowy_backend/protobuf/flowy-user/user_profile.pb.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
diff --git a/frontend/appflowy_flutter/lib/workspace/application/home/home_service.dart b/frontend/appflowy_flutter/lib/workspace/application/home/home_service.dart
index 51c57ca576..dd1c19b2b7 100644
--- a/frontend/appflowy_flutter/lib/workspace/application/home/home_service.dart
+++ b/frontend/appflowy_flutter/lib/workspace/application/home/home_service.dart
@@ -1,14 +1,14 @@
import 'dart:async';
+import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:dartz/dartz.dart';
import 'package:appflowy_backend/dispatch/dispatch.dart';
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/app.pb.dart';
class HomeService {
- Future> readApp({required String appId}) {
- final payload = AppIdPB.create()..value = appId;
+ Future> readApp({required String appId}) {
+ final payload = ViewIdPB.create()..value = appId;
- return FolderEventReadApp(payload).send();
+ return FolderEventReadView(payload).send();
}
}
diff --git a/frontend/appflowy_flutter/lib/workspace/application/home/home_setting_bloc.dart b/frontend/appflowy_flutter/lib/workspace/application/home/home_setting_bloc.dart
index 44e8518760..d24ca6f8a4 100644
--- a/frontend/appflowy_flutter/lib/workspace/application/home/home_setting_bloc.dart
+++ b/frontend/appflowy_flutter/lib/workspace/application/home/home_setting_bloc.dart
@@ -1,7 +1,7 @@
import 'package:appflowy/user/application/user_listener.dart';
import 'package:appflowy/workspace/application/appearance.dart';
import 'package:appflowy/workspace/application/edit_panel/edit_context.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/workspace.pb.dart'
+import 'package:appflowy_backend/protobuf/flowy-folder2/workspace.pb.dart'
show WorkspaceSettingPB;
import 'package:appflowy_backend/protobuf/flowy-user/user_profile.pb.dart';
import 'package:dartz/dartz.dart';
diff --git a/frontend/appflowy_flutter/lib/workspace/application/menu/menu_bloc.dart b/frontend/appflowy_flutter/lib/workspace/application/menu/menu_bloc.dart
index c687938652..54c126b221 100644
--- a/frontend/appflowy_flutter/lib/workspace/application/menu/menu_bloc.dart
+++ b/frontend/appflowy_flutter/lib/workspace/application/menu/menu_bloc.dart
@@ -2,11 +2,11 @@ import 'dart:async';
import 'package:appflowy/startup/plugin/plugin.dart';
import 'package:appflowy/workspace/application/workspace/workspace_listener.dart';
import 'package:appflowy/workspace/application/workspace/workspace_service.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:dartz/dartz.dart';
import 'package:appflowy_backend/log.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/app.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/workspace.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/workspace.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-user/user_profile.pb.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
@@ -38,24 +38,35 @@ class MenuBloc extends Bloc {
emit(state.copyWith(plugin: e.plugin));
},
createApp: (_CreateApp event) async {
- await _performActionOnCreateApp(event, emit);
+ final result = await _workspaceService.createApp(
+ name: event.name,
+ desc: event.desc ?? "",
+ );
+ result.fold(
+ (app) => {},
+ (error) {
+ Log.error(error);
+ emit(state.copyWith(successOrFailure: right(error)));
+ },
+ );
},
didReceiveApps: (e) async {
emit(e.appsOrFail.fold(
- (apps) => state.copyWith(apps: apps, successOrFailure: left(unit)),
+ (views) =>
+ state.copyWith(views: views, successOrFailure: left(unit)),
(err) => state.copyWith(successOrFailure: right(err)),
));
},
moveApp: (_MoveApp value) {
- if (state.apps.length > value.fromIndex) {
- final app = state.apps[value.fromIndex];
+ if (state.views.length > value.fromIndex) {
+ final view = state.views[value.fromIndex];
_workspaceService.moveApp(
- appId: app.id,
+ appId: view.id,
fromIndex: value.fromIndex,
toIndex: value.toIndex);
- final apps = List.from(state.apps);
+ final apps = List.from(state.views);
apps.insert(value.toIndex, apps.removeAt(value.fromIndex));
- emit(state.copyWith(apps: apps));
+ emit(state.copyWith(views: apps));
}
},
);
@@ -68,24 +79,11 @@ class MenuBloc extends Bloc {
return super.close();
}
- Future _performActionOnCreateApp(
- _CreateApp event, Emitter emit) async {
- final result = await _workspaceService.createApp(
- name: event.name, desc: event.desc ?? "");
- result.fold(
- (app) => {},
- (error) {
- Log.error(error);
- emit(state.copyWith(successOrFailure: right(error)));
- },
- );
- }
-
// ignore: unused_element
Future _fetchApps(Emitter emit) async {
final appsOrFail = await _workspaceService.getApps();
emit(appsOrFail.fold(
- (apps) => state.copyWith(apps: apps),
+ (views) => state.copyWith(views: views),
(error) {
Log.error(error);
return state.copyWith(successOrFailure: right(error));
@@ -93,7 +91,7 @@ class MenuBloc extends Bloc {
));
}
- void _handleAppsOrFail(Either, FlowyError> appsOrFail) {
+ void _handleAppsOrFail(Either, FlowyError> appsOrFail) {
appsOrFail.fold(
(apps) => add(MenuEvent.didReceiveApps(left(apps))),
(error) => add(MenuEvent.didReceiveApps(right(error))),
@@ -108,19 +106,19 @@ class MenuEvent with _$MenuEvent {
const factory MenuEvent.createApp(String name, {String? desc}) = _CreateApp;
const factory MenuEvent.moveApp(int fromIndex, int toIndex) = _MoveApp;
const factory MenuEvent.didReceiveApps(
- Either, FlowyError> appsOrFail) = _ReceiveApps;
+ Either, FlowyError> appsOrFail) = _ReceiveApps;
}
@freezed
class MenuState with _$MenuState {
const factory MenuState({
- required List apps,
+ required List views,
required Either successOrFailure,
required Plugin plugin,
}) = _MenuState;
factory MenuState.initial(WorkspacePB workspace) => MenuState(
- apps: workspace.apps.items,
+ views: workspace.views,
successOrFailure: left(unit),
plugin: makePlugin(pluginType: PluginType.blank),
);
diff --git a/frontend/appflowy_flutter/lib/workspace/application/menu/menu_user_bloc.dart b/frontend/appflowy_flutter/lib/workspace/application/menu/menu_user_bloc.dart
index f12627dca9..d6bb398d9c 100644
--- a/frontend/appflowy_flutter/lib/workspace/application/menu/menu_user_bloc.dart
+++ b/frontend/appflowy_flutter/lib/workspace/application/menu/menu_user_bloc.dart
@@ -1,7 +1,7 @@
import 'package:appflowy/user/application/user_listener.dart';
import 'package:appflowy/user/application/user_service.dart';
import 'package:appflowy_backend/log.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/workspace.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/workspace.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-user/user_profile.pb.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
diff --git a/frontend/appflowy_flutter/lib/workspace/application/menu/menu_view_section_bloc.dart b/frontend/appflowy_flutter/lib/workspace/application/menu/menu_view_section_bloc.dart
index fdf82a91a2..2f275f1fef 100644
--- a/frontend/appflowy_flutter/lib/workspace/application/menu/menu_view_section_bloc.dart
+++ b/frontend/appflowy_flutter/lib/workspace/application/menu/menu_view_section_bloc.dart
@@ -3,7 +3,7 @@ import 'dart:async';
import 'package:appflowy/workspace/application/app/app_bloc.dart';
import 'package:appflowy/workspace/application/app/app_service.dart';
import 'package:appflowy_backend/log.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
diff --git a/frontend/appflowy_flutter/lib/workspace/application/settings/settings_file_exporter_cubit.dart b/frontend/appflowy_flutter/lib/workspace/application/settings/settings_file_exporter_cubit.dart
index 04be1f61bf..5e75f744b5 100644
--- a/frontend/appflowy_flutter/lib/workspace/application/settings/settings_file_exporter_cubit.dart
+++ b/frontend/appflowy_flutter/lib/workspace/application/settings/settings_file_exporter_cubit.dart
@@ -1,26 +1,26 @@
-import 'package:appflowy_backend/protobuf/flowy-folder/app.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
class SettingsFileExportState {
SettingsFileExportState({
- required this.apps,
+ required this.views,
}) {
initialize();
}
- List apps;
+ List views;
List expanded = [];
List selectedApps = [];
List> selectedItems = [];
SettingsFileExportState copyWith({
- List? apps,
+ List? views,
List? expanded,
List? selectedApps,
List>? selectedItems,
}) {
final state = SettingsFileExportState(
- apps: apps ?? this.apps,
+ views: views ?? this.views,
);
state.expanded = expanded ?? this.expanded;
state.selectedApps = selectedApps ?? this.selectedApps;
@@ -29,17 +29,17 @@ class SettingsFileExportState {
}
void initialize() {
- expanded = apps.map((e) => true).toList();
- selectedApps = apps.map((e) => true).toList();
+ expanded = views.map((e) => true).toList();
+ selectedApps = views.map((e) => true).toList();
selectedItems =
- apps.map((e) => e.belongings.items.map((e) => true).toList()).toList();
+ views.map((e) => e.belongings.map((e) => true).toList()).toList();
}
}
class SettingsFileExporterCubit extends Cubit {
SettingsFileExporterCubit({
- required List apps,
- }) : super(SettingsFileExportState(apps: apps));
+ required List views,
+ }) : super(SettingsFileExportState(views: views));
void selectOrDeselectItem(int outerIndex, int innerIndex) {
final selectedItems = state.selectedItems;
@@ -55,7 +55,7 @@ class SettingsFileExporterCubit extends Cubit {
}
Map> fetchSelectedPages() {
- final apps = state.apps;
+ final apps = state.views;
final selectedItems = state.selectedItems;
Map> result = {};
for (var i = 0; i < selectedItems.length; i++) {
@@ -63,7 +63,7 @@ class SettingsFileExporterCubit extends Cubit {
final ids = [];
for (var j = 0; j < selectedItem.length; j++) {
if (selectedItem[j]) {
- ids.add(apps[i].belongings.items[j].id);
+ ids.add(apps[i].belongings[j].id);
}
}
if (ids.isNotEmpty) {
diff --git a/frontend/appflowy_flutter/lib/workspace/application/view/view_bloc.dart b/frontend/appflowy_flutter/lib/workspace/application/view/view_bloc.dart
index 1951fd0a88..05bd1ca178 100644
--- a/frontend/appflowy_flutter/lib/workspace/application/view/view_bloc.dart
+++ b/frontend/appflowy_flutter/lib/workspace/application/view/view_bloc.dart
@@ -1,7 +1,7 @@
import 'package:appflowy/workspace/application/view/view_listener.dart';
import 'package:appflowy/workspace/application/view/view_service.dart';
import 'package:dartz/dartz.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
diff --git a/frontend/appflowy_flutter/lib/workspace/application/view/view_ext.dart b/frontend/appflowy_flutter/lib/workspace/application/view/view_ext.dart
index c666d77b2d..069cc8e07f 100644
--- a/frontend/appflowy_flutter/lib/workspace/application/view/view_ext.dart
+++ b/frontend/appflowy_flutter/lib/workspace/application/view/view_ext.dart
@@ -1,6 +1,6 @@
import 'package:appflowy/startup/plugin/plugin.dart';
import 'package:flowy_infra/image.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:flutter/material.dart';
enum FlowyPlugin {
@@ -36,19 +36,19 @@ extension ViewExtension on ViewPB {
Widget renderThumbnail({Color? iconColor}) {
String thumbnail = "file_icon";
- final Widget widget = svgWidget(thumbnail, color: iconColor);
+ final Widget widget = FlowySvg(name: thumbnail);
return widget;
}
PluginType get pluginType {
switch (layout) {
- case ViewLayoutTypePB.Board:
+ case ViewLayoutPB.Board:
return PluginType.board;
- case ViewLayoutTypePB.Calendar:
+ case ViewLayoutPB.Calendar:
return PluginType.calendar;
- case ViewLayoutTypePB.Document:
+ case ViewLayoutPB.Document:
return PluginType.editor;
- case ViewLayoutTypePB.Grid:
+ case ViewLayoutPB.Grid:
return PluginType.grid;
}
diff --git a/frontend/appflowy_flutter/lib/workspace/application/view/view_listener.dart b/frontend/appflowy_flutter/lib/workspace/application/view/view_listener.dart
index 1af4a8e57b..38de59e4cc 100644
--- a/frontend/appflowy_flutter/lib/workspace/application/view/view_listener.dart
+++ b/frontend/appflowy_flutter/lib/workspace/application/view/view_listener.dart
@@ -3,9 +3,9 @@ import 'dart:typed_data';
import 'package:appflowy/core/folder_notification.dart';
import 'package:dartz/dartz.dart';
import 'package:appflowy_backend/protobuf/flowy-notification/subject.pb.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/notification.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/notification.pb.dart';
import 'package:appflowy_backend/rust_stream.dart';
import 'package:flowy_infra/notifier.dart';
diff --git a/frontend/appflowy_flutter/lib/workspace/application/view/view_service.dart b/frontend/appflowy_flutter/lib/workspace/application/view/view_service.dart
index 7524a39e2c..7facfcec3f 100644
--- a/frontend/appflowy_flutter/lib/workspace/application/view/view_service.dart
+++ b/frontend/appflowy_flutter/lib/workspace/application/view/view_service.dart
@@ -1,7 +1,7 @@
import 'dart:async';
import 'package:dartz/dartz.dart';
import 'package:appflowy_backend/dispatch/dispatch.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
class ViewService {
diff --git a/frontend/appflowy_flutter/lib/workspace/application/workspace/welcome_bloc.dart b/frontend/appflowy_flutter/lib/workspace/application/workspace/welcome_bloc.dart
index aef0464cee..8700297a84 100644
--- a/frontend/appflowy_flutter/lib/workspace/application/workspace/welcome_bloc.dart
+++ b/frontend/appflowy_flutter/lib/workspace/application/workspace/welcome_bloc.dart
@@ -1,7 +1,7 @@
import 'package:appflowy/user/application/user_listener.dart';
import 'package:appflowy/user/application/user_service.dart';
import 'package:appflowy_backend/log.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/workspace.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/workspace.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
diff --git a/frontend/appflowy_flutter/lib/workspace/application/workspace/workspace_listener.dart b/frontend/appflowy_flutter/lib/workspace/application/workspace/workspace_listener.dart
index 73019c34e1..4346d1f226 100644
--- a/frontend/appflowy_flutter/lib/workspace/application/workspace/workspace_listener.dart
+++ b/frontend/appflowy_flutter/lib/workspace/application/workspace/workspace_listener.dart
@@ -1,16 +1,16 @@
import 'dart:async';
import 'dart:typed_data';
import 'package:appflowy/core/folder_notification.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:dartz/dartz.dart';
import 'package:flowy_infra/notifier.dart';
import 'package:appflowy_backend/protobuf/flowy-user/protobuf.dart'
show UserProfilePB;
-import 'package:appflowy_backend/protobuf/flowy-folder/app.pb.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/workspace.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/workspace.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/notification.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/notification.pb.dart';
-typedef AppListNotifyValue = Either, FlowyError>;
+typedef AppListNotifyValue = Either, FlowyError>;
typedef WorkspaceNotifyValue = Either;
class WorkspaceListener {
@@ -55,10 +55,10 @@ class WorkspaceListener {
(error) => _workspaceUpdatedNotifier?.value = right(error),
);
break;
- case FolderNotification.DidUpdateWorkspaceApps:
+ case FolderNotification.DidUpdateWorkspaceViews:
result.fold(
(payload) => _appsChangedNotifier?.value =
- left(RepeatedAppPB.fromBuffer(payload).items),
+ left(RepeatedViewPB.fromBuffer(payload).items),
(error) => _appsChangedNotifier?.value = right(error),
);
break;
diff --git a/frontend/appflowy_flutter/lib/workspace/application/workspace/workspace_service.dart b/frontend/appflowy_flutter/lib/workspace/application/workspace/workspace_service.dart
index 425154f353..a3e075f84e 100644
--- a/frontend/appflowy_flutter/lib/workspace/application/workspace/workspace_service.dart
+++ b/frontend/appflowy_flutter/lib/workspace/application/workspace/workspace_service.dart
@@ -4,10 +4,14 @@ import 'package:dartz/dartz.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:appflowy_backend/dispatch/dispatch.dart';
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/app.pb.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart'
- show MoveFolderItemPayloadPB, MoveFolderItemType;
-import 'package:appflowy_backend/protobuf/flowy-folder/workspace.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart'
+ show
+ CreateViewPayloadPB,
+ MoveFolderItemPayloadPB,
+ MoveFolderItemType,
+ ViewLayoutPB,
+ ViewPB;
+import 'package:appflowy_backend/protobuf/flowy-folder2/workspace.pb.dart';
import 'package:appflowy/generated/locale_keys.g.dart';
@@ -16,13 +20,15 @@ class WorkspaceService {
WorkspaceService({
required this.workspaceId,
});
- Future> createApp(
+ Future> createApp(
{required String name, String? desc}) {
- final payload = CreateAppPayloadPB.create()
+ final payload = CreateViewPayloadPB.create()
+ ..belongToId = workspaceId
..name = name
- ..workspaceId = workspaceId
- ..desc = desc ?? "";
- return FolderEventCreateApp(payload).send();
+ ..desc = desc ?? ""
+ ..layout = ViewLayoutPB.Document;
+
+ return FolderEventCreateView(payload).send();
}
Future> getWorkspace() {
@@ -44,7 +50,7 @@ class WorkspaceService {
});
}
- Future, FlowyError>> getApps() {
+ Future, FlowyError>> getApps() {
final payload = WorkspaceIdPB.create()..value = workspaceId;
return FolderEventReadWorkspaceApps(payload).send().then((result) {
return result.fold(
diff --git a/frontend/appflowy_flutter/lib/workspace/presentation/home/home_screen.dart b/frontend/appflowy_flutter/lib/workspace/presentation/home/home_screen.dart
index 57ca5182aa..b35da5cf9a 100644
--- a/frontend/appflowy_flutter/lib/workspace/presentation/home/home_screen.dart
+++ b/frontend/appflowy_flutter/lib/workspace/presentation/home/home_screen.dart
@@ -10,7 +10,7 @@ import 'package:appflowy/workspace/presentation/home/hotkeys.dart';
import 'package:appflowy/workspace/presentation/widgets/edit_panel/panel_animation.dart';
import 'package:appflowy/workspace/presentation/widgets/float_bubble/question_bubble.dart';
import 'package:appflowy_backend/log.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/protobuf.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/protobuf.dart';
import 'package:appflowy_backend/protobuf/flowy-user/protobuf.dart'
show UserProfilePB;
import 'package:flowy_infra_ui/style_widget/container.dart';
@@ -261,10 +261,10 @@ class HomeScreenStackAdaptor extends HomeStackDelegate {
@override
void didDeleteStackWidget(ViewPB view, int? index) {
final homeService = HomeService();
- homeService.readApp(appId: view.appId).then((result) {
+ homeService.readApp(appId: view.parentViewId).then((result) {
result.fold(
- (appPB) {
- final List views = appPB.belongings.items;
+ (parentView) {
+ final List views = parentView.belongings;
if (views.isNotEmpty) {
var lastView = views.last;
if (index != null && index != 0 && views.length > index - 1) {
diff --git a/frontend/appflowy_flutter/lib/workspace/presentation/home/home_stack.dart b/frontend/appflowy_flutter/lib/workspace/presentation/home/home_stack.dart
index 6a5bc0e1d4..1511965942 100644
--- a/frontend/appflowy_flutter/lib/workspace/presentation/home/home_stack.dart
+++ b/frontend/appflowy_flutter/lib/workspace/presentation/home/home_stack.dart
@@ -5,7 +5,7 @@ import 'package:appflowy/startup/startup.dart';
import 'package:appflowy/workspace/presentation/home/home_sizes.dart';
import 'package:appflowy/workspace/presentation/home/navigation.dart';
import 'package:appflowy/workspace/presentation/home/toast.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:flowy_infra_ui/style_widget/extension.dart';
import 'package:flowy_infra_ui/widget/spacing.dart';
import 'package:flutter/material.dart';
@@ -199,7 +199,7 @@ class HomeTopBar extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
- color: Theme.of(context).colorScheme.surface,
+ color: Theme.of(context).colorScheme.onSecondaryContainer,
height: HomeSizes.topBarHeight,
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
diff --git a/frontend/appflowy_flutter/lib/workspace/presentation/home/menu/app/create_button.dart b/frontend/appflowy_flutter/lib/workspace/presentation/home/menu/app/create_button.dart
index d5584173bd..96e00499ee 100644
--- a/frontend/appflowy_flutter/lib/workspace/presentation/home/menu/app/create_button.dart
+++ b/frontend/appflowy_flutter/lib/workspace/presentation/home/menu/app/create_button.dart
@@ -18,9 +18,17 @@ class NewAppButton extends StatelessWidget {
LocaleKeys.newPageText.tr(),
fillColor: Colors.transparent,
hoverColor: Colors.transparent,
- fontColor: Theme.of(context).colorScheme.onSurfaceVariant,
+ fontColor: Theme.of(context).colorScheme.tertiary,
onPressed: () async => await _showCreateAppDialog(context),
- heading: svgWidget("home/new_app", size: const Size(16, 16)),
+ heading: Container(
+ width: 16,
+ height: 16,
+ decoration: BoxDecoration(
+ shape: BoxShape.circle,
+ color: Theme.of(context).colorScheme.surface,
+ ),
+ child: svgWidget("home/new_app"),
+ ),
padding: EdgeInsets.symmetric(horizontal: Insets.l, vertical: 20),
);
diff --git a/frontend/appflowy_flutter/lib/workspace/presentation/home/menu/app/header/add_button.dart b/frontend/appflowy_flutter/lib/workspace/presentation/home/menu/app/header/add_button.dart
index 351012bc38..2b55fd736d 100644
--- a/frontend/appflowy_flutter/lib/workspace/presentation/home/menu/app/header/add_button.dart
+++ b/frontend/appflowy_flutter/lib/workspace/presentation/home/menu/app/header/add_button.dart
@@ -6,9 +6,9 @@ import 'package:appflowy/workspace/presentation/widgets/pop_up_action.dart';
import 'package:appflowy_editor/appflowy_editor.dart' show Document;
import 'package:appflowy_popover/appflowy_popover.dart';
import 'package:flowy_infra/image.dart';
-import 'package:flowy_infra_ui/style_widget/icon_button.dart';
+import 'package:flowy_infra/theme_extension.dart';
+import 'package:flowy_infra_ui/style_widget/hover.dart';
import 'package:flutter/material.dart';
-import 'package:styled_widget/styled_widget.dart';
import 'package:appflowy/generated/locale_keys.g.dart';
import 'package:easy_localization/easy_localization.dart';
@@ -50,13 +50,19 @@ class AddButton extends StatelessWidget {
actions: actions,
offset: const Offset(0, 8),
buildChild: (controller) {
- return FlowyIconButton(
+ return SizedBox(
width: 22,
- onPressed: () => controller.show(),
- icon: svgWidget(
- "home/add",
- color: Theme.of(context).colorScheme.onSurface,
- ).padding(horizontal: 3, vertical: 3),
+ child: InkWell(
+ onTap: () => controller.show(),
+ child: FlowyHover(
+ style: HoverStyle(
+ hoverColor: AFThemeExtension.of(context).greySelect,
+ ),
+ builder: (context, onHover) => const FlowySvg(
+ name: 'home/add',
+ ),
+ ),
+ ),
);
},
onSelected: (action, controller) {
@@ -83,8 +89,7 @@ class AddButtonActionWrapper extends ActionCell {
AddButtonActionWrapper({required this.pluginBuilder});
@override
- Widget? leftIcon(Color iconColor) =>
- svgWidget(pluginBuilder.menuIcon, color: iconColor);
+ Widget? leftIcon(Color iconColor) => FlowySvg(name: pluginBuilder.menuIcon);
@override
String get name => pluginBuilder.menuName;
@@ -100,9 +105,8 @@ class ImportActionWrapper extends ActionCell {
});
@override
- Widget? leftIcon(Color iconColor) => svgWidget(
- 'editor/import',
- color: iconColor,
+ Widget? leftIcon(Color iconColor) => const FlowySvg(
+ name: 'editor/import',
);
@override
diff --git a/frontend/appflowy_flutter/lib/workspace/presentation/home/menu/app/header/header.dart b/frontend/appflowy_flutter/lib/workspace/presentation/home/menu/app/header/header.dart
index e94f7380ea..6137a49d7f 100644
--- a/frontend/appflowy_flutter/lib/workspace/presentation/home/menu/app/header/header.dart
+++ b/frontend/appflowy_flutter/lib/workspace/presentation/home/menu/app/header/header.dart
@@ -2,26 +2,24 @@ import 'dart:convert';
import 'package:appflowy/workspace/presentation/widgets/dialogs.dart';
import 'package:appflowy/workspace/presentation/widgets/pop_up_action.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:appflowy_popover/appflowy_popover.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:expandable/expandable.dart';
-import 'package:flowy_infra/theme_extension.dart';
import 'package:flowy_infra/icon_data.dart';
import 'package:flowy_infra_ui/style_widget/text.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/app.pb.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:appflowy/workspace/application/app/app_bloc.dart';
import 'package:styled_widget/styled_widget.dart';
import 'package:appflowy/generated/locale_keys.g.dart';
import 'package:flowy_infra/image.dart';
-import 'package:textstyle_extensions/textstyle_extensions.dart';
import '../menu_app.dart';
import 'add_button.dart';
class MenuAppHeader extends StatelessWidget {
- final AppPB app;
+ final ViewPB app;
const MenuAppHeader(
this.app, {
Key? key,
@@ -58,7 +56,7 @@ class MenuAppHeader extends StatelessWidget {
theme: ExpandableThemeData(
expandIcon: FlowyIconData.drop_down_show,
collapseIcon: FlowyIconData.drop_down_hide,
- iconColor: Theme.of(context).colorScheme.onSurface,
+ iconColor: Theme.of(context).colorScheme.tertiary,
iconSize: MenuAppSizes.iconSize,
iconPadding: const EdgeInsets.fromLTRB(0, 0, 10, 0),
hasIcon: false,
@@ -85,7 +83,7 @@ class MenuAppHeader extends StatelessWidget {
case AppDisclosureAction.rename:
NavigatorTextFieldDialog(
title: LocaleKeys.menuAppHeader_renameDialog.tr(),
- value: context.read().state.app.name,
+ value: context.read().state.view.name,
confirm: (newValue) {
context.read().add(AppEvent.rename(newValue));
},
@@ -104,7 +102,6 @@ class MenuAppHeader extends StatelessWidget {
Widget _renderCreateViewButton(BuildContext context) {
return Tooltip(
message: LocaleKeys.menuAppHeader_addPageTooltip.tr(),
- textStyle: AFThemeExtension.of(context).caption.textColor(Colors.white),
child: AddButton(
onSelected: (pluginBuilder, document) {
context.read().add(
@@ -139,9 +136,9 @@ extension AppDisclosureExtension on AppDisclosureAction {
Widget icon(Color iconColor) {
switch (this) {
case AppDisclosureAction.rename:
- return svgWidget('editor/edit', color: iconColor);
+ return const FlowySvg(name: 'editor/edit');
case AppDisclosureAction.delete:
- return svgWidget('editor/delete', color: iconColor);
+ return const FlowySvg(name: 'editor/delete');
}
}
}
@@ -169,11 +166,12 @@ class AppActionList extends StatelessWidget {
onSecondaryTap: () {
controller.show();
},
- child: BlocSelector(
- selector: (state) => state.app,
+ child: BlocSelector(
+ selector: (state) => state.view,
builder: (context, app) => FlowyText.medium(
app.name,
overflow: TextOverflow.ellipsis,
+ color: Theme.of(context).colorScheme.tertiary,
),
),
);
diff --git a/frontend/appflowy_flutter/lib/workspace/presentation/home/menu/app/header/import/import_panel.dart b/frontend/appflowy_flutter/lib/workspace/presentation/home/menu/app/header/import/import_panel.dart
index 0250f443d0..540e0d8b1d 100644
--- a/frontend/appflowy_flutter/lib/workspace/presentation/home/menu/app/header/import/import_panel.dart
+++ b/frontend/appflowy_flutter/lib/workspace/presentation/home/menu/app/header/import/import_panel.dart
@@ -24,6 +24,7 @@ Future showImportPanel(
title: FlowyText.semibold(
LocaleKeys.moreAction_import.tr(),
fontSize: 20,
+ color: Theme.of(context).colorScheme.tertiary,
),
content: _ImportPanel(importCallback: callback),
contentPadding: const EdgeInsets.symmetric(
@@ -44,7 +45,7 @@ enum _ImportType {
case _ImportType.markdownOrText:
return 'Text & Markdown';
default:
- assert(false, 'Unsupported Type ${this}');
+ assert(false, 'Unsupported Type $this');
return '';
}
}
@@ -54,7 +55,7 @@ enum _ImportType {
case _ImportType.markdownOrText:
return svgWidget('editor/documents');
default:
- assert(false, 'Unsupported Type ${this}');
+ assert(false, 'Unsupported Type $this');
return null;
}
}
@@ -64,7 +65,7 @@ enum _ImportType {
case _ImportType.markdownOrText:
return ['md', 'txt'];
default:
- assert(false, 'Unsupported Type ${this}');
+ assert(false, 'Unsupported Type $this');
return [];
}
}
diff --git a/frontend/appflowy_flutter/lib/workspace/presentation/home/menu/app/menu_app.dart b/frontend/appflowy_flutter/lib/workspace/presentation/home/menu/app/menu_app.dart
index 653f67fa5a..cf48af34fe 100644
--- a/frontend/appflowy_flutter/lib/workspace/presentation/home/menu/app/menu_app.dart
+++ b/frontend/appflowy_flutter/lib/workspace/presentation/home/menu/app/menu_app.dart
@@ -1,6 +1,6 @@
import 'package:appflowy/workspace/presentation/home/menu/menu.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:expandable/expandable.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/app.pb.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:appflowy/startup/startup.dart';
@@ -9,8 +9,8 @@ import 'package:provider/provider.dart';
import 'section/section.dart';
class MenuApp extends StatefulWidget {
- final AppPB app;
- const MenuApp(this.app, {Key? key}) : super(key: key);
+ final ViewPB view;
+ const MenuApp(this.view, {Key? key}) : super(key: key);
@override
State createState() => _MenuAppState();
@@ -21,7 +21,7 @@ class _MenuAppState extends State {
@override
void initState() {
- viewDataContext = AppViewDataContext(appId: widget.app.id);
+ viewDataContext = AppViewDataContext(viewId: widget.view.id);
super.initState();
}
@@ -31,7 +31,7 @@ class _MenuAppState extends State {
providers: [
BlocProvider(
create: (context) {
- final appBloc = getIt(param1: widget.app);
+ final appBloc = AppBloc(view: widget.view);
appBloc.add(const AppEvent.initial());
return appBloc;
},
@@ -86,7 +86,7 @@ class _MenuAppState extends State {
iconPadding: EdgeInsets.zero,
hasIcon: false,
),
- header: MenuAppHeader(widget.app),
+ header: MenuAppHeader(widget.view),
expanded: ViewSection(appViewData: viewDataContext),
collapsed: const SizedBox(),
),
diff --git a/frontend/appflowy_flutter/lib/workspace/presentation/home/menu/app/section/item.dart b/frontend/appflowy_flutter/lib/workspace/presentation/home/menu/app/section/item.dart
index f261a946a9..bbe1e607f6 100644
--- a/frontend/appflowy_flutter/lib/workspace/presentation/home/menu/app/section/item.dart
+++ b/frontend/appflowy_flutter/lib/workspace/presentation/home/menu/app/section/item.dart
@@ -4,11 +4,10 @@ import 'package:appflowy/workspace/application/view/view_ext.dart';
import 'package:appflowy/workspace/presentation/home/menu/menu.dart';
import 'package:appflowy/workspace/presentation/widgets/dialogs.dart';
import 'package:easy_localization/easy_localization.dart';
-import 'package:flowy_infra/theme_extension.dart';
import 'package:flowy_infra_ui/style_widget/hover.dart';
import 'package:flowy_infra_ui/style_widget/text.dart';
import 'package:flowy_infra_ui/widget/spacing.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:styled_widget/styled_widget.dart';
@@ -51,7 +50,7 @@ class ViewSectionItem extends StatelessWidget {
onTap: () => onSelected(blocContext.read().state.view),
child: FlowyHover(
style: HoverStyle(
- hoverColor: AFThemeExtension.of(context).greySelect,
+ hoverColor: Theme.of(context).colorScheme.secondary,
),
// If current state.isEditing is true, the hover should not
// rebuild when onEnter/onExit events happened.
@@ -60,7 +59,6 @@ class ViewSectionItem extends StatelessWidget {
blocContext,
onHover,
state,
- Theme.of(context).colorScheme.onSurface,
),
isSelected: () => state.isEditing || isSelected,
),
@@ -75,13 +73,12 @@ class ViewSectionItem extends StatelessWidget {
BuildContext blocContext,
bool onHover,
ViewState state,
- Color iconColor,
) {
List children = [
SizedBox(
width: 16,
height: 16,
- child: state.view.renderThumbnail(iconColor: iconColor),
+ child: state.view.renderThumbnail(),
),
const HSpace(2),
Expanded(
@@ -154,11 +151,11 @@ extension ViewDisclosureExtension on ViewDisclosureAction {
Widget icon(Color iconColor) {
switch (this) {
case ViewDisclosureAction.rename:
- return svgWidget('editor/edit', color: iconColor);
+ return const FlowySvg(name: 'editor/edit');
case ViewDisclosureAction.delete:
- return svgWidget('editor/delete', color: iconColor);
+ return const FlowySvg(name: 'editor/delete');
case ViewDisclosureAction.duplicate:
- return svgWidget('editor/copy', color: iconColor);
+ return const FlowySvg(name: 'editor/copy');
}
}
}
@@ -186,7 +183,7 @@ class ViewDisclosureButton extends StatelessWidget {
width: 26,
icon: svgWidget(
"editor/details",
- color: Theme.of(context).colorScheme.onSurface,
+ color: Theme.of(context).iconTheme.color,
),
onPressed: () {
onEdit(true);
diff --git a/frontend/appflowy_flutter/lib/workspace/presentation/home/menu/menu.dart b/frontend/appflowy_flutter/lib/workspace/presentation/home/menu/menu.dart
index 92f5f4621b..b0be6b6be2 100644
--- a/frontend/appflowy_flutter/lib/workspace/presentation/home/menu/menu.dart
+++ b/frontend/appflowy_flutter/lib/workspace/presentation/home/menu/menu.dart
@@ -8,8 +8,8 @@ import 'package:appflowy/workspace/application/home/home_setting_bloc.dart';
import 'package:appflowy/workspace/application/menu/menu_bloc.dart';
import 'package:appflowy/workspace/presentation/home/home_sizes.dart';
import 'package:appflowy/workspace/presentation/home/home_stack.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart';
-import 'package:appflowy_backend/protobuf/flowy-folder/workspace.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
+import 'package:appflowy_backend/protobuf/flowy-folder2/workspace.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-user/protobuf.dart'
show UserProfilePB;
import 'package:easy_localization/easy_localization.dart';
@@ -112,7 +112,7 @@ class HomeMenu extends StatelessWidget {
child: ScrollConfiguration(
behavior: const ScrollBehavior().copyWith(scrollbars: false),
child: BlocSelector>(
- selector: (state) => state.apps
+ selector: (state) => state.views
.map((app) => MenuApp(app, key: ValueKey(app.id)))
.toList(),
builder: (context, menuItems) {
@@ -229,7 +229,7 @@ class MenuTopBar extends StatelessWidget {
iconPadding: const EdgeInsets.fromLTRB(4, 4, 4, 4),
icon: svgWidget(
"home/hide_menu",
- color: Theme.of(context).colorScheme.onSurface,
+ color: Theme.of(context).iconTheme.color,
),
),
)
diff --git a/frontend/appflowy_flutter/lib/workspace/presentation/home/menu/menu_user.dart b/frontend/appflowy_flutter/lib/workspace/presentation/home/menu/menu_user.dart
index 21cc90a04e..236dd60479 100644
--- a/frontend/appflowy_flutter/lib/workspace/presentation/home/menu/menu_user.dart
+++ b/frontend/appflowy_flutter/lib/workspace/presentation/home/menu/menu_user.dart
@@ -2,7 +2,6 @@ import 'package:appflowy/startup/startup.dart';
import 'package:appflowy/workspace/application/menu/menu_user_bloc.dart';
import 'package:appflowy/workspace/presentation/settings/settings_dialog.dart';
import 'package:appflowy/workspace/presentation/settings/widgets/settings_user_view.dart';
-import 'package:flowy_infra/theme_extension.dart';
import 'package:flowy_infra/image.dart';
import 'package:flowy_infra/size.dart';
import 'package:flowy_infra_ui/style_widget/text.dart';
@@ -13,7 +12,6 @@ import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:appflowy/generated/locale_keys.g.dart';
import 'package:easy_localization/easy_localization.dart';
-import 'package:textstyle_extensions/textstyle_extensions.dart';
class MenuUser extends StatelessWidget {
final UserProfilePB user;
@@ -69,6 +67,7 @@ class MenuUser extends StatelessWidget {
return FlowyText.medium(
name,
overflow: TextOverflow.ellipsis,
+ color: Theme.of(context).colorScheme.tertiary,
);
}
@@ -76,7 +75,6 @@ class MenuUser extends StatelessWidget {
final userProfile = context.read().state.userProfile;
return Tooltip(
message: LocaleKeys.settings_menu_open.tr(),
- textStyle: AFThemeExtension.of(context).caption.textColor(Colors.white),
child: IconButton(
onPressed: () {
showDialog(
@@ -90,7 +88,7 @@ class MenuUser extends StatelessWidget {
dimension: 20,
child: svgWidget(
"home/settings",
- color: Theme.of(context).colorScheme.onSurface,
+ color: Theme.of(context).colorScheme.tertiary,
),
),
),
diff --git a/frontend/appflowy_flutter/lib/workspace/presentation/home/navigation.dart b/frontend/appflowy_flutter/lib/workspace/presentation/home/navigation.dart
index f1818fc162..8fcc3b2f19 100644
--- a/frontend/appflowy_flutter/lib/workspace/presentation/home/navigation.dart
+++ b/frontend/appflowy_flutter/lib/workspace/presentation/home/navigation.dart
@@ -6,14 +6,12 @@ import 'package:appflowy/workspace/presentation/home/home_stack.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flowy_infra/image.dart';
import 'package:flowy_infra/size.dart';
-import 'package:flowy_infra/theme_extension.dart';
import 'package:flowy_infra_ui/style_widget/icon_button.dart';
import 'package:flowy_infra_ui/style_widget/text.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:provider/provider.dart';
import 'package:styled_widget/styled_widget.dart';
-import 'package:textstyle_extensions/textstyle_extensions.dart';
typedef NaviAction = void Function();
@@ -87,7 +85,7 @@ class FlowyNavigation extends StatelessWidget {
iconPadding: const EdgeInsets.fromLTRB(2, 2, 2, 2),
icon: svgWidget(
"home/hide_menu",
- color: Theme.of(context).colorScheme.onSurface,
+ color: Theme.of(context).iconTheme.color,
),
)),
);
@@ -180,11 +178,9 @@ TextSpan sidebarTooltipTextSpan(BuildContext context, String hintText) =>
children: [
TextSpan(
text: "$hintText\n",
- style: AFThemeExtension.of(context).callout.textColor(Colors.white),
),
TextSpan(
text: Platform.isMacOS ? "⌘+\\" : "Ctrl+\\",
- style: AFThemeExtension.of(context).caption.textColor(Colors.white60),
),
],
);
diff --git a/frontend/appflowy_flutter/lib/workspace/presentation/settings/settings_dialog.dart b/frontend/appflowy_flutter/lib/workspace/presentation/settings/settings_dialog.dart
index 6f89f77a37..09e719c2e4 100644
--- a/frontend/appflowy_flutter/lib/workspace/presentation/settings/settings_dialog.dart
+++ b/frontend/appflowy_flutter/lib/workspace/presentation/settings/settings_dialog.dart
@@ -12,6 +12,9 @@ import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
+const _dialogHorizontalPadding = EdgeInsets.symmetric(horizontal: 12);
+const _contentInsetPadding = EdgeInsets.fromLTRB(0.0, 12.0, 0.0, 16.0);
+
class SettingsDialog extends StatelessWidget {
final UserProfilePB user;
SettingsDialog(this.user, {Key? key}) : super(key: ValueKey(user.id));
@@ -23,34 +26,49 @@ class SettingsDialog extends StatelessWidget {
..add(const SettingsDialogEvent.initial()),
child: BlocBuilder(
builder: (context, state) => FlowyDialog(
- title: FlowyText(
- LocaleKeys.settings_title.tr(),
- fontSize: 20,
- fontWeight: FontWeight.w700,
+ title: Padding(
+ padding: _dialogHorizontalPadding + _contentInsetPadding,
+ child: FlowyText(
+ LocaleKeys.settings_title.tr(),
+ fontSize: 20,
+ fontWeight: FontWeight.w700,
+ color: Theme.of(context).colorScheme.tertiary,
+ ),
),
- child: Row(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- SizedBox(
- width: 200,
- child: SettingsMenu(
- changeSelectedPage: (index) {
- context
- .read()
- .add(SettingsDialogEvent.setSelectedPage(index));
- },
- currentPage: context.read().state.page,
+ child: ScaffoldMessenger(
+ child: Scaffold(
+ backgroundColor: Colors.transparent,
+ body: Padding(
+ padding: _dialogHorizontalPadding,
+ child: Row(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ SizedBox(
+ width: 200,
+ child: SettingsMenu(
+ changeSelectedPage: (index) {
+ context
+ .read()
+ .add(SettingsDialogEvent.setSelectedPage(index));
+ },
+ currentPage:
+ context.read().state.page,
+ ),
+ ),
+ VerticalDivider(
+ color: Theme.of(context).dividerColor,
+ ),
+ const SizedBox(width: 10),
+ Expanded(
+ child: getSettingsView(
+ context.read().state.page,
+ context.read().state.userProfile,
+ ),
+ )
+ ],
),
),
- const VerticalDivider(),
- const SizedBox(width: 10),
- Expanded(
- child: getSettingsView(
- context.read