This is an automated email from the ASF dual-hosted git repository.

github-merge-queue[bot] pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/texera.git

commit 782c37f905c484d7cff272111b45dabb2aee7ecd
Author: yangzhang75 <[email protected]>
AuthorDate: Fri Aug 28 22:51:14 2026 +0000

    feat(config): add form-view-enabled feature flag, default off (#8029)
    
    ### What changes were proposed in this PR?
    Adds a single feature flag `form-view-enabled` (default **off**) that
    will gate the entire Form View feature, so the rest of the stacked
    series can merge without exposing an unfinished feature to users.
    
    - `common/config/.../gui.conf`:
    `gui.workflow-workspace.form-view-enabled = false` (env-overridable)
    - `GuiConfig`: read it as `guiWorkflowWorkspaceFormViewEnabled`
    - `ConfigResource`: expose via `/api/config/gui` as `formViewEnabled`
    - frontend `gui-config.ts` + `gui-config.service.mock.ts`: add
    `formViewEnabled`
    
    Nothing reads the flag yet; it is flipped on only by the final PR in the
    series.
    
    ### Any related issues, documentation, discussions?
    Closes #8013.
    Part of #8011  — first of a stacked series of 16 PRs (1/16)
    
    ### How was this PR tested?
    `GuiConfigSpec` asserts the flag parses; `ng build` and the existing
    frontend test suite pass. No behavior change — nothing consumes the flag
    yet.
    
    ### Was this PR authored or co-authored using generative AI tooling?
    Generated-by: Claude Code (Claude Opus)
    
    Co-authored-by: Claude Opus 4.8 <[email protected]>
---
 common/config/src/main/resources/gui.conf                             | 4 ++++
 .../src/main/scala/org/apache/texera/common/config/GuiConfig.scala    | 2 ++
 .../test/scala/org/apache/texera/common/config/GuiConfigSpec.scala    | 4 ++++
 .../scala/org/apache/texera/service/resource/ConfigResource.scala     | 1 +
 frontend/src/app/common/service/gui-config.service.mock.ts            | 1 +
 frontend/src/app/common/type/gui-config.ts                            | 1 +
 6 files changed, 13 insertions(+)

diff --git a/common/config/src/main/resources/gui.conf 
b/common/config/src/main/resources/gui.conf
index d0f9f2e8cb..f136569593 100644
--- a/common/config/src/main/resources/gui.conf
+++ b/common/config/src/main/resources/gui.conf
@@ -78,6 +78,10 @@ gui {
     timetravel-enabled = false
     timetravel-enabled = ${?GUI_WORKFLOW_WORKSPACE_TIMETRAVEL_ENABLED}
 
+    # whether the Form View (a second, form-based view of a workflow) is 
enabled
+    form-view-enabled = false
+    form-view-enabled = ${?GUI_WORKFLOW_WORKSPACE_FORM_VIEW_ENABLED}
+
     # Whether to connect to local or production shared editing server. Set to 
true if you have
     # reverse proxy set up for y-websocket.
     production-shared-editing-server = false
diff --git 
a/common/config/src/main/scala/org/apache/texera/common/config/GuiConfig.scala 
b/common/config/src/main/scala/org/apache/texera/common/config/GuiConfig.scala
index 9968d97c3b..f4e07d2abf 100644
--- 
a/common/config/src/main/scala/org/apache/texera/common/config/GuiConfig.scala
+++ 
b/common/config/src/main/scala/org/apache/texera/common/config/GuiConfig.scala
@@ -55,6 +55,8 @@ object GuiConfig {
     conf.getBoolean("gui.workflow-workspace.async-rendering-enabled")
   val guiWorkflowWorkspaceTimetravelEnabled: Boolean =
     conf.getBoolean("gui.workflow-workspace.timetravel-enabled")
+  val guiWorkflowWorkspaceFormViewEnabled: Boolean =
+    conf.getBoolean("gui.workflow-workspace.form-view-enabled")
   val guiWorkflowWorkspaceProductionSharedEditingServer: Boolean =
     conf.getBoolean("gui.workflow-workspace.production-shared-editing-server")
   val guiWorkflowWorkspacePythonLanguageServerPort: String =
diff --git 
a/common/config/src/test/scala/org/apache/texera/common/config/GuiConfigSpec.scala
 
b/common/config/src/test/scala/org/apache/texera/common/config/GuiConfigSpec.scala
index e121a7cc6c..68f47b0c14 100644
--- 
a/common/config/src/test/scala/org/apache/texera/common/config/GuiConfigSpec.scala
+++ 
b/common/config/src/test/scala/org/apache/texera/common/config/GuiConfigSpec.scala
@@ -56,6 +56,10 @@ class GuiConfigSpec extends AnyFlatSpec with Matchers {
     ifUnset("GUI_WORKFLOW_WORKSPACE_TIMETRAVEL_ENABLED")(
       GuiConfig.guiWorkflowWorkspaceTimetravelEnabled shouldBe false
     )
+    // Form View ships disabled so merging the feature never turns it on; the 
final PR flips it.
+    ifUnset("GUI_WORKFLOW_WORKSPACE_FORM_VIEW_ENABLED")(
+      GuiConfig.guiWorkflowWorkspaceFormViewEnabled shouldBe false
+    )
     ifUnset("GUI_WORKFLOW_WORKSPACE_PRODUCTION_SHARED_EDITING_SERVER")(
       GuiConfig.guiWorkflowWorkspaceProductionSharedEditingServer shouldBe 
false
     )
diff --git 
a/config-service/src/main/scala/org/apache/texera/service/resource/ConfigResource.scala
 
b/config-service/src/main/scala/org/apache/texera/service/resource/ConfigResource.scala
index 23c1e7fa68..601d3219d6 100644
--- 
a/config-service/src/main/scala/org/apache/texera/service/resource/ConfigResource.scala
+++ 
b/config-service/src/main/scala/org/apache/texera/service/resource/ConfigResource.scala
@@ -85,6 +85,7 @@ class ConfigResource {
       "linkBreakpointEnabled" -> 
GuiConfig.guiWorkflowWorkspaceLinkBreakpointEnabled,
       "asyncRenderingEnabled" -> 
GuiConfig.guiWorkflowWorkspaceAsyncRenderingEnabled,
       "timetravelEnabled" -> GuiConfig.guiWorkflowWorkspaceTimetravelEnabled,
+      "formViewEnabled" -> GuiConfig.guiWorkflowWorkspaceFormViewEnabled,
       "productionSharedEditingServer" -> 
GuiConfig.guiWorkflowWorkspaceProductionSharedEditingServer,
       "defaultExecutionMode" -> 
GuiConfig.guiWorkflowWorkspaceDefaultExecutionMode,
       "workflowEmailNotificationEnabled" -> 
GuiConfig.guiWorkflowWorkspaceWorkflowEmailNotificationEnabled,
diff --git a/frontend/src/app/common/service/gui-config.service.mock.ts 
b/frontend/src/app/common/service/gui-config.service.mock.ts
index 667a774743..e1196c7566 100644
--- a/frontend/src/app/common/service/gui-config.service.mock.ts
+++ b/frontend/src/app/common/service/gui-config.service.mock.ts
@@ -39,6 +39,7 @@ export class MockGuiConfigService {
     linkBreakpointEnabled: false,
     asyncRenderingEnabled: false,
     timetravelEnabled: false,
+    formViewEnabled: false,
     productionSharedEditingServer: false,
     pythonLanguageServerPort: "3000",
     defaultDataTransferBatchSize: 100,
diff --git a/frontend/src/app/common/type/gui-config.ts 
b/frontend/src/app/common/type/gui-config.ts
index cf36f046ee..52ab534591 100644
--- a/frontend/src/app/common/type/gui-config.ts
+++ b/frontend/src/app/common/type/gui-config.ts
@@ -30,6 +30,7 @@ export interface GuiConfig {
   linkBreakpointEnabled: boolean;
   asyncRenderingEnabled: boolean;
   timetravelEnabled: boolean;
+  formViewEnabled: boolean;
   productionSharedEditingServer: boolean;
   pythonLanguageServerPort: string;
   defaultDataTransferBatchSize: number;

Reply via email to