From 35f4121d446aa0bde175dcd41f7fb869ec2742ab Mon Sep 17 00:00:00 2001
From: Peter Clement <peter@budibase.com>
Date: Tue, 23 Nov 2021 20:14:28 +0000
Subject: [PATCH] some autoscreen ux fixes

---
 .../NavigationPanel/NewScreenModal.svelte     | 129 +++++++++++-------
 .../NavigationPanel/ScreenDetailsModal.svelte |  15 +-
 .../NavigationPanel/ScreenWizard.svelte       |  35 +++--
 3 files changed, 123 insertions(+), 56 deletions(-)

diff --git a/packages/builder/src/components/design/NavigationPanel/NewScreenModal.svelte b/packages/builder/src/components/design/NavigationPanel/NewScreenModal.svelte
index e7c9ef6ff2..1483517c20 100644
--- a/packages/builder/src/components/design/NavigationPanel/NewScreenModal.svelte
+++ b/packages/builder/src/components/design/NavigationPanel/NewScreenModal.svelte
@@ -1,13 +1,20 @@
 <script>
   import { store } from "builderStore"
   import { tables } from "stores/backend"
-  import { ModalContent, Body, Detail, Layout, Icon } from "@budibase/bbui"
+  import {
+    ModalContent,
+    Body,
+    Detail,
+    Layout,
+    Icon,
+    ProgressCircle,
+  } from "@budibase/bbui"
   import getTemplates from "builderStore/store/screenTemplates"
 
   export let selectedScreens = []
   export let chooseModal
   export let save
-
+  export let showProgressCircle = false
   const blankScreen = "createFromScratch"
 
   $: blankSelected = selectedScreens?.length === 1
@@ -27,78 +34,108 @@
   }
 </script>
 
-<ModalContent
-  title="Add screens"
-  confirmText="Add Screens"
-  cancelText="Cancel"
-  onConfirm={() => (autoSelected ? save() : chooseModal(1))}
-  disabled={!selectedScreens.length}
-  size="L"
->
-  <Body size="XS"
-    >Please select the screens you would like to add to your application.
-    Autogenerated screens come with CRUD functionality.</Body
+<div style="overflow-y: auto; max-height: 1000px">
+  <ModalContent
+    title="Add screens"
+    confirmText="Add Screens"
+    cancelText="Cancel"
+    onConfirm={() => (autoSelected ? save() : chooseModal(1))}
+    disabled={!selectedScreens.length}
+    size="L"
   >
-
-  <Layout noPadding gap="S">
-    <Detail size="S">Blank screen</Detail>
-    <div
-      class="item"
-      class:selected={selectedScreens.find(x => x.id.includes(blankScreen))}
-      on:click={() =>
-        toggleScreenSelection(templates.find(t => t.id === blankScreen))}
-      class:disabled={autoSelected}
+    <Body size="XS"
+      >Please select the screens you would like to add to your application.
+      Autogenerated screens come with CRUD functionality.</Body
     >
-      <div data-cy="blank-screen" class="content">
-        <Body size="S">Blank</Body>
-      </div>
-      <div style="color: var(--spectrum-global-color-green-600); float: right">
-        {#if selectedScreens.find(x => x.id === blankScreen)}
-          <Icon size="S" name="CheckmarkCircleOutline" />
-        {/if}
-      </div>
-    </div>
-    <Detail size="S">Autogenerated Screens</Detail>
 
-    {#each $tables.list.filter(table => table._id !== "ta_users") as table}
+    <Layout noPadding gap="S">
+      <Detail size="S">Blank screen</Detail>
       <div
-        class:disabled={blankSelected}
-        class:selected={selectedScreens.find(x => x.name.includes(table.name))}
-        on:click={() => toggleScreenSelection(table)}
         class="item"
+        class:selected={selectedScreens.find(x => x.id.includes(blankScreen))}
+        on:click={() =>
+          toggleScreenSelection(templates.find(t => t.id === blankScreen))}
+        class:disabled={autoSelected}
       >
-        <div class="content">
-          {table.name}
+        <div data-cy="blank-screen" class="content">
+          <div class="text">Blank</div>
         </div>
         <div
           style="color: var(--spectrum-global-color-green-600); float: right"
         >
-          {#if selectedScreens.find(x => x.name.includes(table.name))}
-            <Icon size="S" name="CheckmarkCircleOutline" />
+          {#if selectedScreens.find(x => x.id === blankScreen)}
+            <div class="checkmark-spacing">
+              <Icon size="S" name="CheckmarkCircleOutline" />
+            </div>
           {/if}
         </div>
       </div>
-    {/each}
-  </Layout>
-</ModalContent>
+      <Detail size="S">Autogenerated Screens</Detail>
+
+      {#each $tables.list.filter(table => table._id !== "ta_users") as table}
+        <div
+          class:disabled={blankSelected}
+          class:selected={selectedScreens.find(x =>
+            x.name.includes(table.name)
+          )}
+          on:click={() => toggleScreenSelection(table)}
+          class="item"
+        >
+          <div class="content">
+            <div class="text">{table.name}</div>
+          </div>
+          <div
+            style="color: var(--spectrum-global-color-green-600); float: right"
+          >
+            {#if selectedScreens.find(x => x.name.includes(table.name))}
+              <div class="checkmark-spacing">
+                <Icon size="S" name="CheckmarkCircleOutline" />
+              </div>
+            {/if}
+          </div>
+        </div>
+      {/each}
+    </Layout>
+    <div slot="footer">
+      {#if showProgressCircle}
+        <div class="footer-progress"><ProgressCircle size="S" /></div>
+      {/if}
+    </div>
+  </ModalContent>
+</div>
 
 <style>
   .disabled {
     opacity: 0.3;
     pointer-events: none;
   }
+  .checkmark-spacing {
+    margin-right: var(--spacing-m);
+  }
 
   .content {
     letter-spacing: 0px;
   }
+
+  .footer-progress {
+    margin-top: var(--spacing-s);
+  }
+
+  .text {
+    font-weight: 600;
+    margin-left: var(--spacing-m);
+    font-size: 14px;
+    text-transform: capitalize;
+  }
+
   .item {
     cursor: pointer;
     grid-gap: var(--spectrum-alias-grid-margin-xsmall);
     padding: var(--spectrum-alias-item-padding-s);
-    background: var(--background);
+    background: var(--spectrum-alias-background-color-primary);
     transition: 0.3s all;
-    border: solid var(--spectrum-alias-border-color);
-    border-radius: 2px;
+    border: 1px solid #e7e7e7;
+    border-radius: 4px;
     box-sizing: border-box;
     border-width: 1px;
     display: flex;
diff --git a/packages/builder/src/components/design/NavigationPanel/ScreenDetailsModal.svelte b/packages/builder/src/components/design/NavigationPanel/ScreenDetailsModal.svelte
index f67f363ce8..e5cc839045 100644
--- a/packages/builder/src/components/design/NavigationPanel/ScreenDetailsModal.svelte
+++ b/packages/builder/src/components/design/NavigationPanel/ScreenDetailsModal.svelte
@@ -1,5 +1,5 @@
 <script>
-  import { ModalContent, Input } from "@budibase/bbui"
+  import { ModalContent, Input, ProgressCircle } from "@budibase/bbui"
   import sanitizeUrl from "builderStore/store/screenTemplates/utils/sanitizeUrl"
   import { selectedAccessRole, allScreens } from "builderStore"
 
@@ -7,6 +7,8 @@
   export let url
   export let chooseModal
   export let save
+  export let showProgressCircle = false
+
   let routeError
   let roleId = $selectedAccessRole || "BASIC"
 
@@ -48,4 +50,15 @@
     bind:value={url}
     on:change={routeChanged}
   />
+  <div slot="footer">
+    {#if showProgressCircle}
+      <div class="footer-progress"><ProgressCircle size="S" /></div>
+    {/if}
+  </div>
 </ModalContent>
+
+<style>
+  .footer-progress {
+    margin-top: var(--spacing-s);
+  }
+</style>
diff --git a/packages/builder/src/components/design/NavigationPanel/ScreenWizard.svelte b/packages/builder/src/components/design/NavigationPanel/ScreenWizard.svelte
index 7018bc2ed4..a86f0c2d75 100644
--- a/packages/builder/src/components/design/NavigationPanel/ScreenWizard.svelte
+++ b/packages/builder/src/components/design/NavigationPanel/ScreenWizard.svelte
@@ -12,34 +12,39 @@
   let screenName = ""
   let url = ""
   let selectedScreens = []
-
   let roleId = $selectedAccessRole || "BASIC"
-
+  let showProgressCircle = false
   let routeError
   let createdScreens = []
-  $: {
-    selectedScreens?.forEach(screen => {
-      createdScreens = [...createdScreens, screen.create()]
-    })
+
+  const createScreens = async () => {
+    for (let screen of selectedScreens) {
+      let test = screen.create()
+      createdScreens.push(test)
+    }
   }
 
   const save = async () => {
+    showProgressCircle = true
+    await createScreens()
     for (let screen of createdScreens) {
       await saveScreens(screen)
     }
 
     await store.actions.routing.fetch()
     selectedScreens = []
+    createdScreens = []
     screenName = ""
     url = ""
+    showProgressCircle = false
   }
   const saveScreens = async draftScreen => {
     let existingScreenCount = $store.screens.filter(
       s => s.props._instanceName == draftScreen.props._instanceName
     ).length
-
     if (existingScreenCount > 0) {
       let oldUrlArr = draftScreen.routing.route.split("/")
+      console.log(oldUrlArr)
       oldUrlArr[1] = `${oldUrlArr[1]}-${existingScreenCount + 1}`
       draftScreen.routing.route = oldUrlArr.join("/")
     }
@@ -86,6 +91,7 @@
     selectedScreens = []
     screenName = ""
     url = ""
+    createdScreens = []
   })
 
   export const showModal = () => {
@@ -109,9 +115,20 @@
 </script>
 
 <Modal bind:this={newScreenModal}>
-  <NewScreenModal bind:selectedScreens {save} {chooseModal} />
+  <NewScreenModal
+    bind:selectedScreens
+    {showProgressCircle}
+    {save}
+    {chooseModal}
+  />
 </Modal>
 
 <Modal bind:this={screenDetailsModal}>
-  <ScreenDetailsModal bind:screenName bind:url {save} {chooseModal} />
+  <ScreenDetailsModal
+    bind:screenName
+    bind:url
+    {showProgressCircle}
+    {save}
+    {chooseModal}
+  />
 </Modal>