customize date formats
This commit is contained in:
@@ -8,7 +8,7 @@
|
|||||||
</a> -->
|
</a> -->
|
||||||
|
|
||||||
<h1 align="center" style="margin-bottom:0">Hammond</h1>
|
<h1 align="center" style="margin-bottom:0">Hammond</h1>
|
||||||
<p align="center">Current Version - 2021.06.27</p>
|
<p align="center">Current Version - 2021.07.14</p>
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
A self-hosted vehicle expense tracking system with support for multiple users.
|
A self-hosted vehicle expense tracking system with support for multiple users.
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ func udpateSettings(c *gin.Context) {
|
|||||||
func udpateMySettings(c *gin.Context) {
|
func udpateMySettings(c *gin.Context) {
|
||||||
var model models.UpdateSettingModel
|
var model models.UpdateSettingModel
|
||||||
if err := c.ShouldBind(&model); err == nil {
|
if err := c.ShouldBind(&model); err == nil {
|
||||||
err := service.UpdateUserSettings(c.MustGet("userId").(string), model.Currency, *model.DistanceUnit)
|
err := service.UpdateUserSettings(c.MustGet("userId").(string), model.Currency, *model.DistanceUnit, model.DateFormat)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.JSON(http.StatusUnprocessableEntity, common.NewError("udpateMySettings", err))
|
c.JSON(http.StatusUnprocessableEntity, common.NewError("udpateMySettings", err))
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -138,6 +138,7 @@ func MigrateClarkson(connectionString string) (bool, error) {
|
|||||||
DistanceUnit: distanceUnitMap[v.DistanceUnit],
|
DistanceUnit: distanceUnitMap[v.DistanceUnit],
|
||||||
Role: role,
|
Role: role,
|
||||||
Name: v.Username,
|
Name: v.Username,
|
||||||
|
DateFormat: "MM/dd/yyyy",
|
||||||
}
|
}
|
||||||
user.SetPassword("hammond")
|
user.SetPassword("hammond")
|
||||||
err = CreateUser(&user)
|
err = CreateUser(&user)
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ type User struct {
|
|||||||
Password string `json:"-"`
|
Password string `json:"-"`
|
||||||
Currency string `json:"currency"`
|
Currency string `json:"currency"`
|
||||||
DistanceUnit DistanceUnit `json:"distanceUnit"`
|
DistanceUnit DistanceUnit `json:"distanceUnit"`
|
||||||
|
DateFormat string `json:"dateFormat"`
|
||||||
Role Role `json:"role"`
|
Role Role `json:"role"`
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
Vehicles []Vehicle `gorm:"many2many:user_vehicles;" json:"vehicles"`
|
Vehicles []Vehicle `gorm:"many2many:user_vehicles;" json:"vehicles"`
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import "github.com/akhilrex/hammond/db"
|
|||||||
|
|
||||||
type UpdateSettingModel struct {
|
type UpdateSettingModel struct {
|
||||||
Currency string `json:"currency" form:"currency" query:"currency"`
|
Currency string `json:"currency" form:"currency" query:"currency"`
|
||||||
|
DateFormat string `json:"dateFormat" form:"dateFormat" query:"dateFormat"`
|
||||||
DistanceUnit *db.DistanceUnit `json:"distanceUnit" form:"distanceUnit" query:"distanceUnit" `
|
DistanceUnit *db.DistanceUnit `json:"distanceUnit" form:"distanceUnit" query:"distanceUnit" `
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ func UpdateSettings(currency string, distanceUnit db.DistanceUnit) error {
|
|||||||
setting.DistanceUnit = distanceUnit
|
setting.DistanceUnit = distanceUnit
|
||||||
return db.UpdateSettings(setting)
|
return db.UpdateSettings(setting)
|
||||||
}
|
}
|
||||||
func UpdateUserSettings(userId, currency string, distanceUnit db.DistanceUnit) error {
|
func UpdateUserSettings(userId, currency string, distanceUnit db.DistanceUnit, dateFormat string) error {
|
||||||
user, err := db.GetUserById(userId)
|
user, err := db.GetUserById(userId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -22,6 +22,7 @@ func UpdateUserSettings(userId, currency string, distanceUnit db.DistanceUnit) e
|
|||||||
|
|
||||||
user.Currency = currency
|
user.Currency = currency
|
||||||
user.DistanceUnit = distanceUnit
|
user.DistanceUnit = distanceUnit
|
||||||
|
user.DateFormat = dateFormat
|
||||||
return db.UpdateUser(user)
|
return db.UpdateUser(user)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ func CreateUser(userModel *models.RegisterRequest, role db.Role) error {
|
|||||||
Role: role,
|
Role: role,
|
||||||
Currency: setting.Currency,
|
Currency: setting.Currency,
|
||||||
DistanceUnit: setting.DistanceUnit,
|
DistanceUnit: setting.DistanceUnit,
|
||||||
|
DateFormat: "MM/dd/yyyy",
|
||||||
}
|
}
|
||||||
|
|
||||||
toCreate.SetPassword(userModel.Password)
|
toCreate.SetPassword(userModel.Password)
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import QuickEntryDisplay from '@components/quickEntryDisplay.vue'
|
|||||||
import { mapState } from 'vuex'
|
import { mapState } from 'vuex'
|
||||||
import axios from 'axios'
|
import axios from 'axios'
|
||||||
import store from '@state/store'
|
import store from '@state/store'
|
||||||
|
import { format } from 'date-fns'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
page: {
|
page: {
|
||||||
@@ -61,6 +62,10 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
formatDate(date) {
|
||||||
|
const finalFormat = this.me.dateFormat ? this.me.dateFormat : 'MM/dd/yyyy'
|
||||||
|
return format(date, finalFormat)
|
||||||
|
},
|
||||||
getEmptyExpense() {
|
getEmptyExpense() {
|
||||||
return {
|
return {
|
||||||
vehicleId: this.selectedVehicle.id,
|
vehicleId: this.selectedVehicle.id,
|
||||||
@@ -172,7 +177,14 @@ export default {
|
|||||||
</b-select>
|
</b-select>
|
||||||
</b-field>
|
</b-field>
|
||||||
<b-field label="Expense Date">
|
<b-field label="Expense Date">
|
||||||
<b-datepicker v-model="expenseModel.date" placeholder="Click to select..." icon="calendar" :max-date="new Date()"> </b-datepicker>
|
<b-datepicker
|
||||||
|
v-model="expenseModel.date"
|
||||||
|
:date-formatter="formatDate"
|
||||||
|
placeholder="Click to select..."
|
||||||
|
icon="calendar"
|
||||||
|
:max-date="new Date()"
|
||||||
|
>
|
||||||
|
</b-datepicker>
|
||||||
</b-field>
|
</b-field>
|
||||||
<b-field label="Expense Type*">
|
<b-field label="Expense Type*">
|
||||||
<b-input v-model="expenseModel.expenseType" expanded required></b-input>
|
<b-input v-model="expenseModel.expenseType" expanded required></b-input>
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import store from '@state/store'
|
|||||||
import { mapState } from 'vuex'
|
import { mapState } from 'vuex'
|
||||||
import axios from 'axios'
|
import axios from 'axios'
|
||||||
import { round } from 'lodash'
|
import { round } from 'lodash'
|
||||||
|
import { format } from 'date-fns'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
page: {
|
page: {
|
||||||
@@ -69,6 +70,10 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
formatDate(date) {
|
||||||
|
const finalFormat = this.me.dateFormat ? this.me.dateFormat : 'MM/dd/yyyy'
|
||||||
|
return format(date, finalFormat)
|
||||||
|
},
|
||||||
fetchVehicleUsers() {
|
fetchVehicleUsers() {
|
||||||
store
|
store
|
||||||
.dispatch('vehicles/fetchUsersByVehicleId', { vehicleId: this.selectedVehicle.id })
|
.dispatch('vehicles/fetchUsersByVehicleId', { vehicleId: this.selectedVehicle.id })
|
||||||
@@ -186,7 +191,15 @@ export default {
|
|||||||
</b-select>
|
</b-select>
|
||||||
</b-field>
|
</b-field>
|
||||||
<b-field label="Fillup Date">
|
<b-field label="Fillup Date">
|
||||||
<b-datepicker v-model="fillupModel.date" placeholder="Click to select..." icon="calendar" trap-focus :max-date="new Date()"> </b-datepicker>
|
<b-datepicker
|
||||||
|
v-model="fillupModel.date"
|
||||||
|
:date-formatter="formatDate"
|
||||||
|
placeholder="Click to select..."
|
||||||
|
icon="calendar"
|
||||||
|
trap-focus
|
||||||
|
:max-date="new Date()"
|
||||||
|
>
|
||||||
|
</b-datepicker>
|
||||||
</b-field>
|
</b-field>
|
||||||
<b-field label="Quantity*" addons>
|
<b-field label="Quantity*" addons>
|
||||||
<b-input v-model.number="fillupModel.fuelQuantity" type="number" step=".001" min="0" expanded required></b-input>
|
<b-input v-model.number="fillupModel.fuelQuantity" type="number" step=".001" min="0" expanded required></b-input>
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ export default {
|
|||||||
settingsModel: {
|
settingsModel: {
|
||||||
currency: this.me.currency,
|
currency: this.me.currency,
|
||||||
distanceUnit: this.me.distanceUnit,
|
distanceUnit: this.me.distanceUnit,
|
||||||
|
dateFormat: this.me.dateFormat,
|
||||||
},
|
},
|
||||||
tryingToSave: false,
|
tryingToSave: false,
|
||||||
changePassModel: {
|
changePassModel: {
|
||||||
@@ -31,6 +32,7 @@ export default {
|
|||||||
new: '',
|
new: '',
|
||||||
renew: '',
|
renew: '',
|
||||||
},
|
},
|
||||||
|
dateFormatMasters: ['dd/MM/yyyy', 'MM/dd/yyyy', 'yyyy/MM/dd'],
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
@@ -69,9 +71,9 @@ export default {
|
|||||||
.catch((err) => console.log('error:', err))
|
.catch((err) => console.log('error:', err))
|
||||||
})
|
})
|
||||||
.catch((ex) => {
|
.catch((ex) => {
|
||||||
let errorMessage= ex.message;
|
let errorMessage = ex.message
|
||||||
if(ex.response && ex.response.data?.errors?.changePassword){
|
if (ex.response && ex.response.data?.errors?.changePassword) {
|
||||||
errorMessage=ex.response.data?.errors?.changePassword
|
errorMessage = ex.response.data?.errors?.changePassword
|
||||||
}
|
}
|
||||||
this.$buefy.toast.open({
|
this.$buefy.toast.open({
|
||||||
duration: 5000,
|
duration: 5000,
|
||||||
@@ -134,6 +136,13 @@ export default {
|
|||||||
</option>
|
</option>
|
||||||
</b-select>
|
</b-select>
|
||||||
</b-field>
|
</b-field>
|
||||||
|
<b-field label="Date Format">
|
||||||
|
<b-select v-model.number="settingsModel.dateFormat" placeholder="Date Format" required expanded>
|
||||||
|
<option v-for="option in dateFormatMasters" :key="option" :value="option">
|
||||||
|
{{ `${option}` }}
|
||||||
|
</option>
|
||||||
|
</b-select>
|
||||||
|
</b-field>
|
||||||
<br />
|
<br />
|
||||||
<b-field>
|
<b-field>
|
||||||
<b-button tag="input" native-type="submit" :disabled="tryingToSave" type="is-primary" value="Save" expanded> </b-button>
|
<b-button tag="input" native-type="submit" :disabled="tryingToSave" type="is-primary" value="Save" expanded> </b-button>
|
||||||
@@ -172,7 +181,7 @@ export default {
|
|||||||
<table class="table is-hoverable">
|
<table class="table is-hoverable">
|
||||||
<tr>
|
<tr>
|
||||||
<td>Current Version</td>
|
<td>Current Version</td>
|
||||||
<td>2021.06.27</td>
|
<td>2021.07.14</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Website</td>
|
<td>Website</td>
|
||||||
@@ -202,7 +211,7 @@ export default {
|
|||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Support the developer</td>
|
<td>Support the developer</td>
|
||||||
<td><a href="https://www.buymeacoffee.com/akhilrex" target="_blank" rel="noopener noreferrer">Support here</a></td>
|
<td><a href="https://www.buymeacoffee.com/akhilrex" target="_blank" rel="noopener noreferrer">Buy him a beer!</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user