Skip to content
Snippets Groups Projects
Select Git revision
  • b5d44f382964dd14dc1cd25df69fa5e671319c75
  • master default protected
  • Issue/2960-infiniteLoop
  • Issue/2960-fixValidationForAP
  • dev protected
  • Issue/2920-fixRemovingValues
  • Hotfix/2957-styleAndUpgrade
  • Hotfix/2955-storingFail
  • Issue/2943-uiFeedback
  • Issue/2551-enhanceSymbolDescriptionsInApplicationProfile
  • Issue/2598-vue3
  • Issue/2804-templateUI
  • Issue/2805-ignoreTemplatingValues
  • Issue/2851-fixBooleanInFormGenerator
  • Issue/2759-showMissingField
  • Issue/2703-vocabularyList
  • Issue/2729-fixSlowLoadingOfInstances
  • Issue/2525-fixedFixValues
  • Hotfix/2681-validationErrors
  • testing
  • Issue/2408-hasValue
  • v4.0.5
  • v4.0.4
  • v4.0.3
  • v4.0.2
  • v4.0.1
  • v4.0.0
  • v3.6.3
  • v3.6.2
  • v3.6.1
  • v3.6.0
  • v3.5.7
  • v3.5.6
  • v3.5.5
  • v3.5.4
  • v3.5.3
  • v3.5.2
  • v3.5.1
  • v3.5.0
  • v3.4.0
  • v3.3.0
41 results

InputTextField.vue

Blame
Benedikt Heinrichs's avatar
Benedikt Heinrichs authored and Petar Hristov committed
9c0c80a6
History
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
InputTextField.vue 3.39 KiB
<template>
  <b-form-input
    v-if="singleLine"
    v-model="object.value"
    :disabled="disabledMode || locked"
    :required="required"
    :state="state"
    :type="type"
    @input="input"
  />
  <b-form-textarea
    v-else
    v-model="object.value"
    :disabled="disabledMode || locked"
    :required="required"
    :state="state"
    :type="type"
    @input="input"
  />
</template>

<script lang="ts">
import { BFormInput, BFormTextarea } from 'bootstrap-vue';

import type { NamedNode, Quad_Object } from 'rdf-js';
import prefixes from '@zazuko/prefixes/prefixes';
import factory from 'rdf-ext';

import { defineComponent } from 'vue-demi';
import type { PropType } from 'vue-demi';
import type { User } from '@/types/user';

export default defineComponent({
  name: 'InputTextField',
  components: {
    BFormInput,
    BFormTextarea,
  },
  props: {
    locked: {
      default: false,
      type: Boolean,
    },
    required: {
      default: false,
      type: Boolean,
    },
    singleLine: {
      default: false,
      type: Boolean,
    },
    entry: {
      required: true,
      type: Object as PropType<Quad_Object>,
    },
    dataType: {
      default: () => factory.namedNode(prefixes.xsd + 'string'),
      type: Object as PropType<NamedNode<string>>,
    },
    fixedValueMode: {
      default: false,
      type: Boolean,
    },
    nodeName: {
      default: '',
      type: String,
    },
    disabledMode: {
      default: false,
      type: Boolean,
    },
    state: {
      type: [Boolean, Object],
      default: null,
    },
    userReceiver: {
      default: () => {
        return async () => ({});
      },
      type: Function as PropType<() => Promise<User>>,
    },
  },
  data() {
    return {
      object: factory.literal('', this.dataType),
    };
  },
  computed: {
    type(): string {
      const dataType = this.dataType.value;
      if (dataType.endsWith('#dateTime')) {
        return 'datetime-local';
      } else if (
        dataType.endsWith('#byte') ||
        dataType.endsWith('#int') ||
        dataType.endsWith('#short') ||
        dataType.endsWith('#integer') ||
        dataType.endsWith('#long') ||
        dataType.endsWith('#unsignedByte') ||
        dataType.endsWith('#unsignedShort') ||
        dataType.endsWith('#unsignedInt') ||
        dataType.endsWith('#unsignedLong')
      ) {
        return 'number';
      }
      return 'text';
    },
  },
  watch: {
    entry() {
      this.loadData();
    },
  },
  mounted() {
    // take whatever is defined in metadata now and try to get the content if we are not in fixed value mode
    this.replacePlaceholder();
    this.loadData();
  },
  methods: {
    input() {
      if (this.type === 'datetime-local') {
        this.object.value += ':00';
      }
      this.$emit('input', this.object);
    },
    loadData() {
      if (this.object.value !== this.entry.value) {
        this.object.value = this.entry.value;
      }
    },
    replacePlaceholder() {
      if (!this.fixedValueMode) {
        if (this.entry.value === '{ME}') {
          this.retrieveUser();
        }
      }
    },
    async retrieveUser() {
      try {
        const user = await this.userReceiver();
        if (user.displayName) {
          this.object.value = user.displayName;
          this.$emit('input', this.object);
        }
      } catch (e) {
        // No user exists
        console.error(e);
      }
    },
  },
});
</script>

<style scoped></style>