mirror of
https://github.com/TandoorRecipes/recipes.git
synced 2026-01-02 12:49:02 -05:00
new settings page finished
This commit is contained in:
@@ -1,20 +1,67 @@
|
||||
<template>
|
||||
<div>
|
||||
<code>Authorization: Bearer TOKEN</code> or<br/>
|
||||
|
||||
<b-alert show variant="danger">
|
||||
The API is made for developers to interact with the application.
|
||||
It is possible to break things using the API so be careful and create a backup first.
|
||||
The API definition can and will change in the future, make sure to read the changelog to spot changes early
|
||||
on.
|
||||
|
||||
<b-button-toolbar>
|
||||
<b-button-group class="mx-1">
|
||||
<a :href="resolveDjangoUrl('docs_api')" class="btn btn-info" target="_blank"
|
||||
rel="noreferrer nofollow">Docs</a>
|
||||
</b-button-group>
|
||||
<b-button-group class="mx-1">
|
||||
<a :href="resolveDjangoUrl('api:api-root')" class="btn btn-success" target="_blank"
|
||||
rel="noreferrer nofollow">Interactive API Browser</a>
|
||||
</b-button-group>
|
||||
</b-button-toolbar>
|
||||
|
||||
</b-alert>
|
||||
|
||||
Authentication works by proving the word <code>Bearer</code> followed by an API Token as a request Authorization
|
||||
header as shown below. <br/>
|
||||
<code>Authorization: Bearer TOKEN</code> -or-<br/>
|
||||
<code>curl -X GET http://your.domain.com/api/recipes/ -H 'Authorization:
|
||||
Bearer TOKEN'</code>
|
||||
|
||||
<br/>
|
||||
<br/>
|
||||
You can have multiple tokens and each token can have its own scope. Currently there is <code>read</code>, <code>write</code>
|
||||
and <code>bookmarklet</code>.
|
||||
Read and write do what the name says, the bookmarklet scope is only used for the bookmarklet to limit access to
|
||||
it.
|
||||
|
||||
<b-alert show variant="info">Make sure to save your token after creation as they cannot be viewed afterwards.
|
||||
</b-alert>
|
||||
|
||||
<b-list-group class="mt-3">
|
||||
<b-list-group-item v-for="t in access_tokens" v-bind:key="t.id">{{ t.token }}<br/><small class="text-muted">{{
|
||||
t.scope
|
||||
}}
|
||||
- {{ t.expires }}</small>
|
||||
<b-button @click="active_token=t; generic_action = Actions.UPDATE;">Edit</b-button>
|
||||
<b-button @click="active_token=t; generic_action = Actions.DELETE;">Delete</b-button>
|
||||
<b-list-group-item v-for="t in access_tokens" v-bind:key="t.id">
|
||||
<div class="row">
|
||||
<div class="col-9">
|
||||
{{ t.token }}<br/>
|
||||
<small>
|
||||
<span class="text-muted">Scope:</span> <code>{{ t.scope }}</code> <span class="text-muted">Expires:</span>
|
||||
{{ formatDate(t.expires) }}
|
||||
</small>
|
||||
|
||||
</div>
|
||||
<div class="col-3">
|
||||
<b-button-group>
|
||||
<b-button variant="primary" @click="active_token=t; generic_action = Actions.UPDATE;"><i
|
||||
class="far fa-edit"></i></b-button>
|
||||
<b-button variant="danger" @click="active_token=t; generic_action = Actions.DELETE;"><i
|
||||
class="fas fa-trash-alt"></i></b-button>
|
||||
</b-button-group>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</b-list-group-item>
|
||||
</b-list-group>
|
||||
|
||||
<b-button @click="generic_action=Actions.CREATE">NEW</b-button>
|
||||
<b-button class="mt-1" variant="success" @click="generic_action=Actions.CREATE">{{ $t('New') }}</b-button>
|
||||
|
||||
<generic-modal-form :model="Models.ACCESS_TOKEN" :action="generic_action" :show="generic_action !== null"
|
||||
:item1="active_token"
|
||||
@@ -24,10 +71,11 @@
|
||||
|
||||
<script>
|
||||
import {ApiApiFactory} from "@/utils/openapi/api";
|
||||
import {ApiMixin, StandardToasts} from "@/utils/utils";
|
||||
import {ApiMixin, ResolveUrlMixin, StandardToasts} from "@/utils/utils";
|
||||
|
||||
import axios from "axios";
|
||||
import GenericModalForm from "@/components/Modals/GenericModalForm";
|
||||
import moment from "moment";
|
||||
|
||||
axios.defaults.xsrfCookieName = 'csrftoken'
|
||||
axios.defaults.xsrfHeaderName = "X-CSRFTOKEN"
|
||||
@@ -35,7 +83,7 @@ axios.defaults.xsrfHeaderName = "X-CSRFTOKEN"
|
||||
export default {
|
||||
name: "APISettingsComponent",
|
||||
components: {GenericModalForm},
|
||||
mixins: [ApiMixin,],
|
||||
mixins: [ApiMixin, ResolveUrlMixin],
|
||||
props: {
|
||||
user_id: Number,
|
||||
},
|
||||
@@ -52,6 +100,10 @@ export default {
|
||||
this.loadTokens()
|
||||
},
|
||||
methods: {
|
||||
formatDate: function (datetime) {
|
||||
moment.locale(window.navigator.language);
|
||||
return moment(datetime).format('L')
|
||||
},
|
||||
loadTokens: function () {
|
||||
let apiFactory = new ApiApiFactory()
|
||||
apiFactory.listAccessTokens().then(result => {
|
||||
|
||||
@@ -1,15 +1,32 @@
|
||||
<template>
|
||||
<div>
|
||||
<div v-if="user !== undefined">
|
||||
|
||||
<b-form-input v-model="user.username" @change="updateUser(false)" disabled></b-form-input>
|
||||
<b-form-input v-model="user.first_name" @change="updateUser(false)"></b-form-input>
|
||||
<b-form-input v-model="user.last_name" @change="updateUser(false)"></b-form-input>
|
||||
<div v-if="user !== undefined">
|
||||
<b-form-group :label="$t('Username')">
|
||||
<b-form-input v-model="user.username" @change="updateUser(false)" disabled></b-form-input>
|
||||
</b-form-group>
|
||||
|
||||
<b-form-group :label="$t('First_name')">
|
||||
<b-form-input v-model="user.first_name" @change="updateUser(false)" :placeholder="$t('First_name')"></b-form-input>
|
||||
</b-form-group>
|
||||
|
||||
<b-form-group :label="$t('Last_name')">
|
||||
<b-form-input v-model="user.last_name" @change="updateUser(false)" :placeholder="$t('Last_name')"></b-form-input>
|
||||
</b-form-group>
|
||||
|
||||
</div>
|
||||
|
||||
<a :href="resolveDjangoUrl('account_email')" class="btn btn-primary">Emails</a>
|
||||
<a :href="resolveDjangoUrl('account_change_password')" class="btn btn-primary">Password</a>
|
||||
<a :href="resolveDjangoUrl('socialaccount_connections')" class="btn btn-primary">Social</a>
|
||||
<b-button-toolbar>
|
||||
<b-button-group class="mx-1">
|
||||
<a :href="resolveDjangoUrl('account_email')" class="btn btn-primary">{{ $t('Manage_Emails') }}</a>
|
||||
</b-button-group>
|
||||
<b-button-group class="mx-1">
|
||||
<a :href="resolveDjangoUrl('account_change_password')" class="btn btn-primary">{{ $t('Change_Password') }}</a>
|
||||
</b-button-group>
|
||||
<b-button-group class="mx-1">
|
||||
<a :href="resolveDjangoUrl('socialaccount_connections')" class="btn btn-primary">{{ $t('Social_Authentication') }}</a>
|
||||
</b-button-group>
|
||||
</b-button-toolbar>
|
||||
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -1,54 +1,83 @@
|
||||
<template>
|
||||
<div v-if="user_preferences !== undefined">
|
||||
|
||||
<b-form-input v-model="user_preferences.default_unit" @change="updateSettings"></b-form-input>
|
||||
<b-form-group :label="$t('Default_Unit')">
|
||||
<b-form-input v-model="user_preferences.default_unit" @change="updateSettings(false)"></b-form-input>
|
||||
</b-form-group>
|
||||
|
||||
{{ user_preferences.ingredient_decimals }}
|
||||
<b-form-input type="range" min="0" max="4" step="1" v-model="user_preferences.ingredient_decimals"
|
||||
@change="updateSettings"></b-form-input>
|
||||
<b-form-group :label="$t('Decimals')">
|
||||
<b-form-input type="number" min="0" max="4" step="1" v-model="user_preferences.ingredient_decimals"
|
||||
@change="updateSettings(false)"></b-form-input>
|
||||
</b-form-group>
|
||||
|
||||
<b-form-checkbox v-model="user_preferences.use_fractions" @change="updateSettings"></b-form-checkbox>
|
||||
<b-form-group :description="$t('Use_Fractions_Help')">
|
||||
<b-form-checkbox v-model="user_preferences.use_fractions" @change="updateSettings(false)">
|
||||
{{ $t('Use_Fractions') }}
|
||||
</b-form-checkbox>
|
||||
</b-form-group>
|
||||
|
||||
<hr/>
|
||||
Language
|
||||
<b-form-select v-model="$i18n.locale" @change="updateLanguage">
|
||||
<b-form-select-option v-bind:key="l[0]" v-for="l in languages" :value="l[1]">{{ l[0] }} ({{
|
||||
l[1]
|
||||
}})
|
||||
</b-form-select-option>
|
||||
</b-form-select>
|
||||
<b-form-group>
|
||||
<b-form-checkbox v-model="user_preferences.use_kj" @change="updateSettings(false);">{{ $t('Use_Kj') }}
|
||||
</b-form-checkbox>
|
||||
</b-form-group>
|
||||
<b-form-group>
|
||||
<b-form-checkbox v-model="user_preferences.comments" @change="updateSettings(false);">
|
||||
{{ $t('Comments_setting') }}
|
||||
</b-form-checkbox>
|
||||
</b-form-group>
|
||||
<b-form-group :description="$t('left_handed_help')">
|
||||
<b-form-checkbox v-model="user_preferences.left_handed" @change="updateSettings(false);">
|
||||
{{ $t('left_handed') }}
|
||||
</b-form-checkbox>
|
||||
</b-form-group>
|
||||
|
||||
<b-form-select v-model="user_preferences.theme" @change="updateSettings(true);">
|
||||
<b-form-select-option value="TANDOOR">Tandoor</b-form-select-option>
|
||||
<b-form-select-option value="BOOTSTRAP">Bootstrap</b-form-select-option>
|
||||
<b-form-select-option value="DARKLY">Darkly</b-form-select-option>
|
||||
<b-form-select-option value="FLATLY">Flatly</b-form-select-option>
|
||||
<b-form-select-option value="SUPERHERO">Superhero</b-form-select-option>
|
||||
</b-form-select>
|
||||
|
||||
<b-form-checkbox v-model="user_preferences.sticky_navbar" @change="updateSettings(true);"></b-form-checkbox>
|
||||
|
||||
<b-form-select v-model="user_preferences.nav_color" @change="updateSettings(true);">
|
||||
<b-form-select-option value="PRIMARY">Primary</b-form-select-option>
|
||||
<b-form-select-option value="SECONDARY">Secondary</b-form-select-option>
|
||||
<b-form-select-option value="SUCCESS">Success</b-form-select-option>
|
||||
<b-form-select-option value="INFO">Info</b-form-select-option>
|
||||
<b-form-select-option value="WARNING">Warning</b-form-select-option>
|
||||
<b-form-select-option value="DANGER">Danger</b-form-select-option>
|
||||
<b-form-select-option value="LIGHT">Light</b-form-select-option>
|
||||
<b-form-select-option value="DARK">Dark</b-form-select-option>
|
||||
</b-form-select>
|
||||
|
||||
<hr/>
|
||||
|
||||
<b-form-checkbox v-model="user_preferences.use_kj" @change="updateSettings();"></b-form-checkbox>
|
||||
<b-form-checkbox v-model="user_preferences.comments" @change="updateSettings();"></b-form-checkbox>
|
||||
<b-form-checkbox v-model="user_preferences.left_handed" @change="updateSettings();"></b-form-checkbox>
|
||||
<b-form-group :label="$t('Language')">
|
||||
<b-form-select v-model="$i18n.locale" @change="updateLanguage">
|
||||
<b-form-select-option v-bind:key="l[0]" v-for="l in languages" :value="l[1]">{{ l[0] }} ({{
|
||||
l[1]
|
||||
}})
|
||||
</b-form-select-option>
|
||||
</b-form-select>
|
||||
|
||||
</b-form-group>
|
||||
<b-form-group :label="$t('Theme')">
|
||||
<b-form-select v-model="user_preferences.theme" @change="updateSettings(true);">
|
||||
<b-form-select-option value="TANDOOR">Tandoor</b-form-select-option>
|
||||
<b-form-select-option value="BOOTSTRAP">Bootstrap</b-form-select-option>
|
||||
<b-form-select-option value="DARKLY">Darkly</b-form-select-option>
|
||||
<b-form-select-option value="FLATLY">Flatly</b-form-select-option>
|
||||
<b-form-select-option value="SUPERHERO">Superhero</b-form-select-option>
|
||||
</b-form-select>
|
||||
|
||||
</b-form-group>
|
||||
<b-form-group :description="$t('Sticky_Nav_Help')">
|
||||
<b-form-checkbox v-model="user_preferences.sticky_navbar" @change="updateSettings(true);">
|
||||
{{ $t('Sticky_Nav') }}
|
||||
</b-form-checkbox>
|
||||
</b-form-group>
|
||||
<b-form-group :label="$t('Nav_Color')" :description="$t('Nav_Color_Help')">
|
||||
<b-form-select v-model="user_preferences.nav_color" @change="updateSettings(true);">
|
||||
<b-form-select-option value="PRIMARY">Primary</b-form-select-option>
|
||||
<b-form-select-option value="SECONDARY">Secondary</b-form-select-option>
|
||||
<b-form-select-option value="SUCCESS">Success</b-form-select-option>
|
||||
<b-form-select-option value="INFO">Info</b-form-select-option>
|
||||
<b-form-select-option value="WARNING">Warning</b-form-select-option>
|
||||
<b-form-select-option value="DANGER">Danger</b-form-select-option>
|
||||
<b-form-select-option value="LIGHT">Light</b-form-select-option>
|
||||
<b-form-select-option value="DARK">Dark</b-form-select-option>
|
||||
</b-form-select>
|
||||
|
||||
</b-form-group>
|
||||
|
||||
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
|
||||
import {ApiApiFactory} from "@/utils/openapi/api";
|
||||
import {resolveDjangoUrl, StandardToasts} from "@/utils/utils";
|
||||
|
||||
@@ -69,6 +98,8 @@ export default {
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.$i18n.locale = window.CUSTOM_LOCALE
|
||||
|
||||
this.user_preferences = this.preferences
|
||||
this.languages = window.AVAILABLE_LANGUAGES
|
||||
this.loadSettings()
|
||||
@@ -86,7 +117,7 @@ export default {
|
||||
let apiFactory = new ApiApiFactory()
|
||||
apiFactory.partialUpdateUserPreference(this.user_id.toString(), this.user_preferences).then(result => {
|
||||
StandardToasts.makeStandardToast(this, StandardToasts.SUCCESS_UPDATE)
|
||||
if (reload !== undefined) {
|
||||
if (reload) {
|
||||
location.reload()
|
||||
}
|
||||
}).catch(err => {
|
||||
|
||||
@@ -1,15 +1,16 @@
|
||||
<template>
|
||||
<div v-if="user_preferences !== undefined">
|
||||
|
||||
<generic-multiselect
|
||||
@change="updateSettings(false)"
|
||||
:model="Models.USER"
|
||||
:initial_selection="user_preferences.plan_share"
|
||||
label="display_name"
|
||||
:multiple="true"
|
||||
:placeholder="$t('User')"
|
||||
></generic-multiselect>
|
||||
|
||||
<b-form-group :label="$t('Share')" :description="$t('plan_share_desc')">
|
||||
<generic-multiselect
|
||||
@change="updateSettings(false)"
|
||||
:model="Models.USER"
|
||||
:initial_selection="user_preferences.plan_share"
|
||||
label="display_name"
|
||||
:multiple="true"
|
||||
:placeholder="$t('User')"
|
||||
></generic-multiselect>
|
||||
</b-form-group>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
||||
@@ -1,13 +1,32 @@
|
||||
<template>
|
||||
<div v-if="user_preferences !== undefined">
|
||||
<div>
|
||||
|
||||
|
||||
<a :href="resolveDjangoUrl('view_shopping_settings')" class="btn btn-primary">Search Settings</a>
|
||||
<div v-if="false">
|
||||
<!--TODO search must fundamentally be reworked, thus i was to lazy to implement the settings -->
|
||||
|
||||
method
|
||||
|
||||
unpercice
|
||||
|
||||
accent
|
||||
|
||||
partial
|
||||
start with
|
||||
fuzzy
|
||||
full text
|
||||
trigram
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {ApiApiFactory} from "@/utils/openapi/api";
|
||||
import {StandardToasts} from "@/utils/utils";
|
||||
import {ResolveUrlMixin, StandardToasts} from "@/utils/utils";
|
||||
|
||||
import axios from "axios";
|
||||
|
||||
@@ -16,40 +35,20 @@ axios.defaults.xsrfHeaderName = "X-CSRFTOKEN"
|
||||
|
||||
export default {
|
||||
name: "SearchSettingsComponent",
|
||||
mixins: [ResolveUrlMixin],
|
||||
props: {
|
||||
user_id: Number,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
user_preferences: undefined,
|
||||
languages: [],
|
||||
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.user_preferences = this.preferences
|
||||
this.languages = window.AVAILABLE_LANGUAGES
|
||||
this.loadSettings()
|
||||
|
||||
},
|
||||
methods: {
|
||||
loadSettings: function () {
|
||||
let apiFactory = new ApiApiFactory()
|
||||
apiFactory.retrieveUserPreference(this.user_id.toString()).then(result => {
|
||||
this.user_preferences = result.data
|
||||
}).catch(err => {
|
||||
StandardToasts.makeStandardToast(this, StandardToasts.FAIL_FETCH, err)
|
||||
})
|
||||
},
|
||||
updateSettings: function (reload) {
|
||||
let apiFactory = new ApiApiFactory()
|
||||
apiFactory.partialUpdateUserPreference(this.user_id.toString(), this.user_preferences).then(result => {
|
||||
StandardToasts.makeStandardToast(this, StandardToasts.SUCCESS_UPDATE)
|
||||
if (reload !== undefined) {
|
||||
location.reload()
|
||||
}
|
||||
}).catch(err => {
|
||||
StandardToasts.makeStandardToast(this, StandardToasts.FAIL_UPDATE, err)
|
||||
})
|
||||
},
|
||||
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -1,32 +1,92 @@
|
||||
<template>
|
||||
<div v-if="user_preferences !== undefined">
|
||||
<b-form-group :label="$t('shopping_share')" :description="$t('shopping_share_desc')">
|
||||
<generic-multiselect
|
||||
@change="updateSettings(false)"
|
||||
:model="Models.USER"
|
||||
:initial_selection="user_preferences.shopping_share"
|
||||
label="display_name"
|
||||
:multiple="true"
|
||||
:placeholder="$t('User')"
|
||||
></generic-multiselect>
|
||||
</b-form-group>
|
||||
|
||||
<generic-multiselect
|
||||
@change="updateSettings(false)"
|
||||
:model="Models.USER"
|
||||
:initial_selection="user_preferences.shopping_share"
|
||||
label="display_name"
|
||||
:multiple="true"
|
||||
:placeholder="$t('User')"
|
||||
></generic-multiselect>
|
||||
<b-form-group :label="$t('shopping_auto_sync')" :description="$t('shopping_auto_sync_desc')">
|
||||
<b-form-input type="range" :min="SHOPPING_MIN_AUTOSYNC_INTERVAL" max="60" step="1" v-model="user_preferences.shopping_auto_sync"
|
||||
@change="updateSettings(false)"></b-form-input>
|
||||
<div class="text-center">
|
||||
<span v-if="user_preferences.shopping_auto_sync > 0">
|
||||
{{ Math.round(user_preferences.shopping_auto_sync) }}
|
||||
<span v-if="user_preferences.shopping_auto_sync === 1">{{ $t('Second') }}</span>
|
||||
<span v-else> {{ $t('Seconds') }}</span>
|
||||
</span>
|
||||
|
||||
<!--TODO load min autosync time from env -->
|
||||
<b-form-input type="range" min="0" max="60" step="1" v-model="user_preferences.shopping_auto_sync"
|
||||
@change="updateSettings(false)"></b-form-input>
|
||||
<span v-if="user_preferences.shopping_auto_sync < 1">{{ $t('Disable') }}</span>
|
||||
</div>
|
||||
<br/>
|
||||
<b-button class="btn btn-sm" @click="user_preferences.shopping_auto_sync = 0">{{ $t('Disabled') }}</b-button>
|
||||
</b-form-group>
|
||||
|
||||
<b-form-checkbox v-model="user_preferences.mealplan_autoadd_shopping" @change="updateSettings(false)"></b-form-checkbox>
|
||||
<b-form-checkbox v-model="user_preferences.mealplan_autoexclude_onhand" @change="updateSettings(false)"></b-form-checkbox>
|
||||
<b-form-checkbox v-model="user_preferences.mealplan_autoinclude_related" @change="updateSettings(false)"></b-form-checkbox>
|
||||
<b-form-checkbox v-model="user_preferences.shopping_add_onhand" @change="updateSettings(false)"></b-form-checkbox>
|
||||
<b-form-group :description="$t('mealplan_autoadd_shopping_desc')">
|
||||
<b-form-checkbox v-model="user_preferences.mealplan_autoadd_shopping"
|
||||
@change="updateSettings(false)">{{ $t('mealplan_autoadd_shopping') }}
|
||||
</b-form-checkbox>
|
||||
</b-form-group>
|
||||
|
||||
<b-form-input type="number" v-model="user_preferences.default_delay" @change="updateSettings(false)"></b-form-input>
|
||||
<b-form-checkbox v-model="user_preferences.filter_to_supermarket" @change="updateSettings(false)"></b-form-checkbox>
|
||||
<b-form-input type="range" min="0" max="14" step="1" v-model="user_preferences.shopping_recent_days"
|
||||
@change="updateSettings(false)"></b-form-input>
|
||||
<b-form-group :description="$t('mealplan_autoexclude_onhand_desc')">
|
||||
<b-form-checkbox v-model="user_preferences.mealplan_autoexclude_onhand"
|
||||
@change="updateSettings(false)">{{ $t('mealplan_autoexclude_onhand') }}
|
||||
</b-form-checkbox>
|
||||
</b-form-group>
|
||||
|
||||
<b-form-group :description="$t('mealplan_autoinclude_related_desc')">
|
||||
<b-form-checkbox v-model="user_preferences.mealplan_autoinclude_related"
|
||||
@change="updateSettings(false)">{{ $t('mealplan_autoinclude_related') }}
|
||||
</b-form-checkbox>
|
||||
</b-form-group>
|
||||
|
||||
<b-form-group :description="$t('shopping_add_onhand_desc')">
|
||||
<b-form-checkbox v-model="user_preferences.shopping_add_onhand"
|
||||
@change="updateSettings(false)">{{ $t('shopping_add_onhand') }}
|
||||
</b-form-checkbox>
|
||||
</b-form-group>
|
||||
|
||||
<b-form-group :label="$t('default_delay')" :description="$t('default_delay_desc')">
|
||||
<b-form-input type="range" min="1" max="72" step="1" v-model="user_preferences.default_delay"
|
||||
@change="updateSettings(false)"></b-form-input>
|
||||
<div class="text-center">
|
||||
<span>{{ Math.round(user_preferences.default_delay) }}
|
||||
<span v-if="user_preferences.default_delay === 1">{{ $t('Hour') }}</span>
|
||||
<span v-else> {{ $t('Hours') }}</span>
|
||||
</span>
|
||||
</div>
|
||||
</b-form-group>
|
||||
|
||||
<b-form-group :description="$t('filter_to_supermarket_desc')">
|
||||
<b-form-checkbox v-model="user_preferences.filter_to_supermarket"
|
||||
@change="updateSettings(false)">{{ $t('filter_to_supermarket') }}
|
||||
</b-form-checkbox>
|
||||
</b-form-group>
|
||||
|
||||
<b-form-group :label="$t('shopping_recent_days')" :description="$t('shopping_recent_days_desc')">
|
||||
<b-form-input type="range" min="0" max="14" step="1" v-model="user_preferences.shopping_recent_days"
|
||||
@change="updateSettings(false)"></b-form-input>
|
||||
<div class="text-center">
|
||||
<span>{{ Math.round(user_preferences.shopping_recent_days) }}
|
||||
<span v-if="user_preferences.shopping_recent_days === 1">{{ $t('Day') }}</span>
|
||||
<span v-else> {{ $t('Days') }}</span>
|
||||
</span>
|
||||
</div>
|
||||
</b-form-group>
|
||||
|
||||
<b-form-group :label="$t('csv_delim_label')" :description="$t('csv_delim_help')">
|
||||
<b-form-input v-model="user_preferences.csv_delim" @change="updateSettings(false)"></b-form-input>
|
||||
</b-form-group>
|
||||
|
||||
<b-form-group :label="$t('csv_prefix_label')" :description="$t('csv_prefix_help')">
|
||||
<b-form-input v-model="user_preferences.csv_prefix" @change="updateSettings(false)"></b-form-input>
|
||||
</b-form-group>
|
||||
|
||||
|
||||
<b-form-input v-model="user_preferences.csv_delim" @change="updateSettings(false)"></b-form-input>
|
||||
<b-form-input v-model="user_preferences.csv_prefix" @change="updateSettings(false)"></b-form-input>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -50,6 +110,7 @@ export default {
|
||||
data() {
|
||||
return {
|
||||
user_preferences: undefined,
|
||||
SHOPPING_MIN_AUTOSYNC_INTERVAL: window.SHOPPING_MIN_AUTOSYNC_INTERVAL,
|
||||
languages: [],
|
||||
}
|
||||
},
|
||||
@@ -69,9 +130,10 @@ export default {
|
||||
},
|
||||
updateSettings: function (reload) {
|
||||
let apiFactory = new ApiApiFactory()
|
||||
this.$emit('updated', this.user_preferences)
|
||||
apiFactory.partialUpdateUserPreference(this.user_id.toString(), this.user_preferences).then(result => {
|
||||
StandardToasts.makeStandardToast(this, StandardToasts.SUCCESS_UPDATE)
|
||||
if (reload !== undefined) {
|
||||
if (reload) {
|
||||
location.reload()
|
||||
}
|
||||
}).catch(err => {
|
||||
|
||||
Reference in New Issue
Block a user