Skip to content

Commit b1c40bc

Browse files
committed
[fix] Polish extensions widget UX #98
Related to #98
1 parent 772cd60 commit b1c40bc

2 files changed

Lines changed: 75 additions & 22 deletions

File tree

django_x509/static/django-x509/css/extensions-widget.css

Lines changed: 46 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,30 +3,50 @@
33
}
44

55
.x509-extensions-widget__message {
6-
color: #a41515;
6+
color: var(--error-fg);
77
margin-bottom: 0.75rem;
88
}
99

1010
.x509-extensions-row {
11-
background: #fff;
12-
border: 1px solid #d0d7de;
11+
background: var(--darkened-bg);
12+
border: 1px solid var(--border-color);
1313
border-radius: 6px;
14+
color: var(--body-fg);
1415
margin-bottom: 0.75rem;
1516
padding: 0.9rem;
1617
}
1718

1819
.x509-extensions-row__header {
19-
align-items: center;
20-
display: flex;
21-
flex-wrap: wrap;
20+
align-items: start;
21+
column-gap: 1rem;
22+
display: grid;
2223
gap: 0.75rem;
23-
justify-content: space-between;
24+
grid-template-areas:
25+
"select remove"
26+
"critical remove";
27+
grid-template-columns: minmax(0, 1fr) auto;
2428
}
2529

2630
.x509-extensions-row__field {
31+
align-items: start;
32+
display: flex;
33+
flex-direction: column;
34+
gap: 0.35rem;
35+
min-width: 0;
36+
}
37+
38+
.x509-extensions-row__field--select {
39+
grid-area: select;
40+
max-width: 20rem;
41+
}
42+
43+
.x509-extensions-row__toggle {
44+
grid-area: critical;
2745
align-items: center;
2846
display: inline-flex;
29-
gap: 0.5rem;
47+
gap: 0.35rem;
48+
margin-top: 0;
49+
white-space: nowrap;
3050
}
3151

3252
.x509-extensions-row__label {
@@ -36,6 +56,7 @@
3656
}
3757

3858
.x509-extensions-row__description {
59+
color: var(--body-quiet-color);
3960
margin: 0.65rem 0 0.4rem;
4061
}
4162

@@ -56,10 +77,22 @@
5677
}
5778

5879
.x509-extensions-input,
80+
.x509-extensions-select {
81+
max-width: 100%;
82+
min-width: 0;
83+
width: 100%;
84+
}
85+
5986
.x509-extensions-select {
6087
min-width: 16rem;
6188
}
6289

90+
.x509-extensions-remove {
91+
grid-area: remove;
92+
align-self: start;
93+
justify-self: end;
94+
}
95+
6396
.x509-extensions-raw {
6497
margin-top: 0.75rem;
6598
}
@@ -72,6 +105,7 @@
72105
@media screen and (max-width: 767px) {
73106
.x509-extensions-row__header {
74107
align-items: flex-start;
108+
display: flex;
75109
flex-direction: column;
76110
}
77111

@@ -80,9 +114,12 @@
80114
flex-direction: column;
81115
}
82116

117+
.x509-extensions-row__toggle {
118+
margin-top: 0;
119+
}
120+
83121
.x509-extensions-input,
84122
.x509-extensions-select {
85-
min-width: 100%;
86123
width: 100%;
87124
}
88125
}

django_x509/static/django-x509/js/extensions-widget.js

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@
108108
textarea.value = JSON.stringify(items, null, 2);
109109
}
110110

111-
function buildArrayValueEditor(rowBody, item, option, onChange) {
111+
function buildArrayValueEditor(rowBody, item, option, onSync) {
112112
var wrapper = createElement("div", "x509-extensions-choice-list"),
113113
valueSchema = getValueSchema(option);
114114

@@ -124,7 +124,7 @@
124124
.map(function (element) {
125125
return element.value;
126126
});
127-
onChange();
127+
onSync();
128128
});
129129
label.appendChild(checkbox);
130130
label.appendChild(document.createTextNode(" " + choice));
@@ -134,7 +134,7 @@
134134
rowBody.appendChild(wrapper);
135135
}
136136

137-
function buildStringValueEditor(rowBody, item, option, onChange) {
137+
function buildStringValueEditor(rowBody, item, option, onSync) {
138138
var input = createElement("input", "vTextField x509-extensions-input"),
139139
valueSchema = getValueSchema(option);
140140

@@ -145,21 +145,34 @@
145145
}
146146
input.addEventListener("input", function () {
147147
item.value = input.value;
148-
onChange();
148+
onSync();
149149
});
150150
rowBody.appendChild(input);
151151
}
152152

153-
function renderRow(editor, items, options, optionMap, index, onChange, labels) {
153+
function renderRow(
154+
editor,
155+
items,
156+
options,
157+
optionMap,
158+
index,
159+
onSync,
160+
onStructureChange,
161+
labels,
162+
) {
154163
var item = items[index],
155164
option = optionMap[item.name],
156165
valueSchema = getValueSchema(option),
157166
row = createElement("div", "x509-extensions-row"),
158167
header = createElement("div", "x509-extensions-row__header"),
159-
selectWrap = createElement("label", "x509-extensions-row__field"),
168+
selectWrap = createElement(
169+
"label",
170+
"x509-extensions-row__field x509-extensions-row__field--select",
171+
),
160172
selectLabel = createElement("span", "x509-extensions-row__label", "Extension"),
161173
select = createElement("select", "x509-extensions-select"),
162-
criticalWrap = createElement("label", "x509-extensions-row__field"),
174+
criticalWrap = createElement("label", "x509-extensions-row__toggle"),
175+
criticalLabel = createElement("span", "", "Critical"),
163176
critical = createElement("input"),
164177
removeButton = createElement(
165178
"button",
@@ -185,25 +198,25 @@
185198
var nextOption = optionMap[select.value];
186199
item.name = nextOption.name;
187200
item.value = getDefaultValue(getValueSchema(nextOption));
188-
onChange();
201+
onStructureChange();
189202
});
190203

191204
critical.type = "checkbox";
192205
critical.checked = item.critical;
193206
critical.addEventListener("change", function () {
194207
item.critical = critical.checked;
195-
onChange();
208+
onSync();
196209
});
197210

198211
removeButton.type = "button";
199212
removeButton.addEventListener("click", function () {
200213
items.splice(index, 1);
201-
onChange();
214+
onStructureChange();
202215
});
203216

204217
selectWrap.appendChild(selectLabel);
205218
selectWrap.appendChild(select);
206-
criticalWrap.appendChild(document.createTextNode("Critical "));
219+
criticalWrap.appendChild(criticalLabel);
207220
criticalWrap.appendChild(critical);
208221
header.appendChild(selectWrap);
209222
header.appendChild(criticalWrap);
@@ -218,9 +231,9 @@
218231

219232
rowBody.appendChild(valueLabel);
220233
if (valueSchema.type === "array") {
221-
buildArrayValueEditor(rowBody, item, option, onChange);
234+
buildArrayValueEditor(rowBody, item, option, onSync);
222235
} else {
223-
buildStringValueEditor(rowBody, item, option, onChange);
236+
buildStringValueEditor(rowBody, item, option, onSync);
224237
}
225238
row.appendChild(rowBody);
226239
editor.appendChild(row);
@@ -236,6 +249,9 @@
236249
options,
237250
optionMap,
238251
index,
252+
function () {
253+
syncTextarea(textarea, items);
254+
},
239255
function () {
240256
syncTextarea(textarea, items);
241257
renderEditor(widget, textarea, editor, items, options, optionMap, labels);

0 commit comments

Comments
 (0)