Skip to content

Commit a803831

Browse files
committed
New component, extensions search utility
1 parent 34b572d commit a803831

8 files changed

Lines changed: 1057 additions & 2 deletions

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
"scripts": {
55
"ng": "ng",
66
"start": "ng serve",
7+
"clean": "rm -rf docs .angular/cache",
78
"build": "ng build",
89
"build:test": "ng build --base-href /",
910
"watch": "ng build --watch --configuration development",

src/app/app-routing.module.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import { EhdsLaboratoryDemoComponent } from './ehds-laboratory-demo/ehds-laborat
3737
import { MdrsViewerComponent } from './mdrs-viewer/mdrs-viewer.component';
3838
import { CrsBatchGeneratorComponent } from './crs-batch-generator/crs-batch-generator.component';
3939
import { DrugStrengthRoundingComponent } from './drug-strength-rounding/drug-strength-rounding.component';
40+
import { ExtensionsSearchComponent } from './extensions-search/extensions-search.component';
4041

4142
const routes: Routes = [
4243
{ path: '', component: HomeComponent },
@@ -80,6 +81,7 @@ const routes: Routes = [
8081
{ path: 'mdrs-viewer', component: MdrsViewerComponent },
8182
{ path: 'crs-batch-generator', component: CrsBatchGeneratorComponent },
8283
{ path: 'drug-strength-rounding', component: DrugStrengthRoundingComponent },
84+
{ path: 'extensions-search', component: ExtensionsSearchComponent },
8385
{ path: '**', redirectTo: '' }
8486
];
8587

src/app/app.module.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ import { ObservationResultFormComponent } from './ehds-laboratory-demo/observati
132132
import { MdrsViewerComponent } from './mdrs-viewer/mdrs-viewer.component';
133133
import { CrsBatchGeneratorComponent } from './crs-batch-generator/crs-batch-generator.component';
134134
import { DrugStrengthRoundingComponent } from './drug-strength-rounding/drug-strength-rounding.component';
135+
import { ExtensionsSearchComponent } from './extensions-search/extensions-search.component';
135136

136137
const app = initializeApp(firebaseConfig);
137138

@@ -222,7 +223,8 @@ const app = initializeApp(firebaseConfig);
222223
ObservationResultFormComponent,
223224
MdrsViewerComponent,
224225
CrsBatchGeneratorComponent,
225-
DrugStrengthRoundingComponent
226+
DrugStrengthRoundingComponent,
227+
ExtensionsSearchComponent
226228
],
227229
bootstrap: [AppComponent],
228230
schemas: [CUSTOM_ELEMENTS_SCHEMA], imports: [BrowserModule,
Lines changed: 321 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,321 @@
1+
.extensions-search-container {
2+
padding: 20px;
3+
max-width: 1400px;
4+
margin: 0 auto;
5+
height: calc(100vh - 64px);
6+
overflow: hidden;
7+
display: flex;
8+
flex-direction: column;
9+
}
10+
11+
.ecl-section {
12+
display: flex;
13+
flex-wrap: wrap;
14+
align-items: flex-start;
15+
gap: 16px;
16+
margin-bottom: 16px;
17+
flex-shrink: 0;
18+
}
19+
20+
.ecl-section h2 {
21+
width: 100%;
22+
margin: 0 0 8px 0;
23+
}
24+
25+
.ecl-field {
26+
flex: 1;
27+
min-width: 300px;
28+
}
29+
30+
/* Sin outline en el form field */
31+
:host .ecl-field .mat-mdc-text-field-wrapper,
32+
:host .ecl-field .mdc-notched-outline,
33+
:host .ecl-field input,
34+
:host .ecl-field textarea {
35+
outline: none !important;
36+
}
37+
:host .ecl-field .mdc-notched-outline__leading,
38+
:host .ecl-field .mdc-notched-outline__notch,
39+
:host .ecl-field .mdc-notched-outline__trailing {
40+
border: none !important;
41+
}
42+
43+
.error-message {
44+
display: flex;
45+
align-items: center;
46+
gap: 8px;
47+
color: #c62828;
48+
margin-bottom: 16px;
49+
flex-shrink: 0;
50+
}
51+
52+
.progress-section {
53+
margin-bottom: 16px;
54+
min-height: 50px;
55+
flex-shrink: 0;
56+
}
57+
58+
.progress-message {
59+
margin: 8px 0 0 0;
60+
font-size: 0.9rem;
61+
}
62+
63+
.progress-message.hint {
64+
color: #999;
65+
font-style: italic;
66+
}
67+
68+
.progress-message.summary {
69+
display: flex;
70+
gap: 24px;
71+
align-items: center;
72+
}
73+
74+
.progress-message .success-count,
75+
.progress-message .error-count {
76+
display: inline-flex;
77+
align-items: center;
78+
gap: 4px;
79+
}
80+
81+
.progress-message .success-count {
82+
color: #4caf50;
83+
}
84+
85+
.progress-message .success-count mat-icon {
86+
font-size: 18px;
87+
width: 18px;
88+
height: 18px;
89+
}
90+
91+
.progress-message .error-count {
92+
color: #f44336;
93+
}
94+
95+
.progress-message .error-count mat-icon {
96+
font-size: 18px;
97+
width: 18px;
98+
height: 18px;
99+
}
100+
101+
.col-container {
102+
display: flex;
103+
flex: 1;
104+
min-height: 0;
105+
}
106+
107+
.column {
108+
padding: 16px;
109+
border: 1px solid #ccc;
110+
overflow-y: auto;
111+
}
112+
113+
.first {
114+
width: 28%;
115+
min-width: 220px;
116+
}
117+
118+
.second {
119+
flex: 1;
120+
min-width: 300px;
121+
display: flex;
122+
flex-direction: column;
123+
}
124+
125+
.second h3 {
126+
flex-shrink: 0;
127+
}
128+
129+
.second .right-panel-header {
130+
flex-shrink: 0;
131+
}
132+
133+
.second .total-hint {
134+
flex-shrink: 0;
135+
}
136+
137+
.column h3 {
138+
margin: 0 0 12px 0;
139+
}
140+
141+
.hint {
142+
color: #666;
143+
font-style: italic;
144+
margin: 12px 0;
145+
}
146+
147+
.editions-list {
148+
padding: 0;
149+
}
150+
151+
/* Material wraps content in .mdc-list-item__content; make it flex row so icon stays on the right */
152+
:host ::ng-deep .edition-item .mdc-list-item__content {
153+
display: flex !important;
154+
flex-direction: row !important;
155+
flex-wrap: nowrap !important;
156+
align-items: center !important;
157+
gap: 8px;
158+
width: 100%;
159+
box-sizing: border-box;
160+
}
161+
162+
/* Allow two lines of text in list item (override single-line) */
163+
:host ::ng-deep .edition-item.mdc-list-item--with-one-line {
164+
align-items: center;
165+
min-height: 52px;
166+
}
167+
168+
.edition-item {
169+
cursor: pointer;
170+
border-radius: 4px;
171+
margin-bottom: 4px;
172+
}
173+
174+
.edition-text {
175+
flex: 1 1 auto;
176+
min-width: 0;
177+
overflow: hidden;
178+
}
179+
180+
.edition-play-icon {
181+
flex: 0 0 auto;
182+
margin-left: auto;
183+
display: inline-flex;
184+
align-items: center;
185+
justify-content: center;
186+
cursor: pointer;
187+
color: #1976d2;
188+
}
189+
190+
.edition-play-icon:hover:not(.disabled) {
191+
color: #1565c0;
192+
}
193+
194+
.edition-play-icon.disabled {
195+
color: #9e9e9e;
196+
cursor: not-allowed;
197+
pointer-events: none;
198+
}
199+
200+
.edition-play-icon mat-icon {
201+
font-size: 20px;
202+
width: 20px;
203+
height: 20px;
204+
}
205+
206+
.edition-play-icon mat-spinner {
207+
display: inline-block;
208+
}
209+
210+
.edition-text {
211+
display: flex;
212+
flex-direction: column;
213+
}
214+
215+
.edition-item:hover {
216+
background-color: #f5f5f5;
217+
}
218+
219+
.edition-item.selected {
220+
background-color: #e3f2fd;
221+
}
222+
223+
.edition-name {
224+
display: flex;
225+
align-items: center;
226+
gap: 6px;
227+
font-weight: 500;
228+
}
229+
230+
.edition-error-icon {
231+
color: #f44336;
232+
font-size: 16px;
233+
width: 16px;
234+
height: 16px;
235+
cursor: help;
236+
}
237+
238+
.edition-count {
239+
display: block;
240+
font-size: 0.85rem;
241+
color: #666;
242+
}
243+
244+
.edition-item.has-error .edition-count {
245+
color: #f44336;
246+
}
247+
248+
.right-panel-header {
249+
margin-bottom: 12px;
250+
}
251+
252+
/* Alinear ícono y texto en el botón del panel derecho */
253+
:host ::ng-deep .right-panel-header button .mdc-button__label {
254+
display: inline-flex;
255+
align-items: center;
256+
gap: 8px;
257+
}
258+
259+
:host ::ng-deep .right-panel-header button mat-icon {
260+
margin: 0 !important;
261+
vertical-align: middle;
262+
}
263+
264+
:host ::ng-deep .right-panel-header button .btn-spinner {
265+
margin-right: 0 !important;
266+
}
267+
268+
.total-hint {
269+
margin: 0 0 8px 0;
270+
font-size: 0.9rem;
271+
}
272+
273+
.executed-ecl {
274+
font-weight: 300;
275+
font-style: italic;
276+
color: #666;
277+
}
278+
279+
.results-table-wrapper {
280+
overflow: auto;
281+
flex: 1;
282+
min-height: 0;
283+
}
284+
285+
.results-table {
286+
width: 100%;
287+
}
288+
289+
.export-section {
290+
margin-top: 12px;
291+
display: flex;
292+
align-items: center;
293+
gap: 16px;
294+
flex-shrink: 0;
295+
}
296+
297+
.export-status {
298+
font-size: 0.9rem;
299+
color: #666;
300+
}
301+
302+
.export-progress {
303+
width: 200px;
304+
}
305+
306+
.load-more-link {
307+
display: inline-block;
308+
color: #1976d2;
309+
cursor: pointer;
310+
font-size: 0.9rem;
311+
}
312+
313+
.load-more-link:hover {
314+
text-decoration: underline;
315+
color: #1565c0;
316+
}
317+
318+
/* Load more row - styled like other table rows */
319+
:host ::ng-deep .results-table .load-more-cell {
320+
padding: 12px 16px;
321+
}

0 commit comments

Comments
 (0)