diff --git a/ui/src/components/core/Button.tsx b/ui/src/components/core/Button.tsx index 5c902db1..4ab4c0fa 100644 --- a/ui/src/components/core/Button.tsx +++ b/ui/src/components/core/Button.tsx @@ -53,7 +53,7 @@ const Button: React.FC = ({ focus-visible:outline-nuances-white fill-nuances-black`, - tertiary: `bg-nuances-white + tertiary: ` text-primary-600 underline hover:text-primary-400 @@ -67,16 +67,25 @@ const Button: React.FC = ({ disabled: { primary: `bg-nuances-50 text-nuances-300 - fill-nuances-300`, + fill-nuances-300 + active: bg-nuances-50 + hover:bg-nuances-50 + `, secondary: `bg-nuances-50 text-nuances-300 - fill-nuances-300`, + fill-nuances-300 + active: bg-nuances-50 + hover:bg-nuances-50`, - tertiary: `bg-nuances-white - text-nuances-300 + tertiary: ` underline - fill-nuances-300`, + text-nuances-200 + fill-nuances-200 + active:text-nuances-200 + active:fill-nuances-200 + hover:text-nuances-200 + hover:fill-nuances-200`, }, }, dark: { @@ -117,18 +126,26 @@ const Button: React.FC = ({ disabled: { primary: `bg-nuances-50 text-nuances-300 - fill-nuances-300`, + fill-nuances-300 + hover:bg-nuances-50 + active:bg-nuances-50`, secondary: `bg-nuances-50 text-nuances-300 - fill-nuances-300`, + fill-nuances-300 + hover:bg-nuances-50 + active:bg-nuances-50`, tertiary: `bg-nuances-black - text-nuances-300 underline - fill-nuances-300`, + text-nuances-300 + fill-nuances-300 + hover:text-nuances-300 + hover:fill-nuances-300 + active:text-nuances-300 + active:fill-nuances-300`, }, - } + }, }; return ( @@ -137,8 +154,8 @@ const Button: React.FC = ({ `relative px-4 py-2 - rounded-md - ${styles[theme].base[variant]}`, + rounded-md`, + styles[theme].base[variant], disabled && styles[theme].disabled[variant], className )} @@ -171,7 +188,9 @@ const Button: React.FC = ({ {rightIcon} )} {label && ( - + {label} )} diff --git a/ui/src/pages/Layers.tsx b/ui/src/pages/Layers.tsx index 8f3bbb63..9016a5f1 100644 --- a/ui/src/pages/Layers.tsx +++ b/ui/src/pages/Layers.tsx @@ -31,13 +31,10 @@ const Layers: React.FC = () => { const [layerLimit, setLayerLimit] = useState(10); const [searchParams, setSearchParams] = useSearchParams(); - const search = useMemo( - () => { - setLayerOffset(0); - return searchParams.get("search") || "" - }, - [searchParams] - ); + const search = useMemo(() => { + setLayerOffset(0); + return searchParams.get("search") || ""; + }, [searchParams]); const setSearch = useCallback( (search: string) => { @@ -108,6 +105,18 @@ const Layers: React.FC = () => { }), }); + const updateLimit = useCallback( + (limit: number) => { + if (layersQuery.isSuccess) { + if (layerOffset + limit > layersQuery.data.results.length) { + setLayerOffset(Math.max(0, layersQuery.data.results.length - limit)); + } + setLayerLimit(limit); + } + }, + [layerOffset, layersQuery] + ); + return (
{
- - {layerOffset + 1} - {Math.min(layerOffset + layerLimit, layersQuery.isSuccess ? layersQuery.data.results.length : 0)} of {layersQuery.isSuccess ? layersQuery.data.results.length : 0} - - + setLayerOffset(Math.max(0, layerOffset - layerLimit)) + } + disabled={layerOffset == 0} + > + Previous + + {layersQuery.isSuccess ? ( + + {layerOffset + 1} -{" "} + {Math.min( + layerOffset + layerLimit, + layersQuery.isSuccess ? layersQuery.data.results.length : 0 + )}{" "} + of{" "} + {layersQuery.isSuccess ? layersQuery.data.results.length : 0} + + ) : ( + + {layersQuery.isLoading ? "Loading..." : "0 - 0 of 0"} + + )} + + Items per page: - + `} + > + Items per page:{" "} + +
{ ) : layersQuery.isSuccess ? ( layersQuery.data.results.length > 0 ? ( - layersQuery.data.results.slice(layerOffset, layerOffset + layerLimit).map((layer, index) => ( - - )) + layersQuery.data.results + .slice(layerOffset, layerOffset + layerLimit) + .map((layer, index) => ( + + )) ) : ( { ) : layersQuery.isSuccess ? ( layersQuery.data.results.length > 0 ? ( - +
) : (
{ const { theme } = useContext(ThemeContext); const { layerId, runId } = useParams(); + const [layerOffset, setLayerOffset] = useState(0); + const [layerLimit, setLayerLimit] = useState(10); const [searchParams, setSerchParams] = useSearchParams(); const navigate = useNavigate(); @@ -57,8 +60,8 @@ const Logs: React.FC = () => { return param === "ascending" ? "ascending" : param === "descending" - ? "descending" - : null; + ? "descending" + : null; }, [searchParams]); const setDateFilter = useCallback( @@ -101,20 +104,33 @@ const Logs: React.FC = () => { dateFilter === "ascending" ? new Date(a.lastRunAt).getTime() - new Date(b.lastRunAt).getTime() : dateFilter === "descending" - ? new Date(b.lastRunAt).getTime() - new Date(a.lastRunAt).getTime() - : 0 + ? new Date(b.lastRunAt).getTime() - + new Date(a.lastRunAt).getTime() + : 0 ), }), }); + const updateLimit = useCallback( + (limit: number) => { + if (layersQuery.isSuccess) { + if (layerOffset + limit > layersQuery.data.results.length) { + setLayerOffset(Math.max(0, layersQuery.data.results.length - limit)); + } + setLayerLimit(limit); + } + }, + [layerOffset, layersQuery] + ); + const handleActive = (layer: Layer, run?: string) => { navigate({ pathname: `/logs/${layer.namespace}/${layer.name}${ run ? `/${run}` : layer.latestRuns.length > 0 - ? `/${layer.lastRun.id}` - : "" + ? `/${layer.lastRun.id}` + : "" }`, search: searchParams.toString(), }); @@ -159,20 +175,20 @@ const Logs: React.FC = () => { value={search} onChange={(e) => setSearch(e.target.value)} /> -
+
{` ${ layersQuery.isSuccess ? layersQuery.data.results.length : 0 } layers - `} + `} { ? "border-primary-600" : "border-nuances-200" } - `} + `} > Filter by @@ -208,15 +224,86 @@ const Logs: React.FC = () => {
setHidePRFilter(!hidePRFilter)} label="Hide Pull Requests" />
+
+ + {layersQuery.isSuccess ? ( + + {layerOffset + 1} -{" "} + {Math.min( + layerOffset + layerLimit, + layersQuery.isSuccess ? layersQuery.data.results.length : 0 + )}{" "} + of {layersQuery.isSuccess ? layersQuery.data.results.length : 0} + + ) : ( + + {layersQuery.isLoading ? "Loading..." : "0 - 0 of 0"} + + )} + + + Items per page:{" "} + + +
{ ) : layersQuery.isSuccess ? ( layersQuery.data.results.length > 0 ? ( - layersQuery.data.results.map((layer, index) => ( - handleActive(layer)} - handleActive={handleActive} - layer={layer} - /> - )) + layersQuery.data.results + .slice(layerOffset, layerOffset + layerLimit) + .map((layer, index) => ( + handleActive(layer)} + handleActive={handleActive} + layer={layer} + /> + )) ) : (