FormLockField.vue 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. <script setup>
  2. import { useIdGenerator } from '@/composables/helpers'
  3. import { UseColorMode } from '@vueuse/components'
  4. defineOptions({
  5. inheritAttrs: false
  6. })
  7. const { inputId } = useIdGenerator(props.inputType, props.fieldName)
  8. const props = defineProps({
  9. modelValue: [String, Number, Boolean],
  10. isEditMode: {
  11. type: Boolean,
  12. default: false
  13. },
  14. label: {
  15. type: String,
  16. default: ''
  17. },
  18. fieldName: {
  19. type: String,
  20. default: '',
  21. required: true
  22. },
  23. fieldError: [String],
  24. inputType: {
  25. type: String,
  26. default: 'text'
  27. },
  28. placeholder: {
  29. type: String,
  30. default: ''
  31. },
  32. help: {
  33. type: String,
  34. default: ''
  35. },
  36. hasOffset: {
  37. type: Boolean,
  38. default: false
  39. },
  40. isDisabled: {
  41. type: Boolean,
  42. default: false
  43. },
  44. isExpanded: {
  45. type: Boolean,
  46. default: true
  47. },
  48. maxLength: {
  49. type: Number,
  50. default: null
  51. }
  52. })
  53. const fieldIsLocked = ref(props.isDisabled || props.isEditMode)
  54. </script>
  55. <template>
  56. <div class="field" style="margin-bottom: 0.5rem;">
  57. <label :for="inputId" class="label" v-html="$t(label)" />
  58. </div>
  59. <div class="field has-addons" :class="{ 'pt-3' : hasOffset }">
  60. <div class="control" :class="{ 'is-expanded': isExpanded }">
  61. <input
  62. :disabled="fieldIsLocked"
  63. :id="inputId"
  64. :type="inputType"
  65. class="input"
  66. :value="modelValue"
  67. :placeholder="placeholder"
  68. v-bind="$attrs"
  69. v-on:change="$emit('update:modelValue', $event.target.value)"
  70. :maxlength="maxLength"
  71. />
  72. </div>
  73. <UseColorMode v-slot="{ mode }" v-if="isEditMode">
  74. <div class="control" v-if="fieldIsLocked">
  75. <button type="button" class="button field-lock" :class="{'is-dark' : mode == 'dark'}" @click.stop="fieldIsLocked = false" :title="$t('twofaccounts.forms.unlock.title')">
  76. <span class="icon">
  77. <FontAwesomeIcon :icon="['fas', 'lock']" />
  78. </span>
  79. </button>
  80. </div>
  81. <div class="control" v-else>
  82. <button type="button" class="button field-unlock" :class="{'is-dark' : mode == 'dark'}" @click.stop="fieldIsLocked = true" :title="$t('twofaccounts.forms.lock.title')">
  83. <span class="icon has-text-danger">
  84. <FontAwesomeIcon :icon="['fas', 'lock-open']" />
  85. </span>
  86. </button>
  87. </div>
  88. </UseColorMode>
  89. </div>
  90. <FieldError v-if="fieldError != undefined" :error="fieldError" :field="fieldName" />
  91. <p class="help" v-html="$t(help)" v-if="help"></p>
  92. </template>