Source: views/CreateRecord/NewRecord.vue

<template>
  <v-container
    id="createRecord"
    fluid
  >
    <v-form
      id="createRecord"
      ref="createRecord"
      v-model="formValid"
    >
      <v-row>
        <v-col cols="12">
          <v-card v-if="loaded">
            <v-card-title class="primary white--text">
              <h3 class="white--text">
                Creating a new FAIRsharing record
              </h3>
            </v-card-title>
            <v-card-text
              v-if="message.error"
              class="pt-4"
            >
              <v-alert type="error">
                {{ message.value }}<v-icon class="px-3">
                  fa-arrow-right
                </v-icon> {{ message.value.response.data }}
              </v-alert>
            </v-card-text>
            <v-card-text class="pt-3">
              <v-container fluid>
                <v-row>
                  <base-fields
                    :create-mode="true"
                    :submit-record="submitAnyway"
                    :loading="loading"
                    @submission="setSubmitAnyway()"
                    @clearing="tryAgain()"
                    @createnewrecord="createRecord()"
                  />
                </v-row>
              </v-container>
            </v-card-text>
          </v-card>

          <v-fade-transition>
            <v-overlay
              v-if="!loaded"
              :absolute="false"
              opacity="0.8"
            >
              <loaders />
            </v-overlay>
          </v-fade-transition>
        </v-col>
      </v-row>
    </v-form>
    <v-dialog
      v-model="recordCreated"
      max-width="700px"
    >
      <v-card>
        <v-card-title
          class="headline"
        >
          <p>
            <b>Success!</b>
          </p>
        </v-card-title>
        <v-card-text>
          Draft submission saved. Next, please complete curation on your record.
        </v-card-text>
        <v-card-actions>
          <v-spacer />
          <v-btn
            color="blue darken-1"
            text
            @click="redirectToEdit(newRecord)"
          >
            OK
          </v-btn>
        </v-card-actions>
      </v-card>
    </v-dialog>
  </v-container>
</template>

<script>
    import { mapActions, mapGetters,mapState } from "vuex"

    import status from "@/data/status.json"
    import RESTClient from "@/lib/Client/RESTClient.js"
    import { isUrl } from "@/utils/rules.js"

    import BaseFields from "../../components/Editor/GeneralInformation/BaseFields";
    import Loaders from "../../components/Navigation/Loaders";

    let restClient = new RESTClient();

    /** Component to generate the new record page and its buttons to redirect to new collection, standard, policy and database
     *
     */
    export default {
      name: "NewRecordPage",
      components: {Loaders, BaseFields},
      data(){
          return {
            record: {},
            newRecord: {},
            recordsTypes: [],
            formValid: false,
            loaded: false,
            message: {
              error: false,
              value: null
            },
            rules: {
              isUrl: function(){return isUrl()}
            },
            submitAnyway: false,
            recordCreated: false,
            loading: false,
          }
        },
        computed: {
            ...mapState('users', ["user"]),
            ...mapState('editor', ['possibleDuplicates']),
            ...mapGetters('record', ['getSection'])
        },
        async mounted(){
          this.$nextTick(async function () {
            this.loaded = false;
            this.resetRecord();
            await this.getData();
            this.loaded = true;
            this.$store.commit("editor/clearPossibleDuplicates");
            this.$store.commit("record/setCreatingNewRecord");
          });
        },
        methods: {
          ...mapActions("editor",
              ["getCountries",
               "getRecordTypes",
               "getTags",
               "getPossibleDuplicates",
               "cleanEditorStore"
              ]),
          ...mapActions("record", ["resetRecord"]),
          async getData(){
            await this.getCountries();
            await this.getRecordTypes();
            await this.getTags();
          },
          async createRecord(){
            this.message = {
              error: false,
              value: null
            };

            let record = JSON.parse(JSON.stringify(this.getSection("generalInformation").data));
            // The user has not specified to ignore the warning of duplicate records.
            // So, a check is made to see if the server reports any possibilities
            if (!this.submitAnyway) {
              record = await this.checkForDups(record);
            }

            if (this.submitAnyway) {
              if (this.possibleDuplicates.length > 0) {
                record.dups_suspected = true;
              }
              else {
                record.dups_suspected = false;
              }
            }
            else {
              if (this.possibleDuplicates.length > 0) {
                return;
              }
            }

            this.loading = true;

            record.record_type_id = record.type.id;
            record.metadata.status = status;
            record.country_ids = record.countries.map(obj => obj.id);
            record.metadata.status = record.status;

            delete record.status;
            delete record.countries;
            delete record.type;
            let new_record = await restClient.createRecord(record, this.user().credentials.token);
            if (new_record.error) {
              this.message = {
                error: true,
                value: new_record.error
              }
            }
            else {
              this.recordCreated = true;
              this.newRecord = new_record;
            }
          },
          redirectToEdit(record) {
            this.recordCreated = false;
            this.$router.push({
              path: record.data.id + "/edit"
            });
          },
          async checkForDups(record) {
            const _module = this;
            // run the dup check query, using stored_name, stored_abbreviation or stored_homepage; any that
            // are over three characters in length.
            let fieldsToQuery = [];
            // These are only queried if they are at least 6 characters...
            [record.metadata.name, record.metadata.abbreviation].forEach(function(val) {
              /* istanbul ignore else */
              if (val === null) {
                return;
              }
              if (val.trim().length >= 3) {
                fieldsToQuery.push(val);
              }
            });
            // ...whereas any length URL will do if it is valid.
            let urlCheck = _module.rules.isUrl();
            /* istanbul ignore next */
            if (urlCheck(record.metadata.homepage)) {
              fieldsToQuery.push(record.metadata.homepage)
            }
            /* istanbul ignore if */
            if (fieldsToQuery.length === 0) {
              return;
            }
            // Now send the query.
            await _module.getPossibleDuplicates({fields: fieldsToQuery});
            if (_module.possibleDuplicates.length > 0) {
              record.dups_suspected = true;
            }
            return record;
          },
          setSubmitAnyway() {
            this.submitAnyway = true;
          },
          tryAgain() {
            this.submitAnyway = false;
            this.$store.commit("editor/clearPossibleDuplicates");
          }
        }
    }
</script>

<style scoped>
.v-autocomplete__content .v-subheader {
  font-size: 2rem;
  text-transform: capitalize;
}

#autocompleteSelect .v-list-item {
  min-height: 0 !important;
}
</style>