@@ -6,10 +6,81 @@ import { useWorkPackageSearch } from "../hooks/useWorkPackageSearch";
66import type { WorkPackage } from "../openProjectTypes" ;
77import { linkToWorkPackage } from "../services/openProjectApi" ;
88
9- import "./OpenProjectWorkPackageBlock.css ";
9+ import styled from "styled-components ";
1010
1111const 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+
1384interface 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
247314export const openProjectWorkPackageSlashMenu = ( editor : BlockNoteEditor < Record < string , BlockConfig > , InlineContentSchema , StyleSchema > ) => ( {
0 commit comments