@baasix/lexical 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +281 -0
- package/dist/DateTimeComponent-4MX2IKXK.css +45 -0
- package/dist/DateTimeComponent-4MX2IKXK.css.map +1 -0
- package/dist/DateTimeComponent-7V5RW3AE.js +2928 -0
- package/dist/DateTimeComponent-7V5RW3AE.js.map +1 -0
- package/dist/EquationComponent-3IW3ONJD.js +159 -0
- package/dist/EquationComponent-3IW3ONJD.js.map +1 -0
- package/dist/EquationComponent-C2C6477P.css +28 -0
- package/dist/EquationComponent-C2C6477P.css.map +1 -0
- package/dist/ExcalidrawComponent-GZYLHNOY.js +267 -0
- package/dist/ExcalidrawComponent-GZYLHNOY.js.map +1 -0
- package/dist/ExcalidrawComponent-U6BD7DUB.css +152 -0
- package/dist/ExcalidrawComponent-U6BD7DUB.css.map +1 -0
- package/dist/ImageComponent-IYUGOT6O.css +73 -0
- package/dist/ImageComponent-IYUGOT6O.css.map +1 -0
- package/dist/ImageComponent-TTUYUG3M.js +429 -0
- package/dist/ImageComponent-TTUYUG3M.js.map +1 -0
- package/dist/PollComponent-CWI5UJF5.css +187 -0
- package/dist/PollComponent-CWI5UJF5.css.map +1 -0
- package/dist/PollComponent-KLJZSW5O.js +199 -0
- package/dist/PollComponent-KLJZSW5O.js.map +1 -0
- package/dist/StickyComponent-MZSTQF47.css +774 -0
- package/dist/StickyComponent-MZSTQF47.css.map +1 -0
- package/dist/StickyComponent-ZED6LNTX.js +233 -0
- package/dist/StickyComponent-ZED6LNTX.js.map +1 -0
- package/dist/chunk-35UCX4ZT.js +168 -0
- package/dist/chunk-35UCX4ZT.js.map +1 -0
- package/dist/chunk-44LUNGL3.js +16608 -0
- package/dist/chunk-44LUNGL3.js.map +1 -0
- package/dist/chunk-BHROZTZU.js +42 -0
- package/dist/chunk-BHROZTZU.js.map +1 -0
- package/dist/chunk-FJ6COZ4H.js +275 -0
- package/dist/chunk-FJ6COZ4H.js.map +1 -0
- package/dist/chunk-GSFNU3JE.js +211 -0
- package/dist/chunk-GSFNU3JE.js.map +1 -0
- package/dist/chunk-I43VQAHW.js +918 -0
- package/dist/chunk-I43VQAHW.js.map +1 -0
- package/dist/chunk-N22RKA5D.js +402 -0
- package/dist/chunk-N22RKA5D.js.map +1 -0
- package/dist/chunk-OIMMC5C3.js +134 -0
- package/dist/chunk-OIMMC5C3.js.map +1 -0
- package/dist/chunk-PZ5AY32C.js +10 -0
- package/dist/chunk-PZ5AY32C.js.map +1 -0
- package/dist/chunk-TVF6V3BJ.js +41 -0
- package/dist/chunk-TVF6V3BJ.js.map +1 -0
- package/dist/chunk-XTKVR2JI.js +225 -0
- package/dist/chunk-XTKVR2JI.js.map +1 -0
- package/dist/emoji-list-MUV74SND.js +8 -0
- package/dist/emoji-list-MUV74SND.js.map +1 -0
- package/dist/index.css +4234 -0
- package/dist/index.css.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.js +16050 -0
- package/dist/index.js.map +1 -0
- package/dist/landscape-RJWVK6ET.jpg +0 -0
- package/dist/yellow-flower-R72KOP74.jpg +0 -0
- package/package.json +76 -0
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/* src/nodes/PollNode.css */
|
|
2
|
+
.PollNode__container {
|
|
3
|
+
border: 1px solid #eee;
|
|
4
|
+
background-color: #fcfcfc;
|
|
5
|
+
border-radius: 10px;
|
|
6
|
+
max-width: 600px;
|
|
7
|
+
min-width: 400px;
|
|
8
|
+
cursor: pointer;
|
|
9
|
+
user-select: none;
|
|
10
|
+
}
|
|
11
|
+
.PollNode__container.focused {
|
|
12
|
+
outline: 2px solid rgb(60, 132, 244);
|
|
13
|
+
}
|
|
14
|
+
.PollNode__inner {
|
|
15
|
+
margin: 15px;
|
|
16
|
+
cursor: default;
|
|
17
|
+
}
|
|
18
|
+
.PollNode__heading {
|
|
19
|
+
margin-left: 0px;
|
|
20
|
+
margin-top: 0px;
|
|
21
|
+
margin-right: 0px;
|
|
22
|
+
margin-bottom: 15px;
|
|
23
|
+
color: #444;
|
|
24
|
+
text-align: center;
|
|
25
|
+
font-size: 18px;
|
|
26
|
+
}
|
|
27
|
+
.PollNode__optionContainer {
|
|
28
|
+
display: flex;
|
|
29
|
+
flex-direction: row;
|
|
30
|
+
margin-bottom: 10px;
|
|
31
|
+
align-items: center;
|
|
32
|
+
}
|
|
33
|
+
.PollNode__optionInputWrapper {
|
|
34
|
+
display: flex;
|
|
35
|
+
flex: 10px;
|
|
36
|
+
border: 1px solid rgb(61, 135, 245);
|
|
37
|
+
border-radius: 5px;
|
|
38
|
+
position: relative;
|
|
39
|
+
overflow: hidden;
|
|
40
|
+
cursor: pointer;
|
|
41
|
+
}
|
|
42
|
+
.PollNode__optionInput {
|
|
43
|
+
display: flex;
|
|
44
|
+
flex: 1px;
|
|
45
|
+
border: 0px;
|
|
46
|
+
padding: 7px;
|
|
47
|
+
color: rgb(61, 135, 245);
|
|
48
|
+
background-color: transparent;
|
|
49
|
+
font-weight: bold;
|
|
50
|
+
outline: 0px;
|
|
51
|
+
z-index: 0;
|
|
52
|
+
}
|
|
53
|
+
.PollNode__optionInput::placeholder {
|
|
54
|
+
font-weight: normal;
|
|
55
|
+
color: #999;
|
|
56
|
+
}
|
|
57
|
+
.PollNode__optionInputVotes {
|
|
58
|
+
background-color: rgb(236, 243, 254);
|
|
59
|
+
height: 100%;
|
|
60
|
+
position: absolute;
|
|
61
|
+
top: 0px;
|
|
62
|
+
left: 0px;
|
|
63
|
+
transition: width 1s ease;
|
|
64
|
+
z-index: 0;
|
|
65
|
+
}
|
|
66
|
+
.PollNode__optionInputVotesCount {
|
|
67
|
+
color: rgb(61, 135, 245);
|
|
68
|
+
position: absolute;
|
|
69
|
+
right: 15px;
|
|
70
|
+
font-size: 12px;
|
|
71
|
+
top: 5px;
|
|
72
|
+
}
|
|
73
|
+
.PollNode__optionCheckboxWrapper {
|
|
74
|
+
position: relative;
|
|
75
|
+
display: flex;
|
|
76
|
+
width: 22px;
|
|
77
|
+
height: 22px;
|
|
78
|
+
border: 1px solid #999;
|
|
79
|
+
margin-right: 10px;
|
|
80
|
+
border-radius: 5px;
|
|
81
|
+
}
|
|
82
|
+
.PollNode__optionCheckboxChecked {
|
|
83
|
+
border: 1px solid rgb(61, 135, 245);
|
|
84
|
+
background-color: rgb(61, 135, 245);
|
|
85
|
+
}
|
|
86
|
+
.PollNode__optionCheckboxChecked:after {
|
|
87
|
+
content: "";
|
|
88
|
+
cursor: pointer;
|
|
89
|
+
border-color: #fff;
|
|
90
|
+
border-style: solid;
|
|
91
|
+
position: absolute;
|
|
92
|
+
display: block;
|
|
93
|
+
top: 4px;
|
|
94
|
+
width: 5px;
|
|
95
|
+
left: 8px;
|
|
96
|
+
height: 9px;
|
|
97
|
+
margin: 0;
|
|
98
|
+
transform: rotate(45deg);
|
|
99
|
+
border-width: 0 2px 2px 0;
|
|
100
|
+
pointer-events: none;
|
|
101
|
+
}
|
|
102
|
+
.PollNode__optionCheckbox {
|
|
103
|
+
border: 0px;
|
|
104
|
+
position: absolute;
|
|
105
|
+
display: block;
|
|
106
|
+
width: 100%;
|
|
107
|
+
height: 100%;
|
|
108
|
+
opacity: 0;
|
|
109
|
+
cursor: pointer;
|
|
110
|
+
}
|
|
111
|
+
.PollNode__optionDelete {
|
|
112
|
+
position: relative;
|
|
113
|
+
display: flex;
|
|
114
|
+
width: 28px;
|
|
115
|
+
height: 28px;
|
|
116
|
+
margin-left: 6px;
|
|
117
|
+
border: 0px;
|
|
118
|
+
background-color: transparent;
|
|
119
|
+
background-position: 6px 6px;
|
|
120
|
+
background-repeat: no-repeat;
|
|
121
|
+
z-index: 0;
|
|
122
|
+
cursor: pointer;
|
|
123
|
+
border-radius: 5px;
|
|
124
|
+
opacity: 0.3;
|
|
125
|
+
}
|
|
126
|
+
.PollNode__optionDelete:before,
|
|
127
|
+
.PollNode__optionDelete:after {
|
|
128
|
+
position: absolute;
|
|
129
|
+
display: block;
|
|
130
|
+
content: "";
|
|
131
|
+
background-color: #999;
|
|
132
|
+
width: 2px;
|
|
133
|
+
height: 15px;
|
|
134
|
+
top: 6px;
|
|
135
|
+
left: 13px;
|
|
136
|
+
}
|
|
137
|
+
.PollNode__optionDelete:before {
|
|
138
|
+
transform: rotate(-45deg);
|
|
139
|
+
}
|
|
140
|
+
.PollNode__optionDelete:after {
|
|
141
|
+
transform: rotate(45deg);
|
|
142
|
+
}
|
|
143
|
+
.PollNode__optionDelete:hover {
|
|
144
|
+
opacity: 1;
|
|
145
|
+
background-color: #eee;
|
|
146
|
+
}
|
|
147
|
+
.PollNode__optionDeleteDisabled {
|
|
148
|
+
cursor: not-allowed;
|
|
149
|
+
}
|
|
150
|
+
.PollNode__optionDeleteDisabled:hover {
|
|
151
|
+
opacity: 0.3;
|
|
152
|
+
background-color: transparent;
|
|
153
|
+
}
|
|
154
|
+
.PollNode__footer {
|
|
155
|
+
display: flex;
|
|
156
|
+
justify-content: center;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/* src/ui/Button.css */
|
|
160
|
+
.Button__root {
|
|
161
|
+
padding-top: 10px;
|
|
162
|
+
padding-bottom: 10px;
|
|
163
|
+
padding-left: 15px;
|
|
164
|
+
padding-right: 15px;
|
|
165
|
+
border: 0px;
|
|
166
|
+
background-color: #eee;
|
|
167
|
+
border-radius: 5px;
|
|
168
|
+
cursor: pointer;
|
|
169
|
+
font-size: 14px;
|
|
170
|
+
}
|
|
171
|
+
.Button__root:hover {
|
|
172
|
+
background-color: #ddd;
|
|
173
|
+
}
|
|
174
|
+
.Button__small {
|
|
175
|
+
padding-top: 5px;
|
|
176
|
+
padding-bottom: 5px;
|
|
177
|
+
padding-left: 10px;
|
|
178
|
+
padding-right: 10px;
|
|
179
|
+
font-size: 13px;
|
|
180
|
+
}
|
|
181
|
+
.Button__disabled {
|
|
182
|
+
cursor: not-allowed;
|
|
183
|
+
}
|
|
184
|
+
.Button__disabled:hover {
|
|
185
|
+
background-color: #eee;
|
|
186
|
+
}
|
|
187
|
+
/*# sourceMappingURL=PollComponent-CWI5UJF5.css.map */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/nodes/PollNode.css","../src/ui/Button.css"],"sourcesContent":["/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n *\r\n */\r\n\r\n.PollNode__container {\r\n border: 1px solid #eee;\r\n background-color: #fcfcfc;\r\n border-radius: 10px;\r\n max-width: 600px;\r\n min-width: 400px;\r\n cursor: pointer;\r\n user-select: none;\r\n}\r\n.PollNode__container.focused {\r\n outline: 2px solid rgb(60, 132, 244);\r\n}\r\n.PollNode__inner {\r\n margin: 15px;\r\n cursor: default;\r\n}\r\n.PollNode__heading {\r\n margin-left: 0px;\r\n margin-top: 0px;\r\n margin-right: 0px;\r\n margin-bottom: 15px;\r\n color: #444;\r\n text-align: center;\r\n font-size: 18px;\r\n}\r\n.PollNode__optionContainer {\r\n display: flex;\r\n flex-direction: row;\r\n margin-bottom: 10px;\r\n align-items: center;\r\n}\r\n.PollNode__optionInputWrapper {\r\n display: flex;\r\n flex: 10px;\r\n border: 1px solid rgb(61, 135, 245);\r\n border-radius: 5px;\r\n position: relative;\r\n overflow: hidden;\r\n cursor: pointer;\r\n}\r\n.PollNode__optionInput {\r\n display: flex;\r\n flex: 1px;\r\n border: 0px;\r\n padding: 7px;\r\n color: rgb(61, 135, 245);\r\n background-color: transparent;\r\n font-weight: bold;\r\n outline: 0px;\r\n z-index: 0;\r\n}\r\n.PollNode__optionInput::placeholder {\r\n font-weight: normal;\r\n color: #999;\r\n}\r\n.PollNode__optionInputVotes {\r\n background-color: rgb(236, 243, 254);\r\n height: 100%;\r\n position: absolute;\r\n top: 0px;\r\n left: 0px;\r\n transition: width 1s ease;\r\n z-index: 0;\r\n}\r\n.PollNode__optionInputVotesCount {\r\n color: rgb(61, 135, 245);\r\n position: absolute;\r\n right: 15px;\r\n font-size: 12px;\r\n top: 5px;\r\n}\r\n.PollNode__optionCheckboxWrapper {\r\n position: relative;\r\n display: flex;\r\n width: 22px;\r\n height: 22px;\r\n border: 1px solid #999;\r\n margin-right: 10px;\r\n border-radius: 5px;\r\n}\r\n.PollNode__optionCheckboxChecked {\r\n border: 1px solid rgb(61, 135, 245);\r\n background-color: rgb(61, 135, 245);\r\n}\r\n.PollNode__optionCheckboxChecked:after {\r\n content: '';\r\n cursor: pointer;\r\n border-color: #fff;\r\n border-style: solid;\r\n position: absolute;\r\n display: block;\r\n top: 4px;\r\n width: 5px;\r\n left: 8px;\r\n height: 9px;\r\n margin: 0;\r\n transform: rotate(45deg);\r\n border-width: 0 2px 2px 0;\r\n pointer-events: none;\r\n}\r\n.PollNode__optionCheckbox {\r\n border: 0px;\r\n position: absolute;\r\n display: block;\r\n width: 100%;\r\n height: 100%;\r\n opacity: 0;\r\n cursor: pointer;\r\n}\r\n.PollNode__optionDelete {\r\n position: relative;\r\n display: flex;\r\n width: 28px;\r\n height: 28px;\r\n margin-left: 6px;\r\n border: 0px;\r\n background-color: transparent;\r\n background-position: 6px 6px;\r\n background-repeat: no-repeat;\r\n z-index: 0;\r\n cursor: pointer;\r\n border-radius: 5px;\r\n opacity: 0.3;\r\n}\r\n.PollNode__optionDelete:before,\r\n.PollNode__optionDelete:after {\r\n position: absolute;\r\n display: block;\r\n content: '';\r\n background-color: #999;\r\n width: 2px;\r\n height: 15px;\r\n top: 6px;\r\n left: 13px;\r\n}\r\n.PollNode__optionDelete:before {\r\n transform: rotate(-45deg);\r\n}\r\n.PollNode__optionDelete:after {\r\n transform: rotate(45deg);\r\n}\r\n.PollNode__optionDelete:hover {\r\n opacity: 1;\r\n background-color: #eee;\r\n}\r\n.PollNode__optionDeleteDisabled {\r\n cursor: not-allowed;\r\n}\r\n.PollNode__optionDeleteDisabled:hover {\r\n opacity: 0.3;\r\n background-color: transparent;\r\n}\r\n.PollNode__footer {\r\n display: flex;\r\n justify-content: center;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n *\r\n */\r\n\r\n.Button__root {\r\n padding-top: 10px;\r\n padding-bottom: 10px;\r\n padding-left: 15px;\r\n padding-right: 15px;\r\n border: 0px;\r\n background-color: #eee;\r\n border-radius: 5px;\r\n cursor: pointer;\r\n font-size: 14px;\r\n}\r\n.Button__root:hover {\r\n background-color: #ddd;\r\n}\r\n.Button__small {\r\n padding-top: 5px;\r\n padding-bottom: 5px;\r\n padding-left: 10px;\r\n padding-right: 10px;\r\n font-size: 13px;\r\n}\r\n.Button__disabled {\r\n cursor: not-allowed;\r\n}\r\n.Button__disabled:hover {\r\n background-color: #eee;\r\n}\r\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import {
|
|
2
|
+
$isPollNode,
|
|
3
|
+
createPollOption
|
|
4
|
+
} from "./chunk-35UCX4ZT.js";
|
|
5
|
+
import {
|
|
6
|
+
Button,
|
|
7
|
+
joinClasses
|
|
8
|
+
} from "./chunk-TVF6V3BJ.js";
|
|
9
|
+
import "./chunk-PZ5AY32C.js";
|
|
10
|
+
|
|
11
|
+
// src/nodes/PollComponent.tsx
|
|
12
|
+
import { useCollaborationContext } from "@lexical/react/LexicalCollaborationContext";
|
|
13
|
+
import { useLexicalComposerContext } from "@lexical/react/LexicalComposerContext";
|
|
14
|
+
import { useLexicalNodeSelection } from "@lexical/react/useLexicalNodeSelection";
|
|
15
|
+
import { mergeRegister } from "@lexical/utils";
|
|
16
|
+
import {
|
|
17
|
+
$getNodeByKey,
|
|
18
|
+
$getSelection,
|
|
19
|
+
$isNodeSelection,
|
|
20
|
+
CLICK_COMMAND,
|
|
21
|
+
COMMAND_PRIORITY_LOW
|
|
22
|
+
} from "lexical";
|
|
23
|
+
import { useEffect, useMemo, useRef, useState } from "react";
|
|
24
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
25
|
+
function getTotalVotes(options) {
|
|
26
|
+
return options.reduce((totalVotes, next) => {
|
|
27
|
+
return totalVotes + next.votes.length;
|
|
28
|
+
}, 0);
|
|
29
|
+
}
|
|
30
|
+
function PollOptionComponent({
|
|
31
|
+
option,
|
|
32
|
+
index,
|
|
33
|
+
options,
|
|
34
|
+
totalVotes,
|
|
35
|
+
withPollNode
|
|
36
|
+
}) {
|
|
37
|
+
const { name: username } = useCollaborationContext();
|
|
38
|
+
const checkboxRef = useRef(null);
|
|
39
|
+
const votesArray = option.votes;
|
|
40
|
+
const checkedIndex = votesArray.indexOf(username);
|
|
41
|
+
const checked = checkedIndex !== -1;
|
|
42
|
+
const votes = votesArray.length;
|
|
43
|
+
const text = option.text;
|
|
44
|
+
return /* @__PURE__ */ jsxs("div", { className: "PollNode__optionContainer", children: [
|
|
45
|
+
/* @__PURE__ */ jsx(
|
|
46
|
+
"div",
|
|
47
|
+
{
|
|
48
|
+
className: joinClasses(
|
|
49
|
+
"PollNode__optionCheckboxWrapper",
|
|
50
|
+
checked && "PollNode__optionCheckboxChecked"
|
|
51
|
+
),
|
|
52
|
+
children: /* @__PURE__ */ jsx(
|
|
53
|
+
"input",
|
|
54
|
+
{
|
|
55
|
+
ref: checkboxRef,
|
|
56
|
+
className: "PollNode__optionCheckbox",
|
|
57
|
+
type: "checkbox",
|
|
58
|
+
onChange: (e) => {
|
|
59
|
+
withPollNode((node) => {
|
|
60
|
+
node.toggleVote(option, username);
|
|
61
|
+
});
|
|
62
|
+
},
|
|
63
|
+
checked
|
|
64
|
+
}
|
|
65
|
+
)
|
|
66
|
+
}
|
|
67
|
+
),
|
|
68
|
+
/* @__PURE__ */ jsxs("div", { className: "PollNode__optionInputWrapper", children: [
|
|
69
|
+
/* @__PURE__ */ jsx(
|
|
70
|
+
"div",
|
|
71
|
+
{
|
|
72
|
+
className: "PollNode__optionInputVotes",
|
|
73
|
+
style: { width: `${votes === 0 ? 0 : votes / totalVotes * 100}%` }
|
|
74
|
+
}
|
|
75
|
+
),
|
|
76
|
+
/* @__PURE__ */ jsx("span", { className: "PollNode__optionInputVotesCount", children: votes > 0 && (votes === 1 ? "1 vote" : `${votes} votes`) }),
|
|
77
|
+
/* @__PURE__ */ jsx(
|
|
78
|
+
"input",
|
|
79
|
+
{
|
|
80
|
+
className: "PollNode__optionInput",
|
|
81
|
+
type: "text",
|
|
82
|
+
value: text,
|
|
83
|
+
onChange: (e) => {
|
|
84
|
+
const target = e.target;
|
|
85
|
+
const value = target.value;
|
|
86
|
+
const selectionStart = target.selectionStart;
|
|
87
|
+
const selectionEnd = target.selectionEnd;
|
|
88
|
+
withPollNode(
|
|
89
|
+
(node) => {
|
|
90
|
+
node.setOptionText(option, value);
|
|
91
|
+
},
|
|
92
|
+
() => {
|
|
93
|
+
target.selectionStart = selectionStart;
|
|
94
|
+
target.selectionEnd = selectionEnd;
|
|
95
|
+
}
|
|
96
|
+
);
|
|
97
|
+
},
|
|
98
|
+
placeholder: `Option ${index + 1}`
|
|
99
|
+
}
|
|
100
|
+
)
|
|
101
|
+
] }),
|
|
102
|
+
/* @__PURE__ */ jsx(
|
|
103
|
+
"button",
|
|
104
|
+
{
|
|
105
|
+
type: "button",
|
|
106
|
+
disabled: options.length < 3,
|
|
107
|
+
className: joinClasses(
|
|
108
|
+
"PollNode__optionDelete",
|
|
109
|
+
options.length < 3 && "PollNode__optionDeleteDisabled"
|
|
110
|
+
),
|
|
111
|
+
"aria-label": "Remove",
|
|
112
|
+
onClick: () => {
|
|
113
|
+
withPollNode((node) => {
|
|
114
|
+
node.deleteOption(option);
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
)
|
|
119
|
+
] });
|
|
120
|
+
}
|
|
121
|
+
function PollComponent({
|
|
122
|
+
question,
|
|
123
|
+
options,
|
|
124
|
+
nodeKey
|
|
125
|
+
}) {
|
|
126
|
+
const [editor] = useLexicalComposerContext();
|
|
127
|
+
const totalVotes = useMemo(() => getTotalVotes(options), [options]);
|
|
128
|
+
const [isSelected, setSelected, clearSelection] = useLexicalNodeSelection(nodeKey);
|
|
129
|
+
const [selection, setSelection] = useState(null);
|
|
130
|
+
const ref = useRef(null);
|
|
131
|
+
useEffect(() => {
|
|
132
|
+
return mergeRegister(
|
|
133
|
+
editor.registerUpdateListener(({ editorState }) => {
|
|
134
|
+
setSelection(editorState.read(() => $getSelection()));
|
|
135
|
+
}),
|
|
136
|
+
editor.registerCommand(
|
|
137
|
+
CLICK_COMMAND,
|
|
138
|
+
(payload) => {
|
|
139
|
+
const event = payload;
|
|
140
|
+
if (event.target === ref.current) {
|
|
141
|
+
if (!event.shiftKey) {
|
|
142
|
+
clearSelection();
|
|
143
|
+
}
|
|
144
|
+
setSelected(!isSelected);
|
|
145
|
+
return true;
|
|
146
|
+
}
|
|
147
|
+
return false;
|
|
148
|
+
},
|
|
149
|
+
COMMAND_PRIORITY_LOW
|
|
150
|
+
)
|
|
151
|
+
);
|
|
152
|
+
}, [clearSelection, editor, isSelected, nodeKey, setSelected]);
|
|
153
|
+
const withPollNode = (cb, onUpdate) => {
|
|
154
|
+
editor.update(
|
|
155
|
+
() => {
|
|
156
|
+
const node = $getNodeByKey(nodeKey);
|
|
157
|
+
if ($isPollNode(node)) {
|
|
158
|
+
cb(node);
|
|
159
|
+
}
|
|
160
|
+
},
|
|
161
|
+
{ onUpdate }
|
|
162
|
+
);
|
|
163
|
+
};
|
|
164
|
+
const addOption = () => {
|
|
165
|
+
withPollNode((node) => {
|
|
166
|
+
node.addOption(createPollOption());
|
|
167
|
+
});
|
|
168
|
+
};
|
|
169
|
+
const isFocused = $isNodeSelection(selection) && isSelected;
|
|
170
|
+
return /* @__PURE__ */ jsx(
|
|
171
|
+
"div",
|
|
172
|
+
{
|
|
173
|
+
className: `PollNode__container ${isFocused ? "focused" : ""}`,
|
|
174
|
+
ref,
|
|
175
|
+
children: /* @__PURE__ */ jsxs("div", { className: "PollNode__inner", children: [
|
|
176
|
+
/* @__PURE__ */ jsx("h2", { className: "PollNode__heading", children: question }),
|
|
177
|
+
options.map((option, index) => {
|
|
178
|
+
const key = option.uid;
|
|
179
|
+
return /* @__PURE__ */ jsx(
|
|
180
|
+
PollOptionComponent,
|
|
181
|
+
{
|
|
182
|
+
withPollNode,
|
|
183
|
+
option,
|
|
184
|
+
index,
|
|
185
|
+
options,
|
|
186
|
+
totalVotes
|
|
187
|
+
},
|
|
188
|
+
key
|
|
189
|
+
);
|
|
190
|
+
}),
|
|
191
|
+
/* @__PURE__ */ jsx("div", { className: "PollNode__footer", children: /* @__PURE__ */ jsx(Button, { onClick: addOption, small: true, children: "Add Option" }) })
|
|
192
|
+
] })
|
|
193
|
+
}
|
|
194
|
+
);
|
|
195
|
+
}
|
|
196
|
+
export {
|
|
197
|
+
PollComponent as default
|
|
198
|
+
};
|
|
199
|
+
//# sourceMappingURL=PollComponent-KLJZSW5O.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/nodes/PollComponent.tsx"],"sourcesContent":["/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport type {Option, Options, PollNode} from './PollNode';\nimport type {JSX} from 'react';\n\nimport './PollNode.css';\n\nimport {useCollaborationContext} from '@lexical/react/LexicalCollaborationContext';\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\nimport {useLexicalNodeSelection} from '@lexical/react/useLexicalNodeSelection';\nimport {mergeRegister} from '@lexical/utils';\nimport {\n $getNodeByKey,\n $getSelection,\n $isNodeSelection,\n BaseSelection,\n CLICK_COMMAND,\n COMMAND_PRIORITY_LOW,\n NodeKey,\n} from 'lexical';\nimport {useEffect, useMemo, useRef, useState} from 'react';\n\nimport Button from '../ui/Button';\nimport joinClasses from '../utils/joinClasses';\nimport {$isPollNode, createPollOption} from './PollNode';\n\nfunction getTotalVotes(options: Options): number {\n return options.reduce((totalVotes, next) => {\n return totalVotes + next.votes.length;\n }, 0);\n}\n\nfunction PollOptionComponent({\n option,\n index,\n options,\n totalVotes,\n withPollNode,\n}: {\n index: number;\n option: Option;\n options: Options;\n totalVotes: number;\n withPollNode: (\n cb: (pollNode: PollNode) => void,\n onSelect?: () => void,\n ) => void;\n}): JSX.Element {\n const {name: username} = useCollaborationContext();\n const checkboxRef = useRef(null);\n const votesArray = option.votes;\n const checkedIndex = votesArray.indexOf(username);\n const checked = checkedIndex !== -1;\n const votes = votesArray.length;\n const text = option.text;\n\n return (\n <div className=\"PollNode__optionContainer\">\n <div\n className={joinClasses(\n 'PollNode__optionCheckboxWrapper',\n checked && 'PollNode__optionCheckboxChecked',\n )}>\n <input\n ref={checkboxRef}\n className=\"PollNode__optionCheckbox\"\n type=\"checkbox\"\n onChange={(e) => {\n withPollNode((node) => {\n node.toggleVote(option, username);\n });\n }}\n checked={checked}\n />\n </div>\n <div className=\"PollNode__optionInputWrapper\">\n <div\n className=\"PollNode__optionInputVotes\"\n style={{width: `${votes === 0 ? 0 : (votes / totalVotes) * 100}%`}}\n />\n <span className=\"PollNode__optionInputVotesCount\">\n {votes > 0 && (votes === 1 ? '1 vote' : `${votes} votes`)}\n </span>\n <input\n className=\"PollNode__optionInput\"\n type=\"text\"\n value={text}\n onChange={(e) => {\n const target = e.target;\n const value = target.value;\n const selectionStart = target.selectionStart;\n const selectionEnd = target.selectionEnd;\n withPollNode(\n (node) => {\n node.setOptionText(option, value);\n },\n () => {\n target.selectionStart = selectionStart;\n target.selectionEnd = selectionEnd;\n },\n );\n }}\n placeholder={`Option ${index + 1}`}\n />\n </div>\n <button type=\"button\"\n disabled={options.length < 3}\n className={joinClasses(\n 'PollNode__optionDelete',\n options.length < 3 && 'PollNode__optionDeleteDisabled',\n )}\n aria-label=\"Remove\"\n onClick={() => {\n withPollNode((node) => {\n node.deleteOption(option);\n });\n }}\n />\n </div>\n );\n}\n\nexport default function PollComponent({\n question,\n options,\n nodeKey,\n}: {\n nodeKey: NodeKey;\n options: Options;\n question: string;\n}): JSX.Element {\n const [editor] = useLexicalComposerContext();\n const totalVotes = useMemo(() => getTotalVotes(options), [options]);\n const [isSelected, setSelected, clearSelection] =\n useLexicalNodeSelection(nodeKey);\n const [selection, setSelection] = useState<BaseSelection | null>(null);\n const ref = useRef(null);\n\n useEffect(() => {\n return mergeRegister(\n editor.registerUpdateListener(({editorState}) => {\n setSelection(editorState.read(() => $getSelection()));\n }),\n editor.registerCommand<MouseEvent>(\n CLICK_COMMAND,\n (payload) => {\n const event = payload;\n\n if (event.target === ref.current) {\n if (!event.shiftKey) {\n clearSelection();\n }\n setSelected(!isSelected);\n return true;\n }\n\n return false;\n },\n COMMAND_PRIORITY_LOW,\n ),\n );\n }, [clearSelection, editor, isSelected, nodeKey, setSelected]);\n\n const withPollNode = (\n cb: (node: PollNode) => void,\n onUpdate?: () => void,\n ): void => {\n editor.update(\n () => {\n const node = $getNodeByKey(nodeKey);\n if ($isPollNode(node)) {\n cb(node);\n }\n },\n {onUpdate},\n );\n };\n\n const addOption = () => {\n withPollNode((node) => {\n node.addOption(createPollOption());\n });\n };\n\n const isFocused = $isNodeSelection(selection) && isSelected;\n\n return (\n <div\n className={`PollNode__container ${isFocused ? 'focused' : ''}`}\n ref={ref}>\n <div className=\"PollNode__inner\">\n <h2 className=\"PollNode__heading\">{question}</h2>\n {options.map((option, index) => {\n const key = option.uid;\n return (\n <PollOptionComponent\n key={key}\n withPollNode={withPollNode}\n option={option}\n index={index}\n options={options}\n totalVotes={totalVotes}\n />\n );\n })}\n <div className=\"PollNode__footer\">\n <Button onClick={addOption} small={true}>\n Add Option\n </Button>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|