SpeciesFileGroup/taxonworks

View on GitHub
app/javascript/vue/tasks/namespaces/new_namespace/app.vue

Summary

Maintainability
Test Coverage
<template>
  <div class="namespace">
    <h1>{{ namespace.id ? 'Edit' : 'New' }} namespace</h1>
    <v-navbar>
      <div class="flex-separate middle">
        <a
          v-if="namespace.id"
          :href="`/namespaces/${namespace.id}`"
        >
          {{ getPreview }}
        </a>
        <span v-else>{{ getPreview }}</span>

        <div>
          <v-pin
            class="margin-small-right"
            type="Namespace"
            :object-id="namespace.id"
          />
          <namespace-save
            class="margin-small-right"
            :namespace="namespace"
            @onSave="setNamespace"
          />
          <v-btn
            color="primary"
            medium
            @click="resetForm"
          >
            New
          </v-btn>
        </div>
      </div>
    </v-navbar>
    <div class="namespace__layout">
      <block-layout>
        <template #header>
          <h3>Namespace</h3>
        </template>
        <template #body>
          <div class="horizontal-left-content align-start">
            <namespace-form v-model="namespace" />
          </div>
        </template>
      </block-layout>
      <namespace-match
        v-if="!namespace.id"
        :name="namespace.name"
        @onSelect="setNamespace"
      />
    </div>
  </div>
</template>

<script setup>
import { ref, computed, onBeforeMount } from 'vue'
import { Namespace } from '@/routes/endpoints'
import { RouteNames } from '@/routes/routes'
import NamespaceForm from './components/Namespace/NamespaceForm.vue'
import NamespaceMatch from './components/Namespace/NamespaceMatch.vue'
import NamespaceSave from './components/Namespace/NamespaceSave.vue'
import BlockLayout from '@/components/layout/BlockLayout'
import VBtn from '@/components/ui/VBtn/index.vue'
import VPin from '@/components/ui/Button/ButtonPin.vue'
import VNavbar from '@/components/layout/NavBar.vue'
import SetParam from '@/helpers/setParam'
import makeNamespace from './const/namespace.js'
import Types from './const/types.js'

const namespace = ref({})
const getPreview = computed(() => {
  const type = namespace.value.delimiter
  const shortName = namespace.value.short_name || '<short_name>'

  if (namespace.value.is_virtual) {
    return ''
  }

  switch (type) {
    case Types['Single whitespace']:
      return `${shortName} 123`
    case Types.None:
      return `${shortName}123`
    default:
      return `${shortName}${type || ''}123`
  }
})

onBeforeMount(async () => {
  const urlParams = new URLSearchParams(window.location.search)
  const namespaceId = urlParams.get('namespace_id')

  namespace.value = namespaceId
    ? (await Namespace.find(namespaceId)).body
    : makeNamespace()
})

const setNamespace = (value) => {
  namespace.value = value
  SetParam(RouteNames.NewNamespace, 'namespace_id', value.id)
}

const resetForm = () => {
  setNamespace(makeNamespace())
}
</script>

<script>
export default {
  name: 'NewNamespace'
}
</script>

<style scoped lang="scss">
.namespace {
  margin: 0 auto;
  max-width: 1240px;

  &__layout {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
    gap: 1em;
  }
}
</style>