-
-
Notifications
You must be signed in to change notification settings - Fork 377
/
task-list-item.ts
105 lines (89 loc) 路 3.34 KB
/
task-list-item.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
/* Copyright 2021, Milkdown by Mirone. */
import { Emotion, getPalette, Icon, ThemeIcon, ThemeManager, ThemeTaskListItemType } from '@milkdown/core';
export const taskListItem = (manager: ThemeManager, { css }: Emotion) => {
const palette = getPalette(manager);
manager.set<ThemeTaskListItemType>('task-list-item', ({ onChange, editable }) => {
const createIcon = (icon: Icon) => manager.get(ThemeIcon, icon)?.dom as HTMLElement;
const listItem = document.createElement('li');
const checkboxWrapper = document.createElement('label');
const checkboxStyler = document.createElement('span');
const checkbox = document.createElement('input');
const content = document.createElement('div');
let icon = createIcon('unchecked');
checkboxWrapper.appendChild(icon);
const setIcon = (name: Icon) => {
const nextIcon = createIcon(name);
checkboxWrapper.replaceChild(nextIcon, icon);
icon = nextIcon;
};
checkboxWrapper.append(checkbox, checkboxStyler);
listItem.append(checkboxWrapper, content);
checkboxWrapper.contentEditable = 'false';
checkbox.type = 'checkbox';
if (!editable()) {
checkbox.disabled = true;
checkboxWrapper.style.cursor = 'not-allowed';
}
checkbox.onchange = (event) => {
const target = event.target;
if (!(target instanceof HTMLInputElement)) return;
if (!editable()) {
checkbox.checked = !checkbox.checked;
return;
}
event.preventDefault();
onChange(checkbox.checked);
};
listItem.dataset['type'] = 'task-item';
listItem.classList.add('task-list-item');
manager.onFlush(() => {
const style = css`
list-style-type: none;
position: relative;
& > div {
overflow: hidden;
padding: 0 2px;
width: 100%;
}
label {
display: inline-block;
width: 24px;
height: 24px;
cursor: pointer;
input {
visibility: hidden;
}
}
&[data-checked='true'] {
> label {
color: ${palette('primary')};
}
}
&[data-checked='false'] {
> label {
color: ${palette('solid', 0.87)};
}
}
.paragraph {
margin: 8px 0;
}
`;
if (style) {
listItem.classList.add(style);
}
});
return {
dom: listItem,
contentDOM: content,
onUpdate: (node) => {
listItem.dataset['checked'] = node.attrs['checked'];
if (node.attrs['checked']) {
checkbox.setAttribute('checked', 'checked');
} else {
checkbox.removeAttribute('checked');
}
setIcon(node.attrs['checked'] ? 'checked' : 'unchecked');
},
};
});
};