release: prepare v2.0.18 interface and reset reliability update

Preserve package progress and history across immediate cleanup, make extraction resets wait for all post-processing tasks, and keep archive diagnostics out of compact status cells. Rework account creation and settings selectors, improve context-menu placement, remove accidental row dragging, and expand regression coverage for the corrected workflows.
This commit is contained in:
Sucukdeluxe
2026-08-11 00:46:46 +02:00
parent 9b1eeada2e
commit ef5c20c8df
25 changed files with 1953 additions and 952 deletions
@@ -220,9 +220,10 @@ function AccountRow({
<span className="settings-account-status" role="cell">
<span className={`settings-account-status-badge is-${row.status.tone}`}>{row.status.text}</span>
</span>
<span className="settings-account-traffic" role="cell">{row.traffic}</span>
<span className="settings-account-username settings-copyable" role="cell" title={row.username}>{row.username}</span>
<span className="settings-account-expires" role="cell">{row.expires}</span>
<span className="settings-account-traffic" role="cell">{row.traffic}</span>
<span className="settings-account-username settings-copyable" role="cell" title={row.username}>{row.username}</span>
<span className="settings-account-email settings-copyable" role="cell" title={row.email}>{row.email}</span>
<span className="settings-account-expires" role="cell">{row.expires}</span>
<span className="settings-account-credential" role="cell">{row.credential}</span>
<span className="settings-account-column-actions" role="cell">
<button
@@ -498,32 +499,49 @@ export function AccountAddDialog({
size="account"
title="Account hinzufügen"
>
<label className="settings-account-picker-selector">
<span>Dienst / Zugangstyp</span>
<select
aria-label="Dienst / Zugangstyp"
className="settings-control"
onChange={(event) => actions.onOptionSelect(event.target.value)}
value={model.selectedOptionId ?? ""}
>
{model.options.map((option) => (
<option key={option.id} value={option.id}>{option.title} · {option.mode}</option>
))}
</select>
</label>
{selectedOption ? (
<>
<div className="settings-account-option-meta">
<div>
<strong>{selectedOption.title}</strong>
<span>{selectedOption.description}</span>
</div>
<div>
<strong>{selectedOption.mode}</strong>
<span>{selectedOption.functionLabel}</span>
</div>
</div>
<AccountDialogFields fields={model.fields} onChange={actions.onFieldChange} />
<div className="settings-account-picker-selector">
<span>Dienst / Zugangstyp</span>
<input
aria-label="Dienst oder Zugangstyp suchen"
className="settings-control"
onChange={(event) => actions.onQueryChange(event.target.value)}
placeholder="Dienst oder Zugangstyp suchen"
type="search"
value={model.query}
/>
</div>
<div className="settings-account-picker-table">
<div aria-hidden="true" className="settings-account-picker-header">
<span>Dienst</span>
<span>Typ/Funktion</span>
</div>
<div aria-label="Dienst / Zugangstyp" className="settings-account-picker-list" role="listbox">
{model.options.map((option) => (
<button
aria-selected={option.id === model.selectedOptionId}
className={`settings-account-picker-row${option.id === model.selectedOptionId ? " is-selected" : ""}`}
data-account-option-id={option.id}
key={option.id}
onClick={() => actions.onOptionSelect(option.id)}
role="option"
type="button"
>
<span className="settings-account-picker-service">
{option.icon ? <img alt="" aria-hidden="true" draggable={false} height="18" src={option.icon} width="18" /> : null}
<span>{option.title}</span>
</span>
<span>{option.functionLabel}</span>
</button>
))}
</div>
</div>
{selectedOption ? (
<>
<div className="settings-account-option-summary">
<strong>Zugangsdaten für {selectedOption.title}</strong>
<span>{selectedOption.description}</span>
</div>
<AccountDialogFields fields={model.fields} onChange={actions.onFieldChange} />
</>
) : null}
{model.error ? <p className="settings-account-dialog-error" role="alert">{model.error}</p> : null}