mirror of
https://github.com/morris/vanilla-todo.git
synced 2025-01-17 20:58:22 +01:00
fix #14
This commit is contained in:
parent
5ab98c2740
commit
1bc68ef68a
@ -44,7 +44,10 @@ export function TodoController(el) {
|
|||||||
function load() {
|
function load() {
|
||||||
try {
|
try {
|
||||||
if (localStorage?.todo) {
|
if (localStorage?.todo) {
|
||||||
todoData = { ...todoData, ...JSON.parse(localStorage.todo) };
|
todoData = TodoLogic.movePastTodoItems({
|
||||||
|
...todoData,
|
||||||
|
...JSON.parse(localStorage.todo),
|
||||||
|
});
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
// eslint-disable-next-line no-console
|
// eslint-disable-next-line no-console
|
||||||
|
@ -8,6 +8,7 @@ import { uuid } from './uuid.js';
|
|||||||
* index: number;
|
* index: number;
|
||||||
* label: string;
|
* label: string;
|
||||||
* done: boolean;
|
* done: boolean;
|
||||||
|
* fixed: boolean;
|
||||||
* }} TodoDataItem
|
* }} TodoDataItem
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -71,7 +72,7 @@ export class TodoLogic {
|
|||||||
* @param {{listId: string, label: string}} input
|
* @param {{listId: string, label: string}} input
|
||||||
* @returns {TodoData}
|
* @returns {TodoData}
|
||||||
*/
|
*/
|
||||||
static addTodoItem(data, input) {
|
static addTodoItem(data, input, now = new Date()) {
|
||||||
let index = 0;
|
let index = 0;
|
||||||
|
|
||||||
for (const item of data.items) {
|
for (const item of data.items) {
|
||||||
@ -89,6 +90,7 @@ export class TodoLogic {
|
|||||||
id: uuid(),
|
id: uuid(),
|
||||||
index,
|
index,
|
||||||
done: false,
|
done: false,
|
||||||
|
fixed: this.isListInThePast(input.listId, now),
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
@ -127,14 +129,20 @@ export class TodoLogic {
|
|||||||
* @param {{id: string, listId: string, index: number}} input
|
* @param {{id: string, listId: string, index: number}} input
|
||||||
* @returns {TodoData}
|
* @returns {TodoData}
|
||||||
*/
|
*/
|
||||||
static moveTodoItem(data, input) {
|
static moveTodoItem(data, input, now = new Date()) {
|
||||||
const itemToMove = data.items.find((item) => item.id === input.id);
|
const itemToMove = data.items.find((item) => item.id === input.id);
|
||||||
|
|
||||||
|
if (!itemToMove) return data;
|
||||||
|
|
||||||
// Reinsert item at target list and index
|
// Reinsert item at target list and index
|
||||||
let list = data.items.filter(
|
let list = data.items.filter(
|
||||||
(item) => item.listId === input.listId && item.id !== input.id,
|
(item) => item.listId === input.listId && item.id !== input.id,
|
||||||
);
|
);
|
||||||
list.splice(input.index, 0, { ...itemToMove, listId: input.listId });
|
list.splice(input.index, 0, {
|
||||||
|
...itemToMove,
|
||||||
|
listId: input.listId,
|
||||||
|
fixed: this.isListInThePast(input.listId, now),
|
||||||
|
});
|
||||||
list = TodoLogic.setIndexes(list);
|
list = TodoLogic.setIndexes(list);
|
||||||
|
|
||||||
// Reinsert updated list
|
// Reinsert updated list
|
||||||
@ -161,6 +169,44 @@ export class TodoLogic {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {TodoData} data
|
||||||
|
* @param {Date} now
|
||||||
|
* @returns {TodoData}
|
||||||
|
*/
|
||||||
|
static movePastTodoItems(data, now = new Date()) {
|
||||||
|
const todayListId = formatDateId(now);
|
||||||
|
|
||||||
|
let targetIndex = 0;
|
||||||
|
|
||||||
|
for (const item of data.items) {
|
||||||
|
if (item.listId === todayListId && item.index > targetIndex) {
|
||||||
|
targetIndex = item.index;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
...data,
|
||||||
|
items: data.items.map((item) => {
|
||||||
|
if (
|
||||||
|
!item.done &&
|
||||||
|
!item.fixed &&
|
||||||
|
this.isListInThePast(item.listId, now)
|
||||||
|
) {
|
||||||
|
return { ...item, listId: todayListId, index: targetIndex++ };
|
||||||
|
}
|
||||||
|
|
||||||
|
return item;
|
||||||
|
}),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
static isListInThePast(listId, now = new Date()) {
|
||||||
|
const todayListId = formatDateId(now);
|
||||||
|
|
||||||
|
return listId.match(/\d\d\d\d-\d\d-\d\d/) && listId < todayListId;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
||||||
static getCustomTodoLists(data) {
|
static getCustomTodoLists(data) {
|
||||||
|
@ -29,6 +29,7 @@ test('TodoLogic.addTodoItem', () => {
|
|||||||
label: 'foo',
|
label: 'foo',
|
||||||
index: 0,
|
index: 0,
|
||||||
done: false,
|
done: false,
|
||||||
|
fixed: true,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
@ -42,6 +43,7 @@ test('TodoLogic.addTodoItem', () => {
|
|||||||
label: 'foo',
|
label: 'foo',
|
||||||
index: 0,
|
index: 0,
|
||||||
done: false,
|
done: false,
|
||||||
|
fixed: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: expect.stringMatching(/./),
|
id: expect.stringMatching(/./),
|
||||||
@ -49,6 +51,7 @@ test('TodoLogic.addTodoItem', () => {
|
|||||||
label: 'bar',
|
label: 'bar',
|
||||||
index: 1,
|
index: 1,
|
||||||
done: false,
|
done: false,
|
||||||
|
fixed: true,
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
|
|
||||||
@ -61,6 +64,7 @@ test('TodoLogic.addTodoItem', () => {
|
|||||||
label: 'foo',
|
label: 'foo',
|
||||||
index: 0,
|
index: 0,
|
||||||
done: false,
|
done: false,
|
||||||
|
fixed: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: expect.stringMatching(/./),
|
id: expect.stringMatching(/./),
|
||||||
@ -68,6 +72,7 @@ test('TodoLogic.addTodoItem', () => {
|
|||||||
label: 'bar',
|
label: 'bar',
|
||||||
index: 1,
|
index: 1,
|
||||||
done: false,
|
done: false,
|
||||||
|
fixed: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: expect.stringMatching(/./),
|
id: expect.stringMatching(/./),
|
||||||
@ -75,6 +80,7 @@ test('TodoLogic.addTodoItem', () => {
|
|||||||
label: 'baz',
|
label: 'baz',
|
||||||
index: 0,
|
index: 0,
|
||||||
done: false,
|
done: false,
|
||||||
|
fixed: true,
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
@ -136,6 +142,42 @@ test('TodoLogic.moveTodoItem', () => {
|
|||||||
label: 'foo',
|
label: 'foo',
|
||||||
index: 1,
|
index: 1,
|
||||||
done: false,
|
done: false,
|
||||||
|
fixed: true,
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
|
||||||
|
data = TodoLogic.moveTodoItem(
|
||||||
|
data,
|
||||||
|
{
|
||||||
|
id: 'a',
|
||||||
|
listId: '1970-01-02',
|
||||||
|
index: 0,
|
||||||
|
},
|
||||||
|
new Date('1970-01-01'),
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(data.items).toEqual([
|
||||||
|
{
|
||||||
|
id: 'b',
|
||||||
|
listId: '1970-01-01',
|
||||||
|
label: 'bar',
|
||||||
|
index: 0,
|
||||||
|
done: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'a',
|
||||||
|
listId: '1970-01-02',
|
||||||
|
label: 'foo',
|
||||||
|
index: 0,
|
||||||
|
done: false,
|
||||||
|
fixed: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'c',
|
||||||
|
listId: '1970-01-02',
|
||||||
|
label: 'baz',
|
||||||
|
index: 1,
|
||||||
|
done: false,
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user