|
34 | 34 | /** @type {any} */ |
35 | 35 | let utilityMapper = {}; |
36 | 36 |
|
37 | | - /** @type {string[]} */ |
38 | | - let utilityCategoryOptions = []; |
39 | | -
|
40 | 37 | /** @type {import('$agentTypes').AgentUtility[]} */ |
41 | 38 | let innerUtilities = []; |
42 | 39 |
|
|
58 | 55 | contents.push(content); |
59 | 56 | utilityMapper[utility.category] = contents; |
60 | 57 | }); |
61 | | - const keys = Object.keys(utilityMapper).sort((/** @type {string} */ a, /** @type {string} */ b) => a.localeCompare(b)); |
62 | | - utilityCategoryOptions = ["", ...keys]; |
63 | 58 | }); |
64 | 59 | }); |
65 | 60 |
|
|
218 | 213 | } |
219 | 214 | handleAgentChange(); |
220 | 215 | } |
| 216 | +
|
| 217 | + /** |
| 218 | + * @param {any[]} options |
| 219 | + * @param {string} placeholder |
| 220 | + */ |
| 221 | + function getUtilityOptions(options, placeholder = '') { |
| 222 | + let list = options?.map(x => { |
| 223 | + return { |
| 224 | + label: x, |
| 225 | + value: x |
| 226 | + }; |
| 227 | + }) || []; |
| 228 | +
|
| 229 | + list = [{ |
| 230 | + label: placeholder || '', |
| 231 | + value: '' |
| 232 | + }, ...list]; |
| 233 | + return list; |
| 234 | + } |
| 235 | +
|
| 236 | + /** @param {number} uid */ |
| 237 | + function revertUtility(uid) { |
| 238 | + const found = innerUtilities.find((_, index) => index === uid); |
| 239 | + if (!found) return; |
| 240 | +
|
| 241 | + const originalItems = utilityMapper[found.category]?.find((/** @type {any} */ x) => x.name === found.name)?.items || []; |
| 242 | + found.items = [...originalItems]; |
| 243 | + innerRefresh(innerUtilities); |
| 244 | + handleAgentChange(); |
| 245 | + } |
221 | 246 | </script> |
222 | 247 |
|
223 | 248 | <Card> |
|
278 | 303 | type="select" |
279 | 304 | value={utility.category} |
280 | 305 | disabled={utility.disabled} |
281 | | - placeholder={'Select a category'} |
282 | 306 | on:change={e => changeUtilityCategory(e, uid)} |
283 | 307 | > |
284 | | - {#each utilityCategoryOptions as option} |
285 | | - <option value={option} selected={option == utility.category}>{option}</option> |
| 308 | + {#each getUtilityOptions(Object.keys(utilityMapper), 'Select a category') as option} |
| 309 | + <option value={option.value} selected={option.value == utility.category}> |
| 310 | + {option.label} |
| 311 | + </option> |
286 | 312 | {/each} |
287 | 313 | </Input> |
288 | 314 | </div> |
|
302 | 328 | {#if utility.category} |
303 | 329 | <div class="utility-content"> |
304 | 330 | <div class="utility-list-item"> |
305 | | - <div class="utility-label line-align-center"> |
306 | | - {'Name'} |
| 331 | + <div class="utility-label d-flex" style="gap: 10px;"> |
| 332 | + <div class="line-align-center">{'Name'}</div> |
| 333 | + {#if utility.name} |
| 334 | + <div class="line-align-center"> |
| 335 | + <!-- svelte-ignore a11y-click-events-have-key-events --> |
| 336 | + <!-- svelte-ignore a11y-no-static-element-interactions --> |
| 337 | + <i |
| 338 | + class="mdi mdi-refresh clickable" |
| 339 | + on:click={() => revertUtility(uid)} |
| 340 | + /> |
| 341 | + </div> |
| 342 | + {/if} |
307 | 343 | </div> |
308 | 344 | <div class="utility-value"> |
309 | 345 | <div class="utility-input line-align-center"> |
310 | 346 | <Input |
311 | 347 | type="select" |
312 | 348 | value={utility.name} |
313 | 349 | disabled={utility.disabled} |
314 | | - placeholder={'Select a utility'} |
315 | 350 | on:change={e => changeUtilityName(e, uid)} |
316 | 351 | > |
317 | | - {#each ['', ...utilityMapper[utility.category]?.map((/** @type {any} */ x) => x.name) || []] as option} |
318 | | - <option value={option} selected={option == utility.name}>{option}</option> |
| 352 | + {#each getUtilityOptions(utilityMapper[utility.category]?.map((/** @type {any} */ x) => x.name), 'Select a utility') as option} |
| 353 | + <option value={option.value} selected={option.value == utility.name}> |
| 354 | + {option.label} |
| 355 | + </option> |
319 | 356 | {/each} |
320 | 357 | </Input> |
321 | 358 | </div> |
|
0 commit comments