feat(widgets): add border color option to advanced-options (#2512)
* feat: add border color option for all widgets * fix: broken lockfile * fix: typecheck issue --------- Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
This commit is contained in:
@@ -49,6 +49,7 @@ export const WidgetPreviewPageContent = ({ kind, integrationData }: WidgetPrevie
|
|||||||
integrationIds: [],
|
integrationIds: [],
|
||||||
advancedOptions: {
|
advancedOptions: {
|
||||||
customCssClasses: [],
|
customCssClasses: [],
|
||||||
|
borderColor: "",
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ export const createItemCallback =
|
|||||||
integrationIds: [],
|
integrationIds: [],
|
||||||
advancedOptions: {
|
advancedOptions: {
|
||||||
customCssClasses: [],
|
customCssClasses: [],
|
||||||
|
borderColor: "",
|
||||||
},
|
},
|
||||||
} satisfies Modify<
|
} satisfies Modify<
|
||||||
Item,
|
Item,
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ describe("item actions duplicate-item", () => {
|
|||||||
kind: itemKind,
|
kind: itemKind,
|
||||||
integrationIds: ["1"],
|
integrationIds: ["1"],
|
||||||
options: { address: "localhost" },
|
options: { address: "localhost" },
|
||||||
advancedOptions: { customCssClasses: ["test"] },
|
advancedOptions: { customCssClasses: ["test"], borderColor: "#ff0000" },
|
||||||
})
|
})
|
||||||
.addLayout({ layoutId, sectionId: currentSectionId, ...currentItemSize })
|
.addLayout({ layoutId, sectionId: currentSectionId, ...currentItemSize })
|
||||||
.build();
|
.build();
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ export class ItemMockBuilder {
|
|||||||
integrationIds: [],
|
integrationIds: [],
|
||||||
advancedOptions: {
|
advancedOptions: {
|
||||||
customCssClasses: [],
|
customCssClasses: [],
|
||||||
|
borderColor: "",
|
||||||
},
|
},
|
||||||
...item,
|
...item,
|
||||||
} satisfies Item;
|
} satisfies Item;
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ export const BoardItemContent = ({ item }: BoardItemContentProps) => {
|
|||||||
"--opacity": board.opacity / 100,
|
"--opacity": board.opacity / 100,
|
||||||
containerType: "size",
|
containerType: "size",
|
||||||
overflow: item.kind === "iframe" ? "hidden" : undefined,
|
overflow: item.kind === "iframe" ? "hidden" : undefined,
|
||||||
|
"--border-color": item.advancedOptions.borderColor !== "" ? item.advancedOptions.borderColor : undefined,
|
||||||
},
|
},
|
||||||
}}
|
}}
|
||||||
p={0}
|
p={0}
|
||||||
|
|||||||
@@ -1070,6 +1070,9 @@
|
|||||||
},
|
},
|
||||||
"customCssClasses": {
|
"customCssClasses": {
|
||||||
"label": "Custom css classes"
|
"label": "Custom css classes"
|
||||||
|
},
|
||||||
|
"borderColor": {
|
||||||
|
"label": "Border color"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ export type BoardItemIntegration = z.infer<typeof integrationSchema>;
|
|||||||
|
|
||||||
export const itemAdvancedOptionsSchema = z.object({
|
export const itemAdvancedOptionsSchema = z.object({
|
||||||
customCssClasses: z.array(z.string()).default([]),
|
customCssClasses: z.array(z.string()).default([]),
|
||||||
|
borderColor: z.string().default(""),
|
||||||
});
|
});
|
||||||
|
|
||||||
export type BoardItemAdvancedOptions = z.infer<typeof itemAdvancedOptionsSchema>;
|
export type BoardItemAdvancedOptions = z.infer<typeof itemAdvancedOptionsSchema>;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
import { Button, Group, Stack } from "@mantine/core";
|
import { Button, CloseButton, ColorInput, Group, Stack, useMantineTheme } from "@mantine/core";
|
||||||
|
|
||||||
import { useForm } from "@homarr/form";
|
import { useForm } from "@homarr/form";
|
||||||
import { createModal } from "@homarr/modals";
|
import { createModal } from "@homarr/modals";
|
||||||
@@ -15,6 +15,7 @@ interface InnerProps {
|
|||||||
|
|
||||||
export const WidgetAdvancedOptionsModal = createModal<InnerProps>(({ actions, innerProps }) => {
|
export const WidgetAdvancedOptionsModal = createModal<InnerProps>(({ actions, innerProps }) => {
|
||||||
const t = useI18n();
|
const t = useI18n();
|
||||||
|
const theme = useMantineTheme();
|
||||||
const form = useForm({
|
const form = useForm({
|
||||||
initialValues: innerProps.advancedOptions,
|
initialValues: innerProps.advancedOptions,
|
||||||
});
|
});
|
||||||
@@ -30,6 +31,18 @@ export const WidgetAdvancedOptionsModal = createModal<InnerProps>(({ actions, in
|
|||||||
label={t("item.edit.field.customCssClasses.label")}
|
label={t("item.edit.field.customCssClasses.label")}
|
||||||
{...form.getInputProps("customCssClasses")}
|
{...form.getInputProps("customCssClasses")}
|
||||||
/>
|
/>
|
||||||
|
<ColorInput
|
||||||
|
label={t("item.edit.field.borderColor.label")}
|
||||||
|
format="hex"
|
||||||
|
swatches={Object.values(theme.colors).map((color) => color[6])}
|
||||||
|
rightSection={
|
||||||
|
<CloseButton
|
||||||
|
onClick={() => form.setFieldValue("borderColor", "")}
|
||||||
|
style={{ display: form.getInputProps("borderColor").value ? undefined : "none" }}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
{...form.getInputProps("borderColor")}
|
||||||
|
/>
|
||||||
<Group justify="end">
|
<Group justify="end">
|
||||||
<Button onClick={actions.closeModal} variant="subtle" color="gray">
|
<Button onClick={actions.closeModal} variant="subtle" color="gray">
|
||||||
{t("common.action.cancel")}
|
{t("common.action.cancel")}
|
||||||
|
|||||||
@@ -65,6 +65,7 @@ export const WidgetEditModal = createModal<ModalProps<WidgetKind>>(({ actions, i
|
|||||||
integrationIds: z.array(z.string()),
|
integrationIds: z.array(z.string()),
|
||||||
advancedOptions: z.object({
|
advancedOptions: z.object({
|
||||||
customCssClasses: z.array(z.string()),
|
customCssClasses: z.array(z.string()),
|
||||||
|
borderColor: z.string(),
|
||||||
}),
|
}),
|
||||||
}),
|
}),
|
||||||
),
|
),
|
||||||
|
|||||||
Reference in New Issue
Block a user