-
Notifications
You must be signed in to change notification settings - Fork 44
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[web] Storage page: break settings into multiple sections #1045
Conversation
219ae48
to
0e7051d
Compare
And take the opportunity to avoid triggering the onChange callback when the user actually does not change the selected device but clicks the "Accept" button of the selection dialog.
0e7051d
to
2491bf4
Compare
And mount there the storage/ProposalVolumes component instead of doing so in the settings section. Note that, most probably, the code of ProposalFileSystemsSection and ProposalVolumes could be merged in a single component.
2491bf4
to
f39c9af
Compare
Intended for adding, when needed, a short explanation about its usefulness.
selected={device} | ||
devices={devices} | ||
onChange={changeSelected} | ||
/> | ||
</Form> | ||
); | ||
}; | ||
|
||
/** | ||
* Allows to select the installation device. | ||
* @component | ||
* | ||
* @callback onChangeFn | ||
* @param {string} device - Name of the selected device. | ||
* | ||
* @param {object} props | ||
* @param {string} [props.current] - Device name, if any. | ||
* @param {StorageDevice[]} [props.devices=[]] - Available devices for the selection. | ||
* @param {boolean} [props.isLoading=false] - Whether to show the selector as loading. | ||
* @param {onChangeFn} [props.onChange=noop] - On change callback. | ||
*/ | ||
const InstallationDeviceField = ({ | ||
current, | ||
devices = [], | ||
isLoading = false, | ||
onChange = noop | ||
}) => { | ||
const [device, setDevice] = useState(devices.find(d => d.name === current)); | ||
const [isFormOpen, setIsFormOpen] = useState(false); | ||
|
||
const openForm = () => setIsFormOpen(true); | ||
|
||
const closeForm = () => setIsFormOpen(false); | ||
|
||
const acceptForm = (selectedDevice) => { | ||
closeForm(); | ||
setDevice(selectedDevice); | ||
onChange(selectedDevice); | ||
}; | ||
|
||
/** | ||
* Renders a button that allows changing selected device | ||
* | ||
* NOTE: if a device is already selected, its name and size will be used for | ||
* the button text. Otherwise, a "No device selected" text will be shown. | ||
* | ||
* @param {object} props | ||
* @param {StorageDevice|undefined} [props.current] - Currently selected device, if any. | ||
*/ | ||
const DeviceContent = ({ device }) => { | ||
return ( | ||
<Button variant="link" isInline onClick={openForm}> | ||
{device ? deviceLabel(device) : _("No device selected yet")} | ||
</Button> | ||
); | ||
}; | ||
|
||
if (isLoading) { | ||
return <Skeleton screenreaderText={_("Loading selected device")} width="25%" />; | ||
} | ||
|
||
const description = _("Select the device for installing the system."); | ||
|
||
return ( | ||
<> | ||
<div className="split"> | ||
<span>{_("Installation device")}</span> | ||
<DeviceContent device={device} /> | ||
</div> | ||
<Popup | ||
title={_("Installation device")} | ||
description={description} | ||
isOpen={isFormOpen} | ||
> | ||
<If | ||
condition={devices.length === 0} | ||
then={_("No devices found.")} | ||
else={ | ||
<InstallationDeviceForm | ||
id="bootDeviceForm" | ||
current={device} | ||
devices={devices} | ||
onSubmit={acceptForm} | ||
/> | ||
} | ||
/> | ||
<Popup.Actions> | ||
<Popup.Confirm | ||
form="bootDeviceForm" | ||
type="submit" | ||
isDisabled={devices.length === 0} | ||
> | ||
{_("Accept")} | ||
</Popup.Confirm> | ||
<Popup.Cancel onClick={closeForm} /> | ||
</Popup.Actions> | ||
</Popup> | ||
</> | ||
); | ||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Note: most probably, these internal components does not make sense now that the device selector it's in its own section. I.e., most of the code could be merged into the main component. But it is out of the scope of this PR, especially taking into account that there are more planned changes ahead that could affect this component too. So, let's do it in a re-factorization round.
|
||
return ( | ||
<Section title={_("File systems")}> | ||
<ProposalVolumes |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This PR does not directly integrate the <ProposalVolumes>
code here because there is a plan for reworking almost the whole thing in a separated PR.
web/src/components/core/Section.jsx
Outdated
<h2 id={headerId}>{headerIcon}<span>{headerText}</span></h2> | ||
<header> | ||
<h2 id={headerId}>{headerIcon}<span>{headerText}</span></h2> | ||
<p>{description}</p> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
By now, I'm not adding an aria-describedby
to the section pointing to this. I'm not sure if
- It's actually needed, since the description will be visible and I guess it will be read aloud
- It will be read twice
- It's needed to add an aria-hidden here too.
So, let's postpone this small detail just a bit, until we have time to test these a11y things.
This comment was marked as resolved.
This comment was marked as resolved.
This comment was marked as outdated.
This comment was marked as outdated.
Based on @ancorgs's comment at #1045 (comment)
We've agreed that section title states almost the same.
To avoid having empty <p> HTML nodes when description is not given.
Since, using @ancorgs's words, it is more > consistent with the future we want to go (in which LVM is part of > the device selection)
Prepare for releasing Agama 8. It includes the following pull requests: * #884 * #886 * #914 * #918 * #956 * #957 * #958 * #959 * #960 * #961 * #962 * #963 * #964 * #965 * #966 * #969 * #970 * #976 * #977 * #978 * #979 * #980 * #981 * #983 * #984 * #985 * #986 * #988 * #991 * #992 * #995 * #996 * #997 * #999 * #1003 * #1004 * #1006 * #1007 * #1008 * #1009 * #1010 * #1011 * #1012 * #1014 * #1015 * #1016 * #1017 * #1020 * #1022 * #1023 * #1024 * #1025 * #1027 * #1028 * #1029 * #1030 * #1031 * #1032 * #1033 * #1034 * #1035 * #1036 * #1038 * #1039 * #1041 * #1042 * #1043 * #1045 * #1046 * #1047 * #1048 * #1052 * #1054 * #1056 * #1057 * #1060 * #1061 * #1062 * #1063 * #1064 * #1066 * #1067 * #1068 * #1069 * #1071 * #1072 * #1073 * #1074 * #1075 * #1079 * #1080 * #1081 * #1082 * #1085 * #1086 * #1087 * #1088 * #1089 * #1090 * #1091 * #1092 * #1093 * #1094 * #1095 * #1096 * #1097 * #1098 * #1099 * #1100 * #1102 * #1103 * #1104 * #1105 * #1106 * #1109 * #1110 * #1111 * #1112 * #1114 * #1116 * #1117 * #1118 * #1119 * #1120 * #1121 * #1122 * #1123 * #1125 * #1126 * #1127 * #1128 * #1129 * #1130 * #1131 * #1132 * #1133 * #1134 * #1135 * #1136 * #1138 * #1139 * #1140 * #1141 * #1142 * #1143 * #1144 * #1145 * #1146 * #1147 * #1148 * #1149 * #1151 * #1152 * #1153 * #1154 * #1155 * #1156 * #1157 * #1158 * #1160 * #1161 * #1162 * #1163 * #1164 * #1165 * #1166 * #1167 * #1168 * #1169 * #1170 * #1171 * #1172 * #1173 * #1174 * #1175 * #1177 * #1178 * #1180 * #1181 * #1182 * #1183 * #1184 * #1185 * #1187 * #1188 * #1189 * #1190 * #1191 * #1192 * #1193 * #1194 * #1195 * #1196 * #1198 * #1199 * #1200 * #1201 * #1203 * #1204 * #1205 * #1206 * #1207 * #1208 * #1209 * #1210 * #1211 * #1212 * #1213 * #1214 * #1215 * #1216 * #1217 * #1219 * #1220 * #1221 * #1222 * #1223 * #1224 * #1225 * #1226 * #1227 * #1229
Break the storage settings section to accomplish the organization defined in the storage UI document. Thus, proposed changes make the page to have Device, Settings, and File systems sections instead of only Settings.
Also, it includes a last minute change about moving the LVM setting to the new Device section, because it is more
Related to https://trello.com/c/SK4uBRnw (internal link)