Skip to content

Commit 6e3ca4b

Browse files
committed
use styled components instead of css modules
1 parent cdd2328 commit 6e3ca4b

File tree

4 files changed

+324
-153
lines changed

4 files changed

+324
-153
lines changed

lib/components/OpenProjectWorkPackageBlock.css

Lines changed: 0 additions & 74 deletions
This file was deleted.

lib/components/OpenProjectWorkPackageBlock.tsx

Lines changed: 94 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,81 @@ import { useWorkPackageSearch } from "../hooks/useWorkPackageSearch";
66
import type { WorkPackage } from "../openProjectTypes";
77
import { linkToWorkPackage } from "../services/openProjectApi";
88

9-
import "./OpenProjectWorkPackageBlock.css";
9+
import styled from "styled-components";
1010

1111
const UI_BLUE = "#000091"; // Default color for task status icons
1212

13+
const Block = styled.div`
14+
padding: 12px 10px;
15+
border: none;
16+
border-radius: 5px;
17+
background-color: #FBF5F2;
18+
width: 450px;
19+
`;
20+
21+
const SearchContainer = styled.div`
22+
position: relative;
23+
`;
24+
25+
const SearchInput = styled.input`
26+
width: 100%;
27+
padding: 8px 12px;
28+
border-radius: 4px;
29+
border: 1px solid #ccc;
30+
font-size: 14px;
31+
`;
32+
33+
const Dropdown = styled.div`
34+
position: absolute;
35+
top: 100%;
36+
left: 0;
37+
right: 0;
38+
z-index: 10;
39+
background-color: white;
40+
border: 1px solid #ccc;
41+
border-radius: 0 0 4px 4px;
42+
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
43+
max-height: 200px;
44+
overflow-y: auto;
45+
margin-top: 2px;
46+
`;
47+
48+
const DropdownOption = styled.div<{ selected: boolean }>`
49+
padding: 8px 12px;
50+
cursor: pointer;
51+
background-color: ${({ selected }) => selected ? '#f0f0f0' : 'transparent'};
52+
border-bottom: 1px solid #eee;
53+
`;
54+
55+
const Type = styled.div`
56+
gap: 8px;
57+
font-weight: bold;
58+
text-transform: uppercase;
59+
`;
60+
61+
const TypeColor = styled(Type) <{ color?: string }>`
62+
color: ${({ color }) => color || UI_BLUE};
63+
`;
64+
65+
const Id = styled.div`
66+
color: #666;
67+
`;
68+
69+
const Status = styled.div<{ bgcolor?: string }>`
70+
font-size: 0.8rem;
71+
border-radius: 12px;
72+
padding: 2px 8px;
73+
border: 1px solid #ccc;
74+
background-color: ${({ bgcolor }) => bgcolor || UI_BLUE};
75+
`;
76+
77+
const Link = styled.a`
78+
margin-right: 6px;
79+
text-decoration: none;
80+
color: #000091;
81+
cursor: pointer;
82+
`;
83+
1384
interface BlockProps {
1485
props: {
1586
wpid: string;
@@ -128,14 +199,13 @@ const OpenProjectWorkPackageBlockComponent = ({
128199
};
129200

130201
return (
131-
<div className="opwp-block">
202+
<Block>
132203
<div>
133204
{!block.props.wpid && (
134-
<div className="opwp-search-container">
135-
<input
205+
<SearchContainer>
206+
<SearchInput
136207
ref={inputRef}
137208
type="text"
138-
className="opwp-search-input"
139209
placeholder={"Search for work package ID or subject"}
140210
value={searchQuery}
141211
onChange={(e) => {
@@ -154,19 +224,18 @@ const OpenProjectWorkPackageBlockComponent = ({
154224

155225
{/* Autocomplete dropdown */}
156226
{isDropdownOpen && searchResults.length > 0 && (
157-
<div
227+
<Dropdown
158228
ref={dropdownRef}
159229
role="listbox"
160230
aria-label={"Work package search results"}
161-
className="opwp-dropdown"
162231
>
163232
{searchResults.slice(0, 5).map((wp, index) => (
164-
<div
233+
<DropdownOption
165234
key={wp.id}
166235
role="option"
167236
aria-selected={focusedResultIndex === index}
168237
tabIndex={0}
169-
className={`opwp-dropdown-option${focusedResultIndex === index ? " selected" : ""}`}
238+
selected={focusedResultIndex === index}
170239
onClick={() => handleSelectWorkPackage(wp)}
171240
onKeyDown={(e) => {
172241
if (e.key === "Enter" || e.key === " ") {
@@ -182,43 +251,41 @@ const OpenProjectWorkPackageBlockComponent = ({
182251
<div style={{ fontSize: "12px", color: "#666" }}>
183252
{wp._links?.type?.title} {wp._links?.status?.title}
184253
</div>
185-
</div>
254+
</DropdownOption>
186255
))}
187-
</div>
256+
</Dropdown>
188257
)}
258+
</SearchContainer>
259+
)}
260+
{block.props.wpid && !selectedWorkPackage && (
261+
<div>
262+
#{block.props.wpid} {block.props.subject}
189263
</div>
190264
)}
191265
{/* Display selected work package details */}
192266
{selectedWorkPackage && (
193267
<div>
194268
<div style={{ display: "flex", gap: "8px" }}>
195-
<div
196-
className="opwp-type opwp-type-color"
197-
style={{ color: selectedWorkPackage._embedded?.type?.color || UI_BLUE }}
198-
>
269+
<TypeColor color={selectedWorkPackage._embedded?.type?.color}>
199270
{selectedWorkPackage._links?.type?.title}
200-
</div>
201-
<div className="opwp-id">#{selectedWorkPackage.id}</div>
202-
<div
203-
className="opwp-status"
204-
style={{ backgroundColor: selectedWorkPackage._embedded?.status?.color || UI_BLUE }}
205-
>
271+
</TypeColor>
272+
<Id>#{selectedWorkPackage.id}</Id>
273+
<Status bgcolor={selectedWorkPackage._embedded?.status?.color}>
206274
{selectedWorkPackage._links?.status?.title}
207-
</div>
275+
</Status>
208276
</div>
209277

210278
<div>
211-
<a
279+
<Link
212280
href={linkToWorkPackage(block.props.wpid)}
213-
className="opwp-link"
214281
>
215282
{selectedWorkPackage.subject}
216-
</a>
283+
</Link>
217284
</div>
218285
</div>
219286
)}
220287
</div>
221-
</div>
288+
</Block>
222289
);
223290
};
224291

@@ -241,7 +308,7 @@ export const openProjectWorkPackageBlockSpec = createReactBlockSpec(
241308
render: (props) => {
242309
return <OpenProjectWorkPackageBlockComponent block={props.block} editor={props.editor} />;
243310
},
244-
},
311+
}
245312
);
246313

247314
export const openProjectWorkPackageSlashMenu = (editor: BlockNoteEditor<Record<string, BlockConfig>, InlineContentSchema, StyleSchema>) => ({

0 commit comments

Comments
 (0)