diff --git a/client/VERSION b/client/VERSION index c043eea77..38f8e886e 100644 --- a/client/VERSION +++ b/client/VERSION @@ -1 +1 @@ -2.2.1 +dev diff --git a/client/packages/lowcoder-core/lib/index.js b/client/packages/lowcoder-core/lib/index.js index 714d11ff7..89a3c783b 100644 --- a/client/packages/lowcoder-core/lib/index.js +++ b/client/packages/lowcoder-core/lib/index.js @@ -1,118 +1,118 @@ import _ from 'lodash'; import { serialize, compile, middleware, prefixer, stringify } from 'stylis'; -/****************************************************************************** -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. -***************************************************************************** */ -/* global Reflect, Promise, SuppressedError, Symbol */ - -var extendStatics = function(d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); -}; - -function __extends(d, b) { - if (typeof b !== "function" && b !== null) - throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -} - -var __assign = function() { - __assign = Object.assign || function __assign(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); -}; - -function __rest(s, e) { - var t = {}; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) - t[p] = s[p]; - if (s != null && typeof Object.getOwnPropertySymbols === "function") - for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { - if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) - t[p[i]] = s[p[i]]; - } - return t; -} - -function __decorate(decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -} - -function __awaiter(thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -} - -function __generator(thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (g && (g = 0, op[0] && (_ = 0)), _) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -} - -function __spreadArray(to, from, pack) { - if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { - if (ar || !(i in from)) { - if (!ar) ar = Array.prototype.slice.call(from, 0, i); - ar[i] = from[i]; - } - } - return to.concat(ar || Array.prototype.slice.call(from)); -} - -typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) { - var e = new Error(message); - return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e; +/****************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ +/* global Reflect, Promise, SuppressedError, Symbol */ + +var extendStatics = function(d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); +}; + +function __extends(d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +} + +var __assign = function() { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; + +function __rest(s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +} + +function __decorate(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +} + +function __awaiter(thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +} + +function __generator(thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (g && (g = 0, op[0] && (_ = 0)), _) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +} + +function __spreadArray(to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +} + +typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) { + var e = new Error(message); + return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e; }; function isEqualArgs(args, cacheArgs, equals) { @@ -11400,7 +11400,7 @@ var IntlMessageFormat$1 = /** @class */ (function () { this.ast = message; } if (!Array.isArray(this.ast)) { - throw new TypeError('A message must be provided as a String or AST.'); + throw new TypeError('A message must be provided as a String or AST. ' + this.ast); } // Creates a new object with the specified `formats` merged with the default // formats. diff --git a/client/packages/lowcoder-design/src/components/CustomModal.tsx b/client/packages/lowcoder-design/src/components/CustomModal.tsx index ef9d97000..9b13d8b43 100644 --- a/client/packages/lowcoder-design/src/components/CustomModal.tsx +++ b/client/packages/lowcoder-design/src/components/CustomModal.tsx @@ -227,7 +227,7 @@ function CustomModalRender(props: CustomModalProps & ModalFuncProps) { /> -
{props.children}
+
{props.children}
{props.footer === null || props.footer ? ( props.footer @@ -280,13 +280,15 @@ CustomModal.confirm = (props: { ...DEFAULT_PROPS, okText: trans("ok"), cancelText: trans("cancel"), - bodyStyle: { - fontSize: "14px", - color: "#333333", - lineHeight: "22px", - minHeight: "72px", - marginTop: "24px", - }, + styles: { + body: { + fontSize: "14px", + color: "#333333", + lineHeight: "22px", + minHeight: "72px", + marginTop: "24px", + } + } }; // create model const model = modalInstance.confirm({ @@ -321,7 +323,12 @@ CustomModal.confirm = (props: { title={title} okButtonType={props.confirmBtnType} okText={props.okText} - bodyStyle={{ ...defaultConfirmProps.bodyStyle, ...props.bodyStyle }} + styles={{ + body: { + ...defaultConfirmProps.styles?.body, + ...props.bodyStyle, + } + }} footer={props.footer} width={props.width} /> diff --git a/client/packages/lowcoder-design/src/components/Modal/index.tsx b/client/packages/lowcoder-design/src/components/Modal/index.tsx index 1964f26bc..91f35b88e 100644 --- a/client/packages/lowcoder-design/src/components/Modal/index.tsx +++ b/client/packages/lowcoder-design/src/components/Modal/index.tsx @@ -32,7 +32,7 @@ export function Modal(props: ModalProps) { resizeHandles, width: modalWidth, height: modalHeight, - bodyStyle, + styles, children, ...otherProps } = props; @@ -53,7 +53,12 @@ export function Modal(props: ModalProps) { return ( diff --git a/client/packages/lowcoder-design/src/i18n/design/locales/zh.ts b/client/packages/lowcoder-design/src/i18n/design/locales/zh.ts index 6e660cda5..3fe60174b 100644 --- a/client/packages/lowcoder-design/src/i18n/design/locales/zh.ts +++ b/client/packages/lowcoder-design/src/i18n/design/locales/zh.ts @@ -23,6 +23,8 @@ export const zh = { validation: "验证", layout: "布局", style: "样式", + meetings: "会议", + data: "数据", }, passwordInput: { label: "密码:", diff --git a/client/packages/lowcoder/package.json b/client/packages/lowcoder/package.json index cc2a6c8eb..c4936531f 100644 --- a/client/packages/lowcoder/package.json +++ b/client/packages/lowcoder/package.json @@ -40,7 +40,7 @@ "agora-rtc-sdk-ng": "^4.19.0", "agora-rtm-sdk": "^1.5.1", "ali-oss": "^6.17.1", - "antd": "5.7.2", + "antd": "^5.12.2", "antd-img-crop": "^4.12.2", "axios": "^0.21.1", "buffer": "^6.0.3", diff --git a/client/packages/lowcoder/src/comps/comps/fileComp/fileComp.tsx b/client/packages/lowcoder/src/comps/comps/fileComp/fileComp.tsx index b206f2a15..e801a3a29 100644 --- a/client/packages/lowcoder/src/comps/comps/fileComp/fileComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/fileComp/fileComp.tsx @@ -210,7 +210,7 @@ export function resolveParsedValue(files: UploadFile[]) { .then((a) => { const ext = mime.getExtension(f.originFileObj?.type ?? ""); if (ext === "xlsx" || ext === "csv") { - const workbook = XLSX.read(a, { raw: true }); + const workbook = XLSX.read(a, { raw: true, codepage: 65001 }); return XLSX.utils.sheet_to_json(workbook.Sheets[workbook.SheetNames[0]], { raw: false, }); diff --git a/client/packages/lowcoder/src/comps/comps/formComp/createForm.tsx b/client/packages/lowcoder/src/comps/comps/formComp/createForm.tsx index f0223ff12..f8092a6ee 100644 --- a/client/packages/lowcoder/src/comps/comps/formComp/createForm.tsx +++ b/client/packages/lowcoder/src/comps/comps/formComp/createForm.tsx @@ -669,7 +669,7 @@ export const CreateForm = (props: { onCreate: CreateHandler }) => { onCancel={() => setVisible(false)} width="600px" children={} - bodyStyle={{ padding: 0 }} + styles={{ body: {padding: 0} }} /> diff --git a/client/packages/lowcoder/src/comps/comps/meetingComp/videoMeetingControllerComp.tsx b/client/packages/lowcoder/src/comps/comps/meetingComp/videoMeetingControllerComp.tsx index 3419b4f16..80bf6e8c1 100644 --- a/client/packages/lowcoder/src/comps/comps/meetingComp/videoMeetingControllerComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/meetingComp/videoMeetingControllerComp.tsx @@ -508,9 +508,11 @@ let MTComp = (function () { : {} } contentWrapperStyle={{ maxHeight: "100%", maxWidth: "100%" }} - bodyStyle={{ - padding: 0, - backgroundColor: props.style.background, + styles={{ + body: { + padding: 0, + backgroundColor: props.style.background, + } }} closable={false} placement={props.placement} diff --git a/client/packages/lowcoder/src/comps/controls/labelControl.tsx b/client/packages/lowcoder/src/comps/controls/labelControl.tsx index ed8394042..db3087e65 100644 --- a/client/packages/lowcoder/src/comps/controls/labelControl.tsx +++ b/client/packages/lowcoder/src/comps/controls/labelControl.tsx @@ -178,7 +178,6 @@ export const LabelControl = (function () { }} placement="top" color="#2c2c2c" - popupVisible={!!props.tooltip} getPopupContainer={(node: any) => node.closest(".react-grid-item")} > diff --git a/client/packages/lowcoder/src/comps/controls/slotControl.tsx b/client/packages/lowcoder/src/comps/controls/slotControl.tsx index 073281159..8248e98f2 100644 --- a/client/packages/lowcoder/src/comps/controls/slotControl.tsx +++ b/client/packages/lowcoder/src/comps/controls/slotControl.tsx @@ -65,7 +65,7 @@ function ModalConfigView(props: { onCancel={onCancel} getContainer={() => document.querySelector(`#${CanvasContainerID}`) || document.body} footer={null} - bodyStyle={{ padding: "0" }} + styles={{ body: {padding: "0"} }} zIndex={Layers.modal} modalRender={(node) => ( {}}> diff --git a/client/packages/lowcoder/src/comps/hooks/drawerComp.tsx b/client/packages/lowcoder/src/comps/hooks/drawerComp.tsx index 02e8e36b4..134b0e229 100644 --- a/client/packages/lowcoder/src/comps/hooks/drawerComp.tsx +++ b/client/packages/lowcoder/src/comps/hooks/drawerComp.tsx @@ -127,7 +127,12 @@ let TmpDrawerComp = (function () { onResizeStop={onResizeStop} rootStyle={props.visible.value ? { overflow: "auto", pointerEvents: "auto" } : {}} contentWrapperStyle={{ maxHeight: "100%", maxWidth: "100%" }} - bodyStyle={{ padding: 0, backgroundColor: props.style.background }} + styles={{ + body: { + padding: 0, + backgroundColor: props.style.background + } + }} closable={false} placement={props.placement} open={props.visible.value} diff --git a/client/packages/lowcoder/src/comps/hooks/modalComp.tsx b/client/packages/lowcoder/src/comps/hooks/modalComp.tsx index af90a70c9..92af6fb6d 100644 --- a/client/packages/lowcoder/src/comps/hooks/modalComp.tsx +++ b/client/packages/lowcoder/src/comps/hooks/modalComp.tsx @@ -113,7 +113,7 @@ let TmpModalComp = (function () { focusTriggerAfterClose={false} getContainer={() => document.querySelector(`#${CanvasContainerID}`) || document.body} footer={null} - bodyStyle={bodyStyle} + styles={{body: bodyStyle}} width={width} onCancel={(e) => { props.visible.onChange(false); diff --git a/client/packages/lowcoder/src/i18n/locales/en.ts b/client/packages/lowcoder/src/i18n/locales/en.ts index fa8b1aa3a..bf261cb95 100644 --- a/client/packages/lowcoder/src/i18n/locales/en.ts +++ b/client/packages/lowcoder/src/i18n/locales/en.ts @@ -194,7 +194,7 @@ export const en = { "fixed": "Fixed" }, "textOverflowProp": { - "ellipsis": "Ellipsis", + "ellipsis": "Mouseover", "wrap": "Wrap" }, "labelProp": { diff --git a/client/packages/lowcoder/src/i18n/locales/index.ts b/client/packages/lowcoder/src/i18n/locales/index.ts index 74365e04b..ab08ff79f 100644 --- a/client/packages/lowcoder/src/i18n/locales/index.ts +++ b/client/packages/lowcoder/src/i18n/locales/index.ts @@ -1,7 +1,7 @@ // file examples: en, enGB, zh, zhHK // fallback example: current locale is zh-HK, fallback order is zhHK => zh => en -export * from "./en"; // export * from "./de"; Not ready yet +export * from "./en"; export * from "./it"; export * from "@lowcoder-ee/i18n/locales/zh"; diff --git a/client/packages/lowcoder/src/i18n/locales/zh.ts b/client/packages/lowcoder/src/i18n/locales/zh.ts index 4cfa6474a..778a08885 100644 --- a/client/packages/lowcoder/src/i18n/locales/zh.ts +++ b/client/packages/lowcoder/src/i18n/locales/zh.ts @@ -199,6 +199,10 @@ labelProp: { widthTooltip: "组件标题的宽度,支持百分比(%)和像素(px)为单位.", }, +"textOverflowProp": { + "ellipsis": "鼠标悬停", + "wrap": "包装" +}, eventHandler: { eventHandlers: "事件处理器", emptyEventHandlers: "无事件处理器", @@ -650,15 +654,16 @@ smtpQuery: { contentTooltip: "支持输入文本或HTML", }, uiCompCategory: { - common: "常用组件", - dataInputText: "文本组件", - dataInputNumber: "数字组件", - dataInputSelect: "选择组件", - dataInputDate: "日期和时间数字键", - button: "按钮组件", - dataDisplay: "数据展示组件", - container: "容器和表单组件", - other: "其他组件", + "dashboards": "仪表板和报告", + "layout": "布局和导航", + "forms": "数据收集与表格", + "collaboration": "会议与合作", + "projectmanagement": "项目管理", + "scheduling": "日历和日程安排", + "documents": "文件和档案管理", + "itemHandling": "项目和签名处理", + "multimedia": "多媒体与动画", + "integration": "整合与扩展" }, uiComp: { inputCompName: "输入框", @@ -869,6 +874,60 @@ comp: { upgradeSuccess: "成功升级到最新版本.", searchProp: "搜索属性", }, +"meeting": { + "logLevel": "Agora SDK 日志级别", + "placement": "会议抽屉的摆放", + "meeting": "会议设置", + "cameraView": "摄像头视图", + "cameraViewDesc": "本地用户(主机)的摄像头视图", + "screenShared": "屏幕共享", + "screenSharedDesc": "本地用户(主机)共享的屏幕", + "audioUnmuted": "音频静音", + "audioMuted": "音频静音", + "videoClicked": "点击视频", + "videoOff": "关闭视频", + "videoOn": "视频", + "size": "尺寸", + "top": "返回顶部", + "host": "会议室主机。您需要将主机作为自己的应用程序逻辑进行管理", + "participants": "会议室与会者", + "shareScreen": "本地用户共享的显示屏幕", + "appid": "Agora 应用 ID", + "meetingName": "会议名称", + "localUserID": "主机用户 ID", + "userName": "主机用户名", + "rtmToken": "Agora RTM 代币", + "rtcToken": "Agora RTC 代币", + "noVideo": "无视频", + "profileImageUrl": "简介图片 URL", + "right": "对", + "bottom": "底部", + "videoId": "视频流 ID", + "audioStatus": "音频状态", + "left": "左侧", + "widthTooltip": "像素或百分比,例如 520、60", + "heightTooltip": "像素,例如 378", + "openDrawerDesc": "开放式抽屉", + "closeDrawerDesc": "关闭抽屉", + "width": "抽屉宽度", + "height": "抽屉高度", + "actionBtnDesc": "操作按钮", + "broadCast": "广播信息", + "title": "会议名称", + "meetingCompName": "Agora 会议控制器", + "sharingCompName": "屏幕共享流", + "videoCompName": "摄像机流", + "videoSharingCompName": "屏幕共享流", + "meetingControlCompName": "控制按钮", + "meetingCompDesc": "会议组成部分", + "meetingCompControls": "会议控制", + "meetingCompKeywords": "Agora 会议、网络会议、协作", + "iconSize": "图标大小", + "userId": "主机用户 ID", + "roomId": "房间 ID", + "meetingActive": "持续会议", + "messages": "广播信息" +}, jsonSchemaForm: { retry: "重试", resetAfterSubmit: "成功提交后重置", @@ -900,6 +959,7 @@ customComp: { }, tree: { selectType: "选择类型", + placeholder: "请选择", noSelect: "无选择", singleSelect: "单选", multiSelect: "多选", @@ -1176,8 +1236,6 @@ table: { hideHeader: "隐藏表头", fixedHeader: "固定表头", fixedHeaderTooltip: "垂直滚动表格的标题将被固定", - fixedToolbar: "固定工具栏", - fixedToolbarTooltip: "工具栏将根据所选位置固定为垂直滚动表格", hideBordered: "隐藏列边框", deleteColumn: "删除列", confirmDeleteColumn: "确认删除列:", @@ -1218,6 +1276,8 @@ table: { cellColorDesc: "使用 currentCell 根据单元格值有条件地设置单元格颜色:\n" + "例如:'{{ currentCell == 3 ? \"green\" : \"red\" }}'", + rowHeight : "条件行高度", + rowHeightDesc: "根据可选变量有条件地设置行高: CurrentRow、CurrentOriginalIndex、CurrentIndex、ColumnTitle。例如:'{{ currentRow.id > 3 ? \"60px\" : \"40px\" }}'", saveChangesNotBind: "未配置保存更改的事件处理程序.请在点击之前绑定至少一个事件处理程序.", dynamicColumn: "使用动态列设置", @@ -1927,6 +1987,9 @@ header: { preview: "预览", editError: "历史预览模式下,不支持任何操作.", clone: "克隆", + editorMode_layout: "应用程序布局", + editorMode_logic: "应用程序逻辑", + editorMode_both: "两者", }, userAuth: { registerByEmail: "通过电子邮件注册", @@ -2147,8 +2210,9 @@ datasourceTutorial: { }, queryTutorial: { js: "", - transformer: "https://docs.lowcoder.cloud/build-apps/write-javascript/transformers", - tempState: "https://docs.lowcoder.cloud/build-apps/write-javascript/temporary-state", + transformer: "https://docs.lowcoder.cloud/business-logic-in-apps/write-javascript/transformers", + tempState: "https://docs.lowcoder.cloud/business-logic-in-apps/write-javascript/temporary-state", + dataResponder: "https://docs.lowcoder.cloud/lowcoder-documentation/business-logic-in-apps/write-javascript/data-responder", }, customComponent: { entryUrl: "https://sdk.lowcoder.cloud/custom_component.html", @@ -2582,5 +2646,4 @@ timeLine: { navStyle: "菜单风格", navItemStyle: "菜单项样式", } -}; - +}; \ No newline at end of file diff --git a/client/packages/lowcoder/src/pages/common/copyModal.tsx b/client/packages/lowcoder/src/pages/common/copyModal.tsx index 6f83f0d8b..3c23efd3b 100644 --- a/client/packages/lowcoder/src/pages/common/copyModal.tsx +++ b/client/packages/lowcoder/src/pages/common/copyModal.tsx @@ -31,10 +31,11 @@ export function CopyModal(props: CopyModalProps) { )?.folderId || "" ); const { visible, close, name, type, id } = props; - + const appName = name.length > 25 ? `${name.substring(0, 25)}...` : name; + return ( { return ( showCreateForm(false)} activeStepKey={"type"} destroyOnClose={true} diff --git a/client/packages/lowcoder/src/pages/editor/LeftContent.tsx b/client/packages/lowcoder/src/pages/editor/LeftContent.tsx index 94ce1a978..179e2b293 100644 --- a/client/packages/lowcoder/src/pages/editor/LeftContent.tsx +++ b/client/packages/lowcoder/src/pages/editor/LeftContent.tsx @@ -64,9 +64,10 @@ function toDataView(value: any, name: string, desc?: ReactNode) { } else if (_.isPlainObject(value)) { return ; } + return ( - + @@ -150,7 +151,6 @@ const CollapseView = React.memo( props.onClick && props.onClick(props.name)}> } - headerStyle={headerWrapperStyle} - bodyStyle={{ - padding: "0 0 0 8px", - scrollbarGutter: "stable", - overflowX: "hidden", + styles={{ + header: headerWrapperStyle, + body: { + padding: "0 0 0 8px", + overflowX: "hidden", + scrollbarGutter: "stable", + } }} placement="bottom" closable={false} diff --git a/client/packages/lowcoder/src/pages/setting/permission/styledComponents.tsx b/client/packages/lowcoder/src/pages/setting/permission/styledComponents.tsx index c57fb238a..7223016be 100644 --- a/client/packages/lowcoder/src/pages/setting/permission/styledComponents.tsx +++ b/client/packages/lowcoder/src/pages/setting/permission/styledComponents.tsx @@ -405,7 +405,14 @@ export function UserDetailPopup(props: { userId: string; title: string }) { </OperationLink> <CustomModal width={550} - bodyStyle={{ maxHeight: "500px", overflow: "auto", maxWidth: "550px", width: "550px" }} + styles={{ + body: { + maxHeight: "500px", + overflow: "auto", + maxWidth: "550px", + width: "550px" + } + }} open={visible} onCancel={() => setVisible(false)} title={title} diff --git a/client/packages/lowcoder/src/pages/setting/theme/createModal.tsx b/client/packages/lowcoder/src/pages/setting/theme/createModal.tsx index df9dc0da0..d1ca5265b 100644 --- a/client/packages/lowcoder/src/pages/setting/theme/createModal.tsx +++ b/client/packages/lowcoder/src/pages/setting/theme/createModal.tsx @@ -121,7 +121,7 @@ function CreateModal(props: CreateModalProp) { <ScrollBarStyled style={{ height: themeList?.length ? (themeList?.length > 3 ? "363px" : "313px") : "156px", - marginBottom: (!!themeList?.length && themeList?.length) > 3 ? "4px" : "0", + marginBottom: (!!themeList?.length && themeList?.length > 3) ? "4px" : "0", }} > <SelectTitle>{trans("theme.defaultThemeTip")}</SelectTitle> diff --git a/client/packages/lowcoder/src/pages/setting/theme/themeList.tsx b/client/packages/lowcoder/src/pages/setting/theme/themeList.tsx index dec9464e5..5170a1c07 100644 --- a/client/packages/lowcoder/src/pages/setting/theme/themeList.tsx +++ b/client/packages/lowcoder/src/pages/setting/theme/themeList.tsx @@ -39,6 +39,7 @@ function ThemeList(props: ThemeListProp) { } return ( <TableStyled + id="theme-list-table" ref={tableRef} rowKey="id" pagination={false} @@ -153,7 +154,7 @@ function ThemeList(props: ThemeListProp) { <ListDropdown onClick={(e) => e.stopPropagation()}> <Dropdown trigger={["click"]} - getPopupContainer={() => tableRef.current!} + getPopupContainer={() => document.getElementById("theme-list-table")!} dropdownRender={() => ( <Menu onClick={(params) => { diff --git a/client/yarn.lock b/client/yarn.lock index 25e021367..0000f8836 100644 --- a/client/yarn.lock +++ b/client/yarn.lock @@ -81,7 +81,7 @@ __metadata: languageName: node linkType: hard -"@ant-design/cssinjs@npm:^1.10.1": +"@ant-design/cssinjs@npm:^1.18.1": version: 1.18.1 resolution: "@ant-design/cssinjs@npm:1.18.1" dependencies: @@ -123,7 +123,7 @@ __metadata: languageName: node linkType: hard -"@ant-design/icons@npm:^5.1.0": +"@ant-design/icons@npm:^5.2.6": version: 5.2.6 resolution: "@ant-design/icons@npm:5.2.6" dependencies: @@ -267,7 +267,7 @@ __metadata: languageName: node linkType: hard -"@ant-design/react-slick@npm:~1.0.0, @ant-design/react-slick@npm:~1.0.2": +"@ant-design/react-slick@npm:~1.0.2": version: 1.0.2 resolution: "@ant-design/react-slick@npm:1.0.2" dependencies: @@ -1853,7 +1853,7 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.10.1, @babel/runtime@npm:^7.10.4, @babel/runtime@npm:^7.11.1, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.15.4, @babel/runtime@npm:^7.16.3, @babel/runtime@npm:^7.16.7, @babel/runtime@npm:^7.18.0, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.2.0, @babel/runtime@npm:^7.20.0, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.20.7, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.22.5, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.6.3, @babel/runtime@npm:^7.7.2, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2": +"@babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.10.1, @babel/runtime@npm:^7.10.4, @babel/runtime@npm:^7.11.1, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.15.4, @babel/runtime@npm:^7.16.3, @babel/runtime@npm:^7.16.7, @babel/runtime@npm:^7.18.0, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.2.0, @babel/runtime@npm:^7.20.0, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.20.7, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.22.5, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.23.4, @babel/runtime@npm:^7.6.3, @babel/runtime@npm:^7.7.2, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2": version: 7.23.6 resolution: "@babel/runtime@npm:7.23.6" dependencies: @@ -3114,7 +3114,7 @@ __metadata: languageName: node linkType: hard -"@rc-component/color-picker@npm:~1.4.0": +"@rc-component/color-picker@npm:~1.4.1": version: 1.4.1 resolution: "@rc-component/color-picker@npm:1.4.1" dependencies: @@ -3129,7 +3129,7 @@ __metadata: languageName: node linkType: hard -"@rc-component/context@npm:^1.3.0": +"@rc-component/context@npm:^1.4.0": version: 1.4.0 resolution: "@rc-component/context@npm:1.4.0" dependencies: @@ -3151,7 +3151,7 @@ __metadata: languageName: node linkType: hard -"@rc-component/mutate-observer@npm:^1.0.0": +"@rc-component/mutate-observer@npm:^1.1.0": version: 1.1.0 resolution: "@rc-component/mutate-observer@npm:1.1.0" dependencies: @@ -3179,9 +3179,9 @@ __metadata: languageName: node linkType: hard -"@rc-component/tour@npm:~1.8.0": - version: 1.8.1 - resolution: "@rc-component/tour@npm:1.8.1" +"@rc-component/tour@npm:~1.11.1": + version: 1.11.1 + resolution: "@rc-component/tour@npm:1.11.1" dependencies: "@babel/runtime": ^7.18.0 "@rc-component/portal": ^1.0.0-9 @@ -3191,11 +3191,11 @@ __metadata: peerDependencies: react: ">=16.9.0" react-dom: ">=16.9.0" - checksum: dd973de88edcd81c7ad65b9f99673274f9721335a078140872bb83d5dbdaf8abb8747b35ea8b960dbe1122d8e353540c91c7789e32413b8f8daca10065cb1692 + checksum: 4c9c509f775cd3c4bdc2d73efe27f2c1ec19132f5a0011c1e82420bc243fdb2fc66bfeee0bd4c4073a1c2621d9aa0d303a71f233db6be5140a397c3f94979090 languageName: node linkType: hard -"@rc-component/trigger@npm:^1.0.4, @rc-component/trigger@npm:^1.13.0, @rc-component/trigger@npm:^1.3.6, @rc-component/trigger@npm:^1.5.0, @rc-component/trigger@npm:^1.6.2, @rc-component/trigger@npm:^1.7.0": +"@rc-component/trigger@npm:^1.17.0, @rc-component/trigger@npm:^1.18.0, @rc-component/trigger@npm:^1.18.2, @rc-component/trigger@npm:^1.3.6, @rc-component/trigger@npm:^1.5.0, @rc-component/trigger@npm:^1.7.0": version: 1.18.2 resolution: "@rc-component/trigger@npm:1.18.2" dependencies: @@ -5149,65 +5149,6 @@ __metadata: languageName: node linkType: hard -"antd@npm:5.7.2": - version: 5.7.2 - resolution: "antd@npm:5.7.2" - dependencies: - "@ant-design/colors": ^7.0.0 - "@ant-design/cssinjs": ^1.10.1 - "@ant-design/icons": ^5.1.0 - "@ant-design/react-slick": ~1.0.0 - "@babel/runtime": ^7.18.3 - "@ctrl/tinycolor": ^3.6.0 - "@rc-component/color-picker": ~1.4.0 - "@rc-component/mutate-observer": ^1.0.0 - "@rc-component/tour": ~1.8.0 - "@rc-component/trigger": ^1.13.0 - classnames: ^2.2.6 - copy-to-clipboard: ^3.2.0 - dayjs: ^1.11.1 - qrcode.react: ^3.1.0 - rc-cascader: ~3.12.0 - rc-checkbox: ~3.1.0 - rc-collapse: ~3.7.0 - rc-dialog: ~9.1.0 - rc-drawer: ~6.2.0 - rc-dropdown: ~4.1.0 - rc-field-form: ~1.34.0 - rc-image: ~7.0.0 - rc-input: ~1.1.0 - rc-input-number: ~8.0.2 - rc-mentions: ~2.5.0 - rc-menu: ~9.10.0 - rc-motion: ^2.7.3 - rc-notification: ~5.0.4 - rc-pagination: ~3.5.0 - rc-picker: ~3.10.0 - rc-progress: ~3.4.1 - rc-rate: ~2.12.0 - rc-resize-observer: ^1.2.0 - rc-segmented: ~2.2.0 - rc-select: ~14.5.0 - rc-slider: ~10.1.0 - rc-steps: ~6.0.1 - rc-switch: ~4.1.0 - rc-table: ~7.32.1 - rc-tabs: ~12.9.0 - rc-textarea: ~1.3.2 - rc-tooltip: ~6.0.0 - rc-tree: ~5.7.6 - rc-tree-select: ~5.9.0 - rc-upload: ~4.3.0 - rc-util: ^5.32.0 - scroll-into-view-if-needed: ^3.0.3 - throttle-debounce: ^5.0.0 - peerDependencies: - react: ">=16.9.0" - react-dom: ">=16.9.0" - checksum: 38565a6443bf9b801da8c5e9cbaae5b4856aee1e5948e3c0e6ef6948cd0eaaed0f0261724c22e73ec0fc21342585f6f986031bf16e406da847fe0aea69f9ff70 - languageName: node - linkType: hard - "antd@npm:^4.20.0 ": version: 4.24.15 resolution: "antd@npm:4.24.15" @@ -5262,6 +5203,65 @@ __metadata: languageName: node linkType: hard +"antd@npm:^5.12.2": + version: 5.12.2 + resolution: "antd@npm:5.12.2" + dependencies: + "@ant-design/colors": ^7.0.0 + "@ant-design/cssinjs": ^1.18.1 + "@ant-design/icons": ^5.2.6 + "@ant-design/react-slick": ~1.0.2 + "@babel/runtime": ^7.23.4 + "@ctrl/tinycolor": ^3.6.1 + "@rc-component/color-picker": ~1.4.1 + "@rc-component/mutate-observer": ^1.1.0 + "@rc-component/tour": ~1.11.1 + "@rc-component/trigger": ^1.18.2 + classnames: ^2.3.2 + copy-to-clipboard: ^3.3.3 + dayjs: ^1.11.1 + qrcode.react: ^3.1.0 + rc-cascader: ~3.20.0 + rc-checkbox: ~3.1.0 + rc-collapse: ~3.7.2 + rc-dialog: ~9.3.4 + rc-drawer: ~6.5.2 + rc-dropdown: ~4.1.0 + rc-field-form: ~1.41.0 + rc-image: ~7.5.1 + rc-input: ~1.3.6 + rc-input-number: ~8.4.0 + rc-mentions: ~2.9.1 + rc-menu: ~9.12.4 + rc-motion: ^2.9.0 + rc-notification: ~5.3.0 + rc-pagination: ~4.0.3 + rc-picker: ~3.14.6 + rc-progress: ~3.5.1 + rc-rate: ~2.12.0 + rc-resize-observer: ^1.4.0 + rc-segmented: ~2.2.2 + rc-select: ~14.10.0 + rc-slider: ~10.5.0 + rc-steps: ~6.0.1 + rc-switch: ~4.1.0 + rc-table: ~7.36.0 + rc-tabs: ~12.14.1 + rc-textarea: ~1.5.3 + rc-tooltip: ~6.1.2 + rc-tree: ~5.8.2 + rc-tree-select: ~5.15.0 + rc-upload: ~4.3.5 + rc-util: ^5.38.1 + scroll-into-view-if-needed: ^3.1.0 + throttle-debounce: ^5.0.0 + peerDependencies: + react: ">=16.9.0" + react-dom: ">=16.9.0" + checksum: de4daf00999b27a9414378c9c2d484ab5e99a0e344735ea45f7f938ba15565c939416308097cfcff19d24a90a7e780de965fa42cfb6258ac34f2f2e3a13161d3 + languageName: node + linkType: hard + "any-promise@npm:^1.0.0, any-promise@npm:^1.3.0": version: 1.3.0 resolution: "any-promise@npm:1.3.0" @@ -12154,7 +12154,7 @@ __metadata: agora-rtc-sdk-ng: ^4.19.0 agora-rtm-sdk: ^1.5.1 ali-oss: ^6.17.1 - antd: 5.7.2 + antd: ^5.12.2 antd-img-crop: ^4.12.2 axios: ^0.21.1 buffer: ^6.0.3 @@ -14383,20 +14383,20 @@ __metadata: languageName: node linkType: hard -"rc-cascader@npm:~3.12.0": - version: 3.12.1 - resolution: "rc-cascader@npm:3.12.1" +"rc-cascader@npm:~3.20.0": + version: 3.20.0 + resolution: "rc-cascader@npm:3.20.0" dependencies: "@babel/runtime": ^7.12.5 array-tree-filter: ^2.1.0 classnames: ^2.3.1 - rc-select: ~14.5.0 - rc-tree: ~5.7.0 - rc-util: ^5.6.1 + rc-select: ~14.10.0 + rc-tree: ~5.8.1 + rc-util: ^5.37.0 peerDependencies: react: ">=16.9.0" react-dom: ">=16.9.0" - checksum: 11fddad49d7c6dcd06f7875b34fb40d798d912e2280e75e4f89777ade05d8a162f2c8f81e447dec44b327603e92f15c93b5c1a7489353732ca37f4c020d45624 + checksum: fd85091f90c7a82ff8e240c356de9f1070e6371217a7ab852908b64746488586d8c9b2893ce5895373e1e8d55c36d5cd899808ec6d7938bfe81d19be2ceee94a languageName: node linkType: hard @@ -14461,7 +14461,7 @@ __metadata: languageName: node linkType: hard -"rc-collapse@npm:~3.7.0": +"rc-collapse@npm:~3.7.2": version: 3.7.2 resolution: "rc-collapse@npm:3.7.2" dependencies: @@ -14492,9 +14492,9 @@ __metadata: languageName: node linkType: hard -"rc-dialog@npm:~9.1.0": - version: 9.1.0 - resolution: "rc-dialog@npm:9.1.0" +"rc-dialog@npm:~9.3.4": + version: 9.3.4 + resolution: "rc-dialog@npm:9.3.4" dependencies: "@babel/runtime": ^7.10.1 "@rc-component/portal": ^1.0.0-8 @@ -14504,13 +14504,13 @@ __metadata: peerDependencies: react: ">=16.9.0" react-dom: ">=16.9.0" - checksum: 59d2504301a813022b9782e808e61e4e6a55d746a5608d9927b8f6cf4806dd694df7812678f56174419cccb5273d5e302c3178d31a6c5871aa97be5fd086267c + checksum: 75d689d281ae3a1a85faa2f87c95ac65995ed58f696898edbe89a79604e18213565edc1d21291c9a640379fa6705c19ec51ba9275d69cde877d21f5108eb3503 languageName: node linkType: hard -"rc-drawer@npm:~6.2.0": - version: 6.2.0 - resolution: "rc-drawer@npm:6.2.0" +"rc-drawer@npm:~6.3.0": + version: 6.3.0 + resolution: "rc-drawer@npm:6.3.0" dependencies: "@babel/runtime": ^7.10.1 "@rc-component/portal": ^1.1.1 @@ -14520,23 +14520,23 @@ __metadata: peerDependencies: react: ">=16.9.0" react-dom: ">=16.9.0" - checksum: b006caa2036bb84760f447de193841de00a0867e32971349d210b6e1c97f7cf61b2dba05a467f03d55bba592d153b688e882adb4af20daa5271b9286f313fbc0 + checksum: 63c9c5d05590a35dc9a66b03544626180e8df08c593568e32f5ac86e0078b09a7388a60441f357b7c71a31715aa18f43fc4a1e165d745d58861380c88b8c9d36 languageName: node linkType: hard -"rc-drawer@npm:~6.3.0": - version: 6.3.0 - resolution: "rc-drawer@npm:6.3.0" +"rc-drawer@npm:~6.5.2": + version: 6.5.2 + resolution: "rc-drawer@npm:6.5.2" dependencies: "@babel/runtime": ^7.10.1 "@rc-component/portal": ^1.1.1 classnames: ^2.2.6 rc-motion: ^2.6.1 - rc-util: ^5.21.2 + rc-util: ^5.36.0 peerDependencies: react: ">=16.9.0" react-dom: ">=16.9.0" - checksum: 63c9c5d05590a35dc9a66b03544626180e8df08c593568e32f5ac86e0078b09a7388a60441f357b7c71a31715aa18f43fc4a1e165d745d58861380c88b8c9d36 + checksum: e96908f641ea0a4b26e7142a932cefe60ee34c03c6c569a6070af770b0be8a883e89521217d8391957254b0ed88b4ac1735129c9e062528db0751bfd0222a0c1 languageName: node linkType: hard @@ -14584,9 +14584,9 @@ __metadata: languageName: node linkType: hard -"rc-field-form@npm:~1.34.0": - version: 1.34.2 - resolution: "rc-field-form@npm:1.34.2" +"rc-field-form@npm:~1.38.2": + version: 1.38.2 + resolution: "rc-field-form@npm:1.38.2" dependencies: "@babel/runtime": ^7.18.0 async-validator: ^4.1.0 @@ -14594,13 +14594,13 @@ __metadata: peerDependencies: react: ">=16.9.0" react-dom: ">=16.9.0" - checksum: 50535a06fa3f3fa428ab142e4722e6c567a30202c7fec0a7e63685ba1cc356c3159721902aa2fdeb563e9153faa9d1b515624da4d0c5ba4cf93cf6249a763521 + checksum: a1d180f231220a632b25e317fba107e2d579b18e83dc95f4dfbc014ee8631c4a1167e3ac58838b66fe8116594e81454e69cd8093fa5c023b5f69bd64b4ad5875 languageName: node linkType: hard -"rc-field-form@npm:~1.38.2": - version: 1.38.2 - resolution: "rc-field-form@npm:1.38.2" +"rc-field-form@npm:~1.41.0": + version: 1.41.0 + resolution: "rc-field-form@npm:1.41.0" dependencies: "@babel/runtime": ^7.18.0 async-validator: ^4.1.0 @@ -14608,7 +14608,7 @@ __metadata: peerDependencies: react: ">=16.9.0" react-dom: ">=16.9.0" - checksum: a1d180f231220a632b25e317fba107e2d579b18e83dc95f4dfbc014ee8631c4a1167e3ac58838b66fe8116594e81454e69cd8093fa5c023b5f69bd64b4ad5875 + checksum: 5340296d62e453d60ed42e19208c91ce2d2af5ff1d525829ea003109150011f3e944296a129792f749de6fc4c2113ea3297fdaef953de27606e03d73d937dc2b languageName: node linkType: hard @@ -14629,20 +14629,20 @@ __metadata: languageName: node linkType: hard -"rc-image@npm:~7.0.0": - version: 7.0.0 - resolution: "rc-image@npm:7.0.0" +"rc-image@npm:~7.5.1": + version: 7.5.1 + resolution: "rc-image@npm:7.5.1" dependencies: "@babel/runtime": ^7.11.2 "@rc-component/portal": ^1.0.2 classnames: ^2.2.6 - rc-dialog: ~9.1.0 + rc-dialog: ~9.3.4 rc-motion: ^2.6.2 rc-util: ^5.34.1 peerDependencies: react: ">=16.9.0" react-dom: ">=16.9.0" - checksum: e45be52d57481b290501d97dc8fe76a5541564e92a183c087956f09b39b0f4cd21aabad668e8df1ab3a263c009f7d02f91be333e4b153190b95d4dd6c5a08f44 + checksum: ec5ffd6ed34a2f1502a4374a622144c1554f83a376b87ffc54712ddd891c83e423cc0e5c3c228606ee0e1dc571df685d493c9e10582b352064b2073ec72c8d4b languageName: node linkType: hard @@ -14660,19 +14660,19 @@ __metadata: languageName: node linkType: hard -"rc-input-number@npm:~8.0.2": - version: 8.0.4 - resolution: "rc-input-number@npm:8.0.4" +"rc-input-number@npm:~8.4.0": + version: 8.4.0 + resolution: "rc-input-number@npm:8.4.0" dependencies: "@babel/runtime": ^7.10.1 "@rc-component/mini-decimal": ^1.0.1 classnames: ^2.2.5 - rc-input: ~1.1.0 + rc-input: ~1.3.5 rc-util: ^5.28.0 peerDependencies: react: ">=16.9.0" react-dom: ">=16.9.0" - checksum: 87acbd405279b6fc52dbb540255120f4e7d097d79a220c17c6a974f2196fa29dedc5b37e047c9616f2dbd464b3aca583e4d4945f67486b7950fb67acdb59a8be + checksum: 00bb0b40c0f13747315790d1ec2b8707abee8388c1623dee5ebdf51cc93ae6441f200d19ecda5f85e44dd180d9e93dadf4cb8ce2e02c3a4db81f1e69d9b4dc04 languageName: node linkType: hard @@ -14690,9 +14690,9 @@ __metadata: languageName: node linkType: hard -"rc-input@npm:~1.1.0": - version: 1.1.1 - resolution: "rc-input@npm:1.1.1" +"rc-input@npm:~1.3.5, rc-input@npm:~1.3.6": + version: 1.3.11 + resolution: "rc-input@npm:1.3.11" dependencies: "@babel/runtime": ^7.11.1 classnames: ^2.2.1 @@ -14700,7 +14700,7 @@ __metadata: peerDependencies: react: ">=16.0.0" react-dom: ">=16.0.0" - checksum: c018af027476809b6501e2aa264ac9ddb2c413940bc911e6f6441baf98dba8c9f69d9abe96279517857231ca60f92a957c22d9187d5e5b92cf6325d1a09bfa6f + checksum: e548f5e46c34058cb53baba3891e1d307cd8d6d2f01896cb14bf78dea84c179e7e05fb23829704f89a4610bbaf278e713702ea64ad9e94813c425d821c70502e languageName: node linkType: hard @@ -14721,30 +14721,30 @@ __metadata: languageName: node linkType: hard -"rc-mentions@npm:~2.5.0": - version: 2.5.0 - resolution: "rc-mentions@npm:2.5.0" +"rc-mentions@npm:~2.9.1": + version: 2.9.1 + resolution: "rc-mentions@npm:2.9.1" dependencies: "@babel/runtime": ^7.22.5 "@rc-component/trigger": ^1.5.0 classnames: ^2.2.6 - rc-input: ~1.1.0 - rc-menu: ~9.10.0 - rc-textarea: ~1.3.0 - rc-util: ^5.22.5 + rc-input: ~1.3.5 + rc-menu: ~9.12.0 + rc-textarea: ~1.5.0 + rc-util: ^5.34.1 peerDependencies: react: ">=16.9.0" react-dom: ">=16.9.0" - checksum: 084236d5e58738acbc8ab3ccaa9c02daf6a6cda8040780a8c99cdebf9a7bec262df5a22732ce250d73263bc64c115f44bc8b5e11b0db4eb82c68f7cdcbb2ab9c + checksum: f5b7ad6a3f674e259e243c12450f81ee7f69298a4cce8a4ef9a467622651f7452eebcfdf737e8587239d77a9f109aafafe5e547401ec806e3a2a14a9df20800e languageName: node linkType: hard -"rc-menu@npm:~9.10.0": - version: 9.10.0 - resolution: "rc-menu@npm:9.10.0" +"rc-menu@npm:~9.12.0, rc-menu@npm:~9.12.4": + version: 9.12.4 + resolution: "rc-menu@npm:9.12.4" dependencies: "@babel/runtime": ^7.10.1 - "@rc-component/trigger": ^1.6.2 + "@rc-component/trigger": ^1.17.0 classnames: 2.x rc-motion: ^2.4.3 rc-overflow: ^1.3.1 @@ -14752,7 +14752,7 @@ __metadata: peerDependencies: react: ">=16.9.0" react-dom: ">=16.9.0" - checksum: 600f16a6d8b64ee90093786abdee3ad4663d4c4922ad7b568bc51dd9e5edbbd230ba93a8eae56d8d8ce070551ca12f3ae3c01d5e5b105a3d07a11245207fda6c + checksum: 3d7770defb882a444b21d6c437b0cf8759226a98233a50d48d0554bf2addab05c67544466b54c9bcc641d7859e7a9be84031d3493a521b697d56c9b9c2a0e7f3 languageName: node linkType: hard @@ -14773,7 +14773,7 @@ __metadata: languageName: node linkType: hard -"rc-motion@npm:^2.0.0, rc-motion@npm:^2.0.1, rc-motion@npm:^2.2.0, rc-motion@npm:^2.3.0, rc-motion@npm:^2.3.4, rc-motion@npm:^2.4.3, rc-motion@npm:^2.4.4, rc-motion@npm:^2.6.0, rc-motion@npm:^2.6.1, rc-motion@npm:^2.6.2, rc-motion@npm:^2.7.3, rc-motion@npm:^2.9.0": +"rc-motion@npm:^2.0.0, rc-motion@npm:^2.0.1, rc-motion@npm:^2.2.0, rc-motion@npm:^2.3.0, rc-motion@npm:^2.3.4, rc-motion@npm:^2.4.3, rc-motion@npm:^2.4.4, rc-motion@npm:^2.6.1, rc-motion@npm:^2.6.2, rc-motion@npm:^2.9.0": version: 2.9.0 resolution: "rc-motion@npm:2.9.0" dependencies: @@ -14802,18 +14802,18 @@ __metadata: languageName: node linkType: hard -"rc-notification@npm:~5.0.4": - version: 5.0.5 - resolution: "rc-notification@npm:5.0.5" +"rc-notification@npm:~5.3.0": + version: 5.3.0 + resolution: "rc-notification@npm:5.3.0" dependencies: "@babel/runtime": ^7.10.1 classnames: 2.x - rc-motion: ^2.6.0 + rc-motion: ^2.9.0 rc-util: ^5.20.1 peerDependencies: react: ">=16.9.0" react-dom: ">=16.9.0" - checksum: 47aee7887dae4d943303803cb74a908411eabdfcfb5154c82f834e0a4f0b934d07b8933907e513787ffc98de5f66e71537820bc48fb6cf8a24870919e6548036 + checksum: 1e6bc146e687815d784e0b4c626a9af82435086bc02bb5e19827baa523e26440d6ed03b43de83a15e0272b83bebede3b67d61c4d4af2240ae7dcdd6604f0ef58 languageName: node linkType: hard @@ -14845,17 +14845,17 @@ __metadata: languageName: node linkType: hard -"rc-pagination@npm:~3.5.0": - version: 3.5.0 - resolution: "rc-pagination@npm:3.5.0" +"rc-pagination@npm:~4.0.3": + version: 4.0.3 + resolution: "rc-pagination@npm:4.0.3" dependencies: "@babel/runtime": ^7.10.1 - classnames: ^2.2.1 - rc-util: ^5.32.2 + classnames: ^2.3.2 + rc-util: ^5.38.0 peerDependencies: react: ">=16.9.0" react-dom: ">=16.9.0" - checksum: 27ac05cdaf331ba571eb19fdaf79a2e3b6cb3575fce5f011f0de5abbe88db21a4292ef5323abab3a829ff6cda396444c664f88bd55226fa477f473282a8a868e + checksum: 7b238f0c9c2d7e3d0d42b54007ca3e60adae67b04455c186a3c9038c52257bdd1ff90690f0ca0087233b35a5132207a0c197e93caeb301ec41085d8162e052a3 languageName: node linkType: hard @@ -14878,9 +14878,9 @@ __metadata: languageName: node linkType: hard -"rc-picker@npm:~3.10.0": - version: 3.10.0 - resolution: "rc-picker@npm:3.10.0" +"rc-picker@npm:~3.14.6": + version: 3.14.6 + resolution: "rc-picker@npm:3.14.6" dependencies: "@babel/runtime": ^7.10.1 "@rc-component/trigger": ^1.5.0 @@ -14902,11 +14902,11 @@ __metadata: optional: true moment: optional: true - checksum: 908df48acfff11d62a64b11f12ceda10f424b3483ea2926ca25d5477609f0416559826ede78f2a0604682cc0e28a8c0ffdd98ee802746b1bee0f5b9890699df4 + checksum: e87914c6ffbbcf760b56080d8bf504cf9323885378a6769abcf9a62bb1325f7a9d534c065a683ab1d30269a26a81ce11a008d01aacc800359e3c7a4fbda66e17 languageName: node linkType: hard -"rc-progress@npm:~3.4.1, rc-progress@npm:~3.4.2": +"rc-progress@npm:~3.4.2": version: 3.4.2 resolution: "rc-progress@npm:3.4.2" dependencies: @@ -14920,6 +14920,20 @@ __metadata: languageName: node linkType: hard +"rc-progress@npm:~3.5.1": + version: 3.5.1 + resolution: "rc-progress@npm:3.5.1" + dependencies: + "@babel/runtime": ^7.10.1 + classnames: ^2.2.6 + rc-util: ^5.16.1 + peerDependencies: + react: ">=16.9.0" + react-dom: ">=16.9.0" + checksum: b0722a696396f985267e35e26f49c1c1bd6a17b4918eb93318fc36a7a5ffae9806932d4982a7da0d83349648ca85325b792003ec40240820fd6e00e0bc6f3c1d + languageName: node + linkType: hard + "rc-rate@npm:~2.12.0": version: 2.12.0 resolution: "rc-rate@npm:2.12.0" @@ -14948,7 +14962,7 @@ __metadata: languageName: node linkType: hard -"rc-resize-observer@npm:^1.0.0, rc-resize-observer@npm:^1.1.0, rc-resize-observer@npm:^1.2.0, rc-resize-observer@npm:^1.3.1": +"rc-resize-observer@npm:^1.0.0, rc-resize-observer@npm:^1.1.0, rc-resize-observer@npm:^1.3.1, rc-resize-observer@npm:^1.4.0": version: 1.4.0 resolution: "rc-resize-observer@npm:1.4.0" dependencies: @@ -14978,7 +14992,7 @@ __metadata: languageName: node linkType: hard -"rc-segmented@npm:~2.2.0": +"rc-segmented@npm:~2.2.2": version: 2.2.2 resolution: "rc-segmented@npm:2.2.2" dependencies: @@ -15011,21 +15025,21 @@ __metadata: languageName: node linkType: hard -"rc-select@npm:~14.5.0": - version: 14.5.2 - resolution: "rc-select@npm:14.5.2" +"rc-select@npm:~14.10.0": + version: 14.10.0 + resolution: "rc-select@npm:14.10.0" dependencies: "@babel/runtime": ^7.10.1 "@rc-component/trigger": ^1.5.0 classnames: 2.x rc-motion: ^2.0.1 - rc-overflow: ^1.0.0 + rc-overflow: ^1.3.1 rc-util: ^5.16.1 rc-virtual-list: ^3.5.2 peerDependencies: react: "*" react-dom: "*" - checksum: d3f55543eae15ac9bf56019345ad94268f9e063ede38c3d8c46dc59b1bc47c0f4c724613a9e9a6f4dc0d5bc0e31c7f7029e6bef717b335432818fbeea0f7398f + checksum: 1f922000e64338b7c43ba0e67429e482291f4e8d9e2d1977e0414171ff388050de4802c780baaa4e48c299b025c2334227382d3c47ca1f2888dbef83c73ab43e languageName: node linkType: hard @@ -15044,9 +15058,9 @@ __metadata: languageName: node linkType: hard -"rc-slider@npm:~10.1.0": - version: 10.1.1 - resolution: "rc-slider@npm:10.1.1" +"rc-slider@npm:~10.5.0": + version: 10.5.0 + resolution: "rc-slider@npm:10.5.0" dependencies: "@babel/runtime": ^7.10.1 classnames: ^2.2.5 @@ -15054,7 +15068,7 @@ __metadata: peerDependencies: react: ">=16.9.0" react-dom: ">=16.9.0" - checksum: 8df66142f1be00d31aaa45f3cf266fa30d03b70c74c734502389bbfacdb6741e149cd36dc1d3557d9dbb0194ed2733748366d888651d1120098338086419ba2c + checksum: 7d29cf4edee57615ab5d000cd1641216829988934db1e920243040615fa194147a4c2b065388b9d8e984a04424b67c997975fccde1e94ae85f66dca365934f1c languageName: node linkType: hard @@ -15130,55 +15144,56 @@ __metadata: languageName: node linkType: hard -"rc-table@npm:~7.32.1": - version: 7.32.3 - resolution: "rc-table@npm:7.32.3" +"rc-table@npm:~7.36.0": + version: 7.36.0 + resolution: "rc-table@npm:7.36.0" dependencies: "@babel/runtime": ^7.10.1 - "@rc-component/context": ^1.3.0 + "@rc-component/context": ^1.4.0 classnames: ^2.2.5 rc-resize-observer: ^1.1.0 - rc-util: ^5.27.1 + rc-util: ^5.37.0 + rc-virtual-list: ^3.11.1 peerDependencies: react: ">=16.9.0" react-dom: ">=16.9.0" - checksum: 19fede3528427c68c0c6df1e69532057d01a3e52a5a1929f965c0e3320045d72248f5771d1c7a301f1c5776469b32aae7b69b692f925cecfb14fd42ce6bbe50b + checksum: 4db1fbd348bd2ebde767f87e047abd07c60a2ddd054f74bf3193a6bf789714512c5aca36e946ee7491d08b202b625a652c7ac9f48d213f034816a6ad6d8dcffe languageName: node linkType: hard -"rc-tabs@npm:~12.5.10": - version: 12.5.10 - resolution: "rc-tabs@npm:12.5.10" +"rc-tabs@npm:~12.14.1": + version: 12.14.1 + resolution: "rc-tabs@npm:12.14.1" dependencies: "@babel/runtime": ^7.11.2 classnames: 2.x - rc-dropdown: ~4.0.0 - rc-menu: ~9.8.0 + rc-dropdown: ~4.1.0 + rc-menu: ~9.12.0 rc-motion: ^2.6.2 rc-resize-observer: ^1.0.0 - rc-util: ^5.16.0 + rc-util: ^5.34.1 peerDependencies: react: ">=16.9.0" react-dom: ">=16.9.0" - checksum: 0b26b61ce96f525c2d4c74b89561997176b8673c842d28f542cbc056cc26ee16953ea34d9a591b599872717a342ffbdded4e6115d95bcfe1ec594048fe669d31 + checksum: 6f8c39336670f7f21b970a4fcad73b711f45982c76ea2d83a4c00e7d06f707da21b107211548b16320cd13ba292eb5a4edccdc95179aaa88e6db24eea488e18c languageName: node linkType: hard -"rc-tabs@npm:~12.9.0": - version: 12.9.0 - resolution: "rc-tabs@npm:12.9.0" +"rc-tabs@npm:~12.5.10": + version: 12.5.10 + resolution: "rc-tabs@npm:12.5.10" dependencies: "@babel/runtime": ^7.11.2 classnames: 2.x - rc-dropdown: ~4.1.0 - rc-menu: ~9.10.0 + rc-dropdown: ~4.0.0 + rc-menu: ~9.8.0 rc-motion: ^2.6.2 rc-resize-observer: ^1.0.0 rc-util: ^5.16.0 peerDependencies: react: ">=16.9.0" react-dom: ">=16.9.0" - checksum: a8ab132f3e2f5dfc933e6942962ea3c13a0aa9b88c498d9183901f0124c92d60692fe5e9ee34bfa67dfce3b8ee426d999f9dd465617fde755a27dfbdd6fcd134 + checksum: 0b26b61ce96f525c2d4c74b89561997176b8673c842d28f542cbc056cc26ee16953ea34d9a591b599872717a342ffbdded4e6115d95bcfe1ec594048fe669d31 languageName: node linkType: hard @@ -15198,19 +15213,19 @@ __metadata: languageName: node linkType: hard -"rc-textarea@npm:~1.3.0, rc-textarea@npm:~1.3.2": - version: 1.3.4 - resolution: "rc-textarea@npm:1.3.4" +"rc-textarea@npm:~1.5.0, rc-textarea@npm:~1.5.3": + version: 1.5.3 + resolution: "rc-textarea@npm:1.5.3" dependencies: "@babel/runtime": ^7.10.1 classnames: ^2.2.1 - rc-input: ~1.1.0 + rc-input: ~1.3.5 rc-resize-observer: ^1.0.0 rc-util: ^5.27.0 peerDependencies: react: ">=16.9.0" react-dom: ">=16.9.0" - checksum: b91ca6e3ebd906c7ca020f74e0d9f6cf6fc423b426b41480c9b46cfbd78a586bb89447aa3eaeb0f9b04259ce36aa477d3f2a428ead05227e80209661079a1ca3 + checksum: 44ca7e5b62938c18ef57f80f9ed08dcadc6b741dd420a53b1afcbd3d7c23d72bc5335b28e17fa70782f699cd9d1108f8be56db3e326c6abd364a1cbe8c480b43 languageName: node linkType: hard @@ -15228,17 +15243,33 @@ __metadata: languageName: node linkType: hard -"rc-tooltip@npm:~6.0.0": - version: 6.0.1 - resolution: "rc-tooltip@npm:6.0.1" +"rc-tooltip@npm:~6.1.2": + version: 6.1.2 + resolution: "rc-tooltip@npm:6.1.2" dependencies: "@babel/runtime": ^7.11.2 - "@rc-component/trigger": ^1.0.4 + "@rc-component/trigger": ^1.18.0 classnames: ^2.3.1 peerDependencies: react: ">=16.9.0" react-dom: ">=16.9.0" - checksum: fe7f617a4f4e0085d8f5eb5e8da5598f0164841c841f62f77966706ae604491246441a469aeb44f1dec7001bb4716ee81d11ec646e8889f4164fcba3a024eea5 + checksum: 0450fe0bac954fe13cc1117cef1e632ec65e5fbb7bc9d31069925e7df026ff39211cad95509ec93500541bf55e70efaf0ee99694fdd18deac7e804b1b3f72240 + languageName: node + linkType: hard + +"rc-tree-select@npm:~5.15.0": + version: 5.15.0 + resolution: "rc-tree-select@npm:5.15.0" + dependencies: + "@babel/runtime": ^7.10.1 + classnames: 2.x + rc-select: ~14.10.0 + rc-tree: ~5.8.1 + rc-util: ^5.16.1 + peerDependencies: + react: "*" + react-dom: "*" + checksum: 34ed86e65a5ab0a3b80f25ccced3c1d4641621638cf4d5953af8420306a513e93194a9e30f5e689e4e4e8b44f1461b82b5443f71d72f6ca72e1f612487e09d87 languageName: node linkType: hard @@ -15258,25 +15289,25 @@ __metadata: languageName: node linkType: hard -"rc-tree-select@npm:~5.9.0": - version: 5.9.0 - resolution: "rc-tree-select@npm:5.9.0" +"rc-tree@npm:~5.7.0, rc-tree@npm:~5.7.12": + version: 5.7.12 + resolution: "rc-tree@npm:5.7.12" dependencies: "@babel/runtime": ^7.10.1 classnames: 2.x - rc-select: ~14.5.0 - rc-tree: ~5.7.0 + rc-motion: ^2.0.1 rc-util: ^5.16.1 + rc-virtual-list: ^3.5.1 peerDependencies: react: "*" react-dom: "*" - checksum: 35114024de35c59b2b56df77aa5b1ad6d262ae6ac5a02b68a425af598420e98d08a12dfa64f68578d4293166032239647d5c03a9c089aef49b33b5cfc4be9306 + checksum: 107a85407c774616cd06bc54164f3413d4e85fbe0909efee16d6bf45486ee624ba67ff07e523c25249724d6be99ec155a2503d89e14d5b3ed28acf06b4cdabab languageName: node linkType: hard -"rc-tree@npm:~5.7.0, rc-tree@npm:~5.7.12, rc-tree@npm:~5.7.6": - version: 5.7.12 - resolution: "rc-tree@npm:5.7.12" +"rc-tree@npm:~5.8.1, rc-tree@npm:~5.8.2": + version: 5.8.2 + resolution: "rc-tree@npm:5.8.2" dependencies: "@babel/runtime": ^7.10.1 classnames: 2.x @@ -15286,7 +15317,7 @@ __metadata: peerDependencies: react: "*" react-dom: "*" - checksum: 107a85407c774616cd06bc54164f3413d4e85fbe0909efee16d6bf45486ee624ba67ff07e523c25249724d6be99ec155a2503d89e14d5b3ed28acf06b4cdabab + checksum: 74802b2e670fd6696e294ba6eeb20381feab5704e8f92de981725e56b00070c87ef0c2ece2846566715ee7420878743cd22d3443235732282400b6e475ecff36 languageName: node linkType: hard @@ -15306,7 +15337,7 @@ __metadata: languageName: node linkType: hard -"rc-upload@npm:~4.3.0, rc-upload@npm:~4.3.5": +"rc-upload@npm:~4.3.5": version: 4.3.5 resolution: "rc-upload@npm:4.3.5" dependencies: @@ -15320,7 +15351,7 @@ __metadata: languageName: node linkType: hard -"rc-util@npm:^5.0.1, rc-util@npm:^5.0.6, rc-util@npm:^5.16.0, rc-util@npm:^5.16.1, rc-util@npm:^5.17.0, rc-util@npm:^5.18.1, rc-util@npm:^5.19.2, rc-util@npm:^5.2.0, rc-util@npm:^5.2.1, rc-util@npm:^5.20.1, rc-util@npm:^5.21.0, rc-util@npm:^5.21.2, rc-util@npm:^5.22.5, rc-util@npm:^5.23.0, rc-util@npm:^5.24.4, rc-util@npm:^5.25.2, rc-util@npm:^5.26.0, rc-util@npm:^5.27.0, rc-util@npm:^5.27.1, rc-util@npm:^5.28.0, rc-util@npm:^5.30.0, rc-util@npm:^5.31.1, rc-util@npm:^5.32.0, rc-util@npm:^5.32.2, rc-util@npm:^5.34.1, rc-util@npm:^5.35.0, rc-util@npm:^5.36.0, rc-util@npm:^5.37.0, rc-util@npm:^5.38.0, rc-util@npm:^5.4.0, rc-util@npm:^5.6.1, rc-util@npm:^5.8.0, rc-util@npm:^5.9.4": +"rc-util@npm:^5.0.1, rc-util@npm:^5.0.6, rc-util@npm:^5.16.0, rc-util@npm:^5.16.1, rc-util@npm:^5.17.0, rc-util@npm:^5.18.1, rc-util@npm:^5.19.2, rc-util@npm:^5.2.0, rc-util@npm:^5.2.1, rc-util@npm:^5.20.1, rc-util@npm:^5.21.0, rc-util@npm:^5.21.2, rc-util@npm:^5.22.5, rc-util@npm:^5.23.0, rc-util@npm:^5.24.4, rc-util@npm:^5.25.2, rc-util@npm:^5.26.0, rc-util@npm:^5.27.0, rc-util@npm:^5.28.0, rc-util@npm:^5.30.0, rc-util@npm:^5.31.1, rc-util@npm:^5.32.2, rc-util@npm:^5.34.1, rc-util@npm:^5.35.0, rc-util@npm:^5.36.0, rc-util@npm:^5.37.0, rc-util@npm:^5.38.0, rc-util@npm:^5.38.1, rc-util@npm:^5.4.0, rc-util@npm:^5.6.1, rc-util@npm:^5.8.0, rc-util@npm:^5.9.4": version: 5.38.1 resolution: "rc-util@npm:5.38.1" dependencies: @@ -15333,7 +15364,7 @@ __metadata: languageName: node linkType: hard -"rc-virtual-list@npm:^3.2.0, rc-virtual-list@npm:^3.5.1, rc-virtual-list@npm:^3.5.2": +"rc-virtual-list@npm:^3.11.1, rc-virtual-list@npm:^3.2.0, rc-virtual-list@npm:^3.5.1, rc-virtual-list@npm:^3.5.2": version: 3.11.3 resolution: "rc-virtual-list@npm:3.11.3" dependencies: @@ -16741,7 +16772,7 @@ __metadata: languageName: node linkType: hard -"scroll-into-view-if-needed@npm:^3.0.3": +"scroll-into-view-if-needed@npm:^3.1.0": version: 3.1.0 resolution: "scroll-into-view-if-needed@npm:3.1.0" dependencies: diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/model/User.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/model/User.java index 507fa05e2..80efd4ac5 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/model/User.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/model/User.java @@ -46,6 +46,8 @@ public class User extends HasIdAndAuditing implements BeforeMongodbWrite, AfterM private Boolean isEnabled = true; + private String activeAuthId; + // used in form login @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) private String password; diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/service/UserServiceImpl.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/service/UserServiceImpl.java index 49fc9f478..e7526be8d 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/service/UserServiceImpl.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/service/UserServiceImpl.java @@ -210,7 +210,10 @@ public Mono<Boolean> addNewConnection(String userId, Connection connection) { @Override public Mono<User> addNewConnectionAndReturnUser(String userId, Connection connection) { return findById(userId) - .doOnNext(user -> user.getConnections().add(connection)) + .doOnNext(user -> { + user.getConnections().add(connection); + user.setActiveAuthId(connection.getAuthId()); + }) .flatMap(repository::save); } diff --git a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/serverlog/ServerLog.java b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/serverlog/ServerLog.java index 4ce13d0c4..addf42bc3 100644 --- a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/serverlog/ServerLog.java +++ b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/serverlog/ServerLog.java @@ -15,6 +15,7 @@ @Builder public class ServerLog { private String userId; + private String orgId; private String urlPath; private String httpMethod; private String requestBody; @@ -22,8 +23,9 @@ public class ServerLog { private long createTime; @JsonCreator - private ServerLog(String userId, String urlPath, String httpMethod, String requestBody, Map<String, String> queryParameters, long createTime) { + private ServerLog(String userId, String orgId, String urlPath, String httpMethod, String requestBody, Map<String, String> queryParameters, long createTime) { this.userId = userId; + this.orgId = orgId; this.urlPath = urlPath; this.createTime = createTime; this.httpMethod = httpMethod; diff --git a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/serverlog/ServerLogRepository.java b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/serverlog/ServerLogRepository.java index bb6ecae8b..7e09a9151 100644 --- a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/serverlog/ServerLogRepository.java +++ b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/serverlog/ServerLogRepository.java @@ -1,8 +1,13 @@ package org.lowcoder.infra.serverlog; import org.springframework.data.mongodb.repository.ReactiveMongoRepository; +import reactor.core.publisher.Mono; public interface ServerLogRepository extends ReactiveMongoRepository<ServerLog, String> { + Mono<Long> countByOrgId(String orgId); + + Mono<Long> countByOrgIdAndCreateTimeBetween(String orgId, Long startMonthEpoch, Long endMonthEpoch); + } diff --git a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/serverlog/ServerLogService.java b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/serverlog/ServerLogService.java index 8b9a38c64..e975ba407 100644 --- a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/serverlog/ServerLogService.java +++ b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/serverlog/ServerLogService.java @@ -2,6 +2,9 @@ import static org.lowcoder.infra.perf.PerfEvent.SERVER_LOG_BATCH_INSERT; +import java.time.LocalDateTime; +import java.time.ZoneOffset; +import java.time.temporal.TemporalAdjusters; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.TimeUnit; @@ -13,6 +16,7 @@ import org.springframework.stereotype.Service; import io.micrometer.core.instrument.Tags; +import reactor.core.publisher.Mono; @Service public class ServerLogService { @@ -42,4 +46,14 @@ private void scheduledInsert() { perfHelper.count(SERVER_LOG_BATCH_INSERT, Tags.of("size", String.valueOf(result.size()))); }); } + + public Mono<Long> getApiUsageCount(String orgId, Boolean lastMonthOnly) { + if(lastMonthOnly != null && lastMonthOnly) { + Long startMonthEpoch = LocalDateTime.now().minusMonths(1).with(TemporalAdjusters.firstDayOfMonth()).toEpochSecond(ZoneOffset.UTC)*1000; + Long endMonthEpoch = LocalDateTime.now().minusMonths(1).with(TemporalAdjusters.lastDayOfMonth()).toEpochSecond(ZoneOffset.UTC)*1000; + return serverLogRepository.countByOrgIdAndCreateTimeBetween(orgId, startMonthEpoch, endMonthEpoch); + } + return serverLogRepository.countByOrgId(orgId); + } + } diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/request/oauth2/request/KeycloakRequest.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/request/oauth2/request/KeycloakRequest.java index 7aeecd073..08bc68e97 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/request/oauth2/request/KeycloakRequest.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/request/oauth2/request/KeycloakRequest.java @@ -94,6 +94,7 @@ protected Mono<AuthToken> refreshAuthToken(String refreshToken) { .accessToken(MapUtils.getString(map, "access_token")) .expireIn(MapUtils.getIntValue(map, "expires_in")) .refreshToken(MapUtils.getString(map, "refresh_token")) + .refreshTokenExpireIn(MapUtils.getIntValue(map, "refresh_expires_in")) .build(); return Mono.just(authToken); }); diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/service/AuthenticationApiServiceImpl.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/service/AuthenticationApiServiceImpl.java index ad6e3101b..166801e7d 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/service/AuthenticationApiServiceImpl.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/service/AuthenticationApiServiceImpl.java @@ -242,6 +242,8 @@ public void updateConnection(AuthUser authUser, User user) { oldConnection.setAuthConnectionAuthToken( Optional.ofNullable(authUser.getAuthToken()).map(ConnectionAuthToken::of).orElse(null)); oldConnection.setRawUserInfo(authUser.getRawUserInfo()); + + user.setActiveAuthId(oldConnection.getAuthId()); } @SuppressWarnings("OptionalGetWithoutIsPresent") diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/filter/GlobalContextFilter.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/filter/GlobalContextFilter.java index 3d30f5c89..fe7c889ea 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/filter/GlobalContextFilter.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/filter/GlobalContextFilter.java @@ -71,18 +71,7 @@ public class GlobalContextFilter implements WebFilter, Ordered { public Mono<Void> filter(@Nonnull ServerWebExchange exchange, @Nonnull WebFilterChain chain) { return sessionUserService.getVisitorId() - .doOnNext(visitorId -> { - if (isAnonymousUser(visitorId)) { - return; - } - ServerLog serverLog = ServerLog.builder() - .userId(visitorId) - .urlPath(exchange.getRequest().getPath().toString()) - .httpMethod(Optional.ofNullable(exchange.getRequest().getMethod()).map(HttpMethod::name).orElse("")) - .createTime(System.currentTimeMillis()) - .build(); - serverLogService.record(serverLog); - }) + .flatMap(visitorId -> saveServerLog(exchange, visitorId)) .flatMap(visitorId -> chain.filter(exchange) .contextWrite(ctx -> { Map<String, Object> contextMap = buildContextMap(exchange, visitorId); @@ -95,6 +84,27 @@ public Mono<Void> filter(@Nonnull ServerWebExchange exchange, @Nonnull WebFilter })); } + private Mono<String> saveServerLog(ServerWebExchange exchange, String visitorId) { + if (isAnonymousUser(visitorId)) { + return Mono.just(visitorId); + } + + return orgMemberService + .getCurrentOrgMember(visitorId) + .map(orgMember -> { + ServerLog serverLog = ServerLog.builder() + .orgId(orgMember.getOrgId()) + .userId(visitorId) + .urlPath(exchange.getRequest().getPath().toString()) + .httpMethod(Optional.ofNullable(exchange.getRequest().getMethod()).map(HttpMethod::name).orElse("")) + .createTime(System.currentTimeMillis()) + .build(); + serverLogService.record(serverLog); + return visitorId; + }); + + } + private Map<String, Object> buildContextMap(ServerWebExchange serverWebExchange, String visitorId) { ServerHttpRequest request = serverWebExchange.getRequest(); Map<String, Object> contextMap = request.getHeaders().toSingleValueMap().entrySet() diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/filter/UserSessionPersistenceFilter.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/filter/UserSessionPersistenceFilter.java index b8adbda1f..4804d16a4 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/filter/UserSessionPersistenceFilter.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/filter/UserSessionPersistenceFilter.java @@ -1,15 +1,18 @@ package org.lowcoder.api.framework.filter; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.tuple.Triple; import org.lowcoder.api.authentication.request.AuthRequest; import org.lowcoder.api.authentication.request.AuthRequestFactory; import org.lowcoder.api.authentication.request.oauth2.OAuth2RequestContext; import org.lowcoder.api.authentication.service.AuthenticationApiServiceImpl; import org.lowcoder.api.home.SessionUserService; import org.lowcoder.domain.authentication.AuthenticationService; -import org.lowcoder.domain.authentication.FindAuthConfig; import org.lowcoder.domain.authentication.context.AuthRequestContext; import org.lowcoder.domain.user.model.AuthUser; +import org.lowcoder.domain.user.model.Connection; +import org.lowcoder.domain.user.model.User; +import org.lowcoder.domain.user.service.UserService; import org.lowcoder.sdk.util.CookieHelper; import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.WebFilter; @@ -18,8 +21,7 @@ import javax.annotation.Nonnull; import java.time.Instant; -import java.util.LinkedList; -import java.util.List; +import java.util.Optional; import static org.lowcoder.api.authentication.util.AuthenticationUtils.toAuthentication; import static org.lowcoder.domain.authentication.AuthenticationService.DEFAULT_AUTH_CONFIG; @@ -29,6 +31,8 @@ public class UserSessionPersistenceFilter implements WebFilter { private final SessionUserService service; + + private final UserService userService; private final CookieHelper cookieHelper; private final AuthenticationService authenticationService; @@ -37,9 +41,10 @@ public class UserSessionPersistenceFilter implements WebFilter { private final AuthRequestFactory<AuthRequestContext> authRequestFactory; - public UserSessionPersistenceFilter(SessionUserService service, CookieHelper cookieHelper, AuthenticationService authenticationService, + public UserSessionPersistenceFilter(SessionUserService service, UserService userService, CookieHelper cookieHelper, AuthenticationService authenticationService, AuthenticationApiServiceImpl authenticationApiService, AuthRequestFactory<AuthRequestContext> authRequestFactory) { this.service = service; + this.userService = userService; this.cookieHelper = cookieHelper; this.authenticationService = authenticationService; this.authenticationApiService = authenticationApiService; @@ -52,48 +57,88 @@ public Mono<Void> filter(@Nonnull ServerWebExchange exchange, WebFilterChain cha String cookieToken = cookieHelper.getCookieToken(exchange); return service.resolveSessionUserFromCookie(cookieToken) .switchIfEmpty(chain.filter(exchange).then(Mono.empty())) - .doOnNext(user -> { + .map(user -> { - List<String> tokensToRemove = new LinkedList<>(); + Connection activeConnection = null; + String orgId = null; - user.getConnections().forEach(connection -> { - if(!connection.getAuthId().equals(DEFAULT_AUTH_CONFIG.getId())) { - Instant next5Minutes = Instant.now().plusSeconds( 300 ); - if(connection.getAuthConnectionAuthToken().getExpireAt() == 0) { - return; - } - boolean isAccessTokenExpiryNear = (connection.getAuthConnectionAuthToken().getExpireAt()*1000) <= next5Minutes.toEpochMilli(); - if(isAccessTokenExpiryNear) { - connection.getOrgIds().forEach(orgId -> { - authenticationService.findAuthConfigByAuthId(orgId, connection.getAuthId()) - .doOnSuccess(findAuthConfig -> { - if(findAuthConfig == null) { - return; - } - OAuth2RequestContext oAuth2RequestContext = new OAuth2RequestContext(orgId, null, null); - oAuth2RequestContext.setAuthConfig(findAuthConfig.authConfig()); - AuthRequest authRequest = authRequestFactory.build(oAuth2RequestContext).block(); - try { - AuthUser authUser = authRequest.refresh(connection.getAuthConnectionAuthToken().getRefreshToken()).block(); - authUser.setAuthContext(oAuth2RequestContext); - authenticationApiService.updateConnection(authUser, user); - } catch (Exception e) { - log.error("Failed to refresh access token. Removing user sessions/tokens."); - tokensToRemove.addAll(connection.getTokens()); - } - }); - }); + Optional<Connection> activeConnectionOptional = user.getConnections() + .stream() + .filter(connection -> connection.getAuthId().equals(user.getActiveAuthId())) + .findFirst(); + + if(!activeConnectionOptional.isPresent()) { + return Triple.of(user, activeConnection, orgId); + } + + activeConnection = activeConnectionOptional.get(); + + if(!activeConnection.getAuthId().equals(DEFAULT_AUTH_CONFIG.getId())) { + if(activeConnection.getAuthConnectionAuthToken().getExpireAt() == 0) { + return Triple.of(user, activeConnection, orgId); + } + boolean isAccessTokenExpired = (activeConnection.getAuthConnectionAuthToken().getExpireAt()*1000) < Instant.now().toEpochMilli(); + if(isAccessTokenExpired) { + + Optional<String> orgIdOptional = activeConnection.getOrgIds().stream().findFirst(); + if(!orgIdOptional.isPresent()) { + return Triple.of(user, activeConnection, orgId); } + orgId = orgIdOptional.get(); } - }); + } - tokensToRemove.forEach(token -> { - service.removeUserSession(token).block(); - }); + return Triple.of(user, activeConnection, orgId); - }) + }).flatMap(this::refreshOauthToken) .flatMap(user -> chain.filter(exchange).contextWrite(withAuthentication(toAuthentication(user))) .then(service.extendValidity(cookieToken)) ); } + + private Mono<User> refreshOauthToken(Triple<User, Connection, String> triple) { + + User user = triple.getLeft(); + Connection connection = triple.getMiddle(); + String orgId = triple.getRight(); + + if (connection == null || orgId == null) { + return Mono.just(user); + } + + OAuth2RequestContext oAuth2RequestContext = new OAuth2RequestContext(triple.getRight(), null, null); + + return authenticationService + .findAuthConfigByAuthId(orgId, connection.getAuthId()) + .switchIfEmpty(Mono.empty()) + .flatMap(findAuthConfig -> { + + Mono<AuthRequest> authRequestMono = Mono.empty(); + + if(findAuthConfig == null) { + return authRequestMono; + } + oAuth2RequestContext.setAuthConfig(findAuthConfig.authConfig()); + + return authRequestFactory.build(oAuth2RequestContext); + }).flatMap(authRequest -> { + if(authRequest == null) { + return Mono.just(user); + } + try { + AuthUser authUser = authRequest.refresh(connection.getAuthConnectionAuthToken().getRefreshToken()).block(); + authUser.setAuthContext(oAuth2RequestContext); + authenticationApiService.updateConnection(authUser, user); + return userService.update(user.getId(), user); + } catch (Exception e) { + log.error("Failed to refresh access token. Removing user sessions/tokens."); + connection.getTokens().forEach(token -> { + service.removeUserSession(token).block(); + }); + } + return Mono.just(user); + }); + + } + } diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/security/SecurityConfig.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/security/SecurityConfig.java index c57c3fabc..376fc3c4b 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/security/SecurityConfig.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/security/SecurityConfig.java @@ -10,6 +10,7 @@ import org.lowcoder.domain.authentication.AuthenticationService; import org.lowcoder.domain.authentication.context.AuthRequestContext; import org.lowcoder.domain.user.model.User; +import org.lowcoder.domain.user.service.UserService; import org.lowcoder.infra.constant.NewUrl; import org.lowcoder.sdk.config.CommonConfig; import org.lowcoder.sdk.util.CookieHelper; @@ -50,6 +51,9 @@ public class SecurityConfig { @Autowired private SessionUserService sessionUserService; + @Autowired + private UserService userService; + @Autowired private AccessDeniedHandler accessDeniedHandler; @@ -153,7 +157,7 @@ SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) { .accessDeniedHandler(accessDeniedHandler) ); - http.addFilterBefore(new UserSessionPersistenceFilter(sessionUserService, cookieHelper, authenticationService, authenticationApiService, authRequestFactory), SecurityWebFiltersOrder.AUTHENTICATION); + http.addFilterBefore(new UserSessionPersistenceFilter(sessionUserService, userService, cookieHelper, authenticationService, authenticationApiService, authRequestFactory), SecurityWebFiltersOrder.AUTHENTICATION); http.addFilterBefore(new APIKeyAuthFilter(sessionUserService, cookieHelper, jwtUtils), SecurityWebFiltersOrder.AUTHENTICATION); return http.build(); diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/OrgApiService.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/OrgApiService.java index 2990d8047..a62ca6d75 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/OrgApiService.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/OrgApiService.java @@ -13,6 +13,7 @@ import reactor.core.publisher.Mono; + public interface OrgApiService { Mono<Boolean> leaveOrganization(String orgId); @@ -45,5 +46,7 @@ public interface OrgApiService { Mono<Boolean> tryAddUserToOrgAndSwitchOrg(String orgId, String userId); Mono<ConfigView> getOrganizationConfigs(String orgId); + + Mono<Long> getApiUsageCount(String orgId, Boolean lastMonthOnly); } diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/OrgApiServiceImpl.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/OrgApiServiceImpl.java index f50b0018b..6663e09cb 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/OrgApiServiceImpl.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/OrgApiServiceImpl.java @@ -38,6 +38,7 @@ import org.lowcoder.domain.user.model.Connection; import org.lowcoder.domain.user.model.User; import org.lowcoder.domain.user.service.UserService; +import org.lowcoder.infra.serverlog.ServerLogService; import org.lowcoder.sdk.auth.AbstractAuthConfig; import org.lowcoder.sdk.config.CommonConfig; import org.lowcoder.sdk.config.CommonConfig.Workspace; @@ -76,6 +77,9 @@ public class OrgApiServiceImpl implements OrgApiService { @Autowired private AuthenticationService authenticationService; + @Autowired + private ServerLogService serverLogService; + @Override public Mono<OrgMemberListView> getOrganizationMembers(String orgId, int page, int count) { return sessionUserService.getVisitorId() @@ -373,6 +377,12 @@ public Mono<ConfigView> getOrganizationConfigs(String orgId) { }); } + @Override + public Mono<Long> getApiUsageCount(String orgId, Boolean lastMonthOnly) { + return checkVisitorAdminRole(orgId) + .flatMap(orgMember -> serverLogService.getApiUsageCount(orgId, lastMonthOnly)); + } + private Mono<Void> checkIfSaasMode() { return Mono.defer(() -> { if (commonConfig.getWorkspace().getMode() == WorkspaceMode.ENTERPRISE) { diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/OrganizationController.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/OrganizationController.java index 919d230e0..484b1aead 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/OrganizationController.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/OrganizationController.java @@ -126,4 +126,10 @@ public Mono<ResponseView<Boolean>> updateOrgCommonSettings(@PathVariable String .map(ResponseView::success); } + @Override + public Mono<ResponseView<Long>> getOrgApiUsageCount(String orgId, Boolean lastMonthOnly) { + return orgApiService.getApiUsageCount(orgId, lastMonthOnly) + .map(ResponseView::success); + } + } \ No newline at end of file diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/OrganizationEndpoints.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/OrganizationEndpoints.java index 93fcfe3a4..a5ba2774c 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/OrganizationEndpoints.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/OrganizationEndpoints.java @@ -160,6 +160,15 @@ public Mono<ResponseView<Boolean>> removeUserFromOrg(@PathVariable String orgId, @PutMapping("/{orgId}/common-settings") public Mono<ResponseView<Boolean>> updateOrgCommonSettings(@PathVariable String orgId, @RequestBody UpdateOrgCommonSettingsRequest request); + @Operation( + tags = TAG_ORGANIZATION_MANAGEMENT, + operationId = "getOrgApiUsageCount", + summary = "Get the api usage count for the org", + description = "Calculate the used api calls for this organization and return the count" + ) + @GetMapping("/{orgId}/api-usage") + public Mono<ResponseView<Long>> getOrgApiUsageCount(@PathVariable String orgId, @RequestParam(required = false) Boolean lastMonthOnly); + public record UpdateOrgCommonSettingsRequest(String key, Object value) { } diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/runner/migrations/DatabaseChangelog.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/runner/migrations/DatabaseChangelog.java index 67d1a0d9f..90d62e98b 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/runner/migrations/DatabaseChangelog.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/runner/migrations/DatabaseChangelog.java @@ -175,6 +175,13 @@ public void completeAuthType(CompleteAuthType completeAuthType) { completeAuthType.complete(); } + @ChangeSet(order = "019", id = "add-org-id-index-on-server-log", author = "") + public void addOrgIdIndexOnServerLog(MongockTemplate mongoTemplate) { + ensureIndexes(mongoTemplate, ServerLog.class, + makeIndex("orgId") + ); + } + public static Index makeIndex(String... fields) { if (fields.length == 1) { return new Index(fields[0], Sort.Direction.ASC).named(fields[0]);