From a35a815a55ebd95761bc5d24a78547630ba4b335 Mon Sep 17 00:00:00 2001 From: Ludo Mikula Date: Sun, 7 Jan 2024 17:50:51 +0100 Subject: [PATCH 01/25] fix: updated helm chart to reflect all recent changes --- deploy/helm/Chart.yaml | 2 +- deploy/helm/README.md | 50 ++++++++----------- .../helm/templates/api-service/configMap.yaml | 18 ++++--- .../helm/templates/api-service/secrets.yaml | 6 +-- deploy/helm/templates/frontend/configMap.yaml | 14 +++--- .../templates/node-service/configMap.yaml | 8 +-- deploy/helm/values.yaml | 44 +++++++++------- 7 files changed, 74 insertions(+), 68 deletions(-) diff --git a/deploy/helm/Chart.yaml b/deploy/helm/Chart.yaml index b09168049..0e6538eaf 100644 --- a/deploy/helm/Chart.yaml +++ b/deploy/helm/Chart.yaml @@ -4,7 +4,7 @@ description: A Helm chart for Kubernetes for installing lowcoder type: application # Chart version (change every time you make changes to the chart) -version: 0.1.0 +version: 1.0.0 # Lowcoder version appVersion: "latest" diff --git a/deploy/helm/README.md b/deploy/helm/README.md index a9854f7a4..a1bff4154 100644 --- a/deploy/helm/README.md +++ b/deploy/helm/README.md @@ -38,6 +38,27 @@ $ helm delete -n lowcoder my-lowcoder ## Parameters +## Global + +| Name | Description | Value | +| --------------------------------------- | --------------------------------------------------------------------------------- | -------------- | +| `global.config.userId` | User ID of user running Lowcoder server application in container | `9001` | +| `global.config.groupId` | Group ID of user running Lowcoder server application in container | `9001` | +| `global.config.corsAllowedDomains` | CORS allowed domains | `*` | +| `global.config.enableUserSignUp` | Enable users signing up to lowcoder via login page | `true` | +| `global.config.encryption.password` | Encryption password - CHANGE IT! | `lowcoder.org` | +| `global.config.encryption.salt` | Encryption salt - CHANGE IT! | `lowcoder.org` | +| `global.config.apiKeySecret` | API-KEY secret, should be a string of at least 32 random characters - CHANGE IT | `5a41b090758b39b226603177ef48d73ae9839dd458ccb7e66f7e7cc028d5a50b` | +| `global.config.maxQueryTimeout` | Maximum query timeout in seconds | `120` | +| `global.config.maxRequestSize` | Maximum request size | `20m` | +| `global.config.nodeServiceUrl` | URL to node-service server if using external one (disabled by default) | | +| `global.config.apiServiceUrl` | URL to api-service server if using external one (disabled by default) | | +| `global.defaults.maxOrgsPerUser` | Maximum allowed organizations per user | `100` | +| `global.defaults.maxMembersPerOrg` | Maximum allowed members per organization | `1000` | +| `global.defaults.maxGroupsPerOrg` | Maximum groups allowed per organization | `100` | +| `global.defaults.maxAppsPerOrg` | Maximum allowed applications per organization | `1000` | +| `global.defaults.maxDevelopers` | Maximum allowed developer accounts | `100` | + ### Redis | Name | Description | Value | @@ -56,32 +77,3 @@ All available parameters can be found in [Bitnami Redis Chart](https://github.co All available parameters can be found in [Bitnami MongoDB Chart](https://github.com/bitnami/charts/tree/main/bitnami/mongodb/#parameters) -### Lowcoder server api-service - -| Name | Description | Value | -| --------------------------------------- | --------------------------------------------------------------------------- | ---------------- | -| `apiService.config.userId` | User ID of user running Lowcoder server application in container | `9001` | -| `apiService.config.groupId` | Group ID of user running Lowcoder server application in container | `9001` | -| `apiService.config.corsAllowedDomains` | CORS allowed domains | `*` | -| `apiService.config.encryption.password` | Encryption password | `lowcoder.org` | -| `apiService.config.encryption.salt` | Encryption salt | `lowcoder.org` | -| `apiService.config.enableUserSignUp` | Enable users signing up to lowcoder via login page | `true` | -| `apiService.config.nodeServiceUrl` | URL to node-service server if using external Lowcoder server | | - -### Lowcoder server node-service - -| Name | Description | Value | -| --------------------------------------- | --------------------------------------------------------------------------- | ---------------- | -| `nodeService.config.userId` | User ID of user running Lowcoder service application in container | `9001` | -| `nodeService.config.groupId` | Group ID of user running Lowcoder service application in container | `9001` | -| `nodeService.config.apiServiceUrl` | URL to api-service server if using external Lowcoder server | | - -### Lowcoder frontend (client) - -| Name | Description | Value | -| --------------------------------------- | --------------------------------------------------------------------------- | ---------------- | -| `frontend.config.userId` | User ID of nginx user running Lowcoder client application in container | `9001` | -| `frontend.config.groupId` | Group ID of nginx user running Lowcoder client application in container | `9001` | -| `frontend.config.apiServiceUrl` | URL to api-service server if using external Lowcoder server | `""` | -| `frontend.config.nodeServiceUrl` | URL to node-service server if using external Lowcoder server | | - diff --git a/deploy/helm/templates/api-service/configMap.yaml b/deploy/helm/templates/api-service/configMap.yaml index 6ea3f796b..aa3804de9 100644 --- a/deploy/helm/templates/api-service/configMap.yaml +++ b/deploy/helm/templates/api-service/configMap.yaml @@ -17,13 +17,19 @@ data: {{- else }} REDIS_URL: {{ .Values.redis.externalUrl | quote }} {{- end }} - {{- if .Values.apiService.nodeServiceUrl }} - LOWCODER_NODE_SERVICE_URL: {{ .Values.apiService.nodeServiceUrl | quote }} + {{- if .Values.global.config.nodeServiceUrl }} + LOWCODER_NODE_SERVICE_URL: {{ .Values.global.config.nodeServiceUrl | quote }} {{- else }} LOWCODER_NODE_SERVICE_URL: "http://{{ $name }}-node-service:{{ .Values.nodeService.service.port }}" {{- end }} - PUID: {{ .Values.apiService.config.userId | default "9001" | quote }} - PGID: {{ .Values.apiService.config.groupId | default "9001" | quote }} - CORS_ALLOWED_DOMAINS: {{ .Values.apiService.config.corsAllowedDomains | default "*" | quote }} - ENABLE_USER_SIGN_UP: {{ .Values.apiService.config.enableUserSignUp | default "true" | quote }} + PUID: {{ .Values.global.config.userId | default "9001" | quote }} + PGID: {{ .Values.global.config.groupId | default "9001" | quote }} + CORS_ALLOWED_DOMAINS: {{ .Values.global.config.corsAllowedDomains | default "*" | quote }} + ENABLE_USER_SIGN_UP: {{ .Values.global.config.enableUserSignUp | default "true" | quote }} + LOWCODER_MAX_QUERY_TIMEOUT: {{ .Values.global.config.maxQueryTimeout | default "120" | quote }} + DEFAULT_ORGS_PER_USER: {{ .Values.global.defaults.maxOrgsPerUser | default "100" | quote }} + DEFAULT_ORG_MEMBER_COUNT: {{ .Values.global.defaults.maxMembersPerOrg | default "1000" | quote }} + DEFAULT_ORG_GROUP_COUNT: {{ .Values.global.defaults.maxGroupsPerOrg | default "100" | quote }} + DEFAULT_ORG_APP_COUNT: {{ .Values.global.defaults.maxAppsPerOrg | default "1000" | quote }} + DEFAULT_DEVELOPER_COUNT: {{ .Values.global.defaults.maxDevelopers | default "50" | quote }} diff --git a/deploy/helm/templates/api-service/secrets.yaml b/deploy/helm/templates/api-service/secrets.yaml index 5dd6e2f47..dfaba1e9a 100644 --- a/deploy/helm/templates/api-service/secrets.yaml +++ b/deploy/helm/templates/api-service/secrets.yaml @@ -20,6 +20,6 @@ stringData: {{- else }} MONGODB_URL: {{ .Values.mongodb.externalUrl | quote }} {{- end }} - ENCRYPTION_PASSWORD: {{ .Values.apiService.config.encryption.password | default "lowcoder.org" | quote }} - ENCRYPTION_SALT: {{ .Values.apiService.config.encryption.salt | default "lowcoder.org" | quote }} - + ENCRYPTION_PASSWORD: {{ .Values.global.config.encryption.password | default "lowcoder.org" | quote }} + ENCRYPTION_SALT: {{ .Values.global.config.encryption.salt | default "lowcoder.org" | quote }} + LOWCODER_API_KEY_SECRET: "{{ .Values.global.config.apiKeySecret }}" diff --git a/deploy/helm/templates/frontend/configMap.yaml b/deploy/helm/templates/frontend/configMap.yaml index 2bd39ebeb..6105f80af 100644 --- a/deploy/helm/templates/frontend/configMap.yaml +++ b/deploy/helm/templates/frontend/configMap.yaml @@ -11,16 +11,18 @@ metadata: {{- toYaml . | nindent 4 }} {{- end }} data: - PUID: {{ .Values.frontend.config.userId | default "9001" | quote }} - PGID: {{ .Values.frontend.config.groupId | default "9001" | quote }} - {{- if .Values.frontend.config.apiServiceUrl }} - LOWCODER_API_SERVICE_URL: {{ .Values.frontend.config.apiServiceUrl | trimSuffix "/" | quote }} + PUID: {{ .Values.global.config.userId | default "9001" | quote }} + PGID: {{ .Values.global.config.groupId | default "9001" | quote }} + {{- if .Values.global.config.apiServiceUrl }} + LOWCODER_API_SERVICE_URL: {{ .Values.global.config.apiServiceUrl | trimSuffix "/" | quote }} {{- else }} LOWCODER_API_SERVICE_URL: "http://{{ $name }}-api-service:{{ .Values.apiService.service.port }}" {{- end }} - {{- if .Values.frontend.config.nodeServiceUrl }} - LOWCODER_NODE_SERVICE_URL: {{ .Values.frontend.config.nodeServiceUrl | trimSuffix "/" | quote }} + {{- if .Values.global.config.nodeServiceUrl }} + LOWCODER_NODE_SERVICE_URL: {{ .Values.global.config.nodeServiceUrl | trimSuffix "/" | quote }} {{- else }} LOWCODER_NODE_SERVICE_URL: "http://{{ $name }}-node-service:{{ .Values.nodeService.service.port }}" {{- end }} + LOWCODER_MAX_REQUEST_SIZE: {{ .Values.global.config.maxRequestSize | default "20m" | quote }} + LOWCODER_MAX_QUERY_TIMEOUT: {{ .Values.global.config.maxQueryTimeout | default "120" | quote }} diff --git a/deploy/helm/templates/node-service/configMap.yaml b/deploy/helm/templates/node-service/configMap.yaml index ea6b26c02..f116edead 100644 --- a/deploy/helm/templates/node-service/configMap.yaml +++ b/deploy/helm/templates/node-service/configMap.yaml @@ -12,10 +12,10 @@ metadata: {{- toYaml . | nindent 4 }} {{- end }} data: - PUID: {{ .Values.nodeService.config.userId | default "9001" | quote }} - PGID: {{ .Values.nodeService.config.groupId | default "9001" | quote }} - {{- if .Values.nodeService.apiServiceUrl }} - LOWCODER_API_SERVICE_URL: {{ .Values.nodeService.apiServiceUrl | quote }} + PUID: {{ .Values.global.config.userId | default "9001" | quote }} + PGID: {{ .Values.global.config.groupId | default "9001" | quote }} + {{- if .Values.global.config.apiServiceUrl }} + LOWCODER_API_SERVICE_URL: {{ .Values.global.config.apiServiceUrl | quote }} {{- else }} LOWCODER_API_SERVICE_URL: "http://{{ $name }}-api-service:{{ .Values.apiService.service.port }}" {{- end }} diff --git a/deploy/helm/values.yaml b/deploy/helm/values.yaml index 58e29b00d..e2b84607f 100644 --- a/deploy/helm/values.yaml +++ b/deploy/helm/values.yaml @@ -6,6 +6,31 @@ imagePullSecrets: [] nameOverride: "" fullnameOverride: "" +# +# Configuration values for Lowcoder +# +global: + config: + # ID of user and group runnning the service within the container + userId: 9001 + groupId: 9001 + corsAllowedDomains: "*" + enableUserSignUp: true + encryption: + password: "lowcoder.org" + salt: "lowcoder.org" + #nodeServiceUrl: + #apiServiceUrl: + apiKeySecret: "5a41b090758b39b226603177ef48d73ae9839dd458ccb7e66f7e7cc028d5a50b" + maxQueryTimeout: 120 + maxRequestSize: "20m" + defaults: + maxOrgsPerUser: 100 + maxMembersPerOrg: 1000 + maxGroupsPerOrg: 100 + maxAppsPerOrg: 1000 + maxDevelopers: 50 + # # Redis # @@ -59,15 +84,6 @@ apiService: # Overrides the image tag whose default is the chart appVersion. #tag: "latest" - config: - userId: 9001 - groupId: 9001 - corsAllowedDomains: "*" - enableUserSignUp: true - encryption: - password: "lowcoder.org" - salt: "lowcoder.org" - #nodeServiceUrl: service: type: ClusterIP @@ -93,10 +109,6 @@ nodeService: # Overrides the image tag whose default is the chart appVersion. #tag: "latest" - config: - userId: 9001 - groupId: 9001 - #apiServiceUrl: service: type: ClusterIP @@ -119,12 +131,6 @@ frontend: # Overrides the image tag whose default is the chart appVersion. #tag: "latest" - config: - userId: 9001 - groupId: 9001 - #apiServiceUrl: - #nodeServiceUrl: - service: type: NodePort port: 80 From 085a9d04d427e214695324f74a181fbdbdc5ce26 Mon Sep 17 00:00:00 2001 From: Abdul Qadir Date: Mon, 8 Jan 2024 20:18:49 +0500 Subject: [PATCH 02/25] Add forwarding of oauth token to node service --- .../query/service/QueryExecutionService.java | 27 ++++++++++++++++- .../models/JsDatasourceConnectionConfig.java | 29 +++++++++++++++++++ .../api/query/ApplicationQueryApiService.java | 19 +++++++++--- .../api/query/LibraryQueryApiService.java | 21 ++++++++++---- 4 files changed, 86 insertions(+), 10 deletions(-) diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/query/service/QueryExecutionService.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/query/service/QueryExecutionService.java index f58887d38..6357f9128 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/query/service/QueryExecutionService.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/query/service/QueryExecutionService.java @@ -10,6 +10,8 @@ import org.lowcoder.sdk.config.CommonConfig; import org.lowcoder.sdk.exception.BizException; import org.lowcoder.sdk.exception.PluginException; +import org.lowcoder.sdk.models.JsDatasourceConnectionConfig; +import org.lowcoder.sdk.models.Property; import org.lowcoder.sdk.models.QueryExecutionResult; import org.lowcoder.sdk.query.QueryExecutionContext; import org.lowcoder.sdk.query.QueryVisitorContext; @@ -18,6 +20,7 @@ import reactor.core.publisher.Mono; import java.time.Duration; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.TimeoutException; @@ -94,6 +97,28 @@ private Mono executeByNodeJs(Datasource datasource, Map injectOauth2Token(queryVisitorContext, context)) + .then(Mono.defer(() -> datasourcePluginClient.executeQuery(datasource.getType(), queryConfig, context, datasource.getDetailConfig()))); + } else { + return datasourcePluginClient.executeQuery(datasource.getType(), queryConfig, context, datasource.getDetailConfig()); + } + + + } + + private Mono injectOauth2Token(QueryVisitorContext queryVisitorContext, List> context) { + return queryVisitorContext.getAuthTokenMono() + .doOnNext(properties -> { + HashMap hashMap = new HashMap<>(); + for (Property property : properties) { + hashMap.put(property.getKey(), property.getValue()); + } + context.add(hashMap); + }) + .then(); } } diff --git a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/models/JsDatasourceConnectionConfig.java b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/models/JsDatasourceConnectionConfig.java index 96749d228..752e89d11 100644 --- a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/models/JsDatasourceConnectionConfig.java +++ b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/models/JsDatasourceConnectionConfig.java @@ -16,6 +16,7 @@ import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.ObjectUtils; +import org.lowcoder.sdk.plugin.restapi.auth.RestApiAuthType; import org.springframework.data.annotation.Transient; import lombok.Getter; @@ -159,6 +160,20 @@ public DatasourceConnectionConfig mergeWithUpdatedConfig(DatasourceConnectionCon if (this.containsKey("extra") || jsDatasourceConnectionConfig.containsKey("extra")) { newJsDatasourceConnectionConfig.putIfAbsent("extra", ObjectUtils.firstNonNull(jsDatasourceConnectionConfig.getExtra(), this.getExtra())); } + + // for oauth handling + if(this.containsKey("authConfig")) { + if(jsDatasourceConnectionConfig.containsKey("authConfig")) { + newJsDatasourceConnectionConfig.put("authConfig", jsDatasourceConnectionConfig.get("authConfig")); + } else { + // do nothing, save empty ( this will clear db ) + } + } else { + if(jsDatasourceConnectionConfig.containsKey("authConfig")) { + newJsDatasourceConnectionConfig.put("authConfig", jsDatasourceConnectionConfig.get("authConfig")); + } + } + return newJsDatasourceConnectionConfig; } @@ -199,4 +214,18 @@ private DatasourceConnectionConfig doEncryptOrDecrypt(Function e return this; } + + public boolean isOauth2InheritFromLogin() { + if (this.get("authConfig") != null) { + return ((HashMap)this.get("authConfig")).get("type").equals(RestApiAuthType.OAUTH2_INHERIT_FROM_LOGIN.name()); + } + return false; + } + + public String getAuthId() { + if(isOauth2InheritFromLogin()) { + return ((HashMap)this.get("authConfig")).get("authId"); + } + return null; + } } diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/query/ApplicationQueryApiService.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/query/ApplicationQueryApiService.java index dbf77db11..9a1242691 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/query/ApplicationQueryApiService.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/query/ApplicationQueryApiService.java @@ -21,6 +21,7 @@ import org.lowcoder.infra.util.TupleUtils; import org.lowcoder.sdk.config.CommonConfig; import org.lowcoder.sdk.exception.BizError; +import org.lowcoder.sdk.models.JsDatasourceConnectionConfig; import org.lowcoder.sdk.models.Property; import org.lowcoder.sdk.models.QueryExecutionResult; import org.lowcoder.sdk.plugin.graphql.GraphQLDatasourceConfig; @@ -122,12 +123,18 @@ public Mono executeApplicationQuery(ServerWebExchange exch // Check if oauth inherited from login and save token if(datasource.getDetailConfig() instanceof RestApiDatasourceConfig restApiDatasourceConfig && restApiDatasourceConfig.isOauth2InheritFromLogin()) { - paramsAndHeadersInheritFromLogin = getAuthParamsAndHeadersInheritFromLogin(tuple.getT1(), ((OAuthInheritAuthConfig)restApiDatasourceConfig.getAuthConfig()).getAuthId()); + paramsAndHeadersInheritFromLogin = getAuthParamsAndHeadersInheritFromLogin(tuple.getT1(), ((OAuthInheritAuthConfig)restApiDatasourceConfig.getAuthConfig()).getAuthId(), false); } if(datasource.getDetailConfig() instanceof GraphQLDatasourceConfig graphQLDatasourceConfig && graphQLDatasourceConfig.isOauth2InheritFromLogin()) { - paramsAndHeadersInheritFromLogin = getAuthParamsAndHeadersInheritFromLogin(tuple.getT1(), ((OAuthInheritAuthConfig)graphQLDatasourceConfig.getAuthConfig()).getAuthId()); + paramsAndHeadersInheritFromLogin = getAuthParamsAndHeadersInheritFromLogin(tuple.getT1(), ((OAuthInheritAuthConfig)graphQLDatasourceConfig.getAuthConfig()).getAuthId(), false); + } + + + if(datasource.getDetailConfig() instanceof JsDatasourceConnectionConfig jsDatasourceConnectionConfig + && jsDatasourceConnectionConfig.isOauth2InheritFromLogin()) { + paramsAndHeadersInheritFromLogin = getAuthParamsAndHeadersInheritFromLogin(tuple.getT1(), jsDatasourceConnectionConfig.getAuthId(), true); } QueryVisitorContext queryVisitorContext = new QueryVisitorContext(userId, app.getOrganizationId(), port, cookies, paramsAndHeadersInheritFromLogin, commonConfig.getDisallowedHosts()); @@ -196,7 +203,7 @@ private Mono getBaseQueryFromLibraryQuery(ApplicationQuery query) { .map(LibraryQueryRecord::getQuery); } - protected Mono> getAuthParamsAndHeadersInheritFromLogin(User user, String authId) { + protected Mono> getAuthParamsAndHeadersInheritFromLogin(User user, String authId, boolean isJsQuery) { if(authId == null) { return Mono.empty(); } @@ -207,7 +214,11 @@ protected Mono> getAuthParamsAndHeadersInheritFromLogin(User user if(!activeConnectionOptional.isPresent() || activeConnectionOptional.get().getAuthConnectionAuthToken() == null) { return Mono.empty(); } - return Mono.just(Collections.singletonList(new Property("Authorization","Bearer " + activeConnectionOptional.get().getAuthConnectionAuthToken().getAccessToken(),"header"))); + if(isJsQuery) { + return Mono.just(Collections.singletonList(new Property("OAUTH_ACCESS_TOKEN",activeConnectionOptional.get().getAuthConnectionAuthToken().getAccessToken(),"header"))); + } else { + return Mono.just(Collections.singletonList(new Property("Authorization","Bearer " + activeConnectionOptional.get().getAuthConnectionAuthToken().getAccessToken(),"header"))); + } } protected void onNextOrError(QueryExecutionRequest queryExecutionRequest, QueryVisitorContext queryVisitorContext, diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/query/LibraryQueryApiService.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/query/LibraryQueryApiService.java index 663a3be5d..a86495ac5 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/query/LibraryQueryApiService.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/query/LibraryQueryApiService.java @@ -40,6 +40,7 @@ import org.lowcoder.sdk.config.CommonConfig; import org.lowcoder.sdk.exception.BizError; import org.lowcoder.sdk.exception.PluginCommonError; +import org.lowcoder.sdk.models.JsDatasourceConnectionConfig; import org.lowcoder.sdk.models.Property; import org.lowcoder.sdk.models.QueryExecutionResult; import org.lowcoder.sdk.plugin.graphql.GraphQLDatasourceConfig; @@ -263,7 +264,7 @@ public Mono executeLibraryQueryFromJs(ServerWebExchange ex Datasource datasource = tuple.getT3(); User user = tuple.getT4(); Mono> paramsAndHeadersInheritFromLogin = orgMember.isInvalid() - ? Mono.empty() : getParamsAndHeadersInheritFromLogin(user, null); + ? Mono.empty() : getParamsAndHeadersInheritFromLogin(user, null, false); QueryVisitorContext queryVisitorContext = new QueryVisitorContext(userId, orgId, port, exchange.getRequest().getCookies(), @@ -313,12 +314,18 @@ public Mono executeLibraryQuery(ServerWebExchange exchange // check if oauth inherited from login and save token if(datasource.getDetailConfig() instanceof RestApiDatasourceConfig restApiDatasourceConfig && restApiDatasourceConfig.isOauth2InheritFromLogin()) { paramsAndHeadersInheritFromLogin = getParamsAndHeadersInheritFromLogin - (user, ((OAuthInheritAuthConfig)restApiDatasourceConfig.getAuthConfig()).getAuthId()); + (user, ((OAuthInheritAuthConfig)restApiDatasourceConfig.getAuthConfig()).getAuthId(), false); } if(datasource.getDetailConfig() instanceof GraphQLDatasourceConfig graphQLDatasourceConfig && graphQLDatasourceConfig.isOauth2InheritFromLogin()) { paramsAndHeadersInheritFromLogin = getParamsAndHeadersInheritFromLogin - (user, ((OAuthInheritAuthConfig)graphQLDatasourceConfig.getAuthConfig()).getAuthId()); + (user, ((OAuthInheritAuthConfig)graphQLDatasourceConfig.getAuthConfig()).getAuthId(), false); + } + + if(datasource.getDetailConfig() instanceof JsDatasourceConnectionConfig jsDatasourceConnectionConfig + && jsDatasourceConnectionConfig.isOauth2InheritFromLogin()) { + paramsAndHeadersInheritFromLogin = getParamsAndHeadersInheritFromLogin + (user, jsDatasourceConnectionConfig.getAuthId(), true); } QueryVisitorContext queryVisitorContext = new QueryVisitorContext(userId, orgId, port, cookies, paramsAndHeadersInheritFromLogin, @@ -348,7 +355,7 @@ private Mono getBaseQuery(LibraryQueryCombineId libraryQueryCombineId .map(LibraryQueryRecord::getQuery); } - protected Mono> getParamsAndHeadersInheritFromLogin(User user, String authId) { + protected Mono> getParamsAndHeadersInheritFromLogin(User user, String authId, boolean isJsQuery) { if(authId == null) { return Mono.empty(); } @@ -359,7 +366,11 @@ protected Mono> getParamsAndHeadersInheritFromLogin(User user, St if(!activeConnectionOptional.isPresent() || activeConnectionOptional.get().getAuthConnectionAuthToken() == null) { return Mono.empty(); } - return Mono.just(Collections.singletonList(new Property("Authorization","Bearer " + activeConnectionOptional.get().getAuthConnectionAuthToken().getAccessToken(),"header"))); + if(isJsQuery) { + return Mono.just(Collections.singletonList(new Property("OAUTH_ACCESS_TOKEN",activeConnectionOptional.get().getAuthConnectionAuthToken().getAccessToken(),"header"))); + } else { + return Mono.just(Collections.singletonList(new Property("Authorization","Bearer " + activeConnectionOptional.get().getAuthConnectionAuthToken().getAccessToken(),"header"))); + } } protected void onNextOrError(QueryExecutionRequest queryExecutionRequest, QueryVisitorContext queryVisitorContext, BaseQuery baseQuery, From 07b1484537346720f10a16285309db41703fd53f Mon Sep 17 00:00:00 2001 From: Ludo Mikula Date: Tue, 9 Jan 2024 17:00:47 +0100 Subject: [PATCH 03/25] fix: add COMMON_WORKSPACE_MODE setting to docker-compose files and helm chart --- deploy/docker/docker-compose-multi.yaml | 1 + deploy/docker/docker-compose.yaml | 1 + deploy/helm/README.md | 1 + .../helm/templates/api-service/configMap.yaml | 2 +- deploy/helm/values.yaml | 2 + yarn-error.log | 107 ------------------ 6 files changed, 6 insertions(+), 108 deletions(-) delete mode 100644 yarn-error.log diff --git a/deploy/docker/docker-compose-multi.yaml b/deploy/docker/docker-compose-multi.yaml index 0c05848e0..c387ac58d 100644 --- a/deploy/docker/docker-compose-multi.yaml +++ b/deploy/docker/docker-compose-multi.yaml @@ -57,6 +57,7 @@ services: # - on linux/mac, generate one eg. with: head /dev/urandom | head -c 30 | shasum -a 256 # LOWCODER_API_KEY_SECRET: "5a41b090758b39b226603177ef48d73ae9839dd458ccb7e66f7e7cc028d5a50b" + COMMON_WORKSPACE_MODE: SAAS restart: unless-stopped depends_on: - mongodb diff --git a/deploy/docker/docker-compose.yaml b/deploy/docker/docker-compose.yaml index 4a39ee6af..4917a2e9e 100644 --- a/deploy/docker/docker-compose.yaml +++ b/deploy/docker/docker-compose.yaml @@ -50,6 +50,7 @@ services: # frontend parameters LOWCODER_MAX_REQUEST_SIZE: 20m LOWCODER_MAX_QUERY_TIMEOUT: 120 + COMMON_WORKSPACE_MODE: SAAS volumes: - ./lowcoder-stacks:/lowcoder-stacks - ./lowcoder-stacks/assets:/lowcoder/assets diff --git a/deploy/helm/README.md b/deploy/helm/README.md index a1bff4154..b7dd8555b 100644 --- a/deploy/helm/README.md +++ b/deploy/helm/README.md @@ -42,6 +42,7 @@ $ helm delete -n lowcoder my-lowcoder | Name | Description | Value | | --------------------------------------- | --------------------------------------------------------------------------------- | -------------- | +| `global.config.workspaceMode` | Sets the workspace mode. Possible types are: SAAS, ENTERPRISE | `SAAS` | | `global.config.userId` | User ID of user running Lowcoder server application in container | `9001` | | `global.config.groupId` | Group ID of user running Lowcoder server application in container | `9001` | | `global.config.corsAllowedDomains` | CORS allowed domains | `*` | diff --git a/deploy/helm/templates/api-service/configMap.yaml b/deploy/helm/templates/api-service/configMap.yaml index aa3804de9..09049bc9a 100644 --- a/deploy/helm/templates/api-service/configMap.yaml +++ b/deploy/helm/templates/api-service/configMap.yaml @@ -32,4 +32,4 @@ data: DEFAULT_ORG_GROUP_COUNT: {{ .Values.global.defaults.maxGroupsPerOrg | default "100" | quote }} DEFAULT_ORG_APP_COUNT: {{ .Values.global.defaults.maxAppsPerOrg | default "1000" | quote }} DEFAULT_DEVELOPER_COUNT: {{ .Values.global.defaults.maxDevelopers | default "50" | quote }} - + COMMON_WORKSPACE_MODE: {{ .Values.global.config.workspaceMode | default "SAAS" | quote }} diff --git a/deploy/helm/values.yaml b/deploy/helm/values.yaml index e2b84607f..42d4e8c72 100644 --- a/deploy/helm/values.yaml +++ b/deploy/helm/values.yaml @@ -11,6 +11,8 @@ fullnameOverride: "" # global: config: + # This setting sets workspace mode. Possible values: SAAS, ENTERPRISE + workspaceMode: SAAS # ID of user and group runnning the service within the container userId: 9001 groupId: 9001 diff --git a/yarn-error.log b/yarn-error.log deleted file mode 100644 index 47e74935c..000000000 --- a/yarn-error.log +++ /dev/null @@ -1,107 +0,0 @@ -Arguments: - /usr/local/bin/node /usr/local/Cellar/yarn/1.22.0/libexec/bin/yarn.js install - -PATH: - /usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin - -Yarn version: - 1.22.0 - -Node version: - 17.4.0 - -Platform: - darwin x64 - -Trace: - SyntaxError: /Users/falkwolskyadmin/Development/Lowcoder/Development/lowcoder/package.json: Unexpected end of JSON input - at JSON.parse () - at /usr/local/Cellar/yarn/1.22.0/libexec/lib/cli.js:1625:59 - at Generator.next () - at step (/usr/local/Cellar/yarn/1.22.0/libexec/lib/cli.js:310:30) - at /usr/local/Cellar/yarn/1.22.0/libexec/lib/cli.js:321:13 - -npm manifest: - - -yarn manifest: - No manifest - -Lockfile: - # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. - # yarn lockfile v1 - - - "ansi-sequence-parser@^1.1.0": - "integrity" "sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==" - "resolved" "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz" - "version" "1.1.1" - - "balanced-match@^1.0.0": - "integrity" "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - "resolved" "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" - "version" "1.0.2" - - "brace-expansion@^2.0.1": - "integrity" "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==" - "resolved" "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" - "version" "2.0.1" - dependencies: - "balanced-match" "^1.0.0" - - "jsonc-parser@^3.2.0": - "integrity" "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==" - "resolved" "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz" - "version" "3.2.0" - - "lunr@^2.3.9": - "integrity" "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==" - "resolved" "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz" - "version" "2.3.9" - - "marked@^4.3.0": - "integrity" "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==" - "resolved" "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz" - "version" "4.3.0" - - "minimatch@^9.0.3": - "integrity" "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==" - "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz" - "version" "9.0.3" - dependencies: - "brace-expansion" "^2.0.1" - - "shiki@^0.14.1": - "integrity" "sha512-1gCAYOcmCFONmErGTrS1fjzJLA7MGZmKzrBNX7apqSwhyITJg2O102uFzXUeBxNnEkDA9vHIKLyeKq0V083vIw==" - "resolved" "https://registry.npmjs.org/shiki/-/shiki-0.14.5.tgz" - "version" "0.14.5" - dependencies: - "ansi-sequence-parser" "^1.1.0" - "jsonc-parser" "^3.2.0" - "vscode-oniguruma" "^1.7.0" - "vscode-textmate" "^8.0.0" - - "typedoc@^0.25.4": - "integrity" "sha512-Du9ImmpBCw54bX275yJrxPVnjdIyJO/84co0/L9mwe0R3G4FSR6rQ09AlXVRvZEGMUg09+z/usc8mgygQ1aidA==" - "resolved" "https://registry.npmjs.org/typedoc/-/typedoc-0.25.4.tgz" - "version" "0.25.4" - dependencies: - "lunr" "^2.3.9" - "marked" "^4.3.0" - "minimatch" "^9.0.3" - "shiki" "^0.14.1" - - "typescript@4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x": - "integrity" "sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==" - "resolved" "https://registry.npmjs.org/typescript/-/typescript-5.3.2.tgz" - "version" "5.3.2" - - "vscode-oniguruma@^1.7.0": - "integrity" "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==" - "resolved" "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz" - "version" "1.7.0" - - "vscode-textmate@^8.0.0": - "integrity" "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==" - "resolved" "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz" - "version" "8.0.0" From 9cff7511eefadf1186ec288d7bf4ee7e1e2170d8 Mon Sep 17 00:00:00 2001 From: RAHEEL Date: Wed, 10 Jan 2024 15:20:37 +0500 Subject: [PATCH 04/25] added repo check + version check with published packages --- .github/workflows/publish-lowcoder-cli.yml | 5 ++++- .github/workflows/publish-lowcoder-comps.yml | 5 ++++- .github/workflows/publish-lowcoder-core.yml | 5 ++++- .github/workflows/publish-lowcoder-sdk.yml | 5 ++++- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/.github/workflows/publish-lowcoder-cli.yml b/.github/workflows/publish-lowcoder-cli.yml index 17eafa909..18f9a4965 100644 --- a/.github/workflows/publish-lowcoder-cli.yml +++ b/.github/workflows/publish-lowcoder-cli.yml @@ -5,10 +5,11 @@ name: Publish Lowcoder CLI on: push: - branches: [ "dev" ] + branches: [ "worflows-updates" ] jobs: publish-package: + if: ${{ github.repositoryUrl == 'git@github.com:lowcoder-org/lowcoder.git' }} runs-on: ubuntu-latest steps: - name: Checkout repository @@ -19,7 +20,9 @@ jobs: id: check with: diff-search: true + static-checking: localIsNew file-name: client/packages/lowcoder-cli/package.json + file-url: https://unpkg.com/lowcoder-cli@latest/package.json - name: Version update detected if: steps.check.outputs.changed == 'true' diff --git a/.github/workflows/publish-lowcoder-comps.yml b/.github/workflows/publish-lowcoder-comps.yml index 40eb567e0..ba3ea3302 100644 --- a/.github/workflows/publish-lowcoder-comps.yml +++ b/.github/workflows/publish-lowcoder-comps.yml @@ -5,10 +5,11 @@ name: Publish Lowcoder Comps on: push: - branches: [ "dev" ] + branches: [ "worflows-updates" ] jobs: publish-package: + if: ${{ github.repositoryUrl == 'git@github.com:lowcoder-org/lowcoder.git' }} runs-on: ubuntu-latest steps: - name: Checkout repository @@ -19,7 +20,9 @@ jobs: id: check with: diff-search: true + static-checking: localIsNew file-name: client/packages/lowcoder-comps/package.json + file-url: https://unpkg.com/lowcoder-comps@latest/package.json - name: Version update detected if: steps.check.outputs.changed == 'true' diff --git a/.github/workflows/publish-lowcoder-core.yml b/.github/workflows/publish-lowcoder-core.yml index 5d36c46c7..587eed2d9 100644 --- a/.github/workflows/publish-lowcoder-core.yml +++ b/.github/workflows/publish-lowcoder-core.yml @@ -5,10 +5,11 @@ name: Publish Lowcoder Core on: push: - branches: [ "dev" ] + branches: [ "worflows-updates" ] jobs: publish-package: + if: ${{ github.repositoryUrl == 'git@github.com:lowcoder-org/lowcoder.git' }} runs-on: ubuntu-latest steps: - name: Checkout repository @@ -19,7 +20,9 @@ jobs: id: check with: diff-search: true + static-checking: localIsNew file-name: client/packages/lowcoder-core/package.json + file-url: https://unpkg.com/lowcoder-core@latest/package.json - name: Version update detected if: steps.check.outputs.changed == 'true' diff --git a/.github/workflows/publish-lowcoder-sdk.yml b/.github/workflows/publish-lowcoder-sdk.yml index 40d93e71a..546cc5fb0 100644 --- a/.github/workflows/publish-lowcoder-sdk.yml +++ b/.github/workflows/publish-lowcoder-sdk.yml @@ -5,10 +5,11 @@ name: Publish Lowcoder SDK on: push: - branches: [ "dev" ] + branches: [ "worflows-updates" ] jobs: publish-package: + if: ${{ github.repositoryUrl == 'git@github.com:lowcoder-org/lowcoder.git' }} runs-on: ubuntu-latest steps: - name: Checkout repository @@ -19,7 +20,9 @@ jobs: id: check with: diff-search: true + static-checking: localIsNew file-name: client/packages/lowcoder-sdk/package.json + file-url: https://unpkg.com/lowcoder-sdk@latest/package.json - name: Version update detected if: steps.check.outputs.changed == 'true' From 701321d88ceb64b51c5dceed28c9e7e5edf9330a Mon Sep 17 00:00:00 2001 From: RAHEEL Date: Wed, 10 Jan 2024 15:23:34 +0500 Subject: [PATCH 05/25] testing worflows --- .github/workflows/publish-lowcoder-sdk.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish-lowcoder-sdk.yml b/.github/workflows/publish-lowcoder-sdk.yml index 546cc5fb0..89130a22d 100644 --- a/.github/workflows/publish-lowcoder-sdk.yml +++ b/.github/workflows/publish-lowcoder-sdk.yml @@ -9,7 +9,7 @@ on: jobs: publish-package: - if: ${{ github.repositoryUrl == 'git@github.com:lowcoder-org/lowcoder.git' }} + if: ${{ github.repositoryUrl == 'git@github.com:raheeliftikhar5/lowcoder.git' }} runs-on: ubuntu-latest steps: - name: Checkout repository From a740ab44f5d6cc767509209c3b7c92fa22a2f5ed Mon Sep 17 00:00:00 2001 From: RAHEEL Date: Wed, 10 Jan 2024 15:31:18 +0500 Subject: [PATCH 06/25] testing workflows --- .github/workflows/publish-lowcoder-sdk.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/publish-lowcoder-sdk.yml b/.github/workflows/publish-lowcoder-sdk.yml index 89130a22d..4cc661885 100644 --- a/.github/workflows/publish-lowcoder-sdk.yml +++ b/.github/workflows/publish-lowcoder-sdk.yml @@ -9,12 +9,14 @@ on: jobs: publish-package: - if: ${{ github.repositoryUrl == 'git@github.com:raheeliftikhar5/lowcoder.git' }} runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v3 + - name: Hello + run: 'echo "${{ github }}"' + - name: Check version changes uses: EndBug/version-check@v1 id: check From 46a61d0daff35c2e86346473e776da7f0600ef67 Mon Sep 17 00:00:00 2001 From: RAHEEL Date: Wed, 10 Jan 2024 15:32:40 +0500 Subject: [PATCH 07/25] testing workflows --- .github/workflows/publish-lowcoder-sdk.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish-lowcoder-sdk.yml b/.github/workflows/publish-lowcoder-sdk.yml index 4cc661885..5ea71fa23 100644 --- a/.github/workflows/publish-lowcoder-sdk.yml +++ b/.github/workflows/publish-lowcoder-sdk.yml @@ -15,7 +15,7 @@ jobs: uses: actions/checkout@v3 - name: Hello - run: 'echo "${{ github }}"' + run: 'echo "${{ github.repositoryUrl }}"' - name: Check version changes uses: EndBug/version-check@v1 From d769c750928f448ce3a26fe26671b6a9838b8500 Mon Sep 17 00:00:00 2001 From: RAHEEL Date: Wed, 10 Jan 2024 15:34:28 +0500 Subject: [PATCH 08/25] testing workflows --- .github/workflows/publish-lowcoder-sdk.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/publish-lowcoder-sdk.yml b/.github/workflows/publish-lowcoder-sdk.yml index 5ea71fa23..23121648a 100644 --- a/.github/workflows/publish-lowcoder-sdk.yml +++ b/.github/workflows/publish-lowcoder-sdk.yml @@ -9,14 +9,12 @@ on: jobs: publish-package: + if: ${{ github.repositoryUrl == 'git://github.com/raheeliftikhar5/lowcoder.git' }} runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v3 - - name: Hello - run: 'echo "${{ github.repositoryUrl }}"' - - name: Check version changes uses: EndBug/version-check@v1 id: check From f18b34dc7d1d6b875d9d42df3408029cf7998f3c Mon Sep 17 00:00:00 2001 From: RAHEEL Date: Wed, 10 Jan 2024 15:42:59 +0500 Subject: [PATCH 09/25] testing workflows --- .github/workflows/publish-lowcoder-sdk.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish-lowcoder-sdk.yml b/.github/workflows/publish-lowcoder-sdk.yml index 23121648a..3301c5c66 100644 --- a/.github/workflows/publish-lowcoder-sdk.yml +++ b/.github/workflows/publish-lowcoder-sdk.yml @@ -9,7 +9,7 @@ on: jobs: publish-package: - if: ${{ github.repositoryUrl == 'git://github.com/raheeliftikhar5/lowcoder.git' }} + if: ${{ github.repositoryUrl == 'git://github.com/lowcoder/lowcoder.git'}} runs-on: ubuntu-latest steps: - name: Checkout repository From dcffcbea79d61ca1d2db57b01723210a5f42f168 Mon Sep 17 00:00:00 2001 From: RAHEEL Date: Wed, 10 Jan 2024 16:23:05 +0500 Subject: [PATCH 10/25] workflow updates --- .github/workflows/publish-lowcoder-cli.yml | 4 ++-- .github/workflows/publish-lowcoder-comps.yml | 4 ++-- .github/workflows/publish-lowcoder-core.yml | 4 ++-- .github/workflows/publish-lowcoder-sdk.yml | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/publish-lowcoder-cli.yml b/.github/workflows/publish-lowcoder-cli.yml index 18f9a4965..2aadbe488 100644 --- a/.github/workflows/publish-lowcoder-cli.yml +++ b/.github/workflows/publish-lowcoder-cli.yml @@ -5,11 +5,11 @@ name: Publish Lowcoder CLI on: push: - branches: [ "worflows-updates" ] + branches: [ "dev" ] jobs: publish-package: - if: ${{ github.repositoryUrl == 'git@github.com:lowcoder-org/lowcoder.git' }} + if: ${{ github.repositoryUrl == 'git://github.com/lowcoder/lowcoder.git'}} runs-on: ubuntu-latest steps: - name: Checkout repository diff --git a/.github/workflows/publish-lowcoder-comps.yml b/.github/workflows/publish-lowcoder-comps.yml index ba3ea3302..27ffb60f9 100644 --- a/.github/workflows/publish-lowcoder-comps.yml +++ b/.github/workflows/publish-lowcoder-comps.yml @@ -5,11 +5,11 @@ name: Publish Lowcoder Comps on: push: - branches: [ "worflows-updates" ] + branches: [ "dev" ] jobs: publish-package: - if: ${{ github.repositoryUrl == 'git@github.com:lowcoder-org/lowcoder.git' }} + if: ${{ github.repositoryUrl == 'git://github.com/lowcoder/lowcoder.git'}} runs-on: ubuntu-latest steps: - name: Checkout repository diff --git a/.github/workflows/publish-lowcoder-core.yml b/.github/workflows/publish-lowcoder-core.yml index 587eed2d9..34222ad56 100644 --- a/.github/workflows/publish-lowcoder-core.yml +++ b/.github/workflows/publish-lowcoder-core.yml @@ -5,11 +5,11 @@ name: Publish Lowcoder Core on: push: - branches: [ "worflows-updates" ] + branches: [ "dev" ] jobs: publish-package: - if: ${{ github.repositoryUrl == 'git@github.com:lowcoder-org/lowcoder.git' }} + if: ${{ github.repositoryUrl == 'git://github.com/lowcoder/lowcoder.git'}} runs-on: ubuntu-latest steps: - name: Checkout repository diff --git a/.github/workflows/publish-lowcoder-sdk.yml b/.github/workflows/publish-lowcoder-sdk.yml index 3301c5c66..d9385b7d9 100644 --- a/.github/workflows/publish-lowcoder-sdk.yml +++ b/.github/workflows/publish-lowcoder-sdk.yml @@ -5,7 +5,7 @@ name: Publish Lowcoder SDK on: push: - branches: [ "worflows-updates" ] + branches: [ "dev" ] jobs: publish-package: From 1d71c4875eb6afa4cdfba34191298d8687926265 Mon Sep 17 00:00:00 2001 From: Abdul Qadir Date: Wed, 10 Jan 2024 20:27:37 +0500 Subject: [PATCH 11/25] Finalize handling for open api oauth inherit from login workflow --- .../query/service/QueryExecutionService.java | 4 +--- server/node-service/src/plugins/openApi/index.ts | 2 +- server/node-service/src/plugins/openApi/util.ts | 15 ++++++++++++++- server/node-service/src/services/plugin.ts | 7 +++++-- 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/query/service/QueryExecutionService.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/query/service/QueryExecutionService.java index 6357f9128..6a4d1fb02 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/query/service/QueryExecutionService.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/query/service/QueryExecutionService.java @@ -113,11 +113,9 @@ private Mono executeByNodeJs(Datasource datasource, Map injectOauth2Token(QueryVisitorContext queryVisitorContext, List> context) { return queryVisitorContext.getAuthTokenMono() .doOnNext(properties -> { - HashMap hashMap = new HashMap<>(); for (Property property : properties) { - hashMap.put(property.getKey(), property.getValue()); + context.add(Map.of("key" , property.getKey(), "value", property.getValue())); } - context.add(hashMap); }) .then(); } diff --git a/server/node-service/src/plugins/openApi/index.ts b/server/node-service/src/plugins/openApi/index.ts index 32e555ca4..27f9ed950 100644 --- a/server/node-service/src/plugins/openApi/index.ts +++ b/server/node-service/src/plugins/openApi/index.ts @@ -102,7 +102,7 @@ export async function runOpenApi( try { const { parameters, requestBody } = normalizeParams(otherActionData, operation, isOas3Spec); - const securities = extractSecurityParams(dataSourceConfig.dynamicParamsConfig, definition); + let securities = extractSecurityParams(dataSourceConfig, definition); const response = await SwaggerClient.execute({ spec: definition, operationId: realOperationId, diff --git a/server/node-service/src/plugins/openApi/util.ts b/server/node-service/src/plugins/openApi/util.ts index 827042f28..4f8a9a262 100644 --- a/server/node-service/src/plugins/openApi/util.ts +++ b/server/node-service/src/plugins/openApi/util.ts @@ -81,7 +81,8 @@ interface NormalizedParams { requestBody?: any; } -export function extractSecurityParams(config: any, spec: OpenAPI.Document) { +export function extractSecurityParams(datasourceConfig: any, spec: OpenAPI.Document) { + const config = datasourceConfig.dynamicParamsConfig; if (!config) { return {}; } @@ -96,6 +97,18 @@ export function extractSecurityParams(config: any, spec: OpenAPI.Document) { names = Object.keys(swagger2Spec.securityDefinitions || {}); } const authorized = _.pick(authData, names); + + let oauthAccessToken = datasourceConfig["OAUTH_ACCESS_TOKEN"]; + + if(oauthAccessToken) { + return { + authorized: { + OAUTH_ACCESS_TOKEN: { value: oauthAccessToken } + }, + specSecurity: [] + }; + } + return { authorized, specSecurity: spec.security }; } diff --git a/server/node-service/src/services/plugin.ts b/server/node-service/src/services/plugin.ts index 6aa9c3ee2..2dbe984f2 100644 --- a/server/node-service/src/services/plugin.ts +++ b/server/node-service/src/services/plugin.ts @@ -212,9 +212,12 @@ export async function runPluginQuery( const queryConfig = await getQueryConfig(plugin, dataSourceConfig); const action = await evalToValue(queryConfig, dsl, context, dataSourceConfig); - //forward cookies + // forward cookies context.forEach(({ key, value }) => { - if (dataSourceConfig.dynamicParamsConfig && key in dataSourceConfig.dynamicParamsConfig) { + // for oauth(inherit from login) support + if(key == "OAUTH_ACCESS_TOKEN") { + dataSourceConfig["OAUTH_ACCESS_TOKEN"] = value + } else if (dataSourceConfig.dynamicParamsConfig && key in dataSourceConfig.dynamicParamsConfig) { const valueKey = `${key}.value`; dataSourceConfig.dynamicParamsConfig[valueKey] = value[0].value } From e1d2094504c7373ab034d065471c9c35de8cea10 Mon Sep 17 00:00:00 2001 From: Abdul Qadir Date: Wed, 10 Jan 2024 20:40:50 +0500 Subject: [PATCH 12/25] Update test to fix node run failure --- server/node-service/src/plugins/openApi/util.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/node-service/src/plugins/openApi/util.test.ts b/server/node-service/src/plugins/openApi/util.test.ts index 9000de2ca..98f6a7a53 100644 --- a/server/node-service/src/plugins/openApi/util.test.ts +++ b/server/node-service/src/plugins/openApi/util.test.ts @@ -1,7 +1,7 @@ import { extractSecurityParams, getSchemaExample, extractLevelData, parseUrl } from "./util"; test("extractSecurityParams", () => { - const params = extractSecurityParams({ "ApiKeyAuth.value": "hello", ApiKeyAuth: null }, { + const params = extractSecurityParams({"dynamicParamsConfig":{ "ApiKeyAuth.value": "hello", ApiKeyAuth: null }}, { openapi: "3.0", components: { securitySchemes: { From 86d0f29d47669251bbad041b21c0ad72c7e37951 Mon Sep 17 00:00:00 2001 From: RAHEEL Date: Thu, 11 Jan 2024 21:33:12 +0500 Subject: [PATCH 13/25] fix column disappear on resize --- .../src/comps/comps/tableComp/tableCompView.tsx | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/client/packages/lowcoder/src/comps/comps/tableComp/tableCompView.tsx b/client/packages/lowcoder/src/comps/comps/tableComp/tableCompView.tsx index a523e7c58..8ac23651d 100644 --- a/client/packages/lowcoder/src/comps/comps/tableComp/tableCompView.tsx +++ b/client/packages/lowcoder/src/comps/comps/tableComp/tableCompView.tsx @@ -553,11 +553,6 @@ function ResizeableTable(props: CustomTableProps(props: CustomTableProps { - // if (width) { - // setResizeData({ - // index: index, - // width: width, - // }); - // } - // }, onResize: (width: React.SyntheticEvent) => { if (width) { setResizeData({ From cc9af452648ad38a086a23aa72f5b210d8006643 Mon Sep 17 00:00:00 2001 From: RAHEEL Date: Thu, 11 Jan 2024 21:33:56 +0500 Subject: [PATCH 14/25] remove double shadow from table toolbar popups --- .../lowcoder/src/comps/comps/tableComp/tableToolbarComp.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/packages/lowcoder/src/comps/comps/tableComp/tableToolbarComp.tsx b/client/packages/lowcoder/src/comps/comps/tableComp/tableToolbarComp.tsx index f7e8829e0..3509ce4af 100644 --- a/client/packages/lowcoder/src/comps/comps/tableComp/tableToolbarComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/tableComp/tableToolbarComp.tsx @@ -609,7 +609,7 @@ function ColumnSetting(props: { allChecked = false; } return ( - + { @@ -677,6 +677,7 @@ function ToolbarPopover(props: { Date: Thu, 11 Jan 2024 21:34:46 +0500 Subject: [PATCH 15/25] show/hide column title in table --- .../comps/tableComp/column/tableColumnComp.tsx | 15 ++++++++++++++- .../tableComp/column/tableColumnListComp.tsx | 1 - .../src/comps/comps/tableComp/tableUtils.tsx | 2 +- client/packages/lowcoder/src/i18n/locales/de.ts | 4 +++- client/packages/lowcoder/src/i18n/locales/en.ts | 2 ++ client/packages/lowcoder/src/i18n/locales/zh.ts | 2 ++ 6 files changed, 22 insertions(+), 4 deletions(-) diff --git a/client/packages/lowcoder/src/comps/comps/tableComp/column/tableColumnComp.tsx b/client/packages/lowcoder/src/comps/comps/tableComp/column/tableColumnComp.tsx index 348ce73fa..8bf84e276 100644 --- a/client/packages/lowcoder/src/comps/comps/tableComp/column/tableColumnComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/tableComp/column/tableColumnComp.tsx @@ -27,7 +27,6 @@ import { ColorControl } from "comps/controls/colorControl"; import { JSONValue } from "util/jsonTypes"; import styled from "styled-components"; import { TextOverflowControl } from "comps/controls/textOverflowControl"; -import { TableColumnLinkStyle, styleControl } from "@lowcoder-ee/index.sdk"; import { default as Divider } from "antd/es/divider"; export type Render = ReturnType["getOriginalComp"]>; export const RenderComp = withSelectedMultiContext(ColumnTypeComp); @@ -86,6 +85,7 @@ export type CellColorViewType = (param: { export const columnChildrenMap = { // column title title: StringControl, + showTitle: withDefault(BoolControl, true), // a custom column or a data column isCustom: valueComp(false), // If it is a data column, it must be the name of the column and cannot be duplicated as a react key @@ -149,6 +149,13 @@ export class ColumnComp extends ColumnInitComp { ) ); } + if(action.type === CompActionTypes.CHANGE_VALUE) { + const title = comp.children.title.unevaledValue; + const dataIndex = comp.children.dataIndex.getView(); + if(!Boolean(title)) { + comp.children.title.dispatchChangeValueAction(dataIndex); + } + } return comp; } @@ -180,9 +187,14 @@ export class ColumnComp extends ColumnInitComp { <> {this.children.title.propertyView({ label: trans("table.columnTitle"), + placeholder: this.children.dataIndex.getView(), })} {/* FIXME: cast type currently, return type of withContext should be corrected later */} {this.children.render.getPropertyView()} + {this.children.showTitle.propertyView({ + label: trans("table.showTitle"), + tooltip: trans("table.showTitleTooltip"), + })} {ColumnTypeCompMap[columnType].canBeEditable() && this.children.editable.propertyView({ label: trans("table.editable") })} {this.children.sortable.propertyView({ @@ -311,6 +323,7 @@ export function newPrimaryColumn( title?: string, isTag?: boolean ): ConstructorToDataType { + console.log('newPrimaryColumn', title); return { title: title ?? key, dataIndex: key, diff --git a/client/packages/lowcoder/src/comps/comps/tableComp/column/tableColumnListComp.tsx b/client/packages/lowcoder/src/comps/comps/tableComp/column/tableColumnListComp.tsx index f5429ba5c..d186aad0a 100644 --- a/client/packages/lowcoder/src/comps/comps/tableComp/column/tableColumnListComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/tableComp/column/tableColumnListComp.tsx @@ -101,7 +101,6 @@ export class ColumnListComp extends ColumnListTmpComp { dynamicColumn: boolean; data: Array; }) { - console.log("dataChangedAction", param); return customAction( { type: "dataChanged", diff --git a/client/packages/lowcoder/src/comps/comps/tableComp/tableUtils.tsx b/client/packages/lowcoder/src/comps/comps/tableComp/tableUtils.tsx index 5e30837e3..c3c6a3fa1 100644 --- a/client/packages/lowcoder/src/comps/comps/tableComp/tableUtils.tsx +++ b/client/packages/lowcoder/src/comps/comps/tableComp/tableUtils.tsx @@ -311,7 +311,7 @@ export function columnsToAntdFormat( }[]; const title = renderTitle({ title: column.title, editable: column.editable }); return { - title: title, + title: column.showTitle ? title : '', titleText: column.title, dataIndex: column.dataIndex, align: column.align, diff --git a/client/packages/lowcoder/src/i18n/locales/de.ts b/client/packages/lowcoder/src/i18n/locales/de.ts index e049fb2f0..bc5cd9101 100644 --- a/client/packages/lowcoder/src/i18n/locales/de.ts +++ b/client/packages/lowcoder/src/i18n/locales/de.ts @@ -1124,7 +1124,9 @@ export const de = { "columnValueTooltip": "\\'{{currentCell}}\\': Aktuelle Zelldaten\n \\'{{currentRow}}\\': Aktuelle Zeilendaten\n \\'{{currentIndex}}\\': Aktueller Datenindex (beginnend bei 0)\n Beispiel: \\'{{currentCell * 5}}\\' Show 5 Times the Original Value Data.", "imageSrc": "Bildquelle", "imageSize": "Bildgröße", - "columnTitle": "Titel", + "columnTitle": "Titel anzeigen", + "showTitle": "Show Title", + "showTitleTooltip": "Spaltentitel im Tabellenkopf ein-/ausblenden", "sortable": "Sortierbar", "align": "Ausrichtung", "fixedColumn": "Feste Säule", diff --git a/client/packages/lowcoder/src/i18n/locales/en.ts b/client/packages/lowcoder/src/i18n/locales/en.ts index a75348a04..ef8d3d165 100644 --- a/client/packages/lowcoder/src/i18n/locales/en.ts +++ b/client/packages/lowcoder/src/i18n/locales/en.ts @@ -1229,6 +1229,8 @@ export const en = { "imageSrc": "Image Source", "imageSize": "Image Size", "columnTitle": "Title", + "showTitle": "Show Title", + "showTitleTooltip": "Show/Hide column title in table header", "sortable": "Sortable", "align": "Alignment", "fixedColumn": "Fixed Column", diff --git a/client/packages/lowcoder/src/i18n/locales/zh.ts b/client/packages/lowcoder/src/i18n/locales/zh.ts index 778a08885..fe235979e 100644 --- a/client/packages/lowcoder/src/i18n/locales/zh.ts +++ b/client/packages/lowcoder/src/i18n/locales/zh.ts @@ -1200,6 +1200,8 @@ table: { imageSrc: "图片链接", imageSize: "图片尺寸", columnTitle: "标题", + showTitle: "显示标题", + showTitleTooltip: "显示/隐藏表标题中的列标题", sortable: "可排序", align: "对齐方式", fixedColumn: "固定列", From 8d485a24d3d3edcfa4113a5a915ba13b77bbff7d Mon Sep 17 00:00:00 2001 From: FalkWolsky Date: Thu, 11 Jan 2024 22:20:23 +0100 Subject: [PATCH 16/25] Table Styles update --- .../comps/comps/tableComp/tableCompView.tsx | 20 ++++++-- .../comps/tableComp/tablePropertyView.tsx | 9 +++- .../src/comps/comps/tableComp/tableTypes.tsx | 4 +- .../comps/controls/styleControlConstants.tsx | 46 +++++++++++++++++++ 4 files changed, 73 insertions(+), 6 deletions(-) diff --git a/client/packages/lowcoder/src/comps/comps/tableComp/tableCompView.tsx b/client/packages/lowcoder/src/comps/comps/tableComp/tableCompView.tsx index 8ac23651d..92e241663 100644 --- a/client/packages/lowcoder/src/comps/comps/tableComp/tableCompView.tsx +++ b/client/packages/lowcoder/src/comps/comps/tableComp/tableCompView.tsx @@ -18,8 +18,10 @@ import { handleToSelectedRow, TableColumnLinkStyleType, TableColumnStyleType, + TableHeaderStyleType, TableRowStyleType, TableStyleType, + TableToolbarStyleType, } from "comps/controls/styleControlConstants"; import { CompNameContext, EditorContext } from "comps/editorState"; import { BackgroundColorContext } from "comps/utils/backgroundColorContext"; @@ -56,6 +58,8 @@ function genLinerGradient(color: string) { const getStyle = ( style: TableStyleType, rowStyle: TableRowStyleType, + headerStyle: TableHeaderStyleType, + toolbarStyle: TableToolbarStyleType ) => { const background = genLinerGradient(style.background); const selectedRowBackground = genLinerGradient(rowStyle.selectedRowBackground); @@ -128,6 +132,8 @@ const getStyle = ( const TableWrapper = styled.div<{ $style: TableStyleType; + $headerStyle: TableHeaderStyleType; + $toolbarStyle: TableToolbarStyleType; $rowStyle: TableRowStyleType; $toolbarPosition: "above" | "below" | "close"; $fixedHeader: boolean; @@ -136,7 +142,7 @@ const TableWrapper = styled.div<{ max-height: 100%; overflow-y: auto; background: white; - border: ${(props) => `1px solid ${props.$style.border}`}; + border: ${(props) => `${props.$style.borderWidth} solid ${props.$style.border}`}; border-radius: ${(props) => props.$style.radius}; .ant-table-wrapper { @@ -187,10 +193,12 @@ const TableWrapper = styled.div<{ > .ant-table-thead { > tr > th { - background-color: ${(props) => props.$style.headerBackground}; + background-color: ${(props) => props.$headerStyle.headerBackground}; border-color: ${(props) => props.$style.border}; + border-width: ${(props) => props.$headerStyle.borderWidth}; color: ${(props) => props.$style.headerText}; - border-inline-end: ${(props) => `1px solid ${props.$style.border}`} !important; + font-size: ${(props) => props.$headerStyle.textSize}; + border-inline-end: ${(props) => `${props.$headerStyle.borderWidth} solid ${props.$style.border}`} !important; ${(props) => props.$fixedHeader && ` position: sticky; @@ -267,7 +275,7 @@ const TableWrapper = styled.div<{ } ${(props) => - props.$style && getStyle(props.$style, props.$rowStyle)} + props.$style && getStyle(props.$style, props.$rowStyle, props.$headerStyle, props.$toolbarStyle)} `; const TableTh = styled.th<{ width?: number }>` @@ -641,6 +649,8 @@ export function TableCompView(props: { const compChildren = comp.children; const style = compChildren.style.getView(); const rowStyle = compChildren.rowStyle.getView(); + const headerStyle = compChildren.headerStyle.getView(); + const toolbarStyle = compChildren.toolbarStyle.getView(); const rowAutoHeight = compChildren.rowAutoHeight.getView(); const columnsStyle = compChildren.columnsStyle.getView(); const changeSet = useMemo(() => compChildren.columns.getChangeSet(), [compChildren.columns]); @@ -753,6 +763,8 @@ export function TableCompView(props: { {["layout", "both"].includes(editorModeStatus) && ( <>
- {comp.children.style.getPropertyView()} + {comp.children.style.getPropertyView()} +
+
+ {comp.children.headerStyle.getPropertyView()} +
+
+ {comp.children.toolbarStyle.getPropertyView()}
{comp.children.rowStyle.getPropertyView()} + {comp.children.rowAutoHeight.getPropertyView()} {comp.children.rowHeight.getPropertyView()} {comp.children.rowColor.getPropertyView()} diff --git a/client/packages/lowcoder/src/comps/comps/tableComp/tableTypes.tsx b/client/packages/lowcoder/src/comps/comps/tableComp/tableTypes.tsx index 58d0b4974..d4cc986b8 100644 --- a/client/packages/lowcoder/src/comps/comps/tableComp/tableTypes.tsx +++ b/client/packages/lowcoder/src/comps/comps/tableComp/tableTypes.tsx @@ -13,7 +13,7 @@ import { import { dropdownControl } from "comps/controls/dropdownControl"; import { eventHandlerControl } from "comps/controls/eventHandlerControl"; import { styleControl } from "comps/controls/styleControl"; -import { TableColumnStyle, TableRowStyle, TableStyle } from "comps/controls/styleControlConstants"; +import { TableColumnStyle, TableRowStyle, TableStyle, TableToolbarStyle, TableHeaderStyle } from "comps/controls/styleControlConstants"; import { MultiCompBuilder, stateComp, @@ -184,6 +184,8 @@ const tableChildrenMap = { toolbar: TableToolbarComp, style: styleControl(TableStyle), rowStyle: styleControl(TableRowStyle), + toolbarStyle: styleControl(TableToolbarStyle), + headerStyle: styleControl(TableHeaderStyle), searchText: StringControl, columnsStyle: withDefault(styleControl(TableColumnStyle), {borderWidth: '1px', radius: '0px'}), viewModeResizable: BoolControl, diff --git a/client/packages/lowcoder/src/comps/controls/styleControlConstants.tsx b/client/packages/lowcoder/src/comps/controls/styleControlConstants.tsx index 14308f32b..aabce4745 100644 --- a/client/packages/lowcoder/src/comps/controls/styleControlConstants.tsx +++ b/client/packages/lowcoder/src/comps/controls/styleControlConstants.tsx @@ -684,6 +684,11 @@ const LinkTextStyle = [ export const TableStyle = [ ...BG_STATIC_BORDER_RADIUS, + { + name: "borderWidth", + label: trans("style.borderWidth"), + borderWidth: "borderWidth", + }, { name: "headerBackground", label: trans("style.tableHeaderBackground"), @@ -713,6 +718,45 @@ export const TableStyle = [ }, ] as const; +export const TableToolbarStyle = [ + { + name: "toolbarBackground", + label: trans("style.toolbarBackground"), + depName: "background", + depType: DEP_TYPE.SELF, + transformer: toSelf, + }, + { + name: "toolbarText", + label: trans("style.toolbarText"), + depName: "toolbarBackground", + depType: DEP_TYPE.CONTRAST_TEXT, + transformer: contrastText, + }, +] as const; + +export const TableHeaderStyle = [ + { + name: "borderWidth", + label: trans("style.borderWidth"), + borderWidth: "borderWidth", + }, + { + name: "headerBackground", + label: trans("style.tableHeaderBackground"), + depName: "background", + transformer: handleToHeadBg, + }, + { + name: "headerText", + label: trans("style.tableHeaderText"), + depName: "headerBackground", + depType: DEP_TYPE.CONTRAST_TEXT, + transformer: contrastText, + }, + TEXT_SIZE, +] as const; + export const TableRowStyle = [ getBackground(), { @@ -1073,6 +1117,8 @@ export type CheckboxStyleType = StyleConfigType; export type RadioStyleType = StyleConfigType; export type SegmentStyleType = StyleConfigType; export type TableStyleType = StyleConfigType; +export type TableHeaderStyleType = StyleConfigType; +export type TableToolbarStyleType = StyleConfigType; export type TableRowStyleType = StyleConfigType; export type TableColumnStyleType = StyleConfigType; export type TableColumnLinkStyleType = StyleConfigType; From 4d6f8da4e07d9646295840b02fb93162110e9c51 Mon Sep 17 00:00:00 2001 From: FalkWolsky Date: Fri, 12 Jan 2024 12:13:33 +0100 Subject: [PATCH 17/25] Margins, Header, Borders --- .../tableComp/column/tableColumnComp.tsx | 1 + .../comps/comps/tableComp/tableCompView.tsx | 23 +++++++++++++------ .../src/comps/comps/tableComp/tableUtils.tsx | 1 + .../comps/controls/styleControlConstants.tsx | 17 ++++++++++---- 4 files changed, 30 insertions(+), 12 deletions(-) diff --git a/client/packages/lowcoder/src/comps/comps/tableComp/column/tableColumnComp.tsx b/client/packages/lowcoder/src/comps/comps/tableComp/column/tableColumnComp.tsx index 8bf84e276..b455cd340 100644 --- a/client/packages/lowcoder/src/comps/comps/tableComp/column/tableColumnComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/tableComp/column/tableColumnComp.tsx @@ -100,6 +100,7 @@ export const columnChildrenMap = { fixed: dropdownControl(columnFixOptions, "close"), editable: BoolControl, background: withDefault(ColorControl, ""), + margin: withDefault(RadiusControl, ""), text: withDefault(ColorControl, ""), border: withDefault(ColorControl, ""), borderWidth: withDefault(RadiusControl, ""), diff --git a/client/packages/lowcoder/src/comps/comps/tableComp/tableCompView.tsx b/client/packages/lowcoder/src/comps/comps/tableComp/tableCompView.tsx index 92e241663..da4687c4c 100644 --- a/client/packages/lowcoder/src/comps/comps/tableComp/tableCompView.tsx +++ b/client/packages/lowcoder/src/comps/comps/tableComp/tableCompView.tsx @@ -141,9 +141,11 @@ const TableWrapper = styled.div<{ }>` max-height: 100%; overflow-y: auto; - background: white; + background: ${(props) => props.$style.background}; border: ${(props) => `${props.$style.borderWidth} solid ${props.$style.border}`}; border-radius: ${(props) => props.$style.radius}; + padding: ${(props) => props.$style.padding}; + margin: ${(props) => props.$style.margin}; .ant-table-wrapper { border-top: ${(props) => (props.$toolbarPosition === "above" ? "1px solid" : "unset")}; @@ -194,11 +196,11 @@ const TableWrapper = styled.div<{ > .ant-table-thead { > tr > th { background-color: ${(props) => props.$headerStyle.headerBackground}; - border-color: ${(props) => props.$style.border}; + border-color: ${(props) => props.$headerStyle.border}; border-width: ${(props) => props.$headerStyle.borderWidth}; - color: ${(props) => props.$style.headerText}; + color: ${(props) => props.$headerStyle.headerText}; font-size: ${(props) => props.$headerStyle.textSize}; - border-inline-end: ${(props) => `${props.$headerStyle.borderWidth} solid ${props.$style.border}`} !important; + border-inline-end: ${(props) => `${props.$headerStyle.borderWidth} solid ${props.$headerStyle.border}`} !important; ${(props) => props.$fixedHeader && ` position: sticky; @@ -208,19 +210,23 @@ const TableWrapper = styled.div<{ ` } + > div { + margin: ${(props) => props.$headerStyle.margin}; + } + &:last-child { border-inline-end: none !important; } &.ant-table-column-has-sorters:hover { - background-color: ${(props) => darkenColor(props.$style.headerBackground, 0.05)}; + background-color: ${(props) => darkenColor(props.$headerStyle.headerBackground, 0.05)}; } > .ant-table-column-sorters > .ant-table-column-sorter { - color: ${(props) => props.$style.headerText === defaultTheme.textDark ? "#bfbfbf" : props.$style.headerText}; + color: ${(props) => props.$headerStyle.headerText === defaultTheme.textDark ? "#bfbfbf" : props.$headerStyle.headerText}; } &::before { - background-color: ${(props) => props.$style.border}; + background-color: ${(props) => props.$headerStyle.border}; } } } @@ -310,6 +316,8 @@ const TableTd = styled.td<{ border-color: ${(props) => props.$style.border} !important; border-width: ${(props) => props.$style.borderWidth} !important; border-radius: ${(props) => props.$style.radius}; + margin: ${(props) => props.$style.margin}; + padding: 0 !important; > div { @@ -488,6 +496,7 @@ function TableCellView(props: { const style = { background: cellColor || rowColor || columnStyle.background || columnsStyle.background, + margin: columnStyle.margin || columnsStyle.margin, text: columnStyle.text || columnsStyle.text, border: columnStyle.border || columnsStyle.border, radius: columnStyle.radius || columnsStyle.radius, diff --git a/client/packages/lowcoder/src/comps/comps/tableComp/tableUtils.tsx b/client/packages/lowcoder/src/comps/comps/tableComp/tableUtils.tsx index c3c6a3fa1..5bd925e5a 100644 --- a/client/packages/lowcoder/src/comps/comps/tableComp/tableUtils.tsx +++ b/client/packages/lowcoder/src/comps/comps/tableComp/tableUtils.tsx @@ -319,6 +319,7 @@ export function columnsToAntdFormat( fixed: column.fixed === "close" ? false : column.fixed, style: { background: column.background, + margin: column.margin, text: column.text, border: column.border, radius: column.radius, diff --git a/client/packages/lowcoder/src/comps/controls/styleControlConstants.tsx b/client/packages/lowcoder/src/comps/controls/styleControlConstants.tsx index aabce4745..b9231a536 100644 --- a/client/packages/lowcoder/src/comps/controls/styleControlConstants.tsx +++ b/client/packages/lowcoder/src/comps/controls/styleControlConstants.tsx @@ -683,6 +683,8 @@ const LinkTextStyle = [ ] as const; export const TableStyle = [ + MARGIN, + PADDING, ...BG_STATIC_BORDER_RADIUS, { name: "borderWidth", @@ -719,6 +721,8 @@ export const TableStyle = [ ] as const; export const TableToolbarStyle = [ + MARGIN, + PADDING, { name: "toolbarBackground", label: trans("style.toolbarBackground"), @@ -736,17 +740,19 @@ export const TableToolbarStyle = [ ] as const; export const TableHeaderStyle = [ - { - name: "borderWidth", - label: trans("style.borderWidth"), - borderWidth: "borderWidth", - }, { name: "headerBackground", label: trans("style.tableHeaderBackground"), depName: "background", transformer: handleToHeadBg, }, + MARGIN, + getStaticBorder(), + { + name: "borderWidth", + label: trans("style.borderWidth"), + borderWidth: "borderWidth", + }, { name: "headerText", label: trans("style.tableHeaderText"), @@ -784,6 +790,7 @@ export const TableRowStyle = [ export const TableColumnStyle = [ getStaticBackground("#00000000"), getStaticBorder(), + MARGIN, BORDER_WIDTH, RADIUS, TEXT, From 2d76cebb21061743e565470f4b248fb9332294a6 Mon Sep 17 00:00:00 2001 From: RAHEEL Date: Fri, 12 Jan 2024 19:11:48 +0500 Subject: [PATCH 18/25] added step control for number type columns --- .../columnTypeComps/ColumnNumberComp.tsx | 68 ++++++++++++++----- .../src/comps/controls/boolControl.tsx | 7 +- .../packages/lowcoder/src/i18n/locales/de.ts | 2 + .../packages/lowcoder/src/i18n/locales/en.ts | 2 + .../packages/lowcoder/src/i18n/locales/zh.ts | 2 + 5 files changed, 63 insertions(+), 18 deletions(-) diff --git a/client/packages/lowcoder/src/comps/comps/tableComp/column/columnTypeComps/ColumnNumberComp.tsx b/client/packages/lowcoder/src/comps/comps/tableComp/column/columnTypeComps/ColumnNumberComp.tsx index 20a390294..17e1efa77 100644 --- a/client/packages/lowcoder/src/comps/comps/tableComp/column/columnTypeComps/ColumnNumberComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/tableComp/column/columnTypeComps/ColumnNumberComp.tsx @@ -1,18 +1,37 @@ - import { default as Input } from "antd/es/input"; + import { default as InputNumber } from "antd/es/input-number"; import { NumberControl, StringControl } from "comps/controls/codeControl"; import { BoolControl } from "comps/controls/boolControl"; import { trans } from "i18n"; import { ColumnTypeCompBuilder, ColumnTypeViewFn } from "../columnTypeCompBuilder"; import { ColumnValueTooltip } from "../simpleColumnTypeComps"; +import { withDefault } from "comps/generators"; +import styled from "styled-components"; + +const InputNumberWrapper = styled.div` + .ant-input-number { + width: 100%; + border-radius: 0; + background: transparent !important; + padding: 0 !important; + box-shadow: none; + + input { + padding: 0; + border-radius: 0; + } + } +`; const childrenMap = { text: NumberControl, + step: withDefault(NumberControl, 1), float: BoolControl, prefix: StringControl, suffix: StringControl, }; let float = false; +let step = 1; const getBaseValue: ColumnTypeViewFn = ( props ) => { @@ -24,6 +43,7 @@ export const ColumnNumberComp = (function () { childrenMap, (props, dispatch) => { float = props.float; + step = props.step; const value = !float ? Math.floor(props.changeValue ?? getBaseValue(props, dispatch)) : props.changeValue ?? getBaseValue(props, dispatch); return props.prefix + value + props.suffix; }, @@ -32,18 +52,20 @@ export const ColumnNumberComp = (function () { ) .setEditViewFn((props) => { return ( - { - props.onChange(!float ? Math.floor(e.target.valueAsNumber) : e.target.valueAsNumber); - }} - onBlur={props.onChangeEnd} - onPressEnter={props.onChangeEnd} - /> + + { + value = value ?? 0; + props.onChange(!float ? Math.floor(value) : value); + }} + onBlur={props.onChangeEnd} + onPressEnter={props.onChangeEnd} + /> + )}) .setPropertyViewFn((children) => { return ( @@ -52,17 +74,31 @@ export const ColumnNumberComp = (function () { label: trans("table.columnValue"), tooltip: ColumnValueTooltip, })} + {children.step.propertyView({ + label: trans("table.numberStep"), + tooltip: trans("table.numberStepTooltip"), + onFocus: (focused) => { + if(!focused) { + const value = children.step.getView(); + const isFloat = children.float.getView(); + const newValue = !isFloat ? Math.floor(value) : value; + children.step.dispatchChangeValueAction(String(newValue)); + } + } + })} {children.prefix.propertyView({ label: trans("table.prefix"), - // tooltip: ColumnValueTooltip, })} {children.suffix.propertyView({ label: trans("table.suffix"), - // tooltip: ColumnValueTooltip, })} {children.float.propertyView({ label: trans("table.float"), - // tooltip: ColumnValueTooltip, + onChange: (isFloat) => { + const value = children.step.getView(); + const newValue = !isFloat ? Math.floor(value) : value; + children.step.dispatchChangeValueAction(String(newValue)); + } })} ); diff --git a/client/packages/lowcoder/src/comps/controls/boolControl.tsx b/client/packages/lowcoder/src/comps/controls/boolControl.tsx index 7ea77e88e..b044138fa 100644 --- a/client/packages/lowcoder/src/comps/controls/boolControl.tsx +++ b/client/packages/lowcoder/src/comps/controls/boolControl.tsx @@ -106,7 +106,7 @@ class BoolControl extends AbstractComp({ useCodeEditor: !this.useCodeEditor }, true); } - propertyView(params: ControlParams) { + propertyView(params: ControlParams & {onChange?: (changed: boolean) => void}) { const changeModeIcon = ( this.dispatchChangeValueAction(x)} + onChange={(x) => { + this.dispatchChangeValueAction(x); + params?.onChange?.(x); + }} > )} diff --git a/client/packages/lowcoder/src/i18n/locales/de.ts b/client/packages/lowcoder/src/i18n/locales/de.ts index bc5cd9101..a178609e7 100644 --- a/client/packages/lowcoder/src/i18n/locales/de.ts +++ b/client/packages/lowcoder/src/i18n/locales/de.ts @@ -1135,6 +1135,8 @@ export const de = { "auto": "Auto", "fixed": "Festgelegt", "columnType": "Säule Typ", + "numberStep": "Schritt", + "numberStepTooltip": "Die Zahl, auf die der aktuelle Wert erhöht oder verringert wird. Es kann eine ganze Zahl oder eine Dezimalzahl sein", "float": "Schwimmer", "prefix": "Präfix", "suffix": "Nachsilbe", diff --git a/client/packages/lowcoder/src/i18n/locales/en.ts b/client/packages/lowcoder/src/i18n/locales/en.ts index ef8d3d165..c1aabecfb 100644 --- a/client/packages/lowcoder/src/i18n/locales/en.ts +++ b/client/packages/lowcoder/src/i18n/locales/en.ts @@ -1239,6 +1239,8 @@ export const en = { "auto": "Auto", "fixed": "Fixed", "columnType": "Column Type", + "numberStep": "Step", + "numberStepTooltip": "The number to which the current value is increased or decreased. It can be an integer or decimal", "float": "Float", "prefix": "Prefix", "suffix": "Suffix", diff --git a/client/packages/lowcoder/src/i18n/locales/zh.ts b/client/packages/lowcoder/src/i18n/locales/zh.ts index fe235979e..4e8a6ab22 100644 --- a/client/packages/lowcoder/src/i18n/locales/zh.ts +++ b/client/packages/lowcoder/src/i18n/locales/zh.ts @@ -1210,6 +1210,8 @@ table: { auto: "自动", fixed: "固定", columnType: "列类型", + numberStep: "步", + numberStepTooltip: "当前值增加或减少的数量。它可以是整数或小数", float: "分数", prefix: "字首", suffix: "后缀", From 6bd21e76741e5e88f080b050646ad7284975bb3d Mon Sep 17 00:00:00 2001 From: RAHEEL Date: Fri, 12 Jan 2024 19:57:36 +0500 Subject: [PATCH 19/25] show links as per space available for table links type columns --- .../columnTypeComps/columnLinksComp.tsx | 90 ++++++++----------- 1 file changed, 36 insertions(+), 54 deletions(-) diff --git a/client/packages/lowcoder/src/comps/comps/tableComp/column/columnTypeComps/columnLinksComp.tsx b/client/packages/lowcoder/src/comps/comps/tableComp/column/columnTypeComps/columnLinksComp.tsx index 7329db720..06f7fcb38 100644 --- a/client/packages/lowcoder/src/comps/comps/tableComp/column/columnTypeComps/columnLinksComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/tableComp/column/columnTypeComps/columnLinksComp.tsx @@ -1,5 +1,3 @@ -import { EllipsisOutlined } from "@ant-design/icons"; -import { default as Dropdown} from "antd/es/dropdown"; import { default as Menu } from "antd/es/menu"; import { ColumnTypeCompBuilder } from "comps/comps/tableComp/column/columnTypeCompBuilder"; import { ActionSelectorControlInContext } from "comps/controls/actionSelector/actionSelectorControl"; @@ -12,18 +10,6 @@ import styled from "styled-components"; import { ColumnLink } from "comps/comps/tableComp/column/columnTypeComps/columnLinkComp"; import { LightActiveTextColor, PrimaryColor } from "constants/style"; -const LinksWrapper = styled.div` - white-space: nowrap; - - > a { - margin-right: 8px; - } - - > a:last-child { - margin-right: 0; - } -`; - const MenuLinkWrapper = styled.div` > a { color: ${PrimaryColor} !important; @@ -34,6 +20,22 @@ const MenuLinkWrapper = styled.div` } `; +const MenuWrapper = styled.div` + ul { + background: transparent !important; + border-bottom: 0; + + li { + padding: 0 10px 0 0 !important; + line-height: normal !important; + + &::after { + content: none !important; + } + } + } +`; + const OptionItem = new MultiCompBuilder( { label: StringControl, @@ -69,48 +71,28 @@ export const ColumnLinksComp = (function () { return new ColumnTypeCompBuilder( childrenMap, (props) => { - const menu = props.options.length > 3 && ( - - {props.options - .filter((o) => !o.hidden) - .slice(3) - .map((option, index) => ( - - - - - - ))} - - ); + const menuItems = props.options + .filter((o) => !o.hidden) + .map((option, index) => ( + { + key: index, + label: ( + + + + ) + } + )); return ( - - {props.options - .filter((o) => !o.hidden) - .slice(0, 3) - .map((option, i) => ( - - ))} - {menu && ( - menu} - > - e.preventDefault()} /> - - )} - - ); + + + + ) }, () => "" ) From 342c9daeef520c6637110fe319ec0921a450cbcc Mon Sep 17 00:00:00 2001 From: RAHEEL Date: Fri, 12 Jan 2024 20:20:13 +0500 Subject: [PATCH 20/25] table events added for rowShrink and download --- .../src/comps/comps/tableComp/tableCompView.tsx | 11 +++++++++-- .../src/comps/comps/tableComp/tableTypes.tsx | 15 +++++++++++++++ client/packages/lowcoder/src/i18n/locales/de.ts | 5 ++++- client/packages/lowcoder/src/i18n/locales/en.ts | 3 +++ client/packages/lowcoder/src/i18n/locales/zh.ts | 3 +++ 5 files changed, 34 insertions(+), 3 deletions(-) diff --git a/client/packages/lowcoder/src/comps/comps/tableComp/tableCompView.tsx b/client/packages/lowcoder/src/comps/comps/tableComp/tableCompView.tsx index 92e241663..db6d9f96d 100644 --- a/client/packages/lowcoder/src/comps/comps/tableComp/tableCompView.tsx +++ b/client/packages/lowcoder/src/comps/comps/tableComp/tableCompView.tsx @@ -745,7 +745,10 @@ export function TableCompView(props: { setLoading ) } - onDownload={() => onDownload(`${compName}-data`)} + onDownload={() => { + handleChangeEvent("download"); + onDownload(`${compName}-data`) + }} hasChange={hasChange} onSaveChanges={() => handleChangeEvent("saveChanges")} onCancelChanges={() => handleChangeEvent("cancelChanges")} @@ -778,7 +781,11 @@ export function TableCompView(props: { : "OB_CHILDREN_KEY_PLACEHOLDER", fixed: "left", onExpand: (expanded) => { - if(expanded) handleChangeEvent('rowExpand') + if(expanded) { + handleChangeEvent('rowExpand') + } else { + handleChangeEvent('rowShrink') + } } }} rowColorFn={compChildren.rowColor.getView() as any} diff --git a/client/packages/lowcoder/src/comps/comps/tableComp/tableTypes.tsx b/client/packages/lowcoder/src/comps/comps/tableComp/tableTypes.tsx index d4cc986b8..e41f69f55 100644 --- a/client/packages/lowcoder/src/comps/comps/tableComp/tableTypes.tsx +++ b/client/packages/lowcoder/src/comps/comps/tableComp/tableTypes.tsx @@ -78,6 +78,21 @@ export const TableEventOptions = [ value: "rowExpand", description: trans("table.rowExpand"), }, + { + label: trans("table.rowShrink"), + value: "rowShrink", + description: trans("table.rowShrink"), + }, + { + label: trans("table.search"), + value: "search", + description: trans("table.search"), + }, + { + label: trans("table.download"), + value: "download", + description: trans("table.download"), + }, { label: trans("table.filterChange"), value: "filterChange", diff --git a/client/packages/lowcoder/src/i18n/locales/de.ts b/client/packages/lowcoder/src/i18n/locales/de.ts index a178609e7..9a93aa7d1 100644 --- a/client/packages/lowcoder/src/i18n/locales/de.ts +++ b/client/packages/lowcoder/src/i18n/locales/de.ts @@ -1190,7 +1190,10 @@ export const de = { "cancelChanges": "Änderungen abbrechen", "rowSelectChange": "Zeile auswählen Ändern", "rowClick": "Reihe Klicken", - "rowExpand": "Reihe Erweitern", + "rowExpand": "Reihe verkleinern", + "rowShrink": "Zeilenverkleinerung", + "search": "Suchen", + "download": "Herunterladen", "filterChange": "Filterwechsel", "sortChange": "Sortieren Ändern", "pageChange": "Seitenwechsel", diff --git a/client/packages/lowcoder/src/i18n/locales/en.ts b/client/packages/lowcoder/src/i18n/locales/en.ts index c1aabecfb..084383480 100644 --- a/client/packages/lowcoder/src/i18n/locales/en.ts +++ b/client/packages/lowcoder/src/i18n/locales/en.ts @@ -1296,6 +1296,9 @@ export const en = { "rowSelectChange": "Row Select Change", "rowClick": "Row Click", "rowExpand": "Row Expand", + "rowShrink": "Row Shrink", + "search": "Search", + "download": "Download", "filterChange": "Filter Change", "sortChange": "Sort Change", "pageChange": "Page Change", diff --git a/client/packages/lowcoder/src/i18n/locales/zh.ts b/client/packages/lowcoder/src/i18n/locales/zh.ts index 4e8a6ab22..4bcfddc86 100644 --- a/client/packages/lowcoder/src/i18n/locales/zh.ts +++ b/client/packages/lowcoder/src/i18n/locales/zh.ts @@ -1267,6 +1267,9 @@ table: { rowSelectChange: "行选中变化", rowClick: "行点击", rowExpand: "行展开", + rowShrink: "行收缩", + search: "搜索", + download: "下载", filterChange: "筛选变化", sortChange: "排序变化", pageChange: "分页变化", From 05eacdce3fcdc4849a34cebed3ead0e016068172 Mon Sep 17 00:00:00 2001 From: RAHEEL Date: Fri, 12 Jan 2024 22:29:53 +0500 Subject: [PATCH 21/25] table events added for columnEdited and search --- .../lowcoder/src/components/table/EditableCell.tsx | 5 +++++ .../src/comps/comps/tableComp/column/tableColumnComp.tsx | 1 - .../lowcoder/src/comps/comps/tableComp/tableComp.tsx | 9 ++++++++- .../lowcoder/src/comps/comps/tableComp/tableCompView.tsx | 1 + .../comps/comps/tableComp/tableDynamicColumn.test.tsx | 4 +++- .../lowcoder/src/comps/comps/tableComp/tableTypes.tsx | 7 ++++++- .../lowcoder/src/comps/comps/tableComp/tableUtils.tsx | 5 ++++- client/packages/lowcoder/src/i18n/locales/de.ts | 1 + client/packages/lowcoder/src/i18n/locales/en.ts | 1 + client/packages/lowcoder/src/i18n/locales/zh.ts | 1 + 10 files changed, 30 insertions(+), 5 deletions(-) diff --git a/client/packages/lowcoder/src/components/table/EditableCell.tsx b/client/packages/lowcoder/src/components/table/EditableCell.tsx index 799c21a26..a08a3607d 100644 --- a/client/packages/lowcoder/src/components/table/EditableCell.tsx +++ b/client/packages/lowcoder/src/components/table/EditableCell.tsx @@ -35,6 +35,7 @@ export interface CellProps { candidateTags?: string[]; candidateStatus?: { text: string; status: StatusType }[]; textOverflow?: boolean; + onTableEvent?: (eventName: any) => void; } export type CellViewReturn = (props: CellProps) => ReactNode; @@ -71,6 +72,7 @@ export function EditableCell(props: EditableCellProps) { baseValue, candidateTags, candidateStatus, + onTableEvent, } = props; const status = _.isNil(changeValue) ? "normal" : "toSave"; const editable = editViewFn ? props.editable : false; @@ -96,6 +98,9 @@ export function EditableCell(props: EditableCellProps) { false ) ); + if(!_.isEqual(tmpValue, value)) { + onTableEvent?.('columnEdited'); + } }, [dispatch, baseValue, tmpValue]); const editView = useMemo( () => editViewFn?.({ value, onChange, onChangeEnd }) ?? <>, diff --git a/client/packages/lowcoder/src/comps/comps/tableComp/column/tableColumnComp.tsx b/client/packages/lowcoder/src/comps/comps/tableComp/column/tableColumnComp.tsx index 8bf84e276..b97c16b50 100644 --- a/client/packages/lowcoder/src/comps/comps/tableComp/column/tableColumnComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/tableComp/column/tableColumnComp.tsx @@ -323,7 +323,6 @@ export function newPrimaryColumn( title?: string, isTag?: boolean ): ConstructorToDataType { - console.log('newPrimaryColumn', title); return { title: title ?? key, dataIndex: key, diff --git a/client/packages/lowcoder/src/comps/comps/tableComp/tableComp.tsx b/client/packages/lowcoder/src/comps/comps/tableComp/tableComp.tsx index 65555c29f..a9e32547a 100644 --- a/client/packages/lowcoder/src/comps/comps/tableComp/tableComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/tableComp/tableComp.tsx @@ -176,7 +176,6 @@ export class TableImplComp extends TableInitComp implements IContainer { override reduce(action: CompAction): this { let comp = super.reduce(action); - let dataChanged = false; if (action.type === CompActionTypes.UPDATE_NODES_V2) { const nextRowExample = tableDataRowExample(comp.children.data.getView()); @@ -316,10 +315,18 @@ export class TableImplComp extends TableInitComp implements IContainer { filter: this.children.toolbar.children.filter.node(), showFilter: this.children.toolbar.children.showFilter.node(), }; + let context = this; const filteredDataNode = withFunction(fromRecord(nodes), (input) => { const { data, searchValue, filter, showFilter } = input; const filteredData = filterData(data, searchValue.value, filter, showFilter.value); // console.info("filterNode. data: ", data, " filter: ", filter, " filteredData: ", filteredData); + // if data is changed on search then trigger event + if(Boolean(searchValue.value) && data.length !== filteredData.length) { + const onEvent = context.children.onEvent.getView(); + setTimeout(() => { + onEvent("dataSearch"); + }); + } return filteredData.map((row) => tranToTableRecord(row, row[OB_ROW_ORI_INDEX])); }); return lastValueIfEqual(this, "filteredDataNode", [filteredDataNode, nodes] as const, (a, b) => diff --git a/client/packages/lowcoder/src/comps/comps/tableComp/tableCompView.tsx b/client/packages/lowcoder/src/comps/comps/tableComp/tableCompView.tsx index db6d9f96d..4f45854bf 100644 --- a/client/packages/lowcoder/src/comps/comps/tableComp/tableCompView.tsx +++ b/client/packages/lowcoder/src/comps/comps/tableComp/tableCompView.tsx @@ -680,6 +680,7 @@ export function TableCompView(props: { dynamicColumn, dynamicColumnConfig, columnsAggrData, + onEvent, ), [ columnViews, diff --git a/client/packages/lowcoder/src/comps/comps/tableComp/tableDynamicColumn.test.tsx b/client/packages/lowcoder/src/comps/comps/tableComp/tableDynamicColumn.test.tsx index c5e1b65a0..022e0558b 100644 --- a/client/packages/lowcoder/src/comps/comps/tableComp/tableDynamicColumn.test.tsx +++ b/client/packages/lowcoder/src/comps/comps/tableComp/tableDynamicColumn.test.tsx @@ -36,6 +36,7 @@ const expectColumn = ( // with dynamic config const dynamicColumnConfig = comp.children.dynamicColumnConfig.getView(); if (dynamicColumnConfig?.length > 0) { + const onEvent = (eventName: any) => {}; const antdColumns = columnsToAntdFormat( columnViews, comp.children.sort.getView(), @@ -43,7 +44,8 @@ const expectColumn = ( comp.children.size.getView(), comp.children.dynamicColumn.getView(), dynamicColumnConfig, - comp.columnAggrData + comp.columnAggrData, + onEvent, ); expect(columnViews.length).toBeGreaterThanOrEqual(antdColumns.length); antdColumns.forEach((column) => { diff --git a/client/packages/lowcoder/src/comps/comps/tableComp/tableTypes.tsx b/client/packages/lowcoder/src/comps/comps/tableComp/tableTypes.tsx index e41f69f55..3e9c8d559 100644 --- a/client/packages/lowcoder/src/comps/comps/tableComp/tableTypes.tsx +++ b/client/packages/lowcoder/src/comps/comps/tableComp/tableTypes.tsx @@ -83,9 +83,14 @@ export const TableEventOptions = [ value: "rowShrink", description: trans("table.rowShrink"), }, + { + label: trans("table.columnEdited"), + value: "columnEdited", + description: trans("table.columnEdited"), + }, { label: trans("table.search"), - value: "search", + value: "dataSearch", description: trans("table.search"), }, { diff --git a/client/packages/lowcoder/src/comps/comps/tableComp/tableUtils.tsx b/client/packages/lowcoder/src/comps/comps/tableComp/tableUtils.tsx index c3c6a3fa1..993a8b9dd 100644 --- a/client/packages/lowcoder/src/comps/comps/tableComp/tableUtils.tsx +++ b/client/packages/lowcoder/src/comps/comps/tableComp/tableUtils.tsx @@ -269,6 +269,7 @@ export function columnsToAntdFormat( dynamicColumn: boolean, dynamicColumnConfig: Array, columnsAggrData: ColumnsAggrData, + onTableEvent: (eventName: any) => void, ): Array> { const sortMap: Map = new Map( sort.map((s) => [s.column, s.desc ? "descend" : "ascend"]) @@ -346,9 +347,11 @@ export function columnsToAntdFormat( .getView() .view({ editable: column.editable, - size, candidateTags: tags, + size, + candidateTags: tags, candidateStatus: status, textOverflow: column.textOverflow, + onTableEvent, }); }, ...(column.sortable diff --git a/client/packages/lowcoder/src/i18n/locales/de.ts b/client/packages/lowcoder/src/i18n/locales/de.ts index 9a93aa7d1..664de45cf 100644 --- a/client/packages/lowcoder/src/i18n/locales/de.ts +++ b/client/packages/lowcoder/src/i18n/locales/de.ts @@ -1194,6 +1194,7 @@ export const de = { "rowShrink": "Zeilenverkleinerung", "search": "Suchen", "download": "Herunterladen", + "columnEdited": "Spalte bearbeitet", "filterChange": "Filterwechsel", "sortChange": "Sortieren Ändern", "pageChange": "Seitenwechsel", diff --git a/client/packages/lowcoder/src/i18n/locales/en.ts b/client/packages/lowcoder/src/i18n/locales/en.ts index 084383480..b40b5f613 100644 --- a/client/packages/lowcoder/src/i18n/locales/en.ts +++ b/client/packages/lowcoder/src/i18n/locales/en.ts @@ -1299,6 +1299,7 @@ export const en = { "rowShrink": "Row Shrink", "search": "Search", "download": "Download", + "columnEdited": "Column Edited", "filterChange": "Filter Change", "sortChange": "Sort Change", "pageChange": "Page Change", diff --git a/client/packages/lowcoder/src/i18n/locales/zh.ts b/client/packages/lowcoder/src/i18n/locales/zh.ts index 4bcfddc86..230843d6c 100644 --- a/client/packages/lowcoder/src/i18n/locales/zh.ts +++ b/client/packages/lowcoder/src/i18n/locales/zh.ts @@ -1270,6 +1270,7 @@ table: { rowShrink: "行收缩", search: "搜索", download: "下载", + columnEdited: "栏目已编辑", filterChange: "筛选变化", sortChange: "排序变化", pageChange: "分页变化", From 6fa43f1cfb936735356a52be309f2415114728ff Mon Sep 17 00:00:00 2001 From: RAHEEL Date: Fri, 12 Jan 2024 23:06:51 +0500 Subject: [PATCH 22/25] added precision for float number columns --- .../columnTypeComps/ColumnNumberComp.tsx | 20 ++++++++++++++++--- .../packages/lowcoder/src/i18n/locales/de.ts | 1 + .../packages/lowcoder/src/i18n/locales/en.ts | 1 + .../packages/lowcoder/src/i18n/locales/zh.ts | 1 + 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/client/packages/lowcoder/src/comps/comps/tableComp/column/columnTypeComps/ColumnNumberComp.tsx b/client/packages/lowcoder/src/comps/comps/tableComp/column/columnTypeComps/ColumnNumberComp.tsx index 17e1efa77..20622b3b2 100644 --- a/client/packages/lowcoder/src/comps/comps/tableComp/column/columnTypeComps/ColumnNumberComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/tableComp/column/columnTypeComps/ColumnNumberComp.tsx @@ -1,5 +1,5 @@ import { default as InputNumber } from "antd/es/input-number"; -import { NumberControl, StringControl } from "comps/controls/codeControl"; +import { NumberControl, RangeControl, StringControl } from "comps/controls/codeControl"; import { BoolControl } from "comps/controls/boolControl"; import { trans } from "i18n"; import { ColumnTypeCompBuilder, ColumnTypeViewFn } from "../columnTypeCompBuilder"; @@ -25,6 +25,7 @@ const InputNumberWrapper = styled.div` const childrenMap = { text: NumberControl, step: withDefault(NumberControl, 1), + precision: RangeControl.closed(0, 20, 0), float: BoolControl, prefix: StringControl, suffix: StringControl, @@ -32,6 +33,8 @@ const childrenMap = { let float = false; let step = 1; +let precision = 0; + const getBaseValue: ColumnTypeViewFn = ( props ) => { @@ -44,8 +47,13 @@ export const ColumnNumberComp = (function () { (props, dispatch) => { float = props.float; step = props.step; - const value = !float ? Math.floor(props.changeValue ?? getBaseValue(props, dispatch)) : props.changeValue ?? getBaseValue(props, dispatch); - return props.prefix + value + props.suffix; + precision = props.precision; + const value = props.changeValue ?? getBaseValue(props, dispatch); + let formattedValue: string | number = !float ? Math.floor(value) : value; + if(float) { + formattedValue = formattedValue.toPrecision(precision + 1); + } + return props.prefix + formattedValue + props.suffix; }, (nodeValue) => nodeValue.text.value, getBaseValue, @@ -62,6 +70,7 @@ export const ColumnNumberComp = (function () { value = value ?? 0; props.onChange(!float ? Math.floor(value) : value); }} + precision={float ? precision : 0} onBlur={props.onChangeEnd} onPressEnter={props.onChangeEnd} /> @@ -86,6 +95,11 @@ export const ColumnNumberComp = (function () { } } })} + {float && ( + children.precision.propertyView({ + label: trans("table.precision"), + }) + )} {children.prefix.propertyView({ label: trans("table.prefix"), })} diff --git a/client/packages/lowcoder/src/i18n/locales/de.ts b/client/packages/lowcoder/src/i18n/locales/de.ts index 664de45cf..298e80ef4 100644 --- a/client/packages/lowcoder/src/i18n/locales/de.ts +++ b/client/packages/lowcoder/src/i18n/locales/de.ts @@ -1137,6 +1137,7 @@ export const de = { "columnType": "Säule Typ", "numberStep": "Schritt", "numberStepTooltip": "Die Zahl, auf die der aktuelle Wert erhöht oder verringert wird. Es kann eine ganze Zahl oder eine Dezimalzahl sein", + "precision": "Präzision", "float": "Schwimmer", "prefix": "Präfix", "suffix": "Nachsilbe", diff --git a/client/packages/lowcoder/src/i18n/locales/en.ts b/client/packages/lowcoder/src/i18n/locales/en.ts index b40b5f613..4d330c32b 100644 --- a/client/packages/lowcoder/src/i18n/locales/en.ts +++ b/client/packages/lowcoder/src/i18n/locales/en.ts @@ -1241,6 +1241,7 @@ export const en = { "columnType": "Column Type", "numberStep": "Step", "numberStepTooltip": "The number to which the current value is increased or decreased. It can be an integer or decimal", + "precision": "Precision", "float": "Float", "prefix": "Prefix", "suffix": "Suffix", diff --git a/client/packages/lowcoder/src/i18n/locales/zh.ts b/client/packages/lowcoder/src/i18n/locales/zh.ts index 230843d6c..63cb07acf 100644 --- a/client/packages/lowcoder/src/i18n/locales/zh.ts +++ b/client/packages/lowcoder/src/i18n/locales/zh.ts @@ -1212,6 +1212,7 @@ table: { columnType: "列类型", numberStep: "步", numberStepTooltip: "当前值增加或减少的数量。它可以是整数或小数", + precision: "精度", float: "分数", prefix: "字首", suffix: "后缀", From 683c87ec034509f18d9f2db98d2e21e1acbce641 Mon Sep 17 00:00:00 2001 From: FalkWolsky Date: Sat, 13 Jan 2024 20:36:28 +0100 Subject: [PATCH 23/25] Margins, Header, Borders 2 --- .../comps/comps/tableComp/tableCompView.tsx | 185 ++++++++++-------- .../comps/tableComp/tablePropertyView.tsx | 10 +- .../comps/tableComp/tableToolbarComp.tsx | 2 +- .../src/comps/comps/tableComp/tableTypes.tsx | 4 +- .../comps/controls/styleControlConstants.tsx | 5 +- .../packages/lowcoder/src/i18n/locales/en.ts | 4 +- .../packages/lowcoder/src/i18n/locales/zh.ts | 2 + 7 files changed, 122 insertions(+), 90 deletions(-) diff --git a/client/packages/lowcoder/src/comps/comps/tableComp/tableCompView.tsx b/client/packages/lowcoder/src/comps/comps/tableComp/tableCompView.tsx index da4687c4c..5e2e4a274 100644 --- a/client/packages/lowcoder/src/comps/comps/tableComp/tableCompView.tsx +++ b/client/packages/lowcoder/src/comps/comps/tableComp/tableCompView.tsx @@ -21,6 +21,7 @@ import { TableHeaderStyleType, TableRowStyleType, TableStyleType, + ThemeDetail, TableToolbarStyleType, } from "comps/controls/styleControlConstants"; import { CompNameContext, EditorContext } from "comps/editorState"; @@ -29,7 +30,7 @@ import { PrimaryColor } from "constants/style"; import { trans } from "i18n"; import _ from "lodash"; import { darkenColor, isDarkColor } from "lowcoder-design"; -import React, { useCallback, useContext, useEffect, useMemo, useRef, useState } from "react"; +import React, { Children, useCallback, useContext, useEffect, useMemo, useRef, useState } from "react"; import { Resizable } from "react-resizable"; import styled, { css } from "styled-components"; import { useUserViewMode } from "util/hooks"; @@ -41,15 +42,6 @@ import { messageInstance } from "lowcoder-design"; import { ReactRef, ResizeHandleAxis } from "layout/gridLayoutPropTypes"; import { CellColorViewType } from "./column/tableColumnComp"; -const TitleResizeHandle = styled.span` - position: absolute; - top: 0; - right: -5px; - width: 10px; - height: 100%; - cursor: col-resize; - z-index: 1; -`; function genLinerGradient(color: string) { return `linear-gradient(${color}, ${color})`; @@ -65,10 +57,11 @@ const getStyle = ( const selectedRowBackground = genLinerGradient(rowStyle.selectedRowBackground); const hoverRowBackground = genLinerGradient(rowStyle.hoverRowBackground); const alternateBackground = genLinerGradient(rowStyle.alternateBackground); + // const tableAutoHeight = return css` .ant-table-body { - background: white; + background: ${genLinerGradient(style.background)}; } .ant-table-tbody { > tr:nth-of-type(2n + 1) { @@ -130,6 +123,32 @@ const getStyle = ( `; }; +const TitleResizeHandle = styled.span` + position: absolute; + top: 0; + right: -5px; + width: 10px; + height: 100%; + cursor: col-resize; + z-index: 1; +`; + +const BackgroundWrapper = styled.div<{ + $style: TableStyleType; + $tableAutoHeight?: boolean; +}>` + ${(props) => !props.$tableAutoHeight && ` height: calc(100% - ${props.$style.margin} - ${props.$style.margin}) !important`}; + ${(props) => props.$tableAutoHeight && ` height: calc(100% + ${props.$style.margin}`}; + background: ${(props) => props.$style.background} !important; + border: ${(props) => `${props.$style.borderWidth} solid ${props.$style.border} !important`}; + border-radius: ${(props) => props.$style.radius} !important; + padding: unset !important; + margin: ${(props) => props.$style.margin} !important; + overflow: scroll !important; + ${(props) => props.$style} +`; + +// TODO: find a way to limit the calc function for max-height only to first Margin value const TableWrapper = styled.div<{ $style: TableStyleType; $headerStyle: TableHeaderStyleType; @@ -139,16 +158,10 @@ const TableWrapper = styled.div<{ $fixedHeader: boolean; $fixedToolbar: boolean; }>` - max-height: 100%; - overflow-y: auto; - background: ${(props) => props.$style.background}; - border: ${(props) => `${props.$style.borderWidth} solid ${props.$style.border}`}; - border-radius: ${(props) => props.$style.radius}; - padding: ${(props) => props.$style.padding}; - margin: ${(props) => props.$style.margin}; + overflow: unset !important; .ant-table-wrapper { - border-top: ${(props) => (props.$toolbarPosition === "above" ? "1px solid" : "unset")}; + border-top: unset; border-color: inherit; } @@ -299,6 +312,7 @@ const TableTh = styled.th<{ width?: number }>` const TableTd = styled.td<{ $background: string; $style: TableColumnStyleType & {rowHeight?: string}; + $defaultThemeDetail: ThemeDetail; $linkStyle?: TableColumnLinkStyleType; $isEditing: boolean; $tableSize?: string; @@ -316,40 +330,42 @@ const TableTd = styled.td<{ border-color: ${(props) => props.$style.border} !important; border-width: ${(props) => props.$style.borderWidth} !important; border-radius: ${(props) => props.$style.radius}; - margin: ${(props) => props.$style.margin}; padding: 0 !important; > div { + margin: ${(props) => props.$style.margin}; color: ${(props) => props.$style.text}; - font-size: ${(props) => props.$style.textSize}; - line-height: 21px; - + ${(props) => props.$tableSize === 'small' && ` - padding: 8.5px 8px; - min-height: ${props.$style.rowHeight || '39px'}; + padding: 1px 8px; + font-size: ${props.$defaultThemeDetail.textSize == props.$style.textSize ? '14px !important' : props.$style.textSize + ' !important' }; + min-height: ${props.$style.rowHeight || '14px'}; + line-height: 20px; ${!props.$autoHeight && ` overflow-y: auto; - max-height: ${props.$style.rowHeight || '39px'}; + max-height: ${props.$style.rowHeight || '28px'}; `}; `}; ${(props) => props.$tableSize === 'middle' && ` - padding: 12.5px 8px; - min-height: ${props.$style.rowHeight || '47px'}; + padding: 8px 8px; + font-size: ${props.$defaultThemeDetail.textSize == props.$style.textSize ? '16px !important' : props.$style.textSize + ' !important' }; + min-height: ${props.$style.rowHeight || '24px'}; + line-height: 24px; ${!props.$autoHeight && ` overflow-y: auto; - max-height: ${props.$style.rowHeight || '47px'}; + max-height: ${props.$style.rowHeight || '48px'}; `}; `}; ${(props) => props.$tableSize === 'large' && ` - padding: 16.5px 16px; - min-height: ${props.$style.rowHeight || '55px'}; + padding: 16px 16px; + font-size: ${props.$defaultThemeDetail.textSize == props.$style.textSize ? '18px !important' : props.$style.textSize + ' !important' }; + min-height: ${props.$style.rowHeight || '48px'}; ${!props.$autoHeight && ` overflow-y: auto; - max-height: ${props.$style.rowHeight || '55px'}; + max-height: ${props.$style.rowHeight || '96px'}; `}; `}; - > div > .ant-badge > .ant-badge-status-text, > div > div > .markdown-body { @@ -516,6 +532,7 @@ function TableCellView(props: { {...restProps} $background={background} $style={style} + $defaultThemeDetail={defaultTheme} $linkStyle={linkStyle} $isEditing={editing} $tableSize={tableSize} @@ -656,6 +673,7 @@ export function TableCompView(props: { const [loading, setLoading] = useState(false); const { comp, onDownload, onRefresh } = props; const compChildren = comp.children; + const tableAutoHeight = compChildren.autoHeight.getView(); const style = compChildren.style.getView(); const rowStyle = compChildren.rowStyle.getView(); const headerStyle = compChildren.headerStyle.getView(); @@ -768,57 +786,64 @@ export function TableCompView(props: { return ( -
- {toolbar.position === "above" && toolbarView} - - expandable={{ - ...expansion.expandableConfig, - childrenColumnName: supportChildren - ? COLUMN_CHILDREN_KEY - : "OB_CHILDREN_KEY_PLACEHOLDER", - fixed: "left", - onExpand: (expanded) => { - if(expanded) handleChangeEvent('rowExpand') + + + + + expandable={{ + ...expansion.expandableConfig, + childrenColumnName: supportChildren + ? COLUMN_CHILDREN_KEY + : "OB_CHILDREN_KEY_PLACEHOLDER", + fixed: "left", + onExpand: (expanded) => { + if(expanded) handleChangeEvent('rowExpand') + } + }} + rowColorFn={compChildren.rowColor.getView() as any} + rowHeightFn={compChildren.rowHeight.getView() as any} + {...compChildren.selection.getView()(onEvent)} + bordered={compChildren.showHeaderGridBorder.getView()} + onChange={(pagination, filters, sorter, extra) => { + onTableChange(pagination, filters, sorter, extra, comp.dispatch, onEvent); + }} + showHeader={!compChildren.hideHeader.getView()} + columns={antdColumns} + columnsStyle={columnsStyle} + viewModeResizable={compChildren.viewModeResizable.getView()} + dataSource={pageDataInfo.data} + size={compChildren.size.getView()} + rowAutoHeight={rowAutoHeight} + tableLayout="fixed" + loading={ + loading || + // fixme isLoading type + (compChildren.showDataLoadSpinner.getView() && + (compChildren.data as any).isLoading()) || + compChildren.loading.getView() } - }} - rowColorFn={compChildren.rowColor.getView() as any} - rowHeightFn={compChildren.rowHeight.getView() as any} - {...compChildren.selection.getView()(onEvent)} - bordered={!compChildren.hideBordered.getView()} - onChange={(pagination, filters, sorter, extra) => { - onTableChange(pagination, filters, sorter, extra, comp.dispatch, onEvent); - }} - showHeader={!compChildren.hideHeader.getView()} - columns={antdColumns} - columnsStyle={columnsStyle} - viewModeResizable={compChildren.viewModeResizable.getView()} - dataSource={pageDataInfo.data} - size={compChildren.size.getView()} - rowAutoHeight={rowAutoHeight} - tableLayout="fixed" - loading={ - loading || - // fixme isLoading type - (compChildren.showDataLoadSpinner.getView() && - (compChildren.data as any).isLoading()) || - compChildren.loading.getView() - } - /> + /> + + + {expansion.expandModalView} + + {toolbar.position === "below" && toolbarView} - - {expansion.expandModalView} - - -
+ +
); } diff --git a/client/packages/lowcoder/src/comps/comps/tableComp/tablePropertyView.tsx b/client/packages/lowcoder/src/comps/comps/tableComp/tablePropertyView.tsx index 334c59639..f282cbec9 100644 --- a/client/packages/lowcoder/src/comps/comps/tableComp/tablePropertyView.tsx +++ b/client/packages/lowcoder/src/comps/comps/tableComp/tablePropertyView.tsx @@ -469,9 +469,6 @@ export function compTablePropertyView {comp.children.hideHeader.propertyView({ label: trans("table.hideHeader"), })} - {comp.children.hideBordered.propertyView({ - label: trans("table.hideBordered"), - })} {comp.children.viewModeResizable.propertyView({ label: trans("table.viewModeResizable"), tooltip: trans("table.viewModeResizableTooltip"), @@ -510,14 +507,19 @@ export function compTablePropertyView {comp.children.style.getPropertyView()}
+ {comp.children.showHeaderGridBorder.propertyView({ + label: trans("table.showHeaderGridBorder"), + })} {comp.children.headerStyle.getPropertyView()}
{comp.children.toolbarStyle.getPropertyView()}
+ {comp.children.showRowGridBorder.propertyView({ + label: trans("table.showRowGridBorder"), + })} {comp.children.rowStyle.getPropertyView()} - {comp.children.rowAutoHeight.getPropertyView()} {comp.children.rowHeight.getPropertyView()} {comp.children.rowColor.getPropertyView()} diff --git a/client/packages/lowcoder/src/comps/comps/tableComp/tableToolbarComp.tsx b/client/packages/lowcoder/src/comps/comps/tableComp/tableToolbarComp.tsx index 3509ce4af..d11f8f55f 100644 --- a/client/packages/lowcoder/src/comps/comps/tableComp/tableToolbarComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/tableComp/tableToolbarComp.tsx @@ -58,7 +58,7 @@ const getStyle = ( padding: 13px 12px; position: sticky; postion: -webkit-sticky; - left: 0; + left: 0px !important; ${fixedToolbar && `z-index: 99;`}; ${fixedToolbar && position === 'below' && `bottom: 0;`}; diff --git a/client/packages/lowcoder/src/comps/comps/tableComp/tableTypes.tsx b/client/packages/lowcoder/src/comps/comps/tableComp/tableTypes.tsx index d4cc986b8..b0195d81c 100644 --- a/client/packages/lowcoder/src/comps/comps/tableComp/tableTypes.tsx +++ b/client/packages/lowcoder/src/comps/comps/tableComp/tableTypes.tsx @@ -170,7 +170,9 @@ export type RowHeightViewType = (param: { }) => string; const tableChildrenMap = { - hideBordered: BoolControl, + // hideBordered: BoolControl, + showHeaderGridBorder: BoolControl, + showRowGridBorder: BoolControl, hideHeader: BoolControl, fixedHeader: BoolControl, autoHeight: withDefault(AutoHeightControl, "auto"), diff --git a/client/packages/lowcoder/src/comps/controls/styleControlConstants.tsx b/client/packages/lowcoder/src/comps/controls/styleControlConstants.tsx index b9231a536..17a6a5f47 100644 --- a/client/packages/lowcoder/src/comps/controls/styleControlConstants.tsx +++ b/client/packages/lowcoder/src/comps/controls/styleControlConstants.tsx @@ -684,7 +684,6 @@ const LinkTextStyle = [ export const TableStyle = [ MARGIN, - PADDING, ...BG_STATIC_BORDER_RADIUS, { name: "borderWidth", @@ -721,8 +720,6 @@ export const TableStyle = [ ] as const; export const TableToolbarStyle = [ - MARGIN, - PADDING, { name: "toolbarBackground", label: trans("style.toolbarBackground"), @@ -1205,3 +1202,5 @@ export function marginCalculator(margin: string) { return parseInt(marginArr[0]?.replace(/[^\d.]/g, "") || "0") + parseInt(marginArr[2]?.replace(/[^\d.]/g, "") || "0") } } +export type { ThemeDetail }; + diff --git a/client/packages/lowcoder/src/i18n/locales/en.ts b/client/packages/lowcoder/src/i18n/locales/en.ts index ef8d3d165..83fe90c45 100644 --- a/client/packages/lowcoder/src/i18n/locales/en.ts +++ b/client/packages/lowcoder/src/i18n/locales/en.ts @@ -1270,7 +1270,9 @@ export const en = { "fixedHeaderTooltip": "Header Will Be Fixed for Vertically Scrollable Table", "fixedToolbar": "Fixed Toolbar", "fixedToolbarTooltip": "Toolbar Will Be Fixed for Vertically Scrollable Table Based on Position", - "hideBordered": "Hide Column Border", + "hideBordered": "Show Resize Handles", + "showHeaderGridBorder": "Show Header Grid Border", + "showRowGridBorder": "Show Row Grid Border", "deleteColumn": "Delete Column", "confirmDeleteColumn": "Confirm Delete Column: ", "small": "S", diff --git a/client/packages/lowcoder/src/i18n/locales/zh.ts b/client/packages/lowcoder/src/i18n/locales/zh.ts index fe235979e..30ebc9393 100644 --- a/client/packages/lowcoder/src/i18n/locales/zh.ts +++ b/client/packages/lowcoder/src/i18n/locales/zh.ts @@ -1239,6 +1239,8 @@ table: { fixedHeader: "固定表头", fixedHeaderTooltip: "垂直滚动表格的标题将被固定", hideBordered: "隐藏列边框", + "showHeaderGridBorder": "显示标题网格边框", + "showRowGridBorder": "显示行网格边框", deleteColumn: "删除列", confirmDeleteColumn: "确认删除列:", small: "小", From 1be2fc58f4346625ff1c094d95eada8f1708e8c3 Mon Sep 17 00:00:00 2001 From: FalkWolsky Date: Sun, 14 Jan 2024 12:14:22 +0100 Subject: [PATCH 24/25] Resize handles --- .../src/comps/comps/tableComp/tableComp.tsx | 4 +++ .../comps/comps/tableComp/tableCompView.tsx | 26 +++++++++---------- .../comps/tableComp/tablePropertyView.tsx | 4 +++ .../src/comps/comps/tableComp/tableTypes.tsx | 2 ++ .../packages/lowcoder/src/i18n/locales/en.ts | 2 ++ .../packages/lowcoder/src/i18n/locales/zh.ts | 3 +++ 6 files changed, 28 insertions(+), 13 deletions(-) diff --git a/client/packages/lowcoder/src/comps/comps/tableComp/tableComp.tsx b/client/packages/lowcoder/src/comps/comps/tableComp/tableComp.tsx index 65555c29f..031e1c4a5 100644 --- a/client/packages/lowcoder/src/comps/comps/tableComp/tableComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/tableComp/tableComp.tsx @@ -64,6 +64,10 @@ export class TableImplComp extends TableInitComp implements IContainer { override autoHeight(): boolean { return this.children.autoHeight.getView(); } + + getTableAutoHeight() { + return this.children.autoHeight.getView(); + } private getSlotContainer() { return this.children.expansion.children.slot.getSelectedComp().getComp().children.container; diff --git a/client/packages/lowcoder/src/comps/comps/tableComp/tableCompView.tsx b/client/packages/lowcoder/src/comps/comps/tableComp/tableCompView.tsx index 5e2e4a274..3ca24a609 100644 --- a/client/packages/lowcoder/src/comps/comps/tableComp/tableCompView.tsx +++ b/client/packages/lowcoder/src/comps/comps/tableComp/tableCompView.tsx @@ -57,7 +57,6 @@ const getStyle = ( const selectedRowBackground = genLinerGradient(rowStyle.selectedRowBackground); const hoverRowBackground = genLinerGradient(rowStyle.hoverRowBackground); const alternateBackground = genLinerGradient(rowStyle.alternateBackground); - // const tableAutoHeight = return css` .ant-table-body { @@ -123,7 +122,9 @@ const getStyle = ( `; }; -const TitleResizeHandle = styled.span` +const TitleResizeHandle = styled.span<{ + $visibleResizables: boolean; +}>` position: absolute; top: 0; right: -5px; @@ -135,10 +136,9 @@ const TitleResizeHandle = styled.span` const BackgroundWrapper = styled.div<{ $style: TableStyleType; - $tableAutoHeight?: boolean; + $tableAutoHeight: boolean; }>` - ${(props) => !props.$tableAutoHeight && ` height: calc(100% - ${props.$style.margin} - ${props.$style.margin}) !important`}; - ${(props) => props.$tableAutoHeight && ` height: calc(100% + ${props.$style.margin}`}; + ${(props) => !props.$tableAutoHeight && `height: calc(100% - ${props.$style.margin} - ${props.$style.margin});`} background: ${(props) => props.$style.background} !important; border: ${(props) => `${props.$style.borderWidth} solid ${props.$style.border} !important`}; border-radius: ${(props) => props.$style.radius} !important; @@ -435,7 +435,8 @@ const ResizeableTitle = (props: any) => { draggableOpts={{ enableUserSelectHack: false }} handle={(axis: ResizeHandleAxis, ref: ReactRef) => ( { e.preventDefault(); e.stopPropagation(); @@ -451,6 +452,7 @@ const ResizeableTitle = (props: any) => { type CustomTableProps = Omit, "components" | "columns"> & { columns: CustomColumnType[]; viewModeResizable: boolean; + visibleResizables: boolean; rowColorFn: RowColorViewType; rowHeightFn: RowHeightViewType; columnsStyle: TableColumnStyleType; @@ -673,12 +675,13 @@ export function TableCompView(props: { const [loading, setLoading] = useState(false); const { comp, onDownload, onRefresh } = props; const compChildren = comp.children; - const tableAutoHeight = compChildren.autoHeight.getView(); const style = compChildren.style.getView(); const rowStyle = compChildren.rowStyle.getView(); const headerStyle = compChildren.headerStyle.getView(); const toolbarStyle = compChildren.toolbarStyle.getView(); const rowAutoHeight = compChildren.rowAutoHeight.getView(); + const tableAutoHeight = comp.getTableAutoHeight(); + const visibleResizables = compChildren.visibleResizables.getView(); const columnsStyle = compChildren.columnsStyle.getView(); const changeSet = useMemo(() => compChildren.columns.getChangeSet(), [compChildren.columns]); const hasChange = useMemo(() => !_.isEmpty(changeSet), [changeSet]); @@ -785,11 +788,9 @@ export function TableCompView(props: { } return ( - + - + {toolbar.position === "above" && toolbarView} - - expandable={{ ...expansion.expandableConfig, @@ -824,6 +823,7 @@ export function TableCompView(props: { columns={antdColumns} columnsStyle={columnsStyle} viewModeResizable={compChildren.viewModeResizable.getView()} + visibleResizables={compChildren.visibleResizables.getView()} dataSource={pageDataInfo.data} size={compChildren.size.getView()} rowAutoHeight={rowAutoHeight} diff --git a/client/packages/lowcoder/src/comps/comps/tableComp/tablePropertyView.tsx b/client/packages/lowcoder/src/comps/comps/tableComp/tablePropertyView.tsx index f282cbec9..7a7f1bff7 100644 --- a/client/packages/lowcoder/src/comps/comps/tableComp/tablePropertyView.tsx +++ b/client/packages/lowcoder/src/comps/comps/tableComp/tablePropertyView.tsx @@ -473,6 +473,10 @@ export function compTablePropertyView label: trans("table.viewModeResizable"), tooltip: trans("table.viewModeResizableTooltip"), })} + {comp.children.visibleResizables.propertyView({ + label: trans("table.visibleResizables"), + tooltip: trans("table.visibleResizablesTooltip"), + })}
{comp.children.pagination.getPropertyView()} diff --git a/client/packages/lowcoder/src/comps/comps/tableComp/tableTypes.tsx b/client/packages/lowcoder/src/comps/comps/tableComp/tableTypes.tsx index b0195d81c..a3333a845 100644 --- a/client/packages/lowcoder/src/comps/comps/tableComp/tableTypes.tsx +++ b/client/packages/lowcoder/src/comps/comps/tableComp/tableTypes.tsx @@ -191,12 +191,14 @@ const tableChildrenMap = { searchText: StringControl, columnsStyle: withDefault(styleControl(TableColumnStyle), {borderWidth: '1px', radius: '0px'}), viewModeResizable: BoolControl, + visibleResizables: BoolControl, // sample data for regenerating columns dataRowExample: stateComp(null), onEvent: TableEventControl, loading: BoolCodeControl, rowColor: RowColorComp, rowAutoHeight: withDefault(AutoHeightControl, "auto"), + tableAutoHeight: withDefault(AutoHeightControl, "auto"), rowHeight: RowHeightComp, dynamicColumn: BoolPureControl, // todo: support object config diff --git a/client/packages/lowcoder/src/i18n/locales/en.ts b/client/packages/lowcoder/src/i18n/locales/en.ts index 83fe90c45..286836752 100644 --- a/client/packages/lowcoder/src/i18n/locales/en.ts +++ b/client/packages/lowcoder/src/i18n/locales/en.ts @@ -1191,6 +1191,8 @@ export const en = { "columnNum": "Columns", "viewModeResizable": "Column Width Adjusted by User", "viewModeResizableTooltip": "Whether Users Can Adjust Column Width.", + "visibleResizables": "Show Resize Handles", + "visibleResizablesTooltip": "Display visible Resize Handles in the Table Header.", "showFilter": "Show Filter Button", "showRefresh": "Show Refresh Button", "showDownload": "Show Download Button", diff --git a/client/packages/lowcoder/src/i18n/locales/zh.ts b/client/packages/lowcoder/src/i18n/locales/zh.ts index 30ebc9393..b7f24765e 100644 --- a/client/packages/lowcoder/src/i18n/locales/zh.ts +++ b/client/packages/lowcoder/src/i18n/locales/zh.ts @@ -1157,6 +1157,8 @@ table: { columnNum: "列数", viewModeResizable: "用户调整列宽", viewModeResizableTooltip: "是否允许调整列宽.", + "visibleResizables": "Show Resize Handles", + "visibleResizablesTooltip": "Display visible Resize Handles in the Table Header.", showFilter: "显示筛选按钮", showRefresh: "显示刷新按钮", showDownload: "显示下载按钮", @@ -1218,6 +1220,7 @@ table: { link: "链接", links: "多链接", tag: "标签", + select: "下拉单选", date: "日期", dateTime: "日期时间", badgeStatus: "状态", From 73715650b75831a0cca0c44b3e4804a3626da0f1 Mon Sep 17 00:00:00 2001 From: FalkWolsky Date: Sun, 14 Jan 2024 13:46:27 +0100 Subject: [PATCH 25/25] Color settings --- .../comps/comps/tableComp/tableCompView.tsx | 18 ++++--- .../comps/tableComp/tablePropertyView.tsx | 8 ++-- .../comps/tableComp/tableToolbarComp.tsx | 15 +++--- .../src/comps/comps/tableComp/tableTypes.tsx | 1 + .../comps/controls/styleControlConstants.tsx | 48 ++++--------------- .../packages/lowcoder/src/i18n/locales/en.ts | 4 +- 6 files changed, 36 insertions(+), 58 deletions(-) diff --git a/client/packages/lowcoder/src/comps/comps/tableComp/tableCompView.tsx b/client/packages/lowcoder/src/comps/comps/tableComp/tableCompView.tsx index 3ca24a609..3dad97666 100644 --- a/client/packages/lowcoder/src/comps/comps/tableComp/tableCompView.tsx +++ b/client/packages/lowcoder/src/comps/comps/tableComp/tableCompView.tsx @@ -122,9 +122,7 @@ const getStyle = ( `; }; -const TitleResizeHandle = styled.span<{ - $visibleResizables: boolean; -}>` +const TitleResizeHandle = styled.span` position: absolute; top: 0; right: -5px; @@ -157,6 +155,8 @@ const TableWrapper = styled.div<{ $toolbarPosition: "above" | "below" | "close"; $fixedHeader: boolean; $fixedToolbar: boolean; + $visibleResizables: boolean; + $showHRowGridBorder?: boolean; }>` overflow: unset !important; @@ -240,13 +240,15 @@ const TableWrapper = styled.div<{ &::before { background-color: ${(props) => props.$headerStyle.border}; + width: ${(props) => (props.$visibleResizables ? "1px" : "0px")} !important; } } } > thead > tr > th, > tbody > tr > td { - border-color: ${(props) => props.$style.border}; + border-color: ${(props) => props.$headerStyle.border}; + ${(props) => !props.$showHRowGridBorder && `border-bottom: 0px;`} } td { @@ -436,7 +438,6 @@ const ResizeableTitle = (props: any) => { handle={(axis: ResizeHandleAxis, ref: ReactRef) => ( { e.preventDefault(); e.stopPropagation(); @@ -682,6 +683,7 @@ export function TableCompView(props: { const rowAutoHeight = compChildren.rowAutoHeight.getView(); const tableAutoHeight = comp.getTableAutoHeight(); const visibleResizables = compChildren.visibleResizables.getView(); + const showHRowGridBorder = compChildren.showHRowGridBorder.getView(); const columnsStyle = compChildren.columnsStyle.getView(); const changeSet = useMemo(() => compChildren.columns.getChangeSet(), [compChildren.columns]); const hasChange = useMemo(() => !_.isEmpty(changeSet), [changeSet]); @@ -762,7 +764,7 @@ export function TableCompView(props: { const toolbarView = ( expandable={{ @@ -815,7 +819,7 @@ export function TableCompView(props: { rowColorFn={compChildren.rowColor.getView() as any} rowHeightFn={compChildren.rowHeight.getView() as any} {...compChildren.selection.getView()(onEvent)} - bordered={compChildren.showHeaderGridBorder.getView()} + bordered={compChildren.showRowGridBorder.getView()} onChange={(pagination, filters, sorter, extra) => { onTableChange(pagination, filters, sorter, extra, comp.dispatch, onEvent); }} diff --git a/client/packages/lowcoder/src/comps/comps/tableComp/tablePropertyView.tsx b/client/packages/lowcoder/src/comps/comps/tableComp/tablePropertyView.tsx index 7a7f1bff7..58f8145c0 100644 --- a/client/packages/lowcoder/src/comps/comps/tableComp/tablePropertyView.tsx +++ b/client/packages/lowcoder/src/comps/comps/tableComp/tablePropertyView.tsx @@ -511,9 +511,6 @@ export function compTablePropertyView {comp.children.style.getPropertyView()}
- {comp.children.showHeaderGridBorder.propertyView({ - label: trans("table.showHeaderGridBorder"), - })} {comp.children.headerStyle.getPropertyView()}
@@ -521,7 +518,10 @@ export function compTablePropertyView
{comp.children.showRowGridBorder.propertyView({ - label: trans("table.showRowGridBorder"), + label: trans("table.showVerticalRowGridBorder"), + })} + {comp.children.showHRowGridBorder.propertyView({ + label: trans("table.showHorizontalRowGridBorder"), })} {comp.children.rowStyle.getPropertyView()} {comp.children.rowAutoHeight.getPropertyView()} diff --git a/client/packages/lowcoder/src/comps/comps/tableComp/tableToolbarComp.tsx b/client/packages/lowcoder/src/comps/comps/tableComp/tableToolbarComp.tsx index d11f8f55f..d64ffc8b1 100644 --- a/client/packages/lowcoder/src/comps/comps/tableComp/tableToolbarComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/tableComp/tableToolbarComp.tsx @@ -7,7 +7,7 @@ import { TableOnEventView } from "comps/comps/tableComp/tableTypes"; import { BoolControl } from "comps/controls/boolControl"; import { StringControl } from "comps/controls/codeControl"; import { dropdownControl } from "comps/controls/dropdownControl"; -import { defaultTheme, TableStyleType } from "comps/controls/styleControlConstants"; +import { defaultTheme, TableToolbarStyleType } from "comps/controls/styleControlConstants"; import { stateComp } from "comps/generators"; import { genRandomKey } from "comps/utils/idGenerator"; import { ThemeContext } from "comps/utils/themeContext"; @@ -46,19 +46,20 @@ const SaveChangeButtons = styled.div` `; const getStyle = ( - style: TableStyleType, + style: TableToolbarStyleType, filtered: boolean, theme: ThemeDetail, position: ToolbarRowType["position"], fixedToolbar: boolean, ) => { return css` - background-color: ${style.toolbarBackground}; + background-color: ${style.background}; // Implement horizontal scrollbar and vertical page number selection is not blocked padding: 13px 12px; position: sticky; postion: -webkit-sticky; left: 0px !important; + margin: ${style.margin} !important; ${fixedToolbar && `z-index: 99;`}; ${fixedToolbar && position === 'below' && `bottom: 0;`}; @@ -125,7 +126,7 @@ const getStyle = ( } .ant-pagination-item-active { - border-color: ${theme?.primary}; + border-color: ${style.border || theme?.primary}; a { color: ${theme?.textDark}; @@ -145,13 +146,13 @@ const getStyle = ( .ant-select-selector, .ant-pagination-options-quick-jumper input:hover, .ant-pagination-options-quick-jumper input:focus { - border-color: ${theme?.primary}; + border-color: ${style.border || theme?.primary}; } `; }; const ToolbarWrapper = styled.div<{ - $style: TableStyleType; + $style: TableToolbarStyleType; $filtered: boolean; $theme: ThemeDetail; $position: ToolbarRowType["position"]; @@ -711,7 +712,7 @@ type ToolbarRowType = ConstructorToView; export function TableToolbar(props: { toolbar: ToolbarRowType; - $style: TableStyleType; + $style: TableToolbarStyleType; pagination: PaginationProps; columns: Array; onRefresh: () => void; diff --git a/client/packages/lowcoder/src/comps/comps/tableComp/tableTypes.tsx b/client/packages/lowcoder/src/comps/comps/tableComp/tableTypes.tsx index a3333a845..3b8458741 100644 --- a/client/packages/lowcoder/src/comps/comps/tableComp/tableTypes.tsx +++ b/client/packages/lowcoder/src/comps/comps/tableComp/tableTypes.tsx @@ -173,6 +173,7 @@ const tableChildrenMap = { // hideBordered: BoolControl, showHeaderGridBorder: BoolControl, showRowGridBorder: BoolControl, + showHRowGridBorder: BoolControl, hideHeader: BoolControl, fixedHeader: BoolControl, autoHeight: withDefault(AutoHeightControl, "auto"), diff --git a/client/packages/lowcoder/src/comps/controls/styleControlConstants.tsx b/client/packages/lowcoder/src/comps/controls/styleControlConstants.tsx index 17a6a5f47..cd39479fe 100644 --- a/client/packages/lowcoder/src/comps/controls/styleControlConstants.tsx +++ b/client/packages/lowcoder/src/comps/controls/styleControlConstants.tsx @@ -157,7 +157,10 @@ export function handleToSelectedRow(color: string, primary: string = defaultThem // return table header background color export function handleToHeadBg(color: string) { if (toHex(color) === SURFACE_COLOR) { - return "#FAFAFA"; + return darkenColor(color, 0.06); + } + if (toHex(color) === "#000000") { + return SECOND_SURFACE_COLOR; } if (isDarkColor(color)) { return darkenColor(color, 0.06); @@ -690,60 +693,29 @@ export const TableStyle = [ label: trans("style.borderWidth"), borderWidth: "borderWidth", }, - { - name: "headerBackground", - label: trans("style.tableHeaderBackground"), - depName: "background", - transformer: handleToHeadBg, - }, - { - name: "headerText", - label: trans("style.tableHeaderText"), - depName: "headerBackground", - depType: DEP_TYPE.CONTRAST_TEXT, - transformer: contrastText, - }, - { - name: "toolbarBackground", - label: trans("style.toolbarBackground"), - depName: "background", - depType: DEP_TYPE.SELF, - transformer: toSelf, - }, - { - name: "toolbarText", - label: trans("style.toolbarText"), - depName: "toolbarBackground", - depType: DEP_TYPE.CONTRAST_TEXT, - transformer: contrastText, - }, ] as const; export const TableToolbarStyle = [ - { - name: "toolbarBackground", - label: trans("style.toolbarBackground"), - depName: "background", - depType: DEP_TYPE.SELF, - transformer: toSelf, - }, + MARGIN, + getBackground(), + getStaticBorder(), { name: "toolbarText", label: trans("style.toolbarText"), depName: "toolbarBackground", depType: DEP_TYPE.CONTRAST_TEXT, - transformer: contrastText, + transformer: toSelf, }, ] as const; export const TableHeaderStyle = [ + MARGIN, { name: "headerBackground", label: trans("style.tableHeaderBackground"), - depName: "background", + depName: "headerBackground", transformer: handleToHeadBg, }, - MARGIN, getStaticBorder(), { name: "borderWidth", diff --git a/client/packages/lowcoder/src/i18n/locales/en.ts b/client/packages/lowcoder/src/i18n/locales/en.ts index 286836752..53d461ed4 100644 --- a/client/packages/lowcoder/src/i18n/locales/en.ts +++ b/client/packages/lowcoder/src/i18n/locales/en.ts @@ -1273,8 +1273,8 @@ export const en = { "fixedToolbar": "Fixed Toolbar", "fixedToolbarTooltip": "Toolbar Will Be Fixed for Vertically Scrollable Table Based on Position", "hideBordered": "Show Resize Handles", - "showHeaderGridBorder": "Show Header Grid Border", - "showRowGridBorder": "Show Row Grid Border", + "showVerticalRowGridBorder": "Show vertical Row Grid Border", + "showHorizontalRowGridBorder": "Show horizontal Row Grid Border", "deleteColumn": "Delete Column", "confirmDeleteColumn": "Confirm Delete Column: ", "small": "S",