From 01246135257b42d3509558cafaa9ea3fa2ed05eb Mon Sep 17 00:00:00 2001 From: Sandra Hoang Date: Wed, 6 Mar 2024 12:40:08 -0500 Subject: [PATCH 01/10] Adding veda v2 refactor content --- ...a-v2-refactor-adr-dataprovider-diagram.png | Bin 0 -> 81826 bytes docs/adr/veda-v2-refactor.md | 129 ++++++++++++++++++ 2 files changed, 129 insertions(+) create mode 100644 docs/adr/diagrams/veda-v2-refactor-adr-dataprovider-diagram.png create mode 100644 docs/adr/veda-v2-refactor.md diff --git a/docs/adr/diagrams/veda-v2-refactor-adr-dataprovider-diagram.png b/docs/adr/diagrams/veda-v2-refactor-adr-dataprovider-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..196a24ee05901bf49c82cc0aac09512e523a8329 GIT binary patch literal 81826 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 **Integrating with [stac-react](https://github.com/developmentseed/stac-react/tree/main)**: Because these React hooks manage data fetching to the STAC API using the Context API provider pattern, this could just be used directly as it is already its own data layer. We would have to decide where we wrap the Provider though. Ideally, at the instance level, we would wrap the provider at the highest level in the tree either around the router or specific view containers and then consume these hooks down the hierarchy on the instance side. The components in the core ui library would be prop driven so this way they can be truly data agnostic and accept whatever data passed in. + +*Architectural Diagram of the Refactor* +![Architectural Diagram](./diagrams/veda-v2-refactor-adr-dataprovider-diagram.png) + +TODO-LEFT-OFF-FROM-HERE-SANDRA +### Positive Consequences + +- Minimal changes +- Quick implementation cycle + +### Negative Consequences + +- Problems pertaining to the implementation of content authoring flows and WYSIWYG elements will remain as they currently are. [^1] + +## Pros and Cons of the Options + +### [1] Maintain current architecture + +Extract a search index from MDX files' frontmatter at build time. Through the use of custom plugins create all the needed content relationships + +- 💚 Keep the existing architecture +- 💚 Minimal changes needed +- 💚 Maintain instance replicability [^2] +- 🚩 Search is limited by the (potentially exponential) size of the index. This issue forces us to limit search capabilities to some properties of the frontmatter (title, description, etc) +- 🚩 Can be tricky to build a plugin to extract content relationships from the MDX content. +- 🚩 Limits future possibilities of building a content authoring system [^1] + +### [2] CMS + +Move all the content to a headless CMS. Rearchitecture the frontend to fetch content from the CMS' endpoint. + +- 💚 Simplify content relationships. +- 💚 Powerful search +- 💚 Ground work for any CMS type features (authoring workflows, WYSIWYG elements) +- 🚩 Huge undertaking as it would require a complete new system and content migration. +- 🚩 Dedicated team for the backend. +- 🚩 Given the very custom nature of the project the different WYSIWYG elements would likely need to be custom built. +- 🚩 Harder instance replicability [^2] + +### [3] Hybrid + +Sync all MDX data with a 3rd party service as a CI step (E.g. Elastic Search), then use said service search capabilities endpoint. This basically build on top of _Maintain current architecture_ solution + +- 💚 Keep the existing architecture. +- 💚 Very powerful search. +- 💚 Would support [faceted search](https://github.com/NASA-IMPACT/veda-architecture/issues/162#issuecomment-1387647740) +- 🚩 Can be tricky to build a plugin to extract content relationships from the MDX content. +- 🚩 Limits future possibilities of building a content authoring system [^1] +- 🚩 Harder instance replicability [^2] + +### [4] Veda Datastore + +Use the VEDA datastore as the source-of-truth for search rather than the MDX content. + +- 🚩 Needs to rearchitecure the frontend. +- 🚩 Since the data in the datastore and the data in veda-config have pretty different structures, this would lead to information mismatch and potentially the need to update multiple content configurations at the same time. +- 🚩 Harder instance replicability [^2] + +_Could be revisited in the future if all the data is moved to the datastore, resolving the duplication issue_ + +[^1]: A content authoring could still be custom built to output the content into files, instead of a database. An inspiration for this could be the Netlify CMS, currently being used as a prototype. _A complete editor to power this content system should be considered almost a separate project._ + +[^2]: The current architecture was setup to allow new instances of VEDA to be created easily. The architecture relies on 2 repos: `veda-config` and `veda-ui`. The config repo holds all the content and needed settings, while the ui repo holds the app code. Users need only to fork the config repo and add their own content/change the settings, being able to update the underlying ui module when new features are released. +_Recent research tells us that this functionality may not be as needed as it was originaly thought, but it is something to take into consideration._ From 250f49ce11ff600d45310938a09a18ab586f8900 Mon Sep 17 00:00:00 2001 From: Sandra Hoang Date: Wed, 6 Mar 2024 14:11:08 -0500 Subject: [PATCH 02/10] Finish adding content to ADR --- docs/adr/veda-v2-refactor.md | 83 +++++++++++------------------------- 1 file changed, 26 insertions(+), 57 deletions(-) diff --git a/docs/adr/veda-v2-refactor.md b/docs/adr/veda-v2-refactor.md index ebf14a757..a697ab0a9 100644 --- a/docs/adr/veda-v2-refactor.md +++ b/docs/adr/veda-v2-refactor.md @@ -54,76 +54,45 @@ We also need to take into account that the evolution of the application with new Move more control to the instance level, modularize the core ui library to expose core feature components and smaller reusable components, and create a data layer as part of the core ui library that is ideally also consumed at the instance level that manages data fetching and MDX parsing so that components are data agnostic. Introduce a new design system that is well-maintained and community-backed to create standardization across styles and accessibility patterns. -### 1. Move Routing from the core ui library to the instance level +#### 1. Move Routing from the core ui library to the instance level Routing and what pages exist should be determined at the instance level. Currently, routing is handled at the core UI library level so supporting additional/removal of pages requires override logic. Moving this to the instance level allows developers/stakeholders to independently manage their routes and pages. -### 2. Feature components in the core ui library composed at the instance level +#### 2. Feature components in the core ui library composed at the instance level Currently, the core UI library handles the composition of each page because of its control over routing. However, pages and what they render should shift to the instance level so developers/stakeholders can control what is rendered within each page view. The core UI library should expose feature components (containers) that deliver a core feature in the VEDA dashboard such as the A&E feature. -### 3. Modularize and create smaller reusable components +#### 3. Modularize and create smaller reusable components The core UI library should also expose smaller reusable components like date pickers, form elements, analysis tools, etc… (“presentational/dumb” components). This way developers/stakeholders for example can compose a page view with the A&E feature from the core UI library and consume other reusable components to construct their page view. This also now allows developers to build their own custom components on the instance side and directly incorporate them. -### 4. Create a data layer that manages all data fetching +#### 4. Create a Data layer that manages all data fetching The proposed data layer is designed to handle all data fetching, including STAC calls, and MDX parsing. Think of it as a versatile data utilities library. Introducing this layer would enable components in the core UI library to remain data-agnostic. In the event of scaling to additional or different data sources, expansion can be easily accomplished by integrating them into this centralized layer. Smart components (larger and stateful) would then efficiently consume this data layer. > **Integrating with [stac-react](https://github.com/developmentseed/stac-react/tree/main)**: Because these React hooks manage data fetching to the STAC API using the Context API provider pattern, this could just be used directly as it is already its own data layer. We would have to decide where we wrap the Provider though. Ideally, at the instance level, we would wrap the provider at the highest level in the tree either around the router or specific view containers and then consume these hooks down the hierarchy on the instance side. The components in the core ui library would be prop driven so this way they can be truly data agnostic and accept whatever data passed in. +#### 5. Introduce a new Design System +a. Replace the existing custom design system with a well-maintained, widely adopted community-supported design system. This ensures built-in accessibility standards and eliminates the need for designers and developers to invest time in ongoing maintenance. -*Architectural Diagram of the Refactor* -![Architectural Diagram](./diagrams/veda-v2-refactor-adr-dataprovider-diagram.png) - -TODO-LEFT-OFF-FROM-HERE-SANDRA -### Positive Consequences - -- Minimal changes -- Quick implementation cycle - -### Negative Consequences - -- Problems pertaining to the implementation of content authoring flows and WYSIWYG elements will remain as they currently are. [^1] - -## Pros and Cons of the Options -### [1] Maintain current architecture -Extract a search index from MDX files' frontmatter at build time. Through the use of custom plugins create all the needed content relationships +b. The preliminary systems we are considering are: +* Chakra UI. Built on React, it has a large component library, built-in accessibility and theming options. It is designed with responsive and mobile-first principles and has a strong community and documentation. +* The U.S. Web Design System (USWDS) is tailored for government projects. It's designed to meet the specific needs of U.S. federal websites, offering components that are accessible, secure, and in line with U.S. digital standards. -- 💚 Keep the existing architecture -- 💚 Minimal changes needed -- 💚 Maintain instance replicability [^2] -- 🚩 Search is limited by the (potentially exponential) size of the index. This issue forces us to limit search capabilities to some properties of the frontmatter (title, description, etc) -- 🚩 Can be tricky to build a plugin to extract content relationships from the MDX content. -- 🚩 Limits future possibilities of building a content authoring system [^1] -### [2] CMS -Move all the content to a headless CMS. Rearchitecture the frontend to fetch content from the CMS' endpoint. +c. Any option we choose will have to be extended for data visualization components (charts, maps, widgets, etc.) and themed for the 3 current VEDA instances: VEDA Dashboard, U.S. GHG Center, Earth.gov. -- 💚 Simplify content relationships. -- 💚 Powerful search -- 💚 Ground work for any CMS type features (authoring workflows, WYSIWYG elements) -- 🚩 Huge undertaking as it would require a complete new system and content migration. -- 🚩 Dedicated team for the backend. -- 🚩 Given the very custom nature of the project the different WYSIWYG elements would likely need to be custom built. -- 🚩 Harder instance replicability [^2] - -### [3] Hybrid - -Sync all MDX data with a 3rd party service as a CI step (E.g. Elastic Search), then use said service search capabilities endpoint. This basically build on top of _Maintain current architecture_ solution - -- 💚 Keep the existing architecture. -- 💚 Very powerful search. -- 💚 Would support [faceted search](https://github.com/NASA-IMPACT/veda-architecture/issues/162#issuecomment-1387647740) -- 🚩 Can be tricky to build a plugin to extract content relationships from the MDX content. -- 🚩 Limits future possibilities of building a content authoring system [^1] -- 🚩 Harder instance replicability [^2] - -### [4] Veda Datastore - -Use the VEDA datastore as the source-of-truth for search rather than the MDX content. +*Architectural Diagram of the Refactor* +![Architectural Diagram](./diagrams/veda-v2-refactor-adr-dataprovider-diagram.png) -- 🚩 Needs to rearchitecure the frontend. -- 🚩 Since the data in the datastore and the data in veda-config have pretty different structures, this would lead to information mismatch and potentially the need to update multiple content configurations at the same time. -- 🚩 Harder instance replicability [^2] +*[Miro Board Link](https://miro.com/app/board/uXjVN6lkBnc=/?share_link_id=85040810316) which documents team's brainstorming discussions, options considered, technical trade-offs, and final proposed solution in detail* -_Could be revisited in the future if all the data is moved to the datastore, resolving the duplication issue_ +### Value +#### Product POV +This refactor will enhance efficiency of delivering new instances and modifying page views without directly impacting the core UI logic library. It will also facilitate seamless support for a wider range of data integrations. +#### Developer POV +This refactor will allow developers to move faster by removing specific domain knowledge on very custom dependencies. It will also ideally be easier to make customizations without limitations around overriding pages and components. Spinning up a new instance and making modifications to page views would now be easier with routing and composability moving to the instance level. This will also allow different data integrations to be easily added without having to touch core components. -[^1]: A content authoring could still be custom built to output the content into files, instead of a database. An inspiration for this could be the Netlify CMS, currently being used as a prototype. _A complete editor to power this content system should be considered almost a separate project._ +### Consequences +* While the new architecture may demand deeper coding knowledge to set up a new instance, this complexity is offset by the fact that making overrides in the current architecture is equally developer-intensive. Additionally, we plan to establish a template instance that is easily cloneable for a quick start when spinning up new instances. +* There may be unforeseen blockers during the refactoring which have not been outlined. This may add to the complexity and spur more discussions on how to handle these blockers. -[^2]: The current architecture was setup to allow new instances of VEDA to be created easily. The architecture relies on 2 repos: `veda-config` and `veda-ui`. The config repo holds all the content and needed settings, while the ui repo holds the app code. Users need only to fork the config repo and add their own content/change the settings, being able to update the underlying ui module when new features are released. -_Recent research tells us that this functionality may not be as needed as it was originaly thought, but it is something to take into consideration._ +## Resources +* [Github Issue to gather strategic questions related to future of VEDA UI](https://github.com/NASA-IMPACT/veda-ui/issues/766) +* [Refactoring vs Rewrite article](https://methodpoet.com/refactoring-vs-rewrite/) +* [Team Brainstorming session for VEDA V2 Refactor Miro Board](https://miro.com/app/board/uXjVN6lkBnc=/?share_link_id=238172590342) +* [Stac-react Repo](https://github.com/developmentseed/stac-react) \ No newline at end of file From dfdfa64b12b968559a06e98c61c2fd345dfe69cd Mon Sep 17 00:00:00 2001 From: Sandra Hoang Date: Wed, 6 Mar 2024 14:16:09 -0500 Subject: [PATCH 03/10] Make updates --- docs/adr/veda-v2-refactor.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/adr/veda-v2-refactor.md b/docs/adr/veda-v2-refactor.md index a697ab0a9..a5ec18881 100644 --- a/docs/adr/veda-v2-refactor.md +++ b/docs/adr/veda-v2-refactor.md @@ -1,4 +1,4 @@ -# Dashboard V1 (Catalog exploration) architecture +# VEDA V2 Refactor ADR * Status: **In Review**, In Progress, Done * Authors: @j08lue, @sandrahoang686, @faustoperez @@ -76,7 +76,7 @@ b. The preliminary systems we are considering are: c. Any option we choose will have to be extended for data visualization components (charts, maps, widgets, etc.) and themed for the 3 current VEDA instances: VEDA Dashboard, U.S. GHG Center, Earth.gov. -*Architectural Diagram of the Refactor* +**Architectural Diagram of the Refactor** ![Architectural Diagram](./diagrams/veda-v2-refactor-adr-dataprovider-diagram.png) *[Miro Board Link](https://miro.com/app/board/uXjVN6lkBnc=/?share_link_id=85040810316) which documents team's brainstorming discussions, options considered, technical trade-offs, and final proposed solution in detail* From 7bc1178ce9a850240d2fd7753eab49eac107638a Mon Sep 17 00:00:00 2001 From: Jonas Date: Thu, 7 Mar 2024 15:24:44 +0100 Subject: [PATCH 04/10] Finish sentence --- docs/adr/veda-v2-refactor.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/adr/veda-v2-refactor.md b/docs/adr/veda-v2-refactor.md index a5ec18881..681cf263e 100644 --- a/docs/adr/veda-v2-refactor.md +++ b/docs/adr/veda-v2-refactor.md @@ -22,7 +22,7 @@ We are expecting new instances to start using VEDA in 2024. Implementing these additional customizations proved to be cumbersome with the current application structure, because they require page overrides and new customization options across the application, which grew fast in complexity. ### Challenge 2: Dependency injection -The separation of application and content is currently done via Git submodules: the VEDA UI library source tree is injected into a Configuration project and then they are built together. This works and is lightweight, but is not a very common pattern which new contributors to the project need to +The separation of application and content is currently done via Git submodules: the VEDA UI library source tree is injected into a Configuration project and then they are built together. This works and is lightweight, but is not a very common pattern which is an obstacle for new contributors to the project and new instances. ### Challenge 3: Unmaintained design system VEDA UI currently uses a design system developed by DevSeed, which is not well maintained anymore. While being a great choice to get the application started, it now shows its shortcomings: It is not optimized for accessibility, which has become a more central requirement, and it misses many standard UI components that larger community design systems include. From 971cd3a994a4111339cb43191d18c7738b4fbd4d Mon Sep 17 00:00:00 2001 From: Jonas Date: Mon, 11 Mar 2024 16:28:40 +0100 Subject: [PATCH 05/10] Merge value section into pros and cons --- ...ation-architecture-for-configurability.md} | 61 ++++++++++++------- 1 file changed, 40 insertions(+), 21 deletions(-) rename docs/adr/{veda-v2-refactor.md => 002-application-architecture-for-configurability.md} (62%) diff --git a/docs/adr/veda-v2-refactor.md b/docs/adr/002-application-architecture-for-configurability.md similarity index 62% rename from docs/adr/veda-v2-refactor.md rename to docs/adr/002-application-architecture-for-configurability.md index 681cf263e..58e3d1a42 100644 --- a/docs/adr/veda-v2-refactor.md +++ b/docs/adr/002-application-architecture-for-configurability.md @@ -1,4 +1,4 @@ -# VEDA V2 Refactor ADR +# Application Architecture for Configurability * Status: **In Review**, In Progress, Done * Authors: @j08lue, @sandrahoang686, @faustoperez @@ -7,7 +7,7 @@ ## Context and Problem Statement -VEDA UI 1.0 was built as a reusable white-label application - easy for independent science data and information projects to stand up and configure their own instance with their content. The assumption was that projects would reuse the entire application and change mostly the styling and scalable content items such as datasets and stories, and would only need to change a few other elements. The application (pages, functional components; VEDA UI) is separate from content (VEDA config) and pages and elements can be changed via component overrides. +VEDA UI 1.0 was built as a reusable white-label application for independent science data and information projects. These projects should be able to stand up and configure their own instance with their content. The assumption was that projects would reuse the entire application and change mostly the styling and scalable content items such as datasets and stories, and would only need to change a few other elements. The application (pages, functional components; VEDA UI) is separate from content (VEDA config) and pages and elements can be changed via component overrides. In 2023, our team supported two new projects to integrate VEDA UI for their needs: the U.S. Greenhouse Gas Center (earth.gov/ghgcenter) and the Earth Information Center (EIC; earth.gov). These projects had much wider needs for customization or adaptation, mostly related to the context of the project: 1. Different thematic categorization of content with hierarchies or tags @@ -37,7 +37,7 @@ We also need to take into account that the evolution of the application with new - Investment payoff - Compatibility with continued support for instances with feature evolution -- Developer velocity +- Improve developer velocity - Ease of support for required customizations @@ -45,34 +45,34 @@ We also need to take into account that the evolution of the application with new - [1] Continue with current application architecture + design system - [2] Continue with current application architecture + replace design system -- [3] Refactor component library + replace design system + Rearchitect -- [4] Rewrite component library + replace design system + Rearchitect +- [3] Refactor component library + replace design system + rearchitect +- [4] Rewrite component library + replace design system + rearchitect ## Decision Outcome -- ✔️[3] Refactor component library + replace design system + Rearchitect +- ✔️[3] Refactor component library + replace design system + rearchitect Move more control to the instance level, modularize the core ui library to expose core feature components and smaller reusable components, and create a data layer as part of the core ui library that is ideally also consumed at the instance level that manages data fetching and MDX parsing so that components are data agnostic. Introduce a new design system that is well-maintained and community-backed to create standardization across styles and accessibility patterns. #### 1. Move Routing from the core ui library to the instance level Routing and what pages exist should be determined at the instance level. Currently, routing is handled at the core UI library level so supporting additional/removal of pages requires override logic. Moving this to the instance level allows developers/stakeholders to independently manage their routes and pages. + #### 2. Feature components in the core ui library composed at the instance level Currently, the core UI library handles the composition of each page because of its control over routing. However, pages and what they render should shift to the instance level so developers/stakeholders can control what is rendered within each page view. The core UI library should expose feature components (containers) that deliver a core feature in the VEDA dashboard such as the A&E feature. + #### 3. Modularize and create smaller reusable components The core UI library should also expose smaller reusable components like date pickers, form elements, analysis tools, etc… (“presentational/dumb” components). This way developers/stakeholders for example can compose a page view with the A&E feature from the core UI library and consume other reusable components to construct their page view. This also now allows developers to build their own custom components on the instance side and directly incorporate them. + #### 4. Create a Data layer that manages all data fetching The proposed data layer is designed to handle all data fetching, including STAC calls, and MDX parsing. Think of it as a versatile data utilities library. Introducing this layer would enable components in the core UI library to remain data-agnostic. In the event of scaling to additional or different data sources, expansion can be easily accomplished by integrating them into this centralized layer. Smart components (larger and stateful) would then efficiently consume this data layer. > **Integrating with [stac-react](https://github.com/developmentseed/stac-react/tree/main)**: Because these React hooks manage data fetching to the STAC API using the Context API provider pattern, this could just be used directly as it is already its own data layer. We would have to decide where we wrap the Provider though. Ideally, at the instance level, we would wrap the provider at the highest level in the tree either around the router or specific view containers and then consume these hooks down the hierarchy on the instance side. The components in the core ui library would be prop driven so this way they can be truly data agnostic and accept whatever data passed in. + #### 5. Introduce a new Design System a. Replace the existing custom design system with a well-maintained, widely adopted community-supported design system. This ensures built-in accessibility standards and eliminates the need for designers and developers to invest time in ongoing maintenance. - - b. The preliminary systems we are considering are: -* Chakra UI. Built on React, it has a large component library, built-in accessibility and theming options. It is designed with responsive and mobile-first principles and has a strong community and documentation. -* The U.S. Web Design System (USWDS) is tailored for government projects. It's designed to meet the specific needs of U.S. federal websites, offering components that are accessible, secure, and in line with U.S. digital standards. - - + * Chakra UI. Built on React, it has a large component library, built-in accessibility and theming options. It is designed with responsive and mobile-first principles and has a strong community and documentation. + * The U.S. Web Design System (USWDS) is tailored for government projects. It's designed to meet the specific needs of U.S. federal websites, offering components that are accessible, secure, and in line with U.S. digital standards. c. Any option we choose will have to be extended for data visualization components (charts, maps, widgets, etc.) and themed for the 3 current VEDA instances: VEDA Dashboard, U.S. GHG Center, Earth.gov. @@ -81,18 +81,37 @@ c. Any option we choose will have to be extended for data visualization componen *[Miro Board Link](https://miro.com/app/board/uXjVN6lkBnc=/?share_link_id=85040810316) which documents team's brainstorming discussions, options considered, technical trade-offs, and final proposed solution in detail* -### Value -#### Product POV -This refactor will enhance efficiency of delivering new instances and modifying page views without directly impacting the core UI logic library. It will also facilitate seamless support for a wider range of data integrations. -#### Developer POV -This refactor will allow developers to move faster by removing specific domain knowledge on very custom dependencies. It will also ideally be easier to make customizations without limitations around overriding pages and components. Spinning up a new instance and making modifications to page views would now be easier with routing and composability moving to the instance level. This will also allow different data integrations to be easily added without having to touch core components. +## Pros and Cons of the Options + +### [1] Continue with current application architecture + design system +- 💚 No up-front cost +- 🚩 Fulfilling the customization requirements means making the app more customizable through overrides, options, and flags/branches in code, increasing complexity, which has a cost in terms of developer velocity and onboarding +- 🚩 We have to maintain the legacy design system and augment it e.g. with new components and accessibility features like active state + +### [2] Continue with current application architecture + replace design system +- 💚 Small investment +- 💚 We can use standard components from the new design system +- 💚 We get accessibility-optimized components out of the box, backed by community +- 🚩 No improvement in terms of customization experience + +### [3] Refactor component library + replace design system + Rearchitect +- 💚 A component library allows for more straightforward composition into applications with the customization (pages, layout, navigation, routing, data providers) that is required +- 💚 More efficient delivery of new instances with modified page views, without directly impacting the core UI logic library. Seamless support for a wider range of data integrations. +- 💚 Faster development without requiring specific domain knowledge on very custom dependencies. +- 💚 As we refactor, we can see the new patterns emerge and hopefully implement feature improvements together with architecture improvements. However, rebuilding the instances with the components will basically mean a rewrite. +- 🚩 Refactoring is a complex process - risk of delay / failure. +- 🚩 The new architecture may demand deeper coding knowledge to set up a new instance. However this complexity is offset by the fact that making overrides in the current architecture is equally developer-intensive. We plan to establish a template instance that is easily cloneable for a quick start when spinning up new instances. + +### [4] Rewrite component library + replace design system + Rearchitect +- 💚 A component library allows for more straightforward composition into applications with the customization (pages, layout, navigation, routing, data providers) that is required +- 💚 More efficient delivery of new instances with modified page views, without directly impacting the core UI logic library. Seamless support for a wider range of data integrations. +- 💚 Faster development without requiring specific domain knowledge on very custom dependencies. +- 🚩 Since we also need to continue supporting the current instances, we would need to invest into the rewrite while we also keep developing the current application. This offsets any returns on investment and increases the risk of failure. +- 🚩 The new architecture may demand deeper coding knowledge to set up a new instance. However this complexity is offset by the fact that making overrides in the current architecture is equally developer-intensive. We plan to establish a template instance that is easily cloneable for a quick start when spinning up new instances. -### Consequences -* While the new architecture may demand deeper coding knowledge to set up a new instance, this complexity is offset by the fact that making overrides in the current architecture is equally developer-intensive. Additionally, we plan to establish a template instance that is easily cloneable for a quick start when spinning up new instances. -* There may be unforeseen blockers during the refactoring which have not been outlined. This may add to the complexity and spur more discussions on how to handle these blockers. ## Resources * [Github Issue to gather strategic questions related to future of VEDA UI](https://github.com/NASA-IMPACT/veda-ui/issues/766) * [Refactoring vs Rewrite article](https://methodpoet.com/refactoring-vs-rewrite/) * [Team Brainstorming session for VEDA V2 Refactor Miro Board](https://miro.com/app/board/uXjVN6lkBnc=/?share_link_id=238172590342) -* [Stac-react Repo](https://github.com/developmentseed/stac-react) \ No newline at end of file +* [Stac-react Repo](https://github.com/developmentseed/stac-react) From 216a2e9f336ee78347e077dc1ac980f69b26e94f Mon Sep 17 00:00:00 2001 From: Sandra Hoang Date: Wed, 13 Mar 2024 11:47:28 -0400 Subject: [PATCH 06/10] Rewords options --- docs/adr/002-application-architecture-for-configurability.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/adr/002-application-architecture-for-configurability.md b/docs/adr/002-application-architecture-for-configurability.md index 58e3d1a42..8df74ec1f 100644 --- a/docs/adr/002-application-architecture-for-configurability.md +++ b/docs/adr/002-application-architecture-for-configurability.md @@ -45,8 +45,8 @@ We also need to take into account that the evolution of the application with new - [1] Continue with current application architecture + design system - [2] Continue with current application architecture + replace design system -- [3] Refactor component library + replace design system + rearchitect -- [4] Rewrite component library + replace design system + rearchitect +- [3] Refactor component library + replace design system + rewrite instances +- [4] Rewrite component library + replace design system + rewrite instances ## Decision Outcome From a3fcb9400d9c99ad30aa330ea073b837c61af4ff Mon Sep 17 00:00:00 2001 From: Sandra Hoang Date: Wed, 13 Mar 2024 14:47:11 -0400 Subject: [PATCH 07/10] Update decision outcome choice wording --- docs/adr/002-application-architecture-for-configurability.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/adr/002-application-architecture-for-configurability.md b/docs/adr/002-application-architecture-for-configurability.md index 8df74ec1f..5887ce6af 100644 --- a/docs/adr/002-application-architecture-for-configurability.md +++ b/docs/adr/002-application-architecture-for-configurability.md @@ -50,7 +50,7 @@ We also need to take into account that the evolution of the application with new ## Decision Outcome -- ✔️[3] Refactor component library + replace design system + rearchitect +- ✔️[3] Refactor component library + replace design system + rewrite instances Move more control to the instance level, modularize the core ui library to expose core feature components and smaller reusable components, and create a data layer as part of the core ui library that is ideally also consumed at the instance level that manages data fetching and MDX parsing so that components are data agnostic. Introduce a new design system that is well-maintained and community-backed to create standardization across styles and accessibility patterns. From e4ec0cc3960e0333a0e9abaa0c67428c6917e248 Mon Sep 17 00:00:00 2001 From: Jonas Date: Thu, 14 Mar 2024 21:17:52 +0100 Subject: [PATCH 08/10] Change title for submodule pattern --- docs/adr/002-application-architecture-for-configurability.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/adr/002-application-architecture-for-configurability.md b/docs/adr/002-application-architecture-for-configurability.md index 5887ce6af..23027ae2c 100644 --- a/docs/adr/002-application-architecture-for-configurability.md +++ b/docs/adr/002-application-architecture-for-configurability.md @@ -21,7 +21,7 @@ We are expecting new instances to start using VEDA in 2024. ### Challenge 1: Cumbersome customization to the degree required Implementing these additional customizations proved to be cumbersome with the current application structure, because they require page overrides and new customization options across the application, which grew fast in complexity. -### Challenge 2: Dependency injection +### Challenge 2: Unconventional combination mechanism for instance configuration and UI components (via Git) The separation of application and content is currently done via Git submodules: the VEDA UI library source tree is injected into a Configuration project and then they are built together. This works and is lightweight, but is not a very common pattern which is an obstacle for new contributors to the project and new instances. ### Challenge 3: Unmaintained design system From 5aec71bc88c1c27f2f15f3dfbd3d3aa5596853ce Mon Sep 17 00:00:00 2001 From: j08lue Date: Fri, 15 Mar 2024 14:00:53 +0100 Subject: [PATCH 09/10] Remove design system considerations --- ...cation-architecture-for-configurability.md | 39 ++++++------------- 1 file changed, 11 insertions(+), 28 deletions(-) diff --git a/docs/adr/002-application-architecture-for-configurability.md b/docs/adr/002-application-architecture-for-configurability.md index 23027ae2c..fa749095c 100644 --- a/docs/adr/002-application-architecture-for-configurability.md +++ b/docs/adr/002-application-architecture-for-configurability.md @@ -24,9 +24,6 @@ Implementing these additional customizations proved to be cumbersome with the cu ### Challenge 2: Unconventional combination mechanism for instance configuration and UI components (via Git) The separation of application and content is currently done via Git submodules: the VEDA UI library source tree is injected into a Configuration project and then they are built together. This works and is lightweight, but is not a very common pattern which is an obstacle for new contributors to the project and new instances. -### Challenge 3: Unmaintained design system -VEDA UI currently uses a design system developed by DevSeed, which is not well maintained anymore. While being a great choice to get the application started, it now shows its shortcomings: It is not optimized for accessibility, which has become a more central requirement, and it misses many standard UI components that larger community design systems include. - ### Need for a decision: continue to modify, refactor, or rewrite? The challenges mentioned above have perceivably slowed down our development of new features and made addressing integration project needs cumbersome in recent quarters. We expect the number of instances of VEDA UI to grow, which is great, but makes the need to make a decision whether to make fundamental changes to the application architecture more pressing. @@ -43,16 +40,16 @@ We also need to take into account that the evolution of the application with new ## Considered Options -- [1] Continue with current application architecture + design system -- [2] Continue with current application architecture + replace design system -- [3] Refactor component library + replace design system + rewrite instances -- [4] Rewrite component library + replace design system + rewrite instances +- [1] Continue with current application architecture +- [2] Refactor component library + rewrite instances +- [3] Rewrite component library + rewrite instances + ## Decision Outcome -- ✔️[3] Refactor component library + replace design system + rewrite instances +✔️ [2] Refactor component library + rewrite instances -Move more control to the instance level, modularize the core ui library to expose core feature components and smaller reusable components, and create a data layer as part of the core ui library that is ideally also consumed at the instance level that manages data fetching and MDX parsing so that components are data agnostic. Introduce a new design system that is well-maintained and community-backed to create standardization across styles and accessibility patterns. +Move more control to the instance level, modularize the core ui library to expose core feature components and smaller reusable components, and create a data layer as part of the core ui library that is ideally also consumed at the instance level that manages data fetching and MDX parsing so that components are data agnostic. #### 1. Move Routing from the core ui library to the instance level Routing and what pages exist should be determined at the instance level. Currently, routing is handled at the core UI library level so supporting additional/removal of pages requires override logic. Moving this to the instance level allows developers/stakeholders to independently manage their routes and pages. @@ -67,42 +64,28 @@ The core UI library should also expose smaller reusable components like date pic The proposed data layer is designed to handle all data fetching, including STAC calls, and MDX parsing. Think of it as a versatile data utilities library. Introducing this layer would enable components in the core UI library to remain data-agnostic. In the event of scaling to additional or different data sources, expansion can be easily accomplished by integrating them into this centralized layer. Smart components (larger and stateful) would then efficiently consume this data layer. > **Integrating with [stac-react](https://github.com/developmentseed/stac-react/tree/main)**: Because these React hooks manage data fetching to the STAC API using the Context API provider pattern, this could just be used directly as it is already its own data layer. We would have to decide where we wrap the Provider though. Ideally, at the instance level, we would wrap the provider at the highest level in the tree either around the router or specific view containers and then consume these hooks down the hierarchy on the instance side. The components in the core ui library would be prop driven so this way they can be truly data agnostic and accept whatever data passed in. -#### 5. Introduce a new Design System -a. Replace the existing custom design system with a well-maintained, widely adopted community-supported design system. This ensures built-in accessibility standards and eliminates the need for designers and developers to invest time in ongoing maintenance. - -b. The preliminary systems we are considering are: - * Chakra UI. Built on React, it has a large component library, built-in accessibility and theming options. It is designed with responsive and mobile-first principles and has a strong community and documentation. - * The U.S. Web Design System (USWDS) is tailored for government projects. It's designed to meet the specific needs of U.S. federal websites, offering components that are accessible, secure, and in line with U.S. digital standards. - -c. Any option we choose will have to be extended for data visualization components (charts, maps, widgets, etc.) and themed for the 3 current VEDA instances: VEDA Dashboard, U.S. GHG Center, Earth.gov. - **Architectural Diagram of the Refactor** ![Architectural Diagram](./diagrams/veda-v2-refactor-adr-dataprovider-diagram.png) *[Miro Board Link](https://miro.com/app/board/uXjVN6lkBnc=/?share_link_id=85040810316) which documents team's brainstorming discussions, options considered, technical trade-offs, and final proposed solution in detail* + ## Pros and Cons of the Options -### [1] Continue with current application architecture + design system +### [1] Continue with current application architecture - 💚 No up-front cost - 🚩 Fulfilling the customization requirements means making the app more customizable through overrides, options, and flags/branches in code, increasing complexity, which has a cost in terms of developer velocity and onboarding -- 🚩 We have to maintain the legacy design system and augment it e.g. with new components and accessibility features like active state -### [2] Continue with current application architecture + replace design system -- 💚 Small investment -- 💚 We can use standard components from the new design system -- 💚 We get accessibility-optimized components out of the box, backed by community -- 🚩 No improvement in terms of customization experience -### [3] Refactor component library + replace design system + Rearchitect +### [2] Refactor component library + rewrite instances - 💚 A component library allows for more straightforward composition into applications with the customization (pages, layout, navigation, routing, data providers) that is required - 💚 More efficient delivery of new instances with modified page views, without directly impacting the core UI logic library. Seamless support for a wider range of data integrations. -- 💚 Faster development without requiring specific domain knowledge on very custom dependencies. - 💚 As we refactor, we can see the new patterns emerge and hopefully implement feature improvements together with architecture improvements. However, rebuilding the instances with the components will basically mean a rewrite. - 🚩 Refactoring is a complex process - risk of delay / failure. - 🚩 The new architecture may demand deeper coding knowledge to set up a new instance. However this complexity is offset by the fact that making overrides in the current architecture is equally developer-intensive. We plan to establish a template instance that is easily cloneable for a quick start when spinning up new instances. -### [4] Rewrite component library + replace design system + Rearchitect + +### [3] Rewrite component library + rewrite instances - 💚 A component library allows for more straightforward composition into applications with the customization (pages, layout, navigation, routing, data providers) that is required - 💚 More efficient delivery of new instances with modified page views, without directly impacting the core UI logic library. Seamless support for a wider range of data integrations. - 💚 Faster development without requiring specific domain knowledge on very custom dependencies. From b469b213790c0279ecfd54db826bdd6404d7f142 Mon Sep 17 00:00:00 2001 From: Jonas Date: Tue, 19 Mar 2024 07:45:12 +0100 Subject: [PATCH 10/10] Set status to done --- .../adr/002-application-architecture-for-configurability.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/adr/002-application-architecture-for-configurability.md b/docs/adr/002-application-architecture-for-configurability.md index fa749095c..0386017df 100644 --- a/docs/adr/002-application-architecture-for-configurability.md +++ b/docs/adr/002-application-architecture-for-configurability.md @@ -1,8 +1,8 @@ # Application Architecture for Configurability -* Status: **In Review**, In Progress, Done -* Authors: @j08lue, @sandrahoang686, @faustoperez -* Deciders: @j08lue, @faustoperez, @hanbyul-here +* Status: In Review, In Progress, **Done** +* Authors: @sandrahoang686, @faustoperez, @j08lue +* Deciders: @hanbyul-here, @faustoperez, @j08lue * As of: 2024/03 ## Context and Problem Statement