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

machristie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/airavata-django-portal.git


The following commit(s) were added to refs/heads/master by this push:
     new 15d31bd  AIRAVATA-2539 Refactored new project, edit project UIs
15d31bd is described below

commit 15d31bd86a0420d6a2b2d9faa65ba31d565ccad5
Author: Marcus Christie <[email protected]>
AuthorDate: Thu Apr 25 16:11:27 2019 -0400

    AIRAVATA-2539 Refactored new project, edit project UIs
---
 .../js/components/project/ProjectButtonNew.vue     | 159 +++++++++------------
 .../js/components/project/ProjectEditor.vue        | 119 +++++++++------
 .../js/containers/EditProjectContainer.vue         |  29 ++--
 3 files changed, 155 insertions(+), 152 deletions(-)

diff --git 
a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/project/ProjectButtonNew.vue
 
b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/project/ProjectButtonNew.vue
index ffa40d2..c86701e 100644
--- 
a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/project/ProjectButtonNew.vue
+++ 
b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/project/ProjectButtonNew.vue
@@ -1,103 +1,74 @@
 
 <template>
-    <div>
-        <b-btn v-b-modal.modal-new-project variant="primary">
-            <slot>
-                New Project <i class="fa fa-plus" aria-hidden="true"></i>
-            </slot>
-        </b-btn>
-        <b-modal id="modal-new-project" ref="modalNewProject" title="Create 
New Project"
-                v-on:ok="onCreateProject" 
v-bind:cancel-disabled="cancelDisabled"
-                v-bind:ok-disabled="okDisabled">
-            <b-form @submit="onCreateProject" @input="onUserInput" novalidate>
-                <b-form-group label="Project Name" 
label-for="new-project-name" v-bind:feedback="newProjectNameFeedback" 
v-bind:state="newProjectNameState">
-                    <b-form-input id="new-project-name"
-                        type="text" v-model="newProject.name" required
-                        placeholder="Project name"
-                        v-bind:state="newProjectNameState"></b-form-input>
-                </b-form-group>
-                <b-form-group label="Project Description" 
label-for="new-project-description">
-                    <b-form-textarea id="new-project-description"
-                        type="text" v-model="newProject.description"
-                        placeholder="(Optional) Project description"
-                        :rows="3"></b-form-textarea>
-                </b-form-group>
-            </b-form>
-        </b-modal>
-    </div>
+  <div>
+    <b-btn
+      v-b-modal.modal-new-project
+      variant="primary"
+    >
+      <slot>
+        New Project <i
+          class="fa fa-plus"
+          aria-hidden="true"
+        ></i>
+      </slot>
+    </b-btn>
+    <b-modal
+      id="modal-new-project"
+      ref="modalNewProject"
+      title="Create New Project"
+      v-on:ok="onCreateProject"
+      v-bind:ok-disabled="okDisabled"
+      @cancel="onCancelNewProject"
+    >
+      <project-editor
+        v-model="newProject"
+        ref="projectEditor"
+        @save="onCreateProject"
+        @valid="valid = true"
+        @invalid="valid = false"
+      >
+        <div slot="title"></div>
+      </project-editor>
+    </b-modal>
+  </div>
 </template>
 
 <script>
-
-import { models, services } from 'django-airavata-api'
+import { models, services } from "django-airavata-api";
+import ProjectEditor from "./ProjectEditor.vue";
 
 export default {
-    name: 'project-button-new',
-    data () {
-        return {
-            newProject: new models.Project(),
-            newProjectServerValidationData: null,
-            userBeginsInput: false,
-            loading: false,
-        }
-    },
-    components: {
-    },
-    methods: {
-        onCreateProject: function(event) {
-            // Prevent hiding modal, hide it programmatically when project 
gets created
-            event.preventDefault();
-            this.loading = true;
-            services.ProjectService.create({data: this.newProject})
-                .then(result => {
-                    this.$refs.modalNewProject.hide();
-                    this.$emit('new-project', result);
-                    // Reset state
-                    this.newProject = new models.Project();
-                    this.userBeginsInput = false;
-                })
-                .catch(error => {
-                    this.newProjectServerValidationData = error.data;
-                })
-                .then(() => this.loading = false, () => this.loading = false);
-        },
-        onUserInput: function() {
-            this.userBeginsInput = true;
-            // Clear server side validation data when user starts typing again
-            this.newProjectServerValidationData = null;
-        },
-    },
-    computed: {
-        newProjectValidationData: function() {
-            return this.userBeginsInput ? this.newProject.validate() : null;
-        },
-        newProjectNameState: function() {
-            if (this.newProjectServerValidationData && 'name' in 
this.newProjectServerValidationData) {
-                return 'invalid';
-            } else if (this.newProjectValidationData && 'name' in 
this.newProjectValidationData) {
-                return 'invalid';
-            } else {
-                return null;
-            }
-        },
-        newProjectNameFeedback: function() {
-            if (this.newProjectServerValidationData && 'name' in 
this.newProjectServerValidationData) {
-                return this.newProjectServerValidationData.name.join('; ');
-            } else if (this.newProjectValidationData && 'name' in 
this.newProjectValidationData) {
-                return this.newProjectValidationData.name.join('; ');
-            } else {
-                return null;
-            }
-        },
-        formIsValid: function() {
-            return this.newProjectNameState == null;
-        },
-        cancelDisabled: function() {
-            return this.loading;
-        },
-        okDisabled: function() {
-            return this.loading || !this.userBeginsInput || !this.formIsValid;
-        }
+  name: "project-button-new",
+  data() {
+    return {
+      valid: false,
+      newProject: new models.Project()
+    };
+  },
+  components: {
+    ProjectEditor
+  },
+  methods: {
+    onCreateProject: function(event) {
+      // Prevent hiding modal, hide it programmatically when project gets 
created
+      event.preventDefault();
+      services.ProjectService.create({ data: this.newProject }).then(result => 
{
+        this.$refs.modalNewProject.hide();
+        this.$emit("new-project", result);
+        // Reset state
+        this.newProject = new models.Project();
+        this.$refs.projectEditor.reset();
+      });
     },
-}
+    onCancelNewProject() {
+      this.newProject = new models.Project();
+      this.$refs.projectEditor.reset();
+    }
+  },
+  computed: {
+    okDisabled: function() {
+      return !this.valid;
+    }
+  }
+};
 </script>
diff --git 
a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/project/ProjectEditor.vue
 
b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/project/ProjectEditor.vue
index 3cbe34d..8df9cd0 100644
--- 
a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/project/ProjectEditor.vue
+++ 
b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/project/ProjectEditor.vue
@@ -1,43 +1,43 @@
 <template>
   <div>
-    <div class="row">
-      <div class="col-auto mr-auto">
-        <h1 class="h4 mb-4">
-          <slot name="title">Edit Project</slot>
-        </h1>
-      </div>
-    </div>
-    <div class="row">
-      <div class="col">
-        <b-form-group
-          label="Project Name"
-          label-for="project-name"
-          :feedback="nameFeedback"
+    <slot name="title">
+      <h1 class="h4 mb-4">
+        Edit Project
+      </h1>
+    </slot>
+    <b-form
+      @submit="onSubmit"
+      @input="onUserInput"
+      novalidate
+    >
+      <b-form-group
+        label="Project Name"
+        label-for="project-name"
+        :feedback="nameFeedback"
+        :state="nameState"
+      >
+        <b-form-input
+          id="project-name"
+          type="text"
+          v-model="data.name"
+          required
+          placeholder="Project name"
           :state="nameState"
-        >
-          <b-form-input
-            id="project-name"
-            type="text"
-            v-model="data.name"
-            required
-            placeholder="Project name"
-            :state="nameState"
-          ></b-form-input>
-        </b-form-group>
-        <b-form-group
-          label="Project Description"
-          label-for="project-description"
-        >
-          <b-form-textarea
-            id="project-description"
-            type="text"
-            v-model="data.description"
-            placeholder="(Optional) Project description"
-            :rows="3"
-          ></b-form-textarea>
-        </b-form-group>
-      </div>
-    </div>
+        ></b-form-input>
+      </b-form-group>
+      <b-form-group
+        label="Project Description"
+        label-for="project-description"
+      >
+        <b-form-textarea
+          id="project-description"
+          type="text"
+          v-model="data.description"
+          placeholder="(Optional) Project description"
+          :rows="3"
+        ></b-form-textarea>
+      </b-form-group>
+    </b-form>
   </div>
 </template>
 
@@ -56,28 +56,59 @@ export default {
   },
   mounted() {
     this.$on("input", this.validate);
+    this.validate();
   },
   data() {
     return {
-      validation: {
-        name: null
-      }
+      userBeginsInput: false
     };
   },
   computed: {
     nameFeedback() {
-      if (this.validation.name) {
+      if (this.userBeginsInput && this.validation.name) {
         return this.validation.name.join("; ");
+      } else {
+        return null;
       }
     },
     nameState() {
-      return !this.validation.name || this.validation.name.length === 0;
+      if (this.validation.name) {
+        if (this.userBeginsInput) {
+          return false;
+        } else {
+          return null;
+        }
+      } else {
+        return true;
+      }
+    },
+    validation() {
+      const v = this.data.validate();
+      return v ? v : {};
     }
   },
   methods: {
     validate() {
-      const v = this.data.validate();
-      this.validation = v ? v : {};
+      if (Object.keys(this.validation).length > 0) {
+        this.$emit("invalid");
+      } else {
+        this.$emit("valid");
+      }
+    },
+    onUserInput() {
+      this.userBeginsInput = true;
+    },
+    onSubmit(event) {
+      event.preventDefault();
+      this.$emit("save");
+    },
+    reset() {
+      this.userBeginsInput = false;
+    }
+  },
+  watch: {
+    value() {
+      this.validate();
     }
   }
 };
diff --git 
a/django_airavata/apps/workspace/static/django_airavata_workspace/js/containers/EditProjectContainer.vue
 
b/django_airavata/apps/workspace/static/django_airavata_workspace/js/containers/EditProjectContainer.vue
index 086e045..ecf6251 100644
--- 
a/django_airavata/apps/workspace/static/django_airavata_workspace/js/containers/EditProjectContainer.vue
+++ 
b/django_airavata/apps/workspace/static/django_airavata_workspace/js/containers/EditProjectContainer.vue
@@ -1,14 +1,9 @@
 <template>
-  <div>
-    <div class="row">
-      <div class="col">
-        <project-editor v-if="project" v-model="project" />
-      </div>
-    </div>
-    <div class="row">
-      <div class="col">
-        <b-button @click="saveProject" variant="primary">Save</b-button>
-      </div>
+  <div v-if="project">
+    <project-editor v-model="project" @save="saveProject" @valid="valid = 
true" @invalid="valid = false"/>
+    <div class="d-flex justify-content-end">
+        <b-button @click="saveProject" variant="primary" 
:disabled="!valid">Save</b-button>
+        <b-button @click="cancel" variant="secondary">Cancel</b-button>
     </div>
   </div>
 </template>
@@ -29,6 +24,7 @@ export default {
   data() {
     return {
       project: null,
+      valid: false
     };
   },
   components: {
@@ -40,10 +36,15 @@ export default {
   },
   methods: {
     saveProject() {
-      services.ProjectService.update({lookup: this.projectId, data: 
this.project})
-      .then(() => {
-        urls.navigateToProjectsList();
-      });
+      if (this.valid) {
+        services.ProjectService.update({lookup: this.projectId, data: 
this.project})
+        .then(() => {
+          urls.navigateToProjectsList();
+        });
+      }
+    },
+    cancel() {
+      urls.navigateToProjectsList();
     }
   }
 };

Reply via email to