Skip to content

Commit b018e6c

Browse files
committed
Merge branch 'create-subtask'
2 parents 7e8684f + d1d380d commit b018e6c

File tree

8 files changed

+307
-55
lines changed

8 files changed

+307
-55
lines changed

src/Calendars/Main.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,12 +70,17 @@ export default function CalendarsMain() {
7070

7171
async function onItemSave(item: PimType, collectionUid: string, originalItem?: PimType): Promise<void> {
7272
const collection = collections!.find((x) => x.uid === collectionUid)!;
73-
await itemSave(etebase, collection, items!, item, collectionUid, originalItem);
73+
await itemSave(etebase, collection, items!, collectionUid,
74+
[{
75+
original: originalItem,
76+
new: item,
77+
}]
78+
);
7479
}
7580

7681
async function onItemDelete(item: PimType, collectionUid: string) {
7782
const collection = collections!.find((x) => x.uid === collectionUid)!;
78-
await itemDelete(etebase, collection, items!, item, collectionUid);
83+
await itemDelete(etebase, collection, items!, [item], collectionUid);
7984

8085
history.push(routeResolver.getRoute("pim.events"));
8186
}

src/Contacts/Main.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,17 @@ export default function ContactsMain() {
5959

6060
async function onItemSave(item: PimType, collectionUid: string, originalItem?: PimType): Promise<void> {
6161
const collection = collections!.find((x) => x.uid === collectionUid)!;
62-
await itemSave(etebase, collection, items!, item, collectionUid, originalItem);
62+
await itemSave(etebase, collection, items!, collectionUid,
63+
[{
64+
original: originalItem,
65+
new: item,
66+
}]
67+
);
6368
}
6469

6570
async function onItemDelete(item: PimType, collectionUid: string) {
6671
const collection = collections!.find((x) => x.uid === collectionUid)!;
67-
await itemDelete(etebase, collection, items!, item, collectionUid);
72+
await itemDelete(etebase, collection, items!, [item], collectionUid);
6873

6974
history.push(routeResolver.getRoute("pim.contacts"));
7075
}

src/Pim/helpers.tsx

Lines changed: 38 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import memoize from "memoizee";
99

1010
import * as Etebase from "etebase";
1111

12-
import { PimType } from "../pim-types";
12+
import { PimChanges, PimType } from "../pim-types";
1313
import { getCollectionManager } from "../etebase-helpers";
1414
import { asyncDispatch, store } from "../store";
1515
import { itemBatch, appendError } from "../store/actions";
@@ -85,47 +85,52 @@ export function getDecryptItemsFunction<T extends PimType>(_colType: string, par
8585
);
8686
}
8787

88-
export async function itemSave(etebase: Etebase.Account, collection: Etebase.Collection, items: Map<string, Map<string, Etebase.Item>>, item: PimType, collectionUid: string, originalItem?: PimType): Promise<void> {
89-
const itemUid = originalItem?.itemUid;
88+
export async function itemSave(etebase: Etebase.Account, collection: Etebase.Collection, items: Map<string, Map<string, Etebase.Item>>, collectionUid: string, changes: PimChanges[]): Promise<void> {
9089
const colMgr = getCollectionManager(etebase);
9190
const itemMgr = colMgr.getItemManager(collection);
92-
9391
const mtime = (new Date()).getTime();
94-
const content = item.toIcal();
95-
96-
let eteItem;
97-
if (itemUid) {
98-
// Existing item
99-
eteItem = items!.get(collectionUid)?.get(itemUid)!;
100-
await eteItem.setContent(content);
101-
const meta = eteItem.getMeta();
102-
meta.mtime = mtime;
103-
eteItem.setMeta(meta);
104-
} else {
105-
// New
106-
const meta: Etebase.ItemMetadata = {
107-
mtime,
108-
name: item.uid,
109-
};
110-
eteItem = await itemMgr.create(meta, content);
92+
const itemList = [];
93+
for (const item of changes) {
94+
const itemUid = item.original?.itemUid;
95+
const content = item.new.toIcal();
96+
let eteItem;
97+
if (itemUid) {
98+
// Existing item
99+
eteItem = items!.get(collectionUid)?.get(itemUid)!;
100+
await eteItem.setContent(content);
101+
const meta = eteItem.getMeta();
102+
meta.mtime = mtime;
103+
eteItem.setMeta(meta);
104+
} else {
105+
// New
106+
const meta: Etebase.ItemMetadata = {
107+
mtime,
108+
name: item.new.uid,
109+
};
110+
eteItem = await itemMgr.create(meta, content);
111+
}
112+
itemList.push(eteItem);
111113
}
112-
113-
await asyncDispatch(itemBatch(collection, itemMgr, [eteItem]));
114+
await asyncDispatch(itemBatch(collection, itemMgr, itemList));
114115
}
115116

116-
export async function itemDelete(etebase: Etebase.Account, collection: Etebase.Collection, items: Map<string, Map<string, Etebase.Item>>, item: PimType, collectionUid: string) {
117-
const itemUid = item.itemUid!;
117+
export async function itemDelete(etebase: Etebase.Account, collection: Etebase.Collection, items: Map<string, Map<string, Etebase.Item>>, itemsToDelete: PimType[], collectionUid: string) {
118118
const colMgr = getCollectionManager(etebase);
119119
const itemMgr = colMgr.getItemManager(collection);
120+
const itemList = [];
121+
for (const item of itemsToDelete) {
122+
const itemUid = item.itemUid!;
123+
const eteItem = items!.get(collectionUid)?.get(itemUid)!;
124+
const mtime = (new Date()).getTime();
125+
const meta = eteItem.getMeta();
126+
meta.mtime = mtime;
127+
eteItem.setMeta(meta);
128+
eteItem.delete(true);
129+
itemList.push(eteItem);
130+
}
131+
120132

121-
const eteItem = items!.get(collectionUid)?.get(itemUid)!;
122-
const mtime = (new Date()).getTime();
123-
const meta = eteItem.getMeta();
124-
meta.mtime = mtime;
125-
eteItem.setMeta(meta);
126-
eteItem.delete(true);
127-
128-
await asyncDispatch(itemBatch(collection, itemMgr, [eteItem]));
133+
await asyncDispatch(itemBatch(collection, itemMgr, itemList));
129134
}
130135

131136
interface PimFabPropsType {

src/Tasks/Main.tsx

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { Button, useTheme } from "@material-ui/core";
1010
import IconEdit from "@material-ui/icons/Edit";
1111
import IconChangeHistory from "@material-ui/icons/ChangeHistory";
1212

13-
import { TaskType, PimType } from "../pim-types";
13+
import { TaskType, PimType, PimChanges } from "../pim-types";
1414
import { useCredentials } from "../credentials";
1515
import { useItems, useCollections } from "../etebase-helpers";
1616
import { routeResolver } from "../App";
@@ -57,15 +57,15 @@ export default function TasksMain() {
5757
}
5858

5959
async function onItemSave(item: PimType, collectionUid: string, originalItem?: PimType): Promise<void> {
60-
const collection = collections!.find((x) => x.uid === collectionUid)!;
61-
await itemSave(etebase, collection, items!, item, collectionUid, originalItem);
60+
await onMultipleItemsSave([{
61+
original: originalItem,
62+
new: item,
63+
}], collectionUid);
6264
}
6365

64-
async function onItemDelete(item: PimType, collectionUid: string) {
66+
async function onMultipleItemsSave(changes: PimChanges[], collectionUid: string): Promise<void> {
6567
const collection = collections!.find((x) => x.uid === collectionUid)!;
66-
await itemDelete(etebase, collection, items!, item, collectionUid);
67-
68-
history.push(routeResolver.getRoute("pim.tasks"));
68+
await itemSave(etebase, collection, items!, collectionUid, changes);
6969
}
7070

7171
function onCancel() {
@@ -79,6 +79,25 @@ export default function TasksMain() {
7979
}
8080
}
8181

82+
async function onItemDelete(item: PimType, collectionUid: string, redirect = true, recursive = false) {
83+
const collection = collections!.find((x) => x.uid === collectionUid)!;
84+
if (recursive) {
85+
let index = 0;
86+
const deleteTarget = [item];
87+
while (index < deleteTarget.length) {
88+
const current = deleteTarget[index++];
89+
const children = flatEntries.filter((i) => i.relatedTo === current.uid);
90+
deleteTarget.push(...children);
91+
}
92+
await itemDelete(etebase, collection, items!, deleteTarget, collectionUid);
93+
} else {
94+
await itemDelete(etebase, collection, items!, [item], collectionUid);
95+
}
96+
if (redirect) {
97+
history.push(routeResolver.getRoute("pim.tasks"));
98+
}
99+
}
100+
82101
const styles = {
83102
button: {
84103
marginLeft: theme.spacing(1),
@@ -113,9 +132,10 @@ export default function TasksMain() {
113132
exact
114133
>
115134
<TaskEdit
135+
directChildren={[]}
116136
entries={flatEntries}
117137
collections={cachedCollections}
118-
onSave={onItemSave}
138+
onSave={onMultipleItemsSave}
119139
onDelete={onItemDelete}
120140
onCancel={onCancel}
121141
history={history}
@@ -155,12 +175,13 @@ export default function TasksMain() {
155175
exact
156176
>
157177
<TaskEdit
178+
directChildren={flatEntries.filter((t) => t.relatedTo === item.uid)}
158179
entries={flatEntries}
159180
key={itemUid}
160181
initialCollection={item.collectionUid}
161182
item={item}
162183
collections={cachedCollections}
163-
onSave={onItemSave}
184+
onSave={onMultipleItemsSave}
164185
onDelete={onItemDelete}
165186
onCancel={onCancel}
166187
history={history}

0 commit comments

Comments
 (0)