Newer
Older
gnexus-tasks / frontend / src / views / SettingsView.vue
<script setup lang="ts">
import { onMounted, ref } from 'vue'
import { api } from '../api'
import { CURRENCIES } from '../taskui'

// Глобальные настройки: валюта бюджетов выбирается один раз и применяется всюду.

const currency = ref('UAH')
const error = ref('')
const saving = ref(false)
const saved = ref(false)

onMounted(async () => {
  try {
    currency.value = (await api.getSettings()).currency
  } catch (e) {
    error.value = String(e)
  }
})

async function save() {
  error.value = ''
  saved.value = false
  saving.value = true
  try {
    currency.value = (await api.updateSettings({ currency: currency.value })).currency
    saved.value = true
  } catch (e) {
    error.value = String(e)
  } finally {
    saving.value = false
  }
}
</script>

<template>
  <section>
    <GnPageHeader kicker="gntodo" title="Настройки" />

    <GnAlert v-if="error" variant="error">{{ error }}</GnAlert>

    <GnCard>
      <template #title>Валюта бюджетов</template>
      <p class="hint">
        Единица выбирается один раз и применяется во всех суммах: бюджет задачи, оценка затрат.
      </p>
      <GnSelect
        v-model="currency"
        label="Единица измерения"
        :options="CURRENCIES.map((c) => ({ value: c.value, label: c.label }))"
      />
      <div class="form-actions">
        <GnButton
          variant="primary"
          icon="ph-floppy-disk"
          :disabled="saving"
          @click="save"
        >
          Сохранить
        </GnButton>
      </div>
      <GnAlert v-if="saved" variant="success">Сохранено — применяется во всех видах.</GnAlert>
    </GnCard>
  </section>
</template>

<style scoped>
.hint {
  color: var(--muted, #888);
  margin: 0 0 0.75rem;
}
.form-actions {
  margin-top: 0.75rem;
}
.form-actions + .alert,
:deep(.alert) {
  margin-top: 0.75rem;
}
</style>