Here we go

- Moved Delete/Save buttons to bottom of flag
- Changed all arrow/v's to proper carrots
- Fixed your weird ass way of hiding the dropdown bodies
- Fixed the flag inputs overflowing
- Fixed various margins/paddings
- The background of the list view is now #696969 niceeee
- Added   for the list view so your name and type aren't glued together anymore
This commit is contained in:
D3vision 2023-05-15 18:49:21 +02:00
parent 43a6a9f88c
commit fa1fb4e87f
4 changed files with 59 additions and 11 deletions

View File

@ -48,7 +48,7 @@ export type InputElementProperties<T> = {
export const ToggleSwitch = ({ value, onChange, inputRef, children }: InputElementProperties<boolean>) => { export const ToggleSwitch = ({ value, onChange, inputRef, children }: InputElementProperties<boolean>) => {
return <label> return <label>
<span className="check-box check-box-row"> <span className="check-box check-box-row mb-2">
{children && <b>{children}</b>} {children && <b>{children}</b>}
<input ref={inputRef} defaultChecked={value} onChange={onChange} type='checkbox' /> <input ref={inputRef} defaultChecked={value} onChange={onChange} type='checkbox' />
</span> </span>

View File

@ -7,7 +7,7 @@
--color-primary: #2760aa; --color-primary: #2760aa;
--color-lightGrey: #d2d6dd; --color-lightGrey: #d2d6dd;
--color-grey: #ccc; --color-grey: #ccc;
--color-darkGrey: #777; --color-darkGrey: #696969;
--color-error: #d43939; --color-error: #d43939;
--color-success: #28bd14; --color-success: #28bd14;
--grid-maxWidth: 120rem; --grid-maxWidth: 120rem;

View File

@ -18,7 +18,8 @@
} }
details .flag { details .flag {
margin-left: 1.7rem; margin: 1.7rem;
padding-top: 5px;
} }
.tile { .tile {
@ -36,16 +37,61 @@ details .flag {
user-select: none; user-select: none;
background-color: var(--color-darkGrey); background-color: var(--color-darkGrey);
padding: 1rem; padding: 1rem;
margin: 0.5rem; margin: 0.5rem 0rem;
border-radius: 1rem; border-radius: 1rem;
border: 2px solid var(--bg-color); border: 2px solid var(--bg-color);
} }
.list.category > * { .list.category > * {
margin-left: 10px; margin-left: 10px;
margin-right: 10px;
} }
.popup .flag { .popup .flag {
height: 500px; height: 500px;
width: 500px; width: 500px;
}
.list .listBody{
display: none;
}
.list.open > .listBody{
display: inherit;
}
.list .listHeader{
display: flex;
align-items: center;
}
.list-carrot{
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1' id='Layer_1' x='0px' y='0px' viewBox='0 0 512 512' style='enable-background:new 0 0 512 512;' xml:space='preserve'%3E%3Cg%3E%3Cg%3E%3Cpath fill='%23f5f5f5' d='M441.751,475.584L222.166,256L441.75,36.416c6.101-6.101,7.936-15.275,4.629-23.253C443.094,5.184,435.286,0,426.667,0 H320.001c-5.675,0-11.093,2.24-15.083,6.251L70.251,240.917c-8.341,8.341-8.341,21.824,0,30.165l234.667,234.667 c3.989,4.011,9.408,6.251,15.083,6.251h106.667c8.619,0,16.427-5.184,19.712-13.163 C449.687,490.858,447.852,481.685,441.751,475.584z'/%3E%3C/g%3E%3C/g%3E%3Cg%3E%3C/g%3E%3Cg%3E%3C/g%3E%3Cg%3E%3C/g%3E%3Cg%3E%3C/g%3E%3Cg%3E%3C/g%3E%3Cg%3E%3C/g%3E%3Cg%3E%3C/g%3E%3Cg%3E%3C/g%3E%3Cg%3E%3C/g%3E%3Cg%3E%3C/g%3E%3Cg%3E%3C/g%3E%3Cg%3E%3C/g%3E%3Cg%3E%3C/g%3E%3Cg%3E%3C/g%3E%3Cg%3E%3C/g%3E%3C/svg%3E");
width: 10px;
height: 10px;
transition: transform ease-in-out 0.1s;
background-size: 10px;
background-repeat: no-repeat;
background-position: center;
transform: rotate(-180deg);
display: inline-block;
margin-right: 8px;
margin-left: 3px;
}
.list.open > .listHeader > .list-carrot, .list .listBody details[open] summary > .list-carrot{
transform: rotate(-90deg);
transition: transform ease-in-out 0.1s;
}
.list .listBody details summary::marker{
content: "";
}
.list .listBody details summary{
display: flex;
align-items: center;
}
.unsaved-changes {
outline: solid 1px #ffb300a6;
}
.list input{
box-sizing: border-box;
} }

View File

@ -11,6 +11,7 @@ const Flag = ({ flag: incoming }: { flag: APIFlag }) => {
const valueRef = useRef<HTMLInputElement>(null); const valueRef = useRef<HTMLInputElement>(null);
const updateFlag = (f: APIFlag) => { const updateFlag = (f: APIFlag) => {
console.log(f);
setFlag(f); setFlag(f);
setUnsaved(true); setUnsaved(true);
}; };
@ -26,13 +27,11 @@ const Flag = ({ flag: incoming }: { flag: APIFlag }) => {
else if (flag.type === 'number') Input = <NumberInput onChange={() => setUnsaved(true)} inputRef={valueRef} value={flag.value as number} type='float' />; else if (flag.type === 'number') Input = <NumberInput onChange={() => setUnsaved(true)} inputRef={valueRef} value={flag.value as number} type='float' />;
else if (flag.type === 'boolean') Input = <ToggleSwitch onChange={() => setUnsaved(true)} inputRef={valueRef} value={flag.value as boolean} />; else if (flag.type === 'boolean') Input = <ToggleSwitch onChange={() => setUnsaved(true)} inputRef={valueRef} value={flag.value as boolean} />;
return <div className='flag mt-0 mb-0'> return <div className='flag mt-0 mb-1'>
{unsaved && <i><small>Unsaved changes</small></i>} {unsaved && <i><small>Unsaved changes</small></i>}
<h3 className="mt-0 mb-1"> <h3 className="mt-0 mb-1">
<ClickToEdit onUpdate={val => updateFlag({ ...flag, name: val })} value={flag.name} /> <ClickToEdit onUpdate={val => updateFlag({ ...flag, name: val })} value={flag.name} />
</h3> </h3>
<button className="button danger">Delete</button>
{unsaved && <button onClick={save} className="button primary">Save</button>}
<p className="mt-0 mb-1"><b>ID:</b> {flag.id}</p> <p className="mt-0 mb-1"><b>ID:</b> {flag.id}</p>
<p className="mt-0 mb-1"> <p className="mt-0 mb-1">
<b>Environment: </b> <b>Environment: </b>
@ -50,6 +49,8 @@ const Flag = ({ flag: incoming }: { flag: APIFlag }) => {
<b>Value: </b> <b>Value: </b>
{Input} {Input}
</p> </p>
<button className="button danger">Delete</button>
{unsaved && <button onClick={save} className="button primary">Save</button>}
</div>; </div>;
}; };
@ -67,7 +68,8 @@ const FlagListElement = ({ flag }: { flag: APIFlag, onClick?: React.ReactEventHa
// </div>; // </div>;
return <details className='card list-element mt-2 mb-2'> return <details className='card list-element mt-2 mb-2'>
<summary className="clickable"> <summary className="clickable">
<b>{flag.name}</b> [{flag.type}] ({flag.id}) <i className="list-carrot"></i>
<b>{flag.name}</b>&nbsp;[{flag.type}] ({flag.id})
</summary> </summary>
<Flag flag={flag} /> <Flag flag={flag} />
@ -93,9 +95,9 @@ const ListCategory = ({ flags, name, setFlag }: { flags: OrganisedFlags, name: s
{elements} {elements}
</div>; </div>;
return <div className="list category"> return <div className={`list category${ hidden ? "" : " open" }`}>
<b className="clickable" onClick={() => { setHidden(!hidden); }}>{hidden ? '>' : 'v'} {capitalise(name || 'Unordered')}</b> <b className="clickable listHeader" onClick={() => { setHidden(!hidden); }}><i className="list-carrot"></i> {capitalise(name || 'Unordered')}</b>
<div hidden={hidden}> <div className="listBody">
{elements} {elements}
</div> </div>
</div>; </div>;