diff --git a/client/packages/lowcoder-design/src/components/colorSelect/index.tsx b/client/packages/lowcoder-design/src/components/colorSelect/index.tsx index 52f2a206f..18e14008a 100644 --- a/client/packages/lowcoder-design/src/components/colorSelect/index.tsx +++ b/client/packages/lowcoder-design/src/components/colorSelect/index.tsx @@ -48,7 +48,7 @@ export const ColorSelect = (props: ColorSelectProps) => { useEffect(() => { if (color !== selectedColor) { - const value = getGradientObject(); + const value = getGradientObject("#ffffff"); if (!value?.isGradient) { return throttleChange(toHex(selectedColor)); } diff --git a/client/packages/lowcoder-design/src/icons/index.tsx b/client/packages/lowcoder-design/src/icons/index.tsx index 02b0898f3..196df170c 100644 --- a/client/packages/lowcoder-design/src/icons/index.tsx +++ b/client/packages/lowcoder-design/src/icons/index.tsx @@ -132,7 +132,11 @@ export { ReactComponent as APIDocsIcon } from "./remix/instance-line.svg"; export { ReactComponent as SubscriptionIcon } from "./remix/award-fill.svg"; export { ReactComponent as SupportIcon } from "./remix/user-heart-line.svg"; // export { ReactComponent as AllAppIcon } from "./v1/icon-all-app.svg"; - +// EE +export { ReactComponent as EnvironmentsIcon } from "./remix/git-branch-line.svg"; +export { ReactComponent as UsageStatisticsIcon } from "./remix/line-chart-line.svg"; +export { ReactComponent as AutitLogsIcon } from "./remix/user-community-line.svg"; +export { ReactComponent as BrandingIcon } from "./remix/paint-brush-line.svg"; // Data Sources export { ReactComponent as MysqlIcon } from "./v1/icon-query-MySQL.svg"; diff --git a/client/packages/lowcoder-design/src/icons/remix/account-box-2-fill.svg b/client/packages/lowcoder-design/src/icons/remix/account-box-2-fill.svg new file mode 100644 index 000000000..c2c5a7354 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/account-box-2-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/account-box-2-line.svg b/client/packages/lowcoder-design/src/icons/remix/account-box-2-line.svg new file mode 100644 index 000000000..bb144965a --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/account-box-2-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/account-circle-2-fill.svg b/client/packages/lowcoder-design/src/icons/remix/account-circle-2-fill.svg new file mode 100644 index 000000000..fad8ce684 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/account-circle-2-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/account-circle-2-line.svg b/client/packages/lowcoder-design/src/icons/remix/account-circle-2-line.svg new file mode 100644 index 000000000..c37c70644 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/account-circle-2-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/add-large-fill.svg b/client/packages/lowcoder-design/src/icons/remix/add-large-fill.svg new file mode 100644 index 000000000..9d6989bb1 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/add-large-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/add-large-line.svg b/client/packages/lowcoder-design/src/icons/remix/add-large-line.svg new file mode 100644 index 000000000..234bb93fc --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/add-large-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/aed-electrodes-fill.svg b/client/packages/lowcoder-design/src/icons/remix/aed-electrodes-fill.svg new file mode 100644 index 000000000..04a170e70 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/aed-electrodes-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/aed-electrodes-line.svg b/client/packages/lowcoder-design/src/icons/remix/aed-electrodes-line.svg new file mode 100644 index 000000000..1f719410b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/aed-electrodes-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/aed-fill.svg b/client/packages/lowcoder-design/src/icons/remix/aed-fill.svg new file mode 100644 index 000000000..5029acc40 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/aed-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/aed-line.svg b/client/packages/lowcoder-design/src/icons/remix/aed-line.svg new file mode 100644 index 000000000..a7bab2a69 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/aed-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/ai-generate-2.svg b/client/packages/lowcoder-design/src/icons/remix/ai-generate-2.svg new file mode 100644 index 000000000..06232c34a --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/ai-generate-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/ai-generate-text.svg b/client/packages/lowcoder-design/src/icons/remix/ai-generate-text.svg new file mode 100644 index 000000000..52df2eed9 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/ai-generate-text.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/ai-generate.svg b/client/packages/lowcoder-design/src/icons/remix/ai-generate.svg index 120365078..ad44f33dd 100644 --- a/client/packages/lowcoder-design/src/icons/remix/ai-generate.svg +++ b/client/packages/lowcoder-design/src/icons/remix/ai-generate.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/alarm-snooze-fill.svg b/client/packages/lowcoder-design/src/icons/remix/alarm-snooze-fill.svg new file mode 100644 index 000000000..65a5122bd --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/alarm-snooze-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/alarm-snooze-line.svg b/client/packages/lowcoder-design/src/icons/remix/alarm-snooze-line.svg new file mode 100644 index 000000000..86b4c5ed2 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/alarm-snooze-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/alibaba-cloud-fill.svg b/client/packages/lowcoder-design/src/icons/remix/alibaba-cloud-fill.svg new file mode 100644 index 000000000..0365782e4 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/alibaba-cloud-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/alibaba-cloud-line.svg b/client/packages/lowcoder-design/src/icons/remix/alibaba-cloud-line.svg new file mode 100644 index 000000000..1a273433a --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/alibaba-cloud-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/align-item-bottom-fill.svg b/client/packages/lowcoder-design/src/icons/remix/align-item-bottom-fill.svg new file mode 100644 index 000000000..4fc13b737 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/align-item-bottom-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/align-item-bottom-line.svg b/client/packages/lowcoder-design/src/icons/remix/align-item-bottom-line.svg new file mode 100644 index 000000000..6f9a7d3b1 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/align-item-bottom-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/align-item-horizontal-center-fill.svg b/client/packages/lowcoder-design/src/icons/remix/align-item-horizontal-center-fill.svg new file mode 100644 index 000000000..4ee53f0c8 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/align-item-horizontal-center-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/align-item-horizontal-center-line.svg b/client/packages/lowcoder-design/src/icons/remix/align-item-horizontal-center-line.svg new file mode 100644 index 000000000..42019219e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/align-item-horizontal-center-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/align-item-left-fill.svg b/client/packages/lowcoder-design/src/icons/remix/align-item-left-fill.svg new file mode 100644 index 000000000..48731721b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/align-item-left-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/align-item-left-line.svg b/client/packages/lowcoder-design/src/icons/remix/align-item-left-line.svg new file mode 100644 index 000000000..98172d2a7 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/align-item-left-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/align-item-right-fill.svg b/client/packages/lowcoder-design/src/icons/remix/align-item-right-fill.svg new file mode 100644 index 000000000..b9828b356 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/align-item-right-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/align-item-right-line.svg b/client/packages/lowcoder-design/src/icons/remix/align-item-right-line.svg new file mode 100644 index 000000000..94a34b9d2 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/align-item-right-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/align-item-top-fill.svg b/client/packages/lowcoder-design/src/icons/remix/align-item-top-fill.svg new file mode 100644 index 000000000..947b17dcc --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/align-item-top-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/align-item-top-line.svg b/client/packages/lowcoder-design/src/icons/remix/align-item-top-line.svg new file mode 100644 index 000000000..51872b52f --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/align-item-top-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/align-item-vertical-center-fill.svg b/client/packages/lowcoder-design/src/icons/remix/align-item-vertical-center-fill.svg new file mode 100644 index 000000000..c13c71413 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/align-item-vertical-center-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/align-item-vertical-center-line.svg b/client/packages/lowcoder-design/src/icons/remix/align-item-vertical-center-line.svg new file mode 100644 index 000000000..5bcc8e843 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/align-item-vertical-center-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/anthropic-fill.svg b/client/packages/lowcoder-design/src/icons/remix/anthropic-fill.svg new file mode 100644 index 000000000..fc27aa712 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/anthropic-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/anthropic-line.svg b/client/packages/lowcoder-design/src/icons/remix/anthropic-line.svg new file mode 100644 index 000000000..023592811 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/anthropic-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/apps-2-add-fill.svg b/client/packages/lowcoder-design/src/icons/remix/apps-2-add-fill.svg new file mode 100644 index 000000000..89b019d8d --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/apps-2-add-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/apps-2-add-line.svg b/client/packages/lowcoder-design/src/icons/remix/apps-2-add-line.svg new file mode 100644 index 000000000..271248559 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/apps-2-add-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/apps-2-ai-fill.svg b/client/packages/lowcoder-design/src/icons/remix/apps-2-ai-fill.svg new file mode 100644 index 000000000..0d14e9ac5 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/apps-2-ai-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/apps-2-ai-line.svg b/client/packages/lowcoder-design/src/icons/remix/apps-2-ai-line.svg new file mode 100644 index 000000000..8120843de --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/apps-2-ai-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/arrow-down-box-fill.svg b/client/packages/lowcoder-design/src/icons/remix/arrow-down-box-fill.svg new file mode 100644 index 000000000..c35478490 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/arrow-down-box-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/arrow-down-box-line.svg b/client/packages/lowcoder-design/src/icons/remix/arrow-down-box-line.svg new file mode 100644 index 000000000..c3c488269 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/arrow-down-box-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/arrow-down-double-fill.svg b/client/packages/lowcoder-design/src/icons/remix/arrow-down-double-fill.svg index 196fb72c8..60d3e0767 100644 --- a/client/packages/lowcoder-design/src/icons/remix/arrow-down-double-fill.svg +++ b/client/packages/lowcoder-design/src/icons/remix/arrow-down-double-fill.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/arrow-down-double-line.svg b/client/packages/lowcoder-design/src/icons/remix/arrow-down-double-line.svg index 196fb72c8..60d3e0767 100644 --- a/client/packages/lowcoder-design/src/icons/remix/arrow-down-double-line.svg +++ b/client/packages/lowcoder-design/src/icons/remix/arrow-down-double-line.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/arrow-left-box-fill.svg b/client/packages/lowcoder-design/src/icons/remix/arrow-left-box-fill.svg new file mode 100644 index 000000000..0d69d3f43 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/arrow-left-box-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/arrow-left-box-line.svg b/client/packages/lowcoder-design/src/icons/remix/arrow-left-box-line.svg new file mode 100644 index 000000000..bb88b96e4 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/arrow-left-box-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/arrow-left-double-fill.svg b/client/packages/lowcoder-design/src/icons/remix/arrow-left-double-fill.svg index 48ae6cefd..d2b489d5d 100644 --- a/client/packages/lowcoder-design/src/icons/remix/arrow-left-double-fill.svg +++ b/client/packages/lowcoder-design/src/icons/remix/arrow-left-double-fill.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/arrow-left-double-line.svg b/client/packages/lowcoder-design/src/icons/remix/arrow-left-double-line.svg index 48ae6cefd..d2b489d5d 100644 --- a/client/packages/lowcoder-design/src/icons/remix/arrow-left-double-line.svg +++ b/client/packages/lowcoder-design/src/icons/remix/arrow-left-double-line.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/arrow-left-down-box-fill.svg b/client/packages/lowcoder-design/src/icons/remix/arrow-left-down-box-fill.svg new file mode 100644 index 000000000..60d068aa3 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/arrow-left-down-box-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/arrow-left-down-box-line.svg b/client/packages/lowcoder-design/src/icons/remix/arrow-left-down-box-line.svg new file mode 100644 index 000000000..939b91847 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/arrow-left-down-box-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/arrow-left-up-box-fill.svg b/client/packages/lowcoder-design/src/icons/remix/arrow-left-up-box-fill.svg new file mode 100644 index 000000000..9c213bd29 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/arrow-left-up-box-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/arrow-left-up-box-line.svg b/client/packages/lowcoder-design/src/icons/remix/arrow-left-up-box-line.svg new file mode 100644 index 000000000..f514b04da --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/arrow-left-up-box-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/arrow-left-wide-fill.svg b/client/packages/lowcoder-design/src/icons/remix/arrow-left-wide-fill.svg index a8d801646..fd63e92e6 100644 --- a/client/packages/lowcoder-design/src/icons/remix/arrow-left-wide-fill.svg +++ b/client/packages/lowcoder-design/src/icons/remix/arrow-left-wide-fill.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/arrow-left-wide-line.svg b/client/packages/lowcoder-design/src/icons/remix/arrow-left-wide-line.svg index a8d801646..fd63e92e6 100644 --- a/client/packages/lowcoder-design/src/icons/remix/arrow-left-wide-line.svg +++ b/client/packages/lowcoder-design/src/icons/remix/arrow-left-wide-line.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/arrow-right-box-fill.svg b/client/packages/lowcoder-design/src/icons/remix/arrow-right-box-fill.svg new file mode 100644 index 000000000..1ea22a404 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/arrow-right-box-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/arrow-right-box-line.svg b/client/packages/lowcoder-design/src/icons/remix/arrow-right-box-line.svg new file mode 100644 index 000000000..04ab615d7 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/arrow-right-box-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/arrow-right-down-box-fill.svg b/client/packages/lowcoder-design/src/icons/remix/arrow-right-down-box-fill.svg new file mode 100644 index 000000000..bfe769f37 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/arrow-right-down-box-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/arrow-right-down-box-line.svg b/client/packages/lowcoder-design/src/icons/remix/arrow-right-down-box-line.svg new file mode 100644 index 000000000..bd9c4626c --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/arrow-right-down-box-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/arrow-right-up-box-fill.svg b/client/packages/lowcoder-design/src/icons/remix/arrow-right-up-box-fill.svg new file mode 100644 index 000000000..760b4dd24 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/arrow-right-up-box-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/arrow-right-up-box-line.svg b/client/packages/lowcoder-design/src/icons/remix/arrow-right-up-box-line.svg new file mode 100644 index 000000000..69b11582a --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/arrow-right-up-box-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/arrow-up-box-fill.svg b/client/packages/lowcoder-design/src/icons/remix/arrow-up-box-fill.svg new file mode 100644 index 000000000..c5ec4b95a --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/arrow-up-box-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/arrow-up-box-line.svg b/client/packages/lowcoder-design/src/icons/remix/arrow-up-box-line.svg new file mode 100644 index 000000000..64d7667da --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/arrow-up-box-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/arrow-up-wide-fill.svg b/client/packages/lowcoder-design/src/icons/remix/arrow-up-wide-fill.svg index 53a393175..ef2b9da3f 100644 --- a/client/packages/lowcoder-design/src/icons/remix/arrow-up-wide-fill.svg +++ b/client/packages/lowcoder-design/src/icons/remix/arrow-up-wide-fill.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/arrow-up-wide-line.svg b/client/packages/lowcoder-design/src/icons/remix/arrow-up-wide-line.svg index 53a393175..ef2b9da3f 100644 --- a/client/packages/lowcoder-design/src/icons/remix/arrow-up-wide-line.svg +++ b/client/packages/lowcoder-design/src/icons/remix/arrow-up-wide-line.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/bar-chart-box-ai-fill.svg b/client/packages/lowcoder-design/src/icons/remix/bar-chart-box-ai-fill.svg new file mode 100644 index 000000000..343ea056c --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/bar-chart-box-ai-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/bar-chart-box-ai-line.svg b/client/packages/lowcoder-design/src/icons/remix/bar-chart-box-ai-line.svg new file mode 100644 index 000000000..1b4b13298 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/bar-chart-box-ai-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/book-shelf-fill.svg b/client/packages/lowcoder-design/src/icons/remix/book-shelf-fill.svg new file mode 100644 index 000000000..76f96664b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/book-shelf-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/book-shelf-line.svg b/client/packages/lowcoder-design/src/icons/remix/book-shelf-line.svg new file mode 100644 index 000000000..485baadd5 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/book-shelf-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/brain-2-fill.svg b/client/packages/lowcoder-design/src/icons/remix/brain-2-fill.svg new file mode 100644 index 000000000..e8318dac4 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/brain-2-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/brain-2-line.svg b/client/packages/lowcoder-design/src/icons/remix/brain-2-line.svg new file mode 100644 index 000000000..07599aed1 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/brain-2-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/brush-ai-fill.svg b/client/packages/lowcoder-design/src/icons/remix/brush-ai-fill.svg new file mode 100644 index 000000000..a5d0321e9 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/brush-ai-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/brush-ai-line.svg b/client/packages/lowcoder-design/src/icons/remix/brush-ai-line.svg new file mode 100644 index 000000000..d39e9e904 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/brush-ai-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/camera-ai-fill.svg b/client/packages/lowcoder-design/src/icons/remix/camera-ai-fill.svg new file mode 100644 index 000000000..c75b1adc5 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/camera-ai-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/camera-ai-line.svg b/client/packages/lowcoder-design/src/icons/remix/camera-ai-line.svg new file mode 100644 index 000000000..a178c9d40 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/camera-ai-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/camera-lens-ai-fill.svg b/client/packages/lowcoder-design/src/icons/remix/camera-lens-ai-fill.svg new file mode 100644 index 000000000..6851e8348 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/camera-lens-ai-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/camera-lens-ai-line.svg b/client/packages/lowcoder-design/src/icons/remix/camera-lens-ai-line.svg new file mode 100644 index 000000000..91e18f3b0 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/camera-lens-ai-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/camera-off-line.svg b/client/packages/lowcoder-design/src/icons/remix/camera-off-line.svg index 244f2340d..b6734dec5 100644 --- a/client/packages/lowcoder-design/src/icons/remix/camera-off-line.svg +++ b/client/packages/lowcoder-design/src/icons/remix/camera-off-line.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/chat-ai-fill.svg b/client/packages/lowcoder-design/src/icons/remix/chat-ai-fill.svg new file mode 100644 index 000000000..ff0a5180b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/chat-ai-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/chat-ai-line.svg b/client/packages/lowcoder-design/src/icons/remix/chat-ai-line.svg new file mode 100644 index 000000000..224451e5d --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/chat-ai-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/chat-off-fill.svg b/client/packages/lowcoder-design/src/icons/remix/chat-off-fill.svg index c5a2a8fb0..c888a3d95 100644 --- a/client/packages/lowcoder-design/src/icons/remix/chat-off-fill.svg +++ b/client/packages/lowcoder-design/src/icons/remix/chat-off-fill.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/chat-search-fill.svg b/client/packages/lowcoder-design/src/icons/remix/chat-search-fill.svg new file mode 100644 index 000000000..1f1313396 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/chat-search-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/chat-search-line.svg b/client/packages/lowcoder-design/src/icons/remix/chat-search-line.svg new file mode 100644 index 000000000..51ca58b50 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/chat-search-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/chat-smile-ai-fill.svg b/client/packages/lowcoder-design/src/icons/remix/chat-smile-ai-fill.svg new file mode 100644 index 000000000..cee022cc6 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/chat-smile-ai-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/chat-smile-ai-line.svg b/client/packages/lowcoder-design/src/icons/remix/chat-smile-ai-line.svg new file mode 100644 index 000000000..0826c646d --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/chat-smile-ai-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/chat-unread-fill.svg b/client/packages/lowcoder-design/src/icons/remix/chat-unread-fill.svg new file mode 100644 index 000000000..4103ae8de --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/chat-unread-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/chat-unread-line.svg b/client/packages/lowcoder-design/src/icons/remix/chat-unread-line.svg new file mode 100644 index 000000000..564c5e04b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/chat-unread-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/chat-voice-ai-fill.svg b/client/packages/lowcoder-design/src/icons/remix/chat-voice-ai-fill.svg new file mode 100644 index 000000000..bd2c87851 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/chat-voice-ai-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/chat-voice-ai-line.svg b/client/packages/lowcoder-design/src/icons/remix/chat-voice-ai-line.svg new file mode 100644 index 000000000..275840c55 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/chat-voice-ai-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/clapperboard-ai-fill.svg b/client/packages/lowcoder-design/src/icons/remix/clapperboard-ai-fill.svg new file mode 100644 index 000000000..29a5c89ee --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/clapperboard-ai-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/clapperboard-ai-line.svg b/client/packages/lowcoder-design/src/icons/remix/clapperboard-ai-line.svg new file mode 100644 index 000000000..a7ab75aeb --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/clapperboard-ai-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/claude-fill.svg b/client/packages/lowcoder-design/src/icons/remix/claude-fill.svg new file mode 100644 index 000000000..f699875fc --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/claude-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/claude-line.svg b/client/packages/lowcoder-design/src/icons/remix/claude-line.svg new file mode 100644 index 000000000..e3f457ffa --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/claude-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/clockwise-2-line.svg b/client/packages/lowcoder-design/src/icons/remix/clockwise-2-line.svg index 76335881c..3256cba63 100644 --- a/client/packages/lowcoder-design/src/icons/remix/clockwise-2-line.svg +++ b/client/packages/lowcoder-design/src/icons/remix/clockwise-2-line.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/close-large-fill.svg b/client/packages/lowcoder-design/src/icons/remix/close-large-fill.svg new file mode 100644 index 000000000..2e891d088 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/close-large-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/close-large-line.svg b/client/packages/lowcoder-design/src/icons/remix/close-large-line.svg new file mode 100644 index 000000000..2e891d088 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/close-large-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/closed-captioning-ai-fill.svg b/client/packages/lowcoder-design/src/icons/remix/closed-captioning-ai-fill.svg new file mode 100644 index 000000000..7ca60921f --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/closed-captioning-ai-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/closed-captioning-ai-line.svg b/client/packages/lowcoder-design/src/icons/remix/closed-captioning-ai-line.svg new file mode 100644 index 000000000..ae47eb6c0 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/closed-captioning-ai-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/code-ai-fill.svg b/client/packages/lowcoder-design/src/icons/remix/code-ai-fill.svg new file mode 100644 index 000000000..613628dd0 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/code-ai-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/code-ai-line.svg b/client/packages/lowcoder-design/src/icons/remix/code-ai-line.svg new file mode 100644 index 000000000..613628dd0 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/code-ai-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/coins-fill.svg b/client/packages/lowcoder-design/src/icons/remix/coins-fill.svg index 9822088be..fd0a93bc4 100644 --- a/client/packages/lowcoder-design/src/icons/remix/coins-fill.svg +++ b/client/packages/lowcoder-design/src/icons/remix/coins-fill.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/coins-line.svg b/client/packages/lowcoder-design/src/icons/remix/coins-line.svg index 25180f2b0..45ed051d7 100644 --- a/client/packages/lowcoder-design/src/icons/remix/coins-line.svg +++ b/client/packages/lowcoder-design/src/icons/remix/coins-line.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/collapse-diagonal-2-fill.svg b/client/packages/lowcoder-design/src/icons/remix/collapse-diagonal-2-fill.svg new file mode 100644 index 000000000..bc81f08a7 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/collapse-diagonal-2-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/collapse-diagonal-2-line.svg b/client/packages/lowcoder-design/src/icons/remix/collapse-diagonal-2-line.svg new file mode 100644 index 000000000..be3c64793 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/collapse-diagonal-2-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/collapse-diagonal-fill.svg b/client/packages/lowcoder-design/src/icons/remix/collapse-diagonal-fill.svg new file mode 100644 index 000000000..5fbfdb87f --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/collapse-diagonal-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/collapse-diagonal-line.svg b/client/packages/lowcoder-design/src/icons/remix/collapse-diagonal-line.svg new file mode 100644 index 000000000..39a1e07c1 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/collapse-diagonal-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/collapse-horizontal-fill.svg b/client/packages/lowcoder-design/src/icons/remix/collapse-horizontal-fill.svg new file mode 100644 index 000000000..35ec4a983 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/collapse-horizontal-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/collapse-horizontal-line.svg b/client/packages/lowcoder-design/src/icons/remix/collapse-horizontal-line.svg new file mode 100644 index 000000000..cccd9ee79 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/collapse-horizontal-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/collapse-vertical-fill.svg b/client/packages/lowcoder-design/src/icons/remix/collapse-vertical-fill.svg new file mode 100644 index 000000000..241e7b3b1 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/collapse-vertical-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/collapse-vertical-line.svg b/client/packages/lowcoder-design/src/icons/remix/collapse-vertical-line.svg new file mode 100644 index 000000000..4ac65c010 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/collapse-vertical-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/color-filter-ai-fill.svg b/client/packages/lowcoder-design/src/icons/remix/color-filter-ai-fill.svg new file mode 100644 index 000000000..b0669fa30 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/color-filter-ai-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/color-filter-ai-line.svg b/client/packages/lowcoder-design/src/icons/remix/color-filter-ai-line.svg new file mode 100644 index 000000000..43273fc99 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/color-filter-ai-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/contract-left-right-line.svg b/client/packages/lowcoder-design/src/icons/remix/contract-left-right-line.svg index 1c31760ad..c65ce81c5 100644 --- a/client/packages/lowcoder-design/src/icons/remix/contract-left-right-line.svg +++ b/client/packages/lowcoder-design/src/icons/remix/contract-left-right-line.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/corner-up-left-double-fill.svg b/client/packages/lowcoder-design/src/icons/remix/corner-up-left-double-fill.svg index 1cd4b65ed..3d62fac47 100644 --- a/client/packages/lowcoder-design/src/icons/remix/corner-up-left-double-fill.svg +++ b/client/packages/lowcoder-design/src/icons/remix/corner-up-left-double-fill.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/coupon-5-fill.svg b/client/packages/lowcoder-design/src/icons/remix/coupon-5-fill.svg index b6361c4ce..ba7627ede 100644 --- a/client/packages/lowcoder-design/src/icons/remix/coupon-5-fill.svg +++ b/client/packages/lowcoder-design/src/icons/remix/coupon-5-fill.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/currency-fill.svg b/client/packages/lowcoder-design/src/icons/remix/currency-fill.svg index ea8302992..e61e22295 100644 --- a/client/packages/lowcoder-design/src/icons/remix/currency-fill.svg +++ b/client/packages/lowcoder-design/src/icons/remix/currency-fill.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/currency-line.svg b/client/packages/lowcoder-design/src/icons/remix/currency-line.svg index 2f48c43d9..bdfa0839f 100644 --- a/client/packages/lowcoder-design/src/icons/remix/currency-line.svg +++ b/client/packages/lowcoder-design/src/icons/remix/currency-line.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/custom-size.svg b/client/packages/lowcoder-design/src/icons/remix/custom-size.svg new file mode 100644 index 000000000..7c8d630e8 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/custom-size.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/dashboard-fill.svg b/client/packages/lowcoder-design/src/icons/remix/dashboard-fill.svg index e7a4e4b89..6c1117c84 100644 --- a/client/packages/lowcoder-design/src/icons/remix/dashboard-fill.svg +++ b/client/packages/lowcoder-design/src/icons/remix/dashboard-fill.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/dashboard-horizontal-fill.svg b/client/packages/lowcoder-design/src/icons/remix/dashboard-horizontal-fill.svg new file mode 100644 index 000000000..ae5d1b991 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/dashboard-horizontal-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/dashboard-horizontal-line.svg b/client/packages/lowcoder-design/src/icons/remix/dashboard-horizontal-line.svg new file mode 100644 index 000000000..70c79c8f0 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/dashboard-horizontal-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/dashboard-line.svg b/client/packages/lowcoder-design/src/icons/remix/dashboard-line.svg index a0178465f..ad64197d8 100644 --- a/client/packages/lowcoder-design/src/icons/remix/dashboard-line.svg +++ b/client/packages/lowcoder-design/src/icons/remix/dashboard-line.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/dna-fill.svg b/client/packages/lowcoder-design/src/icons/remix/dna-fill.svg new file mode 100644 index 000000000..69cfa9fe4 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/dna-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/dna-line.svg b/client/packages/lowcoder-design/src/icons/remix/dna-line.svg new file mode 100644 index 000000000..79c298dba --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/dna-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/dropper-fill.svg b/client/packages/lowcoder-design/src/icons/remix/dropper-fill.svg new file mode 100644 index 000000000..33212ea64 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/dropper-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/dropper-line.svg b/client/packages/lowcoder-design/src/icons/remix/dropper-line.svg new file mode 100644 index 000000000..ada5e2384 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/dropper-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/dvd-ai-fill.svg b/client/packages/lowcoder-design/src/icons/remix/dvd-ai-fill.svg new file mode 100644 index 000000000..b962b1ad0 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/dvd-ai-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/dvd-ai-line.svg b/client/packages/lowcoder-design/src/icons/remix/dvd-ai-line.svg new file mode 100644 index 000000000..243f6d4a5 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/dvd-ai-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/edit-box-fill.svg b/client/packages/lowcoder-design/src/icons/remix/edit-box-fill.svg index 52bcac4b8..dcebb38ef 100644 --- a/client/packages/lowcoder-design/src/icons/remix/edit-box-fill.svg +++ b/client/packages/lowcoder-design/src/icons/remix/edit-box-fill.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/edit-box-line.svg b/client/packages/lowcoder-design/src/icons/remix/edit-box-line.svg index d182545e3..21bf1d68e 100644 --- a/client/packages/lowcoder-design/src/icons/remix/edit-box-line.svg +++ b/client/packages/lowcoder-design/src/icons/remix/edit-box-line.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/expand-diagonal-2-fill.svg b/client/packages/lowcoder-design/src/icons/remix/expand-diagonal-2-fill.svg new file mode 100644 index 000000000..fcb41bbab --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/expand-diagonal-2-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/expand-diagonal-2-line.svg b/client/packages/lowcoder-design/src/icons/remix/expand-diagonal-2-line.svg new file mode 100644 index 000000000..6583215a8 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/expand-diagonal-2-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/expand-diagonal-fill.svg b/client/packages/lowcoder-design/src/icons/remix/expand-diagonal-fill.svg new file mode 100644 index 000000000..0f8e597de --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/expand-diagonal-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/expand-diagonal-line.svg b/client/packages/lowcoder-design/src/icons/remix/expand-diagonal-line.svg new file mode 100644 index 000000000..32054b5d5 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/expand-diagonal-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/expand-diagonal-s-2-fill.svg b/client/packages/lowcoder-design/src/icons/remix/expand-diagonal-s-2-fill.svg new file mode 100644 index 000000000..8788f9341 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/expand-diagonal-s-2-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/expand-diagonal-s-2-line.svg b/client/packages/lowcoder-design/src/icons/remix/expand-diagonal-s-2-line.svg new file mode 100644 index 000000000..368da8610 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/expand-diagonal-s-2-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/expand-diagonal-s-fill.svg b/client/packages/lowcoder-design/src/icons/remix/expand-diagonal-s-fill.svg new file mode 100644 index 000000000..eca6101ef --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/expand-diagonal-s-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/expand-diagonal-s-line.svg b/client/packages/lowcoder-design/src/icons/remix/expand-diagonal-s-line.svg new file mode 100644 index 000000000..c06feaff3 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/expand-diagonal-s-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/expand-horizontal-fill.svg b/client/packages/lowcoder-design/src/icons/remix/expand-horizontal-fill.svg new file mode 100644 index 000000000..e4e9986cb --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/expand-horizontal-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/expand-horizontal-line.svg b/client/packages/lowcoder-design/src/icons/remix/expand-horizontal-line.svg new file mode 100644 index 000000000..e1f60a982 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/expand-horizontal-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/expand-horizontal-s-fill.svg b/client/packages/lowcoder-design/src/icons/remix/expand-horizontal-s-fill.svg new file mode 100644 index 000000000..491a2be23 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/expand-horizontal-s-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/expand-horizontal-s-line.svg b/client/packages/lowcoder-design/src/icons/remix/expand-horizontal-s-line.svg new file mode 100644 index 000000000..b717eb4f7 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/expand-horizontal-s-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/expand-right-fill.svg b/client/packages/lowcoder-design/src/icons/remix/expand-right-fill.svg index ba7908cc9..f44ca62af 100644 --- a/client/packages/lowcoder-design/src/icons/remix/expand-right-fill.svg +++ b/client/packages/lowcoder-design/src/icons/remix/expand-right-fill.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/expand-right-line.svg b/client/packages/lowcoder-design/src/icons/remix/expand-right-line.svg index acde6a165..a5f7ad488 100644 --- a/client/packages/lowcoder-design/src/icons/remix/expand-right-line.svg +++ b/client/packages/lowcoder-design/src/icons/remix/expand-right-line.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/expand-up-down-line.svg b/client/packages/lowcoder-design/src/icons/remix/expand-up-down-line.svg index 1a6ddc0ce..879deb199 100644 --- a/client/packages/lowcoder-design/src/icons/remix/expand-up-down-line.svg +++ b/client/packages/lowcoder-design/src/icons/remix/expand-up-down-line.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/expand-vertical-fill.svg b/client/packages/lowcoder-design/src/icons/remix/expand-vertical-fill.svg new file mode 100644 index 000000000..3ff760820 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/expand-vertical-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/expand-vertical-line.svg b/client/packages/lowcoder-design/src/icons/remix/expand-vertical-line.svg new file mode 100644 index 000000000..5897a0d46 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/expand-vertical-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/expand-vertical-s-fill.svg b/client/packages/lowcoder-design/src/icons/remix/expand-vertical-s-fill.svg new file mode 100644 index 000000000..c067505dd --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/expand-vertical-s-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/expand-vertical-s-line.svg b/client/packages/lowcoder-design/src/icons/remix/expand-vertical-s-line.svg new file mode 100644 index 000000000..f7b07e542 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/expand-vertical-s-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/fediverse-fill.svg b/client/packages/lowcoder-design/src/icons/remix/fediverse-fill.svg new file mode 100644 index 000000000..7e38585f2 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/fediverse-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/fediverse-line.svg b/client/packages/lowcoder-design/src/icons/remix/fediverse-line.svg new file mode 100644 index 000000000..6ea6e6af1 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/fediverse-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/film-ai-fill.svg b/client/packages/lowcoder-design/src/icons/remix/film-ai-fill.svg new file mode 100644 index 000000000..1efdb57b2 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/film-ai-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/film-ai-line.svg b/client/packages/lowcoder-design/src/icons/remix/film-ai-line.svg new file mode 100644 index 000000000..f28c12d05 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/film-ai-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/firebase-fill.svg b/client/packages/lowcoder-design/src/icons/remix/firebase-fill.svg new file mode 100644 index 000000000..e42e0b201 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/firebase-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/firebase-line.svg b/client/packages/lowcoder-design/src/icons/remix/firebase-line.svg new file mode 100644 index 000000000..0d86e0120 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/firebase-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/flag-off-fill.svg b/client/packages/lowcoder-design/src/icons/remix/flag-off-fill.svg new file mode 100644 index 000000000..f8b11ea31 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/flag-off-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/flag-off-line.svg b/client/packages/lowcoder-design/src/icons/remix/flag-off-line.svg new file mode 100644 index 000000000..5bfc2d920 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/flag-off-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/flip-horizontal-2-fill.svg b/client/packages/lowcoder-design/src/icons/remix/flip-horizontal-2-fill.svg new file mode 100644 index 000000000..06a0ebe71 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/flip-horizontal-2-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/flip-horizontal-2-line.svg b/client/packages/lowcoder-design/src/icons/remix/flip-horizontal-2-line.svg new file mode 100644 index 000000000..e48ca94cd --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/flip-horizontal-2-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/flip-horizontal-fill.svg b/client/packages/lowcoder-design/src/icons/remix/flip-horizontal-fill.svg new file mode 100644 index 000000000..f5bd390c9 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/flip-horizontal-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/flip-horizontal-line.svg b/client/packages/lowcoder-design/src/icons/remix/flip-horizontal-line.svg new file mode 100644 index 000000000..4a0dea90c --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/flip-horizontal-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/flip-vertical-2-fill.svg b/client/packages/lowcoder-design/src/icons/remix/flip-vertical-2-fill.svg new file mode 100644 index 000000000..43eaaede8 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/flip-vertical-2-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/flip-vertical-2-line.svg b/client/packages/lowcoder-design/src/icons/remix/flip-vertical-2-line.svg new file mode 100644 index 000000000..c6f2e23d2 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/flip-vertical-2-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/flip-vertical-fill.svg b/client/packages/lowcoder-design/src/icons/remix/flip-vertical-fill.svg new file mode 100644 index 000000000..51414161d --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/flip-vertical-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/flip-vertical-line.svg b/client/packages/lowcoder-design/src/icons/remix/flip-vertical-line.svg new file mode 100644 index 000000000..b5ca54ecd --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/flip-vertical-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/flower-line.svg b/client/packages/lowcoder-design/src/icons/remix/flower-line.svg index f02942bfa..8f41a4b1f 100644 --- a/client/packages/lowcoder-design/src/icons/remix/flower-line.svg +++ b/client/packages/lowcoder-design/src/icons/remix/flower-line.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/font-size-ai.svg b/client/packages/lowcoder-design/src/icons/remix/font-size-ai.svg new file mode 100644 index 000000000..e6b258b00 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/font-size-ai.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/formula.svg b/client/packages/lowcoder-design/src/icons/remix/formula.svg new file mode 100644 index 000000000..0f62173e5 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/formula.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/function-add-fill.svg b/client/packages/lowcoder-design/src/icons/remix/function-add-fill.svg new file mode 100644 index 000000000..b42b929f3 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/function-add-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/function-add-line.svg b/client/packages/lowcoder-design/src/icons/remix/function-add-line.svg new file mode 100644 index 000000000..b70b2bcf1 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/function-add-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/function-fill.svg b/client/packages/lowcoder-design/src/icons/remix/function-fill.svg index 5130a65a9..ea1c5c961 100644 --- a/client/packages/lowcoder-design/src/icons/remix/function-fill.svg +++ b/client/packages/lowcoder-design/src/icons/remix/function-fill.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/function-line.svg b/client/packages/lowcoder-design/src/icons/remix/function-line.svg index b13049972..9557ca05d 100644 --- a/client/packages/lowcoder-design/src/icons/remix/function-line.svg +++ b/client/packages/lowcoder-design/src/icons/remix/function-line.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/gemini-fill.svg b/client/packages/lowcoder-design/src/icons/remix/gemini-fill.svg new file mode 100644 index 000000000..3f758a110 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/gemini-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/gemini-line.svg b/client/packages/lowcoder-design/src/icons/remix/gemini-line.svg new file mode 100644 index 000000000..d1925da04 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/gemini-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/goblet-2-fill.svg b/client/packages/lowcoder-design/src/icons/remix/goblet-2-fill.svg new file mode 100644 index 000000000..f1342bee0 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/goblet-2-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/goblet-2-line.svg b/client/packages/lowcoder-design/src/icons/remix/goblet-2-line.svg new file mode 100644 index 000000000..c5306d0fd --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/goblet-2-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/golf-ball-fill.svg b/client/packages/lowcoder-design/src/icons/remix/golf-ball-fill.svg new file mode 100644 index 000000000..d075568de --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/golf-ball-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/golf-ball-line.svg b/client/packages/lowcoder-design/src/icons/remix/golf-ball-line.svg new file mode 100644 index 000000000..451793eeb --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/golf-ball-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/group-3-fill.svg b/client/packages/lowcoder-design/src/icons/remix/group-3-fill.svg new file mode 100644 index 000000000..981d5170c --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/group-3-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/group-3-line.svg b/client/packages/lowcoder-design/src/icons/remix/group-3-line.svg new file mode 100644 index 000000000..84440de51 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/group-3-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/heart-add-2-fill.svg b/client/packages/lowcoder-design/src/icons/remix/heart-add-2-fill.svg new file mode 100644 index 000000000..512b461c2 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/heart-add-2-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/heart-add-2-line.svg b/client/packages/lowcoder-design/src/icons/remix/heart-add-2-line.svg new file mode 100644 index 000000000..c19271b14 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/heart-add-2-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/home-9-fill.svg b/client/packages/lowcoder-design/src/icons/remix/home-9-fill.svg new file mode 100644 index 000000000..c86210291 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/home-9-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/home-9-line.svg b/client/packages/lowcoder-design/src/icons/remix/home-9-line.svg new file mode 100644 index 000000000..82901eb60 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/home-9-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/id-card-fill.svg b/client/packages/lowcoder-design/src/icons/remix/id-card-fill.svg new file mode 100644 index 000000000..34d9c9918 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/id-card-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/id-card-line.svg b/client/packages/lowcoder-design/src/icons/remix/id-card-line.svg new file mode 100644 index 000000000..a82d7245d --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/id-card-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/image-ai-fill.svg b/client/packages/lowcoder-design/src/icons/remix/image-ai-fill.svg new file mode 100644 index 000000000..37fefadea --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/image-ai-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/image-ai-line.svg b/client/packages/lowcoder-design/src/icons/remix/image-ai-line.svg new file mode 100644 index 000000000..643cfea84 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/image-ai-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/image-circle-ai-fill.svg b/client/packages/lowcoder-design/src/icons/remix/image-circle-ai-fill.svg new file mode 100644 index 000000000..400c00893 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/image-circle-ai-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/image-circle-ai-line.svg b/client/packages/lowcoder-design/src/icons/remix/image-circle-ai-line.svg new file mode 100644 index 000000000..5c04ccfcc --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/image-circle-ai-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/info-card-fill.svg b/client/packages/lowcoder-design/src/icons/remix/info-card-fill.svg new file mode 100644 index 000000000..de249dc24 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/info-card-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/info-card-line.svg b/client/packages/lowcoder-design/src/icons/remix/info-card-line.svg new file mode 100644 index 000000000..db0b7ee53 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/info-card-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/information-off-fill.svg b/client/packages/lowcoder-design/src/icons/remix/information-off-fill.svg new file mode 100644 index 000000000..b0c6b098b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/information-off-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/information-off-line.svg b/client/packages/lowcoder-design/src/icons/remix/information-off-line.svg new file mode 100644 index 000000000..6e79a8db9 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/information-off-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/java-fill.svg b/client/packages/lowcoder-design/src/icons/remix/java-fill.svg new file mode 100644 index 000000000..22ec97ca4 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/java-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/java-line.svg b/client/packages/lowcoder-design/src/icons/remix/java-line.svg new file mode 100644 index 000000000..030ca53e0 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/java-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/landscape-ai-fill.svg b/client/packages/lowcoder-design/src/icons/remix/landscape-ai-fill.svg new file mode 100644 index 000000000..18dc067ef --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/landscape-ai-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/landscape-ai-line.svg b/client/packages/lowcoder-design/src/icons/remix/landscape-ai-line.svg new file mode 100644 index 000000000..3ec508c41 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/landscape-ai-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/layout-grid-2-fill.svg b/client/packages/lowcoder-design/src/icons/remix/layout-grid-2-fill.svg new file mode 100644 index 000000000..162dcacc3 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/layout-grid-2-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/layout-grid-2-line.svg b/client/packages/lowcoder-design/src/icons/remix/layout-grid-2-line.svg new file mode 100644 index 000000000..ac7588164 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/layout-grid-2-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/layout-horizontal-fill.svg b/client/packages/lowcoder-design/src/icons/remix/layout-horizontal-fill.svg new file mode 100644 index 000000000..7def54d97 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/layout-horizontal-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/layout-horizontal-line.svg b/client/packages/lowcoder-design/src/icons/remix/layout-horizontal-line.svg new file mode 100644 index 000000000..5ae1e9a9a --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/layout-horizontal-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/layout-vertical-fill.svg b/client/packages/lowcoder-design/src/icons/remix/layout-vertical-fill.svg new file mode 100644 index 000000000..8b9daabc6 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/layout-vertical-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/layout-vertical-line.svg b/client/packages/lowcoder-design/src/icons/remix/layout-vertical-line.svg new file mode 100644 index 000000000..17ab99dd0 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/layout-vertical-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/letter-spacing-2.svg b/client/packages/lowcoder-design/src/icons/remix/letter-spacing-2.svg new file mode 100644 index 000000000..78071d825 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/letter-spacing-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/line-height-2.svg b/client/packages/lowcoder-design/src/icons/remix/line-height-2.svg new file mode 100644 index 000000000..c54792e4a --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/line-height-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/mail-ai-fill.svg b/client/packages/lowcoder-design/src/icons/remix/mail-ai-fill.svg new file mode 100644 index 000000000..fe974e84d --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/mail-ai-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/mail-ai-line.svg b/client/packages/lowcoder-design/src/icons/remix/mail-ai-line.svg new file mode 100644 index 000000000..8295e7bad --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/mail-ai-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/menu-fold-2-fill.svg b/client/packages/lowcoder-design/src/icons/remix/menu-fold-2-fill.svg new file mode 100644 index 000000000..dccba128c --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/menu-fold-2-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/menu-fold-2-line.svg b/client/packages/lowcoder-design/src/icons/remix/menu-fold-2-line.svg new file mode 100644 index 000000000..25b6857f0 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/menu-fold-2-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/menu-fold-3-fill.svg b/client/packages/lowcoder-design/src/icons/remix/menu-fold-3-fill.svg new file mode 100644 index 000000000..5137e4d88 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/menu-fold-3-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/menu-fold-3-line.svg b/client/packages/lowcoder-design/src/icons/remix/menu-fold-3-line.svg new file mode 100644 index 000000000..1c551f3ea --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/menu-fold-3-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/menu-fold-4-fill.svg b/client/packages/lowcoder-design/src/icons/remix/menu-fold-4-fill.svg new file mode 100644 index 000000000..df6254e2c --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/menu-fold-4-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/menu-fold-4-line.svg b/client/packages/lowcoder-design/src/icons/remix/menu-fold-4-line.svg new file mode 100644 index 000000000..2a4718e0e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/menu-fold-4-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/menu-fold-fill.svg b/client/packages/lowcoder-design/src/icons/remix/menu-fold-fill.svg index 445f1e36c..c9890fda4 100644 --- a/client/packages/lowcoder-design/src/icons/remix/menu-fold-fill.svg +++ b/client/packages/lowcoder-design/src/icons/remix/menu-fold-fill.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/menu-unfold-2-fill.svg b/client/packages/lowcoder-design/src/icons/remix/menu-unfold-2-fill.svg new file mode 100644 index 000000000..76b33487b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/menu-unfold-2-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/menu-unfold-2-line.svg b/client/packages/lowcoder-design/src/icons/remix/menu-unfold-2-line.svg new file mode 100644 index 000000000..0f555eb76 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/menu-unfold-2-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/menu-unfold-3-fill.svg b/client/packages/lowcoder-design/src/icons/remix/menu-unfold-3-fill.svg new file mode 100644 index 000000000..7c882453e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/menu-unfold-3-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/menu-unfold-3-line.svg b/client/packages/lowcoder-design/src/icons/remix/menu-unfold-3-line.svg new file mode 100644 index 000000000..a223280d9 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/menu-unfold-3-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/menu-unfold-4-fill.svg b/client/packages/lowcoder-design/src/icons/remix/menu-unfold-4-fill.svg new file mode 100644 index 000000000..3d2877682 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/menu-unfold-4-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/menu-unfold-4-line.svg b/client/packages/lowcoder-design/src/icons/remix/menu-unfold-4-line.svg new file mode 100644 index 000000000..a51e2b559 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/menu-unfold-4-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/menu-unfold-fill.svg b/client/packages/lowcoder-design/src/icons/remix/menu-unfold-fill.svg index c63a8cb4f..1c0b6bbb3 100644 --- a/client/packages/lowcoder-design/src/icons/remix/menu-unfold-fill.svg +++ b/client/packages/lowcoder-design/src/icons/remix/menu-unfold-fill.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/mic-2-ai-fill.svg b/client/packages/lowcoder-design/src/icons/remix/mic-2-ai-fill.svg new file mode 100644 index 000000000..4fd3bce17 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/mic-2-ai-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/mic-2-ai-line.svg b/client/packages/lowcoder-design/src/icons/remix/mic-2-ai-line.svg new file mode 100644 index 000000000..2f8503956 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/mic-2-ai-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/mic-ai-fill.svg b/client/packages/lowcoder-design/src/icons/remix/mic-ai-fill.svg new file mode 100644 index 000000000..24ee07345 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/mic-ai-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/mic-ai-line.svg b/client/packages/lowcoder-design/src/icons/remix/mic-ai-line.svg new file mode 100644 index 000000000..9ff2c6678 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/mic-ai-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/mixtral-fill.svg b/client/packages/lowcoder-design/src/icons/remix/mixtral-fill.svg new file mode 100644 index 000000000..fcf3987ca --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/mixtral-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/mixtral-line.svg b/client/packages/lowcoder-design/src/icons/remix/mixtral-line.svg new file mode 100644 index 000000000..3e62914fe --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/mixtral-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/mobile-download-fill.svg b/client/packages/lowcoder-design/src/icons/remix/mobile-download-fill.svg new file mode 100644 index 000000000..f5bca3cd3 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/mobile-download-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/mobile-download-line.svg b/client/packages/lowcoder-design/src/icons/remix/mobile-download-line.svg new file mode 100644 index 000000000..c992aa6b4 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/mobile-download-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/movie-2-ai-fill.svg b/client/packages/lowcoder-design/src/icons/remix/movie-2-ai-fill.svg new file mode 100644 index 000000000..b67632b01 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/movie-2-ai-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/movie-2-ai-line.svg b/client/packages/lowcoder-design/src/icons/remix/movie-2-ai-line.svg new file mode 100644 index 000000000..17999cdb3 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/movie-2-ai-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/movie-ai-fill.svg b/client/packages/lowcoder-design/src/icons/remix/movie-ai-fill.svg new file mode 100644 index 000000000..23555f425 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/movie-ai-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/movie-ai-line.svg b/client/packages/lowcoder-design/src/icons/remix/movie-ai-line.svg new file mode 100644 index 000000000..ec34b9001 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/movie-ai-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/music-ai-fill.svg b/client/packages/lowcoder-design/src/icons/remix/music-ai-fill.svg new file mode 100644 index 000000000..bfc284ecd --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/music-ai-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/music-ai-line.svg b/client/packages/lowcoder-design/src/icons/remix/music-ai-line.svg new file mode 100644 index 000000000..0d92fb370 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/music-ai-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/mv-ai-fill.svg b/client/packages/lowcoder-design/src/icons/remix/mv-ai-fill.svg new file mode 100644 index 000000000..04cd02340 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/mv-ai-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/mv-ai-line.svg b/client/packages/lowcoder-design/src/icons/remix/mv-ai-line.svg new file mode 100644 index 000000000..5f0681349 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/mv-ai-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/nextjs-fill.svg b/client/packages/lowcoder-design/src/icons/remix/nextjs-fill.svg new file mode 100644 index 000000000..65689bc1b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/nextjs-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/nextjs-line.svg b/client/packages/lowcoder-design/src/icons/remix/nextjs-line.svg new file mode 100644 index 000000000..0d8df51ee --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/nextjs-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/nodejs-fill.svg b/client/packages/lowcoder-design/src/icons/remix/nodejs-fill.svg new file mode 100644 index 000000000..9a91f6365 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/nodejs-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/nodejs-line.svg b/client/packages/lowcoder-design/src/icons/remix/nodejs-line.svg new file mode 100644 index 000000000..6c78fc902 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/nodejs-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/notification-snooze-fill.svg b/client/packages/lowcoder-design/src/icons/remix/notification-snooze-fill.svg new file mode 100644 index 000000000..1ca5cb795 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/notification-snooze-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/notification-snooze-line.svg b/client/packages/lowcoder-design/src/icons/remix/notification-snooze-line.svg new file mode 100644 index 000000000..e61a9f0d0 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/notification-snooze-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/pause-large-fill.svg b/client/packages/lowcoder-design/src/icons/remix/pause-large-fill.svg new file mode 100644 index 000000000..80f44be31 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/pause-large-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/pause-large-line.svg b/client/packages/lowcoder-design/src/icons/remix/pause-large-line.svg new file mode 100644 index 000000000..80f44be31 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/pause-large-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/pentagon-fill.svg b/client/packages/lowcoder-design/src/icons/remix/pentagon-fill.svg index c3a8d1e6d..ba753f3f2 100644 --- a/client/packages/lowcoder-design/src/icons/remix/pentagon-fill.svg +++ b/client/packages/lowcoder-design/src/icons/remix/pentagon-fill.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/pentagon-line.svg b/client/packages/lowcoder-design/src/icons/remix/pentagon-line.svg index 963054766..4734a6ec2 100644 --- a/client/packages/lowcoder-design/src/icons/remix/pentagon-line.svg +++ b/client/packages/lowcoder-design/src/icons/remix/pentagon-line.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/perplexity-fill.svg b/client/packages/lowcoder-design/src/icons/remix/perplexity-fill.svg new file mode 100644 index 000000000..cd0582d79 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/perplexity-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/perplexity-line.svg b/client/packages/lowcoder-design/src/icons/remix/perplexity-line.svg new file mode 100644 index 000000000..2660940e3 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/perplexity-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/php-fill.svg b/client/packages/lowcoder-design/src/icons/remix/php-fill.svg new file mode 100644 index 000000000..c87bd4e4f --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/php-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/php-line.svg b/client/packages/lowcoder-design/src/icons/remix/php-line.svg new file mode 100644 index 000000000..ef40e7230 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/php-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/pix-fill.svg b/client/packages/lowcoder-design/src/icons/remix/pix-fill.svg new file mode 100644 index 000000000..f11f09325 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/pix-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/pix-line.svg b/client/packages/lowcoder-design/src/icons/remix/pix-line.svg new file mode 100644 index 000000000..9a37711c7 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/pix-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/play-large-fill.svg b/client/packages/lowcoder-design/src/icons/remix/play-large-fill.svg new file mode 100644 index 000000000..85c30aedf --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/play-large-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/play-large-line.svg b/client/packages/lowcoder-design/src/icons/remix/play-large-line.svg new file mode 100644 index 000000000..c423dbb57 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/play-large-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/play-reverse-large-fill.svg b/client/packages/lowcoder-design/src/icons/remix/play-reverse-large-fill.svg new file mode 100644 index 000000000..95d4dd2b6 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/play-reverse-large-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/play-reverse-large-line.svg b/client/packages/lowcoder-design/src/icons/remix/play-reverse-large-line.svg new file mode 100644 index 000000000..0cb6d29a8 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/play-reverse-large-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/poker-clubs-fill.svg b/client/packages/lowcoder-design/src/icons/remix/poker-clubs-fill.svg new file mode 100644 index 000000000..dc45edd75 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/poker-clubs-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/poker-clubs-line.svg b/client/packages/lowcoder-design/src/icons/remix/poker-clubs-line.svg new file mode 100644 index 000000000..cc4a914c3 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/poker-clubs-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/poker-diamonds-fill.svg b/client/packages/lowcoder-design/src/icons/remix/poker-diamonds-fill.svg new file mode 100644 index 000000000..77fffbb86 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/poker-diamonds-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/poker-diamonds-line.svg b/client/packages/lowcoder-design/src/icons/remix/poker-diamonds-line.svg new file mode 100644 index 000000000..677903ce8 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/poker-diamonds-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/poker-hearts-fill.svg b/client/packages/lowcoder-design/src/icons/remix/poker-hearts-fill.svg new file mode 100644 index 000000000..19bffc283 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/poker-hearts-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/poker-hearts-line.svg b/client/packages/lowcoder-design/src/icons/remix/poker-hearts-line.svg new file mode 100644 index 000000000..f85023fc6 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/poker-hearts-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/poker-spades-fill.svg b/client/packages/lowcoder-design/src/icons/remix/poker-spades-fill.svg new file mode 100644 index 000000000..8727d4acf --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/poker-spades-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/poker-spades-line.svg b/client/packages/lowcoder-design/src/icons/remix/poker-spades-line.svg new file mode 100644 index 000000000..972c9c2d6 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/poker-spades-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/police-badge-fill.svg b/client/packages/lowcoder-design/src/icons/remix/police-badge-fill.svg new file mode 100644 index 000000000..c8f2416f5 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/police-badge-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/police-badge-line.svg b/client/packages/lowcoder-design/src/icons/remix/police-badge-line.svg new file mode 100644 index 000000000..076e446d3 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/police-badge-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/prohibited-2-fill.svg b/client/packages/lowcoder-design/src/icons/remix/prohibited-2-fill.svg new file mode 100644 index 000000000..fbd02f5d4 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/prohibited-2-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/prohibited-2-line.svg b/client/packages/lowcoder-design/src/icons/remix/prohibited-2-line.svg new file mode 100644 index 000000000..2b79dc3c0 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/prohibited-2-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/pulse-ai-fill.svg b/client/packages/lowcoder-design/src/icons/remix/pulse-ai-fill.svg new file mode 100644 index 000000000..30546fef8 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/pulse-ai-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/pulse-ai-line.svg b/client/packages/lowcoder-design/src/icons/remix/pulse-ai-line.svg new file mode 100644 index 000000000..30546fef8 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/pulse-ai-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/quill-pen-ai-fill.svg b/client/packages/lowcoder-design/src/icons/remix/quill-pen-ai-fill.svg new file mode 100644 index 000000000..b0fe7db79 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/quill-pen-ai-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/quill-pen-ai-line.svg b/client/packages/lowcoder-design/src/icons/remix/quill-pen-ai-line.svg new file mode 100644 index 000000000..8213088e2 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/quill-pen-ai-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/reset-left-fill.svg b/client/packages/lowcoder-design/src/icons/remix/reset-left-fill.svg new file mode 100644 index 000000000..189130fa0 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/reset-left-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/reset-left-line.svg b/client/packages/lowcoder-design/src/icons/remix/reset-left-line.svg new file mode 100644 index 000000000..fd58168fc --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/reset-left-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/reset-right-fill.svg b/client/packages/lowcoder-design/src/icons/remix/reset-right-fill.svg new file mode 100644 index 000000000..f5b0dc42d --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/reset-right-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/reset-right-line.svg b/client/packages/lowcoder-design/src/icons/remix/reset-right-line.svg new file mode 100644 index 000000000..d586a6d9b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/reset-right-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/safe-3-fill.svg b/client/packages/lowcoder-design/src/icons/remix/safe-3-fill.svg new file mode 100644 index 000000000..cddda77dd --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/safe-3-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/safe-3-line.svg b/client/packages/lowcoder-design/src/icons/remix/safe-3-line.svg new file mode 100644 index 000000000..a47ce8c73 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/safe-3-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/shopping-bag-4-fill.svg b/client/packages/lowcoder-design/src/icons/remix/shopping-bag-4-fill.svg new file mode 100644 index 000000000..6605461a0 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/shopping-bag-4-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/shopping-bag-4-line.svg b/client/packages/lowcoder-design/src/icons/remix/shopping-bag-4-line.svg new file mode 100644 index 000000000..f7b2854af --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/shopping-bag-4-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/skip-up-line.svg b/client/packages/lowcoder-design/src/icons/remix/skip-up-line.svg index 3cfa8e2aa..e37b2992a 100644 --- a/client/packages/lowcoder-design/src/icons/remix/skip-up-line.svg +++ b/client/packages/lowcoder-design/src/icons/remix/skip-up-line.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/snowflake-fill.svg b/client/packages/lowcoder-design/src/icons/remix/snowflake-fill.svg new file mode 100644 index 000000000..82c2728b3 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/snowflake-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/snowflake-line.svg b/client/packages/lowcoder-design/src/icons/remix/snowflake-line.svg new file mode 100644 index 000000000..82c2728b3 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/snowflake-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/speak-ai-fill.svg b/client/packages/lowcoder-design/src/icons/remix/speak-ai-fill.svg new file mode 100644 index 000000000..bbd5bfc36 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/speak-ai-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/speak-ai-line.svg b/client/packages/lowcoder-design/src/icons/remix/speak-ai-line.svg new file mode 100644 index 000000000..0e7df0c33 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/speak-ai-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/square-root.svg b/client/packages/lowcoder-design/src/icons/remix/square-root.svg new file mode 100644 index 000000000..66d7d3607 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/square-root.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/stack-fill.svg b/client/packages/lowcoder-design/src/icons/remix/stack-fill.svg index 77f341113..c9c8e9b1a 100644 --- a/client/packages/lowcoder-design/src/icons/remix/stack-fill.svg +++ b/client/packages/lowcoder-design/src/icons/remix/stack-fill.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/stack-line.svg b/client/packages/lowcoder-design/src/icons/remix/stack-line.svg index 650b770d1..da2b98c24 100644 --- a/client/packages/lowcoder-design/src/icons/remix/stack-line.svg +++ b/client/packages/lowcoder-design/src/icons/remix/stack-line.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/stairs-fill.svg b/client/packages/lowcoder-design/src/icons/remix/stairs-fill.svg new file mode 100644 index 000000000..8087db07a --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/stairs-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/stairs-line.svg b/client/packages/lowcoder-design/src/icons/remix/stairs-line.svg new file mode 100644 index 000000000..01dbcb9b0 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/stairs-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/star-off-fill.svg b/client/packages/lowcoder-design/src/icons/remix/star-off-fill.svg new file mode 100644 index 000000000..4437f95df --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/star-off-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/star-off-line.svg b/client/packages/lowcoder-design/src/icons/remix/star-off-line.svg new file mode 100644 index 000000000..3f682ff8b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/star-off-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/stop-large-fill.svg b/client/packages/lowcoder-design/src/icons/remix/stop-large-fill.svg new file mode 100644 index 000000000..53d2462cb --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/stop-large-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/stop-large-line.svg b/client/packages/lowcoder-design/src/icons/remix/stop-large-line.svg new file mode 100644 index 000000000..a0462d956 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/stop-large-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/tailwind-css-fill.svg b/client/packages/lowcoder-design/src/icons/remix/tailwind-css-fill.svg new file mode 100644 index 000000000..3d2ad9ecb --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/tailwind-css-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/tailwind-css-line.svg b/client/packages/lowcoder-design/src/icons/remix/tailwind-css-line.svg new file mode 100644 index 000000000..ee1262346 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/tailwind-css-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/telegram-2-fill.svg b/client/packages/lowcoder-design/src/icons/remix/telegram-2-fill.svg new file mode 100644 index 000000000..0df6bfd87 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/telegram-2-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/telegram-2-line.svg b/client/packages/lowcoder-design/src/icons/remix/telegram-2-line.svg new file mode 100644 index 000000000..b102cd6f8 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/telegram-2-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/telegram-fill.svg b/client/packages/lowcoder-design/src/icons/remix/telegram-fill.svg index f497543c0..ef041adaa 100644 --- a/client/packages/lowcoder-design/src/icons/remix/telegram-fill.svg +++ b/client/packages/lowcoder-design/src/icons/remix/telegram-fill.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/telegram-line.svg b/client/packages/lowcoder-design/src/icons/remix/telegram-line.svg index d66dec8aa..30ed0ae90 100644 --- a/client/packages/lowcoder-design/src/icons/remix/telegram-line.svg +++ b/client/packages/lowcoder-design/src/icons/remix/telegram-line.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/tools-fill.svg b/client/packages/lowcoder-design/src/icons/remix/tools-fill.svg index a9a735f93..cca0ba292 100644 --- a/client/packages/lowcoder-design/src/icons/remix/tools-fill.svg +++ b/client/packages/lowcoder-design/src/icons/remix/tools-fill.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/tools-line.svg b/client/packages/lowcoder-design/src/icons/remix/tools-line.svg index 2181886d9..1fe39b6af 100644 --- a/client/packages/lowcoder-design/src/icons/remix/tools-line.svg +++ b/client/packages/lowcoder-design/src/icons/remix/tools-line.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/tooth-fill.svg b/client/packages/lowcoder-design/src/icons/remix/tooth-fill.svg new file mode 100644 index 000000000..f160996da --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/tooth-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/tooth-line.svg b/client/packages/lowcoder-design/src/icons/remix/tooth-line.svg new file mode 100644 index 000000000..86de6efec --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/tooth-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/translate-ai-2.svg b/client/packages/lowcoder-design/src/icons/remix/translate-ai-2.svg new file mode 100644 index 000000000..039b27e5b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/translate-ai-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/translate-ai.svg b/client/packages/lowcoder-design/src/icons/remix/translate-ai.svg new file mode 100644 index 000000000..1a32e5037 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/translate-ai.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/triangular-flag-fill.svg b/client/packages/lowcoder-design/src/icons/remix/triangular-flag-fill.svg new file mode 100644 index 000000000..38daaf555 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/triangular-flag-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/triangular-flag-line.svg b/client/packages/lowcoder-design/src/icons/remix/triangular-flag-line.svg new file mode 100644 index 000000000..591cdd3a8 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/triangular-flag-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/twitter-x-fill.svg b/client/packages/lowcoder-design/src/icons/remix/twitter-x-fill.svg index 0f5090d44..1879f1c12 100644 --- a/client/packages/lowcoder-design/src/icons/remix/twitter-x-fill.svg +++ b/client/packages/lowcoder-design/src/icons/remix/twitter-x-fill.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/twitter-x-line.svg b/client/packages/lowcoder-design/src/icons/remix/twitter-x-line.svg index 2f7d3ab06..65ffe96df 100644 --- a/client/packages/lowcoder-design/src/icons/remix/twitter-x-line.svg +++ b/client/packages/lowcoder-design/src/icons/remix/twitter-x-line.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/user-community-fill.svg b/client/packages/lowcoder-design/src/icons/remix/user-community-fill.svg new file mode 100644 index 000000000..a64d62fbf --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/user-community-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/user-community-line.svg b/client/packages/lowcoder-design/src/icons/remix/user-community-line.svg new file mode 100644 index 000000000..ea66741bd --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/user-community-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/user-minus-fill.svg b/client/packages/lowcoder-design/src/icons/remix/user-minus-fill.svg new file mode 100644 index 000000000..5367efed8 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/user-minus-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/user-minus-line.svg b/client/packages/lowcoder-design/src/icons/remix/user-minus-line.svg new file mode 100644 index 000000000..d2225637f --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/user-minus-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/vercel-fill.svg b/client/packages/lowcoder-design/src/icons/remix/vercel-fill.svg new file mode 100644 index 000000000..848b4324d --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/vercel-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/vercel-line.svg b/client/packages/lowcoder-design/src/icons/remix/vercel-line.svg new file mode 100644 index 000000000..2d8c6e3b2 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/vercel-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/verified-badge-line.svg b/client/packages/lowcoder-design/src/icons/remix/verified-badge-line.svg index 3eafef0ea..08979cf4a 100644 --- a/client/packages/lowcoder-design/src/icons/remix/verified-badge-line.svg +++ b/client/packages/lowcoder-design/src/icons/remix/verified-badge-line.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/video-ai-fill.svg b/client/packages/lowcoder-design/src/icons/remix/video-ai-fill.svg new file mode 100644 index 000000000..6b55b914d --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/video-ai-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/video-ai-line.svg b/client/packages/lowcoder-design/src/icons/remix/video-ai-line.svg new file mode 100644 index 000000000..7ca98a6d1 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/video-ai-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/video-off-fill.svg b/client/packages/lowcoder-design/src/icons/remix/video-off-fill.svg new file mode 100644 index 000000000..93514eda3 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/video-off-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/video-off-line.svg b/client/packages/lowcoder-design/src/icons/remix/video-off-line.svg new file mode 100644 index 000000000..36c718741 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/video-off-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/video-on-ai-fill.svg b/client/packages/lowcoder-design/src/icons/remix/video-on-ai-fill.svg new file mode 100644 index 000000000..4f8330916 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/video-on-ai-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/video-on-ai-line.svg b/client/packages/lowcoder-design/src/icons/remix/video-on-ai-line.svg new file mode 100644 index 000000000..a56067dad --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/video-on-ai-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/video-on-fill.svg b/client/packages/lowcoder-design/src/icons/remix/video-on-fill.svg new file mode 100644 index 000000000..631f6065e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/video-on-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/video-on-line.svg b/client/packages/lowcoder-design/src/icons/remix/video-on-line.svg new file mode 100644 index 000000000..cec745d01 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/video-on-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/vip-crown-2-line.svg b/client/packages/lowcoder-design/src/icons/remix/vip-crown-2-line.svg index b88ede5c8..2f62c5732 100644 --- a/client/packages/lowcoder-design/src/icons/remix/vip-crown-2-line.svg +++ b/client/packages/lowcoder-design/src/icons/remix/vip-crown-2-line.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/voice-ai-fill.svg b/client/packages/lowcoder-design/src/icons/remix/voice-ai-fill.svg new file mode 100644 index 000000000..8d4fcac83 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/voice-ai-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/voice-ai-line.svg b/client/packages/lowcoder-design/src/icons/remix/voice-ai-line.svg new file mode 100644 index 000000000..8d4fcac83 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/voice-ai-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/volume-down-fill.svg b/client/packages/lowcoder-design/src/icons/remix/volume-down-fill.svg index a75bc551e..0f5ee10ce 100644 --- a/client/packages/lowcoder-design/src/icons/remix/volume-down-fill.svg +++ b/client/packages/lowcoder-design/src/icons/remix/volume-down-fill.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/volume-down-line.svg b/client/packages/lowcoder-design/src/icons/remix/volume-down-line.svg index 82285d9e0..5c495eaab 100644 --- a/client/packages/lowcoder-design/src/icons/remix/volume-down-line.svg +++ b/client/packages/lowcoder-design/src/icons/remix/volume-down-line.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/volume-mute-fill.svg b/client/packages/lowcoder-design/src/icons/remix/volume-mute-fill.svg index 4f4219c04..5b53f7f8a 100644 --- a/client/packages/lowcoder-design/src/icons/remix/volume-mute-fill.svg +++ b/client/packages/lowcoder-design/src/icons/remix/volume-mute-fill.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/volume-mute-line.svg b/client/packages/lowcoder-design/src/icons/remix/volume-mute-line.svg index 0982be3d1..61718751a 100644 --- a/client/packages/lowcoder-design/src/icons/remix/volume-mute-line.svg +++ b/client/packages/lowcoder-design/src/icons/remix/volume-mute-line.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/webhook-fill.svg b/client/packages/lowcoder-design/src/icons/remix/webhook-fill.svg new file mode 100644 index 000000000..f09568534 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/webhook-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/webhook-line.svg b/client/packages/lowcoder-design/src/icons/remix/webhook-line.svg new file mode 100644 index 000000000..925735cab --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/webhook-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/weight-fill.svg b/client/packages/lowcoder-design/src/icons/remix/weight-fill.svg new file mode 100644 index 000000000..e7dbb5ed5 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/weight-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/remix/weight-line.svg b/client/packages/lowcoder-design/src/icons/remix/weight-line.svg new file mode 100644 index 000000000..e1a5ee24f --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/remix/weight-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder/package.json b/client/packages/lowcoder/package.json index 4c4689031..529a6d065 100644 --- a/client/packages/lowcoder/package.json +++ b/client/packages/lowcoder/package.json @@ -48,6 +48,8 @@ "copy-to-clipboard": "^3.3.3", "core-js": "^3.25.2", "echarts": "^5.4.3", + "echarts-extension-gmap": "^1.7.0", + "echarts-for-react": "^3.0.2", "echarts-wordcloud": "^2.1.0", "eslint4b-prebuilt-2": "^7.32.0", "file-saver": "^2.0.5", @@ -63,6 +65,7 @@ "moment": "^2.29.4", "numbro": "^2.3.6", "papaparse": "^5.3.2", + "pigeon-maps": "^0.22.1", "qrcode.react": "^3.1.0", "rc-trigger": "^5.3.1", "react": "^18.2.0", diff --git a/client/packages/lowcoder/src/api/enterpriseApi.ts b/client/packages/lowcoder/src/api/enterpriseApi.ts new file mode 100644 index 000000000..2ae112f63 --- /dev/null +++ b/client/packages/lowcoder/src/api/enterpriseApi.ts @@ -0,0 +1,121 @@ +import axios from 'axios'; + +export interface FetchBrandingSettingPayload { + orgId?: string; +} +export interface BrandingSettings { + logo?: string | null; + squareLogo?: string | null; + mainBrandingColor?: string; + appHeaderColor?: string; + adminSidebarColor?: string; + adminSidebarFontColor?: string; + adminSidebarActiveBgColor?: string; + adminSidebarActiveFontColor?: string; + editorSidebarColor?: string; + editorSidebarFontColor?: string; + editorSidebarActiveBgColor?: string; + editorSidebarActiveFontColor?: string; + font?: string; + errorPageText?: string; + errorPageImage?: string | null; + signUpPageText?: string; + signUpPageImage?: string | null; + loggedOutPageText?: string; + loggedOutPageImage?: string | null; + standardDescription?: string; + standardTitle?: string; + showDocumentation?: boolean; + documentationLink?: string | null; + submitIssue?: boolean; + whatsNew?: boolean; + whatsNewLink?: string | null; +} +export interface BrandingConfig { + config_name?: string, + config_description?: string, + config_icon?: string, + config_set?: BrandingSettings, + orgId?: string, + user_id?: string, + id?: string, +} + +export interface BrandingSettingResponse extends BrandingConfig {}; + +export interface EnterpriseLicenseResponse { + eeActive: boolean; + remainingAPICalls: number; + eeLicenses: Array<{ + uuid: string; + issuedTo: string; + apiCallsLimit: number; + }>; +} + +// Existing functions +export const getEnterpriseLicense = async () => { + const response = await axios.get('/api/plugins/enterprise/license'); + return response.data; +}; + +export const getAuditLogs = async (params = {}) => { + const query = new URLSearchParams(params).toString(); + const response = await axios.get(`/api/plugins/enterprise/audit-logs${query ? `?${query}` : ''}`); + return response.data; +}; + +export const getAuditLogStatistics = async (params = {}) => { + const query = new URLSearchParams(params).toString(); + const response = await axios.get(`/api/plugins/enterprise/audit-logs/statistics?groupByParam=eventTypeId${query ? `&${query}` : ''}`); + return response.data; +}; + +export const getMeta = async (formData = {}) => { + const response = await axios.post(`/api/meta/`, formData); + return response.data; +} + +export const getEnvironmentsByIds = async (formData: string[] = []) => { + const response = await axios.post(`/api/plugins/enterprise/environments/byIds`, formData); + return response.data; +} + +export const getAppUsageLogs = async (params = {}) => { + const query = new URLSearchParams(params).toString(); + const response = await axios.get(`/api/plugins/enterprise/app-usage-logs${query ? `?${query}` : ''}`); + return response.data; +}; + +export const getAppUsageStatistics = async (groupByParam : string) => { + const response = await axios.get(`/api/plugins/enterprise/app-usage-logs/statistics?groupByParam=${groupByParam}`); + return response.data; +}; + + +export const getBranding = async (orgId: string = '') => { + const response = await axios.get('/api/plugins/enterprise/branding?orgId='+orgId); + const data = response.data; + if (Boolean(data.error)) { + return {}; + } + return { + ...data, + config_set: JSON.parse(data.config_set), + }; +}; + +export const createBranding = async (brandingData : any) => { + let response; + if (brandingData.id) { + response = await axios.put(`/api/plugins/enterprise/branding?brandId=${brandingData.id}`, brandingData); + } else { + response = await axios.post('/api/plugins/enterprise/branding', brandingData); + } + return response.data; +}; + +export const updateBranding = async (brandingData : any) => { + const response = await axios.put('/api/plugins/enterprise/branding', brandingData); + return response.data; +}; diff --git a/client/packages/lowcoder/src/api/materialApi.ts b/client/packages/lowcoder/src/api/materialApi.ts index 01700b1ac..51562d8e5 100644 --- a/client/packages/lowcoder/src/api/materialApi.ts +++ b/client/packages/lowcoder/src/api/materialApi.ts @@ -10,6 +10,7 @@ interface UploadResponse { export enum MaterialUploadTypeEnum { LOGO = "LOGO", FAVICON = "FAVICON", + COMMON = "COMMON", } class MaterialApi extends Api { diff --git a/client/packages/lowcoder/src/app.tsx b/client/packages/lowcoder/src/app.tsx index 95476ba09..7cbe107a4 100644 --- a/client/packages/lowcoder/src/app.tsx +++ b/client/packages/lowcoder/src/app.tsx @@ -60,6 +60,8 @@ import GlobalInstances from 'components/GlobalInstances'; import { fetchHomeData, fetchServerSettingsAction } from "./redux/reduxActions/applicationActions"; import { getNpmPackageMeta } from "./comps/utils/remote"; import { packageMetaReadyAction, setLowcoderCompsLoading } from "./redux/reduxActions/npmPluginActions"; +import { fetchBrandingSetting } from "./redux/reduxActions/enterpriseActions"; +import { EnterpriseProvider } from "./util/context/EnterpriseContext"; import { SimpleSubscriptionContextProvider } from "./util/context/SimpleSubscriptionContext"; const LazyUserAuthComp = React.lazy(() => import("pages/userAuth")); @@ -95,6 +97,7 @@ type AppIndexProps = { defaultHomePage: string | null | undefined; fetchHomeDataFinished: boolean; fetchConfig: (orgId?: string) => void; + fetchBrandingSetting: (orgId?: string) => void; fetchHomeData: (currentUserAnonymous?: boolean | undefined) => void; fetchLowcoderCompVersions: () => void; getCurrentUser: () => void; @@ -122,6 +125,7 @@ class AppIndex extends React.Component { if (!this.props.currentUserAnonymous) { this.props.fetchHomeData(this.props.currentUserAnonymous); this.props.fetchLowcoderCompVersions(); + this.props.fetchBrandingSetting(this.props.currentOrgId); } } } @@ -454,6 +458,7 @@ const mapDispatchToProps = (dispatch: any) => ({ fetchHomeData: (currentUserAnonymous: boolean | undefined) => { dispatch(fetchHomeData({})); }, + fetchBrandingSetting: (orgId?: string) => dispatch(fetchBrandingSetting({ orgId })), fetchLowcoderCompVersions: async () => { try { dispatch(setLowcoderCompsLoading(true)); @@ -481,7 +486,9 @@ export function bootstrap() { const root = createRoot(container!); root.render( + + ); } diff --git a/client/packages/lowcoder/src/components/BrandedIcon.tsx b/client/packages/lowcoder/src/components/BrandedIcon.tsx new file mode 100644 index 000000000..254c324fd --- /dev/null +++ b/client/packages/lowcoder/src/components/BrandedIcon.tsx @@ -0,0 +1,21 @@ +import { getBrandingSetting } from "@lowcoder-ee/redux/selectors/enterpriseSelectors"; +import { ReactNode } from "react"; +import { useSelector } from "react-redux"; +import { styled } from "styled-components"; + +const IconWrapper = styled.span<{$color?: string}>` + svg > path[fill-rule='evenodd'] { + ${props => props.$color && `fill: ${props.$color}` }; + } +`; + +export const BrandedIcon = (props: { + children: ReactNode, +}) => { + const brandingSettings = useSelector(getBrandingSetting); + return ( + + {props.children} + + ); +}; diff --git a/client/packages/lowcoder/src/components/ErrorFallback.tsx b/client/packages/lowcoder/src/components/ErrorFallback.tsx new file mode 100644 index 000000000..2fba4b357 --- /dev/null +++ b/client/packages/lowcoder/src/components/ErrorFallback.tsx @@ -0,0 +1,70 @@ +import { ExclamationCircleFilled, WarningFilled } from "@ant-design/icons"; +import { ALL_APPLICATIONS_URL } from "@lowcoder-ee/constants/routesURL"; +import { getBrandingSetting } from "@lowcoder-ee/redux/selectors/enterpriseSelectors"; +import { buildMaterialPreviewURL } from "@lowcoder-ee/util/materialUtils"; +import Button from "antd/es/button"; +import Flex from "antd/es/flex"; +import { useMemo } from "react"; +import { useSelector } from "react-redux"; +import styled from "styled-components"; +import history from "util/history"; + +const StyledFlex = styled(Flex)` + height: 100vh; + width: 300px; + margin: 0 auto; +`; + +const StyledErrorImage = styled.img` + width: 300px; +`; + +const StyledErrorIcon = styled(ExclamationCircleFilled)` + svg { + width: 80px; + height: 80px; + color: #ff4d4f; + } +`; + +const StyledErrorText = styled.h2` + margin: 1rem 0; +`; + +const DefaultErrorMessage = 'Something went wrong while displaying this webpage'; + +const ErrorFallback = (props: { + errorMessage?: string, +}) => { + const brandingSettings = useSelector(getBrandingSetting); + + const errorText = useMemo(() => { + if (props.errorMessage) return props.errorMessage; + if (brandingSettings?.config_set?.errorPageText) return brandingSettings?.config_set?.errorPageText; + return DefaultErrorMessage; + }, [props.errorMessage, brandingSettings?.config_set?.errorPageText]); + + const errorImage = useMemo(() => { + const imageUrl = brandingSettings?.config_set?.signUpPageImage || ''; + if (Boolean(brandingSettings?.orgId)) { + return buildMaterialPreviewURL(imageUrl); + } + return imageUrl; + }, [brandingSettings?.orgId, brandingSettings?.config_set?.errorPageImage]); + + return ( + + + {Boolean(errorImage) && false + ? + : + } + {errorText} + + + ) +} + +export default ErrorFallback; \ No newline at end of file diff --git a/client/packages/lowcoder/src/components/layout/Layout.tsx b/client/packages/lowcoder/src/components/layout/Layout.tsx index 0404658a6..28299ff66 100644 --- a/client/packages/lowcoder/src/components/layout/Layout.tsx +++ b/client/packages/lowcoder/src/components/layout/Layout.tsx @@ -9,6 +9,7 @@ import SideBar from "components/layout/SideBar"; import { CNMainContent, CNSidebar } from "constants/styleSelectors"; import { SideBarSection, SideBarSectionProps } from "./SideBarSection"; import styled from "styled-components"; +import { useSelector } from "react-redux"; import { MenuOutlined } from "@ant-design/icons"; import { Drawer, Button } from "antd"; @@ -16,8 +17,14 @@ type LayoutProps = { sections: SideBarSectionProps[]; }; -const SideBarV2 = styled(SideBar)` - background: #f7f9fc !important; +const SideBarV2 = styled(SideBar)<{ + $bgColor?: string, + $fontColor?: string, + $activeBgColor?: string, + $activeFontColor?: string, +}>` + background: ${props => props.$bgColor ? props.$bgColor : '#f7f9fc'} !important; + ${props => props.$fontColor && `color: ${props.$fontColor}`}; padding: 28px 10px; border-right: 1px solid #ebebeb; @@ -50,7 +57,6 @@ const DrawerContentWrapper = styled.div` `; export function Layout(props: LayoutProps) { - const [drawerVisible, setDrawerVisible] = useState(false); const [isMobile, setIsMobile] = useState(false); diff --git a/client/packages/lowcoder/src/components/layout/SideBarItem.tsx b/client/packages/lowcoder/src/components/layout/SideBarItem.tsx index ec8909944..695eb4e19 100644 --- a/client/packages/lowcoder/src/components/layout/SideBarItem.tsx +++ b/client/packages/lowcoder/src/components/layout/SideBarItem.tsx @@ -6,7 +6,12 @@ import { useLocation } from "react-router-dom"; type SideBarSize = "medium" | "small"; -const Wrapper = styled.div<{ $size?: SideBarSize; $selected?: boolean }>` +const Wrapper = styled.div<{ + $size?: SideBarSize; + $selected?: boolean; + $selectedBgColor?: string; + $selectedFontColor?: string; +}>` width: 100%; height: ${(props) => (props.$size === "small" ? "36px" : "44px")}; border-radius: 4px; @@ -16,7 +21,12 @@ const Wrapper = styled.div<{ $size?: SideBarSize; $selected?: boolean }>` cursor: pointer; &:hover { - background: ${(props) => (props.$selected ? "#ebf0f7" : "#efeff1")}; + background: ${(props) => (props.$selected ? ( + `${props.$selectedBgColor ? props.$selectedBgColor : '#ebf0f7'}` + ) : ( + `${props.$selectedBgColor ? props.$selectedBgColor : '#efeff1'}` + ))}; + color: ${(props) => props.$selectedFontColor ? props.$selectedFontColor : '#4965f2'} } svg { @@ -26,8 +36,8 @@ const Wrapper = styled.div<{ $size?: SideBarSize; $selected?: boolean }>` ${(props) => props.$selected && css` - color: #4965f2; - background: #ebf0f7; + color: ${props.$selectedFontColor ? props.$selectedFontColor : '#4965f2'}; + background: ${props.$selectedBgColor ? props.$selectedBgColor : '#ebf0f7'}; `} `; @@ -41,6 +51,8 @@ export const SideBarItem = (props: SideBarItemProps) => { className={CNSidebarItem} $size={props.size} $selected={props.selected} + $selectedBgColor={props.selectedBgColor} + $selectedFontColor={props.selectedFontColor} onClick={() => props.onClick?.(currentPath)} > {Icon && } @@ -53,6 +65,8 @@ export interface SideBarItemProps { icon?: FunctionComponent & { selected?: boolean }>; text: ReactNode | FunctionComponent<{ selected?: boolean }>; selected?: boolean; + selectedBgColor?: string; + selectedFontColor?: string; size?: SideBarSize; onClick?: (currentPath: string) => void; style?: CSSProperties; diff --git a/client/packages/lowcoder/src/components/layout/SideBarSection.tsx b/client/packages/lowcoder/src/components/layout/SideBarSection.tsx index 3a7df0aa7..52a5a2d04 100644 --- a/client/packages/lowcoder/src/components/layout/SideBarSection.tsx +++ b/client/packages/lowcoder/src/components/layout/SideBarSection.tsx @@ -11,6 +11,7 @@ import { getUser } from "../../redux/selectors/usersSelectors"; import { normalAppListSelector } from "../../redux/selectors/applicationSelector"; import { useLocation } from "react-router-dom"; import history from "../../util/history"; +import { getBrandingSetting } from "@lowcoder-ee/redux/selectors/enterpriseSelectors"; const defaultOnSelectedFn = (routePath: string, currentPath: string) => routePath === currentPath; @@ -23,6 +24,7 @@ const Wrapper = styled.div` export const SideBarSection = (props: SideBarSectionProps) => { const user = useSelector(getUser); const applications = useSelector(normalAppListSelector); + const brandingSettings = useSelector(getBrandingSetting); const currentPath = useLocation().pathname; const isShow = props.items .map((item) => (item.visible ? item.visible({ user: user, applications: applications }) : true)) @@ -45,6 +47,8 @@ export const SideBarSection = (props: SideBarSectionProps) => { ? item.onSelected(item.routePath, currentPath) : defaultOnSelectedFn(item.routePath, currentPath) } + selectedBgColor={brandingSettings?.config_set?.adminSidebarActiveBgColor} + selectedFontColor={brandingSettings?.config_set?.adminSidebarActiveFontColor} onClick={() => { // Trigger item's onClick if defined item.onClick diff --git a/client/packages/lowcoder/src/constants/reduxActionConstants.ts b/client/packages/lowcoder/src/constants/reduxActionConstants.ts index 6df5991f2..6dd42de3d 100644 --- a/client/packages/lowcoder/src/constants/reduxActionConstants.ts +++ b/client/packages/lowcoder/src/constants/reduxActionConstants.ts @@ -169,6 +169,15 @@ export const ReduxActionTypes = { FETCH_SUBSCRIPTIONS_SUCCESS: "FETCH_SUBSCRIPTIONS_SUCCESS", FETCH_SUBSCRIPTIONS_FAILURE: "FETCH_SUBSCRIPTIONS_FAILURE", + /* Enterprise Edition */ + FETCH_ENTERPRISE_LICENSE : "FETCH_ENTERPRISE_LICENSE", + SET_ENTERPRISE_LICENSE : "SET_ENTERPRISE_LICENSE", + + /* Branding Setting */ + FETCH_BRANDING_SETTING : "FETCH_BRANDING_SETTING", + SET_WORKSPACE_BRANDING_SETTING : "SET_WORKSPACE_BRANDING_SETTING", + SET_GLOBAL_BRANDING_SETTING : "SET_GLOBAL_BRANDING_SETTING", + /* application snapshot */ FETCH_APP_SNAPSHOTS: "FETCH_APP_SNAPSHOTS", FETCH_APP_SNAPSHOTS_SUCCESS: "FETCH_APP_SNAPSHOTS_SUCCESS", diff --git a/client/packages/lowcoder/src/constants/routesURL.ts b/client/packages/lowcoder/src/constants/routesURL.ts index 6931a1d74..a675ec649 100644 --- a/client/packages/lowcoder/src/constants/routesURL.ts +++ b/client/packages/lowcoder/src/constants/routesURL.ts @@ -19,6 +19,14 @@ export const THEME_SETTING = "/setting/theme"; export const PLUGINS_SETTING = "/setting/plugins"; export const THEME_DETAIL = "/setting/theme/detail"; export const THEME_DETAIL_URL = `${THEME_DETAIL}/:themeId`; +export const AUDIT_LOG_DASHBOARD = "/setting/audit"; +export const AUDIT_LOG_DETAIL = "/setting/audit/:eventId/detail"; +export const APP_USAGE_DASHBOARD = "/setting/app-usage"; +export const APP_USAGE_DETAIL = "/setting/app-usage/:eventId/detail"; + +export const ENVIRONMENT_SETTING = "/setting/environments"; +export const ENVIRONMENT_DETAIL = `${ENVIRONMENT_SETTING}/:environmentId`; +export const ENVIRONMENT_WORKSPACE_DETAIL = `${ENVIRONMENT_DETAIL}/workspaces/:workspaceId`; export const OAUTH_PROVIDER_SETTING = "/setting/oauth-provider"; export const OAUTH_PROVIDER_DETAIL = "/setting/oauth-provider/detail"; @@ -116,3 +124,7 @@ export const buildSubscriptionSettingsLink = (subscriptionId: string, productId export const buildSubscriptionInfoLink = (productId: string) => `${SUBSCRIPTION_SETTING}/info/${productId}`; export const buildSupportTicketLink = (ticketId: string) => `${SUPPORT_URL}/details/${ticketId}`; + +export const buildEnvironmentId = (environmentId: string) => `${ENVIRONMENT_SETTING}/${environmentId}`; +export const buildEnvironmentWorkspaceId = (environmentId: string, workspaceId: string) => + `${ENVIRONMENT_SETTING}/${environmentId}/workspaces/${workspaceId}`; diff --git a/client/packages/lowcoder/src/i18n/locales/de.ts b/client/packages/lowcoder/src/i18n/locales/de.ts index 33c894090..c73b7537b 100644 --- a/client/packages/lowcoder/src/i18n/locales/de.ts +++ b/client/packages/lowcoder/src/i18n/locales/de.ts @@ -2332,7 +2332,6 @@ export const de = { "appUsage": "App-Nutzungsprotokolle", "environments": "Umgebungen", "premium": "Prämie", - "AppUsage": "Globale App-Nutzung", }, "memberSettings": { ...en.memberSettings, @@ -2770,17 +2769,48 @@ export const de = { }, "branding": { ...en.branding, - - "title": "Branding", - "logoTitle": "Logo", - "logoHelp": "Nur .JPG, .SVG oder .PNG", - "faviconTitle": "Favicon", - "faviconHelp": "Nur .JPG, .SVG oder .PNG", - "brandNameTitle": "Markenname", - "headColorTitle": "Kopffarbe", - "save": "Speichern", - "saveSuccessMsg": "Erfolgreich gerettet", - "upload": "Zum Hochladen klicken", + "title": "Branding-Einstellungen", + "logoSection": "Logos", + "logo": "Logo", + "logoHelp": "Laden Sie das Logo Ihres Unternehmens im SVG- oder PNG-Format hoch.", + "squareLogo": "Quadratisches Logo", + "squareLogoHelp": "Laden Sie eine quadratische Version Ihres Logos im SVG- oder PNG-Format hoch.", + "colorFontSection": "Farben und Schriftarten", + "mainBrandingColor": "Hauptbrandingfarbe", + "mainBrandingColorHelp": "Wählen Sie die Hauptfarbe für Ihr Branding.", + "editorHeaderColor": "Editor-Header-Farbe", + "editorHeaderColorHelp": "Wählen Sie die Farbe des Headers des Editors.", + "adminSidebarColor": "Admin-Seitenleistenfarbe", + "adminSidebarColorHelp": "Wählen Sie die Farbe der Admin-Seitenleiste.", + "editorSidebarColor": "Editor-Seitenleistenfarbe", + "editorSidebarColorHelp": "Wählen Sie die Farbe der Seitenleiste des Editors.", + "font": "Schriftart", + "fontHelp": "Wählen Sie eine Schriftart aus Google Fonts für Ihre Anwendung.", + "textSection": "Texte und Seiten", + "errorPage": "Fehlerseiten-Text", + "errorPageHelp": "Geben Sie den Text ein, der auf der Fehlerseite angezeigt wird.", + "signUpPage": "Anmeldeseiten-Text", + "signUpPageHelp": "Geben Sie den Text ein, der auf der Anmeldeseite angezeigt wird.", + "loggedOutPage": "Abmeldeseiten-Text", + "loggedOutPageHelp": "Geben Sie den Text ein, der auf der Abmeldeseite angezeigt wird.", + "standardDescription": "Standardbeschreibung", + "standardDescriptionHelp": "Geben Sie die Standardbeschreibung für SEO-Metainformationen ein.", + "standardTitle": "Standardtitel", + "standardTitleHelp": "Geben Sie den Standardtitel für SEO-Metainformationen ein.", + "showDocumentation": "Dokumentation anzeigen", + "submitIssue": "Problem melden erlauben", + "whatsNew": "„Neuigkeiten“ aktivieren", + "saveButton": "Einstellungen speichern", + "errorPageImage": "Laden Sie ein Bild für die Fehlerseite im SVG- oder PNG-Format hoch.", + "signUpPageImage": "Laden Sie ein Bild für die Registrierungsseite im SVG- oder PNG-Format hoch.", + "loggedOutPageImage": "Laden Sie ein Bild für die Abmeldeseite im SVG- oder PNG-Format hoch.", + "documentationLink": "Dokumentationslink", + "documentationLinkPlaceholder": "Geben Sie die URL für Ihre Dokumentation ein...", + "documentationLinkHelp": "Geben Sie eine gültige URL an, die Benutzer für die Dokumentation besuchen können.", + "whatsNewSection": "Dokumentationseinstellungen", + "whatsNewLink": "Dokumentationslink", + "whatsNewLinkPlaceholder": "Geben Sie die URL für Ihre Dokumentation ein...", + "whatsNewLinkHelp": "Geben Sie eine gültige URL an, die Benutzer für Ihre Neuigkeiten besuchen können." }, "networkMessage": { ...en.networkMessage, diff --git a/client/packages/lowcoder/src/i18n/locales/en.ts b/client/packages/lowcoder/src/i18n/locales/en.ts index 2299698a1..b97d7d2f8 100644 --- a/client/packages/lowcoder/src/i18n/locales/en.ts +++ b/client/packages/lowcoder/src/i18n/locales/en.ts @@ -2387,7 +2387,48 @@ export const en = { "appUsage": "App Usage Logs", "environments": "Environments", "premium": "Premium", - "AppUsage": "Global App Usage", + }, + + "enterprise" : { + "AuditLogTitle": "Audit Log Dasboard", + "AuditLogOverview": "Log Filter", + "USER_LOGIN" : "User Login ", + "USER_LOGOUT" : "User Logout ", + "APPLICATION_VIEW" : "View Application ", + "APPLICATION_CREATE" : "Create Application ", + "APPLICATION_DELETE" : "Delete Application ", + "APPLICATION_UPDATE" : "Update Application ", + "APPLICATION_MOVE" : "Move Application ", + "APPLICATION_RECYCLED" : "Recycle Application ", + "APPLICATION_RESTORE" : "Restore Application ", + "APPLICATION_PUBLISH" : "Application Publishing ", + "APPLICATION_VERSION_CHANGE" : "Application Version Update ", + "APPLICATION_SHARING_CHANGE" : "Application Sharing Change ", + "APPLICATION_PERMISSION_CHANGE" : "Application Permission Change ", + "FOLDER_CREATE" : "Create Folder ", + "FOLDER_DELETE" : "Delete Folder ", + "FOLDER_UPDATE" : "Update Folder ", + "QUERY_EXECUTION" : "Execute Query ", + "GROUP_CREATE" : "Create Group ", + "GROUP_UPDATE" : "Update Group ", + "GROUP_DELETE" : "Delete Group ", + "GROUP_MEMBER_ADD" : "Add Group Member ", + "GROUP_MEMBER_ROLE_UPDATE" : "Update Group Member Role ", + "GROUP_MEMBER_LEAVE" : "Leave Group ", + "GROUP_MEMBER_REMOVE" : "Remove Group Member ", + "SERVER_START_UP" : "Server Startup ", + "SERVER_INFO" : "View Server Info ", + "DATA_SOURCE_CREATE" : "Create Datasource ", + "DATA_SOURCE_UPDATE" : "Update Datasource ", + "DATA_SOURCE_DELETE" : "Delete Datasource ", + "DATA_SOURCE_PERMISSION_GRANT" : "Grant Datasource Permission ", + "DATA_SOURCE_PERMISSION_UPDATE" : "Update Datasource Permission ", + "DATA_SOURCE_PERMISSION_DELETE" : "Delete Datasource Permission ", + "LIBRARY_QUERY_CREATE" : "Create Library Query ", + "LIBRARY_QUERY_UPDATE" : "Update Library Query ", + "LIBRARY_QUERY_DELETE" : "Delete Library Query ", + "LIBRARY_QUERY_PUBLISH" : "Publish Library Query ", + "API_CALL_EVENT" : "API Call Event ", }, "subscription": { @@ -2875,18 +2916,79 @@ export const en = { // sixteenth part - "branding": { - "title": "Branding", - "logoTitle": "Logo", - "logoHelp": ".JPG, .SVG or .PNG Only", - "faviconTitle": "Favicon", - "faviconHelp": ".JPG, .SVG or .PNG Only", - "brandNameTitle": "Brand Name", - "headColorTitle": "Head Color", - "save": "Save", - "saveSuccessMsg": "Saved Successfully", - "upload": "Click to Upload" + "title": "Branding Settings", + "general": "General", + "selectWorkspace": "Select Workspace", + "brandingName": "Branding Name", + "brandingNamePlaceholder": "Enter branding name", + "brandingDescription": "Branding Description", + "brandingDescriptionPlaceholder": "Enter branding description", + "logoSection": "Logos", + "logo": "Logo", + "logoHelp": "Upload your company's logo in SVG or PNG format.", + "logoUrlHelp": "Provide valid image url for Logo.", + "logoUrlPlaceholder" : "Provider image url for Logo", + "squareLogo": "Square Logo", + "squareLogoHelp": "Upload a square version of your logo in SVG or PNG format.", + "squareLogoUrlHelp": "Provide valid image url for Square Logo.", + "squareLogoUrlPlaceholder": "Provide url for Square Logo.", + "colorFontSection": "Colors and Fonts", + "mainBrandingColor": "Main Branding Color", + "mainBrandingColorHelp": "Choose the primary color for your branding.", + "editorHeaderColor": "Editor Header Color", + "editorHeaderColorHelp": "Choose the color for the editor's header.", + "adminSidebarColor": "Admin Sidebar Color", + "adminSidebarColorHelp": "Choose the color for the admin's sidebar.", + "adminSidebarFontColor": "Admin Sidebar Font Color", + "adminSidebarFontColorHelp": "Choose the font color for the admin's sidebar.", + "adminSidebarActiveBgColor": "Admin Sidebar Selected Item's Backround Color", + "adminSidebarActiveBgColorHelp": "Choose the selected item's background color for the admin's sidebar.", + "adminSidebarActiveFontColor": "Admin Sidebar Selected Item's Font Color", + "adminSidebarActiveFontColorHelp": "Choose the selected item's font color for the admin's sidebar.", + "editorSidebarColor": "Editor Sidebar Color", + "editorSidebarColorHelp": "Choose the color for the editor's sidebar.", + "editorSidebarFontColor": "Editor Sidebar Font Color", + "editorSidebarFontColorHelp": "Choose the font color for the editor's sidebar.", + "editorSidebarActiveBgColor": "Editor Sidebar Selected Item's Backround Color", + "editorSidebarActiveBgColorHelp": "Choose the selected item's background color for the editor's sidebar.", + "editorSidebarActiveFontColor": "Editor Sidebar Selected Item's Font Color", + "editorSidebarActiveFontColorHelp": "Choose the selected item's font color for the editor's sidebar.", + "font": "Font", + "fontHelp": "Select a font from Google Fonts for your application.", + "textSection": "Texts and Pages", + "errorPage": "Error Page Text", + "errorPageHelp": "Enter the text displayed on the error page.", + "signUpPage": "Sign-Up Page Text", + "signUpPageHelp": "Enter the text displayed on the sign-up page.", + "loggedOutPage": "Logged-Out Page Text", + "loggedOutPageHelp": "Enter the text displayed on the logged-out page.", + "standardDescription": "Standard Description", + "standardDescriptionHelp": "Enter the standard description for SEO meta information.", + "standardTitle": "Standard Title", + "standardTitleHelp": "Enter the standard title for SEO meta information.", + "showDocumentation": "Show Documentation", + "submitIssue": "Allow Submit Issue", + "whatsNew": "Enable What's New", + "saveButton": "Save Settings", + "errorPageImage" : "Upload an image for the Error Page in SVG or PNG format.", + "errorPageImageUrl" : "Image URL for the Error Page", + "errorPageImageUrlPlaceholder" : "Provider image url for Error Page", + "errorPageImageUrlHelp" : "Provider a valid image url to show on Error Page.", + "signUpPageImage" : "Upload an image for the Sign Up Page in SVG or PNG format.", + "signUpPageImageUrl" : "Image URL for the Sign Up Page", + "signUpPageImageUrlPlaceholder" : "Provider image url for Sign Up Page", + "signUpPageImageUrlHelp" : "Provider a valid image url to show on Sign Up Page.", + "loggedOutPageImage" : "Upload an image for the Logged-out Page in SVG or PNG format.", + "showDocumentationSection": "Documentation Link Settings", + "showWhatsNewSection" : "Whats New Link Settings", + "documentationLink": "Documentation Link", + "documentationLinkPlaceholder": "Enter the URL for your documentation...", + "documentationLinkHelp": "Provide a valid URL that users can visit for documentation.", + "whatsNewSection": "Documentation Settings", + "whatsNewLink": "What's New Link", + "whatsNewLinkPlaceholder": "Enter the URL for your documentation...", + "whatsNewLinkHelp": "Provide a valid URL that users can visit for your news." }, "networkMessage": { "200": "Success", @@ -3978,6 +4080,7 @@ export const en = { "UTC+13:00": "(UTC+13:00) Nuku'alofa, Samoa", "UserChoice": "UserChoice" }, + tour: { section1Title: "Steps", section1Subtitle: "Steps", diff --git a/client/packages/lowcoder/src/i18n/locales/es.ts b/client/packages/lowcoder/src/i18n/locales/es.ts index 0deceffe8..0f3477811 100644 --- a/client/packages/lowcoder/src/i18n/locales/es.ts +++ b/client/packages/lowcoder/src/i18n/locales/es.ts @@ -2330,7 +2330,6 @@ export const es = { "appUsage": "Registros de uso de aplicaciones", "environments": "Entornos", "premium": "Premium", - "AppUsage": "Uso global de las aplicaciones", }, "memberSettings": { ...en.memberSettings, @@ -2768,17 +2767,48 @@ export const es = { }, "branding": { ...en.branding, - - "title": "Marca", - "logoTitle": "Logotipo", - "logoHelp": "Sólo .JPG, .SVG o .PNG", - "faviconTitle": "Favicon", - "faviconHelp": "Sólo .JPG, .SVG o .PNG", - "brandNameTitle": "Marca", - "headColorTitle": "Color de la cabeza", - "save": "Guardar", - "saveSuccessMsg": "Guardado correctamente", - "upload": "Haga clic para cargar", + "title": "Configuraciones de Marca", + "logoSection": "Logotipos", + "logo": "Logotipo", + "logoHelp": "Sube el logotipo de tu empresa en formato SVG o PNG.", + "squareLogo": "Logotipo Cuadrado", + "squareLogoHelp": "Sube una versión cuadrada de tu logotipo en formato SVG o PNG.", + "colorFontSection": "Colores y Fuentes", + "mainBrandingColor": "Color Principal de la Marca", + "mainBrandingColorHelp": "Selecciona el color principal para tu marca.", + "editorHeaderColor": "Color del Encabezado del Editor", + "editorHeaderColorHelp": "Selecciona el color del encabezado del editor.", + "adminSidebarColor": "Color de la Barra Lateral del Administrador", + "adminSidebarColorHelp": "Selecciona el color de la barra lateral del administrador.", + "editorSidebarColor": "Color de la Barra Lateral del Editor", + "editorSidebarColorHelp": "Selecciona el color de la barra lateral del editor.", + "font": "Fuente", + "fontHelp": "Selecciona una fuente de Google Fonts para tu aplicación.", + "textSection": "Textos y Páginas", + "errorPage": "Texto de la Página de Error", + "errorPageHelp": "Introduce el texto que se mostrará en la página de error.", + "signUpPage": "Texto de la Página de Registro", + "signUpPageHelp": "Introduce el texto que se mostrará en la página de registro.", + "loggedOutPage": "Texto de la Página de Cierre de Sesión", + "loggedOutPageHelp": "Introduce el texto que se mostrará en la página de cierre de sesión.", + "standardDescription": "Descripción Estándar", + "standardDescriptionHelp": "Introduce la descripción estándar para la información meta de SEO.", + "standardTitle": "Título Estándar", + "standardTitleHelp": "Introduce el título estándar para la información meta de SEO.", + "showDocumentation": "Mostrar Documentación", + "submitIssue": "Permitir Enviar Problema", + "whatsNew": "Habilitar \"Novedades\"", + "saveButton": "Guardar Configuraciones", + "errorPageImage": "Sube una imagen para la página de error en formato SVG o PNG.", + "signUpPageImage": "Sube una imagen para la página de registro en formato SVG o PNG.", + "loggedOutPageImage": "Sube una imagen para la página de cierre de sesión en formato SVG o PNG.", + "documentationLink": "Enlace a la documentación", + "documentationLinkPlaceholder": "Introduce la URL de tu documentación...", + "documentationLinkHelp": "Proporciona una URL válida que los usuarios puedan visitar para la documentación.", + "whatsNewSection": "Configuraciones de documentación", + "whatsNewLink": "Enlace a la documentación", + "whatsNewLinkPlaceholder": "Introduce la URL de tu documentación...", + "whatsNewLinkHelp": "Proporciona una URL válida que los usuarios puedan visitar para conocer las novedades." }, "networkMessage": { ...en.networkMessage, diff --git a/client/packages/lowcoder/src/i18n/locales/it.ts b/client/packages/lowcoder/src/i18n/locales/it.ts index 2c0b869e4..aa792d109 100644 --- a/client/packages/lowcoder/src/i18n/locales/it.ts +++ b/client/packages/lowcoder/src/i18n/locales/it.ts @@ -2331,7 +2331,6 @@ export const it = { "appUsage": "Registri di utilizzo delle app", "environments": "Ambienti", "premium": "Premio", - "AppUsage": "Utilizzo globale delle app", }, "memberSettings": { ...en.memberSettings, @@ -2770,16 +2769,48 @@ export const it = { "branding": { ...en.branding, - "title": "Branding", - "logoTitle": "Logo", - "logoHelp": "Solo .JPG, .SVG o .PNG", - "faviconTitle": "Favicon", - "faviconHelp": "Solo .JPG, .SVG o .PNG", - "brandNameTitle": "Nome del marchio", - "headColorTitle": "Colore della testa", - "save": "Risparmiare", - "saveSuccessMsg": "Salvato con successo", - "upload": "Fare clic per caricare", + "title": "Impostazioni del Branding", + "logoSection": "Loghi", + "logo": "Logo", + "logoHelp": "Carica il logo della tua azienda in formato SVG o PNG.", + "squareLogo": "Logo Quadrato", + "squareLogoHelp": "Carica una versione quadrata del tuo logo in formato SVG o PNG.", + "colorFontSection": "Colori e Font", + "mainBrandingColor": "Colore Principale del Branding", + "mainBrandingColorHelp": "Seleziona il colore principale per il tuo branding.", + "editorHeaderColor": "Colore dell'intestazione dell'editor", + "editorHeaderColorHelp": "Seleziona il colore dell'intestazione dell'editor.", + "adminSidebarColor": "Colore della barra laterale amministrativa", + "adminSidebarColorHelp": "Seleziona il colore della barra laterale amministrativa.", + "editorSidebarColor": "Colore della barra laterale dell'editor", + "editorSidebarColorHelp": "Seleziona il colore della barra laterale dell'editor.", + "font": "Font", + "fontHelp": "Seleziona un font da Google Fonts per la tua applicazione.", + "textSection": "Testi e Pagine", + "errorPage": "Testo della pagina di errore", + "errorPageHelp": "Inserisci il testo visualizzato nella pagina di errore.", + "signUpPage": "Testo della pagina di registrazione", + "signUpPageHelp": "Inserisci il testo visualizzato nella pagina di registrazione.", + "loggedOutPage": "Testo della pagina di disconnessione", + "loggedOutPageHelp": "Inserisci il testo visualizzato nella pagina di disconnessione.", + "standardDescription": "Descrizione standard", + "standardDescriptionHelp": "Inserisci la descrizione standard per le informazioni meta SEO.", + "standardTitle": "Titolo standard", + "standardTitleHelp": "Inserisci il titolo standard per le informazioni meta SEO.", + "showDocumentation": "Mostra Documentazione", + "submitIssue": "Consenti invio problema", + "whatsNew": "Abilita \"Novità\"", + "saveButton": "Salva Impostazioni", + "errorPageImage": "Carica un'immagine per la pagina di errore in formato SVG o PNG.", + "signUpPageImage": "Carica un'immagine per la pagina di registrazione in formato SVG o PNG.", + "loggedOutPageImage": "Carica un'immagine per la pagina di disconnessione in formato SVG o PNG.", + "documentationLink": "Link alla documentazione", + "documentationLinkPlaceholder": "Inserisci l'URL della tua documentazione...", + "documentationLinkHelp": "Fornisci un URL valido che gli utenti possano visitare per la documentazione.", + "whatsNewSection": "Impostazioni documentazione", + "whatsNewLink": "Link alla documentazione", + "whatsNewLinkPlaceholder": "Inserisci l'URL della tua documentazione...", + "whatsNewLinkHelp": "Fornisci un URL valido che gli utenti possano visitare per le novità." }, "networkMessage": { ...en.networkMessage, diff --git a/client/packages/lowcoder/src/i18n/locales/pt.ts b/client/packages/lowcoder/src/i18n/locales/pt.ts index 643ffda31..91d078b72 100644 --- a/client/packages/lowcoder/src/i18n/locales/pt.ts +++ b/client/packages/lowcoder/src/i18n/locales/pt.ts @@ -2331,7 +2331,6 @@ export const pt = { "appUsage": "Logs de Uso do Aplicativo", "environments": "Ambientes", "premium": "Prémio", - "AppUsage": "Uso Global do Aplicativo", }, "memberSettings": { ...en.memberSettings, @@ -2770,16 +2769,48 @@ export const pt = { "branding": { ...en.branding, - "title": "Marca", - "logoTitle": "Logótipo", - "logoHelp": "Somente .JPG, .SVG ou .PNG", - "faviconTitle": "Favicon", - "faviconHelp": "Somente .JPG, .SVG ou .PNG", - "brandNameTitle": "Nome da Marca", - "headColorTitle": "Cor Principal", - "save": "Salvar", - "saveSuccessMsg": "Salvo com sucesso", - "upload": "Clique para Fazer Upload", + "title": "Configurações de Marca", + "logoSection": "Logotipos", + "logo": "Logotipo", + "logoHelp": "Envie o logotipo da sua empresa em formato SVG ou PNG.", + "squareLogo": "Logotipo Quadrado", + "squareLogoHelp": "Envie uma versão quadrada do seu logotipo em formato SVG ou PNG.", + "colorFontSection": "Cores e Fontes", + "mainBrandingColor": "Cor Principal da Marca", + "mainBrandingColorHelp": "Selecione a cor principal para a sua marca.", + "editorHeaderColor": "Cor do Cabeçalho do Editor", + "editorHeaderColorHelp": "Selecione a cor do cabeçalho do editor.", + "adminSidebarColor": "Cor da Barra Lateral do Administrador", + "adminSidebarColorHelp": "Selecione a cor da barra lateral do administrador.", + "editorSidebarColor": "Cor da Barra Lateral do Editor", + "editorSidebarColorHelp": "Selecione a cor da barra lateral do editor.", + "font": "Fonte", + "fontHelp": "Selecione uma fonte do Google Fonts para o seu aplicativo.", + "textSection": "Textos e Páginas", + "errorPage": "Texto da Página de Erro", + "errorPageHelp": "Insira o texto exibido na página de erro.", + "signUpPage": "Texto da Página de Cadastro", + "signUpPageHelp": "Insira o texto exibido na página de cadastro.", + "loggedOutPage": "Texto da Página de Logout", + "loggedOutPageHelp": "Insira o texto exibido na página de logout.", + "standardDescription": "Descrição Padrão", + "standardDescriptionHelp": "Insira a descrição padrão para as informações meta de SEO.", + "standardTitle": "Título Padrão", + "standardTitleHelp": "Insira o título padrão para as informações meta de SEO.", + "showDocumentation": "Exibir Documentação", + "submitIssue": "Permitir Enviar Problema", + "whatsNew": "Ativar \"Novidades\"", + "saveButton": "Salvar Configurações", + "errorPageImage": "Envie uma imagem para a página de erro no formato SVG ou PNG.", + "signUpPageImage": "Envie uma imagem para a página de cadastro no formato SVG ou PNG.", + "loggedOutPageImage": "Envie uma imagem para a página de saída no formato SVG ou PNG.", + "documentationLink": "Link da documentação", + "documentationLinkPlaceholder": "Insira o URL da sua documentação...", + "documentationLinkHelp": "Forneça um URL válido que os usuários possam visitar para acessar a documentação.", + "whatsNewSection": "Configurações de documentação", + "whatsNewLink": "Link da documentação", + "whatsNewLinkPlaceholder": "Insira o URL da sua documentação...", + "whatsNewLinkHelp": "Forneça um URL válido que os usuários possam visitar para acessar as novidades." }, "networkMessage": { ...en.networkMessage, diff --git a/client/packages/lowcoder/src/i18n/locales/ru.ts b/client/packages/lowcoder/src/i18n/locales/ru.ts index 7f7c09c24..6a571d584 100644 --- a/client/packages/lowcoder/src/i18n/locales/ru.ts +++ b/client/packages/lowcoder/src/i18n/locales/ru.ts @@ -2331,7 +2331,6 @@ export const ru = { "appUsage": "Журналы использования приложений", "environments": "Окружающая среда", "premium": "Премиум", - "AppUsage": "Глобальное использование приложений", }, "memberSettings": { ...en.memberSettings, @@ -2769,17 +2768,48 @@ export const ru = { }, "branding": { ...en.branding, - - "title": "Брендинг", - "logoTitle": "Логотип", - "logoHelp": "Только .JPG, .SVG или .PNG", - "faviconTitle": "Фавикон", - "faviconHelp": "Только .JPG, .SVG или .PNG", - "brandNameTitle": "Название бренда", - "headColorTitle": "Цвет головы", - "save": "Сохранить", - "saveSuccessMsg": "Сохранено успешно", - "upload": "Нажмите, чтобы загрузить", + "title": "Настройки брендинга", + "logoSection": "Логотипы", + "logo": "Логотип", + "logoHelp": "Загрузите логотип вашей компании в формате SVG или PNG.", + "squareLogo": "Квадратный логотип", + "squareLogoHelp": "Загрузите квадратную версию логотипа в формате SVG или PNG.", + "colorFontSection": "Цвета и шрифты", + "mainBrandingColor": "Основной цвет бренда", + "mainBrandingColorHelp": "Выберите основной цвет для вашего бренда.", + "editorHeaderColor": "Цвет заголовка редактора", + "editorHeaderColorHelp": "Выберите цвет заголовка редактора.", + "adminSidebarColor": "Цвет боковой панели администратора", + "adminSidebarColorHelp": "Выберите цвет боковой панели администратора.", + "editorSidebarColor": "Цвет боковой панели редактора", + "editorSidebarColorHelp": "Выберите цвет боковой панели редактора.", + "font": "Шрифт", + "fontHelp": "Выберите шрифт из Google Fonts для вашего приложения.", + "textSection": "Тексты и страницы", + "errorPage": "Текст страницы ошибки", + "errorPageHelp": "Введите текст, который отображается на странице ошибки.", + "signUpPage": "Текст страницы регистрации", + "signUpPageHelp": "Введите текст, который отображается на странице регистрации.", + "loggedOutPage": "Текст страницы выхода", + "loggedOutPageHelp": "Введите текст, который отображается на странице выхода.", + "standardDescription": "Стандартное описание", + "standardDescriptionHelp": "Введите стандартное описание для SEO-метаинформации.", + "standardTitle": "Стандартный заголовок", + "standardTitleHelp": "Введите стандартный заголовок для SEO-метаинформации.", + "showDocumentation": "Показать документацию", + "submitIssue": "Разрешить отправку проблемы", + "whatsNew": "Включить \"Что нового\"", + "saveButton": "Сохранить настройки", + "errorPageImage": "Загрузите изображение для страницы ошибки в формате SVG или PNG.", + "signUpPageImage": "Загрузите изображение для страницы регистрации в формате SVG или PNG.", + "loggedOutPageImage": "Загрузите изображение для страницы выхода в формате SVG или PNG.", + "documentationLink": "Ссылка на документацию", + "documentationLinkPlaceholder": "Введите URL для вашей документации...", + "documentationLinkHelp": "Укажите действительный URL, который пользователи могут посетить для просмотра документации.", + "whatsNewSection": "Настройки документации", + "whatsNewLink": "Ссылка на документацию", + "whatsNewLinkPlaceholder": "Введите URL для вашей документации...", + "whatsNewLinkHelp": "Укажите действительный URL, который пользователи могут посетить для просмотра новостей." }, "networkMessage": { ...en.networkMessage, diff --git a/client/packages/lowcoder/src/i18n/locales/zh.ts b/client/packages/lowcoder/src/i18n/locales/zh.ts index 5a0ea8d0f..8754c9c86 100644 --- a/client/packages/lowcoder/src/i18n/locales/zh.ts +++ b/client/packages/lowcoder/src/i18n/locales/zh.ts @@ -1848,7 +1848,6 @@ export const zh: typeof en = { appUsage: "应用程序使用日志", environments: "环境", premium: "高级版", - "AppUsage": "全球应用程序使用情况", }, memberSettings: { ...en.memberSettings, @@ -2204,19 +2203,53 @@ export const zh: typeof en = { "showHeaderInPublicApps": "在公共视图中显示标题", "showHeaderInPublicAppsHelp": "设置所有应用程序的标题在公共视图中的可见性", }, - branding: { + + "branding": { ...en.branding, - title: "品牌", - logoTitle: "Logo", - logoHelp: "仅支持 .JPG、.SVG 或 .PNG 格式", - faviconTitle: "Favicon", - faviconHelp: "仅支持 .JPG、.SVG 或 .PNG 格式", - brandNameTitle: "品牌名称", - headColorTitle: "头部颜色", - save: "保存", - saveSuccessMsg: "保存成功", - upload: "点击上传", + "title": "品牌设置", + "logoSection": "标志", + "logo": "标志", + "logoHelp": "上传公司标志,支持 SVG 或 PNG 格式。", + "squareLogo": "方形标志", + "squareLogoHelp": "上传方形版本的标志,支持 SVG 或 PNG 格式。", + "colorFontSection": "颜色和字体", + "mainBrandingColor": "主品牌颜色", + "mainBrandingColorHelp": "选择品牌的主要颜色。", + "editorHeaderColor": "编辑器头部颜色", + "editorHeaderColorHelp": "选择编辑器头部的颜色。", + "adminSidebarColor": "管理员侧边栏颜色", + "adminSidebarColorHelp": "选择管理员侧边栏的颜色。", + "editorSidebarColor": "编辑器侧边栏颜色", + "editorSidebarColorHelp": "选择编辑器侧边栏的颜色。", + "font": "字体", + "fontHelp": "从 Google Fonts 中选择您的应用字体。", + "textSection": "文本和页面", + "errorPage": "错误页面文本", + "errorPageHelp": "输入显示在错误页面上的文本。", + "signUpPage": "注册页面文本", + "signUpPageHelp": "输入显示在注册页面上的文本。", + "loggedOutPage": "注销页面文本", + "loggedOutPageHelp": "输入显示在注销页面上的文本。", + "standardDescription": "标准描述", + "standardDescriptionHelp": "输入 SEO 元信息的标准描述。", + "standardTitle": "标准标题", + "standardTitleHelp": "输入 SEO 元信息的标准标题。", + "showDocumentation": "显示文档", + "submitIssue": "允许提交问题", + "whatsNew": "启用“新功能”", + "saveButton": "保存设置", + "errorPageImage": "上传一个用于错误页面的SVG或PNG格式的图片。", + "signUpPageImage": "上传一个用于注册页面的SVG或PNG格式的图片。", + "loggedOutPageImage": "上传一个用于注销页面的SVG或PNG格式的图片。", + "documentationLink": "文档链接", + "documentationLinkPlaceholder": "输入您的文档链接...", + "documentationLinkHelp": "提供一个有效的 URL 用户可以访问查看文档。", + "whatsNewSection": "文档设置", + "whatsNewLink": "文档链接", + "whatsNewLinkPlaceholder": "输入您的文档链接...", + "whatsNewLinkHelp": "提供一个有效的 URL 用户可以访问查看最新消息。" }, + networkMessage: { ...en.networkMessage, 400: "请求参数错误", diff --git a/client/packages/lowcoder/src/pages/ApplicationV2/HomeResCard.tsx b/client/packages/lowcoder/src/pages/ApplicationV2/HomeResCard.tsx index 38f38f1bf..04ef180dc 100644 --- a/client/packages/lowcoder/src/pages/ApplicationV2/HomeResCard.tsx +++ b/client/packages/lowcoder/src/pages/ApplicationV2/HomeResCard.tsx @@ -1,5 +1,5 @@ import { TacoButton } from "lowcoder-design/src/components/button" -import { useState } from "react"; +import { ReactNode, useState } from "react"; import { useDispatch } from "react-redux"; import { updateAppMetaAction } from "redux/reduxActions/applicationActions"; import styled from "styled-components"; @@ -24,6 +24,7 @@ import { TypographyText } from "../../components/TypographyText"; import { useParams } from "react-router-dom"; import { messageInstance } from "lowcoder-design/src/components/GlobalInstances"; import {FolderIcon} from "icons"; +import { BrandedIcon } from "@lowcoder-ee/components/BrandedIcon"; const ExecButton = styled(TacoButton)` width: 52px; @@ -167,13 +168,15 @@ export function HomeResCard(props: { res: HomeRes; onMove: (res: HomeRes) => voi {Icon && ( - + + + )} { diff --git a/client/packages/lowcoder/src/pages/ApplicationV2/HomeTableView.tsx b/client/packages/lowcoder/src/pages/ApplicationV2/HomeTableView.tsx index 9ca46832a..ff1ed815f 100644 --- a/client/packages/lowcoder/src/pages/ApplicationV2/HomeTableView.tsx +++ b/client/packages/lowcoder/src/pages/ApplicationV2/HomeTableView.tsx @@ -22,6 +22,7 @@ import { MoveToFolderModal } from "./MoveToFolderModal"; import { trans } from "../../i18n"; import { useParams } from "react-router-dom"; import { messageInstance } from "lowcoder-design/src/components/GlobalInstances"; +import { BrandedIcon } from "@lowcoder-ee/components/BrandedIcon"; const OperationWrapper = styled.div` display: flex; @@ -119,11 +120,13 @@ export const HomeTableView = (props: { resources: HomeRes[], setModify?: any, mo return ( {Icon && ( - + + + )} {Icon && ( - + + + )} {item.name} diff --git a/client/packages/lowcoder/src/pages/ApplicationV2/index.tsx b/client/packages/lowcoder/src/pages/ApplicationV2/index.tsx index 6a95b4a90..5887b8d4d 100644 --- a/client/packages/lowcoder/src/pages/ApplicationV2/index.tsx +++ b/client/packages/lowcoder/src/pages/ApplicationV2/index.tsx @@ -15,16 +15,15 @@ import { import { getUser, isFetchingUser } from "redux/selectors/usersSelectors"; import { useDispatch, useSelector } from "react-redux"; import { + EllipsisTextCss, + FolderIcon, // EditPopover, HomeDataSourceIcon, NewsIcon, WorkspacesIcon, - // HomeModuleIcon, HomeQueryLibraryIcon, HomeSettingIcon, SupportIcon, - // PlusIcon, - // PointIcon, RecyclerIcon, MarketplaceIcon, AppsIcon, @@ -45,15 +44,10 @@ import { UserProfileView } from "./UserProfileView"; import { NewsView } from "./NewsView"; import { OrgView } from "./OrgView"; import styled, { css } from "styled-components"; -// import history from "../../util/history"; import { FolderView } from "./FolderView"; import { TrashView } from "./TrashView"; import { MarketplaceView } from "./MarketplaceView"; -// import { SideBarItemType } from "../../components/layout/SideBarSection"; -// import InviteDialog from "../common/inviteDialog"; import { fetchFolderElements, updateFolder } from "../../redux/reduxActions/folderActions"; -// import { ModuleView } from "./ModuleView"; -// import { useCreateFolder } from "./useCreateFolder"; import { trans } from "../../i18n"; import { foldersSelector } from "../../redux/selectors/folderSelector"; import Setting from "pages/setting"; @@ -61,9 +55,12 @@ import { Support } from "pages/support"; import { Subscription } from "pages/setting/subscriptions" // import { TypographyText } from "../../components/TypographyText"; // import { messageInstance } from "lowcoder-design/src/components/GlobalInstances"; -import { isEE } from "util/envUtils"; import { getSubscriptions } from 'redux/selectors/subscriptionSelectors'; import { SubscriptionProductsEnum } from '@lowcoder-ee/constants/subscriptionConstants'; +import { EnterpriseProvider } from "@lowcoder-ee/util/context/EnterpriseContext"; +import { SimpleSubscriptionContextProvider } from "@lowcoder-ee/util/context/SimpleSubscriptionContext"; +import { selectIsLicenseActive } from "redux/selectors/enterpriseSelectors"; + // adding App Editor, so we can show Apps inside the Admin Area import AppEditor from "../editor/AppEditor"; @@ -100,6 +97,9 @@ export default function ApplicationHome() { const subscriptions = useSelector(getSubscriptions); const deploymentId = useSelector(getDeploymentId); + const isOrgAdmin = org?.createdBy == user.id ? true : false; + const isLicenseActive = useSelector(selectIsLicenseActive); + useEffect(() => { if (user.currentOrgId) { dispatch(fetchDeploymentIdAction()); @@ -159,100 +159,76 @@ export default function ApplicationHome() { return ( - {trans("home.profile")}, - routePath: USER_PROFILE_URL, - routeComp: UserProfileView, - icon: ({ selected, ...otherProps }) => selected ? : , - mobileVisible: true, - }, - { - text: {trans("home.news")}, - routePath: NEWS_URL, - routeComp: NewsView, - icon: ({ selected, ...otherProps }) => selected ? : , - visible: ({ user }) => user.orgDev, - style: { color: "red" }, - mobileVisible: false, - }, - { - text: {trans("home.orgHome")}, - routePath: ORG_HOME_URL, - routePathExact: false, - routeComp: OrgView, - icon: ({ selected, ...otherProps }) => selected ? : , - visible: ({ user }) => !user.orgDev, - mobileVisible: true, - }, + {/* */} + {/* */} + {trans("home.marketplace")}, - routePath: MARKETPLACE_URL, - routePathExact: false, - routeComp: MarketplaceView, - icon: ({ selected, ...otherProps }) => selected ? : , - mobileVisible: false, + items: [ + { + text: {trans("home.profile")}, + routePath: USER_PROFILE_URL, + routeComp: UserProfileView, + icon: ({ selected, ...otherProps }) => selected ? : , + }, + { + text: {trans("home.news")}, + routePath: NEWS_URL, + routeComp: NewsView, + icon: ({ selected, ...otherProps }) => selected ? : , + visible: ({ user }) => user.orgDev, + style: { color: "red" }, + }, + { + text: {trans("home.orgHome")}, + routePath: ORG_HOME_URL, + routePathExact: false, + routeComp: OrgView, + icon: ({ selected, ...otherProps }) => selected ? : , + visible: ({ user }) => !user.orgDev, + }, + { + text: {trans("home.marketplace")}, + routePath: MARKETPLACE_URL, + routePathExact: false, + routeComp: MarketplaceView, + icon: ({ selected, ...otherProps }) => selected ? : , + }, + ] }, - ] - }, - { - items: [ - // { - // text: {trans("home.allFolders")}, - // routePath: FOLDERS_URL, - // routeComp: RootFolderListView, - // icon: ({ selected, ...otherProps }) => selected ? : , - // }, - { - text: {trans("home.allApplications")}, - routePath: ALL_APPLICATIONS_URL, - routeComp: HomeView, - icon: ({ selected, ...otherProps }) => selected ? : , - mobileVisible: true, - }, - ], - }, - - { - items: [ - { - text: {trans("home.queryLibrary")}, - routePath: QUERY_LIBRARY_URL, - routeComp: QueryLibraryEditor, - icon: ({ selected, ...otherProps }) => selected ? : , - visible: ({ user }) => user.orgDev, - mobileVisible: false, + items: [ + { + text: {trans("home.allApplications")}, + routePath: ALL_APPLICATIONS_URL, + routeComp: HomeView, + icon: ({ selected, ...otherProps }) => selected ? : , + }, + ], }, + { - text: {trans("home.datasource")}, - routePath: DATASOURCE_URL, - routePathExact: false, - routeComp: DatasourceHome, - icon: ({ selected, ...otherProps }) => selected ? : , - visible: ({ user }) => user.orgDev, - onSelected: (_, currentPath) => currentPath.split("/")[1] === "datasource", - mobileVisible: false, + items: [ + + { + text: {trans("home.queryLibrary")}, + routePath: QUERY_LIBRARY_URL, + routeComp: QueryLibraryEditor, + icon: ({ selected, ...otherProps }) => selected ? : , + visible: ({ user }) => user.orgDev, + }, + { + text: {trans("home.datasource")}, + routePath: DATASOURCE_URL, + routePathExact: false, + routeComp: DatasourceHome, + icon: ({ selected, ...otherProps }) => selected ? : , + visible: ({ user }) => user.orgDev, + onSelected: (_, currentPath) => currentPath.split("/")[1] === "datasource", + }, + ], }, - ], - }, - isEE() ? { - items: [ - { - text: {trans("settings.AppUsage")}, - routePath: "/ee/6600ae8724a23f365ba2ed4c/admin", - routePathExact: false, - routeComp: AppEditor, - icon: ({ selected, ...otherProps }) => selected ? ( ) : ( ), - visible: ({ user }) => user.orgDev, - mobileVisible: false, - }, - ], - } : { items: [] }, !supportSubscription && user.orgDev ? { items: [ @@ -279,49 +255,49 @@ export default function ApplicationHome() { }, ], } : { items: [] }, - - { - items: [ { - text: {trans("settings.title")}, - routePath: SETTING_URL, - routePathExact: false, - routeComp: Setting, - icon: ({ selected, ...otherProps }) => selected ? : , - visible: ({ user }) => user.orgDev, - onSelected: (_, currentPath) => currentPath.split("/")[1] === "setting", - mobileVisible: false, - } - ] - }, + items: [ + { + text: {trans("settings.title")}, + routePath: SETTING_URL, + routePathExact: false, + routeComp: Setting, + icon: ({ selected, ...otherProps }) => selected ? : , + visible: ({ user }) => user.orgDev, + onSelected: (_, currentPath) => currentPath.split("/")[1] === "setting", + } + ] + }, - { - items: [ { - text: {trans("home.trash")}, - routePath: TRASH_URL, - routeComp: TrashView, - icon: ({ selected, ...otherProps }) => selected ? : , - visible: ({ user }) => user.orgDev, - mobileVisible: false, + items: [ + { + text: {trans("home.trash")}, + routePath: TRASH_URL, + routeComp: TrashView, + icon: ({ selected, ...otherProps }) => selected ? : , + visible: ({ user }) => user.orgDev, + }, + ], }, - ], - }, - // this we need to show the Folders view in the Admin Area - { - items: [ + // this we need to show the Folders view in the Admin Area { - text: "", - routePath: FOLDER_URL, - routeComp: FolderView, - visible: () => false, + items: [ + { + text: "", + routePath: FOLDER_URL, + routeComp: FolderView, + visible: () => false, + } + ] } - ] - } - ]} - /> + ]} + /> + {/* */} + {/* */} + ); } diff --git a/client/packages/lowcoder/src/pages/common/header.tsx b/client/packages/lowcoder/src/pages/common/header.tsx index 0b32ef396..6c951f18b 100644 --- a/client/packages/lowcoder/src/pages/common/header.tsx +++ b/client/packages/lowcoder/src/pages/common/header.tsx @@ -64,6 +64,8 @@ import Avatar from 'antd/es/avatar'; import UserApi from "@lowcoder-ee/api/userApi"; import { validateResponse } from "@lowcoder-ee/api/apiUtils"; import ProfileImage from "./profileImage"; +import { buildMaterialPreviewURL } from "@lowcoder-ee/util/materialUtils"; +import { getBrandingSetting } from "@lowcoder-ee/redux/selectors/enterpriseSelectors"; const { Countdown } = Statistic; const { Text } = Typography; @@ -321,6 +323,10 @@ const DropdownMenuStyled = styled(DropdownMenu)` } `; +const BrandLogo = styled.img` + height: 28px; +` + function HeaderProfile(props: { user: User }) { const { user } = props; const fetchingUser = useSelector(isFetchingUser); @@ -374,6 +380,7 @@ export default function Header(props: HeaderProps) { const dispatch = useDispatch(); const showAppSnapshot = useSelector(showAppSnapshotSelector); const {selectedSnapshot, isArchivedSnapshot} = useSelector(getSelectedAppSnapshot); + const brandingSettings = useSelector(getBrandingSetting); const { appType } = useContext(ExternalEditorContext); const [editName, setEditName] = useState(false); const [editing, setEditing] = useState(false); @@ -424,12 +431,17 @@ export default function Header(props: HeaderProps) { editorState.setEditorModeStatus(value); }; - const headerStart = ( <> history.push(ALL_APPLICATIONS_URL)}> {/* {REACT_APP_LOWCODER_SHOW_BRAND === 'true' ? REACT_APP_LOWCODER_CUSTOM_LOGO_SQUARE !== "" ? logo : : } */} - + { brandingSettings?.config_set?.squareLogo + ? ( + Boolean(brandingSettings?.orgId) + ? + : + ) : + } {editName ? ( @@ -674,6 +686,9 @@ export default function Header(props: HeaderProps) { headerStart={headerStart} headerMiddle={headerMiddle} headerEnd={headerEnd} + style={{ + backgroundColor: brandingSettings?.config_set?.appHeaderColor + }} /> ); } @@ -681,11 +696,15 @@ export default function Header(props: HeaderProps) { // header in manager page export function AppHeader() { const user = useSelector(getUser); - const brandingConfig = useSelector(getBrandingConfig); + const brandingSettings = useSelector(getBrandingSetting); + const headerStart = ( history.push(ALL_APPLICATIONS_URL)}> {/* {REACT_APP_LOWCODER_SHOW_BRAND === 'true' ? REACT_APP_LOWCODER_CUSTOM_LOGO !== "" ? logo : : } */} - + { brandingSettings?.config_set?.squareLogo + ? + : + } ); const headerEnd = ; @@ -693,9 +712,9 @@ export function AppHeader() { ); } diff --git a/client/packages/lowcoder/src/pages/common/help.tsx b/client/packages/lowcoder/src/pages/common/help.tsx index 776dc86b3..0b15c1050 100644 --- a/client/packages/lowcoder/src/pages/common/help.tsx +++ b/client/packages/lowcoder/src/pages/common/help.tsx @@ -11,7 +11,7 @@ import { showCustomerServicePanel, showHelpDropdown, } from "@lowcoder-ee/pages/common/customerService"; -import React, { useCallback, useEffect, useState } from "react"; +import React, { useCallback, useEffect, useMemo, useState } from "react"; import { useDispatch, useSelector } from "react-redux"; import { createApplication } from "redux/reduxActions/applicationActions"; import history from "util/history"; @@ -28,6 +28,7 @@ import { QuestionIcon, UpgradeIcon } from "lowcoder-design"; import { trans } from "i18n"; import { localEnv } from "util/envUtils"; import { isPublicApplication } from "@lowcoder-ee/redux/selectors/applicationSelector"; +import { getBrandingSetting } from "@lowcoder-ee/redux/selectors/enterpriseSelectors"; const StyledMenu = styled(DropdownMenu)<{ $edit: boolean | string }>` ${(props) => @@ -191,6 +192,22 @@ function HelpDropdownComp(props: HelpDropdownProps) { const [toolTipContent, setToolTipContent] = useState(null); const [showDropdown, setShowDropdown] = useState(false); const isPublicApp = useSelector(isPublicApplication); + const brandingSettings = useSelector(getBrandingSetting); + + const showDocLink = useMemo(() => { + if (!Boolean(brandingSettings)) return Boolean(docHomeUrl); + return brandingSettings?.config_set?.showDocumentation; + }, [brandingSettings?.config_set?.showDocumentation]); + + const showSubmitIssueLink = useMemo(() => { + if (!Boolean(brandingSettings)) return Boolean(issueUrl); + return brandingSettings?.config_set?.submitIssue; + }, [brandingSettings?.config_set?.submitIssue]); + + const showWhatsNewLink = useMemo(() => { + if (!Boolean(brandingSettings)) return Boolean(changeLogDocUrl); + return brandingSettings?.config_set?.whatsNew; + }, [brandingSettings?.config_set?.whatsNew]); const closeTooltip = () => { // turn of tooltip @@ -255,6 +272,9 @@ function HelpDropdownComp(props: HelpDropdownProps) { ); return; case "docs": + if (brandingSettings?.config_set?.documentationLink) { + return window.open(brandingSettings?.config_set?.documentationLink); + } window.open(docHomeUrl); return; case "issue": @@ -267,6 +287,9 @@ function HelpDropdownComp(props: HelpDropdownProps) { props.setShowShortcutList?.(true); return; case "changeLog": + if (brandingSettings?.config_set?.whatsNewLink) { + return window.open(brandingSettings?.config_set?.whatsNewLink); + } window.open(changeLogDocUrl); return; } @@ -302,7 +325,7 @@ function HelpDropdownComp(props: HelpDropdownProps) { ), } : null, - { + showDocLink ? { key: "docs", label: ( @@ -310,8 +333,8 @@ function HelpDropdownComp(props: HelpDropdownProps) { {trans("help.docs")} ), - }, - issueUrl + } : null, + showSubmitIssueLink ? { key: "issue", label: ( @@ -353,7 +376,7 @@ function HelpDropdownComp(props: HelpDropdownProps) { ), } : null, - changeLogDocUrl + showWhatsNewLink ? { key: "changeLog", label: ( diff --git a/client/packages/lowcoder/src/pages/common/previewHeader.tsx b/client/packages/lowcoder/src/pages/common/previewHeader.tsx index f8d4cba2e..54300cd2a 100644 --- a/client/packages/lowcoder/src/pages/common/previewHeader.tsx +++ b/client/packages/lowcoder/src/pages/common/previewHeader.tsx @@ -26,6 +26,8 @@ import MobileOutlined from "@ant-design/icons/MobileOutlined"; import TabletOutlined from "@ant-design/icons/TabletOutlined"; import DesktopOutlined from "@ant-design/icons/DesktopOutlined"; import { DeviceOrientation, DeviceType, EditorContext } from "@lowcoder-ee/comps/editorState"; +import { getBrandingSetting } from "@lowcoder-ee/redux/selectors/enterpriseSelectors"; +import { buildMaterialPreviewURL } from "@lowcoder-ee/util/materialUtils"; const HeaderFont = styled.div<{ $bgColor: string }>` font-weight: 500; @@ -111,6 +113,10 @@ const Wrapper = styled.div` } `; +const BrandLogo = styled.img` + height: 28px; +` + export function HeaderProfile(props: { user: User }) { const { user } = props; const fetchingUser = useSelector(isFetchingUser); @@ -149,14 +155,21 @@ const PreviewHeaderComp = () => { const isPublicApp = useSelector(isPublicApplication); const applicationId = useApplicationId(); const templateId = useSelector(getTemplateId); - const brandingConfig = useSelector(getBrandingConfig); + const brandingSettings = useSelector(getBrandingSetting); const [permissionDialogVisible, setPermissionDialogVisible] = useState(false); const isViewMarketplaceMode = params.viewMode === 'view_marketplace' || isPublicApp; const headerStart = ( <> !isPublicApp && history.push(ALL_APPLICATIONS_URL)}> - + {/* */} + { brandingSettings?.config_set?.squareLogo + ? ( + Boolean(brandingSettings?.orgId) + ? + : + ) : + } {isViewMarketplaceMode && ( { /> )} {!isViewMarketplaceMode && ( - + {application && application.name} )} @@ -256,7 +269,7 @@ const PreviewHeaderComp = () => { headerStart={headerStart} headerMiddle={headerMiddle} headerEnd={headerEnd} - style={{ backgroundColor: brandingConfig?.headerColor }} + style={{ backgroundColor: brandingSettings?.config_set?.appHeaderColor }} /> ); }; diff --git a/client/packages/lowcoder/src/pages/editor/AppEditor.tsx b/client/packages/lowcoder/src/pages/editor/AppEditor.tsx index 76183556d..c7e31be8f 100644 --- a/client/packages/lowcoder/src/pages/editor/AppEditor.tsx +++ b/client/packages/lowcoder/src/pages/editor/AppEditor.tsx @@ -28,9 +28,6 @@ import { DatasourceApi } from "api/datasourceApi"; import { useRootCompInstance } from "./useRootCompInstance"; import EditorSkeletonView from "./editorSkeletonView"; import {ErrorBoundary, FallbackProps} from 'react-error-boundary'; -import { ALL_APPLICATIONS_URL } from "@lowcoder-ee/constants/routesURL"; -import history from "util/history"; -import Flex from "antd/es/flex"; import React from "react"; import dayjs from "dayjs"; import { currentApplication } from "@lowcoder-ee/redux/selectors/applicationSelector"; @@ -50,6 +47,8 @@ const AppEditorInternalView = lazy( .then(moduleExports => ({default: moduleExports.AppEditorInternalView})) ); +const ErrorFallback = lazy(() => import("components/ErrorFallback")); + const AppEditor = React.memo(() => { const dispatch = useDispatch(); const params = useParams(); @@ -209,39 +208,12 @@ const AppEditor = React.memo(() => { } }, [isLowcoderCompLoading, fetchApplication]); - const fallbackUI = useMemo(() => ( - -

Something went wrong while displaying this webpage

- -
- ), []); - if (Boolean(appError)) { - return ( - -

{appError}

- -
- ) + return } return ( - - {/**/} + }> {showAppSnapshot ? ( }> ` )`}; `; -const SiderWrapper = styled.div` +const SiderWrapper = styled.div<{ + $bgColor?: string; + $fontColor?: string; + $activeBgColor?: string; + $activeFontColor?: string; +}>` .ant-menu { - background-color: #393b47; + background-color: ${props => props.$bgColor ? props.$bgColor : '#393b47'}; height: calc(100vh - 48px); .ant-menu-item { @@ -168,10 +176,10 @@ const SiderWrapper = styled.div` &.ant-menu-item-selected, &:hover, &:active { - background-color: #393b47; - + background-color: ${props => props.$bgColor ? props.$bgColor : '#393b47'}; svg { - background: #8b8fa37f; + background: ${props => props.$activeBgColor ? props.$activeBgColor : '#8b8fa37f'}; + color: ${props => props.$activeFontColor ? props.$activeFontColor : '#ffffffa6'}; border-radius: 4px; } } @@ -400,6 +408,7 @@ function EditorView(props: EditorViewProps) { const locationState = useLocation().state; const showNewUserGuide = locationState?.showNewUserGuide; const showAppSnapshot = useSelector(showAppSnapshotSelector); + const brandingSettings = useSelector(getBrandingSetting); const [showShortcutList, setShowShortcutList] = useState(false); const toggleShortcutList = useCallback( () => setShowShortcutList(!showShortcutList), @@ -641,7 +650,12 @@ function EditorView(props: EditorViewProps) { toggleShortcutList={toggleShortcutList} > - + ` +export const CompIconDiv = styled.div<{ $h: number; $w: number, $isSelected?: boolean, $color?: string }>` ${NoShake}; padding: 3px; background: #ffffff; @@ -50,6 +50,15 @@ export const CompIconDiv = styled.div<{ $h: number; $w: number, $isSelected?: bo transform-style: preserve-3d; backface-visibility: hidden; `} + + ${props => props.$color && ` + svg > *[fill='#B480DE'] { + fill: ${props.$color}; + } + svg > *[stroke='#B480DE'] { + stroke: ${props.$color}; + } + `} `; export const RightPanelContentWrapper = styled.div` diff --git a/client/packages/lowcoder/src/pages/editor/right/uiCompPanel.tsx b/client/packages/lowcoder/src/pages/editor/right/uiCompPanel.tsx index 068713dab..b12d59f31 100644 --- a/client/packages/lowcoder/src/pages/editor/right/uiCompPanel.tsx +++ b/client/packages/lowcoder/src/pages/editor/right/uiCompPanel.tsx @@ -24,6 +24,8 @@ import { } from "lowcoder-design"; import { TransparentImg } from "../../../util/commonUtils"; import { RightContext } from "./rightContext"; +import { useSelector } from "react-redux"; +import { getBrandingSetting } from "@lowcoder-ee/redux/selectors/enterpriseSelectors"; const CompDiv = styled.div` display: flex; @@ -65,8 +67,10 @@ const HovDiv = styled.div` const IconContain = (props: { Icon: React.FunctionComponent> }) => { const { Icon } = props; + const brandingSettings = useSelector(getBrandingSetting); + return ( - + ); diff --git a/client/packages/lowcoder/src/pages/setting/appUsage/charts/browserEngineBreakdown.tsx b/client/packages/lowcoder/src/pages/setting/appUsage/charts/browserEngineBreakdown.tsx new file mode 100644 index 000000000..257627215 --- /dev/null +++ b/client/packages/lowcoder/src/pages/setting/appUsage/charts/browserEngineBreakdown.tsx @@ -0,0 +1,61 @@ +import React, { useMemo, useRef } from "react"; +import ReactECharts from "echarts-for-react"; +import dayjs from "dayjs"; +import { debounce } from "lodash"; + +interface Props { + data: Array; +} + +const BrowserEngineBreakdownChart = ({ data}: Props) => { + const chartRef = useRef(null); + + const browserEngine = useMemo(() => { + return data.reduce((acc, e) => { + const browser = e.agentName || 'Unknown'; + const engine = e.layoutEngineName || 'Unknown'; + acc[browser] = acc[browser] || {}; + acc[browser][engine] = (acc[browser][engine] || 0) + 1; + return acc; + }, {} as Record); + }, []); + + // Get unique browser types + const browserTypeSet = [...new Set(data.map((log: any) => log.agentName || 'Unkown'))]; + + // Get unique engine types + const engineTypeSet = [...new Set(data.map((log: any) => log.layoutEngineName || 'Unkown'))]; + + // Prepare series data for each event type + const series = engineTypeSet.map((engineType) => ({ + name: engineType, + type: "bar", + stack: "total", + data: Object.keys(browserEngine).map((browserType: string) => browserEngine[browserType][engineType]), + })); + + return ( + + ); +}; + +export default BrowserEngineBreakdownChart; diff --git a/client/packages/lowcoder/src/pages/setting/appUsage/charts/deviceOSBreakdown.tsx b/client/packages/lowcoder/src/pages/setting/appUsage/charts/deviceOSBreakdown.tsx new file mode 100644 index 000000000..916b5f7ff --- /dev/null +++ b/client/packages/lowcoder/src/pages/setting/appUsage/charts/deviceOSBreakdown.tsx @@ -0,0 +1,61 @@ +import React, { useMemo, useRef } from "react"; +import ReactECharts from "echarts-for-react"; +import dayjs from "dayjs"; +import { debounce } from "lodash"; + +interface Props { + data: Array; +} + +const DeviceOSBreakdownChart = ({ data}: Props) => { + const chartRef = useRef(null); + + const deviceOs = useMemo(() => { + return data.reduce((acc, e) => { + const device = e.deviceClass || 'Unknown'; + const os = e.operatingSystemName || 'Unknown'; + acc[device] = acc[device] || {}; + acc[device][os] = (acc[device][os] || 0) + 1; + return acc; + }, {} as Record>); + }, []); + + // Get unique device types + const deviceTypeSet = [...new Set(data.map((log: any) => log.deviceClass || 'Unkown'))]; + + // Get unique os types + const osTypeSet = [...new Set(data.map((log: any) => log.operatingSystemName || 'Unkown'))]; + + // Prepare series data for each event type + const series = osTypeSet.map((osType) => ({ + name: osType, + type: "bar", + stack: "total", + data: Object.keys(deviceOs).map((deviceType: string) => deviceOs[deviceType][osType]), + })); + + return ( + + ); +}; + +export default DeviceOSBreakdownChart; diff --git a/client/packages/lowcoder/src/pages/setting/appUsage/charts/userActivityByTime.tsx b/client/packages/lowcoder/src/pages/setting/appUsage/charts/userActivityByTime.tsx new file mode 100644 index 000000000..97144aff2 --- /dev/null +++ b/client/packages/lowcoder/src/pages/setting/appUsage/charts/userActivityByTime.tsx @@ -0,0 +1,111 @@ +import React, { useRef } from "react"; +import ReactECharts from "echarts-for-react"; +import dayjs from "dayjs"; +import { debounce } from "lodash"; + +interface Props { + data: Array; + setDateRange: (range: { fromTimestamp: string; toTimestamp: string }) => void; +} + +const UserActivityByTimeChart = ({ data, setDateRange }: Props) => { + const chartRef = useRef(null); + + const debouncedSetDateRange = useRef( + debounce((fromTimestamp: string, toTimestamp: string) => { + setDateRange({ fromTimestamp, toTimestamp }); + }, 500) // Delays fetching only after zooming stops + ).current; + + // Extract min/max dates from the data + const allDates = data.map((log) => log.eventTime && dayjs(log.eventTime).format("YYYY-MM-DD")); + const minDate = allDates.length ? dayjs(Math.min(...allDates.map((d) => new Date(d).getTime()))) : dayjs().subtract(7, "days"); + const maxDate = allDates.length ? dayjs(Math.max(...allDates.map((d) => new Date(d).getTime()))) : dayjs(); + + // Generate full date range including missing days + const fullDateRange: string[] = []; + let currentDate = minDate; + while (currentDate.isBefore(maxDate) || currentDate.isSame(maxDate, "day")) { + fullDateRange.push(currentDate.format("YYYY-MM-DD")); + currentDate = currentDate.add(1, "day"); + } + + // Group data by date and eventType + const timeSeriesData = data.reduce((acc: any, log: any) => { + const eventTime = log.eventTime ? new Date(log.eventTime) : null; + if (eventTime && !isNaN(eventTime.getTime())) { + const date = eventTime.toISOString().split("T")[0]; // Extract date part + if (!acc[date]) acc[date] = 0; + acc[date] = acc[date] + 1; + } + return acc; + }, {}); + + // Prepare series data for each event type + const series = [{ + name: "App Views", + type: "line", + stack: "total", + data: fullDateRange.map((date) => timeSeriesData[date] || 0), // Fill gaps with 0 + itemStyle: { + color: "#1890ff", + }, + }]; + + const handleChartEvents = (params: any) => { + if (params.start !== undefined && params.end !== undefined) { + const startIndex = Math.floor((params.start / 100) * (fullDateRange.length - 1)); + const endIndex = Math.floor((params.end / 100) * (fullDateRange.length - 1)); + + const fromDate = new Date(fullDateRange[startIndex] || fullDateRange[0]); // Keep start of day + const toDate = new Date(fullDateRange[endIndex] || fullDateRange[fullDateRange.length - 1]); + + toDate.setHours(23, 59, 59, 999); + + const fromTimestamp = fromDate.toISOString(); + const toTimestamp = toDate.toISOString(); + debouncedSetDateRange(fromTimestamp, toTimestamp); + } + }; + + return ( + + ); +}; + +export default UserActivityByTimeChart; diff --git a/client/packages/lowcoder/src/pages/setting/appUsage/charts/userAuthStatus.tsx b/client/packages/lowcoder/src/pages/setting/appUsage/charts/userAuthStatus.tsx new file mode 100644 index 000000000..48b61829c --- /dev/null +++ b/client/packages/lowcoder/src/pages/setting/appUsage/charts/userAuthStatus.tsx @@ -0,0 +1,53 @@ +import React, { useMemo, useRef } from "react"; +import ReactECharts from "echarts-for-react"; + +interface Props { + data: Array; +} + +const UserAuthStatusChart = ({ data }: Props) => { + const chartRef = useRef(null); + + const anonKnown = useMemo(() => { + return data.reduce((acc, e) => { + const type = e.isAnonymous ? 'Anonymous' : 'Known'; + acc[type] = (acc[type] || 0) + 1; + return acc; + }, {} as Record); + }, [data]); + + const pieData = useMemo(() => { + return Object.entries(anonKnown).map(([name, value]) => ({ name, value })); + }, [anonKnown]); + + const series = [{ + name: 'Anonymouse', + type: 'pie', + radius: '50%', + data: pieData, + emphasis: { + itemStyle: { + shadowBlur: 10, + shadowOffsetX: 0, + shadowColor: 'rgba(0, 0, 0, 0.5)' + } + } + }]; + + return ( + + ); +}; + +export default UserAuthStatusChart; diff --git a/client/packages/lowcoder/src/pages/setting/appUsage/charts/userEngagementByRegion.tsx b/client/packages/lowcoder/src/pages/setting/appUsage/charts/userEngagementByRegion.tsx new file mode 100644 index 000000000..5dde63441 --- /dev/null +++ b/client/packages/lowcoder/src/pages/setting/appUsage/charts/userEngagementByRegion.tsx @@ -0,0 +1,142 @@ +import { useEffect, useMemo, useRef, useState } from "react"; +import ReactECharts from "echarts-for-react"; +import 'echarts-extension-gmap'; +import { findIndex } from "lodash"; + +const googleMapsApiUrl = "https://maps.googleapis.com/maps/api/js"; + +function loadGoogleMapsScript(apiKey: string) { + const mapsUrl = `${googleMapsApiUrl}?key=${apiKey}`; + const scripts = document.getElementsByTagName('script'); + // is script already loaded + let scriptIndex = findIndex(scripts, (script) => script.src.endsWith(mapsUrl)); + if(scriptIndex > -1) { + return scripts[scriptIndex]; + } + // is script loaded with diff api_key, remove the script and load again + scriptIndex = findIndex(scripts, (script) => script.src.startsWith(googleMapsApiUrl)); + if(scriptIndex > -1) { + scripts[scriptIndex].remove(); + } + + const script = document.createElement("script"); + script.type = "text/javascript"; + script.src = mapsUrl; + script.async = true; + script.defer = true; + window.document.body.appendChild(script); + + return script; +} + +interface Props { + data: Array; +} + +function getRandomLatLng(minLat: number, maxLat: number, minLng: number, maxLng: number) { + const lat = Math.random() * (maxLat - minLat) + minLat + const lng = Math.random() * (maxLng - minLng) + minLng + return [lat, lng] +} + +const UserEngagementByRegionChart = ({ data }: Props) => { + const chartRef = useRef(null); + const [mapScriptLoaded, setMapScriptLoaded] = useState(false); + + const isMapScriptLoaded = useMemo(() => { + return mapScriptLoaded || (window as any)?.google; + }, [mapScriptLoaded]) + + const handleOnMapScriptLoad = () => { + setMapScriptLoaded(true); + } + + useEffect(() => { + const gMapScript = loadGoogleMapsScript(''); + if(isMapScriptLoaded) { + handleOnMapScriptLoad(); + return; + } + gMapScript.addEventListener('load', handleOnMapScriptLoad); + return () => { + gMapScript.removeEventListener('load', handleOnMapScriptLoad); + } + }, []) + + const geoPoints = useMemo(() => { + return data.reduce((acc, log) => { + const region = log?.geolocationDataJsonb?.city?.names?.en || 'Unknown'; // assuming `region` is added to each event + let regionData = { + latitude: log?.geolocationDataJsonb?.location?.latitude ?? 55, + longitude: log?.geolocationDataJsonb?.location?.longitude ?? 15, + count: 0, + }; + if (acc[region]) { + acc[region] = { + ...acc[region], + count: acc[region].count + 1, + } + } else { + acc[region] = regionData; + } + return acc; + }, {} as Record); + }, [data]); + + const series = useMemo(() => { + return [ + { + "name": "Users/Region", + "type": "scatter", + "coordinateSystem": "gmap", + "itemStyle": { + "color": "#ff00ff" + }, + "data": Object.keys(geoPoints).map(key => ({ + name: key, + value: [ + geoPoints[key].longitude, + geoPoints[key].latitude, + geoPoints[key].count, + ] + })), + "symbolSize": (val: number[]) => { return 8 + ((Math.log(val[2]) - Math.log(2)) / (Math.log(40) - Math.log(2))) * (40 - 8) }, + "encode": { + "value": 2, + "lng": 0, + "lat": 1 + } + } + ] + }, [geoPoints]); + + return ( + <> + {isMapScriptLoaded && ( + { + return `${params.data.name}: ${params.data.value[2]}`; + } + }, + animation: true, + series: series, + }} + style={{ height: "400px" }} + /> + )} + + ) +} + +export default UserEngagementByRegionChart; \ No newline at end of file diff --git a/client/packages/lowcoder/src/pages/setting/appUsage/dashboard.tsx b/client/packages/lowcoder/src/pages/setting/appUsage/dashboard.tsx new file mode 100644 index 000000000..5133f1a82 --- /dev/null +++ b/client/packages/lowcoder/src/pages/setting/appUsage/dashboard.tsx @@ -0,0 +1,544 @@ +import { Card, Form, Select, Input, Button, message, Divider, Skeleton, Table, Flex, Tag, TableProps } from "antd"; +import React, { useEffect, useState, useCallback, useMemo } from "react"; +import { useDispatch, useSelector } from "react-redux"; +import styled from "styled-components"; +import { trans } from "i18n"; +import { + DetailContainer, + DetailContent, + Header, + } from "../theme/styledComponents"; +import { HeaderBack } from "pages/setting/permission/styledComponents"; +import { getUser } from "@lowcoder-ee/redux/selectors/usersSelectors"; +import { getAppUsageLogs, getEnvironmentsByIds, getMeta } from "api/enterpriseApi"; +import { debounce, uniqBy } from "lodash"; +import { DatePicker } from "antd"; +import dayjs, { Dayjs } from "dayjs"; +import { Link, useLocation } from "react-router-dom"; +import history from "util/history"; +import { SETTING_URL } from "@lowcoder-ee/constants/routesURL"; +import { EyeOutlined } from "@ant-design/icons"; +import UserActivityByTimeChart from "./charts/userActivityByTime"; +import UserAuthStatusChart from "./charts/userAuthStatus"; +import DeviceOSBreakdownChart from "./charts/deviceOSBreakdown"; +import BrowserEngineBreakdownChart from "./charts/browserEngineBreakdown"; +import UserEngagementByRegionChart from "./charts/userEngagementByRegion"; +import { geoLocation } from "../audit/auditContants"; + +const { RangePicker } = DatePicker; + +const AppLogContent = styled.div` + font-size: 14px; + color: #8b8fa3; + flex-grow: 1; + padding-top: 0px; + padding-left: 0px; + max-width: 100%; + margin-bottom: 20px; +`; + +const StyleThemeSettingsCover = styled.div` + display: flex; + flex-direction: row; + background: linear-gradient(34deg, rgba(2, 0, 36, 1) 0%, rgba(102, 9, 121, 1) 35%, rgba(0, 255, 181, 1) 100%); + padding: 15px; + height: 80px; + border-radius: 10px 10px 0 0; +`; + +export function AppUsageDashboard() { + + type AppLog = { + eventType: string; + eventTime: string; + environmentId: string; + orgId: string; + userId: string; + appId: string; + isAnonymous: boolean; + details: Record; + geolocationDataJsonb?: Record, + }; + + const currentUser = useSelector(getUser); + const location = useLocation(); + + const [allLogs, setAllLogs] = useState([]); + const [currentPageLogs, setCurrentPageLogs] = useState([]); + const [dataMap, setDataMap] = useState>({}); + + // const [logs, setLogs] = useState([]); + const [total, setTotal] = useState(0); + const [loading, setLoading] = useState(false); + const [form] = Form.useForm(); + const [pagination, setPagination] = useState({ pageSize: 25, current: 1 }); + + // Function to get URL parameters + const getQueryParams = () => { + const params = new URLSearchParams(location.search); + let queryObject: Record = {}; + + // Convert search params into a JavaScript object + params.forEach((value, key) => { + if (key !== 'fromTimestamp' && key !== 'toTimestamp') { + queryObject[key] = value; + } + }); + + // set date range picker values + let dateRange = new Array(2); + if (params.get('fromTimestamp')) { + dateRange[0] = dayjs(params.get('fromTimestamp')); + } + if (params.get('toTimestamp')) { + dateRange[1] = dayjs(params.get('toTimestamp')); + } + + queryObject['dateRange'] = dateRange; + return queryObject; + }; + + useEffect(() => { + form.setFieldsValue(getQueryParams()); + }, []); + + const handleQueryParams = (queryParams: Record) => { + const params = new URLSearchParams(); + Object.keys(queryParams).map((key) => { + const value = queryParams[key]; + if (value) { + params.set(key, value); + } else { + params.delete(key); // Remove the key if the value is empty + } + }) + history.push({ search: params.toString() }) + } + + // Fetch Logs with all form values if set + const fetchLogs = async (newPage: number, resetData: boolean = false) => { + const formValues = form.getFieldsValue(); + + const cleanedParams = Object.fromEntries( + Object.entries({ + ...formValues, + pageSize: 100, // Always fetch 500 from API + pageNum: newPage, // API page number + fromTimestamp: formValues.dateRange?.[0] ? formValues.dateRange[0].toISOString() : undefined, + toTimestamp: formValues.dateRange?.[1] ? formValues.dateRange[1].toISOString() : undefined, + }).filter(([key, value]) => value !== undefined && value !== null && value !== "" && key !== 'dateRange') + ); + + handleQueryParams(cleanedParams as any); + + setLoading(true); + try { + const data = await getAppUsageLogs(cleanedParams); + + if (resetData) { + setAllLogs(data.data || []); + setPagination({ pageSize: 25, current: 1 }); // Reset pagination + } else { + setAllLogs((prevLogs) => [...prevLogs, ...(data?.data || [])]); + } + + setTotal(data.totalCount); + } catch (error) { + message.error("Failed to fetch audit logs."); + } finally { + setLoading(false); + } + }; + + // Handle chart zoom + const handleChartZoom = ({ fromTimestamp, toTimestamp }: { fromTimestamp: string; toTimestamp: string }) => { + console.log("Zoom applied:", fromTimestamp, toTimestamp); + + const startDate = dayjs(fromTimestamp); + const endDate = dayjs(toTimestamp); + form.setFieldsValue({ dateRange: [startDate, endDate] }); + + setPagination({ pageSize: 25, current: 1 }); + setAllLogs([]); + setCurrentPageLogs([]); + fetchLogs(1, true); + }; + + // Debounce handler for input fields + const handleInputChange = useCallback( + debounce(() => { + setPagination({ pageSize: 25, current: 1 }); + setAllLogs([]); + setCurrentPageLogs([]); + fetchLogs(1, true); + }, 300), + [] + ); + + const handleClickFilter = (field: any, value: any) => { + form.setFieldsValue({ [field]: value }); + + setPagination({ pageSize: 25, current: 1 }); + setAllLogs([]); + setCurrentPageLogs([]); + fetchLogs(1, true); + }; + + const handleDateChange = (dates: any) => { + if (dates?.[0] && dates?.[1]) { + form.setFieldsValue({ + fromTimestamp: dates[0].toISOString(), + toTimestamp: dates[1].toISOString(), + }); + } else { + form.resetFields(["fromTimestamp", "toTimestamp"]); + } + + // Reset pagination and clear logs BEFORE calling fetchLogs + setPagination({ pageSize: 25, current: 1 }); + setAllLogs([]); + setCurrentPageLogs([]); + + // Ensure fetchLogs is called only ONCE + fetchLogs(1, true); + }; + + // Handle page change + const handleTableChange: TableProps["onChange"] = (newPagination) => { + const newPage = newPagination.current ?? 1; + const pageSize = newPagination.pageSize ?? 25; + const startIndex = (newPage - 1) * pageSize; + const endIndex = startIndex + pageSize; + + console.log( + `New Page: ${newPage}, StartIndex: ${startIndex}, EndIndex: ${endIndex}, AllLogs Length: ${allLogs.length}, Total: ${total}` + ); + + if (endIndex <= allLogs.length) { + // ✅ Correctly slice logs and update state + setCurrentPageLogs(allLogs.slice(startIndex, endIndex)); + } else if (allLogs.length < total) { + // ✅ Fetch next set of logs and update state after fetch + const nextApiPage = Math.floor(allLogs.length / 100) + 1; + fetchLogs(nextApiPage).then(() => { + setCurrentPageLogs(allLogs.slice(startIndex, endIndex)); + }); + } + + setPagination({ pageSize, current: newPage }); + }; + + useEffect(() => { + if (allLogs.length > 0) { + const startIndex = (pagination.current - 1) * pagination.pageSize; + const endIndex = startIndex + pagination.pageSize; + + console.log(`Updating displayed logs: StartIndex ${startIndex}, EndIndex ${endIndex}`); + setCurrentPageLogs(allLogs.slice(startIndex, endIndex)); + } + }, [pagination, allLogs]); + + + // Initial Fetch on Mount + useEffect(() => { + fetchLogs(1); + }, [currentUser.currentOrgId]); + + const appViews = useMemo(() => { + if (!allLogs?.length) return []; + + return allLogs.reduce((acc, e) => { + const environmentId = e.environmentId; + const orgId = e.orgId; + const appId = e.appId; + const name = e.details?.applicationName ?? 'Unknown'; + acc[appId] = acc[appId] || { appId, name, orgId, environmentId, count: 0 }; + acc[appId].count++; + return acc; + }, {} as Record); + }, [allLogs]); + + const topApps = useMemo(() => { + if (!Object.keys(appViews)?.length) return []; + + return Object.values(appViews) + .sort((a, b) => b.count - a.count) + .slice(0, 10); + }, [appViews]); + + const findUniqueDataIds = async () => { + if (!topApps.length) { + return setDataMap({}); + } + + const uniqueOrgIds: string[] = uniqBy(topApps, 'orgId').map(item => item.orgId); + const uniqueEnvIds: string[] = uniqBy(topApps, 'environmentId').map(item => item.environmentId); + + const metaResponse = await getMeta({ + orgIds: uniqueOrgIds, + userIds: [], + appIds: [], + groupIds: [], + bundleIds: [], + datasourceIds: [], + folderIds: [], + libraryQueryIds: [] + }); + + const envResponse = await getEnvironmentsByIds(uniqueEnvIds); + + const tempDataMap: Record = {}; + metaResponse.data?.orgs?.forEach((org: { id: string; name: string; }) => { + tempDataMap[org.id] = org.name; + }); + envResponse.data?.forEach((env: { environmentId: string; environmentType: string; }) => { + tempDataMap[env.environmentId] = env.environmentType; + }); + setDataMap(tempDataMap); + } + + useEffect(() => { + findUniqueDataIds(); + }, [topApps]); + + const columns = [ + { + title: "", + dataIndex: "viewApp", + key: "viewApp", + render: (_: string, record: any) => ( + + + + ), + }, + { + title: "App ID", + dataIndex: "appId", + key: "appId", + render: (text: string, record: any) => ( + handleClickFilter("appId", text)}> + { + record.name + || record.appId + || '-' + } + + ), + }, + { + title: "Org ID", + dataIndex: "orgId", + key: "orgId", + render: (text: string) => ( + handleClickFilter("orgId", text)}>{dataMap[text] ?? text} + ), + }, + { + title: "Environment ID", + dataIndex: "environmentId", + key: "environmentId", + render: (text: string) => ( + handleClickFilter("environmentId", text)}>{dataMap[text] ?? text} + ), + }, + { + title: "Total Views", + dataIndex: "count", + key: "count", + }, + ]; + + return ( + +
+ + {/* {trans("enterprise.AuditLogTitle")} */} + {"App Usage Logs"} + +
+ + + + +

{trans("enterprise.AuditLogOverview")}

+
+ +
{ + const key = Object.keys(changedValue)[0]; + if (key === "dateRange") { + handleDateChange(changedValue.dateRange); + } else if (["environmentId", "orgId", "userId", "appId"].includes(key)) { + handleInputChange(); // Debounced input change + } else { + // Avoid calling fetchLogs if `handleDateChange` already did + fetchLogs(1, true); + } + }} + > + + + + + + {/* + + + + + + + + + + + + + +
+
+
+ + +

{"User Engagement By Region"}

+
+ + {loading ? ( + + ) : currentPageLogs.length > 0 ? ( + <> + + + ) : ( +

No logs found. Adjust the filters and try again.

+ )} +
+
+ + +

{"App Usage Logs"}

+
+ + {loading ? ( + + ) : currentPageLogs.length > 0 ? ( + <> + + + ) : ( +

No logs found. Adjust the filters and try again.

+ )} +
+
+ + +

{"Top 10 Apps"}

+
+ + {loading ? ( + + ) : currentPageLogs.length > 0 ? ( +
+ + + ) : ( +

No logs found. Adjust the filters and try again.

+ )} + + + + +

{"Anonymous/Known Users"}

+
+ + {loading ? ( + + ) : currentPageLogs.length > 0 ? ( + <> + + + ) : ( +

No logs found. Adjust the filters and try again.

+ )} +
+
+ + +

{"Device/OS Breakdown"}

+
+ + {loading ? ( + + ) : currentPageLogs.length > 0 ? ( + <> + + + ) : ( +

No logs found. Adjust the filters and try again.

+ )} +
+
+ + +

{"Browser/Layout Engine Breakdown"}

+
+ + {loading ? ( + + ) : currentPageLogs.length > 0 ? ( + <> + + + ) : ( +

No logs found. Adjust the filters and try again.

+ )} +
+
+ + + ); +} diff --git a/client/packages/lowcoder/src/pages/setting/appUsage/detail.tsx b/client/packages/lowcoder/src/pages/setting/appUsage/detail.tsx new file mode 100644 index 000000000..f4b78751d --- /dev/null +++ b/client/packages/lowcoder/src/pages/setting/appUsage/detail.tsx @@ -0,0 +1,3 @@ +export function AppUsageDetail() { + return <> +} \ No newline at end of file diff --git a/client/packages/lowcoder/src/pages/setting/appUsage/index.tsx b/client/packages/lowcoder/src/pages/setting/appUsage/index.tsx new file mode 100644 index 000000000..9fa083f82 --- /dev/null +++ b/client/packages/lowcoder/src/pages/setting/appUsage/index.tsx @@ -0,0 +1,13 @@ +import { APP_USAGE_DASHBOARD, APP_USAGE_DETAIL } from "@lowcoder-ee/constants/routesURL"; +import { Route, Switch } from "react-router-dom"; +import { AppUsageDashboard } from "./dashboard"; +import { AppUsageDetail } from "./detail"; + +export const AppUsage = () => { + return ( + + + + + ); +}; diff --git a/client/packages/lowcoder/src/pages/setting/audit/AreaTimeChart/index.tsx b/client/packages/lowcoder/src/pages/setting/audit/AreaTimeChart/index.tsx new file mode 100644 index 000000000..285c0bfc9 --- /dev/null +++ b/client/packages/lowcoder/src/pages/setting/audit/AreaTimeChart/index.tsx @@ -0,0 +1,68 @@ +import { StyledReactECharts } from "../auditContants"; + +const apiUsage = [ + { date: '2024-12-07', usage: 860 }, + { date: '2024-12-08', usage: 13 }, + { date: '2024-12-09', usage: 0 }, + { date: '2024-12-10', usage: 83 }, + { date: '2024-12-11', usage: 58 }, + { date: '2024-12-12', usage: 0 }, + { date: '2024-12-13', usage: 138 }, + { date: '2024-12-14', usage: 439 }, + { date: '2024-12-15', usage: 11 }, + { date: '2024-12-16', usage: 0 }, + { date: '2024-12-17', usage: 485 }, + { date: '2024-12-18', usage: 907 }, + { date: '2024-12-19', usage: 91 }, + { date: '2024-12-20', usage: 0 }, +]; + +export const AreaTimeChart = () => { + const options = { + tooltip: { + trigger: 'axis', + position: (pt: any) => { + return [pt[0], '10%']; + } + }, + title: { + left: 'center', + text: 'Daily API Usage' + }, + xAxis: { + type: 'time', + boundaryGap: false + }, + yAxis: { + type: 'value', + boundaryGap: [0, '100%'] + }, + dataZoom: [ + { + type: 'inside', + start: 0, + end: 20 + }, + { + start: 0, + end: 20 + } + ], + series: [ + { + name: 'API Usage', + type: 'line', + smooth: true, + symbol: 'none', + areaStyle: {}, + data: apiUsage.map((data) => [new Date(data.date).getTime(), data.usage]) + } + ] + }; + + return ( + + ) +} \ No newline at end of file diff --git a/client/packages/lowcoder/src/pages/setting/audit/auditContants.ts b/client/packages/lowcoder/src/pages/setting/audit/auditContants.ts new file mode 100644 index 000000000..f0665ae42 --- /dev/null +++ b/client/packages/lowcoder/src/pages/setting/audit/auditContants.ts @@ -0,0 +1,108 @@ +import ReactECharts from 'echarts-for-react'; +import { styled } from 'styled-components'; +import { trans } from "i18n"; + +export const StyledReactECharts = styled(ReactECharts)` + width: 100%; + height: 400px; +`; + +type EventType = | "USER_LOGIN" +| "USER_LOGOUT" +| "APPLICATION_CREATE" +| "APPLICATION_DELETE" +| "APPLICATION_UPDATE" +| "APPLICATION_MOVE" +| "APPLICATION_RECYCLED" +| "APPLICATION_RESTORE" +| "APPLICATION_PUBLISH" +| "APPLICATION_VERSION_CHANGE" +| "APPLICATION_SHARING_CHANGE" +| "APPLICATION_PERMISSION_CHANGE" +| "FOLDER_CREATE" +| "FOLDER_DELETE" +| "FOLDER_UPDATE" +| "QUERY_EXECUTION" +| "GROUP_CREATE" +| "GROUP_UPDATE" +| "GROUP_DELETE" +| "GROUP_MEMBER_ADD" +| "GROUP_MEMBER_ROLE_UPDATE" +| "GROUP_MEMBER_LEAVE" +| "GROUP_MEMBER_REMOVE" +| "SERVER_START_UP" +| "SERVER_INFO" +| "DATA_SOURCE_CREATE" +| "DATA_SOURCE_UPDATE" +| "DATA_SOURCE_DELETE" +| "DATA_SOURCE_PERMISSION_GRANT" +| "DATA_SOURCE_PERMISSION_UPDATE" +| "DATA_SOURCE_PERMISSION_DELETE" +| "LIBRARY_QUERY_CREATE" +| "LIBRARY_QUERY_UPDATE" +| "LIBRARY_QUERY_DELETE" +| "LIBRARY_QUERY_PUBLISH" +| "API_CALL_EVENT"; + +export type AuditLog = { + eventType: EventType; + eventTime: string; + environmentId: string; + orgId: string; + userId: string; + appId: string; +}; + +export type AuditLogStat = { + eventType: EventType; + groupCountResult: number; +} + +export const eventTypes = [ + { value: "USER_LOGIN", label: trans("enterprise.USER_LOGIN"), color: "#1890ff" }, + { value: "USER_LOGOUT", label: trans("enterprise.USER_LOGOUT"), color: "#1d39c4" }, + { value: "APPLICATION_CREATE", label: trans("enterprise.APPLICATION_CREATE"), color: "#52c41a" }, + { value: "APPLICATION_DELETE", label: trans("enterprise.APPLICATION_DELETE"), color: "#389e0d" }, + { value: "APPLICATION_UPDATE", label: trans("enterprise.APPLICATION_UPDATE"), color: "#237804" }, + { value: "APPLICATION_MOVE", label: trans("enterprise.APPLICATION_MOVE"), color: "#135200" }, + { value: "APPLICATION_RECYCLED", label: trans("enterprise.APPLICATION_RECYCLED"), color: "#00474f" }, + { value: "APPLICATION_RESTORE", label: trans("enterprise.APPLICATION_RESTORE"), color: "#003a8c" }, + { value: "APPLICATION_PUBLISH", label: trans("enterprise.APPLICATION_PUBLISH"), color: "#002766" }, + { value: "APPLICATION_VERSION_CHANGE", label: trans("enterprise.APPLICATION_VERSION_CHANGE"), color: "#0050b3" }, + { value: "APPLICATION_SHARING_CHANGE", label: trans("enterprise.APPLICATION_SHARING_CHANGE"), color: "#1890ff" }, + { value: "APPLICATION_PERMISSION_CHANGE", label: trans("enterprise.APPLICATION_PERMISSION_CHANGE"), color: "#1d39c4" }, + { value: "FOLDER_CREATE", label: trans("enterprise.FOLDER_CREATE"), color: "#faad14" }, + { value: "FOLDER_DELETE", label: trans("enterprise.FOLDER_DELETE"), color: "#d48806" }, + { value: "FOLDER_UPDATE", label: trans("enterprise.FOLDER_UPDATE"), color: "#ad6800" }, + { value: "QUERY_EXECUTION", label: trans("enterprise.QUERY_EXECUTION"), color: "#722ed1" }, + { value: "GROUP_CREATE", label: trans("enterprise.GROUP_CREATE"), color: "#f5222d" }, + { value: "GROUP_UPDATE", label: trans("enterprise.GROUP_UPDATE"), color: "#cf1322" }, + { value: "GROUP_DELETE", label: trans("enterprise.GROUP_DELETE"), color: "#a8071a" }, + { value: "GROUP_MEMBER_ADD", label: trans("enterprise.GROUP_MEMBER_ADD"), color: "#820014" }, + { value: "GROUP_MEMBER_ROLE_UPDATE", label: trans("enterprise.GROUP_MEMBER_ROLE_UPDATE"), color: "#5c0011" }, + { value: "GROUP_MEMBER_LEAVE", label: trans("enterprise.GROUP_MEMBER_LEAVE"), color: "#8c8c8c" }, + { value: "GROUP_MEMBER_REMOVE", label: trans("enterprise.GROUP_MEMBER_REMOVE"), color: "#595959" }, + { value: "SERVER_START_UP", label: trans("enterprise.SERVER_START_UP"), color: "#8c8c8c" }, + { value: "SERVER_INFO", label: trans("enterprise.SERVER_INFO"), color: "#595959" }, + { value: "DATA_SOURCE_CREATE", label: trans("enterprise.DATA_SOURCE_CREATE"), color: "#f5222d" }, + { value: "DATA_SOURCE_UPDATE", label: trans("enterprise.DATA_SOURCE_UPDATE"), color: "#cf1322" }, + { value: "DATA_SOURCE_DELETE", label: trans("enterprise.DATA_SOURCE_DELETE"), color: "#a8071a" }, + { value: "DATA_SOURCE_PERMISSION_GRANT", label: trans("enterprise.DATA_SOURCE_PERMISSION_GRANT"), color: "#820014" }, + { value: "DATA_SOURCE_PERMISSION_UPDATE", label: trans("enterprise.DATA_SOURCE_PERMISSION_UPDATE"), color: "#5c0011" }, + { value: "DATA_SOURCE_PERMISSION_DELETE", label: trans("enterprise.DATA_SOURCE_PERMISSION_DELETE"), color: "#8c8c8c" }, + { value: "LIBRARY_QUERY_CREATE", label: trans("enterprise.LIBRARY_QUERY_CREATE"), color: "#722ed1" }, + { value: "LIBRARY_QUERY_UPDATE", label: trans("enterprise.LIBRARY_QUERY_UPDATE"), color: "#531dab" }, + { value: "LIBRARY_QUERY_DELETE", label: trans("enterprise.LIBRARY_QUERY_DELETE"), color: "#391085" }, + { value: "LIBRARY_QUERY_PUBLISH", label: trans("enterprise.LIBRARY_QUERY_PUBLISH"), color: "#22075e" }, + { value: "API_CALL_EVENT", label: trans("enterprise.API_CALL_EVENT"), color: "#8c8c8c" }, +]; + +// temporary geoLocation data +export const geoLocation = { + "location": { + "accuracy_radius": 500, + "latitude": 24.8591, + "longitude": 66.9983, + "time_zone": "Asia/Karachi" + } +} \ No newline at end of file diff --git a/client/packages/lowcoder/src/pages/setting/audit/charts/eventTypesTime.tsx b/client/packages/lowcoder/src/pages/setting/audit/charts/eventTypesTime.tsx new file mode 100644 index 000000000..5fa5e76ed --- /dev/null +++ b/client/packages/lowcoder/src/pages/setting/audit/charts/eventTypesTime.tsx @@ -0,0 +1,120 @@ +import React, { useRef } from "react"; +import ReactECharts from "echarts-for-react"; +import dayjs from "dayjs"; +import { debounce } from "lodash"; + +interface Props { + data: Array; + eventTypeLabels: any; + eventTypes: Array<{ value: string; color: string }>; + setDateRange: (range: { fromTimestamp: string; toTimestamp: string }) => void; +} + +const EventTypeTimeChart = ({ data, eventTypeLabels, eventTypes, setDateRange }: Props) => { + const chartRef = useRef(null); + + const debouncedSetDateRange = useRef( + debounce((fromTimestamp: string, toTimestamp: string) => { + setDateRange({ fromTimestamp, toTimestamp }); + }, 500) // Delays fetching only after zooming stops + ).current; + + // Extract min/max dates from the data + const allDates = data.map((log) => log.eventTime && dayjs(log.eventTime).format("YYYY-MM-DD")); + const minDate = allDates.length ? dayjs(Math.min(...allDates.map((d) => new Date(d).getTime()))) : dayjs().subtract(7, "days"); + const maxDate = allDates.length ? dayjs(Math.max(...allDates.map((d) => new Date(d).getTime()))) : dayjs(); + + // Generate full date range including missing days + const fullDateRange: string[] = []; + let currentDate = minDate; + while (currentDate.isBefore(maxDate) || currentDate.isSame(maxDate, "day")) { + fullDateRange.push(currentDate.format("YYYY-MM-DD")); + currentDate = currentDate.add(1, "day"); + } + + // Group data by date and eventType + const groupedData = data.reduce((acc: any, log: any) => { + const eventTime = log.eventTime ? new Date(log.eventTime) : null; + if (eventTime && !isNaN(eventTime.getTime())) { + const date = eventTime.toISOString().split("T")[0]; // Extract date part + if (!acc[date]) acc[date] = {}; + acc[date][log.eventType] = (acc[date][log.eventType] || 0) + 1; + } + return acc; + }, {}); + + // Get unique event types + const eventTypesSet = [...new Set(data.map((log: any) => log.eventType))]; + + const colorMap: { [key: string]: string } = Object.fromEntries( + eventTypes.map((et) => [et.value, et.color]) + ); + + // Prepare series data for each event type + const series = eventTypesSet.map((eventType) => ({ + name: eventTypeLabels[eventType] || eventType, + type: "bar", + stack: "total", + data: fullDateRange.map((date) => groupedData[date]?.[eventType] || 0), // Fill gaps with 0 + itemStyle: { + color: colorMap[eventType] || "#8c8c8c", // Use predefined color or fallback + }, + })); + + const handleChartEvents = (params: any) => { + if (params.start !== undefined && params.end !== undefined) { + const startIndex = Math.floor((params.start / 100) * (fullDateRange.length - 1)); + const endIndex = Math.floor((params.end / 100) * (fullDateRange.length - 1)); + + const fromDate = new Date(fullDateRange[startIndex] || fullDateRange[0]); // Keep start of day + const toDate = new Date(fullDateRange[endIndex] || fullDateRange[fullDateRange.length - 1]); + + toDate.setHours(23, 59, 59, 999); + + const fromTimestamp = fromDate.toISOString(); + const toTimestamp = toDate.toISOString(); + debouncedSetDateRange(fromTimestamp, toTimestamp); + } + }; + + return ( + + ); +}; + +export default EventTypeTimeChart; diff --git a/client/packages/lowcoder/src/pages/setting/audit/components/statistics.tsx b/client/packages/lowcoder/src/pages/setting/audit/components/statistics.tsx new file mode 100644 index 000000000..88ee07309 --- /dev/null +++ b/client/packages/lowcoder/src/pages/setting/audit/components/statistics.tsx @@ -0,0 +1,36 @@ +import Statistic from "antd/es/statistic"; +import { AuditLogStat } from "../auditContants"; +import Card from "antd/es/card"; +import styled from "styled-components"; +import { useMemo } from "react"; + +const StyledStatistics = styled(Statistic)` + .ant-statistic-title { + font-size: 12px; + } + .ant-statistic-content { + font-size: 20px; + } +`; + +const Statistics = ({ stats }: { stats: AuditLogStat[] }) => { + const width = useMemo(() => { + if (stats.length < 5) return `${100/stats.length}%`; + return '20%'; + }, [stats.length]); + + return ( + + {stats.map(stat => ( + + + + ))} + + ) +} + +export default Statistics; diff --git a/client/packages/lowcoder/src/pages/setting/audit/dashboard.tsx b/client/packages/lowcoder/src/pages/setting/audit/dashboard.tsx new file mode 100644 index 000000000..f4e972251 --- /dev/null +++ b/client/packages/lowcoder/src/pages/setting/audit/dashboard.tsx @@ -0,0 +1,485 @@ +import { Card, Form, Select, Input, Button, message, Divider, Skeleton, Table, Flex, Tag, TableProps } from "antd"; +import React, { useEffect, useState, useCallback, useMemo } from "react"; +import { useDispatch, useSelector } from "react-redux"; +import styled from "styled-components"; +import { trans } from "i18n"; +import { + DetailContainer, + DetailContent, + Header, + } from "../theme/styledComponents"; +import { HeaderBack } from "pages/setting/permission/styledComponents"; +import { getUser } from "@lowcoder-ee/redux/selectors/usersSelectors"; +import { getAuditLogs, getAuditLogStatistics, getEnvironmentsByIds, getMeta } from "api/enterpriseApi"; +import EventTypeTimeChart from "./charts/eventTypesTime"; +import { debounce, uniqBy } from "lodash"; +import { DatePicker } from "antd"; +import dayjs, { Dayjs } from "dayjs"; +import { Link, useLocation } from "react-router-dom"; +import history from "util/history"; +import { SETTING_URL } from "@lowcoder-ee/constants/routesURL"; +import { EyeOutlined } from "@ant-design/icons"; +import { AuditLog, AuditLogStat, eventTypes } from "./auditContants"; +import Statistics from "./components/statistics"; + +const { RangePicker } = DatePicker; + +const AuditContent = styled.div` + font-size: 14px; + color: #8b8fa3; + flex-grow: 1; + padding-top: 0px; + padding-left: 0px; + max-width: 100%; +`; + +const StyleThemeSettingsCover = styled.div` + display: flex; + flex-direction: row; + background: linear-gradient(34deg, rgba(2, 0, 36, 1) 0%, rgba(102, 9, 121, 1) 35%, rgba(0, 255, 181, 1) 100%); + padding: 15px; + height: 80px; + border-radius: 10px 10px 0 0; +`; + +export const getEventColor = (eventType: string): string => { + const matchedType = eventTypes.find((et) => et.value === eventType); + return matchedType ? matchedType.color : "#8c8c8c"; +}; + +export const getEventLabel = (eventType: string): string => { + const matchedType = eventTypes.find((et) => et.value === eventType); + return matchedType ? matchedType.label : "unknown"; +}; + +export function AuditLogDashboard() { + const currentUser = useSelector(getUser); + const location = useLocation(); + + const [allLogs, setAllLogs] = useState([]); + const [currentPageLogs, setCurrentPageLogs] = useState([]); + const [statistics, setStatistics] = useState([]); + const [dataMap, setDataMap] = useState>({}); + + const [total, setTotal] = useState(0); + const [loading, setLoading] = useState(false); + const [form] = Form.useForm(); + const [pagination, setPagination] = useState({ pageSize: 25, current: 1 }); + + // Function to get URL parameters + const getQueryParams = () => { + const params = new URLSearchParams(location.search); + let queryObject: Record = {}; + + // Convert search params into a JavaScript object + params.forEach((value, key) => { + if (key !== 'fromTimestamp' && key !== 'toTimestamp') { + queryObject[key] = value; + } + }); + + // set date range picker values + let dateRange = new Array(2); + if (params.get('fromTimestamp')) { + dateRange[0] = dayjs(params.get('fromTimestamp')); + } + if (params.get('toTimestamp')) { + dateRange[1] = dayjs(params.get('toTimestamp')); + } + + queryObject['dateRange'] = dateRange; + return queryObject; + }; + + useEffect(() => { + form.setFieldsValue(getQueryParams()); + }, []); + + const findUniqueDataIds = async () => { + if (!allLogs.length) { + return setDataMap({}); + } + + const uniqueOrgIds: string[] = uniqBy(allLogs, 'orgId').map(item => item.orgId); + const uniqueUserIds: string[] = uniqBy(allLogs, 'userId').map(item => item.userId); + const uniqueEnvIds: string[] = uniqBy(allLogs, 'environmentId').map(item => item.environmentId); + + const metaResponse = await getMeta({ + orgIds: uniqueOrgIds, + userIds: uniqueUserIds, + appIds: [], + groupIds: [], + bundleIds: [], + datasourceIds: [], + folderIds: [], + libraryQueryIds: [] + }); + + const envResponse = await getEnvironmentsByIds(uniqueEnvIds); + + const tempDataMap: Record = {}; + metaResponse.data?.orgs?.forEach((org: { id: string; name: string; }) => { + tempDataMap[org.id] = org.name; + }); + metaResponse.data?.users?.forEach((user: { id: string; name: string; }) => { + tempDataMap[user.id] = user.name; + }); + envResponse.data?.forEach((env: { environmentId: string; environmentType: string; }) => { + tempDataMap[env.environmentId] = env.environmentType; + }); + setDataMap(tempDataMap); + } + + useEffect(() => { + findUniqueDataIds(); + }, [allLogs]); + + const getCleanedParams = (newPage?: number) => { + const formValues = form.getFieldsValue(); + + let cleanedParams = Object.fromEntries( + Object.entries({ + ...formValues, + fromTimestamp: formValues.dateRange?.[0] ? formValues.dateRange[0].toISOString() : undefined, + toTimestamp: formValues.dateRange?.[1] ? formValues.dateRange[1].toISOString() : undefined, + }).filter(([key, value]) => value !== undefined && value !== null && value !== "" && key !== 'dateRange') + ); + if (newPage) { + cleanedParams = { + ...cleanedParams, + pageSize: 100, // Always fetch 500 from API + pageNum: newPage, // API page number + } + } + + return cleanedParams; + } + + const handleQueryParams = (queryParams: Record) => { + const params = new URLSearchParams(); + Object.keys(queryParams).map((key) => { + const value = queryParams[key]; + if (value) { + params.set(key, value); + } else { + params.delete(key); // Remove the key if the value is empty + } + }) + history.push({ search: params.toString() }) + } + + const fetchStatistics = async () => { + const cleanedParams = getCleanedParams(); + + const stats = await getAuditLogStatistics(cleanedParams); + setStatistics(stats?.data || []); + } + + // Fetch Logs with all form values if set + const fetchLogs = async (newPage: number, resetData: boolean = false) => { + const cleanedParams = getCleanedParams(newPage); + + handleQueryParams(cleanedParams as any); + + setLoading(true); + try { + const data = await getAuditLogs(cleanedParams); + // fetch statistics only when page is 1 + if (newPage === 1) { + fetchStatistics(); + } + + if (resetData) { + setAllLogs(data.data || []); + setPagination({ pageSize: 25, current: 1 }); // Reset pagination + } else { + setAllLogs((prevLogs) => [...prevLogs, ...(data?.data || [])]); + } + + setTotal(data.totalCount); + } catch (error) { + message.error("Failed to fetch audit logs."); + } finally { + setLoading(false); + } + }; + + // Handle chart zoom + const handleChartZoom = ({ fromTimestamp, toTimestamp }: { fromTimestamp: string; toTimestamp: string }) => { + console.log("Zoom applied:", fromTimestamp, toTimestamp); + + const startDate = dayjs(fromTimestamp); + const endDate = dayjs(toTimestamp); + form.setFieldsValue({ dateRange: [startDate, endDate] }); + + setPagination({ pageSize: 25, current: 1 }); + setAllLogs([]); + setCurrentPageLogs([]); + fetchLogs(1, true); + }; + + // Debounce handler for input fields + const handleInputChange = useCallback( + debounce(() => { + setPagination({ pageSize: 25, current: 1 }); + setAllLogs([]); + setCurrentPageLogs([]); + fetchLogs(1, true); + }, 300), + [] + ); + + const handleClickFilter = (field: any, value: any) => { + form.setFieldsValue({ [field]: value }); + + setPagination({ pageSize: 25, current: 1 }); + setAllLogs([]); + setCurrentPageLogs([]); + fetchLogs(1, true); + }; + + const handleDateChange = (dates: any) => { + if (dates?.[0] && dates?.[1]) { + form.setFieldsValue({ + fromTimestamp: dates[0].toISOString(), + toTimestamp: dates[1].toISOString(), + }); + } else { + form.resetFields(["fromTimestamp", "toTimestamp"]); + } + + // Reset pagination and clear logs BEFORE calling fetchLogs + setPagination({ pageSize: 25, current: 1 }); + setAllLogs([]); + setCurrentPageLogs([]); + + // Ensure fetchLogs is called only ONCE + fetchLogs(1, true); + }; + + // Handle page change + const handleTableChange: TableProps["onChange"] = (newPagination) => { + const newPage = newPagination.current ?? 1; + const pageSize = newPagination.pageSize ?? 25; + const startIndex = (newPage - 1) * pageSize; + const endIndex = startIndex + pageSize; + + console.log( + `New Page: ${newPage}, StartIndex: ${startIndex}, EndIndex: ${endIndex}, AllLogs Length: ${allLogs.length}, Total: ${total}` + ); + + if (endIndex <= allLogs.length) { + // ✅ Correctly slice logs and update state + setCurrentPageLogs(allLogs.slice(startIndex, endIndex)); + } else if (allLogs.length < total) { + // ✅ Fetch next set of logs and update state after fetch + const nextApiPage = Math.floor(allLogs.length / 100) + 1; + fetchLogs(nextApiPage).then(() => { + setCurrentPageLogs(allLogs.slice(startIndex, endIndex)); + }); + } + + setPagination({ pageSize, current: newPage }); + }; + + useEffect(() => { + if (allLogs.length > 0) { + const startIndex = (pagination.current - 1) * pagination.pageSize; + const endIndex = startIndex + pagination.pageSize; + + console.log(`Updating displayed logs: StartIndex ${startIndex}, EndIndex ${endIndex}`); + setCurrentPageLogs(allLogs.slice(startIndex, endIndex)); + } + }, [pagination, allLogs]); + + + // Initial Fetch on Mount + useEffect(() => { + fetchLogs(1); + }, [currentUser.currentOrgId]); + + const columns = [ + { + title: "", + dataIndex: "eventDetail", + key: "eventDetail", + render: (_: string, record: any) => ( + + + + ), + }, + { + title: "Event Type", + dataIndex: "eventType", + key: "eventType", + render: (text: string) => text ? {getEventLabel(text)} : null, + }, + { + title: "Event Time", + dataIndex: "eventTime", + key: "eventTime", + render: (text: string) => { + if (!text) return null; + const date = new Date(text); + return new Intl.DateTimeFormat(navigator.language, { + year: "numeric", + month: "long", + day: "numeric", + hour: "2-digit", + minute: "2-digit", + second: "2-digit", + timeZoneName: "short", + }).format(date); + }, + }, + { + title: "Environment ID", + dataIndex: "environmentId", + key: "environmentId", + render: (text: string) => ( + handleClickFilter("environmentId", text)}>{dataMap[text] ?? text} + ), + }, + { + title: "Org ID", + dataIndex: "orgId", + key: "orgId", + render: (text: string) => ( + handleClickFilter("orgId", text)}>{dataMap[text] ?? text} + ), + }, + { + title: "User ID", + dataIndex: "userId", + key: "userId", + render: (text: string) => ( + handleClickFilter("userId", text)}>{dataMap[text] ?? text} + ), + }, + { + title: "App ID", + dataIndex: "appId", + key: "appId", + render: (text: string, record: any) => ( + handleClickFilter("appId", text)}> + { + record.details?.applicationName + || record.details?.applicationId + || '-' + } + + ), + } + ]; + + const eventTypeLabels = Object.fromEntries(eventTypes.map((et) => [et.value, et.label])); + + return ( + +
+ + {trans("enterprise.AuditLogTitle")} + +
+ + + + +

{trans("enterprise.AuditLogOverview")}

+
+ +
{ + const key = Object.keys(changedValue)[0]; + if (key === "dateRange") { + handleDateChange(changedValue.dateRange); + } else if (["environmentId", "orgId", "userId", "appId"].includes(key)) { + handleInputChange(); // Debounced input change + } else { + // Avoid calling fetchLogs if `handleDateChange` already did + fetchLogs(1, true); + } + }} + > + + + + + + + + + + + + + + + + + + + + +
+ {Boolean(statistics.length) && !loading && ( + + )} + + {loading ? ( + + ) : currentPageLogs.length > 0 ? ( + <> + + +
+
+ + + ) : ( +

No logs found. Adjust the filters and try again.

+ )} + + + + + ); +} \ No newline at end of file diff --git a/client/packages/lowcoder/src/pages/setting/audit/detail.tsx b/client/packages/lowcoder/src/pages/setting/audit/detail.tsx new file mode 100644 index 000000000..d06880316 --- /dev/null +++ b/client/packages/lowcoder/src/pages/setting/audit/detail.tsx @@ -0,0 +1,320 @@ +import { useParams } from "react-router-dom"; +import { DetailContainer, DetailContent, Header } from "../theme/styledComponents"; +import { HeaderBack } from "../permission/styledComponents"; +import { trans } from "i18n"; +import Card from "antd/es/card"; +import { styled } from "styled-components"; +import Descriptions from "antd/es/descriptions"; +import { AppleOutlined, AppstoreAddOutlined, AppstoreOutlined, ChromeOutlined, DesktopOutlined, EnvironmentOutlined, FileSearchOutlined, InfoCircleOutlined, TeamOutlined, UserOutlined } from "@ant-design/icons"; +import { Map, Marker } from "pigeon-maps" +import Tree from "antd/es/tree"; +import Empty from "antd/es/empty"; +import { ReactNode, useEffect, useMemo, useState } from "react"; +import { getAuditLogs, getEnvironmentsByIds, getMeta } from "@lowcoder-ee/api/enterpriseApi"; +import { isEmpty } from "lodash"; +import { getEventColor, getEventLabel } from "./dashboard"; +import Tag from "antd/es/tag"; + +const StyleThemeSettingsCover = styled.div` + display: flex; + flex-direction: row; + background: linear-gradient(34deg, rgba(2, 0, 36, 1) 0%, rgba(102, 9, 121, 1) 35%, rgba(0, 255, 181, 1) 100%); + padding: 15px; + height: 80px; + border-radius: 10px 10px 0 0; +`; + +const StyledTree = styled(Tree)` + &.ant-tree { + margin-top: 24px; + } + + .ant-tree-treenode { + margin-bottom: 12px; + } + + .ant-tree-node-content-wrapper { + padding: 8px; + } + + .ant-tree-switcher { + padding-top: 8px; + &::before { + top: 8px; + } + } + + .ant-tree-switcher_open::after { + content: ""; + width: 1px; + height: 100%; + position: absolute; + left: 46%; + top: 26px; + background: #d9d9d9; + } + + .ant-descriptions-header { + margin-bottom: 8px; + } + + .ant-tree-indent-unit { + width: 0; + } +`; + +const getResourceName = (eventType: string) => { + if (eventType.startsWith("USER_")) return "User"; + if (eventType.startsWith("APPLICATION_")) return "Application"; + if (eventType.startsWith("FOLDER_")) return "Folder"; + if (eventType.startsWith("QUERY_") || eventType.startsWith("LIBRARY_QUERY_")) return "Query"; + if (eventType.startsWith("GROUP_")) return "Group"; + if (eventType.startsWith("SERVER_")) return "Server"; + if (eventType.startsWith("DATA_SOURCE")) return "Data Source"; + if (eventType.startsWith("API_")) return "API"; + + return undefined; +} + +const getResourceData = (eventType: string, eventDetail: any) => { + if (eventType.startsWith("APPLICATION_")) + return { ID: eventDetail.applicationId, Name: eventDetail.applicationName}; + + return { + ID: eventDetail.id, Name: eventDetail.name, + } +} + +const EventTreeNode = (props: { + icon: ReactNode, + title: string, + data: Record +}) => { + return ( + {props.icon} {props.title}} + > + {Object.keys(props.data).map(dataKey => ( + {props.data[dataKey] || '-'} + ))} + + ) +} +export function AuditLogDetail() { + const { eventId } = useParams<{eventId: string}>(); + const [ event, setEvent ] = useState({}); + const [ meta, setMeta ] = useState({}); + const [ environment, setEnvironment ] = useState({}); + + const fetchEventData = async () => { + const response = await getAuditLogs({ eventId }); + setEvent(response?.data?.[0]); + } + + const fetchEventMeta = async () => { + if (isEmpty(event)) return; + + const response = await getMeta({ + orgIds: [event.orgId], + userIds: [event.userId], + appIds: [], + groupIds: [], + bundleIds: [], + datasourceIds: [], + folderIds: [], + libraryQueryIds: [] + }); + setMeta(response.data); + } + + const fetchEnvironmentData = async () => { + if (isEmpty(event)) return; + + const response = await getEnvironmentsByIds([event.environmentId]); + setEnvironment(response.data?.[0] || {}); + } + + useEffect(() => { + fetchEventData(); + }, [eventId]); + + useEffect(() => { + fetchEventMeta(); + fetchEnvironmentData(); + }, [JSON.stringify(event)]); + + const eventHierarchy = useMemo(() => { + if (isEmpty(event)) return []; + + const date = new Date(event.eventTime); + const eventTime = new Intl.DateTimeFormat(navigator.language, { + year: "numeric", + month: "long", + day: "numeric", + hour: "2-digit", + minute: "2-digit", + second: "2-digit", + timeZoneName: "short", + }).format(date); + + const resourceName = getResourceName(event.eventType); + const eventNode = { + title: ( + } + title="Event" + data={{ + Type: {getEventLabel(event?.eventType)}, + Time: eventTime, + }} + /> + ), + key: "0-0-0-0-0", + } + + let eventData = []; + if (Boolean(resourceName)) { + if (resourceName !== "User") { + const resource = { + title: ( + } + title={resourceName as string} + data={getResourceData(event.eventType as string, event.details) || {}} + /> + ), + key: "0-0-0-0", + children: [] as any[], + }; + resource.children.push(eventNode) + eventData.push(resource); + } else { + eventData.push(eventNode) + } + } + + return [ + { + title: ( + } + title="Environment" + data={{ + ID: event?.environmentId, + Name: environment?.environmentType || '-' + }} + /> + ), + key: "0", + children: [ + { + title: ( + } + title="Workspace" + data={{ + ID: event?.orgId, + Name: meta?.orgs?.[0]?.name || '-', + }} + /> + ), + key: "0-0", + children: [ + { + title: ( + } + title="User" + data={{ + ID: event?.userId, + Name: meta?.users?.[0]?.name || '-', + }} + /> + ), + key: "0-0-0", + children: eventData, + }, + ], + }, + ], + }, + ]; + }, [event, meta, environment]); + + if (!Boolean(event)) { + return ( + +
+ + {"Audit Log Detail"} + +
+ + + +
+ ) + } + + return ( + +
+ + {"Audit Log Detail"} + +
+ + + {/* Geolocation */} + +

Geo Location

+
+ + + + + + + {/* Browser/System Meta data */} + +

Browser / System Metadata

+
+ + + Browser}>{event?.agentName} + OS}>{event?.operatingSystemName} ({event?.operatingSystemVersion}) + Device}>{event?.deviceName} + Device Type}>{event?.deviceClass} + Engine}>{event?.layoutEngineName} (Version: {event?.layoutEngineVersion}) + Webview}>{event?.webviewAppName} + + + + {/* Event Detail */} + +

Event Detail

+
+ + {Boolean(eventHierarchy.length) && ( + + )} + +
+
+ ) +} \ No newline at end of file diff --git a/client/packages/lowcoder/src/pages/setting/audit/index.tsx b/client/packages/lowcoder/src/pages/setting/audit/index.tsx index c74374625..caeb977a6 100644 --- a/client/packages/lowcoder/src/pages/setting/audit/index.tsx +++ b/client/packages/lowcoder/src/pages/setting/audit/index.tsx @@ -1,3 +1,13 @@ -export default function Audit() { - return null; -} +import { AUDIT_LOG_DASHBOARD, AUDIT_LOG_DETAIL } from "@lowcoder-ee/constants/routesURL"; +import { Route, Switch } from "react-router-dom"; +import { AuditLogDashboard } from "./dashboard"; +import { AuditLogDetail } from "./detail"; + +export const AuditLog = () => { + return ( + + + + + ); +}; diff --git a/client/packages/lowcoder/src/pages/setting/branding/BrandingSetting.tsx b/client/packages/lowcoder/src/pages/setting/branding/BrandingSetting.tsx index 1a687e90e..6f66ec93a 100644 --- a/client/packages/lowcoder/src/pages/setting/branding/BrandingSetting.tsx +++ b/client/packages/lowcoder/src/pages/setting/branding/BrandingSetting.tsx @@ -1,3 +1,761 @@ -import React from "react"; +import { HelpText } from "components/HelpText"; +import { Upload, Switch, Card, Input, message, Divider } from "antd"; +import { TacoButton, CustomSelect, messageInstance, Dropdown, ResetIcon } from "lowcoder-design"; +import React, { useEffect, useMemo, useState } from "react"; +import { useSelector } from "react-redux"; +import styled from "styled-components"; +import { trans } from "i18n"; +import { default as ColorPicker } from "antd/es/color-picker"; +import { + DetailContainer, + DetailContent, + Header, + } from "../theme/styledComponents"; +import { HeaderBack } from "pages/setting/permission/styledComponents"; +import { LoadingOutlined, PlusOutlined } from '@ant-design/icons'; +import type { UploadChangeParam, RcFile } from "antd/es/upload"; +import MaterialApi, { MaterialUploadTypeEnum } from "@lowcoder-ee/api/materialApi"; +import { validateResponse } from "@lowcoder-ee/api/apiUtils"; +import { buildMaterialPreviewURL } from "@lowcoder-ee/util/materialUtils"; +import { getUser } from "@lowcoder-ee/redux/selectors/usersSelectors"; +import { Org } from "@lowcoder-ee/constants/orgConstants"; +import { BrandingConfig, BrandingSettings, createBranding, getBranding } from "@lowcoder-ee/api/enterpriseApi"; +import Flex from "antd/es/flex"; +import Button from "antd/es/button"; -export const BrandingSetting = () => null; +const { TextArea } = Input; + +enum SettingsEnum { + LOGO = "logo", + SQUARE_LOGO = "squareLogo", + ERROR_PAGE_IMAGE = "errorPageImage", + LOGOUT_PAGE_IMAGE = "loggedOutPageImage", + SIGNUP_PAGE_IMAGE = "signUpPageImage", + MAIN_BRANDING_COLOR = "mainBrandingColor", + APP_HEADER_COLOR = "appHeaderColor", + ADMIN_SIDEBAR_COLOR = "adminSidebarColor", + ADMIN_SIDEBAR_FONT_COLOR = "adminSidebarFontColor", + ADMIN_SIDEBAR_ACTIVE_BG_COLOR = "adminSidebarActiveBgColor", + ADMIN_SIDEBAR_ACTIVE_FONT_COLOR = "adminSidebarActiveFontColor", + EDITOR_SIDEBAR_COLOR = "editorSidebarColor", + EDITOR_SIDEBAR_FONT_COLOR = "editorSidebarFontColor", + EDITOR_SIDEBAR_ACTIVE_BG_COLOR = "editorSidebarActiveBgColor", + EDITOR_SIDEBAR_ACTIVE_FONT_COLOR = "editorSidebarActiveFontColor", + FONT = "font", + ERROR_PAGE_TEXT = "errorPageText", + SIGNUP_PAGE_TEXT = "signUpPageText", + LOGGED_OUT_PAGE_TEXT = "loggedOutPageText", + STANDARD_DESCRIPTION = "standardDescription", + STANDARD_TITLE = "standardTitle", + SHOW_DOCUMENTATION = "showDocumentation", + DOCUMENTATION_LINK = "documentationLink", + SUBMIT_ISSUE = "submitIssue", + WHATS_NEW = "whatsNew", + WHATS_NEW_LINK = "whatsNewLink", +} + +const defaultSettings = { + logo: null, + squareLogo: null, + mainBrandingColor: "#B480DE", + appHeaderColor: "#2c2c2c", + adminSidebarColor: "#f7f9fc", + adminSidebarFontColor: "#000000e0", + adminSidebarActiveBgColor: "#ebf0f7", + adminSidebarActiveFontColor: "#4965f2", + editorSidebarColor: "#393b47", + editorSidebarFontColor: "#ffffffa6", + editorSidebarActiveBgColor: "#8b8fa37f", + editorSidebarActiveFontColor: "#ffffff", + font: "Roboto", + errorPageText: "Oops! Something went wrong.", + errorPageImage: null, + signUpPageText: "Join us today to explore new opportunities!", + signUpPageImage: null, + loggedOutPageText: "You have been logged out successfully.", + loggedOutPageImage: null, + standardDescription: "This is a sample description for SEO.", + standardTitle: "Welcome to Our Application", + showDocumentation: true, + documentationLink: null, + submitIssue: true, + whatsNew: false, + whatsNewLink : null, +}; + +// type FileType = Parameters[0] | undefined; + +const BrandingSettingContent = styled.div` + font-size: 14px; + color: #8b8fa3; + flex-grow: 1; + padding-top: 0px; + padding-left: 0px; + max-width: 100%; +`; + +const StyleThemeSettingsCover = styled.div` + display: flex; + flex-direction: row; + background: linear-gradient(34deg, rgba(2, 0, 36, 1) 0%, rgba(102, 9, 121, 1) 35%, rgba(0, 255, 181, 1) 100%); + padding: 15px; + height: 80px; + border-radius: 10px 10px 0 0; +`; + +const StyledRectUploadContainer = styled.div` + .avatar-uploader { + width: 240px; + height: 100px; + display: flex; + justify-content: center; + align-items: center; + border: 1px dashed #d9d9d9; + border-radius: 8px; + overflow: hidden; + } + + img { + width: 240px; + height: 100px; + object-fit: cover; + border-radius: 8px; + } +`; + +const StyledSquareUploadContainer = styled.div` + .avatar-uploader { + width: 100px; + height: 100px; + display: flex; + justify-content: center; + align-items: center; + border: 1px dashed #d9d9d9; + border-radius: 8px; + overflow: hidden; + } + + img { + width: 100px; + height: 100px; + object-fit: cover; + border-radius: 8px; + } +`; + +const getBase64 = (file: File): Promise => { + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.readAsBinaryString(file); // Read file as base64 + + reader.onload = () => resolve(reader.result as string); + reader.onerror = error => reject(error); + }); +}; + +const beforeUpload = (file: RcFile) => { + const isJpgOrPng = file.type === "image/jpeg" || file.type === "image/png" || file.type === "image/svg+xml"; + if (!isJpgOrPng) { + message.error("You can only upload JPG/PNG/SVG files!"); + return Upload.LIST_IGNORE; + } + const isLt2M = file.size / 1024 / 1024 < 2; + if (!isLt2M) { + message.error("Image must be smaller than 2MB!"); + return Upload.LIST_IGNORE; + } + return true; +}; + +export function BrandingSetting() { + const [configOrgId, setConfigOrgId] = useState(''); + const [settings, setSettings] = useState(defaultSettings); + const [brandingConfig, setBrandingConfig] = useState(); + const [defaultBrandingConfig, setDefaultBrandingConfig] = useState(); + const [loading, setLoading] = useState({ + [SettingsEnum.LOGO]: false, + [SettingsEnum.SQUARE_LOGO]: false, + [SettingsEnum.ERROR_PAGE_IMAGE]: false, + [SettingsEnum.LOGOUT_PAGE_IMAGE]: false, + [SettingsEnum.SIGNUP_PAGE_IMAGE]: false, + }); + const currentUser = useSelector(getUser); + + const orgsList = useMemo(() => { + const list: Array<{label: string, value: string}> = [{ + label: 'Global', + value: '', + }]; + currentUser?.orgs?.forEach((org: Org) => { + list.push({ + value: org.id, + label: org.name, + }); + }); + return list; + }, [currentUser]); + + useEffect(() => { + const fetchBrandingDetails = async() => { + try { + const branding = await getBranding(configOrgId); + setBrandingConfig(branding); + setDefaultBrandingConfig(branding); + } catch(e) { + setBrandingConfig(undefined); + setDefaultBrandingConfig(undefined); + } + } + + fetchBrandingDetails(); + }, [configOrgId]); + + const isBrandingNotChange = () => { + return ( + JSON.stringify({ ...brandingConfig }) === + JSON.stringify({ ...defaultBrandingConfig }) + ); + } + + const updateSettings = (key: keyof BrandingSettings, value: any) => { + setBrandingConfig((branding) => ({ + ...branding, + config_set: { + ...branding?.config_set, + [key]: value + } + })); + }; + + const handleUpload = async (options: any, imageType: keyof BrandingSettings) => { + const { onSuccess, onError, file } = options; + + try { + setLoading((loading) => ({ + ...loading, + [imageType]: true, + })) + const base64File = await getBase64(file); + const resp = await MaterialApi.upload( + file.name, + MaterialUploadTypeEnum.COMMON, + btoa(base64File), + ); + if (validateResponse(resp)) { + onSuccess(trans("success")); + updateSettings(imageType, resp.data.data.id); + return; + } + throw new Error("Something went wrong"); + } catch (error: any) { + onError(error); + messageInstance.error(trans("home.fileUploadError")); + } finally { + setLoading((loading) => ({ + ...loading, + [imageType]: false, + })) + } + } + + const handleSave = async () => { + try { + await createBranding({ + ...brandingConfig, + org_id: configOrgId, + }); + setDefaultBrandingConfig(brandingConfig); + messageInstance.success(trans("theme.saveSuccessMsg")); + } catch (e) { + console.error(e) + } + } + + const uploadButton = (loading: boolean) => ( +
+ {loading ? : } +
Upload
+
+ ); + + return ( + +
+ + {trans("branding.title")} + +
+ + + {/* Branding Settings Selection */} + + +

{trans("branding.general")}

+
+ +
+

{trans("branding.selectWorkspace")}

+ { + setConfigOrgId(value); + }} + value={configOrgId} + /> +
+ +
+

{trans("branding.brandingName")}

+ { + setBrandingConfig((branding) => ({ + ...(branding || {}), + config_name: e.target.value + })) + }} + style={{ marginBottom: 12 }} + /> + {/* {trans("branding.documentationLinkHelp")} */} +
+ +
+

{trans("branding.brandingDescription")}

+ { + setBrandingConfig((branding) => ({ + ...(branding || {}), + config_description: e.target.value + })) + }} + style={{ marginBottom: 12 }} + /> + {/* {trans("branding.documentationLinkHelp")} */} +
+
+
+ + {/* General Logos */} + + +

{trans("branding.logoSection")}

+
+ +
+

{trans("branding.logo")}

+ {!Boolean(configOrgId) ? ( + <> + updateSettings(SettingsEnum.LOGO, e.target.value)} + style={{ marginBottom: 12 }} + /> + {trans("branding.logoUrlHelp")} + + ) : ( + + handleUpload(options, SettingsEnum.LOGO)} + > + {Boolean(brandingConfig?.config_set?.[SettingsEnum.LOGO]) + ? logo + : uploadButton(loading[SettingsEnum.LOGO]) + } + + {trans("branding.logoHelp")} + + )} +
+ +
+

{trans("branding.squareLogo")}

+ {!Boolean(configOrgId) ? ( + <> + updateSettings(SettingsEnum.SQUARE_LOGO, e.target.value)} + style={{ marginBottom: 12 }} + /> + {trans("branding.squareLogoUrlHelp")} + + ) : ( + + handleUpload(options, SettingsEnum.SQUARE_LOGO)} + > + {Boolean(brandingConfig?.config_set?.[SettingsEnum.SQUARE_LOGO]) + ? square_logo + : uploadButton(loading[SettingsEnum.SQUARE_LOGO]) + } + + {trans("branding.squareLogoHelp")} + + )} +
+
+
+ + {/* Colors and Fonts */} + + +

{trans("branding.colorFontSection")}

+
+ +
+

{trans("branding.mainBrandingColor")}

+ node.parentNode} + value={brandingConfig?.config_set?.mainBrandingColor} + showText + allowClear + format="hex" + onChange={(_, hex) => updateSettings(SettingsEnum.MAIN_BRANDING_COLOR, hex)} + /> + {trans("branding.mainBrandingColorHelp")} +
+ +
+

{trans("branding.editorHeaderColor")}

+ node.parentNode} + value={brandingConfig?.config_set?.appHeaderColor} + showText + allowClear + format="hex" + onChange={(_, hex) => updateSettings(SettingsEnum.APP_HEADER_COLOR, hex)} + /> + {trans("branding.editorHeaderColorHelp")} +
+ +
+

{trans("branding.adminSidebarColor")}

+ node.parentNode} + value={brandingConfig?.config_set?.adminSidebarColor} + showText + allowClear + format="hex" + onChange={(_, hex) => updateSettings(SettingsEnum.ADMIN_SIDEBAR_COLOR, hex)} + /> + {trans("branding.adminSidebarColorHelp")} +
+ +
+

{trans("branding.adminSidebarFontColor")}

+ node.parentNode} + value={brandingConfig?.config_set?.adminSidebarFontColor} + showText + allowClear + format="hex" + onChange={(_, hex) => updateSettings(SettingsEnum.ADMIN_SIDEBAR_FONT_COLOR, hex)} + /> + {trans("branding.adminSidebarFontColorHelp")} +
+ +
+

{trans("branding.adminSidebarActiveBgColor")}

+ node.parentNode} + value={brandingConfig?.config_set?.adminSidebarActiveBgColor} + showText + allowClear + format="hex" + onChange={(_, hex) => updateSettings(SettingsEnum.ADMIN_SIDEBAR_ACTIVE_BG_COLOR, hex)} + /> + {trans("branding.adminSidebarActiveBgColorHelp")} +
+ +
+

{trans("branding.adminSidebarActiveFontColor")}

+ node.parentNode} + value={brandingConfig?.config_set?.adminSidebarActiveFontColor} + showText + allowClear + format="hex" + onChange={(_, hex) => updateSettings(SettingsEnum.ADMIN_SIDEBAR_ACTIVE_FONT_COLOR, hex)} + /> + {trans("branding.adminSidebarActiveFontColorHelp")} +
+ +
+

{trans("branding.editorSidebarColor")}

+ node.parentNode} + value={brandingConfig?.config_set?.editorSidebarColor} + showText + allowClear + format="hex" + onChange={(_, hex) => updateSettings(SettingsEnum.EDITOR_SIDEBAR_COLOR, hex)} + /> + {trans("branding.editorSidebarColorHelp")} +
+ +
+

{trans("branding.editorSidebarFontColor")}

+ node.parentNode} + value={brandingConfig?.config_set?.editorSidebarFontColor} + showText + allowClear + format="hex" + onChange={(_, hex) => updateSettings(SettingsEnum.EDITOR_SIDEBAR_FONT_COLOR, hex)} + /> + {trans("branding.editorSidebarFontColorHelp")} +
+ +
+

{trans("branding.editorSidebarActiveBgColor")}

+ node.parentNode} + value={brandingConfig?.config_set?.editorSidebarActiveBgColor} + showText + allowClear + format="hex" + onChange={(_, hex) => updateSettings(SettingsEnum.EDITOR_SIDEBAR_ACTIVE_BG_COLOR, hex)} + /> + {trans("branding.editorSidebarActiveBgColorHelp")} +
+ +
+

{trans("branding.editorSidebarActiveFontColor")}

+ node.parentNode} + value={brandingConfig?.config_set?.editorSidebarActiveFontColor} + showText + allowClear + format="hex" + onChange={(_, hex) => updateSettings(SettingsEnum.EDITOR_SIDEBAR_ACTIVE_FONT_COLOR, hex)} + /> + {trans("branding.editorSidebarActiveFontColorHelp")} +
+ +
+

{trans("branding.font")}

+ updateSettings(SettingsEnum.FONT, font)} + /> + {trans("branding.fontHelp")} +
+
+
+ + {/* Texts and Images for Standard Pages */} + + +

{trans("branding.textSection")}

+
+ +
+

{trans("branding.errorPage")}

+