chore: release v0.39.2
This commit is contained in:
@@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [0.39.2] - 2026-05-01
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- **Budget date picker**: the date input in Budget → New Entry / Edit Entry now uses a native date picker on iOS and Android instead of a plain text field.
|
||||||
|
|
||||||
## [0.39.1] - 2026-05-01
|
## [0.39.1] - 2026-05-01
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|||||||
Generated
+2
-2
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "oikos",
|
"name": "oikos",
|
||||||
"version": "0.38.4",
|
"version": "0.39.2",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "oikos",
|
"name": "oikos",
|
||||||
"version": "0.38.4",
|
"version": "0.39.2",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"bcrypt": "^6.0.0",
|
"bcrypt": "^6.0.0",
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "oikos",
|
"name": "oikos",
|
||||||
"version": "0.39.1",
|
"version": "0.39.2",
|
||||||
"description": "Self-hosted family planner - calendar, tasks, shopping, meal planning, budget and more. Private, open-source, no subscription.",
|
"description": "Self-hosted family planner - calendar, tasks, shopping, meal planning, budget and more. Private, open-source, no subscription.",
|
||||||
"main": "server/index.js",
|
"main": "server/index.js",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
|||||||
+5
-13
@@ -8,7 +8,7 @@
|
|||||||
import { api } from '/api.js';
|
import { api } from '/api.js';
|
||||||
import { openModal as openSharedModal, closeModal } from '/components/modal.js';
|
import { openModal as openSharedModal, closeModal } from '/components/modal.js';
|
||||||
import { stagger, vibrate } from '/utils/ux.js';
|
import { stagger, vibrate } from '/utils/ux.js';
|
||||||
import { t, formatDate, getLocale, dateInputPlaceholder, formatDateInput, parseDateInput, isDateInputValid } from '/i18n.js';
|
import { t, formatDate, getLocale } from '/i18n.js';
|
||||||
import { esc } from '/utils/html.js';
|
import { esc } from '/utils/html.js';
|
||||||
|
|
||||||
// --------------------------------------------------------
|
// --------------------------------------------------------
|
||||||
@@ -501,8 +501,8 @@ function openBudgetModal({ mode, entry = null }) {
|
|||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="form-label" for="bm-date">${t('budget.dateLabel')}</label>
|
<label class="form-label" for="bm-date">${t('budget.dateLabel')}</label>
|
||||||
<input type="text" class="form-input js-date-input" id="bm-date"
|
<input type="date" class="form-input" id="bm-date"
|
||||||
value="${formatDateInput(isEdit ? entry.date : today)}" placeholder="${dateInputPlaceholder()}" inputmode="numeric">
|
value="${isEdit ? entry.date : today}">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
@@ -611,13 +611,6 @@ function openBudgetModal({ mode, entry = null }) {
|
|||||||
panel.querySelector('#bm-category').addEventListener('change', () => updateSubcategoryOptions());
|
panel.querySelector('#bm-category').addEventListener('change', () => updateSubcategoryOptions());
|
||||||
panel.querySelector('#bm-add-category').addEventListener('click', addCategory);
|
panel.querySelector('#bm-add-category').addEventListener('click', addCategory);
|
||||||
panel.querySelector('#bm-add-subcategory').addEventListener('click', addSubcategory);
|
panel.querySelector('#bm-add-subcategory').addEventListener('click', addSubcategory);
|
||||||
panel.querySelectorAll('.js-date-input').forEach((input) => {
|
|
||||||
input.addEventListener('blur', () => {
|
|
||||||
const parsed = parseDateInput(input.value);
|
|
||||||
if (parsed) input.value = formatDateInput(parsed);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
panel.querySelector('#bm-cancel').addEventListener('click', closeModal);
|
panel.querySelector('#bm-cancel').addEventListener('click', closeModal);
|
||||||
|
|
||||||
panel.querySelector('#bm-delete')?.addEventListener('click', async () => {
|
panel.querySelector('#bm-delete')?.addEventListener('click', async () => {
|
||||||
@@ -631,13 +624,12 @@ function openBudgetModal({ mode, entry = null }) {
|
|||||||
const absVal = parseFloat(panel.querySelector('#bm-amount').value);
|
const absVal = parseFloat(panel.querySelector('#bm-amount').value);
|
||||||
const category = panel.querySelector('#bm-category').value;
|
const category = panel.querySelector('#bm-category').value;
|
||||||
const subcategory = currentType === 'expense' ? panel.querySelector('#bm-subcategory').value : '';
|
const subcategory = currentType === 'expense' ? panel.querySelector('#bm-subcategory').value : '';
|
||||||
const dateRaw = panel.querySelector('#bm-date').value;
|
const date = panel.querySelector('#bm-date').value;
|
||||||
const date = parseDateInput(dateRaw);
|
|
||||||
const recurring = panel.querySelector('#bm-recurring').checked ? 1 : 0;
|
const recurring = panel.querySelector('#bm-recurring').checked ? 1 : 0;
|
||||||
|
|
||||||
if (!title) { window.oikos?.showToast(t('common.titleRequired'), 'error'); return; }
|
if (!title) { window.oikos?.showToast(t('common.titleRequired'), 'error'); return; }
|
||||||
if (isNaN(absVal) || absVal <= 0) { window.oikos?.showToast(t('budget.validAmountRequired'), 'error'); return; }
|
if (isNaN(absVal) || absVal <= 0) { window.oikos?.showToast(t('budget.validAmountRequired'), 'error'); return; }
|
||||||
if (!date || !isDateInputValid(dateRaw)) { window.oikos?.showToast(t('calendar.invalidDate'), 'error'); return; }
|
if (!date) { window.oikos?.showToast(t('calendar.invalidDate'), 'error'); return; }
|
||||||
|
|
||||||
const amount = currentType === 'expense' ? -absVal : absVal;
|
const amount = currentType === 'expense' ? -absVal : absVal;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user